From 05e0ec30a632339a8533082476f27bda31ccde16 Mon Sep 17 00:00:00 2001 From: Chunseok Lee Date: Thu, 30 Jul 2020 11:32:26 +0900 Subject: [PATCH] Imported Upstream version 1.7.0 --- .readthedocs.yml | 22 + COPYRIGHT | 2 +- Makefile.template | 37 +- README.md | 73 +- compiler/adtidas/README.md | 1 + compiler/angkor/src/ADT/feature/Buffer.test.cpp | 10 +- compiler/angkor/src/ADT/feature/CHWLayout.test.cpp | 6 +- compiler/angkor/src/ADT/feature/HWCLayout.test.cpp | 6 +- compiler/angkor/src/ADT/feature/Layout.test.cpp | 10 +- compiler/angkor/src/ADT/feature/Overlay.test.cpp | 14 +- compiler/angkor/src/ADT/feature/Shape.test.cpp | 8 +- compiler/angkor/src/ADT/kernel/Buffer.test.cpp | 12 +- compiler/angkor/src/ADT/kernel/Layout.test.cpp | 10 +- compiler/angkor/src/ADT/kernel/NCHWLayout.test.cpp | 8 +- compiler/angkor/src/ADT/kernel/NHWCLayout.test.cpp | 8 +- compiler/angkor/src/ADT/kernel/Overlay.test.cpp | 16 +- compiler/angkor/src/ADT/kernel/Shape.test.cpp | 10 +- compiler/angkor/src/ADT/tensor/Buffer.test.cpp | 6 +- compiler/angkor/src/ADT/tensor/Index.test.cpp | 34 +- .../angkor/src/ADT/tensor/IndexEnumerator.test.cpp | 2 +- compiler/angkor/src/ADT/tensor/Layout.test.cpp | 10 +- .../angkor/src/ADT/tensor/LexicalLayout.test.cpp | 6 +- compiler/angkor/src/ADT/tensor/Overlay.test.cpp | 10 +- compiler/angkor/src/ADT/tensor/Shape.test.cpp | 56 +- compiler/angkor/src/TensorIndex.test.cpp | 26 +- compiler/angkor/src/TensorShape.test.cpp | 20 +- compiler/ann-api/README.md | 1 + compiler/arser/CMakeLists.txt | 15 + compiler/arser/README.md | 3 + compiler/arser/include/arser/arser.h | 507 + compiler/arser/tests/arser.test.cpp | 344 + compiler/caffe2circle/requires.cmake | 2 +- compiler/circle-inspect/CMakeLists.txt | 3 +- compiler/circle-inspect/driver/Driver.cpp | 85 +- compiler/circle-inspect/requires.cmake | 2 +- compiler/circle-inspect/src/Dump.cpp | 112 +- compiler/circle-inspect/src/Dump.h | 9 + compiler/circle-inspect/src/Model.cpp | 143 - compiler/circle-inspect/src/Model.h | 43 - compiler/circle-inspect/src/Reader.cpp | 5 +- compiler/circle-quantizer/CMakeLists.txt | 17 + compiler/circle-quantizer/README.md | 3 + .../circle-quantizer/include/CircleExpContract.h | 49 + compiler/circle-quantizer/requires.cmake | 7 + .../circle-quantizer/src/CircleExpContract.cpp | 33 + compiler/circle-quantizer/src/CircleQuantizer.cpp | 155 + compiler/circle-tensordump/CMakeLists.txt | 23 + compiler/circle-tensordump/README.md | 73 + compiler/circle-tensordump/driver/Driver.cpp | 79 + compiler/circle-tensordump/requires.cmake | 4 + compiler/circle-tensordump/src/Dump.cpp | 325 + compiler/circle-tensordump/src/Dump.h | 57 + compiler/circle-tensordump/src/Reader.cpp | 169 + compiler/circle-tensordump/src/Reader.h | 91 + compiler/circle-verify/CMakeLists.txt | 3 +- compiler/circle-verify/requires.cmake | 3 +- compiler/circle-verify/src/Driver.cpp | 24 +- compiler/circle-verify/src/Model.cpp | 90 - compiler/circle-verify/src/Model.h | 38 - compiler/circle-verify/src/VerifyFlatBuffers.cpp | 10 +- .../circle2circle-dredd-recipe-test/CMakeLists.txt | 185 + compiler/circle2circle-dredd-recipe-test/README.md | 21 + .../circle2circle-dredd-recipe-test/requires.cmake | 7 + compiler/circle2circle-dredd-recipe-test/test.lst | 20 + .../circle2circle-dredd-recipe-test/testall.sh | 98 + compiler/circle2circle/CMakeLists.txt | 8 +- compiler/circle2circle/README.md | 2 +- compiler/circle2circle/requires.cmake | 3 +- compiler/circle2circle/src/Circle2Circle.cpp | 167 +- compiler/circle2circle/src/Circle2Circle.test.cpp | 2 +- compiler/circle2circle/src/Model.cpp | 78 - compiler/circlechef/CMakeLists.txt | 21 + compiler/circlechef/README.md | 8 + compiler/circlechef/circle/CMakeLists.txt | 9 + .../circle/include/circlechef/RecipeChef.h | 41 + compiler/circlechef/circle/src/CircleImport.cpp | 145 + compiler/circlechef/circle/src/CircleImport.h | 140 + compiler/circlechef/circle/src/CircleOpChef.h | 44 + compiler/circlechef/circle/src/CircleOpChefs.h | 26 + compiler/circlechef/circle/src/CircleOpRegistry.h | 71 + compiler/circlechef/circle/src/Convert.cpp | 78 + compiler/circlechef/circle/src/Convert.h | 58 + .../circlechef/circle/src/Op/BCQFullyConnected.cpp | 64 + .../circlechef/circle/src/Op/BCQFullyConnected.h | 39 + compiler/circlechef/circle/src/Op/BCQGather.cpp | 68 + compiler/circlechef/circle/src/Op/BCQGather.h | 39 + compiler/circlechef/circle/src/Op/BatchMatMul.cpp | 48 + compiler/circlechef/circle/src/Op/BatchMatMul.h | 39 + compiler/circlechef/circle/src/Op/InstanceNorm.cpp | 53 + compiler/circlechef/circle/src/Op/InstanceNorm.h | 39 + compiler/circlechef/circle/src/RecipeChef.cpp | 248 + compiler/circlechef/core/CMakeLists.txt | 9 + .../circlechef/core/include/circlechef/ModelChef.h | 56 + compiler/circlechef/core/src/Arguments.h | 34 + compiler/circlechef/core/src/Convert.cpp | 72 + compiler/circlechef/core/src/Convert.h | 31 + compiler/circlechef/core/src/ModelChef.cpp | 631 + .../circlechef/core/src/Op/BCQFullyConnected.cpp | 40 + .../circlechef/core/src/Op/BCQFullyConnected.h | 52 + compiler/circlechef/core/src/Op/BCQGather.cpp | 36 + compiler/circlechef/core/src/Op/BCQGather.h | 49 + compiler/circlechef/core/src/Op/BatchMatMul.cpp | 37 + compiler/circlechef/core/src/Op/BatchMatMul.h | 49 + compiler/circlechef/core/src/Op/InstanceNorm.cpp | 39 + compiler/circlechef/core/src/Op/InstanceNorm.h | 52 + compiler/circlechef/core/src/OpChef.def | 10 + compiler/circlechef/core/src/OpChef.h | 48 + compiler/circlechef/core/src/OpChefs.h | 25 + compiler/circlechef/log/CMakeLists.txt | 7 + compiler/circlechef/log/include/Log.h | 75 + compiler/circlechef/log/include/LoggingContext.h | 35 + compiler/circlechef/log/src/Log.cpp | 87 + compiler/circlechef/log/src/LoggingContext.cpp | 41 + compiler/circlechef/proto/CMakeLists.txt | 5 + compiler/circlechef/proto/circlechef.proto | 110 + compiler/circlechef/requires.cmake | 9 + compiler/circlechef/tests/CMakeLists.txt | 70 + compiler/circlechef/tests/runvalidate.sh | 56 + compiler/circlechef/tools/CMakeLists.txt | 6 + compiler/circlechef/tools/console/CMakeLists.txt | 3 + compiler/circlechef/tools/console/Driver.cpp | 58 + compiler/circlechef/tools/file/CMakeLists.txt | 4 + compiler/circlechef/tools/file/Driver.cpp | 85 + compiler/circlechef/tools/reverse/CMakeLists.txt | 5 + compiler/circlechef/tools/reverse/Driver.cpp | 72 + compiler/circledump/CMakeLists.txt | 2 +- compiler/circledump/driver/Driver.cpp | 26 +- compiler/circledump/requires.cmake | 2 +- compiler/circledump/src/Dump.cpp | 22 +- compiler/circledump/src/OpPrinter.cpp | 456 +- compiler/common-artifacts/CMakeLists.txt | 258 + compiler/common-artifacts/README.md | 37 + compiler/common-artifacts/exclude.lst | 191 + compiler/common-artifacts/requires.cmake | 8 + .../common-artifacts/src/TestDataGenerator.cpp | 234 + compiler/cwrap/include/cwrap/Fildes.h | 2 +- compiler/cwrap/src/Fildes.test.cpp | 35 +- compiler/dredd-rule-lib/rule-lib.sh | 17 + compiler/enco-intf/README.md | 1 + compiler/exo/src/Circle/CircleTensorExporter.cpp | 4 +- .../src/Conversion/DepthwiseConv2DConverter.cpp | 2 +- .../src/Conversion/TensorBroadcastConverter.cpp | 2 +- compiler/exo/src/Dialect/IR/CircleDialect.test.cpp | 2 +- compiler/exo/src/Dialect/IR/CircleNodeImpl.h | 1 - compiler/exo/src/Dialect/IR/CircleNodeVisitor.h | 1 - compiler/exo/src/Dialect/IR/CircleNodes.test.cpp | 14 +- compiler/exo/src/Dialect/IR/NodeMixins.h | 2 +- compiler/exo/src/Dialect/IR/TFLDialect.test.cpp | 2 +- compiler/exo/src/Dialect/IR/TFLNodeImpl.h | 1 - compiler/exo/src/Dialect/IR/TFLNodeVisitor.h | 1 - compiler/exo/src/Dialect/IR/TFLNodes.h | 4 +- compiler/exo/src/Dialect/IR/TFLNodes.test.cpp | 98 +- .../Dialect/Service/CircleTypeInferenceRule.cpp | 2 +- .../Dialect/Service/TFLShapeInferenceRule.test.cpp | 52 +- .../src/Dialect/Service/TFLTypeInferenceRule.cpp | 2 +- .../Dialect/Service/TFLTypeInferenceRule.test.cpp | 2 +- compiler/exo/src/Pass/FuseBiasAddPass.cpp | 4 +- compiler/exo/src/Pass/FuseBiasAddPass.test.cpp | 4 +- compiler/exo/src/Pass/FuseReluPass.cpp | 2 +- compiler/exo/src/TFLite/TFLExporterImpl.test.cpp | 42 +- compiler/exo/src/TFLite/TFLExporterUtils.test.cpp | 4 +- compiler/exo/src/TFLite/TFLTensorExporter.cpp | 15 +- compiler/exo/src/TFLite/TFLTypeInference.test.cpp | 6 +- compiler/fipe/README.md | 1 + compiler/foder/CMakeLists.txt | 2 + compiler/foder/README.md | 13 + compiler/foder/include/foder/FileLoader.h | 69 + compiler/gen-core/CMakeLists.txt | 2 +- compiler/i5diff/CMakeLists.txt | 2 +- compiler/imgdata2hdf5/CMakeLists.txt | 13 + compiler/imgdata2hdf5/README.md | 24 + compiler/imgdata2hdf5/imgdata2hdf5.py | 60 + compiler/loco/include/loco/IR/CastHelpers.h | 42 + compiler/loco/include/loco/IR/DataTypeTraits.h | 33 + compiler/loco/include/loco/IR/Dimension.h | 12 +- compiler/loco/include/loco/IR/FeatureCodec.h | 25 + compiler/loco/include/loco/IR/FilterCodec.h | 17 + compiler/loco/include/loco/IR/Node.h | 8 + compiler/loco/include/loco/IR/Nodes.h | 2 +- compiler/loco/include/loco/IR/TensorShape.h | 5 + compiler/loco/src/ADT/AnnotatedItem.test.cpp | 6 +- compiler/loco/src/IR/Algorithm.test.cpp | 16 +- compiler/loco/src/IR/CanonicalDialect.test.cpp | 2 +- compiler/loco/src/IR/CanonicalNode.test.cpp | 8 +- compiler/loco/src/IR/DataTypeTraits.test.cpp | 2 +- compiler/loco/src/IR/DepthwiseFilterIndex.test.cpp | 40 +- compiler/loco/src/IR/DepthwiseFilterShape.test.cpp | 20 +- compiler/loco/src/IR/Dialect.test.cpp | 2 +- compiler/loco/src/IR/Dimension.test.cpp | 4 +- compiler/loco/src/IR/FeatureIndex.test.cpp | 40 +- compiler/loco/src/IR/FeatureShape.test.cpp | 20 +- compiler/loco/src/IR/FilterIndex.test.cpp | 40 +- compiler/loco/src/IR/FilterShape.test.cpp | 20 +- compiler/loco/src/IR/Graph.cpp | 2 +- compiler/loco/src/IR/Graph.test.cpp | 42 +- compiler/loco/src/IR/MockupNode.h | 17 +- compiler/loco/src/IR/Node.test.cpp | 34 +- compiler/loco/src/IR/NodeShape.test.cpp | 52 +- compiler/loco/src/IR/Nodes.test.cpp | 368 +- compiler/loco/src/IR/Padding2D.test.cpp | 8 +- compiler/loco/src/IR/PaddingND.test.cpp | 6 +- compiler/loco/src/IR/PermutingCodec.test.cpp | 128 +- compiler/loco/src/IR/Stride.test.cpp | 12 +- compiler/loco/src/IR/TensorShape.cpp | 17 + compiler/loco/src/IR/TensorShape.test.cpp | 51 +- compiler/loco/src/IR/Use.test.cpp | 8 +- compiler/loco/src/IR/Verifier.test.cpp | 6 +- compiler/loco/src/IR/Window.test.cpp | 12 +- .../src/Service/CanonicalShapeInferenceRule.cpp | 2 +- .../Service/CanonicalShapeInferenceRule.test.cpp | 132 +- compiler/loco/src/Service/GraphBuilder.test.cpp | 6 +- compiler/loco/src/Service/GraphTestcase.h | 2 +- .../MultiDialectShapeInferenceRule.test.cpp | 16 +- compiler/loco/src/Service/ShapeInference.test.cpp | 12 +- compiler/loco/src/Service/TypeInference.cpp | 2 +- compiler/loco/src/Service/TypeInference.test.cpp | 18 +- compiler/loco/src/loco.test.cpp | 12 +- .../src/Service/COpShapeInferenceRule.cpp | 2 +- compiler/locomotiv/src/Node/AvgPool2D.cpp | 16 +- compiler/locomotiv/src/Node/AvgPool2D.test.cpp | 4 +- compiler/locomotiv/src/Node/BiasAdd.cpp | 4 + compiler/locomotiv/src/Node/BiasAdd.test.cpp | 16 +- compiler/locomotiv/src/Node/BiasEncode.test.cpp | 8 +- compiler/locomotiv/src/Node/ConstGen.test.cpp | 40 +- compiler/locomotiv/src/Node/Conv2D.test.cpp | 4 +- .../locomotiv/src/Node/DepthwiseConv2D.test.cpp | 4 +- .../src/Node/DepthwiseFilterEncode.test.cpp | 8 +- compiler/locomotiv/src/Node/EltwiseAdd.test.cpp | 8 +- compiler/locomotiv/src/Node/EltwiseDiv.test.cpp | 8 +- compiler/locomotiv/src/Node/EltwiseMax.test.cpp | 8 +- compiler/locomotiv/src/Node/EltwiseMul.test.cpp | 8 +- compiler/locomotiv/src/Node/EltwiseSqrt.test.cpp | 12 +- compiler/locomotiv/src/Node/EltwiseSub.test.cpp | 8 +- compiler/locomotiv/src/Node/FeatureCodec.test.cpp | 32 +- compiler/locomotiv/src/Node/FilterEncode.test.cpp | 16 +- compiler/locomotiv/src/Node/Forward.test.cpp | 16 +- compiler/locomotiv/src/Node/MatMul.test.cpp | 6 +- compiler/locomotiv/src/Node/MatrixCodec.test.cpp | 32 +- compiler/locomotiv/src/Node/MaxPool2D.test.cpp | 4 +- compiler/locomotiv/src/Node/Push.test.cpp | 16 +- compiler/locomotiv/src/Node/ReLU.test.cpp | 10 +- compiler/locomotiv/src/Node/ReLU6.test.cpp | 14 +- compiler/locomotiv/src/Node/Reshape.test.cpp | 14 +- compiler/locomotiv/src/Node/Softmax.test.cpp | 14 +- compiler/locomotiv/src/Node/Tanh.test.cpp | 12 +- .../locomotiv/src/Node/TensorBroadcast.test.cpp | 10 +- compiler/locomotiv/src/Node/TensorConcat.cpp | 2 + compiler/locomotiv/src/Node/TensorConcat.test.cpp | 40 +- compiler/locomotiv/src/Node/TensorConstantPad.cpp | 2 + .../locomotiv/src/Node/TensorConstantPad.test.cpp | 64 +- compiler/locomotiv/src/Node/TensorReduce.cpp | 3 +- compiler/locomotiv/src/Node/TensorReduce.test.cpp | 18 +- .../locomotiv/src/Node/TransposedConv2D.test.cpp | 4 +- compiler/locomotiv/src/NodeData.test.cpp | 12 +- compiler/locomotiv/src/NodeDataImpl.test.cpp | 10 +- compiler/locomotiv/src/NodeDomain.test.cpp | 6 +- compiler/locomotiv/src/NodeExecution.cpp | 2 +- compiler/locomotiv/src/Session.test.cpp | 74 +- compiler/locop/requires.cmake | 1 + compiler/locop/src/CanonicalNodeSummaryBuilder.cpp | 7 +- compiler/locop/src/FormattedGraph.cpp | 3 + compiler/logo/include/logo/DeadNodeQueryService.h | 35 + .../include/logo/RemoveDeadNodeWithQueryPass.h | 34 + .../logo/src/Passes/ConstantFoldingPass.test.cpp | 4 +- .../src/Passes/RemoveDeadNodeWithQueryPass.cpp | 70 + compiler/logo/src/Passes/RemoveForwardNodePass.cpp | 2 +- compiler/logo/src/Passes/ReorderDecodePass.cpp | 96 +- .../src/Passes/ResolveDuplicateReshapePass.cpp | 4 +- .../src/Passes/SimplifyDomainConversionPass.cpp | 2 +- .../Passes/SimplifyDomainConversionPass.test.cpp | 2 +- compiler/luci-interpreter/CMakeLists.txt | 4 + .../include/luci_interpreter/Interpreter.h | 78 + .../include/luci_interpreter/core/DataType.h | 36 + .../include/luci_interpreter/core/Tensor.h | 133 + compiler/luci-interpreter/requires.cmake | 1 + compiler/luci-interpreter/src/CMakeLists.txt | 35 + compiler/luci-interpreter/src/Interpreter.cpp | 126 + compiler/luci-interpreter/src/core/CMakeLists.txt | 17 + compiler/luci-interpreter/src/core/EventNotifier.h | 36 + compiler/luci-interpreter/src/core/Kernel.h | 75 + compiler/luci-interpreter/src/core/KernelParams.h | 151 + .../luci-interpreter/src/core/RuntimeGraph.cpp | 93 + compiler/luci-interpreter/src/core/RuntimeGraph.h | 60 + compiler/luci-interpreter/src/core/RuntimeModule.h | 59 + compiler/luci-interpreter/src/core/Tensor.cpp | 68 + compiler/luci-interpreter/src/kernels/Add.cpp | 141 + compiler/luci-interpreter/src/kernels/Add.h | 48 + compiler/luci-interpreter/src/kernels/Add.test.cpp | 174 + compiler/luci-interpreter/src/kernels/ArgMax.cpp | 140 + compiler/luci-interpreter/src/kernels/ArgMax.h | 44 + .../luci-interpreter/src/kernels/ArgMax.test.cpp | 98 + .../luci-interpreter/src/kernels/AveragePool2D.cpp | 115 + .../luci-interpreter/src/kernels/AveragePool2D.h | 51 + .../src/kernels/AveragePool2D.test.cpp | 127 + .../luci-interpreter/src/kernels/CMakeLists.txt | 106 + .../luci-interpreter/src/kernels/Concatenation.cpp | 136 + .../luci-interpreter/src/kernels/Concatenation.h | 48 + .../src/kernels/Concatenation.test.cpp | 83 + compiler/luci-interpreter/src/kernels/Conv2D.cpp | 194 + compiler/luci-interpreter/src/kernels/Conv2D.h | 57 + .../luci-interpreter/src/kernels/Conv2D.test.cpp | 185 + .../src/kernels/DepthwiseConv2D.cpp | 175 + .../luci-interpreter/src/kernels/DepthwiseConv2D.h | 54 + .../src/kernels/DepthwiseConv2D.test.cpp | 135 + compiler/luci-interpreter/src/kernels/Elu.cpp | 52 + compiler/luci-interpreter/src/kernels/Elu.h | 43 + compiler/luci-interpreter/src/kernels/Elu.test.cpp | 64 + .../src/kernels/FullyConnected.cpp | 79 + .../luci-interpreter/src/kernels/FullyConnected.h | 49 + .../src/kernels/FullyConnected.test.cpp | 67 + compiler/luci-interpreter/src/kernels/If.cpp | 89 + compiler/luci-interpreter/src/kernels/If.h | 49 + compiler/luci-interpreter/src/kernels/If.test.cpp | 111 + .../luci-interpreter/src/kernels/L2Normalize.cpp | 74 + .../luci-interpreter/src/kernels/L2Normalize.h | 46 + .../src/kernels/L2Normalize.test.cpp | 57 + compiler/luci-interpreter/src/kernels/L2Pool2D.cpp | 88 + compiler/luci-interpreter/src/kernels/L2Pool2D.h | 49 + .../luci-interpreter/src/kernels/L2Pool2D.test.cpp | 228 + .../luci-interpreter/src/kernels/LeakyRelu.cpp | 92 + compiler/luci-interpreter/src/kernels/LeakyRelu.h | 52 + .../src/kernels/LeakyRelu.test.cpp | 75 + .../src/kernels/LocalResponseNormalization.cpp | 65 + .../src/kernels/LocalResponseNormalization.h | 44 + .../kernels/LocalResponseNormalization.test.cpp | 113 + compiler/luci-interpreter/src/kernels/Logistic.cpp | 94 + compiler/luci-interpreter/src/kernels/Logistic.h | 52 + .../luci-interpreter/src/kernels/Logistic.test.cpp | 59 + .../luci-interpreter/src/kernels/MaxPool2D.cpp | 120 + compiler/luci-interpreter/src/kernels/MaxPool2D.h | 51 + .../src/kernels/MaxPool2D.test.cpp | 97 + compiler/luci-interpreter/src/kernels/Mean.cpp | 249 + compiler/luci-interpreter/src/kernels/Mean.h | 55 + .../luci-interpreter/src/kernels/Mean.test.cpp | 165 + compiler/luci-interpreter/src/kernels/Mul.cpp | 82 + compiler/luci-interpreter/src/kernels/Mul.h | 50 + compiler/luci-interpreter/src/kernels/Mul.test.cpp | 85 + compiler/luci-interpreter/src/kernels/Pad.cpp | 102 + compiler/luci-interpreter/src/kernels/Pad.h | 43 + compiler/luci-interpreter/src/kernels/Pad.test.cpp | 79 + compiler/luci-interpreter/src/kernels/Reshape.cpp | 90 + compiler/luci-interpreter/src/kernels/Reshape.h | 43 + .../luci-interpreter/src/kernels/Reshape.test.cpp | 69 + compiler/luci-interpreter/src/kernels/Softmax.cpp | 64 + compiler/luci-interpreter/src/kernels/Softmax.h | 46 + .../luci-interpreter/src/kernels/Softmax.test.cpp | 60 + .../luci-interpreter/src/kernels/SpaceToDepth.cpp | 79 + .../luci-interpreter/src/kernels/SpaceToDepth.h | 45 + .../src/kernels/SpaceToDepth.test.cpp | 60 + compiler/luci-interpreter/src/kernels/Split.cpp | 81 + compiler/luci-interpreter/src/kernels/Split.h | 47 + .../luci-interpreter/src/kernels/Split.test.cpp | 126 + compiler/luci-interpreter/src/kernels/Squeeze.cpp | 86 + compiler/luci-interpreter/src/kernels/Squeeze.h | 44 + .../luci-interpreter/src/kernels/Squeeze.test.cpp | 72 + .../luci-interpreter/src/kernels/StridedSlice.cpp | 145 + .../luci-interpreter/src/kernels/StridedSlice.h | 47 + .../src/kernels/StridedSlice.test.cpp | 113 + .../luci-interpreter/src/kernels/TestUtils.cpp | 61 + compiler/luci-interpreter/src/kernels/TestUtils.h | 183 + .../luci-interpreter/src/kernels/Transpose.cpp | 84 + compiler/luci-interpreter/src/kernels/Transpose.h | 44 + .../src/kernels/Transpose.test.cpp | 117 + .../luci-interpreter/src/kernels/TransposeConv.cpp | 153 + .../luci-interpreter/src/kernels/TransposeConv.h | 58 + .../src/kernels/TransposeConv.test.cpp | 102 + compiler/luci-interpreter/src/kernels/Unpack.cpp | 84 + compiler/luci-interpreter/src/kernels/Unpack.h | 46 + .../luci-interpreter/src/kernels/Unpack.test.cpp | 141 + compiler/luci-interpreter/src/kernels/Utils.cpp | 182 + compiler/luci-interpreter/src/kernels/Utils.h | 194 + .../luci-interpreter/src/loader/CMakeLists.txt | 15 + .../luci-interpreter/src/loader/GraphLoader.cpp | 205 + compiler/luci-interpreter/src/loader/GraphLoader.h | 58 + .../luci-interpreter/src/loader/KernelBuilder.cpp | 529 + .../luci-interpreter/src/loader/KernelBuilder.h | 91 + .../luci-interpreter/src/loader/ModuleLoader.cpp | 49 + .../luci-interpreter/src/loader/ModuleLoader.h | 54 + compiler/luci-interpreter/src/loader/RuntimeToIR.h | 38 + compiler/luci-value-test/CMakeLists.txt | 25 + compiler/luci-value-test/README.md | 15 + compiler/luci-value-test/evalverify.sh | 61 + compiler/luci-value-test/luci_eval_verifier.py | 82 + compiler/luci-value-test/requires.cmake | 6 + compiler/luci-value-test/test.lst | 81 + compiler/luci-value-test/tester/CMakeLists.txt | 15 + .../tester/src/CircleExpContract.cpp | 33 + .../luci-value-test/tester/src/CircleExpContract.h | 49 + compiler/luci-value-test/tester/src/EvalTester.cpp | 164 + compiler/luci/CMakeLists.txt | 1 + compiler/luci/env/CMakeLists.txt | 18 + compiler/luci/env/README.md | 3 + compiler/luci/env/include/luci/UserSettings.h | 45 + compiler/luci/env/src/UserSettings.cpp | 77 + compiler/luci/env/src/UserSettings.test.cpp | 68 + compiler/luci/export/CMakeLists.txt | 1 + compiler/luci/export/src/CircleExporterImpl.cpp | 59 +- compiler/luci/export/src/CircleExporterUtils.cpp | 35 +- compiler/luci/export/src/CircleExporterUtils.h | 1 + .../luci/export/src/CircleOperationExporter.cpp | 1205 +- compiler/luci/export/src/CircleTensorExporter.cpp | 179 +- compiler/luci/export/src/ProgressReporter.cpp | 28 +- compiler/luci/export/src/SerializedData.h | 23 +- compiler/luci/export/src/TypeBridge.cpp | 105 + compiler/luci/export/src/TypeBridge.h | 44 + compiler/luci/import/CMakeLists.txt | 1 + .../luci/import/include/luci/Import/CircleReader.h | 13 + .../luci/import/include/luci/Import/GraphBuilder.h | 18 +- .../import/include/luci/Import/GraphBuilderBase.h | 48 + .../include/luci/Import/GraphBuilderContext.h | 23 +- .../include/luci/Import/GraphBuilderRegistry.h | 12 +- compiler/luci/import/include/luci/Import/Nodes.h | 80 + .../import/include/luci/Import/Nodes/CircleAddN.h | 37 + .../include/luci/Import/Nodes/CircleArgMin.h | 37 + .../luci/Import/Nodes/CircleBCQFullyConnected.h | 37 + .../include/luci/Import/Nodes/CircleBCQGather.h | 37 + .../include/luci/Import/Nodes/CircleBatchMatMul.h | 37 + .../import/include/luci/Import/Nodes/CircleCast.h | 37 + .../import/include/luci/Import/Nodes/CircleCeil.h | 37 + .../include/luci/Import/Nodes/CircleCustom.h | 35 + .../include/luci/Import/Nodes/CircleDepthToSpace.h | 37 + .../import/include/luci/Import/Nodes/CircleElu.h | 37 + .../include/luci/Import/Nodes/CircleExpandDims.h | 37 + .../import/include/luci/Import/Nodes/CircleFill.h | 37 + .../import/include/luci/Import/Nodes/CircleFloor.h | 37 + .../include/luci/Import/Nodes/CircleFloorDiv.h | 37 + .../include/luci/Import/Nodes/CircleFloorMod.h | 37 + .../include/luci/Import/Nodes/CircleGather.h | 37 + .../include/luci/Import/Nodes/CircleGatherNd.h | 37 + .../include/luci/Import/Nodes/CircleGreater.h | 37 + .../include/luci/Import/Nodes/CircleGreaterEqual.h | 37 + .../import/include/luci/Import/Nodes/CircleIf.h | 35 + .../include/luci/Import/Nodes/CircleInstanceNorm.h | 37 + .../include/luci/Import/Nodes/CircleL2Normalize.h | 37 + .../include/luci/Import/Nodes/CircleL2Pool2D.h | 37 + .../include/luci/Import/Nodes/CircleLeakyRelu.h | 37 + .../import/include/luci/Import/Nodes/CircleLess.h | 37 + .../include/luci/Import/Nodes/CircleLessEqual.h | 37 + .../Nodes/CircleLocalResponseNormalization.h | 37 + .../import/include/luci/Import/Nodes/CircleLog.h | 37 + .../include/luci/Import/Nodes/CircleLogSoftmax.h | 37 + .../include/luci/Import/Nodes/CircleLogicalAnd.h | 37 + .../include/luci/Import/Nodes/CircleLogistic.h | 37 + .../include/luci/Import/Nodes/CircleMatrixDiag.h | 37 + .../luci/Import/Nodes/CircleMatrixSetDiag.h | 37 + .../include/luci/Import/Nodes/CircleMaximum.h | 37 + .../include/luci/Import/Nodes/CircleMinimum.h | 37 + .../include/luci/Import/Nodes/CircleMirrorPad.h | 37 + .../import/include/luci/Import/Nodes/CircleNeg.h | 37 + .../include/luci/Import/Nodes/CircleNotEqual.h | 37 + .../include/luci/Import/Nodes/CircleOneHot.h | 37 + .../import/include/luci/Import/Nodes/CirclePRelu.h | 37 + .../import/include/luci/Import/Nodes/CirclePow.h | 37 + .../import/include/luci/Import/Nodes/CircleRange.h | 37 + .../import/include/luci/Import/Nodes/CircleRank.h | 37 + .../include/luci/Import/Nodes/CircleReduceAny.h | 37 + .../include/luci/Import/Nodes/CircleReduceMax.h | 37 + .../include/luci/Import/Nodes/CircleReduceMin.h | 37 + .../include/luci/Import/Nodes/CircleReduceProd.h | 37 + .../import/include/luci/Import/Nodes/CircleRelu6.h | 37 + .../include/luci/Import/Nodes/CircleReluN1To1.h | 37 + .../luci/Import/Nodes/CircleResizeBilinear.h | 37 + .../Import/Nodes/CircleResizeNearestNeighbor.h | 37 + .../luci/Import/Nodes/CircleReverseSequence.h | 37 + .../include/luci/Import/Nodes/CircleReverseV2.h | 37 + .../import/include/luci/Import/Nodes/CircleRound.h | 37 + .../include/luci/Import/Nodes/CircleScatterNd.h | 37 + .../include/luci/Import/Nodes/CircleSegmentSum.h | 37 + .../include/luci/Import/Nodes/CircleSelect.h | 37 + .../include/luci/Import/Nodes/CircleSelectV2.h | 37 + .../import/include/luci/Import/Nodes/CircleShape.h | 37 + .../import/include/luci/Import/Nodes/CircleSin.h | 37 + .../import/include/luci/Import/Nodes/CircleSlice.h | 37 + .../luci/Import/Nodes/CircleSpaceToBatchND.h | 37 + .../include/luci/Import/Nodes/CircleSpaceToDepth.h | 37 + .../luci/Import/Nodes/CircleSparseToDense.h | 37 + .../import/include/luci/Import/Nodes/CircleSplit.h | 35 + .../include/luci/Import/Nodes/CircleSplitV.h | 35 + .../import/include/luci/Import/Nodes/CircleSqrt.h | 37 + .../include/luci/Import/Nodes/CircleSquare.h | 37 + .../luci/Import/Nodes/CircleSquaredDifference.h | 37 + .../include/luci/Import/Nodes/CircleSqueeze.h | 37 + .../include/luci/Import/Nodes/CircleStridedSlice.h | 37 + .../import/include/luci/Import/Nodes/CircleSum.h | 37 + .../import/include/luci/Import/Nodes/CircleTanh.h | 37 + .../import/include/luci/Import/Nodes/CircleTile.h | 37 + .../include/luci/Import/Nodes/CircleTopKV2.h | 35 + .../luci/Import/Nodes/CircleTransposeConv.h | 37 + .../include/luci/Import/Nodes/CircleUnpack.h | 35 + .../import/include/luci/Import/Nodes/CircleWhere.h | 36 + .../import/include/luci/Import/Nodes/CircleWhile.h | 35 + .../include/luci/Import/Nodes/CircleZerosLike.h | 37 + compiler/luci/import/include/luci/Importer.h | 2 +- compiler/luci/import/src/CircleReader.cpp | 43 + compiler/luci/import/src/GraphBuilder.cpp | 37 +- compiler/luci/import/src/GraphBuilderContext.cpp | 23 +- compiler/luci/import/src/GraphBuilderRegistry.cpp | 209 +- compiler/luci/import/src/Importer.cpp | 113 +- compiler/luci/import/src/Nodes/CircleAddN.cpp | 50 + compiler/luci/import/src/Nodes/CircleArgMin.cpp | 48 + .../import/src/Nodes/CircleBCQFullyConnected.cpp | 62 + compiler/luci/import/src/Nodes/CircleBCQGather.cpp | 52 + .../luci/import/src/Nodes/CircleBatchMatMul.cpp | 47 + compiler/luci/import/src/Nodes/CircleCast.cpp | 99 + compiler/luci/import/src/Nodes/CircleCeil.cpp | 50 + compiler/luci/import/src/Nodes/CircleConst.cpp | 108 +- compiler/luci/import/src/Nodes/CircleConv2D.cpp | 3 +- compiler/luci/import/src/Nodes/CircleCustom.cpp | 88 + .../luci/import/src/Nodes/CircleDepthToSpace.cpp | 67 + .../import/src/Nodes/CircleDepthwiseConv2D.cpp | 3 +- compiler/luci/import/src/Nodes/CircleElu.cpp | 64 + compiler/luci/import/src/Nodes/CircleExp.cpp | 4 +- .../luci/import/src/Nodes/CircleExpandDims.cpp | 51 + compiler/luci/import/src/Nodes/CircleFill.cpp | 49 + compiler/luci/import/src/Nodes/CircleFloor.cpp | 50 + compiler/luci/import/src/Nodes/CircleFloorDiv.cpp | 68 + compiler/luci/import/src/Nodes/CircleFloorMod.cpp | 57 + .../luci/import/src/Nodes/CircleFullyConnected.cpp | 12 +- compiler/luci/import/src/Nodes/CircleGather.cpp | 68 + compiler/luci/import/src/Nodes/CircleGatherNd.cpp | 64 + compiler/luci/import/src/Nodes/CircleGreater.cpp | 76 + .../luci/import/src/Nodes/CircleGreaterEqual.cpp | 62 + compiler/luci/import/src/Nodes/CircleIf.cpp | 138 + .../luci/import/src/Nodes/CircleInstanceNorm.cpp | 52 + .../luci/import/src/Nodes/CircleL2Normalize.cpp | 56 + compiler/luci/import/src/Nodes/CircleL2Pool2D.cpp | 54 + compiler/luci/import/src/Nodes/CircleLeakyRelu.cpp | 50 + compiler/luci/import/src/Nodes/CircleLess.cpp | 78 + compiler/luci/import/src/Nodes/CircleLessEqual.cpp | 62 + .../src/Nodes/CircleLocalResponseNormalization.cpp | 51 + compiler/luci/import/src/Nodes/CircleLog.cpp | 65 + .../luci/import/src/Nodes/CircleLogSoftmax.cpp | 46 + .../luci/import/src/Nodes/CircleLogicalAnd.cpp | 55 + compiler/luci/import/src/Nodes/CircleLogistic.cpp | 66 + .../luci/import/src/Nodes/CircleMatrixDiag.cpp | 56 + .../luci/import/src/Nodes/CircleMatrixSetDiag.cpp | 57 + compiler/luci/import/src/Nodes/CircleMaximum.cpp | 72 + compiler/luci/import/src/Nodes/CircleMinimum.cpp | 72 + compiler/luci/import/src/Nodes/CircleMirrorPad.cpp | 50 + compiler/luci/import/src/Nodes/CircleNeg.cpp | 44 + compiler/luci/import/src/Nodes/CircleNotEqual.cpp | 62 + compiler/luci/import/src/Nodes/CircleOneHot.cpp | 77 + compiler/luci/import/src/Nodes/CirclePRelu.cpp | 50 + compiler/luci/import/src/Nodes/CirclePow.cpp | 50 + compiler/luci/import/src/Nodes/CircleRange.cpp | 46 + compiler/luci/import/src/Nodes/CircleRank.cpp | 46 + compiler/luci/import/src/Nodes/CircleReduceAny.cpp | 69 + compiler/luci/import/src/Nodes/CircleReduceMax.cpp | 64 + compiler/luci/import/src/Nodes/CircleReduceMin.cpp | 64 + .../luci/import/src/Nodes/CircleReduceProd.cpp | 64 + compiler/luci/import/src/Nodes/CircleRelu6.cpp | 47 + compiler/luci/import/src/Nodes/CircleReluN1To1.cpp | 49 + compiler/luci/import/src/Nodes/CircleReshape.cpp | 12 +- .../luci/import/src/Nodes/CircleResizeBilinear.cpp | 51 + .../src/Nodes/CircleResizeNearestNeighbor.cpp | 49 + .../import/src/Nodes/CircleReverseSequence.cpp | 71 + compiler/luci/import/src/Nodes/CircleReverseV2.cpp | 67 + compiler/luci/import/src/Nodes/CircleRound.cpp | 71 + compiler/luci/import/src/Nodes/CircleScatterNd.cpp | 58 + .../luci/import/src/Nodes/CircleSegmentSum.cpp | 68 + compiler/luci/import/src/Nodes/CircleSelect.cpp | 56 + compiler/luci/import/src/Nodes/CircleSelectV2.cpp | 60 + compiler/luci/import/src/Nodes/CircleShape.cpp | 53 + compiler/luci/import/src/Nodes/CircleSin.cpp | 63 + compiler/luci/import/src/Nodes/CircleSlice.cpp | 52 + .../luci/import/src/Nodes/CircleSpaceToBatchND.cpp | 80 + .../luci/import/src/Nodes/CircleSpaceToDepth.cpp | 52 + .../luci/import/src/Nodes/CircleSparseToDense.cpp | 50 + compiler/luci/import/src/Nodes/CircleSplit.cpp | 119 + compiler/luci/import/src/Nodes/CircleSplitV.cpp | 121 + compiler/luci/import/src/Nodes/CircleSqrt.cpp | 44 + compiler/luci/import/src/Nodes/CircleSquare.cpp | 63 + .../import/src/Nodes/CircleSquaredDifference.cpp | 77 + compiler/luci/import/src/Nodes/CircleSqueeze.cpp | 51 + .../luci/import/src/Nodes/CircleStridedSlice.cpp | 60 + compiler/luci/import/src/Nodes/CircleSum.cpp | 46 + compiler/luci/import/src/Nodes/CircleTanh.cpp | 60 + compiler/luci/import/src/Nodes/CircleTile.cpp | 68 + compiler/luci/import/src/Nodes/CircleTopKV2.cpp | 117 + .../luci/import/src/Nodes/CircleTransposeConv.cpp | 54 + compiler/luci/import/src/Nodes/CircleUnpack.cpp | 151 + compiler/luci/import/src/Nodes/CircleWhere.cpp | 60 + compiler/luci/import/src/Nodes/CircleWhile.cpp | 123 + compiler/luci/import/src/Nodes/CircleZerosLike.cpp | 49 + compiler/luci/import/src/PostImport.cpp | 354 + compiler/luci/import/src/PostImport.h | 34 + compiler/luci/lang/CMakeLists.txt | 2 + compiler/luci/lang/include/luci/IR/AttrDilation.h | 43 + .../luci/lang/include/luci/IR/AttrMirrorPadMode.h | 33 + .../luci/lang/include/luci/IR/CircleNodeDecl.h | 16 +- .../luci/lang/include/luci/IR/CircleNodeImpl.h | 1 - compiler/luci/lang/include/luci/IR/CircleNodes.h | 98 +- compiler/luci/lang/include/luci/IR/CircleNodes.lst | 85 +- .../luci/lang/include/luci/IR/LuciNodeMixins.h | 5 +- .../luci/lang/include/luci/IR/Nodes/CircleAddN.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleArgMin.h | 50 + .../luci/IR/Nodes/CircleBCQFullyConnected.h | 66 + .../lang/include/luci/IR/Nodes/CircleBCQGather.h | 60 + .../lang/include/luci/IR/Nodes/CircleBatchMatMul.h | 54 + .../luci/lang/include/luci/IR/Nodes/CircleCast.h | 51 + .../luci/lang/include/luci/IR/Nodes/CircleCeil.h | 40 + .../include/luci/IR/Nodes/CircleConcatenation.h | 2 +- .../luci/lang/include/luci/IR/Nodes/CircleConst.h | 5 +- .../luci/lang/include/luci/IR/Nodes/CircleConv2D.h | 5 + .../luci/lang/include/luci/IR/Nodes/CircleCustom.h | 61 + .../lang/include/luci/IR/Nodes/CircleCustomOut.h | 51 + .../include/luci/IR/Nodes/CircleDepthToSpace.h | 48 + .../include/luci/IR/Nodes/CircleDepthwiseConv2D.h | 5 + .../luci/lang/include/luci/IR/Nodes/CircleElu.h | 43 + .../lang/include/luci/IR/Nodes/CircleExpandDims.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleFill.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleFloor.h | 40 + .../lang/include/luci/IR/Nodes/CircleFloorDiv.h | 43 + .../lang/include/luci/IR/Nodes/CircleFloorMod.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleGather.h | 9 +- .../lang/include/luci/IR/Nodes/CircleGatherNd.h | 43 + .../lang/include/luci/IR/Nodes/CircleGreater.h | 43 + .../include/luci/IR/Nodes/CircleGreaterEqual.h | 44 + .../luci/lang/include/luci/IR/Nodes/CircleIf.h | 79 + .../luci/lang/include/luci/IR/Nodes/CircleIfOut.h | 50 + .../luci/lang/include/luci/IR/Nodes/CircleInput.h | 5 +- .../lang/include/luci/IR/Nodes/CircleL2Normalize.h | 43 + .../lang/include/luci/IR/Nodes/CircleL2Pool2D.h | 62 + .../lang/include/luci/IR/Nodes/CircleLeakyRelu.h | 49 + .../luci/lang/include/luci/IR/Nodes/CircleLess.h | 43 + .../lang/include/luci/IR/Nodes/CircleLessEqual.h | 43 + .../IR/Nodes/CircleLocalResponseNormalization.h | 60 + .../luci/lang/include/luci/IR/Nodes/CircleLog.h | 40 + .../lang/include/luci/IR/Nodes/CircleLogSoftmax.h | 40 + .../lang/include/luci/IR/Nodes/CircleLogicalAnd.h | 43 + .../lang/include/luci/IR/Nodes/CircleLogistic.h | 43 + .../lang/include/luci/IR/Nodes/CircleMatrixDiag.h | 40 + .../include/luci/IR/Nodes/CircleMatrixSetDiag.h | 44 + .../lang/include/luci/IR/Nodes/CircleMaximum.h | 1 - .../luci/lang/include/luci/IR/Nodes/CircleMean.h | 1 - .../lang/include/luci/IR/Nodes/CircleMinimum.h | 43 + .../lang/include/luci/IR/Nodes/CircleMirrorPad.h | 54 + .../luci/lang/include/luci/IR/Nodes/CircleNeg.h | 40 + .../lang/include/luci/IR/Nodes/CircleNotEqual.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleOneHot.h | 56 + .../luci/lang/include/luci/IR/Nodes/CircleOutput.h | 22 +- .../luci/lang/include/luci/IR/Nodes/CirclePRelu.h | 46 + .../luci/lang/include/luci/IR/Nodes/CirclePow.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleRange.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleRank.h | 40 + .../lang/include/luci/IR/Nodes/CircleReduceAny.h | 50 + .../lang/include/luci/IR/Nodes/CircleReduceMax.h | 50 + .../lang/include/luci/IR/Nodes/CircleReduceMin.h | 50 + .../lang/include/luci/IR/Nodes/CircleReduceProd.h | 50 + .../luci/lang/include/luci/IR/Nodes/CircleRelu.h | 1 - .../luci/lang/include/luci/IR/Nodes/CircleRelu6.h | 1 - .../lang/include/luci/IR/Nodes/CircleReluN1To1.h | 43 + .../lang/include/luci/IR/Nodes/CircleReshape.h | 5 +- .../include/luci/IR/Nodes/CircleResizeBilinear.h | 57 + .../luci/IR/Nodes/CircleResizeNearestNeighbor.h | 53 + .../include/luci/IR/Nodes/CircleReverseSequence.h | 58 + .../lang/include/luci/IR/Nodes/CircleReverseV2.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleRound.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleRsqrt.h | 1 - .../lang/include/luci/IR/Nodes/CircleScatterNd.h | 46 + .../lang/include/luci/IR/Nodes/CircleSegmentSum.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleSelect.h | 49 + .../lang/include/luci/IR/Nodes/CircleSelectV2.h | 49 + .../luci/lang/include/luci/IR/Nodes/CircleShape.h | 50 + .../luci/lang/include/luci/IR/Nodes/CircleSin.h | 40 + .../luci/lang/include/luci/IR/Nodes/CircleSlice.h | 46 + .../lang/include/luci/IR/Nodes/CircleSoftmax.h | 2 +- .../include/luci/IR/Nodes/CircleSpaceToBatchND.h | 47 + .../include/luci/IR/Nodes/CircleSpaceToDepth.h | 48 + .../include/luci/IR/Nodes/CircleSparseToDense.h | 57 + .../luci/lang/include/luci/IR/Nodes/CircleSplit.h | 51 + .../lang/include/luci/IR/Nodes/CircleSplitOut.h | 50 + .../luci/lang/include/luci/IR/Nodes/CircleSplitV.h | 54 + .../lang/include/luci/IR/Nodes/CircleSplitVOut.h | 51 + .../luci/lang/include/luci/IR/Nodes/CircleSqrt.h | 1 - .../luci/lang/include/luci/IR/Nodes/CircleSquare.h | 43 + .../luci/IR/Nodes/CircleSquaredDifference.h | 1 - .../lang/include/luci/IR/Nodes/CircleSqueeze.h | 50 + .../include/luci/IR/Nodes/CircleStridedSlice.h | 73 + .../luci/lang/include/luci/IR/Nodes/CircleSum.h | 50 + .../luci/lang/include/luci/IR/Nodes/CircleTanh.h | 43 + .../luci/lang/include/luci/IR/Nodes/CircleTile.h | 46 + .../luci/lang/include/luci/IR/Nodes/CircleTopKV2.h | 46 + .../lang/include/luci/IR/Nodes/CircleTopKV2Out.h | 51 + .../lang/include/luci/IR/Nodes/CircleTranspose.h | 1 - .../include/luci/IR/Nodes/CircleTransposeConv.h | 3 +- .../luci/lang/include/luci/IR/Nodes/CircleUnpack.h | 54 + .../lang/include/luci/IR/Nodes/CircleUnpackOut.h | 51 + .../luci/lang/include/luci/IR/Nodes/CircleWhere.h | 45 + .../luci/lang/include/luci/IR/Nodes/CircleWhile.h | 79 + .../lang/include/luci/IR/Nodes/CircleWhileOut.h | 50 + .../lang/include/luci/IR/Nodes/CircleZerosLike.h | 46 + .../lang/include/luci/IR/PropertyShapeStatus.h | 38 + .../luci/lang/include/luci/IR/VariadicArityNode.h | 12 +- compiler/luci/lang/src/CircleDialect.cpp | 9 +- compiler/luci/lang/src/CircleDialect.test.cpp | 59 +- .../luci/lang/src/CircleNodeShapeDtype.test.cpp | 52 + compiler/luci/lang/src/CircleNodes.cpp | 35 + compiler/luci/lang/src/DeadNodeQueryService.cpp | 74 + compiler/luci/lang/src/DeadNodeQueryService.h | 34 + compiler/luci/lang/src/Module.cpp | 2 +- compiler/luci/lang/src/Module.test.cpp | 14 +- compiler/luci/lang/src/Nodes/CircleAbs.test.cpp | 69 +- compiler/luci/lang/src/Nodes/CircleAdd.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CircleAddN.test.cpp | 91 + compiler/luci/lang/src/Nodes/CircleArgMax.test.cpp | 59 +- compiler/luci/lang/src/Nodes/CircleArgMin.test.cpp | 81 + .../lang/src/Nodes/CircleAveragePool2D.test.cpp | 90 + .../src/Nodes/CircleBCQFullyConnected.test.cpp | 38 + .../luci/lang/src/Nodes/CircleBCQGather.test.cpp | 37 + .../luci/lang/src/Nodes/CircleBatchMatMul.test.cpp | 84 + .../lang/src/Nodes/CircleBatchToSpaceND.test.cpp | 63 +- compiler/luci/lang/src/Nodes/CircleCast.test.cpp | 78 + compiler/luci/lang/src/Nodes/CircleCeil.test.cpp | 76 + .../lang/src/Nodes/CircleConcatenation.test.cpp | 63 +- compiler/luci/lang/src/Nodes/CircleConst.cpp | 3 + compiler/luci/lang/src/Nodes/CircleConv2D.test.cpp | 85 +- compiler/luci/lang/src/Nodes/CircleCos.test.cpp | 51 +- compiler/luci/lang/src/Nodes/CircleCustom.test.cpp | 45 + .../luci/lang/src/Nodes/CircleCustomOut.test.cpp | 32 + .../lang/src/Nodes/CircleDepthToSpace.test.cpp | 80 + .../lang/src/Nodes/CircleDepthwiseConv2D.test.cpp | 93 +- compiler/luci/lang/src/Nodes/CircleDiv.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CircleElu.test.cpp | 76 + compiler/luci/lang/src/Nodes/CircleEqual.test.cpp | 59 +- compiler/luci/lang/src/Nodes/CircleExp.test.cpp | 51 +- .../luci/lang/src/Nodes/CircleExpandDims.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleFill.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleFloor.test.cpp | 76 + .../luci/lang/src/Nodes/CircleFloorDiv.test.cpp | 81 + .../luci/lang/src/Nodes/CircleFloorMod.test.cpp | 81 + .../lang/src/Nodes/CircleFullyConnected.test.cpp | 68 +- compiler/luci/lang/src/Nodes/CircleGather.test.cpp | 62 +- .../luci/lang/src/Nodes/CircleGatherNd.test.cpp | 81 + .../luci/lang/src/Nodes/CircleGreater.test.cpp | 81 + .../lang/src/Nodes/CircleGreaterEqual.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleIf.test.cpp | 87 + compiler/luci/lang/src/Nodes/CircleIfOut.test.cpp | 32 + .../lang/src/Nodes/CircleInstanceNorm.test.cpp | 68 +- .../luci/lang/src/Nodes/CircleL2Pool2D.test.cpp | 94 + .../luci/lang/src/Nodes/CircleLeakyRelu.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleLess.test.cpp | 81 + .../luci/lang/src/Nodes/CircleLessEqual.test.cpp | 81 + .../CircleLocalResponseNormalization.test.cpp | 90 + compiler/luci/lang/src/Nodes/CircleLog.test.cpp | 76 + .../luci/lang/src/Nodes/CircleLogSoftmax.test.cpp | 76 + .../luci/lang/src/Nodes/CircleLogicalAnd.test.cpp | 81 + .../luci/lang/src/Nodes/CircleLogicalNot.test.cpp | 51 +- .../luci/lang/src/Nodes/CircleLogicalOr.test.cpp | 57 +- .../luci/lang/src/Nodes/CircleLogistic.test.cpp | 76 + .../luci/lang/src/Nodes/CircleMatrixDiag.test.cpp | 78 + .../lang/src/Nodes/CircleMatrixSetDiag.test.cpp | 84 + .../luci/lang/src/Nodes/CircleMaxPool2D.test.cpp | 67 +- .../luci/lang/src/Nodes/CircleMaximum.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CircleMean.test.cpp | 86 + .../luci/lang/src/Nodes/CircleMinimum.test.cpp | 81 + .../luci/lang/src/Nodes/CircleMirrorPad.test.cpp | 86 + compiler/luci/lang/src/Nodes/CircleMul.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CircleNeg.test.cpp | 76 + .../luci/lang/src/Nodes/CircleNotEqual.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleOneHot.test.cpp | 95 + compiler/luci/lang/src/Nodes/CirclePRelu.test.cpp | 81 + compiler/luci/lang/src/Nodes/CirclePack.test.cpp | 63 +- compiler/luci/lang/src/Nodes/CirclePad.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CirclePow.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleRange.test.cpp | 86 + compiler/luci/lang/src/Nodes/CircleRank.test.cpp | 31 + .../luci/lang/src/Nodes/CircleReduceAny.test.cpp | 86 + .../luci/lang/src/Nodes/CircleReduceMax.test.cpp | 86 + .../luci/lang/src/Nodes/CircleReduceMin.test.cpp | 86 + .../luci/lang/src/Nodes/CircleReduceProd.test.cpp | 86 + compiler/luci/lang/src/Nodes/CircleRelu.test.cpp | 51 +- compiler/luci/lang/src/Nodes/CircleRelu6.test.cpp | 51 +- .../luci/lang/src/Nodes/CircleReluN1To1.test.cpp | 76 + .../luci/lang/src/Nodes/CircleReshape.test.cpp | 65 +- .../lang/src/Nodes/CircleResizeBilinear.test.cpp | 88 + .../src/Nodes/CircleResizeNearestNeighbor.test.cpp | 85 + .../lang/src/Nodes/CircleReverseSequence.test.cpp | 35 + .../luci/lang/src/Nodes/CircleReverseV2.test.cpp | 32 + compiler/luci/lang/src/Nodes/CircleRound.test.cpp | 76 + compiler/luci/lang/src/Nodes/CircleRsqrt.test.cpp | 51 +- .../luci/lang/src/Nodes/CircleScatterNd.test.cpp | 86 + .../luci/lang/src/Nodes/CircleSegmentSum.test.cpp | 32 + compiler/luci/lang/src/Nodes/CircleSelect.test.cpp | 86 + .../luci/lang/src/Nodes/CircleSelectV2.test.cpp | 86 + compiler/luci/lang/src/Nodes/CircleShape.test.cpp | 80 + compiler/luci/lang/src/Nodes/CircleSin.test.cpp | 76 + compiler/luci/lang/src/Nodes/CircleSlice.test.cpp | 86 + .../luci/lang/src/Nodes/CircleSoftmax.test.cpp | 51 +- .../lang/src/Nodes/CircleSpaceToBatchND.test.cpp | 86 + .../lang/src/Nodes/CircleSpaceToDepth.test.cpp | 76 + .../lang/src/Nodes/CircleSparseToDense.test.cpp | 93 + compiler/luci/lang/src/Nodes/CircleSplit.test.cpp | 85 + .../luci/lang/src/Nodes/CircleSplitOut.test.cpp | 32 + compiler/luci/lang/src/Nodes/CircleSplitV.test.cpp | 90 + .../luci/lang/src/Nodes/CircleSplitVOut.test.cpp | 32 + compiler/luci/lang/src/Nodes/CircleSqrt.test.cpp | 51 +- compiler/luci/lang/src/Nodes/CircleSquare.test.cpp | 76 + .../src/Nodes/CircleSquaredDifference.test.cpp | 57 +- .../luci/lang/src/Nodes/CircleSqueeze.test.cpp | 87 + .../lang/src/Nodes/CircleStridedSlice.test.cpp | 108 + compiler/luci/lang/src/Nodes/CircleSub.test.cpp | 57 +- compiler/luci/lang/src/Nodes/CircleSum.test.cpp | 85 + compiler/luci/lang/src/Nodes/CircleTanh.test.cpp | 76 + compiler/luci/lang/src/Nodes/CircleTile.test.cpp | 81 + compiler/luci/lang/src/Nodes/CircleTopKV2.test.cpp | 81 + .../luci/lang/src/Nodes/CircleTopKV2Out.test.cpp | 32 + .../luci/lang/src/Nodes/CircleTranspose.test.cpp | 57 +- .../lang/src/Nodes/CircleTransposeConv.test.cpp | 75 +- compiler/luci/lang/src/Nodes/CircleUnpack.test.cpp | 83 + .../luci/lang/src/Nodes/CircleUnpackOut.test.cpp | 32 + compiler/luci/lang/src/Nodes/CircleWhere.test.cpp | 33 + compiler/luci/lang/src/Nodes/CircleWhile.test.cpp | 87 + .../luci/lang/src/Nodes/CircleWhileOut.test.cpp | 32 + .../luci/lang/src/Nodes/CircleZerosLike.test.cpp | 76 + compiler/luci/log/CMakeLists.txt | 1 + compiler/luci/log/include/luci/Log.h | 10 +- compiler/luci/log/src/Log.cpp | 40 +- compiler/luci/logex/src/FormattedGraph.cpp | 1004 +- compiler/luci/pass/CMakeLists.txt | 24 +- compiler/luci/pass/include/luci/CircleOptimizer.h | 19 + compiler/luci/pass/include/luci/Pass/FuseBCQPass.h | 38 + .../include/luci/Pass/QuantizationParameters.h | 31 + .../luci/Pass/QuantizeDequantizeWeightsPass.h | 54 + .../include/luci/Pass/QuantizeWithMinMaxPass.h | 54 + .../include/luci/Pass/ResolveCustomOpAddPass.h | 37 + .../luci/Pass/ResolveCustomOpBatchMatMulPass.h | 37 + .../include/luci/Pass/ResolveCustomOpMatMulPass.h | 37 + compiler/luci/pass/src/CircleOptimizer.cpp | 121 +- compiler/luci/pass/src/CircleOptimizerUtils.cpp | 89 + compiler/luci/pass/src/CircleOptimizerUtils.h | 42 + compiler/luci/pass/src/FuseBCQPass.cpp | 405 + compiler/luci/pass/src/FuseInstanceNormPass.cpp | 231 +- .../luci/pass/src/FuseInstanceNormPass.test.cpp | 64 + .../luci/pass/src/FuseInstanceNormPassInternal.h | 28 + compiler/luci/pass/src/QuantizationUtils.cpp | 172 + compiler/luci/pass/src/QuantizationUtils.h | 38 + .../pass/src/QuantizeDequantizeWeightsPass.cpp | 495 + compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp | 551 + compiler/luci/pass/src/ResolveCustomOpAddPass.cpp | 124 + .../pass/src/ResolveCustomOpBatchMatMulPass.cpp | 69 + .../luci/pass/src/ResolveCustomOpMatMulPass.cpp | 185 + compiler/luci/requires.cmake | 2 + compiler/luci/service/src/CircleShapeInference.cpp | 7 +- .../luci/service/src/CircleShapeInferenceRule.cpp | 1729 ++- .../service/src/CircleShapeInferenceRule.test.cpp | 532 +- compiler/luci/service/src/CircleTypeInference.cpp | 10 +- .../luci/service/src/CircleTypeInferenceRule.cpp | 452 +- .../service/src/CircleTypeInferenceRule.test.cpp | 24 +- compiler/luci/service/src/GraphBlock.h | 201 - compiler/luci/service/src/GraphBlock.test.cpp | 246 - .../luci/service/src/ShapeInfer_StridedSlice.cpp | 298 + .../luci/service/src/ShapeInfer_StridedSlice.h | 31 + compiler/luci/service/src/TestGraph.h | 216 +- compiler/luci/service/src/TestGraph.test.cpp | 101 + compiler/luci/service/src/Validate.cpp | 31 +- compiler/luci/tester/CMakeLists.txt | 12 +- compiler/luci/tester/src/Model.cpp | 62 - compiler/luci/tester/src/Model.h | 27 - compiler/luci/tester/src/ReadTester.cpp | 39 +- compiler/luci/tester/src/WriteTester.cpp | 43 +- compiler/luci/tests/CMakeLists.txt | 29 + compiler/luci/tests/readverify.sh | 3 + compiler/luci/tests/test.lst | 296 +- compiler/mio-circle/CMakeLists.txt | 2 +- compiler/mio-tflite/CMakeLists.txt | 7 +- compiler/mir-caffe-importer/CMakeLists.txt | 17 - compiler/mir-caffe-importer/caffe_importer.cpp | 439 - compiler/mir-caffe-importer/caffe_op_creator.cpp | 834 -- compiler/mir-caffe-importer/requires.cmake | 1 - compiler/mir-caffe2-importer/CMakeLists.txt | 29 - compiler/mir-caffe2-importer/caffe2_importer.cpp | 343 - compiler/mir-caffe2-importer/caffe2_op_creator.cpp | 547 - .../mir-caffe2-importer/caffe2_proto_helper.cpp | 62 - compiler/mir-caffe2-importer/caffe2_proto_helper.h | 40 - compiler/mir-caffe2-importer/requires.cmake | 1 - compiler/mir-interpreter/README.md | 1 + compiler/mir-onnx-importer/AttributeHelpers.h | 105 - compiler/mir-onnx-importer/CMakeLists.txt | 119 - compiler/mir-onnx-importer/ONNXImporterImpl.cpp | 241 - compiler/mir-onnx-importer/Op/Pad.cpp | 70 - compiler/mir-onnx-importer/Op/Transpose.cpp | 57 - compiler/mir-onnx-importer/Op/Upsample.cpp | 124 - compiler/mir-onnx-importer/requires.cmake | 2 - compiler/mir-tflite-importer/CMakeLists.txt | 22 - compiler/mir-tflite-importer/requires.cmake | 1 - compiler/mir-tflite-importer/tflite_importer.cpp | 428 - compiler/mir-tflite-importer/tflite_op_creator.cpp | 649 - compiler/mir/CMakeLists.txt | 5 + .../include/mir_caffe2_importer}/caffe2_importer.h | 0 .../include/mir_caffe_importer}/caffe_importer.h | 0 .../include/mir_onnx_importer}/ONNXImporterImpl.h | 0 .../include/mir_tflite_importer}/tflite_importer.h | 0 .../mir/src/mir_caffe2_importer/CMakeLists.txt | 28 + .../src/mir_caffe2_importer/caffe2_importer.cpp | 343 + .../src/mir_caffe2_importer/caffe2_op_creator.cpp | 551 + .../src/mir_caffe2_importer}/caffe2_op_creator.h | 0 .../src/mir_caffe2_importer}/caffe2_op_types.h | 0 .../mir_caffe2_importer/caffe2_proto_helper.cpp | 62 + .../src/mir_caffe2_importer/caffe2_proto_helper.h | 40 + compiler/mir/src/mir_caffe_importer/CMakeLists.txt | 16 + .../mir/src/mir_caffe_importer/caffe_importer.cpp | 439 + .../src/mir_caffe_importer/caffe_op_creator.cpp | 835 ++ .../src/mir_caffe_importer}/caffe_op_creator.h | 0 .../src/mir_caffe_importer}/caffe_op_types.h | 0 .../mir/src/mir_onnx_importer/AttributeHelpers.h | 105 + compiler/mir/src/mir_onnx_importer/CMakeLists.txt | 119 + .../src/mir_onnx_importer}/ConvPoolHelpers.cpp | 0 .../src/mir_onnx_importer}/ConvPoolHelpers.h | 0 .../src/mir_onnx_importer}/ONNXHelpers.cpp | 0 .../src/mir_onnx_importer}/ONNXHelpers.h | 0 .../mir/src/mir_onnx_importer/ONNXImporterImpl.cpp | 240 + .../ONNXNodeConverterRegistry.cpp | 0 .../mir_onnx_importer}/ONNXNodeConverterRegistry.h | 0 .../ONNXNodeConverterRegistry.test.cpp | 0 .../src/mir_onnx_importer}/ONNXOpRegistration.h | 0 .../src/mir_onnx_importer}/Op/Abs.cpp | 0 .../src/mir_onnx_importer}/Op/Abs.h | 0 .../src/mir_onnx_importer}/Op/Add.cpp | 0 .../src/mir_onnx_importer}/Op/Add.h | 0 .../src/mir_onnx_importer}/Op/AveragePool.cpp | 0 .../src/mir_onnx_importer}/Op/AveragePool.h | 0 .../mir_onnx_importer}/Op/BatchNormalization.cpp | 0 .../src/mir_onnx_importer}/Op/BatchNormalization.h | 0 .../src/mir_onnx_importer}/Op/Concat.cpp | 0 .../src/mir_onnx_importer}/Op/Concat.h | 0 .../src/mir_onnx_importer}/Op/Constant.cpp | 0 .../src/mir_onnx_importer}/Op/Constant.h | 0 .../src/mir_onnx_importer}/Op/Conv.cpp | 0 .../src/mir_onnx_importer}/Op/Conv.h | 0 .../src/mir_onnx_importer}/Op/ConvTranspose.cpp | 0 .../src/mir_onnx_importer}/Op/ConvTranspose.h | 0 .../src/mir_onnx_importer}/Op/Div.cpp | 0 .../src/mir_onnx_importer}/Op/Div.h | 0 .../src/mir_onnx_importer}/Op/Dropout.cpp | 0 .../src/mir_onnx_importer}/Op/Dropout.h | 0 .../src/mir_onnx_importer}/Op/Equal.cpp | 0 .../src/mir_onnx_importer}/Op/Equal.h | 0 .../src/mir_onnx_importer}/Op/Expand.cpp | 0 .../src/mir_onnx_importer}/Op/Expand.h | 0 .../src/mir_onnx_importer}/Op/Flatten.cpp | 0 .../src/mir_onnx_importer}/Op/Flatten.h | 0 .../src/mir_onnx_importer}/Op/Gather.cpp | 0 .../src/mir_onnx_importer}/Op/Gather.h | 0 .../src/mir_onnx_importer}/Op/Gemm.cpp | 0 .../src/mir_onnx_importer}/Op/Gemm.h | 0 .../mir_onnx_importer}/Op/GlobalAveragePool.cpp | 0 .../src/mir_onnx_importer}/Op/GlobalAveragePool.h | 0 .../src/mir_onnx_importer}/Op/Greater.cpp | 0 .../src/mir_onnx_importer}/Op/Greater.h | 0 .../src/mir_onnx_importer}/Op/Identity.cpp | 0 .../src/mir_onnx_importer}/Op/Identity.h | 0 .../src/mir_onnx_importer}/Op/Less.cpp | 0 .../src/mir_onnx_importer}/Op/Less.h | 0 .../src/mir_onnx_importer}/Op/MatMul.cpp | 0 .../src/mir_onnx_importer}/Op/MatMul.h | 0 .../src/mir_onnx_importer}/Op/Max.cpp | 0 .../src/mir_onnx_importer}/Op/Max.h | 0 .../src/mir_onnx_importer}/Op/MaxPool.cpp | 0 .../src/mir_onnx_importer}/Op/MaxPool.h | 0 .../src/mir_onnx_importer}/Op/Mul.cpp | 0 .../src/mir_onnx_importer}/Op/Mul.h | 0 compiler/mir/src/mir_onnx_importer/Op/Pad.cpp | 70 + .../src/mir_onnx_importer}/Op/Pad.h | 0 .../src/mir_onnx_importer}/Op/Reciprocal.cpp | 0 .../src/mir_onnx_importer}/Op/Reciprocal.h | 0 .../src/mir_onnx_importer}/Op/ReduceMean.cpp | 0 .../src/mir_onnx_importer}/Op/ReduceMean.h | 0 .../src/mir_onnx_importer}/Op/Relu.cpp | 0 .../src/mir_onnx_importer}/Op/Relu.h | 0 .../src/mir_onnx_importer}/Op/Reshape.cpp | 0 .../src/mir_onnx_importer}/Op/Reshape.h | 0 .../src/mir_onnx_importer}/Op/Shape.cpp | 0 .../src/mir_onnx_importer}/Op/Shape.h | 0 .../src/mir_onnx_importer}/Op/Sigmoid.cpp | 0 .../src/mir_onnx_importer}/Op/Sigmoid.h | 0 .../src/mir_onnx_importer}/Op/Softmax.cpp | 0 .../src/mir_onnx_importer}/Op/Softmax.h | 0 .../src/mir_onnx_importer}/Op/Sqrt.cpp | 0 .../src/mir_onnx_importer}/Op/Sqrt.h | 0 .../src/mir_onnx_importer}/Op/Sub.cpp | 0 .../src/mir_onnx_importer}/Op/Sub.h | 0 .../src/mir_onnx_importer}/Op/Sum.cpp | 0 .../src/mir_onnx_importer}/Op/Sum.h | 0 .../src/mir_onnx_importer}/Op/Tanh.cpp | 0 .../src/mir_onnx_importer}/Op/Tanh.h | 0 .../mir/src/mir_onnx_importer/Op/Transpose.cpp | 57 + .../src/mir_onnx_importer}/Op/Transpose.h | 0 .../src/mir_onnx_importer}/Op/Unsqueeze.cpp | 0 .../src/mir_onnx_importer}/Op/Unsqueeze.h | 0 compiler/mir/src/mir_onnx_importer/Op/Upsample.cpp | 127 + .../src/mir_onnx_importer}/Op/Upsample.h | 0 .../mir/src/mir_tflite_importer/CMakeLists.txt | 21 + .../src/mir_tflite_importer}/schema/schema.fbs | 0 .../src/mir_tflite_importer}/schema/schema.meta | 0 .../src/mir_tflite_importer}/schema/schema_v0.fbs | 0 .../src/mir_tflite_importer}/schema/schema_v0.meta | 0 .../src/mir_tflite_importer}/schema/schema_v1.fbs | 0 .../src/mir_tflite_importer}/schema/schema_v1.meta | 0 .../src/mir_tflite_importer}/schema/schema_v2.fbs | 0 .../src/mir_tflite_importer}/schema/schema_v2.meta | 0 .../src/mir_tflite_importer}/schema/schema_v3.fbs | 0 .../src/mir_tflite_importer}/schema/schema_v3.meta | 0 .../src/mir_tflite_importer/tflite_importer.cpp | 428 + .../src/mir_tflite_importer/tflite_op_creator.cpp | 652 + .../src/mir_tflite_importer}/tflite_op_creator.h | 0 compiler/mir2loco/CMakeLists.txt | 1 - compiler/mir2loco/README.md | 1 + compiler/mir2loco/src/mir2loco.cpp | 20 +- compiler/moco-tf/requires.cmake | 1 + .../src/Canonicalization/PadCanonicalizer.cpp | 2 +- compiler/moco/import/src/Importer.cpp | 3 +- compiler/moco/import/src/Nodes/BiasAdd.test.cpp | 4 +- compiler/moco/import/src/Nodes/Concat.test.cpp | 4 +- compiler/moco/import/src/Nodes/Const.test.cpp | 14 +- compiler/moco/import/src/Nodes/Mean.test.cpp | 4 +- compiler/moco/import/src/Nodes/Pack.test.cpp | 2 +- .../moco/import/src/Nodes/StridedSlice.test.cpp | 2 +- compiler/moco/pass/src/Passes/ConstantFoldPack.cpp | 15 +- .../pass/src/Passes/ConstantFoldStridedSlice.cpp | 7 +- .../pass/src/Passes/FuseBinaryIntoPreceding.cpp | 3 +- .../service/src/Service/TFShapeInferenceRule.cpp | 11 +- .../service/src/Service/TFTypeInferenceRule.cpp | 2 +- compiler/nest/core/src/Block.test.cpp | 6 +- compiler/nest/core/src/Bound.test.cpp | 4 +- compiler/nest/core/src/Closure.test.cpp | 4 +- compiler/nest/core/src/Domain.test.cpp | 4 +- compiler/nest/core/src/DomainContext.test.cpp | 22 +- compiler/nest/core/src/DomainID.test.cpp | 2 +- compiler/nest/core/src/DomainInfo.test.cpp | 10 +- compiler/nest/core/src/Expr.test.cpp | 8 +- compiler/nest/core/src/FV.test.cpp | 8 +- compiler/nest/core/src/Level.test.cpp | 2 +- compiler/nest/core/src/Module.test.cpp | 12 +- compiler/nest/core/src/Ret.test.cpp | 12 +- compiler/nest/core/src/Schedule.test.cpp | 4 +- compiler/nest/core/src/Var.test.cpp | 4 +- compiler/nest/core/src/VarContext.test.cpp | 30 +- compiler/nest/core/src/VarID.test.cpp | 2 +- compiler/nest/core/src/expr/AddNode.test.cpp | 6 +- compiler/nest/core/src/expr/DerefNode.test.cpp | 2 +- compiler/nest/core/src/expr/MulNode.test.cpp | 6 +- compiler/nest/core/src/expr/Subscript.test.cpp | 6 +- compiler/nest/core/src/expr/VarNode.test.cpp | 4 +- compiler/nest/core/src/stmt/PushNode.test.cpp | 2 +- compiler/nnc/CMakeLists.txt | 1 - compiler/nnc/cmake/config.cmake | 3 +- compiler/nnc/driver/Driver.cpp | 14 +- compiler/nnc/requires.cmake | 6 +- compiler/nnc/tests/acl_soft_backend/CMakeLists.txt | 3 +- .../acl_soft_backend/artifact_cmake/CMakeLists.txt | 3 +- compiler/nnc/utils/caffe_model_maker/AllFill.sh | 48 - compiler/nnc/utils/caffe_model_maker/Filler.sh | 28 - .../utils/caffe_model_maker/GenerateCaffeModels.py | 722 - compiler/nnc/utils/caffe_model_maker/Pyloss.py | 83 - compiler/nnc/utils/caffe_model_maker/README.md | 22 - compiler/nnkit-caffe/README.md | 1 + compiler/nnkit-mocotf/README.md | 1 + compiler/nnkit-onnxrt/README.md | 1 + compiler/nnkit-tf/README.md | 1 + compiler/nnkit-tflite/CMakeLists.txt | 2 +- compiler/nnkit-tflite/README.md | 1 + compiler/nnkit-tflite/backend/Backend.cpp | 4 +- compiler/nnkit-tflite/support/CMakeLists.txt | 14 +- .../include/nnkit/support/tflite/AbstractBackend.h | 2 +- .../include/nnkit/support/tflite/TensorSet.h | 2 +- .../include/nnkit/support/tflite/TensorSets.h | 2 +- .../include/nnkit/support/tflite/TensorUtils.h | 2 +- compiler/nnkit/actions/HDF5/CMakeLists.txt | 2 +- compiler/nnop/README.md | 1 + compiler/nnsuite/README.md | 1 + compiler/one-cmds/CMakeLists.txt | 44 + compiler/one-cmds/README.md | 3 + compiler/one-cmds/how-to-prepare-virtualenv.txt | 37 + compiler/one-cmds/how-to-use-one-commands.txt | 114 + compiler/one-cmds/one-codegen | 55 + compiler/one-cmds/one-import | 53 + compiler/one-cmds/one-import-tf | 114 + compiler/one-cmds/one-import-tflite | 67 + compiler/one-cmds/one-optimize | 132 + compiler/one-cmds/one-pack | 67 + compiler/one-cmds/one-prepare-venv | 40 + compiler/one-cmds/one-quantize | 155 + compiler/one-cmds/requires.cmake | 5 + compiler/oneco-value-pbtxt-test/README.md | 1 + compiler/oneco/README.md | 1 + compiler/onnx2circle/requires.cmake | 2 +- compiler/onnx2tflite-integration-test/README.md | 1 + compiler/onnx2tflite/requires.cmake | 2 +- compiler/oops/README.md | 1 + compiler/pepper-assert/README.md | 1 + .../pota-quantization-value-test/CMakeLists.txt | 69 + compiler/pota-quantization-value-test/README.md | 41 + .../compare_tensors.py | 111 + .../layer/uint8/fake_quantization/ker.json | 48 + .../Conv2D_004/layer/uint8/quantization/bias.json | 7 + .../Conv2D_004/layer/uint8/quantization/ifm.json | 4 + .../Conv2D_004/layer/uint8/quantization/ker.json | 52 + .../Conv2D_004/layer/uint8/quantization/ofm.json | 4 + .../Conv2D_004/layer/uint8/record_minmax/ifm.json | 4 + .../Conv2D_004/layer/uint8/record_minmax/ofm.json | 4 + .../layer/uint8/fake_quantization/ker.json | 34 + .../layer/uint8/quantization/bias.json | 9 + .../layer/uint8/quantization/ifm.json | 4 + .../layer/uint8/quantization/ker.json | 38 + .../layer/uint8/quantization/ofm.json | 4 + .../layer/uint8/record_minmax/ifm.json | 4 + .../layer/uint8/record_minmax/ofm.json | 4 + .../gen_h5_explicit_inputs.py | 59 + .../pota-quantization-value-test/requires.cmake | 4 + compiler/pota-quantization-value-test/test.lst | 2 + .../test_fake_wquant.sh | 87 + .../test_inputs/Conv2D_004/layer/uint8/0.txt | 1 + .../DepthwiseConv2D_002/layer/uint8/0.txt | 1 + .../test_quantization.sh | 87 + .../test_record_minmax.sh | 100 + compiler/pp/src/LinearDocument.cpp | 4 +- .../record-minmax-conversion-test/CMakeLists.txt | 42 + compiler/record-minmax-conversion-test/README.md | 5 + .../gen_h5_random_inputs.py | 46 + .../record-minmax-conversion-test/requires.cmake | 2 + compiler/record-minmax-conversion-test/test.lst | 16 + compiler/record-minmax-conversion-test/testall.sh | 81 + compiler/record-minmax/CMakeLists.txt | 27 + compiler/record-minmax/README.md | 18 + compiler/record-minmax/driver/Driver.cpp | 105 + compiler/record-minmax/include/MinMaxObserver.h | 74 + compiler/record-minmax/include/RecordFunction.h | 102 + compiler/record-minmax/include/RecordMinMax.h | 52 + compiler/record-minmax/requires.cmake | 3 + compiler/record-minmax/src/CircleExpContract.cpp | 38 + compiler/record-minmax/src/CircleExpContract.h | 53 + compiler/record-minmax/src/HDF5Importer.cpp | 132 + compiler/record-minmax/src/HDF5Importer.h | 82 + compiler/record-minmax/src/MinMaxObserver.cpp | 69 + compiler/record-minmax/src/RecordMinMax.cpp | 196 + .../record-minmax/tests/RecordFunction.test.cpp | 104 + compiler/safemain/README.md | 1 + compiler/souschef/CMakeLists.txt | 5 + compiler/souschef/README.md | 3 + compiler/souschef/include/souschef/Arguments.h | 39 + compiler/souschef/include/souschef/Data/Constant.h | 67 + compiler/souschef/include/souschef/Data/Explicit.h | 80 + compiler/souschef/include/souschef/Data/Gaussian.h | 93 + compiler/souschef/include/souschef/DataChef.def | 19 + compiler/souschef/include/souschef/DataChef.h | 61 + compiler/souschef/include/souschef/DataChefs.h | 24 + compiler/souschef/include/souschef/Dataset.h | 62 + compiler/souschef/include/souschef/LexicalCast.h | 37 + .../souschef/include/souschef/RangedArguments.h | 53 + compiler/souschef/include/souschef/Registry.h | 43 + compiler/souschef/src/Gaussian.cpp | 140 + compiler/souschef/src/LexicalCast.cpp | 42 + .../CMakeLists.txt | 2 +- .../tf2nnpackage-value-remote-test/CMakeLists.txt | 94 + compiler/tf2nnpackage-value-remote-test/README.md | 60 + .../tf2nnpackage-value-remote-test/requires.cmake | 1 + compiler/tf2nnpackage-value-remote-test/test.lst | 3 + compiler/tf2nnpackage-value-remote-test/testall.sh | 119 + compiler/tf2nnpkg/README.md | 1 + compiler/tf2tflite-dredd-pbtxt-test/README.md | 1 + .../tf2tfliteV2-conversion-test/CMakeLists.txt | 109 + compiler/tf2tfliteV2-conversion-test/README.md | 2 + .../tf2tfliteV2-conversion-test/requires.cmake | 2 + compiler/tf2tfliteV2-conversion-test/test.lst | 124 + compiler/tf2tfliteV2-conversion-test/testall.sh | 81 + .../tf2tfliteV2-value-pbtxt-test/CMakeLists.txt | 183 - .../tf2tfliteV2-value-pbtxt-test/requirements.txt | 2 - .../tf2tfliteV2-value-pbtxt-test/requires.cmake | 4 - compiler/tf2tfliteV2-value-pbtxt-test/test.lst | 101 - compiler/tf2tfliteV2-value-pbtxt-test/testall.sh | 110 - compiler/tf2tfliteV2/CMakeLists.txt | 2 + compiler/tf2tfliteV2/README.md | 28 +- compiler/tf2tfliteV2/tf2tfliteV2.py | 27 +- compiler/tfinfo-v2/README.md | 1 + compiler/tfkit/src/PackCommand.cpp | 21 +- compiler/tfkit/src/UnpackCommand.cpp | 57 +- compiler/tfl-inspect/CMakeLists.txt | 3 +- compiler/tfl-inspect/driver/Driver.cpp | 85 +- compiler/tfl-inspect/requires.cmake | 3 +- compiler/tfl-inspect/src/Dump.cpp | 112 +- compiler/tfl-inspect/src/Dump.h | 9 + compiler/tfl-inspect/src/Model.cpp | 143 - compiler/tfl-inspect/src/Model.h | 43 - compiler/tfl-inspect/src/Reader.cpp | 5 +- compiler/tfl-verify/CMakeLists.txt | 2 +- compiler/tfl-verify/requires.cmake | 2 +- compiler/tfl-verify/src/Driver.cpp | 5 +- compiler/tfl-verify/src/Model.cpp | 90 - compiler/tfl-verify/src/Model.h | 38 - compiler/tfl-verify/src/VerifyFlatBuffers.cpp | 10 +- compiler/tflchef/CMakeLists.txt | 4 + compiler/tflchef/core/CMakeLists.txt | 2 + compiler/tflchef/core/src/Arguments.h | 34 - compiler/tflchef/core/src/Convert.cpp | 17 + compiler/tflchef/core/src/Convert.h | 1 + compiler/tflchef/core/src/CustomOp/AddV2.cpp | 63 + compiler/tflchef/core/src/CustomOp/AddV2.h | 49 + compiler/tflchef/core/src/CustomOp/All.cpp | 61 + compiler/tflchef/core/src/CustomOp/All.h | 49 + .../tflchef/core/src/CustomOp/BatchMatMulV2.cpp | 65 + compiler/tflchef/core/src/CustomOp/BatchMatMulV2.h | 49 + compiler/tflchef/core/src/CustomOp/MatMul.cpp | 63 + compiler/tflchef/core/src/CustomOp/MatMul.h | 49 + .../tflchef/core/src/CustomOp/MatrixBandPart.cpp | 62 + .../tflchef/core/src/CustomOp/MatrixBandPart.h | 49 + compiler/tflchef/core/src/Data/Constant.h | 62 - compiler/tflchef/core/src/Data/Explicit.h | 75 - compiler/tflchef/core/src/Data/Gaussian.cpp | 135 - compiler/tflchef/core/src/Data/Gaussian.h | 88 - compiler/tflchef/core/src/DataChef.def | 15 - compiler/tflchef/core/src/DataChef.h | 56 - compiler/tflchef/core/src/DataChefs.h | 24 - compiler/tflchef/core/src/Dataset.h | 57 - compiler/tflchef/core/src/LexicalCast.cpp | 36 - compiler/tflchef/core/src/LexicalCast.h | 32 - compiler/tflchef/core/src/ModelChef.cpp | 819 +- compiler/tflchef/core/src/Op/AddN.cpp | 32 + compiler/tflchef/core/src/Op/AddN.h | 46 + compiler/tflchef/core/src/Op/ArgMin.cpp | 39 + compiler/tflchef/core/src/Op/ArgMin.h | 46 + compiler/tflchef/core/src/Op/BatchMatMul.cpp | 35 + compiler/tflchef/core/src/Op/BatchMatMul.h | 49 + compiler/tflchef/core/src/Op/Cast.cpp | 42 + compiler/tflchef/core/src/Op/Cast.h | 46 + compiler/tflchef/core/src/Op/Ceil.cpp | 28 + compiler/tflchef/core/src/Op/Ceil.h | 46 + compiler/tflchef/core/src/Op/Conv2D.cpp | 12 +- compiler/tflchef/core/src/Op/DepthToSpace.cpp | 42 + compiler/tflchef/core/src/Op/DepthToSpace.h | 52 + compiler/tflchef/core/src/Op/DepthwiseConv2D.cpp | 2 + compiler/tflchef/core/src/Op/ELU.cpp | 27 + compiler/tflchef/core/src/Op/ELU.h | 46 + compiler/tflchef/core/src/Op/ExpandDims.cpp | 30 + compiler/tflchef/core/src/Op/ExpandDims.h | 49 + compiler/tflchef/core/src/Op/Fill.cpp | 31 + compiler/tflchef/core/src/Op/Fill.h | 46 + compiler/tflchef/core/src/Op/Floor.cpp | 28 + compiler/tflchef/core/src/Op/Floor.h | 46 + compiler/tflchef/core/src/Op/FloorMod.cpp | 28 + compiler/tflchef/core/src/Op/FloorMod.h | 49 + compiler/tflchef/core/src/Op/Gather.cpp | 39 + compiler/tflchef/core/src/Op/Gather.h | 46 + compiler/tflchef/core/src/Op/GatherNd.cpp | 31 + compiler/tflchef/core/src/Op/GatherNd.h | 49 + compiler/tflchef/core/src/Op/Greater.cpp | 29 + compiler/tflchef/core/src/Op/Greater.h | 46 + compiler/tflchef/core/src/Op/GreaterEqual.cpp | 29 + compiler/tflchef/core/src/Op/GreaterEqual.h | 52 + compiler/tflchef/core/src/Op/If.cpp | 35 + compiler/tflchef/core/src/Op/If.h | 46 + compiler/tflchef/core/src/Op/L2Normalize.cpp | 33 + compiler/tflchef/core/src/Op/L2Normalize.h | 49 + compiler/tflchef/core/src/Op/L2Pool2D.cpp | 47 + compiler/tflchef/core/src/Op/L2Pool2D.h | 46 + compiler/tflchef/core/src/Op/LeakyRelu.cpp | 34 + compiler/tflchef/core/src/Op/LeakyRelu.h | 49 + compiler/tflchef/core/src/Op/Less.cpp | 29 + compiler/tflchef/core/src/Op/Less.h | 46 + compiler/tflchef/core/src/Op/LessEqual.cpp | 29 + compiler/tflchef/core/src/Op/LessEqual.h | 49 + .../core/src/Op/LocalResponseNormalization.cpp | 50 + .../core/src/Op/LocalResponseNormalization.h | 53 + compiler/tflchef/core/src/Op/Log.cpp | 28 + compiler/tflchef/core/src/Op/Log.h | 46 + compiler/tflchef/core/src/Op/LogSoftmax.cpp | 32 + compiler/tflchef/core/src/Op/LogSoftmax.h | 49 + compiler/tflchef/core/src/Op/LogicalAnd.cpp | 29 + compiler/tflchef/core/src/Op/LogicalAnd.h | 49 + compiler/tflchef/core/src/Op/Logistic.cpp | 28 + compiler/tflchef/core/src/Op/Logistic.h | 46 + compiler/tflchef/core/src/Op/MatrixDiag.cpp | 28 + compiler/tflchef/core/src/Op/MatrixDiag.h | 49 + compiler/tflchef/core/src/Op/MatrixSetDiag.cpp | 28 + compiler/tflchef/core/src/Op/MatrixSetDiag.h | 52 + compiler/tflchef/core/src/Op/Maximum.cpp | 31 + compiler/tflchef/core/src/Op/Maximum.h | 49 + compiler/tflchef/core/src/Op/Minimum.cpp | 31 + compiler/tflchef/core/src/Op/Minimum.h | 49 + compiler/tflchef/core/src/Op/MirrorPad.cpp | 41 + compiler/tflchef/core/src/Op/MirrorPad.h | 49 + compiler/tflchef/core/src/Op/Neg.cpp | 30 + compiler/tflchef/core/src/Op/Neg.h | 46 + compiler/tflchef/core/src/Op/NotEqual.cpp | 29 + compiler/tflchef/core/src/Op/NotEqual.h | 49 + compiler/tflchef/core/src/Op/OneHot.cpp | 39 + compiler/tflchef/core/src/Op/OneHot.h | 46 + compiler/tflchef/core/src/Op/PRelu.cpp | 31 + compiler/tflchef/core/src/Op/PRelu.h | 47 + compiler/tflchef/core/src/Op/Pow.cpp | 31 + compiler/tflchef/core/src/Op/Pow.h | 46 + compiler/tflchef/core/src/Op/Range.cpp | 31 + compiler/tflchef/core/src/Op/Range.h | 46 + compiler/tflchef/core/src/Op/Rank.cpp | 29 + compiler/tflchef/core/src/Op/Rank.h | 46 + compiler/tflchef/core/src/Op/ReLUN1To1.cpp | 27 + compiler/tflchef/core/src/Op/ReLUN1To1.h | 46 + compiler/tflchef/core/src/Op/ReduceAny.cpp | 39 + compiler/tflchef/core/src/Op/ReduceAny.h | 46 + compiler/tflchef/core/src/Op/ReduceMax.cpp | 39 + compiler/tflchef/core/src/Op/ReduceMax.h | 46 + compiler/tflchef/core/src/Op/ReduceMin.cpp | 39 + compiler/tflchef/core/src/Op/ReduceMin.h | 46 + compiler/tflchef/core/src/Op/ReduceProd.cpp | 39 + compiler/tflchef/core/src/Op/ReduceProd.h | 46 + compiler/tflchef/core/src/Op/Reshape.cpp | 3 +- compiler/tflchef/core/src/Op/ResizeBilinear.cpp | 42 + compiler/tflchef/core/src/Op/ResizeBilinear.h | 52 + .../tflchef/core/src/Op/ResizeNearestNeighbor.cpp | 43 + .../tflchef/core/src/Op/ResizeNearestNeighbor.h | 52 + compiler/tflchef/core/src/Op/ReverseSequence.cpp | 42 + compiler/tflchef/core/src/Op/ReverseSequence.h | 52 + compiler/tflchef/core/src/Op/ReverseV2.cpp | 29 + compiler/tflchef/core/src/Op/ReverseV2.h | 49 + compiler/tflchef/core/src/Op/Round.cpp | 28 + compiler/tflchef/core/src/Op/Round.h | 46 + compiler/tflchef/core/src/Op/ScatterNd.cpp | 32 + compiler/tflchef/core/src/Op/ScatterNd.h | 49 + compiler/tflchef/core/src/Op/SegmentSum.cpp | 29 + compiler/tflchef/core/src/Op/SegmentSum.h | 49 + compiler/tflchef/core/src/Op/Select.cpp | 29 + compiler/tflchef/core/src/Op/Select.h | 46 + compiler/tflchef/core/src/Op/SelectV2.cpp | 29 + compiler/tflchef/core/src/Op/SelectV2.h | 49 + compiler/tflchef/core/src/Op/Sin.cpp | 28 + compiler/tflchef/core/src/Op/Sin.h | 46 + compiler/tflchef/core/src/Op/Slice.cpp | 31 + compiler/tflchef/core/src/Op/Slice.h | 46 + compiler/tflchef/core/src/Op/SpaceToBatchND.cpp | 31 + compiler/tflchef/core/src/Op/SpaceToBatchND.h | 52 + compiler/tflchef/core/src/Op/SpaceToDepth.cpp | 38 + compiler/tflchef/core/src/Op/SpaceToDepth.h | 52 + compiler/tflchef/core/src/Op/SparseToDense.cpp | 39 + compiler/tflchef/core/src/Op/SparseToDense.h | 52 + compiler/tflchef/core/src/Op/Split.cpp | 39 + compiler/tflchef/core/src/Op/Split.h | 46 + compiler/tflchef/core/src/Op/SplitV.cpp | 39 + compiler/tflchef/core/src/Op/SplitV.h | 46 + compiler/tflchef/core/src/Op/Square.cpp | 29 + compiler/tflchef/core/src/Op/Square.h | 46 + compiler/tflchef/core/src/Op/SquaredDifference.cpp | 30 + compiler/tflchef/core/src/Op/SquaredDifference.h | 52 + compiler/tflchef/core/src/Op/Squeeze.cpp | 41 + compiler/tflchef/core/src/Op/Squeeze.h | 46 + compiler/tflchef/core/src/Op/StridedSlice.cpp | 44 + compiler/tflchef/core/src/Op/StridedSlice.h | 52 + compiler/tflchef/core/src/Op/Sum.cpp | 39 + compiler/tflchef/core/src/Op/Sum.h | 46 + compiler/tflchef/core/src/Op/Tile.cpp | 29 + compiler/tflchef/core/src/Op/Tile.h | 46 + compiler/tflchef/core/src/Op/TopKV2.cpp | 29 + compiler/tflchef/core/src/Op/TopKV2.h | 46 + compiler/tflchef/core/src/Op/TransposeConv.cpp | 43 + compiler/tflchef/core/src/Op/TransposeConv.h | 52 + compiler/tflchef/core/src/Op/Unique.cpp | 39 + compiler/tflchef/core/src/Op/Unique.h | 46 + compiler/tflchef/core/src/Op/Unpack.cpp | 35 + compiler/tflchef/core/src/Op/Unpack.h | 46 + compiler/tflchef/core/src/Op/Where.cpp | 28 + compiler/tflchef/core/src/Op/Where.h | 46 + compiler/tflchef/core/src/Op/While.cpp | 35 + compiler/tflchef/core/src/Op/While.h | 46 + compiler/tflchef/core/src/Op/ZerosLike.cpp | 28 + compiler/tflchef/core/src/Op/ZerosLike.h | 49 + compiler/tflchef/core/src/OpChef.def | 81 +- compiler/tflchef/core/src/OpChef.h | 7 + compiler/tflchef/core/src/OpChefs.h | 80 +- compiler/tflchef/log/CMakeLists.txt | 7 + compiler/tflchef/log/include/Log.h | 75 + compiler/tflchef/log/include/LoggingContext.h | 35 + compiler/tflchef/log/src/Log.cpp | 87 + compiler/tflchef/log/src/LoggingContext.cpp | 41 + compiler/tflchef/proto/tflchef.proto | 338 + compiler/tflchef/requires.cmake | 5 + compiler/tflchef/tests/no_shape/test.recipe | 43 + .../tflchef/tests/no_shape/test.reverse | 0 compiler/tflchef/tests/runvalidate.sh | 4 +- compiler/tflchef/tflite/include/tflchef/RawModel.h | 41 - compiler/tflchef/tflite/src/Convert.cpp | 16 +- compiler/tflchef/tflite/src/Convert.h | 2 + compiler/tflchef/tflite/src/FillerHelper.cpp | 50 + compiler/tflchef/tflite/src/FillerHelper.h | 31 + compiler/tflchef/tflite/src/Op/Add.cpp | 9 +- compiler/tflchef/tflite/src/Op/AddN.cpp | 46 + compiler/tflchef/tflite/src/Op/AddN.h | 39 + compiler/tflchef/tflite/src/Op/ArgMin.cpp | 54 + compiler/tflchef/tflite/src/Op/ArgMin.h | 39 + compiler/tflchef/tflite/src/Op/BatchMatMul.cpp | 48 + compiler/tflchef/tflite/src/Op/BatchMatMul.h | 39 + compiler/tflchef/tflite/src/Op/Cast.cpp | 48 + compiler/tflchef/tflite/src/Op/Cast.h | 39 + compiler/tflchef/tflite/src/Op/Ceil.cpp | 39 + compiler/tflchef/tflite/src/Op/Ceil.h | 39 + compiler/tflchef/tflite/src/Op/Conv2D.cpp | 3 +- compiler/tflchef/tflite/src/Op/DepthToSpace.cpp | 47 + compiler/tflchef/tflite/src/Op/DepthToSpace.h | 39 + compiler/tflchef/tflite/src/Op/DepthwiseConv2D.cpp | 5 +- compiler/tflchef/tflite/src/Op/ELU.cpp | 40 + compiler/tflchef/tflite/src/Op/ELU.h | 39 + compiler/tflchef/tflite/src/Op/ExpandDims.cpp | 47 + compiler/tflchef/tflite/src/Op/ExpandDims.h | 39 + compiler/tflchef/tflite/src/Op/Fill.cpp | 47 + compiler/tflchef/tflite/src/Op/Fill.h | 39 + compiler/tflchef/tflite/src/Op/Floor.cpp | 39 + compiler/tflchef/tflite/src/Op/Floor.h | 39 + compiler/tflchef/tflite/src/Op/FloorMod.cpp | 40 + compiler/tflchef/tflite/src/Op/FloorMod.h | 39 + compiler/tflchef/tflite/src/Op/Gather.cpp | 59 + compiler/tflchef/tflite/src/Op/Gather.h | 39 + compiler/tflchef/tflite/src/Op/GatherNd.cpp | 50 + compiler/tflchef/tflite/src/Op/GatherNd.h | 39 + compiler/tflchef/tflite/src/Op/Greater.cpp | 40 + compiler/tflchef/tflite/src/Op/Greater.h | 39 + compiler/tflchef/tflite/src/Op/GreaterEqual.cpp | 40 + compiler/tflchef/tflite/src/Op/GreaterEqual.h | 39 + compiler/tflchef/tflite/src/Op/L2Normalize.cpp | 45 + compiler/tflchef/tflite/src/Op/L2Normalize.h | 39 + compiler/tflchef/tflite/src/Op/L2Pool2D.cpp | 52 + compiler/tflchef/tflite/src/Op/L2Pool2D.h | 39 + compiler/tflchef/tflite/src/Op/LeakyRelu.cpp | 46 + compiler/tflchef/tflite/src/Op/LeakyRelu.h | 39 + compiler/tflchef/tflite/src/Op/Less.cpp | 40 + compiler/tflchef/tflite/src/Op/Less.h | 39 + compiler/tflchef/tflite/src/Op/LessEqual.cpp | 40 + compiler/tflchef/tflite/src/Op/LessEqual.h | 39 + .../tflite/src/Op/LocalResponseNormalization.cpp | 51 + .../tflite/src/Op/LocalResponseNormalization.h | 39 + compiler/tflchef/tflite/src/Op/Log.cpp | 40 + compiler/tflchef/tflite/src/Op/Log.h | 39 + compiler/tflchef/tflite/src/Op/LogSoftmax.cpp | 40 + compiler/tflchef/tflite/src/Op/LogSoftmax.h | 39 + compiler/tflchef/tflite/src/Op/LogicalAnd.cpp | 40 + compiler/tflchef/tflite/src/Op/LogicalAnd.h | 39 + compiler/tflchef/tflite/src/Op/Logistic.cpp | 40 + compiler/tflchef/tflite/src/Op/Logistic.h | 39 + compiler/tflchef/tflite/src/Op/MatrixDiag.cpp | 38 + compiler/tflchef/tflite/src/Op/MatrixDiag.h | 39 + compiler/tflchef/tflite/src/Op/MatrixSetDiag.cpp | 38 + compiler/tflchef/tflite/src/Op/MatrixSetDiag.h | 39 + compiler/tflchef/tflite/src/Op/Maximum.cpp | 38 + compiler/tflchef/tflite/src/Op/Maximum.h | 39 + compiler/tflchef/tflite/src/Op/Minimum.cpp | 40 + compiler/tflchef/tflite/src/Op/Minimum.h | 39 + compiler/tflchef/tflite/src/Op/MirrorPad.cpp | 53 + compiler/tflchef/tflite/src/Op/MirrorPad.h | 39 + compiler/tflchef/tflite/src/Op/Mul.cpp | 53 + compiler/tflchef/tflite/src/Op/Mul.h | 39 + compiler/tflchef/tflite/src/Op/Neg.cpp | 40 + compiler/tflchef/tflite/src/Op/Neg.h | 39 + compiler/tflchef/tflite/src/Op/NotEqual.cpp | 40 + compiler/tflchef/tflite/src/Op/NotEqual.h | 39 + compiler/tflchef/tflite/src/Op/OneHot.cpp | 87 + compiler/tflchef/tflite/src/Op/OneHot.h | 39 + compiler/tflchef/tflite/src/Op/PRelu.cpp | 40 + compiler/tflchef/tflite/src/Op/PRelu.h | 39 + compiler/tflchef/tflite/src/Op/Pow.cpp | 40 + compiler/tflchef/tflite/src/Op/Pow.h | 39 + compiler/tflchef/tflite/src/Op/Range.cpp | 61 + compiler/tflchef/tflite/src/Op/Range.h | 39 + compiler/tflchef/tflite/src/Op/Rank.cpp | 38 + compiler/tflchef/tflite/src/Op/Rank.h | 39 + compiler/tflchef/tflite/src/Op/ReLUN1To1.cpp | 40 + compiler/tflchef/tflite/src/Op/ReLUN1To1.h | 39 + compiler/tflchef/tflite/src/Op/ReduceAny.cpp | 52 + compiler/tflchef/tflite/src/Op/ReduceAny.h | 39 + compiler/tflchef/tflite/src/Op/ReduceMax.cpp | 54 + compiler/tflchef/tflite/src/Op/ReduceMax.h | 39 + compiler/tflchef/tflite/src/Op/ReduceMin.cpp | 54 + compiler/tflchef/tflite/src/Op/ReduceMin.h | 39 + compiler/tflchef/tflite/src/Op/ReduceProd.cpp | 52 + compiler/tflchef/tflite/src/Op/ReduceProd.h | 39 + compiler/tflchef/tflite/src/Op/Reshape.cpp | 25 +- compiler/tflchef/tflite/src/Op/ResizeBilinear.cpp | 59 + compiler/tflchef/tflite/src/Op/ResizeBilinear.h | 39 + .../tflite/src/Op/ResizeNearestNeighbor.cpp | 59 + .../tflchef/tflite/src/Op/ResizeNearestNeighbor.h | 39 + compiler/tflchef/tflite/src/Op/ReverseSequence.cpp | 53 + compiler/tflchef/tflite/src/Op/ReverseSequence.h | 39 + compiler/tflchef/tflite/src/Op/ReverseV2.cpp | 44 + compiler/tflchef/tflite/src/Op/ReverseV2.h | 39 + compiler/tflchef/tflite/src/Op/Round.cpp | 37 + compiler/tflchef/tflite/src/Op/Round.h | 39 + compiler/tflchef/tflite/src/Op/ScatterNd.cpp | 43 + compiler/tflchef/tflite/src/Op/ScatterNd.h | 39 + compiler/tflchef/tflite/src/Op/SegmentSum.cpp | 41 + compiler/tflchef/tflite/src/Op/SegmentSum.h | 39 + compiler/tflchef/tflite/src/Op/Select.cpp | 40 + compiler/tflchef/tflite/src/Op/Select.h | 39 + compiler/tflchef/tflite/src/Op/SelectV2.cpp | 40 + compiler/tflchef/tflite/src/Op/SelectV2.h | 39 + compiler/tflchef/tflite/src/Op/Shape.cpp | 45 + compiler/tflchef/tflite/src/Op/Shape.h | 39 + compiler/tflchef/tflite/src/Op/Sin.cpp | 40 + compiler/tflchef/tflite/src/Op/Sin.h | 39 + compiler/tflchef/tflite/src/Op/Slice.cpp | 50 + compiler/tflchef/tflite/src/Op/Slice.h | 39 + compiler/tflchef/tflite/src/Op/SpaceToBatchND.cpp | 53 + compiler/tflchef/tflite/src/Op/SpaceToBatchND.h | 39 + compiler/tflchef/tflite/src/Op/SpaceToDepth.cpp | 47 + compiler/tflchef/tflite/src/Op/SpaceToDepth.h | 39 + compiler/tflchef/tflite/src/Op/SparseToDense.cpp | 54 + compiler/tflchef/tflite/src/Op/SparseToDense.h | 39 + compiler/tflchef/tflite/src/Op/Split.cpp | 54 + compiler/tflchef/tflite/src/Op/Split.h | 39 + compiler/tflchef/tflite/src/Op/SplitV.cpp | 56 + compiler/tflchef/tflite/src/Op/SplitV.h | 39 + compiler/tflchef/tflite/src/Op/Square.cpp | 40 + compiler/tflchef/tflite/src/Op/Square.h | 39 + .../tflchef/tflite/src/Op/SquaredDifference.cpp | 41 + compiler/tflchef/tflite/src/Op/SquaredDifference.h | 39 + compiler/tflchef/tflite/src/Op/Squeeze.cpp | 52 + compiler/tflchef/tflite/src/Op/Squeeze.h | 39 + compiler/tflchef/tflite/src/Op/StridedSlice.cpp | 60 + compiler/tflchef/tflite/src/Op/StridedSlice.h | 39 + compiler/tflchef/tflite/src/Op/Sub.cpp | 9 +- compiler/tflchef/tflite/src/Op/Sum.cpp | 54 + compiler/tflchef/tflite/src/Op/Sum.h | 39 + compiler/tflchef/tflite/src/Op/Tile.cpp | 48 + compiler/tflchef/tflite/src/Op/Tile.h | 39 + compiler/tflchef/tflite/src/Op/TopKV2.cpp | 50 + compiler/tflchef/tflite/src/Op/TopKV2.h | 39 + compiler/tflchef/tflite/src/Op/Transpose.cpp | 7 +- compiler/tflchef/tflite/src/Op/TransposeConv.cpp | 60 + compiler/tflchef/tflite/src/Op/TransposeConv.h | 39 + compiler/tflchef/tflite/src/Op/Unique.cpp | 47 + compiler/tflchef/tflite/src/Op/Unique.h | 39 + compiler/tflchef/tflite/src/Op/Unpack.cpp | 45 + compiler/tflchef/tflite/src/Op/Unpack.h | 39 + compiler/tflchef/tflite/src/Op/Where.cpp | 36 + compiler/tflchef/tflite/src/Op/Where.h | 39 + compiler/tflchef/tflite/src/Op/ZerosLike.cpp | 42 + compiler/tflchef/tflite/src/Op/ZerosLike.h | 39 + compiler/tflchef/tflite/src/RawModelLoader.cpp | 94 - compiler/tflchef/tflite/src/RecipeChef.cpp | 24 +- compiler/tflchef/tflite/src/TFliteImport.h | 24 +- compiler/tflchef/tflite/src/TFliteOpChefs.h | 72 + compiler/tflchef/tflite/src/TFliteOpRegistry.h | 72 + compiler/tflchef/tools/file/CMakeLists.txt | 1 + compiler/tflchef/tools/file/Driver.cpp | 29 +- compiler/tflchef/tools/reverse/CMakeLists.txt | 2 + compiler/tflchef/tools/reverse/Driver.cpp | 40 +- compiler/tfldump/CMakeLists.txt | 3 +- compiler/tfldump/driver/Driver.cpp | 26 +- compiler/tfldump/requires.cmake | 2 + compiler/tfldump/src/Dump.cpp | 22 +- compiler/tfldump/src/OpPrinter.cpp | 418 +- .../tflite2circle-conversion-test/CMakeLists.txt | 44 +- .../tflite2circle-conversion-test/requires.cmake | 2 +- compiler/tflite2circle-conversion-test/test.lst | 20 - compiler/tflite2circle-conversion-test/testall.sh | 7 +- compiler/tflite2circle/CMakeLists.txt | 4 +- compiler/tflite2circle/driver/Driver.cpp | 37 +- compiler/tflite2circle/include/CircleModel.h | 1 - compiler/tflite2circle/requires.cmake | 2 +- compiler/tflite2circle/src/BuildBuiltinOptions.h | 56 + .../src/BuildBuiltinOptions/AddNOptions.cpp | 32 + .../src/BuildBuiltinOptions/AddNOptions.h | 31 + .../src/BuildBuiltinOptions/ArgMinOptions.cpp | 36 + .../src/BuildBuiltinOptions/ArgMinOptions.h | 31 + .../src/BuildBuiltinOptions/BatchMatMulOptions.cpp | 36 + .../src/BuildBuiltinOptions/BatchMatMulOptions.h | 31 + .../src/BuildBuiltinOptions/CastOptions.cpp | 4 +- .../BuildBuiltinOptions/DepthToSpaceOptions.cpp | 35 + .../src/BuildBuiltinOptions/DepthToSpaceOptions.h | 31 + .../src/BuildBuiltinOptions/FloorDivOptions.cpp | 29 + .../src/BuildBuiltinOptions/FloorDivOptions.h | 31 + .../src/BuildBuiltinOptions/FloorModOptions.cpp | 29 + .../src/BuildBuiltinOptions/FloorModOptions.h | 31 + .../src/BuildBuiltinOptions/GatherNdOptions.cpp | 32 + .../src/BuildBuiltinOptions/GatherNdOptions.h | 31 + .../src/BuildBuiltinOptions/GatherOptions.cpp | 35 + .../src/BuildBuiltinOptions/GatherOptions.h | 31 + .../src/BuildBuiltinOptions/GreaterOptions.cpp | 29 + .../src/BuildBuiltinOptions/GreaterOptions.h | 31 + .../src/BuildBuiltinOptions/IfOptions.cpp | 36 + .../src/BuildBuiltinOptions/IfOptions.h | 31 + .../src/BuildBuiltinOptions/L2NormalizeOptions.cpp | 36 + .../src/BuildBuiltinOptions/L2NormalizeOptions.h | 31 + .../src/BuildBuiltinOptions/LeakyReluOptions.cpp | 32 + .../src/BuildBuiltinOptions/LeakyReluOptions.h | 31 + .../src/BuildBuiltinOptions/LessEqualOptions.cpp | 29 + .../src/BuildBuiltinOptions/LessEqualOptions.h | 31 + .../src/BuildBuiltinOptions/LessOptions.cpp | 29 + .../src/BuildBuiltinOptions/LessOptions.h | 31 + .../LocalResponseNormalizationOptions.cpp | 39 + .../LocalResponseNormalizationOptions.h | 32 + .../src/BuildBuiltinOptions/LogSoftmaxOptions.cpp | 32 + .../src/BuildBuiltinOptions/LogSoftmaxOptions.h | 31 + .../src/BuildBuiltinOptions/LogicalAndOptions.cpp | 32 + .../src/BuildBuiltinOptions/LogicalAndOptions.h | 31 + .../src/BuildBuiltinOptions/MatrixDiagOptions.cpp | 29 + .../src/BuildBuiltinOptions/MatrixDiagOptions.h | 31 + .../BuildBuiltinOptions/MatrixSetDiagOptions.cpp | 29 + .../src/BuildBuiltinOptions/MatrixSetDiagOptions.h | 31 + .../BuildBuiltinOptions/MaximumMinimumOptions.cpp | 34 + .../BuildBuiltinOptions/MaximumMinimumOptions.h | 31 + .../src/BuildBuiltinOptions/MirrorPadOptions.cpp | 35 + .../src/BuildBuiltinOptions/MirrorPadOptions.h | 31 + .../src/BuildBuiltinOptions/NegOptions.cpp | 32 + .../src/BuildBuiltinOptions/NegOptions.h | 31 + .../src/BuildBuiltinOptions/OneHotOptions.cpp | 35 + .../src/BuildBuiltinOptions/OneHotOptions.h | 31 + .../src/BuildBuiltinOptions/PowOptions.cpp | 32 + .../src/BuildBuiltinOptions/PowOptions.h | 31 + .../src/BuildBuiltinOptions/RangeOptions.cpp | 32 + .../src/BuildBuiltinOptions/RangeOptions.h | 31 + .../src/BuildBuiltinOptions/RankOptions.cpp | 29 + .../src/BuildBuiltinOptions/RankOptions.h | 31 + .../src/BuildBuiltinOptions/ReshapeOptions.cpp | 4 +- .../BuildBuiltinOptions/ResizeBilinearOptions.cpp | 36 + .../BuildBuiltinOptions/ResizeBilinearOptions.h | 31 + .../ResizeNearestNeighborOptions.cpp | 36 + .../ResizeNearestNeighborOptions.h | 32 + .../BuildBuiltinOptions/ReverseSequenceOptions.cpp | 33 + .../BuildBuiltinOptions/ReverseSequenceOptions.h | 31 + .../src/BuildBuiltinOptions/ReverseV2Options.cpp | 29 + .../src/BuildBuiltinOptions/ReverseV2Options.h | 31 + .../src/BuildBuiltinOptions/ScatterNdOptions.cpp | 32 + .../src/BuildBuiltinOptions/ScatterNdOptions.h | 31 + .../src/BuildBuiltinOptions/SegmentSumOptions.cpp | 29 + .../src/BuildBuiltinOptions/SegmentSumOptions.h | 31 + .../src/BuildBuiltinOptions/SelectOptions.cpp | 29 + .../src/BuildBuiltinOptions/SelectOptions.h | 31 + .../src/BuildBuiltinOptions/SelectV2Options.cpp | 29 + .../src/BuildBuiltinOptions/SelectV2Options.h | 31 + .../src/BuildBuiltinOptions/SliceOptions.cpp | 29 + .../src/BuildBuiltinOptions/SliceOptions.h | 31 + .../BuildBuiltinOptions/SpaceToBatchNDOptions.cpp | 32 + .../BuildBuiltinOptions/SpaceToBatchNDOptions.h | 31 + .../BuildBuiltinOptions/SpaceToDepthOptions.cpp | 35 + .../src/BuildBuiltinOptions/SpaceToDepthOptions.h | 31 + .../BuildBuiltinOptions/SparseToDenseOptions.cpp | 35 + .../src/BuildBuiltinOptions/SparseToDenseOptions.h | 31 + .../src/BuildBuiltinOptions/SplitVOptions.cpp | 34 + .../src/BuildBuiltinOptions/SplitVOptions.h | 31 + .../src/BuildBuiltinOptions/SquareOptions.cpp | 29 + .../src/BuildBuiltinOptions/SquareOptions.h | 31 + .../SquaredDifferenceOptions.cpp | 30 + .../BuildBuiltinOptions/SquaredDifferenceOptions.h | 32 + .../BuildBuiltinOptions/StridedSliceOptions.cpp | 39 + .../src/BuildBuiltinOptions/StridedSliceOptions.h | 31 + .../src/BuildBuiltinOptions/TileOptions.cpp | 31 + .../src/BuildBuiltinOptions/TileOptions.h | 31 + .../src/BuildBuiltinOptions/TopKV2Options.cpp | 31 + .../src/BuildBuiltinOptions/TopKV2Options.h | 31 + .../BuildBuiltinOptions/TransposeConvOptions.cpp | 37 + .../src/BuildBuiltinOptions/TransposeConvOptions.h | 31 + .../src/BuildBuiltinOptions/UniqueOptions.cpp | 36 + .../src/BuildBuiltinOptions/UniqueOptions.h | 31 + .../src/BuildBuiltinOptions/UnpackOptions.cpp | 36 + .../src/BuildBuiltinOptions/UnpackOptions.h | 31 + .../src/BuildBuiltinOptions/WhereOptions.cpp | 29 + .../src/BuildBuiltinOptions/WhereOptions.h | 31 + .../src/BuildBuiltinOptions/WhileOptions.cpp | 36 + .../src/BuildBuiltinOptions/WhileOptions.h | 31 + .../src/BuildBuiltinOptions/ZerosLikeOptions.cpp | 32 + .../src/BuildBuiltinOptions/ZerosLikeOptions.h | 31 + compiler/tflite2circle/src/CircleModel.cpp | 38 +- compiler/tflite2circle/src/DataLookup.cpp | 13 + compiler/tflite2circle/src/DataLookup.h | 44 + compiler/tflite2circle/src/TFLBuiltinOptions.lst | 96 +- compiler/tflite2circle/src/TFLOperator.lst | 5 + compute/ARMComputeEx/CMakeLists.txt | 2 +- .../core/CL/kernels/CLSpaceToBatchNDKernel.h | 93 - .../core/CPP/kernels/CPPOneHotKernelEx.h | 26 +- .../arm_compute/runtime/CL/CLFunctionsEx.h | 1 - .../runtime/CL/functions/CLSpaceToBatchND.h | 80 - .../runtime/CPP/functions/CPPOneHotEx.h | 10 +- .../runtime/misc/functions/GenericGather.h | 84 - .../runtime/misc/functions/GenericReshapeLayer.h | 87 - .../arm_compute/runtime/misc/functions/Utils.h | 112 - .../ARMComputeEx/src/core/CL/CLKernelLibrary.cpp | 6 - .../src/core/CL/cl_kernels/space_to_batch.cl | 274 - .../src/core/CL/kernels/CLSpaceToBatchNDKernel.cpp | 265 - .../src/core/CPP/kernels/CPPOneHotKernelEx.cpp | 40 +- .../src/runtime/CL/functions/CLSpaceToBatchND.cpp | 53 - .../src/runtime/CPP/functions/CPPOneHotEx.cpp | 6 +- .../src/runtime/misc/functions/GenericGather.cpp | 92 - .../runtime/misc/functions/GenericReshapeLayer.cpp | 128 - .../src/runtime/misc/functions/Utils.cpp | 38 - compute/cker/CMakeLists.txt | 12 + compute/cker/include/cker/NeonTensorUtils.h | 664 +- compute/cker/include/cker/PortableTensorUtils.h | 11 + compute/cker/include/cker/Shape.h | 60 +- compute/cker/include/cker/TensorUtils.h | 9 + compute/cker/include/cker/Types.h | 192 +- compute/cker/include/cker/Utils.h | 152 +- .../include/cker/eigen/eigen_convolution_helpers.h | 2 +- .../cker/eigen/eigen_spatial_convolutions-inl.h | 77 +- .../eigen_tensor_reduced_instantiations_oss.h | 6 - compute/cker/include/cker/operation/ArgMinMax.h | 78 + compute/cker/include/cker/operation/BatchMatMul.h | 146 + .../include/cker/operation/BinaryArithmeticOps.h | 304 +- compute/cker/include/cker/operation/BroadcastTo.h | 182 + compute/cker/include/cker/operation/Comparison.h | 154 +- compute/cker/include/cker/operation/Conv.h | 78 +- compute/cker/include/cker/operation/Einsum.h | 934 ++ compute/cker/include/cker/operation/Elementwise.h | 30 + compute/cker/include/cker/operation/Fill.h | 54 + .../cker/include/cker/operation/FullyConnected.h | 27 +- .../cker/include/cker/operation/FusedBatchNorm.h | 162 + compute/cker/include/cker/operation/Helper/BCast.h | 471 + .../include/cker/operation/Helper/MatmulBCast.h | 95 + .../cker/include/cker/operation/Helper/Tensor.h | 183 + compute/cker/include/cker/operation/LogSoftMax.h | 83 + compute/cker/include/cker/operation/LogicalNot.h | 41 + compute/cker/include/cker/operation/LogicalOr.h | 80 + compute/cker/include/cker/operation/Logistic.h | 8 + .../cker/include/cker/operation/MatrixBandPart.h | 77 + compute/cker/include/cker/operation/OneHot.h | 3 + compute/cker/include/cker/operation/Pow.h | 44 + compute/cker/include/cker/operation/Range.h | 63 + compute/cker/include/cker/operation/ReLU.h | 43 + compute/cker/include/cker/operation/Reduce.h | 25 +- compute/cker/include/cker/operation/ReduceMean.h | 237 + compute/cker/include/cker/operation/Reverse.h | 62 + compute/cker/include/cker/operation/Round.h | 61 + compute/cker/include/cker/operation/Select.h | 114 + .../cker/include/cker/operation/SpaceToBatchND.h | 95 + compute/cker/include/cker/operation/SqDiff.h | 97 + compute/cker/include/cker/operation/Tile.h | 73 + .../cker/operation/optimized/BinaryArithmeticOps.h | 391 +- .../include/cker/operation/reference/BatchMatMul.h | 115 + .../cker/operation/reference/BinaryArithmeticOps.h | 120 + compute/cker/include/cker/ruy/RuySupport.h | 117 + compute/test/CMakeLists.txt | 13 + compute/test/cker/Range.cc | 72 + docs/Makefile | 20 + docs/common-ir/index.rst | 14 + docs/common-ir/introduction-to-circle.md | 1 + docs/common-ir/what-is-common-ir.md | 1 + docs/compiler/backend.rst | 12 + docs/compiler/compiler | 1 + docs/compiler/frontend.rst | 22 + docs/compiler/index.rst | 20 + docs/compiler/interpreters.rst | 14 + docs/compiler/ir.rst | 36 + docs/compiler/libraries.rst | 60 + docs/compiler/middleend.rst | 21 + docs/compiler/tools.rst | 66 + docs/conf.py | 51 + docs/contents.rst | 29 + docs/device/index.rst | 15 + docs/device/odroid-xu3.md | 1 + docs/device/odroid-xu4.md | 1 + docs/device/raspberry-pi-3.md | 1 + docs/howto/how-to-add-a-new-operation.md | 9 + docs/howto/how-to-build-compiler.md | 7 + docs/howto/how-to-build-package.md | 1 + ...to-build-runtime-using-prebuilt-docker-image.md | 2 + docs/howto/how-to-build-runtime.md | 228 + docs/howto/how-to-contribute.md | 72 + .../how-to-cross-build-runtime-for-aarch64.md | 100 + .../how-to-cross-build-runtime-for-android.md | 2 + docs/howto/how-to-cross-build-runtime-for-arm.md | 164 + ...w-to-introduce-a-new-operation-into-compiler.md | 2 + ...ow-to-introduce-a-new-operation-into-runtime.md | 440 + .../how-to-make-an-application-with-runtime.md | 1 + ...-to-remote-debugging-with-visual-studio-code.md | 150 + docs/howto/how-to-run-package.md | 1 + docs/howto/how-to-use-api.md | 1 + docs/howto/how-to-use-nnapi-binding.md | 5 + docs/howto/how-to-use-nnfw-api.md | 66 + docs/howto/index.rst | 27 + docs/images/logo_original_samsungblue_cropped.png | Bin 0 -> 103942 bytes docs/index.rst | 29 + docs/make.bat | 35 + docs/nncc/v1.0.0/tutorial.md | 49 + docs/nnfw/howto/CrossBuildForAndroid.md | 54 + docs/overview/background.md | 28 + docs/overview/index.rst | 18 + docs/overview/overall-architecture.md | 7 + docs/overview/roadmap.md | 58 + docs/overview/supported-operations.md | 145 + docs/overview/workgroup.md | 13 + docs/package/design-of-package.md | 7 + docs/package/index.rst | 14 + docs/package/introduction-to-package.md | 1 + docs/platform/android.md | 1 + docs/platform/index.rst | 15 + docs/platform/tizen.md | 1 + docs/platform/ubuntu.md | 1 + docs/release/1.0/index.rst | 13 + docs/release/1.0/release-note-1.0.0.md | 1 + docs/release/1.1/index.rst | 13 + docs/release/1.1/release-note-1.1.0.md | 1 + docs/release/1.2/index.rst | 13 + docs/release/1.2/release-note-1.2.0.md | 1 + docs/release/1.3/index.rst | 13 + docs/release/1.3/release-note-1.3.0.md | 1 + docs/release/1.4/index.rst | 13 + docs/release/1.4/release-note-1.4.0.md | 1 + docs/release/1.5/release-note-1.5.0.md | 36 + docs/release/1.6/release-note-1.6.0.md | 44 + docs/release/1.7/release-note-1.7.0.md | 46 + docs/release/index.rst | 17 + docs/release/release_note_1.4.0.md | 23 - docs/requirements.txt | 3 + docs/runtime/api.md | 1 + docs/runtime/backend-api.md | 1 + docs/runtime/compute.md | 1 + docs/runtime/core-figure-ir.png | Bin 0 -> 147769 bytes docs/runtime/core.md | 86 + docs/runtime/executors.md | 34 + .../heterogeneous-execution-add-3-conv-model.png | Bin 0 -> 32413 bytes ...rogeneous-execution-add-conv-model-lowering.png | Bin 0 -> 52843 bytes .../heterogeneous-execution-add-conv-model.png | Bin 0 -> 19210 bytes docs/runtime/heterogeneous-execution.md | 35 + docs/runtime/index.rst | 18 + docs/test/benchmarks.md | 1 + docs/test/index.rst | 14 + docs/test/scripts.md | 1 + infra/cmake/modules/ExternalSourceTools.cmake | 30 - infra/cmake/packages/ARMCompute/SConstruct | 309 - infra/cmake/packages/ARMComputeConfig.cmake | 192 - infra/cmake/packages/ARMComputeSourceConfig.cmake | 7 +- infra/cmake/packages/AbseilConfig.cmake | 6 +- infra/cmake/packages/AbseilSourceConfig.cmake | 10 +- infra/cmake/packages/BoostSourceConfig.cmake | 7 +- infra/cmake/packages/CaffeConfig.cmake | 2 +- infra/cmake/packages/CpuinfoSourceConfig.cmake | 14 - .../cmake/packages/Eigen-fd6845384b86Config.cmake | 25 + .../packages/EigenSource-fd6845384b86Config.cmake | 1 + infra/cmake/packages/EigenSourceConfig.cmake | 11 +- infra/cmake/packages/Enum34SourceConfig.cmake | 14 - infra/cmake/packages/FP16SourceConfig.cmake | 14 - infra/cmake/packages/FXdivSourceConfig.cmake | 14 - infra/cmake/packages/FarmhashSourceConfig.cmake | 8 +- .../FlatBuffersSourceConfig.cmake | 7 +- .../FlatBuffersSourceConfig.cmake | 21 + .../FlatBuffersSourceConfigVersion.cmake | 10 + .../FlatBuffersSourceConfig.cmake | 18 - .../FlatBuffersSourceConfigVersion.cmake | 10 - infra/cmake/packages/FlatBuffersSourceConfig.cmake | 7 +- infra/cmake/packages/GEMMLowpSourceConfig.cmake | 5 +- infra/cmake/packages/HDF5Config.cmake | 70 + infra/cmake/packages/HDF5SourceConfig.cmake | 18 + infra/cmake/packages/NEON2SSESourceConfig.cmake | 8 +- infra/cmake/packages/NNPACKConfig.cmake | 51 - infra/cmake/packages/NNPACKSourceConfig.cmake | 20 - infra/cmake/packages/NoniusConfig.cmake | 26 - infra/cmake/packages/NoniusSourceConfig.cmake | 15 +- infra/cmake/packages/OpcodesSourceConfig.cmake | 13 - infra/cmake/packages/PSIMDSourceConfig.cmake | 14 - infra/cmake/packages/PeachpySourceConfig.cmake | 31 - infra/cmake/packages/PthreadpoolSourceConfig.cmake | 14 - infra/cmake/packages/SixSourceConfig.cmake | 14 - .../TensorFlowEigenSourceConfig.cmake | 20 + .../TensorFlowEigenSourceConfigVersion.cmake | 10 + .../TensorFlowEigenSource-2.3.0-rc0Config.cmake | 23 + .../TensorFlowGEMMLowpSourceConfig.cmake | 20 + .../TensorFlowGEMMLowpSourceConfigVersion.cmake | 10 + .../TensorFlowLite-1.12/Lite/CMakeLists.txt | 2 +- .../TensorFlowLite-1.12/TensorFlowLiteConfig.cmake | 6 +- .../TensorFlowLite-1.13.1/Lite/CMakeLists.txt | 46 + .../TensorFlowLiteConfig.cmake | 59 + .../TensorFlowLiteConfigVersion.cmake | 9 + .../TensorFlowLite-1.7/Lite/CMakeLists.txt | 38 - .../TensorFlowLite-1.7/TensorFlowLiteConfig.cmake | 55 - .../TensorFlowLiteConfigVersion.cmake | 9 - .../TensorFlowProtoTextConfig.cmake | 2 +- .../TensorFlowProtoText-1.12/build/CMakeLists.txt | 2 +- .../TensorFlowProtoTextConfig.cmake | 104 + .../TensorFlowProtoTextConfigVersion.cmake | 9 + .../build/CMakeLists.txt | 78 + .../TensorFlowProtoText-1.13.1/make_directories.sh | 6 + .../TensorFlowSourceConfig.cmake | 3 +- .../TensorFlowSourceConfig.cmake | 18 - .../TensorFlowSourceConfigVersion.cmake | 10 - .../TensorFlowSourceConfig.cmake | 18 + .../TensorFlowSourceConfigVersion.cmake | 10 + .../TensorFlowSource-2.3.0-rc0Config.cmake | 21 + infra/command/format | 27 +- infra/nncc/CMakeLists.txt | 2 + infra/nncc/command/utcount | 10 +- infra/nnfw/CMakeLists.txt | 10 +- infra/nnfw/cmake/ApplyCompileFlags.cmake | 14 +- infra/nnfw/cmake/CfgOptionFlags.cmake | 12 +- .../buildtool/config/config_aarch64-tizen.cmake | 4 + .../buildtool/config/config_armv7l-linux.cmake | 1 - .../buildtool/config/config_armv7l-tizen.cmake | 4 + .../buildtool/config/config_x86_64-darwin.cmake | 12 + .../cross/toolchain_aarch64-android.cmake | 12 + .../cmake/options/options_aarch64-android.cmake | 3 + .../nnfw/cmake/options/options_aarch64-linux.cmake | 1 - .../nnfw/cmake/options/options_aarch64-tizen.cmake | 4 - .../nnfw/cmake/options/options_armv7l-linux.cmake | 1 - .../nnfw/cmake/options/options_armv7l-tizen.cmake | 2 - .../nnfw/cmake/options/options_x86_64-darwin.cmake | 5 + infra/nnfw/cmake/packages/ARMComputeConfig.cmake | 181 + infra/nnfw/cmake/packages/AbslSourceConfig.cmake | 14 - infra/nnfw/cmake/packages/BoostConfig.cmake | 77 + infra/nnfw/cmake/packages/EigenConfig.cmake | 8 +- infra/nnfw/cmake/packages/EigenSourceConfig.cmake | 14 - .../nnfw/cmake/packages/FarmhashSourceConfig.cmake | 7 +- infra/nnfw/cmake/packages/FlatBuffersConfig.cmake | 68 +- .../cmake/packages/FlatBuffersSourceConfig.cmake | 14 - .../nnfw/cmake/packages/GEMMLowpSourceConfig.cmake | 7 +- infra/nnfw/cmake/packages/GTestConfig.cmake | 2 +- infra/nnfw/cmake/packages/HDF5Config.cmake | 52 +- .../nnfw/cmake/packages/NEON2SSESourceConfig.cmake | 7 +- infra/nnfw/cmake/packages/NoniusConfig.cmake | 18 + infra/nnfw/cmake/packages/Ruy/CMakeLists.txt | 45 + infra/nnfw/cmake/packages/RuyConfig.cmake | 22 + infra/nnfw/cmake/packages/RuySourceConfig.cmake | 19 + .../TensorFlowEigenConfig.cmake | 19 + .../TensorFlowEigenConfigVersion.cmake | 9 + .../TensorFlowLite/CMakeLists.txt | 62 + .../TensorFlowLiteConfig.cmake | 73 + .../TensorFlowLiteConfigVersion.cmake | 9 + .../packages/TensorFlowLite-2.2.0/CMakeLists.txt | 110 + .../packages/TensorFlowLite-2.2.0Config.cmake | 92 + .../cmake/packages/TensorFlowLite/CMakeLists.txt | 63 - .../nnfw/cmake/packages/TensorFlowLiteConfig.cmake | 69 - .../cmake/packages/TensorFlowSourceConfig.cmake | 18 - infra/nnfw/command/build | 15 +- infra/nnfw/command/count-unittest | 74 + infra/packaging/build | 2 +- infra/packaging/preset/20200508 | 54 + infra/packaging/preset/20200616_windows | 60 + infra/packaging/preset/20200630 | 57 + infra/packaging/res/tf2nnpkg.20200508 | 97 + infra/packaging/res/tf2nnpkg.20200616 | 89 + infra/packaging/res/tf2nnpkg.20200630 | 100 + infra/scripts/common.sh | 33 +- infra/scripts/compiler_modules.sh | 23 + infra/scripts/configure_compiler_coverage.sh | 22 + .../docker_build_cross_arm_benchmark_model.sh | 51 - infra/scripts/docker_build_test_x64.sh | 2 +- infra/scripts/docker_collect_nnpkg_resources.sh | 44 +- infra/scripts/docker_coverage_report.sh | 2 +- infra/scripts/test_arm_nnpkg.sh | 4 +- infra/scripts/test_coverage.sh | 2 +- infra/scripts/test_ubuntu_runtime.sh | 56 +- infra/scripts/test_ubuntu_runtime_interp.sh | 12 - infra/scripts/test_ubuntu_runtime_mixed.sh | 32 + infra/scripts/tizen_xu4_test.sh | 85 +- infra/scripts/unittest_compiler_xml.sh | 29 + logo/ONE_logo_guideline_ENG.pdf | 14557 +++++++++++++++++++ logo/ONE_logo_guideline_KOR.pdf | 12391 ++++++++++++++++ logo/images/logo_abbreviation_black.png | Bin 0 -> 71289 bytes logo/images/logo_abbreviation_black.svg | 1 + logo/images/logo_abbreviation_samsungblue.png | Bin 0 -> 71888 bytes logo/images/logo_abbreviation_samsungblue.svg | 1 + logo/images/logo_abbreviation_white.png | Bin 0 -> 66732 bytes logo/images/logo_abbreviation_white.svg | 1 + logo/images/logo_original_black.png | Bin 0 -> 72968 bytes logo/images/logo_original_black.svg | 1 + logo/images/logo_original_samsungblue.png | Bin 0 -> 73671 bytes logo/images/logo_original_samsungblue.svg | 1 + logo/images/logo_original_white.png | Bin 0 -> 68194 bytes logo/images/logo_original_white.svg | 1 + nnpackage/schema/circle_schema.fbs | 15 + packaging/eigen.tar.gz | Bin 2502909 -> 2664733 bytes packaging/flatbuffers.tar.gz | Bin 756075 -> 0 bytes packaging/nnapi_test_generated.tar.gz | Bin 482609 -> 802276 bytes packaging/nnfw-plugin.pc.in | 5 + packaging/nnfw.pc.in | 2 +- packaging/nnfw.spec | 56 +- packaging/ruy.tar.gz | Bin 0 -> 220553 bytes .../BCQFullyConnected_000/test.recipe | 65 + .../BCQFullyConnected_000/test.reverse | 0 .../BCQFullyConnected_001/test.recipe | 55 + .../BCQFullyConnected_001/test.reverse | 0 res/CircleRecipes/BCQGather_000/test.recipe | 58 + res/CircleRecipes/BCQGather_000/test.reverse | 0 .../CircleBatchMatMul_000/test.recipe | 28 + .../CircleBatchMatMul_000/test.reverse | 0 res/CircleRecipes/CircleBatchMatMul_000/test.rule | 5 + res/CircleRecipes/InstanceNorm_000/test.recipe | 43 + res/CircleRecipes/InstanceNorm_000/test.reverse | 0 res/TensorFlowLiteRecipes/AddN_000/test.recipe | 33 + res/TensorFlowLiteRecipes/AddN_000/test.reverse | 0 res/TensorFlowLiteRecipes/Add_001/test.recipe | 30 + res/TensorFlowLiteRecipes/Add_001/test.reverse | 0 res/TensorFlowLiteRecipes/All_000/test.recipe | 30 + res/TensorFlowLiteRecipes/ArgMin_000/test.recipe | 30 + res/TensorFlowLiteRecipes/ArgMin_000/test.reverse | 0 res/TensorFlowLiteRecipes/ArgMin_001/test.recipe | 30 + res/TensorFlowLiteRecipes/ArgMin_001/test.reverse | 0 res/TensorFlowLiteRecipes/ArgMin_002/test.recipe | 30 + res/TensorFlowLiteRecipes/ArgMin_002/test.reverse | 0 res/TensorFlowLiteRecipes/ArgMin_003/test.recipe | 30 + res/TensorFlowLiteRecipes/ArgMin_003/test.reverse | 0 .../ArgMin_U8_000/test.recipe | 31 + .../ArgMin_U8_000/test.reverse | 0 .../ArgMin_U8_001/test.recipe | 31 + .../ArgMin_U8_001/test.reverse | 0 .../ArgMin_U8_002/test.recipe | 31 + .../ArgMin_U8_002/test.reverse | 0 .../ArgMin_U8_003/test.recipe | 31 + .../ArgMin_U8_003/test.reverse | 0 .../BatchMatMulV2_000/test.recipe | 24 + .../BatchMatMulV2_000/test.rule | 6 + .../BatchMatMulV2_001/test.recipe | 27 + .../BatchMatMul_000/test.recipe | 28 + .../BatchMatMul_000/test.reverse | 0 res/TensorFlowLiteRecipes/Cast_000/test.recipe | 21 + res/TensorFlowLiteRecipes/Cast_000/test.reverse | 0 res/TensorFlowLiteRecipes/Cast_001/test.recipe | 18 + res/TensorFlowLiteRecipes/Ceil_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Ceil_000/test.reverse | 0 res/TensorFlowLiteRecipes/Conv2D_001/test.recipe | 1 - res/TensorFlowLiteRecipes/Conv2D_003/test.recipe | 47 + res/TensorFlowLiteRecipes/Conv2D_004/test.recipe | 49 + res/TensorFlowLiteRecipes/Conv2D_004/test.reverse | 0 .../Conv2D_U8_001/test.recipe | 40 + .../DepthToSpace_000/test.recipe | 20 + .../DepthToSpace_000/test.reverse | 0 .../DepthwiseConv2D_001/test.recipe | 43 + .../DepthwiseConv2D_001/test.reverse | 0 .../DepthwiseConv2D_002/test.recipe | 49 + .../DepthwiseConv2D_002/test.reverse | 0 res/TensorFlowLiteRecipes/ELU_000/test.recipe | 17 + res/TensorFlowLiteRecipes/ELU_000/test.reverse | 0 .../ExpandDims_000/test.recipe | 30 + .../ExpandDims_000/test.reverse | 0 .../ExpandDims_001/test.recipe | 30 + .../ExpandDims_002/test.recipe | 30 + .../ExpandDims_003/test.recipe | 30 + res/TensorFlowLiteRecipes/Fill_000/test.recipe | 29 + res/TensorFlowLiteRecipes/Fill_000/test.reverse | 0 res/TensorFlowLiteRecipes/Fill_001/test.recipe | 29 + res/TensorFlowLiteRecipes/FloorDiv_000/test.recipe | 26 + .../FloorDiv_000/test.reverse | 0 res/TensorFlowLiteRecipes/FloorDiv_001/test.recipe | 26 + .../FloorDiv_001/test.reverse | 0 res/TensorFlowLiteRecipes/FloorMod_000/test.recipe | 24 + .../FloorMod_000/test.reverse | 0 res/TensorFlowLiteRecipes/FloorMod_001/test.recipe | 24 + .../FloorMod_001/test.reverse | 0 res/TensorFlowLiteRecipes/Floor_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Floor_000/test.reverse | 0 .../FullyConnected_002/test.recipe | 28 + .../FullyConnected_002/test.reverse | 0 res/TensorFlowLiteRecipes/GatherNd_000/test.recipe | 26 + .../GatherNd_000/test.reverse | 0 res/TensorFlowLiteRecipes/GatherNd_001/test.recipe | 31 + .../GatherNd_001/test.reverse | 0 res/TensorFlowLiteRecipes/Gather_000/test.recipe | 28 + res/TensorFlowLiteRecipes/Gather_000/test.reverse | 0 .../GreaterEqual_000/test.recipe | 26 + .../GreaterEqual_000/test.reverse | 0 res/TensorFlowLiteRecipes/Greater_000/test.recipe | 26 + res/TensorFlowLiteRecipes/Greater_000/test.reverse | 0 res/TensorFlowLiteRecipes/If_000/test.recipe | 100 + res/TensorFlowLiteRecipes/If_001/test.recipe | 119 + .../L2Normalize_000/test.recipe | 20 + .../L2Normalize_000/test.reverse | 0 res/TensorFlowLiteRecipes/L2Pool2D_000/test.recipe | 24 + .../L2Pool2D_000/test.reverse | 0 .../L2Pool2D_U8_000/test.recipe | 26 + .../LeakyRelu_000/test.recipe | 20 + .../LeakyRelu_000/test.reverse | 0 .../LessEqual_000/test.recipe | 26 + .../LessEqual_000/test.reverse | 0 res/TensorFlowLiteRecipes/Less_000/test.recipe | 26 + res/TensorFlowLiteRecipes/Less_000/test.reverse | 0 .../LocalResponseNormalization_000/test.recipe | 23 + .../LocalResponseNormalization_000/test.reverse | 0 .../LogSoftmax_000/test.recipe | 19 + .../LogSoftmax_000/test.reverse | 0 res/TensorFlowLiteRecipes/Log_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Log_000/test.reverse | 0 .../LogicalAnd_000/test.recipe | 24 + .../LogicalAnd_000/test.reverse | 0 res/TensorFlowLiteRecipes/Logistic_000/test.recipe | 17 + .../Logistic_000/test.reverse | 0 res/TensorFlowLiteRecipes/MatMul_000/test.recipe | 28 + res/TensorFlowLiteRecipes/MatMul_000/test.rule | 9 + .../MatrixBandPart_000/test.recipe | 37 + .../MatrixDiag_000/test.recipe | 19 + .../MatrixDiag_000/test.reverse | 0 .../MatrixSetDiag_000/test.recipe | 26 + .../MatrixSetDiag_000/test.reverse | 0 res/TensorFlowLiteRecipes/Maximum_000/test.recipe | 26 + res/TensorFlowLiteRecipes/Maximum_000/test.reverse | 0 res/TensorFlowLiteRecipes/Mean_001/test.recipe | 27 + res/TensorFlowLiteRecipes/Mean_001/test.reverse | 0 res/TensorFlowLiteRecipes/Mean_U8_000/test.recipe | 29 + res/TensorFlowLiteRecipes/Mean_U8_000/test.reverse | 0 res/TensorFlowLiteRecipes/Minimum_000/test.recipe | 26 + res/TensorFlowLiteRecipes/Minimum_000/test.reverse | 0 .../MirrorPad_000/test.recipe | 33 + .../MirrorPad_000/test.reverse | 0 res/TensorFlowLiteRecipes/Neg_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Neg_000/test.reverse | 0 .../Net_Dangle_001/test.recipe | 42 + .../Net_InstanceNorm_001/test.recipe | 282 + .../Net_InstanceNorm_001/test.rule | 7 + .../Net_InstanceNorm_002/test.recipe | 340 + .../Net_InstanceNorm_002/test.rule | 8 + .../Net_UnpackAdd_001/test.recipe | 41 + .../Net_UnpackAdd_001/test.reverse | 0 .../Net_ZeroDim_001/test.recipe | 88 + res/TensorFlowLiteRecipes/NotEqual_000/test.recipe | 26 + .../NotEqual_000/test.reverse | 0 res/TensorFlowLiteRecipes/OneHot_000/test.recipe | 41 + res/TensorFlowLiteRecipes/OneHot_000/test.reverse | 0 res/TensorFlowLiteRecipes/OneHot_001/test.recipe | 41 + res/TensorFlowLiteRecipes/OneHot_001/test.reverse | 0 res/TensorFlowLiteRecipes/OneHot_002/test.recipe | 41 + res/TensorFlowLiteRecipes/OneHot_002/test.reverse | 0 res/TensorFlowLiteRecipes/OneHot_003/test.recipe | 43 + res/TensorFlowLiteRecipes/OneHot_003/test.reverse | 0 res/TensorFlowLiteRecipes/PRelu_000/test.recipe | 24 + res/TensorFlowLiteRecipes/PRelu_000/test.reverse | 0 res/TensorFlowLiteRecipes/Pow_000/test.recipe | 26 + res/TensorFlowLiteRecipes/Pow_000/test.reverse | 0 res/TensorFlowLiteRecipes/Range_000/test.recipe | 47 + res/TensorFlowLiteRecipes/Range_000/test.reverse | 0 res/TensorFlowLiteRecipes/Rank_000/test.recipe | 21 + res/TensorFlowLiteRecipes/Rank_000/test.reverse | 0 .../ReLUN1To1_000/test.recipe | 17 + .../ReLUN1To1_000/test.reverse | 0 .../ReduceAny_000/test.recipe | 30 + .../ReduceAny_000/test.reverse | 0 .../ReduceAny_001/test.recipe | 30 + .../ReduceAny_001/test.reverse | 0 .../ReduceAny_002/test.recipe | 30 + .../ReduceAny_002/test.reverse | 0 .../ReduceAny_003/test.recipe | 30 + .../ReduceAny_003/test.reverse | 0 .../ReduceMax_000/test.recipe | 27 + .../ReduceMax_000/test.reverse | 0 .../ReduceMin_000/test.recipe | 27 + .../ReduceMin_000/test.reverse | 0 .../ReduceProd_000/test.recipe | 30 + .../ReduceProd_000/test.reverse | 0 .../ReduceProd_001/test.recipe | 30 + .../ReduceProd_001/test.reverse | 0 .../ReduceProd_002/test.recipe | 30 + .../ReduceProd_002/test.reverse | 0 .../ReduceProd_003/test.recipe | 30 + .../ReduceProd_003/test.reverse | 0 res/TensorFlowLiteRecipes/Reshape_002/test.recipe | 28 + res/TensorFlowLiteRecipes/Reshape_002/test.reverse | 0 res/TensorFlowLiteRecipes/Reshape_003/test.recipe | 18 + .../ResizeBilinear_000/test.recipe | 30 + .../ResizeBilinear_000/test.reverse | 0 .../ResizeNearestNeighbor_000/test.recipe | 27 + .../ResizeNearestNeighbor_000/test.reverse | 0 .../ReverseSequence_000/test.recipe | 32 + .../ReverseSequence_000/test.reverse | 0 .../ReverseV2_000/test.recipe | 30 + .../ReverseV2_000/test.reverse | 0 res/TensorFlowLiteRecipes/Round_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Round_000/test.reverse | 0 .../ScatterNd_000/test.recipe | 40 + .../ScatterNd_000/test.reverse | 1 + .../SegmentSum_000/test.recipe | 30 + .../SegmentSum_000/test.reverse | 0 res/TensorFlowLiteRecipes/SelectV2_000/test.recipe | 31 + .../SelectV2_000/test.reverse | 0 res/TensorFlowLiteRecipes/SelectV2_001/test.recipe | 31 + .../SelectV2_001/test.reverse | 0 res/TensorFlowLiteRecipes/SelectV2_002/test.recipe | 31 + .../SelectV2_002/test.reverse | 0 res/TensorFlowLiteRecipes/Select_000/test.recipe | 31 + res/TensorFlowLiteRecipes/Select_000/test.reverse | 0 res/TensorFlowLiteRecipes/Select_001/test.recipe | 31 + res/TensorFlowLiteRecipes/Select_001/test.reverse | 0 res/TensorFlowLiteRecipes/Select_002/test.recipe | 31 + res/TensorFlowLiteRecipes/Select_002/test.reverse | 0 res/TensorFlowLiteRecipes/Shape_000/test.recipe | 20 + res/TensorFlowLiteRecipes/Shape_000/test.reverse | 0 res/TensorFlowLiteRecipes/Sin_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Sin_000/test.reverse | 0 res/TensorFlowLiteRecipes/Slice_000/test.recipe | 37 + res/TensorFlowLiteRecipes/Slice_000/test.reverse | 0 .../SpaceToBatchND_000/test.recipe | 38 + .../SpaceToBatchND_000/test.reverse | 0 .../SpaceToBatchND_001/test.recipe | 38 + .../SpaceToBatchND_001/test.reverse | 0 .../SpaceToBatchND_002/test.recipe | 38 + .../SpaceToBatchND_002/test.reverse | 0 .../SpaceToBatchND_003/test.recipe | 38 + .../SpaceToBatchND_003/test.reverse | 0 .../SpaceToDepth_000/test.recipe | 20 + .../SpaceToDepth_000/test.reverse | 0 .../SparseToDense_000/test.recipe | 44 + .../SparseToDense_000/test.reverse | 0 res/TensorFlowLiteRecipes/SplitV_000/test.recipe | 48 + res/TensorFlowLiteRecipes/SplitV_000/test.reverse | 0 res/TensorFlowLiteRecipes/Split_000/test.recipe | 34 + res/TensorFlowLiteRecipes/Split_000/test.reverse | 0 res/TensorFlowLiteRecipes/Square_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Square_000/test.reverse | 0 .../SquaredDifference_000/test.recipe | 24 + .../SquaredDifference_000/test.reverse | 0 res/TensorFlowLiteRecipes/Squeeze_000/test.recipe | 18 + res/TensorFlowLiteRecipes/Squeeze_000/test.reverse | 0 .../StridedSlice_000/test.recipe | 54 + .../StridedSlice_000/test.reverse | 0 .../StridedSlice_001/test.recipe | 54 + .../StridedSlice_001/test.reverse | 0 .../StridedSlice_002/test.recipe | 54 + .../StridedSlice_002/test.reverse | 0 res/TensorFlowLiteRecipes/Sum_000/test.recipe | 27 + res/TensorFlowLiteRecipes/Sum_000/test.reverse | 0 res/TensorFlowLiteRecipes/Sum_001/test.recipe | 27 + res/TensorFlowLiteRecipes/Tanh_000/test.recipe | 17 + res/TensorFlowLiteRecipes/Tanh_000/test.reverse | 0 res/TensorFlowLiteRecipes/Tile_000/test.recipe | 27 + res/TensorFlowLiteRecipes/Tile_000/test.reverse | 0 res/TensorFlowLiteRecipes/Tile_U8_000/test.recipe | 29 + res/TensorFlowLiteRecipes/Tile_U8_000/test.reverse | 0 res/TensorFlowLiteRecipes/TopKV2_000/test.recipe | 33 + res/TensorFlowLiteRecipes/TopKV2_000/test.reverse | 0 res/TensorFlowLiteRecipes/TopKV2_001/test.recipe | 33 + res/TensorFlowLiteRecipes/TopKV2_001/test.reverse | 0 .../TransposeConv_000/test.recipe | 44 + .../TransposeConv_000/test.reverse | 0 res/TensorFlowLiteRecipes/Unpack_000/test.recipe | 28 + res/TensorFlowLiteRecipes/Unpack_000/test.reverse | 0 res/TensorFlowLiteRecipes/Unpack_001/test.recipe | 28 + res/TensorFlowLiteRecipes/Unpack_001/test.reverse | 0 res/TensorFlowLiteRecipes/Unpack_002/test.recipe | 49 + res/TensorFlowLiteRecipes/Unpack_002/test.reverse | 0 res/TensorFlowLiteRecipes/Unpack_003/test.recipe | 51 + res/TensorFlowLiteRecipes/Unpack_003/test.reverse | 0 res/TensorFlowLiteRecipes/Where_000/test.recipe | 22 + res/TensorFlowLiteRecipes/Where_000/test.reverse | 0 res/TensorFlowLiteRecipes/Where_001/test.recipe | 19 + res/TensorFlowLiteRecipes/Where_001/test.reverse | 0 res/TensorFlowLiteRecipes/While_000/test.recipe | 89 + res/TensorFlowLiteRecipes/While_001/test.recipe | 139 + res/TensorFlowLiteRecipes/While_002/test.recipe | 141 + res/TensorFlowLiteRecipes/While_003/test.recipe | 91 + .../YUV_TO_RGB_000/test.recipe | 58 + .../YUV_TO_RGB_000/test.reverse | 0 .../YUV_TO_RGB_U8_000/test.recipe | 62 + .../YUV_TO_RGB_U8_000/test.reverse | 0 .../ZerosLike_000/test.recipe | 19 + .../ZerosLike_000/test.reverse | 0 res/TensorFlowLiteSchema/2.2.0/schema.fbs | 1065 ++ res/TensorFlowLiteSchema/2.3.0-rc0/schema.fbs | 1094 ++ res/TensorFlowLiteSchema/SCHEMA.lst | 2 + res/TensorFlowPythonExamples/README.md | 6 +- .../examples/AddV2/__init__.py | 5 + .../examples/BatchMatMulV2/__init__.py | 5 + .../examples/add_n/__init__.py | 6 + .../examples/argmin/__init__.py | 4 + .../examples/average_pool_2d/__init__.py | 4 + .../examples/batch_normalization/__init__.py | 9 + .../examples/batch_to_space/__init__.py | 5 + .../examples/cast/__init__.py | 4 + .../examples/ceil/__init__.py | 4 + .../examples/concat/__init__.py | 7 + .../examples/cond/__init__.py | 18 + .../examples/conv2d_1/__init__.py | 9 + .../examples/conv2d_2/__init__.py | 11 + .../examples/conv2d_transpose/__init__.py | 6 + .../examples/depth_to_space/__init__.py | 4 + .../examples/depthwise_conv2d_1/__init__.py | 10 + .../examples/depthwise_conv2d_2/__init__.py | 12 + .../examples/expand_dims_00/__init__.py | 10 + .../examples/expand_dims_01/__init__.py | 10 + .../examples/expand_dims_02/__init__.py | 9 + .../examples/fill/__init__.py | 4 + .../examples/floormod/__init__.py | 5 + .../examples/fused_batch_norm/__init__.py | 10 + .../examples/gather/__init__.py | 5 + .../examples/gather_nd/__init__.py | 5 + .../examples/l2_normalize/__init__.py | 4 + .../local_response_normalization/__init__.py | 4 + .../examples/log/__init__.py | 4 + .../examples/log_softmax/__init__.py | 4 + .../examples/log_softmax_2/__init__.py | 4 + .../examples/logical_and/__init__.py | 5 + .../examples/matrix_band_part/__init__.py | 4 + .../examples/matrix_diag/__init__.py | 4 + .../examples/matrix_set_diag/__init__.py | 5 + .../examples/max_pool_with_argmax/__init__.py | 5 + .../examples/maximum/__init__.py | 5 + .../examples/minimum/__init__.py | 5 + .../examples/negative/__init__.py | 4 + .../examples/one_hot/__init__.py | 8 + .../examples/pad-reflect/__init__.py | 5 + .../examples/prelu/__init__.py | 9 +- .../examples/range/__init__.py | 7 + .../examples/rank/__init__.py | 4 + .../examples/reduce_all/__init__.py | 4 + .../examples/reduce_any/__init__.py | 4 + .../examples/reduce_max/__init__.py | 4 + .../examples/reduce_min/__init__.py | 4 + .../examples/reduce_prod/__init__.py | 4 + .../examples/reshape/__init.py__ | 4 - .../examples/reshape/__init__.py | 4 + .../examples/reverse_sequence/__init__.py | 4 + .../examples/reverse_v2/__init__.py | 4 + .../examples/round/__init__.py | 4 + .../examples/scatter_nd/__init__.py | 10 + .../examples/segment_sum/__init__.py | 5 + .../examples/shape/__init__.py | 4 + .../examples/sin/__init__.py | 4 + .../examples/slice/__init__.py | 4 + .../examples/space_to_batch/__init__.py | 5 + .../examples/space_to_batch_nd/__init__.py | 6 + .../examples/space_to_depth/__init__.py | 4 + .../examples/sparse_to_dense/__init__.py | 4 + .../examples/split/__init__.py | 4 + .../examples/split_2/__init__.py | 4 + .../examples/square/__init__.py | 4 + .../examples/squared_difference/__init__.py | 5 + .../examples/squeeze_1/__init__.py | 4 + .../examples/squeeze_2/__init__.py | 4 + .../examples/strided_slice/__init__.py | 4 + .../examples/sum/__init__.py | 4 + .../examples/tile/__init__.py | 5 + .../examples/top_k/__init__.py | 4 + .../examples/unique/__init__.py | 4 + .../examples/unstack/__init__.py | 4 + .../examples/where/__init__.py | 4 + .../examples/where_2/__init__.py | 6 + .../examples/where_v2/__init__.py | 4 + .../examples/where_v2_2/__init__.py | 6 + .../examples/while/__init__.py | 7 + .../examples/zeros_like/__init__.py | 4 + res/TensorFlowPythonExamples/tfpem.py | 2 + res/TensorFlowPythonModels/.gitignore | 1 + res/TensorFlowPythonModels/README.md | 36 + .../examples/L2Pool2D/__init__.py | 16 + .../examples/ReluN1To1/__init__.py | 18 + .../examples/UnknownExpandDims/__init__.py | 18 + res/TensorFlowPythonModels/requirements.txt | 18 + res/TensorFlowPythonModels/tfpem.py | 25 + res/TensorFlowTests/NET_0043/test.info | 2 + res/TensorFlowTests/NET_0043/test.manifest | 1 + res/TensorFlowTests/NET_0043/test.pbtxt | 186 + res/TensorFlowTests/NET_YUV_TO_RGB/circle.rule | 5 + res/TensorFlowTests/NET_YUV_TO_RGB/test.info | 2 + res/TensorFlowTests/NET_YUV_TO_RGB/test.manifest | 1 + res/TensorFlowTests/NET_YUV_TO_RGB/test.pbtxt | 184 + res/TensorFlowTests/NET_YUV_TO_RGB/test.py | 14 + runtime/3rdparty/.FORMATDENY | 0 runtime/3rdparty/CMakeLists.txt | 4 + runtime/3rdparty/half/CMakeLists.txt | 2 + runtime/3rdparty/half/include/Half.h | 24 + runtime/3rdparty/half/include/half/.FORMATDENY | 0 runtime/3rdparty/half/include/half/ChangeLog.txt | 205 + runtime/3rdparty/half/include/half/LICENSE.txt | 21 + runtime/3rdparty/half/include/half/README.txt | 317 + .../3rdparty/half/include/half/include/half.hpp | 4575 ++++++ runtime/{libs => 3rdparty}/jsoncpp/CMakeLists.txt | 0 runtime/{libs => 3rdparty}/jsoncpp/README.md | 0 .../jsoncpp/json/json-forwards.h | 0 runtime/{libs => 3rdparty}/jsoncpp/json/json.h | 0 runtime/{libs => 3rdparty}/jsoncpp/jsoncpp.cpp | 0 .../3rdparty}/lcov-to-cobertura-xml/README.md | 0 .../lcov-to-cobertura-xml/lcov_cobertura.py | 0 runtime/contrib/android/.gitignore | 6 + runtime/contrib/android/README.md | 76 + runtime/contrib/android/api/Android.mk | 10 + runtime/contrib/android/api/Application.mk | 3 + runtime/contrib/android/api/build.gradle | 41 + runtime/contrib/android/api/prebuilt/Android.mk | 9 + .../android/api/prebuilt/backend_cpu/Android.mk | 7 + .../api/prebuilt/backend_cpu/libbackend_cpu.so | 1 + .../android/api/prebuilt/circle_loader/Android.mk | 7 + .../api/prebuilt/circle_loader/libcircle_loader.so | 1 + .../android/api/prebuilt/nnfw-dev/Android.mk | 7 + .../android/api/prebuilt/nnfw-dev/libnnfw-dev.so | 1 + .../android/api/prebuilt/onert_core/Android.mk | 7 + .../api/prebuilt/onert_core/libonert_core.so | 1 + .../api/prebuilt/tensorflowlite_jni/Android.mk | 7 + .../tensorflowlite_jni/libtensorflowlite_jni.so | 1 + .../android/api/prebuilt/tflite_loader/Android.mk | 7 + .../api/prebuilt/tflite_loader/libtflite_loader.so | 1 + runtime/contrib/android/api/proguard-rules.pro | 21 + .../android/api/src/main/AndroidManifest.xml | 2 + .../src/main/java/com/samsung/onert/Helper.java | 128 + .../com/samsung/onert/NativeSessionWrapper.java | 139 + .../src/main/java/com/samsung/onert/Session.java | 61 + .../src/main/java/com/samsung/onert/Tensor.java | 73 + .../main/java/com/samsung/onert/TensorInfo.java | 75 + .../contrib/android/api/src/main/native/Android.mk | 18 + .../api/src/main/native/onert-native-api.cpp | 300 + .../android/api/src/main/native/onert-native-api.h | 129 + .../api/src/main/native/onert-native-helper.cpp | 226 + .../api/src/main/native/onert-native-helper.h | 34 + .../api/src/main/native/onert-native-internal.cpp | 157 + .../api/src/main/native/onert-native-internal.h | 64 + runtime/contrib/android/build.gradle | 31 + runtime/contrib/android/gradle.properties | 2 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58694 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + runtime/contrib/android/gradlew | 183 + runtime/contrib/android/gradlew.bat | 103 + runtime/contrib/android/settings.gradle | 2 + runtime/contrib/android/update_jni_header.sh | 12 + .../contrib/android_benchmark_app/CMakeLists.txt | 6 +- runtime/contrib/android_tflite/CMakeLists.txt | 2 +- runtime/contrib/benchmark_acl/CMakeLists.txt | 2 +- runtime/contrib/hi_perf_cpu/CMakeLists.txt | 47 - .../hi_perf_cpu/HighPerformanceBackend.test.cc | 42 - runtime/contrib/hi_perf_cpu/KernelGenerator.cc | 18 - runtime/contrib/hi_perf_cpu/KernelGenerator.h | 47 - runtime/contrib/hi_perf_cpu/TensorBuilder.cc | 18 - runtime/contrib/hi_perf_cpu/TensorBuilder.h | 44 - runtime/contrib/labs/jniacl/CMakeLists.txt | 2 +- runtime/contrib/labs/opencl_test/CMakeLists.txt | 2 +- runtime/contrib/logging/CMakeLists.txt | 2 +- runtime/contrib/pure_arm_compute/CMakeLists.txt | 29 - .../contrib/pure_arm_compute/src/compilation.cc | 6429 -------- runtime/contrib/pure_arm_compute/src/compilation.h | 75 - runtime/contrib/pure_arm_compute/src/event.cc | 31 - runtime/contrib/pure_arm_compute/src/event.h | 33 - runtime/contrib/pure_arm_compute/src/execution.cc | 628 - runtime/contrib/pure_arm_compute/src/execution.h | 119 - .../pure_arm_compute/src/internal/FeatureSink.h | 80 - .../pure_arm_compute/src/internal/FeatureSource.h | 77 - .../src/internal/IExecutionBuilder.h | 49 - .../pure_arm_compute/src/internal/MatrixSink.h | 91 - .../pure_arm_compute/src/internal/MatrixSource.h | 82 - .../contrib/pure_arm_compute/src/internal/Model.cc | 128 - .../contrib/pure_arm_compute/src/internal/Model.h | 538 - .../contrib/pure_arm_compute/src/internal/Sink.h | 45 - .../contrib/pure_arm_compute/src/internal/Sinks.h | 97 - .../contrib/pure_arm_compute/src/internal/Source.h | 46 - .../pure_arm_compute/src/internal/Swizzle.h | 115 - .../pure_arm_compute/src/internal/Tensor3DSink.h | 89 - .../pure_arm_compute/src/internal/Tensor3DSource.h | 89 - .../pure_arm_compute/src/internal/TensorSource.h | 83 - .../pure_arm_compute/src/internal/VectorSink.h | 73 - .../pure_arm_compute/src/internal/VectorSource.h | 69 - .../pure_arm_compute/src/internal/arm_compute.cc | 87 - .../pure_arm_compute/src/internal/arm_compute.h | 338 - .../src/internal/arm_compute/Cast.cc | 152 - .../src/internal/arm_compute/Cast.h | 156 - .../src/internal/arm_compute/feature/View.h | 156 - .../src/internal/arm_compute/kernel/View.h | 110 - .../src/internal/arm_compute/matrix/View.h | 104 - .../src/internal/arm_compute/tensor/View.h | 112 - .../src/internal/nnapi/feature/Reader.h | 105 - .../src/internal/nnapi/feature/Utils.h | 82 - .../src/internal/nnapi/feature/View.h | 132 - .../src/internal/nnapi/kernel/Reader.h | 94 - .../src/internal/nnapi/matrix/Reader.h | 90 - .../src/internal/nnapi/tensor/ConstView.h | 111 - .../src/internal/nnapi/tensor/Reader.h | 116 - .../src/internal/nnapi/tensor/View.h | 121 - .../pure_arm_compute/src/internal/op/Abs.cc | 59 - .../contrib/pure_arm_compute/src/internal/op/Abs.h | 68 - .../pure_arm_compute/src/internal/op/Add.cc | 67 - .../contrib/pure_arm_compute/src/internal/op/Add.h | 110 - .../pure_arm_compute/src/internal/op/ArgMax.cc | 64 - .../pure_arm_compute/src/internal/op/ArgMax.h | 70 - .../pure_arm_compute/src/internal/op/AvgPool2D.cc | 124 - .../pure_arm_compute/src/internal/op/AvgPool2D.h | 198 - .../src/internal/op/BatchToSpaceNd.cc | 64 - .../src/internal/op/BatchToSpaceNd.h | 83 - .../pure_arm_compute/src/internal/op/Cast.cc | 62 - .../pure_arm_compute/src/internal/op/Cast.h | 108 - .../pure_arm_compute/src/internal/op/Concat.cc | 69 - .../pure_arm_compute/src/internal/op/Concat.h | 109 - .../pure_arm_compute/src/internal/op/Conv2D.cc | 126 - .../pure_arm_compute/src/internal/op/Conv2D.h | 200 - .../src/internal/op/DepthToSpace.cc | 65 - .../src/internal/op/DepthToSpace.h | 70 - .../src/internal/op/DepthwiseConv2D.cc | 128 - .../src/internal/op/DepthwiseConv2D.h | 198 - .../pure_arm_compute/src/internal/op/Dequantize.cc | 62 - .../pure_arm_compute/src/internal/op/Dequantize.h | 106 - .../pure_arm_compute/src/internal/op/Div.cc | 67 - .../contrib/pure_arm_compute/src/internal/op/Div.h | 108 - .../src/internal/op/EmbeddingLookup.cc | 65 - .../src/internal/op/EmbeddingLookup.h | 109 - .../pure_arm_compute/src/internal/op/Equal.cc | 65 - .../pure_arm_compute/src/internal/op/Equal.h | 83 - .../pure_arm_compute/src/internal/op/Exp.cc | 63 - .../contrib/pure_arm_compute/src/internal/op/Exp.h | 69 - .../pure_arm_compute/src/internal/op/Floor.cc | 62 - .../pure_arm_compute/src/internal/op/Floor.h | 108 - .../src/internal/op/FullyConnected.cc | 69 - .../src/internal/op/FullyConnected.h | 114 - .../pure_arm_compute/src/internal/op/Gather.cc | 67 - .../pure_arm_compute/src/internal/op/Gather.h | 109 - .../src/internal/op/HashtableLookup.cc | 68 - .../src/internal/op/HashtableLookup.h | 109 - .../src/internal/op/L2Normalization.cc | 60 - .../src/internal/op/L2Normalization.h | 106 - .../pure_arm_compute/src/internal/op/L2Pool2D.cc | 124 - .../pure_arm_compute/src/internal/op/L2Pool2D.h | 198 - .../src/internal/op/LocalResponseNormalization.cc | 64 - .../src/internal/op/LocalResponseNormalization.h | 73 - .../pure_arm_compute/src/internal/op/LogicalAnd.cc | 65 - .../pure_arm_compute/src/internal/op/LogicalAnd.h | 83 - .../pure_arm_compute/src/internal/op/LogicalNot.cc | 60 - .../pure_arm_compute/src/internal/op/LogicalNot.h | 82 - .../pure_arm_compute/src/internal/op/LogicalOr.cc | 65 - .../pure_arm_compute/src/internal/op/LogicalOr.h | 83 - .../pure_arm_compute/src/internal/op/Logistic.cc | 63 - .../pure_arm_compute/src/internal/op/Logistic.h | 105 - .../pure_arm_compute/src/internal/op/Lstm.cc | 85 - .../pure_arm_compute/src/internal/op/Lstm.h | 131 - .../pure_arm_compute/src/internal/op/MaxPool2D.cc | 124 - .../pure_arm_compute/src/internal/op/MaxPool2D.h | 202 - .../pure_arm_compute/src/internal/op/Mean.cc | 67 - .../pure_arm_compute/src/internal/op/Mean.h | 108 - .../pure_arm_compute/src/internal/op/Mul.cc | 67 - .../contrib/pure_arm_compute/src/internal/op/Mul.h | 106 - .../pure_arm_compute/src/internal/op/Neg.cc | 63 - .../contrib/pure_arm_compute/src/internal/op/Neg.h | 69 - .../pure_arm_compute/src/internal/op/Node.h | 60 - .../pure_arm_compute/src/internal/op/NodeVisitor.h | 493 - .../pure_arm_compute/src/internal/op/NotEqual.cc | 65 - .../pure_arm_compute/src/internal/op/NotEqual.h | 83 - .../pure_arm_compute/src/internal/op/PReLU.cc | 65 - .../pure_arm_compute/src/internal/op/PReLU.h | 109 - .../pure_arm_compute/src/internal/op/Pack.cc | 69 - .../pure_arm_compute/src/internal/op/Pack.h | 72 - .../pure_arm_compute/src/internal/op/Pad.cc | 63 - .../contrib/pure_arm_compute/src/internal/op/Pad.h | 107 - .../pure_arm_compute/src/internal/op/RSQRT.cc | 62 - .../pure_arm_compute/src/internal/op/RSQRT.h | 105 - .../pure_arm_compute/src/internal/op/ReLU.cc | 63 - .../pure_arm_compute/src/internal/op/ReLU.h | 108 - .../pure_arm_compute/src/internal/op/ReLU1.cc | 63 - .../pure_arm_compute/src/internal/op/ReLU1.h | 108 - .../pure_arm_compute/src/internal/op/ReLU6.cc | 63 - .../pure_arm_compute/src/internal/op/ReLU6.h | 104 - .../pure_arm_compute/src/internal/op/ReduceMax.cc | 65 - .../pure_arm_compute/src/internal/op/ReduceMax.h | 107 - .../pure_arm_compute/src/internal/op/ReduceMin.cc | 65 - .../pure_arm_compute/src/internal/op/ReduceMin.h | 107 - .../pure_arm_compute/src/internal/op/ReduceSum.cc | 65 - .../pure_arm_compute/src/internal/op/ReduceSum.h | 70 - .../pure_arm_compute/src/internal/op/Reshape.cc | 66 - .../pure_arm_compute/src/internal/op/Reshape.h | 108 - .../src/internal/op/ResizeBilinear.cc | 67 - .../src/internal/op/ResizeBilinear.h | 108 - .../pure_arm_compute/src/internal/op/Rnn.cc | 66 - .../contrib/pure_arm_compute/src/internal/op/Rnn.h | 113 - .../pure_arm_compute/src/internal/op/SQRT.cc | 62 - .../pure_arm_compute/src/internal/op/SQRT.h | 105 - .../pure_arm_compute/src/internal/op/Softmax.cc | 65 - .../pure_arm_compute/src/internal/op/Softmax.h | 109 - .../src/internal/op/SpaceToBatchND.cc | 67 - .../src/internal/op/SpaceToBatchND.h | 71 - .../src/internal/op/SpaceToDepth.cc | 65 - .../src/internal/op/SpaceToDepth.h | 109 - .../pure_arm_compute/src/internal/op/Split.cc | 72 - .../pure_arm_compute/src/internal/op/Split.h | 109 - .../src/internal/op/SquaredDifference.cc | 64 - .../src/internal/op/SquaredDifference.h | 106 - .../pure_arm_compute/src/internal/op/Squeeze.cc | 66 - .../pure_arm_compute/src/internal/op/Squeeze.h | 108 - .../src/internal/op/StridedSlice.cc | 88 - .../src/internal/op/StridedSlice.h | 113 - .../pure_arm_compute/src/internal/op/Sub.cc | 67 - .../contrib/pure_arm_compute/src/internal/op/Sub.h | 109 - .../pure_arm_compute/src/internal/op/Tanh.cc | 63 - .../pure_arm_compute/src/internal/op/Tanh.h | 107 - .../pure_arm_compute/src/internal/op/TopKV2.cc | 70 - .../pure_arm_compute/src/internal/op/TopKV2.h | 110 - .../pure_arm_compute/src/internal/op/Transpose.cc | 65 - .../pure_arm_compute/src/internal/op/Transpose.h | 109 - .../src/internal/op/TransposeConv.cc | 74 - .../src/internal/op/TransposeConv.h | 74 - .../pure_arm_compute/src/internal/op/Unpack.cc | 68 - .../pure_arm_compute/src/internal/op/Unpack.h | 72 - .../contrib/pure_arm_compute/src/library_info.cc | 17 - runtime/contrib/pure_arm_compute/src/logging.h | 74 - runtime/contrib/pure_arm_compute/src/memory.cc | 55 - runtime/contrib/pure_arm_compute/src/memory.h | 69 - runtime/contrib/pure_arm_compute/src/model.cc | 1082 -- runtime/contrib/pure_arm_compute/src/model.h | 70 - runtime/contrib/pure_arm_compute/symbolcheck.cpp | 64 - runtime/contrib/style_transfer_app/CMakeLists.txt | 4 +- runtime/contrib/uben/CMakeLists.txt | 2 +- runtime/libs/benchmark/include/benchmark.h | 4 +- .../libs/benchmark/include/benchmark/CsvHeader.lst | 4 + .../benchmark/include/benchmark/MemoryPoller.h | 19 +- runtime/libs/benchmark/include/benchmark/Phase.h | 41 +- runtime/libs/benchmark/include/benchmark/Phases.h | 65 + runtime/libs/benchmark/include/benchmark/Result.h | 115 +- runtime/libs/benchmark/include/benchmark/Types.h | 133 + runtime/libs/benchmark/include/benchmark/Util.h | 101 - runtime/libs/benchmark/src/MemoryPoller.cpp | 60 +- runtime/libs/benchmark/src/Phases.cpp | 103 + runtime/libs/benchmark/src/Result.cpp | 228 + runtime/libs/misc/CMakeLists.txt | 6 - runtime/libs/misc/include/misc/EventCollector.h | 51 - runtime/libs/misc/include/misc/EventRecorder.h | 68 - runtime/libs/misc/include/misc/RandomGenerator.h | 87 + runtime/libs/misc/include/misc/string_helpers.h | 15 + runtime/libs/misc/src/EventCollector.cpp | 104 - runtime/libs/misc/src/EventRecorder.cpp | 136 - runtime/libs/misc/src/RandomGenerator.cpp | 83 + runtime/libs/tflite/CMakeLists.txt | 2 +- runtime/libs/tflite/include/tflite/Diff.h | 116 +- .../libs/tflite/include/tflite/RandomTestRunner.h | 103 + .../libs/tflite/port/1.13.1/src/nnapi_delegate.cpp | 67 +- .../nnapi_delegate_ex_AddOpsAndParams_lambda.inc | 17 - runtime/libs/tflite/src/Diff.cpp | 379 - runtime/libs/tflite/src/RandomTestRunner.cpp | 363 + runtime/nnapi-header/include/NeuralNetworksEx.h | 179 +- runtime/onert/api/CMakeLists.txt | 2 +- runtime/onert/api/include/nnfw.h | 97 +- runtime/onert/api/include/nnfw_debug.h | 4 +- runtime/onert/api/include/nnfw_version.h | 2 +- runtime/onert/api/src/CustomKernel.cc | 44 +- runtime/onert/api/src/CustomKernel.h | 4 +- runtime/onert/api/src/OpMap.lst | 199 +- runtime/onert/api/src/nnfw_api.cc | 59 +- runtime/onert/api/src/nnfw_api_internal.cc | 443 +- runtime/onert/api/src/nnfw_api_internal.h | 68 +- runtime/onert/api/src/nnfw_debug.cc | 14 +- runtime/onert/api/src/nnfw_debug_internal.cc | 25 - runtime/onert/api/src/nnfw_debug_internal.h | 29 - runtime/onert/backend/CMakeLists.txt | 2 - runtime/onert/backend/acl_cl/Backend.h | 5 +- runtime/onert/backend/acl_cl/CMakeLists.txt | 2 +- runtime/onert/backend/acl_cl/Config.cc | 17 + runtime/onert/backend/acl_cl/Config.h | 8 +- runtime/onert/backend/acl_cl/KernelGenerator.cc | 344 +- runtime/onert/backend/acl_cl/KernelGenerator.h | 12 +- runtime/onert/backend/acl_cl/ShapeFixer.cc | 431 - runtime/onert/backend/acl_cl/ShapeFixer.h | 110 - runtime/onert/backend/acl_cl/operand/CLTensor.cc | 4 - runtime/onert/backend/acl_cl/operand/CLTensor.h | 2 - runtime/onert/backend/acl_cl/operand/ICLTensor.h | 4 +- runtime/onert/backend/acl_common/AclFunction.h | 9 - .../onert/backend/acl_common/AclTensorBuilder.h | 63 +- runtime/onert/backend/acl_common/CMakeLists.txt | 2 +- runtime/onert/backend/acl_common/Convert.cc | 97 +- runtime/onert/backend/acl_common/Convert.h | 13 + runtime/onert/backend/acl_common/IACLTensor.cc | 32 +- runtime/onert/backend/acl_common/IACLTensor.h | 7 +- runtime/onert/backend/acl_neon/Backend.h | 5 +- runtime/onert/backend/acl_neon/CMakeLists.txt | 2 +- runtime/onert/backend/acl_neon/Config.cc | 17 + runtime/onert/backend/acl_neon/Config.h | 5 +- runtime/onert/backend/acl_neon/KernelGenerator.cc | 288 +- runtime/onert/backend/acl_neon/KernelGenerator.h | 10 +- runtime/onert/backend/acl_neon/ShapeFixer.cc | 437 - runtime/onert/backend/acl_neon/ShapeFixer.h | 110 - .../onert/backend/acl_neon/operand/INETensor.cc | 9 +- runtime/onert/backend/cpu/Backend.h | 5 +- runtime/onert/backend/cpu/CMakeLists.txt | 4 +- runtime/onert/backend/cpu/Config.cc | 2 + runtime/onert/backend/cpu/Config.h | 5 +- runtime/onert/backend/cpu/ConstantInitializer.cc | 7 +- runtime/onert/backend/cpu/KernelGenerator.cc | 969 +- runtime/onert/backend/cpu/KernelGenerator.h | 36 +- runtime/onert/backend/cpu/ShapeFixer.cc | 181 - runtime/onert/backend/cpu/ShapeFixer.h | 85 - runtime/onert/backend/cpu/Tensor.h | 94 + runtime/onert/backend/cpu/TensorBuilder.cc | 72 +- runtime/onert/backend/cpu/TensorBuilder.h | 39 +- runtime/onert/backend/cpu/TensorManager.cc | 114 - runtime/onert/backend/cpu/TensorManager.h | 65 - runtime/onert/backend/cpu/kernel/AbsLayer.cc | 67 - runtime/onert/backend/cpu/kernel/AbsLayer.h | 63 - runtime/onert/backend/cpu/kernel/AddLayer.cc | 96 - runtime/onert/backend/cpu/kernel/AddLayer.h | 71 - runtime/onert/backend/cpu/kernel/AvgPoolLayer.cc | 116 - runtime/onert/backend/cpu/kernel/AvgPoolLayer.h | 81 - runtime/onert/backend/cpu/kernel/CastLayer.cc | 108 - runtime/onert/backend/cpu/kernel/CastLayer.h | 63 - runtime/onert/backend/cpu/kernel/CompareLayer.cc | 180 - runtime/onert/backend/cpu/kernel/CompareLayer.h | 65 - runtime/onert/backend/cpu/kernel/ConcatLayer.cc | 134 - runtime/onert/backend/cpu/kernel/ConcatLayer.h | 65 - .../onert/backend/cpu/kernel/ConvolutionLayer.cc | 159 - .../onert/backend/cpu/kernel/ConvolutionLayer.h | 96 - .../cpu/kernel/DepthwiseConvolutionLayer.cc | 136 - .../backend/cpu/kernel/DepthwiseConvolutionLayer.h | 83 - runtime/onert/backend/cpu/kernel/DivLayer.cc | 92 - runtime/onert/backend/cpu/kernel/DivLayer.h | 71 - runtime/onert/backend/cpu/kernel/ExpLayer.cc | 71 - runtime/onert/backend/cpu/kernel/ExpLayer.h | 63 - .../backend/cpu/kernel/FullyConnectedLayer.cc | 141 - .../onert/backend/cpu/kernel/FullyConnectedLayer.h | 81 - runtime/onert/backend/cpu/kernel/GatherLayer.cc | 77 - runtime/onert/backend/cpu/kernel/GatherLayer.h | 66 - runtime/onert/backend/cpu/kernel/LogisticLayer.cc | 71 - runtime/onert/backend/cpu/kernel/LogisticLayer.h | 63 - runtime/onert/backend/cpu/kernel/MaxLayer.cc | 78 - runtime/onert/backend/cpu/kernel/MaxLayer.h | 67 - runtime/onert/backend/cpu/kernel/MaxPoolLayer.cc | 113 - runtime/onert/backend/cpu/kernel/MaxPoolLayer.h | 81 - runtime/onert/backend/cpu/kernel/MinLayer.cc | 78 - runtime/onert/backend/cpu/kernel/MinLayer.h | 67 - runtime/onert/backend/cpu/kernel/MulLayer.cc | 92 - runtime/onert/backend/cpu/kernel/MulLayer.h | 71 - runtime/onert/backend/cpu/kernel/OneHotLayer.cc | 70 - runtime/onert/backend/cpu/kernel/OneHotLayer.h | 73 - runtime/onert/backend/cpu/kernel/OperationUtils.cc | 269 - runtime/onert/backend/cpu/kernel/OperationUtils.h | 162 - runtime/onert/backend/cpu/kernel/PackLayer.cc | 98 - runtime/onert/backend/cpu/kernel/PackLayer.h | 65 - runtime/onert/backend/cpu/kernel/PadLayer.cc | 70 - runtime/onert/backend/cpu/kernel/PadLayer.h | 71 - runtime/onert/backend/cpu/kernel/PermuteLayer.cc | 71 - runtime/onert/backend/cpu/kernel/PermuteLayer.h | 209 - runtime/onert/backend/cpu/kernel/ReduceLayer.cc | 137 - runtime/onert/backend/cpu/kernel/ReduceLayer.h | 84 - runtime/onert/backend/cpu/kernel/ReshapeLayer.cc | 55 - runtime/onert/backend/cpu/kernel/ReshapeLayer.h | 63 - runtime/onert/backend/cpu/kernel/RsqrtLayer.cc | 70 - runtime/onert/backend/cpu/kernel/RsqrtLayer.h | 59 - runtime/onert/backend/cpu/kernel/ShapeLayer.cc | 81 - runtime/onert/backend/cpu/kernel/ShapeLayer.h | 61 - runtime/onert/backend/cpu/kernel/SinLayer.cc | 69 - runtime/onert/backend/cpu/kernel/SinLayer.h | 60 - runtime/onert/backend/cpu/kernel/SliceLayer.cc | 111 - runtime/onert/backend/cpu/kernel/SliceLayer.h | 71 - runtime/onert/backend/cpu/kernel/SoftMaxLayer.cc | 173 - runtime/onert/backend/cpu/kernel/SoftMaxLayer.h | 65 - runtime/onert/backend/cpu/kernel/SplitLayer.cc | 98 - runtime/onert/backend/cpu/kernel/SplitLayer.h | 66 - .../onert/backend/cpu/kernel/StridedSliceLayer.cc | 96 - .../onert/backend/cpu/kernel/StridedSliceLayer.h | 78 - runtime/onert/backend/cpu/kernel/SubLayer.cc | 92 - runtime/onert/backend/cpu/kernel/SubLayer.h | 71 - runtime/onert/backend/cpu/kernel/TanhLayer.cc | 71 - runtime/onert/backend/cpu/kernel/TanhLayer.h | 63 - runtime/onert/backend/cpu/kernel/TransposeLayer.cc | 81 - runtime/onert/backend/cpu/kernel/TransposeLayer.h | 61 - runtime/onert/backend/cpu/kernel/UnpackLayer.cc | 104 - runtime/onert/backend/cpu/kernel/UnpackLayer.h | 66 - runtime/onert/backend/cpu/operand/Tensor.cc | 45 - runtime/onert/backend/cpu/operand/Tensor.h | 124 - runtime/onert/backend/cpu/ops/AbsLayer.cc | 70 + runtime/onert/backend/cpu/ops/AbsLayer.h | 57 + runtime/onert/backend/cpu/ops/AddLayer.cc | 166 + runtime/onert/backend/cpu/ops/AddLayer.h | 67 + runtime/onert/backend/cpu/ops/ArgMinMaxLayer.cc | 113 + runtime/onert/backend/cpu/ops/ArgMinMaxLayer.h | 56 + runtime/onert/backend/cpu/ops/AvgPoolLayer.cc | 118 + runtime/onert/backend/cpu/ops/AvgPoolLayer.h | 75 + runtime/onert/backend/cpu/ops/BatchMatMulLayer.cc | 85 + runtime/onert/backend/cpu/ops/BatchMatMulLayer.h | 72 + runtime/onert/backend/cpu/ops/BroadcastToLayer.cc | 74 + runtime/onert/backend/cpu/ops/BroadcastToLayer.h | 56 + runtime/onert/backend/cpu/ops/CastLayer.cc | 112 + runtime/onert/backend/cpu/ops/CastLayer.h | 57 + runtime/onert/backend/cpu/ops/CompareLayer.cc | 289 + runtime/onert/backend/cpu/ops/CompareLayer.h | 57 + runtime/onert/backend/cpu/ops/ConcatLayer.cc | 143 + runtime/onert/backend/cpu/ops/ConcatLayer.h | 59 + runtime/onert/backend/cpu/ops/ConvolutionLayer.cc | 204 + runtime/onert/backend/cpu/ops/ConvolutionLayer.h | 93 + runtime/onert/backend/cpu/ops/CosLayer.cc | 68 + runtime/onert/backend/cpu/ops/CosLayer.h | 54 + .../backend/cpu/ops/DepthwiseConvolutionLayer.cc | 138 + .../backend/cpu/ops/DepthwiseConvolutionLayer.h | 77 + runtime/onert/backend/cpu/ops/DivLayer.cc | 95 + runtime/onert/backend/cpu/ops/DivLayer.h | 65 + runtime/onert/backend/cpu/ops/EinsumLayer.cc | 84 + runtime/onert/backend/cpu/ops/EinsumLayer.h | 72 + runtime/onert/backend/cpu/ops/ExpLayer.cc | 74 + runtime/onert/backend/cpu/ops/ExpLayer.h | 57 + runtime/onert/backend/cpu/ops/ExpandDimsLayer.cc | 51 + runtime/onert/backend/cpu/ops/ExpandDimsLayer.h | 55 + runtime/onert/backend/cpu/ops/FillLayer.cc | 75 + runtime/onert/backend/cpu/ops/FillLayer.h | 54 + .../onert/backend/cpu/ops/FullyConnectedLayer.cc | 207 + .../onert/backend/cpu/ops/FullyConnectedLayer.h | 83 + .../onert/backend/cpu/ops/FusedBatchNormLayer.cc | 94 + .../onert/backend/cpu/ops/FusedBatchNormLayer.h | 73 + runtime/onert/backend/cpu/ops/GatherLayer.cc | 95 + runtime/onert/backend/cpu/ops/GatherLayer.h | 63 + runtime/onert/backend/cpu/ops/LogLayer.cc | 70 + runtime/onert/backend/cpu/ops/LogLayer.h | 57 + runtime/onert/backend/cpu/ops/LogSoftMaxLayer.cc | 80 + runtime/onert/backend/cpu/ops/LogSoftMaxLayer.h | 60 + runtime/onert/backend/cpu/ops/LogicalNotLayer.cc | 64 + runtime/onert/backend/cpu/ops/LogicalNotLayer.h | 56 + runtime/onert/backend/cpu/ops/LogicalOrLayer.cc | 76 + runtime/onert/backend/cpu/ops/LogicalOrLayer.h | 59 + runtime/onert/backend/cpu/ops/LogisticLayer.cc | 108 + runtime/onert/backend/cpu/ops/LogisticLayer.h | 60 + .../onert/backend/cpu/ops/MatrixBandPartLayer.cc | 94 + .../onert/backend/cpu/ops/MatrixBandPartLayer.h | 60 + runtime/onert/backend/cpu/ops/MaxLayer.cc | 85 + runtime/onert/backend/cpu/ops/MaxLayer.h | 61 + runtime/onert/backend/cpu/ops/MaxPoolLayer.cc | 115 + runtime/onert/backend/cpu/ops/MaxPoolLayer.h | 75 + runtime/onert/backend/cpu/ops/MeanLayer.cc | 81 + runtime/onert/backend/cpu/ops/MeanLayer.h | 60 + runtime/onert/backend/cpu/ops/MinLayer.cc | 89 + runtime/onert/backend/cpu/ops/MinLayer.h | 61 + runtime/onert/backend/cpu/ops/MulLayer.cc | 116 + runtime/onert/backend/cpu/ops/MulLayer.h | 65 + runtime/onert/backend/cpu/ops/NegLayer.cc | 70 + runtime/onert/backend/cpu/ops/NegLayer.h | 57 + runtime/onert/backend/cpu/ops/OneHotLayer.cc | 69 + runtime/onert/backend/cpu/ops/OneHotLayer.h | 67 + runtime/onert/backend/cpu/ops/OperationUtils.cc | 266 + runtime/onert/backend/cpu/ops/OperationUtils.h | 209 + runtime/onert/backend/cpu/ops/PackLayer.cc | 96 + runtime/onert/backend/cpu/ops/PackLayer.h | 56 + runtime/onert/backend/cpu/ops/PadLayer.cc | 73 + runtime/onert/backend/cpu/ops/PadLayer.h | 65 + runtime/onert/backend/cpu/ops/PowLayer.cc | 73 + runtime/onert/backend/cpu/ops/PowLayer.h | 63 + runtime/onert/backend/cpu/ops/RangeLayer.cc | 70 + runtime/onert/backend/cpu/ops/RangeLayer.h | 54 + runtime/onert/backend/cpu/ops/ReLULayer.cc | 74 + runtime/onert/backend/cpu/ops/ReLULayer.h | 57 + runtime/onert/backend/cpu/ops/ReduceLayer.cc | 171 + runtime/onert/backend/cpu/ops/ReduceLayer.h | 79 + runtime/onert/backend/cpu/ops/ReshapeLayer.cc | 53 + runtime/onert/backend/cpu/ops/ReshapeLayer.h | 57 + runtime/onert/backend/cpu/ops/ReverseLayer.cc | 68 + runtime/onert/backend/cpu/ops/ReverseLayer.h | 58 + runtime/onert/backend/cpu/ops/RoundLayer.cc | 63 + runtime/onert/backend/cpu/ops/RoundLayer.h | 54 + runtime/onert/backend/cpu/ops/RsqrtLayer.cc | 69 + runtime/onert/backend/cpu/ops/RsqrtLayer.h | 53 + runtime/onert/backend/cpu/ops/SelectLayer.cc | 89 + runtime/onert/backend/cpu/ops/SelectLayer.h | 56 + runtime/onert/backend/cpu/ops/ShapeLayer.cc | 81 + runtime/onert/backend/cpu/ops/ShapeLayer.h | 55 + runtime/onert/backend/cpu/ops/SinLayer.cc | 68 + runtime/onert/backend/cpu/ops/SinLayer.h | 54 + runtime/onert/backend/cpu/ops/SliceLayer.cc | 115 + runtime/onert/backend/cpu/ops/SliceLayer.h | 65 + runtime/onert/backend/cpu/ops/SoftMaxLayer.cc | 176 + runtime/onert/backend/cpu/ops/SoftMaxLayer.h | 59 + .../onert/backend/cpu/ops/SpaceToBatchNDLayer.cc | 114 + .../onert/backend/cpu/ops/SpaceToBatchNDLayer.h | 60 + runtime/onert/backend/cpu/ops/SplitLayer.cc | 94 + runtime/onert/backend/cpu/ops/SplitLayer.h | 58 + runtime/onert/backend/cpu/ops/SquaredDiffLayer.cc | 66 + runtime/onert/backend/cpu/ops/SquaredDiffLayer.h | 57 + runtime/onert/backend/cpu/ops/StridedSliceLayer.cc | 94 + runtime/onert/backend/cpu/ops/StridedSliceLayer.h | 68 + runtime/onert/backend/cpu/ops/SubLayer.cc | 162 + runtime/onert/backend/cpu/ops/SubLayer.h | 67 + runtime/onert/backend/cpu/ops/TanhLayer.cc | 103 + runtime/onert/backend/cpu/ops/TanhLayer.h | 60 + runtime/onert/backend/cpu/ops/TileLayer.cc | 77 + runtime/onert/backend/cpu/ops/TileLayer.h | 59 + runtime/onert/backend/cpu/ops/TransposeLayer.cc | 97 + runtime/onert/backend/cpu/ops/TransposeLayer.h | 59 + runtime/onert/backend/cpu/ops/UnpackLayer.cc | 91 + runtime/onert/backend/cpu/ops/UnpackLayer.h | 58 + runtime/onert/backend/cpu/ops/ZerosLikeLayer.cc | 63 + runtime/onert/backend/cpu/ops/ZerosLikeLayer.h | 51 + runtime/onert/backend/cpu_common/Allocator.cc | 38 - runtime/onert/backend/cpu_common/CMakeLists.txt | 35 - runtime/onert/backend/cpu_common/MemoryManager.cc | 91 - runtime/onert/backend/cpu_common/MemoryManager.h | 72 - runtime/onert/backend/cpu_common/MemoryPlanner.cc | 212 - runtime/onert/backend/cpu_common/MemoryPlanner.h | 200 - .../backend/cpu_common/MemoryPlannerFactory.cc | 51 - .../backend/cpu_common/MemoryPlannerFactory.h | 47 - runtime/onert/core/CMakeLists.txt | 21 +- .../onert/core/include/backend/BackendContext.h | 6 +- .../core/include/backend/CustomKernelBuilder.h | 11 +- runtime/onert/core/include/backend/IConfig.h | 42 +- .../core/include/backend/IConstantInitializer.h | 67 +- .../core/include/backend/IDynamicTensorManager.h | 78 + .../onert/core/include/backend/IPortableTensor.h | 49 + runtime/onert/core/include/backend/IShapeFixer.h | 55 - .../core/include/backend/IStaticTensorManager.h | 35 + runtime/onert/core/include/backend/ITensor.h | 38 +- .../onert/core/include/backend/ITensorBuilder.h | 127 +- .../onert/core/include/backend/ITensorManager.h | 1 + .../onert/core/include/backend/ITensorRegister.h | 18 +- .../onert/core/include/backend/ITensorRegistry.h | 143 + .../include}/backend/cpu_common/Allocator.h | 0 .../backend/cpu_common/DynamicTensorManager.h | 73 + .../include/backend/cpu_common/IMemoryPlanner.h | 74 + .../include/backend/cpu_common/MemoryManager.h | 74 + .../backend/cpu_common/StaticTensorManager.h | 64 + .../onert/core/include/backend/cpu_common/Tensor.h | 142 + .../include/backend/cpu_common/TensorRegistry.h | 36 + .../onert/core/include/compiler/BackendManager.h | 29 +- runtime/onert/core/include/compiler/Compiler.h | 44 +- .../core/include/compiler/StaticShapeInference.h | 160 + .../core/include/exec/DynamicShapeInference.h | 140 + runtime/onert/core/include/exec/Execution.h | 26 +- .../onert/core/include/exec/ExecutionObservers.h | 83 - runtime/onert/core/include/exec/FunctionSequence.h | 56 +- runtime/onert/core/include/exec/IExecutor.h | 20 + runtime/onert/core/include/exec/IFunction.h | 1 - runtime/onert/core/include/exec/IODescription.h | 8 +- runtime/onert/core/include/exec/NopFunction.h | 6 - runtime/onert/core/include/ir/BackendSet.h | 40 - runtime/onert/core/include/ir/Coordinates.h | 9 + runtime/onert/core/include/ir/Data.h | 34 +- runtime/onert/core/include/ir/DataType.h | 29 +- runtime/onert/core/include/ir/Graph.h | 10 +- runtime/onert/core/include/ir/Index.h | 6 +- runtime/onert/core/include/ir/LowerInfoMap.h | 2 +- runtime/onert/core/include/ir/LoweredGraph.h | 17 +- runtime/onert/core/include/ir/OpCode.h | 2 + runtime/onert/core/include/ir/OpSequence.h | 54 +- runtime/onert/core/include/ir/OpSequences.h | 11 +- runtime/onert/core/include/ir/Operand.h | 24 +- .../onert/core/include/ir/OperandIndexSequence.h | 46 +- runtime/onert/core/include/ir/OperandInfo.h | 43 +- runtime/onert/core/include/ir/Operation.h | 5 +- runtime/onert/core/include/ir/OperationIndexList.h | 59 - runtime/onert/core/include/ir/OperationIndexSet.h | 65 + runtime/onert/core/include/ir/OperationVisitor.h | 8 +- runtime/onert/core/include/ir/Operations.Include.h | 26 +- runtime/onert/core/include/ir/Operations.lst | 26 +- runtime/onert/core/include/ir/Shape.h | 75 +- runtime/onert/core/include/ir/Subgraphs.h | 139 + runtime/onert/core/include/ir/operation/ArgMax.h | 2 +- .../core/include/ir/operation/BCQFullyConnected.h | 67 + .../onert/core/include/ir/operation/BCQGather.h | 66 + .../onert/core/include/ir/operation/BatchMatMul.h | 63 + .../onert/core/include/ir/operation/BroadcastTo.h | 52 + runtime/onert/core/include/ir/operation/Concat.h | 1 - runtime/onert/core/include/ir/operation/Cos.h | 49 + runtime/onert/core/include/ir/operation/Einsum.h | 57 + .../onert/core/include/ir/operation/ExpandDims.h | 52 + runtime/onert/core/include/ir/operation/Fill.h | 50 + .../core/include/ir/operation/FusedBatchNorm.h | 68 + runtime/onert/core/include/ir/operation/Gather.h | 1 - runtime/onert/core/include/ir/operation/If.h | 57 + .../core/include/ir/operation/L2Normalization.h | 15 +- runtime/onert/core/include/ir/operation/Log.h | 49 + .../onert/core/include/ir/operation/LogSoftmax.h | 64 + .../core/include/ir/operation/MatrixBandPart.h | 53 + runtime/onert/core/include/ir/operation/Mean.h | 5 +- runtime/onert/core/include/ir/operation/OneHot.h | 3 - runtime/onert/core/include/ir/operation/Pack.h | 1 - runtime/onert/core/include/ir/operation/Pad.h | 14 +- runtime/onert/core/include/ir/operation/Permute.h | 15 +- runtime/onert/core/include/ir/operation/Pow.h | 51 + runtime/onert/core/include/ir/operation/Range.h | 51 + runtime/onert/core/include/ir/operation/Reduce.h | 77 + .../onert/core/include/ir/operation/ReduceMax.h | 65 - .../onert/core/include/ir/operation/ReduceMin.h | 65 - .../onert/core/include/ir/operation/ReduceSum.h | 63 - runtime/onert/core/include/ir/operation/Reshape.h | 12 +- runtime/onert/core/include/ir/operation/Reverse.h | 50 + runtime/onert/core/include/ir/operation/Round.h | 49 + runtime/onert/core/include/ir/operation/Select.h | 51 + runtime/onert/core/include/ir/operation/Slice.h | 15 +- runtime/onert/core/include/ir/operation/Split.h | 1 - .../onert/core/include/ir/operation/StridedSlice.h | 1 - runtime/onert/core/include/ir/operation/Tile.h | 52 + .../onert/core/include/ir/operation/Transpose.h | 1 - runtime/onert/core/include/ir/operation/Unpack.h | 1 - runtime/onert/core/include/ir/operation/While.h | 58 + .../onert/core/include/ir/operation/ZerosLike.h | 49 + runtime/onert/core/include/util/Config.lst | 7 +- .../onert/core/include/util/EventCollectorGlobal.h | 155 - runtime/onert/core/include/util/Index.h | 15 + runtime/onert/core/include/util/ShapeInference.h | 135 +- .../onert/core/include/util/feature/nchw/Reader.h | 118 - .../onert/core/include/util/feature/nchw/View.h | 137 - .../onert/core/include/util/feature/nhwc/Reader.h | 120 - .../onert/core/include/util/feature/nhwc/View.h | 139 - runtime/onert/core/include/util/logging.h | 4 + runtime/onert/core/src/backend/BackendContext.cc | 11 +- .../onert/core/src/backend/IConstantInitializer.cc | 112 + runtime/onert/core/src/backend/ITensor.cc | 34 + .../onert/core/src/backend/controlflow/Backend.h | 83 + .../onert/core/src/backend/controlflow/Config.cc | 37 + .../onert/core/src/backend/controlflow/Config.h | 53 + .../src/backend/controlflow/ConstantInitializer.h | 52 + .../backend/controlflow/DynamicTensorManager.cc | 154 + .../src/backend/controlflow/DynamicTensorManager.h | 76 + .../src/backend/controlflow/KernelGenerator.cc | 215 + .../core/src/backend/controlflow/KernelGenerator.h | 73 + .../core/src/backend/controlflow/TensorBuilder.cc | 131 + .../core/src/backend/controlflow/TensorBuilder.h | 103 + .../core/src/backend/controlflow/UserTensor.cc | 40 + .../core/src/backend/controlflow/UserTensor.h | 84 + .../src/backend/controlflow/UserTensorRegistry.h | 36 + .../core/src/backend/controlflow/kernel/IfLayer.cc | 128 + .../core/src/backend/controlflow/kernel/IfLayer.h | 63 + .../src/backend/controlflow/kernel/PermuteLayer.cc | 78 + .../src/backend/controlflow/kernel/PermuteLayer.h | 77 + .../src/backend/controlflow/kernel/WhileLayer.cc | 216 + .../src/backend/controlflow/kernel/WhileLayer.h | 64 + .../onert/core/src/backend/cpu_common/Allocator.cc | 38 + .../src/backend/cpu_common/DynamicTensorManager.cc | 147 + .../core/src/backend/cpu_common/MemoryManager.cc | 107 + .../core/src/backend/cpu_common/MemoryPlanner.cc | 215 + .../core/src/backend/cpu_common/MemoryPlanner.h | 160 + .../src}/backend/cpu_common/MemoryPlanner.test.cc | 0 .../src/backend/cpu_common/MemoryPlannerFactory.cc | 53 + .../src/backend/cpu_common/MemoryPlannerFactory.h | 47 + .../src/backend/cpu_common/StaticTensorManager.cc | 115 + .../onert/core/src/backend/cpu_common/Tensor.cc | 43 + runtime/onert/core/src/compiler/BackendManager.cc | 129 +- .../onert/core/src/compiler/CachedDataDeleter.h | 103 - runtime/onert/core/src/compiler/Compiler.cc | 172 +- runtime/onert/core/src/compiler/ExecutorFactory.cc | 255 +- runtime/onert/core/src/compiler/ExecutorFactory.h | 27 +- .../onert/core/src/compiler/Fp32ToFp16Converter.cc | 952 ++ .../onert/core/src/compiler/Fp32ToFp16Converter.h | 101 + runtime/onert/core/src/compiler/HEScheduler.cc | 31 +- runtime/onert/core/src/compiler/HEScheduler.h | 6 +- runtime/onert/core/src/compiler/Linear.cc | 126 +- runtime/onert/core/src/compiler/ManualScheduler.cc | 50 +- runtime/onert/core/src/compiler/ManualScheduler.h | 10 +- .../onert/core/src/compiler/OperationValidator.cc | 1115 +- .../onert/core/src/compiler/OperationValidator.h | 25 +- .../core/src/compiler/StaticShapeInference.cc | 1322 ++ runtime/onert/core/src/compiler/TensorBuilders.h | 77 + runtime/onert/core/src/dumper/dot/DotBuilder.cc | 12 +- runtime/onert/core/src/dumper/dot/DotBuilder.h | 4 +- runtime/onert/core/src/dumper/dot/DotDumper.cc | 59 +- .../onert/core/src/dumper/dot/DotOpSequenceInfo.cc | 56 - .../onert/core/src/dumper/dot/DotOpSequenceInfo.h | 59 - .../onert/core/src/dumper/dot/DotSubgraphInfo.cc | 58 + .../onert/core/src/dumper/dot/DotSubgraphInfo.h | 61 + runtime/onert/core/src/dumper/dot/Node.h | 8 +- runtime/onert/core/src/exec/BackendSet.h | 40 + runtime/onert/core/src/exec/DataflowExecutor.cc | 34 +- runtime/onert/core/src/exec/DataflowExecutor.h | 8 +- .../onert/core/src/exec/DynamicShapeInference.cc | 1061 ++ .../onert/core/{include => src}/exec/ExecTime.h | 0 runtime/onert/core/src/exec/Execution.cc | 73 +- runtime/onert/core/src/exec/ExecutionObservers.cc | 52 +- runtime/onert/core/src/exec/ExecutionObservers.h | 88 + runtime/onert/core/src/exec/ExecutorBase.cc | 304 +- runtime/onert/core/src/exec/ExecutorBase.h | 77 +- runtime/onert/core/src/exec/FunctionSequence.cc | 49 +- runtime/onert/core/src/exec/IPermuteFunction.h | 287 + .../core/{include => src}/exec/JSONExecTime.h | 0 runtime/onert/core/src/exec/Job.cc | 4 +- runtime/onert/core/src/exec/Job.h | 10 +- runtime/onert/core/src/exec/LinearExecutor.cc | 28 +- runtime/onert/core/src/exec/LinearExecutor.h | 6 +- runtime/onert/core/src/exec/ParallelExecutor.cc | 26 +- runtime/onert/core/src/exec/ParallelExecutor.h | 4 +- runtime/onert/core/src/exec/ParallelScheduler.cc | 2 +- runtime/onert/core/src/exec/ParallelScheduler.h | 4 +- runtime/onert/core/src/exec/ShapeConverter.cc | 60 + runtime/onert/core/src/exec/ShapeConverter.h | 39 + runtime/onert/core/src/exec/Sink.h | 22 +- runtime/onert/core/src/exec/Source.h | 24 +- .../onert/core/src/exec/feature/IndexIterator.h | 104 + runtime/onert/core/src/exec/feature/Reader.h | 68 + runtime/onert/core/src/exec/feature/nchw/Reader.h | 119 + runtime/onert/core/src/exec/feature/nchw/View.h | 137 + runtime/onert/core/src/exec/feature/nhwc/Reader.h | 121 + runtime/onert/core/src/exec/feature/nhwc/View.h | 140 + runtime/onert/core/src/interp/ExecEnv.h | 54 +- runtime/onert/core/src/interp/InterpExecutor.cc | 48 +- .../core/{include => src}/interp/InterpExecutor.h | 0 runtime/onert/core/src/interp/InterpOps.lst | 5 +- runtime/onert/core/src/interp/Interpreter.cc | 16 +- runtime/onert/core/src/interp/Tensor.h | 6 + .../onert/core/src/interp/operations/AvgPool2D.cc | 5 +- .../src/interp/operations/BinaryArithmeticOps.cc | 33 +- runtime/onert/core/src/interp/operations/Concat.cc | 4 +- runtime/onert/core/src/interp/operations/Conv2D.cc | 5 +- .../core/src/interp/operations/DepthwiseConv2D.cc | 5 +- .../core/src/interp/operations/FullyConnected.cc | 3 +- runtime/onert/core/src/interp/operations/Gather.cc | 6 +- .../onert/core/src/interp/operations/MaxPool2D.cc | 5 +- .../core/src/interp/operations/OperationUtil.h | 23 +- .../onert/core/src/interp/operations/Softmax.cc | 2 +- runtime/onert/core/src/ir/DataType.cc | 55 + runtime/onert/core/src/ir/Graph.cc | 37 +- runtime/onert/core/src/ir/GraphIterator.cc | 59 +- runtime/onert/core/src/ir/GraphIterator.h | 8 + runtime/onert/core/src/ir/LoweredGraph.cc | 243 +- runtime/onert/core/src/ir/OpCode.cc | 10 + runtime/onert/core/src/ir/OpSequence.cc | 24 +- runtime/onert/core/src/ir/OpSequences.cc | 66 +- runtime/onert/core/src/ir/Operand.cc | 6 +- runtime/onert/core/src/ir/OperandIndexSequence.cc | 22 +- runtime/onert/core/src/ir/Operation.cc | 4 +- runtime/onert/core/src/ir/OperationDumper.cc | 627 +- runtime/onert/core/src/ir/OperationDumper.h | 28 +- runtime/onert/core/src/ir/OperationIndexList.cc | 37 - runtime/onert/core/src/ir/OperationIndexSet.cc | 37 + runtime/onert/core/src/ir/Shape.cc | 22 +- .../core/src/ir/operation/BCQFullyConnected.cc | 40 + runtime/onert/core/src/ir/operation/BCQGather.cc | 40 + runtime/onert/core/src/ir/operation/BatchMatMul.cc | 37 + runtime/onert/core/src/ir/operation/BroadcastTo.cc | 38 + runtime/onert/core/src/ir/operation/Cos.cc | 39 + runtime/onert/core/src/ir/operation/Einsum.cc | 37 + runtime/onert/core/src/ir/operation/ExpandDims.cc | 39 + runtime/onert/core/src/ir/operation/Fill.cc | 39 + .../onert/core/src/ir/operation/FusedBatchNorm.cc | 37 + runtime/onert/core/src/ir/operation/If.cc | 32 + .../onert/core/src/ir/operation/L2Normalization.cc | 4 +- runtime/onert/core/src/ir/operation/Log.cc | 39 + runtime/onert/core/src/ir/operation/LogSoftmax.cc | 40 + .../onert/core/src/ir/operation/MatrixBandPart.cc | 40 + runtime/onert/core/src/ir/operation/Mean.cc | 40 - runtime/onert/core/src/ir/operation/Pad.cc | 5 +- runtime/onert/core/src/ir/operation/Permute.cc | 7 +- runtime/onert/core/src/ir/operation/Pow.cc | 39 + runtime/onert/core/src/ir/operation/Range.cc | 39 + runtime/onert/core/src/ir/operation/Reduce.cc | 56 + runtime/onert/core/src/ir/operation/ReduceMax.cc | 40 - runtime/onert/core/src/ir/operation/ReduceMin.cc | 40 - runtime/onert/core/src/ir/operation/ReduceSum.cc | 40 - runtime/onert/core/src/ir/operation/Reshape.cc | 5 +- runtime/onert/core/src/ir/operation/Reverse.cc | 39 + runtime/onert/core/src/ir/operation/Round.cc | 39 + runtime/onert/core/src/ir/operation/Select.cc | 37 + runtime/onert/core/src/ir/operation/Slice.cc | 5 +- .../onert/core/src/ir/operation/StridedSlice.cc | 2 +- runtime/onert/core/src/ir/operation/Tile.cc | 39 + runtime/onert/core/src/ir/operation/While.cc | 33 + runtime/onert/core/src/ir/operation/ZerosLike.cc | 39 + .../core/src/ir/pass/ConstantInsertionPass.cc | 37 +- .../onert/core/src/ir/pass/ConstantLoweringPass.cc | 56 + .../onert/core/src/ir/pass/ConstantLoweringPass.h | 46 + .../core/src/ir/pass/PermutationEliminationPass.cc | 4 +- .../core/src/ir/pass/PermutationInsertionPass.cc | 75 +- .../core/src/ir/pass/PermutationOperationPass.cc | 152 +- .../core/src/ir/pass/PermutationOperationPass.h | 16 + runtime/onert/core/src/ir/verifier/Verifier.cc | 6 +- runtime/onert/core/src/util/EventCollector.cc | 104 + runtime/onert/core/src/util/EventCollector.h | 51 + .../onert/core/src/util/EventCollectorGlobal.cc | 14 +- runtime/onert/core/src/util/EventCollectorGlobal.h | 155 + runtime/onert/core/src/util/EventRecorder.cc | 260 + runtime/onert/core/src/util/EventRecorder.h | 82 + runtime/onert/core/src/util/ShapeInference.cc | 875 +- runtime/onert/frontend/base_loader/CMakeLists.txt | 4 + .../frontend/base_loader/include/base_loader.h | 888 +- runtime/onert/frontend/circle/CMakeLists.txt | 3 - .../onert/frontend/circle/include/circle_loader.h | 2 +- runtime/onert/frontend/circle/src/circle_loader.cc | 30 +- .../frontend/circle/src/circle_schema_generated.h | 172 +- runtime/onert/frontend/nnapi/CMakeLists.txt | 2 +- runtime/onert/frontend/nnapi/compilation.cc | 6 +- runtime/onert/frontend/nnapi/execution.cc | 20 +- runtime/onert/frontend/nnapi/model.cc | 13 +- .../nnapi/wrapper/ANeuralNetworksCompilation.cc | 13 +- .../nnapi/wrapper/ANeuralNetworksCompilation.h | 11 +- .../nnapi/wrapper/ANeuralNetworksExecution.cc | 67 +- .../nnapi/wrapper/ANeuralNetworksExecution.h | 6 +- .../frontend/nnapi/wrapper/ANeuralNetworksModel.cc | 26 +- .../frontend/nnapi/wrapper/ANeuralNetworksModel.h | 6 +- .../onert/frontend/nnapi/wrapper/NNAPIConvert.cc | 4 +- .../frontend/nnapi/wrapper/OperationFactory.cc | 464 +- runtime/onert/frontend/tflite/CMakeLists.txt | 3 - .../onert/frontend/tflite/include/tflite_loader.h | 2 +- runtime/onert/frontend/tflite/src/tflite_loader.cc | 23 +- runtime/onert/test/CMakeLists.txt | 2 +- runtime/onert/test/core/compiler/Scheduler.cc | 62 +- runtime/onert/test/core/exec/ExecInstance.cc | 51 +- runtime/onert/test/core/exec/ExecTime.test.cc | 8 +- runtime/onert/test/core/interp/ExecManager.cc | 40 +- runtime/onert/test/ir/Shape.cc | 58 + runtime/onert/test/util/ShapeInference.cc | 225 +- tests/custom_op/CMakeLists.txt | 2 +- tests/nnapi/nnapi_gtest.skip.aarch64-linux.acl_cl | 246 +- .../nnapi/nnapi_gtest.skip.aarch64-linux.acl_neon | 276 +- tests/nnapi/nnapi_gtest.skip.aarch64-linux.cpu | 251 +- tests/nnapi/nnapi_gtest.skip.aarch64-linux.srcn | 79 - tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_cl | 246 +- tests/nnapi/nnapi_gtest.skip.armv7l-linux.acl_neon | 266 +- tests/nnapi/nnapi_gtest.skip.armv7l-linux.cpu | 242 +- tests/nnapi/nnapi_gtest.skip.armv7l-linux.srcn | 79 - tests/nnapi/nnapi_gtest.skip.armv7l-tizen.acl_cl | 41 - tests/nnapi/nnapi_gtest.skip.noarch.interp | 664 +- tests/nnapi/nnapi_gtest.skip.x86_64-linux.cpu | 247 +- .../nnapi_test_generator/android-10/README.md | 3 + .../android-10/cts_generator.py | 3 +- .../android-10/dynamic_tensor.py | 115 + tests/nnapi/specs/Ex/add_v2_ex.mod.py | 19 + .../specs/Ex/batch_matmul_ex_dynamic_nnfw.mod.py | 32 + tests/nnapi/specs/Ex/batch_matmul_ex_float.mod.py | 115 + .../nnapi/specs/Ex/broadcast_to_ex_1D_nnfw.mod.py | 45 + .../nnapi/specs/Ex/broadcast_to_ex_2D_nnfw.mod.py | 48 + .../Ex/broadcast_to_ex_dynamic_2D_nnfw.mod.py | 61 + .../Ex/broadcast_to_ex_dynamic_3D_nnfw.mod.py | 63 + tests/nnapi/specs/Ex/cos_ex_1D_float_nnfw.mod.py | 13 + tests/nnapi/specs/Ex/cos_ex_4D_float_nnfw.mod.py | 17 + tests/nnapi/specs/Ex/cos_ex_dynamic_nnfw.mod.py | 64 + tests/nnapi/specs/Ex/einsum_ex_float.mod.py | 154 + tests/nnapi/specs/Ex/fill_ex_1D_float.mod.py | 17 + tests/nnapi/specs/Ex/fill_ex_4D_float.mod.py | 17 + tests/nnapi/specs/Ex/fill_ex_dynamic_nnfw.mod.py | 64 + ...ully_connected_float_2_weights_as_inputs.mod.py | 0 .../specs/Ex/fusedbatchnorm_ex_dynamic_nnfw.mod.py | 39 + .../nnapi/specs/Ex/fusedbatchnorm_ex_float.mod.py | 33 + .../specs/Ex/matrix_band_part_ex_4D_float.mod.py | 38 + .../Ex/matrix_band_part_ex_dynamic_nnfw.mod.py | 27 + .../nnapi/specs/Ex/one_hot_ex_dynamic_nnfw.mod.py | 61 + tests/nnapi/specs/Ex/pack_ex_2D_float_1.mod.py | 0 tests/nnapi/specs/Ex/pack_ex_2D_float_2.mod.py | 0 tests/nnapi/specs/Ex/pack_ex_2D_int_1.mod.py | 0 tests/nnapi/specs/Ex/pack_ex_2D_int_2.mod.py | 0 tests/nnapi/specs/Ex/pack_ex_dynamic_nnfw.mod.py | 113 + tests/nnapi/specs/Ex/range_ex_float_1.mod.py | 16 + .../Ex/range_ex_float_1_all_constant_inputs.mod.py | 17 + .../specs/Ex/range_ex_float_1_dynamic_nnfw.mod.py | 37 + tests/nnapi/specs/Ex/range_ex_float_2.mod.py | 16 + .../specs/Ex/range_ex_float_2_dynamic_nnfw.mod.py | 37 + tests/nnapi/specs/Ex/reverse_ex.mod.py | 29 + tests/nnapi/specs/Ex/reverse_ex_dynamic_1D.mod.py | 48 + tests/nnapi/specs/Ex/reverse_ex_dynamic_3D.mod.py | 50 + tests/nnapi/specs/Ex/round_ex_1D_float.mod.py | 15 + tests/nnapi/specs/Ex/round_ex_4D_float.mod.py | 16 + tests/nnapi/specs/Ex/round_ex_dynamic_nnfw.mod.py | 65 + tests/nnapi/specs/Ex/select_v2_ex.mod.py | 68 + ...lect_v2_ex_broadcast_2d_two_dynamic_nnfw.mod.py | 51 + tests/nnapi/specs/Ex/shape_ex_dynamic_nnfw.mod.py | 69 + .../specs/Ex/squared_difference_ex_1D_float.mod.py | 0 .../specs/Ex/squared_difference_ex_2D_float.mod.py | 0 .../specs/Ex/squared_difference_ex_3D_float.mod.py | 0 .../specs/Ex/squared_difference_ex_4D_float.mod.py | 0 ...ared_difference_ex_broadcast_4D_2D_float.mod.py | 0 .../squared_difference_ex_broadcast_float.mod.py | 0 .../Ex/squared_difference_ex_dynamic_nnfw.mod.py | 45 + .../specs/Ex/transpose_conv_ex_float_1.mod.py | 0 .../specs/Ex/transpose_conv_ex_float_2.mod.py | 0 .../specs/Ex/transpose_conv_ex_float_3.mod.py | 0 .../specs/Ex/transpose_conv_ex_float_4.mod.py | 0 tests/nnapi/specs/Ex/unpack_ex_3D_float_1.mod.py | 0 tests/nnapi/specs/Ex/unpack_ex_3D_float_2.mod.py | 0 tests/nnapi/specs/Ex/unpack_ex_3D_int_1.mod.py | 0 tests/nnapi/specs/Ex/unpack_ex_3D_int_2.mod.py | 0 tests/nnapi/specs/Ex/unpack_ex_dynamic_nnfw.mod.py | 95 + tests/nnapi/specs/Ex/zeros_like_ex_2D_float.mod.py | 15 + tests/nnapi/specs/Ex/zeros_like_ex_4D_int32.mod.py | 15 + .../specs/Ex/zeros_like_ex_dynamic_float32.mod.py | 49 + tests/nnapi/specs/V1_0/add.mod.py | 0 ...dd_broadcast_4D_2D_after_nops_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_0/add_broadcast_quant8.mod.py | 0 tests/nnapi/specs/V1_0/add_dynamic_nnfw.mod.py | 59 + tests/nnapi/specs/V1_0/add_quant8.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_float_1.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_float_2.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_float_3.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_float_4.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_float_5.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_quant8_3.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_quant8_4.mod.py | 0 tests/nnapi/specs/V1_0/avg_pool_quant8_5.mod.py | 0 tests/nnapi/specs/V1_0/concat_dynamic_nnfw.mod.py | 48 + tests/nnapi/specs/V1_0/concat_float_1.mod.py | 0 tests/nnapi/specs/V1_0/concat_float_2.mod.py | 0 tests/nnapi/specs/V1_0/concat_float_3.mod.py | 0 .../specs/V1_0/concat_float_4D_axis3_1_nnfw.mod.py | 0 tests/nnapi/specs/V1_0/concat_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/concat_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/concat_quant8_3.mod.py | 0 tests/nnapi/specs/V1_0/conv_1_h3_w2_SAME.mod.py | 0 tests/nnapi/specs/V1_0/conv_1_h3_w2_VALID.mod.py | 0 tests/nnapi/specs/V1_0/conv_3_h3_w2_SAME.mod.py | 0 tests/nnapi/specs/V1_0/conv_3_h3_w2_VALID.mod.py | 0 tests/nnapi/specs/V1_0/conv_dynamic_nnfw.mod.py | 79 + tests/nnapi/specs/V1_0/conv_float.mod.py | 0 tests/nnapi/specs/V1_0/conv_float_2.mod.py | 0 tests/nnapi/specs/V1_0/conv_float_channels.mod.py | 0 .../conv_float_channels_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/conv_float_large.mod.py | 0 .../V1_0/conv_float_large_weights_as_inputs.mod.py | 0 .../specs/V1_0/conv_float_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/conv_quant8.mod.py | 0 tests/nnapi/specs/V1_0/conv_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/conv_quant8_channels.mod.py | 0 .../conv_quant8_channels_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/conv_quant8_large.mod.py | 0 .../conv_quant8_large_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/conv_quant8_overflow.mod.py | 0 .../conv_quant8_overflow_weights_as_inputs.mod.py | 0 .../V1_0/conv_quant8_weights_as_inputs.mod.py | 0 .../nnapi/specs/V1_0/depth_to_space_float_1.mod.py | 0 .../nnapi/specs/V1_0/depth_to_space_float_2.mod.py | 0 .../nnapi/specs/V1_0/depth_to_space_float_3.mod.py | 0 .../specs/V1_0/depth_to_space_quant8_1.mod.py | 0 .../specs/V1_0/depth_to_space_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/depthwise_conv.mod.py | 0 .../nnapi/specs/V1_0/depthwise_conv2d_float.mod.py | 0 .../specs/V1_0/depthwise_conv2d_float_2.mod.py | 0 .../specs/V1_0/depthwise_conv2d_float_large.mod.py | 0 .../V1_0/depthwise_conv2d_float_large_2.mod.py | 0 ...e_conv2d_float_large_2_weights_as_inputs.mod.py | 0 ...ise_conv2d_float_large_weights_as_inputs.mod.py | 0 ...depthwise_conv2d_float_weights_as_inputs.mod.py | 0 .../specs/V1_0/depthwise_conv2d_quant8.mod.py | 0 .../specs/V1_0/depthwise_conv2d_quant8_2.mod.py | 0 .../V1_0/depthwise_conv2d_quant8_large.mod.py | 0 ...se_conv2d_quant8_large_weights_as_inputs.mod.py | 0 ...epthwise_conv2d_quant8_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/dequantize.mod.py | 0 tests/nnapi/specs/V1_0/embedding_lookup.mod.py | 0 .../specs/V1_0/embedding_lookup_2d_nnfw.mod.py | 0 .../specs/V1_0/embedding_lookup_4d_nnfw.mod.py | 0 tests/nnapi/specs/V1_0/floor_.mod.py | 0 .../specs/V1_0/fully_connected_dynamic_nnfw.mod.py | 70 + .../nnapi/specs/V1_0/fully_connected_float.mod.py | 0 .../specs/V1_0/fully_connected_float_1_nnfw.mod.py | 0 .../specs/V1_0/fully_connected_float_2.mod.py | 0 .../specs/V1_0/fully_connected_float_3.mod.py | 0 .../specs/V1_0/fully_connected_float_large.mod.py | 0 ..._connected_float_large_weights_as_inputs.mod.py | 0 .../fully_connected_float_weights_as_inputs.mod.py | 0 .../V1_0/fully_connected_hybrid_1_nnfw.mod.py | 0 .../V1_0/fully_connected_hybrid_2_nnfw.mod.py | 0 .../nnapi/specs/V1_0/fully_connected_quant8.mod.py | 0 .../specs/V1_0/fully_connected_quant8_2.mod.py | 0 .../specs/V1_0/fully_connected_quant8_large.mod.py | 0 ...connected_quant8_large_weights_as_inputs.mod.py | 0 ...fully_connected_quant8_weights_as_inputs.mod.py | 0 .../nnapi/specs/V1_0/hashtable_lookup_float.mod.py | 0 .../V1_0/hashtable_lookup_float_4D_nnfw.mod.py | 0 .../specs/V1_0/hashtable_lookup_quant8.mod.py | 0 tests/nnapi/specs/V1_0/l2_normalization.mod.py | 0 tests/nnapi/specs/V1_0/l2_normalization_2.mod.py | 0 .../nnapi/specs/V1_0/l2_normalization_large.mod.py | 0 tests/nnapi/specs/V1_0/l2_pool_float.mod.py | 0 tests/nnapi/specs/V1_0/l2_pool_float_2.mod.py | 0 tests/nnapi/specs/V1_0/l2_pool_float_large.mod.py | 0 .../specs/V1_0/local_response_norm_float_1.mod.py | 0 .../specs/V1_0/local_response_norm_float_2.mod.py | 0 .../specs/V1_0/local_response_norm_float_3.mod.py | 0 .../specs/V1_0/local_response_norm_float_4.mod.py | 0 .../nnapi/specs/V1_0/logistic_dynamic_nnfw.mod.py | 67 + tests/nnapi/specs/V1_0/logistic_float_1.mod.py | 0 tests/nnapi/specs/V1_0/logistic_float_2.mod.py | 0 tests/nnapi/specs/V1_0/logistic_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/logistic_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/lsh_projection.mod.py | 0 tests/nnapi/specs/V1_0/lsh_projection_2.mod.py | 0 .../V1_0/lsh_projection_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/lstm.mod.py | 0 tests/nnapi/specs/V1_0/lstm2.mod.py | 0 tests/nnapi/specs/V1_0/lstm2_state.mod.py | 0 tests/nnapi/specs/V1_0/lstm2_state2.mod.py | 0 tests/nnapi/specs/V1_0/lstm3.mod.py | 0 tests/nnapi/specs/V1_0/lstm3_state.mod.py | 0 tests/nnapi/specs/V1_0/lstm3_state2.mod.py | 0 tests/nnapi/specs/V1_0/lstm3_state3.mod.py | 0 tests/nnapi/specs/V1_0/lstm_state.mod.py | 0 tests/nnapi/specs/V1_0/lstm_state2.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_float_1.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_float_2.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_float_3.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_float_4.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_quant8_3.mod.py | 0 tests/nnapi/specs/V1_0/max_pool_quant8_4.mod.py | 0 tests/nnapi/specs/V1_0/maximum_dynamic_nnfw.mod.py | 77 + tests/nnapi/specs/V1_0/minimum_dynamic_nnfw.mod.py | 77 + tests/nnapi/specs/V1_0/mul.mod.py | 0 tests/nnapi/specs/V1_0/mul_4D_nnfw.mod.py | 0 .../specs/V1_0/mul_broadcast_3D_1D_1_nnfw.mod.py | 0 .../specs/V1_0/mul_broadcast_3D_1D_2_nnfw.mod.py | 0 tests/nnapi/specs/V1_0/mul_broadcast_quant8.mod.py | 0 .../nnapi/specs/V1_0/mul_float_square_nnfw.mod.py | 0 tests/nnapi/specs/V1_0/mul_quant8.mod.py | 0 tests/nnapi/specs/V1_0/mul_relu.mod.py | 0 tests/nnapi/specs/V1_0/relu1_float_1.mod.py | 0 tests/nnapi/specs/V1_0/relu1_float_2.mod.py | 0 tests/nnapi/specs/V1_0/relu1_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/relu1_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/relu6_float_1.mod.py | 0 tests/nnapi/specs/V1_0/relu6_float_2.mod.py | 0 tests/nnapi/specs/V1_0/relu6_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/relu6_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/relu_float_1.mod.py | 0 tests/nnapi/specs/V1_0/relu_float_2.mod.py | 0 tests/nnapi/specs/V1_0/relu_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/relu_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/reshape.mod.py | 0 tests/nnapi/specs/V1_0/reshape_dynamic_nnfw.mod.py | 68 + tests/nnapi/specs/V1_0/reshape_float_nnfw.mod.py | 18 + tests/nnapi/specs/V1_0/reshape_quant8.mod.py | 0 .../V1_0/reshape_quant8_weights_as_inputs.mod.py | 0 .../specs/V1_0/reshape_weights_as_inputs.mod.py | 0 tests/nnapi/specs/V1_0/resize_bilinear.mod.py | 0 tests/nnapi/specs/V1_0/resize_bilinear_2.mod.py | 0 tests/nnapi/specs/V1_0/rnn.mod.py | 0 tests/nnapi/specs/V1_0/rnn_state.mod.py | 0 tests/nnapi/specs/V1_0/softmax_dynamic_nnfw.mod.py | 70 + tests/nnapi/specs/V1_0/softmax_float_1.mod.py | 0 tests/nnapi/specs/V1_0/softmax_float_2.mod.py | 0 tests/nnapi/specs/V1_0/softmax_quant8_1.mod.py | 0 tests/nnapi/specs/V1_0/softmax_quant8_2.mod.py | 0 .../nnapi/specs/V1_0/space_to_depth_float_1.mod.py | 0 .../nnapi/specs/V1_0/space_to_depth_float_2.mod.py | 0 .../nnapi/specs/V1_0/space_to_depth_float_3.mod.py | 0 .../specs/V1_0/space_to_depth_quant8_1.mod.py | 0 .../specs/V1_0/space_to_depth_quant8_2.mod.py | 0 tests/nnapi/specs/V1_0/svdf.mod.py | 0 tests/nnapi/specs/V1_0/svdf2.mod.py | 0 tests/nnapi/specs/V1_0/svdf_bias_present.mod.py | 0 tests/nnapi/specs/V1_0/svdf_state.mod.py | 0 tests/nnapi/specs/V1_0/tanh_.mod.py | 0 .../nnapi/specs/{skip => }/V1_1/add_relaxed.mod.py | 0 .../V1_1/avg_pool_float_1_relaxed.mod.py | 0 .../V1_1/avg_pool_float_2_relaxed.mod.py | 0 .../V1_1/avg_pool_float_3_relaxed.mod.py | 0 .../V1_1/avg_pool_float_4_relaxed.mod.py | 0 .../V1_1/avg_pool_float_5_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/batch_to_space.mod.py | 0 .../nnapi/specs/V1_1/batch_to_space_float_1.mod.py | 0 .../specs/V1_1/batch_to_space_quant8_1.mod.py | 0 .../{skip => }/V1_1/concat_float_1_relaxed.mod.py | 0 .../{skip => }/V1_1/concat_float_2_relaxed.mod.py | 0 .../{skip => }/V1_1/concat_float_3_relaxed.mod.py | 0 .../V1_1/conv_1_h3_w2_SAME_relaxed.mod.py | 0 .../V1_1/conv_1_h3_w2_VALID_relaxed.mod.py | 0 .../V1_1/conv_3_h3_w2_SAME_relaxed.mod.py | 0 .../V1_1/conv_3_h3_w2_VALID_relaxed.mod.py | 0 .../{skip => }/V1_1/conv_float_2_relaxed.mod.py | 0 .../V1_1/conv_float_channels_relaxed.mod.py | 0 ...float_channels_weights_as_inputs_relaxed.mod.py | 0 .../V1_1/conv_float_large_relaxed.mod.py | 0 ...nv_float_large_weights_as_inputs_relaxed.mod.py | 0 .../{skip => }/V1_1/conv_float_relaxed.mod.py | 0 .../conv_float_weights_as_inputs_relaxed.mod.py | 0 .../V1_1/depthwise_conv2d_float_2_relaxed.mod.py | 0 .../depthwise_conv2d_float_large_2_relaxed.mod.py | 0 ..._float_large_2_weights_as_inputs_relaxed.mod.py | 0 .../depthwise_conv2d_float_large_relaxed.mod.py | 0 ...2d_float_large_weights_as_inputs_relaxed.mod.py | 0 .../V1_1/depthwise_conv2d_float_relaxed.mod.py | 0 ...e_conv2d_float_weights_as_inputs_relaxed.mod.py | 0 .../{skip => }/V1_1/depthwise_conv_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/div_.mod.py | 0 tests/nnapi/specs/V1_1/div_broadcast_float.mod.py | 0 .../V1_1/div_broadcast_float_4D_2D_nnfw.mod.py | 0 .../V1_1/fully_connected_float_2_relaxed.mod.py | 0 .../V1_1/fully_connected_float_4d_simple.mod.py | 0 .../fully_connected_float_4d_simple_relaxed.mod.py | 0 .../fully_connected_float_large_relaxed.mod.py | 0 ...ed_float_large_weights_as_inputs_relaxed.mod.py | 0 .../V1_1/fully_connected_float_relaxed.mod.py | 0 ...onnected_float_weights_as_inputs_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/mean.mod.py | 0 .../V1_1/mean_4D_float_reducing_C_nnfw.mod.py | 0 .../V1_1/mean_4D_float_reducing_HW_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/mean_axis01_1_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/mean_axis01_2_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/mean_float_1.mod.py | 0 tests/nnapi/specs/V1_1/mean_float_2.mod.py | 0 tests/nnapi/specs/V1_1/mean_quant8_1.mod.py | 0 tests/nnapi/specs/V1_1/mean_quant8_2.mod.py | 0 tests/nnapi/specs/V1_1/pad.mod.py | 0 tests/nnapi/specs/V1_1/pad_2D_HW_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/pad_3D_HWC_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/pad_BHWC_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/pad_BHW_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/pad_HWD_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/pad_dynamic_nnfw.mod.py | 125 + tests/nnapi/specs/V1_1/pad_float_1.mod.py | 0 tests/nnapi/specs/V1_1/pad_quant8_nnfw.mod.py | 0 .../{skip => }/V1_1/softmax_float_1_relaxed.mod.py | 0 .../{skip => }/V1_1/softmax_float_2_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/space_to_batch.mod.py | 0 .../V1_1/space_to_batch_dynamic_float_nnfw.mod.py | 70 + .../nnapi/specs/V1_1/space_to_batch_float_1.mod.py | 0 .../specs/V1_1/space_to_batch_float_1_nnfw.mod.py | 0 .../nnapi/specs/V1_1/space_to_batch_float_2.mod.py | 0 .../nnapi/specs/V1_1/space_to_batch_float_3.mod.py | 0 .../specs/V1_1/space_to_batch_quant8_1.mod.py | 0 .../specs/V1_1/space_to_batch_quant8_1_nnfw.mod.py | 0 .../specs/V1_1/space_to_batch_quant8_2.mod.py | 0 .../specs/V1_1/space_to_batch_quant8_2_nnfw.mod.py | 0 .../specs/V1_1/space_to_batch_quant8_3.mod.py | 0 tests/nnapi/specs/V1_1/squeeze.mod.py | 0 .../specs/V1_1/squeeze_2D_float_1_nnfw.mod.py | 0 .../specs/V1_1/squeeze_dynamic_float_nnfw.mod.py | 45 + tests/nnapi/specs/V1_1/squeeze_float_1.mod.py | 0 .../{skip => }/V1_1/squeeze_float_1_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/squeeze_quant8_1.mod.py | 0 .../specs/{skip => }/V1_1/squeeze_relaxed.mod.py | 0 tests/nnapi/specs/V1_1/strided_slice.mod.py | 0 .../specs/V1_1/strided_slice_dynamic_nnfw.mod.py | 70 + .../nnapi/specs/V1_1/strided_slice_float_1.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_10.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_11.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_2.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_3.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_4.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_5.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_6.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_7.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_8.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_float_9.mod.py | 0 .../specs/V1_1/strided_slice_qaunt8_10.mod.py | 0 .../specs/V1_1/strided_slice_qaunt8_11.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_1.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_2.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_3.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_4.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_5.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_6.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_7.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_8.mod.py | 0 .../nnapi/specs/V1_1/strided_slice_quant8_9.mod.py | 0 tests/nnapi/specs/V1_1/sub.mod.py | 0 .../V1_1/sub_broadcast_4D_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/sub_broadcast_float.mod.py | 0 tests/nnapi/specs/V1_1/transpose.mod.py | 0 tests/nnapi/specs/V1_1/transpose_2D_nnfw.mod.py | 0 tests/nnapi/specs/V1_1/transpose_3D_nnfw.mod.py | 0 .../nnapi/specs/V1_1/transpose_dynamic_nnfw.mod.py | 20 + tests/nnapi/specs/V1_1/transpose_float_1.mod.py | 0 tests/nnapi/specs/V1_1/transpose_quant8_1.mod.py | 0 tests/nnapi/specs/V1_2/abs_.mod.py | 0 tests/nnapi/specs/V1_2/abs_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/abs_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/abs_3D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/abs_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/abs_dynamic_nnfw.mod.py | 65 + tests/nnapi/specs/V1_2/argmax_1.mod.py | 0 tests/nnapi/specs/V1_2/argmax_2.mod.py | 0 tests/nnapi/specs/V1_2/argmax_3.mod.py | 0 tests/nnapi/specs/V1_2/argmax_dynamic_nnfw.mod.py | 69 + tests/nnapi/specs/V1_2/argmax_float_1_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/argmax_float_2_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/argmax_int32_nnfw.mod.py | 0 .../specs/V1_2/argmax_neg_axis_float_nnfw.mod.py | 0 .../specs/V1_2/argmax_neg_axis_int32_nnfw.mod.py | 0 .../specs/V1_2/argmax_quant8_neg_axis_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/argmax_quant8_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/cast.mod.py | 0 .../V1_2/cast_dynamic_float32_to_int32_nnfw.mod.py | 65 + .../specs/V1_2/cast_float32_to_int32_nnfw.mod.py | 0 .../specs/V1_2/cast_int32_to_float32_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/div_dynamic_nnfw.mod.py | 71 + tests/nnapi/specs/V1_2/equal.mod.py | 0 tests/nnapi/specs/V1_2/equal_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/equal_4D_float_nnfw.mod.py | 0 .../V1_2/equal_broadcast_4D_2D_float_nnfw.mod.py | 0 .../specs/V1_2/equal_broadcast_float_nnfw.mod.py | 0 .../specs/V1_2/equal_broadcast_quant8_nnfw.mod.py | 19 + .../specs/V1_2/equal_dynamic_float_nnfw.mod.py | 49 + tests/nnapi/specs/V1_2/equal_quant8_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/exp_.mod.py | 0 tests/nnapi/specs/V1_2/exp_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/exp_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/exp_3D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/exp_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/exp_dynamic_nnfw.mod.py | 64 + .../nnapi/specs/{skip => }/V1_2/expand_dims.mod.py | 0 .../specs/V1_2/expand_dims_dynamic_nnfw.mod.py | 45 + tests/nnapi/specs/V1_2/gather.mod.py | 0 tests/nnapi/specs/V1_2/gather_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/gather_1D_int32_nnfw.mod.py | 0 .../nnapi/specs/V1_2/gather_1D_quant8_nnfw.mod.py | 0 .../specs/V1_2/gather_2D_2D_float_1_nnfw.mod.py | 0 .../specs/V1_2/gather_2D_2D_float_2_nnfw.mod.py | 0 .../specs/V1_2/gather_2D_3D_float_1_nnfw.mod.py | 0 .../specs/V1_2/gather_2D_3D_float_2_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/gather_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/gather_2D_int32_nnfw.mod.py | 0 .../nnapi/specs/V1_2/gather_2D_quant8_nnfw.mod.py | 0 .../specs/V1_2/gather_3D_2D_float_1_nnfw.mod.py | 0 .../specs/V1_2/gather_3D_2D_float_2_nnfw.mod.py | 0 .../specs/V1_2/gather_3D_2D_float_3_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/gather_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/gather_dynamic_nnfw.mod.py | 89 + tests/nnapi/specs/V1_2/gather_higher_rank.mod.py | 0 .../V1_2/greater_broadcast_quant8_nnfw.mod.py | 19 + .../specs/V1_2/greater_dynamic_float_nnfw.mod.py | 49 + tests/nnapi/specs/V1_2/greater_equal.mod.py | 0 .../greater_equal_broadcast_quant8_nnfw.mod.py | 19 + .../V1_2/greater_equal_dynamic_float_nnfw.mod.py | 49 + tests/nnapi/specs/V1_2/greater_equal_nnfw.mod.py | 0 .../specs/V1_2/greater_equal_quant8_nnfw.mod.py | 18 + tests/nnapi/specs/V1_2/greater_quant8_nnfw.mod.py | 18 + tests/nnapi/specs/V1_2/less.mod.py | 0 .../specs/V1_2/less_broadcast_quant8_nnfw.mod.py | 19 + .../specs/V1_2/less_dynamic_float_nnfw.mod.py | 49 + .../V1_2/less_equal_broadcast_quant8_nnfw.mod.py | 19 + .../V1_2/less_equal_dynamic_float_nnfw.mod.py | 49 + .../nnapi/specs/V1_2/less_equal_quant8_nnfw.mod.py | 18 + tests/nnapi/specs/V1_2/less_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/less_quant8_nnfw.mod.py | 18 + tests/nnapi/specs/V1_2/log_4D_float_nnfw.mod.py | 17 + tests/nnapi/specs/V1_2/log_dynamic_nnfw.mod.py | 64 + tests/nnapi/specs/V1_2/log_softmax_nnfw.mod.py | 73 + tests/nnapi/specs/V1_2/logical_and.mod.py | 0 tests/nnapi/specs/V1_2/logical_and_1D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_and_2D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_and_3D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_and_4D_nnfw.mod.py | 0 .../V1_2/logical_and_broadcast_4D_2D_nnfw.mod.py | 0 .../specs/V1_2/logical_and_broadcast_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_not.mod.py | 0 tests/nnapi/specs/V1_2/logical_not_1D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_not_4D_nnfw.mod.py | 0 .../specs/V1_2/logical_not_dynamic_nnfw.mod.py | 65 + tests/nnapi/specs/V1_2/logical_or.mod.py | 0 tests/nnapi/specs/V1_2/logical_or_1D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_or_2D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_or_3D_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_or_4D_nnfw.mod.py | 0 .../V1_2/logical_or_broadcast_4D_2D_nnfw.mod.py | 0 .../specs/V1_2/logical_or_broadcast_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/logical_or_dynamic_nnfw.py | 53 + tests/nnapi/specs/V1_2/maximum.mod.py | 0 tests/nnapi/specs/V1_2/maximum_quant8_nnfw.mod.py | 34 + tests/nnapi/specs/V1_2/minimum.mod.py | 0 tests/nnapi/specs/V1_2/minimum_quant8_nnfw.mod.py | 32 + tests/nnapi/specs/V1_2/mul_dynamic_nnfw.mod.py | 71 + tests/nnapi/specs/V1_2/neg.mod.py | 0 tests/nnapi/specs/V1_2/neg_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_3D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_3D_int_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_4D_int_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/neg_dynamic_nnfw.mod.py | 64 + tests/nnapi/specs/V1_2/not_equal.mod.py | 0 .../not_equal_broadcast_4D_2D_float_nnfw.mod.py | 0 .../V1_2/not_equal_broadcast_float_nnfw.mod.py | 0 .../V1_2/not_equal_broadcast_quant8_nnfw.mod.py | 19 + .../specs/V1_2/not_equal_dynamic_float_nnfw.mod.py | 49 + tests/nnapi/specs/V1_2/not_equal_float_nnfw.mod.py | 0 .../nnapi/specs/V1_2/not_equal_quant8_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/pow_2D_float_nnfw.mod.py | 30 + .../specs/V1_2/pow_broadcast_float_nnfw.mod.py | 42 + tests/nnapi/specs/V1_2/pow_dynamic_nnfw.mod.py | 69 + tests/nnapi/specs/V1_2/prelu.mod.py | 0 .../specs/V1_2/prelu_broadcast_float_1_nnfw.mod.py | 0 .../V1_2/prelu_broadcast_quant8_1_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/prelu_float_1_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/prelu_quant8_1_nnfw.mod.py | 0 .../nnapi/specs/{skip => }/V1_2/reduce_all.mod.py | 0 tests/nnapi/specs/V1_2/reduce_all_2D_nnfw.mod.py | 19 + tests/nnapi/specs/V1_2/reduce_all_4D_nnfw.mod.py | 19 + .../specs/V1_2/reduce_all_dynamic_nnfw.mod.py | 31 + .../nnapi/specs/{skip => }/V1_2/reduce_any.mod.py | 0 tests/nnapi/specs/V1_2/reduce_any_2D_nnfw.mod.py | 19 + tests/nnapi/specs/V1_2/reduce_any_4D_nnfw.mod.py | 19 + tests/nnapi/specs/V1_2/reduce_max.mod.py | 0 .../specs/V1_2/reduce_max_2D_float_nnfw.mod.py | 0 .../specs/V1_2/reduce_max_2D_int32_nnfw.mod.py | 0 .../reduce_max_4D_float_reducing_C_nnfw.mod.py | 0 .../reduce_max_4D_float_reducing_HW_nnfw.mod.py | 0 .../specs/V1_2/reduce_max_float_1_nnfw.mod.py | 0 .../specs/V1_2/reduce_max_float_2_nnfw.mod.py | 0 .../nnapi/specs/V1_2/reduce_max_float_nnfw.mod.py | 0 .../specs/V1_2/reduce_max_quant8_1_nnfw.mod.py | 0 .../specs/V1_2/reduce_max_quant8_2_nnfw.mod.py | 0 .../specs/V1_2/reduce_mean_dynamic_1_nnfw.mod.py | 68 + .../specs/V1_2/reduce_mean_dynamic_2_nnfw.mod.py | 68 + tests/nnapi/specs/V1_2/reduce_min.mod.py | 0 .../specs/V1_2/reduce_min_dynamic_nnfw.mod.py | 60 + .../specs/V1_2/reduce_min_float_1_nnfw.mod.py | 0 .../specs/V1_2/reduce_min_float_2_nnfw.mod.py | 0 .../nnapi/specs/V1_2/reduce_min_float_nnfw.mod.py | 0 .../nnapi/specs/{skip => }/V1_2/reduce_prod.mod.py | 0 .../specs/V1_2/reduce_prod_2D_float_nnfw.mod.py | 19 + .../specs/V1_2/reduce_prod_4D_float_nnfw.mod.py | 19 + .../reduce_prod_4D_float_reducing_C_nnfw.mod.py | 33 + .../reduce_prod_4D_float_reducing_HW_nnfw.mod.py | 33 + .../specs/V1_2/reduce_prod_dynamic_1_nnfw.mod.py | 73 + .../specs/V1_2/reduce_prod_dynamic_2_nnfw.mod.py | 73 + tests/nnapi/specs/V1_2/reduce_sum.mod.py | 0 .../specs/V1_2/reduce_sum_2D_float_nnfw.mod.py | 0 .../specs/V1_2/reduce_sum_4D_float_nnfw.mod.py | 0 .../reduce_sum_4D_float_reducing_C_nnfw.mod.py | 0 .../reduce_sum_4D_float_reducing_HW_nnfw.mod.py | 0 .../specs/V1_2/reduce_sum_dynamic_1_nnfw.mod.py | 73 + .../specs/V1_2/reduce_sum_dynamic_2_nnfw.mod.py | 73 + tests/nnapi/specs/V1_2/rsqrt.mod.py | 0 tests/nnapi/specs/V1_2/rsqrt_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/rsqrt_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/rsqrt_3D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/rsqrt_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/rsqrt_dynamic_nnfw.mod.py | 66 + .../nnapi/specs/{skip => }/V1_2/select_v1_2.mod.py | 0 tests/nnapi/specs/V1_2/sin_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sin_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sin_dynamic_nnfw.mod.py | 64 + tests/nnapi/specs/V1_2/slice.mod.py | 0 tests/nnapi/specs/V1_2/slice_dynamic_nnfw.mod.py | 66 + tests/nnapi/specs/V1_2/split_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/split_1D_int32_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_float_1_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_float_2_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_float_3_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_int32_1_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_int32_2_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_int32_3_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_int32_4_nnfw.mod.py | 0 .../nnapi/specs/V1_2/split_4D_int32_5_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/split_4D_quant8_nnfw.mod.py | 0 .../specs/V1_2/split_dynamic_float_nnfw.mod.py | 52 + tests/nnapi/specs/V1_2/split_float_1.mod.py | 0 tests/nnapi/specs/V1_2/split_float_2.mod.py | 0 tests/nnapi/specs/V1_2/split_float_3.mod.py | 0 tests/nnapi/specs/V1_2/split_float_4.mod.py | 0 tests/nnapi/specs/V1_2/split_float_5.mod.py | 0 tests/nnapi/specs/V1_2/split_int32_1.mod.py | 0 tests/nnapi/specs/V1_2/split_int32_2.mod.py | 0 tests/nnapi/specs/V1_2/split_int32_3.mod.py | 0 tests/nnapi/specs/V1_2/split_int32_4.mod.py | 0 tests/nnapi/specs/V1_2/split_quant8_1.mod.py | 0 tests/nnapi/specs/V1_2/split_quant8_2.mod.py | 0 tests/nnapi/specs/V1_2/split_quant8_3.mod.py | 0 tests/nnapi/specs/V1_2/split_quant8_4.mod.py | 0 tests/nnapi/specs/V1_2/sqrt_.mod.py | 0 tests/nnapi/specs/V1_2/sqrt_1D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sqrt_2D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sqrt_3D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sqrt_4D_float_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/sub_dynamic_nnfw.mod.py | 51 + tests/nnapi/specs/V1_2/sub_v1_2.mod.py | 0 tests/nnapi/specs/V1_2/sub_v1_2_broadcast.mod.py | 0 tests/nnapi/specs/V1_2/tanh_v1_2.mod.py | 0 tests/nnapi/specs/V1_2/tanh_v1_dynamic_nnfw.mod.py | 61 + tests/nnapi/specs/{skip => }/V1_2/tile_1.mod.py | 0 .../specs/V1_2/tile_1_dynamic_float32_nnfw.mod.py | 33 + tests/nnapi/specs/{skip => }/V1_2/tile_2.mod.py | 0 .../specs/V1_2/tile_2_dynamic_float32_nnfw.mod.py | 36 + tests/nnapi/specs/{skip => }/V1_2/tile_3.mod.py | 0 .../specs/V1_2/tile_3_dynamic_float32_nnfw.mod.py | 37 + tests/nnapi/specs/V1_2/topk_v2.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_1D_float_nnfw.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_1D_int32_nnfw.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_1D_quant8_nnfw.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_2D_float_nnfw.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_2D_int32_nnfw.mod.py | 0 .../nnapi/specs/V1_2/topk_v2_2D_quant8_nnfw.mod.py | 0 tests/nnapi/specs/V1_2/transpose_v1_2.mod.py | 0 .../V1_0/mobilenet_224_gender_basic_fixed.mod.py | 0 .../specs/skip/V1_0/mobilenet_quantized.mod.py | 0 .../V1_1/batch_to_space_float_1_relaxed.mod.py | 0 .../specs/skip/V1_1/batch_to_space_relaxed.mod.py | 0 .../V1_1/depth_to_space_float_1_relaxed.mod.py | 0 .../V1_1/depth_to_space_float_2_relaxed.mod.py | 0 .../V1_1/depth_to_space_float_3_relaxed.mod.py | 0 .../specs/skip/V1_1/dequantize_relaxed.mod.py | 0 .../skip/V1_1/div_broadcast_float_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/div_relaxed.mod.py | 0 .../skip/V1_1/embedding_lookup_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/floor_relaxed.mod.py | 0 .../V1_1/hashtable_lookup_float_relaxed.mod.py | 0 .../skip/V1_1/l2_normalization_2_relaxed.mod.py | 0 .../V1_1/l2_normalization_large_relaxed.mod.py | 0 .../skip/V1_1/l2_normalization_relaxed.mod.py | 0 .../specs/skip/V1_1/l2_pool_float_2_relaxed.mod.py | 0 .../skip/V1_1/l2_pool_float_large_relaxed.mod.py | 0 .../specs/skip/V1_1/l2_pool_float_relaxed.mod.py | 0 .../local_response_norm_float_1_relaxed.mod.py | 0 .../local_response_norm_float_2_relaxed.mod.py | 0 .../local_response_norm_float_3_relaxed.mod.py | 0 .../local_response_norm_float_4_relaxed.mod.py | 0 .../skip/V1_1/logistic_float_1_relaxed.mod.py | 0 .../skip/V1_1/logistic_float_2_relaxed.mod.py | 0 .../skip/V1_1/lsh_projection_2_relaxed.mod.py | 0 .../specs/skip/V1_1/lsh_projection_relaxed.mod.py | 0 ...lsh_projection_weights_as_inputs_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/lstm2_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm2_state2_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm2_state_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/lstm3_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm3_state2_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm3_state3_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm3_state_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/lstm_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm_state2_relaxed.mod.py | 0 .../specs/skip/V1_1/lstm_state_relaxed.mod.py | 0 .../skip/V1_1/max_pool_float_1_relaxed.mod.py | 0 .../skip/V1_1/max_pool_float_2_relaxed.mod.py | 0 .../skip/V1_1/max_pool_float_3_relaxed.mod.py | 0 .../skip/V1_1/max_pool_float_4_relaxed.mod.py | 0 .../specs/skip/V1_1/mean_float_1_relaxed.mod.py | 0 .../specs/skip/V1_1/mean_float_2_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/mean_relaxed.mod.py | 0 ...mobilenet_224_gender_basic_fixed_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/mul_relaxed.mod.py | 0 .../nnapi/specs/skip/V1_1/mul_relu_relaxed.mod.py | 0 .../specs/skip/V1_1/pad_float_1_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/pad_relaxed.mod.py | 0 .../specs/skip/V1_1/relu1_float_1_relaxed.mod.py | 0 .../specs/skip/V1_1/relu1_float_2_relaxed.mod.py | 0 .../specs/skip/V1_1/relu6_float_1_relaxed.mod.py | 0 .../specs/skip/V1_1/relu6_float_2_relaxed.mod.py | 0 .../specs/skip/V1_1/relu_float_1_relaxed.mod.py | 0 .../specs/skip/V1_1/relu_float_2_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/reshape_relaxed.mod.py | 0 .../V1_1/reshape_weights_as_inputs_relaxed.mod.py | 0 .../skip/V1_1/resize_bilinear_2_relaxed.mod.py | 0 .../specs/skip/V1_1/resize_bilinear_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/rnn_relaxed.mod.py | 0 .../nnapi/specs/skip/V1_1/rnn_state_relaxed.mod.py | 0 .../V1_1/space_to_batch_float_1_relaxed.mod.py | 0 .../V1_1/space_to_batch_float_2_relaxed.mod.py | 0 .../V1_1/space_to_batch_float_3_relaxed.mod.py | 0 .../specs/skip/V1_1/space_to_batch_relaxed.mod.py | 0 .../V1_1/space_to_depth_float_1_relaxed.mod.py | 0 .../V1_1/space_to_depth_float_2_relaxed.mod.py | 0 .../V1_1/space_to_depth_float_3_relaxed.mod.py | 0 .../V1_1/strided_slice_float_10_relaxed.mod.py | 0 .../V1_1/strided_slice_float_11_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_1_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_2_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_3_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_4_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_5_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_6_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_7_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_8_relaxed.mod.py | 0 .../skip/V1_1/strided_slice_float_9_relaxed.mod.py | 0 .../specs/skip/V1_1/strided_slice_relaxed.mod.py | 0 .../skip/V1_1/sub_broadcast_float_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/sub_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/svdf2_relaxed.mod.py | 0 .../skip/V1_1/svdf_bias_present_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/svdf_relaxed.mod.py | 0 .../specs/skip/V1_1/svdf_state_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_1/tanh_relaxed.mod.py | 0 .../skip/V1_1/transpose_float_1_relaxed.mod.py | 0 .../nnapi/specs/skip/V1_1/transpose_relaxed.mod.py | 0 tests/nnapi/specs/skip/V1_2/add_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/argmin_1.mod.py | 0 tests/nnapi/specs/skip/V1_2/argmin_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/argmin_3.mod.py | 0 tests/nnapi/specs/skip/V1_2/avg_pool_v1_2.mod.py | 0 .../skip/V1_2/axis_aligned_bbox_transform.mod.py | 0 .../specs/skip/V1_2/batch_to_space_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/bbox_graph.mod.py | 0 .../skip/V1_2/bidirectional_sequence_lstm.mod.py | 0 .../bidirectional_sequence_lstm_aux_input.mod.py | 0 ...idirectional_sequence_lstm_cifg_peephole.mod.py | 0 ...tional_sequence_lstm_float16_batch_major.mod.py | 0 ...uence_lstm_float16_batch_major_aux_input.mod.py | 0 ...e_lstm_float16_batch_major_merge_outputs.mod.py | 0 ...idirectional_sequence_lstm_merge_outputs.mod.py | 0 ...directional_sequence_lstm_norm_fw_output.mod.py | 0 .../skip/V1_2/bidirectional_sequence_rnn.mod.py | 0 .../skip/V1_2/box_with_nms_limit_gaussian.mod.py | 0 .../specs/skip/V1_2/box_with_nms_limit_hard.mod.py | 0 .../skip/V1_2/box_with_nms_limit_linear.mod.py | 0 tests/nnapi/specs/skip/V1_2/channel_shuffle.mod.py | 0 .../nnapi/specs/skip/V1_2/concat_float16_1.mod.py | 0 .../nnapi/specs/skip/V1_2/concat_float16_2.mod.py | 0 .../nnapi/specs/skip/V1_2/concat_float16_3.mod.py | 0 .../specs/skip/V1_2/concat_mixed_quant.mod.py | 0 .../nnapi/specs/skip/V1_2/concat_zero_sized.mod.py | 0 tests/nnapi/specs/skip/V1_2/conv2d_dilation.mod.py | 0 .../specs/skip/V1_2/conv2d_per_channel.mod.py | 0 tests/nnapi/specs/skip/V1_2/conv2d_v1_2.mod.py | 0 .../specs/skip/V1_2/depth_to_space_v1_2.mod.py | 0 .../skip/V1_2/depthwise_conv2d_dilation.mod.py | 0 .../skip/V1_2/depthwise_conv2d_per_channel.mod.py | 0 .../specs/skip/V1_2/depthwise_conv2d_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/dequantize_v1_2.mod.py | 0 .../specs/skip/V1_2/detection_postprocess.mod.py | 0 tests/nnapi/specs/skip/V1_2/div_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/floor_float16.mod.py | 0 .../specs/skip/V1_2/fully_connected_v1_2.mod.py | 0 .../specs/skip/V1_2/generate_proposals.mod.py | 0 tests/nnapi/specs/skip/V1_2/greater.mod.py | 0 tests/nnapi/specs/skip/V1_2/grouped_conv2d.mod.py | 0 .../specs/skip/V1_2/heatmap_max_keypoint.mod.py | 0 .../specs/skip/V1_2/instance_normalization.mod.py | 0 .../specs/skip/V1_2/l2_normalization_axis.mod.py | 0 .../specs/skip/V1_2/l2_normalization_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/l2_pool_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/layer_norm_lstm.mod.py | 0 tests/nnapi/specs/skip/V1_2/less_equal.mod.py | 0 .../V1_2/local_response_normalization_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/log.mod.py | 0 tests/nnapi/specs/skip/V1_2/log_softmax.mod.py | 0 tests/nnapi/specs/skip/V1_2/logistic_v1_2.mod.py | 0 .../skip/V1_2/lsh_projection_3_relaxed.mod.py | 0 .../skip/V1_2/lsh_projection_4_relaxed.mod.py | 0 .../skip/V1_2/lsh_projection_deprecated.mod.py | 0 .../specs/skip/V1_2/lsh_projection_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/lstm2_float16.mod.py | 0 .../specs/skip/V1_2/lstm2_state2_float16.mod.py | 0 .../specs/skip/V1_2/lstm2_state_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/lstm3_float16.mod.py | 0 .../specs/skip/V1_2/lstm3_state2_float16.mod.py | 0 .../specs/skip/V1_2/lstm3_state3_float16.mod.py | 0 .../specs/skip/V1_2/lstm3_state_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/lstm_float16.mod.py | 0 .../specs/skip/V1_2/lstm_state2_float16.mod.py | 0 .../specs/skip/V1_2/lstm_state_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/max_pool_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/mean_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/mul_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_all_dims.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_low_rank.mod.py | 0 .../specs/skip/V1_2/pad_low_rank_quant8.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_quant8.mod.py | 0 .../specs/skip/V1_2/pad_quant8_nonzero.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_v2_1_float.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_v2_1_quant8.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_v2_all_dims.mod.py | 0 .../specs/skip/V1_2/pad_v2_all_dims_quant8.mod.py | 0 tests/nnapi/specs/skip/V1_2/pad_v2_low_rank.mod.py | 0 .../specs/skip/V1_2/pad_v2_low_rank_quant8.mod.py | 0 tests/nnapi/specs/skip/V1_2/pow.mod.py | 0 tests/nnapi/specs/skip/V1_2/quantize.mod.py | 0 tests/nnapi/specs/skip/V1_2/quantized_lstm.mod.py | 0 .../specs/skip/V1_2/random_multinomial.mod.py | 0 .../skip/V1_2/random_multinomial_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/relu1_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/relu6_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/relu_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/reshape_float16.mod.py | 0 .../specs/skip/V1_2/resize_bilinear_v1_2.mod.py | 0 .../specs/skip/V1_2/resize_nearest_neighbor.mod.py | 0 tests/nnapi/specs/skip/V1_2/rnn_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/roi_align.mod.py | 0 tests/nnapi/specs/skip/V1_2/roi_pooling.mod.py | 0 tests/nnapi/specs/skip/V1_2/sin.mod.py | 0 tests/nnapi/specs/skip/V1_2/softmax_v1_2.mod.py | 0 .../skip/V1_2/space_to_batch_quant8_nonzero.mod.py | 0 .../specs/skip/V1_2/space_to_batch_v1_2.mod.py | 0 .../specs/skip/V1_2/space_to_depth_v1_2.mod.py | 0 tests/nnapi/specs/skip/V1_2/squeeze_float16.mod.py | 0 .../specs/skip/V1_2/strided_slice_float16.mod.py | 0 .../V1_2/sub_quantized_different_scales.mod.py | 0 .../skip/V1_2/svdf_bias_present_float16.mod.py | 0 tests/nnapi/specs/skip/V1_2/svdf_float16.mod.py | 0 .../specs/skip/V1_2/svdf_state_float16.mod.py | 0 .../nnapi/specs/skip/V1_2/transpose_conv2d.mod.py | 0 .../specs/skip/V1_2/transpose_conv2d_large.mod.py | 0 .../nnapi/specs/skip/V1_2/transpose_float16.mod.py | 0 .../V1_2/unidirectional_sequence_lstm_1step.mod.py | 0 ...stm_batch_major_norm_peephole_projection.mod.py | 0 ...stm_batch_major_peephole_projection_bias.mod.py | 0 ...idirectional_sequence_lstm_cifg_peephole.mod.py | 0 ...irectional_sequence_lstm_f16_batch_major.mod.py | 0 ...quence_lstm_f16_norm_peephole_projection.mod.py | 0 ...l_sequence_lstm_layer_norm_cifg_peephole.mod.py | 0 ...l_sequence_lstm_norm_peephole_projection.mod.py | 0 .../skip/V1_2/unidirectional_sequence_rnn.mod.py | 0 tests/nnapi/src/TestValidation.cpp | 2 - tests/nnfw_api/CMakeLists.txt | 2 +- tests/nnfw_api/README.md | 28 + tests/nnfw_api/src/FourOneOpModelSetInput.cc | 36 - tests/nnfw_api/src/ModelTestDynamicTensor.cc | 512 + tests/nnfw_api/src/ModelTestInputReshaping.cc | 90 + tests/nnfw_api/src/NNPackages.cc | 96 + tests/nnfw_api/src/NNPackages.h | 100 + tests/nnfw_api/src/RegressionTests.cc | 38 + tests/nnfw_api/src/ValidationTestAddModelLoaded.cc | 91 + .../src/ValidationTestAddSessionPrepared.cc | 164 + .../src/ValidationTestFourAddModelsSetInput.cc | 44 + tests/nnfw_api/src/ValidationTestSessionCreated.cc | 118 + tests/nnfw_api/src/ValidationTestSingleSession.cc | 107 + tests/nnfw_api/src/common.cc | 40 + tests/nnfw_api/src/common.h | 26 + tests/nnfw_api/src/create_session.cc | 30 - tests/nnfw_api/src/fixtures.h | 111 +- tests/nnfw_api/src/load_model.cc | 47 - tests/nnfw_api/src/main.cc | 22 +- tests/nnfw_api/src/model_path.cc | 58 - tests/nnfw_api/src/model_path.h | 62 - tests/nnfw_api/src/prepare.cc | 27 - tests/scripts/README.md | 44 + tests/scripts/benchmark_nnapi.sh | 2 +- tests/scripts/benchmark_nnpkg.sh | 2 +- tests/scripts/common.sh | 4 +- .../tests/MODELS/mobilenet_quant8/config.sh | 2 + tests/scripts/framework/tests/select/config.sh | 1 + tests/scripts/framework/tests/tile/config.sh | 1 + tests/scripts/framework/tests/zeros_like/config.sh | 1 + .../list/frameworktest_list.aarch64.cpu.txt | 7 +- .../scripts/list/frameworktest_list.armv7l.cpu.txt | 6 + .../scripts/list/frameworktest_list.x86_64.cpu.txt | 6 + .../list/nnpkg_test_list.armv7l-linux.acl_cl | 0 .../list/nnpkg_test_list.armv7l-linux.acl_neon | 0 .../scripts/list/nnpkg_test_list.armv7l-linux.cpu | 0 .../scripts/list/nnpkg_test_list.armv7l-linux.srcn | 0 .../scripts/list/nnpkg_test_list.noarch.interp | 0 tests/scripts/merge_result_of_benchmark_nnpkg.py | 28 + .../install_nnfw_api_gtest_nnpackages.sh | 148 + .../models/add/config.sh | 0 .../models/add_invalid_manifest/config.sh | 1 + .../models/add_no_manifest/config.sh | 1 + .../models/add_unspecified_rank_inputs/config.sh | 1 + .../models/dynamic_tensor_reshape/config.sh | 1 + .../nnfw_api_gtest/models/if_dynamic/config.sh | 1 + .../models/input_reshaping_add/config.sh | 1 + tests/scripts/nnfw_api_gtest/models/neg/config.sh | 1 + .../models/unknown_dim_input_concat/config.sh | 1 + .../nnfw_api_gtest/models/while_dynamic/config.sh | 1 + tests/scripts/nnpkg_test.sh | 136 + .../oneapi_test/install_oneapi_test_nnpackages.sh | 142 - tests/scripts/test-driver.sh | 11 +- tests/scripts/test_scheduler_with_profiling.sh | 2 +- tests/scripts/unittest.sh | 12 +- tests/tools/nnapi_test/CMakeLists.txt | 9 + tests/tools/nnapi_test/src/args.cc | 116 + tests/tools/nnapi_test/src/args.h | 53 + tests/tools/nnapi_test/src/nnapi_test.cc | 22 +- tests/tools/nnpackage_run/CMakeLists.txt | 38 +- tests/tools/nnpackage_run/src/args.cc | 260 +- tests/tools/nnpackage_run/src/args.h | 20 +- tests/tools/nnpackage_run/src/h5formatter.cc | 27 +- tests/tools/nnpackage_run/src/h5formatter.h | 4 +- tests/tools/nnpackage_run/src/nnfw_util.cc | 2 + tests/tools/nnpackage_run/src/nnpackage_run.cc | 404 +- tests/tools/nnpackage_run/src/randomgen.cc | 74 + tests/tools/nnpackage_run/src/randomgen.h | 40 + tests/tools/tflite_benchmark/CMakeLists.txt | 10 - .../tools/tflite_benchmark/src/tflite_benchmark.cc | 329 - tests/tools/tflite_benchmark_model/CMakeLists.txt | 4 +- tests/tools/tflite_loader/CMakeLists.txt | 4 +- tests/tools/tflite_loader/src/args.cc | 19 +- tests/tools/tflite_loader/src/tflite_loader.cc | 42 +- tests/tools/tflite_run/CMakeLists.txt | 7 +- tests/tools/tflite_run/src/args.cc | 60 +- tests/tools/tflite_run/src/args.h | 6 + tests/tools/tflite_run/src/tflite_run.cc | 143 +- tests/tools/tflite_run_2_2_0/CMakeLists.txt | 23 + tests/tools/tflite_run_2_2_0/src/args.cc | 208 + tests/tools/tflite_run_2_2_0/src/args.h | 73 + tests/tools/tflite_run_2_2_0/src/tensor_view.h | 117 + .../tools/tflite_run_2_2_0/src/tflite_run_2_2_0.cc | 276 + ...build_android_ndk.sh => install_android_ndk.sh} | 0 tools/cross/{build_rootfs.sh => install_rootfs.sh} | 0 tools/kbenchmark/CMakeLists.txt | 2 +- tools/kbenchmark/kernels/acl_cl/CMakeLists.txt | 2 +- tools/kbenchmark/kernels/acl_neon/CMakeLists.txt | 2 +- tools/kernel_report/kernel_report.py | 71 +- tools/nnpackage_tool/gen_golden/gen_golden.py | 42 +- tools/nnpackage_tool/nnpkg_test/README.md | 42 - tools/nnpackage_tool/nnpkg_test/nnpkg_test.sh | 123 - tools/nnpackage_tool/sth2nnpkgtc/pb2nnpkgtc.md | 20 +- tools/nnpackage_tool/sth2nnpkgtc/tflite2nnpkgtc.md | 2 +- tools/nnpackage_tool/tf2tfliteV2/README.md | 47 - tools/nnpackage_tool/tf2tfliteV2/tf2tfliteV2.py | 173 - tools/opencl_tool/CMakeLists.txt | 2 +- tools/tflitefile_tool/README.md | 15 + tools/tflitefile_tool/select_operator.py | 261 +- tools/tflitefile_tool/subgraph_printer.py | 26 +- tools/tflitefile_tool/tensor_printer.py | 6 +- tools/tflitefile_tool/tflite/AbsOptions.py | 2 +- .../tflite/ActivationFunctionType.py | 2 +- tools/tflitefile_tool/tflite/AddNOptions.py | 2 +- tools/tflitefile_tool/tflite/AddOptions.py | 2 +- tools/tflitefile_tool/tflite/ArgMaxOptions.py | 2 +- tools/tflitefile_tool/tflite/ArgMinOptions.py | 2 +- tools/tflitefile_tool/tflite/BatchMatMulOptions.py | 52 + .../tflite/BatchToSpaceNDOptions.py | 2 +- .../tflite/BidirectionalSequenceLSTMOptions.py | 17 +- .../tflite/BidirectionalSequenceRNNOptions.py | 17 +- tools/tflitefile_tool/tflite/Buffer.py | 2 +- tools/tflitefile_tool/tflite/BuiltinOperator.py | 6 +- tools/tflitefile_tool/tflite/BuiltinOptions.py | 6 +- tools/tflitefile_tool/tflite/CallOptions.py | 2 +- tools/tflitefile_tool/tflite/CastOptions.py | 2 +- tools/tflitefile_tool/tflite/CombinerType.py | 2 +- .../tflite/ConcatEmbeddingsOptions.py | 2 +- .../tflitefile_tool/tflite/ConcatenationOptions.py | 2 +- tools/tflitefile_tool/tflite/Conv2DOptions.py | 2 +- tools/tflitefile_tool/tflite/CosOptions.py | 2 +- .../tflitefile_tool/tflite/CustomOptionsFormat.py | 2 +- tools/tflitefile_tool/tflite/CustomQuantization.py | 2 +- tools/tflitefile_tool/tflite/DensifyOptions.py | 28 + .../tflitefile_tool/tflite/DepthToSpaceOptions.py | 2 +- .../tflite/DepthwiseConv2DOptions.py | 2 +- tools/tflitefile_tool/tflite/DequantizeOptions.py | 2 +- tools/tflitefile_tool/tflite/DimensionMetadata.py | 102 + tools/tflitefile_tool/tflite/DimensionType.py | 8 + tools/tflitefile_tool/tflite/DivOptions.py | 2 +- .../tflite/EmbeddingLookupSparseOptions.py | 2 +- tools/tflitefile_tool/tflite/EqualOptions.py | 2 +- tools/tflitefile_tool/tflite/ExpOptions.py | 2 +- tools/tflitefile_tool/tflite/ExpandDimsOptions.py | 2 +- tools/tflitefile_tool/tflite/FakeQuantOptions.py | 2 +- tools/tflitefile_tool/tflite/FillOptions.py | 2 +- tools/tflitefile_tool/tflite/FloorDivOptions.py | 2 +- tools/tflitefile_tool/tflite/FloorModOptions.py | 2 +- .../tflite/FullyConnectedOptions.py | 16 +- .../tflite/FullyConnectedOptionsWeightsFormat.py | 2 +- tools/tflitefile_tool/tflite/GatherNdOptions.py | 2 +- tools/tflitefile_tool/tflite/GatherOptions.py | 2 +- .../tflitefile_tool/tflite/GreaterEqualOptions.py | 2 +- tools/tflitefile_tool/tflite/GreaterOptions.py | 2 +- tools/tflitefile_tool/tflite/HardSwishOptions.py | 2 +- tools/tflitefile_tool/tflite/IfOptions.py | 2 +- tools/tflitefile_tool/tflite/Int32Vector.py | 61 + tools/tflitefile_tool/tflite/L2NormOptions.py | 2 +- .../tflitefile_tool/tflite/LSHProjectionOptions.py | 2 +- tools/tflitefile_tool/tflite/LSHProjectionType.py | 2 +- tools/tflitefile_tool/tflite/LSTMKernelType.py | 2 +- tools/tflitefile_tool/tflite/LSTMOptions.py | 16 +- tools/tflitefile_tool/tflite/LeakyReluOptions.py | 2 +- tools/tflitefile_tool/tflite/LessEqualOptions.py | 2 +- tools/tflitefile_tool/tflite/LessOptions.py | 2 +- .../tflite/LocalResponseNormalizationOptions.py | 2 +- tools/tflitefile_tool/tflite/LogSoftmaxOptions.py | 2 +- tools/tflitefile_tool/tflite/LogicalAndOptions.py | 2 +- tools/tflitefile_tool/tflite/LogicalNotOptions.py | 2 +- tools/tflitefile_tool/tflite/LogicalOrOptions.py | 2 +- tools/tflitefile_tool/tflite/MatrixDiagOptions.py | 2 +- .../tflitefile_tool/tflite/MatrixSetDiagOptions.py | 2 +- .../tflite/MaximumMinimumOptions.py | 2 +- tools/tflitefile_tool/tflite/Metadata.py | 2 +- tools/tflitefile_tool/tflite/MirrorPadMode.py | 2 +- tools/tflitefile_tool/tflite/MirrorPadOptions.py | 2 +- tools/tflitefile_tool/tflite/Model.py | 2 +- tools/tflitefile_tool/tflite/MulOptions.py | 2 +- tools/tflitefile_tool/tflite/NegOptions.py | 2 +- .../tflite/NonMaxSuppressionV4Options.py | 2 +- .../tflite/NonMaxSuppressionV5Options.py | 2 +- tools/tflitefile_tool/tflite/NotEqualOptions.py | 2 +- tools/tflitefile_tool/tflite/OneHotOptions.py | 2 +- tools/tflitefile_tool/tflite/Operator.py | 2 +- tools/tflitefile_tool/tflite/OperatorCode.py | 2 +- tools/tflitefile_tool/tflite/PackOptions.py | 2 +- tools/tflitefile_tool/tflite/PadOptions.py | 2 +- tools/tflitefile_tool/tflite/PadV2Options.py | 2 +- tools/tflitefile_tool/tflite/Padding.py | 2 +- tools/tflitefile_tool/tflite/Pool2DOptions.py | 2 +- tools/tflitefile_tool/tflite/PowOptions.py | 2 +- .../tflitefile_tool/tflite/QuantizationDetails.py | 2 +- .../tflite/QuantizationParameters.py | 2 +- tools/tflitefile_tool/tflite/QuantizeOptions.py | 2 +- tools/tflitefile_tool/tflite/RNNOptions.py | 16 +- tools/tflitefile_tool/tflite/RangeOptions.py | 2 +- tools/tflitefile_tool/tflite/RankOptions.py | 2 +- tools/tflitefile_tool/tflite/ReducerOptions.py | 2 +- tools/tflitefile_tool/tflite/ReshapeOptions.py | 2 +- .../tflite/ResizeBilinearOptions.py | 16 +- .../tflite/ResizeNearestNeighborOptions.py | 2 +- .../tflite/ReverseSequenceOptions.py | 2 +- tools/tflitefile_tool/tflite/ReverseV2Options.py | 2 +- tools/tflitefile_tool/tflite/SVDFOptions.py | 16 +- tools/tflitefile_tool/tflite/ScatterNdOptions.py | 2 +- tools/tflitefile_tool/tflite/SegmentSumOptions.py | 28 + tools/tflitefile_tool/tflite/SelectOptions.py | 2 +- tools/tflitefile_tool/tflite/SelectV2Options.py | 28 + tools/tflitefile_tool/tflite/SequenceRNNOptions.py | 16 +- tools/tflitefile_tool/tflite/ShapeOptions.py | 2 +- tools/tflitefile_tool/tflite/SkipGramOptions.py | 2 +- tools/tflitefile_tool/tflite/SliceOptions.py | 2 +- tools/tflitefile_tool/tflite/SoftmaxOptions.py | 2 +- .../tflite/SpaceToBatchNDOptions.py | 2 +- .../tflitefile_tool/tflite/SpaceToDepthOptions.py | 2 +- tools/tflitefile_tool/tflite/SparseIndexVector.py | 10 + .../tflitefile_tool/tflite/SparseToDenseOptions.py | 2 +- tools/tflitefile_tool/tflite/SparsityParameters.py | 123 + tools/tflitefile_tool/tflite/SplitOptions.py | 2 +- tools/tflitefile_tool/tflite/SplitVOptions.py | 2 +- tools/tflitefile_tool/tflite/SquareOptions.py | 2 +- .../tflite/SquaredDifferenceOptions.py | 2 +- tools/tflitefile_tool/tflite/SqueezeOptions.py | 2 +- .../tflitefile_tool/tflite/StridedSliceOptions.py | 2 +- tools/tflitefile_tool/tflite/SubGraph.py | 2 +- tools/tflitefile_tool/tflite/SubOptions.py | 2 +- tools/tflitefile_tool/tflite/Tensor.py | 53 +- tools/tflitefile_tool/tflite/TensorType.py | 3 +- tools/tflitefile_tool/tflite/TileOptions.py | 2 +- tools/tflitefile_tool/tflite/TopKV2Options.py | 2 +- .../tflitefile_tool/tflite/TransposeConvOptions.py | 2 +- tools/tflitefile_tool/tflite/TransposeOptions.py | 2 +- tools/tflitefile_tool/tflite/Uint16Vector.py | 61 + tools/tflitefile_tool/tflite/Uint8Vector.py | 61 + .../tflite/UnidirectionalSequenceLSTMOptions.py | 17 +- tools/tflitefile_tool/tflite/UniqueOptions.py | 2 +- tools/tflitefile_tool/tflite/UnpackOptions.py | 2 +- tools/tflitefile_tool/tflite/WhereOptions.py | 2 +- tools/tflitefile_tool/tflite/WhileOptions.py | 2 +- tools/tflitefile_tool/tflite/ZerosLikeOptions.py | 2 +- tools/tflitefile_tool/tflite/__init__.py | 0 tools/update_version/update-version | 50 + 4162 files changed, 173961 insertions(+), 55671 deletions(-) create mode 100644 .readthedocs.yml create mode 100644 compiler/adtidas/README.md create mode 100644 compiler/ann-api/README.md create mode 100644 compiler/arser/CMakeLists.txt create mode 100644 compiler/arser/README.md create mode 100644 compiler/arser/include/arser/arser.h create mode 100644 compiler/arser/tests/arser.test.cpp delete mode 100644 compiler/circle-inspect/src/Model.cpp delete mode 100644 compiler/circle-inspect/src/Model.h create mode 100644 compiler/circle-quantizer/CMakeLists.txt create mode 100644 compiler/circle-quantizer/README.md create mode 100644 compiler/circle-quantizer/include/CircleExpContract.h create mode 100644 compiler/circle-quantizer/requires.cmake create mode 100644 compiler/circle-quantizer/src/CircleExpContract.cpp create mode 100644 compiler/circle-quantizer/src/CircleQuantizer.cpp create mode 100644 compiler/circle-tensordump/CMakeLists.txt create mode 100644 compiler/circle-tensordump/README.md create mode 100644 compiler/circle-tensordump/driver/Driver.cpp create mode 100644 compiler/circle-tensordump/requires.cmake create mode 100644 compiler/circle-tensordump/src/Dump.cpp create mode 100644 compiler/circle-tensordump/src/Dump.h create mode 100644 compiler/circle-tensordump/src/Reader.cpp create mode 100644 compiler/circle-tensordump/src/Reader.h delete mode 100644 compiler/circle-verify/src/Model.cpp delete mode 100644 compiler/circle-verify/src/Model.h create mode 100644 compiler/circle2circle-dredd-recipe-test/CMakeLists.txt create mode 100644 compiler/circle2circle-dredd-recipe-test/README.md create mode 100644 compiler/circle2circle-dredd-recipe-test/requires.cmake create mode 100644 compiler/circle2circle-dredd-recipe-test/test.lst create mode 100755 compiler/circle2circle-dredd-recipe-test/testall.sh delete mode 100644 compiler/circle2circle/src/Model.cpp create mode 100644 compiler/circlechef/CMakeLists.txt create mode 100644 compiler/circlechef/README.md create mode 100644 compiler/circlechef/circle/CMakeLists.txt create mode 100644 compiler/circlechef/circle/include/circlechef/RecipeChef.h create mode 100644 compiler/circlechef/circle/src/CircleImport.cpp create mode 100644 compiler/circlechef/circle/src/CircleImport.h create mode 100644 compiler/circlechef/circle/src/CircleOpChef.h create mode 100644 compiler/circlechef/circle/src/CircleOpChefs.h create mode 100644 compiler/circlechef/circle/src/CircleOpRegistry.h create mode 100644 compiler/circlechef/circle/src/Convert.cpp create mode 100644 compiler/circlechef/circle/src/Convert.h create mode 100644 compiler/circlechef/circle/src/Op/BCQFullyConnected.cpp create mode 100644 compiler/circlechef/circle/src/Op/BCQFullyConnected.h create mode 100644 compiler/circlechef/circle/src/Op/BCQGather.cpp create mode 100644 compiler/circlechef/circle/src/Op/BCQGather.h create mode 100644 compiler/circlechef/circle/src/Op/BatchMatMul.cpp create mode 100644 compiler/circlechef/circle/src/Op/BatchMatMul.h create mode 100644 compiler/circlechef/circle/src/Op/InstanceNorm.cpp create mode 100644 compiler/circlechef/circle/src/Op/InstanceNorm.h create mode 100644 compiler/circlechef/circle/src/RecipeChef.cpp create mode 100644 compiler/circlechef/core/CMakeLists.txt create mode 100644 compiler/circlechef/core/include/circlechef/ModelChef.h create mode 100644 compiler/circlechef/core/src/Arguments.h create mode 100644 compiler/circlechef/core/src/Convert.cpp create mode 100644 compiler/circlechef/core/src/Convert.h create mode 100644 compiler/circlechef/core/src/ModelChef.cpp create mode 100644 compiler/circlechef/core/src/Op/BCQFullyConnected.cpp create mode 100644 compiler/circlechef/core/src/Op/BCQFullyConnected.h create mode 100644 compiler/circlechef/core/src/Op/BCQGather.cpp create mode 100644 compiler/circlechef/core/src/Op/BCQGather.h create mode 100644 compiler/circlechef/core/src/Op/BatchMatMul.cpp create mode 100644 compiler/circlechef/core/src/Op/BatchMatMul.h create mode 100644 compiler/circlechef/core/src/Op/InstanceNorm.cpp create mode 100644 compiler/circlechef/core/src/Op/InstanceNorm.h create mode 100644 compiler/circlechef/core/src/OpChef.def create mode 100644 compiler/circlechef/core/src/OpChef.h create mode 100644 compiler/circlechef/core/src/OpChefs.h create mode 100644 compiler/circlechef/log/CMakeLists.txt create mode 100644 compiler/circlechef/log/include/Log.h create mode 100644 compiler/circlechef/log/include/LoggingContext.h create mode 100644 compiler/circlechef/log/src/Log.cpp create mode 100644 compiler/circlechef/log/src/LoggingContext.cpp create mode 100644 compiler/circlechef/proto/CMakeLists.txt create mode 100644 compiler/circlechef/proto/circlechef.proto create mode 100644 compiler/circlechef/requires.cmake create mode 100644 compiler/circlechef/tests/CMakeLists.txt create mode 100755 compiler/circlechef/tests/runvalidate.sh create mode 100644 compiler/circlechef/tools/CMakeLists.txt create mode 100644 compiler/circlechef/tools/console/CMakeLists.txt create mode 100644 compiler/circlechef/tools/console/Driver.cpp create mode 100644 compiler/circlechef/tools/file/CMakeLists.txt create mode 100644 compiler/circlechef/tools/file/Driver.cpp create mode 100644 compiler/circlechef/tools/reverse/CMakeLists.txt create mode 100644 compiler/circlechef/tools/reverse/Driver.cpp create mode 100644 compiler/common-artifacts/CMakeLists.txt create mode 100644 compiler/common-artifacts/README.md create mode 100644 compiler/common-artifacts/exclude.lst create mode 100644 compiler/common-artifacts/requires.cmake create mode 100644 compiler/common-artifacts/src/TestDataGenerator.cpp create mode 100644 compiler/enco-intf/README.md create mode 100644 compiler/fipe/README.md create mode 100644 compiler/foder/CMakeLists.txt create mode 100644 compiler/foder/README.md create mode 100644 compiler/foder/include/foder/FileLoader.h create mode 100644 compiler/imgdata2hdf5/CMakeLists.txt create mode 100644 compiler/imgdata2hdf5/README.md create mode 100755 compiler/imgdata2hdf5/imgdata2hdf5.py create mode 100644 compiler/loco/include/loco/IR/CastHelpers.h create mode 100644 compiler/locop/requires.cmake create mode 100644 compiler/logo/include/logo/DeadNodeQueryService.h create mode 100644 compiler/logo/include/logo/RemoveDeadNodeWithQueryPass.h create mode 100644 compiler/logo/src/Passes/RemoveDeadNodeWithQueryPass.cpp create mode 100644 compiler/luci-interpreter/CMakeLists.txt create mode 100644 compiler/luci-interpreter/include/luci_interpreter/Interpreter.h create mode 100644 compiler/luci-interpreter/include/luci_interpreter/core/DataType.h create mode 100644 compiler/luci-interpreter/include/luci_interpreter/core/Tensor.h create mode 100644 compiler/luci-interpreter/requires.cmake create mode 100644 compiler/luci-interpreter/src/CMakeLists.txt create mode 100644 compiler/luci-interpreter/src/Interpreter.cpp create mode 100644 compiler/luci-interpreter/src/core/CMakeLists.txt create mode 100644 compiler/luci-interpreter/src/core/EventNotifier.h create mode 100644 compiler/luci-interpreter/src/core/Kernel.h create mode 100644 compiler/luci-interpreter/src/core/KernelParams.h create mode 100644 compiler/luci-interpreter/src/core/RuntimeGraph.cpp create mode 100644 compiler/luci-interpreter/src/core/RuntimeGraph.h create mode 100644 compiler/luci-interpreter/src/core/RuntimeModule.h create mode 100644 compiler/luci-interpreter/src/core/Tensor.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Add.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Add.h create mode 100644 compiler/luci-interpreter/src/kernels/Add.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/ArgMax.cpp create mode 100644 compiler/luci-interpreter/src/kernels/ArgMax.h create mode 100644 compiler/luci-interpreter/src/kernels/ArgMax.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/AveragePool2D.cpp create mode 100644 compiler/luci-interpreter/src/kernels/AveragePool2D.h create mode 100644 compiler/luci-interpreter/src/kernels/AveragePool2D.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/CMakeLists.txt create mode 100644 compiler/luci-interpreter/src/kernels/Concatenation.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Concatenation.h create mode 100644 compiler/luci-interpreter/src/kernels/Concatenation.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Conv2D.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Conv2D.h create mode 100644 compiler/luci-interpreter/src/kernels/Conv2D.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp create mode 100644 compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h create mode 100644 compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Elu.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Elu.h create mode 100644 compiler/luci-interpreter/src/kernels/Elu.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/FullyConnected.cpp create mode 100644 compiler/luci-interpreter/src/kernels/FullyConnected.h create mode 100644 compiler/luci-interpreter/src/kernels/FullyConnected.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/If.cpp create mode 100644 compiler/luci-interpreter/src/kernels/If.h create mode 100644 compiler/luci-interpreter/src/kernels/If.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/L2Normalize.cpp create mode 100644 compiler/luci-interpreter/src/kernels/L2Normalize.h create mode 100644 compiler/luci-interpreter/src/kernels/L2Normalize.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/L2Pool2D.cpp create mode 100644 compiler/luci-interpreter/src/kernels/L2Pool2D.h create mode 100644 compiler/luci-interpreter/src/kernels/L2Pool2D.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/LeakyRelu.cpp create mode 100644 compiler/luci-interpreter/src/kernels/LeakyRelu.h create mode 100644 compiler/luci-interpreter/src/kernels/LeakyRelu.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/LocalResponseNormalization.cpp create mode 100644 compiler/luci-interpreter/src/kernels/LocalResponseNormalization.h create mode 100644 compiler/luci-interpreter/src/kernels/LocalResponseNormalization.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Logistic.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Logistic.h create mode 100644 compiler/luci-interpreter/src/kernels/Logistic.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/MaxPool2D.cpp create mode 100644 compiler/luci-interpreter/src/kernels/MaxPool2D.h create mode 100644 compiler/luci-interpreter/src/kernels/MaxPool2D.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Mean.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Mean.h create mode 100644 compiler/luci-interpreter/src/kernels/Mean.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Mul.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Mul.h create mode 100644 compiler/luci-interpreter/src/kernels/Mul.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Pad.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Pad.h create mode 100644 compiler/luci-interpreter/src/kernels/Pad.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Reshape.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Reshape.h create mode 100644 compiler/luci-interpreter/src/kernels/Reshape.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Softmax.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Softmax.h create mode 100644 compiler/luci-interpreter/src/kernels/Softmax.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/SpaceToDepth.cpp create mode 100644 compiler/luci-interpreter/src/kernels/SpaceToDepth.h create mode 100644 compiler/luci-interpreter/src/kernels/SpaceToDepth.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Split.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Split.h create mode 100644 compiler/luci-interpreter/src/kernels/Split.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Squeeze.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Squeeze.h create mode 100644 compiler/luci-interpreter/src/kernels/Squeeze.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/StridedSlice.cpp create mode 100644 compiler/luci-interpreter/src/kernels/StridedSlice.h create mode 100644 compiler/luci-interpreter/src/kernels/StridedSlice.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/TestUtils.cpp create mode 100644 compiler/luci-interpreter/src/kernels/TestUtils.h create mode 100644 compiler/luci-interpreter/src/kernels/Transpose.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Transpose.h create mode 100644 compiler/luci-interpreter/src/kernels/Transpose.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/TransposeConv.cpp create mode 100644 compiler/luci-interpreter/src/kernels/TransposeConv.h create mode 100644 compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Unpack.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Unpack.h create mode 100644 compiler/luci-interpreter/src/kernels/Unpack.test.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Utils.cpp create mode 100644 compiler/luci-interpreter/src/kernels/Utils.h create mode 100644 compiler/luci-interpreter/src/loader/CMakeLists.txt create mode 100644 compiler/luci-interpreter/src/loader/GraphLoader.cpp create mode 100644 compiler/luci-interpreter/src/loader/GraphLoader.h create mode 100644 compiler/luci-interpreter/src/loader/KernelBuilder.cpp create mode 100644 compiler/luci-interpreter/src/loader/KernelBuilder.h create mode 100644 compiler/luci-interpreter/src/loader/ModuleLoader.cpp create mode 100644 compiler/luci-interpreter/src/loader/ModuleLoader.h create mode 100644 compiler/luci-interpreter/src/loader/RuntimeToIR.h create mode 100644 compiler/luci-value-test/CMakeLists.txt create mode 100644 compiler/luci-value-test/README.md create mode 100755 compiler/luci-value-test/evalverify.sh create mode 100755 compiler/luci-value-test/luci_eval_verifier.py create mode 100644 compiler/luci-value-test/requires.cmake create mode 100644 compiler/luci-value-test/test.lst create mode 100644 compiler/luci-value-test/tester/CMakeLists.txt create mode 100644 compiler/luci-value-test/tester/src/CircleExpContract.cpp create mode 100644 compiler/luci-value-test/tester/src/CircleExpContract.h create mode 100644 compiler/luci-value-test/tester/src/EvalTester.cpp create mode 100644 compiler/luci/env/CMakeLists.txt create mode 100644 compiler/luci/env/README.md create mode 100644 compiler/luci/env/include/luci/UserSettings.h create mode 100644 compiler/luci/env/src/UserSettings.cpp create mode 100644 compiler/luci/env/src/UserSettings.test.cpp create mode 100644 compiler/luci/export/src/TypeBridge.cpp create mode 100644 compiler/luci/export/src/TypeBridge.h create mode 100644 compiler/luci/import/include/luci/Import/GraphBuilderBase.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleAddN.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleArgMin.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleBCQFullyConnected.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleBCQGather.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleBatchMatMul.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleCast.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleCeil.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleCustom.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleDepthToSpace.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleElu.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleExpandDims.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleFill.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleFloor.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleFloorDiv.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleFloorMod.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleGather.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleGatherNd.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleGreater.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleGreaterEqual.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleIf.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleInstanceNorm.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleL2Normalize.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleL2Pool2D.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLeakyRelu.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLess.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLessEqual.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLocalResponseNormalization.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLog.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLogSoftmax.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLogicalAnd.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleLogistic.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleMatrixDiag.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleMatrixSetDiag.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleMaximum.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleMinimum.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleMirrorPad.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleNeg.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleNotEqual.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleOneHot.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CirclePRelu.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CirclePow.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleRange.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleRank.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReduceAny.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReduceMax.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReduceMin.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReduceProd.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleRelu6.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReluN1To1.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleResizeBilinear.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleResizeNearestNeighbor.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReverseSequence.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleReverseV2.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleRound.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleScatterNd.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSegmentSum.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSelect.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSelectV2.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleShape.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSin.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSlice.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToBatchND.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToDepth.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSparseToDense.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSplit.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSplitV.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSqrt.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSquare.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSquaredDifference.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSqueeze.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleStridedSlice.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleSum.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleTanh.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleTile.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleTopKV2.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleTransposeConv.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleUnpack.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleWhere.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleWhile.h create mode 100644 compiler/luci/import/include/luci/Import/Nodes/CircleZerosLike.h create mode 100644 compiler/luci/import/src/Nodes/CircleAddN.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleArgMin.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleBCQFullyConnected.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleBCQGather.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleBatchMatMul.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleCast.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleCeil.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleCustom.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleDepthToSpace.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleElu.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleExpandDims.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleFill.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleFloor.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleFloorDiv.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleFloorMod.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleGather.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleGatherNd.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleGreater.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleGreaterEqual.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleIf.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleInstanceNorm.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleL2Normalize.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleL2Pool2D.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLeakyRelu.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLess.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLessEqual.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLocalResponseNormalization.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLog.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLogSoftmax.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLogicalAnd.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleLogistic.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleMatrixDiag.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleMatrixSetDiag.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleMaximum.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleMinimum.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleMirrorPad.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleNeg.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleNotEqual.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleOneHot.cpp create mode 100644 compiler/luci/import/src/Nodes/CirclePRelu.cpp create mode 100644 compiler/luci/import/src/Nodes/CirclePow.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleRange.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleRank.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReduceAny.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReduceMax.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReduceMin.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReduceProd.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleRelu6.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReluN1To1.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleResizeBilinear.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleResizeNearestNeighbor.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReverseSequence.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleReverseV2.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleRound.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleScatterNd.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSegmentSum.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSelect.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSelectV2.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleShape.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSin.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSlice.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSpaceToBatchND.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSpaceToDepth.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSparseToDense.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSplit.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSplitV.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSqrt.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSquare.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSquaredDifference.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSqueeze.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleStridedSlice.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleSum.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleTanh.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleTile.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleTopKV2.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleTransposeConv.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleUnpack.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleWhere.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleWhile.cpp create mode 100644 compiler/luci/import/src/Nodes/CircleZerosLike.cpp create mode 100644 compiler/luci/import/src/PostImport.cpp create mode 100644 compiler/luci/import/src/PostImport.h create mode 100644 compiler/luci/lang/include/luci/IR/AttrDilation.h create mode 100644 compiler/luci/lang/include/luci/IR/AttrMirrorPadMode.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleAddN.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleArgMin.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleBCQFullyConnected.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleBCQGather.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleBatchMatMul.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleCast.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleCeil.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleCustom.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleCustomOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleDepthToSpace.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleElu.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleExpandDims.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleFill.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleFloor.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleFloorDiv.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleFloorMod.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleGatherNd.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleGreater.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleGreaterEqual.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleIf.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleIfOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleL2Normalize.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleL2Pool2D.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLeakyRelu.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLess.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLessEqual.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLocalResponseNormalization.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLog.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLogSoftmax.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLogicalAnd.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleLogistic.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixDiag.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixSetDiag.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleMinimum.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleMirrorPad.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleNeg.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleNotEqual.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleOneHot.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CirclePRelu.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CirclePow.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleRange.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleRank.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReduceAny.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMax.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMin.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReduceProd.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReluN1To1.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleResizeBilinear.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleResizeNearestNeighbor.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReverseSequence.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleReverseV2.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleRound.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleScatterNd.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSegmentSum.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSelect.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSelectV2.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleShape.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSin.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSlice.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToBatchND.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToDepth.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSparseToDense.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSplit.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSplitOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSplitV.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSplitVOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSquare.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSqueeze.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleStridedSlice.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleSum.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleTanh.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleTile.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2Out.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleUnpack.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleUnpackOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleWhere.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleWhile.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleWhileOut.h create mode 100644 compiler/luci/lang/include/luci/IR/Nodes/CircleZerosLike.h create mode 100644 compiler/luci/lang/include/luci/IR/PropertyShapeStatus.h create mode 100644 compiler/luci/lang/src/CircleNodeShapeDtype.test.cpp create mode 100644 compiler/luci/lang/src/DeadNodeQueryService.cpp create mode 100644 compiler/luci/lang/src/DeadNodeQueryService.h create mode 100644 compiler/luci/lang/src/Nodes/CircleAddN.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleArgMin.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleAveragePool2D.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleBCQFullyConnected.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleBCQGather.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleBatchMatMul.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleCast.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleCeil.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleCustom.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleCustomOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleDepthToSpace.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleElu.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleExpandDims.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleFill.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleFloor.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleFloorDiv.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleFloorMod.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleGatherNd.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleGreater.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleGreaterEqual.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleIf.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleIfOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleL2Pool2D.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLeakyRelu.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLess.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLessEqual.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLocalResponseNormalization.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLog.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLogSoftmax.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLogicalAnd.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleLogistic.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleMatrixDiag.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleMatrixSetDiag.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleMean.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleMinimum.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleMirrorPad.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleNeg.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleNotEqual.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleOneHot.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CirclePRelu.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CirclePow.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleRange.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleRank.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReduceAny.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReduceMax.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReduceMin.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReduceProd.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReluN1To1.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleResizeBilinear.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleResizeNearestNeighbor.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReverseSequence.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleReverseV2.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleRound.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleScatterNd.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSegmentSum.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSelect.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSelectV2.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleShape.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSin.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSlice.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSpaceToBatchND.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSpaceToDepth.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSparseToDense.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSplit.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSplitOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSplitV.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSplitVOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSquare.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSqueeze.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleStridedSlice.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleSum.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleTanh.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleTile.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleTopKV2.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleTopKV2Out.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleUnpack.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleUnpackOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleWhere.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleWhile.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleWhileOut.test.cpp create mode 100644 compiler/luci/lang/src/Nodes/CircleZerosLike.test.cpp create mode 100644 compiler/luci/pass/include/luci/Pass/FuseBCQPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/QuantizationParameters.h create mode 100644 compiler/luci/pass/include/luci/Pass/QuantizeDequantizeWeightsPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/QuantizeWithMinMaxPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ResolveCustomOpAddPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ResolveCustomOpBatchMatMulPass.h create mode 100644 compiler/luci/pass/include/luci/Pass/ResolveCustomOpMatMulPass.h create mode 100644 compiler/luci/pass/src/CircleOptimizerUtils.cpp create mode 100644 compiler/luci/pass/src/CircleOptimizerUtils.h create mode 100644 compiler/luci/pass/src/FuseBCQPass.cpp create mode 100644 compiler/luci/pass/src/FuseInstanceNormPass.test.cpp create mode 100644 compiler/luci/pass/src/FuseInstanceNormPassInternal.h create mode 100644 compiler/luci/pass/src/QuantizationUtils.cpp create mode 100644 compiler/luci/pass/src/QuantizationUtils.h create mode 100644 compiler/luci/pass/src/QuantizeDequantizeWeightsPass.cpp create mode 100644 compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp create mode 100644 compiler/luci/pass/src/ResolveCustomOpAddPass.cpp create mode 100644 compiler/luci/pass/src/ResolveCustomOpBatchMatMulPass.cpp create mode 100644 compiler/luci/pass/src/ResolveCustomOpMatMulPass.cpp delete mode 100644 compiler/luci/service/src/GraphBlock.h delete mode 100644 compiler/luci/service/src/GraphBlock.test.cpp create mode 100644 compiler/luci/service/src/ShapeInfer_StridedSlice.cpp create mode 100644 compiler/luci/service/src/ShapeInfer_StridedSlice.h create mode 100644 compiler/luci/service/src/TestGraph.test.cpp delete mode 100644 compiler/luci/tester/src/Model.cpp delete mode 100644 compiler/luci/tester/src/Model.h delete mode 100644 compiler/mir-caffe-importer/CMakeLists.txt delete mode 100644 compiler/mir-caffe-importer/caffe_importer.cpp delete mode 100644 compiler/mir-caffe-importer/caffe_op_creator.cpp delete mode 100644 compiler/mir-caffe-importer/requires.cmake delete mode 100644 compiler/mir-caffe2-importer/CMakeLists.txt delete mode 100644 compiler/mir-caffe2-importer/caffe2_importer.cpp delete mode 100644 compiler/mir-caffe2-importer/caffe2_op_creator.cpp delete mode 100644 compiler/mir-caffe2-importer/caffe2_proto_helper.cpp delete mode 100644 compiler/mir-caffe2-importer/caffe2_proto_helper.h delete mode 100644 compiler/mir-caffe2-importer/requires.cmake create mode 100644 compiler/mir-interpreter/README.md delete mode 100644 compiler/mir-onnx-importer/AttributeHelpers.h delete mode 100644 compiler/mir-onnx-importer/CMakeLists.txt delete mode 100644 compiler/mir-onnx-importer/ONNXImporterImpl.cpp delete mode 100644 compiler/mir-onnx-importer/Op/Pad.cpp delete mode 100644 compiler/mir-onnx-importer/Op/Transpose.cpp delete mode 100644 compiler/mir-onnx-importer/Op/Upsample.cpp delete mode 100644 compiler/mir-onnx-importer/requires.cmake delete mode 100644 compiler/mir-tflite-importer/CMakeLists.txt delete mode 100644 compiler/mir-tflite-importer/requires.cmake delete mode 100644 compiler/mir-tflite-importer/tflite_importer.cpp delete mode 100644 compiler/mir-tflite-importer/tflite_op_creator.cpp rename compiler/{mir-caffe2-importer => mir/include/mir_caffe2_importer}/caffe2_importer.h (100%) rename compiler/{mir-caffe-importer => mir/include/mir_caffe_importer}/caffe_importer.h (100%) rename compiler/{mir-onnx-importer => mir/include/mir_onnx_importer}/ONNXImporterImpl.h (100%) rename compiler/{mir-tflite-importer => mir/include/mir_tflite_importer}/tflite_importer.h (100%) create mode 100644 compiler/mir/src/mir_caffe2_importer/CMakeLists.txt create mode 100644 compiler/mir/src/mir_caffe2_importer/caffe2_importer.cpp create mode 100644 compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.cpp rename compiler/{mir-caffe2-importer => mir/src/mir_caffe2_importer}/caffe2_op_creator.h (100%) rename compiler/{mir-caffe2-importer => mir/src/mir_caffe2_importer}/caffe2_op_types.h (100%) create mode 100644 compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.cpp create mode 100644 compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.h create mode 100644 compiler/mir/src/mir_caffe_importer/CMakeLists.txt create mode 100644 compiler/mir/src/mir_caffe_importer/caffe_importer.cpp create mode 100644 compiler/mir/src/mir_caffe_importer/caffe_op_creator.cpp rename compiler/{mir-caffe-importer => mir/src/mir_caffe_importer}/caffe_op_creator.h (100%) rename compiler/{mir-caffe-importer => mir/src/mir_caffe_importer}/caffe_op_types.h (100%) create mode 100644 compiler/mir/src/mir_onnx_importer/AttributeHelpers.h create mode 100644 compiler/mir/src/mir_onnx_importer/CMakeLists.txt rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ConvPoolHelpers.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ConvPoolHelpers.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXHelpers.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXHelpers.h (100%) create mode 100644 compiler/mir/src/mir_onnx_importer/ONNXImporterImpl.cpp rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXNodeConverterRegistry.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXNodeConverterRegistry.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXNodeConverterRegistry.test.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/ONNXOpRegistration.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Abs.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Abs.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Add.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Add.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/AveragePool.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/AveragePool.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/BatchNormalization.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/BatchNormalization.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Concat.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Concat.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Constant.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Constant.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Conv.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Conv.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/ConvTranspose.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/ConvTranspose.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Div.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Div.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Dropout.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Dropout.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Equal.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Equal.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Expand.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Expand.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Flatten.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Flatten.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Gather.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Gather.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Gemm.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Gemm.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/GlobalAveragePool.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/GlobalAveragePool.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Greater.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Greater.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Identity.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Identity.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Less.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Less.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/MatMul.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/MatMul.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Max.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Max.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/MaxPool.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/MaxPool.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Mul.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Mul.h (100%) create mode 100644 compiler/mir/src/mir_onnx_importer/Op/Pad.cpp rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Pad.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Reciprocal.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Reciprocal.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/ReduceMean.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/ReduceMean.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Relu.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Relu.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Reshape.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Reshape.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Shape.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Shape.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sigmoid.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sigmoid.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Softmax.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Softmax.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sqrt.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sqrt.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sub.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sub.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sum.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Sum.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Tanh.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Tanh.h (100%) create mode 100644 compiler/mir/src/mir_onnx_importer/Op/Transpose.cpp rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Transpose.h (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Unsqueeze.cpp (100%) rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Unsqueeze.h (100%) create mode 100644 compiler/mir/src/mir_onnx_importer/Op/Upsample.cpp rename compiler/{mir-onnx-importer => mir/src/mir_onnx_importer}/Op/Upsample.h (100%) create mode 100644 compiler/mir/src/mir_tflite_importer/CMakeLists.txt rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema.fbs (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema.meta (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v0.fbs (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v0.meta (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v1.fbs (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v1.meta (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v2.fbs (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v2.meta (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v3.fbs (100%) rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/schema/schema_v3.meta (100%) create mode 100644 compiler/mir/src/mir_tflite_importer/tflite_importer.cpp create mode 100644 compiler/mir/src/mir_tflite_importer/tflite_op_creator.cpp rename compiler/{mir-tflite-importer => mir/src/mir_tflite_importer}/tflite_op_creator.h (100%) create mode 100644 compiler/mir2loco/README.md delete mode 100755 compiler/nnc/utils/caffe_model_maker/AllFill.sh delete mode 100755 compiler/nnc/utils/caffe_model_maker/Filler.sh delete mode 100755 compiler/nnc/utils/caffe_model_maker/GenerateCaffeModels.py delete mode 100755 compiler/nnc/utils/caffe_model_maker/Pyloss.py delete mode 100644 compiler/nnc/utils/caffe_model_maker/README.md create mode 100644 compiler/nnkit-caffe/README.md create mode 100644 compiler/nnkit-mocotf/README.md create mode 100644 compiler/nnkit-onnxrt/README.md create mode 100644 compiler/nnkit-tf/README.md create mode 100644 compiler/nnkit-tflite/README.md create mode 100644 compiler/nnop/README.md create mode 100644 compiler/nnsuite/README.md create mode 100644 compiler/one-cmds/CMakeLists.txt create mode 100644 compiler/one-cmds/README.md create mode 100644 compiler/one-cmds/how-to-prepare-virtualenv.txt create mode 100644 compiler/one-cmds/how-to-use-one-commands.txt create mode 100644 compiler/one-cmds/one-codegen create mode 100644 compiler/one-cmds/one-import create mode 100644 compiler/one-cmds/one-import-tf create mode 100644 compiler/one-cmds/one-import-tflite create mode 100644 compiler/one-cmds/one-optimize create mode 100644 compiler/one-cmds/one-pack create mode 100644 compiler/one-cmds/one-prepare-venv create mode 100644 compiler/one-cmds/one-quantize create mode 100644 compiler/one-cmds/requires.cmake create mode 100644 compiler/oneco-value-pbtxt-test/README.md create mode 100644 compiler/oneco/README.md create mode 100644 compiler/onnx2tflite-integration-test/README.md create mode 100644 compiler/oops/README.md create mode 100644 compiler/pepper-assert/README.md create mode 100644 compiler/pota-quantization-value-test/CMakeLists.txt create mode 100644 compiler/pota-quantization-value-test/README.md create mode 100755 compiler/pota-quantization-value-test/compare_tensors.py create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/fake_quantization/ker.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/bias.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ker.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/fake_quantization/ker.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/bias.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ker.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ofm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ifm.json create mode 100644 compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ofm.json create mode 100755 compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py create mode 100644 compiler/pota-quantization-value-test/requires.cmake create mode 100644 compiler/pota-quantization-value-test/test.lst create mode 100755 compiler/pota-quantization-value-test/test_fake_wquant.sh create mode 100644 compiler/pota-quantization-value-test/test_inputs/Conv2D_004/layer/uint8/0.txt create mode 100644 compiler/pota-quantization-value-test/test_inputs/DepthwiseConv2D_002/layer/uint8/0.txt create mode 100755 compiler/pota-quantization-value-test/test_quantization.sh create mode 100755 compiler/pota-quantization-value-test/test_record_minmax.sh create mode 100644 compiler/record-minmax-conversion-test/CMakeLists.txt create mode 100644 compiler/record-minmax-conversion-test/README.md create mode 100755 compiler/record-minmax-conversion-test/gen_h5_random_inputs.py create mode 100644 compiler/record-minmax-conversion-test/requires.cmake create mode 100644 compiler/record-minmax-conversion-test/test.lst create mode 100755 compiler/record-minmax-conversion-test/testall.sh create mode 100644 compiler/record-minmax/CMakeLists.txt create mode 100644 compiler/record-minmax/README.md create mode 100644 compiler/record-minmax/driver/Driver.cpp create mode 100644 compiler/record-minmax/include/MinMaxObserver.h create mode 100644 compiler/record-minmax/include/RecordFunction.h create mode 100644 compiler/record-minmax/include/RecordMinMax.h create mode 100644 compiler/record-minmax/requires.cmake create mode 100644 compiler/record-minmax/src/CircleExpContract.cpp create mode 100644 compiler/record-minmax/src/CircleExpContract.h create mode 100644 compiler/record-minmax/src/HDF5Importer.cpp create mode 100644 compiler/record-minmax/src/HDF5Importer.h create mode 100644 compiler/record-minmax/src/MinMaxObserver.cpp create mode 100644 compiler/record-minmax/src/RecordMinMax.cpp create mode 100644 compiler/record-minmax/tests/RecordFunction.test.cpp create mode 100644 compiler/safemain/README.md create mode 100644 compiler/souschef/CMakeLists.txt create mode 100644 compiler/souschef/README.md create mode 100644 compiler/souschef/include/souschef/Arguments.h create mode 100644 compiler/souschef/include/souschef/Data/Constant.h create mode 100644 compiler/souschef/include/souschef/Data/Explicit.h create mode 100644 compiler/souschef/include/souschef/Data/Gaussian.h create mode 100644 compiler/souschef/include/souschef/DataChef.def create mode 100644 compiler/souschef/include/souschef/DataChef.h create mode 100644 compiler/souschef/include/souschef/DataChefs.h create mode 100644 compiler/souschef/include/souschef/Dataset.h create mode 100644 compiler/souschef/include/souschef/LexicalCast.h create mode 100644 compiler/souschef/include/souschef/RangedArguments.h create mode 100644 compiler/souschef/include/souschef/Registry.h create mode 100644 compiler/souschef/src/Gaussian.cpp create mode 100644 compiler/souschef/src/LexicalCast.cpp create mode 100644 compiler/tf2nnpackage-value-remote-test/CMakeLists.txt create mode 100644 compiler/tf2nnpackage-value-remote-test/README.md create mode 100644 compiler/tf2nnpackage-value-remote-test/requires.cmake create mode 100644 compiler/tf2nnpackage-value-remote-test/test.lst create mode 100755 compiler/tf2nnpackage-value-remote-test/testall.sh create mode 100644 compiler/tf2nnpkg/README.md create mode 100644 compiler/tf2tflite-dredd-pbtxt-test/README.md create mode 100644 compiler/tf2tfliteV2-conversion-test/CMakeLists.txt create mode 100644 compiler/tf2tfliteV2-conversion-test/README.md create mode 100644 compiler/tf2tfliteV2-conversion-test/requires.cmake create mode 100644 compiler/tf2tfliteV2-conversion-test/test.lst create mode 100755 compiler/tf2tfliteV2-conversion-test/testall.sh delete mode 100644 compiler/tf2tfliteV2-value-pbtxt-test/CMakeLists.txt delete mode 100644 compiler/tf2tfliteV2-value-pbtxt-test/requirements.txt delete mode 100644 compiler/tf2tfliteV2-value-pbtxt-test/requires.cmake delete mode 100644 compiler/tf2tfliteV2-value-pbtxt-test/test.lst delete mode 100755 compiler/tf2tfliteV2-value-pbtxt-test/testall.sh create mode 100644 compiler/tfinfo-v2/README.md delete mode 100644 compiler/tfl-inspect/src/Model.cpp delete mode 100644 compiler/tfl-inspect/src/Model.h delete mode 100644 compiler/tfl-verify/src/Model.cpp delete mode 100644 compiler/tfl-verify/src/Model.h delete mode 100644 compiler/tflchef/core/src/Arguments.h create mode 100644 compiler/tflchef/core/src/CustomOp/AddV2.cpp create mode 100644 compiler/tflchef/core/src/CustomOp/AddV2.h create mode 100644 compiler/tflchef/core/src/CustomOp/All.cpp create mode 100644 compiler/tflchef/core/src/CustomOp/All.h create mode 100644 compiler/tflchef/core/src/CustomOp/BatchMatMulV2.cpp create mode 100644 compiler/tflchef/core/src/CustomOp/BatchMatMulV2.h create mode 100644 compiler/tflchef/core/src/CustomOp/MatMul.cpp create mode 100644 compiler/tflchef/core/src/CustomOp/MatMul.h create mode 100644 compiler/tflchef/core/src/CustomOp/MatrixBandPart.cpp create mode 100644 compiler/tflchef/core/src/CustomOp/MatrixBandPart.h delete mode 100644 compiler/tflchef/core/src/Data/Constant.h delete mode 100644 compiler/tflchef/core/src/Data/Explicit.h delete mode 100644 compiler/tflchef/core/src/Data/Gaussian.cpp delete mode 100644 compiler/tflchef/core/src/Data/Gaussian.h delete mode 100644 compiler/tflchef/core/src/DataChef.def delete mode 100644 compiler/tflchef/core/src/DataChef.h delete mode 100644 compiler/tflchef/core/src/DataChefs.h delete mode 100644 compiler/tflchef/core/src/Dataset.h delete mode 100644 compiler/tflchef/core/src/LexicalCast.cpp delete mode 100644 compiler/tflchef/core/src/LexicalCast.h create mode 100644 compiler/tflchef/core/src/Op/AddN.cpp create mode 100644 compiler/tflchef/core/src/Op/AddN.h create mode 100644 compiler/tflchef/core/src/Op/ArgMin.cpp create mode 100644 compiler/tflchef/core/src/Op/ArgMin.h create mode 100644 compiler/tflchef/core/src/Op/BatchMatMul.cpp create mode 100644 compiler/tflchef/core/src/Op/BatchMatMul.h create mode 100644 compiler/tflchef/core/src/Op/Cast.cpp create mode 100644 compiler/tflchef/core/src/Op/Cast.h create mode 100644 compiler/tflchef/core/src/Op/Ceil.cpp create mode 100644 compiler/tflchef/core/src/Op/Ceil.h create mode 100644 compiler/tflchef/core/src/Op/DepthToSpace.cpp create mode 100644 compiler/tflchef/core/src/Op/DepthToSpace.h create mode 100644 compiler/tflchef/core/src/Op/ELU.cpp create mode 100644 compiler/tflchef/core/src/Op/ELU.h create mode 100644 compiler/tflchef/core/src/Op/ExpandDims.cpp create mode 100644 compiler/tflchef/core/src/Op/ExpandDims.h create mode 100644 compiler/tflchef/core/src/Op/Fill.cpp create mode 100644 compiler/tflchef/core/src/Op/Fill.h create mode 100644 compiler/tflchef/core/src/Op/Floor.cpp create mode 100644 compiler/tflchef/core/src/Op/Floor.h create mode 100644 compiler/tflchef/core/src/Op/FloorMod.cpp create mode 100644 compiler/tflchef/core/src/Op/FloorMod.h create mode 100644 compiler/tflchef/core/src/Op/Gather.cpp create mode 100644 compiler/tflchef/core/src/Op/Gather.h create mode 100644 compiler/tflchef/core/src/Op/GatherNd.cpp create mode 100644 compiler/tflchef/core/src/Op/GatherNd.h create mode 100644 compiler/tflchef/core/src/Op/Greater.cpp create mode 100644 compiler/tflchef/core/src/Op/Greater.h create mode 100644 compiler/tflchef/core/src/Op/GreaterEqual.cpp create mode 100644 compiler/tflchef/core/src/Op/GreaterEqual.h create mode 100644 compiler/tflchef/core/src/Op/If.cpp create mode 100644 compiler/tflchef/core/src/Op/If.h create mode 100644 compiler/tflchef/core/src/Op/L2Normalize.cpp create mode 100644 compiler/tflchef/core/src/Op/L2Normalize.h create mode 100644 compiler/tflchef/core/src/Op/L2Pool2D.cpp create mode 100644 compiler/tflchef/core/src/Op/L2Pool2D.h create mode 100644 compiler/tflchef/core/src/Op/LeakyRelu.cpp create mode 100644 compiler/tflchef/core/src/Op/LeakyRelu.h create mode 100644 compiler/tflchef/core/src/Op/Less.cpp create mode 100644 compiler/tflchef/core/src/Op/Less.h create mode 100644 compiler/tflchef/core/src/Op/LessEqual.cpp create mode 100644 compiler/tflchef/core/src/Op/LessEqual.h create mode 100644 compiler/tflchef/core/src/Op/LocalResponseNormalization.cpp create mode 100644 compiler/tflchef/core/src/Op/LocalResponseNormalization.h create mode 100644 compiler/tflchef/core/src/Op/Log.cpp create mode 100644 compiler/tflchef/core/src/Op/Log.h create mode 100644 compiler/tflchef/core/src/Op/LogSoftmax.cpp create mode 100644 compiler/tflchef/core/src/Op/LogSoftmax.h create mode 100644 compiler/tflchef/core/src/Op/LogicalAnd.cpp create mode 100644 compiler/tflchef/core/src/Op/LogicalAnd.h create mode 100644 compiler/tflchef/core/src/Op/Logistic.cpp create mode 100644 compiler/tflchef/core/src/Op/Logistic.h create mode 100644 compiler/tflchef/core/src/Op/MatrixDiag.cpp create mode 100644 compiler/tflchef/core/src/Op/MatrixDiag.h create mode 100644 compiler/tflchef/core/src/Op/MatrixSetDiag.cpp create mode 100644 compiler/tflchef/core/src/Op/MatrixSetDiag.h create mode 100644 compiler/tflchef/core/src/Op/Maximum.cpp create mode 100644 compiler/tflchef/core/src/Op/Maximum.h create mode 100644 compiler/tflchef/core/src/Op/Minimum.cpp create mode 100644 compiler/tflchef/core/src/Op/Minimum.h create mode 100644 compiler/tflchef/core/src/Op/MirrorPad.cpp create mode 100644 compiler/tflchef/core/src/Op/MirrorPad.h create mode 100644 compiler/tflchef/core/src/Op/Neg.cpp create mode 100644 compiler/tflchef/core/src/Op/Neg.h create mode 100644 compiler/tflchef/core/src/Op/NotEqual.cpp create mode 100644 compiler/tflchef/core/src/Op/NotEqual.h create mode 100644 compiler/tflchef/core/src/Op/OneHot.cpp create mode 100644 compiler/tflchef/core/src/Op/OneHot.h create mode 100644 compiler/tflchef/core/src/Op/PRelu.cpp create mode 100644 compiler/tflchef/core/src/Op/PRelu.h create mode 100644 compiler/tflchef/core/src/Op/Pow.cpp create mode 100644 compiler/tflchef/core/src/Op/Pow.h create mode 100644 compiler/tflchef/core/src/Op/Range.cpp create mode 100644 compiler/tflchef/core/src/Op/Range.h create mode 100644 compiler/tflchef/core/src/Op/Rank.cpp create mode 100644 compiler/tflchef/core/src/Op/Rank.h create mode 100644 compiler/tflchef/core/src/Op/ReLUN1To1.cpp create mode 100644 compiler/tflchef/core/src/Op/ReLUN1To1.h create mode 100644 compiler/tflchef/core/src/Op/ReduceAny.cpp create mode 100644 compiler/tflchef/core/src/Op/ReduceAny.h create mode 100644 compiler/tflchef/core/src/Op/ReduceMax.cpp create mode 100644 compiler/tflchef/core/src/Op/ReduceMax.h create mode 100644 compiler/tflchef/core/src/Op/ReduceMin.cpp create mode 100644 compiler/tflchef/core/src/Op/ReduceMin.h create mode 100644 compiler/tflchef/core/src/Op/ReduceProd.cpp create mode 100644 compiler/tflchef/core/src/Op/ReduceProd.h create mode 100644 compiler/tflchef/core/src/Op/ResizeBilinear.cpp create mode 100644 compiler/tflchef/core/src/Op/ResizeBilinear.h create mode 100644 compiler/tflchef/core/src/Op/ResizeNearestNeighbor.cpp create mode 100644 compiler/tflchef/core/src/Op/ResizeNearestNeighbor.h create mode 100644 compiler/tflchef/core/src/Op/ReverseSequence.cpp create mode 100644 compiler/tflchef/core/src/Op/ReverseSequence.h create mode 100644 compiler/tflchef/core/src/Op/ReverseV2.cpp create mode 100644 compiler/tflchef/core/src/Op/ReverseV2.h create mode 100644 compiler/tflchef/core/src/Op/Round.cpp create mode 100644 compiler/tflchef/core/src/Op/Round.h create mode 100644 compiler/tflchef/core/src/Op/ScatterNd.cpp create mode 100644 compiler/tflchef/core/src/Op/ScatterNd.h create mode 100644 compiler/tflchef/core/src/Op/SegmentSum.cpp create mode 100644 compiler/tflchef/core/src/Op/SegmentSum.h create mode 100644 compiler/tflchef/core/src/Op/Select.cpp create mode 100644 compiler/tflchef/core/src/Op/Select.h create mode 100644 compiler/tflchef/core/src/Op/SelectV2.cpp create mode 100644 compiler/tflchef/core/src/Op/SelectV2.h create mode 100644 compiler/tflchef/core/src/Op/Sin.cpp create mode 100644 compiler/tflchef/core/src/Op/Sin.h create mode 100644 compiler/tflchef/core/src/Op/Slice.cpp create mode 100644 compiler/tflchef/core/src/Op/Slice.h create mode 100644 compiler/tflchef/core/src/Op/SpaceToBatchND.cpp create mode 100644 compiler/tflchef/core/src/Op/SpaceToBatchND.h create mode 100644 compiler/tflchef/core/src/Op/SpaceToDepth.cpp create mode 100644 compiler/tflchef/core/src/Op/SpaceToDepth.h create mode 100644 compiler/tflchef/core/src/Op/SparseToDense.cpp create mode 100644 compiler/tflchef/core/src/Op/SparseToDense.h create mode 100644 compiler/tflchef/core/src/Op/Split.cpp create mode 100644 compiler/tflchef/core/src/Op/Split.h create mode 100644 compiler/tflchef/core/src/Op/SplitV.cpp create mode 100644 compiler/tflchef/core/src/Op/SplitV.h create mode 100644 compiler/tflchef/core/src/Op/Square.cpp create mode 100644 compiler/tflchef/core/src/Op/Square.h create mode 100644 compiler/tflchef/core/src/Op/SquaredDifference.cpp create mode 100644 compiler/tflchef/core/src/Op/SquaredDifference.h create mode 100644 compiler/tflchef/core/src/Op/Squeeze.cpp create mode 100644 compiler/tflchef/core/src/Op/Squeeze.h create mode 100644 compiler/tflchef/core/src/Op/StridedSlice.cpp create mode 100644 compiler/tflchef/core/src/Op/StridedSlice.h create mode 100644 compiler/tflchef/core/src/Op/Sum.cpp create mode 100644 compiler/tflchef/core/src/Op/Sum.h create mode 100644 compiler/tflchef/core/src/Op/Tile.cpp create mode 100644 compiler/tflchef/core/src/Op/Tile.h create mode 100644 compiler/tflchef/core/src/Op/TopKV2.cpp create mode 100644 compiler/tflchef/core/src/Op/TopKV2.h create mode 100644 compiler/tflchef/core/src/Op/TransposeConv.cpp create mode 100644 compiler/tflchef/core/src/Op/TransposeConv.h create mode 100644 compiler/tflchef/core/src/Op/Unique.cpp create mode 100644 compiler/tflchef/core/src/Op/Unique.h create mode 100644 compiler/tflchef/core/src/Op/Unpack.cpp create mode 100644 compiler/tflchef/core/src/Op/Unpack.h create mode 100644 compiler/tflchef/core/src/Op/Where.cpp create mode 100644 compiler/tflchef/core/src/Op/Where.h create mode 100644 compiler/tflchef/core/src/Op/While.cpp create mode 100644 compiler/tflchef/core/src/Op/While.h create mode 100644 compiler/tflchef/core/src/Op/ZerosLike.cpp create mode 100644 compiler/tflchef/core/src/Op/ZerosLike.h create mode 100644 compiler/tflchef/log/CMakeLists.txt create mode 100644 compiler/tflchef/log/include/Log.h create mode 100644 compiler/tflchef/log/include/LoggingContext.h create mode 100644 compiler/tflchef/log/src/Log.cpp create mode 100644 compiler/tflchef/log/src/LoggingContext.cpp create mode 100644 compiler/tflchef/tests/no_shape/test.recipe rename tools/lcov-to-cobertura-xml/.FORMATDENY => compiler/tflchef/tests/no_shape/test.reverse (100%) delete mode 100644 compiler/tflchef/tflite/include/tflchef/RawModel.h create mode 100644 compiler/tflchef/tflite/src/FillerHelper.cpp create mode 100644 compiler/tflchef/tflite/src/FillerHelper.h create mode 100644 compiler/tflchef/tflite/src/Op/AddN.cpp create mode 100644 compiler/tflchef/tflite/src/Op/AddN.h create mode 100644 compiler/tflchef/tflite/src/Op/ArgMin.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ArgMin.h create mode 100644 compiler/tflchef/tflite/src/Op/BatchMatMul.cpp create mode 100644 compiler/tflchef/tflite/src/Op/BatchMatMul.h create mode 100644 compiler/tflchef/tflite/src/Op/Cast.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Cast.h create mode 100644 compiler/tflchef/tflite/src/Op/Ceil.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Ceil.h create mode 100644 compiler/tflchef/tflite/src/Op/DepthToSpace.cpp create mode 100644 compiler/tflchef/tflite/src/Op/DepthToSpace.h create mode 100644 compiler/tflchef/tflite/src/Op/ELU.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ELU.h create mode 100644 compiler/tflchef/tflite/src/Op/ExpandDims.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ExpandDims.h create mode 100644 compiler/tflchef/tflite/src/Op/Fill.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Fill.h create mode 100644 compiler/tflchef/tflite/src/Op/Floor.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Floor.h create mode 100644 compiler/tflchef/tflite/src/Op/FloorMod.cpp create mode 100644 compiler/tflchef/tflite/src/Op/FloorMod.h create mode 100644 compiler/tflchef/tflite/src/Op/Gather.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Gather.h create mode 100644 compiler/tflchef/tflite/src/Op/GatherNd.cpp create mode 100644 compiler/tflchef/tflite/src/Op/GatherNd.h create mode 100644 compiler/tflchef/tflite/src/Op/Greater.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Greater.h create mode 100644 compiler/tflchef/tflite/src/Op/GreaterEqual.cpp create mode 100644 compiler/tflchef/tflite/src/Op/GreaterEqual.h create mode 100644 compiler/tflchef/tflite/src/Op/L2Normalize.cpp create mode 100644 compiler/tflchef/tflite/src/Op/L2Normalize.h create mode 100644 compiler/tflchef/tflite/src/Op/L2Pool2D.cpp create mode 100644 compiler/tflchef/tflite/src/Op/L2Pool2D.h create mode 100644 compiler/tflchef/tflite/src/Op/LeakyRelu.cpp create mode 100644 compiler/tflchef/tflite/src/Op/LeakyRelu.h create mode 100644 compiler/tflchef/tflite/src/Op/Less.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Less.h create mode 100644 compiler/tflchef/tflite/src/Op/LessEqual.cpp create mode 100644 compiler/tflchef/tflite/src/Op/LessEqual.h create mode 100644 compiler/tflchef/tflite/src/Op/LocalResponseNormalization.cpp create mode 100644 compiler/tflchef/tflite/src/Op/LocalResponseNormalization.h create mode 100644 compiler/tflchef/tflite/src/Op/Log.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Log.h create mode 100644 compiler/tflchef/tflite/src/Op/LogSoftmax.cpp create mode 100644 compiler/tflchef/tflite/src/Op/LogSoftmax.h create mode 100644 compiler/tflchef/tflite/src/Op/LogicalAnd.cpp create mode 100644 compiler/tflchef/tflite/src/Op/LogicalAnd.h create mode 100644 compiler/tflchef/tflite/src/Op/Logistic.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Logistic.h create mode 100644 compiler/tflchef/tflite/src/Op/MatrixDiag.cpp create mode 100644 compiler/tflchef/tflite/src/Op/MatrixDiag.h create mode 100644 compiler/tflchef/tflite/src/Op/MatrixSetDiag.cpp create mode 100644 compiler/tflchef/tflite/src/Op/MatrixSetDiag.h create mode 100644 compiler/tflchef/tflite/src/Op/Maximum.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Maximum.h create mode 100644 compiler/tflchef/tflite/src/Op/Minimum.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Minimum.h create mode 100644 compiler/tflchef/tflite/src/Op/MirrorPad.cpp create mode 100644 compiler/tflchef/tflite/src/Op/MirrorPad.h create mode 100644 compiler/tflchef/tflite/src/Op/Mul.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Mul.h create mode 100644 compiler/tflchef/tflite/src/Op/Neg.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Neg.h create mode 100644 compiler/tflchef/tflite/src/Op/NotEqual.cpp create mode 100644 compiler/tflchef/tflite/src/Op/NotEqual.h create mode 100644 compiler/tflchef/tflite/src/Op/OneHot.cpp create mode 100644 compiler/tflchef/tflite/src/Op/OneHot.h create mode 100644 compiler/tflchef/tflite/src/Op/PRelu.cpp create mode 100644 compiler/tflchef/tflite/src/Op/PRelu.h create mode 100644 compiler/tflchef/tflite/src/Op/Pow.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Pow.h create mode 100644 compiler/tflchef/tflite/src/Op/Range.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Range.h create mode 100644 compiler/tflchef/tflite/src/Op/Rank.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Rank.h create mode 100644 compiler/tflchef/tflite/src/Op/ReLUN1To1.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReLUN1To1.h create mode 100644 compiler/tflchef/tflite/src/Op/ReduceAny.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReduceAny.h create mode 100644 compiler/tflchef/tflite/src/Op/ReduceMax.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReduceMax.h create mode 100644 compiler/tflchef/tflite/src/Op/ReduceMin.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReduceMin.h create mode 100644 compiler/tflchef/tflite/src/Op/ReduceProd.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReduceProd.h create mode 100644 compiler/tflchef/tflite/src/Op/ResizeBilinear.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ResizeBilinear.h create mode 100644 compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.h create mode 100644 compiler/tflchef/tflite/src/Op/ReverseSequence.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReverseSequence.h create mode 100644 compiler/tflchef/tflite/src/Op/ReverseV2.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ReverseV2.h create mode 100644 compiler/tflchef/tflite/src/Op/Round.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Round.h create mode 100644 compiler/tflchef/tflite/src/Op/ScatterNd.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ScatterNd.h create mode 100644 compiler/tflchef/tflite/src/Op/SegmentSum.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SegmentSum.h create mode 100644 compiler/tflchef/tflite/src/Op/Select.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Select.h create mode 100644 compiler/tflchef/tflite/src/Op/SelectV2.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SelectV2.h create mode 100644 compiler/tflchef/tflite/src/Op/Shape.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Shape.h create mode 100644 compiler/tflchef/tflite/src/Op/Sin.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Sin.h create mode 100644 compiler/tflchef/tflite/src/Op/Slice.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Slice.h create mode 100644 compiler/tflchef/tflite/src/Op/SpaceToBatchND.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SpaceToBatchND.h create mode 100644 compiler/tflchef/tflite/src/Op/SpaceToDepth.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SpaceToDepth.h create mode 100644 compiler/tflchef/tflite/src/Op/SparseToDense.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SparseToDense.h create mode 100644 compiler/tflchef/tflite/src/Op/Split.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Split.h create mode 100644 compiler/tflchef/tflite/src/Op/SplitV.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SplitV.h create mode 100644 compiler/tflchef/tflite/src/Op/Square.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Square.h create mode 100644 compiler/tflchef/tflite/src/Op/SquaredDifference.cpp create mode 100644 compiler/tflchef/tflite/src/Op/SquaredDifference.h create mode 100644 compiler/tflchef/tflite/src/Op/Squeeze.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Squeeze.h create mode 100644 compiler/tflchef/tflite/src/Op/StridedSlice.cpp create mode 100644 compiler/tflchef/tflite/src/Op/StridedSlice.h create mode 100644 compiler/tflchef/tflite/src/Op/Sum.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Sum.h create mode 100644 compiler/tflchef/tflite/src/Op/Tile.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Tile.h create mode 100644 compiler/tflchef/tflite/src/Op/TopKV2.cpp create mode 100644 compiler/tflchef/tflite/src/Op/TopKV2.h create mode 100644 compiler/tflchef/tflite/src/Op/TransposeConv.cpp create mode 100644 compiler/tflchef/tflite/src/Op/TransposeConv.h create mode 100644 compiler/tflchef/tflite/src/Op/Unique.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Unique.h create mode 100644 compiler/tflchef/tflite/src/Op/Unpack.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Unpack.h create mode 100644 compiler/tflchef/tflite/src/Op/Where.cpp create mode 100644 compiler/tflchef/tflite/src/Op/Where.h create mode 100644 compiler/tflchef/tflite/src/Op/ZerosLike.cpp create mode 100644 compiler/tflchef/tflite/src/Op/ZerosLike.h delete mode 100644 compiler/tflchef/tflite/src/RawModelLoader.cpp delete mode 100644 compiler/tflite2circle-conversion-test/test.lst create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.h create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.cpp create mode 100644 compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.h delete mode 100644 compute/ARMComputeEx/arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h delete mode 100644 compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLSpaceToBatchND.h delete mode 100644 compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericGather.h delete mode 100644 compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericReshapeLayer.h delete mode 100644 compute/ARMComputeEx/arm_compute/runtime/misc/functions/Utils.h delete mode 100644 compute/ARMComputeEx/src/core/CL/cl_kernels/space_to_batch.cl delete mode 100644 compute/ARMComputeEx/src/core/CL/kernels/CLSpaceToBatchNDKernel.cpp delete mode 100644 compute/ARMComputeEx/src/runtime/CL/functions/CLSpaceToBatchND.cpp delete mode 100644 compute/ARMComputeEx/src/runtime/misc/functions/GenericGather.cpp delete mode 100644 compute/ARMComputeEx/src/runtime/misc/functions/GenericReshapeLayer.cpp delete mode 100644 compute/ARMComputeEx/src/runtime/misc/functions/Utils.cpp create mode 100644 compute/cker/include/cker/operation/ArgMinMax.h create mode 100644 compute/cker/include/cker/operation/BatchMatMul.h create mode 100644 compute/cker/include/cker/operation/BroadcastTo.h create mode 100644 compute/cker/include/cker/operation/Einsum.h create mode 100644 compute/cker/include/cker/operation/Fill.h create mode 100644 compute/cker/include/cker/operation/FusedBatchNorm.h create mode 100644 compute/cker/include/cker/operation/Helper/BCast.h create mode 100644 compute/cker/include/cker/operation/Helper/MatmulBCast.h create mode 100644 compute/cker/include/cker/operation/Helper/Tensor.h create mode 100644 compute/cker/include/cker/operation/LogSoftMax.h create mode 100644 compute/cker/include/cker/operation/LogicalNot.h create mode 100644 compute/cker/include/cker/operation/LogicalOr.h create mode 100644 compute/cker/include/cker/operation/MatrixBandPart.h create mode 100644 compute/cker/include/cker/operation/Pow.h create mode 100644 compute/cker/include/cker/operation/Range.h create mode 100644 compute/cker/include/cker/operation/ReLU.h create mode 100644 compute/cker/include/cker/operation/ReduceMean.h create mode 100644 compute/cker/include/cker/operation/Reverse.h create mode 100644 compute/cker/include/cker/operation/Round.h create mode 100644 compute/cker/include/cker/operation/Select.h create mode 100644 compute/cker/include/cker/operation/SpaceToBatchND.h create mode 100644 compute/cker/include/cker/operation/SqDiff.h create mode 100644 compute/cker/include/cker/operation/Tile.h create mode 100644 compute/cker/include/cker/operation/reference/BatchMatMul.h create mode 100644 compute/cker/include/cker/ruy/RuySupport.h create mode 100644 compute/test/CMakeLists.txt create mode 100644 compute/test/cker/Range.cc create mode 100644 docs/Makefile create mode 100644 docs/common-ir/index.rst create mode 100644 docs/common-ir/introduction-to-circle.md create mode 100644 docs/common-ir/what-is-common-ir.md create mode 100644 docs/compiler/backend.rst create mode 120000 docs/compiler/compiler create mode 100644 docs/compiler/frontend.rst create mode 100644 docs/compiler/index.rst create mode 100644 docs/compiler/interpreters.rst create mode 100644 docs/compiler/ir.rst create mode 100644 docs/compiler/libraries.rst create mode 100644 docs/compiler/middleend.rst create mode 100644 docs/compiler/tools.rst create mode 100644 docs/conf.py create mode 100644 docs/contents.rst create mode 100644 docs/device/index.rst create mode 100644 docs/device/odroid-xu3.md create mode 100644 docs/device/odroid-xu4.md create mode 100644 docs/device/raspberry-pi-3.md create mode 100644 docs/howto/how-to-add-a-new-operation.md create mode 100644 docs/howto/how-to-build-compiler.md create mode 100644 docs/howto/how-to-build-package.md create mode 100644 docs/howto/how-to-build-runtime-using-prebuilt-docker-image.md create mode 100644 docs/howto/how-to-build-runtime.md create mode 100644 docs/howto/how-to-contribute.md create mode 100644 docs/howto/how-to-cross-build-runtime-for-aarch64.md create mode 100644 docs/howto/how-to-cross-build-runtime-for-android.md create mode 100644 docs/howto/how-to-cross-build-runtime-for-arm.md create mode 100644 docs/howto/how-to-introduce-a-new-operation-into-compiler.md create mode 100644 docs/howto/how-to-introduce-a-new-operation-into-runtime.md create mode 100644 docs/howto/how-to-make-an-application-with-runtime.md create mode 100644 docs/howto/how-to-remote-debugging-with-visual-studio-code.md create mode 100644 docs/howto/how-to-run-package.md create mode 100644 docs/howto/how-to-use-api.md create mode 100644 docs/howto/how-to-use-nnapi-binding.md create mode 100644 docs/howto/how-to-use-nnfw-api.md create mode 100644 docs/howto/index.rst create mode 100644 docs/images/logo_original_samsungblue_cropped.png create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/nncc/v1.0.0/tutorial.md create mode 100644 docs/nnfw/howto/CrossBuildForAndroid.md create mode 100644 docs/overview/background.md create mode 100644 docs/overview/index.rst create mode 100644 docs/overview/overall-architecture.md create mode 100644 docs/overview/roadmap.md create mode 100644 docs/overview/supported-operations.md create mode 100644 docs/overview/workgroup.md create mode 100644 docs/package/design-of-package.md create mode 100644 docs/package/index.rst create mode 100644 docs/package/introduction-to-package.md create mode 100644 docs/platform/android.md create mode 100644 docs/platform/index.rst create mode 100644 docs/platform/tizen.md create mode 100644 docs/platform/ubuntu.md create mode 100644 docs/release/1.0/index.rst create mode 100644 docs/release/1.0/release-note-1.0.0.md create mode 100644 docs/release/1.1/index.rst create mode 100644 docs/release/1.1/release-note-1.1.0.md create mode 100644 docs/release/1.2/index.rst create mode 100644 docs/release/1.2/release-note-1.2.0.md create mode 100644 docs/release/1.3/index.rst create mode 100644 docs/release/1.3/release-note-1.3.0.md create mode 100644 docs/release/1.4/index.rst create mode 100644 docs/release/1.4/release-note-1.4.0.md create mode 100644 docs/release/1.5/release-note-1.5.0.md create mode 100644 docs/release/1.6/release-note-1.6.0.md create mode 100644 docs/release/1.7/release-note-1.7.0.md create mode 100644 docs/release/index.rst delete mode 100644 docs/release/release_note_1.4.0.md create mode 100644 docs/requirements.txt create mode 100644 docs/runtime/api.md create mode 100644 docs/runtime/backend-api.md create mode 100644 docs/runtime/compute.md create mode 100644 docs/runtime/core-figure-ir.png create mode 100644 docs/runtime/core.md create mode 100644 docs/runtime/executors.md create mode 100644 docs/runtime/heterogeneous-execution-add-3-conv-model.png create mode 100644 docs/runtime/heterogeneous-execution-add-conv-model-lowering.png create mode 100644 docs/runtime/heterogeneous-execution-add-conv-model.png create mode 100644 docs/runtime/heterogeneous-execution.md create mode 100644 docs/runtime/index.rst create mode 100644 docs/test/benchmarks.md create mode 100644 docs/test/index.rst create mode 100644 docs/test/scripts.md delete mode 100644 infra/cmake/packages/ARMCompute/SConstruct delete mode 100644 infra/cmake/packages/ARMComputeConfig.cmake delete mode 100644 infra/cmake/packages/CpuinfoSourceConfig.cmake create mode 100644 infra/cmake/packages/Eigen-fd6845384b86Config.cmake delete mode 100644 infra/cmake/packages/Enum34SourceConfig.cmake delete mode 100644 infra/cmake/packages/FP16SourceConfig.cmake delete mode 100644 infra/cmake/packages/FXdivSourceConfig.cmake create mode 100644 infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfig.cmake create mode 100644 infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfigVersion.cmake delete mode 100644 infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfig.cmake delete mode 100644 infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfigVersion.cmake create mode 100644 infra/cmake/packages/HDF5Config.cmake create mode 100644 infra/cmake/packages/HDF5SourceConfig.cmake delete mode 100644 infra/cmake/packages/NNPACKConfig.cmake delete mode 100644 infra/cmake/packages/NNPACKSourceConfig.cmake delete mode 100644 infra/cmake/packages/NoniusConfig.cmake delete mode 100644 infra/cmake/packages/OpcodesSourceConfig.cmake delete mode 100644 infra/cmake/packages/PSIMDSourceConfig.cmake delete mode 100644 infra/cmake/packages/PeachpySourceConfig.cmake delete mode 100644 infra/cmake/packages/PthreadpoolSourceConfig.cmake delete mode 100644 infra/cmake/packages/SixSourceConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowEigenSource-2.3.0-rc0Config.cmake create mode 100644 infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowLite-1.13.1/Lite/CMakeLists.txt create mode 100644 infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake delete mode 100644 infra/cmake/packages/TensorFlowLite-1.7/Lite/CMakeLists.txt delete mode 100644 infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfig.cmake delete mode 100644 infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowProtoText-1.13.1/build/CMakeLists.txt create mode 100755 infra/cmake/packages/TensorFlowProtoText-1.13.1/make_directories.sh delete mode 100644 infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfig.cmake delete mode 100644 infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfig.cmake create mode 100644 infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfigVersion.cmake create mode 100644 infra/cmake/packages/TensorFlowSource-2.3.0-rc0Config.cmake create mode 100644 infra/nnfw/cmake/buildtool/config/config_x86_64-darwin.cmake create mode 100644 infra/nnfw/cmake/options/options_x86_64-darwin.cmake create mode 100644 infra/nnfw/cmake/packages/ARMComputeConfig.cmake delete mode 100644 infra/nnfw/cmake/packages/AbslSourceConfig.cmake create mode 100644 infra/nnfw/cmake/packages/BoostConfig.cmake delete mode 100644 infra/nnfw/cmake/packages/EigenSourceConfig.cmake delete mode 100644 infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake create mode 100644 infra/nnfw/cmake/packages/NoniusConfig.cmake create mode 100644 infra/nnfw/cmake/packages/Ruy/CMakeLists.txt create mode 100644 infra/nnfw/cmake/packages/RuyConfig.cmake create mode 100644 infra/nnfw/cmake/packages/RuySourceConfig.cmake create mode 100644 infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfig.cmake create mode 100644 infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfigVersion.cmake create mode 100644 infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLite/CMakeLists.txt create mode 100644 infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake create mode 100644 infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake create mode 100644 infra/nnfw/cmake/packages/TensorFlowLite-2.2.0/CMakeLists.txt create mode 100644 infra/nnfw/cmake/packages/TensorFlowLite-2.2.0Config.cmake delete mode 100644 infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt delete mode 100644 infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake delete mode 100644 infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake create mode 100644 infra/nnfw/command/count-unittest create mode 100644 infra/packaging/preset/20200508 create mode 100644 infra/packaging/preset/20200616_windows create mode 100644 infra/packaging/preset/20200630 create mode 100644 infra/packaging/res/tf2nnpkg.20200508 create mode 100644 infra/packaging/res/tf2nnpkg.20200616 create mode 100644 infra/packaging/res/tf2nnpkg.20200630 create mode 100644 infra/scripts/compiler_modules.sh create mode 100755 infra/scripts/configure_compiler_coverage.sh delete mode 100755 infra/scripts/docker_build_cross_arm_benchmark_model.sh delete mode 100755 infra/scripts/test_ubuntu_runtime_interp.sh create mode 100755 infra/scripts/unittest_compiler_xml.sh create mode 100644 logo/ONE_logo_guideline_ENG.pdf create mode 100644 logo/ONE_logo_guideline_KOR.pdf create mode 100644 logo/images/logo_abbreviation_black.png create mode 100644 logo/images/logo_abbreviation_black.svg create mode 100644 logo/images/logo_abbreviation_samsungblue.png create mode 100644 logo/images/logo_abbreviation_samsungblue.svg create mode 100644 logo/images/logo_abbreviation_white.png create mode 100644 logo/images/logo_abbreviation_white.svg create mode 100644 logo/images/logo_original_black.png create mode 100644 logo/images/logo_original_black.svg create mode 100644 logo/images/logo_original_samsungblue.png create mode 100644 logo/images/logo_original_samsungblue.svg create mode 100644 logo/images/logo_original_white.png create mode 100644 logo/images/logo_original_white.svg delete mode 100644 packaging/flatbuffers.tar.gz create mode 100644 packaging/nnfw-plugin.pc.in create mode 100644 packaging/ruy.tar.gz create mode 100644 res/CircleRecipes/BCQFullyConnected_000/test.recipe rename runtime/libs/jsoncpp/.FORMATDENY => res/CircleRecipes/BCQFullyConnected_000/test.reverse (100%) create mode 100644 res/CircleRecipes/BCQFullyConnected_001/test.recipe create mode 100644 res/CircleRecipes/BCQFullyConnected_001/test.reverse create mode 100644 res/CircleRecipes/BCQGather_000/test.recipe create mode 100644 res/CircleRecipes/BCQGather_000/test.reverse create mode 100644 res/CircleRecipes/CircleBatchMatMul_000/test.recipe create mode 100644 res/CircleRecipes/CircleBatchMatMul_000/test.reverse create mode 100644 res/CircleRecipes/CircleBatchMatMul_000/test.rule create mode 100644 res/CircleRecipes/InstanceNorm_000/test.recipe create mode 100644 res/CircleRecipes/InstanceNorm_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/AddN_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/AddN_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Add_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Add_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/All_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ArgMin_U8_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/BatchMatMulV2_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/BatchMatMulV2_000/test.rule create mode 100644 res/TensorFlowLiteRecipes/BatchMatMulV2_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/BatchMatMul_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/BatchMatMul_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Cast_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Cast_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Cast_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Ceil_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Ceil_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Conv2D_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Conv2D_004/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Conv2D_004/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Conv2D_U8_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/DepthToSpace_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/DepthToSpace_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/DepthwiseConv2D_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/DepthwiseConv2D_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/DepthwiseConv2D_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/DepthwiseConv2D_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ELU_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ELU_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ExpandDims_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ExpandDims_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ExpandDims_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ExpandDims_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ExpandDims_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Fill_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Fill_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Fill_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FloorDiv_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FloorDiv_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/FloorDiv_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FloorDiv_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/FloorMod_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FloorMod_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/FloorMod_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FloorMod_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Floor_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Floor_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/FullyConnected_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/FullyConnected_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/GatherNd_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/GatherNd_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/GatherNd_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/GatherNd_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Gather_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Gather_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/GreaterEqual_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/GreaterEqual_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Greater_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Greater_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/If_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/If_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/L2Normalize_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/L2Normalize_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/L2Pool2D_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/L2Pool2D_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/L2Pool2D_U8_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LeakyRelu_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LeakyRelu_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/LessEqual_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LessEqual_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Less_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Less_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/LocalResponseNormalization_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LocalResponseNormalization_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/LogSoftmax_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LogSoftmax_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Log_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Log_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/LogicalAnd_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/LogicalAnd_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Logistic_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Logistic_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/MatMul_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/MatMul_000/test.rule create mode 100644 res/TensorFlowLiteRecipes/MatrixBandPart_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/MatrixDiag_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/MatrixDiag_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/MatrixSetDiag_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/MatrixSetDiag_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Maximum_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Maximum_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Mean_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Mean_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Mean_U8_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Mean_U8_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Minimum_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Minimum_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/MirrorPad_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/MirrorPad_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Neg_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Neg_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Net_Dangle_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Net_InstanceNorm_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Net_InstanceNorm_001/test.rule create mode 100644 res/TensorFlowLiteRecipes/Net_InstanceNorm_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Net_InstanceNorm_002/test.rule create mode 100644 res/TensorFlowLiteRecipes/Net_UnpackAdd_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Net_UnpackAdd_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Net_ZeroDim_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/NotEqual_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/NotEqual_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/OneHot_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/OneHot_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/OneHot_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/OneHot_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/OneHot_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/OneHot_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/OneHot_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/OneHot_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/PRelu_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/PRelu_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Pow_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Pow_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Range_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Range_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Rank_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Rank_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReLUN1To1_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReLUN1To1_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceAny_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceMax_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceMax_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceMin_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceMin_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReduceProd_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Reshape_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Reshape_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Reshape_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ResizeBilinear_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ResizeBilinear_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ResizeNearestNeighbor_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ResizeNearestNeighbor_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReverseSequence_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReverseSequence_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ReverseV2_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ReverseV2_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Round_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Round_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ScatterNd_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ScatterNd_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SegmentSum_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SegmentSum_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SelectV2_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SelectV2_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SelectV2_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SelectV2_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SelectV2_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SelectV2_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Select_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Select_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Select_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Select_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Select_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Select_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Shape_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Shape_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Sin_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Sin_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Slice_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Slice_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SpaceToBatchND_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SpaceToDepth_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SpaceToDepth_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SparseToDense_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SparseToDense_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SplitV_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SplitV_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Split_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Split_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Square_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Square_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/SquaredDifference_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/SquaredDifference_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Squeeze_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Squeeze_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/StridedSlice_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Sum_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Sum_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Sum_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Tanh_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Tanh_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Tile_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Tile_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Tile_U8_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Tile_U8_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/TopKV2_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/TopKV2_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/TopKV2_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/TopKV2_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/TransposeConv_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/TransposeConv_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Unpack_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Unpack_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Unpack_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Unpack_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Unpack_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Unpack_002/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Unpack_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Unpack_003/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Where_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Where_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/Where_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/Where_001/test.reverse create mode 100644 res/TensorFlowLiteRecipes/While_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/While_001/test.recipe create mode 100644 res/TensorFlowLiteRecipes/While_002/test.recipe create mode 100644 res/TensorFlowLiteRecipes/While_003/test.recipe create mode 100644 res/TensorFlowLiteRecipes/YUV_TO_RGB_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/YUV_TO_RGB_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/YUV_TO_RGB_U8_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/YUV_TO_RGB_U8_000/test.reverse create mode 100644 res/TensorFlowLiteRecipes/ZerosLike_000/test.recipe create mode 100644 res/TensorFlowLiteRecipes/ZerosLike_000/test.reverse create mode 100644 res/TensorFlowLiteSchema/2.2.0/schema.fbs create mode 100644 res/TensorFlowLiteSchema/2.3.0-rc0/schema.fbs create mode 100644 res/TensorFlowPythonExamples/examples/AddV2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/BatchMatMulV2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/add_n/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/argmin/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/average_pool_2d/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/batch_normalization/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/batch_to_space/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/cast/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/ceil/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/concat/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/cond/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/conv2d_1/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/conv2d_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/conv2d_transpose/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/depth_to_space/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/depthwise_conv2d_1/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/depthwise_conv2d_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/expand_dims_00/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/expand_dims_01/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/expand_dims_02/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/fill/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/floormod/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/fused_batch_norm/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/gather/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/gather_nd/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/l2_normalize/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/local_response_normalization/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/log/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/log_softmax/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/log_softmax_2/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/logical_and/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/matrix_band_part/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/matrix_diag/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/matrix_set_diag/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/max_pool_with_argmax/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/maximum/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/minimum/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/negative/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/one_hot/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/pad-reflect/__init__.py mode change 100755 => 100644 res/TensorFlowPythonExamples/examples/prelu/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/range/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/rank/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/reduce_all/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/reduce_any/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/reduce_max/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/reduce_min/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/reduce_prod/__init__.py delete mode 100644 res/TensorFlowPythonExamples/examples/reshape/__init.py__ create mode 100644 res/TensorFlowPythonExamples/examples/reshape/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/reverse_sequence/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/reverse_v2/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/round/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/scatter_nd/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/segment_sum/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/shape/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/sin/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/slice/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/space_to_batch/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/space_to_batch_nd/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/space_to_depth/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/sparse_to_dense/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/split/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/split_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/square/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/squared_difference/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/squeeze_1/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/squeeze_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/strided_slice/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/sum/__init__.py create mode 100755 res/TensorFlowPythonExamples/examples/tile/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/top_k/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/unique/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/unstack/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/where/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/where_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/where_v2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/where_v2_2/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/while/__init__.py create mode 100644 res/TensorFlowPythonExamples/examples/zeros_like/__init__.py create mode 100644 res/TensorFlowPythonModels/.gitignore create mode 100644 res/TensorFlowPythonModels/README.md create mode 100644 res/TensorFlowPythonModels/examples/L2Pool2D/__init__.py create mode 100644 res/TensorFlowPythonModels/examples/ReluN1To1/__init__.py create mode 100644 res/TensorFlowPythonModels/examples/UnknownExpandDims/__init__.py create mode 100644 res/TensorFlowPythonModels/requirements.txt create mode 100644 res/TensorFlowPythonModels/tfpem.py create mode 100644 res/TensorFlowTests/NET_0043/test.info create mode 100644 res/TensorFlowTests/NET_0043/test.manifest create mode 100644 res/TensorFlowTests/NET_0043/test.pbtxt create mode 100644 res/TensorFlowTests/NET_YUV_TO_RGB/circle.rule create mode 100644 res/TensorFlowTests/NET_YUV_TO_RGB/test.info create mode 100644 res/TensorFlowTests/NET_YUV_TO_RGB/test.manifest create mode 100644 res/TensorFlowTests/NET_YUV_TO_RGB/test.pbtxt create mode 100644 res/TensorFlowTests/NET_YUV_TO_RGB/test.py create mode 100644 runtime/3rdparty/.FORMATDENY create mode 100644 runtime/3rdparty/CMakeLists.txt create mode 100644 runtime/3rdparty/half/CMakeLists.txt create mode 100644 runtime/3rdparty/half/include/Half.h create mode 100644 runtime/3rdparty/half/include/half/.FORMATDENY create mode 100644 runtime/3rdparty/half/include/half/ChangeLog.txt create mode 100644 runtime/3rdparty/half/include/half/LICENSE.txt create mode 100644 runtime/3rdparty/half/include/half/README.txt create mode 100644 runtime/3rdparty/half/include/half/include/half.hpp rename runtime/{libs => 3rdparty}/jsoncpp/CMakeLists.txt (100%) rename runtime/{libs => 3rdparty}/jsoncpp/README.md (100%) rename runtime/{libs => 3rdparty}/jsoncpp/json/json-forwards.h (100%) rename runtime/{libs => 3rdparty}/jsoncpp/json/json.h (100%) rename runtime/{libs => 3rdparty}/jsoncpp/jsoncpp.cpp (100%) rename {tools => runtime/3rdparty}/lcov-to-cobertura-xml/README.md (100%) rename {tools => runtime/3rdparty}/lcov-to-cobertura-xml/lcov_cobertura.py (100%) create mode 100644 runtime/contrib/android/.gitignore create mode 100644 runtime/contrib/android/README.md create mode 100644 runtime/contrib/android/api/Android.mk create mode 100644 runtime/contrib/android/api/Application.mk create mode 100644 runtime/contrib/android/api/build.gradle create mode 100644 runtime/contrib/android/api/prebuilt/Android.mk create mode 100644 runtime/contrib/android/api/prebuilt/backend_cpu/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/backend_cpu/libbackend_cpu.so create mode 100644 runtime/contrib/android/api/prebuilt/circle_loader/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/circle_loader/libcircle_loader.so create mode 100644 runtime/contrib/android/api/prebuilt/nnfw-dev/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/nnfw-dev/libnnfw-dev.so create mode 100644 runtime/contrib/android/api/prebuilt/onert_core/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/onert_core/libonert_core.so create mode 100644 runtime/contrib/android/api/prebuilt/tensorflowlite_jni/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/tensorflowlite_jni/libtensorflowlite_jni.so create mode 100644 runtime/contrib/android/api/prebuilt/tflite_loader/Android.mk create mode 120000 runtime/contrib/android/api/prebuilt/tflite_loader/libtflite_loader.so create mode 100644 runtime/contrib/android/api/proguard-rules.pro create mode 100644 runtime/contrib/android/api/src/main/AndroidManifest.xml create mode 100644 runtime/contrib/android/api/src/main/java/com/samsung/onert/Helper.java create mode 100644 runtime/contrib/android/api/src/main/java/com/samsung/onert/NativeSessionWrapper.java create mode 100644 runtime/contrib/android/api/src/main/java/com/samsung/onert/Session.java create mode 100644 runtime/contrib/android/api/src/main/java/com/samsung/onert/Tensor.java create mode 100644 runtime/contrib/android/api/src/main/java/com/samsung/onert/TensorInfo.java create mode 100644 runtime/contrib/android/api/src/main/native/Android.mk create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-api.cpp create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-api.h create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-helper.cpp create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-helper.h create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-internal.cpp create mode 100644 runtime/contrib/android/api/src/main/native/onert-native-internal.h create mode 100644 runtime/contrib/android/build.gradle create mode 100644 runtime/contrib/android/gradle.properties create mode 100644 runtime/contrib/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 runtime/contrib/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 runtime/contrib/android/gradlew create mode 100644 runtime/contrib/android/gradlew.bat create mode 100644 runtime/contrib/android/settings.gradle create mode 100755 runtime/contrib/android/update_jni_header.sh delete mode 100644 runtime/contrib/hi_perf_cpu/CMakeLists.txt delete mode 100644 runtime/contrib/hi_perf_cpu/HighPerformanceBackend.test.cc delete mode 100644 runtime/contrib/hi_perf_cpu/KernelGenerator.cc delete mode 100644 runtime/contrib/hi_perf_cpu/KernelGenerator.h delete mode 100644 runtime/contrib/hi_perf_cpu/TensorBuilder.cc delete mode 100644 runtime/contrib/hi_perf_cpu/TensorBuilder.h delete mode 100644 runtime/contrib/pure_arm_compute/CMakeLists.txt delete mode 100644 runtime/contrib/pure_arm_compute/src/compilation.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/compilation.h delete mode 100644 runtime/contrib/pure_arm_compute/src/event.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/event.h delete mode 100644 runtime/contrib/pure_arm_compute/src/execution.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/execution.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/FeatureSink.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/FeatureSource.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/IExecutionBuilder.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/MatrixSink.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/MatrixSource.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Model.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Model.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Sink.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Sinks.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Source.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Swizzle.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Tensor3DSink.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/Tensor3DSource.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/TensorSource.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/VectorSink.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/VectorSource.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/Cast.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/Cast.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/feature/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/kernel/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/matrix/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/arm_compute/tensor/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/feature/Reader.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/feature/Utils.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/feature/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/kernel/Reader.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/matrix/Reader.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/tensor/ConstView.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/tensor/Reader.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/nnapi/tensor/View.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Abs.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Abs.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Add.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Add.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ArgMax.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ArgMax.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/AvgPool2D.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/AvgPool2D.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/BatchToSpaceNd.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/BatchToSpaceNd.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Cast.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Cast.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Concat.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Concat.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Conv2D.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Conv2D.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/DepthToSpace.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/DepthToSpace.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/DepthwiseConv2D.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/DepthwiseConv2D.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Dequantize.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Dequantize.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Div.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Div.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/EmbeddingLookup.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/EmbeddingLookup.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Equal.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Equal.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Exp.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Exp.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Floor.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Floor.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/FullyConnected.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/FullyConnected.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Gather.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Gather.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/HashtableLookup.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/HashtableLookup.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/L2Normalization.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/L2Normalization.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/L2Pool2D.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/L2Pool2D.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LocalResponseNormalization.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LocalResponseNormalization.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalAnd.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalAnd.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalNot.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalNot.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalOr.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/LogicalOr.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Logistic.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Logistic.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Lstm.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Lstm.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/MaxPool2D.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/MaxPool2D.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Mean.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Mean.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Mul.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Mul.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Neg.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Neg.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Node.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/NodeVisitor.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/NotEqual.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/NotEqual.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/PReLU.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/PReLU.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Pack.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Pack.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Pad.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Pad.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/RSQRT.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/RSQRT.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU1.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU1.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU6.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReLU6.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceMax.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceMax.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceMin.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceMin.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceSum.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ReduceSum.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Reshape.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Reshape.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ResizeBilinear.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/ResizeBilinear.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Rnn.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Rnn.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SQRT.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SQRT.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Softmax.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Softmax.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SpaceToBatchND.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SpaceToBatchND.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SpaceToDepth.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SpaceToDepth.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Split.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Split.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SquaredDifference.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/SquaredDifference.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Squeeze.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Squeeze.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/StridedSlice.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/StridedSlice.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Sub.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Sub.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Tanh.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Tanh.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/TopKV2.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/TopKV2.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Transpose.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Transpose.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/TransposeConv.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/TransposeConv.h delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Unpack.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/internal/op/Unpack.h delete mode 100644 runtime/contrib/pure_arm_compute/src/library_info.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/logging.h delete mode 100644 runtime/contrib/pure_arm_compute/src/memory.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/memory.h delete mode 100644 runtime/contrib/pure_arm_compute/src/model.cc delete mode 100644 runtime/contrib/pure_arm_compute/src/model.h delete mode 100644 runtime/contrib/pure_arm_compute/symbolcheck.cpp create mode 100644 runtime/libs/benchmark/include/benchmark/Phases.h create mode 100644 runtime/libs/benchmark/include/benchmark/Types.h delete mode 100644 runtime/libs/benchmark/include/benchmark/Util.h create mode 100644 runtime/libs/benchmark/src/Phases.cpp create mode 100644 runtime/libs/benchmark/src/Result.cpp delete mode 100644 runtime/libs/misc/include/misc/EventCollector.h delete mode 100644 runtime/libs/misc/include/misc/EventRecorder.h create mode 100644 runtime/libs/misc/include/misc/RandomGenerator.h delete mode 100644 runtime/libs/misc/src/EventCollector.cpp delete mode 100644 runtime/libs/misc/src/EventRecorder.cpp create mode 100644 runtime/libs/misc/src/RandomGenerator.cpp create mode 100644 runtime/libs/tflite/include/tflite/RandomTestRunner.h create mode 100644 runtime/libs/tflite/src/RandomTestRunner.cpp delete mode 100644 runtime/onert/api/src/nnfw_debug_internal.cc delete mode 100644 runtime/onert/api/src/nnfw_debug_internal.h delete mode 100644 runtime/onert/backend/acl_cl/ShapeFixer.cc delete mode 100644 runtime/onert/backend/acl_cl/ShapeFixer.h delete mode 100644 runtime/onert/backend/acl_neon/ShapeFixer.cc delete mode 100644 runtime/onert/backend/acl_neon/ShapeFixer.h delete mode 100644 runtime/onert/backend/cpu/ShapeFixer.cc delete mode 100644 runtime/onert/backend/cpu/ShapeFixer.h create mode 100644 runtime/onert/backend/cpu/Tensor.h delete mode 100644 runtime/onert/backend/cpu/TensorManager.cc delete mode 100644 runtime/onert/backend/cpu/TensorManager.h delete mode 100644 runtime/onert/backend/cpu/kernel/AbsLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/AbsLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/AddLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/AddLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/AvgPoolLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/AvgPoolLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/CastLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/CastLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/CompareLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/CompareLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ConcatLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ConcatLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ConvolutionLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ConvolutionLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/DepthwiseConvolutionLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/DepthwiseConvolutionLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/DivLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/DivLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ExpLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ExpLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/FullyConnectedLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/FullyConnectedLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/GatherLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/GatherLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/LogisticLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/LogisticLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/MaxLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/MaxLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/MaxPoolLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/MaxPoolLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/MinLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/MinLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/MulLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/MulLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/OneHotLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/OneHotLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/OperationUtils.cc delete mode 100644 runtime/onert/backend/cpu/kernel/OperationUtils.h delete mode 100644 runtime/onert/backend/cpu/kernel/PackLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/PackLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/PadLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/PadLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/PermuteLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/PermuteLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ReduceLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ReduceLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ReshapeLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ReshapeLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/RsqrtLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/RsqrtLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/ShapeLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/ShapeLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/SinLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/SinLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/SliceLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/SliceLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/SoftMaxLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/SoftMaxLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/SplitLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/SplitLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/StridedSliceLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/StridedSliceLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/SubLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/SubLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/TanhLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/TanhLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/TransposeLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/TransposeLayer.h delete mode 100644 runtime/onert/backend/cpu/kernel/UnpackLayer.cc delete mode 100644 runtime/onert/backend/cpu/kernel/UnpackLayer.h delete mode 100644 runtime/onert/backend/cpu/operand/Tensor.cc delete mode 100644 runtime/onert/backend/cpu/operand/Tensor.h create mode 100644 runtime/onert/backend/cpu/ops/AbsLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/AbsLayer.h create mode 100644 runtime/onert/backend/cpu/ops/AddLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/AddLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ArgMinMaxLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ArgMinMaxLayer.h create mode 100644 runtime/onert/backend/cpu/ops/AvgPoolLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/AvgPoolLayer.h create mode 100644 runtime/onert/backend/cpu/ops/BatchMatMulLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/BatchMatMulLayer.h create mode 100644 runtime/onert/backend/cpu/ops/BroadcastToLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/BroadcastToLayer.h create mode 100644 runtime/onert/backend/cpu/ops/CastLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/CastLayer.h create mode 100644 runtime/onert/backend/cpu/ops/CompareLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/CompareLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ConcatLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ConcatLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ConvolutionLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ConvolutionLayer.h create mode 100644 runtime/onert/backend/cpu/ops/CosLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/CosLayer.h create mode 100644 runtime/onert/backend/cpu/ops/DepthwiseConvolutionLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/DepthwiseConvolutionLayer.h create mode 100644 runtime/onert/backend/cpu/ops/DivLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/DivLayer.h create mode 100644 runtime/onert/backend/cpu/ops/EinsumLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/EinsumLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ExpLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ExpLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ExpandDimsLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ExpandDimsLayer.h create mode 100644 runtime/onert/backend/cpu/ops/FillLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/FillLayer.h create mode 100644 runtime/onert/backend/cpu/ops/FullyConnectedLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/FullyConnectedLayer.h create mode 100644 runtime/onert/backend/cpu/ops/FusedBatchNormLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/FusedBatchNormLayer.h create mode 100644 runtime/onert/backend/cpu/ops/GatherLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/GatherLayer.h create mode 100644 runtime/onert/backend/cpu/ops/LogLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/LogLayer.h create mode 100644 runtime/onert/backend/cpu/ops/LogSoftMaxLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/LogSoftMaxLayer.h create mode 100644 runtime/onert/backend/cpu/ops/LogicalNotLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/LogicalNotLayer.h create mode 100644 runtime/onert/backend/cpu/ops/LogicalOrLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/LogicalOrLayer.h create mode 100644 runtime/onert/backend/cpu/ops/LogisticLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/LogisticLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MatrixBandPartLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MatrixBandPartLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MaxLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MaxLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MaxPoolLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MaxPoolLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MeanLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MeanLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MinLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MinLayer.h create mode 100644 runtime/onert/backend/cpu/ops/MulLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/MulLayer.h create mode 100644 runtime/onert/backend/cpu/ops/NegLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/NegLayer.h create mode 100644 runtime/onert/backend/cpu/ops/OneHotLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/OneHotLayer.h create mode 100644 runtime/onert/backend/cpu/ops/OperationUtils.cc create mode 100644 runtime/onert/backend/cpu/ops/OperationUtils.h create mode 100644 runtime/onert/backend/cpu/ops/PackLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/PackLayer.h create mode 100644 runtime/onert/backend/cpu/ops/PadLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/PadLayer.h create mode 100644 runtime/onert/backend/cpu/ops/PowLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/PowLayer.h create mode 100644 runtime/onert/backend/cpu/ops/RangeLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/RangeLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ReLULayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ReLULayer.h create mode 100644 runtime/onert/backend/cpu/ops/ReduceLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ReduceLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ReshapeLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ReshapeLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ReverseLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ReverseLayer.h create mode 100644 runtime/onert/backend/cpu/ops/RoundLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/RoundLayer.h create mode 100644 runtime/onert/backend/cpu/ops/RsqrtLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/RsqrtLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SelectLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SelectLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ShapeLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ShapeLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SinLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SinLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SliceLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SliceLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SoftMaxLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SoftMaxLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SpaceToBatchNDLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SpaceToBatchNDLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SplitLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SplitLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SquaredDiffLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SquaredDiffLayer.h create mode 100644 runtime/onert/backend/cpu/ops/StridedSliceLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/StridedSliceLayer.h create mode 100644 runtime/onert/backend/cpu/ops/SubLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/SubLayer.h create mode 100644 runtime/onert/backend/cpu/ops/TanhLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/TanhLayer.h create mode 100644 runtime/onert/backend/cpu/ops/TileLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/TileLayer.h create mode 100644 runtime/onert/backend/cpu/ops/TransposeLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/TransposeLayer.h create mode 100644 runtime/onert/backend/cpu/ops/UnpackLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/UnpackLayer.h create mode 100644 runtime/onert/backend/cpu/ops/ZerosLikeLayer.cc create mode 100644 runtime/onert/backend/cpu/ops/ZerosLikeLayer.h delete mode 100644 runtime/onert/backend/cpu_common/Allocator.cc delete mode 100644 runtime/onert/backend/cpu_common/CMakeLists.txt delete mode 100644 runtime/onert/backend/cpu_common/MemoryManager.cc delete mode 100644 runtime/onert/backend/cpu_common/MemoryManager.h delete mode 100644 runtime/onert/backend/cpu_common/MemoryPlanner.cc delete mode 100644 runtime/onert/backend/cpu_common/MemoryPlanner.h delete mode 100644 runtime/onert/backend/cpu_common/MemoryPlannerFactory.cc delete mode 100644 runtime/onert/backend/cpu_common/MemoryPlannerFactory.h create mode 100644 runtime/onert/core/include/backend/IDynamicTensorManager.h create mode 100644 runtime/onert/core/include/backend/IPortableTensor.h delete mode 100644 runtime/onert/core/include/backend/IShapeFixer.h create mode 100644 runtime/onert/core/include/backend/IStaticTensorManager.h create mode 100644 runtime/onert/core/include/backend/ITensorRegistry.h rename runtime/onert/{ => core/include}/backend/cpu_common/Allocator.h (100%) create mode 100644 runtime/onert/core/include/backend/cpu_common/DynamicTensorManager.h create mode 100644 runtime/onert/core/include/backend/cpu_common/IMemoryPlanner.h create mode 100644 runtime/onert/core/include/backend/cpu_common/MemoryManager.h create mode 100644 runtime/onert/core/include/backend/cpu_common/StaticTensorManager.h create mode 100644 runtime/onert/core/include/backend/cpu_common/Tensor.h create mode 100644 runtime/onert/core/include/backend/cpu_common/TensorRegistry.h create mode 100644 runtime/onert/core/include/compiler/StaticShapeInference.h create mode 100644 runtime/onert/core/include/exec/DynamicShapeInference.h delete mode 100644 runtime/onert/core/include/exec/ExecutionObservers.h delete mode 100644 runtime/onert/core/include/ir/BackendSet.h delete mode 100644 runtime/onert/core/include/ir/OperationIndexList.h create mode 100644 runtime/onert/core/include/ir/OperationIndexSet.h create mode 100644 runtime/onert/core/include/ir/Subgraphs.h create mode 100644 runtime/onert/core/include/ir/operation/BCQFullyConnected.h create mode 100644 runtime/onert/core/include/ir/operation/BCQGather.h create mode 100644 runtime/onert/core/include/ir/operation/BatchMatMul.h create mode 100644 runtime/onert/core/include/ir/operation/BroadcastTo.h create mode 100644 runtime/onert/core/include/ir/operation/Cos.h create mode 100644 runtime/onert/core/include/ir/operation/Einsum.h create mode 100644 runtime/onert/core/include/ir/operation/ExpandDims.h create mode 100644 runtime/onert/core/include/ir/operation/Fill.h create mode 100644 runtime/onert/core/include/ir/operation/FusedBatchNorm.h create mode 100644 runtime/onert/core/include/ir/operation/If.h create mode 100644 runtime/onert/core/include/ir/operation/Log.h create mode 100644 runtime/onert/core/include/ir/operation/LogSoftmax.h create mode 100644 runtime/onert/core/include/ir/operation/MatrixBandPart.h create mode 100644 runtime/onert/core/include/ir/operation/Pow.h create mode 100644 runtime/onert/core/include/ir/operation/Range.h create mode 100644 runtime/onert/core/include/ir/operation/Reduce.h delete mode 100644 runtime/onert/core/include/ir/operation/ReduceMax.h delete mode 100644 runtime/onert/core/include/ir/operation/ReduceMin.h delete mode 100644 runtime/onert/core/include/ir/operation/ReduceSum.h create mode 100644 runtime/onert/core/include/ir/operation/Reverse.h create mode 100644 runtime/onert/core/include/ir/operation/Round.h create mode 100644 runtime/onert/core/include/ir/operation/Select.h create mode 100644 runtime/onert/core/include/ir/operation/Tile.h create mode 100644 runtime/onert/core/include/ir/operation/While.h create mode 100644 runtime/onert/core/include/ir/operation/ZerosLike.h delete mode 100644 runtime/onert/core/include/util/EventCollectorGlobal.h delete mode 100644 runtime/onert/core/include/util/feature/nchw/Reader.h delete mode 100644 runtime/onert/core/include/util/feature/nchw/View.h delete mode 100644 runtime/onert/core/include/util/feature/nhwc/Reader.h delete mode 100644 runtime/onert/core/include/util/feature/nhwc/View.h create mode 100644 runtime/onert/core/src/backend/IConstantInitializer.cc create mode 100644 runtime/onert/core/src/backend/ITensor.cc create mode 100644 runtime/onert/core/src/backend/controlflow/Backend.h create mode 100644 runtime/onert/core/src/backend/controlflow/Config.cc create mode 100644 runtime/onert/core/src/backend/controlflow/Config.h create mode 100644 runtime/onert/core/src/backend/controlflow/ConstantInitializer.h create mode 100644 runtime/onert/core/src/backend/controlflow/DynamicTensorManager.cc create mode 100644 runtime/onert/core/src/backend/controlflow/DynamicTensorManager.h create mode 100644 runtime/onert/core/src/backend/controlflow/KernelGenerator.cc create mode 100644 runtime/onert/core/src/backend/controlflow/KernelGenerator.h create mode 100644 runtime/onert/core/src/backend/controlflow/TensorBuilder.cc create mode 100644 runtime/onert/core/src/backend/controlflow/TensorBuilder.h create mode 100644 runtime/onert/core/src/backend/controlflow/UserTensor.cc create mode 100644 runtime/onert/core/src/backend/controlflow/UserTensor.h create mode 100644 runtime/onert/core/src/backend/controlflow/UserTensorRegistry.h create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/IfLayer.cc create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/IfLayer.h create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/PermuteLayer.cc create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/PermuteLayer.h create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/WhileLayer.cc create mode 100644 runtime/onert/core/src/backend/controlflow/kernel/WhileLayer.h create mode 100644 runtime/onert/core/src/backend/cpu_common/Allocator.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/DynamicTensorManager.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/MemoryManager.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/MemoryPlanner.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/MemoryPlanner.h rename runtime/onert/{ => core/src}/backend/cpu_common/MemoryPlanner.test.cc (100%) create mode 100644 runtime/onert/core/src/backend/cpu_common/MemoryPlannerFactory.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/MemoryPlannerFactory.h create mode 100644 runtime/onert/core/src/backend/cpu_common/StaticTensorManager.cc create mode 100644 runtime/onert/core/src/backend/cpu_common/Tensor.cc delete mode 100644 runtime/onert/core/src/compiler/CachedDataDeleter.h create mode 100644 runtime/onert/core/src/compiler/Fp32ToFp16Converter.cc create mode 100644 runtime/onert/core/src/compiler/Fp32ToFp16Converter.h create mode 100644 runtime/onert/core/src/compiler/StaticShapeInference.cc create mode 100644 runtime/onert/core/src/compiler/TensorBuilders.h delete mode 100644 runtime/onert/core/src/dumper/dot/DotOpSequenceInfo.cc delete mode 100644 runtime/onert/core/src/dumper/dot/DotOpSequenceInfo.h create mode 100644 runtime/onert/core/src/dumper/dot/DotSubgraphInfo.cc create mode 100644 runtime/onert/core/src/dumper/dot/DotSubgraphInfo.h create mode 100644 runtime/onert/core/src/exec/BackendSet.h create mode 100644 runtime/onert/core/src/exec/DynamicShapeInference.cc rename runtime/onert/core/{include => src}/exec/ExecTime.h (100%) create mode 100644 runtime/onert/core/src/exec/ExecutionObservers.h create mode 100644 runtime/onert/core/src/exec/IPermuteFunction.h rename runtime/onert/core/{include => src}/exec/JSONExecTime.h (100%) create mode 100644 runtime/onert/core/src/exec/ShapeConverter.cc create mode 100644 runtime/onert/core/src/exec/ShapeConverter.h create mode 100644 runtime/onert/core/src/exec/feature/IndexIterator.h create mode 100644 runtime/onert/core/src/exec/feature/Reader.h create mode 100644 runtime/onert/core/src/exec/feature/nchw/Reader.h create mode 100644 runtime/onert/core/src/exec/feature/nchw/View.h create mode 100644 runtime/onert/core/src/exec/feature/nhwc/Reader.h create mode 100644 runtime/onert/core/src/exec/feature/nhwc/View.h rename runtime/onert/core/{include => src}/interp/InterpExecutor.h (100%) create mode 100644 runtime/onert/core/src/ir/DataType.cc delete mode 100644 runtime/onert/core/src/ir/OperationIndexList.cc create mode 100644 runtime/onert/core/src/ir/OperationIndexSet.cc create mode 100644 runtime/onert/core/src/ir/operation/BCQFullyConnected.cc create mode 100644 runtime/onert/core/src/ir/operation/BCQGather.cc create mode 100644 runtime/onert/core/src/ir/operation/BatchMatMul.cc create mode 100644 runtime/onert/core/src/ir/operation/BroadcastTo.cc create mode 100644 runtime/onert/core/src/ir/operation/Cos.cc create mode 100644 runtime/onert/core/src/ir/operation/Einsum.cc create mode 100644 runtime/onert/core/src/ir/operation/ExpandDims.cc create mode 100644 runtime/onert/core/src/ir/operation/Fill.cc create mode 100644 runtime/onert/core/src/ir/operation/FusedBatchNorm.cc create mode 100644 runtime/onert/core/src/ir/operation/If.cc create mode 100644 runtime/onert/core/src/ir/operation/Log.cc create mode 100644 runtime/onert/core/src/ir/operation/LogSoftmax.cc create mode 100644 runtime/onert/core/src/ir/operation/MatrixBandPart.cc delete mode 100644 runtime/onert/core/src/ir/operation/Mean.cc create mode 100644 runtime/onert/core/src/ir/operation/Pow.cc create mode 100644 runtime/onert/core/src/ir/operation/Range.cc create mode 100644 runtime/onert/core/src/ir/operation/Reduce.cc delete mode 100644 runtime/onert/core/src/ir/operation/ReduceMax.cc delete mode 100644 runtime/onert/core/src/ir/operation/ReduceMin.cc delete mode 100644 runtime/onert/core/src/ir/operation/ReduceSum.cc create mode 100644 runtime/onert/core/src/ir/operation/Reverse.cc create mode 100644 runtime/onert/core/src/ir/operation/Round.cc create mode 100644 runtime/onert/core/src/ir/operation/Select.cc create mode 100644 runtime/onert/core/src/ir/operation/Tile.cc create mode 100644 runtime/onert/core/src/ir/operation/While.cc create mode 100644 runtime/onert/core/src/ir/operation/ZerosLike.cc create mode 100644 runtime/onert/core/src/ir/pass/ConstantLoweringPass.cc create mode 100644 runtime/onert/core/src/ir/pass/ConstantLoweringPass.h create mode 100644 runtime/onert/core/src/util/EventCollector.cc create mode 100644 runtime/onert/core/src/util/EventCollector.h create mode 100644 runtime/onert/core/src/util/EventCollectorGlobal.h create mode 100644 runtime/onert/core/src/util/EventRecorder.cc create mode 100644 runtime/onert/core/src/util/EventRecorder.h create mode 100644 runtime/onert/test/ir/Shape.cc delete mode 100644 tests/nnapi/nnapi_gtest.skip.aarch64-linux.srcn delete mode 100644 tests/nnapi/nnapi_gtest.skip.armv7l-linux.srcn delete mode 100644 tests/nnapi/nnapi_gtest.skip.armv7l-tizen.acl_cl create mode 100755 tests/nnapi/nnapi_test_generator/android-10/dynamic_tensor.py create mode 100644 tests/nnapi/specs/Ex/add_v2_ex.mod.py create mode 100644 tests/nnapi/specs/Ex/batch_matmul_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/batch_matmul_ex_float.mod.py create mode 100644 tests/nnapi/specs/Ex/broadcast_to_ex_1D_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/broadcast_to_ex_2D_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/broadcast_to_ex_dynamic_2D_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/broadcast_to_ex_dynamic_3D_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/cos_ex_1D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/cos_ex_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/cos_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/einsum_ex_float.mod.py create mode 100644 tests/nnapi/specs/Ex/fill_ex_1D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/fill_ex_4D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/fill_ex_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/fully_connected_float_2_weights_as_inputs.mod.py create mode 100644 tests/nnapi/specs/Ex/fusedbatchnorm_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/fusedbatchnorm_ex_float.mod.py create mode 100644 tests/nnapi/specs/Ex/matrix_band_part_ex_4D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/matrix_band_part_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/one_hot_ex_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/pack_ex_2D_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/pack_ex_2D_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/pack_ex_2D_int_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/pack_ex_2D_int_2.mod.py create mode 100644 tests/nnapi/specs/Ex/pack_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/range_ex_float_1.mod.py create mode 100644 tests/nnapi/specs/Ex/range_ex_float_1_all_constant_inputs.mod.py create mode 100644 tests/nnapi/specs/Ex/range_ex_float_1_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/range_ex_float_2.mod.py create mode 100644 tests/nnapi/specs/Ex/range_ex_float_2_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/reverse_ex.mod.py create mode 100644 tests/nnapi/specs/Ex/reverse_ex_dynamic_1D.mod.py create mode 100644 tests/nnapi/specs/Ex/reverse_ex_dynamic_3D.mod.py create mode 100644 tests/nnapi/specs/Ex/round_ex_1D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/round_ex_4D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/round_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/select_v2_ex.mod.py create mode 100644 tests/nnapi/specs/Ex/select_v2_ex_broadcast_2d_two_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/shape_ex_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_1D_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_2D_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_3D_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_4D_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_broadcast_4D_2D_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/squared_difference_ex_broadcast_float.mod.py create mode 100644 tests/nnapi/specs/Ex/squared_difference_ex_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/transpose_conv_ex_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/transpose_conv_ex_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/transpose_conv_ex_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/transpose_conv_ex_float_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/unpack_ex_3D_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/unpack_ex_3D_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/unpack_ex_3D_int_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/Ex/unpack_ex_3D_int_2.mod.py create mode 100644 tests/nnapi/specs/Ex/unpack_ex_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/Ex/zeros_like_ex_2D_float.mod.py create mode 100644 tests/nnapi/specs/Ex/zeros_like_ex_4D_int32.mod.py create mode 100644 tests/nnapi/specs/Ex/zeros_like_ex_dynamic_float32.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/add.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/add_broadcast_4D_2D_after_nops_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/add_broadcast_quant8.mod.py create mode 100644 tests/nnapi/specs/V1_0/add_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/add_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_float_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_float_5.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_quant8_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/avg_pool_quant8_5.mod.py create mode 100644 tests/nnapi/specs/V1_0/concat_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_float_4D_axis3_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/concat_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_1_h3_w2_SAME.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_1_h3_w2_VALID.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_3_h3_w2_SAME.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_3_h3_w2_VALID.mod.py create mode 100644 tests/nnapi/specs/V1_0/conv_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_channels.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_channels_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_float_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_channels.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_channels_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_overflow.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_overflow_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/conv_quant8_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depth_to_space_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depth_to_space_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depth_to_space_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depth_to_space_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depth_to_space_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_large_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_large_2_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_float_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_quant8_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_quant8_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/depthwise_conv2d_quant8_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/dequantize.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/embedding_lookup.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/embedding_lookup_2d_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/embedding_lookup_4d_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/floor_.mod.py create mode 100644 tests/nnapi/specs/V1_0/fully_connected_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_float_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_hybrid_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_hybrid_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_quant8_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_quant8_large_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/fully_connected_quant8_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/hashtable_lookup_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/hashtable_lookup_float_4D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/hashtable_lookup_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_normalization.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_normalization_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_normalization_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_pool_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_pool_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/l2_pool_float_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/local_response_norm_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/local_response_norm_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/local_response_norm_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/local_response_norm_float_4.mod.py create mode 100644 tests/nnapi/specs/V1_0/logistic_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/logistic_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/logistic_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/logistic_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/logistic_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lsh_projection.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lsh_projection_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lsh_projection_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm2_state.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm2_state2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm3_state.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm3_state2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm3_state3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm_state.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/lstm_state2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_float_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/max_pool_quant8_4.mod.py create mode 100644 tests/nnapi/specs/V1_0/maximum_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_0/minimum_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_4D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_broadcast_3D_1D_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_broadcast_3D_1D_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_broadcast_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_float_square_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/mul_relu.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu1_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu1_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu1_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu1_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu6_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu6_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu6_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu6_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/relu_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/reshape.mod.py create mode 100644 tests/nnapi/specs/V1_0/reshape_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_0/reshape_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/reshape_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/reshape_quant8_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/reshape_weights_as_inputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/resize_bilinear.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/resize_bilinear_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/rnn.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/rnn_state.mod.py create mode 100644 tests/nnapi/specs/V1_0/softmax_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/softmax_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/softmax_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/softmax_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/softmax_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/space_to_depth_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/space_to_depth_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/space_to_depth_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/space_to_depth_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/space_to_depth_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/svdf.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/svdf2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/svdf_bias_present.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/svdf_state.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_0/tanh_.mod.py rename tests/nnapi/specs/{skip => }/V1_1/add_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/avg_pool_float_1_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/avg_pool_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/avg_pool_float_3_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/avg_pool_float_4_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/avg_pool_float_5_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/batch_to_space.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/batch_to_space_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/batch_to_space_quant8_1.mod.py rename tests/nnapi/specs/{skip => }/V1_1/concat_float_1_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/concat_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/concat_float_3_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_1_h3_w2_SAME_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_1_h3_w2_VALID_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_3_h3_w2_SAME_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_3_h3_w2_VALID_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_channels_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_channels_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_large_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_large_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/conv_float_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_large_2_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_large_2_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_large_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_large_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv2d_float_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/depthwise_conv_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/div_.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/div_broadcast_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/div_broadcast_float_4D_2D_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/fully_connected_float_4d_simple.mod.py rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_4d_simple_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_large_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_large_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/fully_connected_float_weights_as_inputs_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_4D_float_reducing_C_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_4D_float_reducing_HW_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_axis01_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_axis01_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/mean_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_2D_HW_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_3D_HWC_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_BHWC_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_BHW_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_HWD_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_1/pad_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/pad_quant8_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_1/softmax_float_1_relaxed.mod.py (100%) mode change 100755 => 100644 rename tests/nnapi/specs/{skip => }/V1_1/softmax_float_2_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch.mod.py create mode 100644 tests/nnapi/specs/V1_1/space_to_batch_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_quant8_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_quant8_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/space_to_batch_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/squeeze.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/squeeze_2D_float_1_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_1/squeeze_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/squeeze_float_1.mod.py rename tests/nnapi/specs/{skip => }/V1_1/squeeze_float_1_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/squeeze_quant8_1.mod.py rename tests/nnapi/specs/{skip => }/V1_1/squeeze_relaxed.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice.mod.py create mode 100644 tests/nnapi/specs/V1_1/strided_slice_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_10.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_11.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_5.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_6.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_7.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_float_9.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_qaunt8_10.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_qaunt8_11.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_5.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_6.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_7.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_8.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/strided_slice_quant8_9.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/sub.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/sub_broadcast_4D_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/sub_broadcast_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/transpose.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/transpose_2D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/transpose_3D_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_1/transpose_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/transpose_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_1/transpose_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/abs_.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/abs_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/abs_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/abs_3D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/abs_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/abs_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_3.mod.py create mode 100644 tests/nnapi/specs/V1_2/argmax_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_neg_axis_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_neg_axis_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_quant8_neg_axis_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/argmax_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/cast.mod.py create mode 100644 tests/nnapi/specs/V1_2/cast_dynamic_float32_to_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/cast_float32_to_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/cast_int32_to_float32_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/div_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal_4D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal_broadcast_4D_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal_broadcast_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/equal_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/equal_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/equal_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/exp_.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/exp_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/exp_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/exp_3D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/exp_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/exp_dynamic_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/expand_dims.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/expand_dims_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_1D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_1D_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_2D_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_2D_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_3D_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_3D_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_2D_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_3D_2D_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_3D_2D_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_3D_2D_float_3_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/gather_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/gather_higher_rank.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/greater_equal.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_equal_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_equal_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/greater_equal_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_equal_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/greater_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/less.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_dynamic_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_equal_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_equal_dynamic_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_equal_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/less_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/less_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/log_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/log_dynamic_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/log_softmax_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_1D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_2D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_3D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_4D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_broadcast_4D_2D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_and_broadcast_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_not.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_not_1D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_not_4D_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/logical_not_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_1D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_2D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_3D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_4D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_broadcast_4D_2D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/logical_or_broadcast_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/logical_or_dynamic_nnfw.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/maximum.mod.py create mode 100644 tests/nnapi/specs/V1_2/maximum_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/minimum.mod.py create mode 100644 tests/nnapi/specs/V1_2/minimum_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/mul_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_3D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_3D_int_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_4D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/neg_4D_int_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/neg_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/not_equal.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/not_equal_broadcast_4D_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/not_equal_broadcast_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/not_equal_broadcast_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/not_equal_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/not_equal_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/not_equal_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/pow_2D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/pow_broadcast_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/pow_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/prelu.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/prelu_broadcast_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/prelu_broadcast_quant8_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/prelu_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/prelu_quant8_1_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/reduce_all.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/reduce_all_2D_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_all_4D_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_all_dynamic_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/reduce_any.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/reduce_any_2D_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_any_4D_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_2D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_4D_float_reducing_C_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_4D_float_reducing_HW_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_quant8_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_max_quant8_2_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_mean_dynamic_1_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_mean_dynamic_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_min.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_min_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_min_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_min_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_min_float_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/reduce_prod.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_2D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_4D_float_reducing_C_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_4D_float_reducing_HW_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_dynamic_1_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_prod_dynamic_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_sum.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_sum_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_sum_4D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_sum_4D_float_reducing_C_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/reduce_sum_4D_float_reducing_HW_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_sum_dynamic_1_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/reduce_sum_dynamic_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/rsqrt.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/rsqrt_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/rsqrt_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/rsqrt_3D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/rsqrt_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/rsqrt_dynamic_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/select_v1_2.mod.py (100%) mode change 100755 => 100644 mode change 100755 => 100644 tests/nnapi/specs/V1_2/sin_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sin_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/sin_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/slice.mod.py create mode 100644 tests/nnapi/specs/V1_2/slice_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_1D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_float_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_float_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_float_3_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_int32_1_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_int32_2_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_int32_3_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_int32_4_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_int32_5_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_4D_quant8_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/split_dynamic_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_float_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_float_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_float_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_float_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_float_5.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_int32_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_int32_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_int32_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_int32_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_quant8_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_quant8_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_quant8_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/split_quant8_4.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sqrt_.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sqrt_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sqrt_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sqrt_3D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sqrt_4D_float_nnfw.mod.py create mode 100644 tests/nnapi/specs/V1_2/sub_dynamic_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sub_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/sub_v1_2_broadcast.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/tanh_v1_2.mod.py create mode 100644 tests/nnapi/specs/V1_2/tanh_v1_dynamic_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/tile_1.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/tile_1_dynamic_float32_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/tile_2.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/tile_2_dynamic_float32_nnfw.mod.py rename tests/nnapi/specs/{skip => }/V1_2/tile_3.mod.py (100%) mode change 100755 => 100644 create mode 100644 tests/nnapi/specs/V1_2/tile_3_dynamic_float32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_1D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_1D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_1D_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_2D_float_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_2D_int32_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/topk_v2_2D_quant8_nnfw.mod.py mode change 100755 => 100644 tests/nnapi/specs/V1_2/transpose_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_0/mobilenet_224_gender_basic_fixed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_0/mobilenet_quantized.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/batch_to_space_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/batch_to_space_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/depth_to_space_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/depth_to_space_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/depth_to_space_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/dequantize_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/div_broadcast_float_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/div_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/embedding_lookup_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/floor_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/hashtable_lookup_float_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_normalization_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_normalization_large_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_normalization_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_pool_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_pool_float_large_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/l2_pool_float_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/local_response_norm_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/local_response_norm_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/local_response_norm_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/local_response_norm_float_4_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/logistic_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/logistic_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lsh_projection_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lsh_projection_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lsh_projection_weights_as_inputs_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm2_state2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm2_state_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm3_state2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm3_state3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm3_state_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm_state2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/lstm_state_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/max_pool_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/max_pool_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/max_pool_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/max_pool_float_4_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mean_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mean_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mean_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mobilenet_224_gender_basic_fixed_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mul_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/mul_relu_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/pad_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/pad_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu1_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu1_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu6_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu6_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/relu_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/reshape_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/reshape_weights_as_inputs_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/resize_bilinear_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/resize_bilinear_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/rnn_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/rnn_state_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_batch_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_batch_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_batch_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_batch_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_depth_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_depth_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/space_to_depth_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_10_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_11_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_4_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_5_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_6_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_7_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_8_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_float_9_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/strided_slice_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/sub_broadcast_float_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/sub_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/svdf2_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/svdf_bias_present_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/svdf_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/svdf_state_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/tanh_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/transpose_float_1_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_1/transpose_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/add_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/argmin_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/argmin_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/argmin_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/avg_pool_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/axis_aligned_bbox_transform.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/batch_to_space_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bbox_graph.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_aux_input.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_cifg_peephole.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_float16_batch_major.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_float16_batch_major_aux_input.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_float16_batch_major_merge_outputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_merge_outputs.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_lstm_norm_fw_output.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/bidirectional_sequence_rnn.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/box_with_nms_limit_gaussian.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/box_with_nms_limit_hard.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/box_with_nms_limit_linear.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/channel_shuffle.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/concat_float16_1.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/concat_float16_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/concat_float16_3.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/concat_mixed_quant.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/concat_zero_sized.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/conv2d_dilation.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/conv2d_per_channel.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/conv2d_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/depth_to_space_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/depthwise_conv2d_dilation.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/depthwise_conv2d_per_channel.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/depthwise_conv2d_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/dequantize_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/detection_postprocess.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/div_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/floor_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/fully_connected_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/generate_proposals.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/greater.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/grouped_conv2d.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/heatmap_max_keypoint.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/instance_normalization.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/l2_normalization_axis.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/l2_normalization_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/l2_pool_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/layer_norm_lstm.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/less_equal.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/local_response_normalization_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/log.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/log_softmax.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/logistic_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lsh_projection_3_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lsh_projection_4_relaxed.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lsh_projection_deprecated.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lsh_projection_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm2_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm2_state2_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm2_state_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm3_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm3_state2_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm3_state3_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm3_state_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm_state2_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/lstm_state_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/max_pool_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/mean_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/mul_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_all_dims.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_low_rank.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_low_rank_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_quant8_nonzero.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_1_float.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_1_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_all_dims.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_all_dims_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_low_rank.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pad_v2_low_rank_quant8.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/pow.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/quantize.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/quantized_lstm.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/random_multinomial.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/random_multinomial_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/relu1_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/relu6_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/relu_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/reshape_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/resize_bilinear_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/resize_nearest_neighbor.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/rnn_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/roi_align.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/roi_pooling.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/sin.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/softmax_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/space_to_batch_quant8_nonzero.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/space_to_batch_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/space_to_depth_v1_2.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/squeeze_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/strided_slice_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/sub_quantized_different_scales.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/svdf_bias_present_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/svdf_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/svdf_state_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/transpose_conv2d.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/transpose_conv2d_large.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/transpose_float16.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_1step.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_batch_major_norm_peephole_projection.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_batch_major_peephole_projection_bias.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_cifg_peephole.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_f16_batch_major.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_f16_norm_peephole_projection.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_layer_norm_cifg_peephole.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_lstm_norm_peephole_projection.mod.py mode change 100755 => 100644 tests/nnapi/specs/skip/V1_2/unidirectional_sequence_rnn.mod.py create mode 100644 tests/nnfw_api/README.md delete mode 100644 tests/nnfw_api/src/FourOneOpModelSetInput.cc create mode 100644 tests/nnfw_api/src/ModelTestDynamicTensor.cc create mode 100644 tests/nnfw_api/src/ModelTestInputReshaping.cc create mode 100644 tests/nnfw_api/src/NNPackages.cc create mode 100644 tests/nnfw_api/src/NNPackages.h create mode 100644 tests/nnfw_api/src/RegressionTests.cc create mode 100644 tests/nnfw_api/src/ValidationTestAddModelLoaded.cc create mode 100644 tests/nnfw_api/src/ValidationTestAddSessionPrepared.cc create mode 100644 tests/nnfw_api/src/ValidationTestFourAddModelsSetInput.cc create mode 100644 tests/nnfw_api/src/ValidationTestSessionCreated.cc create mode 100644 tests/nnfw_api/src/ValidationTestSingleSession.cc create mode 100644 tests/nnfw_api/src/common.cc create mode 100644 tests/nnfw_api/src/common.h delete mode 100644 tests/nnfw_api/src/create_session.cc delete mode 100644 tests/nnfw_api/src/load_model.cc delete mode 100644 tests/nnfw_api/src/model_path.cc delete mode 100644 tests/nnfw_api/src/model_path.h delete mode 100644 tests/nnfw_api/src/prepare.cc create mode 100755 tests/scripts/framework/tests/MODELS/mobilenet_quant8/config.sh create mode 100755 tests/scripts/framework/tests/select/config.sh create mode 100644 tests/scripts/framework/tests/tile/config.sh create mode 100755 tests/scripts/framework/tests/zeros_like/config.sh rename tools/nnpackage_tool/nnpkg_test/list.armv7l-linux.acl_cl => tests/scripts/list/nnpkg_test_list.armv7l-linux.acl_cl (100%) rename tools/nnpackage_tool/nnpkg_test/list.armv7l-linux.acl_neon => tests/scripts/list/nnpkg_test_list.armv7l-linux.acl_neon (100%) rename tools/nnpackage_tool/nnpkg_test/list.armv7l-linux.cpu => tests/scripts/list/nnpkg_test_list.armv7l-linux.cpu (100%) rename tools/nnpackage_tool/nnpkg_test/list.armv7l-linux.srcn => tests/scripts/list/nnpkg_test_list.armv7l-linux.srcn (100%) rename tools/nnpackage_tool/nnpkg_test/list.noarch.interp => tests/scripts/list/nnpkg_test_list.noarch.interp (100%) create mode 100755 tests/scripts/nnfw_api_gtest/install_nnfw_api_gtest_nnpackages.sh rename tests/scripts/{oneapi_test => nnfw_api_gtest}/models/add/config.sh (100%) create mode 100644 tests/scripts/nnfw_api_gtest/models/add_invalid_manifest/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/add_no_manifest/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/add_unspecified_rank_inputs/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/dynamic_tensor_reshape/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/if_dynamic/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/input_reshaping_add/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/neg/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/unknown_dim_input_concat/config.sh create mode 100644 tests/scripts/nnfw_api_gtest/models/while_dynamic/config.sh create mode 100755 tests/scripts/nnpkg_test.sh delete mode 100755 tests/scripts/oneapi_test/install_oneapi_test_nnpackages.sh create mode 100644 tests/tools/nnapi_test/src/args.cc create mode 100644 tests/tools/nnapi_test/src/args.h create mode 100644 tests/tools/nnpackage_run/src/randomgen.cc create mode 100644 tests/tools/nnpackage_run/src/randomgen.h delete mode 100644 tests/tools/tflite_benchmark/CMakeLists.txt delete mode 100644 tests/tools/tflite_benchmark/src/tflite_benchmark.cc create mode 100644 tests/tools/tflite_run_2_2_0/CMakeLists.txt create mode 100644 tests/tools/tflite_run_2_2_0/src/args.cc create mode 100644 tests/tools/tflite_run_2_2_0/src/args.h create mode 100644 tests/tools/tflite_run_2_2_0/src/tensor_view.h create mode 100644 tests/tools/tflite_run_2_2_0/src/tflite_run_2_2_0.cc rename tools/cross/{build_android_ndk.sh => install_android_ndk.sh} (100%) rename tools/cross/{build_rootfs.sh => install_rootfs.sh} (100%) delete mode 100644 tools/nnpackage_tool/nnpkg_test/README.md delete mode 100755 tools/nnpackage_tool/nnpkg_test/nnpkg_test.sh delete mode 100644 tools/nnpackage_tool/tf2tfliteV2/README.md delete mode 100755 tools/nnpackage_tool/tf2tfliteV2/tf2tfliteV2.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/AbsOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ActivationFunctionType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/AddNOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/AddOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ArgMaxOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ArgMinOptions.py create mode 100644 tools/tflitefile_tool/tflite/BatchMatMulOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/BatchToSpaceNDOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/BidirectionalSequenceLSTMOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/BidirectionalSequenceRNNOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Buffer.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/BuiltinOperator.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/BuiltinOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CallOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CastOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CombinerType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ConcatEmbeddingsOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ConcatenationOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Conv2DOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CosOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CustomOptionsFormat.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/CustomQuantization.py create mode 100644 tools/tflitefile_tool/tflite/DensifyOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/DepthToSpaceOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/DepthwiseConv2DOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/DequantizeOptions.py create mode 100644 tools/tflitefile_tool/tflite/DimensionMetadata.py create mode 100644 tools/tflitefile_tool/tflite/DimensionType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/DivOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/EmbeddingLookupSparseOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/EqualOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ExpOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ExpandDimsOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FakeQuantOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FillOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FloorDivOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FloorModOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FullyConnectedOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/FullyConnectedOptionsWeightsFormat.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/GatherNdOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/GatherOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/GreaterEqualOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/GreaterOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/HardSwishOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/IfOptions.py create mode 100644 tools/tflitefile_tool/tflite/Int32Vector.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/L2NormOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LSHProjectionOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LSHProjectionType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LSTMKernelType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LSTMOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LeakyReluOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LessEqualOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LessOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LocalResponseNormalizationOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LogSoftmaxOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LogicalAndOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LogicalNotOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/LogicalOrOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MatrixDiagOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MatrixSetDiagOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MaximumMinimumOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Metadata.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MirrorPadMode.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MirrorPadOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Model.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/MulOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/NegOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/NonMaxSuppressionV4Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/NonMaxSuppressionV5Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/NotEqualOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/OneHotOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Operator.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/OperatorCode.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/PackOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/PadOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/PadV2Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Padding.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Pool2DOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/PowOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/QuantizationDetails.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/QuantizationParameters.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/QuantizeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/RNNOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/RangeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/RankOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ReducerOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ReshapeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ResizeBilinearOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ResizeNearestNeighborOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ReverseSequenceOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ReverseV2Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SVDFOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ScatterNdOptions.py create mode 100644 tools/tflitefile_tool/tflite/SegmentSumOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SelectOptions.py create mode 100644 tools/tflitefile_tool/tflite/SelectV2Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SequenceRNNOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ShapeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SkipGramOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SliceOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SoftmaxOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SpaceToBatchNDOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SpaceToDepthOptions.py create mode 100644 tools/tflitefile_tool/tflite/SparseIndexVector.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SparseToDenseOptions.py create mode 100644 tools/tflitefile_tool/tflite/SparsityParameters.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SplitOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SplitVOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SquareOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SquaredDifferenceOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SqueezeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/StridedSliceOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SubGraph.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/SubOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/Tensor.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/TensorType.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/TileOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/TopKV2Options.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/TransposeConvOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/TransposeOptions.py create mode 100644 tools/tflitefile_tool/tflite/Uint16Vector.py create mode 100644 tools/tflitefile_tool/tflite/Uint8Vector.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/UnidirectionalSequenceLSTMOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/UniqueOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/UnpackOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/WhereOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/WhileOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/ZerosLikeOptions.py mode change 100755 => 100644 tools/tflitefile_tool/tflite/__init__.py create mode 100644 tools/update_version/update-version diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..701a526 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,22 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 1.4 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + builder: html + configuration: docs/conf.py + fail_on_warning: false + +# Optionally build your docs in additional formats such as PDF +formats: + - pdf + +# Optionally set the version of Python and requirements required to build your docs +python: + version: 3.7 + install: + - requirements: docs/requirements.txt diff --git a/COPYRIGHT b/COPYRIGHT index 3c78815..17f325b 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1 +1 @@ -Copyright (c) <2019> All Rights Reserved. +Copyright (c) 2020 Samsung Electronics Co., Ltd. & Contributors All Rights Reserved. diff --git a/Makefile.template b/Makefile.template index 588a300..6c919f3 100644 --- a/Makefile.template +++ b/Makefile.template @@ -1,10 +1,9 @@ -HOST_ARCH?=$(shell uname -p) -TARGET_ARCH?=$(shell uname -p) +HOST_ARCH?=$(shell uname -m) +TARGET_ARCH?=$(shell uname -m) BUILD_TYPE?=Debug CROSS_BUILD?=0 HOST_OS?=linux TARGET_OS?=linux -PARALLEL_BUILD?=1 COVERAGE_BUILD?=0 BENCHMARK_ACL_BUILD?=0 OPTIONS?= @@ -49,9 +48,9 @@ ifeq ($(BENCHMARK_ACL_BUILD),1) OPTIONS+= -DBUILD_BENCHMARK_ACL=1 endif -ifneq ($(EXT_ACL_FOLDER),) - OPTIONS+= -DBUILD_ARMCOMPUTE=OFF - OPTIONS+= -DARMCompute_EXTDIR=$(EXT_ACL_FOLDER) +ifneq ($(EXT_HDF5_DIR),) + $(info Hello $(EXT_HDF5_DIR)) + OPTIONS+= -DEXT_HDF5_DIR=$(EXT_HDF5_DIR) endif ifneq ($(EXTERNAL_VOLUME),) @@ -78,14 +77,12 @@ ifneq ($(ANDROID_BOOST_ROOT),) OPTIONS+= -DANDROID_BOOST_ROOT=$(ANDROID_BOOST_ROOT) endif -ifeq ($(PARALLEL_BUILD),1) - # Get number of processors (linux only for now) - ifeq ($(HOST_OS),linux) - NPROCS?=$(shell grep -c ^processor /proc/cpuinfo) - endif +ifeq ($(HOST_OS),linux) + NPROCS?=$(shell grep -c ^processor /proc/cpuinfo) +else + NPROCS?=1 endif -NPROCS?=1 WORKHOME=$(CURDIR)/Product WORKFOLDER=$(TARGET_ARCH_LC)-$(TARGET_OS).$(BUILD_TYPE_LC) WORKSPACE=$(WORKHOME)/$(WORKFOLDER) @@ -125,14 +122,22 @@ distclean: ### Command (internal) ### configure_internal: +# TODO Remove setting EXT_ACL_FOLDER +# Construct overlay folder directly outside (with headers?) +ifneq ($(EXT_ACL_FOLDER),) + mkdir -p $(OVERLAY_FOLDER)/lib + cp $(EXT_ACL_FOLDER)/* $(OVERLAY_FOLDER)/lib +endif + NNFW_WORKSPACE="$(WORKSPACE)" NNFW_INSTALL_PREFIX=$(INSTALL_PATH) ./nnfw configure \ -DCMAKE_BUILD_TYPE=$(BUILD_TYPE_LC) \ -DNNFW_OVERLAY_DIR=$(OVERLAY_FOLDER) \ + -DACL_BUILD_THREADS=$(NPROCS) \ $(OPTIONS) touch $(TIMESTAMP_CONFIGURE) build_internal: $(BUILD_FOLDER) - NNFW_WORKSPACE="$(WORKSPACE)" NPROCS="$(NPROCS)" PARALLEL_BUILD="1" ./nnfw build + NNFW_WORKSPACE="$(WORKSPACE)" ./nnfw build -j $(NPROCS) rm -rf $(BUILD_ALIAS) ln -s $(BUILD_FOLDER) $(BUILD_ALIAS) touch $(TIMESTAMP_BUILD) @@ -144,8 +149,10 @@ install_internal: touch $(TIMESTAMP_INSTALL) runtime_tar_internal: $(TIMESTAMP_BUILD) install_internal - tar -zcf nnfw-package.tar.gz -C $(INSTALL_PATH) lib include - mv nnfw-package.tar.gz $(INSTALL_PATH)/. + tar -zcf nnfw-package.tar.gz -C $(INSTALL_PATH) lib + tar -zcf nnfw-dev-package.tar.gz -C $(INSTALL_PATH) include/nnfw + tar -zcf nnfw-internal-dev-package.tar.gz -C $(INSTALL_PATH) include/onert + mv nnfw-*package.tar.gz $(INSTALL_PATH)/. install_internal_acl: # Workaround to install acl for test (ignore error when there is no file to copy) diff --git a/README.md b/README.md index dfa91af..bbeb66c 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,40 @@ -# nnfw +[![GitHub release (latest +SemVer)](https://img.shields.io/github/v/release/Samsung/ONE)](https://github.com/Samsung/ONE/releases) +[![Documentation Status](https://readthedocs.org/projects/nnfw/badge/?version=latest)](https://nnfw.readthedocs.io/en/latest/?badge=latest) +![GitHub commit activity](https://img.shields.io/github/commit-activity/w/Samsung/ONE?color=light%20green) +[![Gitter](https://img.shields.io/gitter/room/Samsung/ONE?color=orange)](https://gitter.im/Samsung/ONE) -A high-performance, on-device neural network inference framework +# **ONE** (On-device Neural Engine) -## Goal +ONE Logo -This project _nnfw_ aims at providing a high-performance, on-device neural network (NN) inference -framework that performs inference of a given NN model on processors, such as CPU, GPU, or NPU, in -the target platform, such as the Linux kernel based OS including Tizen. +A high-performance, on-device neural network inference framework. -## Project Documents +## Goal -- [Roadmap](docs/nnfw/roadmap.md) -- [SW Requirement Specification](docs/nnfw/project/2019_requirement_specification.md) -- [SW High Level Design](docs/nnfw/project/2018_high_level_design.md) +This project **ONE** aims at providing a high-performance, on-device neural network (NN) inference +framework that performs inference of a given NN model on processors, such as CPU, GPU, DSP or NPU. -## Getting started +We develop a runtime that runs on a Linux kernel-based OS platform such as Ubuntu, Tizen, or +Android, and a compiler toolchain to support NN models created using various NN training frameworks such +as Tensorflow or PyTorch in a unified form at runtime. -- For the contribution, please refer to our [contribution guide](docs/HowToContribute.md). -- You can also find how-to documents [HERE](docs/nnfw/howto.md). +## Overview -## Maintainers +- [Background](docs/overview/background.md) +- [Roadmap](docs/overview/roadmap.md) +- [Overall Architecture](docs/overview/overall-architecture.md) -- Sung-Jae Lee <> -- Chunseok Lee <> - -## Committers +## Getting started -- Hyeongseok Oh <> -- Hanjoung Lee <> -- Sharan Allur <> +- For the contribution, please refer to our [contribution guide](docs/howto/how-to-contribute.md). +- You can also find various how-to documents [here](docs/howto). -## Feature Request (NEW) +## Feature Request -You can suggest development of nnfw's features that are not yet available. +You can suggest development of **ONE**'s features that are not yet available. -The functions requested so far can be checked in the [popular feature request](https://github.com/Samsung/ONE/issues?utf8=%E2%9C%93&q=is%3Aopen+is%3Aissue+label%3AFEATURE_REQUEST+sort%3Areactions-%2B1-desc) list. +The functions requested so far can be checked in the [popular feature request](https://github.com/Samsung/ONE/issues?q=label%3AFEATURE_REQUEST+) list. - If the feature you want is on the list, :+1: to the body of the issue. The feature with the most :+1: is placed at the top of the list. When adding new features, we will prioritize them with this reference. @@ -45,30 +45,17 @@ Sooner or later, the maintainer will tag the `FEATURE_REQUEST` label and appear We expect one of the most frequent feature requests would be the operator kernel implementation. It is good to make a request, but it is better if you contribute by yourself. See the following guide, -[How to Implement Operator Kernel](docs/nnfw/howto/HowToAddNewOperation.md), for help. +[How to add a new operation](docs/howto/how-to-add-a-new-operation.md), for help. We are looking forward to your participation. Thank you in advance! -# nncc -Re-targetable neural network (NN) model compilation framework - -## Goals -nncc, which stands for neural network compiler collection, aims to provide a general framework for -compiling a given NN model to an artifact that runs on various target devices such as CPU, GPU, or -NPU. - -## Maintainers - -- Sung-Jae Lee <> -- Jonghyun Park <> +## How to Contact -## Committers +- Please post questions, issues, or suggestions into [Issues](https://github.com/Samsung/ONE/issues). This is the best way to communicate with the developer. +- You can also have an open discussion with community members through [gitter.im](https://gitter.im/Samsung/ONE) channel. -- Saehie Park <> -- Hyeongseok Oh <> -- Efimov Alexander <> +## Hall of Fame -## How to Contact +[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/0)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/0)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/1)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/1)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/2)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/2)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/3)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/3)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/4)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/4)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/5)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/5)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/6)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/6)[![](https://sourcerer.io/fame/lemmaa/Samsung/ONE/images/7)](https://sourcerer.io/fame/lemmaa/Samsung/ONE/links/7) -- Please post questions, issues, or suggestions into [Issues](https://github.com/Samsung/ONE/issues). diff --git a/compiler/adtidas/README.md b/compiler/adtidas/README.md new file mode 100644 index 0000000..df427d3 --- /dev/null +++ b/compiler/adtidas/README.md @@ -0,0 +1 @@ +# adtidas diff --git a/compiler/angkor/src/ADT/feature/Buffer.test.cpp b/compiler/angkor/src/ADT/feature/Buffer.test.cpp index 1e44302..f61b724 100644 --- a/compiler/angkor/src/ADT/feature/Buffer.test.cpp +++ b/compiler/angkor/src/ADT/feature/Buffer.test.cpp @@ -30,9 +30,9 @@ TEST(ADT_FEATURE_BUFFER, ctor) const Shape shape{4, 6, 3}; auto buffer = make_buffer(shape); - ASSERT_EQ(buffer.shape().depth(), shape.depth()); - ASSERT_EQ(buffer.shape().height(), shape.height()); - ASSERT_EQ(buffer.shape().width(), shape.width()); + ASSERT_EQ(shape.depth(), buffer.shape().depth()); + ASSERT_EQ(shape.height(), buffer.shape().height()); + ASSERT_EQ(shape.width(), buffer.shape().width()); } TEST(ADT_FEATURE_BUFFER, access) @@ -40,9 +40,9 @@ TEST(ADT_FEATURE_BUFFER, access) const Shape shape{4, 6, 3}; auto buffer = make_buffer(shape); - ASSERT_EQ(buffer.at(3, 5, 2), 0); + ASSERT_EQ(0, buffer.at(3, 5, 2)); buffer.at(3, 5, 2) = 4; // Casting is introduced to use 'const T &at(...) const' method - ASSERT_EQ(static_cast &>(buffer).at(3, 5, 2), 4); + ASSERT_EQ(4, static_cast &>(buffer).at(3, 5, 2)); } diff --git a/compiler/angkor/src/ADT/feature/CHWLayout.test.cpp b/compiler/angkor/src/ADT/feature/CHWLayout.test.cpp index 5610df8..72aef22 100644 --- a/compiler/angkor/src/ADT/feature/CHWLayout.test.cpp +++ b/compiler/angkor/src/ADT/feature/CHWLayout.test.cpp @@ -25,7 +25,7 @@ TEST(ADT_FEATURE_CHW_LAYOUT, col_increase) const Shape shape{4, 3, 6}; const CHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 2, 1) + 1, l.offset(shape, 1, 2, 2)); + ASSERT_EQ(l.offset(shape, 1, 2, 2), l.offset(shape, 1, 2, 1) + 1); } TEST(ADT_FEATURE_CHW_LAYOUT, row_increase) @@ -33,7 +33,7 @@ TEST(ADT_FEATURE_CHW_LAYOUT, row_increase) const Shape shape{4, 3, 6}; const CHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1) + 6, l.offset(shape, 1, 2, 1)); + ASSERT_EQ(l.offset(shape, 1, 2, 1), l.offset(shape, 1, 1, 1) + 6); } TEST(ADT_FEATURE_CHW_LAYOUT, ch_increase) @@ -41,5 +41,5 @@ TEST(ADT_FEATURE_CHW_LAYOUT, ch_increase) const Shape shape{4, 3, 6}; const CHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1) + 6 * 3, l.offset(shape, 2, 1, 1)); + ASSERT_EQ(l.offset(shape, 2, 1, 1), l.offset(shape, 1, 1, 1) + 6 * 3); } diff --git a/compiler/angkor/src/ADT/feature/HWCLayout.test.cpp b/compiler/angkor/src/ADT/feature/HWCLayout.test.cpp index d1f3597..1cfb29c 100644 --- a/compiler/angkor/src/ADT/feature/HWCLayout.test.cpp +++ b/compiler/angkor/src/ADT/feature/HWCLayout.test.cpp @@ -29,7 +29,7 @@ TEST(ADT_FEATURE_HWC_LAYOUT, C_increase) const Shape shape{C, H, W}; const HWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1) + 1, l.offset(shape, 2, 1, 1)); + ASSERT_EQ(l.offset(shape, 2, 1, 1), l.offset(shape, 1, 1, 1) + 1); } TEST(ADT_FEATURE_HWC_LAYOUT, W_increase) @@ -41,7 +41,7 @@ TEST(ADT_FEATURE_HWC_LAYOUT, W_increase) const Shape shape{C, H, W}; const HWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 2, 1) + C, l.offset(shape, 1, 2, 2)); + ASSERT_EQ(l.offset(shape, 1, 2, 2), l.offset(shape, 1, 2, 1) + C); } TEST(ADT_FEATURE_HWC_LAYOUT, H_increase) @@ -53,5 +53,5 @@ TEST(ADT_FEATURE_HWC_LAYOUT, H_increase) const Shape shape{C, H, W}; const HWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1) + W * C, l.offset(shape, 1, 2, 1)); + ASSERT_EQ(l.offset(shape, 1, 2, 1), l.offset(shape, 1, 1, 1) + W * C); } diff --git a/compiler/angkor/src/ADT/feature/Layout.test.cpp b/compiler/angkor/src/ADT/feature/Layout.test.cpp index 023594e..de91cb3 100644 --- a/compiler/angkor/src/ADT/feature/Layout.test.cpp +++ b/compiler/angkor/src/ADT/feature/Layout.test.cpp @@ -28,7 +28,7 @@ TEST(ADT_FEATURE_LAYOUT, ctor) { Layout l{offset_0}; - ASSERT_EQ(l.offset(Shape{4, 3, 6}, 1, 1, 1), 0); + ASSERT_EQ(0, l.offset(Shape{4, 3, 6}, 1, 1, 1)); } TEST(ADT_FEATURE_LAYOUT, copy) @@ -36,11 +36,11 @@ TEST(ADT_FEATURE_LAYOUT, copy) Layout orig{offset_0}; Layout copy{offset_1}; - ASSERT_EQ(copy.offset(Shape{4, 3, 6}, 1, 1, 1), 1); + ASSERT_EQ(1, copy.offset(Shape{4, 3, 6}, 1, 1, 1)); copy = orig; - ASSERT_EQ(copy.offset(Shape{4, 3, 6}, 1, 1, 1), 0); + ASSERT_EQ(0, copy.offset(Shape{4, 3, 6}, 1, 1, 1)); } TEST(ADT_FEATURE_LAYOUT, move) @@ -48,9 +48,9 @@ TEST(ADT_FEATURE_LAYOUT, move) Layout orig{offset_0}; Layout move{offset_1}; - ASSERT_EQ(move.offset(Shape{4, 3, 6}, 1, 1, 1), 1); + ASSERT_EQ(1, move.offset(Shape{4, 3, 6}, 1, 1, 1)); move = std::move(orig); - ASSERT_EQ(move.offset(Shape{4, 3, 6}, 1, 1, 1), 0); + ASSERT_EQ(0, move.offset(Shape{4, 3, 6}, 1, 1, 1)); } diff --git a/compiler/angkor/src/ADT/feature/Overlay.test.cpp b/compiler/angkor/src/ADT/feature/Overlay.test.cpp index c8e2943..8ba28bf 100644 --- a/compiler/angkor/src/ADT/feature/Overlay.test.cpp +++ b/compiler/angkor/src/ADT/feature/Overlay.test.cpp @@ -34,9 +34,9 @@ TEST(ADT_FEATURE_OVERLAY, ctor) }; auto overlay = make_overlay(shape, data); - ASSERT_EQ(overlay.shape().depth(), shape.depth()); - ASSERT_EQ(overlay.shape().height(), shape.height()); - ASSERT_EQ(overlay.shape().width(), shape.width()); + ASSERT_EQ(shape.depth(), overlay.shape().depth()); + ASSERT_EQ(shape.height(), overlay.shape().height()); + ASSERT_EQ(shape.width(), overlay.shape().width()); } TEST(ADT_FEATURE_OVERLAY, read) @@ -50,9 +50,9 @@ TEST(ADT_FEATURE_OVERLAY, read) CHWLayout layout{}; - ASSERT_EQ(data[layout.offset(shape, 3, 5, 2)], 0); + ASSERT_EQ(0, data[layout.offset(shape, 3, 5, 2)]); data[layout.offset(shape, 3, 5, 2)] = 2; - ASSERT_EQ(overlay.at(3, 5, 2), 2); + ASSERT_EQ(2, overlay.at(3, 5, 2)); } TEST(ADT_FEATURE_OVERLAY, access) @@ -66,7 +66,7 @@ TEST(ADT_FEATURE_OVERLAY, access) CHWLayout layout{}; - ASSERT_EQ(data[layout.offset(shape, 3, 5, 2)], 0); + ASSERT_EQ(0, data[layout.offset(shape, 3, 5, 2)]); overlay.at(3, 5, 2) = 4; - ASSERT_EQ(data[layout.offset(shape, 3, 5, 2)], 4); + ASSERT_EQ(4, data[layout.offset(shape, 3, 5, 2)]); } diff --git a/compiler/angkor/src/ADT/feature/Shape.test.cpp b/compiler/angkor/src/ADT/feature/Shape.test.cpp index 9216182..460561b 100644 --- a/compiler/angkor/src/ADT/feature/Shape.test.cpp +++ b/compiler/angkor/src/ADT/feature/Shape.test.cpp @@ -26,9 +26,9 @@ TEST(ADT_FEATURE_SHAPE, ctor) nncc::core::ADT::feature::Shape shape{C, H, W}; - ASSERT_EQ(shape.depth(), C); - ASSERT_EQ(shape.height(), H); - ASSERT_EQ(shape.width(), W); + ASSERT_EQ(C, shape.depth()); + ASSERT_EQ(H, shape.height()); + ASSERT_EQ(W, shape.width()); } TEST(ADT_FEATURE_SHAPE, num_elements) @@ -40,7 +40,7 @@ TEST(ADT_FEATURE_SHAPE, num_elements) using nncc::core::ADT::feature::Shape; using nncc::core::ADT::feature::num_elements; - ASSERT_EQ(num_elements(Shape{C, H, W}), C * H * W); + ASSERT_EQ(C * H * W, num_elements(Shape{C, H, W})); } TEST(ADT_FEATURE_SHAPE, operator_eq) diff --git a/compiler/angkor/src/ADT/kernel/Buffer.test.cpp b/compiler/angkor/src/ADT/kernel/Buffer.test.cpp index da34459..a3d92a6 100644 --- a/compiler/angkor/src/ADT/kernel/Buffer.test.cpp +++ b/compiler/angkor/src/ADT/kernel/Buffer.test.cpp @@ -30,10 +30,10 @@ TEST(ADT_KERNEL_BUFFER, ctor) const Shape shape{2, 4, 6, 3}; auto buffer = make_buffer(shape); - ASSERT_EQ(buffer.shape().count(), shape.count()); - ASSERT_EQ(buffer.shape().depth(), shape.depth()); - ASSERT_EQ(buffer.shape().height(), shape.height()); - ASSERT_EQ(buffer.shape().width(), shape.width()); + ASSERT_EQ(shape.count(), buffer.shape().count()); + ASSERT_EQ(shape.depth(), buffer.shape().depth()); + ASSERT_EQ(shape.height(), buffer.shape().height()); + ASSERT_EQ(shape.width(), buffer.shape().width()); } TEST(ADT_KERNEL_BUFFER, access) @@ -41,9 +41,9 @@ TEST(ADT_KERNEL_BUFFER, access) const Shape shape{2, 4, 6, 3}; auto buffer = make_buffer(shape); - ASSERT_EQ(buffer.at(1, 3, 5, 2), 0); + ASSERT_EQ(0, buffer.at(1, 3, 5, 2)); buffer.at(1, 3, 5, 2) = 4; // Casting is introduced to use 'const T &at(...) const' method - ASSERT_EQ(static_cast &>(buffer).at(1, 3, 5, 2), 4); + ASSERT_EQ(4, static_cast &>(buffer).at(1, 3, 5, 2)); } diff --git a/compiler/angkor/src/ADT/kernel/Layout.test.cpp b/compiler/angkor/src/ADT/kernel/Layout.test.cpp index 94885cd..36234d2 100644 --- a/compiler/angkor/src/ADT/kernel/Layout.test.cpp +++ b/compiler/angkor/src/ADT/kernel/Layout.test.cpp @@ -28,7 +28,7 @@ TEST(ADT_KERNEL_LAYOUT, ctor) { Layout l{offset_0}; - ASSERT_EQ(l.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1), 0); + ASSERT_EQ(0, l.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1)); } TEST(ADT_KERNEL_LAYOUT, copy) @@ -36,11 +36,11 @@ TEST(ADT_KERNEL_LAYOUT, copy) Layout orig{offset_0}; Layout copy{offset_1}; - ASSERT_EQ(copy.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1), 1); + ASSERT_EQ(1, copy.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1)); copy = orig; - ASSERT_EQ(copy.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1), 0); + ASSERT_EQ(0, copy.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1)); } TEST(ADT_KERNEL_LAYOUT, move) @@ -48,9 +48,9 @@ TEST(ADT_KERNEL_LAYOUT, move) Layout orig{offset_0}; Layout move{offset_1}; - ASSERT_EQ(move.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1), 1); + ASSERT_EQ(1, move.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1)); move = std::move(orig); - ASSERT_EQ(move.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1), 0); + ASSERT_EQ(0, move.offset(Shape{4, 3, 6, 5}, 1, 1, 1, 1)); } diff --git a/compiler/angkor/src/ADT/kernel/NCHWLayout.test.cpp b/compiler/angkor/src/ADT/kernel/NCHWLayout.test.cpp index ba03b7b..578bc58 100644 --- a/compiler/angkor/src/ADT/kernel/NCHWLayout.test.cpp +++ b/compiler/angkor/src/ADT/kernel/NCHWLayout.test.cpp @@ -25,7 +25,7 @@ TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, col_increment) const Shape shape{4, 3, 6, 5}; const NCHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + 1, l.offset(shape, 1, 1, 1, 2)); + ASSERT_EQ(l.offset(shape, 1, 1, 1, 2), l.offset(shape, 1, 1, 1, 1) + 1); } TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, row_increment) @@ -33,7 +33,7 @@ TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, row_increment) const Shape shape{4, 3, 6, 5}; const NCHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + 5, l.offset(shape, 1, 1, 2, 1)); + ASSERT_EQ(l.offset(shape, 1, 1, 2, 1), l.offset(shape, 1, 1, 1, 1) + 5); } TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, ch_increment) @@ -41,7 +41,7 @@ TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, ch_increment) const Shape shape{4, 3, 6, 5}; const NCHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + 6 * 5, l.offset(shape, 1, 2, 1, 1)); + ASSERT_EQ(l.offset(shape, 1, 2, 1, 1), l.offset(shape, 1, 1, 1, 1) + 6 * 5); } TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, n_increment) @@ -49,5 +49,5 @@ TEST(ADT_KERNEL_KERNEL_NCHW_LAYOUT, n_increment) const Shape shape{4, 3, 6, 5}; const NCHWLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + 3 * 6 * 5, l.offset(shape, 2, 1, 1, 1)); + ASSERT_EQ(l.offset(shape, 2, 1, 1, 1), l.offset(shape, 1, 1, 1, 1) + 3 * 6 * 5); } diff --git a/compiler/angkor/src/ADT/kernel/NHWCLayout.test.cpp b/compiler/angkor/src/ADT/kernel/NHWCLayout.test.cpp index 2c5df7d..184e107 100644 --- a/compiler/angkor/src/ADT/kernel/NHWCLayout.test.cpp +++ b/compiler/angkor/src/ADT/kernel/NHWCLayout.test.cpp @@ -31,7 +31,7 @@ TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, ch_increment) const Shape shape{N, C, H, W}; const NHWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + 1, l.offset(shape, 1, 2, 1, 1)); + ASSERT_EQ(l.offset(shape, 1, 2, 1, 1), l.offset(shape, 1, 1, 1, 1) + 1); } TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, col_increment) @@ -44,7 +44,7 @@ TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, col_increment) const Shape shape{N, C, H, W}; const NHWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + C, l.offset(shape, 1, 1, 1, 2)); + ASSERT_EQ(l.offset(shape, 1, 1, 1, 2), l.offset(shape, 1, 1, 1, 1) + C); } TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, row_increment) @@ -57,7 +57,7 @@ TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, row_increment) const Shape shape{N, C, H, W}; const NHWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + C * W, l.offset(shape, 1, 1, 2, 1)); + ASSERT_EQ(l.offset(shape, 1, 1, 2, 1), l.offset(shape, 1, 1, 1, 1) + C * W); } TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, n_increment) @@ -70,5 +70,5 @@ TEST(ADT_KERNEL_KERNEL_NHWC_LAYOUT, n_increment) const Shape shape{N, C, H, W}; const NHWCLayout l; - ASSERT_EQ(l.offset(shape, 1, 1, 1, 1) + H * W * C, l.offset(shape, 2, 1, 1, 1)); + ASSERT_EQ(l.offset(shape, 2, 1, 1, 1), l.offset(shape, 1, 1, 1, 1) + H * W * C); } diff --git a/compiler/angkor/src/ADT/kernel/Overlay.test.cpp b/compiler/angkor/src/ADT/kernel/Overlay.test.cpp index e80ebbc..4e9bd8d 100644 --- a/compiler/angkor/src/ADT/kernel/Overlay.test.cpp +++ b/compiler/angkor/src/ADT/kernel/Overlay.test.cpp @@ -34,10 +34,10 @@ TEST(ADT_KERNEL_OVERLAY, ctor) }; auto overlay = make_overlay(shape, data); - ASSERT_EQ(overlay.shape().count(), shape.count()); - ASSERT_EQ(overlay.shape().depth(), shape.depth()); - ASSERT_EQ(overlay.shape().height(), shape.height()); - ASSERT_EQ(overlay.shape().width(), shape.width()); + ASSERT_EQ(shape.count(), overlay.shape().count()); + ASSERT_EQ(shape.depth(), overlay.shape().depth()); + ASSERT_EQ(shape.height(), overlay.shape().height()); + ASSERT_EQ(shape.width(), overlay.shape().width()); } TEST(ADT_KERNEL_OVERLAY, read) @@ -51,9 +51,9 @@ TEST(ADT_KERNEL_OVERLAY, read) NCHWLayout layout{}; - ASSERT_EQ(data[layout.offset(shape, 1, 3, 5, 2)], 0); + ASSERT_EQ(0, data[layout.offset(shape, 1, 3, 5, 2)]); data[layout.offset(shape, 1, 3, 5, 2)] = 2; - ASSERT_EQ(overlay.at(1, 3, 5, 2), 2); + ASSERT_EQ(2, overlay.at(1, 3, 5, 2)); } TEST(ADT_KERNEL_OVERLAY, access) @@ -67,7 +67,7 @@ TEST(ADT_KERNEL_OVERLAY, access) NCHWLayout layout{}; - ASSERT_EQ(data[layout.offset(shape, 1, 3, 5, 2)], 0); + ASSERT_EQ(0, data[layout.offset(shape, 1, 3, 5, 2)]); overlay.at(1, 3, 5, 2) = 4; - ASSERT_EQ(data[layout.offset(shape, 1, 3, 5, 2)], 4); + ASSERT_EQ(4, data[layout.offset(shape, 1, 3, 5, 2)]); } diff --git a/compiler/angkor/src/ADT/kernel/Shape.test.cpp b/compiler/angkor/src/ADT/kernel/Shape.test.cpp index da608fb..b2bd13c 100644 --- a/compiler/angkor/src/ADT/kernel/Shape.test.cpp +++ b/compiler/angkor/src/ADT/kernel/Shape.test.cpp @@ -27,10 +27,10 @@ TEST(ADT_KERNEL_SHAPE, ctor) nncc::core::ADT::kernel::Shape shape{N, C, H, W}; - ASSERT_EQ(shape.count(), N); - ASSERT_EQ(shape.depth(), C); - ASSERT_EQ(shape.height(), H); - ASSERT_EQ(shape.width(), W); + ASSERT_EQ(N, shape.count()); + ASSERT_EQ(C, shape.depth()); + ASSERT_EQ(H, shape.height()); + ASSERT_EQ(W, shape.width()); } TEST(ADT_KERNEL_SHAPE, num_elements) @@ -43,7 +43,7 @@ TEST(ADT_KERNEL_SHAPE, num_elements) using nncc::core::ADT::kernel::Shape; using nncc::core::ADT::kernel::num_elements; - ASSERT_EQ(num_elements(Shape{N, C, H, W}), N * C * H * W); + ASSERT_EQ(N * C * H * W, num_elements(Shape{N, C, H, W})); } TEST(ADT_KERNEL_SHAPE, operator_eq) diff --git a/compiler/angkor/src/ADT/tensor/Buffer.test.cpp b/compiler/angkor/src/ADT/tensor/Buffer.test.cpp index c2b6a99..39d0a80 100644 --- a/compiler/angkor/src/ADT/tensor/Buffer.test.cpp +++ b/compiler/angkor/src/ADT/tensor/Buffer.test.cpp @@ -31,7 +31,7 @@ TEST(ADT_TENSOR_BUFFER, ctor) const Shape shape{2, 3}; auto buffer = make_buffer(shape); - ASSERT_EQ(buffer.shape(), shape); + ASSERT_EQ(shape, buffer.shape()); } TEST(ADT_TENSOR_BUFFER, access) @@ -41,9 +41,9 @@ TEST(ADT_TENSOR_BUFFER, access) const Index index{1, 2}; - ASSERT_EQ(buffer.at(index), 0); + ASSERT_EQ(0, buffer.at(index)); buffer.at(index) = 4; // Casting is introduced to use 'const T &at(...) const' method - ASSERT_EQ(static_cast &>(buffer).at(index), 4); + ASSERT_EQ(4, static_cast &>(buffer).at(index)); } diff --git a/compiler/angkor/src/ADT/tensor/Index.test.cpp b/compiler/angkor/src/ADT/tensor/Index.test.cpp index 2306028..53dbd41 100644 --- a/compiler/angkor/src/ADT/tensor/Index.test.cpp +++ b/compiler/angkor/src/ADT/tensor/Index.test.cpp @@ -22,19 +22,19 @@ TEST(ADT_TENSOR_INDEX, ctor) { nncc::core::ADT::tensor::Index index; - ASSERT_EQ(index.rank(), 0); + ASSERT_EQ(0, index.rank()); } TEST(ADT_TENSOR_INDEX, ctor_initializer_list) { const nncc::core::ADT::tensor::Index index{1, 3, 5, 7}; - ASSERT_EQ(index.rank(), 4); + ASSERT_EQ(4, index.rank()); - ASSERT_EQ(index.at(0), 1); - ASSERT_EQ(index.at(1), 3); - ASSERT_EQ(index.at(2), 5); - ASSERT_EQ(index.at(3), 7); + ASSERT_EQ(1, index.at(0)); + ASSERT_EQ(3, index.at(1)); + ASSERT_EQ(5, index.at(2)); + ASSERT_EQ(7, index.at(3)); } TEST(ADT_TENSOR_INDEX, operator_add) @@ -43,10 +43,10 @@ TEST(ADT_TENSOR_INDEX, operator_add) nncc::core::ADT::tensor::Index index2{5, 6, 7, 8}; nncc::core::ADT::tensor::Index result{index1 + index2}; - ASSERT_EQ(result.at(0), 6); - ASSERT_EQ(result.at(1), 8); - ASSERT_EQ(result.at(2), 10); - ASSERT_EQ(result.at(3), 12); + ASSERT_EQ(6, result.at(0)); + ASSERT_EQ(8, result.at(1)); + ASSERT_EQ(10, result.at(2)); + ASSERT_EQ(12, result.at(3)); } TEST(ADT_TENSOR_INDEX, operator_eqaul) @@ -75,7 +75,7 @@ TEST(ADT_TENSOR_INDEX, resize) index.resize(4); - ASSERT_EQ(index.rank(), 4); + ASSERT_EQ(4, index.rank()); } TEST(ADT_TENSOR_INDEX, at) @@ -89,7 +89,7 @@ TEST(ADT_TENSOR_INDEX, at) for (uint32_t axis = 0; axis < 4; ++axis) { index.at(axis) = indices[axis]; - ASSERT_EQ(index.at(axis), indices[axis]); + ASSERT_EQ(indices[axis], index.at(axis)); } } @@ -98,11 +98,11 @@ TEST(ADT_TENSOR_INDEX, copy) const nncc::core::ADT::tensor::Index original{3, 5, 2, 7}; const nncc::core::ADT::tensor::Index copied{original}; - ASSERT_EQ(original.rank(), copied.rank()); + ASSERT_EQ(copied.rank(), original.rank()); for (uint32_t axis = 0; axis < 4; ++axis) { - ASSERT_EQ(original.at(axis), copied.at(axis)); + ASSERT_EQ(copied.at(axis), original.at(axis)); } } @@ -112,8 +112,8 @@ TEST(ADT_TENSOR_INDEX, fill) index.fill(3); - ASSERT_EQ(index.rank(), 2); + ASSERT_EQ(2, index.rank()); - ASSERT_EQ(index.at(0), 3); - ASSERT_EQ(index.at(1), 3); + ASSERT_EQ(3, index.at(0)); + ASSERT_EQ(3, index.at(1)); } diff --git a/compiler/angkor/src/ADT/tensor/IndexEnumerator.test.cpp b/compiler/angkor/src/ADT/tensor/IndexEnumerator.test.cpp index 204a8aa..54cc2e9 100644 --- a/compiler/angkor/src/ADT/tensor/IndexEnumerator.test.cpp +++ b/compiler/angkor/src/ADT/tensor/IndexEnumerator.test.cpp @@ -40,7 +40,7 @@ TEST(ADT_TENSOR_INDEX_ENUMERATOR, iterate_full_range) { const auto &ind = e.current(); - ASSERT_EQ(ind.rank(), 2); + ASSERT_EQ(2, ind.rank()); count.at(ind.at(0) * W + ind.at(1)) += 1; } diff --git a/compiler/angkor/src/ADT/tensor/Layout.test.cpp b/compiler/angkor/src/ADT/tensor/Layout.test.cpp index 145adfe..6d5b3fe 100644 --- a/compiler/angkor/src/ADT/tensor/Layout.test.cpp +++ b/compiler/angkor/src/ADT/tensor/Layout.test.cpp @@ -28,7 +28,7 @@ TEST(ADT_TENSOR_LAYOUT, ctor) { nncc::core::ADT::tensor::Layout l{offset_0}; - ASSERT_EQ(l.offset(Shape{4, 3, 6}, Index{1, 1, 1}), 0); + ASSERT_EQ(0, l.offset(Shape{4, 3, 6}, Index{1, 1, 1})); } TEST(ADT_TENSOR_LAYOUT, copy) @@ -36,11 +36,11 @@ TEST(ADT_TENSOR_LAYOUT, copy) nncc::core::ADT::tensor::Layout orig{offset_0}; nncc::core::ADT::tensor::Layout copy{offset_1}; - ASSERT_EQ(copy.offset(Shape{4, 3, 6}, Index{1, 1, 1}), 1); + ASSERT_EQ(1, copy.offset(Shape{4, 3, 6}, Index{1, 1, 1})); copy = orig; - ASSERT_EQ(copy.offset(Shape{4, 3, 6}, Index{1, 1, 1}), 0); + ASSERT_EQ(0, copy.offset(Shape{4, 3, 6}, Index{1, 1, 1})); } TEST(ADT_TENSOR_LAYOUT, move) @@ -48,9 +48,9 @@ TEST(ADT_TENSOR_LAYOUT, move) nncc::core::ADT::tensor::Layout orig{offset_0}; nncc::core::ADT::tensor::Layout move{offset_1}; - ASSERT_EQ(move.offset(Shape{4, 3, 6}, Index{1, 1, 1}), 1); + ASSERT_EQ(1, move.offset(Shape{4, 3, 6}, Index{1, 1, 1})); move = std::move(orig); - ASSERT_EQ(move.offset(Shape{4, 3, 6}, Index{1, 1, 1}), 0); + ASSERT_EQ(0, move.offset(Shape{4, 3, 6}, Index{1, 1, 1})); } diff --git a/compiler/angkor/src/ADT/tensor/LexicalLayout.test.cpp b/compiler/angkor/src/ADT/tensor/LexicalLayout.test.cpp index 8f9b729..0acaa3a 100644 --- a/compiler/angkor/src/ADT/tensor/LexicalLayout.test.cpp +++ b/compiler/angkor/src/ADT/tensor/LexicalLayout.test.cpp @@ -28,7 +28,7 @@ TEST(ADT_TENSOR_LEXICAL_LAYOUT, last) const nncc::core::ADT::tensor::LexicalLayout l; - ASSERT_EQ(l.offset(shape, curr) + 1, l.offset(shape, next)); + ASSERT_EQ(l.offset(shape, next), l.offset(shape, curr) + 1); } TEST(ADT_TENSOR_LEXICAL_LAYOUT, lexical_middle) @@ -39,7 +39,7 @@ TEST(ADT_TENSOR_LEXICAL_LAYOUT, lexical_middle) const nncc::core::ADT::tensor::LexicalLayout l; - ASSERT_EQ(l.offset(shape, curr) + 6, l.offset(shape, next)); + ASSERT_EQ(l.offset(shape, next), l.offset(shape, curr) + 6); } TEST(ADT_TENSOR_LEXICAL_LAYOUT, lexical_first) @@ -50,5 +50,5 @@ TEST(ADT_TENSOR_LEXICAL_LAYOUT, lexical_first) const nncc::core::ADT::tensor::LexicalLayout l; - ASSERT_EQ(l.offset(shape, curr) + 6 * 3, l.offset(shape, next)); + ASSERT_EQ(l.offset(shape, next), l.offset(shape, curr) + 6 * 3); } diff --git a/compiler/angkor/src/ADT/tensor/Overlay.test.cpp b/compiler/angkor/src/ADT/tensor/Overlay.test.cpp index aacb5a9..57cd1e6 100644 --- a/compiler/angkor/src/ADT/tensor/Overlay.test.cpp +++ b/compiler/angkor/src/ADT/tensor/Overlay.test.cpp @@ -35,7 +35,7 @@ TEST(ADT_TENSOR_OVERLAY, ctor) }; auto view = make_overlay(shape, data); - ASSERT_EQ(view.shape(), shape); + ASSERT_EQ(shape, view.shape()); } TEST(ADT_TENSOR_OVERLAY, read) @@ -51,9 +51,9 @@ TEST(ADT_TENSOR_OVERLAY, read) const Index index{1, 2}; - ASSERT_EQ(data[layout.offset(shape, index)], 0); + ASSERT_EQ(0, data[layout.offset(shape, index)]); data[layout.offset(shape, index)] = 2; - ASSERT_EQ(view.at(index), 2); + ASSERT_EQ(2, view.at(index)); } TEST(ADT_TENSOR_OVERLAY, access) @@ -69,7 +69,7 @@ TEST(ADT_TENSOR_OVERLAY, access) const Index index{1, 2}; - ASSERT_EQ(data[layout.offset(shape, index)], 0); + ASSERT_EQ(0, data[layout.offset(shape, index)]); view.at(index) = 4; - ASSERT_EQ(data[layout.offset(shape, index)], 4); + ASSERT_EQ(4, data[layout.offset(shape, index)]); } diff --git a/compiler/angkor/src/ADT/tensor/Shape.test.cpp b/compiler/angkor/src/ADT/tensor/Shape.test.cpp index 711ae3d..9915e78 100644 --- a/compiler/angkor/src/ADT/tensor/Shape.test.cpp +++ b/compiler/angkor/src/ADT/tensor/Shape.test.cpp @@ -22,19 +22,19 @@ TEST(ADT_TENSOR_SHAPE, ctor) { nncc::core::ADT::tensor::Shape shape; - ASSERT_EQ(shape.rank(), 0); + ASSERT_EQ(0, shape.rank()); } TEST(ADT_TENSOR_SHAPE, ctor_initializer_list) { nncc::core::ADT::tensor::Shape shape{1, 3, 5, 7}; - ASSERT_EQ(shape.rank(), 4); + ASSERT_EQ(4, shape.rank()); - ASSERT_EQ(shape.dim(0), 1); - ASSERT_EQ(shape.dim(1), 3); - ASSERT_EQ(shape.dim(2), 5); - ASSERT_EQ(shape.dim(3), 7); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + ASSERT_EQ(5, shape.dim(2)); + ASSERT_EQ(7, shape.dim(3)); } TEST(ADT_TENSOR_SHAPE, resize) @@ -43,7 +43,7 @@ TEST(ADT_TENSOR_SHAPE, resize) shape.resize(4); - ASSERT_EQ(shape.rank(), 4); + ASSERT_EQ(4, shape.rank()); } TEST(ADT_TENSOR_SHAPE, dim) @@ -57,7 +57,7 @@ TEST(ADT_TENSOR_SHAPE, dim) for (uint32_t axis = 0; axis < 4; ++axis) { shape.dim(axis) = dims[axis]; - ASSERT_EQ(shape.dim(axis), dims[axis]); + ASSERT_EQ(dims[axis], shape.dim(axis)); } } @@ -66,11 +66,11 @@ TEST(ADT_TENSOR_SHAPE, copy) const nncc::core::ADT::tensor::Shape original{3, 5, 2, 7}; const nncc::core::ADT::tensor::Shape copied{original}; - ASSERT_EQ(original.rank(), copied.rank()); + ASSERT_EQ(copied.rank(), original.rank()); for (uint32_t axis = 0; axis < 4; ++axis) { - ASSERT_EQ(original.dim(axis), copied.dim(axis)); + ASSERT_EQ(copied.dim(axis), original.dim(axis)); } } @@ -81,7 +81,7 @@ TEST(ADT_TENSOR_SHAPE, num_elements_rank_0) Shape rank_0_shape; - ASSERT_EQ(num_elements(rank_0_shape), 1); + ASSERT_EQ(1, num_elements(rank_0_shape)); } TEST(ADT_TENSOR_SHAPE, num_elements_zero) @@ -89,7 +89,7 @@ TEST(ADT_TENSOR_SHAPE, num_elements_zero) using nncc::core::ADT::tensor::Shape; using nncc::core::ADT::tensor::num_elements; - ASSERT_EQ(num_elements(Shape{0, 0, 0, 0}), 0); + ASSERT_EQ(0, num_elements(Shape{0, 0, 0, 0})); } TEST(ADT_TENSOR_SHAPE, num_elements_nonzero) @@ -97,7 +97,7 @@ TEST(ADT_TENSOR_SHAPE, num_elements_nonzero) using nncc::core::ADT::tensor::Shape; using nncc::core::ADT::tensor::num_elements; - ASSERT_EQ(num_elements(Shape{2, 3}), 6); + ASSERT_EQ(6, num_elements(Shape{2, 3})); } TEST(ADT_TENSOR_SHAPE, num_elements_nulldim) @@ -105,7 +105,7 @@ TEST(ADT_TENSOR_SHAPE, num_elements_nulldim) using nncc::core::ADT::tensor::Shape; using nncc::core::ADT::tensor::num_elements; - ASSERT_EQ(num_elements(Shape{2, 0, 3}), 0); + ASSERT_EQ(0, num_elements(Shape{2, 0, 3})); } TEST(ADT_TENSOR_SHAPE, squeeze_neg) @@ -115,10 +115,10 @@ TEST(ADT_TENSOR_SHAPE, squeeze_neg) auto squeezed = squeeze(Shape{3, 5, 2}); - ASSERT_EQ(squeezed.rank(), 3); - ASSERT_EQ(squeezed.dim(0), 3); - ASSERT_EQ(squeezed.dim(1), 5); - ASSERT_EQ(squeezed.dim(2), 2); + ASSERT_EQ(3, squeezed.rank()); + ASSERT_EQ(3, squeezed.dim(0)); + ASSERT_EQ(5, squeezed.dim(1)); + ASSERT_EQ(2, squeezed.dim(2)); } TEST(ADT_TENSOR_SHAPE, squeeze_neg_0) @@ -128,10 +128,10 @@ TEST(ADT_TENSOR_SHAPE, squeeze_neg_0) auto squeezed = squeeze(Shape{3, 0, 2}); - ASSERT_EQ(squeezed.rank(), 3); - ASSERT_EQ(squeezed.dim(0), 3); - ASSERT_EQ(squeezed.dim(1), 0); - ASSERT_EQ(squeezed.dim(2), 2); + ASSERT_EQ(3, squeezed.rank()); + ASSERT_EQ(3, squeezed.dim(0)); + ASSERT_EQ(0, squeezed.dim(1)); + ASSERT_EQ(2, squeezed.dim(2)); } TEST(ADT_TENSOR_SHAPE, squeeze_pos) @@ -141,9 +141,9 @@ TEST(ADT_TENSOR_SHAPE, squeeze_pos) auto squeezed = squeeze(Shape{3, 1, 2}); - ASSERT_EQ(squeezed.rank(), 2); - ASSERT_EQ(squeezed.dim(0), 3); - ASSERT_EQ(squeezed.dim(1), 2); + ASSERT_EQ(2, squeezed.rank()); + ASSERT_EQ(3, squeezed.dim(0)); + ASSERT_EQ(2, squeezed.dim(1)); } TEST(ADT_TENSOR_SHAPE, squeeze_nested) @@ -155,9 +155,9 @@ TEST(ADT_TENSOR_SHAPE, squeeze_nested) shape.squeeze().squeeze(); - ASSERT_EQ(shape.rank(), 2); - ASSERT_EQ(shape.dim(0), 3); - ASSERT_EQ(shape.dim(1), 2); + ASSERT_EQ(2, shape.rank()); + ASSERT_EQ(3, shape.dim(0)); + ASSERT_EQ(2, shape.dim(1)); } TEST(ADT_TENSOR_SHAPE, eq_negative_on_unmatched_rank) diff --git a/compiler/angkor/src/TensorIndex.test.cpp b/compiler/angkor/src/TensorIndex.test.cpp index 68cf391..dcfc4d3 100644 --- a/compiler/angkor/src/TensorIndex.test.cpp +++ b/compiler/angkor/src/TensorIndex.test.cpp @@ -22,19 +22,19 @@ TEST(TensorIndexTest, ctor) { angkor::TensorIndex index; - ASSERT_EQ(index.rank(), 0); + ASSERT_EQ(0, index.rank()); } TEST(TensorIndexTest, ctor_initializer_list) { const angkor::TensorIndex index{1, 3, 5, 7}; - ASSERT_EQ(index.rank(), 4); + ASSERT_EQ(4, index.rank()); - ASSERT_EQ(index.at(0), 1); - ASSERT_EQ(index.at(1), 3); - ASSERT_EQ(index.at(2), 5); - ASSERT_EQ(index.at(3), 7); + ASSERT_EQ(1, index.at(0)); + ASSERT_EQ(3, index.at(1)); + ASSERT_EQ(5, index.at(2)); + ASSERT_EQ(7, index.at(3)); } TEST(TensorIndexTest, resize) @@ -43,7 +43,7 @@ TEST(TensorIndexTest, resize) index.resize(4); - ASSERT_EQ(index.rank(), 4); + ASSERT_EQ(4, index.rank()); } TEST(TensorIndexTest, at) @@ -57,7 +57,7 @@ TEST(TensorIndexTest, at) for (uint32_t axis = 0; axis < 4; ++axis) { index.at(axis) = indices[axis]; - ASSERT_EQ(index.at(axis), indices[axis]); + ASSERT_EQ(indices[axis], index.at(axis)); } } @@ -66,11 +66,11 @@ TEST(TensorIndexTest, copy) const angkor::TensorIndex original{3, 5, 2, 7}; const angkor::TensorIndex copied{original}; - ASSERT_EQ(original.rank(), copied.rank()); + ASSERT_EQ(copied.rank(), original.rank()); for (uint32_t axis = 0; axis < 4; ++axis) { - ASSERT_EQ(original.at(axis), copied.at(axis)); + ASSERT_EQ(copied.at(axis), original.at(axis)); } } @@ -80,8 +80,8 @@ TEST(TensorIndexTest, fill) index.fill(3); - ASSERT_EQ(index.rank(), 2); + ASSERT_EQ(2, index.rank()); - ASSERT_EQ(index.at(0), 3); - ASSERT_EQ(index.at(1), 3); + ASSERT_EQ(3, index.at(0)); + ASSERT_EQ(3, index.at(1)); } diff --git a/compiler/angkor/src/TensorShape.test.cpp b/compiler/angkor/src/TensorShape.test.cpp index 5e6766a..3b96bb8 100644 --- a/compiler/angkor/src/TensorShape.test.cpp +++ b/compiler/angkor/src/TensorShape.test.cpp @@ -22,19 +22,19 @@ TEST(TensorShapeTest, ctor) { angkor::TensorShape shape; - ASSERT_EQ(shape.rank(), 0); + ASSERT_EQ(0, shape.rank()); } TEST(TensorShapeTest, ctor_initializer_list) { angkor::TensorShape shape{1, 3, 5, 7}; - ASSERT_EQ(shape.rank(), 4); + ASSERT_EQ(4, shape.rank()); - ASSERT_EQ(shape.dim(0), 1); - ASSERT_EQ(shape.dim(1), 3); - ASSERT_EQ(shape.dim(2), 5); - ASSERT_EQ(shape.dim(3), 7); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + ASSERT_EQ(5, shape.dim(2)); + ASSERT_EQ(7, shape.dim(3)); } TEST(TensorShapeTest, resize) @@ -43,7 +43,7 @@ TEST(TensorShapeTest, resize) shape.resize(4); - ASSERT_EQ(shape.rank(), 4); + ASSERT_EQ(4, shape.rank()); } TEST(TensorShapeTest, dim) @@ -57,7 +57,7 @@ TEST(TensorShapeTest, dim) for (uint32_t axis = 0; axis < 4; ++axis) { shape.dim(axis) = dims[axis]; - ASSERT_EQ(shape.dim(axis), dims[axis]); + ASSERT_EQ(dims[axis], shape.dim(axis)); } } @@ -66,11 +66,11 @@ TEST(TensorShapeTest, copy) const angkor::TensorShape original{3, 5, 2, 7}; const angkor::TensorShape copied{original}; - ASSERT_EQ(original.rank(), copied.rank()); + ASSERT_EQ(copied.rank(), original.rank()); for (uint32_t axis = 0; axis < 4; ++axis) { - ASSERT_EQ(original.dim(axis), copied.dim(axis)); + ASSERT_EQ(copied.dim(axis), original.dim(axis)); } } diff --git a/compiler/ann-api/README.md b/compiler/ann-api/README.md new file mode 100644 index 0000000..0c14116 --- /dev/null +++ b/compiler/ann-api/README.md @@ -0,0 +1 @@ +# ann-api diff --git a/compiler/arser/CMakeLists.txt b/compiler/arser/CMakeLists.txt new file mode 100644 index 0000000..63d19f5 --- /dev/null +++ b/compiler/arser/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(arser INTERFACE) + +# It specifies INTERFACE so that future targets linked with arser library will inherit its include directory. +# It means that a developer who want to link arser just need to add one line. +# target_link_library(another-users-target arser) +target_include_directories(arser INTERFACE include/) + +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +nnas_find_package(GTest REQUIRED) +set(TESTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/arser.test.cpp") +GTest_AddTest(arser_test ${TESTS}) +target_include_directories(arser_test PRIVATE include) diff --git a/compiler/arser/README.md b/compiler/arser/README.md new file mode 100644 index 0000000..e853e7e --- /dev/null +++ b/compiler/arser/README.md @@ -0,0 +1,3 @@ +# arser + +This is an Argument parser for c++. See [`arser.test.cpp`](tests/arser.test.cpp) for details on how to use diff --git a/compiler/arser/include/arser/arser.h b/compiler/arser/include/arser/arser.h new file mode 100644 index 0000000..64bb557 --- /dev/null +++ b/compiler/arser/include/arser/arser.h @@ -0,0 +1,507 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +namespace +{ + +template T lexical_cast(const std::string &str) +{ + std::istringstream ss; + ss.str(str); + T data; + ss >> data; + return data; +} + +template <> bool lexical_cast(const std::string &str) +{ + bool data = true; + if (str == "false" || str == "False" || str == "FALSE" || str == "0") + data = false; + return data; +} + +template inline std::string to_string(const T value) { return std::to_string(value); } + +template <> inline std::string to_string(const char *value) { return std::string(value); } + +template <> inline std::string to_string(const bool value) { return value ? "true" : "false"; } + +} // namespace + +namespace arser +{ + +// TypeName declaration +template struct TypeName +{ + static const char *Get() { return typeid(T).name(); } +}; +template <> struct TypeName +{ + static const char *Get() { return "int"; } +}; +template <> struct TypeName> +{ + static const char *Get() { return "vector"; } +}; +template <> struct TypeName +{ + static const char *Get() { return "float"; } +}; +template <> struct TypeName> +{ + static const char *Get() { return "vector"; } +}; +template <> struct TypeName +{ + static const char *Get() { return "bool"; } +}; +template <> struct TypeName +{ + static const char *Get() { return "string"; } +}; +template <> struct TypeName> +{ + static const char *Get() { return "vector"; } +}; +template <> struct TypeName +{ + static const char *Get() { return "string"; } +}; +template <> struct TypeName> +{ + static const char *Get() { return "vector"; } +}; + +// supported DataType +enum class DataType +{ + INT32, + INT32_VEC, + FLOAT, + FLOAT_VEC, + BOOL, + STR, + STR_VEC, +}; + +class Arser; + +class Argument +{ +public: + explicit Argument(const std::string &arg_name) : _name{arg_name} {} + + Argument &nargs(uint32_t num) + { + if (num == 0) + { + _type = "bool"; + } + _nargs = num; + return *this; + } + + Argument &type(DataType type) + { + switch (type) + { + case DataType::INT32: + _type = "int"; + break; + case DataType::INT32_VEC: + _type = "vector"; + break; + case DataType::FLOAT: + _type = "float"; + break; + case DataType::FLOAT_VEC: + _type = "vector"; + break; + case DataType::BOOL: + _type = "bool"; + break; + case DataType::STR: + _type = "string"; + break; + case DataType::STR_VEC: + _type = "vector"; + break; + default: + throw std::runtime_error("NYI DataType"); + } + return *this; + } + + Argument &required(void) + { + _is_required = true; + return *this; + } + + Argument &required(bool value) + { + _is_required = value; + return *this; + } + + Argument &help(std::string help_message) + { + _help_message = help_message; + return *this; + } + + Argument &exit_with(const std::function &func) + { + _func = func; + return *this; + } + + template Argument &default_value(const T value) + { + if ((_nargs <= 1 && TypeName::Get() == _type) || + (_nargs > 1 && TypeName>::Get() == _type)) + _values.emplace_back(::to_string(value)); + else + { + throw std::runtime_error("Type mismatch. " + "You called default_value() method with a type different " + "from the one you specified. " + "Please check the type of what you specified in " + "add_argument() method."); + } + return *this; + } + + template Argument &default_value(const T value, const Ts... values) + { + if ((_nargs <= 1 && TypeName::Get() == _type) || + (_nargs > 1 && TypeName>::Get() == _type)) + { + _values.emplace_back(::to_string(value)); + default_value(values...); + } + else + { + throw std::runtime_error("Type mismatch. " + "You called default_value() method with a type different " + "from the one you specified. " + "Please check the type of what you specified in " + "add_argument() method."); + } + return *this; + } + +private: + std::string _name; + std::string _type; + std::string _help_message; + std::function _func; + uint32_t _nargs{1}; + bool _is_required{false}; + std::vector _values; + + friend class Arser; + friend std::ostream &operator<<(std::ostream &, const Arser &); +}; + +class Arser +{ +public: + explicit Arser(const std::string &program_description = {}) + : _program_description{program_description} + { + add_argument("--help").help("Show help message and exit").nargs(0); + } + + Argument &add_argument(const std::string &arg_name) + { + if (arg_name.at(0) != '-') + { + _positional_arg_vec.emplace_back(arg_name); + _arg_map[arg_name] = &_positional_arg_vec.back(); + } + else + { + _optional_arg_vec.emplace_back(arg_name); + _arg_map[arg_name] = &_optional_arg_vec.back(); + } + return *_arg_map[arg_name]; + } + + void parse(int argc, char **argv) + { + _program_name = argv[0]; + _program_name.erase(0, _program_name.find_last_of("/\\") + 1); + if (argc >= 2) + { + if (!std::strcmp(argv[1], "--help")) + { + std::cout << *this; + std::exit(0); + } + else + { + for (const auto &arg : _arg_map) + { + const auto &func = arg.second->_func; + if (func && !std::strcmp(argv[1], arg.second->_name.c_str())) + { + func(); + std::exit(0); + } + } + } + } + /* + ** ./program_name [optional argument] [positional argument] + */ + // get the number of positioanl argument + size_t parg_num = _positional_arg_vec.size(); + // get the number of "required" optional argument + size_t required_oarg_num = 0; + for (auto arg : _optional_arg_vec) + { + if (arg._is_required) + required_oarg_num++; + } + // parse argument + for (int c = 1; c < argc;) + { + std::string arg_name{argv[c++]}; + auto arg = _arg_map.find(arg_name); + // check whether arg is positional or not + if (arg == _arg_map.end()) + { + if (parg_num) + { + auto it = _positional_arg_vec.begin(); + std::advance(it, _positional_arg_vec.size() - parg_num); + (*it)._values.clear(); + (*it)._values.emplace_back(arg_name); + parg_num--; + } + else + throw std::runtime_error("Invalid argument. " + "You've given more positional argument than necessary."); + } + else // optional argument + { + // check whether arg is required or not + if (arg->second->_is_required) + required_oarg_num--; + arg->second->_values.clear(); + for (uint32_t n = 0; n < arg->second->_nargs; n++) + { + if (c >= argc) + throw std::runtime_error("Invalid argument. " + "You must have missed some argument."); + arg->second->_values.emplace_back(argv[c++]); + } + if (arg->second->_nargs == 0) + { + // TODO std::boolalpha for true or false + arg->second->_values.emplace_back("1"); + } + } + } + if (parg_num || required_oarg_num) + throw std::runtime_error("Invalid argument. " + "You must have missed some argument."); + } + + bool operator[](const std::string &arg_name) + { + auto arg = _arg_map.find(arg_name); + if (arg == _arg_map.end()) + return false; + + return arg->second->_values.size() > 0 ? true : false; + } + + template T get_impl(const std::string &arg_name, T *); + + template std::vector get_impl(const std::string &arg_name, std::vector *); + + template T get(const std::string &arg_name); + +private: + std::string _program_name; + std::string _program_description; + std::list _positional_arg_vec; + std::list _optional_arg_vec; + std::map _arg_map; + + friend std::ostream &operator<<(std::ostream &, const Arser &); +}; + +template T Arser::get_impl(const std::string &arg_name, T *) +{ + auto arg = _arg_map.find(arg_name); + if (arg == _arg_map.end()) + throw std::runtime_error("Invalid argument. " + "There is no argument you are looking for."); + + if (arg->second->_type != TypeName::Get()) + throw std::runtime_error("Type mismatch. " + "You called get() method with a type different " + "from the one you specified. " + "Please check the type of what you specified in " + "add_argument() method."); + + if (arg->second->_values.size() == 0) + throw std::runtime_error("Wrong access. " + "You must make sure that the argument is given before accessing it. " + "You can do it by calling arser[\"argument\"]."); + + return ::lexical_cast(arg->second->_values[0]); +} + +template std::vector Arser::get_impl(const std::string &arg_name, std::vector *) +{ + auto arg = _arg_map.find(arg_name); + if (arg == _arg_map.end()) + throw std::runtime_error("Invalid argument. " + "There is no argument you are looking for."); + + if (arg->second->_type != TypeName>::Get()) + throw std::runtime_error("Type mismatch. " + "You called get using a type different from the one you specified."); + + std::vector data; + std::transform(arg->second->_values.begin(), arg->second->_values.end(), std::back_inserter(data), + [](std::string str) -> T { return ::lexical_cast(str); }); + return data; +} + +template T Arser::get(const std::string &arg_name) +{ + return get_impl(arg_name, static_cast(nullptr)); +} + +std::ostream &operator<<(std::ostream &stream, const Arser &parser) +{ + // print description + if (!parser._program_description.empty()) + { + stream << "What " << parser._program_name << " does: " << parser._program_description << "\n\n"; + } + /* + ** print usage + */ + stream << "Usage: ./" << parser._program_name << " "; + // required optional argument + for (const auto &arg : parser._optional_arg_vec) + { + if (!arg._is_required) + continue; + stream << arg._name << " "; + std::string arg_name = arg._name.substr(2); + std::for_each(arg_name.begin(), arg_name.end(), + [&stream](const char &c) { stream << static_cast(::toupper(c)); }); + stream << " "; + } + // rest of the optional argument + for (const auto &arg : parser._optional_arg_vec) + { + if (arg._is_required) + continue; + stream << "[" << arg._name; + if (arg._nargs) + { + stream << " "; + std::string arg_name = arg._name.substr(2); + std::for_each(arg_name.begin(), arg_name.end(), + [&stream](const char &c) { stream << static_cast(::toupper(c)); }); + } + stream << "]" + << " "; + } + // positional arguement + for (const auto &arg : parser._positional_arg_vec) + { + stream << arg._name << " "; + } + stream << "\n\n"; + /* + ** print argument list and its help message + */ + // get the length of the longest argument + size_t length_of_longest_arg = 0; + for (const auto &arg : parser._positional_arg_vec) + { + length_of_longest_arg = std::max(length_of_longest_arg, arg._name.length()); + } + for (const auto &arg : parser._optional_arg_vec) + { + length_of_longest_arg = std::max(length_of_longest_arg, arg._name.length()); + } + + const size_t message_width = 60; + // positional argument + if (!parser._positional_arg_vec.empty()) + { + stream << "[Positional argument]" << std::endl; + for (const auto &arg : parser._positional_arg_vec) + { + stream.width(length_of_longest_arg); + stream << std::left << arg._name << "\t"; + for (size_t i = 0; i < arg._help_message.length(); i += message_width) + { + if (i) + stream << std::string(length_of_longest_arg, ' ') << "\t"; + stream << arg._help_message.substr(i, message_width) << std::endl; + } + } + std::cout << std::endl; + } + // optional argument + if (!parser._optional_arg_vec.empty()) + { + stream << "[Optional argument]" << std::endl; + for (const auto &arg : parser._optional_arg_vec) + { + stream.width(length_of_longest_arg); + stream << std::left << arg._name << "\t"; + for (size_t i = 0; i < arg._help_message.length(); i += message_width) + { + if (i) + stream << std::string(length_of_longest_arg, ' ') << "\t"; + stream << arg._help_message.substr(i, message_width) << std::endl; + } + } + } + + return stream; +} + +} // namespace arser diff --git a/compiler/arser/tests/arser.test.cpp b/compiler/arser/tests/arser.test.cpp new file mode 100644 index 0000000..28bee42 --- /dev/null +++ b/compiler/arser/tests/arser.test.cpp @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include + +#include "arser/arser.h" + +using namespace arser; + +class Prompt +{ +public: + Prompt(const std::string &command) + { + std::istringstream iss(command); + std::vector token(std::istream_iterator{iss}, + std::istream_iterator()); + _arg = std::move(token); + _argv.reserve(_arg.size()); + for (const auto &t : _arg) + { + _argv.push_back(const_cast(t.data())); + } + } + int argc(void) const { return _argv.size(); } + char **argv(void) { return _argv.data(); } + +private: + std::vector _argv; + std::vector _arg; +}; + +TEST(BasicTest, option) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--verbose") + .nargs(0) + .help("It provides additional details as to what the executable is doing"); + + Prompt prompt("./executable --verbose"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--verbose"]); + EXPECT_TRUE(arser.get("--verbose")); +} + +TEST(BasicTest, OptionalArgument) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--volume") + .nargs(1) + .type(arser::DataType::INT32) + .help("Set a volume as you provided."); + arser.add_argument("--frequency") + .nargs(1) + .type(arser::DataType::FLOAT) + .help("Set a frequency as you provided."); + + Prompt prompt("./radio --volume 5 --frequency 128.5"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--volume"]); + EXPECT_EQ(5, arser.get("--volume")); + + EXPECT_TRUE(arser["--frequency"]); + EXPECT_FLOAT_EQ(128.5, arser.get("--frequency")); + + EXPECT_FALSE(arser["--price"]); + EXPECT_THROW(arser.get("--volume"), std::runtime_error); +} + +TEST(BasicTest, NonRequiredOptionalArgument) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--weight") + .nargs(1) + .type(arser::DataType::INT32) + .help("Set a volume as you provided."); + + Prompt prompt("./radio"); // empty argument + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_FALSE(arser["--volume"]); + EXPECT_THROW(arser.get("--weight"), std::runtime_error); +} + +TEST(BasicTest, RequiredOptionalArgument) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--volume") + .nargs(1) + .type(arser::DataType::INT32) + .required() + .help("Set a volume as you provided."); + + Prompt prompt("./radio"); + /* act */ /* assert */ + EXPECT_THROW(arser.parse(prompt.argc(), prompt.argv()), std::runtime_error); +} + +TEST(BasicTest, OptionalMultipleArgument) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--add").nargs(2).type(arser::DataType::INT32_VEC).help("Add two numbers."); + + Prompt prompt("./calculator --add 3 5"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--add"]); + std::vector values = arser.get>("--add"); + EXPECT_EQ(3, values.at(0)); + EXPECT_EQ(5, values.at(1)); + + EXPECT_THROW(arser.get>("--add"), std::runtime_error); +} + +TEST(BasicTest, MultipleOptionalArgument) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--input_path") + .nargs(1) + .type(arser::DataType::STR) + .help("input path of this program.") + .required(); + arser.add_argument("--output_path") + .nargs(1) + .type(arser::DataType::STR) + .help("output path of this program.") + .required(true); + arser.add_argument("--training_data") + .nargs(5) + .type(arser::DataType::INT32_VEC) + .help("give traning data to this program.") + .required(); + + Prompt prompt("./ml --input_path /I/am/in.put --output_path I/am/out.put " + "--training_data 2 43 234 3 334"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--input_path"]); + EXPECT_EQ("/I/am/in.put", arser.get("--input_path")); + EXPECT_TRUE(arser["--output_path"]); + EXPECT_EQ("I/am/out.put", arser.get("--output_path")); + EXPECT_TRUE(arser["--training_data"]); + std::vector data = arser.get>("--training_data"); + EXPECT_EQ(2, data.at(0)); + EXPECT_EQ(43, data.at(1)); + EXPECT_EQ(234, data.at(2)); + EXPECT_EQ(3, data.at(3)); + EXPECT_EQ(334, data.at(4)); +} + +TEST(BasicTest, MultipleFloatValue) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--add_float") + .nargs(2) + .type(arser::DataType::FLOAT_VEC) + .help("Add two float numbers."); + + Prompt prompt("./calculator --add_float 3.2 5.4"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--add_float"]); + std::vector values = arser.get>("--add_float"); + EXPECT_FLOAT_EQ(3.2, values.at(0)); + EXPECT_FLOAT_EQ(5.4, values.at(1)); + + EXPECT_THROW(arser.get>("--add_float"), std::runtime_error); +} + +TEST(BasicTest, MultipleStringValue) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--three_color") + .nargs(3) + .type(arser::DataType::STR_VEC) + .help("insert your three favorite color"); + + Prompt prompt("./color_factory --three_color red blue yellow"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + EXPECT_TRUE(arser["--three_color"]); + std::vector values = arser.get>("--three_color"); + EXPECT_EQ("red", values.at(0)); + EXPECT_EQ("blue", values.at(1)); + EXPECT_EQ("yellow", values.at(2)); + + EXPECT_THROW(arser.get>("--color"), std::runtime_error); +} + +void printBiography(void) { std::cerr << "When I was young.." << std::endl; } + +TEST(BasicTest, ExitWithFunctionCall) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--history").help("Show history and exit").exit_with(printBiography); + + arser.add_argument("--name").nargs(1).type(arser::DataType::STR).help("Name your hero"); + + Prompt prompt("./hero --history"); + /* act */ /* assert */ + EXPECT_EXIT(arser.parse(prompt.argc(), prompt.argv()), testing::ExitedWithCode(0), + "When I was young.."); +} + +void printVersion(std::string version) { std::cerr << "arser version : " << version << std::endl; } + +TEST(BasicTest, ExitWithFunctionCallWithBind) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--version") + .help("Show version and exit") + .exit_with(std::bind(printVersion, "1.2.0")); + + Prompt prompt("./arser --version"); + /* act */ /* assert */ + EXPECT_EXIT(arser.parse(prompt.argc(), prompt.argv()), testing::ExitedWithCode(0), + "arser version : 1.2.0"); +} + +TEST(BasicTest, ExitWithFunctionCallWithLamda) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--shutdown").help("Shut down your computer").exit_with([](void) { + std::cerr << "Good bye.." << std::endl; + }); + + arser.add_argument("OS").nargs(1).type(arser::DataType::STR).help("The OS you want to boot"); + + Prompt prompt("./computer --shutdown"); + /* act */ /* assert */ + EXPECT_EXIT(arser.parse(prompt.argc(), prompt.argv()), testing::ExitedWithCode(0), "Good bye.."); +} + +TEST(BasicTest, DefaultValue) +{ + /* arrange */ + Arser arser; + + arser.add_argument("--delivery") + .nargs(3) + .type(arser::DataType::STR_VEC) + .default_value("pizza", "chicken", "hamburger") + .help("Enter three foods that you want to deliver"); + arser.add_argument("--assistant") + .type(arser::DataType::STR) + .default_value("Bixby") + .help("Enter name of your assistant"); + arser.add_argument("--sound") + .type(arser::DataType::BOOL) + .nargs(1) + .default_value(true) + .help("Sound on/off"); + arser.add_argument("--number") + .type(arser::DataType::INT32_VEC) + .nargs(4) + .default_value(1, 2, 3, 4) + .help("Enter the number that you want to call"); + arser.add_argument("--time") + .type(arser::DataType::INT32_VEC) + .nargs(3) + .default_value(0, 0, 0) + .help("Current time(H/M/S)"); + arser.add_argument("--name") + .type(arser::DataType::STR) + .nargs(1) + .default_value("no name") + .help("Enter your name"); + + Prompt prompt("/phone --time 1 52 34 --name arser"); + /* act */ + arser.parse(prompt.argc(), prompt.argv()); + /* assert */ + // 3 strings, no argument + std::vector delivery = arser.get>("--delivery"); + EXPECT_EQ("pizza", delivery.at(0)); + EXPECT_EQ("chicken", delivery.at(1)); + EXPECT_EQ("hamburger", delivery.at(2)); + // 1 string, no argument + EXPECT_EQ("Bixby", arser.get("--assistant")); + // 1 bool, no argument + EXPECT_EQ(true, arser.get("--sound")); + // 4 integer, no argument + std::vector number = arser.get>("--number"); + EXPECT_EQ(1, number.at(0)); + EXPECT_EQ(2, number.at(1)); + EXPECT_EQ(3, number.at(2)); + EXPECT_EQ(4, number.at(3)); + // 3 integer, 3 arguments + std::vector time = arser.get>("--time"); + EXPECT_EQ(1, time.at(0)); + EXPECT_EQ(52, time.at(1)); + EXPECT_EQ(34, time.at(2)); + // 1 string, 1 argument + EXPECT_EQ("arser", arser.get("--name")); +} diff --git a/compiler/caffe2circle/requires.cmake b/compiler/caffe2circle/requires.cmake index cc05edd..b16a511 100644 --- a/compiler/caffe2circle/requires.cmake +++ b/compiler/caffe2circle/requires.cmake @@ -1,3 +1,3 @@ -require("mir-onnx-importer") +require("mir") require("mir2loco") require("exo") diff --git a/compiler/circle-inspect/CMakeLists.txt b/compiler/circle-inspect/CMakeLists.txt index 222f8cb..d0775ea 100644 --- a/compiler/circle-inspect/CMakeLists.txt +++ b/compiler/circle-inspect/CMakeLists.txt @@ -8,6 +8,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(circle-inspect ${DRIVER} ${SOURCES}) target_include_directories(circle-inspect PRIVATE src) +target_link_libraries(circle-inspect arser) +target_link_libraries(circle-inspect foder) target_link_libraries(circle-inspect mio_circle) target_link_libraries(circle-inspect safemain) -target_link_libraries(circle-inspect stdex) diff --git a/compiler/circle-inspect/driver/Driver.cpp b/compiler/circle-inspect/driver/Driver.cpp index d23cd0f..72cfa28 100644 --- a/compiler/circle-inspect/driver/Driver.cpp +++ b/compiler/circle-inspect/driver/Driver.cpp @@ -14,74 +14,63 @@ * limitations under the License. */ -#include "Model.h" #include "Dump.h" -#include +#include +#include #include #include #include +#include #include #include -using OptionHook = std::function(void)>; - int entry(int argc, char **argv) { - if (argc < 3) + arser::Arser arser{ + "circle-inspect allows users to retrieve various information from a Circle model file"}; + arser.add_argument("--operators").nargs(0).help("Dump operators in circle file"); + arser.add_argument("--conv2d_weight") + .nargs(0) + .help("Dump Conv2D series weight operators in circle file"); + arser.add_argument("--op_version").nargs(0).help("Dump versions of the operators in circle file"); + arser.add_argument("circle").type(arser::DataType::STR).help("Circle file to inspect"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [options] [circle]" << std::endl; - std::cerr << " --operators : dump operators in circle file" << std::endl; - std::cerr << " --conv2d_weight : dump Conv2D series weight operators in circle file" - << std::endl; + std::cout << err.what() << std::endl; + std::cout << arser; return 255; } - // Simple argument parser (based on map) - std::map argparse; - - argparse["--operators"] = [&](void) { - // dump all operators - return std::move(stdex::make_unique()); - }; - - argparse["--conv2d_weight"] = [&](void) { - // dump Conv2D, DepthwiseConv2D weight operators - return std::move(stdex::make_unique()); - }; + if (!arser["--operators"] && !arser["--conv2d_weight"] && !arser["--op_version"]) + { + std::cout << "At least one option must be specified" << std::endl; + std::cout << arser; + return 255; + } std::vector> dumps; - for (int n = 1; n < argc - 1; ++n) - { - const std::string tag{argv[n]}; - - auto it = argparse.find(tag); - if (it == argparse.end()) - { - std::cerr << "Option '" << tag << "' is not supported" << std::endl; - return 255; - } - auto dump = it->second(); - assert(dump != nullptr); - dumps.push_back(std::move(dump)); - } + if (arser["--operators"]) + dumps.push_back(std::make_unique()); + if (arser["--conv2d_weight"]) + dumps.push_back(std::make_unique()); + if (arser["--op_version"]) + dumps.push_back(std::make_unique()); - std::string model_file = argv[argc - 1]; + std::string model_file = arser.get("circle"); // Load Circle model from a circle file - auto model = circleinspect::load_circle(model_file); - if (model == nullptr) - { - std::cerr << "ERROR: Failed to load circle '" << model_file << "'" << std::endl; - return 255; - } - - const circle::Model *circlemodel = model->model(); - if (circlemodel == nullptr) + foder::FileLoader fileLoader{model_file}; + std::vector modelData = fileLoader.load(); + const circle::Model *circleModel = circle::GetModel(modelData.data()); + if (circleModel == nullptr) { std::cerr << "ERROR: Failed to load circle '" << model_file << "'" << std::endl; return 255; @@ -89,7 +78,7 @@ int entry(int argc, char **argv) for (auto &dump : dumps) { - dump->run(std::cout, circlemodel); + dump->run(std::cout, circleModel); } return 0; diff --git a/compiler/circle-inspect/requires.cmake b/compiler/circle-inspect/requires.cmake index b090dbd..81e0f0d 100644 --- a/compiler/circle-inspect/requires.cmake +++ b/compiler/circle-inspect/requires.cmake @@ -1,3 +1,3 @@ +require("arser") require("mio-circle") require("safemain") -require("stdex") diff --git a/compiler/circle-inspect/src/Dump.cpp b/compiler/circle-inspect/src/Dump.cpp index fbc092b..5c71afb 100644 --- a/compiler/circle-inspect/src/Dump.cpp +++ b/compiler/circle-inspect/src/Dump.cpp @@ -26,19 +26,22 @@ void DumpOperators::run(std::ostream &os, const circle::Model *model) { circleinspect::Reader reader(model); - assert(reader.num_subgraph() == 1); - reader.select_subgraph(0); - - auto ops = reader.operators(); + const uint32_t subgraph_size = reader.num_subgraph(); - // dump operators - for (uint32_t i = 0; i < ops->Length(); ++i) + for (uint32_t g = 0; g < subgraph_size; g++) { - const auto op = ops->Get(i); + reader.select_subgraph(g); + auto ops = reader.operators(); - auto op_name = reader.opcode_name(op); + // dump operators + for (uint32_t i = 0; i < ops->Length(); ++i) + { + const auto op = ops->Get(i); + + auto op_name = reader.opcode_name(op); - os << op_name << std::endl; + os << op_name << std::endl; + } } } @@ -92,43 +95,82 @@ void DumpConv2DWeight::run(std::ostream &os, const circle::Model *model) { circleinspect::Reader reader(model); + const uint32_t subgraph_size = reader.num_subgraph(); + + for (uint32_t g = 0; g < subgraph_size; g++) + { + reader.select_subgraph(g); + auto ops = reader.operators(); + + // dump Conv2D, DepthwiseConv2D and its weight input operator + for (uint32_t i = 0; i < ops->Length(); ++i) + { + const auto op = ops->Get(i); + auto bc = reader.builtin_code(op); + + if (bc == circle::BuiltinOperator_CONV_2D || bc == circle::BuiltinOperator_DEPTHWISE_CONV_2D) + { + const std::vector &inputs = circleinspect::as_index_vector(op->inputs()); + if (inputs.size() < 2) + { + throw std::runtime_error("Operator has invalid input"); + } + auto weight_input = inputs[1]; // Tensor ID of weight input + + const auto op_weight = operator_match_output(reader, weight_input); + const auto buffer_size = tensor_buffer_size(reader, weight_input); + + std::string weight_op_name = "?"; + + if (op_weight == nullptr && buffer_size > 0) + { + weight_op_name = "CONST"; + } + else if (op_weight != nullptr) + { + weight_op_name = reader.opcode_name(op_weight); + } + + auto op_name = reader.opcode_name(op); + os << op_name << "," << weight_op_name << std::endl; + } + } + } +} + +} // namespace circleinspect + +namespace circleinspect +{ + +void DumpOperatorVersion::run(std::ostream &os, const circle::Model *model) +{ + std::map op_version_map; + + circleinspect::Reader reader(model); + + // This assert is subject to be changed later assert(reader.num_subgraph() == 1); reader.select_subgraph(0); auto ops = reader.operators(); - // dump Conv2D, DepthwiseConv2D and its weight input operator + // Dump operators' version for (uint32_t i = 0; i < ops->Length(); ++i) { const auto op = ops->Get(i); - auto bc = reader.builtin_code(op); - - if (bc == circle::BuiltinOperator_CONV_2D || bc == circle::BuiltinOperator_DEPTHWISE_CONV_2D) - { - const std::vector &inputs = circleinspect::as_index_vector(op->inputs()); - if (inputs.size() < 2) - { - throw std::runtime_error("Operator has invalid input"); - } - auto weight_input = inputs[1]; // Tensor ID of weight input - - const auto op_weight = operator_match_output(reader, weight_input); - const auto buffer_size = tensor_buffer_size(reader, weight_input); - std::string weight_op_name = "?"; + auto op_name = reader.opcode_name(op); + auto op_version = reader.opcodes().at(op->opcode_index())->version(); - if (op_weight == nullptr && buffer_size > 0) - { - weight_op_name = "CONST"; - } - else if (op_weight != nullptr) - { - weight_op_name = reader.opcode_name(op_weight); - } + if (op_version_map.find(op_name) == op_version_map.end() || + op_version_map[op_name] < op_version) + op_version_map[op_name] = op_version; + } - auto op_name = reader.opcode_name(op); - os << op_name << "," << weight_op_name << std::endl; - } + for (auto op : op_version_map) + { + os << op.first << "," << op.second << std::endl; } } diff --git a/compiler/circle-inspect/src/Dump.h b/compiler/circle-inspect/src/Dump.h index 6afba83..996c421 100644 --- a/compiler/circle-inspect/src/Dump.h +++ b/compiler/circle-inspect/src/Dump.h @@ -51,6 +51,15 @@ public: void run(std::ostream &os, const circle::Model *model); }; +class DumpOperatorVersion final : public DumpInterface +{ +public: + DumpOperatorVersion() = default; + +public: + void run(std::ostream &os, const circle::Model *model); +}; + } // namespace circleinspect #endif // __DUMP_H__ diff --git a/compiler/circle-inspect/src/Model.cpp b/compiler/circle-inspect/src/Model.cpp deleted file mode 100644 index 1924bfa..0000000 --- a/compiler/circle-inspect/src/Model.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Model.h" - -#include -#include -#include -#include - -namespace -{ - -class MemoryMappedModel final : public circleinspect::Model -{ -public: - /** - * @require fd and data SHOULD be valid - */ - explicit MemoryMappedModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} - { - // DO NOTHING - } - -public: - ~MemoryMappedModel() - { - munmap(_data, _size); - close(_fd); - } - -public: - MemoryMappedModel(const MemoryMappedModel &) = delete; - MemoryMappedModel(MemoryMappedModel &&) = delete; - -public: - const ::circle::Model *model(void) const override { return ::circle::GetModel(_data); } - -private: - int _fd = -1; - void *_data = nullptr; - size_t _size = 0; -}; - -class FileDescriptor final -{ -public: - FileDescriptor(int value) : _value{value} - { - // DO NOTHING - } - -public: - // NOTE Copy is not allowed - FileDescriptor(const FileDescriptor &) = delete; - -public: - // NOTE Move is allowed - FileDescriptor(FileDescriptor &&fd) { _value = fd.release(); } - -public: - ~FileDescriptor() - { - if (_value != -1) - { - // Close on descturction - close(_value); - } - } - -public: - int value(void) const { return _value; } - -public: - int release(void) - { - auto res = _value; - _value = -1; - return res; - } - -private: - int _value = -1; -}; - -} // namespace - -namespace circleinspect -{ - -std::unique_ptr load_circle(const std::string &path) -{ - FileDescriptor fd = open(path.c_str(), O_RDONLY); - - if (fd.value() == -1) - { - // Return nullptr on open failure - return nullptr; - } - - struct stat st; - if (fstat(fd.value(), &st) == -1) - { - // Return nullptr on fstat failure - return nullptr; - } - - auto size = st.st_size; - auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fd.value(), 0); - - if (data == MAP_FAILED) - { - // Return nullptr on mmap failure - return nullptr; - } - - // Check if file is a valid Flatbuffer file - const uint8_t *u8data = reinterpret_cast(data); - flatbuffers::Verifier verifier{u8data, static_cast(size)}; - if (!circle::VerifyModelBuffer(verifier)) - { - munmap(data, size); - close(fd.release()); - return nullptr; - } - - return std::unique_ptr{new MemoryMappedModel(fd.release(), data, size)}; -} - -} // namespace circleinspect diff --git a/compiler/circle-inspect/src/Model.h b/compiler/circle-inspect/src/Model.h deleted file mode 100644 index 8206ed3..0000000 --- a/compiler/circle-inspect/src/Model.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MODEL_H__ -#define __MODEL_H__ - -#include - -#include - -namespace circleinspect -{ - -struct Model -{ - virtual ~Model() = default; - - virtual const ::circle::Model *model(void) const = 0; -}; - -/** - * @brief Load Circle model (as a raw Model) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_circle(const std::string &path); - -} // namespace circleinspect - -#endif // __MODEL_H__ diff --git a/compiler/circle-inspect/src/Reader.cpp b/compiler/circle-inspect/src/Reader.cpp index dbbc7c7..7807db3 100644 --- a/compiler/circle-inspect/src/Reader.cpp +++ b/compiler/circle-inspect/src/Reader.cpp @@ -50,7 +50,10 @@ std::string opcode_name(const circle::OperatorCode *opcode) if (!opcode->custom_code()) return "(invalid custom)"; - return opcode->custom_code()->c_str(); + std::string custom_op = "CUSTOM("; + custom_op += opcode->custom_code()->c_str(); + custom_op += ")"; + return custom_op; } circle::BuiltinOperator code = opcode->builtin_code(); diff --git a/compiler/circle-quantizer/CMakeLists.txt b/compiler/circle-quantizer/CMakeLists.txt new file mode 100644 index 0000000..1335057 --- /dev/null +++ b/compiler/circle-quantizer/CMakeLists.txt @@ -0,0 +1,17 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(circle-quantizer "${SOURCES}") +target_include_directories(circle-quantizer PRIVATE include) +target_include_directories(circle-quantizer PRIVATE src) +target_link_libraries(circle-quantizer foder) +target_link_libraries(circle-quantizer safemain) +target_link_libraries(circle-quantizer oops) +target_link_libraries(circle-quantizer loco) +target_link_libraries(circle-quantizer mio_circle) +target_link_libraries(circle-quantizer luci_import) +target_link_libraries(circle-quantizer luci_service) +target_link_libraries(circle-quantizer luci_pass) +target_link_libraries(circle-quantizer luci_export) +target_link_libraries(circle-quantizer arser) + +install(TARGETS circle-quantizer DESTINATION bin) diff --git a/compiler/circle-quantizer/README.md b/compiler/circle-quantizer/README.md new file mode 100644 index 0000000..2666c84 --- /dev/null +++ b/compiler/circle-quantizer/README.md @@ -0,0 +1,3 @@ +# circle-quantizer + +_circle-quantizer_ provides post-training quantization functionalities for Circle models diff --git a/compiler/circle-quantizer/include/CircleExpContract.h b/compiler/circle-quantizer/include/CircleExpContract.h new file mode 100644 index 0000000..e888e4a --- /dev/null +++ b/compiler/circle-quantizer/include/CircleExpContract.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLEQUANTIZER_CIRCLEXPCONTRACT_H__ +#define __CIRCLEQUANTIZER_CIRCLEXPCONTRACT_H__ + +#include +#include +#include + +#include +#include + +struct CircleExpContract : public luci::CircleExporter::Contract +{ +public: + CircleExpContract(luci::Module *module, const std::string &filename) + : _module(module), _filepath(filename) + { + // NOTHING TO DO + } + virtual ~CircleExpContract() = default; + +public: + loco::Graph *graph(void) const final { return nullptr; } + luci::Module *module(void) const final { return _module; }; + +public: + bool store(const char *ptr, const size_t size) const final; + +private: + luci::Module *_module; + const std::string _filepath; +}; + +#endif // __CIRCLEQUANTIZER_CIRCLEXPCONTRACT_H__ diff --git a/compiler/circle-quantizer/requires.cmake b/compiler/circle-quantizer/requires.cmake new file mode 100644 index 0000000..2293e53 --- /dev/null +++ b/compiler/circle-quantizer/requires.cmake @@ -0,0 +1,7 @@ +require("foder") +require("loco") +require("locop") +require("safemain") +require("luci") +require("oops") +require("arser") diff --git a/compiler/circle-quantizer/src/CircleExpContract.cpp b/compiler/circle-quantizer/src/CircleExpContract.cpp new file mode 100644 index 0000000..b56b7ee --- /dev/null +++ b/compiler/circle-quantizer/src/CircleExpContract.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleExpContract.h" + +#include + +#include +#include + +bool CircleExpContract::store(const char *ptr, const size_t size) const +{ + if (!ptr) + INTERNAL_EXN("Graph was not serialized by FlatBuffer for some reason"); + + std::ofstream fs(_filepath.c_str(), std::ofstream::binary); + fs.write(ptr, size); + + return fs.good(); +} diff --git a/compiler/circle-quantizer/src/CircleQuantizer.cpp b/compiler/circle-quantizer/src/CircleQuantizer.cpp new file mode 100644 index 0000000..b56b547 --- /dev/null +++ b/compiler/circle-quantizer/src/CircleQuantizer.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleExpContract.h" + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +using OptionHook = std::function; + +using Algorithms = luci::CircleOptimizer::Options::Algorithm; +using AlgorithmParameters = luci::CircleOptimizer::Options::AlgorithmParameters; + +int entry(int argc, char **argv) +{ + // Simple argument parser (based on map) + std::map argparse; + luci::CircleOptimizer optimizer; + + auto options = optimizer.options(); + + const std::string qdqw = "--quantize_dequantize_weights"; + const std::string qwmm = "--quantize_with_minmax"; + + arser::Arser arser("circle-quantizer provides circle model quantization"); + + arser.add_argument(qdqw) + .nargs(3) + .type(arser::DataType::STR_VEC) + .required(false) + .help("Quantize-dequantize weight values required action before quantization. " + "Three arguments required: input_dtype(float32) " + "output_dtype(uint8) granularity(layer)"); + + arser.add_argument(qwmm) + .nargs(3) + .type(arser::DataType::STR_VEC) + .required(false) + .help("Quantize with min/max values. " + "Three arguments required: input_dtype(float32) " + "output_dtype(uint8) granularity(layer)"); + + arser.add_argument("input").nargs(1).type(arser::DataType::STR).help("Input circle model"); + arser.add_argument("output").nargs(1).type(arser::DataType::STR).help("Output circle model"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 255; + } + + if (arser[qdqw]) + { + auto values = arser.get>(qdqw); + if (values.size() != 3) + { + std::cerr << arser; + return 255; + } + options->enable(Algorithms::QuantizeDequantizeWeights); + + options->param(AlgorithmParameters::Quantize_input_dtype, values.at(0)); + options->param(AlgorithmParameters::Quantize_output_dtype, values.at(1)); + options->param(AlgorithmParameters::Quantize_granularity, values.at(2)); + } + + if (arser[qwmm]) + { + auto values = arser.get>(qwmm); + if (values.size() != 3) + { + std::cerr << arser; + return 255; + } + options->enable(Algorithms::QuantizeWithMinMax); + + options->param(AlgorithmParameters::Quantize_input_dtype, values.at(0)); + options->param(AlgorithmParameters::Quantize_output_dtype, values.at(1)); + options->param(AlgorithmParameters::Quantize_granularity, values.at(2)); + } + + std::string input_path = arser.get("input"); + std::string output_path = arser.get("output"); + + // Load model from the file + foder::FileLoader file_loader{input_path}; + std::vector model_data = file_loader.load(); + const circle::Model *circle_model = circle::GetModel(model_data.data()); + if (circle_model == nullptr) + { + std::cerr << "ERROR: Failed to load circle '" << input_path << "'" << std::endl; + return EXIT_FAILURE; + } + + // Import from input Circle file + luci::Importer importer; + auto module = importer.importModule(circle_model); + + for (size_t idx = 0; idx < module->size(); ++idx) + { + auto graph = module->graph(idx); + + // quantize the graph + optimizer.quantize(graph); + + if (!luci::validate(graph)) + { + std::cerr << "ERROR: Quantized graph is invalid" << std::endl; + return 255; + } + } + + // Export to output Circle file + luci::CircleExporter exporter; + + CircleExpContract contract(module.get(), output_path); + + if (!exporter.invoke(&contract)) + { + std::cerr << "ERROR: Failed to export '" << output_path << "'" << std::endl; + return 255; + } + + return 0; +} diff --git a/compiler/circle-tensordump/CMakeLists.txt b/compiler/circle-tensordump/CMakeLists.txt new file mode 100644 index 0000000..e55901f --- /dev/null +++ b/compiler/circle-tensordump/CMakeLists.txt @@ -0,0 +1,23 @@ +if(NOT TARGET mio_circle) + return() +endif(NOT TARGET mio_circle) + +nnas_find_package(HDF5 QUIET) + +if(NOT HDF5_FOUND) + message(STATUS "Build circle-tensordump: FAILED (missing HDF5)") + return() +endif(NOT HDF5_FOUND) + +set(DRIVER "driver/Driver.cpp") + +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(circle-tensordump ${DRIVER} ${SOURCES}) +target_include_directories(circle-tensordump PRIVATE src) +target_include_directories(circle-tensordump PRIVATE ${HDF5_INCLUDE_DIRS}) +target_link_libraries(circle-tensordump PRIVATE ${HDF5_CXX_LIBRARIES}) +target_link_libraries(circle-tensordump PRIVATE arser) +target_link_libraries(circle-tensordump PRIVATE foder) +target_link_libraries(circle-tensordump PRIVATE mio_circle) +target_link_libraries(circle-tensordump PRIVATE safemain) diff --git a/compiler/circle-tensordump/README.md b/compiler/circle-tensordump/README.md new file mode 100644 index 0000000..dcb05d5 --- /dev/null +++ b/compiler/circle-tensordump/README.md @@ -0,0 +1,73 @@ +# circle-tensordump + +_circle-tensordump_ allows users to retrieve tensor information from a Circle model file + +## options + +**--tensors** + +dump tensors in circle file + +``` +$ ./circle-tensordump --tensors ../luci/tests/Conv2D_000.circle + +---------------------------------------------------------------------- +[ifm] + └── shape : (1, 3, 3, 2) + +---------------------------------------------------------------------- +[ker] + ├── shape : (1, 1, 1, 2) + └── buffer +    ├── index : 3 +    ├── size : 8 +    └── data : 0.727939, 0.320132, + +---------------------------------------------------------------------- +[bias] + ├── shape : (1) + └── buffer +    ├── index : 4 +    ├── size : 4 +    └── data : -0.794465, + +---------------------------------------------------------------------- +[ofm] + └── shape : (1, 3, 3, 1) +``` + +**--tensors_to_hdf5** + +dump tensors in circle file to hdf5 file + +``` +$ ./circle-tensordump --tensors_to_hdf5 ../luci/tests/Conv2D_000.circle output_path.h5 +$ h5dump output_path.h5 + +HDF5 "output_path.h5" { +GROUP "/" { + GROUP "bias" { + DATASET "weights" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SIMPLE { ( 1 ) / ( 1 ) } + DATA { + (0): -0.794465 + } + } + } + GROUP "ifm" { + } + GROUP "ker" { + DATASET "weights" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SIMPLE { ( 1, 1, 1, 2 ) / ( 1, 1, 1, 2 ) } + DATA { + (0,0,0,0): 0.727939, 0.320132 + } + } + } + GROUP "ofm" { + } +} +} +``` diff --git a/compiler/circle-tensordump/driver/Driver.cpp b/compiler/circle-tensordump/driver/Driver.cpp new file mode 100644 index 0000000..a55cd45 --- /dev/null +++ b/compiler/circle-tensordump/driver/Driver.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Dump.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +int entry(int argc, char **argv) +{ + arser::Arser arser{ + "circle-tensordump allows users to retrieve tensor information from a Circle model file"}; + + arser.add_argument("circle").nargs(1).type(arser::DataType::STR).help("Circle file path to dump"); + arser.add_argument("--tensors").nargs(0).help("Dump to console"); + arser.add_argument("--tensors_to_hdf5") + .nargs(1) + .type(arser::DataType::STR) + .help("Dump to hdf5 file. Specify hdf5 file path to be dumped"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; + } + + std::unique_ptr dump; + + std::string model_file = arser.get("circle"); + std::string output_path; + if (arser["--tensors_to_hdf5"]) + { + dump = std::move(std::make_unique()); + output_path = arser.get("--tensors_to_hdf5"); + } + if (arser["--tensors"]) + { + dump = std::move(std::make_unique()); + } + + // Load Circle model from a circle file + foder::FileLoader fileLoader{model_file}; + std::vector modelData = fileLoader.load(); + const circle::Model *circleModel = circle::GetModel(modelData.data()); + if (circleModel == nullptr) + { + std::cerr << "ERROR: Failed to load circle '" << model_file << "'" << std::endl; + return EXIT_FAILURE; + } + + dump->run(std::cout, circleModel, output_path); + + return EXIT_SUCCESS; +} diff --git a/compiler/circle-tensordump/requires.cmake b/compiler/circle-tensordump/requires.cmake new file mode 100644 index 0000000..1c754f5 --- /dev/null +++ b/compiler/circle-tensordump/requires.cmake @@ -0,0 +1,4 @@ +require("arser") +require("foder") +require("mio-circle") +require("safemain") diff --git a/compiler/circle-tensordump/src/Dump.cpp b/compiler/circle-tensordump/src/Dump.cpp new file mode 100644 index 0000000..dfa78f0 --- /dev/null +++ b/compiler/circle-tensordump/src/Dump.cpp @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Dump.h" +#include "Reader.h" + +#include + +#include +#include +#include +#include + +namespace +{ + +template +void print_comma_sepearted(std::ostream &os, const flatbuffers::Vector *vec) +{ + if (vec == nullptr) + return; + for (auto iter = vec->begin(); iter != vec->end(); iter++) + { + if (iter != vec->begin()) + os << ", "; + os << *iter; + } +} + +void print_buffer(std::ostream &os, uint32_t buff_idx, const flatbuffers::Vector *data_ptr, + const circle::TensorType &type) +{ + if (data_ptr == nullptr) + return; + + os << " └── buffer" << std::endl; + os << "    ├── index : " << buff_idx << std::endl; + size_t buff_size = data_ptr->size(); + os << "    ├── size : " << buff_size << std::endl; + os << "    └── data : "; + switch (type) + { + case circle::TensorType_UINT8: + { + const uint8_t *buff_data_ui8 = reinterpret_cast(data_ptr->data()); + for (uint32_t idx = 0; idx < buff_size / sizeof(uint8_t); idx++) + { + os << static_cast(buff_data_ui8[idx]) << ", "; + } + break; + } + case circle::TensorType_INT32: + { + const int32_t *buff_data_i32 = reinterpret_cast(data_ptr->data()); + for (uint32_t idx = 0; idx < buff_size / sizeof(int32_t); idx++) + { + os << buff_data_i32[idx] << ", "; + } + break; + } + case circle::TensorType_INT64: + { + const int64_t *buff_data_i64 = reinterpret_cast(data_ptr->data()); + for (uint32_t idx = 0; idx < buff_size / sizeof(int64_t); idx++) + { + os << buff_data_i64[idx] << ", "; + } + break; + } + case circle::TensorType_FLOAT32: + { + const float *buff_data_f32 = reinterpret_cast(data_ptr->data()); + for (uint32_t idx = 0; idx < buff_size / sizeof(float); idx++) + { + os << buff_data_f32[idx] << ", "; + } + break; + } + default: + throw std::runtime_error("NYI tensor type : " + std::to_string(type)); + } + os << std::endl; +} + +} // namespace + +namespace circletensordump +{ + +void DumpTensors::run(std::ostream &os, const circle::Model *model, const std::string &) +{ + circletensordump::Reader reader(model); + uint32_t num_subgraph = reader.num_subgraph(); + auto buffers = reader.buffers(); + + for (uint32_t subgraph_idx = 0; subgraph_idx < num_subgraph; subgraph_idx++) + { + reader.select_subgraph(subgraph_idx); + + auto tensors = reader.tensors(); + for (const auto &tensor : *tensors) + { + os << std::string(70, '-') << std::endl; + os << "[" << tensor->name()->str() << "]" << std::endl; + auto buff_idx = tensor->buffer(); + auto buff_data_ptr = reader.buffers()->Get(buff_idx)->data(); + auto quant_param = tensor->quantization(); + std::string print_format = (!buff_data_ptr && !quant_param) ? "└──" : "├──"; + + // shape + auto shape = tensor->shape(); + os << " " + print_format + " shape : ("; + ::print_comma_sepearted(os, shape); + os << ")" << std::endl; + + // quantization paramters + if (quant_param) + { + std::string print_format1 = buff_data_ptr ? "├──" : "└──"; + std::string print_format2 = buff_data_ptr ? "│" : " "; + os << " " + print_format1 + " quantization" << std::endl; + auto min = quant_param->min(); + auto max = quant_param->max(); + auto scale = quant_param->scale(); + auto zero_point = quant_param->zero_point(); + + os << " " + print_format2 + "   ├── min : "; + ::print_comma_sepearted(os, min); + os << std::endl; + os << " " + print_format2 + "   ├── max : "; + ::print_comma_sepearted(os, max); + os << std::endl; + os << " " + print_format2 + "   ├── scale : "; + ::print_comma_sepearted(os, scale); + os << std::endl; + os << " " + print_format2 + "   └── zero_point : "; + ::print_comma_sepearted(os, zero_point); + os << std::endl; + } + + // buffer + print_buffer(os, buff_idx, buff_data_ptr, tensor->type()); + os << std::endl; + } + } +} + +} // namespace circletensordump + +namespace +{ + +// HDF5 forbids the inclusion of '/' in the name. +std::string mangle(const std::string &name) +{ + std::string ret{name}; + std::replace(ret.begin(), ret.end(), '/', '_'); + return ret; +} + +H5::PredType hdf5_dtype_cast(const circle::TensorType &circle_type) +{ + switch (circle_type) + { + case circle::TensorType_UINT8: + { + return H5::PredType::NATIVE_UINT8; + } + case circle::TensorType_INT32: + { + return H5::PredType::NATIVE_INT32; + } + case circle::TensorType_INT64: + { + return H5::PredType::NATIVE_INT64; + } + case circle::TensorType_FLOAT32: + { + return H5::PredType::NATIVE_FLOAT; + } + default: + throw std::runtime_error("NYI tensor type : " + std::to_string(circle_type)); + } +} + +/** + * In order to create a dataspace, its rank and dimensions are required as hsize_t type. + * This function converts flatbuffers::Vector to std::vector. + * + * If "dims" parameter is passed, the parameter will be converted. However, if + * not passed(nullptr), data is considered as a rank 1 vector. + */ +template +std::vector hdf5_dims_cast(const flatbuffers::Vector *data, + const flatbuffers::Vector *dims = nullptr) +{ + std::vector ret; + if (data != nullptr) + { + if (dims == nullptr) + { + ret.resize(1); + ret.at(0) = data->size(); + } + else + { + const uint32_t rank = dims->size(); + ret.resize(rank); + for (uint32_t d = 0; d < rank; d++) + { + ret.at(d) = dims->Get(d); + } + } + } + return ret; +} + +/** + * This function writes data to given hdf5 file like below. + * + * GROUP "group_name" + * ㄴDATATYPE "type" + * ㄴDATASET "dataset_name" + * ㄴDATASPACE "dims" + * ㄴDATA "data" + */ +template +void write_data_to_hdf5(H5::H5File &file, std::string &group_name, std::string dataset_name, + const H5::PredType &type, const flatbuffers::Vector *data, + std::vector dims) +{ + if (data == nullptr) + return; + auto dataspace = std::make_unique(dims.size(), dims.data()); + auto dataset = std::make_unique( + file.createDataSet(group_name + "/" + dataset_name, type, *dataspace)); + dataset->write(data->data(), type); +} + +} // namespace + +namespace circletensordump +{ + +/** + * HDF5 layout is like below + * + * GROUP "/" + * ㄴGROUP "tensor name" + * ㄴDATASET "weights" : Shape (x, y, ...), type(uint8, int16) + * ㄴDATASET "min" : Shape (n) + * ㄴDATASET "max" : Shape (n) + * ㄴDATASET "scale" : Shape (m) + * ㄴDATASET "zero_point" : Shape (m) + * + * NOTE All Dataset is optional. It means that if tensor doesn't have the data, it won't be created + * as a Dataset + * + */ +void DumpTensorsToHdf5::run(std::ostream &os, const circle::Model *model, + const std::string &output_path) +{ + // loads a circle model + circletensordump::Reader reader(model); + uint32_t num_subgraph = reader.num_subgraph(); + + // create a hdf5 file + H5::H5File file{output_path, H5F_ACC_TRUNC}; + + for (uint32_t subgraph_idx = 0; subgraph_idx < num_subgraph; subgraph_idx++) + { + reader.select_subgraph(subgraph_idx); + + auto tensors = reader.tensors(); + for (const auto &tensor : *tensors) + { + // create a group for each tensor whose name is its tensor name + std::string group_name = ::mangle(tensor->name()->c_str()); + std::unique_ptr tensor_group = + std::make_unique(file.createGroup(group_name)); + + // write a buffer data + uint32_t buff_idx = tensor->buffer(); + auto buff_data_ptr = reader.buffers()->Get(buff_idx)->data(); + if (buff_data_ptr) + { + ::write_data_to_hdf5(file, group_name, "weights", ::hdf5_dtype_cast(tensor->type()), + buff_data_ptr, ::hdf5_dims_cast(buff_data_ptr, tensor->shape())); + } + + // write quantization parameters + auto quant_param = tensor->quantization(); + if (quant_param) + { + auto min = quant_param->min(); + ::write_data_to_hdf5(file, group_name, "min", H5::PredType::NATIVE_FLOAT, min, + ::hdf5_dims_cast(min)); + auto max = quant_param->max(); + ::write_data_to_hdf5(file, group_name, "max", H5::PredType::NATIVE_FLOAT, max, + ::hdf5_dims_cast(max)); + auto scale = quant_param->scale(); + ::write_data_to_hdf5(file, group_name, "scale", H5::PredType::NATIVE_FLOAT, scale, + ::hdf5_dims_cast(scale)); + auto zero_point = quant_param->zero_point(); + ::write_data_to_hdf5(file, group_name, "zero_point", H5::PredType::NATIVE_INT64, zero_point, + ::hdf5_dims_cast(zero_point)); + } + } + } +} + +} // namespace circletensordump diff --git a/compiler/circle-tensordump/src/Dump.h b/compiler/circle-tensordump/src/Dump.h new file mode 100644 index 0000000..5dfa59d --- /dev/null +++ b/compiler/circle-tensordump/src/Dump.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_TENSORDUMP_DUMP_H__ +#define __CIRCLE_TENSORDUMP_DUMP_H__ + +#include + +#include + +namespace circletensordump +{ + +class DumpInterface +{ +public: + virtual ~DumpInterface() = default; + +public: + virtual void run(std::ostream &os, const circle::Model *model, + const std::string &output_path = {}) = 0; +}; + +class DumpTensors final : public DumpInterface +{ +public: + DumpTensors() = default; + +public: + void run(std::ostream &os, const circle::Model *model, const std::string &) override; +}; + +class DumpTensorsToHdf5 final : public DumpInterface +{ +public: + DumpTensorsToHdf5() = default; + +public: + void run(std::ostream &os, const circle::Model *model, const std::string &output_path) override; +}; + +} // namespace circletensordump + +#endif // __CIRCLE_TENSORDUMP_DUMP_H__ diff --git a/compiler/circle-tensordump/src/Reader.cpp b/compiler/circle-tensordump/src/Reader.cpp new file mode 100644 index 0000000..429736b --- /dev/null +++ b/compiler/circle-tensordump/src/Reader.cpp @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Reader.h" + +#include +#include + +namespace circletensordump +{ + +bool is_valid(const circle::OperatorCode *opcode) +{ + circle::BuiltinOperator code = opcode->builtin_code(); + return (circle::BuiltinOperator_MIN <= code && code <= circle::BuiltinOperator_MAX); +} + +bool is_custom(const circle::OperatorCode *opcode) +{ + circle::BuiltinOperator code = opcode->builtin_code(); + return (code == circle::BuiltinOperator_CUSTOM); +} + +std::string opcode_name(const circle::OperatorCode *opcode) +{ + assert(opcode); + + if (!is_valid(opcode)) + { + std::ostringstream oss; + oss << "(invalid)"; + return oss.str(); + } + + if (is_custom(opcode)) + { + if (!opcode->custom_code()) + return "(invalid custom)"; + + std::string custom_op = "CUSTOM("; + custom_op += opcode->custom_code()->c_str(); + custom_op += ")"; + return custom_op; + } + + circle::BuiltinOperator code = opcode->builtin_code(); + return circle::EnumNameBuiltinOperator(code); +} + +const char *tensor_type(const circle::Tensor *tensor) +{ + return circle::EnumNameTensorType(tensor->type()); +} + +const char *tensor_name(const circle::Tensor *tensor) +{ + static const char *kEmptyTensorName = "(noname)"; + + auto name = tensor->name(); + if (name) + return name->c_str(); + + return kEmptyTensorName; +} + +Reader::Reader(const circle::Model *model) +{ + _subgraphs = model->subgraphs(); + _buffers = model->buffers(); + + auto opcodes = model->operator_codes(); + for (const ::circle::OperatorCode *opcode : *opcodes) + { + _op_codes.push_back(opcode); + } +} + +size_t Reader::buffer_info(uint32_t buf_idx, const uint8_t **buff_data) +{ + if (buff_data != nullptr) + { + *buff_data = nullptr; + } + + if (buf_idx == 0) + return 0; + + if (auto *buffer = (*_buffers)[buf_idx]) + { + if (auto *array = buffer->data()) + { + if (size_t size = array->size()) + { + if (buff_data != nullptr) + { + *buff_data = reinterpret_cast(array->data()); + } + return size; + } + } + } + + return 0; +} + +circle::BuiltinOperator Reader::builtin_code(const circle::Operator *op) const +{ + uint32_t index = op->opcode_index(); + assert(index < _op_codes.size()); + const circle::OperatorCode *opcode = _op_codes.at(index); + + return opcode->builtin_code(); +} + +std::string Reader::opcode_name(const circle::Operator *op) const +{ + uint32_t index = op->opcode_index(); + assert(index < _op_codes.size()); + const circle::OperatorCode *opcode = _op_codes.at(index); + + if (!is_valid(opcode)) + { + std::ostringstream oss; + oss << "(invalid: " << index << ")"; + return oss.str(); + } + + return circletensordump::opcode_name(opcode); +} + +bool Reader::select_subgraph(uint32_t sgindex) +{ + _tensors = nullptr; + _operators = nullptr; + + _inputs.clear(); + _outputs.clear(); + + if (_subgraphs->Length() <= sgindex) + { + assert(false); + return false; + } + + const circle::SubGraph *subgraph = (*_subgraphs)[sgindex]; + + _tensors = subgraph->tensors(); + _operators = subgraph->operators(); + + _inputs = as_index_vector(subgraph->inputs()); + _outputs = as_index_vector(subgraph->outputs()); + + return true; +} + +} // namespace circletensordump diff --git a/compiler/circle-tensordump/src/Reader.h b/compiler/circle-tensordump/src/Reader.h new file mode 100644 index 0000000..bbb0395 --- /dev/null +++ b/compiler/circle-tensordump/src/Reader.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_TENSORDUMP_READER_H__ +#define __CIRCLE_TENSORDUMP_READER_H__ + +#include + +#include +#include +#include + +namespace circletensordump +{ + +template std::vector as_index_vector(const flatbuffers::Vector *flat_array) +{ + std::vector ret(flat_array->Length()); + for (uint32_t i = 0; i < flat_array->Length(); i++) + { + ret[i] = flat_array->Get(i); + } + return ret; +} + +bool is_valid(const circle::OperatorCode *opcode); +bool is_custom(const circle::OperatorCode *opcode); +std::string opcode_name(const circle::OperatorCode *opcode); +const char *tensor_type(const circle::Tensor *tensor); +const char *tensor_name(const circle::Tensor *tensor); + +/** + * @brief Loads Circle file and provides helpers to access attributes + */ +class Reader +{ +private: + using CircleSubGraphs_t = flatbuffers::Vector>; + using CircleBuffers_t = flatbuffers::Vector>; + using CircleTensors_t = flatbuffers::Vector>; + using CircleOperators_t = flatbuffers::Vector>; + +public: + Reader(const circle::Model *model); + + Reader() = delete; + +public: + const std::vector &opcodes() { return _op_codes; } + const CircleBuffers_t *buffers() { return _buffers; } + const CircleTensors_t *tensors() { return _tensors; } + const CircleOperators_t *operators() { return _operators; } + const std::vector &inputs() const { return _inputs; } + const std::vector &outputs() const { return _outputs; } + + uint32_t num_subgraph() const { return _subgraphs->Length(); } + + size_t buffer_info(uint32_t buf_idx, const uint8_t **buff_data); + circle::BuiltinOperator builtin_code(const circle::Operator *op) const; + std::string opcode_name(const circle::Operator *op) const; + +public: + bool select_subgraph(uint32_t subgraph); + +private: + const CircleSubGraphs_t *_subgraphs{nullptr}; + const CircleBuffers_t *_buffers{nullptr}; + const CircleTensors_t *_tensors{nullptr}; + const CircleOperators_t *_operators{nullptr}; + + std::vector _op_codes; + std::vector _inputs; + std::vector _outputs; +}; + +} // namespace circletensordump + +#endif // __CIRCLE_TENSORDUMP_READER_H__ diff --git a/compiler/circle-verify/CMakeLists.txt b/compiler/circle-verify/CMakeLists.txt index 2e19951..f221748 100644 --- a/compiler/circle-verify/CMakeLists.txt +++ b/compiler/circle-verify/CMakeLists.txt @@ -6,7 +6,8 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(circle-verify ${SOURCES}) target_include_directories(circle-verify PRIVATE src) +target_link_libraries(circle-verify arser) target_link_libraries(circle-verify mio_circle) target_link_libraries(circle-verify safemain) target_link_libraries(circle-verify cwrap) -target_link_libraries(circle-verify stdex) +target_link_libraries(circle-verify foder) diff --git a/compiler/circle-verify/requires.cmake b/compiler/circle-verify/requires.cmake index 2509b69..e1b7fb2 100644 --- a/compiler/circle-verify/requires.cmake +++ b/compiler/circle-verify/requires.cmake @@ -1,4 +1,5 @@ +require("arser") require("mio-circle") require("safemain") require("cwrap") -require("stdex") +require("foder") diff --git a/compiler/circle-verify/src/Driver.cpp b/compiler/circle-verify/src/Driver.cpp index ad13e50..1af31d9 100644 --- a/compiler/circle-verify/src/Driver.cpp +++ b/compiler/circle-verify/src/Driver.cpp @@ -16,23 +16,31 @@ #include "VerifyFlatBuffers.h" -#include +#include #include +#include #include int entry(int argc, char **argv) { - if (argc != 2) + arser::Arser arser; + arser.add_argument("circle").type(arser::DataType::STR).help("Circle file path to verify"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [circle]" << std::endl; - return 255; + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; } - auto verifier = stdex::make_unique(); - std::string model_file = argv[argc - 1]; + auto verifier = std::make_unique(); + + std::string model_file = arser.get("circle"); std::cout << "[ RUN ] Check " << model_file << std::endl; diff --git a/compiler/circle-verify/src/Model.cpp b/compiler/circle-verify/src/Model.cpp deleted file mode 100644 index efac121..0000000 --- a/compiler/circle-verify/src/Model.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Model.h" - -#include - -#include -#include -#include -#include - -namespace -{ - -class MemoryMappedModel final : public ModelData -{ -public: - /** - * @require fd and data SHOULD be valid - */ - explicit MemoryMappedModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} - { - // DO NOTHING - } - -public: - ~MemoryMappedModel() - { - munmap(_data, _size); - close(_fd); - } - -public: - MemoryMappedModel(const MemoryMappedModel &) = delete; - MemoryMappedModel(MemoryMappedModel &&) = delete; - -public: - const void *data(void) const override { return _data; }; - const size_t size(void) const override { return _size; }; - -private: - int _fd = -1; - void *_data = nullptr; - size_t _size = 0; -}; - -} // namespace - -std::unique_ptr load_modeldata(const std::string &path) -{ - cwrap::Fildes fd(open(path.c_str(), O_RDONLY)); - - if (fd.get() == -1) - { - // Return nullptr on open failure - return nullptr; - } - - struct stat st; - if (fstat(fd.get(), &st) == -1) - { - // Return nullptr on fstat failure - return nullptr; - } - - auto size = st.st_size; - auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fd.get(), 0); - - if (data == MAP_FAILED) - { - // Return nullptr on mmap failure - return nullptr; - } - - return std::unique_ptr{new MemoryMappedModel(fd.release(), data, size)}; -} diff --git a/compiler/circle-verify/src/Model.h b/compiler/circle-verify/src/Model.h deleted file mode 100644 index e1bd839..0000000 --- a/compiler/circle-verify/src/Model.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MODEL_H__ -#define __MODEL_H__ - -#include -#include - -struct ModelData -{ - virtual ~ModelData() = default; - - virtual const void *data(void) const = 0; - virtual const size_t size(void) const = 0; -}; - -/** - * @brief Load Circle model (as a raw data) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_modeldata(const std::string &path); - -#endif // __MODEL_H__ diff --git a/compiler/circle-verify/src/VerifyFlatBuffers.cpp b/compiler/circle-verify/src/VerifyFlatBuffers.cpp index 36b1668..e8557d2 100644 --- a/compiler/circle-verify/src/VerifyFlatBuffers.cpp +++ b/compiler/circle-verify/src/VerifyFlatBuffers.cpp @@ -16,16 +16,16 @@ #include "VerifyFlatBuffers.h" -#include "Model.h" - +#include #include int VerifyFlatbuffers::run(const std::string &model_file) { - auto modeldata = load_modeldata(model_file); + foder::FileLoader fileLoader{model_file}; + std::vector modeldata = fileLoader.load(); - const uint8_t *data = reinterpret_cast(modeldata->data()); - flatbuffers::Verifier verifier{data, modeldata->size()}; + const uint8_t *data = reinterpret_cast(modeldata.data()); + flatbuffers::Verifier verifier{data, modeldata.size()}; if (!circle::VerifyModelBuffer(verifier)) { diff --git a/compiler/circle2circle-dredd-recipe-test/CMakeLists.txt b/compiler/circle2circle-dredd-recipe-test/CMakeLists.txt new file mode 100644 index 0000000..6663cb9 --- /dev/null +++ b/compiler/circle2circle-dredd-recipe-test/CMakeLists.txt @@ -0,0 +1,185 @@ +nnas_include(TargetRequire) + +unset(REQUIRED_TARGETS) +list(APPEND REQUIRED_TARGETS circlechef) +list(APPEND REQUIRED_TARGETS circle-inspect) +list(APPEND REQUIRED_TARGETS circle-verify) +list(APPEND REQUIRED_TARGETS circle2circle) +list(APPEND REQUIRED_TARGETS dredd_rule_lib) +list(APPEND REQUIRED_TARGETS tflchef) +list(APPEND REQUIRED_TARGETS tflite2circle) +TargetRequire_Return(${REQUIRED_TARGETS}) + +nncc_find_resource(TensorFlowLiteRecipes) +nncc_find_resource(CircleRecipes) + +set(TFLITE_RECIPE_REPO "${TensorFlowLiteRecipes_DIR}") +set(CIRCLE_RECIPE_REPO "${CircleRecipes_DIR}") +unset(RECIPE_REPO) + +set(TEST_RECIPE_FILENAME "test.recipe") +set(TEST_RULE_FILENAME "test.rule") + +unset(TEST_DEPS) +unset(TEST_NAMES) + +set(options "") +set(oneValueArgs "") +set(multiValueArgs PASS) + +macro(Add RECIPE) + if(NOT EXISTS "${TFLITE_RECIPE_REPO}/${RECIPE}/test.recipe") + if(NOT EXISTS "${CIRCLE_RECIPE_REPO}/${RECIPE}/test.recipe") + message(FATAL_ERROR "Missing recipe of '${RECIPE}' test") + else() + set(RECIPE_REPO ${CIRCLE_RECIPE_REPO}) + endif() + else() + set(RECIPE_REPO ${TFLITE_RECIPE_REPO}) + endif() + + if(NOT EXISTS "${RECIPE_REPO}/${RECIPE}/test.rule") + message(FATAL_ERROR "Missing rule of '${RECIPE}' test") + endif() + + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + unset(OPT_OPTIONS) + foreach(src ${ARG_PASS}) + # option = "--${src}" + list(APPEND OPT_OPTIONS "--${src}") + endforeach(src ${ARG_PASS}) + + set(RECIPE_FILE "${RECIPE}.recipe") + set(RECIPE_SOURCE_PATH "${RECIPE_REPO}/${RECIPE}/${TEST_RECIPE_FILENAME}") + set(RECIPE_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}") + + set(RULE_FILE "${RECIPE}.rule") + set(RULE_SOURCE_PATH "${RECIPE_REPO}/${RECIPE}/${TEST_RULE_FILENAME}") + set(RULE_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RULE_FILE}") + + set(TFLITE_FILE "${RECIPE}.tflite") + set(TFLITE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${TFLITE_FILE}") + + set(CIRCLE_FILE "${RECIPE}.circle") + set(CIRCLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CIRCLE_FILE}") + + set(OPT_CIRCLE_FILE "${RECIPE}.opt.circle") + set(OPT_CIRCLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${OPT_CIRCLE_FILE}") + + # Copy .recipe + add_custom_command(OUTPUT ${RECIPE_BINARY_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${RECIPE_SOURCE_PATH}" "${RECIPE_BINARY_PATH}" + DEPENDS ${RECIPE_SOURCE_PATH} + COMMENT "Generate ${RECIPE_FILE}" + ) + + # Copy .rule + add_custom_command(OUTPUT ${RULE_BINARY_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${RULE_SOURCE_PATH}" "${RULE_BINARY_PATH}" + DEPENDS ${RULE_SOURCE_PATH} + COMMENT "Generate ${RULE_FILE}" + ) + + if(${RECIPE_REPO} STREQUAL ${TFLITE_RECIPE_REPO}) + # Generate .tflite + add_custom_command(OUTPUT ${TFLITE_OUTPUT_PATH} + COMMAND $ ${RECIPE_BINARY_PATH} ${TFLITE_OUTPUT_PATH} + DEPENDS $ ${RECIPE_BINARY_PATH} + COMMENT "Generate ${TFLITE_FILE}" + ) + + # Generate .circle + add_custom_command(OUTPUT ${CIRCLE_OUTPUT_PATH} + COMMAND $ ${TFLITE_OUTPUT_PATH} ${CIRCLE_OUTPUT_PATH} + DEPENDS $ ${TFLITE_OUTPUT_PATH} + COMMENT "Generate ${CIRCLE_FILE}" + ) + + list(APPEND TEST_DEPS ${TFLITE_OUTPUT_PATH}) + else() + # Generate .circle + add_custom_command(OUTPUT ${CIRCLE_OUTPUT_PATH} + COMMAND $ ${RECIPE_BINARY_PATH} ${CIRCLE_OUTPUT_PATH} + DEPENDS $ ${RECIPE_BINARY_PATH} + COMMENT "Generate ${CIRCLE_FILE}" + ) + endif() + + # Generate optimized .circle + add_custom_command(OUTPUT ${OPT_CIRCLE_OUTPUT_PATH} + COMMAND $ ${OPT_OPTIONS} ${CIRCLE_OUTPUT_PATH} ${OPT_CIRCLE_OUTPUT_PATH} + DEPENDS $ ${CIRCLE_OUTPUT_PATH} + COMMENT "Generate ${OPT_CIRCLE_FILE}" + ) + + list(APPEND TEST_DEPS ${RECIPE_BINARY_PATH} ${RULE_BINARY_PATH} + ${CIRCLE_OUTPUT_PATH} ${OPT_CIRCLE_OUTPUT_PATH}) + list(APPEND TEST_NAMES ${RECIPE}) +endmacro(Add) + +# Read "test.lst" +include("test.lst") + +## +## Copy testall +## +set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh") +set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh") + +add_custom_command( + OUTPUT ${TEST_RUNNER} + COMMAND ${CMAKE_COMMAND} -E copy "${TEST_RUNNER_SOURCE}" "${TEST_RUNNER}" + DEPENDS ${TEST_RUNNER_SOURCE} + COMMENT "Generate test runner" +) + +list(APPEND TEST_DEPS "${TEST_RUNNER}") + +### +### Generate test.config +### +set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") + +add_custom_command( + OUTPUT ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_INSPECT_PATH=\"$\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_VERIFY_PATH=\"$\"' >> ${TEST_CONFIG} + DEPENDS + circle-inspect + circle-verify + COMMENT "Generate test configuration" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}") + +# +# copy rule-lib.sh (a library of shell script functions) +# + +# getting path for rule-lib.sh in dredd-rule-lib +get_target_property(DREDD_RULE_LIB_DIR dredd_rule_lib BINARY_DIR) + +set(RULE_LIB_SOURCE_PATH "${DREDD_RULE_LIB_DIR}/rule-lib.sh") +set(RULE_LIB_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/rule-lib.sh") + +add_custom_command( + OUTPUT ${RULE_LIB_BINARY_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${RULE_LIB_SOURCE_PATH}" "${RULE_LIB_BINARY_PATH}" + DEPENDS ${RULE_LIB_SOURCE_PATH} + COMMENT "Generate rule lib" +) + +list(APPEND TEST_DEPS "${RULE_LIB_BINARY_PATH}") + +# Generate dependencies +add_custom_target(circle2circle_dredd_recipe_test ALL DEPENDS ${TEST_DEPS}) + +# Run tests +add_test( + NAME circle2circle_dredd_recipe_test + COMMAND "${TEST_RUNNER}" + "${TEST_CONFIG}" + "${CMAKE_CURRENT_BINARY_DIR}" + ${TEST_NAMES} +) diff --git a/compiler/circle2circle-dredd-recipe-test/README.md b/compiler/circle2circle-dredd-recipe-test/README.md new file mode 100644 index 0000000..85140a8 --- /dev/null +++ b/compiler/circle2circle-dredd-recipe-test/README.md @@ -0,0 +1,21 @@ +# circle2circle-dredd-recipe-test + +It tests the non-functional conditions of the optimized circle binary resulting from circle2circle. + +This test basically refers to the _TensorFlowLiteRecipes_ resource. So you should add what you want to test to both of the resource and `test.lst`. + +## Example + +``` +# TensorFlowLiteRecipes +res/TensorFlowLiteRecipes/BatchMatMulV2_000 +├── test.recipe # What you want to test +└── test.rule # Non-functional conditions to be satisfied + +# test.lst +... +Add(BatchMatMulV2_000 PASS resolve_customop_batchmatmul) +... +``` + +For more information on the rules, see _dredd-rule-lib_ module. diff --git a/compiler/circle2circle-dredd-recipe-test/requires.cmake b/compiler/circle2circle-dredd-recipe-test/requires.cmake new file mode 100644 index 0000000..e4a5b71 --- /dev/null +++ b/compiler/circle2circle-dredd-recipe-test/requires.cmake @@ -0,0 +1,7 @@ +require("circlechef") +require("circle2circle") +require("circle-inspect") +require("circle-verify") +require("dredd-rule-lib") +require("tflchef") +require("tflite2circle") diff --git a/compiler/circle2circle-dredd-recipe-test/test.lst b/compiler/circle2circle-dredd-recipe-test/test.lst new file mode 100644 index 0000000..202f669 --- /dev/null +++ b/compiler/circle2circle-dredd-recipe-test/test.lst @@ -0,0 +1,20 @@ +## EXAMPLE +# +# Add(RECIPE_REPO PASS pass1 pass2 ...) +# +## SUPPORTED PASS +# +# fuse_instnorm +# resolve_customop_batchmatmul +# resolve_customop_matmul + +## TFLITE RECIPE + +Add(Net_InstanceNorm_001 PASS fuse_instnorm) +# Add(Net_InstanceNorm_002 PASS fuse_instnorm) +Add(BatchMatMulV2_000 PASS resolve_customop_batchmatmul) +Add(MatMul_000 PASS resolve_customop_matmul) + +## CIRCLE RECIPE + +Add(CircleBatchMatMul_000) diff --git a/compiler/circle2circle-dredd-recipe-test/testall.sh b/compiler/circle2circle-dredd-recipe-test/testall.sh new file mode 100755 index 0000000..33a2036 --- /dev/null +++ b/compiler/circle2circle-dredd-recipe-test/testall.sh @@ -0,0 +1,98 @@ +#!/bin/bash + +# Need at least 2 arguments +if [[ $# -lt 2 ]]; then + echo "USAGE: $0 ..." + echo + echo "ARGUMENTS:" + echo " [test.config path]" + echo " [WORKDIR]" + echo " [Prefix1]" + echo " [Prefix2]" + echo " ..." + exit 255 +fi + +CONFIG_PATH="$1"; shift +WORKDIR="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found circle-inspect: ${CIRCLE_INSPECT_PATH}" +echo "-- Found circle-verify: ${CIRCLE_VERIFY_PATH}" +echo "-- Found circle2circle: ${CIRCLE2CIRCLE_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [[ $# -ne 0 ]]; do + PREFIX="$1"; shift + + TESTED+=("${PREFIX}") + + PASSED_TAG="${PREFIX}.passed" + + rm -f "${PASSED_TAG}" + + cat > "${PREFIX}.log" <( + exec 2>&1 + + echo "-- Found tflite: ${PREFIX}.tflite" + + # Exit immediately if any command fails + set -e + # Show commands + set -x + + # + # Check if rule is satisfied + # + + # Note: turn off 'command printing'. Otherwise printing will be so messy + set +x + + # (COMPILED_FILE, INSPECT_PROG_PATH, VERIFY_PROG_PATH, ERROR_LOG) must be set for rule-lib.sh + COMPILED_FILE="${WORKDIR}/${PREFIX}.opt.circle" + INSPECT_PROG_PATH=${CIRCLE_INSPECT_PATH} + VERIFY_PROG_PATH=${CIRCLE_VERIFY_PATH} + ERROR_LOG="${PREFIX}.error" + + rm -f "${ERROR_LOG}" + + # in case error while running rule-lib.sh, prints error msg + trap 'echo "** ERROR **" ; cat "${ERROR_LOG}"' ERR + + source rule-lib.sh + source "${PREFIX}.rule" + + # unset + trap - ERR + set -x + + # At this point, the exit code of all commands is 0 + # If not 0, execution of this script ends because of "set -e" + touch "${PASSED_TAG}" + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$PREFIX") + else + FAILED+=("$PREFIX") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/circle2circle/CMakeLists.txt b/compiler/circle2circle/CMakeLists.txt index 6441799..7b2bf9b 100644 --- a/compiler/circle2circle/CMakeLists.txt +++ b/compiler/circle2circle/CMakeLists.txt @@ -5,18 +5,20 @@ list(REMOVE_ITEM SOURCES ${TESTS}) add_executable(circle2circle "${SOURCES}") target_include_directories(circle2circle PRIVATE include) target_include_directories(circle2circle PRIVATE src) +target_link_libraries(circle2circle foder) target_link_libraries(circle2circle nncc_common) target_link_libraries(circle2circle safemain) -target_link_libraries(circle2circle stdex) target_link_libraries(circle2circle oops) target_link_libraries(circle2circle hermes) target_link_libraries(circle2circle hermes_std) target_link_libraries(circle2circle loco) target_link_libraries(circle2circle mio_circle) +target_link_libraries(circle2circle luci_env) target_link_libraries(circle2circle luci_import) target_link_libraries(circle2circle luci_service) target_link_libraries(circle2circle luci_pass) target_link_libraries(circle2circle luci_export) +target_link_libraries(circle2circle arser) install(TARGETS circle2circle DESTINATION bin) @@ -29,14 +31,16 @@ nnas_find_package(GTest REQUIRED) GTest_AddTest(circle2circle_test ${TESTS} ${SOURCES}) target_include_directories(circle2circle_test PRIVATE include) target_include_directories(circle2circle_test PRIVATE src) +target_link_libraries(circle2circle_test foder) target_link_libraries(circle2circle_test nncc_common) -target_link_libraries(circle2circle_test stdex) target_link_libraries(circle2circle_test oops) target_link_libraries(circle2circle_test hermes) target_link_libraries(circle2circle_test hermes_std) target_link_libraries(circle2circle_test loco) target_link_libraries(circle2circle_test mio_circle) +target_link_libraries(circle2circle_test luci_env) target_link_libraries(circle2circle_test luci_import) target_link_libraries(circle2circle_test luci_service) target_link_libraries(circle2circle_test luci_pass) target_link_libraries(circle2circle_test luci_export) +target_link_libraries(circle2circle_test arser) diff --git a/compiler/circle2circle/README.md b/compiler/circle2circle/README.md index 7bc1b7f..3e94d25 100644 --- a/compiler/circle2circle/README.md +++ b/compiler/circle2circle/README.md @@ -1,3 +1,3 @@ # circle2circle -_circle2circle_ provides Circle optimizations and quantizations as executable tool +_circle2circle_ provides Circle optimizations as executable tool diff --git a/compiler/circle2circle/requires.cmake b/compiler/circle2circle/requires.cmake index 5b1e657..8cbb90d 100644 --- a/compiler/circle2circle/requires.cmake +++ b/compiler/circle2circle/requires.cmake @@ -1,10 +1,11 @@ +require("foder") require("loco") require("locop") require("logo-core") -require("stdex") require("safemain") require("mio-circle") require("oops") require("hermes") require("hermes-std") require("luci") +require("arser") diff --git a/compiler/circle2circle/src/Circle2Circle.cpp b/compiler/circle2circle/src/Circle2Circle.cpp index 781825f..6888d26 100644 --- a/compiler/circle2circle/src/Circle2Circle.cpp +++ b/compiler/circle2circle/src/Circle2Circle.cpp @@ -14,91 +14,145 @@ * limitations under the License. */ -#include "Model.h" #include "CircleExpContract.h" +#include + #include #include #include #include +#include -#include #include +#include #include #include -#include #include -using OptionHook = std::function; - using Algorithms = luci::CircleOptimizer::Options::Algorithm; - -void print_help(const char *progname) -{ - std::cerr << "USAGE: " << progname << " [options] input output" << std::endl; - std::cerr << " --fuse_instnorm : Enable FuseInstanceNormalization Pass" << std::endl; - std::cerr << std::endl; -} +using AlgorithmParameters = luci::CircleOptimizer::Options::AlgorithmParameters; int entry(int argc, char **argv) { - if (argc < 3) - { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - print_help(argv[0]); - return 255; - } - // Simple argument parser (based on map) - std::map argparse; luci::CircleOptimizer optimizer; auto options = optimizer.options(); - - // TODO merge this with help message - argparse["--fuse_instnorm"] = [&options](const char **) { - options->enable(Algorithms::FuseInstanceNorm); - return 0; - }; - - for (int n = 1; n < argc - 2; ++n) + auto settings = luci::UserSettings::settings(); + + arser::Arser arser("circle2circle provides circle model optimization and transformations"); + + arser.add_argument("--all").nargs(0).required(false).default_value(false).help( + "Enable all optimize options"); + + arser.add_argument("--fuse_bcq") + .nargs(0) + .required(false) + .default_value(false) + .help("This will fuse operators and apply Binary Coded Quantization"); + + arser.add_argument("--fuse_instnorm") + .nargs(0) + .required(false) + .default_value(false) + .help("This will fuse operators to InstanceNorm operator"); + + arser.add_argument("--resolve_customop_add") + .nargs(0) + .required(false) + .default_value(false) + .help("This will convert Custom(Add) to Add operator"); + + arser.add_argument("--resolve_customop_batchmatmul") + .nargs(0) + .required(false) + .default_value(false) + .help("This will convert Custom(BatchMatmul) to BatchMatmul operator"); + + arser.add_argument("--resolve_customop_matmul") + .nargs(0) + .required(false) + .default_value(false) + .help("This will convert Custom(Matmul) to Matmul operator"); + + arser.add_argument("--mute_warnings") + .nargs(0) + .required(false) + .default_value(false) + .help("This will turn off warning messages"); + + arser.add_argument("--disable_validation") + .nargs(0) + .required(false) + .default_value(false) + .help("This will turn off operator vaidations. May help input model investigation."); + + arser.add_argument("input").nargs(1).type(arser::DataType::STR).help("Input circle model"); + arser.add_argument("output").nargs(1).type(arser::DataType::STR).help("Output circle model"); + + try { - const std::string tag{argv[n]}; - auto it = argparse.find(tag); - if (it == argparse.end()) - { - std::cerr << "Option '" << tag << "' is not supported" << std::endl; - std::cerr << std::endl; - print_help(argv[0]); - return 255; - } + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 255; + } - n += it->second((const char **)&argv[n + 1]); + if (arser.get("--all")) + { + options->enable(Algorithms::FuseBCQ); + options->enable(Algorithms::FuseInstanceNorm); + options->enable(Algorithms::ResolveCustomOpAdd); + options->enable(Algorithms::ResolveCustomOpBatchMatMul); + options->enable(Algorithms::ResolveCustomOpMatMul); } + if (arser.get("--fuse_bcq")) + options->enable(Algorithms::FuseBCQ); + if (arser.get("--fuse_instnorm")) + options->enable(Algorithms::FuseInstanceNorm); + if (arser.get("--resolve_customop_add")) + options->enable(Algorithms::ResolveCustomOpAdd); + if (arser.get("--resolve_customop_batchmatmul")) + options->enable(Algorithms::ResolveCustomOpBatchMatMul); + if (arser.get("--resolve_customop_matmul")) + options->enable(Algorithms::ResolveCustomOpMatMul); + + if (arser.get("--mute_warnings")) + settings->set(luci::UserSettings::Key::MuteWarnings, true); + if (arser.get("--disable_validation")) + settings->set(luci::UserSettings::Key::DisableValidation, true); - std::string input_path = argv[argc - 2]; - std::string output_path = argv[argc - 1]; + std::string input_path = arser.get("input"); + std::string output_path = arser.get("output"); // Load model from the file - std::unique_ptr model = luci::load_model(input_path); - if (model == nullptr) + foder::FileLoader file_loader{input_path}; + std::vector model_data; + + try { - std::cerr << "ERROR: Failed to load '" << input_path << "'" << std::endl; - return 255; + model_data = file_loader.load(); } - - const circle::Model *input_model = model->model(); - if (input_model == nullptr) + catch (const std::runtime_error &err) { - std::cerr << "ERROR: Failed to read '" << input_path << "'" << std::endl; - return 255; + std::cerr << err.what() << std::endl; + return EXIT_FAILURE; + } + const circle::Model *circle_model = circle::GetModel(model_data.data()); + if (circle_model == nullptr) + { + std::cerr << "ERROR: Failed to load circle '" << input_path << "'" << std::endl; + return EXIT_FAILURE; } // Import from input Circle file luci::Importer importer; - auto module = importer.importModule(input_model); + auto module = importer.importModule(circle_model); for (size_t idx = 0; idx < module->size(); ++idx) { @@ -108,7 +162,10 @@ int entry(int argc, char **argv) optimizer.optimize(graph); if (!luci::validate(graph)) + { + std::cerr << "ERROR: Optimized graph is invalid" << std::endl; return 255; + } } // Export to output Circle file @@ -116,5 +173,11 @@ int entry(int argc, char **argv) CircleExpContract contract(module.get(), output_path); - return exporter.invoke(&contract) ? 0 : 255; + if (!exporter.invoke(&contract)) + { + std::cerr << "ERROR: Failed to export '" << output_path << "'" << std::endl; + return 255; + } + + return 0; } diff --git a/compiler/circle2circle/src/Circle2Circle.test.cpp b/compiler/circle2circle/src/Circle2Circle.test.cpp index 015358a..d8a3ed0 100644 --- a/compiler/circle2circle/src/Circle2Circle.test.cpp +++ b/compiler/circle2circle/src/Circle2Circle.test.cpp @@ -25,5 +25,5 @@ TEST(Circle2CircleTest, NoArg_NEG) ::testing::internal::CaptureStdout(); int result = entry(1, argv.argv()); - ASSERT_EQ(result, 255); + ASSERT_EQ(255, result); } diff --git a/compiler/circle2circle/src/Model.cpp b/compiler/circle2circle/src/Model.cpp deleted file mode 100644 index 20d55a1..0000000 --- a/compiler/circle2circle/src/Model.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Model.h" - -#include -#include - -#include -#include -#include - -namespace -{ - -class FileModel final : public luci::Model -{ -public: - explicit FileModel(const std::string &filename) : _filename(filename) {} - -public: - FileModel(const FileModel &) = delete; - FileModel(FileModel &&) = delete; - -public: - const ::circle::Model *model(void) override - { - std::ifstream file(_filename, std::ios::binary | std::ios::in); - if (!file.good()) - return nullptr; - - file.unsetf(std::ios::skipws); - - std::streampos fileSize; - file.seekg(0, std::ios::end); - fileSize = file.tellg(); - file.seekg(0, std::ios::beg); - - // reserve capacity - _data.reserve(fileSize); - - // read the data - file.read(_data.data(), fileSize); - if (file.fail()) - return nullptr; - - return ::circle::GetModel(_data.data()); - } - -private: - const std::string _filename; - std::vector _data; -}; - -} // namespace - -namespace luci -{ - -std::unique_ptr load_model(const std::string &path) -{ - return std::unique_ptr{new FileModel(path)}; -} - -} // namespace luci diff --git a/compiler/circlechef/CMakeLists.txt b/compiler/circlechef/CMakeLists.txt new file mode 100644 index 0000000..cba7d0a --- /dev/null +++ b/compiler/circlechef/CMakeLists.txt @@ -0,0 +1,21 @@ +nnas_find_package(Protobuf QUIET) + +if(NOT Protobuf_FOUND) + return() +endif(NOT Protobuf_FOUND) + +if(NOT TARGET mio_circle) + return() +endif(NOT TARGET mio_circle) + +# Recipe Parser +add_subdirectory(proto) +# Log +add_subdirectory(log) +# Core Library +add_subdirectory(core) +# Circle Library +add_subdirectory(circle) +# Tools +add_subdirectory(tools) +add_subdirectory(tests) diff --git a/compiler/circlechef/README.md b/compiler/circlechef/README.md new file mode 100644 index 0000000..1871a06 --- /dev/null +++ b/compiler/circlechef/README.md @@ -0,0 +1,8 @@ +# circlechef + +## What is circlechef? + +Do you need a circle model for testing? Ask it to _circlechef_. +Given a recipe, _circlechef_ will cook a circle model for you. + +**NOTE** _circlechef_ covers only what _tflchef_ does not cover. This is to support ops that exist only in circle shema, and other things can be made using _tflchef_ and _tflite2circle_. diff --git a/compiler/circlechef/circle/CMakeLists.txt b/compiler/circlechef/circle/CMakeLists.txt new file mode 100644 index 0000000..75165ad --- /dev/null +++ b/compiler/circlechef/circle/CMakeLists.txt @@ -0,0 +1,9 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_library(circlechef_circle STATIC ${SOURCES}) +target_include_directories(circlechef_circle PUBLIC include) +target_include_directories(circlechef_circle PRIVATE src) +target_link_libraries(circlechef_circle circlechef_proto) +target_link_libraries(circlechef_circle mio_circle) +target_link_libraries(circlechef_circle stdex) +target_link_libraries(circlechef_circle cwrap) diff --git a/compiler/circlechef/circle/include/circlechef/RecipeChef.h b/compiler/circlechef/circle/include/circlechef/RecipeChef.h new file mode 100644 index 0000000..d3cafa2 --- /dev/null +++ b/compiler/circlechef/circle/include/circlechef/RecipeChef.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RECIPE_CHEF_H__ +#define __RECIPE_CHEF_H__ + +#include +#include + +#include +#include + +namespace circlechef +{ + +/** + * @brief Create ModelRecipe from circle::Model + */ +std::unique_ptr generate_recipe(const circle::Model *model); + +/** + * @brief Write ModelRecipe to file with given name + */ +bool write_recipe(const std::string &filename, std::unique_ptr &recipe); + +} // namespace circlechef + +#endif // __RECIPE_CHEF_H__ diff --git a/compiler/circlechef/circle/src/CircleImport.cpp b/compiler/circlechef/circle/src/CircleImport.cpp new file mode 100644 index 0000000..e970fbc --- /dev/null +++ b/compiler/circlechef/circle/src/CircleImport.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleImport.h" + +#include "Convert.h" + +#include + +namespace circlechef +{ + +const char *kEmptyTensorName = "(noname)"; + +const char *tensor_type(const circle::Tensor *tensor) +{ + return circle::EnumNameTensorType(tensor->type()); +} + +const char *tensor_name(const circle::Tensor *tensor) +{ + auto name = tensor->name(); + if (name) + return name->c_str(); + return kEmptyTensorName; +} + +bool is_valid(const circle::OperatorCode *opcode) +{ + circle::BuiltinOperator code = opcode->builtin_code(); + return (circle::BuiltinOperator_MIN <= code && code <= circle::BuiltinOperator_MAX); +} + +bool is_custom(const circle::OperatorCode *opcode) +{ + circle::BuiltinOperator code = opcode->builtin_code(); + return (code == circle::BuiltinOperator_CUSTOM); +} + +CircleImport::CircleImport(const circle::Model *model) +{ + _subgraphs = model->subgraphs(); + _buffers = model->buffers(); + + auto opcodes = model->operator_codes(); + for (const ::circle::OperatorCode *opcode : *opcodes) + { + _op_codes.push_back(opcode); + } +} + +bool CircleImport::select_sub_graph(uint32_t sgindex) +{ + _tensors = nullptr; + _operators = nullptr; + _inputs.clear(); + _outputs.clear(); + + if (_subgraphs->Length() <= sgindex) + { + assert(false); + return false; + } + + const circle::SubGraph *subgraph = (*_subgraphs)[sgindex]; + + _tensors = subgraph->tensors(); + _operators = subgraph->operators(); + + _inputs = as_index_vector(subgraph->inputs()); + _outputs = as_index_vector(subgraph->outputs()); + + return true; +} + +circle::BuiltinOperator CircleImport::builtin_code(const circle::Operator *op) const +{ + uint32_t index = op->opcode_index(); + assert(index < _op_codes.size()); + const circle::OperatorCode *opcode = _op_codes.at(index); + + return opcode->builtin_code(); +} + +std::string CircleImport::opcode_name(const circle::Operator *op) const +{ + uint32_t index = op->opcode_index(); + assert(index < _op_codes.size()); + const circle::OperatorCode *opcode = _op_codes.at(index); + + if (!is_valid(opcode)) + { + std::ostringstream oss; + oss << "(invalid: " << index << ")"; + return oss.str(); + } + + if (is_custom(opcode)) + { + if (!opcode->custom_code()) + return "(invalid custom)"; + + return opcode->custom_code()->c_str(); + } + + circle::BuiltinOperator code = opcode->builtin_code(); + return EnumNameBuiltinOperator(code); +} + +size_t CircleImport::buffer_info(const circle::Tensor *tensor, const uint8_t **buff_data) +{ + *buff_data = nullptr; + + if (tensor->buffer() == 0) + return 0; + + if (auto *buffer = (*_buffers)[tensor->buffer()]) + { + if (auto *array = buffer->data()) + { + if (size_t size = array->size()) + { + *buff_data = reinterpret_cast(array->data()); + return size; + } + } + } + + return 0; +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/CircleImport.h b/compiler/circlechef/circle/src/CircleImport.h new file mode 100644 index 0000000..a8ef3ee --- /dev/null +++ b/compiler/circlechef/circle/src/CircleImport.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_IMPORT_H__ +#define __CIRCLE_IMPORT_H__ + +#include + +#include + +#include +#include + +namespace circlechef +{ + +using CircleSubGraphs_t = flatbuffers::Vector>; +using CircleTensors_t = flatbuffers::Vector>; +using CircleBuffers_t = flatbuffers::Vector>; +using CircleOperators_t = flatbuffers::Vector>; + +const char *tensor_type(const circle::Tensor *tensor); +const char *tensor_name(const circle::Tensor *tensor); +bool is_valid(const circle::OperatorCode *opcode); +bool is_custom(const circle::OperatorCode *opcode); + +/** + * @brief Loads TF lite file and provides helpers to access attributes + */ +class CircleImport +{ +public: + CircleImport(const circle::Model *model); + + CircleImport() = delete; + +public: + bool select_sub_graph(uint32_t subgraph); + +public: + const CircleBuffers_t *buffers() { return _buffers; } + const CircleTensors_t *tensors() { return _tensors; } + const CircleOperators_t *operators() { return _operators; } + const std::vector &inputs() const { return _inputs; } + const std::vector &outputs() const { return _outputs; } + + uint32_t num_subgraph() const { return _subgraphs->Length(); } + + circle::BuiltinOperator builtin_code(const circle::Operator *op) const; + std::string opcode_name(const circle::Operator *op) const; + size_t buffer_info(const circle::Tensor *tensor, const uint8_t **buff_data); + + /** + * @brief This will record the tensor by index, if it needs filler option, + * such as kernel, bias. + */ + void set_tensor_filler(uint32_t tensor_index) { _tensor_filler[tensor_index] = true; } + + /** + * @brief This will store int32 filler values such as reshape information for the tensor + */ + void set_tensor_filler(uint32_t tensor_index, std::vector &expvalues) + { + _tensor_filler_vint32[tensor_index] = expvalues; + } + + void set_tensor_filler(uint32_t tensor_index, std::vector &expvalues) + { + _tensor_filler_vfloat[tensor_index] = expvalues; + } + + /** + * @brief This will return true if the tensor by index, needs a filler option. + */ + bool get_tensor_filler(uint32_t tensor_index) + { + auto it = _tensor_filler.find(tensor_index); + if (it != _tensor_filler.end()) + { + return it->second; + } + return false; + } + + /** + * @brief This will return true if the tensor by index, needs a int array filler option. + */ + bool get_tensor_filler(uint32_t tensor_index, std::vector &expvalues) + { + auto it = _tensor_filler_vint32.find(tensor_index); + if (it != _tensor_filler_vint32.end()) + { + expvalues = it->second; + return true; + } + return false; + } + + bool get_tensor_filler(uint32_t tensor_index, std::vector &expvalues) + { + auto it = _tensor_filler_vfloat.find(tensor_index); + if (it != _tensor_filler_vfloat.end()) + { + expvalues = it->second; + return true; + } + return false; + } + +private: + const CircleSubGraphs_t *_subgraphs{nullptr}; + const CircleBuffers_t *_buffers{nullptr}; + const CircleTensors_t *_tensors{nullptr}; + const CircleOperators_t *_operators{nullptr}; + + std::vector _op_codes{}; + std::vector _inputs{}; + std::vector _outputs{}; + + std::map _tensor_filler{}; + std::map> _tensor_filler_vint32{}; + std::map> _tensor_filler_vfloat{}; +}; + +} // namespace circlechef + +#endif // __CIRCLE_IMPORT_H__ diff --git a/compiler/circlechef/circle/src/CircleOpChef.h b/compiler/circlechef/circle/src/CircleOpChef.h new file mode 100644 index 0000000..a3bcd97 --- /dev/null +++ b/compiler/circlechef/circle/src/CircleOpChef.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_CHEF_H__ +#define __CIRCLE_OP_CHEF_H__ + +#include + +#include + +#include "CircleImport.h" + +namespace circlechef +{ + +/** + * @brief Interface for each operators to build circlechef + */ +class CircleOpChef +{ +public: + virtual void filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const = 0; + virtual ::circlechef::Operation *build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const = 0; + virtual ~CircleOpChef() {} +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_CHEF_H__ diff --git a/compiler/circlechef/circle/src/CircleOpChefs.h b/compiler/circlechef/circle/src/CircleOpChefs.h new file mode 100644 index 0000000..6a0ce5d --- /dev/null +++ b/compiler/circlechef/circle/src/CircleOpChefs.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_CHEFS_H__ +#define __CIRCLE_OP_CHEFS_H__ + +// In alphabet order +#include "Op/BatchMatMul.h" +#include "Op/BCQFullyConnected.h" +#include "Op/BCQGather.h" +#include "Op/InstanceNorm.h" + +#endif // __CIRCLE_OP_CHEFS_H__ diff --git a/compiler/circlechef/circle/src/CircleOpRegistry.h b/compiler/circlechef/circle/src/CircleOpRegistry.h new file mode 100644 index 0000000..2bf1e19 --- /dev/null +++ b/compiler/circlechef/circle/src/CircleOpRegistry.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_REGISTRY_H__ +#define __CIRCLE_OP_REGISTRY_H__ + +#include "CircleOpChef.h" +#include "CircleOpChefs.h" + +#include + +namespace circlechef +{ + +/** + * @brief circlechef operator registry + */ +class CircleOpRegistry +{ +public: + /** + * @brief Returns registered CircleOpChef pointer for BuiltinOperator or + * nullptr if not registered + */ + const CircleOpChef *lookup(circle::BuiltinOperator op) const + { + if (_circleop_map.find(op) == _circleop_map.end()) + return nullptr; + + return _circleop_map.at(op).get(); + } + + static CircleOpRegistry &get() + { + static CircleOpRegistry me; + return me; + } + +private: + CircleOpRegistry() + { +#define REG_TFL_OP(OPCODE, CLASS) \ + _circleop_map[circle::BuiltinOperator_##OPCODE] = std::make_unique() + + REG_TFL_OP(BATCH_MATMUL, CircleOpBatchMatMul); + REG_TFL_OP(BCQ_FULLY_CONNECTED, CircleOpBCQFullyConnected); + REG_TFL_OP(BCQ_GATHER, CircleOpBCQGather); + REG_TFL_OP(INSTANCE_NORM, CircleOpInstanceNorm); +#undef REG_TFL_OP + } + +private: + std::map> _circleop_map; +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_REGISTRY_H__ diff --git a/compiler/circlechef/circle/src/Convert.cpp b/compiler/circlechef/circle/src/Convert.cpp new file mode 100644 index 0000000..77614d9 --- /dev/null +++ b/compiler/circlechef/circle/src/Convert.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Convert.h" + +namespace circlechef +{ + +circlechef::TensorType as_circlechef_type(const circle::TensorType type) +{ + switch (type) + { + case circle::TensorType_FLOAT32: + return circlechef::FLOAT32; + case circle::TensorType_INT32: + return circlechef::INT32; + case circle::TensorType_INT64: + return circlechef::INT64; + case circle::TensorType_UINT8: + return circlechef::UINT8; + case circle::TensorType_BOOL: + return circlechef::BOOL; + // TODO handle other types + // TensorType_FLOAT16 + // TensorType_STRING + // TensorType_INT16 + // TensorType_COMPLEX64 + default: + throw std::runtime_error{"unsupported tensor type"}; + } +} + +circlechef::Activation as_circlechef_activation(const circle::ActivationFunctionType type) +{ + switch (type) + { + case circle::ActivationFunctionType_NONE: + return circlechef::NONE; + case circle::ActivationFunctionType_RELU: + return circlechef::RELU; + case circle::ActivationFunctionType_RELU6: + return circlechef::RELU6; + // TODO handle other types + // ActivationFunctionType_RELU_N1_TO_1 + // ActivationFunctionType_TANH + // ActivationFunctionType_SIGN_BIT + default: + throw std::runtime_error{"unsupported activation type"}; + } +} + +circlechef::Padding as_circlechef_padding(const circle::Padding padding) +{ + switch (padding) + { + case circle::Padding_SAME: + return circlechef::SAME; + case circle::Padding_VALID: + return circlechef::VALID; + default: + throw std::runtime_error{"unsupported padding"}; + } +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/Convert.h b/compiler/circlechef/circle/src/Convert.h new file mode 100644 index 0000000..7842c4b --- /dev/null +++ b/compiler/circlechef/circle/src/Convert.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONVERT_H__ +#define __CONVERT_H__ + +#include + +#include + +namespace circlechef +{ + +circlechef::TensorType as_circlechef_type(const circle::TensorType type); +circlechef::Activation as_circlechef_activation(const circle::ActivationFunctionType type); +circlechef::Padding as_circlechef_padding(const circle::Padding padding); + +/** + * @brief extract buffer data to std::vector
+ */ +template std::vector
extract_buffer(const circle::Buffer *buffer) +{ + auto buffer_length = buffer->data()->size(); + auto num_elements = buffer_length / sizeof(DT); + std::vector
result(num_elements); + std::memcpy(result.data(), buffer->data()->data(), buffer_length); + return result; +} + +template std::vector as_index_vector(const flatbuffers::Vector *flat_array) +{ + if (flat_array == nullptr) + throw std::runtime_error("flat_array is nullptr"); + + std::vector ret(flat_array->Length()); + for (uint32_t i = 0; i < flat_array->Length(); i++) + { + ret[i] = flat_array->Get(i); + } + return ret; +} + +} // namespace circlechef + +#endif // __CONVERT_H__ diff --git a/compiler/circlechef/circle/src/Op/BCQFullyConnected.cpp b/compiler/circlechef/circle/src/Op/BCQFullyConnected.cpp new file mode 100644 index 0000000..0e85f39 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BCQFullyConnected.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BCQFullyConnected.h" + +#include "Convert.h" + +namespace circlechef +{ + +void CircleOpBCQFullyConnected::filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + + import->set_tensor_filler(inputs[1]); + import->set_tensor_filler(inputs[3]); + + const circle::Tensor *tensor2 = import->tensors()->Get(inputs[2]); + assert(tensor2->type() == circle::TensorType::TensorType_INT32); + const circle::Buffer *buffer2 = import->buffers()->Get(tensor2->buffer()); + auto vec2 = extract_buffer(buffer2); + import->set_tensor_filler(inputs[2], vec2); + + const circle::Tensor *tensor4 = import->tensors()->Get(inputs[4]); + assert(tensor4->type() == circle::TensorType::TensorType_INT32); + const circle::Buffer *buffer4 = import->buffers()->Get(tensor4->buffer()); + auto vec4 = extract_buffer(buffer4); + import->set_tensor_filler(inputs[4], vec4); +} + +circlechef::Operation *CircleOpBCQFullyConnected::build(const circle::Operator *op, + CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_BCQFullyConnectedOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("BCQFullyConnected"); + + auto op_options = operation->mutable_bcq_fully_connected_options(); + + op_options->set_weights_hidden_size(op_params->weights_hidden_size()); + op_options->set_activation(as_circlechef_activation(op_params->fused_activation_function())); + + return operation; +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/Op/BCQFullyConnected.h b/compiler/circlechef/circle/src/Op/BCQFullyConnected.h new file mode 100644 index 0000000..c0ea581 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BCQFullyConnected.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_BCQFULLYCONNECTED_H__ +#define __CIRCLE_OP_BCQFULLYCONNECTED_H__ + +#include "CircleOpChef.h" + +namespace circlechef +{ + +/** + * @brief circlechef operator builder for BCQFullyConnected + */ +class CircleOpBCQFullyConnected : public CircleOpChef +{ +public: + void filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; + circlechef::Operation *build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_BCQFULLYCONNECTED_H__ diff --git a/compiler/circlechef/circle/src/Op/BCQGather.cpp b/compiler/circlechef/circle/src/Op/BCQGather.cpp new file mode 100644 index 0000000..cde345a --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BCQGather.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BCQGather.h" + +#include "Convert.h" + +namespace circlechef +{ + +void CircleOpBCQGather::filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + + import->set_tensor_filler(inputs[0]); + + const circle::Tensor *tensor1 = import->tensors()->Get(inputs[1]); + assert(tensor1->type() == circle::TensorType::TensorType_INT32); + const circle::Buffer *buffer1 = import->buffers()->Get(tensor1->buffer()); + auto vec1 = extract_buffer(buffer1); + import->set_tensor_filler(inputs[1], vec1); + + const circle::Tensor *tensor2 = import->tensors()->Get(inputs[2]); + assert(tensor2->type() == circle::TensorType::TensorType_INT32); + const circle::Buffer *buffer2 = import->buffers()->Get(tensor2->buffer()); + auto vec2 = extract_buffer(buffer2); + import->set_tensor_filler(inputs[2], vec2); + + const circle::Tensor *tensor3 = import->tensors()->Get(inputs[3]); + assert(tensor3->type() == circle::TensorType::TensorType_INT32); + const circle::Buffer *buffer3 = import->buffers()->Get(tensor3->buffer()); + auto vec3 = extract_buffer(buffer3); + import->set_tensor_filler(inputs[3], vec3); +} + +circlechef::Operation *CircleOpBCQGather::build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_BCQGatherOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("BCQGather"); + + auto op_options = operation->mutable_bcq_gather_options(); + + op_options->set_input_hidden_size(op_params->input_hidden_size()); + op_options->set_axis(op_params->axis()); + + return operation; +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/Op/BCQGather.h b/compiler/circlechef/circle/src/Op/BCQGather.h new file mode 100644 index 0000000..0ff0405 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BCQGather.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_BCQGATHER_H__ +#define __CIRCLE_OP_BCQGATHER_H__ + +#include "CircleOpChef.h" + +namespace circlechef +{ + +/** + * @brief circlechef operator builder for BCQGather + */ +class CircleOpBCQGather : public CircleOpChef +{ +public: + void filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; + circlechef::Operation *build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_BCQGATHER_H__ diff --git a/compiler/circlechef/circle/src/Op/BatchMatMul.cpp b/compiler/circlechef/circle/src/Op/BatchMatMul.cpp new file mode 100644 index 0000000..bcf2188 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BatchMatMul.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMul.h" + +#include "Convert.h" + +namespace circlechef +{ + +void CircleOpBatchMatMul::filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +circlechef::Operation *CircleOpBatchMatMul::build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_BatchMatMulOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("BatchMatMul"); + + auto op_options = operation->mutable_batch_matmul_options(); + + op_options->set_adjoint_lhs(op_params->adjoint_lhs()); + op_options->set_adjoint_rhs(op_params->adjoint_rhs()); + + return operation; +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/Op/BatchMatMul.h b/compiler/circlechef/circle/src/Op/BatchMatMul.h new file mode 100644 index 0000000..3d40368 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/BatchMatMul.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_BATCHMATMUL_H__ +#define __CIRCLE_OP_BATCHMATMUL_H__ + +#include "CircleOpChef.h" + +namespace circlechef +{ + +/** + * @brief circlechef operator builder for batchmatmul + */ +class CircleOpBatchMatMul : public CircleOpChef +{ +public: + void filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; + circlechef::Operation *build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_BATCHMATMUL_H__ diff --git a/compiler/circlechef/circle/src/Op/InstanceNorm.cpp b/compiler/circlechef/circle/src/Op/InstanceNorm.cpp new file mode 100644 index 0000000..a1395a5 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/InstanceNorm.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "InstanceNorm.h" + +#include "Convert.h" + +namespace circlechef +{ + +void CircleOpInstanceNorm::filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + // index 1 and 2 maybe constant + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 3); + + import->set_tensor_filler(inputs[1]); // set gaussian filler + import->set_tensor_filler(inputs[2]); +} + +circlechef::Operation *CircleOpInstanceNorm::build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("InstanceNorm"); + + auto op_options = operation->mutable_instance_norm_options(); + + auto op_params = op->builtin_options_as_InstanceNormOptions(); + assert(op_params != nullptr); + + op_options->set_epsilon(op_params->epsilon()); + op_options->set_activation(as_circlechef_activation(op_params->fused_activation_function())); + + return operation; +} + +} // namespace circlechef diff --git a/compiler/circlechef/circle/src/Op/InstanceNorm.h b/compiler/circlechef/circle/src/Op/InstanceNorm.h new file mode 100644 index 0000000..9cb48e1 --- /dev/null +++ b/compiler/circlechef/circle/src/Op/InstanceNorm.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLE_OP_INSTANCE_NORM_H__ +#define __CIRCLE_OP_INSTANCE_NORM_H__ + +#include "CircleOpChef.h" + +namespace circlechef +{ + +/** + * @brief circlechef operator builder for INSTANCE_NORM + */ +class CircleOpInstanceNorm : public CircleOpChef +{ +public: + void filler(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; + circlechef::Operation *build(const circle::Operator *op, CircleImport *import, + circlechef::ModelRecipe *model_recipe) const override; +}; + +} // namespace circlechef + +#endif // __CIRCLE_OP_INSTANCE_NORM_H__ diff --git a/compiler/circlechef/circle/src/RecipeChef.cpp b/compiler/circlechef/circle/src/RecipeChef.cpp new file mode 100644 index 0000000..17ef1be --- /dev/null +++ b/compiler/circlechef/circle/src/RecipeChef.cpp @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "Convert.h" +#include "CircleImport.h" +#include "CircleOpChef.h" +#include "CircleOpChefs.h" +#include "CircleOpRegistry.h" + +#include +#include + +namespace circlechef +{ + +void set_inputs(CircleImport *import, circlechef::Operation *operation, const circle::Operator *op) +{ + auto tensors = import->tensors(); + const std::vector &inputs = as_index_vector(op->inputs()); + + for (auto input : inputs) + { + if (input == -1) + { + operation->add_input(""); + } + else + { + auto tensor = tensors->Get(input); + std::string name = tensor_name(tensor); + operation->add_input(name); + } + } +} + +void set_outputs(CircleImport *import, circlechef::Operation *operation, const circle::Operator *op) +{ + auto tensors = import->tensors(); + const std::vector &outputs = as_index_vector(op->outputs()); + + for (auto output : outputs) + { + auto tensor = tensors->Get(output); + std::string name = tensor_name(tensor); + operation->add_output(name); + } +} + +/** + * @brief This will build ModelRecipe from circle::Model + * First to check operand filler options by scanning all operators, + * then translate all operands and operators. + * Last will set network inputs and outputs. + */ +std::unique_ptr generate_recipe(const circle::Model *model) +{ + std::unique_ptr model_recipe{new ModelRecipe()}; + + CircleImport circle_import(model); + + assert(circle_import.num_subgraph() == 1); + circle_import.select_sub_graph(0); + + auto tensors = circle_import.tensors(); + auto buffers = circle_import.buffers(); + auto operators = circle_import.operators(); + + // operand fillers for adding all operators + for (uint32_t i = 0; i < operators->Length(); ++i) + { + const auto *op = operators->Get(i); + circle::BuiltinOperator builtincode = circle_import.builtin_code(op); + + if (const auto *graph_builder = CircleOpRegistry::get().lookup(builtincode)) + { + graph_builder->filler(op, &circle_import, model_recipe.get()); + } + else + { + std::string opcodename = circle_import.opcode_name(op); + throw std::runtime_error{"Not supported: " + opcodename}; + } + } + + // add all operands(tensors) + for (uint32_t i = 0; i < tensors->Length(); ++i) + { + auto tensor = tensors->Get(i); + + // check buffer + if (tensor->buffer() >= buffers->size()) + throw std::runtime_error{"file load failed"}; + + ::circlechef::Operand *operand = model_recipe->add_operand(); + + operand->set_name(tensor_name(tensor)); + operand->set_type(as_circlechef_type(tensor->type())); + + std::vector dims = as_index_vector(tensor->shape()); + ::circlechef::TensorShape *shape = operand->mutable_shape(); + for (auto dim : dims) + { + shape->add_dim(dim); + } + + // filler for weights, bias and so on + std::vector expvalues; + std::vector expfvalues; + if (circle_import.get_tensor_filler(i)) + { + circlechef::TensorFiller *filler = operand->mutable_filler(); + // Note: it is OK to use random weights for functionality validation + filler->set_tag("gaussian"); + filler->add_arg("0.0"); // average + filler->add_arg("0.1"); // standard deviation + } + else if (circle_import.get_tensor_filler(i, expvalues)) + { + circlechef::TensorFiller *filler = operand->mutable_filler(); + filler->set_tag("explicit"); + for (auto value : expvalues) + { + std::ostringstream ss; + ss << value; + filler->add_arg(ss.str()); + } + } + else if (circle_import.get_tensor_filler(i, expfvalues)) + { + circlechef::TensorFiller *filler = operand->mutable_filler(); + filler->set_tag("explicit"); + for (auto value : expfvalues) + { + std::ostringstream ss; + ss << value; + filler->add_arg(ss.str()); + } + } + + auto quant = tensor->quantization(); + if (quant != nullptr) + { + // Note: Calling 'operand->mutable_quant()' will create empty 'quant' node + // in the recipe file. We want this only when valid parameter exist. + if (quant->min() != nullptr && quant->min()->size() > 0) + { + circlechef::TensorQuantization *chef_quant = operand->mutable_quant(); + for (uint32_t idx = 0; idx < quant->min()->size(); ++idx) + chef_quant->add_min(quant->min()->Get(idx)); + } + if (quant->max() != nullptr && quant->max()->size() > 0) + { + circlechef::TensorQuantization *chef_quant = operand->mutable_quant(); + for (uint32_t idx = 0; idx < quant->max()->size(); idx++) + chef_quant->add_max(quant->max()->Get(idx)); + } + if (quant->scale() != nullptr && quant->scale()->size() > 0) + { + circlechef::TensorQuantization *chef_quant = operand->mutable_quant(); + for (uint32_t idx = 0; idx < quant->scale()->size(); ++idx) + chef_quant->add_scale(quant->scale()->Get(idx)); + } + if (quant->zero_point() != nullptr && quant->zero_point()->size() > 0) + { + circlechef::TensorQuantization *chef_quant = operand->mutable_quant(); + for (uint32_t idx = 0; idx < quant->zero_point()->size(); ++idx) + chef_quant->add_zero_point(quant->zero_point()->Get(idx)); + } + } + } + + // add all operators + for (uint32_t i = 0; i < operators->Length(); ++i) + { + const auto *op = operators->Get(i); + circle::BuiltinOperator builtincode = circle_import.builtin_code(op); + + if (const auto *graph_builder = CircleOpRegistry::get().lookup(builtincode)) + { + auto operation = graph_builder->build(op, &circle_import, model_recipe.get()); + + // common for all operators: inputs, outputs + set_inputs(&circle_import, operation, op); + set_outputs(&circle_import, operation, op); + } + else + { + std::string opcodename = circle_import.opcode_name(op); + throw std::runtime_error{"Not supported: " + opcodename}; + } + } + + // network inputs/outputs + const std::vector &inputs = circle_import.inputs(); + const std::vector &outputs = circle_import.outputs(); + + for (const auto input : inputs) + { + auto tensor = tensors->Get(input); + std::string name = tensor_name(tensor); + + model_recipe->add_input(name); + } + for (const auto output : outputs) + { + auto tensor = tensors->Get(output); + std::string name = tensor_name(tensor); + + model_recipe->add_output(name); + } + + return std::move(model_recipe); +} + +bool write_recipe(const std::string &filename, std::unique_ptr &recipe) +{ + std::fstream fo(filename, std::ios::binary | std::ios::out); + + if (!fo.is_open()) + { + throw std::runtime_error{"file store failed"}; + } + + // Note: SerializeToString() or SerializeToOstream() writes in binary mode + // DebugString() and Utf8DebugString() will print as a human readable text + fo << recipe->Utf8DebugString(); + + fo.close(); + + return true; +} + +} // namespace circlechef diff --git a/compiler/circlechef/core/CMakeLists.txt b/compiler/circlechef/core/CMakeLists.txt new file mode 100644 index 0000000..54b3ea5 --- /dev/null +++ b/compiler/circlechef/core/CMakeLists.txt @@ -0,0 +1,9 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_library(circlechef_core STATIC ${SOURCES}) +target_include_directories(circlechef_core PUBLIC include) +target_include_directories(circlechef_core PRIVATE src) +target_link_libraries(circlechef_core circlechef_proto) +target_link_libraries(circlechef_core circlechef_log) +target_link_libraries(circlechef_core mio_circle) +target_link_libraries(circlechef_core souschef) diff --git a/compiler/circlechef/core/include/circlechef/ModelChef.h b/compiler/circlechef/core/include/circlechef/ModelChef.h new file mode 100644 index 0000000..6432617 --- /dev/null +++ b/compiler/circlechef/core/include/circlechef/ModelChef.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __MODEL_CHEF_H__ +#define __MODEL_CHEF_H__ + +#include + +#include + +namespace circlechef +{ + +class GeneratedModel final +{ +public: + struct Impl + { + virtual ~Impl() = default; + + virtual const char *base(void) const = 0; + virtual size_t size(void) const = 0; + }; + +public: + GeneratedModel(std::unique_ptr &&impl) : _impl{std::move(impl)} + { + // DO NOTHING + } + +public: + const char *base(void) const { return _impl->base(); } + size_t size(void) const { return _impl->size(); } + +private: + std::unique_ptr _impl; +}; + +GeneratedModel cook(const ModelRecipe &model_recipe); + +} // namespace circlechef + +#endif // __MODEL_CHEF_H__ diff --git a/compiler/circlechef/core/src/Arguments.h b/compiler/circlechef/core/src/Arguments.h new file mode 100644 index 0000000..9fe7bbb --- /dev/null +++ b/compiler/circlechef/core/src/Arguments.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ARGUMENTS_H__ +#define __ARGUMENTS_H__ + +#include +#include + +/** + * @brief Read-only string sequence view + */ +struct Arguments +{ + virtual ~Arguments() = default; + + virtual uint32_t count(void) const = 0; + virtual const std::string &value(uint32_t n) const = 0; +}; + +#endif // __ARGUMENTS_H__ diff --git a/compiler/circlechef/core/src/Convert.cpp b/compiler/circlechef/core/src/Convert.cpp new file mode 100644 index 0000000..2db0a62 --- /dev/null +++ b/compiler/circlechef/core/src/Convert.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Convert.h" + +#include + +circle::Padding as_circle_padding(const circlechef::Padding &value) +{ + switch (value) + { + case circlechef::SAME: + return circle::Padding_SAME; + case circlechef::VALID: + return circle::Padding_VALID; + default: + break; + } + + throw std::runtime_error{"Unknown padding value"}; +} + +circle::ActivationFunctionType as_circle_activation(const circlechef::Activation &value) +{ + switch (value) + { + case circlechef::NONE: + return circle::ActivationFunctionType_NONE; + case circlechef::RELU: + return circle::ActivationFunctionType_RELU; + case circlechef::RELU6: + return circle::ActivationFunctionType_RELU6; + default: + break; + } + + throw std::runtime_error{"Unknown activation"}; +} + +circle::TensorType as_circle_tensortype(const circlechef::TensorType &value) +{ + switch (value) + { + case circlechef::FLOAT32: + return circle::TensorType_FLOAT32; + case circlechef::INT32: + return circle::TensorType_INT32; + case circlechef::UINT8: + return circle::TensorType_UINT8; + case circlechef::INT64: + return circle::TensorType_INT64; + case circlechef::BOOL: + return circle::TensorType_BOOL; + default: + break; + } + + throw std::runtime_error{"Unknown tensor type"}; +} diff --git a/compiler/circlechef/core/src/Convert.h b/compiler/circlechef/core/src/Convert.h new file mode 100644 index 0000000..766098d --- /dev/null +++ b/compiler/circlechef/core/src/Convert.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file Convert.h + * @brief This header declares various as_circle_TYPE functions + */ +#ifndef __CONVERT_H__ +#define __CONVERT_H__ + +#include +#include + +circle::Padding as_circle_padding(const circlechef::Padding &value); +circle::ActivationFunctionType as_circle_activation(const circlechef::Activation &value); +circle::TensorType as_circle_tensortype(const circlechef::TensorType &value); + +#endif // __CONVERT_H__ diff --git a/compiler/circlechef/core/src/ModelChef.cpp b/compiler/circlechef/core/src/ModelChef.cpp new file mode 100644 index 0000000..76aeacd --- /dev/null +++ b/compiler/circlechef/core/src/ModelChef.cpp @@ -0,0 +1,631 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "circlechef/ModelChef.h" +#include +#include + +#include "Convert.h" + +#include + +#include "OpChef.h" +#include "OpChefs.h" + +#include + +#include "Log.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace +{ + +using namespace souschef; + +template std::vector as_vector(const ::google::protobuf::RepeatedPtrField &field) +{ + std::vector res; + for (const auto &elem : field) + { + res.emplace_back(elem); + } + return res; +} + +template Dataset as_dataset(const ::google::protobuf::RepeatedPtrField &field) +{ + return Dataset(as_vector(field)); +} + +} // namespace + +namespace +{ + +template using Dims = std::vector; + +Dims as_dims(const circlechef::TensorShape &shape) +{ + std::vector res; + + for (auto &dim : shape.dim()) + { + res.emplace_back(static_cast(dim)); + } + + return res; +} + +int32_t element_count(const Dims &dims) +{ + return std::accumulate(dims.begin(), dims.end(), 1, std::multiplies()); +} + +} // namespace + +namespace +{ + +class GeneratedModelImpl final : public circlechef::GeneratedModel::Impl +{ +public: + GeneratedModelImpl(std::unique_ptr &&builder) + : _builder{std::move(builder)} + { + // DO NOTHING + } + +public: + const char *base(void) const override + { + // Return the base address of generated flatbuffer model + return reinterpret_cast(_builder->GetBufferPointer()); + } + +public: + size_t size(void) const override + { + // Return the size of generated flatbuffer model + return _builder->GetSize(); + } + +private: + std::unique_ptr _builder; +}; + +} // namespace + +namespace +{ + +struct DataChefRegistry final : public Registry +{ +}; + +DataChefRegistry &data_chef_registry(const circlechef::TensorType &type) +{ + static DataChefRegistry s32; + static DataChefRegistry s64; + static DataChefRegistry fp32; + static DataChefRegistry u8; + static DataChefRegistry boolean; + + switch (type) + { + case circlechef::INT32: + return s32; + case circlechef::INT64: + return s64; + case circlechef::FLOAT32: + return fp32; + case circlechef::UINT8: + return u8; + case circlechef::BOOL: + return boolean; + default: + break; + } + + throw std::runtime_error{"Unknown tensor type"}; +} + +struct OpChefRegistry final : public Registry +{ +}; + +OpChefRegistry &op_chef_registry(void) +{ + static OpChefRegistry registry; + return registry; +} + +/// @brief This will prepare a map of unique builtin codes in the model recipe +std::map +gather_builtincode_map(const ::circlechef::ModelRecipe &model_recipe) +{ + // Key and value of the map are BuiltinOperator and operator version + std::map builtin_map; + + for (const auto &operation : model_recipe.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == circle::BuiltinOperator_CUSTOM) + continue; + + // Various operation version is unified as the highest version among them + if (builtin_map.find(op_chef->code()) == builtin_map.end() || + builtin_map[op_chef->code()] < operation.version()) + builtin_map[op_chef->code()] = operation.version(); + } + + // Add ops used in Graphs(subgraphs) + for (int g = 0; g < model_recipe.graph_size(); ++g) + { + const auto &graph = model_recipe.graph(g); + for (const auto &operation : graph.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == circle::BuiltinOperator_CUSTOM) + continue; + + // Various operation version is unified as the highest version among them + if (builtin_map.find(op_chef->code()) == builtin_map.end() || + builtin_map[op_chef->code()] < operation.version()) + builtin_map[op_chef->code()] = operation.version(); + } + } + + return builtin_map; +} + +/// @brief This will prepare a set of unique custom codes in the mode recipe +std::set gather_customcode_set(const ::circlechef::ModelRecipe &model_recipe) +{ + std::set customcode_set; + for (const auto &operation : model_recipe.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == circle::BuiltinOperator_CUSTOM) + customcode_set.insert(operation.type()); + } + + // Add ops used in Graphs(subgraphs) + for (int g = 0; g < model_recipe.graph_size(); ++g) + { + const auto &graph = model_recipe.graph(g); + for (const auto &operation : graph.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == circle::BuiltinOperator_CUSTOM) + customcode_set.insert(operation.type()); + } + } + + return customcode_set; +} + +} // namespace + +namespace +{ + +struct CookParams +{ + std::vector> &buffer_vec; + std::vector> &code_vec; + std::vector> &subgraph_vec; + std::unique_ptr &flatbuffer_builder; + std::map &builtin_code_map; + std::string noname; +}; + +template void cook_graph(const T &graph, CookParams &cp) +{ + LOGGER(l); + + std::vector> &buffer_vec = cp.buffer_vec; + std::vector> &code_vec = cp.code_vec; + std::vector> &subgraph_vec = cp.subgraph_vec; + std::unique_ptr &flatbuffer_builder = cp.flatbuffer_builder; + std::map &builtin_code_map = cp.builtin_code_map; + + // Operand-related + std::vector> tensor_vec; + + // Operation-related + std::vector> operator_vec; + + // default name for graph + std::string graph_name = cp.noname; + if (graph.has_name()) + graph_name = graph.name(); + + // Tensor Name -> Tensor ID mapping (per Graph) + std::map symbol_table; + + auto lookup = [&symbol_table, &graph_name](const std::string &name) { + if (symbol_table.find(name) != symbol_table.end()) + return symbol_table.at(name); + else if (name == "") + return -1; // -1 in circle means that optional input tensor is empty. + else + { + std::string msg = "circlechef : input not found in " + graph_name + " graph"; + throw std::runtime_error(msg.c_str()); + } + }; + + int32_t buffer_start = buffer_vec.size(); + int32_t buffer_index = 0; + + // Create buffer(s) 1~n(I) for input(s) + const auto size_input = graph.input_size(); + for (int ci = 0; ci < size_input; ++ci) + { + circle::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } + // Create buffer(s) n(I)+1~n(I)+n(O) for output(s) + const auto size_output = graph.output_size(); + for (int co = 0; co < size_output; ++co) + { + circle::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } + + auto input_names = as_dataset(graph.input()).vectorize(); + auto output_names = as_dataset(graph.output()).vectorize(); + + for (const auto &operand : graph.operand()) + { + assert(operand.has_name()); + + assert(operand.has_type()); + + flatbuffers::Offset> shape; + std::vector dims; + if (operand.has_shape()) + { + dims = as_dims(operand.shape()); + shape = flatbuffer_builder->CreateVector(dims); + } + + auto name = flatbuffer_builder->CreateString(operand.name()); + + buffer_index = 0; + + // Create Buffer if filler is specified + if (operand.has_filler()) + { + const auto &filler = operand.filler(); + + assert(filler.has_tag()); + + auto args = ranged_arguments(filler.arg().begin(), filler.arg().end()); + auto chef = data_chef_registry(operand.type()).lookup(filler.tag()).create(args); + + assert(chef != nullptr); + + // Create Data + int32_t count = (element_count(dims) > 0) ? element_count(dims) : filler.arg_size(); + auto data_vec = chef->generate(count); + auto data = flatbuffer_builder->CreateVector(data_vec); + + // Create Buffer + circle::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_builder.add_data(data); + auto buffer = buffer_builder.Finish(); + + // Update Buffer Index & Vector + buffer_index = buffer_vec.size(); + buffer_vec.emplace_back(buffer); + } + else + { + // if this is input or output, assign to that buffer_index + int idx = 0; + for (auto it = input_names.begin(); it != input_names.end(); ++it, ++idx) + { + if (*it == operand.name()) + { + buffer_index = buffer_start + idx; + break; + } + } + if (buffer_index == 0) + { + idx = 0; + for (auto it = output_names.begin(); it != output_names.end(); ++it, ++idx) + { + if (*it == operand.name()) + { + buffer_index = buffer_start + size_input + idx; + break; + } + } + } + if (buffer_index == 0) + { + // we couldn't find the buffer; create an empty buffer for this tensor + buffer_index = buffer_vec.size(); + + circle::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } + } + assert(buffer_index != 0); + + flatbuffers::Offset quant_index; + + // Create QuantizationParameters if quant is specified + if (operand.has_quant()) + { + const auto &quant = operand.quant(); + + // Create each parameters + // NOTE if some parameters are not given, those will be set to default value + std::vector quant_max_vec(quant.max_size()); + std::vector quant_min_vec(quant.min_size()); + std::vector quant_scale_vec(quant.scale_size()); + std::vector quant_zero_point_vec(quant.zero_point_size()); + + for (uint32_t i = 0; i < quant.max_size(); ++i) + quant_max_vec.at(i) = quant.max(i); + for (uint32_t i = 0; i < quant.min_size(); ++i) + quant_min_vec.at(i) = quant.min(i); + for (uint32_t i = 0; i < quant.scale_size(); ++i) + quant_scale_vec.at(i) = quant.scale(i); + for (uint32_t i = 0; i < quant.zero_point_size(); ++i) + quant_zero_point_vec.at(i) = quant.zero_point(i); + + auto quant_max = flatbuffer_builder->CreateVector(quant_max_vec); + auto quant_min = flatbuffer_builder->CreateVector(quant_min_vec); + auto quant_scale = flatbuffer_builder->CreateVector(quant_scale_vec); + auto quant_zero_point = flatbuffer_builder->CreateVector(quant_zero_point_vec); + + // Create QuantizationParameters + circle::QuantizationParametersBuilder quant_builder{*flatbuffer_builder}; + quant_builder.add_max(quant_max); + quant_builder.add_min(quant_min); + quant_builder.add_scale(quant_scale); + quant_builder.add_zero_point(quant_zero_point); + + // Update QuantizationParameters Index + quant_index = quant_builder.Finish(); + } + + // Create Tensor + circle::TensorBuilder tensor_builder{*flatbuffer_builder}; + + tensor_builder.add_shape(shape); + tensor_builder.add_type(as_circle_tensortype(operand.type())); + tensor_builder.add_buffer(buffer_index); + tensor_builder.add_name(name); + if (operand.has_quant()) + tensor_builder.add_quantization(quant_index); + + // Append! + tensor_vec.emplace_back(tensor_builder.Finish()); + + // Update Tensor Name -> Tensor Index Map + int32_t tensor_index = symbol_table.size(); + const auto &tensor_name = operand.name(); + + INFO(l) << "Symbol [" << tensor_name << "] = Tensor " << tensor_index << std::endl; + + symbol_table[tensor_name] = tensor_index; + } + + // Create Operator + for (const auto &operation : graph.operation()) + { + assert(operation.has_type()); + + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + + // Create 'inputs' + std::vector input_vec = as_dataset(operation.input()).map(lookup).vectorize(); + auto inputs = flatbuffer_builder->CreateVector(input_vec); + + // Create 'outputs' + std::vector output_vec = as_dataset(operation.output()).map(lookup).vectorize(); + auto outputs = flatbuffer_builder->CreateVector(output_vec); + + // Create Option + auto options = op_chef->value(*flatbuffer_builder); + + // Create Custom option + auto circle_custom_options = op_chef->custom_value(*flatbuffer_builder); + + // Create Operator + circle::OperatorBuilder op_builder{*flatbuffer_builder}; + + // Get operator code index from builtin_code_map with assumption, order of + // builtin_code_map is same as that of code_vec + auto op_it = builtin_code_map.find(op_chef->code()); + assert(op_it != builtin_code_map.end()); + uint32_t opcode_index = std::distance(builtin_code_map.begin(), op_it); + + op_builder.add_opcode_index(opcode_index); + op_builder.add_inputs(inputs); + op_builder.add_outputs(outputs); + op_builder.add_builtin_options_type(op_chef->type()); + op_builder.add_builtin_options(options); + op_builder.add_custom_options(circle_custom_options); + op_builder.add_custom_options_format(circle::CustomOptionsFormat_FLEXBUFFERS); + // Append Operator + operator_vec.emplace_back(op_builder.Finish()); + } + + // Create network input/output vector + std::vector input_vec = as_dataset(graph.input()).map(lookup).vectorize(); + std::vector output_vec = as_dataset(graph.output()).map(lookup).vectorize(); + + // Create "SubGraph" arguments + auto tensors = flatbuffer_builder->CreateVector(tensor_vec); + auto inputs = flatbuffer_builder->CreateVector(input_vec); + auto outputs = flatbuffer_builder->CreateVector(output_vec); + auto operators = flatbuffer_builder->CreateVector(operator_vec); + auto name = flatbuffer_builder->CreateString(graph_name); + + circle::SubGraphBuilder subgraph_builder{*flatbuffer_builder}; + + subgraph_builder.add_tensors(tensors); + subgraph_builder.add_inputs(inputs); + subgraph_builder.add_outputs(outputs); + subgraph_builder.add_operators(operators); + subgraph_builder.add_name(name); + + subgraph_vec.emplace_back(subgraph_builder.Finish()); +} + +} // namespace + +namespace circlechef +{ + +/** + * @brief Generate a (in-memory) TensorFlow Lite model from a given model recipe + */ +GeneratedModel cook(const ::circlechef::ModelRecipe &model_recipe) +{ +// Initialize Op Chef Registry +#define OP_CHEF(NAME, FACTORY_CLASS) \ + op_chef_registry().add(#NAME, std::unique_ptr(new FACTORY_CLASS())); +#include "OpChef.def" +#undef OP_CHEF + +// Initialize Data Chef Registry +#define DATA_CHEF(TYPE, NAME, FACTORY_CLASS) \ + data_chef_registry(::circlechef::TYPE) \ + .add(#NAME, std::unique_ptr(new FACTORY_CLASS())); +#include +#undef DATA_CHEF + + // + // Create FlatBufferBuilder + // + auto flatbuffer_builder = + std::unique_ptr(new flatbuffers::FlatBufferBuilder(1024)); + + // Operand-related + std::vector> buffer_vec; + + // Operation-related + std::vector> code_vec; + + // Graphs-related + std::vector> subgraph_vec; + + // Create OperatorCode with Builtin Operator + std::map builtin_code_map = + gather_builtincode_map(model_recipe); + for (auto const &opcode : builtin_code_map) + { + circle::OperatorCodeBuilder code_builder{*flatbuffer_builder}; + code_builder.add_builtin_code(opcode.first); + code_builder.add_version(opcode.second); + auto code = code_builder.Finish(); + // Update OperatorCode vector + code_vec.emplace_back(code); + } + + // Create OperatorCode with Custom Operator + std::set custom_code_set = gather_customcode_set(model_recipe); + if (custom_code_set.size() && + builtin_code_map.find(circle::BuiltinOperator_CUSTOM) == builtin_code_map.end()) + builtin_code_map[circle::BuiltinOperator_CUSTOM] = 1; + + for (auto opcode : custom_code_set) + { + auto custom_code = flatbuffer_builder->CreateString(opcode); + circle::OperatorCodeBuilder code_builder{*flatbuffer_builder}; + code_builder.add_builtin_code(circle::BuiltinOperator_CUSTOM); + code_builder.add_custom_code(custom_code); + auto code = code_builder.Finish(); + // Update OperatorCode vector + code_vec.emplace_back(code); + } + + // Create an Empty Buffer + // + // Buffer 0 SHOULD be an empty buffer in TensorFlow Lite model file + // (Please refer to the comment for Tensor.buffer field in schema) + { + circle::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } + + // + // Create Main graph + // + CookParams cp{buffer_vec, code_vec, subgraph_vec, flatbuffer_builder, builtin_code_map, "main"}; + + cook_graph<::circlechef::ModelRecipe>(model_recipe, cp); + + // + // Create subgraphs if exist + // + for (int g = 0; g < model_recipe.graph_size(); ++g) + { + const auto &graph = model_recipe.graph(g); + + std::ostringstream stringStream; + stringStream << "sub_" << (g + 1); + + CookParams cp{buffer_vec, code_vec, subgraph_vec, + flatbuffer_builder, builtin_code_map, stringStream.str()}; + + cook_graph<::circlechef::Graph>(graph, cp); + } + + // Create "Model" arguments + auto buffers = flatbuffer_builder->CreateVector(buffer_vec); + auto operator_codes = flatbuffer_builder->CreateVector(code_vec); + auto subgraphs = flatbuffer_builder->CreateVector(subgraph_vec); + auto description = flatbuffer_builder->CreateString("Generated by circlechef"); + + // Create "Model" + circle::ModelBuilder model_builder{*flatbuffer_builder}; + + model_builder.add_version(3); + model_builder.add_operator_codes(operator_codes); + model_builder.add_subgraphs(subgraphs); + model_builder.add_description(description); + model_builder.add_buffers(buffers); + + auto model = model_builder.Finish(); + + // Finalize + ::circle::FinishModelBuffer(*flatbuffer_builder, model); + + // Return "GenerateModel" + return GeneratedModel{ + std::unique_ptr(new GeneratedModelImpl(std::move(flatbuffer_builder)))}; +} + +} // namespace circlechef diff --git a/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp b/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp new file mode 100644 index 0000000..4c82c52 --- /dev/null +++ b/compiler/circlechef/core/src/Op/BCQFullyConnected.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BCQFullyConnected.h" + +#include "Convert.h" + +flatbuffers::Offset BCQFullyConnectedChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_bcq_fully_connected_options()); + + circle::BCQFullyConnectedOptionsBuilder bcq_fully_connected_options_builder{fbb}; + bcq_fully_connected_options_builder.add_weights_hidden_size( + operation.bcq_fully_connected_options().weights_hidden_size()); + bcq_fully_connected_options_builder.add_fused_activation_function( + as_circle_activation(operation.bcq_fully_connected_options().activation())); + + return bcq_fully_connected_options_builder.Finish().Union(); +} + +std::unique_ptr +BCQFullyConnectedChefFactory::create(const circlechef::Operation *operation) const +{ + return std::unique_ptr{new BCQFullyConnectedChef{operation}}; +} diff --git a/compiler/circlechef/core/src/Op/BCQFullyConnected.h b/compiler/circlechef/core/src/Op/BCQFullyConnected.h new file mode 100644 index 0000000..41e6b53 --- /dev/null +++ b/compiler/circlechef/core/src/Op/BCQFullyConnected.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_BCQFULLYCONNECTED_H__ +#define __OP_BCQFULLYCONNECTED_H__ + +#include "OpChef.h" + +class BCQFullyConnectedChef final : public OpChef +{ +public: + explicit BCQFullyConnectedChef(const circlechef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + circle::BuiltinOperator code(void) const override + { + return circle::BuiltinOperator_BCQ_FULLY_CONNECTED; + } + + circle::BuiltinOptions type(void) const override + { + return circle::BuiltinOptions_BCQFullyConnectedOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const circlechef::Operation *_operation; +}; + +struct BCQFullyConnectedChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const circlechef::Operation *operation) const override; +}; + +#endif // __OP_BCQFULLYCONNECTED_H__ diff --git a/compiler/circlechef/core/src/Op/BCQGather.cpp b/compiler/circlechef/core/src/Op/BCQGather.cpp new file mode 100644 index 0000000..08f6f61 --- /dev/null +++ b/compiler/circlechef/core/src/Op/BCQGather.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BCQGather.h" + +flatbuffers::Offset BCQGatherChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_bcq_gather_options()); + + circle::BCQGatherOptionsBuilder bcq_gather_options_builder{fbb}; + bcq_gather_options_builder.add_input_hidden_size( + operation.bcq_gather_options().input_hidden_size()); + bcq_gather_options_builder.add_axis(operation.bcq_gather_options().axis()); + + return bcq_gather_options_builder.Finish().Union(); +} + +std::unique_ptr BCQGatherChefFactory::create(const circlechef::Operation *operation) const +{ + return std::unique_ptr{new BCQGatherChef{operation}}; +} diff --git a/compiler/circlechef/core/src/Op/BCQGather.h b/compiler/circlechef/core/src/Op/BCQGather.h new file mode 100644 index 0000000..24a797a --- /dev/null +++ b/compiler/circlechef/core/src/Op/BCQGather.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_BCQGATHER_H__ +#define __OP_BCQGATHER_H__ + +#include "OpChef.h" + +class BCQGatherChef final : public OpChef +{ +public: + explicit BCQGatherChef(const circlechef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + circle::BuiltinOperator code(void) const override { return circle::BuiltinOperator_BCQ_GATHER; } + + circle::BuiltinOptions type(void) const override + { + return circle::BuiltinOptions_BCQGatherOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const circlechef::Operation *_operation; +}; + +struct BCQGatherChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const circlechef::Operation *operation) const override; +}; + +#endif // __OP_BCQGATHER_H__ diff --git a/compiler/circlechef/core/src/Op/BatchMatMul.cpp b/compiler/circlechef/core/src/Op/BatchMatMul.cpp new file mode 100644 index 0000000..d98c080 --- /dev/null +++ b/compiler/circlechef/core/src/Op/BatchMatMul.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMul.h" + +flatbuffers::Offset BatchMatMulChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_batch_matmul_options()); + + circle::BatchMatMulOptionsBuilder batch_matmul_options_options_builder{fbb}; + batch_matmul_options_options_builder.add_adjoint_lhs( + operation.batch_matmul_options().adjoint_lhs()); + batch_matmul_options_options_builder.add_adjoint_rhs( + operation.batch_matmul_options().adjoint_rhs()); + + return batch_matmul_options_options_builder.Finish().Union(); +} + +std::unique_ptr BatchMatMulChefFactory::create(const circlechef::Operation *operation) const +{ + return std::unique_ptr{new BatchMatMulChef{operation}}; +} diff --git a/compiler/circlechef/core/src/Op/BatchMatMul.h b/compiler/circlechef/core/src/Op/BatchMatMul.h new file mode 100644 index 0000000..fbb411e --- /dev/null +++ b/compiler/circlechef/core/src/Op/BatchMatMul.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_BATCH_MATMUL_H__ +#define __OP_BATCH_MATMUL_H__ + +#include "OpChef.h" + +class BatchMatMulChef final : public OpChef +{ +public: + explicit BatchMatMulChef(const circlechef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + circle::BuiltinOperator code(void) const override { return circle::BuiltinOperator_BATCH_MATMUL; } + + circle::BuiltinOptions type(void) const override + { + return circle::BuiltinOptions_BatchMatMulOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const circlechef::Operation *_operation; +}; + +struct BatchMatMulChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const circlechef::Operation *operation) const override; +}; + +#endif // __OP_BATCH_MATMUL_H__ diff --git a/compiler/circlechef/core/src/Op/InstanceNorm.cpp b/compiler/circlechef/core/src/Op/InstanceNorm.cpp new file mode 100644 index 0000000..115ecef --- /dev/null +++ b/compiler/circlechef/core/src/Op/InstanceNorm.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "InstanceNorm.h" + +#include "Convert.h" + +flatbuffers::Offset InstanceNormChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_instance_norm_options()); + auto circle_activation = as_circle_activation(operation.instance_norm_options().activation()); + + circle::InstanceNormOptionsBuilder options_builder{fbb}; + options_builder.add_epsilon(operation.instance_norm_options().epsilon()); + options_builder.add_fused_activation_function(circle_activation); + + return options_builder.Finish().Union(); +} + +std::unique_ptr +InstanceNormChefFactory::create(const circlechef::Operation *operation) const +{ + return std::unique_ptr{new InstanceNormChef{operation}}; +} diff --git a/compiler/circlechef/core/src/Op/InstanceNorm.h b/compiler/circlechef/core/src/Op/InstanceNorm.h new file mode 100644 index 0000000..f36b5d7 --- /dev/null +++ b/compiler/circlechef/core/src/Op/InstanceNorm.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_INSTANCE_NORM_H__ +#define __OP_INSTANCE_NORM_H__ + +#include "OpChef.h" + +class InstanceNormChef final : public OpChef +{ +public: + explicit InstanceNormChef(const circlechef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + circle::BuiltinOperator code(void) const override + { + return circle::BuiltinOperator_INSTANCE_NORM; + } + + circle::BuiltinOptions type(void) const override + { + return circle::BuiltinOptions_InstanceNormOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const circlechef::Operation *_operation; +}; + +struct InstanceNormChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const circlechef::Operation *operation) const override; +}; + +#endif // __OP_INSTANCE_NORM_H__ diff --git a/compiler/circlechef/core/src/OpChef.def b/compiler/circlechef/core/src/OpChef.def new file mode 100644 index 0000000..3128d3b --- /dev/null +++ b/compiler/circlechef/core/src/OpChef.def @@ -0,0 +1,10 @@ +#ifndef OP_CHEF +#error "Define OP first" +#endif // OP_CHEF + +// Please keep the list in alphabetical order +// OP_CHEF(NAME, FACTORY_CLASS) +OP_CHEF(BatchMatMul, BatchMatMulChefFactory) +OP_CHEF(BCQFullyConnected, BCQFullyConnectedChefFactory) +OP_CHEF(BCQGather, BCQGatherChefFactory) +OP_CHEF(InstanceNorm, InstanceNormChefFactory) diff --git a/compiler/circlechef/core/src/OpChef.h b/compiler/circlechef/core/src/OpChef.h new file mode 100644 index 0000000..3479e51 --- /dev/null +++ b/compiler/circlechef/core/src/OpChef.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_CHEF_H__ +#define __OP_CHEF_H__ + +#include +#include + +#include + +struct OpChef +{ + virtual ~OpChef() = default; + + virtual circle::BuiltinOperator code(void) const = 0; + virtual circle::BuiltinOptions type(void) const = 0; + virtual flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const = 0; + + // TODO Find a way to place this method in a better place + virtual flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const + { + return flatbuffers::Offset>(); + } +}; + +struct OpChefFactory +{ + virtual ~OpChefFactory() = default; + + virtual std::unique_ptr create(const circlechef::Operation *operation) const = 0; +}; + +#endif // __OP_CHEF_H__ diff --git a/compiler/circlechef/core/src/OpChefs.h b/compiler/circlechef/core/src/OpChefs.h new file mode 100644 index 0000000..e13c5e0 --- /dev/null +++ b/compiler/circlechef/core/src/OpChefs.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_CHEFS_H__ +#define __OP_CHEFS_H__ + +#include "Op/BatchMatMul.h" +#include "Op/BCQFullyConnected.h" +#include "Op/BCQGather.h" +#include "Op/InstanceNorm.h" + +#endif // __OP_CHEFS_H__ diff --git a/compiler/circlechef/log/CMakeLists.txt b/compiler/circlechef/log/CMakeLists.txt new file mode 100644 index 0000000..6527ca7 --- /dev/null +++ b/compiler/circlechef/log/CMakeLists.txt @@ -0,0 +1,7 @@ +# TODO Find how to test logging framework +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_library(circlechef_log STATIC ${SOURCES}) +target_include_directories(circlechef_log PUBLIC include) +target_link_libraries(circlechef_log PUBLIC hermes) +target_link_libraries(circlechef_log PRIVATE hermes_std) diff --git a/compiler/circlechef/log/include/Log.h b/compiler/circlechef/log/include/Log.h new file mode 100644 index 0000000..ef00b26 --- /dev/null +++ b/compiler/circlechef/log/include/Log.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLECHEF_LOG_H__ +#define __CIRCLECHEF_LOG_H__ + +#include + +namespace circlechef +{ + +/** + * @brief Logger Implementation + */ +class Logger final : public hermes::Source +{ +public: + Logger(hermes::Context *ctx); + ~Logger(); +}; + +/** + * @brief Logger Configuration + * + * Users are able to turn logging on/off via CIRCLECHEF_LOG environment variable. + */ +class LoggerConfig final : public hermes::Config +{ +public: + LoggerConfig(); + +public: + void configure(const hermes::Source *, hermes::Source::Setting &) const final; + void configure(const Logger *, hermes::Source::Setting &) const; + +private: + bool _enabled; +}; + +} // namespace circlechef + +#include "LoggingContext.h" + +/** + * HOW TO USE: + * + * LOGGER(l); + * + * INFO(l) << "Hello, World" << std::endl; + * + */ +#define LOGGER(name) ::circlechef::Logger name{::circlechef::LoggingContext::get()}; + +// TODO Support FATAL, ERROR, WARN, and VERBOSE +#define INFO(name) HERMES_INFO(name) + +// WARNING! +// +// THE CURRENT IMPLEMENTATION IS NOT THREAD SAFE. +// + +#endif // __CIRCLECHEF_LOG_H__ diff --git a/compiler/circlechef/log/include/LoggingContext.h b/compiler/circlechef/log/include/LoggingContext.h new file mode 100644 index 0000000..1282cfd --- /dev/null +++ b/compiler/circlechef/log/include/LoggingContext.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CIRCLECHEF_LOGGING_CONTEXT_H__ +#define __CIRCLECHEF_LOGGING_CONTEXT_H__ + +#include + +namespace circlechef +{ + +/** + * @brief Global logging context + */ +struct LoggingContext +{ + static hermes::Context *get(void); +}; + +} // namespace circlechef + +#endif // __CIRCLECHEF_LOGGING_CONTEXT_H__ diff --git a/compiler/circlechef/log/src/Log.cpp b/compiler/circlechef/log/src/Log.cpp new file mode 100644 index 0000000..11a60fb --- /dev/null +++ b/compiler/circlechef/log/src/Log.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Log.h" + +#include +#include +#include + +// TODO Extract these lexical conversion routines as a library +namespace +{ + +/** + * @brief Convert C-string as a value of type T + * + * safecast(s, v) returns v if s is nullptr. + */ +template T safecast(const char *, const T &); + +template <> bool safecast(const char *s, const bool &value) +{ + return (s == nullptr) ? value : (std::stoi(s) != 0); +} + +} // namespace + +// +// Logger +// +namespace circlechef +{ + +Logger::Logger(hermes::Context *ctx) { activate(ctx->sources(), ctx->bus()); } +Logger::~Logger() { deactivate(); } + +} // namespace circlechef + +// +// LoggerConfig +// +namespace circlechef +{ + +LoggerConfig::LoggerConfig() +{ + // Turn on logging if CIRCLECHEF_LOG is set as non-zero value + _enabled = safecast(std::getenv("CIRCLECHEF_LOG"), false); +} + +void LoggerConfig::configure(const hermes::Source *source, hermes::Source::Setting &setting) const +{ + // Let's ignore hermes::Sources if that is not a moco logger + if (auto logger = dynamic_cast(source)) + { + configure(logger, setting); + } +} + +void LoggerConfig::configure(const Logger *, hermes::Source::Setting &setting) const +{ + if (_enabled) + { + // Enable all catagories + setting.accept_all(); + } + else + { + // Disable all catagories + setting.reject_all(); + } +} + +} // namespace circlechef diff --git a/compiler/circlechef/log/src/LoggingContext.cpp b/compiler/circlechef/log/src/LoggingContext.cpp new file mode 100644 index 0000000..b64bd3f --- /dev/null +++ b/compiler/circlechef/log/src/LoggingContext.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LoggingContext.h" +#include "Log.h" + +#include + +#include + +namespace circlechef +{ + +hermes::Context *LoggingContext::get(void) +{ + static hermes::Context *ctx = nullptr; + + if (ctx == nullptr) + { + ctx = new hermes::Context; + ctx->sinks()->append(std::make_unique()); + ctx->config(std::make_unique()); + } + + return ctx; +} + +} // namespace circlechef diff --git a/compiler/circlechef/proto/CMakeLists.txt b/compiler/circlechef/proto/CMakeLists.txt new file mode 100644 index 0000000..3cc26de --- /dev/null +++ b/compiler/circlechef/proto/CMakeLists.txt @@ -0,0 +1,5 @@ +Protobuf_Generate(CIRCLECHEF_PROTO "${CMAKE_CURRENT_BINARY_DIR}/generated" "${CMAKE_CURRENT_SOURCE_DIR}" "circlechef.proto") + +add_library(circlechef_proto STATIC ${CIRCLECHEF_PROTO_SOURCES}) +target_include_directories(circlechef_proto PUBLIC ${CIRCLECHEF_PROTO_INCLUDE_DIRS}) +target_link_libraries(circlechef_proto libprotobuf) diff --git a/compiler/circlechef/proto/circlechef.proto b/compiler/circlechef/proto/circlechef.proto new file mode 100644 index 0000000..b8c009b --- /dev/null +++ b/compiler/circlechef/proto/circlechef.proto @@ -0,0 +1,110 @@ +syntax = "proto2"; + +package circlechef; + +// +// Initial version +// - Our initial version +// +// Version 1 +// - Backward compatible with Initial version +// - Added Graph to represent sub graphs +// - Added name, version(default as 1), graph in ModelRecipe +// + +// This enum value corresponds to TensorType in TensorFlow Lite schema +enum TensorType { + FLOAT32 = 0; + INT32 = 2; + UINT8 = 3; + INT64 = 4; + BOOL = 6; +} + +message TensorShape { + repeated uint32 dim = 3; +} + +message TensorFiller { + optional string tag = 1; + repeated string arg = 2; +} + +message TensorQuantization { + repeated float min = 1; + repeated float max = 2; + repeated float scale = 3; + repeated int64 zero_point = 4; +} + +message Operand { + optional string name = 1; + optional TensorType type = 2; + optional TensorShape shape = 3; + optional TensorFiller filler = 4; + optional TensorQuantization quant = 5; +} + +// This enum value corresponds to Padding in TensorFlow Lite schema +enum Padding { + SAME = 0; + VALID = 1; +} + +// This enum value corresponds to ActivationFunctionType in TensorFlow Lite schema +enum Activation { + NONE = 0; + RELU = 1; + RELU6 = 3; +} + +message BatchMatMulOptions { + optional bool adjoint_lhs = 1 [default = false]; + optional bool adjoint_rhs = 2 [default = false]; +} + +message InstanceNormOptions { + optional float epsilon = 1 [default = 1e-05]; + optional Activation activation = 2 [default = NONE]; +} + +message BCQFullyConnectedOptions { + optional int32 weights_hidden_size = 1 [default = 0]; + optional Activation activation = 2 [default = NONE]; +} + +message BCQGatherOptions { + optional int32 input_hidden_size = 1 [default = 0]; + optional int32 axis = 2 [default = 0]; +} + +message Operation { + optional string type = 1; + repeated string input = 2; + repeated string output = 3; + optional int32 version = 4 [default = 1]; + + optional BatchMatMulOptions batch_matmul_options = 100; + optional InstanceNormOptions instance_norm_options = 101; + optional BCQFullyConnectedOptions bcq_fully_connected_options = 102; + optional BCQGatherOptions bcq_gather_options = 103; +} + +// For additional subgraphs +message Graph { + repeated Operand operand = 1; + repeated Operation operation = 2; + repeated string input = 3; + repeated string output = 4; + optional string name = 5; +} + +message ModelRecipe { + repeated Operand operand = 1; + repeated Operation operation = 2; + repeated string input = 3; + repeated string output = 4; + optional string name = 5; + optional uint32 version = 6 [default = 1]; + repeated Graph graph = 7; +} diff --git a/compiler/circlechef/requires.cmake b/compiler/circlechef/requires.cmake new file mode 100644 index 0000000..2106146 --- /dev/null +++ b/compiler/circlechef/requires.cmake @@ -0,0 +1,9 @@ +require("arser") +require("nnkit") +require("cwrap") +require("mio-circle") +require("safemain") +require("hermes") +require("hermes-std") +require("foder") +require("souschef") diff --git a/compiler/circlechef/tests/CMakeLists.txt b/compiler/circlechef/tests/CMakeLists.txt new file mode 100644 index 0000000..4dc58ad --- /dev/null +++ b/compiler/circlechef/tests/CMakeLists.txt @@ -0,0 +1,70 @@ +nncc_find_resource(CircleRecipes) +set(CIRCLERECIPES_DIR "${CircleRecipes_DIR}") + +file(GLOB RECIPES RELATIVE ${CIRCLERECIPES_DIR} "${CIRCLERECIPES_DIR}/*/test.recipe") + +foreach(RECIPE IN ITEMS ${RECIPES}) + get_filename_component(RECIPE_PREFIX ${RECIPE} DIRECTORY) + + set(RECIPE_SOURCE_FILE "${RECIPE_PREFIX}.recipe") + set(RECIPE_OUTPUT_FILE "${RECIPE_PREFIX}.circle") + + # Copy .recipe + add_custom_command(OUTPUT ${RECIPE_SOURCE_FILE} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${CIRCLERECIPES_DIR}/${RECIPE}" ${RECIPE_SOURCE_FILE} + DEPENDS "${CIRCLERECIPES_DIR}/${RECIPE}" + COMMENT "Generating ${RECIPE_SOURCE_FILE}") + + # Generate .circle + add_custom_command(OUTPUT ${RECIPE_OUTPUT_FILE} + COMMAND circlechef-file ${RECIPE_SOURCE_FILE} ${RECIPE_OUTPUT_FILE} + DEPENDS circlechef-file ${RECIPE_SOURCE_FILE} + COMMENT "Generating ${RECIPE_OUTPUT_FILE}") + + list(APPEND TESTS ${RECIPE_PREFIX}) + list(APPEND TESTFILES ${RECIPE_OUTPUT_FILE}) +endforeach(RECIPE) + +#Test circlechef-reverse +file(GLOB GEN_CIRCLEFILES RELATIVE ${CIRCLERECIPES_DIR} "${CIRCLERECIPES_DIR}/*/test.reverse") +# Note: While in development, circlechef-reverse may not handle the operator. +# To separate this linkage scan empty test.reverse for test targets for circlechef-reverse. + +foreach(CIRCLEFILE IN ITEMS ${GEN_CIRCLEFILES}) + get_filename_component(CIRCLE_PREFIX ${CIRCLEFILE} DIRECTORY) + + # file from above circlechef-file block + # use circle file as input of circlechef-reverse generated from circlechef-file + set(RECIPE_OUTPUT_FILE "${CIRCLE_PREFIX}.circle") + set(RECIPE_GEN_OUTPUT_FILE "${CIRCLE_PREFIX}.gen.recipe") + set(RECIPE_GEN_OUTPUT_FILE2 "${CIRCLE_PREFIX}.gen.circle") + + # Generate .gen.recipe from generated .circle + add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE} + COMMAND circlechef-reverse ${RECIPE_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE} + DEPENDS circlechef-reverse ${RECIPE_OUTPUT_FILE} + COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE}") + + # now we are going to generate .gen.circle from .gen.recipe + # to check generated .gen.recipe file is correct by using it. + # as weight values may be different, binary comparision is not acceptable. + add_custom_command(OUTPUT ${RECIPE_GEN_OUTPUT_FILE2} + COMMAND circlechef-file ${RECIPE_GEN_OUTPUT_FILE} ${RECIPE_GEN_OUTPUT_FILE2} + DEPENDS circlechef-file ${RECIPE_GEN_OUTPUT_FILE} + COMMENT "Generating ${RECIPE_GEN_OUTPUT_FILE2}") + + list(APPEND TESTS ${CIRCLE_PREFIX}.gen) + list(APPEND TESTFILES ${RECIPE_GEN_OUTPUT_FILE2}) +endforeach(CIRCLEFILE) + +# Add a dummy target to create a target-level dependency. +# TODO Find a way to create a dependency between circlechef_test and generated testfiles. +add_custom_target(circlechef_testfiles ALL DEPENDS ${TESTFILES}) + +# Using circle_verify for temporary as it only calls flatbuffer validate +# TODO do testing with running the model with runtime/interpreter +add_test(NAME circlechef_test + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/runvalidate.sh" + $ + ${TESTS}) diff --git a/compiler/circlechef/tests/runvalidate.sh b/compiler/circlechef/tests/runvalidate.sh new file mode 100755 index 0000000..46ad125 --- /dev/null +++ b/compiler/circlechef/tests/runvalidate.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +if [[ $# -le 2 ]]; then + echo "USAGE: $0 [circle-verify path] [prefix 0] " + exit 255 +fi + +CIRCLE_VERIFY_PATH="$1"; shift + +echo "-- Found circle-verify: ${CIRCLE_VERIFY_PATH}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [[ $# -ne 0 ]]; do + PREFIX="$1"; shift + + TESTED+=("${PREFIX}") + + PASSED_TAG="${PREFIX}.passed" + + rm -f "${PASSED_TAG}" + + cat > "${PREFIX}.log" <( + exec 2>&1 + + echo "'${CIRCLE_VERIFY_PATH}' '${PREFIX}.circle'" + "${CIRCLE_VERIFY_PATH}" "${PREFIX}.circle" + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$PREFIX") + else + FAILED+=("$PREFIX") + fi +done +popd + +echo "SUMMARY: ${#PASSED[@]} PASS AND ${#FAILED[@]} FAIL AMONG ${#TESTED[@]} TESTS" + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +exit 0 diff --git a/compiler/circlechef/tools/CMakeLists.txt b/compiler/circlechef/tools/CMakeLists.txt new file mode 100644 index 0000000..c958614 --- /dev/null +++ b/compiler/circlechef/tools/CMakeLists.txt @@ -0,0 +1,6 @@ +# Console-based tool (circlechef) +add_subdirectory(console) +# File-based tool (circlechef-file) +add_subdirectory(file) +# Reverse tool to generate recipe from circle (circlechef-reverse) +add_subdirectory(reverse) diff --git a/compiler/circlechef/tools/console/CMakeLists.txt b/compiler/circlechef/tools/console/CMakeLists.txt new file mode 100644 index 0000000..10168fc --- /dev/null +++ b/compiler/circlechef/tools/console/CMakeLists.txt @@ -0,0 +1,3 @@ +add_executable(circlechef Driver.cpp) +target_link_libraries(circlechef circlechef_core) +target_link_libraries(circlechef safemain) diff --git a/compiler/circlechef/tools/console/Driver.cpp b/compiler/circlechef/tools/console/Driver.cpp new file mode 100644 index 0000000..0909f59 --- /dev/null +++ b/compiler/circlechef/tools/console/Driver.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "circlechef/ModelChef.h" + +#include +#include +#include + +#include + +int entry(int argc, char **argv) +{ + int32_t model_version = 1; + + ::circlechef::ModelRecipe model_recipe; + + // Read a model recipe from standard input + { + google::protobuf::io::IstreamInputStream iis{&std::cin}; + if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe)) + { + std::cerr << "ERROR: Failed to parse recipe" << std::endl; + return 255; + } + + if (model_recipe.has_version()) + { + model_version = model_recipe.version(); + } + } + + if (model_version > 1) + { + std::cerr << "ERROR: Unsupported recipe version: " << model_version << std::endl; + return 255; + } + + auto generated_model = circlechef::cook(model_recipe); + + // Write a generated model into standard output + std::cout.write(generated_model.base(), generated_model.size()); + + return 0; +} diff --git a/compiler/circlechef/tools/file/CMakeLists.txt b/compiler/circlechef/tools/file/CMakeLists.txt new file mode 100644 index 0000000..2524a65 --- /dev/null +++ b/compiler/circlechef/tools/file/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable(circlechef-file Driver.cpp) +target_link_libraries(circlechef-file arser) +target_link_libraries(circlechef-file circlechef_core) +target_link_libraries(circlechef-file safemain) diff --git a/compiler/circlechef/tools/file/Driver.cpp b/compiler/circlechef/tools/file/Driver.cpp new file mode 100644 index 0000000..a15da40 --- /dev/null +++ b/compiler/circlechef/tools/file/Driver.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "circlechef/ModelChef.h" + +#include +#include +#include + +#include + +#include +#include + +int entry(int argc, char **argv) +{ + arser::Arser arser; + arser.add_argument("recipe") + .type(arser::DataType::STR) + .help("Source recipe file path to convert"); + arser.add_argument("circle").type(arser::DataType::STR).help("Target circle file path"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; + } + + int32_t model_version = 1; + + ::circlechef::ModelRecipe model_recipe; + + std::string recipe_path = arser.get("recipe"); + // Load model recipe from a file + { + std::ifstream is{recipe_path}; + google::protobuf::io::IstreamInputStream iis{&is}; + if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe)) + { + std::cerr << "ERROR: Failed to parse recipe '" << recipe_path << "'" << std::endl; + return 255; + } + + if (model_recipe.has_version()) + { + model_version = model_recipe.version(); + } + } + + if (model_version > 1) + { + std::cerr << "ERROR: Unsupported recipe version: " << model_version << ", '" << recipe_path + << "'" << std::endl; + return 255; + } + + auto generated_model = circlechef::cook(model_recipe); + + std::string circle_path = arser.get("circle"); + // Dump generated model into a file + { + std::ofstream os{circle_path, std::ios::binary}; + os.write(generated_model.base(), generated_model.size()); + } + + return 0; +} diff --git a/compiler/circlechef/tools/reverse/CMakeLists.txt b/compiler/circlechef/tools/reverse/CMakeLists.txt new file mode 100644 index 0000000..a1606c9 --- /dev/null +++ b/compiler/circlechef/tools/reverse/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(circlechef-reverse Driver.cpp) +target_link_libraries(circlechef-reverse arser) +target_link_libraries(circlechef-reverse circlechef_circle) +target_link_libraries(circlechef-reverse safemain) +target_link_libraries(circlechef-reverse foder) diff --git a/compiler/circlechef/tools/reverse/Driver.cpp b/compiler/circlechef/tools/reverse/Driver.cpp new file mode 100644 index 0000000..9c0b9ea --- /dev/null +++ b/compiler/circlechef/tools/reverse/Driver.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +#include +#include + +int entry(int argc, char **argv) +{ + arser::Arser arser; + arser.add_argument("circle") + .type(arser::DataType::STR) + .help("Source circle file path to convert"); + arser.add_argument("recipe").type(arser::DataType::STR).help("Target recipe file path"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; + } + + std::string circle_path = arser.get("circle"); + // Load TF lite model from a circle file + const foder::FileLoader fileLoader{circle_path}; + std::vector modelData = fileLoader.load(); + const circle::Model *circlemodel = circle::GetModel(modelData.data()); + if (circlemodel == nullptr) + { + std::cerr << "ERROR: Failed to load circle '" << circle_path << "'" << std::endl; + return 255; + } + + // Generate ModelRecipe recipe + std::unique_ptr recipe = circlechef::generate_recipe(circlemodel); + if (recipe.get() == nullptr) + { + std::cerr << "ERROR: Failed to generate recipe" << std::endl; + return 255; + } + + std::string recipe_path = arser.get("recipe"); + // Save to a file + bool result = circlechef::write_recipe(recipe_path, recipe); + if (!result) + { + std::cerr << "ERROR: Failed to write to recipe '" << recipe_path << "'" << std::endl; + return 255; + } + return 0; +} diff --git a/compiler/circledump/CMakeLists.txt b/compiler/circledump/CMakeLists.txt index a117e72..fb72b1d 100644 --- a/compiler/circledump/CMakeLists.txt +++ b/compiler/circledump/CMakeLists.txt @@ -8,7 +8,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(circledump ${DRIVER} ${SOURCES}) target_include_directories(circledump PRIVATE include) +target_link_libraries(circledump arser) target_link_libraries(circledump mio_circle) target_link_libraries(circledump safemain) -target_link_libraries(circledump stdex) target_link_libraries(circledump flatbuffers) diff --git a/compiler/circledump/driver/Driver.cpp b/compiler/circledump/driver/Driver.cpp index 8ed88e1..b8f561f 100644 --- a/compiler/circledump/driver/Driver.cpp +++ b/compiler/circledump/driver/Driver.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include @@ -21,30 +22,37 @@ int entry(int argc, char **argv) { - if (argc != 2) + arser::Arser arser; + arser.add_argument("circle").type(arser::DataType::STR).help("Circle file path to dump"); + + try { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [circle]" << std::endl; - return 255; + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << '\n'; + std::cout << arser; + return 0; } + std::string circle_path = arser.get("circle"); // Load Circle model from a circle file - std::unique_ptr model = circleread::load_circle(argv[1]); + std::unique_ptr model = circleread::load_circle(circle_path); if (model == nullptr) { - std::cerr << "ERROR: Failed to load circle '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load circle '" << circle_path << "'" << std::endl; return 255; } const circle::Model *circlemodel = model->model(); if (circlemodel == nullptr) { - std::cerr << "ERROR: Failed to load circle '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load circle '" << circle_path << "'" << std::endl; return 255; } - std::cout << "Dump: " << argv[1] << std::endl << std::endl; + std::cout << "Dump: " << circle_path << std::endl << std::endl; std::cout << circlemodel << std::endl; diff --git a/compiler/circledump/requires.cmake b/compiler/circledump/requires.cmake index b090dbd..81e0f0d 100644 --- a/compiler/circledump/requires.cmake +++ b/compiler/circledump/requires.cmake @@ -1,3 +1,3 @@ +require("arser") require("mio-circle") require("safemain") -require("stdex") diff --git a/compiler/circledump/src/Dump.cpp b/compiler/circledump/src/Dump.cpp index 3d99189..c695b07 100644 --- a/compiler/circledump/src/Dump.cpp +++ b/compiler/circledump/src/Dump.cpp @@ -123,8 +123,8 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) os << std::endl; // dump operands(tensors) - os << "Operands: T(subgraph index : tensor index) TYPE (shape) B(buffer index) OperandName" - << std::endl; + os << "Operands: T(subgraph index : tensor index) TYPE (shape) (shape_signature) " + << "B(buffer index) OperandName" << std::endl; for (uint32_t i = 0; i < tensors->Length(); ++i) { // TODO refactor to some better structure @@ -137,6 +137,11 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) os << "T(" << reader.subgraph_index() << ":" << i << ") " << circleread::tensor_type(tensor) << " "; os << "(" << dims << ") "; + if (tensor->shape_signature()) + { + std::vector dims_sig = circleread::as_index_vector(tensor->shape_signature()); + os << "(" << dims_sig << ") "; + } os << "B(" << tensor->buffer() << ") "; os << circleread::tensor_name(tensor) << std::endl; @@ -167,7 +172,12 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) os << std::endl << strqindent; } if (q_params->zero_point()) + { os << "zeropt(" << q_params->zero_point() << ") "; + if (q_params->zero_point()->size() > 1) + os << std::endl << strqindent; + } + os << "quantized_dimension(" << q_params->quantized_dimension() << ")"; os << std::endl; } @@ -199,7 +209,7 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) for (auto input : inputs) { - os << " I T(" << input << ") "; + os << " I T(" << reader.subgraph_index() << ":" << input << ") "; if (input >= 0) { auto tensor = tensors->Get(input); @@ -209,7 +219,7 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) } for (auto output : outputs) { - os << " O T(" << output << ") "; + os << " O T(" << reader.subgraph_index() << ":" << output << ") "; if (output >= 0) { auto tensor = tensors->Get(output); @@ -227,14 +237,14 @@ void dump_sub_graph(std::ostream &os, circleread::Reader &reader) { auto tensor = tensors->Get(input); std::string name = circleread::tensor_name(tensor); - os << "I T(" << input << ") " << name << std::endl; + os << "I T(" << reader.subgraph_index() << ":" << input << ") " << name << std::endl; } for (const auto output : reader.outputs()) { auto tensor = tensors->Get(output); std::string name = circleread::tensor_name(tensor); - os << "O T(" << output << ") " << name << std::endl; + os << "O T(" << reader.subgraph_index() << ":" << output << ") " << name << std::endl; } os << std::endl; diff --git a/compiler/circledump/src/OpPrinter.cpp b/compiler/circledump/src/OpPrinter.cpp index f9daab4..2c03203 100644 --- a/compiler/circledump/src/OpPrinter.cpp +++ b/compiler/circledump/src/OpPrinter.cpp @@ -17,11 +17,11 @@ #include "OpPrinter.h" #include "Read.h" -#include +#include #include -using stdex::make_unique; +using std::make_unique; namespace circledump { @@ -60,6 +60,51 @@ public: } }; +class ArgMinPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_ArgMinOptions()) + { + os << " "; + os << "OutputType(" << EnumNameTensorType(params->output_type()) << ") "; + os << std::endl; + } + } +}; + +class BatchMatMulPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_BatchMatMulOptions()) + { + os << " "; + os << std::boolalpha; + os << "adjoint_lhs(" << params->adjoint_lhs() << ") "; + os << "adjoint_rhs(" << params->adjoint_rhs() << ") "; + os << std::endl; + } + } +}; + +class CastPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto cast_params = op->builtin_options_as_CastOptions()) + { + os << " "; + os << "in_data_type(" << circle::EnumNameTensorType(cast_params->in_data_type()) << ") "; + os << "out_data_type(" << circle::EnumNameTensorType(cast_params->out_data_type()) << ") "; + os << std::endl; + } + } +}; + class Conv2DPrinter : public OpPrinter { public: @@ -71,6 +116,8 @@ public: os << "Padding(" << conv_params->padding() << ") "; os << "Stride.W(" << conv_params->stride_w() << ") "; os << "Stride.H(" << conv_params->stride_h() << ") "; + os << "Dilation.W(" << conv_params->dilation_w_factor() << ") "; + os << "Dilation.H(" << conv_params->dilation_h_factor() << ") "; os << "Activation(" << EnumNameActivationFunctionType(conv_params->fused_activation_function()) << ")"; os << std::endl; @@ -78,6 +125,20 @@ public: } }; +class DepthToSpacePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_DepthToSpaceOptions()) + { + os << " "; + os << "BlockSize(" << std_params->block_size() << ")"; + os << std::endl; + } + } +}; + class DivPrinter : public OpPrinter { public: @@ -130,6 +191,20 @@ public: } }; +class ReducerPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto reducer_params = op->builtin_options_as_ReducerOptions()) + { + os << " "; + os << "keep_dims(" << reducer_params->keep_dims() << ") "; + os << std::endl; + } + } +}; + class ReshapePrinter : public OpPrinter { public: @@ -145,6 +220,52 @@ public: } }; +class ResizeBilinearPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *resize_params = op->builtin_options_as_ResizeBilinearOptions()) + { + os << " "; + os << std::boolalpha; + os << "align_corners(" << resize_params->align_corners() << ")"; + os << "half_pixel_centers(" << resize_params->half_pixel_centers() << ")"; + os << std::endl; + } + } +}; + +class ResizeNearestNeighborPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *resize_params = op->builtin_options_as_ResizeNearestNeighborOptions()) + { + os << " "; + os << std::boolalpha; + os << "align_corners(" << resize_params->align_corners() << ")"; + os << std::endl; + } + } +}; + +class ReverseSequencePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_ReverseSequenceOptions()) + { + os << " "; + os << "seq_dim(" << params->seq_dim() << ") "; + os << "batch_dim(" << params->batch_dim() << ") "; + os << std::endl; + } + } +}; + class DepthwiseConv2DPrinter : public OpPrinter { public: @@ -184,6 +305,95 @@ public: } }; +class GatherPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_GatherOptions()) + { + os << " "; + os << "Axis(" << params->axis() << ") "; + + os << std::endl; + } + } +}; + +class IfPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_IfOptions()) + { + os << " "; + os << "then_subgraph_index(" << params->then_subgraph_index() << ") "; + os << "else_subgraph_index(" << params->else_subgraph_index() << ") "; + os << std::endl; + } + } +}; + +class L2NormPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_L2NormOptions()) + { + os << " "; + os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function()) + << ") "; + os << std::endl; + } + } +}; + +class LeakyReluPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_LeakyReluOptions()) + { + os << " "; + os << "alpha(" << params->alpha() << ") "; + } + } +}; + +class LocalResponseNormalizationPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_LocalResponseNormalizationOptions()) + { + os << " "; + os << "radius(" << params->radius() << ") "; + os << "bias(" << params->bias() << ") "; + os << "alpha(" << params->alpha() << ") "; + os << "beta(" << params->beta() << ") "; + os << std::endl; + } + } +}; + +class MirrorPadPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_MirrorPadOptions()) + { + os << " "; + os << "mode(" << EnumNameMirrorPadMode(params->mode()) << ") "; + os << std::endl; + } + } +}; + class MulPrinter : public OpPrinter { public: @@ -199,6 +409,21 @@ public: } }; +class OneHotPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_OneHotOptions()) + { + os << " "; + os << "Axis(" << params->axis() << ") "; + + os << std::endl; + } + } +}; + class PackPrinter : public OpPrinter { public: @@ -214,6 +439,20 @@ public: } }; +class ShapePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_ShapeOptions()) + { + os << " "; + os << "out_type(" << EnumNameTensorType(params->out_type()) << ") "; + os << std::endl; + } + } +}; + class SoftmaxPrinter : public OpPrinter { public: @@ -228,6 +467,101 @@ public: } }; +class SpaceToDepthPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_SpaceToDepthOptions()) + { + os << " "; + os << "BlockSize(" << std_params->block_size() << ")"; + os << std::endl; + } + } +}; + +class SparseToDensePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_SparseToDenseOptions()) + { + os << " "; + os << "ValidateIndices(" << std_params->validate_indices() << ")"; + os << std::endl; + } + } +}; + +class SplitPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SplitOptions()) + { + os << " "; + os << "num_splits(" << params->num_splits() << ") "; + os << std::endl; + } + } +}; + +class SplitVPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SplitVOptions()) + { + os << " "; + os << "num_splits(" << params->num_splits() << ") "; + os << std::endl; + } + } +}; + +class SqueezePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SqueezeOptions()) + { + os << " "; + os << "SqueezeDims("; + for (int i = 0; i < params->squeeze_dims()->size(); ++i) + { + if (i != 0) + os << ", "; + os << params->squeeze_dims()->Get(i); + } + os << ")"; + os << std::endl; + } + } +}; + +class StridedSlicePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *strided_slice_params = op->builtin_options_as_StridedSliceOptions()) + { + os << " "; + os << "begin_mask(" << strided_slice_params->begin_mask() << ") "; + os << "end_mask(" << strided_slice_params->end_mask() << ") "; + os << "ellipsis_mask(" << strided_slice_params->ellipsis_mask() << ") "; + os << "new_axis_mask(" << strided_slice_params->new_axis_mask() << ") "; + os << "shrink_axis_mask(" << strided_slice_params->shrink_axis_mask() << ") "; + os << std::endl; + } + } +}; + class SubPrinter : public OpPrinter { public: @@ -243,6 +577,37 @@ public: } }; +class TransposeConvPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto conv_params = op->builtin_options_as_TransposeConvOptions()) + { + os << " "; + os << "Padding(" << conv_params->padding() << ") "; + os << "Stride.W(" << conv_params->stride_w() << ") "; + os << "Stride.H(" << conv_params->stride_h() << ") "; + os << std::endl; + } + } +}; + +class WhilePrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_WhileOptions()) + { + os << " "; + os << "cond_subgraph_index(" << params->cond_subgraph_index() << ") "; + os << "body_subgraph_index(" << params->body_subgraph_index() << ") "; + os << std::endl; + } + } +}; + class CustomOpPrinter : public OpPrinter { public: @@ -283,25 +648,108 @@ public: } }; +class BCQFullyConnectedPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_BCQFullyConnectedOptions()) + { + os << " "; + os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function()) + << ") "; + os << "weights_hidden_size(" << params->weights_hidden_size() << ") "; + os << std::endl; + } + } +}; + +class BCQGatherPrinter : public OpPrinter +{ +public: + void options(const circle::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_BCQGatherOptions()) + { + os << " "; + os << "axis(" << params->axis() << ") "; + os << "weights_hidden_size(" << params->input_hidden_size() << ") "; + os << std::endl; + } + } +}; + OpPrinterRegistry::OpPrinterRegistry() { _op_map[circle::BuiltinOperator_ADD] = make_unique(); + // There is no Option for ADD_N _op_map[circle::BuiltinOperator_ARG_MAX] = make_unique(); + _op_map[circle::BuiltinOperator_ARG_MIN] = make_unique(); _op_map[circle::BuiltinOperator_AVERAGE_POOL_2D] = make_unique(); + _op_map[circle::BuiltinOperator_BATCH_MATMUL] = make_unique(); + _op_map[circle::BuiltinOperator_CAST] = make_unique(); + // There is no Option for CEIL _op_map[circle::BuiltinOperator_CONCATENATION] = make_unique(); _op_map[circle::BuiltinOperator_CONV_2D] = make_unique(); + _op_map[circle::BuiltinOperator_DEPTH_TO_SPACE] = make_unique(); _op_map[circle::BuiltinOperator_DEPTHWISE_CONV_2D] = make_unique(); _op_map[circle::BuiltinOperator_DIV] = make_unique(); + // There is no Option for FLOOR + // There is no Option for FLOOR_MOD _op_map[circle::BuiltinOperator_FULLY_CONNECTED] = make_unique(); + _op_map[circle::BuiltinOperator_GATHER] = make_unique(); + _op_map[circle::BuiltinOperator_IF] = make_unique(); + _op_map[circle::BuiltinOperator_L2_NORMALIZATION] = make_unique(); + _op_map[circle::BuiltinOperator_L2_POOL_2D] = make_unique(); + _op_map[circle::BuiltinOperator_LEAKY_RELU] = make_unique(); + _op_map[circle::BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION] = + make_unique(); + // There is no Option for LOG + // There is no Option for LOGISTIC + // There is no Option for LOG_SOFTMAX _op_map[circle::BuiltinOperator_MAX_POOL_2D] = make_unique(); + _op_map[circle::BuiltinOperator_MIRROR_PAD] = make_unique(); _op_map[circle::BuiltinOperator_MUL] = make_unique(); + _op_map[circle::BuiltinOperator_ONE_HOT] = make_unique(); _op_map[circle::BuiltinOperator_PACK] = make_unique(); - // There is no Option for Pad - // There is no Option for ReLU and ReLU6 + // There is no Option for PAD + // There is no Option for PRELU + // There is no Option for RELU + // There is no Option for RELU6 + // There is no Option for RELU_N1_TO_1 + _op_map[circle::BuiltinOperator_REDUCE_ANY] = make_unique(); + _op_map[circle::BuiltinOperator_REDUCE_MAX] = make_unique(); + _op_map[circle::BuiltinOperator_REDUCE_MIN] = make_unique(); + _op_map[circle::BuiltinOperator_REDUCE_PROD] = make_unique(); _op_map[circle::BuiltinOperator_RESHAPE] = make_unique(); + _op_map[circle::BuiltinOperator_RESIZE_BILINEAR] = make_unique(); + _op_map[circle::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR] = + make_unique(); + _op_map[circle::BuiltinOperator_REVERSE_SEQUENCE] = make_unique(); + // There is no Option for ROUND + // There is no Option for SELECT + // There is no Option for SELECT_V2 + _op_map[circle::BuiltinOperator_SHAPE] = make_unique(); + // There is no Option for SIN + // There is no Option for SLICE _op_map[circle::BuiltinOperator_SOFTMAX] = make_unique(); + _op_map[circle::BuiltinOperator_SPACE_TO_DEPTH] = make_unique(); + // There is no Option for SPACE_TO_BATCH_ND + _op_map[circle::BuiltinOperator_SPARSE_TO_DENSE] = make_unique(); + _op_map[circle::BuiltinOperator_SPLIT] = make_unique(); + _op_map[circle::BuiltinOperator_SPLIT_V] = make_unique(); + _op_map[circle::BuiltinOperator_SQUEEZE] = make_unique(); + _op_map[circle::BuiltinOperator_STRIDED_SLICE] = make_unique(); _op_map[circle::BuiltinOperator_SUB] = make_unique(); + _op_map[circle::BuiltinOperator_SUM] = make_unique(); + _op_map[circle::BuiltinOperator_TRANSPOSE_CONV] = make_unique(); + // There is no Option for TOPK_V2 + _op_map[circle::BuiltinOperator_WHILE] = make_unique(); _op_map[circle::BuiltinOperator_CUSTOM] = make_unique(); + + // Circle only + _op_map[circle::BuiltinOperator_BCQ_FULLY_CONNECTED] = make_unique(); + _op_map[circle::BuiltinOperator_BCQ_GATHER] = make_unique(); } } // namespace circledump diff --git a/compiler/common-artifacts/CMakeLists.txt b/compiler/common-artifacts/CMakeLists.txt new file mode 100644 index 0000000..ee4191d --- /dev/null +++ b/compiler/common-artifacts/CMakeLists.txt @@ -0,0 +1,258 @@ +#[[ Generate common python virtual enviornment ]] +find_package(PythonInterp 3 QUIET) +find_package(PythonLibs 3 QUIET) + +if(NOT ${PYTHONINTERP_FOUND}) + message(STATUS "Build common-artifacts: FALSE (Python3 is missing)") + return() +endif() + +if(${PYTHON_VERSION_MINOR} LESS 3) + message(STATUS "Build common-artifacts: FALSE (You need to install Python version higher than 3.3)") + return() +endif() + +# Create python virtual environment with tensorflow 1.13.2 +set(VIRTUALENV_OVERLAY "${NNCC_OVERLAY_DIR}/venv_1_13_2") + +add_custom_command( + OUTPUT ${VIRTUALENV_OVERLAY} + COMMAND ${PYTHON_EXECUTABLE} -m venv ${VIRTUALENV_OVERLAY} +) + +# Create requirements.txt and install required pip packages +set(REQUIREMENTS_FILE "requirements.txt") +set(REQUIREMENTS_OVERLAY_PATH "${NNCC_OVERLAY_DIR}/${REQUIREMENTS_FILE}") + +add_custom_command( + OUTPUT ${REQUIREMENTS_OVERLAY_PATH} + COMMAND ${CMAKE_COMMAND} -E echo "tensorflow==1.13.2" > ${REQUIREMENTS_OVERLAY_PATH} + COMMAND ${VIRTUALENV_OVERLAY}/bin/python -m pip --default-timeout=1000 install --upgrade pip setuptools + COMMAND ${VIRTUALENV_OVERLAY}/bin/python -m pip --default-timeout=1000 install -r ${REQUIREMENTS_OVERLAY_PATH} --upgrade + DEPENDS ${VIRTUALENV_OVERLAY} ${REQUIREMENTS_OVERLAY_PATH} +) + +add_custom_target(common_artifacts_python_deps ALL + DEPENDS ${VIRTUALENV_OVERLAY} ${REQUIREMENTS_OVERLAY_PATH} +) + +# TODO Create python virtual environment with tensorflow 2.3.0-rc0 + +#[[ Generate common resources ]] +# TODO add pbtxt +nnas_find_package(HDF5 QUIET) + +if(NOT HDF5_FOUND) + message(STATUS "Build common-artifacts: FAILED (missing HDF5)") + return() +endif(NOT HDF5_FOUND) + +set(SOURCES src/TestDataGenerator.cpp) + +add_executable(testDataGenerator ${SOURCES}) +target_include_directories(testDataGenerator PRIVATE ${HDF5_INCLUDE_DIRS}) +target_link_libraries(testDataGenerator PRIVATE ${HDF5_CXX_LIBRARIES}) +target_link_libraries(testDataGenerator PRIVATE foder) +target_link_libraries(testDataGenerator PRIVATE luci_import) +target_link_libraries(testDataGenerator PRIVATE luci_interpreter) +target_link_libraries(testDataGenerator PRIVATE mio_circle) +target_link_libraries(testDataGenerator PRIVATE safemain) + +unset(TEST_DEPS) + +# Include recipe repo +nncc_find_resource(TensorFlowLiteRecipes) +nncc_find_resource(CircleRecipes) +set(TFLITE_RECIPE_REPO "${TensorFlowLiteRecipes_DIR}") +set(CIRCLE_RECIPE_REPO "${CircleRecipes_DIR}") +set(TEST_RECIPE_FILENAME "test.recipe") +set(TEST_RULE_FILENAME "test.rule") + +set(MODEL2NNPKG "${NNAS_PROJECT_SOURCE_DIR}/tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh") +# Get test case list +unset(RECIPES) +file(GLOB TFLITE_SUBDIR RELATIVE ${TFLITE_RECIPE_REPO} ${TFLITE_RECIPE_REPO}/*) +foreach(DIR IN ITEMS ${TFLITE_SUBDIR}) + if(IS_DIRECTORY ${TFLITE_RECIPE_REPO}/${DIR}) + list(APPEND RECIPES ${DIR}) + endif() +endforeach() +file(GLOB CIRCLE_SUBDIR RELATIVE ${CIRCLE_RECIPE_REPO} ${CIRCLE_RECIPE_REPO}/*) +foreach(DIR IN ITEMS ${CIRCLE_SUBDIR}) + if(IS_DIRECTORY ${CIRCLE_RECIPE_REPO}/${DIR}) + list(APPEND RECIPES ${DIR}) + endif() +endforeach() + +macro(circlize NAME) + set(NO_CIRCLIZE_${NAME} TRUE) + set(NO_OPTIMIZE_${NAME} TRUE) + set(NO_TCGEN_${NAME} TRUE) +endmacro() +macro(optimize NAME) + set(NO_OPTIMIZE_${NAME} TRUE) +endmacro() +macro(tcgenerate NAME) + set(NO_TCGEN_${NAME} TRUE) +endmacro() + +include("exclude.lst") + +foreach(RECIPE IN ITEMS ${RECIPES}) + unset(OPT_FORMAT) + unset(MODEL_FORMAT) + + set(RECIPE_FILE "${RECIPE}.recipe") + set(RULE_FILE "${RECIPE}.rule") + set(TFLITE_RECIPE_SOURCE_PATH "${TFLITE_RECIPE_REPO}/${RECIPE}/${TEST_RECIPE_FILENAME}") + set(CIRCLE_RECIPE_SOURCE_PATH "${CIRCLE_RECIPE_REPO}/${RECIPE}/${TEST_RECIPE_FILENAME}") + + if(NOT EXISTS "${TFLITE_RECIPE_SOURCE_PATH}") + if(NOT EXISTS "${CIRCLE_RECIPE_SOURCE_PATH}") + message(FATAL_ERROR "Missing recipe of '${RECIPE}' test") + else() + # circle recipe + set(MODEL_FORMAT "circle") + set(RECIPE_SOURCE_PATH ${CIRCLE_RECIPE_SOURCE_PATH}) + endif() + else() + # tflite recipe + set(MODEL_FORMAT "tflite") + set(RECIPE_SOURCE_PATH ${TFLITE_RECIPE_SOURCE_PATH}) + endif() + + set(TFLITE_RULE_SOURCE_PATH "${TFLITE_RECIPE_REPO}/${RECIPE}/${TEST_RULE_FILENAME}") + set(CIRCLE_RULE_SOURCE_PATH "${CIRCLE_RECIPE_REPO}/${RECIPE}/${TEST_RULE_FILENAME}") + + unset(RULE_SOURCE_PATH) + if(EXISTS "${TFLITE_RULE_SOURCE_PATH}") + set(RULE_SOURCE_PATH ${TFLITE_RULE_SOURCE_PATH}) + endif() + if(EXISTS "${CIRCLE_RULE_SOURCE_PATH}") + set(RULE_SOURCE_PATH ${CIRCLE_RULE_SOURCE_PATH}) + endif() + + set(RECIPE_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}") + set(RULE_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RULE_FILE}") + + set(TFLITE_FILE "${RECIPE}.tflite") + set(TFLITE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${TFLITE_FILE}") + set(CIRCLE_FILE "${RECIPE}.circle") + set(CIRCLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CIRCLE_FILE}") + + # Copy .recipe + add_custom_command(OUTPUT ${RECIPE_BINARY_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${RECIPE_SOURCE_PATH}" "${RECIPE_BINARY_PATH}" + DEPENDS ${RECIPE_SOURCE_PATH} + COMMENT "Generate ${RECIPE_FILE}" + ) + list(APPEND TEST_DEPS ${RECIPE_BINARY_PATH}) + + if(DEFINED RULE_SOURCE_PATH) + # Copy .rule + add_custom_command(OUTPUT ${RULE_BINARY_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${RULE_SOURCE_PATH}" "${RULE_BINARY_PATH}" + DEPENDS ${RULE_SOURCE_PATH} + COMMENT "Generate ${RULE_FILE}" + ) + list(APPEND TEST_DEPS ${RULE_BINARY_PATH}) + endif() + + if(${MODEL_FORMAT} STREQUAL "tflite") + # Generate .tflite + add_custom_command(OUTPUT ${TFLITE_OUTPUT_PATH} + COMMAND $ ${RECIPE_BINARY_PATH} ${TFLITE_OUTPUT_PATH} + DEPENDS $ ${RECIPE_BINARY_PATH} + COMMENT "Generate ${TFLITE_FILE}" + ) + list(APPEND TEST_DEPS ${TFLITE_OUTPUT_PATH}) + + if(NOT DEFINED NO_CIRCLIZE_${RECIPE}) + # Generate .circle + add_custom_command(OUTPUT ${CIRCLE_OUTPUT_PATH} + COMMAND $ ${TFLITE_OUTPUT_PATH} ${CIRCLE_OUTPUT_PATH} + DEPENDS $ ${TFLITE_OUTPUT_PATH} + COMMENT "Generate ${CIRCLE_FILE}" + ) + set(MODEL_FORMAT "circle") + list(APPEND TEST_DEPS ${CIRCLE_OUTPUT_PATH}) + endif() + else() + # Generate .circle + add_custom_command(OUTPUT ${CIRCLE_OUTPUT_PATH} + COMMAND $ ${RECIPE_BINARY_PATH} ${CIRCLE_OUTPUT_PATH} + DEPENDS $ ${RECIPE_BINARY_PATH} + COMMENT "Generate ${CIRCLE_FILE}" + ) + list(APPEND TEST_DEPS ${CIRCLE_OUTPUT_PATH}) + endif() + + set(OPT_CIRCLE_FILE "${RECIPE}.opt.circle") + set(OPT_CIRCLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${OPT_CIRCLE_FILE}") + + if(NOT DEFINED NO_OPTIMIZE_${RECIPE}) + # Generate optimized .circle + add_custom_command(OUTPUT ${OPT_CIRCLE_OUTPUT_PATH} + COMMAND $ --all ${CIRCLE_OUTPUT_PATH} ${OPT_CIRCLE_OUTPUT_PATH} + DEPENDS $ ${CIRCLE_OUTPUT_PATH} + COMMENT "Generate ${OPT_CIRCLE_FILE}" + ) + set(OPT_FORMAT ".opt") + list(APPEND TEST_DEPS ${OPT_CIRCLE_OUTPUT_PATH}) + endif() + + set(MODEL_FILE "${RECIPE}${OPT_FORMAT}.${MODEL_FORMAT}") + set(MODEL_PATH "${CMAKE_CURRENT_BINARY_DIR}/${MODEL_FILE}") + set(NNPKG_FILE "${RECIPE}${OPT_FORMAT}") + set(NNPKG_PATH "${CMAKE_CURRENT_BINARY_DIR}/${NNPKG_FILE}") + + add_custom_command(OUTPUT ${NNPKG_PATH} + COMMAND ${MODEL2NNPKG} ${MODEL_PATH} + DEPENDS ${MODEL2NNPKG} ${MODEL_PATH} + COMMENT "Generate ${RECIPE} nnpackage" + ) + list(APPEND TEST_DEPS ${NNPKG_PATH}) + + set(INPUT_HDF5_FILE "${RECIPE}${OPT_FORMAT}.input.h5") + set(INPUT_BIN_PATH "${CMAKE_CURRENT_BINARY_DIR}/${INPUT_HDF5_FILE}") + + set(EXPECTED_HDF5_FILE "${RECIPE}${OPT_FORMAT}.expected.h5") + set(EXPECTED_BIN_PATH "${CMAKE_CURRENT_BINARY_DIR}/${EXPECTED_HDF5_FILE}") + + if(NOT DEFINED NO_TCGEN_${RECIPE}) + # Generate input.h5, expected.h5 + add_custom_command(OUTPUT ${INPUT_BIN_PATH} ${EXPECTED_BIN_PATH} + COMMAND $ ${MODEL_FILE} + DEPENDS $ ${MODEL_FILE} + COMMENT "Generate ${INPUT_BIN_PATH} and ${EXPECTED_BIN_PATH}" + ) + + # Generate test directory + set(TC_DIRECTORY "${NNPKG_PATH}/metadata/tc") + add_custom_command(OUTPUT ${TC_DIRECTORY} + COMMAND ${CMAKE_COMMAND} -E make_directory ${TC_DIRECTORY} + DEPENDS ${NNPKG_PATH} + COMMENT "Generate ${RECIPE} nnpackage test directory" + ) + + # Move input hdf5 file to test directory + set(INPUT_NNPKG_PATH "${TC_DIRECTORY}/input.h5") + add_custom_command(OUTPUT ${INPUT_NNPKG_PATH} + COMMAND ${CMAKE_COMMAND} -E rename ${INPUT_BIN_PATH} ${INPUT_NNPKG_PATH} + DEPENDS ${INPUT_BIN_PATH} ${TC_DIRECTORY} + COMMENT "Move ${INPUT_HDF5_FILE} to nnpackage" + ) + + # Move expected hdf5 file to test directory + set(EXPECTED_NNPKG_PATH "${TC_DIRECTORY}/expected.h5") + add_custom_command(OUTPUT ${EXPECTED_NNPKG_PATH} + COMMAND ${CMAKE_COMMAND} -E rename ${EXPECTED_BIN_PATH} ${EXPECTED_NNPKG_PATH} + DEPENDS ${EXPECTED_BIN_PATH} ${TC_DIRECTORY} + COMMENT "Move ${EXPECTED_HDF5_FILE} to nnpackage" + ) + list(APPEND TEST_DEPS ${TC_DIRECTORY} ${INPUT_BIN_PATH} ${EXPECTED_BIN_PATH} + ${INPUT_NNPKG_PATH} ${EXPECTED_NNPKG_PATH}) + endif() +endforeach() + +add_custom_target(common_artifacts_deps ALL DEPENDS ${TEST_DEPS}) diff --git a/compiler/common-artifacts/README.md b/compiler/common-artifacts/README.md new file mode 100644 index 0000000..cb6ba40 --- /dev/null +++ b/compiler/common-artifacts/README.md @@ -0,0 +1,37 @@ +# common-artifacts + +`common-artifacts` is a module that produces intermediate artifacts that are commonly generated for compiler testing. + +There are four modules used here. +- tflchef : recipe -> tflite +- tflite2circle : tflite -> circle (circlize) +- circle2circle : circle -> circle (optimize) +- TestDataGenerator : generate input.h5 and expected.h5 (tcgenerate) + +## List of intermediate artifacts +- recipe +- tflite +- circle +- circle (applied all optimizations in circle2circle) +- input data for nnpackage (.h5) +- expected output data for nnpackage (.h5) + +## How to exclude from resource generation +Sometimes a specific module that generates a resource does not support the generation of the resource, so exclusion is sometimes required. + +There is a `exclude.lst` that performs the function. If you enter the name of steps(circlize, optimize, tcgenerate) and operator you want to exclude there, you can omit the module's step. + +e.g. +``` +$ cat exclude.lst +# circlize : Exclude from tflite-to-circle conversion(tflite2circle) + +# optimize : Exclude from circle optimization(circle2circle) +optimize(ReLU6_000) +optimize(Where_000) +optimize(Where_001) + +# tcgenerate : Exclude from test data generation(TestDataGenerator) +tcgenerate(Abs_000) +tcgenerate(AddN_000) +``` diff --git a/compiler/common-artifacts/exclude.lst b/compiler/common-artifacts/exclude.lst new file mode 100644 index 0000000..b614b71 --- /dev/null +++ b/compiler/common-artifacts/exclude.lst @@ -0,0 +1,191 @@ +#[[ circlize : Exclude from tflite-to-circle conversion(tflite2circle) ]] +## TensorFlowLiteRecipes + +## CircleRecipes + +#[[ optimize : Exclude from circle optimization(circle2circle) ]] +## TensorFlowLiteRecipes +optimize(ReLU6_000) +optimize(Where_000) +optimize(Where_001) + +## CircleRecipes + +#[[ tcgenerate : Exclude from test data generation(TestDataGenerator) ]] +## TensorFlowLiteRecipes +tcgenerate(Abs_000) +tcgenerate(AddN_000) +tcgenerate(Add_001) # runtime doesn't support +tcgenerate(Add_U8_000) +tcgenerate(All_000) +tcgenerate(ArgMax_U8_000) +tcgenerate(ArgMax_U8_001) +tcgenerate(ArgMax_U8_002) +tcgenerate(ArgMax_U8_003) +tcgenerate(ArgMin_000) +tcgenerate(ArgMin_001) +tcgenerate(ArgMin_002) +tcgenerate(ArgMin_003) +tcgenerate(ArgMin_U8_000) +tcgenerate(ArgMin_U8_001) +tcgenerate(ArgMin_U8_002) +tcgenerate(ArgMin_U8_003) +tcgenerate(BatchMatMul_000) +tcgenerate(BatchMatMulV2_000) +tcgenerate(BatchMatMulV2_001) +tcgenerate(BatchToSpaceND_000) +tcgenerate(Cast_000) +tcgenerate(Cast_001) +tcgenerate(Ceil_000) +tcgenerate(Concatenation_U8_000) +tcgenerate(Conv2D_003) # runtime doesn't support dilation +tcgenerate(Conv2D_U8_000) +tcgenerate(Conv2D_U8_001) +tcgenerate(Cos_000) +tcgenerate(DepthToSpace_000) +tcgenerate(DepthwiseConv2D_001) # runtime doesn't support dilation +tcgenerate(DepthwiseConv2D_003) # runtime doesn't support dilation +tcgenerate(DepthwiseConv2D_U8_000) +tcgenerate(Div_000) +tcgenerate(ELU_000) +tcgenerate(Equal_000) +tcgenerate(Exp_000) +tcgenerate(ExpandDims_000) +tcgenerate(ExpandDims_001) +tcgenerate(ExpandDims_002) +tcgenerate(ExpandDims_003) +tcgenerate(Fill_000) +tcgenerate(Fill_001) +tcgenerate(Floor_000) +tcgenerate(FloorDiv_000) +tcgenerate(FloorDiv_001) +tcgenerate(FloorMod_000) +tcgenerate(FloorMod_001) +tcgenerate(FullyConnected_002) +tcgenerate(FullyConnected_U8_000) +tcgenerate(Gather_000) +tcgenerate(GatherNd_000) +tcgenerate(GatherNd_001) +tcgenerate(Greater_000) +tcgenerate(GreaterEqual_000) +tcgenerate(If_000) +tcgenerate(If_001) +tcgenerate(L2Normalize_000) # runtime doesn't support +tcgenerate(L2Pool2D_000) # runtime doesn't support +tcgenerate(L2Pool2D_U8_000) +tcgenerate(LeakyRelu_000) # runtime doesn't support +tcgenerate(Less_000) +tcgenerate(LessEqual_000) +tcgenerate(LocalResponseNormalization_000) # runtime doesn't support +tcgenerate(Log_000) +tcgenerate(LogicalAnd_000) +tcgenerate(LogicalNot_000) +tcgenerate(LogicalOr_000) +tcgenerate(LogSoftmax_000) +tcgenerate(MatMul_000) +tcgenerate(MatrixBandPart_000) +tcgenerate(MatrixDiag_000) +tcgenerate(MatrixSetDiag_000) +tcgenerate(Maximum_000) +tcgenerate(MaxPool2D_U8_000) +tcgenerate(Mean_U8_000) +tcgenerate(Minimum_000) +tcgenerate(MirrorPad_000) +tcgenerate(Mul_U8_000) +tcgenerate(Neg_000) +tcgenerate(Net_Dangle_001) +tcgenerate(Net_InstanceNorm_001) +tcgenerate(Net_InstanceNorm_002) +tcgenerate(Net_ZeroDim_001) # fix luci +tcgenerate(NotEqual_000) +tcgenerate(OneHot_000) +tcgenerate(OneHot_001) +tcgenerate(OneHot_002) +tcgenerate(OneHot_003) +tcgenerate(Pack_000) +tcgenerate(Pack_U8_000) +tcgenerate(Pad_U8_000) +tcgenerate(Pow_000) +tcgenerate(PRelu_000) +tcgenerate(Range_000) +tcgenerate(Rank_000) +tcgenerate(ReduceAny_000) +tcgenerate(ReduceAny_001) +tcgenerate(ReduceAny_002) +tcgenerate(ReduceAny_003) +tcgenerate(ReduceMax_000) +tcgenerate(ReduceMin_000) +tcgenerate(ReduceProd_000) +tcgenerate(ReduceProd_001) +tcgenerate(ReduceProd_002) +tcgenerate(ReduceProd_003) +tcgenerate(ReLU_000) +tcgenerate(ReLU6_000) # luci NYI +tcgenerate(ReLUN1To1_000) +tcgenerate(Reshape_003) # fix luci +tcgenerate(Reshape_U8_000) +tcgenerate(ResizeBilinear_000) +tcgenerate(ResizeNearestNeighbor_000) +tcgenerate(ReverseSequence_000) +tcgenerate(ReverseV2_000) +tcgenerate(Round_000) +tcgenerate(Rsqrt_000) +tcgenerate(ScatterNd_000) +tcgenerate(SegmentSum_000) +tcgenerate(Select_000) +tcgenerate(Select_001) +tcgenerate(Select_002) +tcgenerate(SelectV2_000) +tcgenerate(SelectV2_001) +tcgenerate(SelectV2_002) +tcgenerate(Shape_000) +tcgenerate(Sin_000) +tcgenerate(Slice_000) +tcgenerate(Softmax_U8_000) +tcgenerate(SpaceToBatchND_000) +tcgenerate(SpaceToBatchND_001) +tcgenerate(SpaceToBatchND_002) +tcgenerate(SpaceToBatchND_003) +tcgenerate(SpaceToDepth_000) +tcgenerate(SparseToDense_000) +tcgenerate(SplitV_000) # fix luci +tcgenerate(Sqrt_000) +tcgenerate(Square_000) +tcgenerate(SquaredDifference_000) +tcgenerate(Squeeze_000) +tcgenerate(StridedSlice_000) +tcgenerate(StridedSlice_001) +tcgenerate(StridedSlice_002) +tcgenerate(Sub_000) +tcgenerate(Sub_001) +tcgenerate(Sub_U8_000) +tcgenerate(Sum_000) +tcgenerate(Sum_001) +tcgenerate(Tanh_000) +tcgenerate(Tile_000) +tcgenerate(Tile_U8_000) +tcgenerate(TopKV2_000) # fix luci +tcgenerate(TopKV2_001) # fix luci +tcgenerate(TransposeConv_000) # fix interpreter +tcgenerate(Unique_000) +tcgenerate(Unique_001) +tcgenerate(Unique_002) +tcgenerate(Unique_003) +tcgenerate(Unique_U8_000) +tcgenerate(Unique_U8_001) +tcgenerate(Where_000) # luci NYI +tcgenerate(Where_001) # luci NYI +tcgenerate(While_000) # fix luci +tcgenerate(While_001) +tcgenerate(While_002) +tcgenerate(While_003) +tcgenerate(YUV_TO_RGB_000) # fix luci +tcgenerate(YUV_TO_RGB_U8_000) +tcgenerate(ZerosLike_000) + +## CircleRecipes +tcgenerate(BCQFullyConnected_000) +tcgenerate(BCQFullyConnected_001) +tcgenerate(BCQGather_000) +tcgenerate(CircleBatchMatMul_000) +tcgenerate(InstanceNorm_000) diff --git a/compiler/common-artifacts/requires.cmake b/compiler/common-artifacts/requires.cmake new file mode 100644 index 0000000..8c27565 --- /dev/null +++ b/compiler/common-artifacts/requires.cmake @@ -0,0 +1,8 @@ +require("circle2circle") +require("circlechef") +require("foder") +require("luci") +require("luci-interpreter") +require("mio-circle") +require("safemain") +require("tflchef") diff --git a/compiler/common-artifacts/src/TestDataGenerator.cpp b/compiler/common-artifacts/src/TestDataGenerator.cpp new file mode 100644 index 0000000..739300d --- /dev/null +++ b/compiler/common-artifacts/src/TestDataGenerator.cpp @@ -0,0 +1,234 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace +{ + +uint32_t element_num(std::vector &vec) +{ + return static_cast( + std::accumulate(std::begin(vec), std::end(vec), 1, std::multiplies())); +} + +H5::PredType hdf5_dtype_cast(const loco::DataType loco_dtype) +{ + switch (loco_dtype) + { + case loco::DataType::U8: + return H5::PredType::NATIVE_UINT8; + case loco::DataType::S32: + return H5::PredType::NATIVE_INT32; + case loco::DataType::S64: + return H5::PredType::NATIVE_INT64; + case loco::DataType::FLOAT32: + return H5::PredType::NATIVE_FLOAT; + default: + throw std::runtime_error("NYI data type."); + } +} + +template void geneate_random_data(std::mt19937 &gen, void *data, uint32_t size) +{ + std::normal_distribution distrib(0, 2); // mean(0), stddev(2) + for (uint32_t i = 0; i < size; i++) + { + static_cast(data)[i] = static_cast(distrib(gen)); + } +} + +void fill_random_data(void *data, uint32_t size, loco::DataType dtype) +{ + std::random_device rd; // used to obtain a seed for the random number engine + std::mt19937 gen(rd()); // standard mersenne_twister_engine seeded with rd() + + switch (dtype) + { + case loco::DataType::U8: + geneate_random_data(gen, data, size); + break; + case loco::DataType::S32: + geneate_random_data(gen, data, size); + break; + case loco::DataType::S64: + geneate_random_data(gen, data, size); + break; + case loco::DataType::FLOAT32: + geneate_random_data(gen, data, size); + break; + default: + break; + } +} + +} // namespace + +int entry(int argc, char **argv) +{ + std::string circle_file{argv[1]}; + size_t last_dot_index = circle_file.find_last_of("."); + std::string prefix = circle_file.substr(0, last_dot_index); + + // load circle file + foder::FileLoader file_loader{circle_file}; + std::vector model_data = file_loader.load(); + const circle::Model *circle_model = circle::GetModel(model_data.data()); + if (circle_model == nullptr) + { + std::cerr << "ERROR: Failed to load circle '" << circle_file << "'" << std::endl; + return EXIT_FAILURE; + } + + // load luci module + std::unique_ptr module = luci::Importer().importModule(circle_model); + luci_interpreter::Interpreter interpreter(module.get()); + + /** + * HDF5 layout is like below + * + * GROUP "/" + * ㄴGROUP "name" + * ㄴATTRIBUTE "0" + * ㄴDATA (0): "input_01:0" + * ㄴATTRIBUTE "1" + * ㄴDATA (0): "input_02:0" + * ㄴGROUP "value" + * ㄴDATASET "0" + * ㄴDATA ... + * ㄴDATASET "1" + * ㄴDATA ... + */ + // create random data and dump into hdf5 file + H5::H5File input_file{prefix + ".input.h5", H5F_ACC_TRUNC}; + std::unique_ptr input_name_group = + std::make_unique(input_file.createGroup("name")); + std::unique_ptr input_value_group = + std::make_unique(input_file.createGroup("value")); + + H5::H5File output_file{prefix + ".expected.h5", H5F_ACC_TRUNC}; + std::unique_ptr output_name_group = + std::make_unique(output_file.createGroup("name")); + std::unique_ptr output_value_group = + std::make_unique(output_file.createGroup("value")); + + uint32_t input_index = 0; + for (uint32_t g = 0; g < circle_model->subgraphs()->size(); g++) + { + const auto input_nodes = loco::input_nodes(module->graph(g)); + for (const auto &node : input_nodes) + { + const auto *input_node = dynamic_cast(node); + std::string name = input_node->name(); + if (name.find(":") == std::string::npos) + name += ":0"; + + // create attribute + H5::DataSpace name_dataspace(H5S_SCALAR); + H5::StrType name_datatype(H5::PredType::C_S1, name.size()); + + auto name_attr = input_name_group->createAttribute(std::to_string(input_index), name_datatype, + name_dataspace); + + name_attr.write(name_datatype, name); + + // create value + std::vector dims(input_node->rank()); + for (uint32_t d = 0; d < input_node->rank(); d++) + { + dims.at(d) = input_node->dim(d).value(); + assert(dims.at(d) >= 0); + } + auto dataspace = std::make_unique(dims.size(), dims.data()); + auto dtype = hdf5_dtype_cast(input_node->dtype()); + auto dataset = std::make_unique( + input_file.createDataSet("value/" + std::to_string(input_index), dtype, *dataspace)); + + auto data_size = ::element_num(dims); + auto dtype_size = loco::size(input_node->dtype()); + auto byte_size = dtype_size * data_size; + std::vector data(byte_size); + + // generate random data + fill_random_data(data.data(), data_size, input_node->dtype()); + + dataset->write(data.data(), dtype); + + interpreter.writeInputTensor(input_node, data.data(), byte_size); + + input_index++; + } + } + + interpreter.interpret(); + + // dump output data into hdf5 file + uint32_t output_index = 0; + for (uint32_t g = 0; g < circle_model->subgraphs()->size(); g++) + { + const auto output_nodes = loco::output_nodes(module->graph(g)); + for (const auto &node : output_nodes) + { + const auto *output_node = dynamic_cast(node); + std::string name = output_node->name(); + if (name.find(":") == std::string::npos) + name += ":0"; + + // create attribute + H5::DataSpace name_dataspace(H5S_SCALAR); + H5::StrType name_datatype(H5::PredType::C_S1, name.size()); + + auto name_attr = output_name_group->createAttribute(std::to_string(output_index), + name_datatype, name_dataspace); + + name_attr.write(name_datatype, name); + + // create value + std::vector dims(output_node->rank()); + for (uint32_t d = 0; d < output_node->rank(); d++) + { + dims.at(d) = output_node->dim(d).value(); + assert(dims.at(d) >= 0); + } + auto dataspace = std::make_unique(dims.size(), dims.data()); + auto dtype = hdf5_dtype_cast(output_node->dtype()); + auto dataset = std::make_unique( + output_file.createDataSet("value/" + std::to_string(output_index), dtype, *dataspace)); + + uint32_t tensor_bytesize = loco::size(output_node->dtype()); + tensor_bytesize *= ::element_num(dims); + std::vector output_data(tensor_bytesize); + interpreter.readOutputTensor(output_node, output_data.data(), output_data.size()); + + dataset->write(output_data.data(), dtype); + + output_index++; + } + } + + return EXIT_SUCCESS; +} diff --git a/compiler/cwrap/include/cwrap/Fildes.h b/compiler/cwrap/include/cwrap/Fildes.h index f1061cc..22a95ef 100644 --- a/compiler/cwrap/include/cwrap/Fildes.h +++ b/compiler/cwrap/include/cwrap/Fildes.h @@ -47,7 +47,7 @@ public: int release(void); private: - int _value; + int _value{-1}; }; bool valid(const Fildes &); diff --git a/compiler/cwrap/src/Fildes.test.cpp b/compiler/cwrap/src/Fildes.test.cpp index 08e1e2a..f9fa20f 100644 --- a/compiler/cwrap/src/Fildes.test.cpp +++ b/compiler/cwrap/src/Fildes.test.cpp @@ -32,7 +32,9 @@ namespace int make_temp(char *name_template) { + mode_t mask = umask(S_IRWXU); int fd = mkstemp(name_template); + umask(mask); if (fd == -1) { @@ -55,9 +57,13 @@ TEST(FildesTest, value_constructor) { DECLARE_TEMPLATE(name_template); - cwrap::Fildes fildes{make_temp(name_template)}; + { + cwrap::Fildes fildes{make_temp(name_template)}; + + ASSERT_TRUE(cwrap::valid(fildes)); + } - ASSERT_TRUE(cwrap::valid(fildes)); + unlink(name_template); } TEST(FildesTest, move_constructor) @@ -68,19 +74,24 @@ TEST(FildesTest, move_constructor) int src_fd = make_temp(src_template); int dst_fd = make_temp(dst_template); - cwrap::Fildes src{src_fd}; - cwrap::Fildes dst{dst_fd}; + { + cwrap::Fildes src{src_fd}; + cwrap::Fildes dst{dst_fd}; - dst = std::move(src); + dst = std::move(src); - ASSERT_FALSE(cwrap::valid(src)); - ASSERT_TRUE(cwrap::valid(dst)); + ASSERT_FALSE(cwrap::valid(src)); + ASSERT_TRUE(cwrap::valid(dst)); - ASSERT_EQ(dst.get(), src_fd); + ASSERT_EQ(dst.get(), src_fd); - // "src_fd" SHOULD be valid, and "dst_fd" SHOULD be closed - ASSERT_NE(fcntl(src_fd, F_GETFD), -1); - ASSERT_EQ(fcntl(dst_fd, F_GETFD), -1); + // "src_fd" SHOULD be valid, and "dst_fd" SHOULD be closed + ASSERT_NE(fcntl(src_fd, F_GETFD), -1); + ASSERT_EQ(fcntl(dst_fd, F_GETFD), -1); + } + + unlink(src_template); + unlink(dst_template); } TEST(FildesTest, destructor) @@ -94,4 +105,6 @@ TEST(FildesTest, destructor) cwrap::Fildes fildes{fd}; } ASSERT_EQ(fcntl(fd, F_GETFD), -1); + + unlink(name_template); } diff --git a/compiler/dredd-rule-lib/rule-lib.sh b/compiler/dredd-rule-lib/rule-lib.sh index 8ebe3d7..9254cc9 100755 --- a/compiler/dredd-rule-lib/rule-lib.sh +++ b/compiler/dredd-rule-lib/rule-lib.sh @@ -200,4 +200,21 @@ verify_file_format() echo ${ACTUAL} } +op_version() +{ + argc_check $# 1 + file_path_check ${COMPILED_FILE} + file_path_check ${INSPECT_PROG_PATH} + + set -o pipefail + + ACTUAL=`init_error_log ; \ + ${INSPECT_PROG_PATH} --op_version ${COMPILED_FILE} | \ + awk -F, -v opname="$1" '{ if ($1 == opname) print $2}'` + + check_success_exit_code $? 0 + + echo ${ACTUAL} +} + # TODO define more qullity test function diff --git a/compiler/enco-intf/README.md b/compiler/enco-intf/README.md new file mode 100644 index 0000000..5f265bc --- /dev/null +++ b/compiler/enco-intf/README.md @@ -0,0 +1 @@ +# enco-intf diff --git a/compiler/exo/src/Circle/CircleTensorExporter.cpp b/compiler/exo/src/Circle/CircleTensorExporter.cpp index efceae5..6adc316 100644 --- a/compiler/exo/src/Circle/CircleTensorExporter.cpp +++ b/compiler/exo/src/Circle/CircleTensorExporter.cpp @@ -60,8 +60,8 @@ public: private: std::string _name; - circle::TensorType _dtype; - ShapeDescription _shape; + circle::TensorType _dtype{circle::TensorType_FLOAT32}; + ShapeDescription _shape{}; // TODO Find a better design loco::ConstGen *_content = nullptr; // TODO deprecate diff --git a/compiler/exo/src/Conversion/DepthwiseConv2DConverter.cpp b/compiler/exo/src/Conversion/DepthwiseConv2DConverter.cpp index 5959fcc..e3884c3 100644 --- a/compiler/exo/src/Conversion/DepthwiseConv2DConverter.cpp +++ b/compiler/exo/src/Conversion/DepthwiseConv2DConverter.cpp @@ -56,7 +56,7 @@ bool DepthwiseConv2DConverter::convert(loco::DepthwiseConv2D *origin) tfl_dw_conv2d->fusedActivationFunction(locoex::FusedActFunc::NONE); uint32_t multiplier = filter_shape.multiplier().value(); - EXO_ASSERT(multiplier < std::numeric_limits::max(), + EXO_ASSERT(multiplier < static_cast(std::numeric_limits::max()), "Multiplier is too big that casting may occur unintended behavior") tfl_dw_conv2d->depthMultiplier(static_cast(multiplier)); diff --git a/compiler/exo/src/Conversion/TensorBroadcastConverter.cpp b/compiler/exo/src/Conversion/TensorBroadcastConverter.cpp index 5323327..daccbe6 100644 --- a/compiler/exo/src/Conversion/TensorBroadcastConverter.cpp +++ b/compiler/exo/src/Conversion/TensorBroadcastConverter.cpp @@ -139,7 +139,7 @@ bool TensorBroadcastConverter::run(loco::Graph *graph) { if (node->dialect() == locoex::TFLDialect::get()) { - auto tfl_node = dynamic_cast(node); + auto tfl_node = loco::must_cast(node); tfl_node->accept(&collector); } } diff --git a/compiler/exo/src/Dialect/IR/CircleDialect.test.cpp b/compiler/exo/src/Dialect/IR/CircleDialect.test.cpp index 6132eb3..6c85b67 100644 --- a/compiler/exo/src/Dialect/IR/CircleDialect.test.cpp +++ b/compiler/exo/src/Dialect/IR/CircleDialect.test.cpp @@ -27,5 +27,5 @@ TEST(CircleDialectTest, get) // get() SHOULD return a valid(non-null) pointer ASSERT_NE(d, nullptr); // The return value SHOULD be stable across multiple invocations - ASSERT_EQ(d, CircleDialect::get()); + ASSERT_EQ(CircleDialect::get(), d); } diff --git a/compiler/exo/src/Dialect/IR/CircleNodeImpl.h b/compiler/exo/src/Dialect/IR/CircleNodeImpl.h index d9f4871..8c8b99b 100644 --- a/compiler/exo/src/Dialect/IR/CircleNodeImpl.h +++ b/compiler/exo/src/Dialect/IR/CircleNodeImpl.h @@ -18,7 +18,6 @@ #define __LOCOEX_IR_CIRCLENODEIMPL_H__ #include "CircleNodes.h" -#include "CircleNodeVisitor.h" #include diff --git a/compiler/exo/src/Dialect/IR/CircleNodeVisitor.h b/compiler/exo/src/Dialect/IR/CircleNodeVisitor.h index fc70c9e..f5c28a1 100644 --- a/compiler/exo/src/Dialect/IR/CircleNodeVisitor.h +++ b/compiler/exo/src/Dialect/IR/CircleNodeVisitor.h @@ -18,7 +18,6 @@ #define __LOCOEX_IR_CIRCLENODE_VISITOR_H__ #include "CircleNode.h" -#include "CircleNodes.h" #include diff --git a/compiler/exo/src/Dialect/IR/CircleNodes.test.cpp b/compiler/exo/src/Dialect/IR/CircleNodes.test.cpp index b63e7cc..3011bdc 100644 --- a/compiler/exo/src/Dialect/IR/CircleNodes.test.cpp +++ b/compiler/exo/src/Dialect/IR/CircleNodes.test.cpp @@ -25,12 +25,12 @@ TEST(CircleInstanceNormTest, constructor) { locoex::CircleInstanceNorm instance_norm; - ASSERT_EQ(instance_norm.dialect(), locoex::CircleDialect::get()); - ASSERT_EQ(instance_norm.opcode(), locoex::CircleOpcode::INSTANCE_NORM); + ASSERT_EQ(locoex::CircleDialect::get(), instance_norm.dialect()); + ASSERT_EQ(locoex::CircleOpcode::INSTANCE_NORM, instance_norm.opcode()); - ASSERT_EQ(instance_norm.input(), nullptr); - ASSERT_EQ(instance_norm.gamma(), nullptr); - ASSERT_EQ(instance_norm.beta(), nullptr); - ASSERT_FLOAT_EQ(instance_norm.epsilon(), 1e-05); - ASSERT_EQ(instance_norm.fusedActivationFunction(), locoex::FusedActFunc::UNDEFINED); + ASSERT_EQ(nullptr, instance_norm.input()); + ASSERT_EQ(nullptr, instance_norm.gamma()); + ASSERT_EQ(nullptr, instance_norm.beta()); + ASSERT_FLOAT_EQ(1e-05, instance_norm.epsilon()); + ASSERT_EQ(locoex::FusedActFunc::UNDEFINED, instance_norm.fusedActivationFunction()); } diff --git a/compiler/exo/src/Dialect/IR/NodeMixins.h b/compiler/exo/src/Dialect/IR/NodeMixins.h index c35daeb..9490ea1 100644 --- a/compiler/exo/src/Dialect/IR/NodeMixins.h +++ b/compiler/exo/src/Dialect/IR/NodeMixins.h @@ -58,7 +58,7 @@ protected: loco::Use *at(unsigned n) const { return _args.at(n).get(); } private: - std::array, N> _args; + std::array, N> _args{}; }; } // namespace locoex diff --git a/compiler/exo/src/Dialect/IR/TFLDialect.test.cpp b/compiler/exo/src/Dialect/IR/TFLDialect.test.cpp index 136721e..1267540 100644 --- a/compiler/exo/src/Dialect/IR/TFLDialect.test.cpp +++ b/compiler/exo/src/Dialect/IR/TFLDialect.test.cpp @@ -27,5 +27,5 @@ TEST(TFLDialectTest, get) // get() SHOULD return a valid(non-null) pointer ASSERT_NE(d, nullptr); // The return value SHOULD be stable across multiple invocations - ASSERT_EQ(d, TFLDialect::get()); + ASSERT_EQ(TFLDialect::get(), d); } diff --git a/compiler/exo/src/Dialect/IR/TFLNodeImpl.h b/compiler/exo/src/Dialect/IR/TFLNodeImpl.h index 6338827..2ec94a2 100644 --- a/compiler/exo/src/Dialect/IR/TFLNodeImpl.h +++ b/compiler/exo/src/Dialect/IR/TFLNodeImpl.h @@ -18,7 +18,6 @@ #define __LOCOEX_IR_TFLNODEIMPL_H__ #include "TFLNodes.h" -#include "TFLNodeVisitor.h" #include diff --git a/compiler/exo/src/Dialect/IR/TFLNodeVisitor.h b/compiler/exo/src/Dialect/IR/TFLNodeVisitor.h index e1f5959..147b673 100644 --- a/compiler/exo/src/Dialect/IR/TFLNodeVisitor.h +++ b/compiler/exo/src/Dialect/IR/TFLNodeVisitor.h @@ -18,7 +18,6 @@ #define __LOCOEX_IR_TFLNODE_VISITOR_H__ #include "TFLNode.h" -#include "TFLNodes.h" #include diff --git a/compiler/exo/src/Dialect/IR/TFLNodes.h b/compiler/exo/src/Dialect/IR/TFLNodes.h index 5f521a0..41a11e7 100644 --- a/compiler/exo/src/Dialect/IR/TFLNodes.h +++ b/compiler/exo/src/Dialect/IR/TFLNodes.h @@ -183,7 +183,7 @@ public: void axis(uint32_t axis) { _axis = axis; } private: - uint32_t _axis; + uint32_t _axis{0}; }; /** @@ -540,7 +540,7 @@ public: Stride *stride(void) { return &_stride; } private: - Padding _padding; + Padding _padding{Padding::UNDEFINED}; Stride _stride; }; diff --git a/compiler/exo/src/Dialect/IR/TFLNodes.test.cpp b/compiler/exo/src/Dialect/IR/TFLNodes.test.cpp index 09c5c83..f17898b 100644 --- a/compiler/exo/src/Dialect/IR/TFLNodes.test.cpp +++ b/compiler/exo/src/Dialect/IR/TFLNodes.test.cpp @@ -25,11 +25,11 @@ TEST(TFLAddTest, constructor) { locoex::TFLAdd add_node; - ASSERT_EQ(add_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(add_node.opcode(), locoex::TFLOpcode::ADD); + ASSERT_EQ(locoex::TFLDialect::get(), add_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::ADD, add_node.opcode()); - ASSERT_EQ(add_node.x(), nullptr); - ASSERT_EQ(add_node.y(), nullptr); + ASSERT_EQ(nullptr, add_node.x()); + ASSERT_EQ(nullptr, add_node.y()); } // TODO TFLAveragePool2D @@ -38,14 +38,14 @@ TEST(TFLConcatTest, constructor) { locoex::TFLConcatenation concat_node(3); - ASSERT_EQ(concat_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(concat_node.opcode(), locoex::TFLOpcode::CONCATENATION); + ASSERT_EQ(locoex::TFLDialect::get(), concat_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::CONCATENATION, concat_node.opcode()); - ASSERT_EQ(concat_node.numValues(), 3); - ASSERT_EQ(concat_node.values(0), nullptr); - ASSERT_EQ(concat_node.values(1), nullptr); - ASSERT_EQ(concat_node.values(2), nullptr); - ASSERT_EQ(concat_node.fusedActivationFunction(), locoex::FusedActFunc::UNDEFINED); + ASSERT_EQ(3, concat_node.numValues()); + ASSERT_EQ(nullptr, concat_node.values(0)); + ASSERT_EQ(nullptr, concat_node.values(1)); + ASSERT_EQ(nullptr, concat_node.values(2)); + ASSERT_EQ(locoex::FusedActFunc::UNDEFINED, concat_node.fusedActivationFunction()); } // TODO TFLConv2D @@ -54,28 +54,28 @@ TEST(TFLDepthwiseConv2DTest, constructor) { locoex::TFLDepthwiseConv2D dw_conv2d_node; - ASSERT_EQ(dw_conv2d_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(dw_conv2d_node.opcode(), locoex::TFLOpcode::DEPTHWISE_CONV_2D); - - ASSERT_EQ(dw_conv2d_node.input(), nullptr); - ASSERT_EQ(dw_conv2d_node.filter(), nullptr); - ASSERT_EQ(dw_conv2d_node.bias(), nullptr); - ASSERT_EQ(dw_conv2d_node.padding(), locoex::Padding::UNDEFINED); - ASSERT_EQ(dw_conv2d_node.stride()->h(), 1); - ASSERT_EQ(dw_conv2d_node.stride()->w(), 1); - ASSERT_EQ(dw_conv2d_node.depthMultiplier(), 0); - ASSERT_EQ(dw_conv2d_node.fusedActivationFunction(), locoex::FusedActFunc::UNDEFINED); + ASSERT_EQ(locoex::TFLDialect::get(), dw_conv2d_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::DEPTHWISE_CONV_2D, dw_conv2d_node.opcode()); + + ASSERT_EQ(nullptr, dw_conv2d_node.input()); + ASSERT_EQ(nullptr, dw_conv2d_node.filter()); + ASSERT_EQ(nullptr, dw_conv2d_node.bias()); + ASSERT_EQ(locoex::Padding::UNDEFINED, dw_conv2d_node.padding()); + ASSERT_EQ(1, dw_conv2d_node.stride()->h()); + ASSERT_EQ(1, dw_conv2d_node.stride()->w()); + ASSERT_EQ(0, dw_conv2d_node.depthMultiplier()); + ASSERT_EQ(locoex::FusedActFunc::UNDEFINED, dw_conv2d_node.fusedActivationFunction()); } TEST(TFLDivTest, constructor) { locoex::TFLDiv div_node; - ASSERT_EQ(div_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(div_node.opcode(), locoex::TFLOpcode::DIV); + ASSERT_EQ(locoex::TFLDialect::get(), div_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::DIV, div_node.opcode()); - ASSERT_EQ(div_node.x(), nullptr); - ASSERT_EQ(div_node.y(), nullptr); + ASSERT_EQ(nullptr, div_node.x()); + ASSERT_EQ(nullptr, div_node.y()); } // TODO TFLMaxPool2D @@ -84,21 +84,21 @@ TEST(TFLMulTest, constructor) { locoex::TFLMul mul_node; - ASSERT_EQ(mul_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(mul_node.opcode(), locoex::TFLOpcode::MUL); + ASSERT_EQ(locoex::TFLDialect::get(), mul_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::MUL, mul_node.opcode()); - ASSERT_EQ(mul_node.x(), nullptr); - ASSERT_EQ(mul_node.y(), nullptr); + ASSERT_EQ(nullptr, mul_node.x()); + ASSERT_EQ(nullptr, mul_node.y()); } TEST(TFLReluTest, constructor) { locoex::TFLRelu relu_node; - ASSERT_EQ(relu_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(relu_node.opcode(), locoex::TFLOpcode::RELU); + ASSERT_EQ(locoex::TFLDialect::get(), relu_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::RELU, relu_node.opcode()); - ASSERT_EQ(relu_node.features(), nullptr); + ASSERT_EQ(nullptr, relu_node.features()); } // TODO TFLRelu6 @@ -107,12 +107,12 @@ TEST(TFLReshapeTest, constructor) { locoex::TFLReshape reshape; - ASSERT_EQ(reshape.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(reshape.opcode(), locoex::TFLOpcode::RESHAPE); + ASSERT_EQ(locoex::TFLDialect::get(), reshape.dialect()); + ASSERT_EQ(locoex::TFLOpcode::RESHAPE, reshape.opcode()); - ASSERT_EQ(reshape.tensor(), nullptr); - ASSERT_EQ(reshape.shape(), nullptr); - ASSERT_EQ(reshape.newShape()->rank(), 0); + ASSERT_EQ(nullptr, reshape.tensor()); + ASSERT_EQ(nullptr, reshape.shape()); + ASSERT_EQ(0, reshape.newShape()->rank()); } TEST(TFLReshapeTest, alloc_new_shape) @@ -120,14 +120,14 @@ TEST(TFLReshapeTest, alloc_new_shape) locoex::TFLReshape reshape; reshape.newShape()->rank(2); - ASSERT_EQ(reshape.newShape()->rank(), 2); + ASSERT_EQ(2, reshape.newShape()->rank()); reshape.newShape()->dim(0) = 0; reshape.newShape()->dim(1) = 1; auto &const_reshape = const_cast(reshape); - ASSERT_EQ(const_reshape.newShape()->dim(0), 0); - ASSERT_EQ(const_reshape.newShape()->dim(1), 1); + ASSERT_EQ(0, const_reshape.newShape()->dim(0)); + ASSERT_EQ(1, const_reshape.newShape()->dim(1)); } // TODO TFLSoftmax @@ -138,11 +138,11 @@ TEST(TFLSubTest, constructor) { locoex::TFLSub sub_node; - ASSERT_EQ(sub_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(sub_node.opcode(), locoex::TFLOpcode::SUB); + ASSERT_EQ(locoex::TFLDialect::get(), sub_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::SUB, sub_node.opcode()); - ASSERT_EQ(sub_node.x(), nullptr); - ASSERT_EQ(sub_node.y(), nullptr); + ASSERT_EQ(nullptr, sub_node.x()); + ASSERT_EQ(nullptr, sub_node.y()); } // TODO TFLTanh @@ -151,9 +151,9 @@ TEST(TFLTransposeTest, constructor) { locoex::TFLTranspose tr_node; - ASSERT_EQ(tr_node.dialect(), locoex::TFLDialect::get()); - ASSERT_EQ(tr_node.opcode(), locoex::TFLOpcode::TRANSPOSE); + ASSERT_EQ(locoex::TFLDialect::get(), tr_node.dialect()); + ASSERT_EQ(locoex::TFLOpcode::TRANSPOSE, tr_node.opcode()); - ASSERT_EQ(tr_node.a(), nullptr); - ASSERT_EQ(tr_node.perm(), nullptr); + ASSERT_EQ(nullptr, tr_node.a()); + ASSERT_EQ(nullptr, tr_node.perm()); } diff --git a/compiler/exo/src/Dialect/Service/CircleTypeInferenceRule.cpp b/compiler/exo/src/Dialect/Service/CircleTypeInferenceRule.cpp index 6bc95a1..dd64eac 100644 --- a/compiler/exo/src/Dialect/Service/CircleTypeInferenceRule.cpp +++ b/compiler/exo/src/Dialect/Service/CircleTypeInferenceRule.cpp @@ -49,7 +49,7 @@ bool CircleTypeInferenceRule::infer(const loco::Node *node, loco::DataType &dtyp TypeInferenceAlgorithm alg; - dtype = dynamic_cast(node)->accept(&alg); + dtype = loco::must_cast(node)->accept(&alg); assert(dtype != loco::DataType::Unknown); return true; diff --git a/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.test.cpp b/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.test.cpp index 35c8f0b..b68728b 100644 --- a/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.test.cpp +++ b/compiler/exo/src/Dialect/Service/TFLShapeInferenceRule.test.cpp @@ -60,12 +60,12 @@ TEST(TFLShapeInferenceRuleTest, minimal_with_TFLRelu) // Verify { ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(tfl_node).domain()); auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 2); - ASSERT_EQ(shape.dim(0), 3); - ASSERT_EQ(shape.dim(1), 4); + ASSERT_EQ(2, shape.rank()); + ASSERT_EQ(3, shape.dim(0)); + ASSERT_EQ(4, shape.dim(1)); } } @@ -105,14 +105,14 @@ TEST(TFLShapeInferenceRuleTest, avgpool2d_valid) // Verify { ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(tfl_node).domain()); auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 4); - ASSERT_EQ(shape.dim(0).value(), 1); - ASSERT_EQ(shape.dim(1).value(), 2); - ASSERT_EQ(shape.dim(2).value(), 1); - ASSERT_EQ(shape.dim(3).value(), 1); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0).value()); + ASSERT_EQ(2, shape.dim(1).value()); + ASSERT_EQ(1, shape.dim(2).value()); + ASSERT_EQ(1, shape.dim(3).value()); } } @@ -152,14 +152,14 @@ TEST(TFLShapeInferenceRuleTest, avgpool2d_same) // Verify { ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(tfl_node).domain()); auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 4); - ASSERT_EQ(shape.dim(0).value(), 1); - ASSERT_EQ(shape.dim(1).value(), 2); - ASSERT_EQ(shape.dim(2).value(), 2); - ASSERT_EQ(shape.dim(3).value(), 1); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0).value()); + ASSERT_EQ(2, shape.dim(1).value()); + ASSERT_EQ(2, shape.dim(2).value()); + ASSERT_EQ(1, shape.dim(3).value()); } } @@ -227,13 +227,13 @@ TEST(TFLShapeInferenceRuleTest, TFAdd_shapeinf_different) // Verify { ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(tfl_node).domain()); auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 3); - ASSERT_EQ(shape.dim(0), 2); - ASSERT_EQ(shape.dim(1), 3); - ASSERT_EQ(shape.dim(2), 5); + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(2, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + ASSERT_EQ(5, shape.dim(2)); } } @@ -268,10 +268,10 @@ TEST(TFLShapeInferenceRuleTest, TFLTranspose_simple) ASSERT_TRUE(loco::shape_known(g.tfl_transpose)); auto shape = loco::shape_get(g.tfl_transpose).as(); - ASSERT_EQ(shape.rank(), 4); - ASSERT_EQ(shape.dim(0), 30); - ASSERT_EQ(shape.dim(1), 40); - ASSERT_EQ(shape.dim(2), 10); - ASSERT_EQ(shape.dim(3), 20); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(30, shape.dim(0)); + ASSERT_EQ(40, shape.dim(1)); + ASSERT_EQ(10, shape.dim(2)); + ASSERT_EQ(20, shape.dim(3)); } } diff --git a/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.cpp b/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.cpp index 3f123a6..b0fecff 100644 --- a/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.cpp +++ b/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.cpp @@ -132,7 +132,7 @@ bool TFLTypeInferenceRule::infer(const loco::Node *node, loco::DataType &dtype) TypeInferenceAlgorithm alg; - dtype = dynamic_cast(node)->accept(&alg); + dtype = loco::must_cast(node)->accept(&alg); assert(dtype != loco::DataType::Unknown); return true; diff --git a/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.test.cpp b/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.test.cpp index dd1f93c..9326e5e 100644 --- a/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.test.cpp +++ b/compiler/exo/src/Dialect/Service/TFLTypeInferenceRule.test.cpp @@ -53,5 +53,5 @@ TEST(TFLTypeInferenceRuleTest, minimal_with_TFLRelu) // Verify ASSERT_TRUE(loco::dtype_known(tfl_node)); auto type = loco::dtype_get(tfl_node); - ASSERT_EQ(type, loco::DataType::S32); + ASSERT_EQ(loco::DataType::S32, type); } diff --git a/compiler/exo/src/Pass/FuseBiasAddPass.cpp b/compiler/exo/src/Pass/FuseBiasAddPass.cpp index aab8209..6338dff 100644 --- a/compiler/exo/src/Pass/FuseBiasAddPass.cpp +++ b/compiler/exo/src/Pass/FuseBiasAddPass.cpp @@ -166,7 +166,7 @@ template locoex::TFLConst *Fuser::create_fused_bias_con { // we have to create a new bias const by adding/substracting bias and const node (of TFLAdd or // TFLSub) - auto bias = dynamic_cast(_former->bias()); + auto bias = loco::must_cast(_former->bias()); assert(bias->dtype() == loco::DataType::FLOAT32 && _const_node->dtype() == loco::DataType::FLOAT32); @@ -344,7 +344,7 @@ bool FuseBiasAddPass::run(loco::Graph *g) { if (node->dialect() == locoex::TFLDialect::get()) { - auto tfl_node = dynamic_cast(node); + auto tfl_node = loco::must_cast(node); tfl_node->accept(&collector); } } diff --git a/compiler/exo/src/Pass/FuseBiasAddPass.test.cpp b/compiler/exo/src/Pass/FuseBiasAddPass.test.cpp index 6ba728d..c464d76 100644 --- a/compiler/exo/src/Pass/FuseBiasAddPass.test.cpp +++ b/compiler/exo/src/Pass/FuseBiasAddPass.test.cpp @@ -263,8 +263,8 @@ TEST(FuseBiasAddPassTest, Conv2D_Sub_02_fusing_will_not_performed) ASSERT_TRUE(a_bias != nullptr); ASSERT_TRUE(a_bias->dim(0) == 2); - ASSERT_FLOAT_EQ(a_bias->at(0), 0); - ASSERT_FLOAT_EQ(a_bias->at(1), 0); + ASSERT_FLOAT_EQ(0, a_bias->at(0)); + ASSERT_FLOAT_EQ(0, a_bias->at(1)); auto a_sub = exo::test::find_first_node_bytype(g.graph()); ASSERT_TRUE(a_sub != nullptr); diff --git a/compiler/exo/src/Pass/FuseReluPass.cpp b/compiler/exo/src/Pass/FuseReluPass.cpp index d7af0c5..ae430bc 100644 --- a/compiler/exo/src/Pass/FuseReluPass.cpp +++ b/compiler/exo/src/Pass/FuseReluPass.cpp @@ -97,7 +97,7 @@ bool FuseReluPass::run(loco::Graph *g) { if (node->dialect() == locoex::TFLDialect::get()) { - auto tfl_node = dynamic_cast(node); + auto tfl_node = loco::must_cast(node); tfl_node->accept(&collector); } } diff --git a/compiler/exo/src/TFLite/TFLExporterImpl.test.cpp b/compiler/exo/src/TFLite/TFLExporterImpl.test.cpp index 7d74223..866ede6 100644 --- a/compiler/exo/src/TFLite/TFLExporterImpl.test.cpp +++ b/compiler/exo/src/TFLite/TFLExporterImpl.test.cpp @@ -221,18 +221,18 @@ TEST(TFLExporterImplTest, Transpose_simple) auto perm = operators->Get(n)->inputs()->Get(1); auto perm_tensor = model->subgraphs()->Get(0)->tensors()->Get(perm); - ASSERT_EQ(perm_tensor->type(), tflite::TensorType::TensorType_INT32); - ASSERT_EQ(perm_tensor->shape()->size(), 1); - ASSERT_EQ(perm_tensor->shape()->Get(0), 4); + ASSERT_EQ(tflite::TensorType::TensorType_INT32, perm_tensor->type()); + ASSERT_EQ(1, perm_tensor->shape()->size()); + ASSERT_EQ(4, perm_tensor->shape()->Get(0)); auto bufs = (model->buffers()); auto *perm_buf = reinterpret_cast(bufs->Get(perm_tensor->buffer())->data()->data()); - ASSERT_EQ(perm_buf[0], 1); - ASSERT_EQ(perm_buf[1], 2); - ASSERT_EQ(perm_buf[2], 3); - ASSERT_EQ(perm_buf[3], 0); + ASSERT_EQ(1, perm_buf[0]); + ASSERT_EQ(2, perm_buf[1]); + ASSERT_EQ(3, perm_buf[2]); + ASSERT_EQ(0, perm_buf[3]); } } @@ -279,17 +279,17 @@ TEST(TFLExporterImplTest, Transpose_from_FilterEncode_FilterDecode) auto perm = operators->Get(n)->inputs()->Get(1); auto perm_tensor = model->subgraphs()->Get(0)->tensors()->Get(perm); - ASSERT_EQ(perm_tensor->type(), tflite::TensorType::TensorType_INT32); - ASSERT_EQ(perm_tensor->shape()->size(), 1); - ASSERT_EQ(perm_tensor->shape()->Get(0), 4); + ASSERT_EQ(tflite::TensorType::TensorType_INT32, perm_tensor->type()); + ASSERT_EQ(1, perm_tensor->shape()->size()); + ASSERT_EQ(4, perm_tensor->shape()->Get(0)); auto bufs = (model->buffers()); auto *perm_buf = reinterpret_cast(bufs->Get(perm_tensor->buffer())->data()->data()); - ASSERT_EQ(perm_buf[0], 3); - ASSERT_EQ(perm_buf[1], 0); - ASSERT_EQ(perm_buf[2], 1); - ASSERT_EQ(perm_buf[3], 2); + ASSERT_EQ(3, perm_buf[0]); + ASSERT_EQ(0, perm_buf[1]); + ASSERT_EQ(1, perm_buf[2]); + ASSERT_EQ(2, perm_buf[3]); } } @@ -317,8 +317,8 @@ TEST_F(TFLExporterImplTests, Regression_0000) auto decode = exo::make_feature_decode(relu); auto push = make_node(); - ASSERT_EQ(maxpool->window()->vertical(), 1); - ASSERT_EQ(maxpool->window()->horizontal(), 1); + ASSERT_EQ(1, maxpool->window()->vertical()); + ASSERT_EQ(1, maxpool->window()->horizontal()); maxpool->ifm(encode); relu->input(maxpool); @@ -350,11 +350,11 @@ TEST_F(TFLExporterImplTests, Regression_0000) switch (model->operator_codes()->Get(opcode_index)->builtin_code()) { case tflite::BuiltinOperator_RELU: - ASSERT_EQ(relu_exeuction_index, -1); + ASSERT_EQ(-1, relu_exeuction_index); relu_exeuction_index = static_cast(n); break; case tflite::BuiltinOperator_MAX_POOL_2D: - ASSERT_EQ(maxpool_execution_index, -1); + ASSERT_EQ(-1, maxpool_execution_index); maxpool_execution_index = static_cast(n); break; default: @@ -397,17 +397,17 @@ TEST_F(TFLExporterImplTests, Regression_0001) auto buffers = model->buffers(); // 0'th empty buffer + ConstGen data + ConstGen node output - ASSERT_EQ(buffers->Length(), 3); + ASSERT_EQ(3, buffers->Length()); // 0'th should be empty buffer auto buffer_0 = (*buffers)[0]; auto array_0 = buffer_0->data(); - ASSERT_EQ(array_0, nullptr); + ASSERT_EQ(nullptr, array_0); // 1'st should be ConstGen data which is two float auto buffer_1 = (*buffers)[1]; auto array_1 = buffer_1->data(); size_t size_1 = array_1->size(); - ASSERT_EQ(size_1, 2 * sizeof(float)); + ASSERT_EQ(2 * sizeof(float), size_1); } } diff --git a/compiler/exo/src/TFLite/TFLExporterUtils.test.cpp b/compiler/exo/src/TFLite/TFLExporterUtils.test.cpp index d19f87d..ec9714d 100644 --- a/compiler/exo/src/TFLite/TFLExporterUtils.test.cpp +++ b/compiler/exo/src/TFLite/TFLExporterUtils.test.cpp @@ -46,7 +46,7 @@ TEST(ExporterUtilsTests, getOpPadding) ofm._dims[1] = 2; ofm._dims[2] = 2; - ASSERT_EQ(getOpPadding(&pad, &stride, ifm, ofm), tflite::Padding_VALID); + ASSERT_EQ(tflite::Padding_VALID, getOpPadding(&pad, &stride, ifm, ofm)); } // SAME padding @@ -65,7 +65,7 @@ TEST(ExporterUtilsTests, getOpPadding) ofm._dims[1] = 3; ofm._dims[2] = 3; - ASSERT_EQ(getOpPadding(&pad, &stride, ifm, ofm), tflite::Padding_SAME); + ASSERT_EQ(tflite::Padding_SAME, getOpPadding(&pad, &stride, ifm, ofm)); } // Custom padding 1 - Not supported by tflite diff --git a/compiler/exo/src/TFLite/TFLTensorExporter.cpp b/compiler/exo/src/TFLite/TFLTensorExporter.cpp index 66854ef..23c810e 100644 --- a/compiler/exo/src/TFLite/TFLTensorExporter.cpp +++ b/compiler/exo/src/TFLite/TFLTensorExporter.cpp @@ -60,8 +60,8 @@ public: private: std::string _name; - tflite::TensorType _dtype; - ShapeDescription _shape; + tflite::TensorType _dtype{TensorType_FLOAT32}; + ShapeDescription _shape{}; // TODO Find a better design loco::ConstGen *_content = nullptr; // TODO deprecate @@ -80,7 +80,7 @@ struct NoOpDetector final : public loco::CanonicalNodeMutableVisitor bool visit(loco::FilterEncode *node) final { - auto encoder = dynamic_cast *>(node->encoder()); + auto encoder = loco::must_cast *>(node->encoder()); auto perm = encoder->perm(); return isNHWC(perm); @@ -88,14 +88,16 @@ struct NoOpDetector final : public loco::CanonicalNodeMutableVisitor bool visit(loco::FeatureEncode *node) final { - auto encoder = dynamic_cast *>(node->encoder()); + auto encoder = + loco::must_cast *>(node->encoder()); auto perm = encoder->perm(); return isNHWC(perm); } bool visit(loco::FeatureDecode *node) final { - auto decoder = dynamic_cast *>(node->decoder()); + auto decoder = + loco::must_cast *>(node->decoder()); auto perm = decoder->perm(); return isNHWC(perm); } @@ -133,7 +135,8 @@ void allocateTFLiteTensor(loco::Node *node, TFLTensorContext &ctx) tensor_info.dtype(TypeInference::get(node)); tensor_info.shape(ShapeInference::get(node)); - tensor_info.tfl_content(dynamic_cast(node)); + if (auto const_node = dynamic_cast(node)) + tensor_info.tfl_content(const_node); set_tensor_index(node, tensor_index); diff --git a/compiler/exo/src/TFLite/TFLTypeInference.test.cpp b/compiler/exo/src/TFLite/TFLTypeInference.test.cpp index 0712f0a..8a3a08d 100644 --- a/compiler/exo/src/TFLite/TFLTypeInference.test.cpp +++ b/compiler/exo/src/TFLite/TFLTypeInference.test.cpp @@ -91,7 +91,7 @@ private: private: loco::Graph _graph; - loco::Node *_last; + loco::Node *_last{nullptr}; }; struct TypeInferenceTest : public Sequential, public ::testing::Test @@ -113,6 +113,6 @@ TEST_F(TypeInferenceTest, Regression_0000) TypeInferencePass type_inf_pass; type_inf_pass.run(graph()); - ASSERT_EQ(TypeInference::get(relu), tflite::TensorType_INT8); - ASSERT_EQ(TypeInference::get(push), tflite::TensorType_INT8); + ASSERT_EQ(tflite::TensorType_INT8, TypeInference::get(relu)); + ASSERT_EQ(tflite::TensorType_INT8, TypeInference::get(push)); } diff --git a/compiler/fipe/README.md b/compiler/fipe/README.md new file mode 100644 index 0000000..7f3c74a --- /dev/null +++ b/compiler/fipe/README.md @@ -0,0 +1 @@ +# fipe diff --git a/compiler/foder/CMakeLists.txt b/compiler/foder/CMakeLists.txt new file mode 100644 index 0000000..6a413c6 --- /dev/null +++ b/compiler/foder/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(foder INTERFACE) +target_include_directories(foder INTERFACE include) diff --git a/compiler/foder/README.md b/compiler/foder/README.md new file mode 100644 index 0000000..2bb1635 --- /dev/null +++ b/compiler/foder/README.md @@ -0,0 +1,13 @@ +# foder + +_foder_ is a header only library that loads files. + +## Example + +```cpp +foder::FileLoader fileloader{input_path}; + +std::vector data = fileloader.load(); + +DO_SOMETHING_WITH(data); +``` diff --git a/compiler/foder/include/foder/FileLoader.h b/compiler/foder/include/foder/FileLoader.h new file mode 100644 index 0000000..e2143ec --- /dev/null +++ b/compiler/foder/include/foder/FileLoader.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +namespace foder +{ + +class FileLoader +{ +private: + using DataBuffer = std::vector; + +public: + explicit FileLoader(const std::string &path) : _path(path) {} + +public: + FileLoader(const FileLoader &) = delete; + FileLoader(FileLoader &&) = delete; + +public: + DataBuffer load(void) const + { + std::ifstream file(_path, std::ios::binary | std::ios::in); + if (!file.good()) + { + std::string errmsg = "ERROR: Failed to open file: " + _path; + throw std::runtime_error(errmsg.c_str()); + } + + file.unsetf(std::ios::skipws); + + file.seekg(0, std::ios::end); + auto fileSize = file.tellg(); + file.seekg(0, std::ios::beg); + + // reserve capacity + DataBuffer data(fileSize); + + // read the data + file.read(data.data(), fileSize); + if (file.fail()) + { + std::string errmsg = "ERROR: Failed to read file: " + _path; + throw std::runtime_error(errmsg.c_str()); + } + + return data; + } + +private: + const std::string _path; +}; + +} // namespace foder diff --git a/compiler/gen-core/CMakeLists.txt b/compiler/gen-core/CMakeLists.txt index 3732f49..3cee4ce 100644 --- a/compiler/gen-core/CMakeLists.txt +++ b/compiler/gen-core/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(HDF5 COMPONENTS CXX QUIET) +nnas_find_package(HDF5 QUIET) if(NOT HDF5_FOUND) return() diff --git a/compiler/i5diff/CMakeLists.txt b/compiler/i5diff/CMakeLists.txt index 321ae49..c310a66 100644 --- a/compiler/i5diff/CMakeLists.txt +++ b/compiler/i5diff/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(HDF5 COMPONENTS CXX QUIET) +nnas_find_package(HDF5 QUIET) if(NOT HDF5_FOUND) return() diff --git a/compiler/imgdata2hdf5/CMakeLists.txt b/compiler/imgdata2hdf5/CMakeLists.txt new file mode 100644 index 0000000..e2d9154 --- /dev/null +++ b/compiler/imgdata2hdf5/CMakeLists.txt @@ -0,0 +1,13 @@ +set(imgdata2hdf5_FILE "imgdata2hdf5.py") +set(imgdata2hdf5_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${imgdata2hdf5_FILE}") +set(imgdata2hdf5_BIN "${CMAKE_CURRENT_BINARY_DIR}/${imgdata2hdf5_FILE}") + +add_custom_command(OUTPUT ${imgdata2hdf5_BIN} + COMMAND ${CMAKE_COMMAND} -E copy "${imgdata2hdf5_SRC}" "${imgdata2hdf5_BIN}" + DEPENDS ${imgdata2hdf5_SRC} + COMMENT "Generate ${imgdata2hdf5_BIN}" + ) + +add_custom_target(imgdata2hdf5 ALL DEPENDS ${imgdata2hdf5_BIN}) + +install(FILES ${imgdata2hdf5_BIN} DESTINATION bin) diff --git a/compiler/imgdata2hdf5/README.md b/compiler/imgdata2hdf5/README.md new file mode 100644 index 0000000..54743e0 --- /dev/null +++ b/compiler/imgdata2hdf5/README.md @@ -0,0 +1,24 @@ +# imgdata2hdf5 + +_imgdata2hdf5_ is a tool to convert raw image data (assumed to be pre-processed) to an hdf5 file. + +## Prerequisite +- Raw image data pre-processed for the corresponding DNN model +- List of data to convert (saved in the text file) +- Python installed with _numpy_ and _h5py_ (See docs/how-to-prepare-virtualenv.txt) + +## Example +``` +python imgdata2hdf5.py \ +> --data_list=tmp/imgdata/datalist.txt +> --output_path=tmp/imgdata/imgdata.hdf5 +``` + +## Arguments +``` + -h, --help Show this help message and exit + -l DATA_LIST, --data_list DATA_LIST + Path to the text file which lists the absolute paths of the raw image data files to be converted. + -o OUTPUT_PATH, --output_path OUTPUT_PATH + Path to the output hdf5 file. +``` diff --git a/compiler/imgdata2hdf5/imgdata2hdf5.py b/compiler/imgdata2hdf5/imgdata2hdf5.py new file mode 100755 index 0000000..1ff912a --- /dev/null +++ b/compiler/imgdata2hdf5/imgdata2hdf5.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +import h5py as h5 +import numpy as np +import argparse +import glob +import os + +parser = argparse.ArgumentParser() +parser.add_argument( + "-l", + "--data_list", + type=str, + help= + "Path to the text file which lists the absolute paths of the raw image data files to be converted.", + required=True) +parser.add_argument( + "-o", "--output_path", type=str, help="Path to the output hdf5 file.", required=True) + +args = parser.parse_args() +data_list = args.data_list +output_path = args.output_path + +# Create h5 file +h5_file = h5.File(output_path, 'w') +group = h5_file.create_group("value") +# We assume the raw input data have the correct type/shape for the corresponding model +# If this flag is set in the hdf5 file, record-minmax will skip type/shape check +group.attrs['rawData'] = '1' + +if os.path.isfile(data_list) == False: + raise SystemExit("No such file. " + data_list) + +# Data list +datalist = [] +with open(data_list, 'r') as f: + lines = f.readlines() + for line in lines: + if line.strip(): + filename = line.rstrip() + if os.path.isfile(filename): + datalist.append(filename) + else: + raise SystemExit("No such file. " + filename) + +# Input files +num_converted = 0 +for imgdata in datalist: + with open(imgdata, 'rb') as f: + sample = group.create_group(str(num_converted)) + num_converted += 1 + filename = os.path.basename(imgdata) + sample.attrs['desc'] = filename + raw_data = bytearray(f.read()) + # The target model is DNN for handling an input image + sample.create_dataset('0', data=raw_data) + +h5_file.close() + +print("Raw image data have been packaged to " + output_path) +print("Number of packaged data: " + str(num_converted)) diff --git a/compiler/loco/include/loco/IR/CastHelpers.h b/compiler/loco/include/loco/IR/CastHelpers.h new file mode 100644 index 0000000..0dcd92d --- /dev/null +++ b/compiler/loco/include/loco/IR/CastHelpers.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOCO_IR_CAST_HELPERS_H__ +#define __LOCO_IR_CAST_HELPERS_H__ + +#include +#include +#include + +namespace loco +{ + +// TODO move to somewhere appropriate +template T _must_cast(ARG arg) +{ + auto cast_arg = dynamic_cast(arg); + if (cast_arg == nullptr) + { + std::string msg = "loco::must_cast() failed to cast: "; + msg += typeid(T).name(); + throw std::invalid_argument(msg.c_str()); + } + return cast_arg; +} + +} // namespace loco + +#endif // __LOCO_IR_CAST_HELPERS_H__ diff --git a/compiler/loco/include/loco/IR/DataTypeTraits.h b/compiler/loco/include/loco/IR/DataTypeTraits.h index c4479e5..c186300 100644 --- a/compiler/loco/include/loco/IR/DataTypeTraits.h +++ b/compiler/loco/include/loco/IR/DataTypeTraits.h @@ -46,18 +46,43 @@ template <> struct DataTypeImpl using Type = uint8_t; }; +template <> struct DataTypeImpl +{ + // Use C++ int16_t type for 16bit integer + using Type = int16_t; +}; + template <> struct DataTypeImpl { // Use C++ int32_t type for 32bit integer using Type = int32_t; }; +template <> struct DataTypeImpl +{ + // Use C++ uint32_t type for unsigned 32bit integer + using Type = uint32_t; +}; + +template <> struct DataTypeImpl +{ + // Use C++ int64_t type for 64bit integer + using Type = int64_t; +}; + template <> struct DataTypeImpl { // Use C++ float type for IEEE 32-bit floating-point numbers using Type = float; }; +// NOTE DataTypeImpl for BOOL is subject to change +template <> struct DataTypeImpl +{ + // Use C++ uint8_t type for bool + using Type = uint8_t; +}; + /** * @brief Returns the size of the data type. * @note If you need the size at compile time, use `sizeof(typename DataTypeImpl
::Type)`. @@ -70,10 +95,18 @@ inline uint32_t size(DataType data_type) return sizeof(DataTypeImpl::Type); case DataType::U8: return sizeof(DataTypeImpl::Type); + case DataType::S16: + return sizeof(DataTypeImpl::Type); case DataType::S32: return sizeof(DataTypeImpl::Type); + case DataType::U32: + return sizeof(DataTypeImpl::Type); + case DataType::S64: + return sizeof(DataTypeImpl::Type); case DataType::FLOAT32: return sizeof(DataTypeImpl::Type); + case DataType::BOOL: + return sizeof(DataTypeImpl::Type); default: // TODO Support remaining data types. assert(false); diff --git a/compiler/loco/include/loco/IR/Dimension.h b/compiler/loco/include/loco/IR/Dimension.h index 7b5d594..a939f1a 100644 --- a/compiler/loco/include/loco/IR/Dimension.h +++ b/compiler/loco/include/loco/IR/Dimension.h @@ -36,18 +36,18 @@ private: }; public: - // @brief Construct an "unknown" dimension + /// @brief Construct an "unknown" dimension Dimension() = default; - // @brief Construct a "known" dimension + /// @brief Construct a "known" dimension Dimension(uint32_t value) { set(value); } public: - // @brief Return whether the value is known (or not) + /// @brief Return whether the value is known (or not) bool known(void) const { return _kind == Kind::Known; } - // @brief Return the value - // @note This value is meaningful only for known dimension + /// @brief Return the value + /// @note This value is meaningful only for known dimension uint32_t value(void) const { return _value; } void set(uint32_t value) @@ -77,7 +77,7 @@ bool operator==(const Dimension &, const Dimension &); bool operator==(const Dimension &, uint32_t); bool operator==(uint32_t, const Dimension &); -// @brief Make an "unknown" dimension +/// @brief Make an "unknown" dimension Dimension make_dimension(void); } // namespace loco diff --git a/compiler/loco/include/loco/IR/FeatureCodec.h b/compiler/loco/include/loco/IR/FeatureCodec.h index 93094e1..c5c4656 100644 --- a/compiler/loco/include/loco/IR/FeatureCodec.h +++ b/compiler/loco/include/loco/IR/FeatureCodec.h @@ -23,6 +23,8 @@ #include "loco/IR/TensorShape.h" #include "loco/IR/TensorIndex.h" +#include "loco/IR/CastHelpers.h" + #include namespace loco @@ -72,6 +74,29 @@ struct FeatureDecoder virtual std::unique_ptr clone(void) const = 0; }; +/** + * @brief A helper dynamic_cast that throws when failed + */ +template T must_cast(FeatureEncoder *node) +{ + return _must_cast(node); +} + +template T must_cast(const FeatureEncoder *node) +{ + return _must_cast(node); +} + +template T must_cast(FeatureDecoder *node) +{ + return _must_cast(node); +} + +template T must_cast(const FeatureDecoder *node) +{ + return _must_cast(node); +} + } // namespace loco #endif // __LOCO_IR_FEATURE_CODEC_H__ diff --git a/compiler/loco/include/loco/IR/FilterCodec.h b/compiler/loco/include/loco/IR/FilterCodec.h index 3ff548d..cf13dee 100644 --- a/compiler/loco/include/loco/IR/FilterCodec.h +++ b/compiler/loco/include/loco/IR/FilterCodec.h @@ -23,6 +23,8 @@ #include "loco/IR/TensorShape.h" #include "loco/IR/TensorIndex.h" +#include "loco/IR/CastHelpers.h" + namespace loco { @@ -56,6 +58,21 @@ struct FilterDecoder virtual FilterIndex value(const TensorIndex &index) const = 0; }; +/** + * @brief A helper dynamic_cast that throws when failed + */ +template T must_cast(FilterEncoder *node) +{ + return _must_cast(node); +} + +template T must_cast(const FilterEncoder *node) +{ + return _must_cast(node); +} + +// TODO add must_cast for FilterDecoder + } // namespace loco #endif // __LOCO_IR_FILTER_CODEC_H__ diff --git a/compiler/loco/include/loco/IR/Node.h b/compiler/loco/include/loco/IR/Node.h index ef0bf23..28689b7 100644 --- a/compiler/loco/include/loco/IR/Node.h +++ b/compiler/loco/include/loco/IR/Node.h @@ -23,6 +23,7 @@ #include "loco/IR/Dialect.h" #include "loco/IR/NodePool.forward.h" #include "loco/IR/Graph.forward.h" +#include "loco/IR/CastHelpers.h" #include #include @@ -142,6 +143,13 @@ private: Subst replace(Node *node); +/** + * @brief A helper dynamic_cast that throws when failed + */ +template T must_cast(Node *node) { return _must_cast(node); } + +template T must_cast(const Node *node) { return _must_cast(node); } + } // namespace loco #endif // __LOCO_IR_NODE_H__ diff --git a/compiler/loco/include/loco/IR/Nodes.h b/compiler/loco/include/loco/IR/Nodes.h index 9aac48b..fecfad2 100644 --- a/compiler/loco/include/loco/IR/Nodes.h +++ b/compiler/loco/include/loco/IR/Nodes.h @@ -632,7 +632,7 @@ public: private: TensorAxisSet _axes; - ReduceFunc _func; + ReduceFunc _func{ReduceFunc::Mean}; }; /** diff --git a/compiler/loco/include/loco/IR/TensorShape.h b/compiler/loco/include/loco/IR/TensorShape.h index af1066d..44eca67 100644 --- a/compiler/loco/include/loco/IR/TensorShape.h +++ b/compiler/loco/include/loco/IR/TensorShape.h @@ -57,6 +57,11 @@ private: */ uint32_t element_count(const loco::TensorShape *tensor_shape); +/** + * @brief '==' operator for TensorShape + */ +bool operator==(const TensorShape &lhs, const TensorShape &rhs); + } // namespace loco #endif // __LOCO_IR_TENSOR_SHAPE_H__ diff --git a/compiler/loco/src/ADT/AnnotatedItem.test.cpp b/compiler/loco/src/ADT/AnnotatedItem.test.cpp index 42113ff..45ca87d 100644 --- a/compiler/loco/src/ADT/AnnotatedItem.test.cpp +++ b/compiler/loco/src/ADT/AnnotatedItem.test.cpp @@ -41,15 +41,15 @@ TEST(AnnotatedItemTest, annotation) { loco::AnnotatedItem<::Annotation> item; - ASSERT_EQ(item.annot>(), nullptr); + ASSERT_EQ(nullptr, item.annot>()); item.annot(DerivedAnnotation<0>::make()); ASSERT_NE(item.annot>(), nullptr); - ASSERT_EQ(item.annot>(), nullptr); + ASSERT_EQ(nullptr, item.annot>()); item.annot>(nullptr); - ASSERT_EQ(item.annot>(), nullptr); + ASSERT_EQ(nullptr, item.annot>()); // Below check guarantees that "annot(nullptr)" is allowed even when there is no annotation. // This guarantee allows us to simplify code for some cases. diff --git a/compiler/loco/src/IR/Algorithm.test.cpp b/compiler/loco/src/IR/Algorithm.test.cpp index f0a3585..c60ae14 100644 --- a/compiler/loco/src/IR/Algorithm.test.cpp +++ b/compiler/loco/src/IR/Algorithm.test.cpp @@ -50,9 +50,9 @@ TEST(AlgorithmTest, postorder_traversal) auto seq = loco::postorder_traversal({push}); - ASSERT_EQ(seq.size(), 2); - ASSERT_EQ(seq.at(0), pull_1); - ASSERT_EQ(seq.at(1), push); + ASSERT_EQ(2, seq.size()); + ASSERT_EQ(pull_1, seq.at(0)); + ASSERT_EQ(push, seq.at(1)); } TEST(AlgorithmTest, postorder_traversal_visit_once) @@ -74,7 +74,7 @@ TEST(AlgorithmTest, postorder_traversal_visit_once) auto seq = loco::postorder_traversal({push_1, push_2}); - ASSERT_EQ(seq.size(), 3); + ASSERT_EQ(3, seq.size()); ASSERT_TRUE(contains(seq, pull)); ASSERT_TRUE(contains(seq, push_1)); ASSERT_TRUE(contains(seq, push_2)); @@ -97,9 +97,9 @@ TEST(AlgorithmTest, postorder_traversal_incomplte_graph) auto seq = loco::postorder_traversal({concat}); - ASSERT_EQ(seq.size(), 2); - ASSERT_EQ(seq.at(0), pull); - ASSERT_EQ(seq.at(1), concat); + ASSERT_EQ(2, seq.size()); + ASSERT_EQ(pull, seq.at(0)); + ASSERT_EQ(concat, seq.at(1)); } TEST(AlgorithmTest, active_nodes) @@ -116,7 +116,7 @@ TEST(AlgorithmTest, active_nodes) auto s = loco::active_nodes({push}); - ASSERT_EQ(s.size(), 2); + ASSERT_EQ(2, s.size()); ASSERT_TRUE(contains(s, pull)); ASSERT_TRUE(contains(s, push)); } diff --git a/compiler/loco/src/IR/CanonicalDialect.test.cpp b/compiler/loco/src/IR/CanonicalDialect.test.cpp index 96b4821..e479aed 100644 --- a/compiler/loco/src/IR/CanonicalDialect.test.cpp +++ b/compiler/loco/src/IR/CanonicalDialect.test.cpp @@ -25,5 +25,5 @@ TEST(CanonicalDialectTest, get) // get() SHOULD return a valid(non-null) pointer ASSERT_NE(d, nullptr); // The return value SHOULD be stable across multiple invocations - ASSERT_EQ(d, loco::CanonicalDialect::get()); + ASSERT_EQ(loco::CanonicalDialect::get(), d); } diff --git a/compiler/loco/src/IR/CanonicalNode.test.cpp b/compiler/loco/src/IR/CanonicalNode.test.cpp index cb61b5e..dddb158 100644 --- a/compiler/loco/src/IR/CanonicalNode.test.cpp +++ b/compiler/loco/src/IR/CanonicalNode.test.cpp @@ -34,8 +34,8 @@ TEST(CanonicalNodeTest, visitor_with_user_default_impl) MyVisitor v; - ASSERT_EQ(forward.accept(&v), 128); - ASSERT_EQ(constgen.accept(&v), 256); + ASSERT_EQ(128, forward.accept(&v)); + ASSERT_EQ(256, constgen.accept(&v)); } TEST(CanonicalNodeTest, visitor) @@ -50,7 +50,7 @@ TEST(CanonicalNodeTest, visitor) CountingVisitor v; - ASSERT_EQ(node.accept(&v), 1); + ASSERT_EQ(1, node.accept(&v)); } TEST(CanonicalNodeTest, mutable_visitor) @@ -68,5 +68,5 @@ TEST(CanonicalNodeTest, mutable_visitor) ResetForward v; forward_node.accept(&v); - ASSERT_EQ(forward_node.input(), nullptr); + ASSERT_EQ(nullptr, forward_node.input()); } diff --git a/compiler/loco/src/IR/DataTypeTraits.test.cpp b/compiler/loco/src/IR/DataTypeTraits.test.cpp index 76d2515..d33d994 100644 --- a/compiler/loco/src/IR/DataTypeTraits.test.cpp +++ b/compiler/loco/src/IR/DataTypeTraits.test.cpp @@ -25,5 +25,5 @@ TEST(DataTypeTraitsTest, FLOAT32) auto obtained = std::type_index(typeid(loco::DataTypeImpl::Type)); auto expected = std::type_index(typeid(float)); - ASSERT_EQ(obtained, expected); + ASSERT_EQ(expected, obtained); } diff --git a/compiler/loco/src/IR/DepthwiseFilterIndex.test.cpp b/compiler/loco/src/IR/DepthwiseFilterIndex.test.cpp index 202647c..f62c067 100644 --- a/compiler/loco/src/IR/DepthwiseFilterIndex.test.cpp +++ b/compiler/loco/src/IR/DepthwiseFilterIndex.test.cpp @@ -23,10 +23,10 @@ TEST(DepthwiseFilterIndexTest, default_constructor) loco::DepthwiseFilterIndex index; // All the values are 0 at the beginning - ASSERT_EQ(index.channel(), 0); - ASSERT_EQ(index.nth(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(0, index.channel()); + ASSERT_EQ(0, index.nth()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); } TEST(DepthwiseFilterIndexTest, settet_and_getter) @@ -36,32 +36,32 @@ TEST(DepthwiseFilterIndexTest, settet_and_getter) // Set depth index.channel() = 2; - ASSERT_EQ(index.channel(), 2); - ASSERT_EQ(index.nth(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.channel()); + ASSERT_EQ(0, index.nth()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set multiplier index.nth() = 3; - ASSERT_EQ(index.channel(), 2); - ASSERT_EQ(index.nth(), 3); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.channel()); + ASSERT_EQ(3, index.nth()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set height index.row() = 4; - ASSERT_EQ(index.channel(), 2); - ASSERT_EQ(index.nth(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.channel()); + ASSERT_EQ(3, index.nth()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(0, index.column()); // Set width index.column() = 5; - ASSERT_EQ(index.channel(), 2); - ASSERT_EQ(index.nth(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 5); + ASSERT_EQ(2, index.channel()); + ASSERT_EQ(3, index.nth()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(5, index.column()); } diff --git a/compiler/loco/src/IR/DepthwiseFilterShape.test.cpp b/compiler/loco/src/IR/DepthwiseFilterShape.test.cpp index 2b9518c..56bad5e 100644 --- a/compiler/loco/src/IR/DepthwiseFilterShape.test.cpp +++ b/compiler/loco/src/IR/DepthwiseFilterShape.test.cpp @@ -40,7 +40,7 @@ TEST(DepthwiseFilterShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.depth(), 2); + ASSERT_EQ(2, shape.depth()); // Set multiplier shape.multiplier() = 3; @@ -50,8 +50,8 @@ TEST(DepthwiseFilterShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.depth(), 2); - ASSERT_EQ(shape.multiplier(), 3); + ASSERT_EQ(2, shape.depth()); + ASSERT_EQ(3, shape.multiplier()); // Set height shape.height() = 4; @@ -61,9 +61,9 @@ TEST(DepthwiseFilterShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.depth(), 2); - ASSERT_EQ(shape.multiplier(), 3); - ASSERT_EQ(shape.height(), 4); + ASSERT_EQ(2, shape.depth()); + ASSERT_EQ(3, shape.multiplier()); + ASSERT_EQ(4, shape.height()); // Set width shape.width() = 5; @@ -73,8 +73,8 @@ TEST(DepthwiseFilterShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_TRUE(shape.width().known()); - ASSERT_EQ(shape.depth(), 2); - ASSERT_EQ(shape.multiplier(), 3); - ASSERT_EQ(shape.height(), 4); - ASSERT_EQ(shape.width(), 5); + ASSERT_EQ(2, shape.depth()); + ASSERT_EQ(3, shape.multiplier()); + ASSERT_EQ(4, shape.height()); + ASSERT_EQ(5, shape.width()); } diff --git a/compiler/loco/src/IR/Dialect.test.cpp b/compiler/loco/src/IR/Dialect.test.cpp index 312bb52..3af3033 100644 --- a/compiler/loco/src/IR/Dialect.test.cpp +++ b/compiler/loco/src/IR/Dialect.test.cpp @@ -36,6 +36,6 @@ TEST(DialectTest, service) MockDialect dialect; - ASSERT_EQ(dialect.service(), nullptr); + ASSERT_EQ(nullptr, dialect.service()); ASSERT_NE(dialect.service(), nullptr); } diff --git a/compiler/loco/src/IR/Dimension.test.cpp b/compiler/loco/src/IR/Dimension.test.cpp index 4faf78a..aa3a8d6 100644 --- a/compiler/loco/src/IR/Dimension.test.cpp +++ b/compiler/loco/src/IR/Dimension.test.cpp @@ -44,7 +44,7 @@ TEST_F(DimensionTest, value_constructor) loco::Dimension dim{value()}; ASSERT_TRUE(dim.known()); - ASSERT_EQ(dim.value(), value()); + ASSERT_EQ(value(), dim.value()); } TEST_F(DimensionTest, set) @@ -54,7 +54,7 @@ TEST_F(DimensionTest, set) dim.set(value()); ASSERT_TRUE(dim.known()); - ASSERT_EQ(dim.value(), value()); + ASSERT_EQ(value(), dim.value()); } TEST_F(DimensionTest, unset) diff --git a/compiler/loco/src/IR/FeatureIndex.test.cpp b/compiler/loco/src/IR/FeatureIndex.test.cpp index 82b5639..0ed6b4f 100644 --- a/compiler/loco/src/IR/FeatureIndex.test.cpp +++ b/compiler/loco/src/IR/FeatureIndex.test.cpp @@ -23,10 +23,10 @@ TEST(FeatureIndexTest, default_constructor) loco::FeatureIndex index; // All the values are 0 at the beginning - ASSERT_EQ(index.batch(), 0); - ASSERT_EQ(index.channel(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(0, index.batch()); + ASSERT_EQ(0, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); } TEST(FeatureIndexTest, settet_and_getter) @@ -36,32 +36,32 @@ TEST(FeatureIndexTest, settet_and_getter) // Set count index.batch() = 2; - ASSERT_EQ(index.batch(), 2); - ASSERT_EQ(index.channel(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.batch()); + ASSERT_EQ(0, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set channel index.channel() = 3; - ASSERT_EQ(index.batch(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.batch()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set height index.row() = 4; - ASSERT_EQ(index.batch(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.batch()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(0, index.column()); // Set width index.column() = 5; - ASSERT_EQ(index.batch(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 5); + ASSERT_EQ(2, index.batch()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(5, index.column()); } diff --git a/compiler/loco/src/IR/FeatureShape.test.cpp b/compiler/loco/src/IR/FeatureShape.test.cpp index 59e25ac..b0414be 100644 --- a/compiler/loco/src/IR/FeatureShape.test.cpp +++ b/compiler/loco/src/IR/FeatureShape.test.cpp @@ -40,7 +40,7 @@ TEST(FeatureShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); + ASSERT_EQ(2, shape.count()); // Set depth shape.depth() = 3; @@ -50,8 +50,8 @@ TEST(FeatureShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); // Set height shape.height() = 4; @@ -61,9 +61,9 @@ TEST(FeatureShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); - ASSERT_EQ(shape.height(), 4); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); + ASSERT_EQ(4, shape.height()); // Set width shape.width() = 5; @@ -73,8 +73,8 @@ TEST(FeatureShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_TRUE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); - ASSERT_EQ(shape.height(), 4); - ASSERT_EQ(shape.width(), 5); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); + ASSERT_EQ(4, shape.height()); + ASSERT_EQ(5, shape.width()); } diff --git a/compiler/loco/src/IR/FilterIndex.test.cpp b/compiler/loco/src/IR/FilterIndex.test.cpp index 58f3871..4edf62c 100644 --- a/compiler/loco/src/IR/FilterIndex.test.cpp +++ b/compiler/loco/src/IR/FilterIndex.test.cpp @@ -23,10 +23,10 @@ TEST(FilterIndexTest, default_constructor) loco::FilterIndex index; // All the values are 0 at the beginning - ASSERT_EQ(index.nth(), 0); - ASSERT_EQ(index.channel(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(0, index.nth()); + ASSERT_EQ(0, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); } TEST(FilterIndexTest, settet_and_getter) @@ -36,32 +36,32 @@ TEST(FilterIndexTest, settet_and_getter) // Set count index.nth() = 2; - ASSERT_EQ(index.nth(), 2); - ASSERT_EQ(index.channel(), 0); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.nth()); + ASSERT_EQ(0, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set channel index.channel() = 3; - ASSERT_EQ(index.nth(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 0); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.nth()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(0, index.row()); + ASSERT_EQ(0, index.column()); // Set height index.row() = 4; - ASSERT_EQ(index.nth(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 0); + ASSERT_EQ(2, index.nth()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(0, index.column()); // Set width index.column() = 5; - ASSERT_EQ(index.nth(), 2); - ASSERT_EQ(index.channel(), 3); - ASSERT_EQ(index.row(), 4); - ASSERT_EQ(index.column(), 5); + ASSERT_EQ(2, index.nth()); + ASSERT_EQ(3, index.channel()); + ASSERT_EQ(4, index.row()); + ASSERT_EQ(5, index.column()); } diff --git a/compiler/loco/src/IR/FilterShape.test.cpp b/compiler/loco/src/IR/FilterShape.test.cpp index ccb60ed..8033027 100644 --- a/compiler/loco/src/IR/FilterShape.test.cpp +++ b/compiler/loco/src/IR/FilterShape.test.cpp @@ -40,7 +40,7 @@ TEST(FilterShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); + ASSERT_EQ(2, shape.count()); // Set depth shape.depth() = 3; @@ -50,8 +50,8 @@ TEST(FilterShapeTest, settet_and_getter) ASSERT_FALSE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); // Set height shape.height() = 4; @@ -61,9 +61,9 @@ TEST(FilterShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_FALSE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); - ASSERT_EQ(shape.height(), 4); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); + ASSERT_EQ(4, shape.height()); // Set width shape.width() = 5; @@ -73,8 +73,8 @@ TEST(FilterShapeTest, settet_and_getter) ASSERT_TRUE(shape.height().known()); ASSERT_TRUE(shape.width().known()); - ASSERT_EQ(shape.count(), 2); - ASSERT_EQ(shape.depth(), 3); - ASSERT_EQ(shape.height(), 4); - ASSERT_EQ(shape.width(), 5); + ASSERT_EQ(2, shape.count()); + ASSERT_EQ(3, shape.depth()); + ASSERT_EQ(4, shape.height()); + ASSERT_EQ(5, shape.width()); } diff --git a/compiler/loco/src/IR/Graph.cpp b/compiler/loco/src/IR/Graph.cpp index 1d87522..8073d45 100644 --- a/compiler/loco/src/IR/Graph.cpp +++ b/compiler/loco/src/IR/Graph.cpp @@ -37,7 +37,7 @@ std::unique_ptr make_tensor_shape(std::initializer_list mixin; - ASSERT_EQ(mixin.dtype(), loco::DataType::Unknown); + ASSERT_EQ(loco::DataType::Unknown, mixin.dtype()); } TEST(DataTypedMixinTest, setter_and_getter) @@ -56,7 +56,7 @@ TEST(DataTypedMixinTest, setter_and_getter) loco::Mixin mixin; mixin.dtype(loco::DataType::FLOAT32); - ASSERT_EQ(mixin.dtype(), loco::DataType::FLOAT32); + ASSERT_EQ(loco::DataType::FLOAT32, mixin.dtype()); } TEST(TensorShapedMixinTest, setter_and_getter) @@ -65,11 +65,11 @@ TEST(TensorShapedMixinTest, setter_and_getter) mixin.shape({1, 2, 3, 4}); ASSERT_NE(mixin.shape(), nullptr); - ASSERT_EQ(mixin.shape()->rank(), 4); - ASSERT_EQ(mixin.shape()->dim(0), 1); - ASSERT_EQ(mixin.shape()->dim(1), 2); - ASSERT_EQ(mixin.shape()->dim(2), 3); - ASSERT_EQ(mixin.shape()->dim(3), 4); + ASSERT_EQ(4, mixin.shape()->rank()); + ASSERT_EQ(1, mixin.shape()->dim(0)); + ASSERT_EQ(2, mixin.shape()->dim(1)); + ASSERT_EQ(3, mixin.shape()->dim(2)); + ASSERT_EQ(4, mixin.shape()->dim(3)); } TEST(GraphTest, create_and_destroy_node) @@ -89,8 +89,8 @@ TEST(GraphTest, create_input) auto input = g->inputs()->create(); // TODO Add more checks - ASSERT_EQ(input->shape(), nullptr); - ASSERT_EQ(input->index(), 0); + ASSERT_EQ(nullptr, input->shape()); + ASSERT_EQ(0, input->index()); } TEST(GraphTest, create_output) @@ -100,8 +100,8 @@ TEST(GraphTest, create_output) auto output = g->outputs()->create(); // TODO Add more checks - ASSERT_EQ(output->shape(), nullptr); - ASSERT_EQ(output->index(), 0); + ASSERT_EQ(nullptr, output->shape()); + ASSERT_EQ(0, output->index()); } namespace @@ -132,10 +132,10 @@ TEST(GraphTest, consturctor_with_param_node) auto test_node = g->nodes()->create(22, 11.11); - ASSERT_EQ(test_node->graph(), g.get()); - ASSERT_EQ(const_cast(test_node)->graph(), g.get()); + ASSERT_EQ(g.get(), test_node->graph()); + ASSERT_EQ(g.get(), const_cast(test_node)->graph()); - ASSERT_EQ(test_node->i(), 22); + ASSERT_EQ(22, test_node->i()); ASSERT_FLOAT_EQ(test_node->f(), 11.11); ASSERT_NO_THROW(g->nodes()->destroy(test_node)); @@ -170,7 +170,7 @@ TEST(GraphTest, graph_node_enumeration) // Returns true if "nodes" includes a given node auto member = [&nodes](loco::Node *node) { return nodes.find(node) != nodes.end(); }; - ASSERT_EQ(nodes.size(), 2); + ASSERT_EQ(2, nodes.size()); ASSERT_TRUE(member(pull_1)); ASSERT_TRUE(member(push_1)); } @@ -197,9 +197,9 @@ TEST(GraphTest, graph_inout_enumeration) auto output_nodes = loco::output_nodes(g.get()); - ASSERT_EQ(output_nodes.size(), 2); - ASSERT_EQ(output_nodes.at(0), push_1); - ASSERT_EQ(output_nodes.at(1), push_3); + ASSERT_EQ(2, output_nodes.size()); + ASSERT_EQ(push_1, output_nodes.at(0)); + ASSERT_EQ(push_3, output_nodes.at(1)); } TEST(GraphTest, graph_name) diff --git a/compiler/loco/src/IR/MockupNode.h b/compiler/loco/src/IR/MockupNode.h index ec56c90..16eaccf 100644 --- a/compiler/loco/src/IR/MockupNode.h +++ b/compiler/loco/src/IR/MockupNode.h @@ -32,7 +32,7 @@ struct MockDialect final : public loco::Dialect } }; -// @brief Mockup node for internal testing +/// @brief Mockup node for internal testing class MockupNode final : public loco::Node { public: @@ -53,6 +53,21 @@ private: loco::Use _arg{this}; }; +/// @brief Mockup2Node node for internal testing +class Mockup2Node final : public loco::Node +{ +public: + Mockup2Node() = default; + +public: + const loco::Dialect *dialect(void) const final { return MockDialect::get(); } + uint32_t opnum(void) const final { return 1; } + + uint32_t arity(void) const final { return 0; } + Node *arg(uint32_t) const final { return nullptr; } + void drop(void) final {} +}; + } // namespace #endif // __LOCO_IR_MOCKUP_NODE_H__ diff --git a/compiler/loco/src/IR/Node.test.cpp b/compiler/loco/src/IR/Node.test.cpp index 00e4444..7c3eb3f 100644 --- a/compiler/loco/src/IR/Node.test.cpp +++ b/compiler/loco/src/IR/Node.test.cpp @@ -29,7 +29,7 @@ TEST(NodeTest, preds) auto preds = loco::preds(&node); - ASSERT_EQ(preds.size(), 1); + ASSERT_EQ(1, preds.size()); ASSERT_NE(preds.find(&arg), preds.end()); } @@ -44,7 +44,7 @@ TEST(NodeTest, succs) auto succs = loco::succs(&node); - ASSERT_EQ(succs.size(), 2); + ASSERT_EQ(2, succs.size()); ASSERT_NE(succs.find(&succ_1), succs.end()); ASSERT_NE(succs.find(&succ_2), succs.end()); } @@ -63,8 +63,8 @@ TEST(NodeTest, replace_with) // The following holds at this point // - node_3 USE node_1 // - node_4 USE node_2 - ASSERT_EQ(node_3.in(), &node_1); - ASSERT_EQ(node_4.in(), &node_2); + ASSERT_EQ(&node_1, node_3.in()); + ASSERT_EQ(&node_2, node_4.in()); // Replace all the usage of node_1 with node_2 replace(&node_1).with(&node_2); @@ -72,8 +72,8 @@ TEST(NodeTest, replace_with) // The following holds at this point // - node_3 USE node_2 // - node_4 USE node_2 - ASSERT_EQ(node_3.in(), &node_2); - ASSERT_EQ(node_4.in(), &node_2); + ASSERT_EQ(&node_2, node_3.in()); + ASSERT_EQ(&node_2, node_4.in()); } TEST(NodeTest, constructor) @@ -81,7 +81,7 @@ TEST(NodeTest, constructor) MockupNode node; // graph() SHOULD return nullptr if node is not constructed through "Graph" - ASSERT_EQ(node.graph(), nullptr); + ASSERT_EQ(nullptr, node.graph()); } // TODO Rewrite this as a FixedAritry mix-in test @@ -96,7 +96,23 @@ TEST(FixedArityNodeTest, constructor) DerivedNode node; - ASSERT_EQ(node.arity(), 1); - ASSERT_EQ(node.arg(0), nullptr); + ASSERT_EQ(1, node.arity()); + ASSERT_EQ(nullptr, node.arg(0)); } #endif + +TEST(NodeTest, cast_with_must_NEG) +{ + Mockup2Node mockupnode; + loco::Node *node = &mockupnode; + + ASSERT_THROW(loco::must_cast(node), std::invalid_argument); +} + +TEST(NodeTest, cast_with_const_must_NEG) +{ + Mockup2Node mockupnode; + const loco::Node *node = &mockupnode; + + ASSERT_THROW(loco::must_cast(node), std::invalid_argument); +} diff --git a/compiler/loco/src/IR/NodeShape.test.cpp b/compiler/loco/src/IR/NodeShape.test.cpp index 4f092e0..8bf7900 100644 --- a/compiler/loco/src/IR/NodeShape.test.cpp +++ b/compiler/loco/src/IR/NodeShape.test.cpp @@ -22,7 +22,7 @@ TEST(NodeShapeTest, default_constructor) { loco::NodeShape node_shape; - ASSERT_EQ(node_shape.domain(), loco::Domain::Unknown); + ASSERT_EQ(loco::Domain::Unknown, node_shape.domain()); } TEST(NodeShapeTest, bias_shape_constructor) @@ -33,8 +33,8 @@ TEST(NodeShapeTest, bias_shape_constructor) loco::NodeShape node_shape{bias_shape}; - ASSERT_EQ(node_shape.domain(), loco::Domain::Bias); - ASSERT_EQ(node_shape.as().length(), 4); + ASSERT_EQ(loco::Domain::Bias, node_shape.domain()); + ASSERT_EQ(4, node_shape.as().length()); } TEST(NodeShapeTest, dwfilter_shape_constructor) @@ -48,11 +48,11 @@ TEST(NodeShapeTest, dwfilter_shape_constructor) loco::NodeShape node_shape{dwfilter_shape}; - ASSERT_EQ(node_shape.domain(), loco::Domain::DepthwiseFilter); - ASSERT_EQ(node_shape.as().depth(), 2); - ASSERT_EQ(node_shape.as().multiplier(), 3); - ASSERT_EQ(node_shape.as().height(), 4); - ASSERT_EQ(node_shape.as().width(), 5); + ASSERT_EQ(loco::Domain::DepthwiseFilter, node_shape.domain()); + ASSERT_EQ(2, node_shape.as().depth()); + ASSERT_EQ(3, node_shape.as().multiplier()); + ASSERT_EQ(4, node_shape.as().height()); + ASSERT_EQ(5, node_shape.as().width()); } TEST(NodeShapeTest, feature_shape_constructor) @@ -66,11 +66,11 @@ TEST(NodeShapeTest, feature_shape_constructor) loco::NodeShape node_shape{feature_shape}; - ASSERT_EQ(node_shape.domain(), loco::Domain::Feature); - ASSERT_EQ(node_shape.as().count(), 2); - ASSERT_EQ(node_shape.as().depth(), 3); - ASSERT_EQ(node_shape.as().height(), 4); - ASSERT_EQ(node_shape.as().width(), 5); + ASSERT_EQ(loco::Domain::Feature, node_shape.domain()); + ASSERT_EQ(2, node_shape.as().count()); + ASSERT_EQ(3, node_shape.as().depth()); + ASSERT_EQ(4, node_shape.as().height()); + ASSERT_EQ(5, node_shape.as().width()); } TEST(NodeShapeTest, filter_shape_constructor) @@ -84,11 +84,11 @@ TEST(NodeShapeTest, filter_shape_constructor) loco::NodeShape node_shape{filter_shape}; - ASSERT_EQ(node_shape.domain(), loco::Domain::Filter); - ASSERT_EQ(node_shape.as().count(), 2); - ASSERT_EQ(node_shape.as().depth(), 3); - ASSERT_EQ(node_shape.as().height(), 4); - ASSERT_EQ(node_shape.as().width(), 5); + ASSERT_EQ(loco::Domain::Filter, node_shape.domain()); + ASSERT_EQ(2, node_shape.as().count()); + ASSERT_EQ(3, node_shape.as().depth()); + ASSERT_EQ(4, node_shape.as().height()); + ASSERT_EQ(5, node_shape.as().width()); } TEST(NodeShapeTest, tensor_shape_constructor) @@ -101,10 +101,10 @@ TEST(NodeShapeTest, tensor_shape_constructor) loco::NodeShape node_shape{tensor_shape}; - ASSERT_EQ(node_shape.domain(), loco::Domain::Tensor); - ASSERT_EQ(node_shape.as().rank(), 2); - ASSERT_EQ(node_shape.as().dim(0), 4); - ASSERT_EQ(node_shape.as().dim(1), 5); + ASSERT_EQ(loco::Domain::Tensor, node_shape.domain()); + ASSERT_EQ(2, node_shape.as().rank()); + ASSERT_EQ(4, node_shape.as().dim(0)); + ASSERT_EQ(5, node_shape.as().dim(1)); } TEST(NodeShapeTest, copy_constructible) @@ -118,8 +118,8 @@ TEST(NodeShapeTest, copy_constructible) loco::NodeShape orig{tensor_shape}; loco::NodeShape copy{orig}; // Call Copy Constructor - ASSERT_EQ(copy.domain(), loco::Domain::Tensor); - ASSERT_EQ(copy.as().rank(), 2); - ASSERT_EQ(copy.as().dim(0), 4); - ASSERT_EQ(copy.as().dim(1), 5); + ASSERT_EQ(loco::Domain::Tensor, copy.domain()); + ASSERT_EQ(2, copy.as().rank()); + ASSERT_EQ(4, copy.as().dim(0)); + ASSERT_EQ(5, copy.as().dim(1)); } diff --git a/compiler/loco/src/IR/Nodes.test.cpp b/compiler/loco/src/IR/Nodes.test.cpp index cd51f46..0b22103 100644 --- a/compiler/loco/src/IR/Nodes.test.cpp +++ b/compiler/loco/src/IR/Nodes.test.cpp @@ -23,8 +23,8 @@ TEST(PushTest, constructor) { loco::Push push_node; - ASSERT_EQ(push_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(push_node.opcode(), loco::CanonicalOpcode::Push); + ASSERT_EQ(loco::CanonicalDialect::get(), push_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::Push, push_node.opcode()); ASSERT_FALSE(push_node.indexed()); } @@ -37,24 +37,24 @@ TEST(PushTest, shape) push_node.shape({dims[0], dims[1], dims[2], dims[3]}); - ASSERT_EQ(push_node.rank(), dims.size()); - ASSERT_EQ(push_node.dim(0), dims[0]); - ASSERT_EQ(push_node.dim(1), dims[1]); - ASSERT_EQ(push_node.dim(2), dims[2]); - ASSERT_EQ(push_node.dim(3), dims[3]); + ASSERT_EQ(dims.size(), push_node.rank()); + ASSERT_EQ(dims[0], push_node.dim(0)); + ASSERT_EQ(dims[1], push_node.dim(1)); + ASSERT_EQ(dims[2], push_node.dim(2)); + ASSERT_EQ(dims[3], push_node.dim(3)); } TEST(PullTest, constructor) { loco::Pull pull_node; - ASSERT_EQ(pull_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(pull_node.opcode(), loco::CanonicalOpcode::Pull); + ASSERT_EQ(loco::CanonicalDialect::get(), pull_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::Pull, pull_node.opcode()); ASSERT_FALSE(pull_node.indexed()); - ASSERT_EQ(pull_node.dtype(), loco::DataType::Unknown); - ASSERT_EQ(pull_node.rank(), 0); + ASSERT_EQ(loco::DataType::Unknown, pull_node.dtype()); + ASSERT_EQ(0, pull_node.rank()); } TEST(PullTest, shape) @@ -65,58 +65,58 @@ TEST(PullTest, shape) pull_node.shape({dims[0], dims[1], dims[2], dims[3]}); - ASSERT_EQ(pull_node.rank(), dims.size()); - ASSERT_EQ(pull_node.dim(0), dims[0]); - ASSERT_EQ(pull_node.dim(1), dims[1]); - ASSERT_EQ(pull_node.dim(2), dims[2]); - ASSERT_EQ(pull_node.dim(3), dims[3]); + ASSERT_EQ(dims.size(), pull_node.rank()); + ASSERT_EQ(dims[0], pull_node.dim(0)); + ASSERT_EQ(dims[1], pull_node.dim(1)); + ASSERT_EQ(dims[2], pull_node.dim(2)); + ASSERT_EQ(dims[3], pull_node.dim(3)); } TEST(ForwardTest, constructor) { loco::Forward forward_node; - ASSERT_EQ(forward_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(forward_node.opcode(), loco::CanonicalOpcode::Forward); + ASSERT_EQ(loco::CanonicalDialect::get(), forward_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::Forward, forward_node.opcode()); - ASSERT_EQ(forward_node.input(), nullptr); + ASSERT_EQ(nullptr, forward_node.input()); } TEST(ReLUTest, constructor) { loco::ReLU relu_node; - ASSERT_EQ(relu_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(relu_node.opcode(), loco::CanonicalOpcode::ReLU); + ASSERT_EQ(loco::CanonicalDialect::get(), relu_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::ReLU, relu_node.opcode()); - ASSERT_EQ(relu_node.input(), nullptr); + ASSERT_EQ(nullptr, relu_node.input()); } TEST(ReLU6Test, constructor) { loco::ReLU6 relu6_node; - ASSERT_EQ(relu6_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(relu6_node.opcode(), loco::CanonicalOpcode::ReLU6); + ASSERT_EQ(loco::CanonicalDialect::get(), relu6_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::ReLU6, relu6_node.opcode()); - ASSERT_EQ(relu6_node.input(), nullptr); + ASSERT_EQ(nullptr, relu6_node.input()); } TEST(ConstGenTest, constructor) { loco::ConstGen constgen_node; - ASSERT_EQ(constgen_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(constgen_node.opcode(), loco::CanonicalOpcode::ConstGen); + ASSERT_EQ(loco::CanonicalDialect::get(), constgen_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::ConstGen, constgen_node.opcode()); - ASSERT_EQ(constgen_node.dtype(), loco::DataType::Unknown); - ASSERT_EQ(constgen_node.rank(), 0); + ASSERT_EQ(loco::DataType::Unknown, constgen_node.dtype()); + ASSERT_EQ(0, constgen_node.rank()); constgen_node.dtype(loco::DataType::FLOAT32); - ASSERT_EQ(constgen_node.dtype(), loco::DataType::FLOAT32); + ASSERT_EQ(loco::DataType::FLOAT32, constgen_node.dtype()); constgen_node.rank(2); - ASSERT_EQ(constgen_node.rank(), 2); + ASSERT_EQ(2, constgen_node.rank()); constgen_node.dim(0) = 2; constgen_node.dim(1) = 3; @@ -124,12 +124,12 @@ TEST(ConstGenTest, constructor) ASSERT_TRUE(constgen_node.dim(0).known()); ASSERT_TRUE(constgen_node.dim(1).known()); - ASSERT_EQ(constgen_node.dim(0), 2); - ASSERT_EQ(constgen_node.dim(1), 3); + ASSERT_EQ(2, constgen_node.dim(0)); + ASSERT_EQ(3, constgen_node.dim(1)); constgen_node.size(6); - ASSERT_EQ(constgen_node.size(), 6); + ASSERT_EQ(6, constgen_node.size()); constgen_node.at(0) = 0.0f; // Set 0,0 constgen_node.at(1) = 1.0f; // Set 0,1 @@ -138,26 +138,26 @@ TEST(ConstGenTest, constructor) constgen_node.at(4) = 4.0f; // Set 1,1 constgen_node.at(5) = 5.0f; // Set 1,2 - ASSERT_EQ(constgen_node.at(0), 0.0f); - ASSERT_EQ(constgen_node.at(1), 1.0f); - ASSERT_EQ(constgen_node.at(2), 2.0f); - ASSERT_EQ(constgen_node.at(3), 3.0f); - ASSERT_EQ(constgen_node.at(4), 4.0f); - ASSERT_EQ(constgen_node.at(5), 5.0f); + ASSERT_EQ(0.0f, constgen_node.at(0)); + ASSERT_EQ(1.0f, constgen_node.at(1)); + ASSERT_EQ(2.0f, constgen_node.at(2)); + ASSERT_EQ(3.0f, constgen_node.at(3)); + ASSERT_EQ(4.0f, constgen_node.at(4)); + ASSERT_EQ(5.0f, constgen_node.at(5)); } TEST(ConstGenTest, constructor_s32) { loco::ConstGen constgen_node; - ASSERT_EQ(constgen_node.dtype(), loco::DataType::Unknown); - ASSERT_EQ(constgen_node.rank(), 0); + ASSERT_EQ(loco::DataType::Unknown, constgen_node.dtype()); + ASSERT_EQ(0, constgen_node.rank()); constgen_node.dtype(loco::DataType::S32); - ASSERT_EQ(constgen_node.dtype(), loco::DataType::S32); + ASSERT_EQ(loco::DataType::S32, constgen_node.dtype()); constgen_node.rank(2); - ASSERT_EQ(constgen_node.rank(), 2); + ASSERT_EQ(2, constgen_node.rank()); constgen_node.dim(0) = 2; constgen_node.dim(1) = 3; @@ -165,12 +165,12 @@ TEST(ConstGenTest, constructor_s32) ASSERT_TRUE(constgen_node.dim(0).known()); ASSERT_TRUE(constgen_node.dim(1).known()); - ASSERT_EQ(constgen_node.dim(0), 2); - ASSERT_EQ(constgen_node.dim(1), 3); + ASSERT_EQ(2, constgen_node.dim(0)); + ASSERT_EQ(3, constgen_node.dim(1)); constgen_node.size(6); - ASSERT_EQ(constgen_node.size(), 6); + ASSERT_EQ(6, constgen_node.size()); constgen_node.at(0) = 0; // Set 0,0 constgen_node.at(1) = 1; // Set 0,1 @@ -179,33 +179,33 @@ TEST(ConstGenTest, constructor_s32) constgen_node.at(4) = -4; // Set 1,1 constgen_node.at(5) = -5; // Set 1,2 - ASSERT_EQ(constgen_node.at(0), 0); - ASSERT_EQ(constgen_node.at(1), 1); - ASSERT_EQ(constgen_node.at(2), 2); - ASSERT_EQ(constgen_node.at(3), -3); - ASSERT_EQ(constgen_node.at(4), -4); - ASSERT_EQ(constgen_node.at(5), -5); + ASSERT_EQ(0, constgen_node.at(0)); + ASSERT_EQ(1, constgen_node.at(1)); + ASSERT_EQ(2, constgen_node.at(2)); + ASSERT_EQ(-3, constgen_node.at(3)); + ASSERT_EQ(-4, constgen_node.at(4)); + ASSERT_EQ(-5, constgen_node.at(5)); } TEST(MaxPool2DTest, constructor) { loco::MaxPool2D maxpool_node; - ASSERT_EQ(maxpool_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(maxpool_node.opcode(), loco::CanonicalOpcode::MaxPool2D); + ASSERT_EQ(loco::CanonicalDialect::get(), maxpool_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::MaxPool2D, maxpool_node.opcode()); - ASSERT_EQ(maxpool_node.ifm(), nullptr); + ASSERT_EQ(nullptr, maxpool_node.ifm()); - ASSERT_EQ(maxpool_node.pad()->top(), 0); - ASSERT_EQ(maxpool_node.pad()->bottom(), 0); - ASSERT_EQ(maxpool_node.pad()->left(), 0); - ASSERT_EQ(maxpool_node.pad()->right(), 0); + ASSERT_EQ(0, maxpool_node.pad()->top()); + ASSERT_EQ(0, maxpool_node.pad()->bottom()); + ASSERT_EQ(0, maxpool_node.pad()->left()); + ASSERT_EQ(0, maxpool_node.pad()->right()); - ASSERT_EQ(maxpool_node.window()->vertical(), 1); - ASSERT_EQ(maxpool_node.window()->horizontal(), 1); + ASSERT_EQ(1, maxpool_node.window()->vertical()); + ASSERT_EQ(1, maxpool_node.window()->horizontal()); - ASSERT_EQ(maxpool_node.stride()->vertical(), 1); - ASSERT_EQ(maxpool_node.stride()->horizontal(), 1); + ASSERT_EQ(1, maxpool_node.stride()->vertical()); + ASSERT_EQ(1, maxpool_node.stride()->horizontal()); } TEST(MaxPool2DTest, pad) @@ -218,71 +218,71 @@ TEST(MaxPool2DTest, pad) loco::MaxPool2D maxpool_node; maxpool_node.pad()->top(t); - ASSERT_EQ(maxpool_node.pad()->top(), t); + ASSERT_EQ(t, maxpool_node.pad()->top()); maxpool_node.pad()->bottom(b); - ASSERT_EQ(maxpool_node.pad()->bottom(), b); + ASSERT_EQ(b, maxpool_node.pad()->bottom()); maxpool_node.pad()->left(l); - ASSERT_EQ(maxpool_node.pad()->left(), l); + ASSERT_EQ(l, maxpool_node.pad()->left()); maxpool_node.pad()->right(r); - ASSERT_EQ(maxpool_node.pad()->right(), r); + ASSERT_EQ(r, maxpool_node.pad()->right()); } TEST(AvgPool2DTest, constructor) { loco::AvgPool2D avgpool_node; - ASSERT_EQ(avgpool_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(avgpool_node.opcode(), loco::CanonicalOpcode::AvgPool2D); + ASSERT_EQ(loco::CanonicalDialect::get(), avgpool_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::AvgPool2D, avgpool_node.opcode()); - ASSERT_EQ(avgpool_node.ifm(), nullptr); + ASSERT_EQ(nullptr, avgpool_node.ifm()); - ASSERT_EQ(avgpool_node.convention(), loco::AvgPool2D::Convention::Unknown); + ASSERT_EQ(loco::AvgPool2D::Convention::Unknown, avgpool_node.convention()); - ASSERT_EQ(avgpool_node.pad()->top(), 0); - ASSERT_EQ(avgpool_node.pad()->bottom(), 0); - ASSERT_EQ(avgpool_node.pad()->left(), 0); - ASSERT_EQ(avgpool_node.pad()->right(), 0); + ASSERT_EQ(0, avgpool_node.pad()->top()); + ASSERT_EQ(0, avgpool_node.pad()->bottom()); + ASSERT_EQ(0, avgpool_node.pad()->left()); + ASSERT_EQ(0, avgpool_node.pad()->right()); - ASSERT_EQ(avgpool_node.window()->vertical(), 1); - ASSERT_EQ(avgpool_node.window()->horizontal(), 1); + ASSERT_EQ(1, avgpool_node.window()->vertical()); + ASSERT_EQ(1, avgpool_node.window()->horizontal()); - ASSERT_EQ(avgpool_node.stride()->vertical(), 1); - ASSERT_EQ(avgpool_node.stride()->horizontal(), 1); + ASSERT_EQ(1, avgpool_node.stride()->vertical()); + ASSERT_EQ(1, avgpool_node.stride()->horizontal()); } TEST(FeatureEncodeTest, constructor) { loco::FeatureEncode feature_encode; - ASSERT_EQ(feature_encode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(feature_encode.opcode(), loco::CanonicalOpcode::FeatureEncode); + ASSERT_EQ(loco::CanonicalDialect::get(), feature_encode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FeatureEncode, feature_encode.opcode()); - ASSERT_EQ(feature_encode.input(), nullptr); - ASSERT_EQ(feature_encode.encoder(), nullptr); + ASSERT_EQ(nullptr, feature_encode.input()); + ASSERT_EQ(nullptr, feature_encode.encoder()); } TEST(FeatureDecodeTest, constructor) { loco::FeatureDecode feature_decode; - ASSERT_EQ(feature_decode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(feature_decode.opcode(), loco::CanonicalOpcode::FeatureDecode); + ASSERT_EQ(loco::CanonicalDialect::get(), feature_decode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FeatureDecode, feature_decode.opcode()); - ASSERT_EQ(feature_decode.input(), nullptr); - ASSERT_EQ(feature_decode.decoder(), nullptr); + ASSERT_EQ(nullptr, feature_decode.input()); + ASSERT_EQ(nullptr, feature_decode.decoder()); } TEST(Reshape_Fixed_Test, constructor) { loco::Reshape reshape; - ASSERT_EQ(reshape.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(reshape.opcode(), loco::CanonicalOpcode::FixedReshape); + ASSERT_EQ(loco::CanonicalDialect::get(), reshape.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FixedReshape, reshape.opcode()); - ASSERT_EQ(reshape.rank(), 0); + ASSERT_EQ(0, reshape.rank()); } TEST(Reshape_Fixed_Test, shape) @@ -290,153 +290,153 @@ TEST(Reshape_Fixed_Test, shape) loco::Reshape reshape; reshape.shape({2, 3}); - ASSERT_EQ(reshape.rank(), 2); - ASSERT_EQ(reshape.dim(0), 2); - ASSERT_EQ(reshape.dim(1), 3); + ASSERT_EQ(2, reshape.rank()); + ASSERT_EQ(2, reshape.dim(0)); + ASSERT_EQ(3, reshape.dim(1)); } TEST(FilterEncodeTest, constructor) { loco::FilterEncode filter_encode; - ASSERT_EQ(filter_encode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(filter_encode.opcode(), loco::CanonicalOpcode::FilterEncode); + ASSERT_EQ(loco::CanonicalDialect::get(), filter_encode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FilterEncode, filter_encode.opcode()); - ASSERT_EQ(filter_encode.input(), nullptr); - ASSERT_EQ(filter_encode.encoder(), nullptr); + ASSERT_EQ(nullptr, filter_encode.input()); + ASSERT_EQ(nullptr, filter_encode.encoder()); } TEST(FilterDecodeTest, constructor) { loco::FilterDecode filter_decode; - ASSERT_EQ(filter_decode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(filter_decode.opcode(), loco::CanonicalOpcode::FilterDecode); + ASSERT_EQ(loco::CanonicalDialect::get(), filter_decode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FilterDecode, filter_decode.opcode()); - ASSERT_EQ(filter_decode.input(), nullptr); - ASSERT_EQ(filter_decode.decoder(), nullptr); + ASSERT_EQ(nullptr, filter_decode.input()); + ASSERT_EQ(nullptr, filter_decode.decoder()); } TEST(DepthwiseFilterEncodeTest, constructor) { loco::DepthwiseFilterEncode dw_filter_encode; - ASSERT_EQ(dw_filter_encode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(dw_filter_encode.opcode(), loco::CanonicalOpcode::DepthwiseFilterEncode); + ASSERT_EQ(loco::CanonicalDialect::get(), dw_filter_encode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::DepthwiseFilterEncode, dw_filter_encode.opcode()); - ASSERT_EQ(dw_filter_encode.input(), nullptr); - ASSERT_EQ(dw_filter_encode.encoder(), nullptr); + ASSERT_EQ(nullptr, dw_filter_encode.input()); + ASSERT_EQ(nullptr, dw_filter_encode.encoder()); } TEST(DepthwiseFilterDecodeTest, constructor) { loco::DepthwiseFilterDecode dw_filter_decode; - ASSERT_EQ(dw_filter_decode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(dw_filter_decode.opcode(), loco::CanonicalOpcode::DepthwiseFilterDecode); + ASSERT_EQ(loco::CanonicalDialect::get(), dw_filter_decode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::DepthwiseFilterDecode, dw_filter_decode.opcode()); - ASSERT_EQ(dw_filter_decode.input(), nullptr); - ASSERT_EQ(dw_filter_decode.decoder(), nullptr); + ASSERT_EQ(nullptr, dw_filter_decode.input()); + ASSERT_EQ(nullptr, dw_filter_decode.decoder()); } TEST(TensorConcatTest, constructor) { loco::TensorConcat tensor_concat; - ASSERT_EQ(tensor_concat.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(tensor_concat.opcode(), loco::CanonicalOpcode::TensorConcat); + ASSERT_EQ(loco::CanonicalDialect::get(), tensor_concat.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::TensorConcat, tensor_concat.opcode()); - ASSERT_EQ(tensor_concat.lhs(), nullptr); - ASSERT_EQ(tensor_concat.rhs(), nullptr); - ASSERT_EQ(tensor_concat.axis(), 0); + ASSERT_EQ(nullptr, tensor_concat.lhs()); + ASSERT_EQ(nullptr, tensor_concat.rhs()); + ASSERT_EQ(0, tensor_concat.axis()); tensor_concat.axis(3); - ASSERT_EQ(tensor_concat.axis(), 3); + ASSERT_EQ(3, tensor_concat.axis()); } TEST(Conv2DTest, constructor) { loco::Conv2D conv2d; - ASSERT_EQ(conv2d.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(conv2d.opcode(), loco::CanonicalOpcode::Conv2D); + ASSERT_EQ(loco::CanonicalDialect::get(), conv2d.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::Conv2D, conv2d.opcode()); - ASSERT_EQ(conv2d.ifm(), nullptr); - ASSERT_EQ(conv2d.ker(), nullptr); + ASSERT_EQ(nullptr, conv2d.ifm()); + ASSERT_EQ(nullptr, conv2d.ker()); ASSERT_NE(conv2d.pad(), nullptr); - ASSERT_EQ(conv2d.pad()->top(), 0); - ASSERT_EQ(conv2d.pad()->bottom(), 0); - ASSERT_EQ(conv2d.pad()->left(), 0); - ASSERT_EQ(conv2d.pad()->right(), 0); + ASSERT_EQ(0, conv2d.pad()->top()); + ASSERT_EQ(0, conv2d.pad()->bottom()); + ASSERT_EQ(0, conv2d.pad()->left()); + ASSERT_EQ(0, conv2d.pad()->right()); ASSERT_NE(conv2d.stride(), nullptr); - ASSERT_EQ(conv2d.stride()->vertical(), 1); - ASSERT_EQ(conv2d.stride()->horizontal(), 1); + ASSERT_EQ(1, conv2d.stride()->vertical()); + ASSERT_EQ(1, conv2d.stride()->horizontal()); } TEST(DepthwiseConv2DTest, constructor) { loco::DepthwiseConv2D dw_conv2d; - ASSERT_EQ(dw_conv2d.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(dw_conv2d.opcode(), loco::CanonicalOpcode::DepthwiseConv2D); + ASSERT_EQ(loco::CanonicalDialect::get(), dw_conv2d.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::DepthwiseConv2D, dw_conv2d.opcode()); - ASSERT_EQ(dw_conv2d.ifm(), nullptr); - ASSERT_EQ(dw_conv2d.ker(), nullptr); + ASSERT_EQ(nullptr, dw_conv2d.ifm()); + ASSERT_EQ(nullptr, dw_conv2d.ker()); ASSERT_NE(dw_conv2d.pad(), nullptr); - ASSERT_EQ(dw_conv2d.pad()->top(), 0); - ASSERT_EQ(dw_conv2d.pad()->bottom(), 0); - ASSERT_EQ(dw_conv2d.pad()->left(), 0); - ASSERT_EQ(dw_conv2d.pad()->right(), 0); + ASSERT_EQ(0, dw_conv2d.pad()->top()); + ASSERT_EQ(0, dw_conv2d.pad()->bottom()); + ASSERT_EQ(0, dw_conv2d.pad()->left()); + ASSERT_EQ(0, dw_conv2d.pad()->right()); ASSERT_NE(dw_conv2d.stride(), nullptr); - ASSERT_EQ(dw_conv2d.stride()->vertical(), 1); - ASSERT_EQ(dw_conv2d.stride()->horizontal(), 1); + ASSERT_EQ(1, dw_conv2d.stride()->vertical()); + ASSERT_EQ(1, dw_conv2d.stride()->horizontal()); } TEST(TransposedConv2DTest, constructor) { loco::TransposedConv2D tr_conv2d; - ASSERT_EQ(tr_conv2d.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(tr_conv2d.opcode(), loco::CanonicalOpcode::TransposedConv2D); + ASSERT_EQ(loco::CanonicalDialect::get(), tr_conv2d.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::TransposedConv2D, tr_conv2d.opcode()); - ASSERT_EQ(tr_conv2d.ifm(), nullptr); - ASSERT_EQ(tr_conv2d.ker(), nullptr); + ASSERT_EQ(nullptr, tr_conv2d.ifm()); + ASSERT_EQ(nullptr, tr_conv2d.ker()); ASSERT_NE(tr_conv2d.pad(), nullptr); - ASSERT_EQ(tr_conv2d.pad()->top(), 0); - ASSERT_EQ(tr_conv2d.pad()->bottom(), 0); - ASSERT_EQ(tr_conv2d.pad()->left(), 0); - ASSERT_EQ(tr_conv2d.pad()->right(), 0); + ASSERT_EQ(0, tr_conv2d.pad()->top()); + ASSERT_EQ(0, tr_conv2d.pad()->bottom()); + ASSERT_EQ(0, tr_conv2d.pad()->left()); + ASSERT_EQ(0, tr_conv2d.pad()->right()); ASSERT_NE(tr_conv2d.stride(), nullptr); - ASSERT_EQ(tr_conv2d.stride()->vertical(), 1); - ASSERT_EQ(tr_conv2d.stride()->horizontal(), 1); + ASSERT_EQ(1, tr_conv2d.stride()->vertical()); + ASSERT_EQ(1, tr_conv2d.stride()->horizontal()); } TEST(BiasEncodeTest, constructor) { loco::BiasEncode bias_encode; - ASSERT_EQ(bias_encode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(bias_encode.opcode(), loco::CanonicalOpcode::BiasEncode); + ASSERT_EQ(loco::CanonicalDialect::get(), bias_encode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::BiasEncode, bias_encode.opcode()); - ASSERT_EQ(bias_encode.input(), nullptr); + ASSERT_EQ(nullptr, bias_encode.input()); } TEST(TensorBiasAddTest, constructor) { loco::BiasAdd bias_add; - ASSERT_EQ(bias_add.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(bias_add.opcode(), loco::CanonicalOpcode::TensorBiasAdd); + ASSERT_EQ(loco::CanonicalDialect::get(), bias_add.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::TensorBiasAdd, bias_add.opcode()); - ASSERT_EQ(bias_add.value(), nullptr); - ASSERT_EQ(bias_add.bias(), nullptr); - ASSERT_EQ(bias_add.axis(), 0); + ASSERT_EQ(nullptr, bias_add.value()); + ASSERT_EQ(nullptr, bias_add.bias()); + ASSERT_EQ(0, bias_add.axis()); } TEST(TensorBiasAddTest, alias) @@ -450,11 +450,11 @@ TEST(FeatureBiasAddTest, constructor) { loco::BiasAdd bias_add; - ASSERT_EQ(bias_add.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(bias_add.opcode(), loco::CanonicalOpcode::FeatureBiasAdd); + ASSERT_EQ(loco::CanonicalDialect::get(), bias_add.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::FeatureBiasAdd, bias_add.opcode()); - ASSERT_EQ(bias_add.value(), nullptr); - ASSERT_EQ(bias_add.bias(), nullptr); + ASSERT_EQ(nullptr, bias_add.value()); + ASSERT_EQ(nullptr, bias_add.bias()); } TEST(FeatureBiasAddTest, alias) @@ -503,74 +503,74 @@ TEST(EltwiseSqrtTest, constructor) { loco::EltwiseSqrt sqrt_node; - ASSERT_EQ(sqrt_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(sqrt_node.opcode(), loco::CanonicalOpcode::EltwiseSqrt); + ASSERT_EQ(loco::CanonicalDialect::get(), sqrt_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::EltwiseSqrt, sqrt_node.opcode()); - ASSERT_EQ(sqrt_node.input(), nullptr); + ASSERT_EQ(nullptr, sqrt_node.input()); } TEST(TensorBroadcastTest, constructor) { loco::TensorBroadcast tensor_broadcast_node; - ASSERT_EQ(tensor_broadcast_node.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(tensor_broadcast_node.opcode(), loco::CanonicalOpcode::TensorBroadcast); + ASSERT_EQ(loco::CanonicalDialect::get(), tensor_broadcast_node.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::TensorBroadcast, tensor_broadcast_node.opcode()); - ASSERT_EQ(tensor_broadcast_node.input(), nullptr); + ASSERT_EQ(nullptr, tensor_broadcast_node.input()); } TEST(TensorBroadcastTest, mapping) { loco::TensorBroadcast tensor_broadcast_node; - ASSERT_EQ(tensor_broadcast_node.mapping()->defined(0), false); + ASSERT_EQ(false, tensor_broadcast_node.mapping()->defined(0)); tensor_broadcast_node.mapping()->dim(0) = 3; - ASSERT_EQ(tensor_broadcast_node.mapping()->defined(0), true); - ASSERT_EQ(tensor_broadcast_node.mapping()->dim(0), 3); + ASSERT_EQ(true, tensor_broadcast_node.mapping()->defined(0)); + ASSERT_EQ(3, tensor_broadcast_node.mapping()->dim(0)); } TEST(MatrixEncodeTest, constructor) { loco::MatrixEncode matrix_encode; - ASSERT_EQ(matrix_encode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(matrix_encode.opcode(), loco::CanonicalOpcode::MatrixEncode); + ASSERT_EQ(loco::CanonicalDialect::get(), matrix_encode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::MatrixEncode, matrix_encode.opcode()); - ASSERT_EQ(matrix_encode.input(), nullptr); + ASSERT_EQ(nullptr, matrix_encode.input()); } TEST(MatrixDecodeTest, constructor) { loco::MatrixDecode matrix_decode; - ASSERT_EQ(matrix_decode.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(matrix_decode.opcode(), loco::CanonicalOpcode::MatrixDecode); + ASSERT_EQ(loco::CanonicalDialect::get(), matrix_decode.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::MatrixDecode, matrix_decode.opcode()); - ASSERT_EQ(matrix_decode.input(), nullptr); + ASSERT_EQ(nullptr, matrix_decode.input()); } TEST(MatMulTest, constructor) { loco::MatMul mat_mul; - ASSERT_EQ(mat_mul.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(mat_mul.opcode(), loco::CanonicalOpcode::MatMul); + ASSERT_EQ(loco::CanonicalDialect::get(), mat_mul.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::MatMul, mat_mul.opcode()); - ASSERT_EQ(mat_mul.lhs(), nullptr); - ASSERT_EQ(mat_mul.rhs(), nullptr); + ASSERT_EQ(nullptr, mat_mul.lhs()); + ASSERT_EQ(nullptr, mat_mul.rhs()); } TEST(TransposeTest, constructor) { loco::TensorTranspose transpose; - ASSERT_EQ(transpose.dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(transpose.opcode(), loco::CanonicalOpcode::TensorTranspose); + ASSERT_EQ(loco::CanonicalDialect::get(), transpose.dialect()); + ASSERT_EQ(loco::CanonicalOpcode::TensorTranspose, transpose.opcode()); - ASSERT_EQ(transpose.input(), nullptr); - ASSERT_EQ(transpose.perm()->size(), 0); + ASSERT_EQ(nullptr, transpose.input()); + ASSERT_EQ(0, transpose.perm()->size()); } TEST(TransposeTest, perm) @@ -582,7 +582,7 @@ TEST(TransposeTest, perm) transpose.perm()->axis(1) = 2; transpose.perm()->axis(2) = 0; - ASSERT_EQ(transpose.perm()->axis(0), 1); - ASSERT_EQ(transpose.perm()->axis(1), 2); - ASSERT_EQ(transpose.perm()->axis(2), 0); + ASSERT_EQ(1, transpose.perm()->axis(0)); + ASSERT_EQ(2, transpose.perm()->axis(1)); + ASSERT_EQ(0, transpose.perm()->axis(2)); } diff --git a/compiler/loco/src/IR/Padding2D.test.cpp b/compiler/loco/src/IR/Padding2D.test.cpp index 2e3d4af..b919f26 100644 --- a/compiler/loco/src/IR/Padding2D.test.cpp +++ b/compiler/loco/src/IR/Padding2D.test.cpp @@ -22,8 +22,8 @@ TEST(PadTest, default_constructor_2D) { loco::Padding2D pad; - ASSERT_EQ(pad.top(), 0); - ASSERT_EQ(pad.bottom(), 0); - ASSERT_EQ(pad.left(), 0); - ASSERT_EQ(pad.right(), 0); + ASSERT_EQ(0, pad.top()); + ASSERT_EQ(0, pad.bottom()); + ASSERT_EQ(0, pad.left()); + ASSERT_EQ(0, pad.right()); } diff --git a/compiler/loco/src/IR/PaddingND.test.cpp b/compiler/loco/src/IR/PaddingND.test.cpp index 0e20406..8c384c0 100644 --- a/compiler/loco/src/IR/PaddingND.test.cpp +++ b/compiler/loco/src/IR/PaddingND.test.cpp @@ -26,7 +26,7 @@ TEST(PaddingNDTest, default_constructor_ND) padding.front(0) = 1; padding.back(0) = 2; - ASSERT_EQ(padding.rank(), 1); - ASSERT_EQ(padding.front(0), 1); - ASSERT_EQ(padding.back(0), 2); + ASSERT_EQ(1, padding.rank()); + ASSERT_EQ(1, padding.front(0)); + ASSERT_EQ(2, padding.back(0)); } diff --git a/compiler/loco/src/IR/PermutingCodec.test.cpp b/compiler/loco/src/IR/PermutingCodec.test.cpp index 2eff286..f8f7541 100644 --- a/compiler/loco/src/IR/PermutingCodec.test.cpp +++ b/compiler/loco/src/IR/PermutingCodec.test.cpp @@ -43,10 +43,10 @@ TEST(PemutationTest, feature) ASSERT_TRUE(perm.mapped(FeatureAxis::Width)); // Check the value - ASSERT_EQ(perm[FeatureAxis::Count], 5); - ASSERT_EQ(perm[FeatureAxis::Depth], 6); - ASSERT_EQ(perm[FeatureAxis::Height], 7); - ASSERT_EQ(perm[FeatureAxis::Width], 8); + ASSERT_EQ(5, perm[FeatureAxis::Count]); + ASSERT_EQ(6, perm[FeatureAxis::Depth]); + ASSERT_EQ(7, perm[FeatureAxis::Height]); + ASSERT_EQ(8, perm[FeatureAxis::Width]); } TEST(PemutationTest, filter) @@ -72,10 +72,10 @@ TEST(PemutationTest, filter) ASSERT_TRUE(perm.mapped(FilterAxis::Width)); // Check the value - ASSERT_EQ(perm[FilterAxis::Count], 5); - ASSERT_EQ(perm[FilterAxis::Depth], 6); - ASSERT_EQ(perm[FilterAxis::Height], 7); - ASSERT_EQ(perm[FilterAxis::Width], 8); + ASSERT_EQ(5, perm[FilterAxis::Count]); + ASSERT_EQ(6, perm[FilterAxis::Depth]); + ASSERT_EQ(7, perm[FilterAxis::Height]); + ASSERT_EQ(8, perm[FilterAxis::Width]); } TEST(PemutationTest, depthwise_filter) @@ -101,10 +101,10 @@ TEST(PemutationTest, depthwise_filter) ASSERT_TRUE(perm.mapped(DepthwiseFilterAxis::Width)); // Check the value - ASSERT_EQ(perm[DepthwiseFilterAxis::Depth], 5); - ASSERT_EQ(perm[DepthwiseFilterAxis::Multiplier], 6); - ASSERT_EQ(perm[DepthwiseFilterAxis::Height], 7); - ASSERT_EQ(perm[DepthwiseFilterAxis::Width], 8); + ASSERT_EQ(5, perm[DepthwiseFilterAxis::Depth]); + ASSERT_EQ(6, perm[DepthwiseFilterAxis::Multiplier]); + ASSERT_EQ(7, perm[DepthwiseFilterAxis::Height]); + ASSERT_EQ(8, perm[DepthwiseFilterAxis::Width]); } TEST(PermutingEncoderTest, feature) @@ -147,10 +147,10 @@ TEST(PermutingEncoderTest, feature) // Get the feature shape corresponding to a given image auto feature_shape = enc.shape(tensor_shape); - ASSERT_EQ(feature_shape.count(), 1); - ASSERT_EQ(feature_shape.depth(), 3); - ASSERT_EQ(feature_shape.height(), 720); - ASSERT_EQ(feature_shape.width(), 1280); + ASSERT_EQ(1, feature_shape.count()); + ASSERT_EQ(3, feature_shape.depth()); + ASSERT_EQ(720, feature_shape.height()); + ASSERT_EQ(1280, feature_shape.width()); // Let's find a source tensor index! FeatureIndex feature_index; @@ -162,10 +162,10 @@ TEST(PermutingEncoderTest, feature) auto tensor_index = enc.value(feature_index); - ASSERT_EQ(tensor_index.at(0), 0); // BATCH(COUNT) - ASSERT_EQ(tensor_index.at(1), 2); // ROW(HEIGHT) - ASSERT_EQ(tensor_index.at(2), 3); // COLUMN(WIDTH) - ASSERT_EQ(tensor_index.at(3), 1); // CHANNEL(DEPTH) + ASSERT_EQ(0, tensor_index.at(0)); // BATCH(COUNT) + ASSERT_EQ(2, tensor_index.at(1)); // ROW(HEIGHT) + ASSERT_EQ(3, tensor_index.at(2)); // COLUMN(WIDTH) + ASSERT_EQ(1, tensor_index.at(3)); // CHANNEL(DEPTH) } TEST(PermutingEncoderTest, feature_clone) @@ -180,7 +180,7 @@ TEST(PermutingEncoderTest, feature_clone) src_perm->axis(FeatureAxis::Width) = 2; auto dst_enc = src_enc.clone(); - auto dst_perm = dynamic_cast *>(dst_enc.get())->perm(); + auto dst_perm = loco::must_cast *>(dst_enc.get())->perm(); EXPECT_EQ(dst_perm->axis(FeatureAxis::Count), src_perm->axis(FeatureAxis::Count)); EXPECT_EQ(dst_perm->axis(FeatureAxis::Depth), src_perm->axis(FeatureAxis::Depth)); @@ -233,10 +233,10 @@ TEST(PermutingEncoderTest, filter) // Get the corresponding filter shape auto filter_shape = enc.shape(tensor_shape); - ASSERT_EQ(filter_shape.count(), 8); - ASSERT_EQ(filter_shape.depth(), 4); - ASSERT_EQ(filter_shape.height(), 1); - ASSERT_EQ(filter_shape.width(), 7); + ASSERT_EQ(8, filter_shape.count()); + ASSERT_EQ(4, filter_shape.depth()); + ASSERT_EQ(1, filter_shape.height()); + ASSERT_EQ(7, filter_shape.width()); // Let's find a source tensor index! FilterIndex filter_index; @@ -248,10 +248,10 @@ TEST(PermutingEncoderTest, filter) auto tensor_index = enc.value(filter_index); - ASSERT_EQ(tensor_index.at(0), 1); // NTH(COUNT) - ASSERT_EQ(tensor_index.at(1), 0); // ROW(HEIGHT) - ASSERT_EQ(tensor_index.at(2), 3); // COLUMN(WIDTH) - ASSERT_EQ(tensor_index.at(3), 2); // CHANNEL(DEPTH) + ASSERT_EQ(1, tensor_index.at(0)); // NTH(COUNT) + ASSERT_EQ(0, tensor_index.at(1)); // ROW(HEIGHT) + ASSERT_EQ(3, tensor_index.at(2)); // COLUMN(WIDTH) + ASSERT_EQ(2, tensor_index.at(3)); // CHANNEL(DEPTH) } TEST(PermutingEncoderTest, depthwise_filter) @@ -293,10 +293,10 @@ TEST(PermutingEncoderTest, depthwise_filter) // Get the corresponding depthwise filter shape auto filter_shape = enc.shape(tensor_shape); - ASSERT_EQ(filter_shape.depth(), 8); - ASSERT_EQ(filter_shape.multiplier(), 4); - ASSERT_EQ(filter_shape.height(), 1); - ASSERT_EQ(filter_shape.width(), 7); + ASSERT_EQ(8, filter_shape.depth()); + ASSERT_EQ(4, filter_shape.multiplier()); + ASSERT_EQ(1, filter_shape.height()); + ASSERT_EQ(7, filter_shape.width()); // Let's find a source tensor index! DepthwiseFilterIndex filter_index; @@ -308,10 +308,10 @@ TEST(PermutingEncoderTest, depthwise_filter) auto tensor_index = enc.value(filter_index); - ASSERT_EQ(tensor_index.at(0), 1); // CHANNEL(DEPTH) - ASSERT_EQ(tensor_index.at(1), 0); // ROW(HEIGHT) - ASSERT_EQ(tensor_index.at(2), 3); // COLUMN(WIDTH) - ASSERT_EQ(tensor_index.at(3), 2); // NTH(MULTIPLIER) + ASSERT_EQ(1, tensor_index.at(0)); // CHANNEL(DEPTH) + ASSERT_EQ(0, tensor_index.at(1)); // ROW(HEIGHT) + ASSERT_EQ(3, tensor_index.at(2)); // COLUMN(WIDTH) + ASSERT_EQ(2, tensor_index.at(3)); // NTH(MULTIPLIER) } TEST(PermutingEncoderTest, depthwisefilter_init) @@ -379,11 +379,11 @@ TEST(PermutingDecoderTest, feature) // Get the tensor shape corresponding to a given image auto tensor_shape = dec.shape(feature_shape); - ASSERT_EQ(tensor_shape.rank(), 4); - ASSERT_EQ(tensor_shape.dim(0), 1); // COUNT - ASSERT_EQ(tensor_shape.dim(1), 720); // HEIGHT - ASSERT_EQ(tensor_shape.dim(2), 1280); // WIDTH - ASSERT_EQ(tensor_shape.dim(3), 3); // DEPTH + ASSERT_EQ(4, tensor_shape.rank()); + ASSERT_EQ(1, tensor_shape.dim(0)); // COUNT + ASSERT_EQ(720, tensor_shape.dim(1)); // HEIGHT + ASSERT_EQ(1280, tensor_shape.dim(2)); // WIDTH + ASSERT_EQ(3, tensor_shape.dim(3)); // DEPTH // Let's find a source feature index! TensorIndex tensor_index; @@ -397,10 +397,10 @@ TEST(PermutingDecoderTest, feature) auto feature_index = dec.value(tensor_index); - ASSERT_EQ(feature_index.batch(), 0); - ASSERT_EQ(feature_index.channel(), 1); - ASSERT_EQ(feature_index.row(), 2); - ASSERT_EQ(feature_index.column(), 3); + ASSERT_EQ(0, feature_index.batch()); + ASSERT_EQ(1, feature_index.channel()); + ASSERT_EQ(2, feature_index.row()); + ASSERT_EQ(3, feature_index.column()); } TEST(PermutingDecoderTest, feature_clone) @@ -415,7 +415,7 @@ TEST(PermutingDecoderTest, feature_clone) src_perm->axis(FeatureAxis::Width) = 2; auto dst_enc = src_enc.clone(); - auto dst_perm = dynamic_cast *>(dst_enc.get())->perm(); + auto dst_perm = loco::must_cast *>(dst_enc.get())->perm(); EXPECT_EQ(dst_perm->axis(FeatureAxis::Count), src_perm->axis(FeatureAxis::Count)); EXPECT_EQ(dst_perm->axis(FeatureAxis::Depth), src_perm->axis(FeatureAxis::Depth)); @@ -468,11 +468,11 @@ TEST(PermutingDecoderTest, filter) // Get the tensor shape corresponding to a given image auto tensor_shape = dec.shape(filter_shape); - ASSERT_EQ(tensor_shape.rank(), 4); - ASSERT_EQ(tensor_shape.dim(0), 10); // COUNT - ASSERT_EQ(tensor_shape.dim(1), 6); // HEIGHT - ASSERT_EQ(tensor_shape.dim(2), 8); // WIDTH - ASSERT_EQ(tensor_shape.dim(3), 3); // DEPTH + ASSERT_EQ(4, tensor_shape.rank()); + ASSERT_EQ(10, tensor_shape.dim(0)); // COUNT + ASSERT_EQ(6, tensor_shape.dim(1)); // HEIGHT + ASSERT_EQ(8, tensor_shape.dim(2)); // WIDTH + ASSERT_EQ(3, tensor_shape.dim(3)); // DEPTH // Let's find a source filter index! TensorIndex tensor_index; @@ -486,10 +486,10 @@ TEST(PermutingDecoderTest, filter) auto filter_index = dec.value(tensor_index); - ASSERT_EQ(filter_index.nth(), 0); - ASSERT_EQ(filter_index.channel(), 1); - ASSERT_EQ(filter_index.row(), 2); - ASSERT_EQ(filter_index.column(), 3); + ASSERT_EQ(0, filter_index.nth()); + ASSERT_EQ(1, filter_index.channel()); + ASSERT_EQ(2, filter_index.row()); + ASSERT_EQ(3, filter_index.column()); } TEST(PermutingDecoderTest, depthwise_filter) @@ -530,10 +530,10 @@ TEST(PermutingDecoderTest, depthwise_filter) // Get the corresponding depthwise filter shape auto tensor_shape = dec.shape(dw_filter_shape); - ASSERT_EQ(tensor_shape.dim(0).value(), 8); - ASSERT_EQ(tensor_shape.dim(1).value(), 7); - ASSERT_EQ(tensor_shape.dim(2).value(), 4); - ASSERT_EQ(tensor_shape.dim(3).value(), 1); + ASSERT_EQ(8, tensor_shape.dim(0).value()); + ASSERT_EQ(7, tensor_shape.dim(1).value()); + ASSERT_EQ(4, tensor_shape.dim(2).value()); + ASSERT_EQ(1, tensor_shape.dim(3).value()); // Let's find a source tensor index! TensorIndex tensor_index; @@ -546,8 +546,8 @@ TEST(PermutingDecoderTest, depthwise_filter) auto dw_filter_index = dec.value(tensor_index); - ASSERT_EQ(dw_filter_index.channel(), 4); - ASSERT_EQ(dw_filter_index.nth(), 0); - ASSERT_EQ(dw_filter_index.row(), 2); - ASSERT_EQ(dw_filter_index.column(), 1); + ASSERT_EQ(4, dw_filter_index.channel()); + ASSERT_EQ(0, dw_filter_index.nth()); + ASSERT_EQ(2, dw_filter_index.row()); + ASSERT_EQ(1, dw_filter_index.column()); } diff --git a/compiler/loco/src/IR/Stride.test.cpp b/compiler/loco/src/IR/Stride.test.cpp index 60deb5c..9cc88f3 100644 --- a/compiler/loco/src/IR/Stride.test.cpp +++ b/compiler/loco/src/IR/Stride.test.cpp @@ -22,8 +22,8 @@ TEST(StrideTest, default_constructor_2D) { loco::Stride<2> stride; - ASSERT_EQ(stride.vertical(), 1); - ASSERT_EQ(stride.horizontal(), 1); + ASSERT_EQ(1, stride.vertical()); + ASSERT_EQ(1, stride.horizontal()); } TEST(StrideTest, setter_and_getter_2D) @@ -32,11 +32,11 @@ TEST(StrideTest, setter_and_getter_2D) stride.vertical(2); - ASSERT_EQ(stride.vertical(), 2); - ASSERT_EQ(stride.horizontal(), 1); + ASSERT_EQ(2, stride.vertical()); + ASSERT_EQ(1, stride.horizontal()); stride.horizontal(3); - ASSERT_EQ(stride.vertical(), 2); - ASSERT_EQ(stride.horizontal(), 3); + ASSERT_EQ(2, stride.vertical()); + ASSERT_EQ(3, stride.horizontal()); } diff --git a/compiler/loco/src/IR/TensorShape.cpp b/compiler/loco/src/IR/TensorShape.cpp index ad30dcb..e9d4f7e 100644 --- a/compiler/loco/src/IR/TensorShape.cpp +++ b/compiler/loco/src/IR/TensorShape.cpp @@ -37,3 +37,20 @@ uint32_t element_count(const loco::TensorShape *tensor_shape) } } // namespace loco + +namespace loco +{ + +bool operator==(const TensorShape &lhs, const TensorShape &rhs) +{ + if (lhs.rank() != rhs.rank()) + return false; + for (uint32_t axis = 0; axis < lhs.rank(); ++axis) + { + if (!(lhs.dim(axis) == rhs.dim(axis))) + return false; + } + return true; +} + +} // namespace loco diff --git a/compiler/loco/src/IR/TensorShape.test.cpp b/compiler/loco/src/IR/TensorShape.test.cpp index ce03ccb..ca7af72 100644 --- a/compiler/loco/src/IR/TensorShape.test.cpp +++ b/compiler/loco/src/IR/TensorShape.test.cpp @@ -22,20 +22,20 @@ TEST(TensorShapeTest, default_constructor) { loco::TensorShape tensor_shape; - ASSERT_EQ(tensor_shape.rank(), 0); + ASSERT_EQ(0, tensor_shape.rank()); } TEST(TensorShapeTest, initializer_list_constructor) { loco::TensorShape tensor_shape{3, 5}; - ASSERT_EQ(tensor_shape.rank(), 2); + ASSERT_EQ(2, tensor_shape.rank()); ASSERT_TRUE(tensor_shape.dim(0).known()); ASSERT_TRUE(tensor_shape.dim(1).known()); - ASSERT_EQ(tensor_shape.dim(0).value(), 3); - ASSERT_EQ(tensor_shape.dim(1).value(), 5); + ASSERT_EQ(3, tensor_shape.dim(0).value()); + ASSERT_EQ(5, tensor_shape.dim(1).value()); } TEST(TensorShapeTest, rank) @@ -44,7 +44,7 @@ TEST(TensorShapeTest, rank) tensor_shape.rank(2); - ASSERT_EQ(tensor_shape.rank(), 2); + ASSERT_EQ(2, tensor_shape.rank()); ASSERT_FALSE(tensor_shape.dim(0).known()); ASSERT_FALSE(tensor_shape.dim(1).known()); } @@ -60,7 +60,7 @@ TEST(TensorShapeTest, dim) ASSERT_TRUE(tensor_shape.dim(0).known()); ASSERT_FALSE(tensor_shape.dim(1).known()); - ASSERT_EQ(tensor_shape.dim(0), 3); + ASSERT_EQ(3, tensor_shape.dim(0)); } TEST(TensorShapeTest, rank_update) @@ -78,7 +78,7 @@ TEST(TensorShapeTest, rank_update) ASSERT_FALSE(tensor_shape.dim(2).known()); ASSERT_FALSE(tensor_shape.dim(3).known()); - ASSERT_EQ(tensor_shape.dim(1), 3); + ASSERT_EQ(3, tensor_shape.dim(1)); } TEST(TensorShapeTest, copy) @@ -92,12 +92,12 @@ TEST(TensorShapeTest, copy) dst = src; - ASSERT_EQ(dst.rank(), 2); + ASSERT_EQ(2, dst.rank()); ASSERT_FALSE(dst.dim(0).known()); ASSERT_TRUE(dst.dim(1).known()); - ASSERT_EQ(dst.dim(1), 3); + ASSERT_EQ(3, dst.dim(1)); } TEST(TensorShapeTest, element_count) @@ -105,5 +105,36 @@ TEST(TensorShapeTest, element_count) // Check Rank-0 case loco::TensorShape src; - ASSERT_EQ(loco::element_count(&src), 1); + ASSERT_EQ(1, loco::element_count(&src)); +} + +TEST(TensorShapeTest, equal_operator) +{ + loco::TensorShape lhs, rhs; + + lhs.rank(2); + lhs.dim(0) = 1; + lhs.dim(1) = 3; + + rhs.rank(1); + rhs.dim(0) = 1; + + EXPECT_FALSE(lhs == rhs); + + rhs.rank(2); + rhs.dim(0) = 1; + rhs.dim(1) = 3; + + EXPECT_TRUE(lhs == rhs); + + // for unknown + loco::TensorShape lhs_u, rhs_u; + + lhs_u.rank(2); + lhs_u.dim(0) = 1; + + rhs_u.rank(2); + rhs_u.dim(0) = 1; + + EXPECT_FALSE(lhs == rhs_u); } diff --git a/compiler/loco/src/IR/Use.test.cpp b/compiler/loco/src/IR/Use.test.cpp index 4a2f1cc..251e3b4 100644 --- a/compiler/loco/src/IR/Use.test.cpp +++ b/compiler/loco/src/IR/Use.test.cpp @@ -25,8 +25,8 @@ TEST(UseTest, constructor) MockupNode user; loco::Use use{&user}; - ASSERT_EQ(use.user(), &user); - ASSERT_EQ(use.node(), nullptr); + ASSERT_EQ(&user, use.user()); + ASSERT_EQ(nullptr, use.node()); } TEST(UseTest, link_node) @@ -37,6 +37,6 @@ TEST(UseTest, link_node) use.node(&def); - ASSERT_EQ(use.user(), &user); - ASSERT_EQ(use.node(), &def); + ASSERT_EQ(&user, use.user()); + ASSERT_EQ(&def, use.node()); } diff --git a/compiler/loco/src/IR/Verifier.test.cpp b/compiler/loco/src/IR/Verifier.test.cpp index 247a593..8c40a50 100644 --- a/compiler/loco/src/IR/Verifier.test.cpp +++ b/compiler/loco/src/IR/Verifier.test.cpp @@ -58,7 +58,7 @@ TEST(VerifierTest, valid_error_reporter) std::vector> errors; ASSERT_FALSE(loco::valid(g.get(), make_unique(&errors))); - ASSERT_EQ(errors.size(), 1); - ASSERT_EQ(errors.at(0).node(), push); - ASSERT_EQ(errors.at(0).index(), 0); + ASSERT_EQ(1, errors.size()); + ASSERT_EQ(push, errors.at(0).node()); + ASSERT_EQ(0, errors.at(0).index()); } diff --git a/compiler/loco/src/IR/Window.test.cpp b/compiler/loco/src/IR/Window.test.cpp index c112e0f..4cf7183 100644 --- a/compiler/loco/src/IR/Window.test.cpp +++ b/compiler/loco/src/IR/Window.test.cpp @@ -22,8 +22,8 @@ TEST(WindowTest, default_constructor_2D) { loco::Window<2> window; - ASSERT_EQ(window.vertical(), 1); - ASSERT_EQ(window.horizontal(), 1); + ASSERT_EQ(1, window.vertical()); + ASSERT_EQ(1, window.horizontal()); } TEST(WindowTest, setter_and_getter_2D) @@ -32,11 +32,11 @@ TEST(WindowTest, setter_and_getter_2D) window.vertical(2); - ASSERT_EQ(window.vertical(), 2); - ASSERT_EQ(window.horizontal(), 1); + ASSERT_EQ(2, window.vertical()); + ASSERT_EQ(1, window.horizontal()); window.horizontal(3); - ASSERT_EQ(window.vertical(), 2); - ASSERT_EQ(window.horizontal(), 3); + ASSERT_EQ(2, window.vertical()); + ASSERT_EQ(3, window.horizontal()); } diff --git a/compiler/loco/src/Service/CanonicalShapeInferenceRule.cpp b/compiler/loco/src/Service/CanonicalShapeInferenceRule.cpp index d30a827..6d5adc5 100644 --- a/compiler/loco/src/Service/CanonicalShapeInferenceRule.cpp +++ b/compiler/loco/src/Service/CanonicalShapeInferenceRule.cpp @@ -766,7 +766,7 @@ void CanonicalShapeInferenceRule::infer(const Context *ctx, const Node *node, Si assert(dynamic_cast(node) != nullptr); ForwardShapeInferenceAlgorithm alg{ctx}; - auto shape = dynamic_cast(node)->accept(&alg); + auto shape = loco::must_cast(node)->accept(&alg); sink->okay(shape); } diff --git a/compiler/loco/src/Service/CanonicalShapeInferenceRule.test.cpp b/compiler/loco/src/Service/CanonicalShapeInferenceRule.test.cpp index 5cc8c38..e88872b 100644 --- a/compiler/loco/src/Service/CanonicalShapeInferenceRule.test.cpp +++ b/compiler/loco/src/Service/CanonicalShapeInferenceRule.test.cpp @@ -35,12 +35,12 @@ TEST(CanonicalShapeInferenceRuleTest, minimal) // Verify! ASSERT_TRUE(loco::shape_known(testcase.push_node)); - ASSERT_EQ(loco::shape_get(testcase.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().rank(), 4); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(0), 1); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(1), 2); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(2), 3); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(3), 4); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.push_node).domain()); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().rank()); + ASSERT_EQ(1, loco::shape_get(testcase.push_node).as().dim(0)); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().dim(1)); + ASSERT_EQ(3, loco::shape_get(testcase.push_node).as().dim(2)); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().dim(3)); } TEST(CanonicalShapeInferenceRuleTest, const_gen) @@ -58,10 +58,10 @@ TEST(CanonicalShapeInferenceRuleTest, const_gen) // Verify! ASSERT_TRUE(loco::shape_known(testcase.push_node)); - ASSERT_EQ(loco::shape_get(testcase.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().rank(), 2); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(0), 1); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(1), 2); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.push_node).domain()); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().rank()); + ASSERT_EQ(1, loco::shape_get(testcase.push_node).as().dim(0)); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().dim(1)); } TEST(CanonicalShapeInferenceRuleTest, relu) @@ -78,12 +78,12 @@ TEST(CanonicalShapeInferenceRuleTest, relu) // Verify! ASSERT_TRUE(loco::shape_known(testcase.push_node)); - ASSERT_EQ(loco::shape_get(testcase.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().rank(), 4); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(0), 1); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(1), 2); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(2), 3); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(3), 4); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.push_node).domain()); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().rank()); + ASSERT_EQ(1, loco::shape_get(testcase.push_node).as().dim(0)); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().dim(1)); + ASSERT_EQ(3, loco::shape_get(testcase.push_node).as().dim(2)); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().dim(3)); } TEST(CanonicalShapeInferenceRuleTest, feature_codec) @@ -100,15 +100,15 @@ TEST(CanonicalShapeInferenceRuleTest, feature_codec) // Verify! ASSERT_TRUE(loco::shape_known(testcase.encode_node)); - ASSERT_EQ(loco::shape_get(testcase.encode_node).domain(), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, loco::shape_get(testcase.encode_node).domain()); ASSERT_TRUE(loco::shape_known(testcase.decode_node)); - ASSERT_EQ(loco::shape_get(testcase.decode_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.decode_node).as().rank(), 4); - ASSERT_EQ(loco::shape_get(testcase.decode_node).as().dim(0), 1); - ASSERT_EQ(loco::shape_get(testcase.decode_node).as().dim(1), 2); - ASSERT_EQ(loco::shape_get(testcase.decode_node).as().dim(2), 3); - ASSERT_EQ(loco::shape_get(testcase.decode_node).as().dim(3), 4); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.decode_node).domain()); + ASSERT_EQ(4, loco::shape_get(testcase.decode_node).as().rank()); + ASSERT_EQ(1, loco::shape_get(testcase.decode_node).as().dim(0)); + ASSERT_EQ(2, loco::shape_get(testcase.decode_node).as().dim(1)); + ASSERT_EQ(3, loco::shape_get(testcase.decode_node).as().dim(2)); + ASSERT_EQ(4, loco::shape_get(testcase.decode_node).as().dim(3)); } TEST(CanonicalShapeInferenceRuleTest, avgpool2d) @@ -141,11 +141,11 @@ TEST(CanonicalShapeInferenceRuleTest, avgpool2d) // // NOTE AvgPool2D testcase assumes NHWC layout ASSERT_TRUE(loco::shape_known(testcase.avgpool2d_node)); - ASSERT_EQ(loco::shape_get(testcase.avgpool2d_node).domain(), loco::Domain::Feature); - ASSERT_EQ(loco::shape_get(testcase.avgpool2d_node).as().count(), 1); - ASSERT_EQ(loco::shape_get(testcase.avgpool2d_node).as().depth(), 3); - ASSERT_EQ(loco::shape_get(testcase.avgpool2d_node).as().height(), 4); - ASSERT_EQ(loco::shape_get(testcase.avgpool2d_node).as().width(), 2); + ASSERT_EQ(loco::Domain::Feature, loco::shape_get(testcase.avgpool2d_node).domain()); + ASSERT_EQ(1, loco::shape_get(testcase.avgpool2d_node).as().count()); + ASSERT_EQ(3, loco::shape_get(testcase.avgpool2d_node).as().depth()); + ASSERT_EQ(4, loco::shape_get(testcase.avgpool2d_node).as().height()); + ASSERT_EQ(2, loco::shape_get(testcase.avgpool2d_node).as().width()); } TEST(CanonicalShapeInferenceRuleTest, depthwiseconv2d) @@ -172,11 +172,11 @@ TEST(CanonicalShapeInferenceRuleTest, depthwiseconv2d) // // NOTE DepthwiseConv2D testcase assumes NHWC layout ASSERT_TRUE(loco::shape_known(testcase.depthwiseconv2d_node)); - ASSERT_EQ(loco::shape_get(testcase.depthwiseconv2d_node).domain(), loco::Domain::Feature); - ASSERT_EQ(loco::shape_get(testcase.depthwiseconv2d_node).as().count(), 1); - ASSERT_EQ(loco::shape_get(testcase.depthwiseconv2d_node).as().depth(), 6); - ASSERT_EQ(loco::shape_get(testcase.depthwiseconv2d_node).as().height(), 3); - ASSERT_EQ(loco::shape_get(testcase.depthwiseconv2d_node).as().width(), 3); + ASSERT_EQ(loco::Domain::Feature, loco::shape_get(testcase.depthwiseconv2d_node).domain()); + ASSERT_EQ(1, loco::shape_get(testcase.depthwiseconv2d_node).as().count()); + ASSERT_EQ(6, loco::shape_get(testcase.depthwiseconv2d_node).as().depth()); + ASSERT_EQ(3, loco::shape_get(testcase.depthwiseconv2d_node).as().height()); + ASSERT_EQ(3, loco::shape_get(testcase.depthwiseconv2d_node).as().width()); } TEST(CanonicalShapeInferenceRuleTest, transposedconv2d) @@ -206,11 +206,11 @@ TEST(CanonicalShapeInferenceRuleTest, transposedconv2d) // Verify! ASSERT_TRUE(loco::shape_known(testcase.tr_conv2d_node)); - ASSERT_EQ(loco::shape_get(testcase.tr_conv2d_node).domain(), loco::Domain::Feature); - ASSERT_EQ(loco::shape_get(testcase.tr_conv2d_node).as().count(), 1); - ASSERT_EQ(loco::shape_get(testcase.tr_conv2d_node).as().height(), 540); - ASSERT_EQ(loco::shape_get(testcase.tr_conv2d_node).as().width(), 960); - ASSERT_EQ(loco::shape_get(testcase.tr_conv2d_node).as().depth(), 12); + ASSERT_EQ(loco::Domain::Feature, loco::shape_get(testcase.tr_conv2d_node).domain()); + ASSERT_EQ(1, loco::shape_get(testcase.tr_conv2d_node).as().count()); + ASSERT_EQ(540, loco::shape_get(testcase.tr_conv2d_node).as().height()); + ASSERT_EQ(960, loco::shape_get(testcase.tr_conv2d_node).as().width()); + ASSERT_EQ(12, loco::shape_get(testcase.tr_conv2d_node).as().depth()); } TEST(CanonicalShapeInferenceRuleTest, maxpool2d) @@ -243,11 +243,11 @@ TEST(CanonicalShapeInferenceRuleTest, maxpool2d) // // NOTE MaxPool2D testcase assumes NHWC layout ASSERT_TRUE(loco::shape_known(testcase.maxpool2d_node)); - ASSERT_EQ(loco::shape_get(testcase.maxpool2d_node).domain(), loco::Domain::Feature); - ASSERT_EQ(loco::shape_get(testcase.maxpool2d_node).as().count(), 1); - ASSERT_EQ(loco::shape_get(testcase.maxpool2d_node).as().depth(), 3); - ASSERT_EQ(loco::shape_get(testcase.maxpool2d_node).as().height(), 4); - ASSERT_EQ(loco::shape_get(testcase.maxpool2d_node).as().width(), 2); + ASSERT_EQ(loco::Domain::Feature, loco::shape_get(testcase.maxpool2d_node).domain()); + ASSERT_EQ(1, loco::shape_get(testcase.maxpool2d_node).as().count()); + ASSERT_EQ(3, loco::shape_get(testcase.maxpool2d_node).as().depth()); + ASSERT_EQ(4, loco::shape_get(testcase.maxpool2d_node).as().height()); + ASSERT_EQ(2, loco::shape_get(testcase.maxpool2d_node).as().width()); } TEST(CanonicalShapeInferenceRuleTest, tensor_concat) @@ -268,11 +268,11 @@ TEST(CanonicalShapeInferenceRuleTest, tensor_concat) // Verify! ASSERT_TRUE(loco::shape_known(testcase.concat_node)); - ASSERT_EQ(loco::shape_get(testcase.concat_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.concat_node).as().rank(), 3); - ASSERT_EQ(loco::shape_get(testcase.concat_node).as().dim(0), 1); - ASSERT_EQ(loco::shape_get(testcase.concat_node).as().dim(1), 6); - ASSERT_EQ(loco::shape_get(testcase.concat_node).as().dim(2), 3); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.concat_node).domain()); + ASSERT_EQ(3, loco::shape_get(testcase.concat_node).as().rank()); + ASSERT_EQ(1, loco::shape_get(testcase.concat_node).as().dim(0)); + ASSERT_EQ(6, loco::shape_get(testcase.concat_node).as().dim(1)); + ASSERT_EQ(3, loco::shape_get(testcase.concat_node).as().dim(2)); } TEST(CanonicalShapeInferenceRuleTest, fixed_reshape) @@ -290,10 +290,10 @@ TEST(CanonicalShapeInferenceRuleTest, fixed_reshape) // Verify! ASSERT_TRUE(loco::shape_known(testcase.push_node)); - ASSERT_EQ(loco::shape_get(testcase.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().rank(), 2); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(0), 4); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(1), 9); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.push_node).domain()); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().rank()); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().dim(0)); + ASSERT_EQ(9, loco::shape_get(testcase.push_node).as().dim(1)); } TEST(CanonicalShapeInferenceRuleTest, tensor_broadcast) @@ -310,10 +310,10 @@ TEST(CanonicalShapeInferenceRuleTest, tensor_broadcast) // Verify! ASSERT_TRUE(loco::shape_known(testcase.push_node)); - ASSERT_EQ(loco::shape_get(testcase.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().rank(), 2); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(0), 4); - ASSERT_EQ(loco::shape_get(testcase.push_node).as().dim(1), 2); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.push_node).domain()); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().rank()); + ASSERT_EQ(4, loco::shape_get(testcase.push_node).as().dim(0)); + ASSERT_EQ(2, loco::shape_get(testcase.push_node).as().dim(1)); } TEST(CanonicalShapeInferenceRuleTest, tensor_transpose) @@ -336,12 +336,12 @@ TEST(CanonicalShapeInferenceRuleTest, tensor_transpose) // Verify! ASSERT_TRUE(loco::shape_known(tc.push_node)); - ASSERT_EQ(loco::shape_get(tc.push_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(tc.push_node).as().rank(), 4); - ASSERT_EQ(loco::shape_get(tc.push_node).as().dim(0), 30); - ASSERT_EQ(loco::shape_get(tc.push_node).as().dim(1), 40); - ASSERT_EQ(loco::shape_get(tc.push_node).as().dim(2), 10); - ASSERT_EQ(loco::shape_get(tc.push_node).as().dim(3), 20); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(tc.push_node).domain()); + ASSERT_EQ(4, loco::shape_get(tc.push_node).as().rank()); + ASSERT_EQ(30, loco::shape_get(tc.push_node).as().dim(0)); + ASSERT_EQ(40, loco::shape_get(tc.push_node).as().dim(1)); + ASSERT_EQ(10, loco::shape_get(tc.push_node).as().dim(2)); + ASSERT_EQ(20, loco::shape_get(tc.push_node).as().dim(3)); } namespace @@ -393,8 +393,8 @@ TEST(CanonicalShapeInferenceRuleTest, infer_v2) rule.infer(&ctx, relu_2, &sink); - ASSERT_EQ(sink.shape.domain(), loco::Domain::Tensor); - ASSERT_EQ(sink.shape.as().rank(), 2); - ASSERT_EQ(sink.shape.as().dim(0), 4); - ASSERT_EQ(sink.shape.as().dim(1), 5); + ASSERT_EQ(loco::Domain::Tensor, sink.shape.domain()); + ASSERT_EQ(2, sink.shape.as().rank()); + ASSERT_EQ(4, sink.shape.as().dim(0)); + ASSERT_EQ(5, sink.shape.as().dim(1)); } diff --git a/compiler/loco/src/Service/GraphBuilder.test.cpp b/compiler/loco/src/Service/GraphBuilder.test.cpp index 7b2ea51..8129648 100644 --- a/compiler/loco/src/Service/GraphBuilder.test.cpp +++ b/compiler/loco/src/Service/GraphBuilder.test.cpp @@ -41,7 +41,7 @@ TEST(GraphBuilderTest, Usecase_000) auto node = gbuilder->pop(); - ASSERT_EQ(g->nodes()->size(), 1); - ASSERT_EQ(node->dialect(), loco::CanonicalDialect::get()); - ASSERT_EQ(node->opnum(), static_cast(loco::CanonicalOpcode::ConstGen)); + ASSERT_EQ(1, g->nodes()->size()); + ASSERT_EQ(loco::CanonicalDialect::get(), node->dialect()); + ASSERT_EQ(static_cast(loco::CanonicalOpcode::ConstGen), node->opnum()); } diff --git a/compiler/loco/src/Service/GraphTestcase.h b/compiler/loco/src/Service/GraphTestcase.h index 6743b9a..27b011f 100644 --- a/compiler/loco/src/Service/GraphTestcase.h +++ b/compiler/loco/src/Service/GraphTestcase.h @@ -59,7 +59,7 @@ template <> loco::Permutation make_NHWC_perm(void) template loco::Permutation make_HWCN_perm(void); -// @note Also known as HWIO permutation +/// @note Also known as HWIO permutation template <> loco::Permutation make_HWCN_perm(void) { loco::Permutation perm; diff --git a/compiler/loco/src/Service/MultiDialectShapeInferenceRule.test.cpp b/compiler/loco/src/Service/MultiDialectShapeInferenceRule.test.cpp index ffa9ee5..3d5a11a 100644 --- a/compiler/loco/src/Service/MultiDialectShapeInferenceRule.test.cpp +++ b/compiler/loco/src/Service/MultiDialectShapeInferenceRule.test.cpp @@ -120,15 +120,15 @@ TEST(MultiDialectShapeInferenceRuleTest, test1) // Verify! ASSERT_TRUE(loco::shape_known(t23_node)); auto t23_shape = loco::shape_get(t23_node); - ASSERT_EQ(t23_shape.domain(), loco::Domain::Tensor); - ASSERT_EQ(t23_shape.as().rank(), 2); - ASSERT_EQ(t23_shape.as().dim(0), 2); - ASSERT_EQ(t23_shape.as().dim(1), 3); + ASSERT_EQ(loco::Domain::Tensor, t23_shape.domain()); + ASSERT_EQ(2, t23_shape.as().rank()); + ASSERT_EQ(2, t23_shape.as().dim(0)); + ASSERT_EQ(3, t23_shape.as().dim(1)); ASSERT_TRUE(loco::shape_known(t45_node)); auto t45_shape = loco::shape_get(t45_node); - ASSERT_EQ(t45_shape.domain(), loco::Domain::Tensor); - ASSERT_EQ(t45_shape.as().rank(), 2); - ASSERT_EQ(t45_shape.as().dim(0), 4); - ASSERT_EQ(t45_shape.as().dim(1), 5); + ASSERT_EQ(loco::Domain::Tensor, t45_shape.domain()); + ASSERT_EQ(2, t45_shape.as().rank()); + ASSERT_EQ(4, t45_shape.as().dim(0)); + ASSERT_EQ(5, t45_shape.as().dim(1)); } diff --git a/compiler/loco/src/Service/ShapeInference.test.cpp b/compiler/loco/src/Service/ShapeInference.test.cpp index e10b988..2085703 100644 --- a/compiler/loco/src/Service/ShapeInference.test.cpp +++ b/compiler/loco/src/Service/ShapeInference.test.cpp @@ -71,16 +71,16 @@ TEST(ShapeInferenceTest, framework) loco::apply(&rule).to(testcase.graph()); // Framework SHOULD visit all the nodes - ASSERT_EQ(nodes.size(), 2); + ASSERT_EQ(2, nodes.size()); // Framework SHOULD visit "pull" before "push" - ASSERT_EQ(nodes.at(0), testcase.pull_node); - ASSERT_EQ(nodes.at(1), testcase.push_node); + ASSERT_EQ(testcase.pull_node, nodes.at(0)); + ASSERT_EQ(testcase.push_node, nodes.at(1)); // Framework SHOULD make an annotation if "rule" returns TRUE ASSERT_TRUE(loco::shape_known(testcase.pull_node)); - ASSERT_EQ(loco::shape_get(testcase.pull_node).domain(), loco::Domain::Tensor); - ASSERT_EQ(loco::shape_get(testcase.pull_node).as().rank(), 1); - ASSERT_EQ(loco::shape_get(testcase.pull_node).as().dim(0), 4); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(testcase.pull_node).domain()); + ASSERT_EQ(1, loco::shape_get(testcase.pull_node).as().rank()); + ASSERT_EQ(4, loco::shape_get(testcase.pull_node).as().dim(0)); // Framework SHOULD NOT make any annotation if "rule" returns FALSE ASSERT_FALSE(loco::shape_known(testcase.push_node)); diff --git a/compiler/loco/src/Service/TypeInference.cpp b/compiler/loco/src/Service/TypeInference.cpp index fbf0033..27d7d9a 100644 --- a/compiler/loco/src/Service/TypeInference.cpp +++ b/compiler/loco/src/Service/TypeInference.cpp @@ -182,7 +182,7 @@ bool CanonicalTypeInferenceRule::infer(const Node *node, DataType &dtype) const assert(dynamic_cast(node) != nullptr); CanonicalTypeForwardAlgorithm alg; - dtype = dynamic_cast(node)->accept(&alg); + dtype = loco::must_cast(node)->accept(&alg); return true; } diff --git a/compiler/loco/src/Service/TypeInference.test.cpp b/compiler/loco/src/Service/TypeInference.test.cpp index 4660401..13bcfa5 100644 --- a/compiler/loco/src/Service/TypeInference.test.cpp +++ b/compiler/loco/src/Service/TypeInference.test.cpp @@ -88,14 +88,14 @@ TEST(TypeInferenceTest, framework) loco::apply(&rule).to(g.get()); - ASSERT_EQ(nodes.size(), 2); // Framework SHOULD visit all the nodes - ASSERT_EQ(nodes.at(0), pull_node); // Framework SHOULD visit "pull" before "push" - ASSERT_EQ(nodes.at(1), push_node); + ASSERT_EQ(2, nodes.size()); // Framework SHOULD visit all the nodes + ASSERT_EQ(pull_node, nodes.at(0)); // Framework SHOULD visit "pull" before "push" + ASSERT_EQ(push_node, nodes.at(1)); // Framework SHOULD NOT make any annotation if "rule" returns FALSE ASSERT_TRUE(loco::dtype_known(pull_node)); // Framework SHOULD make an annotation if "rule" returns TRUE - ASSERT_EQ(loco::dtype_get(pull_node), loco::DataType::U8); + ASSERT_EQ(loco::DataType::U8, loco::dtype_get(pull_node)); ASSERT_FALSE(loco::dtype_known(push_node)); } @@ -129,7 +129,7 @@ TEST(CanonicalTypeInferenceRuleTest, minimal) // Verify! ASSERT_TRUE(loco::dtype_known(push_node)); - ASSERT_EQ(loco::dtype_get(push_node), loco::DataType::U8); + ASSERT_EQ(loco::DataType::U8, loco::dtype_get(push_node)); } TEST(CanonicalTypeInferenceRuleTest, relu6) @@ -166,7 +166,7 @@ TEST(CanonicalTypeInferenceRuleTest, relu6) // Verify! ASSERT_TRUE(loco::dtype_known(relu6_node)); - ASSERT_EQ(loco::dtype_get(relu6_node), loco::DataType::FLOAT32); + ASSERT_EQ(loco::DataType::FLOAT32, loco::dtype_get(relu6_node)); } TEST(CanonicalTypeInferenceRuleTest, tensor_broadcast) @@ -183,7 +183,7 @@ TEST(CanonicalTypeInferenceRuleTest, tensor_broadcast) // Verify! ASSERT_TRUE(loco::dtype_known(testcase.push_node)); - ASSERT_EQ(loco::dtype_get(testcase.push_node), loco::DataType::U8); + ASSERT_EQ(loco::DataType::U8, loco::dtype_get(testcase.push_node)); } // mockup for MultiDialectTypeInferenceRule @@ -275,8 +275,8 @@ TEST(MultiDialectTypeInferenceRuleTest, test1) // Verify! ASSERT_TRUE(loco::dtype_known(s8_node)); - ASSERT_EQ(loco::dtype_get(s8_node), loco::DataType::S8); + ASSERT_EQ(loco::DataType::S8, loco::dtype_get(s8_node)); ASSERT_TRUE(loco::dtype_known(u8_node)); - ASSERT_EQ(loco::dtype_get(u8_node), loco::DataType::U8); + ASSERT_EQ(loco::DataType::U8, loco::dtype_get(u8_node)); } diff --git a/compiler/loco/src/loco.test.cpp b/compiler/loco/src/loco.test.cpp index 4c4f51a..e5668b6 100644 --- a/compiler/loco/src/loco.test.cpp +++ b/compiler/loco/src/loco.test.cpp @@ -58,11 +58,11 @@ TEST(LOCO, identity_network) loco::link(graph_output, push_node); // loco::link SHOULD update "index" - ASSERT_EQ(pull_node->index(), 0); - ASSERT_EQ(graph_input->dtype(), loco::DataType::FLOAT32); + ASSERT_EQ(0, pull_node->index()); + ASSERT_EQ(loco::DataType::FLOAT32, graph_input->dtype()); // loco::link SHOULD update "index" - ASSERT_EQ(push_node->index(), 0); + ASSERT_EQ(0, push_node->index()); } #if 0 @@ -99,10 +99,10 @@ TEST(LOCO, identity_network_V2) push_node->index(0); push_node->from(pull_node); - ASSERT_EQ(pull_node->dtype(), loco::DataType::FLOAT32); + ASSERT_EQ(loco::DataType::FLOAT32, pull_node->dtype()); // TODO Check Shape of pull_node // TODO Check Shape of push_node - ASSERT_EQ(loco::pull_node(g.get(), 0), pull_node); - ASSERT_EQ(loco::push_node(g.get(), 0), push_node); + ASSERT_EQ(pull_node, loco::pull_node(g.get(), 0)); + ASSERT_EQ(push_node, loco::push_node(g.get(), 0)); } diff --git a/compiler/locoex-customop/src/Service/COpShapeInferenceRule.cpp b/compiler/locoex-customop/src/Service/COpShapeInferenceRule.cpp index 4dc8f46..cf9decc 100644 --- a/compiler/locoex-customop/src/Service/COpShapeInferenceRule.cpp +++ b/compiler/locoex-customop/src/Service/COpShapeInferenceRule.cpp @@ -37,7 +37,7 @@ bool COpShapeInferenceRule::infer(const loco::Node *node, loco::NodeShape &shape assert(node->dialect() == COpDialect::get()); assert(dynamic_cast(node) != nullptr); - auto cop_call = dynamic_cast(node); + auto cop_call = loco::must_cast(node); // Note that the shape of custom op is considered as TensorShape // TODO Decide how to deal with this shape error cases diff --git a/compiler/locomotiv/src/Node/AvgPool2D.cpp b/compiler/locomotiv/src/Node/AvgPool2D.cpp index ad603ba..5fdf1e7 100644 --- a/compiler/locomotiv/src/Node/AvgPool2D.cpp +++ b/compiler/locomotiv/src/Node/AvgPool2D.cpp @@ -129,7 +129,8 @@ nncc::core::ADT::tensor::Buffer avgPool2D(const loco::AvgPool2D *avgpool2d, } } - assert(filter_ele_count > 0); + if (filter_ele_count <= 0) + throw std::runtime_error("The number of filter element must be greater than zero."); output_buf.at(Index({batch, out_y, out_x, channel})) = total / filter_ele_count; } } @@ -141,10 +142,12 @@ nncc::core::ADT::tensor::Buffer avgPool2D(const loco::AvgPool2D *avgpool2d, } // namespace -namespace locomotiv +namespace { -void NodeExecution::execute(loco::AvgPool2D *avgpool2d) +using namespace locomotiv; + +void exectute_node(loco::AvgPool2D *avgpool2d) { auto ifm_data = annot_data(avgpool2d->ifm()); @@ -176,4 +179,11 @@ void NodeExecution::execute(loco::AvgPool2D *avgpool2d) annot_domain(avgpool2d, loco::Domain::Feature); } +} // namespace + +namespace locomotiv +{ + +void NodeExecution::execute(loco::AvgPool2D *avgpool2d) { exectute_node(avgpool2d); } + } // namespace locomotiv diff --git a/compiler/locomotiv/src/Node/AvgPool2D.test.cpp b/compiler/locomotiv/src/Node/AvgPool2D.test.cpp index 89e10a3..f9863b4 100644 --- a/compiler/locomotiv/src/Node/AvgPool2D.test.cpp +++ b/compiler/locomotiv/src/Node/AvgPool2D.test.cpp @@ -88,10 +88,10 @@ void run_test(const float *ifm, const float *expected_ofm, const Shape &ifm_shap for (nncc::core::ADT::tensor::IndexEnumerator e{ofm_shape}; e.valid(); e.advance()) { const auto &ind = e.current(); - ASSERT_FLOAT_EQ(avgpool2d_data->as_f32_bufptr()->at(ind), ofm_overlay.at(ind)); + ASSERT_FLOAT_EQ(ofm_overlay.at(ind), avgpool2d_data->as_f32_bufptr()->at(ind)); } - ASSERT_EQ(locomotiv::annot_domain(avgpool2d), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(avgpool2d)); } } // namespace diff --git a/compiler/locomotiv/src/Node/BiasAdd.cpp b/compiler/locomotiv/src/Node/BiasAdd.cpp index 0724fb7..dfe32ca 100644 --- a/compiler/locomotiv/src/Node/BiasAdd.cpp +++ b/compiler/locomotiv/src/Node/BiasAdd.cpp @@ -46,6 +46,8 @@ namespace locomotiv void NodeExecution::execute(loco::BiasAdd *bias_add) { + validate(bias_add, "BiasAdd is nullptr"); + auto input_data = locomotiv::annot_data(bias_add->value()); auto bias_data = locomotiv::annot_data(bias_add->bias()); @@ -63,6 +65,8 @@ void NodeExecution::execute(loco::BiasAdd *bias_add) void NodeExecution::execute(loco::BiasAdd *bias_add) { + validate(bias_add, "BiasAdd is nullptr"); + auto input_data = locomotiv::annot_data(bias_add->value()); auto bias_data = locomotiv::annot_data(bias_add->bias()); diff --git a/compiler/locomotiv/src/Node/BiasAdd.test.cpp b/compiler/locomotiv/src/Node/BiasAdd.test.cpp index 0ca8266..cba2d41 100644 --- a/compiler/locomotiv/src/Node/BiasAdd.test.cpp +++ b/compiler/locomotiv/src/Node/BiasAdd.test.cpp @@ -107,16 +107,16 @@ TEST(NodeExecution_TensorBiasAdd, f32) // comparing the result ASSERT_NE(bias_add_data, nullptr); - ASSERT_EQ(bias_add_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(bias_add_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, bias_add_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(bias_add_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(bias_add_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(bias_add_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], bias_add_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(bias_add), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(bias_add)); } /* @@ -191,14 +191,14 @@ TEST(NodeExecution_FeatureBiasAdd, f32) // comparing the result ASSERT_NE(bias_add_data, nullptr); - ASSERT_EQ(bias_add_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(bias_add_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, bias_add_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(bias_add_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(bias_add_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(bias_add_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], bias_add_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(feature_bias_add), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(feature_bias_add)); } diff --git a/compiler/locomotiv/src/Node/BiasEncode.test.cpp b/compiler/locomotiv/src/Node/BiasEncode.test.cpp index 73e2af8..cdb255c 100644 --- a/compiler/locomotiv/src/Node/BiasEncode.test.cpp +++ b/compiler/locomotiv/src/Node/BiasEncode.test.cpp @@ -82,11 +82,11 @@ template void test() auto bias_enc_data = locomotiv::annot_data(bias_enc); ASSERT_NE(bias_enc_data, nullptr); - ASSERT_EQ(bias_enc_data->dtype(), loco_dtype()); - ASSERT_EQ(*(bias_enc_data->shape()), Shape{1}); - ASSERT_EQ(as_bufptr(bias_enc_data)->at(Index{0}), pull_buf.at(Index{0})); + ASSERT_EQ(loco_dtype(), bias_enc_data->dtype()); + ASSERT_EQ(Shape{1}, *(bias_enc_data->shape())); + ASSERT_EQ(pull_buf.at(Index{0}), as_bufptr(bias_enc_data)->at(Index{0})); - ASSERT_EQ(locomotiv::annot_domain(bias_enc), loco::Domain::Bias); + ASSERT_EQ(loco::Domain::Bias, locomotiv::annot_domain(bias_enc)); } } // namespace diff --git a/compiler/locomotiv/src/Node/ConstGen.test.cpp b/compiler/locomotiv/src/Node/ConstGen.test.cpp index 838f4c1..382cc77 100644 --- a/compiler/locomotiv/src/Node/ConstGen.test.cpp +++ b/compiler/locomotiv/src/Node/ConstGen.test.cpp @@ -53,16 +53,16 @@ TEST(NodeExecution_ConstGen, s32) // test auto data = locomotiv::annot_data(&constgen); ASSERT_NE(data, nullptr); - ASSERT_EQ(data->dtype(), loco::DataType::S32); - ASSERT_EQ(*data->shape(), Shape({2, 3})); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{0, 0}), 0); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{0, 1}), 1); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{0, 2}), 2); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{1, 0}), -3); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{1, 1}), -4); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{1, 2}), -5); - - ASSERT_EQ(locomotiv::annot_domain(&constgen), loco::Domain::Tensor); + ASSERT_EQ(loco::DataType::S32, data->dtype()); + ASSERT_EQ(Shape({2, 3}), *data->shape()); + ASSERT_EQ(0, data->as_s32_bufptr()->at(Index{0, 0})); + ASSERT_EQ(1, data->as_s32_bufptr()->at(Index{0, 1})); + ASSERT_EQ(2, data->as_s32_bufptr()->at(Index{0, 2})); + ASSERT_EQ(-3, data->as_s32_bufptr()->at(Index{1, 0})); + ASSERT_EQ(-4, data->as_s32_bufptr()->at(Index{1, 1})); + ASSERT_EQ(-5, data->as_s32_bufptr()->at(Index{1, 2})); + + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(&constgen)); } TEST(NodeExecution_ConstGen, f32) @@ -87,14 +87,14 @@ TEST(NodeExecution_ConstGen, f32) // test auto data = locomotiv::annot_data(&constgen); ASSERT_NE(data, nullptr); - ASSERT_EQ(data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*data->shape(), Shape({2, 3})); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{0, 0}), 0.0f); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{0, 1}), 1.0f); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{0, 2}), 2.0f); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{1, 0}), 3.0f); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{1, 1}), 4.0f); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{1, 2}), 5.0f); - - ASSERT_EQ(locomotiv::annot_domain(&constgen), loco::Domain::Tensor); + ASSERT_EQ(loco::DataType::FLOAT32, data->dtype()); + ASSERT_EQ(Shape({2, 3}), *data->shape()); + ASSERT_FLOAT_EQ(0.0f, data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(1.0f, data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(2.0f, data->as_f32_bufptr()->at(Index{0, 2})); + ASSERT_FLOAT_EQ(3.0f, data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(4.0f, data->as_f32_bufptr()->at(Index{1, 1})); + ASSERT_FLOAT_EQ(5.0f, data->as_f32_bufptr()->at(Index{1, 2})); + + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(&constgen)); } diff --git a/compiler/locomotiv/src/Node/Conv2D.test.cpp b/compiler/locomotiv/src/Node/Conv2D.test.cpp index 83d7fc2..66e947a 100644 --- a/compiler/locomotiv/src/Node/Conv2D.test.cpp +++ b/compiler/locomotiv/src/Node/Conv2D.test.cpp @@ -101,10 +101,10 @@ void run_test(const float *ifm, const float *ker, const float *expected_ofm, con for (nncc::core::ADT::tensor::IndexEnumerator e{ofm_shape}; e.valid(); e.advance()) { const auto &ind = e.current(); - ASSERT_FLOAT_EQ(conv2d_result->as_f32_bufptr()->at(ind), ofm_overlay.at(ind)); + ASSERT_FLOAT_EQ(ofm_overlay.at(ind), conv2d_result->as_f32_bufptr()->at(ind)); } - ASSERT_EQ(locomotiv::annot_domain(conv2d), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(conv2d)); } } // namespace diff --git a/compiler/locomotiv/src/Node/DepthwiseConv2D.test.cpp b/compiler/locomotiv/src/Node/DepthwiseConv2D.test.cpp index 48824c2..1ff333b 100644 --- a/compiler/locomotiv/src/Node/DepthwiseConv2D.test.cpp +++ b/compiler/locomotiv/src/Node/DepthwiseConv2D.test.cpp @@ -101,10 +101,10 @@ void run_test(const float *ifm, const float *ker, const float *expected_ofm, con for (nncc::core::ADT::tensor::IndexEnumerator e{ofm_shape}; e.valid(); e.advance()) { const auto &ind = e.current(); - ASSERT_FLOAT_EQ(dw_conv2d_result->as_f32_bufptr()->at(ind), ofm_overlay.at(ind)); + ASSERT_FLOAT_EQ(ofm_overlay.at(ind), dw_conv2d_result->as_f32_bufptr()->at(ind)); } - ASSERT_EQ(locomotiv::annot_domain(dw_conv2d), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(dw_conv2d)); } } // namespace diff --git a/compiler/locomotiv/src/Node/DepthwiseFilterEncode.test.cpp b/compiler/locomotiv/src/Node/DepthwiseFilterEncode.test.cpp index db828c0..5b2ec93 100644 --- a/compiler/locomotiv/src/Node/DepthwiseFilterEncode.test.cpp +++ b/compiler/locomotiv/src/Node/DepthwiseFilterEncode.test.cpp @@ -77,14 +77,14 @@ TEST(NodeExecution_DepthwiseFilterEncode, f32) auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(enc_data->shape()), (Shape{H, W, C, M})); // locomotiv depthwise filter is HWCM + ASSERT_EQ(loco::DataType::FLOAT32, enc_data->dtype()); + ASSERT_EQ((Shape{H, W, C, M}), *(enc_data->shape())); // locomotiv depthwise filter is HWCM auto enc_buf = enc_data->as_f32_bufptr(); for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) for (uint32_t m = 0; m < M; ++m) - ASSERT_FLOAT_EQ(pull_buf.at(Index{m, h, w, c}), enc_buf->at(Index{h, w, c, m})); + ASSERT_FLOAT_EQ(enc_buf->at(Index{h, w, c, m}), pull_buf.at(Index{m, h, w, c})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::DepthwiseFilter); + ASSERT_EQ(loco::Domain::DepthwiseFilter, locomotiv::annot_domain(enc)); } diff --git a/compiler/locomotiv/src/Node/EltwiseAdd.test.cpp b/compiler/locomotiv/src/Node/EltwiseAdd.test.cpp index 2899dcc..2873a65 100644 --- a/compiler/locomotiv/src/Node/EltwiseAdd.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseAdd.test.cpp @@ -108,14 +108,14 @@ TEST(NodeExecution_EltwiseAdd, f32) // comparing the result ASSERT_NE(eltwise_add_data, nullptr); - ASSERT_EQ(eltwise_add_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(eltwise_add_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, eltwise_add_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(eltwise_add_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(eltwise_add_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(eltwise_add_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], eltwise_add_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(eltwise_add), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(eltwise_add)); } diff --git a/compiler/locomotiv/src/Node/EltwiseDiv.test.cpp b/compiler/locomotiv/src/Node/EltwiseDiv.test.cpp index 60950c1..cc50450 100644 --- a/compiler/locomotiv/src/Node/EltwiseDiv.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseDiv.test.cpp @@ -108,14 +108,14 @@ TEST(NodeExecution_EltwiseDiv, f32) // comparing the result ASSERT_NE(eltwise_div_data, nullptr); - ASSERT_EQ(eltwise_div_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(eltwise_div_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, eltwise_div_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(eltwise_div_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(eltwise_div_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(eltwise_div_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], eltwise_div_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(eltwise_div), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(eltwise_div)); } diff --git a/compiler/locomotiv/src/Node/EltwiseMax.test.cpp b/compiler/locomotiv/src/Node/EltwiseMax.test.cpp index c64db89..94c3982 100644 --- a/compiler/locomotiv/src/Node/EltwiseMax.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseMax.test.cpp @@ -108,14 +108,14 @@ TEST(NodeExecution_EltwiseMax, f32) // comparing the result ASSERT_NE(eltwise_max_data, nullptr); - ASSERT_EQ(eltwise_max_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(eltwise_max_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, eltwise_max_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(eltwise_max_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(eltwise_max_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(eltwise_max_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], eltwise_max_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(eltwise_max), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(eltwise_max)); } diff --git a/compiler/locomotiv/src/Node/EltwiseMul.test.cpp b/compiler/locomotiv/src/Node/EltwiseMul.test.cpp index b768883..bbe51bc 100644 --- a/compiler/locomotiv/src/Node/EltwiseMul.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseMul.test.cpp @@ -111,14 +111,14 @@ TEST(NodeExecution_EltwiseMul, f32) // comparing the result ASSERT_NE(eltwise_mul_data, nullptr); - ASSERT_EQ(eltwise_mul_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(eltwise_mul_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, eltwise_mul_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(eltwise_mul_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(eltwise_mul_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(eltwise_mul_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], eltwise_mul_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(eltwise_mul), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(eltwise_mul)); } diff --git a/compiler/locomotiv/src/Node/EltwiseSqrt.test.cpp b/compiler/locomotiv/src/Node/EltwiseSqrt.test.cpp index adb1b85..44d0ca6 100644 --- a/compiler/locomotiv/src/Node/EltwiseSqrt.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseSqrt.test.cpp @@ -58,12 +58,12 @@ TEST(NodeExecution_EltwiseSqrt, f32) auto sqrt_data = locomotiv::annot_data(sqrt); ASSERT_NE(sqrt_data, nullptr); - ASSERT_EQ(sqrt_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(sqrt_data->shape()), Shape{4}); - ASSERT_FLOAT_EQ(sqrt_data->as_f32_bufptr()->at(Index{0}), 2.0f); - ASSERT_FLOAT_EQ(sqrt_data->as_f32_bufptr()->at(Index{1}), 3.0f); - ASSERT_FLOAT_EQ(sqrt_data->as_f32_bufptr()->at(Index{2}), 0.0f); + ASSERT_EQ(loco::DataType::FLOAT32, sqrt_data->dtype()); + ASSERT_EQ(Shape{4}, *(sqrt_data->shape())); + ASSERT_FLOAT_EQ(2.0f, sqrt_data->as_f32_bufptr()->at(Index{0})); + ASSERT_FLOAT_EQ(3.0f, sqrt_data->as_f32_bufptr()->at(Index{1})); + ASSERT_FLOAT_EQ(0.0f, sqrt_data->as_f32_bufptr()->at(Index{2})); ASSERT_TRUE(std::isnan(sqrt_data->as_f32_bufptr()->at(Index{3}))); - ASSERT_EQ(locomotiv::annot_domain(sqrt), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(sqrt)); } diff --git a/compiler/locomotiv/src/Node/EltwiseSub.test.cpp b/compiler/locomotiv/src/Node/EltwiseSub.test.cpp index 7eff90f..94dc9c9 100644 --- a/compiler/locomotiv/src/Node/EltwiseSub.test.cpp +++ b/compiler/locomotiv/src/Node/EltwiseSub.test.cpp @@ -108,14 +108,14 @@ TEST(NodeExecution_EltwiseSub, f32) // comparing the result ASSERT_NE(eltwise_sub_data, nullptr); - ASSERT_EQ(eltwise_sub_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(eltwise_sub_data->shape()), Shape({1, 3, 3, 2})); + ASSERT_EQ(loco::DataType::FLOAT32, eltwise_sub_data->dtype()); + ASSERT_EQ(Shape({1, 3, 3, 2}), *(eltwise_sub_data->shape())); uint32_t n = 0; for (IndexEnumerator e{*(eltwise_sub_data->shape())}; e.valid(); e.advance()) { - ASSERT_FLOAT_EQ(eltwise_sub_data->as_f32_bufptr()->at(e.current()), out_val[n++]); + ASSERT_FLOAT_EQ(out_val[n++], eltwise_sub_data->as_f32_bufptr()->at(e.current())); } - ASSERT_EQ(locomotiv::annot_domain(eltwise_sub), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(eltwise_sub)); } diff --git a/compiler/locomotiv/src/Node/FeatureCodec.test.cpp b/compiler/locomotiv/src/Node/FeatureCodec.test.cpp index c35f0e6..1b6b06c 100644 --- a/compiler/locomotiv/src/Node/FeatureCodec.test.cpp +++ b/compiler/locomotiv/src/Node/FeatureCodec.test.cpp @@ -128,16 +128,16 @@ TEST_F(NodeExecution_FeatureCodec, s32) // Test FeatureEncode auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(enc_data->shape()), (Shape{N, H, W, C})); // locomotiv feature is NHWC + ASSERT_EQ(loco::DataType::S32, enc_data->dtype()); + ASSERT_EQ((Shape{N, H, W, C}), *(enc_data->shape())); // locomotiv feature is NHWC auto enc_buf = enc_data->as_s32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_EQ(pull_buf.at(Index{n, c, h, w}), enc_buf->at(Index{n, h, w, c})); + ASSERT_EQ(enc_buf->at(Index{n, h, w, c}), pull_buf.at(Index{n, c, h, w})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(enc)); // FeatureDecode auto dec = feature_decode_layer(enc, NCHW); @@ -146,16 +146,16 @@ TEST_F(NodeExecution_FeatureCodec, s32) // Test FeatureDecode: Encode -> Decode == identity auto dec_data = locomotiv::annot_data(dec); ASSERT_NE(dec_data, nullptr); - ASSERT_EQ(dec_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(dec_data->shape()), (Shape{N, C, H, W})); + ASSERT_EQ(loco::DataType::S32, dec_data->dtype()); + ASSERT_EQ((Shape{N, C, H, W}), *(dec_data->shape())); auto dec_buf = dec_data->as_s32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_EQ(pull_buf.at(Index{n, c, h, w}), dec_buf->at(Index{n, c, h, w})); + ASSERT_EQ(dec_buf->at(Index{n, c, h, w}), pull_buf.at(Index{n, c, h, w})); - ASSERT_EQ(locomotiv::annot_domain(dec), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(dec)); } TEST_F(NodeExecution_FeatureCodec, f32) @@ -192,16 +192,16 @@ TEST_F(NodeExecution_FeatureCodec, f32) // Test FeatureEncode auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(enc_data->shape()), (Shape{N, H, W, C})); // locomotiv feature is NHWC + ASSERT_EQ(loco::DataType::FLOAT32, enc_data->dtype()); + ASSERT_EQ((Shape{N, H, W, C}), *(enc_data->shape())); // locomotiv feature is NHWC auto enc_buf = enc_data->as_f32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_FLOAT_EQ(pull_buf.at(Index{c, h, n, w}), enc_buf->at(Index{n, h, w, c})); + ASSERT_FLOAT_EQ(enc_buf->at(Index{n, h, w, c}), pull_buf.at(Index{c, h, n, w})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(enc)); // FeatureDecode auto dec = feature_decode_layer(enc, CHNW); @@ -210,14 +210,14 @@ TEST_F(NodeExecution_FeatureCodec, f32) // Test FeatureDecode: Encode -> Decode == identity auto dec_data = locomotiv::annot_data(dec); ASSERT_NE(dec_data, nullptr); - ASSERT_EQ(dec_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(dec_data->shape()), (Shape{C, H, N, W})); + ASSERT_EQ(loco::DataType::FLOAT32, dec_data->dtype()); + ASSERT_EQ((Shape{C, H, N, W}), *(dec_data->shape())); auto dec_buf = dec_data->as_f32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_FLOAT_EQ(pull_buf.at(Index{c, h, n, w}), dec_buf->at(Index{c, h, n, w})); + ASSERT_FLOAT_EQ(dec_buf->at(Index{c, h, n, w}), pull_buf.at(Index{c, h, n, w})); - ASSERT_EQ(locomotiv::annot_domain(dec), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(dec)); } diff --git a/compiler/locomotiv/src/Node/FilterEncode.test.cpp b/compiler/locomotiv/src/Node/FilterEncode.test.cpp index 79b8308..dcca949 100644 --- a/compiler/locomotiv/src/Node/FilterEncode.test.cpp +++ b/compiler/locomotiv/src/Node/FilterEncode.test.cpp @@ -77,16 +77,16 @@ TEST(NodeExecution_FilterEncode, s32) auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(enc_data->shape()), (Shape{N, H, W, C})); // locomotiv filter is NHWC + ASSERT_EQ(loco::DataType::S32, enc_data->dtype()); + ASSERT_EQ((Shape{N, H, W, C}), *(enc_data->shape())); // locomotiv filter is NHWC auto enc_buf = enc_data->as_s32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_EQ(pull_buf.at(Index{n, c, h, w}), enc_buf->at(Index{n, h, w, c})); + ASSERT_EQ(enc_buf->at(Index{n, h, w, c}), pull_buf.at(Index{n, c, h, w})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Filter); + ASSERT_EQ(loco::Domain::Filter, locomotiv::annot_domain(enc)); } TEST(NodeExecution_FilterEncode, f32) @@ -131,14 +131,14 @@ TEST(NodeExecution_FilterEncode, f32) auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(enc_data->shape()), (Shape{N, H, W, C})); // locomotiv filter is NHWC + ASSERT_EQ(loco::DataType::FLOAT32, enc_data->dtype()); + ASSERT_EQ((Shape{N, H, W, C}), *(enc_data->shape())); // locomotiv filter is NHWC auto enc_buf = enc_data->as_f32_bufptr(); for (uint32_t n = 0; n < N; ++n) for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) for (uint32_t c = 0; c < C; ++c) - ASSERT_FLOAT_EQ(pull_buf.at(Index{c, h, n, w}), enc_buf->at(Index{n, h, w, c})); + ASSERT_FLOAT_EQ(enc_buf->at(Index{n, h, w, c}), pull_buf.at(Index{c, h, n, w})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Filter); + ASSERT_EQ(loco::Domain::Filter, locomotiv::annot_domain(enc)); } diff --git a/compiler/locomotiv/src/Node/Forward.test.cpp b/compiler/locomotiv/src/Node/Forward.test.cpp index 73d3713..5116a95 100644 --- a/compiler/locomotiv/src/Node/Forward.test.cpp +++ b/compiler/locomotiv/src/Node/Forward.test.cpp @@ -52,11 +52,11 @@ TEST(NodeExecution_Forward, s32) auto forward_data = locomotiv::annot_data(forward); ASSERT_NE(forward_data, nullptr); - ASSERT_EQ(forward_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(forward_data->shape()), Shape{1}); - ASSERT_EQ(forward_data->as_s32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); + ASSERT_EQ(loco::DataType::S32, forward_data->dtype()); + ASSERT_EQ(Shape{1}, *(forward_data->shape())); + ASSERT_EQ(pull_buf.at(Index{0}), forward_data->as_s32_bufptr()->at(Index{0})); - ASSERT_EQ(locomotiv::annot_domain(forward), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(forward)); } TEST(NodeExecution_Forward, f32) @@ -80,9 +80,9 @@ TEST(NodeExecution_Forward, f32) auto forward_data = locomotiv::annot_data(forward); ASSERT_NE(forward_data, nullptr); - ASSERT_EQ(forward_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(forward_data->shape()), Shape{1}); - ASSERT_FLOAT_EQ(forward_data->as_f32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); + ASSERT_EQ(loco::DataType::FLOAT32, forward_data->dtype()); + ASSERT_EQ(Shape{1}, *(forward_data->shape())); + ASSERT_FLOAT_EQ(pull_buf.at(Index{0}), forward_data->as_f32_bufptr()->at(Index{0})); - ASSERT_EQ(locomotiv::annot_domain(forward), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(forward)); } diff --git a/compiler/locomotiv/src/Node/MatMul.test.cpp b/compiler/locomotiv/src/Node/MatMul.test.cpp index bd480f7..f1f3a52 100644 --- a/compiler/locomotiv/src/Node/MatMul.test.cpp +++ b/compiler/locomotiv/src/Node/MatMul.test.cpp @@ -92,14 +92,14 @@ void run_test(const T *lhs, const T *rhs, const T *expected_output, const Shape { const auto &ind = e.current(); if (expected_datatype == loco::DataType::FLOAT32) - ASSERT_FLOAT_EQ(mat_mul_result->as_f32_bufptr()->at(ind), out_overlay.at(ind)); + ASSERT_FLOAT_EQ(out_overlay.at(ind), mat_mul_result->as_f32_bufptr()->at(ind)); else if (expected_datatype == loco::DataType::S32) - ASSERT_EQ(mat_mul_result->as_s32_bufptr()->at(ind), out_overlay.at(ind)); + ASSERT_EQ(out_overlay.at(ind), mat_mul_result->as_s32_bufptr()->at(ind)); else throw std::runtime_error("NYI for these DataTypes"); } - ASSERT_EQ(locomotiv::annot_domain(mat_mul), loco::Domain::Matrix); + ASSERT_EQ(loco::Domain::Matrix, locomotiv::annot_domain(mat_mul)); } } // namespace diff --git a/compiler/locomotiv/src/Node/MatrixCodec.test.cpp b/compiler/locomotiv/src/Node/MatrixCodec.test.cpp index 8fc5d59..da4afed 100644 --- a/compiler/locomotiv/src/Node/MatrixCodec.test.cpp +++ b/compiler/locomotiv/src/Node/MatrixCodec.test.cpp @@ -124,14 +124,14 @@ TEST_F(NodeExecution_MatrixCodec, HW_s32) // Test MatrixEncode auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(enc_data->shape()), (Shape{H, W})); // locomotiv matrix is HW + ASSERT_EQ(loco::DataType::S32, enc_data->dtype()); + ASSERT_EQ((Shape{H, W}), *(enc_data->shape())); // locomotiv matrix is HW auto enc_buf = enc_data->as_s32_bufptr(); for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) - ASSERT_EQ(pull_buf.at(Index{h, w}), enc_buf->at(Index{h, w})); + ASSERT_EQ(enc_buf->at(Index{h, w}), pull_buf.at(Index{h, w})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Matrix); + ASSERT_EQ(loco::Domain::Matrix, locomotiv::annot_domain(enc)); // MatrixDecode auto dec = matrix_decode_layer(enc, HW); @@ -140,14 +140,14 @@ TEST_F(NodeExecution_MatrixCodec, HW_s32) // Test MatrixDecode: Encode -> Decode == identity auto dec_data = locomotiv::annot_data(dec); ASSERT_NE(dec_data, nullptr); - ASSERT_EQ(dec_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(dec_data->shape()), (Shape{H, W})); + ASSERT_EQ(loco::DataType::S32, dec_data->dtype()); + ASSERT_EQ((Shape{H, W}), *(dec_data->shape())); auto dec_buf = dec_data->as_s32_bufptr(); for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) - ASSERT_EQ(pull_buf.at(Index{h, w}), dec_buf->at(Index{h, w})); + ASSERT_EQ(dec_buf->at(Index{h, w}), pull_buf.at(Index{h, w})); - ASSERT_EQ(locomotiv::annot_domain(dec), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(dec)); } TEST_F(NodeExecution_MatrixCodec, WH_f32) @@ -180,14 +180,14 @@ TEST_F(NodeExecution_MatrixCodec, WH_f32) // Test MatrixEncode auto enc_data = locomotiv::annot_data(enc); ASSERT_NE(enc_data, nullptr); - ASSERT_EQ(enc_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(enc_data->shape()), (Shape{H, W})); // locomotiv matrix is HW + ASSERT_EQ(loco::DataType::FLOAT32, enc_data->dtype()); + ASSERT_EQ((Shape{H, W}), *(enc_data->shape())); // locomotiv matrix is HW auto enc_buf = enc_data->as_f32_bufptr(); for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) - ASSERT_FLOAT_EQ(pull_buf.at(Index{w, h}), enc_buf->at(Index{h, w})); + ASSERT_FLOAT_EQ(enc_buf->at(Index{h, w}), pull_buf.at(Index{w, h})); - ASSERT_EQ(locomotiv::annot_domain(enc), loco::Domain::Matrix); + ASSERT_EQ(loco::Domain::Matrix, locomotiv::annot_domain(enc)); // MatrixDecode auto dec = matrix_decode_layer(enc, WH); @@ -196,12 +196,12 @@ TEST_F(NodeExecution_MatrixCodec, WH_f32) // Test MatrixDecode: Encode -> Decode == identity auto dec_data = locomotiv::annot_data(dec); ASSERT_NE(dec_data, nullptr); - ASSERT_EQ(dec_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(dec_data->shape()), (Shape{W, H})); + ASSERT_EQ(loco::DataType::FLOAT32, dec_data->dtype()); + ASSERT_EQ((Shape{W, H}), *(dec_data->shape())); auto dec_buf = dec_data->as_f32_bufptr(); for (uint32_t h = 0; h < H; ++h) for (uint32_t w = 0; w < W; ++w) - ASSERT_FLOAT_EQ(pull_buf.at(Index{w, h}), dec_buf->at(Index{w, h})); + ASSERT_FLOAT_EQ(dec_buf->at(Index{w, h}), pull_buf.at(Index{w, h})); - ASSERT_EQ(locomotiv::annot_domain(dec), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(dec)); } diff --git a/compiler/locomotiv/src/Node/MaxPool2D.test.cpp b/compiler/locomotiv/src/Node/MaxPool2D.test.cpp index 9d877a9..5046d4a 100644 --- a/compiler/locomotiv/src/Node/MaxPool2D.test.cpp +++ b/compiler/locomotiv/src/Node/MaxPool2D.test.cpp @@ -86,10 +86,10 @@ void run_test(const float *ifm, const float *expected_ofm, const Shape &ifm_shap for (nncc::core::ADT::tensor::IndexEnumerator e{ofm_shape}; e.valid(); e.advance()) { const auto &ind = e.current(); - ASSERT_FLOAT_EQ(maxpool2d_data->as_f32_bufptr()->at(ind), ofm_overlay.at(ind)); + ASSERT_FLOAT_EQ(ofm_overlay.at(ind), maxpool2d_data->as_f32_bufptr()->at(ind)); } - ASSERT_EQ(locomotiv::annot_domain(maxpool2d), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(maxpool2d)); } } // namespace diff --git a/compiler/locomotiv/src/Node/Push.test.cpp b/compiler/locomotiv/src/Node/Push.test.cpp index be8f1e4..e9f5605 100644 --- a/compiler/locomotiv/src/Node/Push.test.cpp +++ b/compiler/locomotiv/src/Node/Push.test.cpp @@ -52,11 +52,11 @@ TEST(NodeExecution_Push, s32) auto push_data = locomotiv::annot_data(push); ASSERT_NE(push_data, nullptr); - ASSERT_EQ(push_data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(push_data->shape()), Shape{1}); - ASSERT_EQ(push_data->as_s32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); + ASSERT_EQ(loco::DataType::S32, push_data->dtype()); + ASSERT_EQ(Shape{1}, *(push_data->shape())); + ASSERT_EQ(pull_buf.at(Index{0}), push_data->as_s32_bufptr()->at(Index{0})); - ASSERT_EQ(locomotiv::annot_domain(push), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(push)); } TEST(NodeExecution_Push, f32) @@ -80,9 +80,9 @@ TEST(NodeExecution_Push, f32) auto push_data = locomotiv::annot_data(push); ASSERT_NE(push_data, nullptr); - ASSERT_EQ(push_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(push_data->shape()), Shape{1}); - ASSERT_FLOAT_EQ(push_data->as_f32_bufptr()->at(Index{0}), pull_buf.at(Index{0})); + ASSERT_EQ(loco::DataType::FLOAT32, push_data->dtype()); + ASSERT_EQ(Shape{1}, *(push_data->shape())); + ASSERT_FLOAT_EQ(pull_buf.at(Index{0}), push_data->as_f32_bufptr()->at(Index{0})); - ASSERT_EQ(locomotiv::annot_domain(push), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(push)); } diff --git a/compiler/locomotiv/src/Node/ReLU.test.cpp b/compiler/locomotiv/src/Node/ReLU.test.cpp index 0ddd01d..d2f928d 100644 --- a/compiler/locomotiv/src/Node/ReLU.test.cpp +++ b/compiler/locomotiv/src/Node/ReLU.test.cpp @@ -53,10 +53,10 @@ TEST(NodeExecution_ReLU, f32) auto relu_data = locomotiv::annot_data(relu); ASSERT_NE(relu_data, nullptr); - ASSERT_EQ(relu_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(relu_data->shape()), Shape{2}); - ASSERT_FLOAT_EQ(relu_data->as_f32_bufptr()->at(Index{0}), 0.0f); - ASSERT_FLOAT_EQ(relu_data->as_f32_bufptr()->at(Index{1}), 10.0f); + ASSERT_EQ(loco::DataType::FLOAT32, relu_data->dtype()); + ASSERT_EQ(Shape{2}, *(relu_data->shape())); + ASSERT_FLOAT_EQ(0.0f, relu_data->as_f32_bufptr()->at(Index{0})); + ASSERT_FLOAT_EQ(10.0f, relu_data->as_f32_bufptr()->at(Index{1})); - ASSERT_EQ(locomotiv::annot_domain(relu), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(relu)); } diff --git a/compiler/locomotiv/src/Node/ReLU6.test.cpp b/compiler/locomotiv/src/Node/ReLU6.test.cpp index 07f6af2..b2362b1 100644 --- a/compiler/locomotiv/src/Node/ReLU6.test.cpp +++ b/compiler/locomotiv/src/Node/ReLU6.test.cpp @@ -55,12 +55,12 @@ TEST(NodeExecution_ReLU6, f32) auto relu6_data = locomotiv::annot_data(relu6); ASSERT_NE(relu6_data, nullptr); - ASSERT_EQ(relu6_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(relu6_data->shape()), Shape({2, 2})); - ASSERT_FLOAT_EQ(relu6_data->as_f32_bufptr()->at(Index{0, 0}), 0.0f); - ASSERT_FLOAT_EQ(relu6_data->as_f32_bufptr()->at(Index{0, 1}), 6.0f); - ASSERT_FLOAT_EQ(relu6_data->as_f32_bufptr()->at(Index{1, 0}), 6.0f); - ASSERT_FLOAT_EQ(relu6_data->as_f32_bufptr()->at(Index{1, 1}), 0.0f); + ASSERT_EQ(loco::DataType::FLOAT32, relu6_data->dtype()); + ASSERT_EQ(Shape({2, 2}), *(relu6_data->shape())); + ASSERT_FLOAT_EQ(0.0f, relu6_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(6.0f, relu6_data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(6.0f, relu6_data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(0.0f, relu6_data->as_f32_bufptr()->at(Index{1, 1})); - ASSERT_EQ(locomotiv::annot_domain(relu6), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(relu6)); } diff --git a/compiler/locomotiv/src/Node/Reshape.test.cpp b/compiler/locomotiv/src/Node/Reshape.test.cpp index 8e54a16..8aeb465 100644 --- a/compiler/locomotiv/src/Node/Reshape.test.cpp +++ b/compiler/locomotiv/src/Node/Reshape.test.cpp @@ -56,12 +56,12 @@ TEST(NodeExecution_Reshape, f32) auto reshape_data = locomotiv::annot_data(reshape); ASSERT_NE(reshape_data, nullptr); - ASSERT_EQ(reshape_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(reshape_data->shape()), (Shape{2, 2})); - ASSERT_FLOAT_EQ(reshape_data->as_f32_bufptr()->at(Index{0, 0}), 0.0f); - ASSERT_FLOAT_EQ(reshape_data->as_f32_bufptr()->at(Index{0, 1}), 1.1f); - ASSERT_FLOAT_EQ(reshape_data->as_f32_bufptr()->at(Index{1, 0}), 2.2f); - ASSERT_FLOAT_EQ(reshape_data->as_f32_bufptr()->at(Index{1, 1}), 3.3f); + ASSERT_EQ(loco::DataType::FLOAT32, reshape_data->dtype()); + ASSERT_EQ((Shape{2, 2}), *(reshape_data->shape())); + ASSERT_FLOAT_EQ(0.0f, reshape_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(1.1f, reshape_data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(2.2f, reshape_data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(3.3f, reshape_data->as_f32_bufptr()->at(Index{1, 1})); - ASSERT_EQ(locomotiv::annot_domain(reshape), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(reshape)); } diff --git a/compiler/locomotiv/src/Node/Softmax.test.cpp b/compiler/locomotiv/src/Node/Softmax.test.cpp index 21d2402..2572793 100644 --- a/compiler/locomotiv/src/Node/Softmax.test.cpp +++ b/compiler/locomotiv/src/Node/Softmax.test.cpp @@ -57,12 +57,12 @@ TEST(NodeExecution_Softmax, f32) auto kShape = Shape{2, 2}; auto softmax_data = locomotiv::annot_data(softmax); ASSERT_NE(softmax_data, nullptr); - ASSERT_EQ(softmax_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(softmax_data->shape()), kShape); - ASSERT_FLOAT_EQ(softmax_data->as_f32_bufptr()->at(Index{0, 0}), 0.5f); - ASSERT_FLOAT_EQ(softmax_data->as_f32_bufptr()->at(Index{0, 1}), 0.5f); - ASSERT_FLOAT_EQ(softmax_data->as_f32_bufptr()->at(Index{1, 0}), 0.5f); - ASSERT_FLOAT_EQ(softmax_data->as_f32_bufptr()->at(Index{1, 1}), 0.5f); + ASSERT_EQ(loco::DataType::FLOAT32, softmax_data->dtype()); + ASSERT_EQ(kShape, *(softmax_data->shape())); + ASSERT_FLOAT_EQ(0.5f, softmax_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(0.5f, softmax_data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(0.5f, softmax_data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(0.5f, softmax_data->as_f32_bufptr()->at(Index{1, 1})); - ASSERT_EQ(locomotiv::annot_domain(softmax), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(softmax)); } diff --git a/compiler/locomotiv/src/Node/Tanh.test.cpp b/compiler/locomotiv/src/Node/Tanh.test.cpp index 78c3a13..96c1e7f 100644 --- a/compiler/locomotiv/src/Node/Tanh.test.cpp +++ b/compiler/locomotiv/src/Node/Tanh.test.cpp @@ -54,11 +54,11 @@ TEST(NodeExecution_Tanh, f32) auto tanh_data = locomotiv::annot_data(tanh); ASSERT_NE(tanh_data, nullptr); - ASSERT_EQ(tanh_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(tanh_data->shape()), Shape{3}); - ASSERT_FLOAT_EQ(tanh_data->as_f32_bufptr()->at(Index{0}), 0.0f); - ASSERT_FLOAT_EQ(tanh_data->as_f32_bufptr()->at(Index{1}), 0.761594f); - ASSERT_FLOAT_EQ(tanh_data->as_f32_bufptr()->at(Index{2}), -0.761594f); + ASSERT_EQ(loco::DataType::FLOAT32, tanh_data->dtype()); + ASSERT_EQ(Shape{3}, *(tanh_data->shape())); + ASSERT_FLOAT_EQ(0.0f, tanh_data->as_f32_bufptr()->at(Index{0})); + ASSERT_FLOAT_EQ(0.761594f, tanh_data->as_f32_bufptr()->at(Index{1})); + ASSERT_FLOAT_EQ(-0.761594f, tanh_data->as_f32_bufptr()->at(Index{2})); - ASSERT_EQ(locomotiv::annot_domain(tanh), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(tanh)); } diff --git a/compiler/locomotiv/src/Node/TensorBroadcast.test.cpp b/compiler/locomotiv/src/Node/TensorBroadcast.test.cpp index e8347d7..52f7c85 100644 --- a/compiler/locomotiv/src/Node/TensorBroadcast.test.cpp +++ b/compiler/locomotiv/src/Node/TensorBroadcast.test.cpp @@ -54,10 +54,10 @@ TEST(NodeExecution_TensorBroadcast, f32) auto broadcast_data = locomotiv::annot_data(broadcast); ASSERT_NE(broadcast_data, nullptr); - ASSERT_EQ(broadcast_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ((*(broadcast_data->shape())), (Shape{2, 1})); - ASSERT_FLOAT_EQ(broadcast_data->as_f32_bufptr()->at(Index{0, 0}), -1.0f); - ASSERT_FLOAT_EQ(broadcast_data->as_f32_bufptr()->at(Index{1, 0}), -1.0f); + ASSERT_EQ(loco::DataType::FLOAT32, broadcast_data->dtype()); + ASSERT_EQ((Shape{2, 1}), (*(broadcast_data->shape()))); + ASSERT_FLOAT_EQ(-1.0f, broadcast_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(-1.0f, broadcast_data->as_f32_bufptr()->at(Index{1, 0})); - ASSERT_EQ(locomotiv::annot_domain(broadcast), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(broadcast)); } diff --git a/compiler/locomotiv/src/Node/TensorConcat.cpp b/compiler/locomotiv/src/Node/TensorConcat.cpp index 5097e55..3187a7f 100644 --- a/compiler/locomotiv/src/Node/TensorConcat.cpp +++ b/compiler/locomotiv/src/Node/TensorConcat.cpp @@ -40,6 +40,8 @@ namespace locomotiv void NodeExecution::execute(loco::TensorConcat *tensor_concat) { + validate(tensor_concat, "TensorConcat is nullptr"); + auto lhs_data = annot_data(tensor_concat->lhs()); auto rhs_data = annot_data(tensor_concat->rhs()); auto axis = tensor_concat->axis(); diff --git a/compiler/locomotiv/src/Node/TensorConcat.test.cpp b/compiler/locomotiv/src/Node/TensorConcat.test.cpp index d71b515..e9060e3 100644 --- a/compiler/locomotiv/src/Node/TensorConcat.test.cpp +++ b/compiler/locomotiv/src/Node/TensorConcat.test.cpp @@ -65,14 +65,14 @@ TEST(NodeExecution_TensorConcat, f32) auto concat_data = locomotiv::annot_data(tconcat); ASSERT_NE(concat_data, nullptr); - ASSERT_EQ(concat_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ((*(concat_data->shape())), (Shape{2, 2})); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{0, 0}), -1.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{0, 1}), -2.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{1, 0}), 3.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{1, 1}), 4.0f); - - ASSERT_EQ(locomotiv::annot_domain(tconcat), loco::Domain::Tensor); + ASSERT_EQ(loco::DataType::FLOAT32, concat_data->dtype()); + ASSERT_EQ((Shape{2, 2}), (*(concat_data->shape()))); + ASSERT_FLOAT_EQ(-1.0f, concat_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(-2.0f, concat_data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(3.0f, concat_data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(4.0f, concat_data->as_f32_bufptr()->at(Index{1, 1})); + + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(tconcat)); } TEST(NodeExecution_TensorConcat, f32_2) @@ -113,16 +113,16 @@ TEST(NodeExecution_TensorConcat, f32_2) auto concat_data = locomotiv::annot_data(tconcat); ASSERT_NE(concat_data, nullptr); - ASSERT_EQ(concat_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ((*(concat_data->shape())), (Shape{4, 2})); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{0, 0}), -1.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{0, 1}), -2.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{1, 0}), 3.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{1, 1}), 4.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{2, 0}), -3.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{2, 1}), -4.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{3, 0}), 5.0f); - ASSERT_FLOAT_EQ(concat_data->as_f32_bufptr()->at(Index{3, 1}), 6.0f); - - ASSERT_EQ(locomotiv::annot_domain(tconcat), loco::Domain::Tensor); + ASSERT_EQ(loco::DataType::FLOAT32, concat_data->dtype()); + ASSERT_EQ((Shape{4, 2}), (*(concat_data->shape()))); + ASSERT_FLOAT_EQ(-1.0f, concat_data->as_f32_bufptr()->at(Index{0, 0})); + ASSERT_FLOAT_EQ(-2.0f, concat_data->as_f32_bufptr()->at(Index{0, 1})); + ASSERT_FLOAT_EQ(3.0f, concat_data->as_f32_bufptr()->at(Index{1, 0})); + ASSERT_FLOAT_EQ(4.0f, concat_data->as_f32_bufptr()->at(Index{1, 1})); + ASSERT_FLOAT_EQ(-3.0f, concat_data->as_f32_bufptr()->at(Index{2, 0})); + ASSERT_FLOAT_EQ(-4.0f, concat_data->as_f32_bufptr()->at(Index{2, 1})); + ASSERT_FLOAT_EQ(5.0f, concat_data->as_f32_bufptr()->at(Index{3, 0})); + ASSERT_FLOAT_EQ(6.0f, concat_data->as_f32_bufptr()->at(Index{3, 1})); + + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(tconcat)); } diff --git a/compiler/locomotiv/src/Node/TensorConstantPad.cpp b/compiler/locomotiv/src/Node/TensorConstantPad.cpp index 989afaf..cd81a3a 100644 --- a/compiler/locomotiv/src/Node/TensorConstantPad.cpp +++ b/compiler/locomotiv/src/Node/TensorConstantPad.cpp @@ -36,6 +36,8 @@ namespace locomotiv void NodeExecution::execute(loco::TensorConstantPad *pad) { + validate(pad, "TensorConstantPad is nullptr"); + auto input_data = annot_data(pad->input()); auto input_domain = annot_domain(pad->input()); validate(input_data, "Input not ready"); diff --git a/compiler/locomotiv/src/Node/TensorConstantPad.test.cpp b/compiler/locomotiv/src/Node/TensorConstantPad.test.cpp index 0f60c5f..64b9130 100644 --- a/compiler/locomotiv/src/Node/TensorConstantPad.test.cpp +++ b/compiler/locomotiv/src/Node/TensorConstantPad.test.cpp @@ -74,16 +74,16 @@ TEST(NodeExecution_Pad, tensor_constant_pad_4_dim) auto pad_data = locomotiv::annot_data(pad); ASSERT_NE(pad_data, nullptr); - ASSERT_EQ(pad_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(pad_data->shape()), Shape({1, 6, 4, 1})); + ASSERT_EQ(loco::DataType::FLOAT32, pad_data->dtype()); + ASSERT_EQ(Shape({1, 6, 4, 1}), *(pad_data->shape())); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0, 3, 1, 0}), 1.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0, 3, 2, 0}), 2.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0, 4, 1, 0}), 3.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0, 4, 2, 0}), 4.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0, 0, 0, 0}), 0.0f); + ASSERT_FLOAT_EQ(1.0f, pad_data->as_f32_bufptr()->at(Index{0, 3, 1, 0})); + ASSERT_FLOAT_EQ(2.0f, pad_data->as_f32_bufptr()->at(Index{0, 3, 2, 0})); + ASSERT_FLOAT_EQ(3.0f, pad_data->as_f32_bufptr()->at(Index{0, 4, 1, 0})); + ASSERT_FLOAT_EQ(4.0f, pad_data->as_f32_bufptr()->at(Index{0, 4, 2, 0})); + ASSERT_FLOAT_EQ(0.0f, pad_data->as_f32_bufptr()->at(Index{0, 0, 0, 0})); - ASSERT_EQ(locomotiv::annot_domain(pad), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(pad)); } TEST(NodeExecution_Pad, tensor_constant_pad_1_dim) @@ -122,17 +122,17 @@ TEST(NodeExecution_Pad, tensor_constant_pad_1_dim) auto pad_data = locomotiv::annot_data(pad); ASSERT_NE(pad_data, nullptr); - ASSERT_EQ(pad_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(pad_data->shape()), Shape({6})); + ASSERT_EQ(loco::DataType::FLOAT32, pad_data->dtype()); + ASSERT_EQ(Shape({6}), *(pad_data->shape())); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{0}), 0.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1}), 0.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{2}), 1.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{3}), 5.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{4}), 3.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{5}), 0.0f); + ASSERT_FLOAT_EQ(0.0f, pad_data->as_f32_bufptr()->at(Index{0})); + ASSERT_FLOAT_EQ(0.0f, pad_data->as_f32_bufptr()->at(Index{1})); + ASSERT_FLOAT_EQ(1.0f, pad_data->as_f32_bufptr()->at(Index{2})); + ASSERT_FLOAT_EQ(5.0f, pad_data->as_f32_bufptr()->at(Index{3})); + ASSERT_FLOAT_EQ(3.0f, pad_data->as_f32_bufptr()->at(Index{4})); + ASSERT_FLOAT_EQ(0.0f, pad_data->as_f32_bufptr()->at(Index{5})); - ASSERT_EQ(locomotiv::annot_domain(pad), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(pad)); } TEST(NodeExecution_Pad, tensor_constant_pad_6_dim) @@ -200,19 +200,19 @@ TEST(NodeExecution_Pad, tensor_constant_pad_6_dim) auto pad_data = locomotiv::annot_data(pad); ASSERT_NE(pad_data, nullptr); - ASSERT_EQ(pad_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(pad_data->shape()), Shape({4, 1, 6, 5, 1, 5})); - - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 2, 0, 1}), 1.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 2, 0, 2}), 2.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 3, 0, 1}), 3.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 3, 0, 2}), 4.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 2, 0, 1}), 5.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 2, 0, 2}), 6.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 3, 0, 1}), 7.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 3, 0, 2}), 8.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 3, 2, 0, 1}), 9.0f); - ASSERT_FLOAT_EQ(pad_data->as_f32_bufptr()->at(Index{1, 0, 3, 2, 0, 2}), 10.0f); - - ASSERT_EQ(locomotiv::annot_domain(pad), loco::Domain::Tensor); + ASSERT_EQ(loco::DataType::FLOAT32, pad_data->dtype()); + ASSERT_EQ(Shape({4, 1, 6, 5, 1, 5}), *(pad_data->shape())); + + ASSERT_FLOAT_EQ(1.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 2, 0, 1})); + ASSERT_FLOAT_EQ(2.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 2, 0, 2})); + ASSERT_FLOAT_EQ(3.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 3, 0, 1})); + ASSERT_FLOAT_EQ(4.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 1, 3, 0, 2})); + ASSERT_FLOAT_EQ(5.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 2, 0, 1})); + ASSERT_FLOAT_EQ(6.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 2, 0, 2})); + ASSERT_FLOAT_EQ(7.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 3, 0, 1})); + ASSERT_FLOAT_EQ(8.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 2, 3, 0, 2})); + ASSERT_FLOAT_EQ(9.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 3, 2, 0, 1})); + ASSERT_FLOAT_EQ(10.0f, pad_data->as_f32_bufptr()->at(Index{1, 0, 3, 2, 0, 2})); + + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(pad)); } diff --git a/compiler/locomotiv/src/Node/TensorReduce.cpp b/compiler/locomotiv/src/Node/TensorReduce.cpp index fae7a75..a60ebd8 100644 --- a/compiler/locomotiv/src/Node/TensorReduce.cpp +++ b/compiler/locomotiv/src/Node/TensorReduce.cpp @@ -121,9 +121,8 @@ namespace locomotiv void NodeExecution::execute(loco::TensorReduce *node) { auto input_data = annot_data(node->input()); - auto input_shape = input_data->shape(); - validate(input_data, "Input not ready"); + auto input_shape = input_data->shape(); validate(annot_domain(node->input()) == loco::Domain::Tensor, "Input domain of TensorReduce is not Tensor"); diff --git a/compiler/locomotiv/src/Node/TensorReduce.test.cpp b/compiler/locomotiv/src/Node/TensorReduce.test.cpp index 68398ca..d0e73a2 100644 --- a/compiler/locomotiv/src/Node/TensorReduce.test.cpp +++ b/compiler/locomotiv/src/Node/TensorReduce.test.cpp @@ -60,12 +60,12 @@ TEST(NodeExecution_Fixed_Reduce_Mean, f32_0) auto kShape = Shape{1, 1, 2}; auto reduce_data = locomotiv::annot_data(reduce_node); ASSERT_NE(reduce_data, nullptr); - ASSERT_EQ(reduce_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(reduce_data->shape()), kShape); - ASSERT_FLOAT_EQ(reduce_data->as_f32_bufptr()->at(Index{0, 0, 0}), 3.3f); - ASSERT_FLOAT_EQ(reduce_data->as_f32_bufptr()->at(Index{0, 0, 1}), 4.4f); + ASSERT_EQ(loco::DataType::FLOAT32, reduce_data->dtype()); + ASSERT_EQ(kShape, *(reduce_data->shape())); + ASSERT_FLOAT_EQ(3.3f, reduce_data->as_f32_bufptr()->at(Index{0, 0, 0})); + ASSERT_FLOAT_EQ(4.4f, reduce_data->as_f32_bufptr()->at(Index{0, 0, 1})); - ASSERT_EQ(locomotiv::annot_domain(reduce_node), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(reduce_node)); } TEST(NodeExecution_Fixed_Reduce_Mean, f32_1) @@ -96,9 +96,9 @@ TEST(NodeExecution_Fixed_Reduce_Mean, f32_1) auto kShape = Shape{1, 1, 1}; auto reduce_data = locomotiv::annot_data(reduce_node); ASSERT_NE(reduce_data, nullptr); - ASSERT_EQ(reduce_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(reduce_data->shape()), kShape); - ASSERT_FLOAT_EQ(reduce_data->as_f32_bufptr()->at(Index{0, 0, 0}), 3.85f); + ASSERT_EQ(loco::DataType::FLOAT32, reduce_data->dtype()); + ASSERT_EQ(kShape, *(reduce_data->shape())); + ASSERT_FLOAT_EQ(3.85f, reduce_data->as_f32_bufptr()->at(Index{0, 0, 0})); - ASSERT_EQ(locomotiv::annot_domain(reduce_node), loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, locomotiv::annot_domain(reduce_node)); } diff --git a/compiler/locomotiv/src/Node/TransposedConv2D.test.cpp b/compiler/locomotiv/src/Node/TransposedConv2D.test.cpp index bd955a0..ef759f5 100644 --- a/compiler/locomotiv/src/Node/TransposedConv2D.test.cpp +++ b/compiler/locomotiv/src/Node/TransposedConv2D.test.cpp @@ -101,10 +101,10 @@ void run_test(const float *ifm, const float *ker, const float *expected_ofm, con for (nncc::core::ADT::tensor::IndexEnumerator e{ofm_shape}; e.valid(); e.advance()) { const auto &ind = e.current(); - ASSERT_FLOAT_EQ(conv2d_result->as_f32_bufptr()->at(ind), ofm_overlay.at(ind)); + ASSERT_FLOAT_EQ(ofm_overlay.at(ind), conv2d_result->as_f32_bufptr()->at(ind)); } - ASSERT_EQ(locomotiv::annot_domain(tr_conv2d), loco::Domain::Feature); + ASSERT_EQ(loco::Domain::Feature, locomotiv::annot_domain(tr_conv2d)); } } // namespace diff --git a/compiler/locomotiv/src/NodeData.test.cpp b/compiler/locomotiv/src/NodeData.test.cpp index b1c9832..65bd3e1 100644 --- a/compiler/locomotiv/src/NodeData.test.cpp +++ b/compiler/locomotiv/src/NodeData.test.cpp @@ -35,9 +35,9 @@ TEST(NodeData, as_s32_buffer_wrapper) auto data = locomotiv::make_data(buf); - ASSERT_EQ(data->dtype(), loco::DataType::S32); - ASSERT_EQ(*(data->shape()), shape); - ASSERT_EQ(data->as_s32_bufptr()->at(Index{0}), 42); + ASSERT_EQ(loco::DataType::S32, data->dtype()); + ASSERT_EQ(shape, *(data->shape())); + ASSERT_EQ(42, data->as_s32_bufptr()->at(Index{0})); } TEST(NodeData, as_f32_buffer_wrapper) @@ -48,7 +48,7 @@ TEST(NodeData, as_f32_buffer_wrapper) auto data = locomotiv::make_data(buf); - ASSERT_EQ(data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(data->shape()), shape); - ASSERT_FLOAT_EQ(data->as_f32_bufptr()->at(Index{0}), 3.14f); + ASSERT_EQ(loco::DataType::FLOAT32, data->dtype()); + ASSERT_EQ(shape, *(data->shape())); + ASSERT_FLOAT_EQ(3.14f, data->as_f32_bufptr()->at(Index{0})); } diff --git a/compiler/locomotiv/src/NodeDataImpl.test.cpp b/compiler/locomotiv/src/NodeDataImpl.test.cpp index b859560..3fb0cc2 100644 --- a/compiler/locomotiv/src/NodeDataImpl.test.cpp +++ b/compiler/locomotiv/src/NodeDataImpl.test.cpp @@ -39,7 +39,7 @@ TEST(NodeDataImpl, as_annotation) auto g = loco::make_graph(); auto node = g->nodes()->create(); - ASSERT_EQ(locomotiv::annot_data(node), nullptr); + ASSERT_EQ(nullptr, locomotiv::annot_data(node)); // Set annotation locomotiv::annot_data(node, std::move(data)); @@ -48,11 +48,11 @@ TEST(NodeDataImpl, as_annotation) const locomotiv::NodeData *obtained = locomotiv::annot_data(node); ASSERT_NE(obtained, nullptr); - ASSERT_EQ(obtained->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(obtained->shape()), shape); - ASSERT_FLOAT_EQ(obtained->as_f32_bufptr()->at(Index{0}), 3.14f); + ASSERT_EQ(loco::DataType::FLOAT32, obtained->dtype()); + ASSERT_EQ(shape, *(obtained->shape())); + ASSERT_FLOAT_EQ(3.14f, obtained->as_f32_bufptr()->at(Index{0})); // Erase annotation locomotiv::erase_annot_data(node); - ASSERT_EQ(locomotiv::annot_data(node), nullptr); + ASSERT_EQ(nullptr, locomotiv::annot_data(node)); } diff --git a/compiler/locomotiv/src/NodeDomain.test.cpp b/compiler/locomotiv/src/NodeDomain.test.cpp index 9cfcf2e..87c8135 100644 --- a/compiler/locomotiv/src/NodeDomain.test.cpp +++ b/compiler/locomotiv/src/NodeDomain.test.cpp @@ -22,16 +22,16 @@ TEST(NodeDomain, as_annotation) { loco::Pull node; - ASSERT_EQ(locomotiv::annot_domain(&node), loco::Domain::Unknown); + ASSERT_EQ(loco::Domain::Unknown, locomotiv::annot_domain(&node)); // Set annotation locomotiv::annot_domain(&node, loco::Domain::Tensor); // Get annotation const loco::Domain obtained = locomotiv::annot_domain(&node); - ASSERT_EQ(obtained, loco::Domain::Tensor); + ASSERT_EQ(loco::Domain::Tensor, obtained); // Erase annotation locomotiv::erase_annot_domain(&node); - ASSERT_EQ(locomotiv::annot_domain(&node), loco::Domain::Unknown); + ASSERT_EQ(loco::Domain::Unknown, locomotiv::annot_domain(&node)); } diff --git a/compiler/locomotiv/src/NodeExecution.cpp b/compiler/locomotiv/src/NodeExecution.cpp index e532b5a..2a86971 100644 --- a/compiler/locomotiv/src/NodeExecution.cpp +++ b/compiler/locomotiv/src/NodeExecution.cpp @@ -72,9 +72,9 @@ void NodeExecution::eltwise_unary(loco::Node *node, const UnaryFunc &f) auto input_node = node->arg(0); auto input_domain = annot_domain(input_node); auto input_data = annot_data(input_node); + validate(input_data, "Input is not ready"); auto input_dtype = input_data->dtype(); - validate(input_data, "Input is not ready"); validate(input_domain != loco::Domain::Unknown, "Input domain is unknown"); auto output_node = node; diff --git a/compiler/locomotiv/src/Session.test.cpp b/compiler/locomotiv/src/Session.test.cpp index 6d4a241..b73e4fa 100644 --- a/compiler/locomotiv/src/Session.test.cpp +++ b/compiler/locomotiv/src/Session.test.cpp @@ -57,8 +57,8 @@ TEST(Session, graph_IO_size) // Make session locomotiv::Session s(g.get()); - ASSERT_EQ(s.input_size(), inputs); - ASSERT_EQ(s.output_size(), outputs); + ASSERT_EQ(inputs, s.input_size()); + ASSERT_EQ(outputs, s.output_size()); } TEST(Session, set_input) @@ -173,9 +173,9 @@ TEST(Session, inference_identity) auto output_data = s.get_output(0); ASSERT_NE(output_data, nullptr); - ASSERT_EQ(output_data->dtype(), loco::DataType::FLOAT32); - ASSERT_EQ(*(output_data->shape()), Shape{1}); - ASSERT_EQ(output_data->as_f32_bufptr()->at(Index{0}), 3.14f); + ASSERT_EQ(loco::DataType::FLOAT32, output_data->dtype()); + ASSERT_EQ(Shape{1}, *(output_data->shape())); + ASSERT_EQ(3.14f, output_data->as_f32_bufptr()->at(Index{0})); } } @@ -234,63 +234,63 @@ TEST(Session, session_for_subgraph) { // Session to get t1 only locomotiv::Session s(g.get(), {t1}); - ASSERT_EQ(s.output_size(), 1); - ASSERT_EQ(s.get_output_node(0), dynamic_cast(t1)); + ASSERT_EQ(1, s.output_size()); + ASSERT_EQ(dynamic_cast(t1), s.get_output_node(0)); s.infer(); auto t1_data = s.get_output(0); ASSERT_NE(t1_data, nullptr); - ASSERT_EQ(*(t1_data->shape()), Shape{2}); + ASSERT_EQ(Shape{2}, *(t1_data->shape())); auto t1_buf = t1_data->as_f32_bufptr(); - ASSERT_EQ(t1_buf->at({0}), 0.1f); - ASSERT_EQ(t1_buf->at({1}), 0.2f); + ASSERT_EQ(0.1f, t1_buf->at({0})); + ASSERT_EQ(0.2f, t1_buf->at({1})); } { // Session to get t2 only locomotiv::Session s(g.get(), {t2}); - ASSERT_EQ(s.output_size(), 1); - ASSERT_EQ(s.get_output_node(0), dynamic_cast(t2)); + ASSERT_EQ(1, s.output_size()); + ASSERT_EQ(dynamic_cast(t2), s.get_output_node(0)); s.infer(); auto t2_data = s.get_output(0); ASSERT_NE(t2_data, nullptr); - ASSERT_EQ(*(t2_data->shape()), Shape{2}); + ASSERT_EQ(Shape{2}, *(t2_data->shape())); auto t2_buf = t2_data->as_f32_bufptr(); - ASSERT_EQ(t2_buf->at({0}), 0.3f); - ASSERT_EQ(t2_buf->at({1}), 0.4f); + ASSERT_EQ(0.3f, t2_buf->at({0})); + ASSERT_EQ(0.4f, t2_buf->at({1})); } { // Session to get t2 and push locomotiv::Session s(g.get(), {t2, push}); - ASSERT_EQ(s.output_size(), 2); - ASSERT_EQ(s.get_output_node(0), dynamic_cast(t2)); - ASSERT_EQ(s.get_output_node(1), dynamic_cast(push)); + ASSERT_EQ(2, s.output_size()); + ASSERT_EQ(dynamic_cast(t2), s.get_output_node(0)); + ASSERT_EQ(dynamic_cast(push), s.get_output_node(1)); s.infer(); auto t2_data = s.get_output(0); ASSERT_NE(t2_data, nullptr); - ASSERT_EQ(*(t2_data->shape()), Shape{2}); + ASSERT_EQ(Shape{2}, *(t2_data->shape())); auto t2_buf = t2_data->as_f32_bufptr(); - ASSERT_EQ(t2_buf->at({0}), 0.3f); - ASSERT_EQ(t2_buf->at({1}), 0.4f); + ASSERT_EQ(0.3f, t2_buf->at({0})); + ASSERT_EQ(0.4f, t2_buf->at({1})); auto push_data = s.get_output(1); ASSERT_NE(push_data, nullptr); - ASSERT_EQ(*(push_data->shape()), Shape{4}); + ASSERT_EQ(Shape{4}, *(push_data->shape())); auto push_buf = push_data->as_f32_bufptr(); - ASSERT_EQ(push_buf->at({0}), 0.1f); - ASSERT_EQ(push_buf->at({1}), 0.2f); - ASSERT_EQ(push_buf->at({2}), 0.3f); - ASSERT_EQ(push_buf->at({3}), 0.4f); + ASSERT_EQ(0.1f, push_buf->at({0})); + ASSERT_EQ(0.2f, push_buf->at({1})); + ASSERT_EQ(0.3f, push_buf->at({2})); + ASSERT_EQ(0.4f, push_buf->at({3})); } } @@ -321,19 +321,19 @@ TEST(Session, ctor_by_range) auto constgen_data = s.get_output(0); ASSERT_NE(constgen_data, nullptr); - ASSERT_EQ(*(constgen_data->shape()), Shape{2}); + ASSERT_EQ(Shape{2}, *(constgen_data->shape())); auto constgen_buf = constgen_data->as_f32_bufptr(); - ASSERT_EQ(constgen_buf->at({0}), 0.1f); - ASSERT_EQ(constgen_buf->at({1}), -0.1f); + ASSERT_EQ(0.1f, constgen_buf->at({0})); + ASSERT_EQ(-0.1f, constgen_buf->at({1})); auto push_data = s.get_output(1); ASSERT_NE(push_data, nullptr); - ASSERT_EQ(*(push_data->shape()), Shape{2}); + ASSERT_EQ(Shape{2}, *(push_data->shape())); auto push_buf = push_data->as_f32_bufptr(); - ASSERT_EQ(push_buf->at({0}), 0.1f); - ASSERT_EQ(push_buf->at({1}), 0.0f); + ASSERT_EQ(0.1f, push_buf->at({0})); + ASSERT_EQ(0.0f, push_buf->at({1})); } // Below here is internal test for locomotiv, i.e. not public usage of locomotiv @@ -363,17 +363,17 @@ TEST(Session, dtor) s.set_input(0, std::move(data)); auto data_annotated = locomotiv::annot_data(pull); - ASSERT_EQ(data_annotated, nullptr); + ASSERT_EQ(nullptr, data_annotated); auto user_data_annotated = locomotiv::user_data(pull); ASSERT_NE(user_data_annotated, nullptr); auto domain_annotated = locomotiv::annot_domain(pull); - ASSERT_EQ(domain_annotated, loco::Domain::Unknown); + ASSERT_EQ(loco::Domain::Unknown, domain_annotated); } auto data_annotated = locomotiv::annot_data(pull); - ASSERT_EQ(data_annotated, nullptr); + ASSERT_EQ(nullptr, data_annotated); auto user_data_annotated = locomotiv::user_data(pull); - ASSERT_EQ(user_data_annotated, nullptr); + ASSERT_EQ(nullptr, user_data_annotated); auto domain_annotated = locomotiv::annot_domain(pull); - ASSERT_EQ(domain_annotated, loco::Domain::Unknown); + ASSERT_EQ(loco::Domain::Unknown, domain_annotated); } diff --git a/compiler/locop/requires.cmake b/compiler/locop/requires.cmake new file mode 100644 index 0000000..d314ae5 --- /dev/null +++ b/compiler/locop/requires.cmake @@ -0,0 +1 @@ +require("pp") diff --git a/compiler/locop/src/CanonicalNodeSummaryBuilder.cpp b/compiler/locop/src/CanonicalNodeSummaryBuilder.cpp index b962f49..61d9e8a 100644 --- a/compiler/locop/src/CanonicalNodeSummaryBuilder.cpp +++ b/compiler/locop/src/CanonicalNodeSummaryBuilder.cpp @@ -71,9 +71,7 @@ std::string opname(const loco::Node *node) { if (node->dialect() == loco::CanonicalDialect::get()) { - auto canonical_node = dynamic_cast(node); - - assert(canonical_node != nullptr); + auto canonical_node = loco::must_cast(node); switch (canonical_node->opcode()) { @@ -288,8 +286,7 @@ bool CanonicalNodeSummaryBuilder::build(const loco::Node *node, locop::NodeSumma return false; } - auto canonical_node = dynamic_cast(node); - assert(canonical_node != nullptr); + auto canonical_node = loco::must_cast(node); out = canonical_node_desc(*_tbl, canonical_node); return true; } diff --git a/compiler/locop/src/FormattedGraph.cpp b/compiler/locop/src/FormattedGraph.cpp index 84de1e8..bf41757 100644 --- a/compiler/locop/src/FormattedGraph.cpp +++ b/compiler/locop/src/FormattedGraph.cpp @@ -67,6 +67,9 @@ std::string str(const loco::DataType &dtype) case loco::DataType::FLOAT64: return "FLOAT64"; + case loco::DataType::BOOL: + return "BOOL"; + default: break; }; diff --git a/compiler/logo/include/logo/DeadNodeQueryService.h b/compiler/logo/include/logo/DeadNodeQueryService.h new file mode 100644 index 0000000..e74a4bc --- /dev/null +++ b/compiler/logo/include/logo/DeadNodeQueryService.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOGO_DEAD_NODE_QUERY_SERVICE_H__ +#define __LOGO_DEAD_NODE_QUERY_SERVICE_H__ + +#include +#include + +namespace logo +{ + +struct DeadNodeQueryService : public ::loco::DialectService +{ + virtual ~DeadNodeQueryService() = default; + /// @brief Check if the node is dead node + virtual bool isDeadNode(loco::Node *node) = 0; +}; + +} // namespace logo + +#endif // __LOGO_DEAD_NODE_QUERY_SERVICE_H__ diff --git a/compiler/logo/include/logo/RemoveDeadNodeWithQueryPass.h b/compiler/logo/include/logo/RemoveDeadNodeWithQueryPass.h new file mode 100644 index 0000000..de08671 --- /dev/null +++ b/compiler/logo/include/logo/RemoveDeadNodeWithQueryPass.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LOGO_REMOVE_DEAD_NODE_WITH_QUERY_PASS_H__ +#define __LOGO_REMOVE_DEAD_NODE_WITH_QUERY_PASS_H__ + +#include + +namespace logo +{ + +struct RemoveDeadNodeWithQueryPass final : public Pass +{ + const char *name(void) const final { return "RemoveDeadNodeWithQueryPass"; } + + bool run(loco::Graph *g); +}; + +} // namespace logo + +#endif // __LOGO_REMOVE_DEAD_NODE_WITH_QUERY_PASS_H__ diff --git a/compiler/logo/src/Passes/ConstantFoldingPass.test.cpp b/compiler/logo/src/Passes/ConstantFoldingPass.test.cpp index 8240277..b9c4942 100644 --- a/compiler/logo/src/Passes/ConstantFoldingPass.test.cpp +++ b/compiler/logo/src/Passes/ConstantFoldingPass.test.cpp @@ -82,7 +82,7 @@ TEST(ConstantFolding, const_relu_to_const) } auto push = logo::test::find_first_node_by_type(graph.get()); - auto const_gen = dynamic_cast(push->from()); + auto const_gen = loco::must_cast(push->from()); ASSERT_NE(const_gen, nullptr); ASSERT_EQ(const_gen->size(), 2); @@ -168,7 +168,7 @@ TEST(ConstantFolding, const_relu_to_concat) } auto push = logo::test::find_first_node_by_type(graph.get()); - auto const_gen = dynamic_cast(push->from()); + auto const_gen = loco::must_cast(push->from()); ASSERT_NE(const_gen, nullptr); ASSERT_EQ(const_gen->size(), 4); diff --git a/compiler/logo/src/Passes/RemoveDeadNodeWithQueryPass.cpp b/compiler/logo/src/Passes/RemoveDeadNodeWithQueryPass.cpp new file mode 100644 index 0000000..5c74521 --- /dev/null +++ b/compiler/logo/src/Passes/RemoveDeadNodeWithQueryPass.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include + +#include + +namespace logo +{ + +bool RemoveDeadNodeWithQueryPass::run(loco::Graph *g) +{ + // Let's enumerate nodes required to compute output nodes + auto active_nodes = loco::active_nodes(loco::output_nodes(g)); + + // List dead(= non-active) nodes candidates + std::set candidates; + + for (auto node : loco::all_nodes(g)) + { + if (active_nodes.find(node) == active_nodes.end()) + { + candidates.insert(node); + } + } + + // Find the nodes that should not be dead node in candidates + for (auto node : candidates) + { + if (auto service = node->dialect()->service()) + { + if (!service->isDeadNode(node)) + { + candidates.erase(node); + } + } + } + + for (auto node : candidates) + { + node->drop(); + } + + for (auto node : candidates) + { + g->nodes()->destroy(node); + } + + return candidates.size() > 0; +} + +} // namespace logo diff --git a/compiler/logo/src/Passes/RemoveForwardNodePass.cpp b/compiler/logo/src/Passes/RemoveForwardNodePass.cpp index c951cfa..966b270 100644 --- a/compiler/logo/src/Passes/RemoveForwardNodePass.cpp +++ b/compiler/logo/src/Passes/RemoveForwardNodePass.cpp @@ -47,7 +47,7 @@ bool RemoveForwardNodePass::run(loco::Graph *g) { if (node->dialect() == loco::CanonicalDialect::get()) { - auto canonical_node = dynamic_cast(node); + auto canonical_node = loco::must_cast(node); canonical_node->accept(&collector); } } diff --git a/compiler/logo/src/Passes/ReorderDecodePass.cpp b/compiler/logo/src/Passes/ReorderDecodePass.cpp index 724db57..863f180 100644 --- a/compiler/logo/src/Passes/ReorderDecodePass.cpp +++ b/compiler/logo/src/Passes/ReorderDecodePass.cpp @@ -37,49 +37,54 @@ bool isReLU(const loco::Node *node) return node->opnum() == static_cast(loco::CanonicalOpcode::ReLU); } -} // namespace - -namespace logo -{ - -bool ReorderDecodePass::run(loco::Graph *g) +// Update queue +class Collector final : public loco::CanonicalNodeMutableVisitor { - std::queue q; - - // Update queue - class Collector final : public loco::CanonicalNodeMutableVisitor +public: + Collector(std::queue *out) : _out{out} { - public: - Collector(std::queue *out) : _out{out} - { - // DO NOTHING - } + // DO NOTHING + } - void visit(loco::FeatureDecode *node) final + void visit(loco::FeatureDecode *node) final + { + if (node->input() != nullptr) { - if (node->input() != nullptr) - { - _out->push(node); - } + _out->push(node); } + } - void visit(loco::Node *) final { return; } + void visit(loco::Node *) final { return; } - private: - // TODO This definition should be revised to support other decode operations - std::queue *_out; - }; +private: + // TODO This definition should be revised to support other decode operations + std::queue *_out; +}; +void gather_candidates(loco::Graph *g, std::queue &q) +{ Collector collector{&q}; for (auto node : loco::all_nodes(g)) { if (node->dialect() == loco::CanonicalDialect::get()) { - auto canonical_node = dynamic_cast(node); + auto canonical_node = loco::must_cast(node); canonical_node->accept(&collector); } } +} + +} // namespace + +namespace logo +{ + +bool ReorderDecodePass::run(loco::Graph *g) +{ + std::queue q; + + gather_candidates(g, q); bool changed = false; @@ -125,9 +130,7 @@ bool ReorderDecodePass::run(loco::Graph *g) // Q. Is it better to create an independent transform for this rewriting rule? if (isTensorBiasAdd(u)) { - auto old_badd = dynamic_cast(u); - - assert(old_badd != nullptr); + auto old_badd = loco::must_cast(u); /** * Let us consider the following example: @@ -182,40 +185,7 @@ bool ReorderDecodePass::run(loco::Graph *g) { std::queue q; - // Update queue - class Collector final : public loco::CanonicalNodeMutableVisitor - { - public: - Collector(std::queue *out) : _out{out} - { - // DO NOTHING - } - - void visit(loco::FeatureDecode *node) final - { - if (node->input() != nullptr) - { - _out->push(node); - } - } - - void visit(loco::Node *) final { return; } - - private: - // TODO This definition should be revised to support other decode operations - std::queue *_out; - }; - - Collector collector{&q}; - - for (auto node : loco::all_nodes(g)) - { - if (node->dialect() == loco::CanonicalDialect::get()) - { - auto canonical_node = dynamic_cast(node); - canonical_node->accept(&collector); - } - } + gather_candidates(g, q); bool changed = false; diff --git a/compiler/logo/src/Passes/ResolveDuplicateReshapePass.cpp b/compiler/logo/src/Passes/ResolveDuplicateReshapePass.cpp index d3c74cb..94ff629 100644 --- a/compiler/logo/src/Passes/ResolveDuplicateReshapePass.cpp +++ b/compiler/logo/src/Passes/ResolveDuplicateReshapePass.cpp @@ -61,7 +61,7 @@ bool is_duplicate_reshape(loco::Node *node) */ void remap_input(loco::FixedReshape *reshape) { - auto input_reshape = dynamic_cast(reshape->input()); + auto input_reshape = loco::must_cast(reshape->input()); auto volume = [](loco::FixedReshape *node) { uint32_t vol = 1; @@ -94,7 +94,7 @@ bool ResolveDuplicateReshapePass::run(loco::Graph *graph) { if (is_duplicate_reshape(node)) { - auto node_as_reshape = dynamic_cast(node); + auto node_as_reshape = loco::must_cast(node); remap_input(node_as_reshape); diff --git a/compiler/logo/src/Passes/SimplifyDomainConversionPass.cpp b/compiler/logo/src/Passes/SimplifyDomainConversionPass.cpp index 9b7a8d1..0bda85b 100644 --- a/compiler/logo/src/Passes/SimplifyDomainConversionPass.cpp +++ b/compiler/logo/src/Passes/SimplifyDomainConversionPass.cpp @@ -411,7 +411,7 @@ bool SimplifyDomainConversionPass::run(loco::Graph *g) { if (node->dialect() == loco::CanonicalDialect::get()) { - auto canonical_node = dynamic_cast(node); + auto canonical_node = loco::must_cast(node); canonical_node->accept(&collector); } } diff --git a/compiler/logo/src/Passes/SimplifyDomainConversionPass.test.cpp b/compiler/logo/src/Passes/SimplifyDomainConversionPass.test.cpp index 6bd93c1..9a05763 100644 --- a/compiler/logo/src/Passes/SimplifyDomainConversionPass.test.cpp +++ b/compiler/logo/src/Passes/SimplifyDomainConversionPass.test.cpp @@ -227,7 +227,7 @@ TEST(SimplifyDomainConversionPass, FilterEncode_FilterDecode_equal_perms) ASSERT_EQ(loco::output_nodes(graph.get()).size(), 1); loco::Node *output_node = loco::output_nodes(graph.get())[0]; - auto forward = dynamic_cast(output_node->arg(0)); + auto forward = loco::must_cast(output_node->arg(0)); ASSERT_NE(forward, nullptr); auto const_gen = dynamic_cast(forward->arg(0)); ASSERT_NE(const_gen, nullptr); diff --git a/compiler/luci-interpreter/CMakeLists.txt b/compiler/luci-interpreter/CMakeLists.txt new file mode 100644 index 0000000..33fdc52 --- /dev/null +++ b/compiler/luci-interpreter/CMakeLists.txt @@ -0,0 +1,4 @@ +set(LUCI_INTERPRETER_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") +set(LUCI_INTERPRETER_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") + +add_subdirectory(src) diff --git a/compiler/luci-interpreter/include/luci_interpreter/Interpreter.h b/compiler/luci-interpreter/include/luci_interpreter/Interpreter.h new file mode 100644 index 0000000..7a14bf6 --- /dev/null +++ b/compiler/luci-interpreter/include/luci_interpreter/Interpreter.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_INTERPRETER_H +#define LUCI_INTERPRETER_INTERPRETER_H + +#include "luci_interpreter/core/Tensor.h" + +#include +#include + +#include + +#include +#include +#include + +namespace luci_interpreter +{ + +class ExecutionObserver +{ +public: + virtual ~ExecutionObserver(); + + // Called when the value of a tensor has been updated during execution. + virtual void postTensorWrite(const luci::CircleNode *node, const Tensor *tensor); + + // Called before / after executing an operator. + // Note that these methods are not called for auxiliary operators (CircleInput, CircleOutput, + // CircleConst and Circle*Out). + virtual void preOperatorExecute(const luci::CircleNode *node); + virtual void postOperatorExecute(const luci::CircleNode *node); +}; + +class Interpreter +{ +public: + explicit Interpreter(const luci::Module *module); + + ~Interpreter(); + + void writeInputTensor(const luci::CircleInput *input_node, const void *data, size_t data_size); + + void readOutputTensor(const luci::CircleOutput *output_node, void *data, size_t data_size); + + void interpret(); + + void attachObserver(ExecutionObserver *observer); + + const Tensor *getTensor(const loco::Node *node) { return _node_to_tensor[node]; } + +private: + std::unique_ptr _runtime_module; + + // Observer functionality support. + std::unique_ptr _runtime_to_ir; + std::unordered_map _node_to_tensor; + std::unique_ptr _event_notifier; + std::vector _observers; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_INTERPRETER_H diff --git a/compiler/luci-interpreter/include/luci_interpreter/core/DataType.h b/compiler/luci-interpreter/include/luci_interpreter/core/DataType.h new file mode 100644 index 0000000..27bf719 --- /dev/null +++ b/compiler/luci-interpreter/include/luci_interpreter/core/DataType.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_DATATYPE_H +#define LUCI_INTERPRETER_CORE_DATATYPE_H + +#include +#include + +#include + +namespace luci_interpreter +{ + +using DataType = loco::DataType; + +template using DataTypeImpl = loco::DataTypeImpl
; + +inline size_t getDataTypeSize(DataType data_type) { return loco::size(data_type); } + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_DATATYPE_H diff --git a/compiler/luci-interpreter/include/luci_interpreter/core/Tensor.h b/compiler/luci-interpreter/include/luci_interpreter/core/Tensor.h new file mode 100644 index 0000000..9987898 --- /dev/null +++ b/compiler/luci-interpreter/include/luci_interpreter/core/Tensor.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_TENSOR_H +#define LUCI_INTERPRETER_CORE_TENSOR_H + +#include "luci_interpreter/core/DataType.h" + +#include +#include +#include +#include +#include +#include + +namespace luci_interpreter +{ + +class Shape +{ +public: + explicit Shape(int rank) : _dims(rank, 0) {} + + Shape(std::initializer_list dims) : _dims(dims.begin(), dims.end()) {} + + int num_dims() const { return _dims.size(); } + + int32_t dim(int i) const + { + assert(i >= 0 && i < static_cast(_dims.size())); + return _dims[i]; + } + + int32_t &dim(int i) + { + assert(i >= 0 && i < static_cast(_dims.size())); + return _dims[i]; + } + + int32_t num_elements() const + { + int32_t result = 1; + for (const int32_t dim : _dims) + { + result *= dim; + } + return result; + } + + bool operator==(const Shape &other) const { return _dims == other._dims; } + + bool operator!=(const Shape &other) const { return !operator==(other); } + +private: + std::vector _dims; +}; + +// Tensor affine quantization parameters. +// +// The relationship between real and quantized values: +// real_value = (quantized_value - zero_point) * scale +// +// In per-tensor case, 'scale' and 'zero_point' are one element each. +// In per-channel case, 'scale' and 'zero_point' are N elements each, where N is the size +// of the quantized dimension. +// +// Note that due to historical and performance reasons, per-tensor quantization uses unsigned +// integer types, while per-channel uses signed types assuming 'zero_point' == 0. +// +// TODO Add 'quantized_dimension' field for per-channel case when IR provides it. +struct AffineQuantization +{ + std::vector scale; + std::vector zero_point; +}; + +class Tensor +{ +public: + Tensor(DataType element_type, Shape shape, AffineQuantization quantization, std::string name); + + DataType element_type() const { return _element_type; } + + const Shape &shape() const { return _shape; } + + float scale() const + { + assert(_quantization.scale.size() == 1); + return _quantization.scale[0]; + } + + float zero_point() const + { + assert(_quantization.zero_point.size() == 1); + return _quantization.zero_point[0]; + } + + template const T *data() const { return reinterpret_cast(_data.get()); } + + template T *data() { return reinterpret_cast(_data.get()); } + + const std::string &name() const { return _name; } + + void readData(void *data_ptr, size_t data_size) const; + + void writeData(const void *data_ptr, size_t data_size); + + void resize(const Shape &new_shape); + +private: + DataType _element_type; + Shape _shape; + AffineQuantization _quantization; + std::unique_ptr _data; + std::string _name; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_TENSOR_H diff --git a/compiler/luci-interpreter/requires.cmake b/compiler/luci-interpreter/requires.cmake new file mode 100644 index 0000000..f411f38 --- /dev/null +++ b/compiler/luci-interpreter/requires.cmake @@ -0,0 +1 @@ +require(luci) diff --git a/compiler/luci-interpreter/src/CMakeLists.txt b/compiler/luci-interpreter/src/CMakeLists.txt new file mode 100644 index 0000000..6a66f14 --- /dev/null +++ b/compiler/luci-interpreter/src/CMakeLists.txt @@ -0,0 +1,35 @@ +nnas_find_package(TensorFlowSource EXACT 2.1.0 QUIET) +nnas_find_package(TensorFlowGEMMLowpSource EXACT 2.1.0 QUIET) +nnas_find_package(TensorFlowEigenSource EXACT 2.1.0 QUIET) + +if (NOT TensorFlowSource_FOUND) + message(STATUS "Skipping luci-interpreter: TensorFlow not found") + return() +endif () + +if (NOT TensorFlowGEMMLowpSource_FOUND) + message(STATUS "Skipping luci-interpreter: gemmlowp not found") + return() +endif () + +if (NOT TensorFlowEigenSource_FOUND) + message(STATUS "Skipping luci-interpreter: Eigen not found") + return() +endif () + +add_subdirectory(core) +add_subdirectory(kernels) +add_subdirectory(loader) + +set(SOURCES + "${LUCI_INTERPRETER_INCLUDE_DIR}/luci_interpreter/Interpreter.h" + Interpreter.cpp) + +add_library(luci_interpreter SHARED ${SOURCES}) +target_include_directories(luci_interpreter PUBLIC "${LUCI_INTERPRETER_INCLUDE_DIR}") +target_include_directories(luci_interpreter PRIVATE "${LUCI_INTERPRETER_SOURCE_DIR}") +target_link_libraries(luci_interpreter + PUBLIC luci_lang luci_interpreter_loader luci_interpreter_core + PRIVATE nncc_common) + +install(TARGETS luci_interpreter DESTINATION lib) diff --git a/compiler/luci-interpreter/src/Interpreter.cpp b/compiler/luci-interpreter/src/Interpreter.cpp new file mode 100644 index 0000000..639ffc1 --- /dev/null +++ b/compiler/luci-interpreter/src/Interpreter.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci_interpreter/Interpreter.h" + +#include "loader/ModuleLoader.h" + +#include + +namespace luci_interpreter +{ + +namespace +{ + +class EventNotifierImpl final : public EventNotifier +{ +public: + EventNotifierImpl(const RuntimeToIR &runtime_to_ir, + const std::vector &observers) + : _runtime_to_ir(runtime_to_ir), _observers(observers) + { + } + + void postTensorWrite(const Tensor *tensor) override + { + assert(tensor != nullptr); + for (const auto &observer : _observers) + { + observer->postTensorWrite(_runtime_to_ir.tensor_to_node.at(tensor), tensor); + } + } + + void preOperatorExecute(const Kernel *kernel) override + { + assert(kernel != nullptr); + for (const auto &observer : _observers) + { + observer->preOperatorExecute(_runtime_to_ir.kernel_to_node.at(kernel)); + } + } + + void postOperatorExecute(const Kernel *kernel) override + { + assert(kernel != nullptr); + for (const auto &observer : _observers) + { + observer->postOperatorExecute(_runtime_to_ir.kernel_to_node.at(kernel)); + } + } + +private: + const RuntimeToIR &_runtime_to_ir; + const std::vector &_observers; +}; + +} // namespace + +Interpreter::Interpreter(const luci::Module *module) +{ + _runtime_to_ir = std::make_unique(); + _event_notifier = std::make_unique(*_runtime_to_ir, _observers); + _runtime_module = std::make_unique(_event_notifier.get()); + ModuleLoader loader(module, _runtime_module.get(), *_runtime_to_ir, _node_to_tensor); + loader.load(); +} + +Interpreter::~Interpreter() = default; + +void Interpreter::writeInputTensor(const luci::CircleInput *input_node, const void *data, + size_t data_size) +{ + Tensor *tensor = _runtime_module->getInputTensors()[input_node->index()]; + if (tensor == nullptr) + { + const std::string &name = input_node->name(); + throw std::runtime_error("Cannot find tensor for input node named \"" + name + "\"."); + } + if (data != nullptr) + tensor->writeData(data, data_size); +} + +void Interpreter::readOutputTensor(const luci::CircleOutput *output_node, void *data, + size_t data_size) +{ + Tensor *tensor = _runtime_module->getOutputTensors()[output_node->index()]; + if (tensor == nullptr) + { + const std::string &name = output_node->name(); + throw std::runtime_error("Cannot find tensor for output node named \"" + name + "\"."); + } + if (data != nullptr) + tensor->readData(data, data_size); +} + +void Interpreter::interpret() { _runtime_module->execute(); } + +void Interpreter::attachObserver(ExecutionObserver *observer) +{ + if (std::find(_observers.cbegin(), _observers.cend(), observer) != _observers.cend()) + throw std::runtime_error("Observer is already attached."); + _observers.push_back(observer); +} + +ExecutionObserver::~ExecutionObserver() = default; + +void ExecutionObserver::postTensorWrite(const luci::CircleNode *, const Tensor *) {} + +void ExecutionObserver::preOperatorExecute(const luci::CircleNode *) {} + +void ExecutionObserver::postOperatorExecute(const luci::CircleNode *) {} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/core/CMakeLists.txt b/compiler/luci-interpreter/src/core/CMakeLists.txt new file mode 100644 index 0000000..e576dbd --- /dev/null +++ b/compiler/luci-interpreter/src/core/CMakeLists.txt @@ -0,0 +1,17 @@ +set(SOURCES + "${LUCI_INTERPRETER_INCLUDE_DIR}/luci_interpreter/core/DataType.h" + "${LUCI_INTERPRETER_INCLUDE_DIR}/luci_interpreter/core/Tensor.h" + EventNotifier.h + Kernel.h + KernelParams.h + RuntimeGraph.h + RuntimeGraph.cpp + RuntimeModule.h + Tensor.cpp) + +add_library(luci_interpreter_core STATIC ${SOURCES}) +set_target_properties(luci_interpreter_core PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(luci_interpreter_core PUBLIC "${LUCI_INTERPRETER_INCLUDE_DIR}") +target_include_directories(luci_interpreter_core PUBLIC "${LUCI_INTERPRETER_SOURCE_DIR}") +target_link_libraries(luci_interpreter_core PUBLIC luci_lang) +target_link_libraries(luci_interpreter_core PRIVATE nncc_common) diff --git a/compiler/luci-interpreter/src/core/EventNotifier.h b/compiler/luci-interpreter/src/core/EventNotifier.h new file mode 100644 index 0000000..5c4fbd3 --- /dev/null +++ b/compiler/luci-interpreter/src/core/EventNotifier.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_EVENTNOTIFIER_H +#define LUCI_INTERPRETER_CORE_EVENTNOTIFIER_H + +namespace luci_interpreter +{ + +// Used at execution stage to tell the interpreter that the runtime state has changed in some way. +class EventNotifier +{ +public: + virtual ~EventNotifier() = default; + + virtual void postTensorWrite(const Tensor *tensor) = 0; + virtual void preOperatorExecute(const Kernel *kernel) = 0; + virtual void postOperatorExecute(const Kernel *kernel) = 0; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_EVENTNOTIFIER_H diff --git a/compiler/luci-interpreter/src/core/Kernel.h b/compiler/luci-interpreter/src/core/Kernel.h new file mode 100644 index 0000000..5f5efb2 --- /dev/null +++ b/compiler/luci-interpreter/src/core/Kernel.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_KERNEL_H +#define LUCI_INTERPRETER_CORE_KERNEL_H + +#include "luci_interpreter/core/Tensor.h" + +#include + +namespace luci_interpreter +{ + +// Base class for all kernels. +class Kernel +{ +protected: + Kernel(std::vector inputs, std::vector outputs) + : _inputs(std::move(inputs)), _outputs(std::move(outputs)) + { + } + +public: + virtual ~Kernel() = default; + + std::vector getInputTensors() const { return _inputs; } + std::vector getOutputTensors() const { return _outputs; } + + // Configures the kernel. + // This function is currently called once for each kernel during interpreter construction, + // which makes it a convenient place for preparing (resizing) output tensors. + virtual void configure() = 0; + + // Executes the kernel. + virtual void execute() const = 0; + +protected: + // NOTE Prefer not to use these in derived classes. + const std::vector _inputs; + const std::vector _outputs; +}; + +// Base class for kernels with parameters. +template class KernelWithParams : public Kernel +{ +protected: + KernelWithParams(std::vector inputs, std::vector outputs, + const Params ¶ms) + : Kernel(std::move(inputs), std::move(outputs)), _params(params) + { + } + +public: + const Params ¶ms() const { return _params; } + +protected: + const Params _params; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_KERNEL_H diff --git a/compiler/luci-interpreter/src/core/KernelParams.h b/compiler/luci-interpreter/src/core/KernelParams.h new file mode 100644 index 0000000..a32e0d4 --- /dev/null +++ b/compiler/luci-interpreter/src/core/KernelParams.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_KERNELPARAMS_H +#define LUCI_INTERPRETER_CORE_KERNELPARAMS_H + +#include +#include +#include + +#include +#include + +namespace luci_interpreter +{ + +// Inject commonly used types into `luci_interpreter` namespace for convenience. +using Activation = luci::FusedActFunc; +using Padding = luci::Padding; + +struct AddParams +{ + Activation activation; +}; + +struct ArgMaxParams +{ + DataType output_type; +}; + +struct ConcatenationParams +{ + int axis; +}; + +struct Conv2DParams +{ + Padding padding; + int32_t stride_height; + int32_t stride_width; + int32_t dilation_height_factor; + int32_t dilation_width_factor; + Activation activation; +}; + +struct DepthwiseConv2DParams +{ + Padding padding; + int32_t depth_multiplier; // TODO Remove, as it can be calculated. + int32_t stride_height; + int32_t stride_width; + int32_t dilation_height_factor; + int32_t dilation_width_factor; + Activation activation; +}; + +struct FullyConnectedParams +{ + Activation activation; +}; + +struct L2NormParams +{ + Activation activation; +}; + +struct LeakyReluParams +{ + float alpha; +}; + +struct LocalResponseNormalizationParams +{ + int32_t radius; + float bias; + float alpha; + float beta; +}; + +struct MulParams +{ + Activation activation; +}; + +struct Pool2DParams +{ + Padding padding; + int32_t filter_height; + int32_t filter_width; + int32_t stride_height; + int32_t stride_width; + Activation activation; +}; + +struct ReducerParams +{ + bool keep_dims; +}; + +struct SpaceToDepthParams +{ + int block_size; +}; + +struct SoftmaxParams +{ + float beta; +}; + +struct StridedSliceParams +{ + int32_t begin_mask; + int32_t end_mask; + int32_t ellipsis_mask; + int32_t new_axis_mask; + int32_t shrink_axis_mask; +}; + +struct SqueezeParams +{ + std::vector squeeze_dims; +}; + +struct TransposeConvParams +{ + Padding padding; + int32_t stride_height; + int32_t stride_width; +}; + +struct UnpackParams +{ + int axis; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_KERNELPARAMS_H diff --git a/compiler/luci-interpreter/src/core/RuntimeGraph.cpp b/compiler/luci-interpreter/src/core/RuntimeGraph.cpp new file mode 100644 index 0000000..06f0fed --- /dev/null +++ b/compiler/luci-interpreter/src/core/RuntimeGraph.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/RuntimeGraph.h" + +#include "core/RuntimeModule.h" + +#include + +namespace luci_interpreter +{ + +Tensor *RuntimeGraph::addTensor(std::unique_ptr &&tensor) +{ + assert(tensor != nullptr); + _tensors.push_back(std::move(tensor)); + return _tensors.back().get(); +} + +void RuntimeGraph::setInputTensors(const std::vector &input_tensors) +{ + assert(std::all_of(input_tensors.cbegin(), input_tensors.cend(), + [](Tensor *tensor) { return tensor != nullptr; })); + _input_tensors = input_tensors; +} + +void RuntimeGraph::setOutputTensors(const std::vector &output_tensors) +{ + assert(std::all_of(output_tensors.cbegin(), output_tensors.cend(), + [](Tensor *tensor) { return tensor != nullptr; })); + _output_tensors = output_tensors; +} + +void RuntimeGraph::addKernel(std::unique_ptr &&kernel) +{ + assert(kernel != nullptr); + _kernels.push_back(std::move(kernel)); +} + +void RuntimeGraph::execute() const +{ + EventNotifier *event_notifier = _owning_module->getEventNotifier(); + + // Notify the observers that the input tensors have changed. + if (event_notifier != nullptr) + { + for (const Tensor *input_tensor : getInputTensors()) + { + event_notifier->postTensorWrite(input_tensor); + } + } + + for (const auto &kernel : _kernels) + { + if (event_notifier != nullptr) + { + event_notifier->preOperatorExecute(kernel.get()); + } + + // TODO The `configure` method should only be called if the outputs of an operator need to be + // resized. + kernel->configure(); + kernel->execute(); + + if (event_notifier != nullptr) + { + event_notifier->postOperatorExecute(kernel.get()); + } + + for (const Tensor *tensor : kernel->getOutputTensors()) + { + if (event_notifier != nullptr) + { + event_notifier->postTensorWrite(tensor); + } + } + } +} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/core/RuntimeGraph.h b/compiler/luci-interpreter/src/core/RuntimeGraph.h new file mode 100644 index 0000000..6ddbea4 --- /dev/null +++ b/compiler/luci-interpreter/src/core/RuntimeGraph.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_RUNTIMEGRAPH_H +#define LUCI_INTERPRETER_CORE_RUNTIMEGRAPH_H + +#include "luci_interpreter/core/Tensor.h" +#include "core/Kernel.h" + +#include +#include + +namespace luci_interpreter +{ + +class RuntimeModule; + +class RuntimeGraph +{ +public: + explicit RuntimeGraph(RuntimeModule *owning_module) : _owning_module(owning_module) {} + + Tensor *addTensor(std::unique_ptr &&tensor); + + void setInputTensors(const std::vector &input_tensors); + void setOutputTensors(const std::vector &output_tensors); + + const std::vector &getInputTensors() const { return _input_tensors; } + const std::vector &getOutputTensors() const { return _output_tensors; } + + void addKernel(std::unique_ptr &&kernel); + + void execute() const; + +private: + RuntimeModule *_owning_module; + std::vector> _tensors; + std::vector _input_tensors; + std::vector _output_tensors; + + // Kernels in execution order. + std::vector> _kernels; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_RUNTIMEGRAPH_H diff --git a/compiler/luci-interpreter/src/core/RuntimeModule.h b/compiler/luci-interpreter/src/core/RuntimeModule.h new file mode 100644 index 0000000..dccc3a1 --- /dev/null +++ b/compiler/luci-interpreter/src/core/RuntimeModule.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_CORE_RUNTIMEMODULE_H +#define LUCI_INTERPRETER_CORE_RUNTIMEMODULE_H + +#include "core/RuntimeGraph.h" +#include "core/EventNotifier.h" + +#include +#include + +namespace luci_interpreter +{ + +class RuntimeModule +{ +public: + explicit RuntimeModule(EventNotifier *event_notifier) : _event_notifier(event_notifier) {} + + EventNotifier *getEventNotifier() const { return _event_notifier; } + + RuntimeGraph *addGraph() + { + _graphs.push_back(std::make_unique(this)); + return _graphs.back().get(); + } + + const std::vector &getInputTensors() const { return getMainGraph()->getInputTensors(); } + const std::vector &getOutputTensors() const + { + return getMainGraph()->getOutputTensors(); + } + + void execute() const { getMainGraph()->execute(); } + +private: + RuntimeGraph *getMainGraph() const { return _graphs[0].get(); } + + EventNotifier *const _event_notifier; + std::vector> _graphs; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_CORE_RUNTIMEMODULE_H diff --git a/compiler/luci-interpreter/src/core/Tensor.cpp b/compiler/luci-interpreter/src/core/Tensor.cpp new file mode 100644 index 0000000..4fe7479 --- /dev/null +++ b/compiler/luci-interpreter/src/core/Tensor.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci_interpreter/core/Tensor.h" + +#include +#include + +namespace luci_interpreter +{ + +Tensor::Tensor(DataType element_type, Shape shape, AffineQuantization quantization, + std::string name) + : _element_type(element_type), _shape(std::move(shape)), _quantization(std::move(quantization)), + _name(std::move(name)) +{ + const size_t element_size = getDataTypeSize(_element_type); + const int32_t num_elements = _shape.num_elements(); + _data = std::make_unique(num_elements * element_size); +} + +void Tensor::readData(void *data_ptr, size_t data_size) const +{ + const size_t element_size = getDataTypeSize(element_type()); + const int32_t num_elements = shape().num_elements(); + if (data_size != num_elements * element_size) + { + throw std::invalid_argument("Invalid data size."); + } + assert(data_ptr != nullptr); + std::memcpy(data_ptr, data(), data_size); +} + +void Tensor::writeData(const void *data_ptr, size_t data_size) +{ + const size_t element_size = getDataTypeSize(element_type()); + const int32_t num_elements = shape().num_elements(); + if (data_size != num_elements * element_size) + { + throw std::invalid_argument("Invalid data size."); + } + assert(data_ptr != nullptr); + std::memcpy(data(), data_ptr, data_size); +} + +void Tensor::resize(const Shape &new_shape) +{ + _shape = new_shape; + const size_t element_size = getDataTypeSize(_element_type); + const int32_t num_elements = _shape.num_elements(); + // NOTE: _data can be nullptr for empty tensors + _data = std::make_unique(num_elements * element_size); +} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Add.cpp b/compiler/luci-interpreter/src/kernels/Add.cpp new file mode 100644 index 0000000..9b93347 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Add.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Add.h" + +#include "kernels/Utils.h" + +#include +#include + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Add::Add(const Tensor *input1, const Tensor *input2, Tensor *output, const AddParams ¶ms) + : KernelWithParams({input1, input2}, {output}, params) +{ +} + +void Add::configure() +{ + assert(input1()->element_type() == input2()->element_type()); + output()->resize(calculateShapeForBroadcast(input1()->shape(), input2()->shape())); +} + +void Add::execute() const +{ + switch (input1()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Add::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::ArithmeticParams params{}; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + const bool need_broadcast = tflite::reference_ops::ProcessBroadcastShapes( + getTensorShape(input1()), getTensorShape(input2()), ¶ms); + + if (need_broadcast) + { + tflite::reference_ops::BroadcastAdd4DSlow( + params, getTensorShape(input1()), getTensorData(input1()), getTensorShape(input2()), + getTensorData(input2()), getTensorShape(output()), getTensorData(output())); + } + else + { + tflite::reference_ops::Add(params, getTensorShape(input1()), getTensorData(input1()), + getTensorShape(input2()), getTensorData(input2()), + getTensorShape(output()), getTensorData(output())); + } +} + +void Add::evalQuantized() const +{ + const auto input1_scale = static_cast(input1()->scale()); + const auto input2_scale = static_cast(input2()->scale()); + const auto output_scale = static_cast(output()->scale()); + + const int left_shift = 20; + const double twice_max_input_scale = 2 * std::max(input1_scale, input2_scale); + const double real_input1_multiplier = input1_scale / twice_max_input_scale; + const double real_input2_multiplier = input2_scale / twice_max_input_scale; + const double real_output_multiplier = twice_max_input_scale / ((1 << left_shift) * output_scale); + + int32_t input1_multiplier{}, input2_multiplier{}, output_multiplier{}; + int input1_shift{}, input2_shift{}, output_shift{}; + quantizeMultiplierSmallerThanOneExp(real_input1_multiplier, &input1_multiplier, &input1_shift); + quantizeMultiplierSmallerThanOneExp(real_input2_multiplier, &input2_multiplier, &input2_shift); + quantizeMultiplierSmallerThanOneExp(real_output_multiplier, &output_multiplier, &output_shift); + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + tflite::ArithmeticParams params{}; + params.left_shift = left_shift; + // The kernel expects inputs' zero points to be negated. + params.input1_offset = -input1()->zero_point(); // Note the '-'. + params.input1_multiplier = input1_multiplier; + params.input1_shift = input1_shift; + params.input2_offset = -input2()->zero_point(); // Note the '-'. + params.input2_multiplier = input2_multiplier; + params.input2_shift = input2_shift; + params.output_offset = output()->zero_point(); + params.output_multiplier = output_multiplier; + params.output_shift = output_shift; + params.quantized_activation_min = activation_min; + params.quantized_activation_max = activation_max; + + const bool need_broadcast = tflite::reference_ops::ProcessBroadcastShapes( + getTensorShape(input1()), getTensorShape(input2()), ¶ms); + + if (need_broadcast) + { + tflite::reference_ops::BroadcastAdd4DSlow( + params, getTensorShape(input1()), getTensorData(input1()), + getTensorShape(input2()), getTensorData(input2()), getTensorShape(output()), + getTensorData(output())); + } + else + { + tflite::reference_ops::Add(params, getTensorShape(input1()), getTensorData(input1()), + getTensorShape(input2()), getTensorData(input2()), + getTensorShape(output()), getTensorData(output())); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Add.h b/compiler/luci-interpreter/src/kernels/Add.h new file mode 100644 index 0000000..a1f7e04 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Add.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_ADD_H +#define LUCI_INTERPRETER_KERNELS_ADD_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Add : public KernelWithParams +{ +public: + Add(const Tensor *input1, const Tensor *input2, Tensor *output, const AddParams ¶ms); + + const Tensor *input1() const { return _inputs[0]; } + const Tensor *input2() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_ADD_H diff --git a/compiler/luci-interpreter/src/kernels/Add.test.cpp b/compiler/luci-interpreter/src/kernels/Add.test.cpp new file mode 100644 index 0000000..54e1cc6 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Add.test.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Add.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +// for quantized Add, the error shouldn't exceed step +float GetTolerance(float min, float max) +{ + float kQuantizedStep = (max - min) / 255.0; + return kQuantizedStep; +} + +TEST(AddTest, Uint8) +{ + std::initializer_list base_shape = {2, 3, 1, 2}; + std::initializer_list base_data = {-0.3f, 2.3f, 0.9f, 0.5f, 0.8f, -1.1f, + 1.2f, 2.8f, -1.6f, 0.0f, 0.7f, -2.2f}; + std::initializer_list test_shapes[] = { + {1, 1, 3, 2}, {1, 3, 1, 2}, {2, 1, 3, 1}, {2, 3, 1, 1}}; + std::initializer_list test_data = {0.2f, 0.3f, -0.4f, 0.5f, 1.0f, 0.9f}; + std::initializer_list output_shapes[] = { + {2, 3, 3, 2}, {2, 3, 1, 2}, {2, 3, 3, 2}, {2, 3, 1, 2}}; + std::vector> output_data = { + {-0.1f, 2.6f, -0.7f, 2.8f, 0.7f, 3.0f, 1.1f, 0.8f, 0.5f, 1.0f, 1.9f, 1.4f, + 1.0f, -0.8f, 0.4f, -0.6f, 1.8f, -0.2f, 1.4f, 3.0f, 0.8f, 3.0f, 2.2f, 3.0f, + -1.4f, 0.3f, -2.0f, 0.5f, -0.6f, 0.9f, 0.9f, -1.9f, 0.3f, -1.7f, 1.7f, -1.3f}, + {-0.1f, 2.6f, 0.5f, 1.0f, 1.8f, -0.2f, 1.4f, 3.0f, -2.0f, 0.5f, 1.7f, -1.3f}, + {-0.1f, 2.5f, 0.0f, 2.6f, -0.7f, 1.9f, 1.1f, 0.7f, 1.2f, 0.8f, 0.5f, 0.1f, + 1.0f, -0.9f, 1.1f, -0.8f, 0.4f, -1.5f, 1.7f, 3.0f, 2.2f, 3.0f, 2.1f, 3.0f, + -1.1f, 0.5f, -0.6f, 1.0f, -0.7f, 0.9f, 1.2f, -1.7f, 1.7f, -1.2f, 1.6f, -1.3f}, + {-0.1f, 2.5f, 1.2f, 0.8f, 0.4f, -1.5f, 1.7f, 3.0f, -0.6f, 1.0f, 1.6f, -1.3f}}; + float kQuantizedTolerance = GetTolerance(-3.f, 3.f); + std::pair quant_param = quantizationParams(-3.f, 3.f); + for (int i = 0; i < output_data.size(); i++) + { + Tensor input1_tensor{ + getElementType(), base_shape, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor input2_tensor{ + getElementType(), test_shapes[i], {{quant_param.first}, {quant_param.second}}, ""}; + std::vector quantized_input1_value = + quantize(base_data, quant_param.first, quant_param.second); + std::vector quantized_input2_value = + quantize(test_data, quant_param.first, quant_param.second); + input1_tensor.writeData(quantized_input1_value.data(), + quantized_input1_value.size() * sizeof(uint8_t)); + input2_tensor.writeData(quantized_input2_value.data(), + quantized_input2_value.size() * sizeof(uint8_t)); + Tensor output_tensor = + makeOutputTensor(getElementType(), quant_param.first, quant_param.second); + + AddParams params{}; + params.activation = Activation::NONE; + + Add kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(dequantize(extractTensorData(output_tensor), + output_tensor.scale(), output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(output_data[i], kQuantizedTolerance))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shapes[i])); + } + // Re-run with exchanged inputs. + for (int i = 0; i < output_data.size(); i++) + { + Tensor input1_tensor{ + getElementType(), test_shapes[i], {{quant_param.first}, {quant_param.second}}, ""}; + Tensor input2_tensor{ + getElementType(), base_shape, {{quant_param.first}, {quant_param.second}}, ""}; + std::vector quantized_input1_value = + quantize(test_data, quant_param.first, quant_param.second); + std::vector quantized_input2_value = + quantize(base_data, quant_param.first, quant_param.second); + input1_tensor.writeData(quantized_input1_value.data(), + quantized_input1_value.size() * sizeof(uint8_t)); + input2_tensor.writeData(quantized_input2_value.data(), + quantized_input2_value.size() * sizeof(uint8_t)); + Tensor output_tensor = + makeOutputTensor(getElementType(), quant_param.first, quant_param.second); + + AddParams params{}; + params.activation = Activation::NONE; + + Add kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(dequantize(extractTensorData(output_tensor), + output_tensor.scale(), output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(output_data[i], kQuantizedTolerance))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shapes[i])); + } +} + +TEST(AddTest, Float) +{ + Shape base_shape = {2, 3, 1, 2}; + std::vector test_shapes{{1, 1, 3, 2}, {1, 3, 1, 2}, {2, 1, 3, 1}, {2, 3, 1, 1}}; + std::vector> test_outputs = { + {0.0f, 2.6f, 0.0f, 2.8f, 0.7f, 3.2f, 1.1f, 0.8f, 0.5f, 1.0f, 1.9f, 1.4f, + 1.0f, 0.0f, 0.4f, 0.0f, 1.8f, 0.0f, 1.4f, 3.1f, 0.8f, 3.3f, 2.2f, 3.7f, + 0.0f, 0.3f, 0.0f, 0.5f, 0.0f, 0.9f, 0.9f, 0.0f, 0.3f, 0.0f, 1.7f, 0.0f}, + {0.0f, 2.6f, 0.5f, 1.0f, 1.8f, 0.0f, 1.4f, 3.1f, 0.0f, 0.5f, 1.7f, 0.0f}, + {0.0f, 2.5f, 0.0f, 2.6f, 0.0f, 1.9f, 1.1f, 0.7f, 1.2f, 0.8f, 0.5f, 0.1f, + 1.0f, 0.0f, 1.1f, 0.0f, 0.4f, 0.0f, 1.7f, 3.3f, 2.2f, 3.8f, 2.1f, 3.7f, + 0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.9f, 1.2f, 0.0f, 1.7f, 0.0f, 1.6f, 0.0f}, + {0.0f, 2.5f, 1.2f, 0.8f, 0.4f, 0.0f, 1.7f, 3.3f, 0.0f, 1.0f, 1.6f, 0.0f}}; + std::vector input1_data{-0.3f, 2.3f, 0.9f, 0.5f, 0.8f, -1.1f, + 1.2f, 2.8f, -1.6f, 0.0f, 0.7f, -2.2f}; + std::vector input2_data{0.2f, 0.3f, -0.4f, 0.5f, 1.0f, 0.9f}; + for (size_t i = 0; i < test_shapes.size(); ++i) + { + Tensor input1_tensor = makeInputTensor(base_shape, input1_data); + Tensor input2_tensor = makeInputTensor(test_shapes[i], input2_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + AddParams params{}; + params.activation = Activation::RELU; + + Add kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(ArrayFloatNear(test_outputs[i], 0.0001f))) + << "With shape number " << i; + } + // Re-run with exchanged inputs. + for (size_t i = 0; i < test_shapes.size(); ++i) + { + Tensor input1_tensor = makeInputTensor(test_shapes[i], input2_data); + Tensor input2_tensor = makeInputTensor(base_shape, input1_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + AddParams params{}; + params.activation = Activation::RELU; + + Add kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(ArrayFloatNear(test_outputs[i], 0.0001f))) + << "With shape number " << i; + } +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/ArgMax.cpp b/compiler/luci-interpreter/src/kernels/ArgMax.cpp new file mode 100644 index 0000000..5c464ed --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/ArgMax.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/ArgMax.h" +#include "kernels/Utils.h" +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +ArgMax::ArgMax(const Tensor *input, const Tensor *axis, Tensor *output, const ArgMaxParams ¶ms) + : KernelWithParams({input, axis}, {output}, params) +{ +} + +void ArgMax::configure() +{ + assert(axis()->element_type() == DataType::S32 || axis()->element_type() == DataType::S64); + assert(input()->shape().num_dims() >= 1); + const Shape &input_shape = input()->shape(); + const int num_dims = input_shape.num_dims(); + Shape output_shape(num_dims - 1); + + // If axis value is negative, then update by adding input_shape's num_dims. + // If updated value also negative, then assert. + assert(axis()->shape().num_elements() == 1); + int axis_value = getTensorData(axis())[0]; + if (axis_value < 0) + axis_value = axis_value + num_dims; + assert(axis_value >= 0); + + int j = 0; + for (int i = 0; i < num_dims; i++) + { + if (i == axis_value) + continue; + output_shape.dim(j++) = input_shape.dim(i); + } + + assert(output()->element_type() == _params.output_type); + + output()->resize(output_shape); +} + +void ArgMax::execute() const +{ + +#define TF_LITE_ARG_MAX(data_type, axis_type, output_type) \ + tflite::optimized_ops::ArgMinMax(getTensorShape(input()), getTensorData(input()), \ + getTensorData(axis()), getTensorShape(output()), \ + getTensorData(output()), \ + std::greater()) + if (axis()->element_type() == DataType::S32) + { + switch (_params.output_type) + { + case DataType::S32: + switch (input()->element_type()) + { + case DataType::FLOAT32: + TF_LITE_ARG_MAX(float, int32_t, int32_t); + break; + case DataType::U8: + TF_LITE_ARG_MAX(uint8_t, int32_t, int32_t); + break; + default: + throw std::runtime_error("Unsupported input type."); + } + break; + case DataType::S64: + switch (input()->element_type()) + { + case DataType::FLOAT32: + TF_LITE_ARG_MAX(float, int32_t, int64_t); + break; + case DataType::U8: + TF_LITE_ARG_MAX(uint8_t, int32_t, int64_t); + break; + default: + throw std::runtime_error("Unsupported input type."); + } + break; + default: + throw std::runtime_error("Unsupported output type."); + } + } + else + { + switch (_params.output_type) + { + case DataType::S32: + switch (input()->element_type()) + { + case DataType::FLOAT32: + TF_LITE_ARG_MAX(float, int64_t, int32_t); + break; + case DataType::U8: + TF_LITE_ARG_MAX(uint8_t, int64_t, int32_t); + break; + default: + throw std::runtime_error("Unsupported input type."); + } + break; + case DataType::S64: + switch (input()->element_type()) + { + case DataType::FLOAT32: + TF_LITE_ARG_MAX(float, int64_t, int64_t); + break; + case DataType::U8: + TF_LITE_ARG_MAX(uint8_t, int64_t, int64_t); + break; + default: + throw std::runtime_error("Unsupported input type."); + } + break; + default: + throw std::runtime_error("Unsupported output type."); + } + } +#undef TF_LITE_ARG_MAX +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/ArgMax.h b/compiler/luci-interpreter/src/kernels/ArgMax.h new file mode 100644 index 0000000..c851b58 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/ArgMax.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_ARGMAX_H +#define LUCI_INTERPRETER_KERNELS_ARGMAX_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class ArgMax : public KernelWithParams +{ +public: + ArgMax(const Tensor *input, const Tensor *axis, Tensor *output, const ArgMaxParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *axis() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_ARGMAX_H diff --git a/compiler/luci-interpreter/src/kernels/ArgMax.test.cpp b/compiler/luci-interpreter/src/kernels/ArgMax.test.cpp new file mode 100644 index 0000000..5ac3b2f --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/ArgMax.test.cpp @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/ArgMax.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(std::initializer_list input_shape, + std::initializer_list dimension_shape, + std::initializer_list output_shape, std::initializer_list input_data, + std::initializer_list dimension_data, std::initializer_list output_data) +{ + + Tensor input_tensor{getElementType(), input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(T1)); + Tensor dimension_tensor{DataType::S32, dimension_shape, {}, ""}; + dimension_tensor.writeData(dimension_data.begin(), dimension_data.size() * sizeof(int32_t)); + + Tensor output_tensor = makeOutputTensor(getElementType()); + + ArgMaxParams params{}; + params.output_type = getElementType(); + ArgMax kernel(&input_tensor, &dimension_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), ::testing::ElementsAreArray(output_data)); + EXPECT_THAT(extractTensorShape(output_tensor), output_shape); +} + +template class ArgMaxTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(ArgMaxTest, DataTypes); + +TYPED_TEST(ArgMaxTest, Simple) +{ + Check(/*input_shape=*/{1, 1, 1, 4}, /*dimension_shape=*/{}, + /*output_shape=*/{1, 1, 1}, + /*input_data=*/ + { + 1, 9, 7, 3, + }, + /*dimension_data=*/{3}, /*output_data=*/{1}); + Check(/*input_shape=*/{1, 1, 1, 4}, /*dimension_shape=*/{}, + /*output_shape=*/{1, 1, 1}, + /*input_data=*/ + { + 1, 9, 7, 3, + }, + /*dimension_data=*/{3}, /*output_data=*/{1}); +} + +TYPED_TEST(ArgMaxTest, MultiDimensions) +{ + Check(/*input_shape=*/{1, 1, 2, 4}, /*dimension_shape=*/{}, + /*output_shape=*/{1, 1, 2}, + /*input_data=*/ + { + 1, 2, 7, 8, 1, 9, 7, 3, + }, + /*dimension_data=*/{3}, /*output_data=*/{3, 1}); + Check(/*input_shape=*/{1, 1, 2, 4}, /*dimension_shape=*/{}, + /*output_shape=*/{1, 1, 2}, + /*input_data=*/ + { + 1, 2, 7, 8, 1, 9, 7, 3, + }, + /*dimension_data=*/{3}, /*output_data=*/{3, 1}); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/AveragePool2D.cpp b/compiler/luci-interpreter/src/kernels/AveragePool2D.cpp new file mode 100644 index 0000000..6d1b8ea --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/AveragePool2D.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/AveragePool2D.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +AveragePool2D::AveragePool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void AveragePool2D::configure() +{ + const Shape &input_shape = input()->shape(); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t depth = input_shape.dim(3); + + const int32_t output_height = computeOutputSize(_params.padding, input_height, + _params.filter_height, _params.stride_height); + const int32_t output_width = + computeOutputSize(_params.padding, input_width, _params.filter_width, _params.stride_width); + + _padding_height = + computePadding(_params.stride_height, 1, input_height, _params.filter_height, output_height); + _padding_width = + computePadding(_params.stride_width, 1, input_width, _params.filter_width, output_width); + + output()->resize({batches, output_height, output_width, depth}); +} + +void AveragePool2D::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void AveragePool2D::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::PoolParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.filter_height = _params.filter_height; + params.filter_width = _params.filter_width; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + tflite::reference_ops::AveragePool(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +void AveragePool2D::evalQuantized() const +{ + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + tflite::PoolParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.filter_height = _params.filter_height; + params.filter_width = _params.filter_width; + params.quantized_activation_min = activation_min; + params.quantized_activation_max = activation_max; + + tflite::reference_ops::AveragePool(params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/AveragePool2D.h b/compiler/luci-interpreter/src/kernels/AveragePool2D.h new file mode 100644 index 0000000..91f212b --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/AveragePool2D.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_AVERAGEPOOL2D_H +#define LUCI_INTERPRETER_KERNELS_AVERAGEPOOL2D_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class AveragePool2D : public KernelWithParams +{ +public: + AveragePool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + int32_t _padding_height{}; + int32_t _padding_width{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_AVERAGEPOOL2D_H diff --git a/compiler/luci-interpreter/src/kernels/AveragePool2D.test.cpp b/compiler/luci-interpreter/src/kernels/AveragePool2D.test.cpp new file mode 100644 index 0000000..7160e49 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/AveragePool2D.test.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/AveragePool2D.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(AveragePool2DTest, Float) +{ + Shape input_shape{1, 3, 5, 1}; + std::vector input_data{ + -4, -3, -2, -1, 0, // + 1, 2, 3, 4, 5, // + 6, 7, 8, 9, 10, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.filter_height = 2; + params.filter_width = 3; + params.stride_height = 1; + params.stride_width = 2; + params.activation = Activation::RELU6; + + AveragePool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 0, 1.5, // + 4.5, 6, // + }; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 2, 2, 1})); +} + +TEST(AveragePool2DTest, Uint8_0) +{ + std::pair quant_param = quantizationParams(-15.9375f, 15.9375f); + Tensor input_tensor{DataType::U8, {1, 2, 4, 1}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + + std::vector quant_input = quantize( + { + 0, -6, 12, 4, // + -3, -2, 10, 7, // + }, + quant_param.first, quant_param.second); + input_tensor.writeData(quant_input.data(), quant_input.size() * sizeof(uint8_t)); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + params.activation = Activation::RELU6; + + AveragePool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear({0.0, 6.0}))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 1, 2, 1})); +} + +TEST(AveragePool2DTest, Uint8_1) +{ + std::pair quant_param = quantizationParams(-15.9375f, 15.9375f); + Tensor input_tensor{DataType::U8, {1, 2, 4, 1}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + + std::vector quant_input = quantize( + { + 0, 6, 12, 4, // + 3, 2, 10, 7, // + }, + quant_param.first, quant_param.second); + input_tensor.writeData(quant_input.data(), quant_input.size() * sizeof(uint8_t)); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + params.activation = Activation::RELU6; + + AveragePool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear({2.75, 6.0}))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 1, 2, 1})); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/CMakeLists.txt b/compiler/luci-interpreter/src/kernels/CMakeLists.txt new file mode 100644 index 0000000..fe36231 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/CMakeLists.txt @@ -0,0 +1,106 @@ +find_package(Threads REQUIRED) +nnas_find_package(GTest REQUIRED) + +set(SOURCES + Add.h + Add.cpp + ArgMax.h + ArgMax.cpp + AveragePool2D.h + AveragePool2D.cpp + Concatenation.h + Concatenation.cpp + Conv2D.h + Conv2D.cpp + DepthwiseConv2D.h + DepthwiseConv2D.cpp + Elu.h + Elu.cpp + FullyConnected.h + FullyConnected.cpp + If.h + If.cpp + L2Normalize.h + L2Normalize.cpp + L2Pool2D.h + L2Pool2D.cpp + LeakyRelu.h + LeakyRelu.cpp + LocalResponseNormalization.h + LocalResponseNormalization.cpp + Logistic.h + Logistic.cpp + MaxPool2D.h + MaxPool2D.cpp + Mean.h + Mean.cpp + Mul.h + Mul.cpp + Pad.h + Pad.cpp + Reshape.h + Reshape.cpp + Softmax.h + Softmax.cpp + SpaceToDepth.h + SpaceToDepth.cpp + Split.h + Split.cpp + StridedSlice.h + StridedSlice.cpp + Squeeze.h + Squeeze.cpp + Transpose.h + Transpose.cpp + TransposeConv.h + TransposeConv.cpp + Unpack.h + Unpack.cpp) + +list(APPEND SOURCES Utils.h Utils.cpp) + +add_library(luci_interpreter_kernels STATIC ${SOURCES}) +set_target_properties(luci_interpreter_kernels PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(luci_interpreter_kernels PUBLIC ${LUCI_INTERPRETER_SOURCE_DIR}) +target_include_directories(luci_interpreter_kernels SYSTEM PRIVATE + "${TensorFlowGEMMLowpSource_DIR}" + "${TensorFlowEigenSource_DIR}" + "${TensorFlowSource_DIR}") +target_link_libraries(luci_interpreter_kernels + PUBLIC luci_interpreter_core + PRIVATE nncc_common Threads::Threads) + + +set(TEST_SOURCES + Add.test.cpp + ArgMax.test.cpp + AveragePool2D.test.cpp + Concatenation.test.cpp + Conv2D.test.cpp + DepthwiseConv2D.test.cpp + Elu.test.cpp + FullyConnected.test.cpp + If.test.cpp + L2Normalize.test.cpp + L2Pool2D.test.cpp + LeakyRelu.test.cpp + LocalResponseNormalization.test.cpp + Logistic.test.cpp + MaxPool2D.test.cpp + Mean.test.cpp + Mul.test.cpp + Pad.test.cpp + Reshape.test.cpp + Softmax.test.cpp + SpaceToDepth.test.cpp + Split.test.cpp + StridedSlice.test.cpp + Squeeze.test.cpp + Transpose.test.cpp + TransposeConv.test.cpp + Unpack.test.cpp) + +list(APPEND TEST_SOURCES TestUtils.h TestUtils.cpp) + +GTest_AddTest(luci_interpreter_kernels_test ${TEST_SOURCES}) +target_link_libraries(luci_interpreter_kernels_test luci_interpreter_kernels) diff --git a/compiler/luci-interpreter/src/kernels/Concatenation.cpp b/compiler/luci-interpreter/src/kernels/Concatenation.cpp new file mode 100644 index 0000000..812ab76 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Concatenation.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Concatenation.h" +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Concatenation::Concatenation(std::vector inputs, Tensor *output, + const ConcatenationParams ¶ms) + : KernelWithParams(std::move(inputs), {output}, params) +{ +} + +void Concatenation::configure() +{ + const int num_inputs = _inputs.size(); + assert(num_inputs > 0); + const Tensor *t0 = _inputs[0]; + + int axis = _params.axis; + if (axis < 0) + axis += t0->shape().num_dims(); + assert(axis >= 0 && axis < t0->shape().num_dims()); + + int32_t sum_axis = t0->shape().dim(axis); + for (int i = 1; i < num_inputs; ++i) + { + const Tensor *tensor = _inputs[i]; + assert(tensor->element_type() == t0->element_type()); + assert(tensor->shape().num_dims() == t0->shape().num_dims()); + for (int d = 0; d < t0->shape().num_dims(); ++d) + { + if (d == axis) + { + sum_axis += tensor->shape().dim(axis); + } + else + { + assert(tensor->shape().dim(d) == t0->shape().dim(d)); + } + } + } + + Shape output_shape = t0->shape(); + output_shape.dim(axis) = sum_axis; + + // TODO S8 type needs more checking: quantization parameters of all input tensors and the output + // tensor should be the same. Note that there is no such requirement for U8 type. + if (t0->element_type() == DataType::S8) + throw std::runtime_error("Unsupported type."); + + output()->resize(output_shape); +} + +void Concatenation::execute() const +{ + switch (_inputs[0]->element_type()) + { + case DataType::FLOAT32: + evalGeneric(); + break; + case DataType::U8: + evalQuantized(); + break; + case DataType::S8: + evalGeneric(); + break; + case DataType::S32: + evalGeneric(); + break; + case DataType::S64: + evalGeneric(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +template void Concatenation::evalGeneric() const +{ + int axis = _params.axis; + if (axis < 0) + axis += output()->shape().num_dims(); + + VectorOfTensors inputs(_inputs); + tflite::ConcatenationParams params{}; + params.axis = axis; + params.inputs_count = _inputs.size(); + tflite::reference_ops::Concatenation(params, inputs.shapes(), inputs.data(), + getTensorShape(output()), getTensorData(output())); +} + +void Concatenation::evalQuantized() const +{ + int axis = _params.axis; + if (axis < 0) + axis += output()->shape().num_dims(); + + VectorOfQuantizedTensors inputs(_inputs); + tflite::ConcatenationParams params{}; + params.axis = axis; + params.input_zeropoint = inputs.zero_point(); + params.input_scale = inputs.scale(); + params.inputs_count = _inputs.size(); + params.output_zeropoint = output()->zero_point(); + params.output_scale = output()->scale(); + + tflite::reference_ops::ConcatenationWithScaling(params, inputs.shapes(), inputs.data(), + getTensorShape(output()), + getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Concatenation.h b/compiler/luci-interpreter/src/kernels/Concatenation.h new file mode 100644 index 0000000..b48c8ed --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Concatenation.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_CONCATENATION_H +#define LUCI_INTERPRETER_KERNELS_CONCATENATION_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Concatenation : public KernelWithParams +{ +public: + Concatenation(std::vector inputs, Tensor *output, + const ConcatenationParams ¶ms); + + const Tensor *input(int index) const { return _inputs[index]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + template void evalGeneric() const; + void evalQuantized() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_CONCATENATION_H diff --git a/compiler/luci-interpreter/src/kernels/Concatenation.test.cpp b/compiler/luci-interpreter/src/kernels/Concatenation.test.cpp new file mode 100644 index 0000000..d9a7097 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Concatenation.test.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Concatenation.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(ConcatenationTest, Float) +{ + std::vector input1_data{1, 2, 3, 4, 5, 6}; + std::vector input2_data{7, 8, 9, 10, 11, 12}; + Tensor input1_tensor = makeInputTensor({2, 3}, input1_data); + Tensor input2_tensor = makeInputTensor({2, 3}, input2_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + ConcatenationParams params{}; + + // Try different 'axis' and expect different results. + { + params.axis = 0; + + Concatenation kernel({&input1_tensor, &input2_tensor}, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}))); + } + { + params.axis = -2; // Same as '0'. + + Concatenation kernel({&input1_tensor, &input2_tensor}, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}))); + } + { + params.axis = 1; + + Concatenation kernel({&input1_tensor, &input2_tensor}, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12}))); + } + { + params.axis = -1; // Same as '1'. + + Concatenation kernel({&input1_tensor, &input2_tensor}, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12}))); + } +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.cpp b/compiler/luci-interpreter/src/kernels/Conv2D.cpp new file mode 100644 index 0000000..60e6134 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Conv2D.cpp @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Conv2D.h" + +#include "kernels/Utils.h" + +#include + +#include +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Conv2D::Conv2D(const Tensor *input, const Tensor *filter, const Tensor *bias, Tensor *output, + const Conv2DParams ¶ms) + : KernelWithParams({input, filter, bias}, {output}, params) +{ +} + +void Conv2D::configure() +{ + // TensorFlow Lite (as of v2.2.0) supports the following combinations of types: + // | input filter bias output | + // ----+---------------------------+ + // (1) | float float float float | + // (2) | float int8 float float | hybrid + // (3) | uint8 uint8 int32 uint8 | quantized + // (4) | int8 int8 int32 int8 | quantized per channel + // + // We only support (1) and (3) for now. + if (input()->element_type() == DataType::FLOAT32 && filter()->element_type() == DataType::FLOAT32) + { + assert(bias() == nullptr || bias()->element_type() == DataType::FLOAT32); + } + else if (input()->element_type() == DataType::U8 && filter()->element_type() == DataType::U8) + { + assert(bias() == nullptr || bias()->element_type() == DataType::S32); + } + else + { + throw std::runtime_error("Unsupported type."); + } + assert(output()->element_type() == input()->element_type()); + + const Shape &input_shape = input()->shape(); + const Shape &filter_shape = filter()->shape(); + assert(input_shape.num_dims() == 4 && filter_shape.num_dims() == 4); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t output_depth = filter_shape.dim(0); + const int32_t filter_height = filter_shape.dim(1); + const int32_t filter_width = filter_shape.dim(2); + assert(filter_shape.dim(3) == input_shape.dim(3)); + + assert(bias() == nullptr || + (bias()->shape().num_dims() == 1 && bias()->shape().dim(0) == output_depth)); + + const int32_t output_height = + computeOutputSize(_params.padding, input_height, filter_height, _params.stride_height, + _params.dilation_height_factor); + const int32_t output_width = + computeOutputSize(_params.padding, input_width, filter_width, _params.stride_width, + _params.dilation_width_factor); + + _padding_height = computePadding(_params.stride_height, _params.dilation_height_factor, + input_height, filter_height, output_height); + _padding_width = computePadding(_params.stride_width, _params.dilation_width_factor, input_width, + filter_width, output_width); + + output()->resize({batches, output_height, output_width, output_depth}); + + // Allocate tensor for Im2Col, if needed. + // The checks here should be aligned with the actual implementation. + const bool need_dilated_im2col = + _params.dilation_height_factor != 1 || _params.dilation_width_factor != 1; + const bool need_non_dilated_im2col = _params.stride_height != 1 || _params.stride_width != 1 || + filter_height != 1 || filter_width != 1; + const bool need_im2col = need_dilated_im2col || need_non_dilated_im2col; + if (need_im2col) + { + const int input_depth = input_shape.dim(3); + Shape im2col_shape{batches, output_height, output_width, + input_depth * filter_height * filter_width}; + _im2col = + std::make_unique(input()->element_type(), im2col_shape, AffineQuantization{}, ""); + } +} + +void Conv2D::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + if (filter()->element_type() == DataType::FLOAT32) + { + evalFloat(); + break; + } + throw std::runtime_error("Unsupported type."); + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Conv2D::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::ConvParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.dilation_height_factor = _params.dilation_height_factor; + params.dilation_width_factor = _params.dilation_width_factor; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + tflite::optimized_ops::Conv(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(filter()), getTensorData(filter()), + getTensorShape(bias()), getTensorData(bias()), + getTensorShape(output()), getTensorData(output()), + getTensorShape(_im2col.get()), getTensorData(_im2col.get())); +} + +void Conv2D::evalQuantized() const +{ + const auto input_scale = static_cast(input()->scale()); + const auto filter_scale = static_cast(filter()->scale()); + const auto output_scale = static_cast(output()->scale()); + + const double real_multiplier = input_scale * filter_scale / output_scale; + int32_t output_multiplier{}; + int output_shift{}; + quantizeMultiplier(real_multiplier, &output_multiplier, &output_shift); + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + tflite::ConvParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.dilation_height_factor = _params.dilation_height_factor; + params.dilation_width_factor = _params.dilation_width_factor; + // The kernel expects input and filter zero points to be negated. + params.input_offset = -input()->zero_point(); // Note the '-'. + params.weights_offset = -filter()->zero_point(); // Note the '-'. + params.output_offset = output()->zero_point(); + params.output_multiplier = output_multiplier; + params.output_shift = output_shift; + params.quantized_activation_min = activation_min; + params.quantized_activation_max = activation_max; + + // TODO This should only be done once (although it takes only a few microseconds). + // Also, the user should be able to adjust the number of threads. + auto gemmlowp_context = std::make_unique(); + gemmlowp_context->set_max_num_threads(static_cast(std::thread::hardware_concurrency())); + + tflite::optimized_ops::Conv( + params, getTensorShape(input()), getTensorData(input()), getTensorShape(filter()), + getTensorData(filter()), getTensorShape(bias()), getTensorData(bias()), + getTensorShape(output()), getTensorData(output()), getTensorShape(_im2col.get()), + getTensorData(_im2col.get()), gemmlowp_context.get()); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.h b/compiler/luci-interpreter/src/kernels/Conv2D.h new file mode 100644 index 0000000..69e3098 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Conv2D.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_CONV2D_H +#define LUCI_INTERPRETER_KERNELS_CONV2D_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +class Conv2D : public KernelWithParams +{ +public: + Conv2D(const Tensor *input, const Tensor *filter, const Tensor *bias, Tensor *output, + const Conv2DParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *filter() const { return _inputs[1]; } + const Tensor *bias() const { return _inputs[2]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + std::unique_ptr _im2col; + int32_t _padding_height{}; + int32_t _padding_width{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_CONV2D_H diff --git a/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp b/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp new file mode 100644 index 0000000..ef9ace9 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Conv2D.test.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Conv2D.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(Conv2DTest, Float) +{ + Shape input_shape{1, 4, 3, 2}; + Shape filter_shape{2, 2, 2, 2}; + Shape bias_shape{2}; + std::vector input_data{ + 1, 2, 3, 4, 5, 6, // row = 0 + 7, 8, 9, 10, 11, 12, // row = 1 + 13, 14, 15, 16, 17, 18, // row = 2 + 19, 20, 21, 22, 23, 24, // row = 3 + }; + std::vector filter_data{ + 1, 2, -3, -4, // out = 0, row = 0 + -5, 6, -7, 8, // out = 1, row = 0 + 4, -2, 3, -1, // out = 0, row = 1 + -8, -6, 7, 5, // out = 1, row = 1 + }; + std::vector bias_data{1, 2}; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor filter_tensor = makeInputTensor(filter_shape, filter_data); + Tensor bias_tensor = makeInputTensor(bias_shape, bias_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Conv2DParams params{}; + params.padding = Padding::VALID; + params.stride_height = 2; + params.stride_width = 1; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::RELU; + + Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 11, 16, 7, 20, // row = 0 + 0, 40, 0, 44, // row = 1 + }; + std::vector ref_output_shape{1, 2, 2, 2}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(Conv2DTest, FloatCheck) +{ + Shape input_shape{2, 2, 4, 1}; + Shape filter_shape{3, 2, 2, 1}; + Shape bias_shape{3}; + std::vector input_data{ + // First batch + 1, 1, 1, 1, // row = 1 + 2, 2, 2, 2, // row = 2 + // Second batch + 1, 2, 3, 4, // row = 1 + 1, 2, 3, 4, // row = 2 + }; + std::vector filter_data{ + 1, 2, 3, 4, // first 2x2 filter + -1, 1, -1, 1, // second 2x2 filter + -1, -1, 1, 1, // third 2x2 filter + }; + std::vector bias_data{1, 2, 3}; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor filter_tensor = makeInputTensor(filter_shape, filter_data); + Tensor bias_tensor = makeInputTensor(bias_shape, bias_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Conv2DParams params{}; + params.padding = Padding::VALID; + params.stride_height = 2; + params.stride_width = 2; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::NONE; + + Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 18, 2, 5, // first batch, left + 18, 2, 5, // first batch, right + 17, 4, 3, // second batch, left + 37, 4, 3, // second batch, right + }; + std::vector ref_output_shape{2, 1, 2, 3}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(Conv2DTest, Uint8) +{ + std::pair input_quant_param = quantizationParams(-63.5, 64); + std::pair output_quant_param = quantizationParams(-127, 128); + Shape bias_shape = {3}; + Tensor input_tensor{ + DataType::U8, {2, 2, 4, 1}, {{input_quant_param.first}, {input_quant_param.second}}, ""}; + Tensor filter_tensor{ + DataType::U8, {3, 2, 2, 1}, {{input_quant_param.first}, {input_quant_param.second}}, ""}; + Tensor bias_tensor{ + DataType::S32, bias_shape, {{input_quant_param.first * input_quant_param.first}, {0}}, ""}; + Tensor output_tensor = + makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second); + std::vector quantized_input = quantize( + { + // First batch + 1, 1, 1, 1, // row = 1 + 2, 2, 2, 2, // row = 2 + // Second batch + 1, 2, 3, 4, // row = 1 + 1, 2, 3, 4, // row = 2 + }, + input_quant_param.first, input_quant_param.second); + std::vector quantized_filter = quantize( + { + 1, 2, 3, 4, // first 2x2 filter + -1, 1, -1, 1, // second 2x2 filter + -1, -1, 1, 1, // third 2x2 filter + }, + input_quant_param.first, input_quant_param.second); + std::vector bias_data = + quantize({1, 2, 3}, input_quant_param.first * input_quant_param.first, 0); + input_tensor.writeData(quantized_input.data(), quantized_input.size() * sizeof(uint8_t)); + filter_tensor.writeData(quantized_filter.data(), quantized_filter.size() * sizeof(uint8_t)); + bias_tensor.writeData(bias_data.data(), bias_data.size() * sizeof(int32_t)); + + Conv2DParams params{}; + params.padding = Padding::VALID; + params.stride_height = 2; + params.stride_width = 2; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::NONE; + + Conv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 18, 2, 5, // first batch, left + 18, 2, 5, // first batch, right + 17, 4, 3, // second batch, left + 37, 4, 3, // second batch, right + }; + std::vector ref_output_shape{2, 1, 2, 3}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), + output_quant_param.first, output_quant_param.second), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp new file mode 100644 index 0000000..b01a5e0 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/DepthwiseConv2D.h" + +#include "kernels/Utils.h" + +#include +#include + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +DepthwiseConv2D::DepthwiseConv2D(const Tensor *input, const Tensor *filter, const Tensor *bias, + Tensor *output, const DepthwiseConv2DParams ¶ms) + : KernelWithParams({input, filter, bias}, {output}, params) +{ +} + +void DepthwiseConv2D::configure() +{ + // TensorFlow Lite (as of v2.2.0) supports the following combinations of types: + // | input filter bias output | + // ----+---------------------------+ + // (1) | float float float float | + // (2) | float int8 float float | hybrid + // (3) | uint8 uint8 int32 uint8 | quantized + // (4) | int8 int8 int32 int8 | quantized per channel + // (5) | int16 int8 int64 int16 | quantized per channel 16x8 + // + // We only support (1) and (3) for now. + if (input()->element_type() == DataType::FLOAT32 && filter()->element_type() == DataType::FLOAT32) + { + assert(bias() == nullptr || bias()->element_type() == DataType::FLOAT32); + } + else if (input()->element_type() == DataType::U8 && filter()->element_type() == DataType::U8) + { + assert(bias() == nullptr || bias()->element_type() == DataType::S32); + } + else + { + throw std::runtime_error("Unsupported type."); + } + assert(output()->element_type() == input()->element_type()); + + const Shape &input_shape = input()->shape(); + const Shape &filter_shape = filter()->shape(); + assert(input_shape.num_dims() == 4 && filter_shape.num_dims() == 4); + + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + // Filter format: [1, H, W, O]. + assert(filter_shape.dim(0) == 1); + const int32_t filter_height = filter_shape.dim(1); + const int32_t filter_width = filter_shape.dim(2); + const int32_t channels_out = filter_shape.dim(3); + + assert(bias() == nullptr || + (bias()->shape().num_dims() == 1 && bias()->shape().dim(0) == channels_out)); + + const int32_t output_height = + computeOutputSize(_params.padding, input_height, filter_height, _params.stride_height, + _params.dilation_height_factor); + const int32_t output_width = + computeOutputSize(_params.padding, input_width, filter_width, _params.stride_width, + _params.dilation_width_factor); + + _padding_height = computePadding(_params.stride_height, _params.dilation_height_factor, + input_height, filter_height, output_height); + _padding_width = computePadding(_params.stride_width, _params.dilation_width_factor, input_width, + filter_width, output_width); + + output()->resize({batches, output_height, output_width, channels_out}); +} + +void DepthwiseConv2D::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + if (filter()->element_type() == DataType::FLOAT32) + { + evalFloat(); + break; + } + throw std::runtime_error("Unsupported type."); + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void DepthwiseConv2D::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::DepthwiseParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.dilation_height_factor = _params.dilation_height_factor; + params.dilation_width_factor = _params.dilation_width_factor; + params.depth_multiplier = _params.depth_multiplier; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + tflite::reference_ops::DepthwiseConv( + params, getTensorShape(input()), getTensorData(input()), getTensorShape(filter()), + getTensorData(filter()), getTensorShape(bias()), getTensorData(bias()), + getTensorShape(output()), getTensorData(output())); +} + +void DepthwiseConv2D::evalQuantized() const +{ + const auto input_scale = static_cast(input()->scale()); + const auto filter_scale = static_cast(filter()->scale()); + const auto output_scale = static_cast(output()->scale()); + + const double real_multiplier = input_scale * filter_scale / output_scale; + int32_t output_multiplier{}; + int output_shift{}; + quantizeMultiplier(real_multiplier, &output_multiplier, &output_shift); + + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + tflite::DepthwiseParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.dilation_height_factor = _params.dilation_height_factor; + params.dilation_width_factor = _params.dilation_width_factor; + params.depth_multiplier = _params.depth_multiplier; + // The kernel expects input and filter zero points to be negated. + params.input_offset = -input()->zero_point(); // Note the '-'. + params.weights_offset = -filter()->zero_point(); // Note the '-'. + params.output_offset = output()->zero_point(); + params.output_multiplier = output_multiplier; + params.output_shift = output_shift; + params.quantized_activation_min = activation_min; + params.quantized_activation_max = activation_max; + + tflite::reference_ops::DepthwiseConv( + params, getTensorShape(input()), getTensorData(input()), getTensorShape(filter()), + getTensorData(filter()), getTensorShape(bias()), getTensorData(bias()), + getTensorShape(output()), getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h new file mode 100644 index 0000000..62f4bff --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_DEPTHWISECONV2D_H +#define LUCI_INTERPRETER_KERNELS_DEPTHWISECONV2D_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class DepthwiseConv2D : public KernelWithParams +{ +public: + DepthwiseConv2D(const Tensor *input, const Tensor *filter, const Tensor *bias, Tensor *output, + const DepthwiseConv2DParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *filter() const { return _inputs[1]; } + const Tensor *bias() const { return _inputs[2]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + int32_t _padding_height{}; + int32_t _padding_width{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_DEPTHWISECONV2D_H diff --git a/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp new file mode 100644 index 0000000..a9b43d8 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/DepthwiseConv2D.test.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/DepthwiseConv2D.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(DepthwiseConv2DTest, Float) +{ + Shape input_shape{1, 4, 2, 2}; + Shape filter_shape{1, 2, 2, 4}; + Shape bias_shape{4}; + std::vector input_data{ + 1, 2, 7, 8, // + 3, 4, 9, 10, // + 5, 6, 11, 12, // + 13, 14, 15, 16, // + }; + std::vector filter_data{ + 1, 2, 3, 4, // + -9, 10, -11, 12, // + 5, 6, 7, 8, // + 13, -14, 15, -16, // + }; + std::vector bias_data{1, 2, 3, 4}; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor filter_tensor = makeInputTensor(filter_shape, filter_data); + Tensor bias_tensor = makeInputTensor(bias_shape, bias_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + DepthwiseConv2DParams params{}; + params.padding = Padding::VALID; + params.depth_multiplier = 2; + params.stride_height = 2; + params.stride_width = 1; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::RELU; + + DepthwiseConv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 71, 0, 99, 0, // + 167, 0, 227, 28, // + }; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 2, 1, 4})); +} + +TEST(DepthwiseConv2DTest, Uint8) +{ + std::pair input_quant_param = quantizationParams(-63.5, 64); + std::pair output_quant_param = quantizationParams(-127, 128); + + Tensor input_tensor{ + DataType::U8, {1, 3, 2, 2}, {{input_quant_param.first}, {input_quant_param.second}}, ""}; + Tensor filter_tensor{ + DataType::U8, {1, 2, 2, 4}, {{input_quant_param.first}, {input_quant_param.second}}, ""}; + Tensor bias_tensor{ + DataType::S32, {4}, {{input_quant_param.first * input_quant_param.first}, {0}}, ""}; + Tensor output_tensor = + makeOutputTensor(DataType::U8, output_quant_param.first, output_quant_param.second); + + std::vector quant_input = quantize( + { + 1, 2, 7, 8, // column 1 + 3, 4, 9, 10, // column 2 + 5, 6, 11, 12, // column 3 + }, + input_quant_param.first, input_quant_param.second); + std::vector quant_filter = quantize( + { + 1, 2, 3, 4, // + -9, 10, -11, 12, // + 5, 6, 7, 8, // + 13, -14, 15, -16, // + }, + input_quant_param.first, input_quant_param.second); + std::vector quant_bias = + quantize({1, 2, 3, 4}, input_quant_param.first * input_quant_param.first, 0); + + input_tensor.writeData(quant_input.data(), quant_input.size() * sizeof(uint8_t)); + filter_tensor.writeData(quant_filter.data(), quant_filter.size() * sizeof(uint8_t)); + bias_tensor.writeData(quant_bias.data(), quant_bias.size() * sizeof(int32_t)); + + DepthwiseConv2DParams params{}; + params.padding = Padding::VALID; + params.depth_multiplier = 2; + params.stride_height = 1; + params.stride_width = 1; + params.dilation_height_factor = 1; + params.dilation_width_factor = 1; + params.activation = Activation::NONE; + + DepthwiseConv2D kernel(&input_tensor, &filter_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 71, -34, 99, -20, // + 91, -26, 127, -4, // + }; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 2, 1, 4})); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Elu.cpp b/compiler/luci-interpreter/src/kernels/Elu.cpp new file mode 100644 index 0000000..5de4a1f --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Elu.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Elu.h" +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +Elu::Elu(const Tensor *input, Tensor *output) : Kernel({input}, {output}) {} + +void Elu::configure() +{ + assert(input()->element_type() == output()->element_type()); + output()->resize(input()->shape()); +} + +void Elu::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + tflite::optimized_ops::Elu(getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Elu.h b/compiler/luci-interpreter/src/kernels/Elu.h new file mode 100644 index 0000000..c844ab5 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Elu.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_ELU_H +#define LUCI_INTERPRETER_KERNELS_ELU_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Elu : public Kernel +{ +public: + Elu(const Tensor *input, Tensor *output); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_ELU_H diff --git a/compiler/luci-interpreter/src/kernels/Elu.test.cpp b/compiler/luci-interpreter/src/kernels/Elu.test.cpp new file mode 100644 index 0000000..52444cb --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Elu.test.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Elu.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +void Check(std::initializer_list input_shape, std::initializer_list output_shape, + std::initializer_list input_data, std::initializer_list output_data) +{ + Tensor input_tensor{DataType::FLOAT32, input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(float)); + + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Elu kernel(&input_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + (void)output_shape; + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(ArrayFloatNear(output_data))); +} + +TEST(EluTest, SimpleElu) +{ + Check( + /*input_shape=*/{1, 2, 4, 1}, /*output_shape=*/{1, 2, 4, 1}, + /*input_data=*/ + { + 0, -6, 2, -4, // + 3, -2, 10, -0.1, // + }, + /*output_data=*/ + { + 0.0, -0.997521, 2.0, -0.981684, // + 3.0, -0.864665, 10.0, -0.0951626, // + }); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/FullyConnected.cpp b/compiler/luci-interpreter/src/kernels/FullyConnected.cpp new file mode 100644 index 0000000..6529c5e --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/FullyConnected.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/FullyConnected.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +FullyConnected::FullyConnected(const Tensor *input, const Tensor *weights, const Tensor *bias, + Tensor *output, const FullyConnectedParams ¶ms) + : KernelWithParams({input, weights, bias}, {output}, params) +{ +} + +void FullyConnected::configure() +{ + if (weights()->element_type() != DataType::FLOAT32) + throw std::runtime_error("Unsupported type."); + + assert(input()->element_type() == DataType::FLOAT32); + assert(weights()->element_type() == DataType::FLOAT32); + assert(bias() == nullptr || bias()->element_type() == DataType::FLOAT32); + + const Shape &input_shape = input()->shape(); + const Shape &weights_shape = weights()->shape(); + + assert(weights_shape.num_dims() == 2); + assert(bias() == nullptr || bias()->shape().num_elements() == weights_shape.dim(0)); + + assert(input_shape.num_elements() % weights_shape.dim(1) == 0); + const int32_t batch_size = input_shape.num_elements() / weights_shape.dim(1); + const int32_t num_units = weights_shape.dim(0); + + output()->resize({batch_size, num_units}); +} + +void FullyConnected::execute() const { evalFloat(); } + +void FullyConnected::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::FullyConnectedParams params{}; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + params.weights_format = tflite::FullyConnectedWeightsFormat::kDefault; + + tflite::reference_ops::FullyConnected( + params, getTensorShape(input()), getTensorData(input()), getTensorShape(weights()), + getTensorData(weights()), getTensorShape(bias()), getTensorData(bias()), + getTensorShape(output()), getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/FullyConnected.h b/compiler/luci-interpreter/src/kernels/FullyConnected.h new file mode 100644 index 0000000..2e3174c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/FullyConnected.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_FULLYCONNECTED_H +#define LUCI_INTERPRETER_KERNELS_FULLYCONNECTED_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class FullyConnected : public KernelWithParams +{ +public: + FullyConnected(const Tensor *input, const Tensor *weights, const Tensor *bias, Tensor *output, + const FullyConnectedParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *weights() const { return _inputs[1]; } + const Tensor *bias() const { return _inputs[2]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_FULLYCONNECTED_H diff --git a/compiler/luci-interpreter/src/kernels/FullyConnected.test.cpp b/compiler/luci-interpreter/src/kernels/FullyConnected.test.cpp new file mode 100644 index 0000000..8077fcb --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/FullyConnected.test.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/FullyConnected.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(FullyConnectedTest, Float) +{ + Shape input_shape{3, 2, 2, 1}; + std::vector input_data{ + -3, -5, 5, 4, 9, -2, // batch = 0 + -3, -2, -4, 9, -8, 1, // batch = 1 + }; + Shape weights_shape{3, 6}; + std::vector weights_data{ + -3, -7, 4, -4, -6, 4, // unit = 0 + 3, 5, 2, 3, -3, -8, // unit = 1 + -3, 7, 4, 9, 0, -5, // unit = 2 + }; + Shape bias_shape{3}; + std::vector bias_data{-1, -5, -8}; + + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor weights_tensor = makeInputTensor(weights_shape, weights_data); + Tensor bias_tensor = makeInputTensor(bias_shape, bias_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + FullyConnectedParams params{}; + params.activation = Activation::RELU; + + FullyConnected kernel(&input_tensor, &weights_tensor, &bias_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 0, 0, 32, // batch = 0 + 22, 11, 47, // batch = 1 + }; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/If.cpp b/compiler/luci-interpreter/src/kernels/If.cpp new file mode 100644 index 0000000..e6bdee3 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/If.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/If.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +static std::vector joinInputs(const Tensor *cond, + const std::vector &inputs) +{ + std::vector result{cond}; + result.insert(result.cend(), inputs.cbegin(), inputs.cend()); + return result; +} + +If::If(const Tensor *cond, const std::vector &inputs, std::vector outputs, + RuntimeGraph *then_graph, RuntimeGraph *else_graph) + : Kernel(joinInputs(cond, inputs), std::move(outputs)), _then_graph(then_graph), + _else_graph(else_graph) +{ +} + +void If::configure() +{ + assert(cond()->element_type() == DataType::BOOL); + assert(cond()->shape().num_elements() == 1); + + for (RuntimeGraph *graph : {_then_graph, _else_graph}) + { + (void)graph; + assert(graph->getInputTensors().size() == getInputTensors().size() - 1); + assert(graph->getOutputTensors().size() == getOutputTensors().size()); + } +} + +void If::execute() const +{ + const bool cond_value = cond()->data()[0]; + + RuntimeGraph *active_graph = cond_value ? _then_graph : _else_graph; + const auto &graph_inputs = active_graph->getInputTensors(); + const auto &graph_outputs = active_graph->getOutputTensors(); + + // Copy kernel inputs to active graph inputs. + for (size_t i = 0; i < getInputTensors().size() - 1; ++i) + { + assert(graph_inputs[i]->element_type() == input(i)->element_type()); + graph_inputs[i]->resize(input(i)->shape()); + + const int32_t num_elements = input(i)->shape().num_elements(); + const std::size_t element_size = getDataTypeSize(input(i)->element_type()); + std::memcpy(graph_inputs[i]->data(), input(i)->data(), num_elements * element_size); + } + + active_graph->execute(); + + // Copy graph outputs to kernel outputs. + for (size_t i = 0; i < getOutputTensors().size(); ++i) + { + assert(graph_outputs[i]->element_type() == output(i)->element_type()); + output(i)->resize(graph_outputs[i]->shape()); + + const int32_t num_elements = output(i)->shape().num_elements(); + const std::size_t element_size = getDataTypeSize(output(i)->element_type()); + std::memcpy(output(i)->data(), graph_outputs[i]->data(), + num_elements * element_size); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/If.h b/compiler/luci-interpreter/src/kernels/If.h new file mode 100644 index 0000000..fa6ab37 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/If.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_IF_H +#define LUCI_INTERPRETER_KERNELS_IF_H + +#include "core/Kernel.h" +#include "core/RuntimeGraph.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class If : public Kernel +{ +public: + If(const Tensor *cond, const std::vector &inputs, std::vector outputs, + RuntimeGraph *then_graph, RuntimeGraph *else_graph); + + const Tensor *cond() const { return _inputs[0]; } + const Tensor *input(int index) const { return _inputs[1 + index]; } + Tensor *output(int index) const { return _outputs[index]; } + + void configure() override; + void execute() const override; + +private: + RuntimeGraph *const _then_graph; + RuntimeGraph *const _else_graph; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_IF_H diff --git a/compiler/luci-interpreter/src/kernels/If.test.cpp b/compiler/luci-interpreter/src/kernels/If.test.cpp new file mode 100644 index 0000000..9b3857c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/If.test.cpp @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/RuntimeModule.h" +#include "kernels/Add.h" +#include "kernels/If.h" +#include "kernels/Mul.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +RuntimeGraph *buildAddSubgraph(RuntimeModule *module) +{ + RuntimeGraph *graph = module->addGraph(); + Tensor *input1 = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + Tensor *input2 = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + Tensor *output = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + + graph->setInputTensors({input1, input2}); + graph->setOutputTensors({output}); + + AddParams params{}; + params.activation = Activation::NONE; + graph->addKernel(std::make_unique(input1, input2, output, params)); + + return graph; +} + +RuntimeGraph *buildMulSubgraph(RuntimeModule *module) +{ + RuntimeGraph *graph = module->addGraph(); + Tensor *input1 = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + Tensor *input2 = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + Tensor *output = graph->addTensor( + std::make_unique(DataType::FLOAT32, Shape{}, AffineQuantization{}, "")); + + graph->setInputTensors({input1, input2}); + graph->setOutputTensors({output}); + + MulParams params{}; + params.activation = Activation::NONE; + graph->addKernel(std::make_unique(input1, input2, output, params)); + + return graph; +} + +TEST(IfTest, CondTrue) +{ + Tensor cond = makeInputTensor({1}, {true}); + Tensor input1 = makeInputTensor({2}, {5, 7}); + Tensor input2 = makeInputTensor({1, 2}, {1, 2}); + Tensor output = makeOutputTensor(DataType::FLOAT32); + + RuntimeModule module(nullptr); + RuntimeGraph *then_graph = buildAddSubgraph(&module); + RuntimeGraph *else_graph = buildMulSubgraph(&module); + + If kernel(&cond, {&input1, &input2}, {&output}, then_graph, else_graph); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output), ElementsAreArray(ArrayFloatNear({6, 9}))); +} + +TEST(IfTest, CondFalse) +{ + Tensor cond = makeInputTensor({1}, {false}); + Tensor input1 = makeInputTensor({2}, {5, 7}); + Tensor input2 = makeInputTensor({1, 2}, {1, 2}); + Tensor output = makeOutputTensor(DataType::FLOAT32); + + RuntimeModule module(nullptr); + RuntimeGraph *then_graph = buildAddSubgraph(&module); + RuntimeGraph *else_graph = buildMulSubgraph(&module); + + If kernel(&cond, {&input1, &input2}, {&output}, then_graph, else_graph); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output), ElementsAreArray(ArrayFloatNear({5, 14}))); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/L2Normalize.cpp b/compiler/luci-interpreter/src/kernels/L2Normalize.cpp new file mode 100644 index 0000000..cfa5350 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Normalize.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/L2Normalize.h" +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +L2Normalize::L2Normalize(const Tensor *input, Tensor *output, const L2NormParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void L2Normalize::configure() +{ + assert(input()->shape().num_dims() <= 4); + assert(output()->element_type() == DataType::FLOAT32 || output()->element_type() == DataType::U8); + assert(input()->element_type() == output()->element_type()); + if (output()->element_type() == DataType::U8) + { + assert(output()->scale() == (1. / 128.)); + assert(output()->zero_point() == 128); + } + assert(params().activation == Activation::NONE); + output()->resize(input()->shape()); +} + +void L2Normalize::execute() const +{ + switch (output()->element_type()) + { + case DataType::FLOAT32: + eval(0); + break; + case DataType::U8: + eval(input()->zero_point()); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +template void L2Normalize::eval(int32_t zero_point) const +{ + tflite::L2NormalizationParams op_params{}; + op_params.input_zero_point = zero_point; + tflite::optimized_ops::L2Normalization(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/L2Normalize.h b/compiler/luci-interpreter/src/kernels/L2Normalize.h new file mode 100644 index 0000000..6c7dac6 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Normalize.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_L2NORMALIZE_H +#define LUCI_INTERPRETER_KERNELS_L2NORMALIZE_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class L2Normalize : public KernelWithParams +{ +public: + L2Normalize(const Tensor *input, Tensor *output, const L2NormParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + template void eval(int32_t zero_point) const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_L2NORMALIZE_H diff --git a/compiler/luci-interpreter/src/kernels/L2Normalize.test.cpp b/compiler/luci-interpreter/src/kernels/L2Normalize.test.cpp new file mode 100644 index 0000000..fad450d --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Normalize.test.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "kernels/L2Normalize.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(L2NormalizeTest, Float) +{ + std::vector input_data = {-1.1, 0.6, 0.7, 1.2, -0.7, 0.1}; + + Tensor input_tensor = makeInputTensor({1, 1, 1, 6}, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + L2NormParams params{}; + params.activation = Activation::NONE; + + L2Normalize kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{-0.55, 0.3, 0.35, 0.6, -0.35, 0.05}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); +} + +TEST(L2NormalizeTest, Uint8Quantized) +{ + // TODO + // Implement GetDequantizedOutput Function. + // Create Test for Uint8 Case +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/L2Pool2D.cpp b/compiler/luci-interpreter/src/kernels/L2Pool2D.cpp new file mode 100644 index 0000000..37a6dde --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Pool2D.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/L2Pool2D.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +L2Pool2D::L2Pool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void L2Pool2D::configure() +{ + assert(input()->shape().num_dims() == 4); + assert(input()->element_type() == output()->element_type()); + + int batches = input()->shape().dim(0); + int height = input()->shape().dim(1); + int width = input()->shape().dim(2); + int channels_out = input()->shape().dim(3); + + // Matching GetWindowedOutputSize in TensorFlow. + auto padding = params().padding; + int out_width, out_height; + out_width = computeOutputSize(padding, width, params().filter_width, params().stride_width, 1); + out_height = + computeOutputSize(padding, height, params().filter_height, params().stride_height, 1); + _padding_width = + computePadding(params().stride_width, 1, width, params().filter_width, out_width); + _padding_height = + computePadding(params().stride_height, 1, height, params().filter_height, out_height); + + assert(input()->element_type() == DataType::FLOAT32); + output()->resize({batches, out_height, out_width, channels_out}); +} + +void L2Pool2D::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + float activation_min, activation_max; + calculateActivationRange(params().activation, &activation_min, &activation_max); + tflite::PoolParams op_params; + op_params.stride_height = params().stride_height; + op_params.stride_width = params().stride_width; + op_params.filter_height = params().filter_height; + op_params.filter_width = params().filter_width; + op_params.padding_values.height = _padding_height; + op_params.padding_values.width = _padding_width; + op_params.float_activation_min = activation_min; + op_params.float_activation_max = activation_max; + tflite::optimized_ops::L2Pool(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/L2Pool2D.h b/compiler/luci-interpreter/src/kernels/L2Pool2D.h new file mode 100644 index 0000000..d40f5f4 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Pool2D.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_L2POOL2D_H +#define LUCI_INTERPRETER_KERNELS_L2POOL2D_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +class L2Pool2D : public KernelWithParams +{ +public: + L2Pool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + int32_t _padding_height = 0; + int32_t _padding_width = 0; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_L2POOL2D_H diff --git a/compiler/luci-interpreter/src/kernels/L2Pool2D.test.cpp b/compiler/luci-interpreter/src/kernels/L2Pool2D.test.cpp new file mode 100644 index 0000000..06bb938 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/L2Pool2D.test.cpp @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/L2Pool2D.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(L2Pool2DTest, FloatNone) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.activation = Activation::NONE; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{3.5, 6.5}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatRelu) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + -1, -6, 2, 4, // + -3, -2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.activation = Activation::RELU; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{3.53553, 6.5}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatRelu1) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + -0.1, -0.6, 2, 4, // + -0.3, -0.2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.activation = Activation::RELU_N1_TO_1; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0.353553, 1.0}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatRelu6) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + -0.1, -0.6, 2, 4, // + -0.3, -0.2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.activation = Activation::RELU6; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0.353553, 6.0}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatPaddingSame) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::SAME; + params.activation = Activation::NONE; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{3.5, 6.5}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatPaddingSameSlide1) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::SAME; + params.activation = Activation::NONE; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 1; + params.stride_width = 1; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{3.5, 6.0, 6.5, 5.70088, 2.54951, 7.2111, 8.63134, 7.0}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(L2Pool2DTest, FloatPaddingValidSlide1) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + 0, 6, 2, 4, // + 3, 2, 10, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.activation = Activation::NONE; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 1; + params.stride_width = 1; + + L2Pool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{3.5, 6.0, 6.5}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/LeakyRelu.cpp b/compiler/luci-interpreter/src/kernels/LeakyRelu.cpp new file mode 100644 index 0000000..fce01a6 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LeakyRelu.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/LeakyRelu.h" + +#include "kernels/Utils.h" + +#include +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +LeakyRelu::LeakyRelu(const Tensor *input, Tensor *output, const LeakyReluParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void LeakyRelu::configure() +{ + assert(input()->element_type() == output()->element_type()); + if (input()->element_type() == DataType::U8) + { + _q_alpha = static_cast(std::max( + std::numeric_limits::min(), + std::min(std::numeric_limits::max(), + std::round(input()->zero_point() + (params().alpha / input()->scale()))))); + double real_multiplier = input()->scale() * input()->scale() / output()->scale(); + quantizeMultiplierSmallerThanOneExp(real_multiplier, &_output_multiplier, &_output_shift); + } + output()->resize(input()->shape()); +} + +void LeakyRelu::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void LeakyRelu::evalFloat() const +{ + tflite::LeakyReluParams op_params{}; + op_params.alpha = params().alpha; + tflite::optimized_ops::LeakyRelu(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); +} + +void LeakyRelu::evalQuantized() const +{ + tflite::LeakyReluParams op_params{}; + op_params.input_offset = input()->zero_point(); + op_params.alpha_offset = input()->zero_point(); + op_params.output_offset = output()->zero_point(); + + op_params.output_multiplier = _output_multiplier; + op_params.output_shift = _output_shift; + + tflite::reference_ops::QuantizeLeakyRelu( + op_params, _q_alpha, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/LeakyRelu.h b/compiler/luci-interpreter/src/kernels/LeakyRelu.h new file mode 100644 index 0000000..dcc2be9 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LeakyRelu.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_LEAKYRELU_H +#define LUCI_INTERPRETER_KERNELS_LEAKYRELU_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class LeakyRelu : public KernelWithParams +{ +public: + LeakyRelu(const Tensor *input, Tensor *output, const LeakyReluParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + uint8_t _q_alpha = 0; + int32_t _output_multiplier = 0; + int _output_shift = 0; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_LEAKYRELU_H diff --git a/compiler/luci-interpreter/src/kernels/LeakyRelu.test.cpp b/compiler/luci-interpreter/src/kernels/LeakyRelu.test.cpp new file mode 100644 index 0000000..b0c06e7 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LeakyRelu.test.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/LeakyRelu.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(std::initializer_list input_shape, std::initializer_list output_shape, + std::initializer_list input_data, std::initializer_list output_data, float alpha, + DataType element_type) +{ + Tensor input_tensor{element_type, input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(T)); + + Tensor output_tensor = makeOutputTensor(element_type); + + LeakyReluParams params{}; + params.alpha = alpha; + + LeakyRelu kernel(&input_tensor, &output_tensor, params); + + kernel.configure(); + kernel.execute(); + + (void)output_shape; + EXPECT_THAT(extractTensorData(output_tensor), ::testing::ElementsAreArray(output_data)); +} + +TEST(LeakReluTest, FloatSimple) +{ + Check(/*input_shape=*/{2, 3}, /*output_shape=*/{2, 3}, /*input_data=*/ + { + 0.0f, 1.0f, 3.0f, // Row 1 + 1.0f, -1.0f, -2.0f, // Row 2 + }, + /*output_data=*/ + { + 0.0f, 1.0f, 3.0f, // Row 1 + 1.0f, -0.5f, -1.0f, // Row 2 + }, + /*alpha=*/0.5f, getElementType()); +} + +TEST(LeakReluTest, Uint8Simple) +{ + // TODO + // Implement GetDequantizedOutput Function. + // Create Test for Uint8 Case +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.cpp b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.cpp new file mode 100644 index 0000000..08efa1d --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/LocalResponseNormalization.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +LocalResponseNormalization::LocalResponseNormalization( + const Tensor *input, Tensor *output, const LocalResponseNormalizationParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void LocalResponseNormalization::configure() +{ + assert(input()->shape().num_dims() == 4); + assert(output()->element_type() == DataType::FLOAT32); + assert(input()->element_type() == output()->element_type()); + output()->resize(input()->shape()); +} + +void LocalResponseNormalization::execute() const +{ + switch (output()->element_type()) + { + case DataType::FLOAT32: + tflite::LocalResponseNormalizationParams op_params; + op_params.range = params().radius; + op_params.bias = params().bias; + op_params.alpha = params().alpha; + op_params.beta = params().beta; + tflite::optimized_ops::LocalResponseNormalization( + op_params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.h b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.h new file mode 100644 index 0000000..60408a1 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_LOCALRESPONSENORMALIZATION_H +#define LUCI_INTERPRETER_KERNELS_LOCALRESPONSENORMALIZATION_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class LocalResponseNormalization : public KernelWithParams +{ +public: + LocalResponseNormalization(const Tensor *input, Tensor *output, + const LocalResponseNormalizationParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_LOCALRESPONSENORMALIZATION_H diff --git a/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.test.cpp b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.test.cpp new file mode 100644 index 0000000..4191bdb --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/LocalResponseNormalization.test.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/LocalResponseNormalization.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(LocalResponseNormalizationTest, SameAsL2Norm) +{ + Tensor input_tensor = + makeInputTensor({1, 1, 1, 6}, {-1.1, 0.6, 0.7, 1.2, -0.7, 0.1}); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + LocalResponseNormalizationParams params{}; + params.radius = 20; + params.bias = 0.0; + params.alpha = 1.0; + params.beta = 0.5; + + LocalResponseNormalization kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({-0.55, 0.3, 0.35, 0.6, -0.35, 0.05}))); +} + +TEST(LocalResponseNormalizationTest, WithAlpha) +{ + Tensor input_tensor = + makeInputTensor({1, 1, 1, 6}, {-1.1, 0.6, 0.7, 1.2, -0.7, 0.1}); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + LocalResponseNormalizationParams params{}; + params.radius = 20; + params.bias = 0.0; + params.alpha = 4.0; + params.beta = 0.5; + + LocalResponseNormalization kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({-0.275, 0.15, 0.175, 0.3, -0.175, 0.025}))); +} + +TEST(LocalResponseNormalizationTest, WithBias) +{ + Tensor input_tensor = + makeInputTensor({1, 1, 1, 6}, {-1.1, 0.6, 0.7, 1.2, -0.7, 0.1}); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + LocalResponseNormalizationParams params{}; + params.radius = 20; + params.bias = 9.0; + params.alpha = 4.0; + params.beta = 0.5; + + LocalResponseNormalization kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear({-0.22, 0.12, 0.14, 0.24, -0.14, 0.02}))); +} + +TEST(LocalResponseNormalizationTest, SmallRadius) +{ + Tensor input_tensor = + makeInputTensor({1, 1, 1, 6}, {-1.1, 0.6, 0.7, 1.2, -0.7, 0.1}); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + LocalResponseNormalizationParams params{}; + params.radius = 2; + params.bias = 9.0; + params.alpha = 4.0; + params.beta = 0.5; + + LocalResponseNormalization kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray( + ArrayFloatNear({-0.264926, 0.125109, 0.140112, 0.267261, -0.161788, 0.0244266}))); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Logistic.cpp b/compiler/luci-interpreter/src/kernels/Logistic.cpp new file mode 100644 index 0000000..c7d4561 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Logistic.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Logistic.h" + +#include "kernels/Utils.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Logistic::Logistic(const Tensor *input, Tensor *output) : Kernel({input}, {output}) {} + +void Logistic::configure() +{ + assert(input()->element_type() == output()->element_type()); + if (input()->element_type() == DataType::U8) + { + assert(output()->scale() == 1. / 256); + populateLookupTable(); + } + output()->resize(input()->shape()); +} + +void Logistic::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Logistic::evalFloat() const +{ + tflite::reference_ops::Logistic(getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +void Logistic::evalQuantized() const +{ + const int size = tflite::MatchingFlatSize(getTensorShape(input()), getTensorShape(output())); + uint8_t *output_data = getTensorData(output()); + const uint8_t *input_data = getTensorData(input()); + for (int i = 0; i < size; ++i) + { + output_data[i] = getTableValue(input_data[i]); + } +} + +void Logistic::populateLookupTable() +{ + const auto input_scale = static_cast(input()->scale()); + const auto input_zero_point = static_cast(input()->zero_point()); + const auto output_scale = static_cast(output()->scale()); + const auto output_zero_point = static_cast(output()->zero_point()); + const float inverse_scale = 1 / output_scale; + int32_t maxval = std::numeric_limits::max(); + int32_t minval = std::numeric_limits::min(); + for (int32_t val = minval; val <= maxval; ++val) + { + const float dequantized = input_scale * (val - input_zero_point); + const float transformed = 1.0f / (1.0f + std::exp(-dequantized)); + const float rescaled = std::round(transformed * inverse_scale); + const int32_t quantized = static_cast(rescaled + output_zero_point); + setTableValue(static_cast(std::max(std::min(maxval, quantized), minval)), + static_cast(val)); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Logistic.h b/compiler/luci-interpreter/src/kernels/Logistic.h new file mode 100644 index 0000000..31de6ad --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Logistic.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_LOGISTIC_H +#define LUCI_INTERPRETER_KERNELS_LOGISTIC_H + +#include "core/Kernel.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Logistic : public Kernel +{ +public: + Logistic(const Tensor *input, Tensor *output); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + void populateLookupTable(); + void setTableValue(uint8_t value, uint8_t idx) { _table[idx] = value; }; + uint8_t getTableValue(uint8_t idx) const { return _table[idx]; }; + +private: + uint8_t _table[256]{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_LOGISTIC_H diff --git a/compiler/luci-interpreter/src/kernels/Logistic.test.cpp b/compiler/luci-interpreter/src/kernels/Logistic.test.cpp new file mode 100644 index 0000000..17456a4 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Logistic.test.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Logistic.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(LogisticTest, Float) +{ + Shape input_shape{1, 2, 4, 1}; + std::vector input_data{ + 0, -6, 2, 4, // + 3, -2, 10, 1, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Logistic kernel(&input_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 0.5, 0.002473, 0.880797, 0.982014, // + 0.952574, 0.119203, 0.999955, 0.731059, // + }; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + // TODO make a Shape checking of output_tensor. +} + +TEST(LogisticTest, Uint8) +{ + // Need to Implement GetDequantizedOutput Function. +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/MaxPool2D.cpp b/compiler/luci-interpreter/src/kernels/MaxPool2D.cpp new file mode 100644 index 0000000..afecf90 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/MaxPool2D.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/MaxPool2D.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +MaxPool2D::MaxPool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void MaxPool2D::configure() +{ + assert(input()->element_type() == output()->element_type()); + assert(input()->shape().num_dims() == 4); + const Shape &input_shape = input()->shape(); + const int32_t batches = input_shape.dim(0); + const int32_t input_height = input_shape.dim(1); + const int32_t input_width = input_shape.dim(2); + const int32_t depth = input_shape.dim(3); + + const int32_t output_height = computeOutputSize(_params.padding, input_height, + _params.filter_height, _params.stride_height); + const int32_t output_width = + computeOutputSize(_params.padding, input_width, _params.filter_width, _params.stride_width); + + _padding_height = + computePadding(_params.stride_height, 1, input_height, _params.filter_height, output_height); + _padding_width = + computePadding(_params.stride_width, 1, input_width, _params.filter_width, output_width); + + output()->resize({batches, output_height, output_width, depth}); + if (input()->element_type() == DataType::U8 || input()->element_type() == DataType::S8) + { + assert(input()->scale() == output()->scale()); + assert(input()->zero_point() == output()->zero_point()); + } +} + +void MaxPool2D::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void MaxPool2D::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::PoolParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.filter_height = _params.filter_height; + params.filter_width = _params.filter_width; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + tflite::reference_ops::MaxPool(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +void MaxPool2D::evalQuantized() const +{ + int32_t activation_min{}; + int32_t activation_max{}; + calculateActivationRangeQuantized(_params.activation, output(), &activation_min, &activation_max); + + tflite::PoolParams params{}; + params.padding_values.height = _padding_height; + params.padding_values.width = _padding_width; + params.stride_height = _params.stride_height; + params.stride_width = _params.stride_width; + params.filter_height = _params.filter_height; + params.filter_width = _params.filter_width; + params.quantized_activation_min = activation_min; + params.quantized_activation_max = activation_max; + + tflite::reference_ops::MaxPool(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/MaxPool2D.h b/compiler/luci-interpreter/src/kernels/MaxPool2D.h new file mode 100644 index 0000000..7a59ff0 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/MaxPool2D.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_MAXPOOL2D_H +#define LUCI_INTERPRETER_KERNELS_MAXPOOL2D_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class MaxPool2D : public KernelWithParams +{ +public: + MaxPool2D(const Tensor *input, Tensor *output, const Pool2DParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + int32_t _padding_height{}; + int32_t _padding_width{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_MAXPOOL2D_H diff --git a/compiler/luci-interpreter/src/kernels/MaxPool2D.test.cpp b/compiler/luci-interpreter/src/kernels/MaxPool2D.test.cpp new file mode 100644 index 0000000..390255d --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/MaxPool2D.test.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/MaxPool2D.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(MaxPool2DTest, Float) +{ + Shape input_shape{1, 3, 5, 1}; + std::vector input_data{ + 1, -1, 0, -2, 2, // + -7, -6, -5, -4, -3, // + 5, 4, 3, 6, 7, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.filter_height = 2; + params.filter_width = 3; + params.stride_height = 1; + params.stride_width = 2; + params.activation = Activation::RELU6; + + MaxPool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 1, 2, // + 5, 6, // + }; + std::initializer_list ref_output_shape{1, 2, 2, 1}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(MaxPool2DTest, Uint8) +{ + std::pair quant_param = quantizationParams(-15.9375, 15.9375); + std::vector input_data{ + 0, -6, 12, 4, // + -3, -2, 10, 7, // + }; + Tensor input_tensor{DataType::U8, {1, 2, 4, 1}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + std::vector quantize_input = + quantize(input_data, quant_param.first, quant_param.second); + input_tensor.writeData(quantize_input.data(), quantize_input.size() * sizeof(uint8_t)); + + Pool2DParams params{}; + params.padding = Padding::VALID; + params.filter_height = 2; + params.filter_width = 2; + params.stride_height = 2; + params.stride_width = 2; + params.activation = Activation::RELU6; + + MaxPool2D kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0.0, 6.0}; + std::initializer_list ref_output_shape{1, 1, 2, 1}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Mean.cpp b/compiler/luci-interpreter/src/kernels/Mean.cpp new file mode 100644 index 0000000..2394e2c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mean.cpp @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Mean.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +static void resolveAxes(const int *axes_data, int num_axes, tflite::MeanParams *params) +{ + params->axis_count = num_axes; + for (int i = 0; i < num_axes; ++i) + { + params->axis[i] = static_cast(axes_data[i]); + } + for (int i = num_axes; i < 4; ++i) + { + params->axis[i] = 1; + } +} + +// Returns the number of axes that will be reduced. Removes duplicates. +static int getAxisReductionCount(const int *axes_data, int num_axes, int input_num_dims) +{ + int reduction_count = num_axes; + for (int i = 0; i < num_axes; ++i) + { + int current = axes_data[i] >= 0 ? axes_data[i] : axes_data[i] + input_num_dims; + assert(current >= 0 && current < input_num_dims); + for (int j = 0; j < i; j++) + { + int previous = axes_data[j] >= 0 ? axes_data[j] : axes_data[j] + input_num_dims; + // This checks for duplicate axis + if (current == previous) + { + --reduction_count; + break; + } + } + } + return reduction_count; +} + +static Shape getOutputShape(const Shape &input_shape, const int *axes_data, int num_axes, + bool keep_dims) +{ + int input_num_dims = input_shape.num_dims(); + if (input_num_dims == 0) + { + return Shape(0); + } + + if (keep_dims) + { + Shape output_shape(input_num_dims); + for (int idx = 0; idx < input_num_dims; ++idx) + { + bool is_axis = false; + for (int axis_idx = 0; axis_idx < num_axes; ++axis_idx) + { + if (axes_data[axis_idx] == idx || axes_data[axis_idx] + input_num_dims == idx) + { + is_axis = true; + break; + } + } + if (is_axis) + { + output_shape.dim(idx) = 1; + } + else + { + output_shape.dim(idx) = input_shape.dim(idx); + } + } + return output_shape; + } + else + { + int num_reduce_axes = getAxisReductionCount(axes_data, num_axes, input_num_dims); + Shape output_shape(input_num_dims - num_reduce_axes); + int num_skip_axes = 0; + for (int idx = 0; idx < input_num_dims; ++idx) + { + bool is_axis = false; + for (int axis_idx = 0; axis_idx < num_axes; ++axis_idx) + { + if (axes_data[axis_idx] == idx || axes_data[axis_idx] + input_num_dims == idx) + { + ++num_skip_axes; + is_axis = true; + break; + } + } + if (!is_axis) + { + output_shape.dim(idx - num_skip_axes) = input_shape.dim(idx); + } + } + return output_shape; + } +} + +Mean::Mean(const Tensor *input, const Tensor *axes, Tensor *output, const ReducerParams ¶ms) + : KernelWithParams({input, axes}, {output}, params) +{ +} + +void Mean::configure() +{ + assert(input()->element_type() == output()->element_type()); + assert(axes()->element_type() == DataType::S32); + const Shape &input_shape = input()->shape(); + int input_num_dims = input_shape.num_dims(); + + const auto *axes_data = getTensorData(axes()); + int num_axes = axes()->shape().num_elements(); + assert(num_axes <= 4); + + Shape output_shape = getOutputShape(input_shape, axes_data, num_axes, _params.keep_dims); + output()->resize(output_shape); + + tflite::MeanParams params{}; + resolveAxes(axes_data, num_axes, ¶ms); + const bool need_temporaries = + !(_params.keep_dims && input_num_dims == 4 && params.axis_count == 2 && + ((params.axis[0] == 1 && params.axis[1] == 2) || + (params.axis[0] == 2 && params.axis[1] == 1))); + if (need_temporaries) + { + _temp_index = + std::make_unique(DataType::S32, Shape(input_num_dims), AffineQuantization{}, ""); + _resolved_axes = + std::make_unique(DataType::S32, Shape(num_axes), AffineQuantization{}, ""); + _temp_sum = std::make_unique(input()->element_type(), output()->shape(), + AffineQuantization{}, ""); + } +} + +void Mean::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Mean::evalFloat() const +{ + const Shape &input_shape = input()->shape(); + int input_num_dims = input_shape.num_dims(); + const auto *axes_data = getTensorData(axes()); + int num_axes = axes()->shape().num_elements(); + + tflite::MeanParams params{}; + resolveAxes(axes_data, num_axes, ¶ms); + + // Defer to specialized implementation for 4D Mean across axes 1 & 2. + if (_params.keep_dims && input_num_dims == 4 && params.axis_count == 2 && + ((params.axis[0] == 1 && params.axis[1] == 2) || + (params.axis[0] == 2 && params.axis[1] == 1))) + { + tflite::reference_ops::Mean(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); + } + else + { + tflite::reference_ops::Mean( + getTensorData(input()), getTensorShape(input()).DimsData(), + input()->shape().num_dims(), getTensorData(output()), + getTensorShape(output()).DimsData(), output()->shape().num_dims(), axes_data, num_axes, + _params.keep_dims, getTensorData(_temp_index.get()), + getTensorData(_resolved_axes.get()), getTensorData(_temp_sum.get())); + } +} + +void Mean::evalQuantized() const +{ + const Shape &input_shape = input()->shape(); + int input_num_dims = input_shape.num_dims(); + const auto *axes_data = getTensorData(axes()); + int num_axes = axes()->shape().num_elements(); + + tflite::MeanParams params{}; + resolveAxes(axes_data, num_axes, ¶ms); + + // Defer to specialized implementation for 4D Mean across axes 1 & 2. + if (_params.keep_dims && input_num_dims == 4 && params.axis_count == 2 && + ((params.axis[0] == 1 && params.axis[1] == 2) || + (params.axis[0] == 2 && params.axis[1] == 1))) + { + tflite::reference_ops::Mean(params, getTensorShape(input()), getTensorData(input()), + input()->zero_point(), input()->scale(), getTensorShape(output()), + getTensorData(output()), output()->zero_point(), + output()->scale()); + } + else if (input()->zero_point() == output()->zero_point() && input()->scale() == output()->scale()) + { + tflite::reference_ops::Mean( + getTensorData(input()), getTensorShape(input()).DimsData(), + input()->shape().num_dims(), getTensorData(output()), + getTensorShape(output()).DimsData(), output()->shape().num_dims(), axes_data, num_axes, + _params.keep_dims, getTensorData(_temp_index.get()), + getTensorData(_resolved_axes.get()), getTensorData(_temp_sum.get())); + } + else + { + tflite::reference_ops::QuantizedMeanOrSum<>( + getTensorData(input()), input()->zero_point(), input()->scale(), + getTensorShape(input()).DimsData(), input()->shape().num_dims(), + getTensorData(output()), output()->zero_point(), output()->scale(), + getTensorShape(output()).DimsData(), output()->shape().num_dims(), axes_data, num_axes, + _params.keep_dims, getTensorData(_temp_index.get()), + getTensorData(_resolved_axes.get()), getTensorData(_temp_sum.get()), + /*compute_sum=*/false); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Mean.h b/compiler/luci-interpreter/src/kernels/Mean.h new file mode 100644 index 0000000..9cc793c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mean.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_MEAN_H +#define LUCI_INTERPRETER_KERNELS_MEAN_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +class Mean : public KernelWithParams +{ +public: + Mean(const Tensor *input, const Tensor *axes, Tensor *output, const ReducerParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *axes() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + std::unique_ptr _temp_index; + std::unique_ptr _resolved_axes; + std::unique_ptr _temp_sum; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_MEAN_H diff --git a/compiler/luci-interpreter/src/kernels/Mean.test.cpp b/compiler/luci-interpreter/src/kernels/Mean.test.cpp new file mode 100644 index 0000000..f4e411c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mean.test.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Mean.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(MeanTest, FloatKeepDims) +{ + std::vector input_data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}; + + std::vector axis_data{0, 2}; + Tensor input_tensor = makeInputTensor({4, 3, 2}, input_data); + Tensor axis_tensor = makeInputTensor({2}, axis_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + ReducerParams params{}; + params.keep_dims = true; + + Mean kernel(&input_tensor, &axis_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{10.5, 12.5, 14.5}; + std::initializer_list ref_output_shape{1, 3, 1}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(MeanTest, FloatKeepDims4DMean) +{ + std::vector input_data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}; + + std::vector axis_data{1, 2}; + Tensor input_tensor = makeInputTensor({2, 2, 3, 2}, input_data); + Tensor axis_tensor = makeInputTensor({2}, axis_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + ReducerParams params{}; + params.keep_dims = true; + + Mean kernel(&input_tensor, &axis_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{6, 7, 18, 19}; + std::initializer_list ref_output_shape{2, 1, 1, 2}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(MeanTest, FloatNotKeepDims) +{ + std::vector input_data = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, + 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0}; + + std::vector axis_data{1, 0, -3, -3}; + Tensor input_tensor = makeInputTensor({4, 3, 2}, input_data); + Tensor axis_tensor = makeInputTensor({4}, axis_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + ReducerParams params{}; + params.keep_dims = false; + + Mean kernel(&input_tensor, &axis_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{12, 13}; + std::initializer_list ref_output_shape{2}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(MeanTest, Uint8KeepDims) +{ + float kQuantizedTolerance = getTolerance(-1.0, 1.0, 255); + std::vector input_data = {0.4, 0.2, 0.3, 0.4, 0.5, 0.6}; + std::pair quant_param = quantizationParams(-1.0f, 1.0f); + + std::vector axis_data{1}; + Tensor input_tensor{DataType::U8, {3, 2}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor axis_tensor = makeInputTensor({1}, axis_data); + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + std::vector quantize_input = + quantize(input_data, quant_param.first, quant_param.second); + input_tensor.writeData(quantize_input.data(), quantize_input.size() * sizeof(uint8_t)); + + ReducerParams params{}; + params.keep_dims = true; + + Mean kernel(&input_tensor, &axis_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0.3, 0.35, 0.55}; + std::initializer_list ref_output_shape{3, 1}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(ref_output_data, kQuantizedTolerance))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +TEST(MeanTest, Uint8NotKeepDims) +{ + float kQuantizedTolerance = getTolerance(-1.0, 1.0, 255); + std::vector input_data = {0.4, 0.2, 0.3, 0.4, 0.5, 0.6}; + std::pair quant_param = quantizationParams(-1.0f, 1.0f); + + std::vector axis_data{1}; + Tensor input_tensor{DataType::U8, {1, 3, 2}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor axis_tensor = makeInputTensor({1}, axis_data); + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + std::vector quantize_input = + quantize(input_data, quant_param.first, quant_param.second); + input_tensor.writeData(quantize_input.data(), quantize_input.size() * sizeof(uint8_t)); + + ReducerParams params{}; + params.keep_dims = false; + + Mean kernel(&input_tensor, &axis_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0.4, 0.4}; + std::initializer_list ref_output_shape{1, 2}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(ref_output_data, kQuantizedTolerance))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Mul.cpp b/compiler/luci-interpreter/src/kernels/Mul.cpp new file mode 100644 index 0000000..a6e721a --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mul.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Mul.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Mul::Mul(const Tensor *input1, const Tensor *input2, Tensor *output, const MulParams ¶ms) + : KernelWithParams({input1, input2}, {output}, params) +{ +} + +void Mul::configure() +{ + assert(input1()->element_type() == input2()->element_type()); + output()->resize(calculateShapeForBroadcast(input1()->shape(), input2()->shape())); +} + +void Mul::execute() const +{ + switch (input1()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Mul::evalFloat() const +{ + float activation_min{}; + float activation_max{}; + calculateActivationRange(_params.activation, &activation_min, &activation_max); + + tflite::ArithmeticParams params{}; + params.float_activation_min = activation_min; + params.float_activation_max = activation_max; + + const bool need_broadcast = tflite::reference_ops::ProcessBroadcastShapes( + getTensorShape(input1()), getTensorShape(input2()), ¶ms); + + if (need_broadcast) + { + tflite::reference_ops::BroadcastMul4DSlow( + params, getTensorShape(input1()), getTensorData(input1()), getTensorShape(input2()), + getTensorData(input2()), getTensorShape(output()), getTensorData(output())); + } + else + { + tflite::reference_ops::Mul(params, getTensorShape(input1()), getTensorData(input1()), + getTensorShape(input2()), getTensorData(input2()), + getTensorShape(output()), getTensorData(output())); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Mul.h b/compiler/luci-interpreter/src/kernels/Mul.h new file mode 100644 index 0000000..e46160b --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mul.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_MUL_H +#define LUCI_INTERPRETER_KERNELS_MUL_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +#include +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +class Mul : public KernelWithParams +{ +public: + Mul(const Tensor *input1, const Tensor *input2, Tensor *output, const MulParams ¶ms); + + const Tensor *input1() const { return _inputs[0]; } + const Tensor *input2() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_MUL_H diff --git a/compiler/luci-interpreter/src/kernels/Mul.test.cpp b/compiler/luci-interpreter/src/kernels/Mul.test.cpp new file mode 100644 index 0000000..f2255ac --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Mul.test.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Mul.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(MulTest, Float) +{ + Shape base_shape = {2, 3, 1, 2}; + std::vector test_shapes{{1, 1, 3, 2}, {1, 3, 1, 2}, {2, 1, 3, 1}, {2, 3, 1, 1}}; + std::vector> test_outputs = { + {0.00f, 0.69f, 0.12f, 1.15f, 0.00f, 2.07f, 0.18f, 0.15f, 0.00f, 0.25f, 0.90f, 0.45f, + 0.16f, 0.00f, 0.00f, 0.00f, 0.80f, 0.00f, 0.24f, 0.84f, 0.00f, 1.40f, 1.20f, 2.52f, + 0.00f, 0.00f, 0.64f, 0.00f, 0.00f, 0.00f, 0.14f, 0.00f, 0.00f, 0.00f, 0.70f, 0.00f}, + {0.00f, 0.69f, 0.00f, 0.25f, 0.80f, 0.00f, 0.24f, 0.84f, 0.64f, 0.00f, 0.70f, 0.00f}, + {0.00f, 0.46f, 0.00f, 0.69f, 0.12f, 0.00f, 0.18f, 0.10f, 0.27f, 0.15f, 0.00f, 0.00f, + 0.16f, 0.00f, 0.24f, 0.00f, 0.00f, 0.44f, 0.60f, 1.40f, 1.20f, 2.80f, 1.08f, 2.52f, + 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.00f, 0.35f, 0.00f, 0.70f, 0.00f, 0.63f, 0.00f}, + {0.00f, 0.46f, 0.27f, 0.15f, 0.00f, 0.44f, 0.60f, 1.40f, 0.00f, 0.00f, 0.63f, 0.00f}}; + std::vector input1_data{-0.3f, 2.3f, 0.9f, 0.5f, 0.8f, -1.1f, + 1.2f, 2.8f, -1.6f, 0.0f, 0.7f, -2.2f}; + std::vector input2_data{0.2f, 0.3f, -0.4f, 0.5f, 1.0f, 0.9f}; + for (size_t i = 0; i < test_shapes.size(); ++i) + { + Tensor input1_tensor = makeInputTensor(base_shape, input1_data); + Tensor input2_tensor = makeInputTensor(test_shapes[i], input2_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + MulParams params{}; + params.activation = Activation::RELU; + + Mul kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(ArrayFloatNear(test_outputs[i], 0.0001f))) + << "With shape number " << i; + } + // Re-run with exchanged inputs. + for (size_t i = 0; i < test_shapes.size(); ++i) + { + Tensor input1_tensor = makeInputTensor(test_shapes[i], input2_data); + Tensor input2_tensor = makeInputTensor(base_shape, input1_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + MulParams params{}; + params.activation = Activation::RELU; + + Mul kernel(&input1_tensor, &input2_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(ArrayFloatNear(test_outputs[i], 0.0001f))) + << "With shape number " << i; + } +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Pad.cpp b/compiler/luci-interpreter/src/kernels/Pad.cpp new file mode 100644 index 0000000..bdf3a2a --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Pad.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Pad.h" + +#include "kernels/Utils.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Pad::Pad(const Tensor *input, const Tensor *paddings, Tensor *output) + : Kernel({input, paddings}, {output}) +{ +} + +void Pad::configure() +{ + const Shape &input_shape = input()->shape(); + const int num_dims = input_shape.num_dims(); + + if (num_dims > 4) + throw std::runtime_error("Unsupported number of dimensions."); + + assert(output()->element_type() == input()->element_type()); + assert(paddings()->element_type() == DataType::S32); + // Paddings shape should be [N, 2]. + assert(paddings()->shape().num_dims() == 2); + assert(paddings()->shape().dim(0) == num_dims); + assert(paddings()->shape().dim(1) == 2); + + Shape output_shape(num_dims); + const auto *paddings_data = getTensorData(paddings()); + for (int i = 0; i < num_dims; ++i) + { + const int32_t padding_before = paddings_data[i * 2]; + const int32_t padding_after = paddings_data[i * 2 + 1]; + assert(padding_before >= 0 && padding_after >= 0); + output_shape.dim(i) = input_shape.dim(i) + padding_before + padding_after; + } + + output()->resize(output_shape); +} + +void Pad::execute() const +{ + const int num_dims = input()->shape().num_dims(); + + tflite::PadParams params{}; + params.left_padding_count = num_dims; + params.right_padding_count = num_dims; + + const auto *paddings_data = getTensorData(paddings()); + for (int i = num_dims - 1; i >= 0; --i) + { + params.left_padding[i] = paddings_data[i * 2]; + params.right_padding[i] = paddings_data[i * 2 + 1]; + } + + switch (input()->element_type()) + { + case DataType::FLOAT32: + { + const float pad_value = 0.0f; + tflite::reference_ops::Pad(params, getTensorShape(input()), getTensorData(input()), + &pad_value, getTensorShape(output()), + getTensorData(output())); + break; + } + case DataType::U8: + { + assert(output()->zero_point() >= std::numeric_limits::min()); + assert(output()->zero_point() <= std::numeric_limits::max()); + const auto pad_value = static_cast(output()->zero_point()); + tflite::reference_ops::Pad(params, getTensorShape(input()), getTensorData(input()), + &pad_value, getTensorShape(output()), + getTensorData(output())); + break; + } + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Pad.h b/compiler/luci-interpreter/src/kernels/Pad.h new file mode 100644 index 0000000..e05b47f --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Pad.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_PAD_H +#define LUCI_INTERPRETER_KERNELS_PAD_H + +#include "core/Kernel.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Pad : public Kernel +{ +public: + Pad(const Tensor *input, const Tensor *paddings, Tensor *output); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *paddings() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_PAD_H diff --git a/compiler/luci-interpreter/src/kernels/Pad.test.cpp b/compiler/luci-interpreter/src/kernels/Pad.test.cpp new file mode 100644 index 0000000..15fcd0d --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Pad.test.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Pad.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +float GetTolerance(float min, float max) { return (max - min) / 255.0; } + +TEST(Pad, Uint8) +{ + float kQuantizedTolerance = GetTolerance(-1.0, 1.0); + std::pair quant_param = quantizationParams(-1.0f, 1.0f); + std::vector input_data{-0.8, 0.2, 0.9, 0.7, 0.1, -0.3}; + std::vector paddings_data{0, 0, 0, 2, 1, 3, 0, 0}; + Tensor input_tensor{DataType::U8, {1, 2, 3, 1}, {{quant_param.first}, {quant_param.second}}, ""}; + Tensor paddings_tensor = makeInputTensor({4, 2}, paddings_data); + Tensor output_tensor = makeOutputTensor(DataType::U8, quant_param.first, quant_param.second); + std::vector quantize_input = + quantize(input_data, quant_param.first, quant_param.second); + input_tensor.writeData(quantize_input.data(), quantize_input.size() * sizeof(uint8_t)); + + Pad kernel(&input_tensor, &paddings_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0, -0.8, 0.2, 0.9, 0, 0, 0, 0, 0.7, 0.1, -0.3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(ref_output_data, kQuantizedTolerance))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray({1, 4, 7, 1})); +} + +TEST(Pad, Float) +{ + std::vector input_data{1, 2, 3, 4, 5, 6}; + std::vector paddings_data{1, 0, 0, 2, 0, 3, 0, 0}; + Tensor input_tensor = makeInputTensor({1, 2, 3, 1}, input_data); + Tensor paddings_tensor = makeInputTensor({4, 2}, paddings_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Pad kernel(&input_tensor, &paddings_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 4, 5, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + std::initializer_list ref_output_shape{2, 4, 6, 1}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Reshape.cpp b/compiler/luci-interpreter/src/kernels/Reshape.cpp new file mode 100644 index 0000000..d88b539 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Reshape.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Reshape.h" + +#include +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +static Shape extractShapeFromTensor(const Tensor *tensor) +{ + assert(tensor->element_type() == DataType::S32); + Shape shape(tensor->shape().num_elements()); + const auto *shape_data = tensor->data(); + for (int i = 0; i < tensor->shape().num_elements(); ++i) + { + shape.dim(i) = shape_data[i]; + } + return shape; +} + +static void resolveUnknownDimension(const Shape &input_shape, Shape *output_shape) +{ + const int32_t num_input_elements = input_shape.num_elements(); + int32_t num_output_elements = 1; + int unknown_dim_index = -1; + for (int i = 0; i < output_shape->num_dims(); ++i) + { + const int32_t value = output_shape->dim(i); + if (value == -1) + { + assert(unknown_dim_index == -1); + unknown_dim_index = i; + } + else + { + num_output_elements *= value; + } + } + if (unknown_dim_index != -1) + { + output_shape->dim(unknown_dim_index) = num_input_elements / num_output_elements; + num_output_elements *= output_shape->dim(unknown_dim_index); + } + assert(num_output_elements == num_input_elements); +} + +Reshape::Reshape(const Tensor *input, const Tensor *shape, Tensor *output) + : Kernel({input, shape}, {output}) +{ +} + +void Reshape::configure() +{ + Shape output_shape = extractShapeFromTensor(shape()); + resolveUnknownDimension(input()->shape(), &output_shape); + output()->resize(output_shape); +} + +void Reshape::execute() const +{ + const auto *input_data = input()->data(); + auto *output_data = output()->data(); + + const size_t element_size = getDataTypeSize(input()->element_type()); + const int32_t num_elements = input()->shape().num_elements(); + std::memcpy(output_data, input_data, num_elements * element_size); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Reshape.h b/compiler/luci-interpreter/src/kernels/Reshape.h new file mode 100644 index 0000000..99b947f --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Reshape.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_RESHAPE_H +#define LUCI_INTERPRETER_KERNELS_RESHAPE_H + +#include "core/Kernel.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Reshape : public Kernel +{ +public: + Reshape(const Tensor *input, const Tensor *shape, Tensor *output); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *shape() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_RESHAPE_H diff --git a/compiler/luci-interpreter/src/kernels/Reshape.test.cpp b/compiler/luci-interpreter/src/kernels/Reshape.test.cpp new file mode 100644 index 0000000..7255b81 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Reshape.test.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Reshape.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +// TODO Test types other than FLOAT32. + +TEST(ReshapeTest, Regular) +{ + Shape input_shape{1, 2, 2, 3}; + std::vector input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + Shape shape_shape{2}; + std::vector shape_data{3, 4}; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor shape_tensor = makeInputTensor(shape_shape, shape_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Reshape kernel(&input_tensor, &shape_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(input_data))); +} + +TEST(ReshapeTest, UnknownDimension) +{ + Shape input_shape{2, 1, 2, 3}; + std::vector input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + Shape shape_shape{3}; + std::vector shape_data{2, -1, 2}; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor shape_tensor = makeInputTensor(shape_shape, shape_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + Reshape kernel(&input_tensor, &shape_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(input_data))); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Softmax.cpp b/compiler/luci-interpreter/src/kernels/Softmax.cpp new file mode 100644 index 0000000..2fb7f3f --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Softmax.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Softmax.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +Softmax::Softmax(const Tensor *input, Tensor *output, const SoftmaxParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void Softmax::configure() +{ + assert(input()->element_type() == output()->element_type()); + output()->resize(input()->shape()); +} + +void Softmax::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void Softmax::evalFloat() const +{ + tflite::SoftmaxParams params{}; + params.beta = _params.beta; + + tflite::reference_ops::Softmax(params, getTensorShape(input()), getTensorData(input()), + getTensorShape(output()), getTensorData(output())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Softmax.h b/compiler/luci-interpreter/src/kernels/Softmax.h new file mode 100644 index 0000000..2e4eda4 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Softmax.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_SOFTMAX_H +#define LUCI_INTERPRETER_KERNELS_SOFTMAX_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Softmax : public KernelWithParams +{ +public: + Softmax(const Tensor *input, Tensor *output, const SoftmaxParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_SOFTMAX_H diff --git a/compiler/luci-interpreter/src/kernels/Softmax.test.cpp b/compiler/luci-interpreter/src/kernels/Softmax.test.cpp new file mode 100644 index 0000000..2193c3e --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Softmax.test.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Softmax.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(SoftmaxTest, Float) +{ + Shape input_shape{2, 1, 2, 3}; + std::vector input_data{ + 5, -9, 8, // + -7, 2, -4, // + 1, -2, 9, // + 3, -6, -1, // + }; + Tensor input_tensor = makeInputTensor(input_shape, input_data); + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + SoftmaxParams params{}; + params.beta = 0.1; + + Softmax kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + std::vector ref_output_data{ + 0.38514, 0.09497, 0.51989, // + 0.20792, 0.51141, 0.28067, // + 0.25212, 0.18678, 0.56110, // + 0.48149, 0.19576, 0.32275, // + }; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(ref_output_data))); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/SpaceToDepth.cpp b/compiler/luci-interpreter/src/kernels/SpaceToDepth.cpp new file mode 100644 index 0000000..6a5bd7c --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/SpaceToDepth.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToDepth.h" +#include "Utils.h" +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +SpaceToDepth::SpaceToDepth(const Tensor *input, Tensor *output, const SpaceToDepthParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void SpaceToDepth::configure() +{ + assert(input()->shape().num_dims() == 4); + assert(output()->element_type() == DataType::FLOAT32 || + output()->element_type() == DataType::U8 || output()->element_type() == DataType::S8 || + output()->element_type() == DataType::S32 || output()->element_type() == DataType::S64); + assert(input()->element_type() == output()->element_type()); + + const int block_size = params().block_size; + const int32_t input_height = input()->shape().dim(1); + const int32_t input_width = input()->shape().dim(2); + int32_t output_height = input_height / block_size; + int32_t output_width = input_width / block_size; + + assert(input_height == output_height * block_size); + assert(input_width == output_width * block_size); + + Shape output_shape(4); + output_shape.dim(0) = input()->shape().dim(0); + output_shape.dim(1) = output_height; + output_shape.dim(2) = output_width; + output_shape.dim(3) = input()->shape().dim(3) * block_size * block_size; + + output()->resize(output_shape); +} + +void SpaceToDepth::execute() const +{ + tflite::SpaceToDepthParams op_params{}; + op_params.block_size = params().block_size; + switch (input()->element_type()) + { + case DataType::FLOAT32: + tflite::optimized_ops::SpaceToDepth(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + case DataType::U8: + tflite::optimized_ops::SpaceToDepth(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/SpaceToDepth.h b/compiler/luci-interpreter/src/kernels/SpaceToDepth.h new file mode 100644 index 0000000..e66316b --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/SpaceToDepth.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_SPACETODEPTH_H +#define LUCI_INTERPRETER_KERNELS_SPACETODEPTH_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +class SpaceToDepth : public KernelWithParams +{ +public: + SpaceToDepth(const Tensor *input, Tensor *output, const SpaceToDepthParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_SPACETODEPTH_H diff --git a/compiler/luci-interpreter/src/kernels/SpaceToDepth.test.cpp b/compiler/luci-interpreter/src/kernels/SpaceToDepth.test.cpp new file mode 100644 index 0000000..e4a0fd6 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/SpaceToDepth.test.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/SpaceToDepth.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template class SpaceToDepthTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(SpaceToDepthTest, DataTypes); + +TYPED_TEST(SpaceToDepthTest, SimpleCase) +{ + std::vector input_data{1, 5, 6, 7, 2, 3, 4, 8}; + Shape input_shape{1, 2, 2, 2}; + Tensor input_tensor{getElementType(), input_shape, {{}, {}}, ""}; + input_tensor.writeData(input_data.data(), input_data.size() * sizeof(TypeParam)); + std::vector output_data{1, 5, 6, 7, 2, 3, 4, 8}; + std::vector output_shape{1, 1, 1, 8}; + Tensor output_tensor = makeOutputTensor(getElementType()); + + SpaceToDepthParams params{}; + params.block_size = 2; + + SpaceToDepth kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), + ::testing::ElementsAreArray(output_data)); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Split.cpp b/compiler/luci-interpreter/src/kernels/Split.cpp new file mode 100644 index 0000000..325b1c2 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Split.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Split.h" + +#include "Utils.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Split::Split(const Tensor *axis, const Tensor *input, std::vector outputs) + : Kernel({axis, input}, std::move(outputs)) +{ +} + +void Split::configure() +{ + assert(axis()->shape().num_elements() == 1); + _axis_value = getTensorData(axis())[0]; + if (_axis_value < 0) + _axis_value += input()->shape().num_dims(); + assert(_axis_value >= 0 && _axis_value < input()->shape().num_dims()); + + const int32_t input_size = input()->shape().dim(_axis_value); + assert(input_size % _outputs.size() == 0); + const int32_t slice_size = input_size / _outputs.size(); + + Shape output_shape = input()->shape(); + output_shape.dim(_axis_value) = slice_size; + for (Tensor *output : _outputs) + { + output->resize(output_shape); + } +} + +void Split::execute() const +{ + tflite::SplitParams params{}; + params.num_split = _outputs.size(); + params.axis = _axis_value; + +#define TF_LITE_SPLIT(scalar) \ + { \ + VectorOfTensors all_outputs(_outputs); \ + tflite::optimized_ops::Split(params, getTensorShape(input()), getTensorData(input()), \ + all_outputs.shapes(), all_outputs.data()); \ + } + + switch (input()->element_type()) + { + case DataType::FLOAT32: + TF_LITE_SPLIT(float); + break; + case DataType::U8: + TF_LITE_SPLIT(uint8_t); + break; + default: + throw std::runtime_error("Unsupported type."); + } +#undef TF_LITE_SPLIT +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Split.h b/compiler/luci-interpreter/src/kernels/Split.h new file mode 100644 index 0000000..9542b1e --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Split.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_SPLIT_H +#define LUCI_INTERPRETER_KERNELS_SPLIT_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Split : public Kernel +{ +public: + Split(const Tensor *axis, const Tensor *input, std::vector outputs); + + const Tensor *axis() const { return _inputs[0]; } + const Tensor *input() const { return _inputs[1]; } + Tensor *output(int index) const { return _outputs[index]; } + + void configure() override; + void execute() const override; + +private: + int32_t _axis_value{}; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_SPLIT_H diff --git a/compiler/luci-interpreter/src/kernels/Split.test.cpp b/compiler/luci-interpreter/src/kernels/Split.test.cpp new file mode 100644 index 0000000..11d0b1e --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Split.test.cpp @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Split.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(int axis, int num_splits, std::initializer_list input_shape, + std::initializer_list output_shape, std::initializer_list input_data, + std::vector> output_data, DataType element_type) +{ + Tensor axis_tensor = makeInputTensor({}, {axis}); + Tensor input_tensor{element_type, input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(T)); + + std::vector output_tensors; + output_tensors.reserve(num_splits); + for (int i = 0; i < num_splits; ++i) + { + output_tensors.emplace_back(makeOutputTensor(element_type)); + } + + std::vector output_tensor_ptrs(num_splits); + for (int i = 0; i < num_splits; ++i) + { + output_tensor_ptrs[i] = &output_tensors[i]; + } + + Split kernel(&axis_tensor, &input_tensor, std::move(output_tensor_ptrs)); + kernel.configure(); + kernel.execute(); + + for (int i = 0; i < num_splits; ++i) + { + EXPECT_THAT(extractTensorData(output_tensors[i]), + ::testing::ElementsAreArray(output_data[i])); + } +} + +template class SplitTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(SplitTest, DataTypes); + +TYPED_TEST(SplitTest, FourDimensional) +{ + Check(/*axis=*/0, /*num_splits=*/2, {2, 2, 2, 2}, {1, 2, 2, 2}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + { + {1, 2, 3, 4, 5, 6, 7, 8}, // + {9, 10, 11, 12, 13, 14, 15, 16}, // + }, + getElementType()); + Check( + /*axis=*/1, /*num_splits=*/2, {2, 2, 2, 2}, {2, 1, 2, 2}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + { + {1, 2, 3, 4, 9, 10, 11, 12}, // + {5, 6, 7, 8, 13, 14, 15, 16}, // + }, + getElementType()); + Check( + /*axis=*/2, /*num_splits=*/2, {2, 2, 2, 2}, {2, 2, 1, 2}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + { + {1, 2, 5, 6, 9, 10, 13, 14}, // + {3, 4, 7, 8, 11, 12, 15, 16}, // + }, + getElementType()); + Check( + /*axis=*/3, /*num_splits=*/2, {2, 2, 2, 2}, {2, 2, 2, 1}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + { + {1, 3, 5, 7, 9, 11, 13, 15}, // + {2, 4, 6, 8, 10, 12, 14, 16}, // + }, + getElementType()); +} + +TYPED_TEST(SplitTest, OneDimensional) +{ + Check( + /*axis=*/0, /*num_splits=*/8, {8}, {1}, {1, 2, 3, 4, 5, 6, 7, 8}, + {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}}, getElementType()); +} + +TYPED_TEST(SplitTest, NegativeAxis) +{ + Check( + /*axis=*/-4, /*num_splits=*/2, {2, 2, 2, 2}, {1, 2, 2, 2}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + { + {1, 2, 3, 4, 5, 6, 7, 8}, // + {9, 10, 11, 12, 13, 14, 15, 16}, + }, + getElementType()); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Squeeze.cpp b/compiler/luci-interpreter/src/kernels/Squeeze.cpp new file mode 100644 index 0000000..ce43ef7 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Squeeze.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Squeeze.h" + +#include "kernels/Utils.h" + +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +Squeeze::Squeeze(const Tensor *input, Tensor *output, const SqueezeParams ¶ms) + : KernelWithParams({input}, {output}, params) +{ +} + +void Squeeze::configure() +{ + int input_num_dims = input()->shape().num_dims(); + int num_squeeze_dims = params().squeeze_dims.size(); + assert(input_num_dims <= 8); + bool should_squeeze[8] = {false}; + int num_squeezed_dims = 0; + if (num_squeeze_dims == 0) + { + for (int idx = 0; idx < input_num_dims; ++idx) + { + if (input()->shape().dim(idx) == 1) + { + should_squeeze[idx] = true; + ++num_squeezed_dims; + } + } + } + else + { + for (int idx = 0; idx < num_squeeze_dims; ++idx) + { + int current = params().squeeze_dims[idx] < 0 ? params().squeeze_dims[idx] + input_num_dims + : params().squeeze_dims[idx]; + assert(current >= 0 && current < input_num_dims && input()->shape().dim(current) == 1); + if (!should_squeeze[current]) + ++num_squeezed_dims; + should_squeeze[current] = true; + } + } + Shape output_shape(input_num_dims - num_squeezed_dims); + for (int in_idx = 0, out_idx = 0; in_idx < input_num_dims; ++in_idx) + { + if (!should_squeeze[in_idx]) + { + output_shape.dim(out_idx++) = input()->shape().dim(in_idx); + } + } + output()->resize(output_shape); +} + +void Squeeze::execute() const +{ + assert(input()->shape().num_elements() == output()->shape().num_elements()); + + const auto *input_data = input()->data(); + auto *output_data = output()->data(); + std::memcpy(output_data, input_data, + getDataTypeSize(input()->element_type()) * input()->shape().num_elements()); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Squeeze.h b/compiler/luci-interpreter/src/kernels/Squeeze.h new file mode 100644 index 0000000..687af51 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Squeeze.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_SQUEEZE_H +#define LUCI_INTERPRETER_KERNELS_SQUEEZE_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Squeeze : public KernelWithParams +{ +public: + Squeeze(const Tensor *input, Tensor *output, const SqueezeParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_SQUEEZE_H diff --git a/compiler/luci-interpreter/src/kernels/Squeeze.test.cpp b/compiler/luci-interpreter/src/kernels/Squeeze.test.cpp new file mode 100644 index 0000000..3a34284 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Squeeze.test.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Squeeze.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(std::initializer_list input_shape, std::initializer_list output_shape, + std::initializer_list input_data, std::initializer_list output_data, + DataType element_type, std::vector squeeze_dims) +{ + Tensor input_tensor{element_type, input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(T)); + Tensor output_tensor = makeOutputTensor(element_type); + + SqueezeParams params{}; + for (size_t i = 0; i < squeeze_dims.size(); i++) + { + params.squeeze_dims.push_back(squeeze_dims.at(i)); + } + + Squeeze kernel(&input_tensor, &output_tensor, params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), ::testing::ElementsAreArray(output_data)); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape)); +} + +template class SqueezeTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(SqueezeTest, DataTypes); + +TYPED_TEST(SqueezeTest, TotalTest) +{ + Check( + /*input_shape=*/{1, 24, 1}, /*output_shape=*/{24}, + /*input_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}, + /*output_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}, + getElementType(), {-1, 0}); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/StridedSlice.cpp b/compiler/luci-interpreter/src/kernels/StridedSlice.cpp new file mode 100644 index 0000000..6794854 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/StridedSlice.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/StridedSlice.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +StridedSlice::StridedSlice(const Tensor *input, const Tensor *begin, const Tensor *end, + const Tensor *strides, Tensor *output, const StridedSliceParams ¶ms) + : KernelWithParams({input, begin, end, strides}, {output}, params) +{ +} + +void StridedSlice::configure() +{ + assert(begin()->shape().num_dims() == 1); + assert(end()->shape().num_dims() == 1); + assert(strides()->shape().num_dims() == 1); + assert(input()->element_type() == output()->element_type()); + assert(begin()->element_type() == DataType::S32); + assert(end()->element_type() == DataType::S32); + assert(strides()->element_type() == DataType::S32); + assert(input()->shape().num_dims() <= 4); + if (params().ellipsis_mask != 0) + { + throw std::runtime_error("ellipsis_mask is not implemented yet."); + } + if (params().new_axis_mask != 0) + { + throw std::runtime_error("new_axis_mask is not implemented yet."); + } + if (input()->element_type() == DataType::U8) + { + assert(input()->scale() == output()->scale()); + assert(input()->zero_point() == output()->zero_point()); + } + tflite::StridedSliceParams op_params{}; + op_params.start_indices_count = input()->shape().num_dims(); + op_params.stop_indices_count = input()->shape().num_dims(); + op_params.strides_count = input()->shape().num_dims(); + + for (int i = 0; i < input()->shape().num_dims(); i++) + { + op_params.start_indices[i] = getTensorData(begin())[i]; + op_params.stop_indices[i] = getTensorData(end())[i]; + op_params.strides[i] = getTensorData(strides())[i]; + } + op_params.begin_mask = params().begin_mask; + op_params.ellipsis_mask = 0; + op_params.end_mask = params().end_mask; + op_params.new_axis_mask = 0; + op_params.shrink_axis_mask = params().shrink_axis_mask; + std::vector output_shape_vector; + for (int i = 0; i < input()->shape().num_dims(); i++) + { + int idx = input()->shape().num_dims() - i - 1; + int32_t stride = getTensorData(strides())[idx]; + assert(stride != 0); + int32_t begin = ::tflite::strided_slice::StartForAxis(op_params, getTensorShape(input()), idx); + int32_t end = + ::tflite::strided_slice::StopForAxis(op_params, getTensorShape(input()), idx, begin); + + const bool shrink_axis = params().shrink_axis_mask & (1 << idx); + if (shrink_axis) + { + end = begin + 1; + } + + int32_t dim_shape = std::ceil((end - begin) / static_cast(stride)); + dim_shape = dim_shape < 0 ? 0 : dim_shape; + if (!shrink_axis) + { + output_shape_vector.push_back(dim_shape); + } + } + Shape output_shape = Shape(output_shape_vector.size()); + for (size_t i = 0; i < output_shape_vector.size(); i++) + { + output_shape.dim(i) = output_shape_vector[output_shape_vector.size() - i - 1]; + } + output()->resize(output_shape); +} + +void StridedSlice::execute() const +{ + tflite::StridedSliceParams op_params{}; + op_params.start_indices_count = input()->shape().num_dims(); + op_params.stop_indices_count = input()->shape().num_dims(); + op_params.strides_count = input()->shape().num_dims(); + + for (int i = 0; i < input()->shape().num_dims(); i++) + { + op_params.start_indices[i] = getTensorData(begin())[i]; + op_params.stop_indices[i] = getTensorData(end())[i]; + op_params.strides[i] = getTensorData(strides())[i]; + } + op_params.begin_mask = params().begin_mask; + op_params.ellipsis_mask = 0; + op_params.end_mask = params().end_mask; + op_params.new_axis_mask = 0; + op_params.shrink_axis_mask = params().shrink_axis_mask; + + switch (input()->element_type()) + { + case DataType::FLOAT32: + tflite::reference_ops::StridedSlice(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + case DataType::U8: + tflite::reference_ops::StridedSlice(op_params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/StridedSlice.h b/compiler/luci-interpreter/src/kernels/StridedSlice.h new file mode 100644 index 0000000..fc96893 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/StridedSlice.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_STRIDEDSLICE_H +#define LUCI_INTERPRETER_KERNELS_STRIDEDSLICE_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class StridedSlice : public KernelWithParams +{ +public: + StridedSlice(const Tensor *input, const Tensor *begin, const Tensor *end, const Tensor *strides, + Tensor *output, const StridedSliceParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *begin() const { return _inputs[1]; } + const Tensor *end() const { return _inputs[2]; } + const Tensor *strides() const { return _inputs[3]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_STRIDEDSLICE_H diff --git a/compiler/luci-interpreter/src/kernels/StridedSlice.test.cpp b/compiler/luci-interpreter/src/kernels/StridedSlice.test.cpp new file mode 100644 index 0000000..5ab06e2 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/StridedSlice.test.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/StridedSlice.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +TEST(StridedSliceTest, Float) +{ + Shape input_shape{2, 3, 2}; + std::vector input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + Shape begin_shape{3}; + std::vector begin_data{0, 0, 0}; + Shape end_shape{3}; + std::vector end_data{1, 3, 2}; + Shape strides_shape{3}; + std::vector strides_data{1, 1, 1}; + Tensor input_tensor{DataType::FLOAT32, input_shape, {}, ""}; + Tensor begin_tensor{DataType::S32, begin_shape, {}, ""}; + Tensor end_tensor{DataType::S32, end_shape, {}, ""}; + Tensor strides_tensor{DataType::S32, strides_shape, {}, ""}; + Tensor output_tensor = makeOutputTensor(DataType::FLOAT32); + + input_tensor.writeData(input_data.data(), input_data.size() * sizeof(float)); + begin_tensor.writeData(begin_data.data(), begin_data.size() * sizeof(int32_t)); + end_tensor.writeData(end_data.data(), end_data.size() * sizeof(int32_t)); + strides_tensor.writeData(strides_data.data(), strides_data.size() * sizeof(int32_t)); + + StridedSliceParams params{}; + params.begin_mask = 0; + params.end_mask = 0; + params.ellipsis_mask = 0; + params.new_axis_mask = 0; + params.shrink_axis_mask = 1; + + StridedSlice kernel(&input_tensor, &begin_tensor, &end_tensor, &strides_tensor, &output_tensor, + params); + kernel.configure(); + kernel.execute(); + + std::vector output_shape{3, 2}; + std::vector output_data{1, 2, 3, 4, 5, 6}; + EXPECT_THAT(extractTensorData(output_tensor), + ElementsAreArray(ArrayFloatNear(output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape)); +} + +TEST(StridedSliceTest, Uint8) +{ + Shape input_shape{2, 3, 2}; + std::vector input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + std::vector quant_input_data = quantize(input_data, 1.0f, 0); + Shape begin_shape{3}; + std::vector begin_data{0, 0, 0}; + Shape end_shape{3}; + std::vector end_data{1, 3, 2}; + Shape strides_shape{3}; + std::vector strides_data{1, 1, 1}; + Tensor input_tensor{DataType::U8, input_shape, {{1.0f}, {0}}, ""}; + Tensor begin_tensor{DataType::S32, begin_shape, {}, ""}; + Tensor end_tensor{DataType::S32, end_shape, {}, ""}; + Tensor strides_tensor{DataType::S32, strides_shape, {}, ""}; + Tensor output_tensor = makeOutputTensor(DataType::U8, 1.0f, 0); + + input_tensor.writeData(quant_input_data.data(), quant_input_data.size() * sizeof(uint8_t)); + begin_tensor.writeData(begin_data.data(), begin_data.size() * sizeof(int32_t)); + end_tensor.writeData(end_data.data(), end_data.size() * sizeof(int32_t)); + strides_tensor.writeData(strides_data.data(), strides_data.size() * sizeof(int32_t)); + + StridedSliceParams params{}; + params.begin_mask = 0; + params.end_mask = 0; + params.ellipsis_mask = 0; + params.new_axis_mask = 0; + params.shrink_axis_mask = 1; + + StridedSlice kernel(&input_tensor, &begin_tensor, &end_tensor, &strides_tensor, &output_tensor, + params); + kernel.configure(); + kernel.execute(); + + std::vector output_shape{3, 2}; + std::vector output_data{1, 2, 3, 4, 5, 6}; + EXPECT_THAT(dequantize(extractTensorData(output_tensor), output_tensor.scale(), + output_tensor.zero_point()), + ElementsAreArray(ArrayFloatNear(output_data))); + EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape)); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/TestUtils.cpp b/compiler/luci-interpreter/src/kernels/TestUtils.cpp new file mode 100644 index 0000000..2c8a6ae --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/TestUtils.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace testing +{ + +using ::testing::FloatNear; +using ::testing::Matcher; + +Tensor makeOutputTensor(DataType element_type) { return Tensor(element_type, {}, {}, ""); } + +Tensor makeOutputTensor(DataType element_type, float scale, int32_t zero_point) +{ + return Tensor(element_type, {}, {{scale}, {zero_point}}, ""); +} + +std::vector> ArrayFloatNear(const std::vector &values, float max_abs_error) +{ + std::vector> matchers; + matchers.reserve(values.size()); + for (const float v : values) + { + matchers.emplace_back(FloatNear(v, max_abs_error)); + } + return matchers; +} + +std::vector extractTensorShape(const Tensor &tensor) +{ + std::vector result; + int dims = tensor.shape().num_dims(); + for (int i = 0; i < dims; i++) + { + result.push_back(tensor.shape().dim(i)); + } + return result; +} + +} // namespace testing +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/TestUtils.h b/compiler/luci-interpreter/src/kernels/TestUtils.h new file mode 100644 index 0000000..5311a19 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/TestUtils.h @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_TESTUTILS_H +#define LUCI_INTERPRETER_KERNELS_TESTUTILS_H + +#include "luci_interpreter/core/Tensor.h" + +#include + +#include +#include + +namespace luci_interpreter +{ +namespace kernels +{ +namespace testing +{ + +template +Tensor makeInputTensor(const Shape &shape, const std::vector::Type> &data) +{ + Tensor tensor(DT, shape, {}, ""); + tensor.writeData(data.data(), data.size() * sizeof(typename DataTypeImpl
::Type)); + return tensor; +} + +Tensor makeOutputTensor(DataType element_type); +Tensor makeOutputTensor(DataType element_type, float scale, int32_t zero_point); + +std::vector extractTensorShape(const Tensor &tensor); + +// Returns the corresponding DataType given the type T. +template constexpr DataType getElementType() +{ + if (std::is_same::value) + return DataType::FLOAT32; + if (std::is_same::value) + return DataType::U8; + if (std::is_same::value) + return DataType::S32; + if (std::is_same::value) + return DataType::S64; + return DataType::Unknown; +} + +template std::vector extractTensorData(const Tensor &tensor) +{ + const auto *data_ptr = tensor.data(); + return std::vector(data_ptr, data_ptr + tensor.shape().num_elements()); +} + +std::vector<::testing::Matcher> ArrayFloatNear(const std::vector &values, + float max_abs_error = 1.0e-5f); + +template +inline std::vector quantize(const std::vector &data, float scale, int32_t zero_point) +{ + assert(!std::is_floating_point::value); + std::vector q; + for (const auto &f : data) + { + q.push_back(static_cast(std::max( + std::numeric_limits::lowest(), + std::min(std::numeric_limits::max(), std::round(zero_point + (f / scale)))))); + } + return q; +} + +template +inline std::vector dequantize(const std::vector &data, float scale, int32_t zero_point) +{ + assert(!std::is_floating_point::value); + std::vector f; + for (const T &q : data) + { + f.push_back(scale * (q - zero_point)); + } + return f; +} + +template std::pair quantizationParams(float f_min, float f_max) +{ + if (std::is_floating_point::value) + { + return {1.0f, 0}; + } + int32_t zero_point = 0; + double scale = 0; + const T qmin = std::numeric_limits::lowest(); + const T qmax = std::numeric_limits::max(); + const double qmin_double = qmin; + const double qmax_double = qmax; + // 0 should always be a representable value. Let's assume that the initial + // min,max range contains 0. + assert(f_max >= 0); + assert(f_min <= 0); + if (f_min == f_max) + { + // Special case where the min,max range is a point. Should be {0}. + assert(f_max == 0); + assert(f_min == 0); + return {scale, zero_point}; + } + + // General case. + // + // First determine the scale. + scale = (f_max - f_min) / (qmax_double - qmin_double); + + // Zero-point computation. + // First the initial floating-point computation. The zero-point can be + // determined from solving an affine equation for any known pair + // (real value, corresponding quantized value). + // We know two such pairs: (rmin, qmin) and (rmax, qmax). + // The arithmetic error on the zero point computed from either pair + // will be roughly machine_epsilon * (sum of absolute values of terms) + // so we want to use the variant that adds the smaller terms. + const double zero_point_from_min = qmin_double - f_min / scale; + const double zero_point_from_max = qmax_double - f_max / scale; + + const double zero_point_from_min_error = std::abs(qmin_double) + std::abs(f_min / scale); + + const double zero_point_from_max_error = std::abs(qmax_double) + std::abs(f_max / scale); + + const double zero_point_double = zero_point_from_min_error < zero_point_from_max_error + ? zero_point_from_min + : zero_point_from_max; + + // Now we need to nudge the zero point to be an integer + // (our zero points are integer, and this is motivated by the requirement + // to be able to represent the real value "0" exactly as a quantized value, + // which is required in multiple places, for example in Im2col with SAME + // padding). + + T nudged_zero_point = 0; + if (zero_point_double < qmin_double) + { + nudged_zero_point = qmin; + } + else if (zero_point_double > qmax_double) + { + nudged_zero_point = qmax; + } + else + { + nudged_zero_point = static_cast(std::round(zero_point_double)); + } + + // The zero point should always be in the range of quantized value, + // // [qmin, qmax]. + assert(qmax >= nudged_zero_point); + assert(qmin <= nudged_zero_point); + zero_point = nudged_zero_point; + // finally, return the values + return {static_cast(scale), zero_point}; +} + +inline float getTolerance(float min, float max, int quantize_steps) +{ + return ((max - min) / quantize_steps); +} + +} // namespace testing +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_TESTUTILS_H diff --git a/compiler/luci-interpreter/src/kernels/Transpose.cpp b/compiler/luci-interpreter/src/kernels/Transpose.cpp new file mode 100644 index 0000000..8265d99 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Transpose.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Transpose.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +Transpose::Transpose(const Tensor *input, const Tensor *perm, Tensor *output) + : Kernel({input, perm}, {output}) +{ +} + +void Transpose::configure() +{ + // Transpose op only supports 1D-4D input arrays. + int dims = input()->shape().num_dims(); + const int *perm_data = getTensorData(perm()); + + assert(input()->shape().num_dims() <= 4); + assert(input()->element_type() == output()->element_type()); + + assert(perm()->shape().num_dims() == 1); + assert(perm()->shape().dim(0) == dims); + + Shape output_shape(dims); + for (int i = 0; i < dims; i++) + { + assert(perm_data[i] < dims && perm_data[i] >= 0); + output_shape.dim(i) = input()->shape().dim(perm_data[i]); + } + + output()->resize(output_shape); +} + +void Transpose::execute() const +{ + tflite::TransposeParams params{}; + const int *perm_data = getTensorData(perm()); + const int size = perm()->shape().dim(0); + params.perm_count = size; + for (int i = 0; i < size; i++) + params.perm[i] = perm_data[i]; + switch (input()->element_type()) + { + case DataType::FLOAT32: + tflite::reference_ops::Transpose(params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + case DataType::U8: + tflite::reference_ops::Transpose(params, getTensorShape(input()), + getTensorData(input()), getTensorShape(output()), + getTensorData(output())); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Transpose.h b/compiler/luci-interpreter/src/kernels/Transpose.h new file mode 100644 index 0000000..d6f89c3 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Transpose.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_TRANSPOSE_H +#define LUCI_INTERPRETER_KERNELS_TRANSPOSE_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Transpose : public Kernel +{ +public: + Transpose(const Tensor *input, const Tensor *perm, Tensor *output); + + const Tensor *input() const { return _inputs[0]; } + const Tensor *perm() const { return _inputs[1]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_TRANSPOSE_H diff --git a/compiler/luci-interpreter/src/kernels/Transpose.test.cpp b/compiler/luci-interpreter/src/kernels/Transpose.test.cpp new file mode 100644 index 0000000..87e6e2a --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Transpose.test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Transpose.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(std::initializer_list input_shape, std::initializer_list perm_shape, + std::initializer_list output_shape, std::initializer_list input_data, + std::initializer_list perm_data, std::initializer_list output_data, + DataType element_type) +{ + Tensor input_tensor{element_type, input_shape, {}, ""}; + input_tensor.writeData(input_data.begin(), input_data.size() * sizeof(T)); + + Tensor perm_tensor{DataType::S32, perm_shape, {}, ""}; + perm_tensor.writeData(perm_data.begin(), perm_data.size() * sizeof(int32_t)); + Tensor output_tensor = makeOutputTensor(element_type); + + Transpose kernel(&input_tensor, &perm_tensor, &output_tensor); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), ::testing::ElementsAreArray(output_data)); +} + +template class TransposeTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(TransposeTest, DataTypes); + +TYPED_TEST(TransposeTest, Small3D) +{ + Check(/*input_shape=*/{2, 3, 4}, /*perm_shape=*/{3}, /*output_shape=*/{4, 2, 3}, + /*input_data=*/{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}, + /*perm_data=*/{2, 0, 1}, + /*output_data=*/{0, 4, 8, 12, 16, 20, 1, 5, 9, 13, 17, 21, + 2, 6, 10, 14, 18, 22, 3, 7, 11, 15, 19, 23}, + getElementType()); +} + +TYPED_TEST(TransposeTest, Large4D) +{ + Check( + /*input_shape=*/{2, 3, 4, 5}, /*perm_shape=*/{4}, /*output_shape=*/{4, 2, 3, 5}, + /*input_data=*/{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119}, + /*perm_data=*/{2, 0, 1, 3}, + /*output_data=*/{0, 1, 2, 3, 4, 20, 21, 22, 23, 24, 40, 41, 42, 43, 44, + 60, 61, 62, 63, 64, 80, 81, 82, 83, 84, 100, 101, 102, 103, 104, + 5, 6, 7, 8, 9, 25, 26, 27, 28, 29, 45, 46, 47, 48, 49, + 65, 66, 67, 68, 69, 85, 86, 87, 88, 89, 105, 106, 107, 108, 109, + 10, 11, 12, 13, 14, 30, 31, 32, 33, 34, 50, 51, 52, 53, 54, + 70, 71, 72, 73, 74, 90, 91, 92, 93, 94, 110, 111, 112, 113, 114, + 15, 16, 17, 18, 19, 35, 36, 37, 38, 39, 55, 56, 57, 58, 59, + 75, 76, 77, 78, 79, 95, 96, 97, 98, 99, 115, 116, 117, 118, 119}, + getElementType()); +} + +TYPED_TEST(TransposeTest, Large2D) +{ + Check( + /*input_shape=*/{10, 12}, /*perm_shape=*/{2}, /*output_shape=*/{12, 10}, + /*input_data=*/{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119}, + /*perm_data=*/{1, 0}, + /*output_data=*/{0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 1, 13, 25, 37, 49, + 61, 73, 85, 97, 109, 2, 14, 26, 38, 50, 62, 74, 86, 98, 110, + 3, 15, 27, 39, 51, 63, 75, 87, 99, 111, 4, 16, 28, 40, 52, + 64, 76, 88, 100, 112, 5, 17, 29, 41, 53, 65, 77, 89, 101, 113, + 6, 18, 30, 42, 54, 66, 78, 90, 102, 114, 7, 19, 31, 43, 55, + 67, 79, 91, 103, 115, 8, 20, 32, 44, 56, 68, 80, 92, 104, 116, + 9, 21, 33, 45, 57, 69, 81, 93, 105, 117, 10, 22, 34, 46, 58, + 70, 82, 94, 106, 118, 11, 23, 35, 47, 59, 71, 83, 95, 107, 119}, + getElementType()); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.cpp b/compiler/luci-interpreter/src/kernels/TransposeConv.cpp new file mode 100644 index 0000000..46380e2 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.cpp @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/TransposeConv.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +TransposeConv::TransposeConv(const Tensor *output_shape, const Tensor *filter, const Tensor *input, + Tensor *output, const TransposeConvParams ¶ms) + : KernelWithParams({output_shape, filter, input}, {output}, params) +{ +} + +void TransposeConv::configure() +{ + assert(output_shape()->shape().num_dims() == 1); + assert(input()->shape().num_dims() == 4); + assert(filter()->shape().num_dims() == 4); + assert(input()->element_type() == DataType::FLOAT32 || input()->element_type() == DataType::U8); + assert(input()->element_type() == output()->element_type()); + assert(input()->shape().dim(3) == filter()->shape().dim(3)); + if (input()->element_type() == DataType::U8) + { + _scratch_tensor = + std::make_unique(DataType::S32, output()->shape(), AffineQuantization{}, ""); + double real_multiplier = 0.0; + const double input_product_scale = input()->scale() * filter()->scale(); + assert(input_product_scale >= 0); + real_multiplier = input_product_scale / output()->scale(); + int exponent; + quantizeMultiplier(real_multiplier, &_output_multiplier, &exponent); + _output_shift = -exponent; + } + + const int num_dims = output_shape()->shape().dim(0); + Shape out_shape(num_dims); + const auto *shape_data = getTensorData(output_shape()); + for (int i = 0; i < num_dims; i++) + out_shape.dim(i) = shape_data[i]; + output()->resize(out_shape); +} + +void TransposeConv::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + evalFloat(); + break; + case DataType::U8: + evalQuantized(); + break; + default: + throw std::runtime_error("Unsupported type."); + } +} + +void TransposeConv::evalFloat() const +{ + const int width = output()->shape().dim(2); + const int height = output()->shape().dim(1); + + const int filter_width = filter()->shape().dim(2); + const int filter_height = filter()->shape().dim(1); + + int unused_output_height, unused_output_width; + unused_output_width = + computeOutputSize(params().padding, width, filter_width, params().stride_width, 1); + unused_output_height = + computeOutputSize(params().padding, height, filter_height, params().stride_height, 1); + int32_t offset = 0; + tflite::ConvParams op_params{}; + op_params.padding_type = tflite::PaddingType::kSame; + op_params.padding_values.height = computePaddingWithOffset( + params().stride_height, 1, height, filter_height, unused_output_height, &offset); + op_params.padding_values.height_offset = offset; + op_params.padding_values.width = computePaddingWithOffset( + params().stride_width, 1, width, filter_width, unused_output_width, &offset); + op_params.padding_values.width_offset = offset; + op_params.stride_height = params().stride_height; + op_params.stride_width = params().stride_width; + op_params.output_multiplier = _output_multiplier; + tflite::reference_ops::TransposeConv( + op_params, getTensorShape(input()), getTensorData(input()), getTensorShape(filter()), + getTensorData(filter()), getTensorShape(output()), getTensorData(output()), + tflite::RuntimeShape(), (float *)nullptr); +} + +void TransposeConv::evalQuantized() const +{ + int32_t input_offset = -input()->zero_point(); + int32_t filter_offset = -filter()->zero_point(); + int32_t output_offset = filter()->zero_point(); + const int width = output()->shape().dim(2); + const int height = output()->shape().dim(1); + + const int filter_width = filter()->shape().dim(2); + const int filter_height = filter()->shape().dim(1); + + int unused_output_height, unused_output_width; + unused_output_width = + computeOutputSize(params().padding, width, filter_width, params().stride_width, 1); + unused_output_height = + computeOutputSize(params().padding, height, filter_height, params().stride_height, 1); + int32_t offset = 0; + tflite::ConvParams op_params{}; + op_params.padding_type = tflite::PaddingType::kSame; + op_params.padding_values.height = computePaddingWithOffset( + params().stride_height, 1, height, filter_height, unused_output_height, &offset); + op_params.padding_values.width = computePaddingWithOffset( + params().stride_width, 1, width, filter_width, unused_output_width, &offset); + op_params.stride_height = params().stride_height; + op_params.stride_width = params().stride_width; + op_params.input_offset = input_offset; + op_params.output_offset = output_offset; + op_params.weights_offset = filter_offset; + op_params.output_multiplier = _output_multiplier; + op_params.output_shift = -_output_shift; + op_params.quantized_activation_min = std::numeric_limits::min(); + op_params.quantized_activation_max = std::numeric_limits::max(); + + tflite::reference_ops::TransposeConv( + op_params, getTensorShape(input()), getTensorData(input()), getTensorShape(filter()), + getTensorData(filter()), getTensorShape(output()), getTensorData(output()), + tflite::RuntimeShape(), (uint8 *)nullptr, getTensorData(_scratch_tensor.get())); +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.h b/compiler/luci-interpreter/src/kernels/TransposeConv.h new file mode 100644 index 0000000..d73e939 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_TRANSPOSECONV_H +#define LUCI_INTERPRETER_KERNELS_TRANSPOSECONV_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class TransposeConv : public KernelWithParams +{ +public: + TransposeConv(const Tensor *output_shape, const Tensor *filter, const Tensor *input, + Tensor *output, const TransposeConvParams ¶ms); + + const Tensor *output_shape() const { return _inputs[0]; } + const Tensor *filter() const { return _inputs[1]; } + const Tensor *input() const { return _inputs[2]; } + Tensor *output() const { return _outputs[0]; } + + void configure() override; + void execute() const override; + +private: + void evalFloat() const; + void evalQuantized() const; + +private: + std::unique_ptr _scratch_tensor; + + // The scaling factor from input to output (aka the 'real multiplier') can + // be represented as a fixed point multiplier plus a left shift. + int32_t _output_multiplier = 0; + int _output_shift = 0; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_TRANSPOSECONV_H diff --git a/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp b/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp new file mode 100644 index 0000000..3386d36 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/TransposeConv.test.cpp @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/TransposeConv.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(std::initializer_list output_shape_shape, + std::initializer_list weight_shape, + std::initializer_list input_data_shape, + std::initializer_list output_shape, + std::initializer_list output_shape_data, std::initializer_list weight_data, + std::initializer_list input_data_data, std::initializer_list output_data, + luci::Padding padding, int32_t stride_height, int32_t stride_width, + DataType element_type) +{ + Tensor output_shape_tensor{element_type, output_shape_shape, {}, ""}; + output_shape_tensor.writeData(output_shape_data.begin(), output_shape_data.size() * sizeof(T)); + Tensor weight_tensor{element_type, weight_shape, {}, ""}; + weight_tensor.writeData(weight_data.begin(), weight_data.size() * sizeof(T)); + Tensor input_data_tensor{element_type, input_data_shape, {}, ""}; + input_data_tensor.writeData(input_data_data.begin(), input_data_data.size() * sizeof(T)); + + Tensor output_tensor = makeOutputTensor(element_type); + + TransposeConvParams params{}; + params.padding = padding; + params.stride_height = stride_height; + params.stride_width = stride_width; + + TransposeConv kernel(&output_shape_tensor, &weight_tensor, &input_data_tensor, &output_tensor, + params); + kernel.configure(); + kernel.execute(); + + EXPECT_THAT(extractTensorData(output_tensor), ::testing::ElementsAreArray(output_data)); +} + +TEST(TransposeConvTest, FloatSimple) +{ + Check( + /*outputShape_shape=*/{4}, /*weight_shape=*/{1, 3, 3, 1}, /*input_shape=*/{1, 4, 4, 1}, + /*output_shape=*/{1, 4, 4, 1}, /*outputShape_data=*/{1, 4, 4, 1}, + /*weight_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9}, + /*input_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + /*output_data=*/{29, 62, 83, 75, 99, 192, 237, 198, 207, 372, 417, 330, 263, 446, 485, 365}, + /*params.padding=*/luci::Padding::SAME, /*stride_height=*/1, /*stride_width=*/1, + getElementType()); +} + +TEST(TransposeConvTest, FloatTwoFiltersTest) +{ + Check( + /*outputShape_shape=*/{4}, /*weight_shape=*/{1, 3, 3, 2}, /*input_shape=*/{1, 4, 4, 2}, + /*output_shape=*/{1, 4, 4, 1}, /*outputShape_data=*/{1, 4, 4, 1}, + /*weight_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}, + /*input_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, + /*output_data=*/{184, 412, 568, 528, 678, 1347, 1689, 1434, 1494, 2715, 3057, 2442, 1968, + 3352, 3652, 2760}, + /*params.padding=*/luci::Padding::SAME, /*stride_height=*/1, /*stride_width=*/1, + getElementType()); +} + +TEST(TransposeConvTest, Uint8Simple) +{ + // TODO + // Implement GetDequantizedOutput Function. + // Create Test for Uint8 Case +} +TEST(TransposeConvTest, Uint8FiltersTest) +{ + // TODO + // Implement GetDequantizedOutput Function. + // Create Test for Uint8 Case +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Unpack.cpp b/compiler/luci-interpreter/src/kernels/Unpack.cpp new file mode 100644 index 0000000..834b799 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Unpack.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Unpack.h" + +#include "kernels/Utils.h" + +#include + +#include + +namespace luci_interpreter +{ + +namespace kernels +{ + +Unpack::Unpack(const Tensor *input, std::vector outputs, const UnpackParams ¶ms) + : KernelWithParams({input}, std::move(outputs), params) +{ +} + +void Unpack::configure() +{ + const Shape &input_shape = input()->shape(); + + int axis = _params.axis; + if (axis < 0) + axis += input()->shape().num_dims(); + assert(axis >= 0 && axis < input_shape.num_dims()); + + Shape output_shape(input_shape.num_dims() - 1); + int out_index = 0; + for (int in_index = 0; in_index < input_shape.num_dims(); ++in_index) + { + if (in_index != axis) + output_shape.dim(out_index++) = input_shape.dim(in_index); + } + + for (Tensor *output : _outputs) + { + assert(output->element_type() == input()->element_type()); + output->resize(output_shape); + } +} + +template void Unpack::executeImpl() const +{ + tflite::UnpackParams params{}; + params.axis = _params.axis; + params.num_split = _outputs.size(); + VectorOfTensors all_outputs(_outputs); + tflite::reference_ops::Unpack(params, getTensorShape(input()), getTensorData(input()), + **all_outputs.shapes(), all_outputs.data()); +} + +void Unpack::execute() const +{ + switch (input()->element_type()) + { + case DataType::FLOAT32: + return executeImpl(); + case DataType::U8: + return executeImpl(); + default: + throw std::runtime_error("Unsupported type."); + } +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Unpack.h b/compiler/luci-interpreter/src/kernels/Unpack.h new file mode 100644 index 0000000..f4a44ec --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Unpack.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_UNPACK_H +#define LUCI_INTERPRETER_KERNELS_UNPACK_H + +#include "core/Kernel.h" +#include "core/KernelParams.h" + +namespace luci_interpreter +{ +namespace kernels +{ + +class Unpack : public KernelWithParams +{ +public: + Unpack(const Tensor *input, std::vector outputs, const UnpackParams ¶ms); + + const Tensor *input() const { return _inputs[0]; } + Tensor *output(int index) const { return _outputs[index]; } + + void configure() override; + void execute() const override; + +private: + template void executeImpl() const; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_UNPACK_H diff --git a/compiler/luci-interpreter/src/kernels/Unpack.test.cpp b/compiler/luci-interpreter/src/kernels/Unpack.test.cpp new file mode 100644 index 0000000..f70c584 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Unpack.test.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Unpack.h" +#include "kernels/TestUtils.h" + +namespace luci_interpreter +{ +namespace kernels +{ +namespace +{ + +using namespace testing; + +template +void Check(int axis, Shape input_shape, std::initializer_list input_data, + const std::vector> &exp_output_shape, + std::vector> exp_output_data) +{ + constexpr DataType element_type = getElementType(); + const int num_outputs = input_shape.dim(axis < 0 ? axis + input_shape.num_dims() : axis); + + Tensor input_tensor = makeInputTensor(input_shape, input_data); + std::vector output_tensors; + output_tensors.reserve(num_outputs); + for (int i = 0; i < num_outputs; ++i) + { + output_tensors.push_back(makeOutputTensor(element_type)); + } + + std::vector output_tensor_ptrs(num_outputs); + for (int i = 0; i < num_outputs; ++i) + { + output_tensor_ptrs[i] = &output_tensors[i]; + } + + UnpackParams params{}; + params.axis = axis; + + Unpack kernel(&input_tensor, std::move(output_tensor_ptrs), params); + kernel.configure(); + kernel.execute(); + + for (int i = 0; i < num_outputs; ++i) + { + EXPECT_THAT(extractTensorData(output_tensors[i]), + ::testing::ElementsAreArray(exp_output_data[i])); + } +} + +template class UnpackTest : public ::testing::Test +{ +}; + +using DataTypes = ::testing::Types; +TYPED_TEST_CASE(UnpackTest, DataTypes); + +TYPED_TEST(UnpackTest, ThreeOutputs) +{ + Check(/*axis=*/0, /*input_shape=*/{3, 2}, + /*input_data=*/{1, 2, 3, 4, 5, 6}, + /*exp_output_shape=*/{{2}, {2}, {2}}, + /*exp_output_data=*/{{1, 2}, {3, 4}, {5, 6}}); +} + +TYPED_TEST(UnpackTest, ThreeOutputsAxisOne) +{ + Check(/*axis=*/1, /*input_shape=*/{3, 2}, + /*input_data=*/{1, 2, 3, 4, 5, 6}, + /*exp_output_shape=*/{{3}, {3}}, + /*exp_output_data=*/{{1, 3, 5}, {2, 4, 6}}); +} + +TYPED_TEST(UnpackTest, ThreeOutputsNegativeAxisOne) +{ + Check(/*axis=*/-1, /*input_shape=*/{3, 2}, + /*input_data=*/{1, 2, 3, 4, 5, 6}, + /*exp_output_shape=*/{{3}, {3}}, + /*exp_output_data=*/{{1, 3, 5}, {2, 4, 6}}); +} + +TYPED_TEST(UnpackTest, ThreeOutputsNegativeAxisTwo) +{ + Check(/*axis=*/-2, /*input_shape=*/{3, 2}, + /*input_data=*/{1, 2, 3, 4, 5, 6}, + /*exp_output_shape=*/{{2}, {2}, {2}}, + /*exp_output_data=*/{{1, 2}, {3, 4}, {5, 6}}); +} + +TYPED_TEST(UnpackTest, OneOutput) +{ + Check(/*axis=*/0, /*input_shape=*/{1, 6}, + /*input_data=*/{1, 2, 3, 4, 5, 6}, + /*exp_output_shape=*/{{6}}, + /*exp_output_data=*/{{1, 2, 3, 4, 5, 6}}); +} + +TYPED_TEST(UnpackTest, ThreeDimensionsTwoOutputs) +{ + Check(/*axis=*/2, /*input_shape=*/{2, 2, 2}, + /*input_data=*/{1, 2, 3, 4, 5, 6, 7, 8}, + /*exp_output_shape=*/{{2, 2}, {2, 2}}, + /*exp_output_data=*/{{1, 3, 5, 7}, {2, 4, 6, 8}}); +} + +TYPED_TEST(UnpackTest, FiveDimensionsTwoOutputs) +{ + Check( + /*axis=*/2, /*input_shape=*/{2, 2, 2, 2, 1}, + /*input_data=*/{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + /*exp_output_shape=*/{{2, 2, 2, 1}, {2, 2, 2, 1}}, + /*exp_output_data=*/ + {{1, 2, 5, 6, 9, 10, 13, 14}, {3, 4, 7, 8, 11, 12, 15, 16}}); +} + +TYPED_TEST(UnpackTest, VectorToScalar) +{ + Check(/*axis=*/0, /*input_shape=*/{5}, + /*input_data=*/{1, 2, 3, 4, 5}, + /*exp_output_shape=*/{{}, {}, {}, {}, {}}, + /*exp_output_data=*/{{1}, {2}, {3}, {4}, {5}}); +} + +} // namespace +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Utils.cpp b/compiler/luci-interpreter/src/kernels/Utils.cpp new file mode 100644 index 0000000..b9e7738 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Utils.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kernels/Utils.h" + +#include +#include +#include +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +void calculateActivationRange(Activation activation, float *activation_min, float *activation_max) +{ + switch (activation) + { + case Activation::NONE: + *activation_min = std::numeric_limits::lowest(); + *activation_max = std::numeric_limits::max(); + break; + case Activation::RELU: + *activation_min = 0; + *activation_max = std::numeric_limits::max(); + break; + case Activation::RELU_N1_TO_1: + *activation_min = -1; + *activation_max = 1; + break; + case Activation::RELU6: + *activation_min = 0; + *activation_max = 6; + break; + default: + throw std::runtime_error("Unsupported activation."); + } +} + +static void calculateActivationRangeQuantizedImpl(Activation activation, int32_t qmin, int32_t qmax, + const Tensor *output, int32_t *activation_min, + int32_t *activation_max) +{ + const float scale = output->scale(); + const int32_t zero_point = output->zero_point(); + + auto quantize = [scale, zero_point](float x) { + return zero_point + static_cast(std::round(x / scale)); + }; + + switch (activation) + { + case Activation::NONE: + *activation_min = qmin; + *activation_max = qmax; + break; + case Activation::RELU: + *activation_min = std::max(qmin, quantize(0.0f)); + *activation_max = qmax; + break; + case Activation::RELU_N1_TO_1: + *activation_min = std::max(qmin, quantize(-1.0f)); + *activation_max = std::min(qmax, quantize(1.0f)); + break; + case Activation::RELU6: + *activation_min = std::max(qmin, quantize(0.0f)); + *activation_max = std::min(qmax, quantize(6.0f)); + break; + default: + throw std::runtime_error("Unsupported activation."); + } +} + +void calculateActivationRangeQuantized(Activation activation, const Tensor *output, + int32_t *activation_min, int32_t *activation_max) +{ + int32_t qmin{}; + int32_t qmax{}; + switch (output->element_type()) + { + case DataType::U8: + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + break; + case DataType::S8: + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + break; + case DataType::S16: + qmin = std::numeric_limits::min(); + qmax = std::numeric_limits::max(); + break; + default: + throw std::runtime_error("Unsupported type."); + } + + calculateActivationRangeQuantizedImpl(activation, qmin, qmax, output, activation_min, + activation_max); +} + +void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift) +{ + if (double_multiplier == 0.0) + { + *quantized_multiplier = 0; + *shift = 0; + return; + } + + const double q = std::frexp(double_multiplier, shift); + auto q_fixed = static_cast(std::round(q * (INT64_C(1) << 31))); + + if (q_fixed == (INT64_C(1) << 31)) + { + q_fixed /= 2; + ++*shift; + } + assert(q_fixed <= std::numeric_limits::max()); + // A shift amount smaller than -31 would cause all bits to be shifted out + // and thus all results would be zero. We implement that instead with + // q_fixed==0, so as to avoid hitting issues with right-shift + // operations with shift amounts greater than 31. Note that this happens + // roughly when abs(double_multiplier) < 2^-31 and the present handling means + // that we're effectively flushing tiny double_multiplier's to zero. + // We could conceivably handle values in the range (roughly) [32, 63] + // as 'denormals' i.e. (shift==0, q_fixed < 2^30). In that point of view + // the present handling is just doing 'flush denormals to zero'. We could + // reconsider and actually generate nonzero denormals if a need arises. + if (*shift < -31) + { + *shift = 0; + q_fixed = 0; + } + *quantized_multiplier = static_cast(q_fixed); +} + +void quantizeMultiplierSmallerThanOneExp(double double_multiplier, int32_t *quantized_multiplier, + int *left_shift) +{ + assert(double_multiplier < 1.0); + assert(double_multiplier > 0.0); + int shift; + quantizeMultiplier(double_multiplier, quantized_multiplier, &shift); + assert(shift <= 0); + *left_shift = shift; +} + +Shape calculateShapeForBroadcast(const Shape &input1_shape, const Shape &input2_shape) +{ + const int num_input1_dims = input1_shape.num_dims(); + const int num_input2_dims = input2_shape.num_dims(); + const int num_out_dims = std::max(num_input1_dims, num_input2_dims); + Shape output_shape(num_out_dims); + + for (int i = 0; i < num_out_dims; ++i) + { + const int32_t input1_dim = i < num_input1_dims ? input1_shape.dim(num_input1_dims - i - 1) : 1; + const int32_t input2_dim = i < num_input2_dims ? input2_shape.dim(num_input2_dims - i - 1) : 1; + assert(input1_dim == input2_dim || input1_dim == 1 || input2_dim == 1); + output_shape.dim(num_out_dims - i - 1) = std::max(input1_dim, input2_dim); + } + + return output_shape; +} + +} // namespace kernels +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/kernels/Utils.h b/compiler/luci-interpreter/src/kernels/Utils.h new file mode 100644 index 0000000..3c2cc84 --- /dev/null +++ b/compiler/luci-interpreter/src/kernels/Utils.h @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_KERNELS_UTILS_H +#define LUCI_INTERPRETER_KERNELS_UTILS_H + +#include "core/KernelParams.h" +#include "luci_interpreter/core/Tensor.h" + +#include + +#include +#include + +namespace luci_interpreter +{ +namespace kernels +{ + +inline int32_t computePadding(int32_t stride, int32_t dilation_rate, int32_t in_size, + int32_t filter_size, int32_t out_size) +{ + const int32_t effective_filter_size = (filter_size - 1) * dilation_rate + 1; + const int32_t padding = ((out_size - 1) * stride + effective_filter_size - in_size) / 2; + return padding > 0 ? padding : 0; +} + +inline int32_t computePaddingWithOffset(int32_t stride, int32_t dilation_rate, int32_t in_size, + int32_t filter_size, int32_t out_size, int32_t *offset) +{ + int32_t effective_filter_size = (filter_size - 1) * dilation_rate + 1; + int32_t total_padding = ((out_size - 1) * stride + effective_filter_size - in_size); + total_padding = total_padding > 0 ? total_padding : 0; + *offset = total_padding % 2; + return total_padding / 2; +} + +inline int32_t computeOutputSize(Padding padding, int32_t image_size, int32_t filter_size, + int32_t stride, int32_t dilation_rate = 1) +{ + const int32_t effective_filter_size = (filter_size - 1) * dilation_rate + 1; + switch (padding) + { + case Padding::SAME: + return (image_size + stride - 1) / stride; + case Padding::VALID: + return (image_size + stride - effective_filter_size) / stride; + default: + assert(false); + return 0; + } +} + +void calculateActivationRange(Activation activation, float *activation_min, float *activation_max); + +void calculateActivationRangeQuantized(Activation activation, const Tensor *output, + int32_t *activation_min, int32_t *activation_max); + +// Decompose a double multiplier into a Q0.31 int32 representation of its +// significand, and shift representation of its exponent. +// +// Handles an arbitrary positive multiplier. The 'shift' output-value is +// basically the 'floating-point exponent' of the multiplier: +// Negative for a right-shift (when the multiplier is <1), positive for a +// left-shift (when the multiplier is >1) +void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift); + +// Decompose a double multiplier into a Q0.31 int32 representation of its +// significand, and shift representation of NEGATIVE its exponent --- +// this is intended as a RIGHT-shift. +// +// Restricted to the case where the multiplier < 1 (and non-negative). +void quantizeMultiplierSmallerThanOneExp(double double_multiplier, int32_t *quantized_multiplier, + int *left_shift); + +Shape calculateShapeForBroadcast(const Shape &input1_shape, const Shape &input2_shape); + +inline tflite::RuntimeShape getTensorShape(const Tensor *tensor) +{ + if (tensor == nullptr) + return tflite::RuntimeShape(); + + const Shape &shape = tensor->shape(); + tflite::RuntimeShape runtime_shape(shape.num_dims()); + for (int i = 0; i < shape.num_dims(); ++i) + { + runtime_shape.SetDim(i, shape.dim(i)); + } + return runtime_shape; +} + +template const T *getTensorData(const Tensor *tensor) +{ + return tensor != nullptr ? tensor->data() : nullptr; +} + +template T *getTensorData(Tensor *tensor) +{ + return tensor != nullptr ? tensor->data() : nullptr; +} + +// A list of tensors in a format that can be used by kernels like split and +// concatenation. +template class VectorOfTensors +{ +public: + using ElementT = typename std::conditional::type; + using TensorT = typename std::conditional::type; + + // Build with the tensors in 'tensor_list'. + explicit VectorOfTensors(const std::vector &tensor_list) + { + const int num_tensors = tensor_list.size(); + + all_data_.reserve(num_tensors); + all_shape_.reserve(num_tensors); + all_shape_ptr_.reserve(num_tensors); + + for (TensorT *tensor : tensor_list) + { + all_data_.push_back(getTensorData(tensor)); + all_shape_.push_back(getTensorShape(tensor)); + } + + // Taking the pointer from inside a std::vector is only OK if the vector is + // never modified, so we populate all_shape in the previous loop and then we + // are free to grab iterators here. + for (tflite::RuntimeShape &shape : all_shape_) + { + all_shape_ptr_.push_back(&shape); + } + } + // Return a pointer to the data pointers of all tensors in the list. For + // example: + // float* const* f = v.data(); + // f[0][1] is the second element of the first tensor. + ElementT *const *data() const { return all_data_.data(); } + + // Return a pointer the shape pointers of all tensors in the list. For + // example: + // const RuntimeShape* const* d = v.dims(); + // dims[1] are the dimensions of the second tensor in the list. + const tflite::RuntimeShape *const *shapes() const { return all_shape_ptr_.data(); } + +private: + std::vector all_data_; + std::vector all_shape_; + std::vector all_shape_ptr_; +}; + +// A list of quantized tensors in a format that can be used by kernels like +// split and concatenation. +template class VectorOfQuantizedTensors : public VectorOfTensors +{ +public: + using typename VectorOfTensors::TensorT; + + // Build with the tensors in 'tensor_list'. + explicit VectorOfQuantizedTensors(const std::vector &tensor_list) + : VectorOfTensors(tensor_list) + { + for (TensorT *tensor : tensor_list) + { + zero_point_.push_back(tensor->zero_point()); + scale_.push_back(tensor->scale()); + } + } + + const float *scale() const { return scale_.data(); } + const int32_t *zero_point() const { return zero_point_.data(); } + +private: + std::vector zero_point_; + std::vector scale_; +}; + +} // namespace kernels +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_KERNELS_UTILS_H diff --git a/compiler/luci-interpreter/src/loader/CMakeLists.txt b/compiler/luci-interpreter/src/loader/CMakeLists.txt new file mode 100644 index 0000000..fb36c4a --- /dev/null +++ b/compiler/luci-interpreter/src/loader/CMakeLists.txt @@ -0,0 +1,15 @@ +set(SOURCES + GraphLoader.h + GraphLoader.cpp + KernelBuilder.h + KernelBuilder.cpp + ModuleLoader.h + ModuleLoader.cpp + RuntimeToIR.h) + +add_library(luci_interpreter_loader STATIC ${SOURCES}) +set_target_properties(luci_interpreter_loader PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(luci_interpreter_loader PUBLIC "${LUCI_INTERPRETER_SOURCE_DIR}") +target_link_libraries(luci_interpreter_loader + PUBLIC luci_lang luci_interpreter_core + PRIVATE luci_interpreter_kernels nncc_common) diff --git a/compiler/luci-interpreter/src/loader/GraphLoader.cpp b/compiler/luci-interpreter/src/loader/GraphLoader.cpp new file mode 100644 index 0000000..779fa06 --- /dev/null +++ b/compiler/luci-interpreter/src/loader/GraphLoader.cpp @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "loader/GraphLoader.h" + +#include "loader/ModuleLoader.h" +#include "loader/KernelBuilder.h" + +#include + +namespace luci_interpreter +{ +namespace +{ + +template Shape getNodeShape(const NodeT *node) +{ + Shape shape(node->rank()); + for (uint32_t i = 0; i < node->rank(); ++i) + { + shape.dim(i) = node->dim(i).value(); + } + return shape; +} + +template const void *getNodeDataImpl(const luci::CircleConst *node, size_t *data_size) +{ + const size_t element_size = getDataTypeSize(DT); + const int32_t num_elements = node->size
(); + + *data_size = num_elements * element_size; + if (*data_size > 0) + { + // FIXME There is no good way to get the pointer to the data currently. + return &node->at
(0); + } + return nullptr; +} + +const void *getNodeData(const luci::CircleConst *node, size_t *data_size) +{ + switch (node->dtype()) + { + case DataType::U8: + return getNodeDataImpl(node, data_size); + case DataType::FLOAT32: + return getNodeDataImpl(node, data_size); + case DataType::S32: + return getNodeDataImpl(node, data_size); + default: + throw std::runtime_error("Unsupported type."); + } +} + +bool isExecutableNode(const luci::CircleNode *node) +{ + switch (node->opcode()) + { + // These nodes denote inputs / outputs of a graph. + case luci::CircleOpcode::CONST: + case luci::CircleOpcode::CIRCLEINPUT: + case luci::CircleOpcode::CIRCLEOUTPUT: + // The following nodes denote outputs of multiple-output nodes. + case luci::CircleOpcode::CIRCLEIFOUT: + case luci::CircleOpcode::CIRCLESPLITOUT: + case luci::CircleOpcode::CIRCLEUNPACKOUT: + return false; + default: + return true; + } +} + +bool isTensorProducingNode(const luci::CircleNode *node) +{ + switch (node->opcode()) + { + // Output nodes do not produce tensors. + case luci::CircleOpcode::CIRCLEOUTPUT: + // The following nodes are multiple-output nodes. They do not produce tensors, the tensors + // are produced by the corresponding *Out nodes instead. + case luci::CircleOpcode::IF: + case luci::CircleOpcode::SPLIT: + case luci::CircleOpcode::UNPACK: + return false; + default: + return true; + } +} + +} // namespace + +GraphLoader::GraphLoader(const ModuleLoader &module_loader, const loco::Graph *graph, + RuntimeGraph *runtime_graph, RuntimeToIR &runtime_to_ir, + std::unordered_map &node_to_tensor) + : _module_loader(module_loader), _graph(graph), _runtime_graph(runtime_graph), + _runtime_to_ir(runtime_to_ir), _node_to_tensor(node_to_tensor) +{ +} + +void GraphLoader::loadTensors() +{ + for (uint32_t i = 0; i < _graph->nodes()->size(); ++i) + { + const auto *node = loco::must_cast(_graph->nodes()->at(i)); + + if (!isTensorProducingNode(node)) + continue; + + // Only Input and Const nodes have shapes. Shapes of intermediate tensors will be inferred. + Shape shape{}; + if (const auto *input_node = dynamic_cast(node)) + { + shape = getNodeShape(input_node); + } + else if (const auto *const_node = dynamic_cast(node)) + { + shape = getNodeShape(const_node); + } + + AffineQuantization quantization; + if (node->quantparam() != nullptr) + { + const luci::CircleQuantParam *params = node->quantparam(); + quantization.scale.assign(params->scale.cbegin(), params->scale.cend()); + quantization.zero_point.assign(params->zerop.cbegin(), params->zerop.cend()); + } + + auto tensor = std::make_unique(node->dtype(), std::move(shape), std::move(quantization), + node->name()); + + if (const auto *const_node = dynamic_cast(node)) + { + size_t data_size{}; + const void *const_data = getNodeData(const_node, &data_size); + if (const_data != nullptr) + tensor->writeData(const_data, data_size); + } + + _node_to_tensor.emplace(node, tensor.get()); + _runtime_to_ir.tensor_to_node.emplace(tensor.get(), node); + + _runtime_graph->addTensor(std::move(tensor)); + } +} + +void GraphLoader::initInputOutputTensors() const +{ + auto input_nodes = loco::input_nodes(_graph); + std::vector input_tensors(input_nodes.size()); + for (size_t i = 0; i < input_nodes.size(); ++i) + { + input_tensors[i] = _node_to_tensor.at(input_nodes[i]); + } + _runtime_graph->setInputTensors(input_tensors); + + auto output_nodes = loco::output_nodes(const_cast(_graph)); + std::vector output_tensors(output_nodes.size()); + for (size_t i = 0; i < output_nodes.size(); ++i) + { + const auto *node = loco::must_cast(output_nodes[i]); + output_tensors[i] = _node_to_tensor.at(node->from()); + } + _runtime_graph->setOutputTensors(output_tensors); +} + +void GraphLoader::loadOperators() +{ + KernelBuilder kernel_builder(_module_loader, *this); + + // Create kernels for executable nodes. This has to be done in execution order. + for (const loco::Node *loco_node : + loco::postorder_traversal(loco::output_nodes(const_cast(_graph)))) + { + const auto *node = loco::must_cast(loco_node); + + if (isExecutableNode(node)) + { + std::unique_ptr kernel = node->accept(&kernel_builder); + _runtime_to_ir.kernel_to_node.emplace(kernel.get(), node); + _runtime_graph->addKernel(std::move(kernel)); + } + } +} + +void GraphLoader::load() +{ + loadTensors(); + initInputOutputTensors(); + loadOperators(); +} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/loader/GraphLoader.h b/compiler/luci-interpreter/src/loader/GraphLoader.h new file mode 100644 index 0000000..e0adc0f --- /dev/null +++ b/compiler/luci-interpreter/src/loader/GraphLoader.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_LOADER_GRAPHLOADER_H +#define LUCI_INTERPRETER_LOADER_GRAPHLOADER_H + +#include "core/RuntimeGraph.h" +#include "loader/RuntimeToIR.h" + +#include + +#include + +namespace luci_interpreter +{ + +class ModuleLoader; + +class GraphLoader +{ +public: + GraphLoader(const ModuleLoader &module_loader, const loco::Graph *graph, + RuntimeGraph *runtime_graph, RuntimeToIR &runtime_to_ir, + std::unordered_map &node_to_tensor); + + void load(); + + Tensor *getTensorForNode(const loco::Node *node) const { return _node_to_tensor.at(node); } + +private: + void loadOperators(); + void initInputOutputTensors() const; + void loadTensors(); + + const ModuleLoader &_module_loader; + const loco::Graph *_graph; + RuntimeGraph *_runtime_graph; + RuntimeToIR &_runtime_to_ir; + + std::unordered_map &_node_to_tensor; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_LOADER_GRAPHLOADER_H diff --git a/compiler/luci-interpreter/src/loader/KernelBuilder.cpp b/compiler/luci-interpreter/src/loader/KernelBuilder.cpp new file mode 100644 index 0000000..56da961 --- /dev/null +++ b/compiler/luci-interpreter/src/loader/KernelBuilder.cpp @@ -0,0 +1,529 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "loader/KernelBuilder.h" + +#include "kernels/Add.h" +#include "kernels/ArgMax.h" +#include "kernels/AveragePool2D.h" +#include "kernels/Concatenation.h" +#include "kernels/Conv2D.h" +#include "kernels/DepthwiseConv2D.h" +#include "kernels/Elu.h" +#include "kernels/FullyConnected.h" +#include "kernels/If.h" +#include "kernels/L2Normalize.h" +#include "kernels/L2Pool2D.h" +#include "kernels/LeakyRelu.h" +#include "kernels/LocalResponseNormalization.h" +#include "kernels/Logistic.h" +#include "kernels/MaxPool2D.h" +#include "kernels/Mean.h" +#include "kernels/Mul.h" +#include "kernels/Pad.h" +#include "kernels/Reshape.h" +#include "kernels/Softmax.h" +#include "kernels/SpaceToDepth.h" +#include "kernels/Split.h" +#include "kernels/StridedSlice.h" +#include "kernels/Squeeze.h" +#include "kernels/Unpack.h" +#include "kernels/Transpose.h" +#include "kernels/TransposeConv.h" +#include "loader/GraphLoader.h" +#include "loader/ModuleLoader.h" + +#include + +namespace luci_interpreter +{ + +template +static std::vector collectOutputNodes(const luci::CircleNode *node) +{ + std::vector output_nodes; + for (const loco::Node *loco_node : loco::succs(node)) + { + output_nodes.push_back(loco::must_cast(loco_node)); + } + std::sort(output_nodes.begin(), output_nodes.end(), + [](const CircleNodeOut *node1, const CircleNodeOut *node2) { + return node1->index() < node2->index(); + }); + return {output_nodes.cbegin(), output_nodes.cend()}; +} + +const Tensor *KernelBuilder::getInputTensor(const loco::Node *node) const +{ + const Tensor *tensor = _graph_loader.getTensorForNode(node); + assert(tensor != nullptr); + return tensor; +} + +const Tensor *KernelBuilder::getOptionalInputTensor(const loco::Node *node) const +{ + // TODO Revise this when optional inputs are implemented in the IR. + return getInputTensor(node); +} + +Tensor *KernelBuilder::getOutputTensor(const loco::Node *node) const +{ + Tensor *tensor = _graph_loader.getTensorForNode(node); + assert(tensor != nullptr); + return tensor; +} + +std::vector +KernelBuilder::getOutputTensors(const std::vector &nodes) const +{ + std::vector tensors; + tensors.reserve(nodes.size()); + for (const loco::Node *node : nodes) + tensors.push_back(getOutputTensor(node)); + return tensors; +} + +RuntimeGraph *KernelBuilder::getRuntimeGraph(const loco::Graph *graph) const +{ + RuntimeGraph *runtime_graph = _module_loader.getRuntimeGraph(graph); + assert(runtime_graph != nullptr); + return runtime_graph; +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleAdd *node) +{ + assert(node->arity() == 2); + + const Tensor *input1 = getInputTensor(node->x()); + const Tensor *input2 = getInputTensor(node->y()); + Tensor *output = getOutputTensor(node); + + AddParams params{}; + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input1, input2, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleArgMax *node) +{ + assert(node->arity() == 2); + const Tensor *input1 = getInputTensor(node->input()); + const Tensor *input2 = getInputTensor(node->dimension()); + Tensor *output = getOutputTensor(node); + + ArgMaxParams params{}; + params.output_type = node->output_type(); + + return std::make_unique(input1, input2, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleAveragePool2D *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->value()); + Tensor *output = getOutputTensor(node); + + Pool2DParams params{}; + params.padding = node->padding(); + params.filter_height = node->filter()->h(); + params.filter_width = node->filter()->w(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleConcatenation *node) +{ + std::vector inputs(node->numValues()); + for (uint32_t i = 0; i < node->numValues(); ++i) + { + inputs[i] = getInputTensor(node->values(i)); + } + Tensor *output = getOutputTensor(node); + + ConcatenationParams params{}; + params.axis = node->axis(); + + return std::make_unique(std::move(inputs), output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleConst *) +{ + throw std::runtime_error("Const node cannot be executed."); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleConv2D *node) +{ + assert(node->arity() == 3); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *filter = getInputTensor(node->filter()); + const Tensor *bias = getInputTensor(node->bias()); + Tensor *output = getOutputTensor(node); + + Conv2DParams params{}; + params.padding = node->padding(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + params.dilation_height_factor = node->dilation()->h(); + params.dilation_width_factor = node->dilation()->w(); + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, filter, bias, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleDepthwiseConv2D *node) +{ + assert(node->arity() == 3); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *filter = getInputTensor(node->filter()); + const Tensor *bias = getInputTensor(node->bias()); + Tensor *output = getOutputTensor(node); + + DepthwiseConv2DParams params{}; + params.padding = node->padding(); + params.depth_multiplier = node->depthMultiplier(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + params.dilation_height_factor = node->dilation()->h(); + params.dilation_width_factor = node->dilation()->w(); + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, filter, bias, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleElu *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->features()); + Tensor *output = getOutputTensor(node); + + return std::make_unique(input, output); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleFullyConnected *node) +{ + assert(node->arity() == 3); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *filter = getInputTensor(node->weights()); + const Tensor *bias = getOptionalInputTensor(node->bias()); + Tensor *output = getOutputTensor(node); + + FullyConnectedParams params{}; + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, filter, bias, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleIf *node) +{ + auto output_nodes = collectOutputNodes(node); + assert(node->arity() == 1 + node->input_count()); + assert(output_nodes.size() == static_cast(node->output_count())); + + const Tensor *cond = getInputTensor(node->cond()); + std::vector inputs(node->input_count()); + for (uint32_t i = 0; i < node->input_count(); ++i) + { + inputs[i] = getInputTensor(node->input(i)); + } + std::vector outputs = getOutputTensors(output_nodes); + + RuntimeGraph *then_graph = getRuntimeGraph(node->then_graph()); + RuntimeGraph *else_graph = getRuntimeGraph(node->else_graph()); + + return std::make_unique(cond, std::move(inputs), std::move(outputs), then_graph, + else_graph); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleL2Normalize *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->x()); + Tensor *output = getOutputTensor(node); + + L2NormParams params{}; + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleL2Pool2D *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->value()); + Tensor *output = getOutputTensor(node); + + Pool2DParams params{}; + params.padding = node->padding(); + params.filter_height = node->filter()->h(); + params.filter_width = node->filter()->w(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleLeakyRelu *node) +{ + assert(node->arity() == 1); + const Tensor *input = getInputTensor(node->features()); + Tensor *output = getOutputTensor(node); + + LeakyReluParams params{}; + params.alpha = node->alpha(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleLocalResponseNormalization *node) +{ + assert(node->arity() == 1); + const Tensor *input = getInputTensor(node->input()); + Tensor *output = getOutputTensor(node); + + LocalResponseNormalizationParams params{}; + params.radius = node->radius(); + params.bias = node->bias(); + params.alpha = node->alpha(); + params.beta = node->beta(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleLogistic *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->x()); + Tensor *output = getOutputTensor(node); + + return std::make_unique(input, output); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleInput *) +{ + throw std::runtime_error("Input node cannot be executed."); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleMaxPool2D *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->value()); + Tensor *output = getOutputTensor(node); + + Pool2DParams params{}; + params.padding = node->padding(); + params.filter_height = node->filter()->h(); + params.filter_width = node->filter()->w(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleMean *node) +{ + assert(node->arity() == 2); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *axes = getInputTensor(node->reduction_indices()); + Tensor *output = getOutputTensor(node); + + ReducerParams params{}; + params.keep_dims = node->keep_dims(); + + return std::make_unique(input, axes, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleMul *node) +{ + assert(node->arity() == 2); + + const Tensor *input1 = getInputTensor(node->x()); + const Tensor *input2 = getInputTensor(node->y()); + Tensor *output = getOutputTensor(node); + + MulParams params{}; + params.activation = node->fusedActivationFunction(); + + return std::make_unique(input1, input2, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleOutput *) +{ + throw std::runtime_error("Output node cannot be executed."); +} + +std::unique_ptr KernelBuilder::visit(const luci::CirclePad *node) +{ + assert(node->arity() == 2); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *paddings = getInputTensor(node->paddings()); + Tensor *output = getOutputTensor(node); + + return std::make_unique(input, paddings, output); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleReshape *node) +{ + assert(node->arity() == 2); + + const Tensor *input = getInputTensor(node->tensor()); + const Tensor *shape = getInputTensor(node->shape()); + Tensor *output = getOutputTensor(node); + + // NOTE 'newShape' attribute is ignored. + return std::make_unique(input, shape, output); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleSoftmax *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->logits()); + Tensor *output = getOutputTensor(node); + + SoftmaxParams params{}; + params.beta = node->beta(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleSpaceToDepth *node) +{ + assert(node->arity() == 1); + const Tensor *input = getInputTensor(node->input()); + + Tensor *output = getOutputTensor(node); + + SpaceToDepthParams params{}; + params.block_size = node->block_size(); + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleSplit *node) +{ + auto output_nodes = collectOutputNodes(node); + assert(node->arity() == 2); + assert(output_nodes.size() == static_cast(node->num_split())); + + const Tensor *axis = getInputTensor(node->split_dim()); + const Tensor *input = getInputTensor(node->input()); + std::vector outputs = getOutputTensors(output_nodes); + + // NOTE 'num_splits' attribute is ignored. + return std::make_unique(axis, input, std::move(outputs)); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleStridedSlice *node) +{ + assert(node->arity() == 4); + + const Tensor *input = getInputTensor(node->input()); + const Tensor *begin = getInputTensor(node->begin()); + const Tensor *end = getInputTensor(node->end()); + const Tensor *strides = getInputTensor(node->strides()); + + Tensor *output = getOutputTensor(node); + + StridedSliceParams params{}; + params.begin_mask = node->begin_mask(); + params.ellipsis_mask = node->ellipsis_mask(); + params.end_mask = node->end_mask(); + params.new_axis_mask = node->new_axis_mask(); + params.shrink_axis_mask = node->shrink_axis_mask(); + + return std::make_unique(input, begin, end, strides, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleSqueeze *node) +{ + assert(node->arity() == 1); + + const Tensor *input = getInputTensor(node->input()); + Tensor *output = getOutputTensor(node); + + SqueezeParams params{}; + assert(node->squeeze_dims().size() <= 4); + for (size_t i = 0; i < node->squeeze_dims().size(); i++) + { + params.squeeze_dims.push_back(node->squeeze_dims().at(i)); + } + + return std::make_unique(input, output, params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleTransposeConv *node) +{ + assert(node->arity() == 3); + + const Tensor *input_sizes = getInputTensor(node->inputSizes()); + const Tensor *filter = getInputTensor(node->filter()); + const Tensor *out_backprop = getInputTensor(node->outBackprop()); + + Tensor *output = getOutputTensor(node); + + TransposeConvParams params{}; + params.padding = node->padding(); + params.stride_height = node->stride()->h(); + params.stride_width = node->stride()->w(); + + return std::make_unique(input_sizes, filter, out_backprop, output, + params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleUnpack *node) +{ + auto output_nodes = collectOutputNodes(node); + assert(node->arity() == 1); + assert(output_nodes.size() == static_cast(node->num())); + + const Tensor *input = getInputTensor(node->value()); + std::vector outputs = getOutputTensors(output_nodes); + + UnpackParams params{}; + params.axis = node->axis(); + + // NOTE 'num' attribute is ignored. + return std::make_unique(input, std::move(outputs), params); +} + +std::unique_ptr KernelBuilder::visit(const luci::CircleTranspose *node) +{ + assert(node->arity() == 2); + + const Tensor *input = getInputTensor(node->a()); + const Tensor *perm = getInputTensor(node->perm()); + Tensor *output = getOutputTensor(node); + + return std::make_unique(input, perm, output); +} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/loader/KernelBuilder.h b/compiler/luci-interpreter/src/loader/KernelBuilder.h new file mode 100644 index 0000000..7e30d39 --- /dev/null +++ b/compiler/luci-interpreter/src/loader/KernelBuilder.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_LOADER_KERNELBUILDER_H +#define LUCI_INTERPRETER_LOADER_KERNELBUILDER_H + +#include "core/Kernel.h" +#include "core/RuntimeGraph.h" + +#include + +#include +#include + +namespace luci_interpreter +{ + +class GraphLoader; +class ModuleLoader; + +class KernelBuilder : public luci::CircleNodeVisitor> +{ +public: + KernelBuilder(const ModuleLoader &module_loader, const GraphLoader &graph_loader) + : _module_loader(module_loader), _graph_loader(graph_loader) + { + } + + std::unique_ptr visit(const luci::CircleAdd *node) override; + std::unique_ptr visit(const luci::CircleArgMax *node) override; + std::unique_ptr visit(const luci::CircleAveragePool2D *node) override; + std::unique_ptr visit(const luci::CircleConcatenation *node) override; + std::unique_ptr visit(const luci::CircleConv2D *node) override; + std::unique_ptr visit(const luci::CircleConst *node) override; + std::unique_ptr visit(const luci::CircleDepthwiseConv2D *node) override; + std::unique_ptr visit(const luci::CircleElu *node) override; + std::unique_ptr visit(const luci::CircleFullyConnected *node) override; + std::unique_ptr visit(const luci::CircleIf *node) override; + std::unique_ptr visit(const luci::CircleL2Normalize *node) override; + std::unique_ptr visit(const luci::CircleL2Pool2D *node) override; + std::unique_ptr visit(const luci::CircleLeakyRelu *node) override; + std::unique_ptr visit(const luci::CircleLocalResponseNormalization *node) override; + std::unique_ptr visit(const luci::CircleLogistic *node) override; + std::unique_ptr visit(const luci::CircleInput *node) override; + std::unique_ptr visit(const luci::CircleMaxPool2D *node) override; + std::unique_ptr visit(const luci::CircleMean *node) override; + std::unique_ptr visit(const luci::CircleMul *node) override; + std::unique_ptr visit(const luci::CircleOutput *node) override; + std::unique_ptr visit(const luci::CirclePad *node) override; + std::unique_ptr visit(const luci::CircleReshape *node) override; + std::unique_ptr visit(const luci::CircleSoftmax *node) override; + std::unique_ptr visit(const luci::CircleSpaceToDepth *node) override; + std::unique_ptr visit(const luci::CircleSplit *node) override; + std::unique_ptr visit(const luci::CircleStridedSlice *node) override; + std::unique_ptr visit(const luci::CircleSqueeze *node) override; + std::unique_ptr visit(const luci::CircleTranspose *node) override; + std::unique_ptr visit(const luci::CircleTransposeConv *node) override; + std::unique_ptr visit(const luci::CircleUnpack *node) override; + +private: + const Tensor *getInputTensor(const loco::Node *node) const; + + const Tensor *getOptionalInputTensor(const loco::Node *node) const; + + Tensor *getOutputTensor(const loco::Node *node) const; + + std::vector getOutputTensors(const std::vector &nodes) const; + + RuntimeGraph *getRuntimeGraph(const loco::Graph *graph) const; + +private: + const ModuleLoader &_module_loader; + const GraphLoader &_graph_loader; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_LOADER_KERNELBUILDER_H diff --git a/compiler/luci-interpreter/src/loader/ModuleLoader.cpp b/compiler/luci-interpreter/src/loader/ModuleLoader.cpp new file mode 100644 index 0000000..7780a61 --- /dev/null +++ b/compiler/luci-interpreter/src/loader/ModuleLoader.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ModuleLoader.h" + +#include "GraphLoader.h" + +namespace luci_interpreter +{ + +ModuleLoader::ModuleLoader(const luci::Module *module, RuntimeModule *runtime_module, + RuntimeToIR &runtime_to_ir, + std::unordered_map &node_to_tensor) + : _module(module), _runtime_module(runtime_module), _runtime_to_ir(runtime_to_ir), + _node_to_tensor(node_to_tensor) +{ +} + +void ModuleLoader::load() +{ + // Runtime graphs have to be created in advance, because they will be needed during the loading + // process for control flow nodes. + for (size_t i = 0; i < _module->size(); ++i) + { + _graph_to_runtime_graph.emplace(_module->graph(i), _runtime_module->addGraph()); + } + for (size_t i = 0; i < _module->size(); ++i) + { + const loco::Graph *graph = _module->graph(i); + RuntimeGraph *runtime_graph = _graph_to_runtime_graph.at(graph); + GraphLoader loader(*this, graph, runtime_graph, _runtime_to_ir, _node_to_tensor); + loader.load(); + } +} + +} // namespace luci_interpreter diff --git a/compiler/luci-interpreter/src/loader/ModuleLoader.h b/compiler/luci-interpreter/src/loader/ModuleLoader.h new file mode 100644 index 0000000..954dbfb --- /dev/null +++ b/compiler/luci-interpreter/src/loader/ModuleLoader.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_LOADER_MODULELOADER_H +#define LUCI_INTERPRETER_LOADER_MODULELOADER_H + +#include "core/RuntimeModule.h" +#include "loader/RuntimeToIR.h" + +#include + +#include + +namespace luci_interpreter +{ + +class ModuleLoader +{ +public: + ModuleLoader(const luci::Module *module, RuntimeModule *runtime_module, + RuntimeToIR &runtime_to_ir, + std::unordered_map &node_to_tensor); + + void load(); + + RuntimeGraph *getRuntimeGraph(const loco::Graph *graph) const + { + return _graph_to_runtime_graph.at(graph); + } + +private: + const luci::Module *_module; + RuntimeModule *_runtime_module; + RuntimeToIR &_runtime_to_ir; + std::unordered_map &_node_to_tensor; + std::unordered_map _graph_to_runtime_graph; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_LOADER_MODULELOADER_H diff --git a/compiler/luci-interpreter/src/loader/RuntimeToIR.h b/compiler/luci-interpreter/src/loader/RuntimeToIR.h new file mode 100644 index 0000000..9ea8b1f --- /dev/null +++ b/compiler/luci-interpreter/src/loader/RuntimeToIR.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LUCI_INTERPRETER_LOADER_RUNTIMETOIR_H +#define LUCI_INTERPRETER_LOADER_RUNTIMETOIR_H + +#include "luci_interpreter/core/Tensor.h" + +#include + +#include + +namespace luci_interpreter +{ + +// Maps runtime entities back to IR entities. It is used to implement observing functionality. +struct RuntimeToIR +{ + std::unordered_map tensor_to_node; + std::unordered_map kernel_to_node; +}; + +} // namespace luci_interpreter + +#endif // LUCI_INTERPRETER_LOADER_RUNTIMETOIR_H diff --git a/compiler/luci-value-test/CMakeLists.txt b/compiler/luci-value-test/CMakeLists.txt new file mode 100644 index 0000000..3a5c42b --- /dev/null +++ b/compiler/luci-value-test/CMakeLists.txt @@ -0,0 +1,25 @@ +unset(LUCI_VALUE_TESTS) + +macro(addeval NAME) + list(APPEND LUCI_VALUE_TESTS ${NAME}) +endmacro(addeval) + +# Read "test.lst" +include("test.lst") +# Read "test.local.lst" if exists +include("test.local.lst" OPTIONAL) + +# Generate dependencies +add_custom_target(luci_eval_testfiles ALL DEPENDS ${TESTFILES}) + +add_subdirectory(tester) + +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + +add_test(NAME luci_value_test + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/evalverify.sh" + "${CMAKE_CURRENT_BINARY_DIR}" + "${ARTIFACTS_BIN_PATH}" + "${NNCC_OVERLAY_DIR}/venv_1_13_2" + ${LUCI_VALUE_TESTS} +) diff --git a/compiler/luci-value-test/README.md b/compiler/luci-value-test/README.md new file mode 100644 index 0000000..90e9283 --- /dev/null +++ b/compiler/luci-value-test/README.md @@ -0,0 +1,15 @@ +# luci-value-test + +`luci-value-test` validates luci IR graph model file (.circle) + +The test proceeds as follows + +Step 1: Generate tflite files and circle files from TFLite recipes (listsed in test.lst). +"TFLite recipe" -> tflchef -> "tflite file" -> tflite2circle -> "circle file" + +Step 2: Run TFLite interpreter and luci-interpreter for the generated tflite and circle, respectively. +(with the same input tensors filled with random values) +circle file -> luci-interpreter -------> Execution result 1 +tflite file -> TFLite interpreter -----> Execution result 2 + +Step 3: Compare the execution result 1 and 2. The result must be the same. diff --git a/compiler/luci-value-test/evalverify.sh b/compiler/luci-value-test/evalverify.sh new file mode 100755 index 0000000..dfd55a6 --- /dev/null +++ b/compiler/luci-value-test/evalverify.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# This script verifies the basic behavior of luci interpreter +# +# HOW TO USE +# +# ./evalverify.sh ... +# work_dir : build directory of luci-value-test (ex: build/compiler/luci-value-test) + +VERIFY_SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +VERIFY_SCRIPT_PATH="${VERIFY_SOURCE_PATH}/luci_eval_verifier.py" +BINDIR="$1"; shift +WORKDIR="$1"; shift +VIRTUALENV="$1"; shift +INTERPRETER_DRIVER_PATH="${BINDIR}/tester/luci_eval_tester" + +TESTED=() +PASSED=() +FAILED=() + +for TESTCASE in "$@"; do + TESTED+=("${TESTCASE}") + + TESTCASE_FILE="${WORKDIR}/${TESTCASE}" + TEST_RESULT_FILE="${BINDIR}/${TESTCASE}" + + PASSED_TAG="${TEST_RESULT_FILE}.passed" + rm -f "${PASSED_TAG}" + + cat > "${TEST_RESULT_FILE}.log" <( + exec 2>&1 + set -ex + + source "${VIRTUALENV}/bin/activate" + "${VIRTUALENV}/bin/python" "${VERIFY_SCRIPT_PATH}" \ + --driver "${INTERPRETER_DRIVER_PATH}" \ + --model "${TESTCASE_FILE}" + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("${TESTCASE}") + else + FAILED+=("${TESTCASE}") + fi +done + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/luci-value-test/luci_eval_verifier.py b/compiler/luci-value-test/luci_eval_verifier.py new file mode 100755 index 0000000..6999110 --- /dev/null +++ b/compiler/luci-value-test/luci_eval_verifier.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +import numpy as np +import tensorflow as tf +import subprocess +import argparse +import traceback + +# +# This script compares the execution result of luci-interpreter with that of TFLite interpreter +# +# Basic usage: +# eval_verifier.py --driver build/compiler/luci-value-test/tester/luci_eval_tester +# --model inception_v3 +parser = argparse.ArgumentParser() +parser.add_argument('--driver', type=str, required=True) +parser.add_argument('--model', type=str, required=True) +args = parser.parse_args() + +driver = args.driver +tflite_model = args.model + ".tflite" +circle_model = args.model + ".circle" + +# Build TFLite interpreter. +interpreter = tf.lite.Interpreter(tflite_model) +interpreter.allocate_tensors() + +# Generate random input data. +num_inputs = len(interpreter.get_input_details()) +for i in range(num_inputs): + input_details = interpreter.get_input_details()[i] + if input_details["dtype"] == np.float32: + input_data = np.array( + np.random.random_sample(input_details["shape"]), input_details["dtype"]) + elif input_details["dtype"] == np.uint8: + input_data = np.array( + np.random.randint(0, 256, size=input_details["shape"]), + input_details["dtype"]) + else: + raise SystemExit("Unsupported input dtype") + + interpreter.set_tensor(input_details["index"], input_data) + input_data.tofile(circle_model + ".input" + str(i)) + +# Do inference +interpreter.invoke() + +# Get reference output data. +assert len(interpreter.get_output_details()) == 1 # TODO: Support multiple outputs +output_details = interpreter.get_output_details()[0] +ref_output_data = interpreter.get_tensor(output_details["index"]) + +# Execute luci interpreter. +subprocess.run( + [ + driver, circle_model, + str(num_inputs), circle_model + ".input", circle_model + ".output" + ], + check=True) +output_data = np.fromfile(circle_model + ".output", output_details["dtype"]) +shape_file = open(circle_model + ".output.shape", 'r') +output_shape = [int(i) for i in shape_file.read().split(',')] +shape_file.close() +luci_output_data = np.reshape(output_data, output_shape) + +# Compare the results. +try: + if output_details["dtype"] == np.uint8: + if np.allclose(luci_output_data, ref_output_data, rtol=0, atol=0) == False: + raise SystemExit("Execution result of " + tflite_model + + " does not match with " + circle_model) + elif output_details["dtype"] == np.float32: + if np.allclose( + luci_output_data, ref_output_data, rtol=1.e-5, atol=1.e-5) == False: + raise SystemExit("Execution result of " + tflite_model + + " does not match with " + circle_model) + else: + raise SystemExit("Unsupported data type: ", output_details["dtype"]) +except: + print(traceback.format_exc()) + quit(255) + +quit(0) diff --git a/compiler/luci-value-test/requires.cmake b/compiler/luci-value-test/requires.cmake new file mode 100644 index 0000000..f8af5f2 --- /dev/null +++ b/compiler/luci-value-test/requires.cmake @@ -0,0 +1,6 @@ +require("common-artifacts") +require("luci") +require("luci-interpreter") +require("safemain") +require("oops") +require("loco") diff --git a/compiler/luci-value-test/test.lst b/compiler/luci-value-test/test.lst new file mode 100644 index 0000000..6a332f9 --- /dev/null +++ b/compiler/luci-value-test/test.lst @@ -0,0 +1,81 @@ +#addeval(Abs_000) +addeval(Add_000) +addeval(Add_U8_000) +#addeval(ArgMax_000) +#addeval(ArgMax_001) +#addeval(ArgMax_002) +#addeval(ArgMax_003) +#addeval(ArgMax_U8_000) +#addeval(ArgMax_U8_001) +#addeval(ArgMax_U8_002) +#addeval(ArgMax_U8_003) +addeval(AveragePool2D_000) +#addeval(BatchMatMulV2_000) +#addeval(BatchMatMulV2_001) +#addeval(BatchToSpaceND_000) +#addeval(Cast_000) +addeval(Concatenation_000) +addeval(Concatenation_U8_000) +addeval(Conv2D_000) +addeval(Conv2D_001) +addeval(Conv2D_002) +addeval(Conv2D_U8_000) +addeval(Conv2D_U8_001) +#addeval(Cos_000) +addeval(DepthwiseConv2D_000) +addeval(DepthwiseConv2D_U8_000) +#addeval(Div_000) +#addeval(Equal_000) +#addeval(Exp_000) +addeval(FullyConnected_000) +addeval(FullyConnected_001) +#addeval(FullyConnected_002) +#addeval(FullyConnected_U8_000) +#addeval(Gather_000) +#addeval(If_000) +#addeval(If_001) +#addeval(LogicalNot_000) +#addeval(LogicalOr_000) +#addeval(Logistic_000) +addeval(MaxPool2D_000) +addeval(MaxPool2D_U8_000) +addeval(Mean_000) +addeval(Mean_001) +addeval(Mean_U8_000) +addeval(Mul_000) +#addeval(Mul_U8_000) +#addeval(Pack_000) +#addeval(Pack_U8_000) +addeval(Pad_000) +addeval(Pad_U8_000) +#addeval(ReduceProd_000) +#addeval(ReduceProd_001) +#addeval(ReduceProd_002) +#addeval(ReduceProd_003) +#addeval(ReLU_000) +addeval(Reshape_000) +addeval(Reshape_001) +addeval(Reshape_002) +#addeval(Reshape_003) +addeval(Reshape_U8_000) +#addeval(Rsqrt_000) +#addeval(Sin_000) +addeval(Softmax_000) +#addeval(Softmax_U8_000) +#addeval(SpaceToBatchND_000) +#addeval(SpaceToBatchND_001) +#addeval(SpaceToBatchND_002) +#addeval(SpaceToBatchND_003) +#addeval(StridedSlice_000) +#addeval(StridedSlice_001) +#addeval(Sub_000) +#addeval(Sub_U8_000) +#addeval(Tanh_000) +#addeval(Tile_000) +#addeval(Tile_U8_000) +#addeval(Transpose_000) +#addeval(Unpack_000) +#addeval(Unpack_001) +#addeval(Unpack_002) +#addeval(While_000) +#addeval(While_001) diff --git a/compiler/luci-value-test/tester/CMakeLists.txt b/compiler/luci-value-test/tester/CMakeLists.txt new file mode 100644 index 0000000..f3b6dfc --- /dev/null +++ b/compiler/luci-value-test/tester/CMakeLists.txt @@ -0,0 +1,15 @@ + +set(SRCS_EVAL_TESTER + src/EvalTester.cpp + src/CircleExpContract.h + src/CircleExpContract.cpp + ) + +add_executable(luci_eval_tester ${SRCS_EVAL_TESTER}) +target_link_libraries(luci_eval_tester PRIVATE oops) +target_link_libraries(luci_eval_tester PRIVATE loco) +target_link_libraries(luci_eval_tester PRIVATE luci_import) +target_link_libraries(luci_eval_tester PRIVATE luci_export) +target_link_libraries(luci_eval_tester PRIVATE luci_lang) +target_link_libraries(luci_eval_tester PRIVATE luci_interpreter) +target_link_libraries(luci_eval_tester PRIVATE safemain) diff --git a/compiler/luci-value-test/tester/src/CircleExpContract.cpp b/compiler/luci-value-test/tester/src/CircleExpContract.cpp new file mode 100644 index 0000000..b56b7ee --- /dev/null +++ b/compiler/luci-value-test/tester/src/CircleExpContract.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleExpContract.h" + +#include + +#include +#include + +bool CircleExpContract::store(const char *ptr, const size_t size) const +{ + if (!ptr) + INTERNAL_EXN("Graph was not serialized by FlatBuffer for some reason"); + + std::ofstream fs(_filepath.c_str(), std::ofstream::binary); + fs.write(ptr, size); + + return fs.good(); +} diff --git a/compiler/luci-value-test/tester/src/CircleExpContract.h b/compiler/luci-value-test/tester/src/CircleExpContract.h new file mode 100644 index 0000000..4d08fb8 --- /dev/null +++ b/compiler/luci-value-test/tester/src/CircleExpContract.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_VALUE_TEST_CIRCLEXPCONTRACT_H__ +#define __LUCI_VALUE_TEST_CIRCLEXPCONTRACT_H__ + +#include +#include +#include + +#include +#include + +struct CircleExpContract : public luci::CircleExporter::Contract +{ +public: + CircleExpContract(luci::Module *module, const std::string &filename) + : _module(module), _filepath(filename) + { + // NOTHING TO DO + } + virtual ~CircleExpContract() = default; + +public: + loco::Graph *graph(void) const final { return nullptr; } + luci::Module *module(void) const final { return _module; }; + +public: + bool store(const char *ptr, const size_t size) const final; + +private: + luci::Module *_module; + const std::string _filepath; +}; + +#endif // __LUCI_VALUE_TEST_CIRCLEXPCONTRACT_H__ diff --git a/compiler/luci-value-test/tester/src/EvalTester.cpp b/compiler/luci-value-test/tester/src/EvalTester.cpp new file mode 100644 index 0000000..58f62f5 --- /dev/null +++ b/compiler/luci-value-test/tester/src/EvalTester.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleExpContract.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + +void readDataFromFile(const std::string &filename, char *data, size_t data_size) +{ + std::ifstream fs(filename, std::ifstream::binary); + if (fs.fail()) + throw std::runtime_error("Cannot open file \"" + filename + "\".\n"); + if (fs.read(data, data_size).fail()) + throw std::runtime_error("Failed to read data from file \"" + filename + "\".\n"); +} + +void writeDataToFile(const std::string &filename, const char *data, size_t data_size) +{ + std::ofstream fs(filename, std::ofstream::binary); + if (fs.fail()) + throw std::runtime_error("Cannot open file \"" + filename + "\".\n"); + if (fs.write(data, data_size).fail()) + { + throw std::runtime_error("Failed to write data to file \"" + filename + "\".\n"); + } +} + +std::unique_ptr importModel(const std::string &filename) +{ + std::ifstream fs(filename, std::ifstream::binary); + if (fs.fail()) + { + throw std::runtime_error("Cannot open model file \"" + filename + "\".\n"); + } + std::vector model_data((std::istreambuf_iterator(fs)), + std::istreambuf_iterator()); + return luci::Importer().importModule(circle::GetModel(model_data.data())); +} + +template size_t getTensorSize(const NodeT *node) +{ + uint32_t tensor_size = loco::size(node->dtype()); + for (uint32_t i = 0; i < node->rank(); ++i) + tensor_size *= node->dim(i).value(); + return tensor_size; +} + +} // namespace + +/* + * @brief EvalTester main + * + * Driver for testing luci-inerpreter + * + */ +int entry(int argc, char **argv) +{ + if (argc != 5) + { + std::cerr + << "Usage: " << argv[0] + << " \n"; + return EXIT_FAILURE; + } + + const char *filename = argv[1]; + const int32_t num_inputs = atoi(argv[2]); + const char *input_prefix = argv[3]; + const char *output_file = argv[4]; + const std::string intermediate_filename = std::string(filename) + ".inter.circle"; + + // Load model from the file + std::unique_ptr initial_module = importModel(filename); + if (initial_module == nullptr) + { + std::cerr << "ERROR: Failed to load '" << filename << "'" << std::endl; + return EXIT_FAILURE; + } + + // Export to a Circle file + luci::CircleExporter exporter; + CircleExpContract contract(initial_module.get(), intermediate_filename); + if (!exporter.invoke(&contract)) + { + std::cerr << "ERROR: Failed to export '" << intermediate_filename << "'" << std::endl; + return EXIT_FAILURE; + } + + // Import model again + std::unique_ptr module = importModel(intermediate_filename); + if (module == nullptr) + { + std::cerr << "ERROR: Failed to load '" << intermediate_filename << "'" << std::endl; + return EXIT_FAILURE; + } + + // Create interpreter. + luci_interpreter::Interpreter interpreter(module.get()); + + // Set input. + // Data for n'th input is read from ${input_prefix}n + // (ex: Add.circle.input0, Add.circle.input1 ..) + const auto input_nodes = loco::input_nodes(module->graph()); + assert(num_inputs == input_nodes.size()); + for (int32_t i = 0; i < num_inputs; i++) + { + const auto *input_node = dynamic_cast(input_nodes[i]); + std::vector input_data(getTensorSize(input_node)); + readDataFromFile(std::string(input_prefix) + std::to_string(i), input_data.data(), + input_data.size()); + interpreter.writeInputTensor(input_node, input_data.data(), input_data.size()); + } + + // Do inference. + interpreter.interpret(); + + // Get output. + const auto output_nodes = loco::output_nodes(module->graph()); + // TODO: Support multiple outputs + assert(output_nodes.size() == 1); + const auto *output_node = dynamic_cast(output_nodes[0]); + std::vector output_data(getTensorSize(output_node)); + interpreter.readOutputTensor(output_node, output_data.data(), output_data.size()); + + // Output data is written in ${output_file} + // (ex: Add.circle.output) + // Output shape is written in ${output_file}.shape + // (ex: Add.circle.output.shape) + // TODO: Use HDF5 file format + writeDataToFile(output_file, output_data.data(), output_data.size()); + auto shape_str = std::to_string(output_node->dim(0).value()); + for (int i = 1; i < output_node->rank(); i++) + { + shape_str += ","; + shape_str += std::to_string(output_node->dim(i).value()); + } + writeDataToFile(std::string(output_file) + ".shape", shape_str.c_str(), shape_str.size()); + return EXIT_SUCCESS; +} diff --git a/compiler/luci/CMakeLists.txt b/compiler/luci/CMakeLists.txt index 387c224..214a1bb 100644 --- a/compiler/luci/CMakeLists.txt +++ b/compiler/luci/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(env) add_subdirectory(log) add_subdirectory(lang) add_subdirectory(service) diff --git a/compiler/luci/env/CMakeLists.txt b/compiler/luci/env/CMakeLists.txt new file mode 100644 index 0000000..3d8387a --- /dev/null +++ b/compiler/luci/env/CMakeLists.txt @@ -0,0 +1,18 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") +file(GLOB_RECURSE TESTS "src/*.test.cpp") +list(REMOVE_ITEM SOURCES ${TESTS}) + +add_library(luci_env SHARED ${SOURCES}) +target_include_directories(luci_env PUBLIC include) +target_link_libraries(luci_env PRIVATE nncc_common) +install(TARGETS luci_env DESTINATION lib) + +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +nnas_find_package(GTest REQUIRED) + +GTest_AddTest(luci_env_test ${TESTS}) +target_include_directories(luci_env_test PRIVATE src) +target_link_libraries(luci_env_test luci_env) diff --git a/compiler/luci/env/README.md b/compiler/luci/env/README.md new file mode 100644 index 0000000..cda0078 --- /dev/null +++ b/compiler/luci/env/README.md @@ -0,0 +1,3 @@ +# luci-env + +_luci-env_ provides user environment settings that control _luci_ diff --git a/compiler/luci/env/include/luci/UserSettings.h b/compiler/luci/env/include/luci/UserSettings.h new file mode 100644 index 0000000..bcfd160 --- /dev/null +++ b/compiler/luci/env/include/luci/UserSettings.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_USER_SETTINGS__ +#define __LUCI_USER_SETTINGS__ + +// NOTE Revise the logic if we find a better way not using global status + +namespace luci +{ + +/** + * @brief UserSettings provides user settings by key-value + */ +struct UserSettings +{ + enum Key + { + Undefined, + MuteWarnings, + DisableValidation, + }; + + static UserSettings *settings(); + + virtual void set(const Key key, bool value) = 0; + virtual bool get(const Key key) const = 0; +}; + +} // namespace luci + +#endif // __LUCI_USER_SETTINGS__ diff --git a/compiler/luci/env/src/UserSettings.cpp b/compiler/luci/env/src/UserSettings.cpp new file mode 100644 index 0000000..27dec76 --- /dev/null +++ b/compiler/luci/env/src/UserSettings.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/UserSettings.h" + +#include + +namespace luci +{ + +class UserSettingsImpl : public UserSettings +{ +public: + void set(const Key key, bool value) override; + bool get(const Key key) const override; + +private: + bool _MuteWarnings{false}; + bool _DisableValidation{false}; +}; + +void UserSettingsImpl::set(const Key key, bool value) +{ + switch (key) + { + case Key::MuteWarnings: + _MuteWarnings = value; + break; + case Key::DisableValidation: + _DisableValidation = value; + break; + default: + throw std::runtime_error("Invalid key in boolean set"); + break; + } +} + +bool UserSettingsImpl::get(const Key key) const +{ + switch (key) + { + case Key::MuteWarnings: + return _MuteWarnings; + case Key::DisableValidation: + return _DisableValidation; + default: + throw std::runtime_error("Invalid key in boolean get"); + break; + } + return false; +} + +} // namespace luci + +namespace luci +{ + +UserSettings *UserSettings::settings() +{ + static UserSettingsImpl _this; + return &_this; +} + +} // namespace luci diff --git a/compiler/luci/env/src/UserSettings.test.cpp b/compiler/luci/env/src/UserSettings.test.cpp new file mode 100644 index 0000000..8d9d187 --- /dev/null +++ b/compiler/luci/env/src/UserSettings.test.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/UserSettings.h" + +#include + +TEST(UserSettings, instance) +{ + auto settings = luci::UserSettings::settings(); + ASSERT_NE(nullptr, settings); + + auto s2 = luci::UserSettings::settings(); + ASSERT_EQ(s2, settings); +} + +TEST(UserSettings, MuteWarnings) +{ + auto settings = luci::UserSettings::settings(); + ASSERT_NE(nullptr, settings); + + settings->set(luci::UserSettings::Key::MuteWarnings, false); + ASSERT_FALSE(settings->get(luci::UserSettings::Key::MuteWarnings)); + + settings->set(luci::UserSettings::Key::MuteWarnings, true); + ASSERT_TRUE(settings->get(luci::UserSettings::Key::MuteWarnings)); +} + +TEST(UserSettings, DisableValidation) +{ + auto settings = luci::UserSettings::settings(); + ASSERT_NE(nullptr, settings); + + settings->set(luci::UserSettings::Key::DisableValidation, false); + ASSERT_FALSE(settings->get(luci::UserSettings::Key::DisableValidation)); + + settings->set(luci::UserSettings::Key::DisableValidation, true); + ASSERT_TRUE(settings->get(luci::UserSettings::Key::DisableValidation)); +} + +TEST(UserSettings, undefined_set_NEG) +{ + auto settings = luci::UserSettings::settings(); + ASSERT_NE(nullptr, settings); + + ASSERT_THROW(settings->set(luci::UserSettings::Key::Undefined, true), std::exception); +} + +TEST(UserSettings, undefined_get_NEG) +{ + auto settings = luci::UserSettings::settings(); + ASSERT_NE(nullptr, settings); + + ASSERT_THROW(settings->get(luci::UserSettings::Key::Undefined), std::exception); +} diff --git a/compiler/luci/export/CMakeLists.txt b/compiler/luci/export/CMakeLists.txt index e32eca3..fe4382e 100644 --- a/compiler/luci/export/CMakeLists.txt +++ b/compiler/luci/export/CMakeLists.txt @@ -10,6 +10,7 @@ target_link_libraries(luci_export PRIVATE luci_lang) target_link_libraries(luci_export PRIVATE luci_service) target_link_libraries(luci_export PRIVATE luci_pass) target_link_libraries(luci_export PRIVATE mio_circle) +target_link_libraries(luci_export PRIVATE luci_env) target_link_libraries(luci_export PRIVATE luci_log) target_link_libraries(luci_export PRIVATE luci_logex) target_link_libraries(luci_export PRIVATE nncc_common) diff --git a/compiler/luci/export/src/CircleExporterImpl.cpp b/compiler/luci/export/src/CircleExporterImpl.cpp index 81109ee..860cebf 100644 --- a/compiler/luci/export/src/CircleExporterImpl.cpp +++ b/compiler/luci/export/src/CircleExporterImpl.cpp @@ -16,6 +16,7 @@ #include "CircleExporterImpl.h" #include "Optimize.h" +#include "TypeBridge.h" #include "CircleTensorExporter.h" #include "CircleOperationExporter.h" #include "CircleExporterUtils.h" @@ -36,11 +37,11 @@ luci::CircleInput *input_node(loco::Graph *g, const loco::GraphInputIndex &index { for (uint32_t n = 0; n < g->nodes()->size(); ++n) { - if (auto pull = dynamic_cast(g->nodes()->at(n))) + if (auto input = dynamic_cast(g->nodes()->at(n))) { - if (pull->indexed() && pull->index() == index) + if (input->indexed() && input->index() == index) { - return pull; + return input; } } } @@ -51,11 +52,11 @@ luci::CircleOutput *output_node(loco::Graph *g, const loco::GraphOutputIndex &in { for (uint32_t n = 0; n < g->nodes()->size(); ++n) { - if (auto push = dynamic_cast(g->nodes()->at(n))) + if (auto output = dynamic_cast(g->nodes()->at(n))) { - if (push->indexed() && push->index() == index) + if (output->indexed() && output->index() == index) { - return push; + return output; } } } @@ -80,6 +81,13 @@ void registerGraphOutputTensors(loco::Graph *graph, luci::SubGraphContext &ctx) assert(push != nullptr); auto node = push->from(); assert(node != nullptr); + + // Do not export CircleOutput when it's input is CircleOutputExclude + if (dynamic_cast(push->from()) != nullptr) + { + continue; + } + ctx._outputs.push_back(luci::get_tensor_index(node)); } } @@ -93,8 +101,7 @@ using namespace circle; using namespace flatbuffers; Offset>> -encodeOperatorCodes(FlatBufferBuilder &builder, std::unordered_map &opcodes, - std::unordered_map &custom_opcodes) +encodeOperatorCodes(FlatBufferBuilder &builder, std::unordered_map &opcodes) { std::vector> operator_codes_vec(opcodes.size()); for (auto it : opcodes) @@ -102,19 +109,15 @@ encodeOperatorCodes(FlatBufferBuilder &builder, std::unordered_mapsecond)); + CreateOperatorCode(builder, it.first.opcode, builder.CreateString(it.first.custom_code)); } } + return builder.CreateVector(operator_codes_vec); } @@ -136,8 +139,9 @@ CircleExporterImpl::exportSubgraph(SerializedGraphData &gd) auto inputs = _builder.CreateVector(gd._inputs); auto outputs = _builder.CreateVector(gd._outputs); auto operators = _builder.CreateVector(gd._operators); + auto name = _builder.CreateString(gd._name); auto df = gd._data_format; - auto subgraph = CreateSubGraph(_builder, tensors, inputs, outputs, operators, df); + auto subgraph = CreateSubGraph(_builder, tensors, inputs, outputs, operators, name, df); return subgraph; } @@ -146,6 +150,9 @@ void CircleExporterImpl::exportGraph(loco::Graph *graph) // do graph optimization optimize(graph); + // copy shape/dtype inference data to CircleNode + copy_shape_dtype(graph); + _builder.Clear(); SerializedModelData md; @@ -154,6 +161,9 @@ void CircleExporterImpl::exportGraph(loco::Graph *graph) // This version is taken from comment in fbs constexpr uint32_t version = 0; + // set Subgraph name + gd._name = graph->name(); + // TODO set this value properly gd._data_format = circle::DataFormat::DataFormat_CHANNELS_LAST; @@ -170,8 +180,7 @@ void CircleExporterImpl::exportGraph(loco::Graph *graph) exportNodes(graph, _builder, md, gd); // encode operator codes - auto operator_codes = - encodeOperatorCodes(_builder, md._operator_codes, md._custom_operator_codes); + auto operator_codes = encodeOperatorCodes(_builder, md._operator_codes); // Subgraphs Offset subgraph = exportSubgraph(gd); @@ -203,6 +212,9 @@ void CircleExporterImpl::exportModule(Module *module) _builder.Clear(); + // prepare model data + prepareModelData(_builder, md); + std::vector> subgraph_vec; for (size_t g = 0; g < module->size(); ++g) @@ -211,8 +223,14 @@ void CircleExporterImpl::exportModule(Module *module) optimize(graph); + // copy shape/dtype inference data to CircleNode + copy_shape_dtype(graph); + SerializedGraphData gd; + // set Subgraph name + gd._name = graph->name(); + // TODO set this value properly gd._data_format = circle::DataFormat::DataFormat_CHANNELS_LAST; @@ -233,8 +251,7 @@ void CircleExporterImpl::exportModule(Module *module) auto subgraphs = _builder.CreateVector(std::vector>{subgraph_vec}); // encode operator codes - auto operator_codes = - encodeOperatorCodes(_builder, md._operator_codes, md._custom_operator_codes); + auto operator_codes = encodeOperatorCodes(_builder, md._operator_codes); // Description std::string description_str = "nnpackage"; diff --git a/compiler/luci/export/src/CircleExporterUtils.cpp b/compiler/luci/export/src/CircleExporterUtils.cpp index 1272fac..f097e71 100644 --- a/compiler/luci/export/src/CircleExporterUtils.cpp +++ b/compiler/luci/export/src/CircleExporterUtils.cpp @@ -70,28 +70,49 @@ circle::TensorType to_circle_tensortype(loco::DataType type) } } +circle::MirrorPadMode to_circle_mirrorpadmode(luci::MirrorPadMode mode) +{ + switch (mode) + { + case luci::MirrorPadMode::REFLECT: + return circle::MirrorPadMode::MirrorPadMode_REFLECT; + case luci::MirrorPadMode::SYMMETRIC: + return circle::MirrorPadMode::MirrorPadMode_SYMMETRIC; + default: + INTERNAL_EXN_V("trying to convert unsupported luci::MirrorPadMode", oops::to_uint32(mode)); + } +} + } // namespace luci namespace luci { -uint32_t SerializedModelData::registerBuiltinOpcode(circle::BuiltinOperator builtin_code) +uint32_t SerializedModelData::registerBuiltinOpcode(circle::BuiltinOperator builtin_code, + const int32_t op_version) { - auto it = _operator_codes.find(OpCode{builtin_code}); + assert(op_version > 0); + + auto it = _operator_codes.find(OpCode{builtin_code, "", op_version}); if (it != _operator_codes.end()) { return it->second; } auto idx = static_cast(_operator_codes.size()); - _operator_codes.emplace(OpCode{builtin_code}, idx); + _operator_codes.emplace(OpCode{builtin_code, "", op_version}, idx); return idx; } -uint32_t SerializedModelData::registerCustomOpcode(const std::string &custom_op) +uint32_t SerializedModelData::registerCustomOpcode(const std::string &custom_code) { - circle::BuiltinOperator custom_code = circle::BuiltinOperator_CUSTOM; - auto idx = registerBuiltinOpcode(custom_code); - _custom_operator_codes.emplace(OpCode{custom_code}, custom_op); + const circle::BuiltinOperator builtin_code = circle::BuiltinOperator_CUSTOM; + auto it = _operator_codes.find(OpCode{builtin_code, custom_code}); + if (it != _operator_codes.end()) + { + return it->second; + } + auto idx = static_cast(_operator_codes.size()); + _operator_codes.emplace(OpCode{builtin_code, custom_code}, idx); return idx; } diff --git a/compiler/luci/export/src/CircleExporterUtils.h b/compiler/luci/export/src/CircleExporterUtils.h index 6b970fd..f9ce6d2 100644 --- a/compiler/luci/export/src/CircleExporterUtils.h +++ b/compiler/luci/export/src/CircleExporterUtils.h @@ -31,6 +31,7 @@ namespace luci circle::ActivationFunctionType to_circle_actfunc(luci::FusedActFunc func); circle::TensorType to_circle_tensortype(loco::DataType type); +circle::MirrorPadMode to_circle_mirrorpadmode(luci::MirrorPadMode mode); } // namespace luci diff --git a/compiler/luci/export/src/CircleOperationExporter.cpp b/compiler/luci/export/src/CircleOperationExporter.cpp index ad9c7fd..3c01b67 100644 --- a/compiler/luci/export/src/CircleOperationExporter.cpp +++ b/compiler/luci/export/src/CircleOperationExporter.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -49,42 +51,125 @@ public: public: void visit(luci::CircleAbs *) final; void visit(luci::CircleAdd *) final; + void visit(luci::CircleAddN *) final; void visit(luci::CircleArgMax *) final; + void visit(luci::CircleArgMin *) final; void visit(luci::CircleAveragePool2D *) final; + void visit(luci::CircleBatchMatMul *) final; void visit(luci::CircleBatchToSpaceND *) final; + void visit(luci::CircleCast *) final; + void visit(luci::CircleCeil *) final; void visit(luci::CircleConcatenation *) final; void visit(luci::CircleConst *) final{/* skip, everything is done in exportOpDefinedTensors */}; void visit(luci::CircleConv2D *) final; void visit(luci::CircleCos *) final; + void visit(luci::CircleCustom *) final; + void visit(luci::CircleDepthToSpace *) final; void visit(luci::CircleDepthwiseConv2D *) final; void visit(luci::CircleDiv *) final; - void visit(luci::CircleExp *) final; + void visit(luci::CircleElu *) final; void visit(luci::CircleEqual *) final; + void visit(luci::CircleExp *) final; + void visit(luci::CircleExpandDims *) final; + void visit(luci::CircleFill *) final; + void visit(luci::CircleFloor *) final; + void visit(luci::CircleFloorDiv *) final; + void visit(luci::CircleFloorMod *) final; void visit(luci::CircleFullyConnected *) final; + void visit(luci::CircleGather *) final; + void visit(luci::CircleGatherNd *) final; + void visit(luci::CircleGreater *) final; + void visit(luci::CircleGreaterEqual *) final; + void visit(luci::CircleIf *) final; + void visit(luci::CircleL2Normalize *) final; + void visit(luci::CircleL2Pool2D *) final; + void visit(luci::CircleLeakyRelu *) final; + void visit(luci::CircleLess *) final; + void visit(luci::CircleLessEqual *) final; + void visit(luci::CircleLocalResponseNormalization *) final; + void visit(luci::CircleLog *) final; + void visit(luci::CircleLogicalAnd *) final; void visit(luci::CircleLogicalNot *) final; void visit(luci::CircleLogicalOr *) final; + void visit(luci::CircleLogistic *) final; + void visit(luci::CircleLogSoftmax *) final; + void visit(luci::CircleMatrixDiag *) final; + void visit(luci::CircleMatrixSetDiag *) final; void visit(luci::CircleMaximum *) final; void visit(luci::CircleMaxPool2D *) final; void visit(luci::CircleMean *) final; + void visit(luci::CircleMinimum *) final; + void visit(luci::CircleMirrorPad *) final; void visit(luci::CircleMul *) final; + void visit(luci::CircleNeg *) final; + void visit(luci::CircleNotEqual *) final; + void visit(luci::CircleOneHot *) final; void visit(luci::CirclePack *) final; void visit(luci::CirclePad *) final; + void visit(luci::CirclePow *) final; + void visit(luci::CirclePRelu *) final; + void visit(luci::CircleRange *) final; + void visit(luci::CircleRank *) final; + void visit(luci::CircleReduceAny *) final; + void visit(luci::CircleReduceMax *) final; + void visit(luci::CircleReduceMin *) final; + void visit(luci::CircleReduceProd *) final; void visit(luci::CircleRelu *) final; void visit(luci::CircleRelu6 *) final; + void visit(luci::CircleReluN1To1 *) final; void visit(luci::CircleReshape *) final; + void visit(luci::CircleResizeBilinear *) final; + void visit(luci::CircleResizeNearestNeighbor *) final; + void visit(luci::CircleReverseSequence *) final; + void visit(luci::CircleReverseV2 *) final; + void visit(luci::CircleRound *) final; void visit(luci::CircleRsqrt *) final; + void visit(luci::CircleScatterNd *) final; + void visit(luci::CircleSegmentSum *) final; + void visit(luci::CircleSelect *) final; + void visit(luci::CircleSelectV2 *) final; + void visit(luci::CircleShape *) final; + void visit(luci::CircleSin *) final; + void visit(luci::CircleSlice *) final; void visit(luci::CircleSoftmax *) final; + void visit(luci::CircleSpaceToBatchND *) final; + void visit(luci::CircleSpaceToDepth *) final; + void visit(luci::CircleSparseToDense *) final; + void visit(luci::CircleSplit *) final; + void visit(luci::CircleSplitV *) final; void visit(luci::CircleSqrt *) final; + void visit(luci::CircleSquare *) final; void visit(luci::CircleSquaredDifference *) final; + void visit(luci::CircleSqueeze *) final; + void visit(luci::CircleStridedSlice *) final; void visit(luci::CircleSub *) final; - // TODO CircleTanh + void visit(luci::CircleSum *) final; + void visit(luci::CircleTanh *) final; + void visit(luci::CircleTile *) final; + void visit(luci::CircleTopKV2 *) final; void visit(luci::CircleTranspose *) final; void visit(luci::CircleTransposeConv *) final; + void visit(luci::CircleUnpack *) final; + void visit(luci::CircleWhere *) final; + void visit(luci::CircleWhile *) final; + void visit(luci::CircleZerosLike *) final; // Circle only + void visit(luci::CircleBCQFullyConnected *) final; + void visit(luci::CircleBCQGather *) final; void visit(luci::CircleInstanceNorm *) final; // Virtual void visit(luci::CircleInput *) final {} void visit(luci::CircleOutput *) final {} + void visit(luci::CircleOutputDummy *) final {} + void visit(luci::CircleOutputExclude *) final {} + // Virtual for multiple-outputs + void visit(luci::CircleCustomOut *) final {} + void visit(luci::CircleIfOut *) final {} + void visit(luci::CircleSplitOut *) final {} + void visit(luci::CircleSplitVOut *) final {} + void visit(luci::CircleTopKV2Out *) final {} + void visit(luci::CircleUnpackOut *) final {} + void visit(luci::CircleWhileOut *) final {} private: /** @@ -95,6 +180,17 @@ private: template void export_pool_2d(CirclePool2D *node, circle::BuiltinOperator builtin_op); + /** + * @brief export simple nodes + */ + void export_simple(loco::Node *node, circle::BuiltinOperator bop, circle::BuiltinOptions bot, + flatbuffers::Offset options_offset); + + /** + * @brief export simple nodes having void options + */ + void export_simple(loco::Node *node, circle::BuiltinOperator bop); + private: FlatBufferBuilder &builder; SerializedModelData &md; @@ -105,11 +201,12 @@ template void OperationExporter::export_pool_2d(CirclePool2D *node, circle::BuiltinOperator builtin_op) { LUCI_ASSERT(builtin_op == circle::BuiltinOperator_MAX_POOL_2D || + builtin_op == circle::BuiltinOperator_L2_POOL_2D || builtin_op == circle::BuiltinOperator_AVERAGE_POOL_2D, - "Should be MaxPool or AvgPool"); + "Should be L2Pool, MaxPool or AvgPool"); LUCI_ASSERT(node->padding() != luci::Padding::UNDEFINED, "Padding is not set"); - uint32_t op_idx = md.registerBuiltinOpcode(builtin_op); + uint32_t op_idx = md.registerBuiltinOpcode(builtin_op, node->op_version()); std::vector inputs_vec{get_tensor_index(node->value())}; std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); @@ -125,54 +222,122 @@ void OperationExporter::export_pool_2d(CirclePool2D *node, circle::BuiltinOperat gd._operators.push_back(op_offset); } -void OperationExporter::visit(luci::CircleAbs *node) +void OperationExporter::export_simple(loco::Node *node, circle::BuiltinOperator bop, + circle::BuiltinOptions bot, + flatbuffers::Offset options_offset) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_ABS); - std::vector inputs_vec{get_tensor_index(node->x())}; + uint32_t op_idx = + md.registerBuiltinOpcode(bop, loco::must_cast(node)->op_version()); + std::vector inputs_vec; + std::vector outputs_vec{get_tensor_index(node)}; + for (uint32_t i = 0; i < node->arity(); ++i) + inputs_vec.push_back(get_tensor_index(node->arg(i))); + auto inputs = builder.CreateVector(inputs_vec); + auto outputs = builder.CreateVector(outputs_vec); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, bot, options_offset); + gd._operators.push_back(op_offset); +} + +void OperationExporter::export_simple(loco::Node *node, circle::BuiltinOperator bop) +{ + uint32_t op_idx = + md.registerBuiltinOpcode(bop, loco::must_cast(node)->op_version()); + std::vector inputs_vec; std::vector outputs_vec{get_tensor_index(static_cast(node))}; + for (uint32_t i = 0; i < node->arity(); ++i) + inputs_vec.push_back(get_tensor_index(node->arg(i))); auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateAbsOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_AbsOptions, options.Union()); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleAbs *node) +{ + export_simple(node, circle::BuiltinOperator_ABS, circle::BuiltinOptions_AbsOptions, + CreateAbsOptions(builder).Union()); +} + void OperationExporter::visit(luci::CircleAdd *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_ADD); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; + export_simple( + node, circle::BuiltinOperator_ADD, circle::BuiltinOptions_AddOptions, + CreateAddOptions(builder, to_circle_actfunc(node->fusedActivationFunction())).Union()); +} + +void OperationExporter::visit(luci::CircleAddN *node) +{ + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_ADD_N, node->op_version()); + std::vector inputs_vec; std::vector outputs_vec{get_tensor_index(static_cast(node))}; + + for (uint32_t i = 0; i < node->arity(); ++i) + inputs_vec.push_back(get_tensor_index(node->inputs(i))); + auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateAddOptions(builder, to_circle_actfunc(node->fusedActivationFunction())); + auto options = CreateAddNOptions(builder); auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_AddOptions, options.Union()); + circle::BuiltinOptions_AddNOptions, options.Union()); gd._operators.push_back(op_offset); } void OperationExporter::visit(luci::CircleArgMax *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_ARG_MAX); - std::vector inputs_vec{get_tensor_index(node->input()), - get_tensor_index(node->dimension())}; + export_simple(node, circle::BuiltinOperator_ARG_MAX, circle::BuiltinOptions_ArgMaxOptions, + CreateArgMaxOptions(builder, to_circle_tensortype(node->output_type())).Union()); +} + +void OperationExporter::visit(luci::CircleArgMin *node) +{ + export_simple(node, circle::BuiltinOperator_ARG_MIN, circle::BuiltinOptions_ArgMinOptions, + CreateArgMinOptions(builder, to_circle_tensortype(node->output_type())).Union()); +} + +void OperationExporter::visit(luci::CircleAveragePool2D *node) +{ + export_pool_2d(node, circle::BuiltinOperator_AVERAGE_POOL_2D); +} + +void OperationExporter::visit(luci::CircleBatchMatMul *node) +{ + export_simple(node, circle::BuiltinOperator_BATCH_MATMUL, + circle::BuiltinOptions_BatchMatMulOptions, + CreateBatchMatMulOptions(builder, node->adj_x(), node->adj_y()).Union()); +} + +void OperationExporter::visit(luci::CircleCast *node) +{ + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_CAST, node->op_version()); + std::vector inputs_vec{get_tensor_index(node->x())}; std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateArgMaxOptions(builder, to_circle_tensortype(node->output_type())); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_ArgMaxOptions, options.Union()); + + flatbuffers::Offset op_offset; + if (node->out_data_type() != loco::DataType::Unknown) + { + auto options = CreateCastOptions(builder, to_circle_tensortype(node->in_data_type()), + to_circle_tensortype(node->out_data_type())); + op_offset = CreateOperator(builder, op_idx, inputs, outputs, circle::BuiltinOptions_CastOptions, + options.Union()); + } + else + { + op_offset = CreateOperator(builder, op_idx, inputs, outputs); + } gd._operators.push_back(op_offset); } -void OperationExporter::visit(luci::CircleAveragePool2D *node) +void OperationExporter::visit(luci::CircleCeil *node) { - export_pool_2d(node, circle::BuiltinOperator_AVERAGE_POOL_2D); + export_simple(node, circle::BuiltinOperator_CEIL); } void OperationExporter::visit(luci::CircleConcatenation *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_CONCATENATION); + uint32_t op_idx = + md.registerBuiltinOpcode(circle::BuiltinOperator_CONCATENATION, node->op_version()); std::vector inputs_vec; std::vector outputs_vec{get_tensor_index(static_cast(node))}; @@ -190,169 +355,304 @@ void OperationExporter::visit(luci::CircleConcatenation *node) void OperationExporter::visit(luci::CircleBatchToSpaceND *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_BATCH_TO_SPACE_ND); - std::vector inputs_vec{get_tensor_index(node->input()), - get_tensor_index(node->block_shape()), - get_tensor_index(node->crops())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateBatchToSpaceNDOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_BatchToSpaceNDOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_BATCH_TO_SPACE_ND, + circle::BuiltinOptions_BatchToSpaceNDOptions, + CreateBatchToSpaceNDOptions(builder).Union()); } void OperationExporter::visit(luci::CircleConv2D *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_CONV_2D); - - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->input()), get_tensor_index(node->filter()), - get_tensor_index(node->bias())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - circle::Padding padding = getOpPadding(node->padding()); - auto options = CreateConv2DOptions(builder, padding, node->stride()->w(), node->stride()->h(), - to_circle_actfunc(node->fusedActivationFunction())); - - // Make CONV_2D operator - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_Conv2DOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_CONV_2D, circle::BuiltinOptions_Conv2DOptions, + CreateConv2DOptions(builder, getOpPadding(node->padding()), node->stride()->w(), + node->stride()->h(), + to_circle_actfunc(node->fusedActivationFunction()), + node->dilation()->w(), node->dilation()->h()) + .Union()); } void OperationExporter::visit(luci::CircleCos *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_COS); + export_simple(node, circle::BuiltinOperator_COS, circle::BuiltinOptions_CosOptions, + CreateCosOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleCustom *node) +{ + auto custom_outputs = loco::succs(node); + + uint32_t op_idx = md.registerCustomOpcode(node->custom_code()); + std::vector inputs_vec; + std::vector outputs_vec; + + for (uint32_t index = 0; index < node->numInputs(); index++) + { + inputs_vec.push_back(get_tensor_index(node->inputs(index))); + } + for (uint32_t index = 0; index < custom_outputs.size(); index++) + { + // store in order of index + bool found = false; + for (auto out : custom_outputs) + { + auto custom_out = loco::must_cast(out); + if (custom_out->index() == static_cast(index)) + { + outputs_vec.push_back(get_tensor_index(custom_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid Custom output"); + } + } - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->x())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateCosOptions(builder); - - // Make COS operator - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_CosOptions, options.Union()); + flatbuffers::Offset> circle_custom_options; + std::vector custom_options_vec{node->custom_options().begin(), + node->custom_options().end()}; + circle_custom_options = builder.CreateVector(custom_options_vec); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, circle::BuiltinOptions_NONE, + flatbuffers::Offset(), circle_custom_options); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleDepthToSpace *node) +{ + export_simple(node, circle::BuiltinOperator_DEPTH_TO_SPACE, + circle::BuiltinOptions_DepthToSpaceOptions, + CreateDepthToSpaceOptions(builder, node->block_size()).Union()); +} + void OperationExporter::visit(luci::CircleDepthwiseConv2D *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_DEPTHWISE_CONV_2D); + export_simple(node, circle::BuiltinOperator_DEPTHWISE_CONV_2D, + circle::BuiltinOptions_DepthwiseConv2DOptions, + CreateDepthwiseConv2DOptions(builder, getOpPadding(node->padding()), + node->stride()->w(), node->stride()->h(), + node->depthMultiplier(), + to_circle_actfunc(node->fusedActivationFunction()), + node->dilation()->w(), node->dilation()->h()) + .Union()); +} - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->input()), get_tensor_index(node->filter()), - get_tensor_index(node->bias())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - circle::Padding padding = getOpPadding(node->padding()); - auto options = CreateDepthwiseConv2DOptions(builder, padding, node->stride()->w(), - node->stride()->h(), node->depthMultiplier(), - to_circle_actfunc(node->fusedActivationFunction())); +void OperationExporter::visit(luci::CircleDiv *node) +{ + export_simple( + node, circle::BuiltinOperator_DIV, circle::BuiltinOptions_DivOptions, + CreateDivOptions(builder, to_circle_actfunc(node->fusedActivationFunction())).Union()); +} - // Make DEPTHWISE_CONV_2D operator - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_DepthwiseConv2DOptions, options.Union()); - gd._operators.push_back(op_offset); +void OperationExporter::visit(luci::CircleElu *node) +{ + export_simple(node, circle::BuiltinOperator_ELU); } -void OperationExporter::visit(luci::CircleDiv *node) +void OperationExporter::visit(luci::CircleEqual *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_DIV); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateDivOptions(builder, to_circle_actfunc(node->fusedActivationFunction())); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_DivOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_EQUAL, circle::BuiltinOptions_EqualOptions, + CreateEqualOptions(builder).Union()); } void OperationExporter::visit(luci::CircleExp *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_EXP); - std::vector inputs_vec{get_tensor_index(node->x())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateAbsOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_ExpOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_EXP, circle::BuiltinOptions_ExpOptions, + CreateExpOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleExpandDims *node) +{ + export_simple(node, circle::BuiltinOperator_EXPAND_DIMS, circle::BuiltinOptions_ExpandDimsOptions, + CreateExpandDimsOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleFill *node) +{ + export_simple(node, circle::BuiltinOperator_FILL, circle::BuiltinOptions_FillOptions, + CreateFillOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleFloor *node) +{ + export_simple(node, circle::BuiltinOperator_FLOOR); +} + +void OperationExporter::visit(luci::CircleFloorDiv *node) +{ + export_simple(node, circle::BuiltinOperator_FLOOR_DIV, circle::BuiltinOptions_FloorDivOptions, + CreateFloorDivOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleFloorMod *node) +{ + export_simple(node, circle::BuiltinOperator_FLOOR_MOD, circle::BuiltinOptions_FloorModOptions, + CreateFloorModOptions(builder).Union()); } void OperationExporter::visit(luci::CircleFullyConnected *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_FULLY_CONNECTED); + export_simple( + node, circle::BuiltinOperator_FULLY_CONNECTED, circle::BuiltinOptions_FullyConnectedOptions, + CreateFullyConnectedOptions(builder, to_circle_actfunc(node->fusedActivationFunction())) + .Union()); +} - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->input()), - get_tensor_index(node->weights()), - get_tensor_index(node->bias())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = - CreateFullyConnectedOptions(builder, to_circle_actfunc(node->fusedActivationFunction())); +void OperationExporter::visit(luci::CircleGather *node) +{ + export_simple(node, circle::BuiltinOperator_GATHER, circle::BuiltinOptions_GatherOptions, + CreateGatherOptions(builder, node->axis()).Union()); +} - // Make FULLY_CONNECTED operator - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_FullyConnectedOptions, options.Union()); - gd._operators.push_back(op_offset); +void OperationExporter::visit(luci::CircleGatherNd *node) +{ + export_simple(node, circle::BuiltinOperator_GATHER_ND, circle::BuiltinOptions_GatherNdOptions, + CreateGatherNdOptions(builder).Union()); } -void OperationExporter::visit(luci::CircleLogicalNot *node) +void OperationExporter::visit(luci::CircleGreater *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_LOGICAL_NOT); + export_simple(node, circle::BuiltinOperator_GREATER, circle::BuiltinOptions_GreaterOptions, + CreateGreaterOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleGreaterEqual *node) +{ + export_simple(node, circle::BuiltinOperator_GREATER_EQUAL, + circle::BuiltinOptions_GreaterEqualOptions, + CreateGreaterEqualOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleIf *node) +{ + auto if_outs = loco::succs(node); + assert(if_outs.size() == node->output_count()); + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_IF, node->op_version()); + std::vector inputs_vec; + std::vector outputs_vec; + + inputs_vec.push_back(get_tensor_index(node->cond())); + for (uint32_t idx = 0; idx < node->input_count(); ++idx) + inputs_vec.push_back(get_tensor_index(node->input(idx))); + + for (uint32_t idx = 0; idx < node->output_count(); ++idx) + { + // store in order of index + bool found = false; + for (auto out : if_outs) + { + auto if_out = loco::must_cast(out); + if (if_out->index() == static_cast(idx)) + { + outputs_vec.push_back(get_tensor_index(if_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid CircleIf output"); + } + } - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->x())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateLogicalNotOptions(builder); - - // Make LOGICAL_NOT operator + auto options = CreateIfOptions(builder, node->then_branch(), node->else_branch()); auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_LogicalNotOptions, options.Union()); + circle::BuiltinOptions_IfOptions, options.Union()); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleL2Normalize *node) +{ + export_simple( + node, circle::BuiltinOperator_L2_NORMALIZATION, circle::BuiltinOptions_L2NormOptions, + CreateL2NormOptions(builder, to_circle_actfunc(node->fusedActivationFunction())).Union()); +} + +void OperationExporter::visit(luci::CircleL2Pool2D *node) +{ + export_pool_2d(node, circle::BuiltinOperator_L2_POOL_2D); +} + +void OperationExporter::visit(luci::CircleLeakyRelu *node) +{ + export_simple(node, circle::BuiltinOperator_LEAKY_RELU, circle::BuiltinOptions_LeakyReluOptions, + CreateLeakyReluOptions(builder, node->alpha()).Union()); +} + +void OperationExporter::visit(luci::CircleLess *node) +{ + export_simple(node, circle::BuiltinOperator_LESS, circle::BuiltinOptions_LessOptions, + CreateLessOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleLessEqual *node) +{ + export_simple(node, circle::BuiltinOperator_LESS_EQUAL, circle::BuiltinOptions_LessEqualOptions, + CreateLessEqualOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleLocalResponseNormalization *node) +{ + export_simple(node, circle::BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION, + circle::BuiltinOptions_LocalResponseNormalizationOptions, + CreateLocalResponseNormalizationOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleLog *node) +{ + export_simple(node, circle::BuiltinOperator_LOG); +} + +void OperationExporter::visit(luci::CircleLogicalAnd *node) +{ + export_simple(node, circle::BuiltinOperator_LOGICAL_AND, circle::BuiltinOptions_LogicalAndOptions, + CreateLogicalAndOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleLogicalNot *node) +{ + export_simple(node, circle::BuiltinOperator_LOGICAL_NOT, circle::BuiltinOptions_LogicalNotOptions, + CreateLogicalNotOptions(builder).Union()); +} + void OperationExporter::visit(luci::CircleLogicalOr *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_LOGICAL_OR); + export_simple(node, circle::BuiltinOperator_LOGICAL_OR, circle::BuiltinOptions_LogicalOrOptions, + CreateLogicalOrOptions(builder).Union()); +} - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateLogicalOrOptions(builder); +void OperationExporter::visit(luci::CircleLogistic *node) +{ + export_simple(node, circle::BuiltinOperator_LOGISTIC); +} - // Make LOGICAL_OR operator - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_LogicalOrOptions, options.Union()); - gd._operators.push_back(op_offset); +void OperationExporter::visit(luci::CircleLogSoftmax *node) +{ + export_simple(node, circle::BuiltinOperator_LOG_SOFTMAX, circle::BuiltinOptions_LogSoftmaxOptions, + CreateLogSoftmaxOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleMatrixDiag *node) +{ + export_simple(node, circle::BuiltinOperator_MATRIX_DIAG, circle::BuiltinOptions_MatrixDiagOptions, + CreateMatrixDiagOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleMatrixSetDiag *node) +{ + export_simple(node, circle::BuiltinOperator_MATRIX_SET_DIAG, + circle::BuiltinOptions_MatrixSetDiagOptions, + CreateMatrixSetDiagOptions(builder).Union()); } void OperationExporter::visit(luci::CircleMaximum *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_MAXIMUM); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateMaximumMinimumOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_MaximumMinimumOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_MAXIMUM, circle::BuiltinOptions_MaximumMinimumOptions, + CreateMaximumMinimumOptions(builder).Union()); } void OperationExporter::visit(luci::CircleMaxPool2D *node) @@ -362,259 +662,568 @@ void OperationExporter::visit(luci::CircleMaxPool2D *node) void OperationExporter::visit(luci::CircleMean *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_MEAN); - std::vector inputs_vec{get_tensor_index(node->input()), - get_tensor_index(node->reduction_indices())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateReducerOptions(builder, node->keep_dims()); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_ReducerOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_MEAN, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); +} + +void OperationExporter::visit(luci::CircleMinimum *node) +{ + export_simple(node, circle::BuiltinOperator_MINIMUM, circle::BuiltinOptions_MaximumMinimumOptions, + CreateMaximumMinimumOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleMirrorPad *node) +{ + export_simple(node, circle::BuiltinOperator_MIRROR_PAD, circle::BuiltinOptions_MirrorPadOptions, + CreateMirrorPadOptions(builder, to_circle_mirrorpadmode(node->mode())).Union()); } void OperationExporter::visit(luci::CircleMul *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_MUL); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateMulOptions(builder, to_circle_actfunc(node->fusedActivationFunction())); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_MulOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple( + node, circle::BuiltinOperator_MUL, circle::BuiltinOptions_MulOptions, + CreateMulOptions(builder, to_circle_actfunc(node->fusedActivationFunction())).Union()); } -void OperationExporter::visit(luci::CirclePack *node) +void OperationExporter::visit(luci::CircleNeg *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_PACK); - std::vector inputs_vec; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; + export_simple(node, circle::BuiltinOperator_NEG, circle::BuiltinOptions_NegOptions, + CreateNegOptions(builder).Union()); +} - for (uint32_t i = 0; i < node->values_count(); ++i) - inputs_vec.push_back(get_tensor_index(node->values(i))); +void OperationExporter::visit(luci::CircleNotEqual *node) +{ + export_simple(node, circle::BuiltinOperator_NOT_EQUAL, circle::BuiltinOptions_NotEqualOptions, + CreateNotEqualOptions(builder).Union()); +} - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreatePackOptions(builder, node->values_count(), node->axis()); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_PackOptions, options.Union()); - gd._operators.push_back(op_offset); +void OperationExporter::visit(luci::CircleOneHot *node) +{ + export_simple(node, circle::BuiltinOperator_ONE_HOT, circle::BuiltinOptions_OneHotOptions, + CreateOneHotOptions(builder, node->axis()).Union()); +} + +void OperationExporter::visit(luci::CirclePack *node) +{ + export_simple(node, circle::BuiltinOperator_PACK, circle::BuiltinOptions_PackOptions, + CreatePackOptions(builder, node->values_count(), node->axis()).Union()); } void OperationExporter::visit(luci::CirclePad *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_PAD); - std::vector inputs_vec{get_tensor_index(node->input()), - get_tensor_index(node->paddings())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreatePadOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_PadOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_PAD, circle::BuiltinOptions_PadOptions, + CreatePadOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CirclePow *node) +{ + export_simple(node, circle::BuiltinOperator_POW, circle::BuiltinOptions_PowOptions, + CreatePowOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CirclePRelu *node) +{ + export_simple(node, circle::BuiltinOperator_PRELU); +} + +void OperationExporter::visit(luci::CircleRange *node) +{ + export_simple(node, circle::BuiltinOperator_RANGE, circle::BuiltinOptions_RangeOptions, + CreateRangeOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleRank *node) +{ + export_simple(node, circle::BuiltinOperator_RANK, circle::BuiltinOptions_RankOptions, + CreateRankOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleReduceAny *node) +{ + export_simple(node, circle::BuiltinOperator_REDUCE_ANY, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); +} + +void OperationExporter::visit(luci::CircleReduceMax *node) +{ + export_simple(node, circle::BuiltinOperator_REDUCE_MAX, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); +} + +void OperationExporter::visit(luci::CircleReduceMin *node) +{ + export_simple(node, circle::BuiltinOperator_REDUCE_MIN, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); +} + +void OperationExporter::visit(luci::CircleReduceProd *node) +{ + export_simple(node, circle::BuiltinOperator_REDUCE_PROD, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); } void OperationExporter::visit(luci::CircleRelu *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_RELU); - std::vector inputs_vec{get_tensor_index(node->features())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_RELU); } void OperationExporter::visit(luci::CircleRelu6 *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_RELU6); - std::vector inputs_vec{get_tensor_index(node->features())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_RELU6); } -void OperationExporter::visit(luci::CircleReshape *node) +void OperationExporter::visit(luci::CircleReluN1To1 *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_RESHAPE); - - // Create inputs and outputs. - std::vector inputs_vec{get_tensor_index(node->tensor()), - get_tensor_index(node->shape())}; - std::vector outputs_vec{get_tensor_index(node)}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); + export_simple(node, circle::BuiltinOperator_RELU_N1_TO_1); +} - // Create options. +void OperationExporter::visit(luci::CircleReshape *node) +{ auto new_shape = builder.CreateVector( node->newShape()->rank(), [node](size_t i) { return node->newShape()->dim(i); }); - auto options = CreateReshapeOptions(builder, new_shape); - // Create the operator. - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_ReshapeOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_RESHAPE, circle::BuiltinOptions_ReshapeOptions, + CreateReshapeOptions(builder, new_shape).Union()); } -void OperationExporter::visit(luci::CircleRsqrt *node) +void OperationExporter::visit(luci::CircleResizeBilinear *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_RSQRT); - std::vector inputs_vec{get_tensor_index(node->x())}; + export_simple( + node, circle::BuiltinOperator_RESIZE_BILINEAR, circle::BuiltinOptions_ResizeBilinearOptions, + CreateResizeBilinearOptions(builder, node->align_corners(), node->half_pixel_centers()) + .Union()); +} + +void OperationExporter::visit(luci::CircleResizeNearestNeighbor *node) +{ + export_simple(node, circle::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, + circle::BuiltinOptions_ResizeNearestNeighborOptions, + CreateResizeNearestNeighborOptions(builder, node->align_corners()).Union()); +} + +void OperationExporter::visit(luci::CircleReverseSequence *node) +{ + export_simple( + node, circle::BuiltinOperator_REVERSE_SEQUENCE, circle::BuiltinOptions_ReverseSequenceOptions, + CreateReverseSequenceOptions(builder, node->seq_axis(), node->batch_axis()).Union()); +} + +void OperationExporter::visit(luci::CircleReverseV2 *node) +{ + uint32_t op_idx = + md.registerBuiltinOpcode(circle::BuiltinOperator_REVERSE_V2, node->op_version()); + std::vector inputs_vec{get_tensor_index(node->tensor()), get_tensor_index(node->axis())}; std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); + auto options = CreateReverseV2Options(builder); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, + circle::BuiltinOptions_ReverseSequenceOptions, options.Union()); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleRound *node) +{ + export_simple(node, circle::BuiltinOperator_ROUND); +} + +void OperationExporter::visit(luci::CircleRsqrt *node) +{ + export_simple(node, circle::BuiltinOperator_RSQRT); +} + +void OperationExporter::visit(luci::CircleScatterNd *node) +{ + export_simple(node, circle::BuiltinOperator_SCATTER_ND, circle::BuiltinOptions_ScatterNdOptions, + CreateScatterNdOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSegmentSum *node) +{ + export_simple(node, circle::BuiltinOperator_SEGMENT_SUM, circle::BuiltinOptions_SegmentSumOptions, + CreateSegmentSumOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSelect *node) +{ + export_simple(node, circle::BuiltinOperator_SELECT, circle::BuiltinOptions_SelectOptions, + CreateSelectOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSelectV2 *node) +{ + export_simple(node, circle::BuiltinOperator_SELECT_V2, circle::BuiltinOptions_SelectV2Options, + CreateSelectV2Options(builder).Union()); +} + +void OperationExporter::visit(luci::CircleShape *node) +{ + export_simple(node, circle::BuiltinOperator_SHAPE, circle::BuiltinOptions_ShapeOptions, + CreateShapeOptions(builder, to_circle_tensortype(node->out_type())).Union()); +} + +void OperationExporter::visit(luci::CircleSin *node) +{ + export_simple(node, circle::BuiltinOperator_SIN); +} + +void OperationExporter::visit(luci::CircleSlice *node) +{ + export_simple(node, circle::BuiltinOperator_SLICE, circle::BuiltinOptions_SliceOptions, + CreateSliceOptions(builder).Union()); +} + void OperationExporter::visit(luci::CircleSoftmax *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SOFTMAX); - std::vector inputs_vec{get_tensor_index(node->logits())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; + export_simple(node, circle::BuiltinOperator_SOFTMAX, circle::BuiltinOptions_SoftmaxOptions, + CreateSoftmaxOptions(builder, node->beta()).Union()); +} + +void OperationExporter::visit(luci::CircleSpaceToBatchND *node) +{ + export_simple(node, circle::BuiltinOperator_SPACE_TO_BATCH_ND, + circle::BuiltinOptions_SpaceToBatchNDOptions, + CreateSpaceToBatchNDOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSpaceToDepth *node) +{ + export_simple(node, circle::BuiltinOperator_SPACE_TO_DEPTH, + circle::BuiltinOptions_SpaceToDepthOptions, + CreateSpaceToDepthOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSparseToDense *node) +{ + export_simple(node, circle::BuiltinOperator_SPARSE_TO_DENSE, + circle::BuiltinOptions_SparseToDenseOptions, + CreateSparseToDenseOptions(builder, node->validate_indices()).Union()); +} + +void OperationExporter::visit(luci::CircleSplit *node) +{ + auto split_outs = loco::succs(node); + assert(int32_t(split_outs.size()) == node->num_split()); + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SPLIT, node->op_version()); + // NOTE BuiltinOperator_SPLIT input is placed at second position + std::vector inputs_vec{get_tensor_index(node->split_dim()), + get_tensor_index(node->input())}; + std::vector outputs_vec; + + for (int32_t index = 0; index < node->num_split(); index++) + { + // store in order of index + bool found = false; + for (auto out : split_outs) + { + auto split_out = loco::must_cast(out); + if (split_out->index() == index) + { + outputs_vec.push_back(get_tensor_index(split_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid Split output"); + } + } + auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateSoftmaxOptions(builder, node->beta()); + auto options = CreateSplitOptions(builder, node->num_split()); auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_SoftmaxOptions, options.Union()); + circle::BuiltinOptions_SplitOptions, options.Union()); gd._operators.push_back(op_offset); } -void OperationExporter::visit(luci::CircleSqrt *node) +void OperationExporter::visit(luci::CircleSplitV *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SQRT); - std::vector inputs_vec{get_tensor_index(node->x())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; + auto split_outs = loco::succs(node); + assert(int32_t(split_outs.size()) == node->num_split()); + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SPLIT_V, node->op_version()); + std::vector inputs_vec{get_tensor_index(node->input()), + get_tensor_index(node->size_splits()), + get_tensor_index(node->split_dim())}; + std::vector outputs_vec; + + for (int32_t index = 0; index < node->num_split(); index++) + { + // store in order of index + bool found = false; + for (auto out : split_outs) + { + auto split_out = loco::must_cast(out); + if (split_out->index() == index) + { + outputs_vec.push_back(get_tensor_index(split_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid SplitV output"); + } + } + auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs); + auto options = CreateSplitVOptions(builder, node->num_split()); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, + circle::BuiltinOptions_SplitVOptions, options.Union()); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleSqrt *node) +{ + export_simple(node, circle::BuiltinOperator_SQRT); +} + +void OperationExporter::visit(luci::CircleSquare *node) +{ + export_simple(node, circle::BuiltinOperator_SQUARE, circle::BuiltinOptions_SquareOptions, + CreateSquareOptions(builder).Union()); +} + void OperationExporter::visit(luci::CircleSquaredDifference *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SQUARED_DIFFERENCE); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateSquaredDifferenceOptions(builder); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_SquaredDifferenceOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple(node, circle::BuiltinOperator_SQUARED_DIFFERENCE, + circle::BuiltinOptions_SquaredDifferenceOptions, + CreateSquaredDifferenceOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleSqueeze *node) +{ + auto squeeze_dims = builder.CreateVector(node->squeeze_dims()); + export_simple(node, circle::BuiltinOperator_SQUEEZE, circle::BuiltinOptions_SqueezeOptions, + CreateSqueezeOptions(builder, squeeze_dims).Union()); +} + +void OperationExporter::visit(luci::CircleStridedSlice *node) +{ + export_simple(node, circle::BuiltinOperator_STRIDED_SLICE, + circle::BuiltinOptions_StridedSliceOptions, + CreateStridedSliceOptions(builder, node->begin_mask(), node->end_mask(), + node->ellipsis_mask(), node->new_axis_mask(), + node->shrink_axis_mask()) + .Union()); } void OperationExporter::visit(luci::CircleSub *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_SUB); - std::vector inputs_vec{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; - auto inputs = builder.CreateVector(inputs_vec); - auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateSubOptions(builder, to_circle_actfunc(node->fusedActivationFunction())); - auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_SubOptions, options.Union()); - gd._operators.push_back(op_offset); + export_simple( + node, circle::BuiltinOperator_SUB, circle::BuiltinOptions_SubOptions, + CreateSubOptions(builder, to_circle_actfunc(node->fusedActivationFunction())).Union()); } -// TODO CircleTanh +void OperationExporter::visit(luci::CircleSum *node) +{ + export_simple(node, circle::BuiltinOperator_SUM, circle::BuiltinOptions_ReducerOptions, + CreateReducerOptions(builder, node->keep_dims()).Union()); +} -void OperationExporter::visit(luci::CircleTranspose *node) +void OperationExporter::visit(luci::CircleTanh *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_TRANSPOSE); - std::vector inputs_vec{get_tensor_index(node->arg(0)), get_tensor_index(node->arg(1))}; - std::vector outputs_vec{get_tensor_index(node)}; + export_simple(node, circle::BuiltinOperator_TANH); +} + +void OperationExporter::visit(luci::CircleTile *node) +{ + export_simple(node, circle::BuiltinOperator_TILE, circle::BuiltinOptions_TileOptions, + CreateTileOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleTopKV2 *node) +{ + auto topkv2_outs = loco::succs(node); + int outs_count = int32_t(topkv2_outs.size()); + assert(outs_count == 2); + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_TOPK_V2, node->op_version()); + std::vector inputs_vec{get_tensor_index(node->input()), get_tensor_index(node->k())}; + std::vector outputs_vec; + + for (int32_t index = 0; index < outs_count; index++) + { + // store in order of index + bool found = false; + for (auto out : topkv2_outs) + { + auto topkv2_out = loco::must_cast(out); + if (topkv2_out->index() == index) + { + outputs_vec.push_back(get_tensor_index(topkv2_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid TopKV2 output"); + } + } auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateTransposeOptions(builder); - - auto op_offset = - CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions::BuiltinOptions_TransposeOptions, options.Union()); + auto options = CreateTopKV2Options(builder); + auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, + circle::BuiltinOptions_TopKV2Options, options.Union()); gd._operators.push_back(op_offset); } +void OperationExporter::visit(luci::CircleTranspose *node) +{ + export_simple(node, circle::BuiltinOperator_TRANSPOSE, circle::BuiltinOptions_TransposeOptions, + CreateTransposeOptions(builder).Union()); +} + void OperationExporter::visit(luci::CircleTransposeConv *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_TRANSPOSE_CONV); + export_simple(node, circle::BuiltinOperator_TRANSPOSE_CONV, + circle::BuiltinOptions_TransposeConvOptions, + CreateTransposeConvOptions(builder, getOpPadding(node->padding()), + node->stride()->w(), node->stride()->h()) + .Union()); +} + +void OperationExporter::visit(luci::CircleUnpack *node) +{ + LOGGER(l); + auto settings = luci::UserSettings::settings(); + + auto unpack_outs = loco::succs(node); + // NOTE real models may not use all of the outputs + if (static_cast(unpack_outs.size()) != node->num()) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + WARN(l) << "Warning: export Unpack(" << node->name() << ") 'num' not same as outputs"; + } + else + assert(false); + } + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_UNPACK, node->op_version()); + std::vector inputs_vec{get_tensor_index(node->value())}; + std::vector outputs_vec; + + for (int32_t index = 0; index < node->num(); index++) + { + // store in order of index + bool found = false; + for (auto out : unpack_outs) + { + auto unpack_out = loco::must_cast(out); + if (unpack_out->index() == index) + { + outputs_vec.push_back(get_tensor_index(unpack_out)); + found = true; + break; + } + } + // NOTE real models may not use all of the outputs + if (!found) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + WARN(l) << "Warning: export Unpack(" << node->name() << ") output " << index << " not used"; + } + else + assert(false); + } + } - // Make input, output and options for operator - std::vector inputs_vec{get_tensor_index(node->inputSizes()), - get_tensor_index(node->filter()), - get_tensor_index(node->outBackprop())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - circle::Padding padding = getOpPadding(node->padding()); - auto options = - CreateTransposeConvOptions(builder, padding, node->stride()->w(), node->stride()->h()); - - // Make TRANSPOSE_CONV operator + auto options = CreateUnpackOptions(builder, node->num(), node->axis()); auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_TransposeConvOptions, options.Union()); + circle::BuiltinOptions_UnpackOptions, options.Union()); gd._operators.push_back(op_offset); } -void OperationExporter::visit(luci::CircleInstanceNorm *node) +void OperationExporter::visit(luci::CircleWhere *node) { - uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_INSTANCE_NORM); - std::vector inputs_vec{get_tensor_index(node->input()), get_tensor_index(node->gamma()), - get_tensor_index(node->beta())}; - std::vector outputs_vec{get_tensor_index(static_cast(node))}; + export_simple(node, circle::BuiltinOperator_WHERE, circle::BuiltinOptions_WhereOptions, + CreateWhereOptions(builder).Union()); +} + +void OperationExporter::visit(luci::CircleWhile *node) +{ + auto while_outs = loco::succs(node); + assert(while_outs.size() == node->output_count()); + + uint32_t op_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_WHILE, node->op_version()); + std::vector inputs_vec; + std::vector outputs_vec; + + for (uint32_t idx = 0; idx < node->input_count(); ++idx) + inputs_vec.push_back(get_tensor_index(node->input(idx))); + + for (uint32_t idx = 0; idx < node->output_count(); ++idx) + { + // store in order of index + bool found = false; + for (auto out : while_outs) + { + auto while_out = loco::must_cast(out); + if (while_out->index() == static_cast(idx)) + { + outputs_vec.push_back(get_tensor_index(while_out)); + found = true; + break; + } + } + if (!found) + { + INTERNAL_EXN("Invalid CircleWhile output"); + } + } + auto inputs = builder.CreateVector(inputs_vec); auto outputs = builder.CreateVector(outputs_vec); - auto options = CreateInstanceNormOptions(builder, node->epsilon(), - to_circle_actfunc(node->fusedActivationFunction())); + auto options = CreateWhileOptions(builder, node->cond_branch(), node->body_branch()); auto op_offset = CreateOperator(builder, op_idx, inputs, outputs, - circle::BuiltinOptions_InstanceNormOptions, options.Union()); + circle::BuiltinOptions_WhileOptions, options.Union()); gd._operators.push_back(op_offset); } -void OperationExporter::visit(luci::CircleEqual *node) +void OperationExporter::visit(luci::CircleZerosLike *node) { - uint32_t opcode_idx = md.registerBuiltinOpcode(circle::BuiltinOperator_EQUAL); - std::vector inputs{get_tensor_index(node->x()), get_tensor_index(node->y())}; - std::vector outputs{get_tensor_index(node)}; - - auto fb_inputs = builder.CreateVector(inputs); - auto fb_outputs = builder.CreateVector(outputs); + export_simple(node, circle::BuiltinOperator_ZEROS_LIKE, circle::BuiltinOptions_ZerosLikeOptions, + CreateZerosLikeOptions(builder).Union()); +} - auto options = CreateEqualOptions(builder); +void OperationExporter::visit(luci::CircleBCQFullyConnected *node) +{ + export_simple(node, circle::BuiltinOperator_BCQ_FULLY_CONNECTED, + circle::BuiltinOptions_BCQFullyConnectedOptions, + CreateBCQFullyConnectedOptions(builder, node->weights_hidden_size(), + to_circle_actfunc(node->fusedActivationFunction())) + .Union()); +} - auto op_offset = CreateOperator(builder, opcode_idx, fb_inputs, fb_outputs, - circle::BuiltinOptions_EqualOptions, options.Union()); +void OperationExporter::visit(luci::CircleBCQGather *node) +{ + export_simple(node, circle::BuiltinOperator_BCQ_GATHER, circle::BuiltinOptions_BCQGatherOptions, + CreateBCQGatherOptions(builder, node->input_hidden_size(), node->axis()).Union()); +} - gd._operators.push_back(op_offset); +void OperationExporter::visit(luci::CircleInstanceNorm *node) +{ + export_simple(node, circle::BuiltinOperator_INSTANCE_NORM, + circle::BuiltinOptions_InstanceNormOptions, + CreateInstanceNormOptions(builder, node->epsilon(), + to_circle_actfunc(node->fusedActivationFunction())) + .Union()); } void exportNode(loco::Node *node, flatbuffers::FlatBufferBuilder &builder, SerializedModelData &md, SerializedGraphData &gd) { - // TODO Use explicit tagging to prevent possible mistake - auto isNoOp = [](loco::Node *node) { - // If there is only one input and the TensorIndex for the input is same - // as the TensorIndex of the output then this node is just a dummy node - if (node->arity() == 1) - { - assert(node->arg(0) != nullptr); - return get_tensor_index(node) == get_tensor_index(node->arg(0)); - } - return false; - }; - - if (isNoOp(node)) - { - // Skip if a given node is marked as NoOp (op with no effect) before - return; - } - if (auto circle_node = dynamic_cast(node)) { OperationExporter exporter{builder, md, gd}; diff --git a/compiler/luci/export/src/CircleTensorExporter.cpp b/compiler/luci/export/src/CircleTensorExporter.cpp index ef9b9d7..5cad392 100644 --- a/compiler/luci/export/src/CircleTensorExporter.cpp +++ b/compiler/luci/export/src/CircleTensorExporter.cpp @@ -15,6 +15,7 @@ */ #include "CircleTensorExporter.h" +#include "TypeBridge.h" #include #include @@ -52,6 +53,9 @@ public: const ShapeDescription &shape(void) const { return _shape; } void shape(const ShapeDescription &shape) { _shape = shape; } + luci::ShapeStatus shape_status(void) const { return _shape_status; } + void shape_status(luci::ShapeStatus ss) { _shape_status = ss; } + public: luci::CircleConst *content(void) const { return _content; } void content(luci::CircleConst *c) { _content = c; } @@ -62,8 +66,9 @@ public: private: std::string _name; - circle::TensorType _dtype; - ShapeDescription _shape; + circle::TensorType _dtype{circle::TensorType_FLOAT32}; + ShapeDescription _shape{}; + luci::ShapeStatus _shape_status{luci::ShapeStatus::UNDEFINED}; luci::CircleConst *_content = nullptr; luci::CircleQuantParam *_quantparam = nullptr; @@ -76,30 +81,16 @@ struct NoOpDetector final : public luci::CircleNodeMutableVisitor // Input is Virtual but does produce a Tensor // Output is Virtual that does not produce any Tensor bool visit(luci::CircleOutput *) final { return true; } + bool visit(luci::CircleOutputExclude *) final { return true; } // Return false by default bool visit(luci::CircleNode *) final { return false; } }; -void allocateCircleTensor(CircleNode *node, CircleTensorContext &ctx) +void allocateCircleTensorInfo(CircleNode *node, CircleTensorContext &ctx) { LOGGER(l); - auto isNoOp = [](loco::Node *node) { - if (auto circle_node = dynamic_cast(node)) - { - NoOpDetector d; - return circle_node->accept(&d); - } - return false; - }; - - if (isNoOp(node)) - { - set_tensor_index(node, get_tensor_index(node->arg(0))); - return; - } - auto tensor_index = static_cast(ctx.size()); // TODO Use Graph-level metadata for Input & Output // auto tensor_name = "t_" + std::to_string(tensor_index); @@ -111,8 +102,10 @@ void allocateCircleTensor(CircleNode *node, CircleTensorContext &ctx) CircleTensoInfo tensor_info; tensor_info.name(tensor_name); - tensor_info.dtype(TypeInference::get(node)); - tensor_info.shape(ShapeInference::get(node)); + tensor_info.dtype(to_circle_tensortype(luci::node_dtype(node))); + if (node->shape_status() == ShapeStatus::VALID) + tensor_info.shape(to_shape_description(luci::node_shape(node))); + tensor_info.shape_status(node->shape_status()); tensor_info.content(dynamic_cast(node)); tensor_info.quantparam(node->quantparam()); @@ -122,6 +115,108 @@ void allocateCircleTensor(CircleNode *node, CircleTensorContext &ctx) ctx.emplace_back(tensor_info); } +class MultiOutputDetector final : public luci::CircleNodeMutableVisitor +{ +public: + MultiOutputDetector(CircleTensorContext &ctx) : _ctx(ctx) {} + +private: + void store_outputs(luci::CircleNode *node, uint32_t count) + { + auto outs = loco::succs(node); + assert(outs.size() == count); + (void)count; // for unused variable error in release build + for (auto out : outs) + { + auto circle_out = loco::must_cast(out); + allocateCircleTensorInfo(circle_out, _ctx); + } + set_tensor_index(node, -1); + } + +public: + bool visit(luci::CircleIfOut *) final { return true; } + bool visit(luci::CircleSplitOut *) final { return true; } + bool visit(luci::CircleSplitVOut *) final { return true; } + bool visit(luci::CircleTopKV2Out *) final { return true; } + bool visit(luci::CircleUnpackOut *) final { return true; } + bool visit(luci::CircleWhileOut *) final { return true; } + + bool visit(luci::CircleIf *node) final + { + store_outputs(node, node->output_count()); + return true; + } + + bool visit(luci::CircleSplit *node) final + { + store_outputs(node, uint32_t(node->num_split())); + return true; + } + + bool visit(luci::CircleSplitV *node) final + { + store_outputs(node, uint32_t(node->num_split())); + return true; + } + + bool visit(luci::CircleTopKV2 *node) final + { + store_outputs(node, 2); + return true; + } + + bool visit(luci::CircleUnpack *node) final + { + store_outputs(node, node->num()); + return true; + } + + bool visit(luci::CircleWhile *node) final + { + store_outputs(node, node->output_count()); + return true; + } + + // Return false by default + bool visit(luci::CircleNode *) final { return false; } + +private: + CircleTensorContext &_ctx; +}; + +void allocateCircleTensor(CircleNode *node, CircleTensorContext &ctx) +{ + if (node == nullptr) + throw std::runtime_error("allocateCIrcleTensor Failed : node is nullptr"); + + auto isNoOp = [](loco::Node *node) { + if (auto circle_node = dynamic_cast(node)) + { + NoOpDetector d; + return circle_node->accept(&d); + } + return false; + }; + + if (isNoOp(node)) + { + set_tensor_index(node, -1); + return; + } + + // TODO revise this when loco supports multiple outputs + // NOTE this will store all virtual output tensors and skip for the real node + if (auto circle_node = dynamic_cast(node)) + { + MultiOutputDetector d(ctx); + if (circle_node->accept(&d)) + return; + } + + allocateCircleTensorInfo(node, ctx); +} + } // namespace namespace @@ -166,18 +261,22 @@ flatbuffers::Offset encodeOpBufferByDType(FlatBufferBuilder &bui template <> flatbuffers::Offset encodeOpBuffer(FlatBufferBuilder &builder, luci::CircleConst *c) { - // TODO use switch - if (c->dtype() == loco::DataType::FLOAT32) + switch (c->dtype()) { - return encodeOpBufferByDType(builder, c); - } - else if (c->dtype() == loco::DataType::S32) - { - return encodeOpBufferByDType(builder, c); - } - else if (c->dtype() == loco::DataType::U8) - { - return encodeOpBufferByDType(builder, c); + case loco::DataType::FLOAT32: + return encodeOpBufferByDType(builder, c); + case loco::DataType::S16: + return encodeOpBufferByDType(builder, c); + case loco::DataType::S32: + return encodeOpBufferByDType(builder, c); + case loco::DataType::S64: + return encodeOpBufferByDType(builder, c); + case loco::DataType::U8: + return encodeOpBufferByDType(builder, c); + case loco::DataType::BOOL: + return encodeOpBufferByDType(builder, c); + default: + break; } INTERNAL_EXN_V("Unsupported datatype", oops::to_uint32(c->dtype())); @@ -210,7 +309,9 @@ void exportOpDefinedTensor(const CircleTensoInfo &info, FlatBufferBuilder &build SerializedModelData &md, SerializedGraphData &gd) { // Create and register output tensor shape - auto shape_offset = encodeShape(builder, info.shape()); + flatbuffers::Offset> shape_offset; + if (info.shape_status() == ShapeStatus::VALID) + shape_offset = encodeShape(builder, info.shape()); // encode and register output tensor buffer auto buffer = @@ -249,9 +350,21 @@ void exportOpDefinedTensors(loco::Graph *g, FlatBufferBuilder &builder, Serializ { CircleTensorContext tensor_ctx; + // NOTE There may exist dangle CircleInput that is not visited with postorder_traversal() + // All dangle CircleOutput should be visited by postorder_traversal() + auto nodes = g->nodes(); + for (uint32_t n = 0; n < nodes->size(); ++n) + { + auto node = dynamic_cast(nodes->at(n)); + if (node != nullptr) + allocateCircleTensor(node, tensor_ctx); + } + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) { - CircleNode *circle_node = dynamic_cast(node); + CircleNode *circle_node = loco::must_cast(node); + if (dynamic_cast(circle_node) != nullptr) + continue; allocateCircleTensor(circle_node, tensor_ctx); } diff --git a/compiler/luci/export/src/ProgressReporter.cpp b/compiler/luci/export/src/ProgressReporter.cpp index ac9c3d9..216bd3f 100644 --- a/compiler/luci/export/src/ProgressReporter.cpp +++ b/compiler/luci/export/src/ProgressReporter.cpp @@ -49,36 +49,36 @@ namespace luci void ProgressReporter::notify(const logo::PhaseEventInfo *) { - LOGGER(prime); + LOGGER(l); - INFO(prime) << "=============================================================="; - INFO(prime) << "luci::PhaseRunner<" << to_str(strategy()) << ">"; - INFO(prime) << "Initial graph"; - INFO(prime) << fmt(graph()); + VERBOSE(l, 4) << "=============================================================="; + VERBOSE(l, 4) << "luci::PhaseRunner<" << to_str(strategy()) << ">"; + VERBOSE(l, 4) << "Initial graph"; + VERBOSE(l, 4) << fmt(graph()); } void ProgressReporter::notify(const logo::PhaseEventInfo *) { - LOGGER(prime); + LOGGER(l); - INFO(prime) << "luci::PhaseRunner<" << to_str(strategy()) << "> - done"; + VERBOSE(l, 4) << "luci::PhaseRunner<" << to_str(strategy()) << "> - done"; } void ProgressReporter::notify(const logo::PhaseEventInfo *info) { - LOGGER(prime); + LOGGER(l); - INFO(prime) << "--------------------------------------------------------------"; - INFO(prime) << "Before " << logo::pass_name(info->pass()); + VERBOSE(l, 4) << "--------------------------------------------------------------"; + VERBOSE(l, 4) << "Before " << logo::pass_name(info->pass()); } void ProgressReporter::notify(const logo::PhaseEventInfo *info) { - LOGGER(prime); + LOGGER(l); - INFO(prime) << "After " << logo::pass_name(info->pass()) - << " (changed: " << to_char(info->changed()) << ")"; - INFO(prime) << fmt(graph()); + VERBOSE(l, 4) << "After " << logo::pass_name(info->pass()) + << " (changed: " << to_char(info->changed()) << ")"; + VERBOSE(l, 4) << fmt(graph()); } } // namespace luci diff --git a/compiler/luci/export/src/SerializedData.h b/compiler/luci/export/src/SerializedData.h index 8424965..251daa0 100644 --- a/compiler/luci/export/src/SerializedData.h +++ b/compiler/luci/export/src/SerializedData.h @@ -29,8 +29,20 @@ namespace luci struct OpCode { circle::BuiltinOperator opcode; - - bool operator==(const OpCode &rhs) const { return opcode == rhs.opcode; } + std::string custom_code{""}; + int32_t version = 1; + + bool operator==(const OpCode &rhs) const + { + if (opcode == circle::BuiltinOperator_CUSTOM) + { + return custom_code == rhs.custom_code; + } + else + { + return opcode == rhs.opcode; + } + } }; } // namespace luci @@ -53,11 +65,13 @@ namespace luci */ struct SubGraphContext { + /// @brief SubGraph name + std::string _name; /// @brief SubGraph input tensor id std::vector _inputs; /// @brief SubGraph output tensor id std::vector _outputs; - /// @DataFormat for SubGraph + /// @brief DataFormat for SubGraph circle::DataFormat _data_format{circle::DataFormat::DataFormat_CHANNELS_LAST}; }; @@ -68,7 +82,6 @@ struct SerializedModelData final SerializedModelData(const SerializedModelData &) = delete; std::unordered_map _operator_codes; - std::unordered_map _custom_operator_codes; std::vector> _buffers; /** @@ -76,7 +89,7 @@ struct SerializedModelData final * @param builtin_code * @return idx of opcode in table of opcodes (see schema) */ - uint32_t registerBuiltinOpcode(circle::BuiltinOperator builtin_code); + uint32_t registerBuiltinOpcode(circle::BuiltinOperator builtin_code, const int32_t op_version); uint32_t registerCustomOpcode(const std::string &custom_op); }; diff --git a/compiler/luci/export/src/TypeBridge.cpp b/compiler/luci/export/src/TypeBridge.cpp new file mode 100644 index 0000000..9ccd523 --- /dev/null +++ b/compiler/luci/export/src/TypeBridge.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TypeBridge.h" + +#include "CircleExporterUtils.h" + +#include +#include +#include +#include + +#include +#include + +namespace +{ + +/** + * @brief CopySelector will return condition of copy shape/type inference to node + */ +struct CopySelector final : public luci::CircleNodeVisitor +{ + // return false(don't copy) for nodes that provides shape/type from nature + bool visit(const luci::CircleInput *) final { return false; } + bool visit(const luci::CircleConst *) final { return false; } + + // default is copy attributes + bool visit(const luci::CircleNode *) { return true; } +}; + +} // namespace + +namespace luci +{ + +loco::TensorShape node_shape(CircleNode *node) +{ + loco::TensorShape shape; + + shape.rank(node->rank()); + for (uint32_t r = 0; r < node->rank(); ++r) + { + shape.dim(r) = loco::Dimension(node->dim(r).value()); + } + return shape; +} + +loco::DataType node_dtype(CircleNode *node) { return node->dtype(); } + +void copy_shape_dtype(loco::Graph *graph) +{ + /** + * @note We will iterate all the nodes in the graph to include dangle nodes + */ + auto nodes = graph->nodes(); + for (uint32_t n = 0; n < nodes->size(); ++n) + { + auto node = loco::must_cast(nodes->at(n)); + + CopySelector cs; + if (node->accept(&cs)) + { + // NOTE not all nodes have infered shape/dtype: multiple outs may not be + // visited when outputs are not used + // TODO fix shape inference traversal + // NOTE when loco supports multiple outputs in nature this issue should be + // resolved also + + if (loco::dtype_known(node)) + { + node->dtype(loco::dtype_get(node)); + } + + if (loco::shape_known(node)) + { + auto shape = loco::shape_get(node).as(); + node->rank(shape.rank()); + for (uint32_t r = 0; r < shape.rank(); ++r) + { + node->dim(r) = loco::Dimension(shape.dim(r).value()); + } + + // ShapeStatus should be update only when the status was UNDEFINED + if (node->shape_status() == ShapeStatus::UNDEFINED) + node->shape_status(ShapeStatus::VALID); + } + } + } +} + +} // namespace luci diff --git a/compiler/luci/export/src/TypeBridge.h b/compiler/luci/export/src/TypeBridge.h new file mode 100644 index 0000000..a63fbce --- /dev/null +++ b/compiler/luci/export/src/TypeBridge.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TYPE_BRIDGE_H__ +#define __TYPE_BRIDGE_H__ + +#include + +#include + +namespace luci +{ + +/** + * @brief node_shape() will return loco::TensorShape of CircleNode + */ +loco::TensorShape node_shape(CircleNode *node); + +/** + * @brief node_dtype() will return loco::DataType of CircleNode + */ +loco::DataType node_dtype(CircleNode *node); + +/** + * @brief copy_shape_dtype() will copy shape and dtype inference data to CircleNode + */ +void copy_shape_dtype(loco::Graph *graph); + +} // namespace luci + +#endif // __TYPE_BRIDGE_H__ diff --git a/compiler/luci/import/CMakeLists.txt b/compiler/luci/import/CMakeLists.txt index bc9a915..2ae00b8 100644 --- a/compiler/luci/import/CMakeLists.txt +++ b/compiler/luci/import/CMakeLists.txt @@ -7,6 +7,7 @@ target_include_directories(luci_import PRIVATE src) target_include_directories(luci_import PUBLIC include) target_link_libraries(luci_import PUBLIC luci_lang) target_link_libraries(luci_import PUBLIC mio_circle) +target_link_libraries(luci_import PRIVATE luci_env) target_link_libraries(luci_import PRIVATE luci_log) target_link_libraries(luci_import PRIVATE luci_logex) target_link_libraries(luci_import PRIVATE nncc_common) diff --git a/compiler/luci/import/include/luci/Import/CircleReader.h b/compiler/luci/import/include/luci/Import/CircleReader.h index fcbe09c..3d85b9e 100644 --- a/compiler/luci/import/include/luci/Import/CircleReader.h +++ b/compiler/luci/import/include/luci/Import/CircleReader.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -42,9 +43,13 @@ const circle::QuantizationParametersT *tensor_quantization(const circle::TensorT loco::DataType luci_datatype(circle::TensorType type); FusedActFunc luci_actfunc(const circle::ActivationFunctionType type); Padding luci_padding(const circle::Padding padding); +MirrorPadMode luci_mirrorpad_mode(const circle::MirrorPadMode mode); std::unique_ptr luci_quantparam(const circle::QuantizationParametersT *quantization); +/// @brief Copy common tensor attributes such as name, type, etc. to node. +void copy_tensor_attributes(const circle::TensorT &tensor, CircleNode *node); + /** * @brief Loads Circle file and provides helpers to access attributes */ @@ -56,6 +61,9 @@ private: using CircleOperators_t = std::vector>; using CircleOperatorCodes_t = std::vector>; + using CircleSubGraphsPtr_t = flatbuffers::Vector>; + using CircleTensorsPtr_t = flatbuffers::Vector>; + public: CircleReader() = default; @@ -68,6 +76,8 @@ public: const std::vector &outputs() const { return _current_subgraph->outputs; } const std::string &name() const { return _current_subgraph->name; } + const CircleTensorsPtr_t *tensors_ptr() const { return _tensors_ptr; } + uint32_t num_subgraph() const { return _model->subgraphs.size(); } circle::BuiltinOperator builtin_code(const circle::OperatorT &op) const; @@ -80,6 +90,9 @@ public: private: std::unique_ptr _model; const circle::SubGraphT *_current_subgraph{nullptr}; + + const circle::Model *_model_ptr{nullptr}; + const CircleTensorsPtr_t *_tensors_ptr{nullptr}; }; } // namespace luci diff --git a/compiler/luci/import/include/luci/Import/GraphBuilder.h b/compiler/luci/import/include/luci/Import/GraphBuilder.h index 61f673f..548264d 100644 --- a/compiler/luci/import/include/luci/Import/GraphBuilder.h +++ b/compiler/luci/import/include/luci/Import/GraphBuilder.h @@ -18,6 +18,7 @@ #define __LUCI_IMPORT_GRAPH_BUILDER_H__ #include "GraphBuilderContext.h" +#include "GraphBuilderBase.h" #include @@ -25,25 +26,14 @@ namespace luci { /** - * @brief Interface of convert circle:: NodeDef to loco::Node (e.g., Conv2DGraphBuilder) + * @brief Base of general single output graph builder(e.g., Conv2DGraphBuilder) */ -class GraphBuilder +class GraphBuilder : public GraphBuilderBase { public: - struct ValidateArgs - { - ValidateArgs(const circle::OperatorT &o, const CircleReader &r) : op(o), reader(r) {} - - const circle::OperatorT &op; - const CircleReader &reader; - }; - -public: virtual ~GraphBuilder() = default; - virtual bool validate(const ValidateArgs &) const = 0; - - void build(const circle::OperatorT &op, GraphBuilderContext *context) const; + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; private: virtual CircleNode *build_node(const circle::OperatorT &op, diff --git a/compiler/luci/import/include/luci/Import/GraphBuilderBase.h b/compiler/luci/import/include/luci/Import/GraphBuilderBase.h new file mode 100644 index 0000000..a0cd008 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/GraphBuilderBase.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_GRAPH_BUILDER_BASE_H__ +#define __LUCI_IMPORT_GRAPH_BUILDER_BASE_H__ + +#include "GraphBuilderContext.h" + +#include + +namespace luci +{ + +/** + * @brief Interface of convert circle::OperatorT to CircleNode + */ +struct GraphBuilderBase +{ + struct ValidateArgs + { + ValidateArgs(const circle::OperatorT &o, const CircleReader &r) : op(o), reader(r) {} + + const circle::OperatorT &op; + const CircleReader &reader; + }; + + virtual bool validate(const ValidateArgs &) const = 0; + virtual void build(const circle::OperatorT &op, GraphBuilderContext *context) const = 0; + + virtual ~GraphBuilderBase() = default; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_GRAPH_BUILDER_BASE_H__ diff --git a/compiler/luci/import/include/luci/Import/GraphBuilderContext.h b/compiler/luci/import/include/luci/Import/GraphBuilderContext.h index 8d46418..72e237a 100644 --- a/compiler/luci/import/include/luci/Import/GraphBuilderContext.h +++ b/compiler/luci/import/include/luci/Import/GraphBuilderContext.h @@ -24,6 +24,7 @@ #include #include +#include namespace luci { @@ -48,13 +49,29 @@ private: }; /** + * @brief Set of Tensor Index of outputs of operators + * including graph input nodes + */ +class IndexTensorOutputs +{ +public: + void enroll(TensorIndex idx); + + bool find(TensorIndex idx); + +private: + std::set _set; +}; + +/** * @brief Class to store context to build loco graph IR from TensorFlow */ class GraphBuilderContext { public: - GraphBuilderContext(loco::Graph *g, CircleReader *reader, IndexNodeFinder *nodefinder) - : _g(g), _reader(reader), _indexnodefinder(nodefinder) + GraphBuilderContext(loco::Graph *g, CircleReader *reader, IndexNodeFinder *nodefinder, + IndexTensorOutputs *tensoroutputs) + : _g(g), _reader(reader), _indexnodefinder(nodefinder), _indextensoroutputs(tensoroutputs) { // DO NOTHING } @@ -67,11 +84,13 @@ public: CircleReader *reader() { return _reader; } IndexNodeFinder *nodefinder() { return _indexnodefinder; } + IndexTensorOutputs *tensoroutputs() { return _indextensoroutputs; } private: loco::Graph *_g; CircleReader *_reader; IndexNodeFinder *_indexnodefinder; + IndexTensorOutputs *_indextensoroutputs; }; } // namespace luci diff --git a/compiler/luci/import/include/luci/Import/GraphBuilderRegistry.h b/compiler/luci/import/include/luci/Import/GraphBuilderRegistry.h index 99054e7..b8dc22f 100644 --- a/compiler/luci/import/include/luci/Import/GraphBuilderRegistry.h +++ b/compiler/luci/import/include/luci/Import/GraphBuilderRegistry.h @@ -17,7 +17,7 @@ #ifndef __LUCI_IMPORT_GRAPH_BUILDER_REGISTRY_H__ #define __LUCI_IMPORT_GRAPH_BUILDER_REGISTRY_H__ -#include "GraphBuilder.h" +#include "GraphBuilderBase.h" #include @@ -31,11 +31,11 @@ struct GraphBuilderSource /** * @brief Returns registered GraphBuilder pointer for operator (nullptr if not present) */ - virtual const GraphBuilder *lookup(const circle::BuiltinOperator &op) const = 0; + virtual const GraphBuilderBase *lookup(const circle::BuiltinOperator &op) const = 0; }; /** - * @brief Class to return graph builder for TF nodes + * @brief Class to return graph builder for Circle nodes */ class GraphBuilderRegistry final : public GraphBuilderSource { @@ -53,7 +53,7 @@ public: * @brief Returns registered GraphBuilder pointer for operator or * nullptr if not registered */ - const GraphBuilder *lookup(const circle::BuiltinOperator &op) const final + const GraphBuilderBase *lookup(const circle::BuiltinOperator &op) const final { if (_builder_map.find(op) == _builder_map.end()) return (_parent == nullptr) ? nullptr : _parent->lookup(op); @@ -68,7 +68,7 @@ public: } public: - void add(const circle::BuiltinOperator op, std::unique_ptr &&builder) + void add(const circle::BuiltinOperator op, std::unique_ptr &&builder) { _builder_map[op] = std::move(builder); } @@ -77,7 +77,7 @@ private: const GraphBuilderSource *_parent = nullptr; private: - std::map> _builder_map; + std::map> _builder_map; }; } // namespace luci diff --git a/compiler/luci/import/include/luci/Import/Nodes.h b/compiler/luci/import/include/luci/Import/Nodes.h index 381d02b..2719a5a 100644 --- a/compiler/luci/import/include/luci/Import/Nodes.h +++ b/compiler/luci/import/include/luci/Import/Nodes.h @@ -19,30 +19,110 @@ #include "Nodes/CircleAbs.h" #include "Nodes/CircleAdd.h" +#include "Nodes/CircleAddN.h" #include "Nodes/CircleArgMax.h" +#include "Nodes/CircleArgMin.h" #include "Nodes/CircleAveragePool2D.h" +#include "Nodes/CircleBatchMatMul.h" #include "Nodes/CircleBatchToSpaceND.h" +#include "Nodes/CircleBCQFullyConnected.h" +#include "Nodes/CircleBCQGather.h" +#include "Nodes/CircleCast.h" +#include "Nodes/CircleCeil.h" #include "Nodes/CircleConcatenation.h" #include "Nodes/CircleConst.h" #include "Nodes/CircleConv2D.h" #include "Nodes/CircleCos.h" +#include "Nodes/CircleCustom.h" +#include "Nodes/CircleDepthToSpace.h" #include "Nodes/CircleDepthwiseConv2D.h" #include "Nodes/CircleDiv.h" +#include "Nodes/CircleElu.h" #include "Nodes/CircleEqual.h" #include "Nodes/CircleExp.h" +#include "Nodes/CircleExpandDims.h" +#include "Nodes/CircleFill.h" +#include "Nodes/CircleFloor.h" +#include "Nodes/CircleFloorDiv.h" +#include "Nodes/CircleFloorMod.h" #include "Nodes/CircleFullyConnected.h" +#include "Nodes/CircleGather.h" +#include "Nodes/CircleGatherNd.h" +#include "Nodes/CircleGreater.h" +#include "Nodes/CircleGreaterEqual.h" +#include "Nodes/CircleIf.h" +#include "Nodes/CircleInstanceNorm.h" +#include "Nodes/CircleL2Normalize.h" +#include "Nodes/CircleL2Pool2D.h" +#include "Nodes/CircleLeakyRelu.h" +#include "Nodes/CircleLess.h" +#include "Nodes/CircleLessEqual.h" +#include "Nodes/CircleLocalResponseNormalization.h" +#include "Nodes/CircleLog.h" +#include "Nodes/CircleLogicalAnd.h" #include "Nodes/CircleLogicalNot.h" #include "Nodes/CircleLogicalOr.h" +#include "Nodes/CircleLogistic.h" +#include "Nodes/CircleLogSoftmax.h" +#include "Nodes/CircleMatrixSetDiag.h" +#include "Nodes/CircleMaximum.h" #include "Nodes/CircleMaxPool2D.h" +#include "Nodes/CircleMatrixDiag.h" #include "Nodes/CircleMean.h" +#include "Nodes/CircleMinimum.h" +#include "Nodes/CircleMirrorPad.h" #include "Nodes/CircleMul.h" +#include "Nodes/CircleNeg.h" +#include "Nodes/CircleNotEqual.h" +#include "Nodes/CircleOneHot.h" #include "Nodes/CirclePack.h" #include "Nodes/CirclePad.h" +#include "Nodes/CirclePow.h" +#include "Nodes/CirclePRelu.h" +#include "Nodes/CircleRange.h" +#include "Nodes/CircleRank.h" +#include "Nodes/CircleReduceAny.h" +#include "Nodes/CircleReduceMax.h" +#include "Nodes/CircleReduceMin.h" +#include "Nodes/CircleReduceProd.h" #include "Nodes/CircleRelu.h" +#include "Nodes/CircleRelu6.h" +#include "Nodes/CircleReluN1To1.h" #include "Nodes/CircleReshape.h" +#include "Nodes/CircleResizeBilinear.h" +#include "Nodes/CircleResizeNearestNeighbor.h" +#include "Nodes/CircleReverseSequence.h" +#include "Nodes/CircleReverseV2.h" +#include "Nodes/CircleRound.h" #include "Nodes/CircleRsqrt.h" +#include "Nodes/CircleScatterNd.h" +#include "Nodes/CircleSegmentSum.h" +#include "Nodes/CircleSelect.h" +#include "Nodes/CircleSelectV2.h" +#include "Nodes/CircleShape.h" +#include "Nodes/CircleSin.h" +#include "Nodes/CircleSlice.h" #include "Nodes/CircleSoftmax.h" +#include "Nodes/CircleSpaceToBatchND.h" +#include "Nodes/CircleSpaceToDepth.h" +#include "Nodes/CircleSparseToDense.h" +#include "Nodes/CircleSplit.h" +#include "Nodes/CircleSplitV.h" +#include "Nodes/CircleSqrt.h" +#include "Nodes/CircleSquare.h" +#include "Nodes/CircleSquaredDifference.h" +#include "Nodes/CircleSqueeze.h" +#include "Nodes/CircleStridedSlice.h" #include "Nodes/CircleSub.h" +#include "Nodes/CircleSum.h" +#include "Nodes/CircleTanh.h" +#include "Nodes/CircleTile.h" +#include "Nodes/CircleTopKV2.h" #include "Nodes/CircleTranspose.h" +#include "Nodes/CircleTransposeConv.h" +#include "Nodes/CircleUnpack.h" +#include "Nodes/CircleWhere.h" +#include "Nodes/CircleWhile.h" +#include "Nodes/CircleZerosLike.h" #endif // __LUCI_IMPORT_NODES_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleAddN.h b/compiler/luci/import/include/luci/Import/Nodes/CircleAddN.h new file mode 100644 index 0000000..3ec6b2a --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleAddN.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ADD_N_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ADD_N_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleAddNGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ADD_N_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleArgMin.h b/compiler/luci/import/include/luci/Import/Nodes/CircleArgMin.h new file mode 100644 index 0000000..746f528 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleArgMin.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ARGMIN_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ARGMIN_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleArgMinGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ARGMIN_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleBCQFullyConnected.h b/compiler/luci/import/include/luci/Import/Nodes/CircleBCQFullyConnected.h new file mode 100644 index 0000000..be58acd --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleBCQFullyConnected.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_BCQFULLYCONNECTED_H__ +#define __LUCI_IMPORT_OP_CIRCLE_BCQFULLYCONNECTED_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleBCQFullyConnectedGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_BCQFULLYCONNECTED_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleBCQGather.h b/compiler/luci/import/include/luci/Import/Nodes/CircleBCQGather.h new file mode 100644 index 0000000..ff1c1f7 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleBCQGather.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_BCQGATHER_H__ +#define __LUCI_IMPORT_OP_CIRCLE_BCQGATHER_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleBCQGatherGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_BCQGATHER_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleBatchMatMul.h b/compiler/luci/import/include/luci/Import/Nodes/CircleBatchMatMul.h new file mode 100644 index 0000000..b46a871 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleBatchMatMul.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_BATCHMATMUL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_BATCHMATMUL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleBatchMatMulGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_BATCHMATMUL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleCast.h b/compiler/luci/import/include/luci/Import/Nodes/CircleCast.h new file mode 100644 index 0000000..1cd850b --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleCast.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_CAST_H__ +#define __LUCI_IMPORT_OP_CIRCLE_CAST_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleCastGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_CAST_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleCeil.h b/compiler/luci/import/include/luci/Import/Nodes/CircleCeil.h new file mode 100644 index 0000000..f1bdf23 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleCeil.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_CEIL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_CEIL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleCeilGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_CEIL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleCustom.h b/compiler/luci/import/include/luci/Import/Nodes/CircleCustom.h new file mode 100644 index 0000000..65745be --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleCustom.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_CUSTOM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_CUSTOM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleCustomGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_CUSTOM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleDepthToSpace.h b/compiler/luci/import/include/luci/Import/Nodes/CircleDepthToSpace.h new file mode 100644 index 0000000..a479cbd --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleDepthToSpace.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_DEPTHTOSPACE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_DEPTHTOSPACE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleDepthToSpaceGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_DEPTHTOSPACE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleElu.h b/compiler/luci/import/include/luci/Import/Nodes/CircleElu.h new file mode 100644 index 0000000..2ec5642 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleElu.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ELU_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ELU_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleEluGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ELU_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleExpandDims.h b/compiler/luci/import/include/luci/Import/Nodes/CircleExpandDims.h new file mode 100644 index 0000000..acbfe7a --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleExpandDims.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_EXPAND_DIMS_H__ +#define __LUCI_IMPORT_OP_CIRCLE_EXPAND_DIMS_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleExpandDimsGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_EXPAND_DIMS_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleFill.h b/compiler/luci/import/include/luci/Import/Nodes/CircleFill.h new file mode 100644 index 0000000..3539dcd --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleFill.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_FILL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_FILL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleFillGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_FILL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleFloor.h b/compiler/luci/import/include/luci/Import/Nodes/CircleFloor.h new file mode 100644 index 0000000..0578008 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleFloor.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_FLOOR_H__ +#define __LUCI_IMPORT_OP_CIRCLE_FLOOR_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleFloorGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_FLOOR_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleFloorDiv.h b/compiler/luci/import/include/luci/Import/Nodes/CircleFloorDiv.h new file mode 100644 index 0000000..ddc2ab2 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleFloorDiv.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_FLOOR_DIV_H__ +#define __LUCI_IMPORT_OP_CIRCLE_FLOOR_DIV_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleFloorDivGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_FLOOR_DIV_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleFloorMod.h b/compiler/luci/import/include/luci/Import/Nodes/CircleFloorMod.h new file mode 100644 index 0000000..1d6aa87 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleFloorMod.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_FLOOR_MOD_H__ +#define __LUCI_IMPORT_OP_CIRCLE_FLOOR_MOD_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleFloorModGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_FLOOR_MOD_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleGather.h b/compiler/luci/import/include/luci/Import/Nodes/CircleGather.h new file mode 100644 index 0000000..0680c94 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleGather.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_GATHER_H__ +#define __LUCI_IMPORT_OP_CIRCLE_GATHER_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleGatherGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_GATHER_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleGatherNd.h b/compiler/luci/import/include/luci/Import/Nodes/CircleGatherNd.h new file mode 100644 index 0000000..be96b7d --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleGatherNd.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_GATHER_ND_H__ +#define __LUCI_IMPORT_OP_CIRCLE_GATHER_ND_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleGatherNdGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_GATHER_ND_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleGreater.h b/compiler/luci/import/include/luci/Import/Nodes/CircleGreater.h new file mode 100644 index 0000000..87f0a8d --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleGreater.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_GREATER_H__ +#define __LUCI_IMPORT_OP_CIRCLE_GREATER_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleGreaterGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_GREATER_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleGreaterEqual.h b/compiler/luci/import/include/luci/Import/Nodes/CircleGreaterEqual.h new file mode 100644 index 0000000..4d24314 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleGreaterEqual.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_GREATEREQUAL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_GREATEREQUAL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleGreaterEqualGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_GREATEREQUAL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleIf.h b/compiler/luci/import/include/luci/Import/Nodes/CircleIf.h new file mode 100644 index 0000000..8faf09c --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleIf.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_IF_H__ +#define __LUCI_IMPORT_OP_CIRCLE_IF_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleIfGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_IF_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleInstanceNorm.h b/compiler/luci/import/include/luci/Import/Nodes/CircleInstanceNorm.h new file mode 100644 index 0000000..5fd8f14 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleInstanceNorm.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_INSTANCE_NORM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_INSTANCE_NORM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleInstanceNormGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_INSTANCE_NORM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleL2Normalize.h b/compiler/luci/import/include/luci/Import/Nodes/CircleL2Normalize.h new file mode 100644 index 0000000..116605f --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleL2Normalize.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_L2_NORMALIZE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_L2_NORMALIZE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleL2NormalizeGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_L2_NORMALIZE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleL2Pool2D.h b/compiler/luci/import/include/luci/Import/Nodes/CircleL2Pool2D.h new file mode 100644 index 0000000..2211c47 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleL2Pool2D.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_L2_POOL2D_H__ +#define __LUCI_IMPORT_OP_CIRCLE_L2_POOL2D_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleL2Pool2DGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_L2_POOL2D_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLeakyRelu.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLeakyRelu.h new file mode 100644 index 0000000..b7fa41f --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLeakyRelu.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LEAKY_RELU_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LEAKY_RELU_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLeakyReluGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LEAKY_RELU_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLess.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLess.h new file mode 100644 index 0000000..b93155b --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLess.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LESS_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LESS_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLessGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LESS_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLessEqual.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLessEqual.h new file mode 100644 index 0000000..e54a4cb --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLessEqual.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LESS_EQUAL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LESS_EQUAL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLessEqualGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LESS_EQUAL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLocalResponseNormalization.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLocalResponseNormalization.h new file mode 100644 index 0000000..95e6ea8 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLocalResponseNormalization.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LOCAL_RESPONSE_NORMALIZATION_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LOCAL_RESPONSE_NORMALIZATION_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLocalResponseNormalizationGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LOCAL_RESPONSE_NORMALIZATION_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLog.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLog.h new file mode 100644 index 0000000..5b33210 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLog.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LOG_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LOG_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLogGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LOG_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLogSoftmax.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLogSoftmax.h new file mode 100644 index 0000000..ef29833 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLogSoftmax.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LOG_SOFTMAX_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LOG_SOFTMAX_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLogSoftmaxGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LOG_SOFTMAX_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLogicalAnd.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLogicalAnd.h new file mode 100644 index 0000000..9336f4a --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLogicalAnd.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LOGICALAND_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LOGICALAND_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLogicalAndGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LOGICALAND_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleLogistic.h b/compiler/luci/import/include/luci/Import/Nodes/CircleLogistic.h new file mode 100644 index 0000000..67c6c1f --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleLogistic.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_LOGISTIC_H__ +#define __LUCI_IMPORT_OP_CIRCLE_LOGISTIC_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleLogisticGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_LOGISTIC_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixDiag.h b/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixDiag.h new file mode 100644 index 0000000..e038c3e --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixDiag.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_MATRIX_DIAG_H__ +#define __LUCI_IMPORT_OP_CIRCLE_MATRIX_DIAG_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleMatrixDiagGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_MATRIX_DIAG_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixSetDiag.h b/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixSetDiag.h new file mode 100644 index 0000000..a9ea0ac --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleMatrixSetDiag.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_MATRIX_SET_DIAG_H__ +#define __LUCI_IMPORT_OP_CIRCLE_MATRIX_SET_DIAG_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleMatrixSetDiagGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_MATRIX_SET_DIAG_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleMaximum.h b/compiler/luci/import/include/luci/Import/Nodes/CircleMaximum.h new file mode 100644 index 0000000..9705d3a --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleMaximum.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_MAXIMUM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_MAXIMUM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleMaximumGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_MAXIMUM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleMinimum.h b/compiler/luci/import/include/luci/Import/Nodes/CircleMinimum.h new file mode 100644 index 0000000..d9546ec --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleMinimum.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_MINIMUM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_MINIMUM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleMinimumGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_MINIMUM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleMirrorPad.h b/compiler/luci/import/include/luci/Import/Nodes/CircleMirrorPad.h new file mode 100644 index 0000000..7f512cd --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleMirrorPad.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_MIRROR_PAD_H__ +#define __LUCI_IMPORT_OP_CIRCLE_MIRROR_PAD_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleMirrorPadGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_MIRROR_PAD_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleNeg.h b/compiler/luci/import/include/luci/Import/Nodes/CircleNeg.h new file mode 100644 index 0000000..3d0bac1 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleNeg.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_NEG_H__ +#define __LUCI_IMPORT_OP_CIRCLE_NEG_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleNegGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_NEG_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleNotEqual.h b/compiler/luci/import/include/luci/Import/Nodes/CircleNotEqual.h new file mode 100644 index 0000000..10c79b7 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleNotEqual.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_NOTEQUAL_H__ +#define __LUCI_IMPORT_OP_CIRCLE_NOTEQUAL_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleNotEqualGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_NOTEQUAL_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleOneHot.h b/compiler/luci/import/include/luci/Import/Nodes/CircleOneHot.h new file mode 100644 index 0000000..8d9526d --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleOneHot.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ONEHOT_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ONEHOT_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleOneHotGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ONEHOT_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CirclePRelu.h b/compiler/luci/import/include/luci/Import/Nodes/CirclePRelu.h new file mode 100644 index 0000000..822862c --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CirclePRelu.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_PRELU_H__ +#define __LUCI_IMPORT_OP_CIRCLE_PRELU_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CirclePReluGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_PRELU_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CirclePow.h b/compiler/luci/import/include/luci/Import/Nodes/CirclePow.h new file mode 100644 index 0000000..284aa9b --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CirclePow.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_POW_H__ +#define __LUCI_IMPORT_OP_CIRCLE_POW_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CirclePowGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_POW_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleRange.h b/compiler/luci/import/include/luci/Import/Nodes/CircleRange.h new file mode 100644 index 0000000..bc63286 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleRange.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RANGE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RANGE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleRangeGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RANGE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleRank.h b/compiler/luci/import/include/luci/Import/Nodes/CircleRank.h new file mode 100644 index 0000000..43a7fdb --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleRank.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RANK_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RANK_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleRankGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RANK_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReduceAny.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceAny.h new file mode 100644 index 0000000..5ee5179 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceAny.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REDUCE_ANY_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REDUCE_ANY_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReduceAnyGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REDUCE_ANY_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMax.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMax.h new file mode 100644 index 0000000..0bc7021 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMax.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REDUCE_MAX_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REDUCE_MAX_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReduceMaxGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REDUCE_MAX_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMin.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMin.h new file mode 100644 index 0000000..0c05457 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceMin.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REDUCE_MIN_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REDUCE_MIN_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReduceMinGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REDUCE_MIN_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReduceProd.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceProd.h new file mode 100644 index 0000000..446bc78 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReduceProd.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REDUCE_PROD_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REDUCE_PROD_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReduceProdGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REDUCE_PROD_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleRelu6.h b/compiler/luci/import/include/luci/Import/Nodes/CircleRelu6.h new file mode 100644 index 0000000..d17b4e2 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleRelu6.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RELU6_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RELU6_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleRelu6GraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RELU6_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReluN1To1.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReluN1To1.h new file mode 100644 index 0000000..0594315 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReluN1To1.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RELU_N1_TO_1_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RELU_N1_TO_1_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReluN1To1GraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RELU_N1_TO_1_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleResizeBilinear.h b/compiler/luci/import/include/luci/Import/Nodes/CircleResizeBilinear.h new file mode 100644 index 0000000..8c20ecc --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleResizeBilinear.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RESIZE_BILINEAR_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RESIZE_BILINEAR_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleResizeBilinearGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RESIZE_BILINEAR_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleResizeNearestNeighbor.h b/compiler/luci/import/include/luci/Import/Nodes/CircleResizeNearestNeighbor.h new file mode 100644 index 0000000..5b06471 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleResizeNearestNeighbor.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_RESIZE_NEAREST_NEIGHBOR_H__ +#define __LUCI_IMPORT_OP_CIRCLE_RESIZE_NEAREST_NEIGHBOR_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleResizeNearestNeighborGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_RESIZE_NEAREST_NEIGHBOR_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReverseSequence.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReverseSequence.h new file mode 100644 index 0000000..cbeed30 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReverseSequence.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REVERSE_SEQUENCE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REVERSE_SEQUENCE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReverseSequenceGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REVERSE_SEQUENCE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleReverseV2.h b/compiler/luci/import/include/luci/Import/Nodes/CircleReverseV2.h new file mode 100644 index 0000000..f354298 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleReverseV2.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_REVERSE_V2_H__ +#define __LUCI_IMPORT_OP_CIRCLE_REVERSE_V2_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleReverseV2GraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_REVERSE_V2_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleRound.h b/compiler/luci/import/include/luci/Import/Nodes/CircleRound.h new file mode 100644 index 0000000..8b027d7 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleRound.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ROUND_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ROUND_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleRoundGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ROUND_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleScatterNd.h b/compiler/luci/import/include/luci/Import/Nodes/CircleScatterNd.h new file mode 100644 index 0000000..8fa7a2f --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleScatterNd.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SCATTER_ND_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SCATTER_ND_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleScatterNdGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SCATTER_ND_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSegmentSum.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSegmentSum.h new file mode 100644 index 0000000..7c33dee --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSegmentSum.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SEGMENT_SUM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SEGMENT_SUM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSegmentSumGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SEGMENT_SUM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSelect.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSelect.h new file mode 100644 index 0000000..87bd1a7 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSelect.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SELECT_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SELECT_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSelectGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SELECT_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSelectV2.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSelectV2.h new file mode 100644 index 0000000..28c73b0 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSelectV2.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SELECT_V2_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SELECT_V2_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSelectV2GraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SELECT_V2_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleShape.h b/compiler/luci/import/include/luci/Import/Nodes/CircleShape.h new file mode 100644 index 0000000..3002084 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleShape.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SHAPE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SHAPE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleShapeGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SHAPE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSin.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSin.h new file mode 100644 index 0000000..605f5a5 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSin.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SIN_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SIN_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSinGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SIN_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSlice.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSlice.h new file mode 100644 index 0000000..3bb4c51 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSlice.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SLICE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SLICE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSliceGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SLICE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToBatchND.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToBatchND.h new file mode 100644 index 0000000..b872309 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToBatchND.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SPACETOBATCHND_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SPACETOBATCHND_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSpaceToBatchNDGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SPACETOBATCHND_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToDepth.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToDepth.h new file mode 100644 index 0000000..75a54dd --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSpaceToDepth.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SPACETODEPTH_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SPACETODEPTH_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSpaceToDepthGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SPACETODEPTH_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSparseToDense.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSparseToDense.h new file mode 100644 index 0000000..baf2409 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSparseToDense.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SPARSETODENSE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SPARSETODENSE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSparseToDenseGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SPARSETODENSE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSplit.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSplit.h new file mode 100644 index 0000000..3395e40 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSplit.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SPLIT_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SPLIT_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleSplitGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SPLIT_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSplitV.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSplitV.h new file mode 100644 index 0000000..3e53df3 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSplitV.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SPLIT_V_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SPLIT_V_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleSplitVGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SPLIT_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSqrt.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSqrt.h new file mode 100644 index 0000000..4fd7995 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSqrt.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SQRT_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SQRT_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSqrtGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SQRT_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSquare.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSquare.h new file mode 100644 index 0000000..3a12991 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSquare.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SQUARE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SQUARE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSquareGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SQUARE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSquaredDifference.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSquaredDifference.h new file mode 100644 index 0000000..95f0841 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSquaredDifference.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SQUAREDDIFFERENCE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SQUAREDDIFFERENCE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSquaredDifferenceGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SQUAREDDIFFERENCE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSqueeze.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSqueeze.h new file mode 100644 index 0000000..4f0dfb5 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSqueeze.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SQUEEZE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SQUEEZE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSqueezeGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SQUEEZE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleStridedSlice.h b/compiler/luci/import/include/luci/Import/Nodes/CircleStridedSlice.h new file mode 100644 index 0000000..f535c3a --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleStridedSlice.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_STRIDED_SLICE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_STRIDED_SLICE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleStridedSliceGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_STRIDED_SLICE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleSum.h b/compiler/luci/import/include/luci/Import/Nodes/CircleSum.h new file mode 100644 index 0000000..e65dd46 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleSum.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_SUM_H__ +#define __LUCI_IMPORT_OP_CIRCLE_SUM_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleSumGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_SUM_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleTanh.h b/compiler/luci/import/include/luci/Import/Nodes/CircleTanh.h new file mode 100644 index 0000000..b3795ac --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleTanh.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_TANH_H__ +#define __LUCI_IMPORT_OP_CIRCLE_TANH_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleTanhGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_TANH_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleTile.h b/compiler/luci/import/include/luci/Import/Nodes/CircleTile.h new file mode 100644 index 0000000..1da6cdb --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleTile.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_TILE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_TILE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleTileGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_TILE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleTopKV2.h b/compiler/luci/import/include/luci/Import/Nodes/CircleTopKV2.h new file mode 100644 index 0000000..8ec3f33 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleTopKV2.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_TOPK_V2_H__ +#define __LUCI_IMPORT_OP_CIRCLE_TOPK_V2_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleTopKV2GraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_TOPK_V2_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleTransposeConv.h b/compiler/luci/import/include/luci/Import/Nodes/CircleTransposeConv.h new file mode 100644 index 0000000..2614d0d --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleTransposeConv.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_TRANSPOSE_CONV_H__ +#define __LUCI_IMPORT_OP_CIRCLE_TRANSPOSE_CONV_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleTransposeConvGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_TRANSPOSE_CONV_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleUnpack.h b/compiler/luci/import/include/luci/Import/Nodes/CircleUnpack.h new file mode 100644 index 0000000..f1a21de --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleUnpack.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_UNPACK_H__ +#define __LUCI_IMPORT_OP_CIRCLE_UNPACK_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleUnpackGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_UNPACK_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleWhere.h b/compiler/luci/import/include/luci/Import/Nodes/CircleWhere.h new file mode 100644 index 0000000..72f98ef --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleWhere.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_WHERE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_WHERE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleWhereGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const override; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_WHERE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleWhile.h b/compiler/luci/import/include/luci/Import/Nodes/CircleWhile.h new file mode 100644 index 0000000..68c56b3 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleWhile.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_WHILE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_WHILE_H__ + +#include "luci/Import/GraphBuilderBase.h" + +namespace luci +{ + +class CircleWhileGraphBuilder : public GraphBuilderBase +{ +public: + bool validate(const ValidateArgs &args) const final; + + void build(const circle::OperatorT &op, GraphBuilderContext *context) const final; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_WHILE_H__ diff --git a/compiler/luci/import/include/luci/Import/Nodes/CircleZerosLike.h b/compiler/luci/import/include/luci/Import/Nodes/CircleZerosLike.h new file mode 100644 index 0000000..2a34103 --- /dev/null +++ b/compiler/luci/import/include/luci/Import/Nodes/CircleZerosLike.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IMPORT_OP_CIRCLE_ZEROS_LIKE_H__ +#define __LUCI_IMPORT_OP_CIRCLE_ZEROS_LIKE_H__ + +#include "luci/Import/GraphBuilder.h" + +namespace luci +{ + +class CircleZerosLikeGraphBuilder : public GraphBuilder +{ +public: + bool validate(const ValidateArgs &args) const final; + +private: + CircleNode *build_node(const circle::OperatorT &op, const std::vector &inputs, + loco::Graph *graph) const override; +}; + +} // namespace luci + +#endif // __LUCI_IMPORT_OP_CIRCLE_ZEROS_LIKE_H__ diff --git a/compiler/luci/import/include/luci/Importer.h b/compiler/luci/import/include/luci/Importer.h index 246df9f..f08ddcd 100644 --- a/compiler/luci/import/include/luci/Importer.h +++ b/compiler/luci/import/include/luci/Importer.h @@ -51,4 +51,4 @@ private: } // namespace luci -#endif // __MOCO_IMPORTER_H__ +#endif // __LUCI_IMPORTER_H__ diff --git a/compiler/luci/import/src/CircleReader.cpp b/compiler/luci/import/src/CircleReader.cpp index ead0093..81e945d 100644 --- a/compiler/luci/import/src/CircleReader.cpp +++ b/compiler/luci/import/src/CircleReader.cpp @@ -136,6 +136,19 @@ Padding luci_padding(const circle::Padding padding) return Padding::UNDEFINED; } +MirrorPadMode luci_mirrorpad_mode(const circle::MirrorPadMode mode) +{ + switch (mode) + { + case circle::MirrorPadMode::MirrorPadMode_REFLECT: + return MirrorPadMode::REFLECT; + case circle::MirrorPadMode::MirrorPadMode_SYMMETRIC: + return MirrorPadMode::SYMMETRIC; + } + assert(false); + return MirrorPadMode::UNDEFINED; +} + std::unique_ptr luci_quantparam(const circle::QuantizationParametersT *quantization) { @@ -159,6 +172,27 @@ luci_quantparam(const circle::QuantizationParametersT *quantization) return nullptr; } +void copy_tensor_attributes(const circle::TensorT &tensor, CircleNode *node) +{ + node->name(tensor_name(tensor)); + node->dtype(luci_datatype(tensor.type)); + + std::vector dims = tensor.shape; // in NHWC + node->rank(dims.size()); + for (uint32_t r = 0; r < dims.size(); ++r) + { + node->dim(r) = loco::Dimension(dims[r]); + } + + const auto *quantization = tensor.quantization.get(); + if (quantization != nullptr) + { + auto quantparam = luci_quantparam(quantization); + if (quantparam) + node->quantparam(std::move(quantparam)); + } +} + circle::BuiltinOperator CircleReader::builtin_code(const circle::OperatorT &op) const { const auto &op_codes = opcodes(); @@ -192,6 +226,9 @@ bool CircleReader::parse(const circle::Model *model) _model.reset(model->UnPack()); + // for direct pointer access + _model_ptr = model; + return true; } @@ -205,6 +242,12 @@ bool CircleReader::select_subgraph(uint32_t sgindex) _current_subgraph = _model->subgraphs[sgindex].get(); + // for direct pointer access + auto subgraphs = _model_ptr->subgraphs(); + const circle::SubGraph *subgraph = (*subgraphs)[sgindex]; + + _tensors_ptr = subgraph->tensors(); + return true; } diff --git a/compiler/luci/import/src/GraphBuilder.cpp b/compiler/luci/import/src/GraphBuilder.cpp index e0ec9de..80a9f98 100644 --- a/compiler/luci/import/src/GraphBuilder.cpp +++ b/compiler/luci/import/src/GraphBuilder.cpp @@ -16,21 +16,39 @@ #include "luci/Import/GraphBuilder.h" +#include + namespace luci { void GraphBuilder::build(const circle::OperatorT &op, GraphBuilderContext *context) const { + LOGGER(l); + assert(context != nullptr); const std::vector &inputs = op.inputs; const std::vector &outputs = op.outputs; const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); std::vector input_nodes; for (const int32_t input_tensor_index : inputs) { - input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + if (input_tensor_index >= 0) + { + auto input = context->nodefinder()->node(input_tensor_index); + if (input == nullptr) + INFO(l) << "[luci] Warning: input node is null " << input_tensor_index << std::endl; + input_nodes.push_back(input); + } + else + { + // If there is no tensor, insert CircleOutputExclude. + input_nodes.push_back(context->graph()->nodes()->create()); + } } CircleNode *node = build_node(op, input_nodes, context->graph()); @@ -39,16 +57,15 @@ void GraphBuilder::build(const circle::OperatorT &op, GraphBuilderContext *conte assert(outputs.size() == 1); { const circle::TensorT &output_tensor = *tensors[outputs[0]]; + copy_tensor_attributes(output_tensor, node); + // mark shape_status + if (tensors_ptr->Get(outputs[0])->shape() == nullptr) + node->shape_status(ShapeStatus::NOSHAPE); + else + node->shape_status(ShapeStatus::VALID); - node->name(tensor_name(output_tensor)); - - auto quantization = tensor_quantization(output_tensor); - if (quantization) - { - auto quantparam = luci_quantparam(quantization); - if (quantparam) - node->quantparam(std::move(quantparam)); - } + // mark operator version + node->op_version(opcodes[op.opcode_index].get()->version); } // Register node's only output. diff --git a/compiler/luci/import/src/GraphBuilderContext.cpp b/compiler/luci/import/src/GraphBuilderContext.cpp index a5162ce..21adfa7 100644 --- a/compiler/luci/import/src/GraphBuilderContext.cpp +++ b/compiler/luci/import/src/GraphBuilderContext.cpp @@ -25,10 +25,12 @@ namespace luci void IndexNodeFinder::enroll(TensorIndex idx, CircleNode *node) { - if (_table.find(idx) != _table.end()) + auto iter = _table.find(idx); + if (iter != _table.end()) { LOGGER(l); - INFO(l) << "[luci] NodeFinder SKIP (" << idx << ") " << node << std::endl; + INFO(l) << "[luci] NodeFinder SKIP (" << idx << ") " << node << ":" << node->name() + << " existing: " << iter->second << ":" << iter->second->name() << std::endl; return; } @@ -39,9 +41,22 @@ CircleNode *IndexNodeFinder::node(TensorIndex idx) const { MapIndexNode_t::const_iterator iter = _table.find(idx); - assert(iter != _table.end() && iter->second != nullptr); + // dangle output node may exist that are not enrolled + return (iter != _table.end()) ? iter->second : nullptr; +} - return iter->second; +void IndexTensorOutputs::enroll(TensorIndex idx) +{ + auto iter = _set.find(idx); + if (iter != _set.end()) + { + LOGGER(l); + INFO(l) << "[luci] TensorOutputs SKIP (" << idx << ") existing" << std::endl; + return; + } + _set.insert(idx); } +bool IndexTensorOutputs::find(TensorIndex idx) { return (_set.find(idx) != _set.end()); } + } // namespace luci diff --git a/compiler/luci/import/src/GraphBuilderRegistry.cpp b/compiler/luci/import/src/GraphBuilderRegistry.cpp index 929b71a..d29557f 100644 --- a/compiler/luci/import/src/GraphBuilderRegistry.cpp +++ b/compiler/luci/import/src/GraphBuilderRegistry.cpp @@ -27,137 +27,140 @@ GraphBuilderRegistry::GraphBuilderRegistry() { #define CIRCLE_NODE(OPCODE, CLASS) add(circle::BuiltinOperator_##OPCODE, std::make_unique()); - CIRCLE_NODE(ABS, CircleAbsGraphBuilder); // 101 - CIRCLE_NODE(ADD, CircleAddGraphBuilder); // 0 - CIRCLE_NODE(ARG_MAX, CircleArgMaxGraphBuilder); // 56 - CIRCLE_NODE(AVERAGE_POOL_2D, CircleAveragePool2DGraphBuilder); // 1 - CIRCLE_NODE(BATCH_TO_SPACE_ND, CircleBatchToSpaceNDGraphBuilder); // 37 - CIRCLE_NODE(CONCATENATION, CircleConcatenationGraphBuilder); // 2 - CIRCLE_NODE(CONV_2D, CircleConv2DGraphBuilder); // 3 - CIRCLE_NODE(COS, CircleCosGraphBuilder); // 108 - CIRCLE_NODE(DEPTHWISE_CONV_2D, CircleDepthwiseConv2DGraphBuilder); // 4 - CIRCLE_NODE(DIV, CircleDivGraphBuilder); // 42 - CIRCLE_NODE(EQUAL, CircleEqualGraphBuilder); // 71 - CIRCLE_NODE(EXP, CircleExpGraphBuilder); // 47 - CIRCLE_NODE(FULLY_CONNECTED, CircleFullyConnectedGraphBuilder); // 9 - CIRCLE_NODE(LOGICAL_NOT, CircleLogicalNotGraphBuilder); // 87 - CIRCLE_NODE(LOGICAL_OR, CircleLogicalOrGraphBuilder); // 84 - CIRCLE_NODE(MAX_POOL_2D, CircleMaxPool2DGraphBuilder); // 17 - CIRCLE_NODE(MEAN, CircleMeanGraphBuilder); // 40 - CIRCLE_NODE(MUL, CircleMulGraphBuilder); // 18 - CIRCLE_NODE(PACK, CirclePackGraphBuilder); // 83 - CIRCLE_NODE(PAD, CirclePadGraphBuilder); // 34 - CIRCLE_NODE(RELU, CircleReluGraphBuilder); // 19 - CIRCLE_NODE(RESHAPE, CircleReshapeGraphBuilder); // 22 - CIRCLE_NODE(RSQRT, CircleRsqrtGraphBuilder); // 76 - CIRCLE_NODE(SOFTMAX, CircleSoftmaxGraphBuilder); // 25 - CIRCLE_NODE(SUB, CircleSubGraphBuilder); // 41 - CIRCLE_NODE(TRANSPOSE, CircleTransposeGraphBuilder); // 39 + CIRCLE_NODE(ABS, CircleAbsGraphBuilder); // 101 + CIRCLE_NODE(ADD, CircleAddGraphBuilder); // 0 + CIRCLE_NODE(ADD_N, CircleAddNGraphBuilder); // 106 + CIRCLE_NODE(ARG_MAX, CircleArgMaxGraphBuilder); // 56 + CIRCLE_NODE(ARG_MIN, CircleArgMinGraphBuilder); // 79 + CIRCLE_NODE(AVERAGE_POOL_2D, CircleAveragePool2DGraphBuilder); // 1 + CIRCLE_NODE(BATCH_MATMUL, CircleBatchMatMulGraphBuilder); // 126 + CIRCLE_NODE(BATCH_TO_SPACE_ND, CircleBatchToSpaceNDGraphBuilder); // 37 + CIRCLE_NODE(BCQ_FULLY_CONNECTED, CircleBCQFullyConnectedGraphBuilder); // 253 + CIRCLE_NODE(BCQ_GATHER, CircleBCQGatherGraphBuilder); // 252 + CIRCLE_NODE(CAST, CircleCastGraphBuilder); // 53 + CIRCLE_NODE(CEIL, CircleCeilGraphBuilder); // 104 + CIRCLE_NODE(CUSTOM, CircleCustomGraphBuilder); // 32 + CIRCLE_NODE(CONCATENATION, CircleConcatenationGraphBuilder); // 2 + CIRCLE_NODE(CONV_2D, CircleConv2DGraphBuilder); // 3 + CIRCLE_NODE(COS, CircleCosGraphBuilder); // 108 + CIRCLE_NODE(DEPTH_TO_SPACE, CircleDepthToSpaceGraphBuilder); // 5 + CIRCLE_NODE(DEPTHWISE_CONV_2D, CircleDepthwiseConv2DGraphBuilder); // 4 + CIRCLE_NODE(DIV, CircleDivGraphBuilder); // 42 + CIRCLE_NODE(ELU, CircleEluGraphBuilder); // 111 + CIRCLE_NODE(EQUAL, CircleEqualGraphBuilder); // 71 + CIRCLE_NODE(EXP, CircleExpGraphBuilder); // 47 + CIRCLE_NODE(EXPAND_DIMS, CircleExpandDimsGraphBuilder); // 70 + CIRCLE_NODE(FILL, CircleFillGraphBuilder); // 94 + CIRCLE_NODE(FLOOR, CircleFloorGraphBuilder); // 8 + CIRCLE_NODE(FLOOR_DIV, CircleFloorDivGraphBuilder); // 90 + CIRCLE_NODE(FLOOR_MOD, CircleFloorModGraphBuilder); // 95 + CIRCLE_NODE(FULLY_CONNECTED, CircleFullyConnectedGraphBuilder); // 9 + CIRCLE_NODE(GATHER, CircleGatherGraphBuilder); // 36 + CIRCLE_NODE(GATHER_ND, CircleGatherNdGraphBuilder); // 107 + CIRCLE_NODE(GREATER, CircleGreaterGraphBuilder); // 61 + CIRCLE_NODE(GREATER_EQUAL, CircleGreaterEqualGraphBuilder); // 62 + CIRCLE_NODE(IF, CircleIfGraphBuilder); // 118 + CIRCLE_NODE(INSTANCE_NORM, CircleInstanceNormGraphBuilder); // 254 + CIRCLE_NODE(L2_NORMALIZATION, CircleL2NormalizeGraphBuilder); // 11 + CIRCLE_NODE(L2_POOL_2D, CircleL2Pool2DGraphBuilder); // 12 + CIRCLE_NODE(LEAKY_RELU, CircleLeakyReluGraphBuilder); // 98, + CIRCLE_NODE(LESS, CircleLessGraphBuilder); // 58 + CIRCLE_NODE(LESS_EQUAL, CircleLessEqualGraphBuilder); // 63 + CIRCLE_NODE(LOCAL_RESPONSE_NORMALIZATION, CircleLocalResponseNormalizationGraphBuilder); // 13 + CIRCLE_NODE(LOG, CircleLogGraphBuilder); // 73 + CIRCLE_NODE(LOGICAL_AND, CircleLogicalAndGraphBuilder); // 86 + CIRCLE_NODE(LOGICAL_NOT, CircleLogicalNotGraphBuilder); // 87 + CIRCLE_NODE(LOGICAL_OR, CircleLogicalOrGraphBuilder); // 84 + CIRCLE_NODE(LOGISTIC, CircleLogisticGraphBuilder); // 14 + CIRCLE_NODE(LOG_SOFTMAX, CircleLogSoftmaxGraphBuilder); // 50 + CIRCLE_NODE(MATRIX_DIAG, CircleMatrixDiagGraphBuilder); // 113 + CIRCLE_NODE(MATRIX_SET_DIAG, CircleMatrixSetDiagGraphBuilder); // 115 + CIRCLE_NODE(MAXIMUM, CircleMaximumGraphBuilder); // 55 + CIRCLE_NODE(MAX_POOL_2D, CircleMaxPool2DGraphBuilder); // 17 + CIRCLE_NODE(MEAN, CircleMeanGraphBuilder); // 40 + CIRCLE_NODE(MINIMUM, CircleMinimumGraphBuilder); // 57 + CIRCLE_NODE(MIRROR_PAD, CircleMirrorPadGraphBuilder); // 100 + CIRCLE_NODE(MUL, CircleMulGraphBuilder); // 18 + CIRCLE_NODE(NEG, CircleNegGraphBuilder); // 59 + CIRCLE_NODE(NOT_EQUAL, CircleNotEqualGraphBuilder); // 72 + CIRCLE_NODE(ONE_HOT, CircleOneHotGraphBuilder); // 85 + CIRCLE_NODE(PACK, CirclePackGraphBuilder); // 83 + CIRCLE_NODE(PAD, CirclePadGraphBuilder); // 34 + CIRCLE_NODE(POW, CirclePowGraphBuilder); // 78 + CIRCLE_NODE(PRELU, CirclePReluGraphBuilder); // 54, + CIRCLE_NODE(RANGE, CircleRangeGraphBuilder); // 96 + CIRCLE_NODE(RANK, CircleRankGraphBuilder); // 110 + CIRCLE_NODE(REDUCE_ANY, CircleReduceAnyGraphBuilder); // 91 + CIRCLE_NODE(REDUCE_MAX, CircleReduceMaxGraphBuilder); // 82 + CIRCLE_NODE(REDUCE_MIN, CircleReduceMinGraphBuilder); // 89 + CIRCLE_NODE(REDUCE_PROD, CircleReduceProdGraphBuilder); // 81 + CIRCLE_NODE(RELU, CircleReluGraphBuilder); // 19 + CIRCLE_NODE(RELU6, CircleRelu6GraphBuilder); // 21 + CIRCLE_NODE(RELU_N1_TO_1, CircleReluN1To1GraphBuilder); // 20 + CIRCLE_NODE(RESHAPE, CircleReshapeGraphBuilder); // 22 + CIRCLE_NODE(RESIZE_BILINEAR, CircleResizeBilinearGraphBuilder); // 23 + CIRCLE_NODE(RESIZE_NEAREST_NEIGHBOR, CircleResizeNearestNeighborGraphBuilder); // 97 + CIRCLE_NODE(REVERSE_SEQUENCE, CircleReverseSequenceGraphBuilder); // 112 + CIRCLE_NODE(REVERSE_V2, CircleReverseV2GraphBuilder); // 105 + CIRCLE_NODE(ROUND, CircleRoundGraphBuilder); // 116 + CIRCLE_NODE(RSQRT, CircleRsqrtGraphBuilder); // 76 + CIRCLE_NODE(SCATTER_ND, CircleScatterNdGraphBuilder); // 122 + CIRCLE_NODE(SEGMENT_SUM, CircleSegmentSumGraphBuilder); // 125 + CIRCLE_NODE(SELECT, CircleSelectGraphBuilder); // 64 + CIRCLE_NODE(SELECT_V2, CircleSelectV2GraphBuilder); // 123 + CIRCLE_NODE(SHAPE, CircleShapeGraphBuilder); // 77 + CIRCLE_NODE(SIN, CircleSinGraphBuilder); // 66 + CIRCLE_NODE(SLICE, CircleSliceGraphBuilder); // 65 + CIRCLE_NODE(SOFTMAX, CircleSoftmaxGraphBuilder); // 25 + CIRCLE_NODE(SPACE_TO_BATCH_ND, CircleSpaceToBatchNDGraphBuilder); // 38 + CIRCLE_NODE(SPACE_TO_DEPTH, CircleSpaceToDepthGraphBuilder); // 26 + CIRCLE_NODE(SPARSE_TO_DENSE, CircleSparseToDenseGraphBuilder); // 68 + CIRCLE_NODE(SPLIT, CircleSplitGraphBuilder); // 49 + CIRCLE_NODE(SPLIT_V, CircleSplitVGraphBuilder); // 102 + CIRCLE_NODE(SQRT, CircleSqrtGraphBuilder); // 75 + CIRCLE_NODE(SQUARE, CircleSquareGraphBuilder); // 92 + CIRCLE_NODE(SQUARED_DIFFERENCE, CircleSquaredDifferenceGraphBuilder); // 99 + CIRCLE_NODE(SQUEEZE, CircleSqueezeGraphBuilder); // 43 + CIRCLE_NODE(STRIDED_SLICE, CircleStridedSliceGraphBuilder); // 45 + CIRCLE_NODE(SUB, CircleSubGraphBuilder); // 41 + CIRCLE_NODE(SUM, CircleSumGraphBuilder); // 74 + CIRCLE_NODE(TANH, CircleTanhGraphBuilder); // 28 + CIRCLE_NODE(TILE, CircleTileGraphBuilder); // 69 + CIRCLE_NODE(TOPK_V2, CircleTopKV2GraphBuilder); // 48 + CIRCLE_NODE(TRANSPOSE, CircleTransposeGraphBuilder); // 39 + CIRCLE_NODE(TRANSPOSE_CONV, CircleTransposeConvGraphBuilder); // 67 + CIRCLE_NODE(UNPACK, CircleUnpackGraphBuilder); // 88 + CIRCLE_NODE(WHERE, CircleWhereGraphBuilder); // 109 + CIRCLE_NODE(WHILE, CircleWhileGraphBuilder); // 119 + CIRCLE_NODE(ZEROS_LIKE, CircleZerosLikeGraphBuilder); // 93 #undef CIRCLE_NODE // BuiltinOperator_DEQUANTIZE = 6, // BuiltinOperator_EMBEDDING_LOOKUP = 7, - // BuiltinOperator_FLOOR = 8, // BuiltinOperator_HASHTABLE_LOOKUP = 10, - // BuiltinOperator_L2_NORMALIZATION = 11, - // BuiltinOperator_L2_POOL_2D = 12, - // BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION = 13, - // BuiltinOperator_LOGISTIC = 14, // BuiltinOperator_LSH_PROJECTION = 15, // BuiltinOperator_LSTM = 16, - // BuiltinOperator_RELU_N1_TO_1 = 20, - // BuiltinOperator_RELU6 = 21, - // BuiltinOperator_RESIZE_BILINEAR = 23, // BuiltinOperator_RNN = 24, - // BuiltinOperator_SPACE_TO_DEPTH = 26, // BuiltinOperator_SVDF = 27, - // BuiltinOperator_TANH = 28, // BuiltinOperator_CONCAT_EMBEDDINGS = 29, // BuiltinOperator_SKIP_GRAM = 30, // BuiltinOperator_CALL = 31, - // BuiltinOperator_CUSTOM = 32, // BuiltinOperator_EMBEDDING_LOOKUP_SPARSE = 33, // BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN = 35, - // BuiltinOperator_GATHER = 36, - // BuiltinOperator_SPACE_TO_BATCH_ND = 38, - // BuiltinOperator_SQUEEZE = 43, // BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM = 44, - // BuiltinOperator_STRIDED_SLICE = 45, // BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN = 46, - // BuiltinOperator_TOPK_V2 = 48, - // BuiltinOperator_SPLIT = 49, - // BuiltinOperator_LOG_SOFTMAX = 50, // BuiltinOperator_DELEGATE = 51, // BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM = 52, - // BuiltinOperator_CAST = 53, - // BuiltinOperator_PRELU = 54, - // BuiltinOperator_MAXIMUM = 55, // BuiltinOperator_ARG_MAX = 56, - // BuiltinOperator_MINIMUM = 57, - // BuiltinOperator_LESS = 58, - // BuiltinOperator_NEG = 59, // BuiltinOperator_PADV2 = 60, - // BuiltinOperator_GREATER = 61, - // BuiltinOperator_GREATER_EQUAL = 62, - // BuiltinOperator_LESS_EQUAL = 63, - // BuiltinOperator_SELECT = 64, - // BuiltinOperator_SLICE = 65, - // BuiltinOperator_SIN = 66, - // BuiltinOperator_TRANSPOSE_CONV = 67, - // BuiltinOperator_SPARSE_TO_DENSE = 68, - // BuiltinOperator_TILE = 69, - // BuiltinOperator_EXPAND_DIMS = 70, - // BuiltinOperator_NOT_EQUAL = 72, - // BuiltinOperator_LOG = 73, - // BuiltinOperator_SUM = 74, - // BuiltinOperator_SQRT = 75, - // BuiltinOperator_SHAPE = 77, - // BuiltinOperator_POW = 78, - // BuiltinOperator_ARG_MIN = 79, // BuiltinOperator_FAKE_QUANT = 80, - // BuiltinOperator_REDUCE_PROD = 81, - // BuiltinOperator_REDUCE_MAX = 82, - // BuiltinOperator_ONE_HOT = 85, - // BuiltinOperator_LOGICAL_AND = 86, - // BuiltinOperator_UNPACK = 88, - // BuiltinOperator_REDUCE_MIN = 89, - // BuiltinOperator_FLOOR_DIV = 90, - // BuiltinOperator_REDUCE_ANY = 91, - // BuiltinOperator_SQUARE = 92, - // BuiltinOperator_ZEROS_LIKE = 93, - // BuiltinOperator_FILL = 94, - // BuiltinOperator_FLOOR_MOD = 95, - // BuiltinOperator_RANGE = 96, - // BuiltinOperator_RESIZE_NEAREST_NEIGHBOR = 97, - // BuiltinOperator_LEAKY_RELU = 98, - // BuiltinOperator_SQUARED_DIFFERENCE = 99, - // BuiltinOperator_MIRROR_PAD = 100, - // BuiltinOperator_SPLIT_V = 102, // BuiltinOperator_UNIQUE = 103, - // BuiltinOperator_CEIL = 104, - // BuiltinOperator_REVERSE_V2 = 105, - // BuiltinOperator_ADD_N = 106, - // BuiltinOperator_GATHER_ND = 107, - // BuiltinOperator_WHERE = 109, - // BuiltinOperator_RANK = 110, - // BuiltinOperator_ELU = 111, - // BuiltinOperator_REVERSE_SEQUENCE = 112, - // BuiltinOperator_MATRIX_DIAG = 113, // BuiltinOperator_QUANTIZE = 114, - // BuiltinOperator_MATRIX_SET_DIAG = 115, - // BuiltinOperator_ROUND = 116, // BuiltinOperator_HARD_SWISH = 117, - // BuiltinOperator_IF = 118, - // BuiltinOperator_WHILE = 119, // BuiltinOperator_NON_MAX_SUPPRESSION_V4 = 120, // BuiltinOperator_NON_MAX_SUPPRESSION_V5 = 121, - // BuiltinOperator_SCATTER_ND = 122, - // BuiltinOperator_SELECT_V2 = 123, // BuiltinOperator_DENSIFY = 124, - // BuiltinOperator_SEGMENT_SUM = 125, - // BuiltinOperator_BATCH_MATMUL = 126, - // BuiltinOperator_INSTANCE_NORM = 254, } } // namespace luci diff --git a/compiler/luci/import/src/Importer.cpp b/compiler/luci/import/src/Importer.cpp index 964c476..ab89f35 100644 --- a/compiler/luci/import/src/Importer.cpp +++ b/compiler/luci/import/src/Importer.cpp @@ -15,6 +15,7 @@ */ #include "luci/Importer.h" +#include "PostImport.h" #include "luci/Import/GraphBuilder.h" #include "luci/Import/GraphBuilderContext.h" @@ -27,6 +28,7 @@ #include #include +#include #include #include @@ -40,11 +42,28 @@ void convert_graph(const luci::GraphBuilderSource &source, luci::CircleReader &r LOGGER(l); auto nodefinder = std::make_unique(); + auto tensoroutputs = std::make_unique(); - luci::GraphBuilderContext gb_context(graph, &reader, nodefinder.get()); + luci::GraphBuilderContext gb_context(graph, &reader, nodefinder.get(), tensoroutputs.get()); const auto &operators = reader.operators(); const auto &tensors = reader.tensors(); + auto tensors_ptr = reader.tensors_ptr(); + assert(tensors_ptr != nullptr); + + // build a cache to identify if a tensor is output of an operator + // if this is set, we should not create a CircleConst for this tensor + for (uint32_t i = 0; i < operators.size(); ++i) + { + const circle::OperatorT &op = *operators[i]; + const auto &outputs = op.outputs; + + for (uint32_t j = 0; j < outputs.size(); ++j) + { + auto tidx = outputs[j]; + tensoroutputs->enroll(tidx); + } + } // graph inputs; there are no input nodes in TFlite but just Tensors // creating virtual input nodes will make possible to connect nodes that uses them @@ -55,51 +74,43 @@ void convert_graph(const luci::GraphBuilderSource &source, luci::CircleReader &r assert(input_node != nullptr); const circle::TensorT &tensor = *tensors[input]; - auto tname = luci::tensor_name(tensor); - input_node->name(tname); - auto quantization = luci::tensor_quantization(tensor); - if (quantization) - { - auto quantparam = luci::luci_quantparam(quantization); - if (quantparam.get()) - input_node->quantparam(std::move(quantparam)); - } + luci::copy_tensor_attributes(tensor, input_node); + if (tensors_ptr->Get(input)->shape() == nullptr) + input_node->shape_status(luci::ShapeStatus::NOSHAPE); + else + input_node->shape_status(luci::ShapeStatus::VALID); INFO(l) << "[luci] NodeFinder INPUT(" << input << ") = " << input_node << std::endl; nodefinder->enroll(input, input_node); - // Shape of Input - const std::vector &input_dims = tensor.shape; // in NHWC - input_node->rank(input_dims.size()); - for (uint32_t r = 0; r < input_dims.size(); ++r) - input_node->dim(r) = loco::Dimension(input_dims[r]); - - // Data type of Input - auto dtype = luci::luci_datatype(tensor.type); - input_node->dtype(dtype); + // input_node is also an output to a tensor + tensoroutputs->enroll(input); // Name auto graph_input = graph->inputs()->create(); - graph_input->name(tname); + graph_input->name(input_node->name()); // Set GraphInputOutputIndex for graph input_node->index(graph_input->index()); // Data type - graph_input->dtype(dtype); + graph_input->dtype(input_node->dtype()); + + // Shape of GraphInput + auto input_shape = std::make_unique(); + const std::vector &input_dims = tensor.shape; // in NHWC + input_shape->rank(input_dims.size()); + for (uint32_t r = 0; r < input_dims.size(); ++r) + input_shape->dim(r) = loco::Dimension(input_dims[r]); + graph_input->shape(std::move(input_shape)); } // Create CircleConst nodes for constant tensors. - const auto &buffers = reader.buffers(); for (uint32_t i = 0; i < tensors.size(); ++i) { - const circle::TensorT &tensor = *tensors[i]; - const std::vector &buffer = buffers[tensor.buffer]->data; - if (!buffer.empty()) - { - luci::CircleConst *const_node = luci::create_circleconst(&gb_context, i); + luci::CircleConst *const_node = luci::create_circleconst(&gb_context, i); + if (const_node != nullptr) nodefinder->enroll(i, const_node); - } } // Import the operators. @@ -130,18 +141,38 @@ void convert_graph(const luci::GraphBuilderSource &source, luci::CircleReader &r // graph outputs for (auto output : reader.outputs()) { + const circle::TensorT &tensor = *tensors[output]; + auto output_node = graph->nodes()->create(); assert(output_node != nullptr); - output_node->from(nodefinder->node(output)); + auto output_from = nodefinder->node(output); + if (output_from != nullptr) + output_node->from(output_from); + else + { + // NOTE loco::Graph requires all input node(s) to a node should exist. + // Here, CircleOutput needs an input node. + // We add a dummy node to make it happy. + auto output_dummy = graph->nodes()->create(); + assert(output_dummy != nullptr); + output_node->from(output_dummy); + + luci::copy_tensor_attributes(tensor, output_dummy); + if (tensors_ptr->Get(output)->shape() == nullptr) + output_dummy->shape_status(luci::ShapeStatus::NOSHAPE); + else + output_dummy->shape_status(luci::ShapeStatus::VALID); + } INFO(l) << "[luci] NodeFinder OUTPUT(" << output << ") = " << output_node << std::endl; // set the graph output name and node object - const circle::TensorT &tensor = *tensors[output]; auto graph_output = graph->outputs()->create(); std::string tname = luci::tensor_name(tensor); graph_output->name("output_" + tname); + luci::copy_tensor_attributes(tensor, output_node); + // Set GraphInputOutputIndex for graph output_node->index(graph_output->index()); @@ -195,8 +226,10 @@ std::unique_ptr Importer::import(const circle::Model *model) const if (!reader.parse(model)) return nullptr; - // TODO support multiple subgraph when Circle supports - assert(reader.num_subgraph() == 1); + if (reader.num_subgraph() != 1) + { + INTERNAL_EXN("Use 'importModule()' for multiple subgraphs"); + } if (!reader.select_subgraph(0)) return nullptr; @@ -204,11 +237,14 @@ std::unique_ptr Importer::import(const circle::Model *model) const convert_graph(*source_ptr, reader, graph.get()); LOGGER(l); - INFO(l) << fmt(graph.get()); + VERBOSE(l, 3) << "--- graph dump begin -------------------------------------------"; + VERBOSE(l, 3) << "Name: " << graph->name(); + VERBOSE(l, 3) << fmt(graph.get()); + VERBOSE(l, 3) << "--- graph dump end ---------------------------------------------"; assert(loco::valid(graph.get(), std::make_unique())); - return std::move(graph); + return graph; } std::unique_ptr Importer::importModule(const circle::Model *model) const @@ -240,14 +276,19 @@ std::unique_ptr Importer::importModule(const circle::Model *model) const convert_graph(*source_ptr, reader, graph.get()); LOGGER(l); - INFO(l) << fmt(graph.get()); + VERBOSE(l, 3) << "--- graph dump begin -------------------------------------------"; + VERBOSE(l, 3) << "Name: " << graph->name(); + VERBOSE(l, 3) << fmt(graph.get()); + VERBOSE(l, 3) << "--- graph dump end ---------------------------------------------"; assert(loco::valid(graph.get(), std::make_unique())); module->add(std::move(graph)); } - return std::move(module); + post_import_graph(module.get(), reader); + + return module; } } // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleAddN.cpp b/compiler/luci/import/src/Nodes/CircleAddN.cpp new file mode 100644 index 0000000..2f1716e --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleAddN.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleAddN.h" + +#include + +#include + +namespace luci +{ + +bool CircleAddNGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() < 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleAddNGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(inputs.size()); + for (uint32_t i = 0; i < inputs.size(); ++i) + { + node->inputs(i, inputs[i]); + } + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleArgMin.cpp b/compiler/luci/import/src/Nodes/CircleArgMin.cpp new file mode 100644 index 0000000..4d85bbf --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleArgMin.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleArgMin.h" + +#include + +#include + +namespace luci +{ + +bool CircleArgMinGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + return true; +} + +CircleNode *CircleArgMinGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->dimension(inputs[1]); + + const auto *options = op.builtin_options.AsArgMinOptions(); + node->output_type(luci_datatype(options->output_type)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleBCQFullyConnected.cpp b/compiler/luci/import/src/Nodes/CircleBCQFullyConnected.cpp new file mode 100644 index 0000000..7cc077e --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleBCQFullyConnected.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleBCQFullyConnected.h" + +#include + +#include + +namespace luci +{ + +bool CircleBCQFullyConnectedGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 5) + return false; + + return true; +} + +CircleNode *CircleBCQFullyConnectedGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->input(inputs[0]); + node->weights_scales(inputs[1]); + node->weights_binary(inputs[2]); + node->bias(inputs[3]); + node->weights_clusters(inputs[4]); + + // TODO Find and move to appropriate place for setting optional input + if (auto bias = dynamic_cast(node->bias())) + { + // bias is not used for type inference, but node itself should have a type + bias->dtype(loco::DataType::FLOAT32); + + // bias is not used for shape inference + } + + const auto *options = op.builtin_options.AsBCQFullyConnectedOptions(); + node->weights_hidden_size(options->weights_hidden_size); + node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleBCQGather.cpp b/compiler/luci/import/src/Nodes/CircleBCQGather.cpp new file mode 100644 index 0000000..c6d2ab5 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleBCQGather.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleBCQGather.h" + +#include + +#include + +namespace luci +{ + +bool CircleBCQGatherGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 4) + return false; + + return true; +} + +CircleNode *CircleBCQGatherGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->input_scales(inputs[0]); + node->input_binary(inputs[1]); + node->indices(inputs[2]); + node->input_clusters(inputs[3]); + + const auto *options = op.builtin_options.AsBCQGatherOptions(); + node->input_hidden_size(options->input_hidden_size); + node->axis(options->axis); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleBatchMatMul.cpp b/compiler/luci/import/src/Nodes/CircleBatchMatMul.cpp new file mode 100644 index 0000000..6026b2a --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleBatchMatMul.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleBatchMatMul.h" + +#include + +namespace luci +{ + +bool CircleBatchMatMulGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + return true; +} + +CircleNode *CircleBatchMatMulGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + const auto *options = op.builtin_options.AsBatchMatMulOptions(); + node->adj_x(options->adjoint_lhs); + node->adj_y(options->adjoint_rhs); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleCast.cpp b/compiler/luci/import/src/Nodes/CircleCast.cpp new file mode 100644 index 0000000..a4d09b5 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleCast.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleCast.h" + +#include + +#include +#include + +#include + +namespace luci +{ + +bool CircleCastGraphBuilder::validate(const ValidateArgs &args) const +{ + LOGGER(l); + + auto settings = luci::UserSettings::settings(); + + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 1) + return false; + if (outputs.size() != 1) + return false; + + // NOTE real models do have type mismatch + const auto *options = args.op.builtin_options.AsCastOptions(); + if (options != nullptr) + { + const auto &tensors = args.reader.tensors(); + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + auto name = tensor_name(output_tensor); + + const auto &tensor_in = tensors.at(inputs[0]); + if (tensor_in->type != options->in_data_type) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + WARN(l) << "Warning: import Cast(" << name << ") dtype mismatch"; + } + else + return false; + } + const auto &tensor_out = tensors.at(outputs[0]); + if (tensor_out->type != options->out_data_type) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + WARN(l) << "Warning: import Cast(" << name << ") dtype mismatch"; + } + else + return false; + } + } + + return true; +} + +CircleNode *CircleCastGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + const auto *options = op.builtin_options.AsCastOptions(); + if (options != nullptr) + { + node->in_data_type(luci_datatype(options->in_data_type)); + node->out_data_type(luci_datatype(options->out_data_type)); + } + else + { + node->in_data_type(inputs[0]->dtype()); + node->out_data_type(loco::DataType::Unknown); + // type inference should use node->dtype() for Unknown + // export should use BuiltinOptions_NONE for Unknown + } + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleCeil.cpp b/compiler/luci/import/src/Nodes/CircleCeil.cpp new file mode 100644 index 0000000..d3d6cd9 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleCeil.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleCeil.h" + +#include + +#include + +namespace luci +{ + +bool CircleCeilGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 1) + return false; + if (outputs.size() != 1) + return false; + + // TODO dtype check + + return true; +} + +CircleNode *CircleCeilGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleConst.cpp b/compiler/luci/import/src/Nodes/CircleConst.cpp index 1d79898..7131dc1 100644 --- a/compiler/luci/import/src/Nodes/CircleConst.cpp +++ b/compiler/luci/import/src/Nodes/CircleConst.cpp @@ -24,6 +24,24 @@ #include +namespace +{ + +std::ostream &operator<<(std::ostream &os, const std::vector &vect) +{ + uint32_t seq = 0; + for (auto &v : vect) + { + if (seq) + os << ", "; + os << v; + seq++; + } + return os; +} + +} // namespace + namespace luci { @@ -53,55 +71,73 @@ CircleConst *create_circleconst(GraphBuilderContext *context, int32_t tensor_ind auto graph = context->graph(); auto reader = context->reader(); const auto &tensors = reader->tensors(); - - // (1) create CircleConst - auto const_node = graph->nodes()->create(); const circle::TensorT &const_tensor = *tensors[tensor_index]; - const_node->name(tensor_name(const_tensor)); - auto quantization = luci::tensor_quantization(const_tensor); - if (quantization) + + const std::vector &buffer = reader->buffers()[const_tensor.buffer]->data; + std::vector const_dims = const_tensor.shape; // in NHWC + if (const_dims.size() == 0 && buffer.empty()) { - auto quantparam = luci::luci_quantparam(quantization); - if (quantparam.get()) - const_node->quantparam(std::move(quantparam)); + // unknown shape tensor + return nullptr; } - INFO(l) << "[luci] NodeFinder const_node(" << tensor_index << ") -> " << const_node << std::endl; - - // (2) set data_type to CircleConst - const_node->dtype(luci_datatype(const_tensor.type)); + // if tensor_index is used as output to some other operator, this is not a constant + auto tensoroutputs = context->tensoroutputs(); + if (tensoroutputs->find(tensor_index)) + { + // other operator output tensor + return nullptr; + } - // (3) set shape to CicleConst - std::vector const_dims = const_tensor.shape; // in NHWC - const_node->rank(const_dims.size()); uint32_t num_elements = 1; for (uint32_t r = 0; r < const_dims.size(); ++r) { - const_node->dim(r) = loco::Dimension(const_dims[r]); num_elements = num_elements * const_dims[r]; } - // (4) constant values from circle buffer - const std::vector &buffer = reader->buffers()[const_tensor.buffer]->data; - if (buffer.empty()) - throw oops::UserExn("Empty buffer"); - - switch (luci_datatype(const_tensor.type)) + if (buffer.empty() && num_elements > 0) { - case loco::DataType::FLOAT32: - copy_data(buffer, num_elements, const_node); - break; - - case loco::DataType::U8: - copy_data(buffer, num_elements, const_node); - break; - - case loco::DataType::S32: - copy_data(buffer, num_elements, const_node); - break; + // normal empty tensor + return nullptr; + } - default: - throw oops::UserExn("Unsupported tensor type", circle::EnumNameTensorType(const_tensor.type)); + auto const_node = graph->nodes()->create(); + copy_tensor_attributes(const_tensor, const_node); + const_node->shape_status(luci::ShapeStatus::VALID); + INFO(l) << "[luci] NodeFinder const_node(" << tensor_index << ") -> " << const_node << " " + << const_dims << std::endl; + if (num_elements > 0) + { + switch (luci_datatype(const_tensor.type)) + { + case loco::DataType::FLOAT32: + copy_data(buffer, num_elements, const_node); + break; + + case loco::DataType::U8: + copy_data(buffer, num_elements, const_node); + break; + + case loco::DataType::S16: + copy_data(buffer, num_elements, const_node); + break; + + case loco::DataType::S32: + copy_data(buffer, num_elements, const_node); + break; + + case loco::DataType::S64: + copy_data(buffer, num_elements, const_node); + break; + + case loco::DataType::BOOL: + copy_data(buffer, num_elements, const_node); + break; + + default: + throw oops::UserExn("Unsupported tensor type", + circle::EnumNameTensorType(const_tensor.type)); + } } return const_node; diff --git a/compiler/luci/import/src/Nodes/CircleConv2D.cpp b/compiler/luci/import/src/Nodes/CircleConv2D.cpp index ec9dce0..42c5c26 100644 --- a/compiler/luci/import/src/Nodes/CircleConv2D.cpp +++ b/compiler/luci/import/src/Nodes/CircleConv2D.cpp @@ -50,7 +50,8 @@ CircleNode *CircleConv2DGraphBuilder::build_node(const circle::OperatorT &op, node->stride()->w(options->stride_w); node->stride()->h(options->stride_h); node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); - // FIXME Check dilation_w_factor, dilation_h_factor. + node->dilation()->w(options->dilation_w_factor); + node->dilation()->h(options->dilation_h_factor); return node; } diff --git a/compiler/luci/import/src/Nodes/CircleCustom.cpp b/compiler/luci/import/src/Nodes/CircleCustom.cpp new file mode 100644 index 0000000..d541ee8 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleCustom.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleCustom.h" + +#include + +namespace luci +{ + +bool CircleCustomGraphBuilder::validate(const ValidateArgs &) const +{ + // DO NOTHING + return true; +} + +void CircleCustomGraphBuilder::build(const circle::OperatorT &op, + GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + // Create CircleCustom + const auto &opcodes = context->reader()->opcodes(); + const uint32_t opcode_index = op.opcode_index; + const circle::OperatorCodeT &opcode = *opcodes[opcode_index]; + + auto *node = graph->nodes()->create(inputs.size()); + uint32_t input_idx = 0; + for (const int32_t input_tensor_index : inputs) + { + node->inputs(input_idx++, context->nodefinder()->node(input_tensor_index)); + } + node->custom_options(std::vector{op.custom_options.begin(), op.custom_options.end()}); + node->custom_code(opcode.custom_code); + // Operator version of custom is always 1, so do nothing + + uint32_t output_count = outputs.size(); + + assert(output_count > 0); + { + // Let's use attributes from output 0 for this node + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->dtype(luci_datatype(output_tensor.type)); + } + + // Create virtual outputs of Custom + for (uint32_t n = 0; n < output_count; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleDepthToSpace.cpp b/compiler/luci/import/src/Nodes/CircleDepthToSpace.cpp new file mode 100644 index 0000000..827b634 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleDepthToSpace.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleDepthToSpace.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleDepthToSpaceGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + const auto *options = args.op.builtin_options.AsDepthToSpaceOptions(); + + if (inputs.size() != 1) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + + if (tensors[outputs[0]]->type != tensors[inputs[0]]->type) + { + return false; + } + + if (options->block_size < 2) + return false; + + return true; +} + +CircleNode *CircleDepthToSpaceGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + const auto *options = op.builtin_options.AsDepthToSpaceOptions(); + node->block_size(options->block_size); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleDepthwiseConv2D.cpp b/compiler/luci/import/src/Nodes/CircleDepthwiseConv2D.cpp index c6d3b1f..2b13f9e 100644 --- a/compiler/luci/import/src/Nodes/CircleDepthwiseConv2D.cpp +++ b/compiler/luci/import/src/Nodes/CircleDepthwiseConv2D.cpp @@ -52,7 +52,8 @@ CircleNode *CircleDepthwiseConv2DGraphBuilder::build_node(const circle::Operator node->stride()->h(options->stride_h); node->depthMultiplier(options->depth_multiplier); node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); - // FIXME Check dilation_w_factor, dilation_h_factor. + node->dilation()->w(options->dilation_w_factor); + node->dilation()->h(options->dilation_h_factor); return node; } diff --git a/compiler/luci/import/src/Nodes/CircleElu.cpp b/compiler/luci/import/src/Nodes/CircleElu.cpp new file mode 100644 index 0000000..37a290c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleElu.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleElu.h" + +#include + +#include + +namespace luci +{ + +bool CircleEluGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 1) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + switch (tensor->type) + { + case circle::TensorType_FLOAT32: + break; + default: + return false; + } + + if (tensors[outputs[0]]->type != tensor->type) + return false; + + return true; +} + +CircleNode *CircleEluGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->features(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleExp.cpp b/compiler/luci/import/src/Nodes/CircleExp.cpp index 44fc93d..a328514 100644 --- a/compiler/luci/import/src/Nodes/CircleExp.cpp +++ b/compiler/luci/import/src/Nodes/CircleExp.cpp @@ -16,7 +16,7 @@ #include "luci/Import/Nodes/CircleExp.h" -#include +#include #include @@ -50,7 +50,7 @@ CircleNode *CircleExpGraphBuilder::build_node(const circle::OperatorT &, const std::vector &inputs, loco::Graph *graph) const { - auto *node = graph->nodes()->create(); + auto *node = graph->nodes()->create(); node->x(inputs[0]); return node; diff --git a/compiler/luci/import/src/Nodes/CircleExpandDims.cpp b/compiler/luci/import/src/Nodes/CircleExpandDims.cpp new file mode 100644 index 0000000..1cef67a --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleExpandDims.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleExpandDims.h" + +#include + +#include + +namespace luci +{ + +bool CircleExpandDimsGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + + if (inputs.size() != 2) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + + return tensors[inputs[1]]->type == circle::TensorType_INT32; +} + +CircleNode *CircleExpandDimsGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->axis(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleFill.cpp b/compiler/luci/import/src/Nodes/CircleFill.cpp new file mode 100644 index 0000000..6c3d3a2 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleFill.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleFill.h" + +#include + +namespace luci +{ + +bool CircleFillGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleFillGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->dims(inputs[0]); + node->value(inputs[1]); + + const auto *options = op.builtin_options.AsFillOptions(); + (void)options; + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleFloor.cpp b/compiler/luci/import/src/Nodes/CircleFloor.cpp new file mode 100644 index 0000000..302a9ea --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleFloor.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleFloor.h" + +#include + +#include + +namespace luci +{ + +bool CircleFloorGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 1) + return false; + if (outputs.size() != 1) + return false; + + // TODO dtype check + + return true; +} + +CircleNode *CircleFloorGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleFloorDiv.cpp b/compiler/luci/import/src/Nodes/CircleFloorDiv.cpp new file mode 100644 index 0000000..8751978 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleFloorDiv.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleFloorDiv.h" + +#include + +#include + +namespace luci +{ + +bool CircleFloorDivGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + const auto &tensor_in_0 = tensors.at(inputs[0]); + const auto &tensor_in_1 = tensors.at(inputs[1]); + const auto &tensor_out = tensors.at(outputs[0]); + + if (tensor_in_0->type != tensor_in_1->type) + return false; + + if (tensor_out->type != tensor_in_1->type) + { + return false; + } + + return true; +} + +CircleNode *CircleFloorDivGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleFloorMod.cpp b/compiler/luci/import/src/Nodes/CircleFloorMod.cpp new file mode 100644 index 0000000..3ccdce0 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleFloorMod.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleFloorMod.h" + +#include + +#include + +namespace luci +{ + +bool CircleFloorModGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 2) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_in_0 = tensors.at(inputs[0]); + const auto &tensor_in_1 = tensors.at(inputs[1]); + if (tensor_in_0->type != tensor_in_1->type) + return false; + + // TODO dtype check + + return true; +} + +CircleNode *CircleFloorModGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp b/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp index 8f74fe9..8937e78 100644 --- a/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp +++ b/compiler/luci/import/src/Nodes/CircleFullyConnected.cpp @@ -17,6 +17,7 @@ #include "luci/Import/Nodes/CircleFullyConnected.h" #include +#include #include #include @@ -39,7 +40,16 @@ CircleNode *CircleFullyConnectedGraphBuilder::build_node(const circle::OperatorT auto *node = graph->nodes()->create(); node->input(inputs[0]); node->weights(inputs[1]); - node->bias(inputs[2]); + node->bias(inputs[2]); // bias is optional + + // TODO Find and move to appropriate place for setting optional input + if (auto bias = dynamic_cast(node->bias())) + { + // bias is not used for type inference, but node itself should have a type + bias->dtype(loco::DataType::FLOAT32); + + // bias is not used for shape inference + } const auto *options = op.builtin_options.AsFullyConnectedOptions(); node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); diff --git a/compiler/luci/import/src/Nodes/CircleGather.cpp b/compiler/luci/import/src/Nodes/CircleGather.cpp new file mode 100644 index 0000000..1caa05e --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleGather.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleGather.h" + +#include + +#include +#include + +namespace luci +{ + +bool CircleGatherGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + const auto *options = args.op.builtin_options.AsGatherOptions(); + + int32_t axis = options->axis; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + if (axis < 0) + axis += inputs.size(); + + if (axis < 0) + return false; + + // TODO do indices type check + // TODO do axis check when shape information is given + + return true; +} + +CircleNode *CircleGatherGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->params(inputs[0]); + node->indices(inputs[1]); + + const auto *options = op.builtin_options.AsGatherOptions(); + node->axis(options->axis); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleGatherNd.cpp b/compiler/luci/import/src/Nodes/CircleGatherNd.cpp new file mode 100644 index 0000000..621d4ae --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleGatherNd.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleGatherNd.h" + +#include + +#include +#include +#include + +namespace luci +{ + +bool CircleGatherNdGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + auto &indices_tensor = args.reader.tensors()[inputs[1]]; + + if (!(indices_tensor->type == circle::TensorType::TensorType_INT32 || + indices_tensor->type == circle::TensorType::TensorType_INT64)) + { + return false; + } + + return true; +} + +CircleNode *CircleGatherNdGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->params(inputs[0]); + node->indices(inputs[1]); + + // GatherNd options empty + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleGreater.cpp b/compiler/luci/import/src/Nodes/CircleGreater.cpp new file mode 100644 index 0000000..8810758 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleGreater.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleGreater.h" + +#include + +#include +#include + +#include + +namespace luci +{ + +bool CircleGreaterGraphBuilder::validate(const ValidateArgs &args) const +{ + LOGGER(l); + + auto settings = luci::UserSettings::settings(); + + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + + if (tensors[inputs[0]]->type != tensors[inputs[1]]->type) + return false; + + // NOTE: real models do have output dtype NOT BOOL + if (tensors[outputs[0]]->type != circle::TensorType_BOOL) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + auto name = tensor_name(output_tensor); + WARN(l) << "Warning: import Greater(" << name << ") output dtype is not boolean"; + } + else + return false; + } + + return true; +} + +CircleNode *CircleGreaterGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleGreaterEqual.cpp b/compiler/luci/import/src/Nodes/CircleGreaterEqual.cpp new file mode 100644 index 0000000..dff1510 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleGreaterEqual.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleGreaterEqual.h" + +#include + +#include + +namespace luci +{ + +bool CircleGreaterEqualGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + + if (tensors[inputs[0]]->type != tensors[inputs[1]]->type) + { + return false; + } + + return tensors[outputs[0]]->type == circle::TensorType::TensorType_BOOL; +} + +CircleNode *CircleGreaterEqualGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleIf.cpp b/compiler/luci/import/src/Nodes/CircleIf.cpp new file mode 100644 index 0000000..d609064 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleIf.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleIf.h" + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleIfGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto *options = args.op.builtin_options.AsIfOptions(); + + if (inputs.size() < 2) // cond + input + return false; + if (args.op.outputs.size() < 1) // output + return false; + + auto num_graphs = static_cast(args.reader.num_subgraph()); + if (options->then_subgraph_index >= num_graphs) + return false; + if (options->else_subgraph_index >= num_graphs) + return false; + + // input 0 should be BOOL type + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + if (tensor->type != circle::TensorType_BOOL) + return false; + + const auto &shape = tensor->shape; + if (shape.size() != 1 && shape.size() != 0) + return false; + + return true; +} + +/** + * @brief If Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleIfOut nodes to emulate this + * For two outputs that may look like this + * + * --- CircleIf --- Node --- + * \- Node --- + * + * will be created like this + * + * --- CircleIf --- CircleIfOut --- Node --- + * \- CircleIfOut --- Node --- + */ + +void CircleIfGraphBuilder::build(const circle::OperatorT &op, GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + } + + uint32_t input_count = inputs.size() - 1; + uint32_t output_count = outputs.size(); + + // Create CircleIf + CircleIf *node = graph->nodes()->create(input_count, output_count); + + node->cond(input_nodes[0]); + for (uint32_t idx = 0; idx < input_count; ++idx) + { + node->input(idx, input_nodes[idx + 1]); + } + + const auto *options = op.builtin_options.AsIfOptions(); + node->then_branch(options->then_subgraph_index); + node->else_branch(options->else_subgraph_index); + + assert(outputs.size() > 0); + { + // Lets use name of output 0 as If name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for If itself but to virtual outputs + } + + // Create virtual outputs of If + for (uint32_t n = 0; n < output_count; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleInstanceNorm.cpp b/compiler/luci/import/src/Nodes/CircleInstanceNorm.cpp new file mode 100644 index 0000000..b95c54c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleInstanceNorm.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleInstanceNorm.h" + +#include + +#include + +namespace luci +{ + +bool CircleInstanceNormGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 3) + return false; + + // TODO check dtypes + + return true; +} + +CircleNode *CircleInstanceNormGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->gamma(inputs[1]); + node->beta(inputs[2]); + + const auto *options = op.builtin_options.AsInstanceNormOptions(); + node->epsilon(options->epsilon); + node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleL2Normalize.cpp b/compiler/luci/import/src/Nodes/CircleL2Normalize.cpp new file mode 100644 index 0000000..fe10a85 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleL2Normalize.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleL2Normalize.h" + +#include + +#include + +namespace luci +{ + +bool CircleL2NormalizeGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 1) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + return true; +} + +CircleNode *CircleL2NormalizeGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + const auto *options = op.builtin_options.AsL2NormOptions(); + node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleL2Pool2D.cpp b/compiler/luci/import/src/Nodes/CircleL2Pool2D.cpp new file mode 100644 index 0000000..0232066 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleL2Pool2D.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleL2Pool2D.h" + +#include + +#include + +namespace luci +{ + +bool CircleL2Pool2DGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + // TODO check dtypes + + return true; +} + +CircleNode *CircleL2Pool2DGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->value(inputs[0]); + + const auto *options = op.builtin_options.AsPool2DOptions(); + node->padding(luci_padding(options->padding)); + node->stride()->w(options->stride_w); + node->stride()->h(options->stride_h); + node->filter()->w(options->filter_width); + node->filter()->h(options->filter_height); + node->fusedActivationFunction(luci_actfunc(options->fused_activation_function)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLeakyRelu.cpp b/compiler/luci/import/src/Nodes/CircleLeakyRelu.cpp new file mode 100644 index 0000000..4957cea --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLeakyRelu.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLeakyRelu.h" + +#include + +#include + +namespace luci +{ + +bool CircleLeakyReluGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleLeakyReluGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->features(inputs[0]); + + const auto *options = op.builtin_options.AsLeakyReluOptions(); + node->alpha(options->alpha); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLess.cpp b/compiler/luci/import/src/Nodes/CircleLess.cpp new file mode 100644 index 0000000..40ad28c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLess.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLess.h" + +#include + +#include + +namespace luci +{ + +bool CircleLessGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + switch (tensor->type) + { + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_INT32: + case circle::TensorType_UINT8: + case circle::TensorType_INT16: + case circle::TensorType_INT8: + case circle::TensorType_INT64: + case circle::TensorType_FLOAT16: + break; + default: + return false; + } + + if (tensors[inputs[1]]->type != tensor->type) + { + return false; + } + + return tensors[outputs[0]]->type == circle::TensorType_BOOL; +} + +CircleNode *CircleLessGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLessEqual.cpp b/compiler/luci/import/src/Nodes/CircleLessEqual.cpp new file mode 100644 index 0000000..13e9950 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLessEqual.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLessEqual.h" + +#include + +#include + +namespace luci +{ + +bool CircleLessEqualGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + + if (tensors[inputs[0]]->type != tensors[inputs[1]]->type) + { + return false; + } + + return tensors[outputs[0]]->type == circle::TensorType::TensorType_BOOL; +} + +CircleNode *CircleLessEqualGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLocalResponseNormalization.cpp b/compiler/luci/import/src/Nodes/CircleLocalResponseNormalization.cpp new file mode 100644 index 0000000..7b1f0db --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLocalResponseNormalization.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLocalResponseNormalization.h" + +#include + +#include + +namespace luci +{ + +bool CircleLocalResponseNormalizationGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + // TODO do attribute checks + + return true; +} + +CircleNode *CircleLocalResponseNormalizationGraphBuilder::build_node( + const circle::OperatorT &op, const std::vector &inputs, loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + const auto *options = op.builtin_options.AsLocalResponseNormalizationOptions(); + node->radius(options->radius); + node->bias(options->bias); + node->alpha(options->alpha); + node->beta(options->beta); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLog.cpp b/compiler/luci/import/src/Nodes/CircleLog.cpp new file mode 100644 index 0000000..2140832 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLog.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLog.h" + +#include + +#include + +namespace luci +{ + +bool CircleLogGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + if (args.op.outputs.size() != 1) + return false; + + // input type check + // Must be one of bfloat16, half, float32, float64, complex64, complex128. + // Currently circle supports half(float16), float32, float64, complex64. + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_COMPLEX64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleLogGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + // No options for Log + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLogSoftmax.cpp b/compiler/luci/import/src/Nodes/CircleLogSoftmax.cpp new file mode 100644 index 0000000..e738c4a --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLogSoftmax.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLogSoftmax.h" + +#include + +#include + +namespace luci +{ + +bool CircleLogSoftmaxGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + // TODO do attribute checks + + return true; +} + +CircleNode *CircleLogSoftmaxGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->logits(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLogicalAnd.cpp b/compiler/luci/import/src/Nodes/CircleLogicalAnd.cpp new file mode 100644 index 0000000..8509dba --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLogicalAnd.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLogicalAnd.h" + +#include + +#include + +namespace luci +{ + +bool CircleLogicalAndGraphBuilder::validate(const ValidateArgs &args) const +{ + // Only BOOL type is allowed for inputs + const auto &inputs = args.op.inputs; + if (inputs.size() != 2) + return false; + + const auto &tensors = args.reader.tensors(); + for (auto input : inputs) + { + const auto &tensor = tensors.at(input); + if (tensor->type != circle::TensorType::TensorType_BOOL) + return false; + } + + return true; +} + +CircleNode *CircleLogicalAndGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleLogistic.cpp b/compiler/luci/import/src/Nodes/CircleLogistic.cpp new file mode 100644 index 0000000..85e7e55 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleLogistic.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleLogistic.h" + +#include + +#include + +namespace luci +{ + +bool CircleLogisticGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + const auto &outputs = args.op.outputs; + if (outputs.size() != 1) + return false; + + // Must be one of the following types + // float16, float32, float64, complex64, or complex128 + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_COMPLEX64: + break; + default: + return false; + } + + if (tensors.at(inputs[0])->type != tensors.at(outputs[0])->type) + return false; + + return true; +} + +CircleNode *CircleLogisticGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleMatrixDiag.cpp b/compiler/luci/import/src/Nodes/CircleMatrixDiag.cpp new file mode 100644 index 0000000..f4ae03c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleMatrixDiag.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleMatrixDiag.h" + +#include + +#include + +namespace luci +{ + +bool CircleMatrixDiagGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 1) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + if (tensors[outputs[0]]->type != tensor->type) + return false; + + return true; +} + +CircleNode *CircleMatrixDiagGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->diagonal(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleMatrixSetDiag.cpp b/compiler/luci/import/src/Nodes/CircleMatrixSetDiag.cpp new file mode 100644 index 0000000..d6f6aee --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleMatrixSetDiag.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleMatrixSetDiag.h" + +#include + +#include + +namespace luci +{ + +bool CircleMatrixSetDiagGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + if (tensors[outputs[0]]->type != tensor->type) + return false; + + return true; +} + +CircleNode *CircleMatrixSetDiagGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->diagonal(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleMaximum.cpp b/compiler/luci/import/src/Nodes/CircleMaximum.cpp new file mode 100644 index 0000000..6ca7e40 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleMaximum.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleMaximum.h" + +#include + +#include + +namespace luci +{ + +bool CircleMaximumGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensors[inputs[1]]->type != tensor->type) + return false; + + if (tensors[outputs[0]]->type != tensor->type) + return false; + + return true; +} + +CircleNode *CircleMaximumGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleMinimum.cpp b/compiler/luci/import/src/Nodes/CircleMinimum.cpp new file mode 100644 index 0000000..b770f36 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleMinimum.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleMinimum.h" + +#include + +#include + +namespace luci +{ + +bool CircleMinimumGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensors[inputs[1]]->type != tensor->type) + return false; + + if (tensors[outputs[0]]->type != tensor->type) + return false; + + return true; +} + +CircleNode *CircleMinimumGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleMirrorPad.cpp b/compiler/luci/import/src/Nodes/CircleMirrorPad.cpp new file mode 100644 index 0000000..41b5e5d --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleMirrorPad.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleMirrorPad.h" + +#include + +#include + +namespace luci +{ + +bool CircleMirrorPadGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + // TODO check others + + return true; +} + +CircleNode *CircleMirrorPadGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->paddings(inputs[1]); + + const auto *options = op.builtin_options.AsMirrorPadOptions(); + node->mode(luci_mirrorpad_mode(options->mode)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleNeg.cpp b/compiler/luci/import/src/Nodes/CircleNeg.cpp new file mode 100644 index 0000000..3d3079c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleNeg.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleNeg.h" + +#include + +#include + +namespace luci +{ +bool CircleNegGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + // TODO Support type check + return true; +} + +CircleNode *CircleNegGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleNotEqual.cpp b/compiler/luci/import/src/Nodes/CircleNotEqual.cpp new file mode 100644 index 0000000..5b04856 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleNotEqual.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleNotEqual.h" + +#include + +#include + +namespace luci +{ + +bool CircleNotEqualGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + { + return false; + } + + if (outputs.size() != 1) + { + return false; + } + + const auto &tensors = args.reader.tensors(); + + if (tensors[inputs[0]]->type != tensors[inputs[1]]->type) + { + return false; + } + + return tensors[outputs[0]]->type == circle::TensorType::TensorType_BOOL; +} + +CircleNode *CircleNotEqualGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleOneHot.cpp b/compiler/luci/import/src/Nodes/CircleOneHot.cpp new file mode 100644 index 0000000..9fdbfa8 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleOneHot.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleOneHot.h" + +#include + +#include +#include + +namespace luci +{ + +bool CircleOneHotGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + const auto *options = args.op.builtin_options.AsOneHotOptions(); + + // Only 4 Input come refered from + if (inputs.size() != 4) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &indices = tensors.at(inputs[0]); + const auto &depth = tensors.at(inputs[1]); + const auto &on_value = tensors.at(inputs[2]); + const auto &off_value = tensors.at(inputs[3]); + + if (options->axis < -1 || options->axis > static_cast(indices->shape.size())) + return false; + if (depth->shape.size() != 0) + return false; + if (on_value->shape.size() != 0) + return false; + if (off_value->shape.size() != 0) + return false; + if (on_value->type != off_value->type) + return false; + + return true; +} + +CircleNode *CircleOneHotGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->indices(inputs[0]); + node->depth(inputs[1]); + node->on_value(inputs[2]); + node->off_value(inputs[3]); + + const auto *options = op.builtin_options.AsOneHotOptions(); + node->axis(options->axis); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CirclePRelu.cpp b/compiler/luci/import/src/Nodes/CirclePRelu.cpp new file mode 100644 index 0000000..0d87cd4 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CirclePRelu.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CirclePRelu.h" + +#include + +#include + +namespace luci +{ + +bool CirclePReluGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CirclePReluGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->alpha(inputs[1]); + + // PRelu options are empty + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CirclePow.cpp b/compiler/luci/import/src/Nodes/CirclePow.cpp new file mode 100644 index 0000000..ff98331 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CirclePow.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CirclePow.h" + +#include + +#include + +namespace luci +{ + +bool CirclePowGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CirclePowGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + // Pow options are empty + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleRange.cpp b/compiler/luci/import/src/Nodes/CircleRange.cpp new file mode 100644 index 0000000..c211916 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleRange.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleRange.h" + +#include + +#include + +namespace luci +{ +bool CircleRangeGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 3) + return false; + + // TODO Support type check + return true; +} + +CircleNode *CircleRangeGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->start(inputs[0]); + node->limit(inputs[1]); + node->delta(inputs[2]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleRank.cpp b/compiler/luci/import/src/Nodes/CircleRank.cpp new file mode 100644 index 0000000..705ae01 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleRank.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleRank.h" + +#include + +#include + +namespace luci +{ +bool CircleRankGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleRankGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReduceAny.cpp b/compiler/luci/import/src/Nodes/CircleReduceAny.cpp new file mode 100644 index 0000000..030c530 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReduceAny.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReduceAny.h" + +#include + +namespace luci +{ + +bool CircleReduceAnyGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 2) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_0 = tensors.at(inputs[0]); + const auto &tensor_1 = tensors.at(inputs[1]); + const auto &tensor_o = tensors.at(outputs[0]); + + if (tensor_0->type != circle::TensorType_BOOL) + return false; + if (tensor_o->type != circle::TensorType_BOOL) + return false; + + switch (tensor_1->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleReduceAnyGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->reduction_indices(inputs[1]); + + const auto *options = op.builtin_options.AsReducerOptions(); + node->keep_dims(options->keep_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReduceMax.cpp b/compiler/luci/import/src/Nodes/CircleReduceMax.cpp new file mode 100644 index 0000000..8ca8e2e --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReduceMax.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReduceMax.h" + +#include + +namespace luci +{ + +bool CircleReduceMaxGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_axis = tensors.at(inputs[1]); + + switch (tensor_axis->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleReduceMaxGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->reduction_indices(inputs[1]); + + const auto *options = op.builtin_options.AsReducerOptions(); + node->keep_dims(options->keep_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReduceMin.cpp b/compiler/luci/import/src/Nodes/CircleReduceMin.cpp new file mode 100644 index 0000000..3020c37 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReduceMin.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReduceMin.h" + +#include + +namespace luci +{ + +bool CircleReduceMinGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_axis = tensors.at(inputs[1]); + + switch (tensor_axis->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleReduceMinGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->reduction_indices(inputs[1]); + + const auto *options = op.builtin_options.AsReducerOptions(); + node->keep_dims(options->keep_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReduceProd.cpp b/compiler/luci/import/src/Nodes/CircleReduceProd.cpp new file mode 100644 index 0000000..2bb43f6 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReduceProd.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReduceProd.h" + +#include + +namespace luci +{ + +bool CircleReduceProdGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 2) + return false; + if (args.op.outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_1 = tensors.at(inputs[1]); + + // TODO check input types + + // Check for reduction_indices types + switch (tensor_1->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleReduceProdGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->reduction_indices(inputs[1]); + + const auto *options = op.builtin_options.AsReducerOptions(); + node->keep_dims(options->keep_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleRelu6.cpp b/compiler/luci/import/src/Nodes/CircleRelu6.cpp new file mode 100644 index 0000000..5b44399 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleRelu6.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleRelu6.h" + +#include + +#include + +namespace luci +{ + +bool CircleRelu6GraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleRelu6GraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->features(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReluN1To1.cpp b/compiler/luci/import/src/Nodes/CircleReluN1To1.cpp new file mode 100644 index 0000000..edf662f --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReluN1To1.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReluN1To1.h" + +#include + +#include + +namespace luci +{ + +bool CircleReluN1To1GraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + // TODO check dtypes + + return true; +} + +CircleNode *CircleReluN1To1GraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->features(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReshape.cpp b/compiler/luci/import/src/Nodes/CircleReshape.cpp index c83f143..f72c152 100644 --- a/compiler/luci/import/src/Nodes/CircleReshape.cpp +++ b/compiler/luci/import/src/Nodes/CircleReshape.cpp @@ -66,7 +66,14 @@ CircleNode *CircleReshapeGraphBuilder::build_node(const circle::OperatorT &op, if (shape_node == nullptr) { const auto *options = op.builtin_options.AsReshapeOptions(); - shape_node = create_shape_node(options->new_shape, graph); + if (options != nullptr) + shape_node = create_shape_node(options->new_shape, graph); + else + { + shape_node = graph->nodes()->create(); + shape_node->dtype(loco::DataType::S32); + shape_node->rank(0); + } } auto *node = graph->nodes()->create(); @@ -74,7 +81,8 @@ CircleNode *CircleReshapeGraphBuilder::build_node(const circle::OperatorT &op, node->shape(shape_node); const auto *options = op.builtin_options.AsReshapeOptions(); - setup_shape_attribute(options->new_shape, node); + if (options) + setup_shape_attribute(options->new_shape, node); return node; } diff --git a/compiler/luci/import/src/Nodes/CircleResizeBilinear.cpp b/compiler/luci/import/src/Nodes/CircleResizeBilinear.cpp new file mode 100644 index 0000000..6128f1b --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleResizeBilinear.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleResizeBilinear.h" + +#include +#include + +namespace luci +{ + +bool CircleResizeBilinearGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleResizeBilinearGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->size(inputs[1]); + + const auto *options = op.builtin_options.AsResizeBilinearOptions(); + node->align_corners(options->align_corners); + node->half_pixel_centers(options->half_pixel_centers); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleResizeNearestNeighbor.cpp b/compiler/luci/import/src/Nodes/CircleResizeNearestNeighbor.cpp new file mode 100644 index 0000000..a1f1ef0 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleResizeNearestNeighbor.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleResizeNearestNeighbor.h" + +#include +#include + +namespace luci +{ + +bool CircleResizeNearestNeighborGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleResizeNearestNeighborGraphBuilder::build_node( + const circle::OperatorT &op, const std::vector &inputs, loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->size(inputs[1]); + + const auto *options = op.builtin_options.AsResizeNearestNeighborOptions(); + node->align_corners(options->align_corners); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReverseSequence.cpp b/compiler/luci/import/src/Nodes/CircleReverseSequence.cpp new file mode 100644 index 0000000..72d3b15 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReverseSequence.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReverseSequence.h" + +#include + +#include + +namespace luci +{ + +bool CircleReverseSequenceGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_in = tensors.at(inputs[0]); + const auto &tensor_lengths = tensors.at(inputs[1]); + const auto &tensor_out = tensors.at(outputs[0]); + + switch (tensor_lengths->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensor_in->type != tensor_out->type) + return false; + + return true; +} + +CircleNode *CircleReverseSequenceGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->seq_lengths(inputs[1]); + + const auto *options = op.builtin_options.AsReverseSequenceOptions(); + node->seq_axis(options->seq_dim); + node->batch_axis(options->batch_dim); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleReverseV2.cpp b/compiler/luci/import/src/Nodes/CircleReverseV2.cpp new file mode 100644 index 0000000..cd18128 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleReverseV2.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleReverseV2.h" + +#include + +#include + +namespace luci +{ + +bool CircleReverseV2GraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_in = tensors.at(inputs[0]); + const auto &tensor_axis = tensors.at(inputs[1]); + const auto &tensor_out = tensors.at(outputs[0]); + + switch (tensor_axis->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensor_out->type != tensor_in->type) + return false; + + return true; +} + +CircleNode *CircleReverseV2GraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->tensor(inputs[0]); + node->axis(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleRound.cpp b/compiler/luci/import/src/Nodes/CircleRound.cpp new file mode 100644 index 0000000..8964895 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleRound.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleRound.h" + +#include + +#include + +namespace luci +{ + +bool CircleRoundGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 1) + return false; + if (outputs.size() != 1) + return false; + + // Must be one of the following types + // bfloat16, half (float16), float32, float64, complex64, complex128 + // Currently, circle supports float16, float32, complex64 + const auto &tensors = args.reader.tensors(); + const auto &tensor_in = tensors.at(inputs[0]); + const auto &tensor_out = tensors.at(outputs[0]); + + switch (tensor_in->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensor_out->type != tensor_in->type) + return false; + + return true; +} + +CircleNode *CircleRoundGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleScatterNd.cpp b/compiler/luci/import/src/Nodes/CircleScatterNd.cpp new file mode 100644 index 0000000..adcaa00 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleScatterNd.cpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleScatterNd.h" + +#include + +#include + +namespace luci +{ + +bool CircleScatterNdGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 3) + return false; + + // indices must have the same type as shape + const auto &tensors = args.reader.tensors(); + + if (tensors[inputs[0]]->type != tensors[inputs[2]]->type) + return false; + + // indices must be either int32 or int64 + if (tensors[inputs[0]]->type != circle::TensorType_INT32 && + tensors[inputs[0]]->type != circle::TensorType_INT64) + return false; + + return true; +} + +CircleNode *CircleScatterNdGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->indices(inputs[0]); + node->updates(inputs[1]); + node->shape(inputs[2]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSegmentSum.cpp b/compiler/luci/import/src/Nodes/CircleSegmentSum.cpp new file mode 100644 index 0000000..1122bdc --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSegmentSum.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSegmentSum.h" + +#include + +#include + +namespace luci +{ + +bool CircleSegmentSumGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 2) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_in = tensors.at(inputs[0]); + const auto &tensor_out = tensors.at(outputs[0]); + const auto &tensor_ids = tensors.at(inputs[1]); + + switch (tensor_ids->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + if (tensor_out->type != tensor_in->type) + { + return false; + } + + return true; +} + +CircleNode *CircleSegmentSumGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->segment_ids(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSelect.cpp b/compiler/luci/import/src/Nodes/CircleSelect.cpp new file mode 100644 index 0000000..ff94212 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSelect.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSelect.h" + +#include + +#include + +namespace luci +{ + +bool CircleSelectGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 3) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + if (tensor->type != circle::TensorType_BOOL) + return false; + // TODO check dtypes for input 1, 2 + + return true; +} + +CircleNode *CircleSelectGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->condition(inputs[0]); + node->t(inputs[1]); + node->e(inputs[2]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSelectV2.cpp b/compiler/luci/import/src/Nodes/CircleSelectV2.cpp new file mode 100644 index 0000000..78b2e64 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSelectV2.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSelectV2.h" + +#include + +#include + +namespace luci +{ + +bool CircleSelectV2GraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 3) + return false; + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &condition = tensors.at(inputs[0]); + if (condition->type != circle::TensorType_BOOL) + return false; + + const auto &t = tensors.at(inputs[1]); + const auto &e = tensors.at(inputs[2]); + if (t->type != e->type) + return false; + + return true; +} + +CircleNode *CircleSelectV2GraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->condition(inputs[0]); + node->t(inputs[1]); + node->e(inputs[2]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleShape.cpp b/compiler/luci/import/src/Nodes/CircleShape.cpp new file mode 100644 index 0000000..864b5eb --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleShape.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleShape.h" + +#include + +#include + +namespace luci +{ + +bool CircleShapeGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + if (inputs.size() != 1) + return false; + if (outputs.size() != 1) + return false; + + // TODO check shape, dtype + + return true; +} + +CircleNode *CircleShapeGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + const auto *options = op.builtin_options.AsShapeOptions(); + node->out_type(luci_datatype(options->out_type)); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSin.cpp b/compiler/luci/import/src/Nodes/CircleSin.cpp new file mode 100644 index 0000000..61d60c7 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSin.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSin.h" + +#include + +#include + +namespace luci +{ + +bool CircleSinGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + if (args.op.outputs.size() != 1) + return false; + + // input type check + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + break; + // TODO support TensorType_COMPLEX64, complex128, bfloat16 + default: + return false; + } + + return true; +} + +CircleNode *CircleSinGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + // No options for Sin + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSlice.cpp b/compiler/luci/import/src/Nodes/CircleSlice.cpp new file mode 100644 index 0000000..313c355 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSlice.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSlice.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleSliceGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 3) + return false; + if (args.op.outputs.size() != 1) + return false; + + // TODO check shapes and types + + return true; +} + +CircleNode *CircleSliceGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->begin(inputs[1]); + node->size(inputs[2]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSpaceToBatchND.cpp b/compiler/luci/import/src/Nodes/CircleSpaceToBatchND.cpp new file mode 100644 index 0000000..f1361fb --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSpaceToBatchND.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSpaceToBatchND.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleSpaceToBatchNDGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 3) + return false; + + // input 1 and 2 should have INT32/INT64 type + const auto &tensors = args.reader.tensors(); + const auto &tensor_1 = tensors.at(inputs[1]); + switch (tensor_1->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + const auto &tensor_2 = tensors.at(inputs[2]); + switch (tensor_2->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + // Only support input shape dimension 3 and 4 only + const auto &tensor_0 = tensors.at(inputs[0]); + const auto t_0_s = tensor_0->shape.size(); + if (t_0_s != 3 && t_0_s != 4) + return false; + + // TODO check input shape + + return true; +} + +CircleNode *CircleSpaceToBatchNDGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->block_shape(inputs[1]); + node->paddings(inputs[2]); + + // No options for SpaceToBatchND + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSpaceToDepth.cpp b/compiler/luci/import/src/Nodes/CircleSpaceToDepth.cpp new file mode 100644 index 0000000..b612c9a --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSpaceToDepth.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSpaceToDepth.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleSpaceToDepthGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + + // TODO do attribute checks + + return true; +} + +CircleNode *CircleSpaceToDepthGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + const auto *options = op.builtin_options.AsSpaceToDepthOptions(); + node->block_size(options->block_size); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSparseToDense.cpp b/compiler/luci/import/src/Nodes/CircleSparseToDense.cpp new file mode 100644 index 0000000..bfe790f --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSparseToDense.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSparseToDense.h" + +#include + +#include + +namespace luci +{ + +bool CircleSparseToDenseGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 4) + return false; + + return true; +} + +CircleNode *CircleSparseToDenseGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->indices(inputs[0]); + node->output_shape(inputs[1]); + node->values(inputs[2]); + node->default_value(inputs[3]); + + const auto *options = op.builtin_options.AsSparseToDenseOptions(); + node->validate_indices(options->validate_indices); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSplit.cpp b/compiler/luci/import/src/Nodes/CircleSplit.cpp new file mode 100644 index 0000000..07b6cc9 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSplit.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSplit.h" + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleSplitGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + const auto *options = args.op.builtin_options.AsSplitOptions(); + + if (inputs.size() != 2) + return false; + + if (static_cast(outputs.size()) != options->num_splits) + return false; + + // TODO check types + + return true; +} + +/** + * @brief Split Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleSplitOut nodes to emulate this + * For two outputs that may look like this + * + * --- CircleSplit --- FullyConnected --- + * \- FullyConnected --- + * + * will be created like this + * + * --- CircleSplit --- CircleSplitOut --- FullyConnected --- + * \- CircleSplitOut --- FullyConnected --- + */ + +void CircleSplitGraphBuilder::build(const circle::OperatorT &op, GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + } + + // Create CircleSplit + auto node = graph->nodes()->create(); + node->split_dim(input_nodes[0]); + node->input(input_nodes[1]); + + const auto *options = op.builtin_options.AsSplitOptions(); + node->num_split(options->num_splits); + + assert(outputs.size() > 0); + assert(int32_t(outputs.size()) == options->num_splits); + { + // Let's use name of output 0 as Split name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for Split itself but to virtual outputs + } + + // Create virtual outputs of Split + for (int32_t n = 0; n < options->num_splits; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSplitV.cpp b/compiler/luci/import/src/Nodes/CircleSplitV.cpp new file mode 100644 index 0000000..7c6e83e --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSplitV.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSplitV.h" + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleSplitVGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + const auto *options = args.op.builtin_options.AsSplitVOptions(); + + if (inputs.size() != 3) + return false; + + if (static_cast(outputs.size()) != options->num_splits) + return false; + + // TODO check types + + return true; +} + +/** + * @brief SplitV Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleSplitVOut nodes to emulate this + * For two outputs that may look like this + * + * --- CircleSplitV --- FullyConnected --- + * \- FullyConnected --- + * + * will be created like this + * + * --- CircleSplitV --- CircleSplitVOut --- FullyConnected --- + * \- CircleSplitVOut --- FullyConnected --- + */ + +void CircleSplitVGraphBuilder::build(const circle::OperatorT &op, + GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + } + + // Create CircleSplitV + auto node = graph->nodes()->create(); + node->input(input_nodes[0]); + node->size_splits(input_nodes[1]); + node->split_dim(input_nodes[2]); + + const auto *options = op.builtin_options.AsSplitVOptions(); + node->num_split(options->num_splits); + + assert(outputs.size() > 0); + assert(int32_t(outputs.size()) == options->num_splits); + { + // Let's use name of output 0 as Split name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for Split itself but to virtual outputs + } + + // Create virtual outputs of Split + for (int32_t n = 0; n < options->num_splits; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSqrt.cpp b/compiler/luci/import/src/Nodes/CircleSqrt.cpp new file mode 100644 index 0000000..8a90f66 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSqrt.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSqrt.h" + +#include + +#include + +namespace luci +{ + +bool CircleSqrtGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleSqrtGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSquare.cpp b/compiler/luci/import/src/Nodes/CircleSquare.cpp new file mode 100644 index 0000000..8398548 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSquare.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSquare.h" + +#include + +#include + +namespace luci +{ + +bool CircleSquareGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + + // Must be one of the following types + // bfloat16, half (float16), float32, float64, complex64, complex128 + // Currently, circle supports float16, float32, complex64 + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_COMPLEX64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleSquareGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSquaredDifference.cpp b/compiler/luci/import/src/Nodes/CircleSquaredDifference.cpp new file mode 100644 index 0000000..93ce959 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSquaredDifference.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSquaredDifference.h" + +#include + +#include + +namespace luci +{ + +bool CircleSquaredDifferenceGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + // Inputs must be one of the following types + // bfloat16, half(float16), float32, float64, int32, int64, complex64, complex128 + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_FLOAT64: + case circle::TensorType_INT32: + case circle::TensorType_INT64: + case circle::TensorType_COMPLEX64: + break; + // TODO support bfloat16, complex128 + default: + return false; + } + + // Input types must match + if (tensors.at(inputs[0])->type != tensors.at(inputs[1])->type) + return false; + + // Input and output types must match + if (tensors.at(inputs[0])->type != tensors.at(outputs[0])->type) + return false; + + return true; +} + +CircleNode *CircleSquaredDifferenceGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + node->y(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSqueeze.cpp b/compiler/luci/import/src/Nodes/CircleSqueeze.cpp new file mode 100644 index 0000000..a5252d0 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSqueeze.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSqueeze.h" + +#include +#include + +namespace luci +{ + +bool CircleSqueezeGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleSqueezeGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + const auto *options = op.builtin_options.AsSqueezeOptions(); + assert(options); + + node->squeeze_dims(options->squeeze_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleStridedSlice.cpp b/compiler/luci/import/src/Nodes/CircleStridedSlice.cpp new file mode 100644 index 0000000..95e4467 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleStridedSlice.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleStridedSlice.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleStridedSliceGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 4) + return false; + if (args.op.outputs.size() != 1) + return false; + + // TODO check shapes and types + + return true; +} + +CircleNode *CircleStridedSliceGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->begin(inputs[1]); + node->end(inputs[2]); + node->strides(inputs[3]); + + const auto *options = op.builtin_options.AsStridedSliceOptions(); + node->begin_mask(options->begin_mask); + node->end_mask(options->end_mask); + node->ellipsis_mask(options->ellipsis_mask); + node->new_axis_mask(options->new_axis_mask); + node->shrink_axis_mask(options->shrink_axis_mask); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleSum.cpp b/compiler/luci/import/src/Nodes/CircleSum.cpp new file mode 100644 index 0000000..b4865de --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleSum.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleSum.h" + +#include + +namespace luci +{ + +bool CircleSumGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 2) + return false; + + return true; +} + +CircleNode *CircleSumGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->reduction_indices(inputs[1]); + + const auto *options = op.builtin_options.AsReducerOptions(); + node->keep_dims(options->keep_dims); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleTanh.cpp b/compiler/luci/import/src/Nodes/CircleTanh.cpp new file mode 100644 index 0000000..8986378 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleTanh.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleTanh.h" + +#include + +#include + +namespace luci +{ + +bool CircleTanhGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + if (inputs.size() != 1) + return false; + + // Must be one of the following types + // bfloat16, half (float16), float32, float64, complex64, complex128 + // Currently, circle supports float16, float32, complex64 + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + switch (tensor->type) + { + case circle::TensorType_FLOAT16: + case circle::TensorType_FLOAT32: + case circle::TensorType_COMPLEX64: + break; + default: + return false; + } + + return true; +} + +CircleNode *CircleTanhGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->x(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleTile.cpp b/compiler/luci/import/src/Nodes/CircleTile.cpp new file mode 100644 index 0000000..91054ce --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleTile.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleTile.h" + +#include + +#include + +namespace luci +{ + +bool CircleTileGraphBuilder::validate(const ValidateArgs &args) const +{ + auto inputs = args.op.inputs; + auto outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + + if (outputs.size() != 1) + return false; + + // Multiples (inputs[1]) must be one of the following types + // int32, int64 + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[1]); + switch (tensor->type) + { + case circle::TensorType_INT32: + case circle::TensorType_INT64: + break; + default: + return false; + } + + // Type of input and output must be the same + if (tensors.at(inputs[0])->type != tensors.at(outputs[0])->type) + return false; + + return true; +} + +CircleNode *CircleTileGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + node->multiples(inputs[1]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleTopKV2.cpp b/compiler/luci/import/src/Nodes/CircleTopKV2.cpp new file mode 100644 index 0000000..5c1051c --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleTopKV2.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleTopKV2.h" + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleTopKV2GraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 2) + return false; + if (outputs.size() != 2) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[1]); + if (tensor->type != circle::TensorType_INT32) + return false; + + return true; +} + +/** + * @brief TopKV2 Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleTopKV2Out nodes to emulate this + * For two outputs that may look like this + * + * --- CircleTopKV2--- FullyConnected --- + * \- FullyConnected --- + * + * will be created like this + * + * --- CircleTopKV2 --- CircleTopKV2Out --- FullyConnected --- + * \- CircleTopKV2Out --- FullyConnected --- + */ + +void CircleTopKV2GraphBuilder::build(const circle::OperatorT &op, + GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + } + + // Create CircleTopKV2 + auto node = graph->nodes()->create(); + node->input(input_nodes[0]); + node->k(input_nodes[1]); + + assert(outputs.size() == 2); + { + // Let's use name of output 0 as TopKV2 name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for TopKV2 itself but to virtual outputs + } + + // Create virtual outputs of TopKV2 + for (size_t n = 0; n < outputs.size(); ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleTransposeConv.cpp b/compiler/luci/import/src/Nodes/CircleTransposeConv.cpp new file mode 100644 index 0000000..7bdf46d --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleTransposeConv.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleTransposeConv.h" + +#include + +#include + +#include + +namespace luci +{ + +bool CircleTransposeConvGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 3) + return false; + + return true; +} + +CircleNode *CircleTransposeConvGraphBuilder::build_node(const circle::OperatorT &op, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + + node->inputSizes(inputs[0]); + node->filter(inputs[1]); + node->outBackprop(inputs[2]); + + const auto *options = op.builtin_options.AsTransposeConvOptions(); + node->padding(luci_padding(options->padding)); + node->stride()->w(options->stride_w); + node->stride()->h(options->stride_h); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleUnpack.cpp b/compiler/luci/import/src/Nodes/CircleUnpack.cpp new file mode 100644 index 0000000..c4282e2 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleUnpack.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleUnpack.h" + +#include +#include + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleUnpackGraphBuilder::validate(const ValidateArgs &args) const +{ + LOGGER(l); + + auto settings = luci::UserSettings::settings(); + + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + const auto *options = args.op.builtin_options.AsUnpackOptions(); + + if (inputs.size() != 1) + return false; + + // NOTE real models may have mismatch + if (static_cast(outputs.size()) != options->num) + { + if (settings->get(luci::UserSettings::Key::DisableValidation)) + { + const auto &tensors = args.reader.tensors(); + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + auto name = tensor_name(output_tensor); + WARN(l) << "Warning: import Unpack(" << name << ") 'num' is not same as outputs used"; + } + else + return false; + } + + if (options->num < 0) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor = tensors.at(inputs[0]); + const auto &shape = tensor->shape; + auto shape_size = static_cast(shape.size()); + if (shape_size > 0) + { + // NOTE for unknown shape, shape_size is 0 + if (options->axis < -shape_size || options->axis >= shape_size) + return false; + } + + return true; +} + +/** + * @brief Unpack Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleUnpackOut nodes to emulate this + * For two outputs that may look like this + * + * --- CircleUnpack --- FullyConnected --- + * \- FullyConnected --- + * + * will be created like this + * + * --- CircleUnpack --- CircleUnpackOut --- FullyConnected --- + * \- CircleUnpackOut --- FullyConnected --- + */ + +void CircleUnpackGraphBuilder::build(const circle::OperatorT &op, + GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + auto tensors_ptr = context->reader()->tensors_ptr(); + assert(tensors_ptr != nullptr); + + // NOTE Unpack has only one input so running a loop is not necessary + // This is provided as a reference for other Ops as a reference + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + input_nodes.push_back(context->nodefinder()->node(input_tensor_index)); + } + + // Create CircleUnpack + CircleUnpack *node = graph->nodes()->create(); + node->value(input_nodes[0]); + + const auto *options = op.builtin_options.AsUnpackOptions(); + node->num(options->num); + node->axis(options->axis); + + assert(outputs.size() > 0); + { + // Let's use name of output 0 as Unpack name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for Unpack itself but to virtual outputs + } + + // Create virtual outputs of Unpack + for (int32_t n = 0; n < options->num; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + copy_tensor_attributes(output_tensor, nodeout); + // mark shape_status + if (tensors_ptr->Get(outputs[n])->shape() == nullptr) + nodeout->shape_status(ShapeStatus::NOSHAPE); + else + nodeout->shape_status(ShapeStatus::VALID); + + nodeout->input(node); + nodeout->index(n); + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleWhere.cpp b/compiler/luci/import/src/Nodes/CircleWhere.cpp new file mode 100644 index 0000000..a13c4d6 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleWhere.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleWhere.h" + +#include + +#include + +namespace luci +{ + +bool CircleWhereGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto &outputs = args.op.outputs; + + if (inputs.size() != 1) + return false; + + if (outputs.size() != 1) + return false; + + const auto &tensors = args.reader.tensors(); + const auto &tensor_condition = tensors.at(inputs[0]); + const auto &tensor_out = tensors.at(outputs[0]); + + if (tensor_condition->type != circle::TensorType_BOOL) + return false; + + if (tensor_out->type != circle::TensorType_INT64) + return false; + + return true; +} + +CircleNode *CircleWhereGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->condition(inputs[0]); + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleWhile.cpp b/compiler/luci/import/src/Nodes/CircleWhile.cpp new file mode 100644 index 0000000..aead250 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleWhile.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleWhile.h" + +#include +#include + +#include +#include + +namespace luci +{ + +bool CircleWhileGraphBuilder::validate(const ValidateArgs &args) const +{ + const auto &inputs = args.op.inputs; + const auto *options = args.op.builtin_options.AsWhileOptions(); + + if (inputs.size() != args.op.outputs.size()) + return false; + + auto num_graphs = static_cast(args.reader.num_subgraph()); + if (options->cond_subgraph_index >= num_graphs) + return false; + if (options->body_subgraph_index >= num_graphs) + return false; + + return true; +} + +/** + * @brief While Node builder + * + * @note Current loco does not provide multiple outputs + * We will create multiple CircleWhileOut nodes to emulate this + * For two outputs that may look like this + * + * --- CircleWhile --- Node --- + * \- Node --- + * + * will be created like this + * + * --- CircleWhile --- CircleWhileOut --- Node --- + * \- CircleWhileOut --- Node --- + */ + +void CircleWhileGraphBuilder::build(const circle::OperatorT &op, GraphBuilderContext *context) const +{ + assert(context != nullptr); + + auto graph = context->graph(); + + const std::vector &inputs = op.inputs; + const std::vector &outputs = op.outputs; + const auto &tensors = context->reader()->tensors(); + const auto &opcodes = context->reader()->opcodes(); + + std::vector input_nodes; + for (const int32_t input_tensor_index : inputs) + { + auto input_node = context->nodefinder()->node(input_tensor_index); + assert(input_node != nullptr); + input_nodes.push_back(input_node); + } + + uint32_t input_count = inputs.size(); + uint32_t output_count = outputs.size(); + + // Create CircleWhile + CircleWhile *node = graph->nodes()->create(input_count, output_count); + + for (uint32_t idx = 0; idx < input_count; ++idx) + { + node->input(idx, input_nodes[idx]); + } + + const auto *options = op.builtin_options.AsWhileOptions(); + node->cond_branch(options->cond_subgraph_index); + node->body_branch(options->body_subgraph_index); + + assert(outputs.size() > 0); + { + // Lets use name of output 0 as While name + const circle::TensorT &output_tensor = *tensors[outputs[0]]; + node->name(tensor_name(output_tensor)); + node->op_version(opcodes[op.opcode_index].get()->version); + + // NOTE We don't set quantization for While itself but to virtual outputs + } + + // Create virtual outputs of While + for (uint32_t n = 0; n < output_count; ++n) + { + const circle::TensorT &output_tensor = *tensors[outputs[n]]; + + auto *nodeout = graph->nodes()->create(); + + nodeout->input(node); + nodeout->index(n); + + copy_tensor_attributes(output_tensor, nodeout); + + // Note: leave shape_status to UNKNOWN to run shape inference + + context->nodefinder()->enroll(outputs[n], nodeout); + } +} + +} // namespace luci diff --git a/compiler/luci/import/src/Nodes/CircleZerosLike.cpp b/compiler/luci/import/src/Nodes/CircleZerosLike.cpp new file mode 100644 index 0000000..4362925 --- /dev/null +++ b/compiler/luci/import/src/Nodes/CircleZerosLike.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Import/Nodes/CircleZerosLike.h" + +#include + +#include + +namespace luci +{ + +bool CircleZerosLikeGraphBuilder::validate(const ValidateArgs &args) const +{ + if (args.op.inputs.size() != 1) + return false; + + if (args.op.outputs.size() != 1) + return false; + + return true; +} + +CircleNode *CircleZerosLikeGraphBuilder::build_node(const circle::OperatorT &, + const std::vector &inputs, + loco::Graph *graph) const +{ + auto *node = graph->nodes()->create(); + node->input(inputs[0]); + + // ZerosLikeOptinos are empty + + return node; +} + +} // namespace luci diff --git a/compiler/luci/import/src/PostImport.cpp b/compiler/luci/import/src/PostImport.cpp new file mode 100644 index 0000000..f436b48 --- /dev/null +++ b/compiler/luci/import/src/PostImport.cpp @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PostImport.h" + +#include "luci/Import/CircleReader.h" + +#include +#include +#include +#include + +#include +#include + +namespace +{ + +/** + * @brief FixInterGraphNodes will fix inter graph connections for each Nodes + */ +class FixInterGraphNodes final : public luci::CircleNodeMutableVisitor +{ +public: + FixInterGraphNodes(const luci::Module *m, const luci::CircleReader &r) : _module(m), _reader(r) {} + + /** + * @note This will set Graph* to every CircleIf nodes 'else' and 'then' + */ + void visit(luci::CircleIf *node) final + { + LOGGER(l); + INFO(l) << "CircleIf " << node->name() << std::endl; + + auto then_branch = node->then_branch(); + auto else_branch = node->else_branch(); + auto num_graphs = static_cast(_module->size()); + (void)num_graphs; + + assert(num_graphs > 0); + assert(then_branch >= 0 && then_branch < num_graphs); + assert(else_branch >= 0 && else_branch < num_graphs); + + auto then_graph = _module->graph(then_branch); + auto else_graph = _module->graph(else_branch); + assert(then_graph != nullptr); + assert(else_graph != nullptr); + + node->then_graph(then_graph); + node->else_graph(else_graph); + } + + void visit(luci::CircleWhile *node) final + { + LOGGER(l); + INFO(l) << "CircleWhile " << node->name() << std::endl; + + auto cond_branch = node->cond_branch(); + auto body_branch = node->body_branch(); + auto num_graphs = static_cast(_module->size()); + (void)num_graphs; + + assert(num_graphs > 0); + assert(cond_branch >= 0 && cond_branch < num_graphs); + assert(body_branch >= 0 && body_branch < num_graphs); + + auto cond_graph = _module->graph(cond_branch); + auto body_graph = _module->graph(body_branch); + assert(cond_graph != nullptr); + assert(body_graph != nullptr); + + node->cond_graph(cond_graph); + node->body_graph(body_graph); + } + + void visit(luci::CircleNode *) final + { + // DO NOTHING + } + +private: + const luci::Module *_module; + const luci::CircleReader &_reader; +}; + +/** + * @brief FixInterGraph will fix inter graph connections + */ +class FixInterGraph final +{ +public: + void run(loco::Graph *g, const luci::Module *m, const luci::CircleReader &r) + { + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) + { + if (recognize(node->dialect())) + { + auto cn = loco::must_cast(node); + + fix(cn, m, r); + } + } + } + +private: + bool recognize(const loco::Dialect *dialect) { return (dialect == luci::CircleDialect::get()); } + + void fix(luci::CircleNode *node, const luci::Module *module, const luci::CircleReader &reader) + { + FixInterGraphNodes fix(module, reader); + node->accept(&fix); + } +}; + +} // namespace + +namespace +{ +/** + * @brief ValidateNodeProp will validate inter graph connections for each Nodes + */ +class ValidateNodeProp final : public luci::CircleNodeMutableVisitor +{ +public: + ValidateNodeProp(const luci::Module *m, const luci::CircleReader &r) : _module(m), _reader(r) {} + + /** + * @note Validate CircleIf node 'else' and 'then' graph input/output count + * shape and type + */ + void visit(luci::CircleIf *node) final + { + LOGGER(l); + INFO(l) << "CircleIf " << node->name() << std::endl; + + auto then_graph = node->then_graph(); + auto else_graph = node->else_graph(); + assert(then_graph != nullptr); + assert(else_graph != nullptr); + + // TODO support for differnt shape; but how? + // NODE Shape/Type inference assume below conditions + + // Check both "then" and "else" subgraph outputs are same in count + auto then_outputs = loco::output_nodes(then_graph); // CircleOutput nodes + auto else_outputs = loco::output_nodes(else_graph); + if (then_outputs.size() != else_outputs.size()) + { + INTERNAL_EXN("CircleIf THEN and ELSE Graph are not same in size"); + } + + // check outputs have same shape and dtype + auto then_graph_outputs = then_graph->outputs(); // loco::GraphOutput items + auto else_graph_outputs = else_graph->outputs(); + for (size_t idx = 0; idx < then_outputs.size(); ++idx) + { + auto then_out = loco::must_cast(then_outputs.at(idx)); + auto else_out = loco::must_cast(else_outputs.at(idx)); + + auto then_graph_output = then_graph_outputs->at(then_out->index()); + auto else_graph_output = else_graph_outputs->at(else_out->index()); + if (!(*then_graph_output->shape() == *else_graph_output->shape())) + { + INTERNAL_EXN_V("CircleIf THEN and ELSE Graph Output shape mismatch ", idx); + } + if (then_graph_output->dtype() != else_graph_output->dtype()) + { + INTERNAL_EXN_V("CircleIf THEN and ELSE Graph Output type mismatch ", idx); + } + } + } + + /** + * @note Validate CircleWhile node 'cond' and 'body' graph input/output count + * shape and type + */ + void visit(luci::CircleWhile *node) final + { + LOGGER(l); + INFO(l) << "CircleWhile " << node->name() << std::endl; + + auto cond_graph = node->cond_graph(); + auto body_graph = node->body_graph(); + assert(cond_graph != nullptr); + assert(body_graph != nullptr); + + // Check input of "cond" and input/output of "body" subgraph have the same size + auto cond_inputs = loco::input_nodes(cond_graph); + auto cond_outputs = loco::output_nodes(cond_graph); + auto body_inputs = loco::input_nodes(body_graph); + auto body_outputs = loco::output_nodes(body_graph); + if (cond_inputs.size() != body_outputs.size()) + { + INTERNAL_EXN("CircleWhile COND input and BODY output have different sizes"); + } + if (cond_inputs.size() != body_inputs.size()) + { + INTERNAL_EXN("CircleWhile COND input and BODY input have different sizes"); + } + if (cond_outputs.size() != 1) + { + INTERNAL_EXN("CircleWhile COND output must have size 1"); + } + auto cond_out = loco::must_cast(cond_outputs.at(0)); + if (cond_out->dtype() != loco::DataType::BOOL) + { + INTERNAL_EXN("CircleWhile COND output must have bool type"); + } + + // input of "cond" and input/output of "body" subgraph must have the same shape and type + // First we compare input of "cond" with input of "body" + auto cond_graph_inputs = cond_graph->inputs(); + auto body_graph_inputs = body_graph->inputs(); + for (size_t idx = 0; idx < cond_inputs.size(); ++idx) + { + auto cond_in = loco::must_cast(cond_inputs.at(idx)); + auto body_in = loco::must_cast(body_inputs.at(idx)); + + auto cond_graph_input = cond_graph_inputs->at(cond_in->index()); + auto body_graph_input = body_graph_inputs->at(body_in->index()); + if ((cond_in->rank() != body_in->rank())) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY input shape mismatch ", idx); + } + if (cond_in->rank() > 0 && body_in->rank() > 0) + { + if (!(*cond_graph_input->shape() == *body_graph_input->shape())) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY input shape mismatch ", idx); + } + } + if (cond_in->dtype() != body_in->dtype()) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY input type mismatch ", idx); + } + } + + // Next we compare input of "cond" with output of "body" + auto body_graph_outputs = body_graph->outputs(); + for (size_t idx = 0; idx < cond_inputs.size(); ++idx) + { + auto cond_in = loco::must_cast(cond_inputs.at(idx)); + auto body_out = loco::must_cast(body_outputs.at(idx)); + + auto cond_graph_input = cond_graph_inputs->at(cond_in->index()); + auto body_graph_output = body_graph_outputs->at(body_out->index()); + if ((cond_in->rank() != body_out->rank())) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY output shape mismatch ", idx); + } + if (cond_in->rank() > 0 && body_out->rank() > 0) + { + if (!(*cond_graph_input->shape() == *body_graph_output->shape())) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY output shape mismatch ", idx); + } + } + if (cond_in->dtype() != body_out->dtype()) + { + INTERNAL_EXN_V("CircleWhile COND input and BODY output type mismatch ", idx); + } + } + } + + void visit(luci::CircleNode *) final + { + // DO NOTHING + } + +private: + const luci::Module *_module; + const luci::CircleReader &_reader; +}; + +/** + * @brief ValidateGraphProp will validate inter graph node properties + */ +class ValidateGraphProp final +{ +public: + void run(loco::Graph *g, const luci::Module *m, const luci::CircleReader &r) + { + for (auto node : loco::postorder_traversal(loco::output_nodes(g))) + { + if (recognize(node->dialect())) + { + auto cn = loco::must_cast(node); + + eval(cn, m, r); + } + } + } + +private: + bool recognize(const loco::Dialect *dialect) { return (dialect == luci::CircleDialect::get()); } + + void eval(luci::CircleNode *node, const luci::Module *module, const luci::CircleReader &reader) + { + ValidateNodeProp val(module, reader); + node->accept(&val); + } +}; + +} // namespace + +namespace luci +{ + +/** + * @brief Do post import actions + */ +void post_import_graph(luci::Module *module, const luci::CircleReader &reader) +{ + LOGGER(l); + + auto count = module->size(); + + for (size_t s = 0; s < count; ++s) + { + auto g = module->graph(s); + assert(g != nullptr); + + INFO(l) << "--- FixInterGraph " << g->name() << "-------------------------"; + FixInterGraph fix; + fix.run(g, module, reader); + } + + for (size_t s = 0; s < count; ++s) + { + auto g = module->graph(s); + assert(g != nullptr); + + INFO(l) << "--- ValidateGraphProp " << g->name() << "---------------------"; + ValidateGraphProp prop; + prop.run(g, module, reader); + } + + INFO(l) << "--- post_import_graph done -------------------------------------"; +} + +} // namespace luci diff --git a/compiler/luci/import/src/PostImport.h b/compiler/luci/import/src/PostImport.h new file mode 100644 index 0000000..c719c58 --- /dev/null +++ b/compiler/luci/import/src/PostImport.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_POST_IMPORT_H__ +#define __LUCI_POST_IMPORT_H__ + +#include "luci/Import/CircleReader.h" + +#include "luci/IR/Module.h" + +namespace luci +{ + +/** + * @brief Do post import actions + */ +void post_import_graph(luci::Module *module, const luci::CircleReader &reader); + +} // namespace luci + +#endif // __LUCI_POST_IMPORT_H__ diff --git a/compiler/luci/lang/CMakeLists.txt b/compiler/luci/lang/CMakeLists.txt index 564e777..32d0a89 100644 --- a/compiler/luci/lang/CMakeLists.txt +++ b/compiler/luci/lang/CMakeLists.txt @@ -7,6 +7,7 @@ target_include_directories(luci_lang PRIVATE src) target_include_directories(luci_lang PUBLIC include) target_link_libraries(luci_lang PUBLIC loco) target_link_libraries(luci_lang PUBLIC oops) +target_link_libraries(luci_lang PRIVATE logo) target_link_libraries(luci_lang PRIVATE nncc_common) install(TARGETS luci_lang DESTINATION lib) @@ -20,3 +21,4 @@ nnas_find_package(GTest REQUIRED) GTest_AddTest(luci_lang_test ${TESTS}) target_include_directories(luci_lang_test PRIVATE src) target_link_libraries(luci_lang_test luci_lang) +target_link_libraries(luci_lang_test logo) diff --git a/compiler/luci/lang/include/luci/IR/AttrDilation.h b/compiler/luci/lang/include/luci/IR/AttrDilation.h new file mode 100644 index 0000000..c2b28d7 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/AttrDilation.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_ATTRDILATION_H__ +#define __LUCI_IR_ATTRDILATION_H__ + +#include + +namespace luci +{ + +class Dilation final +{ +public: + Dilation() : _w(1), _h(1) {} + + int32_t w() const { return _w; } + void w(int32_t w) { _w = w; } + + int32_t h() const { return _h; } + void h(int32_t h) { _h = h; } + +private: + int32_t _w; + int32_t _h; +}; + +} // namespace luci + +#endif // __LUCI_IR_ATTRDILATION_H__ diff --git a/compiler/luci/lang/include/luci/IR/AttrMirrorPadMode.h b/compiler/luci/lang/include/luci/IR/AttrMirrorPadMode.h new file mode 100644 index 0000000..7ca9d5d --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/AttrMirrorPadMode.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_ATTR_MIRROR_PAD_MODE_H__ +#define __LUCI_IR_ATTR_MIRROR_PAD_MODE_H__ + +namespace luci +{ + +enum class MirrorPadMode +{ + UNDEFINED, // This is not defined by Circle. This was added to prevent programming error. + + REFLECT, + SYMMETRIC, +}; + +} // namespace luci + +#endif // __LUCI_IR_ATTR_MIRROR_PAD_MODE_H__ diff --git a/compiler/luci/lang/include/luci/IR/CircleNodeDecl.h b/compiler/luci/lang/include/luci/IR/CircleNodeDecl.h index b87bdf9..967103e 100644 --- a/compiler/luci/lang/include/luci/IR/CircleNodeDecl.h +++ b/compiler/luci/lang/include/luci/IR/CircleNodeDecl.h @@ -17,8 +17,10 @@ #ifndef __LUCI_IR_CIRCLENODEDECL_H__ #define __LUCI_IR_CIRCLENODEDECL_H__ -#include #include +#include +#include +#include #include "CircleOpcode.h" #include "CircleNodeVisitor.forward.h" @@ -31,7 +33,9 @@ namespace luci using NodeName = std::string; -struct CircleNode : public loco::Node +struct CircleNode : public loco::Node, + public loco::NodeMixin, + public loco::NodeMixin { virtual ~CircleNode() = default; @@ -50,9 +54,17 @@ struct CircleNode : public loco::Node _quantparam = std::move(quantparam); } + ShapeStatus shape_status(void) const { return _shape_status; } + void shape_status(ShapeStatus ss) { _shape_status = ss; } + + int32_t op_version(void) const { return _op_version; } + void op_version(int32_t op_version) { _op_version = op_version; } + private: NodeName _name; std::unique_ptr _quantparam; + ShapeStatus _shape_status{ShapeStatus::UNDEFINED}; + int32_t _op_version = 1; }; template struct CircleNodeImpl : public CircleNode diff --git a/compiler/luci/lang/include/luci/IR/CircleNodeImpl.h b/compiler/luci/lang/include/luci/IR/CircleNodeImpl.h index bdcfc9c..a6b9488 100644 --- a/compiler/luci/lang/include/luci/IR/CircleNodeImpl.h +++ b/compiler/luci/lang/include/luci/IR/CircleNodeImpl.h @@ -18,7 +18,6 @@ #define __LUCI_IR_CIRCLENODEIMPL_H__ #include "CircleNodes.h" -#include "CircleNodeVisitor.h" #include diff --git a/compiler/luci/lang/include/luci/IR/CircleNodes.h b/compiler/luci/lang/include/luci/IR/CircleNodes.h index cc82284..3b31149 100644 --- a/compiler/luci/lang/include/luci/IR/CircleNodes.h +++ b/compiler/luci/lang/include/luci/IR/CircleNodes.h @@ -19,42 +19,124 @@ #include "Nodes/CircleAbs.h" #include "Nodes/CircleAdd.h" +#include "Nodes/CircleAddN.h" #include "Nodes/CircleArgMax.h" +#include "Nodes/CircleArgMin.h" #include "Nodes/CircleAveragePool2D.h" +#include "Nodes/CircleBatchMatMul.h" #include "Nodes/CircleBatchToSpaceND.h" +#include "Nodes/CircleCast.h" +#include "Nodes/CircleCeil.h" #include "Nodes/CircleConcatenation.h" #include "Nodes/CircleConst.h" #include "Nodes/CircleConv2D.h" #include "Nodes/CircleCos.h" +#include "Nodes/CircleCustom.h" +#include "Nodes/CircleDepthToSpace.h" #include "Nodes/CircleDepthwiseConv2D.h" #include "Nodes/CircleDiv.h" +#include "Nodes/CircleElu.h" #include "Nodes/CircleEqual.h" #include "Nodes/CircleExp.h" +#include "Nodes/CircleExpandDims.h" +#include "Nodes/CircleFill.h" +#include "Nodes/CircleFloor.h" +#include "Nodes/CircleFloorDiv.h" +#include "Nodes/CircleFloorMod.h" #include "Nodes/CircleFullyConnected.h" #include "Nodes/CircleGather.h" +#include "Nodes/CircleGatherNd.h" +#include "Nodes/CircleGreater.h" +#include "Nodes/CircleGreaterEqual.h" +#include "Nodes/CircleIf.h" +#include "Nodes/CircleL2Normalize.h" +#include "Nodes/CircleL2Pool2D.h" +#include "Nodes/CircleLeakyRelu.h" +#include "Nodes/CircleLess.h" +#include "Nodes/CircleLessEqual.h" +#include "Nodes/CircleLocalResponseNormalization.h" +#include "Nodes/CircleLog.h" +#include "Nodes/CircleLogicalAnd.h" #include "Nodes/CircleLogicalNot.h" #include "Nodes/CircleLogicalOr.h" +#include "Nodes/CircleLogistic.h" +#include "Nodes/CircleLogSoftmax.h" +#include "Nodes/CircleMatrixDiag.h" +#include "Nodes/CircleMatrixSetDiag.h" #include "Nodes/CircleMaximum.h" #include "Nodes/CircleMaxPool2D.h" #include "Nodes/CircleMean.h" +#include "Nodes/CircleMinimum.h" +#include "Nodes/CircleMirrorPad.h" #include "Nodes/CircleMul.h" +#include "Nodes/CircleNeg.h" +#include "Nodes/CircleNotEqual.h" +#include "Nodes/CircleOneHot.h" #include "Nodes/CirclePack.h" #include "Nodes/CirclePad.h" -#include "Nodes/CircleRelu6.h" +#include "Nodes/CirclePow.h" +#include "Nodes/CirclePRelu.h" +#include "Nodes/CircleRange.h" +#include "Nodes/CircleRank.h" +#include "Nodes/CircleReduceAny.h" +#include "Nodes/CircleReduceMax.h" +#include "Nodes/CircleReduceMin.h" +#include "Nodes/CircleReduceProd.h" #include "Nodes/CircleRelu.h" +#include "Nodes/CircleRelu6.h" +#include "Nodes/CircleReluN1To1.h" #include "Nodes/CircleReshape.h" +#include "Nodes/CircleResizeBilinear.h" +#include "Nodes/CircleResizeNearestNeighbor.h" +#include "Nodes/CircleReverseSequence.h" +#include "Nodes/CircleReverseV2.h" +#include "Nodes/CircleRound.h" #include "Nodes/CircleRsqrt.h" +#include "Nodes/CircleScatterNd.h" +#include "Nodes/CircleSegmentSum.h" +#include "Nodes/CircleSelect.h" +#include "Nodes/CircleSelectV2.h" +#include "Nodes/CircleShape.h" +#include "Nodes/CircleSin.h" +#include "Nodes/CircleSlice.h" #include "Nodes/CircleSoftmax.h" +#include "Nodes/CircleSpaceToBatchND.h" +#include "Nodes/CircleSpaceToDepth.h" +#include "Nodes/CircleSparseToDense.h" +#include "Nodes/CircleSplit.h" +#include "Nodes/CircleSplitV.h" #include "Nodes/CircleSqrt.h" +#include "Nodes/CircleSquare.h" #include "Nodes/CircleSquaredDifference.h" +#include "Nodes/CircleSqueeze.h" +#include "Nodes/CircleStridedSlice.h" #include "Nodes/CircleSub.h" -#include "Nodes/CircleTransposeConv.h" +#include "Nodes/CircleSum.h" +#include "Nodes/CircleTanh.h" +#include "Nodes/CircleTile.h" +#include "Nodes/CircleTopKV2.h" #include "Nodes/CircleTranspose.h" +#include "Nodes/CircleTransposeConv.h" +#include "Nodes/CircleUnpack.h" +#include "Nodes/CircleWhere.h" +#include "Nodes/CircleWhile.h" +#include "Nodes/CircleZerosLike.h" // Circle only +#include "Nodes/CircleBCQFullyConnected.h" +#include "Nodes/CircleBCQGather.h" #include "Nodes/CircleInstanceNorm.h" // Virtual nodes #include "Nodes/CircleInput.h" #include "Nodes/CircleOutput.h" +#include "Nodes/CircleCustomOut.h" +#include "Nodes/CircleIfOut.h" +#include "Nodes/CircleUnpackOut.h" +#include "Nodes/CircleSplitOut.h" +#include "Nodes/CircleSplitVOut.h" +#include "Nodes/CircleTopKV2Out.h" +#include "Nodes/CircleWhileOut.h" + +#include namespace luci { @@ -68,6 +150,18 @@ namespace luci */ void set_new_shape(CircleReshape *node, int32_t *base, uint32_t size); +/// @brief Link GraphOutput with CircleOutput node +void link(loco::GraphOutput *, CircleOutput *); + +/// @brief Link GraphInput with CircleInput node +void link(loco::GraphInput *, CircleInput *); + +/// @brief Find a CircleOutput node with a given output index +CircleOutput *output_node(loco::Graph *g, const loco::GraphOutputIndex &index); + +/// @brief Find a Pull node with a given input index +CircleInput *input_node(loco::Graph *g, const loco::GraphInputIndex &index); + } // namespace luci #endif // __LUCI_IR_CIRCLENODES_H__ diff --git a/compiler/luci/lang/include/luci/IR/CircleNodes.lst b/compiler/luci/lang/include/luci/IR/CircleNodes.lst index ca3f7fb..488dcfb 100644 --- a/compiler/luci/lang/include/luci/IR/CircleNodes.lst +++ b/compiler/luci/lang/include/luci/IR/CircleNodes.lst @@ -13,40 +13,121 @@ CIRCLE_NODE(ABS, luci::CircleAbs) CIRCLE_NODE(ADD, luci::CircleAdd) +CIRCLE_NODE(ADD_N, luci::CircleAddN) CIRCLE_NODE(ARG_MAX, luci::CircleArgMax) +CIRCLE_NODE(ARG_MIN, luci::CircleArgMin) CIRCLE_NODE(AVERAGE_POOL_2D, luci::CircleAveragePool2D) CIRCLE_NODE(BATCH_TO_SPACE_ND, luci::CircleBatchToSpaceND) +CIRCLE_NODE(BATCHMATMUL, luci::CircleBatchMatMul) +CIRCLE_NODE(CAST, luci::CircleCast) +CIRCLE_NODE(CEIL, luci::CircleCeil) CIRCLE_NODE(CONCATENATION, luci::CircleConcatenation) CIRCLE_NODE(CONST, luci::CircleConst) CIRCLE_NODE(CONV_2D, luci::CircleConv2D) CIRCLE_NODE(COS, luci::CircleCos) +CIRCLE_NODE(CUSTOM, luci::CircleCustom) +CIRCLE_NODE(DEPTH_TO_SPACE, luci::CircleDepthToSpace) CIRCLE_NODE(DEPTHWISE_CONV_2D, luci::CircleDepthwiseConv2D) CIRCLE_NODE(DIV, luci::CircleDiv) +CIRCLE_NODE(ELU, luci::CircleElu) CIRCLE_NODE(EQUAL, luci::CircleEqual) CIRCLE_NODE(EXP, luci::CircleExp) +CIRCLE_NODE(EXPAND_DIMS, luci::CircleExpandDims) +CIRCLE_NODE(FILL, luci::CircleFill) +CIRCLE_NODE(FLOOR, luci::CircleFloor) +CIRCLE_NODE(FLOOR_DIV, luci::CircleFloorDiv) +CIRCLE_NODE(FLOOR_MOD, luci::CircleFloorMod) CIRCLE_NODE(FULLY_CONNECTED, luci::CircleFullyConnected) CIRCLE_NODE(GATHER, luci::CircleGather) +CIRCLE_NODE(GATHER_ND, luci::CircleGatherNd) +CIRCLE_NODE(GREATER, luci::CircleGreater) +CIRCLE_NODE(GREATER_EQUAL, luci::CircleGreaterEqual) +CIRCLE_NODE(IF, luci::CircleIf) +CIRCLE_NODE(L2_NORMALIZATION, luci::CircleL2Normalize) +CIRCLE_NODE(L2_POOL_2D, luci::CircleL2Pool2D) +CIRCLE_NODE(LEAKY_RELU, luci::CircleLeakyRelu) +CIRCLE_NODE(LESS, luci::CircleLess) +CIRCLE_NODE(LESS_EQUAL, luci::CircleLessEqual) +CIRCLE_NODE(LOCAL_RESPONSE_NORMALIZATION, luci::CircleLocalResponseNormalization) +CIRCLE_NODE(LOG, luci::CircleLog) +CIRCLE_NODE(LOGICAL_AND, luci::CircleLogicalAnd) CIRCLE_NODE(LOGICAL_NOT, luci::CircleLogicalNot) CIRCLE_NODE(LOGICAL_OR, luci::CircleLogicalOr) -CIRCLE_NODE(MAXIMUM, luci::CircleMaximum) +CIRCLE_NODE(LOGISTIC, luci::CircleLogistic) +CIRCLE_NODE(LOG_SOFTMAX, luci::CircleLogSoftmax) +CIRCLE_NODE(MATRIX_DIAG, luci::CircleMatrixDiag) CIRCLE_NODE(MAX_POOL_2D, luci::CircleMaxPool2D) +CIRCLE_NODE(MATRIX_SET_DIAG, luci::CircleMatrixSetDiag) +CIRCLE_NODE(MAXIMUM, luci::CircleMaximum) CIRCLE_NODE(MEAN, luci::CircleMean) +CIRCLE_NODE(MINIMUM, luci::CircleMinimum) +CIRCLE_NODE(MIRROR_PAD, luci::CircleMirrorPad) CIRCLE_NODE(MUL, luci::CircleMul) +CIRCLE_NODE(NEG, luci::CircleNeg) +CIRCLE_NODE(NOT_EQUAL, luci::CircleNotEqual) +CIRCLE_NODE(ONE_HOT, luci::CircleOneHot) CIRCLE_NODE(PACK, luci::CirclePack) CIRCLE_NODE(PAD, luci::CirclePad) +CIRCLE_NODE(POW, luci::CirclePow) +CIRCLE_NODE(PRELU, luci::CirclePRelu) +CIRCLE_NODE(RANGE, luci::CircleRange) +CIRCLE_NODE(RANK, luci::CircleRank) +CIRCLE_NODE(REDUCE_ANY, luci::CircleReduceAny) +CIRCLE_NODE(REDUCE_MAX, luci::CircleReduceMax) +CIRCLE_NODE(REDUCE_MIN, luci::CircleReduceMin) +CIRCLE_NODE(REDUCE_PROD, luci::CircleReduceProd) CIRCLE_NODE(RELU, luci::CircleRelu) CIRCLE_NODE(RELU6, luci::CircleRelu6) +CIRCLE_NODE(RELU_N1_TO_1, luci::CircleReluN1To1) CIRCLE_NODE(RESHAPE, luci::CircleReshape) +CIRCLE_NODE(RESIZE_BILINEAR, luci::CircleResizeBilinear) +CIRCLE_NODE(RESIZE_NEAREST_NEIGHBOR, luci::CircleResizeNearestNeighbor) +CIRCLE_NODE(REVERSE_SEQUENCE, luci::CircleReverseSequence) +CIRCLE_NODE(REVERSE_V2, luci::CircleReverseV2) +CIRCLE_NODE(ROUND, luci::CircleRound) CIRCLE_NODE(RSQRT, luci::CircleRsqrt) +CIRCLE_NODE(SCATTER_ND, luci::CircleScatterNd) +CIRCLE_NODE(SEGMENT_SUM, luci::CircleSegmentSum) +CIRCLE_NODE(SELECT, luci::CircleSelect) +CIRCLE_NODE(SELECT_V2, luci::CircleSelectV2) +CIRCLE_NODE(SHAPE, luci::CircleShape) +CIRCLE_NODE(SIN, luci::CircleSin) +CIRCLE_NODE(SLICE, luci::CircleSlice) CIRCLE_NODE(SOFTMAX, luci::CircleSoftmax) +CIRCLE_NODE(SPACE_TO_BATCH_ND, luci::CircleSpaceToBatchND) +CIRCLE_NODE(SPACE_TO_DEPTH, luci::CircleSpaceToDepth) +CIRCLE_NODE(SPARSE_TO_DENSE, luci::CircleSparseToDense) +CIRCLE_NODE(SPLIT, luci::CircleSplit) +CIRCLE_NODE(SPLIT_V, luci::CircleSplitV) CIRCLE_NODE(SQRT, luci::CircleSqrt) +CIRCLE_NODE(SQUARE, luci::CircleSquare) CIRCLE_NODE(SQUARED_DIFFERENCE, luci::CircleSquaredDifference) +CIRCLE_NODE(SQUEEZE, luci::CircleSqueeze) +CIRCLE_NODE(STRIDED_SLICE, luci::CircleStridedSlice) CIRCLE_NODE(SUB, luci::CircleSub) -// TODO TFLTanh +CIRCLE_NODE(SUM, luci::CircleSum) +CIRCLE_NODE(TANH, luci::CircleTanh) +CIRCLE_NODE(TILE, luci::CircleTile) +CIRCLE_NODE(TOPK_V2, luci::CircleTopKV2) CIRCLE_NODE(TRANSPOSE, luci::CircleTranspose) CIRCLE_NODE(TRANSPOSE_CONV, luci::CircleTransposeConv) +CIRCLE_NODE(UNPACK, luci::CircleUnpack) +CIRCLE_NODE(WHERE, luci::CircleWhere) +CIRCLE_NODE(WHILE, luci::CircleWhile) +CIRCLE_NODE(ZEROS_LIKE, luci::CircleZerosLike) // Circle Only +CIRCLE_NODE(BCQ_FULLY_CONNECTED, luci::CircleBCQFullyConnected) +CIRCLE_NODE(BCQ_GATHER, luci::CircleBCQGather) CIRCLE_NODE(INSTANCE_NORM, luci::CircleInstanceNorm) // Virtual node(s) CIRCLE_NODE(CIRCLEINPUT, luci::CircleInput) CIRCLE_NODE(CIRCLEOUTPUT, luci::CircleOutput) +CIRCLE_NODE(CIRCLEOUTPUTDUMMY, luci::CircleOutputDummy) +CIRCLE_NODE(CIRCLEOUTPUTEXCLUDE, luci::CircleOutputExclude) +CIRCLE_NODE(CIRCLECUSTOMOUT, luci::CircleCustomOut) +CIRCLE_NODE(CIRCLEIFOUT, luci::CircleIfOut) +CIRCLE_NODE(CIRCLESPLITOUT, luci::CircleSplitOut) +CIRCLE_NODE(CIRCLESPLITVOUT, luci::CircleSplitVOut) +CIRCLE_NODE(CIRCLETOPKV2OUT, luci::CircleTopKV2Out) +CIRCLE_NODE(CIRCLEUNPACKOUT, luci::CircleUnpackOut) +CIRCLE_NODE(CIRCLEWHILEOUT, luci::CircleWhileOut) diff --git a/compiler/luci/lang/include/luci/IR/LuciNodeMixins.h b/compiler/luci/lang/include/luci/IR/LuciNodeMixins.h index b18ac5d..c1bb0db 100644 --- a/compiler/luci/lang/include/luci/IR/LuciNodeMixins.h +++ b/compiler/luci/lang/include/luci/IR/LuciNodeMixins.h @@ -22,6 +22,8 @@ #include #include +#include + namespace luci { @@ -70,6 +72,7 @@ template class FixedArityNode : public Base public: FixedArityNode() { + _args.resize(N); for (uint32_t n = 0; n < N; ++n) { _args[n] = std::make_unique(this); @@ -96,7 +99,7 @@ protected: loco::Use *at(unsigned n) const { return _args.at(n).get(); } private: - std::array, N> _args; + std::vector> _args{}; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleAddN.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleAddN.h new file mode 100644 index 0000000..6ba4a96 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleAddN.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCEL_ADD_N_H__ +#define __LUCI_IR_CIRCEL_ADD_N_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/VariadicArityNode.h" + +namespace luci +{ + +/** + * @brief ADD_N in Circle + */ +class CircleAddN final : public VariadicArityNode> +{ +public: + CircleAddN(uint32_t arity) : VariadicArityNode>(arity) + { + assert(arity >= 1); + } + +public: + Node *inputs(uint32_t index) const { return at(index)->node(); } + void inputs(uint32_t index, Node *node) { at(index)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCEL_ADD_N_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleArgMin.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleArgMin.h new file mode 100644 index 0000000..8cb5619 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleArgMin.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCELARGMIN_H__ +#define __LUCI_IR_CIRCELARGMIN_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ARG_Min in Circle + */ +class CircleArgMin final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *dimension(void) const { return at(1)->node(); } + void dimension(loco::Node *node) { at(1)->node(node); } + +public: + loco::DataType output_type(void) const { return _output_type; } + void output_type(loco::DataType ot) { _output_type = ot; } + +private: + loco::DataType _output_type{loco::DataType::S64}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCELARGMIN_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQFullyConnected.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQFullyConnected.h new file mode 100644 index 0000000..7d12d59 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQFullyConnected.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEBCQFULLYCONNECTED_H__ +#define __LUCI_IR_CIRCLEBCQFULLYCONNECTED_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/AttrFusedActFunc.h" +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief BCQ_FULLY_CONNECTED in Circle + */ +class CircleBCQFullyConnected final + : public FixedArityNode<5, CircleNodeImpl>, + public LuciNodeMixin, + public LuciNodeMixin +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *weights_scales(void) const { return at(1)->node(); } + void weights_scales(loco::Node *node) { at(1)->node(node); } + + loco::Node *weights_binary(void) const { return at(2)->node(); } + void weights_binary(loco::Node *node) { at(2)->node(node); } + + loco::Node *bias(void) const override { return at(3)->node(); } + void bias(loco::Node *node) override { at(3)->node(node); } + + loco::Node *weights_clusters(void) const { return at(4)->node(); } + void weights_clusters(loco::Node *node) { at(4)->node(node); } + +public: + int32_t weights_hidden_size(void) const { return _weights_hidden_size; } + void weights_hidden_size(int32_t weights_hidden_size) + { + _weights_hidden_size = weights_hidden_size; + } + +private: + int32_t _weights_hidden_size = 0; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEBCQFULLYCONNECTED_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQGather.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQGather.h new file mode 100644 index 0000000..f763826 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleBCQGather.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEBCQGATHER_H__ +#define __LUCI_IR_CIRCLEBCQGATHER_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief BCQ_GATHER in Circle + */ +class CircleBCQGather final : public FixedArityNode<4, CircleNodeImpl> +{ +public: + loco::Node *input_scales(void) const { return at(0)->node(); } + void input_scales(loco::Node *node) { at(0)->node(node); } + + loco::Node *input_binary(void) const { return at(1)->node(); } + void input_binary(loco::Node *node) { at(1)->node(node); } + + loco::Node *indices(void) const { return at(2)->node(); } + void indices(loco::Node *node) { at(2)->node(node); } + + loco::Node *input_clusters(void) const { return at(3)->node(); } + void input_clusters(loco::Node *node) { at(3)->node(node); } + +public: + int32_t axis(void) const { return _axis; } + void axis(int32_t axis) { _axis = axis; } + + int32_t input_hidden_size(void) const { return _input_hidden_size; } + void input_hidden_size(int32_t input_hidden_size) { _input_hidden_size = input_hidden_size; } + +private: + int32_t _axis = 0; + int32_t _input_hidden_size = 0; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEBCQGATHER_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleBatchMatMul.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleBatchMatMul.h new file mode 100644 index 0000000..1999992 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleBatchMatMul.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCELBATCHMATMUL_H__ +#define __LUCI_IR_CIRCELBATCHMATMUL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief BATCHMATMUL in Circle + */ +class CircleBatchMatMul final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } + +public: + bool adj_x(void) const { return _adj_x; } + void adj_x(bool arg) { _adj_x = arg; } + + bool adj_y(void) const { return _adj_y; } + void adj_y(bool arg) { _adj_y = arg; } + +private: + bool _adj_x = false; + bool _adj_y = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCELBATCHMATMUL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleCast.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleCast.h new file mode 100644 index 0000000..9a89d0b --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleCast.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCELECAST_H__ +#define __LUCI_IR_CIRCELECAST_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief CAST in Circle + */ +class CircleCast final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + +public: + loco::DataType in_data_type(void) const { return _in_data_type; } + void in_data_type(loco::DataType it) { _in_data_type = it; } + + loco::DataType out_data_type(void) const { return _out_data_type; } + void out_data_type(loco::DataType ot) { _out_data_type = ot; } + +private: + loco::DataType _in_data_type{loco::DataType::FLOAT32}; + loco::DataType _out_data_type{loco::DataType::FLOAT32}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCELECAST_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleCeil.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleCeil.h new file mode 100644 index 0000000..8a8715d --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleCeil.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_CEIL_H__ +#define __LUCI_IR_CIRCLE_CEIL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief CEIL in Circle + */ +class CircleCeil final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_CEIL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleConcatenation.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleConcatenation.h index 8a6778a..dea1a46 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleConcatenation.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleConcatenation.h @@ -64,7 +64,7 @@ public: void axis(int32_t axis) { _axis = axis; } private: - int32_t _axis; + int32_t _axis{0}; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleConst.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleConst.h index 089836e..fc67174 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleConst.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleConst.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" #include @@ -32,9 +31,7 @@ namespace luci * @brief Class to build tensor data * @note This will not be exported as a specific op */ -class CircleConst final : public FixedArityNode<0, CircleNodeImpl>, - public loco::NodeMixin, - public loco::NodeMixin +class CircleConst final : public FixedArityNode<0, CircleNodeImpl> { public: CircleConst() = default; diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleConv2D.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleConv2D.h index 54318e6..13657ce 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleConv2D.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleConv2D.h @@ -22,6 +22,7 @@ #include "luci/IR/AttrPadding.h" #include "luci/IR/AttrStride.h" +#include "luci/IR/AttrDilation.h" #include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" @@ -52,9 +53,13 @@ public: const Stride *stride(void) const { return &_stride; } Stride *stride(void) { return &_stride; } + const Dilation *dilation(void) const { return &_dilation; } + Dilation *dilation(void) { return &_dilation; } + private: Padding _padding = Padding::UNDEFINED; Stride _stride; + Dilation _dilation; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleCustom.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleCustom.h new file mode 100644 index 0000000..6c722b7 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleCustom.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLECUSTOM_H__ +#define __LUCI_IR_CIRCLECUSTOM_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/VariadicArityNode.h" + +namespace luci +{ + +/** + * @brief CUSTOM in Circle + */ +class CircleCustom final : public VariadicArityNode> +{ +public: + CircleCustom(uint32_t arity) : VariadicArityNode>(arity) + { + // TODO Support when arity is 0 + assert(arity >= 1); + } + +public: + uint32_t numInputs(void) const { return arity(); } + +public: + Node *inputs(uint32_t index) const { return at(index)->node(); } + void inputs(uint32_t index, Node *node) { at(index)->node(node); } + + const std::vector &custom_options(void) const { return _custom_options; } + void custom_options(const std::vector &custom_options) + { + _custom_options = custom_options; + } + + const std::string &custom_code(void) const { return _custom_code; } + void custom_code(const std::string &custom_code) { _custom_code = custom_code; } + +private: + std::vector _custom_options; + std::string _custom_code; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLECUSTOM_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleCustomOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleCustomOut.h new file mode 100644 index 0000000..36b8e4a --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleCustomOut.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_CUSTOMOUT_H__ +#define __LUCI_IR_CIRCLE_CUSTOMOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLECUSTOMOUT in Circle + */ +class CircleCustomOut final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleCustomOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_CUSTOMOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthToSpace.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthToSpace.h new file mode 100644 index 0000000..e19282b --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthToSpace.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_DEPTHTOSPACE_H__ +#define __LUCI_IR_CIRCLE_DEPTHTOSPACE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief DEPTH_TO_SPACE in Circle + */ +class CircleDepthToSpace final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int block_size(void) const { return _block_size; } + void block_size(int block_size) { _block_size = block_size; } + +private: + int _block_size{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_DEPTHTOSPACE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthwiseConv2D.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthwiseConv2D.h index 15ee62b..eb058ce 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthwiseConv2D.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleDepthwiseConv2D.h @@ -20,6 +20,7 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" +#include "luci/IR/AttrDilation.h" #include "luci/IR/AttrFilter.h" #include "luci/IR/AttrPadding.h" #include "luci/IR/AttrStride.h" @@ -57,10 +58,14 @@ public: int32_t depthMultiplier(void) const { return _depth_multiplier; } void depthMultiplier(int32_t arg) { _depth_multiplier = arg; } + const Dilation *dilation(void) const { return &_dilation; } + Dilation *dilation(void) { return &_dilation; } + private: Padding _padding = Padding::UNDEFINED; Stride _stride; int32_t _depth_multiplier = 0; + Dilation _dilation; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleElu.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleElu.h new file mode 100644 index 0000000..fbb2f35 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleElu.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEELU_H__ +#define __LUCI_IR_CIRCLEELU_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ELU in Circle + */ +class CircleElu final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleElu() = default; + +public: + loco::Node *features(void) const { return at(0)->node(); } + void features(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEELU_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleExpandDims.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleExpandDims.h new file mode 100644 index 0000000..f702196 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleExpandDims.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEEXPAND_DIMS_H__ +#define __LUCI_IR_CIRCLEEXPAND_DIMS_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief EXPAND_DIMS in Circle + */ +class CircleExpandDims final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleExpandDims() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *axis(void) const { return at(1)->node(); } + void axis(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEEXPAND_DIMS_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleFill.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleFill.h new file mode 100644 index 0000000..bfc6527 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleFill.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCEFILL_H__ +#define __LUCI_IR_CIRCEFILL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief FILL in Circle + */ +class CircleFill final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *dims(void) const { return at(0)->node(); } + void dims(loco::Node *node) { at(0)->node(node); } + + loco::Node *value(void) const { return at(1)->node(); } + void value(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCEFILL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleFloor.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloor.h new file mode 100644 index 0000000..7e10547 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloor.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_FLOOR_H__ +#define __LUCI_IR_CIRCLE_FLOOR_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief FLOOR in Circle + */ +class CircleFloor final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_FLOOR_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorDiv.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorDiv.h new file mode 100644 index 0000000..ba9db01 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorDiv.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_FLOOR_DIV_H__ +#define __LUCI_IR_CIRCLE_FLOOR_DIV_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief FLOOR_DIV in Circle + */ +class CircleFloorDiv final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_FLOOR_DIV_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorMod.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorMod.h new file mode 100644 index 0000000..4d13717 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleFloorMod.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_FLOOR_MOD_H__ +#define __LUCI_IR_CIRCLE_FLOOR_MOD_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief FLOOR_MOD in Circle + */ +class CircleFloorMod final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_FLOOR_MOD_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleGather.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleGather.h index 489596c..1e8c498 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleGather.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleGather.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci @@ -32,11 +31,11 @@ namespace luci class CircleGather final : public FixedArityNode<2, CircleNodeImpl> { public: - loco::Node *input(void) const { return at(0)->node(); } - void input(loco::Node *node) { at(0)->node(node); } + loco::Node *params(void) const { return at(0)->node(); } + void params(loco::Node *node) { at(0)->node(node); } - loco::Node *positions(void) const { return at(1)->node(); } - void positions(loco::Node *node) { at(1)->node(node); } + loco::Node *indices(void) const { return at(1)->node(); } + void indices(loco::Node *node) { at(1)->node(node); } public: int32_t axis(void) const { return _axis; } diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleGatherNd.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleGatherNd.h new file mode 100644 index 0000000..3423a82 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleGatherNd.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEGATHER_ND_H__ +#define __LUCI_IR_CIRCLEGATHER_ND_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief GATHER_ND in Circle + */ +class CircleGatherNd final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *params(void) const { return at(0)->node(); } + void params(loco::Node *node) { at(0)->node(node); } + + loco::Node *indices(void) const { return at(1)->node(); } + void indices(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEGATHER_ND_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleGreater.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleGreater.h new file mode 100644 index 0000000..040a4e3 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleGreater.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_GREATER_H__ +#define __LUCI_IR_CIRCLE_GREATER_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Greater in Circle + */ +class CircleGreater final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_GREATER_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleGreaterEqual.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleGreaterEqual.h new file mode 100644 index 0000000..82bdab2 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleGreaterEqual.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_GREATEREQUAL_H__ +#define __LUCI_IR_CIRCLE_GREATEREQUAL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief GREATER EQUAL in Circle + */ +class CircleGreaterEqual final + : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_GREATEREQUAL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleIf.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleIf.h new file mode 100644 index 0000000..2f9eac2 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleIf.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_IF_H__ +#define __LUCI_IR_CIRCLE_IF_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/VariadicArityNode.h" + +#include + +namespace luci +{ + +/** + * @brief IF in Circle + */ +class CircleIf final : public VariadicArityNode> +{ +public: + CircleIf(uint32_t arity, uint32_t out) + : VariadicArityNode>(arity + 1), _output_count(out) + { + assert(arity > 0); + assert(out > 0); + } + +public: + uint32_t input_count(void) const { return arity() - 1; } + uint32_t output_count(void) const { return _output_count; } + +public: + Node *cond(void) const { return at(0)->node(); } + void cond(Node *node) { at(0)->node(node); } + + Node *input(uint32_t index) const { return at(index + 1)->node(); } + void input(uint32_t index, Node *node) { at(index + 1)->node(node); } + +public: + int32_t then_branch(void) const { return _then_branch; } + void then_branch(int32_t then_branch) { _then_branch = then_branch; } + + int32_t else_branch(void) const { return _else_branch; } + void else_branch(int32_t else_branch) { _else_branch = else_branch; } + +public: + loco::Graph *then_graph(void) const { return _then_graph; } + void then_graph(loco::Graph *then_graph) { _then_graph = then_graph; } + + loco::Graph *else_graph(void) const { return _else_graph; } + void else_graph(loco::Graph *else_graph) { _else_graph = else_graph; } + +private: + uint32_t _output_count{0}; + int32_t _then_branch{-1}; + int32_t _else_branch{-1}; + + loco::Graph *_then_graph{nullptr}; + loco::Graph *_else_graph{nullptr}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_IF_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleIfOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleIfOut.h new file mode 100644 index 0000000..3654e94 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleIfOut.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_IFOUT_H__ +#define __LUCI_IR_CIRCLE_IFOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLEIFOUT in Circle + */ +class CircleIfOut final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleIfOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_IFOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleInput.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleInput.h index 2c4d602..4a7d36a 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleInput.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleInput.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" #include @@ -33,9 +32,7 @@ namespace luci * @brief CircleNode used for Input of the Graph * @note This will not be exported as a specific op */ -class CircleInput final : public FixedArityNode<0, CircleNodeImpl>, - public loco::NodeMixin, - public loco::NodeMixin +class CircleInput final : public FixedArityNode<0, CircleNodeImpl> { public: CircleInput() = default; diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Normalize.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Normalize.h new file mode 100644 index 0000000..efa932d --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Normalize.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCEL2NORMALIZE_H__ +#define __LUCI_IR_CIRCEL2NORMALIZE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/AttrFusedActFunc.h" +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief L2_NORMALIZATION in Circle + */ +class CircleL2Normalize final + : public FixedArityNode<1, CircleNodeImpl>, + public LuciNodeMixin +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCEL2NORMALIZE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Pool2D.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Pool2D.h new file mode 100644 index 0000000..7c76ee5 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleL2Pool2D.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_L2_POOL2D_H__ +#define __LUCI_IR_CIRCLE_L2_POOL2D_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/AttrFilter.h" +#include "luci/IR/AttrPadding.h" +#include "luci/IR/AttrStride.h" +#include "luci/IR/AttrFusedActFunc.h" +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief L2_POOL_2D in Circle + */ +class CircleL2Pool2D final : public FixedArityNode<1, CircleNodeImpl>, + public LuciNodeMixin +{ +public: + CircleL2Pool2D() : _padding(Padding::UNDEFINED) { /* empty */} + +public: + loco::Node *value(void) const { return at(0)->node(); } + void value(loco::Node *node) { at(0)->node(node); } + + Padding padding() const { return _padding; } + void padding(Padding padding) { _padding = padding; } + + const Filter *filter(void) const { return &_filter; } + Filter *filter(void) { return &_filter; } + + const Stride *stride(void) const { return &_stride; } + Stride *stride(void) { return &_stride; } + +private: + Padding _padding; + Stride _stride; + Filter _filter; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_L2_POOL2D_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLeakyRelu.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLeakyRelu.h new file mode 100644 index 0000000..d6ac97f --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLeakyRelu.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LEAKY_RELU_H__ +#define __LUCI_IR_CIRCLE_LEAKY_RELU_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LEAKY_RELU in Circle + */ +class CircleLeakyRelu final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleLeakyRelu() = default; + +public: + loco::Node *features(void) const { return at(0)->node(); } + void features(loco::Node *node) { at(0)->node(node); } + + float alpha() const { return _alpha; } + void alpha(float alpha) { _alpha = alpha; } + +private: + float _alpha = 0.2f; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LEAKY_RELU_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLess.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLess.h new file mode 100644 index 0000000..cd6cf18 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLess.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LESS_H__ +#define __LUCI_IR_CIRCLE_LESS_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LESS in Circle + */ +class CircleLess final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LESS_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLessEqual.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLessEqual.h new file mode 100644 index 0000000..4c7c6a4 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLessEqual.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LESSEQUAL_H__ +#define __LUCI_IR_CIRCLE_LESSEQUAL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LESS_EQUAL in Circle + */ +class CircleLessEqual final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LESSEQUAL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLocalResponseNormalization.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLocalResponseNormalization.h new file mode 100644 index 0000000..8ad2b40 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLocalResponseNormalization.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLELOCAL_RESPONSE_NORMALIZATION_H__ +#define __LUCI_IR_CIRCLELOCAL_RESPONSE_NORMALIZATION_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LOCAL_RESPONSE_NORMALIZATION in Circle + */ +class CircleLocalResponseNormalization final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t radius(void) const { return _radius; } + void radius(int32_t radius) { _radius = radius; } + + float bias(void) const { return _bias; } + void bias(float bias) { _bias = bias; } + + float alpha(void) const { return _alpha; } + void alpha(float alpha) { _alpha = alpha; } + + float beta(void) const { return _beta; } + void beta(float beta) { _beta = beta; } + +private: + int32_t _radius{5}; + float _bias{1.0f}; + float _alpha{1.0f}; + float _beta{0.5f}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLELOCAL_RESPONSE_NORMALIZATION_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLog.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLog.h new file mode 100644 index 0000000..aeb13fe --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLog.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LOG_H__ +#define __LUCI_IR_CIRCLE_LOG_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LOG in Circle + */ +class CircleLog final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LOG_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLogSoftmax.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogSoftmax.h new file mode 100644 index 0000000..5dfd2c1 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogSoftmax.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LOG_SOFTMAX_H__ +#define __LUCI_IR_CIRCLE_LOG_SOFTMAX_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LOG_SOFTMAX in Circle + */ +class CircleLogSoftmax final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *logits(void) const { return at(0)->node(); } + void logits(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LOG_SOFTMAX_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLogicalAnd.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogicalAnd.h new file mode 100644 index 0000000..975f6db --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogicalAnd.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LOGICALAND_H__ +#define __LUCI_IR_CIRCLE_LOGICALAND_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LOGICAL_AND in Circle + */ +class CircleLogicalAnd final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LOGICALAND_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleLogistic.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogistic.h new file mode 100644 index 0000000..8328cb3 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleLogistic.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_LOGISTIC_H__ +#define __LUCI_IR_CIRCLE_LOGISTIC_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief LOGISTIC in Circle + */ +class CircleLogistic final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleLogistic() = default; + +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_LOGISTIC_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixDiag.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixDiag.h new file mode 100644 index 0000000..dca6538 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixDiag.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEMATRIXDIAG_H__ +#define __LUCI_IR_CIRCLEMATRIXDIAG_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief MATRIX_DIAG in Circle + */ +class CircleMatrixDiag final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *diagonal(void) const { return at(0)->node(); } + void diagonal(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEMATRIXDIAG_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixSetDiag.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixSetDiag.h new file mode 100644 index 0000000..c1f5f30 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMatrixSetDiag.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEMATRIXSETDIAG_H__ +#define __LUCI_IR_CIRCLEMATRIXSETDIAG_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief MATRIX_SET_DIAG in Circle + */ +class CircleMatrixSetDiag final + : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *diagonal(void) const { return at(1)->node(); } + void diagonal(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEMATRIXSETDIAG_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMaximum.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMaximum.h index cf7305e..6f789bc 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleMaximum.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMaximum.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMean.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMean.h index 6fd7914..7f8aeb5 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleMean.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMean.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMinimum.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMinimum.h new file mode 100644 index 0000000..79d5a6f --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMinimum.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEMINIMUM_H__ +#define __LUCI_IR_CIRCLEMINIMUM_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief MINIMUM in Circle + */ +class CircleMinimum final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEMINIMUM_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleMirrorPad.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleMirrorPad.h new file mode 100644 index 0000000..68db8f6 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleMirrorPad.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_MIRRORPAD_H__ +#define __LUCI_IR_CIRCLE_MIRRORPAD_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" +#include "luci/IR/AttrMirrorPadMode.h" + +namespace luci +{ + +/** + * @brief MIRROR_PAD in Circle + */ +class CircleMirrorPad final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleMirrorPad() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *paddings(void) const { return at(1)->node(); } + void paddings(loco::Node *node) { at(1)->node(node); } + +public: + MirrorPadMode mode(void) const { return _mode; } + void mode(MirrorPadMode mode) { _mode = mode; } + +private: + MirrorPadMode _mode{MirrorPadMode::REFLECT}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_MIRRORPAD_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleNeg.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleNeg.h new file mode 100644 index 0000000..4149ac4 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleNeg.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLENEG_H__ +#define __LUCI_IR_CIRCLENEG_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief NEG in Circle + */ +class CircleNeg final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLENEG_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleNotEqual.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleNotEqual.h new file mode 100644 index 0000000..cca7a5e --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleNotEqual.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_NOTEQUAL_H__ +#define __LUCI_IR_CIRCLE_NOTEQUAL_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief NOT EQUAL in Circle + */ +class CircleNotEqual final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_NOTEQUAL_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleOneHot.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleOneHot.h new file mode 100644 index 0000000..665e01d --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleOneHot.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEONEHOT_H__ +#define __LUCI_IR_CIRCLEONEHOT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ONEHOT in Circle + */ +class CircleOneHot final : public FixedArityNode<4, CircleNodeImpl> +{ +public: + loco::Node *indices(void) const { return at(0)->node(); } + void indices(loco::Node *node) { at(0)->node(node); } + + loco::Node *depth(void) const { return at(1)->node(); } + void depth(loco::Node *node) { at(1)->node(node); } + + loco::Node *on_value(void) const { return at(2)->node(); } + void on_value(loco::Node *node) { at(2)->node(node); } + + loco::Node *off_value(void) const { return at(3)->node(); } + void off_value(loco::Node *node) { at(3)->node(node); } + +public: + int32_t axis(void) const { return _axis; } + void axis(int32_t axis) { _axis = axis; } + +private: + int32_t _axis = -1; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEONEHOT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleOutput.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleOutput.h index c65317a..67e55f1 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleOutput.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleOutput.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" #include @@ -50,6 +49,27 @@ private: int64_t _index = -1; // Uninitialized }; +/** + * @brief Temporary DummyNode used with dangle CircleNode + */ +// TODO remove CircleOutputDummy +class CircleOutputDummy final + : public FixedArityNode<0, CircleNodeImpl> +{ +public: + CircleOutputDummy() = default; +}; + +/** + * @brief CircleOutputExclude is used to specifying not exported nodes + */ +class CircleOutputExclude final + : public FixedArityNode<0, CircleNodeImpl> +{ +public: + CircleOutputExclude() = default; +}; + } // namespace luci #endif // __LUCI_IR_CIRCLEOUTPUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CirclePRelu.h b/compiler/luci/lang/include/luci/IR/Nodes/CirclePRelu.h new file mode 100644 index 0000000..6937775 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CirclePRelu.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_PRELU_H__ +#define __LUCI_IR_PRELU_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief PRelu in Circle + */ +class CirclePRelu final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CirclePRelu() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *alpha(void) const { return at(1)->node(); } + void alpha(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_PRELU_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CirclePow.h b/compiler/luci/lang/include/luci/IR/Nodes/CirclePow.h new file mode 100644 index 0000000..006e3dd --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CirclePow.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_POW_H__ +#define __LUCI_IR_POW_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief POW in Circle + */ +class CirclePow final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CirclePow() = default; + +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } + + loco::Node *y(void) const { return at(1)->node(); } + void y(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_POW_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRange.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRange.h new file mode 100644 index 0000000..977a37a --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRange.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLERANGE_H__ +#define __LUCI_IR_CIRCLERANGE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief RANGE in Circle + */ +class CircleRange final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + loco::Node *start(void) const { return at(0)->node(); } + void start(loco::Node *node) { at(0)->node(node); } + + loco::Node *limit(void) const { return at(1)->node(); } + void limit(loco::Node *node) { at(1)->node(node); } + + loco::Node *delta(void) const { return at(2)->node(); } + void delta(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLERANGE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRank.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRank.h new file mode 100644 index 0000000..ba6d67f --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRank.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLERANK_H__ +#define __LUCI_IR_CIRCLERANK_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief RANK in Circle + */ +class CircleRank final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLERANK_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceAny.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceAny.h new file mode 100644 index 0000000..0456be8 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceAny.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_REDUCE_ANY_H__ +#define __LUCI_IR_CIRCLE_REDUCE_ANY_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief REDUCE_ANY in Circle + */ +class CircleReduceAny final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *reduction_indices(void) const { return at(1)->node(); } + void reduction_indices(loco::Node *node) { at(1)->node(node); } + +public: + bool keep_dims(void) const { return _keep_dims; } + void keep_dims(bool keep_dims) { _keep_dims = keep_dims; } + +private: + bool _keep_dims = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_REDUCE_ANY_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMax.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMax.h new file mode 100644 index 0000000..925c977 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMax.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_REDUCE_MAX_H__ +#define __LUCI_IR_CIRCLE_REDUCE_MAX_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief REDUCE_MAX in Circle + */ +class CircleReduceMax final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *reduction_indices(void) const { return at(1)->node(); } + void reduction_indices(loco::Node *node) { at(1)->node(node); } + +public: + bool keep_dims(void) const { return _keep_dims; } + void keep_dims(bool keep_dims) { _keep_dims = keep_dims; } + +private: + bool _keep_dims = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_REDUCE_MAX_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMin.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMin.h new file mode 100644 index 0000000..fd789ae --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceMin.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_REDUCE_MIN_H__ +#define __LUCI_IR_CIRCLE_REDUCE_MIN_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief REDUCE_MIN in Circle + */ +class CircleReduceMin final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *reduction_indices(void) const { return at(1)->node(); } + void reduction_indices(loco::Node *node) { at(1)->node(node); } + +public: + bool keep_dims(void) const { return _keep_dims; } + void keep_dims(bool keep_dims) { _keep_dims = keep_dims; } + +private: + bool _keep_dims = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_REDUCE_MIN_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceProd.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceProd.h new file mode 100644 index 0000000..b7d2262 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReduceProd.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_REDUCE_PROD_H__ +#define __LUCI_IR_CIRCLE_REDUCE_PROD_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief REDUCE_PROD in Circle + */ +class CircleReduceProd final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *reduction_indices(void) const { return at(1)->node(); } + void reduction_indices(loco::Node *node) { at(1)->node(node); } + +public: + bool keep_dims(void) const { return _keep_dims; } + void keep_dims(bool keep_dims) { _keep_dims = keep_dims; } + +private: + bool _keep_dims = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_REDUCE_PROD_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu.h index afb2c66..91272d2 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu6.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu6.h index b313a55..b4274de 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu6.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRelu6.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReluN1To1.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReluN1To1.h new file mode 100644 index 0000000..a5c5710 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReluN1To1.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_RELU_N1_TO_1_H__ +#define __LUCI_IR_CIRCLE_RELU_N1_TO_1_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief RELU_N1_TO_1 in Circle + */ +class CircleReluN1To1 final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleReluN1To1() = default; + +public: + loco::Node *features(void) const { return at(0)->node(); } + void features(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_RELU_N1_TO_1_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReshape.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReshape.h index a3a2a3f..b13144f 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleReshape.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReshape.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci @@ -38,8 +37,8 @@ public: loco::Node *tensor(void) const { return at(0)->node(); } void tensor(loco::Node *node) { at(0)->node(node); } - // TODO Make this input optional. That is, loco system does not emit error - // with this input being null + // NOTE shape is optional and can be CircleConst or any other type + // and also can be CircleOutputDummy when reshape option does not exist loco::Node *shape(void) const { return at(1)->node(); } void shape(loco::Node *node) { at(1)->node(node); } diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeBilinear.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeBilinear.h new file mode 100644 index 0000000..3c82233 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeBilinear.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLERESIZE_BILINEAR_H__ +#define __LUCI_IR_CIRCLERESIZE_BILINEAR_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief RESIZE_BILINEAR in Circle + */ +class CircleResizeBilinear final + : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleResizeBilinear() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *size(void) const { return at(1)->node(); } + void size(loco::Node *node) { at(1)->node(node); } + + bool align_corners() const { return _align_corners; } + void align_corners(bool value) { _align_corners = value; } + + bool half_pixel_centers() const { return _half_pixel_centers; } + void half_pixel_centers(bool value) { _half_pixel_centers = value; } + +private: + bool _align_corners = false; + bool _half_pixel_centers = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLERESIZE_BILINEAR_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeNearestNeighbor.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeNearestNeighbor.h new file mode 100644 index 0000000..dc32ebe --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleResizeNearestNeighbor.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLERESSIZE_NEAREST_NEIGHBOR_H__ +#define __LUCI_IR_CIRCLERESSIZE_NEAREST_NEIGHBOR_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief RESIZE_NEAREST_NEIGHBOR in Circle + */ +class CircleResizeNearestNeighbor final + : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleResizeNearestNeighbor() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *size(void) const { return at(1)->node(); } + void size(loco::Node *node) { at(1)->node(node); } + + bool align_corners() const { return _align_corners; } + void align_corners(bool value) { _align_corners = value; } + +private: + bool _align_corners = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLERESSIZE_NEAREST_NEIGHBOR_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseSequence.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseSequence.h new file mode 100644 index 0000000..b0766dd --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseSequence.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEREVERSESEQUENCE_H__ +#define __LUCI_IR_CIRCLEREVERSESEQUENCE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief REVERSE_SEQUENCE in Circle + */ +class CircleReverseSequence final + : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleReverseSequence() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *seq_lengths(void) const { return at(1)->node(); } + void seq_lengths(loco::Node *node) { at(1)->node(node); } + +public: + int seq_axis(void) const { return _seq_axis; } + void seq_axis(int seq_axis) { _seq_axis = seq_axis; } + + int batch_axis(void) const { return _batch_axis; } + void batch_axis(int batch_axis) { _batch_axis = batch_axis; } + +private: + int _seq_axis{0}; + int _batch_axis{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEREVERSESEQUENCE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseV2.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseV2.h new file mode 100644 index 0000000..71d9f65 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleReverseV2.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEREVERSE_V2_H__ +#define __LUCI_IR_CIRCLEREVERSE_V2_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ReverseV2 in Circle + */ +class CircleReverseV2 final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *tensor(void) const { return at(0)->node(); } + void tensor(loco::Node *node) { at(0)->node(node); } + + loco::Node *axis(void) const { return at(1)->node(); } + void axis(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEREVERSE_V2_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRound.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRound.h new file mode 100644 index 0000000..30296ce --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRound.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLEROUND_H__ +#define __LUCI_IR_CIRCLEROUND_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ROUND in Circle + */ +class CircleRound final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleRound() = default; + +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLEROUND_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleRsqrt.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleRsqrt.h index 44d22ef..873397b 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleRsqrt.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleRsqrt.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleScatterNd.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleScatterNd.h new file mode 100644 index 0000000..9f93a0a --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleScatterNd.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLESCATTER_ND_H__ +#define __LUCI_IR_CIRCLESCATTER_ND_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SCATTER_ND in Circle + */ +class CircleScatterNd final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + loco::Node *indices(void) const { return at(0)->node(); } + void indices(loco::Node *node) { at(0)->node(node); } + + loco::Node *updates(void) const { return at(1)->node(); } + void updates(loco::Node *node) { at(1)->node(node); } + + loco::Node *shape(void) const { return at(2)->node(); } + void shape(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLESCATTER_ND_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSegmentSum.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSegmentSum.h new file mode 100644 index 0000000..416d617 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSegmentSum.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SEGMENT_SUM_H__ +#define __LUCI_IR_CIRCLE_SEGMENT_SUM_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SEGMENT_SUM in Circle + */ +class CircleSegmentSum final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleSegmentSum() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *segment_ids(void) const { return at(1)->node(); } + void segment_ids(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SEGMENT_SUM_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSelect.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSelect.h new file mode 100644 index 0000000..7276471 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSelect.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SELECT_H__ +#define __LUCI_IR_CIRCLE_SELECT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SELECT in Circle + */ +class CircleSelect final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + CircleSelect() = default; + +public: + loco::Node *condition(void) const { return at(0)->node(); } + void condition(loco::Node *node) { at(0)->node(node); } + + loco::Node *t(void) const { return at(1)->node(); } + void t(loco::Node *node) { at(1)->node(node); } + + loco::Node *e(void) const { return at(2)->node(); } + void e(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SELECT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSelectV2.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSelectV2.h new file mode 100644 index 0000000..7ac3c05 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSelectV2.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SELECT_V2_H__ +#define __LUCI_IR_CIRCLE_SELECT_V2_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SELECT_V2 in Circle + */ +class CircleSelectV2 final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + CircleSelectV2() = default; + +public: + loco::Node *condition(void) const { return at(0)->node(); } + void condition(loco::Node *node) { at(0)->node(node); } + + loco::Node *t(void) const { return at(1)->node(); } + void t(loco::Node *node) { at(1)->node(node); } + + loco::Node *e(void) const { return at(2)->node(); } + void e(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SELECT_V2_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleShape.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleShape.h new file mode 100644 index 0000000..ff20ce6 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleShape.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SHAPE_H__ +#define __LUCI_IR_CIRCLE_SHAPE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SHAPE in Circle + */ +class CircleShape final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleShape() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + loco::DataType out_type(void) const { return _out_type; } + void out_type(loco::DataType ot) { _out_type = ot; } + +private: + loco::DataType _out_type{loco::DataType::S32}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SHAPE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSin.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSin.h new file mode 100644 index 0000000..5624db2 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSin.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SIN_H__ +#define __LUCI_IR_CIRCLE_SIN_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SIN in Circle + */ +class CircleSin final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SIN_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSlice.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSlice.h new file mode 100644 index 0000000..a211364 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSlice.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_SLICE_H__ +#define __LUCI_IR_SLICE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SLICE in Circle + */ +class CircleSlice final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *begin(void) const { return at(1)->node(); } + void begin(loco::Node *node) { at(1)->node(node); } + + loco::Node *size(void) const { return at(2)->node(); } + void size(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_SLICE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSoftmax.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSoftmax.h index 4ea3c4b..7166a32 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleSoftmax.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSoftmax.h @@ -39,7 +39,7 @@ public: void beta(float beta) { _beta = beta; } private: - float _beta; + float _beta{0.0f}; }; } // namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToBatchND.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToBatchND.h new file mode 100644 index 0000000..042ebff --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToBatchND.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPACETOBATCHND_H__ +#define __LUCI_IR_CIRCLE_SPACETOBATCHND_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SPACE_TO_BATCH_ND in Circle + */ +class CircleSpaceToBatchND final + : public FixedArityNode<3, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *block_shape(void) const { return at(1)->node(); } + void block_shape(loco::Node *node) { at(1)->node(node); } + + loco::Node *paddings(void) const { return at(2)->node(); } + void paddings(loco::Node *node) { at(2)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPACETOBATCHND_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToDepth.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToDepth.h new file mode 100644 index 0000000..420a4cb --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSpaceToDepth.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPACETODEPTH_H__ +#define __LUCI_IR_CIRCLE_SPACETODEPTH_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SPACE_TO_DEPTH in Circle + */ +class CircleSpaceToDepth final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int block_size(void) const { return _block_size; } + void block_size(int block_size) { _block_size = block_size; } + +private: + int _block_size{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPACETODEPTH_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSparseToDense.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSparseToDense.h new file mode 100644 index 0000000..9f50513 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSparseToDense.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCELSPARSETODENSE_H__ +#define __LUCI_IR_CIRCELSPARSETODENSE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SPARSE_TO_DENSE in Circle + */ +class CircleSparseToDense final + : public FixedArityNode<4, CircleNodeImpl> +{ +public: + loco::Node *indices(void) const { return at(0)->node(); } + void indices(loco::Node *node) { at(0)->node(node); } + + loco::Node *output_shape(void) const { return at(1)->node(); } + void output_shape(loco::Node *node) { at(1)->node(node); } + + loco::Node *values(void) const { return at(2)->node(); } + void values(loco::Node *node) { at(2)->node(node); } + + loco::Node *default_value(void) const { return at(3)->node(); } + void default_value(loco::Node *node) { at(3)->node(node); } + +public: + bool validate_indices(void) const { return _validate_indices; } + void validate_indices(bool validate_indices) { _validate_indices = validate_indices; } + +private: + bool _validate_indices{true}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCELSPARSETODENSE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSplit.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplit.h new file mode 100644 index 0000000..0eda195 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplit.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPLIT_H__ +#define __LUCI_IR_CIRCLE_SPLIT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SPLIT in Circle + */ +class CircleSplit final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *split_dim(void) const { return at(0)->node(); } + void split_dim(loco::Node *node) { at(0)->node(node); } + + loco::Node *input(void) const { return at(1)->node(); } + void input(loco::Node *node) { at(1)->node(node); } + +public: + // NOTE it is num_split() not num_splits() as we follow TF name + int32_t num_split(void) const { return _num_split; } + void num_split(int32_t num_split) { _num_split = num_split; } + +private: + int32_t _num_split{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPLIT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitOut.h new file mode 100644 index 0000000..6bf4a9f --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitOut.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPLITOUT_H__ +#define __LUCI_IR_CIRCLE_SPLITOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLESPLITOUT in Circle + */ +class CircleSplitOut final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleSplitOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPLITOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitV.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitV.h new file mode 100644 index 0000000..1b7d555 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitV.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPLIT_V_H__ +#define __LUCI_IR_CIRCLE_SPLIT_V_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SPLIT_V in Circle + */ +class CircleSplitV final : public FixedArityNode<3, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *size_splits(void) const { return at(1)->node(); } + void size_splits(loco::Node *node) { at(1)->node(node); } + + loco::Node *split_dim(void) const { return at(2)->node(); } + void split_dim(loco::Node *node) { at(2)->node(node); } + +public: + // NOTE it is num_split() not num_splits() as we follow TF name + int32_t num_split(void) const { return _num_split; } + void num_split(int32_t num_split) { _num_split = num_split; } + +private: + int32_t _num_split{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPLIT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitVOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitVOut.h new file mode 100644 index 0000000..d3b2f1e --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSplitVOut.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_SPLITVOUT_H__ +#define __LUCI_IR_CIRCLE_SPLITVOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLESPLITVOUT in Circle + */ +class CircleSplitVOut final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleSplitVOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_SPLITVOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSqrt.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSqrt.h index bc1f39d..c96ca84 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleSqrt.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSqrt.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSquare.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSquare.h new file mode 100644 index 0000000..a29edfe --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSquare.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLESQUARE_H__ +#define __LUCI_IR_CIRCLESQUARE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SQUARE in Circle + */ +class CircleSquare final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleSquare() = default; + +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLESQUARE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSquaredDifference.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSquaredDifference.h index ff337df..b5b39f9 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleSquaredDifference.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSquaredDifference.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSqueeze.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSqueeze.h new file mode 100644 index 0000000..f175f14 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSqueeze.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLESQUEEZE_H__ +#define __LUCI_IR_CIRCLESQUEEZE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SQUEEZE in Circle + */ +class CircleSqueeze final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleSqueeze() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + const std::vector &squeeze_dims() const { return _squeeze_dims; } + void squeeze_dims(const std::vector &squeeze_dims) { _squeeze_dims = squeeze_dims; }; + +private: + std::vector _squeeze_dims{}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLESQUEEZE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleStridedSlice.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleStridedSlice.h new file mode 100644 index 0000000..98799fe --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleStridedSlice.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_STRIDEDSLICE_H__ +#define __LUCI_IR_STRIDEDSLICE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief STRIDED_SLICE in Circle + */ +class CircleStridedSlice final + : public FixedArityNode<4, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *begin(void) const { return at(1)->node(); } + void begin(loco::Node *node) { at(1)->node(node); } + + loco::Node *end(void) const { return at(2)->node(); } + void end(loco::Node *node) { at(2)->node(node); } + + loco::Node *strides(void) const { return at(3)->node(); } + void strides(loco::Node *node) { at(3)->node(node); } + +public: + int32_t begin_mask() const { return _begin_mask; } + void begin_mask(int32_t mask) { _begin_mask = mask; } + + int32_t end_mask() const { return _end_mask; } + void end_mask(int32_t mask) { _end_mask = mask; } + + int32_t ellipsis_mask() const { return _ellipsis_mask; } + void ellipsis_mask(int32_t mask) { _ellipsis_mask = mask; } + + int32_t new_axis_mask() const { return _new_axis_mask; } + void new_axis_mask(int32_t mask) { _new_axis_mask = mask; } + + int32_t shrink_axis_mask() const { return _shrink_axis_mask; } + void shrink_axis_mask(int32_t mask) { _shrink_axis_mask = mask; } + +private: + int32_t _begin_mask{0}; + int32_t _end_mask{0}; + int32_t _ellipsis_mask{0}; + int32_t _new_axis_mask{0}; + int32_t _shrink_axis_mask{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_STRIDEDSLICE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleSum.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleSum.h new file mode 100644 index 0000000..21faa76 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleSum.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLESUM_H__ +#define __LUCI_IR_CIRCLESUM_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief SUM in Circle + */ +class CircleSum final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *reduction_indices(void) const { return at(1)->node(); } + void reduction_indices(loco::Node *node) { at(1)->node(node); } + +public: + bool keep_dims(void) const { return _keep_dims; } + void keep_dims(bool keep_dims) { _keep_dims = keep_dims; } + +private: + bool _keep_dims = false; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLESUM_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTanh.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTanh.h new file mode 100644 index 0000000..f744492 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTanh.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLETANH_H__ +#define __LUCI_IR_CIRCLETANH_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief TANH in Circle + */ +class CircleTanh final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleTanh() = default; + +public: + loco::Node *x(void) const { return at(0)->node(); } + void x(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLETANH_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTile.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTile.h new file mode 100644 index 0000000..96e1f69 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTile.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLETILE_H__ +#define __LUCI_IR_CIRCLETILE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief TILE in Circle + */ +class CircleTile final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleTile() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *multiples(void) const { return at(1)->node(); } + void multiples(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLETILE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2.h new file mode 100644 index 0000000..3b2b5ab --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_TOPK_V2_H__ +#define __LUCI_IR_CIRCLE_TOPK_V2_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief TOPK_V2 in Circle + */ +class CircleTopKV2 final : public FixedArityNode<2, CircleNodeImpl> +{ +public: + CircleTopKV2() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + + loco::Node *k(void) const { return at(1)->node(); } + void k(loco::Node *node) { at(1)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_TOPK_V2_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2Out.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2Out.h new file mode 100644 index 0000000..5a6dd0c --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTopKV2Out.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_TOPK_V2_OUT_H__ +#define __LUCI_IR_CIRCLE_TOPK_V2_OUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLETOPKV2OUT in Circle + */ +class CircleTopKV2Out final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleTopKV2Out() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_TOPK_V2_OUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTranspose.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTranspose.h index 198b56a..095cd67 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleTranspose.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTranspose.h @@ -20,7 +20,6 @@ #include "luci/IR/CircleNodeDecl.h" #include "luci/IR/CircleOpcode.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleTransposeConv.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleTransposeConv.h index 54a0d01..fc638d4 100644 --- a/compiler/luci/lang/include/luci/IR/Nodes/CircleTransposeConv.h +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleTransposeConv.h @@ -22,7 +22,6 @@ #include "luci/IR/AttrPadding.h" #include "luci/IR/AttrStride.h" -#include "luci/IR/AttrFusedActFunc.h" #include "luci/IR/LuciNodeMixins.h" namespace luci @@ -55,7 +54,7 @@ public: Stride *stride(void) { return &_stride; } private: - Padding _padding; + Padding _padding{Padding::UNDEFINED}; Stride _stride; }; diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpack.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpack.h new file mode 100644 index 0000000..cb91d7e --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpack.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_UNPACK_H__ +#define __LUCI_IR_CIRCLE_UNPACK_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief UNPACK in Circle + */ +class CircleUnpack final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleUnpack() = default; + +public: + loco::Node *value(void) const { return at(0)->node(); } + void value(loco::Node *node) { at(0)->node(node); } + +public: + int32_t num(void) const { return _num; } + void num(int32_t num) { _num = num; } + + int32_t axis(void) const { return _axis; } + void axis(int32_t axis) { _axis = axis; } + +private: + int32_t _num{0}; + int32_t _axis{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_UNPACK_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpackOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpackOut.h new file mode 100644 index 0000000..6f24578 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleUnpackOut.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_UNPACKOUT_H__ +#define __LUCI_IR_CIRCLE_UNPACKOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLEUNPACKOUT in Circle + */ +class CircleUnpackOut final + : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleUnpackOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{0}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_UNPACKOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleWhere.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhere.h new file mode 100644 index 0000000..51eda3d --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhere.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_WHERE_H__ +#define __LUCI_IR_CIRCLE_WHERE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +#include + +namespace luci +{ + +/** + * @brief WHERE in Circle + */ +class CircleWhere final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleWhere() = default; + +public: + loco::Node *condition() const { return at(0)->node(); } + void condition(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_WHERE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleWhile.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhile.h new file mode 100644 index 0000000..40ec964 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhile.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_WHILE_H__ +#define __LUCI_IR_CIRCLE_WHILE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/VariadicArityNode.h" + +#include + +namespace luci +{ + +/** + * @brief WHILE in Circle + */ +class CircleWhile final : public VariadicArityNode> +{ +public: + CircleWhile(uint32_t arity, uint32_t out) + : VariadicArityNode>(arity), _output_count(out) + { + assert(arity > 0); + assert(out > 0); + + // input and output must have the same size + assert(arity == out); + } + +public: + uint32_t input_count(void) const { return arity(); } + uint32_t output_count(void) const { return _output_count; } + +public: + Node *input(uint32_t index) const { return at(index)->node(); } + void input(uint32_t index, Node *node) { at(index)->node(node); } + +public: + int32_t cond_branch(void) const { return _cond_branch; } + void cond_branch(int32_t cond_branch) { _cond_branch = cond_branch; } + + int32_t body_branch(void) const { return _body_branch; } + void body_branch(int32_t body_branch) { _body_branch = body_branch; } + +public: + loco::Graph *cond_graph(void) const { return _cond_graph; } + void cond_graph(loco::Graph *cond_graph) { _cond_graph = cond_graph; } + + loco::Graph *body_graph(void) const { return _body_graph; } + void body_graph(loco::Graph *body_graph) { _body_graph = body_graph; } + +private: + uint32_t _output_count{0}; + int32_t _cond_branch{-1}; + int32_t _body_branch{-1}; + + loco::Graph *_cond_graph{nullptr}; + loco::Graph *_body_graph{nullptr}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_WHILE_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleWhileOut.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhileOut.h new file mode 100644 index 0000000..cdf6178 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleWhileOut.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_WHILEOUT_H__ +#define __LUCI_IR_CIRCLE_WHILEOUT_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief Virtual CIRCLEWHILEOUT in Circle + */ +class CircleWhileOut final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleWhileOut() = default; + +public: + loco::Node *input(void) const { return at(0)->node(); } + void input(loco::Node *node) { at(0)->node(node); } + +public: + int32_t index(void) const { return _index; } + void index(int32_t index) { _index = index; } + +private: + int32_t _index{-1}; +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_WHILEOUT_H__ diff --git a/compiler/luci/lang/include/luci/IR/Nodes/CircleZerosLike.h b/compiler/luci/lang/include/luci/IR/Nodes/CircleZerosLike.h new file mode 100644 index 0000000..d3b6d27 --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/Nodes/CircleZerosLike.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_CIRCLE_ZEROS_LIKE_H__ +#define __LUCI_IR_CIRCLE_ZEROS_LIKE_H__ + +#include "luci/IR/CircleNodeDecl.h" +#include "luci/IR/CircleOpcode.h" + +#include "luci/IR/LuciNodeMixins.h" + +namespace luci +{ + +/** + * @brief ZEROS_LIKE in Circle + */ +class CircleZerosLike final : public FixedArityNode<1, CircleNodeImpl> +{ +public: + CircleZerosLike() = default; + +public: + /// @brief Get the input node + loco::Node *input(void) const { return at(0)->node(); } + + /// @brief Set the input node + void input(loco::Node *node) { at(0)->node(node); } +}; + +} // namespace luci + +#endif // __LUCI_IR_CIRCLE_ZEROS_LIKE_H__ diff --git a/compiler/luci/lang/include/luci/IR/PropertyShapeStatus.h b/compiler/luci/lang/include/luci/IR/PropertyShapeStatus.h new file mode 100644 index 0000000..179a8ab --- /dev/null +++ b/compiler/luci/lang/include/luci/IR/PropertyShapeStatus.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_IR_PROPERTY_SHAPE_STATUS_H__ +#define __LUCI_IR_PROPERTY_SHAPE_STATUS_H__ + +namespace luci +{ + +/** + * @brief ShapeStatus is to remember circle node shape status. + * @note This is not an attribute from the file but inner status of a node. + * Shape with [] is scalar but sometimes it acts as dynamic shape. + */ +enum class ShapeStatus +{ + UNDEFINED, // Shape status is undefined + + NOSHAPE, // shape is unknown; to distinguish from scalar + VALID, // shape is valid +}; + +} // namespace luci + +#endif // __LUCI_IR_PROPERTY_SHAPE_STATUS_H__ diff --git a/compiler/luci/lang/include/luci/IR/VariadicArityNode.h b/compiler/luci/lang/include/luci/IR/VariadicArityNode.h index a4814ee..e83d909 100644 --- a/compiler/luci/lang/include/luci/IR/VariadicArityNode.h +++ b/compiler/luci/lang/include/luci/IR/VariadicArityNode.h @@ -46,11 +46,7 @@ public: public: uint32_t arity(void) const final { return _args.size(); } - loco::Node *arg(uint32_t n) const final - { - assert(n < _args.size()); - return _args.at(n)->node(); - } + loco::Node *arg(uint32_t n) const final { return _args.at(n)->node(); } void drop(void) final { @@ -62,11 +58,7 @@ public: protected: // This API allows inherited classes to access "_args" field. - loco::Use *at(uint32_t n) const - { - assert(n < _args.size()); - return _args.at(n).get(); - } + loco::Use *at(uint32_t n) const { return _args.at(n).get(); } private: std::vector> _args; diff --git a/compiler/luci/lang/src/CircleDialect.cpp b/compiler/luci/lang/src/CircleDialect.cpp index e1c925d..42ca3c9 100644 --- a/compiler/luci/lang/src/CircleDialect.cpp +++ b/compiler/luci/lang/src/CircleDialect.cpp @@ -22,6 +22,8 @@ #include #include +#include "DeadNodeQueryService.h" + #include #include @@ -42,8 +44,7 @@ struct GiiQueryServiceImpl final : public loco::GraphInputIndexQueryService loco::GraphOutputIndex index(const loco::Node *node) const final { assert(associated(node)); - auto circleinput = dynamic_cast(node); - assert(circleinput != nullptr); + auto circleinput = loco::must_cast(node); return circleinput->index(); } }; @@ -62,8 +63,7 @@ struct GoiQueryServiceImpl final : public loco::GraphOutputIndexQueryService loco::GraphOutputIndex index(const loco::Node *node) const final { assert(associated(node)); - auto circleoutput = dynamic_cast(node); - assert(circleoutput != nullptr); + auto circleoutput = loco::must_cast(node); return circleoutput->index(); } }; @@ -77,6 +77,7 @@ CircleDialect::CircleDialect() { service(std::make_unique()); service(std::make_unique()); + service(std::make_unique()); } loco::Dialect *CircleDialect::get(void) diff --git a/compiler/luci/lang/src/CircleDialect.test.cpp b/compiler/luci/lang/src/CircleDialect.test.cpp index 78221f1..a09c105 100644 --- a/compiler/luci/lang/src/CircleDialect.test.cpp +++ b/compiler/luci/lang/src/CircleDialect.test.cpp @@ -15,6 +15,10 @@ */ #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodes.h" + +#include +#include #include @@ -25,10 +29,59 @@ TEST(CircleDialectTest, get_P) // get() SHOULD return a valid(non-null) pointer ASSERT_NE(d, nullptr); // The return value SHOULD be stable across multiple invocations - ASSERT_EQ(d, luci::CircleDialect::get()); + ASSERT_EQ(luci::CircleDialect::get(), d); } -TEST(CircleDialectTest, get_N) +TEST(CircleDialectTest, check_if_dead_node_service) { - // TBD + /** + * [CircleInput1] [CircleInput2] [CircleInput3] + * \ / (dangling input) + * \ / + * [CircleAdd] [CircleBatchMatMul] + * | (dangling node) + * | + * [CircleOutput1] [CircleOutput2] + * (dangling output) + */ + auto g = loco::make_graph(); + + auto graph_input1 = g->inputs()->create(); + auto circle_input1 = g->nodes()->create(); + circle_input1->index(graph_input1->index()); + + auto graph_input2 = g->inputs()->create(); + auto circle_input2 = g->nodes()->create(); + circle_input2->index(graph_input2->index()); + + // dangling output + auto graph_input3 = g->inputs()->create(); + auto dangling_input = g->nodes()->create(); + dangling_input->index(graph_input3->index()); + + auto active_node = g->nodes()->create(); + active_node->x(circle_input1); + active_node->y(circle_input2); + + auto dangling_node = g->nodes()->create(); + + auto graph_output1 = g->outputs()->create(); + auto circle_output1 = g->nodes()->create(); + circle_output1->index(graph_output1->index()); + circle_output1->from(active_node); + + // dangling output + auto graph_output2 = g->outputs()->create(); + auto circle_output2 = g->nodes()->create(); + circle_output2->index(graph_output2->index()); + + auto service = active_node->dialect()->service(); + + ASSERT_TRUE(service->isDeadNode(dangling_node)); + ASSERT_FALSE(service->isDeadNode(dangling_input)); + ASSERT_FALSE(service->isDeadNode(active_node)); + ASSERT_FALSE(service->isDeadNode(circle_input1)); + ASSERT_FALSE(service->isDeadNode(circle_input2)); + ASSERT_FALSE(service->isDeadNode(circle_output1)); + ASSERT_FALSE(service->isDeadNode(circle_output2)); } diff --git a/compiler/luci/lang/src/CircleNodeShapeDtype.test.cpp b/compiler/luci/lang/src/CircleNodeShapeDtype.test.cpp new file mode 100644 index 0000000..61eab4b --- /dev/null +++ b/compiler/luci/lang/src/CircleNodeShapeDtype.test.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/CircleNodes.h" + +#include + +TEST(CircleNodeShapeDTypeTest, constructor) +{ + luci::CircleAdd node; + + ASSERT_EQ(loco::DataType::Unknown, node.dtype()); + ASSERT_EQ(0, node.rank()); +} + +TEST(CircleNodeShapeDTypeTest, values) +{ + luci::CircleAdd node; + + node.dtype(loco::DataType::FLOAT32); + ASSERT_EQ(loco::DataType::FLOAT32, node.dtype()); + + node.rank(4); + ASSERT_EQ(4, node.rank()); + ASSERT_FALSE(node.dim(0).known()); + + node.dim(0) = loco::Dimension(1); + ASSERT_TRUE(node.dim(0).known()); + ASSERT_EQ(1, node.dim(0).value()); +} + +TEST(CircleNodeShapeDTypeTest, values_NEG) +{ + luci::CircleAdd node; + + node.rank(4); + EXPECT_ANY_THROW(node.dim(100).known()); + EXPECT_ANY_THROW(node.dim(100) = loco::Dimension(1)); +} diff --git a/compiler/luci/lang/src/CircleNodes.cpp b/compiler/luci/lang/src/CircleNodes.cpp index 76ff7ec..c77c068 100644 --- a/compiler/luci/lang/src/CircleNodes.cpp +++ b/compiler/luci/lang/src/CircleNodes.cpp @@ -37,6 +37,7 @@ void set_new_shape(CircleReshape *node, int32_t *base, uint32_t size) const_shape_node->dim(0) = size; const_shape_node->dtype(S32); const_shape_node->size(size); + const_shape_node->shape_status(luci::ShapeStatus::VALID); for (uint32_t axis = 0; axis < size; ++axis) const_shape_node->at(axis) = base[axis]; node->shape(const_shape_node); @@ -47,4 +48,38 @@ void set_new_shape(CircleReshape *node, int32_t *base, uint32_t size) node->newShape()->dim(axis) = base[axis]; } +void link(loco::GraphOutput *output, CircleOutput *node) { node->index(output->index()); } + +CircleOutput *output_node(loco::Graph *g, const loco::GraphOutputIndex &index) +{ + for (uint32_t n = 0; n < g->nodes()->size(); ++n) + { + if (auto output = dynamic_cast(g->nodes()->at(n))) + { + if (output->indexed() && output->index() == index) + { + return output; + } + } + } + return nullptr; +} + +void link(loco::GraphInput *input, CircleInput *node) { node->index(input->index()); } + +CircleInput *input_node(loco::Graph *g, const loco::GraphInputIndex &index) +{ + for (uint32_t n = 0; n < g->nodes()->size(); ++n) + { + if (auto input = dynamic_cast(g->nodes()->at(n))) + { + if (input->indexed() && input->index() == index) + { + return input; + } + } + } + return nullptr; +} + } // namespace luci diff --git a/compiler/luci/lang/src/DeadNodeQueryService.cpp b/compiler/luci/lang/src/DeadNodeQueryService.cpp new file mode 100644 index 0000000..a22574c --- /dev/null +++ b/compiler/luci/lang/src/DeadNodeQueryService.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DeadNodeQueryService.h" + +#include "luci/IR/CircleNodeVisitor.h" + +#include + +namespace luci +{ + +struct VirtualOutputDetector final : public luci::CircleNodeMutableVisitor +{ + bool visit(luci::CircleIfOut *) final { return true; } + bool visit(luci::CircleSplitOut *) final { return true; } + bool visit(luci::CircleSplitVOut *) final { return true; } + bool visit(luci::CircleTopKV2Out *) final { return true; } + bool visit(luci::CircleUnpackOut *) final { return true; } + bool visit(luci::CircleWhileOut *) final { return true; } + // TODO add more nodes that multi output virtual nodes + + // default is false + bool visit(luci::CircleNode *) final { return false; } +}; + +bool DeadNodeQueryServiceImpl::isDeadNode(loco::Node *node) +{ + auto g = node->graph(); + auto input_nodes_vec = loco::input_nodes(g); + auto output_nodes_vec = loco::output_nodes(g); + + auto input_nodes = std::set(input_nodes_vec.begin(), input_nodes_vec.end()); + auto output_nodes = std::set(output_nodes_vec.begin(), output_nodes_vec.end()); + auto active_nodes = loco::active_nodes(output_nodes_vec); + + if (active_nodes.find(node) != active_nodes.end()) + return false; + // input and output nodes are not dead node even if it is not active. + if (input_nodes.find(node) != input_nodes.end()) + return false; + + // if node is one of virtual mulitple outputs, we need to ask the real node + if (auto circle_node = dynamic_cast(node)) + { + VirtualOutputDetector d; + if (circle_node->accept(&d)) + { + assert(node->arity() == 1); + loco::Node *real_node = node->arg(0); + if (active_nodes.find(real_node) != active_nodes.end()) + return false; + if (input_nodes.find(real_node) != input_nodes.end()) + return false; + } + } + + return true; +} + +} // namespace luci diff --git a/compiler/luci/lang/src/DeadNodeQueryService.h b/compiler/luci/lang/src/DeadNodeQueryService.h new file mode 100644 index 0000000..d106966 --- /dev/null +++ b/compiler/luci/lang/src/DeadNodeQueryService.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_LANG_DEADNODEQUERYSERVICE_H__ +#define __LUCI_LANG_DEADNODEQUERYSERVICE_H__ + +#include + +#include + +namespace luci +{ + +struct DeadNodeQueryServiceImpl final : public logo::DeadNodeQueryService +{ + bool isDeadNode(loco::Node *node) final; +}; + +} // namespace luci + +#endif // __LUCI_LANG_DEADNODEQUERYSERVICE_H__ diff --git a/compiler/luci/lang/src/Module.cpp b/compiler/luci/lang/src/Module.cpp index e52d897..80ef619 100644 --- a/compiler/luci/lang/src/Module.cpp +++ b/compiler/luci/lang/src/Module.cpp @@ -43,4 +43,4 @@ loco::Graph *Module::graph(size_t idx) const std::unique_ptr make_module(void) { return std::make_unique(); } -} // namespace loco +} // namespace luci diff --git a/compiler/luci/lang/src/Module.test.cpp b/compiler/luci/lang/src/Module.test.cpp index f603199..26bf073 100644 --- a/compiler/luci/lang/src/Module.test.cpp +++ b/compiler/luci/lang/src/Module.test.cpp @@ -33,8 +33,8 @@ TEST(ModuleTest, add) m->add(std::move(g)); - ASSERT_EQ(m->graph(), g_ptr); - ASSERT_EQ(m->graph(0), g_ptr); + ASSERT_EQ(g_ptr, m->graph()); + ASSERT_EQ(g_ptr, m->graph(0)); } TEST(ModuleTest, add_more) @@ -51,11 +51,11 @@ TEST(ModuleTest, add_more) m->add(std::move(g2)); m->add(std::move(g3)); - ASSERT_EQ(m->size(), 3); - ASSERT_EQ(m->graph(), g1_ptr); - ASSERT_EQ(m->graph(0), g1_ptr); - ASSERT_EQ(m->graph(1), g2_ptr); - ASSERT_EQ(m->graph(2), g3_ptr); + ASSERT_EQ(3, m->size()); + ASSERT_EQ(g1_ptr, m->graph()); + ASSERT_EQ(g1_ptr, m->graph(0)); + ASSERT_EQ(g2_ptr, m->graph(1)); + ASSERT_EQ(g3_ptr, m->graph(2)); } TEST(ModuleTest, add_nullptr_NEG) diff --git a/compiler/luci/lang/src/Nodes/CircleAbs.test.cpp b/compiler/luci/lang/src/Nodes/CircleAbs.test.cpp index 847f150..f97becb 100644 --- a/compiler/luci/lang/src/Nodes/CircleAbs.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleAbs.test.cpp @@ -17,15 +17,78 @@ #include "luci/IR/Nodes/CircleAbs.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include +#include + TEST(CircleAbsTest, constructor) { luci::CircleAbs abs_node; - ASSERT_EQ(abs_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(abs_node.opcode(), luci::CircleOpcode::ABS); + ASSERT_EQ(luci::CircleDialect::get(), abs_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ABS, abs_node.opcode()); + + ASSERT_EQ(nullptr, abs_node.x()); +} + +TEST(CircleAbsTest, common_NEG) +{ + luci::CircleAbs abs_node; + + abs_node.name("name"); + ASSERT_EQ("name", abs_node.name()); + + auto q = std::make_unique(); + abs_node.quantparam(std::move(q)); + ASSERT_NE(nullptr, abs_node.quantparam()); + + ASSERT_EQ(luci::ShapeStatus::UNDEFINED, abs_node.shape_status()); + abs_node.shape_status(luci::ShapeStatus::NOSHAPE); + ASSERT_NE(luci::ShapeStatus::UNDEFINED, abs_node.shape_status()); +} + +TEST(CircleAbsTest, input_NEG) +{ + luci::CircleAbs abs_node; + luci::CircleAbs node; + + abs_node.x(&node); + ASSERT_NE(nullptr, abs_node.x()); + + abs_node.x(nullptr); + ASSERT_EQ(nullptr, abs_node.x()); +} + +TEST(CircleAbsTest, arity_NEG) +{ + luci::CircleAbs abs_node; + + ASSERT_NO_THROW(abs_node.arg(0)); + ASSERT_THROW(abs_node.arg(1), std::out_of_range); +} + +TEST(CircleAbsTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleAbs abs_node; + + TestVisitor tv; + ASSERT_THROW(abs_node.accept(&tv), std::exception); +} + +TEST(CircleAbsTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleAbs abs_node; - ASSERT_EQ(abs_node.x(), nullptr); + TestVisitor tv; + ASSERT_THROW(abs_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleAdd.test.cpp b/compiler/luci/lang/src/Nodes/CircleAdd.test.cpp index a770196..382faa5 100644 --- a/compiler/luci/lang/src/Nodes/CircleAdd.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleAdd.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleAdd.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleAddTest, constructor_P) { luci::CircleAdd add_node; - ASSERT_EQ(add_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(add_node.opcode(), luci::CircleOpcode::ADD); + ASSERT_EQ(luci::CircleDialect::get(), add_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ADD, add_node.opcode()); - ASSERT_EQ(add_node.x(), nullptr); - ASSERT_EQ(add_node.y(), nullptr); + ASSERT_EQ(nullptr, add_node.x()); + ASSERT_EQ(nullptr, add_node.y()); +} + +TEST(CircleAddTest, input_NEG) +{ + luci::CircleAdd add_node; + luci::CircleAdd node; + + add_node.x(&node); + add_node.y(&node); + ASSERT_NE(nullptr, add_node.x()); + ASSERT_NE(nullptr, add_node.y()); + + add_node.x(nullptr); + add_node.y(nullptr); + ASSERT_EQ(nullptr, add_node.x()); + ASSERT_EQ(nullptr, add_node.y()); +} + +TEST(CircleAddTest, arity_NEG) +{ + luci::CircleAdd add_node; + + ASSERT_NO_THROW(add_node.arg(1)); + ASSERT_THROW(add_node.arg(2), std::out_of_range); +} + +TEST(CircleAddTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleAdd add_node; + + TestVisitor tv; + ASSERT_THROW(add_node.accept(&tv), std::exception); +} + +TEST(CircleAddTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleAdd add_node; + + TestVisitor tv; + ASSERT_THROW(add_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleAddN.test.cpp b/compiler/luci/lang/src/Nodes/CircleAddN.test.cpp new file mode 100644 index 0000000..399d8cb --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleAddN.test.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleAddN.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleAddNTest, constructor) +{ + luci::CircleAddN add_node(3); + + ASSERT_EQ(luci::CircleDialect::get(), add_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ADD_N, add_node.opcode()); + + ASSERT_EQ(nullptr, add_node.inputs(0)); + ASSERT_EQ(nullptr, add_node.inputs(1)); + ASSERT_EQ(nullptr, add_node.inputs(2)); +} + +TEST(CircleAddNTest, input_NEG) +{ + luci::CircleAddN add_node(3); + luci::CircleAddN node(2); + + add_node.inputs(0, &node); + add_node.inputs(1, &node); + add_node.inputs(2, &node); + ASSERT_NE(nullptr, add_node.inputs(0)); + ASSERT_NE(nullptr, add_node.inputs(1)); + ASSERT_NE(nullptr, add_node.inputs(2)); + + add_node.inputs(0, nullptr); + add_node.inputs(1, nullptr); + add_node.inputs(2, nullptr); + ASSERT_EQ(nullptr, add_node.inputs(0)); + ASSERT_EQ(nullptr, add_node.inputs(1)); + ASSERT_EQ(nullptr, add_node.inputs(2)); +} + +TEST(CircleAddNTest, arity_NEG) +{ + luci::CircleAddN add_node(3); + luci::CircleAddN node(2); + + ASSERT_NO_THROW(add_node.inputs(2, &node)); + ASSERT_NO_THROW(add_node.inputs(2, nullptr)); + ASSERT_THROW(add_node.inputs(3, &node), std::out_of_range); + + ASSERT_NO_THROW(add_node.arg(2)); + ASSERT_THROW(add_node.arg(3), std::out_of_range); +} + +TEST(CircleAddNTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleAddN add_node(2); + + TestVisitor tv; + ASSERT_THROW(add_node.accept(&tv), std::exception); +} + +TEST(CircleAddNTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleAddN add_node(2); + + TestVisitor tv; + ASSERT_THROW(add_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleArgMax.test.cpp b/compiler/luci/lang/src/Nodes/CircleArgMax.test.cpp index 6b2cff1..375a74c 100644 --- a/compiler/luci/lang/src/Nodes/CircleArgMax.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleArgMax.test.cpp @@ -17,16 +17,65 @@ #include "luci/IR/Nodes/CircleArgMax.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include TEST(CircleArgMaxTest, constructor_P) { - luci::CircleArgMax add_node; + luci::CircleArgMax argmax_node; - ASSERT_EQ(add_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(add_node.opcode(), luci::CircleOpcode::ARG_MAX); + ASSERT_EQ(luci::CircleDialect::get(), argmax_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ARG_MAX, argmax_node.opcode()); - ASSERT_EQ(add_node.input(), nullptr); - ASSERT_EQ(add_node.dimension(), nullptr); + ASSERT_EQ(nullptr, argmax_node.input()); + ASSERT_EQ(nullptr, argmax_node.dimension()); +} + +TEST(CircleArgMaxTest, input_NEG) +{ + luci::CircleArgMax argmax_node; + luci::CircleArgMax node; + + argmax_node.input(&node); + argmax_node.dimension(&node); + ASSERT_NE(nullptr, argmax_node.input()); + ASSERT_NE(nullptr, argmax_node.dimension()); + + argmax_node.input(nullptr); + argmax_node.dimension(nullptr); + ASSERT_EQ(nullptr, argmax_node.input()); + ASSERT_EQ(nullptr, argmax_node.dimension()); +} + +TEST(CircleArgMaxTest, arity_NEG) +{ + luci::CircleArgMax argmax_node; + + ASSERT_NO_THROW(argmax_node.arg(1)); + ASSERT_THROW(argmax_node.arg(2), std::out_of_range); +} + +TEST(CircleArgMaxTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleArgMax argmax_node; + + TestVisitor tv; + ASSERT_THROW(argmax_node.accept(&tv), std::exception); +} + +TEST(CircleArgMaxTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleArgMax argmax_node; + + TestVisitor tv; + ASSERT_THROW(argmax_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleArgMin.test.cpp b/compiler/luci/lang/src/Nodes/CircleArgMin.test.cpp new file mode 100644 index 0000000..6607bf8 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleArgMin.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleArgMin.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleArgMinTest, constructor_P) +{ + luci::CircleArgMin argmin_node; + + ASSERT_EQ(luci::CircleDialect::get(), argmin_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ARG_MIN, argmin_node.opcode()); + + ASSERT_EQ(nullptr, argmin_node.input()); + ASSERT_EQ(nullptr, argmin_node.dimension()); +} + +TEST(CircleArgMinTest, input_NEG) +{ + luci::CircleArgMin argmin_node; + luci::CircleArgMin node; + + argmin_node.input(&node); + argmin_node.dimension(&node); + ASSERT_NE(nullptr, argmin_node.input()); + ASSERT_NE(nullptr, argmin_node.dimension()); + + argmin_node.input(nullptr); + argmin_node.dimension(nullptr); + ASSERT_EQ(nullptr, argmin_node.input()); + ASSERT_EQ(nullptr, argmin_node.dimension()); +} + +TEST(CircleArgMinTest, arity_NEG) +{ + luci::CircleArgMin argmin_node; + + ASSERT_NO_THROW(argmin_node.arg(1)); + ASSERT_THROW(argmin_node.arg(2), std::out_of_range); +} + +TEST(CircleArgMinTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleArgMin argmin_node; + + TestVisitor tv; + ASSERT_THROW(argmin_node.accept(&tv), std::exception); +} + +TEST(CircleArgMinTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleArgMin argmin_node; + + TestVisitor tv; + ASSERT_THROW(argmin_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleAveragePool2D.test.cpp b/compiler/luci/lang/src/Nodes/CircleAveragePool2D.test.cpp new file mode 100644 index 0000000..fc7265c --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleAveragePool2D.test.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleAveragePool2D.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleAveragePool2DTest, constructor_P) +{ + luci::CircleAveragePool2D average_pool_2d_node; + + ASSERT_EQ(luci::CircleDialect::get(), average_pool_2d_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::AVERAGE_POOL_2D, average_pool_2d_node.opcode()); + + ASSERT_EQ(nullptr, average_pool_2d_node.value()); + ASSERT_EQ(luci::Padding::UNDEFINED, average_pool_2d_node.padding()); + ASSERT_EQ(1, average_pool_2d_node.filter()->h()); + ASSERT_EQ(1, average_pool_2d_node.filter()->w()); + ASSERT_EQ(1, average_pool_2d_node.stride()->h()); + ASSERT_EQ(1, average_pool_2d_node.stride()->w()); +} + +TEST(CircleAveragePool2DTest, input_NEG) +{ + luci::CircleAveragePool2D avgpool_node; + luci::CircleAveragePool2D node; + + avgpool_node.value(&node); + ASSERT_NE(nullptr, avgpool_node.value()); + + avgpool_node.value(nullptr); + ASSERT_EQ(nullptr, avgpool_node.value()); + + avgpool_node.filter()->h(2); + avgpool_node.filter()->w(2); + avgpool_node.stride()->h(2); + avgpool_node.stride()->w(2); + ASSERT_NE(1, avgpool_node.filter()->h()); + ASSERT_NE(1, avgpool_node.filter()->w()); + ASSERT_NE(1, avgpool_node.stride()->h()); + ASSERT_NE(1, avgpool_node.stride()->w()); +} + +TEST(CircleAveragePool2DTest, arity_NEG) +{ + luci::CircleAveragePool2D avgpool_node; + + ASSERT_NO_THROW(avgpool_node.arg(0)); + ASSERT_THROW(avgpool_node.arg(1), std::out_of_range); +} + +TEST(CircleAveragePool2DTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleAveragePool2D avgpool_node; + + TestVisitor tv; + ASSERT_THROW(avgpool_node.accept(&tv), std::exception); +} + +TEST(CircleAveragePool2DTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleAveragePool2D avgpool_node; + + TestVisitor tv; + ASSERT_THROW(avgpool_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleBCQFullyConnected.test.cpp b/compiler/luci/lang/src/Nodes/CircleBCQFullyConnected.test.cpp new file mode 100644 index 0000000..35c9ab9 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleBCQFullyConnected.test.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleBCQFullyConnected.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleBCQFullyConnectedTest, constructor) +{ + luci::CircleBCQFullyConnected bcq_FC_node; + + ASSERT_EQ(luci::CircleDialect::get(), bcq_FC_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::BCQ_FULLY_CONNECTED, bcq_FC_node.opcode()); + + ASSERT_EQ(nullptr, bcq_FC_node.input()); + ASSERT_EQ(nullptr, bcq_FC_node.weights_scales()); + ASSERT_EQ(nullptr, bcq_FC_node.weights_binary()); + ASSERT_EQ(nullptr, bcq_FC_node.bias()); + ASSERT_EQ(nullptr, bcq_FC_node.weights_clusters()); + + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, bcq_FC_node.fusedActivationFunction()); + ASSERT_EQ(0, bcq_FC_node.weights_hidden_size()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleBCQGather.test.cpp b/compiler/luci/lang/src/Nodes/CircleBCQGather.test.cpp new file mode 100644 index 0000000..c187a90 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleBCQGather.test.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleBCQGather.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleBCQGatherTest, constructor) +{ + luci::CircleBCQGather bcq_gather_node; + + ASSERT_EQ(luci::CircleDialect::get(), bcq_gather_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::BCQ_GATHER, bcq_gather_node.opcode()); + + ASSERT_EQ(nullptr, bcq_gather_node.input_scales()); + ASSERT_EQ(nullptr, bcq_gather_node.input_binary()); + ASSERT_EQ(nullptr, bcq_gather_node.indices()); + ASSERT_EQ(nullptr, bcq_gather_node.input_clusters()); + + ASSERT_EQ(0, bcq_gather_node.axis()); + ASSERT_EQ(0, bcq_gather_node.input_hidden_size()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleBatchMatMul.test.cpp b/compiler/luci/lang/src/Nodes/CircleBatchMatMul.test.cpp new file mode 100644 index 0000000..d7712c8 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleBatchMatMul.test.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleBatchMatMul.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleBatchMatMulTest, constructor) +{ + luci::CircleBatchMatMul batchmatmul_node; + + ASSERT_EQ(luci::CircleDialect::get(), batchmatmul_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::BATCHMATMUL, batchmatmul_node.opcode()); + + ASSERT_EQ(nullptr, batchmatmul_node.x()); + ASSERT_EQ(nullptr, batchmatmul_node.y()); + + ASSERT_FALSE(batchmatmul_node.adj_x()); + ASSERT_FALSE(batchmatmul_node.adj_y()); +} + +TEST(CircleBatchMatMulTest, input_NEG) +{ + luci::CircleBatchMatMul batchmatmul_node; + luci::CircleBatchMatMul node; + + batchmatmul_node.x(&node); + batchmatmul_node.y(&node); + ASSERT_NE(nullptr, batchmatmul_node.x()); + ASSERT_NE(nullptr, batchmatmul_node.y()); + + batchmatmul_node.x(nullptr); + batchmatmul_node.y(nullptr); + ASSERT_EQ(nullptr, batchmatmul_node.x()); + ASSERT_EQ(nullptr, batchmatmul_node.y()); +} + +TEST(CircleBatchMatMulTest, arity_NEG) +{ + luci::CircleBatchMatMul batchmatmul_node; + + ASSERT_NO_THROW(batchmatmul_node.arg(1)); + ASSERT_THROW(batchmatmul_node.arg(2), std::out_of_range); +} + +TEST(CircleBatchMatMulTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleBatchMatMul batchmatmul_node; + + TestVisitor tv; + ASSERT_THROW(batchmatmul_node.accept(&tv), std::exception); +} + +TEST(CircleBatchMatMulTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleBatchMatMul batchmatmul_node; + + TestVisitor tv; + ASSERT_THROW(batchmatmul_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleBatchToSpaceND.test.cpp b/compiler/luci/lang/src/Nodes/CircleBatchToSpaceND.test.cpp index e995718..0374fe0 100644 --- a/compiler/luci/lang/src/Nodes/CircleBatchToSpaceND.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleBatchToSpaceND.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleBatchToSpaceND.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,10 +25,62 @@ TEST(CircleBatchToSpaceNDTest, constructor) { luci::CircleBatchToSpaceND bts_node; - ASSERT_EQ(bts_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(bts_node.opcode(), luci::CircleOpcode::BATCH_TO_SPACE_ND); + ASSERT_EQ(luci::CircleDialect::get(), bts_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::BATCH_TO_SPACE_ND, bts_node.opcode()); - ASSERT_EQ(bts_node.input(), nullptr); - ASSERT_EQ(bts_node.block_shape(), nullptr); - ASSERT_EQ(bts_node.crops(), nullptr); + ASSERT_EQ(nullptr, bts_node.input()); + ASSERT_EQ(nullptr, bts_node.block_shape()); + ASSERT_EQ(nullptr, bts_node.crops()); +} + +TEST(CircleBatchToSpaceNDTest, input_NEG) +{ + luci::CircleBatchToSpaceND bts_node; + luci::CircleBatchToSpaceND node; + + bts_node.input(&node); + bts_node.block_shape(&node); + bts_node.crops(&node); + ASSERT_NE(nullptr, bts_node.input()); + ASSERT_NE(nullptr, bts_node.block_shape()); + ASSERT_NE(nullptr, bts_node.crops()); + + bts_node.input(nullptr); + bts_node.block_shape(nullptr); + bts_node.crops(nullptr); + ASSERT_EQ(nullptr, bts_node.input()); + ASSERT_EQ(nullptr, bts_node.block_shape()); + ASSERT_EQ(nullptr, bts_node.crops()); +} + +TEST(CircleBatchToSpaceNDTest, arity_NEG) +{ + luci::CircleBatchToSpaceND bts_node; + + ASSERT_NO_THROW(bts_node.arg(2)); + ASSERT_THROW(bts_node.arg(3), std::out_of_range); +} + +TEST(CircleBatchToSpaceNDTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleBatchToSpaceND bts_node; + + TestVisitor tv; + ASSERT_THROW(bts_node.accept(&tv), std::exception); +} + +TEST(CircleBatchToSpaceNDTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleBatchToSpaceND bts_node; + + TestVisitor tv; + ASSERT_THROW(bts_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleCast.test.cpp b/compiler/luci/lang/src/Nodes/CircleCast.test.cpp new file mode 100644 index 0000000..b58bf96 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleCast.test.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleCast.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleCastTest, constructor) +{ + luci::CircleCast cast_node; + + ASSERT_EQ(luci::CircleDialect::get(), cast_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CAST, cast_node.opcode()); + + ASSERT_EQ(nullptr, cast_node.x()); + ASSERT_EQ(loco::DataType::FLOAT32, cast_node.in_data_type()); + ASSERT_EQ(loco::DataType::FLOAT32, cast_node.out_data_type()); +} + +TEST(CircleCastTest, input_NEG) +{ + luci::CircleCast cast_node; + luci::CircleCast node; + + cast_node.x(&node); + ASSERT_NE(nullptr, cast_node.x()); + + cast_node.x(nullptr); + ASSERT_EQ(nullptr, cast_node.x()); +} + +TEST(CircleCastTest, arity_NEG) +{ + luci::CircleCast cast_node; + + ASSERT_NO_THROW(cast_node.arg(0)); + ASSERT_THROW(cast_node.arg(1), std::out_of_range); +} + +TEST(CircleCastTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleCast cast_node; + + TestVisitor tv; + ASSERT_THROW(cast_node.accept(&tv), std::exception); +} + +TEST(CircleCastTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleCast cast_node; + + TestVisitor tv; + ASSERT_THROW(cast_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleCeil.test.cpp b/compiler/luci/lang/src/Nodes/CircleCeil.test.cpp new file mode 100644 index 0000000..efac614 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleCeil.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleCeil.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleCeilTest, constructor) +{ + luci::CircleCeil ceil_node; + + ASSERT_EQ(luci::CircleDialect::get(), ceil_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CEIL, ceil_node.opcode()); + + ASSERT_EQ(nullptr, ceil_node.x()); +} + +TEST(CircleCeilTest, input_NEG) +{ + luci::CircleCeil ceil_node; + luci::CircleCeil node; + + ceil_node.x(&node); + ASSERT_NE(nullptr, ceil_node.x()); + + ceil_node.x(nullptr); + ASSERT_EQ(nullptr, ceil_node.x()); +} + +TEST(CircleCeilTest, arity_NEG) +{ + luci::CircleCeil ceil_node; + + ASSERT_NO_THROW(ceil_node.arg(0)); + ASSERT_THROW(ceil_node.arg(1), std::out_of_range); +} + +TEST(CircleCeilTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleCeil ceil_node; + + TestVisitor tv; + ASSERT_THROW(ceil_node.accept(&tv), std::exception); +} + +TEST(CircleCeilTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleCeil ceil_node; + + TestVisitor tv; + ASSERT_THROW(ceil_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleConcatenation.test.cpp b/compiler/luci/lang/src/Nodes/CircleConcatenation.test.cpp index 7167682..9f219a3 100644 --- a/compiler/luci/lang/src/Nodes/CircleConcatenation.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleConcatenation.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleConcatenation.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,12 +25,60 @@ TEST(CircleConcatenationTest, constructor_P) { luci::CircleConcatenation concat_node(3); - ASSERT_EQ(concat_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(concat_node.opcode(), luci::CircleOpcode::CONCATENATION); + ASSERT_EQ(luci::CircleDialect::get(), concat_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CONCATENATION, concat_node.opcode()); - ASSERT_EQ(concat_node.numValues(), 3); - ASSERT_EQ(concat_node.values(0), nullptr); - ASSERT_EQ(concat_node.values(1), nullptr); - ASSERT_EQ(concat_node.values(2), nullptr); - ASSERT_EQ(concat_node.fusedActivationFunction(), luci::FusedActFunc::UNDEFINED); + ASSERT_EQ(3, concat_node.numValues()); + ASSERT_EQ(nullptr, concat_node.values(0)); + ASSERT_EQ(nullptr, concat_node.values(1)); + ASSERT_EQ(nullptr, concat_node.values(2)); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, concat_node.fusedActivationFunction()); +} + +TEST(CircleConcatenationTest, input_NEG) +{ + luci::CircleConcatenation concat_node(2); + luci::CircleConcatenation node(2); + + concat_node.values(0, &node); + concat_node.values(1, &node); + ASSERT_NE(nullptr, concat_node.values(0)); + ASSERT_NE(nullptr, concat_node.values(1)); + + concat_node.values(0, nullptr); + concat_node.values(1, nullptr); + ASSERT_EQ(nullptr, concat_node.values(0)); + ASSERT_EQ(nullptr, concat_node.values(1)); +} + +TEST(CircleConcatenationTest, arity_NEG) +{ + luci::CircleConcatenation concat_node(5); + + ASSERT_NO_THROW(concat_node.arg(4)); + ASSERT_THROW(concat_node.arg(5), std::out_of_range); +} + +TEST(CircleConcatenationTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleConcatenation concat_node(2); + + TestVisitor tv; + ASSERT_THROW(concat_node.accept(&tv), std::exception); +} + +TEST(CircleConcatenationTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleConcatenation concat_node(2); + + TestVisitor tv; + ASSERT_THROW(concat_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleConst.cpp b/compiler/luci/lang/src/Nodes/CircleConst.cpp index 1c46884..17ff853 100644 --- a/compiler/luci/lang/src/Nodes/CircleConst.cpp +++ b/compiler/luci/lang/src/Nodes/CircleConst.cpp @@ -70,9 +70,12 @@ template typename loco::DataTypeImpl
::Type &CircleConst: template const typename loco::DataTypeImpl
::Type &CircleConst::scalar
(void) const; \ template typename loco::DataTypeImpl
::Type &CircleConst::scalar
(void); +INSTANTIATE(loco::DataType::S64); INSTANTIATE(loco::DataType::S32); +INSTANTIATE(loco::DataType::S16); INSTANTIATE(loco::DataType::FLOAT32); INSTANTIATE(loco::DataType::U8); +INSTANTIATE(loco::DataType::BOOL); #undef INSTANTIATE diff --git a/compiler/luci/lang/src/Nodes/CircleConv2D.test.cpp b/compiler/luci/lang/src/Nodes/CircleConv2D.test.cpp index 7931c7e..7fcc71d 100644 --- a/compiler/luci/lang/src/Nodes/CircleConv2D.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleConv2D.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleConv2D.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,10 +25,84 @@ TEST(CircleConv2Dest, constructor_P) { luci::CircleConv2D conv2d_node; - ASSERT_EQ(conv2d_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(conv2d_node.opcode(), luci::CircleOpcode::CONV_2D); + ASSERT_EQ(luci::CircleDialect::get(), conv2d_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CONV_2D, conv2d_node.opcode()); - ASSERT_EQ(conv2d_node.input(), nullptr); - ASSERT_EQ(conv2d_node.filter(), nullptr); - ASSERT_EQ(conv2d_node.bias(), nullptr); + ASSERT_EQ(nullptr, conv2d_node.input()); + ASSERT_EQ(nullptr, conv2d_node.filter()); + ASSERT_EQ(nullptr, conv2d_node.bias()); + ASSERT_EQ(luci::Padding::UNDEFINED, conv2d_node.padding()); + ASSERT_EQ(1, conv2d_node.stride()->h()); + ASSERT_EQ(1, conv2d_node.stride()->w()); + ASSERT_EQ(1, conv2d_node.dilation()->h()); + ASSERT_EQ(1, conv2d_node.dilation()->w()); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, conv2d_node.fusedActivationFunction()); +} + +TEST(CircleConv2Dest, input_NEG) +{ + luci::CircleConv2D conv2d_node; + luci::CircleConv2D node; + + conv2d_node.input(&node); + conv2d_node.filter(&node); + conv2d_node.bias(&node); + ASSERT_NE(nullptr, conv2d_node.input()); + ASSERT_NE(nullptr, conv2d_node.filter()); + ASSERT_NE(nullptr, conv2d_node.bias()); + + conv2d_node.input(nullptr); + conv2d_node.filter(nullptr); + conv2d_node.bias(nullptr); + ASSERT_EQ(nullptr, conv2d_node.input()); + ASSERT_EQ(nullptr, conv2d_node.filter()); + ASSERT_EQ(nullptr, conv2d_node.bias()); + + conv2d_node.padding(luci::Padding::SAME); + ASSERT_NE(luci::Padding::UNDEFINED, conv2d_node.padding()); + + conv2d_node.stride()->h(2); + conv2d_node.stride()->w(2); + ASSERT_EQ(2, conv2d_node.stride()->h()); + ASSERT_EQ(2, conv2d_node.stride()->w()); + + conv2d_node.dilation()->h(2); + conv2d_node.dilation()->w(2); + ASSERT_EQ(2, conv2d_node.dilation()->h()); + ASSERT_EQ(2, conv2d_node.dilation()->w()); + + conv2d_node.fusedActivationFunction(luci::FusedActFunc::RELU); + ASSERT_NE(luci::FusedActFunc::UNDEFINED, conv2d_node.fusedActivationFunction()); +} + +TEST(CircleConv2Dest, arity_NEG) +{ + luci::CircleConv2D conv2d_node; + + ASSERT_NO_THROW(conv2d_node.arg(2)); + ASSERT_THROW(conv2d_node.arg(3), std::out_of_range); +} + +TEST(CircleConv2Dest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleConv2D conv2d_node; + + TestVisitor tv; + ASSERT_THROW(conv2d_node.accept(&tv), std::exception); +} + +TEST(CircleConv2Dest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleConv2D conv2d_node; + + TestVisitor tv; + ASSERT_THROW(conv2d_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleCos.test.cpp b/compiler/luci/lang/src/Nodes/CircleCos.test.cpp index 34c2cfd..55438d3 100644 --- a/compiler/luci/lang/src/Nodes/CircleCos.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleCos.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleCos.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleCosTest, constructor_P) { luci::CircleCos cos_node; - ASSERT_EQ(cos_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(cos_node.opcode(), luci::CircleOpcode::COS); + ASSERT_EQ(luci::CircleDialect::get(), cos_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::COS, cos_node.opcode()); - ASSERT_EQ(cos_node.x(), nullptr); + ASSERT_EQ(nullptr, cos_node.x()); +} + +TEST(CircleCosTest, input_NEG) +{ + luci::CircleCos cos_node; + luci::CircleCos node; + + cos_node.x(&node); + ASSERT_NE(nullptr, cos_node.x()); + + cos_node.x(nullptr); + ASSERT_EQ(nullptr, cos_node.x()); +} + +TEST(CircleCosTest, arity_NEG) +{ + luci::CircleCos cos_node; + + ASSERT_NO_THROW(cos_node.arg(0)); + ASSERT_THROW(cos_node.arg(1), std::out_of_range); +} + +TEST(CircleCosTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleCos cos_node; + + TestVisitor tv; + ASSERT_THROW(cos_node.accept(&tv), std::exception); +} + +TEST(CircleCosTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleCos cos_node; + + TestVisitor tv; + ASSERT_THROW(cos_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleCustom.test.cpp b/compiler/luci/lang/src/Nodes/CircleCustom.test.cpp new file mode 100644 index 0000000..74ea82c --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleCustom.test.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleCustom.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleCustomTest, constructor) +{ + luci::CircleCustom custom_node(2); + + ASSERT_EQ(luci::CircleDialect::get(), custom_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CUSTOM, custom_node.opcode()); + + ASSERT_EQ(2, custom_node.arity()); + ASSERT_EQ(nullptr, custom_node.arg(0)); + ASSERT_EQ(nullptr, custom_node.arg(1)); + + ASSERT_EQ(2, custom_node.numInputs()); + ASSERT_EQ(0, custom_node.custom_code().size()); +} + +TEST(CircleCustomTest, constructor_NEG) { ASSERT_DEBUG_DEATH(luci::CircleCustom{0}, ""); } + +TEST(CircleCustomTest, invalidIndex_NEG) +{ + luci::CircleCustom custom_node(2); + + EXPECT_ANY_THROW(custom_node.arg(5)); +} diff --git a/compiler/luci/lang/src/Nodes/CircleCustomOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleCustomOut.test.cpp new file mode 100644 index 0000000..8b63f97 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleCustomOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleCustomOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleCustomOutTest, constructor) +{ + luci::CircleCustomOut customout_node; + + ASSERT_EQ(luci::CircleDialect::get(), customout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLECUSTOMOUT, customout_node.opcode()); + + ASSERT_EQ(nullptr, customout_node.input()); + ASSERT_EQ(-1, customout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleDepthToSpace.test.cpp b/compiler/luci/lang/src/Nodes/CircleDepthToSpace.test.cpp new file mode 100644 index 0000000..9e3bbb7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleDepthToSpace.test.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleDepthToSpace.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleDepthToSpaceTest, constructor_P) +{ + luci::CircleDepthToSpace std_node; + + ASSERT_EQ(luci::CircleDialect::get(), std_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::DEPTH_TO_SPACE, std_node.opcode()); + + ASSERT_EQ(nullptr, std_node.input()); + ASSERT_EQ(0, std_node.block_size()); +} + +TEST(CircleDepthToSpaceTest, input_NEG) +{ + luci::CircleDepthToSpace std_node; + luci::CircleDepthToSpace node; + + std_node.input(&node); + ASSERT_NE(nullptr, std_node.input()); + + std_node.input(nullptr); + ASSERT_EQ(nullptr, std_node.input()); + + std_node.block_size(2); + ASSERT_EQ(2, std_node.block_size()); +} + +TEST(CircleDepthToSpaceTest, arity_NEG) +{ + luci::CircleDepthToSpace std_node; + + ASSERT_NO_THROW(std_node.arg(0)); + ASSERT_THROW(std_node.arg(1), std::out_of_range); +} + +TEST(CircleDepthToSpaceTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleDepthToSpace std_node; + + TestVisitor tv; + ASSERT_THROW(std_node.accept(&tv), std::exception); +} + +TEST(CircleDepthToSpaceTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleDepthToSpace std_node; + + TestVisitor tv; + ASSERT_THROW(std_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleDepthwiseConv2D.test.cpp b/compiler/luci/lang/src/Nodes/CircleDepthwiseConv2D.test.cpp index bbc1ea5..5761775 100644 --- a/compiler/luci/lang/src/Nodes/CircleDepthwiseConv2D.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleDepthwiseConv2D.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleDepthwiseConv2D.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,15 +25,85 @@ TEST(CircleDepthwiseConv2DTest, constructor_P) { luci::CircleDepthwiseConv2D dw_conv2d_node; - ASSERT_EQ(dw_conv2d_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(dw_conv2d_node.opcode(), luci::CircleOpcode::DEPTHWISE_CONV_2D); - - ASSERT_EQ(dw_conv2d_node.input(), nullptr); - ASSERT_EQ(dw_conv2d_node.filter(), nullptr); - ASSERT_EQ(dw_conv2d_node.bias(), nullptr); - ASSERT_EQ(dw_conv2d_node.padding(), luci::Padding::UNDEFINED); - ASSERT_EQ(dw_conv2d_node.stride()->h(), 1); - ASSERT_EQ(dw_conv2d_node.stride()->w(), 1); - ASSERT_EQ(dw_conv2d_node.depthMultiplier(), 0); - ASSERT_EQ(dw_conv2d_node.fusedActivationFunction(), luci::FusedActFunc::UNDEFINED); + ASSERT_EQ(luci::CircleDialect::get(), dw_conv2d_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::DEPTHWISE_CONV_2D, dw_conv2d_node.opcode()); + + ASSERT_EQ(nullptr, dw_conv2d_node.input()); + ASSERT_EQ(nullptr, dw_conv2d_node.filter()); + ASSERT_EQ(nullptr, dw_conv2d_node.bias()); + ASSERT_EQ(luci::Padding::UNDEFINED, dw_conv2d_node.padding()); + ASSERT_EQ(1, dw_conv2d_node.stride()->h()); + ASSERT_EQ(1, dw_conv2d_node.stride()->w()); + ASSERT_EQ(1, dw_conv2d_node.dilation()->h()); + ASSERT_EQ(1, dw_conv2d_node.dilation()->w()); + ASSERT_EQ(0, dw_conv2d_node.depthMultiplier()); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, dw_conv2d_node.fusedActivationFunction()); +} + +TEST(CircleDepthwiseConv2DTest, input_NEG) +{ + luci::CircleDepthwiseConv2D dw_conv2d_node; + luci::CircleDepthwiseConv2D node; + + dw_conv2d_node.input(&node); + dw_conv2d_node.filter(&node); + dw_conv2d_node.bias(&node); + ASSERT_NE(nullptr, dw_conv2d_node.input()); + ASSERT_NE(nullptr, dw_conv2d_node.filter()); + ASSERT_NE(nullptr, dw_conv2d_node.bias()); + + dw_conv2d_node.input(nullptr); + dw_conv2d_node.filter(nullptr); + dw_conv2d_node.bias(nullptr); + ASSERT_EQ(nullptr, dw_conv2d_node.input()); + ASSERT_EQ(nullptr, dw_conv2d_node.filter()); + ASSERT_EQ(nullptr, dw_conv2d_node.bias()); + + dw_conv2d_node.padding(luci::Padding::SAME); + ASSERT_NE(luci::Padding::UNDEFINED, dw_conv2d_node.padding()); + + dw_conv2d_node.stride()->h(2); + dw_conv2d_node.stride()->w(2); + ASSERT_EQ(2, dw_conv2d_node.stride()->h()); + ASSERT_EQ(2, dw_conv2d_node.stride()->w()); + + dw_conv2d_node.dilation()->h(2); + dw_conv2d_node.dilation()->w(2); + ASSERT_EQ(2, dw_conv2d_node.dilation()->h()); + ASSERT_EQ(2, dw_conv2d_node.dilation()->w()); + + dw_conv2d_node.fusedActivationFunction(luci::FusedActFunc::RELU); + ASSERT_NE(luci::FusedActFunc::UNDEFINED, dw_conv2d_node.fusedActivationFunction()); +} + +TEST(CircleDepthwiseConv2DTest, arity_NEG) +{ + luci::CircleDepthwiseConv2D dw_conv2d_node; + + ASSERT_NO_THROW(dw_conv2d_node.arg(2)); + ASSERT_THROW(dw_conv2d_node.arg(3), std::out_of_range); +} + +TEST(CircleDepthwiseConv2DTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleDepthwiseConv2D dw_conv2d_node; + + TestVisitor tv; + ASSERT_THROW(dw_conv2d_node.accept(&tv), std::exception); +} + +TEST(CircleDepthwiseConv2DTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleDepthwiseConv2D dw_conv2d_node; + + TestVisitor tv; + ASSERT_THROW(dw_conv2d_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleDiv.test.cpp b/compiler/luci/lang/src/Nodes/CircleDiv.test.cpp index e950cc6..d0b632c 100644 --- a/compiler/luci/lang/src/Nodes/CircleDiv.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleDiv.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleDiv.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleDivTest, constructor_P) { luci::CircleDiv div_node; - ASSERT_EQ(div_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(div_node.opcode(), luci::CircleOpcode::DIV); + ASSERT_EQ(luci::CircleDialect::get(), div_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::DIV, div_node.opcode()); - ASSERT_EQ(div_node.x(), nullptr); - ASSERT_EQ(div_node.y(), nullptr); + ASSERT_EQ(nullptr, div_node.x()); + ASSERT_EQ(nullptr, div_node.y()); +} + +TEST(CircleDivTest, input_NEG) +{ + luci::CircleDiv div_node; + luci::CircleDiv node; + + div_node.x(&node); + div_node.y(&node); + ASSERT_NE(nullptr, div_node.x()); + ASSERT_NE(nullptr, div_node.y()); + + div_node.x(nullptr); + div_node.y(nullptr); + ASSERT_EQ(nullptr, div_node.x()); + ASSERT_EQ(nullptr, div_node.y()); +} + +TEST(CircleDivTest, arity_NEG) +{ + luci::CircleDiv div_node; + + ASSERT_NO_THROW(div_node.arg(1)); + ASSERT_THROW(div_node.arg(2), std::out_of_range); +} + +TEST(CircleDivTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleDiv div_node; + + TestVisitor tv; + ASSERT_THROW(div_node.accept(&tv), std::exception); +} + +TEST(CircleDivTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleDiv div_node; + + TestVisitor tv; + ASSERT_THROW(div_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleElu.test.cpp b/compiler/luci/lang/src/Nodes/CircleElu.test.cpp new file mode 100644 index 0000000..2a044d7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleElu.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleElu.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleEluTest, constructor_P) +{ + luci::CircleElu elu_node; + + ASSERT_EQ(luci::CircleDialect::get(), elu_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ELU, elu_node.opcode()); + + ASSERT_EQ(nullptr, elu_node.features()); +} + +TEST(CircleEluTest, input_NEG) +{ + luci::CircleElu elu_node; + luci::CircleElu node; + + elu_node.features(&node); + ASSERT_NE(nullptr, elu_node.features()); + + elu_node.features(nullptr); + ASSERT_EQ(nullptr, elu_node.features()); +} + +TEST(CircleEluTest, arity_NEG) +{ + luci::CircleElu elu_node; + + ASSERT_NO_THROW(elu_node.arg(0)); + ASSERT_THROW(elu_node.arg(1), std::out_of_range); +} + +TEST(CircleEluTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleElu elu_node; + + TestVisitor tv; + ASSERT_THROW(elu_node.accept(&tv), std::exception); +} + +TEST(CircleEluTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleElu elu_node; + + TestVisitor tv; + ASSERT_THROW(elu_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleEqual.test.cpp b/compiler/luci/lang/src/Nodes/CircleEqual.test.cpp index e2757f0..2ae1529 100644 --- a/compiler/luci/lang/src/Nodes/CircleEqual.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleEqual.test.cpp @@ -17,16 +17,65 @@ #include "luci/IR/Nodes/CircleEqual.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include TEST(CircleEqualTest, constructor_P) { - luci::CircleEqual or_node; + luci::CircleEqual equ_node; - ASSERT_EQ(or_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(or_node.opcode(), luci::CircleOpcode::EQUAL); + ASSERT_EQ(luci::CircleDialect::get(), equ_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::EQUAL, equ_node.opcode()); - ASSERT_EQ(or_node.x(), nullptr); - ASSERT_EQ(or_node.y(), nullptr); + ASSERT_EQ(nullptr, equ_node.x()); + ASSERT_EQ(nullptr, equ_node.y()); +} + +TEST(CircleEqualTest, input_NEG) +{ + luci::CircleEqual equ_node; + luci::CircleEqual node; + + equ_node.x(&node); + equ_node.y(&node); + ASSERT_NE(nullptr, equ_node.x()); + ASSERT_NE(nullptr, equ_node.y()); + + equ_node.x(nullptr); + equ_node.y(nullptr); + ASSERT_EQ(nullptr, equ_node.x()); + ASSERT_EQ(nullptr, equ_node.y()); +} + +TEST(CircleEqualTest, arity_NEG) +{ + luci::CircleEqual equ_node; + + ASSERT_NO_THROW(equ_node.arg(1)); + ASSERT_THROW(equ_node.arg(2), std::out_of_range); +} + +TEST(CircleEqualTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleEqual equ_node; + + TestVisitor tv; + ASSERT_THROW(equ_node.accept(&tv), std::exception); +} + +TEST(CircleEqualTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleEqual equ_node; + + TestVisitor tv; + ASSERT_THROW(equ_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleExp.test.cpp b/compiler/luci/lang/src/Nodes/CircleExp.test.cpp index db10d0b..5ca90e9 100644 --- a/compiler/luci/lang/src/Nodes/CircleExp.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleExp.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleExp.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleExpTest, constructor) { luci::CircleExp exp_node; - ASSERT_EQ(exp_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(exp_node.opcode(), luci::CircleOpcode::EXP); + ASSERT_EQ(luci::CircleDialect::get(), exp_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::EXP, exp_node.opcode()); - ASSERT_EQ(exp_node.x(), nullptr); + ASSERT_EQ(nullptr, exp_node.x()); +} + +TEST(CircleExpTest, input_NEG) +{ + luci::CircleExp exp_node; + luci::CircleExp node; + + exp_node.x(&node); + ASSERT_NE(nullptr, exp_node.x()); + + exp_node.x(nullptr); + ASSERT_EQ(nullptr, exp_node.x()); +} + +TEST(CircleExpTest, arity_NEG) +{ + luci::CircleExp exp_node; + + ASSERT_NO_THROW(exp_node.arg(0)); + ASSERT_THROW(exp_node.arg(1), std::out_of_range); +} + +TEST(CircleExpTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleExp exp_node; + + TestVisitor tv; + ASSERT_THROW(exp_node.accept(&tv), std::exception); +} + +TEST(CircleExpTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleExp exp_node; + + TestVisitor tv; + ASSERT_THROW(exp_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleExpandDims.test.cpp b/compiler/luci/lang/src/Nodes/CircleExpandDims.test.cpp new file mode 100644 index 0000000..754ef01 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleExpandDims.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleExpandDims.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleExpandDimsTest, constructor_P) +{ + luci::CircleExpandDims expand_dims; + + ASSERT_EQ(luci::CircleDialect::get(), expand_dims.dialect()); + ASSERT_EQ(luci::CircleOpcode::EXPAND_DIMS, expand_dims.opcode()); + + ASSERT_EQ(nullptr, expand_dims.input()); + ASSERT_EQ(nullptr, expand_dims.axis()); +} + +TEST(CircleExpandDimsTest, input_NEG) +{ + luci::CircleExpandDims expand_dims; + luci::CircleExpandDims node; + + expand_dims.input(&node); + expand_dims.axis(&node); + ASSERT_NE(nullptr, expand_dims.input()); + ASSERT_NE(nullptr, expand_dims.axis()); + + expand_dims.input(nullptr); + expand_dims.axis(nullptr); + ASSERT_EQ(nullptr, expand_dims.input()); + ASSERT_EQ(nullptr, expand_dims.axis()); +} + +TEST(CircleExpandDimsTest, arity_NEG) +{ + luci::CircleExpandDims expand_dims; + + ASSERT_NO_THROW(expand_dims.arg(1)); + ASSERT_THROW(expand_dims.arg(2), std::out_of_range); +} + +TEST(CircleExpandDimsTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleExpandDims expand_dims; + + TestVisitor tv; + ASSERT_THROW(expand_dims.accept(&tv), std::exception); +} + +TEST(CircleExpandDimsTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleExpandDims expand_dims; + + TestVisitor tv; + ASSERT_THROW(expand_dims.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleFill.test.cpp b/compiler/luci/lang/src/Nodes/CircleFill.test.cpp new file mode 100644 index 0000000..4555da1 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleFill.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleFill.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleFillTest, constructor_P) +{ + luci::CircleFill fill; + + ASSERT_EQ(fill.dialect(), luci::CircleDialect::get()); + ASSERT_EQ(fill.opcode(), luci::CircleOpcode::FILL); + + ASSERT_EQ(nullptr, fill.dims()); + ASSERT_EQ(nullptr, fill.value()); +} + +TEST(CircleFillTest, input_NEG) +{ + luci::CircleFill fill_node; + luci::CircleFill node; + + fill_node.dims(&node); + fill_node.value(&node); + ASSERT_NE(nullptr, fill_node.dims()); + ASSERT_NE(nullptr, fill_node.value()); + + fill_node.dims(nullptr); + fill_node.value(nullptr); + ASSERT_EQ(nullptr, fill_node.dims()); + ASSERT_EQ(nullptr, fill_node.value()); +} + +TEST(CircleFillTest, arity_NEG) +{ + luci::CircleFill fill_node; + + ASSERT_NO_THROW(fill_node.arg(1)); + ASSERT_THROW(fill_node.arg(2), std::out_of_range); +} + +TEST(CircleFillTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleFill fill_node; + + TestVisitor tv; + ASSERT_THROW(fill_node.accept(&tv), std::exception); +} + +TEST(CircleFillTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleFill fill_node; + + TestVisitor tv; + ASSERT_THROW(fill_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleFloor.test.cpp b/compiler/luci/lang/src/Nodes/CircleFloor.test.cpp new file mode 100644 index 0000000..38d38a0 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleFloor.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleFloor.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleFloorTest, constructor) +{ + luci::CircleFloor floor_node; + + ASSERT_EQ(luci::CircleDialect::get(), floor_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::FLOOR, floor_node.opcode()); + + ASSERT_EQ(nullptr, floor_node.x()); +} + +TEST(CircleFloorTest, input_NEG) +{ + luci::CircleFloor floor_node; + luci::CircleFloor node; + + floor_node.x(&node); + ASSERT_NE(nullptr, floor_node.x()); + + floor_node.x(nullptr); + ASSERT_EQ(nullptr, floor_node.x()); +} + +TEST(CircleFloorTest, arity_NEG) +{ + luci::CircleFloor floor_node; + + ASSERT_NO_THROW(floor_node.arg(0)); + ASSERT_THROW(floor_node.arg(1), std::out_of_range); +} + +TEST(CircleFloorTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleFloor floor_node; + + TestVisitor tv; + ASSERT_THROW(floor_node.accept(&tv), std::exception); +} + +TEST(CircleFloorTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleFloor floor_node; + + TestVisitor tv; + ASSERT_THROW(floor_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleFloorDiv.test.cpp b/compiler/luci/lang/src/Nodes/CircleFloorDiv.test.cpp new file mode 100644 index 0000000..6c52eee --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleFloorDiv.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleFloorDiv.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleFloorDivTest, constructor_P) +{ + luci::CircleFloorDiv floordiv_node; + + ASSERT_EQ(luci::CircleDialect::get(), floordiv_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::FLOOR_DIV, floordiv_node.opcode()); + + ASSERT_EQ(nullptr, floordiv_node.x()); + ASSERT_EQ(nullptr, floordiv_node.y()); +} + +TEST(CircleFloorDivTest, input_NEG) +{ + luci::CircleFloorDiv floordiv_node; + luci::CircleFloorDiv node; + + floordiv_node.x(&node); + floordiv_node.y(&node); + ASSERT_NE(nullptr, floordiv_node.x()); + ASSERT_NE(nullptr, floordiv_node.y()); + + floordiv_node.x(nullptr); + floordiv_node.y(nullptr); + ASSERT_EQ(nullptr, floordiv_node.x()); + ASSERT_EQ(nullptr, floordiv_node.y()); +} + +TEST(CircleFloorDivTest, arity_NEG) +{ + luci::CircleFloorDiv floordiv_node; + + ASSERT_NO_THROW(floordiv_node.arg(1)); + ASSERT_THROW(floordiv_node.arg(2), std::out_of_range); +} + +TEST(CircleFloorDivTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleFloorDiv floordiv_node; + + TestVisitor tv; + ASSERT_THROW(floordiv_node.accept(&tv), std::exception); +} + +TEST(CircleFloorDivTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleFloorDiv floordiv_node; + + TestVisitor tv; + ASSERT_THROW(floordiv_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleFloorMod.test.cpp b/compiler/luci/lang/src/Nodes/CircleFloorMod.test.cpp new file mode 100644 index 0000000..c3fa187 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleFloorMod.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleFloorMod.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleFloorModTest, constructor) +{ + luci::CircleFloorMod floormod_node; + + ASSERT_EQ(luci::CircleDialect::get(), floormod_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::FLOOR_MOD, floormod_node.opcode()); + + ASSERT_EQ(nullptr, floormod_node.x()); + ASSERT_EQ(nullptr, floormod_node.y()); +} + +TEST(CircleFloorModTest, input_NEG) +{ + luci::CircleFloorMod floormod_node; + luci::CircleFloorMod node; + + floormod_node.x(&node); + floormod_node.y(&node); + ASSERT_NE(nullptr, floormod_node.x()); + ASSERT_NE(nullptr, floormod_node.y()); + + floormod_node.x(nullptr); + floormod_node.y(nullptr); + ASSERT_EQ(nullptr, floormod_node.x()); + ASSERT_EQ(nullptr, floormod_node.y()); +} + +TEST(CircleFloorModTest, arity_NEG) +{ + luci::CircleFloorMod floormod_node; + + ASSERT_NO_THROW(floormod_node.arg(1)); + ASSERT_THROW(floormod_node.arg(2), std::out_of_range); +} + +TEST(CircleFloorModTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleFloorMod floormod_node; + + TestVisitor tv; + ASSERT_THROW(floormod_node.accept(&tv), std::exception); +} + +TEST(CircleFloorModTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleFloorMod floormod_node; + + TestVisitor tv; + ASSERT_THROW(floormod_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleFullyConnected.test.cpp b/compiler/luci/lang/src/Nodes/CircleFullyConnected.test.cpp index 994dcd2..bb0e3c5 100644 --- a/compiler/luci/lang/src/Nodes/CircleFullyConnected.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleFullyConnected.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleFullyConnected.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,11 +25,66 @@ TEST(CircleFullyConnectedTest, constructor) { luci::CircleFullyConnected fc_node; - ASSERT_EQ(fc_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(fc_node.opcode(), luci::CircleOpcode::FULLY_CONNECTED); + ASSERT_EQ(luci::CircleDialect::get(), fc_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::FULLY_CONNECTED, fc_node.opcode()); - ASSERT_EQ(fc_node.input(), nullptr); - ASSERT_EQ(fc_node.weights(), nullptr); - ASSERT_EQ(fc_node.bias(), nullptr); - ASSERT_EQ(fc_node.fusedActivationFunction(), luci::FusedActFunc::UNDEFINED); + ASSERT_EQ(nullptr, fc_node.input()); + ASSERT_EQ(nullptr, fc_node.weights()); + ASSERT_EQ(nullptr, fc_node.bias()); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, fc_node.fusedActivationFunction()); +} + +TEST(CircleFullyConnectedTest, input_NEG) +{ + luci::CircleFullyConnected fc_node; + luci::CircleFullyConnected node; + + fc_node.input(&node); + fc_node.weights(&node); + fc_node.bias(&node); + ASSERT_NE(nullptr, fc_node.input()); + ASSERT_NE(nullptr, fc_node.weights()); + ASSERT_NE(nullptr, fc_node.bias()); + + fc_node.input(nullptr); + fc_node.weights(nullptr); + fc_node.bias(nullptr); + ASSERT_EQ(nullptr, fc_node.input()); + ASSERT_EQ(nullptr, fc_node.weights()); + ASSERT_EQ(nullptr, fc_node.bias()); + + fc_node.fusedActivationFunction(luci::FusedActFunc::RELU); + ASSERT_NE(luci::FusedActFunc::UNDEFINED, fc_node.fusedActivationFunction()); +} + +TEST(CircleFullyConnectedTest, arity_NEG) +{ + luci::CircleFullyConnected fc_node; + + ASSERT_NO_THROW(fc_node.arg(2)); + ASSERT_THROW(fc_node.arg(3), std::out_of_range); +} + +TEST(CircleFullyConnectedTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleFullyConnected fc_node; + + TestVisitor tv; + ASSERT_THROW(fc_node.accept(&tv), std::exception); +} + +TEST(CircleFullyConnectedTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleFullyConnected fc_node; + + TestVisitor tv; + ASSERT_THROW(fc_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleGather.test.cpp b/compiler/luci/lang/src/Nodes/CircleGather.test.cpp index 4eace9a..5194d6b 100644 --- a/compiler/luci/lang/src/Nodes/CircleGather.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleGather.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleGather.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,10 +25,61 @@ TEST(CircleGatherTest, constructor) { luci::CircleGather gather_node; - ASSERT_EQ(gather_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(gather_node.opcode(), luci::CircleOpcode::GATHER); + ASSERT_EQ(luci::CircleDialect::get(), gather_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::GATHER, gather_node.opcode()); - ASSERT_EQ(gather_node.input(), nullptr); - ASSERT_EQ(gather_node.positions(), nullptr); - ASSERT_EQ(gather_node.axis(), 0); + ASSERT_EQ(nullptr, gather_node.params()); + ASSERT_EQ(nullptr, gather_node.indices()); + ASSERT_EQ(0, gather_node.axis()); +} + +TEST(CircleGatherTest, input_NEG) +{ + luci::CircleGather gather_node; + luci::CircleGather node; + + gather_node.params(&node); + gather_node.indices(&node); + ASSERT_NE(nullptr, gather_node.params()); + ASSERT_NE(nullptr, gather_node.indices()); + + gather_node.params(nullptr); + gather_node.indices(nullptr); + ASSERT_EQ(nullptr, gather_node.params()); + ASSERT_EQ(nullptr, gather_node.indices()); + + gather_node.axis(1); + ASSERT_NE(0, gather_node.axis()); +} + +TEST(CircleGatherTest, arity_NEG) +{ + luci::CircleGather gather_node; + + ASSERT_NO_THROW(gather_node.arg(1)); + ASSERT_THROW(gather_node.arg(2), std::out_of_range); +} + +TEST(CircleGatherTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleGather gather_node; + + TestVisitor tv; + ASSERT_THROW(gather_node.accept(&tv), std::exception); +} + +TEST(CircleGatherTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleGather gather_node; + + TestVisitor tv; + ASSERT_THROW(gather_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleGatherNd.test.cpp b/compiler/luci/lang/src/Nodes/CircleGatherNd.test.cpp new file mode 100644 index 0000000..1402e6e --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleGatherNd.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleGatherNd.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleGatherNdTest, constructor) +{ + luci::CircleGatherNd gather_nd_node; + + ASSERT_EQ(luci::CircleDialect::get(), gather_nd_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::GATHER_ND, gather_nd_node.opcode()); + + ASSERT_EQ(nullptr, gather_nd_node.params()); + ASSERT_EQ(nullptr, gather_nd_node.indices()); +} + +TEST(CircleGatherNdTest, input_NEG) +{ + luci::CircleGatherNd gather_nd_node; + luci::CircleGatherNd node; + + gather_nd_node.params(&node); + gather_nd_node.indices(&node); + ASSERT_NE(nullptr, gather_nd_node.params()); + ASSERT_NE(nullptr, gather_nd_node.indices()); + + gather_nd_node.params(nullptr); + gather_nd_node.indices(nullptr); + ASSERT_EQ(nullptr, gather_nd_node.params()); + ASSERT_EQ(nullptr, gather_nd_node.indices()); +} + +TEST(CircleGatherNdTest, arity_NEG) +{ + luci::CircleGatherNd gather_nd_node; + + ASSERT_NO_THROW(gather_nd_node.arg(1)); + ASSERT_THROW(gather_nd_node.arg(2), std::out_of_range); +} + +TEST(CircleGatherNdTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleGatherNd gather_nd_node; + + TestVisitor tv; + ASSERT_THROW(gather_nd_node.accept(&tv), std::exception); +} + +TEST(CircleGatherNdTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleGatherNd gather_nd_node; + + TestVisitor tv; + ASSERT_THROW(gather_nd_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleGreater.test.cpp b/compiler/luci/lang/src/Nodes/CircleGreater.test.cpp new file mode 100644 index 0000000..9a2b5f9 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleGreater.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleGreater.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleGreaterTest, constructor_P) +{ + luci::CircleGreater greater_node; + + ASSERT_EQ(luci::CircleDialect::get(), greater_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::GREATER, greater_node.opcode()); + + ASSERT_EQ(nullptr, greater_node.x()); + ASSERT_EQ(nullptr, greater_node.y()); +} + +TEST(CircleGreaterTest, input_NEG) +{ + luci::CircleGreater greater_node; + luci::CircleGreater node; + + greater_node.x(&node); + greater_node.y(&node); + ASSERT_NE(nullptr, greater_node.x()); + ASSERT_NE(nullptr, greater_node.y()); + + greater_node.x(nullptr); + greater_node.y(nullptr); + ASSERT_EQ(nullptr, greater_node.x()); + ASSERT_EQ(nullptr, greater_node.y()); +} + +TEST(CircleGreaterTest, arity_NEG) +{ + luci::CircleGreater greater_node; + + ASSERT_NO_THROW(greater_node.arg(1)); + ASSERT_THROW(greater_node.arg(2), std::out_of_range); +} + +TEST(CircleGreaterTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleGreater greater_node; + + TestVisitor tv; + ASSERT_THROW(greater_node.accept(&tv), std::exception); +} + +TEST(CircleGreaterTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleGreater greater_node; + + TestVisitor tv; + ASSERT_THROW(greater_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleGreaterEqual.test.cpp b/compiler/luci/lang/src/Nodes/CircleGreaterEqual.test.cpp new file mode 100644 index 0000000..51c22b7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleGreaterEqual.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleGreaterEqual.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleGreaterEqualTest, constructor_P) +{ + luci::CircleGreaterEqual greater_equal_node; + + ASSERT_EQ(luci::CircleDialect::get(), greater_equal_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::GREATER_EQUAL, greater_equal_node.opcode()); + + ASSERT_EQ(nullptr, greater_equal_node.x()); + ASSERT_EQ(nullptr, greater_equal_node.y()); +} + +TEST(CircleGreaterEqualTest, input_NEG) +{ + luci::CircleGreaterEqual greater_equal_node; + luci::CircleGreaterEqual node; + + greater_equal_node.x(&node); + greater_equal_node.y(&node); + ASSERT_NE(nullptr, greater_equal_node.x()); + ASSERT_NE(nullptr, greater_equal_node.y()); + + greater_equal_node.x(nullptr); + greater_equal_node.y(nullptr); + ASSERT_EQ(nullptr, greater_equal_node.x()); + ASSERT_EQ(nullptr, greater_equal_node.y()); +} + +TEST(CircleGreaterEqualTest, arity_NEG) +{ + luci::CircleGreaterEqual greater_equal_node; + + ASSERT_NO_THROW(greater_equal_node.arg(1)); + ASSERT_THROW(greater_equal_node.arg(2), std::out_of_range); +} + +TEST(CircleGreaterEqualTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleGreaterEqual greater_equal_node; + + TestVisitor tv; + ASSERT_THROW(greater_equal_node.accept(&tv), std::exception); +} + +TEST(CircleGreaterEqualTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleGreaterEqual greater_equal_node; + + TestVisitor tv; + ASSERT_THROW(greater_equal_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleIf.test.cpp b/compiler/luci/lang/src/Nodes/CircleIf.test.cpp new file mode 100644 index 0000000..e3c8c9f --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleIf.test.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleIf.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleIfTest, constructor) +{ + luci::CircleIf if_node(2, 2); + + ASSERT_EQ(luci::CircleDialect::get(), if_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::IF, if_node.opcode()); + + ASSERT_EQ(2, if_node.input_count()); + ASSERT_EQ(2, if_node.output_count()); + + ASSERT_EQ(nullptr, if_node.input(0)); + ASSERT_EQ(nullptr, if_node.input(1)); + + ASSERT_EQ(-1, if_node.then_branch()); + ASSERT_EQ(-1, if_node.else_branch()); +} + +TEST(CircleIfTestDeath, invalid_arity_NEG) +{ + ASSERT_DEBUG_DEATH(luci::CircleIf very_long_name_if_node(0, 1), ""); +} + +TEST(CircleIfTestDeath, invalid_output_count_NEG) +{ + ASSERT_DEBUG_DEATH(luci::CircleIf if_node(2, 0), ""); +} + +TEST(CircleIfTestDeath, invalid_input_get_index_NEG) +{ + luci::CircleIf if_node(2, 2); + + EXPECT_ANY_THROW(if_node.input(100)); +} + +TEST(CircleIfTestDeath, invalid_input_set_index_NEG) +{ + luci::CircleIf if_node(2, 2); + + EXPECT_ANY_THROW(if_node.input(100, nullptr)); +} + +TEST(CircleIfTestDeath, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleIf if_node(2, 2); + + TestVisitor tv; + ASSERT_THROW(if_node.accept(&tv), std::exception); +} + +TEST(CircleIfTestDeath, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleIf if_node(2, 2); + + TestVisitor tv; + ASSERT_THROW(if_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleIfOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleIfOut.test.cpp new file mode 100644 index 0000000..5154b6b --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleIfOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleIfOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleIfOutTest, constructor) +{ + luci::CircleIfOut ifout_node; + + ASSERT_EQ(luci::CircleDialect::get(), ifout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLEIFOUT, ifout_node.opcode()); + + ASSERT_EQ(nullptr, ifout_node.input()); + ASSERT_EQ(-1, ifout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleInstanceNorm.test.cpp b/compiler/luci/lang/src/Nodes/CircleInstanceNorm.test.cpp index b87e817..88a5b8c 100644 --- a/compiler/luci/lang/src/Nodes/CircleInstanceNorm.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleInstanceNorm.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleInstanceNorm.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,12 +25,67 @@ TEST(CircleInstanceNormTest, constructor) { luci::CircleInstanceNorm instance_norm; - ASSERT_EQ(instance_norm.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(instance_norm.opcode(), luci::CircleOpcode::INSTANCE_NORM); + ASSERT_EQ(luci::CircleDialect::get(), instance_norm.dialect()); + ASSERT_EQ(luci::CircleOpcode::INSTANCE_NORM, instance_norm.opcode()); - ASSERT_EQ(instance_norm.input(), nullptr); - ASSERT_EQ(instance_norm.gamma(), nullptr); - ASSERT_EQ(instance_norm.beta(), nullptr); + ASSERT_EQ(nullptr, instance_norm.input()); + ASSERT_EQ(nullptr, instance_norm.gamma()); + ASSERT_EQ(nullptr, instance_norm.beta()); ASSERT_FLOAT_EQ(instance_norm.epsilon(), 1e-05); - ASSERT_EQ(instance_norm.fusedActivationFunction(), luci::FusedActFunc::UNDEFINED); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, instance_norm.fusedActivationFunction()); +} + +TEST(CircleInstanceNormTest, input_NEG) +{ + luci::CircleInstanceNorm instance_norm; + luci::CircleInstanceNorm node; + + instance_norm.input(&node); + instance_norm.gamma(&node); + instance_norm.beta(&node); + ASSERT_NE(nullptr, instance_norm.input()); + ASSERT_NE(nullptr, instance_norm.gamma()); + ASSERT_NE(nullptr, instance_norm.beta()); + + instance_norm.input(nullptr); + instance_norm.gamma(nullptr); + instance_norm.beta(nullptr); + ASSERT_EQ(nullptr, instance_norm.input()); + ASSERT_EQ(nullptr, instance_norm.gamma()); + ASSERT_EQ(nullptr, instance_norm.beta()); + + instance_norm.fusedActivationFunction(luci::FusedActFunc::RELU); + ASSERT_NE(luci::FusedActFunc::UNDEFINED, instance_norm.fusedActivationFunction()); +} + +TEST(CircleInstanceNormTest, arity_NEG) +{ + luci::CircleInstanceNorm instance_norm; + + ASSERT_NO_THROW(instance_norm.arg(2)); + ASSERT_THROW(instance_norm.arg(3), std::out_of_range); +} + +TEST(CircleInstanceNormTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleInstanceNorm instance_norm; + + TestVisitor tv; + ASSERT_THROW(instance_norm.accept(&tv), std::exception); +} + +TEST(CircleInstanceNormTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleInstanceNorm instance_norm; + + TestVisitor tv; + ASSERT_THROW(instance_norm.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleL2Pool2D.test.cpp b/compiler/luci/lang/src/Nodes/CircleL2Pool2D.test.cpp new file mode 100644 index 0000000..cb779ef --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleL2Pool2D.test.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleL2Pool2D.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleL2Pool2DTest, constructor) +{ + luci::CircleL2Pool2D l2pool2d_node; + + ASSERT_EQ(luci::CircleDialect::get(), l2pool2d_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::L2_POOL_2D, l2pool2d_node.opcode()); + + ASSERT_EQ(nullptr, l2pool2d_node.value()); + ASSERT_EQ(1, l2pool2d_node.filter()->h()); + ASSERT_EQ(1, l2pool2d_node.filter()->w()); + ASSERT_EQ(1, l2pool2d_node.stride()->h()); + ASSERT_EQ(1, l2pool2d_node.stride()->w()); + ASSERT_EQ(luci::FusedActFunc::UNDEFINED, l2pool2d_node.fusedActivationFunction()); +} + +TEST(CircleL2Pool2DTest, input_NEG) +{ + luci::CircleL2Pool2D l2pool2d_node; + luci::CircleL2Pool2D node; + + l2pool2d_node.value(&node); + ASSERT_NE(nullptr, l2pool2d_node.value()); + + l2pool2d_node.value(nullptr); + ASSERT_EQ(nullptr, l2pool2d_node.value()); + + l2pool2d_node.stride()->h(2); + l2pool2d_node.stride()->w(2); + ASSERT_EQ(2, l2pool2d_node.stride()->h()); + ASSERT_EQ(2, l2pool2d_node.stride()->w()); + + l2pool2d_node.filter()->h(2); + l2pool2d_node.filter()->w(2); + ASSERT_EQ(2, l2pool2d_node.filter()->h()); + ASSERT_EQ(2, l2pool2d_node.filter()->w()); + + l2pool2d_node.fusedActivationFunction(luci::FusedActFunc::RELU); + ASSERT_NE(luci::FusedActFunc::UNDEFINED, l2pool2d_node.fusedActivationFunction()); +} + +TEST(CircleL2Pool2DTest, arity_NEG) +{ + luci::CircleL2Pool2D l2pool2d_node; + + ASSERT_NO_THROW(l2pool2d_node.arg(0)); + ASSERT_THROW(l2pool2d_node.arg(1), std::out_of_range); +} + +TEST(CircleL2Pool2DTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleL2Pool2D l2pool2d_node; + + TestVisitor tv; + ASSERT_THROW(l2pool2d_node.accept(&tv), std::exception); +} + +TEST(CircleL2Pool2DTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleL2Pool2D l2pool2d_node; + + TestVisitor tv; + ASSERT_THROW(l2pool2d_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLeakyRelu.test.cpp b/compiler/luci/lang/src/Nodes/CircleLeakyRelu.test.cpp new file mode 100644 index 0000000..bacb444 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLeakyRelu.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLeakyRelu.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLeakyReluTest, constructor) +{ + luci::CircleLeakyRelu relu_node; + + ASSERT_EQ(luci::CircleDialect::get(), relu_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LEAKY_RELU, relu_node.opcode()); + + ASSERT_EQ(nullptr, relu_node.features()); + + ASSERT_EQ(0.2f, relu_node.alpha()); +} + +TEST(CircleLeakyReluTest, input_NEG) +{ + luci::CircleLeakyRelu relu_node; + luci::CircleLeakyRelu node; + + relu_node.features(&node); + ASSERT_NE(nullptr, relu_node.features()); + + relu_node.features(nullptr); + ASSERT_EQ(nullptr, relu_node.features()); + + relu_node.alpha(1.2f); + ASSERT_NE(0.2f, relu_node.alpha()); +} + +TEST(CircleLeakyReluTest, arity_NEG) +{ + luci::CircleLeakyRelu relu_node; + + ASSERT_NO_THROW(relu_node.arg(0)); + ASSERT_THROW(relu_node.arg(1), std::out_of_range); +} + +TEST(CircleLeakyReluTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLeakyRelu relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); +} + +TEST(CircleLeakyReluTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLeakyRelu relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLess.test.cpp b/compiler/luci/lang/src/Nodes/CircleLess.test.cpp new file mode 100644 index 0000000..ec454df --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLess.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLess.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLessTest, constructor_P) +{ + luci::CircleLess less_node; + + ASSERT_EQ(luci::CircleDialect::get(), less_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LESS, less_node.opcode()); + + ASSERT_EQ(nullptr, less_node.x()); + ASSERT_EQ(nullptr, less_node.y()); +} + +TEST(CircleLessTest, input_NEG) +{ + luci::CircleLess less_node; + luci::CircleLess node; + + less_node.x(&node); + less_node.y(&node); + ASSERT_NE(nullptr, less_node.x()); + ASSERT_NE(nullptr, less_node.y()); + + less_node.x(nullptr); + less_node.y(nullptr); + ASSERT_EQ(nullptr, less_node.x()); + ASSERT_EQ(nullptr, less_node.y()); +} + +TEST(CircleLessTest, arity_NEG) +{ + luci::CircleLess less_node; + + ASSERT_NO_THROW(less_node.arg(1)); + ASSERT_THROW(less_node.arg(2), std::out_of_range); +} + +TEST(CircleLessTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLess less_node; + + TestVisitor tv; + ASSERT_THROW(less_node.accept(&tv), std::exception); +} + +TEST(CircleLessTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLess less_node; + + TestVisitor tv; + ASSERT_THROW(less_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLessEqual.test.cpp b/compiler/luci/lang/src/Nodes/CircleLessEqual.test.cpp new file mode 100644 index 0000000..baa9202 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLessEqual.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLessEqual.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLessEqualTest, constructor_P) +{ + luci::CircleLessEqual less_equal_node; + + ASSERT_EQ(luci::CircleDialect::get(), less_equal_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LESS_EQUAL, less_equal_node.opcode()); + + ASSERT_EQ(nullptr, less_equal_node.x()); + ASSERT_EQ(nullptr, less_equal_node.y()); +} + +TEST(CircleLessEqualTest, input_NEG) +{ + luci::CircleLessEqual less_equal_node; + luci::CircleLessEqual node; + + less_equal_node.x(&node); + less_equal_node.y(&node); + ASSERT_NE(nullptr, less_equal_node.x()); + ASSERT_NE(nullptr, less_equal_node.y()); + + less_equal_node.x(nullptr); + less_equal_node.y(nullptr); + ASSERT_EQ(nullptr, less_equal_node.x()); + ASSERT_EQ(nullptr, less_equal_node.y()); +} + +TEST(CircleLessEqualTest, arity_NEG) +{ + luci::CircleLessEqual less_equal_node; + + ASSERT_NO_THROW(less_equal_node.arg(1)); + ASSERT_THROW(less_equal_node.arg(2), std::out_of_range); +} + +TEST(CircleLessEqualTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLessEqual less_equal_node; + + TestVisitor tv; + ASSERT_THROW(less_equal_node.accept(&tv), std::exception); +} + +TEST(CircleLessEqualTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLessEqual less_equal_node; + + TestVisitor tv; + ASSERT_THROW(less_equal_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLocalResponseNormalization.test.cpp b/compiler/luci/lang/src/Nodes/CircleLocalResponseNormalization.test.cpp new file mode 100644 index 0000000..1b1bf67 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLocalResponseNormalization.test.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLocalResponseNormalization.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLocalResponseNormalizationTest, constructor_P) +{ + luci::CircleLocalResponseNormalization local_response_normalization_node; + + ASSERT_EQ(luci::CircleDialect::get(), local_response_normalization_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOCAL_RESPONSE_NORMALIZATION, + local_response_normalization_node.opcode()); + + ASSERT_EQ(nullptr, local_response_normalization_node.input()); + ASSERT_EQ(5, local_response_normalization_node.radius()); + ASSERT_EQ(1.0f, local_response_normalization_node.bias()); + ASSERT_EQ(1.0f, local_response_normalization_node.alpha()); + ASSERT_EQ(0.5f, local_response_normalization_node.beta()); +} + +TEST(CircleLocalResponseNormalizationTest, input_NEG) +{ + luci::CircleLocalResponseNormalization local_response_normalization_node; + luci::CircleLocalResponseNormalization node; + + local_response_normalization_node.input(&node); + ASSERT_NE(nullptr, local_response_normalization_node.input()); + + local_response_normalization_node.input(nullptr); + ASSERT_EQ(nullptr, local_response_normalization_node.input()); + + local_response_normalization_node.radius(100); + local_response_normalization_node.bias(100.0f); + local_response_normalization_node.alpha(100.0f); + local_response_normalization_node.beta(100.0f); + ASSERT_NE(5, local_response_normalization_node.radius()); + ASSERT_NE(1.0f, local_response_normalization_node.bias()); + ASSERT_NE(1.0f, local_response_normalization_node.alpha()); + ASSERT_NE(0.5f, local_response_normalization_node.beta()); +} + +TEST(CircleLocalResponseNormalizationTest, arity_NEG) +{ + luci::CircleLocalResponseNormalization local_response_normalization_node; + + ASSERT_NO_THROW(local_response_normalization_node.arg(0)); + ASSERT_THROW(local_response_normalization_node.arg(1), std::out_of_range); +} + +TEST(CircleLocalResponseNormalizationTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLocalResponseNormalization local_response_normalization_node; + + TestVisitor tv; + ASSERT_THROW(local_response_normalization_node.accept(&tv), std::exception); +} + +TEST(CircleLocalResponseNormalizationTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLocalResponseNormalization local_response_normalization_node; + + TestVisitor tv; + ASSERT_THROW(local_response_normalization_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLog.test.cpp b/compiler/luci/lang/src/Nodes/CircleLog.test.cpp new file mode 100644 index 0000000..0bb9ee7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLog.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLog.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLogTest, constructor) +{ + luci::CircleLog log_node; + + ASSERT_EQ(luci::CircleDialect::get(), log_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOG, log_node.opcode()); + + ASSERT_EQ(nullptr, log_node.x()); +} + +TEST(CircleLogTest, input_NEG) +{ + luci::CircleLog log_node; + luci::CircleLog node; + + log_node.x(&node); + ASSERT_NE(nullptr, log_node.x()); + + log_node.x(nullptr); + ASSERT_EQ(nullptr, log_node.x()); +} + +TEST(CircleLogTest, arity_NEG) +{ + luci::CircleLog log_node; + + ASSERT_NO_THROW(log_node.arg(0)); + ASSERT_THROW(log_node.arg(1), std::out_of_range); +} + +TEST(CircleLogTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLog log_node; + + TestVisitor tv; + ASSERT_THROW(log_node.accept(&tv), std::exception); +} + +TEST(CircleLogTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLog log_node; + + TestVisitor tv; + ASSERT_THROW(log_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLogSoftmax.test.cpp b/compiler/luci/lang/src/Nodes/CircleLogSoftmax.test.cpp new file mode 100644 index 0000000..70977ae --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLogSoftmax.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLogSoftmax.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLogSoftmaxTest, constructor) +{ + luci::CircleLogSoftmax log_softmax_node; + + ASSERT_EQ(luci::CircleDialect::get(), log_softmax_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOG_SOFTMAX, log_softmax_node.opcode()); + + ASSERT_EQ(nullptr, log_softmax_node.logits()); +} + +TEST(CircleLogSoftmaxTest, input_NEG) +{ + luci::CircleLogSoftmax log_softmax_node; + luci::CircleLogSoftmax node; + + log_softmax_node.logits(&node); + ASSERT_NE(nullptr, log_softmax_node.logits()); + + log_softmax_node.logits(nullptr); + ASSERT_EQ(nullptr, log_softmax_node.logits()); +} + +TEST(CircleLogSoftmaxTest, arity_NEG) +{ + luci::CircleLogSoftmax log_softmax_node; + + ASSERT_NO_THROW(log_softmax_node.arg(0)); + ASSERT_THROW(log_softmax_node.arg(1), std::out_of_range); +} + +TEST(CircleLogSoftmaxTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLogSoftmax log_softmax_node; + + TestVisitor tv; + ASSERT_THROW(log_softmax_node.accept(&tv), std::exception); +} + +TEST(CircleLogSoftmaxTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLogSoftmax log_softmax_node; + + TestVisitor tv; + ASSERT_THROW(log_softmax_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLogicalAnd.test.cpp b/compiler/luci/lang/src/Nodes/CircleLogicalAnd.test.cpp new file mode 100644 index 0000000..db378f0 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLogicalAnd.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLogicalAnd.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLogicalAndTest, constructor_P) +{ + luci::CircleLogicalAnd and_node; + + ASSERT_EQ(luci::CircleDialect::get(), and_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOGICAL_AND, and_node.opcode()); + + ASSERT_EQ(nullptr, and_node.x()); + ASSERT_EQ(nullptr, and_node.y()); +} + +TEST(CircleLogicalAndTest, input_NEG) +{ + luci::CircleLogicalAnd and_node; + luci::CircleLogicalAnd node; + + and_node.x(&node); + and_node.y(&node); + ASSERT_NE(nullptr, and_node.x()); + ASSERT_NE(nullptr, and_node.y()); + + and_node.x(nullptr); + and_node.y(nullptr); + ASSERT_EQ(nullptr, and_node.x()); + ASSERT_EQ(nullptr, and_node.y()); +} + +TEST(CircleLogicalAndTest, arity_NEG) +{ + luci::CircleLogicalAnd and_node; + + ASSERT_NO_THROW(and_node.arg(1)); + ASSERT_THROW(and_node.arg(2), std::out_of_range); +} + +TEST(CircleLogicalAndTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLogicalAnd and_node; + + TestVisitor tv; + ASSERT_THROW(and_node.accept(&tv), std::exception); +} + +TEST(CircleLogicalAndTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLogicalAnd and_node; + + TestVisitor tv; + ASSERT_THROW(and_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleLogicalNot.test.cpp b/compiler/luci/lang/src/Nodes/CircleLogicalNot.test.cpp index 360dd47..0c2c029 100644 --- a/compiler/luci/lang/src/Nodes/CircleLogicalNot.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleLogicalNot.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleLogicalNot.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleLogicalNotTest, constructor_P) { luci::CircleLogicalNot not_node; - ASSERT_EQ(not_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(not_node.opcode(), luci::CircleOpcode::LOGICAL_NOT); + ASSERT_EQ(luci::CircleDialect::get(), not_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOGICAL_NOT, not_node.opcode()); - ASSERT_EQ(not_node.x(), nullptr); + ASSERT_EQ(nullptr, not_node.x()); +} + +TEST(CircleLogicalNotTest, input_NEG) +{ + luci::CircleLogicalNot not_node; + luci::CircleLogicalNot node; + + not_node.x(&node); + ASSERT_NE(nullptr, not_node.x()); + + not_node.x(nullptr); + ASSERT_EQ(nullptr, not_node.x()); +} + +TEST(CircleLogicalNotTest, arity_NEG) +{ + luci::CircleLogicalNot not_node; + + ASSERT_NO_THROW(not_node.arg(0)); + ASSERT_THROW(not_node.arg(1), std::out_of_range); +} + +TEST(CircleLogicalNotTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLogicalNot not_node; + + TestVisitor tv; + ASSERT_THROW(not_node.accept(&tv), std::exception); +} + +TEST(CircleLogicalNotTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLogicalNot not_node; + + TestVisitor tv; + ASSERT_THROW(not_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleLogicalOr.test.cpp b/compiler/luci/lang/src/Nodes/CircleLogicalOr.test.cpp index 039db4a..a08b863 100644 --- a/compiler/luci/lang/src/Nodes/CircleLogicalOr.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleLogicalOr.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleLogicalOr.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleLogicalOrTest, constructor_P) { luci::CircleLogicalOr or_node; - ASSERT_EQ(or_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(or_node.opcode(), luci::CircleOpcode::LOGICAL_OR); + ASSERT_EQ(luci::CircleDialect::get(), or_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOGICAL_OR, or_node.opcode()); - ASSERT_EQ(or_node.x(), nullptr); - ASSERT_EQ(or_node.y(), nullptr); + ASSERT_EQ(nullptr, or_node.x()); + ASSERT_EQ(nullptr, or_node.y()); +} + +TEST(CircleLogicalOrTest, input_NEG) +{ + luci::CircleLogicalOr or_node; + luci::CircleLogicalOr node; + + or_node.x(&node); + or_node.y(&node); + ASSERT_NE(nullptr, or_node.x()); + ASSERT_NE(nullptr, or_node.y()); + + or_node.x(nullptr); + or_node.y(nullptr); + ASSERT_EQ(nullptr, or_node.x()); + ASSERT_EQ(nullptr, or_node.y()); +} + +TEST(CircleLogicalOrTest, arity_NEG) +{ + luci::CircleLogicalOr or_node; + + ASSERT_NO_THROW(or_node.arg(1)); + ASSERT_THROW(or_node.arg(2), std::out_of_range); +} + +TEST(CircleLogicalOrTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLogicalOr or_node; + + TestVisitor tv; + ASSERT_THROW(or_node.accept(&tv), std::exception); +} + +TEST(CircleLogicalOrTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLogicalOr or_node; + + TestVisitor tv; + ASSERT_THROW(or_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleLogistic.test.cpp b/compiler/luci/lang/src/Nodes/CircleLogistic.test.cpp new file mode 100644 index 0000000..18efd86 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleLogistic.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleLogistic.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleLogisticTest, constructor) +{ + luci::CircleLogistic logistic_node; + + ASSERT_EQ(luci::CircleDialect::get(), logistic_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::LOGISTIC, logistic_node.opcode()); + + ASSERT_EQ(nullptr, logistic_node.x()); +} + +TEST(CircleLogisticTest, input_NEG) +{ + luci::CircleLogistic logistic_node; + luci::CircleLogistic node; + + logistic_node.x(&node); + ASSERT_NE(nullptr, logistic_node.x()); + + logistic_node.x(nullptr); + ASSERT_EQ(nullptr, logistic_node.x()); +} + +TEST(CircleLogisticTest, arity_NEG) +{ + luci::CircleLogistic logistic_node; + + ASSERT_NO_THROW(logistic_node.arg(0)); + ASSERT_THROW(logistic_node.arg(1), std::out_of_range); +} + +TEST(CircleLogisticTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleLogistic logistic_node; + + TestVisitor tv; + ASSERT_THROW(logistic_node.accept(&tv), std::exception); +} + +TEST(CircleLogisticTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleLogistic logistic_node; + + TestVisitor tv; + ASSERT_THROW(logistic_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMatrixDiag.test.cpp b/compiler/luci/lang/src/Nodes/CircleMatrixDiag.test.cpp new file mode 100644 index 0000000..9209cf1 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleMatrixDiag.test.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleMatrixDiag.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleMatrixDiagTest, constructor_P) +{ + luci::CircleMatrixDiag matrix_diag_node; + + ASSERT_EQ(luci::CircleDialect::get(), matrix_diag_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MATRIX_DIAG, matrix_diag_node.opcode()); + + ASSERT_EQ(nullptr, matrix_diag_node.diagonal()); +} + +TEST(CircleMatrixDiagTest, input_NEG) +{ + luci::CircleMatrixDiag matrix_diag_node; + luci::CircleMatrixDiag node; + + matrix_diag_node.diagonal(&node); + + ASSERT_NE(nullptr, matrix_diag_node.diagonal()); + + matrix_diag_node.diagonal(nullptr); + + ASSERT_EQ(nullptr, matrix_diag_node.diagonal()); +} + +TEST(CircleMatrixDiagTest, arity_NEG) +{ + luci::CircleMatrixDiag matrix_diag_node; + + ASSERT_NO_THROW(matrix_diag_node.arg(0)); + ASSERT_THROW(matrix_diag_node.arg(1), std::out_of_range); +} + +TEST(CircleMatrixDiagTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMatrixDiag matrix_diag_node; + + TestVisitor tv; + ASSERT_THROW(matrix_diag_node.accept(&tv), std::exception); +} + +TEST(CircleMatrixDiagTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMatrixDiag matrix_diag_node; + + TestVisitor tv; + ASSERT_THROW(matrix_diag_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMatrixSetDiag.test.cpp b/compiler/luci/lang/src/Nodes/CircleMatrixSetDiag.test.cpp new file mode 100644 index 0000000..9dea985 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleMatrixSetDiag.test.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleMatrixSetDiag.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleMatrixSetDiagTest, constructor_P) +{ + luci::CircleMatrixSetDiag matrix_set_diag_node; + + ASSERT_EQ(luci::CircleDialect::get(), matrix_set_diag_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MATRIX_SET_DIAG, matrix_set_diag_node.opcode()); + + ASSERT_EQ(nullptr, matrix_set_diag_node.input()); + ASSERT_EQ(nullptr, matrix_set_diag_node.diagonal()); +} + +TEST(CircleMatrixSetDiagTest, input_NEG) +{ + luci::CircleMatrixSetDiag matrix_set_diag_node; + luci::CircleMatrixSetDiag node; + + matrix_set_diag_node.input(&node); + matrix_set_diag_node.diagonal(&node); + + ASSERT_NE(nullptr, matrix_set_diag_node.input()); + ASSERT_NE(nullptr, matrix_set_diag_node.diagonal()); + + matrix_set_diag_node.input(nullptr); + matrix_set_diag_node.diagonal(nullptr); + + ASSERT_EQ(nullptr, matrix_set_diag_node.input()); + ASSERT_EQ(nullptr, matrix_set_diag_node.diagonal()); +} + +TEST(CircleMatrixSetDiagTest, arity_NEG) +{ + luci::CircleMatrixSetDiag matrix_set_diag_node; + + ASSERT_NO_THROW(matrix_set_diag_node.arg(0)); + ASSERT_NO_THROW(matrix_set_diag_node.arg(1)); + ASSERT_THROW(matrix_set_diag_node.arg(2), std::out_of_range); +} + +TEST(CircleMatrixSetDiagTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMatrixSetDiag matrix_set_diag_node; + + TestVisitor tv; + ASSERT_THROW(matrix_set_diag_node.accept(&tv), std::exception); +} + +TEST(CircleMatrixSetDiagTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMatrixSetDiag matrix_set_diag_node; + + TestVisitor tv; + ASSERT_THROW(matrix_set_diag_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMaxPool2D.test.cpp b/compiler/luci/lang/src/Nodes/CircleMaxPool2D.test.cpp index 874ecec..cb6c016 100644 --- a/compiler/luci/lang/src/Nodes/CircleMaxPool2D.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleMaxPool2D.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleMaxPool2D.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,10 +25,66 @@ TEST(CircleMaxPool2DTest, constructor_P) { luci::CircleMaxPool2D maxpool2d_node; - ASSERT_EQ(maxpool2d_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(maxpool2d_node.opcode(), luci::CircleOpcode::MAX_POOL_2D); + ASSERT_EQ(luci::CircleDialect::get(), maxpool2d_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MAX_POOL_2D, maxpool2d_node.opcode()); - ASSERT_EQ(maxpool2d_node.value(), nullptr); - ASSERT_NE(maxpool2d_node.filter(), nullptr); - ASSERT_NE(maxpool2d_node.stride(), nullptr); + ASSERT_EQ(nullptr, maxpool2d_node.value()); + ASSERT_EQ(luci::Padding::UNDEFINED, maxpool2d_node.padding()); + ASSERT_EQ(1, maxpool2d_node.filter()->h()); + ASSERT_EQ(1, maxpool2d_node.filter()->w()); + ASSERT_EQ(1, maxpool2d_node.stride()->h()); + ASSERT_EQ(1, maxpool2d_node.stride()->w()); +} + +TEST(CircleMaxPool2DTest, input_NEG) +{ + luci::CircleMaxPool2D maxpool2d_node; + luci::CircleMaxPool2D node; + + maxpool2d_node.value(&node); + ASSERT_NE(nullptr, maxpool2d_node.value()); + + maxpool2d_node.value(nullptr); + ASSERT_EQ(nullptr, maxpool2d_node.value()); + + maxpool2d_node.filter()->h(2); + maxpool2d_node.filter()->w(2); + maxpool2d_node.stride()->h(2); + maxpool2d_node.stride()->w(2); + ASSERT_NE(1, maxpool2d_node.filter()->h()); + ASSERT_NE(1, maxpool2d_node.filter()->w()); + ASSERT_NE(1, maxpool2d_node.stride()->h()); + ASSERT_NE(1, maxpool2d_node.stride()->w()); +} + +TEST(CircleMaxPool2DTest, arity_NEG) +{ + luci::CircleMaxPool2D maxpool2d_node; + + ASSERT_NO_THROW(maxpool2d_node.arg(0)); + ASSERT_THROW(maxpool2d_node.arg(1), std::out_of_range); +} + +TEST(CircleMaxPool2DTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMaxPool2D maxpool2d_node; + + TestVisitor tv; + ASSERT_THROW(maxpool2d_node.accept(&tv), std::exception); +} + +TEST(CircleMaxPool2DTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMaxPool2D maxpool2d_node; + + TestVisitor tv; + ASSERT_THROW(maxpool2d_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleMaximum.test.cpp b/compiler/luci/lang/src/Nodes/CircleMaximum.test.cpp index efe62f1..3fc6f11 100644 --- a/compiler/luci/lang/src/Nodes/CircleMaximum.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleMaximum.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleMaximum.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleMaximumTest, constructor_P) { luci::CircleMaximum max_node; - ASSERT_EQ(max_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(max_node.opcode(), luci::CircleOpcode::MAXIMUM); + ASSERT_EQ(luci::CircleDialect::get(), max_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MAXIMUM, max_node.opcode()); - ASSERT_EQ(max_node.x(), nullptr); - ASSERT_EQ(max_node.y(), nullptr); + ASSERT_EQ(nullptr, max_node.x()); + ASSERT_EQ(nullptr, max_node.y()); +} + +TEST(CircleMaximumTest, input_NEG) +{ + luci::CircleMaximum max_node; + luci::CircleMaximum node; + + max_node.x(&node); + max_node.y(&node); + ASSERT_NE(nullptr, max_node.x()); + ASSERT_NE(nullptr, max_node.y()); + + max_node.x(nullptr); + max_node.y(nullptr); + ASSERT_EQ(nullptr, max_node.x()); + ASSERT_EQ(nullptr, max_node.y()); +} + +TEST(CircleMaximumTest, arity_NEG) +{ + luci::CircleMaximum max_node; + + ASSERT_NO_THROW(max_node.arg(1)); + ASSERT_THROW(max_node.arg(2), std::out_of_range); +} + +TEST(CircleMaximumTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMaximum max_node; + + TestVisitor tv; + ASSERT_THROW(max_node.accept(&tv), std::exception); +} + +TEST(CircleMaximumTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMaximum max_node; + + TestVisitor tv; + ASSERT_THROW(max_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleMean.test.cpp b/compiler/luci/lang/src/Nodes/CircleMean.test.cpp new file mode 100644 index 0000000..7430639 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleMean.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleMean.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleMeanTest, constructor) +{ + luci::CircleMean mean_node; + + ASSERT_EQ(luci::CircleDialect::get(), mean_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MEAN, mean_node.opcode()); + + ASSERT_EQ(nullptr, mean_node.input()); + ASSERT_EQ(nullptr, mean_node.reduction_indices()); + + ASSERT_FALSE(mean_node.keep_dims()); +} + +TEST(CircleMeanTest, input_NEG) +{ + luci::CircleMean mean_node; + luci::CircleMean node; + + mean_node.input(&node); + mean_node.reduction_indices(&node); + ASSERT_NE(nullptr, mean_node.input()); + ASSERT_NE(nullptr, mean_node.reduction_indices()); + + mean_node.input(nullptr); + mean_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, mean_node.input()); + ASSERT_EQ(nullptr, mean_node.reduction_indices()); + + mean_node.keep_dims(true); + ASSERT_TRUE(mean_node.keep_dims()); +} + +TEST(CircleMeanTest, arity_NEG) +{ + luci::CircleMean mean_node; + + ASSERT_NO_THROW(mean_node.arg(1)); + ASSERT_THROW(mean_node.arg(2), std::out_of_range); +} + +TEST(CircleMeanTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMean mean_node; + + TestVisitor tv; + ASSERT_THROW(mean_node.accept(&tv), std::exception); +} + +TEST(CircleMeanTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMean mean_node; + + TestVisitor tv; + ASSERT_THROW(mean_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMinimum.test.cpp b/compiler/luci/lang/src/Nodes/CircleMinimum.test.cpp new file mode 100644 index 0000000..19fe69f --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleMinimum.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleMinimum.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleMinimumTest, constructor_P) +{ + luci::CircleMinimum min_node; + + ASSERT_EQ(luci::CircleDialect::get(), min_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MINIMUM, min_node.opcode()); + + ASSERT_EQ(nullptr, min_node.x()); + ASSERT_EQ(nullptr, min_node.y()); +} + +TEST(CircleMinimumTest, input_NEG) +{ + luci::CircleMinimum min_node; + luci::CircleMinimum node; + + min_node.x(&node); + min_node.y(&node); + ASSERT_NE(nullptr, min_node.x()); + ASSERT_NE(nullptr, min_node.y()); + + min_node.x(nullptr); + min_node.y(nullptr); + ASSERT_EQ(nullptr, min_node.x()); + ASSERT_EQ(nullptr, min_node.y()); +} + +TEST(CircleMinimumTest, arity_NEG) +{ + luci::CircleMinimum min_node; + + ASSERT_NO_THROW(min_node.arg(1)); + ASSERT_THROW(min_node.arg(2), std::out_of_range); +} + +TEST(CircleMinimumTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMinimum min_node; + + TestVisitor tv; + ASSERT_THROW(min_node.accept(&tv), std::exception); +} + +TEST(CircleMinimumTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMinimum min_node; + + TestVisitor tv; + ASSERT_THROW(min_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMirrorPad.test.cpp b/compiler/luci/lang/src/Nodes/CircleMirrorPad.test.cpp new file mode 100644 index 0000000..9ba6bf5 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleMirrorPad.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleMirrorPad.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleMirrorPadTest, constructor_P) +{ + luci::CircleMirrorPad pad_node; + + ASSERT_EQ(luci::CircleDialect::get(), pad_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MIRROR_PAD, pad_node.opcode()); + + ASSERT_EQ(nullptr, pad_node.input()); + ASSERT_EQ(nullptr, pad_node.paddings()); + + ASSERT_EQ(luci::MirrorPadMode::REFLECT, pad_node.mode()); +} + +TEST(CircleMirrorPadTest, input_NEG) +{ + luci::CircleMirrorPad pad_node; + luci::CircleMirrorPad node; + + pad_node.input(&node); + pad_node.paddings(&node); + ASSERT_NE(nullptr, pad_node.input()); + ASSERT_NE(nullptr, pad_node.paddings()); + + pad_node.input(nullptr); + pad_node.paddings(nullptr); + ASSERT_EQ(nullptr, pad_node.input()); + ASSERT_EQ(nullptr, pad_node.paddings()); + + pad_node.mode(luci::MirrorPadMode::SYMMETRIC); + ASSERT_NE(luci::MirrorPadMode::REFLECT, pad_node.mode()); +} + +TEST(CircleMirrorPadTest, arity_NEG) +{ + luci::CircleMirrorPad pad_node; + + ASSERT_NO_THROW(pad_node.arg(1)); + ASSERT_THROW(pad_node.arg(2), std::out_of_range); +} + +TEST(CircleMirrorPadTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMirrorPad pad_node; + + TestVisitor tv; + ASSERT_THROW(pad_node.accept(&tv), std::exception); +} + +TEST(CircleMirrorPadTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMirrorPad pad_node; + + TestVisitor tv; + ASSERT_THROW(pad_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleMul.test.cpp b/compiler/luci/lang/src/Nodes/CircleMul.test.cpp index f9eca42..3c26d08 100644 --- a/compiler/luci/lang/src/Nodes/CircleMul.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleMul.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleMul.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleMulTest, constructor_P) { luci::CircleMul mul_node; - ASSERT_EQ(mul_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(mul_node.opcode(), luci::CircleOpcode::MUL); + ASSERT_EQ(luci::CircleDialect::get(), mul_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::MUL, mul_node.opcode()); - ASSERT_EQ(mul_node.x(), nullptr); - ASSERT_EQ(mul_node.y(), nullptr); + ASSERT_EQ(nullptr, mul_node.x()); + ASSERT_EQ(nullptr, mul_node.y()); +} + +TEST(CircleMulTest, input_NEG) +{ + luci::CircleMul mul_node; + luci::CircleMul node; + + mul_node.x(&node); + mul_node.y(&node); + ASSERT_NE(nullptr, mul_node.x()); + ASSERT_NE(nullptr, mul_node.y()); + + mul_node.x(nullptr); + mul_node.y(nullptr); + ASSERT_EQ(nullptr, mul_node.x()); + ASSERT_EQ(nullptr, mul_node.y()); +} + +TEST(CircleMulTest, arity_NEG) +{ + luci::CircleMul mul_node; + + ASSERT_NO_THROW(mul_node.arg(1)); + ASSERT_THROW(mul_node.arg(2), std::out_of_range); +} + +TEST(CircleMulTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleMul mul_node; + + TestVisitor tv; + ASSERT_THROW(mul_node.accept(&tv), std::exception); +} + +TEST(CircleMulTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleMul mul_node; + + TestVisitor tv; + ASSERT_THROW(mul_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleNeg.test.cpp b/compiler/luci/lang/src/Nodes/CircleNeg.test.cpp new file mode 100644 index 0000000..4bcfa48 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleNeg.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleNeg.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleNegTest, constructor) +{ + luci::CircleNeg neg_node; + + ASSERT_EQ(luci::CircleDialect::get(), neg_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::NEG, neg_node.opcode()); + + ASSERT_EQ(nullptr, neg_node.x()); +} + +TEST(CircleNegTest, input_NEG) +{ + luci::CircleNeg neg_node; + luci::CircleNeg node; + + neg_node.x(&node); + ASSERT_NE(nullptr, neg_node.x()); + + neg_node.x(nullptr); + ASSERT_EQ(nullptr, neg_node.x()); +} + +TEST(CircleNegTest, arity_NEG) +{ + luci::CircleNeg neg_node; + + ASSERT_NO_THROW(neg_node.arg(0)); + ASSERT_THROW(neg_node.arg(1), std::out_of_range); +} + +TEST(CircleNegTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleNeg neg_node; + + TestVisitor tv; + ASSERT_THROW(neg_node.accept(&tv), std::exception); +} + +TEST(CircleNegTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleNeg neg_node; + + TestVisitor tv; + ASSERT_THROW(neg_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleNotEqual.test.cpp b/compiler/luci/lang/src/Nodes/CircleNotEqual.test.cpp new file mode 100644 index 0000000..e464a7b --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleNotEqual.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleNotEqual.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleNotEqualTest, constructor_P) +{ + luci::CircleNotEqual not_equal_node; + + ASSERT_EQ(luci::CircleDialect::get(), not_equal_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::NOT_EQUAL, not_equal_node.opcode()); + + ASSERT_EQ(nullptr, not_equal_node.x()); + ASSERT_EQ(nullptr, not_equal_node.y()); +} + +TEST(CircleNotEqualTest, input_NEG) +{ + luci::CircleNotEqual not_equal_node; + luci::CircleNotEqual node; + + not_equal_node.x(&node); + not_equal_node.y(&node); + ASSERT_NE(nullptr, not_equal_node.x()); + ASSERT_NE(nullptr, not_equal_node.y()); + + not_equal_node.x(nullptr); + not_equal_node.y(nullptr); + ASSERT_EQ(nullptr, not_equal_node.x()); + ASSERT_EQ(nullptr, not_equal_node.y()); +} + +TEST(CircleNotEqualTest, arity_NEG) +{ + luci::CircleNotEqual not_equal_node; + + ASSERT_NO_THROW(not_equal_node.arg(1)); + ASSERT_THROW(not_equal_node.arg(2), std::out_of_range); +} + +TEST(CircleNotEqualTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleNotEqual not_equal_node; + + TestVisitor tv; + ASSERT_THROW(not_equal_node.accept(&tv), std::exception); +} + +TEST(CircleNotEqualTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleNotEqual not_equal_node; + + TestVisitor tv; + ASSERT_THROW(not_equal_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleOneHot.test.cpp b/compiler/luci/lang/src/Nodes/CircleOneHot.test.cpp new file mode 100644 index 0000000..18e1045 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleOneHot.test.cpp @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleOneHot.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleOneHotTest, constructor) +{ + luci::CircleOneHot one_hot_node; + + ASSERT_EQ(luci::CircleDialect::get(), one_hot_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ONE_HOT, one_hot_node.opcode()); + + ASSERT_EQ(nullptr, one_hot_node.indices()); + ASSERT_EQ(nullptr, one_hot_node.depth()); + ASSERT_EQ(nullptr, one_hot_node.on_value()); + ASSERT_EQ(nullptr, one_hot_node.off_value()); + ASSERT_EQ(-1, one_hot_node.axis()); +} + +TEST(CircleOneHotTest, input_NEG) +{ + luci::CircleOneHot one_hot_node; + luci::CircleOneHot node; + + one_hot_node.indices(&node); + one_hot_node.depth(&node); + one_hot_node.on_value(&node); + one_hot_node.off_value(&node); + ASSERT_NE(nullptr, one_hot_node.indices()); + ASSERT_NE(nullptr, one_hot_node.depth()); + ASSERT_NE(nullptr, one_hot_node.on_value()); + ASSERT_NE(nullptr, one_hot_node.off_value()); + + one_hot_node.indices(nullptr); + one_hot_node.depth(nullptr); + one_hot_node.on_value(nullptr); + one_hot_node.off_value(nullptr); + ASSERT_EQ(nullptr, one_hot_node.indices()); + ASSERT_EQ(nullptr, one_hot_node.depth()); + ASSERT_EQ(nullptr, one_hot_node.on_value()); + ASSERT_EQ(nullptr, one_hot_node.off_value()); + + one_hot_node.axis(1); + ASSERT_NE(-1, one_hot_node.axis()); +} + +TEST(CircleOneHotTest, arity_NEG) +{ + luci::CircleOneHot one_hot_node; + + ASSERT_NO_THROW(one_hot_node.arg(3)); + ASSERT_THROW(one_hot_node.arg(4), std::out_of_range); +} + +TEST(CircleOneHotTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleOneHot one_hot_node; + + TestVisitor tv; + ASSERT_THROW(one_hot_node.accept(&tv), std::exception); +} + +TEST(CircleOneHotTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleOneHot one_hot_node; + + TestVisitor tv; + ASSERT_THROW(one_hot_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CirclePRelu.test.cpp b/compiler/luci/lang/src/Nodes/CirclePRelu.test.cpp new file mode 100644 index 0000000..8355c6d --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CirclePRelu.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CirclePRelu.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CirclePReluTest, constructor_P) +{ + luci::CirclePRelu prelu_node; + + ASSERT_EQ(luci::CircleDialect::get(), prelu_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::PRELU, prelu_node.opcode()); + + ASSERT_EQ(nullptr, prelu_node.input()); + ASSERT_EQ(nullptr, prelu_node.alpha()); +} + +TEST(CirclePReluTest, input_NEG) +{ + luci::CirclePRelu prelu_node; + luci::CirclePRelu node; + + prelu_node.input(&node); + prelu_node.alpha(&node); + ASSERT_NE(nullptr, prelu_node.input()); + ASSERT_NE(nullptr, prelu_node.alpha()); + + prelu_node.input(nullptr); + prelu_node.alpha(nullptr); + ASSERT_EQ(nullptr, prelu_node.input()); + ASSERT_EQ(nullptr, prelu_node.alpha()); +} + +TEST(CirclePReluTest, arity_NEG) +{ + luci::CirclePRelu prelu_node; + + ASSERT_NO_THROW(prelu_node.arg(1)); + ASSERT_THROW(prelu_node.arg(2), std::out_of_range); +} + +TEST(CirclePReluTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CirclePRelu prelu_node; + + TestVisitor tv; + ASSERT_THROW(prelu_node.accept(&tv), std::exception); +} + +TEST(CirclePReluTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CirclePRelu prelu_node; + + TestVisitor tv; + ASSERT_THROW(prelu_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CirclePack.test.cpp b/compiler/luci/lang/src/Nodes/CirclePack.test.cpp index 5c9a96f..5e64f0d 100644 --- a/compiler/luci/lang/src/Nodes/CirclePack.test.cpp +++ b/compiler/luci/lang/src/Nodes/CirclePack.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CirclePack.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,12 +25,60 @@ TEST(CirclePackTest, constructor) { luci::CirclePack pack_node(3); - ASSERT_EQ(pack_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(pack_node.opcode(), luci::CircleOpcode::PACK); + ASSERT_EQ(luci::CircleDialect::get(), pack_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::PACK, pack_node.opcode()); - ASSERT_EQ(pack_node.axis(), 0); - ASSERT_EQ(pack_node.values_count(), 3); - ASSERT_EQ(pack_node.values(0), nullptr); - ASSERT_EQ(pack_node.values(1), nullptr); - ASSERT_EQ(pack_node.values(2), nullptr); + ASSERT_EQ(0, pack_node.axis()); + ASSERT_EQ(3, pack_node.values_count()); + ASSERT_EQ(nullptr, pack_node.values(0)); + ASSERT_EQ(nullptr, pack_node.values(1)); + ASSERT_EQ(nullptr, pack_node.values(2)); +} + +TEST(CirclePackTest, input_NEG) +{ + luci::CirclePack pack_node(2); + luci::CirclePack node(2); + + pack_node.values(0, &node); + pack_node.values(1, &node); + ASSERT_NE(nullptr, pack_node.values(0)); + ASSERT_NE(nullptr, pack_node.values(1)); + + pack_node.values(0, nullptr); + pack_node.values(1, nullptr); + ASSERT_EQ(nullptr, pack_node.values(0)); + ASSERT_EQ(nullptr, pack_node.values(1)); +} + +TEST(CirclePackTest, arity_NEG) +{ + luci::CirclePack pack_node(5); + + ASSERT_NO_THROW(pack_node.arg(4)); + ASSERT_THROW(pack_node.arg(5), std::out_of_range); +} + +TEST(CirclePackTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CirclePack pack_node(2); + + TestVisitor tv; + ASSERT_THROW(pack_node.accept(&tv), std::exception); +} + +TEST(CirclePackTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CirclePack pack_node(2); + + TestVisitor tv; + ASSERT_THROW(pack_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CirclePad.test.cpp b/compiler/luci/lang/src/Nodes/CirclePad.test.cpp index 3a23fa0..12c66b7 100644 --- a/compiler/luci/lang/src/Nodes/CirclePad.test.cpp +++ b/compiler/luci/lang/src/Nodes/CirclePad.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CirclePad.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CirclePadTest, constructor_P) { luci::CirclePad pad_node; - ASSERT_EQ(pad_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(pad_node.opcode(), luci::CircleOpcode::PAD); + ASSERT_EQ(luci::CircleDialect::get(), pad_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::PAD, pad_node.opcode()); - ASSERT_EQ(pad_node.input(), nullptr); - ASSERT_EQ(pad_node.paddings(), nullptr); + ASSERT_EQ(nullptr, pad_node.input()); + ASSERT_EQ(nullptr, pad_node.paddings()); +} + +TEST(CirclePadTest, input_NEG) +{ + luci::CirclePad pad_node; + luci::CirclePad node; + + pad_node.input(&node); + pad_node.paddings(&node); + ASSERT_NE(nullptr, pad_node.input()); + ASSERT_NE(nullptr, pad_node.paddings()); + + pad_node.input(nullptr); + pad_node.paddings(nullptr); + ASSERT_EQ(nullptr, pad_node.input()); + ASSERT_EQ(nullptr, pad_node.paddings()); +} + +TEST(CirclePadTest, arity_NEG) +{ + luci::CirclePad pad_node; + + ASSERT_NO_THROW(pad_node.arg(1)); + ASSERT_THROW(pad_node.arg(2), std::out_of_range); +} + +TEST(CirclePadTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CirclePad pad_node; + + TestVisitor tv; + ASSERT_THROW(pad_node.accept(&tv), std::exception); +} + +TEST(CirclePadTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CirclePad pad_node; + + TestVisitor tv; + ASSERT_THROW(pad_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CirclePow.test.cpp b/compiler/luci/lang/src/Nodes/CirclePow.test.cpp new file mode 100644 index 0000000..67ba088 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CirclePow.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CirclePow.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CirclePowTest, constructor_P) +{ + luci::CirclePow pow_node; + + ASSERT_EQ(luci::CircleDialect::get(), pow_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::POW, pow_node.opcode()); + + ASSERT_EQ(nullptr, pow_node.x()); + ASSERT_EQ(nullptr, pow_node.y()); +} + +TEST(CirclePowTest, input_NEG) +{ + luci::CirclePow pow_node; + luci::CirclePow node; + + pow_node.x(&node); + pow_node.y(&node); + ASSERT_NE(nullptr, pow_node.x()); + ASSERT_NE(nullptr, pow_node.y()); + + pow_node.x(nullptr); + pow_node.y(nullptr); + ASSERT_EQ(nullptr, pow_node.x()); + ASSERT_EQ(nullptr, pow_node.y()); +} + +TEST(CirclePowTest, arity_NEG) +{ + luci::CirclePow pow_node; + + ASSERT_NO_THROW(pow_node.arg(1)); + ASSERT_THROW(pow_node.arg(2), std::out_of_range); +} + +TEST(CirclePowTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CirclePow pow_node; + + TestVisitor tv; + ASSERT_THROW(pow_node.accept(&tv), std::exception); +} + +TEST(CirclePowTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CirclePow pow_node; + + TestVisitor tv; + ASSERT_THROW(pow_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleRange.test.cpp b/compiler/luci/lang/src/Nodes/CircleRange.test.cpp new file mode 100644 index 0000000..dd54dfd --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleRange.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleRange.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleRangeTest, constructor) +{ + luci::CircleRange range_node; + + ASSERT_EQ(luci::CircleDialect::get(), range_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RANGE, range_node.opcode()); + + ASSERT_EQ(nullptr, range_node.start()); + ASSERT_EQ(nullptr, range_node.limit()); + ASSERT_EQ(nullptr, range_node.delta()); +} + +TEST(CircleRangeTest, input_NEG) +{ + luci::CircleRange range_node; + luci::CircleRange node; + + range_node.start(&node); + range_node.limit(&node); + range_node.delta(&node); + ASSERT_NE(nullptr, range_node.start()); + ASSERT_NE(nullptr, range_node.limit()); + ASSERT_NE(nullptr, range_node.delta()); + + range_node.start(nullptr); + range_node.limit(nullptr); + range_node.delta(nullptr); + ASSERT_EQ(nullptr, range_node.start()); + ASSERT_EQ(nullptr, range_node.limit()); + ASSERT_EQ(nullptr, range_node.delta()); +} + +TEST(CircleRangeTest, arity_NEG) +{ + luci::CircleRange range_node; + + ASSERT_NO_THROW(range_node.arg(2)); + ASSERT_THROW(range_node.arg(3), std::out_of_range); +} + +TEST(CircleRangeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleRange range_node; + + TestVisitor tv; + ASSERT_THROW(range_node.accept(&tv), std::exception); +} + +TEST(CircleRangeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleRange range_node; + + TestVisitor tv; + ASSERT_THROW(range_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleRank.test.cpp b/compiler/luci/lang/src/Nodes/CircleRank.test.cpp new file mode 100644 index 0000000..e64eae2 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleRank.test.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleRank.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleRankTest, constructor_P) +{ + luci::CircleRank rank_node; + + ASSERT_EQ(luci::CircleDialect::get(), rank_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RANK, rank_node.opcode()); + + ASSERT_EQ(nullptr, rank_node.input()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReduceAny.test.cpp b/compiler/luci/lang/src/Nodes/CircleReduceAny.test.cpp new file mode 100644 index 0000000..cd5c6b7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReduceAny.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReduceAny.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleReduceAnyTest, constructor) +{ + luci::CircleReduceAny reduce_any_node; + + ASSERT_EQ(luci::CircleDialect::get(), reduce_any_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REDUCE_ANY, reduce_any_node.opcode()); + + ASSERT_EQ(nullptr, reduce_any_node.input()); + ASSERT_EQ(nullptr, reduce_any_node.reduction_indices()); + + ASSERT_FALSE(reduce_any_node.keep_dims()); +} + +TEST(CircleReduceAnyTest, input_NEG) +{ + luci::CircleReduceAny reduce_any_node; + luci::CircleReduceAny node; + + reduce_any_node.input(&node); + reduce_any_node.reduction_indices(&node); + ASSERT_NE(nullptr, reduce_any_node.input()); + ASSERT_NE(nullptr, reduce_any_node.reduction_indices()); + + reduce_any_node.input(nullptr); + reduce_any_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, reduce_any_node.input()); + ASSERT_EQ(nullptr, reduce_any_node.reduction_indices()); + + reduce_any_node.keep_dims(true); + ASSERT_TRUE(reduce_any_node.keep_dims()); +} + +TEST(CircleReduceAnyTest, arity_NEG) +{ + luci::CircleReduceAny reduce_any_node; + + ASSERT_NO_THROW(reduce_any_node.arg(1)); + ASSERT_THROW(reduce_any_node.arg(2), std::out_of_range); +} + +TEST(CircleReduceAnyTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReduceAny reduce_any_node; + + TestVisitor tv; + ASSERT_THROW(reduce_any_node.accept(&tv), std::exception); +} + +TEST(CircleReduceAnyTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReduceAny reduce_any_node; + + TestVisitor tv; + ASSERT_THROW(reduce_any_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReduceMax.test.cpp b/compiler/luci/lang/src/Nodes/CircleReduceMax.test.cpp new file mode 100644 index 0000000..bdd1818 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReduceMax.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReduceMax.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleReduceMaxTest, constructor_P) +{ + luci::CircleReduceMax reduce_max_node; + + ASSERT_EQ(luci::CircleDialect::get(), reduce_max_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REDUCE_MAX, reduce_max_node.opcode()); + + ASSERT_EQ(nullptr, reduce_max_node.input()); + ASSERT_EQ(nullptr, reduce_max_node.reduction_indices()); + + ASSERT_FALSE(reduce_max_node.keep_dims()); +} + +TEST(CircleReduceMaxTest, input_NEG) +{ + luci::CircleReduceMax reduce_max_node; + luci::CircleReduceMax node; + + reduce_max_node.input(&node); + reduce_max_node.reduction_indices(&node); + ASSERT_NE(nullptr, reduce_max_node.input()); + ASSERT_NE(nullptr, reduce_max_node.reduction_indices()); + + reduce_max_node.input(nullptr); + reduce_max_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, reduce_max_node.input()); + ASSERT_EQ(nullptr, reduce_max_node.reduction_indices()); + + reduce_max_node.keep_dims(true); + ASSERT_TRUE(reduce_max_node.keep_dims()); +} + +TEST(CircleReduceMaxTest, arity_NEG) +{ + luci::CircleReduceMax reduce_max_node; + + ASSERT_NO_THROW(reduce_max_node.arg(1)); + ASSERT_THROW(reduce_max_node.arg(2), std::out_of_range); +} + +TEST(CircleReduceMaxTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReduceMax reduce_max_node; + + TestVisitor tv; + ASSERT_THROW(reduce_max_node.accept(&tv), std::exception); +} + +TEST(CircleReduceMaxTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReduceMax reduce_max_node; + + TestVisitor tv; + ASSERT_THROW(reduce_max_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReduceMin.test.cpp b/compiler/luci/lang/src/Nodes/CircleReduceMin.test.cpp new file mode 100644 index 0000000..ba99ae6 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReduceMin.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReduceMin.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleReduceMinTest, constructor_P) +{ + luci::CircleReduceMin reduce_min_node; + + ASSERT_EQ(luci::CircleDialect::get(), reduce_min_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REDUCE_MIN, reduce_min_node.opcode()); + + ASSERT_EQ(nullptr, reduce_min_node.input()); + ASSERT_EQ(nullptr, reduce_min_node.reduction_indices()); + + ASSERT_FALSE(reduce_min_node.keep_dims()); +} + +TEST(CircleReduceMinTest, input_NEG) +{ + luci::CircleReduceMin reduce_min_node; + luci::CircleReduceMin node; + + reduce_min_node.input(&node); + reduce_min_node.reduction_indices(&node); + ASSERT_NE(nullptr, reduce_min_node.input()); + ASSERT_NE(nullptr, reduce_min_node.reduction_indices()); + + reduce_min_node.input(nullptr); + reduce_min_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, reduce_min_node.input()); + ASSERT_EQ(nullptr, reduce_min_node.reduction_indices()); + + reduce_min_node.keep_dims(true); + ASSERT_TRUE(reduce_min_node.keep_dims()); +} + +TEST(CircleReduceMinTest, arity_NEG) +{ + luci::CircleReduceMin reduce_min_node; + + ASSERT_NO_THROW(reduce_min_node.arg(1)); + ASSERT_THROW(reduce_min_node.arg(2), std::out_of_range); +} + +TEST(CircleReduceMinTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReduceMin reduce_min_node; + + TestVisitor tv; + ASSERT_THROW(reduce_min_node.accept(&tv), std::exception); +} + +TEST(CircleReduceMinTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReduceMin reduce_min_node; + + TestVisitor tv; + ASSERT_THROW(reduce_min_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReduceProd.test.cpp b/compiler/luci/lang/src/Nodes/CircleReduceProd.test.cpp new file mode 100644 index 0000000..f60b290 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReduceProd.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReduceProd.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleReduceProdTest, constructor) +{ + luci::CircleReduceProd reduce_prod_node; + + ASSERT_EQ(luci::CircleDialect::get(), reduce_prod_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REDUCE_PROD, reduce_prod_node.opcode()); + + ASSERT_EQ(nullptr, reduce_prod_node.input()); + ASSERT_EQ(nullptr, reduce_prod_node.reduction_indices()); + + ASSERT_FALSE(reduce_prod_node.keep_dims()); +} + +TEST(CircleReduceProdTest, input_NEG) +{ + luci::CircleReduceProd reduce_prod_node; + luci::CircleReduceProd node; + + reduce_prod_node.input(&node); + reduce_prod_node.reduction_indices(&node); + ASSERT_NE(nullptr, reduce_prod_node.input()); + ASSERT_NE(nullptr, reduce_prod_node.reduction_indices()); + + reduce_prod_node.input(nullptr); + reduce_prod_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, reduce_prod_node.input()); + ASSERT_EQ(nullptr, reduce_prod_node.reduction_indices()); + + reduce_prod_node.keep_dims(true); + ASSERT_TRUE(reduce_prod_node.keep_dims()); +} + +TEST(CircleReduceProdTest, arity_NEG) +{ + luci::CircleReduceProd reduce_prod_node; + + ASSERT_NO_THROW(reduce_prod_node.arg(1)); + ASSERT_THROW(reduce_prod_node.arg(2), std::out_of_range); +} + +TEST(CircleReduceProdTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReduceProd reduce_prod_node; + + TestVisitor tv; + ASSERT_THROW(reduce_prod_node.accept(&tv), std::exception); +} + +TEST(CircleReduceProdTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReduceProd reduce_prod_node; + + TestVisitor tv; + ASSERT_THROW(reduce_prod_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleRelu.test.cpp b/compiler/luci/lang/src/Nodes/CircleRelu.test.cpp index 19ea88a..3579650 100644 --- a/compiler/luci/lang/src/Nodes/CircleRelu.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleRelu.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleRelu.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleReluTest, constructor_P) { luci::CircleRelu relu_node; - ASSERT_EQ(relu_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(relu_node.opcode(), luci::CircleOpcode::RELU); + ASSERT_EQ(luci::CircleDialect::get(), relu_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RELU, relu_node.opcode()); - ASSERT_EQ(relu_node.features(), nullptr); + ASSERT_EQ(nullptr, relu_node.features()); +} + +TEST(CircleReluTest, input_NEG) +{ + luci::CircleRelu relu_node; + luci::CircleRelu node; + + relu_node.features(&node); + ASSERT_NE(nullptr, relu_node.features()); + + relu_node.features(nullptr); + ASSERT_EQ(nullptr, relu_node.features()); +} + +TEST(CircleReluTest, arity_NEG) +{ + luci::CircleRelu relu_node; + + ASSERT_NO_THROW(relu_node.arg(0)); + ASSERT_THROW(relu_node.arg(1), std::out_of_range); +} + +TEST(CircleReluTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleRelu relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); +} + +TEST(CircleReluTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleRelu relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleRelu6.test.cpp b/compiler/luci/lang/src/Nodes/CircleRelu6.test.cpp index 74bf2e8..647a5d7 100644 --- a/compiler/luci/lang/src/Nodes/CircleRelu6.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleRelu6.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleRelu6.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleRelu6Test, constructor_P) { luci::CircleRelu6 relu6_node; - ASSERT_EQ(relu6_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(relu6_node.opcode(), luci::CircleOpcode::RELU6); + ASSERT_EQ(luci::CircleDialect::get(), relu6_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RELU6, relu6_node.opcode()); - ASSERT_EQ(relu6_node.features(), nullptr); + ASSERT_EQ(nullptr, relu6_node.features()); +} + +TEST(CircleRelu6Test, input_NEG) +{ + luci::CircleRelu6 relu6_node; + luci::CircleRelu6 node; + + relu6_node.features(&node); + ASSERT_NE(nullptr, relu6_node.features()); + + relu6_node.features(nullptr); + ASSERT_EQ(nullptr, relu6_node.features()); +} + +TEST(CircleRelu6Test, arity_NEG) +{ + luci::CircleRelu6 relu6_node; + + ASSERT_NO_THROW(relu6_node.arg(0)); + ASSERT_THROW(relu6_node.arg(1), std::out_of_range); +} + +TEST(CircleRelu6Test, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleRelu6 relu6_node; + + TestVisitor tv; + ASSERT_THROW(relu6_node.accept(&tv), std::exception); +} + +TEST(CircleRelu6Test, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleRelu6 relu6_node; + + TestVisitor tv; + ASSERT_THROW(relu6_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleReluN1To1.test.cpp b/compiler/luci/lang/src/Nodes/CircleReluN1To1.test.cpp new file mode 100644 index 0000000..8de84ac --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReluN1To1.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReluN1To1.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleReluN1To1Test, constructor) +{ + luci::CircleReluN1To1 relu_node; + + ASSERT_EQ(luci::CircleDialect::get(), relu_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RELU_N1_TO_1, relu_node.opcode()); + + ASSERT_EQ(nullptr, relu_node.features()); +} + +TEST(CircleReluN1To1Test, input_NEG) +{ + luci::CircleReluN1To1 relu_node; + luci::CircleReluN1To1 node; + + relu_node.features(&node); + ASSERT_NE(nullptr, relu_node.features()); + + relu_node.features(nullptr); + ASSERT_EQ(nullptr, relu_node.features()); +} + +TEST(CircleReluN1To1Test, arity_NEG) +{ + luci::CircleReluN1To1 relu_node; + + ASSERT_NO_THROW(relu_node.arg(0)); + ASSERT_THROW(relu_node.arg(1), std::out_of_range); +} + +TEST(CircleReluN1To1Test, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReluN1To1 relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); +} + +TEST(CircleReluN1To1Test, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReluN1To1 relu_node; + + TestVisitor tv; + ASSERT_THROW(relu_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReshape.test.cpp b/compiler/luci/lang/src/Nodes/CircleReshape.test.cpp index 7bc2d32..236fde2 100644 --- a/compiler/luci/lang/src/Nodes/CircleReshape.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleReshape.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleReshape.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,12 +25,12 @@ TEST(CircleReshapeTest, constructor_P) { luci::CircleReshape reshape; - ASSERT_EQ(reshape.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(reshape.opcode(), luci::CircleOpcode::RESHAPE); + ASSERT_EQ(luci::CircleDialect::get(), reshape.dialect()); + ASSERT_EQ(luci::CircleOpcode::RESHAPE, reshape.opcode()); - ASSERT_EQ(reshape.tensor(), nullptr); - ASSERT_EQ(reshape.shape(), nullptr); - ASSERT_EQ(reshape.newShape()->rank(), 0); + ASSERT_EQ(nullptr, reshape.tensor()); + ASSERT_EQ(nullptr, reshape.shape()); + ASSERT_EQ(0, reshape.newShape()->rank()); } TEST(CircleReshapeTest, alloc_new_shape_P) @@ -37,12 +38,60 @@ TEST(CircleReshapeTest, alloc_new_shape_P) luci::CircleReshape reshape; reshape.newShape()->rank(2); - ASSERT_EQ(reshape.newShape()->rank(), 2); + ASSERT_EQ(2, reshape.newShape()->rank()); reshape.newShape()->dim(0) = 0; reshape.newShape()->dim(1) = 1; auto &const_reshape = const_cast(reshape); - ASSERT_EQ(const_reshape.newShape()->dim(0), 0); - ASSERT_EQ(const_reshape.newShape()->dim(1), 1); + ASSERT_EQ(0, const_reshape.newShape()->dim(0)); + ASSERT_EQ(1, const_reshape.newShape()->dim(1)); +} + +TEST(CircleReshapeTest, input_NEG) +{ + luci::CircleReshape reshape_node; + luci::CircleReshape node; + + reshape_node.tensor(&node); + reshape_node.shape(&node); + ASSERT_NE(nullptr, reshape_node.tensor()); + ASSERT_NE(nullptr, reshape_node.shape()); + + reshape_node.tensor(nullptr); + reshape_node.shape(nullptr); + ASSERT_EQ(nullptr, reshape_node.tensor()); + ASSERT_EQ(nullptr, reshape_node.shape()); +} + +TEST(CircleReshapeTest, arity_NEG) +{ + luci::CircleReshape reshape_node; + + ASSERT_NO_THROW(reshape_node.arg(1)); + ASSERT_THROW(reshape_node.arg(2), std::out_of_range); +} + +TEST(CircleReshapeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleReshape reshape_node; + + TestVisitor tv; + ASSERT_THROW(reshape_node.accept(&tv), std::exception); +} + +TEST(CircleReshapeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleReshape reshape_node; + + TestVisitor tv; + ASSERT_THROW(reshape_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleResizeBilinear.test.cpp b/compiler/luci/lang/src/Nodes/CircleResizeBilinear.test.cpp new file mode 100644 index 0000000..a1481a6 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleResizeBilinear.test.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleResizeBilinear.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleResizeBilinearTest, constructor) +{ + luci::CircleResizeBilinear resize; + + ASSERT_EQ(luci::CircleDialect::get(), resize.dialect()); + ASSERT_EQ(luci::CircleOpcode::RESIZE_BILINEAR, resize.opcode()); + + ASSERT_EQ(nullptr, resize.input()); + ASSERT_EQ(nullptr, resize.size()); + ASSERT_FALSE(resize.align_corners()); + ASSERT_FALSE(resize.half_pixel_centers()); +} + +TEST(CircleResizeBilinearTest, input_NEG) +{ + luci::CircleResizeBilinear resize_node; + luci::CircleResizeBilinear node; + + resize_node.input(&node); + resize_node.size(&node); + ASSERT_NE(nullptr, resize_node.input()); + ASSERT_NE(nullptr, resize_node.size()); + + resize_node.input(nullptr); + resize_node.size(nullptr); + ASSERT_EQ(nullptr, resize_node.input()); + ASSERT_EQ(nullptr, resize_node.size()); + + resize_node.align_corners(true); + ASSERT_TRUE(resize_node.align_corners()); + resize_node.half_pixel_centers(true); + ASSERT_TRUE(resize_node.half_pixel_centers()); +} + +TEST(CircleResizeBilinearTest, arity_NEG) +{ + luci::CircleResizeBilinear resize_node; + + ASSERT_NO_THROW(resize_node.arg(1)); + ASSERT_THROW(resize_node.arg(2), std::out_of_range); +} + +TEST(CircleResizeBilinearTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleResizeBilinear resize_node; + + TestVisitor tv; + ASSERT_THROW(resize_node.accept(&tv), std::exception); +} + +TEST(CircleResizeBilinearTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleResizeBilinear resize_node; + + TestVisitor tv; + ASSERT_THROW(resize_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleResizeNearestNeighbor.test.cpp b/compiler/luci/lang/src/Nodes/CircleResizeNearestNeighbor.test.cpp new file mode 100644 index 0000000..00e0ae9 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleResizeNearestNeighbor.test.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleResizeNearestNeighbor.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleResizeNearestNeightborTest, constructor) +{ + luci::CircleResizeNearestNeighbor resize; + + ASSERT_EQ(luci::CircleDialect::get(), resize.dialect()); + ASSERT_EQ(luci::CircleOpcode::RESIZE_NEAREST_NEIGHBOR, resize.opcode()); + + ASSERT_EQ(nullptr, resize.input()); + ASSERT_EQ(nullptr, resize.size()); + ASSERT_FALSE(resize.align_corners()); +} + +TEST(CircleResizeNearestNeightborTest, input_NEG) +{ + luci::CircleResizeNearestNeighbor resize_node; + luci::CircleResizeNearestNeighbor node; + + resize_node.input(&node); + resize_node.size(&node); + ASSERT_NE(nullptr, resize_node.input()); + ASSERT_NE(nullptr, resize_node.size()); + + resize_node.input(nullptr); + resize_node.size(nullptr); + ASSERT_EQ(nullptr, resize_node.input()); + ASSERT_EQ(nullptr, resize_node.size()); + + resize_node.align_corners(true); + ASSERT_TRUE(resize_node.align_corners()); +} + +TEST(CircleResizeNearestNeightborTest, arity_NEG) +{ + luci::CircleResizeNearestNeighbor resize_node; + + ASSERT_NO_THROW(resize_node.arg(1)); + ASSERT_THROW(resize_node.arg(2), std::out_of_range); +} + +TEST(CircleResizeNearestNeightborTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleResizeNearestNeighbor resize_node; + + TestVisitor tv; + ASSERT_THROW(resize_node.accept(&tv), std::exception); +} + +TEST(CircleResizeNearestNeightborTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleResizeNearestNeighbor resize_node; + + TestVisitor tv; + ASSERT_THROW(resize_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReverseSequence.test.cpp b/compiler/luci/lang/src/Nodes/CircleReverseSequence.test.cpp new file mode 100644 index 0000000..b1cc6d6 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReverseSequence.test.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReverseSequence.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleReverseSequenceTest, constructor_P) +{ + luci::CircleReverseSequence std_node; + + ASSERT_EQ(luci::CircleDialect::get(), std_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REVERSE_SEQUENCE, std_node.opcode()); + + ASSERT_EQ(nullptr, std_node.input()); + ASSERT_EQ(nullptr, std_node.seq_lengths()); + + ASSERT_EQ(0, std_node.seq_axis()); + ASSERT_EQ(0, std_node.batch_axis()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleReverseV2.test.cpp b/compiler/luci/lang/src/Nodes/CircleReverseV2.test.cpp new file mode 100644 index 0000000..cc568e8 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleReverseV2.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleReverseV2.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleReverseV2, constructor_P) +{ + luci::CircleReverseV2 std_node; + + ASSERT_EQ(luci::CircleDialect::get(), std_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::REVERSE_V2, std_node.opcode()); + + ASSERT_EQ(nullptr, std_node.tensor()); + ASSERT_EQ(nullptr, std_node.axis()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleRound.test.cpp b/compiler/luci/lang/src/Nodes/CircleRound.test.cpp new file mode 100644 index 0000000..2f4518d --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleRound.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleRound.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleRoundTest, constructor_P) +{ + luci::CircleRound round_node; + + ASSERT_EQ(luci::CircleDialect::get(), round_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ROUND, round_node.opcode()); + + ASSERT_EQ(nullptr, round_node.x()); +} + +TEST(CircleRoundTest, input_NEG) +{ + luci::CircleRound round_node; + luci::CircleRound node; + + round_node.x(&node); + ASSERT_NE(nullptr, round_node.x()); + + round_node.x(nullptr); + ASSERT_EQ(nullptr, round_node.x()); +} + +TEST(CircleRoundTest, arity_NEG) +{ + luci::CircleRound round_node; + + ASSERT_NO_THROW(round_node.arg(0)); + ASSERT_THROW(round_node.arg(1), std::out_of_range); +} + +TEST(CircleRoundTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleRound round_node; + + TestVisitor tv; + ASSERT_THROW(round_node.accept(&tv), std::exception); +} + +TEST(CircleRoundTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleRound round_node; + + TestVisitor tv; + ASSERT_THROW(round_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleRsqrt.test.cpp b/compiler/luci/lang/src/Nodes/CircleRsqrt.test.cpp index 51f6bab..d038979 100644 --- a/compiler/luci/lang/src/Nodes/CircleRsqrt.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleRsqrt.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleRsqrt.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleRsqrtTest, constructor) { luci::CircleRsqrt rsqrt_node; - ASSERT_EQ(rsqrt_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(rsqrt_node.opcode(), luci::CircleOpcode::RSQRT); + ASSERT_EQ(luci::CircleDialect::get(), rsqrt_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::RSQRT, rsqrt_node.opcode()); - ASSERT_EQ(rsqrt_node.x(), nullptr); + ASSERT_EQ(nullptr, rsqrt_node.x()); +} + +TEST(CircleRsqrtTest, input_NEG) +{ + luci::CircleRsqrt rsqrt_node; + luci::CircleRsqrt node; + + rsqrt_node.x(&node); + ASSERT_NE(nullptr, rsqrt_node.x()); + + rsqrt_node.x(nullptr); + ASSERT_EQ(nullptr, rsqrt_node.x()); +} + +TEST(CircleRsqrtTest, arity_NEG) +{ + luci::CircleRsqrt rsqrt_node; + + ASSERT_NO_THROW(rsqrt_node.arg(0)); + ASSERT_THROW(rsqrt_node.arg(1), std::out_of_range); +} + +TEST(CircleRsqrtTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleRsqrt rsqrt_node; + + TestVisitor tv; + ASSERT_THROW(rsqrt_node.accept(&tv), std::exception); +} + +TEST(CircleRsqrtTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleRsqrt rsqrt_node; + + TestVisitor tv; + ASSERT_THROW(rsqrt_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleScatterNd.test.cpp b/compiler/luci/lang/src/Nodes/CircleScatterNd.test.cpp new file mode 100644 index 0000000..165f26b --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleScatterNd.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleScatterNd.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleScatterNdTest, constructor_P) +{ + luci::CircleScatterNd scatter_nd_node; + + ASSERT_EQ(luci::CircleDialect::get(), scatter_nd_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SCATTER_ND, scatter_nd_node.opcode()); + + ASSERT_EQ(nullptr, scatter_nd_node.indices()); + ASSERT_EQ(nullptr, scatter_nd_node.updates()); + ASSERT_EQ(nullptr, scatter_nd_node.shape()); +} + +TEST(CircleScatterNdTest, input_NEG) +{ + luci::CircleScatterNd scatter_nd_node; + luci::CircleScatterNd node; + + scatter_nd_node.indices(&node); + scatter_nd_node.updates(&node); + scatter_nd_node.shape(&node); + ASSERT_NE(nullptr, scatter_nd_node.indices()); + ASSERT_NE(nullptr, scatter_nd_node.updates()); + ASSERT_NE(nullptr, scatter_nd_node.shape()); + + scatter_nd_node.indices(nullptr); + scatter_nd_node.updates(nullptr); + scatter_nd_node.shape(nullptr); + ASSERT_EQ(nullptr, scatter_nd_node.indices()); + ASSERT_EQ(nullptr, scatter_nd_node.updates()); + ASSERT_EQ(nullptr, scatter_nd_node.shape()); +} + +TEST(CircleScatterNdTest, arity_NEG) +{ + luci::CircleScatterNd scatter_nd_node; + + ASSERT_NO_THROW(scatter_nd_node.arg(2)); + ASSERT_THROW(scatter_nd_node.arg(3), std::out_of_range); +} + +TEST(CircleScatterNdTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleScatterNd scatter_nd_node; + + TestVisitor tv; + ASSERT_THROW(scatter_nd_node.accept(&tv), std::exception); +} + +TEST(CircleScatterNdTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleScatterNd scatter_nd_node; + + TestVisitor tv; + ASSERT_THROW(scatter_nd_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSegmentSum.test.cpp b/compiler/luci/lang/src/Nodes/CircleSegmentSum.test.cpp new file mode 100644 index 0000000..90469b7 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSegmentSum.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSegmentSum.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleSegmentSumTest, constructor) +{ + luci::CircleSegmentSum segment_sum_node; + + ASSERT_EQ(luci::CircleDialect::get(), segment_sum_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SEGMENT_SUM, segment_sum_node.opcode()); + + ASSERT_EQ(nullptr, segment_sum_node.input()); + ASSERT_EQ(nullptr, segment_sum_node.segment_ids()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSelect.test.cpp b/compiler/luci/lang/src/Nodes/CircleSelect.test.cpp new file mode 100644 index 0000000..7eeb538 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSelect.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSelect.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSelectTest, constructor) +{ + luci::CircleSelect select_node; + + ASSERT_EQ(luci::CircleDialect::get(), select_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SELECT, select_node.opcode()); + + ASSERT_EQ(nullptr, select_node.condition()); + ASSERT_EQ(nullptr, select_node.t()); + ASSERT_EQ(nullptr, select_node.e()); +} + +TEST(CircleSelectTest, input_NEG) +{ + luci::CircleSelect select_node; + luci::CircleSelect node; + + select_node.condition(&node); + select_node.t(&node); + select_node.e(&node); + ASSERT_NE(nullptr, select_node.condition()); + ASSERT_NE(nullptr, select_node.t()); + ASSERT_NE(nullptr, select_node.e()); + + select_node.condition(nullptr); + select_node.t(nullptr); + select_node.e(nullptr); + ASSERT_EQ(nullptr, select_node.condition()); + ASSERT_EQ(nullptr, select_node.t()); + ASSERT_EQ(nullptr, select_node.e()); +} + +TEST(CircleSelectTest, arity_NEG) +{ + luci::CircleSelect select_node; + + ASSERT_NO_THROW(select_node.arg(2)); + ASSERT_THROW(select_node.arg(3), std::out_of_range); +} + +TEST(CircleSelectTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSelect select_node; + + TestVisitor tv; + ASSERT_THROW(select_node.accept(&tv), std::exception); +} + +TEST(CircleSelectTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSelect select_node; + + TestVisitor tv; + ASSERT_THROW(select_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSelectV2.test.cpp b/compiler/luci/lang/src/Nodes/CircleSelectV2.test.cpp new file mode 100644 index 0000000..eea5fb8 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSelectV2.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSelectV2.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSelectV2Test, constructor) +{ + luci::CircleSelectV2 select_node; + + ASSERT_EQ(luci::CircleDialect::get(), select_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SELECT_V2, select_node.opcode()); + + ASSERT_EQ(nullptr, select_node.condition()); + ASSERT_EQ(nullptr, select_node.t()); + ASSERT_EQ(nullptr, select_node.e()); +} + +TEST(CircleSelectV2Test, input_NEG) +{ + luci::CircleSelectV2 select_v2_node; + luci::CircleSelectV2 node; + + select_v2_node.condition(&node); + select_v2_node.t(&node); + select_v2_node.e(&node); + ASSERT_NE(nullptr, select_v2_node.condition()); + ASSERT_NE(nullptr, select_v2_node.t()); + ASSERT_NE(nullptr, select_v2_node.e()); + + select_v2_node.condition(nullptr); + select_v2_node.t(nullptr); + select_v2_node.e(nullptr); + ASSERT_EQ(nullptr, select_v2_node.condition()); + ASSERT_EQ(nullptr, select_v2_node.t()); + ASSERT_EQ(nullptr, select_v2_node.e()); +} + +TEST(CircleSelectV2Test, arity_NEG) +{ + luci::CircleSelectV2 select_v2_node; + + ASSERT_NO_THROW(select_v2_node.arg(2)); + ASSERT_THROW(select_v2_node.arg(3), std::out_of_range); +} + +TEST(CircleSelectV2Test, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSelectV2 select_v2_node; + + TestVisitor tv; + ASSERT_THROW(select_v2_node.accept(&tv), std::exception); +} + +TEST(CircleSelectV2Test, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSelectV2 select_v2_node; + + TestVisitor tv; + ASSERT_THROW(select_v2_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleShape.test.cpp b/compiler/luci/lang/src/Nodes/CircleShape.test.cpp new file mode 100644 index 0000000..18271d2 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleShape.test.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleShape.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleShapeTest, constructor) +{ + luci::CircleShape shape_node; + + ASSERT_EQ(luci::CircleDialect::get(), shape_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SHAPE, shape_node.opcode()); + + ASSERT_EQ(nullptr, shape_node.input()); + ASSERT_EQ(loco::DataType::S32, shape_node.out_type()); +} + +TEST(CircleShapeTest, input_NEG) +{ + luci::CircleShape shape_node; + luci::CircleShape node; + + shape_node.input(&node); + ASSERT_NE(nullptr, shape_node.input()); + + shape_node.input(nullptr); + ASSERT_EQ(nullptr, shape_node.input()); + + shape_node.out_type(loco::DataType::U8); + ASSERT_NE(loco::DataType::S32, shape_node.out_type()); +} + +TEST(CircleShapeTest, arity_NEG) +{ + luci::CircleShape shape_node; + + ASSERT_NO_THROW(shape_node.arg(0)); + ASSERT_THROW(shape_node.arg(1), std::out_of_range); +} + +TEST(CircleShapeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleShape shape_node; + + TestVisitor tv; + ASSERT_THROW(shape_node.accept(&tv), std::exception); +} + +TEST(CircleShapeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleShape shape_node; + + TestVisitor tv; + ASSERT_THROW(shape_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSin.test.cpp b/compiler/luci/lang/src/Nodes/CircleSin.test.cpp new file mode 100644 index 0000000..e01932d --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSin.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSin.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSinTest, constructor) +{ + luci::CircleSin sin_node; + + ASSERT_EQ(luci::CircleDialect::get(), sin_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SIN, sin_node.opcode()); + + ASSERT_EQ(nullptr, sin_node.x()); +} + +TEST(CircleSinTest, input_NEG) +{ + luci::CircleSin sin_node; + luci::CircleSin node; + + sin_node.x(&node); + ASSERT_NE(nullptr, sin_node.x()); + + sin_node.x(nullptr); + ASSERT_EQ(nullptr, sin_node.x()); +} + +TEST(CircleSinTest, arity_NEG) +{ + luci::CircleSin sin_node; + + ASSERT_NO_THROW(sin_node.arg(0)); + ASSERT_THROW(sin_node.arg(1), std::out_of_range); +} + +TEST(CircleSinTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSin sin_node; + + TestVisitor tv; + ASSERT_THROW(sin_node.accept(&tv), std::exception); +} + +TEST(CircleSinTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSin sin_node; + + TestVisitor tv; + ASSERT_THROW(sin_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSlice.test.cpp b/compiler/luci/lang/src/Nodes/CircleSlice.test.cpp new file mode 100644 index 0000000..5563a34 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSlice.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSlice.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSliceTest, constructor) +{ + luci::CircleSlice s_node; + + ASSERT_EQ(luci::CircleDialect::get(), s_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SLICE, s_node.opcode()); + + ASSERT_EQ(nullptr, s_node.input()); + ASSERT_EQ(nullptr, s_node.begin()); + ASSERT_EQ(nullptr, s_node.size()); +} + +TEST(CircleSliceTest, input_NEG) +{ + luci::CircleSlice s_node; + luci::CircleSlice node; + + s_node.input(&node); + s_node.begin(&node); + s_node.size(&node); + ASSERT_NE(nullptr, s_node.input()); + ASSERT_NE(nullptr, s_node.begin()); + ASSERT_NE(nullptr, s_node.size()); + + s_node.input(nullptr); + s_node.begin(nullptr); + s_node.size(nullptr); + ASSERT_EQ(nullptr, s_node.input()); + ASSERT_EQ(nullptr, s_node.begin()); + ASSERT_EQ(nullptr, s_node.size()); +} + +TEST(CircleSliceTest, arity_NEG) +{ + luci::CircleSlice s_node; + + ASSERT_NO_THROW(s_node.arg(2)); + ASSERT_THROW(s_node.arg(3), std::out_of_range); +} + +TEST(CircleSliceTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSlice s_node; + + TestVisitor tv; + ASSERT_THROW(s_node.accept(&tv), std::exception); +} + +TEST(CircleSliceTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSlice s_node; + + TestVisitor tv; + ASSERT_THROW(s_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSoftmax.test.cpp b/compiler/luci/lang/src/Nodes/CircleSoftmax.test.cpp index 7e99449..b15c009 100644 --- a/compiler/luci/lang/src/Nodes/CircleSoftmax.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleSoftmax.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleSoftmax.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleSoftmaxTest, constructor_P) { luci::CircleSoftmax softmax_node; - ASSERT_EQ(softmax_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(softmax_node.opcode(), luci::CircleOpcode::SOFTMAX); + ASSERT_EQ(luci::CircleDialect::get(), softmax_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SOFTMAX, softmax_node.opcode()); - ASSERT_EQ(softmax_node.logits(), nullptr); + ASSERT_EQ(nullptr, softmax_node.logits()); +} + +TEST(CircleSoftmaxTest, input_NEG) +{ + luci::CircleSoftmax softmax_node; + luci::CircleSoftmax node; + + softmax_node.logits(&node); + ASSERT_NE(nullptr, softmax_node.logits()); + + softmax_node.logits(nullptr); + ASSERT_EQ(nullptr, softmax_node.logits()); +} + +TEST(CircleSoftmaxTest, arity_NEG) +{ + luci::CircleSoftmax softmax_node; + + ASSERT_NO_THROW(softmax_node.arg(0)); + ASSERT_THROW(softmax_node.arg(1), std::out_of_range); +} + +TEST(CircleSoftmaxTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSoftmax softmax_node; + + TestVisitor tv; + ASSERT_THROW(softmax_node.accept(&tv), std::exception); +} + +TEST(CircleSoftmaxTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSoftmax softmax_node; + + TestVisitor tv; + ASSERT_THROW(softmax_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleSpaceToBatchND.test.cpp b/compiler/luci/lang/src/Nodes/CircleSpaceToBatchND.test.cpp new file mode 100644 index 0000000..8b4ac8f --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSpaceToBatchND.test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSpaceToBatchND.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSpaceToBatchNDTest, constructor) +{ + luci::CircleSpaceToBatchND stb_node; + + ASSERT_EQ(luci::CircleDialect::get(), stb_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SPACE_TO_BATCH_ND, stb_node.opcode()); + + ASSERT_EQ(nullptr, stb_node.input()); + ASSERT_EQ(nullptr, stb_node.block_shape()); + ASSERT_EQ(nullptr, stb_node.paddings()); +} + +TEST(CircleSpaceToBatchNDTest, input_NEG) +{ + luci::CircleSpaceToBatchND stb_node; + luci::CircleSpaceToBatchND node; + + stb_node.input(&node); + stb_node.block_shape(&node); + stb_node.paddings(&node); + ASSERT_NE(nullptr, stb_node.input()); + ASSERT_NE(nullptr, stb_node.block_shape()); + ASSERT_NE(nullptr, stb_node.paddings()); + + stb_node.input(nullptr); + stb_node.block_shape(nullptr); + stb_node.paddings(nullptr); + ASSERT_EQ(nullptr, stb_node.input()); + ASSERT_EQ(nullptr, stb_node.block_shape()); + ASSERT_EQ(nullptr, stb_node.paddings()); +} + +TEST(CircleSpaceToBatchNDTest, arity_NEG) +{ + luci::CircleSpaceToBatchND stb_node; + + ASSERT_NO_THROW(stb_node.arg(2)); + ASSERT_THROW(stb_node.arg(3), std::out_of_range); +} + +TEST(CircleSpaceToBatchNDTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSpaceToBatchND stb_node; + + TestVisitor tv; + ASSERT_THROW(stb_node.accept(&tv), std::exception); +} + +TEST(CircleSpaceToBatchNDTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSpaceToBatchND stb_node; + + TestVisitor tv; + ASSERT_THROW(stb_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSpaceToDepth.test.cpp b/compiler/luci/lang/src/Nodes/CircleSpaceToDepth.test.cpp new file mode 100644 index 0000000..d49a2ce --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSpaceToDepth.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSpaceToDepth.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSpaceToDepthTest, constructor) +{ + luci::CircleSpaceToDepth std_node; + + ASSERT_EQ(luci::CircleDialect::get(), std_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SPACE_TO_DEPTH, std_node.opcode()); + + ASSERT_EQ(nullptr, std_node.input()); +} + +TEST(CircleSpaceToDepthTest, input_NEG) +{ + luci::CircleSpaceToDepth std_node; + luci::CircleSpaceToDepth node; + + std_node.input(&node); + ASSERT_NE(nullptr, std_node.input()); + + std_node.input(nullptr); + ASSERT_EQ(nullptr, std_node.input()); +} + +TEST(CircleSpaceToDepthTest, arity_NEG) +{ + luci::CircleSpaceToDepth std_node; + + ASSERT_NO_THROW(std_node.arg(0)); + ASSERT_THROW(std_node.arg(1), std::out_of_range); +} + +TEST(CircleSpaceToDepthTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSpaceToDepth std_node; + + TestVisitor tv; + ASSERT_THROW(std_node.accept(&tv), std::exception); +} + +TEST(CircleSpaceToDepthTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSpaceToDepth std_node; + + TestVisitor tv; + ASSERT_THROW(std_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSparseToDense.test.cpp b/compiler/luci/lang/src/Nodes/CircleSparseToDense.test.cpp new file mode 100644 index 0000000..de3cf6e --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSparseToDense.test.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSparseToDense.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSparseToDenseTest, constructor) +{ + luci::CircleSparseToDense stb_node; + + ASSERT_EQ(luci::CircleDialect::get(), stb_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SPARSE_TO_DENSE, stb_node.opcode()); + + ASSERT_EQ(nullptr, stb_node.indices()); + ASSERT_EQ(nullptr, stb_node.output_shape()); + ASSERT_EQ(nullptr, stb_node.values()); + ASSERT_EQ(nullptr, stb_node.default_value()); + + ASSERT_EQ(true, stb_node.validate_indices()); +} + +TEST(CircleSparseToDenseTest, input_NEG) +{ + luci::CircleSparseToDense stb_node; + luci::CircleSparseToDense node; + + stb_node.indices(&node); + stb_node.output_shape(&node); + stb_node.values(&node); + stb_node.default_value(&node); + ASSERT_NE(nullptr, stb_node.indices()); + ASSERT_NE(nullptr, stb_node.output_shape()); + ASSERT_NE(nullptr, stb_node.values()); + ASSERT_NE(nullptr, stb_node.default_value()); + + stb_node.indices(nullptr); + stb_node.output_shape(nullptr); + stb_node.values(nullptr); + stb_node.default_value(nullptr); + ASSERT_EQ(nullptr, stb_node.indices()); + ASSERT_EQ(nullptr, stb_node.output_shape()); + ASSERT_EQ(nullptr, stb_node.values()); + ASSERT_EQ(nullptr, stb_node.default_value()); +} + +TEST(CircleSparseToDenseTest, arity_NEG) +{ + luci::CircleSparseToDense stb_node; + + ASSERT_NO_THROW(stb_node.arg(3)); + ASSERT_THROW(stb_node.arg(4), std::out_of_range); +} + +TEST(CircleSparseToDenseTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSparseToDense stb_node; + + TestVisitor tv; + ASSERT_THROW(stb_node.accept(&tv), std::exception); +} + +TEST(CircleSparseToDenseTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSparseToDense stb_node; + + TestVisitor tv; + ASSERT_THROW(stb_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSplit.test.cpp b/compiler/luci/lang/src/Nodes/CircleSplit.test.cpp new file mode 100644 index 0000000..acf8c44 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSplit.test.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSplit.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSplitTest, constructor) +{ + luci::CircleSplit split_node; + + ASSERT_EQ(luci::CircleDialect::get(), split_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SPLIT, split_node.opcode()); + + ASSERT_EQ(nullptr, split_node.input()); + ASSERT_EQ(nullptr, split_node.split_dim()); + ASSERT_EQ(0, split_node.num_split()); +} + +TEST(CircleSplitTest, input_NEG) +{ + luci::CircleSplit split_node; + luci::CircleSplit node; + + split_node.input(&node); + split_node.split_dim(&node); + ASSERT_NE(nullptr, split_node.input()); + ASSERT_NE(nullptr, split_node.split_dim()); + + split_node.input(nullptr); + split_node.split_dim(nullptr); + ASSERT_EQ(nullptr, split_node.input()); + ASSERT_EQ(nullptr, split_node.split_dim()); + + split_node.num_split(100); + ASSERT_NE(0, split_node.num_split()); +} + +TEST(CircleSplitTest, arity_NEG) +{ + luci::CircleSplit split_node; + + ASSERT_NO_THROW(split_node.arg(1)); + ASSERT_THROW(split_node.arg(2), std::out_of_range); +} + +TEST(CircleSplitTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSplit split_node; + + TestVisitor tv; + ASSERT_THROW(split_node.accept(&tv), std::exception); +} + +TEST(CircleSplitTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSplit split_node; + + TestVisitor tv; + ASSERT_THROW(split_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSplitOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleSplitOut.test.cpp new file mode 100644 index 0000000..e937158 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSplitOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSplitOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleSplitOutTest, constructor) +{ + luci::CircleSplitOut vout_node; + + ASSERT_EQ(luci::CircleDialect::get(), vout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLESPLITOUT, vout_node.opcode()); + + ASSERT_EQ(nullptr, vout_node.input()); + ASSERT_EQ(-1, vout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSplitV.test.cpp b/compiler/luci/lang/src/Nodes/CircleSplitV.test.cpp new file mode 100644 index 0000000..1f01608 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSplitV.test.cpp @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSplitV.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSplitVTest, constructor) +{ + luci::CircleSplitV splitv_node; + + ASSERT_EQ(luci::CircleDialect::get(), splitv_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SPLIT_V, splitv_node.opcode()); + + ASSERT_EQ(nullptr, splitv_node.input()); + ASSERT_EQ(nullptr, splitv_node.size_splits()); + ASSERT_EQ(nullptr, splitv_node.split_dim()); + ASSERT_EQ(0, splitv_node.num_split()); +} + +TEST(CircleSplitVTest, input_NEG) +{ + luci::CircleSplitV splitv_node; + luci::CircleSplitV node; + + splitv_node.input(&node); + splitv_node.size_splits(&node); + splitv_node.split_dim(&node); + ASSERT_NE(nullptr, splitv_node.input()); + ASSERT_NE(nullptr, splitv_node.size_splits()); + ASSERT_NE(nullptr, splitv_node.split_dim()); + + splitv_node.input(nullptr); + splitv_node.size_splits(nullptr); + splitv_node.split_dim(nullptr); + ASSERT_EQ(nullptr, splitv_node.input()); + ASSERT_EQ(nullptr, splitv_node.size_splits()); + ASSERT_EQ(nullptr, splitv_node.split_dim()); + + splitv_node.num_split(100); + ASSERT_NE(0, splitv_node.num_split()); +} + +TEST(CircleSplitVTest, arity_NEG) +{ + luci::CircleSplitV splitv_node; + + ASSERT_NO_THROW(splitv_node.arg(2)); + ASSERT_THROW(splitv_node.arg(3), std::out_of_range); +} + +TEST(CircleSplitVTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSplitV splitv_node; + + TestVisitor tv; + ASSERT_THROW(splitv_node.accept(&tv), std::exception); +} + +TEST(CircleSplitVTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSplitV splitv_node; + + TestVisitor tv; + ASSERT_THROW(splitv_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSplitVOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleSplitVOut.test.cpp new file mode 100644 index 0000000..2a4fe32 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSplitVOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSplitVOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleSplitVOutTest, constructor) +{ + luci::CircleSplitVOut vout_node; + + ASSERT_EQ(luci::CircleDialect::get(), vout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLESPLITVOUT, vout_node.opcode()); + + ASSERT_EQ(nullptr, vout_node.input()); + ASSERT_EQ(-1, vout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSqrt.test.cpp b/compiler/luci/lang/src/Nodes/CircleSqrt.test.cpp index 6cfb3bc..f4222fd 100644 --- a/compiler/luci/lang/src/Nodes/CircleSqrt.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleSqrt.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleSqrt.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,8 +25,52 @@ TEST(CircleSqrtTest, constructor_P) { luci::CircleSqrt sqrt_node; - ASSERT_EQ(sqrt_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(sqrt_node.opcode(), luci::CircleOpcode::SQRT); + ASSERT_EQ(luci::CircleDialect::get(), sqrt_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SQRT, sqrt_node.opcode()); - ASSERT_EQ(sqrt_node.x(), nullptr); + ASSERT_EQ(nullptr, sqrt_node.x()); +} + +TEST(CircleSqrtTest, input_NEG) +{ + luci::CircleSqrt sqrt_node; + luci::CircleSqrt node; + + sqrt_node.x(&node); + ASSERT_NE(nullptr, sqrt_node.x()); + + sqrt_node.x(nullptr); + ASSERT_EQ(nullptr, sqrt_node.x()); +} + +TEST(CircleSqrtTest, arity_NEG) +{ + luci::CircleSqrt sqrt_node; + + ASSERT_NO_THROW(sqrt_node.arg(0)); + ASSERT_THROW(sqrt_node.arg(1), std::out_of_range); +} + +TEST(CircleSqrtTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSqrt sqrt_node; + + TestVisitor tv; + ASSERT_THROW(sqrt_node.accept(&tv), std::exception); +} + +TEST(CircleSqrtTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSqrt sqrt_node; + + TestVisitor tv; + ASSERT_THROW(sqrt_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleSquare.test.cpp b/compiler/luci/lang/src/Nodes/CircleSquare.test.cpp new file mode 100644 index 0000000..3b0a86e --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSquare.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSquare.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSquareTest, constructor_P) +{ + luci::CircleSquare square_node; + + ASSERT_EQ(luci::CircleDialect::get(), square_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SQUARE, square_node.opcode()); + + ASSERT_EQ(nullptr, square_node.x()); +} + +TEST(CircleSquareTest, input_NEG) +{ + luci::CircleSquare square_node; + luci::CircleSquare node; + + square_node.x(&node); + ASSERT_NE(nullptr, square_node.x()); + + square_node.x(nullptr); + ASSERT_EQ(nullptr, square_node.x()); +} + +TEST(CircleSquareTest, arity_NEG) +{ + luci::CircleSquare square_node; + + ASSERT_NO_THROW(square_node.arg(0)); + ASSERT_THROW(square_node.arg(1), std::out_of_range); +} + +TEST(CircleSquareTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSquare square_node; + + TestVisitor tv; + ASSERT_THROW(square_node.accept(&tv), std::exception); +} + +TEST(CircleSquareTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSquare square_node; + + TestVisitor tv; + ASSERT_THROW(square_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSquaredDifference.test.cpp b/compiler/luci/lang/src/Nodes/CircleSquaredDifference.test.cpp index 71df189..ea63221 100644 --- a/compiler/luci/lang/src/Nodes/CircleSquaredDifference.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleSquaredDifference.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleSquaredDifference.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleSquaredDifferenceTest, constructor_P) { luci::CircleSquaredDifference sd_node; - ASSERT_EQ(sd_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(sd_node.opcode(), luci::CircleOpcode::SQUARED_DIFFERENCE); + ASSERT_EQ(luci::CircleDialect::get(), sd_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SQUARED_DIFFERENCE, sd_node.opcode()); - ASSERT_EQ(sd_node.x(), nullptr); - ASSERT_EQ(sd_node.y(), nullptr); + ASSERT_EQ(nullptr, sd_node.x()); + ASSERT_EQ(nullptr, sd_node.y()); +} + +TEST(CircleSquaredDifferenceTest, input_NEG) +{ + luci::CircleSquaredDifference sd_node; + luci::CircleSquaredDifference node; + + sd_node.x(&node); + sd_node.y(&node); + ASSERT_NE(nullptr, sd_node.x()); + ASSERT_NE(nullptr, sd_node.y()); + + sd_node.x(nullptr); + sd_node.y(nullptr); + ASSERT_EQ(nullptr, sd_node.x()); + ASSERT_EQ(nullptr, sd_node.y()); +} + +TEST(CircleSquaredDifferenceTest, arity_NEG) +{ + luci::CircleSquaredDifference sd_node; + + ASSERT_NO_THROW(sd_node.arg(1)); + ASSERT_THROW(sd_node.arg(2), std::out_of_range); +} + +TEST(CircleSquaredDifferenceTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSquaredDifference sd_node; + + TestVisitor tv; + ASSERT_THROW(sd_node.accept(&tv), std::exception); +} + +TEST(CircleSquaredDifferenceTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSquaredDifference sd_node; + + TestVisitor tv; + ASSERT_THROW(sd_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleSqueeze.test.cpp b/compiler/luci/lang/src/Nodes/CircleSqueeze.test.cpp new file mode 100644 index 0000000..6dc3d03 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSqueeze.test.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSqueeze.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSqueezeTest, constructor_P) +{ + luci::CircleSqueeze squeeze; + + ASSERT_EQ(luci::CircleDialect::get(), squeeze.dialect()); + ASSERT_EQ(luci::CircleOpcode::SQUEEZE, squeeze.opcode()); + + ASSERT_EQ(nullptr, squeeze.input()); + ASSERT_EQ(0, squeeze.squeeze_dims().size()); +} + +TEST(CircleSqueezeTest, squeeze_dims) +{ + luci::CircleSqueeze squeeze; + + squeeze.squeeze_dims({1, 2}); + + ASSERT_EQ(1, squeeze.squeeze_dims().at(0)); + ASSERT_EQ(2, squeeze.squeeze_dims().at(1)); +} + +TEST(CircleSqueezeTest, input_NEG) +{ + luci::CircleSqueeze squeeze_node; + luci::CircleSqueeze node; + + squeeze_node.input(&node); + ASSERT_NE(nullptr, squeeze_node.input()); + + squeeze_node.input(nullptr); + ASSERT_EQ(nullptr, squeeze_node.input()); +} + +TEST(CircleSqueezeTest, arity_NEG) +{ + luci::CircleSqueeze squeeze_node; + + ASSERT_NO_THROW(squeeze_node.arg(0)); + ASSERT_THROW(squeeze_node.arg(1), std::out_of_range); +} + +TEST(CircleSqueezeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSqueeze squeeze_node; + + TestVisitor tv; + ASSERT_THROW(squeeze_node.accept(&tv), std::exception); +} + +TEST(CircleSqueezeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSqueeze squeeze_node; + + TestVisitor tv; + ASSERT_THROW(squeeze_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleStridedSlice.test.cpp b/compiler/luci/lang/src/Nodes/CircleStridedSlice.test.cpp new file mode 100644 index 0000000..1982e7b --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleStridedSlice.test.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleStridedSlice.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleStridedSliceTest, constructor) +{ + luci::CircleStridedSlice ss_node; + + ASSERT_EQ(luci::CircleDialect::get(), ss_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::STRIDED_SLICE, ss_node.opcode()); + + ASSERT_EQ(nullptr, ss_node.input()); + ASSERT_EQ(nullptr, ss_node.begin()); + ASSERT_EQ(nullptr, ss_node.end()); + ASSERT_EQ(nullptr, ss_node.strides()); + + ASSERT_EQ(0, ss_node.begin_mask()); + ASSERT_EQ(0, ss_node.end_mask()); + ASSERT_EQ(0, ss_node.ellipsis_mask()); + ASSERT_EQ(0, ss_node.new_axis_mask()); + ASSERT_EQ(0, ss_node.shrink_axis_mask()); +} + +TEST(CircleStridedSliceTest, input_NEG) +{ + luci::CircleStridedSlice ss_node; + luci::CircleStridedSlice node; + + ss_node.input(&node); + ss_node.begin(&node); + ss_node.end(&node); + ss_node.strides(&node); + ASSERT_NE(nullptr, ss_node.input()); + ASSERT_NE(nullptr, ss_node.begin()); + ASSERT_NE(nullptr, ss_node.end()); + ASSERT_NE(nullptr, ss_node.strides()); + + ss_node.input(nullptr); + ss_node.begin(nullptr); + ss_node.end(nullptr); + ss_node.strides(nullptr); + ASSERT_EQ(nullptr, ss_node.input()); + ASSERT_EQ(nullptr, ss_node.begin()); + ASSERT_EQ(nullptr, ss_node.end()); + ASSERT_EQ(nullptr, ss_node.strides()); + + ss_node.begin_mask(1); + ss_node.end_mask(1); + ss_node.ellipsis_mask(1); + ss_node.new_axis_mask(1); + ss_node.shrink_axis_mask(1); + ASSERT_NE(0, ss_node.begin_mask()); + ASSERT_NE(0, ss_node.end_mask()); + ASSERT_NE(0, ss_node.ellipsis_mask()); + ASSERT_NE(0, ss_node.new_axis_mask()); + ASSERT_NE(0, ss_node.shrink_axis_mask()); +} + +TEST(CircleStridedSliceTest, arity_NEG) +{ + luci::CircleStridedSlice ss_node; + + ASSERT_NO_THROW(ss_node.arg(3)); + ASSERT_THROW(ss_node.arg(4), std::out_of_range); +} + +TEST(CircleStridedSliceTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleStridedSlice ss_node; + + TestVisitor tv; + ASSERT_THROW(ss_node.accept(&tv), std::exception); +} + +TEST(CircleStridedSliceTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleStridedSlice ss_node; + + TestVisitor tv; + ASSERT_THROW(ss_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleSub.test.cpp b/compiler/luci/lang/src/Nodes/CircleSub.test.cpp index ebb2944..92c674b 100644 --- a/compiler/luci/lang/src/Nodes/CircleSub.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleSub.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleSub.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleSubTest, constructor_P) { luci::CircleSub sub_node; - ASSERT_EQ(sub_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(sub_node.opcode(), luci::CircleOpcode::SUB); + ASSERT_EQ(luci::CircleDialect::get(), sub_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SUB, sub_node.opcode()); - ASSERT_EQ(sub_node.x(), nullptr); - ASSERT_EQ(sub_node.y(), nullptr); + ASSERT_EQ(nullptr, sub_node.x()); + ASSERT_EQ(nullptr, sub_node.y()); +} + +TEST(CircleSubTest, input_NEG) +{ + luci::CircleSub sub_node; + luci::CircleSub node; + + sub_node.x(&node); + sub_node.y(&node); + ASSERT_NE(nullptr, sub_node.x()); + ASSERT_NE(nullptr, sub_node.y()); + + sub_node.x(nullptr); + sub_node.y(nullptr); + ASSERT_EQ(nullptr, sub_node.x()); + ASSERT_EQ(nullptr, sub_node.y()); +} + +TEST(CircleSubTest, arity_NEG) +{ + luci::CircleSub sub_node; + + ASSERT_NO_THROW(sub_node.arg(1)); + ASSERT_THROW(sub_node.arg(2), std::out_of_range); +} + +TEST(CircleSubTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSub sub_node; + + TestVisitor tv; + ASSERT_THROW(sub_node.accept(&tv), std::exception); +} + +TEST(CircleSubTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSub sub_node; + + TestVisitor tv; + ASSERT_THROW(sub_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleSum.test.cpp b/compiler/luci/lang/src/Nodes/CircleSum.test.cpp new file mode 100644 index 0000000..84b51d6 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleSum.test.cpp @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleSum.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleSumTest, constructor_P) +{ + luci::CircleSum sum_node; + + ASSERT_EQ(luci::CircleDialect::get(), sum_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::SUM, sum_node.opcode()); + + ASSERT_EQ(nullptr, sum_node.input()); + ASSERT_EQ(nullptr, sum_node.reduction_indices()); + ASSERT_EQ(false, sum_node.keep_dims()); +} + +TEST(CircleSumTest, input_NEG) +{ + luci::CircleSum sum_node; + luci::CircleSum node; + + sum_node.input(&node); + sum_node.reduction_indices(&node); + ASSERT_NE(nullptr, sum_node.input()); + ASSERT_NE(nullptr, sum_node.reduction_indices()); + + sum_node.input(nullptr); + sum_node.reduction_indices(nullptr); + ASSERT_EQ(nullptr, sum_node.input()); + ASSERT_EQ(nullptr, sum_node.reduction_indices()); + + sum_node.keep_dims(true); + ASSERT_TRUE(sum_node.keep_dims()); +} + +TEST(CircleSumTest, arity_NEG) +{ + luci::CircleSum sum_node; + + ASSERT_NO_THROW(sum_node.arg(1)); + ASSERT_THROW(sum_node.arg(2), std::out_of_range); +} + +TEST(CircleSumTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleSum sum_node; + + TestVisitor tv; + ASSERT_THROW(sum_node.accept(&tv), std::exception); +} + +TEST(CircleSumTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleSum sum_node; + + TestVisitor tv; + ASSERT_THROW(sum_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleTanh.test.cpp b/compiler/luci/lang/src/Nodes/CircleTanh.test.cpp new file mode 100644 index 0000000..257ecb2 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleTanh.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleTanh.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleTanhTest, constructor) +{ + luci::CircleTanh tanh_node; + + ASSERT_EQ(luci::CircleDialect::get(), tanh_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::TANH, tanh_node.opcode()); + + ASSERT_EQ(nullptr, tanh_node.x()); +} + +TEST(CircleTanhTest, input_NEG) +{ + luci::CircleTanh neg_node; + luci::CircleTanh node; + + neg_node.x(&node); + ASSERT_NE(nullptr, neg_node.x()); + + neg_node.x(nullptr); + ASSERT_EQ(nullptr, neg_node.x()); +} + +TEST(CircleTanhTest, arity_NEG) +{ + luci::CircleTanh neg_node; + + ASSERT_NO_THROW(neg_node.arg(0)); + ASSERT_THROW(neg_node.arg(1), std::out_of_range); +} + +TEST(CircleTanhTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleTanh neg_node; + + TestVisitor tv; + ASSERT_THROW(neg_node.accept(&tv), std::exception); +} + +TEST(CircleTanhTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleTanh neg_node; + + TestVisitor tv; + ASSERT_THROW(neg_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleTile.test.cpp b/compiler/luci/lang/src/Nodes/CircleTile.test.cpp new file mode 100644 index 0000000..1695165 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleTile.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleTile.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleTileTest, constructor) +{ + luci::CircleTile tile_node; + + ASSERT_EQ(luci::CircleDialect::get(), tile_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::TILE, tile_node.opcode()); + + ASSERT_EQ(nullptr, tile_node.input()); + ASSERT_EQ(nullptr, tile_node.multiples()); +} + +TEST(CircleTileTest, input_NEG) +{ + luci::CircleTile tile_node; + luci::CircleTile node; + + tile_node.input(&node); + tile_node.multiples(&node); + ASSERT_NE(nullptr, tile_node.input()); + ASSERT_NE(nullptr, tile_node.multiples()); + + tile_node.input(nullptr); + tile_node.multiples(nullptr); + ASSERT_EQ(nullptr, tile_node.input()); + ASSERT_EQ(nullptr, tile_node.multiples()); +} + +TEST(CircleTileTest, arity_NEG) +{ + luci::CircleTile tile_node; + + ASSERT_NO_THROW(tile_node.arg(1)); + ASSERT_THROW(tile_node.arg(2), std::out_of_range); +} + +TEST(CircleTileTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleTile tile_node; + + TestVisitor tv; + ASSERT_THROW(tile_node.accept(&tv), std::exception); +} + +TEST(CircleTileTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleTile tile_node; + + TestVisitor tv; + ASSERT_THROW(tile_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleTopKV2.test.cpp b/compiler/luci/lang/src/Nodes/CircleTopKV2.test.cpp new file mode 100644 index 0000000..31478d3 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleTopKV2.test.cpp @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleTopKV2.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleTopKV2Test, constructor) +{ + luci::CircleTopKV2 topkv2_node; + + ASSERT_EQ(luci::CircleDialect::get(), topkv2_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::TOPK_V2, topkv2_node.opcode()); + + ASSERT_EQ(nullptr, topkv2_node.input()); + ASSERT_EQ(nullptr, topkv2_node.k()); +} + +TEST(CircleTopKV2Test, input_NEG) +{ + luci::CircleTopKV2 topkv2_node; + luci::CircleTopKV2 node; + + topkv2_node.input(&node); + topkv2_node.k(&node); + ASSERT_NE(nullptr, topkv2_node.input()); + ASSERT_NE(nullptr, topkv2_node.k()); + + topkv2_node.input(nullptr); + topkv2_node.k(nullptr); + ASSERT_EQ(nullptr, topkv2_node.input()); + ASSERT_EQ(nullptr, topkv2_node.k()); +} + +TEST(CircleTopKV2Test, arity_NEG) +{ + luci::CircleTopKV2 topkv2_node; + + ASSERT_NO_THROW(topkv2_node.arg(1)); + ASSERT_THROW(topkv2_node.arg(2), std::out_of_range); +} + +TEST(CircleTopKV2Test, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleTopKV2 topkv2_node; + + TestVisitor tv; + ASSERT_THROW(topkv2_node.accept(&tv), std::exception); +} + +TEST(CircleTopKV2Test, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleTopKV2 topkv2_node; + + TestVisitor tv; + ASSERT_THROW(topkv2_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleTopKV2Out.test.cpp b/compiler/luci/lang/src/Nodes/CircleTopKV2Out.test.cpp new file mode 100644 index 0000000..d0835a2 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleTopKV2Out.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleTopKV2Out.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleTopKV2OutTest, constructor) +{ + luci::CircleTopKV2Out topout_node; + + ASSERT_EQ(luci::CircleDialect::get(), topout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLETOPKV2OUT, topout_node.opcode()); + + ASSERT_EQ(nullptr, topout_node.input()); + ASSERT_EQ(-1, topout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleTranspose.test.cpp b/compiler/luci/lang/src/Nodes/CircleTranspose.test.cpp index 7233869..f4db3f3 100644 --- a/compiler/luci/lang/src/Nodes/CircleTranspose.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleTranspose.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleTranspose.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,9 +25,57 @@ TEST(CircleTransposeTest, constructor_P) { luci::CircleTranspose tr_node; - ASSERT_EQ(tr_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(tr_node.opcode(), luci::CircleOpcode::TRANSPOSE); + ASSERT_EQ(luci::CircleDialect::get(), tr_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::TRANSPOSE, tr_node.opcode()); - ASSERT_EQ(tr_node.a(), nullptr); - ASSERT_EQ(tr_node.perm(), nullptr); + ASSERT_EQ(nullptr, tr_node.a()); + ASSERT_EQ(nullptr, tr_node.perm()); +} + +TEST(CircleTransposeTest, input_NEG) +{ + luci::CircleTranspose tr_node; + luci::CircleTranspose node; + + tr_node.a(&node); + tr_node.perm(&node); + ASSERT_NE(nullptr, tr_node.a()); + ASSERT_NE(nullptr, tr_node.perm()); + + tr_node.a(nullptr); + tr_node.perm(nullptr); + ASSERT_EQ(nullptr, tr_node.a()); + ASSERT_EQ(nullptr, tr_node.perm()); +} + +TEST(CircleTransposeTest, arity_NEG) +{ + luci::CircleTranspose tr_node; + + ASSERT_NO_THROW(tr_node.arg(1)); + ASSERT_THROW(tr_node.arg(2), std::out_of_range); +} + +TEST(CircleTransposeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleTranspose tr_node; + + TestVisitor tv; + ASSERT_THROW(tr_node.accept(&tv), std::exception); +} + +TEST(CircleTransposeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleTranspose tr_node; + + TestVisitor tv; + ASSERT_THROW(tr_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleTransposeConv.test.cpp b/compiler/luci/lang/src/Nodes/CircleTransposeConv.test.cpp index 9615082..4291697 100644 --- a/compiler/luci/lang/src/Nodes/CircleTransposeConv.test.cpp +++ b/compiler/luci/lang/src/Nodes/CircleTransposeConv.test.cpp @@ -17,6 +17,7 @@ #include "luci/IR/Nodes/CircleTransposeConv.h" #include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" #include @@ -24,10 +25,74 @@ TEST(CircleTransposeConvTest, constructor_P) { luci::CircleTransposeConv trc_node; - ASSERT_EQ(trc_node.dialect(), luci::CircleDialect::get()); - ASSERT_EQ(trc_node.opcode(), luci::CircleOpcode::TRANSPOSE_CONV); + ASSERT_EQ(luci::CircleDialect::get(), trc_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::TRANSPOSE_CONV, trc_node.opcode()); - ASSERT_EQ(trc_node.inputSizes(), nullptr); - ASSERT_EQ(trc_node.filter(), nullptr); - ASSERT_EQ(trc_node.outBackprop(), nullptr); + ASSERT_EQ(nullptr, trc_node.inputSizes()); + ASSERT_EQ(nullptr, trc_node.filter()); + ASSERT_EQ(nullptr, trc_node.outBackprop()); + + ASSERT_EQ(luci::Padding::UNDEFINED, trc_node.padding()); + ASSERT_EQ(1, trc_node.stride()->h()); + ASSERT_EQ(1, trc_node.stride()->w()); +} + +TEST(CircleTransposeConvTest, input_NEG) +{ + luci::CircleTransposeConv trc_node; + luci::CircleTransposeConv node; + + trc_node.inputSizes(&node); + trc_node.filter(&node); + trc_node.outBackprop(&node); + ASSERT_NE(nullptr, trc_node.inputSizes()); + ASSERT_NE(nullptr, trc_node.filter()); + ASSERT_NE(nullptr, trc_node.outBackprop()); + + trc_node.inputSizes(nullptr); + trc_node.filter(nullptr); + trc_node.outBackprop(nullptr); + ASSERT_EQ(nullptr, trc_node.inputSizes()); + ASSERT_EQ(nullptr, trc_node.filter()); + ASSERT_EQ(nullptr, trc_node.outBackprop()); + + trc_node.padding(luci::Padding::SAME); + ASSERT_NE(luci::Padding::UNDEFINED, trc_node.padding()); + + trc_node.stride()->h(2); + trc_node.stride()->w(2); + ASSERT_EQ(2, trc_node.stride()->h()); + ASSERT_EQ(2, trc_node.stride()->w()); +} + +TEST(CircleTransposeConvTest, arity_NEG) +{ + luci::CircleTransposeConv trc_node; + + ASSERT_NO_THROW(trc_node.arg(2)); + ASSERT_THROW(trc_node.arg(3), std::out_of_range); +} + +TEST(CircleTransposeConvTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleTransposeConv trc_node; + + TestVisitor tv; + ASSERT_THROW(trc_node.accept(&tv), std::exception); +} + +TEST(CircleTransposeConvTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleTransposeConv trc_node; + + TestVisitor tv; + ASSERT_THROW(trc_node.accept(&tv), std::exception); } diff --git a/compiler/luci/lang/src/Nodes/CircleUnpack.test.cpp b/compiler/luci/lang/src/Nodes/CircleUnpack.test.cpp new file mode 100644 index 0000000..4323028 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleUnpack.test.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleUnpack.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleUnpackTest, constructor) +{ + luci::CircleUnpack unpack_node; + + ASSERT_EQ(luci::CircleDialect::get(), unpack_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::UNPACK, unpack_node.opcode()); + + ASSERT_EQ(nullptr, unpack_node.value()); + ASSERT_EQ(0, unpack_node.num()); + ASSERT_EQ(0, unpack_node.axis()); +} + +TEST(CircleUnpackTest, input_NEG) +{ + luci::CircleUnpack unpack_node; + luci::CircleUnpack node; + + unpack_node.value(&node); + ASSERT_NE(nullptr, unpack_node.value()); + + unpack_node.value(nullptr); + ASSERT_EQ(nullptr, unpack_node.value()); + + unpack_node.num(1); + unpack_node.axis(1); + ASSERT_NE(0, unpack_node.num()); + ASSERT_NE(0, unpack_node.axis()); +} + +TEST(CircleUnpackTest, arity_NEG) +{ + luci::CircleUnpack unpack_node; + + ASSERT_NO_THROW(unpack_node.arg(0)); + ASSERT_THROW(unpack_node.arg(1), std::out_of_range); +} + +TEST(CircleUnpackTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleUnpack unpack_node; + + TestVisitor tv; + ASSERT_THROW(unpack_node.accept(&tv), std::exception); +} + +TEST(CircleUnpackTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleUnpack unpack_node; + + TestVisitor tv; + ASSERT_THROW(unpack_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleUnpackOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleUnpackOut.test.cpp new file mode 100644 index 0000000..7b8a41b --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleUnpackOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleUnpackOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleUnpackOutTest, constructor) +{ + luci::CircleUnpackOut unpackout_node; + + ASSERT_EQ(luci::CircleDialect::get(), unpackout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLEUNPACKOUT, unpackout_node.opcode()); + + ASSERT_EQ(nullptr, unpackout_node.input()); + ASSERT_EQ(0, unpackout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleWhere.test.cpp b/compiler/luci/lang/src/Nodes/CircleWhere.test.cpp new file mode 100644 index 0000000..287eda4 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleWhere.test.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleWhere.h" +#include "luci/IR/Nodes/CircleInput.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleWhereTest, constructor_P) +{ + luci::CircleWhere where_node; + + ASSERT_EQ(luci::CircleDialect::get(), where_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::WHERE, where_node.opcode()); + + ASSERT_EQ(1, where_node.arity()); + ASSERT_EQ(nullptr, where_node.condition()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleWhile.test.cpp b/compiler/luci/lang/src/Nodes/CircleWhile.test.cpp new file mode 100644 index 0000000..19290c0 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleWhile.test.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleWhile.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleWhileTest, constructor) +{ + luci::CircleWhile while_node(2, 2); + + ASSERT_EQ(luci::CircleDialect::get(), while_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::WHILE, while_node.opcode()); + + ASSERT_EQ(2, while_node.input_count()); + ASSERT_EQ(2, while_node.output_count()); + + ASSERT_EQ(nullptr, while_node.input(0)); + ASSERT_EQ(nullptr, while_node.input(1)); + + ASSERT_EQ(-1, while_node.cond_branch()); + ASSERT_EQ(-1, while_node.body_branch()); +} + +TEST(CircleWhileTestDeath, invalid_arity_NEG) +{ + ASSERT_DEBUG_DEATH(luci::CircleWhile very_long_name_while_node(0, 1), ""); +} + +TEST(CircleWhileTestDeath, invalid_output_count_NEG) +{ + ASSERT_DEBUG_DEATH(luci::CircleWhile while_node(2, 0), ""); +} + +TEST(CircleWhileTestDeath, invalid_input_get_index_NEG) +{ + luci::CircleWhile while_node(2, 2); + + EXPECT_ANY_THROW(while_node.input(100)); +} + +TEST(CircleWhileTestDeath, invalid_input_set_index_NEG) +{ + luci::CircleWhile while_node(2, 2); + + EXPECT_ANY_THROW(while_node.input(100, nullptr)); +} + +TEST(CircleWhileTestDeath, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleWhile while_node(2, 2); + + TestVisitor tv; + ASSERT_THROW(while_node.accept(&tv), std::exception); +} + +TEST(CircleWhileTestDeath, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleWhile while_node(2, 2); + + TestVisitor tv; + ASSERT_THROW(while_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/lang/src/Nodes/CircleWhileOut.test.cpp b/compiler/luci/lang/src/Nodes/CircleWhileOut.test.cpp new file mode 100644 index 0000000..1800e40 --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleWhileOut.test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleWhileOut.h" + +#include "luci/IR/CircleDialect.h" + +#include + +TEST(CircleWhileOutTest, constructor) +{ + luci::CircleWhileOut whileout_node; + + ASSERT_EQ(luci::CircleDialect::get(), whileout_node.dialect()); + ASSERT_EQ(luci::CircleOpcode::CIRCLEWHILEOUT, whileout_node.opcode()); + + ASSERT_EQ(nullptr, whileout_node.input()); + ASSERT_EQ(-1, whileout_node.index()); +} diff --git a/compiler/luci/lang/src/Nodes/CircleZerosLike.test.cpp b/compiler/luci/lang/src/Nodes/CircleZerosLike.test.cpp new file mode 100644 index 0000000..3368c8e --- /dev/null +++ b/compiler/luci/lang/src/Nodes/CircleZerosLike.test.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/IR/Nodes/CircleZerosLike.h" + +#include "luci/IR/CircleDialect.h" +#include "luci/IR/CircleNodeVisitor.h" + +#include + +TEST(CircleZerosLikeTest, constructor_P) +{ + luci::CircleZerosLike node; + + ASSERT_EQ(luci::CircleDialect::get(), node.dialect()); + ASSERT_EQ(luci::CircleOpcode::ZEROS_LIKE, node.opcode()); + + ASSERT_EQ(nullptr, node.input()); +} + +TEST(CircleZerosLikeTest, input_NEG) +{ + luci::CircleZerosLike zeros_node; + luci::CircleZerosLike node; + + zeros_node.input(&node); + ASSERT_NE(nullptr, zeros_node.input()); + + zeros_node.input(nullptr); + ASSERT_EQ(nullptr, zeros_node.input()); +} + +TEST(CircleZerosLikeTest, arity_NEG) +{ + luci::CircleZerosLike zeros_node; + + ASSERT_NO_THROW(zeros_node.arg(0)); + ASSERT_THROW(zeros_node.arg(1), std::out_of_range); +} + +TEST(CircleZerosLikeTest, visit_mutable_NEG) +{ + struct TestVisitor final : public luci::CircleNodeMutableVisitor + { + }; + + luci::CircleZerosLike zeros_node; + + TestVisitor tv; + ASSERT_THROW(zeros_node.accept(&tv), std::exception); +} + +TEST(CircleZerosLikeTest, visit_NEG) +{ + struct TestVisitor final : public luci::CircleNodeVisitor + { + }; + + luci::CircleZerosLike zeros_node; + + TestVisitor tv; + ASSERT_THROW(zeros_node.accept(&tv), std::exception); +} diff --git a/compiler/luci/log/CMakeLists.txt b/compiler/luci/log/CMakeLists.txt index af2e7a7..5e82287 100644 --- a/compiler/luci/log/CMakeLists.txt +++ b/compiler/luci/log/CMakeLists.txt @@ -6,4 +6,5 @@ target_include_directories(luci_log PUBLIC include) target_link_libraries(luci_log PUBLIC hermes) target_link_libraries(luci_log PRIVATE hermes_std) target_link_libraries(luci_log PRIVATE nncc_common) +target_link_libraries(luci_log PRIVATE luci_env) install(TARGETS luci_log DESTINATION lib) diff --git a/compiler/luci/log/include/luci/Log.h b/compiler/luci/log/include/luci/Log.h index 51299a0..e148810 100644 --- a/compiler/luci/log/include/luci/Log.h +++ b/compiler/luci/log/include/luci/Log.h @@ -35,7 +35,7 @@ public: /** * @brief Logger Configuration * - * Users are able to turn logging on/off via MOCO_LOG environment variable. + * Users are able to turn logging on/off via LUCI_LOG environment variable. */ class LoggerConfig final : public hermes::Config { @@ -47,7 +47,9 @@ public: void configure(const Logger *, hermes::Source::Setting &) const; private: - bool _enabled; + bool _show_warn = true; + bool _show_info = false; + int _show_verbose = 0; }; } // namespace luci @@ -64,8 +66,10 @@ private: */ #define LOGGER(name) ::luci::Logger name{::luci::LoggingContext::get()}; -// TODO Support FATAL, ERROR, WARN, and VERBOSE +// TODO Support FATAL, ERROR #define INFO(name) HERMES_INFO(name) +#define WARN(name) HERMES_WARN(name) +#define VERBOSE(name, lv) HERMES_VERBOSE(name, lv) // WARNING! // diff --git a/compiler/luci/log/src/Log.cpp b/compiler/luci/log/src/Log.cpp index 7e16340..c26bf30 100644 --- a/compiler/luci/log/src/Log.cpp +++ b/compiler/luci/log/src/Log.cpp @@ -16,6 +16,8 @@ #include "luci/Log.h" +#include + #include #include #include @@ -36,6 +38,11 @@ template <> bool safecast(const char *s, const bool &value) return (s == nullptr) ? value : (std::stoi(s) != 0); } +template <> int safecast(const char *s, const int &value) +{ + return (s == nullptr) ? value : std::stoi(s); +} + } // namespace // @@ -57,8 +64,16 @@ namespace luci LoggerConfig::LoggerConfig() { - // Turn on logging if LUCI_LOG is set as non-zero value - _enabled = safecast(std::getenv("LUCI_LOG"), false); + auto settings = luci::UserSettings::settings(); + + _show_warn = !settings->get(luci::UserSettings::Key::MuteWarnings); + + // Turn on info logging if LUCI_LOG is set as non-zero value + _show_info = safecast(std::getenv("LUCI_LOG"), false); + + // Turn on verbose logging if LUCI_LOG is set to some level + // VERBOSE(l, 1) will be visible with LUCI_LOG=2 and VERBOSE(l, 2) with LUCI_LOG=3 and so on + _show_verbose = safecast(std::getenv("LUCI_LOG"), 0); } void LoggerConfig::configure(const hermes::Source *source, hermes::Source::Setting &setting) const @@ -72,15 +87,24 @@ void LoggerConfig::configure(const hermes::Source *source, hermes::Source::Setti void LoggerConfig::configure(const Logger *, hermes::Source::Setting &setting) const { - if (_enabled) + setting.filter(hermes::SeverityCategory::FATAL).reject_all(); + setting.filter(hermes::SeverityCategory::ERROR).reject_all(); + setting.filter(hermes::SeverityCategory::WARN).reject_all(); + setting.filter(hermes::SeverityCategory::INFO).reject_all(); + setting.filter(hermes::SeverityCategory::VERBOSE).reject_all(); + + // TODO enable FATAL and ERROR + if (_show_warn) + { + setting.filter(hermes::SeverityCategory::WARN).accept_all(); + } + if (_show_info) { - // Enable all catagories - setting.accept_all(); + setting.filter(hermes::SeverityCategory::INFO).accept_all(); } - else + if (_show_verbose) { - // Disable all catagories - setting.reject_all(); + setting.filter(hermes::SeverityCategory::VERBOSE).accept_upto(_show_verbose); } } diff --git a/compiler/luci/logex/src/FormattedGraph.cpp b/compiler/luci/logex/src/FormattedGraph.cpp index 894ebc1..4725ee3 100644 --- a/compiler/luci/logex/src/FormattedGraph.cpp +++ b/compiler/luci/logex/src/FormattedGraph.cpp @@ -78,6 +78,8 @@ const char *to_str(loco::DataType type) } } +const char *to_str(bool value) { return value ? "true" : "false"; } + const char *to_str(luci::FusedActFunc fused) { switch (fused) @@ -108,6 +110,19 @@ const char *to_str(luci::Padding padding) } } +const char *to_str(luci::MirrorPadMode mode) +{ + switch (mode) + { + case luci::MirrorPadMode::REFLECT: + return "REFLECT"; + case luci::MirrorPadMode::SYMMETRIC: + return "SYMMETRIC"; + default: + return "Error"; + } +} + std::string to_str(const luci::Stride *stride) { return pepper::str(stride->h(), ",", stride->w()); @@ -180,43 +195,187 @@ private: #define IMPLEMENT(CLASS) bool summary(const CLASS *, locop::NodeSummary &) const final; IMPLEMENT(luci::CircleAbs) IMPLEMENT(luci::CircleAdd) + IMPLEMENT(luci::CircleAddN) IMPLEMENT(luci::CircleArgMax) + IMPLEMENT(luci::CircleArgMin) IMPLEMENT(luci::CircleAveragePool2D) + IMPLEMENT(luci::CircleBatchMatMul) IMPLEMENT(luci::CircleBatchToSpaceND) + IMPLEMENT(luci::CircleCast) + IMPLEMENT(luci::CircleCeil) IMPLEMENT(luci::CircleConcatenation) IMPLEMENT(luci::CircleConst) IMPLEMENT(luci::CircleConv2D) IMPLEMENT(luci::CircleCos) + IMPLEMENT(luci::CircleCustom) + IMPLEMENT(luci::CircleDepthToSpace) IMPLEMENT(luci::CircleDepthwiseConv2D) IMPLEMENT(luci::CircleDiv) + IMPLEMENT(luci::CircleElu) IMPLEMENT(luci::CircleExp) + IMPLEMENT(luci::CircleExpandDims) + IMPLEMENT(luci::CircleFill) + IMPLEMENT(luci::CircleFloor) + IMPLEMENT(luci::CircleFloorDiv) + IMPLEMENT(luci::CircleFloorMod) IMPLEMENT(luci::CircleFullyConnected) + IMPLEMENT(luci::CircleGather) + IMPLEMENT(luci::CircleGatherNd) + IMPLEMENT(luci::CircleGreater) + IMPLEMENT(luci::CircleGreaterEqual) + IMPLEMENT(luci::CircleIf) + IMPLEMENT(luci::CircleL2Normalize) + IMPLEMENT(luci::CircleLeakyRelu) + IMPLEMENT(luci::CircleLess) + IMPLEMENT(luci::CircleLessEqual) + IMPLEMENT(luci::CircleLocalResponseNormalization) + IMPLEMENT(luci::CircleLog) + IMPLEMENT(luci::CircleLogicalAnd) IMPLEMENT(luci::CircleLogicalNot) IMPLEMENT(luci::CircleLogicalOr) + IMPLEMENT(luci::CircleLogistic) + IMPLEMENT(luci::CircleLogSoftmax) + IMPLEMENT(luci::CircleMatrixDiag) + IMPLEMENT(luci::CircleMatrixSetDiag) IMPLEMENT(luci::CircleMaximum) IMPLEMENT(luci::CircleMaxPool2D) IMPLEMENT(luci::CircleMean) + IMPLEMENT(luci::CircleMinimum) + IMPLEMENT(luci::CircleMirrorPad) IMPLEMENT(luci::CircleMul) + IMPLEMENT(luci::CircleNeg) + IMPLEMENT(luci::CircleNotEqual) + IMPLEMENT(luci::CircleOneHot) IMPLEMENT(luci::CirclePack) IMPLEMENT(luci::CirclePad) + IMPLEMENT(luci::CirclePow) + IMPLEMENT(luci::CirclePRelu) + IMPLEMENT(luci::CircleRange) + IMPLEMENT(luci::CircleRank) + IMPLEMENT(luci::CircleReduceAny) + IMPLEMENT(luci::CircleReduceMax) + IMPLEMENT(luci::CircleReduceMin) + IMPLEMENT(luci::CircleReduceProd) IMPLEMENT(luci::CircleRelu) IMPLEMENT(luci::CircleRelu6) + IMPLEMENT(luci::CircleReluN1To1) IMPLEMENT(luci::CircleReshape) + IMPLEMENT(luci::CircleResizeBilinear) + IMPLEMENT(luci::CircleResizeNearestNeighbor) + IMPLEMENT(luci::CircleReverseSequence) + IMPLEMENT(luci::CircleReverseV2) + IMPLEMENT(luci::CircleRound) IMPLEMENT(luci::CircleRsqrt) + IMPLEMENT(luci::CircleScatterNd) + IMPLEMENT(luci::CircleSegmentSum) + IMPLEMENT(luci::CircleSelect) + IMPLEMENT(luci::CircleSelectV2) + IMPLEMENT(luci::CircleShape) + IMPLEMENT(luci::CircleSin) + IMPLEMENT(luci::CircleSlice) IMPLEMENT(luci::CircleSoftmax) + IMPLEMENT(luci::CircleSpaceToBatchND) + IMPLEMENT(luci::CircleSpaceToDepth) + IMPLEMENT(luci::CircleSparseToDense) + IMPLEMENT(luci::CircleSplit) + IMPLEMENT(luci::CircleSplitV) IMPLEMENT(luci::CircleSqrt) + IMPLEMENT(luci::CircleSquare) IMPLEMENT(luci::CircleSquaredDifference) + IMPLEMENT(luci::CircleSqueeze) + IMPLEMENT(luci::CircleStridedSlice) IMPLEMENT(luci::CircleSub) + IMPLEMENT(luci::CircleSum) + IMPLEMENT(luci::CircleTanh) + IMPLEMENT(luci::CircleTile) + IMPLEMENT(luci::CircleTopKV2) IMPLEMENT(luci::CircleTranspose) IMPLEMENT(luci::CircleTransposeConv) + IMPLEMENT(luci::CircleUnpack) + IMPLEMENT(luci::CircleWhere) + IMPLEMENT(luci::CircleWhile) + IMPLEMENT(luci::CircleZerosLike) // Circle Only + IMPLEMENT(luci::CircleBCQFullyConnected) + IMPLEMENT(luci::CircleBCQGather) IMPLEMENT(luci::CircleInstanceNorm) // Virtual nodes IMPLEMENT(luci::CircleInput) IMPLEMENT(luci::CircleOutput) + IMPLEMENT(luci::CircleIfOut) + IMPLEMENT(luci::CircleSplitOut) + IMPLEMENT(luci::CircleSplitVOut) + IMPLEMENT(luci::CircleTopKV2Out) + IMPLEMENT(luci::CircleUnpackOut) + IMPLEMENT(luci::CircleWhileOut) #undef IMPLEMENT }; +template +bool use_x(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("x", tbl->lookup(node->x())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_input(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("input", tbl->lookup(node->input())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_features(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("features", tbl->lookup(node->features())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_xy(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("x", tbl->lookup(node->x())); + s.args().append("y", tbl->lookup(node->y())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_xy_act(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); + + s.args().append("x", tbl->lookup(node->x())); + s.args().append("y", tbl->lookup(node->y())); + s.args().append("fused_activation_function", to_str(node->fusedActivationFunction())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_reducer(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("input", tbl->lookup(node->input())); + s.args().append("reduction_indices", tbl->lookup(node->reduction_indices())); + s.args().append("keep_dims", node->keep_dims() ? "true" : "false"); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +template +bool use_ido(const locop::SymbolTable *tbl, const CIRCLENODE *node, locop::NodeSummary &s) +{ + s.args().append("input", tbl->lookup(node->input())); + s.args().append("dimension", tbl->lookup(node->dimension())); + s.args().append("output_type", to_str(node->output_type())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + bool CircleNodeSummaryBuilderBase::build(const loco::Node *node, locop::NodeSummary &s) const { if (node->dialect() != luci::CircleDialect::get()) @@ -236,29 +395,31 @@ bool CircleNodeSummaryBuilderBase::build(const loco::Node *node, locop::NodeSumm bool CircleNodeSummaryBuilder::summary(const luci::CircleAbs *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_x(tbl(), node, s); } bool CircleNodeSummaryBuilder::summary(const luci::CircleAdd *node, locop::NodeSummary &s) const { - assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); + return use_xy_act(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleAddN *node, locop::NodeSummary &s) const +{ + for (uint32_t i = 0; i < node->arity(); ++i) + s.args().append("inputs", tbl()->lookup(node->inputs(i))); - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); - s.args().append("fused_activation_function", to_str(node->fusedActivationFunction())); s.state(locop::NodeSummary::State::Complete); return true; } bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMax *node, locop::NodeSummary &s) const { - s.args().append("input", tbl()->lookup(node->input())); - s.args().append("dimension", tbl()->lookup(node->dimension())); - s.args().append("output_type", to_str(node->output_type())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_ido(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleArgMin *node, locop::NodeSummary &s) const +{ + return use_ido(tbl(), node, s); } bool CircleNodeSummaryBuilder::summary(const luci::CircleAveragePool2D *node, @@ -277,6 +438,17 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleAveragePool2D *node, return true; } +bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchMatMul *node, + locop::NodeSummary &s) const +{ + s.args().append("x", tbl()->lookup(node->x())); + s.args().append("y", tbl()->lookup(node->y())); + s.args().append("adj_x", to_str(node->adj_x())); + s.args().append("adj_y", to_str(node->adj_y())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchToSpaceND *node, locop::NodeSummary &s) const { @@ -289,6 +461,20 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleBatchToSpaceND *node, return true; } +bool CircleNodeSummaryBuilder::summary(const luci::CircleCast *node, locop::NodeSummary &s) const +{ + s.args().append("x", tbl()->lookup(node->x())); + s.args().append("in_data_type", to_str(node->in_data_type())); + s.args().append("out_data_type", to_str(node->out_data_type())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleCeil *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + bool CircleNodeSummaryBuilder::summary(const luci::CircleConcatenation *node, locop::NodeSummary &s) const { @@ -318,6 +504,8 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleConv2D *node, locop::No s.args().append("bias", tbl()->lookup(node->bias())); s.args().append("stride(h,w)", to_str(node->stride())); + s.args().append("dilation(h,w)", to_str(node->dilation())); + s.args().append("padding", to_str(node->padding())); s.args().append("fused", to_str(node->fusedActivationFunction())); @@ -328,8 +516,28 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleConv2D *node, locop::No bool CircleNodeSummaryBuilder::summary(const luci::CircleCos *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleCustom *node, locop::NodeSummary &s) const +{ + for (uint32_t i = 0; i < node->numInputs(); i++) + { + s.args().append("input" + std::to_string(i), tbl()->lookup(node->inputs(i))); + } + s.args().append("custom_code", node->custom_code()); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthToSpace *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("block_size", std::to_string(node->block_size())); + s.state(locop::NodeSummary::State::Complete); + return true; } @@ -344,6 +552,7 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthwiseConv2D *node, s.args().append("bias", tbl()->lookup(node->bias())); s.args().append("stride(h,w)", to_str(node->stride())); + s.args().append("dilation(h,w)", to_str(node->dilation())); s.args().append("padding", to_str(node->padding())); s.args().append("depthMultiplier", std::to_string(node->depthMultiplier())); s.args().append("fused", to_str(node->fusedActivationFunction())); @@ -355,15 +564,49 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleDepthwiseConv2D *node, bool CircleNodeSummaryBuilder::summary(const luci::CircleDiv *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleElu *node, locop::NodeSummary &s) const +{ + return use_features(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleExp *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleExpandDims *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("axis", tbl()->lookup(node->axis())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleExp *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleFloor *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorDiv *node, + locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleFloorMod *node, + locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleFill *node, locop::NodeSummary &s) const +{ + s.args().append("dims", tbl()->lookup(node->dims())); + s.args().append("value", tbl()->lookup(node->value())); s.state(locop::NodeSummary::State::Complete); return true; } @@ -383,184 +626,741 @@ bool CircleNodeSummaryBuilder::summary(const luci::CircleFullyConnected *node, return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalNot *node, - locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleGather *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); + s.args().append("params", tbl()->lookup(node->params())); + s.args().append("indices", tbl()->lookup(node->indices())); + s.args().append("axis", pepper::str(node->axis())); + s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalOr *node, +bool CircleNodeSummaryBuilder::summary(const luci::CircleGatherNd *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); + s.args().append("params", tbl()->lookup(node->params())); + s.args().append("indices", tbl()->lookup(node->indices())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleMaximum *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleGreater *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_xy(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleMaxPool2D *node, +bool CircleNodeSummaryBuilder::summary(const luci::CircleGreaterEqual *node, locop::NodeSummary &s) const { - assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); + return use_xy(tbl(), node, s); +} - s.args().append("value", tbl()->lookup(node->value())); - s.args().append("filter(h,w)", to_str(node->filter())); - s.args().append("stride(h,w)", to_str(node->stride())); - s.args().append("padding", to_str(node->padding())); - s.args().append("fused", to_str(node->fusedActivationFunction())); +bool CircleNodeSummaryBuilder::summary(const luci::CircleIf *node, locop::NodeSummary &s) const +{ + s.args().append("cond", tbl()->lookup(node->cond())); + for (uint32_t i = 0; i < node->input_count(); ++i) + s.args().append("input", tbl()->lookup(node->input(i))); - s.state(locop::NodeSummary::State::Complete); + if (node->then_graph() != nullptr) + s.args().append("then_graph", node->then_graph()->name()); + else + s.args().append("then_branch", pepper::str(node->then_branch())); - return true; -} + if (node->else_graph() != nullptr) + s.args().append("else_graph", node->else_graph()->name()); + else + s.args().append("else_branch", pepper::str(node->else_branch())); -bool CircleNodeSummaryBuilder::summary(const luci::CircleMean *node, locop::NodeSummary &s) const -{ - s.args().append("input", tbl()->lookup(node->input())); - s.args().append("reduction_indices", tbl()->lookup(node->reduction_indices())); - s.args().append("keep_dims", node->keep_dims() ? "true" : "false"); s.state(locop::NodeSummary::State::Complete); + return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleMul *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleL2Normalize *node, + locop::NodeSummary &s) const { - assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); s.args().append("fused_activation_function", to_str(node->fusedActivationFunction())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CirclePack *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLess *node, locop::NodeSummary &s) const { - for (uint32_t i = 0; i < node->values_count(); ++i) - s.args().append("values", tbl()->lookup(node->values(i))); - s.args().append("values_count", pepper::str(node->values_count())); - s.args().append("axis", pepper::str(node->axis())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_xy(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CirclePad *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLessEqual *node, + locop::NodeSummary &s) const { - s.args().append("input", tbl()->lookup(node->input())); - s.args().append("paddings", tbl()->lookup(node->paddings())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_xy(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLeakyRelu *node, + locop::NodeSummary &s) const { s.args().append("features", tbl()->lookup(node->features())); + s.args().append("alpha", std::to_string(node->alpha())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu6 *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLocalResponseNormalization *node, + locop::NodeSummary &s) const { - s.args().append("features", tbl()->lookup(node->features())); + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("radius", pepper::str(node->radius())); + s.args().append("bias", pepper::str(node->bias())); + s.args().append("alpha", pepper::str(node->alpha())); + s.args().append("beta", pepper::str(node->beta())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleReshape *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLog *node, locop::NodeSummary &s) const { - s.args().append("tensor", tbl()->lookup(node->tensor())); - s.args().append("shape", tbl()->lookup(node->shape())); - // TODO Show newShape info - s.state(locop::NodeSummary::State::PartiallyKnown); - return true; + return use_x(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleRsqrt *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalAnd *node, + locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_xy(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleSoftmax *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalNot *node, + locop::NodeSummary &s) const { - s.args().append("logits", tbl()->lookup(node->logits())); - s.args().append("beta", pepper::str(node->beta())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_x(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleSqrt *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleLogicalOr *node, + locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.state(locop::NodeSummary::State::Complete); - return true; + return use_xy(tbl(), node, s); } -bool CircleNodeSummaryBuilder::summary(const luci::CircleSquaredDifference *node, +bool CircleNodeSummaryBuilder::summary(const luci::CircleLogistic *node, locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleLogSoftmax *node, + locop::NodeSummary &s) const +{ + s.args().append("logits", tbl()->lookup(node->logits())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleSub *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixDiag *node, + locop::NodeSummary &s) const { - s.args().append("x", tbl()->lookup(node->x())); - s.args().append("y", tbl()->lookup(node->y())); + s.args().append("diagonal", tbl()->lookup(node->diagonal())); s.state(locop::NodeSummary::State::Complete); return true; } -// TODO TFLTanh - -bool CircleNodeSummaryBuilder::summary(const luci::CircleTranspose *node, +bool CircleNodeSummaryBuilder::summary(const luci::CircleMatrixSetDiag *node, locop::NodeSummary &s) const { - s.args().append("a", tbl()->lookup(node->a())); - s.args().append("perm", tbl()->lookup(node->perm())); + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("diagonal", tbl()->lookup(node->diagonal())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleTransposeConv *node, - locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleMaximum *node, locop::NodeSummary &s) const { - assert(node->padding() != luci::Padding::UNDEFINED); + return use_xy(tbl(), node, s); +} - s.args().append("inputSizes", tbl()->lookup(node->inputSizes())); - s.args().append("filter", tbl()->lookup(node->filter())); - s.args().append("outBackprop", tbl()->lookup(node->outBackprop())); +bool CircleNodeSummaryBuilder::summary(const luci::CircleMaxPool2D *node, + locop::NodeSummary &s) const +{ + assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); + s.args().append("value", tbl()->lookup(node->value())); + s.args().append("filter(h,w)", to_str(node->filter())); s.args().append("stride(h,w)", to_str(node->stride())); s.args().append("padding", to_str(node->padding())); + s.args().append("fused", to_str(node->fusedActivationFunction())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleInput *, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleMean *node, locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleMinimum *node, locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleMirrorPad *node, + locop::NodeSummary &s) const { + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("paddings", tbl()->lookup(node->paddings())); + s.args().append("mode", to_str(node->mode())); s.state(locop::NodeSummary::State::Complete); return true; } -bool CircleNodeSummaryBuilder::summary(const luci::CircleOutput *node, locop::NodeSummary &s) const +bool CircleNodeSummaryBuilder::summary(const luci::CircleMul *node, locop::NodeSummary &s) const { - s.args().append("from", tbl()->lookup(node->from())); + return use_xy_act(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleNeg *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleNotEqual *node, + locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleOneHot *node, locop::NodeSummary &s) const +{ + s.args().append("indices", tbl()->lookup(node->indices())); + s.args().append("depth", tbl()->lookup(node->depth())); + s.args().append("on_value", tbl()->lookup(node->on_value())); + s.args().append("off_value", tbl()->lookup(node->off_value())); + s.args().append("axis", pepper::str(node->axis())); + + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CirclePack *node, locop::NodeSummary &s) const +{ + for (uint32_t i = 0; i < node->values_count(); ++i) + s.args().append("values", tbl()->lookup(node->values(i))); + s.args().append("values_count", pepper::str(node->values_count())); + s.args().append("axis", pepper::str(node->axis())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CirclePad *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("paddings", tbl()->lookup(node->paddings())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CirclePow *node, locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CirclePRelu *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("alpha", tbl()->lookup(node->alpha())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRange *node, locop::NodeSummary &s) const +{ + s.args().append("start", tbl()->lookup(node->start())); + s.args().append("limit", tbl()->lookup(node->limit())); + s.args().append("delta", tbl()->lookup(node->delta())); + + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRank *node, locop::NodeSummary &s) const +{ + return use_input(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceAny *node, + locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMax *node, + locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceMin *node, + locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReduceProd *node, + locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu *node, locop::NodeSummary &s) const +{ + return use_features(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRelu6 *node, locop::NodeSummary &s) const +{ + return use_features(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReluN1To1 *node, + locop::NodeSummary &s) const +{ + return use_features(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReshape *node, locop::NodeSummary &s) const +{ + s.args().append("tensor", tbl()->lookup(node->tensor())); + s.args().append("shape", tbl()->lookup(node->shape())); + // TODO Show newShape info + s.state(locop::NodeSummary::State::PartiallyKnown); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeBilinear *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("size", tbl()->lookup(node->size())); + s.args().append("align_corners", node->align_corners() ? "true" : "false"); + s.args().append("half_pixel_centers", node->half_pixel_centers() ? "true" : "false"); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleResizeNearestNeighbor *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("size", tbl()->lookup(node->size())); + s.args().append("align_corners", node->align_corners() ? "true" : "false"); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseSequence *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("seq_lengths", tbl()->lookup(node->seq_lengths())); + s.args().append("seq_axis", std::to_string(node->seq_axis())); + s.args().append("batch_axis", std::to_string(node->batch_axis())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleReverseV2 *node, + locop::NodeSummary &s) const +{ + s.args().append("tensor", tbl()->lookup(node->tensor())); + s.args().append("axis", tbl()->lookup(node->axis())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRound *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleRsqrt *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleScatterNd *node, + locop::NodeSummary &s) const +{ + s.args().append("indices", tbl()->lookup(node->indices())); + s.args().append("updates", tbl()->lookup(node->updates())); + s.args().append("shape", tbl()->lookup(node->shape())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSegmentSum *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("segment_ids", tbl()->lookup(node->segment_ids())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSelect *node, locop::NodeSummary &s) const +{ + s.args().append("condition", tbl()->lookup(node->condition())); + s.args().append("t", tbl()->lookup(node->t())); + s.args().append("e", tbl()->lookup(node->e())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSelectV2 *node, + locop::NodeSummary &s) const +{ + s.args().append("condition", tbl()->lookup(node->condition())); + s.args().append("t", tbl()->lookup(node->t())); + s.args().append("e", tbl()->lookup(node->e())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleShape *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("out_type", to_str(node->out_type())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSin *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSlice *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("begin", tbl()->lookup(node->begin())); + s.args().append("size", tbl()->lookup(node->size())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSoftmax *node, locop::NodeSummary &s) const +{ + s.args().append("logits", tbl()->lookup(node->logits())); + s.args().append("beta", pepper::str(node->beta())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToBatchND *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("block_shape", tbl()->lookup(node->block_shape())); + s.args().append("paddings", tbl()->lookup(node->paddings())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSpaceToDepth *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("block_size", pepper::str(node->block_size())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSparseToDense *node, + locop::NodeSummary &s) const +{ + s.args().append("indices", tbl()->lookup(node->indices())); + s.args().append("output_shape", tbl()->lookup(node->output_shape())); + s.args().append("values", tbl()->lookup(node->values())); + s.args().append("default_value", tbl()->lookup(node->default_value())); + + s.args().append("Validate_indices", pepper::str(node->validate_indices())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSplit *node, locop::NodeSummary &s) const +{ + s.args().append("split_dim", tbl()->lookup(node->split_dim())); + s.args().append("input", tbl()->lookup(node->input())); + + s.args().append("num_split", pepper::str(node->num_split())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitV *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("size_splits", tbl()->lookup(node->size_splits())); + s.args().append("split_dim", tbl()->lookup(node->split_dim())); + + s.args().append("num_split", pepper::str(node->num_split())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSqrt *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSquare *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSquaredDifference *node, + locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSqueeze *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + + std::stringstream ss{"("}; + for (size_t i = 0; i < node->squeeze_dims().size(); ++i) + { + if (i != 0) + ss << ", "; + ss << node->squeeze_dims()[i]; + } + ss << ")"; + + s.args().append("squeeze_dims", ss.str()); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleStridedSlice *node, + locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("begin", tbl()->lookup(node->begin())); + s.args().append("end", tbl()->lookup(node->end())); + s.args().append("strides", tbl()->lookup(node->strides())); + + s.args().append("begin_mask", pepper::str(node->begin_mask())); + s.args().append("end_mask", pepper::str(node->end_mask())); + s.args().append("ellipsis_mask", pepper::str(node->ellipsis_mask())); + s.args().append("new_axis_mask", pepper::str(node->new_axis_mask())); + s.args().append("shrink_axis_mask", pepper::str(node->shrink_axis_mask())); + + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSub *node, locop::NodeSummary &s) const +{ + return use_xy(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSum *node, locop::NodeSummary &s) const +{ + return use_reducer(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTanh *node, locop::NodeSummary &s) const +{ + return use_x(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTile *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("multiples", tbl()->lookup(node->multiples())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2 *node, locop::NodeSummary &s) const +{ + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("k", tbl()->lookup(node->k())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTranspose *node, + locop::NodeSummary &s) const +{ + s.args().append("a", tbl()->lookup(node->a())); + s.args().append("perm", tbl()->lookup(node->perm())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTransposeConv *node, + locop::NodeSummary &s) const +{ + assert(node->padding() != luci::Padding::UNDEFINED); + + s.args().append("inputSizes", tbl()->lookup(node->inputSizes())); + s.args().append("filter", tbl()->lookup(node->filter())); + s.args().append("outBackprop", tbl()->lookup(node->outBackprop())); + + s.args().append("stride(h,w)", to_str(node->stride())); + s.args().append("padding", to_str(node->padding())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpack *node, locop::NodeSummary &s) const +{ + s.args().append("value", tbl()->lookup(node->value())); + + s.args().append("num", pepper::str(node->num())); + s.args().append("axis", pepper::str(node->axis())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleWhere *node, locop::NodeSummary &s) const +{ + s.args().append("condition", tbl()->lookup(node->condition())); + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleWhile *node, locop::NodeSummary &s) const +{ + for (uint32_t i = 0; i < node->input_count(); ++i) + s.args().append("input", tbl()->lookup(node->input(i))); + + if (node->cond_graph() != nullptr) + s.args().append("cond_graph", node->cond_graph()->name()); + else + s.args().append("cond_branch", pepper::str(node->cond_branch())); + + if (node->body_graph() != nullptr) + s.args().append("body_graph", node->body_graph()->name()); + else + s.args().append("body_branch", pepper::str(node->body_branch())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleZerosLike *node, + locop::NodeSummary &s) const +{ + return use_input(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitOut *node, + locop::NodeSummary &s) const +{ + return use_input(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleSplitVOut *node, + locop::NodeSummary &s) const +{ + return use_input(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleTopKV2Out *node, + locop::NodeSummary &s) const +{ + s.args().append("topkv2", tbl()->lookup(node->input())); + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleUnpackOut *node, + locop::NodeSummary &s) const +{ + s.args().append("unpack", tbl()->lookup(node->input())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleIfOut *node, locop::NodeSummary &s) const +{ + return use_input(tbl(), node, s); +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleWhileOut *node, + locop::NodeSummary &s) const +{ + s.args().append("while", tbl()->lookup(node->input())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleInput *, locop::NodeSummary &s) const +{ + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleOutput *node, locop::NodeSummary &s) const +{ + s.args().append("from", tbl()->lookup(node->from())); + + s.state(locop::NodeSummary::State::Complete); + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQFullyConnected *node, + locop::NodeSummary &s) const +{ + assert(node->fusedActivationFunction() != luci::FusedActFunc::UNDEFINED); + + s.args().append("input", tbl()->lookup(node->input())); + s.args().append("weights_scales", tbl()->lookup(node->weights_scales())); + s.args().append("weights_binary", tbl()->lookup(node->weights_binary())); + s.args().append("bias", tbl()->lookup(node->bias())); + s.args().append("weights_clusters", tbl()->lookup(node->weights_clusters())); + + s.args().append("fused", to_str(node->fusedActivationFunction())); + s.args().append("weights_hidden_size", pepper::str(node->weights_hidden_size())); + + s.state(locop::NodeSummary::State::Complete); + + return true; +} + +bool CircleNodeSummaryBuilder::summary(const luci::CircleBCQGather *node, + locop::NodeSummary &s) const +{ + s.args().append("input_scales", tbl()->lookup(node->input_scales())); + s.args().append("input_binary", tbl()->lookup(node->input_binary())); + s.args().append("indices", tbl()->lookup(node->indices())); + s.args().append("input_clusters", tbl()->lookup(node->input_clusters())); + + s.args().append("axis", pepper::str(node->axis())); + s.args().append("input_hidden_size", pepper::str(node->input_hidden_size())); s.state(locop::NodeSummary::State::Complete); return true; @@ -603,4 +1403,4 @@ bool NodeSummaryBuilder::build(const loco::Node *node, locop::NodeSummary &s) co return false; } -} // namespace exo +} // namespace luci diff --git a/compiler/luci/pass/CMakeLists.txt b/compiler/luci/pass/CMakeLists.txt index 93130ce..2c5fb34 100644 --- a/compiler/luci/pass/CMakeLists.txt +++ b/compiler/luci/pass/CMakeLists.txt @@ -1,6 +1,6 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") -#file(GLOB_RECURSE TESTS "src/*.test.cpp") -#list(REMOVE_ITEM SOURCES ${TESTS}) +file(GLOB_RECURSE TESTS "src/*.test.cpp") +list(REMOVE_ITEM SOURCES ${TESTS}) add_library(luci_pass SHARED ${SOURCES}) target_include_directories(luci_pass PRIVATE src) @@ -16,14 +16,14 @@ target_link_libraries(luci_pass PRIVATE nncc_common) target_link_libraries(luci_pass PRIVATE oops) install(TARGETS luci_pass DESTINATION lib) -# TODO enable for tests -#if(NOT ENABLE_TEST) -# return() -#endif(NOT ENABLE_TEST) -# -#nnas_find_package(GTest REQUIRED) -# -#GTest_AddTest(luci_pass_test ${TESTS}) -#target_include_directories(luci_pass_test PRIVATE src) -#target_link_libraries(luci_pass_test luci_pass) +if(NOT ENABLE_TEST) + return() +endif(NOT ENABLE_TEST) + +nnas_find_package(GTest REQUIRED) + +GTest_AddTest(luci_pass_test ${TESTS}) +target_include_directories(luci_pass_test PRIVATE src) +target_link_libraries(luci_pass_test luci_pass) +target_link_libraries(luci_pass_test luci_lang) #target_link_libraries(luci_pass_test oops) diff --git a/compiler/luci/pass/include/luci/CircleOptimizer.h b/compiler/luci/pass/include/luci/CircleOptimizer.h index a969cca..312749f 100644 --- a/compiler/luci/pass/include/luci/CircleOptimizer.h +++ b/compiler/luci/pass/include/luci/CircleOptimizer.h @@ -32,11 +32,28 @@ public: { enum Algorithm { + FuseBCQ, FuseInstanceNorm, + ResolveCustomOpAdd, + ResolveCustomOpBatchMatMul, + ResolveCustomOpMatMul, + QuantizeDequantizeWeights, + QuantizeWithMinMax, }; + enum AlgorithmParameters + { + Quantize_input_dtype, + Quantize_output_dtype, + Quantize_granularity // layer-wise or channel-wise + }; + + virtual ~Options() = default; + virtual void enable(Algorithm) = 0; virtual bool query(Algorithm) = 0; + virtual void param(AlgorithmParameters, const std::string &) = 0; + virtual const std::string param(AlgorithmParameters) const = 0; }; public: @@ -46,6 +63,8 @@ public: public: void optimize(loco::Graph *) const; + void quantize(loco::Graph *) const; + private: std::unique_ptr _options; }; diff --git a/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h b/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h new file mode 100644 index 0000000..4404a9f --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/FuseBCQPass.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_FUSE_BCQ_PASS_H__ +#define __LUCI_FUSE_BCQ_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to fuse certain pattern of subgraph into CircleBCQFullyConnected or CircleBCQGather + * + */ +struct FuseBCQPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::FuseBCQPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_FUSE_BCQ_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/QuantizationParameters.h b/compiler/luci/pass/include/luci/Pass/QuantizationParameters.h new file mode 100644 index 0000000..5c9cd42 --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/QuantizationParameters.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_QUANTIZATION_PARAMETERS_H__ +#define __LUCI_QUANTIZATION_PARAMETERS_H__ + +namespace luci +{ + +enum QuantizationGranularity +{ + LayerWise = 0, + ChannelWise = 1, +}; + +} // namespace luci + +#endif // __LUCI_QUANTIZATION_PARAMETERS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/QuantizeDequantizeWeightsPass.h b/compiler/luci/pass/include/luci/Pass/QuantizeDequantizeWeightsPass.h new file mode 100644 index 0000000..713b88f --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/QuantizeDequantizeWeightsPass.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_QUANTIZE_DEQUANTIZE_WEIGHTS_PASS_H__ +#define __LUCI_QUANTIZE_DEQUANTIZE_WEIGHTS_PASS_H__ + +#include + +#include + +#include + +namespace luci +{ + +/** + * @brief Pass to quantize weights + */ +class QuantizeDequantizeWeightsPass : public logo::Pass +{ +public: + QuantizeDequantizeWeightsPass(loco::DataType input_dtype, loco::DataType output_dtype, + QuantizationGranularity granularity) + : _input_dtype{input_dtype}, _output_dtype{output_dtype}, _granularity{granularity} + { + // DO NOTHING + } + virtual const char *name(void) const { return "luci::QuantizeDequantizeWeightsPass"; } + +public: + bool run(loco::Graph *graph); + +private: + loco::DataType _input_dtype; + loco::DataType _output_dtype; + QuantizationGranularity _granularity; +}; + +} // namespace luci + +#endif //__LUCI_QUANTIZE_DEQUANTIZE_WEIGHTS_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/QuantizeWithMinMaxPass.h b/compiler/luci/pass/include/luci/Pass/QuantizeWithMinMaxPass.h new file mode 100644 index 0000000..bb0d0ff --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/QuantizeWithMinMaxPass.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_QUANTIZE_WITH_MINMAX_PASS_H__ +#define __LUCI_QUANTIZE_WITH_MINMAX_PASS_H__ + +#include + +#include + +#include + +namespace luci +{ + +/** + * @brief Pass to quantize activation, weights, and bias + */ +class QuantizeWithMinMaxPass : public logo::Pass +{ +public: + QuantizeWithMinMaxPass(loco::DataType input_dtype, loco::DataType output_dtype, + QuantizationGranularity granularity) + : _input_dtype{input_dtype}, _output_dtype{output_dtype}, _granularity{granularity} + { + // DO NOTHING + } + virtual const char *name(void) const { return "luci::QuantizeWithMinMaxPass"; } + +public: + bool run(loco::Graph *graph); + +private: + loco::DataType _input_dtype; + loco::DataType _output_dtype; + QuantizationGranularity _granularity; +}; + +} // namespace luci + +#endif //__LUCI_QUANTIZE_WITH_MINMAX_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ResolveCustomOpAddPass.h b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpAddPass.h new file mode 100644 index 0000000..35a3350 --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpAddPass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_RESOLVE_CUSTOM_OP_ADD_PASS_H__ +#define __LUCI_RESOLVE_CUSTOM_OP_ADD_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to resolve certain custom op of subgraph into add op in circle schema. + */ +struct ResolveCustomOpAddPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::ResolveCustomOpAddPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_RESOLVE_CUSTOM_OP_ADD_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ResolveCustomOpBatchMatMulPass.h b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpBatchMatMulPass.h new file mode 100644 index 0000000..7c48c8d --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpBatchMatMulPass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_RESOLVE_CUSTOM_OP_BATCHMATMUL_PASS_H__ +#define __LUCI_RESOLVE_CUSTOM_OP_BATCHMATMUL_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to resolve certain custom op of subgraph into batchmatmul op in circle schema. + */ +struct ResolveCustomOpBatchMatMulPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::ResolveCustomOpBatchMatMulPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_RESOLVE_CUSTOM_OP_BATCHMATMUL_PASS_H__ diff --git a/compiler/luci/pass/include/luci/Pass/ResolveCustomOpMatMulPass.h b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpMatMulPass.h new file mode 100644 index 0000000..701deba --- /dev/null +++ b/compiler/luci/pass/include/luci/Pass/ResolveCustomOpMatMulPass.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_RESOLVE_CUSTOM_OP_MATMUL_PASS_H__ +#define __LUCI_RESOLVE_CUSTOM_OP_MATMUL_PASS_H__ + +#include + +namespace luci +{ + +/** + * @brief Class to resolve certain custom op of subgraph into matmul op in circle schema. + */ +struct ResolveCustomOpMatMulPass final : public logo::Pass +{ + const char *name(void) const final { return "luci::ResolveCustomOpMatMulPass"; } + + bool run(loco::Graph *g) final; +}; + +} // namespace luci + +#endif // __LUCI_RESOLVE_CUSTOM_OP_MATMUL_PASS_H__ diff --git a/compiler/luci/pass/src/CircleOptimizer.cpp b/compiler/luci/pass/src/CircleOptimizer.cpp index dcb05a0..90fbe90 100644 --- a/compiler/luci/pass/src/CircleOptimizer.cpp +++ b/compiler/luci/pass/src/CircleOptimizer.cpp @@ -16,16 +16,23 @@ #include "luci/CircleOptimizer.h" +#include "luci/Pass/FuseBCQPass.h" #include "luci/Pass/FuseInstanceNormPass.h" +#include "luci/Pass/ResolveCustomOpAddPass.h" +#include "luci/Pass/ResolveCustomOpBatchMatMulPass.h" +#include "luci/Pass/ResolveCustomOpMatMulPass.h" +#include "luci/Pass/QuantizeWithMinMaxPass.h" +#include "luci/Pass/QuantizeDequantizeWeightsPass.h" // TODO add more passes #include "luci/Pass/ShapeInferencePass.h" #include "luci/Pass/TypeInferencePass.h" // logo passes -#include +#include #include "ProgressReporter.h" +#include "CircleOptimizerUtils.h" #include @@ -36,18 +43,39 @@ namespace using namespace luci; -class OptimizeOptionsImpl : public luci::CircleOptimizer::Options +class OptimizeOptionsImpl final : public luci::CircleOptimizer::Options { public: void enable(Algorithm) final; + void param(AlgorithmParameters, const std::string &) final; + const std::string param(AlgorithmParameters) const final; bool query(Algorithm) final; private: std::vector _algorithms; + std::map _algorithm_params; }; void OptimizeOptionsImpl::enable(Algorithm algo) { _algorithms.push_back(algo); } +void OptimizeOptionsImpl::param(AlgorithmParameters param, const std::string &str) +{ + _algorithm_params.insert(std::pair(param, str)); +} + +const std::string OptimizeOptionsImpl::param(AlgorithmParameters param) const +{ + auto param_str = _algorithm_params.find(param); + if (param_str != _algorithm_params.end()) + { + return param_str->second; + } + else + { + return std::string(); + } +} + bool OptimizeOptionsImpl::query(Algorithm algo) { std::vector::iterator it = std::find(_algorithms.begin(), _algorithms.end(), algo); @@ -77,14 +105,31 @@ void CircleOptimizer::optimize(loco::Graph *g) const logo::Phase phase; /* TRANSFORM DECLARATION BEGIN */ + if (_options->query(Options::Algorithm::ResolveCustomOpAdd)) + { + phase.emplace_back(std::make_unique()); + } + if (_options->query(Options::Algorithm::ResolveCustomOpBatchMatMul)) + { + phase.emplace_back(std::make_unique()); + } + if (_options->query(Options::Algorithm::ResolveCustomOpMatMul)) + { + phase.emplace_back(std::make_unique()); + } if (_options->query(Options::Algorithm::FuseInstanceNorm)) { phase.emplace_back(std::make_unique()); } + if (_options->query(Options::Algorithm::FuseBCQ)) + { + phase.emplace_back(std::make_unique()); + } + // Shape inference is needed for added nodes doing above transformations phase.emplace_back(std::make_unique()); phase.emplace_back(std::make_unique()); - phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); /* TRANSFORM DECLARATION END */ ProgressReporter prog(g, logo::PhaseStrategy::Saturate); @@ -93,4 +138,74 @@ void CircleOptimizer::optimize(loco::Graph *g) const phase_runner.run(phase); } +void CircleOptimizer::quantize(loco::Graph *g) const +{ + // Fake quantization of weights + if (_options->query(Options::Algorithm::QuantizeDequantizeWeights)) + { + static const std::vector fakeq_supported_input_dtype{"float32"}; + static const std::vector fakeq_supported_output_dtype{"uint8"}; + static const std::vector fakeq_supported_granularity{"layer"}; + + auto input_dtype = _options->param(Options::AlgorithmParameters::Quantize_input_dtype); + auto output_dtype = _options->param(Options::AlgorithmParameters::Quantize_output_dtype); + auto granularity = _options->param(Options::AlgorithmParameters::Quantize_granularity); + + if (!in_array(to_lower_case(input_dtype), fakeq_supported_input_dtype)) + throw std::runtime_error("Unsupported input type. List of supported input type: " + + to_string(fakeq_supported_input_dtype)); + + if (!in_array(to_lower_case(output_dtype), fakeq_supported_output_dtype)) + throw std::runtime_error("Unsupported output type. List of supported output type: " + + to_string(fakeq_supported_output_dtype)); + + if (!in_array(to_lower_case(granularity), fakeq_supported_granularity)) + throw std::runtime_error("Unsupported granularity. List of supported granularity: " + + to_string(fakeq_supported_granularity)); + + luci::QuantizeDequantizeWeightsPass fake_quantizer( + str_to_dtype(input_dtype), str_to_dtype(output_dtype), str_to_granularity(granularity)); + fake_quantizer.run(g); + } + + // Actual quantization of weights, bias, and activation + if (_options->query(Options::Algorithm::QuantizeWithMinMax)) + { + static const std::vector qwmm_supported_input_dtype{"float32"}; + static const std::vector qwmm_supported_output_dtype{"uint8"}; + static const std::vector qwmm_supported_granularity{"layer"}; + + auto input_dtype = _options->param(Options::AlgorithmParameters::Quantize_input_dtype); + auto output_dtype = _options->param(Options::AlgorithmParameters::Quantize_output_dtype); + auto granularity = _options->param(Options::AlgorithmParameters::Quantize_granularity); + + if (!in_array(to_lower_case(input_dtype), qwmm_supported_input_dtype)) + throw std::runtime_error("Unsupported input type. List of supported input types: " + + to_string(qwmm_supported_input_dtype)); + + if (!in_array(to_lower_case(output_dtype), qwmm_supported_output_dtype)) + throw std::runtime_error("Unsupported output type. List of supported output types: " + + to_string(qwmm_supported_output_dtype)); + + if (!in_array(to_lower_case(granularity), qwmm_supported_granularity)) + throw std::runtime_error("Unsupported granularity. List of supported granularity: " + + to_string(qwmm_supported_granularity)); + + luci::QuantizeWithMinMaxPass quantizer(str_to_dtype(input_dtype), str_to_dtype(output_dtype), + str_to_granularity(granularity)); + quantizer.run(g); + } + + logo::Phase phase; + + // Do Shape/Type inference + phase.emplace_back(std::make_unique()); + phase.emplace_back(std::make_unique()); + + ProgressReporter prog(g, logo::PhaseStrategy::Saturate); + logo::PhaseRunner phase_runner{g}; + phase_runner.attach(&prog); + phase_runner.run(phase); +} + } // namespace luci diff --git a/compiler/luci/pass/src/CircleOptimizerUtils.cpp b/compiler/luci/pass/src/CircleOptimizerUtils.cpp new file mode 100644 index 0000000..ffc3723 --- /dev/null +++ b/compiler/luci/pass/src/CircleOptimizerUtils.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleOptimizerUtils.h" + +namespace luci +{ + +bool in_array(const std::string &str, const std::vector &array) +{ + return std::find(array.begin(), array.end(), str) != array.end(); +} + +std::string to_string(const std::vector &strings) +{ + assert(!strings.empty()); + + std::string res; + for (unsigned int i = 0; i < strings.size() - 1; i++) + res += strings[i] + ", "; + + res += strings[strings.size() - 1]; + return res; +} + +std::string to_lower_case(std::string s) +{ + std::transform(s.begin(), s.end(), s.begin(), [](unsigned char c) { return std::tolower(c); }); + return s; +} + +loco::DataType str_to_dtype(const std::string &str) +{ + if (to_lower_case(str).compare("uint8") == 0) + return loco::DataType::U8; + if (to_lower_case(str).compare("uint16") == 0) + return loco::DataType::U16; + if (to_lower_case(str).compare("uint32") == 0) + return loco::DataType::U32; + if (to_lower_case(str).compare("uint64") == 0) + return loco::DataType::U64; + + if (to_lower_case(str).compare("int8") == 0) + return loco::DataType::S8; + if (to_lower_case(str).compare("int16") == 0) + return loco::DataType::S16; + if (to_lower_case(str).compare("int32") == 0) + return loco::DataType::S32; + if (to_lower_case(str).compare("int64") == 0) + return loco::DataType::S64; + + if (to_lower_case(str).compare("float16") == 0) + return loco::DataType::FLOAT16; + if (to_lower_case(str).compare("float32") == 0) + return loco::DataType::FLOAT32; + if (to_lower_case(str).compare("float64") == 0) + return loco::DataType::FLOAT64; + + if (to_lower_case(str).compare("bool") == 0) + return loco::DataType::BOOL; + + return loco::DataType::Unknown; +} + +QuantizationGranularity str_to_granularity(const std::string &str) +{ + if (to_lower_case(str).compare("layer") == 0) + return QuantizationGranularity::LayerWise; + + if (to_lower_case(str).compare("channel") == 0) + return QuantizationGranularity::ChannelWise; + + throw std::runtime_error("Quantization granularity must be either 'layer' or 'channel'"); +} + +} // namespace luci diff --git a/compiler/luci/pass/src/CircleOptimizerUtils.h b/compiler/luci/pass/src/CircleOptimizerUtils.h new file mode 100644 index 0000000..7e577a0 --- /dev/null +++ b/compiler/luci/pass/src/CircleOptimizerUtils.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_OPTIMIZER_UTILS_H__ +#define __LUCI_CIRCLE_OPTIMIZER_UTILS_H__ + +#include "luci/Pass/QuantizeDequantizeWeightsPass.h" +#include "luci/Pass/QuantizeWithMinMaxPass.h" + +#include + +#include + +namespace luci +{ + +bool in_array(const std::string &, const std::vector &); + +std::string to_string(const std::vector &); + +std::string to_lower_case(std::string); + +loco::DataType str_to_dtype(const std::string &); + +QuantizationGranularity str_to_granularity(const std::string &); + +} // namespace luci + +#endif // __LUCI_CIRCLE_OPTIMIZER_UTILS_H__ diff --git a/compiler/luci/pass/src/FuseBCQPass.cpp b/compiler/luci/pass/src/FuseBCQPass.cpp new file mode 100644 index 0000000..b81db88 --- /dev/null +++ b/compiler/luci/pass/src/FuseBCQPass.cpp @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/FuseBCQPass.h" + +#include + +#include +#include +#include + +namespace +{ + +/** + * @brief Circle nodes including BCQ information and a circle node to which BCQ will be applied + * are connected with their name. And their names include common prefix. + * However, after pb file is converted to tflite file, some nodes' name are changed. + * Thus this function will return original common prefix. + * + * @note All the re-naming rule of TFLite converter is not figured out. + * Therefore, if new naming rule is detected, this function should be updated. + */ +const std::string node_name_prefix(luci::NodeName node_name) +{ + std::string prefix = node_name; + + if (prefix.find("ReadVariableOp/resource/") != std::string::npos) + { + const auto start_index = prefix.find("ReadVariableOp/resource/"); + + const auto left_prefix = prefix.substr(0, start_index); + const auto right_prefix = prefix.substr(start_index + 24); + + prefix = left_prefix + right_prefix; + } + + if (prefix.find("Tensordot/") != std::string::npos) + { + const auto index = prefix.find("Tensordot/"); + prefix = prefix.substr(0, index - 1); + } + else if (prefix.find("kernel/") != std::string::npos) + { + const auto index = prefix.find("kernel/"); + prefix = prefix.substr(0, index - 1); + } + else if (prefix.find("/bcqinfo_") != std::string::npos) + { + const auto index = prefix.find("/bcqinfo_"); + prefix = prefix.substr(0, index); + } + + return prefix; +} + +} // namespace + +namespace +{ + +class BCQConverter final +{ +public: + void add_BCQ_info_node(luci::CircleConst *node) + { + const auto node_name = node->name(); + const auto prefix = node_name_prefix(node_name); + + // If bcqinfo_* nodes are held by Reshape operation, + // shape of bcqinfo_* nodes are copied to `shape` input of Reshape operation. + // Then the name becomes bcqinfo_*_copy_shape. + // We should prevent this node not to added to bcq information. + if (node_name.find("_copy_shape") != std::string::npos) + return; + + if (node_name.find("bcqinfo_do_w_x") != std::string::npos) + _do_w_x[prefix] = node; + else if (node_name.find("bcqinfo_alpha") != std::string::npos) + _alpha[prefix] = node; + else if (node_name.find("bcqinfo_packed_binary_code") != std::string::npos) + _packed_binary_code[prefix] = node; + else if (node_name.find("bcqinfo_number_of_clusters") != std::string::npos) + _number_of_clusters[prefix] = node; + else if (node_name.find("bcqinfo_size_of_clusters") != std::string::npos) + _size_of_clusters[prefix] = node; + else if (node_name.find("bcqinfo_qbits_of_clusters") != std::string::npos) + _qbits_of_clusters[prefix] = node; + else if (node_name.find("bcqinfo_dequant_weight") != std::string::npos) + _dequant_weight[prefix] = node; + } + + bool has_BCQ_info(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + bool has_info = true; + + has_info &= (_do_w_x.find(prefix) != _do_w_x.end()); + has_info &= (_alpha.find(prefix) != _alpha.end()); + has_info &= (_packed_binary_code.find(prefix) != _packed_binary_code.end()); + has_info &= (_number_of_clusters.find(prefix) != _number_of_clusters.end()); + has_info &= (_size_of_clusters.find(prefix) != _size_of_clusters.end()); + has_info &= (_qbits_of_clusters.find(prefix) != _qbits_of_clusters.end()); + // bcqinfo_dequant_weight is just for validation, so not always exists. + + return has_info; + } + + bool do_w_x(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + + if (_do_w_x[prefix]->dtype() == loco::DataType::S32) + return _do_w_x[prefix]->at(0) == 1; + else if (_do_w_x[prefix]->dtype() == loco::DataType::BOOL) + return _do_w_x[prefix]->at(0); + else + throw std::runtime_error("do_w_x should be int or bool"); + } + + luci::CircleConst *get_alpha(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + return _alpha[prefix]; + } + + luci::CircleConst *get_packed_binary_code(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + return _packed_binary_code[prefix]; + } + + luci::CircleConst *get_number_of_clusters(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + return _number_of_clusters[prefix]; + } + + luci::CircleConst *get_size_of_clusters(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + return _size_of_clusters[prefix]; + } + + luci::CircleConst *get_qbits_of_clusters(luci::CircleConst *node) + { + const auto prefix = node_name_prefix(node->name()); + return _qbits_of_clusters[prefix]; + } + + luci::CircleConst *packed_clusters(luci::CircleConst *node) + { + auto graph = node->graph(); + auto qbits_of_clusters = get_qbits_of_clusters(node); + auto size_of_clusters = get_size_of_clusters(node); + const auto number_of_clusters = get_number_of_clusters(node)->at(0); + + auto packed_clusters = graph->nodes()->create(); + packed_clusters->dtype(loco::DataType::S32); + packed_clusters->size(number_of_clusters * 2); + packed_clusters->rank(2); + packed_clusters->dim(0) = number_of_clusters; + packed_clusters->dim(1) = 2; + packed_clusters->shape_status(luci::ShapeStatus::VALID); + + for (int i = 0; i < number_of_clusters; ++i) + { + packed_clusters->at(i * 2) = + qbits_of_clusters->at(i); + packed_clusters->at(i * 2 + 1) = + size_of_clusters->at(i); + } + + return packed_clusters; + } + + /** + * @brief Exclude BCQ information nodes which are used for fusing BCQ operations + * from graph output by using CircleOutputExclude + */ + void clear_BCQ_nodes() + { + auto createNoOp = [](luci::CircleNode *circle_node) { + auto graph = circle_node->graph(); + auto noOp = graph->nodes()->create(); + + if (circle_node->shape_status() == luci::ShapeStatus::VALID) + { + noOp->dtype(circle_node->dtype()); + noOp->rank(circle_node->rank()); + for (uint32_t i = 0; i < circle_node->rank(); ++i) + noOp->dim(i) = circle_node->dim(i); + } + else + { + // For type inference + noOp->dtype(loco::DataType::FLOAT32); + } + + return noOp; + }; + + auto clear_nodes = [createNoOp](std::map &nodes) { + for (auto &n : nodes) + { + auto node = n.second; + + for (auto s : loco::succs(node)) + { + if (auto outnode = dynamic_cast(s)) + { + outnode->from(createNoOp(node)); + } + else if (auto reshape_node = dynamic_cast(s)) + { + for (auto o : loco::succs(reshape_node)) + { + auto circle_output = loco::must_cast(o); + circle_output->from(createNoOp(reshape_node)); + } + } + } + } + }; + + clear_nodes(_do_w_x); + clear_nodes(_alpha); + clear_nodes(_packed_binary_code); + clear_nodes(_number_of_clusters); + clear_nodes(_size_of_clusters); + clear_nodes(_qbits_of_clusters); + clear_nodes(_dequant_weight); + } + +private: + std::map _do_w_x; + std::map _alpha; + std::map _packed_binary_code; + std::map _number_of_clusters; + std::map _size_of_clusters; + std::map _qbits_of_clusters; + std::map _dequant_weight; +}; + +} // namespace + +namespace luci +{ + +bool FuseBCQPass::run(loco::Graph *g) +{ + BCQConverter converter; + + bool changed = false; + + for (auto node : loco::all_nodes(g)) + { + if (auto circle_const = dynamic_cast(node)) + { + converter.add_BCQ_info_node(circle_const); + } + } + + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + if (auto gather = dynamic_cast(node)) + { + auto params = dynamic_cast(gather->params()); + if (params != nullptr && converter.has_BCQ_info(params)) + { + auto bcq_gather = g->nodes()->create(); + + bcq_gather->input_scales(converter.get_alpha(params)); + bcq_gather->input_binary(converter.get_packed_binary_code(params)); + bcq_gather->indices(gather->indices()); + bcq_gather->input_clusters(converter.packed_clusters(params)); + + const auto binary_hidden_size = + loco::must_cast(bcq_gather->input_binary())->dim(1).value() * 32; + bcq_gather->input_hidden_size(binary_hidden_size); + + if (converter.do_w_x(params)) + { + bcq_gather->axis(gather->axis()); + } + else + { + const auto axis_transpose = (gather->axis() == 0) ? 1 : 0; + bcq_gather->axis(axis_transpose); + } + + loco::replace(gather).with(bcq_gather); + + changed = true; + } + } + else if (auto fully_connected = dynamic_cast(node)) + { + auto weights = dynamic_cast(fully_connected->weights()); + if (weights != nullptr && converter.has_BCQ_info(weights)) + { + auto bcq_fc = g->nodes()->create(); + + bcq_fc->weights_scales(converter.get_alpha(weights)); + bcq_fc->weights_binary(converter.get_packed_binary_code(weights)); + bcq_fc->bias(fully_connected->bias()); + bcq_fc->weights_clusters(converter.packed_clusters(weights)); + bcq_fc->fusedActivationFunction(fully_connected->fusedActivationFunction()); + + loco::Node *bcq_input = fully_connected->input(); + int32_t batch_rank = 0; + + // If input of BCQFullyConnected has more than rank 2, we should reshape it as rank 2 + const auto original_input = loco::must_cast(fully_connected->input()); + if (original_input->shape_status() == ShapeStatus::VALID && original_input->rank() > 2) + { + auto new_shape = g->nodes()->create(); + new_shape->dtype(loco::DataType::S32); + new_shape->size(2); + new_shape->rank(1); + new_shape->dim(0) = 2; + + auto batch_size = 1; + for (uint32_t i = 0; i < original_input->rank() - 1; ++i) + batch_size *= original_input->dim(i).value(); + + new_shape->at(0) = batch_size; + new_shape->at(1) = + original_input->dim(original_input->rank() - 1).value(); + new_shape->shape_status(ShapeStatus::VALID); + + auto reshape = g->nodes()->create(); + reshape->tensor(original_input); + reshape->shape(new_shape); + + bcq_input = reshape; + batch_rank = original_input->rank() - 2; + } + + // If x_w formation, we should insert Transpose in front and back of BCQFullyConnected + if (converter.do_w_x(weights)) + { + const auto binary_hidden_size = + loco::must_cast(fully_connected->input()) + ->dim(batch_rank) + .value(); + bcq_fc->weights_hidden_size(binary_hidden_size); + bcq_fc->input(bcq_input); + loco::replace(fully_connected).with(bcq_fc); + } + else + { + const auto binary_hidden_size = + loco::must_cast(fully_connected->input()) + ->dim(1 + batch_rank) + .value(); + bcq_fc->weights_hidden_size(binary_hidden_size); + + auto perm = g->nodes()->create(); + perm->dtype(loco::DataType::S32); + perm->size(2); + perm->rank(1); + perm->dim(0) = 2; + perm->at(0) = 1; + perm->at(1) = 0; + perm->shape_status(ShapeStatus::VALID); + + auto input_transpose = g->nodes()->create(); + input_transpose->a(bcq_input); + input_transpose->perm(perm); + + bcq_fc->input(input_transpose); + + auto output_transpose = g->nodes()->create(); + output_transpose->a(bcq_fc); + output_transpose->perm(perm); + + loco::replace(fully_connected).with(output_transpose); + } + + changed = true; + } + } + } + + if (changed) + converter.clear_BCQ_nodes(); + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/FuseInstanceNormPass.cpp b/compiler/luci/pass/src/FuseInstanceNormPass.cpp index 180b5bb..ad8765c 100644 --- a/compiler/luci/pass/src/FuseInstanceNormPass.cpp +++ b/compiler/luci/pass/src/FuseInstanceNormPass.cpp @@ -15,6 +15,7 @@ */ #include "luci/Pass/FuseInstanceNormPass.h" +#include "FuseInstanceNormPassInternal.h" #include @@ -114,8 +115,6 @@ bool NodeFiller::with_commutative_args_of(const COMM_NOD } // namespace // Helper to check detail -namespace -{ /// @return true When node has shape of '1 x .. x 1 x depth' bool is_1D_with_dummy_dim(luci::CircleConst *node, uint32_t depth) @@ -130,7 +129,23 @@ bool is_1D_with_dummy_dim(luci::CircleConst *node, uint32_t depth) return node->dim(axis).value() == depth; } -bool is_instance_mean(luci::CircleMean *mean) +/// @return true if node shape consists of ones, except the one before the last dim: 1,...1,depth,1 +bool is_quasi_1D_with_dummy_dim(luci::CircleConst *node, uint32_t depth) +{ + auto rank = node->rank(); + // minimal accepted shape is [1 x depth x 1] + if (rank < 3) + return false; + const auto depth_axis = rank - 2; + for (uint32_t axis = 0; axis < rank; ++axis) + { + if (axis != depth_axis && node->dim(axis).value() != 1) + return false; + } + return node->dim(depth_axis).value() == depth; +} + +bool is_instance_mean_v0(luci::CircleMean *mean) { // // CHECK 1) input is rank 4 @@ -175,7 +190,53 @@ bool is_instance_mean(luci::CircleMean *mean) return mean->keep_dims(); } -} // namespace +bool is_instance_mean_v1(luci::CircleMean *mean) +{ + // + // CHECK 1) input is rank 5 (NHWCX) + // + auto input = mean->input(); + if (not loco::shape_known(input)) + return false; + auto input_shape = loco::shape_get(input).as(); + if (input_shape.rank() != 5) + return false; + + // + // CHECK 2) 'reduction indices' is CircleConst of value [1,2,4], that is HWX of NHWCX input shape + // + // TODO Support equivalent case, like [-3,-2] + // TODO Support non-Const case? + // TODO What if input is NCHW format in Circle? + auto red_indices = dynamic_cast(mean->reduction_indices()); + if (not red_indices) + return false; + if (red_indices->rank() != 1) + return false; + std::set red_indices_set; + + // TODO Currently only support S32, support other types + if (red_indices->dtype() != loco::DataType::S32) + return false; + for (uint32_t i = 0; i < red_indices->dim(0).value(); ++i) + red_indices_set.insert(red_indices->at(i)); + + if (red_indices_set.size() != 3) + return false; + if (red_indices_set.find(1) == red_indices_set.end()) + return false; + if (red_indices_set.find(2) == red_indices_set.end()) + return false; + if (red_indices_set.find(4) == red_indices_set.end()) + return false; + + // + // CHECK 3) keep_dims == true (?) + // + // We only have case of 'keep_dims == true' so far, but it might be okay with 'keep_dims == false' + // TODO Check this fact, and if true, return true regardless of keep_dims + return mean->keep_dims(); +} // Helper to fuse Instance Norm namespace @@ -227,14 +288,61 @@ namespace * | * V * [Out] + *------------------------------------------------------------------- + * [In] + * | + * V + * ifm + * | + * V + * +---------reshape_of_ifm ----+ (reduction indicies) + * | | | | + * | | V V + * | | mean_of_reshape -------------+ + * | V | | + * | sqdiff <--+ (reduction indicies) | + * | | | | + * | V | | + * | mean_as_variance <---+ const_as_epsilon | + * | | | | + * | V | | + * | add_as_variance <--------+ | + * | | | + * | V | + * | rsqrt const_as_gamma | + * | | | | + * | V | | + * | mul_gamma <--+ | + * | | | | + * V V V | + * mul_as_scaled_reshape mul_as_scaled_mean <-----------+ + * | | + * | const_as_beta | + * | | V + * | +------> sub + * V | + * add_as_terminal <----------+ + * | + * V + * reshape_as_terminal + * | + * V + * [Out] */ class InstanceNormPattern final { public: - InstanceNormPattern(luci::CircleAdd *candidate) + enum PatternVersion + { + Version_0, + Version_1 + }; + + InstanceNormPattern(luci::CircleAdd *candidate, PatternVersion pv) { assert(candidate); add_as_terminal = candidate; + _pv = pv; } public: @@ -244,7 +352,9 @@ public: public: // Context loco::Node *ifm = nullptr; + luci::CircleReshape *reshape_of_ifm = nullptr; luci::CircleMean *mean_of_ifm = nullptr; + luci::CircleMean *mean_of_reshape = nullptr; luci::CircleSquaredDifference *sqdiff = nullptr; luci::CircleMean *mean_as_variance = nullptr; luci::CircleConst *const_as_epsilon = nullptr; @@ -254,12 +364,14 @@ public: luci::CircleMul *mul_gamma = nullptr; luci::CircleMul *mul_as_scaled_ifm = nullptr; luci::CircleMul *mul_as_scaled_mean = nullptr; + luci::CircleMul *mul_as_scaled_reshape = nullptr; luci::CircleConst *const_as_beta = nullptr; luci::CircleSub *sub = nullptr; luci::CircleAdd *add_as_terminal = nullptr; private: bool _matched = false; + PatternVersion _pv; }; bool InstanceNormPattern::matched() @@ -273,8 +385,18 @@ bool InstanceNormPattern::matched() // Check order is DFS - CHECK_OR_FALSE(fill(&mul_as_scaled_ifm, &sub).with_commutative_args_of(add_as_terminal)); - CHECK_OR_FALSE(fill(&ifm, &mul_gamma).with_commutative_args_of(mul_as_scaled_ifm)); + if (_pv == PatternVersion::Version_0) + { + CHECK_OR_FALSE(fill(&mul_as_scaled_ifm, &sub).with_commutative_args_of(add_as_terminal)); + CHECK_OR_FALSE(fill(&ifm, &mul_gamma).with_commutative_args_of(mul_as_scaled_ifm)); + } + if (_pv == PatternVersion::Version_1) + { + CHECK_OR_FALSE(fill(&mul_as_scaled_reshape, &sub).with_commutative_args_of(add_as_terminal)); + CHECK_OR_FALSE( + fill(&reshape_of_ifm, &mul_gamma).with_commutative_args_of(mul_as_scaled_reshape)); + ifm = reshape_of_ifm->tensor(); + } CHECK_OR_FALSE(loco::shape_known(ifm)); auto ifm_shape = loco::shape_get(ifm); @@ -284,7 +406,15 @@ bool InstanceNormPattern::matched() uint32_t ifm_channel_depth = ifm_tensor_shape.dim(3).value(); CHECK_OR_FALSE(fill(&rsqrt, &const_as_gamma).with_commutative_args_of(mul_gamma)); - CHECK_OR_FALSE(is_1D_with_dummy_dim(const_as_gamma, ifm_channel_depth)); + + if (_pv == PatternVersion::Version_0) + { + CHECK_OR_FALSE(is_1D_with_dummy_dim(const_as_gamma, ifm_channel_depth)); + } + if (_pv == PatternVersion::Version_1) + { + CHECK_OR_FALSE(is_quasi_1D_with_dummy_dim(const_as_gamma, ifm_channel_depth)); + } add_as_variance = dynamic_cast(rsqrt->x()); CHECK_OR_FALSE(add_as_variance); @@ -296,29 +426,69 @@ bool InstanceNormPattern::matched() // TODO Support regarding broadcast CHECK_OR_FALSE(const_as_epsilon->size() == 1); - CHECK_OR_FALSE(is_instance_mean(mean_as_variance)); + if (_pv == PatternVersion::Version_0) + { + CHECK_OR_FALSE(is_instance_mean_v0(mean_as_variance)); + } + if (_pv == PatternVersion::Version_1) + { + CHECK_OR_FALSE(is_instance_mean_v1(mean_as_variance)); + } + sqdiff = dynamic_cast(mean_as_variance->input()); CHECK_OR_FALSE(sqdiff); - loco::Node *ifm_should_be = nullptr; - CHECK_OR_FALSE(fill(&ifm_should_be, &mean_of_ifm).with_commutative_args_of(sqdiff)); - CHECK_OR_FALSE(ifm == ifm_should_be); - CHECK_OR_FALSE(is_instance_mean(mean_of_ifm)); - CHECK_OR_FALSE(ifm == mean_of_ifm->input()); + if (_pv == PatternVersion::Version_0) + { + loco::Node *ifm_should_be = nullptr; + CHECK_OR_FALSE(fill(&ifm_should_be, &mean_of_ifm).with_commutative_args_of(sqdiff)); + CHECK_OR_FALSE(ifm == ifm_should_be); + CHECK_OR_FALSE(is_instance_mean_v0(mean_of_ifm)); + CHECK_OR_FALSE(ifm == mean_of_ifm->input()); + } + if (_pv == PatternVersion::Version_1) + { + loco::Node *reshape_should_be = nullptr; + CHECK_OR_FALSE(fill(&reshape_should_be, &mean_of_reshape).with_commutative_args_of(sqdiff)); + CHECK_OR_FALSE(reshape_of_ifm == reshape_should_be); + CHECK_OR_FALSE(is_instance_mean_v1(mean_of_reshape)); + CHECK_OR_FALSE(reshape_of_ifm == mean_of_reshape->input()); + } const_as_beta = dynamic_cast(sub->x()); CHECK_OR_FALSE(const_as_beta); - CHECK_OR_FALSE(is_1D_with_dummy_dim(const_as_beta, ifm_channel_depth)); + + if (_pv == PatternVersion::Version_0) + { + CHECK_OR_FALSE(is_1D_with_dummy_dim(const_as_beta, ifm_channel_depth)); + } + if (_pv == PatternVersion::Version_1) + { + CHECK_OR_FALSE(is_quasi_1D_with_dummy_dim(const_as_beta, ifm_channel_depth)); + } mul_as_scaled_mean = dynamic_cast(sub->y()); CHECK_OR_FALSE(mul_as_scaled_mean); luci::CircleMul *mul_gamma_should_be = nullptr; luci::CircleMean *mean_of_ifm_should_be = nullptr; - CHECK_OR_FALSE(fill(&mul_gamma_should_be, &mean_of_ifm_should_be) - .with_commutative_args_of(mul_as_scaled_mean)); - CHECK_OR_FALSE(mul_gamma == mul_gamma_should_be); - CHECK_OR_FALSE(mean_of_ifm == mean_of_ifm_should_be); + luci::CircleMean *mean_of_reshape_should_be = nullptr; + + if (_pv == PatternVersion::Version_0) + { + CHECK_OR_FALSE(fill(&mul_gamma_should_be, &mean_of_ifm_should_be) + .with_commutative_args_of(mul_as_scaled_mean)); + CHECK_OR_FALSE(mul_gamma == mul_gamma_should_be); + CHECK_OR_FALSE(mean_of_ifm == mean_of_ifm_should_be); + } + if (_pv == PatternVersion::Version_1) + { + CHECK_OR_FALSE(fill(&mul_gamma_should_be, &mean_of_reshape_should_be) + .with_commutative_args_of(mul_as_scaled_mean)); + CHECK_OR_FALSE(mul_gamma == mul_gamma_should_be); + CHECK_OR_FALSE(mean_of_reshape == mean_of_reshape_should_be); + } + #undef CHECK_OR_FALSE _matched = true; return true; @@ -381,13 +551,28 @@ namespace luci bool FuseInstanceNormPass::run(loco::Graph *g) { bool changed = false; + luci::CircleAdd *add; + InstanceNormPattern::PatternVersion pv; + for (auto node : loco::active_nodes(loco::output_nodes(g))) { - auto add = dynamic_cast(node); - if (not add) - continue; + auto reshape = dynamic_cast(node); + if (not reshape) + { + add = dynamic_cast(node); + if (not add) + continue; + pv = InstanceNormPattern::PatternVersion::Version_0; + } + else + { + add = dynamic_cast(reshape->tensor()); + if (not add) + continue; + pv = InstanceNormPattern::PatternVersion::Version_1; + } - InstanceNormPattern pattern(add); + InstanceNormPattern pattern(add, pv); if (not pattern.matched()) continue; diff --git a/compiler/luci/pass/src/FuseInstanceNormPass.test.cpp b/compiler/luci/pass/src/FuseInstanceNormPass.test.cpp new file mode 100644 index 0000000..3037f3d --- /dev/null +++ b/compiler/luci/pass/src/FuseInstanceNormPass.test.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FuseInstanceNormPassInternal.h" + +#include + +#include + +namespace +{ + +void setShape(luci::CircleNode &node, const std::vector &v) +{ + node.rank(v.size()); + for (int i = 0; i < v.size(); ++i) + { + node.dim(i) = v[i]; + } +} + +} // namespace + +TEST(FuseInstanceNormPass, is_quasi_1D_with_dummy_dim) +{ + luci::CircleConst const_node; + + setShape(const_node, {}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {1}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {8}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {1, 2, 1, 8, 1}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {8, 3}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {8, 1}); + EXPECT_FALSE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {1, 8, 1}); + EXPECT_TRUE(is_quasi_1D_with_dummy_dim(&const_node, 8)); + + setShape(const_node, {1, 1, 1, 8, 1}); + EXPECT_TRUE(is_quasi_1D_with_dummy_dim(&const_node, 8)); +} diff --git a/compiler/luci/pass/src/FuseInstanceNormPassInternal.h b/compiler/luci/pass/src/FuseInstanceNormPassInternal.h new file mode 100644 index 0000000..32b638b --- /dev/null +++ b/compiler/luci/pass/src/FuseInstanceNormPassInternal.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_CIRCLE_FUSE_INSTANCE_NORM_PASS_INTERNAL_H__ +#define __LUCI_CIRCLE_FUSE_INSTANCE_NORM_PASS_INTERNAL_H__ + +#include + +/// @return true When node has shape of '1 x .. x 1 x depth' +bool is_1D_with_dummy_dim(luci::CircleConst *node, uint32_t depth); + +/// @return true When node has shape of '1 x .. x depth x 1' +bool is_quasi_1D_with_dummy_dim(luci::CircleConst *node, uint32_t depth); + +#endif // __LUCI_CIRCLE_FUSE_INSTANCE_NORM_PASS_INTERNAL_H__ diff --git a/compiler/luci/pass/src/QuantizationUtils.cpp b/compiler/luci/pass/src/QuantizationUtils.cpp new file mode 100644 index 0000000..6726ce7 --- /dev/null +++ b/compiler/luci/pass/src/QuantizationUtils.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "QuantizationUtils.h" + +#include + +#include +#include + +namespace luci +{ + +void compute_sym_scale_zp(float min, float max, float &scaling_factor, int64_t &zp, + float &nudged_min, float &nudged_max) +{ + assert(min != max); + + const int32_t kMaxScale = std::numeric_limits::max(); + const int32_t kMinScale = -kMaxScale; + const double qmin_double = kMinScale; + const double qmax_double = kMaxScale; + const double rmin = std::fmin(0, min); + const double rmax = std::fmax(0, max); + double scale_factor_from_min_side{0}; + double scale_factor_from_max_side{0}; + + if ((qmin_double * rmin) > 0) + scale_factor_from_min_side = rmin / qmin_double; + + if ((qmax_double * rmax) > 0) + scale_factor_from_max_side = rmax / qmax_double; + + scaling_factor = scale_factor_from_min_side > scale_factor_from_max_side + ? scale_factor_from_min_side + : scale_factor_from_max_side; + zp = 0; + nudged_min = static_cast(qmin_double * scaling_factor); + nudged_max = static_cast(qmax_double * scaling_factor); +} + +void compute_asym_scale_zp(float min, float max, float &scaling_factor, int64_t &zp, + float &nudged_min, float &nudged_max) +{ + LOGGER(l); + + assert(min <= max); + const int32_t kMinScale = 0; + const int32_t kMaxScale = 255; + const double qmin_double = kMinScale; + const double qmax_double = kMaxScale; + const double rmin = std::fmin(0, min); + const double rmax = std::fmax(0, max); + + double scale = (rmax - rmin) / (qmax_double - qmin_double); + double zero_point_double = 0; + uint8_t nudged_zero_point = 0; + if (scale == 0) + { + WARN(l) << "The minimum and maximum values are the same." << std::endl; + if (min >= 0 && max >= 0) + zero_point_double = kMinScale; + else + zero_point_double = kMaxScale; + } + else + zero_point_double = qmin_double - rmin / scale; + if (zero_point_double <= qmin_double) + { + assert(min >= 0 && max >= 0); + nudged_zero_point = kMinScale; + scale = max / (qmax_double - qmin_double); + if (min > 0 && max > 0) + WARN(l) << "The minimum and maximum values are all positive." << std::endl; + } + else if (zero_point_double >= qmax_double) + { + assert(min < 0 && max < 0); + nudged_zero_point = kMaxScale; + scale = -min / (qmax_double - qmin_double); + WARN(l) << "The minimum and maximum values are all negative." << std::endl; + } + else + { + assert(min < 0 && max >= 0); + nudged_zero_point = static_cast(std::round(zero_point_double)); + } + + nudged_min = static_cast((qmin_double - nudged_zero_point) * scale); + nudged_max = static_cast((qmax_double - nudged_zero_point) * scale); + + scaling_factor = scale; + zp = nudged_zero_point; +} + +bool get_channel_dim_index(CircleConst *node, loco::TensorShape &dimension, int &channel_dim_index) +{ + auto succs = loco::succs(node); + if (succs.size() != 1) // assume weights is used by only one node + return false; + + for (auto out : succs) + { + auto conv = dynamic_cast(out); + auto dw_conv = dynamic_cast(out); + auto tw_conv = dynamic_cast(out); + auto fc = dynamic_cast(out); + + // Refer to https://github.com/Samsung/ONE/pull/2448. + if ((conv != nullptr && conv->filter() == node) || + (tw_conv != nullptr && tw_conv->filter() == node)) // OHWI + { + assert(node->rank() == 4); + dimension.dim(0).set(node->dim(0).value()); + dimension.dim(1).set(node->dim(1).value()); + dimension.dim(2).set(node->dim(2).value()); + dimension.dim(3).set(node->dim(3).value()); + channel_dim_index = 0; // Set channel_dim_index based on "O" + return true; + } + else if (dw_conv != nullptr && dw_conv->filter() == node) // IHWC + { + assert(node->rank() == 4); + dimension.dim(0).set(node->dim(0).value()); + dimension.dim(1).set(node->dim(1).value()); + dimension.dim(2).set(node->dim(2).value()); + dimension.dim(3).set(node->dim(3).value()); + channel_dim_index = 3; // Set channel_dim_index based on "C" + return true; + } + else if (fc != nullptr && fc->weights() == node) // OI + { + assert(node->rank() == 2); + dimension.dim(0).set(node->dim(0).value()); + dimension.dim(1).set(1); // Set FC layer like CONV + dimension.dim(2).set(1); + dimension.dim(3).set(node->dim(1).value()); + channel_dim_index = 0; // Set channel_dim_index based on "O" + return true; + } + else + { + // node does not support channle-wise quantization + assert(false); + } + } + + return false; +} + +uint32_t cal_offset(loco::TensorShape &dimension, uint32_t *indices) +{ + return indices[0] * dimension.dim(1).value() * dimension.dim(2).value() * + dimension.dim(3).value() + + indices[1] * dimension.dim(2).value() * dimension.dim(3).value() + + indices[2] * dimension.dim(3).value() + indices[3]; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/QuantizationUtils.h b/compiler/luci/pass/src/QuantizationUtils.h new file mode 100644 index 0000000..ec0e86d --- /dev/null +++ b/compiler/luci/pass/src/QuantizationUtils.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LUCI_QUANTIZATION_UTILS_H__ +#define __LUCI_QUANTIZATION_UTILS_H__ + +#include +#include + +namespace luci +{ + +void compute_sym_scale_zp(float min, float max, float &scaling_factor, int64_t &zp, + float &nudged_min, float &nudged_max); + +void compute_asym_scale_zp(float min, float max, float &scaling_factor, int64_t &zp, + float &nudged_min, float &nudged_max); + +bool get_channel_dim_index(CircleConst *node, loco::TensorShape &dimension, int &channel_dim_index); + +uint32_t cal_offset(loco::TensorShape &dimension, uint32_t *indices); + +} // namespace luci + +#endif // __LUCI_QUANTIZATION_UTILS_H__ diff --git a/compiler/luci/pass/src/QuantizeDequantizeWeightsPass.cpp b/compiler/luci/pass/src/QuantizeDequantizeWeightsPass.cpp new file mode 100644 index 0000000..c492234 --- /dev/null +++ b/compiler/luci/pass/src/QuantizeDequantizeWeightsPass.cpp @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/QuantizeDequantizeWeightsPass.h" +#include "QuantizationUtils.h" + +#include +#include +#include +#include + +#include +#include + +namespace luci +{ + +namespace +{ + +void cal_minmax_per_channel(CircleConst *node, std::vector &min, std::vector &max) +{ + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + int size{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + size = dimension.dim(channel_dim_index).value(); + + std::vector has_min_max_value(size, false); + min.resize(size); + max.resize(size); + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + auto data = node->at(cal_offset(dimension, indices)); + if (has_min_max_value[channel_idx]) + { + min[channel_idx] = data < min[channel_idx] ? data : min[channel_idx]; + max[channel_idx] = data > max[channel_idx] ? data : max[channel_idx]; + } + else + { + min[channel_idx] = data; + max[channel_idx] = data; + has_min_max_value[channel_idx] = true; + } + } + } + } + } +} + +void sym_wquant_per_channel(CircleConst *node, std::vector &min, std::vector &max, + std::vector &scaling_factor, std::vector &zp, + std::vector &nudged_min, std::vector &nudged_max) +{ + assert(node->dtype() == loco::DataType::FLOAT32); + const int32_t kMaxScale = std::numeric_limits::max(); + const int32_t kMinScale = -kMaxScale; + + uint32_t size = node->size(); + std::vector quantized_values(size); + + for (size_t i = 0; i < min.size(); ++i) + { + compute_sym_scale_zp(min[i], max[i], scaling_factor[i], zp[i], nudged_min[i], nudged_max[i]); + } + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + const float scaling_factor_inv = 1.0 / scaling_factor[channel_idx]; + auto data = node->at(cal_offset(dimension, indices)); + data = data < nudged_min[channel_idx] ? nudged_min[channel_idx] : data; + data = data > nudged_max[channel_idx] ? nudged_max[channel_idx] : data; + quantized_values[cal_offset(dimension, indices)] = + static_cast(std::round(data * scaling_factor_inv)); + } + } + } + } + + node->dtype(loco::DataType::S16); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = + std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +void sym_wdequant_per_channel(CircleConst *node, std::vector &scaling_factor) +{ + assert(node->dtype() == loco::DataType::S16); + uint32_t size = node->size(); + std::vector dequantized_values(size); + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + auto data = node->at(cal_offset(dimension, indices)); + dequantized_values[cal_offset(dimension, indices)] = + static_cast(data) * scaling_factor[channel_idx]; + } + } + } + } + + node->dtype(loco::DataType::FLOAT32); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = dequantized_values[i]; + } +} + +void asymmetric_wquant_per_channel(CircleConst *node, std::vector &min, + std::vector &max, std::vector &scaling_factor, + std::vector &zp, std::vector &nudged_min, + std::vector &nudged_max) +{ + assert(node->dtype() == loco::DataType::FLOAT32); + + const int32_t kMinScale = 0; + const int32_t kMaxScale = 255; + + uint32_t size = node->size(); + std::vector quantized_values(size); + + for (size_t i = 0; i < min.size(); ++i) + { + compute_asym_scale_zp(min[i], max[i], scaling_factor[i], zp[i], nudged_min[i], nudged_max[i]); + } + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + const float scaling_factor_inv = 1.0 / scaling_factor[channel_idx]; + auto data = node->at(cal_offset(dimension, indices)); + data = data < nudged_min[channel_idx] ? nudged_min[channel_idx] : data; + data = data > nudged_max[channel_idx] ? nudged_max[channel_idx] : data; + quantized_values[cal_offset(dimension, indices)] = static_cast( + std::round((data - nudged_min[channel_idx]) * scaling_factor_inv)); + } + } + } + } + + node->dtype(loco::DataType::U8); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +void asymmetric_wdequant_per_channel(CircleConst *node, std::vector &scaling_factor, + std::vector &nudged_min) +{ + assert(node->dtype() == loco::DataType::U8); + uint32_t size = node->size(); + std::vector dequantized_values(size); + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + auto data = node->at(cal_offset(dimension, indices)); + dequantized_values[cal_offset(dimension, indices)] = + static_cast(data) * scaling_factor[channel_idx] + nudged_min[channel_idx]; + } + } + } + } + + node->dtype(loco::DataType::FLOAT32); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = dequantized_values[i]; + } +} + +void asymmetric_wquant_with_minmax_per_layer(CircleConst *node, float min, float max, + float &scaling_factor, int64_t &zp, float &nudged_min, + float &nudged_max) +{ + + const int32_t kMinScale = 0; + const int32_t kMaxScale = 255; + + uint32_t size = node->size(); + compute_asym_scale_zp(min, max, scaling_factor, zp, nudged_min, nudged_max); + const float scaling_factor_inv = 1.0 / scaling_factor; + std::vector quantized_values(size); + for (uint32_t i = 0; i < size; ++i) + { + // clipping + auto data = node->at(i); + data = data < nudged_min ? nudged_min : data; + data = data > nudged_max ? nudged_max : data; + quantized_values[i] = + static_cast(std::round((data - nudged_min) * scaling_factor_inv)); + } + + node->dtype(loco::DataType::U8); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +void asymmetric_wdequant_with_minmax_per_layer(CircleConst *node, float scaling_factor, + float nudged_min) +{ + uint32_t size = node->size(); + std::vector dequantized_values(size); + for (uint32_t i = 0; i < size; ++i) + { + auto data = node->at(i); + dequantized_values[i] = static_cast(data) * scaling_factor + nudged_min; + } + + node->dtype(loco::DataType::FLOAT32); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = dequantized_values[i]; + } +} + +bool is_quantized(const CircleNode *node) +{ + return node->dtype() == loco::DataType::U8 || // activation, weight + node->dtype() == loco::DataType::S16 || // activation, weight + node->dtype() == loco::DataType::S32; // bias +} + +// Check if node is weights of conv2d, transepose_conv2d, depthwise_conv2d, or fully_connected layer +bool is_weights(CircleNode *node) +{ + auto circle_const = dynamic_cast(node); + if (circle_const == nullptr) + return false; + + auto succs = loco::succs(node); + if (succs.size() != 1) // assume weights is used by only one node + return false; + + for (auto out : succs) + { + auto conv = dynamic_cast(out); + if (conv != nullptr && conv->filter() == circle_const && circle_const->rank() == 4) + return true; + + auto dw_conv = dynamic_cast(out); + if (dw_conv != nullptr && dw_conv->filter() == circle_const && circle_const->rank() == 4) + return true; + + auto tw_conv = dynamic_cast(out); + if (tw_conv != nullptr && tw_conv->filter() == circle_const && circle_const->rank() == 4) + return true; + + auto fc = dynamic_cast(out); + if (fc != nullptr && fc->weights() == circle_const && circle_const->rank() == 2) + return true; + } + return false; +} + +/** + * @brief QuantizeDequantizeWeights quantizes and dequantizes tensors for weights + * @details Find min/max values on the fly, quantize the model, and dequantize the model + */ +struct QuantizeDequantizeWeights final : public luci::CircleNodeMutableVisitor +{ + QuantizeDequantizeWeights(loco::DataType input, loco::DataType output, + QuantizationGranularity granularity) + : input_type(input), output_type(output), granularity(granularity) + { + } + + loco::DataType input_type; + loco::DataType output_type; + QuantizationGranularity granularity; + + // Quantize and dequantize input tensors of each node + bool visit(luci::CircleNode *node) + { + assert(output_type == loco::DataType::U8 || output_type == loco::DataType::S16); + LOGGER(l); + INFO(l) << "QuantizeDequantizeWeights visit node: " << node->name() << std::endl; + auto arity = node->arity(); + for (uint32_t i = 0; i < arity; i++) + { + auto input_node = node->arg(i); + auto circle_node = loco::must_cast(input_node); + + // Check if this is already quantized + if (is_quantized(circle_node)) + continue; + + if (is_weights(circle_node)) + { + auto circle_const = loco::must_cast(circle_node); + + // Find min/max per channel-wise + if (granularity == QuantizationGranularity::ChannelWise) + { + std::vector min; + std::vector max; + + cal_minmax_per_channel(circle_const, min, max); + + std::vector nudged_min(min.size()); + std::vector nudged_max(min.size()); + std::vector scaling_factor(min.size()); + std::vector zp(min.size()); + + if (output_type == loco::DataType::U8) + { + asymmetric_wquant_per_channel(circle_const, min, max, scaling_factor, zp, nudged_min, + nudged_max); + asymmetric_wdequant_per_channel(circle_const, scaling_factor, nudged_min); + } + else + { + sym_wquant_per_channel(circle_const, min, max, scaling_factor, zp, nudged_min, + nudged_max); + sym_wdequant_per_channel(circle_const, scaling_factor); + } + + auto quantparam = std::make_unique(); + quantparam->min = nudged_min; + quantparam->max = nudged_max; + quantparam->scale = scaling_factor; + quantparam->zerop = zp; + circle_node->quantparam(std::move(quantparam)); + } + // Find min/max per layer-wise + else + { + float min = std::numeric_limits::max(); + float max = std::numeric_limits::lowest(); + for (uint32_t i = 0; i < circle_const->size(); i++) + { + auto data = circle_const->at(i); + min = data < min ? data : min; + max = data > max ? data : max; + } + float scaling_factor{0}; + int64_t zp{0}; + float nudged_min{0}; + float nudged_max{0}; + + asymmetric_wquant_with_minmax_per_layer(circle_const, min, max, scaling_factor, zp, + nudged_min, nudged_max); + asymmetric_wdequant_with_minmax_per_layer(circle_const, scaling_factor, nudged_min); + auto quantparam = std::make_unique(); + quantparam->min.push_back(nudged_min); + quantparam->max.push_back(nudged_max); + quantparam->scale.push_back(scaling_factor); + quantparam->zerop.push_back(zp); + circle_node->quantparam(std::move(quantparam)); + } + } + } + return false; + } +}; + +} // namespace + +bool QuantizeDequantizeWeightsPass::run(loco::Graph *g) +{ + LOGGER(l); + INFO(l) << "QuantizeDequantizeWeightsPass Start" << std::endl; + + // Quantize weights + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + QuantizeDequantizeWeights qw(_input_dtype, _output_dtype, _granularity); + auto circle_node = loco::must_cast(node); + circle_node->accept(&qw); + } + + INFO(l) << "QuantizeDequantizeWeightsPass End" << std::endl; + return false; // one time run +} + +} // namespace luci diff --git a/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp b/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp new file mode 100644 index 0000000..f8abee7 --- /dev/null +++ b/compiler/luci/pass/src/QuantizeWithMinMaxPass.cpp @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/QuantizeWithMinMaxPass.h" +#include "QuantizationUtils.h" + +#include +#include +#include + +#include + +#include +#include + +namespace luci +{ + +namespace +{ + +// Check if the node is the bias of Conv2D, DepthwiseConv2D, or FullyConnected layer +// If true, return pair of the successor node (used to quantize bias) +// If flase, return +std::pair get_input_weight_of_bias(CircleNode *node) +{ + auto circle_const = dynamic_cast(node); + if (circle_const == nullptr) + return std::make_pair(nullptr, nullptr); + + auto succs = loco::succs(node); + if (succs.size() != 1) // assume bias is used by only one node + return std::make_pair(nullptr, nullptr); + + for (auto out : succs) + { + auto conv = dynamic_cast(out); + if (conv != nullptr && conv->bias() == circle_const) + { + assert(conv->input() != nullptr); + assert(conv->filter() != nullptr); + return std::make_pair(conv->input(), conv->filter()); + } + auto dw_conv = dynamic_cast(out); + if (dw_conv != nullptr && dw_conv->bias() == circle_const) + { + assert(dw_conv->input() != nullptr); + assert(dw_conv->filter() != nullptr); + return std::make_pair(dw_conv->input(), dw_conv->filter()); + } + auto fc = dynamic_cast(out); + if (fc != nullptr && fc->bias() == circle_const) + { + assert(fc->input() != nullptr); + assert(fc->weights() != nullptr); + return std::make_pair(fc->input(), fc->weights()); + } + } + return std::make_pair(nullptr, nullptr); +} + +void asym_quant_bias_per_layer(CircleConst *node, float input_scale, float weight_scale, + float *scaling_factor, int64_t *zp) +{ + float scale = input_scale * weight_scale; + const float scaling_factor_inv = (scale == 0) ? 0 : 1.0 / scale; + + uint32_t size = node->size(); + std::vector quantized_values(size); + for (uint32_t i = 0; i < size; ++i) + { + quantized_values[i] = + static_cast(std::round(node->at(i) * scaling_factor_inv)); + } + + node->dtype(loco::DataType::S32); // change the type of tensor + node->size(size); // resize tensor + const int32_t kMinScale = std::numeric_limits::lowest(); + const int32_t kMaxScale = std::numeric_limits::max(); + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = + std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } + *scaling_factor = scale; + *zp = 0; +} + +void quant_bias_per_channel(CircleConst *node, float input_scale, std::vector &weight_scale, + std::vector &scaling_factor, std::vector &zp) +{ + float scaling_factor_inv{0}; + + uint32_t size = node->size(); + std::vector quantized_values(size); + + for (uint32_t i = 0; i < size; ++i) + { + scaling_factor[i] = input_scale * weight_scale[i]; + scaling_factor_inv = (scaling_factor[i] == 0) ? 0 : 1.0 / scaling_factor[i]; + quantized_values[i] = + static_cast(std::round(node->at(i) * scaling_factor_inv)); + zp[i] = 0; + } + + node->dtype(loco::DataType::S32); // change the type of tensor + node->size(size); // resize tensor + const int32_t kMinScale = std::numeric_limits::lowest(); + const int32_t kMaxScale = std::numeric_limits::max(); + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = + std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +bool has_min_max(const CircleNode *node) +{ + return node->quantparam() && !node->quantparam()->min.empty() && !node->quantparam()->max.empty(); +} + +bool is_quantized(const CircleNode *node) +{ + return node->dtype() == loco::DataType::U8 || // activation, weight + node->dtype() == loco::DataType::S32; // bias +} + +void sym_wquant_per_channel(CircleConst *node, std::vector &scaling_factor) +{ + assert(node->dtype() == loco::DataType::FLOAT32); + + const int32_t kMaxScale = std::numeric_limits::max(); + const int32_t kMinScale = -kMaxScale; + + uint32_t size = node->size(); + std::vector quantized_values(size); + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + const float scaling_factor_inv = 1.0 / scaling_factor[channel_idx]; + auto data = node->at(cal_offset(dimension, indices)); + quantized_values[cal_offset(dimension, indices)] = + static_cast(std::round(data * scaling_factor_inv)); + } + } + } + } + + node->dtype(loco::DataType::S16); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = + std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +void asym_wquant_per_channel(CircleConst *node, std::vector &min, + std::vector &scaling_factor) +{ + assert(node->dtype() == loco::DataType::FLOAT32); + + const int32_t kMinScale = 0; + const int32_t kMaxScale = 255; + + uint32_t size = node->size(); + std::vector quantized_values(size); + + loco::TensorShape dimension; + dimension.rank(4); + uint32_t indices[4] = { + 0, + }; + int channel_dim_index{0}; + + if (!get_channel_dim_index(node, dimension, channel_dim_index)) + { + assert(false); + return; + } + + for (indices[0] = 0; indices[0] < dimension.dim(0).value(); indices[0]++) + { + for (indices[1] = 0; indices[1] < dimension.dim(1).value(); indices[1]++) + { + for (indices[2] = 0; indices[2] < dimension.dim(2).value(); indices[2]++) + { + for (indices[3] = 0; indices[3] < dimension.dim(3).value(); indices[3]++) + { + int channel_idx = indices[channel_dim_index]; + const float scaling_factor_inv = 1.0 / scaling_factor[channel_idx]; + auto data = node->at(cal_offset(dimension, indices)); + quantized_values[cal_offset(dimension, indices)] = + static_cast(std::round((data - min[channel_idx]) * scaling_factor_inv)); + } + } + } + } + + node->dtype(loco::DataType::U8); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +void asym_wquant_per_layer(CircleConst *node, float min, float scaling_factor) +{ + const int32_t kMinScale = 0; + const int32_t kMaxScale = 255; + + uint32_t size = node->size(); + + const float scaling_factor_inv = 1.0 / scaling_factor; + std::vector quantized_values(size); + for (uint32_t i = 0; i < size; ++i) + { + auto data = node->at(i); + quantized_values[i] = static_cast(std::round((data - min) * scaling_factor_inv)); + } + + node->dtype(loco::DataType::U8); // change the type of tensor + node->size(size); // resize tensor + for (uint32_t i = 0; i < size; ++i) + { + node->at(i) = std::min(kMaxScale, std::max(kMinScale, quantized_values[i])); + } +} + +// Check if node is weights of conv2d, depthwise_conv2d, or fully_connected layer +bool is_weights(CircleNode *node) +{ + auto circle_const = dynamic_cast(node); + if (circle_const == nullptr) + return false; + + auto succs = loco::succs(node); + if (succs.size() != 1) // assume weights is used by only one node + return false; + + for (auto out : succs) + { + auto conv = dynamic_cast(out); + if (conv != nullptr && conv->filter() == circle_const) + return true; + + auto dw_conv = dynamic_cast(out); + if (dw_conv != nullptr && dw_conv->filter() == circle_const) + return true; + + auto fc = dynamic_cast(out); + if (fc != nullptr && fc->weights() == circle_const) + return true; + } + return false; +} + +/** + * @brief QuantizeActivation quantizes tensors for activations + * @details Quantize using recorded min/max values + */ +struct QuantizeActivation final : public luci::CircleNodeMutableVisitor +{ + QuantizeActivation(loco::DataType input, loco::DataType output) + : input_type(input), output_type(output) + { + } + + loco::DataType input_type; + loco::DataType output_type; + + // Quantize input tensors of each node + bool visit(luci::CircleNode *node) + { + LOGGER(l); + INFO(l) << "QuantizeActivation visit node: " << node->name() << std::endl; + auto arity = node->arity(); + for (uint32_t i = 0; i < arity; i++) + { + auto input_node = node->arg(i); + auto circle_node = loco::must_cast(input_node); + + // Check if this is already quantized + if (is_quantized(circle_node)) + continue; + + // Check if this is bias (bias is quantized later) + auto iw = get_input_weight_of_bias(circle_node); + if (iw.first != nullptr && iw.second != nullptr) + continue; + + // Check if this is activation + // We assume min/max are recorded only for activations + if (has_min_max(circle_node) && !is_weights(circle_node)) + { + // Quantize using recorded min/max + auto quantparam = circle_node->quantparam(); + assert(quantparam->min.size() == 1); // only support layer-wise quant + assert(quantparam->max.size() == 1); // only support layer-wise quant + auto min = quantparam->min[0]; + auto max = quantparam->max[0]; + + float scaling_factor{0}; + int64_t zp{0}; + float nudged_min{0}; + float nudged_max{0}; + + if (output_type == loco::DataType::U8) + { + compute_asym_scale_zp(min, max, scaling_factor, zp, nudged_min, nudged_max); + circle_node->dtype(loco::DataType::U8); + } + else + { + compute_sym_scale_zp(min, max, scaling_factor, zp, nudged_min, nudged_max); + circle_node->dtype(loco::DataType::S16); + } + + circle_node->quantparam()->max[0] = nudged_max; + circle_node->quantparam()->min[0] = nudged_min; + circle_node->quantparam()->scale.push_back(scaling_factor); + circle_node->quantparam()->zerop.push_back(zp); + } + } + return false; + } +}; + +struct QuantizeBias final : public luci::CircleNodeMutableVisitor +{ + QuantizeBias(loco::DataType input, loco::DataType output, QuantizationGranularity gr) + : input_type(input), output_type(output), granularity(gr) + { + } + + loco::DataType input_type; + loco::DataType output_type; + QuantizationGranularity granularity; + + // Quantize bias node + bool visit(luci::CircleNode *node) + { + // Check if this is already quantized + if (is_quantized(node)) + return false; + + // Check if this is bias + auto iw = get_input_weight_of_bias(node); + if (iw.first == nullptr || iw.second == nullptr) + return false; + + auto input = loco::must_cast(iw.first); + auto weight = loco::must_cast(iw.second); + + if (granularity == QuantizationGranularity::ChannelWise) + { + assert(input->quantparam()->scale.size() == 1); // input scale's layer-wise + auto input_scale = input->quantparam()->scale[0]; + + assert(weight->quantparam() != nullptr); // weight scale's channel-wise + auto weight_scale = weight->quantparam()->scale; + + auto circle_const = loco::must_cast(node); + + uint32_t size = circle_const->size(); + assert(size == weight_scale.size()); + std::vector scaling_factor(size); + std::vector zp(size); + + quant_bias_per_channel(circle_const, input_scale, weight_scale, scaling_factor, zp); + + auto quantparam = std::make_unique(); + quantparam->scale = scaling_factor; + quantparam->zerop = zp; + assert(circle_const->quantparam() == nullptr); // bias should not be quantized before + circle_const->quantparam(std::move(quantparam)); + } + else + { + assert(input->quantparam()->scale.size() == 1); // Only support per-layer quant + auto input_scale = input->quantparam()->scale[0]; + + assert(weight->quantparam()->scale.size() == 1); // Only support per-layer quant + auto weight_scale = weight->quantparam()->scale[0]; + + auto circle_const = loco::must_cast(node); + float scaling_factor{0}; + int64_t zp{0}; + asym_quant_bias_per_layer(circle_const, input_scale, weight_scale, &scaling_factor, &zp); + auto quantparam = std::make_unique(); + quantparam->scale.push_back(scaling_factor); + quantparam->zerop.push_back(zp); + assert(circle_const->quantparam() == nullptr); // bias should not be quantized before + circle_const->quantparam(std::move(quantparam)); + } + return false; + } +}; + +/** + * @brief QuantizeWeights quantizes tensors for weights + * @details Find min/max values on the fly and then quantize + */ +struct QuantizeWeights final : public luci::CircleNodeMutableVisitor +{ + QuantizeWeights(loco::DataType input, loco::DataType output, QuantizationGranularity gr) + : input_type(input), output_type(output), granularity(gr) + { + } + + loco::DataType input_type; + loco::DataType output_type; + QuantizationGranularity granularity; + + // Quantize input tensors of each node + bool visit(luci::CircleNode *node) + { + LOGGER(l); + INFO(l) << "QuantizeWeights visit node: " << node->name() << std::endl; + auto arity = node->arity(); + for (uint32_t i = 0; i < arity; i++) + { + auto input_node = node->arg(i); + auto circle_node = loco::must_cast(input_node); + + // Check if this is already quantized + if (is_quantized(circle_node)) + continue; + + if (is_weights(circle_node)) + { + auto circle_const = loco::must_cast(circle_node); + + // Find min/max per channel-wise + if (granularity == QuantizationGranularity::ChannelWise) + { + auto quantparam = circle_node->quantparam(); + assert(quantparam != nullptr); + auto min = quantparam->min; + auto scaling_factor = quantparam->scale; + + if (output_type == loco::DataType::U8) + { + asym_wquant_per_channel(circle_const, min, scaling_factor); + } + else + { + sym_wquant_per_channel(circle_const, scaling_factor); + } + } + // Find min/max per layer-wise + else + { + // Quantize using recorded quantparam + auto quantparam = circle_node->quantparam(); + assert(quantparam != nullptr); + assert(quantparam->min.size() == 1); // only support layer-wise quant + assert(quantparam->scale.size() == 1); // only support layer-wise quant + auto min = quantparam->min[0]; + auto scaling_factor = quantparam->scale[0]; + asym_wquant_per_layer(circle_const, min, scaling_factor); + } + } + } + return false; + } +}; + +} // namespace + +bool QuantizeWithMinMaxPass::run(loco::Graph *g) +{ + LOGGER(l); + INFO(l) << "QuantizeWithMinMaxPass Start" << std::endl; + + // Quantize activation + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + QuantizeActivation qa(_input_dtype, _output_dtype); + auto circle_node = loco::must_cast(node); + circle_node->accept(&qa); + } + + // Quantize weights + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + QuantizeWeights qw(_input_dtype, _output_dtype, _granularity); + auto circle_node = loco::must_cast(node); + circle_node->accept(&qw); + } + + // Quantize bias + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + QuantizeBias qb(_input_dtype, _output_dtype, _granularity); + auto circle_node = loco::must_cast(node); + circle_node->accept(&qb); + } + + // Update output dtype + auto graph_outputs = g->outputs(); + for (auto node : loco::output_nodes(g)) + { + auto circle_node = loco::must_cast(node); + if (static_cast(circle_node->from())->dtype() == _output_dtype) + { + circle_node->dtype(_output_dtype); + auto graph_output = graph_outputs->at(circle_node->index()); + graph_output->dtype(_output_dtype); + } + } + + INFO(l) << "QuantizeWithMinMaxPass End" << std::endl; + return false; // one time run +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ResolveCustomOpAddPass.cpp b/compiler/luci/pass/src/ResolveCustomOpAddPass.cpp new file mode 100644 index 0000000..e52d667 --- /dev/null +++ b/compiler/luci/pass/src/ResolveCustomOpAddPass.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ResolveCustomOpAddPass.h" + +#include "flatbuffers/flexbuffers.h" + +#include +#include + +namespace +{ + +/// @brief Returns the index of BroadcastTo node among cop's inputs. +// NOTE This function assumes there is only one BroadcastTo node among its inputs. +int32_t get_broadcastTo_index_among_inputs_of(luci::CircleCustom *cop) +{ + for (uint32_t idx = 0; idx < cop->numInputs(); idx++) + { + auto input = dynamic_cast(cop->inputs(idx)); + if (input) + { + auto broadcastTo = loco::must_cast(input->input()); + if (broadcastTo->custom_code() == "BroadcastTo") + return idx; + } + } + + return -1; +} + +/** BEFORE + * [CircleConst] + * | + * [CircleNode] [BroadcastTo(CircleCustom)] + * \ | + * \ [CircleCustomOUt] + * \ / + * [AddV2(CircleCustom)] + * AFTER + * + * [CircleConst] [CircleNode] + * \ / + * \ / + * [CircleAdd] + */ +bool resolve_with_BroadcastTo(luci::CircleCustom *addv2) +{ + int32_t broadcastTo_idx = get_broadcastTo_index_among_inputs_of(addv2); + + if (broadcastTo_idx == -1) + return false; + + auto input = loco::must_cast(addv2->inputs(broadcastTo_idx)); + auto broadcastTo = loco::must_cast(input->input()); + + auto add = addv2->graph()->nodes()->create(); + add->fusedActivationFunction(luci::FusedActFunc::NONE); + add->x(addv2->inputs(1 - broadcastTo_idx)); + add->y(broadcastTo->inputs(0)); + auto customOut = loco::succs(addv2); + assert(customOut.size() == 1); + replace(*customOut.begin()).with(add); + + return true; +} + +bool resolve_custom_op(luci::CircleCustom *addv2) +{ + const std::string custom_code = addv2->custom_code(); + const std::vector custom_options = addv2->custom_options(); + + if (custom_code != "AddV2") + return false; + + if (resolve_with_BroadcastTo(addv2)) + return true; + + auto add = addv2->graph()->nodes()->create(); + add->fusedActivationFunction(luci::FusedActFunc::NONE); + add->x(addv2->inputs(0)); + add->y(addv2->inputs(1)); + auto customOut = loco::succs(addv2); + assert(customOut.size() == 1); + replace(*customOut.begin()).with(add); + + return true; +} + +} // namespace + +namespace luci +{ + +bool ResolveCustomOpAddPass::run(loco::Graph *g) +{ + bool changed = false; + + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto cop = dynamic_cast(node); + if (not cop) + continue; + + changed |= resolve_custom_op(cop); + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ResolveCustomOpBatchMatMulPass.cpp b/compiler/luci/pass/src/ResolveCustomOpBatchMatMulPass.cpp new file mode 100644 index 0000000..145e9cb --- /dev/null +++ b/compiler/luci/pass/src/ResolveCustomOpBatchMatMulPass.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ResolveCustomOpBatchMatMulPass.h" + +#include "flatbuffers/flexbuffers.h" + +#include + +namespace +{ + +bool resolve_custom_op(luci::CircleCustom *cop) +{ + const std::string custom_code = cop->custom_code(); + const std::vector custom_options = cop->custom_options(); + + if (custom_code == "BatchMatMulV2") + { + auto batch_matmul = cop->graph()->nodes()->create(); + // input + batch_matmul->x(cop->inputs(0)); + batch_matmul->y(cop->inputs(1)); + // TODO find much better way of parsing custom_options + // adj + auto map = flexbuffers::GetRoot(custom_options).AsMap(); + batch_matmul->adj_x(map["adj_x"].AsBool()); + batch_matmul->adj_y(map["adj_y"].AsBool()); + + replace(cop).with(batch_matmul); + return true; + } + return false; +} + +} // namespace + +namespace luci +{ + +bool ResolveCustomOpBatchMatMulPass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto cop = dynamic_cast(node); + if (not cop) + continue; + + changed |= resolve_custom_op(cop); + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/pass/src/ResolveCustomOpMatMulPass.cpp b/compiler/luci/pass/src/ResolveCustomOpMatMulPass.cpp new file mode 100644 index 0000000..547fd22 --- /dev/null +++ b/compiler/luci/pass/src/ResolveCustomOpMatMulPass.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "luci/Pass/ResolveCustomOpMatMulPass.h" + +#include "flatbuffers/flexbuffers.h" +#include + +#include + +#include +#include +#include +#include + +namespace +{ + +template +luci::CircleConst *create_const_node(loco::Graph *g, const loco::DataType dtype, + const std::vector &shape, + const std::vector &values) +{ + auto node = g->nodes()->create(); + node->dtype(dtype); + node->rank(shape.size()); + + uint32_t size = 1; + for (uint32_t i = 0; i < shape.size(); ++i) + { + node->dim(i) = shape.at(i); + size *= shape.at(i); + } + +#define INIT_VALUES(DT) \ + { \ + node->size
(size); \ + for (uint32_t i = 0; i < values.size(); ++i) \ + node->at
(i) = values[i]; \ + } + + switch (dtype) + { + case loco::DataType::U8: + INIT_VALUES(loco::DataType::U8); + break; + case loco::DataType::S16: + INIT_VALUES(loco::DataType::S16); + break; + case loco::DataType::S32: + INIT_VALUES(loco::DataType::S32); + break; + case loco::DataType::FLOAT32: + INIT_VALUES(loco::DataType::FLOAT32) + break; + default: + INTERNAL_EXN("create_const_node called with unsupported type"); + break; + } + return node; +} + +bool resolve_matmul(luci::CircleCustom *cop) +{ +#define CHECK_OR_FALSE(condition) \ + if (not(condition)) \ + return false; +#define CHECK_OR_THROW(condition, message) \ + if (not(condition)) \ + INTERNAL_EXN(message); + + auto graph = cop->graph(); + const std::vector custom_options = cop->custom_options(); + auto map = flexbuffers::GetRoot(custom_options).AsMap(); + const auto U8 = loco::DataType::U8; + const auto S16 = loco::DataType::S16; + const auto S32 = loco::DataType::S32; + const auto FLOAT32 = loco::DataType::FLOAT32; + + bool transpose_a = map["transpose_a"].AsBool(); + bool transpose_b = map["transpose_b"].AsBool(); + + loco::Node *lhs = cop->inputs(0); + loco::Node *rhs = cop->inputs(1); + + // Check that the type of the first input is known + CHECK_OR_FALSE(loco::dtype_known(lhs)); + auto lhs_dtype = loco::dtype_get(cop->inputs(0)); + + // If transpose of first input is requested, its shape must be known + CHECK_OR_FALSE(!transpose_a || loco::shape_known(lhs)); + // and its rank should be at least 2 + CHECK_OR_FALSE(!transpose_a || loco::shape_get(lhs).as().rank() >= 2); + // Check that the shape of the 2nd input is known + CHECK_OR_FALSE(loco::shape_known(rhs)); + // TODO as of 06/23/20 TFLite only supports rank 2 for 2nd input. Fix this once that changes! + CHECK_OR_FALSE(loco::shape_get(rhs).as().rank() == 2); + // Check that input data type is supported + CHECK_OR_THROW(lhs_dtype == U8 || lhs_dtype == S16 || lhs_dtype == FLOAT32, + "Only UInt8, Int16 and Float32 data types are supported by MatMul"); + + if (transpose_a) + { + auto a_shape = loco::shape_get(lhs).as(); + // Create a permutation constant node + std::vector perm; + for (uint32_t i = 0; i < a_shape.rank(); ++i) + perm.push_back(i); + std::swap(perm[a_shape.rank() - 1], perm[a_shape.rank() - 2]); + auto perm_node = create_const_node(graph, S32, {a_shape.rank()}, perm); + // Now make a transpose node + auto transpose_node = graph->nodes()->create(); + transpose_node->a(lhs); + transpose_node->perm(perm_node); + lhs = transpose_node; + } + + // Transpose the second input if needed. TFLite FullyConnected operator + // assumes the second input is in column-major order, but the input is + // in row-major order, thus we need to convert between them. + if (!transpose_b) + { + const std::vector perm{1, 0}; + auto perm_node = create_const_node(graph, S32, {2}, perm); + auto transpose_node = graph->nodes()->create(); + transpose_node->a(rhs); + transpose_node->perm(perm_node); + rhs = transpose_node; + } + + // Make a constant zero-filled bias node + auto b_shape = loco::shape_get(cop->inputs(1)).as(); + uint32_t bias_size = b_shape.dim(transpose_b ? 1 : 0).value(); + const std::vector val(bias_size, .0f); + auto bias_node = create_const_node(graph, lhs_dtype, {bias_size}, val); + auto fc_node = graph->nodes()->create(); + fc_node->input(lhs); + fc_node->weights(rhs); + fc_node->bias(bias_node); + fc_node->fusedActivationFunction(luci::FusedActFunc::NONE); + + replace(cop).with(fc_node); + return true; +} + +} // namespace + +namespace luci +{ + +bool ResolveCustomOpMatMulPass::run(loco::Graph *g) +{ + bool changed = false; + for (auto node : loco::active_nodes(loco::output_nodes(g))) + { + auto cop = dynamic_cast(node); + if (not cop) + continue; + + if (cop->custom_code() != "MatMul") + continue; + + if (!resolve_matmul(cop)) + continue; + + changed = true; + } + + return changed; +} + +} // namespace luci diff --git a/compiler/luci/requires.cmake b/compiler/luci/requires.cmake index e88dabd..e52523d 100644 --- a/compiler/luci/requires.cmake +++ b/compiler/luci/requires.cmake @@ -1,5 +1,7 @@ +require("foder") require("loco") require("locop") +require("logo") require("logo-core") require("mio-circle") require("oops") diff --git a/compiler/luci/service/src/CircleShapeInference.cpp b/compiler/luci/service/src/CircleShapeInference.cpp index fdcfa76..0732849 100644 --- a/compiler/luci/service/src/CircleShapeInference.cpp +++ b/compiler/luci/service/src/CircleShapeInference.cpp @@ -27,11 +27,8 @@ namespace luci ShapeDescription ShapeInference::get(loco::Node *node) { - // TODO Adjust indentation level - { - assert(loco::shape_known(node)); - return to_shape_description(loco::shape_get(node)); - } + assert(loco::shape_known(node)); + return to_shape_description(loco::shape_get(node)); } } // namespace luci diff --git a/compiler/luci/service/src/CircleShapeInferenceRule.cpp b/compiler/luci/service/src/CircleShapeInferenceRule.cpp index c8e872b..a291cfe 100644 --- a/compiler/luci/service/src/CircleShapeInferenceRule.cpp +++ b/compiler/luci/service/src/CircleShapeInferenceRule.cpp @@ -17,6 +17,8 @@ #include "luci/Service/CircleShapeInferenceRule.h" #include "Check.h" +#include "ShapeInfer_StridedSlice.h" + #include #include #include @@ -26,11 +28,25 @@ #include #include +#include #include namespace { +std::ostream &operator<<(std::ostream &os, const loco::TensorShape &tensor_shape) +{ + os << "["; + for (uint32_t r = 0; r < tensor_shape.rank(); ++r) + { + if (r) + os << ","; + os << tensor_shape.dim(r).value(); + } + os << "]"; + return os; +} + // Call this for CircleAvgPool2D and CircleMaxPool2D only template loco::NodeShape infer_pool_2d_shape(const Pool2DType *node) { @@ -176,6 +192,157 @@ loco::TensorShape broadcast_shape(const loco::TensorShape &x, const loco::Tensor return output_shape; } +// BatchMatMulV2 supports broadcasting in the batch dimensions(BatchMatMul doesn't) +// TODO Distinguish BatchMatMul and BatchMatMulV2 +loco::NodeShape infer_batchmatmul_shape(const loco::TensorShape &x_shape, + const loco::TensorShape &y_shape, bool adj_x, bool adj_y) +{ + uint32_t x_rank = x_shape.rank(); + uint32_t y_rank = y_shape.rank(); + assert(x_rank >= 2 && y_rank >= 2); + + loco::TensorShape output_shape; + output_shape.rank(x_shape.rank()); + // Braodcast in the batch dimension + if (x_rank > 2 || y_rank > 2) + { + loco::TensorShape dummy_x = x_shape; + loco::TensorShape dummy_y = y_shape; + expand_rank(dummy_x, dummy_y); + if (x_rank < y_rank) + expand_rank(output_shape, dummy_y); + + for (uint32_t d = 0; d < output_shape.rank() - 2; d++) + { + uint32_t max_dim = std::max(dummy_x.dim(d).value(), dummy_y.dim(d).value()); + if (dummy_x.dim(d) == dummy_y.dim(d) || + dummy_x.dim(d).value() * dummy_y.dim(d).value() == max_dim) + output_shape.dim(d).set(max_dim); + else + INTERNAL_EXN("BatchMatMul has wrong shape"); + } + } + + loco::Dimension x_lhs = adj_x ? x_shape.dim(x_rank - 1) : x_shape.dim(x_rank - 2); + loco::Dimension x_rhs = adj_x ? x_shape.dim(x_rank - 2) : x_shape.dim(x_rank - 1); + loco::Dimension y_lhs = adj_y ? y_shape.dim(y_rank - 1) : y_shape.dim(y_rank - 2); + loco::Dimension y_rhs = adj_y ? y_shape.dim(y_rank - 2) : y_shape.dim(y_rank - 1); + + if (not(x_rhs == y_lhs)) + INTERNAL_EXN("x_rhs and y_lhs should be same"); + + uint32_t out_rank = output_shape.rank(); + output_shape.dim(out_rank - 2) = x_lhs; + output_shape.dim(out_rank - 1) = y_rhs; + + return loco::NodeShape{output_shape}; +} + +loco::TensorShape own_shape(const luci::CircleNode *node) +{ + loco::TensorShape shape; + shape.rank(node->rank()); + for (uint32_t r = 0; r < node->rank(); ++r) + shape.dim(r) = loco::Dimension(node->dim(r).value()); + return shape; +} + +loco::TensorShape infer_reducer(const loco::Node *input, const loco::Node *indices, bool keep_dims) +{ + const loco::DataType S32 = loco::DataType::S32; + + auto input_shape = loco::shape_get(input).as(); + auto reduction_indices = loco::must_cast(indices); + + { // Exceptions + // TODO support non-const case + // TODO support other data type + LUCI_ASSERT(reduction_indices->dtype() == S32, "Only support int 32"); + } + + std::vector reduction_values; + + for (uint32_t i = 0; i < reduction_indices->size(); ++i) + { + int32_t axis = reduction_indices->at(i); + if (axis < 0) + axis += input_shape.rank(); + if (not(0 <= axis and axis < static_cast(input_shape.rank()))) + INTERNAL_EXN_V("Invalid reduction axis for REDUCER", oops::to_uint32(axis)); + reduction_values.push_back(axis); + } + + loco::TensorShape output_shape; + + if (keep_dims) + { + output_shape.rank(input_shape.rank()); + for (uint32_t i = 0; i < input_shape.rank(); ++i) + output_shape.dim(i) = input_shape.dim(i); + for (uint32_t i = 0; i < reduction_values.size(); ++i) + output_shape.dim(reduction_values.at(i)) = 1; + } + else + { + std::vector check_reduce(input_shape.rank(), false); + for (uint32_t i = 0; i < reduction_values.size(); ++i) + check_reduce.at(reduction_values.at(i)) = true; + + uint32_t reduce_cnt = 0; + for (uint32_t i = 0; i < check_reduce.size(); ++i) + if (check_reduce.at(i)) + ++reduce_cnt; + + output_shape.rank(input_shape.rank() - reduce_cnt); + for (uint32_t i = 0, j = 0; i < check_reduce.size(); ++i) + if (check_reduce.at(i) == false) + output_shape.dim(j++) = input_shape.dim(i); + } + + return output_shape; +} + +/** + * @brief vector_from_constant will return int64_t vector from CircleConst node + */ +template std::vector vector_from_constant(luci::CircleConst *const_node) +{ + std::vector result; + + for (uint32_t idx = 0; idx < const_node->size(); ++idx) + result.push_back(const_node->at(idx)); + + return result; +} + +template loco::NodeShape broadcast_xy(const CIRCLENODE *node) +{ + auto x_shape = loco::shape_get(node->x()).template as(); + auto y_shape = loco::shape_get(node->y()).template as(); + + auto output_shape = broadcast_shape(x_shape, y_shape); + + return loco::NodeShape{output_shape}; +} + +template loco::NodeShape use_x(const CIRCLENODE *node) +{ + auto x_shape = loco::shape_get(node->x()).template as(); + return loco::NodeShape{x_shape}; +} + +template loco::NodeShape use_logits(const CIRCLENODE *node) +{ + auto shape = loco::shape_get(node->logits()).template as(); + return loco::NodeShape{shape}; +} + +loco::NodeShape use_own(const luci::CircleNode *node) +{ + loco::TensorShape shape = own_shape(node); + return loco::NodeShape{shape}; +} + /** * @brief Class to infer the shape of CircleNode * @@ -184,20 +351,24 @@ loco::TensorShape broadcast_shape(const loco::TensorShape &x, const loco::Tensor class ShapeInferenceAlgorithm final : public luci::CircleNodeVisitor { public: - loco::NodeShape visit(const luci::CircleAbs *node) final - { - auto x_shape = loco::shape_get(node->x()).as(); - return loco::NodeShape{x_shape}; - } + loco::NodeShape visit(const luci::CircleAbs *node) final { return use_x(node); } - loco::NodeShape visit(const luci::CircleAdd *node) final + loco::NodeShape visit(const luci::CircleAdd *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleAddN *node) final { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + auto shape = loco::shape_get(node->inputs(0)).as(); - auto output_shape = broadcast_shape(x_shape, y_shape); + for (uint32_t idx = 1; idx < node->arity(); ++idx) + { + auto shape_idx = loco::shape_get(node->inputs(idx)).as(); + if (!(shape == shape_idx)) + { + INTERNAL_EXN_V("ADD_N shape not same as the first input: ", idx); + } + } - return loco::NodeShape{output_shape}; + return loco::NodeShape{shape}; } loco::NodeShape visit(const luci::CircleArgMax *node) final @@ -211,8 +382,7 @@ public: // Only support node's shape() is CircleConst with S32/S64 // Support S32 for now. - auto const_shape_node = dynamic_cast(node->dimension()); - LUCI_ASSERT(const_shape_node, "Only support CircleConst for shape of CircleArgMax"); + auto const_shape_node = loco::must_cast(node->dimension()); LUCI_ASSERT(const_shape_node->dtype() == loco::DataType::S32, "Only support int32 CircleConst for CircleArgMax"); @@ -240,11 +410,58 @@ public: return loco::NodeShape{shape_output}; } + loco::NodeShape visit(const luci::CircleArgMin *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + auto dimension_shape = loco::shape_get(node->dimension()).as(); + + int64_t select_axis = 0; + { + LUCI_ASSERT(node->dimension(), "2nd input dimension() should not be nullptr"); + + // Only support node's shape() is CircleConst with S32/S64 + // Support S32 for now. + auto const_shape_node = loco::must_cast(node->dimension()); + LUCI_ASSERT(const_shape_node->dtype() == loco::DataType::S32, + "Only support int32 CircleConst for CircleArgMin"); + + if (const_shape_node->rank() > 1) + INTERNAL_EXN_V("Only support rank 0/1 CircleConst", + oops::to_uint32(const_shape_node->rank())); + + select_axis = const_shape_node->scalar(); + } + assert(select_axis < input_shape.rank()); + assert(select_axis >= 0); // TODO support minus of this breaks + + // NOTE select_axis is removed + loco::TensorShape shape_output; + uint32_t rank = input_shape.rank(); + uint32_t shrink = static_cast(select_axis); + assert(rank > 0); + shape_output.rank(rank - 1); + for (uint32_t r = 0, d = 0; r < rank; ++r) + { + if (r == shrink) + continue; + shape_output.dim(d++) = input_shape.dim(r); + } + return loco::NodeShape{shape_output}; + } + loco::NodeShape visit(const luci::CircleAveragePool2D *node) final { return infer_pool_2d_shape(node); } + loco::NodeShape visit(const luci::CircleBatchMatMul *node) final + { + auto x_shape = loco::shape_get(node->x()).as(); + auto y_shape = loco::shape_get(node->y()).as(); + + return infer_batchmatmul_shape(x_shape, y_shape, node->adj_x(), node->adj_y()); + } + loco::NodeShape visit(const luci::CircleBatchToSpaceND *node) final { const loco::DataType S32 = loco::DataType::S32; @@ -254,14 +471,12 @@ public: assert(input_shape.rank() == 3 || input_shape.rank() == 4); // Only support block_shape() with S32 type CircleConst for now - auto const_block_shape = dynamic_cast(node->block_shape()); - LUCI_ASSERT(const_block_shape, "Only support CircleConst for block_shape"); + auto const_block_shape = loco::must_cast(node->block_shape()); LUCI_ASSERT(const_block_shape->dtype() == loco::DataType::S32, "Only support int32 block_shape"); // Only support crops() with S32 type CircleConst for now - auto const_crops = dynamic_cast(node->crops()); - LUCI_ASSERT(const_crops, "Only support CircleConst for crops"); + auto const_crops = loco::must_cast(node->crops()); LUCI_ASSERT(const_crops->dtype() == loco::DataType::S32, "Only support int32 crops"); auto const_block_shape_shape = loco::shape_get(const_block_shape).as(); @@ -295,6 +510,10 @@ public: return loco::NodeShape{shape_output}; } + loco::NodeShape visit(const luci::CircleCast *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleCeil *node) final { return use_x(node); } + loco::NodeShape visit(const luci::CircleConcatenation *node) final { // TODO Support when CircleConcatenation has 0 input @@ -330,16 +549,7 @@ public: return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleConst *node) final - { - loco::TensorShape shape; - - shape.rank(node->rank()); - for (uint32_t axis = 0; axis < node->rank(); axis++) - shape.dim(axis) = node->dim(axis); - - return loco::NodeShape{shape}; - } + loco::NodeShape visit(const luci::CircleConst *node) final { return use_own(node); } loco::NodeShape visit(const luci::CircleConv2D *node) final { @@ -361,8 +571,8 @@ public: uint32_t stride_width = node->stride()->w(); uint32_t ker_height = ker_shape.dim(1).value(); uint32_t ker_width = ker_shape.dim(2).value(); - uint32_t dilation_height = 1; - uint32_t dilation_width = 1; + uint32_t dilation_height = node->dilation()->h(); + uint32_t dilation_width = node->dilation()->w(); uint32_t effective_ker_height = dilation_height * (ker_height - 1) + 1; uint32_t effective_ker_width = dilation_width * (ker_width - 1) + 1; @@ -392,11 +602,40 @@ public: return loco::NodeShape{ofm_shape}; } - loco::NodeShape visit(const luci::CircleCos *node) final + loco::NodeShape visit(const luci::CircleCos *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleCustom *node) final { return use_own(node); } + + loco::NodeShape visit(const luci::CircleDepthToSpace *node) final { - auto x_shape = loco::shape_get(node->x()).as(); + auto input_shape = loco::shape_get(node->input()).as(); + LUCI_ASSERT(input_shape.rank() == 4, "Only input rank 4 is supported"); + + // Only data format NHWC is supported + // TODO need to clarify what to do with layout in this operator + int32_t height = input_shape.dim(1).value(); + int32_t width = input_shape.dim(2).value(); + int32_t depth = input_shape.dim(3).value(); + + int block_size = node->block_size(); + + if (block_size < 2) + INTERNAL_EXN("Block size must be >= 2"); + + if (depth % (block_size * block_size)) + { + INTERNAL_EXN("The input tensor's depth must be divisible by block_size^2"); + } - return loco::NodeShape{x_shape}; + loco::TensorShape output_shape; + output_shape.rank(4); + + output_shape.dim(0) = input_shape.dim(0).value(); + output_shape.dim(1) = height * block_size; + output_shape.dim(2) = width * block_size; + output_shape.dim(3) = depth / (block_size * block_size); + + return loco::NodeShape{output_shape}; } loco::NodeShape visit(const luci::CircleDepthwiseConv2D *node) final @@ -414,8 +653,8 @@ public: uint32_t stride_width = node->stride()->w(); uint32_t ker_height = ker_shape.dim(1).value(); uint32_t ker_width = ker_shape.dim(2).value(); - uint32_t dilation_height = 1; - uint32_t dilation_width = 1; + uint32_t dilation_height = node->dilation()->h(); + uint32_t dilation_width = node->dilation()->w(); uint32_t effective_ker_height = dilation_height * (ker_height - 1) + 1; uint32_t effective_ker_width = dilation_width * (ker_width - 1) + 1; @@ -445,30 +684,87 @@ public: return loco::NodeShape{ofm_shape}; } - loco::NodeShape visit(const luci::CircleDiv *node) final - { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + loco::NodeShape visit(const luci::CircleDiv *node) final { return broadcast_xy(node); } - auto output_shape = broadcast_shape(x_shape, y_shape); + loco::NodeShape visit(const luci::CircleElu *node) final + { + auto input_shape = loco::shape_get(node->features()).as(); - return loco::NodeShape{output_shape}; + return loco::NodeShape{input_shape}; } - loco::NodeShape visit(const luci::CircleEqual *node) final + loco::NodeShape visit(const luci::CircleEqual *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleExp *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleExpandDims *node) final { - const auto x_shape = loco::shape_get(node->x()).as(); - const auto y_shape = loco::shape_get(node->y()).as(); - loco::TensorShape output_shape = broadcast_shape(x_shape, y_shape); + const loco::DataType S32 = loco::DataType::S32; + auto x_shape = loco::shape_get(node->input()).as(); + if (x_shape.rank() == 0) + { + // This maybe for unknown shape. We use shape from the node itself. + return use_own(node); + } + auto const_axis = loco::must_cast(node->axis()); + LUCI_ASSERT(const_axis->dtype() == S32, "Only support int32 CircleConst for axis"); + if (const_axis->rank() != 0 && const_axis->rank() != 1) + { + INTERNAL_EXN_V("Non-scalar axis in OP", node->opnum()); + } + int32_t axis = const_axis->at(0); + LUCI_ASSERT((axis <= static_cast(x_shape.rank())) && + (axis >= -1 - static_cast(x_shape.rank())), + "Axis has to be between [-(D+1), D], where D is rank of input."); + size_t positive_axis = axis < 0 ? x_shape.rank() + axis + 1 : axis; + loco::TensorShape output_shape; + output_shape.rank(x_shape.rank() + 1); + size_t i = 0; + for (; i < positive_axis; i++) + output_shape.dim(i) = x_shape.dim(i); + output_shape.dim(i) = loco::Dimension(1); + for (; i < x_shape.rank(); i++) + output_shape.dim(i + 1) = x_shape.dim(i); return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleExp *node) final + loco::NodeShape visit(const luci::CircleFill *node) final { - auto x_shape = loco::shape_get(node->x()).as(); - return loco::NodeShape{x_shape}; + loco::TensorShape shape; + { + LUCI_ASSERT(node->dims(), "dims input should not be nullptr"); + + auto dims_node = dynamic_cast(node->dims()); + if (dims_node != nullptr) + { + // Only support node with S32 + LUCI_ASSERT(dims_node->dtype() == loco::DataType::S32, "Only support int32 CircleConst"); + + if (dims_node->rank() != 1) + INTERNAL_EXN_V("Only support rank 1 CircleConst", oops::to_uint32(dims_node->rank())); + + shape.rank(dims_node->dim(0).value()); + + for (uint32_t axis = 0; axis < shape.rank(); ++axis) + { + shape.dim(axis) = dims_node->at(axis); + } + } + else + { + shape = own_shape(node); + } + } + + return loco::NodeShape{shape}; } + loco::NodeShape visit(const luci::CircleFloor *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleFloorDiv *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleFloorMod *node) final { return broadcast_xy(node); } + loco::NodeShape visit(const luci::CircleFullyConnected *node) final { auto input_shape = loco::shape_get(node->input()).as(); @@ -478,8 +774,11 @@ public: // Input: a tensor of at least rank 2 [D1, D2, ... Dn] // Weight: [# of units, K] // Output: [D1 * D2 * ... * Dn / K, # of units] - LUCI_ASSERT(input_shape.rank() >= 2, "Input rank should be at least 2"); - LUCI_ASSERT(weights_shape.rank() == 2, "Incompatible weights rank for fully connected"); + if (input_shape.rank() < 2 || weights_shape.rank() != 2) + { + // Return node own shape if shape inference is not possible + return use_own(node); + } uint32_t input_size = 1; for (uint32_t i = 0; i < input_shape.rank(); i++) @@ -495,133 +794,290 @@ public: return loco::NodeShape{out_shape}; } - loco::NodeShape visit(const luci::CircleLogicalNot *node) final + loco::NodeShape visit(const luci::CircleGather *node) final { - const auto input_shape = loco::shape_get(node->x()).as(); - return loco::NodeShape{input_shape}; - } + loco::TensorShape output_shape; - loco::NodeShape visit(const luci::CircleLogicalOr *node) final - { - const auto input_shape = loco::shape_get(node->x()).as(); - return loco::NodeShape{input_shape}; - } + const auto input_shape = loco::shape_get(node->params()).as(); + const auto positions_shape = loco::shape_get(node->indices()).as(); + int32_t axis = node->axis(); - loco::NodeShape visit(const luci::CircleMaximum *node) final - { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + // If CircleGather input has a dynamic shape, it can't inference this shape. So, it returns the + // shape that node already has. + if (input_shape.rank() == 0 || positions_shape.rank() == 0) + return use_own(node); - auto output_shape = broadcast_shape(x_shape, y_shape); + if (axis < 0) + axis += input_shape.rank(); + + output_shape.rank(input_shape.rank() - 1 + positions_shape.rank()); + int32_t outdim_index = 0; + for (int32_t i = 0; i < axis; ++i) + output_shape.dim(outdim_index++) = input_shape.dim(i); + for (uint32_t i = 0; i < positions_shape.rank(); ++i) + output_shape.dim(outdim_index++) = positions_shape.dim(i); + for (uint32_t i = axis + 1; i < input_shape.rank(); ++i) + output_shape.dim(outdim_index++) = input_shape.dim(i); return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleMaxPool2D *node) final + loco::NodeShape visit(const luci::CircleGatherNd *node) final { - return infer_pool_2d_shape(node); - } + loco::TensorShape output_shape; - loco::NodeShape visit(const luci::CircleMean *node) final - { - const loco::DataType S32 = loco::DataType::S32; + const auto params_shape = loco::shape_get(node->params()).as(); + const auto indices_shape = loco::shape_get(node->indices()).as(); - auto input_shape = loco::shape_get(node->input()).as(); - auto reduction_indices = dynamic_cast(node->reduction_indices()); + const auto params_rank = params_shape.rank(); + const auto indices_rank = indices_shape.rank(); - { // Exceptions - // TODO support non-const case - LUCI_ASSERT(reduction_indices, "Only support constant reduction_indices"); - // TODO support other data type - LUCI_ASSERT(reduction_indices->dtype() == S32, "Only support int 32"); - } + // see https://www.tensorflow.org/api_docs/python/tf/gather_nd + // output.shape = indices.shape[:-1] + params.shape[indices.shape[-1]:] + // batch_dims isn't supported in tflite - std::vector reduction_values; + // TODO: replace exceptions with setting shape to unknown? - for (uint32_t i = 0; i < reduction_indices->size(); ++i) - { - int32_t axis = reduction_indices->at(i); - if (axis < 0) - axis += input_shape.rank(); - if (not(0 <= axis and axis < static_cast(input_shape.rank()))) - INTERNAL_EXN_V("Invalid reduction axis for MEAN", oops::to_uint32(axis)); - reduction_values.push_back(axis); - } + if (!indices_shape.dim(indices_rank - 1).known()) + INTERNAL_EXN("Last indices dimension is unknown"); - loco::TensorShape output_shape; + auto indices_last_dim = indices_shape.dim(indices_rank - 1).value(); + + if (indices_last_dim > params_rank) + INTERNAL_EXN("Last indices dimension should be <= params rank"); + + const uint32_t output_rank = indices_rank + params_rank - indices_last_dim - 1; - if (node->keep_dims()) + output_shape.rank(output_rank); + + uint32_t output_index = 0; + for (uint32_t i = 0; i < indices_rank - 1; ++i) { - output_shape.rank(input_shape.rank()); - for (uint32_t i = 0; i < input_shape.rank(); ++i) - output_shape.dim(i) = input_shape.dim(i); - for (uint32_t i = 0; i < reduction_values.size(); ++i) - output_shape.dim(reduction_values.at(i)) = 1; + auto &dim = indices_shape.dim(i); + if (!dim.known()) + INTERNAL_EXN("Unknown indices dimension is unsupported"); + output_shape.dim(output_index++).set(dim.value()); } - else - { - std::vector check_reduce(input_shape.rank(), false); - for (uint32_t i = 0; i < reduction_values.size(); ++i) - check_reduce.at(reduction_values.at(i)) = true; - uint32_t reduce_cnt = 0; - for (uint32_t i = 0; i < check_reduce.size(); ++i) - if (check_reduce.at(i)) - ++reduce_cnt; - - output_shape.rank(input_shape.rank() - reduce_cnt); - for (uint32_t i = 0, j = 0; i < check_reduce.size(); ++i) - if (check_reduce.at(i) == false) - output_shape.dim(j++) = i; + for (uint32_t i = indices_last_dim; i < params_rank; ++i) + { + auto &dim = params_shape.dim(i); + if (!dim.known()) + INTERNAL_EXN("Unknown params dimension is unsupported"); + output_shape.dim(output_index++).set(dim.value()); } return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleMul *node) final + loco::NodeShape visit(const luci::CircleGreater *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleGreaterEqual *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleIf *node) final { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + // Shape of CircleIf is not used. Just use input 0 + assert(node->input_count() > 0); + const auto input_shape = loco::shape_get(node->input(0)).as(); + return loco::NodeShape{input_shape}; + } - auto output_shape = broadcast_shape(x_shape, y_shape); + loco::NodeShape visit(const luci::CircleL2Normalize *node) final { return use_x(node); } - return loco::NodeShape{output_shape}; + loco::NodeShape visit(const luci::CircleL2Pool2D *node) final + { + return infer_pool_2d_shape(node); } - loco::NodeShape visit(const luci::CirclePack *node) final + loco::NodeShape visit(const luci::CircleLeakyRelu *node) final { - LUCI_ASSERT(node->values_count() > 0, "Only support one or more inputs"); + const auto input_shape = loco::shape_get(node->features()).as(); + return loco::NodeShape{input_shape}; + } - auto first_shape = loco::shape_get(node->values(0)).as(); - // Make sure all inputs have the same shape. - for (uint32_t i = 1; i < node->values_count(); ++i) - { - auto in_shape = loco::shape_get(node->values(i)).as(); - LUCI_ASSERT(loco::NodeShape{first_shape} == loco::NodeShape{in_shape}, - "All inputs must have the same shape"); - } + loco::NodeShape visit(const luci::CircleLess *node) final { return broadcast_xy(node); } - // Checking shape capability for pack layer - // Input: tensors [D1, D2, ... Dn] - // Axis: K - // Output: [D1, D2, ... , D_K-1, n, D_K+1, ... Dn] - auto axis = node->axis(); - if (axis < 0) - axis += first_shape.rank() + 1; + loco::NodeShape visit(const luci::CircleLessEqual *node) final { return broadcast_xy(node); } - LUCI_ASSERT(0 <= axis, "Axis is out of range"); - LUCI_ASSERT(static_cast(axis) <= first_shape.rank(), "Axis is out of range"); + loco::NodeShape visit(const luci::CircleLocalResponseNormalization *node) final + { + const auto input_shape = loco::shape_get(node->input()).as(); + return loco::NodeShape{input_shape}; + } - loco::TensorShape output_shape; - output_shape.rank(first_shape.rank() + 1); + loco::NodeShape visit(const luci::CircleLog *node) final { return use_x(node); } - uint32_t j = 0; - for (uint32_t i = 0; i < output_shape.rank(); ++i) - { - if (i == static_cast(axis)) - { - output_shape.dim(i) = node->values_count(); - } + loco::NodeShape visit(const luci::CircleLogicalAnd *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleLogicalNot *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleLogicalOr *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleLogistic *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleMatrixSetDiag *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + auto diagonal_shape = loco::shape_get(node->diagonal()).as(); + + auto rank = diagonal_shape.rank(); + + LUCI_ASSERT(rank == input_shape.rank() - 1, "diagonal rank = input rank - 1"); + + for (uint32_t i = 0; i < rank - 1; i++) + { + LUCI_ASSERT(diagonal_shape.dim(i) == input_shape.dim(i), "diagonal dims = input dims"); + } + + auto dim = std::min(input_shape.dim(rank - 1).value(), input_shape.dim(rank).value()); + + LUCI_ASSERT(dim == diagonal_shape.dim(rank - 1), "Max diag len error"); + + return loco::NodeShape{input_shape}; + } + + loco::NodeShape visit(const luci::CircleLogSoftmax *node) final { return use_logits(node); } + + loco::NodeShape visit(const luci::CircleMatrixDiag *node) final + { + loco::TensorShape output_shape; + + auto diagonal_shape = loco::shape_get(node->diagonal()).as(); + auto rank = diagonal_shape.rank(); + + output_shape.rank(rank + 1); + + for (uint32_t i = 0; i < rank; i++) + { + output_shape.dim(i) = diagonal_shape.dim(i); + } + + output_shape.dim(rank) = diagonal_shape.dim(rank - 1); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleMaximum *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleMaxPool2D *node) final + { + return infer_pool_2d_shape(node); + } + + loco::NodeShape visit(const luci::CircleMean *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleMinimum *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleMirrorPad *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto input_shape = loco::shape_get(node->input()).as(); + auto paddings = loco::must_cast(node->paddings()); + + // TODO support non-const case + // TODO support other data type + LUCI_ASSERT(paddings->dtype() == S32, "Only support int 32 for now"); + LUCI_ASSERT(paddings->rank() == 2, "paddings should be rank 2") + + int32_t n = paddings->dim(0).value(); + int32_t v = paddings->dim(1).value(); + + LUCI_ASSERT(v == 2, "paddings should be [n, 2]"); + LUCI_ASSERT(n == int32_t(input_shape.rank()), + "paddings [n, 2] should have same value of input rank"); + + loco::TensorShape output_shape; + + output_shape.rank(input_shape.rank()); + for (int32_t ni = 0; ni < n; ++ni) + { + int32_t idx = ni * 2; + int value = input_shape.dim(ni).value(); + value += paddings->at(idx + 0); // left + value += paddings->at(idx + 1); // right + output_shape.dim(ni) = value; + } + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleMul *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleNeg *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleNotEqual *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleOneHot *node) final + { + const loco::DataType S32 = loco::DataType::S32; + auto indices_shape = loco::shape_get(node->indices()).as(); + // Only support OneHot node's depth() is CircleConst with type S32 + // TODO support depth with other types + auto depth = loco::must_cast(node->depth()); + LUCI_ASSERT(depth->dtype() == S32, "Only support int32 CircleConst"); + if (depth->rank() != 0) + INTERNAL_EXN_V("Only support rank 0 CircleOneHot in Depth", oops::to_uint32(depth->rank())); + loco::TensorShape output_shape; + output_shape.rank(indices_shape.rank() + 1); + auto axis = node->axis(); + if (axis < 0) + axis += indices_shape.rank() + 1; + LUCI_ASSERT(0 <= axis, "Axis is out of range"); + LUCI_ASSERT(static_cast(axis) <= indices_shape.rank(), "Axis is out of range"); + uint32_t j = 0; + for (uint32_t i = 0; i < output_shape.rank(); i++) + { + if (i == static_cast(axis)) + { + output_shape.dim(i) = depth->at(0); + } + else + { + output_shape.dim(i) = indices_shape.dim(j++); + } + } + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CirclePack *node) final + { + LUCI_ASSERT(node->values_count() > 0, "Only support one or more inputs"); + + auto first_shape = loco::shape_get(node->values(0)).as(); + // Make sure all inputs have the same shape. + for (uint32_t i = 1; i < node->values_count(); ++i) + { + auto in_shape = loco::shape_get(node->values(i)).as(); + LUCI_ASSERT(loco::NodeShape{first_shape} == loco::NodeShape{in_shape}, + "All inputs must have the same shape"); + } + + // Checking shape capability for pack layer + // Input: tensors [D1, D2, ... Dn] + // Axis: K + // Output: [D1, D2, ... , D_K-1, n, D_K+1, ... Dn] + auto axis = node->axis(); + if (axis < 0) + axis += first_shape.rank() + 1; + + LUCI_ASSERT(0 <= axis, "Axis is out of range"); + LUCI_ASSERT(static_cast(axis) <= first_shape.rank(), "Axis is out of range"); + + loco::TensorShape output_shape; + output_shape.rank(first_shape.rank() + 1); + + uint32_t j = 0; + for (uint32_t i = 0; i < output_shape.rank(); ++i) + { + if (i == static_cast(axis)) + { + output_shape.dim(i) = node->values_count(); + } else { output_shape.dim(i) = first_shape.dim(j++); @@ -636,10 +1092,9 @@ public: const loco::DataType S32 = loco::DataType::S32; auto input_shape = loco::shape_get(node->input()).as(); - auto paddings = dynamic_cast(node->paddings()); + auto paddings = loco::must_cast(node->paddings()); // TODO support non-const case - LUCI_ASSERT(paddings, "Only support constant reduction_indices"); // TODO support other data type LUCI_ASSERT(paddings->dtype() == S32, "Only support int 32 for now"); LUCI_ASSERT(paddings->rank() == 2, "paddings should be rank 2") @@ -666,6 +1121,93 @@ public: return loco::NodeShape{output_shape}; } + loco::NodeShape visit(const luci::CirclePow *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CirclePRelu *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + auto alpha_shape = loco::shape_get(node->alpha()).as(); + + auto output_shape = broadcast_shape(input_shape, alpha_shape); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleRange *node) final + { + loco::TensorShape output_shape; + output_shape.rank(1); + + auto start_node = dynamic_cast(node->start()); + auto limit_node = dynamic_cast(node->limit()); + auto delta_node = dynamic_cast(node->delta()); + + if (start_node == nullptr || limit_node == nullptr || delta_node == nullptr) + { + return use_own(node); + } + + double start = 0, limit = 0, delta = 0; + +#define GET_RANGE_PARAM(DT) \ + start = start_node->scalar
(); \ + limit = limit_node->scalar
(); \ + delta = delta_node->scalar
(); + + switch (start_node->dtype()) + { + case loco::DataType::FLOAT32: + GET_RANGE_PARAM(loco::DataType::FLOAT32) + break; + case loco::DataType::S32: + GET_RANGE_PARAM(loco::DataType::S32) + break; + default: + INTERNAL_EXN("Range data type not supported"); + } + +#undef GET_RANGE_PARAM + + if (delta == 0) + INTERNAL_EXN("Delta can not be zero"); + + output_shape.dim(0) = ceil((limit - start) / delta); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleRank *) final + { + loco::TensorShape shape_output; + shape_output.rank(0); + + return loco::NodeShape{shape_output}; + } + + loco::NodeShape visit(const luci::CircleReduceAny *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleReduceMax *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleReduceMin *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleReduceProd *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + loco::NodeShape visit(const luci::CircleRelu *node) final { auto input_shape = loco::shape_get(node->features()).as(); @@ -680,15 +1222,24 @@ public: return loco::NodeShape{input_shape}; } + loco::NodeShape visit(const luci::CircleReluN1To1 *node) final + { + auto input_shape = loco::shape_get(node->features()).as(); + + return loco::NodeShape{input_shape}; + } + /** * @note CircleReshape has new shape info in two places: 2nd input and attribute. - * This shape inference forces both to exist, and match each other. - * When this condition satisfied, it return the inferred shape + * This shape inference uses shape from input 'shape' node when it's constant. + * If not, shape will be from node itself. shape from attribute is not used. * * TODO Change this policy when not appropriate */ loco::NodeShape visit(const luci::CircleReshape *node) final { + LOGGER(l); + const loco::DataType S32 = loco::DataType::S32; loco::TensorShape shape_by_input; @@ -698,18 +1249,21 @@ public: // Only support node's shape() is CircleConst with S32 // TODO support other node with other types auto const_shape_node = dynamic_cast(node->shape()); - LUCI_ASSERT(const_shape_node, "Only support CircleConst for shape of CircleReshape"); - LUCI_ASSERT(const_shape_node->dtype() == S32, "Only support int32 CircleConst"); - - if (const_shape_node->rank() != 1) - INTERNAL_EXN_V("Only support rank 1 CircleConst", - oops::to_uint32(const_shape_node->rank())); + if (const_shape_node != nullptr) + { + LUCI_ASSERT(const_shape_node->dtype() == S32, "Only support int32 CircleConst"); - shape_by_input.rank(const_shape_node->dim(0).value()); + shape_by_input.rank(const_shape_node->size()); - for (uint32_t axis = 0; axis < shape_by_input.rank(); ++axis) + for (uint32_t axis = 0; axis < shape_by_input.rank(); ++axis) + { + shape_by_input.dim(axis) = const_shape_node->at(axis); + } + } + else { - shape_by_input.dim(axis) = const_shape_node->at(axis); + // We use shape from the node itself + shape_by_input = own_shape(node); } } @@ -723,8 +1277,12 @@ public: } } - LUCI_ASSERT(shape_by_input == shape_by_attr, - "Warning: Two new shape information mismatched for CircleReshape"); + if (!(shape_by_input == shape_by_attr)) + { + INFO(l) << "CircleReshape: Two new shape information mismatched : " << std::endl; + INFO(l) << " shape_by_input : " << shape_by_input << std::endl; + INFO(l) << " shape_by_attr : " << shape_by_attr << std::endl; + } loco::TensorShape output_shape = shape_by_input; @@ -754,94 +1312,517 @@ public: return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleRsqrt *node) final + loco::NodeShape visit(const luci::CircleResizeBilinear *node) final { - auto input_shape = loco::shape_get(node->x()).as(); + auto input_shape = loco::shape_get(node->input()).as(); - return loco::NodeShape{input_shape}; + if (input_shape.rank() != 4) + INTERNAL_EXN("Expected ResizeBilinear input to have rank 4"); + + auto *const_node = loco::must_cast(node->size()); + + if (const_node->dtype() != loco::DataType::S32) + INTERNAL_EXN("Only S32 datatype is supported for ResizeBilinear size"); + + if (const_node->rank() != 1) + INTERNAL_EXN("Expected size tensor of rank 1"); + + if (const_node->dim(0).value() != 2) + INTERNAL_EXN("Expected size tensor with shape [2]"); + + loco::TensorShape output_shape; + output_shape.rank(4); + output_shape.dim(0) = input_shape.dim(0); + output_shape.dim(1) = const_node->at(0); + output_shape.dim(2) = const_node->at(1); + output_shape.dim(3) = input_shape.dim(3); + + return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleSoftmax *node) final + loco::NodeShape visit(const luci::CircleResizeNearestNeighbor *node) final { - auto input_shape = loco::shape_get(node->logits()).as(); + auto input_shape = loco::shape_get(node->input()).as(); - return loco::NodeShape{input_shape}; + if (input_shape.rank() != 4) + INTERNAL_EXN("Expected ResizeNearesNeighbor input to have rank 4"); + + auto *const_node = loco::must_cast(node->size()); + + if (const_node->dtype() != loco::DataType::S32) + INTERNAL_EXN("Only S32 datatype is supported for ResizeNearesNeighbor size"); + + if (const_node->rank() != 1) + INTERNAL_EXN("Expected size tensor of rank 1"); + + if (const_node->dim(0).value() != 2) + INTERNAL_EXN("Expected size tensor with shape [2]"); + + loco::TensorShape output_shape; + output_shape.rank(4); + output_shape.dim(0) = input_shape.dim(0); + output_shape.dim(1) = const_node->at(0); + output_shape.dim(2) = const_node->at(1); + output_shape.dim(3) = input_shape.dim(3); + + return loco::NodeShape{output_shape}; } - loco::NodeShape visit(const luci::CircleSqrt *node) final + loco::NodeShape visit(const luci::CircleReverseSequence *node) final { - auto input_shape = loco::shape_get(node->x()).as(); + auto input_shape = loco::shape_get(node->input()).as(); return loco::NodeShape{input_shape}; } - loco::NodeShape visit(const luci::CircleSquaredDifference *node) final + loco::NodeShape visit(const luci::CircleRound *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleReverseV2 *node) final { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + auto input_shape = loco::shape_get(node->tensor()).as(); - auto output_shape = broadcast_shape(x_shape, y_shape); + LUCI_ASSERT(loco::shape_get(node->axis()).as().rank() == 1, + "Tensor must be 1-D"); - return loco::NodeShape{output_shape}; + return loco::NodeShape{input_shape}; } - loco::NodeShape visit(const luci::CircleSub *node) final + loco::NodeShape visit(const luci::CircleRsqrt *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleScatterNd *node) final { - auto x_shape = loco::shape_get(node->x()).as(); - auto y_shape = loco::shape_get(node->y()).as(); + loco::TensorShape output_shape; + + auto shape_node = loco::must_cast(node->shape()); - auto output_shape = broadcast_shape(x_shape, y_shape); + const loco::DataType S32 = loco::DataType::S32; + const loco::DataType S64 = loco::DataType::S64; + + std::vector vect_shape; + + if (shape_node->dtype() == S32) + vect_shape = vector_from_constant(shape_node); + else if (shape_node->dtype() == S64) + vect_shape = vector_from_constant(shape_node); + else + LUCI_ASSERT(false, "Only support int32/int64 for shape()"); + + output_shape.rank(vect_shape.size()); + for (uint32_t i = 0; i < vect_shape.size(); ++i) + output_shape.dim(i) = vect_shape[i]; return loco::NodeShape{output_shape}; } - // TODO CircleTanh - - /// @brief Returns output shape of transpose. Use loco::ConstGen and luci::CircleConst for ConstT. - template - loco::TensorShape output_shape_of_transpose(loco::TensorShape input_shape, - const ConstT *perm_node) + loco::NodeShape visit(const luci::CircleSegmentSum *node) final { + auto input_shape = loco::shape_get(node->input()).as(); + auto segment_shape = loco::shape_get(node->segment_ids()).as(); + + LUCI_ASSERT(segment_shape.rank() == 1, "segment_ids must be 1-D tensor"); + LUCI_ASSERT(segment_shape.dim(0).value() == input_shape.dim(0).value(), + "segment_ids size must be equal to the size of data's first dimension"); + + auto ids_shape_value = loco::must_cast(node->segment_ids()); + + std::vector vect_ids; + + if (ids_shape_value->dtype() == loco::DataType::S32) + vect_ids = vector_from_constant(ids_shape_value); + + LUCI_ASSERT(std::is_sorted(vect_ids.begin(), vect_ids.end()), + "segment_ids values should be sorted") + loco::TensorShape output_shape; + output_shape.rank(input_shape.rank()); - assert(perm_node->dtype() == loco::DataType::S32); - assert(input_shape.rank() == perm_node->template size()); + for (uint32_t i = 1; i < input_shape.rank(); ++i) + output_shape.dim(i) = input_shape.dim(i); - for (uint32_t out_axis = 0; out_axis < output_shape.rank(); out_axis++) + output_shape.dim(0) = vect_ids.back() + 1; + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSelect *node) final + { + auto t_shape = loco::shape_get(node->t()).as(); + assert(t_shape == loco::shape_get(node->e()).as()); + + // condition shape validation + auto c_shape = loco::shape_get(node->condition()).as(); + if (c_shape.rank() != t_shape.rank()) { - auto in_axis = perm_node->template at(out_axis); - output_shape.dim(out_axis) = input_shape.dim(in_axis); + if (c_shape.rank() != 0 && c_shape.rank() != 1) + INTERNAL_EXN_V("CircleSelect condition rank is not 0 nor 1: ", c_shape.rank()); + + if (c_shape.rank() == 1) + { + if (c_shape.dim(0).value() != t_shape.dim(0).value()) + INTERNAL_EXN("CircleSelect condition dim(0) should match with t.dim(0)"); + } } - return output_shape; + return loco::NodeShape{t_shape}; } - loco::NodeShape visit(const luci::CircleTranspose *node) final + loco::NodeShape visit(const luci::CircleSelectV2 *node) final { - auto input_shape = loco::shape_get(node->a()).as(); + auto c_shape = loco::shape_get(node->condition()).as(); + auto t_shape = loco::shape_get(node->t()).as(); + auto e_shape = loco::shape_get(node->e()).as(); - auto canon_perm = dynamic_cast(node->perm()); - auto circle_perm = dynamic_cast(node->perm()); + // validate ability to broadcast shapes to each other + auto b_shape = broadcast_shape(broadcast_shape(c_shape, t_shape), e_shape); + return loco::NodeShape{b_shape}; + } - if (canon_perm) + loco::NodeShape visit(const luci::CircleShape *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + + loco::TensorShape output_shape; + + output_shape.rank(1); + output_shape.dim(0) = input_shape.rank(); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSin *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleSlice *node) final + { + const loco::DataType S32 = loco::DataType::S32; + const loco::DataType S64 = loco::DataType::S64; + + auto input_shape = loco::shape_get(node->input()).as(); + + auto const_begin = loco::must_cast(node->begin()); + auto const_size = loco::must_cast(node->size()); + + loco::TensorShape output_shape; + std::vector vect_begin; // to hold both S32/S64, we use int64_t + std::vector vect_size; + + if (const_begin->dtype() == S32) + vect_begin = vector_from_constant(const_begin); + else if (const_begin->dtype() == S64) + vect_begin = vector_from_constant(const_begin); + else + LUCI_ASSERT(false, "Only support int32/int64 for begin()"); + + if (const_size->dtype() == S32) + vect_size = vector_from_constant(const_size); + else if (const_size->dtype() == S64) + vect_size = vector_from_constant(const_size); + else + LUCI_ASSERT(false, "Only support int32/int64 for size()"); + + assert(input_shape.rank() == vect_begin.size()); + assert(input_shape.rank() == vect_size.size()); + + output_shape.rank(vect_begin.size()); + for (uint32_t idx = 0; idx < vect_begin.size(); ++idx) + { + auto size = vect_size.at(idx); + if (size == -1) + { + size = input_shape.dim(idx).value() - vect_begin.at(idx); + } + output_shape.dim(idx) = size; + } + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSoftmax *node) final { return use_logits(node); } + + loco::NodeShape visit(const luci::CircleSpaceToBatchND *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto input_shape = loco::shape_get(node->input()).as(); + // Support only input rank is 3 and 4 + assert(input_shape.rank() == 3 || input_shape.rank() == 4); + + // Only support block_shape() with S32 type CircleConst for now + auto const_block_shape = loco::must_cast(node->block_shape()); + LUCI_ASSERT(const_block_shape->dtype() == S32, "Only support int32 block_shape"); + + // Only support paddings() with S32 type CircleConst for now + auto const_paddings = loco::must_cast(node->paddings()); + LUCI_ASSERT(const_paddings->dtype() == S32, "Only support int32 paddings"); + + auto const_block_shape_shape = loco::shape_get(const_block_shape).as(); + auto const_paddings_shape = loco::shape_get(const_paddings).as(); + assert(const_block_shape_shape.rank() == 1); + assert(const_paddings_shape.rank() == 2); + + int32_t input_spatial_dim = input_shape.rank() - 2; + assert(const_block_shape_shape.dim(0) == input_spatial_dim); + assert(const_paddings_shape.dim(0) == input_spatial_dim); + assert(const_paddings_shape.dim(1) == 2); + + // Check all values of block_shape >= 1 + uint32_t ele_count = const_block_shape->size(); + for (uint32_t e = 0; e < ele_count; ++e) + { + auto val = const_block_shape->at(e); + if (val < 1) + { + INTERNAL_EXN_V("All values of block_shape >= 1: ", e); + } + } + + loco::TensorShape shape_output; + + shape_output.rank(input_shape.rank()); + + int32_t output_batch_size = input_shape.dim(0).value(); + for (int32_t dim = 0; dim < input_spatial_dim; ++dim) + { + int dim_size = input_shape.dim(dim + 1).value(); + dim_size += const_paddings->at(dim * 2); + dim_size += const_paddings->at(dim * 2 + 1); + shape_output.dim(dim + 1) = dim_size / const_block_shape->at(dim); + + assert(dim_size % const_block_shape->at(dim) == 0); + output_batch_size = output_batch_size * const_block_shape->at(dim); + } + shape_output.dim(0) = output_batch_size; + shape_output.dim(input_shape.rank() - 1) = input_shape.dim(input_shape.rank() - 1); + + return loco::NodeShape{shape_output}; + } + + loco::NodeShape visit(const luci::CircleSpaceToDepth *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + LUCI_ASSERT(input_shape.rank() == 4, "Only input rank 4 is supported"); + + // Only data format NHWC is supported + int32_t height = input_shape.dim(1).value(); + int32_t width = input_shape.dim(2).value(); + int32_t depth = input_shape.dim(3).value(); + + int block_size = node->block_size(); + + if (block_size < 2) + INTERNAL_EXN("Block size must be >= 2"); + + if ((height % block_size) || (width % block_size)) + { + INTERNAL_EXN("The input tensor's height and width must be divisible by block_size"); + } + + loco::TensorShape output_shape; + output_shape.rank(4); + + output_shape.dim(0) = input_shape.dim(0).value(); + output_shape.dim(1) = height / block_size; + output_shape.dim(2) = width / block_size; + output_shape.dim(3) = block_size * block_size * depth; + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSparseToDense *node) final + { + loco::TensorShape shape; { - return loco::NodeShape{output_shape_of_transpose(input_shape, canon_perm)}; + LUCI_ASSERT(node->output_shape(), "dims input should not be nullptr"); + + auto output_shape_node = dynamic_cast(node->output_shape()); + if (output_shape_node != nullptr) + { + // Only support node with S32 + LUCI_ASSERT(output_shape_node->dtype() == loco::DataType::S32, + "Only support int32 CircleConst"); + + if (output_shape_node->rank() != 1) + INTERNAL_EXN_V("Only support rank 1 CircleConst", + oops::to_uint32(output_shape_node->rank())); + + shape.rank(output_shape_node->dim(0).value()); + + for (uint32_t axis = 0; axis < shape.rank(); ++axis) + { + shape.dim(axis) = output_shape_node->at(axis); + } + } + else + { + shape = own_shape(node); + } } - else if (circle_perm) + + return loco::NodeShape{shape}; + } + + loco::NodeShape visit(const luci::CircleSplit *node) final + { + // We'll set Split output as same as input so that SplitOut can handle it's own shape + auto input_shape = loco::shape_get(node->input()).as(); + return loco::NodeShape{input_shape}; + } + + loco::NodeShape visit(const luci::CircleSplitV *node) final + { + // We'll set SplitV output as same as input so that SplitOut can handle it's own shape + auto input_shape = loco::shape_get(node->input()).as(); + return loco::NodeShape{input_shape}; + } + + loco::NodeShape visit(const luci::CircleSqrt *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleSquare *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleSquaredDifference *node) final + { + return broadcast_xy(node); + } + + loco::NodeShape visit(const luci::CircleStridedSlice *node) final + { + auto begin_node = dynamic_cast(node->begin()); + auto end_node = dynamic_cast(node->end()); + auto strides_node = dynamic_cast(node->strides()); + + if (begin_node == nullptr || end_node == nullptr || strides_node == nullptr) { - return loco::NodeShape{output_shape_of_transpose(input_shape, circle_perm)}; + return use_own(node); + } + + loco::TensorShape shape = infer_output_shape(node); + return loco::NodeShape{shape}; + } + + loco::NodeShape visit(const luci::CircleSqueeze *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + + // TODO input shape may be unknown before runtime + std::vector do_squeeze(input_shape.rank(), false); + uint32_t num_squeezed = 0; + + if (!node->squeeze_dims().empty()) + { + // SqueezeDims not empty, squeeze only dims specified + for (int32_t raw_dim : node->squeeze_dims()) + { + int32_t dim = raw_dim < 0 ? raw_dim + input_shape.rank() : raw_dim; + + if (dim < 0 || static_cast(dim) >= input_shape.rank() || + input_shape.dim(dim).value() != 1) + { + INTERNAL_EXN("invalid dimention specified to Squeeze"); + } + + if (!do_squeeze[dim]) + ++num_squeezed; + do_squeeze[dim] = true; + } } else - INTERNAL_EXN("perm of CircleTranspose should be either ConstGen or CircleConst"); + { + // SqueezeDims empty, squeeze any dims with size == 1 + for (uint32_t dim = 0; dim < input_shape.rank(); ++dim) + { + if (input_shape.dim(dim) == 1) + { + do_squeeze[dim] = true; + ++num_squeezed; + } + } + } + + loco::TensorShape output_shape; + output_shape.rank(input_shape.rank() - num_squeezed); + + for (uint32_t in_dim = 0, out_dim = 0; in_dim < input_shape.rank(); ++in_dim) + { + if (!do_squeeze[in_dim]) + { + output_shape.dim(out_dim++) = input_shape.dim(in_dim); + } + } + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSub *node) final { return broadcast_xy(node); } + + loco::NodeShape visit(const luci::CircleSum *node) final + { + auto output_shape = infer_reducer(node->input(), node->reduction_indices(), node->keep_dims()); + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleTanh *node) final { return use_x(node); } + + loco::NodeShape visit(const luci::CircleTile *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto input_shape = loco::shape_get(node->input()).as(); + auto multiples = loco::must_cast(node->multiples()); + + // TODO support non-const case + // TODO support S64 type + LUCI_ASSERT(multiples->dtype() == S32, "Only support int32 multiples"); + LUCI_ASSERT(multiples->rank() == 1, "multiples should be rank 1") + + uint32_t n = multiples->dim(0).value(); + + LUCI_ASSERT(n == input_shape.rank(), "length of multiples should be the same with input rank"); + + loco::TensorShape output_shape; + + output_shape.rank(input_shape.rank()); + for (uint32_t ni = 0; ni < n; ++ni) + { + int32_t multiple = multiples->at(ni); + output_shape.dim(ni) = input_shape.dim(ni).value() * static_cast(multiple); + } + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleTopKV2 *node) final + { + // set shape of this node as same as input + const auto input_shape = loco::shape_get(node->input()).as(); + return loco::NodeShape{input_shape}; + } + + loco::NodeShape visit(const luci::CircleTranspose *node) final + { + auto input_shape = loco::shape_get(node->a()).as(); + + auto perm_node = loco::must_cast(node->perm()); + + loco::TensorShape output_shape; + output_shape.rank(input_shape.rank()); + + assert(perm_node->dtype() == loco::DataType::S32); + assert(input_shape.rank() == perm_node->template size()); + + for (uint32_t out_axis = 0; out_axis < output_shape.rank(); out_axis++) + { + auto in_axis = perm_node->template at(out_axis); + output_shape.dim(out_axis) = input_shape.dim(in_axis); + } + + return output_shape; } loco::NodeShape visit(const luci::CircleTransposeConv *node) final { // TransposeConv's output shape is written in its 'inputSizes' argument - auto input_sizes_const = dynamic_cast(node->inputSizes()); - LUCI_ASSERT(input_sizes_const, - "Only support when CircleTransposeConv's inputSizes is CircleConst") + auto input_sizes_const = loco::must_cast(node->inputSizes()); + // TODO support non-const type LUCI_ASSERT(input_sizes_const->dtype() == loco::DataType::S32, "Only support S32 dtype") LUCI_ASSERT(input_sizes_const->rank() == 1 && input_sizes_const->dim(0).value() == 4, "Only support rank 1 with 4 entries") @@ -855,7 +1836,115 @@ public: return loco::NodeShape{shape}; } + loco::NodeShape visit(const luci::CircleUnpack *node) final + { + // CircleUnpack provides list(array) of Tensors which has one less dimension of the input + // We'll set shape of CircleUnpack to shape of actual outputs + // TODO fix this if any problem rises + auto value_shape = loco::shape_get(node->value()).as(); + + auto axis = node->axis(); + auto num = node->num(); + auto rank = static_cast(value_shape.rank()); + + if (rank == 0) + { + // Unknown shape + return use_own(node); + } + + LUCI_ASSERT(-rank <= axis && axis < rank, "Axis is out of range"); + + if (axis < 0) + axis += rank; + + LUCI_ASSERT(num == static_cast(value_shape.dim(axis).value()), + "num, axis maybe incorrect"); + + loco::TensorShape output_shape; + output_shape.rank(rank - 1); + + for (int32_t i = 0, o = 0; i < rank; ++i) + { + if (i != axis) + output_shape.dim(o++) = value_shape.dim(i); + } + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleWhere *node) final { return use_own(node); } + + loco::NodeShape visit(const luci::CircleWhile *node) final + { + // Shape of CircleWhile is not used. Just use input 0 + assert(node->arity() > 0); + const auto input_shape = loco::shape_get(node->input(0)).as(); + return loco::NodeShape{input_shape}; + } + + loco::NodeShape visit(const luci::CircleZerosLike *node) final + { + auto input_shape = loco::shape_get(node->input()).as(); + + return loco::NodeShape{input_shape}; + } + // Circle Only + loco::NodeShape visit(const luci::CircleBCQFullyConnected *node) final + { + loco::TensorShape out_shape; + + auto input_shape = loco::shape_get(node->input()).as(); + auto weights_clusters = loco::must_cast(node->weights_clusters()); + + LUCI_ASSERT(input_shape.rank() == 2, "Input rank of BCQFullyConnected should be 2"); + + int32_t qbits_sum = 0; + for (uint32_t i = 0; i < weights_clusters->dim(0).value(); ++i) + { + qbits_sum += weights_clusters->at(i * 2 + 1); + } + + out_shape.rank(2); + out_shape.dim(0) = qbits_sum; + out_shape.dim(1) = input_shape.dim(1); + + return loco::NodeShape{out_shape}; + } + + loco::NodeShape visit(const luci::CircleBCQGather *node) final + { + loco::TensorShape input_shape; + loco::TensorShape output_shape; + + const auto input_binary_shape = loco::shape_get(node->input_binary()).as(); + const auto indices_shape = loco::shape_get(node->indices()).as(); + auto axis = node->axis(); + + auto input_clusters = loco::must_cast(node->input_clusters()); + auto qbits_sum = 0; + for (uint32_t i = 0; i < input_clusters->dim(0).value(); ++i) + { + qbits_sum += input_clusters->at(i * 2 + 1); + } + + input_shape.rank(2); + input_shape.dim(0) = qbits_sum; + input_shape.dim(1) = input_binary_shape.dim(1).value() * 32; + + output_shape.rank(input_shape.rank() - 1 + indices_shape.rank()); + int32_t outdim_index = 0; + for (int32_t i = 0; i < axis; ++i) + output_shape.dim(outdim_index++) = input_shape.dim(i); + for (uint32_t i = 0; i < indices_shape.rank(); ++i) + output_shape.dim(outdim_index++) = indices_shape.dim(i); + for (uint32_t i = axis + 1; i < input_shape.rank(); ++i) + output_shape.dim(outdim_index++) = input_shape.dim(i); + + return loco::NodeShape{output_shape}; + } + loco::NodeShape visit(const luci::CircleInstanceNorm *node) final { auto input_shape = loco::shape_get(node->input()).as(); @@ -877,9 +1966,230 @@ public: loco::NodeShape visit(const luci::CircleOutput *node) final { - auto from_shape = loco::shape_get(node->from()).as(); + auto graph_outputs = node->graph()->outputs(); + auto graph_output = graph_outputs->at(node->index()); + auto output_shape = graph_output->shape(); + + return loco::NodeShape{*output_shape}; + } + + loco::NodeShape visit(const luci::CircleOutputDummy *node) final { return use_own(node); } + + loco::NodeShape visit(const luci::CircleOutputExclude *node) final { return use_own(node); } + + loco::NodeShape visit(const luci::CircleCustomOut *node) final { return use_own(node); } + + loco::NodeShape visit(const luci::CircleIfOut *node) final + { + /** + * @note IF operator type and shape are that of the "then" and "else" + * Graph Outputs. + */ + auto circle_if = dynamic_cast(node->input()); + if (circle_if == nullptr) + { + INTERNAL_EXN("CircleIf IR is not configured correctly"); + } + + auto index = node->index(); + auto then_graph = circle_if->then_graph(); + auto else_graph = circle_if->else_graph(); + assert(then_graph != nullptr); + assert(else_graph != nullptr); + + // shape and type are assumed to be same + // these are checked at post_import_graph() in Import + auto then_outputs = loco::output_nodes(then_graph); + auto else_outputs = loco::output_nodes(else_graph); + assert(then_outputs.size() == else_outputs.size()); + assert(index < static_cast(then_outputs.size())); + + auto then_out = loco::must_cast(then_outputs.at(index)); + auto else_out = loco::must_cast(else_outputs.at(index)); + + auto then_graph_outputs = then_graph->outputs(); // loco::GraphOutput items + auto else_graph_outputs = else_graph->outputs(); + assert(then_graph_outputs->size() == else_graph_outputs->size()); + + auto then_graph_output = then_graph_outputs->at(then_out->index()); + auto else_graph_output = else_graph_outputs->at(else_out->index()); + (void)else_graph_output; // make compiler happy for unused variable warnings + assert(*then_graph_output->shape() == *else_graph_output->shape()); + + return loco::NodeShape{*then_graph_output->shape()}; + } + + loco::NodeShape visit(const luci::CircleSplitOut *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto split = dynamic_cast(node->input()); + if (split == nullptr) + INTERNAL_EXN("CircleSplit IR is not configured correctly"); + + loco::NodeShape unknown; + + auto split_shape = loco::shape_get(split).as(); + + auto split_dim = dynamic_cast(split->split_dim()); + if (split_dim == nullptr) + return unknown; // we need CircleConst for split_dim + LUCI_ASSERT(split_dim->dtype() == S32, "Only support int32 for split_dim"); + + assert(split_dim->size() == 1); + auto split_dim_axis = split_dim->at(0); + if (split_dim_axis < 0) + split_dim_axis += split_shape.rank(); - return loco::NodeShape{from_shape}; + auto split_dim_value = split_shape.dim(split_dim_axis).value(); + assert(split_dim_value % split->num_split() == 0); + const int split_depth = split_dim_value / split->num_split(); + + loco::TensorShape output_shape = split_shape; + + // All shapes are equally same + output_shape.dim(split_dim_axis) = loco::Dimension(split_depth); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleSplitVOut *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto split = dynamic_cast(node->input()); + if (split == nullptr) + INTERNAL_EXN("CircleSplit IR is not configured correctly"); + + loco::NodeShape unknown; + + auto split_shape = loco::shape_get(split).as(); + + auto size_splits = dynamic_cast(split->size_splits()); + if (size_splits == nullptr) + return unknown; // we need CircleConst for size_splits + LUCI_ASSERT(size_splits->dtype() == S32, "Only support int32 for size_splits"); + + auto split_dim = dynamic_cast(split->split_dim()); + if (split_dim == nullptr) + return unknown; // we need CircleConst for split_dim + LUCI_ASSERT(split_dim->dtype() == S32, "Only support int32 for split_dim"); + + // fetch axis + assert(split_dim->size() == 1); + auto split_dim_axis = split_dim->at(0); + if (split_dim_axis < 0) + split_dim_axis += split_shape.rank(); + + // interpret size_splits values + int32_t size_splits_count = static_cast(size_splits->size()); + assert(size_splits_count == split->num_split()); + + int64_t minus_one_count = 0, size_splits_sum = 0; + for (int32_t idx = 0; idx < size_splits_count; ++idx) + { + auto size = size_splits->at(idx); + assert(size >= -1); + if (size == -1) + ++minus_one_count; + else + size_splits_sum += size; + } + if (minus_one_count > 1) + INTERNAL_EXN("CircleSplitV size_splits has more than two -1 values"); + + // calcuate this SplitVOut shape + auto input_size = split_shape.dim(split_dim_axis).value(); + assert(size_splits_sum <= input_size); + + auto index_this = node->index(); + assert(0 <= index_this && index_this < split->num_split()); + auto split_depth = size_splits->at(index_this); + if (split_depth == -1) + split_depth = input_size - size_splits_sum; + + loco::TensorShape output_shape = split_shape; + + output_shape.dim(split_dim_axis) = loco::Dimension(split_depth); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleTopKV2Out *node) final + { + const loco::DataType S32 = loco::DataType::S32; + + auto topkv2 = dynamic_cast(node->input()); + if (topkv2 == nullptr) + INTERNAL_EXN("CircleSplit IR is not configured correctly"); + + // shape of topkv2 is same as topkv2->input() + auto input_shape = loco::shape_get(topkv2).as(); + + auto node_k = loco::must_cast(topkv2->k()); + LUCI_ASSERT(node_k->dtype() == S32, "Only support Int32"); + assert(node_k->size() == 1); + + loco::TensorShape output_shape; + + output_shape.rank(input_shape.rank()); + for (uint32_t idx = 0; idx < input_shape.rank() - 1; ++idx) + { + output_shape.dim(idx) = input_shape.dim(idx); + } + output_shape.dim(input_shape.rank() - 1) = node_k->at(0); + + return loco::NodeShape{output_shape}; + } + + loco::NodeShape visit(const luci::CircleUnpackOut *node) final + { + auto unpack = dynamic_cast(node->input()); + if (unpack == nullptr) + { + INTERNAL_EXN("CircleUnpack IR is not configured correctly"); + } + + auto unpack_shape = loco::shape_get(unpack).as(); + + return loco::NodeShape{unpack_shape}; + } + + loco::NodeShape visit(const luci::CircleWhileOut *node) final + { + /** + * @note WHILE operator's shape is the same with the "cond" + * Graph input. + */ + auto circle_while = dynamic_cast(node->input()); + if (circle_while == nullptr) + { + INTERNAL_EXN("CircleWhile IR is not configured correctly"); + } + + auto index = node->index(); + auto cond_graph = circle_while->cond_graph(); + assert(cond_graph != nullptr); + + // Assumption: the index of CircleWhileOut matches with the index of input nodes returned by + // loco::input_nodes + auto cond_inputs = loco::input_nodes(cond_graph); + auto cond_in = loco::must_cast(cond_inputs.at(index)); + + auto cond_graph_inputs = cond_graph->inputs(); + auto cond_graph_input = cond_graph_inputs->at(cond_in->index()); + + auto cond_graph_input_shape = *cond_graph_input->shape(); + auto this_shape = own_shape(node); + + if (!(this_shape == cond_graph_input_shape)) + { + LOGGER(l); + WARN(l) << "Warning: CircleWhileOut '" << node->name() << "' shape mispatch " << this_shape + << " vs " << cond_graph_input_shape; + } + + return loco::NodeShape{this_shape}; } }; @@ -895,11 +2205,30 @@ bool CircleShapeInferenceRule::recognize(const loco::Dialect *d) const bool CircleShapeInferenceRule::infer(const loco::Node *node, loco::NodeShape &shape) const { + LOGGER(l); + assert(node->dialect() == CircleDialect::get()); - assert(dynamic_cast(node) != nullptr); ShapeInferenceAlgorithm alg; - shape = dynamic_cast(node)->accept(&alg); + auto circle_node = loco::must_cast(node); + + bool is_shape_undefined = (circle_node->shape_status() == ShapeStatus::UNDEFINED); + bool is_shape_none = (circle_node->shape_status() == ShapeStatus::NOSHAPE); + bool is_scalar = (circle_node->rank() == 0); + + if (is_shape_undefined) + shape = circle_node->accept(&alg); + else + { + if (is_shape_none || is_scalar) + shape = own_shape(circle_node); + else + shape = circle_node->accept(&alg); + } + + VERBOSE(l, 1) << "[luci] shape: " << circle_node->name(); + VERBOSE(l, 1) << " own_shape: " << own_shape(circle_node) + << " -> infer: " << shape.as(); return true; } diff --git a/compiler/luci/service/src/CircleShapeInferenceRule.test.cpp b/compiler/luci/service/src/CircleShapeInferenceRule.test.cpp index 0374251..ac27db3 100644 --- a/compiler/luci/service/src/CircleShapeInferenceRule.test.cpp +++ b/compiler/luci/service/src/CircleShapeInferenceRule.test.cpp @@ -26,6 +26,8 @@ #include #include +#include + #include #include @@ -51,38 +53,39 @@ TEST(CircleShapeInferenceRuleTest, minimal_with_CircleRelu) { // Create a simple network luci::test::TestGraph graph; - auto tfl_node = graph.append(graph.pull); - graph.complete(tfl_node); + auto relu_node = graph.append(graph.input_node); + graph.complete(relu_node); // set shape { - graph.pull->rank(2); - graph.pull->dim(0) = 3; - graph.pull->dim(1) = 4; + graph.input_node->rank(2); + graph.input_node->dim(0) = 3; + graph.input_node->dim(1) = 4; + + graph.output_node->rank(2); + graph.output_node->dim(0) = 3; + graph.output_node->dim(1) = 4; + + luci::test::graph_input_shape(graph.input_node); + luci::test::graph_output_shape(graph.output_node); } // pre-check - ASSERT_FALSE(loco::shape_known(tfl_node)); + ASSERT_FALSE(loco::shape_known(relu_node)); // shape inference - luci::CircleShapeInferenceRule tfl_rule; - loco::CanonicalShapeInferenceRule canonical_rule; - loco::MultiDialectShapeInferenceRule rules; - - rules.bind(loco::CanonicalDialect::get(), &canonical_rule) - .bind(luci::CircleDialect::get(), &tfl_rule); - - loco::apply(&rules).to(graph.g.get()); + while (shape_pass(graph.graph()) == true) + ; // Verify { - ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); + ASSERT_TRUE(loco::shape_known(relu_node)); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(relu_node).domain()); - auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 2); - ASSERT_EQ(shape.dim(0), 3); - ASSERT_EQ(shape.dim(1), 4); + auto shape = loco::shape_get(relu_node).as(); + ASSERT_EQ(2, shape.rank()); + ASSERT_EQ(3, shape.dim(0)); + ASSERT_EQ(4, shape.dim(1)); } } @@ -91,85 +94,92 @@ TEST(CircleShapeInferenceRuleTest, minimal_with_CircleRelu) TEST(CircleShapeInferenceRuleTest, avgpool2d_valid) { luci::test::TestGraph graph; - auto tfl_node = graph.append(graph.pull); + auto avg_node = graph.append(graph.input_node); graph.complete(); - auto pull = graph.pull; + auto input_node = graph.input_node; { - pull->shape({1, 4, 3, 1}); + input_node->shape({1, 4, 3, 1}); + luci::test::graph_input_shape(input_node); + } + auto output_node = graph.output_node; + { + output_node->shape({1, 2, 1, 1}); + luci::test::graph_output_shape(output_node); } // setting CircleAveragePool2D { - tfl_node->filter()->h(2); - tfl_node->filter()->w(2); - tfl_node->stride()->h(2); - tfl_node->stride()->w(2); - tfl_node->fusedActivationFunction(luci::FusedActFunc::NONE); - tfl_node->padding(luci::Padding::VALID); + avg_node->filter()->h(2); + avg_node->filter()->w(2); + avg_node->stride()->h(2); + avg_node->stride()->w(2); + avg_node->fusedActivationFunction(luci::FusedActFunc::NONE); + avg_node->padding(luci::Padding::VALID); } - ASSERT_FALSE(loco::shape_known(tfl_node)); + ASSERT_FALSE(loco::shape_known(avg_node)); // shape inference - luci::CircleShapeInferenceRule tfl_rule; - loco::CanonicalShapeInferenceRule canonical_rule; - loco::MultiDialectShapeInferenceRule rules; - - rules.bind(loco::CanonicalDialect::get(), &canonical_rule) - .bind(luci::CircleDialect::get(), &tfl_rule); - - loco::apply(&rules).to(graph.g.get()); + while (shape_pass(graph.graph()) == true) + ; // Verify { - ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); - - auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 4); - ASSERT_EQ(shape.dim(0).value(), 1); - ASSERT_EQ(shape.dim(1).value(), 2); - ASSERT_EQ(shape.dim(2).value(), 1); - ASSERT_EQ(shape.dim(3).value(), 1); + ASSERT_TRUE(loco::shape_known(avg_node)); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(avg_node).domain()); + + auto shape = loco::shape_get(avg_node).as(); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0).value()); + ASSERT_EQ(2, shape.dim(1).value()); + ASSERT_EQ(1, shape.dim(2).value()); + ASSERT_EQ(1, shape.dim(3).value()); } } TEST(CircleShapeInferenceRuleTest, avgpool2d_same) { luci::test::TestGraph graph; - auto tfl_node = graph.append(graph.pull); + auto avg_node = graph.append(graph.input_node); graph.complete(); - auto pull = graph.pull; + auto input_node = graph.input_node; { - pull->shape({1, 4, 3, 1}); + input_node->shape({1, 4, 3, 1}); + luci::test::graph_input_shape(input_node); + } + auto output_node = graph.output_node; + { + output_node->shape({1, 2, 2, 1}); + luci::test::graph_output_shape(output_node); } // setting CircleAveragePool2D { - tfl_node->filter()->h(2); - tfl_node->filter()->w(2); - tfl_node->stride()->h(2); - tfl_node->stride()->w(2); - tfl_node->fusedActivationFunction(luci::FusedActFunc::NONE); - tfl_node->padding(luci::Padding::SAME); + avg_node->filter()->h(2); + avg_node->filter()->w(2); + avg_node->stride()->h(2); + avg_node->stride()->w(2); + avg_node->fusedActivationFunction(luci::FusedActFunc::NONE); + avg_node->padding(luci::Padding::SAME); } - ASSERT_FALSE(loco::shape_known(tfl_node)); + ASSERT_FALSE(loco::shape_known(avg_node)); // shape inference - shape_pass(graph.g.get()); + while (shape_pass(graph.graph()) == true) + ; // Verify { - ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); - - auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 4); - ASSERT_EQ(shape.dim(0).value(), 1); - ASSERT_EQ(shape.dim(1).value(), 2); - ASSERT_EQ(shape.dim(2).value(), 2); - ASSERT_EQ(shape.dim(3).value(), 1); + ASSERT_TRUE(loco::shape_known(avg_node)); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(avg_node).domain()); + + auto shape = loco::shape_get(avg_node).as(); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0).value()); + ASSERT_EQ(2, shape.dim(1).value()); + ASSERT_EQ(2, shape.dim(2).value()); + ASSERT_EQ(1, shape.dim(3).value()); } } @@ -186,47 +196,51 @@ TEST(CircleShapeInferenceRuleTest, TFAdd_shapeinf_different) { auto g = loco::make_graph(); - auto x_node = g->nodes()->create(); + auto x_node = g->nodes()->create(); { x_node->rank(3); x_node->dim(0) = 2; x_node->dim(1) = 1; x_node->dim(2) = 5; } - auto y_node = g->nodes()->create(); + auto y_node = g->nodes()->create(); { y_node->rank(2); y_node->dim(0) = 3; y_node->dim(1) = 5; } - auto tfl_node = g->nodes()->create(); + auto add_node = g->nodes()->create(); { - tfl_node->x(x_node); - tfl_node->y(y_node); + add_node->x(x_node); + add_node->y(y_node); } - auto push_node = g->nodes()->create(); + auto output_node = g->nodes()->create(); { - push_node->from(tfl_node); + output_node->from(add_node); } auto x_input = g->inputs()->create(); { x_input->name("x"); - loco::link(x_input, x_node); + luci::link(x_input, x_node); } auto y_input = g->inputs()->create(); { y_input->name("y"); - loco::link(y_input, y_node); + luci::link(y_input, y_node); } auto output = g->outputs()->create(); { output->name("output"); - loco::link(output, push_node); + luci::link(output, output_node); } + luci::test::graph_input_shape(x_node); + luci::test::graph_input_shape(y_node); + luci::test::graph_output_shape(output_node); + // pre-check - ASSERT_FALSE(loco::shape_known(tfl_node)); + ASSERT_FALSE(loco::shape_known(add_node)); // shape inference while (shape_pass(g.get()) == true) @@ -234,14 +248,14 @@ TEST(CircleShapeInferenceRuleTest, TFAdd_shapeinf_different) // Verify { - ASSERT_TRUE(loco::shape_known(tfl_node)); - ASSERT_EQ(loco::shape_get(tfl_node).domain(), loco::Domain::Tensor); - - auto shape = loco::shape_get(tfl_node).as(); - ASSERT_EQ(shape.rank(), 3); - ASSERT_EQ(shape.dim(0), 2); - ASSERT_EQ(shape.dim(1), 3); - ASSERT_EQ(shape.dim(2), 5); + ASSERT_TRUE(loco::shape_known(add_node)); + ASSERT_EQ(loco::Domain::Tensor, loco::shape_get(add_node).domain()); + + auto shape = loco::shape_get(add_node).as(); + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(2, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + ASSERT_EQ(5, shape.dim(2)); } } @@ -249,10 +263,10 @@ TEST(CircleShapeInferenceRuleTest, CircleTranspose_simple) { luci::test::ExampleGraph g; - g.pull->rank(3); - g.pull->dim(0) = 3; - g.pull->dim(1) = 8; - g.pull->dim(2) = 1; + g.input_node->rank(3); + g.input_node->dim(0) = 3; + g.input_node->dim(1) = 8; + g.input_node->dim(2) = 1; g.const_perm->dtype(loco::DataType::S32); g.const_perm->rank(1); @@ -262,6 +276,9 @@ TEST(CircleShapeInferenceRuleTest, CircleTranspose_simple) g.const_perm->at(1) = 2; g.const_perm->at(2) = 0; + luci::test::graph_input_shape(g.input_node); + luci::test::graph_output_shape(g.output_node); + // pre-check ASSERT_FALSE(loco::shape_known(g.transpose_node)); @@ -274,9 +291,336 @@ TEST(CircleShapeInferenceRuleTest, CircleTranspose_simple) ASSERT_TRUE(loco::shape_known(g.transpose_node)); auto shape = loco::shape_get(g.transpose_node).as(); - ASSERT_EQ(shape.rank(), 3); - ASSERT_EQ(shape.dim(0), 8); - ASSERT_EQ(shape.dim(1), 1); - ASSERT_EQ(shape.dim(2), 3); + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(8, shape.dim(0)); + ASSERT_EQ(1, shape.dim(1)); + ASSERT_EQ(3, shape.dim(2)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleSqueeze) +{ + luci::test::TestGraph graph; + auto squeeze_node = graph.append(graph.input_node); + graph.complete(); + + auto input_node = graph.input_node; + { + input_node->shape({1, 4, 3, 1}); + } + auto output_node = graph.output_node; + { + output_node->shape({4, 3, 1}); + } + + luci::test::graph_input_shape(input_node); + luci::test::graph_output_shape(output_node); + + squeeze_node->squeeze_dims({0}); + + // pre-check + ASSERT_FALSE(loco::shape_known(squeeze_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(squeeze_node)); + + auto shape = loco::shape_get(squeeze_node).as(); + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(4, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + ASSERT_EQ(1, shape.dim(2)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleExpandDims) +{ + luci::test::TestGraph graph; + auto axis = graph.append(); + axis->dtype(loco::DataType::S32); + axis->rank(0); + axis->size(1); + axis->at(0) = 1; + + auto expand_dims = graph.append(graph.input_node, axis); + graph.complete(); + + auto input_node = graph.input_node; + { + input_node->shape({4, 3}); + } + + auto output_node = graph.output_node; + { + output_node->from(expand_dims); + } + + luci::test::graph_input_shape(input_node); + luci::test::graph_output_shape(output_node); + + // shape inference + while (shape_pass(graph.graph())) + ; + + // validation + { + ASSERT_TRUE(loco::shape_known(expand_dims)); + + auto shape = loco::shape_get(expand_dims).as(); + + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(4, shape.dim(0)); + ASSERT_EQ(1, shape.dim(1)); + ASSERT_EQ(3, shape.dim(2)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleSqueezeAll) +{ + luci::test::TestGraph graph; + auto squeeze_node = graph.append(graph.input_node); + graph.complete(); + + auto input_node = graph.input_node; + { + input_node->shape({1, 4, 3, 1}); + } + auto output_node = graph.output_node; + { + input_node->shape({4, 3}); + } + + luci::test::graph_input_shape(input_node); + luci::test::graph_output_shape(output_node); + + squeeze_node->squeeze_dims({}); + + // pre-check + ASSERT_FALSE(loco::shape_known(squeeze_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(squeeze_node)); + + auto shape = loco::shape_get(squeeze_node).as(); + ASSERT_EQ(2, shape.rank()); + ASSERT_EQ(4, shape.dim(0)); + ASSERT_EQ(3, shape.dim(1)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleGatherNd_simple) +{ + luci::test::TestGraph graph; + auto indices_const = graph.append(); + auto gather_nd_node = graph.append(graph.input_node, indices_const); + graph.complete(); + + { + auto input_node = graph.input_node; + input_node->shape({1, 4, 4, 3}); + luci::test::graph_input_shape(input_node); + } + { + auto output_node = graph.output_node; + output_node->shape({1, 2, 2, 3}); + luci::test::graph_output_shape(output_node); + } + + { + indices_const->shape({1, 2, 3}); + } + + // pre-check + ASSERT_FALSE(loco::shape_known(gather_nd_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(gather_nd_node)); + + auto shape = loco::shape_get(gather_nd_node).as(); + ASSERT_EQ(3, shape.rank()); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(2, shape.dim(1)); + ASSERT_EQ(3, shape.dim(2)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleGatherNd_slices) +{ + luci::test::TestGraph graph; + auto indices_const = graph.append(); + auto gather_nd_node = graph.append(graph.input_node, indices_const); + graph.complete(); + + { + auto input_node = graph.input_node; + input_node->shape({1, 4, 4, 3}); + luci::test::graph_input_shape(input_node); + } + { + auto output_node = graph.output_node; + output_node->shape({1, 2, 4, 4, 3}); + luci::test::graph_output_shape(output_node); + } + + { + indices_const->shape({1, 2, 1}); + } + + // pre-check + ASSERT_FALSE(loco::shape_known(gather_nd_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(gather_nd_node)); + + auto shape = loco::shape_get(gather_nd_node).as(); + ASSERT_EQ(5, shape.rank()); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(2, shape.dim(1)); + ASSERT_EQ(4, shape.dim(2)); + ASSERT_EQ(4, shape.dim(3)); + ASSERT_EQ(3, shape.dim(4)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleGatherNd_NEG) +{ + luci::test::TestGraph graph; + auto indices_const = graph.append(); + auto gather_nd_node = graph.append(graph.input_node, indices_const); + graph.complete(); + + { + auto input_node = graph.input_node; + input_node->shape({1, 4, 4, 3}); + luci::test::graph_input_shape(input_node); + } + { + // Does not matter, because test should fail anyway + auto output_node = graph.output_node; + output_node->shape({0, 0, 0}); + luci::test::graph_output_shape(output_node); + } + + { + indices_const->shape({1, 2, 5}); + } + + // pre-check + ASSERT_FALSE(loco::shape_known(gather_nd_node)); + + // had to pack into lambda to check throw + auto lambda = [&]() { + // shape inference + while (shape_pass(graph.graph()) == true) + ; + }; + + ASSERT_THROW(lambda(), oops::InternalExn); +} + +TEST(CircleShapeInferenceRuleTest, CircleResizeNearestNeighbor) +{ + luci::test::TestGraph graph; + auto size_const = graph.append(); + size_const->dtype(loco::DataType::S32); + size_const->rank(1); + size_const->dim(0) = 2; + size_const->size(2); + size_const->at(0) = 16; + size_const->at(1) = 16; + auto resize_node = graph.append(graph.input_node, size_const); + graph.complete(); + + { + auto input_node = graph.input_node; + input_node->shape({1, 4, 4, 3}); + luci::test::graph_input_shape(input_node); + } + { + auto output_node = graph.output_node; + output_node->from(resize_node); + luci::test::graph_output_shape(output_node); + } + + // pre-check + ASSERT_FALSE(loco::shape_known(resize_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(resize_node)); + + auto shape = loco::shape_get(resize_node).as(); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(16, shape.dim(1)); + ASSERT_EQ(16, shape.dim(2)); + ASSERT_EQ(3, shape.dim(3)); + } +} + +TEST(CircleShapeInferenceRuleTest, CircleResizeBilinear) +{ + luci::test::TestGraph graph; + auto size_const = graph.append(); + size_const->dtype(loco::DataType::S32); + size_const->rank(1); + size_const->dim(0) = 2; + size_const->size(2); + size_const->at(0) = 16; + size_const->at(1) = 16; + auto resize_node = graph.append(graph.input_node, size_const); + graph.complete(); + + { + auto input_node = graph.input_node; + input_node->shape({1, 4, 4, 3}); + luci::test::graph_input_shape(input_node); + } + { + auto output_node = graph.output_node; + output_node->from(resize_node); + luci::test::graph_output_shape(output_node); + } + + // pre-check + ASSERT_FALSE(loco::shape_known(resize_node)); + + // shape inference + while (shape_pass(graph.graph()) == true) + ; + + // Verify + { + ASSERT_TRUE(loco::shape_known(resize_node)); + + auto shape = loco::shape_get(resize_node).as(); + ASSERT_EQ(4, shape.rank()); + ASSERT_EQ(1, shape.dim(0)); + ASSERT_EQ(16, shape.dim(1)); + ASSERT_EQ(16, shape.dim(2)); + ASSERT_EQ(3, shape.dim(3)); } } diff --git a/compiler/luci/service/src/CircleTypeInference.cpp b/compiler/luci/service/src/CircleTypeInference.cpp index 6699061..aa8524a 100644 --- a/compiler/luci/service/src/CircleTypeInference.cpp +++ b/compiler/luci/service/src/CircleTypeInference.cpp @@ -15,19 +15,13 @@ */ #include "luci/Service/CircleTypeInference.h" -#include "luci/Service/CircleTypeInferenceRule.h" -#include - -#include -#include -#include +#include #include + #include #include -#include -#include #include namespace diff --git a/compiler/luci/service/src/CircleTypeInferenceRule.cpp b/compiler/luci/service/src/CircleTypeInferenceRule.cpp index 21a28c1..de2ba3e 100644 --- a/compiler/luci/service/src/CircleTypeInferenceRule.cpp +++ b/compiler/luci/service/src/CircleTypeInferenceRule.cpp @@ -33,18 +33,45 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorx()); } + loco::DataType visit(const luci::CircleAddN *node) final + { + auto dtype = loco::dtype_get(node->inputs(0)); + + for (uint32_t idx = 1; idx < node->arity(); ++idx) + { + auto dtype_idx = loco::dtype_get(node->inputs(idx)); + if (dtype != dtype_idx) + { + INTERNAL_EXN_V("ADD_N dtype not same as the first input: ", idx); + } + } + + return loco::dtype_get(node->inputs(0)); + } + loco::DataType visit(const luci::CircleArgMax *node) final { return node->output_type(); } + loco::DataType visit(const luci::CircleArgMin *node) final { return node->output_type(); } + loco::DataType visit(const luci::CircleAveragePool2D *node) final { return loco::dtype_get(node->value()); } + loco::DataType visit(const luci::CircleBatchMatMul *node) final + { + return loco::dtype_get(node->x()); + } + loco::DataType visit(const luci::CircleBatchToSpaceND *node) final { return loco::dtype_get(node->input()); } + loco::DataType visit(const luci::CircleCast *node) final { return node->dtype(); } + + loco::DataType visit(const luci::CircleCeil *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleConcatenation *node) final { // TODO Support when CircleConcatenation has 0 input @@ -65,6 +92,20 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorx()); } + loco::DataType visit(const luci::CircleCustom *node) final + { + if (node->custom_code() == "BatchMatMulV2") + { + return loco::dtype_get(node->inputs(0)); + } + return node->dtype(); + } + + loco::DataType visit(const luci::CircleDepthToSpace *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleDepthwiseConv2D *node) final { return loco::dtype_get(node->input()); @@ -72,15 +113,94 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorx()); } + loco::DataType visit(const luci::CircleElu *node) final + { + return loco::dtype_get(node->features()); + } + loco::DataType visit(const luci::CircleEqual *) final { return loco::DataType::BOOL; } loco::DataType visit(const luci::CircleExp *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleExpandDims *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleFill *node) final + { + return loco::dtype_get(node->value()); + } + + loco::DataType visit(const luci::CircleFloor *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleFloorDiv *node) final + { + return loco::dtype_get(node->x()); + } + + loco::DataType visit(const luci::CircleFloorMod *node) final + { + return loco::dtype_get(node->x()); + } + loco::DataType visit(const luci::CircleFullyConnected *node) final { return loco::dtype_get(node->input()); } + loco::DataType visit(const luci::CircleGather *node) final + { + return loco::dtype_get(node->params()); + } + + loco::DataType visit(const luci::CircleGatherNd *node) final + { + return loco::dtype_get(node->params()); + } + + loco::DataType visit(const luci::CircleGreater *) final { return loco::DataType::BOOL; } + + loco::DataType visit(const luci::CircleGreaterEqual *) final { return loco::DataType::BOOL; } + + loco::DataType visit(const luci::CircleIf *node) final + { + // Type of If is not used. Just use input 0 + assert(node->input_count() > 0); + return loco::dtype_get(node->input(0)); + } + + loco::DataType visit(const luci::CircleL2Normalize *node) final + { + return loco::dtype_get(node->x()); + } + + loco::DataType visit(const luci::CircleL2Pool2D *node) final + { + return loco::dtype_get(node->value()); + } + + loco::DataType visit(const luci::CircleLeakyRelu *node) final + { + return loco::dtype_get(node->features()); + } + + loco::DataType visit(const luci::CircleLess *) final { return loco::DataType::BOOL; } + + loco::DataType visit(const luci::CircleLessEqual *) final { return loco::DataType::BOOL; } + + loco::DataType visit(const luci::CircleLocalResponseNormalization *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleLog *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleLogicalAnd *node) final + { + return loco::dtype_get(node->x()); + } + loco::DataType visit(const luci::CircleLogicalNot *node) final { return loco::dtype_get(node->x()); @@ -91,6 +211,26 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorx()); } + loco::DataType visit(const luci::CircleLogistic *node) final + { + return loco::dtype_get(node->x()); + } + + loco::DataType visit(const luci::CircleLogSoftmax *node) final + { + return loco::dtype_get(node->logits()); + } + + loco::DataType visit(const luci::CircleMatrixDiag *node) final + { + return loco::dtype_get(node->diagonal()); + } + + loco::DataType visit(const luci::CircleMatrixSetDiag *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleMaximum *node) final { return loco::dtype_get(node->x()); } loco::DataType visit(const luci::CircleMaxPool2D *node) final @@ -103,6 +243,17 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorinput()); } + loco::DataType visit(const luci::CircleMinimum *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleMirrorPad *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleNeg *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleNotEqual *) final { return loco::DataType::BOOL; } + loco::DataType visit(const luci::CirclePack *node) final { // Only support CirclePack with one or more inputs @@ -117,8 +268,63 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorinput()); } + loco::DataType visit(const luci::CirclePow *node) final + { + // TODO make sure types cannot differ + auto x_type = loco::dtype_get(node->x()); + auto y_type = loco::dtype_get(node->y()); + + if (x_type != y_type) + INTERNAL_EXN("Different datatype for x and y are not supported"); + + return x_type; + } + + loco::DataType visit(const luci::CirclePRelu *node) final + { + auto input_type = loco::dtype_get(node->input()); + auto alpha_type = loco::dtype_get(node->alpha()); + + if (input_type != alpha_type) + INTERNAL_EXN("Different datatype for input and alpha are not supported"); + + return input_type; + } + + loco::DataType visit(const luci::CircleRange *node) final + { + return loco::dtype_get(node->start()); + } + + loco::DataType visit(const luci::CircleRank *) final { return loco::DataType::S32; } + loco::DataType visit(const luci::CircleMul *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleOneHot *node) final + { + return loco::dtype_get(node->on_value()); + } + + loco::DataType visit(const luci::CircleReduceAny *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleReduceMax *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleReduceMin *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleReduceProd *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleRelu *node) final { return loco::dtype_get(node->features()); @@ -129,28 +335,132 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorfeatures()); } + loco::DataType visit(const luci::CircleReluN1To1 *node) final + { + return loco::dtype_get(node->features()); + } + loco::DataType visit(const luci::CircleReshape *node) final { return loco::dtype_get(node->tensor()); } + loco::DataType visit(const luci::CircleResizeBilinear *) final { return loco::DataType::FLOAT32; } + + loco::DataType visit(const luci::CircleResizeNearestNeighbor *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleReverseSequence *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleReverseV2 *node) final + { + return loco::dtype_get(node->tensor()); + } + + loco::DataType visit(const luci::CircleRound *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleRsqrt *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleScatterNd *node) final + { + return loco::dtype_get(node->updates()); + } + + loco::DataType visit(const luci::CircleSegmentSum *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleSelect *node) final + { + assert(loco::dtype_get(node->t()) == loco::dtype_get(node->e())); + return loco::dtype_get(node->t()); + } + + loco::DataType visit(const luci::CircleSelectV2 *node) final + { + assert(loco::dtype_get(node->t()) == loco::dtype_get(node->e())); + return loco::dtype_get(node->t()); + } + + loco::DataType visit(const luci::CircleShape *node) final { return node->out_type(); } + + loco::DataType visit(const luci::CircleSin *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleSlice *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleSoftmax *node) final { return loco::dtype_get(node->logits()); } + loco::DataType visit(const luci::CircleSpaceToBatchND *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleSpaceToDepth *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleSparseToDense *node) final + { + return loco::dtype_get(node->values()); + } + + loco::DataType visit(const luci::CircleSplit *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleSplitV *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleSqrt *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleSquare *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleSquaredDifference *node) final { return loco::dtype_get(node->x()); } + loco::DataType visit(const luci::CircleSqueeze *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleStridedSlice *node) final + { + return loco::dtype_get(node->input()); + } + loco::DataType visit(const luci::CircleSub *node) final { return loco::dtype_get(node->x()); } - // TODO CircleTanh + loco::DataType visit(const luci::CircleSum *node) final { return loco::dtype_get(node->input()); } + + loco::DataType visit(const luci::CircleTanh *node) final { return loco::dtype_get(node->x()); } + + loco::DataType visit(const luci::CircleTile *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleTopKV2 *node) final + { + return loco::dtype_get(node->input()); + } loco::DataType visit(const luci::CircleTranspose *node) final { @@ -162,7 +472,33 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitoroutBackprop()); } + loco::DataType visit(const luci::CircleUnpack *node) final + { + return loco::dtype_get(node->value()); + } + + loco::DataType visit(const luci::CircleWhere *) final { return loco::DataType::S64; } + + loco::DataType visit(const luci::CircleWhile *node) final + { + // Type of While is not used. Just use input 0 + assert(node->input_count() > 0); + return loco::dtype_get(node->input(0)); + } + + loco::DataType visit(const luci::CircleZerosLike *node) final + { + return loco::dtype_get(node->input()); + } + // Circle Only + loco::DataType visit(const luci::CircleBCQFullyConnected *) final + { + return loco::DataType::FLOAT32; + } + + loco::DataType visit(const luci::CircleBCQGather *) final { return loco::DataType::FLOAT32; } + loco::DataType visit(const luci::CircleInstanceNorm *node) final { return loco::dtype_get(node->input()); @@ -173,7 +509,116 @@ struct TypeInferenceAlgorithm final : public luci::CircleNodeVisitorfrom()); + auto graph_outputs = node->graph()->outputs(); + auto graph_output = graph_outputs->at(node->index()); + auto output_dtype = graph_output->dtype(); + + if (dynamic_cast(node->from()) == nullptr && + dynamic_cast(node->from()) == nullptr) + { + // We don't care for the type if from() is CircleOutputDummy or CircleOutputExclude + // from() type should match that of CircleOutput + assert(output_dtype == loco::dtype_get(node->from())); + } + return output_dtype; + } + + loco::DataType visit(const luci::CircleOutputDummy *node) final { return node->dtype(); } + + loco::DataType visit(const luci::CircleOutputExclude *node) final { return node->dtype(); } + + loco::DataType visit(const luci::CircleCustomOut *node) final { return node->dtype(); } + + loco::DataType visit(const luci::CircleIfOut *node) final + { + /** + * @note IF operator type and shape are that of the "then" and "else" + * Graph Outputs. + */ + auto circle_if = dynamic_cast(node->input()); + if (circle_if == nullptr) + { + INTERNAL_EXN("CircleIf IR is not configured correctly"); + } + + auto index = node->index(); + auto then_graph = circle_if->then_graph(); + auto else_graph = circle_if->else_graph(); + assert(then_graph != nullptr); + assert(else_graph != nullptr); + + // shape and type are assumed to be same + // these are checked at post_import_graph() in Import + auto then_outputs = loco::output_nodes(then_graph); + auto else_outputs = loco::output_nodes(else_graph); + assert(then_outputs.size() == else_outputs.size()); + assert(index < static_cast(then_outputs.size())); + + auto then_out = loco::must_cast(then_outputs.at(index)); + auto else_out = loco::must_cast(else_outputs.at(index)); + + auto then_graph_outputs = then_graph->outputs(); // loco::GraphOutput items + auto else_graph_outputs = else_graph->outputs(); + assert(then_graph_outputs->size() == else_graph_outputs->size()); + + auto then_graph_output = then_graph_outputs->at(then_out->index()); + auto else_graph_output = else_graph_outputs->at(else_out->index()); + (void)else_graph_output; // make compiler happy for unused variable warnings + assert(then_graph_output->dtype() == else_graph_output->dtype()); + + return then_graph_output->dtype(); + } + + loco::DataType visit(const luci::CircleSplitOut *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleSplitVOut *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleTopKV2Out *node) final + { + // First output is same as input + if (node->index() == 0) + return loco::dtype_get(node->input()); + // Second outout is always S32 + assert(node->index() == 1); + return loco::DataType::S32; + } + + loco::DataType visit(const luci::CircleUnpackOut *node) final + { + return loco::dtype_get(node->input()); + } + + loco::DataType visit(const luci::CircleWhileOut *node) final + { + /** + * @note WHILE operator's type is the same with the "cond" + * Graph Input. + */ + auto circle_while = dynamic_cast(node->input()); + if (circle_while == nullptr) + { + INTERNAL_EXN("CircleWhile IR is not configured correctly"); + } + + auto index = node->index(); + auto cond_graph = circle_while->cond_graph(); + assert(cond_graph != nullptr); + + // Assumption: the index of CircleWhileOut matches with the index of input nodes returned by + // loco::input_nodes + auto cond_inputs = loco::input_nodes(cond_graph); + auto cond_in = loco::must_cast(cond_inputs.at(index)); + + auto cond_graph_inputs = cond_graph->inputs(); + auto cond_graph_input = cond_graph_inputs->at(cond_in->index()); + + return cond_graph_input->dtype(); } }; @@ -193,7 +638,8 @@ bool CircleTypeInferenceRule::infer(const loco::Node *node, loco::DataType &dtyp TypeInferenceAlgorithm alg; - dtype = dynamic_cast(node)->accept(&alg); + auto circle_node = loco::must_cast(node); + dtype = circle_node->accept(&alg); assert(dtype != loco::DataType::Unknown); return true; diff --git a/compiler/luci/service/src/CircleTypeInferenceRule.test.cpp b/compiler/luci/service/src/CircleTypeInferenceRule.test.cpp index 29f4517..711a489 100644 --- a/compiler/luci/service/src/CircleTypeInferenceRule.test.cpp +++ b/compiler/luci/service/src/CircleTypeInferenceRule.test.cpp @@ -32,26 +32,32 @@ TEST(CircleTypeInferenceRuleTest, minimal_with_CircleRelu) { // Create a simple network luci::test::TestGraph graph; - auto tfl_node = graph.append(graph.pull); - graph.complete(tfl_node); + auto relu_node = graph.append(graph.input_node); + graph.complete(relu_node); - graph.pull->dtype(loco::DataType::S32); + // set dtype for nodes; like setting them in import + graph.input_node->dtype(loco::DataType::S32); + relu_node->dtype(loco::DataType::S32); + graph.output_node->dtype(loco::DataType::S32); + + luci::test::graph_input_dtype(graph.input_node); + luci::test::graph_output_dtype(graph.output_node); // pre-check - ASSERT_FALSE(loco::dtype_known(tfl_node)); + ASSERT_FALSE(loco::dtype_known(relu_node)); // type inference - luci::CircleTypeInferenceRule tfl_rule; + luci::CircleTypeInferenceRule circle_rule; loco::CanonicalTypeInferenceRule canon_rule; loco::MultiDialectTypeInferenceRule rules; rules.bind(loco::CanonicalDialect::get(), &canon_rule); - rules.bind(luci::CircleDialect::get(), &tfl_rule); + rules.bind(luci::CircleDialect::get(), &circle_rule); loco::apply(&rules).to(graph.g.get()); // Verify - ASSERT_TRUE(loco::dtype_known(tfl_node)); - auto type = loco::dtype_get(tfl_node); - ASSERT_EQ(type, loco::DataType::S32); + ASSERT_TRUE(loco::dtype_known(relu_node)); + auto type = loco::dtype_get(relu_node); + ASSERT_EQ(loco::DataType::S32, type); } diff --git a/compiler/luci/service/src/GraphBlock.h b/compiler/luci/service/src/GraphBlock.h deleted file mode 100644 index 2a45588..0000000 --- a/compiler/luci/service/src/GraphBlock.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __GRAPH_BLOCK_H__ -#define __GRAPH_BLOCK_H__ - -#include -#include - -#include - -#include - -// TODO Change all Canonical nodes to Circle nodes - -namespace luci -{ - -/// @brief feature layout of TFlite/Circle file -enum class FeatureLayout -{ - NHWC, -}; - -/// @brief Creates a loco::FeatureEncode with T layout (NHWC for tflite) and add it to graph. -template loco::FeatureEncode *make_feature_encode(loco::Node *input_for_encode); - -/// @brief Creates a loco::FeatureDecode with T layout (NHWC for tflite) and add it to graph. -template loco::FeatureDecode *make_feature_decode(loco::Node *input_for_decode); - -enum class FilterLayout -{ - OHWI, // a.k.a., NHWC, Tensorflow Lite uses this layout for filter - HWIO, // a.k.a., HWCN, Tensorflow uses this layout for filter -}; - -/// @brief Create a loco::FilterEncode of given layout -template loco::FilterEncode *make_filter_encode(loco::Node *input_for_encode); - -/// @brief Create a loco::FilterDecode of given layout -template loco::FilterDecode *make_filter_decode(loco::Node *input_for_decode); - -enum class DepthwiseFilterLayout -{ - HWCM, -}; - -/// @brief Create a loco::DepthwiseFilterDecode of given layout -template -loco::DepthwiseFilterDecode *make_dw_filter_decode(loco::Node *input_for_decode); - -enum class MatrixLayout -{ - HW, - WH -}; - -/// @brief Create a loco::MatrixEncode of given layout -template loco::MatrixEncode *make_matrix_encode(loco::Node *input_for_encode); - -/// @brief Create a loco::MatrixDecode of given layout -template loco::MatrixDecode *make_matrix_decode(loco::Node *input_for_decode); - -} // luci - -// -// DomainConverter -// - -/** - * Some canonical nodes can have input of various loco::Domain, e.g., loco::Domain::Tensor, - * loco::Domain::Feature, etc. However, TFL node accepts only loco::Domain::Tensor. - * So, When converting such canonical node to TFL node and input(s) of a canonical node are not - * loco::Domain::Tensor, additional nodes need to be inserted. - * - * The following two classes helps this insertion. - * - * For example, in case of loco::Relu conversion, - * - * Before: - * - * A (output: feature) -- loco::ReLU --- B (input:feature) - * - * After: - * - * A -- loco::FeatureDecode -- locoex::TFLRelu -- loco::FeatureEncode --- B - * - * loco::ReLU (dead node) - */ - -namespace luci -{ - -/** - * @brief Handles input(s) while converting a canonical node to TFL node(s). - * This class informs DomainConverter how to handle inputs of a specific canonical node. - */ -template class InputHandler -{ -public: - /** - * @brief Assign origin's inputs to replacer's inputs. - * (This is called when origin belongs in Tensor domain.) - */ - virtual void handover(CanonicalT *origin, TFLT *replacer) = 0; - - /** - * @brief Returns the list of inputs that needs to have FeatureDecode as its input. - * (This is called when origin belongs in Feature domain.) - */ - virtual std::vector getInputsToConvert(CanonicalT *origin) = 0; - - /// @brief Set the inputs of replacer to new_inputs - virtual void set(TFLT *replacer, std::vector &new_inputs) = 0; - - /// @brief Set the inputs to nullptr - virtual void nullify(CanonicalT *origin) = 0; -}; - -/** - * @brief Class to handle domain conversion while converting a canonical node to TFL node(s) - */ -template class DomainConverter -{ -public: - template - TFLT *convert(CanonicalT *origin, InputHandler &input_handler); -}; - -/** - * @brief Performs domain conversion - * - * 1. if origin belong to loco::Domain::Tensor, and replace origin to a TFL node. - * 2. if origin belong to loco::Domain::Feature, insert loco::FeatureDecode for input(s) and - * insert loco::FeatureEncode for output. Then replace origin to a TFL node. - * - * @return new TFL node; nullptr if shape of origin cannot be known - */ -template -template -TFLT *DomainConverter::convert(CanonicalT *origin, - InputHandler &input_handler) -{ - static_assert(FeatureLayoutT == FeatureLayout::NHWC, "Feature layout should be NHWC"); - - if (!loco::shape_known(origin)) - { - return nullptr; - } - - auto tfl_node = origin->graph()->nodes()->template create(); - - // when the input is Tensor, just replace canonical node to TFL node. - if (loco::shape_get(origin).domain() == loco::Domain::Tensor) - { - input_handler.handover(origin, tfl_node); - - loco::replace(origin).with(tfl_node); - input_handler.nullify(origin); - - return tfl_node; - } - else if (loco::shape_get(origin).domain() == loco::Domain::Feature) - { - std::vector feature_decodes; - - for (auto input : input_handler.getInputsToConvert(origin)) - { - auto dec = make_feature_decode(input); - feature_decodes.emplace_back(dec); - } - - input_handler.set(tfl_node, feature_decodes); - - auto enc = make_feature_encode(tfl_node); - - loco::replace(origin).with(enc); - input_handler.nullify(origin); - - return tfl_node; - } - else - INTERNAL_EXN_V("Unsupported loco::Domain", oops::to_uint32(loco::shape_get(origin).domain())); -} - -} // namespace luci - -#endif //__GRAPH_BLOCK_H__ diff --git a/compiler/luci/service/src/GraphBlock.test.cpp b/compiler/luci/service/src/GraphBlock.test.cpp deleted file mode 100644 index 1da8c18..0000000 --- a/compiler/luci/service/src/GraphBlock.test.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "GraphBlock.h" - -#include "Check.h" - -#include - -#include - -// TODO Change all Canonical nodes to Circle nodes - -namespace -{ - -template loco::Permutation perm(); - -template <> loco::Permutation perm() -{ - // Make NHWC permutation for encoder and decoder - loco::Permutation NHWC; - - NHWC.axis(loco::FeatureAxis::Count) = 0; - NHWC.axis(loco::FeatureAxis::Height) = 1; - NHWC.axis(loco::FeatureAxis::Width) = 2; - NHWC.axis(loco::FeatureAxis::Depth) = 3; - - return NHWC; -} - -template loco::Permutation perm(); - -template <> loco::Permutation perm() -{ - loco::Permutation HWIO; // a.k.a., HWCN - - HWIO.axis(loco::FilterAxis::Height) = 0; - HWIO.axis(loco::FilterAxis::Width) = 1; - HWIO.axis(loco::FilterAxis::Depth) = 2; - HWIO.axis(loco::FilterAxis::Count) = 3; - - return HWIO; -} - -template <> loco::Permutation perm() -{ - - // Make NHWC permutation for encoder and decoder - loco::Permutation OHWI; // a.k.a., NHWC - - OHWI.axis(loco::FilterAxis::Count) = 0; - OHWI.axis(loco::FilterAxis::Height) = 1; - OHWI.axis(loco::FilterAxis::Width) = 2; - OHWI.axis(loco::FilterAxis::Depth) = 3; - - return OHWI; -} - -template loco::Permutation perm(); - -template <> -loco::Permutation perm() -{ - loco::Permutation HWCM; - - HWCM.axis(loco::DepthwiseFilterAxis::Height) = 0; - HWCM.axis(loco::DepthwiseFilterAxis::Width) = 1; - HWCM.axis(loco::DepthwiseFilterAxis::Depth) = 2; - HWCM.axis(loco::DepthwiseFilterAxis::Multiplier) = 3; - - return HWCM; -} - -template loco::Permutation perm(); - -template <> loco::Permutation perm() -{ - loco::Permutation HW; - - HW.axis(loco::MatrixAxis::Height) = 0; - HW.axis(loco::MatrixAxis::Width) = 1; - - return HW; -} - -template <> loco::Permutation perm() -{ - loco::Permutation WH; - - WH.axis(loco::MatrixAxis::Height) = 1; - WH.axis(loco::MatrixAxis::Width) = 0; - - return WH; -} - -} // namespace - -namespace luci -{ - -template loco::FeatureEncode *make_feature_encode(loco::Node *input_for_encode) -{ - LUCI_ASSERT(input_for_encode != nullptr, "input should not be nullptr"); - loco::Graph *g = input_for_encode->graph(); - - auto encoder = std::make_unique>(); - - encoder->perm(perm()); - - auto enc = g->nodes()->create(); - enc->input(input_for_encode); - enc->encoder(std::move(encoder)); - - return enc; -} - -template loco::FeatureDecode *make_feature_decode(loco::Node *input_for_decode) -{ - LUCI_ASSERT(input_for_decode != nullptr, "input should not be nullptr"); - loco::Graph *g = input_for_decode->graph(); - - auto decoder = std::make_unique>(); - - decoder->perm(perm()); - - auto dec = g->nodes()->create(); - dec->input(input_for_decode); - dec->decoder(std::move(decoder)); - - return dec; -} - -template loco::FilterEncode *make_filter_encode(loco::Node *input_for_encode) -{ - LUCI_ASSERT(input_for_encode != nullptr, "filter should not be nullptr"); - loco::Graph *g = input_for_encode->graph(); - - auto encoder = std::make_unique>(); - - encoder->perm(perm()); - - auto enc = g->nodes()->create(); - enc->input(input_for_encode); - enc->encoder(std::move(encoder)); - - return enc; -} - -template loco::FilterDecode *make_filter_decode(loco::Node *input_for_decode) -{ - LUCI_ASSERT(input_for_decode != nullptr, "filter should not be nullptr"); - loco::Graph *g = input_for_decode->graph(); - - auto decoder = std::make_unique>(); - - decoder->perm(perm()); - - auto dec = g->nodes()->create(); - dec->input(input_for_decode); - dec->decoder(std::move(decoder)); - - return dec; -} - -template -loco::DepthwiseFilterDecode *make_dw_filter_decode(loco::Node *input_for_decode) -{ - LUCI_ASSERT(input_for_decode != nullptr, "filter should not be nullptr"); - loco::Graph *g = input_for_decode->graph(); - - auto decoder = std::make_unique>(); - - decoder->perm(perm()); - - auto dec = g->nodes()->create(); - dec->input(input_for_decode); - dec->decoder(std::move(decoder)); - - return dec; -} - -template loco::MatrixEncode *make_matrix_encode(loco::Node *input_for_encode) -{ - LUCI_ASSERT(input_for_encode != nullptr, "input should not be nullptr"); - loco::Graph *g = input_for_encode->graph(); - - auto encoder = std::make_unique>(); - - encoder->perm(perm()); - - auto enc = g->nodes()->create(); - enc->input(input_for_encode); - enc->encoder(std::move(encoder)); - - return enc; -} - -template loco::MatrixDecode *make_matrix_decode(loco::Node *input_for_decode) -{ - LUCI_ASSERT(input_for_decode != nullptr, "input should not be nullptr"); - loco::Graph *g = input_for_decode->graph(); - - auto decoder = std::make_unique>(); - - decoder->perm(perm()); - - auto dec = g->nodes()->create(); - dec->input(input_for_decode); - dec->decoder(std::move(decoder)); - - return dec; -} - -// template instantiation -template loco::FeatureEncode * -make_feature_encode(loco::Node *input_for_encode); - -template loco::FeatureDecode * -make_feature_decode(loco::Node *input_for_encode); - -template loco::FilterEncode *make_filter_encode(loco::Node *input_for_encode); -template loco::FilterDecode *make_filter_decode(loco::Node *input_for_decode); - -template loco::DepthwiseFilterDecode * -make_dw_filter_decode(loco::Node *input_for_decode); - -template loco::MatrixEncode *make_matrix_encode(loco::Node *input_for_encode); -template loco::MatrixEncode *make_matrix_encode(loco::Node *input_for_encode); -template loco::MatrixDecode *make_matrix_decode(loco::Node *input_for_decode); -template loco::MatrixDecode *make_matrix_decode(loco::Node *input_for_decode); - -} // namespace luci diff --git a/compiler/luci/service/src/ShapeInfer_StridedSlice.cpp b/compiler/luci/service/src/ShapeInfer_StridedSlice.cpp new file mode 100644 index 0000000..3412011 --- /dev/null +++ b/compiler/luci/service/src/ShapeInfer_StridedSlice.cpp @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ShapeInfer_StridedSlice.h" +#include "Check.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace +{ + +// This Op only supports 1-4D cases and since we use the reference 4D +// implementation, the 1-3D tensors are mapped to 4D. +const int kMaxDim = 4; + +const loco::DataType S32 = loco::DataType::S32; + +using int8 = int8_t; +using int16 = int16_t; + +struct StridedSliceParams +{ + int8 start_indices_count; + int16 start_indices[kMaxDim]; + int8 stop_indices_count; + int16 stop_indices[kMaxDim]; + int8 strides_count; + int16 strides[kMaxDim]; + + int16 begin_mask; + int16 ellipsis_mask; + int16 end_mask; + int16 new_axis_mask; + int16 shrink_axis_mask; +}; + +// Use until std::clamp() is available from C++17. +inline int Clamp(const int32_t v, const int32_t lo, const int32_t hi) +{ + LUCI_ASSERT(!(hi < lo), "Clamp hi < lo"); + if (hi < v) + return hi; + if (v < lo) + return lo; + return v; +} + +// Return the index for the first element along that axis. This index will be a +// positive integer between [0, axis_size - 1] that can be used to index +// directly into the data. +inline int StartForAxis(const StridedSliceParams ¶ms, const loco::TensorShape &input_shape, + uint32_t axis) +{ + const auto begin_mask = params.begin_mask; + const auto *start_indices = params.start_indices; + const auto *strides = params.strides; + const int32_t axis_size = static_cast(input_shape.dim(axis).value()); + if (axis_size == 0) + { + return 0; + } + // Begin with the specified index. + int32_t start = start_indices[axis]; + + // begin_mask override + if (begin_mask & (1 << axis)) + { + if (strides[axis] > 0) + { + // Forward iteration - use the first element. These values will get + // clamped below (Note: We could have set them to 0 and axis_size-1, but + // use lowest() and max() to maintain symmetry with StopForAxis()) + start = std::numeric_limits::lowest(); + } + else + { + // Backward iteration - use the last element. + start = std::numeric_limits::max(); + } + } + + // Handle negative indices + if (start < 0) + { + start += axis_size; + } + + // Clamping + start = Clamp(start, 0, axis_size - 1); + + return start; +} + +// Return the "real" index for the end of iteration along that axis. This is an +// "end" in the traditional C sense, in that it points to one past the last +// element. ie. So if you were iterating through all elements of a 1D array of +// size 4, this function would return 4 as the stop, because it is one past the +// "real" indices of 0, 1, 2 & 3. +inline int StopForAxis(const StridedSliceParams ¶ms, const loco::TensorShape &input_shape, + int axis, int start_for_axis) +{ + const auto end_mask = params.end_mask; + const auto shrink_axis_mask = params.shrink_axis_mask; + const auto *stop_indices = params.stop_indices; + const auto *strides = params.strides; + const int axis_size = static_cast(input_shape.dim(axis).value()); + if (axis_size == 0) + { + return 0; + } + + // Begin with the specified index + const bool shrink_axis = shrink_axis_mask & (1 << axis); + int32_t stop = stop_indices[axis]; + + // When shrinking an axis, the end position does not matter (and can be + // incorrect when negative indexing is used, see Issue #19260). Always use + // start_for_axis + 1 to generate a length 1 slice, since start_for_axis has + // already been adjusted for negative indices. + if (shrink_axis) + { + stop = start_for_axis + 1; + } + + // end_mask override + if (end_mask & (1 << axis)) + { + if (strides[axis] > 0) + { + // Forward iteration - use the last element. These values will get + // clamped below + stop = std::numeric_limits::max(); + } + else + { + // Backward iteration - use the first element. + stop = std::numeric_limits::lowest(); + } + } + + // Handle negative indices + if (stop < 0) + { + stop += axis_size; + } + + // Clamping + // Because the end index points one past the last element, we need slightly + // different clamping ranges depending on the direction. + if (strides[axis] > 0) + { + // Forward iteration + stop = Clamp(stop, 0, axis_size); + } + else + { + // Backward iteration + stop = Clamp(stop, -1, axis_size - 1); + } + + return stop; +} + +StridedSliceParams BuildStridedSliceParams(const luci::CircleStridedSlice *node) +{ + StridedSliceParams op_params; + + if (kMaxDim < node->rank()) + { + INTERNAL_EXN_V("Cannot support StridedSlice rank > ", kMaxDim); + } + + auto begin_node = loco::must_cast(node->begin()); + auto end_node = loco::must_cast(node->end()); + auto strides_node = loco::must_cast(node->strides()); + + uint32_t dims_count = begin_node->size(); + + op_params.start_indices_count = dims_count; + op_params.stop_indices_count = dims_count; + op_params.strides_count = dims_count; + + for (uint32_t i = 0; i < dims_count; ++i) + { + op_params.start_indices[i] = begin_node->at(i); + op_params.stop_indices[i] = end_node->at(i); + op_params.strides[i] = strides_node->at(i); + } + + op_params.begin_mask = node->begin_mask(); + op_params.ellipsis_mask = 0; + op_params.end_mask = node->end_mask(); + op_params.new_axis_mask = 0; + op_params.shrink_axis_mask = node->shrink_axis_mask(); + + return op_params; +} + +} // namespace + +namespace luci +{ + +loco::TensorShape infer_output_shape(const CircleStridedSlice *node) +{ + loco::TensorShape output_shape; + + auto input_node = loco::must_cast(node->input()); + + auto begin_node = dynamic_cast(node->begin()); + auto end_node = dynamic_cast(node->end()); + auto strides_node = dynamic_cast(node->strides()); + if (begin_node == nullptr || end_node == nullptr || strides_node == nullptr) + { + INTERNAL_EXN("StridedSlice begin/end/strides nodes are not Constant"); + } + + LUCI_ASSERT(begin_node->dtype() == S32, "Only support S32 for begin_node"); + LUCI_ASSERT(end_node->dtype() == S32, "Only support S32 for end_node"); + LUCI_ASSERT(strides_node->dtype() == S32, "Only support S32 for strides_node"); + + assert(node->ellipsis_mask() == 0); + assert(node->new_axis_mask() == 0); + + auto op_params = BuildStridedSliceParams(node); + loco::TensorShape input_shape = loco::shape_get(input_node).as(); + + uint32_t num_input_axes = input_shape.rank(); + assert(begin_node->size() <= num_input_axes); + assert(end_node->size() <= num_input_axes); + assert(strides_node->size() <= num_input_axes); + for (uint32_t i = 0; i < strides_node->size(); i++) + { + LUCI_ASSERT(strides_node->at(i) != 0, "Stride value has to be non-zero"); + } + + uint32_t shape_size = 0; + std::array output_shape_data; + + for (uint32_t idx = 0; idx < num_input_axes; ++idx) + { + int32_t begin = StartForAxis(op_params, input_shape, idx); + int32_t end = StopForAxis(op_params, input_shape, idx, begin); + if (end < 0) + end = input_shape.dim(idx).value() + end + 1; + + // This is valid for both positive and negative strides + int32_t stride = strides_node->at(idx); + int32_t dim_shape = std::ceil(static_cast(end - begin) / stride); + assert(dim_shape > 0); + + // When shrinking an axis, the end position does not matter (and can be + // incorrect when negative indexing is used, see Issue #19260). Always use + // begin + 1 to generate a length 1 slice, since begin has + // already been adjusted for negative indices by StartForAxis. + const bool shrink_axis = node->shrink_axis_mask() & (1 << idx); + if (shrink_axis) + { + assert(dim_shape == 1); + } + else + { + output_shape_data[shape_size++] = dim_shape; + } + } + + output_shape.rank(shape_size); + for (uint32_t idx = 0; idx < shape_size; ++idx) + { + output_shape.dim(idx) = output_shape_data[idx]; + } + + return output_shape; +} + +} // namespace luci diff --git a/compiler/luci/service/src/ShapeInfer_StridedSlice.h b/compiler/luci/service/src/ShapeInfer_StridedSlice.h new file mode 100644 index 0000000..fa800b7 --- /dev/null +++ b/compiler/luci/service/src/ShapeInfer_StridedSlice.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SHAPE_INFER_STRIDED_SLICE_H__ +#define __SHAPE_INFER_STRIDED_SLICE_H__ + +#include + +#include + +namespace luci +{ + +loco::TensorShape infer_output_shape(const CircleStridedSlice *node); + +} // namespace luci + +#endif // __SHAPE_INFER_STRIDED_SLICE_H__ diff --git a/compiler/luci/service/src/TestGraph.h b/compiler/luci/service/src/TestGraph.h index 7356204..2865b0f 100644 --- a/compiler/luci/service/src/TestGraph.h +++ b/compiler/luci/service/src/TestGraph.h @@ -18,7 +18,6 @@ #define __TEST_GRAPH_H__ #include -#include "GraphBlock.h" #include @@ -36,29 +35,29 @@ class TestGraph { public: std::unique_ptr g; - loco::Pull *pull; - loco::Push *push; + luci::CircleInput *input_node = nullptr; + luci::CircleOutput *output_node = nullptr; TestGraph() // creates Pull and Push { g = loco::make_graph(); - pull = g->nodes()->create(); + input_node = g->nodes()->create(); - push = g->nodes()->create(); + output_node = g->nodes()->create(); auto input = g->inputs()->create(); { input->name("input"); - loco::link(input, pull); + luci::link(input, input_node); } auto output = g->outputs()->create(); { output->name("output"); - loco::link(output, push); + luci::link(output, output_node); } - _next_input = pull; + _next_input = input_node; } loco::Graph *graph() { return g.get(); } @@ -73,7 +72,7 @@ public: } /// @brief Creates op T (arity=1) with arg1 as an input and appends it to graph - template T *append(loco::Node *arg1) + template T *append(luci::CircleNode *arg1) { auto node = g->nodes()->create(); setInput(node, arg1); @@ -83,7 +82,7 @@ public: } /// @brief Creates op T (arity=2) with arg1, arg2 as inputs and appends it to graph - template T *append(loco::Node *arg1, loco::Node *arg2) + template T *append(luci::CircleNode *arg1, luci::CircleNode *arg2) { auto node = g->nodes()->create(); setInput(node, arg1, arg2); @@ -93,7 +92,8 @@ public: } /// @brief Creates op T (arity=3) with arg1, arg2, arg3 as inputs and appends it to graph - template T *append(loco::Node *arg1, loco::Node *arg2, loco::Node *arg3) + template + T *append(luci::CircleNode *arg1, luci::CircleNode *arg2, luci::CircleNode *arg3) { auto node = g->nodes()->create(); setInput(node, arg1, arg2, arg3); @@ -102,101 +102,68 @@ public: return node; } - // push will get the last appended node - void complete() { push->from(_next_input); } + // output will get the last appended node + void complete() { output_node->from(_next_input); } - void complete(loco::Node *last_node) { push->from(last_node); } + void complete(luci::CircleNode *last_node) { output_node->from(last_node); } private: // arity 1 - void setInput(loco::Node *node, loco::Node *) { assert(false && "NYI"); }; - - void setInput(loco::AvgPool2D *node, loco::Node *input) { node->ifm(input); } - void setInput(loco::BiasDecode *node, loco::Node *input) { node->input(input); }; - void setInput(loco::BiasEncode *node, loco::Node *input) { node->input(input); }; - void setInput(loco::FeatureDecode *node, loco::Node *input) { node->input(input); }; - void setInput(loco::FeatureEncode *node, loco::Node *input) { node->input(input); }; - void setInput(loco::MaxPool2D *node, loco::Node *input) { node->ifm(input); } - void setInput(loco::Push *node, loco::Node *input) { node->from(input); }; - void setInput(loco::ReLU *node, loco::Node *input) { node->input(input); }; - void setInput(loco::ReLU6 *node, loco::Node *input) { node->input(input); }; - void setInput(loco::Tanh *node, loco::Node *input) { node->input(input); }; - void setInput(loco::TensorTranspose *node, loco::Node *input) { node->input(input); }; - - void setInput(luci::CircleAveragePool2D *node, loco::Node *input) { node->value(input); }; - void setInput(luci::CircleMaxPool2D *node, loco::Node *input) { node->value(input); }; - void setInput(luci::CircleRelu *node, loco::Node *input) { node->features(input); }; - void setInput(luci::CircleRelu6 *node, loco::Node *input) { node->features(input); }; + void setInput(luci::CircleNode *, luci::CircleNode *) { assert(false && "NYI"); }; - // arity 2 - void setInput(loco::Node *node, loco::Node *, loco::Node *) { assert(false && "NYI"); }; + void setInput(luci::CircleAveragePool2D *node, luci::CircleNode *input) { node->value(input); }; + void setInput(luci::CircleRelu *node, luci::CircleNode *input) { node->features(input); }; + void setInput(luci::CircleSqueeze *node, luci::CircleNode *input) { node->input(input); }; - void setInput(loco::Conv2D *node, loco::Node *input, loco::Node *filter) + void setInput(luci::CircleGatherNd *node, luci::CircleNode *params, luci::CircleNode *indices) { - node->ifm(input); - node->ker(filter); - } - - void setInput(loco::EltwiseAdd *node, loco::Node *arg1, loco::Node *arg2) - { - node->lhs(arg1); - node->rhs(arg2); + node->params(params); + node->indices(indices); }; - void setInput(loco::FeatureBiasAdd *node, loco::Node *arg1, loco::Node *arg2) + // arity 2 + void setInput(luci::CircleNode *, luci::CircleNode *, luci::CircleNode *) { - node->value(arg1); - node->bias(arg2); + assert(false && "NYI"); }; - void setInput(luci::CircleAdd *node, loco::Node *arg1, loco::Node *arg2) + void setInput(luci::CircleExpandDims *node, luci::CircleNode *arg1, luci::CircleNode *arg2) { - node->x(arg1); - node->y(arg2); + node->input(arg1); + node->axis(arg2); }; - void setInput(luci::CircleMul *node, loco::Node *arg1, loco::Node *arg2) + void setInput(luci::CircleTranspose *node, luci::CircleNode *arg1, luci::CircleNode *arg2) { - node->x(arg1); - node->y(arg2); + node->a(arg1); + node->perm(arg2); }; - void setInput(luci::CircleSub *node, loco::Node *arg1, loco::Node *arg2) + void setInput(luci::CircleResizeBilinear *node, luci::CircleNode *input, luci::CircleNode *size) { - node->x(arg1); - node->y(arg2); + node->input(input); + node->size(size); }; - void setInput(luci::CircleTranspose *node, loco::Node *arg1, loco::Node *arg2) + void setInput(luci::CircleResizeNearestNeighbor *node, luci::CircleNode *input, + luci::CircleNode *size) { - node->a(arg1); - node->perm(arg2); + node->input(input); + node->size(size); }; // arity 3 - void setInput(loco::Node *node, loco::Node *, loco::Node *, loco::Node *) + void setInput(luci::CircleNode *, luci::CircleNode *, luci::CircleNode *, luci::CircleNode *) { assert(false && "NYI"); }; - void setInput(luci::CircleConv2D *node, loco::Node *input, loco::Node *filter, loco::Node *bias) - { - node->input(input); - node->filter(filter); - node->bias(bias); - } - private: loco::Node *_next_input; }; enum class ExampleGraphType { - FeatureBiasAdd, - ConstGen_ReLU, - FilterEncode_FilterDecode, - Transpose, - CircleTranspose, }; @@ -205,109 +172,42 @@ template class ExampleGraph; /** * @brief Class to create the following: * - * Pull - FeatureEncoder - FeatureBiasAdd - FeatureDecode - Push - * | - * ConstGen - BiasEncode --+ + * CircleInput -- CircleTranspose -- CircleOutput */ -template <> class ExampleGraph : public TestGraph +template <> class ExampleGraph : public TestGraph { public: - loco::FeatureEncode *fea_enc = nullptr; - loco::ConstGen *constgen = nullptr; - loco::BiasEncode *bias_enc = nullptr; - loco::FeatureBiasAdd *fea_bias_add = nullptr; - loco::FeatureDecode *fea_dec = nullptr; + luci::CircleConst *const_perm = nullptr; + luci::CircleTranspose *transpose_node = nullptr; public: ExampleGraph() { - fea_enc = luci::make_feature_encode(pull); - constgen = append(); - bias_enc = append(constgen); - fea_bias_add = append(fea_enc, bias_enc); - fea_dec = luci::make_feature_decode(fea_bias_add); - complete(fea_dec); + const_perm = append(); + transpose_node = append(input_node, const_perm); + complete(transpose_node); } }; -/** - * @brief Class to creates the following: - * - * ConstGen -- ReLU -- Push - */ -template <> class ExampleGraph : public TestGraph -{ -public: - loco::ConstGen *constgen = nullptr; - loco::ReLU *relu = nullptr; - -public: - ExampleGraph() - { - constgen = append(); - relu = append(constgen); - complete(relu); - } -}; +} // namespace test +} // namespace luci -/** - * @brief Class to creates the following: - * - * Pull -- Transpose -- Push - */ -template <> class ExampleGraph : public TestGraph +namespace luci { -public: - loco::TensorTranspose *transpose = nullptr; - -public: - ExampleGraph() - { - transpose = append(pull); - complete(transpose); - } -}; - -/** - * @brief Class to creates the following: - * - * Pull -- FilterEncode -- FilterDecode -- Push - */ -template <> class ExampleGraph : public TestGraph +namespace test { -public: - loco::FilterEncode *filterEncode = nullptr; - loco::FilterDecode *filterDecode = nullptr; -public: - ExampleGraph() - { - filterEncode = luci::make_filter_encode(pull); // from Tensorflow - filterDecode = - luci::make_filter_decode(filterEncode); // to Tensorflow Lite - complete(filterDecode); - } -}; +/// @brief This will set GraphInput shape from CircleInput shape +void graph_input_shape(luci::CircleInput *input); -/** - * @brief Class to create the following: - * - * Pull -- CircleTranspose -- Push - */ -template <> class ExampleGraph : public TestGraph -{ -public: - loco::ConstGen *const_perm = nullptr; - luci::CircleTranspose *transpose_node = nullptr; +/// @brief This will set GraphOutput shape from CircleOutput shape +void graph_output_shape(luci::CircleOutput *output); -public: - ExampleGraph() - { - const_perm = append(); - transpose_node = append(pull, const_perm); - complete(transpose_node); - } -}; +/// @brief This will set GraphInput dtype from CircleInput dtype +void graph_input_dtype(luci::CircleInput *input); + +/// @brief This will set GraphOutput dtype from CircleOutput dtype +void graph_output_dtype(luci::CircleOutput *output); } // namespace test } // namespace luci diff --git a/compiler/luci/service/src/TestGraph.test.cpp b/compiler/luci/service/src/TestGraph.test.cpp new file mode 100644 index 0000000..9ede703 --- /dev/null +++ b/compiler/luci/service/src/TestGraph.test.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TestGraph.h" + +namespace luci +{ +namespace test +{ + +void graph_input_shape(luci::CircleInput *input) +{ + auto index = input->index(); + auto inputs = input->graph()->inputs(); + + for (uint32_t idx = 0; idx < inputs->size(); ++idx) + { + auto gi = inputs->at(idx); + if (gi->index() == index) + { + auto input_shape = std::make_unique(); + + input_shape->rank(input->rank()); + for (uint32_t r = 0; r < input->rank(); ++r) + input_shape->dim(r) = loco::Dimension(input->dim(r)); + + gi->shape(std::move(input_shape)); + break; + } + } +} + +void graph_output_shape(luci::CircleOutput *output) +{ + auto index = output->index(); + auto outputs = output->graph()->outputs(); + + for (uint32_t idx = 0; idx < outputs->size(); ++idx) + { + auto go = outputs->at(idx); + if (go->index() == index) + { + auto output_shape = std::make_unique(); + + output_shape->rank(output->rank()); + for (uint32_t r = 0; r < output->rank(); ++r) + output_shape->dim(r) = loco::Dimension(output->dim(r)); + + go->shape(std::move(output_shape)); + break; + } + } +} + +void graph_input_dtype(luci::CircleInput *input) +{ + auto index = input->index(); + auto inputs = input->graph()->inputs(); + + for (uint32_t idx = 0; idx < inputs->size(); ++idx) + { + auto gi = inputs->at(idx); + if (gi->index() == index) + { + gi->dtype(input->dtype()); + break; + } + } +} + +void graph_output_dtype(luci::CircleOutput *output) +{ + auto index = output->index(); + auto outputs = output->graph()->outputs(); + + for (uint32_t idx = 0; idx < outputs->size(); ++idx) + { + auto go = outputs->at(idx); + if (go->index() == index) + { + go->dtype(output->dtype()); + break; + } + } +} + +} // namespace test +} // namespace luci diff --git a/compiler/luci/service/src/Validate.cpp b/compiler/luci/service/src/Validate.cpp index 65b82c2..282a068 100644 --- a/compiler/luci/service/src/Validate.cpp +++ b/compiler/luci/service/src/Validate.cpp @@ -29,6 +29,19 @@ namespace { +std::ostream &operator<<(std::ostream &os, const loco::TensorShape &tensor_shape) +{ + os << "["; + for (uint32_t r = 0; r < tensor_shape.rank(); ++r) + { + if (r) + os << ","; + os << tensor_shape.dim(r).value(); + } + os << "]"; + return os; +} + /** * @brief returns a node that is CircleOutput with index is out_index in nodes */ @@ -46,7 +59,7 @@ luci::CircleOutput *find_node(std::vector nodes, loco::GraphOutput return nullptr; } -bool validate_shape_type(loco::Graph *g) +bool validate_shape_dtype(loco::Graph *g) { LOGGER(l); @@ -61,18 +74,18 @@ bool validate_shape_type(loco::Graph *g) auto circle_output = find_node(output_nodes, out_index); assert(circle_output != nullptr); assert(circle_output->from() != nullptr); - auto circle_node = dynamic_cast(circle_output->from()); - assert(circle_node != nullptr); + auto circle_node = loco::must_cast(circle_output->from()); assert(loco::shape_known(circle_node)); // check if output node shape is same as graph output shape - auto co_shape = loco::shape_get(circle_node); + auto co_tensor_shape = loco::shape_get(circle_node).as(); auto go_tensor_shape = graph_out->shape(); assert(go_tensor_shape); - auto go_shape = loco::NodeShape(*go_tensor_shape); - if (!(co_shape == go_shape)) + if (!(co_tensor_shape == *go_tensor_shape)) { - INFO(l) << "Shape for #" << out_index << " not same " << std::endl; + INFO(l) << "[luci] Shape for output #" << out_index << " not same " << std::endl; + INFO(l) << "[luci] " << circle_node->name() << " " << co_tensor_shape << " vs " + << *go_tensor_shape << std::endl; return false; } @@ -80,7 +93,7 @@ bool validate_shape_type(loco::Graph *g) assert(loco::dtype_known(circle_node)); if (graph_out->dtype() != loco::dtype_get(circle_node)) { - INFO(l) << "Type for #" << out_index << " not same " << std::endl; + INFO(l) << "[luci] Type for output #" << out_index << " not same " << std::endl; return false; } } @@ -98,7 +111,7 @@ bool validate(loco::Graph *g) if (!loco::valid(g)) return false; - if (!validate_shape_type(g)) + if (!validate_shape_dtype(g)) return false; // TODO add more validation diff --git a/compiler/luci/tester/CMakeLists.txt b/compiler/luci/tester/CMakeLists.txt index bcb4718..3ac06ef 100644 --- a/compiler/luci/tester/CMakeLists.txt +++ b/compiler/luci/tester/CMakeLists.txt @@ -1,17 +1,23 @@ +nnas_include(TargetRequire) + +unset(REQUIRED_TARGETS) +list(APPEND REQUIRED_TARGETS safemain) +TargetRequire_Return(${REQUIRED_TARGETS}) + set(SRCS_READ_TESTER src/ReadTester.cpp - src/Model.cpp ) add_executable(luci_readtester "${SRCS_READ_TESTER}") target_link_libraries(luci_readtester PRIVATE luci_import) target_link_libraries(luci_readtester PRIVATE luci_service) target_link_libraries(luci_readtester PRIVATE luci_pass) +target_link_libraries(luci_readtester PRIVATE foder) target_link_libraries(luci_readtester PRIVATE oops) +target_link_libraries(luci_readtester PRIVATE safemain) set(SRCS_WRITE_TESTER src/WriteTester.cpp - src/Model.cpp ) add_executable(luci_writetester "${SRCS_WRITE_TESTER}") @@ -19,4 +25,6 @@ target_link_libraries(luci_writetester PRIVATE luci_import) target_link_libraries(luci_writetester PRIVATE luci_service) target_link_libraries(luci_writetester PRIVATE luci_pass) target_link_libraries(luci_writetester PRIVATE luci_export) +target_link_libraries(luci_writetester PRIVATE foder) target_link_libraries(luci_writetester PRIVATE oops) +target_link_libraries(luci_writetester PRIVATE safemain) diff --git a/compiler/luci/tester/src/Model.cpp b/compiler/luci/tester/src/Model.cpp deleted file mode 100644 index b02c191..0000000 --- a/compiler/luci/tester/src/Model.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "Model.h" - -#include -#include - -#include -#include -#include - -namespace -{ - -class FileModel final : public luci::Model -{ -public: - explicit FileModel(const std::string &filename) : _filename(filename) {} - -public: - FileModel(const FileModel &) = delete; - FileModel(FileModel &&) = delete; - -public: - const ::circle::Model *model(void) override - { - std::ifstream file(_filename, std::ios::binary | std::ios::in); - if (!file.good()) - return nullptr; - - file.unsetf(std::ios::skipws); - - std::streampos fileSize; - file.seekg(0, std::ios::end); - fileSize = file.tellg(); - file.seekg(0, std::ios::beg); - - // reserve capacity - _data.reserve(fileSize); - - // read the data - file.read(_data.data(), fileSize); - if (file.fail()) - return nullptr; - - return ::circle::GetModel(_data.data()); - } - -private: - const std::string _filename; - std::vector _data; -}; - -} // namespace - -namespace luci -{ - -std::unique_ptr load_model(const std::string &path) -{ - return std::make_unique(path); -} - -} // namespace luci diff --git a/compiler/luci/tester/src/Model.h b/compiler/luci/tester/src/Model.h deleted file mode 100644 index e40faf3..0000000 --- a/compiler/luci/tester/src/Model.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __TESTER_MODEL_H__ -#define __TESTER_MODEL_H__ - -#include - -#include - -namespace luci -{ - -struct Model -{ - virtual ~Model() = default; - - virtual const ::circle::Model *model(void) = 0; -}; - -/** - * @brief Load Circle model (as a raw Model) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_model(const std::string &path); - -} // namespace luci - -#endif // __TESTER_MODEL_H__ diff --git a/compiler/luci/tester/src/ReadTester.cpp b/compiler/luci/tester/src/ReadTester.cpp index c105d6c..a1aead1 100644 --- a/compiler/luci/tester/src/ReadTester.cpp +++ b/compiler/luci/tester/src/ReadTester.cpp @@ -1,4 +1,20 @@ -#include "Model.h" +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include #include #include @@ -37,7 +53,7 @@ void show_error_message(const char *progname, std::ostream &os, const std::strin * dump graph to console if set. * i.e. "LUCI_LOG=1 luci_readtester mymodel.circle" */ -int main(int argc, char **argv) +int entry(int argc, char **argv) { if (argc != 2) { @@ -50,22 +66,17 @@ int main(int argc, char **argv) std::cout << "[INFO] Circle is '" << input_path << "'" << std::endl; // Load model from the file - std::unique_ptr model = luci::load_model(input_path); - if (model == nullptr) + foder::FileLoader file_loader{input_path}; + std::vector model_data = file_loader.load(); + const circle::Model *circle_model = circle::GetModel(model_data.data()); + if (circle_model == nullptr) { - std::cerr << "ERROR: Failed to load '" << input_path << "'" << std::endl; - return 255; - } - - const circle::Model *input_model = model->model(); - if (input_model == nullptr) - { - std::cerr << "ERROR: Failed to read '" << input_path << "'" << std::endl; - return 255; + std::cerr << "ERROR: Failed to load circle '" << input_path << "'" << std::endl; + return EXIT_FAILURE; } luci::Importer importer; - auto module = importer.importModule(input_model); + auto module = importer.importModule(circle_model); assert(module->size() > 0); for (size_t g = 0; g < module->size(); ++g) diff --git a/compiler/luci/tester/src/WriteTester.cpp b/compiler/luci/tester/src/WriteTester.cpp index 80019d1..aa7085c 100644 --- a/compiler/luci/tester/src/WriteTester.cpp +++ b/compiler/luci/tester/src/WriteTester.cpp @@ -1,4 +1,20 @@ -#include "Model.h" +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include #include #include @@ -52,8 +68,8 @@ public: bool store(const char *ptr, const size_t size) const final; private: - loco::Graph *_graph; - luci::Module *_module; + loco::Graph *_graph{nullptr}; + luci::Module *_module{nullptr}; const std::string _filepath; }; @@ -79,7 +95,7 @@ bool CircleExpContract::store(const char *ptr, const size_t size) const * With the graph, this will use luci_export to write to the second file * Like ReadTester, LUCI_LOG=1 environment variable is available to dump the graph */ -int main(int argc, char **argv) +int entry(int argc, char **argv) { if (argc != 3) { @@ -93,23 +109,18 @@ int main(int argc, char **argv) std::cout << "[INFO] Circle from '" << input_path << "' to '" << output_path << "'" << std::endl; // Load model from the file - std::unique_ptr model = luci::load_model(input_path); - if (model == nullptr) + foder::FileLoader file_loader{input_path}; + std::vector model_data = file_loader.load(); + const circle::Model *circle_model = circle::GetModel(model_data.data()); + if (circle_model == nullptr) { - std::cerr << "ERROR: Failed to load '" << input_path << "'" << std::endl; - return 255; - } - - const circle::Model *input_model = model->model(); - if (input_model == nullptr) - { - std::cerr << "ERROR: Failed to read '" << input_path << "'" << std::endl; - return 255; + std::cerr << "ERROR: Failed to load circle '" << input_path << "'" << std::endl; + return EXIT_FAILURE; } // Import from input Circle file luci::Importer importer; - auto module = importer.importModule(input_model); + auto module = importer.importModule(circle_model); assert(module->size() > 0); for (size_t g = 0; g < module->size(); ++g) diff --git a/compiler/luci/tests/CMakeLists.txt b/compiler/luci/tests/CMakeLists.txt index 4e56390..c038358 100644 --- a/compiler/luci/tests/CMakeLists.txt +++ b/compiler/luci/tests/CMakeLists.txt @@ -65,6 +65,35 @@ foreach(RECIPE IN ITEMS ${RECIPES}) list(APPEND TESTFILES "${CIRCLE_OUTPUT_FILE}") endforeach(RECIPE) +# Generate from res/CircleRecipes +# NOTE duplicate names should not exist or test may be incorrect +nncc_find_resource(CircleRecipes) +set(CIRCLERECIPES_DIR "${CircleRecipes_DIR}") + +file(GLOB RECIPES2 RELATIVE ${CIRCLERECIPES_DIR} "${CIRCLERECIPES_DIR}/*/test.recipe") + +foreach(RECIPE IN ITEMS ${RECIPES2}) + get_filename_component(RECIPE_PREFIX ${RECIPE} DIRECTORY) + + set(RECIPE_SOURCE_FILE "${RECIPE_PREFIX}.recipe") + set(CIRCLE_OUTPUT_FILE "${RECIPE_PREFIX}.circle") + + # Copy .recipe + add_custom_command(OUTPUT "${RECIPE_SOURCE_FILE}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${CIRCLERECIPES_DIR}/${RECIPE}" "${RECIPE_SOURCE_FILE}" + DEPENDS "${CIRCLERECIPES_DIR}/${RECIPE}" + COMMENT "Generating ${RECIPE_SOURCE_FILE}") + + # Generate .circle + add_custom_command(OUTPUT "${CIRCLE_OUTPUT_FILE}" + COMMAND circlechef-file "${RECIPE_SOURCE_FILE}" "${CIRCLE_OUTPUT_FILE}" + DEPENDS circlechef-file "${RECIPE_SOURCE_FILE}" + COMMENT "Generating ${CIRCLE_OUTPUT_FILE}") + + list(APPEND TESTFILES "${CIRCLE_OUTPUT_FILE}") +endforeach(RECIPE) + # Add a dummy target to create a target-level dependency. # TODO Find a way to create dependency between CTest tests (added below) and generated testfiles. add_custom_target(luci_testfiles ALL DEPENDS ${TESTFILES}) diff --git a/compiler/luci/tests/readverify.sh b/compiler/luci/tests/readverify.sh index 3403e9c..6d6753d 100755 --- a/compiler/luci/tests/readverify.sh +++ b/compiler/luci/tests/readverify.sh @@ -7,6 +7,9 @@ # ./readverify.sh ... VERIFY_SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +# set LOG enable to execute/test luci/logex codes +export LUCI_LOG=100 + WORKDIR="$1"; shift VERIFY_BINARY_PATH="$1"; shift diff --git a/compiler/luci/tests/test.lst b/compiler/luci/tests/test.lst index 08cbd6b..188e298 100644 --- a/compiler/luci/tests/test.lst +++ b/compiler/luci/tests/test.lst @@ -1,5 +1,8 @@ +addread(Abs_000) addread(Add_000) +addread(Add_001) addread(Add_U8_000) +addread(AddN_000) addread(ArgMax_000) addread(ArgMax_001) addread(ArgMax_002) @@ -8,44 +11,190 @@ addread(ArgMax_U8_000) addread(ArgMax_U8_001) addread(ArgMax_U8_002) addread(ArgMax_U8_003) +addread(ArgMin_000) +addread(ArgMin_001) +addread(ArgMin_002) +addread(ArgMin_003) +addread(ArgMin_U8_000) +addread(ArgMin_U8_001) +addread(ArgMin_U8_002) +addread(ArgMin_U8_003) +addread(AveragePool2D_000) +addread(BatchMatMul_000) +addread(BatchMatMulV2_000) +addread(BatchMatMulV2_001) addread(BatchToSpaceND_000) +addread(Cast_000) +addread(Cast_001) +addread(Ceil_000) addread(Concatenation_000) addread(Concatenation_U8_000) addread(Conv2D_000) -addread(Conv2D_U8_000) addread(Conv2D_002) +addread(Conv2D_003) +addread(Conv2D_U8_000) addread(Cos_000) +addread(DepthToSpace_000) addread(DepthwiseConv2D_000) addread(DepthwiseConv2D_U8_000) +addread(DepthwiseConv2D_001) addread(Div_000) +addread(ELU_000) addread(Equal_000) addread(Exp_000) +addread(ExpandDims_000) +addread(ExpandDims_001) +addread(ExpandDims_002) +addread(ExpandDims_003) +addread(Fill_000) +addread(Fill_001) +addread(Floor_000) +addread(FloorDiv_000) +addread(FloorDiv_001) +addread(FloorMod_000) +addread(FloorMod_001) addread(FullyConnected_000) addread(FullyConnected_001) +addread(FullyConnected_002) addread(FullyConnected_U8_000) +addread(Gather_000) +addread(GatherNd_000) +addread(Greater_000) +addread(GreaterEqual_000) +addread(If_000) +addread(If_001) +addread(L2Normalize_000) +addread(L2Pool2D_000) +addread(L2Pool2D_U8_000) +addread(LeakyRelu_000) +addread(Less_000) +addread(LessEqual_000) +addread(LocalResponseNormalization_000) +addread(Log_000) +addread(LogicalAnd_000) addread(LogicalNot_000) addread(LogicalOr_000) +addread(Logistic_000) +addread(LogSoftmax_000) +addread(MatMul_000) +addread(MatrixDiag_000) +addread(MatrixSetDiag_000) +addread(Maximum_000) addread(MaxPool2D_000) addread(MaxPool2D_U8_000) addread(Mean_000) +addread(Mean_001) +addread(Minimum_000) +addread(MirrorPad_000) addread(Mul_000) addread(Mul_U8_000) +addread(Neg_000) +addread(NotEqual_000) +addread(OneHot_000) +addread(OneHot_001) +addread(OneHot_002) +addread(OneHot_003) addread(Pack_000) addread(Pack_U8_000) addread(Pad_000) +addread(Pow_000) +addread(PRelu_000) +addread(Range_000) +addread(Rank_000) +addread(ReduceAny_000) +addread(ReduceAny_001) +addread(ReduceAny_002) +addread(ReduceAny_003) +addread(ReduceMax_000) +addread(ReduceMin_000) +addread(ReduceProd_000) +addread(ReduceProd_001) +addread(ReduceProd_002) +addread(ReduceProd_003) addread(ReLU_000) +addread(ReLU6_000) +addread(ReLUN1To1_000) addread(Reshape_000) addread(Reshape_001) +addread(Reshape_002) +addread(Reshape_003) addread(Reshape_U8_000) +addread(ResizeBilinear_000) +addread(ResizeNearestNeighbor_000) +addread(ReverseSequence_000) +addread(ReverseV2_000) +addread(Round_000) addread(Rsqrt_000) +addread(ScatterNd_000) +addread(SegmentSum_000) +addread(Select_000) +addread(Select_001) +addread(Select_002) +addread(SelectV2_000) +addread(SelectV2_001) +addread(SelectV2_002) +addread(Shape_000) +addread(Sin_000) +addread(Slice_000) addread(Softmax_000) addread(Softmax_U8_000) +addread(SpaceToBatchND_000) +addread(SpaceToBatchND_001) +addread(SpaceToBatchND_002) +addread(SpaceToBatchND_003) +addread(SpaceToDepth_000) +addread(SparseToDense_000) +addread(Split_000) +addread(SplitV_000) +addread(Sqrt_000) +addread(Square_000) +addread(SquaredDifference_000) +addread(Squeeze_000) +addread(StridedSlice_000) +addread(StridedSlice_001) +addread(StridedSlice_002) addread(Sub_000) addread(Sub_U8_000) +addread(Sum_000) +addread(Sum_001) +addread(Tanh_000) +addread(Tile_000) +addread(Tile_U8_000) +addread(TopKV2_000) +addread(TopKV2_001) addread(Transpose_000) +addread(TransposeConv_000) +addread(Unpack_000) +addread(Unpack_001) +addread(Unpack_002) +addread(Unpack_003) +addread(Where_000) +addread(Where_001) +addread(While_000) +addread(While_001) +addread(While_002) +addread(While_003) +addread(YUV_TO_RGB_U8_000) +addread(ZerosLike_000) + +addread(Net_Dangle_001) +addread(Net_InstanceNorm_001) +addread(Net_InstanceNorm_002) +addread(Net_UnpackAdd_001) +addread(Net_ZeroDim_001) + +# from res/CircleRecipes +addread(BCQFullyConnected_000) +addread(BCQFullyConnected_001) +addread(BCQGather_000) +addread(CircleBatchMatMul_000) +addread(InstanceNorm_000) +addwrite(Abs_000) addwrite(Add_000) +addwrite(Add_001) addwrite(Add_U8_000) +addwrite(AddN_000) addwrite(ArgMax_000) addwrite(ArgMax_001) addwrite(ArgMax_002) @@ -54,38 +203,181 @@ addwrite(ArgMax_U8_000) addwrite(ArgMax_U8_001) addwrite(ArgMax_U8_002) addwrite(ArgMax_U8_003) +addwrite(ArgMin_000) +addwrite(ArgMin_001) +addwrite(ArgMin_002) +addwrite(ArgMin_003) +addwrite(ArgMin_U8_000) +addwrite(ArgMin_U8_001) +addwrite(ArgMin_U8_002) +addwrite(ArgMin_U8_003) +addwrite(AveragePool2D_000) +addwrite(BatchMatMul_000) +addwrite(BatchMatMulV2_000) +addwrite(BatchMatMulV2_001) addwrite(BatchToSpaceND_000) +addwrite(Cast_000) +addwrite(Cast_001) +addwrite(Ceil_000) addwrite(Concatenation_000) addwrite(Concatenation_U8_000) addwrite(Conv2D_000) -addwrite(Conv2D_U8_000) addwrite(Conv2D_002) +addwrite(Conv2D_003) +addwrite(Conv2D_U8_000) addwrite(Cos_000) +addwrite(DepthToSpace_000) addwrite(DepthwiseConv2D_000) addwrite(DepthwiseConv2D_U8_000) +addwrite(DepthwiseConv2D_001) addwrite(Div_000) +addwrite(ELU_000) addwrite(Equal_000) addwrite(Exp_000) +addwrite(ExpandDims_000) +addwrite(ExpandDims_001) +addwrite(ExpandDims_002) +addwrite(ExpandDims_003) +addwrite(Fill_000) +addwrite(Fill_001) +addwrite(Floor_000) +addwrite(FloorDiv_000) +addwrite(FloorDiv_001) +addwrite(FloorMod_000) +addwrite(FloorMod_001) addwrite(FullyConnected_000) addwrite(FullyConnected_001) +addwrite(FullyConnected_002) addwrite(FullyConnected_U8_000) +addwrite(Gather_000) +addwrite(GatherNd_000) +addwrite(Greater_000) +addwrite(GreaterEqual_000) +addwrite(If_000) +addwrite(If_001) +addwrite(L2Normalize_000) +addwrite(L2Pool2D_000) +addwrite(L2Pool2D_U8_000) +addwrite(LeakyRelu_000) +addwrite(Less_000) +addwrite(LessEqual_000) +addwrite(LocalResponseNormalization_000) +addwrite(Log_000) +addwrite(LogicalAnd_000) addwrite(LogicalNot_000) addwrite(LogicalOr_000) +addwrite(Logistic_000) +addwrite(LogSoftmax_000) +addwrite(MatMul_000) +addwrite(MatrixDiag_000) +addwrite(MatrixSetDiag_000) +addwrite(Maximum_000) addwrite(MaxPool2D_000) addwrite(MaxPool2D_U8_000) addwrite(Mean_000) +addwrite(Mean_001) +addwrite(Minimum_000) +addwrite(MirrorPad_000) addwrite(Mul_000) addwrite(Mul_U8_000) +addwrite(Neg_000) +addwrite(NotEqual_000) +addwrite(OneHot_000) +addwrite(OneHot_001) +addwrite(OneHot_002) +addwrite(OneHot_003) addwrite(Pack_000) addwrite(Pack_U8_000) addwrite(Pad_000) +addwrite(Pow_000) +addwrite(PRelu_000) +addwrite(Range_000) +addwrite(Rank_000) +addwrite(ReduceAny_000) +addwrite(ReduceAny_001) +addwrite(ReduceAny_002) +addwrite(ReduceAny_003) +addwrite(ReduceMax_000) +addwrite(ReduceMin_000) +addwrite(ReduceProd_000) +addwrite(ReduceProd_001) +addwrite(ReduceProd_002) +addwrite(ReduceProd_003) addwrite(ReLU_000) +addwrite(ReLU6_000) +addwrite(ReLUN1To1_000) addwrite(Reshape_000) addwrite(Reshape_001) +addwrite(Reshape_002) +addwrite(Reshape_003) addwrite(Reshape_U8_000) +addwrite(ResizeBilinear_000) +addwrite(ResizeNearestNeighbor_000) +addwrite(ReverseSequence_000) +addwrite(ReverseV2_000) +addwrite(Round_000) addwrite(Rsqrt_000) +addwrite(ScatterNd_000) +addwrite(SegmentSum_000) +addwrite(Select_000) +addwrite(Select_001) +addwrite(Select_002) +addwrite(SelectV2_000) +addwrite(SelectV2_001) +addwrite(SelectV2_002) +addwrite(Shape_000) +addwrite(Sin_000) +addwrite(Slice_000) addwrite(Softmax_000) addwrite(Softmax_U8_000) +addwrite(SpaceToBatchND_000) +addwrite(SpaceToBatchND_001) +addwrite(SpaceToBatchND_002) +addwrite(SpaceToBatchND_003) +addwrite(SpaceToDepth_000) +addwrite(SparseToDense_000) +addwrite(Split_000) +addwrite(SplitV_000) +addwrite(Sqrt_000) +addwrite(Square_000) +addwrite(SquaredDifference_000) +addwrite(Squeeze_000) +addwrite(StridedSlice_000) +addwrite(StridedSlice_001) +addwrite(StridedSlice_002) addwrite(Sub_000) addwrite(Sub_U8_000) +addwrite(Sum_000) +addwrite(Sum_001) +addwrite(Tanh_000) +addwrite(Tile_000) +addwrite(Tile_U8_000) +addwrite(TopKV2_000) +addwrite(TopKV2_001) addwrite(Transpose_000) +addwrite(TransposeConv_000) +addwrite(Unpack_000) +addwrite(Unpack_001) +addwrite(Unpack_002) +addwrite(Unpack_003) +addwrite(Where_000) +addwrite(Where_001) +addwrite(While_000) +addwrite(While_001) +addwrite(While_002) +addwrite(While_003) +addwrite(YUV_TO_RGB_U8_000) +addwrite(ZerosLike_000) + +addwrite(Net_Dangle_001) +addwrite(Net_InstanceNorm_001) +addwrite(Net_InstanceNorm_002) +addwrite(Net_UnpackAdd_001) +addwrite(Net_ZeroDim_001) + +# from res/CircleRecipes +addwrite(BCQFullyConnected_000) +addwrite(BCQFullyConnected_001) +addwrite(BCQGather_000) +addwrite(CircleBatchMatMul_000) +addwrite(InstanceNorm_000) diff --git a/compiler/mio-circle/CMakeLists.txt b/compiler/mio-circle/CMakeLists.txt index f97ec2b..9c1126d 100644 --- a/compiler/mio-circle/CMakeLists.txt +++ b/compiler/mio-circle/CMakeLists.txt @@ -13,7 +13,7 @@ set(SCHEMA_FILE "${NNAS_PROJECT_SOURCE_DIR}/nnpackage/schema/circle_schema.fbs") add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/schema.fbs" COMMAND ${CMAKE_COMMAND} -E copy "${SCHEMA_FILE}" schema.fbs WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - DEPENDS "${NNAS_PROJECT_SOURCE_DIR}/nnpackage/schema/circle_schema.fbs" + DEPENDS "${SCHEMA_FILE}" ) FlatBuffers_Target(mio_circle diff --git a/compiler/mio-tflite/CMakeLists.txt b/compiler/mio-tflite/CMakeLists.txt index cb0795a..2cfed14 100644 --- a/compiler/mio-tflite/CMakeLists.txt +++ b/compiler/mio-tflite/CMakeLists.txt @@ -1,10 +1,15 @@ nnas_find_package(FlatBuffers QUIET) if(NOT FlatBuffers_FOUND) + message(STATUS "Build mio-tflite: FAILED (missing Flatbuffers)") return() endif(NOT FlatBuffers_FOUND) -nnas_find_package(TensorFlowSource EXACT 2.1.0 QUIET) +# TODO recover official release version +# NOTE we cannot use version number like "2.3.0-rc0" for find_package() +# use TensorFlowSource-2.3.0-rc0 as config itself +# nnas_find_package(TensorFlowSource EXACT 2.3.0 QUIET) +nnas_find_package(TensorFlowSource-2.3.0-rc0 QUIET) if(NOT TensorFlowSource_FOUND) return() diff --git a/compiler/mir-caffe-importer/CMakeLists.txt b/compiler/mir-caffe-importer/CMakeLists.txt deleted file mode 100644 index 8317651..0000000 --- a/compiler/mir-caffe-importer/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -nnas_find_package(CaffeProto QUIET) - -if (NOT CaffeProto_FOUND) - return() -endif () - -set(MIR_CAFFE_IMPORTER_SOURCES - caffe_importer.cpp - caffe_importer.h - caffe_op_creator.cpp - caffe_op_creator.h - caffe_op_types.h) - -add_library(mir_caffe_importer STATIC ${MIR_CAFFE_IMPORTER_SOURCES}) -set_target_properties(mir_caffe_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(mir_caffe_importer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(mir_caffe_importer PUBLIC mir caffeproto PRIVATE stdex) diff --git a/compiler/mir-caffe-importer/caffe_importer.cpp b/compiler/mir-caffe-importer/caffe_importer.cpp deleted file mode 100644 index 8e5ebda..0000000 --- a/compiler/mir-caffe-importer/caffe_importer.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "caffe_importer.h" -#include "caffe/proto/caffe.pb.h" -#include "caffe_op_creator.h" -#include "caffe_op_types.h" - -#include "mir/ops/OutputOp.h" - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace mir_caffe -{ - -namespace -{ - -class CaffeImporter -{ -public: - /// @brief Load the model and convert it into a MIR Graph. - std::unique_ptr importModelFromBinaryFile(const std::string &filename); - std::unique_ptr importModelFromTextFile(const std::string &filename); - -private: - std::unique_ptr importModel(); - - std::unique_ptr _net; - std::unique_ptr _opCreator; - - // Maps Caffe blob names to corresponding MIR operation outputs. - std::map _blobNameToOpOutput; - - static const std::map _operatorTypes; - - /** - * @brief Mark output MIR nodes - */ - void setGraphOutputs(mir::Graph *graph); - - /** - * @brief Pass through caffe graph and collect unsupported by NNC layers - * @throw PassException with message, containing detected problems - */ - void collectUnsupportedLayers(); - - /** - * @brief Create MIR node from single caffe layer - */ - void createMIRNodesFromLayer(const caffe::LayerParameter &layer); - - mir::Operation::Output *getOutputForBlob(const std::string &blob_name) const; - void setOutputForBlob(const std::string &blob_name, mir::Operation::Output *output); - - /** - * @brief Collect unsupported parts of caffe layer - */ - void collectUnsupportedOp(const caffe::LayerParameter &layer, std::set &problems); - - /** - * @brief Returns MIR operation outputs corresponding to the inputs of the given layer. - */ - std::vector getMIRInputsForLayer(const caffe::LayerParameter &layer); - - void processDeprecatedInput(); -}; - -void loadModelFromBinaryFile(const std::string &filename, caffe::NetParameter *net) -{ - GOOGLE_PROTOBUF_VERIFY_VERSION; - - int file_handle = open(filename.c_str(), O_RDONLY); - - if (file_handle == -1) - throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + - "."); - - google::protobuf::io::FileInputStream file_stream(file_handle); - file_stream.SetCloseOnDelete(true); - - google::protobuf::io::CodedInputStream coded_stream(&file_stream); - coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); - - if (!net->ParseFromCodedStream(&coded_stream)) - throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); - - // If the file has not been consumed entirely, assume that the file is in the wrong format. - if (!coded_stream.ConsumedEntireMessage()) - throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); -} - -void loadModelFromTextFile(const std::string &filename, caffe::NetParameter *net) -{ - GOOGLE_PROTOBUF_VERIFY_VERSION; - - int file_handle = open(filename.c_str(), O_RDONLY); - - if (file_handle == -1) - throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + - "."); - - google::protobuf::io::FileInputStream file_stream(file_handle); - file_stream.SetCloseOnDelete(true); - - if (!google::protobuf::TextFormat::Parse(&file_stream, net)) - throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); -} - -std::unique_ptr CaffeImporter::importModel() -{ - auto graph = stdex::make_unique(); - _opCreator = stdex::make_unique(graph.get()); - - collectUnsupportedLayers(); - - for (int i = 0; i < _net->layer_size(); ++i) - createMIRNodesFromLayer(_net->layer(i)); - - setGraphOutputs(graph.get()); - - return std::move(graph); -} - -std::unique_ptr CaffeImporter::importModelFromBinaryFile(const std::string &filename) -{ - _net = stdex::make_unique(); - loadModelFromBinaryFile(filename, _net.get()); - - return importModel(); -} - -std::unique_ptr CaffeImporter::importModelFromTextFile(const std::string &filename) -{ - _net = stdex::make_unique(); - loadModelFromTextFile(filename, _net.get()); - - return importModel(); -} - -void CaffeImporter::collectUnsupportedLayers() -{ - processDeprecatedInput(); - - std::set problems; - - for (const caffe::LayerParameter &layer : _net->layer()) - collectUnsupportedOp(layer, problems); - - if (!problems.empty()) - { - std::string msg("NNC can't load model. Detected problems:"); - for (const auto &problemStr : problems) - msg.append("\n * " + problemStr); - throw std::runtime_error(msg); - } -} - -void CaffeImporter::createMIRNodesFromLayer(const caffe::LayerParameter &layer) -{ - std::vector inputs = getMIRInputsForLayer(layer); - std::vector outputs; - - switch (_operatorTypes.at(layer.type())) - { - case CaffeOpType::input: - outputs = _opCreator->convertInput(layer); - break; - case CaffeOpType::convolution: - outputs = _opCreator->convertConvolution(layer, inputs); - break; - case CaffeOpType::innerProduct: - outputs = _opCreator->convertInnerProduct(layer, inputs); - break; - case CaffeOpType::pooling: - outputs = _opCreator->convertPooling(layer, inputs); - break; - case CaffeOpType::concat: - outputs = _opCreator->convertConcat(layer, inputs); - break; - case CaffeOpType::reshape: - outputs = _opCreator->convertReshape(layer, inputs); - break; - case CaffeOpType::ReLU: - outputs = _opCreator->convertReLU(layer, inputs); - break; - case CaffeOpType::softmax: - outputs = _opCreator->convertSoftmax(layer, inputs); - break; - case CaffeOpType::scale: - outputs = _opCreator->convertScale(layer, inputs); - break; - case CaffeOpType::batchNorm: - outputs = _opCreator->convertBatchNorm(layer, inputs); - break; - case CaffeOpType::dropout: - outputs = _opCreator->convertDropout(layer, inputs); - break; - case CaffeOpType::tanh: - outputs = _opCreator->convertTanH(layer, inputs); - break; - case CaffeOpType::ELU: - outputs = _opCreator->convertELU(layer, inputs); - break; - case CaffeOpType::eltwise: - outputs = _opCreator->convertEltwise(layer, inputs); - break; - case CaffeOpType::embed: - outputs = _opCreator->convertEmbed(layer, inputs); - break; - case CaffeOpType::deconvolution: - outputs = _opCreator->convertDeconvolution(layer, inputs); - break; - case CaffeOpType::split: - outputs = _opCreator->convertSplit(layer, inputs); - break; - case CaffeOpType::sigmoid: - outputs = _opCreator->convertSigmoid(layer, inputs); - break; - case CaffeOpType::LSTM: - outputs = _opCreator->convertLSTM(layer, inputs); - break; - default: - assert(false && "All unsupported types should have been found before this pass."); - } - - assert(static_cast(outputs.size()) == layer.top_size() && "Number of outputs differs."); - for (int i = 0; i < layer.top_size(); ++i) - setOutputForBlob(layer.top(i), outputs[i]); -} - -void CaffeImporter::collectUnsupportedOp(const caffe::LayerParameter &layer, - std::set &problems) -{ - auto it = _operatorTypes.find(layer.type()); - if (it == _operatorTypes.end()) - { - problems.insert(layer.type() + ": unknown layer"); - return; - } - - CaffeOpType op_type = it->second; - - switch (op_type) - { - case CaffeOpType::concat: - case CaffeOpType::input: - case CaffeOpType::softmax: - case CaffeOpType::scale: - case CaffeOpType::dropout: - case CaffeOpType::split: - case CaffeOpType::eltwise: - case CaffeOpType::ELU: - case CaffeOpType::ReLU: - case CaffeOpType::embed: - case CaffeOpType::sigmoid: - case CaffeOpType::tanh: - case CaffeOpType::innerProduct: - // No checks - break; - case CaffeOpType::deconvolution: - case CaffeOpType::convolution: - _opCreator->checkConvolution(layer, problems); - break; - case CaffeOpType::pooling: - _opCreator->checkPooling(layer, problems); - break; - case CaffeOpType::reshape: - _opCreator->checkReshape(layer, problems); - break; - case CaffeOpType::batchNorm: - _opCreator->checkBatchNorm(layer, problems); - break; - case CaffeOpType::LSTM: - _opCreator->checkLSTM(layer, problems); - break; - default: - problems.insert(layer.type() + ": unsupported layer"); - break; - } -} - -void CaffeImporter::processDeprecatedInput() -{ - if (_net->input_dim_size() != 0 || _net->input_shape_size() != 0) - throw std::runtime_error("Deprecated Caffe input types are not supported"); -} - -std::vector -CaffeImporter::getMIRInputsForLayer(const caffe::LayerParameter &layer) -{ - std::vector inputs; - - for (const auto &input_name : layer.bottom()) - inputs.push_back(getOutputForBlob(input_name)); - - return inputs; -} - -mir::Operation::Output *CaffeImporter::getOutputForBlob(const std::string &blob_name) const -{ - return _blobNameToOpOutput.at(blob_name); -} - -void CaffeImporter::setOutputForBlob(const std::string &blob_name, mir::Operation::Output *output) -{ - const auto it = _blobNameToOpOutput.find(blob_name); - if (it != _blobNameToOpOutput.cend()) - { - // caffe input blob name could be same as output blob name, and next line will overwrite - // '_blobNameToOpOutput' element, but in all networks that I saw it was not a problem - it->second->setName(""); - } - - // Do not overwrite the name in case of fall-through layers (ex. Dropout, Split). - // TODO Find a way to handle it properly. - if (output->getName().empty()) - output->setName(blob_name); - - _blobNameToOpOutput[blob_name] = output; -} - -void CaffeImporter::setGraphOutputs(mir::Graph *graph) -{ - // TODO For now, we assume that: - // - there is exactly one output; - // - the output is from the last layer. - const auto &last_layer = *_net->layer().rbegin(); - auto output = getOutputForBlob(last_layer.top(0)); - graph->create(output); -} - -const std::map CaffeImporter::_operatorTypes = { - {"AbsVal", CaffeOpType::absVal}, - {"Accuracy", CaffeOpType::accuracy}, - {"ArgMax", CaffeOpType::argMax}, - {"BatchNorm", CaffeOpType::batchNorm}, - {"BatchReindex", CaffeOpType::batchReindex}, - {"Bias", CaffeOpType::bias}, - {"BNLL", CaffeOpType::BNLL}, - {"Clip", CaffeOpType::clip}, - {"Concat", CaffeOpType::concat}, - {"ContrastiveLoss", CaffeOpType::contrastiveLoss}, - {"Convolution", CaffeOpType::convolution}, - {"Crop", CaffeOpType::crop}, - {"Data", CaffeOpType::data}, - {"Deconvolution", CaffeOpType::deconvolution}, - {"Dropout", CaffeOpType::dropout}, - {"DummyData", CaffeOpType::dummyData}, - {"Eltwise", CaffeOpType::eltwise}, - {"ELU", CaffeOpType::ELU}, - {"Embed", CaffeOpType::embed}, - {"EuclidianLoss", CaffeOpType::euclidianLoss}, - {"Exp", CaffeOpType::exp}, - {"Filter", CaffeOpType::filter}, - {"Flatten", CaffeOpType::flatten}, - {"HDF5Data", CaffeOpType::HDF5Data}, - {"HDF5Output", CaffeOpType::HDF5Output}, - {"HingeLoss", CaffeOpType::hingeLoss}, - {"Im2Col", CaffeOpType::im2Col}, - {"ImageData", CaffeOpType::imageData}, - {"InfogainLoss", CaffeOpType::infogainLoss}, - {"InnerProduct", CaffeOpType::innerProduct}, - {"Input", CaffeOpType::input}, - {"Log", CaffeOpType::log}, - {"LRN", CaffeOpType::LRN}, - {"LSTM", CaffeOpType::LSTM}, - {"MemoryData", CaffeOpType::memoryData}, - {"MultinomialLogisticLoss", CaffeOpType::multinomialLogisticLoss}, - {"MVN", CaffeOpType::MVN}, - {"Parameter", CaffeOpType::parameter}, - {"Pooling", CaffeOpType::pooling}, - {"Power", CaffeOpType::power}, - {"PReLU", CaffeOpType::PReLU}, - {"Python", CaffeOpType::python}, - {"Recurrent", CaffeOpType::recurrent}, - {"Reduction", CaffeOpType::reduction}, - {"ReLU", CaffeOpType::ReLU}, - {"Reshape", CaffeOpType::reshape}, - {"RNN", CaffeOpType::RNN}, - {"Scale", CaffeOpType::scale}, - {"SigmoidCrossEntropyLoss", CaffeOpType::sigmoidCrossEntropyLoss}, - {"Sigmoid", CaffeOpType::sigmoid}, - {"Silence", CaffeOpType::silence}, - {"Softmax", CaffeOpType::softmax}, - {"SoftmaxWithLoss", CaffeOpType::softmaxWithLoss}, - {"SPP", CaffeOpType::SPP}, - {"Split", CaffeOpType::split}, - {"Slice", CaffeOpType::slice}, - {"TanH", CaffeOpType::tanh}, - {"Threshold", CaffeOpType::threshold}, - {"Tile", CaffeOpType::tile}, - {"WindowData", CaffeOpType::windowData}}; -} // namespace - -std::unique_ptr importModelFromBinaryFile(const std::string &filename) -{ - CaffeImporter importer; - return importer.importModelFromBinaryFile(filename); -} - -std::unique_ptr importModelFromTextFile(const std::string &filename) -{ - CaffeImporter importer; - return importer.importModelFromTextFile(filename); -} - -std::unique_ptr loadModel(const std::string &filename) -{ - return importModelFromBinaryFile(filename); -} - -} // namespace mir_caffe diff --git a/compiler/mir-caffe-importer/caffe_op_creator.cpp b/compiler/mir-caffe-importer/caffe_op_creator.cpp deleted file mode 100644 index 5d43d24..0000000 --- a/compiler/mir-caffe-importer/caffe_op_creator.cpp +++ /dev/null @@ -1,834 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "caffe_op_creator.h" - -#include "mir/ops/AddOp.h" -#include "mir/ops/AvgPool2DOp.h" -#include "mir/ops/ConcatOp.h" -#include "mir/ops/ConstantOp.h" -#include "mir/ops/Conv2DOp.h" -#include "mir/ops/Deconv2DOp.h" -#include "mir/ops/EluOp.h" -#include "mir/ops/FullyConnectedOp.h" -#include "mir/ops/GatherOp.h" -#include "mir/ops/LeakyReluOp.h" -#include "mir/ops/MaxOp.h" -#include "mir/ops/MaxPool2DOp.h" -#include "mir/ops/MulOp.h" -#include "mir/ops/ReluOp.h" -#include "mir/ops/ReshapeOp.h" -#include "mir/ops/SigmoidOp.h" -#include "mir/ops/SliceOp.h" -#include "mir/ops/SoftmaxOp.h" -#include "mir/ops/TanhOp.h" -#include "mir/ops/TransposeOp.h" -#include "mir/Index.h" -#include "mir/ShapeRange.h" -#include "mir/Tensor.h" - -#include -#include -#include - -namespace mir_caffe -{ - -static mir::Shape convertBlobShape(const caffe::BlobShape &shape) -{ - mir::Shape mir_shape(shape.dim_size()); - - for (int i = 0; i < shape.dim_size(); ++i) - { - mir_shape.dim(i) = shape.dim(i); - } - - return mir_shape; -} - -using namespace mir; - -/// @brief Split arg into @p num_parts equal parts along @p axis axis. -std::vector CaffeOpCreator::createSplit(mir::Operation::Output *arg, - int32_t num_parts, int32_t axis) -{ - const auto &arg_shape = arg->getShape(); - - assert(axis >= 0 && axis < arg_shape.rank()); - int32_t part_size = arg_shape.dim(axis) / num_parts; - assert(part_size * num_parts == arg_shape.dim(axis)); - - Shape starts(arg_shape.rank()); - Shape sizes(arg_shape); - sizes.dim(axis) = part_size; - - std::vector outputs(num_parts); - for (int32_t i = 0; i < num_parts; ++i) - { - outputs[i] = createOp(arg, starts, sizes)->getOutput(0); - starts.dim(axis) += part_size; - } - - return outputs; -} - -/// @brief Helper function for creating FullyConnected operation with non-square input. -mir::Operation::Output *CaffeOpCreator::createFullyConnected(mir::Operation::Output *input, - mir::Operation::Output *weights, - int32_t axis) -{ - const auto &input_shape = input->getShape(); - const auto &weights_shape = weights->getShape(); - - assert(axis >= 0 && axis < input_shape.rank()); - assert(weights_shape.rank() == 2); - - // Result shape is: input.shape[0:axis] + weights.shape[1]. - Shape result_shape = input_shape; - result_shape.resize(axis + 1); - result_shape.dim(axis) = weights_shape.dim(1); - - // Flatten input to 2-D shape. - int32_t outer_size = 1; - for (int32_t i = 0; i < axis; ++i) - outer_size *= input_shape.dim(i); - int32_t inner_size = 1; - for (int32_t i = axis; i < input_shape.rank(); ++i) - inner_size *= input_shape.dim(i); - - auto flatten = createOp(input, Shape{outer_size, inner_size})->getOutput(0); - auto fc = createOp(flatten, weights)->getOutput(0); - return createOp(fc, result_shape)->getOutput(0); -} - -TensorVariant CaffeOpCreator::convertBlob(const caffe::BlobProto &blob) -{ - const void *src_data; - - mir::DataType dtype; - if (blob.data_size() != 0) - { - assert(blob.double_data_size() == 0); - dtype = mir::DataType::FLOAT32; - src_data = blob.data().data(); - } - else if (blob.double_data_size() != 0) - { - dtype = mir::DataType::FLOAT64; - src_data = blob.double_data().data(); - } - else - { - throw std::runtime_error("No data in Caffe BlobProto, investigate"); - } - - const mir::Shape shape = convertBlobShape(blob.shape()); - return TensorVariant({dtype, shape}, src_data); -} - -std::vector -CaffeOpCreator::convertInput(const caffe::LayerParameter &layer) -{ - const auto ¶ms = layer.input_param(); - const auto num_inputs = layer.top_size(); - const auto num_shapes = params.shape_size(); - std::vector outputs; - - assert((num_shapes == 1 || num_shapes == num_inputs) && "Unsupported number of shapes."); - - for (int i = 0; i < num_inputs; ++i) - { - const auto &blob_shape = params.shape(num_shapes == 1 ? 0 : i); - mir::TensorType input_type(DataType::FLOAT32, convertBlobShape(blob_shape)); - auto input = createOp(input_type)->getOutput(0); - outputs.push_back(input); - } - - return outputs; -} - -template -static void convertConvolutionParam(const caffe::ConvolutionParameter &conv_param, - OperationAttributes &attributes) -{ - std::int32_t stride_h, stride_w; - if (conv_param.has_stride_h() || conv_param.has_stride_w()) - { - // If stride_h or stride_w are set, they take precedence. - stride_h = conv_param.stride_h(); - stride_w = conv_param.stride_w(); - } - else if (conv_param.stride_size() == 0) - { - // If no strides specified, they defaults to 1. - stride_h = stride_w = 1; - } - else if (conv_param.stride_size() == 1) - { - // If only one stride specified, all strides take the same value. - stride_h = stride_w = conv_param.stride(0); - } - else - { - // Otherwise, there must be a stride for each dimension. - assert(conv_param.stride_size() == 2); - stride_h = conv_param.stride(0); - stride_w = conv_param.stride(1); - } - attributes.strides = {stride_h, stride_w}; - - std::int32_t pad_h, pad_w; - if (conv_param.has_pad_h() || conv_param.has_pad_w()) - { - // If pad_h or pad_w are set, they take precedence. - pad_h = conv_param.pad_h(); - pad_w = conv_param.pad_w(); - } - else if (conv_param.pad_size() == 0) - { - // If no pads specified, they defaults to 0. - pad_h = pad_w = 0; - } - else if (conv_param.pad_size() == 1) - { - // If only one pad specified, all pads take the same value. - pad_h = pad_w = conv_param.pad(0); - } - else - { - // Otherwise, there must be a pad for each dimension. - assert(conv_param.pad_size() == 2); - pad_h = conv_param.pad(0); - pad_w = conv_param.pad(1); - } - attributes.padding_after = attributes.padding_before = {pad_h, pad_w}; -} - -void CaffeOpCreator::checkConvolution(const caffe::LayerParameter &layer, - std::set &problems_ops_set) -{ - const caffe::ConvolutionParameter ¶ms = layer.convolution_param(); - - assert(params.stride_size() <= 2); - - if (params.axis() != 1) - problems_ops_set.insert("Conv2D: Unsupported axis"); - - if (params.pad_size() != 0 && (params.has_pad_h() || params.has_pad_w())) - problems_ops_set.insert("Conv2D: Conflicting padding properties"); - - if (params.pad_size() > 2) - problems_ops_set.insert("Conv2D: Unsupported number of pads"); -} - -std::vector -CaffeOpCreator::convertConvolution(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.convolution_param(); - Conv2DOpAttributes attributes; - - convertConvolutionParam(params, attributes); - attributes.num_groups = params.group(); - attributes.data_format = DataFormat::NCHW; - - assert(layer.blobs(0).shape().dim_size() == 4); - auto kernel = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - std::vector perm{0, 2, 3, 1}; // OIHW -> OHWI - kernel = createOp(kernel, perm)->getOutput(0); - auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); - - // Add the bias, if any. - if (params.bias_term()) - { - auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -std::vector -CaffeOpCreator::convertDeconvolution(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const caffe::ConvolutionParameter ¶ms = layer.convolution_param(); - Deconv2DOpAttributes attributes; - - convertConvolutionParam(params, attributes); - attributes.data_format = DataFormat::NCHW; - - if (params.group() != 1) - { - throw std::runtime_error("Deconvolution: 'group' != 1 is not supported."); - } - - auto kernel = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - std::vector perm{2, 3, 1, 0}; // IOHW -> HWOI - kernel = createOp(kernel, perm)->getOutput(0); - auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); - - // bias_term is optional (so might not be present) and defaults to true - if (params.bias_term()) - { - auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -std::vector -CaffeOpCreator::convertInnerProduct(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.inner_product_param(); - auto weights = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - - if (!params.transpose()) - weights = createOp(weights, std::vector{1, 0})->getOutput(0); - - auto result = createFullyConnected(inputs[0], weights, params.axis()); - - // Add the bias, if any. - if (params.bias_term()) - { - auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -std::vector -CaffeOpCreator::convertConcat(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.concat_param(); - auto concat = createOp(inputs, params.axis()); - return {concat->getOutput(0)}; -} - -template -static void convertPoolingParam(const caffe::PoolingParameter ¶ms, - const mir::Shape &input_shape, PoolingAttributes &attributes) -{ - std::int32_t kernel_h, kernel_w; - assert(!params.global_pooling()); - if (params.has_kernel_size()) - { - kernel_h = kernel_w = params.kernel_size(); - } - else - { - kernel_h = params.kernel_h(); - kernel_w = params.kernel_w(); - } - attributes.window = {kernel_h, kernel_w}; - - std::int32_t stride_h, stride_w; - if (params.has_stride_h() || params.has_stride_w()) - { - stride_h = params.stride_h(); - stride_w = params.stride_w(); - } - else - { - stride_h = stride_w = params.stride(); - } - attributes.strides = {stride_h, stride_w}; - - std::int32_t pad_h, pad_w; - if (params.has_pad_h() || params.has_pad_w()) - { - pad_h = params.pad_h(); - pad_w = params.pad_w(); - } - else - { - pad_h = pad_w = params.pad(); - } - - attributes.padding_before = attributes.padding_after = {pad_h, pad_w}; - - // Caffe uses different formula for computing output shape than MIR. Adjust padding so that - // the output shape stays the same. - constexpr int num_spatial_dims = 2; - for (int i = 0; i < num_spatial_dims; ++i) - { - // Assuming NCHW format. - const std::int32_t padded_input = - input_shape.dim(2 + i) + attributes.padding_before[i] + attributes.padding_after[i]; - if ((padded_input - attributes.window[i]) % attributes.strides[i] != 0) - ++attributes.padding_after[i]; - } -} - -void CaffeOpCreator::checkPooling(const caffe::LayerParameter &layer, - std::set &problems_ops_set) -{ - const caffe::PoolingParameter ¶ms = layer.pooling_param(); - - if (params.has_global_pooling() && params.global_pooling()) - problems_ops_set.insert("Pooling: pooling layer global_pooling param is not supported yet"); - - if (params.pool() != caffe::PoolingParameter::AVE && - params.pool() != caffe::PoolingParameter::MAX) - problems_ops_set.insert("Pooling: unsupported pooling type"); - - if (params.has_pad() && (params.has_pad_h() || params.has_pad_w())) - problems_ops_set.insert("Pooling: conflicting padding properties in pooling"); -} - -std::vector -CaffeOpCreator::convertPooling(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.pooling_param(); - - assert(inputs.size() == 1); - auto input = inputs[0]; - - mir::Operation::Output *result; - - switch (params.pool()) - { - case caffe::PoolingParameter::AVE: - { - AvgPool2DOpAttributes attributes_avg; - attributes_avg.data_format = DataFormat::NCHW; - convertPoolingParam(params, input->getShape(), attributes_avg); - result = createOp(input, attributes_avg)->getOutput(0); - break; - } - case caffe::PoolingParameter::MAX: - { - MaxPool2DOpAttributes attributes_max; - attributes_max.data_format = DataFormat::NCHW; - convertPoolingParam(params, input->getShape(), attributes_max); - result = createOp(input, attributes_max)->getOutput(0); - break; - } - default: - assert(false); - } - - return {result}; -} - -std::vector -CaffeOpCreator::convertSoftmax(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.softmax_param(); - - // CPP and ACL backends are able to perform Softmax only along the last axis. - // FIXME Do it in backends. - if (inputs[0]->getShape().rank() == 4) - { - // For now, we only account for the most common case. - if (params.axis() != 1) - throw std::runtime_error("Softmax: unsupported axis"); - int32_t axis = 3; - auto input = createOp(inputs[0], std::vector{0, 2, 3, 1}); - auto softmax = createOp(input->getOutput(0), axis); - auto result = - createOp(softmax->getOutput(0), std::vector{0, 3, 1, 2}); - return {result->getOutput(0)}; - } - - auto softmax = createOp(inputs[0], params.axis()); - return {softmax->getOutput(0)}; -} - -void CaffeOpCreator::checkReshape(const caffe::LayerParameter &layer, - std::set &problems_ops_set) -{ - const caffe::ReshapeParameter ¶ms = layer.reshape_param(); - - if (params.has_axis() || params.has_num_axes()) - problems_ops_set.insert("Reshape layer axis and num_axes params are not supported yet"); - - if (!params.has_shape()) - problems_ops_set.insert("Reshape layer doesn't have shape parameter"); - - const mir::Shape newShape = convertBlobShape(params.shape()); - - for (int32_t i = 0; i < newShape.rank(); ++i) - if (newShape.dim(i) == 0) - problems_ops_set.insert("Reshape layer zero shape values are not supported yet"); -} - -/** - * @brief Converts Caffe Reshape layer to Model IR Reshape operation. - * @todo Support "axis" and "num_axes" parameters as needed. - * @todo Decide how to react to the absence of "shape" parameter. - * @todo Support zero values in "shape" parameter. - */ -std::vector -CaffeOpCreator::convertReshape(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const caffe::ReshapeParameter ¶ms = layer.reshape_param(); - - const mir::Shape new_shape = convertBlobShape(params.shape()); - auto reshape = createOp(inputs[0], new_shape); - return {reshape->getOutput(0)}; -} - -std::vector -CaffeOpCreator::convertReLU(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - mir::Operation *relu; - if (layer.relu_param().has_negative_slope()) - { - float alpha = layer.relu_param().negative_slope(); - relu = createOp(inputs[0], alpha); - } - else - { - relu = createOp(inputs[0]); - } - - return {relu->getOutput(0)}; -} - -std::vector -CaffeOpCreator::convertScale(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.scale_param(); - auto scale = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - scale = createOp(scale, Shape{1, scale->getShape().dim(0), 1, 1})->getOutput(0); - auto result = createOp(inputs[0], scale)->getOutput(0); - - // Add the bias, if any. - if (params.bias_term()) - { - auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -void CaffeOpCreator::checkBatchNorm(const caffe::LayerParameter &layer, - std::set &problems_ops_set) -{ - const auto &scale_shape = layer.blobs(2).shape(); - - // Check that last blob(with scaleFactor) containing only one number - if (scale_shape.dim_size() != 1 || scale_shape.dim(0) != 1) - problems_ops_set.insert("Unexpected shape of scale parameter in batch norm"); -} - -std::vector -CaffeOpCreator::convertBatchNorm(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const caffe::BatchNormParameter ¶ms = layer.batch_norm_param(); - - auto input = inputs[0]; - auto mean_tensor = convertBlob(layer.blobs(0)); - auto var_tensor = convertBlob(layer.blobs(1)); - auto scale_tensor = convertBlob(layer.blobs(2)); - const float eps = params.eps(); - - float scale_factor = *reinterpret_cast(scale_tensor.at(mir::Index{0})); - - // See https://github.com/BVLC/caffe/blob/master/src/caffe/layers/batch_norm_layer.cpp#L100 - // Y = (X - mean / scale_factor) / sqrt(var / scale_factor + epsilon) = - // = (X + C1) * C2 - if (scale_factor != 0.0f) - scale_factor = 1.0f / scale_factor; - - // C1 = -mean / scale_factor - Tensor mean_accessor(mean_tensor); - for (const auto &idx : ShapeRange(mean_accessor.getShape())) - mean_accessor.at(idx) *= -scale_factor; - auto c1 = createOp(mean_tensor)->getOutput(0); - - // C2 = 1 / sqrt(var / scale_factor + epsilon) - Tensor var_accessor(var_tensor); - for (const auto &idx : ShapeRange(var_accessor.getShape())) - var_accessor.at(idx) = 1.0f / std::sqrt(var_accessor.at(idx) * scale_factor + eps); - auto c2 = createOp(var_tensor)->getOutput(0); - - c1 = createOp(c1, Shape{1, c1->getShape().dim(0), 1, 1})->getOutput(0); - c2 = createOp(c2, Shape{1, c2->getShape().dim(0), 1, 1})->getOutput(0); - - // Y = (X + C1) * C2 - auto result = createOp(input, c1)->getOutput(0); - result = createOp(result, c2)->getOutput(0); - - return {result}; -} - -std::vector -CaffeOpCreator::convertDropout(const caffe::LayerParameter &, - const std::vector &inputs) -{ - // This is a no-op in inference mode. - return {inputs[0]}; -} - -std::vector -CaffeOpCreator::convertELU(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const caffe::ELUParameter ¶ms = layer.elu_param(); - - auto elu = createOp(inputs[0], params.alpha()); - return {elu->getOutput(0)}; -} - -std::vector -CaffeOpCreator::convertEmbed(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.embed_param(); - auto data = createOp(convertBlob(layer.blobs(0))); - auto result = createOp(data->getOutput(0), inputs[0], 0)->getOutput(0); - - // Add the bias, if any. - if (params.bias_term()) - { - auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -std::vector -CaffeOpCreator::convertSigmoid(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - auto result = createOp(inputs[0]); - return {result->getOutput(0)}; -} - -std::vector -CaffeOpCreator::convertTanH(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - auto tanh = createOp(inputs[0]); - return {tanh->getOutput(0)}; -} - -std::vector -CaffeOpCreator::convertEltwise(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - auto ¶ms = layer.eltwise_param(); - - mir::Operation::Output *result; - switch (params.operation()) - { - case caffe::EltwiseParameter::PROD: - { - result = createOp(inputs[0], inputs[1])->getOutput(0); - for (int i = 2; i < layer.bottom_size(); ++i) - { - result = createOp(result, inputs[i])->getOutput(0); - } - break; - } - case caffe::EltwiseParameter::SUM: - { - std::vector scaled_inputs = inputs; - if (params.coeff_size() > 0) - { - assert(params.coeff_size() == layer.bottom_size()); - for (int i = 0; i < layer.bottom_size(); i++) - { - if (params.coeff(i) != 1.0f) - { - const float coeff_val = params.coeff(i); - TensorVariant coeff_tensor({DataType::FLOAT32, {}}, &coeff_val); - auto coeff_const = createOp(coeff_tensor)->getOutput(0); - scaled_inputs[i] = createOp(coeff_const, inputs[i])->getOutput(0); - } - } - } - result = createOp(scaled_inputs[0], scaled_inputs[1])->getOutput(0); - for (int i = 2; i < layer.bottom_size(); ++i) - { - result = createOp(result, scaled_inputs[i])->getOutput(0); - } - break; - } - case caffe::EltwiseParameter::MAX: - { - result = createOp(inputs[0], inputs[1])->getOutput(0); - for (int i = 2; i < layer.bottom_size(); ++i) - { - result = createOp(result, inputs[i])->getOutput(0); - } - break; - } - default: - throw std::runtime_error("Unknown element-wise operation."); - } - return {result}; -} - -std::vector -CaffeOpCreator::convertSplit(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - std::vector outputs(layer.top_size(), inputs.at(0)); - return outputs; -} - -void CaffeOpCreator::checkLSTM(const caffe::LayerParameter &layer, - std::set &problems_ops_set) -{ - const auto ¶ms = layer.recurrent_param(); - if (params.expose_hidden()) - problems_ops_set.insert("LSTM: parameter 'expose_hidden' has unsupported value: " + - std::to_string(params.expose_hidden())); -} - -static TensorVariant createZeroedTensor(const mir::Shape &shape) -{ - // TODO For now it is hardcoded float32. - auto elem_type = mir::DataType::FLOAT32; - std::vector zeros(static_cast(shape.numElements()), 0.0f); - return TensorVariant({elem_type, shape}, zeros.data()); -} - -/* See the following links for details on implementation: - * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/recurrent_layer.cpp - * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lstm_layer.cpp - * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lstm_unit_layer.cpp - * - * Inputs: - * x -- The time-varying input. Shape: [T, N, d0, d1, ..., dn]. - * cont -- The sequence continuation indicators. Shape: [T, N]. - * x_static -- The static (non-time-varying) input. Shape: [N, ...]. - * This parameter is optional and not currently supported. - * - * Additional inputs when parameter "expose_hidden" is true (not currently supported): - * h_0 -- The initial value of the hidden state. Shape: [1, N, D]. - * c_0 -- The initial value of the cell state. Shape: [1, N, D]. - * - * Learned parameters: - * xw -- x weights for input, output, forget and cell gates concatenated. - * Shape: [4 * D, d0 * d1 * ... * dn]. - * xb -- x biases for input, output, forget and cell gates concatenated. Shape: [4 * D]. - * hw -- h weights for input, output, forget and cell gates concatenated. Shape: [4 * D, D]. - * - * Outputs: - * h -- The time-varying output. Shape: [T, N, D]. - * - * Additional outputs when parameter "expose_hidden" is true (not currently supported): - * h_T -- The value of the hidden state at the last timestep. Shape: [1, N, D]. - * c_T -- The value of the cell state at the last timestep. Shape: [1, N, D]. - * - * Here: - * T - the number of timesteps, - * N - the number of independent streams. - * D - the number of hidden parameters. - * - * Formulas: - * c_cont = c[t-1] * cont[t] - * h_cont = h[t-1] * cont[t] - * i[t] = Sigmoid(x[t] . xw_i + xb_i + h_cont . hw_i) - * f[t] = Sigmoid(x[t] . xw_f + xb_f + h_cont . hw_f) - * o[t] = Sigmoid(x[t] . xw_o + xb_o + h_cont . hw_o) - * g[t] = Tanh(x[t] . xw_g + xb_g + h_cont . hw_g) - * c[t] = c_cont * f[t] + i[t] * g[t] - * h[t] = o[t] * Tanh(c[t]) - * - * Here: - * t -- the timestep (ranges from 1 to T), - * * -- the inner product, - * . -- the Hadamard product (elementwise product). - * - * In this implementation the inner products for all gates are performed as single inner product for - * efficiency. - */ -std::vector -CaffeOpCreator::convertLSTM(const caffe::LayerParameter &layer, - const std::vector &inputs) -{ - const auto ¶ms = layer.recurrent_param(); - - // Inputs to the layer. - auto x = inputs[0]; - auto cont = inputs[1]; - assert(inputs.size() == 2); - - const auto &x_shape = x->getShape(); - const int32_t seq_length = x_shape.dim(0); - const int32_t batch_size = x_shape.dim(1); - const int32_t hidden_size = params.num_output(); - - // Learned parameters of the layer. Tensors are transposed to match the ModelIR. - auto xw = createOp(convertBlob(layer.blobs(0)))->getOutput(0); - auto xb = createOp(convertBlob(layer.blobs(1)))->getOutput(0); - auto hw = createOp(convertBlob(layer.blobs(2)))->getOutput(0); - xw = createOp(xw, std::vector{1, 0})->getOutput(0); - hw = createOp(hw, std::vector{1, 0})->getOutput(0); - - // Add a dummy dimension so that element-wise operations perform properly. - cont = createOp(cont, Shape{seq_length, batch_size, 1})->getOutput(0); - - // Initialize cell and hidden states with zeros. - auto zero_tensor = createZeroedTensor(Shape{1, batch_size, hidden_size}); - auto c_t = createOp(zero_tensor)->getOutput(0); - auto h_t = createOp(zero_tensor)->getOutput(0); - - auto x_xw = createFullyConnected(x, xw, 2); - auto x_xw_b = createOp(x_xw, xb)->getOutput(0); - - // Split input and continuation tensors into seq_length slices. - std::vector x_xw_b_slices = createSplit(x_xw_b, seq_length, 0); - std::vector cont_slices = createSplit(cont, seq_length, 0); - std::vector h_slices(seq_length); - - for (int32_t t = 0; t < seq_length; t++) - { - auto c_cont_t = createOp(c_t, cont_slices[t])->getOutput(0); - auto h_cont_t = createOp(h_t, cont_slices[t])->getOutput(0); - - auto x_xw_b_t = x_xw_b_slices[t]; - auto h_hw_t = createFullyConnected(h_cont_t, hw, 2); - auto activation_inputs_concat = createOp(x_xw_b_t, h_hw_t)->getOutput(0); - auto activation_inputs = createSplit(activation_inputs_concat, 4, 2); - - auto i_t = createOp(activation_inputs[0])->getOutput(0); - auto f_t = createOp(activation_inputs[1])->getOutput(0); - auto o_t = createOp(activation_inputs[2])->getOutput(0); - auto g_t = createOp(activation_inputs[3])->getOutput(0); - - c_t = createOp(createOp(c_cont_t, f_t)->getOutput(0), - createOp(i_t, g_t)->getOutput(0)) - ->getOutput(0); - h_t = createOp(createOp(c_t)->getOutput(0), o_t)->getOutput(0); - - h_slices[t] = h_t; - } - - return {createOp(h_slices, 0)->getOutput(0)}; -} - -} // namespace mir_caffe diff --git a/compiler/mir-caffe-importer/requires.cmake b/compiler/mir-caffe-importer/requires.cmake deleted file mode 100644 index 1059c50..0000000 --- a/compiler/mir-caffe-importer/requires.cmake +++ /dev/null @@ -1 +0,0 @@ -require("mir") diff --git a/compiler/mir-caffe2-importer/CMakeLists.txt b/compiler/mir-caffe2-importer/CMakeLists.txt deleted file mode 100644 index da55839..0000000 --- a/compiler/mir-caffe2-importer/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -nnas_find_package(PytorchSource QUIET) -nnas_find_package(Protobuf QUIET) - -if (NOT PytorchSource_FOUND OR NOT Protobuf_FOUND) - return() -endif() - -Protobuf_Generate(CAFFE2_PROTO "${CMAKE_CURRENT_BINARY_DIR}/generated/caffe2" - "${PytorchSource_DIR}" "caffe2/proto/caffe2.proto") - -add_library(caffe2proto STATIC ${CAFFE2_PROTO_SOURCES}) -set_target_properties(caffe2proto PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(caffe2proto PUBLIC ${CAFFE2_PROTO_INCLUDE_DIRS}) -target_link_libraries(caffe2proto PUBLIC libprotobuf) - - -set(MIR_CAFFE2_IMPORTER_SOURCES - caffe2_importer.cpp - caffe2_importer.h - caffe2_op_creator.cpp - caffe2_op_creator.h - caffe2_op_types.h - caffe2_proto_helper.cpp - caffe2_proto_helper.h) - -add_library(mir_caffe2_importer STATIC ${MIR_CAFFE2_IMPORTER_SOURCES}) -set_target_properties(mir_caffe2_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(mir_caffe2_importer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(mir_caffe2_importer PUBLIC mir caffe2proto PRIVATE stdex) diff --git a/compiler/mir-caffe2-importer/caffe2_importer.cpp b/compiler/mir-caffe2-importer/caffe2_importer.cpp deleted file mode 100644 index 5a6eef0..0000000 --- a/compiler/mir-caffe2-importer/caffe2_importer.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "caffe2_importer.h" -#include "caffe2/proto/caffe2.pb.h" -#include "caffe2_op_types.h" -#include "caffe2_op_creator.h" -#include "caffe2_proto_helper.h" - -#include "mir/ops/InputOp.h" -#include "mir/ops/OutputOp.h" - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - -using namespace mir_caffe2; - -class Caffe2Importer -{ -public: - explicit Caffe2Importer(std::string predict_net, std::string init_net, - const std::vector> &input_shapes); - - /// @brief Load the model and convert it into a MIR Graph. - std::unique_ptr importModel(); - - ~Caffe2Importer(); - -private: - std::string _predictNet; - std::string _initNet; - std::unique_ptr _graph; - std::unique_ptr _predict_net; - std::unique_ptr _init_net; - std::unique_ptr _opCreator; - std::vector _inputShapes; - - static const std::map _operatorTypes; - - // Maps Caffe2 operator input names to corresponding MIR operation outputs. - std::unordered_map _blobNameToOutput; - - void import(); - std::unique_ptr createIR(); - - /** - * @brief Pass through caffe2 graph and collect ops unsupported by NNC - * @throw PassException with message, containing detected problems - */ - void collectUnsupportedOps(); - - /** - * @brief Creating MIR node from single caffe2 operator - */ - void createMIRNodesFromOp(const ::caffe2::OperatorDef &op); - - /** - * @brief Returns MIR operation outputs corresponding to the inputs of the given operator. - */ - std::vector getInputMIROps(const ::caffe2::OperatorDef &op); - - void setOutputForTensor(const std::string &tensor_name, Operation::Output *output); - mir::Operation::Output *getOutputForTensor(const std::string &name) const; - - /** - * @brief Mark output MIR nodes - */ - void setGraphOutputs(); -}; - -using namespace ::caffe2; -using mir::Shape; - -Caffe2Importer::Caffe2Importer(std::string predict_net, std::string init_net, - const std::vector> &input_shapes) - : _predictNet(std::move(predict_net)), _initNet(std::move(init_net)) -{ - for (auto &shape : input_shapes) - _inputShapes.emplace_back(shape); - - _graph = stdex::make_unique(); - _opCreator = stdex::make_unique(_graph.get()); -} - -Caffe2Importer::~Caffe2Importer() = default; - -static void loadModelFile(const std::string &filename, caffe2::NetDef *net) -{ - GOOGLE_PROTOBUF_VERIFY_VERSION; - - int file_handle = open(filename.c_str(), O_RDONLY); - - if (file_handle == -1) - throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + - "."); - - google::protobuf::io::FileInputStream file_stream(file_handle); - file_stream.SetCloseOnDelete(true); - - google::protobuf::io::CodedInputStream coded_stream(&file_stream); - coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); - - if (!net->ParseFromCodedStream(&coded_stream)) - throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); - - // If the file has not been consumed entirely, assume that the file is in the wrong format. - if (!coded_stream.ConsumedEntireMessage()) - throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); -} - -void Caffe2Importer::import() -{ - _predict_net = stdex::make_unique(); - loadModelFile(_predictNet, _predict_net.get()); - - _init_net = stdex::make_unique(); - loadModelFile(_initNet, _init_net.get()); - - collectUnsupportedOps(); -} - -std::unique_ptr Caffe2Importer::createIR() -{ - // Load initializers. - for (const auto &op : _init_net->op()) - createMIRNodesFromOp(op); - - // Create inputs. This has to be done after processing initializers, because they may contain - // fake inputs. - // TODO Caffe2 does not provide a way to detect model inputs and outputs. For now assume that: - // - there is exactly one input; - // - the input is for the first layer; - // - the input has 'float' element type. - const auto &input_name = _predict_net->op(0).input(0); - mir::TensorType input_type(mir::DataType::FLOAT32, _inputShapes[0]); - auto input = _graph->create(input_type)->getOutput(0); - setOutputForTensor(input_name, input); - - for (const auto &op : _predict_net->op()) - createMIRNodesFromOp(op); - - setGraphOutputs(); - - return std::move(_graph); -} - -std::unique_ptr Caffe2Importer::importModel() -{ - import(); - return createIR(); -} - -void Caffe2Importer::collectUnsupportedOps() -{ - std::set unsupportedOps; - for (const auto &op : _predict_net->op()) - { - if (_operatorTypes.find(op.type()) == _operatorTypes.end()) - unsupportedOps.insert(op.type()); - } - - if (!unsupportedOps.empty()) - { - std::string exceptionMsg("Can't load model, unsupported operators:"); - for (const auto &op : unsupportedOps) - exceptionMsg.append("\n * " + op); - throw std::runtime_error(exceptionMsg); - } -} - -void Caffe2Importer::createMIRNodesFromOp(const OperatorDef &op) -{ - std::vector outputs; - - auto inputs = getInputMIROps(op); - - SupportedCaffe2OpType opType = _operatorTypes.at(op.type()); - switch (opType) - { - case SupportedCaffe2OpType::constantFill: - case SupportedCaffe2OpType::givenTensorFill: - case SupportedCaffe2OpType::givenTensorInt64Fill: - outputs = _opCreator->convertConstant(inputs, op); - break; - case SupportedCaffe2OpType::add: - outputs = _opCreator->convertAdd(inputs, op); - break; - case SupportedCaffe2OpType::averagePool: - outputs = _opCreator->convertAveragePool(inputs, op); - break; - case SupportedCaffe2OpType::conv: - outputs = _opCreator->convertConv(inputs, op); - break; - case SupportedCaffe2OpType::concat: - outputs = _opCreator->convertConcat(inputs, op); - break; - case SupportedCaffe2OpType::dropout: - outputs = _opCreator->convertDropout(inputs, op); - break; - case SupportedCaffe2OpType::FC: - outputs = _opCreator->convertFC(inputs, op); - break; - case SupportedCaffe2OpType::maxPool: - outputs = _opCreator->convertMaxPool(inputs, op); - break; - case SupportedCaffe2OpType::mul: - outputs = _opCreator->convertMul(inputs, op); - break; - case SupportedCaffe2OpType::relu: - outputs = _opCreator->convertRelu(inputs); - break; - case SupportedCaffe2OpType::resizeNearest: - outputs = _opCreator->convertResizeNearest(inputs, op); - break; - case SupportedCaffe2OpType::sigmoid: - outputs = _opCreator->convertSigmoid(inputs); - break; - case SupportedCaffe2OpType::softmax: - outputs = _opCreator->convertSoftmax(inputs, op); - break; - case SupportedCaffe2OpType::spatialBN: - outputs = _opCreator->convertSpatialBN(inputs, op); - break; - case SupportedCaffe2OpType::sum: - outputs = _opCreator->convertSum(inputs); - break; - case SupportedCaffe2OpType::clip: - outputs = _opCreator->convertClip(inputs, op); - break; - case SupportedCaffe2OpType::reshape: - outputs = _opCreator->convertReshape(inputs, op); - break; - default: - assert(false && "All unsupported types should have been found before this pass."); - } - - for (size_t i = 0; i < outputs.size(); ++i) - { - setOutputForTensor(op.output(i), outputs[i]); - } -} - -std::vector Caffe2Importer::getInputMIROps(const OperatorDef &op) -{ - std::vector inputs; - - for (const auto &input_name : op.input()) - { - inputs.push_back(getOutputForTensor(input_name)); - } - - return inputs; -} - -void Caffe2Importer::setOutputForTensor(const std::string &tensor_name, Operation::Output *output) -{ - auto it = _blobNameToOutput.find(tensor_name); - if (it != _blobNameToOutput.cend()) - { - // caffe2 input blob name could be same as output blob name, and next line will overwrite - // '_blobNameToOpOutput' element, but in all networks that I saw it was not a problem - it->second->setName(""); - } - output->setName(tensor_name); - _blobNameToOutput[tensor_name] = output; -} - -mir::Operation::Output *Caffe2Importer::getOutputForTensor(const std::string &name) const -{ - return _blobNameToOutput.at(name); -} - -void Caffe2Importer::setGraphOutputs() -{ - // Create outputs. - // TODO Caffe2 does not provide a way to detect model inputs and outputs. For now assume that: - // - there is exactly one output; - // - the output is from the last layer. - const auto &output_name = _predict_net->op().rbegin()->output(0); - auto output = getOutputForTensor(output_name); - _graph->create(output); -} - -const std::map Caffe2Importer::_operatorTypes = { - {"Add", SupportedCaffe2OpType::add}, - {"AveragePool", SupportedCaffe2OpType::averagePool}, - {"Conv", SupportedCaffe2OpType::conv}, - {"Concat", SupportedCaffe2OpType::concat}, - {"ConstantFill", SupportedCaffe2OpType::constantFill}, - {"Dropout", SupportedCaffe2OpType::dropout}, - {"FC", SupportedCaffe2OpType::FC}, - {"GivenTensorFill", SupportedCaffe2OpType::givenTensorFill}, - {"MaxPool", SupportedCaffe2OpType::maxPool}, - {"Mul", SupportedCaffe2OpType::mul}, - {"Relu", SupportedCaffe2OpType::relu}, - {"ResizeNearest", SupportedCaffe2OpType::resizeNearest}, - {"Sigmoid", SupportedCaffe2OpType::sigmoid}, - {"Softmax", SupportedCaffe2OpType::softmax}, - {"SpatialBN", SupportedCaffe2OpType::spatialBN}, - {"Sum", SupportedCaffe2OpType::sum}, - {"Clip", SupportedCaffe2OpType::clip}, - {"Reshape", SupportedCaffe2OpType::reshape}, - {"GivenTensorInt64Fill", SupportedCaffe2OpType::givenTensorInt64Fill}, -}; -} - -namespace mir_caffe2 -{ - -std::unique_ptr loadModel(std::string predict_net, std::string init_net, - const std::vector> &input_shapes) -{ - Caffe2Importer importer(std::move(predict_net), std::move(init_net), input_shapes); - return importer.importModel(); -} - -} // namespace mir_caffe2 diff --git a/compiler/mir-caffe2-importer/caffe2_op_creator.cpp b/compiler/mir-caffe2-importer/caffe2_op_creator.cpp deleted file mode 100644 index d279fb1..0000000 --- a/compiler/mir-caffe2-importer/caffe2_op_creator.cpp +++ /dev/null @@ -1,547 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "caffe2_op_creator.h" -#include "caffe2_proto_helper.h" - -#include "mir/ops/AddOp.h" -#include "mir/ops/AvgPool2DOp.h" -#include "mir/ops/CappedReluOp.h" -#include "mir/ops/ConcatOp.h" -#include "mir/ops/ConstantOp.h" -#include "mir/ops/Conv2DOp.h" -#include "mir/ops/FullyConnectedOp.h" -#include "mir/ops/MaxPool2DOp.h" -#include "mir/ops/MulOp.h" -#include "mir/ops/ReluOp.h" -#include "mir/ops/ReshapeOp.h" -#include "mir/ops/ResizeOp.h" -#include "mir/ops/SigmoidOp.h" -#include "mir/ops/SoftmaxOp.h" -#include "mir/ops/TransposeOp.h" - -#include "mir/Index.h" -#include "mir/Shape.h" -#include "mir/ShapeRange.h" -#include "mir/Tensor.h" -#include "mir/TensorUtil.h" - -#include -#include - -namespace mir_caffe2 -{ - -using namespace ::caffe2; -using namespace mir; - -// -// Helper functions -// - -static std::pair, std::vector> -getPadding(const ::caffe2::OperatorDef &op) -{ - - if (hasArgument(op.arg(), "pads")) - { - // pads order: t l b r - auto pads_arg = findArgumentByName(op.arg(), "pads"); - - std::vector paddings; - for (const auto &pad : pads_arg.ints()) - paddings.push_back(static_cast(pad)); - - assert(paddings.size() == 4); - - int32_t pad_t = paddings[0]; - int32_t pad_l = paddings[1]; - int32_t pad_b = paddings[2]; - int32_t pad_r = paddings[3]; - - std::vector padding_before{pad_t, pad_l}; - std::vector padding_after{pad_b, pad_r}; - return {padding_before, padding_after}; - } - - bool has_custom_pad = hasArgument(op.arg(), "pad_l") || hasArgument(op.arg(), "pad_r") || - hasArgument(op.arg(), "pad_t") || hasArgument(op.arg(), "pad_b"); - - if (has_custom_pad) - { - int32_t pad_l = getSingleArgument(op, "pad_l", 0); - int32_t pad_t = getSingleArgument(op, "pad_t", 0); - int32_t pad_r = getSingleArgument(op, "pad_r", 0); - int32_t pad_b = getSingleArgument(op, "pad_b", 0); - - std::vector padding_before{pad_t, pad_l}; - std::vector padding_after{pad_b, pad_r}; - return {padding_before, padding_after}; - } - - int32_t pad = getSingleArgument(op, "pad", 0); - return {{pad, pad}, {pad, pad}}; -} - -static std::vector getStrides(const ::caffe2::OperatorDef &op) -{ - std::vector strides; - - if (hasArgument(op.arg(), "stride")) - { - std::int32_t stride = getSingleArgument(op, "stride", 1); - strides = {stride, stride}; - } - - if (hasArgument(op.arg(), "strides")) - { - // strides order: h w - auto strides_arg = findArgumentByName(op.arg(), "strides"); - for (const auto &s : strides_arg.ints()) - strides.push_back(s); - } - - assert(!strides.empty() && "Strides not found"); - - return strides; -} - -static std::vector getWindowSize(const ::caffe2::OperatorDef &op, - const std::vector &inputs) -{ - int is_global_pooling = getSingleArgument(op, "global_pooling", 0); - bool has_custom_kernel_size = - hasArgument(op.arg(), "kernel_h") || hasArgument(op.arg(), "kernel_w"); - bool has_custom_kernels_size = hasArgument(op.arg(), "kernels"); - - int kernel_h(0), kernel_w(0); - if (is_global_pooling) - { - const auto &input_shape = inputs[0]->getShape(); - assert(input_shape.rank() == 4 && "getWindowSize() inputs must be of rank 4"); - kernel_h = input_shape.dim(2); - kernel_w = input_shape.dim(3); - } - else - { - if (has_custom_kernel_size) - { - kernel_h = getSingleArgument(op, "kernel_h", 0); - kernel_w = getSingleArgument(op, "kernel_w", 0); - } - else - { - if (has_custom_kernels_size) - { - // kernels order: h w - std::vector kernels; - auto kernels_arg = findArgumentByName(op.arg(), "kernels"); - for (const auto &ker : kernels_arg.ints()) - kernels.push_back(static_cast(ker)); - assert(kernels.size() == 2); - kernel_h = kernels[0]; - kernel_w = kernels[1]; - } - else - { - kernel_h = kernel_w = getSingleArgument(op, "kernel", 0); - } - } - } - return {kernel_h, kernel_w}; -} - -// -// Check functions -// - -static void checkLayout(const OperatorDef &op) -{ - if (getSingleArgument(op, "order", "NCHW") != "NCHW") - throw std::runtime_error(op.type() + ": only 'NCHW' axis order is supported"); -} - -static void checkConvLikeOp(const ::caffe2::OperatorDef &op) -{ - checkLayout(op); - - // Padding - bool has_custom_pad = hasArgument(op.arg(), "pad_l") || hasArgument(op.arg(), "pad_r") || - hasArgument(op.arg(), "pad_t") || hasArgument(op.arg(), "pad_b"); - - if (has_custom_pad && hasArgument(op.arg(), "pad")) - throw std::runtime_error("Custom pad can't be combined with overall pad"); - - if (has_custom_pad && - !(hasArgument(op.arg(), "pad_l") && hasArgument(op.arg(), "pad_r") && - hasArgument(op.arg(), "pad_t") && hasArgument(op.arg(), "pad_b"))) - throw std::runtime_error("If one custom pad specified - all custom pads must be specified"); - - // Kernel size - bool has_custom_kernel_size = - hasArgument(op.arg(), "kernel_h") || hasArgument(op.arg(), "kernel_w"); - - if (has_custom_kernel_size && hasArgument(op.arg(), "kernel")) - throw std::runtime_error("Custom kernel size can't be combined with overall kernel size"); - - if (has_custom_kernel_size && - !(hasArgument(op.arg(), "kernel_h") && hasArgument(op.arg(), "kernel_w"))) - throw std::runtime_error( - "If one custom kernel size specified - all custom kernel sizes must be specified"); -} - -static mir::TensorVariant createTensor(const OperatorDef &op) -{ - assert(hasArgument(op.arg(), "shape") && hasArgument(op.arg(), "values")); - - const auto &shape = findArgumentByName(op.arg(), "shape"); - const auto &values = findArgumentByName(op.arg(), "values"); - - mir::DataType element_type; - const void *src_data; - // if values on floats - if (!values.floats().empty()) - { - element_type = mir::DataType::FLOAT32; - src_data = values.floats().data(); - } - else - { - assert(!values.ints().empty()); - if (op.type() == "GivenTensorInt64Fill") - { - element_type = mir::DataType::INT64; - } - else - { - element_type = mir::DataType::INT32; - } - src_data = values.ints().data(); - } - - mir::Shape tensor_shape(shape.ints_size()); - - for (int i = 0; i < shape.ints_size(); ++i) - { - tensor_shape.dim(i) = shape.ints(i); - } - - return mir::TensorVariant({element_type, tensor_shape}, src_data); -} - -// -// Convert functions -// - -std::vector -Caffe2OpCreator::convertConstant(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - // Constant may not contain any data if it is a fake input. - if (!hasArgument(op.arg(), "values")) - return {}; - - return {createOp(createTensor(op))->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertAdd(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - assert(inputs.size() == 2); - auto lhs = inputs[0]; - auto rhs = inputs[1]; - - if (getSingleArgument(op, "broadcast", 0) != 0) - { - // FIXME This only works when 'axis' == 1 and the second input is 1-D. - rhs = createOp(rhs, Shape{1, rhs->getShape().dim(0), 1, 1})->getOutput(0); - auto result = createOp(lhs, rhs)->getOutput(0); - return {result}; - } - - auto result = createOp(lhs, rhs)->getOutput(0); - return {result}; -} - -std::vector -Caffe2OpCreator::convertAveragePool(const std::vector &inputs, - const OperatorDef &op) -{ - checkConvLikeOp(op); - - assert(inputs.size() == 1); - auto input = inputs[0]; - - AvgPool2DOpAttributes attributes; - std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); - attributes.window = getWindowSize(op, inputs); - attributes.strides = getStrides(op); - attributes.include_pad = false; - attributes.data_format = DataFormat::NCHW; - auto result = createOp(input, attributes)->getOutput(0); - return {result}; -} - -std::vector -Caffe2OpCreator::convertConv(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - // dilation order: h w (not used) - mir::Conv2DOpAttributes attributes; - attributes.strides = getStrides(op); - std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); - attributes.num_groups = getSingleArgument(op, "group", 1); - attributes.data_format = DataFormat::NCHW; - - std::vector perm{0, 2, 3, 1}; // OIHW -> OHWI - auto kernel = createOp(inputs[1], perm)->getOutput(0); - auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); - - if (op.input_size() > 2) - { - auto bias = inputs[2]; - bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - - return {result}; -} - -std::vector -Caffe2OpCreator::convertConcat(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - checkLayout(op); - - // `1` corresponds to the default (channels) axis. - int axis = getSingleArgument(op, "axis", 1); - auto result = createOp(inputs, axis); - return {result->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertDropout(const std::vector &inputs, - const ::caffe2::OperatorDef &) -{ - // This is a no-op in inference mode. - return {inputs[0]}; -} - -std::vector -Caffe2OpCreator::convertFC(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - for (auto &s : {"axis", "axis_w", "float16_compute"}) - if (hasArgument(op.arg(), s)) - throw std::runtime_error(std::string("FC: only default '") + s + "' value is supported"); - - const auto &input_shape = inputs[0]->getShape(); - // Transform input into 2-D tensor by flattening axes - Shape shape{input_shape.dim(0), input_shape.numElements() / input_shape.dim(0)}; - - auto reshape = createOp(inputs[0], shape)->getOutput(0); - auto weights = - createOp(inputs[1], std::vector{1, 0})->getOutput(0); - auto result = createOp(reshape, weights)->getOutput(0); - result = createOp(result, inputs[2])->getOutput(0); - - return {result}; -} - -std::vector -Caffe2OpCreator::convertMaxPool(const std::vector &inputs, - const OperatorDef &op) -{ - checkConvLikeOp(op); - - assert(inputs.size() == 1); - auto input = inputs[0]; - - MaxPool2DOpAttributes attributes; - std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); - attributes.window = getWindowSize(op, inputs); - attributes.strides = getStrides(op); - attributes.data_format = DataFormat::NCHW; - auto result = createOp(input, attributes)->getOutput(0); - return {result}; -} - -std::vector -Caffe2OpCreator::convertMul(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - assert(inputs.size() == 2); - auto lhs = inputs[0]; - auto rhs = inputs[1]; - - if (getSingleArgument(op, "broadcast", 0) != 0) - { - // FIXME This only works when `axis` == 1 and the second input is 1-D. - rhs = createOp(rhs, Shape{1, rhs->getShape().dim(0), 1, 1})->getOutput(0); - auto result = createOp(lhs, rhs)->getOutput(0); - return {result}; - } - - auto result = createOp(lhs, rhs)->getOutput(0); - return {result}; -} - -std::vector -Caffe2OpCreator::convertRelu(const std::vector &inputs) -{ - auto relu = createOp(inputs[0]); - return {relu->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertResizeNearest(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - std::vector scales(4); - assert(inputs[0]->getShape().rank() == 4 && "only 4d tensors is supported"); - // Assuming NCHW format. - scales[0] = 1.0f; - scales[1] = 1.0f; - scales[2] = getSingleArgument(op, "height_scale", 1.0f); - scales[3] = getSingleArgument(op, "width_scale", 1.0f); - auto result = - createOp(inputs[0], ops::ResizeOp::ResizeMethod::nearestNeighbor, scales) - ->getOutput(0); - return {result}; -} - -std::vector -Caffe2OpCreator::convertSigmoid(const std::vector &inputs) -{ - auto result = createOp(inputs[0]); - return {result->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertSoftmax(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - int axis = getSingleArgument(op, "axis", 1); - auto softmax = createOp(inputs[0], axis); - return {softmax->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertSpatialBN(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - checkLayout(op); - - // Sanity checks - if (op.input_size() != 5) - throw std::runtime_error( - "SpatialBN must have exactly 5 inputs ('sums' and 'sumsq' are not supported yet)"); - if (getSingleArgument(op, "is_test", 1) != 1) - throw std::runtime_error("SpatialBN: only test mode supported"); - - // overall_res = (X - mean) / sqrt(var + epsilon) * scale + bias - - auto scale_op = dynamic_cast(inputs[1]->getNode()); - auto bias_op = dynamic_cast(inputs[2]->getNode()); - auto mean_op = dynamic_cast(inputs[3]->getNode()); - auto var_op = dynamic_cast(inputs[4]->getNode()); - if (scale_op == nullptr || bias_op == nullptr || mean_op == nullptr || var_op == nullptr) - throw std::runtime_error( - "SpatialBN: non-constant 'scale', 'bias', 'mean' and 'var' inputs are not supported yet."); - - const auto &scale_tensor = scale_op->getValue(); - const auto &bias_tensor = bias_op->getValue(); - const auto &mean_tensor = mean_op->getValue(); - const auto &var_tensor = var_op->getValue(); - float eps = getSingleArgument(op, "epsilon", 1e-5f); - - // res1 = X - mean - Tensor bias_data(mean_tensor); - for (auto &idx : ShapeRange(bias_data.getShape())) - bias_data.at(idx) *= -1; - - auto mean = createOp(mean_tensor)->getOutput(0); - mean = createOp(mean, Shape{1, mean->getShape().dim(0), 1, 1})->getOutput(0); - auto result = createOp(inputs[0], mean)->getOutput(0); - - // res2 = res1 * scale / (var + epsilon) - Tensor multiplier(scale_tensor); - for (auto &idx : ShapeRange(scale_tensor.getShape())) - multiplier.at(idx) /= std::sqrt(*reinterpret_cast(var_tensor.at(idx)) + eps); - auto scale = createOp(scale_tensor)->getOutput(0); - scale = createOp(scale, Shape{1, scale->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, scale)->getOutput(0); - - // overall_res = res2 + bias - auto bias = createOp(bias_tensor)->getOutput(0); - bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); - result = createOp(result, bias)->getOutput(0); - - return {result}; -} - -std::vector -Caffe2OpCreator::convertSum(const std::vector &inputs) -{ - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - for (int i = 2; i < static_cast(inputs.size()); ++i) - { - result = createOp(result, inputs[i])->getOutput(0); - } - return {result}; -} - -std::vector -Caffe2OpCreator::convertClip(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - - float max = getSingleArgument(op, "max", float(0)); - float min = getSingleArgument(op, "min", float(0)); - - assert(max > 0.0 && min == 0.0 && "Support only if clip is CappedRelu"); - auto cap_relu = createOp(inputs[0], max); - - return {cap_relu->getOutput(0)}; -} - -std::vector -Caffe2OpCreator::convertReshape(const std::vector &inputs, - const ::caffe2::OperatorDef &op) -{ - auto shape_op = dynamic_cast(inputs[1]->getNode()); - if (shape_op == nullptr) - throw std::runtime_error("Reshape: non-constant shape is not supported yet."); - - const auto &shape_tensor = shape_op->getValue(); - - Tensor out_shape_tensor(shape_tensor); - - ShapeRange range(out_shape_tensor.getShape()); - std::vector shape_vec; - for (const auto &index : range) - { - shape_vec.push_back(static_cast(out_shape_tensor.at(index))); - } - Shape out_shape(shape_vec); - - auto reshape = createOp(inputs[0], out_shape); - - return {reshape->getOutput(0)}; -} - -} // namespace mir_caffe2 diff --git a/compiler/mir-caffe2-importer/caffe2_proto_helper.cpp b/compiler/mir-caffe2-importer/caffe2_proto_helper.cpp deleted file mode 100644 index a7cde64..0000000 --- a/compiler/mir-caffe2-importer/caffe2_proto_helper.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "caffe2_proto_helper.h" - -namespace mir_caffe2 -{ - -const ::caffe2::Argument &findArgumentByName(RepArgument args, const std::string &name) -{ - for (auto &arg : args) - if (arg.name() == name) - return arg; - throw std::runtime_error("Can't find argument with name: " + name); -} - -const bool hasArgument(RepArgument args, const std::string &name) -{ - for (auto &arg : args) - if (arg.name() == name) - return true; - return false; -} - -int getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - const int default_value) -{ - if (hasArgument(op.arg(), argument_name)) - return static_cast(findArgumentByName(op.arg(), argument_name).i()); - return default_value; -} - -float getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - const float default_value) -{ - if (hasArgument(op.arg(), argument_name)) - return findArgumentByName(op.arg(), argument_name).f(); - return default_value; -} - -std::string getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - const std::string &default_value) -{ - if (hasArgument(op.arg(), argument_name)) - return findArgumentByName(op.arg(), argument_name).s(); - return default_value; -} - -} // namespace mir_caffe2 diff --git a/compiler/mir-caffe2-importer/caffe2_proto_helper.h b/compiler/mir-caffe2-importer/caffe2_proto_helper.h deleted file mode 100644 index 4c47ede..0000000 --- a/compiler/mir-caffe2-importer/caffe2_proto_helper.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef MIR_CAFFE2_PROTO_HELPER_H -#define MIR_CAFFE2_PROTO_HELPER_H - -#include "caffe2/proto/caffe2.pb.h" - -namespace mir_caffe2 -{ - -using RepArgument = const ::google::protobuf::RepeatedPtrField<::caffe2::Argument> &; - -const ::caffe2::Argument &findArgumentByName(RepArgument args, const std::string &name); - -const bool hasArgument(RepArgument args, const std::string &name); - -int getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - int default_value); -float getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - float default_value); -std::string getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, - const std::string &default_value); - -} // namespace mir_caffe2 - -#endif // MIR_CAFFE2_PROTO_HELPER_H diff --git a/compiler/mir-caffe2-importer/requires.cmake b/compiler/mir-caffe2-importer/requires.cmake deleted file mode 100644 index 1059c50..0000000 --- a/compiler/mir-caffe2-importer/requires.cmake +++ /dev/null @@ -1 +0,0 @@ -require("mir") diff --git a/compiler/mir-interpreter/README.md b/compiler/mir-interpreter/README.md new file mode 100644 index 0000000..4ed0c73 --- /dev/null +++ b/compiler/mir-interpreter/README.md @@ -0,0 +1 @@ +# mir-interpreter diff --git a/compiler/mir-onnx-importer/AttributeHelpers.h b/compiler/mir-onnx-importer/AttributeHelpers.h deleted file mode 100644 index d5cc150..0000000 --- a/compiler/mir-onnx-importer/AttributeHelpers.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef MIR_ONNX_ATTRIBUTE_HELPERS_H -#define MIR_ONNX_ATTRIBUTE_HELPERS_H - -#include "onnx/onnx.pb.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace mir_onnx -{ - -template T getAttributeValue(const onnx::AttributeProto &attribute) = delete; - -template <> inline float getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::FLOAT); - return attribute.f(); -} - -template <> inline std::int64_t getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::INT); - return attribute.i(); -} - -template <> inline std::string getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::STRING); - return attribute.s(); -} - -template <> inline onnx::TensorProto getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::TENSOR); - return attribute.t(); -} - -template <> -inline std::vector getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::INTS); - // TODO Check that values fit. - return {attribute.ints().cbegin(), attribute.ints().cend()}; -} - -template <> -inline std::vector getAttributeValue(const onnx::AttributeProto &attribute) -{ - assert(attribute.type() == onnx::AttributeProto::INTS); - return {attribute.ints().cbegin(), attribute.ints().cend()}; -} - -inline const onnx::AttributeProto *findAttribute(const onnx::NodeProto &node, - const std::string &name) -{ - const auto &attributes = node.attribute(); - const auto it = std::find_if( - attributes.cbegin(), attributes.cend(), - [&name](const onnx::AttributeProto &attribute) { return attribute.name() == name; }); - if (it == attributes.cend()) - return nullptr; - return &*it; -} - -template T getAttributeValue(const onnx::NodeProto &node, const std::string &name) -{ - const auto *attribute = findAttribute(node, name); - if (attribute == nullptr) - throw std::runtime_error("Cannot find attribute '" + name + "' in node '" + node.name() + "'."); - return getAttributeValue(*attribute); -} - -template -T getAttributeValue(const onnx::NodeProto &node, const std::string &name, T default_value) -{ - const auto *attribute = findAttribute(node, name); - if (attribute == nullptr) - return std::move(default_value); - return getAttributeValue(*attribute); -} - -} // namespace mir_onnx - -#endif // MIR_ONNX_ATTRIBUTE_HELPERS_H diff --git a/compiler/mir-onnx-importer/CMakeLists.txt b/compiler/mir-onnx-importer/CMakeLists.txt deleted file mode 100644 index 5f27bc0..0000000 --- a/compiler/mir-onnx-importer/CMakeLists.txt +++ /dev/null @@ -1,119 +0,0 @@ -nnas_find_package(ONNXSource EXACT 1.6.0 QUIET) -nnas_find_package(Protobuf QUIET) - -if (NOT ONNXSource_FOUND) - return() -endif () - -if (NOT Protobuf_FOUND) - return() -endif () - -Protobuf_Generate(MIR_ONNX_PROTO - ${CMAKE_CURRENT_BINARY_DIR}/generated - ${ONNXSource_DIR} - onnx/onnx.proto) - -add_library(mir_onnx_proto STATIC ${MIR_ONNX_PROTO_SOURCES}) -set_target_properties(mir_onnx_proto PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(mir_onnx_proto PUBLIC ${MIR_ONNX_PROTO_INCLUDE_DIRS}) -target_link_libraries(mir_onnx_proto PUBLIC libprotobuf) - -set(MIR_ONNX_IMPORTER_SOURCES - AttributeHelpers.h - ConvPoolHelpers.cpp - ConvPoolHelpers.h - ONNXHelpers.cpp - ONNXHelpers.h - ONNXImporterImpl.cpp - ONNXImporterImpl.h - ONNXNodeConverterRegistry.h - ONNXNodeConverterRegistry.cpp - ONNXOpRegistration.h - Op/Abs.cpp - Op/Abs.h - Op/Add.cpp - Op/Add.h - Op/AveragePool.cpp - Op/AveragePool.h - Op/BatchNormalization.cpp - Op/BatchNormalization.h - Op/Concat.cpp - Op/Concat.h - Op/Constant.cpp - Op/Constant.h - Op/Conv.cpp - Op/Conv.h - Op/ConvTranspose.cpp - Op/ConvTranspose.h - Op/Div.cpp - Op/Div.h - Op/Dropout.cpp - Op/Dropout.h - Op/Equal.cpp - Op/Equal.h - Op/Expand.cpp - Op/Expand.h - Op/Flatten.cpp - Op/Flatten.h - Op/Gather.cpp - Op/Gather.h - Op/Greater.cpp - Op/Greater.h - Op/Gemm.cpp - Op/Gemm.h - Op/Identity.cpp - Op/Identity.h - Op/Less.cpp - Op/Less.h - Op/MatMul.cpp - Op/MatMul.h - Op/GlobalAveragePool.cpp - Op/GlobalAveragePool.h - Op/Max.cpp - Op/Max.h - Op/MaxPool.cpp - Op/MaxPool.h - Op/Mul.cpp - Op/Mul.h - Op/Pad.cpp - Op/Pad.h - Op/Reciprocal.cpp - Op/Reciprocal.h - Op/ReduceMean.cpp - Op/ReduceMean.h - Op/Relu.cpp - Op/Relu.h - Op/Reshape.cpp - Op/Reshape.h - Op/Shape.cpp - Op/Shape.h - Op/Sigmoid.cpp - Op/Sigmoid.h - Op/Softmax.cpp - Op/Softmax.h - Op/Sqrt.cpp - Op/Sqrt.h - Op/Sub.cpp - Op/Sub.h - Op/Sum.cpp - Op/Sum.h - Op/Tanh.cpp - Op/Tanh.h - Op/Transpose.cpp - Op/Transpose.h - Op/Unsqueeze.cpp - Op/Unsqueeze.h - Op/Upsample.cpp - Op/Upsample.h) - -add_library(mir_onnx_importer STATIC ${MIR_ONNX_IMPORTER_SOURCES}) -set_target_properties(mir_onnx_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(mir_onnx_importer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(mir_onnx_importer PUBLIC mir_onnx_proto mir PRIVATE stdex mir_interpreter) - -nnas_find_package(GTest REQUIRED) - -file(GLOB_RECURSE TEST_SOURCES "*.test.cpp") -GTest_AddTest(mir_onnx_importer_test ${TEST_SOURCES}) -target_link_libraries(mir_onnx_importer_test mir_onnx_importer) diff --git a/compiler/mir-onnx-importer/ONNXImporterImpl.cpp b/compiler/mir-onnx-importer/ONNXImporterImpl.cpp deleted file mode 100644 index c331041..0000000 --- a/compiler/mir-onnx-importer/ONNXImporterImpl.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "ONNXImporterImpl.h" -#include "ONNXHelpers.h" -#include "ONNXOpRegistration.h" -#include "onnx/onnx.pb.h" - -#include "mir/Shape.h" -#include "mir/TensorUtil.h" - -#include "mir/ops/ConstantOp.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace mir_onnx -{ - -namespace -{ - -class ONNXImporterImpl final -{ -public: - ONNXImporterImpl(); - ~ONNXImporterImpl(); - /// @brief Load the model and convert it into a MIR Graph. - std::unique_ptr importModelFromBinaryFile(const std::string &filename); - std::unique_ptr importModelFromTextFile(const std::string &filename); - -private: - std::unique_ptr createIR(); - void createGraphInputs(); - void collectUnsupportedOps(); - std::unique_ptr _model; - std::unique_ptr _converterCtx; - std::unique_ptr _modelCtx; - std::unique_ptr _graph; -}; - -ONNXImporterImpl::ONNXImporterImpl() { registerSupportedOps(); } - -ONNXImporterImpl::~ONNXImporterImpl() = default; - -void loadModelFromBinaryFile(const std::string &filename, onnx::ModelProto *model) -{ - GOOGLE_PROTOBUF_VERIFY_VERSION; - - int file_handle = open(filename.c_str(), O_RDONLY); - - if (file_handle == -1) - throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + - "."); - - google::protobuf::io::FileInputStream file_stream(file_handle); - file_stream.SetCloseOnDelete(true); - - google::protobuf::io::CodedInputStream coded_stream(&file_stream); - coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); - - if (!model->ParseFromCodedStream(&coded_stream)) - throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); - - // If the file has not been consumed entirely, assume that the file is in the wrong format. - if (!coded_stream.ConsumedEntireMessage()) - throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); -} - -void loadModelFromTextFile(const std::string &filename, onnx::ModelProto *model) -{ - GOOGLE_PROTOBUF_VERIFY_VERSION; - - int file_handle = open(filename.c_str(), O_RDONLY); - - if (file_handle == -1) - throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + - "."); - - google::protobuf::io::FileInputStream file_stream(file_handle); - file_stream.SetCloseOnDelete(true); - - if (!google::protobuf::TextFormat::Parse(&file_stream, model)) - throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); -} - -std::unique_ptr ONNXImporterImpl::importModelFromBinaryFile(const std::string &filename) -{ - _model = stdex::make_unique(); - loadModelFromBinaryFile(filename, _model.get()); - _modelCtx = stdex::make_unique(_model.get()); - collectUnsupportedOps(); - return createIR(); -} - -std::unique_ptr ONNXImporterImpl::importModelFromTextFile(const std::string &filename) -{ - _model = stdex::make_unique(); - loadModelFromTextFile(filename, _model.get()); - _modelCtx = stdex::make_unique(_model.get()); - collectUnsupportedOps(); - return createIR(); -} - -void ONNXImporterImpl::collectUnsupportedOps() -{ - std::set> problems_op_set; - - for (int i = 0; i < _model->graph().node_size(); i++) - { - const auto &onnx_node = _model->graph().node(i); - assert(onnx_node.has_op_type()); - const auto &op_type = onnx_node.op_type(); - auto opset = _modelCtx->getDomainOpsetVersion(onnx_node.domain()); - - NodeConverterRegistry::ConverterFunc converter = - NodeConverterRegistry::getInstance().lookup(op_type, opset); - - if (converter == nullptr) - problems_op_set.emplace(op_type, opset); - } - if (!problems_op_set.empty()) - { - std::cerr << "The following operators are not supported:\n"; - for (const auto &op : problems_op_set) - std::cerr << op.first << " opset " << op.second << std::endl; - throw std::runtime_error("Unsupported operators found"); - } -} - -void ONNXImporterImpl::createGraphInputs() -{ - const auto &graph = _model->graph(); - const auto &initializer = graph.initializer(); - const auto &value_info = graph.value_info(); - - // Create all initializer Tensors - for (const auto &tensor : initializer) - { - const auto mir_tensor = createTensor(&tensor); - auto *op = _graph->create(mir_tensor); - _converterCtx->setOutput(tensor.name(), op->getOutput(0)); - } - - for (const auto &input : graph.input()) - { - assert(input.has_name()); - - if (_converterCtx->getOutput(input.name()) == nullptr) - { - const auto &onnx_input_shape = input.type().tensor_type().shape(); - mir::Shape shape(onnx_input_shape.dim_size()); - for (int i = 0; i < onnx_input_shape.dim_size(); i++) - { - assert(onnx_input_shape.dim(i).has_dim_value()); - shape.dim(i) = static_cast(onnx_input_shape.dim(i).dim_value()); - } - - auto elem_type = onnxDataTypeToMirDataType( - (onnx::TensorProto_DataType)input.type().tensor_type().elem_type()); - mir::TensorType type{elem_type, shape}; - auto *op = _graph->create(type); - _converterCtx->setOutput(input.name(), op->getOutput(0)); - } - } -} - -std::unique_ptr ONNXImporterImpl::createIR() -{ - _graph = stdex::make_unique(); - _converterCtx = stdex::make_unique(_graph.get()); - - createGraphInputs(); - - // Forming partially ordered computation graph - for (const auto &onnx_node : _model->graph().node()) - { - assert(onnx_node.has_op_type()); - auto &op_type = onnx_node.op_type(); - auto opset = _modelCtx->getDomainOpsetVersion(onnx_node.domain()); - // Get converter - NodeConverterRegistry::ConverterFunc converter = - NodeConverterRegistry::getInstance().lookup(op_type, opset); - assert(converter != nullptr); - converter(onnx_node, _converterCtx.get()); - } - // Set graph outputs - const auto &outputs = _model->graph().output(); - for (const auto &output : outputs) - { - assert(output.has_name()); - auto mir_output = _converterCtx->getOutput(output.name()); - if (mir_output == nullptr) - throw std::runtime_error("Bad output name!"); - - _graph->create(mir_output); - } - - return std::move(_graph); -} - -} // namespace - -std::unique_ptr importModelFromBinaryFile(const std::string &filename) -{ - ONNXImporterImpl importer; - return importer.importModelFromBinaryFile(filename); -} - -std::unique_ptr importModelFromTextFile(const std::string &filename) -{ - ONNXImporterImpl importer; - return importer.importModelFromTextFile(filename); -} - -std::unique_ptr loadModel(const std::string &filename) -{ - return importModelFromBinaryFile(filename); -} - -} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Pad.cpp b/compiler/mir-onnx-importer/Op/Pad.cpp deleted file mode 100644 index 504a32b..0000000 --- a/compiler/mir-onnx-importer/Op/Pad.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Pad.h" - -#include "ONNXHelpers.h" -#include "AttributeHelpers.h" - -#include "mir/ops/PadOp.h" - -namespace mir_onnx -{ - -void convertPadAttrName(const std::string &pad_attr_name, const onnx::NodeProto &onnx_node, - ConverterContext *context) -{ - std::vector inputs = context->getNodeInputs(onnx_node); - mir::Graph *graph = context->getGraph(); - - assert(inputs.size() == 1); - auto input = inputs[0]; - - // 0.0f is the default value to be filled into padded cells. - const auto value = getAttributeValue(onnx_node, "value", 0.0f); - const auto pads = getAttributeValue>(onnx_node, pad_attr_name); - // "constant" is the default mode. - const auto mode = getAttributeValue(onnx_node, "mode", "constant"); - if (mode != "constant") - throw std::runtime_error("Not supported Pad mode attribute!"); - - const int num_dims = input->getShape().rank(); - assert(pads.size() == num_dims * 2); - mir::PadOpAttributes attributes(num_dims); - for (int i = 0; i < num_dims; i++) - { - attributes.padding_before[i] = pads[i]; - attributes.padding_after[i] = pads[num_dims + i]; - } - - attributes.padding_value = value; - - auto result = createOp(graph, input, attributes)->getOutput(0); - - context->setNodeOutputs(onnx_node, {result}); -} - -void convertPadV1(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - convertPadAttrName("paddings", onnx_node, context); -} - -void convertPadV2(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - convertPadAttrName("pads", onnx_node, context); -} - -} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Transpose.cpp b/compiler/mir-onnx-importer/Op/Transpose.cpp deleted file mode 100644 index 82bb2f1..0000000 --- a/compiler/mir-onnx-importer/Op/Transpose.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Transpose.h" -#include "ONNXHelpers.h" -#include "AttributeHelpers.h" - -#include "mir/ops/TransposeOp.h" - -#include - -namespace mir_onnx -{ - -void convertTransposeV1(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - const auto inputs = context->getNodeInputs(onnx_node); - mir::Graph *graph = context->getGraph(); - - assert(inputs.size() == 1); - auto input = inputs[0]; - - const auto num_axes = input->getShape().rank(); - std::vector axis_order(num_axes); - const auto *perm_attr = findAttribute(onnx_node, "perm"); - - if (perm_attr == nullptr) - { - // Reverse the dimensions. - std::iota(axis_order.rbegin(), axis_order.rend(), 0); - } - else - { - const auto perm = getAttributeValue>(*perm_attr); - assert(perm.size() == num_axes); - std::copy(perm.cbegin(), perm.cend(), axis_order.begin()); - } - - auto result = createOp(graph, input, axis_order)->getOutput(0); - - context->setNodeOutputs(onnx_node, {result}); -} - -} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Upsample.cpp b/compiler/mir-onnx-importer/Op/Upsample.cpp deleted file mode 100644 index 49a5556..0000000 --- a/compiler/mir-onnx-importer/Op/Upsample.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Upsample.h" - -#include "ONNXHelpers.h" -#include "AttributeHelpers.h" - -#include "mir/Tensor.h" - -#include "mir/ops/ConstantOp.h" -#include "mir/ops/ResizeOp.h" - -namespace mir_onnx -{ - -void convertUpsampleV1(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - std::vector inputs = context->getNodeInputs(onnx_node); - mir::Graph *graph = context->getGraph(); - - // "nearest" is the default mode. - std::string mode = getAttributeValue(onnx_node, "mode", "nearest"); - assert(mode == "nearest" && "Unsupported upscale mode!"); - - const float h_scale = getAttributeValue(onnx_node, "height_scale", 0.0f); // required - const float w_scale = getAttributeValue(onnx_node, "width_scale", 0.0f); // required - if (h_scale < 1.0f || w_scale < 1.0f) - throw std::runtime_error("Wrong scale attributes!"); - - assert(inputs[0]->getShape().rank() == 4 && "Only rank 4 is supported"); - std::vector scales_vector(4); - // NCHW - scales_vector.at(0) = 1.0f; - scales_vector.at(1) = 1.0f; - scales_vector.at(2) = h_scale; - scales_vector.at(3) = w_scale; - - auto result = - createOp(graph, inputs[0], - mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) - ->getOutput(0); - - context->setNodeOutputs(onnx_node, {result}); -} - -void convertUpsampleV7(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - std::vector inputs = context->getNodeInputs(onnx_node); - mir::Graph *graph = context->getGraph(); - - // "nearest" is the default mode. - std::string mode = getAttributeValue(onnx_node, "mode", "nearest"); - assert(mode == "nearest" && "Unsupported upscale mode!"); - - const auto *scales_attr = findAttribute(onnx_node, "scales"); - if (!scales_attr) - throw std::runtime_error("Not enough required scales attribute!"); - - if (scales_attr->floats_size() != inputs[0]->getShape().rank()) - throw std::runtime_error( - "Number of elements of scales should be the same as the rank of input"); - - assert(inputs[0]->getShape().rank() == 4 && "Only rank 4 is supported"); - std::vector scales_vector(4); - // NCHW - scales_vector.at(0) = scales_attr->floats(0); - scales_vector.at(1) = scales_attr->floats(1); - scales_vector.at(2) = scales_attr->floats(2); - scales_vector.at(3) = scales_attr->floats(3); - - auto result = - createOp(graph, inputs[0], - mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) - ->getOutput(0); - - context->setNodeOutputs(onnx_node, {result}); -} - -void convertUpsampleV9(const onnx::NodeProto &onnx_node, ConverterContext *context) -{ - std::vector inputs = context->getNodeInputs(onnx_node); - mir::Graph *graph = context->getGraph(); - - // "nearest" is the default mode. - const auto mode = getAttributeValue(onnx_node, "mode", "nearest"); - assert(mode == "nearest" && "Unsupported upscale mode!"); - - // relies on attributes being lifted to constants (ONNX optimization pass) - assert(inputs.size() > 1); - auto *scales = dynamic_cast(inputs[1]->getNode()); - assert(scales && "Weights could be a constant tensor only"); - auto scales_tensor = mir::Tensor(scales->getValue()); - int rank = inputs[0]->getShape().rank(); - assert(scales_tensor.getShape().numElements() == rank && - "The number of elements of 'scales' should be the same as the rank of input 'X'"); - assert(rank == 4 && "Only rank 4 is supported"); - std::vector scales_vector(4); - assert(scales_tensor.getShape().rank() == 1 && "Scales are a 1d tensor"); - for (int i = 0; i < scales_tensor.getShape().numElements(); i++) - scales_vector[i] = scales_tensor.atOffset(i); - - auto result = - createOp(graph, inputs[0], - mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) - ->getOutput(0); - - context->setNodeOutputs(onnx_node, {result}); -} - -} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/requires.cmake b/compiler/mir-onnx-importer/requires.cmake deleted file mode 100644 index 52a7837..0000000 --- a/compiler/mir-onnx-importer/requires.cmake +++ /dev/null @@ -1,2 +0,0 @@ -require("mir") -require("mir-interpreter") diff --git a/compiler/mir-tflite-importer/CMakeLists.txt b/compiler/mir-tflite-importer/CMakeLists.txt deleted file mode 100644 index 4a06d51..0000000 --- a/compiler/mir-tflite-importer/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -nnas_find_package(FlatBuffers REQUIRED) - -if (NOT FlatBuffers_FOUND) - return() -endif () - -FlatBuffers_Target(mir_tflite_schema - OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/schema" - SCHEMA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/schema" - SCHEMA_FILES schema.fbs) - - -set(MIR_TFLITE_IMPORTER_SOURCES - tflite_importer.cpp - tflite_importer.h - tflite_op_creator.cpp - tflite_op_creator.h) - -add_library(mir_tflite_importer STATIC ${MIR_TFLITE_IMPORTER_SOURCES}) -set_target_properties(mir_tflite_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(mir_tflite_importer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(mir_tflite_importer PUBLIC mir mir_tflite_schema PRIVATE stdex) diff --git a/compiler/mir-tflite-importer/requires.cmake b/compiler/mir-tflite-importer/requires.cmake deleted file mode 100644 index 1059c50..0000000 --- a/compiler/mir-tflite-importer/requires.cmake +++ /dev/null @@ -1 +0,0 @@ -require("mir") diff --git a/compiler/mir-tflite-importer/tflite_importer.cpp b/compiler/mir-tflite-importer/tflite_importer.cpp deleted file mode 100644 index e3001d3..0000000 --- a/compiler/mir-tflite-importer/tflite_importer.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite_importer.h" -#include "tflite_op_creator.h" -#include "schema_generated.h" - -#include "mir/TensorVariant.h" -#include "mir/ops/ConstantOp.h" -#include "mir/ops/OutputOp.h" - -#include -#include -#include -#include -#include - -namespace mir_tflite -{ - -namespace -{ - -class TfliteImporter -{ -public: - explicit TfliteImporter(std::string filename); - - /// @brief Load the model and convert it into a MIR Graph. - std::unique_ptr importModel(); - - ~TfliteImporter(); - -private: - std::string _filename; - std::unique_ptr _model; - - std::unique_ptr _graph; - std::unique_ptr _opCreator; - - // Maps TFLite tensors indices to corresponding MIR operation outputs. - std::vector _tensorMap; - - void import(); - - void walkModel(const tflite::ModelT *model); - - void walkSubgraph(const tflite::SubGraphT *subgraph); - - void walkOperator(const tflite::SubGraphT *subgraph, const tflite::OperatorT *op); - - /** - * @brief Pass through tflite graph and collect operators unsupported by NNC - * @throw PassException with message, containing detected problems - */ - void collectUnsupportedOps(); - - /** - * @brief Returns MIR operation outputs corresponding to the inputs of the given operator. - */ - std::vector getMIRInputsForOperator(const tflite::SubGraphT *subgraph, - const tflite::OperatorT *op); -}; - -TfliteImporter::TfliteImporter(std::string filename) : _filename(std::move(filename)) -{ - _graph = stdex::make_unique(); - _opCreator = stdex::make_unique(_graph.get()); -} - -TfliteImporter::~TfliteImporter() = default; - -void TfliteImporter::import() -{ - std::ifstream stream(_filename, std::ios::in | std::ios::binary); - if (stream.fail()) - throw std::runtime_error("Couldn't open file \"" + _filename + "\"."); - - std::vector model_buffer((std::istreambuf_iterator(stream)), - std::istreambuf_iterator()); - - if (stream.fail()) - throw std::runtime_error("Couldn't read file \"" + _filename + "\"."); - - flatbuffers::Verifier verifier(reinterpret_cast(model_buffer.data()), - model_buffer.size()); - - if (!tflite::VerifyModelBuffer(verifier)) - throw std::runtime_error("Could not load model: " + _filename + "\n"); - - _model = tflite::UnPackModel(model_buffer.data()); -} - -static const std::set supportedOperators = { - tflite::BuiltinOperator_ADD, - tflite::BuiltinOperator_AVERAGE_POOL_2D, - tflite::BuiltinOperator_CONCATENATION, - tflite::BuiltinOperator_CONV_2D, - tflite::BuiltinOperator_DEPTHWISE_CONV_2D, - tflite::BuiltinOperator_DIV, - tflite::BuiltinOperator_FULLY_CONNECTED, - tflite::BuiltinOperator_HARD_SWISH, - tflite::BuiltinOperator_LEAKY_RELU, - tflite::BuiltinOperator_LOGISTIC, - tflite::BuiltinOperator_MAX_POOL_2D, - tflite::BuiltinOperator_MAXIMUM, - tflite::BuiltinOperator_MEAN, - tflite::BuiltinOperator_MUL, - tflite::BuiltinOperator_PAD, - tflite::BuiltinOperator_RELU, - tflite::BuiltinOperator_RELU6, - tflite::BuiltinOperator_RESHAPE, - tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, - tflite::BuiltinOperator_RSQRT, - tflite::BuiltinOperator_SHAPE, - tflite::BuiltinOperator_SLICE, - tflite::BuiltinOperator_SOFTMAX, - tflite::BuiltinOperator_SQRT, - tflite::BuiltinOperator_SQUARED_DIFFERENCE, - tflite::BuiltinOperator_SQUEEZE, - tflite::BuiltinOperator_STRIDED_SLICE, - tflite::BuiltinOperator_SUB, - tflite::BuiltinOperator_TANH, - tflite::BuiltinOperator_TRANSPOSE, - tflite::BuiltinOperator_TRANSPOSE_CONV, -}; - -void TfliteImporter::collectUnsupportedOps() -{ - std::set errors; - for (const auto &subgraph : _model->subgraphs) - for (const auto &op : subgraph->operators) - { - tflite::BuiltinOperator opcode = _model->operator_codes[op->opcode_index]->builtin_code; - if (supportedOperators.find(opcode) == supportedOperators.end()) - { - if (opcode <= tflite::BuiltinOperator_MAX) - errors.insert(std::string(EnumNameBuiltinOperator(opcode)) + ": unsupported operator"); - else - errors.insert(std::to_string(opcode) + ": unsuppored in tflite custom opcode"); - } - } - - if (!errors.empty()) - { - std::string msg("NNC can't load model. Detected problems:"); - for (const auto &e : errors) - msg.append("\n * " + e); - throw std::runtime_error(msg); - } -} - -std::unique_ptr TfliteImporter::importModel() -{ - import(); - collectUnsupportedOps(); - walkModel(_model.get()); - return std::move(_graph); -} - -void TfliteImporter::walkModel(const tflite::ModelT *model) -{ - for (const auto &subgraph : model->subgraphs) - walkSubgraph(subgraph.get()); -} - -mir::DataType convertElementType(tflite::TensorType type) -{ - switch (type) - { - case tflite::TensorType_INT32: - return mir::DataType::INT32; - case tflite::TensorType_FLOAT32: - return mir::DataType::FLOAT32; - case tflite::TensorType_INT64: - return mir::DataType::INT64; - case tflite::TensorType_UINT8: - return mir::DataType::UINT8; - default: - throw std::runtime_error(std::string("Unsupported tensor type: ") + EnumNameTensorType(type)); - } -} - -mir::TensorType getMirTensorType(const tflite::TensorT &tensor) -{ - mir::DataType element_type = convertElementType(tensor.type); - - mir::Shape shape(tensor.shape.size()); - for (std::size_t i = 0; i < tensor.shape.size(); ++i) - { - shape.dim(i) = tensor.shape[i]; - } - - if (tensor.quantization != nullptr) - { - const tflite::QuantizationParametersT ¶ms = *tensor.quantization; - - if (params.details.type != tflite::QuantizationDetails_NONE) - throw std::runtime_error("Custom quantization is not supported."); - - // Empty parameters mean no quantization at all. - if (params.scale.empty() && params.zero_point.empty()) - return mir::TensorType{element_type, shape}; - - if (params.scale.size() != 1 || params.zero_point.size() != 1) - throw std::runtime_error("Non-scalar quantization is not supported."); - - mir::AffineQuantization quantization{params.scale[0], static_cast(params.zero_point[0])}; - - return mir::TensorType{element_type, shape, quantization}; - } - else - { - return mir::TensorType{element_type, shape}; - } -} - -void TfliteImporter::walkSubgraph(const tflite::SubGraphT *subgraph) -{ - _tensorMap.assign(subgraph->tensors.size(), nullptr); - - for (const auto input_tensor_index : subgraph->inputs) - { - const tflite::TensorT &tensor = *subgraph->tensors[input_tensor_index]; - - mir::TensorType input_type = getMirTensorType(tensor); - auto input = _graph->create(input_type)->getOutput(0); - input->setName(tensor.name); - - assert(_tensorMap[input_tensor_index] == nullptr); - _tensorMap[input_tensor_index] = input; - } - - for (const auto &op : subgraph->operators) - { - walkOperator(subgraph, op.get()); - } - - for (const auto output_tensor_index : subgraph->outputs) - { - auto output = _tensorMap[output_tensor_index]; - _graph->create(output); - } -} - -void TfliteImporter::walkOperator(const tflite::SubGraphT *subgraph, const tflite::OperatorT *op) -{ - std::vector inputs = getMIRInputsForOperator(subgraph, op); - std::vector outputs; - - tflite::BuiltinOperator opcode = _model->operator_codes[op->opcode_index]->builtin_code; - switch (opcode) - { - case tflite::BuiltinOperator_CONV_2D: - outputs = _opCreator->convertConv2D(op->builtin_options.AsConv2DOptions(), inputs); - break; - case tflite::BuiltinOperator_DEPTHWISE_CONV_2D: - outputs = _opCreator->convertDepthwiseConv2D(op->builtin_options.AsDepthwiseConv2DOptions(), - inputs); - break; - case tflite::BuiltinOperator_MAX_POOL_2D: - outputs = _opCreator->convertMaxPool2D(op->builtin_options.AsPool2DOptions(), inputs); - break; - case tflite::BuiltinOperator_AVERAGE_POOL_2D: - outputs = _opCreator->convertAveragePool2D(op->builtin_options.AsPool2DOptions(), inputs); - break; - case tflite::BuiltinOperator_CONCATENATION: - outputs = - _opCreator->convertConcatenation(op->builtin_options.AsConcatenationOptions(), inputs); - break; - case tflite::BuiltinOperator_RESHAPE: - outputs = _opCreator->convertReshape(op->builtin_options.AsReshapeOptions(), inputs); - break; - case tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR: - outputs = _opCreator->convertResizeNearestNeighbor( - op->builtin_options.AsResizeNearestNeighborOptions(), inputs); - break; - case tflite::BuiltinOperator_MEAN: - outputs = _opCreator->convertMean(op->builtin_options.AsReducerOptions(), inputs); - break; - case tflite::BuiltinOperator_FULLY_CONNECTED: - outputs = - _opCreator->convertFullyConnected(op->builtin_options.AsFullyConnectedOptions(), inputs); - break; - case tflite::BuiltinOperator_SOFTMAX: - outputs = _opCreator->convertSoftmax(op->builtin_options.AsSoftmaxOptions(), inputs); - break; - case tflite::BuiltinOperator_SLICE: - outputs = _opCreator->convertSlice(op->builtin_options.AsSliceOptions(), inputs); - break; - case tflite::BuiltinOperator_SQUEEZE: - outputs = _opCreator->convertSqueeze(op->builtin_options.AsSqueezeOptions(), inputs); - break; - case tflite::BuiltinOperator_LOGISTIC: - outputs = _opCreator->convertLogistic(inputs); - break; - case tflite::BuiltinOperator_RSQRT: - outputs = _opCreator->convertRsqrt(inputs); - break; - case tflite::BuiltinOperator_SQRT: - outputs = _opCreator->convertSqrt(inputs); - break; - case tflite::BuiltinOperator_ADD: - outputs = _opCreator->convertAdd(op->builtin_options.AsAddOptions(), inputs); - break; - case tflite::BuiltinOperator_SUB: - outputs = _opCreator->convertSub(op->builtin_options.AsSubOptions(), inputs); - break; - case tflite::BuiltinOperator_MUL: - outputs = _opCreator->convertMul(op->builtin_options.AsMulOptions(), inputs); - break; - case tflite::BuiltinOperator_DIV: - outputs = _opCreator->convertDiv(op->builtin_options.AsDivOptions(), inputs); - break; - case tflite::BuiltinOperator_MAXIMUM: - outputs = _opCreator->convertMax(inputs); - break; - case tflite::BuiltinOperator_SQUARED_DIFFERENCE: - outputs = _opCreator->convertSquaredDifference(inputs); - break; - case tflite::BuiltinOperator_TRANSPOSE_CONV: - outputs = - _opCreator->convertTransposeConv(op->builtin_options.AsTransposeConvOptions(), inputs); - break; - case tflite::BuiltinOperator_PAD: - outputs = _opCreator->convertPad(op->builtin_options.AsPadOptions(), inputs); - break; - case tflite::BuiltinOperator_TANH: - outputs = _opCreator->convertTanh(inputs); - break; - case tflite::BuiltinOperator_RELU: - outputs = _opCreator->convertReLU(inputs); - break; - case tflite::BuiltinOperator_RELU6: - outputs = _opCreator->convertReLU6(inputs); - break; - case tflite::BuiltinOperator_TRANSPOSE: - outputs = _opCreator->convertTranspose(op->builtin_options.AsTransposeOptions(), inputs); - break; - case tflite::BuiltinOperator_STRIDED_SLICE: - outputs = - _opCreator->convertStridedSlice(op->builtin_options.AsStridedSliceOptions(), inputs); - break; - case tflite::BuiltinOperator_LEAKY_RELU: - outputs = _opCreator->convertLeakyReLU(op->builtin_options.AsLeakyReluOptions(), inputs); - break; - case tflite::BuiltinOperator_SHAPE: - outputs = _opCreator->convertShape(op->builtin_options.AsShapeOptions(), inputs); - break; - case tflite::BuiltinOperator_HARD_SWISH: - outputs = _opCreator->convertHardSwish(op->builtin_options.AsHardSwishOptions(), inputs); - break; - default: - assert(false && "All unsupported types should have been found before this pass."); - } - - assert(outputs.size() == op->outputs.size()); - for (std::size_t i = 0; i < op->outputs.size(); ++i) - { - const auto tensor_index = op->outputs[i]; - const tflite::TensorT &tensor = *subgraph->tensors[tensor_index]; - - mir::TensorType output_type = getMirTensorType(tensor); - - // The type should have been inferred correctly, except for quantization information. - assert(outputs[i]->getType().getElementType() == output_type.getElementType() && - outputs[i]->getType().getShape() == output_type.getShape()); - - outputs[i]->setName(tensor.name); - outputs[i]->setType(output_type); - - assert(_tensorMap[tensor_index] == nullptr); - _tensorMap[tensor_index] = outputs[i]; - } -} - -std::vector -TfliteImporter::getMIRInputsForOperator(const tflite::SubGraphT *subgraph, - const tflite::OperatorT *op) -{ - std::vector inputs; - - for (const auto tensor_index : op->inputs) - { - const tflite::TensorT &tensor = *subgraph->tensors[tensor_index]; - const tflite::BufferT &buffer = *_model->buffers[tensor.buffer]; - if (!buffer.data.empty()) - { - assert(_tensorMap[tensor_index] == nullptr); - mir::TensorType type = getMirTensorType(tensor); - mir::TensorVariant mir_tensor{type, buffer.data.data()}; - inputs.emplace_back(_graph->create(mir_tensor)->getOutput(0)); - } - else - { - assert(_tensorMap[tensor_index] != nullptr); - // By this point every input for the operation "op" should have corresponding - // Model IR operations that output its inputs. This assumption is provided by the fact - // that TFLite format specifies all operations in the execution order. - inputs.emplace_back(_tensorMap[tensor_index]); - } - } - - return inputs; -} - -} // namespace - -std::unique_ptr loadModel(std::string filename) -{ - TfliteImporter importer(std::move(filename)); - return importer.importModel(); -} - -} // namespace mir_tflite diff --git a/compiler/mir-tflite-importer/tflite_op_creator.cpp b/compiler/mir-tflite-importer/tflite_op_creator.cpp deleted file mode 100644 index 5f4279f..0000000 --- a/compiler/mir-tflite-importer/tflite_op_creator.cpp +++ /dev/null @@ -1,649 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "tflite_op_creator.h" -#include "schema_generated.h" - -#include "mir/ops/AddOp.h" -#include "mir/ops/AvgPool2DOp.h" -#include "mir/ops/CappedReluOp.h" -#include "mir/ops/ConcatOp.h" -#include "mir/ops/ConstantOp.h" -#include "mir/ops/Conv2DOp.h" -#include "mir/ops/Deconv2DOp.h" -#include "mir/ops/DepthwiseConv2DOp.h" -#include "mir/ops/DivOp.h" -#include "mir/ops/FullyConnectedOp.h" -#include "mir/ops/HardSwishOp.h" -#include "mir/ops/LeakyReluOp.h" -#include "mir/ops/MaxOp.h" -#include "mir/ops/MaxPool2DOp.h" -#include "mir/ops/MulOp.h" -#include "mir/ops/PadOp.h" -#include "mir/ops/ReduceMeanOp.h" -#include "mir/ops/ReluOp.h" -#include "mir/ops/ReshapeOp.h" -#include "mir/ops/ResizeOp.h" -#include "mir/ops/SigmoidOp.h" -#include "mir/ops/SliceOp.h" -#include "mir/ops/SoftmaxOp.h" -#include "mir/ops/SqrtOp.h" -#include "mir/ops/SqueezeOp.h" -#include "mir/ops/SubOp.h" -#include "mir/ops/TanhOp.h" -#include "mir/ops/TransposeOp.h" - -#include "mir/Shape.h" -#include "mir/ShapeRange.h" -#include "mir/Tensor.h" - -namespace mir_tflite -{ - -namespace ops = mir::ops; -using mir::Shape; - -static mir::ops::PaddingType convertPadding(tflite::Padding padding) -{ - switch (padding) - { - case tflite::Padding_VALID: - return mir::ops::PaddingType::Valid; - case tflite::Padding_SAME: - return mir::ops::PaddingType::SameUpper; - default: - assert(false); - } -} - -// TODO Move this to MIR? -static void calculatePadding(mir::ops::PaddingType padding_type, const mir::Shape &input_shape, - const std::vector &window_size, - const std::vector &strides, - std::vector &padding_before, - std::vector &padding_after) -{ - constexpr int num_spatial_dims = 2; - assert(window_size.size() == num_spatial_dims); - assert(strides.size() == num_spatial_dims); - assert(padding_before.size() == num_spatial_dims); - assert(padding_after.size() == num_spatial_dims); - - switch (padding_type) - { - case mir::ops::PaddingType::SameUpper: - for (int i = 0; i < num_spatial_dims; ++i) - { - // Assuming NHWC format. - const std::int32_t total_padding = - (input_shape.dim(1 + i) % strides[i] == 0) - ? std::max(0, window_size[i] - strides[i]) - : std::max(0, window_size[i] - input_shape.dim(1 + i) % strides[i]); - padding_before[i] = total_padding / 2; - padding_after[i] = total_padding - padding_before[i]; - } - break; - case mir::ops::PaddingType::Valid: - for (int i = 0; i < num_spatial_dims; ++i) - { - padding_before[i] = 0; - padding_after[i] = 0; - } - break; - default: - assert(false); - } -} - -template -static std::vector convertIntTensorToVector(const mir::Tensor &tensor) -{ - std::vector v; - for (const auto &i : mir::ShapeRange(tensor.getShape())) - v.emplace_back(static_cast(tensor.at(i))); - return v; -} - -static const mir::TensorVariant &extractTensor(const mir::Operation::Output *output) -{ - auto constant_op = dynamic_cast(output->getNode()); - if (constant_op == nullptr) - throw std::runtime_error("Non-constant input is not supported."); - return constant_op->getValue(); -} - -std::vector -TFLiteOpCreator::convertConv2D(const tflite::Conv2DOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - auto kernel = inputs.at(1); - auto bias = inputs.at(2); - - mir::Conv2DOpAttributes attributes; - attributes.strides = {opts->stride_h, opts->stride_w}; - - const auto padding_type = convertPadding(opts->padding); - const auto &input_shape = input->getShape(); - const auto &kernel_shape = kernel->getShape(); - const auto &strides = attributes.strides; - auto &pad_before = attributes.padding_before; - auto &pad_after = attributes.padding_after; - std::vector kernel_size{kernel_shape.dim(1), kernel_shape.dim(2)}; - calculatePadding(padding_type, input_shape, kernel_size, strides, pad_before, pad_after); - - mir::Operation::Output *result; - if (input->getType().isQuantized()) - { - result = createOp(input, kernel, bias, attributes)->getOutput(0); - } - else // TODO Fuse bias to other backends - { - result = createOp(input, kernel, attributes)->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertDepthwiseConv2D(const tflite::DepthwiseConv2DOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - auto kernel = inputs.at(1); - auto bias = inputs.at(2); - - // OHWI -> HWIO - const std::vector axis_order{1, 2, 3, 0}; - kernel = createOp(kernel, axis_order)->getOutput(0); - - mir::Conv2DOpAttributes attributes; - attributes.strides = {opts->stride_h, opts->stride_w}; - - const auto padding_type = convertPadding(opts->padding); - const auto &input_shape = input->getShape(); - const auto &kernel_shape = kernel->getShape(); - std::vector kernel_size{kernel_shape.dim(0), kernel_shape.dim(1)}; - const auto &strides = attributes.strides; - auto &pad_before = attributes.padding_before; - auto &pad_after = attributes.padding_after; - calculatePadding(padding_type, input_shape, kernel_size, strides, pad_before, pad_after); - - mir::Operation::Output *result; - if (input->getType().isQuantized()) - { - result = createOp(input, kernel, bias, attributes)->getOutput(0); - } - else // TODO Fuse bias to other backends - { - result = createOp(input, kernel, attributes)->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertConcatenation(const tflite::ConcatenationOptionsT *opts, - const std::vector &inputs) -{ - auto result = createOp(inputs, opts->axis); - return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertMaxPool2D(const tflite::Pool2DOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - const auto &input_shape = input->getShape(); - - mir::MaxPool2DOpAttributes attributes; - attributes.window = {opts->filter_height, opts->filter_width}; - attributes.strides = {opts->stride_h, opts->stride_w}; - - const auto padding_type = convertPadding(opts->padding); - const auto &window_size = attributes.window; - const auto &strides = attributes.strides; - auto &pad_before = attributes.padding_before; - auto &pad_after = attributes.padding_after; - calculatePadding(padding_type, input_shape, window_size, strides, pad_before, pad_after); - - auto result = createOp(input, attributes); - return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertAveragePool2D(const tflite::Pool2DOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - const auto &input_shape = input->getShape(); - - mir::AvgPool2DOpAttributes attributes; - attributes.window = {opts->filter_height, opts->filter_width}; - attributes.strides = {opts->stride_h, opts->stride_w}; - attributes.include_pad = false; - - const auto padding_type = convertPadding(opts->padding); - const auto &window_size = attributes.window; - const auto &strides = attributes.strides; - auto &pad_before = attributes.padding_before; - auto &pad_after = attributes.padding_after; - calculatePadding(padding_type, input_shape, window_size, strides, pad_before, pad_after); - - auto result = createOp(input, attributes); - return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertSoftmax(const tflite::SoftmaxOptionsT * /*opts*/, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - // Softmax in TFLite is always 2-D. - assert(input->getShape().rank() == 2); - const int32_t axis = 1; - auto result = createOp(input, axis); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertSlice(const tflite::SliceOptionsT * /*opts*/, - const std::vector &inputs) -{ - auto input = inputs.at(0); - mir::Tensor begin_tensor(extractTensor(inputs.at(1))); - mir::Tensor size_tensor(extractTensor(inputs.at(2))); - - Shape starts(convertIntTensorToVector(begin_tensor)); - Shape sizes(convertIntTensorToVector(size_tensor)); - auto result = createOp(input, starts, sizes); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertReshape(const tflite::ReshapeOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - // TODO: we should also support "-1" values in new_shape, which means that correct - // shape values must be calculated. Better do it in the shape inference module. - Shape new_shape(opts->new_shape.size()); - for (int i = 0; i < opts->new_shape.size(); ++i) - { - new_shape.dim(i) = opts->new_shape[i]; - } - auto result = createOp(input, new_shape); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertTransposeConv(const tflite::TransposeConvOptionsT *opts, - const std::vector &inputs) -{ - mir::Tensor output_shape_tensor(extractTensor(inputs.at(0))); - auto kernel = inputs.at(1); - auto input = inputs.at(2); - - mir::Deconv2DOpAttributes attributes; - attributes.strides = {opts->stride_h, opts->stride_w}; - Shape output_shape(convertIntTensorToVector(output_shape_tensor)); - - // OHWI -> HWOI - const std::vector axis_order{1, 2, 0, 3}; - kernel = createOp(kernel, axis_order)->getOutput(0); - - attributes.padding_type = convertPadding(opts->padding); - auto result = createOp(input, kernel, attributes, output_shape)->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertResizeNearestNeighbor(const tflite::ResizeNearestNeighborOptionsT *opts, - const std::vector &inputs) -{ - if (opts->align_corners) - throw std::runtime_error("'align_corners' is not currently supported"); - - auto input = inputs.at(0); - mir::Tensor size_tensor(extractTensor(inputs.at(1))); - - const auto &input_shape = input->getShape(); - Shape res_shape{input_shape.dim(0), size_tensor.at(mir::Index{0}), size_tensor.at(mir::Index{1}), - input_shape.dim(3)}; - auto result = - createOp(input, ops::ResizeOp::ResizeMethod::nearestNeighbor, res_shape); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertAdd(const tflite::AddOptionsT *opts, - const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertSub(const tflite::SubOptionsT *opts, - const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertMul(const tflite::MulOptionsT *opts, - const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertDiv(const tflite::DivOptionsT *opts, - const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -std::vector -TFLiteOpCreator::convertMax(const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertSquaredDifference(const std::vector &inputs) -{ - assert(inputs.size() == 2); - auto result = createOp(inputs[0], inputs[1])->getOutput(0); - result = createOp(result, result)->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertMean(const tflite::ReducerOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - mir::Tensor axes_tensor(extractTensor(inputs.at(1))); - - std::vector axes = convertIntTensorToVector(axes_tensor); - auto result = createOp(input, axes, opts->keep_dims); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertFullyConnected(const tflite::FullyConnectedOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - auto weights = inputs.at(1); - auto bias = inputs.at(2); - - // Flatten input to 2-D shape. - const auto &input_shape = input->getShape(); - int32_t outer_size = input_shape.dim(0); - int32_t inner_size = input_shape.numElements() / outer_size; - auto flatten = createOp(input, Shape{outer_size, inner_size})->getOutput(0); - - // Transpose the weights. - const std::vector axis_order{1, 0}; - weights = createOp(weights, axis_order)->getOutput(0); - - mir::Operation::Output *result; - if (input->getType().isQuantized()) - { - result = createOp(flatten, weights, bias)->getOutput(0); - } - else // TODO Fuse bias to other backends - { - result = createOp(flatten, weights)->getOutput(0); - result = createOp(result, bias)->getOutput(0); - } - return {addFusedActivation(result, opts->fused_activation_function)}; -} - -mir::Operation::Output * -TFLiteOpCreator::addFusedActivation(mir::Operation::Output *input, - tflite::ActivationFunctionType activation_type) -{ - switch (activation_type) - { - case tflite::ActivationFunctionType_NONE: - return input; - case tflite::ActivationFunctionType_RELU: - return createOp(input)->getOutput(0); - case tflite::ActivationFunctionType_RELU6: - return createOp(input, 6)->getOutput(0); - case tflite::ActivationFunctionType_TANH: - return createOp(input)->getOutput(0); - default: - throw std::runtime_error(std::string("Unsupported activation type: ") + - tflite::EnumNameActivationFunctionType(activation_type)); - } -} - -std::vector -TFLiteOpCreator::convertSqueeze(const tflite::SqueezeOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - std::vector squeeze_dims(opts->squeeze_dims.begin(), opts->squeeze_dims.end()); - auto result = createOp(input, squeeze_dims); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertPad(const tflite::PadOptionsT * /*opts*/, - const std::vector &inputs) -{ - auto input = inputs.at(0); - mir::Tensor paddings_tensor(extractTensor(inputs.at(1))); - - const auto &input_shape = input->getShape(); - const int num_dims = input_shape.rank(); - - mir::PadOpAttributes attributes(num_dims); - for (int i = 0; i < num_dims; i++) - { - attributes.padding_before[i] = paddings_tensor.at(mir::Index({i, 0})); - attributes.padding_after[i] = paddings_tensor.at(mir::Index({i, 1})); - } - - auto result = createOp(input, attributes)->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertTanh(const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertReLU(const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertReLU6(const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input, 6); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertRsqrt(const std::vector &inputs) -{ - auto input = inputs.at(0); - - const float one_value = 1.0f; - mir::TensorVariant one_tensor({mir::DataType::FLOAT32, {}}, &one_value); - auto one = createOp(one_tensor)->getOutput(0); - auto sqrt = createOp(input)->getOutput(0); - auto result = createOp(one, sqrt)->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertSqrt(const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input)->getOutput(0); - return {result}; -} - -std::vector -TFLiteOpCreator::convertLogistic(const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertTranspose(const tflite::TransposeOptionsT * /*opts*/, - const std::vector &inputs) -{ - auto input = inputs.at(0); - mir::Tensor perm_tensor(extractTensor(inputs.at(1))); - - std::vector axis_order = convertIntTensorToVector(perm_tensor); - auto result = createOp(input, axis_order); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertStridedSlice(const tflite::StridedSliceOptionsT *opts, - const std::vector &inputs) -{ - if (opts->ellipsis_mask != 0) - throw std::runtime_error("StridedSlice: parameter 'ellipsis_mask' is not supported."); - - if (opts->new_axis_mask != 0) - throw std::runtime_error("StridedSlice: parameter 'new_axis_mask' is not supported."); - - auto input = inputs.at(0); - mir::Tensor begin_tensor(extractTensor(inputs.at(1))); - mir::Tensor end_tensor(extractTensor(inputs.at(2))); - mir::Tensor strides_tensor(extractTensor(inputs.at(3))); - - std::vector begin = convertIntTensorToVector(begin_tensor); - std::vector end = convertIntTensorToVector(end_tensor); - std::vector strides = convertIntTensorToVector(strides_tensor); - - int32_t begin_mask = opts->begin_mask; - int32_t end_mask = opts->end_mask; - int32_t shrink_axis_mask = opts->shrink_axis_mask; - - const auto &input_shape = input->getShape(); - int32_t num_dims = input_shape.rank(); - - for (int32_t stride : strides) - { - if (stride != 1) - throw std::runtime_error("StridedSlice: parameter 'strides' is not supported"); - } - - Shape start(num_dims); - Shape size(num_dims); - std::vector squeeze_dims; - for (int axis = 0; axis < num_dims; axis++) - { - if (static_cast(begin_mask) & (1u << static_cast(axis))) - start.dim(axis) = 0; - else - start.dim(axis) = begin.at(static_cast(axis)); - - if (static_cast(end_mask) & (1u << static_cast(axis))) - size.dim(axis) = input_shape.dim(axis) - start.dim(axis); - else - size.dim(axis) = end.at(static_cast(axis)) - start.dim(axis); - - if (static_cast(shrink_axis_mask) & (1u << static_cast(axis))) - squeeze_dims.push_back(axis); - } - - auto result = createOp(input, start, size); - result = createOp(result->getOutput(0), squeeze_dims); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertLeakyReLU(const tflite::LeakyReluOptionsT *opts, - const std::vector &inputs) -{ - auto input = inputs.at(0); - - auto result = createOp(input, opts->alpha); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertShape(const tflite::ShapeOptionsT *opts, - const std::vector &inputs) -{ - if (opts->out_type != tflite::TensorType_INT32) - { - throw std::runtime_error(std::string("SHAPE: Unsupported tensor type: ") + - EnumNameTensorType(opts->out_type)); - } - - const auto &input_shape = inputs[0]->getShape(); - int32_t rank = input_shape.rank(); - std::vector data; - data.reserve(static_cast(rank)); - for (int32_t i = 0; i < rank; i++) - data.emplace_back(input_shape.dim(i)); - mir::TensorVariant tensor({mir::DataType::INT32, {rank}}, data.data()); - auto result = createOp(tensor); - return {result->getOutput(0)}; -} - -std::vector -TFLiteOpCreator::convertHardSwish(const tflite::HardSwishOptionsT *opts, - const std::vector &inputs) -{ - auto result = createOp(inputs[0])->getOutput(0); - return {result}; -} - -} // namespace mir_tflite diff --git a/compiler/mir/CMakeLists.txt b/compiler/mir/CMakeLists.txt index ecb1de2..4c89893 100644 --- a/compiler/mir/CMakeLists.txt +++ b/compiler/mir/CMakeLists.txt @@ -36,3 +36,8 @@ set_target_properties(mir PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(mir PROPERTIES LINKER_LANGUAGE CXX) add_subdirectory(unittests) + +add_subdirectory(src/mir_caffe_importer) +add_subdirectory(src/mir_caffe2_importer) +add_subdirectory(src/mir_tflite_importer) +add_subdirectory(src/mir_onnx_importer) diff --git a/compiler/mir-caffe2-importer/caffe2_importer.h b/compiler/mir/include/mir_caffe2_importer/caffe2_importer.h similarity index 100% rename from compiler/mir-caffe2-importer/caffe2_importer.h rename to compiler/mir/include/mir_caffe2_importer/caffe2_importer.h diff --git a/compiler/mir-caffe-importer/caffe_importer.h b/compiler/mir/include/mir_caffe_importer/caffe_importer.h similarity index 100% rename from compiler/mir-caffe-importer/caffe_importer.h rename to compiler/mir/include/mir_caffe_importer/caffe_importer.h diff --git a/compiler/mir-onnx-importer/ONNXImporterImpl.h b/compiler/mir/include/mir_onnx_importer/ONNXImporterImpl.h similarity index 100% rename from compiler/mir-onnx-importer/ONNXImporterImpl.h rename to compiler/mir/include/mir_onnx_importer/ONNXImporterImpl.h diff --git a/compiler/mir-tflite-importer/tflite_importer.h b/compiler/mir/include/mir_tflite_importer/tflite_importer.h similarity index 100% rename from compiler/mir-tflite-importer/tflite_importer.h rename to compiler/mir/include/mir_tflite_importer/tflite_importer.h diff --git a/compiler/mir/src/mir_caffe2_importer/CMakeLists.txt b/compiler/mir/src/mir_caffe2_importer/CMakeLists.txt new file mode 100644 index 0000000..a553781 --- /dev/null +++ b/compiler/mir/src/mir_caffe2_importer/CMakeLists.txt @@ -0,0 +1,28 @@ +nnas_find_package(PytorchSource QUIET) +nnas_find_package(Protobuf QUIET) + +if (NOT PytorchSource_FOUND OR NOT Protobuf_FOUND) + return() +endif() + +Protobuf_Generate(CAFFE2_PROTO "${CMAKE_CURRENT_BINARY_DIR}/generated/caffe2" + "${PytorchSource_DIR}" "caffe2/proto/caffe2.proto") + +add_library(caffe2proto STATIC ${CAFFE2_PROTO_SOURCES}) +set_target_properties(caffe2proto PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(caffe2proto PUBLIC ${CAFFE2_PROTO_INCLUDE_DIRS}) +target_link_libraries(caffe2proto PUBLIC libprotobuf) + + +set(MIR_CAFFE2_IMPORTER_SOURCES + caffe2_importer.cpp + caffe2_op_creator.cpp + caffe2_op_creator.h + caffe2_op_types.h + caffe2_proto_helper.cpp + caffe2_proto_helper.h) + +add_library(mir_caffe2_importer STATIC ${MIR_CAFFE2_IMPORTER_SOURCES}) +set_target_properties(mir_caffe2_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(mir_caffe2_importer PUBLIC ../../include/mir_caffe2_importer) +target_link_libraries(mir_caffe2_importer PUBLIC mir PRIVATE caffe2proto nncc_common) diff --git a/compiler/mir/src/mir_caffe2_importer/caffe2_importer.cpp b/compiler/mir/src/mir_caffe2_importer/caffe2_importer.cpp new file mode 100644 index 0000000..812fcc5 --- /dev/null +++ b/compiler/mir/src/mir_caffe2_importer/caffe2_importer.cpp @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "caffe2_importer.h" +#include "caffe2/proto/caffe2.pb.h" +#include "caffe2_op_types.h" +#include "caffe2_op_creator.h" +#include "caffe2_proto_helper.h" + +#include "mir/ops/InputOp.h" +#include "mir/ops/OutputOp.h" + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + +using namespace mir_caffe2; + +class Caffe2Importer +{ +public: + explicit Caffe2Importer(std::string predict_net, std::string init_net, + const std::vector> &input_shapes); + + /// @brief Load the model and convert it into a MIR Graph. + std::unique_ptr importModel(); + + ~Caffe2Importer(); + +private: + std::string _predictNet; + std::string _initNet; + std::unique_ptr _graph; + std::unique_ptr _predict_net; + std::unique_ptr _init_net; + std::unique_ptr _opCreator; + std::vector _inputShapes; + + static const std::map _operatorTypes; + + // Maps Caffe2 operator input names to corresponding MIR operation outputs. + std::unordered_map _blobNameToOutput; + + void import(); + std::unique_ptr createIR(); + + /** + * @brief Pass through caffe2 graph and collect ops unsupported by NNC + * @throw PassException with message, containing detected problems + */ + void collectUnsupportedOps(); + + /** + * @brief Creating MIR node from single caffe2 operator + */ + void createMIRNodesFromOp(const ::caffe2::OperatorDef &op); + + /** + * @brief Returns MIR operation outputs corresponding to the inputs of the given operator. + */ + std::vector getInputMIROps(const ::caffe2::OperatorDef &op); + + void setOutputForTensor(const std::string &tensor_name, Operation::Output *output); + mir::Operation::Output *getOutputForTensor(const std::string &name) const; + + /** + * @brief Mark output MIR nodes + */ + void setGraphOutputs(); +}; + +using namespace ::caffe2; +using mir::Shape; + +Caffe2Importer::Caffe2Importer(std::string predict_net, std::string init_net, + const std::vector> &input_shapes) + : _predictNet(std::move(predict_net)), _initNet(std::move(init_net)) +{ + for (auto &shape : input_shapes) + _inputShapes.emplace_back(shape); + + _graph = std::make_unique(); + _opCreator = std::make_unique(_graph.get()); +} + +Caffe2Importer::~Caffe2Importer() = default; + +static void loadModelFile(const std::string &filename, caffe2::NetDef *net) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; + + int file_handle = open(filename.c_str(), O_RDONLY); + + if (file_handle == -1) + throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + + "."); + + google::protobuf::io::FileInputStream file_stream(file_handle); + file_stream.SetCloseOnDelete(true); + + google::protobuf::io::CodedInputStream coded_stream(&file_stream); + coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); + + if (!net->ParseFromCodedStream(&coded_stream)) + throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); + + // If the file has not been consumed entirely, assume that the file is in the wrong format. + if (!coded_stream.ConsumedEntireMessage()) + throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); +} + +void Caffe2Importer::import() +{ + _predict_net = std::make_unique(); + loadModelFile(_predictNet, _predict_net.get()); + + _init_net = std::make_unique(); + loadModelFile(_initNet, _init_net.get()); + + collectUnsupportedOps(); +} + +std::unique_ptr Caffe2Importer::createIR() +{ + // Load initializers. + for (const auto &op : _init_net->op()) + createMIRNodesFromOp(op); + + // Create inputs. This has to be done after processing initializers, because they may contain + // fake inputs. + // TODO Caffe2 does not provide a way to detect model inputs and outputs. For now assume that: + // - there is exactly one input; + // - the input is for the first layer; + // - the input has 'float' element type. + const auto &input_name = _predict_net->op(0).input(0); + mir::TensorType input_type(mir::DataType::FLOAT32, _inputShapes[0]); + auto input = _graph->create(input_type)->getOutput(0); + setOutputForTensor(input_name, input); + + for (const auto &op : _predict_net->op()) + createMIRNodesFromOp(op); + + setGraphOutputs(); + + return std::move(_graph); +} + +std::unique_ptr Caffe2Importer::importModel() +{ + import(); + return createIR(); +} + +void Caffe2Importer::collectUnsupportedOps() +{ + std::set unsupportedOps; + for (const auto &op : _predict_net->op()) + { + if (_operatorTypes.find(op.type()) == _operatorTypes.end()) + unsupportedOps.insert(op.type()); + } + + if (!unsupportedOps.empty()) + { + std::string exceptionMsg("Can't load model, unsupported operators:"); + for (const auto &op : unsupportedOps) + exceptionMsg.append("\n * " + op); + throw std::runtime_error(exceptionMsg); + } +} + +void Caffe2Importer::createMIRNodesFromOp(const OperatorDef &op) +{ + std::vector outputs; + + auto inputs = getInputMIROps(op); + + SupportedCaffe2OpType opType = _operatorTypes.at(op.type()); + switch (opType) + { + case SupportedCaffe2OpType::constantFill: + case SupportedCaffe2OpType::givenTensorFill: + case SupportedCaffe2OpType::givenTensorInt64Fill: + outputs = _opCreator->convertConstant(inputs, op); + break; + case SupportedCaffe2OpType::add: + outputs = _opCreator->convertAdd(inputs, op); + break; + case SupportedCaffe2OpType::averagePool: + outputs = _opCreator->convertAveragePool(inputs, op); + break; + case SupportedCaffe2OpType::conv: + outputs = _opCreator->convertConv(inputs, op); + break; + case SupportedCaffe2OpType::concat: + outputs = _opCreator->convertConcat(inputs, op); + break; + case SupportedCaffe2OpType::dropout: + outputs = _opCreator->convertDropout(inputs, op); + break; + case SupportedCaffe2OpType::FC: + outputs = _opCreator->convertFC(inputs, op); + break; + case SupportedCaffe2OpType::maxPool: + outputs = _opCreator->convertMaxPool(inputs, op); + break; + case SupportedCaffe2OpType::mul: + outputs = _opCreator->convertMul(inputs, op); + break; + case SupportedCaffe2OpType::relu: + outputs = _opCreator->convertRelu(inputs); + break; + case SupportedCaffe2OpType::resizeNearest: + outputs = _opCreator->convertResizeNearest(inputs, op); + break; + case SupportedCaffe2OpType::sigmoid: + outputs = _opCreator->convertSigmoid(inputs); + break; + case SupportedCaffe2OpType::softmax: + outputs = _opCreator->convertSoftmax(inputs, op); + break; + case SupportedCaffe2OpType::spatialBN: + outputs = _opCreator->convertSpatialBN(inputs, op); + break; + case SupportedCaffe2OpType::sum: + outputs = _opCreator->convertSum(inputs); + break; + case SupportedCaffe2OpType::clip: + outputs = _opCreator->convertClip(inputs, op); + break; + case SupportedCaffe2OpType::reshape: + outputs = _opCreator->convertReshape(inputs, op); + break; + default: + assert(false && "All unsupported types should have been found before this pass."); + } + + for (size_t i = 0; i < outputs.size(); ++i) + { + setOutputForTensor(op.output(i), outputs[i]); + } +} + +std::vector Caffe2Importer::getInputMIROps(const OperatorDef &op) +{ + std::vector inputs; + + for (const auto &input_name : op.input()) + { + inputs.push_back(getOutputForTensor(input_name)); + } + + return inputs; +} + +void Caffe2Importer::setOutputForTensor(const std::string &tensor_name, Operation::Output *output) +{ + auto it = _blobNameToOutput.find(tensor_name); + if (it != _blobNameToOutput.cend()) + { + // caffe2 input blob name could be same as output blob name, and next line will overwrite + // '_blobNameToOpOutput' element, but in all networks that I saw it was not a problem + it->second->setName(""); + } + output->setName(tensor_name); + _blobNameToOutput[tensor_name] = output; +} + +mir::Operation::Output *Caffe2Importer::getOutputForTensor(const std::string &name) const +{ + return _blobNameToOutput.at(name); +} + +void Caffe2Importer::setGraphOutputs() +{ + // Create outputs. + // TODO Caffe2 does not provide a way to detect model inputs and outputs. For now assume that: + // - there is exactly one output; + // - the output is from the last layer. + const auto &output_name = _predict_net->op().rbegin()->output(0); + auto output = getOutputForTensor(output_name); + _graph->create(output); +} + +const std::map Caffe2Importer::_operatorTypes = { + {"Add", SupportedCaffe2OpType::add}, + {"AveragePool", SupportedCaffe2OpType::averagePool}, + {"Conv", SupportedCaffe2OpType::conv}, + {"Concat", SupportedCaffe2OpType::concat}, + {"ConstantFill", SupportedCaffe2OpType::constantFill}, + {"Dropout", SupportedCaffe2OpType::dropout}, + {"FC", SupportedCaffe2OpType::FC}, + {"GivenTensorFill", SupportedCaffe2OpType::givenTensorFill}, + {"MaxPool", SupportedCaffe2OpType::maxPool}, + {"Mul", SupportedCaffe2OpType::mul}, + {"Relu", SupportedCaffe2OpType::relu}, + {"ResizeNearest", SupportedCaffe2OpType::resizeNearest}, + {"Sigmoid", SupportedCaffe2OpType::sigmoid}, + {"Softmax", SupportedCaffe2OpType::softmax}, + {"SpatialBN", SupportedCaffe2OpType::spatialBN}, + {"Sum", SupportedCaffe2OpType::sum}, + {"Clip", SupportedCaffe2OpType::clip}, + {"Reshape", SupportedCaffe2OpType::reshape}, + {"GivenTensorInt64Fill", SupportedCaffe2OpType::givenTensorInt64Fill}, +}; +} + +namespace mir_caffe2 +{ + +std::unique_ptr loadModel(std::string predict_net, std::string init_net, + const std::vector> &input_shapes) +{ + Caffe2Importer importer(std::move(predict_net), std::move(init_net), input_shapes); + return importer.importModel(); +} + +} // namespace mir_caffe2 diff --git a/compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.cpp b/compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.cpp new file mode 100644 index 0000000..3390f44 --- /dev/null +++ b/compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.cpp @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "caffe2_op_creator.h" +#include "caffe2_proto_helper.h" + +#include "mir/ops/AddOp.h" +#include "mir/ops/AvgPool2DOp.h" +#include "mir/ops/CappedReluOp.h" +#include "mir/ops/ConcatOp.h" +#include "mir/ops/ConstantOp.h" +#include "mir/ops/Conv2DOp.h" +#include "mir/ops/FullyConnectedOp.h" +#include "mir/ops/MaxPool2DOp.h" +#include "mir/ops/MulOp.h" +#include "mir/ops/ReluOp.h" +#include "mir/ops/ReshapeOp.h" +#include "mir/ops/ResizeOp.h" +#include "mir/ops/SigmoidOp.h" +#include "mir/ops/SoftmaxOp.h" +#include "mir/ops/TransposeOp.h" + +#include "mir/Index.h" +#include "mir/Shape.h" +#include "mir/ShapeRange.h" +#include "mir/Tensor.h" +#include "mir/TensorUtil.h" + +#include +#include +#include + +namespace mir_caffe2 +{ + +using namespace ::caffe2; +using namespace mir; + +// +// Helper functions +// + +static std::pair, std::vector> +getPadding(const ::caffe2::OperatorDef &op) +{ + + if (hasArgument(op.arg(), "pads")) + { + // pads order: t l b r + auto pads_arg = findArgumentByName(op.arg(), "pads"); + + std::vector paddings; + for (const auto &pad : pads_arg.ints()) + paddings.push_back(static_cast(pad)); + + assert(paddings.size() == 4); + + int32_t pad_t = paddings[0]; + int32_t pad_l = paddings[1]; + int32_t pad_b = paddings[2]; + int32_t pad_r = paddings[3]; + + std::vector padding_before{pad_t, pad_l}; + std::vector padding_after{pad_b, pad_r}; + return {padding_before, padding_after}; + } + + bool has_custom_pad = hasArgument(op.arg(), "pad_l") || hasArgument(op.arg(), "pad_r") || + hasArgument(op.arg(), "pad_t") || hasArgument(op.arg(), "pad_b"); + + if (has_custom_pad) + { + int32_t pad_l = getSingleArgument(op, "pad_l", 0); + int32_t pad_t = getSingleArgument(op, "pad_t", 0); + int32_t pad_r = getSingleArgument(op, "pad_r", 0); + int32_t pad_b = getSingleArgument(op, "pad_b", 0); + + std::vector padding_before{pad_t, pad_l}; + std::vector padding_after{pad_b, pad_r}; + return {padding_before, padding_after}; + } + + int32_t pad = getSingleArgument(op, "pad", 0); + return {{pad, pad}, {pad, pad}}; +} + +static std::vector getStrides(const ::caffe2::OperatorDef &op) +{ + std::vector strides; + + if (hasArgument(op.arg(), "stride")) + { + std::int32_t stride = getSingleArgument(op, "stride", 1); + strides = {stride, stride}; + } + + if (hasArgument(op.arg(), "strides")) + { + // strides order: h w + auto strides_arg = findArgumentByName(op.arg(), "strides"); + for (const auto &s : strides_arg.ints()) + strides.push_back(s); + } + + assert(!strides.empty() && "Strides not found"); + + return strides; +} + +static std::vector getWindowSize(const ::caffe2::OperatorDef &op, + const std::vector &inputs) +{ + int is_global_pooling = getSingleArgument(op, "global_pooling", 0); + bool has_custom_kernel_size = + hasArgument(op.arg(), "kernel_h") || hasArgument(op.arg(), "kernel_w"); + bool has_custom_kernels_size = hasArgument(op.arg(), "kernels"); + + int kernel_h(0), kernel_w(0); + if (is_global_pooling) + { + const auto &input_shape = inputs[0]->getShape(); + assert(input_shape.rank() == 4 && "getWindowSize() inputs must be of rank 4"); + kernel_h = input_shape.dim(2); + kernel_w = input_shape.dim(3); + } + else + { + if (has_custom_kernel_size) + { + kernel_h = getSingleArgument(op, "kernel_h", 0); + kernel_w = getSingleArgument(op, "kernel_w", 0); + } + else + { + if (has_custom_kernels_size) + { + // kernels order: h w + std::vector kernels; + auto kernels_arg = findArgumentByName(op.arg(), "kernels"); + for (const auto &ker : kernels_arg.ints()) + kernels.push_back(static_cast(ker)); + assert(kernels.size() == 2); + kernel_h = kernels[0]; + kernel_w = kernels[1]; + } + else + { + kernel_h = kernel_w = getSingleArgument(op, "kernel", 0); + } + } + } + return {kernel_h, kernel_w}; +} + +// +// Check functions +// + +static void checkLayout(const OperatorDef &op) +{ + if (getSingleArgument(op, "order", "NCHW") != "NCHW") + throw std::runtime_error(op.type() + ": only 'NCHW' axis order is supported"); +} + +static void checkConvLikeOp(const ::caffe2::OperatorDef &op) +{ + checkLayout(op); + + // Padding + bool has_custom_pad = hasArgument(op.arg(), "pad_l") || hasArgument(op.arg(), "pad_r") || + hasArgument(op.arg(), "pad_t") || hasArgument(op.arg(), "pad_b"); + + if (has_custom_pad && hasArgument(op.arg(), "pad")) + throw std::runtime_error("Custom pad can't be combined with overall pad"); + + if (has_custom_pad && + !(hasArgument(op.arg(), "pad_l") && hasArgument(op.arg(), "pad_r") && + hasArgument(op.arg(), "pad_t") && hasArgument(op.arg(), "pad_b"))) + throw std::runtime_error("If one custom pad specified - all custom pads must be specified"); + + // Kernel size + bool has_custom_kernel_size = + hasArgument(op.arg(), "kernel_h") || hasArgument(op.arg(), "kernel_w"); + + if (has_custom_kernel_size && hasArgument(op.arg(), "kernel")) + throw std::runtime_error("Custom kernel size can't be combined with overall kernel size"); + + if (has_custom_kernel_size && + !(hasArgument(op.arg(), "kernel_h") && hasArgument(op.arg(), "kernel_w"))) + throw std::runtime_error( + "If one custom kernel size specified - all custom kernel sizes must be specified"); +} + +static mir::TensorVariant createTensor(const OperatorDef &op) +{ + assert(hasArgument(op.arg(), "shape") && hasArgument(op.arg(), "values")); + + const auto &shape = findArgumentByName(op.arg(), "shape"); + const auto &values = findArgumentByName(op.arg(), "values"); + + mir::DataType element_type; + const void *src_data; + // if values on floats + if (!values.floats().empty()) + { + element_type = mir::DataType::FLOAT32; + src_data = values.floats().data(); + } + else + { + assert(!values.ints().empty()); + if (op.type() == "GivenTensorInt64Fill") + { + element_type = mir::DataType::INT64; + } + else + { + element_type = mir::DataType::INT32; + } + src_data = values.ints().data(); + } + + mir::Shape tensor_shape(shape.ints_size()); + + for (int i = 0; i < shape.ints_size(); ++i) + { + tensor_shape.dim(i) = shape.ints(i); + } + + return mir::TensorVariant({element_type, tensor_shape}, src_data); +} + +// +// Convert functions +// + +std::vector +Caffe2OpCreator::convertConstant(const std::vector &, + const ::caffe2::OperatorDef &op) +{ + // Constant may not contain any data if it is a fake input. + if (!hasArgument(op.arg(), "values")) + return {}; + + return {createOp(createTensor(op))->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertAdd(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + assert(inputs.size() == 2); + auto lhs = inputs[0]; + auto rhs = inputs[1]; + + if (getSingleArgument(op, "broadcast", 0) != 0) + { + // FIXME This only works when 'axis' == 1 and the second input is 1-D. + rhs = createOp(rhs, Shape{1, rhs->getShape().dim(0), 1, 1})->getOutput(0); + auto result = createOp(lhs, rhs)->getOutput(0); + return {result}; + } + + auto result = createOp(lhs, rhs)->getOutput(0); + return {result}; +} + +std::vector +Caffe2OpCreator::convertAveragePool(const std::vector &inputs, + const OperatorDef &op) +{ + checkConvLikeOp(op); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + AvgPool2DOpAttributes attributes; + std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); + attributes.window = getWindowSize(op, inputs); + attributes.strides = getStrides(op); + attributes.include_pad = false; + attributes.data_format = DataFormat::NCHW; + auto result = createOp(input, attributes)->getOutput(0); + return {result}; +} + +std::vector +Caffe2OpCreator::convertConv(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + // dilation order: h w (not used) + mir::Conv2DOpAttributes attributes; + attributes.strides = getStrides(op); + std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); + attributes.num_groups = getSingleArgument(op, "group", 1); + attributes.data_format = DataFormat::NCHW; + + std::vector perm{0, 2, 3, 1}; // OIHW -> OHWI + auto kernel = createOp(inputs[1], perm)->getOutput(0); + auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); + + if (op.input_size() > 2) + { + auto bias = inputs[2]; + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +std::vector +Caffe2OpCreator::convertConcat(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + checkLayout(op); + + // `1` corresponds to the default (channels) axis. + int axis = getSingleArgument(op, "axis", 1); + auto result = createOp(inputs, axis); + return {result->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertDropout(const std::vector &inputs, + const ::caffe2::OperatorDef &) +{ + // This is a no-op in inference mode. + return {inputs[0]}; +} + +std::vector +Caffe2OpCreator::convertFC(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + for (auto &s : {"axis", "axis_w", "float16_compute"}) + if (hasArgument(op.arg(), s)) + throw std::runtime_error(std::string("FC: only default '") + s + "' value is supported"); + + const auto &input_shape = inputs[0]->getShape(); + // Transform input into 2-D tensor by flattening axes + Shape shape{input_shape.dim(0), input_shape.numElements() / input_shape.dim(0)}; + + auto reshape = createOp(inputs[0], shape)->getOutput(0); + auto weights = + createOp(inputs[1], std::vector{1, 0})->getOutput(0); + auto result = createOp(reshape, weights)->getOutput(0); + result = createOp(result, inputs[2])->getOutput(0); + + return {result}; +} + +std::vector +Caffe2OpCreator::convertMaxPool(const std::vector &inputs, + const OperatorDef &op) +{ + checkConvLikeOp(op); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + MaxPool2DOpAttributes attributes; + std::tie(attributes.padding_before, attributes.padding_after) = getPadding(op); + attributes.window = getWindowSize(op, inputs); + attributes.strides = getStrides(op); + attributes.data_format = DataFormat::NCHW; + auto result = createOp(input, attributes)->getOutput(0); + return {result}; +} + +std::vector +Caffe2OpCreator::convertMul(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + assert(inputs.size() == 2); + auto lhs = inputs[0]; + auto rhs = inputs[1]; + + if (getSingleArgument(op, "broadcast", 0) != 0) + { + // FIXME This only works when `axis` == 1 and the second input is 1-D. + rhs = createOp(rhs, Shape{1, rhs->getShape().dim(0), 1, 1})->getOutput(0); + auto result = createOp(lhs, rhs)->getOutput(0); + return {result}; + } + + auto result = createOp(lhs, rhs)->getOutput(0); + return {result}; +} + +std::vector +Caffe2OpCreator::convertRelu(const std::vector &inputs) +{ + auto relu = createOp(inputs[0]); + return {relu->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertResizeNearest(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + std::vector scales(4); + assert(inputs[0]->getShape().rank() == 4 && "only 4d tensors is supported"); + // Assuming NCHW format. + scales[0] = 1.0f; + scales[1] = 1.0f; + scales[2] = getSingleArgument(op, "height_scale", 1.0f); + scales[3] = getSingleArgument(op, "width_scale", 1.0f); + auto result = + createOp(inputs[0], ops::ResizeOp::ResizeMethod::nearestNeighbor, scales) + ->getOutput(0); + return {result}; +} + +std::vector +Caffe2OpCreator::convertSigmoid(const std::vector &inputs) +{ + auto result = createOp(inputs[0]); + return {result->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertSoftmax(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + int axis = getSingleArgument(op, "axis", 1); + auto softmax = createOp(inputs[0], axis); + return {softmax->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertSpatialBN(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + checkLayout(op); + + // Sanity checks + if (op.input_size() != 5) + throw std::runtime_error( + "SpatialBN must have exactly 5 inputs ('sums' and 'sumsq' are not supported yet)"); + if (getSingleArgument(op, "is_test", 1) != 1) + throw std::runtime_error("SpatialBN: only test mode supported"); + + // overall_res = (X - mean) / sqrt(var + epsilon) * scale + bias + + auto scale_op = dynamic_cast(inputs[1]->getNode()); + auto bias_op = dynamic_cast(inputs[2]->getNode()); + auto mean_op = dynamic_cast(inputs[3]->getNode()); + auto var_op = dynamic_cast(inputs[4]->getNode()); + if (scale_op == nullptr || bias_op == nullptr || mean_op == nullptr || var_op == nullptr) + throw std::runtime_error( + "SpatialBN: non-constant 'scale', 'bias', 'mean' and 'var' inputs are not supported yet."); + + const auto &scale_tensor = scale_op->getValue(); + const auto &bias_tensor = bias_op->getValue(); + const auto &mean_tensor = mean_op->getValue(); + const auto &var_tensor = var_op->getValue(); + float eps = getSingleArgument(op, "epsilon", 1e-5f); + + // res1 = X - mean + Tensor bias_data(mean_tensor); + for (auto &idx : ShapeRange(bias_data.getShape())) + bias_data.at(idx) *= -1; + + auto mean = createOp(mean_tensor)->getOutput(0); + mean = createOp(mean, Shape{1, mean->getShape().dim(0), 1, 1})->getOutput(0); + auto result = createOp(inputs[0], mean)->getOutput(0); + + // res2 = res1 * scale / (var + epsilon) + Tensor multiplier(scale_tensor); + for (auto &idx : ShapeRange(scale_tensor.getShape())) + multiplier.at(idx) /= std::sqrt(*reinterpret_cast(var_tensor.at(idx)) + eps); + auto scale = createOp(scale_tensor)->getOutput(0); + scale = createOp(scale, Shape{1, scale->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, scale)->getOutput(0); + + // overall_res = res2 + bias + auto bias = createOp(bias_tensor)->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, bias)->getOutput(0); + + return {result}; +} + +std::vector +Caffe2OpCreator::convertSum(const std::vector &inputs) +{ + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + for (int i = 2; i < static_cast(inputs.size()); ++i) + { + result = createOp(result, inputs[i])->getOutput(0); + } + return {result}; +} + +std::vector +Caffe2OpCreator::convertClip(const std::vector &inputs, + const ::caffe2::OperatorDef &op) +{ + + float max = getSingleArgument(op, "max", float(0)); + float min = getSingleArgument(op, "min", float(0)); + + if (min != 0.0f) + throw std::runtime_error("Clip: min != 0 is not supported."); + if (max <= min) + throw std::runtime_error("Clip: max <= min is not supported."); + auto cap_relu = createOp(inputs[0], max); + + return {cap_relu->getOutput(0)}; +} + +std::vector +Caffe2OpCreator::convertReshape(const std::vector &inputs, + const ::caffe2::OperatorDef &) +{ + auto shape_op = dynamic_cast(inputs[1]->getNode()); + if (shape_op == nullptr) + throw std::runtime_error("Reshape: non-constant shape is not supported yet."); + + const auto &shape_tensor = shape_op->getValue(); + + Tensor out_shape_tensor(shape_tensor); + + ShapeRange range(out_shape_tensor.getShape()); + std::vector shape_vec; + for (const auto &index : range) + { + shape_vec.push_back(static_cast(out_shape_tensor.at(index))); + } + Shape out_shape(shape_vec); + + auto reshape = createOp(inputs[0], out_shape); + + return {reshape->getOutput(0)}; +} + +} // namespace mir_caffe2 diff --git a/compiler/mir-caffe2-importer/caffe2_op_creator.h b/compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.h similarity index 100% rename from compiler/mir-caffe2-importer/caffe2_op_creator.h rename to compiler/mir/src/mir_caffe2_importer/caffe2_op_creator.h diff --git a/compiler/mir-caffe2-importer/caffe2_op_types.h b/compiler/mir/src/mir_caffe2_importer/caffe2_op_types.h similarity index 100% rename from compiler/mir-caffe2-importer/caffe2_op_types.h rename to compiler/mir/src/mir_caffe2_importer/caffe2_op_types.h diff --git a/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.cpp b/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.cpp new file mode 100644 index 0000000..7bb9cf0 --- /dev/null +++ b/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "caffe2_proto_helper.h" + +namespace mir_caffe2 +{ + +const ::caffe2::Argument &findArgumentByName(RepArgument args, const std::string &name) +{ + for (auto &arg : args) + if (arg.name() == name) + return arg; + throw std::runtime_error("Can't find argument with name: " + name); +} + +bool hasArgument(RepArgument args, const std::string &name) +{ + for (auto &arg : args) + if (arg.name() == name) + return true; + return false; +} + +int getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + const int default_value) +{ + if (hasArgument(op.arg(), argument_name)) + return static_cast(findArgumentByName(op.arg(), argument_name).i()); + return default_value; +} + +float getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + const float default_value) +{ + if (hasArgument(op.arg(), argument_name)) + return findArgumentByName(op.arg(), argument_name).f(); + return default_value; +} + +std::string getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + const std::string &default_value) +{ + if (hasArgument(op.arg(), argument_name)) + return findArgumentByName(op.arg(), argument_name).s(); + return default_value; +} + +} // namespace mir_caffe2 diff --git a/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.h b/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.h new file mode 100644 index 0000000..4f5c4ef --- /dev/null +++ b/compiler/mir/src/mir_caffe2_importer/caffe2_proto_helper.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MIR_CAFFE2_PROTO_HELPER_H +#define MIR_CAFFE2_PROTO_HELPER_H + +#include "caffe2/proto/caffe2.pb.h" + +namespace mir_caffe2 +{ + +using RepArgument = const ::google::protobuf::RepeatedPtrField<::caffe2::Argument> &; + +const ::caffe2::Argument &findArgumentByName(RepArgument args, const std::string &name); + +bool hasArgument(RepArgument args, const std::string &name); + +int getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + int default_value); +float getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + float default_value); +std::string getSingleArgument(const ::caffe2::OperatorDef &op, const std::string &argument_name, + const std::string &default_value); + +} // namespace mir_caffe2 + +#endif // MIR_CAFFE2_PROTO_HELPER_H diff --git a/compiler/mir/src/mir_caffe_importer/CMakeLists.txt b/compiler/mir/src/mir_caffe_importer/CMakeLists.txt new file mode 100644 index 0000000..34be520 --- /dev/null +++ b/compiler/mir/src/mir_caffe_importer/CMakeLists.txt @@ -0,0 +1,16 @@ +nnas_find_package(CaffeProto QUIET) + +if (NOT CaffeProto_FOUND) + return() +endif () + +set(MIR_CAFFE_IMPORTER_SOURCES + caffe_importer.cpp + caffe_op_creator.cpp + caffe_op_creator.h + caffe_op_types.h) + +add_library(mir_caffe_importer STATIC ${MIR_CAFFE_IMPORTER_SOURCES}) +set_target_properties(mir_caffe_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(mir_caffe_importer PUBLIC ../../include/mir_caffe_importer) +target_link_libraries(mir_caffe_importer PUBLIC mir PRIVATE caffeproto nncc_common) diff --git a/compiler/mir/src/mir_caffe_importer/caffe_importer.cpp b/compiler/mir/src/mir_caffe_importer/caffe_importer.cpp new file mode 100644 index 0000000..49f13fb --- /dev/null +++ b/compiler/mir/src/mir_caffe_importer/caffe_importer.cpp @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "caffe_importer.h" +#include "caffe/proto/caffe.pb.h" +#include "caffe_op_creator.h" +#include "caffe_op_types.h" + +#include "mir/ops/OutputOp.h" + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mir_caffe +{ + +namespace +{ + +class CaffeImporter +{ +public: + /// @brief Load the model and convert it into a MIR Graph. + std::unique_ptr importModelFromBinaryFile(const std::string &filename); + std::unique_ptr importModelFromTextFile(const std::string &filename); + +private: + std::unique_ptr importModel(); + + std::unique_ptr _net; + std::unique_ptr _opCreator; + + // Maps Caffe blob names to corresponding MIR operation outputs. + std::map _blobNameToOpOutput; + + static const std::map _operatorTypes; + + /** + * @brief Mark output MIR nodes + */ + void setGraphOutputs(mir::Graph *graph); + + /** + * @brief Pass through caffe graph and collect unsupported by NNC layers + * @throw PassException with message, containing detected problems + */ + void collectUnsupportedLayers(); + + /** + * @brief Create MIR node from single caffe layer + */ + void createMIRNodesFromLayer(const caffe::LayerParameter &layer); + + mir::Operation::Output *getOutputForBlob(const std::string &blob_name) const; + void setOutputForBlob(const std::string &blob_name, mir::Operation::Output *output); + + /** + * @brief Collect unsupported parts of caffe layer + */ + void collectUnsupportedOp(const caffe::LayerParameter &layer, std::set &problems); + + /** + * @brief Returns MIR operation outputs corresponding to the inputs of the given layer. + */ + std::vector getMIRInputsForLayer(const caffe::LayerParameter &layer); + + void processDeprecatedInput(); +}; + +void loadModelFromBinaryFile(const std::string &filename, caffe::NetParameter *net) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; + + int file_handle = open(filename.c_str(), O_RDONLY); + + if (file_handle == -1) + throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + + "."); + + google::protobuf::io::FileInputStream file_stream(file_handle); + file_stream.SetCloseOnDelete(true); + + google::protobuf::io::CodedInputStream coded_stream(&file_stream); + coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); + + if (!net->ParseFromCodedStream(&coded_stream)) + throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); + + // If the file has not been consumed entirely, assume that the file is in the wrong format. + if (!coded_stream.ConsumedEntireMessage()) + throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); +} + +void loadModelFromTextFile(const std::string &filename, caffe::NetParameter *net) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; + + int file_handle = open(filename.c_str(), O_RDONLY); + + if (file_handle == -1) + throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + + "."); + + google::protobuf::io::FileInputStream file_stream(file_handle); + file_stream.SetCloseOnDelete(true); + + if (!google::protobuf::TextFormat::Parse(&file_stream, net)) + throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); +} + +std::unique_ptr CaffeImporter::importModel() +{ + auto graph = std::make_unique(); + _opCreator = std::make_unique(graph.get()); + + collectUnsupportedLayers(); + + for (int i = 0; i < _net->layer_size(); ++i) + createMIRNodesFromLayer(_net->layer(i)); + + setGraphOutputs(graph.get()); + + return graph; +} + +std::unique_ptr CaffeImporter::importModelFromBinaryFile(const std::string &filename) +{ + _net = std::make_unique(); + loadModelFromBinaryFile(filename, _net.get()); + + return importModel(); +} + +std::unique_ptr CaffeImporter::importModelFromTextFile(const std::string &filename) +{ + _net = std::make_unique(); + loadModelFromTextFile(filename, _net.get()); + + return importModel(); +} + +void CaffeImporter::collectUnsupportedLayers() +{ + processDeprecatedInput(); + + std::set problems; + + for (const caffe::LayerParameter &layer : _net->layer()) + collectUnsupportedOp(layer, problems); + + if (!problems.empty()) + { + std::string msg("NNC can't load model. Detected problems:"); + for (const auto &problemStr : problems) + msg.append("\n * " + problemStr); + throw std::runtime_error(msg); + } +} + +void CaffeImporter::createMIRNodesFromLayer(const caffe::LayerParameter &layer) +{ + std::vector inputs = getMIRInputsForLayer(layer); + std::vector outputs; + + switch (_operatorTypes.at(layer.type())) + { + case CaffeOpType::input: + outputs = _opCreator->convertInput(layer); + break; + case CaffeOpType::convolution: + outputs = _opCreator->convertConvolution(layer, inputs); + break; + case CaffeOpType::innerProduct: + outputs = _opCreator->convertInnerProduct(layer, inputs); + break; + case CaffeOpType::pooling: + outputs = _opCreator->convertPooling(layer, inputs); + break; + case CaffeOpType::concat: + outputs = _opCreator->convertConcat(layer, inputs); + break; + case CaffeOpType::reshape: + outputs = _opCreator->convertReshape(layer, inputs); + break; + case CaffeOpType::ReLU: + outputs = _opCreator->convertReLU(layer, inputs); + break; + case CaffeOpType::softmax: + outputs = _opCreator->convertSoftmax(layer, inputs); + break; + case CaffeOpType::scale: + outputs = _opCreator->convertScale(layer, inputs); + break; + case CaffeOpType::batchNorm: + outputs = _opCreator->convertBatchNorm(layer, inputs); + break; + case CaffeOpType::dropout: + outputs = _opCreator->convertDropout(layer, inputs); + break; + case CaffeOpType::tanh: + outputs = _opCreator->convertTanH(layer, inputs); + break; + case CaffeOpType::ELU: + outputs = _opCreator->convertELU(layer, inputs); + break; + case CaffeOpType::eltwise: + outputs = _opCreator->convertEltwise(layer, inputs); + break; + case CaffeOpType::embed: + outputs = _opCreator->convertEmbed(layer, inputs); + break; + case CaffeOpType::deconvolution: + outputs = _opCreator->convertDeconvolution(layer, inputs); + break; + case CaffeOpType::split: + outputs = _opCreator->convertSplit(layer, inputs); + break; + case CaffeOpType::sigmoid: + outputs = _opCreator->convertSigmoid(layer, inputs); + break; + case CaffeOpType::LSTM: + outputs = _opCreator->convertLSTM(layer, inputs); + break; + default: + assert(false && "All unsupported types should have been found before this pass."); + } + + assert(static_cast(outputs.size()) == layer.top_size() && "Number of outputs differs."); + for (int i = 0; i < layer.top_size(); ++i) + setOutputForBlob(layer.top(i), outputs[i]); +} + +void CaffeImporter::collectUnsupportedOp(const caffe::LayerParameter &layer, + std::set &problems) +{ + auto it = _operatorTypes.find(layer.type()); + if (it == _operatorTypes.end()) + { + problems.insert(layer.type() + ": unknown layer"); + return; + } + + CaffeOpType op_type = it->second; + + switch (op_type) + { + case CaffeOpType::concat: + case CaffeOpType::input: + case CaffeOpType::softmax: + case CaffeOpType::scale: + case CaffeOpType::dropout: + case CaffeOpType::split: + case CaffeOpType::eltwise: + case CaffeOpType::ELU: + case CaffeOpType::ReLU: + case CaffeOpType::embed: + case CaffeOpType::sigmoid: + case CaffeOpType::tanh: + case CaffeOpType::innerProduct: + // No checks + break; + case CaffeOpType::deconvolution: + case CaffeOpType::convolution: + _opCreator->checkConvolution(layer, problems); + break; + case CaffeOpType::pooling: + _opCreator->checkPooling(layer, problems); + break; + case CaffeOpType::reshape: + _opCreator->checkReshape(layer, problems); + break; + case CaffeOpType::batchNorm: + _opCreator->checkBatchNorm(layer, problems); + break; + case CaffeOpType::LSTM: + _opCreator->checkLSTM(layer, problems); + break; + default: + problems.insert(layer.type() + ": unsupported layer"); + break; + } +} + +void CaffeImporter::processDeprecatedInput() +{ + if (_net->input_dim_size() != 0 || _net->input_shape_size() != 0) + throw std::runtime_error("Deprecated Caffe input types are not supported"); +} + +std::vector +CaffeImporter::getMIRInputsForLayer(const caffe::LayerParameter &layer) +{ + std::vector inputs; + + for (const auto &input_name : layer.bottom()) + inputs.push_back(getOutputForBlob(input_name)); + + return inputs; +} + +mir::Operation::Output *CaffeImporter::getOutputForBlob(const std::string &blob_name) const +{ + return _blobNameToOpOutput.at(blob_name); +} + +void CaffeImporter::setOutputForBlob(const std::string &blob_name, mir::Operation::Output *output) +{ + const auto it = _blobNameToOpOutput.find(blob_name); + if (it != _blobNameToOpOutput.cend()) + { + // caffe input blob name could be same as output blob name, and next line will overwrite + // '_blobNameToOpOutput' element, but in all networks that I saw it was not a problem + it->second->setName(""); + } + + // Do not overwrite the name in case of fall-through layers (ex. Dropout, Split). + // TODO Find a way to handle it properly. + if (output->getName().empty()) + output->setName(blob_name); + + _blobNameToOpOutput[blob_name] = output; +} + +void CaffeImporter::setGraphOutputs(mir::Graph *graph) +{ + // TODO For now, we assume that: + // - there is exactly one output; + // - the output is from the last layer. + const auto &last_layer = *_net->layer().rbegin(); + auto output = getOutputForBlob(last_layer.top(0)); + graph->create(output); +} + +const std::map CaffeImporter::_operatorTypes = { + {"AbsVal", CaffeOpType::absVal}, + {"Accuracy", CaffeOpType::accuracy}, + {"ArgMax", CaffeOpType::argMax}, + {"BatchNorm", CaffeOpType::batchNorm}, + {"BatchReindex", CaffeOpType::batchReindex}, + {"Bias", CaffeOpType::bias}, + {"BNLL", CaffeOpType::BNLL}, + {"Clip", CaffeOpType::clip}, + {"Concat", CaffeOpType::concat}, + {"ContrastiveLoss", CaffeOpType::contrastiveLoss}, + {"Convolution", CaffeOpType::convolution}, + {"Crop", CaffeOpType::crop}, + {"Data", CaffeOpType::data}, + {"Deconvolution", CaffeOpType::deconvolution}, + {"Dropout", CaffeOpType::dropout}, + {"DummyData", CaffeOpType::dummyData}, + {"Eltwise", CaffeOpType::eltwise}, + {"ELU", CaffeOpType::ELU}, + {"Embed", CaffeOpType::embed}, + {"EuclidianLoss", CaffeOpType::euclidianLoss}, + {"Exp", CaffeOpType::exp}, + {"Filter", CaffeOpType::filter}, + {"Flatten", CaffeOpType::flatten}, + {"HDF5Data", CaffeOpType::HDF5Data}, + {"HDF5Output", CaffeOpType::HDF5Output}, + {"HingeLoss", CaffeOpType::hingeLoss}, + {"Im2Col", CaffeOpType::im2Col}, + {"ImageData", CaffeOpType::imageData}, + {"InfogainLoss", CaffeOpType::infogainLoss}, + {"InnerProduct", CaffeOpType::innerProduct}, + {"Input", CaffeOpType::input}, + {"Log", CaffeOpType::log}, + {"LRN", CaffeOpType::LRN}, + {"LSTM", CaffeOpType::LSTM}, + {"MemoryData", CaffeOpType::memoryData}, + {"MultinomialLogisticLoss", CaffeOpType::multinomialLogisticLoss}, + {"MVN", CaffeOpType::MVN}, + {"Parameter", CaffeOpType::parameter}, + {"Pooling", CaffeOpType::pooling}, + {"Power", CaffeOpType::power}, + {"PReLU", CaffeOpType::PReLU}, + {"Python", CaffeOpType::python}, + {"Recurrent", CaffeOpType::recurrent}, + {"Reduction", CaffeOpType::reduction}, + {"ReLU", CaffeOpType::ReLU}, + {"Reshape", CaffeOpType::reshape}, + {"RNN", CaffeOpType::RNN}, + {"Scale", CaffeOpType::scale}, + {"SigmoidCrossEntropyLoss", CaffeOpType::sigmoidCrossEntropyLoss}, + {"Sigmoid", CaffeOpType::sigmoid}, + {"Silence", CaffeOpType::silence}, + {"Softmax", CaffeOpType::softmax}, + {"SoftmaxWithLoss", CaffeOpType::softmaxWithLoss}, + {"SPP", CaffeOpType::SPP}, + {"Split", CaffeOpType::split}, + {"Slice", CaffeOpType::slice}, + {"TanH", CaffeOpType::tanh}, + {"Threshold", CaffeOpType::threshold}, + {"Tile", CaffeOpType::tile}, + {"WindowData", CaffeOpType::windowData}}; +} // namespace + +std::unique_ptr importModelFromBinaryFile(const std::string &filename) +{ + CaffeImporter importer; + return importer.importModelFromBinaryFile(filename); +} + +std::unique_ptr importModelFromTextFile(const std::string &filename) +{ + CaffeImporter importer; + return importer.importModelFromTextFile(filename); +} + +std::unique_ptr loadModel(const std::string &filename) +{ + return importModelFromBinaryFile(filename); +} + +} // namespace mir_caffe diff --git a/compiler/mir/src/mir_caffe_importer/caffe_op_creator.cpp b/compiler/mir/src/mir_caffe_importer/caffe_op_creator.cpp new file mode 100644 index 0000000..37edc69 --- /dev/null +++ b/compiler/mir/src/mir_caffe_importer/caffe_op_creator.cpp @@ -0,0 +1,835 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "caffe_op_creator.h" + +#include "mir/ops/AddOp.h" +#include "mir/ops/AvgPool2DOp.h" +#include "mir/ops/ConcatOp.h" +#include "mir/ops/ConstantOp.h" +#include "mir/ops/Conv2DOp.h" +#include "mir/ops/Deconv2DOp.h" +#include "mir/ops/EluOp.h" +#include "mir/ops/FullyConnectedOp.h" +#include "mir/ops/GatherOp.h" +#include "mir/ops/LeakyReluOp.h" +#include "mir/ops/MaxOp.h" +#include "mir/ops/MaxPool2DOp.h" +#include "mir/ops/MulOp.h" +#include "mir/ops/ReluOp.h" +#include "mir/ops/ReshapeOp.h" +#include "mir/ops/SigmoidOp.h" +#include "mir/ops/SliceOp.h" +#include "mir/ops/SoftmaxOp.h" +#include "mir/ops/TanhOp.h" +#include "mir/ops/TransposeOp.h" +#include "mir/Index.h" +#include "mir/ShapeRange.h" +#include "mir/Tensor.h" + +#include +#include +#include +#include + +namespace mir_caffe +{ + +static mir::Shape convertBlobShape(const caffe::BlobShape &shape) +{ + mir::Shape mir_shape(shape.dim_size()); + + for (int i = 0; i < shape.dim_size(); ++i) + { + mir_shape.dim(i) = shape.dim(i); + } + + return mir_shape; +} + +using namespace mir; + +/// @brief Split arg into @p num_parts equal parts along @p axis axis. +std::vector CaffeOpCreator::createSplit(mir::Operation::Output *arg, + int32_t num_parts, int32_t axis) +{ + const auto &arg_shape = arg->getShape(); + + assert(axis >= 0 && axis < arg_shape.rank()); + int32_t part_size = arg_shape.dim(axis) / num_parts; + assert(part_size * num_parts == arg_shape.dim(axis)); + + Shape starts(arg_shape.rank()); + Shape sizes(arg_shape); + sizes.dim(axis) = part_size; + + std::vector outputs(num_parts); + for (int32_t i = 0; i < num_parts; ++i) + { + outputs[i] = createOp(arg, starts, sizes)->getOutput(0); + starts.dim(axis) += part_size; + } + + return outputs; +} + +/// @brief Helper function for creating FullyConnected operation with non-square input. +mir::Operation::Output *CaffeOpCreator::createFullyConnected(mir::Operation::Output *input, + mir::Operation::Output *weights, + int32_t axis) +{ + const auto &input_shape = input->getShape(); + const auto &weights_shape = weights->getShape(); + + assert(axis >= 0 && axis < input_shape.rank()); + assert(weights_shape.rank() == 2); + + // Result shape is: input.shape[0:axis] + weights.shape[1]. + Shape result_shape = input_shape; + result_shape.resize(axis + 1); + result_shape.dim(axis) = weights_shape.dim(1); + + // Flatten input to 2-D shape. + int32_t outer_size = 1; + for (int32_t i = 0; i < axis; ++i) + outer_size *= input_shape.dim(i); + int32_t inner_size = 1; + for (int32_t i = axis; i < input_shape.rank(); ++i) + inner_size *= input_shape.dim(i); + + auto flatten = createOp(input, Shape{outer_size, inner_size})->getOutput(0); + auto fc = createOp(flatten, weights)->getOutput(0); + return createOp(fc, result_shape)->getOutput(0); +} + +TensorVariant CaffeOpCreator::convertBlob(const caffe::BlobProto &blob) +{ + const void *src_data; + + mir::DataType dtype; + if (blob.data_size() != 0) + { + assert(blob.double_data_size() == 0); + dtype = mir::DataType::FLOAT32; + src_data = blob.data().data(); + } + else if (blob.double_data_size() != 0) + { + dtype = mir::DataType::FLOAT64; + src_data = blob.double_data().data(); + } + else + { + throw std::runtime_error("No data in Caffe BlobProto, investigate"); + } + + const mir::Shape shape = convertBlobShape(blob.shape()); + return TensorVariant({dtype, shape}, src_data); +} + +std::vector +CaffeOpCreator::convertInput(const caffe::LayerParameter &layer) +{ + const auto ¶ms = layer.input_param(); + const auto num_inputs = layer.top_size(); + const auto num_shapes = params.shape_size(); + std::vector outputs; + + assert((num_shapes == 1 || num_shapes == num_inputs) && "Unsupported number of shapes."); + + for (int i = 0; i < num_inputs; ++i) + { + const auto &blob_shape = params.shape(num_shapes == 1 ? 0 : i); + mir::TensorType input_type(DataType::FLOAT32, convertBlobShape(blob_shape)); + auto input = createOp(input_type)->getOutput(0); + outputs.push_back(input); + } + + return outputs; +} + +template +static void convertConvolutionParam(const caffe::ConvolutionParameter &conv_param, + OperationAttributes &attributes) +{ + std::int32_t stride_h, stride_w; + if (conv_param.has_stride_h() || conv_param.has_stride_w()) + { + // If stride_h or stride_w are set, they take precedence. + stride_h = conv_param.stride_h(); + stride_w = conv_param.stride_w(); + } + else if (conv_param.stride_size() == 0) + { + // If no strides specified, they defaults to 1. + stride_h = stride_w = 1; + } + else if (conv_param.stride_size() == 1) + { + // If only one stride specified, all strides take the same value. + stride_h = stride_w = conv_param.stride(0); + } + else + { + // Otherwise, there must be a stride for each dimension. + assert(conv_param.stride_size() == 2); + stride_h = conv_param.stride(0); + stride_w = conv_param.stride(1); + } + attributes.strides = {stride_h, stride_w}; + + std::int32_t pad_h, pad_w; + if (conv_param.has_pad_h() || conv_param.has_pad_w()) + { + // If pad_h or pad_w are set, they take precedence. + pad_h = conv_param.pad_h(); + pad_w = conv_param.pad_w(); + } + else if (conv_param.pad_size() == 0) + { + // If no pads specified, they defaults to 0. + pad_h = pad_w = 0; + } + else if (conv_param.pad_size() == 1) + { + // If only one pad specified, all pads take the same value. + pad_h = pad_w = conv_param.pad(0); + } + else + { + // Otherwise, there must be a pad for each dimension. + assert(conv_param.pad_size() == 2); + pad_h = conv_param.pad(0); + pad_w = conv_param.pad(1); + } + attributes.padding_after = attributes.padding_before = {pad_h, pad_w}; +} + +void CaffeOpCreator::checkConvolution(const caffe::LayerParameter &layer, + std::set &problems_ops_set) +{ + const caffe::ConvolutionParameter ¶ms = layer.convolution_param(); + + assert(params.stride_size() <= 2); + + if (params.axis() != 1) + problems_ops_set.insert("Conv2D: Unsupported axis"); + + if (params.pad_size() != 0 && (params.has_pad_h() || params.has_pad_w())) + problems_ops_set.insert("Conv2D: Conflicting padding properties"); + + if (params.pad_size() > 2) + problems_ops_set.insert("Conv2D: Unsupported number of pads"); +} + +std::vector +CaffeOpCreator::convertConvolution(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.convolution_param(); + Conv2DOpAttributes attributes; + + convertConvolutionParam(params, attributes); + attributes.num_groups = params.group(); + attributes.data_format = DataFormat::NCHW; + + assert(layer.blobs(0).shape().dim_size() == 4); + auto kernel = createOp(convertBlob(layer.blobs(0)))->getOutput(0); + std::vector perm{0, 2, 3, 1}; // OIHW -> OHWI + kernel = createOp(kernel, perm)->getOutput(0); + auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); + + // Add the bias, if any. + if (params.bias_term()) + { + auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +std::vector +CaffeOpCreator::convertDeconvolution(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const caffe::ConvolutionParameter ¶ms = layer.convolution_param(); + Deconv2DOpAttributes attributes; + + convertConvolutionParam(params, attributes); + attributes.data_format = DataFormat::NCHW; + + if (params.group() != 1) + { + throw std::runtime_error("Deconvolution: 'group' != 1 is not supported."); + } + + auto kernel = createOp(convertBlob(layer.blobs(0)))->getOutput(0); + std::vector perm{2, 3, 1, 0}; // IOHW -> HWOI + kernel = createOp(kernel, perm)->getOutput(0); + auto result = createOp(inputs[0], kernel, attributes)->getOutput(0); + + // bias_term is optional (so might not be present) and defaults to true + if (params.bias_term()) + { + auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +std::vector +CaffeOpCreator::convertInnerProduct(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.inner_product_param(); + auto weights = createOp(convertBlob(layer.blobs(0)))->getOutput(0); + + if (!params.transpose()) + weights = createOp(weights, std::vector{1, 0})->getOutput(0); + + auto result = createFullyConnected(inputs[0], weights, params.axis()); + + // Add the bias, if any. + if (params.bias_term()) + { + auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +std::vector +CaffeOpCreator::convertConcat(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.concat_param(); + auto concat = createOp(inputs, params.axis()); + return {concat->getOutput(0)}; +} + +template +static void convertPoolingParam(const caffe::PoolingParameter ¶ms, + const mir::Shape &input_shape, PoolingAttributes &attributes) +{ + std::int32_t kernel_h, kernel_w; + assert(!params.global_pooling()); + if (params.has_kernel_size()) + { + kernel_h = kernel_w = params.kernel_size(); + } + else + { + kernel_h = params.kernel_h(); + kernel_w = params.kernel_w(); + } + attributes.window = {kernel_h, kernel_w}; + + std::int32_t stride_h, stride_w; + if (params.has_stride_h() || params.has_stride_w()) + { + stride_h = params.stride_h(); + stride_w = params.stride_w(); + } + else + { + stride_h = stride_w = params.stride(); + } + attributes.strides = {stride_h, stride_w}; + + std::int32_t pad_h, pad_w; + if (params.has_pad_h() || params.has_pad_w()) + { + pad_h = params.pad_h(); + pad_w = params.pad_w(); + } + else + { + pad_h = pad_w = params.pad(); + } + + attributes.padding_before = attributes.padding_after = {pad_h, pad_w}; + + // Caffe uses different formula for computing output shape than MIR. Adjust padding so that + // the output shape stays the same. + constexpr int num_spatial_dims = 2; + for (int i = 0; i < num_spatial_dims; ++i) + { + // Assuming NCHW format. + const std::int32_t padded_input = + input_shape.dim(2 + i) + attributes.padding_before[i] + attributes.padding_after[i]; + if ((padded_input - attributes.window[i]) % attributes.strides[i] != 0) + ++attributes.padding_after[i]; + } +} + +void CaffeOpCreator::checkPooling(const caffe::LayerParameter &layer, + std::set &problems_ops_set) +{ + const caffe::PoolingParameter ¶ms = layer.pooling_param(); + + if (params.has_global_pooling() && params.global_pooling()) + problems_ops_set.insert("Pooling: pooling layer global_pooling param is not supported yet"); + + if (params.pool() != caffe::PoolingParameter::AVE && + params.pool() != caffe::PoolingParameter::MAX) + problems_ops_set.insert("Pooling: unsupported pooling type"); + + if (params.has_pad() && (params.has_pad_h() || params.has_pad_w())) + problems_ops_set.insert("Pooling: conflicting padding properties in pooling"); +} + +std::vector +CaffeOpCreator::convertPooling(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.pooling_param(); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + mir::Operation::Output *result; + + switch (params.pool()) + { + case caffe::PoolingParameter::AVE: + { + AvgPool2DOpAttributes attributes_avg; + attributes_avg.data_format = DataFormat::NCHW; + convertPoolingParam(params, input->getShape(), attributes_avg); + result = createOp(input, attributes_avg)->getOutput(0); + break; + } + case caffe::PoolingParameter::MAX: + { + MaxPool2DOpAttributes attributes_max; + attributes_max.data_format = DataFormat::NCHW; + convertPoolingParam(params, input->getShape(), attributes_max); + result = createOp(input, attributes_max)->getOutput(0); + break; + } + default: + throw std::runtime_error("Unsupported PoolMethod: " + std::to_string(params.pool())); + } + + return {result}; +} + +std::vector +CaffeOpCreator::convertSoftmax(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.softmax_param(); + + // CPP and ACL backends are able to perform Softmax only along the last axis. + // FIXME Do it in backends. + if (inputs[0]->getShape().rank() == 4) + { + // For now, we only account for the most common case. + if (params.axis() != 1) + throw std::runtime_error("Softmax: unsupported axis"); + int32_t axis = 3; + auto input = createOp(inputs[0], std::vector{0, 2, 3, 1}); + auto softmax = createOp(input->getOutput(0), axis); + auto result = + createOp(softmax->getOutput(0), std::vector{0, 3, 1, 2}); + return {result->getOutput(0)}; + } + + auto softmax = createOp(inputs[0], params.axis()); + return {softmax->getOutput(0)}; +} + +void CaffeOpCreator::checkReshape(const caffe::LayerParameter &layer, + std::set &problems_ops_set) +{ + const caffe::ReshapeParameter ¶ms = layer.reshape_param(); + + if (params.has_axis() || params.has_num_axes()) + problems_ops_set.insert("Reshape layer axis and num_axes params are not supported yet"); + + if (!params.has_shape()) + problems_ops_set.insert("Reshape layer doesn't have shape parameter"); + + const mir::Shape newShape = convertBlobShape(params.shape()); + + for (int32_t i = 0; i < newShape.rank(); ++i) + if (newShape.dim(i) == 0) + problems_ops_set.insert("Reshape layer zero shape values are not supported yet"); +} + +/** + * @brief Converts Caffe Reshape layer to Model IR Reshape operation. + * @todo Support "axis" and "num_axes" parameters as needed. + * @todo Decide how to react to the absence of "shape" parameter. + * @todo Support zero values in "shape" parameter. + */ +std::vector +CaffeOpCreator::convertReshape(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const caffe::ReshapeParameter ¶ms = layer.reshape_param(); + + const mir::Shape new_shape = convertBlobShape(params.shape()); + auto reshape = createOp(inputs[0], new_shape); + return {reshape->getOutput(0)}; +} + +std::vector +CaffeOpCreator::convertReLU(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + mir::Operation *relu; + if (layer.relu_param().has_negative_slope()) + { + float alpha = layer.relu_param().negative_slope(); + relu = createOp(inputs[0], alpha); + } + else + { + relu = createOp(inputs[0]); + } + + return {relu->getOutput(0)}; +} + +std::vector +CaffeOpCreator::convertScale(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.scale_param(); + auto scale = createOp(convertBlob(layer.blobs(0)))->getOutput(0); + scale = createOp(scale, Shape{1, scale->getShape().dim(0), 1, 1})->getOutput(0); + auto result = createOp(inputs[0], scale)->getOutput(0); + + // Add the bias, if any. + if (params.bias_term()) + { + auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + bias = createOp(bias, Shape{1, bias->getShape().dim(0), 1, 1})->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +void CaffeOpCreator::checkBatchNorm(const caffe::LayerParameter &layer, + std::set &problems_ops_set) +{ + const auto &scale_shape = layer.blobs(2).shape(); + + // Check that last blob(with scaleFactor) containing only one number + if (scale_shape.dim_size() != 1 || scale_shape.dim(0) != 1) + problems_ops_set.insert("Unexpected shape of scale parameter in batch norm"); +} + +std::vector +CaffeOpCreator::convertBatchNorm(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const caffe::BatchNormParameter ¶ms = layer.batch_norm_param(); + + auto input = inputs[0]; + auto mean_tensor = convertBlob(layer.blobs(0)); + auto var_tensor = convertBlob(layer.blobs(1)); + auto scale_tensor = convertBlob(layer.blobs(2)); + const float eps = params.eps(); + + float scale_factor = *reinterpret_cast(scale_tensor.at(mir::Index{0})); + + // See https://github.com/BVLC/caffe/blob/master/src/caffe/layers/batch_norm_layer.cpp#L100 + // Y = (X - mean / scale_factor) / sqrt(var / scale_factor + epsilon) = + // = (X + C1) * C2 + if (scale_factor != 0.0f) + scale_factor = 1.0f / scale_factor; + + // C1 = -mean / scale_factor + Tensor mean_accessor(mean_tensor); + for (const auto &idx : ShapeRange(mean_accessor.getShape())) + mean_accessor.at(idx) *= -scale_factor; + auto c1 = createOp(mean_tensor)->getOutput(0); + + // C2 = 1 / sqrt(var / scale_factor + epsilon) + Tensor var_accessor(var_tensor); + for (const auto &idx : ShapeRange(var_accessor.getShape())) + var_accessor.at(idx) = 1.0f / std::sqrt(var_accessor.at(idx) * scale_factor + eps); + auto c2 = createOp(var_tensor)->getOutput(0); + + c1 = createOp(c1, Shape{1, c1->getShape().dim(0), 1, 1})->getOutput(0); + c2 = createOp(c2, Shape{1, c2->getShape().dim(0), 1, 1})->getOutput(0); + + // Y = (X + C1) * C2 + auto result = createOp(input, c1)->getOutput(0); + result = createOp(result, c2)->getOutput(0); + + return {result}; +} + +std::vector +CaffeOpCreator::convertDropout(const caffe::LayerParameter &, + const std::vector &inputs) +{ + // This is a no-op in inference mode. + return {inputs[0]}; +} + +std::vector +CaffeOpCreator::convertELU(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const caffe::ELUParameter ¶ms = layer.elu_param(); + + auto elu = createOp(inputs[0], params.alpha()); + return {elu->getOutput(0)}; +} + +std::vector +CaffeOpCreator::convertEmbed(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.embed_param(); + auto data = createOp(convertBlob(layer.blobs(0))); + auto result = createOp(data->getOutput(0), inputs[0], 0)->getOutput(0); + + // Add the bias, if any. + if (params.bias_term()) + { + auto bias = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + + return {result}; +} + +std::vector +CaffeOpCreator::convertSigmoid(const caffe::LayerParameter &, + const std::vector &inputs) +{ + auto result = createOp(inputs[0]); + return {result->getOutput(0)}; +} + +std::vector +CaffeOpCreator::convertTanH(const caffe::LayerParameter &, + const std::vector &inputs) +{ + auto tanh = createOp(inputs[0]); + return {tanh->getOutput(0)}; +} + +std::vector +CaffeOpCreator::convertEltwise(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + auto ¶ms = layer.eltwise_param(); + + mir::Operation::Output *result; + switch (params.operation()) + { + case caffe::EltwiseParameter::PROD: + { + result = createOp(inputs[0], inputs[1])->getOutput(0); + for (int i = 2; i < layer.bottom_size(); ++i) + { + result = createOp(result, inputs[i])->getOutput(0); + } + break; + } + case caffe::EltwiseParameter::SUM: + { + std::vector scaled_inputs = inputs; + if (params.coeff_size() > 0) + { + assert(params.coeff_size() == layer.bottom_size()); + for (int i = 0; i < layer.bottom_size(); i++) + { + if (params.coeff(i) != 1.0f) + { + const float coeff_val = params.coeff(i); + TensorVariant coeff_tensor({DataType::FLOAT32, {}}, &coeff_val); + auto coeff_const = createOp(coeff_tensor)->getOutput(0); + scaled_inputs[i] = createOp(coeff_const, inputs[i])->getOutput(0); + } + } + } + result = createOp(scaled_inputs[0], scaled_inputs[1])->getOutput(0); + for (int i = 2; i < layer.bottom_size(); ++i) + { + result = createOp(result, scaled_inputs[i])->getOutput(0); + } + break; + } + case caffe::EltwiseParameter::MAX: + { + result = createOp(inputs[0], inputs[1])->getOutput(0); + for (int i = 2; i < layer.bottom_size(); ++i) + { + result = createOp(result, inputs[i])->getOutput(0); + } + break; + } + default: + throw std::runtime_error("Unknown element-wise operation."); + } + return {result}; +} + +std::vector +CaffeOpCreator::convertSplit(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + std::vector outputs(layer.top_size(), inputs.at(0)); + return outputs; +} + +void CaffeOpCreator::checkLSTM(const caffe::LayerParameter &layer, + std::set &problems_ops_set) +{ + const auto ¶ms = layer.recurrent_param(); + if (params.expose_hidden()) + problems_ops_set.insert("LSTM: parameter 'expose_hidden' has unsupported value: " + + std::to_string(params.expose_hidden())); +} + +static TensorVariant createZeroedTensor(const mir::Shape &shape) +{ + // TODO For now it is hardcoded float32. + auto elem_type = mir::DataType::FLOAT32; + std::vector zeros(static_cast(shape.numElements()), 0.0f); + return TensorVariant({elem_type, shape}, zeros.data()); +} + +/* See the following links for details on implementation: + * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/recurrent_layer.cpp + * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lstm_layer.cpp + * https://github.com/BVLC/caffe/blob/master/src/caffe/layers/lstm_unit_layer.cpp + * + * Inputs: + * x -- The time-varying input. Shape: [T, N, d0, d1, ..., dn]. + * cont -- The sequence continuation indicators. Shape: [T, N]. + * x_static -- The static (non-time-varying) input. Shape: [N, ...]. + * This parameter is optional and not currently supported. + * + * Additional inputs when parameter "expose_hidden" is true (not currently supported): + * h_0 -- The initial value of the hidden state. Shape: [1, N, D]. + * c_0 -- The initial value of the cell state. Shape: [1, N, D]. + * + * Learned parameters: + * xw -- x weights for input, output, forget and cell gates concatenated. + * Shape: [4 * D, d0 * d1 * ... * dn]. + * xb -- x biases for input, output, forget and cell gates concatenated. Shape: [4 * D]. + * hw -- h weights for input, output, forget and cell gates concatenated. Shape: [4 * D, D]. + * + * Outputs: + * h -- The time-varying output. Shape: [T, N, D]. + * + * Additional outputs when parameter "expose_hidden" is true (not currently supported): + * h_T -- The value of the hidden state at the last timestep. Shape: [1, N, D]. + * c_T -- The value of the cell state at the last timestep. Shape: [1, N, D]. + * + * Here: + * T - the number of timesteps, + * N - the number of independent streams. + * D - the number of hidden parameters. + * + * Formulas: + * c_cont = c[t-1] * cont[t] + * h_cont = h[t-1] * cont[t] + * i[t] = Sigmoid(x[t] . xw_i + xb_i + h_cont . hw_i) + * f[t] = Sigmoid(x[t] . xw_f + xb_f + h_cont . hw_f) + * o[t] = Sigmoid(x[t] . xw_o + xb_o + h_cont . hw_o) + * g[t] = Tanh(x[t] . xw_g + xb_g + h_cont . hw_g) + * c[t] = c_cont * f[t] + i[t] * g[t] + * h[t] = o[t] * Tanh(c[t]) + * + * Here: + * t -- the timestep (ranges from 1 to T), + * * -- the inner product, + * . -- the Hadamard product (elementwise product). + * + * In this implementation the inner products for all gates are performed as single inner product for + * efficiency. + */ +std::vector +CaffeOpCreator::convertLSTM(const caffe::LayerParameter &layer, + const std::vector &inputs) +{ + const auto ¶ms = layer.recurrent_param(); + + // Inputs to the layer. + auto x = inputs[0]; + auto cont = inputs[1]; + assert(inputs.size() == 2); + + const auto &x_shape = x->getShape(); + const int32_t seq_length = x_shape.dim(0); + const int32_t batch_size = x_shape.dim(1); + const int32_t hidden_size = params.num_output(); + + // Learned parameters of the layer. Tensors are transposed to match the ModelIR. + auto xw = createOp(convertBlob(layer.blobs(0)))->getOutput(0); + auto xb = createOp(convertBlob(layer.blobs(1)))->getOutput(0); + auto hw = createOp(convertBlob(layer.blobs(2)))->getOutput(0); + xw = createOp(xw, std::vector{1, 0})->getOutput(0); + hw = createOp(hw, std::vector{1, 0})->getOutput(0); + + // Add a dummy dimension so that element-wise operations perform properly. + cont = createOp(cont, Shape{seq_length, batch_size, 1})->getOutput(0); + + // Initialize cell and hidden states with zeros. + auto zero_tensor = createZeroedTensor(Shape{1, batch_size, hidden_size}); + auto c_t = createOp(zero_tensor)->getOutput(0); + auto h_t = createOp(zero_tensor)->getOutput(0); + + auto x_xw = createFullyConnected(x, xw, 2); + auto x_xw_b = createOp(x_xw, xb)->getOutput(0); + + // Split input and continuation tensors into seq_length slices. + std::vector x_xw_b_slices = createSplit(x_xw_b, seq_length, 0); + std::vector cont_slices = createSplit(cont, seq_length, 0); + std::vector h_slices(seq_length); + + for (int32_t t = 0; t < seq_length; t++) + { + auto c_cont_t = createOp(c_t, cont_slices[t])->getOutput(0); + auto h_cont_t = createOp(h_t, cont_slices[t])->getOutput(0); + + auto x_xw_b_t = x_xw_b_slices[t]; + auto h_hw_t = createFullyConnected(h_cont_t, hw, 2); + auto activation_inputs_concat = createOp(x_xw_b_t, h_hw_t)->getOutput(0); + auto activation_inputs = createSplit(activation_inputs_concat, 4, 2); + + auto i_t = createOp(activation_inputs[0])->getOutput(0); + auto f_t = createOp(activation_inputs[1])->getOutput(0); + auto o_t = createOp(activation_inputs[2])->getOutput(0); + auto g_t = createOp(activation_inputs[3])->getOutput(0); + + c_t = createOp(createOp(c_cont_t, f_t)->getOutput(0), + createOp(i_t, g_t)->getOutput(0)) + ->getOutput(0); + h_t = createOp(createOp(c_t)->getOutput(0), o_t)->getOutput(0); + + h_slices[t] = h_t; + } + + return {createOp(h_slices, 0)->getOutput(0)}; +} + +} // namespace mir_caffe diff --git a/compiler/mir-caffe-importer/caffe_op_creator.h b/compiler/mir/src/mir_caffe_importer/caffe_op_creator.h similarity index 100% rename from compiler/mir-caffe-importer/caffe_op_creator.h rename to compiler/mir/src/mir_caffe_importer/caffe_op_creator.h diff --git a/compiler/mir-caffe-importer/caffe_op_types.h b/compiler/mir/src/mir_caffe_importer/caffe_op_types.h similarity index 100% rename from compiler/mir-caffe-importer/caffe_op_types.h rename to compiler/mir/src/mir_caffe_importer/caffe_op_types.h diff --git a/compiler/mir/src/mir_onnx_importer/AttributeHelpers.h b/compiler/mir/src/mir_onnx_importer/AttributeHelpers.h new file mode 100644 index 0000000..9a93b5b --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/AttributeHelpers.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MIR_ONNX_ATTRIBUTE_HELPERS_H +#define MIR_ONNX_ATTRIBUTE_HELPERS_H + +#include "onnx/onnx.pb.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace mir_onnx +{ + +template T getAttributeValue(const onnx::AttributeProto &attribute) = delete; + +template <> inline float getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::FLOAT); + return attribute.f(); +} + +template <> inline std::int64_t getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::INT); + return attribute.i(); +} + +template <> inline std::string getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::STRING); + return attribute.s(); +} + +template <> inline onnx::TensorProto getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::TENSOR); + return attribute.t(); +} + +template <> +inline std::vector getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::INTS); + // TODO Check that values fit. + return {attribute.ints().cbegin(), attribute.ints().cend()}; +} + +template <> +inline std::vector getAttributeValue(const onnx::AttributeProto &attribute) +{ + assert(attribute.type() == onnx::AttributeProto::INTS); + return {attribute.ints().cbegin(), attribute.ints().cend()}; +} + +inline const onnx::AttributeProto *findAttribute(const onnx::NodeProto &node, + const std::string &name) +{ + const auto &attributes = node.attribute(); + const auto it = std::find_if( + attributes.cbegin(), attributes.cend(), + [&name](const onnx::AttributeProto &attribute) { return attribute.name() == name; }); + if (it == attributes.cend()) + return nullptr; + return &*it; +} + +template T getAttributeValue(const onnx::NodeProto &node, const std::string &name) +{ + const auto *attribute = findAttribute(node, name); + if (attribute == nullptr) + throw std::runtime_error("Cannot find attribute '" + name + "' in node '" + node.name() + "'."); + return getAttributeValue(*attribute); +} + +template +T getAttributeValue(const onnx::NodeProto &node, const std::string &name, T default_value) +{ + const auto *attribute = findAttribute(node, name); + if (attribute == nullptr) + return default_value; + return getAttributeValue(*attribute); +} + +} // namespace mir_onnx + +#endif // MIR_ONNX_ATTRIBUTE_HELPERS_H diff --git a/compiler/mir/src/mir_onnx_importer/CMakeLists.txt b/compiler/mir/src/mir_onnx_importer/CMakeLists.txt new file mode 100644 index 0000000..e6eb13b --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/CMakeLists.txt @@ -0,0 +1,119 @@ +nnas_find_package(ONNXSource EXACT 1.6.0 QUIET) +nnas_find_package(Protobuf QUIET) + +if (NOT ONNXSource_FOUND) + return() +endif () + +if (NOT Protobuf_FOUND) + return() +endif () + +Protobuf_Generate(MIR_ONNX_PROTO + ${CMAKE_CURRENT_BINARY_DIR}/generated + ${ONNXSource_DIR} + onnx/onnx.proto) + +add_library(mir_onnx_proto STATIC ${MIR_ONNX_PROTO_SOURCES}) +set_target_properties(mir_onnx_proto PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(mir_onnx_proto PUBLIC ${MIR_ONNX_PROTO_INCLUDE_DIRS}) +target_link_libraries(mir_onnx_proto PUBLIC libprotobuf) + +set(MIR_ONNX_IMPORTER_SOURCES + AttributeHelpers.h + ConvPoolHelpers.cpp + ConvPoolHelpers.h + ONNXHelpers.cpp + ONNXHelpers.h + ONNXImporterImpl.cpp + ONNXNodeConverterRegistry.h + ONNXNodeConverterRegistry.cpp + ONNXOpRegistration.h + Op/Abs.cpp + Op/Abs.h + Op/Add.cpp + Op/Add.h + Op/AveragePool.cpp + Op/AveragePool.h + Op/BatchNormalization.cpp + Op/BatchNormalization.h + Op/Concat.cpp + Op/Concat.h + Op/Constant.cpp + Op/Constant.h + Op/Conv.cpp + Op/Conv.h + Op/ConvTranspose.cpp + Op/ConvTranspose.h + Op/Div.cpp + Op/Div.h + Op/Dropout.cpp + Op/Dropout.h + Op/Equal.cpp + Op/Equal.h + Op/Expand.cpp + Op/Expand.h + Op/Flatten.cpp + Op/Flatten.h + Op/Gather.cpp + Op/Gather.h + Op/Greater.cpp + Op/Greater.h + Op/Gemm.cpp + Op/Gemm.h + Op/Identity.cpp + Op/Identity.h + Op/Less.cpp + Op/Less.h + Op/MatMul.cpp + Op/MatMul.h + Op/GlobalAveragePool.cpp + Op/GlobalAveragePool.h + Op/Max.cpp + Op/Max.h + Op/MaxPool.cpp + Op/MaxPool.h + Op/Mul.cpp + Op/Mul.h + Op/Pad.cpp + Op/Pad.h + Op/Reciprocal.cpp + Op/Reciprocal.h + Op/ReduceMean.cpp + Op/ReduceMean.h + Op/Relu.cpp + Op/Relu.h + Op/Reshape.cpp + Op/Reshape.h + Op/Shape.cpp + Op/Shape.h + Op/Sigmoid.cpp + Op/Sigmoid.h + Op/Softmax.cpp + Op/Softmax.h + Op/Sqrt.cpp + Op/Sqrt.h + Op/Sub.cpp + Op/Sub.h + Op/Sum.cpp + Op/Sum.h + Op/Tanh.cpp + Op/Tanh.h + Op/Transpose.cpp + Op/Transpose.h + Op/Unsqueeze.cpp + Op/Unsqueeze.h + Op/Upsample.cpp + Op/Upsample.h) + +add_library(mir_onnx_importer STATIC ${MIR_ONNX_IMPORTER_SOURCES}) +set_target_properties(mir_onnx_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(mir_onnx_importer PUBLIC ../../include/mir_onnx_importer) +target_include_directories(mir_onnx_importer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(mir_onnx_importer PUBLIC mir mir_onnx_proto PRIVATE mir_interpreter nncc_common) + +nnas_find_package(GTest REQUIRED) + +file(GLOB_RECURSE TEST_SOURCES "*.test.cpp") +GTest_AddTest(mir_onnx_importer_test ${TEST_SOURCES}) +target_link_libraries(mir_onnx_importer_test mir_onnx_importer) diff --git a/compiler/mir-onnx-importer/ConvPoolHelpers.cpp b/compiler/mir/src/mir_onnx_importer/ConvPoolHelpers.cpp similarity index 100% rename from compiler/mir-onnx-importer/ConvPoolHelpers.cpp rename to compiler/mir/src/mir_onnx_importer/ConvPoolHelpers.cpp diff --git a/compiler/mir-onnx-importer/ConvPoolHelpers.h b/compiler/mir/src/mir_onnx_importer/ConvPoolHelpers.h similarity index 100% rename from compiler/mir-onnx-importer/ConvPoolHelpers.h rename to compiler/mir/src/mir_onnx_importer/ConvPoolHelpers.h diff --git a/compiler/mir-onnx-importer/ONNXHelpers.cpp b/compiler/mir/src/mir_onnx_importer/ONNXHelpers.cpp similarity index 100% rename from compiler/mir-onnx-importer/ONNXHelpers.cpp rename to compiler/mir/src/mir_onnx_importer/ONNXHelpers.cpp diff --git a/compiler/mir-onnx-importer/ONNXHelpers.h b/compiler/mir/src/mir_onnx_importer/ONNXHelpers.h similarity index 100% rename from compiler/mir-onnx-importer/ONNXHelpers.h rename to compiler/mir/src/mir_onnx_importer/ONNXHelpers.h diff --git a/compiler/mir/src/mir_onnx_importer/ONNXImporterImpl.cpp b/compiler/mir/src/mir_onnx_importer/ONNXImporterImpl.cpp new file mode 100644 index 0000000..8b99624 --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/ONNXImporterImpl.cpp @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ONNXImporterImpl.h" +#include "ONNXHelpers.h" +#include "ONNXOpRegistration.h" +#include "onnx/onnx.pb.h" + +#include "mir/Shape.h" +#include "mir/TensorUtil.h" + +#include "mir/ops/ConstantOp.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace mir_onnx +{ + +namespace +{ + +class ONNXImporterImpl final +{ +public: + ONNXImporterImpl(); + ~ONNXImporterImpl(); + /// @brief Load the model and convert it into a MIR Graph. + std::unique_ptr importModelFromBinaryFile(const std::string &filename); + std::unique_ptr importModelFromTextFile(const std::string &filename); + +private: + std::unique_ptr createIR(); + void createGraphInputs(); + void collectUnsupportedOps(); + std::unique_ptr _model; + std::unique_ptr _converterCtx; + std::unique_ptr _modelCtx; + std::unique_ptr _graph; +}; + +ONNXImporterImpl::ONNXImporterImpl() { registerSupportedOps(); } + +ONNXImporterImpl::~ONNXImporterImpl() = default; + +void loadModelFromBinaryFile(const std::string &filename, onnx::ModelProto *model) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; + + int file_handle = open(filename.c_str(), O_RDONLY); + + if (file_handle == -1) + throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + + "."); + + google::protobuf::io::FileInputStream file_stream(file_handle); + file_stream.SetCloseOnDelete(true); + + google::protobuf::io::CodedInputStream coded_stream(&file_stream); + coded_stream.SetTotalBytesLimit(INT_MAX, INT_MAX); + + if (!model->ParseFromCodedStream(&coded_stream)) + throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); + + // If the file has not been consumed entirely, assume that the file is in the wrong format. + if (!coded_stream.ConsumedEntireMessage()) + throw std::runtime_error("File \"" + filename + "\" has not been consumed entirely."); +} + +void loadModelFromTextFile(const std::string &filename, onnx::ModelProto *model) +{ + GOOGLE_PROTOBUF_VERIFY_VERSION; + + int file_handle = open(filename.c_str(), O_RDONLY); + + if (file_handle == -1) + throw std::runtime_error("Couldn't open file \"" + filename + "\": " + std::strerror(errno) + + "."); + + google::protobuf::io::FileInputStream file_stream(file_handle); + file_stream.SetCloseOnDelete(true); + + if (!google::protobuf::TextFormat::Parse(&file_stream, model)) + throw std::runtime_error("Couldn't parse file \"" + filename + "\"."); +} + +std::unique_ptr ONNXImporterImpl::importModelFromBinaryFile(const std::string &filename) +{ + _model = std::make_unique(); + loadModelFromBinaryFile(filename, _model.get()); + _modelCtx = std::make_unique(_model.get()); + collectUnsupportedOps(); + return createIR(); +} + +std::unique_ptr ONNXImporterImpl::importModelFromTextFile(const std::string &filename) +{ + _model = std::make_unique(); + loadModelFromTextFile(filename, _model.get()); + _modelCtx = std::make_unique(_model.get()); + collectUnsupportedOps(); + return createIR(); +} + +void ONNXImporterImpl::collectUnsupportedOps() +{ + std::set> problems_op_set; + + for (int i = 0; i < _model->graph().node_size(); i++) + { + const auto &onnx_node = _model->graph().node(i); + assert(onnx_node.has_op_type()); + const auto &op_type = onnx_node.op_type(); + auto opset = _modelCtx->getDomainOpsetVersion(onnx_node.domain()); + + NodeConverterRegistry::ConverterFunc converter = + NodeConverterRegistry::getInstance().lookup(op_type, opset); + + if (converter == nullptr) + problems_op_set.emplace(op_type, opset); + } + if (!problems_op_set.empty()) + { + std::cerr << "The following operators are not supported:\n"; + for (const auto &op : problems_op_set) + std::cerr << op.first << " opset " << op.second << std::endl; + throw std::runtime_error("Unsupported operators found"); + } +} + +void ONNXImporterImpl::createGraphInputs() +{ + const auto &graph = _model->graph(); + const auto &initializer = graph.initializer(); + + // Create all initializer Tensors + for (const auto &tensor : initializer) + { + const auto mir_tensor = createTensor(&tensor); + auto *op = _graph->create(mir_tensor); + _converterCtx->setOutput(tensor.name(), op->getOutput(0)); + } + + for (const auto &input : graph.input()) + { + assert(input.has_name()); + + if (_converterCtx->getOutput(input.name()) == nullptr) + { + const auto &onnx_input_shape = input.type().tensor_type().shape(); + mir::Shape shape(onnx_input_shape.dim_size()); + for (int i = 0; i < onnx_input_shape.dim_size(); i++) + { + assert(onnx_input_shape.dim(i).has_dim_value()); + shape.dim(i) = static_cast(onnx_input_shape.dim(i).dim_value()); + } + + auto elem_type = onnxDataTypeToMirDataType( + (onnx::TensorProto_DataType)input.type().tensor_type().elem_type()); + mir::TensorType type{elem_type, shape}; + auto *op = _graph->create(type); + _converterCtx->setOutput(input.name(), op->getOutput(0)); + } + } +} + +std::unique_ptr ONNXImporterImpl::createIR() +{ + _graph = std::make_unique(); + _converterCtx = std::make_unique(_graph.get()); + + createGraphInputs(); + + // Forming partially ordered computation graph + for (const auto &onnx_node : _model->graph().node()) + { + assert(onnx_node.has_op_type()); + auto &op_type = onnx_node.op_type(); + auto opset = _modelCtx->getDomainOpsetVersion(onnx_node.domain()); + // Get converter + NodeConverterRegistry::ConverterFunc converter = + NodeConverterRegistry::getInstance().lookup(op_type, opset); + assert(converter != nullptr); + converter(onnx_node, _converterCtx.get()); + } + // Set graph outputs + const auto &outputs = _model->graph().output(); + for (const auto &output : outputs) + { + assert(output.has_name()); + auto mir_output = _converterCtx->getOutput(output.name()); + if (mir_output == nullptr) + throw std::runtime_error("Bad output name!"); + + _graph->create(mir_output); + } + + return std::move(_graph); +} + +} // namespace + +std::unique_ptr importModelFromBinaryFile(const std::string &filename) +{ + ONNXImporterImpl importer; + return importer.importModelFromBinaryFile(filename); +} + +std::unique_ptr importModelFromTextFile(const std::string &filename) +{ + ONNXImporterImpl importer; + return importer.importModelFromTextFile(filename); +} + +std::unique_ptr loadModel(const std::string &filename) +{ + return importModelFromBinaryFile(filename); +} + +} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/ONNXNodeConverterRegistry.cpp b/compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.cpp similarity index 100% rename from compiler/mir-onnx-importer/ONNXNodeConverterRegistry.cpp rename to compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.cpp diff --git a/compiler/mir-onnx-importer/ONNXNodeConverterRegistry.h b/compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.h similarity index 100% rename from compiler/mir-onnx-importer/ONNXNodeConverterRegistry.h rename to compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.h diff --git a/compiler/mir-onnx-importer/ONNXNodeConverterRegistry.test.cpp b/compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.test.cpp similarity index 100% rename from compiler/mir-onnx-importer/ONNXNodeConverterRegistry.test.cpp rename to compiler/mir/src/mir_onnx_importer/ONNXNodeConverterRegistry.test.cpp diff --git a/compiler/mir-onnx-importer/ONNXOpRegistration.h b/compiler/mir/src/mir_onnx_importer/ONNXOpRegistration.h similarity index 100% rename from compiler/mir-onnx-importer/ONNXOpRegistration.h rename to compiler/mir/src/mir_onnx_importer/ONNXOpRegistration.h diff --git a/compiler/mir-onnx-importer/Op/Abs.cpp b/compiler/mir/src/mir_onnx_importer/Op/Abs.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Abs.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Abs.cpp diff --git a/compiler/mir-onnx-importer/Op/Abs.h b/compiler/mir/src/mir_onnx_importer/Op/Abs.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Abs.h rename to compiler/mir/src/mir_onnx_importer/Op/Abs.h diff --git a/compiler/mir-onnx-importer/Op/Add.cpp b/compiler/mir/src/mir_onnx_importer/Op/Add.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Add.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Add.cpp diff --git a/compiler/mir-onnx-importer/Op/Add.h b/compiler/mir/src/mir_onnx_importer/Op/Add.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Add.h rename to compiler/mir/src/mir_onnx_importer/Op/Add.h diff --git a/compiler/mir-onnx-importer/Op/AveragePool.cpp b/compiler/mir/src/mir_onnx_importer/Op/AveragePool.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/AveragePool.cpp rename to compiler/mir/src/mir_onnx_importer/Op/AveragePool.cpp diff --git a/compiler/mir-onnx-importer/Op/AveragePool.h b/compiler/mir/src/mir_onnx_importer/Op/AveragePool.h similarity index 100% rename from compiler/mir-onnx-importer/Op/AveragePool.h rename to compiler/mir/src/mir_onnx_importer/Op/AveragePool.h diff --git a/compiler/mir-onnx-importer/Op/BatchNormalization.cpp b/compiler/mir/src/mir_onnx_importer/Op/BatchNormalization.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/BatchNormalization.cpp rename to compiler/mir/src/mir_onnx_importer/Op/BatchNormalization.cpp diff --git a/compiler/mir-onnx-importer/Op/BatchNormalization.h b/compiler/mir/src/mir_onnx_importer/Op/BatchNormalization.h similarity index 100% rename from compiler/mir-onnx-importer/Op/BatchNormalization.h rename to compiler/mir/src/mir_onnx_importer/Op/BatchNormalization.h diff --git a/compiler/mir-onnx-importer/Op/Concat.cpp b/compiler/mir/src/mir_onnx_importer/Op/Concat.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Concat.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Concat.cpp diff --git a/compiler/mir-onnx-importer/Op/Concat.h b/compiler/mir/src/mir_onnx_importer/Op/Concat.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Concat.h rename to compiler/mir/src/mir_onnx_importer/Op/Concat.h diff --git a/compiler/mir-onnx-importer/Op/Constant.cpp b/compiler/mir/src/mir_onnx_importer/Op/Constant.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Constant.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Constant.cpp diff --git a/compiler/mir-onnx-importer/Op/Constant.h b/compiler/mir/src/mir_onnx_importer/Op/Constant.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Constant.h rename to compiler/mir/src/mir_onnx_importer/Op/Constant.h diff --git a/compiler/mir-onnx-importer/Op/Conv.cpp b/compiler/mir/src/mir_onnx_importer/Op/Conv.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Conv.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Conv.cpp diff --git a/compiler/mir-onnx-importer/Op/Conv.h b/compiler/mir/src/mir_onnx_importer/Op/Conv.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Conv.h rename to compiler/mir/src/mir_onnx_importer/Op/Conv.h diff --git a/compiler/mir-onnx-importer/Op/ConvTranspose.cpp b/compiler/mir/src/mir_onnx_importer/Op/ConvTranspose.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/ConvTranspose.cpp rename to compiler/mir/src/mir_onnx_importer/Op/ConvTranspose.cpp diff --git a/compiler/mir-onnx-importer/Op/ConvTranspose.h b/compiler/mir/src/mir_onnx_importer/Op/ConvTranspose.h similarity index 100% rename from compiler/mir-onnx-importer/Op/ConvTranspose.h rename to compiler/mir/src/mir_onnx_importer/Op/ConvTranspose.h diff --git a/compiler/mir-onnx-importer/Op/Div.cpp b/compiler/mir/src/mir_onnx_importer/Op/Div.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Div.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Div.cpp diff --git a/compiler/mir-onnx-importer/Op/Div.h b/compiler/mir/src/mir_onnx_importer/Op/Div.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Div.h rename to compiler/mir/src/mir_onnx_importer/Op/Div.h diff --git a/compiler/mir-onnx-importer/Op/Dropout.cpp b/compiler/mir/src/mir_onnx_importer/Op/Dropout.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Dropout.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Dropout.cpp diff --git a/compiler/mir-onnx-importer/Op/Dropout.h b/compiler/mir/src/mir_onnx_importer/Op/Dropout.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Dropout.h rename to compiler/mir/src/mir_onnx_importer/Op/Dropout.h diff --git a/compiler/mir-onnx-importer/Op/Equal.cpp b/compiler/mir/src/mir_onnx_importer/Op/Equal.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Equal.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Equal.cpp diff --git a/compiler/mir-onnx-importer/Op/Equal.h b/compiler/mir/src/mir_onnx_importer/Op/Equal.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Equal.h rename to compiler/mir/src/mir_onnx_importer/Op/Equal.h diff --git a/compiler/mir-onnx-importer/Op/Expand.cpp b/compiler/mir/src/mir_onnx_importer/Op/Expand.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Expand.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Expand.cpp diff --git a/compiler/mir-onnx-importer/Op/Expand.h b/compiler/mir/src/mir_onnx_importer/Op/Expand.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Expand.h rename to compiler/mir/src/mir_onnx_importer/Op/Expand.h diff --git a/compiler/mir-onnx-importer/Op/Flatten.cpp b/compiler/mir/src/mir_onnx_importer/Op/Flatten.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Flatten.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Flatten.cpp diff --git a/compiler/mir-onnx-importer/Op/Flatten.h b/compiler/mir/src/mir_onnx_importer/Op/Flatten.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Flatten.h rename to compiler/mir/src/mir_onnx_importer/Op/Flatten.h diff --git a/compiler/mir-onnx-importer/Op/Gather.cpp b/compiler/mir/src/mir_onnx_importer/Op/Gather.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Gather.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Gather.cpp diff --git a/compiler/mir-onnx-importer/Op/Gather.h b/compiler/mir/src/mir_onnx_importer/Op/Gather.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Gather.h rename to compiler/mir/src/mir_onnx_importer/Op/Gather.h diff --git a/compiler/mir-onnx-importer/Op/Gemm.cpp b/compiler/mir/src/mir_onnx_importer/Op/Gemm.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Gemm.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Gemm.cpp diff --git a/compiler/mir-onnx-importer/Op/Gemm.h b/compiler/mir/src/mir_onnx_importer/Op/Gemm.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Gemm.h rename to compiler/mir/src/mir_onnx_importer/Op/Gemm.h diff --git a/compiler/mir-onnx-importer/Op/GlobalAveragePool.cpp b/compiler/mir/src/mir_onnx_importer/Op/GlobalAveragePool.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/GlobalAveragePool.cpp rename to compiler/mir/src/mir_onnx_importer/Op/GlobalAveragePool.cpp diff --git a/compiler/mir-onnx-importer/Op/GlobalAveragePool.h b/compiler/mir/src/mir_onnx_importer/Op/GlobalAveragePool.h similarity index 100% rename from compiler/mir-onnx-importer/Op/GlobalAveragePool.h rename to compiler/mir/src/mir_onnx_importer/Op/GlobalAveragePool.h diff --git a/compiler/mir-onnx-importer/Op/Greater.cpp b/compiler/mir/src/mir_onnx_importer/Op/Greater.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Greater.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Greater.cpp diff --git a/compiler/mir-onnx-importer/Op/Greater.h b/compiler/mir/src/mir_onnx_importer/Op/Greater.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Greater.h rename to compiler/mir/src/mir_onnx_importer/Op/Greater.h diff --git a/compiler/mir-onnx-importer/Op/Identity.cpp b/compiler/mir/src/mir_onnx_importer/Op/Identity.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Identity.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Identity.cpp diff --git a/compiler/mir-onnx-importer/Op/Identity.h b/compiler/mir/src/mir_onnx_importer/Op/Identity.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Identity.h rename to compiler/mir/src/mir_onnx_importer/Op/Identity.h diff --git a/compiler/mir-onnx-importer/Op/Less.cpp b/compiler/mir/src/mir_onnx_importer/Op/Less.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Less.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Less.cpp diff --git a/compiler/mir-onnx-importer/Op/Less.h b/compiler/mir/src/mir_onnx_importer/Op/Less.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Less.h rename to compiler/mir/src/mir_onnx_importer/Op/Less.h diff --git a/compiler/mir-onnx-importer/Op/MatMul.cpp b/compiler/mir/src/mir_onnx_importer/Op/MatMul.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/MatMul.cpp rename to compiler/mir/src/mir_onnx_importer/Op/MatMul.cpp diff --git a/compiler/mir-onnx-importer/Op/MatMul.h b/compiler/mir/src/mir_onnx_importer/Op/MatMul.h similarity index 100% rename from compiler/mir-onnx-importer/Op/MatMul.h rename to compiler/mir/src/mir_onnx_importer/Op/MatMul.h diff --git a/compiler/mir-onnx-importer/Op/Max.cpp b/compiler/mir/src/mir_onnx_importer/Op/Max.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Max.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Max.cpp diff --git a/compiler/mir-onnx-importer/Op/Max.h b/compiler/mir/src/mir_onnx_importer/Op/Max.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Max.h rename to compiler/mir/src/mir_onnx_importer/Op/Max.h diff --git a/compiler/mir-onnx-importer/Op/MaxPool.cpp b/compiler/mir/src/mir_onnx_importer/Op/MaxPool.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/MaxPool.cpp rename to compiler/mir/src/mir_onnx_importer/Op/MaxPool.cpp diff --git a/compiler/mir-onnx-importer/Op/MaxPool.h b/compiler/mir/src/mir_onnx_importer/Op/MaxPool.h similarity index 100% rename from compiler/mir-onnx-importer/Op/MaxPool.h rename to compiler/mir/src/mir_onnx_importer/Op/MaxPool.h diff --git a/compiler/mir-onnx-importer/Op/Mul.cpp b/compiler/mir/src/mir_onnx_importer/Op/Mul.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Mul.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Mul.cpp diff --git a/compiler/mir-onnx-importer/Op/Mul.h b/compiler/mir/src/mir_onnx_importer/Op/Mul.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Mul.h rename to compiler/mir/src/mir_onnx_importer/Op/Mul.h diff --git a/compiler/mir/src/mir_onnx_importer/Op/Pad.cpp b/compiler/mir/src/mir_onnx_importer/Op/Pad.cpp new file mode 100644 index 0000000..08d7c4a --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/Op/Pad.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Pad.h" + +#include "ONNXHelpers.h" +#include "AttributeHelpers.h" + +#include "mir/ops/PadOp.h" + +namespace mir_onnx +{ + +void convertPadAttrName(const std::string &pad_attr_name, const onnx::NodeProto &onnx_node, + ConverterContext *context) +{ + std::vector inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + // 0.0f is the default value to be filled into padded cells. + const auto value = getAttributeValue(onnx_node, "value", 0.0f); + const auto pads = getAttributeValue>(onnx_node, pad_attr_name); + // "constant" is the default mode. + const auto mode = getAttributeValue(onnx_node, "mode", "constant"); + if (mode != "constant") + throw std::runtime_error("Not supported Pad mode attribute!"); + + const int num_dims = input->getShape().rank(); + assert(static_cast(pads.size()) == num_dims * 2); + mir::PadOpAttributes attributes(num_dims); + for (int i = 0; i < num_dims; i++) + { + attributes.padding_before[i] = pads[i]; + attributes.padding_after[i] = pads[num_dims + i]; + } + + attributes.padding_value = value; + + auto result = createOp(graph, input, attributes)->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +void convertPadV1(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + convertPadAttrName("paddings", onnx_node, context); +} + +void convertPadV2(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + convertPadAttrName("pads", onnx_node, context); +} + +} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Pad.h b/compiler/mir/src/mir_onnx_importer/Op/Pad.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Pad.h rename to compiler/mir/src/mir_onnx_importer/Op/Pad.h diff --git a/compiler/mir-onnx-importer/Op/Reciprocal.cpp b/compiler/mir/src/mir_onnx_importer/Op/Reciprocal.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Reciprocal.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Reciprocal.cpp diff --git a/compiler/mir-onnx-importer/Op/Reciprocal.h b/compiler/mir/src/mir_onnx_importer/Op/Reciprocal.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Reciprocal.h rename to compiler/mir/src/mir_onnx_importer/Op/Reciprocal.h diff --git a/compiler/mir-onnx-importer/Op/ReduceMean.cpp b/compiler/mir/src/mir_onnx_importer/Op/ReduceMean.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/ReduceMean.cpp rename to compiler/mir/src/mir_onnx_importer/Op/ReduceMean.cpp diff --git a/compiler/mir-onnx-importer/Op/ReduceMean.h b/compiler/mir/src/mir_onnx_importer/Op/ReduceMean.h similarity index 100% rename from compiler/mir-onnx-importer/Op/ReduceMean.h rename to compiler/mir/src/mir_onnx_importer/Op/ReduceMean.h diff --git a/compiler/mir-onnx-importer/Op/Relu.cpp b/compiler/mir/src/mir_onnx_importer/Op/Relu.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Relu.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Relu.cpp diff --git a/compiler/mir-onnx-importer/Op/Relu.h b/compiler/mir/src/mir_onnx_importer/Op/Relu.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Relu.h rename to compiler/mir/src/mir_onnx_importer/Op/Relu.h diff --git a/compiler/mir-onnx-importer/Op/Reshape.cpp b/compiler/mir/src/mir_onnx_importer/Op/Reshape.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Reshape.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Reshape.cpp diff --git a/compiler/mir-onnx-importer/Op/Reshape.h b/compiler/mir/src/mir_onnx_importer/Op/Reshape.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Reshape.h rename to compiler/mir/src/mir_onnx_importer/Op/Reshape.h diff --git a/compiler/mir-onnx-importer/Op/Shape.cpp b/compiler/mir/src/mir_onnx_importer/Op/Shape.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Shape.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Shape.cpp diff --git a/compiler/mir-onnx-importer/Op/Shape.h b/compiler/mir/src/mir_onnx_importer/Op/Shape.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Shape.h rename to compiler/mir/src/mir_onnx_importer/Op/Shape.h diff --git a/compiler/mir-onnx-importer/Op/Sigmoid.cpp b/compiler/mir/src/mir_onnx_importer/Op/Sigmoid.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Sigmoid.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Sigmoid.cpp diff --git a/compiler/mir-onnx-importer/Op/Sigmoid.h b/compiler/mir/src/mir_onnx_importer/Op/Sigmoid.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Sigmoid.h rename to compiler/mir/src/mir_onnx_importer/Op/Sigmoid.h diff --git a/compiler/mir-onnx-importer/Op/Softmax.cpp b/compiler/mir/src/mir_onnx_importer/Op/Softmax.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Softmax.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Softmax.cpp diff --git a/compiler/mir-onnx-importer/Op/Softmax.h b/compiler/mir/src/mir_onnx_importer/Op/Softmax.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Softmax.h rename to compiler/mir/src/mir_onnx_importer/Op/Softmax.h diff --git a/compiler/mir-onnx-importer/Op/Sqrt.cpp b/compiler/mir/src/mir_onnx_importer/Op/Sqrt.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Sqrt.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Sqrt.cpp diff --git a/compiler/mir-onnx-importer/Op/Sqrt.h b/compiler/mir/src/mir_onnx_importer/Op/Sqrt.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Sqrt.h rename to compiler/mir/src/mir_onnx_importer/Op/Sqrt.h diff --git a/compiler/mir-onnx-importer/Op/Sub.cpp b/compiler/mir/src/mir_onnx_importer/Op/Sub.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Sub.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Sub.cpp diff --git a/compiler/mir-onnx-importer/Op/Sub.h b/compiler/mir/src/mir_onnx_importer/Op/Sub.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Sub.h rename to compiler/mir/src/mir_onnx_importer/Op/Sub.h diff --git a/compiler/mir-onnx-importer/Op/Sum.cpp b/compiler/mir/src/mir_onnx_importer/Op/Sum.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Sum.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Sum.cpp diff --git a/compiler/mir-onnx-importer/Op/Sum.h b/compiler/mir/src/mir_onnx_importer/Op/Sum.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Sum.h rename to compiler/mir/src/mir_onnx_importer/Op/Sum.h diff --git a/compiler/mir-onnx-importer/Op/Tanh.cpp b/compiler/mir/src/mir_onnx_importer/Op/Tanh.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Tanh.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Tanh.cpp diff --git a/compiler/mir-onnx-importer/Op/Tanh.h b/compiler/mir/src/mir_onnx_importer/Op/Tanh.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Tanh.h rename to compiler/mir/src/mir_onnx_importer/Op/Tanh.h diff --git a/compiler/mir/src/mir_onnx_importer/Op/Transpose.cpp b/compiler/mir/src/mir_onnx_importer/Op/Transpose.cpp new file mode 100644 index 0000000..ffe0e84 --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/Op/Transpose.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Transpose.h" +#include "ONNXHelpers.h" +#include "AttributeHelpers.h" + +#include "mir/ops/TransposeOp.h" + +#include + +namespace mir_onnx +{ + +void convertTransposeV1(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + const auto inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + assert(inputs.size() == 1); + auto input = inputs[0]; + + const int num_axes = input->getShape().rank(); + std::vector axis_order(num_axes); + const auto *perm_attr = findAttribute(onnx_node, "perm"); + + if (perm_attr == nullptr) + { + // Reverse the dimensions. + std::iota(axis_order.rbegin(), axis_order.rend(), 0); + } + else + { + const auto perm = getAttributeValue>(*perm_attr); + assert(static_cast(perm.size()) == num_axes); + std::copy(perm.cbegin(), perm.cend(), axis_order.begin()); + } + + auto result = createOp(graph, input, axis_order)->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Transpose.h b/compiler/mir/src/mir_onnx_importer/Op/Transpose.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Transpose.h rename to compiler/mir/src/mir_onnx_importer/Op/Transpose.h diff --git a/compiler/mir-onnx-importer/Op/Unsqueeze.cpp b/compiler/mir/src/mir_onnx_importer/Op/Unsqueeze.cpp similarity index 100% rename from compiler/mir-onnx-importer/Op/Unsqueeze.cpp rename to compiler/mir/src/mir_onnx_importer/Op/Unsqueeze.cpp diff --git a/compiler/mir-onnx-importer/Op/Unsqueeze.h b/compiler/mir/src/mir_onnx_importer/Op/Unsqueeze.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Unsqueeze.h rename to compiler/mir/src/mir_onnx_importer/Op/Unsqueeze.h diff --git a/compiler/mir/src/mir_onnx_importer/Op/Upsample.cpp b/compiler/mir/src/mir_onnx_importer/Op/Upsample.cpp new file mode 100644 index 0000000..346e22c --- /dev/null +++ b/compiler/mir/src/mir_onnx_importer/Op/Upsample.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Upsample.h" + +#include "ONNXHelpers.h" +#include "AttributeHelpers.h" + +#include "mir/Tensor.h" + +#include "mir/ops/ConstantOp.h" +#include "mir/ops/ResizeOp.h" + +#include + +namespace mir_onnx +{ + +void convertUpsampleV1(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + std::vector inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + // "nearest" is the default mode. + std::string mode = getAttributeValue(onnx_node, "mode", "nearest"); + assert(mode == "nearest" && "Unsupported upscale mode!"); + + const float h_scale = getAttributeValue(onnx_node, "height_scale", 0.0f); // required + const float w_scale = getAttributeValue(onnx_node, "width_scale", 0.0f); // required + if (h_scale < 1.0f || w_scale < 1.0f) + throw std::runtime_error("Wrong scale attributes!"); + + assert(inputs[0]->getShape().rank() == 4 && "Only rank 4 is supported"); + std::vector scales_vector(4); + // NCHW + scales_vector.at(0) = 1.0f; + scales_vector.at(1) = 1.0f; + scales_vector.at(2) = h_scale; + scales_vector.at(3) = w_scale; + + auto result = + createOp(graph, inputs[0], + mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) + ->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +void convertUpsampleV7(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + std::vector inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + // "nearest" is the default mode. + std::string mode = getAttributeValue(onnx_node, "mode", "nearest"); + assert(mode == "nearest" && "Unsupported upscale mode!"); + + const auto *scales_attr = findAttribute(onnx_node, "scales"); + if (!scales_attr) + throw std::runtime_error("Not enough required scales attribute!"); + + if (scales_attr->floats_size() != inputs[0]->getShape().rank()) + throw std::runtime_error( + "Number of elements of scales should be the same as the rank of input"); + + assert(inputs[0]->getShape().rank() == 4 && "Only rank 4 is supported"); + std::vector scales_vector(4); + // NCHW + scales_vector.at(0) = scales_attr->floats(0); + scales_vector.at(1) = scales_attr->floats(1); + scales_vector.at(2) = scales_attr->floats(2); + scales_vector.at(3) = scales_attr->floats(3); + + auto result = + createOp(graph, inputs[0], + mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) + ->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +void convertUpsampleV9(const onnx::NodeProto &onnx_node, ConverterContext *context) +{ + std::vector inputs = context->getNodeInputs(onnx_node); + mir::Graph *graph = context->getGraph(); + + // "nearest" is the default mode. + const auto mode = getAttributeValue(onnx_node, "mode", "nearest"); + if (mode != "nearest") + throw std::runtime_error("Upsample: only 'nearest' mode is supported."); + + // relies on attributes being lifted to constants (ONNX optimization pass) + assert(inputs.size() > 1); + auto *scales = dynamic_cast(inputs[1]->getNode()); + assert(scales && "Weights could be a constant tensor only"); + auto scales_tensor = mir::Tensor(scales->getValue()); + int rank = inputs[0]->getShape().rank(); + if (rank != 4) + throw std::runtime_error("Upsample: only 4-D input is supported."); + assert(scales_tensor.getShape().numElements() == rank && + "The number of elements of 'scales' should be the same as the rank of input 'X'"); + std::vector scales_vector(rank); + for (int i = 0; i < scales_tensor.getShape().numElements(); i++) + scales_vector[i] = scales_tensor.atOffset(i); + + auto result = + createOp(graph, inputs[0], + mir::ops::ResizeOp::ResizeMethod::nearestNeighbor, scales_vector) + ->getOutput(0); + + context->setNodeOutputs(onnx_node, {result}); +} + +} // namespace mir_onnx diff --git a/compiler/mir-onnx-importer/Op/Upsample.h b/compiler/mir/src/mir_onnx_importer/Op/Upsample.h similarity index 100% rename from compiler/mir-onnx-importer/Op/Upsample.h rename to compiler/mir/src/mir_onnx_importer/Op/Upsample.h diff --git a/compiler/mir/src/mir_tflite_importer/CMakeLists.txt b/compiler/mir/src/mir_tflite_importer/CMakeLists.txt new file mode 100644 index 0000000..952857c --- /dev/null +++ b/compiler/mir/src/mir_tflite_importer/CMakeLists.txt @@ -0,0 +1,21 @@ +nnas_find_package(FlatBuffers REQUIRED) + +if (NOT FlatBuffers_FOUND) + return() +endif () + +FlatBuffers_Target(mir_tflite_schema + OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/schema" + SCHEMA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/schema" + SCHEMA_FILES schema.fbs) + + +set(MIR_TFLITE_IMPORTER_SOURCES + tflite_importer.cpp + tflite_op_creator.cpp + tflite_op_creator.h) + +add_library(mir_tflite_importer STATIC ${MIR_TFLITE_IMPORTER_SOURCES}) +set_target_properties(mir_tflite_importer PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(mir_tflite_importer PUBLIC ../../include/mir_tflite_importer) +target_link_libraries(mir_tflite_importer PUBLIC mir PRIVATE mir_tflite_schema nncc_common) diff --git a/compiler/mir-tflite-importer/schema/schema.fbs b/compiler/mir/src/mir_tflite_importer/schema/schema.fbs similarity index 100% rename from compiler/mir-tflite-importer/schema/schema.fbs rename to compiler/mir/src/mir_tflite_importer/schema/schema.fbs diff --git a/compiler/mir-tflite-importer/schema/schema.meta b/compiler/mir/src/mir_tflite_importer/schema/schema.meta similarity index 100% rename from compiler/mir-tflite-importer/schema/schema.meta rename to compiler/mir/src/mir_tflite_importer/schema/schema.meta diff --git a/compiler/mir-tflite-importer/schema/schema_v0.fbs b/compiler/mir/src/mir_tflite_importer/schema/schema_v0.fbs similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v0.fbs rename to compiler/mir/src/mir_tflite_importer/schema/schema_v0.fbs diff --git a/compiler/mir-tflite-importer/schema/schema_v0.meta b/compiler/mir/src/mir_tflite_importer/schema/schema_v0.meta similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v0.meta rename to compiler/mir/src/mir_tflite_importer/schema/schema_v0.meta diff --git a/compiler/mir-tflite-importer/schema/schema_v1.fbs b/compiler/mir/src/mir_tflite_importer/schema/schema_v1.fbs similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v1.fbs rename to compiler/mir/src/mir_tflite_importer/schema/schema_v1.fbs diff --git a/compiler/mir-tflite-importer/schema/schema_v1.meta b/compiler/mir/src/mir_tflite_importer/schema/schema_v1.meta similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v1.meta rename to compiler/mir/src/mir_tflite_importer/schema/schema_v1.meta diff --git a/compiler/mir-tflite-importer/schema/schema_v2.fbs b/compiler/mir/src/mir_tflite_importer/schema/schema_v2.fbs similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v2.fbs rename to compiler/mir/src/mir_tflite_importer/schema/schema_v2.fbs diff --git a/compiler/mir-tflite-importer/schema/schema_v2.meta b/compiler/mir/src/mir_tflite_importer/schema/schema_v2.meta similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v2.meta rename to compiler/mir/src/mir_tflite_importer/schema/schema_v2.meta diff --git a/compiler/mir-tflite-importer/schema/schema_v3.fbs b/compiler/mir/src/mir_tflite_importer/schema/schema_v3.fbs similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v3.fbs rename to compiler/mir/src/mir_tflite_importer/schema/schema_v3.fbs diff --git a/compiler/mir-tflite-importer/schema/schema_v3.meta b/compiler/mir/src/mir_tflite_importer/schema/schema_v3.meta similarity index 100% rename from compiler/mir-tflite-importer/schema/schema_v3.meta rename to compiler/mir/src/mir_tflite_importer/schema/schema_v3.meta diff --git a/compiler/mir/src/mir_tflite_importer/tflite_importer.cpp b/compiler/mir/src/mir_tflite_importer/tflite_importer.cpp new file mode 100644 index 0000000..3f245d2 --- /dev/null +++ b/compiler/mir/src/mir_tflite_importer/tflite_importer.cpp @@ -0,0 +1,428 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite_importer.h" +#include "tflite_op_creator.h" +#include "schema_generated.h" + +#include "mir/TensorVariant.h" +#include "mir/ops/ConstantOp.h" +#include "mir/ops/OutputOp.h" + +#include +#include +#include +#include +#include + +namespace mir_tflite +{ + +namespace +{ + +class TfliteImporter +{ +public: + explicit TfliteImporter(std::string filename); + + /// @brief Load the model and convert it into a MIR Graph. + std::unique_ptr importModel(); + + ~TfliteImporter(); + +private: + std::string _filename; + std::unique_ptr _model; + + std::unique_ptr _graph; + std::unique_ptr _opCreator; + + // Maps TFLite tensors indices to corresponding MIR operation outputs. + std::vector _tensorMap; + + void import(); + + void walkModel(const tflite::ModelT *model); + + void walkSubgraph(const tflite::SubGraphT *subgraph); + + void walkOperator(const tflite::SubGraphT *subgraph, const tflite::OperatorT *op); + + /** + * @brief Pass through tflite graph and collect operators unsupported by NNC + * @throw PassException with message, containing detected problems + */ + void collectUnsupportedOps(); + + /** + * @brief Returns MIR operation outputs corresponding to the inputs of the given operator. + */ + std::vector getMIRInputsForOperator(const tflite::SubGraphT *subgraph, + const tflite::OperatorT *op); +}; + +TfliteImporter::TfliteImporter(std::string filename) : _filename(std::move(filename)) +{ + _graph = std::make_unique(); + _opCreator = std::make_unique(_graph.get()); +} + +TfliteImporter::~TfliteImporter() = default; + +void TfliteImporter::import() +{ + std::ifstream stream(_filename, std::ios::in | std::ios::binary); + if (stream.fail()) + throw std::runtime_error("Couldn't open file \"" + _filename + "\"."); + + std::vector model_buffer((std::istreambuf_iterator(stream)), + std::istreambuf_iterator()); + + if (stream.fail()) + throw std::runtime_error("Couldn't read file \"" + _filename + "\"."); + + flatbuffers::Verifier verifier(reinterpret_cast(model_buffer.data()), + model_buffer.size()); + + if (!tflite::VerifyModelBuffer(verifier)) + throw std::runtime_error("Could not load model: " + _filename + "\n"); + + _model = tflite::UnPackModel(model_buffer.data()); +} + +static const std::set supportedOperators = { + tflite::BuiltinOperator_ADD, + tflite::BuiltinOperator_AVERAGE_POOL_2D, + tflite::BuiltinOperator_CONCATENATION, + tflite::BuiltinOperator_CONV_2D, + tflite::BuiltinOperator_DEPTHWISE_CONV_2D, + tflite::BuiltinOperator_DIV, + tflite::BuiltinOperator_FULLY_CONNECTED, + tflite::BuiltinOperator_HARD_SWISH, + tflite::BuiltinOperator_LEAKY_RELU, + tflite::BuiltinOperator_LOGISTIC, + tflite::BuiltinOperator_MAX_POOL_2D, + tflite::BuiltinOperator_MAXIMUM, + tflite::BuiltinOperator_MEAN, + tflite::BuiltinOperator_MUL, + tflite::BuiltinOperator_PAD, + tflite::BuiltinOperator_RELU, + tflite::BuiltinOperator_RELU6, + tflite::BuiltinOperator_RESHAPE, + tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, + tflite::BuiltinOperator_RSQRT, + tflite::BuiltinOperator_SHAPE, + tflite::BuiltinOperator_SLICE, + tflite::BuiltinOperator_SOFTMAX, + tflite::BuiltinOperator_SQRT, + tflite::BuiltinOperator_SQUARED_DIFFERENCE, + tflite::BuiltinOperator_SQUEEZE, + tflite::BuiltinOperator_STRIDED_SLICE, + tflite::BuiltinOperator_SUB, + tflite::BuiltinOperator_TANH, + tflite::BuiltinOperator_TRANSPOSE, + tflite::BuiltinOperator_TRANSPOSE_CONV, +}; + +void TfliteImporter::collectUnsupportedOps() +{ + std::set errors; + for (const auto &subgraph : _model->subgraphs) + for (const auto &op : subgraph->operators) + { + tflite::BuiltinOperator opcode = _model->operator_codes[op->opcode_index]->builtin_code; + if (supportedOperators.find(opcode) == supportedOperators.end()) + { + if (opcode <= tflite::BuiltinOperator_MAX) + errors.insert(std::string(EnumNameBuiltinOperator(opcode)) + ": unsupported operator"); + else + errors.insert(std::to_string(opcode) + ": unsuppored in tflite custom opcode"); + } + } + + if (!errors.empty()) + { + std::string msg("NNC can't load model. Detected problems:"); + for (const auto &e : errors) + msg.append("\n * " + e); + throw std::runtime_error(msg); + } +} + +std::unique_ptr TfliteImporter::importModel() +{ + import(); + collectUnsupportedOps(); + walkModel(_model.get()); + return std::move(_graph); +} + +void TfliteImporter::walkModel(const tflite::ModelT *model) +{ + for (const auto &subgraph : model->subgraphs) + walkSubgraph(subgraph.get()); +} + +mir::DataType convertElementType(tflite::TensorType type) +{ + switch (type) + { + case tflite::TensorType_INT32: + return mir::DataType::INT32; + case tflite::TensorType_FLOAT32: + return mir::DataType::FLOAT32; + case tflite::TensorType_INT64: + return mir::DataType::INT64; + case tflite::TensorType_UINT8: + return mir::DataType::UINT8; + default: + throw std::runtime_error(std::string("Unsupported tensor type: ") + EnumNameTensorType(type)); + } +} + +mir::TensorType getMirTensorType(const tflite::TensorT &tensor) +{ + mir::DataType element_type = convertElementType(tensor.type); + + mir::Shape shape(tensor.shape.size()); + for (std::size_t i = 0; i < tensor.shape.size(); ++i) + { + shape.dim(i) = tensor.shape[i]; + } + + if (tensor.quantization != nullptr) + { + const tflite::QuantizationParametersT ¶ms = *tensor.quantization; + + if (params.details.type != tflite::QuantizationDetails_NONE) + throw std::runtime_error("Custom quantization is not supported."); + + // Empty parameters mean no quantization at all. + if (params.scale.empty() && params.zero_point.empty()) + return mir::TensorType{element_type, shape}; + + if (params.scale.size() != 1 || params.zero_point.size() != 1) + throw std::runtime_error("Non-scalar quantization is not supported."); + + mir::AffineQuantization quantization{params.scale[0], static_cast(params.zero_point[0])}; + + return mir::TensorType{element_type, shape, quantization}; + } + else + { + return mir::TensorType{element_type, shape}; + } +} + +void TfliteImporter::walkSubgraph(const tflite::SubGraphT *subgraph) +{ + _tensorMap.assign(subgraph->tensors.size(), nullptr); + + for (const auto input_tensor_index : subgraph->inputs) + { + const tflite::TensorT &tensor = *subgraph->tensors[input_tensor_index]; + + mir::TensorType input_type = getMirTensorType(tensor); + auto input = _graph->create(input_type)->getOutput(0); + input->setName(tensor.name); + + assert(_tensorMap[input_tensor_index] == nullptr); + _tensorMap[input_tensor_index] = input; + } + + for (const auto &op : subgraph->operators) + { + walkOperator(subgraph, op.get()); + } + + for (const auto output_tensor_index : subgraph->outputs) + { + auto output = _tensorMap[output_tensor_index]; + _graph->create(output); + } +} + +void TfliteImporter::walkOperator(const tflite::SubGraphT *subgraph, const tflite::OperatorT *op) +{ + std::vector inputs = getMIRInputsForOperator(subgraph, op); + std::vector outputs; + + tflite::BuiltinOperator opcode = _model->operator_codes[op->opcode_index]->builtin_code; + switch (opcode) + { + case tflite::BuiltinOperator_CONV_2D: + outputs = _opCreator->convertConv2D(op->builtin_options.AsConv2DOptions(), inputs); + break; + case tflite::BuiltinOperator_DEPTHWISE_CONV_2D: + outputs = _opCreator->convertDepthwiseConv2D(op->builtin_options.AsDepthwiseConv2DOptions(), + inputs); + break; + case tflite::BuiltinOperator_MAX_POOL_2D: + outputs = _opCreator->convertMaxPool2D(op->builtin_options.AsPool2DOptions(), inputs); + break; + case tflite::BuiltinOperator_AVERAGE_POOL_2D: + outputs = _opCreator->convertAveragePool2D(op->builtin_options.AsPool2DOptions(), inputs); + break; + case tflite::BuiltinOperator_CONCATENATION: + outputs = + _opCreator->convertConcatenation(op->builtin_options.AsConcatenationOptions(), inputs); + break; + case tflite::BuiltinOperator_RESHAPE: + outputs = _opCreator->convertReshape(op->builtin_options.AsReshapeOptions(), inputs); + break; + case tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR: + outputs = _opCreator->convertResizeNearestNeighbor( + op->builtin_options.AsResizeNearestNeighborOptions(), inputs); + break; + case tflite::BuiltinOperator_MEAN: + outputs = _opCreator->convertMean(op->builtin_options.AsReducerOptions(), inputs); + break; + case tflite::BuiltinOperator_FULLY_CONNECTED: + outputs = + _opCreator->convertFullyConnected(op->builtin_options.AsFullyConnectedOptions(), inputs); + break; + case tflite::BuiltinOperator_SOFTMAX: + outputs = _opCreator->convertSoftmax(op->builtin_options.AsSoftmaxOptions(), inputs); + break; + case tflite::BuiltinOperator_SLICE: + outputs = _opCreator->convertSlice(op->builtin_options.AsSliceOptions(), inputs); + break; + case tflite::BuiltinOperator_SQUEEZE: + outputs = _opCreator->convertSqueeze(op->builtin_options.AsSqueezeOptions(), inputs); + break; + case tflite::BuiltinOperator_LOGISTIC: + outputs = _opCreator->convertLogistic(inputs); + break; + case tflite::BuiltinOperator_RSQRT: + outputs = _opCreator->convertRsqrt(inputs); + break; + case tflite::BuiltinOperator_SQRT: + outputs = _opCreator->convertSqrt(inputs); + break; + case tflite::BuiltinOperator_ADD: + outputs = _opCreator->convertAdd(op->builtin_options.AsAddOptions(), inputs); + break; + case tflite::BuiltinOperator_SUB: + outputs = _opCreator->convertSub(op->builtin_options.AsSubOptions(), inputs); + break; + case tflite::BuiltinOperator_MUL: + outputs = _opCreator->convertMul(op->builtin_options.AsMulOptions(), inputs); + break; + case tflite::BuiltinOperator_DIV: + outputs = _opCreator->convertDiv(op->builtin_options.AsDivOptions(), inputs); + break; + case tflite::BuiltinOperator_MAXIMUM: + outputs = _opCreator->convertMax(inputs); + break; + case tflite::BuiltinOperator_SQUARED_DIFFERENCE: + outputs = _opCreator->convertSquaredDifference(inputs); + break; + case tflite::BuiltinOperator_TRANSPOSE_CONV: + outputs = + _opCreator->convertTransposeConv(op->builtin_options.AsTransposeConvOptions(), inputs); + break; + case tflite::BuiltinOperator_PAD: + outputs = _opCreator->convertPad(op->builtin_options.AsPadOptions(), inputs); + break; + case tflite::BuiltinOperator_TANH: + outputs = _opCreator->convertTanh(inputs); + break; + case tflite::BuiltinOperator_RELU: + outputs = _opCreator->convertReLU(inputs); + break; + case tflite::BuiltinOperator_RELU6: + outputs = _opCreator->convertReLU6(inputs); + break; + case tflite::BuiltinOperator_TRANSPOSE: + outputs = _opCreator->convertTranspose(op->builtin_options.AsTransposeOptions(), inputs); + break; + case tflite::BuiltinOperator_STRIDED_SLICE: + outputs = + _opCreator->convertStridedSlice(op->builtin_options.AsStridedSliceOptions(), inputs); + break; + case tflite::BuiltinOperator_LEAKY_RELU: + outputs = _opCreator->convertLeakyReLU(op->builtin_options.AsLeakyReluOptions(), inputs); + break; + case tflite::BuiltinOperator_SHAPE: + outputs = _opCreator->convertShape(op->builtin_options.AsShapeOptions(), inputs); + break; + case tflite::BuiltinOperator_HARD_SWISH: + outputs = _opCreator->convertHardSwish(op->builtin_options.AsHardSwishOptions(), inputs); + break; + default: + assert(false && "All unsupported types should have been found before this pass."); + } + + assert(outputs.size() == op->outputs.size()); + for (std::size_t i = 0; i < op->outputs.size(); ++i) + { + const auto tensor_index = op->outputs[i]; + const tflite::TensorT &tensor = *subgraph->tensors[tensor_index]; + + mir::TensorType output_type = getMirTensorType(tensor); + + // The type should have been inferred correctly, except for quantization information. + assert(outputs[i]->getType().getElementType() == output_type.getElementType() && + outputs[i]->getType().getShape() == output_type.getShape()); + + outputs[i]->setName(tensor.name); + outputs[i]->setType(output_type); + + assert(_tensorMap[tensor_index] == nullptr); + _tensorMap[tensor_index] = outputs[i]; + } +} + +std::vector +TfliteImporter::getMIRInputsForOperator(const tflite::SubGraphT *subgraph, + const tflite::OperatorT *op) +{ + std::vector inputs; + + for (const auto tensor_index : op->inputs) + { + const tflite::TensorT &tensor = *subgraph->tensors[tensor_index]; + const tflite::BufferT &buffer = *_model->buffers[tensor.buffer]; + if (!buffer.data.empty()) + { + assert(_tensorMap[tensor_index] == nullptr); + mir::TensorType type = getMirTensorType(tensor); + mir::TensorVariant mir_tensor{type, buffer.data.data()}; + inputs.emplace_back(_graph->create(mir_tensor)->getOutput(0)); + } + else + { + assert(_tensorMap[tensor_index] != nullptr); + // By this point every input for the operation "op" should have corresponding + // Model IR operations that output its inputs. This assumption is provided by the fact + // that TFLite format specifies all operations in the execution order. + inputs.emplace_back(_tensorMap[tensor_index]); + } + } + + return inputs; +} + +} // namespace + +std::unique_ptr loadModel(std::string filename) +{ + TfliteImporter importer(std::move(filename)); + return importer.importModel(); +} + +} // namespace mir_tflite diff --git a/compiler/mir/src/mir_tflite_importer/tflite_op_creator.cpp b/compiler/mir/src/mir_tflite_importer/tflite_op_creator.cpp new file mode 100644 index 0000000..d9f98da --- /dev/null +++ b/compiler/mir/src/mir_tflite_importer/tflite_op_creator.cpp @@ -0,0 +1,652 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "tflite_op_creator.h" +#include "schema_generated.h" + +#include "mir/ops/AddOp.h" +#include "mir/ops/AvgPool2DOp.h" +#include "mir/ops/CappedReluOp.h" +#include "mir/ops/ConcatOp.h" +#include "mir/ops/ConstantOp.h" +#include "mir/ops/Conv2DOp.h" +#include "mir/ops/Deconv2DOp.h" +#include "mir/ops/DepthwiseConv2DOp.h" +#include "mir/ops/DivOp.h" +#include "mir/ops/FullyConnectedOp.h" +#include "mir/ops/HardSwishOp.h" +#include "mir/ops/LeakyReluOp.h" +#include "mir/ops/MaxOp.h" +#include "mir/ops/MaxPool2DOp.h" +#include "mir/ops/MulOp.h" +#include "mir/ops/PadOp.h" +#include "mir/ops/ReduceMeanOp.h" +#include "mir/ops/ReluOp.h" +#include "mir/ops/ReshapeOp.h" +#include "mir/ops/ResizeOp.h" +#include "mir/ops/SigmoidOp.h" +#include "mir/ops/SliceOp.h" +#include "mir/ops/SoftmaxOp.h" +#include "mir/ops/SqrtOp.h" +#include "mir/ops/SqueezeOp.h" +#include "mir/ops/SubOp.h" +#include "mir/ops/TanhOp.h" +#include "mir/ops/TransposeOp.h" + +#include "mir/Shape.h" +#include "mir/ShapeRange.h" +#include "mir/Tensor.h" + +#include + +namespace mir_tflite +{ + +namespace ops = mir::ops; +using mir::Shape; + +static mir::ops::PaddingType convertPadding(tflite::Padding padding) +{ + switch (padding) + { + case tflite::Padding_VALID: + return mir::ops::PaddingType::Valid; + case tflite::Padding_SAME: + return mir::ops::PaddingType::SameUpper; + default: + throw std::runtime_error(std::string("Unsupported Padding: ") + + tflite::EnumNamePadding(padding)); + } +} + +// TODO Move this to MIR? +static void calculatePadding(mir::ops::PaddingType padding_type, const mir::Shape &input_shape, + const std::vector &window_size, + const std::vector &strides, + std::vector &padding_before, + std::vector &padding_after) +{ + constexpr int num_spatial_dims = 2; + assert(window_size.size() == num_spatial_dims); + assert(strides.size() == num_spatial_dims); + assert(padding_before.size() == num_spatial_dims); + assert(padding_after.size() == num_spatial_dims); + + switch (padding_type) + { + case mir::ops::PaddingType::SameUpper: + for (int i = 0; i < num_spatial_dims; ++i) + { + // Assuming NHWC format. + const std::int32_t total_padding = + (input_shape.dim(1 + i) % strides[i] == 0) + ? std::max(0, window_size[i] - strides[i]) + : std::max(0, window_size[i] - input_shape.dim(1 + i) % strides[i]); + padding_before[i] = total_padding / 2; + padding_after[i] = total_padding - padding_before[i]; + } + break; + case mir::ops::PaddingType::Valid: + for (int i = 0; i < num_spatial_dims; ++i) + { + padding_before[i] = 0; + padding_after[i] = 0; + } + break; + default: + assert(false); + } +} + +template +static std::vector convertIntTensorToVector(const mir::Tensor &tensor) +{ + std::vector v; + for (const auto &i : mir::ShapeRange(tensor.getShape())) + v.emplace_back(static_cast(tensor.at(i))); + return v; +} + +static const mir::TensorVariant &extractTensor(const mir::Operation::Output *output) +{ + auto constant_op = dynamic_cast(output->getNode()); + if (constant_op == nullptr) + throw std::runtime_error("Non-constant input is not supported."); + return constant_op->getValue(); +} + +std::vector +TFLiteOpCreator::convertConv2D(const tflite::Conv2DOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + auto kernel = inputs.at(1); + auto bias = inputs.at(2); + + mir::Conv2DOpAttributes attributes; + attributes.strides = {opts->stride_h, opts->stride_w}; + + const auto padding_type = convertPadding(opts->padding); + const auto &input_shape = input->getShape(); + const auto &kernel_shape = kernel->getShape(); + const auto &strides = attributes.strides; + auto &pad_before = attributes.padding_before; + auto &pad_after = attributes.padding_after; + std::vector kernel_size{kernel_shape.dim(1), kernel_shape.dim(2)}; + calculatePadding(padding_type, input_shape, kernel_size, strides, pad_before, pad_after); + + mir::Operation::Output *result; + if (input->getType().isQuantized()) + { + result = createOp(input, kernel, bias, attributes)->getOutput(0); + } + else // TODO Fuse bias to other backends + { + result = createOp(input, kernel, attributes)->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertDepthwiseConv2D(const tflite::DepthwiseConv2DOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + auto kernel = inputs.at(1); + auto bias = inputs.at(2); + + // OHWI -> HWIO + const std::vector axis_order{1, 2, 3, 0}; + kernel = createOp(kernel, axis_order)->getOutput(0); + + mir::Conv2DOpAttributes attributes; + attributes.strides = {opts->stride_h, opts->stride_w}; + + const auto padding_type = convertPadding(opts->padding); + const auto &input_shape = input->getShape(); + const auto &kernel_shape = kernel->getShape(); + std::vector kernel_size{kernel_shape.dim(0), kernel_shape.dim(1)}; + const auto &strides = attributes.strides; + auto &pad_before = attributes.padding_before; + auto &pad_after = attributes.padding_after; + calculatePadding(padding_type, input_shape, kernel_size, strides, pad_before, pad_after); + + mir::Operation::Output *result; + if (input->getType().isQuantized()) + { + result = createOp(input, kernel, bias, attributes)->getOutput(0); + } + else // TODO Fuse bias to other backends + { + result = createOp(input, kernel, attributes)->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertConcatenation(const tflite::ConcatenationOptionsT *opts, + const std::vector &inputs) +{ + auto result = createOp(inputs, opts->axis); + return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertMaxPool2D(const tflite::Pool2DOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + const auto &input_shape = input->getShape(); + + mir::MaxPool2DOpAttributes attributes; + attributes.window = {opts->filter_height, opts->filter_width}; + attributes.strides = {opts->stride_h, opts->stride_w}; + + const auto padding_type = convertPadding(opts->padding); + const auto &window_size = attributes.window; + const auto &strides = attributes.strides; + auto &pad_before = attributes.padding_before; + auto &pad_after = attributes.padding_after; + calculatePadding(padding_type, input_shape, window_size, strides, pad_before, pad_after); + + auto result = createOp(input, attributes); + return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertAveragePool2D(const tflite::Pool2DOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + const auto &input_shape = input->getShape(); + + mir::AvgPool2DOpAttributes attributes; + attributes.window = {opts->filter_height, opts->filter_width}; + attributes.strides = {opts->stride_h, opts->stride_w}; + attributes.include_pad = false; + + const auto padding_type = convertPadding(opts->padding); + const auto &window_size = attributes.window; + const auto &strides = attributes.strides; + auto &pad_before = attributes.padding_before; + auto &pad_after = attributes.padding_after; + calculatePadding(padding_type, input_shape, window_size, strides, pad_before, pad_after); + + auto result = createOp(input, attributes); + return {addFusedActivation(result->getOutput(0), opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertSoftmax(const tflite::SoftmaxOptionsT * /*opts*/, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + // Softmax in TFLite is always 2-D. + assert(input->getShape().rank() == 2); + const int32_t axis = 1; + auto result = createOp(input, axis); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertSlice(const tflite::SliceOptionsT * /*opts*/, + const std::vector &inputs) +{ + auto input = inputs.at(0); + mir::Tensor begin_tensor(extractTensor(inputs.at(1))); + mir::Tensor size_tensor(extractTensor(inputs.at(2))); + + Shape starts(convertIntTensorToVector(begin_tensor)); + Shape sizes(convertIntTensorToVector(size_tensor)); + auto result = createOp(input, starts, sizes); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertReshape(const tflite::ReshapeOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + // TODO: we should also support "-1" values in new_shape, which means that correct + // shape values must be calculated. Better do it in the shape inference module. + Shape new_shape(opts->new_shape.size()); + for (int i = 0; i < static_cast(opts->new_shape.size()); ++i) + { + new_shape.dim(i) = opts->new_shape[i]; + } + auto result = createOp(input, new_shape); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertTransposeConv(const tflite::TransposeConvOptionsT *opts, + const std::vector &inputs) +{ + mir::Tensor output_shape_tensor(extractTensor(inputs.at(0))); + auto kernel = inputs.at(1); + auto input = inputs.at(2); + + mir::Deconv2DOpAttributes attributes; + attributes.strides = {opts->stride_h, opts->stride_w}; + Shape output_shape(convertIntTensorToVector(output_shape_tensor)); + + // OHWI -> HWOI + const std::vector axis_order{1, 2, 0, 3}; + kernel = createOp(kernel, axis_order)->getOutput(0); + + attributes.padding_type = convertPadding(opts->padding); + auto result = createOp(input, kernel, attributes, output_shape)->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertResizeNearestNeighbor(const tflite::ResizeNearestNeighborOptionsT *opts, + const std::vector &inputs) +{ + if (opts->align_corners) + throw std::runtime_error("'align_corners' is not currently supported"); + + auto input = inputs.at(0); + mir::Tensor size_tensor(extractTensor(inputs.at(1))); + + const auto &input_shape = input->getShape(); + Shape res_shape{input_shape.dim(0), size_tensor.at(mir::Index{0}), size_tensor.at(mir::Index{1}), + input_shape.dim(3)}; + auto result = + createOp(input, ops::ResizeOp::ResizeMethod::nearestNeighbor, res_shape); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertAdd(const tflite::AddOptionsT *opts, + const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertSub(const tflite::SubOptionsT *opts, + const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertMul(const tflite::MulOptionsT *opts, + const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertDiv(const tflite::DivOptionsT *opts, + const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +std::vector +TFLiteOpCreator::convertMax(const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertSquaredDifference(const std::vector &inputs) +{ + assert(inputs.size() == 2); + auto result = createOp(inputs[0], inputs[1])->getOutput(0); + result = createOp(result, result)->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertMean(const tflite::ReducerOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + mir::Tensor axes_tensor(extractTensor(inputs.at(1))); + + std::vector axes = convertIntTensorToVector(axes_tensor); + auto result = createOp(input, axes, opts->keep_dims); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertFullyConnected(const tflite::FullyConnectedOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + auto weights = inputs.at(1); + auto bias = inputs.at(2); + + // Flatten input to 2-D shape. + const auto &input_shape = input->getShape(); + int32_t outer_size = input_shape.dim(0); + int32_t inner_size = input_shape.numElements() / outer_size; + auto flatten = createOp(input, Shape{outer_size, inner_size})->getOutput(0); + + // Transpose the weights. + const std::vector axis_order{1, 0}; + weights = createOp(weights, axis_order)->getOutput(0); + + mir::Operation::Output *result; + if (input->getType().isQuantized()) + { + result = createOp(flatten, weights, bias)->getOutput(0); + } + else // TODO Fuse bias to other backends + { + result = createOp(flatten, weights)->getOutput(0); + result = createOp(result, bias)->getOutput(0); + } + return {addFusedActivation(result, opts->fused_activation_function)}; +} + +mir::Operation::Output * +TFLiteOpCreator::addFusedActivation(mir::Operation::Output *input, + tflite::ActivationFunctionType activation_type) +{ + switch (activation_type) + { + case tflite::ActivationFunctionType_NONE: + return input; + case tflite::ActivationFunctionType_RELU: + return createOp(input)->getOutput(0); + case tflite::ActivationFunctionType_RELU6: + return createOp(input, 6)->getOutput(0); + case tflite::ActivationFunctionType_TANH: + return createOp(input)->getOutput(0); + default: + throw std::runtime_error(std::string("Unsupported activation type: ") + + tflite::EnumNameActivationFunctionType(activation_type)); + } +} + +std::vector +TFLiteOpCreator::convertSqueeze(const tflite::SqueezeOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + std::vector squeeze_dims(opts->squeeze_dims.begin(), opts->squeeze_dims.end()); + auto result = createOp(input, squeeze_dims); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertPad(const tflite::PadOptionsT * /*opts*/, + const std::vector &inputs) +{ + auto input = inputs.at(0); + mir::Tensor paddings_tensor(extractTensor(inputs.at(1))); + + const auto &input_shape = input->getShape(); + const int num_dims = input_shape.rank(); + + mir::PadOpAttributes attributes(num_dims); + for (int i = 0; i < num_dims; i++) + { + attributes.padding_before[i] = paddings_tensor.at(mir::Index({i, 0})); + attributes.padding_after[i] = paddings_tensor.at(mir::Index({i, 1})); + } + + auto result = createOp(input, attributes)->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertTanh(const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertReLU(const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertReLU6(const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input, 6); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertRsqrt(const std::vector &inputs) +{ + auto input = inputs.at(0); + + const float one_value = 1.0f; + mir::TensorVariant one_tensor({mir::DataType::FLOAT32, {}}, &one_value); + auto one = createOp(one_tensor)->getOutput(0); + auto sqrt = createOp(input)->getOutput(0); + auto result = createOp(one, sqrt)->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertSqrt(const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input)->getOutput(0); + return {result}; +} + +std::vector +TFLiteOpCreator::convertLogistic(const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertTranspose(const tflite::TransposeOptionsT * /*opts*/, + const std::vector &inputs) +{ + auto input = inputs.at(0); + mir::Tensor perm_tensor(extractTensor(inputs.at(1))); + + std::vector axis_order = convertIntTensorToVector(perm_tensor); + auto result = createOp(input, axis_order); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertStridedSlice(const tflite::StridedSliceOptionsT *opts, + const std::vector &inputs) +{ + if (opts->ellipsis_mask != 0) + throw std::runtime_error("StridedSlice: parameter 'ellipsis_mask' is not supported."); + + if (opts->new_axis_mask != 0) + throw std::runtime_error("StridedSlice: parameter 'new_axis_mask' is not supported."); + + auto input = inputs.at(0); + mir::Tensor begin_tensor(extractTensor(inputs.at(1))); + mir::Tensor end_tensor(extractTensor(inputs.at(2))); + mir::Tensor strides_tensor(extractTensor(inputs.at(3))); + + std::vector begin = convertIntTensorToVector(begin_tensor); + std::vector end = convertIntTensorToVector(end_tensor); + std::vector strides = convertIntTensorToVector(strides_tensor); + + int32_t begin_mask = opts->begin_mask; + int32_t end_mask = opts->end_mask; + int32_t shrink_axis_mask = opts->shrink_axis_mask; + + const auto &input_shape = input->getShape(); + int32_t num_dims = input_shape.rank(); + + for (int32_t stride : strides) + { + if (stride != 1) + throw std::runtime_error("StridedSlice: parameter 'strides' is not supported"); + } + + Shape start(num_dims); + Shape size(num_dims); + std::vector squeeze_dims; + for (int axis = 0; axis < num_dims; axis++) + { + if (static_cast(begin_mask) & (1u << static_cast(axis))) + start.dim(axis) = 0; + else + start.dim(axis) = begin.at(static_cast(axis)); + + if (static_cast(end_mask) & (1u << static_cast(axis))) + size.dim(axis) = input_shape.dim(axis) - start.dim(axis); + else + size.dim(axis) = end.at(static_cast(axis)) - start.dim(axis); + + if (static_cast(shrink_axis_mask) & (1u << static_cast(axis))) + squeeze_dims.push_back(axis); + } + + auto result = createOp(input, start, size); + result = createOp(result->getOutput(0), squeeze_dims); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertLeakyReLU(const tflite::LeakyReluOptionsT *opts, + const std::vector &inputs) +{ + auto input = inputs.at(0); + + auto result = createOp(input, opts->alpha); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertShape(const tflite::ShapeOptionsT *opts, + const std::vector &inputs) +{ + if (opts->out_type != tflite::TensorType_INT32) + { + throw std::runtime_error(std::string("SHAPE: Unsupported tensor type: ") + + EnumNameTensorType(opts->out_type)); + } + + const auto &input_shape = inputs[0]->getShape(); + int32_t rank = input_shape.rank(); + std::vector data; + data.reserve(static_cast(rank)); + for (int32_t i = 0; i < rank; i++) + data.emplace_back(input_shape.dim(i)); + mir::TensorVariant tensor({mir::DataType::INT32, {rank}}, data.data()); + auto result = createOp(tensor); + return {result->getOutput(0)}; +} + +std::vector +TFLiteOpCreator::convertHardSwish(const tflite::HardSwishOptionsT *, + const std::vector &inputs) +{ + auto result = createOp(inputs[0])->getOutput(0); + return {result}; +} + +} // namespace mir_tflite diff --git a/compiler/mir-tflite-importer/tflite_op_creator.h b/compiler/mir/src/mir_tflite_importer/tflite_op_creator.h similarity index 100% rename from compiler/mir-tflite-importer/tflite_op_creator.h rename to compiler/mir/src/mir_tflite_importer/tflite_op_creator.h diff --git a/compiler/mir2loco/CMakeLists.txt b/compiler/mir2loco/CMakeLists.txt index 49bf3db..a8a096e 100644 --- a/compiler/mir2loco/CMakeLists.txt +++ b/compiler/mir2loco/CMakeLists.txt @@ -7,7 +7,6 @@ target_include_directories(mir2loco PRIVATE src) target_include_directories(mir2loco PUBLIC include) target_link_libraries(mir2loco PUBLIC mir) target_link_libraries(mir2loco PUBLIC loco) -target_link_libraries(mir2loco PRIVATE stdex) nnas_find_package(GTest QUIET) diff --git a/compiler/mir2loco/README.md b/compiler/mir2loco/README.md new file mode 100644 index 0000000..a11e104 --- /dev/null +++ b/compiler/mir2loco/README.md @@ -0,0 +1 @@ +# mir2loco diff --git a/compiler/mir2loco/src/mir2loco.cpp b/compiler/mir2loco/src/mir2loco.cpp index fc1f693..e1370fe 100644 --- a/compiler/mir2loco/src/mir2loco.cpp +++ b/compiler/mir2loco/src/mir2loco.cpp @@ -37,7 +37,7 @@ #include #include -#include +#include namespace mir2loco { @@ -54,7 +54,7 @@ template void setupShape(const mir::Shape &shape, NodeType *nod std::unique_ptr make_tensor_shape(const mir::Shape &shape) { - auto res = stdex::make_unique(); + auto res = std::make_unique(); setupShape(shape, res.get()); return std::move(res); } @@ -107,13 +107,13 @@ loco::Permutation createFeaturePermutation(mir::DataForma std::unique_ptr createFeatureEncoder(mir::DataFormat data_format) { auto perm = createFeaturePermutation(data_format); - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createFeatureDecoder(mir::DataFormat data_format) { auto perm = createFeaturePermutation(data_format); - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createOHWIFilterEncoder() @@ -123,7 +123,7 @@ std::unique_ptr createOHWIFilterEncoder() perm.axis(loco::FilterAxis::Height) = 1; perm.axis(loco::FilterAxis::Width) = 2; perm.axis(loco::FilterAxis::Depth) = 3; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createHWOIFilterEncoder() @@ -133,7 +133,7 @@ std::unique_ptr createHWOIFilterEncoder() perm.axis(loco::FilterAxis::Width) = 1; perm.axis(loco::FilterAxis::Count) = 2; perm.axis(loco::FilterAxis::Depth) = 3; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createHWIMDepthwiseFilterEncoder() @@ -143,7 +143,7 @@ std::unique_ptr createHWIMDepthwiseFilterEncoder() perm.axis(loco::DepthwiseFilterAxis::Width) = 1; perm.axis(loco::DepthwiseFilterAxis::Depth) = 2; perm.axis(loco::DepthwiseFilterAxis::Multiplier) = 3; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createIHWMDepthwiseFilterEncoder() @@ -153,7 +153,7 @@ std::unique_ptr createIHWMDepthwiseFilterEncoder() perm.axis(loco::DepthwiseFilterAxis::Height) = 1; perm.axis(loco::DepthwiseFilterAxis::Width) = 2; perm.axis(loco::DepthwiseFilterAxis::Multiplier) = 3; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createHWMatrixEncoder() @@ -161,7 +161,7 @@ std::unique_ptr createHWMatrixEncoder() loco::Permutation perm; perm.axis(loco::MatrixAxis::Height) = 0; perm.axis(loco::MatrixAxis::Width) = 1; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } std::unique_ptr createHWMatrixDecoder() @@ -169,7 +169,7 @@ std::unique_ptr createHWMatrixDecoder() loco::Permutation perm; perm.axis(loco::MatrixAxis::Height) = 0; perm.axis(loco::MatrixAxis::Width) = 1; - return stdex::make_unique>(perm); + return std::make_unique>(perm); } loco::DataType convertDataType(mir::DataType data_type) diff --git a/compiler/moco-tf/requires.cmake b/compiler/moco-tf/requires.cmake index 751192f..3e0fabe 100644 --- a/compiler/moco-tf/requires.cmake +++ b/compiler/moco-tf/requires.cmake @@ -11,3 +11,4 @@ require("plier-tf") require("locoex-customop") require("logo") require("oops") +require("bino") diff --git a/compiler/moco-tf/src/Canonicalization/PadCanonicalizer.cpp b/compiler/moco-tf/src/Canonicalization/PadCanonicalizer.cpp index 10816f4..36136ae 100644 --- a/compiler/moco-tf/src/Canonicalization/PadCanonicalizer.cpp +++ b/compiler/moco-tf/src/Canonicalization/PadCanonicalizer.cpp @@ -58,7 +58,7 @@ bool canonicalize_pad(loco::Graph *graph, moco::TFPad *node) constant_node->size(1); constant_node->at(0) = 0.0f; - auto const_paddings_node = dynamic_cast(node->paddings()); + auto const_paddings_node = loco::must_cast(node->paddings()); // TODO: support S64 type. assert(const_paddings_node->dtype() == loco::DataType::S32); assert(const_paddings_node->rank() == 2); diff --git a/compiler/moco/import/src/Importer.cpp b/compiler/moco/import/src/Importer.cpp index 8d3ca6c..3813aff 100644 --- a/compiler/moco/import/src/Importer.cpp +++ b/compiler/moco/import/src/Importer.cpp @@ -126,8 +126,7 @@ void convert_graph(const moco::GraphBuilderSource &source, const moco::ModelSign auto graph_input = graph->inputs()->create(); - auto placeholder_node = dynamic_cast(node); - assert(placeholder_node != nullptr); + auto placeholder_node = loco::must_cast(node); graph_input->name(input.nodeName()); diff --git a/compiler/moco/import/src/Nodes/BiasAdd.test.cpp b/compiler/moco/import/src/Nodes/BiasAdd.test.cpp index 626456d..207045a 100644 --- a/compiler/moco/import/src/Nodes/BiasAdd.test.cpp +++ b/compiler/moco/import/src/Nodes/BiasAdd.test.cpp @@ -61,7 +61,7 @@ TEST(TensorFlowImport, bias_add_01) tester.output("out"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_TRUE(test_node->data_layout() == "NHWC"); } @@ -106,7 +106,7 @@ TEST(TensorFlowImport, bias_add_NCHW_axis) tester.output("out"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_TRUE(test_node->data_layout() == "NCHW"); } diff --git a/compiler/moco/import/src/Nodes/Concat.test.cpp b/compiler/moco/import/src/Nodes/Concat.test.cpp index c098657..30a7db7 100644 --- a/compiler/moco/import/src/Nodes/Concat.test.cpp +++ b/compiler/moco/import/src/Nodes/Concat.test.cpp @@ -72,7 +72,7 @@ TEST(TensorFlowImport, concat_01) tester.output("Concat"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->num_values(), 2); } @@ -128,7 +128,7 @@ TEST(TensorFlowImport, concat_02) tester.output("Concat"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->num_values(), 3); } diff --git a/compiler/moco/import/src/Nodes/Const.test.cpp b/compiler/moco/import/src/Nodes/Const.test.cpp index 854499f..5a9390b 100644 --- a/compiler/moco/import/src/Nodes/Const.test.cpp +++ b/compiler/moco/import/src/Nodes/Const.test.cpp @@ -79,7 +79,7 @@ TEST(TensorFlowImport, const_float_01) tester.output("const/float"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 1.1f); @@ -142,7 +142,7 @@ TEST(TensorFlowImport, const_float_02) tester.output("const/float"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 1.1f); @@ -206,7 +206,7 @@ TEST(TensorFlowImport, const_float_03) tester.output("const/float"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 1.1f); @@ -270,7 +270,7 @@ TEST(TensorFlowImport, const_float_04) tester.output("const/float"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 1.1f); @@ -334,7 +334,7 @@ TEST(TensorFlowImport, const_int32_04) tester.output("const/int"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 1); @@ -391,7 +391,7 @@ TEST(TensorFlowImport, const_int32_scalar) tester.output("const/int"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 1); ASSERT_EQ(test_node->at(0), 3); @@ -453,7 +453,7 @@ TEST(TensorFlowImport, const_int8_01) tester.output("const/int8"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->size(), 6); ASSERT_EQ(test_node->at(0), 0); diff --git a/compiler/moco/import/src/Nodes/Mean.test.cpp b/compiler/moco/import/src/Nodes/Mean.test.cpp index 6321fad..4666c32 100644 --- a/compiler/moco/import/src/Nodes/Mean.test.cpp +++ b/compiler/moco/import/src/Nodes/Mean.test.cpp @@ -65,7 +65,7 @@ TEST(TensorFlowImport, mean_true) tester.output("Mean"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->keep_dims(), true); } @@ -114,7 +114,7 @@ TEST(TensorFlowImport, mean_false) tester.output("Mean"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->keep_dims(), false); } diff --git a/compiler/moco/import/src/Nodes/Pack.test.cpp b/compiler/moco/import/src/Nodes/Pack.test.cpp index 01774a9..3ee2745 100644 --- a/compiler/moco/import/src/Nodes/Pack.test.cpp +++ b/compiler/moco/import/src/Nodes/Pack.test.cpp @@ -73,7 +73,7 @@ TEST(TensorFlowImport, tf_pack_basic) tester.output("Pack"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->N(), 4); ASSERT_NE(test_node->values(0), nullptr); diff --git a/compiler/moco/import/src/Nodes/StridedSlice.test.cpp b/compiler/moco/import/src/Nodes/StridedSlice.test.cpp index b6959d7..dd3c133 100644 --- a/compiler/moco/import/src/Nodes/StridedSlice.test.cpp +++ b/compiler/moco/import/src/Nodes/StridedSlice.test.cpp @@ -95,7 +95,7 @@ TEST(TensorFlowImport, tf_stridedslice_basic) tester.output("StridedSlice"); tester.run(nodedef, graphbuilder); - auto test_node = dynamic_cast(tester.output()); + auto test_node = loco::must_cast(tester.output()); ASSERT_NE(test_node, nullptr); ASSERT_EQ(test_node->begin_mask(), 0); ASSERT_EQ(test_node->end_mask(), 0); diff --git a/compiler/moco/pass/src/Passes/ConstantFoldPack.cpp b/compiler/moco/pass/src/Passes/ConstantFoldPack.cpp index cc8a23d..105c96c 100644 --- a/compiler/moco/pass/src/Passes/ConstantFoldPack.cpp +++ b/compiler/moco/pass/src/Passes/ConstantFoldPack.cpp @@ -24,6 +24,8 @@ #include +#include + #include #include @@ -32,19 +34,6 @@ namespace { -// TODO move to loco -bool operator==(const loco::TensorShape &lhs, const loco::TensorShape &rhs) -{ - if (lhs.rank() != rhs.rank()) - return false; - for (uint32_t axis = 0; axis < lhs.rank(); ++axis) - { - if (!(lhs.dim(axis) == rhs.dim(axis))) - return false; - } - return true; -} - bool valid_axis_range(int32_t output_rank, int32_t pack_axis) { // check axis range in [-r-1, r+1) diff --git a/compiler/moco/pass/src/Passes/ConstantFoldStridedSlice.cpp b/compiler/moco/pass/src/Passes/ConstantFoldStridedSlice.cpp index 8be4764..3542e60 100644 --- a/compiler/moco/pass/src/Passes/ConstantFoldStridedSlice.cpp +++ b/compiler/moco/pass/src/Passes/ConstantFoldStridedSlice.cpp @@ -35,10 +35,9 @@ namespace loco::TensorShape calc_output_shape(moco::TFStridedSlice *node) { - auto const_input = dynamic_cast(node->input()); - auto const_begin = dynamic_cast(node->begin()); - auto const_end = dynamic_cast(node->end()); - auto const_strides = dynamic_cast(node->strides()); + auto const_input = loco::must_cast(node->input()); + auto const_begin = loco::must_cast(node->begin()); + auto const_end = loco::must_cast(node->end()); auto input_rank = const_input->rank(); auto output_rank = input_rank; loco::TensorShape output_shape_range; diff --git a/compiler/moco/pass/src/Passes/FuseBinaryIntoPreceding.cpp b/compiler/moco/pass/src/Passes/FuseBinaryIntoPreceding.cpp index 4a9631e..f97546a 100644 --- a/compiler/moco/pass/src/Passes/FuseBinaryIntoPreceding.cpp +++ b/compiler/moco/pass/src/Passes/FuseBinaryIntoPreceding.cpp @@ -471,8 +471,7 @@ bool fuse_to_preceding(loco::Graph *graph, moco::TFAdd *node) } // Let's fuse addparam into biasadd bias - auto biasadd_bias = dynamic_cast(biasadd->bias()); - assert(biasadd_bias != nullptr); + auto biasadd_bias = loco::must_cast(biasadd->bias()); if (!shape_match(biasadd_bias, addparam)) { // INFO(l) << "TFBiasAdd bias and TFAdd input shape mismatch"; diff --git a/compiler/moco/service/src/Service/TFShapeInferenceRule.cpp b/compiler/moco/service/src/Service/TFShapeInferenceRule.cpp index 6d122c8..9843415 100644 --- a/compiler/moco/service/src/Service/TFShapeInferenceRule.cpp +++ b/compiler/moco/service/src/Service/TFShapeInferenceRule.cpp @@ -473,8 +473,7 @@ public: auto input_shape = node_shape(node->input()); assert(input_shape.domain() == loco::Domain::Tensor); - auto const_paddings = dynamic_cast(node->paddings()); - assert(const_paddings); + auto const_paddings = loco::must_cast(node->paddings()); assert(const_paddings->dtype() == loco::DataType::S32); assert(const_paddings->rank() == 2); @@ -707,9 +706,9 @@ public: assert(node->ellipsis_mask() == 0); assert(node->shrink_axis_mask() == 1); - auto const_begin = dynamic_cast(node->begin()); - auto const_end = dynamic_cast(node->end()); - auto const_strides = dynamic_cast(node->strides()); + auto const_begin = loco::must_cast(node->begin()); + auto const_end = loco::must_cast(node->end()); + auto const_strides = loco::must_cast(node->strides()); assert(dynamic_cast(node->input()) != nullptr); assert(const_begin != nullptr); @@ -880,7 +879,7 @@ void TFShapeInferenceRule::infer(const Context *ctx, const loco::Node *node, Sin assert(dynamic_cast(node) != nullptr); ShapeInferenceAlgorithm alg{ctx}; - auto shape = dynamic_cast(node)->accept(&alg); + auto shape = loco::must_cast(node)->accept(&alg); if (shape.domain() == loco::Domain::Unknown) sink->fail(); diff --git a/compiler/moco/service/src/Service/TFTypeInferenceRule.cpp b/compiler/moco/service/src/Service/TFTypeInferenceRule.cpp index 112ab95..f168c80 100644 --- a/compiler/moco/service/src/Service/TFTypeInferenceRule.cpp +++ b/compiler/moco/service/src/Service/TFTypeInferenceRule.cpp @@ -98,7 +98,7 @@ bool TFTypeInferenceRule::infer(const loco::Node *node, loco::DataType &dtype) c #define TENSORFLOW_NODE(OPCODE,CLASS) \ if (dynamic_cast(node)) \ { \ - auto tfnode = dynamic_cast(node); \ + auto tfnode = loco::must_cast(node); \ dtype = tfnode->accept(&alg); \ assert(dtype != loco::DataType::Unknown); \ return true; \ diff --git a/compiler/nest/core/src/Block.test.cpp b/compiler/nest/core/src/Block.test.cpp index b40fbea..d8faa0b 100644 --- a/compiler/nest/core/src/Block.test.cpp +++ b/compiler/nest/core/src/Block.test.cpp @@ -30,12 +30,12 @@ TEST(BLOCK, use_case_1) { nest::Block block; - ASSERT_EQ(block.size(), 0); + ASSERT_EQ(0, block.size()); auto stmt = std::make_shared(); block.append(stmt); - ASSERT_EQ(block.size(), 1); - ASSERT_EQ(block.at(0), stmt); + ASSERT_EQ(1, block.size()); + ASSERT_EQ(stmt, block.at(0)); } diff --git a/compiler/nest/core/src/Bound.test.cpp b/compiler/nest/core/src/Bound.test.cpp index 7b2f0b6..a4c3d4d 100644 --- a/compiler/nest/core/src/Bound.test.cpp +++ b/compiler/nest/core/src/Bound.test.cpp @@ -22,6 +22,6 @@ TEST(BOUND, ctor) { const nest::Bound b{-10, 20}; - ASSERT_EQ(b.min(), -10); - ASSERT_EQ(b.max(), 20); + ASSERT_EQ(-10, b.min()); + ASSERT_EQ(20, b.max()); } diff --git a/compiler/nest/core/src/Closure.test.cpp b/compiler/nest/core/src/Closure.test.cpp index 1dae849..495e218 100644 --- a/compiler/nest/core/src/Closure.test.cpp +++ b/compiler/nest/core/src/Closure.test.cpp @@ -30,8 +30,8 @@ TEST(Closure, ctor) nest::DomainID dom_id{0}; nest::Closure closure{dom_id, std::make_shared()}; - ASSERT_EQ(closure.id().value(), 0); - ASSERT_EQ(closure.sub().rank(), 1); + ASSERT_EQ(0, closure.id().value()); + ASSERT_EQ(1, closure.sub().rank()); } TEST(Closure, cast) diff --git a/compiler/nest/core/src/Domain.test.cpp b/compiler/nest/core/src/Domain.test.cpp index 5f973ec..8d18459 100644 --- a/compiler/nest/core/src/Domain.test.cpp +++ b/compiler/nest/core/src/Domain.test.cpp @@ -36,6 +36,6 @@ TEST(_DOMAIN, base_usecase) nest::Closure clo = dom(std::make_shared<::expr::DummyNode>()); - ASSERT_EQ(clo.id(), dom_id); - ASSERT_EQ(clo.sub().rank(), 1); + ASSERT_EQ(dom_id, clo.id()); + ASSERT_EQ(1, clo.sub().rank()); } diff --git a/compiler/nest/core/src/DomainContext.test.cpp b/compiler/nest/core/src/DomainContext.test.cpp index 10882df..cc553ea 100644 --- a/compiler/nest/core/src/DomainContext.test.cpp +++ b/compiler/nest/core/src/DomainContext.test.cpp @@ -24,30 +24,30 @@ TEST(DOMAIN_CONTEXT, usecase) auto dom_0 = ctx.make({1, 3, 4}); - ASSERT_EQ(ctx.count(), 1); + ASSERT_EQ(1, ctx.count()); auto check_dom_0 = [&](void) { - ASSERT_EQ(ctx.info(dom_0).rank(), 3); - ASSERT_EQ(ctx.info(dom_0).dim(0), 1); - ASSERT_EQ(ctx.info(dom_0).dim(1), 3); - ASSERT_EQ(ctx.info(dom_0).dim(2), 4); + ASSERT_EQ(3, ctx.info(dom_0).rank()); + ASSERT_EQ(1, ctx.info(dom_0).dim(0)); + ASSERT_EQ(3, ctx.info(dom_0).dim(1)); + ASSERT_EQ(4, ctx.info(dom_0).dim(2)); }; check_dom_0(); auto dom_1 = ctx.make({7, 6, 2, 1}); - ASSERT_EQ(ctx.count(), 2); + ASSERT_EQ(2, ctx.count()); // Domain ID should be unique for each domain ASSERT_FALSE(dom_0.id() == dom_1.id()); auto check_dom_1 = [&](void) { - ASSERT_EQ(ctx.info(dom_1).rank(), 4); - ASSERT_EQ(ctx.info(dom_1).dim(0), 7); - ASSERT_EQ(ctx.info(dom_1).dim(1), 6); - ASSERT_EQ(ctx.info(dom_1).dim(2), 2); - ASSERT_EQ(ctx.info(dom_1).dim(3), 1); + ASSERT_EQ(4, ctx.info(dom_1).rank()); + ASSERT_EQ(7, ctx.info(dom_1).dim(0)); + ASSERT_EQ(6, ctx.info(dom_1).dim(1)); + ASSERT_EQ(2, ctx.info(dom_1).dim(2)); + ASSERT_EQ(1, ctx.info(dom_1).dim(3)); }; // make() SHOULD NOT affect the existing domain information diff --git a/compiler/nest/core/src/DomainID.test.cpp b/compiler/nest/core/src/DomainID.test.cpp index 6b1ce83..3a77050 100644 --- a/compiler/nest/core/src/DomainID.test.cpp +++ b/compiler/nest/core/src/DomainID.test.cpp @@ -22,7 +22,7 @@ TEST(DOMAIN_ID, ctor) { nest::DomainID id{0}; - ASSERT_EQ(id.value(), 0); + ASSERT_EQ(0, id.value()); } TEST(DOMAIN_ID, operator_eq) diff --git a/compiler/nest/core/src/DomainInfo.test.cpp b/compiler/nest/core/src/DomainInfo.test.cpp index 7a5d811..ddee683 100644 --- a/compiler/nest/core/src/DomainInfo.test.cpp +++ b/compiler/nest/core/src/DomainInfo.test.cpp @@ -22,9 +22,9 @@ TEST(DOMAIN_INFO, ctor) { nest::DomainInfo info{1, 2, 3, 4}; - ASSERT_EQ(info.rank(), 4); - ASSERT_EQ(info.dim(0), 1); - ASSERT_EQ(info.dim(1), 2); - ASSERT_EQ(info.dim(2), 3); - ASSERT_EQ(info.dim(3), 4); + ASSERT_EQ(4, info.rank()); + ASSERT_EQ(1, info.dim(0)); + ASSERT_EQ(2, info.dim(1)); + ASSERT_EQ(3, info.dim(2)); + ASSERT_EQ(4, info.dim(3)); } diff --git a/compiler/nest/core/src/Expr.test.cpp b/compiler/nest/core/src/Expr.test.cpp index 0c96f77..2e26c23 100644 --- a/compiler/nest/core/src/Expr.test.cpp +++ b/compiler/nest/core/src/Expr.test.cpp @@ -38,8 +38,8 @@ TEST(EXPR, operator_sum) auto add = expr->asAdd(); - ASSERT_EQ(add->lhs().get(), left.get()); - ASSERT_EQ(add->rhs().get(), right.get()); + ASSERT_EQ(left.get(), add->lhs().get()); + ASSERT_EQ(right.get(), add->rhs().get()); } TEST(EXPR, operator_mul) @@ -53,6 +53,6 @@ TEST(EXPR, operator_mul) auto add = expr->asMul(); - ASSERT_EQ(add->lhs().get(), left.get()); - ASSERT_EQ(add->rhs().get(), right.get()); + ASSERT_EQ(left.get(), add->lhs().get()); + ASSERT_EQ(right.get(), add->rhs().get()); } diff --git a/compiler/nest/core/src/FV.test.cpp b/compiler/nest/core/src/FV.test.cpp index 55f5f58..8bb061c 100644 --- a/compiler/nest/core/src/FV.test.cpp +++ b/compiler/nest/core/src/FV.test.cpp @@ -27,7 +27,7 @@ TEST(FV, var_expr) auto fvs = nest::FV::in(var); - ASSERT_EQ(fvs.size(), 1); + ASSERT_EQ(1, fvs.size()); ASSERT_NE(fvs.find(var.id()), fvs.end()); } @@ -40,7 +40,7 @@ TEST(FV, deref_expr) auto fvs = nest::FV::in(dom(var)); - ASSERT_EQ(fvs.size(), 1); + ASSERT_EQ(1, fvs.size()); ASSERT_NE(fvs.find(var.id()), fvs.end()); } @@ -53,7 +53,7 @@ TEST(FV, add_expr) auto fvs = nest::FV::in(v_0 + v_1); - ASSERT_EQ(fvs.size(), 2); + ASSERT_EQ(2, fvs.size()); ASSERT_NE(fvs.find(v_0.id()), fvs.end()); ASSERT_NE(fvs.find(v_1.id()), fvs.end()); } @@ -69,7 +69,7 @@ TEST(FV, mul_expr) auto fvs = nest::FV::in(v_0 * v_1); - ASSERT_EQ(fvs.size(), 2); + ASSERT_EQ(2, fvs.size()); ASSERT_NE(fvs.find(v_0.id()), fvs.end()); ASSERT_NE(fvs.find(v_1.id()), fvs.end()); } diff --git a/compiler/nest/core/src/Level.test.cpp b/compiler/nest/core/src/Level.test.cpp index b9e203d..cc447e8 100644 --- a/compiler/nest/core/src/Level.test.cpp +++ b/compiler/nest/core/src/Level.test.cpp @@ -22,7 +22,7 @@ TEST(LEVEL, constructor) { nest::Level lv{3}; - ASSERT_EQ(lv.value(), 3); + ASSERT_EQ(3, lv.value()); } TEST(LEVEL, operator_eq) diff --git a/compiler/nest/core/src/Module.test.cpp b/compiler/nest/core/src/Module.test.cpp index 01e414d..70a6c47 100644 --- a/compiler/nest/core/src/Module.test.cpp +++ b/compiler/nest/core/src/Module.test.cpp @@ -29,7 +29,7 @@ TEST(MODULE, create_var) auto check = [](const nest::Module &m) { // This code will invoke 'const VarContext &var(void) const' method - ASSERT_EQ(m.var().count(), 1); + ASSERT_EQ(1, m.var().count()); }; create(m); @@ -47,7 +47,7 @@ TEST(MODULE, create_domain) auto check = [](const nest::Module &m) { // This code will invoke 'const DomainContext &domain(void) const' method - ASSERT_EQ(m.domain().count(), 1); + ASSERT_EQ(1, m.domain().count()); }; create(m, {1, 3, 3}); @@ -66,7 +66,7 @@ TEST(MODULE, push) m.push(ifm(var_ch, var_row, var_col)); - ASSERT_EQ(m.block().size(), 1); + ASSERT_EQ(1, m.block().size()); ASSERT_NE(m.block().at(0)->asPush(), nullptr); } @@ -82,8 +82,8 @@ TEST(MODULE, ret) m.push(ifm(ind)); m.ret(ofm(ind)); - ASSERT_EQ(m.ret().id(), ofm.id()); - ASSERT_EQ(m.ret().sub().rank(), 1); + ASSERT_EQ(ofm.id(), m.ret().id()); + ASSERT_EQ(1, m.ret().sub().rank()); } TEST(MODULE, copy) @@ -95,5 +95,5 @@ TEST(MODULE, copy) orig.var().make(); - ASSERT_EQ(copy.var().count(), 0); + ASSERT_EQ(0, copy.var().count()); } diff --git a/compiler/nest/core/src/Ret.test.cpp b/compiler/nest/core/src/Ret.test.cpp index 703f049..a852235 100644 --- a/compiler/nest/core/src/Ret.test.cpp +++ b/compiler/nest/core/src/Ret.test.cpp @@ -32,8 +32,8 @@ TEST(RET, ctor) nest::Ret ret{dom_id, sub}; - ASSERT_EQ(ret.id().value(), 0); - ASSERT_EQ(ret.sub().rank(), 1); + ASSERT_EQ(0, ret.id().value()); + ASSERT_EQ(1, ret.sub().rank()); } TEST(RET, copy) @@ -48,11 +48,11 @@ TEST(RET, copy) nest::Ret dst{dst_id, dst_sub}; - ASSERT_EQ(dst.id().value(), 1); - ASSERT_EQ(dst.sub().rank(), 2); + ASSERT_EQ(1, dst.id().value()); + ASSERT_EQ(2, dst.sub().rank()); dst = src; - ASSERT_EQ(dst.id().value(), 0); - ASSERT_EQ(dst.sub().rank(), 1); + ASSERT_EQ(0, dst.id().value()); + ASSERT_EQ(1, dst.sub().rank()); } diff --git a/compiler/nest/core/src/Schedule.test.cpp b/compiler/nest/core/src/Schedule.test.cpp index 8f0ddb2..7994d7a 100644 --- a/compiler/nest/core/src/Schedule.test.cpp +++ b/compiler/nest/core/src/Schedule.test.cpp @@ -26,7 +26,7 @@ TEST(SCHEDULE, module) nest::Schedule sch{m}; - ASSERT_EQ(sch.level(var_1).value(), 0); + ASSERT_EQ(0, sch.level(var_1).value()); } TEST(SCHEDULE, module_copy) @@ -40,5 +40,5 @@ TEST(SCHEDULE, module_copy) // Update on 'm' does not affect the schedule m.var().make(); - ASSERT_EQ(sch.var().count(), 1); + ASSERT_EQ(1, sch.var().count()); } diff --git a/compiler/nest/core/src/Var.test.cpp b/compiler/nest/core/src/Var.test.cpp index 29f8795..aea8c5d 100644 --- a/compiler/nest/core/src/Var.test.cpp +++ b/compiler/nest/core/src/Var.test.cpp @@ -23,7 +23,7 @@ TEST(VAR, ctor) nest::VarID id{0}; nest::Var var{id}; - ASSERT_EQ(var.id(), id); + ASSERT_EQ(id, var.id()); } TEST(VAR, cast) @@ -34,5 +34,5 @@ TEST(VAR, cast) nest::Expr expr = var; ASSERT_NE(expr->asVar(), nullptr); - ASSERT_EQ(expr->asVar()->id(), id); + ASSERT_EQ(id, expr->asVar()->id()); } diff --git a/compiler/nest/core/src/VarContext.test.cpp b/compiler/nest/core/src/VarContext.test.cpp index 169bd61..d953f2f 100644 --- a/compiler/nest/core/src/VarContext.test.cpp +++ b/compiler/nest/core/src/VarContext.test.cpp @@ -32,15 +32,15 @@ TEST(VAR_CONTEXT, count) { nest::VarContext ctx; - ASSERT_EQ(ctx.count(), 0); + ASSERT_EQ(0, ctx.count()); auto var_0 = ctx.make(); - ASSERT_EQ(ctx.count(), 1); + ASSERT_EQ(1, ctx.count()); auto var_1 = ctx.make(); - ASSERT_EQ(ctx.count(), 2); + ASSERT_EQ(2, ctx.count()); } TEST(VAR_CONTEXT, bound_one) @@ -49,13 +49,13 @@ TEST(VAR_CONTEXT, bound_one) auto var_0 = ctx.make(); - ASSERT_EQ(ctx.bound(var_0).min(), 0); - ASSERT_EQ(ctx.bound(var_0).max(), 0); + ASSERT_EQ(0, ctx.bound(var_0).min()); + ASSERT_EQ(0, ctx.bound(var_0).max()); ctx.bound(var_0) = nest::Bound{-3, 5}; - ASSERT_EQ(ctx.bound(var_0).min(), -3); - ASSERT_EQ(ctx.bound(var_0).max(), 5); + ASSERT_EQ(-3, ctx.bound(var_0).min()); + ASSERT_EQ(5, ctx.bound(var_0).max()); } TEST(VAR_CONTEXT, bound_independent) @@ -64,19 +64,19 @@ TEST(VAR_CONTEXT, bound_independent) auto var_0 = ctx.make(); - ASSERT_EQ(ctx.bound(var_0).min(), 0); - ASSERT_EQ(ctx.bound(var_0).max(), 0); + ASSERT_EQ(0, ctx.bound(var_0).min()); + ASSERT_EQ(0, ctx.bound(var_0).max()); auto var_1 = ctx.make(); - ASSERT_EQ(ctx.bound(var_1).min(), 0); - ASSERT_EQ(ctx.bound(var_1).max(), 0); + ASSERT_EQ(0, ctx.bound(var_1).min()); + ASSERT_EQ(0, ctx.bound(var_1).max()); ctx.bound(var_0) = nest::Bound{-3, 5}; - ASSERT_EQ(ctx.bound(var_0).min(), -3); - ASSERT_EQ(ctx.bound(var_0).max(), 5); + ASSERT_EQ(-3, ctx.bound(var_0).min()); + ASSERT_EQ(5, ctx.bound(var_0).max()); - ASSERT_EQ(ctx.bound(var_1).min(), 0); - ASSERT_EQ(ctx.bound(var_1).max(), 0); + ASSERT_EQ(0, ctx.bound(var_1).min()); + ASSERT_EQ(0, ctx.bound(var_1).max()); } diff --git a/compiler/nest/core/src/VarID.test.cpp b/compiler/nest/core/src/VarID.test.cpp index e4a17a5..05e4b9a 100644 --- a/compiler/nest/core/src/VarID.test.cpp +++ b/compiler/nest/core/src/VarID.test.cpp @@ -22,7 +22,7 @@ TEST(VAR_ID, ctor) { nest::VarID id{0}; - ASSERT_EQ(id.value(), 0); + ASSERT_EQ(0, id.value()); } TEST(VAR_ID, operator_eq) diff --git a/compiler/nest/core/src/expr/AddNode.test.cpp b/compiler/nest/core/src/expr/AddNode.test.cpp index 5c44c47..dba6cc8 100644 --- a/compiler/nest/core/src/expr/AddNode.test.cpp +++ b/compiler/nest/core/src/expr/AddNode.test.cpp @@ -36,8 +36,8 @@ TEST(ADD_NODE, cast) std::shared_ptr base = derived; ASSERT_NE(derived.get(), nullptr); - ASSERT_EQ(base->asAdd(), derived.get()); + ASSERT_EQ(derived.get(), base->asAdd()); - ASSERT_EQ(derived->lhs().get(), left.get()); - ASSERT_EQ(derived->rhs().get(), right.get()); + ASSERT_EQ(left.get(), derived->lhs().get()); + ASSERT_EQ(right.get(), derived->rhs().get()); } diff --git a/compiler/nest/core/src/expr/DerefNode.test.cpp b/compiler/nest/core/src/expr/DerefNode.test.cpp index e02a7de..125d8bf 100644 --- a/compiler/nest/core/src/expr/DerefNode.test.cpp +++ b/compiler/nest/core/src/expr/DerefNode.test.cpp @@ -35,5 +35,5 @@ TEST(DEREF_NODE, cast) std::shared_ptr base = derived; ASSERT_NE(derived.get(), nullptr); - ASSERT_EQ(base->asDeref(), derived.get()); + ASSERT_EQ(derived.get(), base->asDeref()); } diff --git a/compiler/nest/core/src/expr/MulNode.test.cpp b/compiler/nest/core/src/expr/MulNode.test.cpp index b2d2947..85cb5a5 100644 --- a/compiler/nest/core/src/expr/MulNode.test.cpp +++ b/compiler/nest/core/src/expr/MulNode.test.cpp @@ -36,8 +36,8 @@ TEST(MUL_NODE, cast) std::shared_ptr base = derived; ASSERT_NE(derived.get(), nullptr); - ASSERT_EQ(base->asMul(), derived.get()); + ASSERT_EQ(derived.get(), base->asMul()); - ASSERT_EQ(derived->lhs().get(), left.get()); - ASSERT_EQ(derived->rhs().get(), right.get()); + ASSERT_EQ(left.get(), derived->lhs().get()); + ASSERT_EQ(right.get(), derived->rhs().get()); } diff --git a/compiler/nest/core/src/expr/Subscript.test.cpp b/compiler/nest/core/src/expr/Subscript.test.cpp index 2f187b8..cfcdd44 100644 --- a/compiler/nest/core/src/expr/Subscript.test.cpp +++ b/compiler/nest/core/src/expr/Subscript.test.cpp @@ -31,7 +31,7 @@ TEST(SUBSCRIPT, ctor) nest::expr::Subscript sub{expr_0, expr_1}; - ASSERT_EQ(sub.rank(), 2); - ASSERT_EQ(sub.at(0), expr_0); - ASSERT_EQ(sub.at(1), expr_1); + ASSERT_EQ(2, sub.rank()); + ASSERT_EQ(expr_0, sub.at(0)); + ASSERT_EQ(expr_1, sub.at(1)); } diff --git a/compiler/nest/core/src/expr/VarNode.test.cpp b/compiler/nest/core/src/expr/VarNode.test.cpp index e8b2764..9400551 100644 --- a/compiler/nest/core/src/expr/VarNode.test.cpp +++ b/compiler/nest/core/src/expr/VarNode.test.cpp @@ -31,7 +31,7 @@ TEST(VAR_NODE, ctor) auto node = make(4); // NOTE 'id' should be copied - ASSERT_EQ(node->id().value(), 4); + ASSERT_EQ(4, node->id().value()); } TEST(VAR_NODE, cast) @@ -43,5 +43,5 @@ TEST(VAR_NODE, cast) // NOTE Cast method should be overrided ASSERT_NE(derived.get(), nullptr); - ASSERT_EQ(base->asVar(), derived.get()); + ASSERT_EQ(derived.get(), base->asVar()); } diff --git a/compiler/nest/core/src/stmt/PushNode.test.cpp b/compiler/nest/core/src/stmt/PushNode.test.cpp index a54efbb..c02c692 100644 --- a/compiler/nest/core/src/stmt/PushNode.test.cpp +++ b/compiler/nest/core/src/stmt/PushNode.test.cpp @@ -33,5 +33,5 @@ TEST(STMT_PUSH_NODE, cast) std::shared_ptr base = derived; ASSERT_NE(derived.get(), nullptr); - ASSERT_EQ(base->asPush(), derived.get()); + ASSERT_EQ(derived.get(), base->asPush()); } diff --git a/compiler/nnc/CMakeLists.txt b/compiler/nnc/CMakeLists.txt index f899ffb..ab91cd4 100644 --- a/compiler/nnc/CMakeLists.txt +++ b/compiler/nnc/CMakeLists.txt @@ -14,7 +14,6 @@ configure_file(${NNC_ROOT_SRC_DIR}/include/Definitions.h.in # target for compiler executable add_executable(${NNC_TARGET_EXECUTABLE} ${NNC_DRIVER_DIR}/main.cpp ${NNC_DRIVER_DIR}/Driver.cpp ${NNC_DRIVER_DIR}/Options.cpp) -target_link_libraries(${NNC_TARGET_EXECUTABLE} PRIVATE stdex) # install compiler nnc_install_executable(${NNC_TARGET_EXECUTABLE}) diff --git a/compiler/nnc/cmake/config.cmake b/compiler/nnc/cmake/config.cmake index d9a1288..8623c8c 100644 --- a/compiler/nnc/cmake/config.cmake +++ b/compiler/nnc/cmake/config.cmake @@ -21,7 +21,8 @@ set(NNC_INSTALL_LIB_PATH ${NNC_INSTALL_PATH}/lib) # directory that contains othe # # find necessary packages # -find_package(HDF5 COMPONENTS CXX QUIET) +nnas_find_package(HDF5 QUIET) + # defines if hdf5 package was found if(HDF5_FOUND) set(NNC_HDF5_SUPPORTED ON) diff --git a/compiler/nnc/driver/Driver.cpp b/compiler/nnc/driver/Driver.cpp index 5b36962..995fa9b 100644 --- a/compiler/nnc/driver/Driver.cpp +++ b/compiler/nnc/driver/Driver.cpp @@ -49,7 +49,7 @@ #include #endif // NNC_FRONTEND_ONNX_ENABLED -#include +#include namespace nnc { @@ -169,19 +169,19 @@ void Driver::registerBackendSpecificPasses() if (cli::target == NNC_TARGET_ARM_CPP || cli::target == NNC_TARGET_X86_CPP) { - _passManager.registerPass(stdex::make_unique()); - _passManager.registerPass(stdex::make_unique(mir::DataFormat::NHWC)); + _passManager.registerPass(std::make_unique()); + _passManager.registerPass(std::make_unique(mir::DataFormat::NHWC)); } else if (cli::target == NNC_TARGET_ARM_GPU_CPP) { - _passManager.registerPass(stdex::make_unique()); - _passManager.registerPass(stdex::make_unique()); + _passManager.registerPass(std::make_unique()); + _passManager.registerPass(std::make_unique()); // TODO Change to DataFormat::NCHW when fix it in ACL - _passManager.registerPass(stdex::make_unique(mir::DataFormat::NHWC)); + _passManager.registerPass(std::make_unique(mir::DataFormat::NHWC)); } else if (cli::target == NNC_TARGET_INTERPRETER) { - _passManager.registerPass(stdex::make_unique(mir::DataFormat::NHWC)); + _passManager.registerPass(std::make_unique(mir::DataFormat::NHWC)); } else { diff --git a/compiler/nnc/requires.cmake b/compiler/nnc/requires.cmake index 8b460d9..2fcaea4 100644 --- a/compiler/nnc/requires.cmake +++ b/compiler/nnc/requires.cmake @@ -1,7 +1,3 @@ require("adtidas") -require("mir-caffe2-importer") -require("mir-caffe-importer") -require("mir-onnx-importer") +require("mir") require("mir-interpreter") -require("mir-tflite-importer") -require("stdex") diff --git a/compiler/nnc/tests/acl_soft_backend/CMakeLists.txt b/compiler/nnc/tests/acl_soft_backend/CMakeLists.txt index b33c1e6..69a3be8 100644 --- a/compiler/nnc/tests/acl_soft_backend/CMakeLists.txt +++ b/compiler/nnc/tests/acl_soft_backend/CMakeLists.txt @@ -29,7 +29,8 @@ if(NOT DEFINED ENV{ODROID_H5_DIR}) return() endif() -find_package(HDF5 COMPONENTS CXX REQUIRED) +nnas_find_package(HDF5 QUIET) + nnas_find_package(GTest REQUIRED) # Provide the test suite with the information where to locate executalbes to run etc. diff --git a/compiler/nnc/tests/acl_soft_backend/artifact_cmake/CMakeLists.txt b/compiler/nnc/tests/acl_soft_backend/artifact_cmake/CMakeLists.txt index ceecded..b0a805a 100644 --- a/compiler/nnc/tests/acl_soft_backend/artifact_cmake/CMakeLists.txt +++ b/compiler/nnc/tests/acl_soft_backend/artifact_cmake/CMakeLists.txt @@ -11,7 +11,8 @@ set(ODROID_ACL_BUILD_DIR ${ODROID_ACL_DIR}/build) find_library(OPEN_CL OpenCL /usr/lib/arm-linux-gnueabihf) find_library(ARM_COMPUTE arm_compute PATHS ${ODROID_ACL_BUILD_DIR}) find_library(ARM_COMPUTE_CORE arm_compute_core PATHS ${ODROID_ACL_BUILD_DIR}) -find_package(HDF5 COMPONENTS CXX REQUIRED) +nnas_find_package(HDF5 QUIET) + add_executable(nnc_test main.cpp AclArtifact.cpp) diff --git a/compiler/nnc/utils/caffe_model_maker/AllFill.sh b/compiler/nnc/utils/caffe_model_maker/AllFill.sh deleted file mode 100755 index 93e38d1..0000000 --- a/compiler/nnc/utils/caffe_model_maker/AllFill.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh -: ' -Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -' - - -#Fills all models and writes errors -usage () { - echo "Filler.sh should be in the working directory\nusage: - no args - assumes current directory - -d= fills models in - Example: - $(basename $0) -d='./foobar/'" -} - -DIR="./" -for i in "$@" -do - case $i in - -h|--help|help) - usage - exit 1 - ;; - -d=*) - DIR=${i#*=} - ;; - esac - shift -done -echo $DIR -if [ $# -eq 0 ]; then - echo "Assume working directory" -fi -for a in `ls $DIR*.prototxt`; do - ./Filler.sh $a -done 2>error.log diff --git a/compiler/nnc/utils/caffe_model_maker/Filler.sh b/compiler/nnc/utils/caffe_model_maker/Filler.sh deleted file mode 100755 index 963edbf..0000000 --- a/compiler/nnc/utils/caffe_model_maker/Filler.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -: ' -Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -' - -#Fills $1 with random weights -if [ $# -eq 0 ] - then - echo "usage:\n $(basename $0) foo.prototxt" - exit 1 -fi -FN=$1 -NOEXT=${FN%%.*} # filename without the extension -mkdir $NOEXT -caffegen init < $FN > $NOEXT/filled.prototxt -caffegen encode < $NOEXT/filled.prototxt > $NOEXT/model.caffemodel diff --git a/compiler/nnc/utils/caffe_model_maker/GenerateCaffeModels.py b/compiler/nnc/utils/caffe_model_maker/GenerateCaffeModels.py deleted file mode 100755 index ca8b377..0000000 --- a/compiler/nnc/utils/caffe_model_maker/GenerateCaffeModels.py +++ /dev/null @@ -1,722 +0,0 @@ -#!/usr/bin/python3 -""" -Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" - -import caffe -import numpy as np -import sys -import h5py -from itertools import chain -from caffe import layers as L -import random -import lmdb -from collections import Counter, OrderedDict - -if (len(sys.argv) < 2): - dest_folder = '' - print('Using current directory as destination folder') -else: - dest_folder = sys.argv[1] + '/' - - -class PH: - """ - PlaceHolder value - """ - - def __init__(self, type, param): - self.type = type - self.param = param - - -# Bookkeeping -LS = 224 -# bynaryProto file for Infogain -H = np.eye(3, dtype='f4') -blob = caffe.io.array_to_blobproto(H.reshape((1, 1, 3, 3))) -with open(dest_folder + 'infogainH.binaryproto', 'wb+') as f: - f.write(blob.SerializeToString()) - -# List of hdf5 files -with open(dest_folder + "in", 'w+') as f: - f.write('in.hdf5') - -#Window File -with open(dest_folder + "in_winds", 'w+') as f: - f.write("""# 1 -in.jpg -3 -224 -224 -2 -1 0.1 50 50 60 70 -1 0.9 30 30 50 50 -# 2 -in.jpg -3 -224 -224 -2 -1 0.1 50 50 70 70 -1 0.9 30 30 50 50 -""") - -# HDF5 file for HDF5DataSet -h5f = h5py.File(dest_folder + "in.hdf5", "w") -h5f.create_dataset("data", data=np.random.rand(1, 3, LS, LS)) -h5f.close() - -# LMDB file -env = lmdb.open(dest_folder + 'test-lmdb') -with env.begin(write=True) as txn: - img_data = np.random.rand(3, LS, LS) - datum = caffe.io.array_to_datum(img_data, label=1) - txn.put('{:0>10d}'.format(1).encode('ascii'), datum.SerializeToString()) -env.close() - -# recurring parameters -losspara = {'ignore_label': True, 'normalization': 1, 'normalize': True} -softmaxpara = {'engine': 0, 'axis': 1} -gdfil = {'type': 'gaussian', 'std': 0.001} -cofil = {'type': 'constant', 'value': 0} -rp = { - 'num_output': 1, - 'weight_filler': gdfil, - 'bias_filler': cofil, - 'expose_hidden': True -} - -filler_par = { - 'type': 'constant', - 'value': 0, - 'min': 0, - 'max': 1, - 'mean': 0, - 'std': 1, - 'sparse': -1, # -1 means no sparsification - 'variance_norm': 0 -} # 0 = FAN_IN, 1 = FAN_OUT, 2 = AVERAGE - -OPS = [ - ('Parameter', { - 'shape': { - 'dim': [1] - }, - "is_data": True - }), # ok - ( - 'Data', - { - 'source': 'test-lmdb', # FIXME: unknown DB backend - 'batch_size': 1, - 'rand_skip': 0, - 'backend': 1, # 0 = LEVELDB, 1 = LMDB - 'scale': 1.0, # deprecated in favor of TransformationParameter - 'mean_file': 'wtf.is_that', - 'crop_size': 0, - 'mirror': False, - 'force_encoded_color': False, - 'prefetch': 4, - "is_data": True - }), - ( - 'DummyData', - { - 'data_filler': cofil, # ok - #'num' : [1,1,1], # deprecated shape specification - #'channels' : [2,2,2], - #'height' : [3,3,3], - #'width' : [4,4,4]}, - 'shape': { - 'dim': [1, 3, LS, LS] - }, - "is_data": True - }), - ( - 'ImageData', - { - 'source': 'in_imgs', # file with list of imgs - 'top': 'op2', - 'batch_size': 1, - 'rand_skip': 0, - 'shuffle': False, - 'new_height': 0, - 'new_width': 0, - 'is_color': True, - 'root_folder': '', - 'scale': 1.0, # deprecated in favor of TransformationParameter - 'mirror': False, - "is_data": True - }), - ( - 'WindowData', - { - 'source': 'in_winds', - 'top': 'op2', - 'batch_size': 1, - 'mean_file': 'in.jpg', - 'transform_param': { - 'scale': 0.8, - 'crop_size': 24, - 'mirror': False, - #'fg_treshold' : 0.5, - #'bg_treshold' : 0.5, - #'fg_fraction' : 0.25, - }, - 'context_pad': 1, - 'crop_mode': 'warp', - 'cache_images': True, - 'root_folder': './', - "is_data": True - }), - ( - 'HDF5Data', - { - 'source': 'in', # This is the name of the file WITH HDF5 FILENAMES 0_0 - # Top should have the same name as the dataset in the hdf5 file - # FIXME Requires Caffegen to be built with Caffe that supports LMDB - 'batch_size': 1, - 'shuffle': False, - "is_data": True - }), - ('Input', { - 'shape': { - 'dim': [1, 2, 3, 4] - }, - "is_data": True - }), # ok - ( - 'MemoryData', - { - 'batch_size': 1, # ok - 'channels': 2, - 'height': 3, - 'width': 4, - 'top': "foo", - "is_data": True - }), - - ## Regular OPS - ( - "Convolution", - { - 'num_output': 64, # ok - 'kernel_size': 9, - 'stride': 1, - 'pad': 0, - 'weight_filler': gdfil, - 'param': [{ - 'lr_mult': 1 - }, { - 'lr_mult': 0.1 - }], - 'bias_filler': cofil - }), - - # Depthvise conv - ( - "Convolution", - { - 'num_output': 12, # ok - 'kernel_size': 9, - 'stride': 1, - 'dilation': 2, - 'group': 3, - 'pad': 0, - 'weight_filler': gdfil, - 'param': [{ - 'lr_mult': 1 - }, { - 'lr_mult': 0.1 - }], - 'bias_filler': cofil - }), - ( - "Deconvolution", - { - 'convolution_param': # ok - { - 'num_output': 4, - 'kernel_size': 9, - 'stride': 1, - 'pad': 0, - 'weight_filler': gdfil, - 'bias_filler': cofil - } - }), - # Depthvise deconv - ( - "Deconvolution", - { - 'convolution_param': # ok - { - 'num_output': 12, - 'kernel_size': 9, - 'stride': 1, - 'dilation': 2, - 'group': 3, - 'pad': 0, - 'weight_filler': gdfil, - 'bias_filler': cofil - } - }), - ( - 'BatchNorm', - { - 'eps': 1e-5, # ok - 'moving_average_fraction': 0.999 - }), - ( - 'LRN', - { - 'alpha': 1., # ok - 'beta': 0.75, - 'norm_region': 1, - 'local_size': 5, - 'k': 1, - 'engine': 0 - }), - # local_size[default 5]: the number of channels to sum over - # alpha[default 1]: the scaling paramete - # beta[default5]: the exponent - # norm_region[default ACROSS_CHANNLS]: whether to sum over adjacent channels(ACROSS_CHANNLS) or nearby - # spatial locations(WITHIN_CHANNLS) - # `input / (1 + (\alpha/n) \sum_i x_i^2)^\beta` - ( - "MVN", - { - 'normalize_variance': True, # ok - 'across_channels': False, - 'eps': 1e-9 - }), - ( - 'Im2col', - { - 'convolution_param': # ok - { - 'num_output': 64, - 'kernel_size': 9, - 'stride': 1, - 'pad': 0, - 'weight_filler': gdfil, - # 'param' : [{'lr_mult':1},{'lr_mult':0.1}], - 'bias_filler': cofil - } - }), - ('Dropout', { - 'dropout_ratio': 0.5 - }), # ok - ('Split', {}), # ok - ('Concat', { - 'axis': 1 - }), # ok - ( - 'Tile', - { - 'axis': 1, # ok - 'tiles': 2 - }), - ('Slice', { - 'axis': 1, - 'top': 'op2', - 'slice_point': 1 - }), - ( - 'Reshape', - { - 'shape': { - 'dim': [1, 0, -1] - }, # ok - 'axis': 0, - 'num_axes': -1 - }), - # reshapes only [axis, axis + num_axes] if those aren't 0 and -1; axis can be negative - # 0 in shape means retaining dim size, -1 means auto size - ( - 'Flatten', - { - 'axis': 1, # ok - 'end_axis': -1 - }), - ( - 'Pooling', - { - 'pool': 0, # ok # pool: 0 = MAX, 1 = AVE, 2 = STOCHASTIC - 'pad': 0, # can be replaced with pad_w, pad_h - 'kernel_size': 3, # can be replaced with kernel_w, kernel_h - 'stride': 1, # can be replaced with stride_w, stride_h - 'engine': 0, - 'global_pooling': False - }), - # 'round_mode' : 0}), # 0 = CELS, 1 = FLOOR - ( - 'Reduction', - { - 'operation': 1, # ok # 1 = SUM, 2 = ASUM, 3 = SUMSQ, 4 = MEAN # ok - 'axis': 0, - 'coeff': 1.0 - }), - ( - 'SPP', - { - 'pyramid_height': 1, # ok - 'pool': 0, - 'engine': 0 - }), - ( - 'InnerProduct', - { - 'num_output': 2, # ok - 'bias_term': True, - 'weight_filler': filler_par, - 'bias_filler': filler_par, - 'axis': 1, - 'transpose': False - }), - ( - 'Embed', - { - 'num_output': 2, # ok - 'input_dim': 1, - 'bias_term': True, - 'weight_filler': filler_par, - 'bias_filler': filler_par - }), - ( - 'ArgMax', - { - 'out_max_val': False, # ok # if True, outputs pairs (argmax, maxval) # ok - 'top_k': 1, - 'axis': -1 - }), - ( - 'Softmax', - { - 'engine': 0, # ok - 'axis': 1 - }), - ( - 'ReLU', - { - 'negative_slope': 0, # ok - 'engine': 0 - }), - ( - 'PReLU', - { - 'filler': filler_par, # ok - 'channel_shared': False - }), - ('ELU', { - 'alpha': 1 - }), # ok - ('Sigmoid', { - 'engine': 0 - }), # ok - ('BNLL', {}), # ok - ('TanH', { - 'engine': 0 - }), # ok - ('Threshold', { - 'threshold': 0 - }), # ok - ( - 'Bias', - { - 'axis': 0, # ok - 'num_axes': -1, - 'filler': filler_par - }), - ( - 'Scale', - { - 'axis': 0, # ok - 'num_axes': -1, - 'filler': filler_par, - 'bias_term': False, - 'bias_filler': filler_par - }), - ('AbsVal', {}), # ok - ( - 'Log', - { - 'base': -1.0, # ok - 'scale': 1.0, - 'shift': PH(float, (2.0, 10.0)), - 'how_many': 10 - }), # y = ln(shift + scale * x) (log_base() for base > 0) - ( - 'Power', - { - 'power': -1.0, # ok - 'scale': 1.0, - 'shift': 0.0 - }), # y = (shift + scale * x) ^ power - ( - 'Exp', - { - 'base': -1.0, # ok - 'scale': 1.0, - 'shift': 0.0 - }), - - ## TWO INPUTS - ( - 'Crop', - { - 'axis': 2, # ok - 'offset': [0], - "inputs": 2 - }), # if one offset - for all dims, more - specifies - ( - "Eltwise", - { - 'operation': 1, # ok - 'coeff': [3, 3], - 'stable_prod_grad': True, - "inputs": 2 - }), - ("EuclideanLoss", { - "inputs": 2 - }), # ok - ("HingeLoss", { - 'norm': 1, - "inputs": 2 - }), # L1 = 1; L2 = 2; # ok - ("SigmoidCrossEntropyLoss", { - 'loss_param': losspara, - "inputs": 2 - }), # ok - - ## TWO Inputs, special shape - ( - "Accuracy", - { - 'top_k': 1, # FIXME: different bottom shapes needed - 'axis': 0, - 'ignore_label': 0, - "inputs": 2, - "special_shape": [1, 3, 1, 1] - }), - ( - "SoftmaxWithLoss", - { - 'loss_param': losspara, # FIXME: different bottom shapes needed - 'softmax_param': softmaxpara, - "inputs": 2, - "special_shape": [1, 1, 1, 1] - }), - ("MultinomialLogisticLoss", { - 'loss_param': losspara, - "inputs": 2, - "special_shape": [1, 1, 1, 1] - }), # FIXME: different bottom shapes needed - ("Filter", { - "inputs": 2, - "special_shape": [1, 1, 1, 1] - }), # FIXME: different bottom shapes needed - ('BatchReindex', { - "inputs": 2, - "special_shape": [2] - }), # takes indices as second blob - ("InfogainLoss", { - 'source': 'infogainH.binaryproto', - 'axis': 1, - "inputs": 2, - "special_shape": [1, 1, 1, 1] - }), - ( - 'Python', - { - 'python_param': # Custom Loss layer - { - 'module': 'Pyloss', # the module name -- usually the filename -- that needs to be in $PYTHONPATH - 'layer': 'EuclideanLossLayer', # the layer name -- the class name in the module - 'share_in_parallel': False - }, - # set loss weight so Caffe knows this is a loss layer. - # since PythonLayer inherits directly from Layer, this isn't automatically - # known to Caffe - 'loss_weight': 1, - "inputs": 2, - "special_shape": [1, 3, 1, 1] - }, - ), - - ## NOTOP OPS - ('HDF5Output', { - 'file_name': 'out.hdf5', - "inputs": 2, - "is_notop": True - }), # ok - ('Silence', { - "inputs": 2, - "is_notop": True - }), # ok, need to remove tops - - ## THREE INPUTS - ("RNN", { - 'recurrent_param': rp, - 'top': "out2", - "inputs": 3 - }), # ok - ("Recurrent", { - 'recurrent_param': rp, - 'top': "out2", - "inputs": 3 - }), # ok - - ## FOUR INPUTS - ("LSTM", { - 'recurrent_param': rp, - 'top': ["out2", "out3"], - "inputs": 4 - }), # ok - - ## Handled explicitly (special case) - ("ContrastiveLoss", { - 'margin': 1.0, - 'legacy_version': False - }), -] - -#Helper functions - - -def traverse(obj, callback=None): - """ - walks a nested dict/list recursively - :param obj: - :param callback: - :return: - """ - if isinstance(obj, dict): - value = {k: traverse(v, callback) for k, v in obj.items()} - elif isinstance(obj, list): - value = [traverse(elem, callback) for elem in obj] - else: - value = obj - - if callback is None: - return value - else: - return callback(value) - - -def mock(inp): - if not (isinstance(inp, PH)): return inp - if inp.type == int: - return random.randint(*inp.param) - if inp.type == float: - return random.uniform(*inp.param) - - -EXTRA_SHAPES = \ - [(), # alredy defined - [1, 3], - [1, 3, 1], - [1, 3, 1]] - - -class Layer: - """ - Represents a caffe layer - """ - - def __init__(self, name, params): - self.name = name - self.args = params - if self.args == None: self.args = dict() - self.num_inp = self.args.pop("inputs", 1) - self.num_out = self.args.pop("outputs", 1) - self.special_shape = self.args.pop("special_shape", - False) # 2nd input has special shape - self.is_data = self.args.pop("is_data", False) - self.is_notop = self.args.pop("is_notop", False) - - def make_net(self): - """ - Creates a protobuf network - :return: - """ - net = caffe.NetSpec() - - if self.is_data: - net.data = getattr(L, self.name)(**self.args) - - # Very special, - elif self.name == "ContrastiveLoss": - net.data = L.Input(shape={'dim': [1, 4]}) - net.data1 = L.DummyData(data_filler=cofil, shape={'dim': [1, 4]}) - net.data2 = L.DummyData(data_filler=cofil, shape={'dim': [1, 1]}) - - net.op = getattr(L, self.name)(net.data, net.data1, net.data2, **self.args) - - # this covers most cases - else: - net.data = L.Input(shape={'dim': [1, 3, LS, LS]}) - if self.num_inp == 2: - net.data1 = L.DummyData(data_filler=cofil, shape={'dim': [1, 3, LS, LS]}) - elif self.num_inp > 2: - for i in range(1, self.num_inp): - setattr( - net, "data" + str(i), - L.DummyData(data_filler=cofil, shape={'dim': EXTRA_SHAPES[i]})) - if self.special_shape: - net.data = L.Input(shape={'dim': [1, 3, 1, 1]}) - net.data1 = L.DummyData( - data_filler=cofil, shape={'dim': self.special_shape}) - - net.op = getattr(L, self.name)( - net.data, - *[getattr(net, "data" + str(i)) - for i in range(1, self.num_inp)], **self.args) - - if self.is_notop: - net.op.fn.tops = OrderedDict() - net.op.fn.ntop = 0 # the messing about in question - - return net - - -class LayerMaker: - """ - Factory class for Layer - """ - - def __init__(self, params): - self.name, self.args = params - self.how_many = self.args.pop("how_many", 1) - - def make(self): - return [Layer(self.name, traverse(self.args, mock)) for i in range(self.how_many)] - - -layer_gen = chain(*map(lambda para: LayerMaker(para).make(), OPS)) - -filename = dest_folder + '{}_{}.prototxt' - -counter = Counter() -for layer in layer_gen: - n = layer.make_net() - counter[layer.name] += 1 - - with open(filename.format(layer.name, counter[layer.name] - 1), 'w+') as ptxt_file: - print(n.to_proto(), file=ptxt_file) - - if layer.name == "Python": # Special case for python layer - with open("Python_0.caffemodel", 'wb+') as caffemodelFile: - caffemodelFile.write(n.to_proto().SerializeToString()) diff --git a/compiler/nnc/utils/caffe_model_maker/Pyloss.py b/compiler/nnc/utils/caffe_model_maker/Pyloss.py deleted file mode 100755 index e3f7817..0000000 --- a/compiler/nnc/utils/caffe_model_maker/Pyloss.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -COPYRIGHT - -All contributions by the University of California: -Copyright (c) 2014-2017 The Regents of the University of California (Regents) -All rights reserved. - -All other contributions: -Copyright (c) 2014-2017, the respective contributors -All rights reserved. - -Caffe uses a shared copyright model: each contributor holds copyright over -their contributions to Caffe. The project versioning records all such -contribution and copyright details. If a contributor wants to further mark -their specific copyright on a particular contribution, they should indicate -their copyright solely in the commit message of the change when it is -committed. - -LICENSE - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -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. - -CONTRIBUTION AGREEMENT - -By contributing to the BVLC/caffe repository through pull-request, comment, -or otherwise, the contributor releases their content to the -license and copyright terms herein. -""" -import caffe -import numpy as np - - -class EuclideanLossLayer(caffe.Layer): - """ - Compute the Euclidean Loss in the same manner as the C++ EuclideanLossLayer - to demonstrate the class interface for developing layers in Python. - """ - - def setup(self, bottom, top): - # check input pair - if len(bottom) != 2: - raise Exception("Need two inputs to compute distance.") - - def reshape(self, bottom, top): - # check input dimensions match - if bottom[0].count != bottom[1].count: - raise Exception("Inputs must have the same dimension.") - # difference is shape of inputs - self.diff = np.zeros_like(bottom[0].data, dtype=np.float32) - # loss output is scalar - top[0].reshape(1) - - def forward(self, bottom, top): - self.diff[...] = bottom[0].data - bottom[1].data - top[0].data[...] = np.sum(self.diff**2) / bottom[0].num / 2. - - def backward(self, top, propagate_down, bottom): - for i in range(2): - if not propagate_down[i]: - continue - if i == 0: - sign = 1 - else: - sign = -1 - bottom[i].diff[...] = sign * self.diff / bottom[i].num diff --git a/compiler/nnc/utils/caffe_model_maker/README.md b/compiler/nnc/utils/caffe_model_maker/README.md deleted file mode 100644 index e34a769..0000000 --- a/compiler/nnc/utils/caffe_model_maker/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Utils -Caffe model generation helpers - -REQUIRES: - -* caffe -* h5py -* lmdb -* numpy -* caffegen in `$PATH` - -`GenerateCaffeModels.py` creates `*.prototxt` files for 1 and 2 layer caffe models -The generator can create multiple examples of any layer, assuming you add a -`how_many` field into the layer's dict. You will also need to replace the constants in said dict with `PH(type, param)` values, where `type` is the type of the placeholder variable -and `params` is a list (or tuple) of paramenters for generating the mock. - -For an example of generating multiple instances of a layer see the `Log` layer. - -`Filler.sh` fills a single model with random weights by using `caffegen` and creates a dir with a filled `prototxt` and a `caffemodel` binary file. The result directory is located in the same directory as the `prototxt` file - -`AllFill.sh` fills all `*.prototxt` files in the current directory or in provided directory -(-d) diff --git a/compiler/nnkit-caffe/README.md b/compiler/nnkit-caffe/README.md new file mode 100644 index 0000000..c5d8bb2 --- /dev/null +++ b/compiler/nnkit-caffe/README.md @@ -0,0 +1 @@ +# nnkit-caffe diff --git a/compiler/nnkit-mocotf/README.md b/compiler/nnkit-mocotf/README.md new file mode 100644 index 0000000..e81692c --- /dev/null +++ b/compiler/nnkit-mocotf/README.md @@ -0,0 +1 @@ +# nnkit-mocotf diff --git a/compiler/nnkit-onnxrt/README.md b/compiler/nnkit-onnxrt/README.md new file mode 100644 index 0000000..ccc948c --- /dev/null +++ b/compiler/nnkit-onnxrt/README.md @@ -0,0 +1 @@ +# nnkit-onnxrt diff --git a/compiler/nnkit-tf/README.md b/compiler/nnkit-tf/README.md new file mode 100644 index 0000000..82d279b --- /dev/null +++ b/compiler/nnkit-tf/README.md @@ -0,0 +1 @@ +# nnkit-tf diff --git a/compiler/nnkit-tflite/CMakeLists.txt b/compiler/nnkit-tflite/CMakeLists.txt index d1dbbd7..2ca9a13 100644 --- a/compiler/nnkit-tflite/CMakeLists.txt +++ b/compiler/nnkit-tflite/CMakeLists.txt @@ -1,4 +1,4 @@ -nnas_find_package(TensorFlowLite QUIET EXACT 1.12) +nnas_find_package(TensorFlowLite QUIET EXACT 1.13.1) if(NOT TensorFlowLite_FOUND) return() diff --git a/compiler/nnkit-tflite/README.md b/compiler/nnkit-tflite/README.md new file mode 100644 index 0000000..6d294f6 --- /dev/null +++ b/compiler/nnkit-tflite/README.md @@ -0,0 +1 @@ +# nnkit-tflite diff --git a/compiler/nnkit-tflite/backend/Backend.cpp b/compiler/nnkit-tflite/backend/Backend.cpp index 7d76606..08ba338 100644 --- a/compiler/nnkit-tflite/backend/Backend.cpp +++ b/compiler/nnkit-tflite/backend/Backend.cpp @@ -16,8 +16,8 @@ #include "nnkit/support/tflite/AbstractBackend.h" -#include -#include +#include +#include #include diff --git a/compiler/nnkit-tflite/support/CMakeLists.txt b/compiler/nnkit-tflite/support/CMakeLists.txt index 0a3e2fb..90d6948 100644 --- a/compiler/nnkit-tflite/support/CMakeLists.txt +++ b/compiler/nnkit-tflite/support/CMakeLists.txt @@ -1,10 +1,10 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") -# TODO Rename nnkit_support_tflite-1.12 as nnkit_tflite_support-1.12 -add_library(nnkit_support_tflite-1.12 STATIC ${SOURCES}) -set_target_properties(nnkit_support_tflite-1.12 PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(nnkit_support_tflite-1.12 PUBLIC include) -target_link_libraries(nnkit_support_tflite-1.12 nnkit_intf_backend) -target_link_libraries(nnkit_support_tflite-1.12 tensorflowlite-1.12) +# TODO Rename nnkit_support_tflite-1.13.1 as nnkit_tflite_support-1.13.1 +add_library(nnkit_support_tflite-1.13.1 STATIC ${SOURCES}) +set_target_properties(nnkit_support_tflite-1.13.1 PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(nnkit_support_tflite-1.13.1 PUBLIC include) +target_link_libraries(nnkit_support_tflite-1.13.1 nnkit_intf_backend) +target_link_libraries(nnkit_support_tflite-1.13.1 tensorflowlite-1.13.1) -add_library(nnkit_support_tflite ALIAS nnkit_support_tflite-1.12) +add_library(nnkit_support_tflite ALIAS nnkit_support_tflite-1.13.1) diff --git a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/AbstractBackend.h b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/AbstractBackend.h index d2f6aa9..7b89c7f 100644 --- a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/AbstractBackend.h +++ b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/AbstractBackend.h @@ -18,7 +18,7 @@ #define __NNKIT_SUPPORT_TFLITE_ABSTRACT_BACKEND_H__ #include -#include +#include namespace nnkit { diff --git a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSet.h b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSet.h index d28ab6e..4226a3a 100644 --- a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSet.h +++ b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSet.h @@ -17,7 +17,7 @@ #ifndef __NNKIT_SUPPORT_TFLITE_TENSOR_SET_H__ #define __NNKIT_SUPPORT_TFLITE_TENSOR_SET_H__ -#include +#include #include diff --git a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSets.h b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSets.h index 5708031..13dea98 100644 --- a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSets.h +++ b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorSets.h @@ -19,7 +19,7 @@ #include "nnkit/support/tflite/TensorSet.h" -#include +#include namespace nnkit { diff --git a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorUtils.h b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorUtils.h index 05fb7d5..20b34a3 100644 --- a/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorUtils.h +++ b/compiler/nnkit-tflite/support/include/nnkit/support/tflite/TensorUtils.h @@ -17,7 +17,7 @@ #ifndef __NNKIT_SUPPORT_TENSOR_UTILS_H__ #define __NNKIT_SUPPORT_TENSOR_UTILS_H__ -#include +#include #include namespace nnkit diff --git a/compiler/nnkit/actions/HDF5/CMakeLists.txt b/compiler/nnkit/actions/HDF5/CMakeLists.txt index b799f6d..63d3320 100644 --- a/compiler/nnkit/actions/HDF5/CMakeLists.txt +++ b/compiler/nnkit/actions/HDF5/CMakeLists.txt @@ -1,4 +1,4 @@ -find_package(HDF5 COMPONENTS CXX QUIET) +nnas_find_package(HDF5 QUIET) if(NOT HDF5_FOUND) return() diff --git a/compiler/nnop/README.md b/compiler/nnop/README.md new file mode 100644 index 0000000..89edf81 --- /dev/null +++ b/compiler/nnop/README.md @@ -0,0 +1 @@ +# nnop diff --git a/compiler/nnsuite/README.md b/compiler/nnsuite/README.md new file mode 100644 index 0000000..d3b2828 --- /dev/null +++ b/compiler/nnsuite/README.md @@ -0,0 +1 @@ +# nnsuite diff --git a/compiler/one-cmds/CMakeLists.txt b/compiler/one-cmds/CMakeLists.txt new file mode 100644 index 0000000..7d73d9b --- /dev/null +++ b/compiler/one-cmds/CMakeLists.txt @@ -0,0 +1,44 @@ +set(ONE_COMMAND_FILES + one-import + one-import-tf + one-import-tflite + one-optimize + one-quantize + one-pack + one-codegen + one-prepare-venv +) + +foreach(ONE_COMMAND IN ITEMS ${ONE_COMMAND_FILES}) + + set(ONE_COMMAND_FILE ${ONE_COMMAND}) + set(ONE_COMMAND_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${ONE_COMMAND_FILE}") + set(ONE_COMMAND_BIN "${CMAKE_CURRENT_BINARY_DIR}/${ONE_COMMAND_FILE}") + set(ONE_COMMAND_TARGET "${ONE_COMMAND}_target") + + add_custom_command(OUTPUT ${ONE_COMMAND_BIN} + COMMAND ${CMAKE_COMMAND} -E copy "${ONE_COMMAND_SRC}" "${ONE_COMMAND_BIN}" + DEPENDS ${ONE_COMMAND_SRC} + COMMENT "Generate ${ONE_COMMAND_BIN}" + ) + + add_custom_target(${ONE_COMMAND_TARGET} ALL DEPENDS ${ONE_COMMAND_BIN}) + + install(FILES ${ONE_COMMAND} + PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE + GROUP_READ GROUP_WRITE GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE + DESTINATION bin) + +endforeach(ONE_COMMAND) + +set(ONE_DOCUMENT_FILES + how-to-use-one-commands.txt + how-to-prepare-virtualenv.txt +) + +foreach(ONE_DOCUMENT IN ITEMS ${ONE_DOCUMENT_FILES}) + + install(FILES ${ONE_DOCUMENT} DESTINATION doc) + +endforeach(ONE_DOCUMENT) diff --git a/compiler/one-cmds/README.md b/compiler/one-cmds/README.md new file mode 100644 index 0000000..2ce6eb4 --- /dev/null +++ b/compiler/one-cmds/README.md @@ -0,0 +1,3 @@ +# one-cmds + +_one-cmds_ provides user commands driver diff --git a/compiler/one-cmds/how-to-prepare-virtualenv.txt b/compiler/one-cmds/how-to-prepare-virtualenv.txt new file mode 100644 index 0000000..41fff3a --- /dev/null +++ b/compiler/one-cmds/how-to-prepare-virtualenv.txt @@ -0,0 +1,37 @@ +About +----- + +Last update: 2020-07-14 + +This document explains about 'one-prepare-venv' command. + +'one-prepare-venv' will prepare python3 virtual environment with tensorflow-cpu +version 2.3.0rc0, recommanded 2.x version as of now, so that 'one-import-tf' +command can execute properly. + + +Prerequisite +------------ + +Please install these required packages before venv preparation. + +$ sudo apt-get update +$ sudo apt-get upgrade +$ sudo apt-get install python3-pip python3-venv + + +How to run +---------- + +Just run 'one-prepare-venv' command + +$ one-prepare-venv + +There will be venv folder as of result. + + +Trouble shooting +---------------- + +If you have any problems, please click 'New issue' at +https://github.com/Samsung/ONE/issues page. diff --git a/compiler/one-cmds/how-to-use-one-commands.txt b/compiler/one-cmds/how-to-use-one-commands.txt new file mode 100644 index 0000000..6c2176a --- /dev/null +++ b/compiler/one-cmds/how-to-use-one-commands.txt @@ -0,0 +1,114 @@ +About +----- + +Last update: 2020-07-14 + +This document briefly explains how to use one-* commands. +Detailed options are not explained here. Run the command to see options. + +Compilation flow for running with onert; +1) one-import will import model files generated from famous frameworks +2) one-optimize will optimize models. This step is optional. +3) one-quantize will quantize models. This step is also optional. +4) one-pack will pack to nnpkg so that we can run the model with our onert + runtime + +Compilation flow for NPU +1) one-import will import model files generated from famous frameworks +2) one-optimize will optimize models. This step is optional. +3) one-quantize will quantize models. Depending on the NPUs. +4) one-codegen will compile to binary codes. + + +one-import +----------- + +one-import will invokes one-import-* commands. + +Syntax: one-import [framework] [options] + +Currently supported frameworks are 'tf', 'tflite' for TensorFlow and TensorFlow +lite. + + +one-import-tf +------------- + +This will convert TensorFlow model (.pb) file to our circle model. You can also +directly call this command. one-import-tf invokes tf2tfliteV2.py script that +will internally use TensorFlow lite converter and then invoke tflite2circle +converter to convert tflite model to circle model. + +As tf2tfliteV2.py runs TensorFlow lite converter, you need to have TensorFlow +installed in your system. We recommand to use 2.3.0rc0 for now. + +We provide python virtual environment and one-import-tf will enter and leave +this environment so that you don't need to explictly 'activate' virtual +environment. + + +one-import-tflite +----------------- + +You can use one-import-tflite to convert TensorFlow lite model (.tflite) file to +our circle model. Internally this will invoke tflite2circle. + + +one-optimize +------------ + +one-optimize provides network or operator transformation shown below. + +Current transformation options are +- fuse_bcq: This enables Binary-Coded-bases Quantized DNNs + - read https://arxiv.org/abs/2005.09904 for detailed information +- fuse_instnorm: This will convert instance normalization related operators to + one InstanceNormalization operator that our onert provides for faster + execution. +- resolve_customop_add: This will convert Custom(Add) to normal Add operator +- resolve_customop_batchmatmul: This will convert Custom(BatchMatMul) to + normal BatchMatMul operator +- resolve_customop_matmul: This will convert Custom(MatMul) to normal MatMul + operator + + +one-quantize +------------ + +one-quantize will quantize float32 model to uint8 so that the model can benefit +for speed that our onert runtime and NPU provides. For convolution type +operators we currently support layer-wise quantization. Later we will support +int16 and channel-wise quantization. + +Internally this calls circle-quantizer and record-minmax tools. + + +one-pack +-------- + +one-pack will generate a package from circle model to nnpackage for our onert +runtime. + +Output is a folder with the model(s) and meta information. + +ex) if you have a model named '20200719.circle' and want to pack to 'testnnpack' + +$ one-pack -i 20200709.circle -o testnnpack + +$ tree testnnpack +testnnpack +└── 20200709 + ├── 20200709.circle + └── metadata + └── MANIFEST + + +one-codegen +----------- + +one-codegen, like one-import will invoke backend code generation commands. +As of now, our ONE repo does not provide any code generation commands yet. + +Syntax: one-codegen [target-backend] [options] + +This will invoke [target-backend]-compile command if available. diff --git a/compiler/one-cmds/one-codegen b/compiler/one-cmds/one-codegen new file mode 100644 index 0000000..2c80664 --- /dev/null +++ b/compiler/one-cmds/one-codegen @@ -0,0 +1,55 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +function Usage() +{ + echo "Usage: $0 [BACKEND] ..." + echo "Available BACKEND drivers:" + backend_exist=0 + for file in `find $DRIVER_PATH -name *-compile -type f`; + do + backend_driver=$(basename $file) + sub_length=8 + driver_length=$(expr ${#backend_driver} - ${sub_length}) + backend=${backend_driver:0:${driver_length}} # 8 is length of "-compile" + echo " $backend" + backend_exist=1 + done + if [ $backend_exist == 0 ]; then + echo " (There is no available backend drivers)" + fi +} + +# Get command from command-line +BACKEND=$1; shift +BACKEND_DRIVER="$BACKEND-compile" + +if [[ -z "${BACKEND_DRIVER}" ]]; then + Usage + exit 255 +fi + +BACKEND_DRIVER_CMD="${DRIVER_PATH}/${BACKEND_DRIVER}" + +if [[ ! -f "${BACKEND_DRIVER_CMD}" ]]; then + echo "ERROR: '${BACKEND_DRIVER}' is not supported" + Usage + exit 255 +fi + +"${BACKEND_DRIVER_CMD}" "$@" diff --git a/compiler/one-cmds/one-import b/compiler/one-cmds/one-import new file mode 100644 index 0000000..dbf4af5 --- /dev/null +++ b/compiler/one-cmds/one-import @@ -0,0 +1,53 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +function Usage() +{ + echo "Usage: $0 [FRAMEWORK] ..." + echo "Available FRAMEWORK drivers:" + framework_exist=0 + for file in "$DRIVER_PATH"/one-import-*; + do + framework_driver=$(basename $file) + framework=${framework_driver:11} # 11 is length of "one-import-" + echo " $framework" + framework_exist=1 + done + if [ $framework_exist == 0 ]; then + echo " (There is no available import drivers)" + fi +} + +# Get command from command-line +FRAMEWORK=$1; shift +FRAMEWORK_DRIVER="one-import-$FRAMEWORK" + +if [[ -z "${FRAMEWORK_DRIVER}" ]]; then + Usage + exit 255 +fi + +FRAMEWORK_DRIVER_CMD="${DRIVER_PATH}/${FRAMEWORK_DRIVER}" + +if [[ ! -f "${FRAMEWORK_DRIVER_CMD}" ]]; then + echo "ERROR: '${FRAMEWORK_DRIVER}' is not supported" + Usage + exit 255 +fi + +"${FRAMEWORK_DRIVER_CMD}" "$@" diff --git a/compiler/one-cmds/one-import-tf b/compiler/one-cmds/one-import-tf new file mode 100644 index 0000000..c048a4e --- /dev/null +++ b/compiler/one-cmds/one-import-tf @@ -0,0 +1,114 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() +{ + echo "Convert TensorFlow model to circle." + echo "Usage: one-import-tf" + echo " --input_path " + echo " --output_path " + echo " --input_arrays " + echo " --input_shapes " + echo " --output_arrays " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--input_path') + export INPUT_PATH="$2" + shift 2 + ;; + '--output_path') + export OUTPUT_PATH="$2" + shift 2 + ;; + '--input_arrays') + export INPUT_ARRAYS="$2" + shift 2 + ;; + '--input_shapes') + export INPUT_SHAPES="$2" + shift 2 + ;; + '--output_arrays') + export OUTPUT_ARRAYS="$2" + shift 2 + ;; + *) + echo "Unknown parameter: ${CUR}" + shift + ;; + esac +done + +if [ -z ${INPUT_PATH} ] || [ ! -e ${INPUT_PATH} ]; then + echo "Error: input model not found" + echo "" + usage + exit 2 +fi + +FILE_BASE=$(basename ${OUTPUT_PATH}) +MODEL_NAME="${FILE_BASE%.*}" + +TMPDIR=$(mktemp -d) +trap "{ rm -rf $TMPDIR; }" EXIT + +# activate python virtual environment +VIRTUALENV_LINUX="${DRIVER_PATH}/venv/bin/activate" +VIRTUALENV_WINDOWS="${DRIVER_PATH}/venv/Scripts/activate" + +if [ -e ${VIRTUALENV_LINUX} ]; then + source ${VIRTUALENV_LINUX} +elif [ -e ${VIRTUALENV_WINDOWS} ]; then + source ${VIRTUALENV_WINDOWS} +fi + +# remove previous log +rm -rf "${OUTPUT_PATH}.log" + +# generate temporary tflite file +echo "python" "${DRIVER_PATH}/tf2tfliteV2.py" --v2 --input_path ${INPUT_PATH} \ +--input_arrays ${INPUT_ARRAYS} --input_shapes ${INPUT_SHAPES} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--output_arrays ${OUTPUT_ARRAYS} > "${OUTPUT_PATH}.log" +echo " " >> "${OUTPUT_PATH}.log" + +python "${DRIVER_PATH}/tf2tfliteV2.py" --v2 --input_path ${INPUT_PATH} \ +--input_arrays ${INPUT_ARRAYS} --input_shapes ${INPUT_SHAPES} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--output_arrays ${OUTPUT_ARRAYS} >> "${OUTPUT_PATH}.log" 2>&1 + +# convert .tflite to .circle +echo " " >> "${OUTPUT_PATH}.log" +echo "${DRIVER_PATH}/tflite2circle" "${TMPDIR}/${MODEL_NAME}.tflite" \ +"${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" +echo " " >> "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/tflite2circle" "${TMPDIR}/${MODEL_NAME}.tflite" \ +"${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 diff --git a/compiler/one-cmds/one-import-tflite b/compiler/one-cmds/one-import-tflite new file mode 100644 index 0000000..31ed5af --- /dev/null +++ b/compiler/one-cmds/one-import-tflite @@ -0,0 +1,67 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() +{ + echo "Convert TensorFlow lite model to circle." + echo "Usage: one-import-tflite" + echo " --input_path " + echo " --output_path " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--input_path') + export INPUT_PATH="$2" + shift 2 + ;; + '--output_path') + export OUTPUT_PATH="$2" + shift 2 + ;; + *) + echo "Unknown parameter: ${CUR}" + shift + ;; + esac +done + +if [ -z ${INPUT_PATH} ] || [ ! -e ${INPUT_PATH} ]; then + echo "Error: input model not found" + echo "" + usage + exit 2 +fi + +# remove previous log +rm -rf "${OUTPUT_PATH}.log" + +# convert .tflite to .circle +echo "${DRIVER_PATH}/tflite2circle" "${INPUT_PATH}" "${OUTPUT_PATH}" > "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/tflite2circle" "${INPUT_PATH}" "${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 diff --git a/compiler/one-cmds/one-optimize b/compiler/one-cmds/one-optimize new file mode 100644 index 0000000..95384c1 --- /dev/null +++ b/compiler/one-cmds/one-optimize @@ -0,0 +1,132 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() +{ + echo "Optimize circle model." + echo "Usage: one-optimize" + echo " --all Enable all optimization algorithms" + echo " --fuse_bcq Enable FuseBCQ Pass" + echo " --fuse_instnorm Enable FuseInstanceNormalization Pass" + echo " --resolve_customop_add" + echo " Enable ResolveCustomOpAddPass Pass" + echo " --resolve_customop_batchmatmul" + echo " Enable ResolveCustomOpBatchMatMulPass Pass" + echo " --resolve_customop_matmul" + echo " Enable ResolveCustomOpMatMulPass Pass" + echo " --input_path " + echo " --output_path " + exit 0 +} + +OPTIMIZE_all=0 +OPTIMIZE_fuse_bcq=0 +OPTIMIZE_fuse_instnorm=0 +OPTIMIZE_resolve_customop_add=0 +OPTIMIZE_resolve_customop_batchmatmul=0 +OPTIMIZE_resolve_customop_matmul=0 + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--all') + OPTIMIZE_all=1 + shift + ;; + '--fuse_bcq') + OPTIMIZE_fuse_bcq=1 + shift + ;; + '--fuse_instnorm') + OPTIMIZE_fuse_instnorm=1 + shift + ;; + '--resolve_customop_add') + OPTIMIZE_resolve_customop_add=1 + shift + ;; + '--resolve_customop_batchmatmul') + OPTIMIZE_resolve_customop_batchmatmul=1 + shift + ;; + '--resolve_customop_matmul') + OPTIMIZE_resolve_customop_matmul=1 + shift + ;; + + '--input_path') + export INPUT_PATH="$2" + shift 2 + ;; + '--output_path') + export OUTPUT_PATH="$2" + shift 2 + ;; + *) + echo "Unknown parameter: ${CUR}" + shift + ;; + esac +done + +if [ -z ${INPUT_PATH} ] || [ ! -e ${INPUT_PATH} ]; then + echo "Error: input model not found" + echo "" + usage + exit 2 +fi + +OPTIMIZE_OPTIONS="" + +if [ $OPTIMIZE_all == 1 ]; then + OPTIMIZE_OPTIONS+="--all " +fi +if [ $OPTIMIZE_fuse_bcq == 1 ]; then + OPTIMIZE_OPTIONS+="--fuse_bcq " +fi +if [ $OPTIMIZE_fuse_instnorm == 1 ]; then + OPTIMIZE_OPTIONS+="--fuse_instnorm " +fi +if [ $OPTIMIZE_resolve_customop_add == 1 ]; then + OPTIMIZE_OPTIONS+="--resolve_customop_add " +fi +if [ $OPTIMIZE_resolve_customop_batchmatmul == 1 ]; then + OPTIMIZE_OPTIONS+="--resolve_customop_batchmatmul " +fi +if [ $OPTIMIZE_resolve_customop_matmul == 1 ]; then + OPTIMIZE_OPTIONS+="--resolve_customop_matmul " +fi + +# remove previous log +rm -rf "${OUTPUT_PATH}.log" + +# NOTE do not wrap ${OPTIMIZE_OPTIONS} with "" +# optimize circle +echo "${DRIVER_PATH}/circle2circle" ${OPTIMIZE_OPTIONS} \ +"${INPUT_PATH}" "${OUTPUT_PATH}" > "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/circle2circle" ${OPTIMIZE_OPTIONS} \ +"${INPUT_PATH}" "${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 diff --git a/compiler/one-cmds/one-pack b/compiler/one-cmds/one-pack new file mode 100644 index 0000000..2bc4c60 --- /dev/null +++ b/compiler/one-cmds/one-pack @@ -0,0 +1,67 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() +{ + echo "Package circle to nnpkg" + echo "Usage: one-pack" + echo " -i " + echo " -o " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '-i') + export INPUT_PATH="$2" + shift 2 + ;; + '-o') + export OUTPUT_PATH="$2" + shift 2 + ;; + *) + echo "Unknown parameter: ${CUR}" + shift + ;; + esac +done + +if [ -z ${INPUT_PATH} ] || [ ! -e ${INPUT_PATH} ]; then + echo "Error: input model not found" + echo "" + usage + exit 2 +fi + +# remove previous log +rm -rf "${OUTPUT_PATH}.log" + +# Package circle model file to nnpkg +echo "${DRIVER_PATH}/model2nnpkg.sh" -o "${OUTPUT_PATH}" "${INPUT_PATH}" > "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/model2nnpkg.sh" -o "${OUTPUT_PATH}" "${INPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 diff --git a/compiler/one-cmds/one-prepare-venv b/compiler/one-cmds/one-prepare-venv new file mode 100644 index 0000000..fce838d --- /dev/null +++ b/compiler/one-cmds/one-prepare-venv @@ -0,0 +1,40 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +VENV_ACTIVATE=${DRIVER_PATH}/venv/bin/activate + +if [ -f ${VENV_ACTIVATE} ]; then + echo "Virtual environment is already prepared." + exit 0 +fi + +# Install prerequisites +python3 -m pip install -U virtualenv + +# Create python virtual enviornment +python3 -m venv "${DRIVER_PATH}/venv" + +# Install tensorflow +source "${VENV_ACTIVATE}" + +python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install -U pip setuptools +python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install tensorflow-cpu==2.3.0rc0 diff --git a/compiler/one-cmds/one-quantize b/compiler/one-cmds/one-quantize new file mode 100644 index 0000000..ff9e266 --- /dev/null +++ b/compiler/one-cmds/one-quantize @@ -0,0 +1,155 @@ +#!/bin/bash + +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +DRIVER_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +usage() +{ + echo "Quantize circle model." + echo "Usage: one-quantize" + echo " --input_dtype Input data type (supported: float32, default=float32)" + echo " --quantized_dtype Output quantized data type (supported: uint8, default=uint8)" + echo " --granularity Quantize granularity (supported: layer, default=layer)" + echo " --min_percentile Minimum percentile (0.0~100.0, default=1.0)" + echo " --max_percentile Maximum percentile (0.0~100.0, default=99.0)" + echo " --mode Record mode (supported: percentile/moving_average, default=percentile)" + echo " --input_path " + echo " --input_data " + echo " --output_path " + exit 0 +} + +INPUT_DTYPE=float32 +QUANTIZED_DTYPE=uint8 +GRANULARITY=layer +MIN_PERCENTILE=1 +MAX_PERCENTILE=99 +MODE=percentile + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + + '--input_dtype') + INPUT_DTYPE="$2" + shift 2 + ;; + '--quantized_dtype') + QUANTIZED_DTYPE="$2" + shift 2 + ;; + '--granularity') + GRANULARITY="$2" + shift 2 + ;; + '--min_percentile') + MIN_PERCENTILE="$2" + shift 2 + ;; + '--max_percentile') + MAX_PERCENTILE="$2" + shift 2 + ;; + '--mode') + MODE="$2" + shift 2 + ;; + + '--input_path') + INPUT_PATH="$2" + shift 2 + ;; + '--input_data') + INPUT_DATA="$2" + shift 2 + ;; + '--output_path') + OUTPUT_PATH="$2" + shift 2 + ;; + + *) + echo "Unknown parameter: ${CUR}" + shift + ;; + esac +done + +if [ -z ${INPUT_PATH} ] || [ ! -e ${INPUT_PATH} ]; then + echo "Error: input model not found" + echo "" + usage + exit 2 +fi +if [ -z ${INPUT_DATA} ] || [ ! -e ${INPUT_DATA} ]; then + echo "Error: input data not found" + echo "" + usage + exit 2 +fi + +FILE_BASE=$(basename ${OUTPUT_PATH}) +MODEL_NAME="${FILE_BASE%.*}" + +TMPDIR=$(mktemp -d) +trap "{ rm -rf $TMPDIR; }" EXIT + +# remove previous log +rm -rf "${OUTPUT_PATH}.log" + +# quantize circle +echo "${DRIVER_PATH}/circle-quantizer" \ +--quantize_dequantize_weights ${INPUT_DTYPE} ${QUANTIZED_DTYPE} ${GRANULARITY} \ +"${INPUT_PATH}" "${TMPDIR}/${MODEL_NAME}.1.circle" > "${OUTPUT_PATH}.log" +echo " " >> "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/circle-quantizer" \ +--quantize_dequantize_weights ${INPUT_DTYPE} ${QUANTIZED_DTYPE} ${GRANULARITY} \ +"${INPUT_PATH}" "${TMPDIR}/${MODEL_NAME}.1.circle" >> "${OUTPUT_PATH}.log" 2>&1 + +echo " " >> "${OUTPUT_PATH}.log" +echo "${DRIVER_PATH}/record-minmax" \ +--input_model "${TMPDIR}/${MODEL_NAME}.1.circle" \ +--input_data "${INPUT_DATA}" \ +--min_percentile ${MIN_PERCENTILE} --max_percentile ${MAX_PERCENTILE} \ +--mode "${MODE}" \ +--output_model "${TMPDIR}/${MODEL_NAME}.2.circle" >> "${OUTPUT_PATH}.log" 2>&1 +echo " " >> "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/record-minmax" \ +--input_model "${TMPDIR}/${MODEL_NAME}.1.circle" \ +--input_data "${INPUT_DATA}" \ +--min_percentile ${MIN_PERCENTILE} --max_percentile ${MAX_PERCENTILE} \ +--mode "${MODE}" \ +--output_model "${TMPDIR}/${MODEL_NAME}.2.circle" >> "${OUTPUT_PATH}.log" 2>&1 + +echo " " >> "${OUTPUT_PATH}.log" +echo "${DRIVER_PATH}/circle-quantizer" \ +--quantize_with_minmax ${INPUT_DTYPE} ${QUANTIZED_DTYPE} ${GRANULARITY} \ +"${TMPDIR}/${MODEL_NAME}.2.circle" "${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 +echo " " >> "${OUTPUT_PATH}.log" + +"${DRIVER_PATH}/circle-quantizer" \ +--quantize_with_minmax ${INPUT_DTYPE} ${QUANTIZED_DTYPE} ${GRANULARITY} \ +"${TMPDIR}/${MODEL_NAME}.2.circle" "${OUTPUT_PATH}" >> "${OUTPUT_PATH}.log" 2>&1 diff --git a/compiler/one-cmds/requires.cmake b/compiler/one-cmds/requires.cmake new file mode 100644 index 0000000..9b858ad --- /dev/null +++ b/compiler/one-cmds/requires.cmake @@ -0,0 +1,5 @@ +require("tf2tfliteV2") +require("tflite2circle") +require("circle2circle") +require("circle-quantizer") +require("record-minmax") diff --git a/compiler/oneco-value-pbtxt-test/README.md b/compiler/oneco-value-pbtxt-test/README.md new file mode 100644 index 0000000..6ae4519 --- /dev/null +++ b/compiler/oneco-value-pbtxt-test/README.md @@ -0,0 +1 @@ +# oneco-value-pbtxt-test diff --git a/compiler/oneco/README.md b/compiler/oneco/README.md new file mode 100644 index 0000000..9687faf --- /dev/null +++ b/compiler/oneco/README.md @@ -0,0 +1 @@ +# oneco diff --git a/compiler/onnx2circle/requires.cmake b/compiler/onnx2circle/requires.cmake index 418148e..f52e404 100644 --- a/compiler/onnx2circle/requires.cmake +++ b/compiler/onnx2circle/requires.cmake @@ -1,7 +1,7 @@ require("stdex") require("hermes-std") require("mir2loco") -require("mir-onnx-importer") +require("mir") require("exo") require("locop") require("loco") diff --git a/compiler/onnx2tflite-integration-test/README.md b/compiler/onnx2tflite-integration-test/README.md new file mode 100644 index 0000000..cf160fe --- /dev/null +++ b/compiler/onnx2tflite-integration-test/README.md @@ -0,0 +1 @@ +# onnx2tflite-integration-test diff --git a/compiler/onnx2tflite/requires.cmake b/compiler/onnx2tflite/requires.cmake index cc05edd..b16a511 100644 --- a/compiler/onnx2tflite/requires.cmake +++ b/compiler/onnx2tflite/requires.cmake @@ -1,3 +1,3 @@ -require("mir-onnx-importer") +require("mir") require("mir2loco") require("exo") diff --git a/compiler/oops/README.md b/compiler/oops/README.md new file mode 100644 index 0000000..9794cf8 --- /dev/null +++ b/compiler/oops/README.md @@ -0,0 +1 @@ +# oops diff --git a/compiler/pepper-assert/README.md b/compiler/pepper-assert/README.md new file mode 100644 index 0000000..df41371 --- /dev/null +++ b/compiler/pepper-assert/README.md @@ -0,0 +1 @@ +# pepper-assert diff --git a/compiler/pota-quantization-value-test/CMakeLists.txt b/compiler/pota-quantization-value-test/CMakeLists.txt new file mode 100644 index 0000000..d97ffc1 --- /dev/null +++ b/compiler/pota-quantization-value-test/CMakeLists.txt @@ -0,0 +1,69 @@ +unset(QUANTIZATION_VALUE_TEST) +unset(QUANTIZATION_VALUE_TEST_WITH_PARAM) + +macro(addTest NAME GRANULARITY DTYPE) + list(APPEND QUANTIZATION_VALUE_TEST ${NAME}) + list(APPEND QUANTIZATION_VALUE_TEST_WITH_PARAM ${NAME} ${GRANULARITY} ${DTYPE}) +endmacro(addTest) + +# Read "test.lst" +include("test.lst") +# Read "test.local.lst" if exists +include("test.local.lst" OPTIONAL) + +unset(TEST_DEPS) + +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + +set(VIRTUALENV "${NNCC_OVERLAY_DIR}/venv_1_13_2") + +### +### Generate test.config +### +set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") + +add_custom_command( + OUTPUT ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'RECORD_MINMAX_PATH=\"$\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_QUANTIZER_PATH=\"$\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'CIRCLE_TENSORDUMP_PATH=\"$\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'VIRTUALENV=\"${VIRTUALENV}\"' >> ${TEST_CONFIG} + DEPENDS record-minmax + DEPENDS circle-quantizer + DEPENDS circle-tensordump + COMMENT "Generate test configuration" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}") + +# This enforces CMake to generate all the dependencies during "build" phase +add_custom_target(pota_quantization_value_test_deps ALL DEPENDS ${TEST_DEPS}) + +# Run tests +add_test( + NAME pota_fake_wquant_test + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/test_fake_wquant.sh" + "${TEST_CONFIG}" + "${ARTIFACTS_BIN_PATH}" + ${QUANTIZATION_VALUE_TEST_WITH_PARAM} +) + +#add_test( +# NAME pota_record_minmax_test +# COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/test_record_minmax.sh" +# "${TEST_CONFIG}" +# "${ARTIFACTS_BIN_PATH}" +# ${QUANTIZATION_VALUE_TEST_WITH_PARAM} +#) + +#add_test( +# NAME pota_quantization_test +# COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/test_quantization.sh" +# "${TEST_CONFIG}" +# "${ARTIFACTS_BIN_PATH}" +# ${QUANTIZATION_VALUE_TEST_WITH_PARAM} +#) + +#set_tests_properties(pota_record_minmax_test PROPERTIES DEPENDS pota_fake_wquant_test) +#set_tests_properties(pota_quantization_test PROPERTIES DEPENDS pota_record_minmax_test) diff --git a/compiler/pota-quantization-value-test/README.md b/compiler/pota-quantization-value-test/README.md new file mode 100644 index 0000000..e3359ae --- /dev/null +++ b/compiler/pota-quantization-value-test/README.md @@ -0,0 +1,41 @@ +# pota-quantization-value-test + +`pota-quantization-value-test` checks whether a Circle model listed in `test.lst` is correctly quantized (`pota` denotes post-training affine). The circle models are generated from the recipes saved in `res/TensorFlowLiteRecipes`. + +Write `test.local.lst` for local test. + +### Test process + +#### Step 1. Fake quantization + +Run `circle-quantizer` with `--quantize_dequantize_weights` option. + +Dump the fake-quantized model with `circle-tensordump`. + +Compare the dumped model with the expected output in "expected_outputs//\//fake_quantization/.json" + +The expected output should include + (1) values of weights (only for conv, transposed_conv, depthwise_conv, and fc layers) + +#### Step 2. Record moving avg of min and moving avg of max for activations + +Run `record-minmax` with the fake-quantized model (input data is saved in "test_inputs//\//.txt") + +Dump the minmax-recorded model with `circle-tensordump`. +Compare the dumped model with the expected output in "expected_outputs//\//record_minmax/.json" + +The expected output should include + (1) min/max of activations + +#### Step 3. Quantization + +Run `circle-quantizer` with `--quantize_with_minmax` option. + +Dump the quantized model with `circle-tensordump`. + +Compare the dumped model with the expected output in "expected_outputs//\//quantization/.json" + +The expected output should include + (1) scale, zero point of activations + (2) scale, zero point, values of weights + (3) scale, values (weights) of bias diff --git a/compiler/pota-quantization-value-test/compare_tensors.py b/compiler/pota-quantization-value-test/compare_tensors.py new file mode 100755 index 0000000..258d46d --- /dev/null +++ b/compiler/pota-quantization-value-test/compare_tensors.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +import h5py as h5 +import numpy as np +import argparse +import os.path +import json +import sys + +# +# This script checks if the min/max values recorded in the circle model are the same with the expected values +# +# Basic usage: +# compare_tensors.py --input_h5 --expect_dir --mode +# ex: compare_minmax.py --input_h5 Add_000.h5 --expect_dir expected_outputs/Add_000 --mode fake_quantization + +parser = argparse.ArgumentParser() +parser.add_argument('--input_h5', type=str, required=True) +parser.add_argument('--expect_dir', type=str, required=True) +parser.add_argument('--mode', type=str, required=True) +args = parser.parse_args() + +supported_modes = ["fake_quantization", "record_minmax", "quantization"] + +model = args.input_h5 +expect_dir = args.expect_dir +mode = args.mode + +failed_cases = 0 + +if mode not in supported_modes: + raise SystemExit("Unsupported mode. --mode should be one of " + str(supported_modes)) + + +def compare_fake_quantization(tensor, tensor_name, expect_dir): + global failed_cases + with open(expect_dir + "/" + tensor_name + ".json", "r") as expect_file: + json_load = json.load(expect_file) + expected_weights = np.array(json_load["weights"]) + input_weights = tensor["weights"][:] + if np.allclose(input_weights, expected_weights, rtol=1.e-5, atol=1.e-5) == False: + print("Fake-quantized weights of " + tensor_name + " (" + str(input_weights) + + ") do not match with expected value (" + str(expected_weights) + ").") + failed_cases += 1 + + +def compare_record_minmax(tensor, tensor_name, expect_dir): + global failed_cases + with open(expect_dir + "/" + tensor_name + ".json", "r") as expect_file: + json_load = json.load(expect_file) + expected_min = np.array(json_load["min"]) + expected_max = np.array(json_load["max"]) + input_min = tensor["min"][:] + input_max = tensor["max"][:] + if np.allclose(input_min, expected_min, rtol=1.e-5, atol=1.e-5) == False: + print("Recorded min of " + tensor_name + " (" + str(input_min) + + ") does not match with expected value (" + str(expected_min) + ").") + failed_cases += 1 + if np.allclose(input_max, expected_max, rtol=1.e-5, atol=1.e-5) == False: + print("Recorded max of " + tensor_name + " (" + str(input_max) + + ") does not match with expected value (" + str(expected_max) + ").") + failed_cases += 1 + + +def compare_quantization(tensor, tensor_name, expect_dir): + global failed_cases + with open(expect_dir + "/" + tensor_name + ".json", "r") as expect_file: + json_load = json.load(expect_file) + for key in json_load: + if key == "weights": + expected_weights = np.array(json_load["weights"]) + input_weights = tensor["weights"][:] + if np.allclose(input_weights, expected_weights, rtol=0, atol=0) == False: + print("Quantized weights of " + tensor_name + " (" + str(input_weights) + + ") do not match with expected value (" + str(expected_weights) + + ").") + failed_cases += 1 + + if key == "scale": + expected_scale = np.array(json_load["scale"]) + input_scale = tensor["scale"][:] + if np.allclose(input_scale, expected_scale, rtol=1.e-5, atol=1.e-5) == False: + print("Quantized scale of " + tensor_name + " (" + str(input_scale) + + ") do not match with expected value (" + str(expected_scale) + ").") + failed_cases += 1 + + if key == "zero_point": + expected_zero_point = np.array(json_load["zero_point"]) + input_zero_point = tensor["zero_point"][:] + if np.allclose( + input_zero_point, expected_zero_point, rtol=0, atol=0) == False: + print("Quantized zero_point of " + tensor_name + " (" + + str(input_zero_point) + ") do not match with expected value (" + + str(expected_zero_point) + ").") + failed_cases += 1 + + +with h5.File(model, "r") as input: + for tensor_name in input.keys(): + # We only check the given golden data + if os.path.isfile(expect_dir + "/" + tensor_name + ".json"): + print("Compare " + tensor_name) + if mode == "fake_quantization": + compare_fake_quantization(input[tensor_name], tensor_name, expect_dir) + elif mode == "record_minmax": + compare_record_minmax(input[tensor_name], tensor_name, expect_dir) + elif mode == "quantization": + compare_quantization(input[tensor_name], tensor_name, expect_dir) + else: + raise SystemExit("Unsupproted mode.") + +sys.exit(failed_cases) diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/fake_quantization/ker.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/fake_quantization/ker.json new file mode 100644 index 0000000..21b8eca --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/fake_quantization/ker.json @@ -0,0 +1,48 @@ +{ + "weights": [ + [ + [ + [ + 1.003921627998352, + 2.007843255996704 + ], + [ + -3.0117647647857666, + -4.015686511993408 + ] + ], + [ + [ + -5.019608020782471, + 6.023529529571533 + ], + [ + -7.027451038360596, + 7.968627452850342 + ] + ] + ], + [ + [ + [ + 4.015686511993408, + -2.007843255996704 + ], + [ + 3.0117647647857666, + -1.003921627998352 + ] + ], + [ + [ + -7.968627452850342, + -6.023529529571533 + ], + [ + 7.027451038360596, + 5.019608020782471 + ] + ] + ] + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/bias.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/bias.json new file mode 100644 index 0000000..462d0d3 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/bias.json @@ -0,0 +1,7 @@ + { + "scale": 0.0059054209919261825, + "weights": [ + 169.0, + 339.0 + ] + } diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ifm.json new file mode 100644 index 0000000..107117b --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ifm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.09411764705882353, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ker.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ker.json new file mode 100644 index 0000000..3a6e171 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ker.json @@ -0,0 +1,52 @@ +{ + "max": 7.968627450980392, + "scale": 0.06274509803921569, + "weights": [ + [ + [ + [ + 144, + 160 + ], + [ + 80, + 64 + ] + ], + [ + [ + 48, + 224 + ], + [ + 16, + 255 + ] + ] + ], + [ + [ + [ + 192, + 96 + ], + [ + 176, + 112 + ] + ], + [ + [ + 1, + 32 + ], + [ + 240, + 208 + ] + ] + ] + ], + "min": -8.031372549019608, + "zero_point": 128.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ofm.json new file mode 100644 index 0000000..2374639 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/quantization/ofm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.17836222929113052, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ifm.json new file mode 100644 index 0000000..563c042 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ifm.json @@ -0,0 +1,4 @@ +{ + "max": 24.0, + "min": 1.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ofm.json new file mode 100644 index 0000000..fd0c6dc --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/Conv2D_004/layer/uint8/record_minmax/ofm.json @@ -0,0 +1,4 @@ +{ + "max": 45.48236846923828, + "min": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/fake_quantization/ker.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/fake_quantization/ker.json new file mode 100644 index 0000000..11e91ca --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/fake_quantization/ker.json @@ -0,0 +1,34 @@ +{ + "weights": [ + [ + [ + [ + 0.9725490212440491, + 1.9450980424880981, + 3.0392158031463623, + 4.0117645263671875 + ], + [ + -8.996078491210938, + 9.968626976013184, + -10.941176414489746, + 12.035294532775879 + ] + ], + [ + [ + 4.984313488006592, + 5.956862926483154, + 7.050980567932129, + 8.023529052734375 + ], + [ + 13.007843017578125, + -13.980392456054688, + 14.952940940856934, + -16.04705810546875 + ] + ] + ] + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/bias.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/bias.json new file mode 100644 index 0000000..df7cb14 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/bias.json @@ -0,0 +1,9 @@ +{ + "scale": 0.007627835447904652, + "weights": [ + 131.0, + 262.0, + 393.0, + 524.0 + ] +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ifm.json new file mode 100644 index 0000000..254ce89 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ifm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.06274509803921569, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ker.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ker.json new file mode 100644 index 0000000..3d14da1 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ker.json @@ -0,0 +1,38 @@ +{ + "max": 14.952941176470588, + "scale": 0.12156862745098039, + "weights": [ + [ + [ + [ + 140, + 148, + 157, + 165 + ], + [ + 58, + 214, + 42, + 231 + ] + ], + [ + [ + 173, + 181, + 190, + 198 + ], + [ + 239, + 17, + 255, + 0 + ] + ] + ] + ], + "min": -16.04705882352941, + "zero_point": 132.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ofm.json new file mode 100644 index 0000000..85dd4d9 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/quantization/ofm.json @@ -0,0 +1,4 @@ +{ + "scale": 0.893733185412837, + "zero_point": 0.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ifm.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ifm.json new file mode 100644 index 0000000..9aee7bc --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ifm.json @@ -0,0 +1,4 @@ +{ + "max": 16.0, + "min": 1.0 +} diff --git a/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ofm.json b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ofm.json new file mode 100644 index 0000000..aa42a66 --- /dev/null +++ b/compiler/pota-quantization-value-test/expected_outputs/DepthwiseConv2D_002/layer/uint8/record_minmax/ofm.json @@ -0,0 +1,4 @@ +{ + "max": 227.90196228027344, + "min": 0.0 +} diff --git a/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py b/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py new file mode 100755 index 0000000..9863c80 --- /dev/null +++ b/compiler/pota-quantization-value-test/gen_h5_explicit_inputs.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import h5py as h5 +import numpy as np +import tensorflow as tf +import argparse +import glob + +# +# This script generates a pack of random input data (.h5) expected by the input tflite model +# +# Basic usage: +# gen_h5_explicit_inputs.py --model --input --output +# ex: gen_h5_explicit_inputs.py --model Add_000.tflite --input Add_000 --output Add_000.input.h5 +# (This will create Add_000.input.h5) +# +# The input directory should be organized as follows +# / +# -> .txt +# ... +# Each txt file has the explicit values of inputs +# Example. if the model has two inputs whose shapes are both (1, 3), +# the first record file name is 0.txt, and its contents is something like below +# 1, 2, 3 +# 4, 5, 6 +# +parser = argparse.ArgumentParser() +parser.add_argument('--model', type=str, required=True) +parser.add_argument('--input', type=str, required=True) +parser.add_argument('--output', type=str, required=True) +args = parser.parse_args() + +model = args.model +input = args.input +output = args.output + +# Build TFLite interpreter. (to get the information of model input) +interpreter = tf.lite.Interpreter(model) +input_details = interpreter.get_input_details() + +# Create h5 file +h5_file = h5.File(output, 'w') +group = h5_file.create_group("value") +group.attrs['desc'] = "Input data for " + model + +# Input files +records = sorted(glob.glob(input + "/*.txt")) +for i, record in enumerate(records): + sample = group.create_group(str(i)) + sample.attrs['desc'] = "Input data " + str(i) + with open(record, 'r') as f: + lines = f.readlines() + for j, line in enumerate(lines): + data = np.array(line.split(',')) + input_detail = input_details[j] + input_data = np.array( + data.reshape(input_detail["shape"]), input_detail["dtype"]) + sample.create_dataset(str(j), data=input_data) + +h5_file.close() diff --git a/compiler/pota-quantization-value-test/requires.cmake b/compiler/pota-quantization-value-test/requires.cmake new file mode 100644 index 0000000..883a925 --- /dev/null +++ b/compiler/pota-quantization-value-test/requires.cmake @@ -0,0 +1,4 @@ +require("record-minmax") +require("circle-quantizer") +require("circle-tensordump") +require("common-artifacts") diff --git a/compiler/pota-quantization-value-test/test.lst b/compiler/pota-quantization-value-test/test.lst new file mode 100644 index 0000000..65613ff --- /dev/null +++ b/compiler/pota-quantization-value-test/test.lst @@ -0,0 +1,2 @@ +addTest(Conv2D_004 layer uint8) +addTest(DepthwiseConv2D_002 layer uint8) diff --git a/compiler/pota-quantization-value-test/test_fake_wquant.sh b/compiler/pota-quantization-value-test/test_fake_wquant.sh new file mode 100755 index 0000000..1331703 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_fake_wquant.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# This script tests the basic behavior of record-minmax +# +# HOW TO USE +# +# ./test_fake_quantization.sh ... +# test.config : set ${RECORD_MINMAX_PATH} and ${CIRCLE_QUANTIZER_PATH} +# work_dir : build directory of quantization-value-test (ex: build/compiler/quantization-value-test) + +SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COMPARE_SCRIPT_PATH="${SOURCE_PATH}/compare_tensors.py" +CONFIG_PATH="$1"; shift +BIN_PATH=$(dirname "${CONFIG_PATH}") +TEST_INPUT_PATH="${SOURCE_PATH}/test_inputs" +WORKDIR="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found CIRCLE_QUANTIZER: ${CIRCLE_QUANTIZER_PATH}" +echo "-- Found CIRCLE_TENSORDUMP: ${CIRCLE_TENSORDUMP_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [ "$1" != "" ]; do + MODELNAME=$1; shift + GRANULARITY=$1; shift + DTYPE=$1; shift + TESTCASE="${MODELNAME}.${GRANULARITY}.${DTYPE}" + + TESTED+=("${TESTCASE}") + + TESTCASE_FILE="${WORKDIR}/${TESTCASE}" + TEST_RESULT_FILE="${BIN_PATH}/${TESTCASE}" + + PASSED_TAG="${TEST_RESULT_FILE}.fake_quantized.passed" + rm -f "${PASSED_TAG}" + + cat > "${TEST_RESULT_FILE}_fake_quantization.log" <( + exec 2>&1 + set -ex + + # Run circle-quantizer with --quantize_dequantize_weights + "${CIRCLE_QUANTIZER_PATH}" \ + --quantize_dequantize_weights float32 "${DTYPE}" "${GRANULARITY}" \ + "${WORKDIR}/${MODELNAME}.circle" \ + "${TEST_RESULT_FILE}.fake_quantized.circle" + + # Dump weights values (circle-tensordump) + "${CIRCLE_TENSORDUMP_PATH}" \ + "${TEST_RESULT_FILE}.fake_quantized.circle" \ + --tensors_to_hdf5 "${TEST_RESULT_FILE}.fake_quantized.circle.h5" + + # Compare result + "${VIRTUALENV}/bin/python" "${COMPARE_SCRIPT_PATH}" \ + --input_h5 "${TEST_RESULT_FILE}.fake_quantized.circle.h5" \ + --expect_dir "${SOURCE_PATH}/expected_outputs/${MODELNAME}/${GRANULARITY}/${DTYPE}/fake_quantization" \ + --mode fake_quantization + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$TESTCASE") + else + FAILED+=("$TESTCASE") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/pota-quantization-value-test/test_inputs/Conv2D_004/layer/uint8/0.txt b/compiler/pota-quantization-value-test/test_inputs/Conv2D_004/layer/uint8/0.txt new file mode 100644 index 0000000..8803cb1 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/Conv2D_004/layer/uint8/0.txt @@ -0,0 +1 @@ +1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 diff --git a/compiler/pota-quantization-value-test/test_inputs/DepthwiseConv2D_002/layer/uint8/0.txt b/compiler/pota-quantization-value-test/test_inputs/DepthwiseConv2D_002/layer/uint8/0.txt new file mode 100644 index 0000000..c210774 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_inputs/DepthwiseConv2D_002/layer/uint8/0.txt @@ -0,0 +1 @@ +1, 2, 7, 8, 3, 4, 9, 10, 5, 6, 11, 12, 13, 14, 15, 16 diff --git a/compiler/pota-quantization-value-test/test_quantization.sh b/compiler/pota-quantization-value-test/test_quantization.sh new file mode 100755 index 0000000..5ebd726 --- /dev/null +++ b/compiler/pota-quantization-value-test/test_quantization.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# This script tests the basic behavior of record-minmax +# +# HOW TO USE +# +# ./test_quantization.sh ... +# test.config : set ${RECORD_MINMAX_PATH} and ${CIRCLE_QUANTIZER_PATH} +# work_dir : build directory of quantization-value-test (ex: build/compiler/quantization-value-test) + +SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COMPARE_SCRIPT_PATH="${SOURCE_PATH}/compare_tensors.py" +CONFIG_PATH="$1"; shift +BIN_PATH=$(dirname "${CONFIG_PATH}") +TEST_INPUT_PATH="${SOURCE_PATH}/test_inputs" +WORKDIR="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found CIRCLE_QUANTIZER: ${CIRCLE_QUANTIZER_PATH}" +echo "-- Found CIRCLE_TENSORDUMP: ${CIRCLE_TENSORDUMP_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [ "$1" != "" ]; do + MODELNAME=$1; shift + GRANULARITY=$1; shift + DTYPE=$1; shift + TESTCASE="${MODELNAME}.${GRANULARITY}.${DTYPE}" + + TESTED+=("${TESTCASE}") + + TESTCASE_FILE="${WORKDIR}/${TESTCASE}" + TEST_RESULT_FILE="${BIN_PATH}/${TESTCASE}" + + PASSED_TAG="${TEST_RESULT_FILE}.quantization.passed" + rm -f "${PASSED_TAG}" + + cat > "${TEST_RESULT_FILE}_quantization.log" <( + exec 2>&1 + set -ex + + # Run circle-quantizer with --quantize_with_minmax + "${CIRCLE_QUANTIZER_PATH}" \ + --quantize_with_minmax float32 "${DTYPE}" "${GRANULARITY}" \ + "${TEST_RESULT_FILE}.minmax_recorded.circle" \ + "${TEST_RESULT_FILE}.quantized.circle" + + # Dump scale, zp, weights values (circle-tensordump) + "${CIRCLE_TENSORDUMP_PATH}" \ + "${TEST_RESULT_FILE}.quantized.circle" \ + --tensors_to_hdf5 "${TEST_RESULT_FILE}.quantized.circle.h5" + + # Compare result + "${VIRTUALENV}/bin/python" "${COMPARE_SCRIPT_PATH}" \ + --input_h5 "${TEST_RESULT_FILE}.quantized.circle.h5" \ + --expect_dir "${SOURCE_PATH}/expected_outputs/${MODELNAME}/${GRANULARITY}/${DTYPE}/quantization" \ + --mode quantization + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$TESTCASE") + else + FAILED+=("$TESTCASE") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/pota-quantization-value-test/test_record_minmax.sh b/compiler/pota-quantization-value-test/test_record_minmax.sh new file mode 100755 index 0000000..eaa462d --- /dev/null +++ b/compiler/pota-quantization-value-test/test_record_minmax.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# This script tests the basic behavior of record-minmax +# +# HOW TO USE +# +# ./test_record_minmax.sh ... +# test.config : set ${RECORD_MINMAX_PATH} and ${CIRCLE2CIRCLE_PATH} +# work_dir : build directory of quantization-value-test (ex: build/compiler/quantization-value-test) + +SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GEN_SCRIPT_PATH="${SOURCE_PATH}/gen_h5_explicit_inputs.py" +COMPARE_SCRIPT_PATH="${SOURCE_PATH}/compare_tensors.py" +CONFIG_PATH="$1"; shift +BIN_PATH=$(dirname "${CONFIG_PATH}") +TEST_INPUT_PATH="${SOURCE_PATH}/test_inputs" +WORKDIR="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found RECORD-MINMAX: ${RECORD_MINMAX_PATH}" +echo "-- Found CIRCLE_TENSORDUMP: ${CIRCLE_TENSORDUMP_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [ "$1" != "" ]; do + MODELNAME=$1; shift + GRANULARITY=$1; shift + DTYPE=$1; shift + TESTCASE="${MODELNAME}.${GRANULARITY}.${DTYPE}" + + TESTED+=("${TESTCASE}") + + TESTCASE_FILE="${WORKDIR}/${TESTCASE}" + TEST_RESULT_FILE="${BIN_PATH}/${TESTCASE}" + + PASSED_TAG="${TEST_RESULT_FILE}.record_minmax.passed" + rm -f "${PASSED_TAG}" + + cat > "${TEST_RESULT_FILE}_record_minmax.log" <( + exec 2>&1 + set -ex + + # Generate h5 input data + source "${VIRTUALENV}/bin/activate" + "${VIRTUALENV}/bin/python" "${GEN_SCRIPT_PATH}" \ + --model "${WORKDIR}/${MODELNAME}.tflite" \ + --input "${TEST_INPUT_PATH}/${MODELNAME}/${GRANULARITY}/${DTYPE}" \ + --output "${TESTCASE_FILE}.input.h5" + + if [[ $? -ne 0 ]]; then + echo "FAILED TO GENERATE INPUT" + continue + fi + + # Run record-minmax + "${RECORD_MINMAX_PATH}" \ + "${TEST_RESULT_FILE}.fake_quantized.circle" \ + "${TEST_RESULT_FILE}.input.h5" \ + "${TEST_RESULT_FILE}.minmax_recorded.circle" + + # Dump min/max values (circle-tensordump) + "${CIRCLE_TENSORDUMP_PATH}" \ + "${TEST_RESULT_FILE}.minmax_recorded.circle" \ + --tensors_to_hdf5 "${TEST_RESULT_FILE}.minmax_recorded.circle.h5" + + # Compare result + "${VIRTUALENV}/bin/python" "${COMPARE_SCRIPT_PATH}" \ + --input_h5 "${TEST_RESULT_FILE}.minmax_recorded.circle.h5" \ + --expect_dir "${SOURCE_PATH}/expected_outputs/${MODELNAME}/${GRANULARITY}/${DTYPE}/record_minmax" \ + --mode record_minmax + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$TESTCASE") + else + FAILED+=("$TESTCASE") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/pp/src/LinearDocument.cpp b/compiler/pp/src/LinearDocument.cpp index 2bc5f26..2cd35ef 100644 --- a/compiler/pp/src/LinearDocument.cpp +++ b/compiler/pp/src/LinearDocument.cpp @@ -63,9 +63,9 @@ const std::string &LinearDocument::line(uint32_t n) const { return _lines.at(lines() - n - 1); } + default: + throw std::runtime_error{"Not supported Direction"}; } - - throw std::runtime_error{"unreachable"}; } } // namespace pp diff --git a/compiler/record-minmax-conversion-test/CMakeLists.txt b/compiler/record-minmax-conversion-test/CMakeLists.txt new file mode 100644 index 0000000..2221e17 --- /dev/null +++ b/compiler/record-minmax-conversion-test/CMakeLists.txt @@ -0,0 +1,42 @@ +unset(RECORD_MINMAX_CONVERSION_TEST) + +macro(addTest NAME) + list(APPEND RECORD_MINMAX_CONVERSION_TEST ${NAME}) +endmacro(addTest) + +# Read "test.lst" +include("test.lst") +# Read "test.local.lst" if exists +include("test.local.lst" OPTIONAL) + +unset(TEST_DEPS) + +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + +### +### Generate test.config +### +set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") + +add_custom_command( + OUTPUT ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'RECORD_MINMAX_PATH=\"$\"' >> ${TEST_CONFIG} + DEPENDS record-minmax + COMMENT "Generate test configuration" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}") + +# This enforces CMake to generate all the dependencies during "build" phase +add_custom_target(record_minmax_conversion_test_deps ALL DEPENDS ${TEST_DEPS}) + +# Run tests +add_test( + NAME record_minmax_conversion_test + COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh" + "${TEST_CONFIG}" + "${ARTIFACTS_BIN_PATH}" + "${NNCC_OVERLAY_DIR}/venv_1_13_2" + ${RECORD_MINMAX_CONVERSION_TEST} +) diff --git a/compiler/record-minmax-conversion-test/README.md b/compiler/record-minmax-conversion-test/README.md new file mode 100644 index 0000000..cc06c15 --- /dev/null +++ b/compiler/record-minmax-conversion-test/README.md @@ -0,0 +1,5 @@ +# record-minmax-conversion-test + +Run `record-minmax` with random input data and Circle models listed in `test.lst`. This test checks whether a given Circle model can be converted to a Circle model embedded with min/max values without failure. + +Write `test.local.lst` for local test. diff --git a/compiler/record-minmax-conversion-test/gen_h5_random_inputs.py b/compiler/record-minmax-conversion-test/gen_h5_random_inputs.py new file mode 100755 index 0000000..b770981 --- /dev/null +++ b/compiler/record-minmax-conversion-test/gen_h5_random_inputs.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import h5py as h5 +import numpy as np +import tensorflow as tf +import argparse + +# +# This script generates a pack of random input data (.h5) expected by the input tflite model +# +# Basic usage: +# gen_h5_inputs.py --model --num_data --output +# ex: gen_h5_inputs.py --model add.tflite --num_data 3 --output add.tflite.input.h5 +# (This will create add.tflite.input.h5 composed of three random inputs in the same directory as the model) +parser = argparse.ArgumentParser() +parser.add_argument('--model', type=str, required=True) +parser.add_argument('--num_data', type=int, required=True) +parser.add_argument('--output', type=str, required=True) +args = parser.parse_args() + +model = args.model + +num_data = args.num_data + +output_path = args.output + +# Build TFLite interpreter. (to get the information of model input) +interpreter = tf.lite.Interpreter(model) +input_details = interpreter.get_input_details() + +# Create h5 file +h5_file = h5.File(output_path, 'w') +group = h5_file.create_group("value") +group.attrs['desc'] = "Input data for " + model + +# Generate random data +for i in range(num_data): + sample = group.create_group(str(i)) + sample.attrs['desc'] = "Input data " + str(i) + + for j in range(len(input_details)): + input_detail = input_details[j] + input_data = np.array( + np.random.random_sample(input_detail["shape"]), input_detail["dtype"]) + sample.create_dataset(str(j), data=input_data) + +h5_file.close() diff --git a/compiler/record-minmax-conversion-test/requires.cmake b/compiler/record-minmax-conversion-test/requires.cmake new file mode 100644 index 0000000..9105c3e --- /dev/null +++ b/compiler/record-minmax-conversion-test/requires.cmake @@ -0,0 +1,2 @@ +require("common-artifacts") +require("record-minmax") diff --git a/compiler/record-minmax-conversion-test/test.lst b/compiler/record-minmax-conversion-test/test.lst new file mode 100644 index 0000000..771c3bd --- /dev/null +++ b/compiler/record-minmax-conversion-test/test.lst @@ -0,0 +1,16 @@ +addTest(Add_000) +addTest(AveragePool2D_000) +addTest(Concatenation_000) +addTest(Conv2D_000) +addTest(Conv2D_001) +addTest(Conv2D_002) +addTest(DepthwiseConv2D_000) +addTest(FullyConnected_000) +addTest(FullyConnected_001) +addTest(MaxPool2D_000) +addTest(Mul_000) +addTest(Pad_000) +addTest(Reshape_000) +addTest(Reshape_001) +addTest(Reshape_002) +addTest(Softmax_000) diff --git a/compiler/record-minmax-conversion-test/testall.sh b/compiler/record-minmax-conversion-test/testall.sh new file mode 100755 index 0000000..29c9ed3 --- /dev/null +++ b/compiler/record-minmax-conversion-test/testall.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# This script tests the basic behavior of record-minmax +# +# HOW TO USE +# +# ./testall.sh ... +# test.config : set ${RECORD_MINMAX_PATH} +# work_dir : build directory of record-minmax-conversion-test (ex: build/compiler/record-minmax-conversion-test) + +GEN_SOURCE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GEN_SCRIPT_PATH="${GEN_SOURCE_PATH}/gen_h5_random_inputs.py" +CONFIG_PATH="$1"; shift +BIN_PATH=$(dirname "$CONFIG_PATH") +WORKDIR="$1"; shift +VIRTUALENV="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found RECORD-MINMAX: ${RECORD_MINMAX_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +for TESTCASE in "$@"; do + TESTED+=("${TESTCASE}") + + TESTCASE_FILE="${WORKDIR}/${TESTCASE}" + + PASSED_TAG="${BIN_PATH}/${TESTCASE}.passed" + rm -f "${PASSED_TAG}" + + cat > "${BIN_PATH}/${TESTCASE}.log" <( + exec 2>&1 + set -ex + + # Generate h5 input data + source "${VIRTUALENV}/bin/activate" + "${VIRTUALENV}/bin/python" "${GEN_SCRIPT_PATH}" \ + --model "${TESTCASE_FILE}.tflite" \ + --num_data 3 \ + --output "${BIN_PATH}/${TESTCASE}.tflite.input.h5" + + if [[ $? -ne 0 ]]; then + echo "FAILED TO GENERATE INPUT" + continue + fi + + # Run record-minmax + "${RECORD_MINMAX_PATH}" \ + --input_model "${TESTCASE_FILE}.circle" \ + --input_data "${BIN_PATH}/${TESTCASE}.tflite.input.h5" \ + --output_model "${BIN_PATH}/${TESTCASE}.out.circle" + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$TESTCASE") + else + FAILED+=("$TESTCASE") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/record-minmax/CMakeLists.txt b/compiler/record-minmax/CMakeLists.txt new file mode 100644 index 0000000..862660e --- /dev/null +++ b/compiler/record-minmax/CMakeLists.txt @@ -0,0 +1,27 @@ +nnas_find_package(HDF5 COMPONENTS STATIC QUIET) + +if(NOT HDF5_FOUND) + message(STATUS "Build record-minmax: FAILED (missing HDF5)") + return() +endif(NOT HDF5_FOUND) + +set(DRIVER "driver/Driver.cpp") + +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(record-minmax ${DRIVER} ${SOURCES}) +target_include_directories(record-minmax PRIVATE include) +target_include_directories(record-minmax PRIVATE ${HDF5_INCLUDE_DIRS}) + +target_link_libraries(record-minmax ${HDF5_CXX_LIBRARIES}) +target_link_libraries(record-minmax arser) +target_link_libraries(record-minmax safemain) +target_link_libraries(record-minmax luci_import) +target_link_libraries(record-minmax luci_export) +target_link_libraries(record-minmax luci_interpreter) + +install(TARGETS record-minmax DESTINATION bin) + +nnas_find_package(GTest REQUIRED) +GTest_AddTest(record_minmax_function_test "${CMAKE_CURRENT_SOURCE_DIR}/tests/RecordFunction.test.cpp") +target_include_directories(record_minmax_function_test PRIVATE include) diff --git a/compiler/record-minmax/README.md b/compiler/record-minmax/README.md new file mode 100644 index 0000000..6a491f2 --- /dev/null +++ b/compiler/record-minmax/README.md @@ -0,0 +1,18 @@ +# record-minmax + +_record-minmax_ is a tool to embed min/max values of activations to the circle model for post-training quantization. + +## Usage + +This will run with the path to the input model (.circle), a pack of input data (.h5), and the output model (.circle). + +``` +$ ./record-minmax +``` + +For example, +``` +$ ./record-minmax input.circle input.h5 out.circle +``` + +Output is a circle model where min/max values of activation tensors are saved in QuantizationParameters. diff --git a/compiler/record-minmax/driver/Driver.cpp b/compiler/record-minmax/driver/Driver.cpp new file mode 100644 index 0000000..ae4fcb7 --- /dev/null +++ b/compiler/record-minmax/driver/Driver.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RecordMinMax.h" + +#include + +int entry(const int argc, char **argv) +{ + using namespace record_minmax; + + arser::Arser arser( + "Embedding min/max values of activations to the circle model for post-training quantization"); + + arser.add_argument("--input_model") + .nargs(1) + .type(arser::DataType::STR) + .required(true) + .help("Input model filepath"); + + arser.add_argument("--input_data") + .nargs(1) + .type(arser::DataType::STR) + .required(true) + .help("Input data filepath"); + + arser.add_argument("--output_model") + .nargs(1) + .type(arser::DataType::STR) + .required(true) + .help("Output model filepath"); + + arser.add_argument("--min_percentile") + .nargs(1) + .type(arser::DataType::FLOAT) + .help("Record n'th percentile of min"); + + arser.add_argument("--max_percentile") + .nargs(1) + .type(arser::DataType::FLOAT) + .help("Record n'th percentile of max"); + + arser.add_argument("--mode") + .nargs(1) + .type(arser::DataType::STR) + .help("Record mode. percentile (default) or moving_average"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; + } + + auto input_model_path = arser.get("--input_model"); + auto input_data_path = arser.get("--input_data"); + auto output_model_path = arser.get("--output_model"); + + // Default values + std::string mode("percentile"); + float min_percentile = 1.0; + float max_percentile = 99.0; + + if (arser["--min_percentile"]) + min_percentile = arser.get("--min_percentile"); + + if (arser["--max_percentile"]) + max_percentile = arser.get("--max_percentile"); + + if (arser["--mode"]) + mode = arser.get("--mode"); + + if (mode != "percentile" && mode != "moving_average") + throw std::runtime_error("Unsupported mode"); + + RecordMinMax rmm; + + // Initialize interpreter and observer + rmm.initialize(input_model_path); + + // Profile min/max while executing the given input data + rmm.profileData(mode, input_data_path, min_percentile, max_percentile); + + // Save profiled values to the model + rmm.saveModel(output_model_path); + + return EXIT_SUCCESS; +} diff --git a/compiler/record-minmax/include/MinMaxObserver.h b/compiler/record-minmax/include/MinMaxObserver.h new file mode 100644 index 0000000..ce63438 --- /dev/null +++ b/compiler/record-minmax/include/MinMaxObserver.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RECORD_MINMAX_MINMAXOBSERVER_H__ +#define __RECORD_MINMAX_MINMAXOBSERVER_H__ + +#include +#include + +#include +#include + +namespace record_minmax +{ + +struct MinMaxVectors +{ + std::vector min_vector; + std::vector max_vector; +}; + +class MinMaxMap +{ +public: + // Record min/max of node + void recordMinMax(const luci::CircleNode *node, float min, float max) + { + MinMaxVectors &vectors = _minmax_map[node]; + vectors.min_vector.push_back(min); + vectors.max_vector.push_back(max); + } + + const std::unordered_map *getMap() const + { + return &_minmax_map; + } + +private: + std::unordered_map _minmax_map; +}; + +class MinMaxObserver : public luci_interpreter::ExecutionObserver +{ +public: + MinMaxObserver() + { + // Do nothing + } + + void postTensorWrite(const luci::CircleNode *node, + const luci_interpreter::Tensor *tensor) override; + + const MinMaxMap *minMaxData() { return &_minmax_data; } + +private: + MinMaxMap _minmax_data; +}; + +} // namespace record_minmax + +#endif // __RECORD_MINMAX_MINMAXOBSERVER_H__ diff --git a/compiler/record-minmax/include/RecordFunction.h b/compiler/record-minmax/include/RecordFunction.h new file mode 100644 index 0000000..b570c6a --- /dev/null +++ b/compiler/record-minmax/include/RecordFunction.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include + +namespace record_minmax +{ + +/** + * @brief getNthPercentile calculates the n-th percentile of input vector (0.0 <= n <= 100.0) + * linear interpolation is used when the desired percentile lies between two data points + */ +float getNthPercentile(std::vector &vector, float percentile) +{ + if (percentile < 0 || percentile > 100) + throw std::runtime_error("Percentile must be ranged from 0 to 100"); + + if (percentile == 0.0) + return vector.front(); + + if (percentile == 100.0) + return vector.back(); + + if (vector.empty()) + throw std::runtime_error("Percentile must take a non-empty vector as an argument"); + + if (vector.size() == 1) + return vector[0]; + + std::vector copy; + copy.assign(vector.begin(), vector.end()); + std::sort(copy.begin(), copy.end()); + + int index = static_cast(std::floor((copy.size() - 1) * percentile / 100.0)); + + float percent_i = static_cast(index) / static_cast(copy.size() - 1); + float fraction = + (percentile / 100.0 - percent_i) / ((index + 1.0) / (copy.size() - 1.0) - percent_i); + float res = copy[index] + fraction * (copy[index + 1] - copy[index]); + return res; +} + +/** + * @brief getMovingAverage calculates the weighted moving average of input vector + * The initial value is the minimum (or maximum) value of the first batch of the vector + */ +float getMovingAverage(const std::vector &vector, const float alpha, + const uint8_t batch_size, bool is_min) +{ + assert(!vector.empty()); + assert(alpha >= 0.0 && alpha <= 1.0); + assert(batch_size > 0); + + auto getBatchMinOrMax = [&](int start_index) { + assert(start_index >= 0 && start_index < vector.size()); + + float res = is_min ? std::numeric_limits::max() : std::numeric_limits::lowest(); + for (int offset = 0; offset < batch_size; offset++) + { + int index = start_index + offset; + if (index >= vector.size()) + break; + + if (is_min) + { + res = vector[index] < res ? vector[index] : res; + } + else + { + res = vector[index] > res ? vector[index] : res; + } + } + return res; + }; + + float curr_avg = getBatchMinOrMax(0); + for (size_t i = batch_size; i < vector.size(); i += batch_size) + { + curr_avg = curr_avg * alpha + getBatchMinOrMax(i) * (1.0 - alpha); + } + return curr_avg; +} + +} // namespace record_minmax diff --git a/compiler/record-minmax/include/RecordMinMax.h b/compiler/record-minmax/include/RecordMinMax.h new file mode 100644 index 0000000..ffdb17a --- /dev/null +++ b/compiler/record-minmax/include/RecordMinMax.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RECORD_MINMAX_H__ +#define __RECORD_MINMAX_H__ + +#include +#include + +#include "MinMaxObserver.h" + +#include + +namespace record_minmax +{ + +class RecordMinMax +{ +public: + explicit RecordMinMax() = default; + + ~RecordMinMax() = default; + + void initialize(const std::string &input_model_path); + + void profileData(const std::string &mode, const std::string &input_data_path, + float min_percentile, float max_percentile); + + void saveModel(const std::string &output_model_path); + +private: + std::unique_ptr _module; + std::unique_ptr _interpreter; + std::unique_ptr _observer; +}; + +} // namespace record_minmax + +#endif // __RECORD_MINMAX_H__ diff --git a/compiler/record-minmax/requires.cmake b/compiler/record-minmax/requires.cmake new file mode 100644 index 0000000..0545035 --- /dev/null +++ b/compiler/record-minmax/requires.cmake @@ -0,0 +1,3 @@ +require("luci") +require("safemain") +require("arser") diff --git a/compiler/record-minmax/src/CircleExpContract.cpp b/compiler/record-minmax/src/CircleExpContract.cpp new file mode 100644 index 0000000..b703250 --- /dev/null +++ b/compiler/record-minmax/src/CircleExpContract.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "CircleExpContract.h" + +#include + +#include +#include + +namespace record_minmax +{ + +bool CircleExpContract::store(const char *ptr, const size_t size) const +{ + if (!ptr) + INTERNAL_EXN("Graph was not serialized by FlatBuffer for some reason"); + + std::ofstream fs(_filepath, std::ofstream::binary); + fs.write(ptr, size); + + return fs.good(); +} + +} // namespace record_minmax diff --git a/compiler/record-minmax/src/CircleExpContract.h b/compiler/record-minmax/src/CircleExpContract.h new file mode 100644 index 0000000..ab00fa8 --- /dev/null +++ b/compiler/record-minmax/src/CircleExpContract.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RECORD_MINMAX_CIRCLEXPCONTRACT_H__ +#define __RECORD_MINMAX_CIRCLEXPCONTRACT_H__ + +#include +#include +#include + +#include + +namespace record_minmax +{ + +struct CircleExpContract : public luci::CircleExporter::Contract +{ +public: + CircleExpContract(luci::Module *module, const std::string &filename) + : _module(module), _filepath(filename) + { + // NOTHING TO DO + } + virtual ~CircleExpContract() = default; + +public: + loco::Graph *graph(void) const final { return nullptr; } + luci::Module *module(void) const final { return _module; }; + +public: + bool store(const char *ptr, const size_t size) const final; + +private: + luci::Module *_module; + const std::string _filepath; +}; + +} // namespace record_minmax + +#endif // __RECORD_MINMAX_CIRCLEXPCONTRACT_H__ diff --git a/compiler/record-minmax/src/HDF5Importer.cpp b/compiler/record-minmax/src/HDF5Importer.cpp new file mode 100644 index 0000000..cf30cd8 --- /dev/null +++ b/compiler/record-minmax/src/HDF5Importer.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "HDF5Importer.h" + +#include + +#include +#include + +using Shape = luci_interpreter::Shape; +using DataType = luci_interpreter::DataType; + +namespace +{ + +Shape toInternalShape(const H5::DataSpace &dataspace) +{ + int rank = dataspace.getSimpleExtentNdims(); + + std::vector dims; + dims.resize(rank, 0); + dataspace.getSimpleExtentDims(dims.data()); + + Shape res(rank); + for (int axis = 0; axis < rank; ++axis) + { + res.dim(axis) = dims[axis]; + } + + return res; +} + +DataType toInternalDtype(const H5::DataType &h5_type) +{ + if (h5_type == H5::PredType::IEEE_F32BE || h5_type == H5::PredType::IEEE_F32LE) + { + return DataType::FLOAT32; + } + if (h5_type == H5::PredType::STD_I32BE || h5_type == H5::PredType::STD_I32LE) + { + return DataType::S32; + } + if (h5_type == H5::PredType::STD_I64BE || h5_type == H5::PredType::STD_I64LE) + { + return DataType::S64; + } + // Only support three datatypes for now + return DataType::Unknown; +} + +void readTensorData(H5::DataSet &tensor, uint8_t *buffer) +{ + tensor.read(buffer, H5::PredType::NATIVE_UINT8); +} + +void readTensorData(H5::DataSet &tensor, float *buffer) +{ + tensor.read(buffer, H5::PredType::NATIVE_FLOAT); +} + +void readTensorData(H5::DataSet &tensor, int32_t *buffer) +{ + tensor.read(buffer, H5::PredType::NATIVE_INT); +} + +void readTensorData(H5::DataSet &tensor, int64_t *buffer) +{ + tensor.read(buffer, H5::PredType::NATIVE_LONG); +} + +} // namespace + +namespace record_minmax +{ + +int32_t HDF5Importer::numInputs(int32_t record_idx) +{ + auto records = _value_grp.openGroup(std::to_string(record_idx)); + return records.getNumObjs(); +} + +void HDF5Importer::readTensor(int32_t record_idx, int32_t input_idx, void *buffer) +{ + auto record = _value_grp.openGroup(std::to_string(record_idx)); + auto tensor = record.openDataSet(std::to_string(input_idx)); + + readTensorData(tensor, static_cast(buffer)); +} + +void HDF5Importer::readTensor(int32_t record_idx, int32_t input_idx, DataType *dtype, Shape *shape, + void *buffer) +{ + auto record = _value_grp.openGroup(std::to_string(record_idx)); + auto tensor = record.openDataSet(std::to_string(input_idx)); + + auto tensor_dtype = tensor.getDataType(); + *dtype = toInternalDtype(tensor_dtype); + + auto tensor_shape = tensor.getSpace(); + *shape = toInternalShape(tensor_shape); + + switch (*dtype) + { + case DataType::FLOAT32: + readTensorData(tensor, static_cast(buffer)); + break; + case DataType::S32: + readTensorData(tensor, static_cast(buffer)); + break; + case DataType::S64: + readTensorData(tensor, static_cast(buffer)); + break; + default: + throw std::runtime_error{"Unsupported data type for input data (.h5)"}; + } +} + +} // namespace record_minmax diff --git a/compiler/record-minmax/src/HDF5Importer.h b/compiler/record-minmax/src/HDF5Importer.h new file mode 100644 index 0000000..cf65266 --- /dev/null +++ b/compiler/record-minmax/src/HDF5Importer.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __RECORD_MINMAX_HDF5IMPORTER_H__ +#define __RECORD_MINMAX_HDF5IMPORTER_H__ + +#include + +#include + +using Shape = luci_interpreter::Shape; +using DataType = luci_interpreter::DataType; + +namespace record_minmax +{ + +// HDF5Importer reads an input data saved in the hdf5 file in the given path +// The hierarchy of the hdf5 file is as follows. +// Group "/" +// > Group "value" +// > Group +// > Dataset +// record_idx : index of the record (dataset file can contain multiple records) +// input_idx : index of the input (DNN model can have multiple inputs) +// Ex: the j'th input of the i'th record can be accessed by "/value/i/j" +class HDF5Importer +{ +public: + explicit HDF5Importer(const std::string &path) : _file{path, H5F_ACC_RDONLY} + { + // Do nothing + } + +public: + /** + * @brief importGroup has to be called before readTensor is called + * Otherwise, readTensor will throw an exception + */ + void importGroup() { _value_grp = _file.openGroup("value"); } + + /** + * @brief Read tensor data from file and store it into buffer + * @details A tensor in the file can be retrieved with (record_idx, input_idx) + * @param record_idx : index of the record + * @param input_idx : index of the input + * @param dtype : pointer to write the tensor's data type + * @param shape : pointer to write the tensor's shape + * @param buffer : pointer to write the tensor's data + */ + void readTensor(int32_t record_idx, int32_t input_idx, DataType *dtype, Shape *shape, + void *buffer); + + // Read a raw tensor (no type/shape is specified) + void readTensor(int32_t record_idx, int32_t input_idx, void *buffer); + + bool isRawData() { return _value_grp.attrExists("rawData"); } + + int32_t numRecords() { return _value_grp.getNumObjs(); } + + int32_t numInputs(int32_t record_idx); + +private: + H5::H5File _file; + H5::Group _value_grp; +}; + +} // namespace record_minmax + +#endif // __RECORD_MINMAX_HDF5IMPORTER_H__ diff --git a/compiler/record-minmax/src/MinMaxObserver.cpp b/compiler/record-minmax/src/MinMaxObserver.cpp new file mode 100644 index 0000000..45f0197 --- /dev/null +++ b/compiler/record-minmax/src/MinMaxObserver.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MinMaxObserver.h" + +#include + +using DataType = luci_interpreter::DataType; + +namespace record_minmax +{ + +// postTensorWrite is only called for a node producing a tensor +void MinMaxObserver::postTensorWrite(const luci::CircleNode *node, + const luci_interpreter::Tensor *tensor) +{ + // CircleOutput does not produce a tensor + assert(node->opcode() != luci::CircleOpcode::CIRCLEOUTPUT); + + // Operators with multiple outputs + assert(node->opcode() != luci::CircleOpcode::IF); + assert(node->opcode() != luci::CircleOpcode::SPLIT); + assert(node->opcode() != luci::CircleOpcode::SPLIT_V); + assert(node->opcode() != luci::CircleOpcode::TOPK_V2); + assert(node->opcode() != luci::CircleOpcode::UNPACK); + assert(node->opcode() != luci::CircleOpcode::WHILE); + + if (node->opcode() == luci::CircleOpcode::CONST) + { + // node is not activation. Do nothing. + return; + } + + if (node->opcode() == luci::CircleOpcode::ARG_MAX) + { + // Output of arg_max is the index of the largest value across axes of a tensor + // this should not be quantized + return; + } + + // Only support recording of float32 values + if (tensor->element_type() != DataType::FLOAT32) + throw std::runtime_error("Tensor's data type is not float"); + + const auto data = tensor->data(); + const auto num_elements = tensor->shape().num_elements(); + + std::vector buf(data, data + num_elements); + auto minmax = std::minmax_element(buf.begin(), buf.end()); + float min = *minmax.first; + float max = *minmax.second; + + _minmax_data.recordMinMax(node, min, max); +} + +} // namespace record_minmax diff --git a/compiler/record-minmax/src/RecordMinMax.cpp b/compiler/record-minmax/src/RecordMinMax.cpp new file mode 100644 index 0000000..d12a0d3 --- /dev/null +++ b/compiler/record-minmax/src/RecordMinMax.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RecordMinMax.h" +#include "RecordFunction.h" +#include "CircleExpContract.h" +#include "MinMaxObserver.h" +#include "HDF5Importer.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using Shape = luci_interpreter::Shape; +using DataType = luci_interpreter::DataType; + +namespace +{ + +/** + * @brief getTensorSize will return size in bytes + */ +template size_t getTensorSize(const NodeT *node) +{ + uint32_t tensor_size = loco::size(node->dtype()); + for (uint32_t i = 0; i < node->rank(); ++i) + tensor_size *= node->dim(i).value(); + return tensor_size; +} + +/** + * @brief verifyTypeShape checks the type and the shape of CircleInput + * This throws an exception if type or shape does not match + */ +void verifyTypeShape(const luci::CircleInput *input_node, const DataType &dtype, const Shape &shape) +{ + // Type check + if (dtype != input_node->dtype()) + throw std::runtime_error("Wrong input type."); + + if (shape.num_dims() != input_node->rank()) + throw std::runtime_error("Input rank mismatch."); + + for (uint32_t i = 0; i < shape.num_dims(); i++) + { + if (shape.dim(i) != input_node->dim(i).value()) + throw std::runtime_error("Input shape mismatch."); + } +} + +} // namespace + +namespace record_minmax +{ + +void RecordMinMax::initialize(const std::string &input_model_path) +{ + // Load model from the file + std::ifstream fs(input_model_path, std::ifstream::binary); + if (fs.fail()) + { + throw std::runtime_error("Cannot open model file \"" + input_model_path + "\".\n"); + } + std::vector model_data((std::istreambuf_iterator(fs)), + std::istreambuf_iterator()); + _module = luci::Importer().importModule(circle::GetModel(model_data.data())); + + if (_module == nullptr) + { + throw std::runtime_error("ERROR: Failed to load '" + input_model_path + "'"); + } + + // Initialize interpreter + _interpreter = std::make_unique(_module.get()); + + _observer = std::make_unique(); + + _interpreter->attachObserver(_observer.get()); +} + +void RecordMinMax::profileData(const std::string &mode, const std::string &input_data_path, + float min_percentile, float max_percentile) +{ + HDF5Importer importer(input_data_path); + importer.importGroup(); + + bool is_raw_data = importer.isRawData(); + + const auto num_records = importer.numRecords(); + if (num_records == 0) + throw std::runtime_error("The input data file does not contain any record."); + + const auto input_nodes = loco::input_nodes(_module->graph()); + const auto num_inputs = input_nodes.size(); + + for (int32_t record_idx = 0; record_idx < num_records; record_idx++) + { + if (num_inputs != importer.numInputs(record_idx)) + throw std::runtime_error("Wrong number of inputs."); + + if (record_idx % 100 == 0) + std::cout << "Recording " << record_idx << "'th data" << std::endl; + + for (int32_t input_idx = 0; input_idx < num_inputs; input_idx++) + { + const auto *input_node = loco::must_cast(input_nodes[input_idx]); + assert(input_node->index() == input_idx); + std::vector input_data(getTensorSize(input_node)); + + if (!is_raw_data) + { + DataType dtype; + Shape shape(input_node->rank()); + importer.readTensor(record_idx, input_idx, &dtype, &shape, input_data.data()); + + // Check the type and the shape of the input data is valid + verifyTypeShape(input_node, dtype, shape); + } + else + { + // Skip type/shape check for raw data + importer.readTensor(record_idx, input_idx, input_data.data()); + } + + // TODO: Input data is copied twice (file -> buffer (input_data) -> interpreter inputs) + // We can redcue the copy by directly writing data from file to interpreter inputs + _interpreter->writeInputTensor(input_node, input_data.data(), input_data.size()); + } + + _interpreter->interpret(); + } + + std::cout << "Recording finished. Number of recorded data: " << num_records << std::endl; + + auto minmax_map = _observer->minMaxData()->getMap(); + for (auto iter = minmax_map->begin(); iter != minmax_map->end(); ++iter) + { + auto node = iter->first; + auto minmax = iter->second; + + float min, max; + if (mode == "percentile") + { + min = getNthPercentile(minmax.min_vector, min_percentile); + max = getNthPercentile(minmax.max_vector, max_percentile); + } + else if (mode == "moving_average") + { + min = getMovingAverage(minmax.min_vector, 0.9, 16, true); + max = getMovingAverage(minmax.max_vector, 0.9, 16, false); + } + assert(mode == "percentile" || mode == "moving_average"); + auto quantparam = std::make_unique(); + quantparam->min.push_back(min); + quantparam->max.push_back(max); + + assert(node->quantparam() == nullptr); + + auto mutable_node = const_cast(node); + mutable_node->quantparam(std::move(quantparam)); + } +} + +void RecordMinMax::saveModel(const std::string &output_model_path) +{ + // Export to output Circle file + luci::CircleExporter exporter; + CircleExpContract contract(_module.get(), output_model_path); + + if (!exporter.invoke(&contract)) + { + throw std::runtime_error("ERROR: Failed to export '" + output_model_path + "'"); + } +} + +} // namespace record_minmax diff --git a/compiler/record-minmax/tests/RecordFunction.test.cpp b/compiler/record-minmax/tests/RecordFunction.test.cpp new file mode 100644 index 0000000..13b464d --- /dev/null +++ b/compiler/record-minmax/tests/RecordFunction.test.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RecordFunction.h" + +#include +#include + +#include + +namespace record_minmax +{ + +#define EXPECT_FLOAT_NEAR(exp, val) EXPECT_NEAR(exp, val, 1e-5 + 1e-5 * std::abs(exp)) + +TEST(GetNthPercentileTest, Edge) +{ + std::vector input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + EXPECT_FLOAT_NEAR(0, getNthPercentile(input, 0)); + EXPECT_FLOAT_NEAR(9, getNthPercentile(input, 100)); +} + +TEST(GetNthPercentileTest, Simple) +{ + std::vector input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + for (float i = 1; i <= 99; i++) + { + EXPECT_FLOAT_NEAR(0.09 * i, getNthPercentile(input, i)); + } + + for (float i = 0.5; i <= 99.5; i++) + { + EXPECT_FLOAT_NEAR(0.09 * std::floor(i) + 0.045, getNthPercentile(input, i)); + } +} + +TEST(GetNthPercentileTest, Float) +{ + std::vector input{8.48424583, 89.39998456, 65.83323245, 87.85243858, 68.85414866, + 98.40591775, 16.74266565, 25.09415131, 74.54084952, 29.70536481, + 49.26803928, 79.49602425, 53.69395631, 73.73140271, 99.81245733, + 46.76997646, 78.37688474, 10.43076744, 30.39480496, 14.30875609, + 86.72073486, 17.97364969, 14.66724564, 0.47818459, 17.77138025, + 85.68981239, 22.18322696, 78.81541331, 93.04085581, 40.2147895}; + + EXPECT_FLOAT_NEAR(2.799942346802177, getNthPercentile(input, 1)); + EXPECT_FLOAT_NEAR(7.768503955476342, getNthPercentile(input, 3.14)); + EXPECT_FLOAT_NEAR(99.40456084968194, getNthPercentile(input, 99)); +} + +TEST(GetNthPercentileTest, FloatWithNegative) +{ + std::vector input{-41.51575417, 39.39998456, 15.83323245, 37.85243858, 18.85414866, + 48.40591775, -33.25733435, -24.90584869, 24.54084952, -20.29463519, + -0.73196072, 29.49602425, 3.69395631, 23.73140271, 49.81245733, + -3.23002354, 28.37688474, -39.56923256, -19.60519504, -35.69124391, + 36.72073486, -32.02635031, -35.33275436, -49.52181541, -32.22861975, + 35.68981239, -27.81677304, 28.81541331, 43.04085581, -9.7852105}; + + EXPECT_FLOAT_NEAR(-47.20005765319782, getNthPercentile(input, 1)); + EXPECT_FLOAT_NEAR(-42.23149604452366, getNthPercentile(input, 3.14)); + EXPECT_FLOAT_NEAR(49.40456084968194, getNthPercentile(input, 99)); +} + +TEST(GetNthPercentileTest, SigleElement) +{ + std::vector input{33}; + + EXPECT_FLOAT_NEAR(33, getNthPercentile(input, 0)); + EXPECT_FLOAT_NEAR(33, getNthPercentile(input, 50)); + EXPECT_FLOAT_NEAR(33, getNthPercentile(input, 100)); +} + +TEST(GetNthPercentileTest, OutOfBoundary_NEG) +{ + std::vector input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + + EXPECT_THROW(getNthPercentile(input, -1), std::runtime_error); + EXPECT_THROW(getNthPercentile(input, 101), std::runtime_error); +} + +TEST(GetNthPercentileTest, EmptyVector_NEG) +{ + std::vector input; + + EXPECT_THROW(getNthPercentile(input, 10), std::runtime_error); +} + +} // namespace record_minmax diff --git a/compiler/safemain/README.md b/compiler/safemain/README.md new file mode 100644 index 0000000..1844704 --- /dev/null +++ b/compiler/safemain/README.md @@ -0,0 +1 @@ +# safemain diff --git a/compiler/souschef/CMakeLists.txt b/compiler/souschef/CMakeLists.txt new file mode 100644 index 0000000..5a307be --- /dev/null +++ b/compiler/souschef/CMakeLists.txt @@ -0,0 +1,5 @@ +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_library(souschef STATIC ${SOURCES}) +set_target_properties(souschef PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(souschef PUBLIC include) diff --git a/compiler/souschef/README.md b/compiler/souschef/README.md new file mode 100644 index 0000000..a475ce4 --- /dev/null +++ b/compiler/souschef/README.md @@ -0,0 +1,3 @@ +# souschef + +_souschef_ is common library for _tflchef_ and _circlechef_ diff --git a/compiler/souschef/include/souschef/Arguments.h b/compiler/souschef/include/souschef/Arguments.h new file mode 100644 index 0000000..4556ce7 --- /dev/null +++ b/compiler/souschef/include/souschef/Arguments.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_ARGUMENTS_H__ +#define __SOUSCHEF_ARGUMENTS_H__ + +#include +#include + +namespace souschef +{ + +/** + * @brief Read-only string sequence view + */ +struct Arguments +{ + virtual ~Arguments() = default; + + virtual uint32_t count(void) const = 0; + virtual const std::string &value(uint32_t n) const = 0; +}; + +} // namespace souschef + +#endif // __SOUSCHEF_ARGUMENTS_H__ diff --git a/compiler/souschef/include/souschef/Data/Constant.h b/compiler/souschef/include/souschef/Data/Constant.h new file mode 100644 index 0000000..6bb7bba --- /dev/null +++ b/compiler/souschef/include/souschef/Data/Constant.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATA_CONSTANT_H__ +#define __SOUSCHEF_DATA_CONSTANT_H__ + +#include "souschef/DataChef.h" +#include "souschef/LexicalCast.h" + +namespace souschef +{ + +template class ConstantDataChef final : public DataChef +{ +public: + ConstantDataChef(const T &value) : _value{value} + { + // DO NOTHING + } + +public: + std::vector generate(int32_t count) const override + { + std::vector res; + + for (uint32_t n = 0; n < count; ++n) + { + const uint8_t *arr = reinterpret_cast(&_value); + + for (uint32_t b = 0; b < sizeof(T); ++b) + { + res.emplace_back(arr[b]); + } + } + + return res; + } + +private: + T _value; +}; + +template struct ConstantDataChefFactory : public DataChefFactory +{ + std::unique_ptr create(const Arguments &args) const + { + auto const value = to_number(args.value(0)); + return std::unique_ptr{new ConstantDataChef{value}}; + } +}; + +} // namespace souschef + +#endif // __SOUSCHEF_DATA_CONSTANT_H__ diff --git a/compiler/souschef/include/souschef/Data/Explicit.h b/compiler/souschef/include/souschef/Data/Explicit.h new file mode 100644 index 0000000..6e5ee81 --- /dev/null +++ b/compiler/souschef/include/souschef/Data/Explicit.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATA_EXPLICIT_H__ +#define __SOUSCHEF_DATA_EXPLICIT_H__ + +#include "souschef/DataChef.h" +#include "souschef/LexicalCast.h" + +#include + +namespace souschef +{ + +template class ExplicitDataChef final : public DataChef +{ +public: + ExplicitDataChef() + { + // DO NOTHING + } + +public: + std::vector generate(int32_t count) const override + { + std::vector res; + + for (uint32_t n = 0; n < count; ++n) + { + T const value = (n < _values.size()) ? _values.at(n) : T{}; + const uint8_t *arr = reinterpret_cast(&value); + + for (uint32_t b = 0; b < sizeof(T); ++b) + { + res.emplace_back(arr[b]); + } + } + + return res; + } + +public: + void insert(const T &value) { _values.emplace_back(value); } + +private: + std::vector _values; +}; + +template struct ExplicitDataChefFactory : public DataChefFactory +{ + std::unique_ptr create(const Arguments &args) const + { + std::unique_ptr> res{new ExplicitDataChef}; + + for (uint32_t n = 0; n < args.count(); ++n) + { + auto const value = to_number(args.value(n)); + res->insert(value); + } + + return std::move(res); + } +}; + +} // namespace souschef + +#endif // __SOUSCHEF_DATA_EXPLICIT_H__ diff --git a/compiler/souschef/include/souschef/Data/Gaussian.h b/compiler/souschef/include/souschef/Data/Gaussian.h new file mode 100644 index 0000000..75570e0 --- /dev/null +++ b/compiler/souschef/include/souschef/Data/Gaussian.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATA_GAUSSIAN_H__ +#define __SOUSCHEF_DATA_GAUSSIAN_H__ + +#include "souschef/DataChef.h" + +namespace souschef +{ + +/** + * @brief Generate a sequence of random values according to the gaussian(=normal) distribution + */ +class GaussianFloat32DataChef final : public DataChef +{ +public: + GaussianFloat32DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} + { + // DO NOTHING + } + +public: + std::vector generate(int32_t count) const override; + +private: + float _mean; + float _stddev; +}; + +class GaussianInt32DataChef final : public DataChef +{ +public: + GaussianInt32DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} + { + // DO NOTHING + } + +public: + std::vector generate(int32_t count) const override; + +private: + float _mean; + float _stddev; +}; + +class GaussianUint8DataChef final : public DataChef +{ +public: + GaussianUint8DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} + { + // DO NOTHING + } + +public: + std::vector generate(int32_t count) const override; + +private: + float _mean; + float _stddev; +}; + +struct GaussianFloat32DataChefFactory : public DataChefFactory +{ + std::unique_ptr create(const Arguments &args) const; +}; + +struct GaussianInt32DataChefFactory : public DataChefFactory +{ + std::unique_ptr create(const Arguments &args) const; +}; + +struct GaussianUint8DataChefFactory : public DataChefFactory +{ + std::unique_ptr create(const Arguments &args) const; +}; + +} // namespace souschef + +#endif // __SOUSCHEF_DATA_GAUSSIAN_H__ diff --git a/compiler/souschef/include/souschef/DataChef.def b/compiler/souschef/include/souschef/DataChef.def new file mode 100644 index 0000000..28901db --- /dev/null +++ b/compiler/souschef/include/souschef/DataChef.def @@ -0,0 +1,19 @@ +#ifndef DATA_CHEF +#error "Define DATA_CHEF first" +#endif // DATA_CHEF + +// DATA_CHEF(TYPE, NAME, FACTORY_CLASS) +// "TYPE" SHOULD BE an enum tag of tflchef::TensorType +DATA_CHEF(FLOAT32, constant, ConstantDataChefFactory) +DATA_CHEF(BOOL, constant, ConstantDataChefFactory) +DATA_CHEF(UINT8, constant, ConstantDataChefFactory) +DATA_CHEF(INT32, constant, ConstantDataChefFactory) +DATA_CHEF(INT64, constant, ConstantDataChefFactory) +DATA_CHEF(INT64, explicit, ExplicitDataChefFactory) +DATA_CHEF(INT32, explicit, ExplicitDataChefFactory) +DATA_CHEF(UINT8, explicit, ExplicitDataChefFactory) +DATA_CHEF(BOOL, explicit, ExplicitDataChefFactory) +DATA_CHEF(FLOAT32, explicit, ExplicitDataChefFactory) +DATA_CHEF(FLOAT32, gaussian, GaussianFloat32DataChefFactory) +DATA_CHEF(INT32, gaussian, GaussianInt32DataChefFactory) +DATA_CHEF(UINT8, gaussian, GaussianUint8DataChefFactory) diff --git a/compiler/souschef/include/souschef/DataChef.h b/compiler/souschef/include/souschef/DataChef.h new file mode 100644 index 0000000..4a65dfc --- /dev/null +++ b/compiler/souschef/include/souschef/DataChef.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATA_CHEF_H__ +#define __SOUSCHEF_DATA_CHEF_H__ + +#include "Arguments.h" + +#include +#include +#include + +namespace souschef +{ + +using Data = std::vector; + +/** + * @brief Data Generator + */ +struct DataChef +{ + virtual ~DataChef() = default; + + // TODO Allow users to query the type of elements that this DataChef generates + + /** + * @brief Generate a sequence of 'count' elements as a byte sequence + * + * Let D be the return value of generate(N). + * Then, D.size() == N * sizeof(T) where T is the element type. + */ + virtual Data generate(int32_t count) const = 0; +}; + +/** + * @brief Data Generator Factory + */ +struct DataChefFactory +{ + virtual ~DataChefFactory() = default; + + virtual std::unique_ptr create(const Arguments &args) const = 0; +}; + +} // namespace souschef + +#endif // __SOUSCHEF_DATA_CHEF_H__ diff --git a/compiler/souschef/include/souschef/DataChefs.h b/compiler/souschef/include/souschef/DataChefs.h new file mode 100644 index 0000000..7a86a2c --- /dev/null +++ b/compiler/souschef/include/souschef/DataChefs.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATA_CHEFS_H__ +#define __SOUSCHEF_DATA_CHEFS_H__ + +#include "Data/Constant.h" +#include "Data/Explicit.h" +#include "Data/Gaussian.h" + +#endif // __SOUSCHEF_DATA_CHEFS_H__ diff --git a/compiler/souschef/include/souschef/Dataset.h b/compiler/souschef/include/souschef/Dataset.h new file mode 100644 index 0000000..46a12e4 --- /dev/null +++ b/compiler/souschef/include/souschef/Dataset.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_DATASET_H__ +#define __SOUSCHEF_DATASET_H__ + +#include + +namespace souschef +{ + +template class Dataset +{ +public: + Dataset(const std::vector &vec) : _vec{vec} + { + // DO NOTHING + } + +public: + Dataset(std::vector &&vec) : _vec{std::move(vec)} + { + // DO NOTHING + } + +public: + template auto map(Func f) const -> Dataset()))> + { + using U = decltype(f(std::declval())); + std::vector res; + + for (const auto &elem : _vec) + { + res.emplace_back(f(elem)); + } + + return Dataset(std::move(res)); + } + +public: + const std::vector &vectorize(void) const { return _vec; } + +private: + std::vector _vec; +}; + +} // namespace souschef + +#endif // __SOUSCHEF_DATASET_H__ diff --git a/compiler/souschef/include/souschef/LexicalCast.h b/compiler/souschef/include/souschef/LexicalCast.h new file mode 100644 index 0000000..d83cb2a --- /dev/null +++ b/compiler/souschef/include/souschef/LexicalCast.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @brief This file provides string <-> number cast helpers + */ +#ifndef __SOUSCHEF_LEXICAL_CAST_H__ +#define __SOUSCHEF_LEXICAL_CAST_H__ + +#include + +namespace souschef +{ + +/** + * @brief Return a numeric value that corresponds to a given string + * + * @note This function will throw an exception on casting failure + */ +template Number to_number(const std::string &s); + +} // namespace souschef + +#endif // __SOUSCHEF_LEXICAL_CAST_H__ diff --git a/compiler/souschef/include/souschef/RangedArguments.h b/compiler/souschef/include/souschef/RangedArguments.h new file mode 100644 index 0000000..dd50f59 --- /dev/null +++ b/compiler/souschef/include/souschef/RangedArguments.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_RANGED_ARGUMENTS_H__ +#define __SOUSCHEF_RANGED_ARGUMENTS_H__ + +#include "Arguments.h" + +#include + +namespace souschef +{ + +template class RangedArguments : public Arguments +{ +public: + RangedArguments(InputIt beg, InputIt end) : _beg{beg}, _end{end} + { + // DO NOTHING + } + +public: + uint32_t count(void) const override { return _end - _beg; } + +public: + const std::string &value(uint32_t n) const override { return *(_beg + n); } + +private: + InputIt _beg; + InputIt _end; +}; + +template RangedArguments ranged_arguments(InputIt beg, InputIt end) +{ + return RangedArguments{beg, end}; +} + +} // namespace souschef + +#endif // __SOUSCHEF_RANGED_ARGUMENTS_H__ diff --git a/compiler/souschef/include/souschef/Registry.h b/compiler/souschef/include/souschef/Registry.h new file mode 100644 index 0000000..9457b6a --- /dev/null +++ b/compiler/souschef/include/souschef/Registry.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOUSCHEF_REGISTRY_H__ +#define __SOUSCHEF_REGISTRY_H__ + +#include +#include +#include + +namespace souschef +{ + +template class Registry +{ +public: + void add(const std::string &name, std::unique_ptr &&entry) + { + _content[name] = std::move(entry); + } + + const T &lookup(const std::string &name) const { return *(_content.at(name)); } + +private: + std::map> _content; +}; + +} // namespace souschef + +#endif // __SOUSCHEF_REGISTRY_H__ diff --git a/compiler/souschef/src/Gaussian.cpp b/compiler/souschef/src/Gaussian.cpp new file mode 100644 index 0000000..4a5083d --- /dev/null +++ b/compiler/souschef/src/Gaussian.cpp @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "souschef/Data/Gaussian.h" +#include "souschef/LexicalCast.h" + +#include +#include + +#include +#include + +namespace souschef +{ + +std::vector GaussianFloat32DataChef::generate(int32_t count) const +{ + // TODO Support seed value override + auto seed = std::chrono::system_clock::now().time_since_epoch().count(); + + std::minstd_rand rand{static_cast(seed)}; + std::normal_distribution dist{_mean, _stddev}; + + std::vector res; + + for (uint32_t n = 0; n < count; ++n) + { + auto const value = dist(rand); + auto const arr = reinterpret_cast(&value); + + for (uint32_t b = 0; b < sizeof(float); ++b) + { + res.emplace_back(arr[b]); + } + } + + return res; +} + +std::vector GaussianInt32DataChef::generate(int32_t count) const +{ + // TODO Support seed value override + auto seed = std::chrono::system_clock::now().time_since_epoch().count(); + + std::minstd_rand rand{static_cast(seed)}; + std::normal_distribution dist{_mean, _stddev}; + + std::vector res; + + for (uint32_t n = 0; n < count; ++n) + { + auto const value = static_cast(dist(rand)); + auto const arr = reinterpret_cast(&value); + + for (uint32_t b = 0; b < sizeof(int32_t); ++b) + { + res.emplace_back(arr[b]); + } + } + + return res; +} + +std::vector GaussianUint8DataChef::generate(int32_t count) const +{ + // TODO Support seed value override + auto seed = std::chrono::system_clock::now().time_since_epoch().count(); + + std::minstd_rand rand{static_cast(seed)}; + std::normal_distribution dist{_mean, _stddev}; + + std::vector res; + + for (uint32_t n = 0; n < count; ++n) + { + auto const value = static_cast(dist(rand)); // uint8_t for data type + auto const arr = reinterpret_cast(&value); // uint8_t for byte streaming + + for (uint32_t b = 0; b < sizeof(uint8_t); ++b) + { + res.emplace_back(arr[b]); + } + } + + return res; +} + +std::unique_ptr GaussianFloat32DataChefFactory::create(const Arguments &args) const +{ + if (args.count() != 2) + { + throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; + } + + auto const mean = to_number(args.value(0)); + auto const stddev = to_number(args.value(1)); + + return std::unique_ptr{new GaussianFloat32DataChef{mean, stddev}}; +} + +std::unique_ptr GaussianInt32DataChefFactory::create(const Arguments &args) const +{ + if (args.count() != 2) + { + throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; + } + + auto const mean = to_number(args.value(0)); + auto const stddev = to_number(args.value(1)); + + return std::unique_ptr{new GaussianInt32DataChef{mean, stddev}}; +} + +std::unique_ptr GaussianUint8DataChefFactory::create(const Arguments &args) const +{ + if (args.count() != 2) + { + throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; + } + + auto const mean = to_number(args.value(0)); + auto const stddev = to_number(args.value(1)); + + return std::unique_ptr{new GaussianUint8DataChef{mean, stddev}}; +} + +} // namespace souschef diff --git a/compiler/souschef/src/LexicalCast.cpp b/compiler/souschef/src/LexicalCast.cpp new file mode 100644 index 0000000..8e3d4cb --- /dev/null +++ b/compiler/souschef/src/LexicalCast.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "souschef/LexicalCast.h" + +#include +#include + +namespace souschef +{ + +template <> float to_number(const std::string &s) { return std::stof(s); } +template <> int to_number(const std::string &s) { return std::stoi(s); } +template <> int64_t to_number(const std::string &s) { return std::stoll(s); } +template <> uint8_t to_number(const std::string &s) +{ + int temp = std::stoi(s); + assert(temp >= 0); + assert(temp <= std::numeric_limits::max()); + return static_cast(temp); +} +template <> bool to_number(const std::string &s) +{ + if (std::stoi(s) || s == "T" || s == "t" || s == "TRUE" || s == "true") + return true; + return false; +} + +} // namespace souschef diff --git a/compiler/tf2circle-value-pbtxt-remote-test/CMakeLists.txt b/compiler/tf2circle-value-pbtxt-remote-test/CMakeLists.txt index f5292a0..64dcc28 100644 --- a/compiler/tf2circle-value-pbtxt-remote-test/CMakeLists.txt +++ b/compiler/tf2circle-value-pbtxt-remote-test/CMakeLists.txt @@ -141,7 +141,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E echo 'HDF5_EXPORT_ACTION_PATH=\"$\"' >> ${TEST_CONFIG} COMMAND ${CMAKE_COMMAND} -E echo 'HDF5_IMPORT_ACTION_PATH=\"$\"' >> ${TEST_CONFIG} COMMAND ${CMAKE_COMMAND} -E echo 'MODEL2NNPKG_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'NNPKG_TEST_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/tools/nnpackage_tool/nnpkg_test/nnpkg_test.sh\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'NNPKG_TEST_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/tests/scripts/nnpkg_test.sh\"' >> ${TEST_CONFIG} COMMAND ${CMAKE_COMMAND} -E echo 'RUNTIME_LIBRARY_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/Product/out/\"' >> ${TEST_CONFIG} DEPENDS nnkit-run diff --git a/compiler/tf2nnpackage-value-remote-test/CMakeLists.txt b/compiler/tf2nnpackage-value-remote-test/CMakeLists.txt new file mode 100644 index 0000000..4a59e88 --- /dev/null +++ b/compiler/tf2nnpackage-value-remote-test/CMakeLists.txt @@ -0,0 +1,94 @@ +include("test.lst") + +# Do not make test if there are no remote machine information +if(NOT REMOTE_IP) + message(STATUS "tf2nnpackage-value-remote-test: need to set REMOTE IP") + return() +endif(NOT REMOTE_IP) + +if(NOT REMOTE_USER) + message(STATUS "tf2nnpackage-value-remote-test: need to set REMOTE_USER") + return() +endif(NOT REMOTE_USER) + +nnas_include(TargetRequire) + +unset(REQUIRED_TARGETS) +list(APPEND REQUIRED_TARGETS testDataGenerator) +TargetRequire_Return(${REQUIRED_TARGETS}) + +message(STATUS "tf2nnpackage-value-remote-test: run tests") + +unset(TEST_NAMES) + +nncc_find_resource(TensorFlowLiteRecipes) +set(TFLITE_RECIPE_REPO "${TensorFlowLiteRecipes_DIR}") + +file(GLOB SUBDIR RELATIVE ${TFLITE_RECIPE_REPO} ${TFLITE_RECIPE_REPO}/*) +foreach(DIR IN ITEMS ${SUBDIR}) + if(IS_DIRECTORY ${TFLITE_RECIPE_REPO}/${DIR}) + list(APPEND TEST_NAMES ${DIR}) + endif() +endforeach() + +get_target_property(ARTIFACTS_SRC_PATH testDataGenerator SOURCE_DIR) + +# In this test, only the runtime test is performed because the test from tf to +# nnpackage is done in common-artifacts, and for this runtime test, generation of +# test data is required. And, tcgenerate in ${ARTIFACTS_SRC_PATH}/exclude.lst +# means it won't generate test data, which is why below "tcgenerate" macro excludes +# specific opearators from runtime test. +# Also, since circlize and optimize macro included in `exclude.lst` file is only +# needed in common-artifacts, it has no function here. +macro(circlize) +endmacro() +macro(optimize) +endmacro() + +macro(tcgenerate NAME) + list(REMOVE_ITEM TEST_NAMES ${NAME}) +endmacro() + +include("${ARTIFACTS_SRC_PATH}/exclude.lst") + +# Copy testall +set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh") +set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh") + +add_custom_command( + OUTPUT ${TEST_RUNNER} + COMMAND ${CMAKE_COMMAND} -E copy "${TEST_RUNNER_SOURCE}" "${TEST_RUNNER}" + DEPENDS ${TEST_RUNNER_SOURCE} + COMMENT "Generate test runner" +) + +list(APPEND TEST_DEPS "${TEST_RUNNER}") + +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + +# Generate test.config +set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") + +add_custom_command( + OUTPUT ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'NNPKG_TEST_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/tests/scripts/nnpkg_test.sh\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'RUNTIME_LIBRARY_PATH=\"${NNAS_PROJECT_SOURCE_DIR}/Product/out/\"' >> ${TEST_CONFIG} + COMMENT "Generate test configuration" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}") + +# This "tf2nnpackage_value_remote_test_deps" target enforces CMake to generate all the dependencies during "build" phase +add_custom_target(tf2nnpackage_value_remote_test_deps ALL DEPENDS ${TEST_DEPS}) + +# Run tests +add_test( + NAME tf2nnpackage_value_remote_test + COMMAND "${TEST_RUNNER}" + "${TEST_CONFIG}" + "${ARTIFACTS_BIN_PATH}" + "${REMOTE_IP}" + "${REMOTE_USER}" + ${TEST_NAMES} +) diff --git a/compiler/tf2nnpackage-value-remote-test/README.md b/compiler/tf2nnpackage-value-remote-test/README.md new file mode 100644 index 0000000..36436fc --- /dev/null +++ b/compiler/tf2nnpackage-value-remote-test/README.md @@ -0,0 +1,60 @@ +# tf2nnpackage-value-remote-test + +`tf2nnpackage-value-remote-test` does random value test for nnpackage file using remote machine, normally Odroid, which `onert` runs on. + +### Prerequisites + +1. Runtime Library and Binary files + - Detailed information is located in [here](../../docs/howto/how-to-cross-build-runtime-for-arm.md) + - If you build runtime, related files will be produced in `Product/out`. Do not rename or move it. +1. Remote machine information and test list + - You should create `test.lst` file first as shown below. + - Set IP address and username of remote machine using `set` command. + ```cmake + #--------------- Remote Machine Setting ---------------# + set(REMOTE_IP "xxx.xxx.xxx.xxx") + set(REMOTE_USER "remote_username") + ``` + - If any recipe is added, or if `REMOTE_IP` and `REMOTE_USER` is not given, `tf2nnpackage-value-remote-test` will not be created. +1. (Optional) ssh authentication + - This test uses `ssh` and `scp` commands, and those commands require a password of remote machine whenever they are called. This means that you should enter the password everytime when `ssh` and `scp` require. + - This test resolves the problem by using `ssh-copy-id`, which copies the public key of host machine to `authorized_keys` of remote machine. Because of that, this test will ask the password of remote machine only once, at the first time. This is the only user interaction while running this test. + - If you do not want to interact with system, just do `ssh-copy-id ${REMOTE_USER}@${REMOTE_IP}` in advance, before running this test. Once `ssh-copy-id` is done, there will be no user-interaction action while running the test. + +### Running + +- If you finished prerequisites properly, configuring -> building -> testing steps create cmake test automatically. +- All the related materials will be sent to `REMOTE_WORKDIR` in remote machine. Default value of `REMOTE_WORKDIR` is `CVT_YYMMDD_hhmmss`, which means Circle Value Test done on YY/MM/DD at hh:mm:ss. +- `REMOTE_WORKDIR` will not be removed automatically after this test finish. + ```sh + $ ./nncc configure && ./nncc build + + # Default REMOTE_WORKDIR is CVT_YYMMDD_hhmmss folder + $ ./nncc test -R tf2nnpackage_value_remote_test + + # You can set REMOTE_WORKDIR where you have write privilege + $ REMOTE_WORKDIR=/path/you/want/ ./nncc test -R tf2circle_value_pbtxt_remote_test + ``` + +### Generated Files While Running + +- All related files(`pb`, `circle`, `h5` ... etc.) are taken from `build/compiler/common-artifacts` folder. +- `nnpkg_test.sh`, runtime products and each nnpackage are sent to `REMOTE_WORKDIR` in remote machine. +- Each test result is generated in `build/compiler/common-artifacts` with the name `${RECIPE}.log` + +### Check Test Result + +- Summary of test result will be created as csv file in host. + ```sh + # Result_latest is symbolic link to the latest csv result file + # Print the latest test result + $ cat build/compiler/tf2circle-value-pbtxt-remote-test/Result_latest + TEST_NAME, TF2CIRCLE, CIRCLE_VALUE_TEST + UNIT_Add_000, TRUE, TRUE + ... + + # List all result csv files + $ ls build/compiler/tf2circle-value-pbtxt-remote-test/Result_*.csv + Result_20191119_212521.csv + ... + ``` diff --git a/compiler/tf2nnpackage-value-remote-test/requires.cmake b/compiler/tf2nnpackage-value-remote-test/requires.cmake new file mode 100644 index 0000000..06a4a8a --- /dev/null +++ b/compiler/tf2nnpackage-value-remote-test/requires.cmake @@ -0,0 +1 @@ +require("common-artifacts") diff --git a/compiler/tf2nnpackage-value-remote-test/test.lst b/compiler/tf2nnpackage-value-remote-test/test.lst new file mode 100644 index 0000000..10eb52d --- /dev/null +++ b/compiler/tf2nnpackage-value-remote-test/test.lst @@ -0,0 +1,3 @@ +#--------------- Remote Machine Setting ---------------# +# set(REMOTE_IP "xxx.xxx.xxx.xxx") +# set(REMOTE_USER "remote_username") diff --git a/compiler/tf2nnpackage-value-remote-test/testall.sh b/compiler/tf2nnpackage-value-remote-test/testall.sh new file mode 100755 index 0000000..f1c9789 --- /dev/null +++ b/compiler/tf2nnpackage-value-remote-test/testall.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +# Need at least 4 arguments +if [[ $# -lt 4 ]]; then + echo "USAGE: $0 ..." + echo + echo "ARGUMENTS:" + echo " [test.config path]" + echo " [WORKDIR]" + echo " [REMOTE_IP]" + echo " [REMOTE_USER]" + echo " [Prefix1]" + echo " [Prefix2]" + echo " ..." + exit 255 +fi + +CONFIG_PATH="$1"; shift +WORKDIR="$1"; shift +REMOTE_IP="$1"; shift +REMOTE_USER="$1"; shift + +BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +CURRENT_DATETIME=$(date +'%Y%m%d_%H%M%S') +REMOTE_WORKDIR=${REMOTE_WORKDIR:-"CVT_${CURRENT_DATETIME}"} +RESULT_CSV="${BINDIR}/Result_${CURRENT_DATETIME}.csv" + +source "${CONFIG_PATH}" + +echo "-- Found nnpkg_test: ${NNPKG_TEST_PATH}" +echo "-- Found Runtime library: ${RUNTIME_LIBRARY_PATH}" +echo "-- Found workdir: ${WORKDIR}" + +if [ -z ${NNPKG_TEST_PATH} ] || [ ! -f ${NNPKG_TEST_PATH} ]; then + echo "nnpkg_test is not found" + exit 4 +fi + +# Register remote machine ssh information +cat /dev/zero | ssh-keygen -q -N "" +ssh-copy-id -o ConnectTimeout=5 "${REMOTE_USER}@${REMOTE_IP}" + +# Odroid IP address validation +if [[ $? -ne 0 ]]; then + echo "Cannot reach to given remote machine. Check IP address or username." + exit 5 +fi + +# Send runtime library files +ssh "${REMOTE_USER}@${REMOTE_IP}" "mkdir -p ${REMOTE_WORKDIR}/Product/" +scp -r "${RUNTIME_LIBRARY_PATH}" "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_WORKDIR}/Product/" + +# Send nnpkg_test.sh +scp "${NNPKG_TEST_PATH}" "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_WORKDIR}/" + +TESTED=() +PASSED=() +FAILED=() +echo "TEST_NAME, CIRCLE_VALUE_TEST" >> ${RESULT_CSV} + +pushd "${WORKDIR}" +while [[ $# -ne 0 ]]; do + PREFIX="$1"; shift + + TESTED+=("${PREFIX}") + + PASSED_TAG="${PREFIX}.passed" + + rm -f "${BINDIR}/${PASSED_TAG}" + + # Information to be recorded + CIRCLE_VALUE_PASSED=FALSE + + cat > "${BINDIR}/${PREFIX}.log" <( + exec 2>&1 + + # Exit immediately if any command fails + set -e + # Show commands + set -x + + # Run nnpkg_test in remote machine + if [ ! -d "${PREFIX}" ] ; then + PREFIX=${PREFIX}.opt ; + fi + scp -r "${PREFIX}/" "${REMOTE_USER}@${REMOTE_IP}:${REMOTE_WORKDIR}/${PREFIX}/" + ssh "${REMOTE_USER}@${REMOTE_IP}" "cd ${REMOTE_WORKDIR}; ./nnpkg_test.sh ${PREFIX}" + + if [[ $? -eq 0 ]]; then + touch "${BINDIR}/${PASSED_TAG}" + fi + ) + + if [[ -f "${BINDIR}/${PASSED_TAG}" ]]; then + PASSED+=("$PREFIX") + CIRCLE_VALUE_PASSED=TRUE + else + FAILED+=("$PREFIX") + CIRCLE_VALUE_PASSED=FALSE + fi + + echo "${PREFIX}, ${CIRCLE_VALUE_PASSED}" >> ${RESULT_CSV} +done +popd + +rm -f Result_latest +ln -s ${RESULT_CSV} Result_latest + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/tf2nnpkg/README.md b/compiler/tf2nnpkg/README.md new file mode 100644 index 0000000..f8ec2c9 --- /dev/null +++ b/compiler/tf2nnpkg/README.md @@ -0,0 +1 @@ +# tf2nnpkg diff --git a/compiler/tf2tflite-dredd-pbtxt-test/README.md b/compiler/tf2tflite-dredd-pbtxt-test/README.md new file mode 100644 index 0000000..0918679 --- /dev/null +++ b/compiler/tf2tflite-dredd-pbtxt-test/README.md @@ -0,0 +1 @@ +# tf2tflite-dredd-pbtxt-test diff --git a/compiler/tf2tfliteV2-conversion-test/CMakeLists.txt b/compiler/tf2tfliteV2-conversion-test/CMakeLists.txt new file mode 100644 index 0000000..3e7e577 --- /dev/null +++ b/compiler/tf2tfliteV2-conversion-test/CMakeLists.txt @@ -0,0 +1,109 @@ +nncc_find_resource(TensorFlowTests) + +# +# Copy [PREFIX]/test.pbtxt to PREFIX.pbtxt in binary folder +# Copy [PREFIX]/test.info to PREFIX.info in binary folder +# Encode PREFIX.pbtxt to PREFIX.pb +# +set(TEST_REPO "${TensorFlowTests_DIR}") +set(TEST_PBTXT_FILENAME "test.pbtxt") +set(TEST_INFO_FILENAME "test.info") + +unset(TESTCASES) + +macro(add NAME) + list(APPEND TESTCASES ${NAME}) +endmacro(add) + +# Read "test.lst" +include("test.lst") +# Read "test.local.lst" if exists +include("test.local.lst" OPTIONAL) + +unset(TEST_DEPS) +unset(TEST_NAMES) + +foreach(PREFIX IN ITEMS ${TESTCASES}) + if(NOT IS_DIRECTORY "${TEST_REPO}/${PREFIX}") + message(FATAL_ERROR "Missing '${PREFIX}' test") + endif() + + set(PBTXT_SOURCE_PATH "${TEST_REPO}/${PREFIX}/${TEST_PBTXT_FILENAME}") + set(INFO_SOURCE_PATH "${TEST_REPO}/${PREFIX}/${TEST_INFO_FILENAME}") + + set(PBTXT_FILE "${PREFIX}.pbtxt") + set(PBTXT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PBTXT_FILE}") + + set(INFO_FILE "${PREFIX}.info") + set(INFO_PATH "${CMAKE_CURRENT_BINARY_DIR}/${INFO_FILE}") + + # Copy .pbtxt + add_custom_command(OUTPUT ${PBTXT_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${PBTXT_SOURCE_PATH}" "${PBTXT_PATH}" + DEPENDS ${PBTXT_SOURCE_PATH} + COMMENT "Generate ${PBTXT_FILE}" + ) + + # Copy .info + add_custom_command(OUTPUT ${INFO_PATH} + COMMAND ${CMAKE_COMMAND} -E copy "${INFO_SOURCE_PATH}" "${INFO_PATH}" + DEPENDS ${INFO_SOURCE_PATH} + COMMENT "Generate ${INFO_FILE}" + ) + + list(APPEND TEST_DEPS ${INFO_PATH} ${PBTXT_PATH}) + list(APPEND TEST_NAMES ${PREFIX}) +endforeach(PREFIX) + +## +## Copy testall +## +set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh") +set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh") + +add_custom_command( + OUTPUT ${TEST_RUNNER} + COMMAND ${CMAKE_COMMAND} -E copy "${TEST_RUNNER_SOURCE}" "${TEST_RUNNER}" + DEPENDS ${TEST_RUNNER_SOURCE} + COMMENT "Generate test runner" +) + +list(APPEND TEST_DEPS "${TEST_RUNNER}") + +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + +set(VIRTUALENV "${NNCC_OVERLAY_DIR}/venv_1_13_2") + +### +### Generate test.config +### +set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") + +# Get tf2tfliteV2 binary path +get_target_property(TF2TFLITEV2_BIN_DIR tf2tfliteV2 BINARY_DIR) +set(TF2TFLITEV2_PATH "${TF2TFLITEV2_BIN_DIR}/tf2tfliteV2.py") + +add_custom_command( + OUTPUT ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'TF2TFLITEV2_PATH=\"${TF2TFLITEV2_PATH}\"' >> ${TEST_CONFIG} + COMMAND ${CMAKE_COMMAND} -E echo 'VIRTUALENV=\"${VIRTUALENV}\"' >> ${TEST_CONFIG} + DEPENDS + tf2tfliteV2 + COMMENT "Generate test configuration" +) + +list(APPEND TEST_DEPS "${TEST_CONFIG}") + +# This "tf2tfliteV2_conversion_test_deps" target enforces CMake to generate all the dependencies during "build" phase +add_custom_target(tf2tfliteV2_conversion_test_deps ALL DEPENDS ${TEST_DEPS}) + +# TODO This test takes a long time and will only be tested once a day. +# Run tests +# add_test( +# NAME tf2tfliteV2_conversion_test +# COMMAND "${TEST_RUNNER}" +# "${TEST_CONFIG}" +# "${CMAKE_CURRENT_BINARY_DIR}" +# ${TEST_NAMES} +# ) diff --git a/compiler/tf2tfliteV2-conversion-test/README.md b/compiler/tf2tfliteV2-conversion-test/README.md new file mode 100644 index 0000000..d4d2a97 --- /dev/null +++ b/compiler/tf2tfliteV2-conversion-test/README.md @@ -0,0 +1,2 @@ +# tf2tfliteV2-conversion-test + diff --git a/compiler/tf2tfliteV2-conversion-test/requires.cmake b/compiler/tf2tfliteV2-conversion-test/requires.cmake new file mode 100644 index 0000000..31b3354 --- /dev/null +++ b/compiler/tf2tfliteV2-conversion-test/requires.cmake @@ -0,0 +1,2 @@ +require("common-artifacts") +require("tf2tfliteV2") diff --git a/compiler/tf2tfliteV2-conversion-test/test.lst b/compiler/tf2tfliteV2-conversion-test/test.lst new file mode 100644 index 0000000..2f771ba --- /dev/null +++ b/compiler/tf2tfliteV2-conversion-test/test.lst @@ -0,0 +1,124 @@ +# TODO Enable skipped tests + +add(NET_0000) +add(NET_0001) +add(NET_0002) +add(NET_0003) +add(NET_0004) +add(NET_0005) +add(NET_0006) +add(NET_0007) +add(NET_0008) +add(NET_0009) +add(NET_0010) +add(NET_0011) +add(NET_0012) +add(NET_0013) +add(NET_0014) +add(NET_0015) +add(NET_0016) +add(NET_0017) +add(NET_0018) +add(NET_0019) +add(NET_0020) +add(NET_0021) +add(NET_0022) +#add(NET_0023) +add(NET_0024) +add(NET_0025) +add(NET_0026) +add(NET_0027) +add(NET_0028) +add(NET_0029) +add(NET_0030) +add(NET_0031) +add(NET_0032) +add(NET_0033) +add(NET_0034) +add(NET_0035) +add(NET_0036) +add(NET_0037) +add(NET_0038) +add(NET_0039) +add(NET_0040) +add(NET_0041) +#add(NET_0042) +add(REGRESSION_0000) +add(REGRESSION_0001) +add(REGRESSION_0002) +add(UNIT_Add_000) +add(UNIT_Add_001) +add(UNIT_Add_002) +#add(UNIT_Add_003) +add(UNIT_Add_004) +add(UNIT_Add_005) +add(UNIT_AvgPool_000) +add(UNIT_AvgPool_001) +#add(UNIT_BiasAdd_000) +#add(UNIT_BiasAdd_001) +add(UNIT_BiasAdd_002) +#add(UNIT_ConcatV2_000) +#add(UNIT_ConcatV2_001) +add(UNIT_ConcatV2_002) +#add(UNIT_Const_000) +#add(UNIT_Const_001) +add(UNIT_Conv2D_000) +add(UNIT_Conv2D_001) +add(UNIT_Conv2D_002) +add(UNIT_Conv2DBackpropInput_000) +add(UNIT_Conv2DBackpropInput_001) +add(UNIT_Conv2DBackpropInput_002) +add(UNIT_CustomOp_000) +add(UNIT_CustomOp_001) +add(UNIT_DepthwiseConv2dNative_000) +add(UNIT_DepthwiseConv2dNative_001) +add(UNIT_FusedBatchNorm_000) +add(UNIT_FusedBatchNorm_001) +add(UNIT_Maximum_000) +add(UNIT_Maximum_001) +add(UNIT_Maximum_002) +add(UNIT_MaxPool_000) +add(UNIT_MaxPool_001) +add(UNIT_Mean_000) +add(UNIT_Mean_001) +add(UNIT_Mean_002) +add(UNIT_Mean_003) +add(UNIT_MirrorPad_000) +add(UNIT_Mul_000) +add(UNIT_Mul_001) +add(UNIT_Mul_002) +#add(UNIT_Pack_000) +#add(UNIT_Pack_001) +#add(UNIT_Pack_002) +#add(UNIT_Pack_003) +#add(UNIT_Pack_004) +add(UNIT_Pad_000) +add(UNIT_PadV2_000) +#add(UNIT_Placeholder_000) +#add(UNIT_Placeholder_001) +#add(UNIT_Placeholder_002) +#add(UNIT_Placeholder_003) +add(UNIT_RealDiv_000) +add(UNIT_RealDiv_001) +add(UNIT_Relu_000) +add(UNIT_Relu6_000) +add(UNIT_Reshape_000) +add(UNIT_Rsqrt_000) +#add(UNIT_Shape_000) +add(UNIT_Softmax_000) +add(UNIT_Softmax_001) +add(UNIT_Softmax_002) +add(UNIT_Softmax_003) +add(UNIT_Sqrt_000) +add(UNIT_SquaredDifference_000) +add(UNIT_SquaredDifference_001) +add(UNIT_Squeeze_000) +add(UNIT_Squeeze_001) +add(UNIT_Squeeze_002) +add(UNIT_Squeeze_003) +#add(UNIT_StopGradient_000) +#add(UNIT_StopGradient_001) +#add(UNIT_StridedSlice_000) +add(UNIT_Sub_000) +add(UNIT_Sub_001) +add(UNIT_Tanh_000) diff --git a/compiler/tf2tfliteV2-conversion-test/testall.sh b/compiler/tf2tfliteV2-conversion-test/testall.sh new file mode 100755 index 0000000..2d9a423 --- /dev/null +++ b/compiler/tf2tfliteV2-conversion-test/testall.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Need at least 2 arguments +if [[ $# -lt 2 ]]; then + echo "USAGE: $0 ..." + echo + echo "ARGUMENTS:" + echo " [test.config path]" + echo " [WORKDIR]" + echo " [Prefix1]" + echo " [Prefix2]" + echo " ..." + exit 255 +fi + +CONFIG_PATH="$1"; shift +WORKDIR="$1"; shift + +source "${CONFIG_PATH}" + +echo "-- Found TF2TFLITEV2: ${TF2TFLITEV2_PATH}" +echo "-- Found python virtualenv: ${VIRTUALENV}" + +TESTED=() +PASSED=() +FAILED=() + +pushd "${WORKDIR}" +while [[ $# -ne 0 ]]; do + PREFIX="$1"; shift + + TESTED+=("${PREFIX}") + + PASSED_TAG="${PREFIX}.passed" + + rm -f "${PASSED_TAG}" + + cat > "${PREFIX}.log" <( + exec 2>&1 + + echo "-- Found pbtxt: ${PREFIX}.pbtxt" + + # Exit immediately if any command fails + set -e + # Show commands + set -x + + # Generate tflite + source "${VIRTUALENV}/bin/activate" + "${VIRTUALENV}/bin/python" "${TF2TFLITEV2_PATH}" \ + --v1 \ + --input_path "${WORKDIR}/${PREFIX}.pbtxt" \ + --input_arrays "$(awk -F, '/^input/ { print $2 }' ${PREFIX}.info | cut -d: -f1 | tr -d ' ' | paste -d, -s)" \ + --input_shapes "$(cat ${PREFIX}.info | grep '^input' | cut -d '[' -f2 | cut -d ']' -f1 | tr -d ' ' | xargs | tr ' ' ':')" \ + --output_path "${WORKDIR}/${PREFIX}.tflite" \ + --output_arrays "$(awk -F, '/^output/ { print $2 }' ${PREFIX}.info | cut -d: -f1 | tr -d ' ' | paste -d, -s)" + + if [[ $? -eq 0 ]]; then + touch "${PASSED_TAG}" + fi + ) + + if [[ -f "${PASSED_TAG}" ]]; then + PASSED+=("$PREFIX") + else + FAILED+=("$PREFIX") + fi +done +popd + +if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then + echo "FAILED" + for TEST in "${FAILED[@]}" + do + echo "- ${TEST}" + done + exit 255 +fi + +echo "PASSED" +exit 0 diff --git a/compiler/tf2tfliteV2-value-pbtxt-test/CMakeLists.txt b/compiler/tf2tfliteV2-value-pbtxt-test/CMakeLists.txt deleted file mode 100644 index 2526db5..0000000 --- a/compiler/tf2tfliteV2-value-pbtxt-test/CMakeLists.txt +++ /dev/null @@ -1,183 +0,0 @@ -find_package(PythonInterp 3 QUIET) -find_package(PythonLibs 3 QUIET) - -if(NOT ${PYTHONINTERP_FOUND}) - message("Build tf2tfliteV2-value-pbtxt-test: FALSE (Python3 is missing)") - return() -endif() - -if(${PYTHON_VERSION_MINOR} LESS 3) - message("Build tf2tfliteV2-value-pbtxt-test: FALSE (You need to install Python version higher than 3.3)") - return() -endif() - -nnas_include(TargetRequire) - -unset(REQUIRED_TARGETS) -list(APPEND REQUIRED_TARGETS tfkit) -list(APPEND REQUIRED_TARGETS tf2tfliteV2) -list(APPEND REQUIRED_TARGETS nnkit-run) -list(APPEND REQUIRED_TARGETS nnkit_tf_backend) -list(APPEND REQUIRED_TARGETS nnkit_tflite_backend) -list(APPEND REQUIRED_TARGETS nnkit_randomize_action) -list(APPEND REQUIRED_TARGETS nnkit_HDF5_export_action) -list(APPEND REQUIRED_TARGETS nnkit_HDF5_import_action) -list(APPEND REQUIRED_TARGETS i5diff) -TargetRequire_Return(${REQUIRED_TARGETS}) - -message(STATUS "tf2tfliteV2-value-pbtxt-test: run tests") - -# Create python virtual environment -set(VIRTUALENV "${CMAKE_CURRENT_BINARY_DIR}/venv") - -add_custom_command( - OUTPUT ${VIRTUALENV} - COMMAND ${PYTHON_EXECUTABLE} -m venv ${VIRTUALENV} -) - -# Copy requirements.txt and install required pip packages -set(REQUIREMENTS_FILE "requirements.txt") -set(REQUIREMENTS_SRC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${REQUIREMENTS_FILE}") -set(REQUIREMENTS_BIN_PATH "${CMAKE_CURRENT_BINARY_DIR}/${REQUIREMENTS_FILE}") - -add_custom_command( - OUTPUT ${REQUIREMENTS_BIN_PATH} - COMMAND ${CMAKE_COMMAND} -E copy ${REQUIREMENTS_SRC_PATH} ${REQUIREMENTS_BIN_PATH} - COMMAND ${VIRTUALENV}/bin/python -m pip install --upgrade pip setuptools --timeout 100 - COMMAND ${VIRTUALENV}/bin/python -m pip install -r requirements.txt --upgrade --timeout 100 - DEPENDS ${VIRTUALENV} ${REQUIREMENTS_SRC_PATH} -) - -add_custom_target(tf2tfliteV2_value_pbtxt_python_deps ALL - DEPENDS ${VIRTUALENV} ${REQUIREMENTS_BIN_PATH} #${TF2TFLITEV2_BIN_PATH} -) - -nncc_find_resource(TensorFlowTests) - -# -# Copy [PREFIX]/test.pbtxt to PREFIX.pbtxt in binary folder -# Copy [PREFIX]/test.info to PREFIX.info in binary folder -# Encode PREFIX.pbtxt to PREFIX.pb -# -set(TEST_REPO "${TensorFlowTests_DIR}") -set(TEST_PBTXT_FILENAME "test.pbtxt") -set(TEST_INFO_FILENAME "test.info") - -unset(TESTCASES) - -macro(add NAME) - list(APPEND TESTCASES ${NAME}) -endmacro(add) - -# Read "test.lst" -include("test.lst") -# Read "test.local.lst" if exists -include("test.local.lst" OPTIONAL) - -unset(TEST_DEPS) -unset(TEST_NAMES) - -foreach(PREFIX IN ITEMS ${TESTCASES}) - if(NOT IS_DIRECTORY "${TEST_REPO}/${PREFIX}") - message(FATAL_ERROR "Missing '${PREFIX}' test") - endif() - - set(PBTXT_SOURCE_PATH "${TEST_REPO}/${PREFIX}/${TEST_PBTXT_FILENAME}") - set(INFO_SOURCE_PATH "${TEST_REPO}/${PREFIX}/${TEST_INFO_FILENAME}") - - set(PBTXT_FILE "${PREFIX}.pbtxt") - set(PBTXT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PBTXT_FILE}") - - set(INFO_FILE "${PREFIX}.info") - set(INFO_PATH "${CMAKE_CURRENT_BINARY_DIR}/${INFO_FILE}") - - set(PB_FILE "${PREFIX}.pb") - set(PB_PATH "${CMAKE_CURRENT_BINARY_DIR}/${PB_FILE}") - - # Copy .pbtxt - add_custom_command(OUTPUT ${PBTXT_PATH} - COMMAND ${CMAKE_COMMAND} -E copy "${PBTXT_SOURCE_PATH}" "${PBTXT_PATH}" - DEPENDS ${PBTXT_SOURCE_PATH} - COMMENT "Generate ${PBTXT_FILE}" - ) - - # Copy .info - add_custom_command(OUTPUT ${INFO_PATH} - COMMAND ${CMAKE_COMMAND} -E copy "${INFO_SOURCE_PATH}" "${INFO_PATH}" - DEPENDS ${INFO_SOURCE_PATH} - COMMENT "Generate ${INFO_FILE}" - ) - - # Generate .pb from .pbtxt - add_custom_command(OUTPUT ${PB_PATH} - COMMAND $ encode ${PBTXT_PATH} ${PB_PATH} - DEPENDS ${PBTXT_PATH} - COMMENT "Generate ${PB_FILE}" - ) - - list(APPEND TEST_DEPS ${INFO_PATH} ${PB_PATH}) - list(APPEND TEST_NAMES ${PREFIX}) -endforeach(PREFIX) - -## -## Copy testall -## -set(TEST_RUNNER "${CMAKE_CURRENT_BINARY_DIR}/testall.sh") -set(TEST_RUNNER_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/testall.sh") - -add_custom_command( - OUTPUT ${TEST_RUNNER} - COMMAND ${CMAKE_COMMAND} -E copy "${TEST_RUNNER_SOURCE}" "${TEST_RUNNER}" - DEPENDS ${TEST_RUNNER_SOURCE} - COMMENT "Generate test runner" -) - -list(APPEND TEST_DEPS "${TEST_RUNNER}") - -### -### Generate test.config -### -set(TEST_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/test.config") - -# Get tf2tfliteV2 binary path -get_target_property(TF2TFLITEV2_BIN_DIR tf2tfliteV2 BINARY_DIR) -set(TF2TFLITEV2_PATH "${TF2TFLITEV2_BIN_DIR}/tf2tfliteV2.py") - -add_custom_command( - OUTPUT ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E remove -f ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'NNKIT_RUN_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'TF_BACKEND_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'TFLITE_BACKEND_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'RANDOMIZE_ACTION_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'HDF5_EXPORT_ACTION_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'HDF5_IMPORT_ACTION_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'I5DIFF_PATH=\"$\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'TF2TFLITEV2_PATH=\"${TF2TFLITEV2_PATH}\"' >> ${TEST_CONFIG} - COMMAND ${CMAKE_COMMAND} -E echo 'VIRTUALENV=\"${VIRTUALENV}\"' >> ${TEST_CONFIG} - DEPENDS - i5diff - nnkit-run - nnkit_tf_backend - nnkit_tflite_backend - nnkit_randomize_action - nnkit_HDF5_export_action - nnkit_HDF5_import_action - tf2tfliteV2 - tf2tfliteV2_value_pbtxt_python_deps - COMMENT "Generate test configuration" -) - -list(APPEND TEST_DEPS "${TEST_CONFIG}") - -# This "tf2tfliteV2_value_pbtxt_test_deps" target enforces CMake to generate all the dependencies during "build" phase -add_custom_target(tf2tfliteV2_value_pbtxt_test_deps ALL DEPENDS ${TEST_DEPS}) - -# Run tests -add_test( - NAME tf2tfliteV2_value_pbtxt_test - COMMAND "${TEST_RUNNER}" - "${TEST_CONFIG}" - "${CMAKE_CURRENT_BINARY_DIR}" - ${TEST_NAMES} -) diff --git a/compiler/tf2tfliteV2-value-pbtxt-test/requirements.txt b/compiler/tf2tfliteV2-value-pbtxt-test/requirements.txt deleted file mode 100644 index 2eef5db..0000000 --- a/compiler/tf2tfliteV2-value-pbtxt-test/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -# TODO : Handling TF v2 -tensorflow==1.13.1 diff --git a/compiler/tf2tfliteV2-value-pbtxt-test/requires.cmake b/compiler/tf2tfliteV2-value-pbtxt-test/requires.cmake deleted file mode 100644 index a512361..0000000 --- a/compiler/tf2tfliteV2-value-pbtxt-test/requires.cmake +++ /dev/null @@ -1,4 +0,0 @@ -require("nnkit") -require("tfkit") -require("i5diff") -require("tf2tfliteV2") diff --git a/compiler/tf2tfliteV2-value-pbtxt-test/test.lst b/compiler/tf2tfliteV2-value-pbtxt-test/test.lst deleted file mode 100644 index 328366b..0000000 --- a/compiler/tf2tfliteV2-value-pbtxt-test/test.lst +++ /dev/null @@ -1,101 +0,0 @@ -# TODO Enable skipped tests - -add(NET_0000) -add(NET_0001) -add(NET_0002) -add(NET_0003) -add(NET_0004) -add(NET_0005) -add(NET_0006) -add(NET_0007) -add(NET_0008) -add(NET_0009) -add(NET_0010) -add(NET_0011) -add(NET_0012) -add(NET_0013) -add(NET_0014) -add(NET_0015) -add(NET_0016) -add(NET_0017) -add(NET_0018) -add(NET_0019) -add(NET_0020) -add(NET_0021) -add(NET_0022) -#add(NET_0023) -add(NET_0024) -add(NET_0025) -#add(NET_0028) -add(NET_0029) -add(NET_0030) -add(NET_0031) -add(NET_0032) -add(NET_0033) -add(NET_0034) -add(NET_0035) -add(NET_0036) -add(NET_0037) -add(NET_0038) -add(NET_0039) -add(NET_0040) -add(NET_0041) -add(REGRESSION_0000) -add(REGRESSION_0001) -add(REGRESSION_0002) -add(UNIT_Add_000) -add(UNIT_Add_001) -add(UNIT_Add_002) -add(UNIT_Add_004) -add(UNIT_Add_005) -add(UNIT_AvgPool_000) -add(UNIT_AvgPool_001) -#add(UNIT_BiasAdd_000) -#add(UNIT_BiasAdd_001) -add(UNIT_BiasAdd_002) -#add(UNIT_ConcatV2_000) -#add(UNIT_ConcatV2_001) -add(UNIT_ConcatV2_002) -#add(UNIT_Const_000) -#add(UNIT_Const_001) -add(UNIT_Conv2D_000) -add(UNIT_Conv2DBackpropInput_000) -add(UNIT_Conv2DBackpropInput_001) -add(UNIT_DepthwiseConv2dNative_000) -add(UNIT_DepthwiseConv2dNative_001) -add(UNIT_Maximum_000) -add(UNIT_Maximum_001) -add(UNIT_Maximum_002) -add(UNIT_MaxPool_000) -add(UNIT_MaxPool_001) -add(UNIT_Mean_000) -add(UNIT_Mean_001) -add(UNIT_Mean_002) -add(UNIT_Mean_003) -add(UNIT_Mul_000) -add(UNIT_Mul_001) -add(UNIT_Mul_002) -add(UNIT_Pad_000) -#add(UNIT_Placeholder_000) -#add(UNIT_Placeholder_001) -#add(UNIT_Placeholder_002) -#add(UNIT_Placeholder_003) -add(UNIT_RealDiv_000) -add(UNIT_RealDiv_001) -add(UNIT_Relu_000) -add(UNIT_Relu6_000) -add(UNIT_Reshape_000) -add(UNIT_Rsqrt_000) -add(UNIT_Softmax_001) -add(UNIT_Sqrt_000) -#add(UNIT_SquaredDifference_000) -#add(UNIT_SquaredDifference_001) -add(UNIT_Squeeze_000) -add(UNIT_Squeeze_001) -#add(UNIT_Squeeze_002) -#add(UNIT_Squeeze_003) -#add(UNIT_StopGradient_000) -#add(UNIT_StopGradient_001) -add(UNIT_Sub_000) -add(UNIT_Sub_001) -add(UNIT_Tanh_000) diff --git a/compiler/tf2tfliteV2-value-pbtxt-test/testall.sh b/compiler/tf2tfliteV2-value-pbtxt-test/testall.sh deleted file mode 100755 index 9dde41b..0000000 --- a/compiler/tf2tfliteV2-value-pbtxt-test/testall.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash - -# Need at least 2 arguments -if [[ $# -lt 2 ]]; then - echo "USAGE: $0 ..." - echo - echo "ARGUMENTS:" - echo " [test.config path]" - echo " [WORKDIR]" - echo " [Prefix1]" - echo " [Prefix2]" - echo " ..." - exit 255 -fi - -CONFIG_PATH="$1"; shift -WORKDIR="$1"; shift - -source "${CONFIG_PATH}" - -echo "-- Found nnkit-run: ${NNKIT_RUN_PATH}" -echo "-- Found TF backend: ${TF_BACKEND_PATH}" -echo "-- Found TFLITE backend: ${TFLITE_BACKEND_PATH}" -echo "-- Found TF2TFLITEV2: ${TF2TFLITEV2_PATH}" -echo "-- Found randomize action: ${RANDOMIZE_ACTION_PATH}" -echo "-- Found HDF5 export action: ${HDF5_EXPORT_ACTION_PATH}" -echo "-- Found HDF5 import action: ${HDF5_IMPORT_ACTION_PATH}" -echo "-- Found i5diff: ${I5DIFF_PATH}" -echo "-- Found workdir: ${WORKDIR}" - -TESTED=() -PASSED=() -FAILED=() - -pushd "${WORKDIR}" -while [[ $# -ne 0 ]]; do - PREFIX="$1"; shift - - TESTED+=("${PREFIX}") - - PASSED_TAG="${PREFIX}.passed" - - rm -f "${PASSED_TAG}" - - cat > "${PREFIX}.log" <( - exec 2>&1 - - echo "-- Found pb: ${PREFIX}.pb" - - # Exit immediately if any command fails - set -e - # Show commands - set -x - - # Generate tflite - source "${VIRTUALENV}/bin/activate" - "${VIRTUALENV}/bin/python" "${TF2TFLITEV2_PATH}" \ - --v1 \ - --input_path "${WORKDIR}/${PREFIX}.pb" \ - --input_arrays "$(awk -F, '/^input/ { print $2 }' ${PREFIX}.info | cut -d: -f1 | tr -d ' ' | paste -d, -s)" \ - --input_shapes "$(cat ${PREFIX}.info | grep '^input' | cut -d '[' -f2 | cut -d ']' -f1 | tr -d ' ' | xargs | tr ' ' ':')" \ - --output_path "${WORKDIR}/${PREFIX}.tflite" \ - --output_arrays "$(awk -F, '/^output/ { print $2 }' ${PREFIX}.info | cut -d: -f1 | tr -d ' ' | paste -d, -s)" - - # Run TensorFlow - "${NNKIT_RUN_PATH}" \ - --backend "${TF_BACKEND_PATH}" \ - --backend-arg "${WORKDIR}/${PREFIX}.pb" \ - --backend-arg "${WORKDIR}/${PREFIX}.info" \ - --pre "${RANDOMIZE_ACTION_PATH}" \ - --pre "${HDF5_EXPORT_ACTION_PATH}" \ - --pre-arg "${WORKDIR}/${PREFIX}.input.h5" \ - --post "${HDF5_EXPORT_ACTION_PATH}" \ - --post-arg "${WORKDIR}/${PREFIX}.expected.h5" - - # Run TensorFlow Lite - "${NNKIT_RUN_PATH}" \ - --backend "${TFLITE_BACKEND_PATH}" \ - --backend-arg "${WORKDIR}/${PREFIX}.tflite" \ - --pre "${HDF5_IMPORT_ACTION_PATH}" \ - --pre-arg "${WORKDIR}/${PREFIX}.input.h5" \ - --post "${HDF5_EXPORT_ACTION_PATH}" \ - --post-arg "${WORKDIR}/${PREFIX}.obtained.h5" - - "${I5DIFF_PATH}" -d 0.001 "${PREFIX}.expected.h5" "${PREFIX}.obtained.h5" - - if [[ $? -eq 0 ]]; then - touch "${PASSED_TAG}" - fi - ) - - if [[ -f "${PASSED_TAG}" ]]; then - PASSED+=("$PREFIX") - else - FAILED+=("$PREFIX") - fi -done -popd - -if [[ ${#TESTED[@]} -ne ${#PASSED[@]} ]]; then - echo "FAILED" - for TEST in "${FAILED[@]}" - do - echo "- ${TEST}" - done - exit 255 -fi - -echo "PASSED" -exit 0 diff --git a/compiler/tf2tfliteV2/CMakeLists.txt b/compiler/tf2tfliteV2/CMakeLists.txt index 8a5c2dc..5591ac4 100644 --- a/compiler/tf2tfliteV2/CMakeLists.txt +++ b/compiler/tf2tfliteV2/CMakeLists.txt @@ -9,3 +9,5 @@ add_custom_command(OUTPUT ${tf2tfliteV2_BIN} ) add_custom_target(tf2tfliteV2 ALL DEPENDS ${tf2tfliteV2_BIN}) + +install(FILES ${tf2tfliteV2_BIN} DESTINATION bin) diff --git a/compiler/tf2tfliteV2/README.md b/compiler/tf2tfliteV2/README.md index 836740a..13359aa 100644 --- a/compiler/tf2tfliteV2/README.md +++ b/compiler/tf2tfliteV2/README.md @@ -6,13 +6,19 @@ _tf2tfliteV2_ is a TensorFlow to TensorFlow Lite model Converter. Even though we alreay have _tf2tflite_, we cannot cover all opeartors in TensorFlow. To expand coverage, we introduce _tf2tfliteV2_ which uses `TensorFlow Lite Converter`(by Google) internally. ## Prerequisite -- Frozen graph from TensorFlow 1.13.1 +- Frozen graph from TensorFlow 1.13.1 in binary(`*.pb`) or text(`*.pbtxt`) format - Desired version of TensorFlow(You can use python virtualenv, docker, etc.) ## Example ``` python tf2tfliteV2.py \ > --v1 \ +> -i frozen_graph.pb -o converted.tflite +> -I model_inputs -O model_outputs +``` +``` +python tf2tfliteV2.py \ +> --v1 \ > --input_path=frozen_graph.pb \ > --output_path=converted.tflite \ > --input_arrays=model_inputs \ @@ -22,26 +28,34 @@ python tf2tfliteV2.py \ ``` python tf2tfliteV2.py \ > --v2 \ -> --input_path=frozen_graph.pb \ +> --input_path=frozen_graph.pbtxt \ > --output_path=converted.tflite \ > --input_arrays=model_inputs \ > --output_arrays=model_outputs ``` +``` +python tf2tfliteV2.py \ +> --v2 \ +> --input_path=multiple_output_graph.pb \ +> --output_path=converted.tflite \ +> --input_arrays=model_inputs \ +> --output_arrays=output,output:1,output:2 +``` ## optional argument ``` -h, --help show this help message and exit --v1 Use TensorFlow Lite Converter 1.x --v2 Use TensorFlow Lite Converter 2.x - --input_path INPUT_PATH + -i INPUT_PATH, --input_path INPUT_PATH Full filepath of the input file. - --output_path OUTPUT_PATH + -o OUTPUT_PATH, --output_path OUTPUT_PATH Full filepath of the output file. - --input_arrays INPUT_ARRAYS + -I INPUT_ARRAYS, --input_arrays INPUT_ARRAYS Names of the input arrays, comma-separated. - --input_shapes INPUT_SHAPES + -s INPUT_SHAPES, --input_shapes INPUT_SHAPES Shapes corresponding to --input_arrays, colon- separated. - --output_arrays OUTPUT_ARRAYS + -O OUTPUT_ARRAYS, --output_arrays OUTPUT_ARRAYS Names of the output arrays, comma-separated. ``` diff --git a/compiler/tf2tfliteV2/tf2tfliteV2.py b/compiler/tf2tfliteV2/tf2tfliteV2.py index 8b6ba0d..82d6ee2 100755 --- a/compiler/tf2tfliteV2/tf2tfliteV2.py +++ b/compiler/tf2tfliteV2/tf2tfliteV2.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + # Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved # Copyright (C) 2018 The TensorFlow Authors # @@ -48,8 +50,13 @@ def _get_parser(): # Input and output path. parser.add_argument( - "--input_path", type=str, help="Full filepath of the input file.", required=True) + "-i", + "--input_path", + type=str, + help="Full filepath of the input file.", + required=True) parser.add_argument( + "-o", "--output_path", type=str, help="Full filepath of the output file.", @@ -57,15 +64,20 @@ def _get_parser(): # Input and output arrays. parser.add_argument( + "-I", "--input_arrays", type=str, help="Names of the input arrays, comma-separated.", required=True) parser.add_argument( + "-s", "--input_shapes", type=str, - help="Shapes corresponding to --input_arrays, colon-separated.") + help= + "Shapes corresponding to --input_arrays, colon-separated.(ex:\"1,4,4,3:1,20,20,3\")" + ) parser.add_argument( + "-O", "--output_arrays", type=str, help="Names of the output arrays, comma-separated.", @@ -141,9 +153,14 @@ def _v2_convert(flags): wrap_func = wrap_frozen_graph( graph_def, - inputs=[_str + ":0" for _str in _parse_array(flags.input_arrays)], - # TODO What if multiple outputs come in? - outputs=[_str + ":0" for _str in _parse_array(flags.output_arrays)]) + inputs=[ + _str + ":0" if len(_str.split(":")) == 1 else _str + for _str in _parse_array(flags.input_arrays) + ], + outputs=[ + _str + ":0" if len(_str.split(":")) == 1 else _str + for _str in _parse_array(flags.output_arrays) + ]) converter = tf.lite.TFLiteConverter.from_concrete_functions([wrap_func]) converter.allow_custom_ops = True diff --git a/compiler/tfinfo-v2/README.md b/compiler/tfinfo-v2/README.md new file mode 100644 index 0000000..72fbdb0 --- /dev/null +++ b/compiler/tfinfo-v2/README.md @@ -0,0 +1 @@ +# tfinfo-v2 diff --git a/compiler/tfkit/src/PackCommand.cpp b/compiler/tfkit/src/PackCommand.cpp index 36bf5a7..a1c4a6f 100644 --- a/compiler/tfkit/src/PackCommand.cpp +++ b/compiler/tfkit/src/PackCommand.cpp @@ -51,21 +51,18 @@ template <> void pack(tensorflow::TensorProto *input_tensor) } else if (input_tensor->float_val().size() == input_flat_size) { - // clang-format off - // TODO fix indentation - input_tensor->clear_tensor_content(); + input_tensor->clear_tensor_content(); - std::vector tensor_content; - for (int i = 0; i < input_flat_size; ++i) - { - tensor_content.push_back(input_tensor->float_val(i)); - } + std::vector tensor_content; + for (int i = 0; i < input_flat_size; ++i) + { + tensor_content.push_back(input_tensor->float_val(i)); + } - input_tensor->set_tensor_content(std::string( - reinterpret_cast(tensor_content.data()), sizeof(float) * input_flat_size)); + input_tensor->set_tensor_content(std::string( + reinterpret_cast(tensor_content.data()), sizeof(float) * input_flat_size)); - input_tensor->clear_float_val(); - // clang-format on + input_tensor->clear_float_val(); } else { diff --git a/compiler/tfkit/src/UnpackCommand.cpp b/compiler/tfkit/src/UnpackCommand.cpp index 77ec1ed..a6711f1 100644 --- a/compiler/tfkit/src/UnpackCommand.cpp +++ b/compiler/tfkit/src/UnpackCommand.cpp @@ -49,18 +49,15 @@ template <> void unpack(tensorflow::TensorProto *input_tensor) } else if (input_tensor->tensor_content().size() == input_flat_size * sizeof(float)) { - // clang-format off - // TODO fix indentation - input_tensor->clear_float_val(); + input_tensor->clear_float_val(); - const float *tensor_content = - reinterpret_cast(input_tensor->tensor_content().data()); - for (int i = 0; i < input_flat_size; i++) - { - input_tensor->add_float_val(tensor_content[i]); - } - input_tensor->clear_tensor_content(); - // clang-format on + const float *tensor_content = + reinterpret_cast(input_tensor->tensor_content().data()); + for (int i = 0; i < input_flat_size; i++) + { + input_tensor->add_float_val(tensor_content[i]); + } + input_tensor->clear_tensor_content(); } else { @@ -139,6 +136,41 @@ template <> void unpack(tensorflow::TensorProto *input_tensor) } } +template <> void unpack(tensorflow::TensorProto *input_tensor) +{ + const auto &input_shape = input_tensor->tensor_shape(); + assert(input_shape.dim_size() <= 6); + int input_flat_size = tfkit::tf::GetElementCount(input_shape); + + // Adjust where shape is not set but actual value exist + if (input_tensor->tensor_content().size() > 0 && input_flat_size == -1) + { + input_flat_size = input_tensor->tensor_content().size() / sizeof(bool); + } + + if (input_tensor->tensor_content().size() == 0) + { + // Do nothing as there is no tensor content to unpack + } + else if (input_tensor->tensor_content().size() == input_flat_size * sizeof(bool)) + { + input_tensor->clear_bool_val(); + + const bool *tensor_content = + reinterpret_cast(input_tensor->tensor_content().data()); + for (int i = 0; i < input_flat_size; i++) + { + input_tensor->add_bool_val(tensor_content[i]); + } + input_tensor->clear_tensor_content(); + } + else + { + throw std::runtime_error{"Number of elements mismatch in unpack."}; + // TODO: support for these + } +} + void unpack(tensorflow::GraphDef &graph_def) { auto nodes = graph_def.mutable_node(); @@ -162,6 +194,9 @@ void unpack(tensorflow::GraphDef &graph_def) case tensorflow::DT_INT8: unpack(tensor); break; + case tensorflow::DT_BOOL: + unpack(tensor); + break; default: throw std::runtime_error{"Unsupported dtype"}; } diff --git a/compiler/tfl-inspect/CMakeLists.txt b/compiler/tfl-inspect/CMakeLists.txt index c2c7dfe..ba01986 100644 --- a/compiler/tfl-inspect/CMakeLists.txt +++ b/compiler/tfl-inspect/CMakeLists.txt @@ -8,6 +8,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(tfl-inspect ${DRIVER} ${SOURCES}) target_include_directories(tfl-inspect PRIVATE src) +target_link_libraries(tfl-inspect arser) +target_link_libraries(tfl-inspect foder) target_link_libraries(tfl-inspect mio_tflite) target_link_libraries(tfl-inspect safemain) -target_link_libraries(tfl-inspect stdex) diff --git a/compiler/tfl-inspect/driver/Driver.cpp b/compiler/tfl-inspect/driver/Driver.cpp index 5cad63c..a480011 100644 --- a/compiler/tfl-inspect/driver/Driver.cpp +++ b/compiler/tfl-inspect/driver/Driver.cpp @@ -14,74 +14,63 @@ * limitations under the License. */ -#include "Model.h" #include "Dump.h" -#include +#include +#include #include #include #include +#include #include #include -using OptionHook = std::function(void)>; - int entry(int argc, char **argv) { - if (argc < 3) + arser::Arser arser{"tfl-inspect allows users to retrieve various information from a TensorFlow " + "Lite model files"}; + arser.add_argument("--operators").nargs(0).help("Dump operators in tflite file"); + arser.add_argument("--conv2d_weight") + .nargs(0) + .help("Dump Conv2D series weight operators in tflite file"); + arser.add_argument("--op_version").nargs(0).help("Dump versions of the operators in tflite file"); + arser.add_argument("tflite").type(arser::DataType::STR).help("TFLite file to inspect"); + + try + { + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [options] [tflite]" << std::endl; - std::cerr << " --operators : dump operators in tflite file" << std::endl; - std::cerr << " --conv2d_weight : dump Conv2D series weight operators in tflite file" - << std::endl; + std::cout << err.what() << std::endl; + std::cout << arser; return 255; } - // Simple argument parser (based on map) - std::map argparse; - - argparse["--operators"] = [&](void) { - // dump all operators - return std::move(stdex::make_unique()); - }; - - argparse["--conv2d_weight"] = [&](void) { - // dump Conv2D, DepthwiseConv2D weight operators - return std::move(stdex::make_unique()); - }; + if (!arser["--operators"] && !arser["--conv2d_weight"] && !arser["--op_version"]) + { + std::cout << "At least one option must be specified" << std::endl; + std::cout << arser; + return 255; + } std::vector> dumps; - for (int n = 1; n < argc - 1; ++n) - { - const std::string tag{argv[n]}; - - auto it = argparse.find(tag); - if (it == argparse.end()) - { - std::cerr << "Option '" << tag << "' is not supported" << std::endl; - return 255; - } - auto dump = it->second(); - assert(dump != nullptr); - dumps.push_back(std::move(dump)); - } + if (arser["--operators"]) + dumps.push_back(std::make_unique()); + if (arser["--conv2d_weight"]) + dumps.push_back(std::make_unique()); + if (arser["--op_version"]) + dumps.push_back(std::make_unique()); - std::string model_file = argv[argc - 1]; + std::string model_file = arser.get("tflite"); // Load TF lite model from a tflite file - auto model = tflinspect::load_tflite(model_file); - if (model == nullptr) - { - std::cerr << "ERROR: Failed to load tflite '" << model_file << "'" << std::endl; - return 255; - } - - const tflite::Model *tflmodel = model->model(); - if (tflmodel == nullptr) + foder::FileLoader fileLoader{model_file}; + std::vector modelData = fileLoader.load(); + const tflite::Model *tfliteModel = tflite::GetModel(modelData.data()); + if (tfliteModel == nullptr) { std::cerr << "ERROR: Failed to load tflite '" << model_file << "'" << std::endl; return 255; @@ -89,7 +78,7 @@ int entry(int argc, char **argv) for (auto &dump : dumps) { - dump->run(std::cout, tflmodel); + dump->run(std::cout, tfliteModel); } return 0; diff --git a/compiler/tfl-inspect/requires.cmake b/compiler/tfl-inspect/requires.cmake index 2aa101e..25857ad 100644 --- a/compiler/tfl-inspect/requires.cmake +++ b/compiler/tfl-inspect/requires.cmake @@ -1,3 +1,4 @@ +require("arser") +require("foder") require("mio-tflite") require("safemain") -require("stdex") diff --git a/compiler/tfl-inspect/src/Dump.cpp b/compiler/tfl-inspect/src/Dump.cpp index 8d879a8..78e7700 100644 --- a/compiler/tfl-inspect/src/Dump.cpp +++ b/compiler/tfl-inspect/src/Dump.cpp @@ -28,19 +28,22 @@ void DumpOperators::run(std::ostream &os, const tflite::Model *model) { tflinspect::Reader reader(model); - assert(reader.num_subgraph() == 1); - reader.select_subgraph(0); + const uint32_t subgraph_size = reader.num_subgraph(); - auto ops = reader.operators(); - - // dump operators - for (uint32_t i = 0; i < ops->Length(); ++i) + for (uint32_t g = 0; g < subgraph_size; g++) { - const auto op = ops->Get(i); + reader.select_subgraph(g); + auto ops = reader.operators(); - auto op_name = reader.opcode_name(op); + // dump operators + for (uint32_t i = 0; i < ops->Length(); ++i) + { + const auto op = ops->Get(i); - os << op_name << std::endl; + auto op_name = reader.opcode_name(op); + + os << op_name << std::endl; + } } } @@ -94,44 +97,85 @@ void DumpConv2DWeight::run(std::ostream &os, const tflite::Model *model) { tflinspect::Reader reader(model); - assert(reader.num_subgraph() == 1); - reader.select_subgraph(0); - - auto ops = reader.operators(); + const uint32_t subgraph_size = reader.num_subgraph(); - // dump Conv2D, DepthwiseConv2D and its weight input operator - for (uint32_t i = 0; i < ops->Length(); ++i) + for (uint32_t g = 0; g < subgraph_size; g++) { - const auto op = ops->Get(i); - auto bc = reader.builtin_code(op); + reader.select_subgraph(g); + auto ops = reader.operators(); - if (bc == tflite::BuiltinOperator_CONV_2D || bc == tflite::BuiltinOperator_DEPTHWISE_CONV_2D) + // dump Conv2D, DepthwiseConv2D and its weight input operator + for (uint32_t i = 0; i < ops->Length(); ++i) { - const std::vector &inputs = tflinspect::as_index_vector(op->inputs()); - if (inputs.size() < 2) + const auto op = ops->Get(i); + auto bc = reader.builtin_code(op); + + if (bc == tflite::BuiltinOperator_CONV_2D || bc == tflite::BuiltinOperator_DEPTHWISE_CONV_2D) { - throw std::runtime_error("Operator has invalid input"); + const std::vector &inputs = tflinspect::as_index_vector(op->inputs()); + if (inputs.size() < 2) + { + throw std::runtime_error("Operator has invalid input"); + } + auto weight_input = inputs[1]; // Tensor ID of weight input + + const auto op_weight = operator_match_output(reader, weight_input); + const auto buffer_size = tensor_buffer_size(reader, weight_input); + + std::string weight_op_name = "?"; + + if (op_weight == nullptr && buffer_size > 0) + { + weight_op_name = "CONST"; + } + else if (op_weight != nullptr) + { + weight_op_name = reader.opcode_name(op_weight); + } + + auto op_name = reader.opcode_name(op); + os << op_name << "," << weight_op_name << std::endl; } - auto weight_input = inputs[1]; // Tensor ID of weight input + } + } +} - const auto op_weight = operator_match_output(reader, weight_input); - const auto buffer_size = tensor_buffer_size(reader, weight_input); +} // namespace tflinspect - std::string weight_op_name = "?"; +namespace tflinspect +{ - if (op_weight == nullptr && buffer_size > 0) - { - weight_op_name = "CONST"; - } - else if (op_weight != nullptr) - { - weight_op_name = reader.opcode_name(op_weight); - } +void DumpOperatorVersion::run(std::ostream &os, const tflite::Model *model) +{ + std::map op_version_map; + + tflinspect::Reader reader(model); + + const uint32_t subgraph_size = reader.num_subgraph(); + + for (uint32_t g = 0; g < subgraph_size; g++) + { + reader.select_subgraph(g); + auto ops = reader.operators(); + + // dump Conv2D, DepthwiseConv2D and its weight input operator + for (uint32_t i = 0; i < ops->Length(); ++i) + { + const auto op = ops->Get(i); auto op_name = reader.opcode_name(op); - os << op_name << "," << weight_op_name << std::endl; + auto op_version = reader.opcodes().at(op->opcode_index())->version(); + + if (op_version_map.find(op_name) == op_version_map.end() || + op_version_map[op_name] < op_version) + op_version_map[op_name] = op_version; } } + + for (auto op : op_version_map) + { + os << op.first << "," << op.second << std::endl; + } } } // namespace tflinspect diff --git a/compiler/tfl-inspect/src/Dump.h b/compiler/tfl-inspect/src/Dump.h index 798c1db..83397a2 100644 --- a/compiler/tfl-inspect/src/Dump.h +++ b/compiler/tfl-inspect/src/Dump.h @@ -51,6 +51,15 @@ public: void run(std::ostream &os, const tflite::Model *model); }; +class DumpOperatorVersion final : public DumpInterface +{ +public: + DumpOperatorVersion() = default; + +public: + void run(std::ostream &os, const tflite::Model *model); +}; + } // namespace tflinspect #endif // __DUMP_H__ diff --git a/compiler/tfl-inspect/src/Model.cpp b/compiler/tfl-inspect/src/Model.cpp deleted file mode 100644 index 8c3bf37..0000000 --- a/compiler/tfl-inspect/src/Model.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Model.h" - -#include -#include -#include -#include - -namespace -{ - -class MemoryMappedModel final : public tflinspect::Model -{ -public: - /** - * @require fd and data SHOULD be valid - */ - explicit MemoryMappedModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} - { - // DO NOTHING - } - -public: - ~MemoryMappedModel() - { - munmap(_data, _size); - close(_fd); - } - -public: - MemoryMappedModel(const MemoryMappedModel &) = delete; - MemoryMappedModel(MemoryMappedModel &&) = delete; - -public: - const ::tflite::Model *model(void) const override { return ::tflite::GetModel(_data); } - -private: - int _fd = -1; - void *_data = nullptr; - size_t _size = 0; -}; - -class FileDescriptor final -{ -public: - FileDescriptor(int value) : _value{value} - { - // DO NOTHING - } - -public: - // NOTE Copy is not allowed - FileDescriptor(const FileDescriptor &) = delete; - -public: - // NOTE Move is allowed - FileDescriptor(FileDescriptor &&fd) { _value = fd.release(); } - -public: - ~FileDescriptor() - { - if (_value != -1) - { - // Close on descturction - close(_value); - } - } - -public: - int value(void) const { return _value; } - -public: - int release(void) - { - auto res = _value; - _value = -1; - return res; - } - -private: - int _value = -1; -}; - -} // namespace - -namespace tflinspect -{ - -std::unique_ptr load_tflite(const std::string &path) -{ - FileDescriptor fd = open(path.c_str(), O_RDONLY); - - if (fd.value() == -1) - { - // Return nullptr on open failure - return nullptr; - } - - struct stat st; - if (fstat(fd.value(), &st) == -1) - { - // Return nullptr on fstat failure - return nullptr; - } - - auto size = st.st_size; - auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fd.value(), 0); - - if (data == MAP_FAILED) - { - // Return nullptr on mmap failure - return nullptr; - } - - // Check if file is a valid Flatbuffer file - const uint8_t *u8data = reinterpret_cast(data); - flatbuffers::Verifier verifier{u8data, static_cast(size)}; - if (!tflite::VerifyModelBuffer(verifier)) - { - munmap(data, size); - close(fd.release()); - return nullptr; - } - - return std::unique_ptr{new MemoryMappedModel(fd.release(), data, size)}; -} - -} // namespace tflinspect diff --git a/compiler/tfl-inspect/src/Model.h b/compiler/tfl-inspect/src/Model.h deleted file mode 100644 index a69fb8b..0000000 --- a/compiler/tfl-inspect/src/Model.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MODEL_H__ -#define __MODEL_H__ - -#include - -#include - -namespace tflinspect -{ - -struct Model -{ - virtual ~Model() = default; - - virtual const ::tflite::Model *model(void) const = 0; -}; - -/** - * @brief Load TensorFlow Lite model (as a raw Model) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_tflite(const std::string &path); - -} // namespace tflinspeat - -#endif // __MODEL_H__ diff --git a/compiler/tfl-inspect/src/Reader.cpp b/compiler/tfl-inspect/src/Reader.cpp index 7bd2fe2..5be2894 100644 --- a/compiler/tfl-inspect/src/Reader.cpp +++ b/compiler/tfl-inspect/src/Reader.cpp @@ -50,7 +50,10 @@ std::string opcode_name(const tflite::OperatorCode *opcode) if (!opcode->custom_code()) return "(invalid custom)"; - return opcode->custom_code()->c_str(); + std::string custom_op = "CUSTOM("; + custom_op += opcode->custom_code()->c_str(); + custom_op += ")"; + return custom_op; } tflite::BuiltinOperator code = opcode->builtin_code(); diff --git a/compiler/tfl-verify/CMakeLists.txt b/compiler/tfl-verify/CMakeLists.txt index a368b29..d33059f 100644 --- a/compiler/tfl-verify/CMakeLists.txt +++ b/compiler/tfl-verify/CMakeLists.txt @@ -6,7 +6,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(tfl-verify ${SOURCES}) target_include_directories(tfl-verify PRIVATE src) +target_link_libraries(tfl-verify foder) target_link_libraries(tfl-verify mio_tflite) target_link_libraries(tfl-verify safemain) target_link_libraries(tfl-verify cwrap) -target_link_libraries(tfl-verify stdex) diff --git a/compiler/tfl-verify/requires.cmake b/compiler/tfl-verify/requires.cmake index e479a83..ed6b84d 100644 --- a/compiler/tfl-verify/requires.cmake +++ b/compiler/tfl-verify/requires.cmake @@ -1,4 +1,4 @@ +require("foder") require("mio-tflite") require("safemain") require("cwrap") -require("stdex") diff --git a/compiler/tfl-verify/src/Driver.cpp b/compiler/tfl-verify/src/Driver.cpp index 367c731..81f6d54 100644 --- a/compiler/tfl-verify/src/Driver.cpp +++ b/compiler/tfl-verify/src/Driver.cpp @@ -16,9 +16,8 @@ #include "VerifyFlatBuffers.h" -#include - #include +#include #include int entry(int argc, char **argv) @@ -30,7 +29,7 @@ int entry(int argc, char **argv) std::cerr << "USAGE: " << argv[0] << " [tflite]" << std::endl; return 255; } - auto verifier = stdex::make_unique(); + auto verifier = std::make_unique(); std::string model_file = argv[argc - 1]; diff --git a/compiler/tfl-verify/src/Model.cpp b/compiler/tfl-verify/src/Model.cpp deleted file mode 100644 index efac121..0000000 --- a/compiler/tfl-verify/src/Model.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Model.h" - -#include - -#include -#include -#include -#include - -namespace -{ - -class MemoryMappedModel final : public ModelData -{ -public: - /** - * @require fd and data SHOULD be valid - */ - explicit MemoryMappedModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} - { - // DO NOTHING - } - -public: - ~MemoryMappedModel() - { - munmap(_data, _size); - close(_fd); - } - -public: - MemoryMappedModel(const MemoryMappedModel &) = delete; - MemoryMappedModel(MemoryMappedModel &&) = delete; - -public: - const void *data(void) const override { return _data; }; - const size_t size(void) const override { return _size; }; - -private: - int _fd = -1; - void *_data = nullptr; - size_t _size = 0; -}; - -} // namespace - -std::unique_ptr load_modeldata(const std::string &path) -{ - cwrap::Fildes fd(open(path.c_str(), O_RDONLY)); - - if (fd.get() == -1) - { - // Return nullptr on open failure - return nullptr; - } - - struct stat st; - if (fstat(fd.get(), &st) == -1) - { - // Return nullptr on fstat failure - return nullptr; - } - - auto size = st.st_size; - auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fd.get(), 0); - - if (data == MAP_FAILED) - { - // Return nullptr on mmap failure - return nullptr; - } - - return std::unique_ptr{new MemoryMappedModel(fd.release(), data, size)}; -} diff --git a/compiler/tfl-verify/src/Model.h b/compiler/tfl-verify/src/Model.h deleted file mode 100644 index 44f40e2..0000000 --- a/compiler/tfl-verify/src/Model.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __MODEL_H__ -#define __MODEL_H__ - -#include -#include - -struct ModelData -{ - virtual ~ModelData() = default; - - virtual const void *data(void) const = 0; - virtual const size_t size(void) const = 0; -}; - -/** - * @brief Load TF Lite model (as a raw data) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_modeldata(const std::string &path); - -#endif // __MODEL_H__ diff --git a/compiler/tfl-verify/src/VerifyFlatBuffers.cpp b/compiler/tfl-verify/src/VerifyFlatBuffers.cpp index 253fcb2..7fb48a7 100644 --- a/compiler/tfl-verify/src/VerifyFlatBuffers.cpp +++ b/compiler/tfl-verify/src/VerifyFlatBuffers.cpp @@ -16,16 +16,16 @@ #include "VerifyFlatBuffers.h" -#include "Model.h" - +#include #include int VerifyFlatbuffers::run(const std::string &model_file) { - auto modeldata = load_modeldata(model_file); + foder::FileLoader fileLoader{model_file}; + std::vector modeldata = fileLoader.load(); - const uint8_t *data = reinterpret_cast(modeldata->data()); - flatbuffers::Verifier verifier{data, modeldata->size()}; + const uint8_t *data = reinterpret_cast(modeldata.data()); + flatbuffers::Verifier verifier{data, modeldata.size()}; if (!tflite::VerifyModelBuffer(verifier)) { diff --git a/compiler/tflchef/CMakeLists.txt b/compiler/tflchef/CMakeLists.txt index 71c5e2a..ebc8733 100644 --- a/compiler/tflchef/CMakeLists.txt +++ b/compiler/tflchef/CMakeLists.txt @@ -1,15 +1,19 @@ nnas_find_package(Protobuf QUIET) if(NOT Protobuf_FOUND) + message(STATUS "Build tflchef: FAILED (missing Protobuf)") return() endif(NOT Protobuf_FOUND) if(NOT TARGET mio_tflite) + message(STATUS "Build tflchef: FAILED (missing mio_tflite)") return() endif(NOT TARGET mio_tflite) # Recipe Parser add_subdirectory(proto) +# Log +add_subdirectory(log) # Core Library add_subdirectory(core) # TFlite Library diff --git a/compiler/tflchef/core/CMakeLists.txt b/compiler/tflchef/core/CMakeLists.txt index 6a62820..43f6b8b 100644 --- a/compiler/tflchef/core/CMakeLists.txt +++ b/compiler/tflchef/core/CMakeLists.txt @@ -4,4 +4,6 @@ add_library(tflchef_core STATIC ${SOURCES}) target_include_directories(tflchef_core PUBLIC include) target_include_directories(tflchef_core PRIVATE src) target_link_libraries(tflchef_core tflchef_proto) +target_link_libraries(tflchef_core tflchef_log) target_link_libraries(tflchef_core mio_tflite) +target_link_libraries(tflchef_core souschef) diff --git a/compiler/tflchef/core/src/Arguments.h b/compiler/tflchef/core/src/Arguments.h deleted file mode 100644 index 341aea6..0000000 --- a/compiler/tflchef/core/src/Arguments.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __ARGUMENTS_H__ -#define __ARGUMENTS_H__ - -#include -#include - -/** - * @brief Read-only string sequence view - */ -struct Arguments -{ - virtual ~Arguments() = default; - - virtual uint32_t count(void) const = 0; - virtual const std::string &value(uint32_t n) const = 0; -}; - -#endif // __ARGUMENTS_H__ diff --git a/compiler/tflchef/core/src/Convert.cpp b/compiler/tflchef/core/src/Convert.cpp index 86a31d9..dc8e31d 100644 --- a/compiler/tflchef/core/src/Convert.cpp +++ b/compiler/tflchef/core/src/Convert.cpp @@ -41,6 +41,8 @@ tflite::ActivationFunctionType as_tflite_activation(const tflchef::Activation &v return tflite::ActivationFunctionType_NONE; case tflchef::RELU: return tflite::ActivationFunctionType_RELU; + case tflchef::RELU_N1_TO_1: + return tflite::ActivationFunctionType_RELU_N1_TO_1; case tflchef::RELU6: return tflite::ActivationFunctionType_RELU6; default: @@ -70,3 +72,18 @@ tflite::TensorType as_tflite_tensortype(const tflchef::TensorType &value) throw std::runtime_error{"Unknown tensor type"}; } + +tflite::MirrorPadMode as_tflite_mirrorpadmode(const tflchef::MirrorPadMode &value) +{ + switch (value) + { + case tflchef::REFLECT: + return tflite::MirrorPadMode_REFLECT; + case tflchef::SYMMETRIC: + return tflite::MirrorPadMode_SYMMETRIC; + default: + break; + } + + throw std::runtime_error{"Unknown mirrorpad mode"}; +} diff --git a/compiler/tflchef/core/src/Convert.h b/compiler/tflchef/core/src/Convert.h index ed15a55..b56e6ef 100644 --- a/compiler/tflchef/core/src/Convert.h +++ b/compiler/tflchef/core/src/Convert.h @@ -27,5 +27,6 @@ tflite::Padding as_tflite_padding(const tflchef::Padding &value); tflite::ActivationFunctionType as_tflite_activation(const tflchef::Activation &value); tflite::TensorType as_tflite_tensortype(const tflchef::TensorType &value); +tflite::MirrorPadMode as_tflite_mirrorpadmode(const tflchef::MirrorPadMode &value); #endif // __CONVERT_H__ diff --git a/compiler/tflchef/core/src/CustomOp/AddV2.cpp b/compiler/tflchef/core/src/CustomOp/AddV2.cpp new file mode 100644 index 0000000..dffd336 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/AddV2.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AddV2.h" + +#include "flatbuffers/flexbuffers.h" + +flatbuffers::Offset AddV2Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +flatbuffers::Offset> +AddV2Chef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.type() == "AddV2"); + + /** + * REGISTER_OP("AddV2") + .Input("x: T") + .Input("y: T") + .Output("z: T") + .Attr( + "T: {bfloat16, half, float, double, uint8, int8, int16, int32, int64, " + "complex64, complex128}") + .SetShapeFn(shape_inference::BroadcastBinaryOpShapeFn) + .SetIsAggregate() + .SetIsCommutative(); + */ + + auto flex_buffers = std::make_unique(); + size_t map_start = flex_buffers->StartMap(); + + // TODO Support more data types + flex_buffers->Int("T", tflite::TensorType_FLOAT32); + + flex_buffers->EndMap(map_start); + flex_buffers->Finish(); + + auto circle_custom_options = fbb.CreateVector(flex_buffers->GetBuffer()); + return circle_custom_options; +} + +std::unique_ptr AddV2ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new AddV2Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/CustomOp/AddV2.h b/compiler/tflchef/core/src/CustomOp/AddV2.h new file mode 100644 index 0000000..dbbaf5a --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/AddV2.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ADDV2_H__ +#define __OP_ADDV2_H__ + +#include "OpChef.h" + +class AddV2Chef final : public OpChef +{ +public: + explicit AddV2Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CUSTOM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + + flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct AddV2ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ADDV2_H__ diff --git a/compiler/tflchef/core/src/CustomOp/All.cpp b/compiler/tflchef/core/src/CustomOp/All.cpp new file mode 100644 index 0000000..b3ae821 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/All.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "All.h" + +#include "flatbuffers/flexbuffers.h" + +flatbuffers::Offset AllChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +flatbuffers::Offset> +AllChef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.type() == "All"); + + /** + * REGISTER_OP("All") + .Input("input: bool") + .Input("reduction_indices: Tidx") + .Output("output: bool") + .Attr("keep_dims: bool = false") + .Attr("Tidx: {int32, int64} = DT_INT32") + .SetShapeFn(shape_inference::ReductionShape); + */ + + auto flex_buffers = std::make_unique(); + size_t map_start = flex_buffers->StartMap(); + + // TODO Support more data types + flex_buffers->Int("Tidx", tflite::TensorType_INT32); + flex_buffers->Bool("keep_dims", operation.all_options().keep_dims()); + + flex_buffers->EndMap(map_start); + flex_buffers->Finish(); + + auto circle_custom_options = fbb.CreateVector(flex_buffers->GetBuffer()); + return circle_custom_options; +} + +std::unique_ptr AllChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new AllChef{operation}}; +} diff --git a/compiler/tflchef/core/src/CustomOp/All.h b/compiler/tflchef/core/src/CustomOp/All.h new file mode 100644 index 0000000..f7949f3 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/All.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ALL_H__ +#define __OP_ALL_H__ + +#include "OpChef.h" + +class AllChef final : public OpChef +{ +public: + explicit AllChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CUSTOM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + + flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct AllChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ALL_H__ diff --git a/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.cpp b/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.cpp new file mode 100644 index 0000000..595f3b9 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMulV2.h" + +#include "flatbuffers/flexbuffers.h" + +flatbuffers::Offset BatchMatMulV2Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +flatbuffers::Offset> +BatchMatMulV2Chef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.type() == "BatchMatMulV2"); + + /** + * REGISTER_OP("BatchMatMulV2") + .Input("x: T") + .Input("y: T") + .Output("output: T") + .Attr( + "T: {bfloat16, half, float, double, int32, int64, complex64, " + "complex128}") + .Attr("adj_x: bool = false") + .Attr("adj_y: bool = false") + .SetShapeFn(shape_inference::BatchMatMulV2Shape); + */ + + auto flex_buffers = std::make_unique(); + size_t map_start = flex_buffers->StartMap(); + + flex_buffers->Bool("adj_x", operation.batch_matmul_options().adj_x()); + flex_buffers->Bool("adj_y", operation.batch_matmul_options().adj_y()); + // TODO Support more data types + flex_buffers->Int("T", tflite::TensorType_FLOAT32); + + flex_buffers->EndMap(map_start); + flex_buffers->Finish(); + + auto circle_custom_options = fbb.CreateVector(flex_buffers->GetBuffer()); + return circle_custom_options; +} + +std::unique_ptr BatchMatMulV2ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new BatchMatMulV2Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.h b/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.h new file mode 100644 index 0000000..d20f4d2 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/BatchMatMulV2.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_BATCH_MATMUL_V2_H__ +#define __OP_BATCH_MATMUL_V2_H__ + +#include "OpChef.h" + +class BatchMatMulV2Chef final : public OpChef +{ +public: + explicit BatchMatMulV2Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CUSTOM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + + flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct BatchMatMulV2ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_BATCH_MATMUL_V2_H__ diff --git a/compiler/tflchef/core/src/CustomOp/MatMul.cpp b/compiler/tflchef/core/src/CustomOp/MatMul.cpp new file mode 100644 index 0000000..ba34aa8 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/MatMul.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatMul.h" + +#include "flatbuffers/flexbuffers.h" + +flatbuffers::Offset MatMulChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +flatbuffers::Offset> +MatMulChef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.type() == "MatMul"); + + /** + * REGISTER_OP("MatMul") + .Input("a: T") + .Input("b: T") + .Output("product: T") + .Attr("transpose_a: bool = false") + .Attr("transpose_b: bool = false") + .Attr("T: {half, float, double, int32, complex64, complex128}") + .SetShapeFn(shape_inference::MatMulShape) + */ + + auto flex_buffers = std::make_unique(); + size_t map_start = flex_buffers->StartMap(); + + flex_buffers->Bool("transpose_a", operation.matmul_options().transpose_a()); + flex_buffers->Bool("transpose_b", operation.matmul_options().transpose_b()); + // TODO how do we support other types? + flex_buffers->Int("T", tflite::TensorType_FLOAT32); + + flex_buffers->EndMap(map_start); + flex_buffers->Finish(); + + auto circle_custom_options = fbb.CreateVector(flex_buffers->GetBuffer()); + return circle_custom_options; +} + +std::unique_ptr MatMulChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MatMulChef{operation}}; +} diff --git a/compiler/tflchef/core/src/CustomOp/MatMul.h b/compiler/tflchef/core/src/CustomOp/MatMul.h new file mode 100644 index 0000000..b0307f9 --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/MatMul.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MATMUL_H__ +#define __OP_MATMUL_H__ + +#include "OpChef.h" + +class MatMulChef final : public OpChef +{ +public: + explicit MatMulChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CUSTOM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + + flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MatMulChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MATMUL_H__ diff --git a/compiler/tflchef/core/src/CustomOp/MatrixBandPart.cpp b/compiler/tflchef/core/src/CustomOp/MatrixBandPart.cpp new file mode 100644 index 0000000..d12597e --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/MatrixBandPart.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixBandPart.h" + +#include "flatbuffers/flexbuffers.h" + +flatbuffers::Offset MatrixBandPartChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +flatbuffers::Offset> +MatrixBandPartChef::custom_value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.type() == "MatrixBandPart"); + + /** + * REGISTER_OP("MatrixBandPart") + .Input("input: T") + .Input("num_lower: Tindex") + .Input("num_upper: Tindex") + .Output("band: T") + .Attr("T: type") + .Attr("Tindex: {int32, int64} = DT_INT64") + .SetShapeFn(shape_inference::UnchangedShape); + */ + + auto flex_buffers = std::make_unique(); + size_t map_start = flex_buffers->StartMap(); + + // TODO Support more data types + flex_buffers->Int("T", tflite::TensorType_FLOAT32); + flex_buffers->Int("Tindex", tflite::TensorType_INT64); + + flex_buffers->EndMap(map_start); + flex_buffers->Finish(); + + auto circle_custom_options = fbb.CreateVector(flex_buffers->GetBuffer()); + return circle_custom_options; +} + +std::unique_ptr MatrixBandPartChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MatrixBandPartChef{operation}}; +} diff --git a/compiler/tflchef/core/src/CustomOp/MatrixBandPart.h b/compiler/tflchef/core/src/CustomOp/MatrixBandPart.h new file mode 100644 index 0000000..54a8a3a --- /dev/null +++ b/compiler/tflchef/core/src/CustomOp/MatrixBandPart.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MATRIXBANDPART_H__ +#define __OP_MATRIXBANDPART_H__ + +#include "OpChef.h" + +class MatrixBandPartChef final : public OpChef +{ +public: + explicit MatrixBandPartChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CUSTOM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + + flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MatrixBandPartChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MATRIXBANDPART_H__ diff --git a/compiler/tflchef/core/src/Data/Constant.h b/compiler/tflchef/core/src/Data/Constant.h deleted file mode 100644 index ebe1f3d..0000000 --- a/compiler/tflchef/core/src/Data/Constant.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CONSTANT_FILLER_H__ -#define __CONSTANT_FILLER_H__ - -#include "DataChef.h" -#include "LexicalCast.h" - -template class ConstantDataChef final : public DataChef -{ -public: - ConstantDataChef(const T &value) : _value{value} - { - // DO NOTHING - } - -public: - std::vector generate(int32_t count) const override - { - std::vector res; - - for (uint32_t n = 0; n < count; ++n) - { - const uint8_t *arr = reinterpret_cast(&_value); - - for (uint32_t b = 0; b < sizeof(T); ++b) - { - res.emplace_back(arr[b]); - } - } - - return res; - } - -private: - T _value; -}; - -template struct ConstantDataChefFactory : public DataChefFactory -{ - std::unique_ptr create(const Arguments &args) const - { - auto const value = to_number(args.value(0)); - return std::unique_ptr{new ConstantDataChef{value}}; - } -}; - -#endif // __CONSTANT_FILLER_H__ diff --git a/compiler/tflchef/core/src/Data/Explicit.h b/compiler/tflchef/core/src/Data/Explicit.h deleted file mode 100644 index 088e791..0000000 --- a/compiler/tflchef/core/src/Data/Explicit.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __EXPLICIT_FILLER_H__ -#define __EXPLICIT_FILLER_H__ - -#include "DataChef.h" -#include "LexicalCast.h" - -#include - -template class ExplicitDataChef final : public DataChef -{ -public: - ExplicitDataChef() - { - // DO NOTHING - } - -public: - std::vector generate(int32_t count) const override - { - std::vector res; - - for (uint32_t n = 0; n < count; ++n) - { - T const value = (n < _values.size()) ? _values.at(n) : T{}; - const uint8_t *arr = reinterpret_cast(&value); - - for (uint32_t b = 0; b < sizeof(T); ++b) - { - res.emplace_back(arr[b]); - } - } - - return res; - } - -public: - void insert(const T &value) { _values.emplace_back(value); } - -private: - std::vector _values; -}; - -template struct ExplicitDataChefFactory : public DataChefFactory -{ - std::unique_ptr create(const Arguments &args) const - { - std::unique_ptr> res{new ExplicitDataChef}; - - for (uint32_t n = 0; n < args.count(); ++n) - { - auto const value = to_number(args.value(n)); - res->insert(value); - } - - return std::move(res); - } -}; - -#endif // __EXPLICIT_FILLER_H__ diff --git a/compiler/tflchef/core/src/Data/Gaussian.cpp b/compiler/tflchef/core/src/Data/Gaussian.cpp deleted file mode 100644 index c515d11..0000000 --- a/compiler/tflchef/core/src/Data/Gaussian.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "Gaussian.h" -#include "LexicalCast.h" - -#include -#include - -#include -#include - -std::vector GaussianFloat32DataChef::generate(int32_t count) const -{ - // TODO Support seed value override - int seed = std::chrono::system_clock::now().time_since_epoch().count(); - - std::minstd_rand rand{seed}; - std::normal_distribution dist{_mean, _stddev}; - - std::vector res; - - for (uint32_t n = 0; n < count; ++n) - { - auto const value = dist(rand); - auto const arr = reinterpret_cast(&value); - - for (uint32_t b = 0; b < sizeof(float); ++b) - { - res.emplace_back(arr[b]); - } - } - - return res; -} - -std::vector GaussianInt32DataChef::generate(int32_t count) const -{ - // TODO Support seed value override - int seed = std::chrono::system_clock::now().time_since_epoch().count(); - - std::minstd_rand rand{seed}; - std::normal_distribution dist{_mean, _stddev}; - - std::vector res; - - for (uint32_t n = 0; n < count; ++n) - { - auto const value = static_cast(dist(rand)); - auto const arr = reinterpret_cast(&value); - - for (uint32_t b = 0; b < sizeof(int32_t); ++b) - { - res.emplace_back(arr[b]); - } - } - - return res; -} - -std::vector GaussianUint8DataChef::generate(int32_t count) const -{ - // TODO Support seed value override - int seed = std::chrono::system_clock::now().time_since_epoch().count(); - - std::minstd_rand rand{seed}; - std::normal_distribution dist{_mean, _stddev}; - - std::vector res; - - for (uint32_t n = 0; n < count; ++n) - { - auto const value = static_cast(dist(rand)); // uint8_t for data type - auto const arr = reinterpret_cast(&value); // uint8_t for byte streaming - - for (uint32_t b = 0; b < sizeof(uint8_t); ++b) - { - res.emplace_back(arr[b]); - } - } - - return res; -} - -std::unique_ptr GaussianFloat32DataChefFactory::create(const Arguments &args) const -{ - if (args.count() != 2) - { - throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; - } - - auto const mean = to_number(args.value(0)); - auto const stddev = to_number(args.value(1)); - - return std::unique_ptr{new GaussianFloat32DataChef{mean, stddev}}; -} - -std::unique_ptr GaussianInt32DataChefFactory::create(const Arguments &args) const -{ - if (args.count() != 2) - { - throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; - } - - auto const mean = to_number(args.value(0)); - auto const stddev = to_number(args.value(1)); - - return std::unique_ptr{new GaussianInt32DataChef{mean, stddev}}; -} - -std::unique_ptr GaussianUint8DataChefFactory::create(const Arguments &args) const -{ - if (args.count() != 2) - { - throw std::runtime_error{"invalid argument count: two arguments (mean/stddev) are expected"}; - } - - auto const mean = to_number(args.value(0)); - auto const stddev = to_number(args.value(1)); - - return std::unique_ptr{new GaussianUint8DataChef{mean, stddev}}; -} diff --git a/compiler/tflchef/core/src/Data/Gaussian.h b/compiler/tflchef/core/src/Data/Gaussian.h deleted file mode 100644 index 81a28d2..0000000 --- a/compiler/tflchef/core/src/Data/Gaussian.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __GAUSSIAN_FILLER_H__ -#define __GAUSSIAN_FILLER_H__ - -#include "DataChef.h" - -/** - * @brief Generate a sequence of random values according to the gaussian(=normal) distribution - */ -class GaussianFloat32DataChef final : public DataChef -{ -public: - GaussianFloat32DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} - { - // DO NOTHING - } - -public: - std::vector generate(int32_t count) const override; - -private: - float _mean; - float _stddev; -}; - -class GaussianInt32DataChef final : public DataChef -{ -public: - GaussianInt32DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} - { - // DO NOTHING - } - -public: - std::vector generate(int32_t count) const override; - -private: - float _mean; - float _stddev; -}; - -class GaussianUint8DataChef final : public DataChef -{ -public: - GaussianUint8DataChef(float mean, float stddev) : _mean{mean}, _stddev{stddev} - { - // DO NOTHING - } - -public: - std::vector generate(int32_t count) const override; - -private: - float _mean; - float _stddev; -}; - -struct GaussianFloat32DataChefFactory : public DataChefFactory -{ - std::unique_ptr create(const Arguments &args) const; -}; - -struct GaussianInt32DataChefFactory : public DataChefFactory -{ - std::unique_ptr create(const Arguments &args) const; -}; - -struct GaussianUint8DataChefFactory : public DataChefFactory -{ - std::unique_ptr create(const Arguments &args) const; -}; - -#endif // __GAUSSIAN_FILLER_H__ diff --git a/compiler/tflchef/core/src/DataChef.def b/compiler/tflchef/core/src/DataChef.def deleted file mode 100644 index 89d34a2..0000000 --- a/compiler/tflchef/core/src/DataChef.def +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef DATA_CHEF -#error "Define DATA_CHEF first" -#endif // DATA_CHEF - -// DATA_CHEF(TYPE, NAME, FACTORY_CLASS) -// "TYPE" SHOULD BE an enum tag of tflchef::TensorType -DATA_CHEF(FLOAT32, constant, ConstantDataChefFactory) -DATA_CHEF(BOOL, constant, ConstantDataChefFactory) -DATA_CHEF(INT32, explicit, ExplicitDataChefFactory) -DATA_CHEF(UINT8, explicit, ExplicitDataChefFactory) -DATA_CHEF(BOOL, explicit, ExplicitDataChefFactory) -DATA_CHEF(FLOAT32, explicit, ExplicitDataChefFactory) -DATA_CHEF(FLOAT32, gaussian, GaussianFloat32DataChefFactory) -DATA_CHEF(INT32, gaussian, GaussianInt32DataChefFactory) -DATA_CHEF(UINT8, gaussian, GaussianUint8DataChefFactory) diff --git a/compiler/tflchef/core/src/DataChef.h b/compiler/tflchef/core/src/DataChef.h deleted file mode 100644 index d057102..0000000 --- a/compiler/tflchef/core/src/DataChef.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DATA_CHEF_H__ -#define __DATA_CHEF_H__ - -#include "Arguments.h" - -#include -#include -#include - -using Data = std::vector; - -/** - * @brief Data Generator - */ -struct DataChef -{ - virtual ~DataChef() = default; - - // TODO Allow users to query the type of elements that this DataChef generates - - /** - * @brief Generate a sequence of 'count' elements as a byte sequence - * - * Let D be the return value of generate(N). - * Then, D.size() == N * sizeof(T) where T is the element type. - */ - virtual Data generate(int32_t count) const = 0; -}; - -/** - * @brief Data Generator Factory - */ -struct DataChefFactory -{ - virtual ~DataChefFactory() = default; - - virtual std::unique_ptr create(const Arguments &args) const = 0; -}; - -#endif // __DATA_CHEF_H__ diff --git a/compiler/tflchef/core/src/DataChefs.h b/compiler/tflchef/core/src/DataChefs.h deleted file mode 100644 index 2310ae8..0000000 --- a/compiler/tflchef/core/src/DataChefs.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DATA_CHEFS_H__ -#define __DATA_CHEFS_H__ - -#include "Data/Constant.h" -#include "Data/Explicit.h" -#include "Data/Gaussian.h" - -#endif // __DATA_CHEFS_H__ diff --git a/compiler/tflchef/core/src/Dataset.h b/compiler/tflchef/core/src/Dataset.h deleted file mode 100644 index 9d5c7a4..0000000 --- a/compiler/tflchef/core/src/Dataset.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __DATASET_H__ -#define __DATASET_H__ - -#include - -template class Dataset -{ -public: - Dataset(const std::vector &vec) : _vec{vec} - { - // DO NOTHING - } - -public: - Dataset(std::vector &&vec) : _vec{std::move(vec)} - { - // DO NOTHING - } - -public: - template auto map(Func f) const -> Dataset()))> - { - using U = decltype(f(std::declval())); - std::vector res; - - for (const auto &elem : _vec) - { - res.emplace_back(f(elem)); - } - - return Dataset(std::move(res)); - } - -public: - const std::vector &vectorize(void) const { return _vec; } - -private: - std::vector _vec; -}; - -#endif // __DATASET_H__ diff --git a/compiler/tflchef/core/src/LexicalCast.cpp b/compiler/tflchef/core/src/LexicalCast.cpp deleted file mode 100644 index 38a5f92..0000000 --- a/compiler/tflchef/core/src/LexicalCast.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "LexicalCast.h" - -#include -#include - -template <> float to_number(const std::string &s) { return std::stof(s); } -template <> int to_number(const std::string &s) { return std::stoi(s); } -template <> uint8_t to_number(const std::string &s) -{ - int temp = std::stoi(s); - assert(temp >= 0); - assert(temp <= std::numeric_limits::max()); - return static_cast(temp); -} -template <> bool to_number(const std::string &s) -{ - if (std::stoi(s) || s == "T" || s == "t" || s == "TRUE" || s == "true") - return true; - return false; -} diff --git a/compiler/tflchef/core/src/LexicalCast.h b/compiler/tflchef/core/src/LexicalCast.h deleted file mode 100644 index 4aeccb4..0000000 --- a/compiler/tflchef/core/src/LexicalCast.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @brief This file provides string <-> number cast helpers - */ -#ifndef __LEXICAL_CAST_H__ -#define __LEXICAL_CAST_H__ - -#include - -/** - * @brief Return a numeric value that corresponds to a given string - * - * @note This function will throw an exception on casting failure - */ -template Number to_number(const std::string &s); - -#endif // __LEXICAL_CAST_H__ diff --git a/compiler/tflchef/core/src/ModelChef.cpp b/compiler/tflchef/core/src/ModelChef.cpp index 2c69efd..932a649 100644 --- a/compiler/tflchef/core/src/ModelChef.cpp +++ b/compiler/tflchef/core/src/ModelChef.cpp @@ -15,17 +15,19 @@ */ #include "tflchef/ModelChef.h" -#include "Arguments.h" +#include +#include #include "Convert.h" -#include "DataChef.h" -#include "DataChefs.h" +#include #include "OpChef.h" #include "OpChefs.h" -#include "Dataset.h" +#include + +#include "Log.h" #include #include @@ -42,34 +44,7 @@ namespace { -template class RangedArguments : public Arguments -{ -public: - RangedArguments(InputIt beg, InputIt end) : _beg{beg}, _end{end} - { - // DO NOTHING - } - -public: - uint32_t count(void) const override { return _end - _beg; } - -public: - const std::string &value(uint32_t n) const override { return *(_beg + n); } - -private: - InputIt _beg; - InputIt _end; -}; - -template RangedArguments ranged_arguments(InputIt beg, InputIt end) -{ - return RangedArguments{beg, end}; -} - -} // namespace - -namespace -{ +using namespace souschef; template std::vector as_vector(const ::google::protobuf::RepeatedPtrField &field) { @@ -147,20 +122,6 @@ private: namespace { -template class Registry -{ -public: - void add(const std::string &name, std::unique_ptr &&entry) - { - _content[name] = std::move(entry); - } - - const T &lookup(const std::string &name) const { return *(_content.at(name)); } - -private: - std::map> _content; -}; - struct DataChefRegistry final : public Registry { }; @@ -168,6 +129,7 @@ struct DataChefRegistry final : public Registry DataChefRegistry &data_chef_registry(const tflchef::TensorType &type) { static DataChefRegistry s32; + static DataChefRegistry s64; static DataChefRegistry fp32; static DataChefRegistry u8; static DataChefRegistry boolean; @@ -176,6 +138,8 @@ DataChefRegistry &data_chef_registry(const tflchef::TensorType &type) { case tflchef::INT32: return s32; + case tflchef::INT64: + return s64; case tflchef::FLOAT32: return fp32; case tflchef::UINT8: @@ -199,14 +163,54 @@ OpChefRegistry &op_chef_registry(void) return registry; } -// @brief This will prepare a set of unique operator codes in the mode recipe -std::set gather_opcode_set(const ::tflchef::ModelRecipe &model_recipe) +/// @brief This will prepare a map of unique builtin codes in the model recipe +std::map +gather_builtincode_map(const ::tflchef::ModelRecipe &model_recipe) +{ + // Key and value of the map are BuiltinOperator and operator version + std::map builtin_map; + + for (const auto &operation : model_recipe.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == tflite::BuiltinOperator_CUSTOM) + continue; + + // Various operation version is unified as the highest version among them + if (builtin_map.find(op_chef->code()) == builtin_map.end() || + builtin_map[op_chef->code()] < operation.version()) + builtin_map[op_chef->code()] = operation.version(); + } + + // Add ops used in Graphs(subgraphs) + for (int g = 0; g < model_recipe.graph_size(); ++g) + { + const auto &graph = model_recipe.graph(g); + for (const auto &operation : graph.operation()) + { + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + if (op_chef->code() == tflite::BuiltinOperator_CUSTOM) + continue; + + // Various operation version is unified as the highest version among them + if (builtin_map.find(op_chef->code()) == builtin_map.end() || + builtin_map[op_chef->code()] < operation.version()) + builtin_map[op_chef->code()] = operation.version(); + } + } + + return builtin_map; +} + +/// @brief This will prepare a set of unique custom codes in the mode recipe +std::set gather_customcode_set(const ::tflchef::ModelRecipe &model_recipe) { - std::set opcode_set; + std::set customcode_set; for (const auto &operation : model_recipe.operation()) { auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); - opcode_set.insert(op_chef->code()); + if (op_chef->code() == tflite::BuiltinOperator_CUSTOM) + customcode_set.insert(operation.type()); } // Add ops used in Graphs(subgraphs) @@ -216,525 +220,386 @@ std::set gather_opcode_set(const ::tflchef::ModelRecipe for (const auto &operation : graph.operation()) { auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); - opcode_set.insert(op_chef->code()); + if (op_chef->code() == tflite::BuiltinOperator_CUSTOM) + customcode_set.insert(operation.type()); } } - return opcode_set; + return customcode_set; } } // namespace -namespace tflchef +namespace { -/** - * @brief Generate a (in-memory) TensorFlow Lite model from a given model recipe - */ -GeneratedModel cook(const ::tflchef::ModelRecipe &model_recipe) +struct CookParams { -// Initialize Op Chef Registry -#define OP_CHEF(NAME, FACTORY_CLASS) \ - op_chef_registry().add(#NAME, std::unique_ptr(new FACTORY_CLASS())); -#include "OpChef.def" -#undef OP_CHEF + std::vector> &buffer_vec; + std::vector> &code_vec; + std::vector> &subgraph_vec; + std::unique_ptr &flatbuffer_builder; + std::map &builtin_code_map; + std::string noname; +}; -// Initialize Data Chef Registry -#define DATA_CHEF(TYPE, NAME, FACTORY_CLASS) \ - data_chef_registry(::tflchef::TYPE) \ - .add(#NAME, std::unique_ptr(new FACTORY_CLASS())); -#include "DataChef.def" -#undef DATA_CHEF +template void cook_graph(const T &graph, CookParams &cp) +{ + LOGGER(l); - // - // Create FlatBufferBuilder - // - auto flatbuffer_builder = - std::unique_ptr(new flatbuffers::FlatBufferBuilder(1024)); + std::vector> &buffer_vec = cp.buffer_vec; + std::vector> &code_vec = cp.code_vec; + std::vector> &subgraph_vec = cp.subgraph_vec; + std::unique_ptr &flatbuffer_builder = cp.flatbuffer_builder; + std::map &builtin_code_map = cp.builtin_code_map; // Operand-related - std::vector> buffer_vec; + std::vector> tensor_vec; // Operation-related - std::vector> code_vec; + std::vector> operator_vec; + + // default name for graph + std::string graph_name = cp.noname; + if (graph.has_name()) + graph_name = graph.name(); + + // Tensor Name -> Tensor ID mapping (per Graph) + std::map symbol_table; + + auto lookup = [&symbol_table, &graph_name](const std::string &name) { + if (symbol_table.find(name) != symbol_table.end()) + return symbol_table.at(name); + else if (name == "") + return -1; // -1 in TFLite means that optional input tensor is empty. + else + { + std::string msg = "tflchef : input not found in " + graph_name + " graph"; + throw std::runtime_error(msg.c_str()); + } + }; - // Graphs-related - std::vector> subgraph_vec; + int32_t buffer_start = buffer_vec.size(); + int32_t buffer_index = 0; - // Create OperatorCode - std::set opcode_set = gather_opcode_set(model_recipe); - for (auto opcode : opcode_set) + // Create buffer(s) 1~n(I) for input(s) + const auto size_input = graph.input_size(); + for (int ci = 0; ci < size_input; ++ci) { - tflite::OperatorCodeBuilder code_builder{*flatbuffer_builder}; - code_builder.add_builtin_code(opcode); - auto code = code_builder.Finish(); - // Update OperatorCode vector - code_vec.emplace_back(code); + tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); } - - // Create an Empty Buffer - // - // Buffer 0 SHOULD be an empty buffer in TensorFlow Lite model file - // (Please refer to the comment for Tensor.buffer field in schema) + // Create buffer(s) n(I)+1~n(I)+n(O) for output(s) + const auto size_output = graph.output_size(); + for (int co = 0; co < size_output; ++co) { tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; buffer_vec.emplace_back(buffer_builder.Finish()); } - // - // Create Main graph - // - { - // Operand-related - std::vector> tensor_vec; + auto input_names = as_dataset(graph.input()).vectorize(); + auto output_names = as_dataset(graph.output()).vectorize(); - // Operation-related - std::vector> operator_vec; - - // Tensor Name -> Tensor ID mapping (per Graph) - std::map symbol_table; - - auto lookup = [&symbol_table](const std::string &name) { return symbol_table.at(name); }; + for (const auto &operand : graph.operand()) + { + assert(operand.has_name()); - int32_t buffer_start = buffer_vec.size(); - int32_t buffer_index = 0; + assert(operand.has_type()); - // Create buffer(s) 1~n(I) for input(s) - const auto size_input = model_recipe.input_size(); - for (int ci = 0; ci < size_input; ++ci) + flatbuffers::Offset> shape; + std::vector dims; + if (operand.has_shape()) { - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_vec.emplace_back(buffer_builder.Finish()); - } - // Create buffer(s) n(I)+1~n(I)+n(O) for output(s) - const auto size_output = model_recipe.output_size(); - for (int co = 0; co < size_output; ++co) - { - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_vec.emplace_back(buffer_builder.Finish()); + dims = as_dims(operand.shape()); + shape = flatbuffer_builder->CreateVector(dims); } - // default name for main graph - std::string graph_name = "main"; - if (model_recipe.has_name()) - graph_name = model_recipe.name(); + auto name = flatbuffer_builder->CreateString(operand.name()); - auto input_names = as_dataset(model_recipe.input()).vectorize(); - auto output_names = as_dataset(model_recipe.output()).vectorize(); + buffer_index = 0; - for (const auto &operand : model_recipe.operand()) + // Create Buffer if filler is specified + if (operand.has_filler()) { - assert(operand.has_name()); - - assert(operand.has_type()); - assert(operand.has_shape()); - - std::vector dims = as_dims(operand.shape()); - - auto shape = flatbuffer_builder->CreateVector(dims); - auto name = flatbuffer_builder->CreateString(operand.name()); - - buffer_index = 0; - - // Create Buffer if filler is specified - if (operand.has_filler()) - { - const auto &filler = operand.filler(); + const auto &filler = operand.filler(); - assert(filler.has_tag()); + assert(filler.has_tag()); - auto args = ranged_arguments(filler.arg().begin(), filler.arg().end()); - auto chef = data_chef_registry(operand.type()).lookup(filler.tag()).create(args); + auto args = ranged_arguments(filler.arg().begin(), filler.arg().end()); + auto chef = data_chef_registry(operand.type()).lookup(filler.tag()).create(args); - assert(chef != nullptr); + assert(chef != nullptr); - // Create Data - auto data_vec = chef->generate(element_count(dims)); - auto data = flatbuffer_builder->CreateVector(data_vec); + // Create Data + int32_t count = (element_count(dims) > 0) ? element_count(dims) : filler.arg_size(); + auto data_vec = chef->generate(count); + auto data = flatbuffer_builder->CreateVector(data_vec); - // Create Buffer - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_builder.add_data(data); - auto buffer = buffer_builder.Finish(); + // Create Buffer + tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_builder.add_data(data); + auto buffer = buffer_builder.Finish(); - // Update Buffer Index & Vector - buffer_index = buffer_vec.size(); - buffer_vec.emplace_back(buffer); + // Update Buffer Index & Vector + buffer_index = buffer_vec.size(); + buffer_vec.emplace_back(buffer); + } + else + { + // if this is input or output, assign to that buffer_index + int idx = 0; + for (auto it = input_names.begin(); it != input_names.end(); ++it, ++idx) + { + if (*it == operand.name()) + { + buffer_index = buffer_start + idx; + break; + } } - else + if (buffer_index == 0) { - // if this is input or output, assign to that buffer_index - int idx = 0; - for (auto it = input_names.begin(); it != input_names.end(); ++it, ++idx) + idx = 0; + for (auto it = output_names.begin(); it != output_names.end(); ++it, ++idx) { if (*it == operand.name()) { - buffer_index = buffer_start + idx; + buffer_index = buffer_start + size_input + idx; break; } } - if (buffer_index == 0) - { - idx = 0; - for (auto it = output_names.begin(); it != output_names.end(); ++it, ++idx) - { - if (*it == operand.name()) - { - buffer_index = buffer_start + size_input + idx; - break; - } - } - } } - - flatbuffers::Offset quant_index; - - // Create QuantizationParameters if quant is specified - if (operand.has_quant()) + if (buffer_index == 0) { - const auto &quant = operand.quant(); - - // Create each parameters - // NOTE if some parameters are not given, those will be set to default value - std::vector quant_max_vec(quant.max_size()); - std::vector quant_min_vec(quant.min_size()); - std::vector quant_scale_vec(quant.scale_size()); - std::vector quant_zero_point_vec(quant.zero_point_size()); - - for (uint32_t i = 0; i < quant.max_size(); ++i) - quant_max_vec.at(i) = quant.max(i); - for (uint32_t i = 0; i < quant.min_size(); ++i) - quant_min_vec.at(i) = quant.min(i); - for (uint32_t i = 0; i < quant.scale_size(); ++i) - quant_scale_vec.at(i) = quant.scale(i); - for (uint32_t i = 0; i < quant.zero_point_size(); ++i) - quant_zero_point_vec.at(i) = quant.zero_point(i); - - auto quant_max = flatbuffer_builder->CreateVector(quant_max_vec); - auto quant_min = flatbuffer_builder->CreateVector(quant_min_vec); - auto quant_scale = flatbuffer_builder->CreateVector(quant_scale_vec); - auto quant_zero_point = flatbuffer_builder->CreateVector(quant_zero_point_vec); - - // Create QuantizationParameters - tflite::QuantizationParametersBuilder quant_builder{*flatbuffer_builder}; - quant_builder.add_max(quant_max); - quant_builder.add_min(quant_min); - quant_builder.add_scale(quant_scale); - quant_builder.add_zero_point(quant_zero_point); - - // Update QuantizationParameters Index - quant_index = quant_builder.Finish(); - } - - // Create Tensor - tflite::TensorBuilder tensor_builder{*flatbuffer_builder}; - - tensor_builder.add_shape(shape); - tensor_builder.add_type(as_tflite_tensortype(operand.type())); - tensor_builder.add_buffer(buffer_index); - tensor_builder.add_name(name); - if (operand.has_quant()) - tensor_builder.add_quantization(quant_index); - - // Append! - tensor_vec.emplace_back(tensor_builder.Finish()); - - // Update Tensor Name -> Tensor Index Map - int32_t tensor_index = symbol_table.size(); - const auto &tensor_name = operand.name(); + // we couldn't find the buffer; create an empty buffer for this tensor + buffer_index = buffer_vec.size(); - symbol_table[tensor_name] = tensor_index; + tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } } + assert(buffer_index != 0); - // Create Operator - for (const auto &operation : model_recipe.operation()) - { - assert(operation.has_type()); - - auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); - - // Create 'inputs' - std::vector input_vec = as_dataset(operation.input()).map(lookup).vectorize(); - auto inputs = flatbuffer_builder->CreateVector(input_vec); - - // Create 'outputs' - std::vector output_vec = as_dataset(operation.output()).map(lookup).vectorize(); - auto outputs = flatbuffer_builder->CreateVector(output_vec); - - // Create Option - auto options = op_chef->value(*flatbuffer_builder); - - // Create Operator - tflite::OperatorBuilder op_builder{*flatbuffer_builder}; - - // Get operator code index from opcode_set with assumption, order of - // opcode_set is same as that of code_vec - auto op_it = opcode_set.find(op_chef->code()); - assert(op_it != opcode_set.end()); - uint32_t opcode_index = std::distance(opcode_set.begin(), op_it); - - op_builder.add_opcode_index(opcode_index); - op_builder.add_inputs(inputs); - op_builder.add_outputs(outputs); - op_builder.add_builtin_options_type(op_chef->type()); - op_builder.add_builtin_options(options); + flatbuffers::Offset quant_index; - // Append Operator - operator_vec.emplace_back(op_builder.Finish()); + // Create QuantizationParameters if quant is specified + if (operand.has_quant()) + { + const auto &quant = operand.quant(); + + // Create each parameters + // NOTE if some parameters are not given, those will be set to default value + std::vector quant_max_vec(quant.max_size()); + std::vector quant_min_vec(quant.min_size()); + std::vector quant_scale_vec(quant.scale_size()); + std::vector quant_zero_point_vec(quant.zero_point_size()); + + for (uint32_t i = 0; i < quant.max_size(); ++i) + quant_max_vec.at(i) = quant.max(i); + for (uint32_t i = 0; i < quant.min_size(); ++i) + quant_min_vec.at(i) = quant.min(i); + for (uint32_t i = 0; i < quant.scale_size(); ++i) + quant_scale_vec.at(i) = quant.scale(i); + for (uint32_t i = 0; i < quant.zero_point_size(); ++i) + quant_zero_point_vec.at(i) = quant.zero_point(i); + + auto quant_max = flatbuffer_builder->CreateVector(quant_max_vec); + auto quant_min = flatbuffer_builder->CreateVector(quant_min_vec); + auto quant_scale = flatbuffer_builder->CreateVector(quant_scale_vec); + auto quant_zero_point = flatbuffer_builder->CreateVector(quant_zero_point_vec); + + // Create QuantizationParameters + tflite::QuantizationParametersBuilder quant_builder{*flatbuffer_builder}; + quant_builder.add_max(quant_max); + quant_builder.add_min(quant_min); + quant_builder.add_scale(quant_scale); + quant_builder.add_zero_point(quant_zero_point); + + // Update QuantizationParameters Index + quant_index = quant_builder.Finish(); } - // Create network input/output vector - std::vector input_vec = as_dataset(model_recipe.input()).map(lookup).vectorize(); - std::vector output_vec = as_dataset(model_recipe.output()).map(lookup).vectorize(); + // Create Tensor + tflite::TensorBuilder tensor_builder{*flatbuffer_builder}; - // Create "SubGraph" arguments - auto tensors = flatbuffer_builder->CreateVector(tensor_vec); - auto inputs = flatbuffer_builder->CreateVector(input_vec); - auto outputs = flatbuffer_builder->CreateVector(output_vec); - auto operators = flatbuffer_builder->CreateVector(operator_vec); - auto name = flatbuffer_builder->CreateString(graph_name); + tensor_builder.add_shape(shape); + tensor_builder.add_type(as_tflite_tensortype(operand.type())); + tensor_builder.add_buffer(buffer_index); + tensor_builder.add_name(name); + if (operand.has_quant()) + tensor_builder.add_quantization(quant_index); + + // Append! + tensor_vec.emplace_back(tensor_builder.Finish()); - tflite::SubGraphBuilder subgraph_builder{*flatbuffer_builder}; + // Update Tensor Name -> Tensor Index Map + int32_t tensor_index = symbol_table.size(); + const auto &tensor_name = operand.name(); - subgraph_builder.add_tensors(tensors); - subgraph_builder.add_inputs(inputs); - subgraph_builder.add_outputs(outputs); - subgraph_builder.add_operators(operators); - subgraph_builder.add_name(name); + INFO(l) << "Symbol [" << tensor_name << "] = Tensor " << tensor_index << std::endl; - subgraph_vec.emplace_back(subgraph_builder.Finish()); + symbol_table[tensor_name] = tensor_index; } - // - // Create subgraphs if exist - // TODO refactor main graph and subgraphs generation to reduce duplicate codes - // - for (int g = 0; g < model_recipe.graph_size(); ++g) + // Create Operator + for (const auto &operation : graph.operation()) { - // Operand-related - std::vector> tensor_vec; - - // Operation-related - std::vector> operator_vec; - - // Tensor Name -> Tensor ID mapping (per Graph) - std::map symbol_table; - - auto lookup = [&symbol_table](const std::string &name) { return symbol_table.at(name); }; - - const auto &graph = model_recipe.graph(g); - - int32_t buffer_start = buffer_vec.size(); - int32_t buffer_index = 0; - - // Create buffer(s) for input(s) - const auto size_input = graph.input_size(); - for (int ci = 0; ci < size_input; ++ci) - { - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_vec.emplace_back(buffer_builder.Finish()); - } - // Create buffer(s) for output(s) - const auto size_output = graph.output_size(); - for (int co = 0; co < size_output; ++co) - { - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_vec.emplace_back(buffer_builder.Finish()); - } - - // default name for sub graph - // TODO naming rule here may have conflit if recipe file provides it. - // fix this when this happens. - std::ostringstream stringStream; - stringStream << "sub_" << (g + 1); - std::string graph_name = stringStream.str(); - if (graph.has_name()) - graph_name = graph.name(); + assert(operation.has_type()); - auto input_names = as_dataset(graph.input()).vectorize(); - auto output_names = as_dataset(graph.output()).vectorize(); - - for (const auto &operand : graph.operand()) - { - assert(operand.has_name()); - - assert(operand.has_type()); - assert(operand.has_shape()); - - std::vector dims = as_dims(operand.shape()); - - auto shape = flatbuffer_builder->CreateVector(dims); - auto name = flatbuffer_builder->CreateString(operand.name()); + auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); - // Create Buffer if filler is specified - if (operand.has_filler()) - { - const auto &filler = operand.filler(); + // Create 'inputs' + std::vector input_vec = as_dataset(operation.input()).map(lookup).vectorize(); + auto inputs = flatbuffer_builder->CreateVector(input_vec); - assert(filler.has_tag()); + // Create 'outputs' + std::vector output_vec = as_dataset(operation.output()).map(lookup).vectorize(); + auto outputs = flatbuffer_builder->CreateVector(output_vec); - auto args = ranged_arguments(filler.arg().begin(), filler.arg().end()); - auto chef = data_chef_registry(operand.type()).lookup(filler.tag()).create(args); + // Create Option + auto options = op_chef->value(*flatbuffer_builder); - assert(chef != nullptr); + // Create Custom option + auto circle_custom_options = op_chef->custom_value(*flatbuffer_builder); - // Create Data - auto data_vec = chef->generate(element_count(dims)); - auto data = flatbuffer_builder->CreateVector(data_vec); + // Create Operator + tflite::OperatorBuilder op_builder{*flatbuffer_builder}; + + // Get operator code index from builtin_code_set with assumption, order of + // builtin_code_set is same as that of code_vec + auto op_it = builtin_code_map.find(op_chef->code()); + assert(op_it != builtin_code_map.end()); + uint32_t opcode_index = std::distance(builtin_code_map.begin(), op_it); + + op_builder.add_opcode_index(opcode_index); + op_builder.add_inputs(inputs); + op_builder.add_outputs(outputs); + op_builder.add_builtin_options_type(op_chef->type()); + op_builder.add_builtin_options(options); + op_builder.add_custom_options(circle_custom_options); + op_builder.add_custom_options_format(tflite::CustomOptionsFormat_FLEXBUFFERS); + // Append Operator + operator_vec.emplace_back(op_builder.Finish()); + } - // Create Buffer - tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; - buffer_builder.add_data(data); - auto buffer = buffer_builder.Finish(); + // Create network input/output vector + std::vector input_vec = as_dataset(graph.input()).map(lookup).vectorize(); + std::vector output_vec = as_dataset(graph.output()).map(lookup).vectorize(); - // Update Buffer Index & Vector - buffer_index = buffer_vec.size(); - buffer_vec.emplace_back(buffer); - } - else - { - // if this is input or output, assign to that buffer_index - int idx = 0; - buffer_index = 0; - for (auto it = input_names.begin(); it != input_names.end(); ++it, ++idx) - { - if (*it == operand.name()) - { - buffer_index = buffer_start + idx; - break; - } - } - if (buffer_index == 0) - { - idx = 0; - for (auto it = output_names.begin(); it != output_names.end(); ++it, ++idx) - { - if (*it == operand.name()) - { - buffer_index = buffer_start + size_input + idx; - break; - } - } - } - } - // NOTE buffer_index can be 0 when this operand does not have a filler or not I/O + // Create "SubGraph" arguments + auto tensors = flatbuffer_builder->CreateVector(tensor_vec); + auto inputs = flatbuffer_builder->CreateVector(input_vec); + auto outputs = flatbuffer_builder->CreateVector(output_vec); + auto operators = flatbuffer_builder->CreateVector(operator_vec); + auto name = flatbuffer_builder->CreateString(graph_name); - flatbuffers::Offset quant_index; + tflite::SubGraphBuilder subgraph_builder{*flatbuffer_builder}; - // Create QuantizationParameters if quant is specified - if (operand.has_quant()) - { - const auto &quant = operand.quant(); - - // Create each parameters - // NOTE if some parameters are not given, those will be set to default value - std::vector quant_max_vec(quant.max_size()); - std::vector quant_min_vec(quant.min_size()); - std::vector quant_scale_vec(quant.scale_size()); - std::vector quant_zero_point_vec(quant.zero_point_size()); - - for (uint32_t i = 0; i < quant.max_size(); ++i) - quant_max_vec.at(i) = quant.max(i); - for (uint32_t i = 0; i < quant.min_size(); ++i) - quant_min_vec.at(i) = quant.min(i); - for (uint32_t i = 0; i < quant.scale_size(); ++i) - quant_scale_vec.at(i) = quant.scale(i); - for (uint32_t i = 0; i < quant.zero_point_size(); ++i) - quant_zero_point_vec.at(i) = quant.zero_point(i); - - auto quant_max = flatbuffer_builder->CreateVector(quant_max_vec); - auto quant_min = flatbuffer_builder->CreateVector(quant_min_vec); - auto quant_scale = flatbuffer_builder->CreateVector(quant_scale_vec); - auto quant_zero_point = flatbuffer_builder->CreateVector(quant_zero_point_vec); - - // Create QuantizationParameters - tflite::QuantizationParametersBuilder quant_builder{*flatbuffer_builder}; - quant_builder.add_max(quant_max); - quant_builder.add_min(quant_min); - quant_builder.add_scale(quant_scale); - quant_builder.add_zero_point(quant_zero_point); - - // Update QuantizationParameters Index - quant_index = quant_builder.Finish(); - } + subgraph_builder.add_tensors(tensors); + subgraph_builder.add_inputs(inputs); + subgraph_builder.add_outputs(outputs); + subgraph_builder.add_operators(operators); + subgraph_builder.add_name(name); - // Create Tensor - tflite::TensorBuilder tensor_builder{*flatbuffer_builder}; + subgraph_vec.emplace_back(subgraph_builder.Finish()); +} - tensor_builder.add_shape(shape); - tensor_builder.add_type(as_tflite_tensortype(operand.type())); - tensor_builder.add_buffer(buffer_index); - tensor_builder.add_name(name); - if (operand.has_quant()) - tensor_builder.add_quantization(quant_index); +} // namespace - // Append! - tensor_vec.emplace_back(tensor_builder.Finish()); +namespace tflchef +{ - // Update Tensor Name -> Tensor Index Map - int32_t tensor_index = symbol_table.size(); - const auto &tensor_name = operand.name(); +/** + * @brief Generate a (in-memory) TensorFlow Lite model from a given model recipe + */ +GeneratedModel cook(const ::tflchef::ModelRecipe &model_recipe) +{ +// Initialize Op Chef Registry +#define OP_CHEF(NAME, FACTORY_CLASS) \ + op_chef_registry().add(#NAME, std::unique_ptr(new FACTORY_CLASS())); +#include "OpChef.def" +#undef OP_CHEF - symbol_table[tensor_name] = tensor_index; - } +// Initialize Data Chef Registry +#define DATA_CHEF(TYPE, NAME, FACTORY_CLASS) \ + data_chef_registry(::tflchef::TYPE) \ + .add(#NAME, std::unique_ptr(new FACTORY_CLASS())); +#include +#undef DATA_CHEF - // Create Operator - for (const auto &operation : graph.operation()) - { - assert(operation.has_type()); + // + // Create FlatBufferBuilder + // + auto flatbuffer_builder = + std::unique_ptr(new flatbuffers::FlatBufferBuilder(1024)); - auto op_chef = op_chef_registry().lookup(operation.type()).create(&operation); + // Operand-related + std::vector> buffer_vec; - // Create 'inputs' - std::vector input_vec = as_dataset(operation.input()).map(lookup).vectorize(); - auto inputs = flatbuffer_builder->CreateVector(input_vec); + // Operation-related + std::vector> code_vec; - // Create 'outputs' - std::vector output_vec = as_dataset(operation.output()).map(lookup).vectorize(); - auto outputs = flatbuffer_builder->CreateVector(output_vec); + // Graphs-related + std::vector> subgraph_vec; - // Create Option - auto options = op_chef->value(*flatbuffer_builder); + // Create OperatorCode with Builtin Operator + auto builtin_code_map = gather_builtincode_map(model_recipe); + for (auto const &opcode : builtin_code_map) + { + tflite::OperatorCodeBuilder code_builder{*flatbuffer_builder}; + code_builder.add_builtin_code(opcode.first); + code_builder.add_version(opcode.second); + auto code = code_builder.Finish(); + // Update OperatorCode vector + code_vec.emplace_back(code); + } - // Create Operator - tflite::OperatorBuilder op_builder{*flatbuffer_builder}; + // Create OperatorCode with Custom Operator + std::set custom_code_set = gather_customcode_set(model_recipe); + if (custom_code_set.size() && + builtin_code_map.find(tflite::BuiltinOperator_CUSTOM) == builtin_code_map.end()) + builtin_code_map[tflite::BuiltinOperator_CUSTOM] = 1; - // Get operator code index from opcode_set with assumption, order of - // opcode_set is same as that of code_vec - auto op_it = opcode_set.find(op_chef->code()); - assert(op_it != opcode_set.end()); - uint32_t opcode_index = std::distance(opcode_set.begin(), op_it); + for (auto opcode : custom_code_set) + { + auto custom_code = flatbuffer_builder->CreateString(opcode); + tflite::OperatorCodeBuilder code_builder{*flatbuffer_builder}; + code_builder.add_builtin_code(tflite::BuiltinOperator_CUSTOM); + code_builder.add_custom_code(custom_code); + auto code = code_builder.Finish(); + // Update OperatorCode vector + code_vec.emplace_back(code); + } - op_builder.add_opcode_index(opcode_index); - op_builder.add_inputs(inputs); - op_builder.add_outputs(outputs); - op_builder.add_builtin_options_type(op_chef->type()); - op_builder.add_builtin_options(options); + // Create an Empty Buffer + // + // Buffer 0 SHOULD be an empty buffer in TensorFlow Lite model file + // (Please refer to the comment for Tensor.buffer field in schema) + { + tflite::BufferBuilder buffer_builder{*flatbuffer_builder}; + buffer_vec.emplace_back(buffer_builder.Finish()); + } - // Append Operator - operator_vec.emplace_back(op_builder.Finish()); - } + // + // Create Main graph + // + CookParams cp{buffer_vec, code_vec, subgraph_vec, flatbuffer_builder, builtin_code_map, "main"}; - // Create network input/output vector - std::vector input_vec = as_dataset(graph.input()).map(lookup).vectorize(); - std::vector output_vec = as_dataset(graph.output()).map(lookup).vectorize(); + cook_graph<::tflchef::ModelRecipe>(model_recipe, cp); - // Create "SubGraph" arguments - auto tensors = flatbuffer_builder->CreateVector(tensor_vec); - auto inputs = flatbuffer_builder->CreateVector(input_vec); - auto outputs = flatbuffer_builder->CreateVector(output_vec); - auto operators = flatbuffer_builder->CreateVector(operator_vec); - auto name = flatbuffer_builder->CreateString(graph_name); + // + // Create subgraphs if exist + // + for (int g = 0; g < model_recipe.graph_size(); ++g) + { + const auto &graph = model_recipe.graph(g); - tflite::SubGraphBuilder subgraph_builder{*flatbuffer_builder}; + std::ostringstream stringStream; + stringStream << "sub_" << (g + 1); - subgraph_builder.add_tensors(tensors); - subgraph_builder.add_inputs(inputs); - subgraph_builder.add_outputs(outputs); - subgraph_builder.add_operators(operators); - subgraph_builder.add_name(name); + CookParams cp{buffer_vec, code_vec, subgraph_vec, + flatbuffer_builder, builtin_code_map, stringStream.str()}; - subgraph_vec.emplace_back(subgraph_builder.Finish()); + cook_graph<::tflchef::Graph>(graph, cp); } // Create "Model" arguments diff --git a/compiler/tflchef/core/src/Op/AddN.cpp b/compiler/tflchef/core/src/Op/AddN.cpp new file mode 100644 index 0000000..2ac02d2 --- /dev/null +++ b/compiler/tflchef/core/src/Op/AddN.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AddN.h" +#include "Convert.h" + +#include + +flatbuffers::Offset AddNChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::AddNOptionsBuilder add_n_options_builder{fbb}; + + return add_n_options_builder.Finish().Union(); +} + +std::unique_ptr AddNChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new AddNChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/AddN.h b/compiler/tflchef/core/src/Op/AddN.h new file mode 100644 index 0000000..44dcc63 --- /dev/null +++ b/compiler/tflchef/core/src/Op/AddN.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ADD_N_H__ +#define __OP_ADD_N_H__ + +#include "OpChef.h" + +class AddNChef final : public OpChef +{ +public: + explicit AddNChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ADD_N; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_AddNOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct AddNChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ADD_N_H__ diff --git a/compiler/tflchef/core/src/Op/ArgMin.cpp b/compiler/tflchef/core/src/Op/ArgMin.cpp new file mode 100644 index 0000000..b599270 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ArgMin.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ArgMin.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ArgMinChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_argmin_options()); + + auto tflite_output_type = as_tflite_tensortype(operation.argmin_options().output_type()); + + tflite::ArgMinOptionsBuilder argmin_options_builder{fbb}; + argmin_options_builder.add_output_type(tflite_output_type); + + return argmin_options_builder.Finish().Union(); +} + +std::unique_ptr ArgMinChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ArgMinChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ArgMin.h b/compiler/tflchef/core/src/Op/ArgMin.h new file mode 100644 index 0000000..222039f --- /dev/null +++ b/compiler/tflchef/core/src/Op/ArgMin.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ARGMIN_H__ +#define __OP_ARGMIN_H__ + +#include "OpChef.h" + +class ArgMinChef final : public OpChef +{ +public: + explicit ArgMinChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ARG_MIN; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ArgMinOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ArgMinChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ARGMIN_H__ diff --git a/compiler/tflchef/core/src/Op/BatchMatMul.cpp b/compiler/tflchef/core/src/Op/BatchMatMul.cpp new file mode 100644 index 0000000..7722bcc --- /dev/null +++ b/compiler/tflchef/core/src/Op/BatchMatMul.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMul.h" + +flatbuffers::Offset BatchMatMulChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_batch_matmul_options()); + + tflite::BatchMatMulOptionsBuilder batch_matmul_options_options_builder{fbb}; + batch_matmul_options_options_builder.add_adj_x(operation.batch_matmul_options().adj_x()); + batch_matmul_options_options_builder.add_adj_y(operation.batch_matmul_options().adj_y()); + + return batch_matmul_options_options_builder.Finish().Union(); +} + +std::unique_ptr BatchMatMulChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new BatchMatMulChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/BatchMatMul.h b/compiler/tflchef/core/src/Op/BatchMatMul.h new file mode 100644 index 0000000..eaf943c --- /dev/null +++ b/compiler/tflchef/core/src/Op/BatchMatMul.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_BATCH_MATMUL_H__ +#define __OP_BATCH_MATMUL_H__ + +#include "OpChef.h" + +class BatchMatMulChef final : public OpChef +{ +public: + explicit BatchMatMulChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_BATCH_MATMUL; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_BatchMatMulOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct BatchMatMulChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_BATCH_MATMUL_H__ diff --git a/compiler/tflchef/core/src/Op/Cast.cpp b/compiler/tflchef/core/src/Op/Cast.cpp new file mode 100644 index 0000000..1a29f9a --- /dev/null +++ b/compiler/tflchef/core/src/Op/Cast.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Cast.h" +#include "Convert.h" + +#include + +flatbuffers::Offset CastChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + if (!operation.has_cast_options()) + return 0; + + auto tflite_in_data_type = as_tflite_tensortype(operation.cast_options().in_data_type()); + auto tflite_out_data_type = as_tflite_tensortype(operation.cast_options().out_data_type()); + + tflite::CastOptionsBuilder cast_options_builder{fbb}; + cast_options_builder.add_in_data_type(tflite_in_data_type); + cast_options_builder.add_out_data_type(tflite_out_data_type); + + return cast_options_builder.Finish().Union(); +} + +std::unique_ptr CastChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new CastChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Cast.h b/compiler/tflchef/core/src/Op/Cast.h new file mode 100644 index 0000000..84c8e29 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Cast.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_CAST_H__ +#define __OP_CAST_H__ + +#include "OpChef.h" + +class CastChef final : public OpChef +{ +public: + explicit CastChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CAST; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_CastOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct CastChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_CAST_H__ diff --git a/compiler/tflchef/core/src/Op/Ceil.cpp b/compiler/tflchef/core/src/Op/Ceil.cpp new file mode 100644 index 0000000..3da0477 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Ceil.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Ceil.h" + +flatbuffers::Offset CeilChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Ceil. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr CeilChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new CeilChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Ceil.h b/compiler/tflchef/core/src/Op/Ceil.h new file mode 100644 index 0000000..5a42b7f --- /dev/null +++ b/compiler/tflchef/core/src/Op/Ceil.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_CEIL_H__ +#define __OP_CEIL_H__ + +#include "OpChef.h" + +class CeilChef final : public OpChef +{ +public: + explicit CeilChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_CEIL; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct CeilChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_CEIL_H__ diff --git a/compiler/tflchef/core/src/Op/Conv2D.cpp b/compiler/tflchef/core/src/Op/Conv2D.cpp index d99c533..0b3ef8a 100644 --- a/compiler/tflchef/core/src/Op/Conv2D.cpp +++ b/compiler/tflchef/core/src/Op/Conv2D.cpp @@ -25,14 +25,18 @@ flatbuffers::Offset Conv2DChef::value(flatbuffers::FlatBufferBuilder &fbb) assert(operation.has_conv2d_options()); - auto tflite_padding = as_tflite_padding(operation.conv2d_options().padding()); - auto tflite_activation = as_tflite_activation(operation.conv2d_options().activation()); + const auto &conv2d_options = operation.conv2d_options(); + + auto tflite_padding = as_tflite_padding(conv2d_options.padding()); + auto tflite_activation = as_tflite_activation(conv2d_options.activation()); tflite::Conv2DOptionsBuilder conv2d_options_builder{fbb}; conv2d_options_builder.add_padding(tflite_padding); - conv2d_options_builder.add_stride_h(operation.conv2d_options().stride_h()); - conv2d_options_builder.add_stride_w(operation.conv2d_options().stride_w()); + conv2d_options_builder.add_stride_h(conv2d_options.stride_h()); + conv2d_options_builder.add_stride_w(conv2d_options.stride_w()); conv2d_options_builder.add_fused_activation_function(tflite_activation); + conv2d_options_builder.add_dilation_w_factor(conv2d_options.dilation_w_factor()); + conv2d_options_builder.add_dilation_h_factor(conv2d_options.dilation_h_factor()); return conv2d_options_builder.Finish().Union(); } diff --git a/compiler/tflchef/core/src/Op/DepthToSpace.cpp b/compiler/tflchef/core/src/Op/DepthToSpace.cpp new file mode 100644 index 0000000..f0531d9 --- /dev/null +++ b/compiler/tflchef/core/src/Op/DepthToSpace.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DepthToSpace.h" +#include "Convert.h" + +#include + +flatbuffers::Offset DepthToSpaceChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_depth_to_space_options()); + + auto options = operation.depth_to_space_options(); + + auto tflite_block_size = options.block_size(); + + tflite::DepthToSpaceOptionsBuilder options_builder{fbb}; + + options_builder.add_block_size(tflite_block_size); + + return options_builder.Finish().Union(); +} + +std::unique_ptr DepthToSpaceChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new DepthToSpaceChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/DepthToSpace.h b/compiler/tflchef/core/src/Op/DepthToSpace.h new file mode 100644 index 0000000..32cb242 --- /dev/null +++ b/compiler/tflchef/core/src/Op/DepthToSpace.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_DEPTHTOSPACE_H__ +#define __OP_DEPTHTOSPACE_H__ + +#include "OpChef.h" + +class DepthToSpaceChef final : public OpChef +{ +public: + explicit DepthToSpaceChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_DEPTH_TO_SPACE; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_DepthToSpaceOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct DepthToSpaceChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_DEPTHTOSPACE_H__ diff --git a/compiler/tflchef/core/src/Op/DepthwiseConv2D.cpp b/compiler/tflchef/core/src/Op/DepthwiseConv2D.cpp index e04cf50..5da5b63 100644 --- a/compiler/tflchef/core/src/Op/DepthwiseConv2D.cpp +++ b/compiler/tflchef/core/src/Op/DepthwiseConv2D.cpp @@ -36,6 +36,8 @@ flatbuffers::Offset DepthwiseConv2DChef::value(flatbuffers::FlatBufferBuil options_builder.add_stride_h(options.stride_h()); options_builder.add_depth_multiplier(options.depth_multiplier()); options_builder.add_fused_activation_function(tflite_activation); + options_builder.add_dilation_w_factor(options.dilation_w_factor()); + options_builder.add_dilation_h_factor(options.dilation_h_factor()); return options_builder.Finish().Union(); } diff --git a/compiler/tflchef/core/src/Op/ELU.cpp b/compiler/tflchef/core/src/Op/ELU.cpp new file mode 100644 index 0000000..d9dae16 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ELU.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ELU.h" + +flatbuffers::Offset ELUChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +std::unique_ptr ELUChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ELUChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ELU.h b/compiler/tflchef/core/src/Op/ELU.h new file mode 100644 index 0000000..e164c00 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ELU.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ELU_H__ +#define __OP_ELU_H__ + +#include "OpChef.h" + +class ELUChef final : public OpChef +{ +public: + explicit ELUChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ELU; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ELUChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ELU_H__ diff --git a/compiler/tflchef/core/src/Op/ExpandDims.cpp b/compiler/tflchef/core/src/Op/ExpandDims.cpp new file mode 100644 index 0000000..c608281 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ExpandDims.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ExpandDims.h" +#include "Convert.h" + +flatbuffers::Offset ExpandDimsChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::ExpandDimsOptionsBuilder expand_dims_options_builder{fbb}; + + return expand_dims_options_builder.Finish().Union(); +} + +std::unique_ptr ExpandDimsChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ExpandDimsChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ExpandDims.h b/compiler/tflchef/core/src/Op/ExpandDims.h new file mode 100644 index 0000000..1f4c34a --- /dev/null +++ b/compiler/tflchef/core/src/Op/ExpandDims.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_EXPAND_DIMS_H__ +#define __OP_EXPAND_DIMS_H__ + +#include "OpChef.h" + +class ExpandDimsChef final : public OpChef +{ +public: + explicit ExpandDimsChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_EXPAND_DIMS; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ExpandDimsOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ExpandDimsChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_EXPAND_DIMS_H__ diff --git a/compiler/tflchef/core/src/Op/Fill.cpp b/compiler/tflchef/core/src/Op/Fill.cpp new file mode 100644 index 0000000..4a68294 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Fill.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Fill.h" + +#include +#include + +flatbuffers::Offset FillChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::FillOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr FillChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new FillChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Fill.h b/compiler/tflchef/core/src/Op/Fill.h new file mode 100644 index 0000000..60f9084 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Fill.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_FILL_H__ +#define __OP_FILL_H__ + +#include "OpChef.h" + +class FillChef final : public OpChef +{ +public: + explicit FillChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_FILL; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_FillOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct FillChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_FILL_H__ diff --git a/compiler/tflchef/core/src/Op/Floor.cpp b/compiler/tflchef/core/src/Op/Floor.cpp new file mode 100644 index 0000000..8f68201 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Floor.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Floor.h" + +flatbuffers::Offset FloorChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Floor. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr FloorChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new FloorChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Floor.h b/compiler/tflchef/core/src/Op/Floor.h new file mode 100644 index 0000000..23385d7 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Floor.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_FLOOR_H__ +#define __OP_FLOOR_H__ + +#include "OpChef.h" + +class FloorChef final : public OpChef +{ +public: + explicit FloorChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_FLOOR; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct FloorChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_FLOOR_H__ diff --git a/compiler/tflchef/core/src/Op/FloorMod.cpp b/compiler/tflchef/core/src/Op/FloorMod.cpp new file mode 100644 index 0000000..d17795a --- /dev/null +++ b/compiler/tflchef/core/src/Op/FloorMod.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FloorMod.h" + +flatbuffers::Offset FloorModChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::FloorModOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr FloorModChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new FloorModChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/FloorMod.h b/compiler/tflchef/core/src/Op/FloorMod.h new file mode 100644 index 0000000..b501f61 --- /dev/null +++ b/compiler/tflchef/core/src/Op/FloorMod.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_FLOOR_MOD_H__ +#define __OP_FLOOR_MOD_H__ + +#include "OpChef.h" + +class FloorModChef final : public OpChef +{ +public: + explicit FloorModChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_FLOOR_MOD; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_FloorModOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct FloorModChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_FLOOR_MOD_H__ diff --git a/compiler/tflchef/core/src/Op/Gather.cpp b/compiler/tflchef/core/src/Op/Gather.cpp new file mode 100644 index 0000000..2b62c7b --- /dev/null +++ b/compiler/tflchef/core/src/Op/Gather.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Gather.h" +#include "Convert.h" + +#include + +flatbuffers::Offset GatherChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_gather_options()); + + auto options = operation.gather_options(); + + tflite::GatherOptionsBuilder options_builder{fbb}; + + options_builder.add_axis(options.axis()); + return options_builder.Finish().Union(); +} + +std::unique_ptr GatherChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new GatherChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Gather.h b/compiler/tflchef/core/src/Op/Gather.h new file mode 100644 index 0000000..d937178 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Gather.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_GATHER_H__ +#define __OP_GATHER_H__ + +#include "OpChef.h" + +class GatherChef final : public OpChef +{ +public: + explicit GatherChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_GATHER; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_GatherOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct GatherChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_GATHER_H__ diff --git a/compiler/tflchef/core/src/Op/GatherNd.cpp b/compiler/tflchef/core/src/Op/GatherNd.cpp new file mode 100644 index 0000000..c04db53 --- /dev/null +++ b/compiler/tflchef/core/src/Op/GatherNd.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GatherNd.h" +#include "Convert.h" + +#include + +flatbuffers::Offset GatherNdChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::GatherNdOptionsBuilder gather_nd_options_builder{fbb}; + return gather_nd_options_builder.Finish().Union(); +} + +std::unique_ptr GatherNdChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new GatherNdChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/GatherNd.h b/compiler/tflchef/core/src/Op/GatherNd.h new file mode 100644 index 0000000..8865e77 --- /dev/null +++ b/compiler/tflchef/core/src/Op/GatherNd.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_GATHER_ND_H__ +#define __OP_GATHER_ND_H__ + +#include "OpChef.h" + +class GatherNdChef final : public OpChef +{ +public: + explicit GatherNdChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_GATHER_ND; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_GatherNdOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct GatherNdChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_GATHER_ND_H__ diff --git a/compiler/tflchef/core/src/Op/Greater.cpp b/compiler/tflchef/core/src/Op/Greater.cpp new file mode 100644 index 0000000..81765ae --- /dev/null +++ b/compiler/tflchef/core/src/Op/Greater.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Greater.h" + +flatbuffers::Offset GreaterChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::GreaterOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr GreaterChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new GreaterChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Greater.h b/compiler/tflchef/core/src/Op/Greater.h new file mode 100644 index 0000000..c54eaa6 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Greater.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_GREATER_H__ +#define __OP_GREATER_H__ + +#include "OpChef.h" + +class GreaterChef final : public OpChef +{ +public: + explicit GreaterChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_GREATER; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_GreaterOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct GreaterChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_GREATER_H__ diff --git a/compiler/tflchef/core/src/Op/GreaterEqual.cpp b/compiler/tflchef/core/src/Op/GreaterEqual.cpp new file mode 100644 index 0000000..80045f6 --- /dev/null +++ b/compiler/tflchef/core/src/Op/GreaterEqual.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GreaterEqual.h" + +flatbuffers::Offset GreaterEqualChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::GreaterEqualOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr GreaterEqualChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new GreaterEqualChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/GreaterEqual.h b/compiler/tflchef/core/src/Op/GreaterEqual.h new file mode 100644 index 0000000..105bac8 --- /dev/null +++ b/compiler/tflchef/core/src/Op/GreaterEqual.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_GREATEREQUAL_H__ +#define __OP_GREATEREQUAL_H__ + +#include "OpChef.h" + +class GreaterEqualChef final : public OpChef +{ +public: + explicit GreaterEqualChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_GREATER_EQUAL; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_GreaterEqualOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct GreaterEqualChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_GREATEREQUAL_H__ diff --git a/compiler/tflchef/core/src/Op/If.cpp b/compiler/tflchef/core/src/Op/If.cpp new file mode 100644 index 0000000..b0e575e --- /dev/null +++ b/compiler/tflchef/core/src/Op/If.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "If.h" + +flatbuffers::Offset IfChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_if_options()); + + tflite::IfOptionsBuilder if_options_builder{fbb}; + if_options_builder.add_then_subgraph_index(operation.if_options().then_subgraph_index()); + if_options_builder.add_else_subgraph_index(operation.if_options().else_subgraph_index()); + + return if_options_builder.Finish().Union(); +} + +std::unique_ptr IfChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new IfChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/If.h b/compiler/tflchef/core/src/Op/If.h new file mode 100644 index 0000000..7e18c56 --- /dev/null +++ b/compiler/tflchef/core/src/Op/If.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_IF_H__ +#define __OP_IF_H__ + +#include "OpChef.h" + +class IfChef final : public OpChef +{ +public: + explicit IfChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_IF; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_IfOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct IfChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_IF_H__ diff --git a/compiler/tflchef/core/src/Op/L2Normalize.cpp b/compiler/tflchef/core/src/Op/L2Normalize.cpp new file mode 100644 index 0000000..62d15e5 --- /dev/null +++ b/compiler/tflchef/core/src/Op/L2Normalize.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "L2Normalize.h" +#include "Convert.h" + +flatbuffers::Offset L2Normalize::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + tflite::L2NormOptionsBuilder l2norm_options_builder{fbb}; + auto tflite_activation = as_tflite_activation(operation.l2norm_options().activation()); + l2norm_options_builder.add_fused_activation_function(tflite_activation); + return l2norm_options_builder.Finish().Union(); +} + +std::unique_ptr L2NormalizeChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new L2Normalize{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/L2Normalize.h b/compiler/tflchef/core/src/Op/L2Normalize.h new file mode 100644 index 0000000..dd5f21c --- /dev/null +++ b/compiler/tflchef/core/src/Op/L2Normalize.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_L2NORMALIZE_H__ +#define __OP_L2NORMALIZE_H__ + +#include "OpChef.h" + +class L2Normalize final : public OpChef +{ +public: + explicit L2Normalize(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_L2_NORMALIZATION; + } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_L2NormOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct L2NormalizeChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_L2NORMALIZE_H__ diff --git a/compiler/tflchef/core/src/Op/L2Pool2D.cpp b/compiler/tflchef/core/src/Op/L2Pool2D.cpp new file mode 100644 index 0000000..f22bb96 --- /dev/null +++ b/compiler/tflchef/core/src/Op/L2Pool2D.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "L2Pool2D.h" +#include "Convert.h" + +#include + +flatbuffers::Offset L2Pool2DChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_l2pool2d_options()); + + auto options = operation.l2pool2d_options(); + + auto tflite_padding = as_tflite_padding(options.padding()); + auto tflite_activation = as_tflite_activation(options.activation()); + + tflite::Pool2DOptionsBuilder options_builder{fbb}; + options_builder.add_padding(tflite_padding); + options_builder.add_stride_h(options.stride_h()); + options_builder.add_stride_w(options.stride_w()); + options_builder.add_filter_width(options.filter_width()); + options_builder.add_filter_height(options.filter_height()); + options_builder.add_fused_activation_function(tflite_activation); + + return options_builder.Finish().Union(); +} + +std::unique_ptr L2Pool2DChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new L2Pool2DChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/L2Pool2D.h b/compiler/tflchef/core/src/Op/L2Pool2D.h new file mode 100644 index 0000000..6bd8bdb --- /dev/null +++ b/compiler/tflchef/core/src/Op/L2Pool2D.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_L2_POOL_2D_H__ +#define __OP_L2_POOL_2D_H__ + +#include "OpChef.h" + +class L2Pool2DChef final : public OpChef +{ +public: + explicit L2Pool2DChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_L2_POOL_2D; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_Pool2DOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct L2Pool2DChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_L2_POOL_2D_H__ diff --git a/compiler/tflchef/core/src/Op/LeakyRelu.cpp b/compiler/tflchef/core/src/Op/LeakyRelu.cpp new file mode 100644 index 0000000..247739a --- /dev/null +++ b/compiler/tflchef/core/src/Op/LeakyRelu.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LeakyRelu.h" + +flatbuffers::Offset LeakyReluChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + assert(_operation->has_leaky_relu_options()); + + const auto &options = _operation->leaky_relu_options(); + + tflite::LeakyReluOptionsBuilder options_builder{fbb}; + options_builder.add_alpha(options.alpha()); + + return options_builder.Finish().Union(); +} + +std::unique_ptr LeakyReluChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LeakyReluChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/LeakyRelu.h b/compiler/tflchef/core/src/Op/LeakyRelu.h new file mode 100644 index 0000000..5449e59 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LeakyRelu.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LEAKY_RELU_H__ +#define __OP_LEAKY_RELU_H__ + +#include "OpChef.h" + +class LeakyReluChef final : public OpChef +{ +public: + explicit LeakyReluChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LEAKY_RELU; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_LeakyReluOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LeakyReluChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LEAKY_RELU_H__ diff --git a/compiler/tflchef/core/src/Op/Less.cpp b/compiler/tflchef/core/src/Op/Less.cpp new file mode 100644 index 0000000..c143d83 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Less.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Less.h" + +flatbuffers::Offset LessChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::LessOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr LessChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LessChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Less.h b/compiler/tflchef/core/src/Op/Less.h new file mode 100644 index 0000000..280036c --- /dev/null +++ b/compiler/tflchef/core/src/Op/Less.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LESS_H__ +#define __OP_LESS_H__ + +#include "OpChef.h" + +class LessChef final : public OpChef +{ +public: + explicit LessChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LESS; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_LessOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LessChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LESS_H__ diff --git a/compiler/tflchef/core/src/Op/LessEqual.cpp b/compiler/tflchef/core/src/Op/LessEqual.cpp new file mode 100644 index 0000000..dc383e7 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LessEqual.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LessEqual.h" + +flatbuffers::Offset LessEqualChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::LessEqualOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr LessEqualChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LessEqualChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/LessEqual.h b/compiler/tflchef/core/src/Op/LessEqual.h new file mode 100644 index 0000000..1315b9c --- /dev/null +++ b/compiler/tflchef/core/src/Op/LessEqual.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LESSEQUAL_H__ +#define __OP_LESSEQUAL_H__ + +#include "OpChef.h" + +class LessEqualChef final : public OpChef +{ +public: + explicit LessEqualChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LESS_EQUAL; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_LessEqualOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LessEqualChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LESSEQUAL_H__ diff --git a/compiler/tflchef/core/src/Op/LocalResponseNormalization.cpp b/compiler/tflchef/core/src/Op/LocalResponseNormalization.cpp new file mode 100644 index 0000000..f5430d4 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LocalResponseNormalization.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LocalResponseNormalization.h" +#include "Convert.h" + +#include + +flatbuffers::Offset +LocalResponseNormalizationChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_local_response_normalization_options()); + + auto &lrn_options = operation.local_response_normalization_options(); + + auto tflite_radius = lrn_options.radius(); + auto tflite_bias = lrn_options.bias(); + auto tflite_alpha = lrn_options.alpha(); + auto tflite_beta = lrn_options.beta(); + + tflite::LocalResponseNormalizationOptionsBuilder lrn_options_builder{fbb}; + + lrn_options_builder.add_radius(tflite_radius); + lrn_options_builder.add_bias(tflite_bias); + lrn_options_builder.add_alpha(tflite_alpha); + lrn_options_builder.add_beta(tflite_beta); + + return lrn_options_builder.Finish().Union(); +} + +std::unique_ptr +LocalResponseNormalizationChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LocalResponseNormalizationChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/LocalResponseNormalization.h b/compiler/tflchef/core/src/Op/LocalResponseNormalization.h new file mode 100644 index 0000000..62a2355 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LocalResponseNormalization.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LOCAL_RESPONSE_NORMALIZATION_H__ +#define __OP_LOCAL_RESPONSE_NORMALIZATION_H__ + +#include "OpChef.h" + +class LocalResponseNormalizationChef final : public OpChef +{ +public: + explicit LocalResponseNormalizationChef(const tflchef::Operation *operation) + : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_LocalResponseNormalizationOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LocalResponseNormalizationChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LOCAL_RESPONSE_NORMALIZATION_H__ diff --git a/compiler/tflchef/core/src/Op/Log.cpp b/compiler/tflchef/core/src/Op/Log.cpp new file mode 100644 index 0000000..c4e65ad --- /dev/null +++ b/compiler/tflchef/core/src/Op/Log.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Log.h" + +flatbuffers::Offset LogChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Log. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr LogChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LogChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Log.h b/compiler/tflchef/core/src/Op/Log.h new file mode 100644 index 0000000..2cc8a66 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Log.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LOG_H__ +#define __OP_LOG_H__ + +#include "OpChef.h" + +class LogChef final : public OpChef +{ +public: + explicit LogChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LOG; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LogChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LOG_H__ diff --git a/compiler/tflchef/core/src/Op/LogSoftmax.cpp b/compiler/tflchef/core/src/Op/LogSoftmax.cpp new file mode 100644 index 0000000..eb2f132 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LogSoftmax.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogSoftmax.h" +#include "Convert.h" + +#include + +flatbuffers::Offset LogSoftmaxChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::LogSoftmaxOptionsBuilder soft_options_builder{fbb}; + + return soft_options_builder.Finish().Union(); +} + +std::unique_ptr LogSoftmaxChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LogSoftmaxChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/LogSoftmax.h b/compiler/tflchef/core/src/Op/LogSoftmax.h new file mode 100644 index 0000000..3ce08b7 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LogSoftmax.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LOG_SOFTMAX_H__ +#define __OP_LOG_SOFTMAX_H__ + +#include "OpChef.h" + +class LogSoftmaxChef final : public OpChef +{ +public: + explicit LogSoftmaxChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LOG_SOFTMAX; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_LogSoftmaxOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LogSoftmaxChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LOG_SOFTMAX_H__ diff --git a/compiler/tflchef/core/src/Op/LogicalAnd.cpp b/compiler/tflchef/core/src/Op/LogicalAnd.cpp new file mode 100644 index 0000000..64a6113 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LogicalAnd.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogicalAnd.h" + +flatbuffers::Offset LogicalAndChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::LogicalAndOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr LogicalAndChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LogicalAndChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/LogicalAnd.h b/compiler/tflchef/core/src/Op/LogicalAnd.h new file mode 100644 index 0000000..1f27227 --- /dev/null +++ b/compiler/tflchef/core/src/Op/LogicalAnd.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LOGICALAND_H__ +#define __OP_LOGICALAND_H__ + +#include "OpChef.h" + +class LogicalAndChef final : public OpChef +{ +public: + explicit LogicalAndChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LOGICAL_AND; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_LogicalAndOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LogicalAndChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LOGICALAND_H__ diff --git a/compiler/tflchef/core/src/Op/Logistic.cpp b/compiler/tflchef/core/src/Op/Logistic.cpp new file mode 100644 index 0000000..4a58082 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Logistic.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Logistic.h" + +flatbuffers::Offset LogisticChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Logistic. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr LogisticChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new LogisticChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Logistic.h b/compiler/tflchef/core/src/Op/Logistic.h new file mode 100644 index 0000000..c158af3 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Logistic.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_LOGISTIC_H__ +#define __OP_LOGISTIC_H__ + +#include "OpChef.h" + +class LogisticChef final : public OpChef +{ +public: + explicit LogisticChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_LOGISTIC; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct LogisticChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_LOGISTIC_H__ diff --git a/compiler/tflchef/core/src/Op/MatrixDiag.cpp b/compiler/tflchef/core/src/Op/MatrixDiag.cpp new file mode 100644 index 0000000..de505c0 --- /dev/null +++ b/compiler/tflchef/core/src/Op/MatrixDiag.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixDiag.h" + +flatbuffers::Offset MatrixDiagChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::MatrixDiagOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr MatrixDiagChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MatrixDiagChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/MatrixDiag.h b/compiler/tflchef/core/src/Op/MatrixDiag.h new file mode 100644 index 0000000..cbadf6b --- /dev/null +++ b/compiler/tflchef/core/src/Op/MatrixDiag.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MATRIX_DIAG_H__ +#define __OP_MATRIX_DIAG_H__ + +#include "OpChef.h" + +class MatrixDiagChef final : public OpChef +{ +public: + explicit MatrixDiagChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_MATRIX_DIAG; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_MatrixDiagOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MatrixDiagChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MATRIX_DIAG_H__ diff --git a/compiler/tflchef/core/src/Op/MatrixSetDiag.cpp b/compiler/tflchef/core/src/Op/MatrixSetDiag.cpp new file mode 100644 index 0000000..0a4ee71 --- /dev/null +++ b/compiler/tflchef/core/src/Op/MatrixSetDiag.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixSetDiag.h" + +flatbuffers::Offset MatrixSetDiagChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::MatrixSetDiagOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr MatrixSetDiagChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MatrixSetDiagChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/MatrixSetDiag.h b/compiler/tflchef/core/src/Op/MatrixSetDiag.h new file mode 100644 index 0000000..8114d32 --- /dev/null +++ b/compiler/tflchef/core/src/Op/MatrixSetDiag.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MATRIX_SET_DIAG_H__ +#define __OP_MATRIX_SET_DIAG_H__ + +#include "OpChef.h" + +class MatrixSetDiagChef final : public OpChef +{ +public: + explicit MatrixSetDiagChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_MATRIX_SET_DIAG; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_MatrixSetDiagOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MatrixSetDiagChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MATRIX_SET_DIAG_H__ diff --git a/compiler/tflchef/core/src/Op/Maximum.cpp b/compiler/tflchef/core/src/Op/Maximum.cpp new file mode 100644 index 0000000..8f415e2 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Maximum.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Maximum.h" +#include "Convert.h" + +#include + +flatbuffers::Offset MaximumChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::MaximumMinimumOptionsBuilder maximum_options_builder{fbb}; + return maximum_options_builder.Finish().Union(); +} + +std::unique_ptr MaximumChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MaximumChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Maximum.h b/compiler/tflchef/core/src/Op/Maximum.h new file mode 100644 index 0000000..53e9524 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Maximum.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MAXIMUM_H__ +#define __OP_MAXIMUM_H__ + +#include "OpChef.h" + +class MaximumChef final : public OpChef +{ +public: + explicit MaximumChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_MAXIMUM; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_MaximumMinimumOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MaximumChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MAXIMUM_H__ diff --git a/compiler/tflchef/core/src/Op/Minimum.cpp b/compiler/tflchef/core/src/Op/Minimum.cpp new file mode 100644 index 0000000..cc0c919 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Minimum.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Minimum.h" +#include "Convert.h" + +#include + +flatbuffers::Offset MinimumChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::MaximumMinimumOptionsBuilder minimum_options_builder{fbb}; + return minimum_options_builder.Finish().Union(); +} + +std::unique_ptr MinimumChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MinimumChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Minimum.h b/compiler/tflchef/core/src/Op/Minimum.h new file mode 100644 index 0000000..3990e1e --- /dev/null +++ b/compiler/tflchef/core/src/Op/Minimum.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MINIMUM_H__ +#define __OP_MINIMUM_H__ + +#include "OpChef.h" + +class MinimumChef final : public OpChef +{ +public: + explicit MinimumChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_MINIMUM; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_MaximumMinimumOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MinimumChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MINIMUM_H__ diff --git a/compiler/tflchef/core/src/Op/MirrorPad.cpp b/compiler/tflchef/core/src/Op/MirrorPad.cpp new file mode 100644 index 0000000..2d68b69 --- /dev/null +++ b/compiler/tflchef/core/src/Op/MirrorPad.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MirrorPad.h" +#include "Convert.h" + +#include + +flatbuffers::Offset MirrorPadChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_mirrorpad_options()); + + auto options = operation.mirrorpad_options(); + + auto tflite_mode = as_tflite_mirrorpadmode(options.mode()); + + tflite::MirrorPadOptionsBuilder options_builder{fbb}; + options_builder.add_mode(tflite_mode); + + return options_builder.Finish().Union(); +} + +std::unique_ptr MirrorPadChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new MirrorPadChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/MirrorPad.h b/compiler/tflchef/core/src/Op/MirrorPad.h new file mode 100644 index 0000000..49461df --- /dev/null +++ b/compiler/tflchef/core/src/Op/MirrorPad.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_MIRRORPAD_H__ +#define __OP_MIRRORPAD_H__ + +#include "OpChef.h" + +class MirrorPadChef final : public OpChef +{ +public: + explicit MirrorPadChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_MIRROR_PAD; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_MirrorPadOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct MirrorPadChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_MIRRORPAD_H__ diff --git a/compiler/tflchef/core/src/Op/Neg.cpp b/compiler/tflchef/core/src/Op/Neg.cpp new file mode 100644 index 0000000..0e9fb93 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Neg.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Neg.h" +#include "Convert.h" + +flatbuffers::Offset NegChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::NegOptionsBuilder neg_options_builder{fbb}; + + return neg_options_builder.Finish().Union(); +} + +std::unique_ptr NegChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new NegChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Neg.h b/compiler/tflchef/core/src/Op/Neg.h new file mode 100644 index 0000000..f7a2692 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Neg.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_NEG_H__ +#define __OP_NEG_H__ + +#include "OpChef.h" + +class NegChef final : public OpChef +{ +public: + explicit NegChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_NEG; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NegOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct NegChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_NEG_H__ diff --git a/compiler/tflchef/core/src/Op/NotEqual.cpp b/compiler/tflchef/core/src/Op/NotEqual.cpp new file mode 100644 index 0000000..a408266 --- /dev/null +++ b/compiler/tflchef/core/src/Op/NotEqual.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "NotEqual.h" + +flatbuffers::Offset NotEqualChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::NotEqualOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr NotEqualChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new NotEqualChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/NotEqual.h b/compiler/tflchef/core/src/Op/NotEqual.h new file mode 100644 index 0000000..3fd2547 --- /dev/null +++ b/compiler/tflchef/core/src/Op/NotEqual.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_NOT_EQUAL_H__ +#define __OP_NOT_EQUAL_H__ + +#include "OpChef.h" + +class NotEqualChef final : public OpChef +{ +public: + explicit NotEqualChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_NOT_EQUAL; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_NotEqualOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct NotEqualChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_NOT_EQUAL_H__ diff --git a/compiler/tflchef/core/src/Op/OneHot.cpp b/compiler/tflchef/core/src/Op/OneHot.cpp new file mode 100644 index 0000000..421e50c --- /dev/null +++ b/compiler/tflchef/core/src/Op/OneHot.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "OneHot.h" +#include "Convert.h" + +#include + +flatbuffers::Offset OneHotChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_onehot_options()); + + auto options = operation.onehot_options(); + + tflite::OneHotOptionsBuilder options_builder{fbb}; + + options_builder.add_axis(options.axis()); + return options_builder.Finish().Union(); +} + +std::unique_ptr OneHotChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new OneHotChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/OneHot.h b/compiler/tflchef/core/src/Op/OneHot.h new file mode 100644 index 0000000..b29cb79 --- /dev/null +++ b/compiler/tflchef/core/src/Op/OneHot.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ONEHOT_H__ +#define __OP_ONEHOT_H__ + +#include "OpChef.h" + +class OneHotChef final : public OpChef +{ +public: + explicit OneHotChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ONE_HOT; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_OneHotOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct OneHotChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ONEHOT_H__ diff --git a/compiler/tflchef/core/src/Op/PRelu.cpp b/compiler/tflchef/core/src/Op/PRelu.cpp new file mode 100644 index 0000000..30e8b8e --- /dev/null +++ b/compiler/tflchef/core/src/Op/PRelu.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PRelu.h" +#include "Convert.h" + +#include + +flatbuffers::Offset PReluChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No option for PRelu + return flatbuffers::Offset(); +} + +std::unique_ptr PReluChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new PReluChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/PRelu.h b/compiler/tflchef/core/src/Op/PRelu.h new file mode 100644 index 0000000..4a5a935 --- /dev/null +++ b/compiler/tflchef/core/src/Op/PRelu.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_PRELU_H__ +#define __OP_PRELU_H__ + +#include "OpChef.h" + +class PReluChef final : public OpChef +{ +public: + explicit PReluChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_PRELU; } + + // no builtin options for PRelu + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct PReluChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_PRELU_H__ diff --git a/compiler/tflchef/core/src/Op/Pow.cpp b/compiler/tflchef/core/src/Op/Pow.cpp new file mode 100644 index 0000000..25e1802 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Pow.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Pow.h" +#include "Convert.h" + +#include + +flatbuffers::Offset PowChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::PowOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr PowChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new PowChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Pow.h b/compiler/tflchef/core/src/Op/Pow.h new file mode 100644 index 0000000..f2d809e --- /dev/null +++ b/compiler/tflchef/core/src/Op/Pow.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_POW_H__ +#define __OP_POW_H__ + +#include "OpChef.h" + +class PowChef final : public OpChef +{ +public: + explicit PowChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_POW; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_PowOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct PowChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_POW_H__ diff --git a/compiler/tflchef/core/src/Op/Range.cpp b/compiler/tflchef/core/src/Op/Range.cpp new file mode 100644 index 0000000..189c465 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Range.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Range.h" + +#include +#include + +flatbuffers::Offset RangeChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::RangeOptionsBuilder options_builder{fbb}; + return options_builder.Finish().Union(); +} + +std::unique_ptr RangeChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new RangeChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Range.h b/compiler/tflchef/core/src/Op/Range.h new file mode 100644 index 0000000..f294d15 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Range.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_RANGE_H__ +#define __OP_RANGE_H__ + +#include "OpChef.h" + +class RangeChef final : public OpChef +{ +public: + explicit RangeChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_RANGE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_RangeOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct RangeChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_RANGE_H__ diff --git a/compiler/tflchef/core/src/Op/Rank.cpp b/compiler/tflchef/core/src/Op/Rank.cpp new file mode 100644 index 0000000..4eb2aa7 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Rank.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Rank.h" + +flatbuffers::Offset RankChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::RankOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr RankChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new RankChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Rank.h b/compiler/tflchef/core/src/Op/Rank.h new file mode 100644 index 0000000..0bce380 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Rank.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_RANK_H__ +#define __OP_RANK_H__ + +#include "OpChef.h" + +class RankChef final : public OpChef +{ +public: + explicit RankChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_RANK; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_RankOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct RankChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_RANK_H__ diff --git a/compiler/tflchef/core/src/Op/ReLUN1To1.cpp b/compiler/tflchef/core/src/Op/ReLUN1To1.cpp new file mode 100644 index 0000000..d57e823 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReLUN1To1.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReLUN1To1.h" + +flatbuffers::Offset ReLUN1To1Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + return flatbuffers::Offset(); +} + +std::unique_ptr ReLUN1To1ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReLUN1To1Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReLUN1To1.h b/compiler/tflchef/core/src/Op/ReLUN1To1.h new file mode 100644 index 0000000..e034c79 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReLUN1To1.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_RELU_N1_TO_1_H__ +#define __OP_RELU_N1_TO_1_H__ + +#include "OpChef.h" + +class ReLUN1To1Chef final : public OpChef +{ +public: + explicit ReLUN1To1Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_RELU_N1_TO_1; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReLUN1To1ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_RELU_N1_TO_1_H__ diff --git a/compiler/tflchef/core/src/Op/ReduceAny.cpp b/compiler/tflchef/core/src/Op/ReduceAny.cpp new file mode 100644 index 0000000..c94c8a3 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceAny.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceAny.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ReduceAnyChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_reduce_any_options()); + + auto keep_dims = operation.reduce_any_options().keep_dims(); + + tflite::ReducerOptionsBuilder reducer_options_builder{fbb}; + reducer_options_builder.add_keep_dims(keep_dims); + + return reducer_options_builder.Finish().Union(); +} + +std::unique_ptr ReduceAnyChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReduceAnyChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReduceAny.h b/compiler/tflchef/core/src/Op/ReduceAny.h new file mode 100644 index 0000000..cf65317 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceAny.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REDUCE_ANY_H__ +#define __OP_REDUCE_ANY_H__ + +#include "OpChef.h" + +class ReduceAnyChef final : public OpChef +{ +public: + explicit ReduceAnyChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_REDUCE_ANY; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ReducerOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReduceAnyChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REDUCE_ANY_H__ diff --git a/compiler/tflchef/core/src/Op/ReduceMax.cpp b/compiler/tflchef/core/src/Op/ReduceMax.cpp new file mode 100644 index 0000000..31543cd --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceMax.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceMax.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ReduceMaxChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_reduce_max_options()); + + auto keep_dims = operation.reduce_max_options().keep_dims(); + + tflite::ReducerOptionsBuilder reduce_max_options_builder{fbb}; + reduce_max_options_builder.add_keep_dims(keep_dims); + + return reduce_max_options_builder.Finish().Union(); +} + +std::unique_ptr ReduceMaxChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReduceMaxChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReduceMax.h b/compiler/tflchef/core/src/Op/ReduceMax.h new file mode 100644 index 0000000..854c5b8 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceMax.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REDUCEMAX_H__ +#define __OP_REDUCEMAX_H__ + +#include "OpChef.h" + +class ReduceMaxChef final : public OpChef +{ +public: + explicit ReduceMaxChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_REDUCE_MAX; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ReducerOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReduceMaxChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REDUCEMAX_H__ diff --git a/compiler/tflchef/core/src/Op/ReduceMin.cpp b/compiler/tflchef/core/src/Op/ReduceMin.cpp new file mode 100644 index 0000000..e194a18 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceMin.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceMin.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ReduceMinChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_reduce_min_options()); + + auto keep_dims = operation.reduce_min_options().keep_dims(); + + tflite::ReducerOptionsBuilder reduce_min_options_builder{fbb}; + reduce_min_options_builder.add_keep_dims(keep_dims); + + return reduce_min_options_builder.Finish().Union(); +} + +std::unique_ptr ReduceMinChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReduceMinChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReduceMin.h b/compiler/tflchef/core/src/Op/ReduceMin.h new file mode 100644 index 0000000..f29d273 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceMin.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REDUCEMIN_H__ +#define __OP_REDUCEMIN_H__ + +#include "OpChef.h" + +class ReduceMinChef final : public OpChef +{ +public: + explicit ReduceMinChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_REDUCE_MIN; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ReducerOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReduceMinChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REDUCEMIN_H__ diff --git a/compiler/tflchef/core/src/Op/ReduceProd.cpp b/compiler/tflchef/core/src/Op/ReduceProd.cpp new file mode 100644 index 0000000..c89aca2 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceProd.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceProd.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ReduceProdChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_reduce_prod_options()); + + auto keep_dims = operation.reduce_prod_options().keep_dims(); + + tflite::ReducerOptionsBuilder reducer_options_builder{fbb}; + reducer_options_builder.add_keep_dims(keep_dims); + + return reducer_options_builder.Finish().Union(); +} + +std::unique_ptr ReduceProdChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReduceProdChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReduceProd.h b/compiler/tflchef/core/src/Op/ReduceProd.h new file mode 100644 index 0000000..d5a11fd --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReduceProd.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REDUCE_PROD_H__ +#define __OP_REDUCE_PROD_H__ + +#include "OpChef.h" + +class ReduceProdChef final : public OpChef +{ +public: + explicit ReduceProdChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_REDUCE_PROD; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ReducerOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReduceProdChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REDUCE_PROD_H__ diff --git a/compiler/tflchef/core/src/Op/Reshape.cpp b/compiler/tflchef/core/src/Op/Reshape.cpp index 99555e8..01e5219 100644 --- a/compiler/tflchef/core/src/Op/Reshape.cpp +++ b/compiler/tflchef/core/src/Op/Reshape.cpp @@ -41,7 +41,8 @@ flatbuffers::Offset ReshapeChef::value(flatbuffers::FlatBufferBuilder &fbb { auto &operation = (*_operation); - assert(operation.has_reshape_options()); + if (!operation.has_reshape_options()) + return 0; auto options = operation.reshape_options(); auto shapes = vector_new_shape(options); diff --git a/compiler/tflchef/core/src/Op/ResizeBilinear.cpp b/compiler/tflchef/core/src/Op/ResizeBilinear.cpp new file mode 100644 index 0000000..3d9299c --- /dev/null +++ b/compiler/tflchef/core/src/Op/ResizeBilinear.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeBilinear.h" +#include "Convert.h" + +#include +#include + +flatbuffers::Offset ResizeBilinearChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_resize_bilinear_options()); + + auto options = operation.resize_bilinear_options(); + + tflite::ResizeBilinearOptionsBuilder options_builder{fbb}; + + options_builder.add_align_corners(options.align_corners()); + options_builder.add_half_pixel_centers(options.half_pixel_centers()); + + return options_builder.Finish().Union(); +} + +std::unique_ptr ResizeBilinearChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ResizeBilinearChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ResizeBilinear.h b/compiler/tflchef/core/src/Op/ResizeBilinear.h new file mode 100644 index 0000000..9bd6185 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ResizeBilinear.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_RESIZE_BILINEAR_H__ +#define __OP_RESIZE_BILINEAR_H__ + +#include "OpChef.h" + +class ResizeBilinearChef final : public OpChef +{ +public: + explicit ResizeBilinearChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_RESIZE_BILINEAR; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ResizeBilinearOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ResizeBilinearChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_RESIZE_BILINEAR_H__ diff --git a/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.cpp b/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.cpp new file mode 100644 index 0000000..1f93040 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeNearestNeighbor.h" +#include "Convert.h" + +#include +#include + +flatbuffers::Offset +ResizeNearestNeighborChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_resize_nearest_neighbor_options()); + + auto options = operation.resize_nearest_neighbor_options(); + + tflite::ResizeNearestNeighborOptionsBuilder options_builder{fbb}; + + options_builder.add_align_corners(options.align_corners()); + + return options_builder.Finish().Union(); +} + +std::unique_ptr +ResizeNearestNeighborChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ResizeNearestNeighborChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.h b/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.h new file mode 100644 index 0000000..e6ee832 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ResizeNearestNeighbor.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_RESIZE_NEAREST_NEIGHBOR_H__ +#define __OP_RESIZE_NEAREST_NEIGHBOR_H__ + +#include "OpChef.h" + +class ResizeNearestNeighborChef final : public OpChef +{ +public: + explicit ResizeNearestNeighborChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ResizeNearestNeighborOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ResizeNearestNeighborChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_RESIZE_NEAREST_NEIGHBOR_H__ diff --git a/compiler/tflchef/core/src/Op/ReverseSequence.cpp b/compiler/tflchef/core/src/Op/ReverseSequence.cpp new file mode 100644 index 0000000..9354117 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReverseSequence.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseSequence.h" + +flatbuffers::Offset ReverseSequenceChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_reverse_sequence_options()); + + auto options = operation.reverse_sequence_options(); + + auto tflite_seq_dim = options.seq_dim(); + auto tflite_batch_dim = options.batch_dim(); + + tflite::ReverseSequenceOptionsBuilder options_builder{fbb}; + + options_builder.add_seq_dim(tflite_seq_dim); + options_builder.add_batch_dim(tflite_batch_dim); + + return options_builder.Finish().Union(); +} + +std::unique_ptr +ReverseSequenceChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReverseSequenceChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReverseSequence.h b/compiler/tflchef/core/src/Op/ReverseSequence.h new file mode 100644 index 0000000..329505c --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReverseSequence.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REVERSE_SEQUENCE_H__ +#define __OP_REVERSE_SEQUENCE_H__ + +#include "OpChef.h" + +class ReverseSequenceChef final : public OpChef +{ +public: + explicit ReverseSequenceChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_REVERSE_SEQUENCE; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ReverseSequenceOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReverseSequenceChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REVERSE_SEQUENCE_H__ diff --git a/compiler/tflchef/core/src/Op/ReverseV2.cpp b/compiler/tflchef/core/src/Op/ReverseV2.cpp new file mode 100644 index 0000000..58ace1d --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReverseV2.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseV2.h" + +flatbuffers::Offset ReverseV2Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::ReverseV2OptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr ReverseV2ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ReverseV2Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ReverseV2.h b/compiler/tflchef/core/src/Op/ReverseV2.h new file mode 100644 index 0000000..a48a2d9 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ReverseV2.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_REVERSEV2_H__ +#define __OP_REVERSEV2_H__ + +#include "OpChef.h" + +class ReverseV2Chef final : public OpChef +{ +public: + explicit ReverseV2Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_REVERSE_V2; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ReverseV2Options; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ReverseV2ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_REVERSEV2_H__ diff --git a/compiler/tflchef/core/src/Op/Round.cpp b/compiler/tflchef/core/src/Op/Round.cpp new file mode 100644 index 0000000..e16c865 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Round.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Round.h" + +flatbuffers::Offset RoundChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Round. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr RoundChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new RoundChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Round.h b/compiler/tflchef/core/src/Op/Round.h new file mode 100644 index 0000000..7f0fbe3 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Round.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ROUND_H__ +#define __OP_ROUND_H__ + +#include "OpChef.h" + +class RoundChef final : public OpChef +{ +public: + explicit RoundChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ROUND; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct RoundChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ROUND_H__ diff --git a/compiler/tflchef/core/src/Op/ScatterNd.cpp b/compiler/tflchef/core/src/Op/ScatterNd.cpp new file mode 100644 index 0000000..7114dda --- /dev/null +++ b/compiler/tflchef/core/src/Op/ScatterNd.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ScatterNd.h" +#include "Convert.h" + +#include + +flatbuffers::Offset ScatterNdChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::ScatterNdOptionsBuilder scatter_nd_options_builder{fbb}; + + return scatter_nd_options_builder.Finish().Union(); +} + +std::unique_ptr ScatterNdChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ScatterNdChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ScatterNd.h b/compiler/tflchef/core/src/Op/ScatterNd.h new file mode 100644 index 0000000..2c89cf6 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ScatterNd.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SCATTER_ND_H__ +#define __OP_SCATTER_ND_H__ + +#include "OpChef.h" + +class ScatterNdChef final : public OpChef +{ +public: + explicit ScatterNdChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SCATTER_ND; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ScatterNdOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ScatterNdChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SCATTER_ND_H__ diff --git a/compiler/tflchef/core/src/Op/SegmentSum.cpp b/compiler/tflchef/core/src/Op/SegmentSum.cpp new file mode 100644 index 0000000..934bcb0 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SegmentSum.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SegmentSum.h" + +flatbuffers::Offset SegmentSumChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SegmentSumOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr SegmentSumChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SegmentSumChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SegmentSum.h b/compiler/tflchef/core/src/Op/SegmentSum.h new file mode 100644 index 0000000..c0ebfba --- /dev/null +++ b/compiler/tflchef/core/src/Op/SegmentSum.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SEGMENT_SUM_H__ +#define __OP_SEGMENT_SUM_H__ + +#include "OpChef.h" + +class SegmentSumChef final : public OpChef +{ +public: + explicit SegmentSumChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SEGMENT_SUM; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SegmentSumOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SegmentSumChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SEGMENT_SUM_H__ diff --git a/compiler/tflchef/core/src/Op/Select.cpp b/compiler/tflchef/core/src/Op/Select.cpp new file mode 100644 index 0000000..31be736 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Select.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Select.h" + +flatbuffers::Offset SelectChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SelectOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr SelectChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SelectChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Select.h b/compiler/tflchef/core/src/Op/Select.h new file mode 100644 index 0000000..91ace16 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Select.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SELECT_H__ +#define __OP_SELECT_H__ + +#include "OpChef.h" + +class SelectChef final : public OpChef +{ +public: + explicit SelectChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SELECT; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SelectOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SelectChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SELECT_H__ diff --git a/compiler/tflchef/core/src/Op/SelectV2.cpp b/compiler/tflchef/core/src/Op/SelectV2.cpp new file mode 100644 index 0000000..f6c0bfc --- /dev/null +++ b/compiler/tflchef/core/src/Op/SelectV2.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SelectV2.h" + +flatbuffers::Offset SelectV2Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SelectV2OptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr SelectV2ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SelectV2Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SelectV2.h b/compiler/tflchef/core/src/Op/SelectV2.h new file mode 100644 index 0000000..36d74c3 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SelectV2.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SELECT_V2_H__ +#define __OP_SELECT_V2_H__ + +#include "OpChef.h" + +class SelectV2Chef final : public OpChef +{ +public: + explicit SelectV2Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SELECT_V2; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SelectV2Options; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SelectV2ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SELECT_V2_H__ diff --git a/compiler/tflchef/core/src/Op/Sin.cpp b/compiler/tflchef/core/src/Op/Sin.cpp new file mode 100644 index 0000000..1752ce7 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Sin.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Sin.h" + +flatbuffers::Offset SinChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + // No tflite option for Sin. Use void. + return flatbuffers::Offset(); +} + +std::unique_ptr SinChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SinChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Sin.h b/compiler/tflchef/core/src/Op/Sin.h new file mode 100644 index 0000000..121b73b --- /dev/null +++ b/compiler/tflchef/core/src/Op/Sin.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SIN_H__ +#define __OP_SIN_H__ + +#include "OpChef.h" + +class SinChef final : public OpChef +{ +public: + explicit SinChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SIN; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_NONE; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SinChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SIN_H__ diff --git a/compiler/tflchef/core/src/Op/Slice.cpp b/compiler/tflchef/core/src/Op/Slice.cpp new file mode 100644 index 0000000..27ae80a --- /dev/null +++ b/compiler/tflchef/core/src/Op/Slice.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Slice.h" +#include "Convert.h" + +#include + +flatbuffers::Offset SliceChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SliceOptionsBuilder slice_options_builder{fbb}; + return slice_options_builder.Finish().Union(); +} + +std::unique_ptr SliceChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SliceChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Slice.h b/compiler/tflchef/core/src/Op/Slice.h new file mode 100644 index 0000000..06fd634 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Slice.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SLICE_H__ +#define __OP_SLICE_H__ + +#include "OpChef.h" + +class SliceChef final : public OpChef +{ +public: + explicit SliceChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SLICE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SliceOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SliceChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SLICE_H__ diff --git a/compiler/tflchef/core/src/Op/SpaceToBatchND.cpp b/compiler/tflchef/core/src/Op/SpaceToBatchND.cpp new file mode 100644 index 0000000..74e0528 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SpaceToBatchND.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToBatchND.h" + +#include + +flatbuffers::Offset SpaceToBatchNDChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SpaceToBatchNDOptionsBuilder space_to_batch_nd_options_builder{fbb}; + + return space_to_batch_nd_options_builder.Finish().Union(); +} + +std::unique_ptr SpaceToBatchNDChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SpaceToBatchNDChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SpaceToBatchND.h b/compiler/tflchef/core/src/Op/SpaceToBatchND.h new file mode 100644 index 0000000..e263bdc --- /dev/null +++ b/compiler/tflchef/core/src/Op/SpaceToBatchND.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SPACETOBATCHND_H__ +#define __OP_SPACETOBATCHND_H__ + +#include "OpChef.h" + +class SpaceToBatchNDChef final : public OpChef +{ +public: + explicit SpaceToBatchNDChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_SPACE_TO_BATCH_ND; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SpaceToBatchNDOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SpaceToBatchNDChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SPACETOBATCHND_H__ diff --git a/compiler/tflchef/core/src/Op/SpaceToDepth.cpp b/compiler/tflchef/core/src/Op/SpaceToDepth.cpp new file mode 100644 index 0000000..98eed8c --- /dev/null +++ b/compiler/tflchef/core/src/Op/SpaceToDepth.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToDepth.h" + +#include + +flatbuffers::Offset SpaceToDepthChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_space_to_depth_options()); + + auto tflite_block_size = operation.space_to_depth_options().block_size(); + + tflite::SpaceToDepthOptionsBuilder std_options_builder{fbb}; + std_options_builder.add_block_size(tflite_block_size); + + return std_options_builder.Finish().Union(); +} + +std::unique_ptr SpaceToDepthChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SpaceToDepthChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SpaceToDepth.h b/compiler/tflchef/core/src/Op/SpaceToDepth.h new file mode 100644 index 0000000..db852fe --- /dev/null +++ b/compiler/tflchef/core/src/Op/SpaceToDepth.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SPACETODEPTH_H__ +#define __OP_SPACETODEPTH_H__ + +#include "OpChef.h" + +class SpaceToDepthChef final : public OpChef +{ +public: + explicit SpaceToDepthChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_SPACE_TO_DEPTH; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SpaceToDepthOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SpaceToDepthChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SPACETODEPTH_H__ diff --git a/compiler/tflchef/core/src/Op/SparseToDense.cpp b/compiler/tflchef/core/src/Op/SparseToDense.cpp new file mode 100644 index 0000000..f1f8a71 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SparseToDense.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SparseToDense.h" +#include "Convert.h" + +#include + +flatbuffers::Offset SparseToDenseChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_sparse_to_dense_options()); + + auto tflite_validate_indices = operation.sparse_to_dense_options().validate_indices(); + + tflite::SparseToDenseOptionsBuilder sparse_to_dense_options_builder(fbb); + sparse_to_dense_options_builder.add_validate_indices(tflite_validate_indices); + + return sparse_to_dense_options_builder.Finish().Union(); +} + +std::unique_ptr SparseToDenseChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SparseToDenseChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SparseToDense.h b/compiler/tflchef/core/src/Op/SparseToDense.h new file mode 100644 index 0000000..02cbd6a --- /dev/null +++ b/compiler/tflchef/core/src/Op/SparseToDense.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SPARSETODENSE_H__ +#define __OP_SPARSETODENSE_H__ + +#include "OpChef.h" + +class SparseToDenseChef final : public OpChef +{ +public: + explicit SparseToDenseChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_SPARSE_TO_DENSE; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SparseToDenseOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SparseToDenseChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SPARSETODENSE_H__ diff --git a/compiler/tflchef/core/src/Op/Split.cpp b/compiler/tflchef/core/src/Op/Split.cpp new file mode 100644 index 0000000..f4704e5 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Split.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Split.h" +#include "Convert.h" + +#include + +flatbuffers::Offset SplitChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_split_options()); + + auto num_splits = operation.split_options().num_splits(); + + tflite::SplitOptionsBuilder split_options_builder{fbb}; + split_options_builder.add_num_splits(num_splits); + + return split_options_builder.Finish().Union(); +} + +std::unique_ptr SplitChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SplitChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Split.h b/compiler/tflchef/core/src/Op/Split.h new file mode 100644 index 0000000..db61580 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Split.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SPLIT_H__ +#define __OP_SPLIT_H__ + +#include "OpChef.h" + +class SplitChef final : public OpChef +{ +public: + explicit SplitChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SPLIT; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SplitOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SplitChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SPLIT_H__ diff --git a/compiler/tflchef/core/src/Op/SplitV.cpp b/compiler/tflchef/core/src/Op/SplitV.cpp new file mode 100644 index 0000000..fa93db6 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SplitV.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SplitV.h" +#include "Convert.h" + +#include + +flatbuffers::Offset SplitVChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_split_v_options()); + + auto num_splits = operation.split_v_options().num_splits(); + + tflite::SplitVOptionsBuilder split_v_options_builder{fbb}; + split_v_options_builder.add_num_splits(num_splits); + + return split_v_options_builder.Finish().Union(); +} + +std::unique_ptr SplitVChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SplitVChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SplitV.h b/compiler/tflchef/core/src/Op/SplitV.h new file mode 100644 index 0000000..c37736e --- /dev/null +++ b/compiler/tflchef/core/src/Op/SplitV.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SPLIT_V_H__ +#define __OP_SPLIT_V_H__ + +#include "OpChef.h" + +class SplitVChef final : public OpChef +{ +public: + explicit SplitVChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SPLIT_V; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SplitVOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SplitVChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SPLIT_V_H__ diff --git a/compiler/tflchef/core/src/Op/Square.cpp b/compiler/tflchef/core/src/Op/Square.cpp new file mode 100644 index 0000000..fd35380 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Square.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Square.h" + +flatbuffers::Offset SquareChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SquareOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr SquareChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SquareChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Square.h b/compiler/tflchef/core/src/Op/Square.h new file mode 100644 index 0000000..5b76e63 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Square.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SQUARE_H__ +#define __OP_SQUARE_H__ + +#include "OpChef.h" + +class SquareChef final : public OpChef +{ +public: + explicit SquareChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SQUARE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SquareOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SquareChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SQUARE_H__ diff --git a/compiler/tflchef/core/src/Op/SquaredDifference.cpp b/compiler/tflchef/core/src/Op/SquaredDifference.cpp new file mode 100644 index 0000000..757c148 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SquaredDifference.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SquaredDifference.h" + +flatbuffers::Offset SquaredDifferenceChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::SquaredDifferenceOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr +SquaredDifferenceChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SquaredDifferenceChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/SquaredDifference.h b/compiler/tflchef/core/src/Op/SquaredDifference.h new file mode 100644 index 0000000..f919975 --- /dev/null +++ b/compiler/tflchef/core/src/Op/SquaredDifference.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SQUAREDDIFFERENCE_H__ +#define __OP_SQUAREDDIFFERENCE_H__ + +#include "OpChef.h" + +class SquaredDifferenceChef final : public OpChef +{ +public: + explicit SquaredDifferenceChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_SQUARED_DIFFERENCE; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_SquaredDifferenceOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SquaredDifferenceChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SQUAREDDIFFERENCE_H__ diff --git a/compiler/tflchef/core/src/Op/Squeeze.cpp b/compiler/tflchef/core/src/Op/Squeeze.cpp new file mode 100644 index 0000000..8d6ef42 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Squeeze.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Squeeze.h" +#include "Convert.h" + +#include +#include + +flatbuffers::Offset SqueezeChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_squeeze_options()); + + const auto &options = operation.squeeze_options(); + // Note: 'CreateVector' should be placed before 'CreateOptions' + // Read flatbuffers.h 'void NotNested()' for more information + auto fb_squeeze_dims = + fbb.CreateVector(options.squeeze_dim().data(), options.squeeze_dim().size()); + + return tflite::CreateSqueezeOptions(fbb, fb_squeeze_dims).Union(); +} + +std::unique_ptr SqueezeChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SqueezeChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Squeeze.h b/compiler/tflchef/core/src/Op/Squeeze.h new file mode 100644 index 0000000..2787231 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Squeeze.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SQUEEZE_H__ +#define __OP_SQUEEZE_H__ + +#include "OpChef.h" + +class SqueezeChef final : public OpChef +{ +public: + explicit SqueezeChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SQUEEZE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_SqueezeOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SqueezeChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SQUEEZE_H__ diff --git a/compiler/tflchef/core/src/Op/StridedSlice.cpp b/compiler/tflchef/core/src/Op/StridedSlice.cpp new file mode 100644 index 0000000..587a95c --- /dev/null +++ b/compiler/tflchef/core/src/Op/StridedSlice.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "StridedSlice.h" +#include "Convert.h" + +#include + +flatbuffers::Offset StridedSliceChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_strided_slice_options()); + + tflite::StridedSliceOptionsBuilder strided_slice_options_builder{fbb}; + strided_slice_options_builder.add_begin_mask(operation.strided_slice_options().begin_mask()); + strided_slice_options_builder.add_end_mask(operation.strided_slice_options().end_mask()); + strided_slice_options_builder.add_ellipsis_mask( + operation.strided_slice_options().ellipsis_mask()); + strided_slice_options_builder.add_new_axis_mask( + operation.strided_slice_options().new_axis_mask()); + strided_slice_options_builder.add_shrink_axis_mask( + operation.strided_slice_options().shrink_axis_mask()); + + return strided_slice_options_builder.Finish().Union(); +} + +std::unique_ptr StridedSliceChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new StridedSliceChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/StridedSlice.h b/compiler/tflchef/core/src/Op/StridedSlice.h new file mode 100644 index 0000000..49da44f --- /dev/null +++ b/compiler/tflchef/core/src/Op/StridedSlice.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_STRIDEDSLICE_H__ +#define __OP_STRIDEDSLICE_H__ + +#include "OpChef.h" + +class StridedSliceChef final : public OpChef +{ +public: + explicit StridedSliceChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_STRIDED_SLICE; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_StridedSliceOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct StridedSliceChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_STRIDEDSLICE_H__ diff --git a/compiler/tflchef/core/src/Op/Sum.cpp b/compiler/tflchef/core/src/Op/Sum.cpp new file mode 100644 index 0000000..6b79d3e --- /dev/null +++ b/compiler/tflchef/core/src/Op/Sum.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Sum.h" +#include "Convert.h" + +#include + +flatbuffers::Offset SumChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_sum_options()); + + auto keep_dims = operation.sum_options().keep_dims(); + + tflite::ReducerOptionsBuilder sum_options_builder{fbb}; + sum_options_builder.add_keep_dims(keep_dims); + + return sum_options_builder.Finish().Union(); +} + +std::unique_ptr SumChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new SumChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Sum.h b/compiler/tflchef/core/src/Op/Sum.h new file mode 100644 index 0000000..d3cc8c1 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Sum.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_SUM_H__ +#define __OP_SUM_H__ + +#include "OpChef.h" + +class SumChef final : public OpChef +{ +public: + explicit SumChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_SUM; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_ReducerOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct SumChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_SUM_H__ diff --git a/compiler/tflchef/core/src/Op/Tile.cpp b/compiler/tflchef/core/src/Op/Tile.cpp new file mode 100644 index 0000000..18710b4 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Tile.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Tile.h" + +flatbuffers::Offset TileChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::TileOptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr TileChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new TileChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Tile.h b/compiler/tflchef/core/src/Op/Tile.h new file mode 100644 index 0000000..2870ff1 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Tile.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_TILE_H__ +#define __OP_TILE_H__ + +#include "OpChef.h" + +class TileChef final : public OpChef +{ +public: + explicit TileChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_TILE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_TileOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct TileChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_TILE_H__ diff --git a/compiler/tflchef/core/src/Op/TopKV2.cpp b/compiler/tflchef/core/src/Op/TopKV2.cpp new file mode 100644 index 0000000..08c4de6 --- /dev/null +++ b/compiler/tflchef/core/src/Op/TopKV2.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TopKV2.h" + +flatbuffers::Offset TopKV2Chef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::TopKV2OptionsBuilder options_builder{fbb}; + + return options_builder.Finish().Union(); +} + +std::unique_ptr TopKV2ChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new TopKV2Chef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/TopKV2.h b/compiler/tflchef/core/src/Op/TopKV2.h new file mode 100644 index 0000000..5548223 --- /dev/null +++ b/compiler/tflchef/core/src/Op/TopKV2.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_TOPK_V2_H__ +#define __OP_TOPK_V2_H__ + +#include "OpChef.h" + +class TopKV2Chef final : public OpChef +{ +public: + explicit TopKV2Chef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_TOPK_V2; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_TopKV2Options; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct TopKV2ChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_TOPK_V2_H__ diff --git a/compiler/tflchef/core/src/Op/TransposeConv.cpp b/compiler/tflchef/core/src/Op/TransposeConv.cpp new file mode 100644 index 0000000..c9e4527 --- /dev/null +++ b/compiler/tflchef/core/src/Op/TransposeConv.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TransposeConv.h" +#include "Convert.h" + +#include + +flatbuffers::Offset TransposeConvChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + tflite::TransposeConvOptionsBuilder options_builder{fbb}; + + assert(operation.has_transpose_conv_options()); + + auto tflite_padding = as_tflite_padding(operation.transpose_conv_options().padding()); + + options_builder.add_padding(tflite_padding); + + options_builder.add_stride_h(operation.transpose_conv_options().stride_h()); + options_builder.add_stride_w(operation.transpose_conv_options().stride_w()); + + return options_builder.Finish().Union(); +} + +std::unique_ptr TransposeConvChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new TransposeConvChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/TransposeConv.h b/compiler/tflchef/core/src/Op/TransposeConv.h new file mode 100644 index 0000000..e664bff --- /dev/null +++ b/compiler/tflchef/core/src/Op/TransposeConv.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_TRANSPOSE_CONV_H__ +#define __OP_TRANSPOSE_CONV_H__ + +#include "OpChef.h" + +class TransposeConvChef final : public OpChef +{ +public: + explicit TransposeConvChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override + { + return tflite::BuiltinOperator_TRANSPOSE_CONV; + } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_TransposeConvOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct TransposeConvChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_TRANSPOSE_CONV_H__ diff --git a/compiler/tflchef/core/src/Op/Unique.cpp b/compiler/tflchef/core/src/Op/Unique.cpp new file mode 100644 index 0000000..d9a7293 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Unique.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Unique.h" +#include "Convert.h" + +#include + +flatbuffers::Offset UniqueChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_unique_options()); + + auto tflite_out_idx = as_tflite_tensortype(operation.unique_options().idx_out_type()); + + tflite::UniqueOptionsBuilder unique_options_builder{fbb}; + unique_options_builder.add_idx_out_type(tflite_out_idx); + + return unique_options_builder.Finish().Union(); +} + +std::unique_ptr UniqueChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new UniqueChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Unique.h b/compiler/tflchef/core/src/Op/Unique.h new file mode 100644 index 0000000..58aa7bf --- /dev/null +++ b/compiler/tflchef/core/src/Op/Unique.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_UNIQUE_H__ +#define __OP_UNIQUE_H__ + +#include "OpChef.h" + +class UniqueChef final : public OpChef +{ +public: + explicit UniqueChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_UNIQUE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_UniqueOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct UniqueChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_UNIQUE_H__ diff --git a/compiler/tflchef/core/src/Op/Unpack.cpp b/compiler/tflchef/core/src/Op/Unpack.cpp new file mode 100644 index 0000000..504da5a --- /dev/null +++ b/compiler/tflchef/core/src/Op/Unpack.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Unpack.h" + +flatbuffers::Offset UnpackChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_unpack_options()); + + tflite::UnpackOptionsBuilder unpack_options_builder{fbb}; + unpack_options_builder.add_num(operation.unpack_options().num()); + unpack_options_builder.add_axis(operation.unpack_options().axis()); + + return unpack_options_builder.Finish().Union(); +} + +std::unique_ptr UnpackChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new UnpackChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Unpack.h b/compiler/tflchef/core/src/Op/Unpack.h new file mode 100644 index 0000000..3a425b1 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Unpack.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_UNPACK_H__ +#define __OP_UNPACK_H__ + +#include "OpChef.h" + +class UnpackChef final : public OpChef +{ +public: + explicit UnpackChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_UNPACK; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_UnpackOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct UnpackChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ABS_H__ diff --git a/compiler/tflchef/core/src/Op/Where.cpp b/compiler/tflchef/core/src/Op/Where.cpp new file mode 100644 index 0000000..0ce9102 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Where.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specwhileic language governing permissions and + * limitations under the License. + */ + +#include "Where.h" + +flatbuffers::Offset WhereChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::WhereOptionsBuilder where_options_builder{fbb}; + return where_options_builder.Finish().Union(); +} + +std::unique_ptr WhereChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new WhereChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/Where.h b/compiler/tflchef/core/src/Op/Where.h new file mode 100644 index 0000000..7991c64 --- /dev/null +++ b/compiler/tflchef/core/src/Op/Where.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_WHERE_H__ +#define __OP_WHERE_H__ + +#include "OpChef.h" + +class WhereChef final : public OpChef +{ +public: + explicit WhereChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_WHERE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_WhereOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct WhereChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_WHERE_H__ diff --git a/compiler/tflchef/core/src/Op/While.cpp b/compiler/tflchef/core/src/Op/While.cpp new file mode 100644 index 0000000..1253d0f --- /dev/null +++ b/compiler/tflchef/core/src/Op/While.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specwhileic language governing permissions and + * limitations under the License. + */ + +#include "While.h" + +flatbuffers::Offset WhileChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + auto &operation = (*_operation); + + assert(operation.has_while_options()); + + tflite::WhileOptionsBuilder while_options_builder{fbb}; + while_options_builder.add_cond_subgraph_index(operation.while_options().cond_subgraph_index()); + while_options_builder.add_body_subgraph_index(operation.while_options().body_subgraph_index()); + + return while_options_builder.Finish().Union(); +} + +std::unique_ptr WhileChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new WhileChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/While.h b/compiler/tflchef/core/src/Op/While.h new file mode 100644 index 0000000..150a14b --- /dev/null +++ b/compiler/tflchef/core/src/Op/While.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_WHILE_H__ +#define __OP_WHILE_H__ + +#include "OpChef.h" + +class WhileChef final : public OpChef +{ +public: + explicit WhileChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_WHILE; } + + tflite::BuiltinOptions type(void) const override { return tflite::BuiltinOptions_WhileOptions; } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct WhileChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_WHILE_H__ diff --git a/compiler/tflchef/core/src/Op/ZerosLike.cpp b/compiler/tflchef/core/src/Op/ZerosLike.cpp new file mode 100644 index 0000000..e47e2ab --- /dev/null +++ b/compiler/tflchef/core/src/Op/ZerosLike.cpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ZerosLike.h" + +flatbuffers::Offset ZerosLikeChef::value(flatbuffers::FlatBufferBuilder &fbb) const +{ + tflite::ZerosLikeOptionsBuilder builder{fbb}; + return builder.Finish().Union(); +} + +std::unique_ptr ZerosLikeChefFactory::create(const tflchef::Operation *operation) const +{ + return std::unique_ptr{new ZerosLikeChef{operation}}; +} diff --git a/compiler/tflchef/core/src/Op/ZerosLike.h b/compiler/tflchef/core/src/Op/ZerosLike.h new file mode 100644 index 0000000..0af5b93 --- /dev/null +++ b/compiler/tflchef/core/src/Op/ZerosLike.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __OP_ZEROS_LIKE_H__ +#define __OP_ZEROS_LIKE_H__ + +#include "OpChef.h" + +class ZerosLikeChef final : public OpChef +{ +public: + explicit ZerosLikeChef(const tflchef::Operation *operation) : _operation{operation} + { + // DO NOTHING + } + +public: + tflite::BuiltinOperator code(void) const override { return tflite::BuiltinOperator_ZEROS_LIKE; } + + tflite::BuiltinOptions type(void) const override + { + return tflite::BuiltinOptions_ZerosLikeOptions; + } + + flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const override; + +private: + const tflchef::Operation *_operation; +}; + +struct ZerosLikeChefFactory final : public OpChefFactory +{ + std::unique_ptr create(const tflchef::Operation *operation) const override; +}; + +#endif // __OP_ZEROS_LIKE_H__ diff --git a/compiler/tflchef/core/src/OpChef.def b/compiler/tflchef/core/src/OpChef.def index a25250c..263725a 100644 --- a/compiler/tflchef/core/src/OpChef.def +++ b/compiler/tflchef/core/src/OpChef.def @@ -6,32 +6,111 @@ // OP_CHEF(NAME, FACTORY_CLASS) OP_CHEF(Abs, AbsChefFactory) OP_CHEF(Add, AddChefFactory) +OP_CHEF(AddN, AddNChefFactory) OP_CHEF(ArgMax, ArgMaxChefFactory) -OP_CHEF(BatchToSpaceND, BatchToSpaceNDChefFactory) +OP_CHEF(ArgMin, ArgMinChefFactory) OP_CHEF(AveragePool2D, AveragePool2DChefFactory) +OP_CHEF(BatchMatMul, BatchMatMulChefFactory) +OP_CHEF(BatchToSpaceND, BatchToSpaceNDChefFactory) +OP_CHEF(Cast, CastChefFactory) +OP_CHEF(Ceil, CeilChefFactory) OP_CHEF(Concatenation, ConcatenationChefFactory) OP_CHEF(Conv2D, Conv2DChefFactory) OP_CHEF(Cos, CosChefFactory) +OP_CHEF(DepthToSpace, DepthToSpaceChefFactory) OP_CHEF(DepthwiseConv2D, DepthwiseConv2DChefFactory) OP_CHEF(Div, DivChefFactory) +OP_CHEF(ELU, ELUChefFactory) OP_CHEF(Equal, EqualChefFactory) OP_CHEF(Exp, ExpChefFactory) +OP_CHEF(ExpandDims, ExpandDimsChefFactory) +OP_CHEF(Fill, FillChefFactory) +OP_CHEF(Floor, FloorChefFactory) OP_CHEF(FloorDiv, FloorDivChefFactory) +OP_CHEF(FloorMod, FloorModChefFactory) OP_CHEF(FullyConnected, FullyConnectedChefFactory) +OP_CHEF(Gather, GatherChefFactory) +OP_CHEF(GatherNd, GatherNdChefFactory) +OP_CHEF(Greater, GreaterChefFactory) +OP_CHEF(GreaterEqual, GreaterEqualChefFactory) +OP_CHEF(If, IfChefFactory) +OP_CHEF(L2Normalize, L2NormalizeChefFactory) +OP_CHEF(L2Pool2D, L2Pool2DChefFactory) +OP_CHEF(LeakyRelu, LeakyReluChefFactory) +OP_CHEF(Less, LessChefFactory) +OP_CHEF(LessEqual, LessEqualChefFactory) +OP_CHEF(LocalResponseNormalization, LocalResponseNormalizationChefFactory) +OP_CHEF(Log, LogChefFactory) +OP_CHEF(LogicalAnd, LogicalAndChefFactory) OP_CHEF(LogicalNot, LogicalNotChefFactory) OP_CHEF(LogicalOr, LogicalOrChefFactory) +OP_CHEF(Logistic, LogisticChefFactory) +OP_CHEF(LogSoftmax, LogSoftmaxChefFactory) +OP_CHEF(MatrixDiag, MatrixDiagChefFactory) +OP_CHEF(MatrixSetDiag, MatrixSetDiagChefFactory) +OP_CHEF(Maximum, MaximumChefFactory) OP_CHEF(MaxPool2D, MaxPool2DChefFactory) OP_CHEF(Mean, MeanChefFactory) +OP_CHEF(Minimum, MinimumChefFactory) +OP_CHEF(MirrorPad, MirrorPadChefFactory) OP_CHEF(Mul, MulChefFactory) +OP_CHEF(Neg, NegChefFactory) +OP_CHEF(NotEqual, NotEqualChefFactory) +OP_CHEF(OneHot, OneHotChefFactory) OP_CHEF(Pack, PackChefFactory) OP_CHEF(Pad, PadChefFactory) +OP_CHEF(Pow, PowChefFactory) +OP_CHEF(PRelu, PReluChefFactory) +OP_CHEF(Range, RangeChefFactory) +OP_CHEF(Rank, RankChefFactory) +OP_CHEF(ReduceAny, ReduceAnyChefFactory) +OP_CHEF(ReduceMax, ReduceMaxChefFactory) +OP_CHEF(ReduceMin, ReduceMinChefFactory) +OP_CHEF(ReduceProd, ReduceProdChefFactory) OP_CHEF(ReLU, ReLUChefFactory) OP_CHEF(ReLU6, ReLU6ChefFactory) +OP_CHEF(ReLUN1To1, ReLUN1To1ChefFactory) OP_CHEF(Reshape, ReshapeChefFactory) +OP_CHEF(ResizeBilinear, ResizeBilinearChefFactory) +OP_CHEF(ResizeNearestNeighbor, ResizeNearestNeighborChefFactory) +OP_CHEF(ReverseSequence, ReverseSequenceChefFactory) +OP_CHEF(ReverseV2, ReverseV2ChefFactory) +OP_CHEF(Round, RoundChefFactory) OP_CHEF(Rsqrt, RsqrtChefFactory) +OP_CHEF(ScatterNd, ScatterNdChefFactory) +OP_CHEF(SegmentSum,SegmentSumChefFactory) +OP_CHEF(Select, SelectChefFactory) +OP_CHEF(SelectV2, SelectV2ChefFactory) OP_CHEF(Shape, ShapeChefFactory) +OP_CHEF(Sin, SinChefFactory) +OP_CHEF(Slice, SliceChefFactory) OP_CHEF(Softmax, SoftmaxChefFactory) +OP_CHEF(SpaceToBatchND, SpaceToBatchNDChefFactory) +OP_CHEF(SpaceToDepth, SpaceToDepthChefFactory) +OP_CHEF(SparseToDense, SparseToDenseChefFactory) +OP_CHEF(Split, SplitChefFactory) +OP_CHEF(SplitV, SplitVChefFactory) OP_CHEF(Sqrt, SqrtChefFactory) +OP_CHEF(Square, SquareChefFactory) +OP_CHEF(SquaredDifference, SquaredDifferenceChefFactory) +OP_CHEF(Squeeze, SqueezeChefFactory) +OP_CHEF(StridedSlice, StridedSliceChefFactory) OP_CHEF(Sub, SubChefFactory) +OP_CHEF(Sum, SumChefFactory) OP_CHEF(Tanh, TanhChefFactory) +OP_CHEF(Tile, TileChefFactory) +OP_CHEF(TopKV2, TopKV2ChefFactory) OP_CHEF(Transpose, TransposeChefFactory) +OP_CHEF(TransposeConv, TransposeConvChefFactory) +OP_CHEF(Unique, UniqueChefFactory) +OP_CHEF(Unpack, UnpackChefFactory) +OP_CHEF(Where, WhereChefFactory) +OP_CHEF(While, WhileChefFactory) +OP_CHEF(ZerosLike, ZerosLikeChefFactory) + +// Custom Op +OP_CHEF(AddV2, AddV2ChefFactory) +OP_CHEF(All, AllChefFactory) +OP_CHEF(BatchMatMulV2, BatchMatMulV2ChefFactory) +OP_CHEF(MatMul, MatMulChefFactory) +OP_CHEF(MatrixBandPart, MatrixBandPartChefFactory) diff --git a/compiler/tflchef/core/src/OpChef.h b/compiler/tflchef/core/src/OpChef.h index 0b7d9cf..7efa096 100644 --- a/compiler/tflchef/core/src/OpChef.h +++ b/compiler/tflchef/core/src/OpChef.h @@ -29,6 +29,13 @@ struct OpChef virtual tflite::BuiltinOperator code(void) const = 0; virtual tflite::BuiltinOptions type(void) const = 0; virtual flatbuffers::Offset value(flatbuffers::FlatBufferBuilder &fbb) const = 0; + + // TODO Find a way to place this method in a better place + virtual flatbuffers::Offset> + custom_value(flatbuffers::FlatBufferBuilder &fbb) const + { + return flatbuffers::Offset>(); + } }; struct OpChefFactory diff --git a/compiler/tflchef/core/src/OpChefs.h b/compiler/tflchef/core/src/OpChefs.h index 65dbd4b..55c37eb 100644 --- a/compiler/tflchef/core/src/OpChefs.h +++ b/compiler/tflchef/core/src/OpChefs.h @@ -19,34 +19,112 @@ #include "Op/Abs.h" #include "Op/Add.h" +#include "Op/AddN.h" #include "Op/ArgMax.h" +#include "Op/ArgMin.h" #include "Op/AveragePool2D.h" +#include "Op/BatchMatMul.h" #include "Op/BatchToSpaceND.h" +#include "Op/Cast.h" +#include "Op/Ceil.h" #include "Op/Concatenation.h" #include "Op/Conv2D.h" #include "Op/Cos.h" +#include "Op/DepthToSpace.h" #include "Op/DepthwiseConv2D.h" #include "Op/Div.h" +#include "Op/ELU.h" #include "Op/Equal.h" #include "Op/Exp.h" +#include "Op/ExpandDims.h" +#include "Op/Fill.h" +#include "Op/Floor.h" #include "Op/FloorDiv.h" +#include "Op/FloorMod.h" #include "Op/FullyConnected.h" -#include "Op/LogicalOr.h" +#include "Op/Gather.h" +#include "Op/GatherNd.h" +#include "Op/Greater.h" +#include "Op/GreaterEqual.h" +#include "Op/If.h" +#include "Op/L2Normalize.h" +#include "Op/L2Pool2D.h" +#include "Op/LeakyRelu.h" +#include "Op/Less.h" +#include "Op/LessEqual.h" +#include "Op/LocalResponseNormalization.h" +#include "Op/Log.h" +#include "Op/LogicalAnd.h" #include "Op/LogicalNot.h" +#include "Op/LogicalOr.h" +#include "Op/Logistic.h" +#include "Op/LogSoftmax.h" +#include "Op/MatrixDiag.h" +#include "Op/MatrixSetDiag.h" +#include "Op/Maximum.h" #include "Op/MaxPool2D.h" #include "Op/Mean.h" +#include "Op/Minimum.h" +#include "Op/MirrorPad.h" #include "Op/Mul.h" +#include "Op/Neg.h" +#include "Op/NotEqual.h" +#include "Op/OneHot.h" #include "Op/Pack.h" #include "Op/Pad.h" +#include "Op/Pow.h" +#include "Op/PRelu.h" +#include "Op/Range.h" +#include "Op/Rank.h" +#include "Op/ReduceAny.h" +#include "Op/ReduceMax.h" +#include "Op/ReduceMin.h" +#include "Op/ReduceProd.h" #include "Op/ReLU.h" #include "Op/ReLU6.h" +#include "Op/ReLUN1To1.h" #include "Op/Reshape.h" +#include "Op/ResizeBilinear.h" +#include "Op/ResizeNearestNeighbor.h" +#include "Op/ReverseSequence.h" +#include "Op/ReverseV2.h" +#include "Op/Round.h" #include "Op/Rsqrt.h" +#include "Op/ScatterNd.h" +#include "Op/SegmentSum.h" +#include "Op/Select.h" +#include "Op/SelectV2.h" #include "Op/Shape.h" +#include "Op/Sin.h" +#include "Op/Slice.h" #include "Op/Softmax.h" +#include "Op/SpaceToBatchND.h" +#include "Op/SpaceToDepth.h" +#include "Op/SparseToDense.h" +#include "Op/Split.h" +#include "Op/SplitV.h" #include "Op/Sqrt.h" +#include "Op/Square.h" +#include "Op/SquaredDifference.h" +#include "Op/Squeeze.h" +#include "Op/StridedSlice.h" #include "Op/Sub.h" +#include "Op/Sum.h" #include "Op/Tanh.h" +#include "Op/Tile.h" +#include "Op/TopKV2.h" #include "Op/Transpose.h" +#include "Op/TransposeConv.h" +#include "Op/Unique.h" +#include "Op/Unpack.h" +#include "Op/Where.h" +#include "Op/While.h" +#include "Op/ZerosLike.h" + +#include "CustomOp/AddV2.h" +#include "CustomOp/All.h" +#include "CustomOp/BatchMatMulV2.h" +#include "CustomOp/MatMul.h" +#include "CustomOp/MatrixBandPart.h" #endif // __OP_CHEFS_H__ diff --git a/compiler/tflchef/log/CMakeLists.txt b/compiler/tflchef/log/CMakeLists.txt new file mode 100644 index 0000000..330459e --- /dev/null +++ b/compiler/tflchef/log/CMakeLists.txt @@ -0,0 +1,7 @@ +# TODO Find how to test logging framework +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_library(tflchef_log STATIC ${SOURCES}) +target_include_directories(tflchef_log PUBLIC include) +target_link_libraries(tflchef_log PUBLIC hermes) +target_link_libraries(tflchef_log PRIVATE hermes_std) diff --git a/compiler/tflchef/log/include/Log.h b/compiler/tflchef/log/include/Log.h new file mode 100644 index 0000000..178fe31 --- /dev/null +++ b/compiler/tflchef/log/include/Log.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLCHEF_LOG_H__ +#define __TFLCHEF_LOG_H__ + +#include + +namespace tflchef +{ + +/** + * @brief Logger Implementation + */ +class Logger final : public hermes::Source +{ +public: + Logger(hermes::Context *ctx); + ~Logger(); +}; + +/** + * @brief Logger Configuration + * + * Users are able to turn logging on/off via TFLCHEF_LOG environment variable. + */ +class LoggerConfig final : public hermes::Config +{ +public: + LoggerConfig(); + +public: + void configure(const hermes::Source *, hermes::Source::Setting &) const final; + void configure(const Logger *, hermes::Source::Setting &) const; + +private: + bool _enabled; +}; + +} // namespace tflchef + +#include "LoggingContext.h" + +/** + * HOW TO USE: + * + * LOGGER(l); + * + * INFO(l) << "Hello, World" << std::endl; + * + */ +#define LOGGER(name) ::tflchef::Logger name{::tflchef::LoggingContext::get()}; + +// TODO Support FATAL, ERROR, WARN, and VERBOSE +#define INFO(name) HERMES_INFO(name) + +// WARNING! +// +// THE CURRENT IMPLEMENTATION IS NOT THREAD SAFE. +// + +#endif // __TFLCHEF_LOG_H__ diff --git a/compiler/tflchef/log/include/LoggingContext.h b/compiler/tflchef/log/include/LoggingContext.h new file mode 100644 index 0000000..8600994 --- /dev/null +++ b/compiler/tflchef/log/include/LoggingContext.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLCHEF_LOGGING_CONTEXT_H__ +#define __TFLCHEF_LOGGING_CONTEXT_H__ + +#include + +namespace tflchef +{ + +/** + * @brief Global logging context + */ +struct LoggingContext +{ + static hermes::Context *get(void); +}; + +} // namespace tflchef + +#endif // __TFLCHEF_LOGGING_CONTEXT_H__ diff --git a/compiler/tflchef/log/src/Log.cpp b/compiler/tflchef/log/src/Log.cpp new file mode 100644 index 0000000..62c3777 --- /dev/null +++ b/compiler/tflchef/log/src/Log.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Log.h" + +#include +#include +#include + +// TODO Extract these lexical conversion routines as a library +namespace +{ + +/** + * @brief Convert C-string as a value of type T + * + * safecast(s, v) returns v if s is nullptr. + */ +template T safecast(const char *, const T &); + +template <> bool safecast(const char *s, const bool &value) +{ + return (s == nullptr) ? value : (std::stoi(s) != 0); +} + +} // namespace + +// +// Logger +// +namespace tflchef +{ + +Logger::Logger(hermes::Context *ctx) { activate(ctx->sources(), ctx->bus()); } +Logger::~Logger() { deactivate(); } + +} // namespace tflchef + +// +// LoggerConfig +// +namespace tflchef +{ + +LoggerConfig::LoggerConfig() +{ + // Turn on logging if TFLCHEF_LOG is set as non-zero value + _enabled = safecast(std::getenv("TFLCHEF_LOG"), false); +} + +void LoggerConfig::configure(const hermes::Source *source, hermes::Source::Setting &setting) const +{ + // Let's ignore hermes::Sources if that is not a moco logger + if (auto logger = dynamic_cast(source)) + { + configure(logger, setting); + } +} + +void LoggerConfig::configure(const Logger *, hermes::Source::Setting &setting) const +{ + if (_enabled) + { + // Enable all catagories + setting.accept_all(); + } + else + { + // Disable all catagories + setting.reject_all(); + } +} + +} // namespace tflchef diff --git a/compiler/tflchef/log/src/LoggingContext.cpp b/compiler/tflchef/log/src/LoggingContext.cpp new file mode 100644 index 0000000..0514dc3 --- /dev/null +++ b/compiler/tflchef/log/src/LoggingContext.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LoggingContext.h" +#include "Log.h" + +#include + +#include + +namespace tflchef +{ + +hermes::Context *LoggingContext::get(void) +{ + static hermes::Context *ctx = nullptr; + + if (ctx == nullptr) + { + ctx = new hermes::Context; + ctx->sinks()->append(std::make_unique()); + ctx->config(std::make_unique()); + } + + return ctx; +} + +} // namespace tflchef diff --git a/compiler/tflchef/proto/tflchef.proto b/compiler/tflchef/proto/tflchef.proto index 486aa8a..792503b 100644 --- a/compiler/tflchef/proto/tflchef.proto +++ b/compiler/tflchef/proto/tflchef.proto @@ -55,15 +55,24 @@ enum Padding { enum Activation { NONE = 0; RELU = 1; + RELU_N1_TO_1 = 2; RELU6 = 3; } +// This enum value corresponds to MirrorPadMode in TensorFlow Lite schema +enum MirrorPadMode { + REFLECT = 0; + SYMMETRIC = 1; +} + message Conv2DOptions { optional Padding padding = 1 [default = VALID]; optional int32 stride_w = 2 [default = 1]; optional int32 stride_h = 3 [default = 1]; optional Activation activation = 4 [default = NONE]; + optional int32 dilation_w_factor = 5 [default = 1]; + optional int32 dilation_h_factor = 6 [default = 1]; } message Pool2DOptions { @@ -91,6 +100,12 @@ message DepthwiseConv2DOptions optional int32 stride_h = 3 [default = 1]; optional int32 depth_multiplier = 4 [default = 1]; optional Activation activation = 5 [default = NONE]; + optional int32 dilation_w_factor = 6 [default = 1]; + optional int32 dilation_h_factor = 7 [default = 1]; +} + +message ScatterNdOptions { + // None } message SubOptions { @@ -105,6 +120,10 @@ message FloorDivOptions { // None } +message FloorModOptions { + // None +} + message FullyConnectedOptions { optional Activation activation = 1 [default = NONE]; } @@ -113,10 +132,18 @@ message AddOptions { optional Activation activation = 1 [default = NONE]; } +message AddNOptions { + // None +} + message ArgMaxOptions { optional TensorType output_type = 1 [default = INT64]; } +message ArgMinOptions { + optional TensorType output_type = 1 [default = INT64]; +} + message PackOptions { optional int32 values_count = 1; optional int32 axis = 2 [default = 0]; @@ -126,6 +153,10 @@ message PadOptions { // None } +message MirrorPadOptions { + optional MirrorPadMode mode = 1 [default = REFLECT]; +} + message SoftmaxOptions { optional float beta = 1 [default = 0.0]; } @@ -134,10 +165,22 @@ message MulOptions { optional Activation activation = 1 [default = NONE]; } +message NegOptions { + // None +} + +message RangeOptions { + // None +} + message ReducerOptions { optional bool keep_dims = 1 [ default = false ]; } +message SpaceToDepthOptions { + optional int32 block_size = 1; +} + message LogicalOrOptions { // None } @@ -174,14 +217,224 @@ message BatchToSpaceNDOptions { // None } +message SpaceToBatchNDOptions { + // None +} + +message StridedSliceOptions { + optional int32 begin_mask = 1; + optional int32 end_mask = 2; + optional int32 ellipsis_mask = 3; + optional int32 new_axis_mask = 4; + optional int32 shrink_axis_mask = 5; +} + +message SliceOptions { + // None +} + message ExpOptions { // None } +message ExpandDimsOptions { + // None +} + +message UnpackOptions { + optional int32 num = 1; + optional int32 axis = 2 [default = 0]; +} + +message GatherOptions { + optional int32 axis = 1 [default = 0]; +} + +message TileOptions { + // None +} + +message BatchMatMulOptions { + optional bool adj_x = 1 [default = false]; + optional bool adj_y = 2 [default = false]; +} + +message IfOptions { + optional int32 then_subgraph_index = 1; + optional int32 else_subgraph_index = 2; +} + +message WhileOptions { + optional int32 cond_subgraph_index = 1; + optional int32 body_subgraph_index = 2; +} + +message CastOptions { + optional TensorType in_data_type = 1 [default = FLOAT32]; + optional TensorType out_data_type = 2 [default = FLOAT32]; +} + +message SquareOptions { + // None +} + +message MaximumMinimumOptions { + //None +} + +message GreaterEqualOptions { + // None +} + +message SelectOptions { + // None +} + +message SelectV2Options { + // None +} + +message SplitOptions { + optional int32 num_splits = 1; +} + +message SplitVOptions { + optional int32 num_splits = 1; +} + +message SquaredDifferenceOptions { + // None +} + +message FillOptions { + // None +} + +message GreaterOptions { + // None +} + +message L2NormOptions { + optional Activation activation = 1 [default = NONE]; +} + +message LessOptions { + // None +} + +message LessEqualOptions { + // None +} + +message LocalResponseNormalizationOptions { + optional int32 radius = 1 [default = 5]; + optional float bias = 2 [default = 1.0]; + optional float alpha = 3 [default = 1.0]; + optional float beta = 4 [default = 0.5]; +} + +message MatMulOptions { + optional bool transpose_a = 1 [default = false]; + optional bool transpose_b = 2 [default = false]; +} + +message SqueezeOptions { + repeated int32 squeeze_dim = 1; +} + +message OneHotOptions { + optional int32 axis = 1 [default = -1]; +} + +message TopKV2Options { + // None +} + +message LogSoftmaxOptions { + // None +} + +message ZerosLikeOptions { + // None +} + +message GatherNdOptions { + // None +} + +message NotEqualOptions { + // None +} + +message PowOptions { + // None +} + +message LeakyReluOptions { + optional float alpha = 1 [default = 0.2]; +} + +message ResizeNearestNeighborOptions { + optional bool align_corners = 1 [default = false]; +} + +message ResizeBilinearOptions { + optional bool align_corners = 1 [default = false]; + optional bool half_pixel_centers = 2 [default = false]; +} + +message DepthToSpaceOptions { + optional int32 block_size = 1; +} + +message TransposeConvOptions { + optional Padding padding = 1 [default = VALID]; + optional int32 stride_w = 2 [default = 1]; + optional int32 stride_h = 3 [default = 1]; +} + +message ReverseSequenceOptions { + optional int32 seq_dim = 1 [default = 0]; + optional int32 batch_dim = 2 [default = 0]; +} + +message RankOptions { + // NONE +} + +message SegmentSumOptions { + // NONE +} + +message UniqueOptions { + optional TensorType idx_out_type = 1 [default = INT32]; +} + +message WhereOptions { + // None +} + +message SparseToDenseOptions { + optional bool validate_indices = 1 [default = true]; +} + +message ReverseV2Options { + // None +} + +message MatrixDiagOptions { + // NONE +} + +message MatrixSetDiagOptions { + // NONE +} + message Operation { optional string type = 1; repeated string input = 2; repeated string output = 3; + optional int32 version = 4 [default = 1]; optional Conv2DOptions conv2d_options = 100; optional Pool2DOptions averagepool2d_options = 101; @@ -210,6 +463,91 @@ message Operation { optional FloorDivOptions floordiv_options = 124; optional BatchToSpaceNDOptions batch_to_space_options = 125; optional ExpOptions exp_options = 126; + optional UnpackOptions unpack_options = 127; + optional GatherOptions gather_options = 128; + optional BatchMatMulOptions batch_matmul_options = 129; + optional TileOptions tile_options = 130; + optional IfOptions if_options = 131; + optional WhileOptions while_options = 132; + optional SpaceToBatchNDOptions space_to_batch_nd_options = 133; + optional CastOptions cast_options = 134; + optional GreaterEqualOptions greaterequal_options = 135; + optional MaximumMinimumOptions maximum_options = 136; + optional StridedSliceOptions strided_slice_options = 137; + optional SquaredDifferenceOptions squared_difference_options = 138; + optional FillOptions fill_options = 139; + optional SelectOptions select_options = 140; + optional ReducerOptions reduce_prod_options = 141; + optional SplitOptions split_options = 142; + optional SplitVOptions split_v_options = 143; + optional ReducerOptions sum_options = 144; + optional GreaterOptions greater_options = 145; + optional SqueezeOptions squeeze_options = 146; + optional FloorModOptions floormod_options = 147; + optional OneHotOptions onehot_options = 148; + optional LessOptions less_options = 149; + optional ReducerOptions reduce_max_options = 150; + optional MaximumMinimumOptions minimum_options = 151; + optional ReducerOptions reduce_any_options = 152; + optional ZerosLikeOptions zeros_like_options = 153; + // ConcatEmbeddingsOptions 154 + // LSHProjectionOptions 155 + // SVDFOptions 156 + // RNNOptions 157 + optional L2NormOptions l2norm_options = 158; + optional LocalResponseNormalizationOptions local_response_normalization_options = 159; + // LSTMOptions 160 + optional ResizeBilinearOptions resize_bilinear_options = 161; + // CallOptions 162 + // SkipGramOptions 163 + optional SpaceToDepthOptions space_to_depth_options = 164; + // EmbeddingLookupSparseOptions 165 + // SequenceRNNOptions 166 + optional TopKV2Options topk_v2_options = 167; + optional LogSoftmaxOptions log_softmax_options = 168; + // DequantizeOptions 169 + optional NegOptions neg_options = 170; + // PadV2Options 171 + optional LessEqualOptions lessequal_options = 172; + optional SliceOptions slice_options = 173; + optional TransposeConvOptions transpose_conv_options = 174; + optional SparseToDenseOptions sparse_to_dense_options = 175; + optional PowOptions pow_options = 176; + optional ArgMinOptions argmin_options = 177; + // FakeQuantOptions 178 + // BidirectionalSequenceLSTMOptions 179 + // BidirectionalSequenceRNNOptions 180 + // UnidirectionalSequenceLSTMOptions 181 + optional RangeOptions range_options = 182; + optional ResizeNearestNeighborOptions resize_nearest_neighbor_options = 183; + optional LeakyReluOptions leaky_relu_options = 184; + optional MirrorPadOptions mirrorpad_options = 185; + optional UniqueOptions unique_options = 186; + optional ReverseV2Options reversev2_options = 187; + // AddNOptions 188 + optional GatherNdOptions gather_nd_options = 189; + optional WhereOptions where_options = 190; + optional RankOptions rank_options = 191; + optional ReverseSequenceOptions reverse_sequence_options = 192; + optional MatrixDiagOptions matrix_diag_options = 193; + // QuantizeOptions 194 + optional MatrixSetDiagOptions matrix_set_diag_options = 195; + // HardSwishOptions 196 + optional DepthToSpaceOptions depth_to_space_options = 197; + // NonMaxSuppressionV4Options 198 + // NonMaxSuppressionV5Options 199 + optional ScatterNdOptions scatter_nd_options = 200; + optional NotEqualOptions notequal_options = 201; + optional ExpandDimsOptions expand_dims_options = 202; + optional Pool2DOptions l2pool2d_options = 203; + optional ReducerOptions all_options = 204; + optional ReducerOptions reduce_min_options = 205; + optional SegmentSumOptions segment_sum_options = 206; + optional AddNOptions add_n_options = 207; + optional MatMulOptions matmul_options = 208; + + // NOTE if there are more than two options with same type of Options + // use the number not listed in the above reserve list } // For additional subgraphs diff --git a/compiler/tflchef/requires.cmake b/compiler/tflchef/requires.cmake index 3c5bb19..4c02174 100644 --- a/compiler/tflchef/requires.cmake +++ b/compiler/tflchef/requires.cmake @@ -1,4 +1,9 @@ +require("arser") require("nnkit") require("cwrap") require("mio-tflite") require("safemain") +require("hermes") +require("hermes-std") +require("foder") +require("souschef") diff --git a/compiler/tflchef/tests/no_shape/test.recipe b/compiler/tflchef/tests/no_shape/test.recipe new file mode 100644 index 0000000..38efef9 --- /dev/null +++ b/compiler/tflchef/tests/no_shape/test.recipe @@ -0,0 +1,43 @@ +operand { + name: "indices" + type: INT32 + shape { dim: 4 } +} +operand { + name: "depth" + type: INT32 + # shape is intentionally omitted here + filler { tag: "explicit" arg: "1" } +} +operand { + name: "on_value" + type: INT32 + # shape is intentionally omitted here + filler { tag: "explicit" arg: "1" } +} +operand { + name: "off_value" + type: INT32 + # shape is intentionally omitted here + filler { tag: "explicit" arg: "0" } +} +operand { + name: "ofm" + type: INT32 + shape { dim: 4 dim: 1 } +} +operation { + type: "OneHot" + onehot_options { + axis: -1 + } + input: "indices" + input: "depth" + input: "on_value" + input: "off_value" + output: "ofm" +} +input: "indices" +input: "on_value" +input: "off_value" +output: "ofm" diff --git a/tools/lcov-to-cobertura-xml/.FORMATDENY b/compiler/tflchef/tests/no_shape/test.reverse similarity index 100% rename from tools/lcov-to-cobertura-xml/.FORMATDENY rename to compiler/tflchef/tests/no_shape/test.reverse diff --git a/compiler/tflchef/tests/runvalidate.sh b/compiler/tflchef/tests/runvalidate.sh index a1453b3..0dd9d16 100755 --- a/compiler/tflchef/tests/runvalidate.sh +++ b/compiler/tflchef/tests/runvalidate.sh @@ -1,13 +1,13 @@ #!/bin/bash -if [[ $# -le 3 ]]; then +if [[ $# -le 2 ]]; then echo "USAGE: $0 [mio_tflite_validate path] [prefix 0] " exit 255 fi MIO_TFLITE_VALIDATE_PATH="$1"; shift -echo "-- Found mio_tflite_validate: ${NNKIT_RUN_PATH}" +echo "-- Found mio_tflite_validate: ${MIO_TFLITE_VALIDATE_PATH}" TESTED=() PASSED=() diff --git a/compiler/tflchef/tflite/include/tflchef/RawModel.h b/compiler/tflchef/tflite/include/tflchef/RawModel.h deleted file mode 100644 index a8c8fef..0000000 --- a/compiler/tflchef/tflite/include/tflchef/RawModel.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __RAW_MODEL_H__ -#define __RAW_MODEL_H__ - -#include - -namespace tflchef -{ - -struct RawModel -{ - virtual ~RawModel() = default; - - virtual const ::tflite::Model *model(void) const = 0; -}; - -/** - * @brief Load TensorFlow Lite model (as a RawModel) from a given path - * - * @note May return a nullptr - */ -std::unique_ptr load_tflite(const std::string &path); - -} // namespace tflchef - -#endif // __RAW_MODEL_H__ diff --git a/compiler/tflchef/tflite/src/Convert.cpp b/compiler/tflchef/tflite/src/Convert.cpp index dc60e00..3cc1c92 100644 --- a/compiler/tflchef/tflite/src/Convert.cpp +++ b/compiler/tflchef/tflite/src/Convert.cpp @@ -51,10 +51,11 @@ tflchef::Activation as_tflchef_activation(const tflite::ActivationFunctionType t return tflchef::NONE; case tflite::ActivationFunctionType_RELU: return tflchef::RELU; + case tflite::ActivationFunctionType_RELU_N1_TO_1: + return tflchef::RELU_N1_TO_1; case tflite::ActivationFunctionType_RELU6: return tflchef::RELU6; // TODO handle other types - // ActivationFunctionType_RELU_N1_TO_1 // ActivationFunctionType_TANH // ActivationFunctionType_SIGN_BIT default: @@ -75,4 +76,17 @@ tflchef::Padding as_tflchef_padding(const tflite::Padding padding) } } +tflchef::MirrorPadMode as_tflchef_mirrorpadmode(const tflite::MirrorPadMode mode) +{ + switch (mode) + { + case tflite::MirrorPadMode_REFLECT: + return tflchef::REFLECT; + case tflite::MirrorPadMode_SYMMETRIC: + return tflchef::SYMMETRIC; + default: + throw std::runtime_error{"Unknown mirrorpad mode"}; + } +} + } // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Convert.h b/compiler/tflchef/tflite/src/Convert.h index 8623e7b..770bffa 100644 --- a/compiler/tflchef/tflite/src/Convert.h +++ b/compiler/tflchef/tflite/src/Convert.h @@ -27,12 +27,14 @@ namespace tflchef tflchef::TensorType as_tflchef_type(const tflite::TensorType type); tflchef::Activation as_tflchef_activation(const tflite::ActivationFunctionType type); tflchef::Padding as_tflchef_padding(const tflite::Padding padding); +tflchef::MirrorPadMode as_tflchef_mirrorpadmode(const tflite::MirrorPadMode mode); /** * @brief extract buffer data to std::vector
*/ template std::vector
extract_buffer(const tflite::Buffer *buffer) { + assert(buffer->data() != nullptr); auto buffer_length = buffer->data()->size(); auto num_elements = buffer_length / sizeof(DT); std::vector
result(num_elements); diff --git a/compiler/tflchef/tflite/src/FillerHelper.cpp b/compiler/tflchef/tflite/src/FillerHelper.cpp new file mode 100644 index 0000000..cf96d2e --- /dev/null +++ b/compiler/tflchef/tflite/src/FillerHelper.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FillerHelper.h" + +#include "Convert.h" + +namespace tflchef +{ + +void fill_tensor_to_import(int32_t idx, TFliteImport *import) +{ + const tflite::Tensor *tensor = import->tensors()->Get(idx); + if (tensor != nullptr) + { + if (tensor->type() == tflite::TensorType::TensorType_INT32) + { + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(idx, vec); + } + } + else if (tensor->type() == tflite::TensorType::TensorType_FLOAT32) + { + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(idx, vec); + } + } + } +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/FillerHelper.h b/compiler/tflchef/tflite/src/FillerHelper.h new file mode 100644 index 0000000..053a5c1 --- /dev/null +++ b/compiler/tflchef/tflite/src/FillerHelper.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FILLER_HELPER_H__ +#define __FILLER_HELPER_H__ + +#include "TFliteImport.h" + +#include + +namespace tflchef +{ + +void fill_tensor_to_import(int32_t idx, TFliteImport *import); + +} // namespace tflchef + +#endif // __FILLER_HELPER_H__ diff --git a/compiler/tflchef/tflite/src/Op/Add.cpp b/compiler/tflchef/tflite/src/Op/Add.cpp index 7e669ec..3e880a6 100644 --- a/compiler/tflchef/tflite/src/Op/Add.cpp +++ b/compiler/tflchef/tflite/src/Op/Add.cpp @@ -17,6 +17,7 @@ #include "Add.h" #include "Convert.h" +#include "FillerHelper.h" namespace tflchef { @@ -24,7 +25,13 @@ namespace tflchef void TFliteOpAdd::filler(const tflite::Operator *op, TFliteImport *import, tflchef::ModelRecipe *model_recipe) const { - // Nothing to do with filler + // Add may have constant input + + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 2); + + fill_tensor_to_import(inputs[0], import); + fill_tensor_to_import(inputs[1], import); } tflchef::Operation *TFliteOpAdd::build(const tflite::Operator *op, TFliteImport *import, diff --git a/compiler/tflchef/tflite/src/Op/AddN.cpp b/compiler/tflchef/tflite/src/Op/AddN.cpp new file mode 100644 index 0000000..aeb3803 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/AddN.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AddN.h" + +#include "Convert.h" +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpAddN::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // AddN may have constant input + + const std::vector &inputs = as_index_vector(op->inputs()); + + for (uint32_t idx = 0; idx < inputs.size(); ++idx) + fill_tensor_to_import(inputs[idx], import); +} + +tflchef::Operation *TFliteOpAddN::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("AddN"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/AddN.h b/compiler/tflchef/tflite/src/Op/AddN.h new file mode 100644 index 0000000..4387aa0 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/AddN.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ADD_N_H__ +#define __TFLITE_OP_ADD_N_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for AddN + */ +class TFliteOpAddN : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ADD_N_H__ diff --git a/compiler/tflchef/tflite/src/Op/ArgMin.cpp b/compiler/tflchef/tflite/src/Op/ArgMin.cpp new file mode 100644 index 0000000..faab0b8 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ArgMin.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ArgMin.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpArgMin::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input, argmin/dim + const auto &inputs = *op->inputs(); + + const tflite::Tensor *dim_tensor = import->tensors()->Get(inputs[1]); + assert(dim_tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(dim_tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpArgMin::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ArgMinOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("ArgMin"); + + auto op_options = operation->mutable_argmin_options(); + + op_options->set_output_type(as_tflchef_type(op_params->output_type())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ArgMin.h b/compiler/tflchef/tflite/src/Op/ArgMin.h new file mode 100644 index 0000000..83c643c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ArgMin.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ARGMIN_H__ +#define __TFLITE_OP_ARGMIN_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ArgMin + */ +class TFliteOpArgMin : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ARGMIN_H__ diff --git a/compiler/tflchef/tflite/src/Op/BatchMatMul.cpp b/compiler/tflchef/tflite/src/Op/BatchMatMul.cpp new file mode 100644 index 0000000..598e58c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/BatchMatMul.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMul.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpBatchMatMul::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpBatchMatMul::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("BatchMatMul"); + + auto op_options = operation->mutable_batch_matmul_options(); + + auto op_params = op->builtin_options_as_BatchMatMulOptions(); + assert(op_params != nullptr); + + op_options->set_adj_x(op_params->adj_x()); + op_options->set_adj_y(op_params->adj_y()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/BatchMatMul.h b/compiler/tflchef/tflite/src/Op/BatchMatMul.h new file mode 100644 index 0000000..6eb4c6e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/BatchMatMul.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_BATCHMATMUL_H__ +#define __TFLITE_OP_BATCHMATMUL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for BATCH_MATMUL + */ +class TFliteOpBatchMatMul : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_BATCHMATMUL_H__ diff --git a/compiler/tflchef/tflite/src/Op/Cast.cpp b/compiler/tflchef/tflite/src/Op/Cast.cpp new file mode 100644 index 0000000..393bb4b --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Cast.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Cast.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpCast::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpCast::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_CastOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("Cast"); + + auto op_options = operation->mutable_cast_options(); + + op_options->set_in_data_type(as_tflchef_type(op_params->in_data_type())); + op_options->set_out_data_type(as_tflchef_type(op_params->out_data_type())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Cast.h b/compiler/tflchef/tflite/src/Op/Cast.h new file mode 100644 index 0000000..29c126c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Cast.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_CAST_H__ +#define __TFLITE_OP_CAST_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for CAST + */ +class TFliteOpCast : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_CAST_H__ diff --git a/compiler/tflchef/tflite/src/Op/Ceil.cpp b/compiler/tflchef/tflite/src/Op/Ceil.cpp new file mode 100644 index 0000000..d3ef3ad --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Ceil.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Ceil.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpCeil::filler(const tflite::Operator *, TFliteImport *, tflchef::ModelRecipe *) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpCeil::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Ceil"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Ceil.h b/compiler/tflchef/tflite/src/Op/Ceil.h new file mode 100644 index 0000000..44df207 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Ceil.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_CEIL_H__ +#define __TFLITE_OP_CEIL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for CEIL + */ +class TFliteOpCeil : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_CEIL_H__ diff --git a/compiler/tflchef/tflite/src/Op/Conv2D.cpp b/compiler/tflchef/tflite/src/Op/Conv2D.cpp index 5d48ee2..57abd46 100644 --- a/compiler/tflchef/tflite/src/Op/Conv2D.cpp +++ b/compiler/tflchef/tflite/src/Op/Conv2D.cpp @@ -50,7 +50,8 @@ tflchef::Operation *TFliteOpConv2D::build(const tflite::Operator *op, TFliteImpo op_options->set_stride_h(op_params->stride_h()); op_options->set_stride_w(op_params->stride_w()); op_options->set_padding(as_tflchef_padding(op_params->padding())); - // TODO support dilation + op_options->set_dilation_w_factor(op_params->dilation_w_factor()); + op_options->set_dilation_h_factor(op_params->dilation_h_factor()); return operation; } diff --git a/compiler/tflchef/tflite/src/Op/DepthToSpace.cpp b/compiler/tflchef/tflite/src/Op/DepthToSpace.cpp new file mode 100644 index 0000000..1a0917e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/DepthToSpace.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DepthToSpace.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpDepthToSpace::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpDepthToSpace::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("DepthToSpace"); + + auto op_params = op->builtin_options_as_DepthToSpaceOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_depth_to_space_options(); + + op_options->set_block_size(op_params->block_size()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/DepthToSpace.h b/compiler/tflchef/tflite/src/Op/DepthToSpace.h new file mode 100644 index 0000000..b5852ac --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/DepthToSpace.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_DEPTHTOSPACE_H__ +#define __TFLITE_OP_DEPTHTOSPACE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for DepthToSpace + */ +class TFliteOpDepthToSpace : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_DEPTHTOSPACE_H__ diff --git a/compiler/tflchef/tflite/src/Op/DepthwiseConv2D.cpp b/compiler/tflchef/tflite/src/Op/DepthwiseConv2D.cpp index b19f933..5fed335 100644 --- a/compiler/tflchef/tflite/src/Op/DepthwiseConv2D.cpp +++ b/compiler/tflchef/tflite/src/Op/DepthwiseConv2D.cpp @@ -50,9 +50,8 @@ tflchef::Operation *TFliteOpDepthwiseConv2D::build(const tflite::Operator *op, T op_options->set_stride_h(op_params->stride_h()); op_options->set_stride_w(op_params->stride_w()); op_options->set_depth_multiplier(op_params->depth_multiplier()); - // TODO support dilation - // op_params->dilation_w_factor() - // op_params->dilation_h_factor() + op_options->set_dilation_w_factor(op_params->dilation_w_factor()); + op_options->set_dilation_h_factor(op_params->dilation_h_factor()); op_options->set_padding(as_tflchef_padding(op_params->padding())); return operation; diff --git a/compiler/tflchef/tflite/src/Op/ELU.cpp b/compiler/tflchef/tflite/src/Op/ELU.cpp new file mode 100644 index 0000000..cb4b61d --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ELU.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ELU.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpELU::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpELU::build(const tflite::Operator *, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ELU"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ELU.h b/compiler/tflchef/tflite/src/Op/ELU.h new file mode 100644 index 0000000..490c9fd --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ELU.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ELU_H__ +#define __TFLITE_OP_ELU_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ELU + */ +class TFliteOpELU : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ELU_H__ diff --git a/compiler/tflchef/tflite/src/Op/ExpandDims.cpp b/compiler/tflchef/tflite/src/Op/ExpandDims.cpp new file mode 100644 index 0000000..e30e8db --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ExpandDims.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ExpandDims.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpExpandDims::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Fill for axis input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpExpandDims::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ExpandDims"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ExpandDims.h b/compiler/tflchef/tflite/src/Op/ExpandDims.h new file mode 100644 index 0000000..e2f3e4e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ExpandDims.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_EXPAND_DIMS_H__ +#define __TFLITE_OP_EXPAND_DIMS_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ExpandDims + */ +class TFliteOpExpandDims : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_EXPAND_DIMS_H__ diff --git a/compiler/tflchef/tflite/src/Op/Fill.cpp b/compiler/tflchef/tflite/src/Op/Fill.cpp new file mode 100644 index 0000000..08b695f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Fill.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Fill.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpFill::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const auto &inputs = *op->inputs(); + + const tflite::Tensor *dims_tensor = import->tensors()->Get(inputs[0]); + assert(dims_tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(dims_tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[0], vec); +} + +tflchef::Operation *TFliteOpFill::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("Fill"); + + // FillOptions are empty + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Fill.h b/compiler/tflchef/tflite/src/Op/Fill.h new file mode 100644 index 0000000..4f46f62 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Fill.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_FILL_H__ +#define __TFLITE_OP_FILL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Fill + */ +class TFliteOpFill : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_FILL_H__ diff --git a/compiler/tflchef/tflite/src/Op/Floor.cpp b/compiler/tflchef/tflite/src/Op/Floor.cpp new file mode 100644 index 0000000..373c69f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Floor.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Floor.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpFloor::filler(const tflite::Operator *, TFliteImport *, tflchef::ModelRecipe *) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpFloor::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Floor"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Floor.h b/compiler/tflchef/tflite/src/Op/Floor.h new file mode 100644 index 0000000..f0f8ef3 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Floor.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_FLOOR_H__ +#define __TFLITE_OP_FLOOR_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for FLOOR + */ +class TFliteOpFloor : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_FLOOR_H__ diff --git a/compiler/tflchef/tflite/src/Op/FloorMod.cpp b/compiler/tflchef/tflite/src/Op/FloorMod.cpp new file mode 100644 index 0000000..997d826 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/FloorMod.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FloorMod.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpFloorMod::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpFloorMod::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("FloorMod"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/FloorMod.h b/compiler/tflchef/tflite/src/Op/FloorMod.h new file mode 100644 index 0000000..f36dfe8 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/FloorMod.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_FLOOR_MOD_H__ +#define __TFLITE_OP_FLOOR_MOD_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for FLOOR_MOD + */ +class TFliteOpFloorMod : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_FLOOR_MOD_H__ diff --git a/compiler/tflchef/tflite/src/Op/Gather.cpp b/compiler/tflchef/tflite/src/Op/Gather.cpp new file mode 100644 index 0000000..98da3ec --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Gather.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Gather.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpGather::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler + // But second input has filler for constant inputs + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + } +} + +tflchef::Operation *TFliteOpGather::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_GatherOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("Gather"); + + auto op_options = operation->mutable_gather_options(); + + op_options->set_axis(op_params->axis()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Gather.h b/compiler/tflchef/tflite/src/Op/Gather.h new file mode 100644 index 0000000..e01276b --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Gather.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_GATHER_H__ +#define __TFLITE_OP_GATHER_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Gather + */ +class TFliteOpGather : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_GATHER_H__ diff --git a/compiler/tflchef/tflite/src/Op/GatherNd.cpp b/compiler/tflchef/tflite/src/Op/GatherNd.cpp new file mode 100644 index 0000000..0ff5a0b --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/GatherNd.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GatherNd.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpGatherNd::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // indices buffer has filler + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + } +} + +tflchef::Operation *TFliteOpGatherNd::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("GatherNd"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/GatherNd.h b/compiler/tflchef/tflite/src/Op/GatherNd.h new file mode 100644 index 0000000..112f23d --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/GatherNd.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_GATHER_ND_H__ +#define __TFLITE_OP_GATHER_ND_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for GatherNd + */ +class TFliteOpGatherNd : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_GATHER_ND_H__ diff --git a/compiler/tflchef/tflite/src/Op/Greater.cpp b/compiler/tflchef/tflite/src/Op/Greater.cpp new file mode 100644 index 0000000..4e41efb --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Greater.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Greater.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpGreater::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpGreater::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Greater"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Greater.h b/compiler/tflchef/tflite/src/Op/Greater.h new file mode 100644 index 0000000..3ab2d1a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Greater.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_GREATER_H__ +#define __TFLITE_OP_GREATER_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Greater + */ +class TFliteOpGreater : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_GREATER_H__ diff --git a/compiler/tflchef/tflite/src/Op/GreaterEqual.cpp b/compiler/tflchef/tflite/src/Op/GreaterEqual.cpp new file mode 100644 index 0000000..aead30e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/GreaterEqual.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GreaterEqual.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpGreaterEqual::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpGreaterEqual::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("GreaterEqual"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/GreaterEqual.h b/compiler/tflchef/tflite/src/Op/GreaterEqual.h new file mode 100644 index 0000000..96b0af7 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/GreaterEqual.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_GREATEREQUAL_H__ +#define __TFLITE_OP_GREATEREQUAL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Greater Equal + */ +class TFliteOpGreaterEqual : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_GREATEREQUAL_H__ diff --git a/compiler/tflchef/tflite/src/Op/L2Normalize.cpp b/compiler/tflchef/tflite/src/Op/L2Normalize.cpp new file mode 100644 index 0000000..0a89084 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/L2Normalize.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "L2Normalize.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpL2Normalize::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpL2Normalize::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_L2NormOptions(); + auto operation = model_recipe->add_operation(); + + operation->set_type("L2Normalize"); + + auto op_options = operation->mutable_l2norm_options(); + + op_options->set_activation(as_tflchef_activation(op_params->fused_activation_function())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/L2Normalize.h b/compiler/tflchef/tflite/src/Op/L2Normalize.h new file mode 100644 index 0000000..a73eae6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/L2Normalize.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_L2NORMALIZE_H__ +#define __TFLITE_OP_L2NORMALIZE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for L2Normalize + */ +class TFliteOpL2Normalize : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_L2NORMALIZE_H__ diff --git a/compiler/tflchef/tflite/src/Op/L2Pool2D.cpp b/compiler/tflchef/tflite/src/Op/L2Pool2D.cpp new file mode 100644 index 0000000..8db4b02 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/L2Pool2D.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "L2Pool2D.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpL2Pool2D::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpL2Pool2D::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_Pool2DOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("L2Pool2D"); + + auto op_options = operation->mutable_l2pool2d_options(); + + op_options->set_padding(as_tflchef_padding(op_params->padding())); + op_options->set_stride_h(op_params->stride_h()); + op_options->set_stride_w(op_params->stride_w()); + op_options->set_filter_height(op_params->filter_height()); + op_options->set_filter_width(op_params->filter_width()); + op_options->set_activation(as_tflchef_activation(op_params->fused_activation_function())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/L2Pool2D.h b/compiler/tflchef/tflite/src/Op/L2Pool2D.h new file mode 100644 index 0000000..0463534 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/L2Pool2D.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_L2_POOL2D_H__ +#define __TFLITE_OP_L2_POOL2D_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for L2_POOL_2D + */ +class TFliteOpL2Pool2D : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_L2_POOL2D_H__ diff --git a/compiler/tflchef/tflite/src/Op/LeakyRelu.cpp b/compiler/tflchef/tflite/src/Op/LeakyRelu.cpp new file mode 100644 index 0000000..bf9cb2f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LeakyRelu.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LeakyRelu.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLeakyRelu::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLeakyRelu::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_LeakyReluOptions(); + + auto operation = model_recipe->add_operation(); + + operation->set_type("LeakyRelu"); + + auto *op_options = operation->mutable_leaky_relu_options(); + + op_options->set_alpha(op_params->alpha()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/LeakyRelu.h b/compiler/tflchef/tflite/src/Op/LeakyRelu.h new file mode 100644 index 0000000..28e63e0 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LeakyRelu.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LEAKY_RELU_H__ +#define __TFLITE_OP_LEAKY_RELU_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LeakyReLU + */ +class TFliteOpLeakyRelu : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LEAKY_RELU_H__ diff --git a/compiler/tflchef/tflite/src/Op/Less.cpp b/compiler/tflchef/tflite/src/Op/Less.cpp new file mode 100644 index 0000000..0360317 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Less.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Less.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLess::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLess::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Less"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Less.h b/compiler/tflchef/tflite/src/Op/Less.h new file mode 100644 index 0000000..1316cb6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Less.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LESS_H__ +#define __TFLITE_OP_LESS_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Less + */ +class TFliteOpLess : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LESS_H__ diff --git a/compiler/tflchef/tflite/src/Op/LessEqual.cpp b/compiler/tflchef/tflite/src/Op/LessEqual.cpp new file mode 100644 index 0000000..b8c42e8 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LessEqual.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LessEqual.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLessEqual::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLessEqual::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("LessEqual"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/LessEqual.h b/compiler/tflchef/tflite/src/Op/LessEqual.h new file mode 100644 index 0000000..81c710f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LessEqual.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LESSEQUAL_H__ +#define __TFLITE_OP_LESSEQUAL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LessEqual + */ +class TFliteOpLessEqual : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LESSEQUAL_H__ diff --git a/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.cpp b/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.cpp new file mode 100644 index 0000000..8bebd9e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LocalResponseNormalization.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLocalResponseNormalization::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation * +TFliteOpLocalResponseNormalization::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_LocalResponseNormalizationOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("LocalResponseNormalization"); + + auto op_options = operation->mutable_local_response_normalization_options(); + + op_options->set_radius(op_params->radius()); + op_options->set_bias(op_params->bias()); + op_options->set_alpha(op_params->alpha()); + op_options->set_beta(op_params->beta()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.h b/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.h new file mode 100644 index 0000000..c0eb3f2 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LocalResponseNormalization.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LOCAL_RESPONSE_NORMALIZATION_H__ +#define __TFLITE_OP_LOCAL_RESPONSE_NORMALIZATION_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LocalResponseNormalization + */ +class TFliteOpLocalResponseNormalization : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LOCAL_RESPONSE_NORMALIZATION_H__ diff --git a/compiler/tflchef/tflite/src/Op/Log.cpp b/compiler/tflchef/tflite/src/Op/Log.cpp new file mode 100644 index 0000000..a68dc9a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Log.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Log.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLog::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLog::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Log"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Log.h b/compiler/tflchef/tflite/src/Op/Log.h new file mode 100644 index 0000000..9d17e2f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Log.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LOG_H__ +#define __TFLITE_OP_LOG_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Log + */ +class TFliteOpLog : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LOG_H__ diff --git a/compiler/tflchef/tflite/src/Op/LogSoftmax.cpp b/compiler/tflchef/tflite/src/Op/LogSoftmax.cpp new file mode 100644 index 0000000..8f0e1a9 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LogSoftmax.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogSoftmax.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLogSoftmax::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLogSoftmax::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("LogSoftmax"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/LogSoftmax.h b/compiler/tflchef/tflite/src/Op/LogSoftmax.h new file mode 100644 index 0000000..efd81f3 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LogSoftmax.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LOG_SOFTMAX_H__ +#define __TFLITE_OP_LOG_SOFTMAX_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LogSoftmax + */ +class TFliteOpLogSoftmax : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LOG_SOFTMAX_H__ diff --git a/compiler/tflchef/tflite/src/Op/LogicalAnd.cpp b/compiler/tflchef/tflite/src/Op/LogicalAnd.cpp new file mode 100644 index 0000000..2cc4864 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LogicalAnd.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogicalAnd.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLogicalAnd::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLogicalAnd::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("LogicalAnd"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/LogicalAnd.h b/compiler/tflchef/tflite/src/Op/LogicalAnd.h new file mode 100644 index 0000000..1f7a964 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/LogicalAnd.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LOGICALAND_H__ +#define __TFLITE_OP_LOGICALAND_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LogicalAnd + */ +class TFliteOpLogicalAnd : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LOGICALAND_H__ diff --git a/compiler/tflchef/tflite/src/Op/Logistic.cpp b/compiler/tflchef/tflite/src/Op/Logistic.cpp new file mode 100644 index 0000000..18b3b5c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Logistic.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Logistic.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpLogistic::filler(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpLogistic::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Logistic"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Logistic.h b/compiler/tflchef/tflite/src/Op/Logistic.h new file mode 100644 index 0000000..a75bf49 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Logistic.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_LOGISTIC_H__ +#define __TFLITE_OP_LOGISTIC_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for LOGISTIC + */ +class TFliteOpLogistic : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_LOGISTIC_H__ diff --git a/compiler/tflchef/tflite/src/Op/MatrixDiag.cpp b/compiler/tflchef/tflite/src/Op/MatrixDiag.cpp new file mode 100644 index 0000000..ca84c49 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MatrixDiag.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixDiag.h" + +namespace tflchef +{ + +void TFliteOpMatrixDiag::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpMatrixDiag::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("MatrixDiag"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/MatrixDiag.h b/compiler/tflchef/tflite/src/Op/MatrixDiag.h new file mode 100644 index 0000000..4074f2c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MatrixDiag.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MATRIX_DIAG_H__ +#define __TFLITE_OP_MATRIX_DIAG_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for MatrixDiag + */ +class TFliteOpMatrixDiag : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MATRIX_DIAG_H__ diff --git a/compiler/tflchef/tflite/src/Op/MatrixSetDiag.cpp b/compiler/tflchef/tflite/src/Op/MatrixSetDiag.cpp new file mode 100644 index 0000000..97c7de4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MatrixSetDiag.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixSetDiag.h" + +namespace tflchef +{ + +void TFliteOpMatrixSetDiag::filler(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpMatrixSetDiag::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("MatrixSetDiag"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/MatrixSetDiag.h b/compiler/tflchef/tflite/src/Op/MatrixSetDiag.h new file mode 100644 index 0000000..0e7ec7f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MatrixSetDiag.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MATRIX_SET_DIAG_H__ +#define __TFLITE_OP_MATRIX_SET_DIAG_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for MatrixSetDiag + */ +class TFliteOpMatrixSetDiag : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MATRIX_SET_DIAG_H__ diff --git a/compiler/tflchef/tflite/src/Op/Maximum.cpp b/compiler/tflchef/tflite/src/Op/Maximum.cpp new file mode 100644 index 0000000..fb977b6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Maximum.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Maximum.h" + +namespace tflchef +{ + +void TFliteOpMaximum::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpMaximum::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Maximum"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Maximum.h b/compiler/tflchef/tflite/src/Op/Maximum.h new file mode 100644 index 0000000..acafec3 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Maximum.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MAXIMUM_H__ +#define __TFLITE_OP_MAXIMUM_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for maximum + */ +class TFliteOpMaximum : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MAXIMUM_H__ diff --git a/compiler/tflchef/tflite/src/Op/Minimum.cpp b/compiler/tflchef/tflite/src/Op/Minimum.cpp new file mode 100644 index 0000000..2bb50cb --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Minimum.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Minimum.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpMinimum::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpMinimum::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Minimum"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Minimum.h b/compiler/tflchef/tflite/src/Op/Minimum.h new file mode 100644 index 0000000..5db5b79 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Minimum.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MINIMUM_H__ +#define __TFLITE_OP_MINIMUM_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for minimum + */ +class TFliteOpMinimum : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MINIMUM_H__ diff --git a/compiler/tflchef/tflite/src/Op/MirrorPad.cpp b/compiler/tflchef/tflite/src/Op/MirrorPad.cpp new file mode 100644 index 0000000..c688552 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MirrorPad.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MirrorPad.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpMirrorPad::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpMirrorPad::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("MirrorPad"); + + auto op_options = operation->mutable_mirrorpad_options(); + + auto op_params = op->builtin_options_as_MirrorPadOptions(); + assert(op_params != nullptr); + + op_options->set_mode(as_tflchef_mirrorpadmode(op_params->mode())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/MirrorPad.h b/compiler/tflchef/tflite/src/Op/MirrorPad.h new file mode 100644 index 0000000..c9acdd4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/MirrorPad.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MIRROR_PAD_H__ +#define __TFLITE_OP_MIRROR_PAD_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for MIRROR_PAD + */ +class TFliteOpMirrorPad : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MIRROR_PAD_H__ diff --git a/compiler/tflchef/tflite/src/Op/Mul.cpp b/compiler/tflchef/tflite/src/Op/Mul.cpp new file mode 100644 index 0000000..9faa4ac --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Mul.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Mul.h" + +#include "Convert.h" +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpMul::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Mul may have constant input + + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 2); + + fill_tensor_to_import(inputs[0], import); + fill_tensor_to_import(inputs[1], import); +} + +tflchef::Operation *TFliteOpMul::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Mul"); + + auto op_params = op->builtin_options_as_MulOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_mul_options(); + op_options->set_activation(as_tflchef_activation(op_params->fused_activation_function())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Mul.h b/compiler/tflchef/tflite/src/Op/Mul.h new file mode 100644 index 0000000..fd009d2 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Mul.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_MUL_H__ +#define __TFLITE_OP_MUL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for MUL + */ +class TFliteOpMul : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_MUL_H__ diff --git a/compiler/tflchef/tflite/src/Op/Neg.cpp b/compiler/tflchef/tflite/src/Op/Neg.cpp new file mode 100644 index 0000000..c691390 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Neg.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Neg.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpNeg::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpNeg::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Neg"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Neg.h b/compiler/tflchef/tflite/src/Op/Neg.h new file mode 100644 index 0000000..c77ab7e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Neg.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_NEG_H__ +#define __TFLITE_OP_NEG_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for abs + */ +class TFliteOpNeg : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_NEG_H__ diff --git a/compiler/tflchef/tflite/src/Op/NotEqual.cpp b/compiler/tflchef/tflite/src/Op/NotEqual.cpp new file mode 100644 index 0000000..c2275db --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/NotEqual.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "NotEqual.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpNotEqual::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpNotEqual::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("NotEqual"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/NotEqual.h b/compiler/tflchef/tflite/src/Op/NotEqual.h new file mode 100644 index 0000000..b1febdc --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/NotEqual.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_NOTEQUAL_H__ +#define __TFLITE_OP_NOTEQUAL_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Not Equal + */ +class TFliteOpNotEqual : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_NOTEQUAL_H__ diff --git a/compiler/tflchef/tflite/src/Op/OneHot.cpp b/compiler/tflchef/tflite/src/Op/OneHot.cpp new file mode 100644 index 0000000..f26ed3e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/OneHot.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "OneHot.h" +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpOneHot::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // only depth(second input) has constant on recipe cause depth value is used in shape inference. + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + } + + // on/off can be dtype of input/output. let's support INT32/FLOAT32 for now + for (int32_t index = 2; index <= 3; ++index) + { + const tflite::Tensor *tensor = import->tensors()->Get(inputs[index]); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + if (buffer && buffer->data()) + { + switch (tensor->type()) + { + case tflite::TensorType::TensorType_INT32: + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + break; + } + + case tflite::TensorType::TensorType_FLOAT32: + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + break; + } + + default: + assert(false); + break; + } + } + } +} + +tflchef::Operation *TFliteOpOneHot::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_OneHotOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("OneHot"); + + auto op_options = operation->mutable_onehot_options(); + + op_options->set_axis(op_params->axis()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/OneHot.h b/compiler/tflchef/tflite/src/Op/OneHot.h new file mode 100644 index 0000000..50bbed0 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/OneHot.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ONEHOT_H__ +#define __TFLITE_OP_ONEHOT_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for OneHot + */ +class TFliteOpOneHot : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ONEHOT_H__ diff --git a/compiler/tflchef/tflite/src/Op/PRelu.cpp b/compiler/tflchef/tflite/src/Op/PRelu.cpp new file mode 100644 index 0000000..8a5e83a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/PRelu.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PRelu.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpPRelu::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ +} + +tflchef::Operation *TFliteOpPRelu::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("PRelu"); + + // PReluOptions are empty + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/PRelu.h b/compiler/tflchef/tflite/src/Op/PRelu.h new file mode 100644 index 0000000..b35c6e7 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/PRelu.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_PRELU_H__ +#define __TFLITE_OP_PRELU_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for PRelu + */ +class TFliteOpPRelu : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_PRELU_H__ diff --git a/compiler/tflchef/tflite/src/Op/Pow.cpp b/compiler/tflchef/tflite/src/Op/Pow.cpp new file mode 100644 index 0000000..fe8e8ac --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Pow.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Pow.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpPow::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ +} + +tflchef::Operation *TFliteOpPow::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("Pow"); + + // PowOptions are empty + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Pow.h b/compiler/tflchef/tflite/src/Op/Pow.h new file mode 100644 index 0000000..20e8473 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Pow.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_POW_H__ +#define __TFLITE_OP_POW_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Pow + */ +class TFliteOpPow : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_POW_H__ diff --git a/compiler/tflchef/tflite/src/Op/Range.cpp b/compiler/tflchef/tflite/src/Op/Range.cpp new file mode 100644 index 0000000..2958b9c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Range.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Range.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpRange::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for all inputs + const auto &inputs = *op->inputs(); + + for (int index = 0; index < 3; ++index) + { + const tflite::Tensor *tensor = import->tensors()->Get(inputs[index]); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + if (tensor->type() == tflite::TensorType::TensorType_INT32) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + } + else if (tensor->type() == tflite::TensorType::TensorType_FLOAT32) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + } + else + { + assert(false && "Invalid tensor type"); + } + } +} + +tflchef::Operation *TFliteOpRange::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Range"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Range.h b/compiler/tflchef/tflite/src/Op/Range.h new file mode 100644 index 0000000..ad10dc5 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Range.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_RANGE_H__ +#define __TFLITE_OP_RANGE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for abs + */ +class TFliteOpRange : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_RANGE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Rank.cpp b/compiler/tflchef/tflite/src/Op/Rank.cpp new file mode 100644 index 0000000..184c8e4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Rank.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Rank.h" + +namespace tflchef +{ + +void TFliteOpRank::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpRank::build(const tflite::Operator *, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Rank"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Rank.h b/compiler/tflchef/tflite/src/Op/Rank.h new file mode 100644 index 0000000..003d9d3 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Rank.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_RANK_H__ +#define __TFLITE_OP_RANK_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for rank + */ +class TFliteOpRank : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_RANK_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReLUN1To1.cpp b/compiler/tflchef/tflite/src/Op/ReLUN1To1.cpp new file mode 100644 index 0000000..4cc8dbd --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReLUN1To1.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReLUN1To1.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpReLUN1To1::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpReLUN1To1::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ReLUN1To1"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReLUN1To1.h b/compiler/tflchef/tflite/src/Op/ReLUN1To1.h new file mode 100644 index 0000000..0767006 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReLUN1To1.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_RELU_N1_TO_1_H__ +#define __TFLITE_OP_RELU_N1_TO_1_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for RELU_N1_TO_1 + */ +class TFliteOpReLUN1To1 : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_RELU_N1_TO_1_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReduceAny.cpp b/compiler/tflchef/tflite/src/Op/ReduceAny.cpp new file mode 100644 index 0000000..e0cc503 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceAny.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceAny.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpReduceAny::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpReduceAny::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("ReduceAny"); + + auto op_params = op->builtin_options_as_ReducerOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_reduce_any_options(); + op_options->set_keep_dims(op_params->keep_dims()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReduceAny.h b/compiler/tflchef/tflite/src/Op/ReduceAny.h new file mode 100644 index 0000000..dd5e361 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceAny.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REDUCE_ANY_H__ +#define __TFLITE_OP_REDUCE_ANY_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for REDUCE_ANY + */ +class TFliteOpReduceAny : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REDUCE_ANY_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReduceMax.cpp b/compiler/tflchef/tflite/src/Op/ReduceMax.cpp new file mode 100644 index 0000000..499f585 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceMax.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceMax.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpReduceMax::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpReduceMax::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ReducerOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("ReduceMax"); + + auto op_options = operation->mutable_reduce_max_options(); + + op_options->set_keep_dims(op_params->keep_dims()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReduceMax.h b/compiler/tflchef/tflite/src/Op/ReduceMax.h new file mode 100644 index 0000000..8e65cf4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceMax.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REDUCEMAX_H__ +#define __TFLITE_OP_REDUCEMAX_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Reduce Max + */ +class TFliteOpReduceMax : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REDUCEMAX_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReduceMin.cpp b/compiler/tflchef/tflite/src/Op/ReduceMin.cpp new file mode 100644 index 0000000..09e2e13 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceMin.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceMin.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpReduceMin::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpReduceMin::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ReducerOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("ReduceMin"); + + auto op_options = operation->mutable_reduce_min_options(); + + op_options->set_keep_dims(op_params->keep_dims()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReduceMin.h b/compiler/tflchef/tflite/src/Op/ReduceMin.h new file mode 100644 index 0000000..88cba6f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceMin.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REDUCEMIN_H__ +#define __TFLITE_OP_REDUCEMIN_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Reduce Min + */ +class TFliteOpReduceMin : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REDUCEMIN_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReduceProd.cpp b/compiler/tflchef/tflite/src/Op/ReduceProd.cpp new file mode 100644 index 0000000..e2d9897 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceProd.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReduceProd.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpReduceProd::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpReduceProd::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("ReduceProd"); + + auto op_params = op->builtin_options_as_ReducerOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_reduce_prod_options(); + op_options->set_keep_dims(op_params->keep_dims()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReduceProd.h b/compiler/tflchef/tflite/src/Op/ReduceProd.h new file mode 100644 index 0000000..e776684 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReduceProd.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REDUCE_PROD_H__ +#define __TFLITE_OP_REDUCE_PROD_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for REDUCE_PROD + */ +class TFliteOpReduceProd : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REDUCE_PROD_H__ diff --git a/compiler/tflchef/tflite/src/Op/Reshape.cpp b/compiler/tflchef/tflite/src/Op/Reshape.cpp index 663ab3e..0094d5d 100644 --- a/compiler/tflchef/tflite/src/Op/Reshape.cpp +++ b/compiler/tflchef/tflite/src/Op/Reshape.cpp @@ -17,6 +17,7 @@ #include "Reshape.h" #include "Convert.h" +#include "FillerHelper.h" namespace tflchef { @@ -27,33 +28,29 @@ void TFliteOpReshape::filler(const tflite::Operator *op, TFliteImport *import, const std::vector &inputs = as_index_vector(op->inputs()); bool hasShape = (inputs.size() == 2); - assert(inputs.size() == 1 || hasShape); - if (hasShape) { - auto op_params = op->builtin_options_as_ReshapeOptions(); - std::vector new_shape = as_index_vector(op_params->new_shape()); - import->set_tensor_filler(inputs.at(1), new_shape); + fill_tensor_to_import(inputs[1], import); } } tflchef::Operation *TFliteOpReshape::build(const tflite::Operator *op, TFliteImport *import, tflchef::ModelRecipe *model_recipe) const { - auto op_params = op->builtin_options_as_ReshapeOptions(); - assert(op_params != nullptr); - auto operation = model_recipe->add_operation(); operation->set_type("Reshape"); - auto op_options = operation->mutable_reshape_options(); - - std::vector new_shape = as_index_vector(op_params->new_shape()); - - for (auto shape : new_shape) + auto op_params = op->builtin_options_as_ReshapeOptions(); + if (op_params != nullptr) { - op_options->add_new_shape(shape); + auto op_options = operation->mutable_reshape_options(); + + std::vector new_shape = as_index_vector(op_params->new_shape()); + for (auto shape : new_shape) + { + op_options->add_new_shape(shape); + } } return operation; diff --git a/compiler/tflchef/tflite/src/Op/ResizeBilinear.cpp b/compiler/tflchef/tflite/src/Op/ResizeBilinear.cpp new file mode 100644 index 0000000..0f6db1f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ResizeBilinear.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeBilinear.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpResizeBilinear::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // size buffer has filler + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + } +} + +tflchef::Operation *TFliteOpResizeBilinear::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ResizeBilinearOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("ResizeBilinear"); + + auto op_options = operation->mutable_resize_bilinear_options(); + + op_options->set_align_corners(op_params->align_corners()); + op_options->set_half_pixel_centers(op_params->half_pixel_centers()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ResizeBilinear.h b/compiler/tflchef/tflite/src/Op/ResizeBilinear.h new file mode 100644 index 0000000..98c49c5 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ResizeBilinear.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_RESIZE_BILINEAR_H__ +#define __TFLITE_OP_RESIZE_BILINEAR_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ResizeBilinear + */ +class TFliteOpResizeBilinear : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_RESIZE_BILINEAR_H__ diff --git a/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.cpp b/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.cpp new file mode 100644 index 0000000..f3dd8fe --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeNearestNeighbor.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpResizeNearestNeighbor::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // size buffer has filler + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + } +} + +tflchef::Operation *TFliteOpResizeNearestNeighbor::build(const tflite::Operator *op, + TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ResizeNearestNeighborOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("ResizeNearestNeighbor"); + + auto op_options = operation->mutable_resize_nearest_neighbor_options(); + + op_options->set_align_corners(op_params->align_corners()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.h b/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.h new file mode 100644 index 0000000..5090bb9 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ResizeNearestNeighbor.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_RESIZE_NEAREST_NEIGHBOR_H__ +#define __TFLITE_OP_RESIZE_NEAREST_NEIGHBOR_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ResizeNearestNeighbor + */ +class TFliteOpResizeNearestNeighbor : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_RESIZE_NEAREST_NEIGHBOR_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReverseSequence.cpp b/compiler/tflchef/tflite/src/Op/ReverseSequence.cpp new file mode 100644 index 0000000..6ef6c23 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReverseSequence.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseSequence.h" + +#include "Convert.h" +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpReverseSequence::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 2); + + fill_tensor_to_import(inputs[1], import); +} + +tflchef::Operation *TFliteOpReverseSequence::build(const tflite::Operator *op, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ReverseSequence"); + + auto op_params = op->builtin_options_as_ReverseSequenceOptions(); + + assert(op_params != nullptr); + + auto op_options = operation->mutable_reverse_sequence_options(); + + op_options->set_seq_dim(op_params->seq_dim()); + op_options->set_batch_dim(op_params->batch_dim()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReverseSequence.h b/compiler/tflchef/tflite/src/Op/ReverseSequence.h new file mode 100644 index 0000000..8c8c811 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReverseSequence.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REVERSE_SEQUENCE_H__ +#define __TFLITE_OP_REVERSE_SEQUENCE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ReverseSequence + */ +class TFliteOpReverseSequence : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REVERSE_SEQUENCE_H__ diff --git a/compiler/tflchef/tflite/src/Op/ReverseV2.cpp b/compiler/tflchef/tflite/src/Op/ReverseV2.cpp new file mode 100644 index 0000000..c59d975 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReverseV2.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseV2.h" + +#include "Convert.h" +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpReverseV2::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 2); + + fill_tensor_to_import(inputs[1], import); +} + +tflchef::Operation *TFliteOpReverseV2::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ReverseV2"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ReverseV2.h b/compiler/tflchef/tflite/src/Op/ReverseV2.h new file mode 100644 index 0000000..6a8a75e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ReverseV2.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_REVERSEV2_H__ +#define __TFLITE_OP_REVERSEV2_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ReverseV2 + */ +class TFliteOpReverseV2 : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_REVERSEV2_H__ diff --git a/compiler/tflchef/tflite/src/Op/Round.cpp b/compiler/tflchef/tflite/src/Op/Round.cpp new file mode 100644 index 0000000..c3f6bf6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Round.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Round.h" + +namespace tflchef +{ + +void TFliteOpRound::filler(const tflite::Operator *, TFliteImport *, tflchef::ModelRecipe *) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpRound::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Round"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Round.h b/compiler/tflchef/tflite/src/Op/Round.h new file mode 100644 index 0000000..df0da3f --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Round.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ROUND_H__ +#define __TFLITE_OP_ROUND_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Round + */ +class TFliteOpRound : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ROUND_H__ diff --git a/compiler/tflchef/tflite/src/Op/ScatterNd.cpp b/compiler/tflchef/tflite/src/Op/ScatterNd.cpp new file mode 100644 index 0000000..548a09a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ScatterNd.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ScatterNd.h" + +#include "Convert.h" +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpScatterNd::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Filler for indices and shape + fill_tensor_to_import(0, import); + fill_tensor_to_import(2, import); +} + +tflchef::Operation *TFliteOpScatterNd::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("ScatterNd"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ScatterNd.h b/compiler/tflchef/tflite/src/Op/ScatterNd.h new file mode 100644 index 0000000..76362d7 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ScatterNd.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SCATTER_ND_H__ +#define __TFLITE_OP_SCATTER_ND_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ScatterNd + */ +class TFliteOpScatterNd : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SCATTER_ND_H__ diff --git a/compiler/tflchef/tflite/src/Op/SegmentSum.cpp b/compiler/tflchef/tflite/src/Op/SegmentSum.cpp new file mode 100644 index 0000000..a975ca4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SegmentSum.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SegmentSum.h" + +#include "FillerHelper.h" + +namespace tflchef +{ + +void TFliteOpSegmentSum::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Filler for indices and shape + fill_tensor_to_import(1, import); +} + +tflchef::Operation *TFliteOpSegmentSum::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SegmentSum"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SegmentSum.h b/compiler/tflchef/tflite/src/Op/SegmentSum.h new file mode 100644 index 0000000..d20e63b --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SegmentSum.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SEGMENT_SUM_H__ +#define __TFLITE_OP_SEGMENT_SUM_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SEGMENT_SUM + */ +class TFliteOpSegmentSum : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SEGMENT_SUM_H__ diff --git a/compiler/tflchef/tflite/src/Op/Select.cpp b/compiler/tflchef/tflite/src/Op/Select.cpp new file mode 100644 index 0000000..741ffb8 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Select.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Select.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSelect::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSelect::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Select"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Select.h b/compiler/tflchef/tflite/src/Op/Select.h new file mode 100644 index 0000000..bf8e57d --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Select.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SELECT_H__ +#define __TFLITE_OP_SELECT_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SELECT + */ +class TFliteOpSelect : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SELECT_H__ diff --git a/compiler/tflchef/tflite/src/Op/SelectV2.cpp b/compiler/tflchef/tflite/src/Op/SelectV2.cpp new file mode 100644 index 0000000..0ddabb4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SelectV2.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SelectV2.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSelectV2::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSelectV2::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SelectV2"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SelectV2.h b/compiler/tflchef/tflite/src/Op/SelectV2.h new file mode 100644 index 0000000..ff03341 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SelectV2.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SELECT_V2_H__ +#define __TFLITE_OP_SELECT_V2_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SELECT + */ +class TFliteOpSelectV2 : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SELECT_V2_H__ diff --git a/compiler/tflchef/tflite/src/Op/Shape.cpp b/compiler/tflchef/tflite/src/Op/Shape.cpp new file mode 100644 index 0000000..d6e490d --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Shape.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Shape.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpShape::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpShape::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("Shape"); + + auto op_params = op->builtin_options_as_ShapeOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_shape_options(); + op_options->set_out_type(as_tflchef_type(op_params->out_type())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Shape.h b/compiler/tflchef/tflite/src/Op/Shape.h new file mode 100644 index 0000000..ebe1bef --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Shape.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SHAPE_H__ +#define __TFLITE_OP_SHAPE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SHAPE + */ +class TFliteOpShape : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SHAPE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Sin.cpp b/compiler/tflchef/tflite/src/Op/Sin.cpp new file mode 100644 index 0000000..8c063f4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Sin.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Sin.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSin::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSin::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Sin"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Sin.h b/compiler/tflchef/tflite/src/Op/Sin.h new file mode 100644 index 0000000..51eabce --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Sin.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SIN_H__ +#define __TFLITE_OP_SIN_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Sin + */ +class TFliteOpSin : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SIN_H__ diff --git a/compiler/tflchef/tflite/src/Op/Slice.cpp b/compiler/tflchef/tflite/src/Op/Slice.cpp new file mode 100644 index 0000000..f0c44da --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Slice.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Slice.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSlice::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + + // for begin and size + for (int32_t index = 1; index <= 2; ++index) + { + const tflite::Tensor *tensor = import->tensors()->Get(inputs[index]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + } +} + +tflchef::Operation *TFliteOpSlice::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Slice"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Slice.h b/compiler/tflchef/tflite/src/Op/Slice.h new file mode 100644 index 0000000..6ca6724 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Slice.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SLICE_H__ +#define __TFLITE_OP_SLICE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SLICE + */ +class TFliteOpSlice : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SLICE_H__ diff --git a/compiler/tflchef/tflite/src/Op/SpaceToBatchND.cpp b/compiler/tflchef/tflite/src/Op/SpaceToBatchND.cpp new file mode 100644 index 0000000..9de0775 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SpaceToBatchND.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToBatchND.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSpaceToBatchND::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second, third input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); + + tensor = import->tensors()->Get(inputs[2]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + buffer = import->buffers()->Get(tensor->buffer()); + vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[2], vec); +} + +tflchef::Operation *TFliteOpSpaceToBatchND::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SpaceToBatchND"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SpaceToBatchND.h b/compiler/tflchef/tflite/src/Op/SpaceToBatchND.h new file mode 100644 index 0000000..9d7bc44 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SpaceToBatchND.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SPACETOBATCHND_H__ +#define __TFLITE_OP_SPACETOBATCHND_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SpaceToBatchND + */ +class TFliteOpSpaceToBatchND : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SPACETOBATCHND_H__ diff --git a/compiler/tflchef/tflite/src/Op/SpaceToDepth.cpp b/compiler/tflchef/tflite/src/Op/SpaceToDepth.cpp new file mode 100644 index 0000000..e5718b5 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SpaceToDepth.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToDepth.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSpaceToDepth::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSpaceToDepth::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SpaceToDepth"); + + auto op_params = op->builtin_options_as_SpaceToDepthOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_space_to_depth_options(); + + op_options->set_block_size(op_params->block_size()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SpaceToDepth.h b/compiler/tflchef/tflite/src/Op/SpaceToDepth.h new file mode 100644 index 0000000..784ad94 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SpaceToDepth.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SPACETODEPTH_H__ +#define __TFLITE_OP_SPACETODEPTH_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SpaceToDepth + */ +class TFliteOpSpaceToDepth : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SPACETODEPTH_H__ diff --git a/compiler/tflchef/tflite/src/Op/SparseToDense.cpp b/compiler/tflchef/tflite/src/Op/SparseToDense.cpp new file mode 100644 index 0000000..9e4f0a0 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SparseToDense.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SparseToDense.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSparseToDense::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for Shape + const auto &inputs = *op->inputs(); + + const tflite::Tensor *output_shape_tensor = import->tensors()->Get(inputs[1]); + assert(output_shape_tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(output_shape_tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpSparseToDense::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_SparseToDenseOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("SparseToDense"); + + auto op_options = operation->mutable_sparse_to_dense_options(); + + op_options->set_validate_indices(op_params->validate_indices()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SparseToDense.h b/compiler/tflchef/tflite/src/Op/SparseToDense.h new file mode 100644 index 0000000..5ffe478 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SparseToDense.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SPARSETODENSE_H__ +#define __TFLITE_OP_SPARSETODENSE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SparseToDense + */ +class TFliteOpSparseToDense : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SPARSETODENSE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Split.cpp b/compiler/tflchef/tflite/src/Op/Split.cpp new file mode 100644 index 0000000..49f9aa2 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Split.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Split.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSplit::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const auto &inputs = *op->inputs(); + + // for input split_dim + // NOTE unlike other Ops, Split input 0 is split_dim + const tflite::Tensor *tensor = import->tensors()->Get(inputs[0]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[0], vec); +} + +tflchef::Operation *TFliteOpSplit::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Split"); + + auto op_options = operation->mutable_split_options(); + + auto op_params = op->builtin_options_as_SplitOptions(); + assert(op_params != nullptr); + + op_options->set_num_splits(op_params->num_splits()); + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Split.h b/compiler/tflchef/tflite/src/Op/Split.h new file mode 100644 index 0000000..af247a1 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Split.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SPLIT_H__ +#define __TFLITE_OP_SPLIT_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SPLIT + */ +class TFliteOpSplit : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SPLIT_H__ diff --git a/compiler/tflchef/tflite/src/Op/SplitV.cpp b/compiler/tflchef/tflite/src/Op/SplitV.cpp new file mode 100644 index 0000000..18035e6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SplitV.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SplitV.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSplitV::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const auto &inputs = *op->inputs(); + + // for input "size_splits" and "split_dim" + for (int32_t idx = 1; idx <= 2; idx++) + { + const tflite::Tensor *tensor = import->tensors()->Get(inputs[idx]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[idx], vec); + } +} + +tflchef::Operation *TFliteOpSplitV::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SplitV"); + + auto op_options = operation->mutable_split_v_options(); + + auto op_params = op->builtin_options_as_SplitVOptions(); + assert(op_params != nullptr); + + op_options->set_num_splits(op_params->num_splits()); + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SplitV.h b/compiler/tflchef/tflite/src/Op/SplitV.h new file mode 100644 index 0000000..3f715b5 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SplitV.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SPLIT_V_H__ +#define __TFLITE_OP_SPLIT_V_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SPLIT_V + */ +class TFliteOpSplitV : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SPLIT_V_H__ diff --git a/compiler/tflchef/tflite/src/Op/Square.cpp b/compiler/tflchef/tflite/src/Op/Square.cpp new file mode 100644 index 0000000..d380328 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Square.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Square.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSquare::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSquare::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Square"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Square.h b/compiler/tflchef/tflite/src/Op/Square.h new file mode 100644 index 0000000..9c008fe --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Square.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SQUARE_H__ +#define __TFLITE_OP_SQUARE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Square + */ +class TFliteOpSquare : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SQUARE_H__ diff --git a/compiler/tflchef/tflite/src/Op/SquaredDifference.cpp b/compiler/tflchef/tflite/src/Op/SquaredDifference.cpp new file mode 100644 index 0000000..1ee536e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SquaredDifference.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SquaredDifference.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSquaredDifference::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSquaredDifference::build(const tflite::Operator *op, + TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("SquaredDifference"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/SquaredDifference.h b/compiler/tflchef/tflite/src/Op/SquaredDifference.h new file mode 100644 index 0000000..58c2ed4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/SquaredDifference.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SQUAREDDIFFERENCE_H__ +#define __TFLITE_OP_SQUAREDDIFFERENCE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for SquaredDifference + */ +class TFliteOpSquaredDifference : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SQUAREDDIFFERENCE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Squeeze.cpp b/compiler/tflchef/tflite/src/Op/Squeeze.cpp new file mode 100644 index 0000000..7983fc6 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Squeeze.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Squeeze.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSqueeze::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpSqueeze::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_SqueezeOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("Squeeze"); + + auto op_options = operation->mutable_squeeze_options(); + + std::vector squeeze_dims = as_index_vector(op_params->squeeze_dims()); + + for (auto dim : squeeze_dims) + { + op_options->add_squeeze_dim(dim); + } + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Squeeze.h b/compiler/tflchef/tflite/src/Op/Squeeze.h new file mode 100644 index 0000000..b6c89f7 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Squeeze.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SQUEEZE_H__ +#define __TFLITE_OP_SQUEEZE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Squeeze + */ +class TFliteOpSqueeze : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SQUEEZE_H__ diff --git a/compiler/tflchef/tflite/src/Op/StridedSlice.cpp b/compiler/tflchef/tflite/src/Op/StridedSlice.cpp new file mode 100644 index 0000000..c770236 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/StridedSlice.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "StridedSlice.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpStridedSlice::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const std::vector &inputs = as_index_vector(op->inputs()); + + // for begin, end and strides + for (int32_t index = 1; index <= 3; ++index) + { + const tflite::Tensor *tensor = import->tensors()->Get(inputs[index]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[index], vec); + } +} + +tflchef::Operation *TFliteOpStridedSlice::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_StridedSliceOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("StridedSlice"); + + auto op_options = operation->mutable_strided_slice_options(); + + op_options->set_begin_mask(op_params->begin_mask()); + op_options->set_end_mask(op_params->end_mask()); + op_options->set_ellipsis_mask(op_params->ellipsis_mask()); + op_options->set_new_axis_mask(op_params->new_axis_mask()); + op_options->set_shrink_axis_mask(op_params->shrink_axis_mask()); + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/StridedSlice.h b/compiler/tflchef/tflite/src/Op/StridedSlice.h new file mode 100644 index 0000000..98054b9 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/StridedSlice.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_STRIDEDSLICE_H__ +#define __TFLITE_OP_STRIDEDSLICE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for StridedSlice + */ +class TFliteOpStridedSlice : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_STRIDEDSLICE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Sub.cpp b/compiler/tflchef/tflite/src/Op/Sub.cpp index db77fdd..0a08bbf 100644 --- a/compiler/tflchef/tflite/src/Op/Sub.cpp +++ b/compiler/tflchef/tflite/src/Op/Sub.cpp @@ -17,6 +17,7 @@ #include "Sub.h" #include "Convert.h" +#include "FillerHelper.h" namespace tflchef { @@ -24,7 +25,13 @@ namespace tflchef void TFliteOpSub::filler(const tflite::Operator *op, TFliteImport *import, tflchef::ModelRecipe *model_recipe) const { - // Nothing to do with filler + // Sub may have constant input + + const std::vector &inputs = as_index_vector(op->inputs()); + assert(inputs.size() == 2); + + fill_tensor_to_import(inputs[0], import); + fill_tensor_to_import(inputs[1], import); } tflchef::Operation *TFliteOpSub::build(const tflite::Operator *op, TFliteImport *import, diff --git a/compiler/tflchef/tflite/src/Op/Sum.cpp b/compiler/tflchef/tflite/src/Op/Sum.cpp new file mode 100644 index 0000000..9f3133e --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Sum.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Sum.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpSum::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpSum::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_ReducerOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("Sum"); + + auto op_options = operation->mutable_sum_options(); + + op_options->set_keep_dims(op_params->keep_dims()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Sum.h b/compiler/tflchef/tflite/src/Op/Sum.h new file mode 100644 index 0000000..38eeb08 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Sum.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_SUM_H__ +#define __TFLITE_OP_SUM_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for sum + */ +class TFliteOpSum : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_SUM_H__ diff --git a/compiler/tflchef/tflite/src/Op/Tile.cpp b/compiler/tflchef/tflite/src/Op/Tile.cpp new file mode 100644 index 0000000..14e6513 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Tile.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Tile.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpTile::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32 || + tensor->type() == tflite::TensorType::TensorType_INT64); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpTile::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Tile"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Tile.h b/compiler/tflchef/tflite/src/Op/Tile.h new file mode 100644 index 0000000..640f52a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Tile.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_TILE_H__ +#define __TFLITE_OP_TILE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Tile + */ +class TFliteOpTile : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_TILE_H__ diff --git a/compiler/tflchef/tflite/src/Op/TopKV2.cpp b/compiler/tflchef/tflite/src/Op/TopKV2.cpp new file mode 100644 index 0000000..461456a --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/TopKV2.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TopKV2.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpTopKV2::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // filler for second input + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[1]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32 || + tensor->type() == tflite::TensorType::TensorType_INT64); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[1], vec); +} + +tflchef::Operation *TFliteOpTopKV2::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("TopKV2"); + + // NOTE there is `sorted` attribute in TF but it's always true for TFlite + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/TopKV2.h b/compiler/tflchef/tflite/src/Op/TopKV2.h new file mode 100644 index 0000000..b2b74cc --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/TopKV2.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_TOPK_V2_H__ +#define __TFLITE_OP_TOPK_V2_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for TOPK_V2 + */ +class TFliteOpTopKV2 : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_TOPK_V2_H__ diff --git a/compiler/tflchef/tflite/src/Op/Transpose.cpp b/compiler/tflchef/tflite/src/Op/Transpose.cpp index ae97a19..a997bb0 100644 --- a/compiler/tflchef/tflite/src/Op/Transpose.cpp +++ b/compiler/tflchef/tflite/src/Op/Transpose.cpp @@ -36,16 +36,11 @@ void TFliteOpTranspose::filler(const tflite::Operator *op, TFliteImport *import, tflchef::Operation *TFliteOpTranspose::build(const tflite::Operator *op, TFliteImport *import, tflchef::ModelRecipe *model_recipe) const { - auto op_params = op->builtin_options_as(); - assert(op_params != nullptr); - (void)op_params; - auto operation = model_recipe->add_operation(); operation->set_type("Transpose"); - auto op_options = operation->mutable_transpose_options(); - (void)op_options; + // No options for Transpose return operation; } diff --git a/compiler/tflchef/tflite/src/Op/TransposeConv.cpp b/compiler/tflchef/tflite/src/Op/TransposeConv.cpp new file mode 100644 index 0000000..7e772b9 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/TransposeConv.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TransposeConv.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpTransposeConv::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + const auto &inputs = *op->inputs(); + + const tflite::Tensor *tensor = import->tensors()->Get(inputs[0]); + assert(tensor->type() == tflite::TensorType::TensorType_INT32); + const tflite::Buffer *buffer = import->buffers()->Get(tensor->buffer()); + + if (buffer && buffer->data()) + { + auto vec = extract_buffer(buffer); + import->set_tensor_filler(inputs[0], vec); + } +} + +tflchef::Operation *TFliteOpTransposeConv::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_TransposeConvOptions(); + + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("TransposeConv"); + + auto op_options = operation->mutable_transpose_conv_options(); + + op_options->set_stride_h(op_params->stride_h()); + op_options->set_stride_w(op_params->stride_w()); + op_options->set_padding(as_tflchef_padding(op_params->padding())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/TransposeConv.h b/compiler/tflchef/tflite/src/Op/TransposeConv.h new file mode 100644 index 0000000..c79cdab --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/TransposeConv.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_TRANSPOSE_CONV_H__ +#define __TFLITE_OP_TRANSPOSE_CONV_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for TransposeConv + */ +class TFliteOpTransposeConv : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_TRANSPOSE_CONV_H__ diff --git a/compiler/tflchef/tflite/src/Op/Unique.cpp b/compiler/tflchef/tflite/src/Op/Unique.cpp new file mode 100644 index 0000000..e3f77f4 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Unique.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Unique.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpUnique::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpUnique::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto op_params = op->builtin_options_as_UniqueOptions(); + assert(op_params != nullptr); + + auto operation = model_recipe->add_operation(); + + operation->set_type("Unique"); + + auto op_options = operation->mutable_unique_options(); + + op_options->set_idx_out_type(as_tflchef_type(op_params->idx_out_type())); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Unique.h b/compiler/tflchef/tflite/src/Op/Unique.h new file mode 100644 index 0000000..fae037c --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Unique.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_UNIQUE_H__ +#define __TFLITE_OP_UNIQUE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Unique + */ +class TFliteOpUnique : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_UNIQUE_H__ diff --git a/compiler/tflchef/tflite/src/Op/Unpack.cpp b/compiler/tflchef/tflite/src/Op/Unpack.cpp new file mode 100644 index 0000000..a51ef84 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Unpack.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Unpack.h" + +namespace tflchef +{ + +void TFliteOpUnpack::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with filler +} + +tflchef::Operation *TFliteOpUnpack::build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + + operation->set_type("Unpack"); + + auto op_params = op->builtin_options_as_UnpackOptions(); + assert(op_params != nullptr); + + auto op_options = operation->mutable_unpack_options(); + op_options->set_num(op_params->num()); + op_options->set_axis(op_params->axis()); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Unpack.h b/compiler/tflchef/tflite/src/Op/Unpack.h new file mode 100644 index 0000000..1036bdc --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Unpack.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_UNPACK_H__ +#define __TFLITE_OP_UNPACK_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Unpack + */ +class TFliteOpUnpack : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_UNPACK_H__ diff --git a/compiler/tflchef/tflite/src/Op/Where.cpp b/compiler/tflchef/tflite/src/Op/Where.cpp new file mode 100644 index 0000000..e42de37 --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Where.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "Where.h" + +namespace tflchef +{ + +void TFliteOpWhere::filler(const tflite::Operator *, TFliteImport *, tflchef::ModelRecipe *) const +{ + // Nothing to do with fillers here +} + +tflchef::Operation *TFliteOpWhere::build(const tflite::Operator *, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("Where"); + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/Where.h b/compiler/tflchef/tflite/src/Op/Where.h new file mode 100644 index 0000000..00cdc4b --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/Where.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_WHERE_H__ +#define __TFLITE_OP_WHERE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for Where + */ +class TFliteOpWhere : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_WHERE_H__ diff --git a/compiler/tflchef/tflite/src/Op/ZerosLike.cpp b/compiler/tflchef/tflite/src/Op/ZerosLike.cpp new file mode 100644 index 0000000..a56b6bd --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ZerosLike.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ZerosLike.h" + +#include "Convert.h" + +namespace tflchef +{ + +void TFliteOpZerosLike::filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const +{ + // Nothing to do with fillers here +} + +tflchef::Operation *TFliteOpZerosLike::build(const tflite::Operator *op, TFliteImport *, + tflchef::ModelRecipe *model_recipe) const +{ + auto operation = model_recipe->add_operation(); + operation->set_type("ZerosLike"); + + auto op_options = operation->mutable_zeros_like_options(); + (void)op_options; + + return operation; +} + +} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/Op/ZerosLike.h b/compiler/tflchef/tflite/src/Op/ZerosLike.h new file mode 100644 index 0000000..163c1fa --- /dev/null +++ b/compiler/tflchef/tflite/src/Op/ZerosLike.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __TFLITE_OP_ZEROS_LIKE_H__ +#define __TFLITE_OP_ZEROS_LIKE_H__ + +#include "TFliteOpChef.h" + +namespace tflchef +{ + +/** + * @brief tflchef operator builder for ZerosLike + */ +class TFliteOpZerosLike : public TFliteOpChef +{ +public: + void filler(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; + tflchef::Operation *build(const tflite::Operator *op, TFliteImport *import, + tflchef::ModelRecipe *model_recipe) const override; +}; + +} // namespace tflchef + +#endif // __TFLITE_OP_ZEROS_LIKE_H__ diff --git a/compiler/tflchef/tflite/src/RawModelLoader.cpp b/compiler/tflchef/tflite/src/RawModelLoader.cpp deleted file mode 100644 index e9ef8ec..0000000 --- a/compiler/tflchef/tflite/src/RawModelLoader.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include -#include -#include -#include - -namespace -{ - -class MemoryMappedRawModel final : public tflchef::RawModel -{ -public: - /** - * @require fd and data SHOULD be valid - */ - explicit MemoryMappedRawModel(int fd, void *data, size_t size) : _fd{fd}, _data{data}, _size{size} - { - // DO NOTHING - } - -public: - ~MemoryMappedRawModel() - { - munmap(_data, _size); - close(_fd); - } - -public: - MemoryMappedRawModel(const MemoryMappedRawModel &) = delete; - MemoryMappedRawModel(MemoryMappedRawModel &&) = delete; - -public: - const ::tflite::Model *model(void) const override { return ::tflite::GetModel(_data); } - -private: - int _fd = -1; - void *_data = nullptr; - size_t _size = 0; -}; - -} // namespace - -namespace tflchef -{ - -std::unique_ptr load_tflite(const std::string &path) -{ - cwrap::Fildes fildes{open(path.c_str(), O_RDONLY)}; - - if (fildes.get() == -1) - { - // Return nullptr on open failure - return nullptr; - } - - struct stat st; - if (fstat(fildes.get(), &st) == -1) - { - // Return nullptr on fstat failure - return nullptr; - } - - auto size = st.st_size; - auto data = mmap(nullptr, size, PROT_READ, MAP_SHARED, fildes.get(), 0); - - if (data == MAP_FAILED) - { - // Return nullptr on mmap failure - return nullptr; - } - - return std::unique_ptr{new MemoryMappedRawModel(fildes.release(), data, size)}; -} - -} // namespace tflchef diff --git a/compiler/tflchef/tflite/src/RecipeChef.cpp b/compiler/tflchef/tflite/src/RecipeChef.cpp index 407006b..db62d0e 100644 --- a/compiler/tflchef/tflite/src/RecipeChef.cpp +++ b/compiler/tflchef/tflite/src/RecipeChef.cpp @@ -35,9 +35,16 @@ void set_inputs(TFliteImport *import, tflchef::Operation *operation, const tflit for (auto input : inputs) { - auto tensor = tensors->Get(input); - std::string name = tensor_name(tensor); - operation->add_input(name); + if (input == -1) + { + operation->add_input(""); + } + else + { + auto tensor = tensors->Get(input); + std::string name = tensor_name(tensor); + operation->add_input(name); + } } } @@ -104,11 +111,14 @@ std::unique_ptr generate_recipe(const tflite::Model *model) operand->set_name(tensor_name(tensor)); operand->set_type(as_tflchef_type(tensor->type())); - std::vector dims = as_index_vector(tensor->shape()); - ::tflchef::TensorShape *shape = operand->mutable_shape(); - for (auto dim : dims) + if (tensor->shape()) { - shape->add_dim(dim); + std::vector dims = as_index_vector(tensor->shape()); + ::tflchef::TensorShape *shape = operand->mutable_shape(); + for (auto dim : dims) + { + shape->add_dim(dim); + } } // filler for weights, bias and so on diff --git a/compiler/tflchef/tflite/src/TFliteImport.h b/compiler/tflchef/tflite/src/TFliteImport.h index fa81964..5b46f45 100644 --- a/compiler/tflchef/tflite/src/TFliteImport.h +++ b/compiler/tflchef/tflite/src/TFliteImport.h @@ -121,18 +121,18 @@ public: } private: - const TFliteSubGraphs_t *_subgraphs; - const TFliteBuffers_t *_buffers; - const TFliteTensors_t *_tensors; - const TFliteOperators_t *_operators; - - std::vector _op_codes; - std::vector _inputs; - std::vector _outputs; - - std::map _tensor_filler; - std::map> _tensor_filler_vint32; - std::map> _tensor_filler_vfloat; + const TFliteSubGraphs_t *_subgraphs{nullptr}; + const TFliteBuffers_t *_buffers{nullptr}; + const TFliteTensors_t *_tensors{nullptr}; + const TFliteOperators_t *_operators{nullptr}; + + std::vector _op_codes{}; + std::vector _inputs{}; + std::vector _outputs{}; + + std::map _tensor_filler{}; + std::map> _tensor_filler_vint32{}; + std::map> _tensor_filler_vfloat{}; }; } // namespace tflchef diff --git a/compiler/tflchef/tflite/src/TFliteOpChefs.h b/compiler/tflchef/tflite/src/TFliteOpChefs.h index 685d686..ad52af1 100644 --- a/compiler/tflchef/tflite/src/TFliteOpChefs.h +++ b/compiler/tflchef/tflite/src/TFliteOpChefs.h @@ -20,32 +20,104 @@ // In alphabet order #include "Op/Abs.h" #include "Op/Add.h" +#include "Op/AddN.h" #include "Op/ArgMax.h" +#include "Op/ArgMin.h" #include "Op/AveragePool2D.h" +#include "Op/BatchMatMul.h" #include "Op/BatchToSpaceND.h" +#include "Op/Cast.h" +#include "Op/Ceil.h" #include "Op/Concatenation.h" #include "Op/Conv2D.h" #include "Op/Cos.h" +#include "Op/DepthToSpace.h" #include "Op/DepthwiseConv2D.h" #include "Op/Div.h" +#include "Op/ELU.h" #include "Op/Equal.h" #include "Op/Exp.h" +#include "Op/ExpandDims.h" +#include "Op/Fill.h" +#include "Op/Floor.h" #include "Op/FloorDiv.h" +#include "Op/FloorMod.h" #include "Op/FullyConnected.h" +#include "Op/Gather.h" +#include "Op/GatherNd.h" +#include "Op/Greater.h" +#include "Op/GreaterEqual.h" +#include "Op/L2Normalize.h" +#include "Op/L2Pool2D.h" +#include "Op/LeakyRelu.h" +#include "Op/Less.h" +#include "Op/LessEqual.h" +#include "Op/LocalResponseNormalization.h" +#include "Op/Log.h" +#include "Op/LogicalAnd.h" #include "Op/LogicalNot.h" #include "Op/LogicalOr.h" +#include "Op/Logistic.h" +#include "Op/LogSoftmax.h" +#include "Op/MatrixDiag.h" +#include "Op/MatrixSetDiag.h" +#include "Op/Maximum.h" #include "Op/MaxPool2D.h" #include "Op/Mean.h" +#include "Op/Minimum.h" +#include "Op/MirrorPad.h" +#include "Op/Mul.h" +#include "Op/Neg.h" +#include "Op/NotEqual.h" +#include "Op/OneHot.h" #include "Op/Pack.h" #include "Op/Pad.h" +#include "Op/Pow.h" +#include "Op/PRelu.h" +#include "Op/Range.h" +#include "Op/Rank.h" +#include "Op/ReduceAny.h" +#include "Op/ReduceMax.h" +#include "Op/ReduceMin.h" +#include "Op/ReduceProd.h" #include "Op/ReLU.h" #include "Op/ReLU6.h" +#include "Op/ReLUN1To1.h" #include "Op/Reshape.h" +#include "Op/ResizeBilinear.h" +#include "Op/ResizeNearestNeighbor.h" +#include "Op/ReverseSequence.h" +#include "Op/ReverseV2.h" +#include "Op/Round.h" #include "Op/Rsqrt.h" +#include "Op/ScatterNd.h" +#include "Op/SegmentSum.h" +#include "Op/Select.h" +#include "Op/SelectV2.h" +#include "Op/Shape.h" +#include "Op/Sin.h" +#include "Op/Slice.h" #include "Op/Softmax.h" +#include "Op/SpaceToBatchND.h" +#include "Op/SpaceToDepth.h" +#include "Op/SparseToDense.h" +#include "Op/Split.h" +#include "Op/SplitV.h" #include "Op/Sqrt.h" +#include "Op/Square.h" +#include "Op/SquaredDifference.h" +#include "Op/Squeeze.h" +#include "Op/StridedSlice.h" #include "Op/Sub.h" +#include "Op/Sum.h" #include "Op/Tanh.h" +#include "Op/Tile.h" +#include "Op/TopKV2.h" #include "Op/Transpose.h" +#include "Op/TransposeConv.h" +#include "Op/Unique.h" +#include "Op/Unpack.h" +#include "Op/Where.h" +#include "Op/ZerosLike.h" #endif // __TFLITE_OP_CHEFS_H__ diff --git a/compiler/tflchef/tflite/src/TFliteOpRegistry.h b/compiler/tflchef/tflite/src/TFliteOpRegistry.h index f0aed21..0a44b3f 100644 --- a/compiler/tflchef/tflite/src/TFliteOpRegistry.h +++ b/compiler/tflchef/tflite/src/TFliteOpRegistry.h @@ -57,33 +57,105 @@ private: REG_TFL_OP(ABS, TFliteOpAbs); REG_TFL_OP(ADD, TFliteOpAdd); + REG_TFL_OP(ADD_N, TFliteOpAddN); REG_TFL_OP(ARG_MAX, TFliteOpArgMax); + REG_TFL_OP(ARG_MIN, TFliteOpArgMin); REG_TFL_OP(AVERAGE_POOL_2D, TFliteOpAveragePool2D); + REG_TFL_OP(BATCH_MATMUL, TFliteOpBatchMatMul); REG_TFL_OP(BATCH_TO_SPACE_ND, TFliteOpBatchToSpaceND); + REG_TFL_OP(CAST, TFliteOpCast); + REG_TFL_OP(CEIL, TFliteOpCeil); REG_TFL_OP(CONCATENATION, TFliteOpConcatenation); REG_TFL_OP(CONV_2D, TFliteOpConv2D); REG_TFL_OP(COS, TFliteOpCos); + REG_TFL_OP(DEPTH_TO_SPACE, TFliteOpDepthToSpace); REG_TFL_OP(DEPTHWISE_CONV_2D, TFliteOpDepthwiseConv2D); REG_TFL_OP(DIV, TFliteOpDiv); + REG_TFL_OP(ELU, TFliteOpELU); REG_TFL_OP(EQUAL, TFliteOpEqual); REG_TFL_OP(EXP, TFliteOpExp); + REG_TFL_OP(EXPAND_DIMS, TFliteOpExpandDims); + REG_TFL_OP(FILL, TFliteOpFill); + REG_TFL_OP(FLOOR, TFliteOpFloor); REG_TFL_OP(FLOOR_DIV, TFliteOpFloorDiv); + REG_TFL_OP(FLOOR_MOD, TFliteOpFloorMod); REG_TFL_OP(FULLY_CONNECTED, TFliteOpFullyConnected); + REG_TFL_OP(GATHER, TFliteOpGather); + REG_TFL_OP(GATHER_ND, TFliteOpGatherNd); + REG_TFL_OP(GREATER, TFliteOpGreater); + REG_TFL_OP(GREATER_EQUAL, TFliteOpGreaterEqual); + REG_TFL_OP(L2_NORMALIZATION, TFliteOpL2Normalize); + REG_TFL_OP(L2_POOL_2D, TFliteOpL2Pool2D); + REG_TFL_OP(LEAKY_RELU, TFliteOpLeakyRelu); + REG_TFL_OP(LESS, TFliteOpLess); + REG_TFL_OP(LESS_EQUAL, TFliteOpLessEqual); + REG_TFL_OP(LOCAL_RESPONSE_NORMALIZATION, TFliteOpLocalResponseNormalization); + REG_TFL_OP(LOG, TFliteOpLog); + REG_TFL_OP(LOGICAL_AND, TFliteOpLogicalAnd); REG_TFL_OP(LOGICAL_NOT, TFliteOpLogicalNot); REG_TFL_OP(LOGICAL_OR, TFliteOpLogicalOr); + REG_TFL_OP(LOGISTIC, TFliteOpLogistic); + REG_TFL_OP(LOG_SOFTMAX, TFliteOpLogSoftmax); + REG_TFL_OP(MATRIX_DIAG, TFliteOpMatrixDiag); REG_TFL_OP(MAX_POOL_2D, TFliteOpMaxPool2D); + REG_TFL_OP(MATRIX_SET_DIAG, TFliteOpMatrixSetDiag); + REG_TFL_OP(MAXIMUM, TFliteOpMaximum); REG_TFL_OP(MEAN, TFliteOpMean); + REG_TFL_OP(MINIMUM, TFliteOpMinimum); + REG_TFL_OP(MIRROR_PAD, TFliteOpMirrorPad); + REG_TFL_OP(MUL, TFliteOpMul); + REG_TFL_OP(NEG, TFliteOpNeg); + REG_TFL_OP(NOT_EQUAL, TFliteOpNotEqual); + REG_TFL_OP(ONE_HOT, TFliteOpOneHot); REG_TFL_OP(PACK, TFliteOpPack); REG_TFL_OP(PAD, TFliteOpPad); + REG_TFL_OP(POW, TFliteOpPow); + REG_TFL_OP(PRELU, TFliteOpPRelu); + REG_TFL_OP(RANGE, TFliteOpRange); + REG_TFL_OP(RANK, TFliteOpRank); + REG_TFL_OP(REDUCE_ANY, TFliteOpReduceAny); + REG_TFL_OP(REDUCE_MAX, TFliteOpReduceMax); + REG_TFL_OP(REDUCE_MIN, TFliteOpReduceMin); + REG_TFL_OP(REDUCE_PROD, TFliteOpReduceProd); REG_TFL_OP(RELU, TFliteOpReLU); REG_TFL_OP(RELU6, TFliteOpReLU6); + REG_TFL_OP(RELU_N1_TO_1, TFliteOpReLUN1To1); REG_TFL_OP(RESHAPE, TFliteOpReshape); + REG_TFL_OP(RESIZE_BILINEAR, TFliteOpResizeBilinear); + REG_TFL_OP(RESIZE_NEAREST_NEIGHBOR, TFliteOpResizeNearestNeighbor); + REG_TFL_OP(REVERSE_SEQUENCE, TFliteOpReverseSequence); + REG_TFL_OP(REVERSE_V2, TFliteOpReverseV2); + REG_TFL_OP(ROUND, TFliteOpRound); REG_TFL_OP(RSQRT, TFliteOpRsqrt); + REG_TFL_OP(SCATTER_ND, TFliteOpScatterNd); + REG_TFL_OP(SEGMENT_SUM, TFliteOpSegmentSum); + REG_TFL_OP(SELECT, TFliteOpSelect); + REG_TFL_OP(SELECT_V2, TFliteOpSelectV2); + REG_TFL_OP(SHAPE, TFliteOpShape); + REG_TFL_OP(SIN, TFliteOpSin); + REG_TFL_OP(SLICE, TFliteOpSlice); REG_TFL_OP(SOFTMAX, TFliteOpSoftmax); + REG_TFL_OP(SPACE_TO_BATCH_ND, TFliteOpSpaceToBatchND); + REG_TFL_OP(SPACE_TO_DEPTH, TFliteOpSpaceToDepth); + REG_TFL_OP(SPARSE_TO_DENSE, TFliteOpSparseToDense); + REG_TFL_OP(SPLIT, TFliteOpSplit); + REG_TFL_OP(SPLIT_V, TFliteOpSplitV); REG_TFL_OP(SQRT, TFliteOpSqrt); + REG_TFL_OP(SQUARE, TFliteOpSquare); + REG_TFL_OP(SQUARED_DIFFERENCE, TFliteOpSquaredDifference); + REG_TFL_OP(SQUEEZE, TFliteOpSqueeze); + REG_TFL_OP(STRIDED_SLICE, TFliteOpStridedSlice); REG_TFL_OP(SUB, TFliteOpSub); + REG_TFL_OP(SUM, TFliteOpSum); REG_TFL_OP(TANH, TFliteOpTanh); + REG_TFL_OP(TILE, TFliteOpTile); + REG_TFL_OP(TOPK_V2, TFliteOpTopKV2); REG_TFL_OP(TRANSPOSE, TFliteOpTranspose); + REG_TFL_OP(TRANSPOSE_CONV, TFliteOpTransposeConv); + REG_TFL_OP(UNIQUE, TFliteOpUnique); + REG_TFL_OP(UNPACK, TFliteOpUnpack); + REG_TFL_OP(WHERE, TFliteOpWhere); + REG_TFL_OP(ZEROS_LIKE, TFliteOpZerosLike); #undef REG_TFL_OP } diff --git a/compiler/tflchef/tools/file/CMakeLists.txt b/compiler/tflchef/tools/file/CMakeLists.txt index 477b7d9..f411d60 100644 --- a/compiler/tflchef/tools/file/CMakeLists.txt +++ b/compiler/tflchef/tools/file/CMakeLists.txt @@ -1,3 +1,4 @@ add_executable(tflchef-file Driver.cpp) +target_link_libraries(tflchef-file arser) target_link_libraries(tflchef-file tflchef_core) target_link_libraries(tflchef-file safemain) diff --git a/compiler/tflchef/tools/file/Driver.cpp b/compiler/tflchef/tools/file/Driver.cpp index 3ef7019..cecfeeb 100644 --- a/compiler/tflchef/tools/file/Driver.cpp +++ b/compiler/tflchef/tools/file/Driver.cpp @@ -20,30 +20,42 @@ #include #include +#include + #include #include int entry(int argc, char **argv) { - if (argc != 3) + arser::Arser arser; + arser.add_argument("recipe") + .type(arser::DataType::STR) + .help("Source recipe file path to convert"); + arser.add_argument("tflite").type(arser::DataType::STR).help("Target tflite file path"); + + try { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [recipe] [output]" << std::endl; - return 255; + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; } int32_t model_version = 1; ::tflchef::ModelRecipe model_recipe; + std::string recipe_path = arser.get("recipe"); // Load model recipe from a file { - std::ifstream is{argv[1]}; + std::ifstream is{recipe_path}; google::protobuf::io::IstreamInputStream iis{&is}; if (!google::protobuf::TextFormat::Parse(&iis, &model_recipe)) { - std::cerr << "ERROR: Failed to parse recipe '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to parse recipe '" << recipe_path << "'" << std::endl; return 255; } @@ -62,9 +74,10 @@ int entry(int argc, char **argv) auto generated_model = tflchef::cook(model_recipe); + std::string tflite_path = arser.get("tflite"); // Dump generated model into a file { - std::ofstream os{argv[2], std::ios::binary}; + std::ofstream os{tflite_path, std::ios::binary}; os.write(generated_model.base(), generated_model.size()); } diff --git a/compiler/tflchef/tools/reverse/CMakeLists.txt b/compiler/tflchef/tools/reverse/CMakeLists.txt index 63cb36c..a5c0f5b 100644 --- a/compiler/tflchef/tools/reverse/CMakeLists.txt +++ b/compiler/tflchef/tools/reverse/CMakeLists.txt @@ -1,3 +1,5 @@ add_executable(tflchef-reverse Driver.cpp) +target_link_libraries(tflchef-reverse arser) target_link_libraries(tflchef-reverse tflchef_tflite) target_link_libraries(tflchef-reverse safemain) +target_link_libraries(tflchef-reverse foder) diff --git a/compiler/tflchef/tools/reverse/Driver.cpp b/compiler/tflchef/tools/reverse/Driver.cpp index 5497564..1116dec 100644 --- a/compiler/tflchef/tools/reverse/Driver.cpp +++ b/compiler/tflchef/tools/reverse/Driver.cpp @@ -14,34 +14,41 @@ * limitations under the License. */ -#include #include +#include +#include + #include #include int entry(int argc, char **argv) { - if (argc != 3) + arser::Arser arser; + arser.add_argument("tflite") + .type(arser::DataType::STR) + .help("Source tflite file path to convert"); + arser.add_argument("recipe").type(arser::DataType::STR).help("Target recipe file path"); + + try { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [tflite] [output]" << std::endl; - return 255; + arser.parse(argc, argv); } - - // Load TF lite model from a tflite file - std::unique_ptr rawmodel = tflchef::load_tflite(argv[1]); - if (rawmodel == nullptr) + catch (const std::runtime_error &err) { - std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl; - return 255; + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; } - const tflite::Model *tflmodel = rawmodel->model(); + std::string tflite_path = arser.get("tflite"); + // Load TF lite model from a tflite file + const foder::FileLoader fileLoader{tflite_path}; + std::vector modelData = fileLoader.load(); + const tflite::Model *tflmodel = tflite::GetModel(modelData.data()); if (tflmodel == nullptr) { - std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load tflite '" << tflite_path << "'" << std::endl; return 255; } @@ -53,11 +60,12 @@ int entry(int argc, char **argv) return 255; } + std::string recipe_path = arser.get("recipe"); // Save to a file - bool result = tflchef::write_recipe(argv[2], recipe); + bool result = tflchef::write_recipe(recipe_path, recipe); if (!result) { - std::cerr << "ERROR: Failed to write to recipe '" << argv[2] << "'" << std::endl; + std::cerr << "ERROR: Failed to write to recipe '" << recipe_path << "'" << std::endl; return 255; } return 0; diff --git a/compiler/tfldump/CMakeLists.txt b/compiler/tfldump/CMakeLists.txt index 99b6365..e6afcb6 100644 --- a/compiler/tfldump/CMakeLists.txt +++ b/compiler/tfldump/CMakeLists.txt @@ -1,4 +1,5 @@ if(NOT TARGET mio_tflite) + message(STATUS "Build tfldump: FAILED (missing mio_tflite)") return() endif(NOT TARGET mio_tflite) @@ -8,7 +9,7 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(tfldump ${DRIVER} ${SOURCES}) target_include_directories(tfldump PRIVATE include) +target_link_libraries(tfldump arser) target_link_libraries(tfldump mio_tflite) target_link_libraries(tfldump safemain) -target_link_libraries(tfldump stdex) target_link_libraries(tfldump flatbuffers) diff --git a/compiler/tfldump/driver/Driver.cpp b/compiler/tfldump/driver/Driver.cpp index 2ede0fd..3961d2f 100644 --- a/compiler/tfldump/driver/Driver.cpp +++ b/compiler/tfldump/driver/Driver.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include @@ -21,30 +22,37 @@ int entry(int argc, char **argv) { - if (argc != 2) + arser::Arser arser; + arser.add_argument("tflite").type(arser::DataType::STR).help("TFLite file to dump"); + + try { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [tflite]" << std::endl; - return 255; + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << '\n'; + std::cout << arser; + return 0; } + std::string tflite_path = arser.get("tflite"); // Load TF lite model from a tflite file - std::unique_ptr model = tflread::load_tflite(argv[1]); + std::unique_ptr model = tflread::load_tflite(tflite_path); if (model == nullptr) { - std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load tflite '" << tflite_path << "'" << std::endl; return 255; } const tflite::Model *tflmodel = model->model(); if (tflmodel == nullptr) { - std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load tflite '" << tflite_path << "'" << std::endl; return 255; } - std::cout << "Dump: " << argv[1] << std::endl << std::endl; + std::cout << "Dump: " << tflite_path << std::endl << std::endl; std::cout << tflmodel << std::endl; diff --git a/compiler/tfldump/requires.cmake b/compiler/tfldump/requires.cmake index adcae7c..2cdd3a3 100644 --- a/compiler/tfldump/requires.cmake +++ b/compiler/tfldump/requires.cmake @@ -1 +1,3 @@ +require("arser") require("mio-tflite") +require("safemain") diff --git a/compiler/tfldump/src/Dump.cpp b/compiler/tfldump/src/Dump.cpp index e6b8425..e1562d4 100644 --- a/compiler/tfldump/src/Dump.cpp +++ b/compiler/tfldump/src/Dump.cpp @@ -110,8 +110,8 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) auto operators = reader.operators(); // dump operands(tensors) - os << "Operands: T(subgraph index : tensor index) TYPE (shape) B(buffer index) OperandName" - << std::endl; + os << "Operands: T(subgraph index : tensor index) TYPE (shape) (shape_signature) " + << "B(buffer index) OperandName" << std::endl; for (uint32_t i = 0; i < tensors->Length(); ++i) { // TODO refactor to some better structure @@ -124,6 +124,11 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) os << "T(" << reader.subgraph_index() << ":" << i << ") " << tflread::tensor_type(tensor) << " "; os << "(" << dims << ") "; + if (tensor->shape_signature()) + { + std::vector dims_sig = tflread::as_index_vector(tensor->shape_signature()); + os << "(" << dims_sig << ") "; + } os << "B(" << tensor->buffer() << ") "; os << tflread::tensor_name(tensor) << std::endl; @@ -154,7 +159,12 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) os << std::endl << strqindent; } if (q_params->zero_point()) + { os << "zeropt(" << q_params->zero_point() << ") "; + if (q_params->zero_point()->size() > 1) + os << std::endl << strqindent; + } + os << "quantized_dimension(" << q_params->quantized_dimension() << ")"; os << std::endl; } @@ -186,7 +196,7 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) for (auto input : inputs) { - os << " I T(" << input << ") "; + os << " I T(" << reader.subgraph_index() << ":" << input << ") "; if (input >= 0) { auto tensor = tensors->Get(input); @@ -196,7 +206,7 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) } for (auto output : outputs) { - os << " O T(" << output << ") "; + os << " O T(" << reader.subgraph_index() << ":" << output << ") "; if (output >= 0) { auto tensor = tensors->Get(output); @@ -214,14 +224,14 @@ void dump_sub_graph(std::ostream &os, tflread::Reader &reader) { auto tensor = tensors->Get(input); std::string name = tflread::tensor_name(tensor); - os << "I T(" << input << ") " << name << std::endl; + os << "I T(" << reader.subgraph_index() << ":" << input << ") " << name << std::endl; } for (const auto output : reader.outputs()) { auto tensor = tensors->Get(output); std::string name = tflread::tensor_name(tensor); - os << "O T(" << output << ") " << name << std::endl; + os << "O T(" << reader.subgraph_index() << ":" << output << ") " << name << std::endl; } os << std::endl; diff --git a/compiler/tfldump/src/OpPrinter.cpp b/compiler/tfldump/src/OpPrinter.cpp index 5120f42..9fc1a64 100644 --- a/compiler/tfldump/src/OpPrinter.cpp +++ b/compiler/tfldump/src/OpPrinter.cpp @@ -17,11 +17,11 @@ #include "OpPrinter.h" #include "Read.h" -#include +#include #include -using stdex::make_unique; +using std::make_unique; namespace tfldump { @@ -60,6 +60,35 @@ public: } }; +class ArgMinPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_ArgMinOptions()) + { + os << " "; + os << "OutputType(" << EnumNameTensorType(params->output_type()) << ") "; + os << std::endl; + } + } +}; + +class CastPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto cast_params = op->builtin_options_as_CastOptions()) + { + os << " "; + os << "in_data_type(" << tflite::EnumNameTensorType(cast_params->in_data_type()) << ") "; + os << "out_data_type(" << tflite::EnumNameTensorType(cast_params->out_data_type()) << ") "; + os << std::endl; + } + } +}; + class Conv2DPrinter : public OpPrinter { public: @@ -71,6 +100,8 @@ public: os << "Padding(" << conv_params->padding() << ") "; os << "Stride.W(" << conv_params->stride_w() << ") "; os << "Stride.H(" << conv_params->stride_h() << ") "; + os << "Dilation.W(" << conv_params->dilation_w_factor() << ") "; + os << "Dilation.H(" << conv_params->dilation_h_factor() << ") "; os << "Activation(" << EnumNameActivationFunctionType(conv_params->fused_activation_function()) << ")"; os << std::endl; @@ -130,6 +161,20 @@ public: } }; +class ReducerPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto reducer_params = op->builtin_options_as_ReducerOptions()) + { + os << " "; + os << "keep_dims(" << reducer_params->keep_dims() << ") "; + os << std::endl; + } + } +}; + class ReshapePrinter : public OpPrinter { public: @@ -145,6 +190,80 @@ public: } }; +class ResizeBilinearPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *resize_params = op->builtin_options_as_ResizeBilinearOptions()) + { + os << " "; + os << std::boolalpha; + os << "align_corners(" << resize_params->align_corners() << ")"; + os << "half_pixel_centers(" << resize_params->half_pixel_centers() << ")"; + os << std::endl; + } + } +}; + +class ResizeNearestNeighborPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *resize_params = op->builtin_options_as_ResizeNearestNeighborOptions()) + { + os << " "; + os << std::boolalpha; + os << "align_corners(" << resize_params->align_corners() << ")"; + os << std::endl; + } + } +}; + +class ReverseSequencePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_ReverseSequenceOptions()) + { + os << " "; + os << "seq_dim(" << std_params->seq_dim() << ") "; + os << "batch_dim(" << std_params->batch_dim() << ") "; + os << std::endl; + } + } +}; + +class DepthToSpacePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_DepthToSpaceOptions()) + { + os << " "; + os << "BlockSize(" << std_params->block_size() << ")"; + os << std::endl; + } + } +}; + +class SparseToDensePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_SparseToDenseOptions()) + { + os << " "; + os << "ValidateIndices(" << std_params->validate_indices() << ")"; + os << std::endl; + } + } +}; + class DepthwiseConv2DPrinter : public OpPrinter { public: @@ -184,6 +303,95 @@ public: } }; +class GatherPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_GatherOptions()) + { + os << " "; + os << "Axis(" << params->axis() << ") "; + + os << std::endl; + } + } +}; + +class IfPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_IfOptions()) + { + os << " "; + os << "then_subgraph_index(" << params->then_subgraph_index() << ") "; + os << "else_subgraph_index(" << params->else_subgraph_index() << ") "; + os << std::endl; + } + } +}; + +class L2NormPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_L2NormOptions()) + { + os << " "; + os << "Activation(" << EnumNameActivationFunctionType(params->fused_activation_function()) + << ") "; + os << std::endl; + } + } +}; + +class LeakyReluPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_LeakyReluOptions()) + { + os << " "; + os << "alpha(" << params->alpha() << ") "; + } + } +}; + +class LocalResponseNormalizationPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_LocalResponseNormalizationOptions()) + { + os << " "; + os << "radius(" << params->radius() << ") "; + os << "bias(" << params->bias() << ") "; + os << "alpha(" << params->alpha() << ") "; + os << "beta(" << params->beta() << ") "; + os << std::endl; + } + } +}; + +class MirrorPadPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_MirrorPadOptions()) + { + os << " "; + os << "mode(" << EnumNameMirrorPadMode(params->mode()) << ") "; + os << std::endl; + } + } +}; + class MulPrinter : public OpPrinter { public: @@ -214,6 +422,35 @@ public: } }; +class OneHotPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_OneHotOptions()) + { + os << " "; + os << "Axis(" << params->axis() << ") "; + + os << std::endl; + } + } +}; + +class ShapePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_ShapeOptions()) + { + os << " "; + os << "out_type(" << EnumNameTensorType(params->out_type()) << ") "; + os << std::endl; + } + } +}; + class SoftmaxPrinter : public OpPrinter { public: @@ -228,6 +465,87 @@ public: } }; +class SpaceToDepthPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *std_params = op->builtin_options_as_SpaceToDepthOptions()) + { + os << " "; + os << "BlockSize(" << std_params->block_size() << ")"; + os << std::endl; + } + } +}; + +class SqueezePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SqueezeOptions()) + { + os << " "; + os << "SqueezeDims("; + for (int i = 0; i < params->squeeze_dims()->size(); ++i) + { + if (i != 0) + os << ", "; + os << params->squeeze_dims()->Get(i); + } + os << ")"; + os << std::endl; + } + } +}; + +class StridedSlicePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *strided_slice_params = op->builtin_options_as_StridedSliceOptions()) + { + os << " "; + os << "begin_mask(" << strided_slice_params->begin_mask() << ") "; + os << "end_mask(" << strided_slice_params->end_mask() << ") "; + os << "ellipsis_mask(" << strided_slice_params->ellipsis_mask() << ") "; + os << "new_axis_mask(" << strided_slice_params->new_axis_mask() << ") "; + os << "shrink_axis_mask(" << strided_slice_params->shrink_axis_mask() << ") "; + os << std::endl; + } + } +}; + +class SplitPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SplitOptions()) + { + os << " "; + os << "num_splits(" << params->num_splits() << ") "; + os << std::endl; + } + } +}; + +class SplitVPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_SplitVOptions()) + { + os << " "; + os << "num_splits(" << params->num_splits() << ") "; + os << std::endl; + } + } +}; + class SubPrinter : public OpPrinter { public: @@ -243,6 +561,51 @@ public: } }; +class TransposeConvPrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_TransposeConvOptions()) + { + os << " "; + os << "Padding(" << params->padding() << ") "; + os << "Stride.W(" << params->stride_w() << ") "; + os << "Stride.H(" << params->stride_h() << ") "; + os << std::endl; + } + } +}; + +class WhilePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_WhileOptions()) + { + os << " "; + os << "cond_subgraph_index(" << params->cond_subgraph_index() << ") "; + os << "body_subgraph_index(" << params->body_subgraph_index() << ") "; + os << std::endl; + } + } +}; + +class UniquePrinter : public OpPrinter +{ +public: + void options(const tflite::Operator *op, std::ostream &os) const override + { + if (auto *params = op->builtin_options_as_UniqueOptions()) + { + os << " "; + os << "idx_out_type(" << EnumNameTensorType(params->idx_out_type()) << ") "; + os << std::endl; + } + } +}; + class CustomOpPrinter : public OpPrinter { public: @@ -286,20 +649,69 @@ public: OpPrinterRegistry::OpPrinterRegistry() { _op_map[tflite::BuiltinOperator_ADD] = make_unique(); + // There is no Option for ADD_N _op_map[tflite::BuiltinOperator_ARG_MAX] = make_unique(); + _op_map[tflite::BuiltinOperator_ARG_MIN] = make_unique(); _op_map[tflite::BuiltinOperator_AVERAGE_POOL_2D] = make_unique(); + _op_map[tflite::BuiltinOperator_CAST] = make_unique(); + // There is no Option for CEIL _op_map[tflite::BuiltinOperator_CONCATENATION] = make_unique(); _op_map[tflite::BuiltinOperator_CONV_2D] = make_unique(); + _op_map[tflite::BuiltinOperator_DEPTH_TO_SPACE] = make_unique(); _op_map[tflite::BuiltinOperator_DEPTHWISE_CONV_2D] = make_unique(); _op_map[tflite::BuiltinOperator_DIV] = make_unique(); + // There is no Option for FLOOR + // There is no Option for FLOOR_MOD _op_map[tflite::BuiltinOperator_FULLY_CONNECTED] = make_unique(); + _op_map[tflite::BuiltinOperator_GATHER] = make_unique(); + _op_map[tflite::BuiltinOperator_IF] = make_unique(); + _op_map[tflite::BuiltinOperator_L2_POOL_2D] = make_unique(); + _op_map[tflite::BuiltinOperator_L2_NORMALIZATION] = make_unique(); + _op_map[tflite::BuiltinOperator_LEAKY_RELU] = make_unique(); + _op_map[tflite::BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION] = + make_unique(); + // There is no Option for LOG + // There is no Option for LOGISTIC + // There is no Option for LOG_SOFTMAX _op_map[tflite::BuiltinOperator_MAX_POOL_2D] = make_unique(); + _op_map[tflite::BuiltinOperator_MIRROR_PAD] = make_unique(); _op_map[tflite::BuiltinOperator_MUL] = make_unique(); + _op_map[tflite::BuiltinOperator_ONE_HOT] = make_unique(); _op_map[tflite::BuiltinOperator_PACK] = make_unique(); - // There is no Option for ReLU and ReLU6 + // There is no Option for PAD + // There is no Option for PRELU + // There is no Option for RELU + // There is no Option for RELU6 + // There is no Option for RELU_N1_TO_1 + _op_map[tflite::BuiltinOperator_REDUCE_ANY] = make_unique(); + _op_map[tflite::BuiltinOperator_REDUCE_MAX] = make_unique(); + _op_map[tflite::BuiltinOperator_REDUCE_MIN] = make_unique(); + _op_map[tflite::BuiltinOperator_REDUCE_PROD] = make_unique(); _op_map[tflite::BuiltinOperator_RESHAPE] = make_unique(); + _op_map[tflite::BuiltinOperator_RESIZE_BILINEAR] = make_unique(); + _op_map[tflite::BuiltinOperator_RESIZE_NEAREST_NEIGHBOR] = + make_unique(); + _op_map[tflite::BuiltinOperator_REVERSE_SEQUENCE] = make_unique(); + // There is no Option for ROUND + // There is no Option for SELECT + // There is no Option for SELECT_V2 + _op_map[tflite::BuiltinOperator_SHAPE] = make_unique(); + // There is no Option for SIN + // There is no Option for SLICE _op_map[tflite::BuiltinOperator_SOFTMAX] = make_unique(); + _op_map[tflite::BuiltinOperator_SPACE_TO_DEPTH] = make_unique(); + // There is no Option for SPACE_TO_BATCH_ND + _op_map[tflite::BuiltinOperator_SPARSE_TO_DENSE] = make_unique(); + _op_map[tflite::BuiltinOperator_SPLIT] = make_unique(); + _op_map[tflite::BuiltinOperator_SPLIT_V] = make_unique(); + _op_map[tflite::BuiltinOperator_SQUEEZE] = make_unique(); + _op_map[tflite::BuiltinOperator_STRIDED_SLICE] = make_unique(); _op_map[tflite::BuiltinOperator_SUB] = make_unique(); + _op_map[tflite::BuiltinOperator_SUM] = make_unique(); + _op_map[tflite::BuiltinOperator_TRANSPOSE_CONV] = make_unique(); + // There is no Option for TOPK_V2 + _op_map[tflite::BuiltinOperator_UNIQUE] = make_unique(); + _op_map[tflite::BuiltinOperator_WHILE] = make_unique(); _op_map[tflite::BuiltinOperator_CUSTOM] = make_unique(); } diff --git a/compiler/tflite2circle-conversion-test/CMakeLists.txt b/compiler/tflite2circle-conversion-test/CMakeLists.txt index d7b6442..83fe23a 100644 --- a/compiler/tflite2circle-conversion-test/CMakeLists.txt +++ b/compiler/tflite2circle-conversion-test/CMakeLists.txt @@ -2,7 +2,6 @@ nnas_include(TargetRequire) unset(REQUIRED_TARGETS) list(APPEND REQUIRED_TARGETS tflite2circle) -list(APPEND REQUIRED_TARGETS tflchef) TargetRequire_Return(${REQUIRED_TARGETS}) nncc_find_resource(TensorFlowLiteRecipes) @@ -10,46 +9,19 @@ nncc_find_resource(TensorFlowLiteRecipes) set(TEST_REPO "${TensorFlowLiteRecipes_DIR}") set(TEST_RECIPE_FILENAME "test.recipe") -unset(TESTCASES) -macro(add NAME) - list(APPEND TESTCASES ${NAME}) -endmacro(add) - -# Read "test.lst" -include("test.lst") +file(GLOB RECIPES RELATIVE ${TEST_REPO} "${TEST_REPO}/*/${TEST_RECIPE_FILENAME}") unset(TEST_DEPS) unset(TEST_NAMES) -foreach(PREFIX IN ITEMS ${TESTCASES}) - if(NOT IS_DIRECTORY "${TEST_REPO}/${PREFIX}") - message(FATAL_ERROR "Missing '${PREFIX}' test") +foreach(RECIPE IN ITEMS ${RECIPES}) + get_filename_component(PREFIX ${RECIPE} DIRECTORY) + if(NOT IS_DIRECTORY "${TEST_REPO}/${RECIPE_PREFIX}") + message(FATAL_ERROR "Missing '${RECIPE_PREFIX}' test") endif() - set(RECIPE_SOURCE_PATH "${TEST_REPO}/${PREFIX}/${TEST_RECIPE_FILENAME}") - set(RECIPE_FILE "${PREFIX}.recipe") - set(RECIPE_BINARY_PATH "${CMAKE_CURRENT_BINARY_DIR}/${RECIPE_FILE}") - - set(TFLITE_FILE "${PREFIX}.tflite") - set(TFLITE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/${TFLITE_FILE}") - - # Copy .recipe - add_custom_command(OUTPUT ${RECIPE_BINARY_PATH} - COMMAND ${CMAKE_COMMAND} -E copy "${RECIPE_SOURCE_PATH}" "${RECIPE_BINARY_PATH}" - DEPENDS ${RECIPE_SOURCE_PATH} - COMMENT "Generate ${RECIPE_FILE}" - ) - - # Generate .tflite - add_custom_command(OUTPUT ${TFLITE_OUTPUT_PATH} - COMMAND $ ${RECIPE_BINARY_PATH} ${TFLITE_OUTPUT_PATH} - DEPENDS ${RECIPE_BINARY_PATH} - COMMENT "Generate ${PREFIX}.tflite" - ) - - list(APPEND TEST_DEPS ${RECIPE_BINARY_PATH} ${TFLITE_OUTPUT_PATH}) list(APPEND TEST_NAMES ${PREFIX}) -endforeach(PREFIX IN ITEMS ${TESTCASES}) +endforeach(RECIPE IN ITEMS ${RECIPES}) ## ## Copy testall @@ -66,6 +38,8 @@ add_custom_command( list(APPEND TEST_DEPS "${TEST_RUNNER}") +get_target_property(ARTIFACTS_BIN_PATH testDataGenerator BINARY_DIR) + ### ### Generate test.config ### @@ -89,6 +63,6 @@ add_test( NAME tflite2circle_conversion_test COMMAND "${TEST_RUNNER}" "${TEST_CONFIG}" - "${CMAKE_CURRENT_BINARY_DIR}" + "${ARTIFACTS_BIN_PATH}" ${TEST_NAMES} ) diff --git a/compiler/tflite2circle-conversion-test/requires.cmake b/compiler/tflite2circle-conversion-test/requires.cmake index 730711a..87b0099 100644 --- a/compiler/tflite2circle-conversion-test/requires.cmake +++ b/compiler/tflite2circle-conversion-test/requires.cmake @@ -1,2 +1,2 @@ +require("common-artifacts") require("tflite2circle") -require("tflchef") diff --git a/compiler/tflite2circle-conversion-test/test.lst b/compiler/tflite2circle-conversion-test/test.lst deleted file mode 100644 index 8b8f0aa..0000000 --- a/compiler/tflite2circle-conversion-test/test.lst +++ /dev/null @@ -1,20 +0,0 @@ -add(Add_000) -add(AveragePool2D_000) -add(Concatenation_000) -add(Conv2D_000) -add(Conv2D_001) -add(Conv2D_U8_000) -add(DepthwiseConv2D_000) -add(Div_000) -add(FullyConnected_000) -add(FullyConnected_001) -add(MaxPool2D_000) -add(Quantization_000) -add(ReLU_000) -add(ReLU6_000) -add(Reshape_000) -add(Reshape_001) -add(Reshape_U8_000) -add(Sqrt_000) -add(Sub_000) -add(Sub_001) diff --git a/compiler/tflite2circle-conversion-test/testall.sh b/compiler/tflite2circle-conversion-test/testall.sh index 6645437..2290ee6 100755 --- a/compiler/tflite2circle-conversion-test/testall.sh +++ b/compiler/tflite2circle-conversion-test/testall.sh @@ -13,6 +13,7 @@ if [[ $# -lt 2 ]]; then exit 255 fi +BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CONFIG_PATH="$1"; shift WORKDIR="$1"; shift @@ -31,11 +32,11 @@ while [[ $# -ne 0 ]]; do TESTED+=("${PREFIX}") - PASSED_TAG="${PREFIX}.passed" + PASSED_TAG="${BINDIR}/${PREFIX}.passed" rm -f "${PASSED_TAG}" - cat > "${PREFIX}.log" <( + cat > "${BINDIR}/${PREFIX}.log" <( exec 2>&1 echo "-- Found tflite: ${PREFIX}.tflite" @@ -48,7 +49,7 @@ while [[ $# -ne 0 ]]; do # Generate circle "${TFLITE2CIRCLE_PATH}" \ "${WORKDIR}/${PREFIX}.tflite" \ - "${WORKDIR}/${PREFIX}.circle" + "${BINDIR}/${PREFIX}.circle" if [[ $? -eq 0 ]]; then touch "${PASSED_TAG}" diff --git a/compiler/tflite2circle/CMakeLists.txt b/compiler/tflite2circle/CMakeLists.txt index f846a2b..a0a2e02 100644 --- a/compiler/tflite2circle/CMakeLists.txt +++ b/compiler/tflite2circle/CMakeLists.txt @@ -10,7 +10,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") add_executable(tflite2circle ${DRIVER} ${SOURCES}) target_include_directories(tflite2circle PRIVATE include) target_include_directories(tflite2circle PRIVATE src) +target_link_libraries(tflite2circle arser) target_link_libraries(tflite2circle safemain) -target_link_libraries(tflite2circle stdex) target_link_libraries(tflite2circle mio_tflite) target_link_libraries(tflite2circle mio_circle) + +install(TARGETS tflite2circle DESTINATION bin) diff --git a/compiler/tflite2circle/driver/Driver.cpp b/compiler/tflite2circle/driver/Driver.cpp index 826f9de..67b8e33 100644 --- a/compiler/tflite2circle/driver/Driver.cpp +++ b/compiler/tflite2circle/driver/Driver.cpp @@ -15,43 +15,60 @@ */ #include +#include +#include #include +#include + #include "CircleModel.h" #include "TFLModel.h" int entry(int argc, char **argv) { - if (argc != 3) + arser::Arser arser{"tflite2circle is a Tensorflow lite to circle model converter"}; + + arser.add_argument("tflite") + .nargs(1) + .type(arser::DataType::STR) + .help("Source tflite file path to convert"); + arser.add_argument("circle").nargs(1).type(arser::DataType::STR).help("Target circle file path"); + + try { - std::cerr << "ERROR: Failed to parse arguments" << std::endl; - std::cerr << std::endl; - std::cerr << "USAGE: " << argv[0] << " [tflite] [circle]" << std::endl; - return 255; + arser.parse(argc, argv); + } + catch (const std::runtime_error &err) + { + std::cout << err.what() << std::endl; + std::cout << arser; + return 0; } + std::string tfl_path = arser.get("tflite"); + std::string circle_path = arser.get("circle"); // read tflite file - tflite2circle::TFLModel tfl_model(argv[1]); + tflite2circle::TFLModel tfl_model(tfl_path); if (!tfl_model.is_valid()) { - std::cerr << "ERROR: Failed to load tflite '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to load tflite '" << tfl_path << "'" << std::endl; return 255; } // create flatbuffer builder - auto flatbuffer_builder = stdex::make_unique(1024); + auto flatbuffer_builder = std::make_unique(1024); // convert tflite to circle tflite2circle::CircleModel circle_model{flatbuffer_builder, tfl_model}; - std::ofstream outfile{argv[2], std::ios::binary}; + std::ofstream outfile{circle_path, std::ios::binary}; outfile.write(circle_model.base(), circle_model.size()); outfile.close(); // TODO find a better way of error handling if (outfile.fail()) { - std::cerr << "ERROR: Failed to write circle '" << argv[1] << "'" << std::endl; + std::cerr << "ERROR: Failed to write circle '" << circle_path << "'" << std::endl; return 255; } diff --git a/compiler/tflite2circle/include/CircleModel.h b/compiler/tflite2circle/include/CircleModel.h index ee1a8fe..e1e35d8 100644 --- a/compiler/tflite2circle/include/CircleModel.h +++ b/compiler/tflite2circle/include/CircleModel.h @@ -23,7 +23,6 @@ #include #include #include -#include #include "TFLModel.h" diff --git a/compiler/tflite2circle/requires.cmake b/compiler/tflite2circle/requires.cmake index dd67319..ff19b74 100644 --- a/compiler/tflite2circle/requires.cmake +++ b/compiler/tflite2circle/requires.cmake @@ -1,4 +1,4 @@ +require("arser") require("mio-tflite") require("mio-circle") require("safemain") -require("stdex") diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions.h index 0167da2..159a8af 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions.h +++ b/compiler/tflite2circle/src/BuildBuiltinOptions.h @@ -21,34 +21,90 @@ #include "BuildBuiltinOptions/AbsOptions.h" #include "BuildBuiltinOptions/AddOptions.h" +#include "BuildBuiltinOptions/AddNOptions.h" #include "BuildBuiltinOptions/ArgMaxOptions.h" +#include "BuildBuiltinOptions/ArgMinOptions.h" +#include "BuildBuiltinOptions/BatchMatMulOptions.h" #include "BuildBuiltinOptions/BatchToSpaceNDOptions.h" #include "BuildBuiltinOptions/CastOptions.h" #include "BuildBuiltinOptions/ConcatenationOptions.h" #include "BuildBuiltinOptions/Conv2DOptions.h" #include "BuildBuiltinOptions/CosOptions.h" +#include "BuildBuiltinOptions/DepthToSpaceOptions.h" #include "BuildBuiltinOptions/DepthwiseConv2DOptions.h" #include "BuildBuiltinOptions/DivOptions.h" #include "BuildBuiltinOptions/EqualOptions.h" #include "BuildBuiltinOptions/ExpandDimsOptions.h" #include "BuildBuiltinOptions/ExpOptions.h" #include "BuildBuiltinOptions/FillOptions.h" +#include "BuildBuiltinOptions/FloorDivOptions.h" +#include "BuildBuiltinOptions/FloorModOptions.h" #include "BuildBuiltinOptions/FullyConnectedOptions.h" +#include "BuildBuiltinOptions/GatherOptions.h" +#include "BuildBuiltinOptions/GatherNdOptions.h" +#include "BuildBuiltinOptions/GreaterOptions.h" #include "BuildBuiltinOptions/GreaterEqualOptions.h" +#include "BuildBuiltinOptions/IfOptions.h" +#include "BuildBuiltinOptions/L2NormalizeOptions.h" +// L2Pool2D uses Pool2DOptions +#include "BuildBuiltinOptions/LeakyReluOptions.h" +#include "BuildBuiltinOptions/LessOptions.h" +#include "BuildBuiltinOptions/LessEqualOptions.h" +#include "BuildBuiltinOptions/LocalResponseNormalizationOptions.h" +#include "BuildBuiltinOptions/LogicalAndOptions.h" #include "BuildBuiltinOptions/LogicalNotOptions.h" #include "BuildBuiltinOptions/LogicalOrOptions.h" +// There is no LogisticOptions +#include "BuildBuiltinOptions/LogSoftmaxOptions.h" +#include "BuildBuiltinOptions/MatrixDiagOptions.h" +#include "BuildBuiltinOptions/MatrixSetDiagOptions.h" +#include "BuildBuiltinOptions/MaximumMinimumOptions.h" +#include "BuildBuiltinOptions/MirrorPadOptions.h" #include "BuildBuiltinOptions/MulOptions.h" +#include "BuildBuiltinOptions/NegOptions.h" #include "BuildBuiltinOptions/NotEqualOptions.h" +#include "BuildBuiltinOptions/OneHotOptions.h" #include "BuildBuiltinOptions/PackOptions.h" #include "BuildBuiltinOptions/PadOptions.h" +#include "BuildBuiltinOptions/RangeOptions.h" #include "BuildBuiltinOptions/Pool2DOptions.h" +#include "BuildBuiltinOptions/PowOptions.h" +#include "BuildBuiltinOptions/RankOptions.h" +// There is no PReluOptions #include "BuildBuiltinOptions/ReducerOptions.h" #include "BuildBuiltinOptions/ReshapeOptions.h" +#include "BuildBuiltinOptions/ResizeBilinearOptions.h" +#include "BuildBuiltinOptions/ResizeNearestNeighborOptions.h" +#include "BuildBuiltinOptions/ReverseSequenceOptions.h" +#include "BuildBuiltinOptions/ReverseV2Options.h" +// There is no RoundOptions +// There is no RsqrtOptions +#include "BuildBuiltinOptions/ScatterNdOptions.h" +#include "BuildBuiltinOptions/SegmentSumOptions.h" +#include "BuildBuiltinOptions/SelectOptions.h" +#include "BuildBuiltinOptions/SelectV2Options.h" #include "BuildBuiltinOptions/ShapeOptions.h" +// There is no SinOptions +#include "BuildBuiltinOptions/SliceOptions.h" #include "BuildBuiltinOptions/SoftmaxOptions.h" +#include "BuildBuiltinOptions/SpaceToBatchNDOptions.h" +#include "BuildBuiltinOptions/SpaceToDepthOptions.h" +#include "BuildBuiltinOptions/SparseToDenseOptions.h" #include "BuildBuiltinOptions/SplitOptions.h" +#include "BuildBuiltinOptions/SplitVOptions.h" +#include "BuildBuiltinOptions/SquaredDifferenceOptions.h" +#include "BuildBuiltinOptions/SquareOptions.h" #include "BuildBuiltinOptions/SqueezeOptions.h" +#include "BuildBuiltinOptions/StridedSliceOptions.h" #include "BuildBuiltinOptions/SubOptions.h" +#include "BuildBuiltinOptions/TileOptions.h" +#include "BuildBuiltinOptions/TopKV2Options.h" #include "BuildBuiltinOptions/TransposeOptions.h" +#include "BuildBuiltinOptions/TransposeConvOptions.h" +#include "BuildBuiltinOptions/UniqueOptions.h" +#include "BuildBuiltinOptions/UnpackOptions.h" +#include "BuildBuiltinOptions/WhereOptions.h" +#include "BuildBuiltinOptions/WhileOptions.h" +#include "BuildBuiltinOptions/ZerosLikeOptions.h" #endif // __BUILD_BUITIN_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.cpp new file mode 100644 index 0000000..df8b083 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AddNOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_AddNOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::AddNOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.h new file mode 100644 index 0000000..9e18e8a --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/AddNOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_ADD_N_OPTIONS_H__ +#define __BBO_ADD_N_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_AddNOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_ADD_N_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp new file mode 100644 index 0000000..204558d --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ArgMinOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ArgMinOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_ArgMinOptions(); + assert(tflite_builtin_options); + circle::ArgMinOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_output_type( + get_circle_tensortype(tflite_builtin_options->output_type())); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.h new file mode 100644 index 0000000..76cbc39 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ArgMinOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_ARGMIN_OPTIONS_H__ +#define __BBO_ARGMIN_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ArgMinOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_ARGMIN_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.cpp new file mode 100644 index 0000000..ac0a094 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "BatchMatMulOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_BatchMatMulOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_BatchMatMulOptions(); + assert(tflite_builtin_options); + circle::BatchMatMulOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_adjoint_lhs(tflite_builtin_options->adj_x()); + builtin_options_builder.add_adjoint_rhs(tflite_builtin_options->adj_y()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.h new file mode 100644 index 0000000..b1e90aa --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/BatchMatMulOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_BATCH_MATMUL_OPTIONS_H__ +#define __BBO_BATCH_MATMUL_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_BatchMatMulOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_BATCH_MATMUL_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp index f07fb3b..bc14452 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/CastOptions.cpp @@ -26,7 +26,9 @@ flatbuffers::Offset build_circle_CastOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) { auto tflite_builtin_options = op->builtin_options_as_CastOptions(); - assert(tflite_builtin_options); + if (tflite_builtin_options == nullptr) + return 0; + circle::CastOptionsBuilder builtin_options_builder{fb}; builtin_options_builder.add_in_data_type( get_circle_tensortype(tflite_builtin_options->in_data_type())); diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.cpp new file mode 100644 index 0000000..669aadb --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DepthToSpaceOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_DepthToSpaceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_DepthToSpaceOptions(); + assert(tflite_builtin_options); + circle::DepthToSpaceOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_block_size(tflite_builtin_options->block_size()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.h new file mode 100644 index 0000000..47c09a8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/DepthToSpaceOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_DEPTH_TO_SPACE_OPTIONS_H__ +#define __BBO_DEPTH_TO_SPACE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_DepthToSpaceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_DEPTH_TO_SPACE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.cpp new file mode 100644 index 0000000..aa08cfd --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FloorDivOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_FloorDivOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::FloorDivOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.h new file mode 100644 index 0000000..0f65591 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorDivOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_FLOOR_DIV_OPTIONS_H__ +#define __BBO_FLOOR_DIV_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_FloorDivOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_FLOOR_DIV_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.cpp new file mode 100644 index 0000000..770351e --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "FloorModOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_FloorModOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::FloorModOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.h new file mode 100644 index 0000000..e53d5f7 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/FloorModOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_FLOOR_MOD_OPTIONS_H__ +#define __BBO_FLOOR_MOD_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_FloorModOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_FLOOR_MOD_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.cpp new file mode 100644 index 0000000..487cce1 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GatherNdOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GatherNdOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::GatherNdOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.h new file mode 100644 index 0000000..55e4f7b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherNdOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_GATHER_ND_OPTIONS_H__ +#define __BBO_GATHER_ND_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GatherNdOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_GATHER_ND_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.cpp new file mode 100644 index 0000000..ecd5dc1 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GatherOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GatherOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_GatherOptions(); + assert(tflite_builtin_options); + circle::GatherOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_axis(tflite_builtin_options->axis()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.h new file mode 100644 index 0000000..300a7f7 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GatherOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_GATHER_OPTIONS_H__ +#define __BBO_GATHER_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GatherOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_GATHER_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.cpp new file mode 100644 index 0000000..14ca0cd --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "GreaterOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GreaterOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::GreaterOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.h new file mode 100644 index 0000000..46e4d99 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/GreaterOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_GREATER_OPTIONS_H__ +#define __BBO_GREATER_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_GreaterOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_GREATER_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.cpp new file mode 100644 index 0000000..cc5be49 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "IfOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_IfOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_IfOptions(); + assert(tflite_builtin_options); + circle::IfOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_then_subgraph_index(tflite_builtin_options->then_subgraph_index()); + builtin_options_builder.add_else_subgraph_index(tflite_builtin_options->else_subgraph_index()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.h new file mode 100644 index 0000000..6483d7b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/IfOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_IF_OPTIONS_H__ +#define __BBO_IF_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_IfOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_IF_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp new file mode 100644 index 0000000..d58aed8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "L2NormalizeOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_L2NormOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_L2NormOptions(); + assert(tflite_builtin_options); + circle::L2NormOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_fused_activation_function( + get_circle_activation_function_type(tflite_builtin_options->fused_activation_function())); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.h new file mode 100644 index 0000000..5568c4e --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/L2NormalizeOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_L2NORMALIZE_OPTIONS_H__ +#define __BBO_L2NORMALIZE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_L2NormOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_L2NORMALIZE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.cpp new file mode 100644 index 0000000..793b1d7 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LeakyReluOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LeakyReluOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto *tflite_builtin_options = op->builtin_options_as_LeakyReluOptions(); + assert(tflite_builtin_options); + circle::LeakyReluOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_alpha(tflite_builtin_options->alpha()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.h new file mode 100644 index 0000000..a2168f2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LeakyReluOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LEAKY_RELU_OPTIONS_H__ +#define __BBO_LEAKY_RELU_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LeakyReluOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LEAKY_RELU_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.cpp new file mode 100644 index 0000000..09a7753 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LessEqualOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LessEqualOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::LessEqualOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.h new file mode 100644 index 0000000..3477c02 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LessEqualOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LESSEQUAL_OPTIONS_H__ +#define __BBO_LESSEQUAL_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LessEqualOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LESSEQUAL_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.cpp new file mode 100644 index 0000000..0009dd6 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LessOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LessOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::LessOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.h new file mode 100644 index 0000000..932809a --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LessOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LESS_OPTIONS_H__ +#define __BBO_LESS_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LessOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LESS_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.cpp new file mode 100644 index 0000000..342f6a8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LocalResponseNormalizationOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_LocalResponseNormalizationOptions(); + assert(tflite_builtin_options); + circle::LocalResponseNormalizationOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_radius(tflite_builtin_options->radius()); + builtin_options_builder.add_bias(tflite_builtin_options->bias()); + builtin_options_builder.add_alpha(tflite_builtin_options->alpha()); + builtin_options_builder.add_beta(tflite_builtin_options->beta()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.h new file mode 100644 index 0000000..0b43fee --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LocalResponseNormalizationOptions.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LOCAL_RESPONSE_NORMALIZATION_OPTIONS_H__ +#define __BBO_LOCAL_RESPONSE_NORMALIZATION_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LOCAL_RESPONSE_NORMALIZATION_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.cpp new file mode 100644 index 0000000..2710288 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogSoftmaxOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LogSoftmaxOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::LogSoftmaxOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.h new file mode 100644 index 0000000..920d1bd --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LogSoftmaxOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LOG_SOFTMAX_OPTIONS_H__ +#define __BBO_LOG_SOFTMAX_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LogSoftmaxOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LOG_SOFTMAX_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.cpp new file mode 100644 index 0000000..52bfe0b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "LogicalAndOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LogicalAndOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::LogicalAndOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.h new file mode 100644 index 0000000..90243d8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/LogicalAndOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_LOGICALAND_OPTIONS_H__ +#define __BBO_LOGICALAND_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_LogicalAndOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_LOGICALAND_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.cpp new file mode 100644 index 0000000..87a5504 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixDiagOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MatrixDiagOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::MatrixDiagOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.h new file mode 100644 index 0000000..0fddaee --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixDiagOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_MATRIX_DIAG_OPTIONS_H__ +#define __BBO_MATRIX_DIAG_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MatrixDiagOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_MATRIX_DIAG_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.cpp new file mode 100644 index 0000000..c2e6890 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MatrixSetDiagOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::MatrixSetDiagOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.h new file mode 100644 index 0000000..2da7426 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MatrixSetDiagOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_MATRIX_SET_DIAG_OPTIONS_H__ +#define __BBO_MATRIX_SET_DIAG_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_MATRIX_SET_DIAG_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp new file mode 100644 index 0000000..d2d2888 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "MaximumMinimumOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MaximumMinimumOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_MaximumMinimumOptions(); + assert(tflite_builtin_options); + circle::MaximumMinimumOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.h new file mode 100644 index 0000000..fdaa7b8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MaximumMinimumOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_MAXIMUMMINIMUM_OPTIONS_H__ +#define __BBO_MAXIMUMMINIMUM_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MaximumMinimumOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_MAXIMUMMINIMUM_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.cpp new file mode 100644 index 0000000..5a0f7aa --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PadOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MirrorPadOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_MirrorPadOptions(); + assert(tflite_builtin_options); + circle::MirrorPadOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_mode(get_circle_mirrorpad_mode(tflite_builtin_options->mode())); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.h new file mode 100644 index 0000000..6459dc3 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/MirrorPadOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_MIRROR_PAD_OPTIONS_H__ +#define __BBO_MIRROR_PAD_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_MirrorPadOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_MIRROR_PAD_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.cpp new file mode 100644 index 0000000..9bc62bb --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "NegOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_NegOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *) +{ + circle::NegOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.h new file mode 100644 index 0000000..8cdba0d --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/NegOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_NEG_OPTIONS_H__ +#define __BBO_NEG_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_NegOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_NEG_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.cpp new file mode 100644 index 0000000..d4ca0b8 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "OneHotOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_OneHotOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_OneHotOptions(); + assert(tflite_builtin_options); + circle::OneHotOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_axis(tflite_builtin_options->axis()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.h new file mode 100644 index 0000000..fa24be9 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/OneHotOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_ONEHOT_OPTIONS_H__ +#define __BBO_ONEHOT_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_OneHotOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_ONEHOT_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.cpp new file mode 100644 index 0000000..1be39d7 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "PowOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_PowOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + circle::PowOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.h new file mode 100644 index 0000000..9bacd46 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/PowOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_POW_OPTIONS_H__ +#define __BBO_POW_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset build_circle_PowOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_POW_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.cpp new file mode 100644 index 0000000..4937613 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RangeOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_RangeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::RangeOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.h new file mode 100644 index 0000000..3ee4004 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/RangeOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_RANGE_OPTIONS_H__ +#define __BBO_RANGE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_RangeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_RANGE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.cpp new file mode 100644 index 0000000..a5cbed5 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RankOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_RankOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::RankOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.h new file mode 100644 index 0000000..4f70bb3 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/RankOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_RANK_OPTIONS_H__ +#define __BBO_RANK_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_RankOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_RANK_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ReshapeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ReshapeOptions.cpp index dc8e736..265f20d 100644 --- a/compiler/tflite2circle/src/BuildBuiltinOptions/ReshapeOptions.cpp +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ReshapeOptions.cpp @@ -25,7 +25,9 @@ flatbuffers::Offset build_circle_ReshapeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) { auto tflite_builtin_options = op->builtin_options_as_ReshapeOptions(); - assert(tflite_builtin_options); + if (tflite_builtin_options == nullptr) + return 0; + std::vector new_shape_vec{tflite_builtin_options->new_shape()->begin(), tflite_builtin_options->new_shape()->end()}; auto new_shape = fb.CreateVector(new_shape_vec); diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.cpp new file mode 100644 index 0000000..e02ca83 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeBilinearOptions.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ResizeBilinearOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_ResizeBilinearOptions(); + assert(tflite_builtin_options); + + circle::ResizeBilinearOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_align_corners(tflite_builtin_options->align_corners()); + builtin_options_builder.add_half_pixel_centers(tflite_builtin_options->half_pixel_centers()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.h new file mode 100644 index 0000000..d645eff --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeBilinearOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_RESIZE_BILINEAR_OPTIONS_H__ +#define __BBO_RESIZE_BILINEAR_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ResizeBilinearOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_RESIZE_BILINEAR_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.cpp new file mode 100644 index 0000000..572bd3d --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ResizeNearestNeighborOptions.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_ResizeNearestNeighborOptions(); + assert(tflite_builtin_options); + + circle::ResizeNearestNeighborOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_align_corners(tflite_builtin_options->align_corners()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.h new file mode 100644 index 0000000..f87a433 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ResizeNearestNeighborOptions.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_RESIZE_NEAREST_NEIGHBOR_OPTIONS_H__ +#define __BBO_RESIZE_NEAREST_NEIGHBOR_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_RESIZE_NEAREST_NEIGHBOR_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.cpp new file mode 100644 index 0000000..57f7d68 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseSequenceOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ReverseSequenceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_ReverseSequenceOptions(); + assert(tflite_builtin_options); + circle::ReverseSequenceOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_seq_dim(tflite_builtin_options->seq_dim()); + builtin_options_builder.add_batch_dim(tflite_builtin_options->batch_dim()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.h new file mode 100644 index 0000000..b056790 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseSequenceOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_REVERSE_SEQUENCE_OPTIONS_H__ +#define __BBO_REVERSE_SEQUENCE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ReverseSequenceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_REVERSE_SEQUENCE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.cpp new file mode 100644 index 0000000..b6771d3 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ReverseV2Options.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ReverseV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::ReverseV2OptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.h new file mode 100644 index 0000000..a92dd9e --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ReverseV2Options.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_REVERSE_V2_OPTIONS_H__ +#define __BBO_REVERSE_V2_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ReverseV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_REVERSE_V2_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.cpp new file mode 100644 index 0000000..e794805 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ScatterNdOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ScatterNdOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::ScatterNdOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.h new file mode 100644 index 0000000..de17ebc --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ScatterNdOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SCATTER_ND_OPTIONS_H__ +#define __BBO_SCATTER_ND_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ScatterNdOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SCATTER_ND_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.cpp new file mode 100644 index 0000000..efd80c1 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SegmentSumOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SegmentSumOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::SegmentSumOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.h new file mode 100644 index 0000000..e616384 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SegmentSumOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SEGMENT_SUM_OPTIONS_H__ +#define __BBO_SEGMENT_SUM_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SegmentSumOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SEGMENT_SUM_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.cpp new file mode 100644 index 0000000..c584fbf --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SelectOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SelectOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::SelectOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.h new file mode 100644 index 0000000..4d4e6fe --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SELECT_OPTIONS_H__ +#define __BBO_SELECT_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SelectOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SELECT_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.cpp new file mode 100644 index 0000000..9032d5e --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SelectV2Options.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SelectV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::SelectV2OptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.h new file mode 100644 index 0000000..14e91d2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SelectV2Options.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SELECT_V2_OPTIONS_H__ +#define __BBO_SELECT_V2_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SelectV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SELECT_V2_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.cpp new file mode 100644 index 0000000..d1dba1b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SliceOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SliceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::SliceOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.h new file mode 100644 index 0000000..0d7ca60 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SliceOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SLICE_OPTIONS_H__ +#define __BBO_SLICE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SliceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SLICE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.cpp new file mode 100644 index 0000000..0cb4dba --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToBatchNDOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::SpaceToBatchNDOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.h new file mode 100644 index 0000000..dd3d983 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToBatchNDOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SPACE_TO_BATCH_ND_OPTIONS_H__ +#define __BBO_SPACE_TO_BATCH_ND_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SPACE_TO_BATCH_ND_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.cpp new file mode 100644 index 0000000..d9d6a8f --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SpaceToDepthOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SpaceToDepthOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_SpaceToDepthOptions(); + assert(tflite_builtin_options); + circle::SpaceToDepthOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_block_size(tflite_builtin_options->block_size()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.h new file mode 100644 index 0000000..e53875b --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SpaceToDepthOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SPACE_TO_DEPTH_OPTIONS_H__ +#define __BBO_SPACE_TO_DEPTH_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SpaceToDepthOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SPACE_TO_DEPTH_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.cpp new file mode 100644 index 0000000..48abaac --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SparseToDenseOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SparseToDenseOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_SparseToDenseOptions(); + assert(tflite_builtin_options); + circle::SparseToDenseOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_validate_indices(tflite_builtin_options->validate_indices()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.h new file mode 100644 index 0000000..c2058f0 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SparseToDenseOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SPARSETODENSE_OPTIONS_H__ +#define __BBO_SPARSETODENSE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SparseToDenseOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SPARSETODENSE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.cpp new file mode 100644 index 0000000..da309f3 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SplitVOptions.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SplitVOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_SplitVOptions(); + assert(tflite_builtin_options); + circle::SplitVOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_num_splits(tflite_builtin_options->num_splits()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.h new file mode 100644 index 0000000..0550c00 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SplitVOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SPLIT_V_OPTIONS_H__ +#define __BBO_SPLIT_V_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SplitVOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SPLIT_V_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.cpp new file mode 100644 index 0000000..4656f91 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SquareOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SquareOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::SquareOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.h new file mode 100644 index 0000000..647686e --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SquareOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SQUARE_OPTIONS_H__ +#define __BBO_SQUARE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SquareOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SQUARE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.cpp new file mode 100644 index 0000000..0c2dbde --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "SquaredDifferenceOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op) +{ + circle::SquaredDifferenceOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.h new file mode 100644 index 0000000..76b45c0 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/SquaredDifferenceOptions.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_SQUAREDDIFFERENCE_OPTIONS_H__ +#define __BBO_SQUAREDDIFFERENCE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_SquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &fb, + const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_SQUAREDDIFFERENCE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.cpp new file mode 100644 index 0000000..68cf897 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "StridedSliceOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_StridedSliceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_StridedSliceOptions(); + assert(tflite_builtin_options); + circle::StridedSliceOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_begin_mask(tflite_builtin_options->begin_mask()); + builtin_options_builder.add_end_mask(tflite_builtin_options->end_mask()); + builtin_options_builder.add_ellipsis_mask(tflite_builtin_options->ellipsis_mask()); + builtin_options_builder.add_new_axis_mask(tflite_builtin_options->new_axis_mask()); + builtin_options_builder.add_shrink_axis_mask(tflite_builtin_options->shrink_axis_mask()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.h new file mode 100644 index 0000000..e6782a0 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/StridedSliceOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_STRIDEDSLICE_OPTIONS_H__ +#define __BBO_STRIDEDSLICE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_StridedSliceOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_STRIDEDSLICE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.cpp new file mode 100644 index 0000000..47316bf --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TileOptions.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TileOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::TileOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.h new file mode 100644 index 0000000..e3e9a71 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TileOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_TILE_OPTIONS_H__ +#define __BBO_TILE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TileOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_TILE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.cpp new file mode 100644 index 0000000..a2bc76f --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TopKV2Options.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TopKV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + circle::TopKV2OptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.h b/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.h new file mode 100644 index 0000000..89b5b99 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TopKV2Options.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_TOPK_V2_OPTIONS_H__ +#define __BBO_TOPK_V2_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TopKV2Options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_TOPK_V2_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp new file mode 100644 index 0000000..301f2c4 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "TransposeConvOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TransposeConvOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_TransposeConvOptions(); + assert(tflite_builtin_options); + circle::TransposeConvOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_padding(get_circle_padding(tflite_builtin_options->padding())); + builtin_options_builder.add_stride_w(tflite_builtin_options->stride_w()); + builtin_options_builder.add_stride_h(tflite_builtin_options->stride_h()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.h new file mode 100644 index 0000000..dd0bec2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/TransposeConvOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_TRANSPOSE_CONV_OPTIONS_H__ +#define __BBO_TRANSPOSE_CONV_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_TransposeConvOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_TRANSPOSE_CONV_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp new file mode 100644 index 0000000..96ddc15 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UniqueOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_UniqueOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_UniqueOptions(); + assert(tflite_builtin_options); + circle::UniqueOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_idx_out_type( + get_circle_tensortype(tflite_builtin_options->idx_out_type())); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.h new file mode 100644 index 0000000..35736e9 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UniqueOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_UNIQUE_OPTIONS_H__ +#define __BBO_UNIQUE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_UniqueOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_UNIQUE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.cpp new file mode 100644 index 0000000..c9a332a --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "UnpackOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_UnpackOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_UnpackOptions(); + assert(tflite_builtin_options); + circle::UnpackOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_num(tflite_builtin_options->num()); + builtin_options_builder.add_axis(tflite_builtin_options->axis()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.h new file mode 100644 index 0000000..6dfed87 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/UnpackOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_UNPACK_OPTIONS_H__ +#define __BBO_UNPACK_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_UnpackOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_UNPACK_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.cpp new file mode 100644 index 0000000..d591a54 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WhereOptions.h" + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_WhereOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::WhereOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.h new file mode 100644 index 0000000..a113f69 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/WhereOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_WHERE_OPTIONS_H__ +#define __BBO_WHERE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_WhereOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_WHERE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.cpp new file mode 100644 index 0000000..1ad1af7 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "WhileOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_WhileOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op) +{ + auto tflite_builtin_options = op->builtin_options_as_WhileOptions(); + assert(tflite_builtin_options); + circle::WhileOptionsBuilder builtin_options_builder{fb}; + builtin_options_builder.add_cond_subgraph_index(tflite_builtin_options->cond_subgraph_index()); + builtin_options_builder.add_body_subgraph_index(tflite_builtin_options->body_subgraph_index()); + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.h new file mode 100644 index 0000000..000e1a2 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/WhileOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_WHILE_OPTIONS_H__ +#define __BBO_WHILE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_WhileOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_WHILE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.cpp b/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.cpp new file mode 100644 index 0000000..e64e421 --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ZerosLikeOptions.h" +#include "DataLookup.h" + +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ZerosLikeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *) +{ + circle::ZerosLikeOptionsBuilder builtin_options_builder{fb}; + return builtin_options_builder.Finish(); +} + +} // namespace tflite2circle diff --git a/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.h b/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.h new file mode 100644 index 0000000..5113ecc --- /dev/null +++ b/compiler/tflite2circle/src/BuildBuiltinOptions/ZerosLikeOptions.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __BBO_ZEROS_LIKE_OPTIONS_H__ +#define __BBO_ZEROS_LIKE_OPTIONS_H__ + +#include +#include + +namespace tflite2circle +{ + +flatbuffers::Offset +build_circle_ZerosLikeOptions(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +} // namespace tflite2circle + +#endif // __BBO_ZEROS_LIKE_OPTIONS_H__ diff --git a/compiler/tflite2circle/src/CircleModel.cpp b/compiler/tflite2circle/src/CircleModel.cpp index 3a56932..cb4437a 100644 --- a/compiler/tflite2circle/src/CircleModel.cpp +++ b/compiler/tflite2circle/src/CircleModel.cpp @@ -15,6 +15,7 @@ */ #include +#include #include "CircleModel.h" #include "DataLookup.h" @@ -67,8 +68,12 @@ Offset::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla for (auto it : *tflite_tensors) { // shape - std::vector shape_vec{it->shape()->begin(), it->shape()->end()}; - auto shape = fb->CreateVector(shape_vec); + flatbuffers::Offset> shape; + if (it->shape()) + { + auto shape_vec = std::vector({it->shape()->begin(), it->shape()->end()}); + shape = fb->CreateVector(shape_vec); + } // name flatbuffers::Offset name; if (it->name()) @@ -85,6 +90,7 @@ Offset::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla flatbuffers::Offset> max; flatbuffers::Offset> scale; flatbuffers::Offset> zero_point; + int32_t quantized_dimension = it->quantization()->quantized_dimension(); if (it->quantization()->min() && it->quantization()->max()) { @@ -106,7 +112,9 @@ Offset::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla zero_point = fb->CreateVector(tfzerop); } - quantization = circle::CreateQuantizationParameters(*fb, min, max, scale, zero_point); + quantization = circle::CreateQuantizationParameters(*fb, min, max, scale, zero_point, + circle::QuantizationDetails_NONE, 0, + quantized_dimension); } // is_variable bool is_variable = it->is_variable(); @@ -150,6 +158,18 @@ Offset::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla // builtin options auto circle_builtin_options = get_circle_builtin_options(*fb, it); auto circle_builtin_options_type = get_circle_builtin_options_type(it); + // custom options + flatbuffers::Offset> circle_custom_options; + if (it->custom_options()) + { + std::vector custom_options_vec{it->custom_options()->begin(), + it->custom_options()->end()}; + circle_custom_options = fb->CreateVector(custom_options_vec); + } + // custom options format + // TODO Make get_circle_custom_options_format + assert(it->custom_options_format() == tflite::CustomOptionsFormat_FLEXBUFFERS); + auto circle_custom_options_format = circle::CustomOptionsFormat_FLEXBUFFERS; circle::OperatorBuilder operator_builder{*fb}; operator_builder.add_opcode_index(it->opcode_index()); @@ -157,7 +177,9 @@ Offset::Offset(FlatBufBuilder &fb, const TFLFlatBufVec *tflite_fla operator_builder.add_outputs(circle_outputs); operator_builder.add_builtin_options(circle_builtin_options); operator_builder.add_builtin_options_type(circle_builtin_options_type); - // TODO custom_options, mutating_variable_inputs + operator_builder.add_custom_options(circle_custom_options); + operator_builder.add_custom_options_format(circle_custom_options_format); + // TODO mutating_variable_inputs auto opeartor = operator_builder.Finish(); operator_vec.emplace_back(opeartor); } @@ -205,11 +227,11 @@ CircleModel::CircleModel(FlatBufBuilder &fb, TFLModel &model) { const tflite::Model *tfl_model = model.load_model(); _operator_codes_offset = - stdex::make_unique>(fb, tfl_model->operator_codes()); - _subGraphs_offset = stdex::make_unique>(fb, tfl_model->subgraphs()); - _buffers_offset = stdex::make_unique>(fb, tfl_model->buffers()); + std::make_unique>(fb, tfl_model->operator_codes()); + _subGraphs_offset = std::make_unique>(fb, tfl_model->subgraphs()); + _buffers_offset = std::make_unique>(fb, tfl_model->buffers()); _metadata_buffer_offset = - stdex::make_unique>(fb, tfl_model->metadata_buffer()); + std::make_unique>(fb, tfl_model->metadata_buffer()); model_build(); } diff --git a/compiler/tflite2circle/src/DataLookup.cpp b/compiler/tflite2circle/src/DataLookup.cpp index a1b7806..b0d35d1 100644 --- a/compiler/tflite2circle/src/DataLookup.cpp +++ b/compiler/tflite2circle/src/DataLookup.cpp @@ -110,4 +110,17 @@ circle::BuiltinOptions get_circle_builtin_options_type(const tflite::Operator *o } } +circle::MirrorPadMode get_circle_mirrorpad_mode(tflite::MirrorPadMode tfl_mode) +{ + switch (tfl_mode) + { + case tflite::MirrorPadMode_REFLECT: + return circle::MirrorPadMode_REFLECT; + case tflite::MirrorPadMode_SYMMETRIC: + return circle::MirrorPadMode_SYMMETRIC; + default: + throw std::runtime_error("tflite2circle: wrong mirrorpad mode."); + } +} + } // namespace tflite2circle diff --git a/compiler/tflite2circle/src/DataLookup.h b/compiler/tflite2circle/src/DataLookup.h index 3f141ec..7ea01b9 100644 --- a/compiler/tflite2circle/src/DataLookup.h +++ b/compiler/tflite2circle/src/DataLookup.h @@ -23,15 +23,59 @@ namespace tflite2circle { +/** + * @brief Returns circle builtin_code according to tflite. + * + * @note You can see a list of currently supported BuiltinOperator in TFLOperator.lst file. +*/ circle::BuiltinOperator get_circle_builtin_code(tflite::BuiltinOperator tfl_bop); + +/** + * @brief Returns circle TensorType according to tflite. + * + * @note You can see a list of currently supported TensorType in TFLTensorType.lst file. +*/ circle::TensorType get_circle_tensortype(tflite::TensorType tfl_tt); + +/** + * @brief Returns circle Padding enum according to tflite. +*/ circle::Padding get_circle_padding(tflite::Padding tfl_p); + +/** + * @brief Returns circle ActivationFunctionType according to tflite. + * + * @note You can see a list of currently supported ActivationFunctionType in + * TFLActivationFunctionType.lst file. +*/ circle::ActivationFunctionType get_circle_activation_function_type(tflite::ActivationFunctionType tfl_aft); + +/** + * @brief Returns circle builtin_options according to tflite. + * + * @note You can see a list of currently supported BuiltinOptions in + * TFLBuiltinOptions.lst file. + * + * This function calls the build_circle_##BuiltinOptions internally(e.g. + * build_circle_AbsOptions, build_circle_AddOptions, etc.), so refer to it for a more + * detailed implementation. +*/ flatbuffers::Offset get_circle_builtin_options(flatbuffers::FlatBufferBuilder &fb, const tflite::Operator *op); + +/** + * @brief Returns circle builtin_options_type according to tflite. + * + * @note You can see a list of currently supported BuiltinOptions in TFLBuiltinOptions.lst file. +*/ circle::BuiltinOptions get_circle_builtin_options_type(const tflite::Operator *op); +/** + * @brief Returns circle MirrorPadMode according to tflite. +*/ +circle::MirrorPadMode get_circle_mirrorpad_mode(tflite::MirrorPadMode tfl_mode); + } // namespace tflite2circle #endif // __DATA_LOOKUP_H__ diff --git a/compiler/tflite2circle/src/TFLBuiltinOptions.lst b/compiler/tflite2circle/src/TFLBuiltinOptions.lst index 65c60b8..3ef9f15 100644 --- a/compiler/tflite2circle/src/TFLBuiltinOptions.lst +++ b/compiler/tflite2circle/src/TFLBuiltinOptions.lst @@ -15,89 +15,93 @@ TFL_BUILTIN_OPTIONS(FullyConnectedOptions) TFL_BUILTIN_OPTIONS(SoftmaxOptions) TFL_BUILTIN_OPTIONS(ConcatenationOptions) TFL_BUILTIN_OPTIONS(AddOptions) -//TFL_BUILTIN_OPTIONS(L2NormOptions) -//TFL_BUILTIN_OPTIONS(LocalResponseNormalizationOptions) +TFL_BUILTIN_OPTIONS(L2NormOptions) +TFL_BUILTIN_OPTIONS(LocalResponseNormalizationOptions) //TFL_BUILTIN_OPTIONS(LSTMOptions) -//TFL_BUILTIN_OPTIONS(ResizeBilinearOptions) +TFL_BUILTIN_OPTIONS(ResizeBilinearOptions) //TFL_BUILTIN_OPTIONS(CallOptions) TFL_BUILTIN_OPTIONS(ReshapeOptions) //TFL_BUILTIN_OPTIONS(SkipGramOptions) -//TFL_BUILTIN_OPTIONS(SpaceToDepthOptions) +TFL_BUILTIN_OPTIONS(SpaceToDepthOptions) //TFL_BUILTIN_OPTIONS(EmbeddingLookupSparseOptions) TFL_BUILTIN_OPTIONS(MulOptions) TFL_BUILTIN_OPTIONS(PadOptions) -//TFL_BUILTIN_OPTIONS(GatherOptions) +TFL_BUILTIN_OPTIONS(GatherOptions) TFL_BUILTIN_OPTIONS(BatchToSpaceNDOptions) -//TFL_BUILTIN_OPTIONS(SpaceToBatchNDOptions) +TFL_BUILTIN_OPTIONS(SpaceToBatchNDOptions) TFL_BUILTIN_OPTIONS(TransposeOptions) TFL_BUILTIN_OPTIONS(ReducerOptions) TFL_BUILTIN_OPTIONS(SubOptions) TFL_BUILTIN_OPTIONS(DivOptions) TFL_BUILTIN_OPTIONS(SqueezeOptions) //TFL_BUILTIN_OPTIONS(SequenceRNNOptions) -//TFL_BUILTIN_OPTIONS(StridedSliceOptions) +TFL_BUILTIN_OPTIONS(StridedSliceOptions) TFL_BUILTIN_OPTIONS(ExpOptions) -//TFL_BUILTIN_OPTIONS(TopKV2Options) +TFL_BUILTIN_OPTIONS(TopKV2Options) TFL_BUILTIN_OPTIONS(SplitOptions) -//TFL_BUILTIN_OPTIONS(LogSoftmaxOptions) +TFL_BUILTIN_OPTIONS(LogSoftmaxOptions) TFL_BUILTIN_OPTIONS(CastOptions) //TFL_BUILTIN_OPTIONS(DequantizeOptions) -//TFL_BUILTIN_OPTIONS(MaximumMinimumOptions) +TFL_BUILTIN_OPTIONS(MaximumMinimumOptions) TFL_BUILTIN_OPTIONS(ArgMaxOptions) -//TFL_BUILTIN_OPTIONS(LessOptions) -//TFL_BUILTIN_OPTIONS(NegOptions) +TFL_BUILTIN_OPTIONS(LessOptions) +TFL_BUILTIN_OPTIONS(NegOptions) //TFL_BUILTIN_OPTIONS(PadV2Options) -//TFL_BUILTIN_OPTIONS(GreaterOptions) +TFL_BUILTIN_OPTIONS(GreaterOptions) TFL_BUILTIN_OPTIONS(GreaterEqualOptions) -//TFL_BUILTIN_OPTIONS(LessEqualOptions) -//TFL_BUILTIN_OPTIONS(SelectOptions) -//TFL_BUILTIN_OPTIONS(SliceOptions) -//TFL_BUILTIN_OPTIONS(TransposeConvOptions) -//TFL_BUILTIN_OPTIONS(SparseToDenseOptions) -//TFL_BUILTIN_OPTIONS(TileOptions) +TFL_BUILTIN_OPTIONS(LessEqualOptions) +TFL_BUILTIN_OPTIONS(SelectOptions) +TFL_BUILTIN_OPTIONS(SelectV2Options) +TFL_BUILTIN_OPTIONS(SliceOptions) +TFL_BUILTIN_OPTIONS(TransposeConvOptions) +TFL_BUILTIN_OPTIONS(SparseToDenseOptions) +TFL_BUILTIN_OPTIONS(TileOptions) TFL_BUILTIN_OPTIONS(ExpandDimsOptions) TFL_BUILTIN_OPTIONS(EqualOptions) TFL_BUILTIN_OPTIONS(NotEqualOptions) TFL_BUILTIN_OPTIONS(ShapeOptions) -//TFL_BUILTIN_OPTIONS(PowOptions) -//TFL_BUILTIN_OPTIONS(ArgMinOptions) +TFL_BUILTIN_OPTIONS(PowOptions) +TFL_BUILTIN_OPTIONS(ArgMinOptions) //TFL_BUILTIN_OPTIONS(FakeQuantOptions) TFL_BUILTIN_OPTIONS(PackOptions) TFL_BUILTIN_OPTIONS(LogicalOrOptions) -//TFL_BUILTIN_OPTIONS(OneHotOptions) -//TFL_BUILTIN_OPTIONS(LogicalAndOptions) +TFL_BUILTIN_OPTIONS(OneHotOptions) +TFL_BUILTIN_OPTIONS(LogicalAndOptions) TFL_BUILTIN_OPTIONS(LogicalNotOptions) -//TFL_BUILTIN_OPTIONS(UnpackOptions) -//TFL_BUILTIN_OPTIONS(FloorDivOptions) -//TFL_BUILTIN_OPTIONS(SquareOptions) -//TFL_BUILTIN_OPTIONS(ZerosLikeOptions) +TFL_BUILTIN_OPTIONS(UnpackOptions) +TFL_BUILTIN_OPTIONS(FloorDivOptions) +TFL_BUILTIN_OPTIONS(SquareOptions) +TFL_BUILTIN_OPTIONS(ZerosLikeOptions) TFL_BUILTIN_OPTIONS(FillOptions) //TFL_BUILTIN_OPTIONS(BidirectionalSequenceLSTMOptions) //TFL_BUILTIN_OPTIONS(BidirectionalSequenceRNNOptions) //TFL_BUILTIN_OPTIONS(UnidirectionalSequenceLSTMOptions) -//TFL_BUILTIN_OPTIONS(FloorModOptions) -//TFL_BUILTIN_OPTIONS(RangeOptions) -//TFL_BUILTIN_OPTIONS(ResizeNearestNeighborOptions) -//TFL_BUILTIN_OPTIONS(LeakyReluOptions) -//TFL_BUILTIN_OPTIONS(SquaredDifferenceOptions) -//TFL_BUILTIN_OPTIONS(MirrorPadOptions) +TFL_BUILTIN_OPTIONS(FloorModOptions) +TFL_BUILTIN_OPTIONS(RangeOptions) +TFL_BUILTIN_OPTIONS(ResizeNearestNeighborOptions) +TFL_BUILTIN_OPTIONS(LeakyReluOptions) +TFL_BUILTIN_OPTIONS(SquaredDifferenceOptions) +TFL_BUILTIN_OPTIONS(MirrorPadOptions) TFL_BUILTIN_OPTIONS(AbsOptions) -//TFL_BUILTIN_OPTIONS(SplitVOptions) -//TFL_BUILTIN_OPTIONS(UniqueOptions) -//TFL_BUILTIN_OPTIONS(ReverseV2Options) -//TFL_BUILTIN_OPTIONS(AddNOptions) -//TFL_BUILTIN_OPTIONS(GatherNdOptions) +TFL_BUILTIN_OPTIONS(SplitVOptions) +TFL_BUILTIN_OPTIONS(UniqueOptions) +TFL_BUILTIN_OPTIONS(ReverseV2Options) +TFL_BUILTIN_OPTIONS(AddNOptions) +TFL_BUILTIN_OPTIONS(GatherNdOptions) TFL_BUILTIN_OPTIONS(CosOptions) -//TFL_BUILTIN_OPTIONS(WhereOptions) +TFL_BUILTIN_OPTIONS(WhereOptions) //TFL_BUILTIN_OPTIONS(RankOptions) -//TFL_BUILTIN_OPTIONS(ReverseSequenceOptions) -//TFL_BUILTIN_OPTIONS(MatrixDiagOptions) +TFL_BUILTIN_OPTIONS(ReverseSequenceOptions) +TFL_BUILTIN_OPTIONS(MatrixDiagOptions) //TFL_BUILTIN_OPTIONS(QuantizeOptions) -//TFL_BUILTIN_OPTIONS(MatrixSetDiagOptions) +TFL_BUILTIN_OPTIONS(MatrixSetDiagOptions) //TFL_BUILTIN_OPTIONS(HardSwishOptions) -//TFL_BUILTIN_OPTIONS(IfOptions) -//TFL_BUILTIN_OPTIONS(WhileOptions) -//TFL_BUILTIN_OPTIONS(DepthToSpaceOptions) +TFL_BUILTIN_OPTIONS(IfOptions) +TFL_BUILTIN_OPTIONS(WhileOptions) +TFL_BUILTIN_OPTIONS(DepthToSpaceOptions) //TFL_BUILTIN_OPTIONS(NonMaxSuppressionV4Options) //TFL_BUILTIN_OPTIONS(NonMaxSuppressionV5Options) -//TFL_BUILTIN_OPTIONS(ScatterNdOptions) +TFL_BUILTIN_OPTIONS(RankOptions) +TFL_BUILTIN_OPTIONS(ScatterNdOptions) +TFL_BUILTIN_OPTIONS(SegmentSumOptions) +TFL_BUILTIN_OPTIONS(BatchMatMulOptions) diff --git a/compiler/tflite2circle/src/TFLOperator.lst b/compiler/tflite2circle/src/TFLOperator.lst index ac2f9da..942c846 100644 --- a/compiler/tflite2circle/src/TFLOperator.lst +++ b/compiler/tflite2circle/src/TFLOperator.lst @@ -8,6 +8,7 @@ TFL_OPERATOR(ADD) TFL_OPERATOR(AVERAGE_POOL_2D) TFL_OPERATOR(CONCATENATION) TFL_OPERATOR(CONV_2D) +TFL_OPERATOR(DEPTH_TO_SPACE) TFL_OPERATOR(DEPTHWISE_CONV_2D) TFL_OPERATOR(DEQUANTIZE) TFL_OPERATOR(EMBEDDING_LOOKUP) @@ -126,3 +127,7 @@ TFL_OPERATOR(WHILE) TFL_OPERATOR(NON_MAX_SUPPRESSION_V4) TFL_OPERATOR(NON_MAX_SUPPRESSION_V5) TFL_OPERATOR(SCATTER_ND) +TFL_OPERATOR(SELECT_V2) +TFL_OPERATOR(DENSIFY) +TFL_OPERATOR(SEGMENT_SUM) +TFL_OPERATOR(BATCH_MATMUL) diff --git a/compute/ARMComputeEx/CMakeLists.txt b/compute/ARMComputeEx/CMakeLists.txt index 8dfe0c4..58f558d 100644 --- a/compute/ARMComputeEx/CMakeLists.txt +++ b/compute/ARMComputeEx/CMakeLists.txt @@ -1,4 +1,4 @@ -nnas_find_package(ARMCompute QUIET) +nnfw_find_package(ARMCompute QUIET) if(NOT ARMCompute_FOUND) message(STATUS "Check ARM Compute library extension build: need ARM Compute library") diff --git a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h b/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h deleted file mode 100644 index 75ba0c0..0000000 --- a/compute/ARMComputeEx/arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright (c) 2016-2018 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_KERNEL_H__ -#define __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_KERNEL_H__ - -#include "arm_compute/core/CL/ICLKernel.h" - -namespace arm_compute -{ -class ICLTensor; - -/** OpenCL kernel to perform SPACE_TO_BATCH_ND operation */ -class CLSpaceToBatchNDKernel final : public ICLKernel -{ -public: - /** Default constructor */ - CLSpaceToBatchNDKernel(); - /** Prevent instances of this class from being copied (As this class contains pointers) */ - CLSpaceToBatchNDKernel(const CLSpaceToBatchNDKernel &) = delete; - /** Prevent instances of this class from being copied (As this class contains pointers) */ - CLSpaceToBatchNDKernel &operator=(const CLSpaceToBatchNDKernel &) = delete; - /** Allow instances of this class to be moved */ - CLSpaceToBatchNDKernel(CLSpaceToBatchNDKernel &&) = default; - /** Allow instances of this class to be moved */ - CLSpaceToBatchNDKernel &operator=(CLSpaceToBatchNDKernel &&) = default; - /** Default destructor */ - ~CLSpaceToBatchNDKernel() = default; - /** Initialise the kernel's input and output. - * - * @note The data layout of input and output must be the same. - * @note The number of dimensions of input and output must be 4, and `spatial` dimensions - * are height and width. - * @param[in] input Input tensor. Data types supported: U8/QASYMM8/S16/F16/S32/F32. - * Data layout supported: NCHW/NHWC - * @param[in] block_size Block size tensor. Data types supported: S32. - * @param[in] padding_size Padding size tensor. Data types supported: S32. - * @param[out] output Output tensor. Data types supported: U8/QASYMM8/S16/F16/S32/F32. - * Data layout supported: NCHW/NHWC - */ - void configure(const ICLTensor *input, const ICLTensor *block_size, const ICLTensor *padding_size, - ICLTensor *output); - - // Inherited methods overridden: - void run(const Window &window, cl::CommandQueue &queue) override; - -private: - const ICLTensor *_input{nullptr}; /**< Source tensor */ - const ICLTensor *_block_size{nullptr}; /**< Block size tensor */ - const ICLTensor *_padding_size{nullptr}; /**< Padding size tensor */ - ICLTensor *_output{nullptr}; /**< Destination tensor */ -}; - -} // namespace arm_compute - -#endif /* __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_KERNEL_H__ */ diff --git a/compute/ARMComputeEx/arm_compute/core/CPP/kernels/CPPOneHotKernelEx.h b/compute/ARMComputeEx/arm_compute/core/CPP/kernels/CPPOneHotKernelEx.h index 59c337a..6e8bdc1 100644 --- a/compute/ARMComputeEx/arm_compute/core/CPP/kernels/CPPOneHotKernelEx.h +++ b/compute/ARMComputeEx/arm_compute/core/CPP/kernels/CPPOneHotKernelEx.h @@ -68,28 +68,28 @@ public: /** Set the input and output of the kernel. * * @param[in] indices A tensor for indices. Data types supported: S32 + * @param[in] depth A tensor for depth. Data types supported: S32 + * @param[in] on_value A tensor for on_value. Data types supported: F32 + * @param[in] off_value A tensor for off_value. Data types supported: F32* * @param[out] output A tensor for computed value of one hot operator - * @param[in] depth An int value for depth - * @param[in] on_value A float value for on_value - * @param[in] off_value A float value for off_value * @param[in] axis An int value for axis */ - void configure(const ITensor *indices, ITensor *output, const int depth, const float on_value, - const float off_value, const int axis); + void configure(const ITensor *indices, const ITensor *depth, const ITensor *on_value, + const ITensor *off_value, ITensor *output, const int axis); /** Static function to check if given info will lead to a valid configuration of @ref * CPPOneHotKernelEx * * @param[in] indices A tensor for indices. Data types supported: S32 - * @param[in] depth An int value for depth - * @param[in] on_value A float value for on_value - * @param[in] off_value A float value for off_value + * @param[in] depth A tensor for depth. Data types supported: S32 + * @param[in] on_value A tensor for on_value. Data types supported: F32 + * @param[in] off_value A tensor for off_value. Data types supported: F32* * @param[in] axis An int value for axis * * @return a status */ - static Status validate(const ITensor *indices, const int depth, const float on_value, - const float off_value, const int axis); + static Status validate(const ITensor *indices, const ITensor *depth, const ITensor *on_value, + const ITensor *off_value, const int axis); // Inherited methods overridden: void run(const Window &window, const ThreadInfo &info) override; @@ -100,10 +100,10 @@ private: template void run_one_hot(); const ITensor *_indices; + const ITensor *_depth; + const ITensor *_on_value; + const ITensor *_off_value; ITensor *_output; - int _depth; - float _on_value; - float _off_value; int _axis; }; } // namespace arm_compute diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/CLFunctionsEx.h b/compute/ARMComputeEx/arm_compute/runtime/CL/CLFunctionsEx.h index 831bb54..97bc4ce 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/CLFunctionsEx.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CL/CLFunctionsEx.h @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff --git a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLSpaceToBatchND.h b/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLSpaceToBatchND.h deleted file mode 100644 index 09eb69a..0000000 --- a/compute/ARMComputeEx/arm_compute/runtime/CL/functions/CLSpaceToBatchND.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright (c) 2016-2018 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#ifndef __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_H__ -#define __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_H__ - -#include "arm_compute/runtime/CL/ICLSimpleFunction.h" - -namespace arm_compute -{ -class ICLTensor; - -/** Basic function to run @ref CLSpaceToBatchNDKernel - * - * @note The tensor data type for the inputs must be U8/QASYMM8/S16/F16/S32/F32. - * @note The function divides "spatial" dimensions of the input into a grid of blocks of shape - * block_shape, and interleaves these blocks with the "batch" dimension such that in the output. - */ -class CLSpaceToBatchND : public ICLSimpleFunction -{ -public: - /** Initialise the kernel's input and output. - * - * @note The data layout of input and output must be the same. - * @note The number of dimensions of input and output must be 4, and `spatial` dimensions - * are height and width. - * @param[in] input Input tensor. Data types supported: U8/QASYMM8/S16/F16/S32/F32. - * Data layout supported: NCHW/NHWC - * @param[in] block_size Tensor of integer values specifying block sizes for spatial - * dimension. - * Data types supported: S32 - * @param[in] padding_size Tensor of integer values specifying padding sizes for spatial - * dimension. - * Data types supported: S32 - * @param[out] output Output tensor. Data types supported: same as @p input. - * Data layout supported: NCHW/NHWC - */ - void configure(const ICLTensor *input, const ICLTensor *block_size, const ICLTensor *padding_size, - ICLTensor *output); -}; - -} // namespace arm_compute -#endif /* __ARM_COMPUTE_CLSPACE_TO_BATCH_ND_H__ */ diff --git a/compute/ARMComputeEx/arm_compute/runtime/CPP/functions/CPPOneHotEx.h b/compute/ARMComputeEx/arm_compute/runtime/CPP/functions/CPPOneHotEx.h index f132dfc..7930e4e 100644 --- a/compute/ARMComputeEx/arm_compute/runtime/CPP/functions/CPPOneHotEx.h +++ b/compute/ARMComputeEx/arm_compute/runtime/CPP/functions/CPPOneHotEx.h @@ -55,14 +55,14 @@ public: /** Configure the one_hot function * * @param[in] indices A tensor for indices. Data types supported: S32 + * @param[in] depth A tensor for depth. Data types supported: S32 + * @param[in] on_value A tensor for on_value. Data types supported: F32 + * @param[in] off_value A tensor for off_value. Data types supported: F32 * @param[out] output A tensor for computed value of one hot operator - * @param[in] depth An int value for depth - * @param[in] on_value A float value for on_value - * @param[in] off_value A float value for off_value * @param[in] axis An int value for axis */ - void configure(const ITensor *indices, ITensor *output, const int depth, const float on_value, - const float off_value, const int axis); + void configure(const ITensor *indices, const ITensor *depth, const ITensor *on_value, + const ITensor *off_value, ITensor *output, const int axis); }; } #endif /* __ARM_COMPUTE_CPPONEHOT_EX_H__ */ diff --git a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericGather.h b/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericGather.h deleted file mode 100644 index 3db0c7e..0000000 --- a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericGather.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file        GenericGather.h - * @brief       This file contains GenericGather class - * @ingroup     COM_AI_RUNTIME - */ - -#ifndef __ARM_COMPUTE_MISC_GENERIC_GATHER_H__ -#define __ARM_COMPUTE_MISC_GENERIC_GATHER_H__ - -#include -#include - -#include -#include - -#include "Utils.h" - -namespace arm_compute -{ -namespace misc -{ - -/** - * @brief Class to run Gather with both CPU and GPU - */ -class GenericGather : public arm_compute::IFunction -{ -public: - GenericGather(void) - { - // DO NOTHING - } - -public: - /** - * @brief Configure the layer - * @param[in] input The source tensor - * @param[in] indices The indices tensor - * @param[in] output The destination tensor - * @param[in] axis (Optional) The axis in input to gather indices from - * @return N/A - */ - void configure(arm_compute::ITensor *input, arm_compute::ITensor *indices, - arm_compute::ITensor *output, int axis = 0); - -public: - /** - * @brief Run the operation. Must be called after configure(). - * @return N/A - */ - void run(void) override; - -private: - arm_compute::ITensor *_input{nullptr}; - arm_compute::ITensor *_indices{nullptr}; - arm_compute::ITensor *_output{nullptr}; - int _axis{0}; - arm_compute::CLTensor _cl_permuted; - -private: - arm_compute::CLPermute _cl_permute; - arm_compute::CLGatherEx _cl_gather; -}; - -} // namespace misc -} // namespace arm_compute - -#endif // __ARM_COMPUTE_MISC_GENERIC_GATHER_H__ diff --git a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericReshapeLayer.h b/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericReshapeLayer.h deleted file mode 100644 index ab2fdc7..0000000 --- a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/GenericReshapeLayer.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file        GenericReshapeLayer.h - * @brief       This file contains GenericReshapeLayer class - * @ingroup     COM_AI_RUNTIME - */ - -#ifndef __ARM_COMPUTE_MISC_GENERIC_RESHAPE_LAYER_H__ -#define __ARM_COMPUTE_MISC_GENERIC_RESHAPE_LAYER_H__ - -#include -#include - -#include -#include -#include -#include - -#include "Utils.h" - -namespace arm_compute -{ -namespace misc -{ - -/** - * @brief Class to run Reshape Layer with both CPU and GPU - */ -class GenericReshapeLayer : public arm_compute::IFunction -{ -public: - GenericReshapeLayer(void) - : _input(nullptr), _output(nullptr), _cl_permuted{}, _neon_permuted{}, _cl_permute{}, - _cl_reshape{}, _neon_permute{}, _neon_reshape{} - { - // DO NOTHING - } - -public: - /** - * @brief Configure the layer - * @param[in] input The source tensor - * @param[in] output The destination tensor - * @return N/A - */ - void configure(const arm_compute::ITensor *input, arm_compute::ITensor *output); - -public: - /** - * @brief Run the operation. Must be called after configure(). - * @return N/A - */ - void run(void) override; - -private: - const arm_compute::ITensor *_input; - arm_compute::ITensor *_output; - arm_compute::CLTensor _cl_permuted; - arm_compute::Tensor _neon_permuted; - -private: - arm_compute::CLPermute _cl_permute; - arm_compute::CLReshapeLayer _cl_reshape; - - arm_compute::NEPermute _neon_permute; - arm_compute::NEReshapeLayer _neon_reshape; -}; - -} // namespace misc -} // namespace arm_compute - -#endif // __ARM_COMPUTE_MISC_GENERIC_RESHAPE_LAYER_H__ diff --git a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/Utils.h b/compute/ARMComputeEx/arm_compute/runtime/misc/functions/Utils.h deleted file mode 100644 index 84ee4ce..0000000 --- a/compute/ARMComputeEx/arm_compute/runtime/misc/functions/Utils.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file utils.h - * @ingroup COM_AI_RUNTIME - * @brief This file contains utils for arm compute library - */ -#ifndef __ARM_COMPUTE_MISC_UTILS_H__ -#define __ARM_COMPUTE_MISC_UTILS_H__ - -#include -#include -#include - -#include -#include -#include -#include - -// TODO : It should be extracted to independent module. - -namespace arm_compute -{ -namespace misc -{ -namespace utils -{ - -/** - * @brief Check if this runtime runs on GPU or NEON - * @return @c true if GPU mode, otherwise @c false - */ -bool isGpuMode(); - -#ifndef CAST_CL -#define CAST_CL(tensor) static_cast<::arm_compute::CLTensor *>(tensor) -#endif - -#ifndef CAST_NE -#define CAST_NE(tensor) static_cast<::arm_compute::Tensor *>(tensor) -#endif - -/** -* @brief Generate arm compute permutation vector from runtime permutation vector -* @param[in] rank Rank number supported upto 4 -* @param[in] runtime_pv Integer array for runtime permutation vector -* @return Permutation vector of arm compute -*/ -arm_compute::PermutationVector getARMComputePermutationVector(uint32_t rank, - const int32_t *runtime_pv); - -/** - * @brief Set value to arm compute tensor with casting - * @param[in] value Value to set - * @param[out] to Target tensor of arm compute - * @param[in] id Position of element - * @return N/A - */ -template -void copyCast(const FromT value, arm_compute::ITensor *to, const arm_compute::Coordinates &id) -{ - switch (to->info()->data_type()) - { - case arm_compute::DataType::F32: - { - *reinterpret_cast(to->ptr_to_element(id)) = static_cast(value); - break; - } - case arm_compute::DataType::S32: - { - *reinterpret_cast(to->ptr_to_element(id)) = static_cast(value); - break; - } - case arm_compute::DataType::U32: - { - *reinterpret_cast(to->ptr_to_element(id)) = static_cast(value); - break; - } - case arm_compute::DataType::QASYMM8: - { - float realValue = static_cast(value); - // NOTE We haven't known the policy of rounding for quantization. - // So this is set to a temporary value. - *(to->ptr_to_element(id)) = quantize_qasymm8(realValue, to->info()->quantization_info(), - arm_compute::RoundingPolicy::TO_ZERO); - break; - } - default: - throw std::runtime_error("Not supported, yet"); - break; - } -} - -} // namespace utils -} // namespace misc -} // namespace arm_compute - -#endif // __ARM_COMPUTE_MISC_UTILS_H__ diff --git a/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp b/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp index 191a5bc..7b6b974 100644 --- a/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp +++ b/compute/ARMComputeEx/src/core/CL/CLKernelLibrary.cpp @@ -91,8 +91,6 @@ const std::map CLKernelLibraryEx::_kernel_program_map {"radixsort_reorder", "topkv2_radixsort.cl"}, {"topkv2_quicksort", "topkv2_quicksort.cl"}, {"scale_factor_symm8", "scale_factor.cl"}, - {"space_to_batch_4d_nchw", "space_to_batch.cl"}, - {"space_to_batch_4d_nhwc", "space_to_batch.cl"}, {"space_to_depth_nchw", "space_to_depth.cl"}, {"space_to_depth_nhwc", "space_to_depth.cl"}, }; @@ -172,10 +170,6 @@ const std::map CLKernelLibraryEx::_program_source_map #include "./cl_kernels/scale_factor.clembed" }, { - "space_to_batch.cl", -#include "./cl_kernels/space_to_batch.clembed" - }, - { "space_to_depth.cl", #include "./cl_kernels/space_to_depth.clembed" }, diff --git a/compute/ARMComputeEx/src/core/CL/cl_kernels/space_to_batch.cl b/compute/ARMComputeEx/src/core/CL/cl_kernels/space_to_batch.cl deleted file mode 100644 index b161104..0000000 --- a/compute/ARMComputeEx/src/core/CL/cl_kernels/space_to_batch.cl +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright (c) 2016, 2017 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "helpers.h" - -#if defined(DATA_TYPE) && defined(DEPTH_OUT) && defined(BATCH_IN) && defined(HEIGHT_IN) && \ - defined(WIDTH_IN) && defined(ZERO_VALUE) -/** Perform space to batch with input of 4D and NCHW format - * - * @attention Data type can be passed using the -DDATA_TYPE compile flag, e.g. -DDATA_TYPE=float - * @attention Output tensor depth should be given as a preprocessor argument using -DDEPTH_OUT=size. - * e.g. -DDEPTH_OUT=16 - * @attention Input tensor batch should be given as a preprocessor argument using -DBATCH_IN=size. - * e.g. -DBATCH_IN=16 - * @attention Input tensor height should be given as a preprocessor argument using -DHEIGHT_IN=size. - * e.g. -DHEIGHT_IN=16 - * @attention Input tensor width should be given as a preprocessor argument using -DHEIGHT_IN=size. - * e.g. -DWIDTH_IN=16 - * @attention The value to be set by pad value using -DZERO_VALUE=value. e.g. -DZERO_VALUE=0 - * - * @param[in] input_ptr Pointer to the source tensor. Supported - * data types: U8/S8/U16/S16/F16/U32/S32/F32 - * @param[in] input_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] input_step_x input_stride_x * number of elements along - * X processed per workitem(in bytes) - * @param[in] input_stride_y Stride of the source tensor in Y - * dimension (in bytes) - * @param[in] input_step_y input_stride_y * number of elements along - * Y processed per workitem(in bytes) - * @param[in] input_stride_z Stride of the source tensor in Z - * dimension (in bytes) - * @param[in] input_step_z input_stride_z * number of elements along - * Z processed per workitem(in bytes) - * @param[in] input_stride_w Stride of the destination tensor in W - * dimension (in bytes) - * @param[in] input_step_w input_stride_w * number of elements along - * W processed per workitem(in bytes) - * @param[in] input_offset_first_element_in_bytes The offset of the first element in the - * source tensor - * @param[out] output_ptr Pointer to the destination tensor. - * Supported data types: same as @p - * input_ptr - * @param[in] output_stride_x Stride of the destination tensor in X - * dimension (in bytes) - * @param[in] output_step_x output_stride_x * number of elements - * along X processed per workitem(in bytes) - * @param[in] output_stride_y Stride of the destination tensor in Y - * dimension (in bytes) - * @param[in] output_step_y output_stride_y * number of elements - * along Y processed per workitem(in bytes) - * @param[in] output_stride_z Stride of the destination tensor in Z - * dimension (in bytes) - * @param[in] output_step_z output_stride_z * number of elements - * along Z processed per workitem(in bytes) - * @param[in] output_stride_w Stride of the destination tensor in W - * dimension (in bytes) - * @param[in] output_step_w output_stride_w * number of elements - * along W processed per workitem(in bytes) - * @param[in] output_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - * @param[in] block_size_ptr Pointer to the source tensor. Supported - * data types: S32 - * @param[in] block_size_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] block_size_step_x block_size_stride_x * number of elements - * along X processed per workitem(in bytes) - * @param[in] block_size_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - * @param[in] padding_size_ptr Pointer to the source tensor. Supported - * data types: S32 - * @param[in] padding_size_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] padding_size_step_x padding_size_stride_x * number of - * elements along X processed per workitem - * (in bytes) - * @param[in] padding_size_stride_y Stride of the source tensor in Y - * dimension (in bytes) - * @param[in] padding_size_step_y padding_size_stride_y * number of - * elements along Y processed per workitem - * (in bytes) - * @param[in] padding_size_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - */ -__kernel void space_to_batch_4d_nchw(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output), - VECTOR_DECLARATION(block_size), - IMAGE_DECLARATION(padding_size)) -{ - Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT(input, 0); - Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT(output, DEPTH_OUT); - - int block_size_x = *((__global int *)(block_size_ptr)); - int block_size_y = *((__global int *)(block_size_ptr + block_size_stride_x)); - int shift_x = (get_global_id(2) / DEPTH_OUT / BATCH_IN) % block_size_x; - int shift_y = (get_global_id(2) / DEPTH_OUT / BATCH_IN) / block_size_x; - - int in_index[4] = { - 0, - }; - in_index[0] = get_global_id(0) * block_size_x + shift_x - *((__global int *)(padding_size_ptr)); - in_index[1] = get_global_id(1) * block_size_y + shift_y - - *((__global int *)(padding_size_ptr + padding_size_stride_y)); - in_index[2] = get_global_id(2) % DEPTH_OUT; - in_index[3] = (get_global_id(2) / DEPTH_OUT) % BATCH_IN; - - if (in_index[0] < 0 || in_index[0] >= WIDTH_IN || in_index[1] < 0 || in_index[1] >= HEIGHT_IN) - { - *((__global DATA_TYPE *)out.ptr) = (DATA_TYPE)ZERO_VALUE; - } - else - { - *((__global DATA_TYPE *)out.ptr) = *((__global DATA_TYPE *)tensor4D_offset( - &in, in_index[0], in_index[1], in_index[2], in_index[3])); - } -} -#endif // defined(DATA_TYPE) && defined(DEPTH_OUT) && defined(BATCH_IN) && defined(HEIGHT_IN) && - // defined(WIDTH_IN) && defined(ZERO_VALUE) - -#if defined(DATA_TYPE) && defined(HEIGHT_OUT) && defined(BATCH_IN) && defined(HEIGHT_IN) && \ - defined(WIDTH_IN) && defined(ZERO_VALUE) && defined(VEC_SIZE) -/** Perform space to batch with input of 4D and NHWC format - * - * @attention Data type can be passed using the -DDATA_TYPE compile flag, e.g. -DDATA_TYPE=float - * @attention Output tensor depth should be given as a preprocessor argument using - * -DHEIGHT_OUT=size. e.g. -DHEIGHT_OUT=16 - * @attention Input tensor batch should be given as a preprocessor argument using -DBATCH_IN=size. - * e.g. -DBATCH_IN=16 - * @attention Input tensor height should be given as a preprocessor argument using -DHEIGHT_IN=size. - * e.g. -DHEIGHT_IN=16 - * @attention Input tensor width should be given as a preprocessor argument using -DHEIGHT_IN=size. - * e.g. -DWIDTH_IN=16 - * @attention The value to be set by pad value using -DZERO_VALUE=value. e.g. -DZERO_VALUE=0 - * @attention Vector size should be given as a preprocessor argument using -DVEC_SIZE=size. e.g. - * -DVEC_SIZE=16 - * - * @param[in] input_ptr Pointer to the source tensor. Supported - * data types: U8/S8/U16/S16/F16/U32/S32/F32 - * @param[in] input_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] input_step_x input_stride_x * number of elements along - * X processed per workitem(in bytes) - * @param[in] input_stride_y Stride of the source tensor in Y - * dimension (in bytes) - * @param[in] input_step_y input_stride_y * number of elements along - * Y processed per workitem(in bytes) - * @param[in] input_stride_z Stride of the source tensor in Z - * dimension (in bytes) - * @param[in] input_step_z input_stride_z * number of elements along - * Z processed per workitem(in bytes) - * @param[in] input_stride_w Stride of the destination tensor in W - * dimension (in bytes) - * @param[in] input_step_w input_stride_w * number of elements along - * W processed per workitem(in bytes) - * @param[in] input_offset_first_element_in_bytes The offset of the first element in the - * source tensor - * @param[out] output_ptr Pointer to the destination tensor. - * Supported data types: same as @p - * input_ptr - * @param[in] output_stride_x Stride of the destination tensor in X - * dimension (in bytes) - * @param[in] output_step_x output_stride_x * number of elements - * along X processed per workitem(in bytes) - * @param[in] output_stride_y Stride of the destination tensor in Y - * dimension (in bytes) - * @param[in] output_step_y output_stride_y * number of elements - * along Y processed per workitem(in bytes) - * @param[in] output_stride_z Stride of the destination tensor in Z - * dimension (in bytes) - * @param[in] output_step_z output_stride_z * number of elements - * along Z processed per workitem(in bytes) - * @param[in] output_stride_w Stride of the destination tensor in W - * dimension (in bytes) - * @param[in] output_step_w output_stride_w * number of elements - * along W processed per workitem(in bytes) - * @param[in] output_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - * @param[in] block_size_ptr Pointer to the source tensor. Supported - * data types: S32 - * @param[in] block_size_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] block_size_step_x block_size_stride_x * number of elements - * along X processed per workitem(in bytes) - * @param[in] block_size_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - * @param[in] padding_size_ptr Pointer to the source tensor. Supported - * data types: S32 - * @param[in] padding_size_stride_x Stride of the source tensor in X - * dimension (in bytes) - * @param[in] padding_size_step_x padding_size_stride_x * number of - * elements along X processed per workitem - * (in bytes) - * @param[in] padding_size_stride_y Stride of the source tensor in Y - * dimension (in bytes) - * @param[in] padding_size_step_y padding_size_stride_y * number of - * elements along Y processed per workitem - * (in bytes) - * @param[in] padding_size_offset_first_element_in_bytes The offset of the first element in the - * destination tensor - */ -__kernel void space_to_batch_4d_nhwc(TENSOR4D_DECLARATION(input), TENSOR4D_DECLARATION(output), - VECTOR_DECLARATION(block_size), - IMAGE_DECLARATION(padding_size)) -{ - Tensor4D in = CONVERT_TO_TENSOR4D_STRUCT(input, 0); - Tensor4D out = CONVERT_TO_TENSOR4D_STRUCT(output, HEIGHT_OUT); - - int block_size_x = *((__global int *)(block_size_ptr)); - int block_size_y = *((__global int *)(block_size_ptr + block_size_stride_x)); - int shift_x = (get_global_id(2) / HEIGHT_OUT / BATCH_IN) % block_size_x; - int shift_y = (get_global_id(2) / HEIGHT_OUT / BATCH_IN) / block_size_x; - - int in_index[4] = { - 0, - }; - in_index[0] = get_global_id(0) * VEC_SIZE; - in_index[1] = get_global_id(1) * block_size_x + shift_x - *((__global int *)(padding_size_ptr)); - in_index[2] = get_global_id(2) % HEIGHT_OUT * block_size_y + shift_y - - *((__global int *)(padding_size_ptr + padding_size_stride_y)); - in_index[3] = (get_global_id(2) / HEIGHT_OUT) % BATCH_IN; - - if (in_index[1] < 0 || in_index[1] >= WIDTH_IN || in_index[2] < 0 || in_index[2] >= HEIGHT_IN) - { - VSTORE(VEC_SIZE) - ((VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE))ZERO_VALUE, 0, (__global DATA_TYPE *)out.ptr); - } - else - { - VSTORE(VEC_SIZE) - (CONVERT(VLOAD(VEC_SIZE)(0, (__global DATA_TYPE *)tensor4D_offset(&in, in_index[0], in_index[1], - in_index[2], in_index[3])), - VEC_DATA_TYPE(DATA_TYPE, VEC_SIZE)), - 0, (__global DATA_TYPE *)out.ptr); - } -} - -#endif // defined(DATA_TYPE) && defined(HEIGHT_OUT) && defined(BATCH_IN) && defined(HEIGHT_IN) && - // defined(WIDTH_IN) && defined(ZERO_VALUE) && defined(VEC_SIZE) diff --git a/compute/ARMComputeEx/src/core/CL/kernels/CLSpaceToBatchNDKernel.cpp b/compute/ARMComputeEx/src/core/CL/kernels/CLSpaceToBatchNDKernel.cpp deleted file mode 100644 index 8b9b57f..0000000 --- a/compute/ARMComputeEx/src/core/CL/kernels/CLSpaceToBatchNDKernel.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright (c) 2016-2018 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h" - -#include "arm_compute/core/CL/CLHelpers.h" -#include "arm_compute/core/CL/CLKernelLibraryEx.h" -#include "arm_compute/core/CL/ICLTensor.h" - -using namespace arm_compute; - -namespace -{ -constexpr unsigned int num_elems_processed_per_iteration = 16; - -Status validate_arguments(const ITensorInfo *input, const ITensorInfo *block_size, - const ITensorInfo *padding_size, const ITensorInfo *output) -{ - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::U8, DataType::QASYMM8, - DataType::S16, DataType::F16, DataType::S32, - DataType::F32); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(block_size, 1, DataType::S32); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(padding_size, 1, DataType::S32); - ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(output, 1, DataType::U8, DataType::QASYMM8, - DataType::S16, DataType::F16, DataType::S32, - DataType::F32); - - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->num_dimensions() != output->num_dimensions(), - "The number of dimensions of input should be equal to output"); - - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->data_layout() != output->data_layout(), - "The input and output layouts are different!"); - - // TODO Support other cases - if (input->num_dimensions() == 4 && input->data_layout() == DataLayout::NCHW) - { - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->dimension(2) != output->dimension(2), - "Input Depth should be equal to Output Depth"); - ARM_COMPUTE_RETURN_ERROR_ON_MSG(block_size->dimension(0) != 2 || - padding_size->dimension(1) != 2, - "Only 2-dimensional spatial block's size was wrong"); - } - else if (input->num_dimensions() == 4 && input->data_layout() == DataLayout::NHWC) - { - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->dimension(0) != output->dimension(0), - "Input Depth should be equal to Output Depth"); - ARM_COMPUTE_RETURN_ERROR_ON_MSG(block_size->dimension(0) != 2 || - padding_size->dimension(1) != 2, - "Only 2-dimensional spatial block's size was wrong"); - } - else - { - ARM_COMPUTE_RETURN_ERROR_MSG("CLSpaceToBatchNDKernel supports only 4-dimensional input"); - } - - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->num_dimensions() < 2 && input->num_dimensions() > 4, - "CLSpaceToBatchNDKernel supports dimensions up to 4"); - - if (input->data_type() == DataType::QASYMM8) - { - ARM_COMPUTE_RETURN_ERROR_ON_MSG(input->quantization_info() != output->quantization_info(), - "The input and output quantization info are different!"); - } - - return Status{}; -} - -} // namespace - -CLSpaceToBatchNDKernel::CLSpaceToBatchNDKernel() -{ - // DO NOTHING -} - -void CLSpaceToBatchNDKernel::configure(const ICLTensor *input, const ICLTensor *block_size, - const ICLTensor *padding_size, ICLTensor *output) -{ - - ARM_COMPUTE_ERROR_ON_NULLPTR(input, output); - ARM_COMPUTE_ERROR_THROW_ON( - validate_arguments(input->info(), block_size->info(), padding_size->info(), output->info())); - - _input = input; - _block_size = block_size; - _padding_size = padding_size; - _output = output; - - // Set kernel build options - // TODO Support other cases - std::string kernel_name = "space_to_batch_4d"; - std::set build_opts; - Window win; - - if (input->info()->data_layout() == DataLayout::NCHW) - { - kernel_name += "_nchw"; - build_opts.emplace("-DDEPTH_OUT=" + support::cpp11::to_string(output->info()->dimension(2))); - build_opts.emplace("-DHEIGHT_IN=" + support::cpp11::to_string(input->info()->dimension(1))); - build_opts.emplace("-DWIDTH_IN=" + support::cpp11::to_string(input->info()->dimension(0))); - - win = calculate_max_window(*output->info(), Steps()); - - Coordinates coord; - coord.set_num_dimensions(output->info()->num_dimensions()); - output->info()->set_valid_region(ValidRegion(coord, output->info()->tensor_shape())); - } - else if (input->info()->data_layout() == DataLayout::NHWC) - { - kernel_name += "_nhwc"; - build_opts.emplace("-DHEIGHT_OUT=" + support::cpp11::to_string(output->info()->dimension(2))); - build_opts.emplace("-DHEIGHT_IN=" + support::cpp11::to_string(input->info()->dimension(2))); - build_opts.emplace("-DWIDTH_IN=" + support::cpp11::to_string(input->info()->dimension(1))); - build_opts.emplace("-DVEC_SIZE=" + - support::cpp11::to_string(num_elems_processed_per_iteration)); - - win = calculate_max_window(*output->info(), Steps(num_elems_processed_per_iteration)); - AccessWindowHorizontal input_access(input->info(), 0, num_elems_processed_per_iteration); - AccessWindowHorizontal output_access(output->info(), 0, num_elems_processed_per_iteration); - - bool window_changed = update_window_and_padding(win, input_access, output_access); - input_access.set_valid_region(win, output->info()->valid_region()); - - if (window_changed) - { - ARM_COMPUTE_CREATE_ERROR(ErrorCode::RUNTIME_ERROR, "Insufficient Padding!"); - } - } - else - { - ARM_COMPUTE_ERROR("Unsupported layout"); - } - - build_opts.emplace("-DDATA_TYPE=" + get_cl_type_from_data_type(input->info()->data_type())); - build_opts.emplace("-DBATCH_IN=" + support::cpp11::to_string(input->info()->dimension(3))); - if (input->info()->data_type() == DataType::QASYMM8) - { - build_opts.emplace("-DZERO_VALUE=" + support::cpp11::to_string( - input->info()->quantization_info().uniform().offset)); - } - else - { - build_opts.emplace("-DZERO_VALUE=" + support::cpp11::to_string(0)); - } - - // Create kernel - _kernel = - static_cast(CLKernelLibraryEx::get().create_kernel(kernel_name, build_opts)); - - // Configure kernel window - ICLKernel::configure_internal(win); -} - -void CLSpaceToBatchNDKernel::run(const Window &window, cl::CommandQueue &queue) -{ - ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); - ARM_COMPUTE_ERROR_ON_MISMATCHING_WINDOWS(ICLKernel::window(), window); - -#if defined(ARM_COMPUTE_DEBUG_ENABLED) - const_cast(_block_size)->map(queue); - const_cast(_padding_size)->map(queue); - - const size_t num_dimensions = _input->info()->num_dimensions(); - const size_t num_spacial_dimensions = _block_size->info()->dimension(0); - uint32_t batch_size = _input->info()->dimension(num_dimensions - 1); - for (size_t i = 0; i < num_spacial_dimensions; ++i) - { - const int32_t block_size = *reinterpret_cast(_block_size->ptr_to_element({i})); - const int32_t padding_size_pre = - *reinterpret_cast(_padding_size->ptr_to_element({0, i})); - const int32_t padding_size_post = - *reinterpret_cast(_padding_size->ptr_to_element({1, i})); - - ARM_COMPUTE_ERROR_ON_MSG(block_size < 1, "Block size should be greater than or equal to 1"); - ARM_COMPUTE_ERROR_ON_MSG(padding_size_pre < 0 && padding_size_post < 0, - "Padding size should be greater than or equal to 0"); - - if (num_dimensions == 4 && _input->info()->data_layout() == DataLayout::NCHW) - { - ARM_COMPUTE_ERROR_ON_MSG( - _output->info()->dimension(i) != - (_input->info()->dimension(i) + padding_size_pre + padding_size_post) / block_size, - "Dimension value of spatial block does not match output's dimension value"); - } - else - { - ARM_COMPUTE_ERROR_ON_MSG( - _output->info()->dimension(num_dimensions - num_spacial_dimensions - 1 + i) != - (_input->info()->dimension(num_dimensions - num_spacial_dimensions - 1 + i) + - padding_size_pre + padding_size_post) / - block_size, - "Dimension value of spatial block does not match output's dimension value"); - } - - batch_size *= block_size; - } - ARM_COMPUTE_ERROR_ON_MSG( - _output->info()->dimension(num_dimensions - 1) != batch_size, - "Output batch size should be equal to input batch size * (multiplication of all block size)"); - - const_cast(_block_size)->unmap(queue); - const_cast(_padding_size)->unmap(queue); -#endif // defined(ARM_COMPUTE_DEBUG_ENABLED) - - Window slice_out = window.first_slice_window_4D().collapse(ICLKernel::window(), 2, 4); - - // Setup output slice - Window slice_in(slice_out); - slice_in.set(Window::DimX, Window::Dimension(0, 0, 0)); - slice_in.set(Window::DimY, Window::Dimension(0, 0, 0)); - slice_in.set(Window::DimZ, Window::Dimension(0, 0, 0)); - slice_in.set(3, Window::Dimension(0, 0, 0)); - - // Set block size window - Window win_block = calculate_max_window(*_block_size->info(), Steps()); - - // Set padding size window - Window win_padding = calculate_max_window(*_padding_size->info(), Steps()); - - do - { - unsigned int idx = 0; - add_4D_tensor_argument(idx, _input, slice_in); - add_4D_tensor_argument(idx, _output, slice_out); - add_1D_tensor_argument(idx, _block_size, win_block); - add_2D_tensor_argument(idx, _padding_size, win_padding); - enqueue(queue, *this, slice_out); - } while (window.slide_window_slice_4D(slice_out) && window.slide_window_slice_4D(slice_in)); -} diff --git a/compute/ARMComputeEx/src/core/CPP/kernels/CPPOneHotKernelEx.cpp b/compute/ARMComputeEx/src/core/CPP/kernels/CPPOneHotKernelEx.cpp index d6c49b2..4805323 100644 --- a/compute/ARMComputeEx/src/core/CPP/kernels/CPPOneHotKernelEx.cpp +++ b/compute/ARMComputeEx/src/core/CPP/kernels/CPPOneHotKernelEx.cpp @@ -52,34 +52,37 @@ namespace arm_compute { CPPOneHotKernelEx::CPPOneHotKernelEx() - : _indices(nullptr), _output(nullptr), _depth(0), _on_value(0), _off_value(0), _axis(-1) + : _indices(nullptr), _depth(nullptr), _on_value(nullptr), _off_value(nullptr), _output(nullptr), + _axis(-1) { } -void CPPOneHotKernelEx::configure(const ITensor *indices, ITensor *output, const int depth, - const float on_value, const float off_value, const int axis) +void CPPOneHotKernelEx::configure(const ITensor *indices, const ITensor *depth, + const ITensor *on_value, const ITensor *off_value, + ITensor *output, const int axis) { ARM_COMPUTE_ERROR_ON_NULLPTR(indices, output); ARM_COMPUTE_ERROR_THROW_ON(validate(indices, depth, on_value, off_value, axis)); _indices = indices; - _output = output; _depth = depth; _on_value = on_value; _off_value = off_value; + _output = output; _axis = axis; ICPPKernel::configure(Window()); // Default 1 iteration window } -Status CPPOneHotKernelEx::validate(const ITensor *indices, const int depth, const float on_value, - const float off_value, const int axis) +Status CPPOneHotKernelEx::validate(const ITensor *indices, const ITensor *depth, + const ITensor *on_value, const ITensor *off_value, + const int axis) { ARM_COMPUTE_UNUSED(on_value, off_value); ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_NOT_IN(indices, DataType::S32); + ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_NOT_IN(depth, DataType::S32); ARM_COMPUTE_RETURN_ERROR_ON_MSG(indices->info()->num_dimensions() != 1, "Only 1D indices are supported."); - ARM_COMPUTE_RETURN_ERROR_ON(depth <= 0); ARM_COMPUTE_RETURN_ERROR_ON_MSG(axis != -1, "Only axis = -1 is supported."); return Status{}; } @@ -92,12 +95,25 @@ void CPPOneHotKernelEx::run(const Window &window, const ThreadInfo &info) ARM_COMPUTE_ERROR_ON_MISMATCHING_WINDOWS(IKernel::window(), window); const auto num_indices = _indices->info()->dimension(0); - for (size_t i = 0; i < num_indices; ++i) + const auto depth = *reinterpret_cast(_depth->ptr_to_element(Coordinates{0})); + const auto dtype = _output->info()->data_type(); + switch (dtype) { - const auto index = *reinterpret_cast(_indices->ptr_to_element(Coordinates{i})); - for (int d = 0; d < _depth; ++d) - *reinterpret_cast(_output->ptr_to_element(Coordinates(d, i))) = - (d == index) ? _on_value : _off_value; + case DataType::F32: + { + const auto on_value = *reinterpret_cast(_on_value->ptr_to_element(Coordinates{0})); + const auto off_value = *reinterpret_cast(_off_value->ptr_to_element(Coordinates{0})); + for (size_t i = 0; i < num_indices; ++i) + { + const auto index = *reinterpret_cast(_indices->ptr_to_element(Coordinates{i})); + for (int d = 0; d < depth; ++d) + *reinterpret_cast(_output->ptr_to_element(Coordinates(d, i))) = + (d == index) ? on_value : off_value; + } + break; + } + default: + ARM_COMPUTE_ERROR("Unsupported data type."); } } } // namespace arm_compute diff --git a/compute/ARMComputeEx/src/runtime/CL/functions/CLSpaceToBatchND.cpp b/compute/ARMComputeEx/src/runtime/CL/functions/CLSpaceToBatchND.cpp deleted file mode 100644 index 1f946d3..0000000 --- a/compute/ARMComputeEx/src/runtime/CL/functions/CLSpaceToBatchND.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Copyright (c) 2016-2018 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#include "arm_compute/runtime/CL/functions/CLSpaceToBatchND.h" - -#include "arm_compute/core/CL/kernels/CLSpaceToBatchNDKernel.h" - -using namespace arm_compute; - -void CLSpaceToBatchND::configure(const ICLTensor *input, const ICLTensor *block_size, - const ICLTensor *padding_size, ICLTensor *output) -{ - auto k = arm_compute::support::cpp14::make_unique(); - k->configure(input, block_size, padding_size, output); - _kernel = std::move(k); -} diff --git a/compute/ARMComputeEx/src/runtime/CPP/functions/CPPOneHotEx.cpp b/compute/ARMComputeEx/src/runtime/CPP/functions/CPPOneHotEx.cpp index 5405934..114e1a7 100644 --- a/compute/ARMComputeEx/src/runtime/CPP/functions/CPPOneHotEx.cpp +++ b/compute/ARMComputeEx/src/runtime/CPP/functions/CPPOneHotEx.cpp @@ -45,10 +45,10 @@ using namespace arm_compute; -void CPPOneHotEx::configure(const ITensor *indices, ITensor *output, const int depth, - const float on_value, const float off_value, const int axis) +void CPPOneHotEx::configure(const ITensor *indices, const ITensor *depth, const ITensor *on_value, + const ITensor *off_value, ITensor *output, const int axis) { auto k = arm_compute::support::cpp14::make_unique(); - k->configure(indices, output, depth, on_value, off_value, axis); + k->configure(indices, depth, on_value, off_value, output, axis); _kernel = std::move(k); } diff --git a/compute/ARMComputeEx/src/runtime/misc/functions/GenericGather.cpp b/compute/ARMComputeEx/src/runtime/misc/functions/GenericGather.cpp deleted file mode 100644 index 67e1bfb..0000000 --- a/compute/ARMComputeEx/src/runtime/misc/functions/GenericGather.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "arm_compute/runtime/misc/functions/GenericGather.h" - -namespace arm_compute -{ -namespace misc -{ - -bool shouldPermute(arm_compute::ITensorInfo *input, arm_compute::ITensorInfo *output) -{ - return (input->num_dimensions() != 4 && output->num_dimensions() == 4 && - input->data_layout() == DataLayout::NCHW); -} - -void GenericGather::configure(arm_compute::ITensor *input, arm_compute::ITensor *indices, - arm_compute::ITensor *output, int axis) -{ - _input = input; - _indices = indices; - _output = output; - _axis = axis; - - arm_compute::PermutationVector pv; - if (shouldPermute(input->info(), output->info())) - { - // NOTE This vector comes from CLPermuteKernel implementation - // - // This implementation permutes a tensor of shape C / W / H into another tensor of shape W / H / - // C - // - // Original | Permuted - // 0 | C | W (from 1) - // 1 | W | H (from 2) - // 2 | H | C (from 0) - // - pv = arm_compute::PermutationVector{1, 2, 0}; - } - - if (utils::isGpuMode()) - { - if (shouldPermute(input->info(), output->info())) - { - _cl_gather.configure(CAST_CL(input), CAST_CL(indices), &_cl_permuted, axis); - _cl_permute.configure(&_cl_permuted, CAST_CL(output), pv); - - // NOTE _permuted is inaccessible from outside, and thus it is safe to invoke allocate here. - _cl_permuted.allocator()->allocate(); - } - else - { - _cl_gather.configure(CAST_CL(input), CAST_CL(indices), CAST_CL(output), axis); - } - } - else - { - throw std::runtime_error("Not supported, yet"); - } -} - -void GenericGather::run(void) -{ - if (utils::isGpuMode()) - { - _cl_gather.run(); - if (shouldPermute(_input->info(), _output->info())) - { - _cl_permute.run(); - } - } - else - { - throw std::runtime_error("Not supported, yet"); - } -} - -} // namespace misc -} // namespace arm_compute diff --git a/compute/ARMComputeEx/src/runtime/misc/functions/GenericReshapeLayer.cpp b/compute/ARMComputeEx/src/runtime/misc/functions/GenericReshapeLayer.cpp deleted file mode 100644 index 8025ae2..0000000 --- a/compute/ARMComputeEx/src/runtime/misc/functions/GenericReshapeLayer.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "arm_compute/core/ITensorInfo.h" -#include "arm_compute/runtime/misc/functions/GenericReshapeLayer.h" - -namespace arm_compute -{ -namespace misc -{ - -namespace -{ - -bool shouldPermute(const arm_compute::ITensorInfo *input, arm_compute::ITensorInfo *output) -{ - return (input->num_dimensions() == 4 || output->num_dimensions() == 4) && - (input->num_dimensions() != output->num_dimensions() && - input->data_layout() == DataLayout::NCHW); -} - -} // namespace - -void GenericReshapeLayer::configure(const arm_compute::ITensor *input, arm_compute::ITensor *output) -{ - _input = input; - _output = output; - - arm_compute::PermutationVector pv; - if (input->info()->data_layout() == DataLayout::NCHW && input->info()->num_dimensions() == 4 && - output->info()->num_dimensions() != 4) - { - // NOTE This vector comes from CLPermuteKernel implementation - // - // This implementation permutes a tensor of shape W / H / C into another tensor of shape - // C / W / H - // - // Original | Permuted - // 0 | W | C (from 2) - // 1 | H | W (from 0) - // 2 | C | H (from 1) - // - pv = arm_compute::PermutationVector{2, 0, 1}; - } - else if (input->info()->data_layout() == DataLayout::NCHW && - input->info()->num_dimensions() != 4 && output->info()->num_dimensions() == 4) - { - // NOTE This vector comes from CLPermuteKernel implementation - // - // This implementation permutes a tensor of shape C / W / H into another tensor of shape - // W / H / C - // - // Original | Permuted - // 0 | C | W (from 1) - // 1 | W | H (from 2) - // 2 | H | C (from 0) - // - pv = arm_compute::PermutationVector{1, 2, 0}; - } - - if (utils::isGpuMode()) - { - const auto const_input = CAST_CL(const_cast(input)); - if (shouldPermute(input->info(), output->info())) - { - _cl_permute.configure(const_input, &_cl_permuted, pv); - _cl_reshape.configure(&_cl_permuted, CAST_CL(output)); - - // NOTE _permuted is inaccessible from outside, and thus it is safe to invoke allocate here. - _cl_permuted.allocator()->allocate(); - } - else - { - _cl_reshape.configure(const_input, CAST_CL(output)); - } - } - else - { - if (shouldPermute(input->info(), output->info())) - { - _neon_permute.configure(input, &_neon_permuted, pv); - _neon_reshape.configure(&_neon_permuted, output); - - // NOTE _permuted is inaccessible from outside, and thus it is safe to invoke allocate here. - _neon_permuted.allocator()->allocate(); - } - else - { - _neon_reshape.configure(input, output); - } - } -} - -void GenericReshapeLayer::run(void) -{ - if (utils::isGpuMode()) - { - if (shouldPermute(_input->info(), _output->info())) - { - _cl_permute.run(); - } - _cl_reshape.run(); - } - else - { - if (shouldPermute(_input->info(), _output->info())) - { - _neon_permute.run(); - } - _neon_reshape.run(); - } -} - -} // namespace misc -} // namespace arm_compute diff --git a/compute/ARMComputeEx/src/runtime/misc/functions/Utils.cpp b/compute/ARMComputeEx/src/runtime/misc/functions/Utils.cpp deleted file mode 100644 index 44a4bb9..0000000 --- a/compute/ARMComputeEx/src/runtime/misc/functions/Utils.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "arm_compute/runtime/misc/functions/Utils.h" - -namespace arm_compute -{ -namespace misc -{ -namespace utils -{ - -bool isGpuMode() -{ - char *neon = std::getenv("NEON"); - if (neon == nullptr) - return true; - else if (neon[0] == '1') - return false; - return true; -} - -} // namespace utils -} // namespace misc -} // namespace arm_compute diff --git a/compute/cker/CMakeLists.txt b/compute/cker/CMakeLists.txt index b8ceba5..09f6725 100644 --- a/compute/cker/CMakeLists.txt +++ b/compute/cker/CMakeLists.txt @@ -1,7 +1,19 @@ nnfw_find_package(Eigen REQUIRED) nnfw_find_package(GEMMLowp REQUIRED) +nnfw_find_package(Ruy REQUIRED) add_library(nnfw_lib_cker INTERFACE) target_link_libraries(nnfw_lib_cker INTERFACE eigen) target_link_libraries(nnfw_lib_cker INTERFACE gemmlowp) +target_link_libraries(nnfw_lib_cker INTERFACE ruy) +target_link_libraries(nnfw_lib_cker INTERFACE ruy_instrumentation) +target_compile_definitions(nnfw_lib_cker INTERFACE USE_RUY_GEMV) +if(PROFILE_RUY) + target_link_libraries(nnfw_lib_cker INTERFACE ruy_profiler) +endif(PROFILE_RUY) + target_include_directories(nnfw_lib_cker INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) + +# Workaround to avoid warning +# TODO Resolve warning +target_compile_options(nnfw_lib_cker INTERFACE -Wno-attributes) diff --git a/compute/cker/include/cker/NeonTensorUtils.h b/compute/cker/include/cker/NeonTensorUtils.h index 4d97dd1..5c38bc6 100644 --- a/compute/cker/include/cker/NeonTensorUtils.h +++ b/compute/cker/include/cker/NeonTensorUtils.h @@ -18,7 +18,13 @@ #ifndef __NNFW_CKER_NEON_TENSOR_UTILS_H__ #define __NNFW_CKER_NEON_TENSOR_UTILS_H__ +#include +#include +#include +#include "cker/Types.h" #include "cker/neon/neon_check.h" +#include "cker/ruy/RuySupport.h" +#include "util/logging.h" #include #include @@ -35,6 +41,14 @@ namespace cker namespace { +// TODO(ahentz): Clean up. +using int8 = std::int8_t; +using uint8 = std::uint8_t; +using int16 = std::int16_t; +using uint16 = std::uint16_t; +using int32 = std::int32_t; +using uint32 = std::uint32_t; + // Allocates, at least, size bytes of uninitialized storage whose alignment is // specified by alignment. The size parameter must be an integral multiple of // alignment. @@ -47,8 +61,458 @@ void *aligned_alloc(size_t alignment, size_t size, void **freeing_buffer) return offset == 0 ? *freeing_buffer : ((char *)*freeing_buffer + (alignment - offset)); // NOLINT } +inline int32_t AccumulateNeonLane(const int32x4_t lane) +{ +#ifdef __aarch64__ + return vaddvq_s32(lane); +#else + int64x2_t pairwiseAdded = vpaddlq_s32(lane); + return vgetq_lane_s64(pairwiseAdded, 0) + vgetq_lane_s64(pairwiseAdded, 1); +#endif +} + } // namespace +#ifdef __aarch64__ + +bool HasSdotInstruction() +{ + static const bool has_dotprod = ruy::DetectDotprod(); + return has_dotprod; +} + +// We interleave vector data to make the dot product logic more efficient. +// Suppose that vectors is: +// a0 a1 a2 a3 a4 a5 ... +// b0 b1 b2 b3 b4 b5 ... +// c0 c1 c2 c3 c4 c5 ... +// d0 d1 d2 d3 d4 d5 ... +// e0 e1 e2 e3 e4 e5 ... +// This code interleaves them like this: +// a0 a1 a2 a3 b0 b1 b2 b3 c0 c1 c2 c3 d0 d1 d2 d3 a4 a5 a6 a7 b4 ... +// e0 e1 e2 e3 f0 f1 f2 f3 ... +// Once the data is interleaved, each 16-byte read from the vectors pointer +// contains 4 bytes from each of 4 vectors. +const int8_t *ShuffleVectors(const int8_t *vectors, const int n_batch, const int m_cols, + void **shuffled_vectors_free) +{ + const int kWeightsPerUint32 = 4; + + int8 *shuffled_vectors = reinterpret_cast( + aligned_alloc(kWeightsPerUint32, n_batch * m_cols, shuffled_vectors_free)); + + for (int i = 0; i < n_batch; i += 4) + { + int8 *shuffled_vectors_ptr = shuffled_vectors + (i * m_cols); + const int8 *unshuffled_vec0_ptr = reinterpret_cast(vectors) + (i * m_cols); + const int8 *unshuffled_vec1_ptr = reinterpret_cast(vectors) + ((i + 1) * m_cols); + const int8 *unshuffled_vec2_ptr = reinterpret_cast(vectors) + ((i + 2) * m_cols); + const int8 *unshuffled_vec3_ptr = reinterpret_cast(vectors) + ((i + 3) * m_cols); + const int8 *const end_vec0_ptr = unshuffled_vec1_ptr; + + while (unshuffled_vec0_ptr != end_vec0_ptr) + { + asm volatile( + // This code path requires that (n_cols % 16) == 0 so we can safely + // read in 16-byte chunks from each row. + "ld1 {v0.16b}, [%[unshuffled_vec0_ptr]], #16\n" + "ld1 {v1.16b}, [%[unshuffled_vec1_ptr]], #16\n" + "ld1 {v2.16b}, [%[unshuffled_vec2_ptr]], #16\n" + "ld1 {v3.16b}, [%[unshuffled_vec3_ptr]], #16\n" + + "st4 {v0.s, v1.s, v2.s, v3.s}[0], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[1], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[2], [%[shuffled_vectors_ptr]], #16\n" + "st4 {v0.s, v1.s, v2.s, v3.s}[3], [%[shuffled_vectors_ptr]], #16\n" + + : [unshuffled_vec0_ptr] "+r"(unshuffled_vec0_ptr), + [unshuffled_vec1_ptr] "+r"(unshuffled_vec1_ptr), + [unshuffled_vec2_ptr] "+r"(unshuffled_vec2_ptr), + [unshuffled_vec3_ptr] "+r"(unshuffled_vec3_ptr), + [shuffled_vectors_ptr] "+r"(shuffled_vectors_ptr) + : + : "v0", "v1", "v2", "v3", "cc", "memory"); + } + } + + return reinterpret_cast(shuffled_vectors); +} + +// Notes about the speed of this version vs. the baseline (from memory): +// - With 256K of L1, we can keep a lot of vectors in cache. +// I recall a reasonable speedup just by rearranging the loop to have +// row on the outside and batch on the inside. +// - I also recall getting a nice speedup from sdot. +// - I tried many times to do better than the current implementation, using +// loop unrolling and instruction reordering to avoid stalls, etc. +// but I was not able to do significantly better. This code is, however, +// much worse than what the processor spec sheet suggests is possible. +static void DotprodMatrixBatchFourVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, + const int m_rows, const int m_cols, + const int8_t *vectors, + const float *scaling_factors, + int n_batch, float *__restrict__ result) +{ + void *shuffled_vectors_free; + + const int8_t *shuffled_vectors = ShuffleVectors(vectors, n_batch, m_cols, &shuffled_vectors_free); + + for (int row = 0; row < m_rows; row += 2) + { + for (int batch = 0; batch < n_batch; batch += 4) + { + float *result_ptr = result + (batch * m_rows) + row; + const int8 *mat_ptr0 = matrix + (row * m_cols); + const int8 *mat_ptr1 = matrix + ((row + 1) * m_cols); + const int8 *mat_ptr0_end = mat_ptr1; + const int8 *vec_ptr = shuffled_vectors + (batch * m_cols); + const float *scaling_factors_ptr = scaling_factors + batch; + const uint64_t wide_rows = m_rows * sizeof(float); + const int8 *mat_ptr2 = matrix + ((row + 2) * m_cols); + const int8 *mat_ptr3 = matrix + ((row + 3) * m_cols); + + asm volatile( + // Zero out the accumulator registers. + "dup v0.4s, wzr\n" + "dup v1.4s, wzr\n" + "dup v2.4s, wzr\n" + "dup v3.4s, wzr\n" + + "1:\n" // batch_cols_loop + + // Read 16 more bytes from a pair of matrix rows. + "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" + + // Prefetch two rows ahead. + "prfm pldl1strm, [%[mat_ptr2]]\n" + "prfm pldl1strm, [%[mat_ptr3]]\n" + + // Read from input vectors 4 times; 64 bytes total. + // Each 16-byte register contains parts of 4 vectors; see the + // shuffle logic above. + + // From Benoit, places to look in the future: + // - Move load instructions further from sdot + // - Switch loop use-then-reload + // - Do partial unrolling to use register space better + "ld1 {v8.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" + "ld1 {v9.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" + "ld1 {v10.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" + "ld1 {v11.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" + + // Update prefetch pointers. + "add %[mat_ptr2], %[mat_ptr2], #16\n" + "add %[mat_ptr3], %[mat_ptr3], #16\n" + + // Re-use those vectors for the next row as well. + "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" + ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" + ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" + ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" + ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" + + // If we're not done with these rows, continue. + "cmp %[mat_ptr0], %[mat_ptr0_end]\n" + "bne 1b\n" // batch_cols_loop + + // Done with the rows, sum the results. + "add v0.4s, v0.4s, v1.4s\n" + "add v2.4s, v2.4s, v3.4s\n" + + // Convert the per-vector sums to floating point. + "scvtf v0.4s, v0.4s\n" + "scvtf v1.4s, v2.4s\n" + + // Fetch scale factors. + "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" + + // Multiply scale factors times sums. + "fmul v0.4s, v4.4s, v0.4s\n" + "fmul v1.4s, v4.4s, v1.4s\n" + + // Load previous result values. + // The result position is: + // result[batch * m_rows + row] + // Here that is factored into: + // result_ptr = result + row + // *result_ptr = res[0] + // (uint8*)result_ptr += (m_rows * sizeof(float)) + // *result_ptr = res[1] + // ... + // Since we're reading two rows at a time, though, we read both + // result[batch * m_rows + row] + // and + // result[batch * m_rows + row + 1] + "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + + // Go back to the starting position (subtract wide_rows * 4). + "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" + + // Add previous result values. + "fadd v9.4s, v9.4s, v0.4s\n" + "fadd v10.4s, v10.4s, v1.4s\n" + + // Store results. + "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + : [mat_ptr0] "+r"(mat_ptr0), [mat_ptr1] "+r"(mat_ptr1), [vec_ptr] "+r"(vec_ptr), + [result_ptr] "+r"(result_ptr), [mat_ptr2] "+r"(mat_ptr2), [mat_ptr3] "+r"(mat_ptr3) + : [mat_ptr0_end] "r"(mat_ptr0_end), [scaling_factors_ptr] "r"(scaling_factors_ptr), + [wide_rows] "r"(wide_rows) + : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", + "v13", "cc", "memory"); + } + } + + free(shuffled_vectors_free); +} + +static void DotprodMatrixBatchFourVectorMultiplyAccumulate( + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, + const float *scaling_factors, int n_batch, float *__restrict__ result, + const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) +{ + void *shuffled_vectors_free; + const int8_t *shuffled_vectors = ShuffleVectors(vectors, n_batch, m_cols, &shuffled_vectors_free); + + for (int row = 0; row < m_rows; row += 2) + { + const float *channel_scales_ptr = per_channel_scale + row; + int32_t *row_sums_ptr = row_sums ? row_sums + row : nullptr; + for (int batch = 0; batch < n_batch; batch += 4) + { + float *result_ptr = result + (batch * m_rows) + row; + const int8 *mat_ptr0 = matrix + (row * m_cols); + const int8 *mat_ptr1 = matrix + ((row + 1) * m_cols); + const int8 *mat_ptr0_end = mat_ptr1; + const int8 *vec_ptr = shuffled_vectors + (batch * m_cols); + const float *scaling_factors_ptr = scaling_factors + batch; + const uint64_t wide_rows = m_rows * sizeof(float); + const int32_t *batch_offsets_ptr = input_offset + batch; + const int32_t is_channel_scale_nullptr = per_channel_scale == nullptr; + const int32_t is_row_sums_nullptr = row_sums_ptr == nullptr; + asm volatile("dup v0.4s, wzr\n" + "dup v1.4s, wzr\n" + "dup v2.4s, wzr\n" + "dup v3.4s, wzr\n" + // Load zero points. + "ld1 {v7.4s}, [%[batch_offsets_ptr]]\n" + "ld1 {v4.4s}, [%[scaling_factors_ptr]]\n" + // Zero out zero point accumulators. + "dup v14.4s, wzr\n" + "dup v15.4s, wzr\n" + + // Load per channel scales if not null. + "cmp %w[is_channel_scale_nullptr], #0\n" + "bne 1f\n" + "ld1r {v16.4s}, [%[channel_scales_ptr]], #4\n" + "ld1r {v17.4s}, [%[channel_scales_ptr]]\n" + "fmul v16.4s, v16.4s, v4.4s\n" + "fmul v17.4s, v17.4s, v4.4s\n" + "b 2f\n" + "1:\n" + "mov v16.16b, v4.16b\n" + "mov v17.16b, v4.16b\n" + "2:\n" + "ld1 {v12.16b}, [%[mat_ptr0]], #16\n" + "ld1 {v8.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce100 // sdot v0.4s, v8.16b, v12.4b[0]\n" + "ld1 {v9.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face121 // sdot v1.4s, v9.16b, v12.4b[1]\n" + "ld1 {v10.16b}, [%[vec_ptr]], #16\n" + ".word 0x4f8ce940 // sdot v0.4s, v10.16b, v12.4b[2]\n" + "ld1 {v11.16b}, [%[vec_ptr]], #16\n" + ".word 0x4face961 // sdot v1.4s, v11.16b, v12.4b[3]\n" + "ld1 {v13.16b}, [%[mat_ptr1]], #16\n" + ".word 0x4f8de102 // sdot v2.4s, v8.16b, v13.4b[0]\n" + ".word 0x4fade123 // sdot v3.4s, v9.16b, v13.4b[1]\n" + ".word 0x4f8de942 // sdot v2.4s, v10.16b, v13.4b[2]\n" + ".word 0x4fade963 // sdot v3.4s, v11.16b, v13.4b[3]\n" + "cmp %w[is_row_sums_nullptr], #1\n" + "bne 3f\n" + // Accumulate row_sums for zero point calculations. + "saddlp v12.8h, v12.16b\n" + "saddlp v13.8h, v13.16b\n" + "sadalp v14.4s, v12.8h\n" + "sadalp v15.4s, v13.8h\n" + "3:\n" + "cmp %[mat_ptr0], %[mat_ptr0_end]\n" + "bne 2b\n" + "add v0.4s, v0.4s, v1.4s\n" + "add v2.4s, v2.4s, v3.4s\n" + + "cmp %w[is_row_sums_nullptr], #1\n" + "bne 4f\n" + // Calculate zero point offsets. + "addv s14, v14.4s\n" + "addv s15, v15.4s\n" + "dup v14.4s, v14.s[0]\n" + "dup v15.4s, v15.s[0]\n" + "b 5f\n" + "4:\n" + "ld1r {v14.4s}, [%[row_sums_ptr]], #4\n" + "ld1r {v15.4s}, [%[row_sums_ptr]]\n" + "5:\n" + + "mul v14.4s, v14.4s, v7.4s\n" + "mul v15.4s, v15.4s, v7.4s\n" + "sub v0.4s, v0.4s, v14.4s\n" + "sub v2.4s, v2.4s, v15.4s\n" + + "scvtf v0.4s, v0.4s\n" + "scvtf v1.4s, v2.4s\n" + + // Multiply scale. + "fmul v0.4s, v16.4s, v0.4s\n" + "fmul v1.4s, v17.4s, v1.4s\n" + + "ld2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "ld2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + "sub %[result_ptr], %[result_ptr], %[wide_rows], lsl #2\n" + "fadd v9.4s, v9.4s, v0.4s\n" + "fadd v10.4s, v10.4s, v1.4s\n" + "st2 {v9.s, v10.s}[0], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[1], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[2], [%[result_ptr]], %[wide_rows]\n" + "st2 {v9.s, v10.s}[3], [%[result_ptr]], %[wide_rows]\n" + : [mat_ptr0] "+r"(mat_ptr0), [mat_ptr1] "+r"(mat_ptr1), [vec_ptr] "+r"(vec_ptr), + [result_ptr] "+r"(result_ptr), [row_sums_ptr] "+r"(row_sums_ptr) + : [mat_ptr0_end] "r"(mat_ptr0_end), + [scaling_factors_ptr] "r"(scaling_factors_ptr), [wide_rows] "r"(wide_rows), + [channel_scales_ptr] "r"(channel_scales_ptr), + [batch_offsets_ptr] "r"(batch_offsets_ptr), + [is_channel_scale_nullptr] "r"(is_channel_scale_nullptr), + [is_row_sums_nullptr] "r"(is_row_sums_nullptr) + : "x0", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", + "v12", "v13", "v14", "v15", "v16", "v17", "w0", "w1", "cc", "memory"); + } + } + + free(shuffled_vectors_free); +} + +// The DotprodMatrixBatchFourVectorMultiplyAccumulate kernel processes 4 +// vectors in the same time as the baseline processes 1 vector. However, it +// requires 4 vectors of input. +// +// To take advantage of this speed difference, we add some zero-valued +// vectors to the batch so that n_batch is a multiple of 4. Then we execute +// DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate on that padded batch, +// then extract just the results we want at the end (ignoring the extra padding +// outputs). +// +// The relative cost of the padding is large when the matrix is smaller than +// 128x128, so we don't use this code path on small matrices. On larger +// matrices, the computation cost dwarfs the padding cost, making this code +// viable. +// +// If we ignore the cost of padding, this kernel is: +// 1x the speed of NeonMatrixBatchVectorMultiplyImpl for n_batch = 1 +// 2x the speed of NeonMatrixBatchVectorMultiplyImpl for n_batch = 2 +// 3x the speed of NeonMatrixBatchVectorMultiplyImpl for n_batch = 3 +// ... +// +// We don't use this kernel when n_batch = 1 because the baseline kernel +// is fine for that case. +void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( + const int8_t *__restrict__ matrix, const int m_rows, const int m_cols, const int8_t *vectors, + const float *scaling_factors, int n_batch, float *__restrict__ result, + const float *per_channel_scale, const int32_t *input_offset, int32_t *row_sums) +{ + const int kWeightsPerUint32 = 4; + + // Round to the nearest multiple of 4. + int batch_round_up = n_batch; + if (n_batch % 4 != 0) + { + batch_round_up += (4 - n_batch % 4); + } + assert(n_batch <= batch_round_up); + + void *padded_vectors_free; + const int padded_vectors_size = batch_round_up * m_cols; + int8_t *padded_vectors = reinterpret_cast( + aligned_alloc(kWeightsPerUint32, padded_vectors_size, &padded_vectors_free)); + memset(padded_vectors, 0, padded_vectors_size); + + void *padded_result_free; + const int result_size = n_batch * m_rows * sizeof(float); + const int padded_result_size = batch_round_up * m_rows * sizeof(float); + float *padded_result = reinterpret_cast( + aligned_alloc(kWeightsPerUint32, padded_result_size, &padded_result_free)); + memcpy(padded_result, result, result_size); + memset(reinterpret_cast(padded_result) + result_size, 0, + padded_result_size - result_size); + + // Copy the input into the padded data structure. + assert(n_batch * m_cols <= padded_vectors_size); + memcpy(padded_vectors, vectors, n_batch * m_cols); + + void *padded_scaling_factors_free; + const int padded_scaling_factors_size = batch_round_up * sizeof(float); + float *padded_scaling_factors = reinterpret_cast( + aligned_alloc(kWeightsPerUint32, padded_scaling_factors_size, &padded_scaling_factors_free)); + assert(static_cast(n_batch * sizeof(float)) <= padded_scaling_factors_size); + assert(static_cast(batch_round_up * sizeof(float)) <= padded_scaling_factors_size); + memset(padded_scaling_factors, 0, batch_round_up * sizeof(float)); + memcpy(padded_scaling_factors, scaling_factors, n_batch * sizeof(float)); + + if (input_offset != nullptr) + { + void *padded_input_offset_free; + const int padded_input_offset_size = batch_round_up * sizeof(int32_t); + int32_t *padded_input_offset = reinterpret_cast( + aligned_alloc(kWeightsPerUint32, padded_input_offset_size, &padded_input_offset_free)); + assert(static_cast(n_batch * sizeof(int32_t)) <= padded_input_offset_size); + assert(static_cast(batch_round_up * sizeof(int32_t)) <= padded_input_offset_size); + memset(padded_input_offset, 0, batch_round_up * sizeof(int32_t)); + memcpy(padded_input_offset, input_offset, n_batch * sizeof(int32_t)); + + // Call the main kernel. + DotprodMatrixBatchFourVectorMultiplyAccumulate( + matrix, m_rows, m_cols, padded_vectors, padded_scaling_factors, batch_round_up, + padded_result, per_channel_scale, padded_input_offset, row_sums); + + free(padded_input_offset_free); + } + else + { + // Call the main kernel. + DotprodMatrixBatchFourVectorMultiplyAccumulate(matrix, m_rows, m_cols, padded_vectors, + padded_scaling_factors, batch_round_up, + padded_result); + } + memcpy(result, padded_result, result_size); + + free(padded_result_free); + free(padded_vectors_free); + free(padded_scaling_factors_free); +} + +void DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, + const int m_rows, const int m_cols, + const int8_t *vectors, + const float *scaling_factors, int n_batch, + float *__restrict__ result) +{ + DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate( + matrix, m_rows, m_cols, vectors, scaling_factors, n_batch, result, + /*per_channel_scale=*/nullptr, /*input_offset=*/nullptr, + /*row_sums=*/nullptr); +} +#endif // __aarch64__ + bool NeonIsZeroVector(const float *vector, int v_size) { // If v_size is not divisible by kFloatWeightsPerNeonLane, we cannot @@ -80,6 +544,49 @@ bool NeonIsZeroVector(const float *vector, int v_size) return true; } +void NeonCpuBackendGemm(const int8_t *input, const int32_t *bias, + const int8_t *input_to_gate_weights, int32_t n_batch, int32_t n_input, + int32_t n_output, int32_t, int32_t *scratch) +{ + MatrixParams lhs_params; + lhs_params.order = Order::kRowMajor; + lhs_params.rows = n_output; + lhs_params.cols = n_input; + lhs_params.cacheable = true; + + MatrixParams rhs_params; + rhs_params.order = Order::kColMajor; + rhs_params.rows = n_input; + rhs_params.cols = n_batch; + + MatrixParams dst_params; + dst_params.order = Order::kColMajor; + dst_params.rows = n_output; + dst_params.cols = n_batch; + + GemmParams gemm_params; + if (bias) + { + gemm_params.bias = bias; + } + + // Below code is from tflite::cpu_backend_gemm::detail::GemmImplUsingRuy + ruy::Context *ruy_context = ruy_support::GetRuyContext(); + + ruy::Matrix ruy_lhs; + ruy::Matrix ruy_rhs; + ruy::Matrix ruy_dst; + ruy_support::MakeRuyMatrix(lhs_params, input_to_gate_weights, &ruy_lhs); + ruy_support::MakeRuyMatrix(rhs_params, input, &ruy_rhs); + ruy_support::MakeRuyMatrix(dst_params, scratch, &ruy_dst); + + ruy::BasicSpec ruy_spec; + ruy_support::MakeRuySpec(gemm_params, &ruy_spec); + + constexpr ruy::Path kRuyPath = ruy::kAllPaths; + ruy::Mul(ruy_lhs, ruy_rhs, ruy_spec, ruy_context, &ruy_dst); +} + void NeonSymmetricQuantizeFloats(const float *values, const int size, int8_t *quantized_values, float *min, float *max, float *scaling_factor) { @@ -163,11 +670,38 @@ void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, const float *scaling_factors, int n_batch, float *__restrict__ result, int result_stride) { - const int kWeightsPerUint32 = 4; - const int kWeightsPerNeonLane = 16; - // If the number of rows is not divisible by kWeightsPerUint32, we set a - // flag and allocate an aligned memory block. The flag is used to use the - // aligned memory block later in the kernel loop. +#ifdef __aarch64__ + if (HasSdotInstruction() && m_cols % 16 == 0 && m_rows % 2 == 0 && m_rows >= n_batch) + { + if (n_batch % 4 == 0 && result_stride == 1) + { + // Benchmarks suggest that it's always better to use the batch code + // when we can, even on small matrices. + DotprodMatrixBatchFourVectorMultiplyAccumulate(matrix, m_rows, m_cols, vectors, + scaling_factors, n_batch, result); + return; + } + else if (result_stride == 1 && n_batch >= 2 && m_rows * m_cols >= 128 * 128) + { + DotprodMatrixBatchPaddedFourVectorMultiplyAccumulate(matrix, m_rows, m_cols, vectors, + scaling_factors, n_batch, result); + return; + } + } +#endif // __aarch64__ + + static const int kWeightsPerUint32 = 4; + static const int kWeightsPerNeonLane = 16; + // Assuming *matrix is kWeightsPerUint32-byte aligned, + // every row of the matrix is also + // kWeightsPerUint32-byte aligned as long as cols is + // a multiple of kWeightsPerUint32. The assumption + // is currently satisfied by TFLite's 16-byte memory + // alignment scheme. + // + // Otherwise, we allocate an aligned memory block and set + // a flag to later copy rows from matrix to the block + // for aligned multiplication. bool unaligned = false; int8_t *aligned_row = nullptr; void *aligned_row_free = nullptr; @@ -182,18 +716,20 @@ void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, &aligned_vec_free); // If m_cols is not at least kWeightsPerNeonLane, we cannot use the main - // vectorized loop, and we need to process sequentially. postamble_start shows - // the start index where this should happen. - const int postamble_start = m_cols - (m_cols & (kWeightsPerNeonLane - 1)); - - int batch, row, col; - for (batch = 0; batch < n_batch; ++batch) + // vectorized loop, and we need to process sequentially. postamble_half_start + // shows the start index where this should happen. Between postamble_start and + // postamble_half_start we can still process kWeightsPerNeonLane >> 1 in a + // vectorized form. + const int postamble_half_start = m_cols & ~(kWeightsPerNeonLane - 1); + const int postamble_start = m_cols & ~((kWeightsPerNeonLane >> 1) - 1); + + for (int batch = 0; batch < n_batch; ++batch) { const float batch_scaling_factor = scaling_factors[batch]; // Copy the vector data to an aligned vector. memcpy(aligned_vec, vectors + batch * m_cols, sizeof(int8_t) * m_cols); // Compute dot-product for every column. - for (row = 0; row < m_rows; ++row, result += result_stride) + for (int row = 0; row < m_rows; ++row, result += result_stride) { // Get the address of the first element of the row. int8_t *row_ptr = (int8_t *)matrix + row * m_cols; // NOLINT @@ -204,24 +740,26 @@ void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, } // Initialize the dot product sum for the row to 0. - int32x4_t dotprod = vmovq_n_s32(0); + int32x4_t dotprod_32x4 = vmovq_n_s32(0); // Prefetch the row to cache. __builtin_prefetch(row_ptr, 0 /* prefetch for read */, 3 /* temporal locality */); // For every block of 16 8-bit elements. - col = 0; - for (; col < postamble_start; col += kWeightsPerNeonLane) + int col = 0; + for (; col < postamble_half_start; col += kWeightsPerNeonLane) { // Load 16 8-bit values from the row and vector, each, to operate on. - // Here the assumption is that each buffer is 4-byte aligned. - assert(((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); + // Here the assumption is that each buffer is 4-byte aligned. Otherwise, + // performance may suffer significantly. + assert( // NOLINT + ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); const int8x16_t s1_8x16 = vld1q_s8((const int8_t *)(aligned_vec + col)); const int8x16_t s2_8x16 = vld1q_s8((const int8_t *)(row_ptr + col)); // Multiply the low bits (i.e. the lower 8 8bit numbers in the // registers). int16x8_t prod_16x8 = vmull_s8(vget_low_s8(s1_8x16), vget_low_s8(s2_8x16)); - // Multiply the high bits (i.e. the lower 8 8bit numbers in the + // Multiply the high bits (i.e. the higher 8 8bit numbers in the // registers), and accumulate with the result of the low bits product. // The assumption here is that overflow will not happen as we quantize // our values to be in the range [-127, 127]. As such the sum of the 2 @@ -229,37 +767,35 @@ void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, // value). prod_16x8 = vmlal_s8(prod_16x8, vget_high_s8(s1_8x16), vget_high_s8(s2_8x16)); - dotprod = vpadalq_s16(dotprod, prod_16x8); + dotprod_32x4 = vpadalq_s16(dotprod_32x4, prod_16x8); } // for col - int32_t postable_sum = 0; - // Postamble loop. - // TODO(raziel): if (ABSL_PREDICT_FALSE(postamble_start < m_rows)) - if (postamble_start < m_cols) + // Half iteration dealing only 8 elements + // TODO(raziel): if (ABSL_PREDICT_FALSE(col < postamble_start)) + if (col < postamble_start) { - col = postamble_start; - if ((m_cols - postamble_start) >= (kWeightsPerNeonLane >> 1)) - { - // Load 8 8-bit values from the row and column each to operate on. - // Here the assumption is that each buffer is 4-bytes aligned. - assert(((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); - const int8x8_t s1_8x8 = vld1_s8((const int8_t *)(aligned_vec + col)); - const int8x8_t s2_8x8 = vld1_s8((const int8_t *)(row_ptr + col)); - const int16x8_t prod_16x8 = vmull_s8(s1_8x8, s2_8x8); - dotprod = vpadalq_s16(dotprod, prod_16x8); - col += (kWeightsPerNeonLane >> 1); - } - for (; col < m_cols; ++col) - { - postable_sum += row_ptr[col] * aligned_vec[col]; - } // for col + // Load 8 8-bit values from the row and column each to operate on. + // Here the assumption is that each buffer is 4-bytes aligned. + // Otherwise, performance may suffer significantly. + assert( // NOLINT + ((uintptr_t)(&row_ptr[col]) & (kWeightsPerUint32 - 1)) == 0); + const int8x8_t s1_8x8 = vld1_s8((const int8_t *)(aligned_vec + col)); + const int8x8_t s2_8x8 = vld1_s8((const int8_t *)(row_ptr + col)); + const int16x8_t prod_16x8 = vmull_s8(s1_8x8, s2_8x8); + dotprod_32x4 = vpadalq_s16(dotprod_32x4, prod_16x8); + col += (kWeightsPerNeonLane >> 1); } // Add the 4 intermediate sum values to get the final dot-prod value for // this row. - int64x2_t pairwiseAdded = vpaddlq_s32(dotprod); - int32_t neon_sum = vgetq_lane_s64(pairwiseAdded, 0) + vgetq_lane_s64(pairwiseAdded, 1); + int32_t dotprod = AccumulateNeonLane(dotprod_32x4); + // Postamble loop. + // TODO(raziel): if (ABSL_PREDICT_FALSE(col < m_cols)) + for (; col < m_cols; ++col) + { + dotprod += row_ptr[col] * aligned_vec[col]; + } // for col - *result += ((neon_sum + postable_sum) * batch_scaling_factor); + *result += dotprod * batch_scaling_factor; } // for row } // for batch @@ -311,6 +847,50 @@ void NeonMatrixBatchVectorMultiplyAccumulate(const float *matrix, int m_rows, in } } +void NeonMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, const int m_rows, + const int m_cols, const int8_t *__restrict__ vectors, + const float *scaling_factors, int n_batch, + int32_t *scratch, float *__restrict__ result, + int result_stride) +{ + if (m_rows % 4 == 0 && result_stride == 1) + { + const int32_t *bias = static_cast(nullptr); + NeonCpuBackendGemm(vectors, bias, matrix, n_batch, m_cols, m_rows, + /*output_zp =*/0, scratch); + + // Multiply by float scaling factors and write to result + const int total_size = n_batch * m_rows; + int i = 0; + for (; i <= total_size - 8; i += 8, result += 8 * result_stride) + { + const float batch_scaling_factor0 = scaling_factors[i / m_rows]; + const float batch_scaling_factor1 = scaling_factors[(i + 4) / m_rows]; + const float32x4_t scaling_factor0 = vdupq_n_f32(batch_scaling_factor0); + const float32x4_t scaling_factor1 = vdupq_n_f32(batch_scaling_factor1); + const int32x4_t scratch_val0 = vld1q_s32(scratch + i); + const int32x4_t scratch_val1 = vld1q_s32(scratch + i + 4); + const float32x4_t float_val0 = vcvtq_f32_s32(scratch_val0); + const float32x4_t float_val1 = vcvtq_f32_s32(scratch_val1); + const float32x4_t result0 = vmlaq_f32(vld1q_f32(result), float_val0, scaling_factor0); + const float32x4_t result1 = + vmlaq_f32(vld1q_f32(result + 4 * result_stride), float_val1, scaling_factor1); + vst1q_f32(result, result0); + vst1q_f32(result + 4 * result_stride, result1); + } + scratch += i; + for (; i < total_size; i++, result += result_stride) + { + const float batch_scaling_factor = scaling_factors[i / m_rows]; + int32_t x = *(scratch++); + *result += x * batch_scaling_factor; + } + return; + } + NeonMatrixBatchVectorMultiplyAccumulate(matrix, m_rows, m_cols, vectors, scaling_factors, n_batch, + result, result_stride); +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/PortableTensorUtils.h b/compute/cker/include/cker/PortableTensorUtils.h index 87b792e..9769d4b 100644 --- a/compute/cker/include/cker/PortableTensorUtils.h +++ b/compute/cker/include/cker/PortableTensorUtils.h @@ -137,6 +137,17 @@ void PortableMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matr } // for batch } +void PortableMatrixBatchVectorMultiplyAccumulate(const int8_t *__restrict__ matrix, + const int m_rows, const int m_cols, + const int8_t *__restrict__ vector, + const float *scaling_factors, int n_batch, + int32_t *, float *__restrict__ result, + int result_stride) +{ + PortableMatrixBatchVectorMultiplyAccumulate(matrix, m_rows, m_cols, vector, scaling_factors, + n_batch, result, result_stride); +} + void PortableMatrixBatchVectorMultiplyAccumulate(const float *matrix, int m_rows, int m_cols, const float *vector, int n_batch, float *result, int result_stride) diff --git a/compute/cker/include/cker/Shape.h b/compute/cker/include/cker/Shape.h index 43b511d..2486f01 100644 --- a/compute/cker/include/cker/Shape.h +++ b/compute/cker/include/cker/Shape.h @@ -33,9 +33,9 @@ namespace cker class Shape { public: - // Shapes with dimensions up to 4 are stored directly in the structure, while + // Shapes with dimensions up to 5 are stored directly in the structure, while // larger shapes are separately allocated. - static constexpr int kMaxSmallSize = 4; + static constexpr int kMaxSmallSize = 5; Shape &operator=(Shape const &) = delete; @@ -201,7 +201,7 @@ private: int32_t _size; union { int32_t _dims[kMaxSmallSize]; - int32_t *_dims_pointer; + int32_t *_dims_pointer{nullptr}; }; }; @@ -213,6 +213,15 @@ inline int MatchingDim(const Shape &shape1, int index1, const Shape &shape2, int return shape1.Dims(index1); } +template +int MatchingDim(const Shape &shape1, int index1, const Shape &shape2, int index2, Args... args) +{ + assert(shape1.Dims(index1) == shape2.Dims(index2)); + UNUSED_RELEASE(shape2); + UNUSED_RELEASE(index2); + return MatchingDim(shape1, index1, args...); +} + inline Shape GetShape(const std::vector &data) { return Shape(data.size(), data.data()); } inline int Offset(const Shape &shape, int i0, int i1, int i2, int i3) @@ -251,16 +260,21 @@ template inline bool checkMatching(const Shape &shape, Ts... ch const Shape check_shapes_array[sizeof...(Ts)] = {std::forward(check_shapes)...}; for (const auto &check_shape : check_shapes_array) { - if (shape.DimensionsCount() != check_shape.DimensionsCount()) + // Check matching of shapes except the case of that two shapes can be scalar + if (shape.DimensionsCount() > 1 || check_shape.DimensionsCount() > 1 || shape.FlatSize() != 1 || + check_shape.FlatSize() != 1) { - return false; - } - for (int i = 0; i < shape.DimensionsCount(); ++i) - { - if (shape.Dims(i) != check_shape.Dims(i)) + if (shape.DimensionsCount() != check_shape.DimensionsCount()) { return false; } + for (int i = 0; i < shape.DimensionsCount(); ++i) + { + if (shape.Dims(i) != check_shape.Dims(i)) + { + return false; + } + } } } return true; @@ -291,6 +305,34 @@ inline int MatchingFlatSizeSkipDim(const Shape &shape, int skip_dim, const Shape return FlatSizeSkipDim(shape, skip_dim); } +inline int MatchingFlatSizeSkipDim(const Shape &shape, int skip_dim, const Shape &check_shape_0, + const Shape &check_shape_1) +{ + UNUSED_RELEASE(check_shape_0); + const int dims_count = shape.DimensionsCount(); + for (int i = 0; i < dims_count; ++i) + { + if (i != skip_dim) + { + assert(shape.Dims(i) == check_shape_0.Dims(i)); + } + } + return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1); +} + +inline int MatchingElementsSize(const Shape &shape, const Shape &check_shape_0, + const Shape &check_shape_1) +{ + const int size_1 = shape.FlatSize(); + const int size_2 = check_shape_0.FlatSize(); + const int size_3 = check_shape_1.FlatSize(); + assert(size_1 == size_2); + assert(size_2 == size_3); + UNUSED_RELEASE(size_2); + UNUSED_RELEASE(size_3); + return size_1; +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/TensorUtils.h b/compute/cker/include/cker/TensorUtils.h index 6c5bacb..6b23c0b 100644 --- a/compute/cker/include/cker/TensorUtils.h +++ b/compute/cker/include/cker/TensorUtils.h @@ -70,6 +70,15 @@ void MatrixBatchVectorMultiplyAccumulate(const float *matrix, int m_rows, int m_ result, result_stride); } +void MatrixBatchVectorMultiplyAccumulate(const int8_t *matrix, const int m_rows, const int m_cols, + const int8_t *vectors, const float *scaling_factors, + int n_batch, int32_t *scratch, float *result, + int result_stride) +{ + NEON_OR_PORTABLE(MatrixBatchVectorMultiplyAccumulate, matrix, m_rows, m_cols, vectors, + scaling_factors, n_batch, scratch, result, result_stride); +} + void ZeroVector(float *vector, int v_size) { PortableZeroVector(vector, v_size); } } // namespace cker diff --git a/compute/cker/include/cker/Types.h b/compute/cker/include/cker/Types.h index 3c3396a..41b1916 100644 --- a/compute/cker/include/cker/Types.h +++ b/compute/cker/include/cker/Types.h @@ -19,6 +19,9 @@ #define __NNFW_CKER_TYPES_H__ #include +#include +#include +#include namespace nnfw { @@ -45,6 +48,7 @@ enum class BinaryArithmeticOpType SUB = 1, MUL = 2, DIV = 3, + POW = 4, }; enum class ComparisonOpType @@ -63,6 +67,15 @@ struct PaddingValues int16_t height; }; +enum class BroadcastableOpCategory : uint8_t +{ + kNone, + kNonBroadcast, // Matching input shapes. + kFirstInputBroadcastsFast, // Fivefold nested loops. + kSecondInputBroadcastsFast, // Fivefold nested loops. + kGenericBroadcast, // Fall-back. +}; + struct PoolParams { FusedActivationFunctionType activation; @@ -85,6 +98,7 @@ struct SoftmaxParams // beta is not really used (not a Tensorflow parameter) and not implemented // for LogSoftmax. double beta; + int axis; // uint8 inference params. Used even when beta defaults to 1.0. int32_t input_multiplier; int32_t input_left_shift; @@ -140,14 +154,20 @@ struct ConvParams struct ComparisonParams { ComparisonOpType type; + int left_shift; + int input1_shift; + int input2_shift; + int32_t input1_offset; + int32_t input1_multiplier; + int32_t input2_offset; + int32_t input2_multiplier; bool is_broadcast; }; struct BinaryArithmeticOpParam { - BinaryArithmeticOpType type; // Shape dependent / common to data / op types. - // BroadcastableOpCategory broadcast_category; + BroadcastableOpCategory broadcast_category; // uint8 inference params. int32_t input1_offset; int32_t input2_offset; @@ -176,7 +196,7 @@ struct BinaryArithmeticOpParam // broadcast_shape[2] = b2 = a2. // broadcast_shape[1] = a3; b3 = 1. // broadcast_shape[0] = b4 = a4. - // int broadcast_shape[5]; + int broadcast_shape[5] = {}; }; struct TransposeParams @@ -305,6 +325,172 @@ struct SplitParams int16_t axis; }; +struct FusedBatchNormParams +{ + bool is_training; + std::string data_format; // UNKNOWN(0), NHWC(1), NCHW(2) + float epsilon; +}; + +struct SpaceToBatchParams +{ + // "Zero" padding for uint8 means padding with the output offset. + int32_t output_offset; +}; + +enum class Order +{ + kColMajor, + kRowMajor +}; + +// MatrixParams encapsulates the parameters that Gemm needs about each +// matrix, besides the buffer data pointer. +// Compare to ruy::Matrix, which also encapsulates the data pointer. +// Rationale for leaving the data pointer out of here: doing so +// requires complicated const-correctness mechanics. See +// ruy::ConstCheckingPtr. +template struct MatrixParams +{ + // Storage layout order. For now we only do plain linear non-strided + // layout. It would be easy to support a stride if needed. + Order order = Order::kColMajor; + // Number of rows of the matrix. + int rows = 0; + // Number of columns of the matrix. + int cols = 0; + // The zero_point, i.e. which Scalar value is to be interpreted as zero. + // When Scalar is floating-point, this must be 0. + Scalar zero_point = 0; + // Indicate whether the underlying data will remain unchanged for + // some period of time. Defaults to false, but should be set to true + // for unchanging data (e.g. weights buffers in many cases) + bool cacheable = false; +}; + +// Enumeration of broad categories of Gemm. +// +// The primary reason for this to exist is to allow Gemm to compile +// only uniform-quantized or only per-channel-quantized code paths. +// This is unneeded with ruy as the back-end, as this is only a runtime +// difference in ruy, but with gemmlowp these really are separate code +// paths and templatizing in a QuantizationFlavor is necessary to avoid +// compiling unused gemmlowp code. Indeed, TFLite currently uses +// uint8 with uniform quantization and int8 with per-channel quantization, +// and does not use uint8 with per-channel. We want to avoid compiling +// the gemmlowp uint8 per-channel path when gemmlowp is the back-end. +// +// It's possible to drop this in the future if gemmlowp goes away and no +// other then-relevant backend library handles quantized paths in a way that +// requires knowing this at compile-time. +enum class QuantizationFlavor +{ + // Floating-point Gemm: the accumulators are not multiplied by any + // 'multiplier'. + kFloatingPoint, + // Quantized Gemm using a single multiplier for all accumulators. + kIntegerWithUniformMultiplier, + // Quantized Gemm using a separate multipliers for accumulators of each + // row of the destination matrix. This is what is called 'per-channel' + // in GemmParams. Here we use the more specific 'per-row' terminology + // to allow for the possibility of 'per-column' in the future, and to + // allow for that to be a separate code path in some back-end such as + // gemmlowp. + kIntegerWithPerRowMultiplier +}; + +// Additional parameters that Gemm needs, beyond what falls into +// the MatrixParams that it takes. Compare to ruy::Spec. +// +// Decoupling AccumScalar from DstScalar (rather than deducing it from that) +// is useful future-proofing. Think of a float16 path using float32 accum. +// +// QuantizationFlavor is passed here even though it's technically not used +// in this class. This is so that we retain the ability in the future to +// specialize this class for quantization flavor, and this allows for +// Gemm to be templatized in quantization_flavor via the GemmParams that it +// takes, allowing for automatic template parameter deduction to take place, +// so that most call sites don't need to specify a QuantizationFlavor +// (only those that need perchannel quantization do). +template ::value + ? QuantizationFlavor::kFloatingPoint + : QuantizationFlavor::kIntegerWithUniformMultiplier> +struct GemmParams +{ + // Only for non-floating-point cases. The fixed-point part (i.e. the mantissa) + // of the multiplier by which accumulators are multiplied before being casted + // to the destination type. + AccumScalar multiplier_fixedpoint = 0; + // Only for non-floating-point cases. The exponent part of the aforementioned + // multiplier. + int multiplier_exponent = 0; + // Per-channel variant of multiplier_fixedpoint. If not nullptr, this must + // point to a buffer of as many values as there are rows in the destination + // matrix. Each row of the destination matrix will use the corresponding + // buffer element instead of multiplier_fixedpoint. + const AccumScalar *multiplier_fixedpoint_perchannel = nullptr; + // Per-channel variant of multiplier_exponent. If not nullptr, this must + // point to a buffer of as many values as there are rows in the destination + // matrix. Each row of the destination matrix will use the corresponding + // buffer element instead of multiplier_exponent. + // + // Either none or both of multiplier_exponent_perchannel and + // multiplier_fixedpoint_perchannel must be nullptr. + const int *multiplier_exponent_perchannel = nullptr; + // The bias vector data, if not null. + const AccumScalar *bias = nullptr; + // min clamp bound of destination values. + DstScalar clamp_min = std::is_floating_point::value + ? -std::numeric_limits::infinity() + : std::numeric_limits::lowest(); + // max clamp bound of destination values. + DstScalar clamp_max = std::is_floating_point::value + ? std::numeric_limits::infinity() + : std::numeric_limits::max(); +}; + +// Validates self-consistency of GemmParams. +template +void ValidateGemmParams(const GemmParams ¶ms) +{ + // Guard consistency of the quantized multiplier fields. + if (quantization_flavor == QuantizationFlavor::kFloatingPoint) + { + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + else if (quantization_flavor == QuantizationFlavor::kIntegerWithUniformMultiplier && + !std::is_same::value) + { + assert(params.multiplier_fixedpoint); + // Nothing to check about multiplier_exponent + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + else if (quantization_flavor == QuantizationFlavor::kIntegerWithPerRowMultiplier && + !std::is_same::value) + { + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(params.multiplier_fixedpoint_perchannel); + assert(params.multiplier_exponent_perchannel); + } + else + { + // For the get raw accumulator case, we should make sure none of the + // quantization params are set. + assert(!params.multiplier_fixedpoint); + assert(!params.multiplier_exponent); + assert(!params.multiplier_fixedpoint_perchannel); + assert(!params.multiplier_exponent_perchannel); + } + UNUSED_RELEASE(params); +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/Utils.h b/compute/cker/include/cker/Utils.h index 17ef3c3..b69d55c 100644 --- a/compute/cker/include/cker/Utils.h +++ b/compute/cker/include/cker/Utils.h @@ -35,6 +35,54 @@ inline T ActivationFunctionWithMinMax(T x, T output_activation_min, T output_act return std::min(std::max(x, output_activation_min), output_activation_max); } +inline void QuantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift) +{ + if (double_multiplier == 0.) + { + *quantized_multiplier = 0; + *shift = 0; + return; + } + + const double q = std::frexp(double_multiplier, shift); + auto q_fixed = static_cast(round(q * (1ll << 31))); + + assert(q_fixed <= (1ll << 31)); + if (q_fixed == (1ll << 31)) + { + q_fixed /= 2; + ++*shift; + } + assert(q_fixed <= std::numeric_limits::max()); + // A shift amount smaller than -31 would cause all bits to be shifted out + // and thus all results would be zero. We implement that instead with + // q_fixed==0, so as to avoid hitting issues with right-shift + // operations with shift amounts greater than 31. Note that this happens + // roughly when abs(double_multiplier) < 2^-31 and the present handling means + // that we're effectively flushing tiny double_multiplier's to zero. + // We could conceivably handle values in the range (roughly) [32, 63] + // as 'denormals' i.e. (shift==0, q_fixed < 2^30). In that point of view + // the present handling is just doing 'flush denormals to zero'. We could + // reconsider and actually generate nonzero denormals if a need arises. + if (*shift < -31) + { + *shift = 0; + q_fixed = 0; + } + *quantized_multiplier = static_cast(q_fixed); +} + +inline void QuantizeMultiplierSmallerThanOneExp(double double_multiplier, + int32_t *quantized_multiplier, int *left_shift) +{ + assert(double_multiplier < 1.0); + assert(double_multiplier > 0.0); + int shift; + QuantizeMultiplier(double_multiplier, quantized_multiplier, &shift); + assert(shift <= 0); + *left_shift = shift; +} + inline int32_t MultiplyByQuantizedMultiplier(int32_t x, int32_t quantized_multiplier, int shift) { int left_shift = shift > 0 ? shift : 0; @@ -50,6 +98,14 @@ inline int32_t MultiplyByQuantizedMultiplierGreaterThanOne(int32_t x, int32_t qu return gemmlowp::SaturatingRoundingDoublingHighMul(x * (1 << left_shift), quantized_multiplier); } +inline int32_t MultiplyByQuantizedMultiplierSmallerThanOneExp(int32_t x, + int32_t quantized_multiplier, + int left_shift) +{ + return gemmlowp::RoundingDivideByPOT( + gemmlowp::SaturatingRoundingDoublingHighMul(x, quantized_multiplier), -left_shift); +} + inline int NodeOffset(int b, int h, int w, int height, int width) { return (b * height + h) * width + w; @@ -105,6 +161,30 @@ inline int SubscriptToIndex(const NdArrayDesc<4> &desc, int i0, int i1, int i2, return i0 * desc.strides[0] + i1 * desc.strides[1] + i2 * desc.strides[2] + i3 * desc.strides[3]; } +template inline int SubscriptToIndexGeneric(const NdArrayDesc *desc, int *iter) +{ + int ret_indx = 0; + for (size_t idx = 0; idx < static_cast(N); idx++) + { + assert(iter[idx] >= 0 && iter[idx] < desc->extents[idx]); + ret_indx += iter[idx] * desc->strides[idx]; + } + + return ret_indx; +} + +// Copies dims to desc, calculating strides. +template inline void CopyDimsToDesc(const Shape &input_shape, NdArrayDesc *desc_out) +{ + int desc_stride = 1; + for (int i = N - 1; i >= 0; --i) + { + desc_out->extents[i] = input_shape.Dims(i); + desc_out->strides[i] = desc_stride; + desc_stride *= input_shape.Dims(i); + } +} + template inline void NdArrayDescsForElementwiseBroadcast(const Shape &input0_shape, const Shape &input1_shape, @@ -117,17 +197,8 @@ NdArrayDescsForElementwiseBroadcast(const Shape &input0_shape, const Shape &inpu auto extended_input1_shape = Shape::ExtendedShape(N, input1_shape); // Copy dims to desc, calculating strides. - int desc0_stride = 1; - int desc1_stride = 1; - for (int i = N - 1; i >= 0; --i) - { - desc0_out->extents[i] = extended_input0_shape.Dims(i); - desc0_out->strides[i] = desc0_stride; - desc0_stride *= extended_input0_shape.Dims(i); - desc1_out->extents[i] = extended_input1_shape.Dims(i); - desc1_out->strides[i] = desc1_stride; - desc1_stride *= extended_input1_shape.Dims(i); - } + CopyDimsToDesc(extended_input0_shape, desc0_out); + CopyDimsToDesc(extended_input1_shape, desc1_out); // Walk over each dimension. If the extents are equal do nothing. // Otherwise, set the desc with extent 1 to have extent equal to the other and @@ -153,6 +224,65 @@ NdArrayDescsForElementwiseBroadcast(const Shape &input0_shape, const Shape &inpu } } +template +inline void +NdArrayDescsForElementwiseBroadcast(const Shape &input0_shape, const Shape &input1_shape, + const Shape &input2_shape, NdArrayDesc *desc0_out, + NdArrayDesc *desc1_out, NdArrayDesc *desc2_out) +{ + assert(desc0_out != nullptr); + assert(desc1_out != nullptr); + assert(desc2_out != nullptr); + + auto extended_input0_shape = Shape::ExtendedShape(N, input0_shape); + auto extended_input1_shape = Shape::ExtendedShape(N, input1_shape); + auto extended_input2_shape = Shape::ExtendedShape(N, input2_shape); + + // Copy dims to desc, calculating strides. + CopyDimsToDesc(extended_input0_shape, desc0_out); + CopyDimsToDesc(extended_input1_shape, desc1_out); + CopyDimsToDesc(extended_input2_shape, desc2_out); + + // Walk over each dimension. If the extents are equal do nothing. + // Otherwise, set the desc with extent 1 to have extent equal to the other and + // stride 0. + for (int i = 0; i < N; ++i) + { + const int extent0 = extended_input0_shape.Dims(i); + const int extent1 = extended_input1_shape.Dims(i); + const int extent2 = extended_input2_shape.Dims(i); + + int extent = extent0; + if (extent1 != 1) + extent = extent1; + if (extent2 != 1) + extent = extent2; + + assert(extent0 == 1 || extent0 == extent); + assert(extent1 == 1 || extent1 == extent); + assert(extent2 == 1 || extent2 == extent); + + if (!(extent0 == extent1 && extent1 == extent2)) + { + if (extent0 == 1) + { + desc0_out->strides[i] = 0; + desc0_out->extents[i] = extent; + } + if (extent1 == 1) + { + desc1_out->strides[i] = 0; + desc1_out->extents[i] = extent; + } + if (extent2 == 1) + { + desc2_out->strides[i] = 0; + desc2_out->extents[i] = extent; + } + } + } +} + // Gets next index to iterate through a multidimensional array. inline bool NextIndex(const int num_dims, const int *dims, int *current) { diff --git a/compute/cker/include/cker/eigen/eigen_convolution_helpers.h b/compute/cker/include/cker/eigen/eigen_convolution_helpers.h index 52bd122..a27871e 100644 --- a/compute/cker/include/cker/eigen/eigen_convolution_helpers.h +++ b/compute/cker/include/cker/eigen/eigen_convolution_helpers.h @@ -62,7 +62,7 @@ public: typedef decltype( functionExistsSfinae(nullptr)) status; - static const bool value = status::value; + static constexpr bool value = status::value; }; // Compute a mask for loading/storing coefficients in/from a packet in a diff --git a/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h b/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h index 6536c6f..92e1614 100644 --- a/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h +++ b/compute/cker/include/cker/eigen/eigen_spatial_convolutions-inl.h @@ -1,17 +1,19 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #ifndef __NNFW_CKER_EIGEN_EIGEN_SPATIAL_CONVOLUTIONS_INL_H__ #define __NNFW_CKER_EIGEN_EIGEN_SPATIAL_CONVOLUTIONS_INL_H__ @@ -127,6 +129,7 @@ public: m_colStride = patch_rows; m_outputRows = tensor.impl().outputRows(); + m_outputCols = tensor.impl().outputCols(); m_row_strides = tensor.impl().userRowStride(); m_col_strides = tensor.impl().userColStride(); @@ -185,6 +188,7 @@ public: m_inputCols = base_mapper.m_inputCols; m_outputRows = base_mapper.m_outputRows; + m_outputCols = base_mapper.m_outputCols; m_row_strides = base_mapper.m_row_strides; m_col_strides = base_mapper.m_col_strides; @@ -361,7 +365,7 @@ private: // the elements corresponding to the column (specified through colOffset) are // loaded and the rest of the elements are zero-filled into the 'partial' // packet. This function is called from loadPacketStandardFromTwoColumns(). - // This code path is exercied only when the packet type supports masked load + // This code path is exercised only when the packet type supports masked load // and when the partial packet load is available in the TensorEvaluator. EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet loadPartialPacketStandard(Index rowIndex, Index colIndex, @@ -482,7 +486,7 @@ private: // Load standard packet from a patch specified by the "within patch offset" // (patchId) and the precomputed indices of the first element of the patch. // This function will be called if partial packet loading is not available - // for the TesnorEvaluator or if the packet type does not support masked + // for the TensorEvaluator or if the packet type does not support masked // load. template EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE typename std::enable_if< @@ -524,7 +528,7 @@ private: // Load standard packet from a patch specified by the "within patch offset" // (patchId) and the precomputed indices of the first element of the patch. // This function will be called if partial packet loading is available for - // the TesnorEvaluator and if the packet type supports masked load. + // the TensorEvaluator and if the packet type supports masked load. // The only difference between this and the other case is that if the packet // to load is split across two columns, then in this case instead of going to // the slow (element-by-element) load, we load two packets - each containing @@ -663,7 +667,8 @@ private: Index m_inputRows; // Number of rows in the input tensor Index m_inputCols; // Number of cols in the input tensor - Index m_outputRows; // Number of patch rows + Index m_outputRows; // Number of convolution output rows + Index m_outputCols; // Number of convolution output column Index m_row_strides; // User specified row stride Index m_col_strides; // User specified col stride @@ -865,6 +870,32 @@ public: mask(0, num_coeffs)); } EIGEN_DEVICE_FUNC + EIGEN_ALWAYS_INLINE bool hasPadding() const + { + // TODO(ezhulenev): It does seems that for inflated filter it's still + // possible to guarantee "no padding or skipping" for non-standard packing. + if (nonStandardPatches()) + return true; + + // Non zero padding before. + if (m_base_mapper.m_rowPaddingTop > 0) + return true; + if (m_base_mapper.m_colPaddingLeft > 0) + return true; + + // Non zero padding after in rows. + const Index last_row = (m_base_mapper.m_outputRows - 1) * m_base_mapper.m_row_strides; + if (last_row + (patchRows() - 1) >= m_base_mapper.m_inputRows) + return true; + + // Non zero padding after in cols. + const Index last_col = (m_base_mapper.m_outputCols - 1) * m_base_mapper.m_col_strides; + if (last_col + (patchCols() - 1) >= m_base_mapper.m_inputCols) + return true; + + return false; + } + EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool padRow(const Index row) const { const Index r = m_rowIndex + row; @@ -1619,17 +1650,15 @@ SpatialConvolution(const Input &input, const Kernel &kernel, const Index row_str { const TensorIndex InputRowsEff = InputRows + padding_top + padding_bottom; const TensorIndex InputColsEff = InputCols + padding_left + padding_right; - out_height = - numext::ceil((InputRowsEff - kernelRowsEff + 1.f) / static_cast(row_stride)); - out_width = - numext::ceil((InputColsEff - kernelColsEff + 1.f) / static_cast(col_stride)); + out_height = divup(InputRowsEff - kernelRowsEff + 1, row_stride); + out_width = divup(InputColsEff - kernelColsEff + 1, col_stride); break; } case PADDING_SAME: { eigen_assert(!padding_explicit); - out_height = numext::ceil(InputRows / static_cast(row_stride)); - out_width = numext::ceil(InputCols / static_cast(col_stride)); + out_height = divup(InputRows, row_stride); + out_width = divup(InputCols, col_stride); break; } default: diff --git a/compute/cker/include/cker/eigen/eigen_tensor_reduced_instantiations_oss.h b/compute/cker/include/cker/eigen/eigen_tensor_reduced_instantiations_oss.h index 4ca3219..87697e2 100644 --- a/compute/cker/include/cker/eigen/eigen_tensor_reduced_instantiations_oss.h +++ b/compute/cker/include/cker/eigen/eigen_tensor_reduced_instantiations_oss.h @@ -72,10 +72,6 @@ typedef unsigned __int64 uint64_t; #include #endif -// #if defined(EIGEN_USE_LIBXSMM) -// #include "libxsmm.h" -// #endif - #ifdef EIGEN_USE_THREADS #include "unsupported/Eigen/CXX11/ThreadPool" #endif @@ -97,7 +93,6 @@ typedef unsigned __int64 uint64_t; #include "unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorDeviceGpu.h" -#include "unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h" @@ -154,7 +149,6 @@ typedef unsigned __int64 uint64_t; #include "unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorScan.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorTrace.h" -#include "unsupported/Eigen/CXX11/src/Tensor/TensorSycl.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h" #include "unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h" diff --git a/compute/cker/include/cker/operation/ArgMinMax.h b/compute/cker/include/cker/operation/ArgMinMax.h new file mode 100644 index 0000000..f7a06d7 --- /dev/null +++ b/compute/cker/include/cker/operation/ArgMinMax.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_ARGMINMAX_H__ +#define __NNFW_CKER_ARGMINMAX_H__ + +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ + +template +void ArgMinMax(const Shape &input1_shape, const T1 *input1_data, const Shape &output_shape, + T2 *output_data, int32_t axis, const Cmp &cmp) +{ + UNUSED_RELEASE(output_shape); + assert(input1_shape.DimensionsCount() > 0); + assert(input1_shape.DimensionsCount() - 1 == output_shape.DimensionsCount()); + if (axis < 0) + { + axis += input1_shape.DimensionsCount(); + } + const int axis_size = input1_shape.Dims(axis); + + int outer_size = 1; + for (int i = 0; i < axis; ++i) + { + assert(input1_shape.Dims(i) == output_shape.Dims(i)); + outer_size *= input1_shape.Dims(i); + } + + int inner_size = 1; + const int dims_count = input1_shape.DimensionsCount(); + for (int i = axis + 1; i < dims_count; ++i) + { + assert(input1_shape.Dims(i) == output_shape.Dims(i - 1)); + inner_size *= input1_shape.Dims(i); + } + for (int outer = 0; outer < outer_size; ++outer) + { + for (int inner = 0; inner < inner_size; ++inner) + { + auto min_max_value = input1_data[outer * axis_size * inner_size + inner]; + T2 min_max_index = 0; + for (int i = 1; i < axis_size; ++i) + { + const auto &curr_value = input1_data[(outer * axis_size + i) * inner_size + inner]; + if (cmp(curr_value, min_max_value)) + { + min_max_value = curr_value; + min_max_index = static_cast(i); + } + } + output_data[outer * inner_size + inner] = min_max_index; + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_ARGMINMAX_H__ diff --git a/compute/cker/include/cker/operation/BatchMatMul.h b/compute/cker/include/cker/operation/BatchMatMul.h new file mode 100644 index 0000000..1807098 --- /dev/null +++ b/compute/cker/include/cker/operation/BatchMatMul.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_BATCH_MATMUL_H__ +#define __NNFW_CKER_BATCH_MATMUL_H__ + +#include "Transpose.h" + +#include "cker/Types.h" +#include "cker/Shape.h" +#include "cker/Utils.h" +#include "cker/operation/reference/BatchMatMul.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +class BatchMatMul +{ +public: + BatchMatMul() + { + // DO NOTHING + } + + /** + * @brief Prepare temporary area for calculation + */ + void prepare(const Shape &lhs_shape, const Shape &rhs_shape, bool adj_x, bool adj_y) + { + if (adj_x) + { + int32_t rank = lhs_shape.DimensionsCount(); + _temp_lhs_shape.Resize(rank); + + for (int32_t i = 0; i < rank - 2; i++) + { + _temp_lhs_shape.SetDim(i, lhs_shape.Dims(i)); + } + _temp_lhs_shape.SetDim(rank - 2, lhs_shape.Dims(rank - 1)); + _temp_lhs_shape.SetDim(rank - 1, lhs_shape.Dims(rank - 2)); + + _temp_lhs.resize(_temp_lhs_shape.FlatSize()); + } + + if (!adj_y) + { + int32_t rank = rhs_shape.DimensionsCount(); + _temp_rhs_shape.Resize(rank); + + for (int32_t i = 0; i < rank - 2; i++) + { + _temp_rhs_shape.SetDim(i, rhs_shape.Dims(i)); + } + _temp_rhs_shape.SetDim(rank - 2, rhs_shape.Dims(rank - 1)); + _temp_rhs_shape.SetDim(rank - 1, rhs_shape.Dims(rank - 2)); + + _temp_rhs.resize(_temp_rhs_shape.FlatSize()); + } + } + + void operator()(const Shape &lhs_shape, const float *lhs_data, const Shape &rhs_shape, + const float *rhs_data, bool adj_x, bool adj_y, const Shape &output_shape, + float *output_data) + { + // Assume lhs and rhs is not constant + // TODO Handle constant input + + if (!adj_y) + { + transposeRowsCols(rhs_shape, rhs_data, _temp_rhs_shape, _temp_rhs.data()); + } + + if (adj_x) + { + transposeRowsCols(lhs_shape, lhs_data, _temp_lhs_shape, _temp_lhs.data()); + } + + Shape new_lhs_shape = adj_x ? lhs_shape : swapRowColDims(lhs_shape); + Shape new_rhs_shape = adj_y ? rhs_shape : swapRowColDims(rhs_shape); + const float *new_lhs_data = adj_x ? _temp_lhs.data() : lhs_data; + const float *new_rhs_data = adj_y ? rhs_data : _temp_rhs.data(); + + // Note we pass RHS args first, LHS args second + // Check accumulative dimensions of lhs and rhs of are equal + assert(Shape::ExtendedShape(5, new_rhs_shape).Dims(4) == + Shape::ExtendedShape(5, new_lhs_shape).Dims(3)); + reference::BatchMatMul(new_rhs_shape, new_rhs_data, new_lhs_shape, new_lhs_data, output_shape, + output_data); + } + +private: + Shape swapRowColDims(const Shape &shape) + { + Shape swapped_shape(shape); + const uint32_t dims = shape.DimensionsCount(); + swapped_shape.SetDim(dims - 2, shape.Dims(dims - 1)); + swapped_shape.SetDim(dims - 1, shape.Dims(dims - 2)); + + return swapped_shape; + } + + void transposeRowsCols(const Shape &input_shape, const float *input_data, + const Shape &output_shape, float *output_data) + { + TransposeParams params; + int rank = input_shape.DimensionsCount(); + params.perm_count = rank; + for (int i = 0; i < 2; i++) + { + params.perm[i] = i; + } + params.perm[rank - 2] = rank - 1; + params.perm[rank - 1] = rank - 2; + + Transpose(params, input_shape, input_data, output_shape, output_data); + } + +private: + std::vector _temp_lhs; + Shape _temp_lhs_shape; + std::vector _temp_rhs; + Shape _temp_rhs_shape; +}; + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_BATCH_MATMUL_H__ diff --git a/compute/cker/include/cker/operation/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/BinaryArithmeticOps.h index 27b3fa4..8aef1f8 100644 --- a/compute/cker/include/cker/operation/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/BinaryArithmeticOps.h @@ -32,10 +32,10 @@ namespace cker namespace { -template -const std::function GetBinaryArtithmeticFn(BinaryArithmeticOpType type) +template +const std::function GetBinaryArtithmeticFn() { - switch (type) + switch (op_type) { case BinaryArithmeticOpType::ADD: { @@ -51,13 +51,18 @@ const std::function GetBinaryArtithmeticFn(BinaryArithm } case BinaryArithmeticOpType::DIV: { - return [](const T &a, const T &b) -> T { - if (b == 0) - { - throw std::runtime_error("Divide by zero"); - } - return a / b; - }; + if (std::is_floating_point::value) + return [](const T &a, const T &b) -> T { return a / b; }; + else + return [](const T &a, const T &b) -> T { + if (b == 0) + throw std::runtime_error("Divide by zero"); + return a / b; + }; + } + case BinaryArithmeticOpType::POW: + { + return [](const T &a, const T &b) -> T { return std::pow(a, b); }; } default: { @@ -68,23 +73,165 @@ const std::function GetBinaryArtithmeticFn(BinaryArithm } } // namespace -template +// Consolidates dimensions in broadcast inputs, checks for five-fold pattern. +// +// For example, if sequence of dimensions of one input is +// ..., 1, 3, 1, 7, 9, 5,... and the other is ..., 2, 3, 1, 7, 1, 1, ... +// we can consolidate these as +// ..., 1, 3*7, 9*5, ... and 2, 3*7, 1. +// +// The category is updated in the less-frequent case of shapes that are +// not suited to a fivefold-loop broadcast. +// +// Falls back to generic pattern when it does not know how to process properly. +// +// Returns true iff there is some sort of broadcast, which includes five-fold +// patterns and falling back to generic broadcast. +inline bool ProcessBroadcastShapes(const Shape &shape0, const Shape &shape1, + BinaryArithmeticOpParam *params) +{ + const int dims_count = std::max(shape0.DimensionsCount(), shape1.DimensionsCount()); + + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + Shape scalar_shape(dims_count, 1); + + auto extended_shape0 = Shape::ExtendedShape(dims_count, shape0); + auto extended_shape1 = Shape::ExtendedShape(dims_count, shape1); + + // Check for "exact" match, implicitly accepting any scalar shapes. + if (extended_shape0 == extended_shape1) + { + params->broadcast_category = BroadcastableOpCategory::kNonBroadcast; + return false; + } + + for (int i = dims_count - 1; i >= 0; --i) + { + if (extended_shape0.Dims(i) == extended_shape1.Dims(i)) + { + continue; + } + else if (extended_shape0.Dims(i) == 1) + { + params->broadcast_category = BroadcastableOpCategory::kFirstInputBroadcastsFast; + break; + } + else if (extended_shape1.Dims(i) == 1) + { + params->broadcast_category = BroadcastableOpCategory::kSecondInputBroadcastsFast; + break; + } + else + { + // This case is erroneous: there is a dimension that does not match and + // is not a broadcast from one shape to the other. + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + return true; + } + } + + if (params->broadcast_category != BroadcastableOpCategory::kFirstInputBroadcastsFast && + params->broadcast_category != BroadcastableOpCategory::kSecondInputBroadcastsFast) + { + return false; + } + + // From this point it is assumed contractually that corresponding dimensions + // in shape0 and shape1 are either (a) equal or (b) one or other equals 1. + const bool swap_inputs = + params->broadcast_category == BroadcastableOpCategory::kSecondInputBroadcastsFast; + const Shape *shape_a = swap_inputs ? &extended_shape1 : &extended_shape0; + const Shape *shape_b = swap_inputs ? &extended_shape0 : &extended_shape1; + + int i = dims_count - 1; + params->broadcast_shape[0] = 1; + params->broadcast_shape[1] = 1; + params->broadcast_shape[2] = 1; + params->broadcast_shape[3] = 1; + params->broadcast_shape[4] = 1; + // y_0 is greedy: include dims if both or neither equal 1: in other words, + // test for equality rather than (shape_a->Dims(i) != 1). + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) + { + params->broadcast_shape[4] *= shape_b->Dims(i); + --i; + } + // Here either input_a or input_b has dim of 1 (if i >= 0). If it is input_b + // that has the unit dimension, the next two loops are not entered. + while (i >= 0 && shape_a->Dims(i) == 1) + { + params->broadcast_shape[3] *= shape_b->Dims(i); + --i; + } + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) + { + params->broadcast_shape[2] *= shape_a->Dims(i); + --i; + } + // Here either input_a or input_b has dim of 1 (if i >= 0). + while (i >= 0 && shape_b->Dims(i) == 1) + { + params->broadcast_shape[1] *= shape_a->Dims(i); + --i; + } + while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) + { + params->broadcast_shape[0] *= shape_b->Dims(i); + --i; + } + + // Rarer case is when the broadcast dimensions cannot be handled by a fivefold + // loop. + if (i >= 0) + { + params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; + } + return true; +} + +template inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, const T *input2_data, const Shape &output_shape, T *output_data) { reference::BinaryArithmeticOp(params, input1_shape, input1_data, input2_shape, input2_data, - output_shape, output_data, GetBinaryArtithmeticFn(params.type)); + output_shape, output_data, GetBinaryArtithmeticFn()); +} + +template +inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const uint8_t *input1_data, const Shape &input2_shape, + const uint8_t *input2_data, const Shape &output_shape, + uint8_t *output_data) +{ + switch (op_type) + { + case nnfw::cker::BinaryArithmeticOpType::ADD: + case nnfw::cker::BinaryArithmeticOpType::SUB: + optimized::AddQuant8(params, input1_shape, input1_data, input2_shape, input2_data, + output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::MUL: + optimized::MulQuant8(params, input1_shape, const_cast(input1_data), input2_shape, + const_cast(input2_data), output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::DIV: + throw std::runtime_error{"Quant8 Asymm NYI"}; + + default: + assert(false); + break; + } } -template <> +template inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const float *input1_data, const Shape &input2_shape, const float *input2_data, const Shape &output_shape, float *output_data) { // Supported type is only float now - switch (params.type) + switch (op_type) { case nnfw::cker::BinaryArithmeticOpType::ADD: optimized::Add(params, input1_shape, input1_data, input2_shape, input2_data, output_shape, @@ -99,9 +246,9 @@ inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shap output_data); break; case nnfw::cker::BinaryArithmeticOpType::DIV: - reference::BinaryArithmeticOp(params, input1_shape, input1_data, input2_shape, input2_data, - output_shape, output_data, - GetBinaryArtithmeticFn(params.type)); + reference::BinaryArithmeticOp(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data, + GetBinaryArtithmeticFn()); break; default: assert(false); @@ -109,78 +256,71 @@ inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shap } } -template -inline void BroadcastBinaryArithmeticOpSlow(const BinaryArithmeticOpParam ¶ms, - const Shape &input1_shape, const T *input1_data, - const Shape &input2_shape, const T *input2_data, - const Shape &output_shape, T *output_data) +template +inline void BroadcastBinaryArithmeticOp(BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const T *input1_data, const Shape &input2_shape, + const T *input2_data, const Shape &output_shape, + T *output_data) +{ + reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data, + GetBinaryArtithmeticFn()); +} + +template +inline void BroadcastBinaryArithmeticOp(BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const uint8_t *input1_data, const Shape &input2_shape, + const uint8_t *input2_data, const Shape &output_shape, + uint8_t *output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); - const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); - - const auto fn = GetBinaryArtithmeticFn(params.type); - - // Comment from tensorflow lite: - // - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) + switch (op_type) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) - { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) - { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) - { - output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( - fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]), - params.quantized_activation_min, params.quantized_activation_max); - } - } - } + case nnfw::cker::BinaryArithmeticOpType::ADD: + case nnfw::cker::BinaryArithmeticOpType::SUB: + optimized::BroadcastAddDispatchQuant8(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::MUL: + optimized::BroadcastMulDispatchQuant8( + params, input1_shape, const_cast(input1_data), input2_shape, + const_cast(input2_data), output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::DIV: + case nnfw::cker::BinaryArithmeticOpType::POW: + throw std::runtime_error{"Quant8 Asymm NYI"}; + default: + assert(false); + break; } } -template <> -inline void BroadcastBinaryArithmeticOpSlow(const BinaryArithmeticOpParam ¶ms, - const Shape &input1_shape, const float *input1_data, - const Shape &input2_shape, const float *input2_data, - const Shape &output_shape, float *output_data) +template +inline void BroadcastBinaryArithmeticOp(BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const float *input1_data, const Shape &input2_shape, + const float *input2_data, const Shape &output_shape, + float *output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); - const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); - - const auto fn = GetBinaryArtithmeticFn(params.type); - - for (int b = 0; b < extended_output_shape.Dims(0); ++b) + // Supported type is only float now + switch (op_type) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) - { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) - { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) - { - output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( - fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], - input2_data[SubscriptToIndex(desc2, b, y, x, c)]), - params.float_activation_min, params.float_activation_max); - } - } - } + case nnfw::cker::BinaryArithmeticOpType::ADD: + optimized::BroadcastAddDispatch(params, input1_shape, input1_data, input2_shape, input2_data, + output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::MUL: + optimized::BroadcastMulDispatch(params, input1_shape, input1_data, input2_shape, input2_data, + output_shape, output_data); + break; + case nnfw::cker::BinaryArithmeticOpType::SUB: + case nnfw::cker::BinaryArithmeticOpType::DIV: + case nnfw::cker::BinaryArithmeticOpType::POW: + reference::BroadcastBinaryArithmeticOpSlow( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + GetBinaryArtithmeticFn()); + break; + default: + assert(false); + break; } } diff --git a/compute/cker/include/cker/operation/BroadcastTo.h b/compute/cker/include/cker/operation/BroadcastTo.h new file mode 100644 index 0000000..5068eca --- /dev/null +++ b/compute/cker/include/cker/operation/BroadcastTo.h @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_BROADCAST_TO_H__ +#define __NNFW_CKER_BROADCAST_TO_H__ + +#include "cker/Types.h" +#include "cker/Shape.h" +#include "cker/Utils.h" + +#include "cker/eigen/EigenSupport.h" + +#include "cker/operation/Helper/Tensor.h" +#include "cker/operation/Helper/BCast.h" + +#include + +#define UNUSED(x) (void)(x) + +namespace nnfw +{ +namespace cker +{ +namespace functor +{ +static const int32_t kint32max = ((int32_t)0x7FFFFFFF); + +template struct FillFunctor +{ + // Computes on device "d": out = out.constant(in(0)), + void operator()(const Device &d, typename TTypes::Flat out, + typename TTypes::ConstScalar in); +}; + +template struct FillFunctor +{ + void operator()(const Eigen::ThreadPoolDevice &d, typename TTypes::Flat out, + typename TTypes::ConstScalar in) + { + out.device(d) = out.constant(in()); + } +}; + +template struct BroadcastTo +{ + template + void DoBCast32Bit(const Device &device, typename TTypes::Tensor out, + typename TTypes::ConstTensor in, + const typename Eigen::array &bcast) const + { + To32Bit(out).device(device) = To32Bit(in).broadcast(bcast); + } + + template + void DoBCast(const Device &device, typename TTypes::Tensor out, + typename TTypes::ConstTensor in, + const typename Eigen::array &bcast) const + { + out.device(device) = in.broadcast(bcast); + } + + template + void ReshapeAndBCast(const Device &device, Tensor &output_tensor, const Tensor &input_tensor, + const BCast &bcast) const + { + const bool can_use_32bit = std::is_same::value && + output_tensor.shape.FlatSize() < kint32max && + input_tensor.shape.FlatSize() < kint32max; + if (can_use_32bit) + { + DoBCast32Bit(device, output_tensor.template shaped(bcast.result_shape()), + input_tensor.template shaped(bcast.x_reshape()), + BCast::ToIndexArrayType(bcast.x_bcast())); + } + else + { + DoBCast(device, output_tensor.template shaped(bcast.result_shape()), + input_tensor.template shaped(bcast.x_reshape()), + BCast::ToIndexArrayType(bcast.x_bcast())); + } + } + + // PRECONDITION: rank(input_shape) > 0 && + // rank(input_shape) <= rank(output_shape) && + // output_shape.num_elements() > 0. + void operator()(const Device &device, Tensor &output_tensor, const Shape &output_shape, + const Tensor &input_tensor, const Shape &input_shape, const BCast &bcast) const + { + const int ndims = bcast.y_reshape().size(); + switch (ndims) + { + case 1: + ReshapeAndBCast<1>(device, output_tensor, input_tensor, bcast); + break; + case 2: + ReshapeAndBCast<2>(device, output_tensor, input_tensor, bcast); + break; + case 3: + ReshapeAndBCast<3>(device, output_tensor, input_tensor, bcast); + break; + case 4: + ReshapeAndBCast<4>(device, output_tensor, input_tensor, bcast); + break; + case 5: + ReshapeAndBCast<5>(device, output_tensor, input_tensor, bcast); + break; + default: + // NOTE : UNUSED leaves for maintenance purposes. + UNUSED(output_shape); + UNUSED(input_shape); + break; + } + } +}; +} // functor + +template +inline void BroadcastTo(const Shape &input_shape, T *input_data, const Shape &output_shape, + T *output_data) +{ + const int input_flatsize = input_shape.FlatSize(); + + if (input_shape == output_shape) + { + memcpy(output_data, input_data, input_flatsize * sizeof(T)); + return; + } + + // Input shape's rank must be no greater than rank of output shape. + assert(input_shape.DimensionsCount() <= output_shape.DimensionsCount()); + + // It shouldn't be 0. + assert(output_shape.DimensionsCount()); + + Tensor output_tensor; + Tensor input_tensor; + + input_tensor.shape.ReplaceWith(input_shape.DimensionsCount(), input_shape.DimsData()); + input_tensor.buffer = input_data; + + output_tensor.shape.ReplaceWith(output_shape.DimensionsCount(), output_shape.DimsData()); + output_tensor.buffer = output_data; + + const Eigen::ThreadPoolDevice &device = *eigen_support::GetThreadPoolDevice(); + + // Handle broadcast from Scalar. + if (input_flatsize == 0) + { + functor::FillFunctor()(device, output_tensor.flat(), + input_tensor.scalar()); + } + + BCast bcast(BCast::FromShape(input_shape), BCast::FromShape(output_shape), + /*fewer_dims_optimization=*/true); + + // Predict TRUE. + assert(bcast.IsValid()); + // should be same. + assert(BCast::ToShape(bcast.output_shape()) == output_shape); + + functor::BroadcastTo()(device, output_tensor, output_shape, + input_tensor, input_shape, bcast); +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_BROADCAST_TO_H__ diff --git a/compute/cker/include/cker/operation/Comparison.h b/compute/cker/include/cker/operation/Comparison.h index 4516358..47eb603 100644 --- a/compute/cker/include/cker/operation/Comparison.h +++ b/compute/cker/include/cker/operation/Comparison.h @@ -58,6 +58,34 @@ inline void Comparison(const Shape &input1_shape, const float *input1_data, output_data); } +template F> +inline void ComparisonWithScaling(ComparisonParams ¶ms, const Shape &input1_shape, + const T *input1_data, const Shape &input2_shape, + const T *input2_data, const Shape &output_shape, + bool *output_data) +{ + int left_shift = params.left_shift; + int32_t input1_offset = params.input1_offset; + int32_t input1_multiplier = params.input1_multiplier; + int input1_shift = params.input1_shift; + int32_t input2_offset = params.input2_offset; + int32_t input2_multiplier = params.input2_multiplier; + int input2_shift = params.input2_shift; + const int64_t flatsize = MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int64_t i = 0; i < flatsize; ++i) + { + const int32_t input1_val = input1_offset + input1_data[i]; + const int32_t input2_val = input2_offset + input2_data[i]; + const int32_t shifted_input1_val = input1_val * (1 << left_shift); + const int32_t shifted_input2_val = input2_val * (1 << left_shift); + const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, input1_multiplier, input1_shift); + const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, input2_multiplier, input2_shift); + output_data[i] = F(scaled_input1_val, scaled_input2_val); + } +} + template F> inline void BroadcastComparison4DSlowImpl(const Shape &unextended_input1_shape, const T *input1_data, @@ -100,36 +128,102 @@ inline void BroadcastComparison4DSlow(const Shape &input1_shape, const T *input1 output_shape, output_data); } -#define TFLITE_COMPARISON_OP(name) \ - inline void name(const Shape &input1_shape, const float *input1_data, const Shape &input2_shape, \ - const float *input2_data, const Shape &output_shape, bool *output_data) \ - { \ - Comparison(input1_shape, input1_data, input2_shape, input2_data, output_shape, \ - output_data); \ - } \ - template \ - inline void name##NoScaling(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - ComparisonImpl(input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name##NoScaling(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - BroadcastComparison4DSlowImpl(input1_shape, input1_data, input2_shape, \ - input2_data, output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name(const Shape &input1_shape, const T *input1_data, \ - const Shape &input2_shape, const T *input2_data, \ - const Shape &output_shape, bool *output_data) \ - { \ - BroadcastComparison4DSlow(input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ +template F> +inline void BroadcastComparison4DSlowWithScaling(ComparisonParams ¶ms, + const Shape &input1_shape, const T *input1_data, + const Shape &input2_shape, const T *input2_data, + const Shape &output_shape, bool *output_data) +{ + assert(input1_shape.DimensionsCount() <= 4); + assert(input2_shape.DimensionsCount() <= 4); + assert(output_shape.DimensionsCount() <= 4); + + int left_shift = params.left_shift; + int32_t input1_offset = params.input1_offset; + int32_t input1_multiplier = params.input1_multiplier; + int input1_shift = params.input1_shift; + int32_t input2_offset = params.input2_offset; + int32_t input2_multiplier = params.input2_multiplier; + int input2_shift = params.input2_shift; + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); + + for (int b = 0; b < output_shape.Dims(0); ++b) + { + for (int y = 0; y < output_shape.Dims(1); ++y) + { + for (int x = 0; x < output_shape.Dims(2); ++x) + { + for (int c = 0; c < output_shape.Dims(3); ++c) + { + const int32_t input1_val = + input1_offset + input1_data[SubscriptToIndex(desc1, b, y, x, c)]; + const int32_t input2_val = + input2_offset + input2_data[SubscriptToIndex(desc2, b, y, x, c)]; + const int32_t shifted_input1_val = input1_val * (1 << left_shift); + const int32_t shifted_input2_val = input2_val * (1 << left_shift); + const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, input1_multiplier, input1_shift); + const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, input2_multiplier, input2_shift); + output_data[Offset(output_shape, b, y, x, c)] = F(scaled_input1_val, scaled_input2_val); + } + } + } + } +} + +#define TFLITE_COMPARISON_OP(name) \ + template \ + inline void name(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, \ + const T *input2_data, const Shape &output_shape, bool *output_data) \ + { \ + Comparison(input1_shape, input1_data, input2_shape, input2_data, output_shape, \ + output_data); \ + } \ + template \ + inline void name##NoScaling(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + ComparisonImpl(input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void name##WithScaling(ComparisonParams ¶ms, const Shape &input1_shape, \ + const T *input1_data, const Shape &input2_shape, \ + const T *input2_data, const Shape &output_shape, \ + bool *output_data) \ + { \ + ComparisonWithScaling(params, input1_shape, input1_data, input2_shape, \ + input2_data, output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##NoScaling(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlowImpl(input1_shape, input1_data, input2_shape, \ + input2_data, output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name(const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlow(input1_shape, input1_data, input2_shape, input2_data, \ + output_shape, output_data); \ + } \ + template \ + inline void Broadcast4DSlow##name##WithScaling(ComparisonParams ¶ms, \ + const Shape &input1_shape, const T *input1_data, \ + const Shape &input2_shape, const T *input2_data, \ + const Shape &output_shape, bool *output_data) \ + { \ + BroadcastComparison4DSlowWithScaling( \ + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data); \ } TFLITE_COMPARISON_OP(Equal); diff --git a/compute/cker/include/cker/operation/Conv.h b/compute/cker/include/cker/operation/Conv.h index 191cdb3..1bf191b 100644 --- a/compute/cker/include/cker/operation/Conv.h +++ b/compute/cker/include/cker/operation/Conv.h @@ -63,19 +63,11 @@ public: void prepare(const Shape &filter_shape, const float *filter_data, PaddingType padding_type, bool &is_replaced_weights) { - (void)filter_shape; - (void)filter_data; - (void)padding_type; - (void)is_replaced_weights; if (!_prepared) { - if (padding_type != PaddingType::kNone && std::thread::hardware_concurrency() > 1) + if (usableMultiThreaded(padding_type)) { - const auto output_depth = filter_shape.Dims(0); - const Shape hwcn_filter_shape{filter_shape.FlatSize() / output_depth, output_depth}; - _modified_filter_data.resize(hwcn_filter_shape.FlatSize()); - TransposeFloatTensor(filter_data, hwcn_filter_shape, &_modified_filter_data[0]); - is_replaced_weights = true; + transposeFilter(filter_shape, filter_data, is_replaced_weights); } _prepared = true; } @@ -84,30 +76,26 @@ public: void prepareQuant(const Shape &input_shape, const Shape &kernel_shape, const Shape &output_shape, uint32_t stride_width, uint32_t stride_height) { - _need_im2col = stride_width != 1 || stride_height != 1 || kernel_shape.Dims(1) != 1 || - kernel_shape.Dims(2) != 1; - if (!_prepared && _need_im2col) + if (!_prepared) { - _im2col_shape.SetDim(0, output_shape.Dims(0)); - _im2col_shape.SetDim(1, output_shape.Dims(1)); - _im2col_shape.SetDim(2, output_shape.Dims(2)); - _im2col_shape.SetDim(3, input_shape.Dims(3) * kernel_shape.Dims(1) * kernel_shape.Dims(2)); - _im2col_data.resize(_im2col_shape.FlatSize()); + IsRequiredIm2col(input_shape, kernel_shape, output_shape, stride_width, stride_height); + _prepared = true; } - _prepared = true; } void operator()(const ConvParams ¶ms, const Shape &input_shape, const float *input_data, const Shape &filter_shape, const float *filter_data, const Shape &bias_shape, const float *bias_data, const Shape &output_shape, float *output_data) { - if (params.padding_type != PaddingType::kNone && std::thread::hardware_concurrency() > 1) + if (usableMultiThreaded(params.padding_type)) { + bool transposed_in_execution = false; if (!_prepared) { - bool not_used_condition = false; - prepare(filter_shape, filter_data, params.padding_type, not_used_condition); - _prepared = true; + // This means that filter is not constant + // TODO Apply optimized kernel if multithreaded kernel is slower than optimized kernel by + // transposing filter data + transposeFilter(filter_shape, filter_data, transposed_in_execution); } multithreaded::Conv(params, input_shape, input_data, filter_shape, &_modified_filter_data[0], bias_shape, bias_data, output_shape, output_data); @@ -124,16 +112,46 @@ public: const Shape &filter_shape, const uint8_t *filter_data, const Shape &bias_shape, const int32_t *bias_data, const Shape &output_shape, uint8_t *output_data) { - if (_prepared) + if (!_prepared) { - uint8_t *im2col_raw_data = _im2col_data.data(); - optimized::Conv(params, input_shape, input_data, filter_shape, filter_data, bias_shape, - bias_data, output_shape, output_data, _im2col_shape, im2col_raw_data); + // This means that input or output are dynamic or filter is not constant + IsRequiredIm2col(input_shape, filter_shape, output_shape, params.stride_width, + params.stride_height); } - else + + uint8_t *im2col_raw_data = _im2col_data.data(); + optimized::Conv(params, input_shape, input_data, filter_shape, filter_data, bias_shape, + bias_data, output_shape, output_data, _im2col_shape, im2col_raw_data); + } + +private: + bool usableMultiThreaded(PaddingType padding_type) + { + return padding_type != PaddingType::kNone && std::thread::hardware_concurrency() > 1; + } + + void transposeFilter(const Shape &filter_shape, const float *filter_data, + bool &is_replaced_weights) + { + const auto output_depth = filter_shape.Dims(0); + const Shape hwcn_filter_shape{filter_shape.FlatSize() / output_depth, output_depth}; + _modified_filter_data.resize(hwcn_filter_shape.FlatSize()); + TransposeFloatTensor(filter_data, hwcn_filter_shape, &_modified_filter_data[0]); + is_replaced_weights = true; + } + + void IsRequiredIm2col(const Shape &input_shape, const Shape &kernel_shape, + const Shape &output_shape, uint32_t stride_width, uint32_t stride_height) + { + _need_im2col = stride_width != 1 || stride_height != 1 || kernel_shape.Dims(1) != 1 || + kernel_shape.Dims(2) != 1; + if (_need_im2col) { - reference::Conv(params, input_shape, input_data, filter_shape, filter_data, bias_shape, - bias_data, output_shape, output_data); + _im2col_shape.SetDim(0, output_shape.Dims(0)); + _im2col_shape.SetDim(1, output_shape.Dims(1)); + _im2col_shape.SetDim(2, output_shape.Dims(2)); + _im2col_shape.SetDim(3, input_shape.Dims(3) * kernel_shape.Dims(1) * kernel_shape.Dims(2)); + _im2col_data.resize(_im2col_shape.FlatSize()); } } diff --git a/compute/cker/include/cker/operation/Einsum.h b/compute/cker/include/cker/operation/Einsum.h new file mode 100644 index 0000000..3d1837f --- /dev/null +++ b/compute/cker/include/cker/operation/Einsum.h @@ -0,0 +1,934 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_EINSUM_H__ +#define __NNFW_CKER_EINSUM_H__ + +#include "cker/Types.h" +#include "cker/Shape.h" +#include "cker/Utils.h" + +#include "cker/operation/Helper/Tensor.h" +#include "cker/operation/Helper/MatmulBCast.h" + +#include "Transpose.h" +#include "BatchMatMul.h" + +#include +#include +#include +#include +#include + +namespace nnfw +{ +namespace cker +{ + +namespace functor +{ + +template struct StrideFunctor +{ + void operator()(const Device &d, typename TTypes::ConstTensor input, + const std::vector &strides, typename TTypes::Tensor output) + { + + Eigen::DSizes dsizes; + for (size_t d = 0; d < strides.size(); d++) + { + dsizes[d] = static_cast(strides[d]); + } + for (size_t d = strides.size(); d < N; d++) + { + dsizes[d] = 1; + } + + output.device(d) = input.stride(dsizes); + } +}; + +template struct InflateFunctor +{ + void operator()(const Device &d, typename TTypes::ConstTensor input, + const std::vector &strides, typename TTypes::Tensor output) + { + + Eigen::DSizes dsizes; + for (size_t d = 0; d < strides.size(); d++) + { + dsizes[d] = static_cast(strides[d]); + } + for (size_t d = strides.size(); d < N; d++) + { + dsizes[d] = 1; + } + + output.device(d) = input.inflate(dsizes); + } +}; + +template struct ReduceFunctor +{ + template + static void Reduce(const Device &d, OUT_T out, IN_T in, const ReductionAxes &reduction_axes, + const Reducer &reducer) + { + out.device(d) = in.reduce(reduction_axes, reducer); + } +}; + +template struct SetZeroFunctor +{ + // Computes on device "d": out = out.setZero(), + void operator()(const Device &d, typename TTypes::Flat out) + { + out.device(d) = out.constant(T(0)); + } +}; + +} // namespace functor + +using ShapeVec = std::vector; +using Labels = std::vector; +using OperandLabels = std::vector; +using LabelCounts = std::vector; +using OperandLabelCounts = std::vector; +using LabelToDimSizes = std::vector; + +// Each dimension is categorized into exactly one of five types based on +// whether its corresponding label is present in the input and/or the output +// subscripts. +enum DimensionType +{ + // Batch dimensions are those present in two inputs as well as the output. + // They are part of the batch dimensions during Tensor contraction. + // Such dimensions may be broadcasting dimensions (those mapping to + // ellipsis) + // or explicit batch dimensions corresponding to named axis labels. + kBroadcasting = 0, + kBatch = 1, + // Free dimensions are present in exactly one of the inputs, and also the + // output. These are non-contracted axes in the Tensor contraction. + kFree = 2, + // Contract dimensions are present in two inputs, but not the output. These + // dimensions are contracted in Tensor contraction. + kContract = 3, + // Reduce dimensions are present in exactly one input; and not in the output + // and are summed over prior to Tensor contraction. + kReduce = 4, +}; + +namespace +{ + +constexpr int kEllipsisLabel = -1; + +std::vector strSplit(const std::string &text, const std::string delimiter) +{ + std::vector result; + + size_t start = 0; + size_t pos = 0; + + do + { + pos = text.find(delimiter, start); + if (pos == std::string::npos) + { + result.push_back(text.substr(start, text.size() - start)); + break; + } + + result.push_back(text.substr(start, pos - start)); + start = pos + delimiter.size(); + } while (pos != std::string::npos); + + return result; +} + +inline DimensionType getDimensionType(bool is_removed, bool is_unique) +{ + if (!is_removed && !is_unique) + return kBatch; + else if (!is_removed && is_unique) + return kFree; + else if (is_removed && !is_unique) + return kContract; + else // is_removed && is_unique + return kReduce; +} + +inline Shape copyShape(const Shape &shape) +{ + return Shape::ExtendedShape(shape.DimensionsCount(), shape); +} +} + +class Einsum +{ +public: + Einsum() : _prepared(false) + { + // DO NOTHING + } + + void prepare(std::string &equation) + { + if (_prepared) + { + return; + } + + // Parse equation + parseEquation(equation); + _prepared = true; + } + + void operator()(std::string &equation, const std::vector &input_shapes, + const std::vector &input_data, const Shape &output_shape, + float *output_data) + { + if (!_prepared) + { + prepare(equation); + } + + const int num_inputs = input_shapes.size(); + std::vector> inputs(num_inputs); + for (int i = 0; i < num_inputs; i++) + { + inputs[i].shape.ReplaceWith(input_shapes[i].DimensionsCount(), input_shapes[i].DimsData()); + inputs[i].buffer = input_data[i]; + } + + OperandLabels input_labels(_input_labels); + Labels output_labels(_output_labels); + std::vector label_types(_label_types); + OperandLabelCounts input_label_counts(_input_label_counts); + LabelCounts output_label_counts(_output_label_counts); + LabelToDimSizes label_to_dim_sizes; + + processDimensions(inputs, &input_labels, &output_labels, &label_types, &input_label_counts, + &output_label_counts, &label_to_dim_sizes); + + // The reduction phase (a) sums across reduction dimensions, (b) takes + // generalized diagonals, and (c) reshapes it into shape + // [(broadcasting) batch shape] + [F,C] + // where F and C denote the total (compacted) size of free and contract + // dimensions, respectively. + + OperandLabels free_labels(num_inputs); + std::vector inputs_reduced(num_inputs); + std::vector swap_free_and_contract(num_inputs); + for (int i = 0; i < num_inputs; ++i) + { + bool temp_swap_free_and_contract = false; + reduceOperand(inputs[i], label_types, input_label_counts[i], &input_labels[i], + &free_labels[i], &temp_swap_free_and_contract, &inputs_reduced[i]); + swap_free_and_contract[i] = temp_swap_free_and_contract; + } + + // After reduction, the inputs should be reshaped to Tensors suitable for + // contraction. If num_inputs is 1, the reduced input is simply forwarded to + // the output. + Tensor contraction_output_reshaped; + contractOperands(inputs_reduced, swap_free_and_contract, &contraction_output_reshaped); + + // Copy the batch labels from the contraction output. Recover the batch + // shape, which may have been broadcasted. + std::vector result_shape_dims(contraction_output_reshaped.shape.DimensionsCount() - 2); + + for (size_t i = 0; i < result_shape_dims.size(); i++) + { + result_shape_dims[i] = contraction_output_reshaped.shape.Dims(i); + } + + int num_labels = label_types.size(); + Labels result_labels; + // All batch dimensions should be present in the contracted result. First + // the broadcasting dimensions, then the named batch dimensions. + for (int label = 0; label < num_labels; ++label) + { + if (label_types[label] == kBroadcasting) + result_labels.push_back(label); + } + for (int label = 0; label < num_labels; ++label) + { + if (label_types[label] == kBatch) + result_labels.push_back(label); + } + for (int i = 0; i < num_inputs; ++i) + { + for (int label : free_labels[i]) + { + result_labels.push_back(label); + result_shape_dims.push_back(label_to_dim_sizes[label]); + } + } + + Shape result_shape(result_shape_dims.size(), result_shape_dims.data()); + + // Reshape the contraction (or reduction) result to its expanded shape: + // [(broadcasted) batch shape] + [free shape 0] + [free shape 1]. + Tensor contraction_output; + copyFrom(contraction_output_reshaped, result_shape, &contraction_output); + + // Inflate the output if necessary. (E.g. for the equation 'i->iii' which + // may arise while computing gradient of a regular Einsum). + // TODO(anudhyan): It's possible that Eigen's contract and inflate can be + // chained here to avoid materializing an intermediate. + Tensor output_inflated; + strideOrInflate(contraction_output, result_labels, output_label_counts, + true /* should_inflate */, &output_inflated); + + if (output_inflated.shape.DimensionsCount() > contraction_output.shape.DimensionsCount()) + { + // We inflated the output. Modify result labels accordingly. + Labels inflated_labels; + for (int label : result_labels) + { + inflated_labels.insert(inflated_labels.end(), output_label_counts[label], label); + } + result_labels.swap(inflated_labels); + } + + // Find the permutation to map the result labels to the output labels. Note + // that both the result and the final output may have the repeated labels, + // in which case the permutation preserves the left-to-right ordering. + // E.g. if result labels are [0, 0, 1] and output is [0, l, 0] then the + // permutation should be [0, 2, 1]. We also use the fact that repeated + // labels in the result are adjacent to each other. + std::vector output_permutation(output_labels.size()); + std::vector label_to_position(num_labels, -1); + for (size_t i = 0; i < result_labels.size(); ++i) + { + // Remember the position of only the leftmost result label. + if (label_to_position[result_labels[i]] == -1) + { + label_to_position[result_labels[i]] = i; + } + } + for (size_t i = 0; i < output_labels.size(); ++i) + { + output_permutation[i] = label_to_position[output_labels[i]]; + // We have found the leftmost occurrence. The next one would be adjacent. + label_to_position[output_labels[i]] += 1; + } + + InputTensor temp_inflated; + temp_inflated.shape.ReplaceWith(output_inflated.shape.DimensionsCount(), + output_inflated.shape.DimsData()); + temp_inflated.buffer = (reinterpret_cast(output_inflated.buffer)); + ; + + Tensor output; + transposeOperand(temp_inflated, output_permutation, &output); + + memcpy(output_data, output.buffer, output_shape.FlatSize() * sizeof(float)); + + temp_operand.clear(); + } + +private: + void parseEquation(std::string &equation) + { + std::vector input_str; + std::string output_str; + + parseEinsumEquation(equation, input_str, output_str); + + // Temporary map from single character labels to (consecutive) integer + // labels. + std::map label_mapping; + int num_inputs = input_str.size(); + _input_labels.resize(num_inputs); + + // Map from single characters to integer labels. + for (int i = 0; i < num_inputs; ++i) + { + mapToLabels(input_str[i], _input_labels.at(i), label_mapping); + } + mapToLabels(output_str, _output_labels, label_mapping); + + // Compute counts for input and output labels. + int num_labels = label_mapping.size(); + _input_label_counts.resize(num_inputs); + _input_has_ellipsis.resize(num_inputs); + for (int i = 0; i < num_inputs; ++i) + { + _input_label_counts.at(i).resize(num_labels); + for (const int label : _input_labels.at(i)) + { + if (label != kEllipsisLabel) + _input_label_counts.at(i)[label] += 1; + else + _input_has_ellipsis.at(i) = true; + } + } + _output_label_counts.resize(num_labels); + for (const int label : _output_labels) + { + if (label != kEllipsisLabel) + _output_label_counts.at(label) += 1; + else + _output_has_ellipsis = true; + } + + // Map each label to a unique DimensionType. + _label_types.resize(num_labels); + for (int label = 0; label < num_labels; ++label) + { + bool removed = (_output_label_counts[label] == 0); + bool unique = num_inputs == 1 || _input_label_counts[0][label] == 0 || + _input_label_counts[1][label] == 0; + _label_types[label] = getDimensionType(removed, unique); + } + } + + void parseEinsumEquation(const std::string &equation, std::vector &input_subscripts, + std::string &output_subscript) + { + std::vector inputs_and_output_subscripts = strSplit(equation, "->"); + if (inputs_and_output_subscripts.size() != 2) + { + throw std::runtime_error{"Einsum: Expecting exactly one '->' in einsum equation: " + + equation}; + } + + output_subscript = inputs_and_output_subscripts[1]; + input_subscripts = strSplit(inputs_and_output_subscripts[0], ","); + if (input_subscripts.size() != 1 && input_subscripts.size() != 2) + { + throw std::runtime_error{"Einsum: Expecting 1 or 2 input subscripts in equation '" + + equation + "' but got: " + std::to_string(input_subscripts.size())}; + } + } + + // Maps the character labels to consecutive integers. + void mapToLabels(const std::string &subscript, Labels &labels, std::map &label_mapping) + { + for (size_t i = 0; i < subscript.size(); ++i) + { + const char label_char = subscript[i]; + if (label_char == '.') + { + labels.push_back(kEllipsisLabel); + i += 2; // Skip next 2 characters as well. + continue; + } + if (label_mapping.find(label_char) == label_mapping.end()) + { + const int next_label = label_mapping.size(); + label_mapping[label_char] = next_label; + } + const int mapped_label = label_mapping[label_char]; + labels.push_back(mapped_label); + } + } + + template + void processDimensions(const std::vector> &inputs, OperandLabels *input_labels, + Labels *output_labels, std::vector *label_types, + OperandLabelCounts *input_label_counts, LabelCounts *output_label_counts, + LabelToDimSizes *label_to_dim_sizes) + { + if (inputs.size() != input_labels->size()) + { + throw std::runtime_error{"Expected " + std::to_string(input_labels->size()) + + " inputs but got: " + std::to_string(inputs.size())}; + } + const int num_inputs = inputs.size(); + + // We infer the number of broadcasting dimensions by taking the maximum rank + // among the broadcasting subshapes of the input. + int max_bcast_dims = 0; + const int num_named_labels = label_types->size(); + label_to_dim_sizes->resize(num_named_labels); + for (int i = 0; i < num_inputs; ++i) + { + Labels *labels = &(*input_labels)[i]; + + if (!_input_has_ellipsis[i]) + { + if (inputs[i].shape.DimensionsCount() != ((int32_t)labels->size())) + { + throw std::runtime_error{"Expected input " + std::to_string(i) + " to have rank " + + std::to_string(labels->size()) + " but got: " + + std::to_string(inputs[i].shape.DimensionsCount())}; + } + for (size_t label_idx = 0; label_idx < labels->size(); ++label_idx) + { + const int label = (*labels)[label_idx]; + recordLabelToDimension(label, label_idx, inputs[i].shape, label_to_dim_sizes); + } + continue; + } + + // Input has an ellipsis. + if (inputs[i].shape.DimensionsCount() + 1 < (int32_t)labels->size()) + { + throw std::runtime_error{"Expected input " + std::to_string(i) + " to have rank at least " + + std::to_string(labels->size() - 1) + " but got: " + + std::to_string(inputs[i].shape.DimensionsCount())}; + } + int ellipsis_axis = -1; + const int num_bcast_dims = inputs[i].shape.DimensionsCount() - labels->size() + 1; + for (size_t label_idx = 0; label_idx < labels->size(); ++label_idx) + { + const int label = (*labels)[label_idx]; + if (label == kEllipsisLabel) + { + ellipsis_axis = label_idx; + continue; + } + // Current label is not an ellipsis. + const int axis = label_idx + (ellipsis_axis == -1 ? 0 : num_bcast_dims - 1); + recordLabelToDimension(label, axis, inputs[i].shape, label_to_dim_sizes); + } + // Found an ellipsis. Replace 'kEllipsisLabel' with broadcasting + // dimensions. + if (ellipsis_axis != -1) + { + insertBroadcastLabels(num_bcast_dims, num_named_labels, ellipsis_axis, labels, + &input_label_counts->at(i)); + max_bcast_dims = std::max(max_bcast_dims, num_bcast_dims); + } + } + + std::vector::iterator it_input = + std::find(_input_has_ellipsis.begin(), _input_has_ellipsis.end(), true); + if (it_input == _input_has_ellipsis.end() && !_output_has_ellipsis) + { + return; + } + // Insert broadcasting dimensions in the output labels. + auto it = std::find(output_labels->begin(), output_labels->end(), kEllipsisLabel); + if (it != output_labels->end()) + { + const int ellipsis_axis = it - output_labels->begin(); + insertBroadcastLabels(max_bcast_dims, num_named_labels, ellipsis_axis, output_labels, + output_label_counts); + } + else if (max_bcast_dims > 0) + { + std::runtime_error{"Output contains " + std::to_string(max_bcast_dims) + + " broadcasting dimension(s) but no ellipsis " + + "(...) was found in the output subscripts."}; + } + // Populate DimensionType for the new broadcasting labels. + label_types->resize(num_named_labels + max_bcast_dims, kBroadcasting); + } + + void recordLabelToDimension(const int32_t label, const int axis, const Shape &input_shape, + LabelToDimSizes *label_to_dim_sizes) + { + const int32_t input_dim = input_shape.Dims(axis); + // We know that label_to_dim_sizes has the size to accommodate named labels. + if (label_to_dim_sizes->at(label) != 0 && label_to_dim_sizes->at(label) != input_dim) + { + std::runtime_error{"Expected dimension " + std::to_string(label_to_dim_sizes->at(label)) + + " at axis " + std::to_string(axis) + + " of the input shaped but got dimension " + std::to_string(input_dim)}; + } + (*label_to_dim_sizes)[label] = input_dim; + } + + void insertBroadcastLabels(int num_bcast_dims, int num_named_labels, int ellipsis_axis, + Labels *labels, LabelCounts *label_counts) + { + labels->erase(labels->begin() + ellipsis_axis); + labels->insert(labels->begin() + ellipsis_axis, num_bcast_dims, 0); + std::iota(labels->begin() + ellipsis_axis, labels->begin() + ellipsis_axis + num_bcast_dims, + num_named_labels); + // Increment label counts. Since these are new labels, the count is set + // to 1. + label_counts->resize(num_named_labels + num_bcast_dims, 1); + } + + template + void reduceOperand(const InputTensor &input, const std::vector &label_types, + const LabelCounts &label_counts, Labels *labels, Labels *free_labels, + bool *swap_free_and_contract, Tensor *output) + { + // Find the permutation to transpose the input dimensions in the order of + // DimensionType; i.e. batch, free, contract and reduce dimensions. This + // makes it more convenient to invoke Reduce/Contract operations. + std::vector permutation(input.shape.DimensionsCount()); + std::iota(permutation.begin(), permutation.end(), 0); + Tensor input_transposed; + + // Check if we can avoid the transpose. We need to flip the adj_x (or adj_y) + // flag during BatchMatMul. This is an extra optimization not necessary for + // correctness. + if (shouldSwapFreeAndContract(*labels, label_types)) + { + *swap_free_and_contract = true; + } + else + { + std::sort(permutation.begin(), permutation.end(), [&](int i, int j) { + int label_i = (*labels)[i]; + int label_j = (*labels)[j]; + return std::tie(label_types[label_i], label_i) < std::tie(label_types[label_j], label_j); + }); + } + // Transpose the input so that DimensionTypes are in order. + transposeOperand(input, permutation, &input_transposed); + + permuteLabels(permutation, labels); + + // Take the generalized diagonal for dimensions with repeated axis labels. + Tensor input_deduped; + labels->erase(std::unique(labels->begin(), labels->end()), labels->end()); + strideOrInflate(input_transposed, *labels, label_counts, false /* should_inflate */, + &input_deduped); + + // Reshape denotes the rank-5 shape [broadcast, batch, free, contract, + // reduce] where we've compacted the dimensions of each DimensionType. + std::vector reshape(5, 1); + + // The output shape is [batch shape] + [free size, contract size] + // That is, the batch shape is preserved (for broadcasting while + // contracting) while the free dims and contract dims are compressed to one + // dimension each. + Shape output_shape; + std::vector output_shape_dims; + for (size_t label_idx = 0; label_idx < labels->size(); ++label_idx) + { + const int label = labels->at(label_idx); + int32_t dim = input_deduped.shape.Dims(label_idx); + if (label_types[label] == kBroadcasting || label_types[label] == kBatch) + { + output_shape_dims.push_back(dim); + } + else if (label_types[label] == kFree) + { + free_labels->push_back(label); + } + reshape[label_types[label]] *= dim; + } + + if (*swap_free_and_contract) + std::swap(reshape[kFree], reshape[kContract]); + + output_shape_dims.push_back(reshape[kFree]); + output_shape_dims.push_back(reshape[kContract]); + + output_shape.ReplaceWith(output_shape_dims.size(), output_shape_dims.data()); + + if (reshape[kReduce] == 1) + { // No need to actually reduce. + return copyFrom(input_deduped, output_shape, output); + } + + allocateTemp(output_shape, output); + + using Reducer = Eigen::internal::SumReducer; + using Index = typename TTypes::Tensor::Index; + + const Eigen::ThreadPoolDevice &device = *eigen_support::GetThreadPoolDevice(); + + // Reduce along the last axis (i.e axis 1) of the rank-2 Tensor. + const int32_t output_size = + reshape[kBroadcasting] * reshape[kBatch] * reshape[kFree] * reshape[kContract]; + functor::ReduceFunctor::Reduce( + device, output->shaped({output_size}), + input_deduped.shaped({output_size, reshape[kReduce]}), Eigen::array({1}), + Reducer()); + } + + bool shouldSwapFreeAndContract(const Labels &labels, + const std::vector &label_types) + { + // Check that ordering is according to dimension type, with the role of + // free and contract dimensions swapped. + std::vector remap = {0, 1, 3, 2, 4}; + for (size_t i = 0; i + 1 < labels.size(); ++i) + { + const int dimtype_a = remap[label_types[labels[i]]]; + const int dimtype_b = remap[label_types[labels[i + 1]]]; + if (dimtype_a > dimtype_b || (dimtype_a == dimtype_b && labels[i] > labels[i + 1])) + { + return false; + } + } + return true; + } + + template + void transposeOperand(const InputTensor &input, const std::vector &permutation, + Tensor *output) + { + if (!shouldTranspose(input.shape, permutation)) + { + copyFrom(input, input.shape, output); + return; + } + Shape transposed_shape(input.shape.DimensionsCount()); + for (int i = 0; i < input.shape.DimensionsCount(); ++i) + { + transposed_shape.SetDim(i, input.shape.Dims(permutation[i])); + } + // For empty Tensors, just change the shape. E.g. we may need to transpose + // from shape [1, 0, 5] to [5, 1, 0]. + if (input.shape.FlatSize() == 0) + { + copyFrom(input, transposed_shape, output); + return; + } + + temp_operand.emplace_back(std::make_unique(transposed_shape.FlatSize())); + T *new_buffer = temp_operand.back().get(); + + TransposeParams transpose_params; + transpose_params.perm_count = permutation.size(); + for (size_t i = 0; i < permutation.size(); i++) + { + transpose_params.perm[i] = permutation[i]; + } + + Transpose(transpose_params, input.shape, input.buffer, transposed_shape, new_buffer); + + output->shape.ReplaceWith(transposed_shape.DimensionsCount(), transposed_shape.DimsData()); + output->buffer = new_buffer; + } + + bool shouldTranspose(const Shape &input_shape, const std::vector &permutation) + { + if (input_shape.DimensionsCount() < 2) + return false; + for (size_t i = 0; i < permutation.size(); ++i) + { + if (permutation[i] != (int32_t)i) + return true; + } + return false; + } + + template + void copyFrom(const InputTensor &input, const Shape &shape, Tensor *output) + { + Tensor temp_tensor; + temp_tensor.shape.ReplaceWith(input.shape.DimensionsCount(), input.shape.DimsData()); + temp_operand.emplace_back(std::make_unique(input.shape.FlatSize())); + temp_tensor.buffer = temp_operand.back().get(); + memcpy(temp_tensor.buffer, input.buffer, input.shape.FlatSize() * sizeof(float)); + + copyFrom(temp_tensor, shape, output); + } + + void copyFrom(const Tensor &input, const Shape &shape, Tensor *output) + { + if (output->copyFrom(input, shape)) + return; + + throw std::runtime_error{"Einsum: Encountered error while reshaping a Tensor"}; + } + + // Permutes the labels according to the given permutation. + void permuteLabels(const std::vector &permutation, Labels *labels) + { + Labels permuted_labels(labels->size()); + for (size_t i = 0; i < labels->size(); ++i) + { + permuted_labels[i] = (*labels)[permutation[i]]; + } + labels->swap(permuted_labels); + } + + // If there are repeated labels in either the input or output, then this + // strides the input (e.g. iii->i) or inflates it (e.g. i->iii), respectively. + template + void strideOrInflate(const Tensor &input, const Labels &labels, const LabelCounts &label_counts, + const bool should_inflate, Tensor *output) + { + // Return early if there are no repeated indices. + if (std::all_of(label_counts.begin(), label_counts.end(), [](int c) { return c <= 1; })) + { + return copyFrom(input, input.shape, output); + } + // We reshape so that each repeated label is compressed to one dimension. + // E.g. For iiij -> ij, The shape [3, 3, 3, 5] would be compressed to [27, + // 5]. Striding appropriately (in this case with strides 14 (=1+3+9) and 1) + // recovers the generalized diagonal of shape [3, 5]. + std::vector reshape; + std::vector strides; + // Strided and inflated shapes correspond to input and output shapes, + // respectively, should_inflate is true (vice-versa if should_inflate is + // false). E.g. they are [3, 5] and [3, 3, 3, 5] in the above example. + Shape strided_shape; + Shape inflated_shape; + std::vector strided_shape_dims; + std::vector inflated_shape_dims; + for (int label : labels) + { + const int32_t count = label_counts[label]; + const int current_axis = + should_inflate ? strided_shape_dims.size() : inflated_shape_dims.size(); + const int32_t dim = input.shape.Dims(current_axis); + strided_shape_dims.push_back(dim); + inflated_shape_dims.insert(inflated_shape_dims.end(), count, dim); + const int32_t reshape_dim = std::pow(dim, count); + reshape.push_back(reshape_dim); + // While taking the d-diagonal in a rank k Tensor, we take d + // equally-spaced elements including the first and last element. Then, (k + // - 1) * stride = d^k - 1, or, stride = (d^k - 1)/(d - 1). + const int32_t stride = (dim > 1 && count > 1) ? (reshape_dim - 1) / (dim - 1) : 1; + strides.push_back(stride); + } + + strided_shape.ReplaceWith(strided_shape_dims.size(), strided_shape_dims.data()); + inflated_shape.ReplaceWith(inflated_shape_dims.size(), inflated_shape_dims.data()); + + Shape output_shape = Shape(should_inflate ? inflated_shape : strided_shape); + + output->shape.ReplaceWith(output_shape.DimensionsCount(), output_shape.DimsData()); + temp_operand.emplace_back(std::make_unique(output_shape.FlatSize())); + output->buffer = temp_operand.back().get(); + + const Eigen::ThreadPoolDevice &device = *eigen_support::GetThreadPoolDevice(); + + switch (reshape.size()) + { +#define NDIMS_CASE(N) \ + case N: \ + { \ + if (should_inflate) \ + { \ + auto output_map = output->shaped(reshape); \ + auto input_map = input.shaped(strided_shape_dims); \ + functor::InflateFunctor()(device, input_map, strides, \ + output_map); \ + } \ + else \ + { \ + auto input_map = input.shaped(reshape); \ + auto output_map = output->shaped(strided_shape_dims); \ + functor::StrideFunctor()(device, input_map, strides, \ + output_map); \ + } \ + } \ + break; + NDIMS_CASE(1); + NDIMS_CASE(2); + NDIMS_CASE(3); + NDIMS_CASE(4); + NDIMS_CASE(5); + NDIMS_CASE(6); + default: + throw std::runtime_error{"Unsupported rank: " + std::to_string(reshape.size()) + + " while handling repeated indices. Up to rank 6 is supported."}; +#undef NDIMS_CASE + } + } + + void allocateTemp(const Shape &shape, Tensor *output) + { + output->shape.ReplaceWith(shape.DimensionsCount(), shape.DimsData()); + temp_operand.emplace_back(std::make_unique(shape.FlatSize())); + output->buffer = temp_operand.back().get(); + } + + // Contracts the inputs along the last axis. (or the second last if the + // corresponding value of swap_free_and_contract is true). The batch + // dimensions are broadcast to the output shape. + // TODO(anudhyan): Factor this function into a BatchMatMul functor and support + // transpose_x and transpose_y attributes (in addition to adj_x and adj_y). + // Also, the BatchMatMul might devolve into a component-wise multiplication + // when the matrix shape is [1,1]; in this case BatchMatMul functor would be + // very inefficient. The functor should detect if this is the case and perform + // componentwise multiplication functor instead. + void contractOperands(std::vector &inputs, std::vector &swap_free_and_contract, + Tensor *output) + { + if (inputs.size() == 1) + return copyFrom(inputs[0], inputs[0].shape, output); + + MatMulBCast bcast(inputs[0].shape, inputs[1].shape); + if (!bcast.IsValid()) + { + throw std::runtime_error{"Einsum: Invalid broadcasting dimensions"}; + } + + Tensor lhs; + reshapeToRank3(inputs[0], bcast.x_batch_size(), &lhs); + Tensor rhs; + reshapeToRank3(inputs[1], bcast.y_batch_size(), &rhs); + Shape old_output_shape = bcast.output_batch_shape(); + Shape output_shape(old_output_shape.DimensionsCount() + inputs.size()); + for (int i = 0; i < old_output_shape.DimensionsCount(); i++) + { + output_shape.SetDim(i, old_output_shape.Dims(i)); + } + + for (size_t i = 0; i < inputs.size(); ++i) + { + const int32_t free_axis = + inputs[i].shape.DimensionsCount() - (swap_free_and_contract[i] ? 1 : 2); + output_shape.SetDim(i + old_output_shape.DimensionsCount(), inputs[i].shape.Dims(free_axis)); + } + bool adj_x = swap_free_and_contract[0]; + bool adj_y = !swap_free_and_contract[1]; + + allocateTemp(output_shape, output); + + const Eigen::ThreadPoolDevice &device = *eigen_support::GetThreadPoolDevice(); + + if (lhs.shape.FlatSize() == 0 || rhs.shape.FlatSize() == 0) + { + functor::SetZeroFunctor set_zero; + set_zero(device, + typename TTypes::Tensor(output->base(), output->shape.FlatSize())); + return; + } + + Tensor output_reshaped; + reshapeToRank3(*output, bcast.output_batch_size(), &output_reshaped); + + // LaunchBatchMatMul::Launch(lhs, rhs, adj_x, adj_y, bcast, &output_reshaped); + BatchMatMul batchMatMul; + batchMatMul.prepare(lhs.shape, rhs.shape, adj_x, adj_y); + batchMatMul(lhs.shape, lhs.base(), rhs.shape, rhs.base(), adj_x, adj_y, + output_reshaped.shape, output_reshaped.base()); + } + + void reshapeToRank3(const Tensor &input, int batch_size, Tensor *output) + { + const int rank = input.shape.DimensionsCount(); + Shape output_shape({batch_size, input.shape.Dims(rank - 2), input.shape.Dims(rank - 1)}); + copyFrom(input, output_shape, output); + } + +private: + bool _prepared; + + OperandLabels _input_labels; + Labels _output_labels; + std::vector _label_types; + OperandLabelCounts _input_label_counts; + LabelCounts _output_label_counts; + std::vector _input_has_ellipsis; + bool _output_has_ellipsis = false; + + std::vector> temp_operand; +}; + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_EINSUM_H__ diff --git a/compute/cker/include/cker/operation/Elementwise.h b/compute/cker/include/cker/operation/Elementwise.h index 83581e8..598a032 100644 --- a/compute/cker/include/cker/operation/Elementwise.h +++ b/compute/cker/include/cker/operation/Elementwise.h @@ -38,6 +38,16 @@ inline void Sin(const Shape &input_shape, const float *input_data, const Shape & } } +inline void Cos(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < size; i++) + { + output_data[i] = std::cos(input_data[i]); + } +} + inline void Abs(const Shape &input_shape, const float *input_data, const Shape &output_shape, float *output_data) { @@ -56,6 +66,26 @@ inline void Rsqrt(const Shape &input_shape, const float *input_data, const Shape } } +inline void Neg(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < size; i++) + { + output_data[i] = -input_data[i]; + } +} + +inline void Log(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < size; i++) + { + output_data[i] = std::log(input_data[i]); + } +} + } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/Fill.h b/compute/cker/include/cker/operation/Fill.h new file mode 100644 index 0000000..14daf98 --- /dev/null +++ b/compute/cker/include/cker/operation/Fill.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_FILL_H__ +#define __NNFW_CKER_FILL_H__ + +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ +template +inline void Fill(const Shape &input_shape, int *input_data, const T value_data, + const Shape &output_shape, T output_data) +{ + int input_size = input_shape.FlatSize(); + int output_size = 1; + for (int i = 0; i < input_size; i++) + { + output_size *= input_data[i]; + } + + if (output_size == output_shape.FlatSize()) + { + for (int i = 0; i < output_size; i++) + { + output_data[i] = *value_data; + } + } + else + { + throw std::runtime_error("Cker Fill.h: output's size is not matched inferred size of output"); + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_FILL_H__ diff --git a/compute/cker/include/cker/operation/FullyConnected.h b/compute/cker/include/cker/operation/FullyConnected.h index 01b925e..9bcf3fd 100644 --- a/compute/cker/include/cker/operation/FullyConnected.h +++ b/compute/cker/include/cker/operation/FullyConnected.h @@ -31,7 +31,7 @@ namespace cker class FCTempArena { public: - FCTempArena(void) : prepared(false), input_quantized(), scaling_factors() + FCTempArena(void) : prepared(false), input_quantized(), scaling_factors(), accum_scratch() { // DO NOTHING } @@ -51,6 +51,7 @@ public: bool prepared; std::vector input_quantized; std::vector scaling_factors; + std::vector accum_scratch; }; inline void FullyConnected(const FullyConnectedParams ¶ms, const Shape &input_shape, @@ -138,7 +139,8 @@ inline void FullyConnected(const FullyConnectedParams ¶ms, const Shape &inpu inline void FullyConnectedHybrid(const FullyConnectedParams ¶ms, const Shape &input_shape, const float *input_data, const Shape &filter_shape, const int8_t *filter_data, const Shape &, const float *bias_data, - const Shape &, float *output_data, FCTempArena &temp_arena) + const Shape &output_shape, float *output_data, + FCTempArena &temp_arena) { int total_input_size = input_shape.FlatSize(); const int input_size = filter_shape.Dims(1); @@ -146,7 +148,14 @@ inline void FullyConnectedHybrid(const FullyConnectedParams ¶ms, const Shape const int num_units = filter_shape.Dims(0); // Output = bias if bias tensor exists. - VectorBatchVectorAssign(bias_data, num_units, batch_size, output_data); + if (bias_data) + { + VectorBatchVectorAssign(bias_data, num_units, batch_size, output_data); + } + else + { + ZeroVector(output_data, batch_size * num_units); + } // Save matrix multiplication computation for all zero input. if (IsZeroVector(input_data, total_input_size)) @@ -170,10 +179,20 @@ inline void FullyConnectedHybrid(const FullyConnectedParams ¶ms, const Shape scaling_factors_ptr[b] *= params.weights_scale; } - // Compute output += weight * quantized_input +// Compute output += weight * quantized_input +#ifdef USE_RUY_GEMV + auto output_size = output_shape.FlatSize(); + temp_arena.accum_scratch.resize(output_size); + int32_t *scratch = temp_arena.accum_scratch.data(); + MatrixBatchVectorMultiplyAccumulate(filter_data, num_units, input_size, quant_data, + scaling_factors_ptr, batch_size, scratch, output_data, + /*result_stride=*/1); +#else MatrixBatchVectorMultiplyAccumulate(filter_data, num_units, input_size, quant_data, scaling_factors_ptr, batch_size, output_data, /*result_stride=*/1); + UNUSED_RELEASE(output_shape); +#endif // Apply activation function to floats. ApplyActivationToVector(output_data, batch_size * num_units, params.activation, output_data); diff --git a/compute/cker/include/cker/operation/FusedBatchNorm.h b/compute/cker/include/cker/operation/FusedBatchNorm.h new file mode 100644 index 0000000..d17a579 --- /dev/null +++ b/compute/cker/include/cker/operation/FusedBatchNorm.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_FUSEDBATCHNORM_H__ +#define __NNFW_CKER_FUSEDBATCHNORM_H__ + +#include "cker/Types.h" +#include "cker/Shape.h" +#include "cker/Utils.h" + +#include "cker/operation/Helper/Tensor.h" +#include "cker/operation/Helper/MatmulBCast.h" + +#include "Transpose.h" +#include "BatchMatMul.h" + +#include +#include +#include +#include +#include + +namespace nnfw +{ +namespace cker +{ + +class FusedBatchNorm +{ +public: + FusedBatchNorm() : _prepared(false) + { + // DO NOTHING + } + + void prepare() { _prepared = true; } + + void operator()(const std::vector &input_shapes, + const std::vector &input_data, const Shape &output_shape, + float *output_data, FusedBatchNormParams param) + { + // TODO: support fused_batch_norm if is_traninig is false + assert(param.is_training == true); + + // TODO: support case where dim[1] != 1 or dim[3] !=1. + // Here we only support input tensor of [B, 1, X, 1] shape + assert(input_shapes[0].Dims(1) == 1 && input_shapes[0].Dims(3) == 1); + + if (!_prepared) + + { + prepare(); + } + + Tensor transformed_input[5]; + Tensor transformed_output; + + const int num_inputs = input_shapes.size(); + std::vector> inputs(num_inputs); + for (int i = 0; i < num_inputs; i++) + { + inputs[i].shape.ReplaceWith(input_shapes[i].DimensionsCount(), input_shapes[i].DimsData()); + inputs[i].buffer = input_data[i]; + copyFrom(inputs[i], inputs[i].shape, &transformed_input[i]); + } + + InputTensor output; + output.shape.ReplaceWith(output_shape.DimensionsCount(), output_shape.DimsData()); + output.buffer = output_data; + copyFrom(output, output.shape, &transformed_output); + + // TODO: support transpose if data_format is NCHW + // Here, Eigen use RowMajor kernel(NHWC) + + typename TTypes::Tensor x(transformed_input[0].shaped()); + typename TTypes::Tensor y(transformed_output.shaped()); + typename TTypes::Tensor scale(transformed_input[1].shaped()); + typename TTypes::Tensor offset(transformed_input[2].shaped()); + + const int depth = x.dimension(3); + const int size = x.size(); + const int rest_size = size / depth; + Eigen::DSizes rest_by_depth(rest_size, depth); + + Eigen::DSizes one_by_depth(1, depth); + Eigen::array reduce_dims({0}); + Eigen::array bcast_spec({rest_size, 1}); + + auto x_rest_by_depth = x.reshape(rest_by_depth).template cast(); + const int rest_size_minus_one = (rest_size > 1) ? (rest_size - 1) : 1; + float rest_size_inv = static_cast(1.0f / static_cast(rest_size)); + // This adjustment is for Bessel's correction + float rest_size_adjust = + static_cast(rest_size) / static_cast(rest_size_minus_one); + + Eigen::Tensor batch_mean(depth); + Eigen::Tensor batch_variance(depth); + + const Eigen::ThreadPoolDevice &d = *eigen_support::GetThreadPoolDevice(); + + batch_mean.device(d) = (x_rest_by_depth.sum(reduce_dims) * rest_size_inv); + auto x_centered = x_rest_by_depth - batch_mean.reshape(one_by_depth).broadcast(bcast_spec); + + batch_variance.device(d) = x_centered.square().sum(reduce_dims) * rest_size_inv; + auto scaling_factor = ((batch_variance + param.epsilon).rsqrt() * scale) + .eval() + .reshape(one_by_depth) + .broadcast(bcast_spec); + auto x_scaled = x_centered * scaling_factor; + auto x_shifted = + (x_scaled + offset.reshape(one_by_depth).broadcast(bcast_spec)).template cast(); + + UNUSED_RELEASE(rest_size_adjust); + + y.reshape(rest_by_depth).device(d) = x_shifted; + + memcpy(output_data, y.data(), output_shape.FlatSize() * sizeof(float)); + } + + template + void copyFrom(const InputTensor &input, const Shape &shape, Tensor *output) + { + Tensor temp_tensor; + temp_tensor.shape.ReplaceWith(input.shape.DimensionsCount(), input.shape.DimsData()); + temp_operand.emplace_back(std::make_unique(input.shape.FlatSize())); + temp_tensor.buffer = temp_operand.back().get(); + memcpy(temp_tensor.buffer, input.buffer, input.shape.FlatSize() * sizeof(float)); + + copyFrom(temp_tensor, shape, output); + } + + void copyFrom(const Tensor &input, const Shape &shape, Tensor *output) + { + if (output->copyFrom(input, shape)) + return; + + throw std::runtime_error{"Einsum: Encountered error while reshaping a Tensor"}; + } + +private: + bool _prepared; + std::vector> temp_operand; +}; + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_FUSEDBATCHNORM_H__ diff --git a/compute/cker/include/cker/operation/Helper/BCast.h b/compute/cker/include/cker/operation/Helper/BCast.h new file mode 100644 index 0000000..a0abf29 --- /dev/null +++ b/compute/cker/include/cker/operation/Helper/BCast.h @@ -0,0 +1,471 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_HELPER_BCAST_H__ +#define __NNFW_CKER_HELPER_BCAST_H__ + +/** + * ToDo : This file will be moved into upper folder when integrate with other + * custom operations. + * And It should merged with EinsumHelper's BCast. +**/ + +#include "cker/Shape.h" +#include "cker/eigen/EigenSupport.h" + +namespace nnfw +{ +namespace cker +{ +// Returns the mapping from the output batch indices to the corresponding +// input's batch indices, given the input's "reshape" and "bcast" shapes as +// returned by the BCastList helper class. The i'th element denotes the +// (flattened) batch index of the input that must be used to compute the i'th +// batch output. +// +inline void ComputeBatchIndices(const int32_t output_batch_size, + const std::vector &reshape, + const std::vector &bcast, + std::vector *out_indices) +{ + // Populates the mapping in out_indices. This algorithm is identical to + // the following steps: + // - Reshape {0, 1, ..., input_batch_size - 1} to the input shape. + // - Broadcast to the output shape. + // - Reshape back to a flat 1D vector. + out_indices->resize(output_batch_size); + int32_t num_output_elements = 1; + int32_t num_input_elements = 1; + for (int32_t i = reshape.size() - 1; i >= 0; --i) + { + // Replicate the already populated mapping an additional (dim - 1) times. + // If we are broadcasting, just copy the existing mapping. + // Otherwise, add another dimension from the input shape. + const int32_t dim = std::max(reshape[i], bcast[i]); + const int32_t incr = bcast[i] > 1 ? 0 : num_input_elements; + for (int32_t k = 0; k < (dim - 1) * num_output_elements; ++k) + { + (*out_indices)[num_output_elements + k] = (*out_indices)[k] + incr; + } + num_output_elements *= dim; + num_input_elements *= reshape[i]; + } +} + +template class BCastList +{ +public: + // A vector of int32_t representing the shape of tensor. The 0-th + // element is the outer-most dimension and the last element is the + // inner-most dimension. Note that we do not use Shape since + // it's more convenient to manipulate Vec directly for this module. + typedef std::vector Vec; + + // Constructs all helper shapes, following the aforementioned rules. + // + // If "fewer_dims_optimization" is set to true (the default), the + // implementation tries to reduce intermediate dimensions needed to be more + // efficient. This is transparent to the caller. + // + // If false, all intermediate shapes (except for grad_{x,y}_reduce_idx()) have + // the same number of dimensions as the larger of the two inputs. + // + // If return_flattened_batch_indices is true, the implementation will compute + // for each output member of the flattened output, which batch indices of + // each input correspond to it. This is disabled by default. + explicit BCastList(const Vec (&x)[N], const bool fewer_dims_optimization = true, + const bool return_flattened_batch_indices = false); + ~BCastList() {} + + // Returns true iff two operands are compatible according to the + // broadcasting rule. + bool IsValid() const { return valid_; } + bool IsBroadcastingRequired() const { return broadcasting_required_; } + + // If and only if IsValid(), the following fields can be used in + // implementing a broadcasted binary tensor operation according to + // the broadcasting rule. + const Vec &reshape(int i) const { return reshape_[i]; } + const Vec &bcast(int i) const { return bcast_[i]; } + const Vec &result_shape() const { return result_; } + const Vec &output_shape() const { return output_; } + const Vec &grad_reduce_idx(int i) const { return grad_reduce_idx_[i]; } + int32_t output_batch_size() const { return output_batch_size_; } + + // Returns the mapping from the flattened output batch indices to x's + // flattened batch indices. The result is a vector of length + // output_batch_size(). To compute the i'th batch output, a binary matmul-like + // operation should use the `x_batch_indices()[i]`th batch index of `x`. + // Note: Returns an empty vector if broadcasting is not required. Callers + // should only use this when IsBroadcastingRequired() returns true. + const std::vector &batch_indices(int i) const { return batch_indices_[i]; } + +protected: + bool valid_ = true; + bool broadcasting_required_ = true; + Vec reshape_[N]; + Vec bcast_[N]; + Vec result_; + Vec output_; + Vec grad_reduce_idx_[N]; + + int32_t output_batch_size_; + std::vector batch_indices_[N]; + + static void Reverse(Vec *shape) { std::reverse(shape->begin(), shape->end()); } +}; // BCastList + +template +BCastList::BCastList(const BCastList::Vec (&x)[N], const bool fewer_dims_optimization, + const bool return_flattened_batch_indices) +{ + typedef BCastList::Vec Vec; + bool all_equal = true; + size_t largest_rank = 0; + output_batch_size_ = 1; + for (int i = 0; i < N; ++i) + { + if (x[i] != x[0]) + { + all_equal = false; + } + if (x[i].size() > largest_rank) + { + largest_rank = x[i].size(); + } + } + if (all_equal) + { + broadcasting_required_ = false; + } + if (all_equal && fewer_dims_optimization) + { + // Fast path for common case of identical shapes. + int32_t elements = 1; + const int rank = x[0].size(); + output_.resize(rank); + for (int i = 0; i < rank; i++) + { + const int32_t dim = x[0][i]; + elements *= dim; + output_[i] = dim; + } + result_.push_back(elements); + output_batch_size_ = elements; + for (int i = 0; i < N; ++i) + { + reshape_[i].push_back(elements); + bcast_[i].push_back(1); + } + // grad_reduce_ is left as empty + return; + } + + // Reverse all the shapes for convenience + // After the reverse, 0-th is the inner-most dimension. + Vec copy[N]; + for (int i = 0; i < N; ++i) + { + copy[i] = x[i]; + Reverse(©[i]); + } + + // 1-extend and align all vectors. + for (int i = 0; i < N; ++i) + { + if (copy[i].size() < largest_rank) + { + copy[i].resize(largest_rank, 1); + } + } + // Going through each dimension starting from the inner-most + // dimension, compares dimension of x and y. They are compatible if + // they are equal or either is 1. + + // indices of j-th component of each input. + bool prev_is_one[N]; + bool current_is_one[N]; + for (int i = 0; i < N; ++i) + { + prev_is_one[i] = false; + current_is_one[i] = false; + } + Vec output; + bool output_dim_set = false; + int output_dim = -1; + bool none_is_one = true; + bool set_one = false; + for (size_t j = 0; j < largest_rank; ++j) + { + output_dim = -1; + output_dim_set = false; + none_is_one = true; + // Find which indices are 1. + for (int i = 0; i < N; ++i) + { + // Keep track of which indices are 1. + if (copy[i][j] == 1) + { + current_is_one[i] = true; + none_is_one = false; + } + else + { + current_is_one[i] = false; + if (!output_dim_set || copy[i][j] == output_dim) + { + output_dim = copy[i][j]; + output_dim_set = true; + } + else + { + valid_ = false; + return; + } + } + } + output_.push_back(output_dim_set ? output_dim : 1); + output_batch_size_ *= output_.back(); + // All dimensions are 1. + if (!output_dim_set) + { + if (!fewer_dims_optimization) + { + for (int i = 0; i < N; ++i) + { + bcast_[i].push_back(1); + reshape_[i].push_back(1); + } + result_.push_back(1); + } + for (int i = 0; i < N; ++i) + { + grad_reduce_idx_[i].push_back(largest_rank - 1 - j); + } + // This will skip updating the previous state to the current one. We'll + // explain why this is safe below. + // Consider the previous state P, current state C and the next state N. + // In the case where N also is all ones (N == C), we'll do the same + // optimization here (push back one dimensions if we need to), which is + // safe and is expected. + // + // When N != C, we'll continue as usual. However, we might trigger the + // next block if N == P (because we didn't update the previous state). + // We trigger the next block if `fewer_dims_optimization` is true. + // This means that we did not modify and broadcast / reshapes in this + // block (we skipped updating, since the one dimensions can be ignored). + // In essence, we only need to check whether the previous non-one state is + // equal to the current non-one state. + + continue; + } + else if ((fewer_dims_optimization) && + std::equal(current_is_one, current_is_one + N, prev_is_one) && set_one) + { + // It is a run of the same broadcasting case as last time. + // We can reshape the input so that fewer dimensions + // are involved in the intermediate computation. + result_.back() *= output_dim; + for (int i = 0; i < N; ++i) + { + reshape_[i].back() *= copy[i][j]; + bcast_[i].back() *= current_is_one[i] ? output_dim : 1; + if (current_is_one[i] && !none_is_one) + { + grad_reduce_idx_[i].push_back(largest_rank - 1 - j); + } + } + } + else + { + result_.push_back(output_dim); + for (int i = 0; i < N; ++i) + { + reshape_[i].push_back(copy[i][j]); + bcast_[i].push_back(current_is_one[i] ? output_dim : 1); + if (current_is_one[i] && !none_is_one) + { + grad_reduce_idx_[i].push_back(largest_rank - 1 - j); + } + } + } + set_one = true; + for (int i = 0; i < N; ++i) + { + prev_is_one[i] = current_is_one[i]; + } + } + if (result_.empty()) + { + result_.push_back(1); + for (int i = 0; i < N; ++i) + { + reshape_[i].push_back(1); + bcast_[i].push_back(1); + } + } + // Do something about batches. + for (int i = 0; i < N; ++i) + { + Reverse(&reshape_[i]); + Reverse(&bcast_[i]); + Reverse(&grad_reduce_idx_[i]); + } + Reverse(&result_); + Reverse(&output_); + // Only compute batch indices when we need broadcasting, and we aren't doing + // needless work (when the output size is 0 or the + // return_flattened_batch_indices isn't enabled). + if (return_flattened_batch_indices && broadcasting_required_ && output_batch_size_ > 0) + { + for (int i = 0; i < N; ++i) + { + ComputeBatchIndices(output_batch_size_, reshape_[i], bcast_[i], &batch_indices_[i]); + } + } +} + +// BCast is a helper for broadcasting binary tensor operation. +// TensorFlow's broadcasting rule follows that of numpy (See +// http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html). +// +// The rule has the following properties: +// +// 1. suffix matching: the rule starts with the right-most +// dimension, and works towards the left-most dimension. Since +// TensorFlow is row-major, the right-most dimension (the last +// element in the shape of a tensor) is the inner-most, a.k.a. +// the fastest changing, dimension. +// +// 2. Two dimensions are compatible for broadcasting if both are the +// same or either is 1. +// +// BCast takes the shape of two tensors and computes a few vectors of +// int32 that are useful for the caller to reshape the tensors, apply +// the right broadcasts to them, compute the broadcasted operation, +// and possibly the gradients. In a nutshell, the caller is expected +// to compute the broadcasted operation as following: +// +// BCast b(x.shape(), y.shape()); +// output = x.reshape(b.x_reshape()).broadcast(b.x_bcast()) +// _op_ +// y.reshape(b.y_reshape()).broadcast(b.y_bcast()) +// +// For the gradient computation, +// grad_x = sum(grad * backprop_x(x, y), grad_x_reduce_idx) +// .reshape(x.shape()) +// grad_y = sum(grad * backprop_y(x, y), grad_y_reduce_idx) +// .reshape(y.shape()) +// backprop_x and backprop_y are functionals of the binary function "op", +// e.g., +// for +, backprop_x(x, y) = backprop_y(x, y) = 1; +// for *, backprop_x(x, y) = y, backprop_y(x, y) = x; +// for /, backprop_x(x, y) = 1/y, backprop_y(x, y) = -x/y^2; +// +// The multiplication in the grad * backprop_x itself is also +// broadcasting following the same rule. +class BCast : public BCastList<2> +{ +public: + // Constructs all helper shapes, following the aforementioned rules. + // + // If "fewer_dims_optimization" is set to true (the default), the + // implementation tries to reduce intermediate dimensions needed to be more + // efficient. This is transparent to the caller. + // + // If false, all intermediate shapes (except for grad_{x,y}_reduce_idx()) have + // the same number of dimensions as the larger of the two inputs. + typedef std::vector Vec; + + BCast(const Vec &x, const Vec &y, const bool fewer_dims_optimization = true, + const bool return_flattened_batch_indices = false) + : BCastList<2>({x, y}, fewer_dims_optimization, return_flattened_batch_indices) + { + } + + ~BCast() {} + + // If and only if IsValid(), the following fields can be used in + // implementing a broadcasted binary tensor operation according to + // the broadcasting rule. + const Vec &x_reshape() const { return reshape_[0]; } + const Vec &x_bcast() const { return bcast_[0]; } + const Vec &y_reshape() const { return reshape_[1]; } + const Vec &y_bcast() const { return bcast_[1]; } + const Vec &result_shape() const { return result_; } + const Vec &output_shape() const { return output_; } + const Vec &grad_x_reduce_idx() const { return grad_reduce_idx_[0]; } + const Vec &grad_y_reduce_idx() const { return grad_reduce_idx_[1]; } + + // Returns the mapping from the flattened output batch indices to x's + // flattened batch indices. The result is a vector of length + // output_batch_size(). To compute the i'th batch output, a binary matmul-like + // operation should use the `x_batch_indices()[i]`th batch index of `x`. + // Note: Returns an empty vector if broadcasting is not required. Callers + // should only use this when IsBroadcastingRequired() returns true. + const std::vector &x_batch_indices() const { return batch_indices_[0]; } + // Returns the mapping from the flattened output batch indices to y's + // flattened batch indices. Similar to x_batch_indices(). + // Note: Returns an empty vector if broadcasting is not required. Callers + // should only use this when IsBroadcastingRequired() returns true. + const std::vector &y_batch_indices() const { return batch_indices_[1]; } + + template + static Eigen::array ToIndexArrayType(const BCast::Vec &vec) + { + assert(vec.size() == NDIMS); + Eigen::array ret; + for (int i = 0; i < NDIMS; ++i) + ret[i] = vec[i]; + return ret; + } + + template + static Eigen::array ToIndexArray(const BCast::Vec &vec) + { + return ToIndexArrayType(vec); + } + + // Static helpers. + static Vec FromShape(const Shape &shape) + { + const int N = shape.DimensionsCount(); + BCastList::Vec ret(N); + for (int i = 0; i < N; ++i) + { + ret[i] = shape.Dims(i); + } + return ret; + } + + static Shape ToShape(const BCastList::Vec &vec) + { + const int N = vec.size(); + Shape shape(N); + + for (int i = 0; i < N; ++i) + { + shape.SetDim(i, vec[i]); + } + return shape; + } + +}; // BCast +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_HELPER_BCAST_H__ diff --git a/compute/cker/include/cker/operation/Helper/MatmulBCast.h b/compute/cker/include/cker/operation/Helper/MatmulBCast.h new file mode 100644 index 0000000..b80ccc0 --- /dev/null +++ b/compute/cker/include/cker/operation/Helper/MatmulBCast.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2019 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_EINSUM_HELPER_MATMUL_BCAST_H__ +#define __NNFW_CKER_EINSUM_HELPER_MATMUL_BCAST_H__ + +#include +#include +#include + +#include "BCast.h" +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ + +// Simple wrapper over BCast specialized for MatMul. +// Provides utilities for broadcasting across batch dimensions for binary +// MatMul-like operations. + +// Fix: Use Shape directly instead of Vec +class MatMulBCast +{ +public: + MatMulBCast(Shape &shape_x, Shape &shape_y) + { + if (shape_x.DimensionsCount() < 2 || shape_y.DimensionsCount() < 2) + return; + + std::vector x; + std::vector y; + + x.resize(shape_x.DimensionsCount() - 2); + y.resize(shape_y.DimensionsCount() - 2); + + for (size_t i = 0; i < x.size(); i++) + { + x[i] = shape_x.Dims(i); + } + for (size_t i = 0; i < y.size(); i++) + { + y[i] = shape_y.Dims(i); + } + + _batch_bcast = std::make_unique(std::move(x), std::move(y)); + if (!_batch_bcast->IsValid()) + return; + + auto x_reshaped = _batch_bcast->x_reshape(); + auto y_reshaped = _batch_bcast->y_reshape(); + auto output_shape = _batch_bcast->output_shape(); + + _x_batch_size = std::accumulate(x_reshaped.cbegin(), x_reshaped.cend(), INT32_C(1), + std::multiplies()); + _y_batch_size = std::accumulate(x_reshaped.cbegin(), x_reshaped.cend(), INT32_C(1), + std::multiplies()); + _output_shape.ReplaceWith(output_shape.size(), output_shape.data()); + _output_batch_size = _output_shape.FlatSize(); + } + + bool IsValid() const { return (_batch_bcast != nullptr) && _batch_bcast->IsValid(); } + int32_t x_batch_size() const { return _x_batch_size; } + int32_t y_batch_size() const { return _y_batch_size; } + int32_t output_batch_size() const { return _output_batch_size; } + const Shape &output_batch_shape() const { return _output_shape; } + +private: + std::unique_ptr _batch_bcast; + + int32_t _x_batch_size; + int32_t _y_batch_size; + Shape _output_shape; + int32_t _output_batch_size; +}; + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_EINSUM_HELPER_MATMUL_BCAST_H__ diff --git a/compute/cker/include/cker/operation/Helper/Tensor.h b/compute/cker/include/cker/operation/Helper/Tensor.h new file mode 100644 index 0000000..e6ac008 --- /dev/null +++ b/compute/cker/include/cker/operation/Helper/Tensor.h @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2015 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_HELPER_TENSOR_H__ +#define __NNFW_CKER_HELPER_TENSOR_H__ + +#include "cker/Shape.h" +#include "cker/eigen/EigenSupport.h" + +namespace nnfw +{ +namespace cker +{ +template struct TTypes +{ + // Rank- tensor of scalar type T. + typedef Eigen::TensorMap, Eigen::Aligned> + Tensor; + typedef Eigen::TensorMap, + Eigen::Aligned> + ConstTensor; + + // Unaligned Rank- tensor of scalar type T. + typedef Eigen::TensorMap> UnalignedTensor; + typedef Eigen::TensorMap> + UnalignedConstTensor; + + typedef Eigen::TensorMap, Eigen::Aligned> + Tensor32Bit; + + // Scalar tensor (implemented as a rank-0 tensor) of scalar type T. + typedef Eigen::TensorMap, Eigen::RowMajor, IndexType>, + Eigen::Aligned> + Scalar; + typedef Eigen::TensorMap< + Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>, Eigen::Aligned> + ConstScalar; + + // Unaligned Scalar tensor of scalar type T. + typedef Eigen::TensorMap, Eigen::RowMajor, IndexType>> + UnalignedScalar; + typedef Eigen::TensorMap< + Eigen::TensorFixedSize, Eigen::RowMajor, IndexType>> + UnalignedConstScalar; + + // Rank-1 tensor (vector) of scalar type T. + typedef Eigen::TensorMap, Eigen::Aligned> Flat; + typedef Eigen::TensorMap, Eigen::Aligned> + ConstFlat; + typedef Eigen::TensorMap, Eigen::Aligned> Vec; + typedef Eigen::TensorMap, Eigen::Aligned> + ConstVec; + + // Unaligned Rank-1 tensor (vector) of scalar type T. + typedef Eigen::TensorMap> UnalignedFlat; + typedef Eigen::TensorMap> + UnalignedConstFlat; + typedef Eigen::TensorMap> UnalignedVec; + typedef Eigen::TensorMap> UnalignedConstVec; + + // Rank-2 tensor (matrix) of scalar type T. + typedef Eigen::TensorMap, Eigen::Aligned> Matrix; + typedef Eigen::TensorMap, Eigen::Aligned> + ConstMatrix; + + // Unaligned Rank-2 tensor (matrix) of scalar type T. + typedef Eigen::TensorMap> UnalignedMatrix; + typedef Eigen::TensorMap> + UnalignedConstMatrix; +}; + +typedef typename TTypes::Tensor32Bit::Index Index32; + +template struct InputTensor +{ + Shape shape; + const T *buffer; +}; + +struct Tensor +{ + Shape shape; + void *buffer; + +public: + bool copyFrom(const Tensor &other, const Shape &new_shape) + { + if (other.shape.FlatSize() != new_shape.FlatSize()) + return false; + + this->shape.ReplaceWith(new_shape.DimensionsCount(), new_shape.DimsData()); + this->buffer = other.buffer; + + return true; + } + + template T *base() const + { + return buffer == nullptr ? nullptr : reinterpret_cast(buffer); + } + + template + typename TTypes::Tensor shaped(const std::vector &new_sizes) + { + Eigen::array dims; + for (size_t d = 0; d < NDIMS; d++) + { + dims[d] = new_sizes[d]; + } + return typename TTypes::Tensor(base(), dims); + } + + template typename TTypes::Flat flat() { return shaped({shape.FlatSize()}); } + + template + typename TTypes::ConstTensor shaped(const std::vector new_sizes) const + { + Eigen::array dims; + for (size_t d = 0; d < NDIMS; d++) + { + dims[d] = new_sizes[d]; + } + return typename TTypes::ConstTensor(base(), dims); + } + + // Create Eigen Tensor with current shape + template typename TTypes::Tensor shaped() const + { + Eigen::array dims; + for (size_t d = 0; d < NDIMS; d++) + { + dims[d] = shape.Dims(d); + } + return typename TTypes::Tensor(base(), dims); + } + + template typename TTypes::ConstFlat flat() const + { + return shaped({shape.FlatSize()}); + } + + template typename TTypes::ConstScalar scalar() const + { + return typename TTypes::ConstScalar(base()); + } +}; // Tensor + +template Eigen::DSizes To32BitDims(const DSizes &in) +{ + Eigen::DSizes out; + for (int i = 0; i < DSizes::count; ++i) + { + out[i] = in[i]; + } + return out; +} + +template +typename TTypes::Tensor32Bit +To32Bit(TensorType in) +{ + typedef typename TTypes::Tensor32Bit RetType; + return RetType(in.data(), To32BitDims(in.dimensions())); +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_HELPER_TENSOR_H__ diff --git a/compute/cker/include/cker/operation/LogSoftMax.h b/compute/cker/include/cker/operation/LogSoftMax.h new file mode 100644 index 0000000..326a3ee --- /dev/null +++ b/compute/cker/include/cker/operation/LogSoftMax.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_LOGSOFTMAX_H__ +#define __NNFW_CKER_LOGSOFTMAX_H__ + +#include "cker/Shape.h" +#include "cker/Utils.h" +#include "cker/Types.h" +#include "cker/eigen/Utils.h" + +#include +#include +#include + +namespace nnfw +{ +namespace cker +{ + +inline void LogSoftmax(const SoftmaxParams ¶ms, const Shape &input_shape, + const float *input_data, const Shape &output_shape, float *output_data) +{ + const int rank = input_shape.DimensionsCount(); + const int axis = (params.axis < 0) ? params.axis + rank : params.axis; + const double beta = params.beta; + const int depth = MatchingDim(input_shape, axis, output_shape, axis); + + int outer_size = 1; + for (int i = 0; i < axis; ++i) + { + outer_size *= input_shape.Dims(i); + } + + int inner_size = 1; + for (int i = axis + 1; i < rank; ++i) + { + inner_size *= input_shape.Dims(i); + } + + for (int i = 0; i < outer_size; ++i) + { + for (int j = 0; j < inner_size; ++j) + { + float max = std::numeric_limits::lowest(); + for (int c = 0; c < depth; ++c) + { + max = std::max(max, input_data[(i * depth + c) * inner_size]); + } + + float sum = 0.f; + for (int c = 0; c < depth; ++c) + { + sum += std::exp((input_data[(i * depth + c) * inner_size + j] - max) * beta); + } + + const float log_sum = std::log(sum); + for (int c = 0; c < depth; ++c) + { + output_data[(i * depth + c) * inner_size + j] = + (input_data[(i * depth + c) * inner_size + j] - max) * beta - log_sum; + } + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_LOGSOFTMAX_H__ diff --git a/compute/cker/include/cker/operation/LogicalNot.h b/compute/cker/include/cker/operation/LogicalNot.h new file mode 100644 index 0000000..5e8d38b --- /dev/null +++ b/compute/cker/include/cker/operation/LogicalNot.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_LOGICALNOT_H__ +#define __NNFW_CKER_LOGICALNOT_H__ + +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ + +inline void LogicalNot(const Shape &input_shape, const bool *input_data, const Shape &output_shape, + bool *output_data) +{ + const int size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < size; i++) + { + output_data[i] = !input_data[i]; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_LOGICALNOT_H__ diff --git a/compute/cker/include/cker/operation/LogicalOr.h b/compute/cker/include/cker/operation/LogicalOr.h new file mode 100644 index 0000000..ec07c23 --- /dev/null +++ b/compute/cker/include/cker/operation/LogicalOr.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_LOGICAL_OR_H__ +#define __NNFW_CKER_LOGICAL_OR_H__ + +#include "cker/Shape.h" +#include "cker/Utils.h" + +namespace nnfw +{ +namespace cker +{ + +template +inline void LogicalOrBroadcast(const Shape &unextended_input1_shape, const T *input1_data, + const Shape &unextended_input2_shape, const T *input2_data, + const Shape &unextended_output_shape, T *output_data) +{ + assert(unextended_input1_shape.DimensionsCount() <= 4); + assert(unextended_input2_shape.DimensionsCount() <= 4); + assert(unextended_output_shape.DimensionsCount() <= 4); + const Shape output_shape = Shape::ExtendedShape(4, unextended_output_shape); + + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, unextended_input2_shape, &desc1, + &desc2); + + for (int b = 0; b < output_shape.Dims(0); ++b) + { + for (int y = 0; y < output_shape.Dims(1); ++y) + { + for (int x = 0; x < output_shape.Dims(2); ++x) + { + for (int c = 0; c < output_shape.Dims(3); ++c) + { + auto out_idx = Offset(output_shape, b, y, x, c); + auto in1_idx = SubscriptToIndex(desc1, b, y, x, c); + auto in2_idx = SubscriptToIndex(desc2, b, y, x, c); + auto in1_val = input1_data[in1_idx]; + auto in2_val = input2_data[in2_idx]; + output_data[out_idx] = in1_val || in2_val; + } + } + } + } +} + +template +inline void LogicalOrElementwise(const Shape &shape, const T *input1_data, const T *input2_data, + T *output_data) +{ + + int num_elements = shape.FlatSize(); + + for (int t = 0; t < num_elements; t++) + { + output_data[t] = input1_data[t] || input2_data[t]; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_LOGICAL_OR_H___ diff --git a/compute/cker/include/cker/operation/Logistic.h b/compute/cker/include/cker/operation/Logistic.h index 8720955..7477858 100644 --- a/compute/cker/include/cker/operation/Logistic.h +++ b/compute/cker/include/cker/operation/Logistic.h @@ -19,8 +19,10 @@ #define __NNFW_CKER_LOGISTIC_H__ #include "cker/Shape.h" +#include "cker/eigen/Utils.h" #include +#include namespace nnfw { @@ -30,12 +32,18 @@ namespace cker inline void Logistic(const Shape &input_shape, const float *input_data, const Shape &output_shape, float *output_data) { +#ifdef __aarch64__ + auto input_map = MapAsVector(input_data, input_shape); + auto output_map = MapAsVector(output_data, output_shape); + output_map.array() = input_map.array().unaryExpr(Eigen::internal::scalar_logistic_op()); +#else // Note, this can be done using TANH: (1/2) + (1/2) * TANH(x/2) const int size = MatchingFlatSize(input_shape, output_shape); for (int i = 0; i < size; i++) { output_data[i] = 1.f / (1.f + std::exp(-input_data[i])); } +#endif } } // namespace cker diff --git a/compute/cker/include/cker/operation/MatrixBandPart.h b/compute/cker/include/cker/operation/MatrixBandPart.h new file mode 100644 index 0000000..9f49c8f --- /dev/null +++ b/compute/cker/include/cker/operation/MatrixBandPart.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_MATRIX_BAND_PART_H__ +#define __NNFW_CKER_MATRIX_BAND_PART_H__ + +#include "cker/Shape.h" + +#include + +namespace nnfw +{ +namespace cker +{ +template +void MatrixBandPart(const T num_lower_diags, const T num_upper_diags, const Shape &input_shape, + const float *input_data, const Shape &output_shape, float *output_data) +{ + auto last_dim = input_shape.DimensionsCount() - 1; + + T batch_num = 0; + for (int dim = 0; dim < last_dim - 2; dim++) + { + batch_num += input_shape.Dims(dim); + } + + const T row_num = input_shape.Dims(last_dim - 1); + const T col_num = input_shape.Dims(last_dim); + + if (!(num_lower_diags <= row_num)) + throw std::runtime_error( + "MatrixBandPart : num_lower must be negative or less or equal to number of rows"); + + if (!(num_upper_diags <= col_num)) + throw std::runtime_error( + "MatrixBandPart : num_upper must be negative or less or equal to number of columns"); + + std::fill(output_data, output_data + output_shape.FlatSize(), 0); // output matrix init + + // reference code, without multithreading + for (T batch = 0; batch < batch_num; ++batch) + { + for (T row = 0; row < row_num; ++row) + { + auto output = output_data + (batch * row_num * col_num + row * col_num); + auto input = input_data + (batch * row_num * col_num + row * col_num); + + const T band_start = + num_lower_diags < 0 ? 0 : std::min(col_num, std::max(T{0}, row - num_lower_diags)); + const T band_end = num_upper_diags < 0 ? col_num : std::min(static_cast(col_num), + row + num_upper_diags + 1); + + for (T band_idx = band_start; band_idx < band_end; band_idx++) + { + output[band_idx] = input[band_idx]; + } + } + } +} +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_MATRIX_BAND_PART_H__ diff --git a/compute/cker/include/cker/operation/OneHot.h b/compute/cker/include/cker/operation/OneHot.h index 2df82d1..c0dbc6d 100644 --- a/compute/cker/include/cker/operation/OneHot.h +++ b/compute/cker/include/cker/operation/OneHot.h @@ -29,6 +29,9 @@ template void OneHot(const int32_t depth, const T on_value, const T off_value, int32_t axis, const Shape &indices_shape, const TI *indices_data, const Shape &, T *output_data) { + if (axis == -1) + axis = indices_shape.DimensionsCount(); + // prefix_dim_size == # of elements before the axis // depth == # of elements per axis // suffix_dim_size == # of elements after the axis diff --git a/compute/cker/include/cker/operation/Pow.h b/compute/cker/include/cker/operation/Pow.h new file mode 100644 index 0000000..1214e09 --- /dev/null +++ b/compute/cker/include/cker/operation/Pow.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_POW_H__ +#define __NNFW_CKER_POW_H__ + +#include "cker/Shape.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +template +inline void powImpl(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, + const T *input2_data, const Shape &output_shape, T *output_data) +{ + const int flat_size = MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (int i = 0; i < flat_size; ++i) + { + output_data[i] = std::pow(input1_data[i], input2_data[i]); + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_POW_H__ diff --git a/compute/cker/include/cker/operation/Range.h b/compute/cker/include/cker/operation/Range.h new file mode 100644 index 0000000..5c3a773 --- /dev/null +++ b/compute/cker/include/cker/operation/Range.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_RANGE_H__ +#define __NNFW_CKER_RANGE_H__ + +#include "cker/Shape.h" + +#include +#include + +namespace nnfw +{ +namespace cker +{ +template inline int GetSize(T start, T limit, T delta) +{ + if (!((start > limit && delta < 0) || (start < limit && delta > 0))) + { + throw std::runtime_error("Range: invalid input values"); + } + + int size = (std::is_integral::value + ? ((std::abs(limit - start) + std::abs(delta) - 1) / std::abs(delta)) + : std::ceil(std::abs((limit - start) / delta))); + return size; +} + +template +inline void Range(const T *start_data, const T *limit_data, const T *delta_data, T *output_data) +{ + const T start_value = *start_data; + const T delta_value = *delta_data; + const T limit_value = *limit_data; + + const int num_elements = GetSize(start_value, limit_value, delta_value); + T value = start_value; + + for (int i = 0; i < num_elements; ++i) + { + output_data[i] = value; + value += delta_value; + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_RANGE_H__ diff --git a/compute/cker/include/cker/operation/ReLU.h b/compute/cker/include/cker/operation/ReLU.h new file mode 100644 index 0000000..2a6cc4a --- /dev/null +++ b/compute/cker/include/cker/operation/ReLU.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_RELU_H__ +#define __NNFW_CKER_RELU_H__ + +#include "cker/Shape.h" +#include "cker/eigen/Utils.h" + +#include +#include + +namespace nnfw +{ +namespace cker +{ + +inline void ReLU(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const auto input_map = MapAsVector(input_data, input_shape); + auto output_map = MapAsVector(output_data, output_shape); + output_map = input_map.cwiseMax(0.0f); +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_RELU_H__ diff --git a/compute/cker/include/cker/operation/Reduce.h b/compute/cker/include/cker/operation/Reduce.h index 52e7395..4ba3652 100644 --- a/compute/cker/include/cker/operation/Reduce.h +++ b/compute/cker/include/cker/operation/Reduce.h @@ -128,8 +128,10 @@ public: return; // prepare space for temp_index and resolved_axis - _temp_index.resize(temp_index_size); - _resolved_axis.resize(resolved_axis_size); + if (temp_index_size > kMaxSmallSize) + _temp_index.resize(temp_index_size); + if (resolved_axis_size > kMaxSmallSize) + _resolved_axis.resize(resolved_axis_size); _prepared = true; } @@ -148,20 +150,31 @@ public: // Resolve axis. int num_resolved_axis = 0; - if (!ResolveAxis(input_shape.DimensionsCount(), axes, _resolved_axis.data(), - &num_resolved_axis)) + if (!ResolveAxis(input_shape.DimensionsCount(), axes, resolved_axis_data(), &num_resolved_axis)) { return false; } - return ReduceImpl(input_data, input_shape, output_shape, _resolved_axis.data(), - num_resolved_axis, _temp_index.data(), reducer, output_data); + return ReduceImpl(input_data, input_shape, output_shape, resolved_axis_data(), + num_resolved_axis, temp_index_data(), reducer, output_data); + } + + inline int32_t *resolved_axis_data(void) + { + return _resolved_axis.size() ? _resolved_axis.data() : _resolved_axis_small; + } + inline int32_t *temp_index_data(void) + { + return _temp_index.size() ? _temp_index.data() : _temp_index_small; } private: std::vector _temp_index; std::vector _resolved_axis; bool _prepared; + static constexpr int kMaxSmallSize = 4; + int _temp_index_small[kMaxSmallSize]; + int _resolved_axis_small[kMaxSmallSize]; }; } // namespace cker diff --git a/compute/cker/include/cker/operation/ReduceMean.h b/compute/cker/include/cker/operation/ReduceMean.h new file mode 100644 index 0000000..2e4fc62 --- /dev/null +++ b/compute/cker/include/cker/operation/ReduceMean.h @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_REDUCEMEAN_H__ +#define __NNFW_CKER_REDUCEMEAN_H__ + +#include "cker/Shape.h" +#include "cker/operation/Reduce.h" + +namespace nnfw +{ +namespace cker +{ + +float round_nearest(float value) +{ + if (value < 0) + { + return static_cast(static_cast(value - 0.5f)); + } + else + { + return static_cast(static_cast(value + 0.5f)); + } +} +template +Out mean_reducer(const Out data1, const In data2, int normalizer) +{ + return data1 + static_cast(data2) / normalizer; +} + +template int sum_reducer(const int data1, const In data2) +{ + return data1 + static_cast(data2); +} + +template +inline bool ReduceMeanImpl(const In *input_data, const Shape &input_shape, const int *axis, + const int num_axis, int *input_iter, + Out reducer(const Out current, const In in, int normalizer), + Out *output_data) +{ + const auto input_dims = input_shape.DimsData(); + const auto input_num_dims = input_shape.DimensionsCount(); + int normalizer = 1; + // Reset input iterator. + for (int idx = 0; idx < input_num_dims; ++idx) + { + input_iter[idx] = 0; + } + // Compute number of output elements + for (int idx = 0; idx < num_axis; ++idx) + { + normalizer *= input_dims[axis[idx]]; + } + // Iterate through input_data. + do + { + size_t input_offset = ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); + size_t output_offset = + ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); + output_data[output_offset] = + reducer(output_data[output_offset], input_data[input_offset], normalizer); + } while (NextIndex(input_num_dims, input_dims, input_iter)); + return true; +} + +template +inline size_t ReduceSumQuantImpl(const In *input_data, const Shape &input_shape, const int *axis, + const int num_axis, int *input_iter, + int reducer(const int current, const In in), int *temp_sum) +{ + const auto input_dims = input_shape.DimsData(); + const auto input_num_dims = input_shape.DimensionsCount(); + size_t normalizer = 1; + // Reset input iterator. + for (int idx = 0; idx < input_num_dims; ++idx) + { + input_iter[idx] = 0; + } + // Compute number of output elements + for (int idx = 0; idx < num_axis; ++idx) + { + normalizer *= input_dims[axis[idx]]; + } + // Iterate through input_data. + do + { + size_t input_offset = ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); + size_t output_offset = + ReducedOutputOffset(input_num_dims, input_dims, input_iter, num_axis, axis); + temp_sum[output_offset] = reducer(temp_sum[output_offset], input_data[input_offset]); + } while (NextIndex(input_num_dims, input_dims, input_iter)); + return normalizer; +} + +class ReduceMean : public Reduce +{ +public: + ReduceMean() : Reduce(){}; + + template + int PrepareforReduce(const Shape &input_shape, const Shape &output_shape, + const std::vector &axes, T *output_data, T init_value) + { + // Reset output data. + if (!InitTensorDataForReduce(output_shape, init_value, output_data)) + { + return -1; + } + const auto input_dims = input_shape.DimsData(); + const int num_dims = input_shape.DimensionsCount(); + int resolved_axis_size = 1; + const auto num_axes = axes.size(); + + for (size_t idx = 0; idx < num_axes; idx++) + { + int current = axes[idx] < 0 ? (axes[idx] + num_dims) : axes[idx]; + assert(current >= 0 && current < num_dims); + resolved_axis_size *= input_dims[current]; + } + + prepare(num_dims, resolved_axis_size); + + // Resolve axis. + int num_resolved_axis = 0; + if (!ResolveAxis(input_shape.DimensionsCount(), axes, resolved_axis_data(), &num_resolved_axis)) + { + return -1; + } + + return num_resolved_axis; + } + + // Computes the generic value (i.e., sum/max/min/prod) of elements across + // dimensions given in axis. It needs to pass in init_value and reducer. + template + inline bool ReduceOp(const Shape &input_shape, const In *input_data, const Shape &output_shape, + Out *output_data, const std::vector &axes, bool, Out init_value, + Out reducer(const Out current, const Out in, int normalizer)) + { + int num_resolved_axis; + num_resolved_axis = PrepareforReduce(input_shape, output_shape, axes, output_data, init_value); + if (num_resolved_axis == -1) + { + return false; + } + return ReduceMeanImpl(input_data, input_shape, resolved_axis_data(), num_resolved_axis, + temp_index_data(), reducer, output_data); + } + + template + inline bool ReduceOp(const Shape &input_shape, const In *input_data, float input_scale, + int32_t input_offset, const Shape &output_shape, Out *output_data, + float output_scale, int32_t output_offset, const std::vector &axes, + bool, Out init_value, int reducer(const int current, const In in)) + { + size_t num_outputs = 1; + auto output_dims = output_shape.DimsData(); + + for (size_t idx = 0; idx < static_cast(output_shape.DimensionsCount()); idx++) + { + num_outputs *= output_dims[idx]; + } + _temp_sum.resize(num_outputs, 0); + int num_resolved_axis; + num_resolved_axis = PrepareforReduce(input_shape, output_shape, axes, output_data, init_value); + if (num_resolved_axis == -1) + { + return false; + } + + size_t normalizer = + ReduceSumQuantImpl(input_data, input_shape, resolved_axis_data(), num_resolved_axis, + temp_index_data(), reducer, _temp_sum.data()); + if (num_outputs > 0) + { + float scale = input_scale / output_scale; + float bias = -input_offset * scale; + for (size_t idx = 0; idx < num_outputs; idx++) + { + float float_mean = static_cast(_temp_sum[idx]) / normalizer; + float result = std::min(round_nearest(float_mean * scale + bias + output_offset), + static_cast(std::numeric_limits::max())); + result = std::max(result, static_cast(std::numeric_limits::min())); + output_data[idx] = static_cast(result); + } + } + return false; + } + +private: + std::vector _temp_sum; +}; + +template +void Mean(const Shape &input_shape, const In *input_data, const Shape &output_shape, + Out *output_data, const std::vector &axes) +{ + UNUSED_RELEASE(output_shape); + assert(input_shape.DimensionsCount() > 0); + ReduceMean m_obj; + m_obj.ReduceOp(input_shape, input_data, output_shape, output_data, axes, true, (Out)0, + mean_reducer); +} + +template +void MeanQ8Asymm(const Shape &input_shape, const In *input_data, float input_scale, + int32_t input_offset, const Shape &output_shape, Out *output_data, + float output_scale, int32_t output_offset, const std::vector &axes) +{ + UNUSED_RELEASE(output_shape); + assert(input_shape.DimensionsCount() > 0); + ReduceMean m_obj; + m_obj.ReduceOp(input_shape, input_data, input_scale, input_offset, output_shape, + output_data, output_scale, output_offset, axes, true, (Out)0, + sum_reducer); +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_REDUCEMEAN_H__ diff --git a/compute/cker/include/cker/operation/Reverse.h b/compute/cker/include/cker/operation/Reverse.h new file mode 100644 index 0000000..ef4673f --- /dev/null +++ b/compute/cker/include/cker/operation/Reverse.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_REVERSE_H__ +#define __NNFW_CKER_REVERSE_H__ + +#include "cker/Shape.h" +#include "cker/Types.h" +#include "cker/Utils.h" + +namespace nnfw +{ +namespace cker +{ + +template +void Reverse(int axis, const Shape &input_shape, const Scalar *input_data, const Shape &, + Scalar *output_data) +{ + int outer_size = 1; + for (int i = 0; i < axis; ++i) + { + outer_size *= input_shape.Dims(i); + } + + int copy_size = 1; + for (int i = axis + 1; i < input_shape.DimensionsCount(); ++i) + { + copy_size *= input_shape.Dims(i); + } + + const int dims_at_axis = input_shape.Dims(axis); + for (int i = 0; i < outer_size; ++i) + { + for (int j = 0; j < dims_at_axis; ++j) + { + const int start_pos = (i * dims_at_axis + j) * copy_size; + Scalar *output_ptr = output_data + start_pos; + int loc = (i * dims_at_axis + dims_at_axis - j - 1) * copy_size; + memcpy(output_ptr, input_data + loc, copy_size * sizeof(Scalar)); + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_REVERSE_H__ diff --git a/compute/cker/include/cker/operation/Round.h b/compute/cker/include/cker/operation/Round.h new file mode 100644 index 0000000..a04a741 --- /dev/null +++ b/compute/cker/include/cker/operation/Round.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_ROUND_H__ +#define __NNFW_CKER_ROUND_H__ + +#include "cker/Shape.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +inline float RoundToNearest(float value) +{ + auto floor_val = std::floor(value); + auto diff = value - floor_val; + if ((diff < 0.5f) || ((diff == 0.5f) && (static_cast(floor_val) % 2 == 0))) + { + return floor_val; + } + else + { + return floor_val = floor_val + 1.0f; + } +} + +inline void Round(const Shape &input_shape, const float *input_data, const Shape &output_shape, + float *output_data) +{ + const int flat_size = MatchingFlatSize(input_shape, output_shape); + for (int i = 0; i < flat_size; ++i) + { + // Note that this implementation matches that of tensorFlow tf.round + // and corresponds to the bankers rounding method. + // cfenv (for fesetround) is not yet supported universally on Android, so + // using a work around. + output_data[i] = RoundToNearest(input_data[i]); + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_ROUND_H__ diff --git a/compute/cker/include/cker/operation/Select.h b/compute/cker/include/cker/operation/Select.h new file mode 100644 index 0000000..ab2de94 --- /dev/null +++ b/compute/cker/include/cker/operation/Select.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2018 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_SELECT_H__ +#define __NNFW_CKER_SELECT_H__ + +#include "cker/Shape.h" +#include "cker/Utils.h" + +#include + +namespace nnfw +{ +namespace cker +{ + +template +void Select(const Shape &input_condition_shape, const D *input_condition_data, + const Shape &input_x_shape, const T *input_x_data, const Shape &input_y_shape, + const T *input_y_data, const Shape &output_shape, T *output_data) +{ + const int64_t flatsize = + MatchingFlatSize(input_condition_shape, input_x_shape, input_y_shape, output_shape); + for (int64_t i = 0; i < flatsize; ++i) + { + output_data[i] = (input_condition_data[i] != 0) ? input_x_data[i] : input_y_data[i]; + } +} + +template +void RankOneSelect(const Shape &input_condition_shape, const D *input_condition_data, + const Shape &input_x_shape, const T *input_x_data, const Shape &input_y_shape, + const T *input_y_data, const Shape &output_shape, T *output_data) +{ + const int64_t outer_size = input_condition_shape.FlatSize(); + assert(MatchingDim(input_x_shape, 0, input_y_shape, 0, output_shape, 0) == outer_size); + const int64_t inner_size = MatchingFlatSizeSkipDim(input_x_shape, 0, input_y_shape, output_shape); + + int64_t offset = 0; + for (int64_t i = 0; i < outer_size; i++) + { + const T *input_data = (input_condition_data[i] != 0) ? input_x_data : input_y_data; + memcpy(output_data + offset, input_data + offset, inner_size * sizeof(T)); + offset += inner_size; + } +} + +template +void BroadcastSelect4DSlow(const Shape &input_condition_shape, const D *input_condition_data, + const Shape &input_x_shape, const T *input_x_data, + const Shape &input_y_shape, const T *input_y_data, + const Shape &output_shape, T *output_data) +{ + assert(input_condition_shape.DimensionsCount() <= 4); + assert(input_x_shape.DimensionsCount() <= 4); + assert(input_y_shape.DimensionsCount() <= 4); + assert(output_shape.DimensionsCount() <= 4); + + const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); + + NdArrayDesc<4> desc_condition; + NdArrayDesc<4> desc_x; + NdArrayDesc<4> desc_y; + NdArrayDescsForElementwiseBroadcast(input_condition_shape, input_x_shape, input_y_shape, + &desc_condition, &desc_x, &desc_y); + + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest + // stride, typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for + // the best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) + { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) + { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) + { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) + { + const int condition_index = SubscriptToIndex(desc_condition, b, y, x, c); + const int x_index = SubscriptToIndex(desc_x, b, y, x, c); + const int y_index = SubscriptToIndex(desc_y, b, y, x, c); + output_data[Offset(extended_output_shape, b, y, x, c)] = + input_condition_data[condition_index] ? input_x_data[x_index] : input_y_data[y_index]; + } + } + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_SELECT_H__ diff --git a/compute/cker/include/cker/operation/SpaceToBatchND.h b/compute/cker/include/cker/operation/SpaceToBatchND.h new file mode 100644 index 0000000..feeb358 --- /dev/null +++ b/compute/cker/include/cker/operation/SpaceToBatchND.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_SPACE_TO_BATCH_ND_H__ +#define __NNFW_CKER_SPACE_TO_BATCH_ND_H__ + +#include "cker/Shape.h" +#include "cker/Types.h" + +namespace nnfw +{ +namespace cker +{ + +template +inline void SpaceToBatchND(const SpaceToBatchParams ¶ms, const Shape &unextended_input_shape, + const T *input_data, const Shape &unextended_block_shape_shape, + const int32_t *block_shape_data, const Shape &unextended_padding_shape, + const int32_t *paddings_data, const Shape &unextended_output_shape, + T *output_data) +{ + UNUSED_RELEASE(unextended_block_shape_shape); + UNUSED_RELEASE(unextended_padding_shape); + + assert(unextended_input_shape.DimensionsCount() <= 4); + assert(unextended_output_shape.DimensionsCount() <= 4); + const Shape input_shape = Shape::ExtendedShape(4, unextended_input_shape); + const Shape output_shape = Shape::ExtendedShape(4, unextended_output_shape); + + const int depth = input_shape.Dims(3); + const int input_width = input_shape.Dims(2); + const int input_height = input_shape.Dims(1); + const int input_batch_size = input_shape.Dims(0); + + const int output_width = output_shape.Dims(2); + const int output_height = output_shape.Dims(1); + const int output_batch_size = output_shape.Dims(0); + + const int block_shape_height = block_shape_data[0]; + const int block_shape_width = block_shape_data[1]; + const int padding_top = paddings_data[0]; + const int padding_left = paddings_data[2]; + + // For uint8 quantized, the correct padding "zero value" is the output offset. + const int32_t pad_value = params.output_offset; + + for (int out_b = 0; out_b < output_batch_size; ++out_b) + { + int input_batch = out_b % input_batch_size; + int shift_w = (out_b / input_batch_size) % block_shape_width; + int shift_h = (out_b / input_batch_size) / block_shape_width; + for (int out_h = 0; out_h < output_height; ++out_h) + { + for (int out_w = 0; out_w < output_width; ++out_w) + { + T *out = output_data + Offset(output_shape, out_b, out_h, out_w, 0); + if (out_h * block_shape_height + shift_h < padding_top || + out_h * block_shape_height + shift_h >= padding_top + input_height || + out_w * block_shape_width + shift_w < padding_left || + out_w * block_shape_width + shift_w >= padding_left + input_width) + { + // This may not execute correctly when pad_value != 0 and T != uint8. + memset(out, pad_value, depth * sizeof(T)); + } + else + { + const T *in = + input_data + Offset(input_shape, input_batch, + (out_h * block_shape_height + shift_h) - padding_top, + (out_w * block_shape_width + shift_w) - padding_left, 0); + memcpy(out, in, depth * sizeof(T)); + } + } + } + } +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_SPACE_TO_BATCH_ND_H__ diff --git a/compute/cker/include/cker/operation/SqDiff.h b/compute/cker/include/cker/operation/SqDiff.h new file mode 100644 index 0000000..93428d5 --- /dev/null +++ b/compute/cker/include/cker/operation/SqDiff.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_REDUCESQDIFF_H__ +#define __NNFW_CKER_REDUCESQDIFF_H__ + +#include "cker/Shape.h" +#include "cker/Utils.h" + +namespace nnfw +{ +namespace cker +{ + +#define SQDIFF(N) \ + do \ + { \ + NdArrayDesc input1_desc; \ + NdArrayDesc input2_desc; \ + NdArrayDesc output_desc; \ + SqDiffImpl(input1_shape, input1_data, input2_shape, input2_data, output_shape, \ + output_data, &input1_desc, &input2_desc, &output_desc); \ + } while (0); + +template +void SqDiffImpl(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, + const T *input2_data, const Shape &output_shape, T *output_data, + NdArrayDesc *desc1_in, NdArrayDesc *desc2_in, NdArrayDesc *desc_out) +{ + std::vector input_iter; + input_iter.resize(N); + const auto output_dims = output_shape.DimsData(); + + // Copy dims to desc, calculating strides. + CopyDimsToDesc(output_shape, desc_out); + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, desc1_in, desc2_in); + + do + { + int input1_indx = SubscriptToIndexGeneric(desc1_in, input_iter.data()); + int input2_indx = SubscriptToIndexGeneric(desc2_in, input_iter.data()); + int output_indx = SubscriptToIndexGeneric(desc_out, input_iter.data()); + output_data[output_indx] = (input1_data[input1_indx] - input2_data[input2_indx]) * + (input1_data[input1_indx] - input2_data[input2_indx]); + } while (NextIndex(N, output_dims, input_iter.data())); +} + +template +void SqDiff(const Shape &input1_shape, const T *input1_data, const Shape &input2_shape, + const T *input2_data, const Shape &output_shape, T *output_data) +{ + UNUSED_RELEASE(output_shape); + assert(input1_shape.DimensionsCount() > 0 && input2_shape.DimensionsCount() > 0 && + output_shape.DimensionsCount() > 0); + int outRank = output_shape.DimensionsCount(); + + switch (outRank) + { + case 4: + SQDIFF(4); + break; + + case 3: + SQDIFF(3); + break; + + case 2: + SQDIFF(2); + break; + + case 1: + SQDIFF(1); + break; + + default: + throw std::runtime_error("Support up to 4-D tensors at present"); + break; + } +} +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_REDUCESQDIFF_H__ diff --git a/compute/cker/include/cker/operation/Tile.h b/compute/cker/include/cker/operation/Tile.h new file mode 100644 index 0000000..1dcdd9b --- /dev/null +++ b/compute/cker/include/cker/operation/Tile.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_TILE_H__ +#define __NNFW_CKER_TILE_H__ + +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ + +template +void CopyMultipleTimes(const T *in_data, int32_t in_size, M multiplier, T *out_data) +{ + for (M i = 0; i < multiplier; ++i) + { + const T *in_end = in_data + in_size; + T *new_out_data = std::copy(in_data, in_end, out_data); + in_data = out_data; + out_data = new_out_data; + } +} + +template +std::pair TileOneDimension(const Shape &in_dimensions, const T *in_data, + const M *multipliers, T *out_data, int dimension) +{ + const int dimension_size = in_dimensions.Dims(dimension); + if (dimension == in_dimensions.DimensionsCount() - 1) + { + CopyMultipleTimes(in_data, dimension_size, multipliers[dimension], out_data); + return std::make_pair(dimension_size, + dimension_size * static_cast(multipliers[dimension])); + } + int total_stride_size = 0, total_tiled_stride_size = 0; + const T *copy_from_data = in_data; + T *copy_to_data = out_data; + for (int i = 0; i < dimension_size; ++i) + { + int stride_size = 0, tiled_stride_size = 0; + std::tie(stride_size, tiled_stride_size) = + TileOneDimension(in_dimensions, copy_from_data, multipliers, copy_to_data, dimension + 1); + copy_from_data += stride_size; + copy_to_data += tiled_stride_size; + total_stride_size += stride_size; + total_tiled_stride_size += tiled_stride_size; + } + CopyMultipleTimes(out_data, total_tiled_stride_size, multipliers[dimension] - 1, + out_data + total_tiled_stride_size); + return std::make_pair(total_stride_size, + static_cast(total_tiled_stride_size * multipliers[dimension])); +} + +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_TILE_H__ diff --git a/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h index c887065..2b2ea8f 100644 --- a/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/optimized/BinaryArithmeticOps.h @@ -18,10 +18,13 @@ #ifndef __NNFW_CKER_OPTIMIZED_BINARYARITHMETICOPS_H__ #define __NNFW_CKER_OPTIMIZED_BINARYARITHMETICOPS_H__ +#include #include "cker/neon/neon_check.h" +#include "cker/operation/reference/BinaryArithmeticOps.h" #include "cker/Shape.h" #include "cker/Types.h" #include "cker/Utils.h" +#include "fixedpoint/fixedpoint.h" namespace nnfw { @@ -30,12 +33,133 @@ namespace cker namespace optimized { -inline void Add(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, - const float *input1_data, const Shape &input2_shape, const float *input2_data, - const Shape &output_shape, float *output_data) +template +inline void BinaryBroadcastFiveFold(const BinaryArithmeticOpParam ¶ms, + const Shape & /* unswitched_input1_shape */, + const T *unswitched_input1_data, + const Shape & /* unswitched_input2_shape */, + const T *unswitched_input2_data, + const Shape & /* output_shape */, T *output_data, + ElementwiseF elementwise_f, ScalarBroadcastF scalar_broadcast_f) +{ + const bool use_unswitched = + params.broadcast_category == BroadcastableOpCategory::kFirstInputBroadcastsFast; + + const T *input1_data = use_unswitched ? unswitched_input1_data : unswitched_input2_data; + const T *input2_data = use_unswitched ? unswitched_input2_data : unswitched_input1_data; + + // Fivefold nested loops. The second input resets its position for each + // iteration of the second loop. The first input resets its position at the + // beginning of the fourth loop. The innermost loop is an elementwise add of + // sections of the arrays. + T *output_data_ptr = output_data; + const T *input1_data_ptr = input1_data; + const T *input2_data_reset = input2_data; + // In the fivefold pattern, y0, y2 and y4 are not broadcast, and so shared + // between input shapes. y3 for input 1 is always broadcast, and so the + // dimension there is 1, whereas optionally y1 might be broadcast for input 2. + // Put another way, + // input1.shape.FlatSize = y0 * y1 * y2 * y4, + // input2.shape.FlatSize = y0 * y2 * y3 * y4. + int y0 = params.broadcast_shape[0]; + int y1 = params.broadcast_shape[1]; + int y2 = params.broadcast_shape[2]; + int y3 = params.broadcast_shape[3]; + int y4 = params.broadcast_shape[4]; + if (y4 > 1) + { + // General fivefold pattern, with y4 > 1 so there is a non-broadcast inner + // dimension. + for (int i0 = 0; i0 < y0; ++i0) + { + const T *input2_data_ptr = nullptr; + for (int i1 = 0; i1 < y1; ++i1) + { + input2_data_ptr = input2_data_reset; + for (int i2 = 0; i2 < y2; ++i2) + { + for (int i3 = 0; i3 < y3; ++i3) + { + elementwise_f(y4, params, input1_data_ptr, input2_data_ptr, output_data_ptr); + input2_data_ptr += y4; + output_data_ptr += y4; + } + // We have broadcast y4 of input1 data y3 times, and now move on. + input1_data_ptr += y4; + } + } + // We have broadcast y2*y3*y4 of input2 data y1 times, and now move on. + input2_data_reset = input2_data_ptr; + } + } + else + { + // Special case of y4 == 1, in which the innermost loop is a single element + // and can be combined with the next (y3) as an inner broadcast. + // + // Note that this handles the case of pure scalar broadcast when + // y0 == y1 == y2 == 1. With low overhead it handles cases such as scalar + // broadcast with batch (as y2 > 1). + // + // NOTE The process is the same as the above general case except simplified + // for y4 == 1 and the loop over y3 is contained within the + // AddScalarBroadcast function. + for (int i0 = 0; i0 < y0; ++i0) + { + const T *input2_data_ptr = nullptr; + for (int i1 = 0; i1 < y1; ++i1) + { + input2_data_ptr = input2_data_reset; + for (int i2 = 0; i2 < y2; ++i2) + { + scalar_broadcast_f(y3, params, *input1_data_ptr, input2_data_ptr, output_data_ptr); + input2_data_ptr += y3; + output_data_ptr += y3; + input1_data_ptr += 1; + } + } + input2_data_reset = input2_data_ptr; + } + } +} + +inline int32_t quant8_sum(const BinaryArithmeticOpParam ¶ms, const uint8_t input1_data, + const uint8_t input2_data) +{ + const int32_t input1_val = params.input1_offset + input1_data; + const int32_t input2_val = params.input2_offset + input2_data; + const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); + const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); + const int32_t scaled_input1_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input1_val, params.input1_multiplier, params.input1_shift); + const int32_t scaled_input2_val = MultiplyByQuantizedMultiplierSmallerThanOneExp( + shifted_input2_val, params.input2_multiplier, params.input2_shift); + const int32_t raw_sum = scaled_input1_val + scaled_input2_val; + const int32_t raw_output = MultiplyByQuantizedMultiplierSmallerThanOneExp( + raw_sum, params.output_multiplier, params.output_shift) + + params.output_offset; + const int32_t clamped_output = std::min(params.quantized_activation_max, + std::max(params.quantized_activation_min, raw_output)); + return clamped_output; +} + +inline void AddElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms, + const uint8_t *input1_data, const uint8_t *input2_data, + uint8_t *output_data) { int i = 0; - const int size = MatchingFlatSize(input1_shape, input2_shape, output_shape); + for (; i < size; ++i) + { + int32_t clamped_output = quant8_sum(params, input1_data[i], input2_data[i]); + output_data[i] = static_cast(clamped_output); + } +} + +inline void AddElementwise(int size, const BinaryArithmeticOpParam ¶ms, + const float *input1_data, const float *input2_data, float *output_data) +{ + int i = 0; + #ifdef USE_NEON const auto activation_min = vdupq_n_f32(params.float_activation_min); const auto activation_max = vdupq_n_f32(params.float_activation_max); @@ -76,12 +200,120 @@ inline void Add(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape vst1q_f32(output_data + i, x); } #endif // NEON - for (; i < size; i++) { auto x = input1_data[i] + input2_data[i]; - output_data[i] = - ActivationFunctionWithMinMax(x, params.float_activation_min, params.float_activation_max); + output_data[i] = ActivationFunctionWithMinMax(x, params.float_activation_min, + params.float_activation_max); + } +} + +inline void AddQuant8(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const uint8_t *input1_data, const Shape &input2_shape, + const uint8_t *input2_data, const Shape &output_shape, uint8_t *output_data) +{ + const int flat_size = MatchingElementsSize(input1_shape, input2_shape, output_shape); + AddElementwiseQuant8(flat_size, params, input1_data, input2_data, output_data); +} + +inline void Add(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const float *input1_data, const Shape &input2_shape, const float *input2_data, + const Shape &output_shape, float *output_data) +{ + const int flat_size = MatchingElementsSize(input1_shape, input2_shape, output_shape); + AddElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +// Scalar-broadcast add that can be used for inner loop of more general +// broadcast add, so that, for example, scalar-broadcast with batch will still +// be fast. +inline void AddScalarBroadcastQuant8(int size, const BinaryArithmeticOpParam ¶ms, + uint8_t broadcast_value, const uint8_t *input2_data, + uint8_t *output_data) +{ + int i = 0; + int32_t clamped_output; + for (; i < size; ++i) + { + clamped_output = quant8_sum(params, broadcast_value, input2_data[i]); + output_data[i] = static_cast(clamped_output); + } +} + +inline void AddScalarBroadcast(int size, const BinaryArithmeticOpParam ¶ms, + float broadcast_value, const float *input2_data, float *output_data) +{ + int i = 0; +#ifdef USE_NEON + const float32x4_t output_activation_min_vector = vdupq_n_f32(params.float_activation_min); + const float32x4_t output_activation_max_vector = vdupq_n_f32(params.float_activation_max); + const float32x4_t broadcast_value_dup = vdupq_n_f32(broadcast_value); + for (; i <= size - 4; i += 4) + { + const float32x4_t input2_val_original = vld1q_f32(input2_data + i); + + const float32x4_t output = vaddq_f32(input2_val_original, broadcast_value_dup); + + const float32x4_t clamped = + vmaxq_f32(output_activation_min_vector, vminq_f32(output_activation_max_vector, output)); + vst1q_f32(output_data + i, clamped); + } +#endif // NEON + for (; i < size; ++i) + { + auto x = broadcast_value + input2_data[i]; + output_data[i] = ActivationFunctionWithMinMax(x, params.float_activation_min, + params.float_activation_max); + } +} + +inline void BroadcastAddDispatchQuant8(const BinaryArithmeticOpParam ¶ms, + const Shape &input1_shape, const uint8_t *input1_data, + const Shape &input2_shape, const uint8_t *input2_data, + const Shape &output_shape, uint8_t *output_data) +{ + if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) + { + const std::function + fn = [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, + const uint8_t &b) -> uint8_t { + return static_cast(quant8_sum(params, a, b)); + }; + reference::BroadcastBinaryArithmeticOpSlowQuant8(params, input1_shape, input1_data, + input2_shape, input2_data, output_shape, + output_data, fn); + } + else + { + BinaryBroadcastFiveFold( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(AddElementwiseQuant8), + static_cast(AddScalarBroadcastQuant8)); + } +} + +inline void BroadcastAddDispatch(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const float *input1_data, const Shape &input2_shape, + const float *input2_data, const Shape &output_shape, + float *output_data) +{ + if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) + { + const std::function fn = + [](const float &a, const float &b) -> float { return a + b; }; + reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data, fn); + } + else + { + BinaryBroadcastFiveFold( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(AddElementwise), + static_cast( + AddScalarBroadcast)); } } @@ -90,7 +322,7 @@ inline void Sub(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape const Shape &output_shape, float *output_data) { int i = 0; - const int size = MatchingFlatSize(input1_shape, input2_shape, output_shape); + const int size = MatchingElementsSize(input1_shape, input2_shape, output_shape); #ifdef USE_NEON const auto activation_min = vdupq_n_f32(params.float_activation_min); const auto activation_max = vdupq_n_f32(params.float_activation_max); @@ -140,12 +372,39 @@ inline void Sub(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape } } -inline void Mul(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, - const float *input1_data, const Shape &input2_shape, const float *input2_data, - const Shape &output_shape, float *output_data) +inline int32_t quant8_mul(const BinaryArithmeticOpParam ¶ms, const uint8_t input1_data, + const uint8_t input2_data) +{ + const int32_t input1_val = params.input1_offset + input1_data; + const int32_t input2_val = params.input2_offset + input2_data; + const int32_t unclamped_result = + params.output_offset + MultiplyByQuantizedMultiplier(input1_val * input2_val, + params.output_multiplier, + params.output_shift); + const int32_t clamped_output = std::min( + params.quantized_activation_max, std::max(params.quantized_activation_min, unclamped_result)); + + return clamped_output; +} + +inline void MulElementwiseQuant8(int size, const BinaryArithmeticOpParam ¶ms, + const uint8_t *input1_data, const uint8_t *input2_data, + uint8_t *output_data) { int i = 0; - const int size = MatchingFlatSize(input1_shape, input2_shape, output_shape); + int32_t clamped_output; + for (; i < size; i++) + { + clamped_output = quant8_mul(params, input1_data[i], input2_data[i]); + output_data[i] = static_cast(clamped_output); + } +} + +inline void MulElementwise(int size, const BinaryArithmeticOpParam ¶ms, + const float *input1_data, const float *input2_data, float *output_data) +{ + int i = 0; + #ifdef USE_NEON const auto activation_min = vdupq_n_f32(params.float_activation_min); const auto activation_max = vdupq_n_f32(params.float_activation_max); @@ -195,6 +454,114 @@ inline void Mul(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape } } +inline void MulQuant8(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const uint8_t *input1_data, const Shape &input2_shape, + const uint8_t *input2_data, const Shape &output_shape, uint8_t *output_data) +{ + const int flat_size = MatchingElementsSize(input1_shape, input2_shape, output_shape); + MulElementwiseQuant8(flat_size, params, input1_data, input2_data, output_data); +} + +inline void Mul(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const float *input1_data, const Shape &input2_shape, const float *input2_data, + const Shape &output_shape, float *output_data) +{ + const int flat_size = MatchingElementsSize(input1_shape, input2_shape, output_shape); + MulElementwise(flat_size, params, input1_data, input2_data, output_data); +} + +inline void MulSimpleBroadcastQuant8(int size, const BinaryArithmeticOpParam ¶ms, + const uint8_t broadcast_value, const uint8_t *input2_data, + uint8_t *output_data) +{ + int i = 0; + int32_t clamped_output; + for (; i < size; ++i) + { + clamped_output = quant8_mul(params, broadcast_value, input2_data[i]); + output_data[i] = static_cast(clamped_output); + } +} + +// Broadcast mul that can often be used for inner loop of broadcast Mul. +// This function will handle scalar_value (LHS) * vector_values (RHS). +// Since it's a float function, input params does not matter here. +inline void MulSimpleBroadcast(int size, const BinaryArithmeticOpParam ¶ms, + const float broadcast_value, const float *input2_data, + float *output_data) +{ + int i = 0; +#ifdef USE_NEON + const float32x4_t output_activation_min_vector = vdupq_n_f32(params.float_activation_min); + const float32x4_t output_activation_max_vector = vdupq_n_f32(params.float_activation_max); + const float32x4_t broadcast_value_dup = vdupq_n_f32(broadcast_value); + for (; i <= size - 4; i += 4) + { + const float32x4_t input2_val_original = vld1q_f32(input2_data + i); + + const float32x4_t output = vmulq_f32(input2_val_original, broadcast_value_dup); + + const float32x4_t clamped = + vmaxq_f32(output_activation_min_vector, vminq_f32(output_activation_max_vector, output)); + vst1q_f32(output_data + i, clamped); + } +#endif // NEON + + for (; i < size; ++i) + { + float x = broadcast_value * input2_data[i]; + output_data[i] = + ActivationFunctionWithMinMax(x, params.float_activation_min, params.float_activation_max); + } +} + +inline void BroadcastMulDispatchQuant8(const BinaryArithmeticOpParam ¶ms, + const Shape &input1_shape, const uint8_t *input1_data, + const Shape &input2_shape, const uint8_t *input2_data, + const Shape &output_shape, uint8_t *output_data) +{ + if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) + { + const std::function + fn = [](const BinaryArithmeticOpParam ¶ms, const uint8_t &a, + const uint8_t &b) -> uint8_t { + return static_cast(quant8_mul(params, a, b)); + }; + reference::BroadcastBinaryArithmeticOpSlowQuant8(params, input1_shape, input1_data, + input2_shape, input2_data, output_shape, + output_data, fn); + return; + } + BinaryBroadcastFiveFold( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(MulElementwiseQuant8), + static_cast(MulSimpleBroadcastQuant8)); +} + +inline void BroadcastMulDispatch(const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, + const float *input1_data, const Shape &input2_shape, + const float *input2_data, const Shape &output_shape, + float *output_data) +{ + if (params.broadcast_category == BroadcastableOpCategory::kGenericBroadcast) + { + // TODO: Use GetBinaryArithmeticFn + const std::function fn = + [](const float &a, const float &b) -> float { return a * b; }; + reference::BroadcastBinaryArithmeticOpSlow(params, input1_shape, input1_data, input2_shape, + input2_data, output_shape, output_data, fn); + return; + } + BinaryBroadcastFiveFold( + params, input1_shape, input1_data, input2_shape, input2_data, output_shape, output_data, + static_cast(MulElementwise), + static_cast( + MulSimpleBroadcast)); +} + } // namespace optimized } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/operation/reference/BatchMatMul.h b/compute/cker/include/cker/operation/reference/BatchMatMul.h new file mode 100644 index 0000000..e8ffd40 --- /dev/null +++ b/compute/cker/include/cker/operation/reference/BatchMatMul.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2020 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_REFERENCE_BATCH_MATMUL_H__ +#define __NNFW_CKER_REFERENCE_BATCH_MATMUL_H__ + +#include "cker/Types.h" +#include "cker/Shape.h" + +namespace nnfw +{ +namespace cker +{ +namespace reference +{ + +inline void BatchMatMul(const Shape &lhs_shape, const float *lhs_data, const Shape &rhs_shape, + const float *rhs_data, const Shape &, float *output_data) +{ + const Shape extended_lhs_shape = Shape::ExtendedShape(5, lhs_shape); + const Shape extended_rhs_shape = Shape::ExtendedShape(5, rhs_shape); + + // Determine which dimension is the broadcast dimension. + auto broadcast_dim = [](int lhs_dim, int rhs_dim) { + if (lhs_dim == rhs_dim) + return lhs_dim; + if (lhs_dim == 1) + return rhs_dim; + assert(rhs_dim == 1); + return lhs_dim; + }; + + // Compute the "extent" for iterating on this dimension. + // If we are broadcasting, then don't advance (i.e return 0). + auto extent = [](const Shape &shape, int x) { + if (shape.Dims(x) == 1) + { + return 0; + } + int prod = 1; + for (int i = x + 1; i < shape.DimensionsCount(); ++i) + { + prod *= shape.Dims(i); + } + return prod; + }; + + const int batch_dim0 = broadcast_dim(extended_lhs_shape.Dims(0), extended_rhs_shape.Dims(0)); + const int batch_dim1 = broadcast_dim(extended_lhs_shape.Dims(1), extended_rhs_shape.Dims(1)); + const int batch_dim2 = broadcast_dim(extended_lhs_shape.Dims(2), extended_rhs_shape.Dims(2)); + + const int lhs_ext0 = extent(extended_lhs_shape, 0); + const int lhs_ext1 = extent(extended_lhs_shape, 1); + const int lhs_ext2 = extent(extended_lhs_shape, 2); + const int rhs_ext0 = extent(extended_rhs_shape, 0); + const int rhs_ext1 = extent(extended_rhs_shape, 1); + const int rhs_ext2 = extent(extended_rhs_shape, 2); + + // Set params for each matrix multiply. + const int lhs_rows = extended_lhs_shape.Dims(3); + const int rhs_cols = extended_rhs_shape.Dims(4); + const int accum_depth = extended_lhs_shape.Dims(4); + + for (int b0 = 0; b0 < batch_dim0; ++b0) + { + const float *lhs_ptr0 = lhs_data + (b0 * lhs_ext0); + const float *rhs_ptr0 = rhs_data + (b0 * rhs_ext0); + for (int b1 = 0; b1 < batch_dim1; ++b1) + { + const float *lhs_ptr1 = lhs_ptr0 + b1 * lhs_ext1; + const float *rhs_ptr1 = rhs_ptr0 + b1 * rhs_ext1; + for (int b2 = 0; b2 < batch_dim2; ++b2) + { + const float *lhs_ptr2 = lhs_ptr1 + b2 * lhs_ext2; + const float *rhs_ptr2 = rhs_ptr1 + b2 * rhs_ext2; + float *out_ptr = + output_data + + ((b0 * batch_dim1 * batch_dim2) + b1 * batch_dim2 + b2) * lhs_rows * rhs_cols; + for (int j = 0; j < rhs_cols; ++j) + { + for (int i = 0; i < lhs_rows; ++i) + { + float total = 0.f; + for (int k = 0; k < accum_depth; ++k) + { + total += lhs_ptr2[accum_depth * i + k] * rhs_ptr2[j * accum_depth + k]; + } + int idx = lhs_rows * j + i; + out_ptr[idx] = total; + } + } + } + } + } +} + +} // namespace reference +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_REFERENCE_BATCH_MATMUL_H__ diff --git a/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h b/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h index 438a671..7a2b896 100644 --- a/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h +++ b/compute/cker/include/cker/operation/reference/BinaryArithmeticOps.h @@ -19,6 +19,7 @@ #define __NNFW_CKER_REFERENCE_BINARYARITHMETICOPS_H__ #include "cker/Shape.h" +#include "cker/Types.h" #include "cker/Utils.h" #include @@ -61,6 +62,125 @@ inline void BinaryArithmeticOp(const BinaryArithmeticOpParam ¶ms, const Shap } } +template +inline void BroadcastBinaryArithmeticOpSlowQuant8( + const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const T *input1_data, + const Shape &input2_shape, const T *input2_data, const Shape &output_shape, T *output_data, + const std::function &fn) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); + const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); + + if ((params.quantized_activation_min < 0) && (params.quantized_activation_max > 255)) + { + throw std::runtime_error{"Support only for Quant8."}; + } + + // Comment from tensorflow lite: + // + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) + { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) + { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) + { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) + { + output_data[Offset(extended_output_shape, b, y, x, c)] = + ActivationFunctionWithMinMax( + fn(params, input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.quantized_activation_min, params.quantized_activation_max); + } + } + } + } +} +template +inline void BroadcastBinaryArithmeticOpSlow(const BinaryArithmeticOpParam ¶ms, + const Shape &input1_shape, const T *input1_data, + const Shape &input2_shape, const T *input2_data, + const Shape &output_shape, T *output_data, + const std::function &fn) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); + const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); + + // Comment from tensorflow lite: + // + // In Tensorflow, the dimensions are canonically named (batch_number, row, + // col, channel), with extents (batches, height, width, depth), with the + // trailing dimension changing most rapidly (channels has the smallest stride, + // typically 1 element). + // + // In generated C code, we store arrays with the dimensions reversed. The + // first dimension has smallest stride. + // + // We name our variables by their Tensorflow convention, but generate C code + // nesting loops such that the innermost loop has the smallest stride for the + // best cache behavior. + for (int b = 0; b < extended_output_shape.Dims(0); ++b) + { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) + { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) + { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) + { + output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( + fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.quantized_activation_min, params.quantized_activation_max); + } + } + } + } +} + +template <> +inline void BroadcastBinaryArithmeticOpSlow( + const BinaryArithmeticOpParam ¶ms, const Shape &input1_shape, const float *input1_data, + const Shape &input2_shape, const float *input2_data, const Shape &output_shape, + float *output_data, const std::function &fn) +{ + NdArrayDesc<4> desc1; + NdArrayDesc<4> desc2; + NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, &desc2); + const Shape extended_output_shape = Shape::ExtendedShape(4, output_shape); + + for (int b = 0; b < extended_output_shape.Dims(0); ++b) + { + for (int y = 0; y < extended_output_shape.Dims(1); ++y) + { + for (int x = 0; x < extended_output_shape.Dims(2); ++x) + { + for (int c = 0; c < extended_output_shape.Dims(3); ++c) + { + output_data[Offset(extended_output_shape, b, y, x, c)] = ActivationFunctionWithMinMax( + fn(input1_data[SubscriptToIndex(desc1, b, y, x, c)], + input2_data[SubscriptToIndex(desc2, b, y, x, c)]), + params.float_activation_min, params.float_activation_max); + } + } + } + } +} + } // namespace reference } // namespace cker } // namespace nnfw diff --git a/compute/cker/include/cker/ruy/RuySupport.h b/compute/cker/include/cker/ruy/RuySupport.h new file mode 100644 index 0000000..432b181 --- /dev/null +++ b/compute/cker/include/cker/ruy/RuySupport.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved + * Copyright 2017 The TensorFlow Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __NNFW_CKER_RUY_RUY_SUPPORT_H__ +#define __NNFW_CKER_RUY_RUY_SUPPORT_H__ + +#include +#include +#include "cker/Types.h" + +namespace +{ +const int kDefaultNumThreadpoolThreads = 4; +} + +namespace nnfw +{ +namespace cker +{ +namespace ruy_support +{ + +struct RuyContext +{ +public: + RuyContext() : ruy_context_(new ruy::Context) + { + SetMaxNumThreads(onert::util::getConfigInt(onert::util::config::RUY_THREADS)); +#ifdef USE_RUY_GEMV + ruy_context_->cache_policy = ruy::kCacheLHSOnNarrowMul; +#endif + }; + + ruy::Context *ruy_context() const { return ruy_context_.get(); } + + static inline RuyContext &GetRuyContext() + { + static thread_local RuyContext instance; + return instance; + } + + void SetMaxNumThreads(int max_num_threads) + { + const int target_num_threads = + max_num_threads > -1 ? max_num_threads : kDefaultNumThreadpoolThreads; + ruy_context_->max_num_threads = target_num_threads; + } + +private: + const std::unique_ptr ruy_context_; +}; + +inline ruy::Context *GetRuyContext() +{ + auto &ctx = RuyContext::GetRuyContext(); + return ctx.ruy_context(); +} + +template +void MakeRuyMatrix(const MatrixParams ¶ms, DataPointer data_ptr, + ruy::Matrix *dst) +{ + dst->layout.rows = params.rows; + dst->layout.cols = params.cols; + if (params.order == Order::kColMajor) + { + dst->layout.order = ruy::Order::kColMajor; + dst->layout.stride = params.rows; + } + else + { + dst->layout.order = ruy::Order::kRowMajor; + dst->layout.stride = params.cols; + } + // Note that ruy::Matrix::data is a ConstCheckingPtr, not a plain pointer. + // It does care whether we assign to it a Scalar* or a const Scalar*. + dst->data = data_ptr; + dst->zero_point = params.zero_point; + dst->cacheable = params.cacheable; +} + +template +void MakeRuySpec(const GemmParamsType ¶ms, RuySpecType *ruy_spec) +{ + // This validation has already been performed by the Gemm API entry point, + // but it doesn't hurt to test specifically this again here, where it's + // being used. + ValidateGemmParams(params); + + ruy_spec->multiplier_fixedpoint = params.multiplier_fixedpoint; + ruy_spec->multiplier_exponent = params.multiplier_exponent; + ruy_spec->multiplier_fixedpoint_perchannel = params.multiplier_fixedpoint_perchannel; + ruy_spec->multiplier_exponent_perchannel = params.multiplier_exponent_perchannel; + ruy_spec->bias = params.bias; + ruy_spec->clamp_min = params.clamp_min; + ruy_spec->clamp_max = params.clamp_max; +} + +} // namespace ruy_support +} // namespace cker +} // namespace nnfw + +#endif // __NNFW_CKER_RUY_RUY_SUPPORT_H__ diff --git a/compute/test/CMakeLists.txt b/compute/test/CMakeLists.txt new file mode 100644 index 0000000..c016d2b --- /dev/null +++ b/compute/test/CMakeLists.txt @@ -0,0 +1,13 @@ +set(TEST_COMPUTE test_compute) + +file(GLOB_RECURSE TESTS "*.cc") + +add_executable(${TEST_COMPUTE} ${TESTS}) + +target_link_libraries(${TEST_COMPUTE} nnfw_lib_cker) +target_link_libraries(${TEST_COMPUTE} gtest) +target_link_libraries(${TEST_COMPUTE} gtest_main) +target_link_libraries(${TEST_COMPUTE} ${LIB_PTHREAD} dl) +add_test(${TEST_COMPUTE} ${TEST_COMPUTE}) + +install(TARGETS ${TEST_COMPUTE} DESTINATION unittest_standalone) diff --git a/compute/test/cker/Range.cc b/compute/test/cker/Range.cc new file mode 100644 index 0000000..55f4fcf --- /dev/null +++ b/compute/test/cker/Range.cc @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +TEST(CKer_Operation, Range) +{ + { + const int start = 0; + const int limit = 10; + const int delta = 1; + std::vector actual(10); + nnfw::cker::Range(&start, &limit, &delta, actual.data()); + + for (int i = 0; i < actual.size(); i++) + ASSERT_EQ(actual[i], i); + } + + { + const int start = 3; + const int limit = 18; + const int delta = 3; + std::vector expected = {3, 6, 9, 12, 15}; + std::vector actual(expected.size()); + nnfw::cker::Range(&start, &limit, &delta, actual.data()); + + for (int i = 0; i < actual.size(); i++) + ASSERT_EQ(actual[i], expected[i]); + } + + { + const float start = 3; + const float limit = 1; + const float delta = -0.5; + std::vector expected = { + 3, 2.5, 2, 1.5, + }; + std::vector actual(expected.size()); + nnfw::cker::Range(&start, &limit, &delta, actual.data()); + + for (int i = 0; i < actual.size(); i++) + ASSERT_FLOAT_EQ(actual[i], expected[i]); + } +} + +TEST(CKer_Operation, neg_Range) +{ + { + const int start = 212; + const int limit = 10; + const int delta = 1; + std::vector actual(10); + + EXPECT_ANY_THROW(nnfw::cker::Range(&start, &limit, &delta, actual.data())); + } +} diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/common-ir/index.rst b/docs/common-ir/index.rst new file mode 100644 index 0000000..0f8c1ef --- /dev/null +++ b/docs/common-ir/index.rst @@ -0,0 +1,14 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Common IR +========= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./introduction-to-circle.md + ./what-is-common-ir.md diff --git a/docs/common-ir/introduction-to-circle.md b/docs/common-ir/introduction-to-circle.md new file mode 100644 index 0000000..30b4517 --- /dev/null +++ b/docs/common-ir/introduction-to-circle.md @@ -0,0 +1 @@ +# Introduction to circle diff --git a/docs/common-ir/what-is-common-ir.md b/docs/common-ir/what-is-common-ir.md new file mode 100644 index 0000000..33afdc7 --- /dev/null +++ b/docs/common-ir/what-is-common-ir.md @@ -0,0 +1 @@ +# What is Common IR diff --git a/docs/compiler/backend.rst b/docs/compiler/backend.rst new file mode 100644 index 0000000..2e14d66 --- /dev/null +++ b/docs/compiler/backend.rst @@ -0,0 +1,12 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Backend +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + diff --git a/docs/compiler/compiler b/docs/compiler/compiler new file mode 120000 index 0000000..9b713b9 --- /dev/null +++ b/docs/compiler/compiler @@ -0,0 +1 @@ +../../compiler/ \ No newline at end of file diff --git a/docs/compiler/frontend.rst b/docs/compiler/frontend.rst new file mode 100644 index 0000000..3385b74 --- /dev/null +++ b/docs/compiler/frontend.rst @@ -0,0 +1,22 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Frontend +======== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./compiler/caffe2circle/README.md + ./compiler/circle2circle/README.md + ./compiler/enco/README.md + ./compiler/nnc/README.md + ./compiler/onnx2circle/README.md + ./compiler/tf2circle/README.md + ./compiler/tf2nnpkg/README.md + ./compiler/tf2tflite/README.md + ./compiler/tf2tfliteV2/README.md + ./compiler/tflite2circle/README.md diff --git a/docs/compiler/index.rst b/docs/compiler/index.rst new file mode 100644 index 0000000..8db9543 --- /dev/null +++ b/docs/compiler/index.rst @@ -0,0 +1,20 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Compiler +======== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./frontend + ./middleend + ./backend + ./ir + ./interpreters + ./libraries + ./tools + diff --git a/docs/compiler/interpreters.rst b/docs/compiler/interpreters.rst new file mode 100644 index 0000000..e1e1dfd --- /dev/null +++ b/docs/compiler/interpreters.rst @@ -0,0 +1,14 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Interpreter +=========== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./compiler/locomotiv/README.md + ./compiler/mir-interpreter/README.md diff --git a/docs/compiler/ir.rst b/docs/compiler/ir.rst new file mode 100644 index 0000000..957f34e --- /dev/null +++ b/docs/compiler/ir.rst @@ -0,0 +1,36 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +IR +== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./compiler/coco/README.md + + ./compiler/loco/README.md + ./compiler/loco/doc/LEP_000_Dialect_Service.md + + ./compiler/luci/README.md + ./compiler/luci/export/README.md + ./compiler/luci/import/README.md + ./compiler/luci/lang/README.md + ./compiler/luci/logex/README.md + ./compiler/luci/log/README.md + ./compiler/luci/pass/README.md + ./compiler/luci/service/README.md + + ./compiler/mir/Readme.md + + ./compiler/moco/README.md + ./compiler/moco/import/README.md + ./compiler/moco/lang/README.md + ./compiler/moco/pass/README.md + ./compiler/moco/service/README.md + ./compiler/moco/support/README.md + + ./compiler/oneco/README.md diff --git a/docs/compiler/libraries.rst b/docs/compiler/libraries.rst new file mode 100644 index 0000000..9a7d7c1 --- /dev/null +++ b/docs/compiler/libraries.rst @@ -0,0 +1,60 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Libraries +========= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./compiler/adtidas/README.md + ./compiler/angkor/README.md + ./compiler/bino/README.md + ./compiler/cli/README.md + ./compiler/cwrap/README.md + ./compiler/enco-intf/README.md + ./compiler/fipe/README.md + ./compiler/hermes/README.md + ./compiler/hermes-std/README.md + ./compiler/kuma/README.md + ./compiler/locop/README.md + ./compiler/mio-circle/README.md + ./compiler/mio-tf/README.md + ./compiler/mio-tflite/README.md + ./compiler/moco-log/README.md + ./compiler/morph/README.md + ./compiler/nest/README.md + ./compiler/nike/README.md + ./compiler/nnop/README.md + ./compiler/nnsuite/README.md + ./compiler/oops/README.md + ./compiler/pepper-assert/README.md + ./compiler/pepper-env/README.md + ./compiler/pepper-str/README.md + ./compiler/pepper-strcast/README.md + ./compiler/plier-tf/README.md + ./compiler/pp/README.md + ./compiler/safemain/README.md + ./compiler/stdex/README.md + ./compiler/v4tf/README.md + + For Validataion + --------------- + + ./compiler/ann-api/README.md + ./compiler/ann-ref/README.md + ./compiler/dredd-rule-lib/README.md + ./compiler/gen-core/README.md + + ./compiler/nnkit-caffe/README.md + ./compiler/nnkit-intf/README.md + ./compiler/nnkit-misc/README.md + ./compiler/nnkit-mocotf/README.md + ./compiler/nnkit-onnxrt/README.md + ./compiler/nnkit-tf/README.md + ./compiler/nnkit-tflite/README.md + ./compiler/tfinfo/README.md + ./compiler/tfinfo-v2/README.md diff --git a/docs/compiler/middleend.rst b/docs/compiler/middleend.rst new file mode 100644 index 0000000..12b39ec --- /dev/null +++ b/docs/compiler/middleend.rst @@ -0,0 +1,21 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Middleend +========= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./compiler/exo/README.md + ./compiler/locoex-customop/README.md + ./compiler/logo/README.md + ./compiler/logo-core/README.md + ./compiler/mir2loco/README.md + + ./compiler/moco-tf/README.md + ./compiler/moco-tf/doc/Conversion.md + diff --git a/docs/compiler/tools.rst b/docs/compiler/tools.rst new file mode 100644 index 0000000..b30870d --- /dev/null +++ b/docs/compiler/tools.rst @@ -0,0 +1,66 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Tools +===== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + For nnc + ------- + + ./compiler/nnc/utils/caffe_model_maker/README.md + ./compiler/nnc/utils/infer_tests/README.md + ./compiler/nnc/utils/model_runner/readme.md + ./compiler/nnc/utils/prepare_inputs/README.md + + For Validation + -------------- + + ./compiler/caffegen/README.md + ./compiler/circle-inspect/README.md + ./compiler/circle-verify/README.md + ./compiler/circlechef/README.md + ./compiler/circledump/README.md + ./compiler/encodump/README.md + ./compiler/gen-tf-input/README.md + ./compiler/gen-tf-output/README.md + ./compiler/gen-tflite-output/README.md + ./compiler/i5diff/README.md + ./compiler/nnkit/README.md + ./compiler/onnxkit/README.md + ./compiler/tfgraph-xform/README.md + ./compiler/tfkit/README.md + ./compiler/tfl-inspect/README.md + ./compiler/tfl-verify/README.md + ./compiler/tflchef/README.md + ./compiler/tfldump/README.md + + Test Driver + ----------- + + ./compiler/tfts/README.md + + For CI + ------ + + ./compiler/circle2circle-dredd-pbtxt-test/README.md + ./compiler/moco-value-pbtxt-test/README.md + ./compiler/oneco-value-pbtxt-test/README.md + ./compiler/onnx2tflite-integration-test/README.md + ./compiler/tf2circle-conversion-test/README.md + ./compiler/tf2circle-dredd-pb-test/README.md + ./compiler/tf2circle-dredd-pbtxt-test/README.md + ./compiler/tf2circle-model-test/README.md + ./compiler/tf2circle-ui-check/README.md + ./compiler/tf2circle-value-pbtxt-remote-test/README.md + ./compiler/tf2tflite-dredd-pb-test/README.md + ./compiler/tf2tflite-dredd-pbtxt-test/README.md + ./compiler/tf2tflite-value-pb-test/README.md + ./compiler/tf2tflite-value-pbtxt-test/README.md + ./compiler/tf2tfliteV2-conversion-test/README.md + ./compiler/tflite2circle-conversion-test/README.md diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..3abe4f4 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,51 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + +# -- Project information ----------------------------------------------------- + +project = 'ONE(On-device Neural Engine)' +copyright = '2020, Samsung Research & contributors' +author = 'Samsung Research & contributors' + +# The full version, including alpha/beta/rc tags +release = '1.7.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['recommonmark', 'sphinx_markdown_tables'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/docs/contents.rst b/docs/contents.rst new file mode 100644 index 0000000..4e8492b --- /dev/null +++ b/docs/contents.rst @@ -0,0 +1,29 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to ONE's documentation! +=============================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./overview/index + ./howto/index + ./runtime/index + ./compiler/index + ./common-ir/index + ./package/index + ./platform/index + ./device/index + ./test/index + ./release/index + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/device/index.rst b/docs/device/index.rst new file mode 100644 index 0000000..9990043 --- /dev/null +++ b/docs/device/index.rst @@ -0,0 +1,15 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Devices +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./odroid-xu3.md + ./odroid-xu4.md + ./raspberry-pi-3.md diff --git a/docs/device/odroid-xu3.md b/docs/device/odroid-xu3.md new file mode 100644 index 0000000..57825b7 --- /dev/null +++ b/docs/device/odroid-xu3.md @@ -0,0 +1 @@ +# ODROID-XU3 diff --git a/docs/device/odroid-xu4.md b/docs/device/odroid-xu4.md new file mode 100644 index 0000000..363e2cd --- /dev/null +++ b/docs/device/odroid-xu4.md @@ -0,0 +1 @@ +# ODROID-XU4 diff --git a/docs/device/raspberry-pi-3.md b/docs/device/raspberry-pi-3.md new file mode 100644 index 0000000..51152f3 --- /dev/null +++ b/docs/device/raspberry-pi-3.md @@ -0,0 +1 @@ +# Raspberry Pi 3 diff --git a/docs/howto/how-to-add-a-new-operation.md b/docs/howto/how-to-add-a-new-operation.md new file mode 100644 index 0000000..8ea7014 --- /dev/null +++ b/docs/howto/how-to-add-a-new-operation.md @@ -0,0 +1,9 @@ +# How to Add a New Operation + +## Compiler + +- [How to introduce a new operation into compiler](how-to-introduce-a-new-operation-into-compiler.md) + +## Runtime + +- [How to introduce a new operatoin into runtime](how-to-introduce-a-new-operation-into-runtime.md) diff --git a/docs/howto/how-to-build-compiler.md b/docs/howto/how-to-build-compiler.md new file mode 100644 index 0000000..e9dcb26 --- /dev/null +++ b/docs/howto/how-to-build-compiler.md @@ -0,0 +1,7 @@ +# How to Build Compiler + +## Build Requires + +## Build for Ubuntu + +## Build for windows diff --git a/docs/howto/how-to-build-package.md b/docs/howto/how-to-build-package.md new file mode 100644 index 0000000..65cc3c7 --- /dev/null +++ b/docs/howto/how-to-build-package.md @@ -0,0 +1 @@ +# How to Build Package diff --git a/docs/howto/how-to-build-runtime-using-prebuilt-docker-image.md b/docs/howto/how-to-build-runtime-using-prebuilt-docker-image.md new file mode 100644 index 0000000..b716d38 --- /dev/null +++ b/docs/howto/how-to-build-runtime-using-prebuilt-docker-image.md @@ -0,0 +1,2 @@ +# How to Build Using Prebuilt Docker Image + diff --git a/docs/howto/how-to-build-runtime.md b/docs/howto/how-to-build-runtime.md new file mode 100644 index 0000000..2bfd14c --- /dev/null +++ b/docs/howto/how-to-build-runtime.md @@ -0,0 +1,228 @@ +# How to Build Runtime + +This document is based on the system where Ubuntu Desktop Linux 18.04 LTS is installed with default settings, and can be applied in other environments without much difference. For reference, the development of our project started in the Ubuntu Desktop Linux 16.04 LTS environment. + +## Build requirements + +If you are going to build this project, the following modules must be installed on your system: + +- CMake +- Boost C++ libraries + +In the Ubuntu, you can easily install it with the following command. + +``` +$ sudo apt-get install cmake libboost-all-dev +``` + +If your linux system does not have the basic development configuration, you will need to install more packages. A list of all packages needed to configure the development environment can be found in the https://github.com/Samsung/ONE/blob/master/infra/docker/Dockerfile.1804 file. + +Here is a summary of it + +``` +$ sudo apt install \ +build-essential \ +clang-format-3.9 \ +cmake \ +doxygen \ +git \ +graphviz \ +hdf5-tools \ +lcov \ +libatlas-base-dev \ +libboost-all-dev \ +libgflags-dev \ +libgoogle-glog-dev \ +libgtest-dev \ +libhdf5-dev \ +libprotobuf-dev \ +protobuf-compiler \ +pylint \ +python3 \ +python3-pip \ +python3-venv \ +scons \ +software-properties-common \ +unzip \ +wget + +$ mkdir /tmp/gtest +$ cd /tmp/gtest +$ cmake /usr/src/gtest +$ make +$ sudo mv *.a /usr/lib + +$ pip install yapf==0.22.0 numpy + +``` + +## Build from source code, for Ubuntu + +In a typical linux development environment, including Ubuntu, you can build the runtime with a simple command like this: + +``` +$ git clone https://github.com/Samsung/ONE.git one +$ cd one +$ cp -n Makefile.template Makefile; make install +``` + +Unfortunately, the debug build on the x86_64 architecture currently has an error. To solve the problem, you must use gcc version 9 or higher. Another workaround is to do a release build rather than a debug build. This is not a suitable method for debugging during development, but it is enough to check the function of the runtime. To release build the runtime, add the environment variable `BUILD_TYPE=release` to the build command as follows. + +``` +$ export BUILD_TYPE=release +$ make install +``` + +Or you can simply do something like this: + +``` +$ BUILD_TYPE=release make install +``` + +The build method described here is a `native build` in which the build environment and execution environment are same. So, this command creates a runtime binary targeting the current build architecture, probably x86_64, as the execution environment. You can find the build output in the ./Product folder as follows: + +``` +$ tree -L 2 ./Product +./Product +├── obj -> /home/sjlee/star/one/Product/x86_64-linux.debug/obj +├── out -> /home/sjlee/star/one/Product/x86_64-linux.debug/out +└── x86_64-linux.debug + ├── BUILD + ├── CONFIGURE + ├── INSTALL + ├── obj + └── out + +5 directories, 3 files + +$ tree -L 3 ./Product/out +./Product/out +├── bin +│   ├── nnapi_test +│   ├── nnpackage_run +│   ├── tflite_loader_test_tool +│   └── tflite_run +├── include +│   ├── nnfw +│   │   ├── NeuralNetworksEx.h +│   │   ├── NeuralNetworksExtensions.h +│   │   ├── NeuralNetworks.h +│   │   ├── nnfw_dev.h +│   │   └── nnfw.h +│   └── onert +│   ├── backend +│   ├── compiler +│   ├── exec +│   ├── ir +│   ├── misc +│   └── util +├── lib +│   ├── libbackend_cpu.so +│   ├── libcircle_loader.so +│   ├── libneuralnetworks.so +│   ├── libnnfw-dev.so +│   ├── libnnfw_lib_benchmark.so +│   ├── libnnfw_lib_misc.a +│   ├── libonert_core.so +│   └── libtflite_loader.so +├── tests +│   ├── FillFrom_runner +│   ├── nnpkgs +│   │   └── FillFrom +│   └── scripts +│   ├── benchmark_nnapi.sh +│   ├── benchmark_nnpkg.sh +│   ├── common.sh +│   ├── framework +│   ├── list +│   ├── print_to_json.sh +│   ├── test-driver.sh +│   ├── test_framework.sh +│   ├── test_scheduler_with_profiling.sh +│   └── unittest.sh +├── unittest +│   ├── nnapi_gtest +│   ├── nnapi_gtest.skip +│   ├── nnapi_gtest.skip.noarch.interp +│   ├── nnapi_gtest.skip.x86_64-linux.cpu +│   ├── test_compute +│   ├── test_onert +│   ├── test_onert_backend_cpu_common +│   ├── test_onert_frontend_nnapi +│   └── tflite_test +└── unittest_standalone + └── nnfw_api_gtest + +19 directories, 36 files + +``` + +Here, let's recall that the main target of our project is the arm architecture. If you have a development environment running Linux for arm on a device made of an arm CPU, such as Odroid-XU4, you will get a runtime binary that can be run on the arm architecture with the same command above. This is the simplest way to get a binary for an arm device. However, in most cases, native builds on arm devices are too impractical as they require too long. Therefore, we will create an executable binary of an architecture other than x86_64 through a `cross build`. For cross-build method for each architecture, please refer to the corresponding document in the following section, [How to cross-build runtime for different architecture](#how-to-cross-build-runtime-for-different-architecture). + +### Run test + +The simple way to check whether the build was successful is to perform inference of the NN model using the runtime. The model to be used for the test can be obtained as follows. + +``` +$ wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/model_zoo/upload_20180427/inception_v3_2018_04_27.tgz +$ tar zxvf inception_v3_2018_04_27.tgz ./inception_v3.tflite +$ ls *.tflite +inception_v3.tflite +``` + +The result of running the inception_v3 model using runtime is as follows. Please consider that this is a test that simply checks execution latency without considering the accuracy of the model. + +``` +$ USE_NNAPI=1 LD_LIBRARY_PATH="./Product/out/lib/:$LD_LIBRARY_PATH" ./Product/out +/bin/tflite_run ./inception_v3.tflite +nnapi function 'ANeuralNetworksModel_create' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_addOperand' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_setOperandValue' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_addOperation' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_identifyInputsAndOutputs' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_finish' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksCompilation_create' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksCompilation_finish' is loaded from './Product/out/lib/libneuralnetworks.so' +input tensor indices = [317,] +nnapi function 'ANeuralNetworksExecution_create' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksExecution_setInput' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksExecution_setOutput' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksExecution_startCompute' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksEvent_wait' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksEvent_free' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksExecution_free' is loaded from './Product/out/lib/libneuralnetworks.so' +... run 1 takes 183.895 ms +output tensor indices = [316(max:905),] +=================================== +MODEL_LOAD takes 1.108 ms +PREPARE takes 0.190 ms +EXECUTE takes 183.895 ms +- MEAN : 183.895 ms +- MAX : 183.895 ms +- MIN : 183.895 ms +- GEOMEAN : 183.895 ms +=================================== +nnapi function 'ANeuralNetworksCompilation_free' is loaded from './Product/out/lib/libneuralnetworks.so' +nnapi function 'ANeuralNetworksModel_free' is loaded from './Product/out/lib/libneuralnetworks.so' +``` +Here, `USE_NNAPI=1` means that **ONE** runtime is used for model inference. If omitted, the model will be executed using Tensorflow lite, the basic framework for verification. `LD_LIBRARY_PATH="./Product/out/lib/:$LD_LIBRARY_PATH"` specifies the location of the runtime library to be used for testing. From the previous build result, you can see that it is the path to the directory where `libneuralnetworks.so` and `libonert_core.so` are located. + +If you come here without any problems, you have all of the basic environments for runtime development. + +## Build for Tizen + +(Will be written) + +## Build using docker image + +If your development system is not a linux environment like Ubuntu, but you can use docker on your system, you can build a runtime using a pre-configured docker image. Of course, you can also build a runtime using a docker image in a ubuntu environment, without setting up a complicated development environment. For more information, please refer to the following document. + +- [Build using prebuilt docker image](how-to-build-runtime-using-prebuilt-docker-image.md) + +## How to cross-build runtime for different architecture + +Please refer to the following document for the build method for architecture other than x86_64, which is the basic development environment. + +- [Cross building for ARM](how-to-cross-build-runtime-for-arm.md) +- [Cross building for AARCH64](how-to-cross-build-runtime-for-aarch64.md) +- [Cross building for Android](how-to-cross-build-runtime-for-android.md) diff --git a/docs/howto/how-to-contribute.md b/docs/howto/how-to-contribute.md new file mode 100644 index 0000000..fe7b140 --- /dev/null +++ b/docs/howto/how-to-contribute.md @@ -0,0 +1,72 @@ +# How to Contribute + +**ONE** always welcomes your contribution, but there are basic guidelines that you should follow in +order to make your contribution be accepted. + +This document explains such guidelines for beginners. + +## General contribution guidelines + +If you are not familiar with git or github, please visit +[here](https://guides.github.com/activities/hello-world/) for basic understanding of git and github. + +## How to create a Pull Request + +This section explains the steps to create a pull request (PR). + +1. Create an issue + + Maintainers will accept your contribution only when it is well aligned with the + [roadmap](../overview/roadmap.md) and design + principles of **ONE**. So, it is optional, but recommended for contributors to create an issue + and have a discussion with maintainers before writing code. + +1. Create a draft PR + + Maintainers will accept your pull request only when it is **reasonably small** and **focused**. + Sometimes, your contribution may require huge and loosely-coupled changes. You **should** split + your contribution into multiple small, but focused pull requests in this case. Unfortunately, it + is possible that maintainers reject your pull request as it is hard for them to understand the + intuition behind these changes. So, it is optional, but recommended for contributors to present + the full [draft](https://github.com/Samsung/ONE/pulls?q=is%3Apr+label%3ADRAFT+) of your + contribution and have a discussion with maintainers before creating PR(s). + +1. Create a commit + + It is time to create a commit for submission once you are convinced that your contribution is + ready to go. Please include signed-off message at the end of commit message. If not, your pull + request will be **rejected** by CI. + +1. Check code format locally + + **ONE** has its code formatting rules, and any pull request that violates these rules will be + **rejected** by CI. So, it is optional, but recommended for contributor to check code format + locally before submission. + +1. Create a PR + + It is time to send a pull request. Please explain your intention via description. Maintainers + will review your pull request based on that description. Each pull request needs approval from at + least two reviewers to be accepted. Note that **description should include at least four words**. + If not, your pull request will be **rejected** by CI. + +1. Request review + + It is recommended to assign reviewers yourself. Maintainers will honor your review request, + and accept your pull request only when + + - Approved by 1+ reviewers + - 0 rejection(Request Changes) + - 0 pending review request + - All the reviewers in the list must approve your pull request + + You can add/remove pending review requests in the middle of the review process. Maintainers + (or reviewers) could review your pull request even without explicit review request. + +1. Update per feedback + + Sometimes, maintainers (or reviewers) will request changes on your pull request. Please update + your pull request upon such feedbacks. These update commits will be squashed into the first + commit of your pull request later. Please do **NOT** include a sign-off message or write a full + description for update commits. + diff --git a/docs/howto/how-to-cross-build-runtime-for-aarch64.md b/docs/howto/how-to-cross-build-runtime-for-aarch64.md new file mode 100644 index 0000000..b30ce34 --- /dev/null +++ b/docs/howto/how-to-cross-build-runtime-for-aarch64.md @@ -0,0 +1,100 @@ +# How to Cross-build Runtime for AARCH64 + +In **ONE**, we use `AARCH64` on build files such as Makefile, CMakeLists.txt and so on. + +## Prepare AARCH64 Ubuntu RootFS + +Install required packages + +``` +$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap +``` + +Use `install_rootfs.sh` script to prepare Root File System. You should have `sudo` + +``` +$ sudo ./tools/cross/install_rootfs.sh aarch64 +``` +- supports `arm`(default) and `aarch64` architecutre for now +- supports `xenial`(default), `trusty` and `bionic` release + +To see the options, +``` +$ ./tools/cross/install_rootfs.sh -h +``` + +RootFS will be prepared at `tools/cross/rootfs/aarch64` folder. + +***\* CAUTION: The OS version of rootfs must match the OS version of execution target device. On the other hand, you need to match the Ubuntu version of the development PC with the Ubuntu version of rootfs to be used for cross-build. Otherwise, unexpected build errors may occur.*** + +If you are using Ubuntu 16.04 LTS, select `xenial`, if you are using Ubuntu 18.04 LTS, select `bionic`. You can check your Ubuntu code name in the following way. + +``` +$ cat /etc/lsb-release +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=18.04 +DISTRIB_CODENAME=bionic +DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS" +``` + +If a build error occurs because the version of the development system and the target system do not match, and if you can't replace your development system for any reason, you can consider [cross-build using the docker image](how-to-build-runtime-using-prebuilt-docker-image.md). + +### Prepare RootFS at alternative folder + +Use `ROOTFS_DIR` to a full path to prepare at alternative path. + +``` +$ ROOTFS_DIR=/home/user/rootfs/aarch64-xenial sudo -E ./tools/cross/install_rootfs.sh aarch64 +``` + +### Using proxy + +If you need to use proxy server while building the rootfs, use `--setproxy` option. + +``` +# for example, +$ sudo ./tools/cross/install_rootfs.sh aarch64 --setproxy="1.2.3.4:8080" +# or +$ sudo ./tools/cross/install_rootfs.sh aarch64 --setproxy="proxy.server.com:8888" +``` + +This will put `apt` proxy settings in `rootfs/etc/apt/apt.conf.d/90proxy` file +for `http`, `https` and `ftp` protocol. + +## Cross build for AARCH64 + +Install cross compilers +``` +$ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu +``` + +Give `TARGET_ARCH` variable to set the target architecture +``` +$ CROSS_BUILD=1 TARGET_ARCH=aarch64 make +$ CROSS_BUILD=1 TARGET_ARCH=aarch64 make install +``` +- supports `armv7l` and `aarch64` for now + +If you used `ROOTFS_DIR` to prepare in alternative folder, +you should also give this to makefile. +``` +$ CROSS_BUILD=1 ROOTFS_DIR=/home/user/rootfs/aarch64-xenial TARGET_ARCH=aarch64 make +$ CROSS_BUILD=1 ROOTFS_DIR=/home/user/rootfs/aarch64-xenial TARGET_ARCH=aarch64 make install +``` +You can also omit the `CROSS_BUILD=1` option if you explicitly pass `ROOTFS_DIR`. In that case, if +the `TARGET_ARCH` are differs from the hostarchitecture, the make script automatically applies +`CROSS_BUILD=1`. So, if you set `ROOTFS_DIR` as an environment variable, you can simply perform +normal build and cross build as follows. + +``` +$ export ROOTFS_DIR=xxx +... +$ make all install # do normal build +$ TARGET_ARCH=aarch64 make all install # do cross build +``` + +### Run test + +To run and test the cross-compiled runtime, you need to copy the compiled output to the target device of the architecture in which it is executable. Please refer to the following document for details on the test procedure. In the guide, `armv7l-linux.debug` in path should be replaced by referring to your build result. + +- [Testing neural network model inference with a cross-build runtime](./how-to-cross-build-runtime-for-arm.md#run-test) diff --git a/docs/howto/how-to-cross-build-runtime-for-android.md b/docs/howto/how-to-cross-build-runtime-for-android.md new file mode 100644 index 0000000..13984a0 --- /dev/null +++ b/docs/howto/how-to-cross-build-runtime-for-android.md @@ -0,0 +1,2 @@ +# How to Cross-build Runtime for Android + diff --git a/docs/howto/how-to-cross-build-runtime-for-arm.md b/docs/howto/how-to-cross-build-runtime-for-arm.md new file mode 100644 index 0000000..c17c465 --- /dev/null +++ b/docs/howto/how-to-cross-build-runtime-for-arm.md @@ -0,0 +1,164 @@ +# How to Cross-build Runtime for ARM + +## Prepare ARM Ubuntu RootFS + +Install required packages + +``` +$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap +``` + +Use `install_rootfs.sh` script to prepare Root File System. You should have `sudo` + +``` +$ sudo ./tools/cross/install_rootfs.sh arm +``` +- supports `arm`(default) and `aarch` architecutre for now +- supports `xenial`(default) `trusty`, and `bionic` release + +To see the options, +``` +$ ./tools/cross/install_rootfs.sh -h +``` + +RootFS will be prepared at `tools/cross/rootfs/arm` folder. + +***\* CAUTION: The OS version of rootfs must match the OS version of execution target device. On the other hand, you need to match the Ubuntu version of the development PC with the Ubuntu version of rootfs to be used for cross-build. Otherwise, unexpected build errors may occur.*** + +If you are using Ubuntu 16.04 LTS, select `xenial`, if you are using Ubuntu 18.04 LTS, select `bionic`. You can check your Ubuntu code name in the following way. + +``` +$ cat /etc/lsb-release +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=18.04 +DISTRIB_CODENAME=bionic +DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS" +``` + +If a build error occurs because the version of the development system and the target system do not match, and if you can't replace your development system for any reason, you can consider [cross-build using the docker image](how-to-build-runtime-using-prebuilt-docker-image.md). + +### Prepare RootFS at alternative folder + +Use `ROOTFS_DIR` to a full path to prepare at alternative path. + +``` +$ ROOTFS_DIR=/home/user/rootfs/arm-xenial sudo -E ./tools/cross/install_rootfs.sh arm +``` + +### Using proxy + +If you need to use proxy server while building the rootfs, use `--setproxy` option. + +``` +# for example, +$ sudo ./tools/cross/install_rootfs.sh arm --setproxy="1.2.3.4:8080" +# or +$ sudo ./tools/cross/install_rootfs.sh arm --setproxy="proxy.server.com:8888" +``` + +This will put `apt` proxy settings in `rootfs/etc/apt/apt.conf.d/90proxy` file +for `http`, `https` and `ftp` protocol. + +## Install ARM Cross Toolchain + +We recommend you have g++ >= 6 installed on your system because NN generated tests require it. + +- On Ubuntu 16.04 or older, follow the next steps: + +``` +$ cd ~/your/path +$ wget https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz +$ tar xvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz +$ echo 'export PATH=~/your/path/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf/bin:$PATH' >> ~/.bashrc +``` + +- On Ubuntu 18.04 LTS, you can install using `apt-get`. +Choose g++ version whatever you prefer: 6, 7 or 8. + +``` +$ sudo apt-get install g++-{6,7,8}-arm-linux-gnueabihf +``` + +Make sure you get `libstdc++.so` updated on your target with your new toolchain's corresponding one. + +For example, if you installed gcc-linaro-7.2.1-2017.11 above, do + +``` +$ wget https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabihf/runtime-gcc-linaro-7.2.1-2017.11-arm-linux-gnueabihf.tar.xz +$ tar xvf runtime-gcc-linaro-7.2.1-2017.11-arm-linux-gnueabihf.tar.xz +``` + +Then, copy `libstdc++.so.6.0.24` into `/usr/lib/arm-linux-gnueabihf`, and update symbolic links on your device. + +## Build and install ARM Compute Library + +Mostly you only need once of ACL build. + +ACL will be automatically installed in `externals/acl` when you build runtime without any changes. + +You can check ACL source information in `cmake/packages/ARMComputeSourceConfig.cmake` + +## Cross build for ARM + +Give `TARGET_ARCH` variable to set the target architecture. + +If you used `ROOTFS_DIR` to prepare in alternative folder, you should also give this to makefile. + +``` +$ CROSS_BUILD=1 TARGET_ARCH=armv7l make all install + +# If ROOTFS_DIR is in alternative folder +$ ROOTFS_DIR=/path/to/your/rootfs/arm \ +CROSS_BUILD=1 TARGET_ARCH=armv7l make all install +``` + +You can also omit the `CROSS_BUILD=1` option if you explicitly pass `ROOTFS_DIR`. In that case, if +the `TARGET_ARCH` are differs from the hostarchitecture, the make script automatically applies +`CROSS_BUILD=1`. So, if you set `ROOTFS_DIR` as an environment variable, you can simply perform +normal build and cross build as follows. + +``` +$ export ROOTFS_DIR=xxx +... +$ make all install # do normal build +$ TARGET_ARCH=armv7l make all install # do cross build +``` + +### Run test + +To run and test the cross-compiled runtime, you need to copy the compiled output to the target device of the architecture in which it is executable. + +1. Copy all artifacts under the `./Product` folder to the target device, Odroid-XU4 for example, as a whole. + +``` +$ ssh odroid mkdir -p one/Product +sjlee@odroid's password: +$ scp -rp ./Product/armv7l-linux.debug odroid:one/Product +sjlee@odroid's password: +FillFrom_runner 100% 224KB 223.6KB/s 00:00 +benchmark_nnapi.sh 100% 7464 7.3KB/s 00:00 +common.sh 100% 2084 2.0KB/s 00:00 +test_framework.sh 100% 3154 3.1KB/s 00:00 +test-driver.sh +... +``` + +2. Log in to the target device, go to the copied path, and reestore the symbolic link settings of the `Product` directory. + +``` +$ ssh odroid +sjlee@odroid's password: +... +$ cd ~/one/Product +$ ln ${PWD}/armv7l-linux.debug/obj obj +$ ln ${PWD}/armv7l-linux.debug/out out +$ cd .. +$ ls -la Product +drwxrwxr-x 5 sjlee sjlee 4096 Jun 4 20:55 armv7l-linux.debug +lrwxrwxrwx 1 sjlee sjlee 51 Jun 4 20:54 obj -> /home/sjlee/one/Product/armv7l-linux.debug/obj +lrwxrwxrwx 1 sjlee sjlee 51 Jun 4 20:55 out -> /home/sjlee/one/Product/armv7l-linux.debug/out +``` + +Now you can test the compilation result in the same way as the native build. Please refer to the following document for details on the test procedure. + +- [Testing neural network model inference using the runtime](./how-to-build-runtime.md#run-test) diff --git a/docs/howto/how-to-introduce-a-new-operation-into-compiler.md b/docs/howto/how-to-introduce-a-new-operation-into-compiler.md new file mode 100644 index 0000000..804f530 --- /dev/null +++ b/docs/howto/how-to-introduce-a-new-operation-into-compiler.md @@ -0,0 +1,2 @@ +# How To Introduce a New Operation Into Compiler + diff --git a/docs/howto/how-to-introduce-a-new-operation-into-runtime.md b/docs/howto/how-to-introduce-a-new-operation-into-runtime.md new file mode 100644 index 0000000..4e295ba --- /dev/null +++ b/docs/howto/how-to-introduce-a-new-operation-into-runtime.md @@ -0,0 +1,440 @@ +# How To Introduce a New Operation Into Runtime + +**ONE**'s runtime has three main modules: **core**, **frontend** and **backend**. This document +provides some lightweight guidance about how to introduce a new operation into these modules to make +onert support the operation. + +## Index + +- [How To Introduce a New Operation Into Runtime](#how-to-introduce-a-new-operation-into-runtime) + - [Index](#index) + - [Core](#core) + - [Frontend](#frontend) + - [Loaders](#loaders) + - [Base Loader](#base-loader) + - [TFLite Loader](#tflite-loader) + - [Circle Loader](#circle-loader) + - [NNAPI](#nnapi) + - [Backend](#backend) + - [ShapeFixer](#shapefixer) + - [acl_cl](#acl_cl) + - [acl_neon](#acl_neon) + - [cpu](#cpu) + - [KernelGenerator](#kernelgenerator) + - [acl_cl](#acl_cl-1) + - [acl_neon](#acl_neon-1) + - [cpu](#cpu-1) + - [TensorRegister (in some cases)](#tensorregister-in-some-cases) + - [ConstantInitializer (in some cases)](#constantinitializer-in-some-cases) + - [cpu](#cpu-2) + - [Samples (to be updated)](#samples-to-be-updated) + +## Core + +This module has graph-based IR(intermediate representation). You have to add IR for the new +operation. + +1. Add name of new operation at [Operations.lst](/runtime/onert/core/include/ir/Operations.lst) + +```cpp +OP(Select) +``` + +2. Create a class for node of new operation in [here](/runtime/onert/core/include/ir/operation/) + +```cpp +#include "ir/Operation.h" + +namespace onert +{ +namespace ir +{ +namespace operation +{ + +class Select : public Operation +{ +public: + enum Input + { + COND = 0, + INPUT1 = 1, + INPUT2 = 2 + }; + + enum Output + { + OUTPUT = 0, + }; + +public: + Select(const OperandIndexSequence &inputs, const OperandIndexSequence &outputs); + +public: + void accept(OperationVisitor &v) const override; + OpCode opcode() const final { return OpCode::Select; } +}; + +} // namespace operation +} // namespace ir +} // namespace onert +``` + +You can also define the class in other source file like below + +```cpp +#include "ir/operation/Select.h" + +#include "ir/OperationVisitor.h" + +namespace onert +{ +namespace ir +{ +namespace operation +{ + +void Select::accept(OperationVisitor &v) const { v.visit(*this); } + +Select::Select(const OperandIndexSequence &inputs, const OperandIndexSequence &outputs) + : Operation{OperandConstraint::createExact(3u), inputs, outputs} +{ +} +``` + - [Operations.Include.h](/runtime/onert/core/include/ir/Operations.Include.h) + +```cpp +#include "ir/operation/Select.h" +``` + +3. Add to the OperationValidator to check if the node is valid. + - [OperationValidator.h](/runtime/onert/core/src/compiler/OperationValidator.h) + +```cpp +void visit(const operation::Select &node) override; +``` + + - [OperationValidator.cc](/runtime/onert/core/src/compiler/OperationValidator.cc) + +```cpp +void OperationValidator::visit(const ir::operation::Select &node) +{ + const auto output_index{node.getOutputs().at(ir::operation::Select::Output::OUTPUT)}; + const auto cond_index{node.getInputs().at(ir::operation::Select::Input::COND)}; + const auto input1_index{node.getInputs().at(ir::operation::Select::Input::INPUT1)}; + const auto input2_index{node.getInputs().at(ir::operation::Select::Input::INPUT2)}; + + UNUSED_RELEASE(output_index); + UNUSED_RELEASE(cond_index); + UNUSED_RELEASE(input1_index); + UNUSED_RELEASE(input2_index); + + const auto output_type = _ctx.at(output_index).typeInfo(); + const auto cond_type = _ctx.at(cond_index).typeInfo(); + const auto input1_type = _ctx.at(input1_index).typeInfo(); + const auto input2_type = _ctx.at(input2_index).typeInfo(); + + UNUSED_RELEASE(output_type); + UNUSED_RELEASE(cond_type); + UNUSED_RELEASE(input1_type); + UNUSED_RELEASE(input2_type); + + assert(cond_type.type() == ir::DataType::BOOL8); + assert(output_type.type() == ir::DataType::FLOAT32 || output_type.type() == ir::DataType::INT32 || + output_type.type() == ir::DataType::QUANT8_ASYMM); + assert(output_type.type() == input1_type.type()); + assert(output_type.type() == input2_type.type()); + + const auto output_shape = _ctx.at(output_index).shape(); + const auto cond_shape = _ctx.at(cond_index).shape(); + const auto input1_shape = _ctx.at(input1_index).shape(); + const auto input2_shape = _ctx.at(input2_index).shape(); + + UNUSED_RELEASE(output_shape); + UNUSED_RELEASE(cond_shape); + UNUSED_RELEASE(input1_shape); + UNUSED_RELEASE(input2_shape); + + assert(output_shape == input1_shape); + assert(cond_shape == input1_shape); + assert(input2_shape == input1_shape); +} +``` + +4. Add to the Dumper to dump IR information of new operation. +- [Dumper.cc](/runtime/onert/core/src/ir/dumper/Dumper.cc) + +```cpp +void Dumper::visit(const Select &node) +{ + VERBOSE(LIR) << "* Select" << std::endl; + VERBOSE(LIR) << " - Inputs : Cond(" << node.getInputs().at(Select::Input::COND).value() + << ") Input1" << node.getInputs().at(Select::Input::INPUT1).value() << ") Input2" + << node.getInputs().at(Select::Input::INPUT2).value() << ")" << std::endl; + VERBOSE(LIR) << " - Output : Output(" << node.getOutputs().at(Select::Output::OUTPUT).value() + << ")" << std::endl; +} +``` + +## Frontend + +This module generates IR from a model. There are two kinds of frontend: Loader and NNAPI. First, Loader loads a model file and generates IR from it. Second, NNAPI generates IR from a model set via [Neural Networks API of android](https://developer.android.com/ndk/guides/neuralnetworks) + +### Loaders + +#### Base Loader + +This is where the common parts of loaders are implemented. + +1. Add to base_loader to load new operation and to generate IR from it +- [base_loader](/runtime/onert/frontend/base_loader/include/base_loader.h) + +```cpp + case BuiltinOperator::BuiltinOperator_SELECT: + loadSelect(op); + return; +``` + +```cpp +template +void BaseLoader::loadSelect(const Operator *op) +{ + ir::OperandIndexSequence inputs; + ir::OperandIndexSequence outputs; + + loadOperationIO(op, inputs, outputs); + + std::unique_ptr new_op{new ir::operation::Select{inputs, outputs}}; + _graph.addOperation(std::move(new_op)); +} +``` + +#### TFLite Loader + +This loads a tflite file. +If you want new operation to be loaded on only TFLite Loader, you only need to implement loading the operation here. + +#### Circle Loader + +This loads a circle file generated by the compiler. +If you want new operation to be loaded on only Circle Loader, you only need to implement loading the operation here. + +### NNAPI + +1. Add to the OperationFactory to generate IR of new operation +- [OperationFactory](/runtime/onert/frontend/nnapi/wrapper/OperationFactory.cc) + +```cpp + _map[ANEURALNETWORKS_SELECT] = [](const OperationFactory::Param &init_param, Operands &) { + assert(init_param.input_count == 3 && init_param.output_count == 1); + + OperandIndexSequence outputs{init_param.outputs[0]}; + + // Each input should be interpreted as follows: + // + // 0 -> Cond Tensor Index + // 1 -> Input1 Tensor Index + // 2 -> Input2 Tensor Index + OperandIndexSequence inputs; + for (uint32_t n = 0; n < init_param.input_count; ++n) + { + inputs.append(OperandIndex{init_param.inputs[n]}); + } + + return new operation::Select{inputs, outputs}; + }; +``` + +2. If you want that NNAPI supports new operation of TFLite's model, you need to update the things related to the operation in [nnapi_delegate](/runtime/libs/tflite/port/1.13.1/src/nnapi_delegate.cpp) like below + +```cpp + case tflite::BuiltinOperator_SELECT: + nnapi_version = 12; // require NNAPI 1.2 + nn_op_type = ANEURALNETWORKS_SELECT; + break; +``` + +## Backend + +This module generates kernels and tensors of backend such as [ComputeLibrary](https://github.com/ARM-software/ComputeLibrary/) from generated graph-based IR. For this, the runtime fairly works on it internally. But this is not enough because of dependence on backend. So, there are several components that require additional implementation on each backend. + +### ShapeFixer + +Even for tensors of the same operation, the shape required for each backend can be different. Therefore, this component modifies and fixes shape of tensors of the backend. + +#### acl_cl + +The kernel of the ACL for the Add operation needs to match the same rank to support the broadcast. +- [ShapeFixer.h](/runtime/onert/backend/acl_cl/ShapeFixer.h) + +```cpp +void visit(const ir::operation::Add &) override; +``` + +- [ShapeFixer.cc](/runtime/onert/backend/acl_cl/ShapeFixer.cc) + +```cpp +void ShapeFixer::visit(const ir::operation::Add &node) +{ + const auto lhs_index{node.getInputs().at(ir::operation::Add::Input::LHS)}; + const auto rhs_index{node.getInputs().at(ir::operation::Add::Input::RHS)}; + + if (!(_ctx.at(lhs_index).shape() == _ctx.at(rhs_index).shape())) + { + const auto broadcast_rank = + std::max(_ctx.at(lhs_index).shape().rank(), _ctx.at(rhs_index).shape().rank()); + const_cast(_ctx.at(lhs_index).shape()).extendRank(broadcast_rank); + const_cast(_ctx.at(rhs_index).shape()).extendRank(broadcast_rank); + } +} +``` + +#### acl_neon + +Same implementation as acl_cl is required. + +#### cpu + +This backend doesn't usually require a change of shape. +- [ShapeFixer.h](/runtime/onert/backend/cpu/ShapeFixer.h) + +```cpp +void visit(const ir::operation::Select &) override; +``` + +- [ShapeFixer.cc](/runtime/onert/backend/cpu/ShapeFixer.cc) + +```cpp +void ShapeFixer::visit(const ir::operation::Select &) { /* DO NOTHING */} +``` + +### KernelGenerator + +This component generates kernels of backend. You have to generate kernel of new operation. And then append it to execution builder. You can obtain information of the node from IR and necessary tensors from tensor builder. + +#### acl_cl + +- [KernelGenerator.h](/runtime/onert/backend/acl_cl/KernelGenerator.h) + +```cpp +void visit(const ir::operation::Select &) override; +``` + +- [KernelGenerator.cc](/runtime/onert/backend/acl_cl/KernelGenerator.cc) + +```cpp +void KernelGenerator::visit(const ir::operation::Select &node) +{ + const auto output_index{node.getOutputs().at(ir::operation::Select::Output::OUTPUT)}; + const auto cond_index{node.getInputs().at(ir::operation::Select::Input::COND)}; + const auto input1_index{node.getInputs().at(ir::operation::Select::Input::INPUT1)}; + const auto input2_index{node.getInputs().at(ir::operation::Select::Input::INPUT2)}; + + auto output_alloc = _tensor_builder->at(output_index).get(); + auto cond_alloc = _tensor_builder->at(cond_index).get(); + auto input1_alloc = _tensor_builder->at(input1_index).get(); + auto input2_alloc = _tensor_builder->at(input2_index).get(); + + auto fn = std::make_unique<::arm_compute::CLSelect>(); + + fn->configure(cond_alloc->handle(), input1_alloc->handle(), input2_alloc->handle(), + output_alloc->handle()); + + auto acl_fn = asAclFunction(std::move(fn)); + + _execution_builder->append(std::move(acl_fn)); +} +``` + +#### acl_neon + +Similar implementation as acl_cl is required. + +#### cpu + +- [KernelGenerator.h](/runtime/onert/backend/cpu/KernelGenerator.h) + +```cpp +void visit(const ir::operation::Select &) override; +``` + +- [KernelGenerator.cc](/runtime/onert/backend/cpu/KernelGenerator.cc) + +```cpp +void KernelGenerator::visit(const ir::operation::Select &node) +{ + const auto output_index{node.getOutputs().at(ir::operation::Select::Output::OUTPUT)}; + const auto cond_index{node.getInputs().at(ir::operation::Select::Input::COND)}; + const auto input1_index{node.getInputs().at(ir::operation::Select::Input::INPUT1)}; + const auto input2_index{node.getInputs().at(ir::operation::Select::Input::INPUT2)}; + + const auto output_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( + _ctx.at(output_index), _current_op_seq_layout); + const auto cond_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( + _ctx.at(cond_index), _current_op_seq_layout); + const auto input1_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( + _ctx.at(input1_index), _current_op_seq_layout); + const auto input2_backend_descr = ::onert::backend::cpu::kernel::getTensorDescriptor( + _ctx.at(input2_index), _current_op_seq_layout); + + auto output_alloc = _tensor_builder->at(output_index).get(); + auto cond_alloc = _tensor_builder->at(cond_index).get(); + auto input1_alloc = _tensor_builder->at(input1_index).get(); + auto input2_alloc = _tensor_builder->at(input2_index).get(); + + auto fn = std::make_unique<::onert::backend::cpu::kernel::SelectLayer>(); + + fn->configure(cond_alloc->buffer(), cond_backend_descr, input1_alloc->buffer(), + input1_backend_descr, input2_alloc->buffer(), input2_backend_descr, + output_alloc->buffer(), output_backend_descr); + + _execution_builder->append(std::move(fn)); +} +``` + +### TensorRegister (in some cases) + +This component registers tensors. Most tensors will be automatically registered internally. There +are some exceptions, however, where additional implementations are required. It is the case when a +tensor is treated unusually in its backend. + +The kernel of some operation has weights in `HWIO` as layout(data format) in case of that input's +layout is `NHWC`. And, for `NCHW`, weights is `OIHW`. But TFLite model has weigths, `OHWI` for +`NHWC` and `OIHW` for `NCHW`. Therefore, to register the appropriate tensor on the backend, you have +to implement it additionally. + +### ConstantInitializer (in some cases) + +This component registers function initializing constant tensors and initialize constant tensor +layer. This is similar to TensorRegister. Most tensors will be automatically registered internally. +And there are some exceptions. + +#### cpu + +- [ConstantInitializer.h](/runtime/onert/backend/cpu/ConstantInitializer.h) + +```cpp +void visit(const ir::operation::Conv2D &) override; +``` + +- [ConstantInitializer.cc](/runtime/onert/backend/cpu/ConstantInitializer.cc) + +```cpp +void ConstantInitializer::visit(const ir::operation::Conv2D &node) +{ + const auto &kernel_index = node.getInputs().at(ir::operation::Conv2D::KERNEL); + const auto &kernel_obj = _operands.at(kernel_index); + registerCopyInitializer(kernel_index, kernel_obj); + + const auto &bias_index = node.getInputs().at(ir::operation::Conv2D::BIAS); + const auto &bias_obj = _operands.at(bias_index); + registerCopyInitializer(bias_index, bias_obj); +} +``` + +## Samples (to be updated) + +- `Select` operation + - Simple explanation : `Output[i] = Condition[i] ? input1[i] : input2[i]` + - PR : https://github.com/Samsung/ONE/pull/XXX + diff --git a/docs/howto/how-to-make-an-application-with-runtime.md b/docs/howto/how-to-make-an-application-with-runtime.md new file mode 100644 index 0000000..4d9580e --- /dev/null +++ b/docs/howto/how-to-make-an-application-with-runtime.md @@ -0,0 +1 @@ +# How to Make an Application with Runtime diff --git a/docs/howto/how-to-remote-debugging-with-visual-studio-code.md b/docs/howto/how-to-remote-debugging-with-visual-studio-code.md new file mode 100644 index 0000000..6be9e3b --- /dev/null +++ b/docs/howto/how-to-remote-debugging-with-visual-studio-code.md @@ -0,0 +1,150 @@ +# How to Remote Debugging with Visual Studio Code + +This document describes how to debug ONE runtime on arm devices using visual studio code. + +## Setup build host + +### Install gdb-multiarch + +1. Install `gdb-multiarch` + +```bash +$ sudo apt install gdb-multiarch +``` + +### Configure VS code + +1. Install [Native Debug](https://marketplace.visualstudio.com/items?itemName=webfreak.debug) extension on VS code + +2. Setup GDB environment on VS code + +- Debug -> Add configuration -> GDB: Connect to gdbserver +- Change configuration as below + - Change `` to IP of your target + - The default port number for gdbserver is 2345. You can change this number. + - You can change `executable` configuration from `tflite_run` to other binaries you want to debug. + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "type": "gdb", + "request": "attach", + "name": "Attach to gdbserver", + "gdbpath": "/usr/bin/gdb-multiarch", + "executable": "./Product/armv7l-linux.debug/out/bin/tflite_run", + "target": ":2345", + "remote": true, + "printCalls": true, + "cwd": "${workspaceRoot}", + "valuesFormatting": "parseText" + } + ] +} +``` + +## Setup target device + +### Install gdbserver and debugging symbols + +You need to setup a target device for remote debugging. + +1. Install `gdbserver` +```bash +$ sudo apt install gdbserver +``` + +2. Install `libc6-dbg` and copy debugging symbols +```bash +$ sudo apt install libc6-dbg +$ sudo mkdir -p /lib/.debug +$ sudo ln -s /usr/lib/debug/lib/arm-linux-gnueabihf/ld-2.27.so /lib/.debug +``` + +## Run remote debugging + +1. Start gdbserver on target + +```bash +gdbserver --multi : +``` + +Example +```bash +gdbserver --multi :2345 Product/armv7l-linux.debug/out/bin/tflite_run ../models/slice_test.tflite +``` + +2. Connect to gdbserver using VS code + - Setup breakpoints on any code you want. + - Click F5 to start remote debugging. + - Program will execute and exit if no breakpoint exists. + +## Optional: Setup rootfs on build host + +When debugging starts, `gdb` downloads shared libraries that one runtime uses from the target device. +This process makes `gdb` to wait for shared library download to finish for every debugging start. + +To reduce shared library loading, you can setup an arm root file system on your build host and use it. + +1. Create arm root file system + +Following [CrossBuildForArm](how-to-cross-build-runtime-for-arm.md) to create an arm root file system. + +You can use an arm root file system created for arm cross-compile. + +2. Install `libc6-dbg` on arm root file system + +`` should point ARM root file system. + +Default path is `tools/cross/rootfs/arm` folder. + +```bash +$ sudo chroot +$ apt install libc6-dbg +$ exit +``` + +3. Create symbolic link of one runtime on arm rootfs + +`gdb` will use source code folder at sysroot. + +```bash +$ ln -s / +``` +Example +```bash +$ ln -s /home/user/one /home/user/one/tools/cross/rootfs/arm/home/user/one/ +``` + +4. Setup `.gdbinit` file on one folder + +`gdb` will use `` to find arm related symbols. + +```bash +set sysroot +set debug-file-directory /usr/lib/debug +``` + +## Troubleshooting + +### Unable to open 'unordered_map.h' + +If you are using docker to build one runtime, you should download and decompress gcc-linaro at `/opt` folder + +```bash +wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.02/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf.tar.xz -O gcc-hardfp.tar.xz +sudo tar -xf gcc-hardfp.tar.xz -C /opt/ && sudo rm -rf gcc-hardfp.tar.xz +``` + +### Skip STL files + +Step into (F11) will debug STL files such as `unordered_map` or `vector`. + +To skip those files from debugging, you can add below line to `.gdbinit` file. + +This function is supported on gdb versions >= 7.12. + +```bash +skip -gfile /opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/include/c++/6.3.1/bits/* +``` diff --git a/docs/howto/how-to-run-package.md b/docs/howto/how-to-run-package.md new file mode 100644 index 0000000..2a0e025 --- /dev/null +++ b/docs/howto/how-to-run-package.md @@ -0,0 +1 @@ +# How to Run Package diff --git a/docs/howto/how-to-use-api.md b/docs/howto/how-to-use-api.md new file mode 100644 index 0000000..4b34e69 --- /dev/null +++ b/docs/howto/how-to-use-api.md @@ -0,0 +1 @@ +# How to Use API diff --git a/docs/howto/how-to-use-nnapi-binding.md b/docs/howto/how-to-use-nnapi-binding.md new file mode 100644 index 0000000..ade4e7b --- /dev/null +++ b/docs/howto/how-to-use-nnapi-binding.md @@ -0,0 +1,5 @@ +# How to Use NNAPI Binding + +Runtime supports [Android Neural Networks API](https://developer.android.com/ndk/guides/neuralnetworks) as a frontend. We provide the whole `NeuralNetworks.h` implementation. Its source code is located at `runtime/onert/frontend/nnapi`. + +So users can just use NN API in the same way as [the official guide](https://developer.android.com/ndk/guides/neuralnetworks), but should watch the version of `NeuralNetworks.h`. It may not be the latest. There is a copy of the file is located at `runtime/nnapi-header/include/NeuralNetworks.h`. diff --git a/docs/howto/how-to-use-nnfw-api.md b/docs/howto/how-to-use-nnfw-api.md new file mode 100644 index 0000000..6c0fb49 --- /dev/null +++ b/docs/howto/how-to-use-nnfw-api.md @@ -0,0 +1,66 @@ +# How to Use NNFW API + +## Prepare nnpackage + +### Convert tensorflow pb file to nnpackage +Follow the [compiler guide](https://github.com/Samsung/ONE/blob/master/docs/nncc/v1.0.0/tutorial.md) to generate nnpackge from tensorflow pb file + +### Convert tflite file to nnpackage +Please see [model2nnpkg](https://github.com/Samsung/ONE/tree/master/tools/nnpackage_tool/model2nnpkg) for converting from tflite model file. + +## Build app with NNFW API + +Here are basic steps to build app with [NNFW C API](https://github.com/Samsung/ONE/blob/master/runtime/onert/api/include/nnfw.h) + +1) Initialize nnfw_session +``` c +nnfw_session *session = nullptr; +nnfw_create_session(&session); +``` +2) Load nnpackage +``` c +nnfw_load_model_from_file(session, nnpackage_path); +``` +3) (Optional) Assign a specific backend to operations +``` c + // Use acl_neon backend for CONV_2D and acl_cl for otherwise. + // Note that defalut backend is acl_cl + nnfw_set_op_backend(session, "CONV_2D", "acl_neon"); +``` + +4) Compilation +``` c + // Compile model + nnfw_prepare(session); +``` + +5) Prepare Input/Output +``` c + // Prepare input. Here we just allocate dummy input arrays. + std::vector input; + nnfw_tensorinfo ti; + nnfw_input_tensorinfo(session, 0, &ti); // get first input's info + uint32_t input_elements = num_elems(&ti); + input.resize(input_elements); + // TODO: Please add initialization for your input. + nnfw_set_input(session, 0, ti.dtype, input.data(), sizeof(float) * input_elements); + + // Prepare output + std::vector output; + nnfw_output_tensorinfo(session, 0, &ti); // get first output's info + uint32_t output_elements = num_elems(&ti); + output.resize(output_elements); + nnfw_set_output(session, 0, ti.dtype, output.data(), sizeof(float) * output_elements); +``` +6) Inference +``` c + // Do inference + nnfw_run(session); +``` + +## Run Inference with app on the target devices +reference app : [minimal app](https://github.com/Samsung/ONE/blob/master/runtime/onert/sample/minimal) + +``` +$ ./minimal path_to_nnpackage_directory +``` diff --git a/docs/howto/index.rst b/docs/howto/index.rst new file mode 100644 index 0000000..d04224e --- /dev/null +++ b/docs/howto/index.rst @@ -0,0 +1,27 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +How To +====== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./how-to-add-a-new-operation.md + ./how-to-build-compiler.md + ./how-to-build-package.md + ./how-to-build-runtime.md + ./how-to-build-runtime-using-prebuilt-docker-image.md + ./how-to-cross-build-runtime-for-arm.md + ./how-to-cross-build-runtime-for-aarch64.md + ./how-to-cross-build-runtime-for-android.md + ./how-to-contribute.md + ./how-to-make-an-application-with-runtime.md + ./how-to-remote-debugging-with-visual-studio-code.md + ./how-to-run-package.md + ./how-to-use-api.md + ./how-to-use-nnfw-api.md + ./how-to-use-nnapi-binding.md diff --git a/docs/images/logo_original_samsungblue_cropped.png b/docs/images/logo_original_samsungblue_cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..169beef658ce85540f4a80a4152f2962ef0d3f91 GIT binary patch literal 103942 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⪻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 literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..4e8492b --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,29 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to ONE's documentation! +=============================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./overview/index + ./howto/index + ./runtime/index + ./compiler/index + ./common-ir/index + ./package/index + ./platform/index + ./device/index + ./test/index + ./release/index + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..922152e --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/nncc/v1.0.0/tutorial.md b/docs/nncc/v1.0.0/tutorial.md new file mode 100644 index 0000000..9d1f97e --- /dev/null +++ b/docs/nncc/v1.0.0/tutorial.md @@ -0,0 +1,49 @@ +# Tutorial + +Let's compile Inception_v3 model and make a nnpackage! + +## Prepare inception_v3 files + +1. Download pre-trained `inception_v3.pb` model file. + ```sh + $ wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/model_zoo/upload_20180427/inception_v3_2018_04_27.tgz + $ tar -xvf inception_v3_2018_04_27.tgz + ``` +1. Create model information file as `inception_v3.info`. + ``` + $ cat > inception_v3.info << "END" + input, input:0, TF_FLOAT, [1, 299, 299, 3] + output, InceptionV3/Predictions/Reshape_1:0, TF_FLOAT, [1, 1001] + END + ``` + +## Let's compile inception_v3 + +1. Generate `nnpkg`. In this tutorial, let's generate to current directory. + ```sh + tf2nnpkg --use-tf2circle \ + --graphdef inception_v3.pb \ + --info inception_v3.info \ + -o . + ``` + +## Check whether compilation is well done + +- Check if all files are generated correctly. + ``` + inception_v3 + ├ inception_v3.circle + └ metadata + └ MANIFEST + ``` +- Check if `MANIFEST` contents are correct. + ```sh + $ cat inception_v3/metadata/MANIFEST + { + "major-version" : "1", + "minor-version" : "0", + "patch-version" : "0", + "models" : [ "inception_v3.circle" ], + "model-types" : [ "circle" ] + } + ``` diff --git a/docs/nnfw/howto/CrossBuildForAndroid.md b/docs/nnfw/howto/CrossBuildForAndroid.md new file mode 100644 index 0000000..d7e48c8 --- /dev/null +++ b/docs/nnfw/howto/CrossBuildForAndroid.md @@ -0,0 +1,54 @@ +# Cross building for Android + +**Note: To set up a basic build environment on your development PC, please read the [howto.md](../howto.md) document first. The cross build covered in this document assumes that you have an environment in which the native build operates normally without problems.** + +Supported Architecture : AARCH64 only (ARM32 is not supported yet) + +## Prepare Android NDK + +Use `tools/cross/install_android_ndk.sh` script to prepare Android NDK. This is recommended way to build Android NDK. +You may download it yourself from the offical Android NDK website, but the script does a little more than just downloading and unzipping. + +## Build + +### Host Environment Requirements + +With Ubuntu 16.04, everything is fine except one. CMake 3.6.0 or later is required for Android NDK CMake support. +So if you want to use Docker, please use `infra/docker/Dockerfile.1804` which is based on Ubuntu 18.04. It has CMake 3.10.2. + +```bash +docker build --network host -t nnas1804 -f infra/docker/Dockerfile.1804 infra/docker +``` + +### Get prebuilt ARM Compute Library + +Download prebuilt binary from [github](https://github.com/ARM-software/ComputeLibrary/releases). Check the version we support and platform(Android). + +Then extract the tarball to the folder indicated as EXT_ACL_FOLDER in the example below. We will use the following file in `lib/android-arm64-v8a-neon-cl`. + +``` +libarm_compute_core.so +libarm_compute_graph.so +libarm_compute.so +``` + +### Build and install the runtime + +Some tools/libs are still not supported and those are not built by default - mostly due to dependency on Boost library. +Please refer to `infra/nnfw/cmake/options/options_aarch64-android.cmake` for details. + +Different from cross build for linux, + +- `NDK_DIR` is required + +Here is an example of using Makefile. + +```bash +cp -n Makefile.template Makefile + +TARGET_OS=android \ +CROSS_BUILD=1 \ +NDK_DIR=/path/android-tools/r20/ndk \ +EXT_ACL_FOLDER=/path/arm_compute-v19.11.1-bin-android/lib/android-arm64-v8a-neon-cl \ +make install +``` diff --git a/docs/overview/background.md b/docs/overview/background.md new file mode 100644 index 0000000..c4b21d4 --- /dev/null +++ b/docs/overview/background.md @@ -0,0 +1,28 @@ +# Background + +Artificial intelligence (AI) techniques are getting popular and utilized in various products and +services. While the cloud-based AI techniques have been used to perform compute/memory intensive +inferences because of the powerful servers on cloud, on-device AI technologies are recently drawing +attention from the mobile industry for response time reduction, privacy protection, and +connection-less AI service. Big mobile players are investing their research effort on the on-device +AI technologies and already announced hardware and software on-device AI solutions. We are not +leading this trend currently, but since on-device AI area is just started and still in the initial +state, there are still opportunities and possibilities to reduce the gap between pioneers and us. We +believe on-device AI will become a key differentiator for mobile phone, TV, and other home +appliances, and thus developing on-device AI software stack is of paramount importance in order to +take leadership in the on-device AI technology. + +Although the vision of on-device AI is promising, enabling on-device AI involves unique technical +challenges compared to traditional cloud-based approach. This is because on-device AI tries to +conduct inference tasks solely on device without connecting to cloud resources. Specifically, +hardware resources on device, such as processor performance, memory capacity, and power budget, are +very scarce and limit the compute capability, which is typically required to execute complicated +neural network (NN) models. For example, in one product requirement, a mobile device should consume +less than 1.2W and could use at most 2W only for 10 minutes due to thermal issue. Next, on-device AI +software stack needs to support diverse device environments, since embedded platforms may consist of +heterogeneous compute devices, such as CPU, GPU, DSP, or neural processing unit (NPU), and use +different OS platforms, such as Tizen, Android, or various Linux. + +To tackle the challenges above and to have the leadership on on-device AI technology, this project, +as the first step, aims at developing a neural network inference framework specialized and optimized +for on-device AI. diff --git a/docs/overview/index.rst b/docs/overview/index.rst new file mode 100644 index 0000000..8e8b79d --- /dev/null +++ b/docs/overview/index.rst @@ -0,0 +1,18 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Overview +======== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./background.md + ./roadmap.md + ./overall-architecture.md + ./supported-operations.md + ./workgroup.md + diff --git a/docs/overview/overall-architecture.md b/docs/overview/overall-architecture.md new file mode 100644 index 0000000..4376019 --- /dev/null +++ b/docs/overview/overall-architecture.md @@ -0,0 +1,7 @@ +# Overall Architecture + +## Compiler + +## Package + +## Runtime diff --git a/docs/overview/roadmap.md b/docs/overview/roadmap.md new file mode 100644 index 0000000..06833df --- /dev/null +++ b/docs/overview/roadmap.md @@ -0,0 +1,58 @@ +# Roadmap + +This document describes roadmap of **ONE** project. + +This project **ONE** aims at providing a high-performance, on-device neural network (NN) inference +framework that performs inference of a given NN model on processors, such as CPU, GPU, DSP, or NPU, +in the target platform, such as Tizen, Android, and Ubuntu. + +## Progress + +Until last year, we already saw significant gains in accelerating with a single CPU or GPU backend. +We have seen better performance improvements, not only when using a single backend, but even when +mixing CPUs or GPUs considering the characteristics of individual operations. It could give us an +opportunity to have a high degree of freedom in terms of operator coverage, and possibly provide +better performance compared to single backend acceleration. + +On the other hand, we introduced the compiler as a front-end. This will support a variety of deep +learning frameworks in relatively spacious host PC environments, while the runtime running on the +target device is intended to take a smaller burden. In this approach, the compiler and the runtime +will effectively share information among themselves by the Common IR, named _circle_, and a +container format which is referred to as the _NN Package_. + +## Goal + +In the meantime, we have been working on improving the acceleration performance based on the vision +model. From this year, now we start working on the voice model. The runtime requirements for the +voice model will be different from those of the vision model. There will be new requirements that +we do not recognize yet, along with some already recognized elements such as control flow and +dynamic tensor. In addition, recent studies on voice models require efficient support for specific +architectures such as attention, transformer, and BERT. Also, depending on the characteristics of +most voice models with large memory bandwidth, we will have to put more effort into optimizing the +memory bandwidth at runtime. + +## Deliverables + +- Runtime + + Control Flow support (IF/WHILE) + + Dynamic Tensor support + + High quality kernel development for UINT8 quantized model + + End-to-end performance optimization for voice models +- Compiler + + More than 100 operations support + + Standalone _circle_ interpreter + + Completion and application of _circle2circle_ pass + - _circle-quantizer_ for UINT8 and INT16 + - _circle-optimizer_ + + Grphical _circle_ model viewer + +## Milestones + +- [2020 Project Milestones](https://github.com/Samsung/ONE/projects/1) + +## Workgroups (WGs) + +- We organize WGs for major topics, and each WG will be working on its own major topic by breaking + it into small tasks/issues, performing them inside WG, and collaborating between WGs. +- The WG information can be found [here](workgroup.md). + diff --git a/docs/overview/supported-operations.md b/docs/overview/supported-operations.md new file mode 100644 index 0000000..6120e24 --- /dev/null +++ b/docs/overview/supported-operations.md @@ -0,0 +1,145 @@ +# Supported Operations + +As of 2020-06-26 +- TensorFlow commit e5023a1738cce7efcdf9d87863b85c80ab2f8c9e +- This commit is Tensorflow nightly build after v2.2.0 release + +TensorFlow lite operators | circle IR | Compiler | Runtime +-- | -- | -- | -- +ABS | O | O | O +ADD | O | O | O +ADD_N | O | O |   +ARG_MAX | O | O | O +ARG_MIN | O | O |   +AVERAGE_POOL_2D | O | O | O +BATCH_MATMUL | O | O | O +BATCH_TO_SPACE_ND | O | O |   +BIDIRECTIONAL_SEQUENCE_LSTM | O |   |   +BIDIRECTIONAL_SEQUENCE_RNN | O |   |   +CALL | O |   |   +CAST | O | O | O +CEIL | O | O |   +CONCAT_EMBEDDINGS | O |   |   +CONCATENATION | O | O | O +CONV_2D | O | O | O +COS | O | O | O +CUSTOM | O | O | O +DELEGATE | O |   |   +DENSIFY | O |   |   +DEPTH_TO_SPACE | O | O | O +DEPTHWISE_CONV_2D | O | O | O +DEQUANTIZE | O |   | O +DIV | O | O | O +ELU | O | O |   +EMBEDDING_LOOKUP | O |   | O +EMBEDDING_LOOKUP_SPARSE | O |   |   +EQUAL | O | O | O +EXP | O | O | O +EXPAND_DIMS | O | O | O +FAKE_QUANT | O |   |   +FILL | O | O | O +FLOOR | O | O | O +FLOOR_DIV | O | O |   +FLOOR_MOD | O | O |   +FULLY_CONNECTED | O | O | O +GATHER | O | O | O +GATHER_ND | O | O |   +GREATER | O | O | O +GREATER_EQUAL | O | O | O +HARD_SWISH | O |   |   +HASHTABLE_LOOKUP | O |   | O +IF | O | O | O +L2_NORMALIZATION | O | O | O +L2_POOL_2D | O | O | O +LEAKY_RELU | O | O |   +LESS | O | O | O +LESS_EQUAL | O | O | O +LOCAL_RESPONSE_NORMALIZATION | O | O | O +LOG | O | O | O +LOG_SOFTMAX | O | O |   +LOGICAL_AND | O | O | O +LOGICAL_NOT | O | O | O +LOGICAL_OR | O | O | O +LOGISTIC | O | O | O +LSH_PROJECTION | O |   |   +LSTM | O |   | O +MATRIX_DIAG | O |   |   +MATRIX_SET_DIAG | O |   |   +MAX_POOL_2D | O | O | O +MAXIMUM | O | O | O +MEAN | O | O | O +MINIMUM | O | O | O +MIRROR_PAD | O | O |   +MUL | O | O | O +NEG | O | O | O +NON_MAX_SUPPRESSION_V4 | O |   |   +NON_MAX_SUPPRESSION_V5 | O |   |   +NOT_EQUAL | O | O | O +ONE_HOT | O | O | O +PACK | O | O | O +PAD | O | O | O +PADV2 | O |   |   +POW | O | O | O +PRELU | O | O | O +QUANTIZE | O |   |   +RANGE | O | O | O +RANK | O | O |   +REDUCE_ANY | O | O | O +REDUCE_MAX | O | O | O +REDUCE_MIN | O | O | O +REDUCE_PROD | O | O | O +RELU | O | O | O +RELU_N1_TO_1 | O | O |   +RELU6 | O |   | O +RESHAPE | O | O | O +RESIZE_BILINEAR | O | O | O +RESIZE_NEAREST_NEIGHBOR | O | O |   +REVERSE_SEQUENCE | O | O |   +REVERSE_V2 | O |   | O +RNN | O |   | O +ROUND | O | O | O +RSQRT | O | O | O +SCATTER_ND | O | O |   +SEGMENT_SUM | O | O |   +SELECT | O | O | O +SELECT_V2 | O |   |   +SHAPE | O | O | O +SIN | O | O | O +SKIP_GRAM | O |   |   +SLICE | O | O |   +SOFTMAX | O | O | O +SPACE_TO_BATCH_ND | O | O | O +SPACE_TO_DEPTH | O | O | O +SPARSE_TO_DENSE | O | O |   +SPLIT | O | O | O +SPLIT_V | O | O |   +SQRT | O | O | O +SQUARE | O | O |   +SQUARED_DIFFERENCE | O | O | O +SQUEEZE | O | O | O +STRIDED_SLICE | O | O | O +SUB | O | O | O +SUM | O | O | O +SVDF | O |   |   +TANH | O | O | O +TILE | O | O | O +TOPK_V2 | O | O | O +TRANSPOSE | O | O | O +TRANSPOSE_CONV | O | O | O +UNIDIRECTIONAL_SEQUENCE_LSTM | O |   |   +UNIDIRECTIONAL_SEQUENCE_RNN | O |   |   +UNIQUE | O |   |   +UNPACK | O | O | O +WHERE | O |   |   +WHILE | O | O |   +ZEROS_LIKE | O | O |   +Count | 127 | 97 | 81 + + +### circle additional operators + +Operator | compiler | runtime +-- | -- | -- +BCQ_FULLY_CONNECTED | | +BCQ_GATHER | | +INSTANCE_NORM | | diff --git a/docs/overview/workgroup.md b/docs/overview/workgroup.md new file mode 100644 index 0000000..f3a7e08 --- /dev/null +++ b/docs/overview/workgroup.md @@ -0,0 +1,13 @@ +# Workgroup + +## Runtime WG1 + +## Runtime WG2 + +## Runtime WG3 + +## Compiler Frontend WG + +## Compiler Backend WG + +## How to Join? diff --git a/docs/package/design-of-package.md b/docs/package/design-of-package.md new file mode 100644 index 0000000..4f72084 --- /dev/null +++ b/docs/package/design-of-package.md @@ -0,0 +1,7 @@ +# Design of Package + +## Manifest + +## Supported Models + +## User Defined Operation diff --git a/docs/package/index.rst b/docs/package/index.rst new file mode 100644 index 0000000..6e5e9e1 --- /dev/null +++ b/docs/package/index.rst @@ -0,0 +1,14 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Package +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./introduction-to-package.md + ./design-of-package.md diff --git a/docs/package/introduction-to-package.md b/docs/package/introduction-to-package.md new file mode 100644 index 0000000..fca9774 --- /dev/null +++ b/docs/package/introduction-to-package.md @@ -0,0 +1 @@ +# Introduction to Package diff --git a/docs/platform/android.md b/docs/platform/android.md new file mode 100644 index 0000000..f5aec8a --- /dev/null +++ b/docs/platform/android.md @@ -0,0 +1 @@ +# Android diff --git a/docs/platform/index.rst b/docs/platform/index.rst new file mode 100644 index 0000000..1a29e81 --- /dev/null +++ b/docs/platform/index.rst @@ -0,0 +1,15 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Platform +======== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./ubuntu.md + ./tizen.md + ./android.md diff --git a/docs/platform/tizen.md b/docs/platform/tizen.md new file mode 100644 index 0000000..b41a641 --- /dev/null +++ b/docs/platform/tizen.md @@ -0,0 +1 @@ +# Tizen diff --git a/docs/platform/ubuntu.md b/docs/platform/ubuntu.md new file mode 100644 index 0000000..e6f19d1 --- /dev/null +++ b/docs/platform/ubuntu.md @@ -0,0 +1 @@ +# Ubuntu diff --git a/docs/release/1.0/index.rst b/docs/release/1.0/index.rst new file mode 100644 index 0000000..25dd157 --- /dev/null +++ b/docs/release/1.0/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.0 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.0.0.md diff --git a/docs/release/1.0/release-note-1.0.0.md b/docs/release/1.0/release-note-1.0.0.md new file mode 100644 index 0000000..1013f45 --- /dev/null +++ b/docs/release/1.0/release-note-1.0.0.md @@ -0,0 +1 @@ +# Release Note 1.0.0 diff --git a/docs/release/1.1/index.rst b/docs/release/1.1/index.rst new file mode 100644 index 0000000..5ccaf1e --- /dev/null +++ b/docs/release/1.1/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.1 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.1.0.md diff --git a/docs/release/1.1/release-note-1.1.0.md b/docs/release/1.1/release-note-1.1.0.md new file mode 100644 index 0000000..b75fcfe --- /dev/null +++ b/docs/release/1.1/release-note-1.1.0.md @@ -0,0 +1 @@ +# Release Note 1.1.0 diff --git a/docs/release/1.2/index.rst b/docs/release/1.2/index.rst new file mode 100644 index 0000000..dc78cb0 --- /dev/null +++ b/docs/release/1.2/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.2 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.2.0.md diff --git a/docs/release/1.2/release-note-1.2.0.md b/docs/release/1.2/release-note-1.2.0.md new file mode 100644 index 0000000..9b0e0a7 --- /dev/null +++ b/docs/release/1.2/release-note-1.2.0.md @@ -0,0 +1 @@ +# Release Note 1.2.0 diff --git a/docs/release/1.3/index.rst b/docs/release/1.3/index.rst new file mode 100644 index 0000000..f89e7ee --- /dev/null +++ b/docs/release/1.3/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.3 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.3.0.md diff --git a/docs/release/1.3/release-note-1.3.0.md b/docs/release/1.3/release-note-1.3.0.md new file mode 100644 index 0000000..efabc36 --- /dev/null +++ b/docs/release/1.3/release-note-1.3.0.md @@ -0,0 +1 @@ +# Release Note 1.3.0 diff --git a/docs/release/1.4/index.rst b/docs/release/1.4/index.rst new file mode 100644 index 0000000..bdf64f3 --- /dev/null +++ b/docs/release/1.4/index.rst @@ -0,0 +1,13 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +1.4 +=== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./release-note-1.4.0.md diff --git a/docs/release/1.4/release-note-1.4.0.md b/docs/release/1.4/release-note-1.4.0.md new file mode 100644 index 0000000..22571f4 --- /dev/null +++ b/docs/release/1.4/release-note-1.4.0.md @@ -0,0 +1 @@ +# Release Note 1.4.0 diff --git a/docs/release/1.5/release-note-1.5.0.md b/docs/release/1.5/release-note-1.5.0.md new file mode 100644 index 0000000..dbf70b3 --- /dev/null +++ b/docs/release/1.5/release-note-1.5.0.md @@ -0,0 +1,36 @@ +# Release Note 1.5.0 + +## Feature Highlights + +- **ONE** Compiler + - Compiler supports more operations + +- **ONE** Runtime + - CPU backend supports more operations + +## ONE Compiler + +### Compiler supports more operations + +The following operations are supported : + +- Abs, Add, ArgMax, AvgPool2D, BatchToSpaceND, Cast, Concat, Const, Conv2D, Cos, +Custom, DepthwiseConv2D, Div, Elu, Equal, Exp, ExpandDims, Fill, FloorDiv, +FloorMod, FullyConnected, Gather, GatherNd, Greater, GreaterEqual, If, +LeakyRelu, Less, LocalResponseNormalize, LogicalAnd, LogicalNot, LogicalOr, +Logistic, Maximum, MaxPool2D, Mean, Minimum, MirrorPad, Mul, Neg, NotEqual, +OneHot, Pack, Pad, Pow, Range, ReduceAny(Any), ReduceMax(Max), ReduceProd, +ReduceSum(Sum), ReLU, RELU_N1_TO_1, Reshape, ResizeNearestneighbor, Rsqrt, +Select, Shape, Sin, Slice, Softmax, SpaceToBatchND, SpaceToDepth, Split, SplitV, +Square, SquaredDifference, Squeeze, StridedSlice, Sub, Tanh, Tile, TopKV2, +Transpose, Unpack(Unstack), While, ZerosLike + +## ONE Runtime + +### CPU backend supports more operations + +The following operations are supported on CPU backend : + +- ArgMax, Cos, ExpandDims, Fill, Log, LogicalNot, LogicalOr, Mean, Neg, Pow, + ReLU, ReduceAny, ReduceProd, Reverse, Round, Select, SquaredDifference, Tile, + ZerosLike diff --git a/docs/release/1.6/release-note-1.6.0.md b/docs/release/1.6/release-note-1.6.0.md new file mode 100644 index 0000000..236e317 --- /dev/null +++ b/docs/release/1.6/release-note-1.6.0.md @@ -0,0 +1,44 @@ +# Release Note 1.6.0 + +## Feature Highlights + +- **ONE** Compiler + - Compiler supports 22 more operations including 1 custom operation. + +- **ONE** Runtime + - CPU backend supports 8 more operations + - Support dynamically shaped tensors + - Support Control Flow operations + - API updates + +- Add **ONE** Runtime package for `x86_64` linux (Experimental) + +## ONE Compiler + +### Compiler supports more operations + +- AddN, ArgMin, Custom(BatchMatmul), Ceil, DepthToSpace, Floor, InstanceNormalize, +L2Normalization, L2Pool, LessEqual, Log, LogSoftmax, PReLU, Rank, ReduceMin(Min), +ResizeBilinear, Round, ScatterND, Sqrt, TransposeConv, BCQGather, +BCQFullyConnected + +## ONE Runtime + +### CPU backend supports more operations + +- BatchMatMul, BroadcastTo, Einsum, FusedBatchNorm, MatrixBandPart, Range, ReduceAll, Add(quant8) + +### Support dynamically shaped tensors + +- Support static shape inference (input resizing) +- Support dynamic shape inference (general resizing) + +### Support Control Flow operations + +- IF and WHILE +- Fully support static and dynamic tensors + +### API updates + +- Introduce `nnfw_set_input_tensorinfo` for input resizing +- `nnfw_input_tensorinfo` and `nnfw_output_tensorinfo` behavior have changed to return tensorinfo according to the session state diff --git a/docs/release/1.7/release-note-1.7.0.md b/docs/release/1.7/release-note-1.7.0.md new file mode 100644 index 0000000..c1a4f50 --- /dev/null +++ b/docs/release/1.7/release-note-1.7.0.md @@ -0,0 +1,46 @@ +## Feature Highlights + +- **ONE** Compiler + - Compiler supports more operations + - New command line interface for user interface consistancy +- **ONE** Runtime + - Runtime CPU backend supports more operations + - Runtime CPU backend supports more quant8 operations + - API changes + - New optimization + +## ONE Compiler + +### Compiler supports more operations + +- MatrixDiag, MatrixSetDiag, ReverseSequence, ReverseV2, SegmentSum, SelectV2, SparseToDense, Where + +### New command line interface for user interface consistancy + +- one-import: imports conventional model files to circle + - one-import-tf: imports TensorFlow model to circle + - one-import-tflite: imports TensorFlow lite model to circle +- one-optimize: circle optimize command +- one-quantize: circle quantize command + - supports float32 to uint8, layer wise (for Conv series) +- one-pack: package command +- one-prepare-venv: prepares python virtual environment for importing TensorFlow model +- one-codegen: backend(if available) code generator + +## ONE Runtime + +### Runtime CPU backend supports more operations + +- LogSoftmax, SpaceToBatchND + +### Runtime CPU backend supports more quant8 operations + +- Logistic, Mul, Tanh, SpaceToBatchND, Transpose, Sub, Max, Min, Less, Greater, GreaterEqual, LessEqual, Equal, NotEqual + +### API changes + +- Introduce basic asynchronous execution API + +### New optimization + +- Remove dynamic tensor overhead from static models diff --git a/docs/release/index.rst b/docs/release/index.rst new file mode 100644 index 0000000..bb542bc --- /dev/null +++ b/docs/release/index.rst @@ -0,0 +1,17 @@ +.. ONE documentation master file, created by + sphinx-quickstart on Thu May 14 18:13:12 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Release +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + ./1.0/index + ./1.1/index + ./1.2/index + ./1.3/index + ./1.4/index diff --git a/docs/release/release_note_1.4.0.md b/docs/release/release_note_1.4.0.md deleted file mode 100644 index b061e17..0000000 --- a/docs/release/release_note_1.4.0.md +++ /dev/null @@ -1,23 +0,0 @@ -# ONE 1.4.0 Release Note - -## Feature Highlights - -- ONE runtime(a.k.a `onert`) - - CPU backend supports more operations - - (Experimental) Android package is released - -## ONE Runtime - -#### CPU backend supports more operations - -The following operations are supported on CPU backend : -- Rsqrt -- Abs -- Sin -- StrideSlice -- Shape - -#### (Experimental) Android package is released - -- For building onert from scratch, read [CrossBuildForAndroid.md](https://github.com/Samsung/ONE/blob/master/docs/nnfw/howto/CrossBuildForAndroid.md). -- For developing application with onert, please read [HowToUseONEAPI.md](https://github.com/Samsung/ONE/blob/master/docs/nnfw/howto/CrossBuildForAndroid.md). diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..83259c5 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +recommonmark +sphinx-markdown-tables +sphinx_rtd_theme diff --git a/docs/runtime/api.md b/docs/runtime/api.md new file mode 100644 index 0000000..5932792 --- /dev/null +++ b/docs/runtime/api.md @@ -0,0 +1 @@ +# API diff --git a/docs/runtime/backend-api.md b/docs/runtime/backend-api.md new file mode 100644 index 0000000..b291bad --- /dev/null +++ b/docs/runtime/backend-api.md @@ -0,0 +1 @@ +# Backend API diff --git a/docs/runtime/compute.md b/docs/runtime/compute.md new file mode 100644 index 0000000..3768cf0 --- /dev/null +++ b/docs/runtime/compute.md @@ -0,0 +1 @@ +# Compute diff --git a/docs/runtime/core-figure-ir.png b/docs/runtime/core-figure-ir.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2c6a627451d5f3f1a4fa89b7d02b21e0515793 GIT binary patch literal 147769 zcmeEucT`i|vo-{fUaUxuAT<;XAkw2CAfWUnLPQ8i@4ZG;P${Am=^!AzNC^TGumRFL zNLM-+z@7UYnVle72i+0Q)l%p4zTURS22Vx}S@BBH&jqNq(o zM9xV>L{dU=1ia%SRTfP|L{)9AprCnGK>@1i;%I4Yhaw_Uc^DH*uBmHu3Ne0I=L!{< zydX(=?5x@ymuK9;4`0@#Cw7XlF`S15b6q^5sEAG^ z*)N>=*0eB3owgv+yg2-=HAB{D`V1LfQBm8cyP6l&4%Cu*>prT-ezbU{jglE{iDvNI zzHN5IcKgtq_0SkDnkg!&u9@{s5gj!r5Rzhq^wBQ~Bl~3bMYMHReOu$a2J>mr_ja!| zzS6iFV&9h5GMSwbO?tO!)%;cEd6#JG$=xe$C44aLSlE@R_s`8@?_4MrlU1^ub&fCH z@_sY-nyLLuhp@}IHHLSa;oJrOxi~x*6bGpFMawgrS8couoA_+AJo=rFQ*mVehWGFguEF+ zG6zw(b)=wkhZW884H9rC`3sc!Y!G)4trzroXg$2-SOE!H8igH+^d-q0$Zq{5CsJ0D zwh6I|^uoco37*%~>_GwNNKJ#ZzOjcXFx(5tVW8~}T8El99V-n^Iz!(?Ple`8C*`A5 zy-)h�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 MDyb`GE12B=U)X3-00000 literal 0 HcmV?d00001 diff --git a/docs/runtime/core.md b/docs/runtime/core.md new file mode 100644 index 0000000..42ba75f --- /dev/null +++ b/docs/runtime/core.md @@ -0,0 +1,86 @@ +# Core + +Runtime Core is a compilation/execution engine for neural network models. + +## Modules + +Runtime Core has four modules. These are namespaces as well as directory names in `/runtime/onert/core/src/`. + +- `ir` stands for Intermediate Representation which contains Neural Network Graph data structures +- `compiler` converts IR to an executable format +- `exec` is an execution module which is the result of a compilation +- `backend` is an interface for memory management for operands and actual calculation of operations + +### Module `ir` + +This module contains data structures of pure Neural Network models. The models from NN Packages or NN API are converted to these structures. + +- `Subgraphs` is the entire neural network model which is a set of subgraphs +- `Subgraph` consists of operands and operations +- `Operand` (a.k.a. Tensor) has a shape, data type, data and references to operations +- `Operation` (a.k.a. Operator) has operation type, params, and references to operands + +`Operand` and `Operation` are nodes of the graph, and the reference relationship between them is the edges of the graph. + +`Subgraphs` represents the whole model. A model can have more than one `Subgraph` to support control flow operations. Those operations make calls to another subgraph and when the execution on another subgraph is done it gets back to previous subgraph execution with returned operands. + +All graphs are a [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph) so once model inputs are given we can run it in topological order. + +Here's a figure of how those data structures are organized. + +![Core](core-figure-ir.png) + +### Module `compiler` + +`Compiler` is the main class of this module. Everything starts from it. + +What it does is making models executable. It schedules execution order and assigns a backend for each operation. Here are major phases of compilation. + +#### 1. Lowering + +In Lowering, `Compiler` assigns a [backend](#module-`backend`) for each operation. It means that the operation will be run with the assigned backend's kernel. + +There is a scheduler that allows the user to manually specify backends via compiler options. There is another scheduler that automatically assigns backends based on profile information measured in advance and saved. + +#### 2. Tensor Registration + +Each backend manages its tensors. In this phase, operand informations get registered to the corresponding backend. This will be used in generating tensor objects. + +##### Q. What are the differences between 'operand' and 'tensor'? + +In **ONE** runtime, 'operand' refers to an operand in a neural network model. While 'tensor' includes all 'operand' info plus actual execution info like actual buffer pointer. In short, 'operand' is for `ir`, 'tensor' is for `backend`. + +#### 3. Linearization (Linear Executor Only) + +Linearization means sorting operations in topological order. It saves execution time since it is not needed to resolve the next available operations after every operation at execution time. + +It also makes plans for tensor memory. It can save some memory space by reusing other operands' space that does not overlap lifetime. All allocations are done at compile time (after [4. Kernel Generation](#4.-kernel-generation)) which saves execution time too. + +#### 4. Kernel Generation + +'kernel' here means an implementation of the actual calculation of an operation. + +A backend is assigned for each operation. In this phase, a kernel for each operation is generated. + +Let's say we have some functions written in a certain programming language. Then its compiler compiles each function into a chunk of assembly. Here 'function' is like 'operation' and 'assembly' is like 'kernel'. + +#### 5. Create Executor + +With generated tensors and kernels, the compiler creates executor objects. There are 3 types of executors are supported - Linear, Dataflow, and Parallel. Linear executor is the default executor and Dataflow Executor and Parallel Executor are experimental. + +For more about executors, please refer to [Executors](./executors.md) document. + +### Module `exec` + +`exec` stands for 'execution'. As a result of the compilation, `Execution` class is created. This class manages the actual execution of the model inference. Here is a typical usage of using this class. + +1. Resize input size if needed +2. Provide input and output buffers +3. Run the inference in either synchronous/asynchronous mode +4. Check out the results which are stored in output buffers provided earlier + +### Module `backend` + +Backends are plugins and they are loaded dynamically(via `dlopen`). So this module is a set of interface classes for backend implementation. `compiler` can compile with a variety of backends without knowing specific backend implementation. + +Backend interface classes are mostly about memory management and kernel generation. For more, please refer to [Backend API](./backend-api.md) document. diff --git a/docs/runtime/executors.md b/docs/runtime/executors.md new file mode 100644 index 0000000..c777e0c --- /dev/null +++ b/docs/runtime/executors.md @@ -0,0 +1,34 @@ +# Executors + +Executor(`IExecutor`) is a execution engine of a subgraph that can execute inference for the subgraph. It is the result of `Subgraph` compilation. If we would compare it with most of common programming language tools, it is just like an interpreter with code to execute. + +## Understanding models + +We can think of a NNPackage model as a set of tasks with dependencies. In other words, it is a form of [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph)(more precisely, it is a set of DAGs as we need multiple subgraphs to support control flow operations). And that is exactly the same concept with [Dataflow programming](https://en.wikipedia.org/wiki/Dataflow_programming). + +That is, there are some input tensors that must be ready to run a operation. And the execution must be done in topological order. Here's the workflow for execution. + +1. User gives model input tensors +2. Start execution +3. Perform the operations that are ready +4. Mark the tensors as ready that are made from the operations that was just performed +5. Check if there are some operations ready + 1. If yes, Go to 3 + 2. Otherwise, Finish execution +6. User uses data of model output tensors + +We have 3 different types of executors in our codebase and they all are based on the explation above. However only `LinearExecutor` is official and the other two are experimental. + +## Linear Executor + +`LinearExecutor` is the main executor. As we know the model to run and the model graph does not change at runtime, we do not have to do step 3-5 above at runtime. During the compilation for Linear Executor, it sorts operations in topological order so we can just execute in that fixed order which means that it cannot perform the operations in parallel. + +If the tensors are static, it also can analyze the lifetimes of the tensors and pre-allocate tensor memory with reusing memory between the tensors whose lifetimes do not overlap. + +## Dataflow Executor (experimental) + +Unlike `LinearExecutor`, `DataflowExecutor` does step 3-5 at runtime. By doing it we can know which operations are available at a specific point. However this executor still executes the operations one at a time. Just choose any operation that is ready then execute. And wait for it to finish then repeat that. So there may be no advantage compared to `LinearExecutor` but `DataflowExecutor` is the parent class of `ParallelExecutor`. And `DataflowExecutor` can be used for profiling executions for the heterogeneous scheduler. + +## Parallel Executor (experimental) + +Just like `DataflowExecutor`, `ParallelExecutor` does step 3-5 at runtime. One big difference is that it creates a `ThreadPool` for each backend for parallel execution(`ThreadPool` is supposed to have multiple threads, however for now, it can have only one thread). As we know that there may be multiple operations ready to execute, and those can be executed in different backends at the same time which could lead some performance gain. diff --git a/docs/runtime/heterogeneous-execution-add-3-conv-model.png b/docs/runtime/heterogeneous-execution-add-3-conv-model.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb5e8a56d741c61fd8ba3989c975a819dbe5364 GIT binary patch literal 32413 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 literal 0 HcmV?d00001 diff --git a/docs/runtime/heterogeneous-execution-add-conv-model-lowering.png b/docs/runtime/heterogeneous-execution-add-conv-model-lowering.png new file mode 100644 index 0000000000000000000000000000000000000000..ffef8240544c2554bef994ab0cd823b6246b833c GIT binary patch literal 52843 zcmZ^~1y~%-^EJ9S!QI{6-Q9vif+n!IyN2MfxN8UyG)Qm>9)i0EcMrjWJKWj#{r%;B z_q*iTXJ==oyQh1qtIj!9iPBV8L`NY(0f9j1%1UzDAP`Ii2n3smj0l|R$yDD5zTmB; z)uch7+W3zTS}7n9N~^7`tfsQ8ES094vz4ubB?zPxm6ndAscS$Wwf@rSPQ@=QAp8o4 z?zN3u3VmqQ*S7r6lYHb@+^nIrLWpv5QpA(e*a!olK_V!nJ@PdJLNk~itBTQh# zW+5jR2GX^f>l}HY0I5|qRWg`AJ-ocIM3YrzqJ!{)-FOs7$K~$e%QY5dlHfr_IE|zn zDaed1=$4k)hE&7e48opS5sbpVS)HnPa*Fq$An7(5O?@^k77(7}FZBsq-@W*f zy%_QE7V!$JY8L;M3r_mY5|L|Q^5JbwEW!|YlXrAq^-hCZgM^5;$DvkZ3(Z~sM^{}3 zF_@Y+yZgp^cuOgBigy(ML4K@;iB&tDReq-@6P#`%P|YW!v)?@CWO$xe0tOEA!}W%SPAc z9|83e+&qE#y+-M;GqI^J_O0LtkG8Uz7T>@6Ky7`aFgVT?hmXhILxs2iCyE767KA#8 zAk{sVrYf+RLT}8mRdP<}fq38A?C~|oQ9Q!Q+T0rM=Z;a%4;1HzuWM9ADw&PD8K8}8 zB$Si-?|FS7vXX-NuOH^DM8YIw$v_!B3)))a4d}dgU9dQbNW)TazhPxf5i2I|$%0A$ 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 YPh#1#+(#GrPQf2dH9ge^W!pRd56GeTGynhq literal 0 HcmV?d00001 diff --git a/docs/runtime/heterogeneous-execution-add-conv-model.png b/docs/runtime/heterogeneous-execution-add-conv-model.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b216317936b0bd2be3c1fa08b6daefbf077589 GIT binary patch literal 19210 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 int(required[i]): - return True - - return True - -vars = Variables("scons") -vars.AddVariables( - BoolVariable("debug", "Debug", False), - BoolVariable("asserts", "Enable asserts (this flag is forced to 1 for debug=1)", False), - BoolVariable("logging", "Logging (this flag is forced to 1 for debug=1)", False), - EnumVariable("arch", "Target Architecture", "armv7a", allowed_values=("armv7a", "arm64-v8a", "arm64-v8.2-a", "arm64-v8.2-a-sve", "x86_32", "x86_64")), - EnumVariable("os", "Target OS", "linux", allowed_values=("linux", "android", "tizen", "bare_metal")), - EnumVariable("build", "Build type", "cross_compile", allowed_values=("native", "cross_compile", "embed_only")), - BoolVariable("examples", "Build example programs", True), - BoolVariable("Werror", "Enable/disable the -Werror compilation flag", True), - BoolVariable("standalone", "Builds the tests as standalone executables, links statically with libgcc, libstdc++ and libarm_compute", False), - BoolVariable("opencl", "Enable OpenCL support", True), - BoolVariable("neon", "Enable Neon support", False), - BoolVariable("gles_compute", "Enable OpenGL ES Compute Shader support", False), - BoolVariable("embed_kernels", "Embed OpenCL kernels and OpenGL ES compute shaders in library binary", True), - BoolVariable("set_soname", "Set the library's soname and shlibversion (requires SCons 2.4 or above)", False), - BoolVariable("openmp", "Enable OpenMP backend", False), - BoolVariable("cppthreads", "Enable C++11 threads backend", True), - PathVariable("build_dir", "Specify sub-folder for the build", ".", PathVariable.PathAccept), - PathVariable("install_dir", "Specify sub-folder for the install", "", PathVariable.PathAccept), - ("extra_cxx_flags", "Extra CXX flags to be appended to the build command", ""), - ("extra_link_flags", "Extra LD flags to be appended to the build command", ""), - ("compiler_cache", "Command to prefix to the C and C++ compiler (e.g ccache)", "") -) - -env = Environment(platform="posix", variables=vars, ENV = os.environ) -build_path = env['build_dir'] -# If build_dir is a relative path then add a #build/ prefix: -if not env['build_dir'].startswith('/'): - SConsignFile('build/%s/.scons' % build_path) - build_path = "#build/%s" % build_path -else: - SConsignFile('%s/.scons' % build_path) - -install_path = env['install_dir'] -#If the install_dir is a relative path then assume it's from inside build_dir -if not env['install_dir'].startswith('/') and install_path != "": - install_path = "%s/%s" % (build_path, install_path) - -env.Append(LIBPATH = [build_path]) -Export('env') -Export('vars') - -def install_lib( lib ): - # If there is no install folder, then there is nothing to do: - if install_path == "": - return lib - return env.Install( "%s/lib/" % install_path, lib) -def install_bin( bin ): - # If there is no install folder, then there is nothing to do: - if install_path == "": - return bin - return env.Install( "%s/bin/" % install_path, bin) -def install_include( inc ): - if install_path == "": - return inc - return env.Install( "%s/include/" % install_path, inc) - -Export('install_lib') -Export('install_bin') - -Help(vars.GenerateHelpText(env)) - -if env['build'] == "embed_only": - SConscript('./SConscript', variant_dir=build_path, duplicate=0) - Return() - -if env['neon'] and 'x86' in env['arch']: - print("Cannot compile NEON for x86") - Exit(1) - -if env['set_soname'] and not version_at_least(SCons.__version__, "2.4"): - print("Setting the library's SONAME / SHLIBVERSION requires SCons 2.4 or above") - print("Update your version of SCons or use set_soname=0") - Exit(1) - -if env['os'] == 'bare_metal': - if env['cppthreads'] or env['openmp']: - print("ERROR: OpenMP and C++11 threads not supported in bare_metal. Use cppthreads=0 openmp=0") - Exit(1) - -env.Append(CXXFLAGS = ['-Wno-deprecated-declarations','-Wall','-DARCH_ARM', - '-Wextra','-Wno-unused-parameter','-pedantic','-Wdisabled-optimization','-Wformat=2', - '-Winit-self','-Wstrict-overflow=2','-Wswitch-default', - '-fpermissive','-std=gnu++11','-Wno-vla','-Woverloaded-virtual', - '-Wctor-dtor-privacy','-Wsign-promo','-Weffc++','-Wno-format-nonliteral','-Wno-overlength-strings','-Wno-strict-overflow']) - -env.Append(CPPDEFINES = ['_GLIBCXX_USE_NANOSLEEP']) - -default_cpp_compiler = 'g++' if env['os'] != 'android' else 'clang++' -default_c_compiler = 'gcc' if env['os'] != 'android' else 'clang' -cpp_compiler = os.environ.get('CXX', default_cpp_compiler) -c_compiler = os.environ.get('CC', default_c_compiler) - -if env['os'] == 'android' and ( 'clang++' not in cpp_compiler or 'clang' not in c_compiler ): - print( "WARNING: Only clang is officially supported to build the Compute Library for Android") - -if 'clang++' in cpp_compiler: - env.Append(CXXFLAGS = ['-Wno-format-nonliteral','-Wno-deprecated-increment-bool','-Wno-vla-extension','-Wno-mismatched-tags']) -else: - env.Append(CXXFLAGS = ['-Wlogical-op','-Wnoexcept','-Wstrict-null-sentinel','-Wno-implicit-fallthrough']) - -if env['cppthreads']: - env.Append(CPPDEFINES = [('ARM_COMPUTE_CPP_SCHEDULER', 1)]) - -if env['openmp']: - if 'clang++' in cpp_compiler: - print( "Clang does not support OpenMP. Use scheduler=cpp.") - Exit(1) - - env.Append(CPPDEFINES = [('ARM_COMPUTE_OPENMP_SCHEDULER', 1)]) - env.Append(CXXFLAGS = ['-fopenmp']) - env.Append(LINKFLAGS = ['-fopenmp']) - -prefix = "" -if env['arch'] == 'armv7a': - env.Append(CXXFLAGS = ['-march=armv7-a', '-mthumb', '-mfpu=neon']) - - if env['os'] == 'linux': - prefix = "arm-linux-gnueabihf-" - env.Append(CXXFLAGS = ['-mfloat-abi=hard']) - elif env['os'] == 'bare_metal': - prefix = "arm-eabi-" - env.Append(CXXFLAGS = ['-mfloat-abi=hard']) - elif env['os'] == 'android': - prefix = "arm-linux-androideabi-" - env.Append(CXXFLAGS = ['-mfloat-abi=softfp']) - elif env['os'] == 'tizen': - prefix = "arm-linux-gnueabi-" - env.Append(CXXFLAGS = ['-mfloat-abi=softfp']) -elif env['arch'] == 'arm64-v8a': - env.Append(CXXFLAGS = ['-march=armv8-a']) - env.Append(CPPDEFINES = ['ARM_COMPUTE_AARCH64_V8A','NO_DOT_IN_TOOLCHAIN']) - if env['os'] == 'linux': - prefix = "aarch64-linux-gnu-" - elif env['os'] == 'bare_metal': - prefix = "aarch64-elf-" - elif env['os'] == 'android': - prefix = "aarch64-linux-android-" - elif env['os'] == 'tizen': - prefix = "aarch64-linux-gnu-" - if 'clang++' in cpp_compiler: - env.Append(CXXFLAGS = ['-no-integrated-as']) -elif 'arm64-v8.2-a' in env['arch']: - if env['arch'] == 'arm64-v8.2-a-sve': - if env['os'] != 'bare_metal': - print("Only bare metal SVE is supported at the moment") - Exit(1) - env.Append(CXXFLAGS = ['-march=armv8.2-a+sve+fp16+dotprod']) - else: - env.Append(CXXFLAGS = ['-march=armv8.2-a+fp16']) # explicitly enable fp16 extension otherwise __ARM_FEATURE_FP16_VECTOR_ARITHMETIC is undefined - if env['os'] == 'linux': - prefix = "aarch64-linux-gnu-" - elif env['os'] == 'bare_metal': - prefix = "aarch64-elf-" - elif env['os'] == 'android': - prefix = "aarch64-linux-android-" - elif env['os'] == 'tizen': - prefix = "aarch64-linux-gnu-" - env.Append(CPPDEFINES = ['ARM_COMPUTE_AARCH64_V8_2','NO_DOT_IN_TOOLCHAIN']) - if 'clang++' in cpp_compiler: - env.Append(CXXFLAGS = ['-no-integrated-as']) -elif env['arch'] == 'x86_32': - env.Append(CCFLAGS = ['-m32']) - env.Append(LINKFLAGS = ['-m32']) -elif env['arch'] == 'x86_64': - env.Append(CCFLAGS = ['-m64']) - env.Append(LINKFLAGS = ['-m64']) - -if env['build'] == 'native': - prefix = "" - -env['CC'] = env['compiler_cache']+" "+prefix + c_compiler -env['CXX'] = env['compiler_cache']+" "+prefix + cpp_compiler -env['LD'] = prefix + "ld" -env['AS'] = prefix + "as" -env['AR'] = prefix + "ar" -env['RANLIB'] = prefix + "ranlib" - -if not GetOption("help"): - try: - compiler_ver = subprocess.check_output(env['CXX'].split() + ["-dumpversion"]).strip() - except OSError: - print("ERROR: Compiler '%s' not found" % env['CXX']) - Exit(1) - - if 'clang++' not in cpp_compiler: - if env['arch'] == 'arm64-v8.2-a' and not version_at_least(compiler_ver, '6.2.1'): - print("GCC 6.2.1 or newer is required to compile armv8.2-a code") - Exit(1) - elif env['arch'] == 'arm64-v8a' and not version_at_least(compiler_ver, '4.9'): - print("GCC 4.9 or newer is required to compile NEON code for AArch64") - Exit(1) - - if version_at_least(compiler_ver, '6.1'): - env.Append(CXXFLAGS = ['-Wno-ignored-attributes']) - - if compiler_ver == '4.8.3': - env.Append(CXXFLAGS = ['-Wno-array-bounds']) - -if env['standalone']: - env.Append(CXXFLAGS = ['-fPIC']) - env.Append(LINKFLAGS = ['-static-libgcc','-static-libstdc++']) - -if env['Werror']: - env.Append(CXXFLAGS = ['-Werror']) - -if env['os'] == 'android': - env.Append(CPPDEFINES = ['ANDROID']) - env.Append(LINKFLAGS = ['-pie', '-static-libstdc++']) -elif env['os'] == 'bare_metal': - env.Append(LINKFLAGS = ['-static']) - env.Append(LINKFLAGS = ['-specs=rdimon.specs']) - env.Append(CXXFLAGS = ['-fPIC']) - env.Append(CPPDEFINES = ['NO_MULTI_THREADING']) - env.Append(CPPDEFINES = ['BARE_METAL']) - -if env['opencl']: - if env['os'] in ['bare_metal'] or env['standalone']: - print("Cannot link OpenCL statically, which is required for bare metal / standalone builds") - Exit(1) - -if env['gles_compute']: - if env['os'] in ['bare_metal'] or env['standalone']: - print("Cannot link OpenGLES statically, which is required for bare metal / standalone builds") - Exit(1) - -if env["os"] not in ["android", "bare_metal"] and (env['opencl'] or env['cppthreads']): - env.Append(LIBS = ['pthread']) - -if env['opencl'] or env['gles_compute']: - if env['embed_kernels']: - env.Append(CPPDEFINES = ['EMBEDDED_KERNELS']) - -if env['debug']: - env['asserts'] = True - env['logging'] = True - env.Append(CXXFLAGS = ['-O0','-g','-gdwarf-2']) - env.Append(CPPDEFINES = ['ARM_COMPUTE_DEBUG_ENABLED']) -else: - env.Append(CXXFLAGS = ['-O3','-ftree-vectorize']) - -if env['asserts']: - env.Append(CPPDEFINES = ['ARM_COMPUTE_ASSERTS_ENABLED']) - env.Append(CXXFLAGS = ['-fstack-protector-strong']) - -if env['logging']: - env.Append(CPPDEFINES = ['ARM_COMPUTE_LOGGING_ENABLED']) - -env.Append(CPPPATH = ['#/include', "#"]) -env.Append(CXXFLAGS = env['extra_cxx_flags']) -env.Append(LINKFLAGS = env['extra_link_flags']) - -Default( install_include("arm_compute")) -Default( install_include("support")) - -Export('version_at_least') - -if env['opencl']: - SConscript("./opencl-1.2-stubs/SConscript", variant_dir="%s/opencl-1.2-stubs" % build_path, duplicate=0) - -if env['gles_compute'] and env['os'] != 'android': - env.Append(CPPPATH = ['#/include/linux']) - SConscript("./opengles-3.1-stubs/SConscript", variant_dir="%s/opengles-3.1-stubs" % build_path, duplicate=0) - -SConscript('./SConscript', variant_dir=build_path, duplicate=0) - -if env['examples'] and env['os'] != 'bare_metal': - SConscript('./examples/SConscript', variant_dir='%s/examples' % build_path, duplicate=0) - -if env['os'] != 'bare_metal': - SConscript('./tests/SConscript', variant_dir='%s/tests' % build_path, duplicate=0) diff --git a/infra/cmake/packages/ARMComputeConfig.cmake b/infra/cmake/packages/ARMComputeConfig.cmake deleted file mode 100644 index 83c8d20..0000000 --- a/infra/cmake/packages/ARMComputeConfig.cmake +++ /dev/null @@ -1,192 +0,0 @@ -function(_ARMCompute_Import) - include(FindPackageHandleStandardArgs) - - list(APPEND ARMCompute_LIB_SEARCH_PATHS ${ARMCompute_PREFIX}) - - find_path(INCLUDE_DIR NAMES arm_compute/core/ITensor.h PATHS ${ARMCompute_INCLUDE_SEARCH_PATHS}) - - find_library(CORE_LIBRARY NAMES arm_compute_core PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) - find_library(RUNTIME_LIBRARY NAMES arm_compute PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) - find_library(GRAPH_LIBRARY NAMES arm_compute_graph PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) - - message(STATUS "Search acl in ${ARMCompute_LIB_SEARCH_PATHS}") - - if(NOT INCLUDE_DIR) - nnas_find_package(ARMComputeSource QUIET) - if (NOT ARMComputeSource_FOUND) - set(ARMCompute_FOUND FALSE PARENT_SCOPE) - return() - endif() - set(INCLUDE_DIR ${ARMComputeSource_DIR} ${ARMComputeSource_DIR}/include) - endif(NOT INCLUDE_DIR) - - if(NOT CORE_LIBRARY) - set(ARMCompute_FOUND FALSE PARENT_SCOPE) - message(STATUS "Cannot find libarm_compute_core.so") - return() - endif() - - if(NOT RUNTIME_LIBRARY) - message(STATUS "Cannot find libarm_compute.so") - set(ARMCompute_FOUND FALSE PARENT_SCOPE) - return() - endif() - - if(NOT GRAPH_LIBRARY) - message(STATUS "Cannot find libarm_compute_graph.so") - set(ARMCompute_FOUND FALSE PARENT_SCOPE) - return() - endif() - - if(NOT TARGET arm_compute_core) - add_library(arm_compute_core INTERFACE) - target_include_directories(arm_compute_core SYSTEM INTERFACE ${INCLUDE_DIR}) - target_link_libraries(arm_compute_core INTERFACE dl ${LIB_PTHREAD}) - target_link_libraries(arm_compute_core INTERFACE ${CORE_LIBRARY}) - endif(NOT TARGET arm_compute_core) - - if(NOT TARGET arm_compute) - add_library(arm_compute INTERFACE) - target_include_directories(arm_compute SYSTEM INTERFACE ${INCLUDE_DIR}) - target_link_libraries(arm_compute INTERFACE ${RUNTIME_LIBRARY}) - target_link_libraries(arm_compute INTERFACE arm_compute_core) - endif(NOT TARGET arm_compute) - - if(NOT TARGET arm_compute_graph) - add_library(arm_compute_graph INTERFACE) - target_include_directories(arm_compute_graph SYSTEM INTERFACE ${INCLUDE_DIR}) - target_link_libraries(arm_compute_graph INTERFACE ${GRAPH_LIBRARY}) - target_link_libraries(arm_compute_graph INTERFACE arm_compute) - endif(NOT TARGET arm_compute_graph) - - set(ARMCompute_FOUND TRUE PARENT_SCOPE) -endfunction(_ARMCompute_Import) - -### Check whether library exists -function(_ARMCompute_Check VAR LIBDIR) - set(FOUND TRUE) - - if(NOT EXISTS "${LIBDIR}/libarm_compute_core.so") - set(FOUND FALSE) - endif() - - if(NOT EXISTS "${LIBDIR}/libarm_compute.so") - set(FOUND FALSE) - endif() - - if(NOT EXISTS "${LIBDIR}/libarm_compute_graph.so") - set(FOUND FALSE) - endif() - - set(${VAR} ${FOUND} PARENT_SCOPE) -endfunction(_ARMCompute_Check) - -# Let's build and install ARMCompute libraries -# NOTE This function silently returns on error -function(_ARMCompute_Build ARMCompute_INSTALL_PREFIX) - ### Check whether library exists - _ARMCompute_Check(ARMCompute_FOUND ${ARMCompute_INSTALL_PREFIX}) - - if(ARMCompute_FOUND) - return() - endif(ARMCompute_FOUND) - - ### Let's build with SCONS - nnas_find_package(ARMComputeSource QUIET) - - if(NOT ARMComputeSource_FOUND) - return() - endif(NOT ARMComputeSource_FOUND) - - find_program(SCONS_PATH scons) - - if(NOT SCONS_PATH) - message(WARNING "SCONS NOT FOUND. Please install SCONS to build ARMCompute.") - return() - endif(NOT SCONS_PATH) - - if(CMAKE_BUILD_TYPE) - string(TOLOWER "${CMAKE_BUILD_TYPE}" SCON_BUILD_TYPE) - else(CMAKE_BUILD_TYPE) - set(SCON_BUILD_TYPE "release") - endif(CMAKE_BUILD_TYPE) - - #### Architecture-specific configurations - if(TARGET_ARCH STREQUAL "armv7l") - set(BUILD_ARCH "armv7a") - set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}") - endif() - - if(TARGET_ARCH STREQUAL "aarch64") - set(BUILD_ARCH "arm64-v8a") - set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}") - endif() - - #### Platform-specific configurations - #### TODO Support android - - #### Mode-specific configurations - if(SCON_BUILD_TYPE STREQUAL "debug") - list(APPEND SCONS_OPTIONS "debug=1") - endif() - - #### Generic configurations - list(APPEND SCONS_OPTIONS "neon=1") - list(APPEND SCONS_OPTIONS "opencl=1") - list(APPEND SCONS_OPTIONS "examples=0") - list(APPEND SCONS_OPTIONS "Werror=0") - list(APPEND SCONS_OPTIONS "os=${TARGET_OS}") - include(ProcessorCount) - ProcessorCount(N) - if((NOT N EQUAL 0) AND BUILD_EXT_MULTITHREAD) - list(APPEND SCONS_OPTIONS -j${N}) - endif() - if(DEFINED BUILD_ARCH) - list(APPEND SCONS_OPTIONS "arch=${BUILD_ARCH}") - endif(DEFINED BUILD_ARCH) - - if(DEFINED BUILD_DIR) - list(APPEND SCONS_OPTIONS "build_dir=${BUILD_DIR}") - endif(DEFINED BUILD_DIR) - - message(STATUS "Build ARMCompute with ${SCONS_PATH} ('${SCONS_OPTIONS}'") - - # Copy externals/SConstruct to externals/acl/ for Tizen build support. - # TODO The change of externals/SConstruct should be upstreamed to ARM Compute Library community layer. - # execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_LIST_DIR}/ARMCompute/SConstruct" "${ARMComputeSource_DIR}") - - # Build ARMCompute libraries with SCONS - # NOTE ARMCompute SConstruct unconditioanlly appends "arm-linux-gnueabihf-" prefix for linux - execute_process(COMMAND /usr/bin/env CC=gcc CXX=g++ "${SCONS_PATH}" ${SCONS_OPTIONS} - WORKING_DIRECTORY ${ARMComputeSource_DIR} - RESULT_VARIABLE ARMCompute_BUILD) - - # Install ARMCompute libraries - # Ps. CI server will copy below installed libraries to target device to test. - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${ARMCompute_INSTALL_PREFIX}" - WORKING_DIRECTORY ${ARMComputeSource_DIR} - RESULT_VARIABLE ARMCompute_BUILD) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_core.so" "${ARMCompute_INSTALL_PREFIX}" - COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute.so" "${ARMCompute_INSTALL_PREFIX}" - COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_graph.so" "${ARMCompute_INSTALL_PREFIX}" - WORKING_DIRECTORY ${ARMComputeSource_DIR} - RESULT_VARIABLE ARMCompute_BUILD) -endfunction(_ARMCompute_Build) - - -set(ARMCompute_PREFIX ${EXT_OVERLAY_DIR}/lib) - -# This is a workaround for CI issues -# Ps. CI server will copy below installed libraries to target device to test. -# TODO Remove this workaround -if(DEFINED ARMCompute_EXTDIR) - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${ARMCompute_PREFIX}") - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute_core.so" "${ARMCompute_PREFIX}" - COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute.so" "${ARMCompute_PREFIX}" - COMMAND ${CMAKE_COMMAND} -E copy "${ARMCompute_EXTDIR}/libarm_compute_graph.so" "${ARMCompute_PREFIX}") -endif(DEFINED ARMCompute_EXTDIR) - -if(BUILD_ARMCOMPUTE) - _ARMCompute_Build("${ARMCompute_PREFIX}") -endif(BUILD_ARMCOMPUTE) -_ARMCompute_Import() diff --git a/infra/cmake/packages/ARMComputeSourceConfig.cmake b/infra/cmake/packages/ARMComputeSourceConfig.cmake index 45d8727..51a235a 100644 --- a/infra/cmake/packages/ARMComputeSourceConfig.cmake +++ b/infra/cmake/packages/ARMComputeSourceConfig.cmake @@ -1,10 +1,15 @@ function(_ARMComputeSource_import) + if(NOT ${DOWNLOAD_ARMCOMPUTE}) + set(ARMComputeSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_ARMCOMPUTE}) + nnas_include(ExternalSourceTools) nnas_include(OptionTools) envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(ARMCOMPUTE_URL ${EXTERNAL_DOWNLOAD_SERVER}/ARM-software/ComputeLibrary/archive/v19.11.1.tar.gz) - ExternalSource_Get(ARMCOMPUTE ${DOWNLOAD_ARMCOMPUTE} ${ARMCOMPUTE_URL}) + ExternalSource_Download(ARMCOMPUTE ${ARMCOMPUTE_URL}) set(ARMComputeSource_DIR ${ARMCOMPUTE_SOURCE_DIR} PARENT_SCOPE) set(ARMComputeSource_FOUND ${ARMCOMPUTE_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/cmake/packages/AbseilConfig.cmake b/infra/cmake/packages/AbseilConfig.cmake index 06d36b9..e16dd94 100644 --- a/infra/cmake/packages/AbseilConfig.cmake +++ b/infra/cmake/packages/AbseilConfig.cmake @@ -17,13 +17,15 @@ function(_Abseil_import) add_library(abseil INTERFACE) target_link_libraries(abseil INTERFACE # From "Available Abseil CMake Public Targets" in CMake/README.md - absl::base absl::algorithm - absl::container + absl::base absl::debugging + absl::flat_hash_map + absl::flags absl::memory absl::meta absl::numeric + absl::random_random absl::strings absl::synchronization absl::time diff --git a/infra/cmake/packages/AbseilSourceConfig.cmake b/infra/cmake/packages/AbseilSourceConfig.cmake index 7c5d4bd..8be7326 100644 --- a/infra/cmake/packages/AbseilSourceConfig.cmake +++ b/infra/cmake/packages/AbseilSourceConfig.cmake @@ -12,10 +12,14 @@ function(_AbseilSource_import) # # The last change of "48cd2c3f351" was commited on 2018.09.27 # - # Let's use the latest released version (2018-12 release) - envoption(ABSEIL_URL https://github.com/abseil/abseil-cpp/archive/20181200.tar.gz) + # Let's use the latest released version (2020-02 release patch 2) + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + envoption(ABSEIL_URL ${EXTERNAL_DOWNLOAD_SERVER}/abseil/abseil-cpp/archive/20200225.2.tar.gz) - ExternalSource_Download(ABSEIL ${ABSEIL_URL}) + ExternalSource_Download(ABSEIL + DIRNAME ABSEIL + URL ${ABSEIL_URL} + CHECKSUM MD5=73f2b6e72f1599a9139170c29482ddc4) set(AbseilSource_DIR ${ABSEIL_SOURCE_DIR} PARENT_SCOPE) set(AbseilSource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/BoostSourceConfig.cmake b/infra/cmake/packages/BoostSourceConfig.cmake index 07d1800..ea2a6ca 100644 --- a/infra/cmake/packages/BoostSourceConfig.cmake +++ b/infra/cmake/packages/BoostSourceConfig.cmake @@ -1,11 +1,16 @@ function(_BoostSource_import) + if(NOT ${DOWNLOAD_BOOST}) + set(BoostSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_BOOST}) + nnas_include(ExternalSourceTools) nnas_include(OptionTools) # EXTERNAL_DOWNLOAD_SERVER will be overwritten by CI server to use mirror server. envoption(EXTERNAL_DOWNLOAD_SERVER "http://sourceforge.net") set(BOOST_URL ${EXTERNAL_DOWNLOAD_SERVER}/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.gz) - ExternalSource_Get(BOOST ${DOWNLOAD_BOOST} ${BOOST_URL}) + ExternalSource_Download(BOOST ${BOOST_URL}) set(BoostSource_DIR ${BOOST_SOURCE_DIR} PARENT_SCOPE) set(BoostSource_FOUND ${BOOST_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/cmake/packages/CaffeConfig.cmake b/infra/cmake/packages/CaffeConfig.cmake index 0d27ef4..3ae5440 100644 --- a/infra/cmake/packages/CaffeConfig.cmake +++ b/infra/cmake/packages/CaffeConfig.cmake @@ -20,7 +20,7 @@ function(_Caffe_import) return() endif() - find_package(HDF5 COMPONENTS HL QUIET) + nnas_find_package(HDF5 QUIET) if(NOT HDF5_FOUND) set(Caffe_FOUND FALSE PARENT_SCOPE) diff --git a/infra/cmake/packages/CpuinfoSourceConfig.cmake b/infra/cmake/packages/CpuinfoSourceConfig.cmake deleted file mode 100644 index 1f3b477..0000000 --- a/infra/cmake/packages/CpuinfoSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_cpuinfoSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(CPUINFO_URL ${EXTERNAL_DOWNLOAD_SERVER}/pytorch/cpuinfo/archive/d5e37adf1406cf899d7d9ec1d317c47506ccb970.tar.gz) - - ExternalSource_Get("CPUINFO" ${DOWNLOAD_NNPACK} ${CPUINFO_URL}) - - set(CPUINFO_SOURCE_DIR ${CPUINFO_SOURCE_DIR} PARENT_SCOPE) - set(CPUINFO_SOURCE_FOUND ${CPUINFO_SOURCE_GET} PARENT_SCOPE) -endfunction(_cpuinfoSource_import) - -_cpuinfoSource_import() diff --git a/infra/cmake/packages/Eigen-fd6845384b86Config.cmake b/infra/cmake/packages/Eigen-fd6845384b86Config.cmake new file mode 100644 index 0000000..e98856a --- /dev/null +++ b/infra/cmake/packages/Eigen-fd6845384b86Config.cmake @@ -0,0 +1,25 @@ +# NOTE TensorFlow 1.12 uses eigen commit ID fd6845384b86 + +# find_package rejects version with commit number. Commit ID is appended to the package name +# as a workaround. +# +# TODO Find a better way +function(_Eigen_import) + nnas_find_package(EigenSource-fd6845384b86 QUIET) + + if(NOT EigenSource-fd6845384b86_FOUND) + set(Eigen-fd6845384b86_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT EigenSource-fd6845384b86_FOUND) + + if(NOT TARGET eigen-fd6845384b86) + add_library(eigen-fd6845384b86 INTERFACE) + target_include_directories(eigen-fd6845384b86 INTERFACE "${EigenSource_DIR}") + # Add EIGEN_MPL2_ONLY to remove license issue posibility + target_compile_definitions(eigen-fd6845384b86 INTERFACE EIGEN_MPL2_ONLY) + endif(NOT TARGET eigen-fd6845384b86) + + set(Eigen-fd6845384b86_FOUND TRUE PARENT_SCOPE) +endfunction(_Eigen_import) + +_Eigen_import() diff --git a/infra/cmake/packages/EigenSource-fd6845384b86Config.cmake b/infra/cmake/packages/EigenSource-fd6845384b86Config.cmake index dc322cf..4a854e7 100644 --- a/infra/cmake/packages/EigenSource-fd6845384b86Config.cmake +++ b/infra/cmake/packages/EigenSource-fd6845384b86Config.cmake @@ -11,6 +11,7 @@ function(_import) nnas_include(ExternalSourceTools) nnas_include(ThirdPartyTools) + # NOTE TensorFlow 1.12 downloads eigen from the following URL ThirdParty_URL(EIGEN_URL PACKAGE Eigen VERSION fd6845384b86) ExternalSource_Download(EIGEN diff --git a/infra/cmake/packages/EigenSourceConfig.cmake b/infra/cmake/packages/EigenSourceConfig.cmake index 14ed5e7..a0cbf82 100644 --- a/infra/cmake/packages/EigenSourceConfig.cmake +++ b/infra/cmake/packages/EigenSourceConfig.cmake @@ -7,10 +7,15 @@ function(_EigenSource_import) nnas_include(ExternalSourceTools) nnas_include(OptionTools) - # NOTE The following URL comes from TensorFlow 1.7 - envoption(EIGEN_URL https://bitbucket.org/eigen/eigen/get/2355b229ea4c.tar.gz) + # NOTE TensorFlow 1.13.1 uses https://bitbucket.org/eigen/eigen/get/9f48e814419e.tar.gz + # but it has a issue https://eigen.tuxfamily.org/bz/show_bug.cgi?id=1643 + # The following URL resolves above issue + envoption(EXTERNAL_DOWNLOAD_SERVER "https://bitbucket.org") + envoption(EIGEN_1_13_1_URL ${EXTERNAL_DOWNLOAD_SERVER}/eigen/eigen/get/88fc23324517.tar.gz) - ExternalSource_Download(EIGEN ${EIGEN_URL}) + ExternalSource_Download(EIGEN + DIRNAME EIGEN + URL ${EIGEN_1_13_1_URL}) set(EigenSource_DIR ${EIGEN_SOURCE_DIR} PARENT_SCOPE) set(EigenSource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/Enum34SourceConfig.cmake b/infra/cmake/packages/Enum34SourceConfig.cmake deleted file mode 100644 index 04d22eb..0000000 --- a/infra/cmake/packages/Enum34SourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_enum34Source_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://bitbucket.org") - set(ENUM34_URL ${EXTERNAL_DOWNLOAD_SERVER}/stoneleaf/enum34/get/1.1.6.tar.gz) - - ExternalSource_Get("PYTHON_ENUM" ${DOWNLOAD_NNPACK} ${ENUM34_URL}) - - set(PYTHON_ENUM_SOURCE_DIR ${PYTHON_ENUM_SOURCE_DIR} PARENT_SCOPE) - set(PYTHON_ENUM_SOURCE_FOUND ${PYTHON_ENUM_SOURCE_GET} PARENT_SCOPE) -endfunction(_enum34Source_import) - -_enum34Source_import() diff --git a/infra/cmake/packages/FP16SourceConfig.cmake b/infra/cmake/packages/FP16SourceConfig.cmake deleted file mode 100644 index c7e9db5..0000000 --- a/infra/cmake/packages/FP16SourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_FP16Source_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(FP16_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/FP16/archive/febbb1c163726b5db24bed55cc9dc42529068997.tar.gz) - - ExternalSource_Get("FP16" ${DOWNLOAD_NNPACK} ${FP16_URL}) - - set(FP16_SOURCE_DIR ${FP16_SOURCE_DIR} PARENT_SCOPE) - set(FP16_SOURCE_FOUND ${FP16_SOURCE_GET} PARENT_SCOPE) -endfunction(_FP16Source_import) - -_FP16Source_import() diff --git a/infra/cmake/packages/FXdivSourceConfig.cmake b/infra/cmake/packages/FXdivSourceConfig.cmake deleted file mode 100644 index fa41adb..0000000 --- a/infra/cmake/packages/FXdivSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_FXdivSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(FXDIV_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/FXdiv/archive/f8c5354679ec2597792bc70a9e06eff50c508b9a.tar.gz) - - ExternalSource_Get("FXDIV" ${DOWNLOAD_NNPACK} ${FXDIV_URL}) - - set(FXDIV_SOURCE_DIR ${FXDIV_SOURCE_DIR} PARENT_SCOPE) - set(FXDIV_SOURCE_FOUND ${FXDIV_SOURCE_GET} PARENT_SCOPE) -endfunction(_FXdivSource_import) - -_FXdivSource_import() diff --git a/infra/cmake/packages/FarmhashSourceConfig.cmake b/infra/cmake/packages/FarmhashSourceConfig.cmake index 66cadab..8a9a384 100644 --- a/infra/cmake/packages/FarmhashSourceConfig.cmake +++ b/infra/cmake/packages/FarmhashSourceConfig.cmake @@ -7,10 +7,12 @@ function(_FarmhashSource_import) nnas_include(ExternalSourceTools) nnas_include(OptionTools) - # NOTE TensorFlow 1.7 downloads farmhash from the following URL - envoption(FARMHASH_URL https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz) + # NOTE TensorFlow 1.12 downloads farmhash from the following URL + # TensorFlow 1.13.1 downloads farmhash from the following URL + # TensorFlow 2.3-rc0 downloads farmhash from the following URL + envoption(FARMHASH_1_12_URL https://github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz) - ExternalSource_Download(FARMHASH ${FARMHASH_URL}) + ExternalSource_Download(FARMHASH ${FARMHASH_1_12_URL}) set(FarmhashSource_DIR ${FARMHASH_SOURCE_DIR} PARENT_SCOPE) set(FarmhashSource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/FlatBuffersSource-1.10/FlatBuffersSourceConfig.cmake b/infra/cmake/packages/FlatBuffersSource-1.10/FlatBuffersSourceConfig.cmake index 5a7aa3a..09a922b 100644 --- a/infra/cmake/packages/FlatBuffersSource-1.10/FlatBuffersSourceConfig.cmake +++ b/infra/cmake/packages/FlatBuffersSource-1.10/FlatBuffersSourceConfig.cmake @@ -8,8 +8,11 @@ function(_FlatBuffersSource_import) nnas_include(OptionTools) envoption(FLATBUFFERS_1_10_URL https://github.com/google/flatbuffers/archive/v1.10.0.tar.gz) - - ExternalSource_Download(FLATBUFFERS DIRNAME FLATBUFFERS-1.10 ${FLATBUFFERS_1_10_URL}) + ExternalSource_Download(FLATBUFFERS + DIRNAME FLATBUFFERS-1.10 + CHECKSUM MD5=f7d19a3f021d93422b0bc287d7148cd2 + URL ${FLATBUFFERS_1_10_URL} + ) set(FlatBuffersSource_DIR ${FLATBUFFERS_SOURCE_DIR} PARENT_SCOPE) set(FlatBuffersSource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfig.cmake b/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfig.cmake new file mode 100644 index 0000000..92efbf9 --- /dev/null +++ b/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfig.cmake @@ -0,0 +1,21 @@ +function(_FlatBuffersSource_import) + if(NOT DOWNLOAD_FLATBUFFERS) + set(FlatBuffersSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_FLATBUFFERS) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(FLATBUFFERS_1_11_URL https://github.com/google/flatbuffers/archive/v1.11.0.tar.gz) + ExternalSource_Download(FLATBUFFERS + DIRNAME FLATBUFFERS-1.11 + CHECKSUM MD5=02c64880acb89dbd57eebacfd67200d8 + URL ${FLATBUFFERS_1_11_URL} + ) + + set(FlatBuffersSource_DIR ${FLATBUFFERS_SOURCE_DIR} PARENT_SCOPE) + set(FlatBuffersSource_FOUND TRUE PARENT_SCOPE) +endfunction(_FlatBuffersSource_import) + +_FlatBuffersSource_import() diff --git a/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfigVersion.cmake b/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfigVersion.cmake new file mode 100644 index 0000000..f008e05 --- /dev/null +++ b/infra/cmake/packages/FlatBuffersSource-1.11/FlatBuffersSourceConfigVersion.cmake @@ -0,0 +1,10 @@ +set(PACKAGE_VERSION "1.11") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfig.cmake b/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfig.cmake deleted file mode 100644 index a44f325..0000000 --- a/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfig.cmake +++ /dev/null @@ -1,18 +0,0 @@ -function(_FlatBuffersSource_import) - if(NOT DOWNLOAD_FLATBUFFERS) - set(FlatBuffersSource_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT DOWNLOAD_FLATBUFFERS) - - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(FLATBUFFERS_1_8_URL https://github.com/google/flatbuffers/archive/v1.8.0.tar.gz) - - ExternalSource_Download(FLATBUFFERS DIRNAME FLATBUFFERS-1.8 ${FLATBUFFERS_1_8_URL}) - - set(FlatBuffersSource_DIR ${FLATBUFFERS_SOURCE_DIR} PARENT_SCOPE) - set(FlatBuffersSource_FOUND TRUE PARENT_SCOPE) -endfunction(_FlatBuffersSource_import) - -_FlatBuffersSource_import() diff --git a/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfigVersion.cmake b/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfigVersion.cmake deleted file mode 100644 index ac5e9b2..0000000 --- a/infra/cmake/packages/FlatBuffersSource-1.8/FlatBuffersSourceConfigVersion.cmake +++ /dev/null @@ -1,10 +0,0 @@ -set(PACKAGE_VERSION "1.8") -set(PACKAGE_VERSION_EXACT FALSE) -set(PACKAGE_VERSION_COMPATIBLE FALSE) -set(PACKAGE_VERSION_UNSUITABLE TRUE) - -if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) - set(PACKAGE_VERSION_EXACT TRUE) - set(PACKAGE_VERSION_COMPATIBLE TRUE) - set(PACKAGE_VERSION_UNSUITABLE FALSE) -endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/FlatBuffersSourceConfig.cmake b/infra/cmake/packages/FlatBuffersSourceConfig.cmake index a35bc37..52bce6d 100644 --- a/infra/cmake/packages/FlatBuffersSourceConfig.cmake +++ b/infra/cmake/packages/FlatBuffersSourceConfig.cmake @@ -15,8 +15,11 @@ function(_FlatBuffersSource_import) # # TODO Manage multiple versions envoption(FLATBUFFERS_URL https://github.com/google/flatbuffers/archive/v1.10.0.tar.gz) - - ExternalSource_Download(FLATBUFFERS ${FLATBUFFERS_URL}) + ExternalSource_Download(FLATBUFFERS + DIRNAME FLATBUFFERS + CHECKSUM MD5=f7d19a3f021d93422b0bc287d7148cd2 + URL ${FLATBUFFERS_URL} + ) set(FlatBuffersSource_DIR ${FLATBUFFERS_SOURCE_DIR} PARENT_SCOPE) set(FlatBuffersSource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/GEMMLowpSourceConfig.cmake b/infra/cmake/packages/GEMMLowpSourceConfig.cmake index f5fe9d7..6e1cfa9 100644 --- a/infra/cmake/packages/GEMMLowpSourceConfig.cmake +++ b/infra/cmake/packages/GEMMLowpSourceConfig.cmake @@ -7,8 +7,9 @@ function(_GEMMLowpSource_import) nnas_include(ExternalSourceTools) nnas_include(OptionTools) - # NOTE TensorFlow 1.7 uses the following URL - envoption(GEMMLOWP_URL https://github.com/google/gemmlowp/archive/7c7c744640ddc3d0af18fb245b4d23228813a71b.zip) + # NOTE TensorFlow 1.12 uses the following URL + # TensorFlow 1.13.1 uses the following URL + envoption(GEMMLOWP_URL https://github.com/google/gemmlowp/archive/38ebac7b059e84692f53e5938f97a9943c120d98.tar.gz) ExternalSource_Download(GEMMLOWP ${GEMMLOWP_URL}) diff --git a/infra/cmake/packages/HDF5Config.cmake b/infra/cmake/packages/HDF5Config.cmake new file mode 100644 index 0000000..e282e0b --- /dev/null +++ b/infra/cmake/packages/HDF5Config.cmake @@ -0,0 +1,70 @@ +function(_HDF5_build) + if(NOT BUILD_HDF5) + return() + endif(NOT BUILD_HDF5) + + nnas_find_package(HDF5Source QUIET) + + if(NOT HDF5Source_FOUND) + return() + endif(NOT HDF5Source_FOUND) + + nnas_include(ExternalBuildTools) + ExternalBuild_CMake(CMAKE_DIR ${HDF5Source_DIR} + BUILD_DIR ${CMAKE_BINARY_DIR}/externals/HDF5/build + INSTALL_DIR ${EXT_OVERLAY_DIR} + IDENTIFIER "1.8.16" + PKG_NAME "HDF5" + EXTRA_OPTS "-DBUILD_SHARED_LIBS:BOOL=ON" + "-DHDF5_BUILD_TOOLS:BOOL=ON" + "-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF" + "-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF") + +endfunction(_HDF5_build) + +_HDF5_build() + +find_path(HDF5_CONFIG_DIR "hdf5-config.cmake" + PATHS ${EXT_OVERLAY_DIR} + PATH_SUFFIXES + share/cmake + share/cmake/hdf5 + cmake/hdf5 + lib/cmake/hdf5) + +include(${HDF5_CONFIG_DIR}/hdf5-config.cmake) + +unset(HDF5_INCLUDE_DIRS) +unset(HDF5_C_INCLUDE_DIRS) +unset(HDF5_CXX_INCLUDE_DIRS) +unset(HDF5_HL_INCLUDE_DIRS) + +unset(HDF5_LIBRARIES) +unset(HDF5_HL_LIBRARIES) +unset(HDF5_C_LIBRARIES) +unset(HDF5_CXX_LIBRARIES) +unset(HDF5_C_HL_LIBRARIES) +unset(HDF5_CXX_HL_LIBRARIES) + +# If user doesn't specify static or shared, set it to shared by default +list(FIND HDF5_FIND_COMPONENTS "STATIC" _index) +if(${_index} GREATER -1) + # static + set(_SUFFIX "-static") +else() + # shared + set(_SUFFIX "-shared") +endif() + +list(REMOVE_ITEM HDF5_FIND_COMPONENTS "static;shared") +set(HDF5_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) +foreach(COMP HDF5_FIND_COMPONENTS) + set(HDF5_${COMP}_INCLUDE_DIRS ${HDF5_INCLUDE_DIR}) +endforeach() + +set(HDF5_LIBRARIES "hdf5${_SUFFIX}") +set(HDF5_C_LIBRARIES "hdf5${_SUFFIX}") +set(HDF5_CXX_LIBRARIES "hdf5_cpp${_SUFFIX}") +set(HDF5_HL_LIBRARIES "hdf5_hl${_SUFFIX}") +set(HDF5_C_HL_LIBRARIES "hdf5_hl${_SUFFIX}") +set(HDF5_CXX_HL_LIBRARIES "hdf5_hl_cpp${_SUFFIX}") diff --git a/infra/cmake/packages/HDF5SourceConfig.cmake b/infra/cmake/packages/HDF5SourceConfig.cmake new file mode 100644 index 0000000..134efa6 --- /dev/null +++ b/infra/cmake/packages/HDF5SourceConfig.cmake @@ -0,0 +1,18 @@ +function(_HDF5Source_import) + if(NOT DOWNLOAD_HDF5) + set(HDF5Source_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_HDF5) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(HDF5_URL https://github.com/HDFGroup/hdf5/archive/hdf5-1_8_16.tar.gz) + + ExternalSource_Download(HDF5 ${HDF5_URL}) + + set(HDF5Source_DIR ${HDF5_SOURCE_DIR} PARENT_SCOPE) + set(HDF5Source_FOUND TRUE PARENT_SCOPE) +endfunction(_HDF5Source_import) + +_HDF5Source_import() diff --git a/infra/cmake/packages/NEON2SSESourceConfig.cmake b/infra/cmake/packages/NEON2SSESourceConfig.cmake index c6585c0..5970ec7 100644 --- a/infra/cmake/packages/NEON2SSESourceConfig.cmake +++ b/infra/cmake/packages/NEON2SSESourceConfig.cmake @@ -7,10 +7,12 @@ function(_NEON2SSESource_import) nnas_include(ExternalSourceTools) nnas_include(OptionTools) - # NOTE TensorFlow 1.7 downloads NEON2SSE from the following URL - envoption(NEON2SSE_URL https://github.com/intel/ARM_NEON_2_x86_SSE/archive/0f77d9d182265259b135dad949230ecbf1a2633d.tar.gz) + # NOTE TensorFlow 1.12 downloads NEON2SSE from the following URL + # NOTE TensorFlow 1.13.1 downloads NEON2SSE from the following URL + # NOTE TensorFlow 2.2 downloads NEON2SSE from the following URL + envoption(NEON2SSE_1_12_URL https://github.com/intel/ARM_NEON_2_x86_SSE/archive/1200fe90bb174a6224a525ee60148671a786a71f.tar.gz) - ExternalSource_Download(NEON2SSE ${NEON2SSE_URL}) + ExternalSource_Download(NEON2SSE ${NEON2SSE_1_12_URL}) set(NEON2SSESource_DIR ${NEON2SSE_SOURCE_DIR} PARENT_SCOPE) set(NEON2SSESource_FOUND TRUE PARENT_SCOPE) diff --git a/infra/cmake/packages/NNPACKConfig.cmake b/infra/cmake/packages/NNPACKConfig.cmake deleted file mode 100644 index 31a02a6..0000000 --- a/infra/cmake/packages/NNPACKConfig.cmake +++ /dev/null @@ -1,51 +0,0 @@ -function(_NNPACK_Import) - nnas_find_package(NNPACKSource QUIET) - - if(NOT NNPACK_SOURCE_FOUND) - set(NNPACK_FOUND FALSE PARENT_SCOPE) - message(STATUS "NNPACK not found") - return() - endif(NOT NNPACK_SOURCE_FOUND) - - nnas_find_package(CpuinfoSource REQUIRED) - nnas_find_package(FP16Source REQUIRED) - nnas_find_package(FXdivSource REQUIRED) - nnas_find_package(PSIMDSource REQUIRED) - nnas_find_package(PthreadpoolSource REQUIRED) - nnas_find_package(SixSource REQUIRED) - nnas_find_package(Enum34Source REQUIRED) - nnas_find_package(OpcodesSource REQUIRED) - nnas_find_package(PeachpySource QUIET) - - if(NOT PYTHON_PEACHPY_SOURCE_FOUND) - set(NNPACK_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT PYTHON_PEACHPY_SOURCE_FOUND) - - # workaround for CI - set(THREADS_PTHREAD_ARG "2" CACHE STRING "Forcibly set by CMakeLists.txt." FORCE) - if(NOT TARGET nnpack) - # Allows us to build nnpack at build time - set(NNPACK_BUILD_TESTS OFF CACHE BOOL "") - set(NNPACK_BUILD_BENCHMARKS OFF CACHE BOOL "") - set(NNPACK_LIBRARY_TYPE "static" CACHE STRING "") - set(PTHREADPOOL_LIBRARY_TYPE "static" CACHE STRING "") - set(CPUINFO_LIBRARY_TYPE "static" CACHE STRING "") - nnas_include(ExternalProjectTools) - add_extdirectory("${NNPACK_SOURCE_DIR}" nnpack EXCLUDE_FROM_ALL) - # We build static versions of nnpack and pthreadpool but link - # them into a shared library (high-perf-backend), so they need PIC. - set_property(TARGET nnpack PROPERTY POSITION_INDEPENDENT_CODE ON) - set_property(TARGET pthreadpool PROPERTY POSITION_INDEPENDENT_CODE ON) - set_property(TARGET cpuinfo PROPERTY POSITION_INDEPENDENT_CODE ON) - endif() - - set(NNPACK_FOUND TRUE PARENT_SCOPE) - set(NNPACK_INCLUDE_DIRS - $ - $ PARENT_SCOPE) - set(NNPACK_LIBRARIES $ $ PARENT_SCOPE) - -endfunction(_NNPACK_Import) - -_NNPACK_Import() diff --git a/infra/cmake/packages/NNPACKSourceConfig.cmake b/infra/cmake/packages/NNPACKSourceConfig.cmake deleted file mode 100644 index 10a08ea..0000000 --- a/infra/cmake/packages/NNPACKSourceConfig.cmake +++ /dev/null @@ -1,20 +0,0 @@ -function(_NNPACKSource_import) - if(NOT DOWNLOAD_NNPACK) - set(NNPACKSource_FOUND FALSE PARENT_SCOPE) - message(WARNING "NNPACK not downloaded") - return() - endif(NOT DOWNLOAD_NNPACK) - - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(NNPACK_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/NNPACK/archive/c039579abe21f5756e0f0e45e8e767adccc11852.tar.gz) - ExternalSource_Get("NNPACK" ${DOWNLOAD_NNPACK} ${NNPACK_URL}) - - set(NNPACK_SOURCE_DIR ${NNPACK_SOURCE_DIR} PARENT_SCOPE) - set(NNPACK_INCLUDE_DIR ${NNPACK_SOURCE_DIR}/include PARENT_SCOPE) - set(NNPACK_SOURCE_FOUND ${NNPACK_SOURCE_GET} PARENT_SCOPE) -endfunction(_NNPACKSource_import) - -_NNPACKSource_import() diff --git a/infra/cmake/packages/NoniusConfig.cmake b/infra/cmake/packages/NoniusConfig.cmake deleted file mode 100644 index fa18ebb..0000000 --- a/infra/cmake/packages/NoniusConfig.cmake +++ /dev/null @@ -1,26 +0,0 @@ -function(_Nonius_import) - nnas_find_package(NoniusSource QUIET) - - if(NOT NoniusSource_FOUND) - set(Nonius_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT NoniusSource_FOUND) - - if(NOT TARGET nonius) - message(STATUS "Found nonius: TRUE") - add_library(nonius INTERFACE) - target_include_directories(nonius INTERFACE "${NoniusSource_DIR}/include") - endif(NOT TARGET nonius) - - if(BUILD_KBENCHMARK) - # Copy html_report_template.g.h++ file to externals/nonius. - # This header file is modified to show the html summary view according to the layer in kbenchmark. - execute_process(COMMAND ${CMAKE_COMMAND} -E copy - "${CMAKE_CURRENT_LIST_DIR}/Nonius/html_report_template.g.h++" - "${NoniusSource_DIR}/include/nonius/detail") - endif(BUILD_KBENCHMARK) - - set(Nonius_FOUND TRUE PARENT_SCOPE) -endfunction(_Nonius_import) - -_Nonius_import() diff --git a/infra/cmake/packages/NoniusSourceConfig.cmake b/infra/cmake/packages/NoniusSourceConfig.cmake index 16de639..0af23ef 100644 --- a/infra/cmake/packages/NoniusSourceConfig.cmake +++ b/infra/cmake/packages/NoniusSourceConfig.cmake @@ -1,10 +1,23 @@ function(_NoniusSource_import) + if(NOT ${DOWNLOAD_NONIUS}) + set(NoniusSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_NONIUS}) + nnas_include(ExternalSourceTools) nnas_include(OptionTools) envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(NONIUS_URL ${EXTERNAL_DOWNLOAD_SERVER}/libnonius/nonius/archive/v1.2.0-beta.1.tar.gz) - ExternalSource_Get("NONIUS" ${DOWNLOAD_NONIUS} ${NONIUS_URL}) + ExternalSource_Download("NONIUS" ${NONIUS_URL}) + + if(BUILD_KBENCHMARK) + # Copy html_report_template.g.h++ file to externals/nonius. + # This header file is modified to show the html summary view according to the layer in kbenchmark. + execute_process(COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_CURRENT_LIST_DIR}/Nonius/html_report_template.g.h++" + "${NoniusSource_DIR}/include/nonius/detail") + endif(BUILD_KBENCHMARK) set(NoniusSource_DIR ${NONIUS_SOURCE_DIR} PARENT_SCOPE) set(NoniusSource_FOUND ${NONIUS_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/cmake/packages/OpcodesSourceConfig.cmake b/infra/cmake/packages/OpcodesSourceConfig.cmake deleted file mode 100644 index 8b324ea..0000000 --- a/infra/cmake/packages/OpcodesSourceConfig.cmake +++ /dev/null @@ -1,13 +0,0 @@ -function(_PeachpySource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(PEACHPY_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/Opcodes/archive/6e2b0cd9f1403ecaf164dea7019dd54db5aea252.tar.gz) - ExternalSource_Get("PYTHON_OPCODES" ${DOWNLOAD_NNPACK} ${PEACHPY_URL}) - - set(PYTHON_OPCODES_SOURCE_DIR ${PYTHON_OPCODES_SOURCE_DIR} PARENT_SCOPE) - set(PYTHON_OPCODES_SOURCE_FOUND ${PYTHON_OPCODES_SOURCE_GET} PARENT_SCOPE) -endfunction(_PeachpySource_import) - -_PeachpySource_import() diff --git a/infra/cmake/packages/PSIMDSourceConfig.cmake b/infra/cmake/packages/PSIMDSourceConfig.cmake deleted file mode 100644 index c14ad73..0000000 --- a/infra/cmake/packages/PSIMDSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_PSIMDSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(PSIMD_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/psimd/archive/90a938f30ba414ada2f4b00674ee9631d7d85e19.tar.gz) - - ExternalSource_Get("PSIMD" ${DOWNLOAD_NNPACK} ${PSIMD_URL}) - - set(PSIMD_SOURCE_DIR ${PSIMD_SOURCE_DIR} PARENT_SCOPE) - set(PSIMD_SOURCE_FOUND ${PSIMD_SOURCE_GET} PARENT_SCOPE) -endfunction(_PSIMDSource_import) - -_PSIMDSource_import() diff --git a/infra/cmake/packages/PeachpySourceConfig.cmake b/infra/cmake/packages/PeachpySourceConfig.cmake deleted file mode 100644 index fea8d14..0000000 --- a/infra/cmake/packages/PeachpySourceConfig.cmake +++ /dev/null @@ -1,31 +0,0 @@ -function(_PeachpySource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(PEACHPY_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/PeachPy/archive/01d15157a973a4ae16b8046313ddab371ea582db.tar.gz) - - ExternalSource_Get("PYTHON_PEACHPY" ${DOWNLOAD_NNPACK} ${PEACHPY_URL}) - FIND_PACKAGE(PythonInterp) - - nnfw_find_package(SixSource REQUIRED) - nnfw_find_package(Enum34Source REQUIRED) - nnfw_find_package(OpcodesSource REQUIRED) - - # Generate opcodes: - SET(ENV{PYTHONPATH} ${PYTHON_PEACHPY_SOURCE_DIR}:${PYTHON_SIX_SOURCE_DIR}:${PYTHON_ENUM_SOURCE_DIR}:${PYTHON_OPCODES_SOURCE_DIR}) - EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ./codegen/x86_64.py - WORKING_DIRECTORY ${PYTHON_PEACHPY_SOURCE_DIR} - RESULT_VARIABLE BUILT_PP) - - if(NOT BUILT_PP EQUAL 0) - # Mark PYTHON_PEACHPY_SOURCE_FOUND as FALSE if source generation fails - set(PYTHON_PEACHPY_SOURCE_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT BUILT_PP EQUAL 0) - - set(PYTHON_PEACHPY_SOURCE_DIR ${PYTHON_PEACHPY_SOURCE_DIR} PARENT_SCOPE) - set(PYTHON_PEACHPY_SOURCE_FOUND ${PYTHON_PEACHPY_SOURCE_GET} PARENT_SCOPE) -endfunction(_PeachpySource_import) - -_PeachpySource_import() diff --git a/infra/cmake/packages/PthreadpoolSourceConfig.cmake b/infra/cmake/packages/PthreadpoolSourceConfig.cmake deleted file mode 100644 index a570a99..0000000 --- a/infra/cmake/packages/PthreadpoolSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_pthreadpoolSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(PTHREADPOOL_URL ${EXTERNAL_DOWNLOAD_SERVER}/Maratyszcza/pthreadpool/archive/6673a4c71fe35e077c6843a74017d9c25610c537.tar.gz) - - ExternalSource_Get("PTHREADPOOL" ${DOWNLOAD_NNPACK} ${PTHREADPOOL_URL}) - - set(PTHREADPOOL_SOURCE_DIR ${PTHREADPOOL_SOURCE_DIR} PARENT_SCOPE) - set(PTHREADPOOL_SOURCE_FOUND ${PTHREADPOOL_SOURCE_GET} PARENT_SCOPE) -endfunction(_pthreadpoolSource_import) - -_pthreadpoolSource_import() diff --git a/infra/cmake/packages/SixSourceConfig.cmake b/infra/cmake/packages/SixSourceConfig.cmake deleted file mode 100644 index f6f85ca..0000000 --- a/infra/cmake/packages/SixSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_SIXSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(six_URL ${EXTERNAL_DOWNLOAD_SERVER}/benjaminp/six/archive/1.11.0.tar.gz) - - ExternalSource_Get("PYTHON_SIX" ${DOWNLOAD_NNPACK} ${six_URL}) - - set(PYTHON_SIX_SOURCE_DIR ${PYTHON_SIX_SOURCE_DIR} PARENT_SCOPE) - set(PYTHON_SIX_SOURCE_FOUND ${PYTHON_SIX_SOURCE_GET} PARENT_SCOPE) -endfunction(_SIXSource_import) - -_SIXSource_import() diff --git a/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfig.cmake b/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfig.cmake new file mode 100644 index 0000000..f846755 --- /dev/null +++ b/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfig.cmake @@ -0,0 +1,20 @@ +function(_TensorFlowEigenSource_import) + if(NOT DOWNLOAD_EIGEN) + set(TensorFlowEigenSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_EIGEN) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # Exact version used by TensorFlow v2.1.0. + # See tensorflow/tensorflow/workspace.bzl. + envoption(TENSORFLOW_2_1_0_EIGEN_URL https://gitlab.com/libeigen/eigen/-/archive/4e696901f873a2347f76d931cf2f701e31e15d05/eigen-4e696901f873a2347f76d931cf2f701e31e15d05.tar.gz) + + ExternalSource_Download(EIGEN DIRNAME TENSORFLOW-2.1.0-EIGEN ${TENSORFLOW_2_1_0_EIGEN_URL}) + + set(TensorFlowEigenSource_DIR ${EIGEN_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowEigenSource_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowEigenSource_import) + +_TensorFlowEigenSource_import() diff --git a/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfigVersion.cmake b/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfigVersion.cmake new file mode 100644 index 0000000..80f43dd --- /dev/null +++ b/infra/cmake/packages/TensorFlowEigenSource-2.1.0/TensorFlowEigenSourceConfigVersion.cmake @@ -0,0 +1,10 @@ +set(PACKAGE_VERSION "2.1.0") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowEigenSource-2.3.0-rc0Config.cmake b/infra/cmake/packages/TensorFlowEigenSource-2.3.0-rc0Config.cmake new file mode 100644 index 0000000..207f7b5 --- /dev/null +++ b/infra/cmake/packages/TensorFlowEigenSource-2.3.0-rc0Config.cmake @@ -0,0 +1,23 @@ +function(_TensorFlowEigenSource_import) + if(NOT DOWNLOAD_EIGEN) + set(TensorFlowEigenSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_EIGEN) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE TensorFlow 2.3.0-rc0 uses the following URL + envoption(EXTERNAL_DOWNLOAD_SERVER "https://gitlab.com") + envoption(TENSORFLOW_2_3_0_EIGEN_URL ${EXTERNAL_DOWNLOAD_SERVER}/libeigen/eigen/-/archive/386d809bde475c65b7940f290efe80e6a05878c4/eigen-386d809bde475c65b7940f290efe80e6a05878c4.tar.gz) + + ExternalSource_Download(EIGEN + DIRNAME TENSORFLOW-2.3.0-EIGEN + URL ${TENSORFLOW_2_3_0_EIGEN_URL} +) + + set(TensorFlowEigenSource_DIR ${EIGEN_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowEigenSource_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowEigenSource_import) + +_TensorFlowEigenSource_import() diff --git a/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfig.cmake b/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfig.cmake new file mode 100644 index 0000000..035264f --- /dev/null +++ b/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfig.cmake @@ -0,0 +1,20 @@ +function(_TensorFlowGEMMLowpSource_import) + if(NOT DOWNLOAD_GEMMLOWP) + set(TensorFlowGEMMLowpSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_GEMMLOWP) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # Exact version used by TensorFlow v2.1.0. + # See tensorflow/tensorflow/workspace.bzl. + envoption(TENSORFLOW_2_1_0_GEMMLOWP_URL https://github.com/google/gemmlowp/archive/12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip) + + ExternalSource_Download(GEMMLOWP DIRNAME TENSORFLOW-2.1.0-GEMMLOWP ${TENSORFLOW_2_1_0_GEMMLOWP_URL}) + + set(TensorFlowGEMMLowpSource_DIR ${GEMMLOWP_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowGEMMLowpSource_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowGEMMLowpSource_import) + +_TensorFlowGEMMLowpSource_import() diff --git a/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfigVersion.cmake b/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfigVersion.cmake new file mode 100644 index 0000000..80f43dd --- /dev/null +++ b/infra/cmake/packages/TensorFlowGEMMLowpSource-2.1.0/TensorFlowGEMMLowpSourceConfigVersion.cmake @@ -0,0 +1,10 @@ +set(PACKAGE_VERSION "2.1.0") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowLite-1.12/Lite/CMakeLists.txt b/infra/cmake/packages/TensorFlowLite-1.12/Lite/CMakeLists.txt index 068022f..337d6b2 100644 --- a/infra/cmake/packages/TensorFlowLite-1.12/Lite/CMakeLists.txt +++ b/infra/cmake/packages/TensorFlowLite-1.12/Lite/CMakeLists.txt @@ -38,4 +38,4 @@ if(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) target_compile_options(tensorflowlite-1.12 PUBLIC -Wno-extern-c-compat) endif(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) target_compile_definitions(tensorflowlite-1.12 PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") -target_link_libraries(tensorflowlite-1.12 eigen gemmlowp neon2sse farmhash abseil dl) +target_link_libraries(tensorflowlite-1.12 eigen-fd6845384b86 gemmlowp neon2sse farmhash abseil dl) diff --git a/infra/cmake/packages/TensorFlowLite-1.12/TensorFlowLiteConfig.cmake b/infra/cmake/packages/TensorFlowLite-1.12/TensorFlowLiteConfig.cmake index 750c613..ff15d85 100644 --- a/infra/cmake/packages/TensorFlowLite-1.12/TensorFlowLiteConfig.cmake +++ b/infra/cmake/packages/TensorFlowLite-1.12/TensorFlowLiteConfig.cmake @@ -23,12 +23,12 @@ function(_TensorFlowLite_import) return() endif(NOT Farmhash_FOUND) - nnas_find_package(Eigen QUIET) + nnas_find_package(Eigen-fd6845384b86 QUIET) - if(NOT Eigen_FOUND) + if(NOT Eigen-fd6845384b86_FOUND) set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) return() - endif(NOT Eigen_FOUND) + endif(NOT Eigen-fd6845384b86_FOUND) nnas_find_package(GEMMLowp QUIET) diff --git a/infra/cmake/packages/TensorFlowLite-1.13.1/Lite/CMakeLists.txt b/infra/cmake/packages/TensorFlowLite-1.13.1/Lite/CMakeLists.txt new file mode 100644 index 0000000..c356174 --- /dev/null +++ b/infra/cmake/packages/TensorFlowLite-1.13.1/Lite/CMakeLists.txt @@ -0,0 +1,46 @@ +# NOTE The followings SHOULD be defined before using this CMakeLists.txt +# +# 'TensorFlowSource_DIR' variable +# 'FlatBuffersSource_DIR' variable +# 'eigen' target +# 'gemmlowp' target +# 'neon2sse' target +# 'farmhash' target +# 'abseil' target +# +message(STATUS "Build TensorFlow Lite from ${TensorFlowSource_DIR}") + +set(TensorFlowLiteSource_DIR ${TensorFlowSource_DIR}/tensorflow/lite) + +file(GLOB CORE_SRCS + "${TensorFlowLiteSource_DIR}/*.c" + "${TensorFlowLiteSource_DIR}/*.cc" + "${TensorFlowLiteSource_DIR}/c/*.c" + "${TensorFlowLiteSource_DIR}/core/*.cc" + "${TensorFlowLiteSource_DIR}/core/api/*.cc") +file(GLOB_RECURSE CORE_TESTS "${TensorFlowLiteSource_DIR}/*test*.cc") +list(REMOVE_ITEM CORE_SRCS ${CORE_TESTS}) + +file(GLOB_RECURSE KERNEL_SRCS "${TensorFlowLiteSource_DIR}/kernels/*.cc") +file(GLOB_RECURSE KERNEL_TESTS "${TensorFlowLiteSource_DIR}/kernels/*test*.cc") +list(REMOVE_ITEM KERNEL_SRCS ${KERNEL_TESTS}) +# Exclude buggy kernel(s) from the build +#list(REMOVE_ITEM KERNEL_SRCS "${TensorFlowLiteSource_DIR}/kernels/internal/spectrogram.cc") + +list(APPEND SRCS ${CORE_SRCS}) +list(APPEND SRCS ${KERNEL_SRCS}) + +include(CheckCXXCompilerFlag) + +CHECK_CXX_COMPILER_FLAG(-Wno-extern-c-compat COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) + +add_library(tensorflowlite-1.13.1 ${SRCS}) +set_target_properties(tensorflowlite-1.13.1 PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_include_directories(tensorflowlite-1.13.1 PUBLIC ${TensorFlowSource_DIR}) +target_include_directories(tensorflowlite-1.13.1 PUBLIC ${FlatBuffersSource_DIR}/include) +target_compile_options(tensorflowlite-1.13.1 PUBLIC -Wno-ignored-attributes) +if(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) + target_compile_options(tensorflowlite-1.13.1 PUBLIC -Wno-extern-c-compat) +endif(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) +target_compile_definitions(tensorflowlite-1.13.1 PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") +target_link_libraries(tensorflowlite-1.13.1 eigen gemmlowp neon2sse farmhash abseil dl) diff --git a/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake b/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake new file mode 100644 index 0000000..2c6bd9f --- /dev/null +++ b/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake @@ -0,0 +1,59 @@ +function(_TensorFlowLite_import) + nnas_find_package(TensorFlowSource EXACT 1.13.1 QUIET) + + if(NOT TensorFlowSource_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT TensorFlowSource_FOUND) + + nnas_find_package(FlatBuffersSource EXACT 1.10 QUIET) + + if(NOT FlatBuffersSource_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT FlatBuffersSource_FOUND) + + nnas_find_package(Farmhash QUIET) + + if(NOT Farmhash_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT Farmhash_FOUND) + + nnas_find_package(Eigen QUIET) + + if(NOT Eigen_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT Eigen_FOUND) + + nnas_find_package(GEMMLowp QUIET) + + if(NOT GEMMLowp_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT GEMMLowp_FOUND) + + nnas_find_package(NEON2SSE QUIET) + + if(NOT NEON2SSE_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT NEON2SSE_FOUND) + + nnas_find_package(Abseil QUIET) + + if(NOT Abseil_FOUND) + set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT Abseil_FOUND) + + if(NOT TARGET tensorflowlite-1.13.1) + nnas_include(ExternalProjectTools) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/Lite" tflite-1.13.1) + endif(NOT TARGET tensorflowlite-1.13.1) + + set(TensorFlowLite_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowLite_import) + +_TensorFlowLite_import() diff --git a/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake b/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake new file mode 100644 index 0000000..ed79ecd --- /dev/null +++ b/infra/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake @@ -0,0 +1,9 @@ +set(PACKAGE_VERSION "1.13.1") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowLite-1.7/Lite/CMakeLists.txt b/infra/cmake/packages/TensorFlowLite-1.7/Lite/CMakeLists.txt deleted file mode 100644 index c5e89ee..0000000 --- a/infra/cmake/packages/TensorFlowLite-1.7/Lite/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -# NOTE The followings SHOULD be defined before using this CMakeLists.txt -# -# 'TensorFlowSource_DIR' variable -# 'FlatBuffersSource_DIR' variable -# 'eigen' target -# 'gemmlowp' target -# 'neon2sse' target -# 'farmhash' target -# -set(TensorFlowLiteSource_DIR ${TensorFlowSource_DIR}/tensorflow/contrib/lite) - -file(GLOB CORE_SRCS "${TensorFlowLiteSource_DIR}/*.c" "${TensorFlowLiteSource_DIR}/*.cc") -file(GLOB CORE_TESTS "${TensorFlowLiteSource_DIR}/*test*.cc") -list(REMOVE_ITEM CORE_SRCS ${CORE_TESTS}) - -file(GLOB_RECURSE KERNEL_SRCS "${TensorFlowLiteSource_DIR}/kernels/*.cc") -file(GLOB_RECURSE KERNEL_TESTS "${TensorFlowLiteSource_DIR}/kernels/*test*.cc") -list(REMOVE_ITEM KERNEL_SRCS ${KERNEL_TESTS}) -# Exclude buggy kernel(s) from the build -list(REMOVE_ITEM KERNEL_SRCS "${TensorFlowLiteSource_DIR}/kernels/internal/spectrogram.cc") - -list(APPEND SRCS ${CORE_SRCS}) -list(APPEND SRCS ${KERNEL_SRCS}) - -include(CheckCXXCompilerFlag) - -CHECK_CXX_COMPILER_FLAG(-Wno-extern-c-compat COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) - -add_library(tensorflowlite-1.7 ${SRCS}) -set_target_properties(tensorflowlite-1.7 PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_include_directories(tensorflowlite-1.7 PUBLIC ${TensorFlowSource_DIR}) -target_include_directories(tensorflowlite-1.7 PUBLIC ${FlatBuffersSource_DIR}/include) -target_compile_options(tensorflowlite-1.7 PUBLIC -Wno-ignored-attributes) -if(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) - target_compile_options(tensorflowlite-1.7 PUBLIC -Wno-extern-c-compat) -endif(COMPILER_SUPPORT_EXTERN_C_COMPAT_WARNING) -target_compile_definitions(tensorflowlite-1.7 PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") -target_link_libraries(tensorflowlite-1.7 eigen gemmlowp neon2sse farmhash dl) diff --git a/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfig.cmake b/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfig.cmake deleted file mode 100644 index 79b58e8..0000000 --- a/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfig.cmake +++ /dev/null @@ -1,55 +0,0 @@ -function(_TensorFlowLite_import) - nnas_find_package(TensorFlowSource EXACT 1.7 QUIET) - - if(NOT TensorFlowSource_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT TensorFlowSource_FOUND) - - # TensorFlow 1.7 downloads FlatBuffers from https://github.com/google/flatbuffers/archive/971a68110e4.tar.gz - # - # FlatBuffers 1.8 is compatible with 971a68110e4. - nnas_find_package(FlatBuffersSource EXACT 1.8 QUIET) - - if(NOT FlatBuffersSource_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT FlatBuffersSource_FOUND) - - nnas_find_package(Farmhash QUIET) - - if(NOT Farmhash_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT Farmhash_FOUND) - - nnas_find_package(Eigen QUIET) - - if(NOT Eigen_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT Eigen_FOUND) - - nnas_find_package(GEMMLowp QUIET) - - if(NOT GEMMLowp_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT GEMMLowp_FOUND) - - nnas_find_package(NEON2SSE QUIET) - - if(NOT NEON2SSE_FOUND) - set(TensorFlowLite_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT NEON2SSE_FOUND) - - if(NOT TARGET tensorflowlite-1.7) - nnas_include(ExternalProjectTools) - add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/Lite" tflite-1.7) - endif(NOT TARGET tensorflowlite-1.7) - - set(TensorFlowLite_FOUND TRUE PARENT_SCOPE) -endfunction(_TensorFlowLite_import) - -_TensorFlowLite_import() diff --git a/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfigVersion.cmake b/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfigVersion.cmake deleted file mode 100644 index 46609dc..0000000 --- a/infra/cmake/packages/TensorFlowLite-1.7/TensorFlowLiteConfigVersion.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set(PACKAGE_VERSION "1.7") -set(PACKAGE_VERSION_EXACT FALSE) -set(PACKAGE_VERSION_COMPATIBLE FALSE) -set(PACKAGE_VERSION_UNSUITABLE TRUE) - -if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) - set(PACKAGE_VERSION_EXACT TRUE) - set(PACKAGE_VERSION_UNSUITABLE FALSE) -endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.12/TensorFlowProtoTextConfig.cmake b/infra/cmake/packages/TensorFlowProtoText-1.12/TensorFlowProtoTextConfig.cmake index 01d74a5..9c7c796 100644 --- a/infra/cmake/packages/TensorFlowProtoText-1.12/TensorFlowProtoTextConfig.cmake +++ b/infra/cmake/packages/TensorFlowProtoText-1.12/TensorFlowProtoTextConfig.cmake @@ -10,7 +10,7 @@ function(_TensorFlowProtoText_import) require_package(TensorFlowSource EXACT 1.12) require_package(Abseil) - require_package(Eigen) + require_package(Eigen-fd6845384b86) require_package(Protobuf) require_package(GoogleDoubleConversion) require_package(GoogleNSync) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.12/build/CMakeLists.txt b/infra/cmake/packages/TensorFlowProtoText-1.12/build/CMakeLists.txt index 86d6e6f..ac8e43b 100644 --- a/infra/cmake/packages/TensorFlowProtoText-1.12/build/CMakeLists.txt +++ b/infra/cmake/packages/TensorFlowProtoText-1.12/build/CMakeLists.txt @@ -71,7 +71,7 @@ target_include_directories(tensorflow-prototext-1.12 PRIVATE ${TensorFlowSource_ target_include_directories(tensorflow-prototext-1.12 PRIVATE ${PROTO_TEXT_PROTO_INCLUDE_DIRS}) target_link_libraries(tensorflow-prototext-1.12 PRIVATE abseil) -target_link_libraries(tensorflow-prototext-1.12 PRIVATE eigen) +target_link_libraries(tensorflow-prototext-1.12 PRIVATE eigen-fd6845384b86) target_link_libraries(tensorflow-prototext-1.12 PRIVATE ${PROTO_TEXT_PROTO_LIBRARIES}) target_link_libraries(tensorflow-prototext-1.12 PRIVATE Google::DoubleConversion) target_link_libraries(tensorflow-prototext-1.12 PRIVATE Google::NSync) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfig.cmake b/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfig.cmake new file mode 100644 index 0000000..738b282 --- /dev/null +++ b/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfig.cmake @@ -0,0 +1,104 @@ +function(_TensorFlowProtoText_import) + macro(require_package PKGNAME) + nnas_find_package(${PKGNAME} ${ARGN} QUIET) + if(NOT ${PKGNAME}_FOUND) + message(STATUS "Found TensorFlowProtoText: FALSE (${PKGNAME} is missing)") + set(TensorFlowProtoText_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${PKGNAME}_FOUND) + endmacro(require_package) + + require_package(TensorFlowSource EXACT 1.13.1) + require_package(Abseil) + require_package(Eigen) + require_package(Protobuf) + require_package(GoogleDoubleConversion) + require_package(GoogleNSync) + + if(NOT TARGET tensorflow-prototext-1.13.1) + nnas_include(ExternalProjectTools) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/build" TensorFlowProtoText-1.13.1) + endif(NOT TARGET tensorflow-prototext-1.13.1) + + set(TensorFlowProtoText_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowProtoText_import) + +_TensorFlowProtoText_import() + +if(TensorFlowProtoText_FOUND) + # CMAKE_CURRENT_LIST_DIR + # + # ... The value has dynamic scope. ... Therefore the value of the variable inside a macro + # or function is the directory of the file invoking the bottom-most entry on the call stack, + # not the directory of the file containing the macro or function definition. + # + # Reference: https://cmake.org/cmake/help/v3.1/variable/CMAKE_CURRENT_LIST_DIR.html + set(TENSORLFLOW_PROTO_TEXT_1_13_1_CMAKE_DIR + "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL + "Where to find make_directories" + ) + + # Comments from "gen_proto_text_functions.cc" + # > + # > Main program to take input protos and write output pb_text source files that + # > contain generated proto text input and output functions. + # > + # > Main expects: + # > - First argument is output path + # > - Second argument is the relative path of the protos to the root. E.g., + # > for protos built by a rule in tensorflow/core, this will be + # > tensorflow/core. + # > - Then any number of source proto file names, plus one source name must be + # > placeholder.txt from this gen tool's package. placeholder.txt is + # > ignored for proto resolution, but is used to determine the root at which + # > the build tool has placed the source proto files. + # > + function(ProtoText_Generate PREFIX OUTPUT_DIR) + # THIS SHOULD SUCCEED! + nnas_find_package(TensorFlowSource EXACT 1.13.1 REQUIRED) + + set(OUTPUT_REL "tensorflow") + set(PROTO_DIR "${TensorFlowSource_DIR}") + + set(PROTO_INPUTS ${ARGN}) + list(APPEND PROTO_INPUTS "tensorflow/tools/proto_text/placeholder.txt") + + get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE) + get_filename_component(abs_proto_dir ${TensorFlowSource_DIR} ABSOLUTE) + + # Let's reset variables before using them + # NOTE This DOES NOT AFFECT variables in the parent scope + unset(PROTO_FILES) + unset(OUTPUT_DIRS) + unset(OUTPUT_FILES) + + foreach(proto ${PROTO_INPUTS}) + get_filename_component(fil "${proto}" NAME) + get_filename_component(dir "${proto}" DIRECTORY) + + get_filename_component(fil_we "${fil}" NAME_WE) + + get_filename_component(abs_fil "${abs_proto_base}/${proto}" ABSOLUTE) + get_filename_component(abs_dir "${abs_fil}" DIRECTORY) + + list(APPEND PROTO_FILES "${abs_proto_dir}/${proto}") + + if(NOT ${fil} STREQUAL "placeholder.txt") + list(APPEND OUTPUT_DIRS "${abs_output_dir}/${dir}") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${dir}/${fil_we}.pb_text.h") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${dir}/${fil_we}.pb_text-impl.h") + list(APPEND OUTPUT_FILES "${abs_output_dir}/${dir}/${fil_we}.pb_text.cc") + endif(NOT ${fil} STREQUAL "placeholder.txt") + endforeach() + + add_custom_command(OUTPUT ${OUTPUT_FILES} + # "make_directory" in CMake 3.1 cannot create multiple directories at once. + # COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIRS} + COMMAND "${TENSORLFLOW_PROTO_TEXT_1_13_1_CMAKE_DIR}/make_directories.sh" ${OUTPUT_DIRS} + COMMAND "$" "${abs_output_dir}/${OUTPUT_REL}" "${OUTPUT_REL}" ${PROTO_FILES} + DEPENDS ${PROTO_FILES}) + + set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE) + set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE) + endfunction(ProtoText_Generate) +endif(TensorFlowProtoText_FOUND) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfigVersion.cmake b/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfigVersion.cmake new file mode 100644 index 0000000..ed79ecd --- /dev/null +++ b/infra/cmake/packages/TensorFlowProtoText-1.13.1/TensorFlowProtoTextConfigVersion.cmake @@ -0,0 +1,9 @@ +set(PACKAGE_VERSION "1.13.1") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.13.1/build/CMakeLists.txt b/infra/cmake/packages/TensorFlowProtoText-1.13.1/build/CMakeLists.txt new file mode 100644 index 0000000..7079aea --- /dev/null +++ b/infra/cmake/packages/TensorFlowProtoText-1.13.1/build/CMakeLists.txt @@ -0,0 +1,78 @@ +message(STATUS "Build TensorFlowProtoText from '${TensorFlowSource_DIR}'") + +# +# Build "proto_text" tool +# +unset(SOURCE_FILES) + +macro(Source_Add RPATH) + list(APPEND SOURCE_FILES "${TensorFlowSource_DIR}/${RPATH}") +endmacro(Source_Add) + +# This list comes from "tensorflow/contrib/makefile/proto_text_cc_files.txt" +Source_Add(tensorflow/core/lib/core/status.cc) +Source_Add(tensorflow/core/lib/core/threadpool.cc) +Source_Add(tensorflow/core/lib/hash/hash.cc) +Source_Add(tensorflow/core/lib/io/inputstream_interface.cc) +Source_Add(tensorflow/core/lib/io/random_inputstream.cc) +Source_Add(tensorflow/core/lib/io/buffered_inputstream.cc) +Source_Add(tensorflow/core/lib/io/inputbuffer.cc) +Source_Add(tensorflow/core/lib/io/iterator.cc) +Source_Add(tensorflow/core/lib/io/path.cc) +Source_Add(tensorflow/core/lib/strings/numbers.cc) +Source_Add(tensorflow/core/lib/strings/scanner.cc) +Source_Add(tensorflow/core/lib/strings/str_util.cc) +Source_Add(tensorflow/core/lib/strings/strcat.cc) +Source_Add(tensorflow/core/lib/strings/stringprintf.cc) +Source_Add(tensorflow/core/lib/strings/proto_text_util.cc) +Source_Add(tensorflow/core/platform/cpu_info.cc) +Source_Add(tensorflow/core/platform/denormal.cc) +Source_Add(tensorflow/core/platform/env.cc) +Source_Add(tensorflow/core/platform/env_time.cc) +Source_Add(tensorflow/core/platform/file_system.cc) +Source_Add(tensorflow/core/platform/file_system_helper.cc) +Source_Add(tensorflow/core/platform/protobuf_util.cc) +Source_Add(tensorflow/core/platform/setround.cc) +Source_Add(tensorflow/core/platform/tracing.cc) +Source_Add(tensorflow/core/platform/posix/env.cc) +Source_Add(tensorflow/core/platform/posix/env_time.cc) +Source_Add(tensorflow/core/platform/posix/error.cc) +Source_Add(tensorflow/core/platform/posix/load_library.cc) +Source_Add(tensorflow/core/platform/posix/port.cc) +Source_Add(tensorflow/core/platform/posix/posix_file_system.cc) +Source_Add(tensorflow/core/platform/default/logging.cc) +Source_Add(tensorflow/core/platform/default/mutex.cc) +Source_Add(tensorflow/core/platform/default/protobuf.cc) + +Source_Add(tensorflow/tools/proto_text/gen_proto_text_functions_lib.cc) +Source_Add(tensorflow/tools/proto_text/gen_proto_text_functions.cc) + +unset(PROTO_FILES) + +macro(Proto_Add RPATH) + list(APPEND PROTO_FILES "${RPATH}") +endmacro(Proto_Add) + +Proto_Add(tensorflow/core/lib/core/error_codes.proto) +Proto_Add(tensorflow/core/framework/types.proto) +Proto_Add(tensorflow/core/framework/tensor.proto) +Proto_Add(tensorflow/core/framework/tensor_shape.proto) +Proto_Add(tensorflow/core/framework/summary.proto) +Proto_Add(tensorflow/core/framework/resource_handle.proto) + +Protobuf_Generate(PROTO_TEXT_PROTO + "${CMAKE_CURRENT_BINARY_DIR}/generated/proto_text" + "${TensorFlowSource_DIR}" + ${PROTO_FILES} +) + +add_executable(tensorflow-prototext-1.13.1 ${SOURCE_FILES} ${PROTO_TEXT_PROTO_SOURCES}) +target_include_directories(tensorflow-prototext-1.13.1 PRIVATE ${TensorFlowSource_DIR}) +target_include_directories(tensorflow-prototext-1.13.1 PRIVATE ${PROTO_TEXT_PROTO_INCLUDE_DIRS}) + +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE abseil) +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE eigen) +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE ${PROTO_TEXT_PROTO_LIBRARIES}) +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE Google::DoubleConversion) +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE Google::NSync) +target_link_libraries(tensorflow-prototext-1.13.1 PRIVATE dl) diff --git a/infra/cmake/packages/TensorFlowProtoText-1.13.1/make_directories.sh b/infra/cmake/packages/TensorFlowProtoText-1.13.1/make_directories.sh new file mode 100755 index 0000000..1fb2ab6 --- /dev/null +++ b/infra/cmake/packages/TensorFlowProtoText-1.13.1/make_directories.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +while [[ $# -ne 0 ]]; do + DIR=$1; shift + mkdir -p "${DIR}" +done diff --git a/infra/cmake/packages/TensorFlowSource-1.13.1/TensorFlowSourceConfig.cmake b/infra/cmake/packages/TensorFlowSource-1.13.1/TensorFlowSourceConfig.cmake index 2049ab9..d837af7 100644 --- a/infra/cmake/packages/TensorFlowSource-1.13.1/TensorFlowSourceConfig.cmake +++ b/infra/cmake/packages/TensorFlowSource-1.13.1/TensorFlowSourceConfig.cmake @@ -7,7 +7,8 @@ function(_TensorFlowSource_import) nnas_include(ExternalSourceTools) nnas_include(OptionTools) - envoption(TENSORFLOW_1_13_1_URL https://github.com/tensorflow/tensorflow/archive/v1.13.1.tar.gz) + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + envoption(TENSORFLOW_1_13_1_URL ${EXTERNAL_DOWNLOAD_SERVER}/tensorflow/tensorflow/archive/v1.13.1.tar.gz) ExternalSource_Download(TENSORFLOW DIRNAME TENSORFLOW-1.13.1 ${TENSORFLOW_1_13_1_URL}) diff --git a/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfig.cmake b/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfig.cmake deleted file mode 100644 index 8188ee0..0000000 --- a/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfig.cmake +++ /dev/null @@ -1,18 +0,0 @@ -function(_TensorFlowSource_import) - if(NOT DOWNLOAD_TENSORFLOW) - set(TensorFlowSource_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT DOWNLOAD_TENSORFLOW) - - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(TENSORFLOW_URL https://github.com/tensorflow/tensorflow/archive/v1.7.0.tar.gz) - - ExternalSource_Download(TENSORFLOW ${TENSORFLOW_URL}) - - set(TensorFlowSource_DIR ${TENSORFLOW_SOURCE_DIR} PARENT_SCOPE) - set(TensorFlowSource_FOUND TRUE PARENT_SCOPE) -endfunction(_TensorFlowSource_import) - -_TensorFlowSource_import() diff --git a/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfigVersion.cmake b/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfigVersion.cmake deleted file mode 100644 index b1d5282..0000000 --- a/infra/cmake/packages/TensorFlowSource-1.7/TensorFlowSourceConfigVersion.cmake +++ /dev/null @@ -1,10 +0,0 @@ -set(PACKAGE_VERSION "1.7") -set(PACKAGE_VERSION_EXACT FALSE) -set(PACKAGE_VERSION_COMPATIBLE FALSE) -set(PACKAGE_VERSION_UNSUITABLE TRUE) - -if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) - set(PACKAGE_VERSION_EXACT TRUE) - set(PACKAGE_VERSION_COMPATIBLE TRUE) - set(PACKAGE_VERSION_UNSUITABLE FALSE) -endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfig.cmake b/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfig.cmake new file mode 100644 index 0000000..71220d7 --- /dev/null +++ b/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfig.cmake @@ -0,0 +1,18 @@ +function(_TensorFlowSource_import) + if(NOT DOWNLOAD_TENSORFLOW) + set(TensorFlowSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_TENSORFLOW) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(TENSORFLOW_2_2_0_URL https://github.com/tensorflow/tensorflow/archive/v2.2.0.tar.gz) + + ExternalSource_Download(TENSORFLOW DIRNAME TENSORFLOW-2.2.0 ${TENSORFLOW_2_2_0_URL}) + + set(TensorFlowSource_DIR ${TENSORFLOW_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowSource_FOUND TRUE PARENT_SCOPE) +endfunction(_TensorFlowSource_import) + +_TensorFlowSource_import() diff --git a/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfigVersion.cmake b/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfigVersion.cmake new file mode 100644 index 0000000..8269dc5 --- /dev/null +++ b/infra/cmake/packages/TensorFlowSource-2.2.0/TensorFlowSourceConfigVersion.cmake @@ -0,0 +1,10 @@ +set(PACKAGE_VERSION "2.2.0") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/cmake/packages/TensorFlowSource-2.3.0-rc0Config.cmake b/infra/cmake/packages/TensorFlowSource-2.3.0-rc0Config.cmake new file mode 100644 index 0000000..82df579 --- /dev/null +++ b/infra/cmake/packages/TensorFlowSource-2.3.0-rc0Config.cmake @@ -0,0 +1,21 @@ +# find_package rejects version with extra string like "2.3.0-rc0" +# +# TODO Find a better way +function(_import) + if(NOT DOWNLOAD_TENSORFLOW) + set(TensorFlowSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT DOWNLOAD_TENSORFLOW) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + envoption(TENSORFLOW_2_3_0_RC0_URL https://github.com/tensorflow/tensorflow/archive/v2.3.0-rc0.tar.gz) + + ExternalSource_Download(TENSORFLOW DIRNAME TENSORFLOW-2.3.0-RC0 ${TENSORFLOW_2_3_0_RC0_URL}) + + set(TensorFlowSource_DIR ${TENSORFLOW_SOURCE_DIR} PARENT_SCOPE) + set(TensorFlowSource_FOUND TRUE PARENT_SCOPE) +endfunction(_import) + +_import() diff --git a/infra/command/format b/infra/command/format index 9fe4753..e34c915 100644 --- a/infra/command/format +++ b/infra/command/format @@ -65,10 +65,28 @@ function command_exists() { command -v $1 > /dev/null 2>&1 } -function check_newline() { +function exclude_symbolic_links() { # Check all files (CMakeLists.txt, *.cl, ... not only for C++, Python) if [[ ${#FILES_TO_CHECK} -ne 0 ]]; then - CRCHECK=$(file ${FILES_TO_CHECK} | grep 'with CR') + FILES_EXCLUDE_SYMLINKS=$(file ${FILES_TO_CHECK} | grep -v "symbolic link" | cut -d':' -f1) + FILES_TO_CHECK=${FILES_EXCLUDE_SYMLINKS} + fi +} + +function check_newline() { + FILES_TO_CHECK_CR=() + for f in ${FILES_TO_CHECK[@]}; do + # Manually ignore style checking + if [[ ${f} == !(*.svg|*.pdf|*.png) ]]; then + FILES_TO_CHECK_CR+=("${f}") + fi + done + + # Check all files (CMakeLists.txt, *.cl, ... not only for C++, Python) + if [[ ${#FILES_TO_CHECK_CR} -ne 0 ]]; then + CRCHECK=$(file ${FILES_TO_CHECK_CR} | grep 'with CR') + else + return fi FILES_TO_FIX=($(echo "$CRCHECK" | grep "with CRLF line" | cut -d':' -f1)) for f in ${FILES_TO_FIX[@]}; do @@ -79,7 +97,7 @@ function check_newline() { tr '\r' '\n' < $f > $f.fixed && cat $f.fixed > $f && rm $f.fixed done # Check no new line at end of file - for f in ${FILES_TO_CHECK[@]}; do + for f in ${FILES_TO_CHECK_CR[@]}; do if diff /dev/null "$f" | tail -1 | grep '^\\ No newline' > /dev/null; then echo >> "$f" fi @@ -91,7 +109,7 @@ function check_permission() { FILES_TO_CHECK_PERMISSION=() for f in ${FILES_TO_CHECK[@]}; do # Manually ignore permission checking - if [[ ${f} == !(nnas|nnfw|nncc|*.sh|*.py) ]]; then + if [[ ${f} == !(nnas|nnfw|nncc|*.sh|*.py|*/gradlew) ]] || [[ ${f} == tests/nnapi/specs/**/*.py ]]; then FILES_TO_CHECK_PERMISSION+=("${f}") fi done @@ -224,6 +242,7 @@ for DIR_NOT_TO_BE_TESTED in $(git ls-files -co --exclude-standard '*/.FORMATDENY DIRECTORIES_NOT_TO_BE_TESTED+=($(dirname "${DIR_NOT_TO_BE_TESTED}")) done +exclude_symbolic_links check_newline check_permission check_cpp_files diff --git a/infra/nncc/CMakeLists.txt b/infra/nncc/CMakeLists.txt index 4bcb616..3ac6680 100644 --- a/infra/nncc/CMakeLists.txt +++ b/infra/nncc/CMakeLists.txt @@ -101,6 +101,8 @@ option(DOWNLOAD_ABSEIL "Download Abseil-cpp source" ON) option(DOWNLOAD_GTEST "Download Google Test source" ON) option(BUILD_GTEST "Build Google Test from the downloaded source" ON) +option(DOWNLOAD_HDF5 "Download HDF5 source" ON) +option(BUILD_HDF5 "Build HDF5 from the downloaded source" ON) nnas_find_package(GTest QUIET) diff --git a/infra/nncc/command/utcount b/infra/nncc/command/utcount index 3b3baa0..d4610e3 100644 --- a/infra/nncc/command/utcount +++ b/infra/nncc/command/utcount @@ -13,20 +13,24 @@ BUILD_ITEMS="angkor cwrap pepper-str pepper-strcast pp stdex \ oops pepper-assert \ hermes hermes-std \ loco locop locomotiv logo-core logo \ +foder souschef arser \ safemain mio-circle mio-tflite \ tflite2circle \ luci \ -circle2circle" +luci-interpreter \ +luci-value-test \ +record-minmax \ +circle2circle circle-quantizer" function count_all() { - local result=`ctest --verbose | grep -c '\[ RUN \]'` + local result=`(ctest --verbose | grep -c '\[ RUN \]') 2>/dev/null` echo $result } function count_neg() { - local result=`ctest --verbose | grep '\[ RUN \]' | grep -c '_NEG'` + local result=`(ctest --verbose | grep '\[ RUN \]' | grep -c '_NEG') 2>/dev/null` echo $result } diff --git a/infra/nnfw/CMakeLists.txt b/infra/nnfw/CMakeLists.txt index 4375735..5caf37f 100644 --- a/infra/nnfw/CMakeLists.txt +++ b/infra/nnfw/CMakeLists.txt @@ -30,7 +30,7 @@ macro(nnas_include PREFIX) include("${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/modules/${PREFIX}.cmake") endmacro(nnas_include) -# 'find_package()' wrapper to find in cmake/packages folder +# Runtime 'find_package()' wrapper to find in cmake/packages folder # # Example: # nnfw_find_package(Boost): Load settings from 'BoostConfig.cmake' file @@ -38,9 +38,13 @@ endmacro(nnas_include) # nnfw_find_package(Boost QUIET): Load settings silently, without warnings # nnfw_find_package(Boost REQUIRED): Load settings but stop with error when failed macro(nnfw_find_package PREFIX) - find_package(${PREFIX} CONFIG NO_DEFAULT_PATH PATHS ${CMAKE_SOURCE_DIR}/cmake/packages ${ARGN}) + find_package(${PREFIX} CONFIG NO_DEFAULT_PATH + PATHS ${CMAKE_SOURCE_DIR}/cmake/packages + ${ARGN} + ) endmacro(nnfw_find_package) -# TODO Remove nnfw_find_pacakge + +# Common 'find_package()' wrapper to find in infra/cmake/packages folder macro(nnas_find_package PREFIX) find_package(${PREFIX} CONFIG NO_DEFAULT_PATH PATHS ${NNAS_PROJECT_SOURCE_DIR}/infra/cmake/packages diff --git a/infra/nnfw/cmake/ApplyCompileFlags.cmake b/infra/nnfw/cmake/ApplyCompileFlags.cmake index 0ee7e8e..b042b0c 100644 --- a/infra/nnfw/cmake/ApplyCompileFlags.cmake +++ b/infra/nnfw/cmake/ApplyCompileFlags.cmake @@ -2,16 +2,10 @@ # Platform independent compile flag setting # # flags for build type: debug, release -if(${ENABLE_COVERAGE}) - # test-coverage build flag for tizen - set(CMAKE_C_FLAGS_DEBUG "-O -g -DDEBUG") - set(CMAKE_CXX_FLAGS_DEBUG "-O -g -DDEBUG") -else(${ENABLE_COVERAGE}) - set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG") - set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG") -endif(${ENABLE_COVERAGE}) -set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG") -set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG") +set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") # # Platform specific compile flag setting diff --git a/infra/nnfw/cmake/CfgOptionFlags.cmake b/infra/nnfw/cmake/CfgOptionFlags.cmake index 794fcc3..d1395f8 100644 --- a/infra/nnfw/cmake/CfgOptionFlags.cmake +++ b/infra/nnfw/cmake/CfgOptionFlags.cmake @@ -15,7 +15,6 @@ option(ENABLE_COVERAGE "Build for coverage test" OFF) option(BUILD_EXT_MULTITHREAD "Build external build using multi thread" ON) option(BUILD_ONERT "Build onert" ON) option(BUILD_LOGGING "Build logging runtime" ON) -option(BUILD_PURE_ARM_COMPUTE "Build pure_arm_compute runtime" OFF) CMAKE_DEPENDENT_OPTION(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" # Set BUILD_RUNTIME_NNAPI_TEST as ON # if CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.2 @@ -24,10 +23,10 @@ CMAKE_DEPENDENT_OPTION(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated OFF) option(BUILD_RUNTIME_NNFW_API_TEST "Build Runtime NNFW API Tests" ON) option(BUILD_TFLITE_RUN "Build tflite-run" ON) -option(BUILD_TFLITE_BENCHMARK "Build tflite benchmark" ON) +option(BUILD_TFLITE_RUN_2_2_0 "Build tflite-run 2.2.0" OFF) option(BUILD_TFLITE_BENCHMARK_MODEL "Build tflite benchmark model" OFF) +option(BUILD_NNAPI_TEST "Build nnapi_test" ON) option(BUILD_NNPACKAGE_RUN "Build nnpackge_run" ON) -option(BUILD_SRCN_KERNEL "Build srcn kernel" OFF) option(BUILD_TFLITE_LOADER "Build TensorFlow Lite loader" ON) option(BUILD_CIRCLE_LOADER "Build circle loader" ON) option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" ON) @@ -59,20 +58,23 @@ option(BUILD_TFLITE_ACCURACY "Build tflite accuracy tool" OFF) # Default external libraries source download and build configuration # option(DOWNLOAD_TENSORFLOW "Download Tensorflow source" ON) -option(DOWNLOAD_ABSL "Download Absl source" ON) +option(DOWNLOAD_ABSEIL "Download Abseil source" ON) option(DOWNLOAD_EIGEN "Download Eigen source" ON) option(DOWNLOAD_FARMHASH "Download farmhash source" ON) option(DOWNLOAD_GEMMLOWP "Download GEMM low precesion library source" ON) option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" ON) -option(DOWNLOAD_NNPACK "Download NNPACK source" OFF) option(DOWNLOAD_FLATBUFFERS "Download FlatBuffers source" ON) option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" ON) option(DOWNLOAD_NONIUS "Download nonius source" ON) option(DOWNLOAD_BOOST "Download boost source" OFF) +option(DOWNLOAD_RUY "Download ruy source" ON) option(BUILD_BOOST "Build boost source" OFF) option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" ON) +option(BUILD_TENSORFLOW_LITE_2_2_0 "Build TensorFlow Lite from the downloaded source" OFF) option(BUILD_GTEST "Download and build Google Test" ON) option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" ON) +option(BUILD_RUY "Build ruy library from the downloaded source" ON) +option(PROFILE_RUY "Enable ruy library profiling" OFF) # ## Default sample build configuration diff --git a/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake b/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake index fa1e8b0..0f304ec 100644 --- a/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake +++ b/infra/nnfw/cmake/buildtool/config/config_aarch64-tizen.cmake @@ -4,6 +4,10 @@ message(STATUS "Building for AARCH64 Tizen") +# Build flag for tizen +set(CMAKE_C_FLAGS_DEBUG "-O -g -DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-O -g -DDEBUG") + # TODO : add and use option_tizen if something uncommon comes up # include linux common include("cmake/buildtool/config/config_linux.cmake") diff --git a/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake b/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake index 9a0b5e5..8963f30 100644 --- a/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake +++ b/infra/nnfw/cmake/buildtool/config/config_armv7l-linux.cmake @@ -12,7 +12,6 @@ set(FLAGS_COMMON ${FLAGS_COMMON} "-mcpu=cortex-a7" "-mfloat-abi=hard" "-mfpu=neon-vfpv4" - "-funsafe-math-optimizations" "-ftree-vectorize" "-mfp16-format=ieee" ) diff --git a/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake b/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake index a5dae20..fa12ecb 100644 --- a/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake +++ b/infra/nnfw/cmake/buildtool/config/config_armv7l-tizen.cmake @@ -4,6 +4,10 @@ message(STATUS "Building for ARMv7l(softfp) Tizen") +# Build flag for tizen +set(CMAKE_C_FLAGS_DEBUG "-O -g -DDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-O -g -DDEBUG") + # TODO : add and use option_tizen if something uncommon comes up # include linux common include("cmake/buildtool/config/config_linux.cmake") diff --git a/infra/nnfw/cmake/buildtool/config/config_x86_64-darwin.cmake b/infra/nnfw/cmake/buildtool/config/config_x86_64-darwin.cmake new file mode 100644 index 0000000..dbd45fc --- /dev/null +++ b/infra/nnfw/cmake/buildtool/config/config_x86_64-darwin.cmake @@ -0,0 +1,12 @@ +# +# x86_64 darwin(macOS) compile options +# +message(STATUS "Building for x86-64 Darwin") + +# SIMD for x86 +set(FLAGS_COMMON ${FLAGS_COMMON} + "-msse4" + ) + +# lib pthread as a variable (pthread must be disabled on android) +set(LIB_PTHREAD pthread) diff --git a/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake index 4da2618..99cc32a 100644 --- a/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake +++ b/infra/nnfw/cmake/buildtool/cross/toolchain_aarch64-android.cmake @@ -13,6 +13,8 @@ endif(NOT DEFINED NDK_DIR) set(ANDROID_ABI arm64-v8a) set(ANDROID_API_LEVEL 29) set(ANDROID_PLATFORM android-${ANDROID_API_LEVEL}) +set(ANDROID_STL c++_shared) +set(ANDROID_STL_LIB "${NDK_DIR}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so") # Find package in the host. `nnfw_find_package` won't work without this set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) @@ -22,5 +24,15 @@ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) # Use the toolchain file that NDK provides include(${NDK_DIR}/build/cmake/android.toolchain.cmake) +# Install libc++_shared.so to lib folder +install(FILES ${ANDROID_STL_LIB} DESTINATION lib) + +# ndk always enable debug flag -g, but we don't want debug info in release build +# https://github.com/android/ndk/issues/243 +string(REPLACE "-g" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") +string(REPLACE "-g" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +set(CMAKE_C_FLAGS_DEBUG "-g ${CMAKE_C_FLAGS_DEBUG}") +set(CMAKE_CXX_FLAGS_DEBUG "-g ${CMAKE_CXX_FLAGS_DEBUG}") + set(TARGET_OS "android") set(TARGET_ARCH "aarch64") diff --git a/infra/nnfw/cmake/options/options_aarch64-android.cmake b/infra/nnfw/cmake/options/options_aarch64-android.cmake index 903267b..97371f6 100644 --- a/infra/nnfw/cmake/options/options_aarch64-android.cmake +++ b/infra/nnfw/cmake/options/options_aarch64-android.cmake @@ -8,7 +8,10 @@ option(BUILD_ANDROID_TFLITE "Enable android support for TensorFlow Lite" ON) option(BUILD_ANDROID_BENCHMARK_APP "Enable Android Benchmark App" ON) option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) # Need boost library +option(DOWNLOAD_BOOST "Download boost source" OFF) +option(BUILD_BOOST "Build boost source" OFF) option(BUILD_RUNTIME_NNAPI_TEST "Build Runtime NN API Generated Test" OFF) +option(BUILD_NNAPI_TEST "Build nnapi_test" OFF) option(BUILD_NNPACKAGE_RUN "Build nnpackge_run" OFF) option(BUILD_TFLITE_RUN "Build tflite-run" OFF) option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" OFF) diff --git a/infra/nnfw/cmake/options/options_aarch64-linux.cmake b/infra/nnfw/cmake/options/options_aarch64-linux.cmake index 179030e..829711f 100644 --- a/infra/nnfw/cmake/options/options_aarch64-linux.cmake +++ b/infra/nnfw/cmake/options/options_aarch64-linux.cmake @@ -2,4 +2,3 @@ # aarch64 linux cmake options # option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) -option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) diff --git a/infra/nnfw/cmake/options/options_aarch64-tizen.cmake b/infra/nnfw/cmake/options/options_aarch64-tizen.cmake index 4499fcd..590d128 100644 --- a/infra/nnfw/cmake/options/options_aarch64-tizen.cmake +++ b/infra/nnfw/cmake/options/options_aarch64-tizen.cmake @@ -3,13 +3,9 @@ # option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" OFF) -option(DOWNLOAD_EIGEN "Download Eigen source" OFF) option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) -option(DOWNLOAD_NNPACK "Download NNPACK source" OFF) option(BUILD_LOGGING "Build logging runtime" OFF) option(BUILD_TFLITE_RUN "Build tflite-run" OFF) -option(BUILD_TFLITE_LOADER_TEST_TOOL "Build tflite loader testing tool" OFF) -option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" OFF) option(ENVVAR_ONERT_CONFIG "Use environment variable for onert configuration" OFF) diff --git a/infra/nnfw/cmake/options/options_armv7l-linux.cmake b/infra/nnfw/cmake/options/options_armv7l-linux.cmake index ec2f8d6..e10e573 100644 --- a/infra/nnfw/cmake/options/options_armv7l-linux.cmake +++ b/infra/nnfw/cmake/options/options_armv7l-linux.cmake @@ -2,5 +2,4 @@ # armv7l linux cmake options # option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) -option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) option(BUILD_OPENCL_TOOL "Build OpenCL tool" ON) diff --git a/infra/nnfw/cmake/options/options_armv7l-tizen.cmake b/infra/nnfw/cmake/options/options_armv7l-tizen.cmake index e1e4e68..25c848f 100644 --- a/infra/nnfw/cmake/options/options_armv7l-tizen.cmake +++ b/infra/nnfw/cmake/options/options_armv7l-tizen.cmake @@ -4,10 +4,8 @@ option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) option(BUILD_TENSORFLOW_LITE "Build TensorFlow Lite from the downloaded source" OFF) option(DOWNLOAD_NEON2SSE "Download NEON2SSE library source" OFF) -option(DOWNLOAD_NNPACK "Download NNPACK source" OFF) option(BUILD_LOGGING "Build logging runtime" OFF) option(BUILD_TFLITE_RUN "Build tflite-run" OFF) -option(BUILD_SRCN_KERNEL "Build srcn kernel" ON) option(GENERATE_RUNTIME_NNAPI_TESTS "Generate NNAPI operation gtest" OFF) option(ENVVAR_ONERT_CONFIG "Use environment variable for onert configuration" OFF) diff --git a/infra/nnfw/cmake/options/options_x86_64-darwin.cmake b/infra/nnfw/cmake/options/options_x86_64-darwin.cmake new file mode 100644 index 0000000..97642e6 --- /dev/null +++ b/infra/nnfw/cmake/options/options_x86_64-darwin.cmake @@ -0,0 +1,5 @@ +# +# x86_64 linux cmake options +# +option(BUILD_ARMCOMPUTE "Build ARM Compute from the downloaded source" OFF) +option(DOWNLOAD_ARMCOMPUTE "Download ARM Compute source" OFF) diff --git a/infra/nnfw/cmake/packages/ARMComputeConfig.cmake b/infra/nnfw/cmake/packages/ARMComputeConfig.cmake new file mode 100644 index 0000000..67f6ef8 --- /dev/null +++ b/infra/nnfw/cmake/packages/ARMComputeConfig.cmake @@ -0,0 +1,181 @@ +function(_ARMCompute_Import) + include(FindPackageHandleStandardArgs) + + list(APPEND ARMCompute_LIB_SEARCH_PATHS ${ARMCompute_PREFIX}) + + find_path(INCLUDE_DIR NAMES arm_compute/core/ITensor.h PATHS ${ARMCompute_INCLUDE_SEARCH_PATHS}) + + find_library(CORE_LIBRARY NAMES arm_compute_core PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) + find_library(RUNTIME_LIBRARY NAMES arm_compute PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) + find_library(GRAPH_LIBRARY NAMES arm_compute_graph PATHS ${ARMCompute_LIB_SEARCH_PATHS} CMAKE_FIND_ROOT_PATH_BOTH) + + message(STATUS "Search acl in ${ARMCompute_LIB_SEARCH_PATHS}") + + if(NOT INCLUDE_DIR) + nnas_find_package(ARMComputeSource QUIET) + if (NOT ARMComputeSource_FOUND) + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + return() + endif() + set(INCLUDE_DIR ${ARMComputeSource_DIR} ${ARMComputeSource_DIR}/include) + endif(NOT INCLUDE_DIR) + + if(NOT CORE_LIBRARY) + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + message(STATUS "Cannot find libarm_compute_core.so") + return() + endif() + + if(NOT RUNTIME_LIBRARY) + message(STATUS "Cannot find libarm_compute.so") + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + return() + endif() + + if(NOT GRAPH_LIBRARY) + message(STATUS "Cannot find libarm_compute_graph.so") + set(ARMCompute_FOUND FALSE PARENT_SCOPE) + return() + endif() + + if(NOT TARGET arm_compute_core) + add_library(arm_compute_core INTERFACE) + target_include_directories(arm_compute_core SYSTEM INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute_core INTERFACE dl ${LIB_PTHREAD}) + target_link_libraries(arm_compute_core INTERFACE ${CORE_LIBRARY}) + endif(NOT TARGET arm_compute_core) + + if(NOT TARGET arm_compute) + add_library(arm_compute INTERFACE) + target_include_directories(arm_compute SYSTEM INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute INTERFACE ${RUNTIME_LIBRARY}) + target_link_libraries(arm_compute INTERFACE arm_compute_core) + endif(NOT TARGET arm_compute) + + if(NOT TARGET arm_compute_graph) + add_library(arm_compute_graph INTERFACE) + target_include_directories(arm_compute_graph SYSTEM INTERFACE ${INCLUDE_DIR}) + target_link_libraries(arm_compute_graph INTERFACE ${GRAPH_LIBRARY}) + target_link_libraries(arm_compute_graph INTERFACE arm_compute) + endif(NOT TARGET arm_compute_graph) + + set(ARMCompute_FOUND TRUE PARENT_SCOPE) +endfunction(_ARMCompute_Import) + +### Check whether library exists +function(_ARMCompute_Check VAR LIBDIR) + set(FOUND TRUE) + + if(NOT EXISTS "${LIBDIR}/libarm_compute_core.so") + set(FOUND FALSE) + endif() + + if(NOT EXISTS "${LIBDIR}/libarm_compute.so") + set(FOUND FALSE) + endif() + + if(NOT EXISTS "${LIBDIR}/libarm_compute_graph.so") + set(FOUND FALSE) + endif() + + set(${VAR} ${FOUND} PARENT_SCOPE) +endfunction(_ARMCompute_Check) + +# Let's build and install ARMCompute libraries +# NOTE This function silently returns on error +function(_ARMCompute_Build ARMCompute_INSTALL_PREFIX) + ### Check whether library exists + _ARMCompute_Check(ARMCompute_FOUND ${ARMCompute_INSTALL_PREFIX}) + + if(ARMCompute_FOUND) + return() + endif(ARMCompute_FOUND) + + ### Let's build with SCONS + nnas_find_package(ARMComputeSource QUIET) + + if(NOT ARMComputeSource_FOUND) + return() + endif(NOT ARMComputeSource_FOUND) + + find_program(SCONS_PATH scons) + + if(NOT SCONS_PATH) + message(WARNING "SCONS NOT FOUND. Please install SCONS to build ARMCompute.") + return() + endif(NOT SCONS_PATH) + + if(CMAKE_BUILD_TYPE) + string(TOLOWER "${CMAKE_BUILD_TYPE}" SCON_BUILD_TYPE) + else(CMAKE_BUILD_TYPE) + set(SCON_BUILD_TYPE "release") + endif(CMAKE_BUILD_TYPE) + + #### Architecture-specific configurations + if(TARGET_ARCH STREQUAL "armv7l") + set(BUILD_ARCH "armv7a") + set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}") + endif() + + if(TARGET_ARCH STREQUAL "aarch64") + set(BUILD_ARCH "arm64-v8a") + set(BUILD_DIR "${BUILD_ARCH}-${TARGET_OS}.${SCON_BUILD_TYPE}") + endif() + + #### Platform-specific configurations + #### TODO Support android + + #### Mode-specific configurations + if(SCON_BUILD_TYPE STREQUAL "debug") + list(APPEND SCONS_OPTIONS "debug=1") + endif() + + #### Generic configurations + list(APPEND SCONS_OPTIONS "neon=1") + list(APPEND SCONS_OPTIONS "opencl=1") + list(APPEND SCONS_OPTIONS "examples=0") + list(APPEND SCONS_OPTIONS "Werror=0") + list(APPEND SCONS_OPTIONS "os=${TARGET_OS}") + + if(DEFINED ACL_BUILD_THREADS) + set(N ${ACL_BUILD_THREADS}) + else(DEFINED ACL_BUILD_THREADS) + include(ProcessorCount) + ProcessorCount(N) + endif(DEFINED ACL_BUILD_THREADS) + + if((NOT N EQUAL 0) AND BUILD_EXT_MULTITHREAD) + list(APPEND SCONS_OPTIONS -j${N}) + endif() + if(DEFINED BUILD_ARCH) + list(APPEND SCONS_OPTIONS "arch=${BUILD_ARCH}") + endif(DEFINED BUILD_ARCH) + + if(DEFINED BUILD_DIR) + list(APPEND SCONS_OPTIONS "build_dir=${BUILD_DIR}") + endif(DEFINED BUILD_DIR) + + message(STATUS "Build ARMCompute with ${SCONS_PATH} ('${SCONS_OPTIONS}'") + + # Build ARMCompute libraries with SCONS + # NOTE ARMCompute SConstruct unconditioanlly appends "arm-linux-gnueabihf-" prefix for linux + execute_process(COMMAND /usr/bin/env CC=gcc CXX=g++ "${SCONS_PATH}" ${SCONS_OPTIONS} + WORKING_DIRECTORY ${ARMComputeSource_DIR} + RESULT_VARIABLE ARMCompute_BUILD) + + # Install ARMCompute libraries to overlay + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${ARMCompute_INSTALL_PREFIX}" + WORKING_DIRECTORY ${ARMComputeSource_DIR} + RESULT_VARIABLE ARMCompute_BUILD) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_core.so" "${ARMCompute_INSTALL_PREFIX}" + COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute.so" "${ARMCompute_INSTALL_PREFIX}" + COMMAND ${CMAKE_COMMAND} -E copy "build/${BUILD_DIR}/libarm_compute_graph.so" "${ARMCompute_INSTALL_PREFIX}" + WORKING_DIRECTORY ${ARMComputeSource_DIR} + RESULT_VARIABLE ARMCompute_BUILD) +endfunction(_ARMCompute_Build) + +set(ARMCompute_PREFIX ${EXT_OVERLAY_DIR}/lib) +if(BUILD_ARMCOMPUTE) + _ARMCompute_Build("${ARMCompute_PREFIX}") +endif(BUILD_ARMCOMPUTE) +_ARMCompute_Import() diff --git a/infra/nnfw/cmake/packages/AbslSourceConfig.cmake b/infra/nnfw/cmake/packages/AbslSourceConfig.cmake deleted file mode 100644 index c3bab13..0000000 --- a/infra/nnfw/cmake/packages/AbslSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_AbslSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - # NOTE The following URL comes from TensorFlow 1.12 - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(ABSL_URL ${EXTERNAL_DOWNLOAD_SERVER}/abseil/abseil-cpp/archive/389ec3f906f018661a5308458d623d01f96d7b23.tar.gz) - ExternalSource_Get("absl" ${DOWNLOAD_ABSL} ${ABSL_URL}) - - set(AbslSource_DIR ${absl_SOURCE_DIR} PARENT_SCOPE) - set(AbslSource_FOUND ${absl_SOURCE_GET} PARENT_SCOPE) -endfunction(_AbslSource_import) - -_AbslSource_import() diff --git a/infra/nnfw/cmake/packages/BoostConfig.cmake b/infra/nnfw/cmake/packages/BoostConfig.cmake new file mode 100644 index 0000000..c4d7d58 --- /dev/null +++ b/infra/nnfw/cmake/packages/BoostConfig.cmake @@ -0,0 +1,77 @@ +# Let's build and install Boost libraries +function(_Boost_Build Boost_PREFIX) + nnas_find_package(BoostSource QUIET) + + if(NOT BoostSource_FOUND) + return() + endif(NOT BoostSource_FOUND) + + #### Generic configurations + if(NOT EXISTS ${BoostSource_DIR}/b2) + execute_process(COMMAND "${BoostSource_DIR}/bootstrap.sh" + WORKING_DIRECTORY ${BoostSource_DIR} + RESULT_VARIABLE Boost_BUILD) + endif() + + set(BoostBuild_DIR ${BoostSource_DIR}) + set(BoostInstall_DIR ${Boost_PREFIX}) + + unset(Boost_Options) + + list(APPEND Boost_Options --build-dir=${BoostBuild_DIR}) + list(APPEND Boost_Options --prefix=${BoostInstall_DIR}) + list(APPEND Boost_Options --with-log) + list(APPEND Boost_Options --with-program_options) + list(APPEND Boost_Options --with-system) + list(APPEND Boost_Options --with-filesystem) + + set(JAM_FILENAME ${BoostBuild_DIR}/user-config.jam) + + if(ANDROID) + set(NDK_CXX ${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/bin/${TARGET_ARCH}-linux-android${ANDROID_API_LEVEL}-clang++) + file(WRITE ${JAM_FILENAME} "using clang : arm64v8a : ${NDK_CXX} ;") + list(APPEND Boost_Options toolset=clang-arm64v8a) + # without target-os=android, it complains it cannot find -lrt. + list(APPEND Boost_Options target-os=android) + else() + file(WRITE ${JAM_FILENAME} "using gcc : local : ${CMAKE_CXX_COMPILER} ;\n") + list(APPEND Boost_Options toolset=gcc-local) + endif(ANDROID) + + # Install Boost libraries + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory "${BoostInstall_DIR}") + execute_process(COMMAND /usr/bin/env BOOST_BUILD_PATH="${BoostBuild_DIR}" ${BoostSource_DIR}/b2 install ${Boost_Options} + WORKING_DIRECTORY ${BoostSource_DIR}) + +endfunction(_Boost_Build) + +# Find pre-installed boost library and update Boost variables. +if (NOT BUILD_BOOST) + # BoostConfig.cmake does not honor QUIET argument at least till cmake 1.70.0. + # Thus, don't try to find_package if you're not entirely sure you have boost. + find_package(Boost 1.58.0 QUIET COMPONENTS log program_options filesystem system) + if(Boost_FOUND) + return() + endif() +endif() + +set(Boost_PREFIX ${CMAKE_INSTALL_PREFIX}) + +if(BUILD_BOOST) + _Boost_Build("${Boost_PREFIX}") + + # Let's use locally built boost to system-wide one so sub modules + # needing Boost library and header files can search for them + # in ${Boost_PREFIX} directory + list(APPEND CMAKE_PREFIX_PATH "${Boost_PREFIX}") + + # Without Boost_INCLUDE_DIR, it complains the variable is missing during find_package. + set(Boost_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/include) + + # 1) without static build, it will complain it cannot find libc++_shared.so. + # 2) We uses static libraries for other libraries. + set(Boost_USE_STATIC_LIBS ON) + + # We built boost library so update Boost variables. + find_package(Boost 1.58.0 QUIET COMPONENTS log program_options filesystem system) +endif(BUILD_BOOST) diff --git a/infra/nnfw/cmake/packages/EigenConfig.cmake b/infra/nnfw/cmake/packages/EigenConfig.cmake index 23e38cd..f37d653 100644 --- a/infra/nnfw/cmake/packages/EigenConfig.cmake +++ b/infra/nnfw/cmake/packages/EigenConfig.cmake @@ -1,14 +1,14 @@ function(_Eigen_import) - nnfw_find_package(EigenSource QUIET) + nnas_find_package(TensorFlowEigenSource-2.3.0-rc0 QUIET) - if(NOT EigenSource_FOUND) + if(NOT TensorFlowEigenSource_FOUND) set(Eigen_FOUND FALSE PARENT_SCOPE) return() - endif(NOT EigenSource_FOUND) + endif(NOT TensorFlowEigenSource_FOUND) if(NOT TARGET eigen) add_library(eigen INTERFACE) - target_include_directories(eigen SYSTEM INTERFACE "${EigenSource_DIR}") + target_include_directories(eigen SYSTEM INTERFACE "${TensorFlowEigenSource_DIR}") # Add EIGEN_MPL2_ONLY to remove license issue posibility target_compile_definitions(eigen INTERFACE EIGEN_MPL2_ONLY) endif(NOT TARGET eigen) diff --git a/infra/nnfw/cmake/packages/EigenSourceConfig.cmake b/infra/nnfw/cmake/packages/EigenSourceConfig.cmake deleted file mode 100644 index 1fbcf13..0000000 --- a/infra/nnfw/cmake/packages/EigenSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_EigenSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - # NOTE TensorFlow 1.12 downloads Eign from the following URL - envoption(EXTERNAL_DOWNLOAD_SERVER "https://bitbucket.org") - set(EIGEN_URL ${EXTERNAL_DOWNLOAD_SERVER}/eigen/eigen/get/88fc23324517.tar.gz) - ExternalSource_Get("eigen" ${DOWNLOAD_EIGEN} ${EIGEN_URL}) - - set(EigenSource_DIR ${eigen_SOURCE_DIR} PARENT_SCOPE) - set(EigenSource_FOUND ${eigen_SOURCE_GET} PARENT_SCOPE) -endfunction(_EigenSource_import) - -_EigenSource_import() diff --git a/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake b/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake index cba3c3c..ab53f97 100644 --- a/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake +++ b/infra/nnfw/cmake/packages/FarmhashSourceConfig.cmake @@ -1,11 +1,16 @@ function(_FarmhashSource_import) + if(NOT ${DOWNLOAD_FARMHASH}) + set(FarmhashSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_FARMHASH}) + nnas_include(ExternalSourceTools) nnas_include(OptionTools) # NOTE TensorFlow 1.12 downloads farmhash from the following URL envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(FARMHASH_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz) - ExternalSource_Get("farmhash" ${DOWNLOAD_FARMHASH} ${FARMHASH_URL}) + ExternalSource_Download("farmhash" ${FARMHASH_URL}) set(FarmhashSource_DIR ${farmhash_SOURCE_DIR} PARENT_SCOPE) set(FarmhashSource_FOUND ${farmhash_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake b/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake index 0646731..13ad111 100644 --- a/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake +++ b/infra/nnfw/cmake/packages/FlatBuffersConfig.cmake @@ -1,5 +1,13 @@ function(_FlatBuffers_import) - nnfw_find_package(FlatBuffersSource QUIET) + + find_package(Flatbuffers QUIET) + if(Flatbuffers_FOUND) + set(FlatBuffers_FOUND TRUE PARENT_SCOPE) + return() + endif(Flatbuffers_FOUND) + + # NOTE Tizen uses 1.11 + nnas_find_package(FlatBuffersSource EXACT 1.11 QUIET) if(NOT FlatBuffersSource_FOUND) set(FlatBuffers_FOUND FALSE PARENT_SCOPE) @@ -13,65 +21,15 @@ function(_FlatBuffers_import) list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/reflection.cpp") list(APPEND FlatBuffers_Library_SRCS "${FlatBuffersSource_DIR}/src/util.cpp") - # From FlatBuffers's CMakeLists.txt - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_cpp.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_dart.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_fbs.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_general.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_go.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_grpc.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_js.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_json_schema.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_lobster.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_lua.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_php.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/idl_gen_python.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/src/flatc_main.cpp") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/cpp_generator.cc") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/go_generator.cc") - list(APPEND FlatBuffers_Compiler_SRCS "${FlatBuffersSource_DIR}/grpc/src/compiler/java_generator.cc") - - if(NOT TARGET flatbuffers) + if(NOT TARGET flatbuffers::flatbuffers) add_library(flatbuffers ${FlatBuffers_Library_SRCS}) target_include_directories(flatbuffers PUBLIC "${FlatBuffersSource_DIR}/include") - endif(NOT TARGET flatbuffers) + set_property(TARGET flatbuffers PROPERTY POSITION_INDEPENDENT_CODE ON) - if(NOT TARGET flatc) - add_executable(flatc ${FlatBuffers_Compiler_SRCS}) - target_include_directories(flatc PRIVATE "${FlatBuffersSource_DIR}/grpc") - target_link_libraries(flatc flatbuffers) - endif(NOT TARGET flatc) + add_library(flatbuffers::flatbuffers ALIAS flatbuffers) + endif(NOT TARGET flatbuffers::flatbuffers) set(FlatBuffers_FOUND TRUE PARENT_SCOPE) endfunction(_FlatBuffers_import) _FlatBuffers_import() - -if(FlatBuffers_FOUND) - function(FlatBuffers_Generate PREFIX OUTPUT_DIR SCHEMA_DIR) - get_filename_component(abs_output_dir ${OUTPUT_DIR} ABSOLUTE) - get_filename_component(abs_schema_dir ${SCHEMA_DIR} ABSOLUTE) - - foreach(schema ${ARGN}) - get_filename_component(schema_fn "${schema}" NAME) - get_filename_component(dir "${schema}" DIRECTORY) - - get_filename_component(schema_fn_we "${schema_fn}" NAME_WE) - - list(APPEND SCHEMA_FILES "${abs_schema_dir}/${schema}") - list(APPEND OUTPUT_FILES "${abs_output_dir}/${schema_fn_we}_generated.h") - endforeach() - - add_custom_command(OUTPUT ${OUTPUT_FILES} - COMMAND ${CMAKE_COMMAND} -E make_directory "${abs_output_dir}" - COMMAND "$" -c --no-includes - --no-union-value-namespacing - --gen-object-api -o "${abs_output_dir}" - ${SCHEMA_FILES} - DEPENDS flatc) - - set(${PREFIX}_SOURCES ${OUTPUT_FILES} PARENT_SCOPE) - set(${PREFIX}_INCLUDE_DIRS ${abs_output_dir} PARENT_SCOPE) - endfunction(FlatBuffers_Generate) -endif(FlatBuffers_FOUND) diff --git a/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake b/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake deleted file mode 100644 index 5a59ef3..0000000 --- a/infra/nnfw/cmake/packages/FlatBuffersSourceConfig.cmake +++ /dev/null @@ -1,14 +0,0 @@ -function(_FlatBuffersSource_import) - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - # NOTE TensorFlow 1.12 downloads FlatBuffers from the following URL - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(FLATBUFFERS_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/flatbuffers/archive/1f5eae5d6a135ff6811724f6c57f911d1f46bb15.tar.gz) - ExternalSource_Get("flatbuffers" ${DOWNLOAD_FLATBUFFERS} ${FLATBUFFERS_URL}) - - set(FlatBuffersSource_DIR ${flatbuffers_SOURCE_DIR} PARENT_SCOPE) - set(FlatBuffersSource_FOUND ${flatbuffers_SOURCE_GET} PARENT_SCOPE) -endfunction(_FlatBuffersSource_import) - -_FlatBuffersSource_import() diff --git a/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake b/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake index d800cdc..97c8e05 100644 --- a/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake +++ b/infra/nnfw/cmake/packages/GEMMLowpSourceConfig.cmake @@ -1,11 +1,16 @@ function(_GEMMLowpSource_import) + if(NOT ${DOWNLOAD_GEMMLOWP}) + set(GEMMLowpSource_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_GEMMLOWP}) + nnas_include(ExternalSourceTools) nnas_include(OptionTools) # NOTE TensorFlow 1.12 uses the following URL envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(GEMMLOWP_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/gemmlowp/archive/38ebac7b059e84692f53e5938f97a9943c120d98.tar.gz) - ExternalSource_Get("gemmlowp" ${DOWNLOAD_GEMMLOWP} ${GEMMLOWP_URL}) + ExternalSource_Download("gemmlowp" ${GEMMLOWP_URL}) set(GEMMLowpSource_DIR ${gemmlowp_SOURCE_DIR} PARENT_SCOPE) set(GEMMLowpSource_FOUND ${gemmlowp_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/nnfw/cmake/packages/GTestConfig.cmake b/infra/nnfw/cmake/packages/GTestConfig.cmake index b4dd05f..f3aadf9 100644 --- a/infra/nnfw/cmake/packages/GTestConfig.cmake +++ b/infra/nnfw/cmake/packages/GTestConfig.cmake @@ -5,7 +5,7 @@ if(${BUILD_GTEST}) envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(GTEST_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/googletest/archive/release-1.8.0.tar.gz) - ExternalSource_Get("gtest" TRUE ${GTEST_URL}) + ExternalSource_Download("gtest" ${GTEST_URL}) # gtest_SOURCE_DIR is used in gtest subdirectorty's cmake set(sourcedir_gtest ${gtest_SOURCE_DIR}) diff --git a/infra/nnfw/cmake/packages/HDF5Config.cmake b/infra/nnfw/cmake/packages/HDF5Config.cmake index 1f90dea..b965ffc 100644 --- a/infra/nnfw/cmake/packages/HDF5Config.cmake +++ b/infra/nnfw/cmake/packages/HDF5Config.cmake @@ -1,31 +1,55 @@ +# Don't cache HDF5_*. Otherwise it will use the cached value without searching. unset(HDF5_DIR CACHE) -find_package(HDF5 QUIET) +unset(HDF5_INCLUDE_DIRS CACHE) +unset(HDF5_CXX_LIBRARY_hdf5 CACHE) +unset(HDF5_CXX_LIBRARY_hdf5_cpp CACHE) -if (NOT HDF5_FOUND) - # Give second chance for some systems where sytem find_package config mode fails - unset(HDF5_FOUND) +# Case 1. external hdf5 +if(DEFINED EXT_HDF5_DIR) + find_path(HDF5_INCLUDE_DIRS NAMES H5Cpp.h NO_CMAKE_FIND_ROOT_PATH PATHS "${EXT_HDF5_DIR}/include") + find_library(HDF5_CXX_LIBRARY_hdf5 NAMES libhdf5.a PATHS "${EXT_HDF5_DIR}/lib") + find_library(HDF5_CXX_LIBRARY_hdf5_cpp NAMES libhdf5_cpp.a PATHS "${EXT_HDF5_DIR}/lib") + if (NOT (HDF5_INCLUDE_DIRS AND HDF5_CXX_LIBRARY_hdf5 AND HDF5_CXX_LIBRARY_hdf5_cpp)) + message(WARNING "Failed to find H5Cpp.h or libhdf5.a or libhdf5_cpp.a") + set(HDF5_FOUND FALSE) + return() + else() + # message(FATAL_ERROR "0=${HDF5_INCLUDE_DIRS},1=${HDF5_CXX_LIBRARIES}") + set(HDF5_FOUND TRUE) + list(APPEND HDF5_CXX_LIBRARIES ${HDF5_CXX_LIBRARY_hdf5_cpp} ${HDF5_CXX_LIBRARY_hdf5}) + return() + endif() +endif() - find_path(HDF5_INCLUDE_DIRS NAMES hdf5.h PATH_SUFFIXES include/hdf5/serial) +# Case 2. search pre-installed locations (by apt, brew, ...) +if(NOT CMAKE_CROSSCOMPILING) + find_package(HDF5 COMPONENTS CXX QUIET) +else() + find_path(HDF5_INCLUDE_DIRS NAMES hdf5.h ONLY_CMAKE_FIND_ROOT_PATH PATH_SUFFIXES include/hdf5/serial) if (NOT HDF5_INCLUDE_DIRS) set(HDF5_FOUND FALSE) return() endif() - if (HDF5_USE_STATIC_LIBRARIES) - find_library(HDF5_LIBRARIES libhdf5.a) - else (HDF5_USE_STATIC_LIBRARIES) - find_library(HDF5_LIBRARIES libhdf5.so) + if(HDF5_USE_STATIC_LIBRARIES) + find_library(HDF5_CXX_LIBRARY_hdf5 libhdf5.a) + find_library(HDF5_CXX_LIBRARY_hdf5_cpp libhdf5_cpp.a) + else(HDF5_USE_STATIC_LIBRARIES) + find_library(HDF5_CXX_LIBRARY_hdf5 libhdf5.so) + find_library(HDF5_CXX_LIBRARY_hdf5_cpp libhdf5_cpp.so) endif(HDF5_USE_STATIC_LIBRARIES) - if (NOT HDF5_LIBRARIES) + if (NOT (HDF5_CXX_LIBRARY_hdf5 AND HDF5_CXX_LIBRARY_hdf5_cpp)) set(HDF5_FOUND FALSE) return() endif() - list(APPEND HDF5_LIBRARIES "sz" "z" "dl" "m") + + # We can use "hdf5" and "hdf5_cpp" to use the same file founded with above. + list(APPEND HDF5_CXX_LIBRARIES "hdf5" "hdf5_cpp" "sz" "z" "dl" "m") + + # Append missing libaec which is required by libsz, which is required by libhdf5 + list(APPEND HDF5_CXX_LIBRARIES "aec") set(HDF5_FOUND TRUE) endif() - -# Append missing libaec which is required by libsz, which is required by libhdf5 -list(APPEND HDF5_LIBRARIES "aec") diff --git a/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake b/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake index b1bf6cf..7bae616 100644 --- a/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake +++ b/infra/nnfw/cmake/packages/NEON2SSESourceConfig.cmake @@ -1,9 +1,8 @@ function(_NEON2SSESource_import) - # TODO Remove this workaround once target preset is ready - if(NOT (TARGET_ARCH_BASE STREQUAL "x86_64")) + if(NOT ${DOWNLOAD_NEON2SSE}) set(NEON2SSESource_FOUND FALSE PARENT_SCOPE) return() - endif(NOT (TARGET_ARCH_BASE STREQUAL "x86_64")) + endif(NOT ${DOWNLOAD_NEON2SSE}) nnas_include(ExternalSourceTools) nnas_include(OptionTools) @@ -11,7 +10,7 @@ function(_NEON2SSESource_import) # NOTE TensorFlow 1.12 downloads NEON2SSE from the following URL envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") set(NEON2SSE_URL ${EXTERNAL_DOWNLOAD_SERVER}/intel/ARM_NEON_2_x86_SSE/archive/0f77d9d182265259b135dad949230ecbf1a2633d.tar.gz) - ExternalSource_Get("neon_2_sse" ${DOWNLOAD_NEON2SSE} ${NEON2SSE_URL}) + ExternalSource_Download("neon_2_sse" ${NEON2SSE_URL}) set(NEON2SSESource_DIR ${neon_2_sse_SOURCE_DIR} PARENT_SCOPE) set(NEON2SSESource_FOUND ${neon_2_sse_SOURCE_GET} PARENT_SCOPE) diff --git a/infra/nnfw/cmake/packages/NoniusConfig.cmake b/infra/nnfw/cmake/packages/NoniusConfig.cmake new file mode 100644 index 0000000..049d655 --- /dev/null +++ b/infra/nnfw/cmake/packages/NoniusConfig.cmake @@ -0,0 +1,18 @@ +function(_Nonius_import) + nnas_find_package(NoniusSource QUIET) + + if(NOT NoniusSource_FOUND) + set(Nonius_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT NoniusSource_FOUND) + + if(NOT TARGET nonius) + message(STATUS "Found nonius: TRUE") + add_library(nonius INTERFACE) + target_include_directories(nonius INTERFACE "${NoniusSource_DIR}/include") + endif(NOT TARGET nonius) + + set(Nonius_FOUND TRUE PARENT_SCOPE) +endfunction(_Nonius_import) + +_Nonius_import() diff --git a/infra/nnfw/cmake/packages/Ruy/CMakeLists.txt b/infra/nnfw/cmake/packages/Ruy/CMakeLists.txt new file mode 100644 index 0000000..f4d9f88 --- /dev/null +++ b/infra/nnfw/cmake/packages/Ruy/CMakeLists.txt @@ -0,0 +1,45 @@ +set(RUY_BASE ${RuySource_DIR}/ruy) + +# +# Ruy library +# +file(GLOB RUY_CORE_SRCS "${RUY_BASE}/*.cc") +file(GLOB RUY_CORE_TESTS "${RUY_BASE}/*test*.cc") +list(REMOVE_ITEM RUY_CORE_SRCS ${RUY_CORE_TESTS}) + +list(APPEND RUY_SRCS ${RUY_CORE_SRCS}) +list(REMOVE_ITEM RUY_SRCS "${RUY_BASE}/benchmark.cc") +list(REMOVE_ITEM RUY_SRCS "${RUY_BASE}/example.cc") +list(REMOVE_ITEM RUY_SRCS "${RUY_BASE}/example_advanced.cc") +list(REMOVE_ITEM RUY_SRCS "${RUY_BASE}/tune_tool.cc") +list(REMOVE_ITEM RUY_SRCS "${RUY_BASE}/pmu.cc") + +list(APPEND RUY_INSTRUMENTATION_SRCS "${RUY_BASE}/profiler/instrumentation.cc") + +if(PROFILE_RUY) + list(APPEND RUY_PROFILER_SRCS "${RUY_BASE}/profiler/profiler.cc") + list(APPEND RUY_PROFILER_SRCS "${RUY_BASE}/profiler/treeview.cc") +endif(PROFILE_RUY) + +list(APPEND RUY_INCLUDES "${RuySource_DIR}") + +add_library(ruy STATIC ${RUY_SRCS}) +target_include_directories(ruy SYSTEM PUBLIC ${RUY_INCLUDES}) +target_compile_options(ruy PRIVATE -O3) + +add_library(ruy_instrumentation ${RUY_INSTRUMENTATION_SRCS}) +target_include_directories(ruy_instrumentation SYSTEM PUBLIC ${RUY_INCLUDES}) +target_compile_options(ruy_instrumentation PRIVATE -O3) + +set_target_properties(ruy ruy_instrumentation PROPERTIES POSITION_INDEPENDENT_CODE ON) + +if(PROFILE_RUY) + add_library(ruy_profiler STATIC ${RUY_PROFILER_SRCS}) + target_include_directories(ruy_profiler SYSTEM PUBLIC ${RUY_INCLUDES}) + target_compile_options(ruy_profiler PRIVATE -O3) + set_target_properties(ruy_profiler PROPERTIES POSITION_INDEPENDENT_CODE ON) + + target_compile_definitions(ruy PUBLIC RUY_PROFILER) + target_compile_definitions(ruy_instrumentation PUBLIC RUY_PROFILER) + target_compile_definitions(ruy_profiler PUBLIC RUY_PROFILER) +endif(PROFILE_RUY) diff --git a/infra/nnfw/cmake/packages/RuyConfig.cmake b/infra/nnfw/cmake/packages/RuyConfig.cmake new file mode 100644 index 0000000..278e33c --- /dev/null +++ b/infra/nnfw/cmake/packages/RuyConfig.cmake @@ -0,0 +1,22 @@ +function(_Ruy_import) + # NOTE This line prevents multiple definitions of ruy target + if(TARGET ruy) + set(Ruy_FOUND TRUE) + return() + endif(TARGET ruy) + + nnfw_find_package(RuySource QUIET) + + if(NOT RuySource_FOUND) + set(Ruy_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT RuySource_FOUND) + + if(BUILD_RUY) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/Ruy" ruy) + endif(BUILD_RUY) + + set(Ruy_FOUND TRUE PARENT_SCOPE) +endfunction(_Ruy_import) + +_Ruy_import() diff --git a/infra/nnfw/cmake/packages/RuySourceConfig.cmake b/infra/nnfw/cmake/packages/RuySourceConfig.cmake new file mode 100644 index 0000000..08170fb --- /dev/null +++ b/infra/nnfw/cmake/packages/RuySourceConfig.cmake @@ -0,0 +1,19 @@ +function(_RuySource_import) + if(NOT ${DOWNLOAD_RUY}) + set(RuySource_DIR FALSE PARENT_SCOPE) + return() + endif(NOT ${DOWNLOAD_RUY}) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # NOTE Downloads source from latest ruy library (2020-04-10) + envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") + set(RUY_URL ${EXTERNAL_DOWNLOAD_SERVER}/google/ruy/archive/2e2658f964638ab7aa562d4b48b76007d44e38f0.tar.gz) + ExternalSource_Download("ruy" ${RUY_URL}) + + set(RuySource_DIR ${ruy_SOURCE_DIR} PARENT_SCOPE) + set(RuySource_FOUND ${ruy_SOURCE_GET} PARENT_SCOPE) +endfunction(_RuySource_import) + +_RuySource_import() diff --git a/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfig.cmake new file mode 100644 index 0000000..253b290 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfig.cmake @@ -0,0 +1,19 @@ +function(_Eigen_import) + nnas_find_package(EigenSource QUIET) + + if(NOT EigenSource_FOUND) + set(TensorFlowEigen_1_13_1_FOUND FALSE PARENT_SCOPE) + return() + endif(NOT EigenSource_FOUND) + + if(NOT TARGET eigen-tf-1.13.1) + add_library(eigen-tf-1.13.1 INTERFACE) + target_include_directories(eigen-tf-1.13.1 SYSTEM INTERFACE "${EigenSource_DIR}") + # Add EIGEN_MPL2_ONLY to remove license issue posibility + target_compile_definitions(eigen-tf-1.13.1 INTERFACE EIGEN_MPL2_ONLY) + endif(NOT TARGET eigen-tf-1.13.1) + + set(TensorFlowEigen_1_13_1_FOUND TRUE PARENT_SCOPE) +endfunction(_Eigen_import) + +_Eigen_import() diff --git a/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfigVersion.cmake b/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfigVersion.cmake new file mode 100644 index 0000000..ed79ecd --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowEigen-1.13.1/TensorFlowEigenConfigVersion.cmake @@ -0,0 +1,9 @@ +set(PACKAGE_VERSION "1.13.1") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLite/CMakeLists.txt b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLite/CMakeLists.txt new file mode 100644 index 0000000..2c9618d --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLite/CMakeLists.txt @@ -0,0 +1,62 @@ +set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/lite) + +# +# Tensorflow Lite library +# +file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc" "${TENSORFLOW_LITE_BASE}/core/*.cc") +file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc") +list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS}) + +file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc") +file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc") +list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS}) + +file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc") +file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc") +list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS}) + +file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc") +file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc") +list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS}) + +file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc") +file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc") +list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS}) + +# We will use our own BuiltinOpResolver +list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc") +# We will use our own summarizer +list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc") +list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS}) + +list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc") + +list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}") +list(APPEND TFLITE_INCLUDES "${AbseilSource_DIR}") +list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}") +list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src") + +if(NEON2SSESource_FOUND) + list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}") +endif(NEON2SSESource_FOUND) + +# This kernels are not used on nnfw +## spectrogram +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc") +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc") + +add_library(tensorflow-lite STATIC ${TFLITE_SRCS}) +target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES}) +target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") +set_property(TARGET tensorflow-lite PROPERTY POSITION_INDEPENDENT_CODE ON) +target_link_libraries(tensorflow-lite eigen-tf-1.13.1 flatbuffers::flatbuffers ${LIB_PTHREAD} dl) + +if(ANDROID) + target_link_libraries(tensorflow-lite log) + target_include_directories(tensorflow-lite PUBLIC "${NDK_DIR}/..") +endif() diff --git a/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake new file mode 100644 index 0000000..4cd7610 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfig.cmake @@ -0,0 +1,73 @@ +# NOTE This line prevents multiple definitions of tensorflow-lite target +if(TARGET tensorflow-lite) + set(TensorFlowLite_FOUND TRUE) + return() +endif(TARGET tensorflow-lite) + +if(BUILD_TENSORFLOW_LITE) + macro(return_unless VAR) + if(NOT ${VAR}) + set(TensorFlowLite_FOUND PARENT_SCOPE) + return() + endif(NOT ${VAR}) + endmacro(return_unless) + + # Required packages + nnas_find_package(AbseilSource QUIET) + return_unless(AbseilSource_FOUND) + nnfw_find_package(TensorFlowEigen EXACT 1.13.1 QUIET) + return_unless(TensorFlowEigen_1_13_1_FOUND) + nnfw_find_package(FarmhashSource QUIET) + return_unless(FarmhashSource_FOUND) + nnfw_find_package(FlatBuffers QUIET) + return_unless(FlatBuffers_FOUND) + nnfw_find_package(GEMMLowpSource QUIET) + return_unless(GEMMLowpSource_FOUND) + nnas_find_package(TensorFlowSource EXACT 1.13.1 QUIET) + return_unless(TensorFlowSource_FOUND) + + # Optional packages + nnfw_find_package(NEON2SSESource QUIET) + + nnas_include(ExternalProjectTools) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite" tflite) + + set(TensorFlowLite_FOUND TRUE) + return() +endif(BUILD_TENSORFLOW_LITE) + +# Use pre-built TensorFlow Lite +find_path(TFLITE_INCLUDE_DIR NAMES tensorflow/lite/interpreter.h) +find_library(TFLITE_LIB NAMES tensorflow-lite) + +if(NOT TFLITE_INCLUDE_DIR) + set(TensorFlowLite_FOUND FALSE) + return() +endif(NOT TFLITE_INCLUDE_DIR) + +if(NOT TFLITE_LIB) + set(TensorFlowLite_FOUND FALSE) + return() +endif(NOT TFLITE_LIB) + +message(STATUS "Found TensorFlow Lite: TRUE (include: ${TFLITE_INCLUDE_DIR}, lib: ${TFLITE_LIB}") + +# TODO Use IMPORTED target +add_library(tensorflow-lite INTERFACE) +target_include_directories(tensorflow-lite SYSTEM INTERFACE ${TFLITE_INCLUDE_DIR}) +target_link_libraries(tensorflow-lite INTERFACE ${TFLITE_LIB}) +find_package(Flatbuffers) +if(Flatbuffers_FOUND) + target_link_libraries(tensorflow-lite INTERFACE flatbuffers::flatbuffers) +endif(Flatbuffers_FOUND) + +# Prefer -pthread to -lpthread +set(THREADS_PREFER_PTHREAD_FLAG TRUE) +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) +find_package(Threads QUIET) + +if(Threads_FOUND) + target_link_libraries(tensorflow-lite INTERFACE ${CMAKE_THREAD_LIBS_INIT}) +endif(Threads_FOUND) + +set(TensorFlowLite_FOUND TRUE) diff --git a/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake new file mode 100644 index 0000000..ed79ecd --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite-1.13.1/TensorFlowLiteConfigVersion.cmake @@ -0,0 +1,9 @@ +set(PACKAGE_VERSION "1.13.1") +set(PACKAGE_VERSION_EXACT FALSE) +set(PACKAGE_VERSION_COMPATIBLE FALSE) +set(PACKAGE_VERSION_UNSUITABLE TRUE) + +if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + set(PACKAGE_VERSION_UNSUITABLE FALSE) +endif(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION) diff --git a/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0/CMakeLists.txt b/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0/CMakeLists.txt new file mode 100644 index 0000000..8e7f78e --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0/CMakeLists.txt @@ -0,0 +1,110 @@ +# Reference: https://github.com/tensorflow/tensorflow/blob/v2.2.0/tensorflow/lite/tools/make/Makefile +# +# Tensorflow Lite library 2.2.0 +# +set(TENSORFLOW_LITE_BASE ${TFLite220TensorFlowSource_DIR}/tensorflow/lite) + +file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" + "${TENSORFLOW_LITE_BASE}/*.cc" + "${TENSORFLOW_LITE_BASE}/core/*.cc") + +file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc") + +file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc") + +file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" + "${TENSORFLOW_LITE_BASE}/core/api/*.cc") + +list(APPEND TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/memory_info.cc") +list(APPEND TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/time.cc") + +file(GLOB TFLITE_EXPERIMENTAL_SRCS "${TENSORFLOW_LITE_BASE}/experimental/resource/*.cc" + "${TENSORFLOW_LITE_BASE}/experimental/ruy/*.cc") + +file(GLOB TFLITE_SPARSITY_SRCS "${TENSORFLOW_LITE_BASE}/tools/optimize/sparsity/*.cc") + +list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_EXPERIMENTAL_SRCS}) +list(APPEND TFLITE_SRCS ${TFLITE_SPARSITY_SRCS}) + +# externals +list(APPEND TFLITE_SRCS "${TFLite220FarmhashSource_DIR}/src/farmhash.cc") +list(APPEND TFLITE_SRCS "${TFLite220FFT2DSource_DIR}/fftsg.c") +list(APPEND TFLITE_SRCS "${TFLite220FFT2DSource_DIR}/fftsg2d.c") +list(APPEND TFLITE_SRCS "${TFLite220FlatBuffersSource_DIR}/src/util.cpp") + +# externals - absl +file(GLOB_RECURSE ABSL_SRCS "${TFLite220AbslSource_DIR}/absl/*.cc") +file(GLOB_RECURSE ABSL_EXCLS "${TFLite220AbslSource_DIR}/absl/*test*.cc" + "${TFLite220AbslSource_DIR}/absl/*benchmark*.cc" + "${TFLite220AbslSource_DIR}/absl/synchronization/*.cc" + "${TFLite220AbslSource_DIR}/absl/debugging/*.cc" + "${TFLite220AbslSource_DIR}/absl/hash/*.cc" + "${TFLite220AbslSource_DIR}/absl/flags/*.cc") +list(REMOVE_ITEM ABSL_SRCS ${ABSL_EXCLS}) +list(APPEND TFLITE_SRCS ${ABSL_SRCS}) + +# Build with mmap? true +# caution: v2.2.0's Makefile has wrong code on this part. This is fixed on master branch. +set(BUILD_WITH_MMAP TRUE) +if(${BUILD_WITH_MMAP}) + list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/mmap_allocation_disabled.cc") +else() + list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/mmap_allocation.cc") +endif() + +# Build with nnapi? true +# caution: this nnapi delegate comes from tflite, not ours. +set(BUILD_WITH_NNAPI TRUE) +if(${BUILD_WITH_NNAPI}) + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/delegates/nnapi/nnapi_delegate.cc") + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/delegates/nnapi/quant_lstm_sup.cc") + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/nnapi/nnapi_implementation.cc") + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/nnapi/nnapi_util.cc") +else() + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/delegates/nnapi/nnapi_delegate_disabled.cc") + list(APPEND TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/nnapi/nnapi_implementation_disabled.cc") +endif() + +# ios: we don't support ios +list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/minimal_logging_ios.cc") + +# android +if(NOT ANDROID) + list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/minimal_logging_android.cc") +endif() + +# exclude some source files +file(GLOB_RECURSE TFLITE_EXCLS "${TENSORFLOW_LITE_BASE}/*test*.cc" + "${TENSORFLOW_LITE_BASE}/*benchmark*.cc" + "${TENSORFLOW_LITE_BASE}/*example*.cc" + "${TENSORFLOW_LITE_BASE}/*tool*.cc") +list(REMOVE_ITEM TFLITE_SRCS ${TFLITE_EXCLS}) + +# include headers +list(APPEND TFLITE_INCLUDES "${TFLite220TensorFlowSource_DIR}") +list(APPEND TFLITE_INCLUDES "${TFLite220EigenSource_DIR}") +list(APPEND TFLITE_INCLUDES "${TFLite220AbslSource_DIR}") +list(APPEND TFLITE_INCLUDES "${TFLite220GEMMLowpSource_DIR}") +list(APPEND TFLITE_INCLUDES "${TFLite220NEON2SSESource_DIR}") +list(APPEND TFLITE_INCLUDES "${TFLite220FarmhashSource_DIR}/src") +list(APPEND TFLITE_INCLUDES "${TFLite220FlatBuffersSource_DIR}/include") +list(APPEND TFLITE_INCLUDES "${TFLite220FP16Source_DIR}/include") + +add_library(tensorflow-lite-2.2.0 STATIC ${TFLITE_SRCS}) +target_include_directories(tensorflow-lite-2.2.0 SYSTEM PUBLIC ${TFLITE_INCLUDES}) +target_compile_definitions(tensorflow-lite-2.2.0 PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK -DTFLITE_WITH_RUY -DTFLITE_WITH_RUY_GEMV") +set_property(TARGET tensorflow-lite-2.2.0 PROPERTY POSITION_INDEPENDENT_CODE ON) +target_link_libraries(tensorflow-lite-2.2.0 eigen ${LIB_PTHREAD} dl) +if(${BUILD_WITH_NNAPI}) + target_link_libraries(tensorflow-lite-2.2.0 rt) +endif() + +if(ANDROID) + target_link_libraries(tensorflow-lite-2.2.0 log) + target_include_directories(tensorflow-lite-2.2.0 PUBLIC "${NDK_DIR}/..") +endif() diff --git a/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0Config.cmake b/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0Config.cmake new file mode 100644 index 0000000..e698235 --- /dev/null +++ b/infra/nnfw/cmake/packages/TensorFlowLite-2.2.0Config.cmake @@ -0,0 +1,92 @@ +if(BUILD_TENSORFLOW_LITE_2_2_0) + macro(return_unless VAR) + if(NOT ${VAR}) + message("${VAR} NOT TRUE") + set(TensorFlowLite_2_2_0_FOUND PARENT_SCOPE) + return() + endif(NOT ${VAR}) + endmacro(return_unless) + + nnas_include(ExternalSourceTools) + nnas_include(OptionTools) + + # Below urls come from https://github.com/tensorflow/tensorflow/blob/v2.2.0/tensorflow/lite/tools/make/Makefile + + set(absl_url "https://github.com/abseil/abseil-cpp/archive/43ef2148c0936ebf7cb4be6b19927a9d9d145b8f.tar.gz") + ExternalSource_Download("tflite220_Absl" ${absl_url}) + set(TFLite220AbslSource_DIR "${tflite220_Absl_SOURCE_DIR}") + if (NOT TFLite220AbslSource_DIR STREQUAL "") + set(TFLite220AbslSource_FOUND TRUE) + endif() + return_unless(TFLite220AbslSource_FOUND) + + set(eigen_url "https://gitlab.com/libeigen/eigen/-/archive/52a2fbbb008a47c5e3fb8ac1c65c2feecb0c511c/eigen-52a2fbbb008a47c5e3fb8ac1c65c2feecb0c511c.tar.gz") + ExternalSource_Download("tflite220_Eigen" ${eigen_url}) + set(TFLite220EigenSource_DIR "${tflite220_Eigen_SOURCE_DIR}") + if (NOT TFLite220EigenSource_DIR STREQUAL "") + set(TFLite220EigenSource_FOUND TRUE) + endif() + return_unless(TFLite220EigenSource_FOUND) + + set(farmhash_url "https://storage.googleapis.com/mirror.tensorflow.org/github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz") + ExternalSource_Download("tflite220_Farmhash" ${farmhash_url}) + set(TFLite220FarmhashSource_DIR "${tflite220_Farmhash_SOURCE_DIR}") + if (NOT TFLite220FarmhashSource_DIR STREQUAL "") + set(TFLite220FarmhashSource_FOUND TRUE) + endif() + return_unless(TFLite220FarmhashSource_FOUND) + + set(fft2d_url "https://storage.googleapis.com/mirror.tensorflow.org/www.kurims.kyoto-u.ac.jp/~ooura/fft2d.tgz") + ExternalSource_Download("tflite220_FFT2D" ${fft2d_url}) + set(TFLite220FFT2DSource_DIR "${tflite220_FFT2D_SOURCE_DIR}") + if (NOT TFLite220FFT2DSource_DIR STREQUAL "") + set(TFLite220FFT2DSource_FOUND TRUE) + endif() + return_unless(TFLite220FFT2DSource_FOUND) + + set(flatbuffers_url "https://storage.googleapis.com/mirror.tensorflow.org/github.com/google/flatbuffers/archive/v1.11.0.tar.gz") + ExternalSource_Download("tflite220_FlatBuffers" ${flatbuffers_url}) + set(TFLite220FlatBuffersSource_DIR "${tflite220_FlatBuffers_SOURCE_DIR}") + if (NOT TFLite220FlatBuffersSource_DIR STREQUAL "") + set(TFLite220FlatBuffersSource_FOUND TRUE) + endif() + return_unless(TFLite220FlatBuffersSource_FOUND) + + set(fp16_url "https://github.com/Maratyszcza/FP16/archive/febbb1c163726b5db24bed55cc9dc42529068997.zip") + ExternalSource_Download("tflite220_FP16" ${fp16_url}) + set(TFLite220FP16Source_DIR "${tflite220_FP16_SOURCE_DIR}") + if (NOT TFLite220FP16Source_DIR STREQUAL "") + set(TFLite220FP16Source_FOUND TRUE) + endif() + return_unless(TFLite220FP16Source_FOUND) + + set(gemmlowp_url "https://storage.googleapis.com/mirror.tensorflow.org/github.com/google/gemmlowp/archive/12fed0cd7cfcd9e169bf1925bc3a7a58725fdcc3.zip") + ExternalSource_Download("tflite220_GEMMLowp" ${gemmlowp_url}) + set(TFLite220GEMMLowpSource_DIR "${tflite220_GEMMLowp_SOURCE_DIR}") + if (NOT TFLite220GEMMLowpSource_DIR STREQUAL "") + set(TFLite220GEMMLowpSource_FOUND TRUE) + endif() + return_unless(TFLite220GEMMLowpSource_FOUND) + + set(neon2sse_url "https://github.com/intel/ARM_NEON_2_x86_SSE/archive/master.zip") + ExternalSource_Download("tflite220_NEON2SSE" ${neon2sse_url}) + set(TFLite220NEON2SSESource_DIR "${tflite220_NEON2SSE_SOURCE_DIR}") + if (NOT TFLite220NEON2SSESource_DIR STREQUAL "") + set(TFLite220NEON2SSESource_FOUND TRUE) + endif() + return_unless(TFLite220NEON2SSESource_FOUND) + + set(tensorflow_url "https://github.com/tensorflow/tensorflow/archive/v2.2.0.tar.gz") + ExternalSource_Download("tflite220_TensorFlow" ${tensorflow_url}) + set(TFLite220TensorFlowSource_DIR "${tflite220_TensorFlow_SOURCE_DIR}") + if (NOT TFLite220TensorFlowSource_DIR STREQUAL "") + set(TFLite220TensorFlowSource_FOUND TRUE) + endif() + return_unless(TFLite220TensorFlowSource_FOUND) + + nnas_include(ExternalProjectTools) + add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite-2.2.0" tflite-2.2.0) + + set(TensorFlowLite_2_2_0_FOUND TRUE) + return() +endif() diff --git a/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt b/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt deleted file mode 100644 index 00ec4b5..0000000 --- a/infra/nnfw/cmake/packages/TensorFlowLite/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -set(TENSORFLOW_LITE_BASE ${TensorFlowSource_DIR}/tensorflow/lite) - -# -# Tensorflow Lite library -# -file(GLOB TFLITE_CORE_SRCS "${TENSORFLOW_LITE_BASE}/*.c" "${TENSORFLOW_LITE_BASE}/*.cc" "${TENSORFLOW_LITE_BASE}/core/*.cc") -file(GLOB TFLITE_CORE_TESTS "${TENSORFLOW_LITE_BASE}/*test*.cc") -list(REMOVE_ITEM TFLITE_CORE_SRCS ${TFLITE_CORE_TESTS}) - -file(GLOB_RECURSE TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/*.cc") -file(GLOB_RECURSE TFLITE_KERNEL_TESTS "${TENSORFLOW_LITE_BASE}/kernels/*test*.cc") -list(REMOVE_ITEM TFLITE_KERNEL_SRCS ${TFLITE_KERNEL_TESTS}) - -file(GLOB TFLITE_LIB_SRCS "${TENSORFLOW_LITE_BASE}/c/*.c" "${TENSORFLOW_LITE_BASE}/c/*.cc") -file(GLOB TFLITE_LIB_TESTS "${TENSORFLOW_LITE_BASE}/c/*test*.cc") -list(REMOVE_ITEM TFLITE_LIB_SRCS ${TFLITE_LIB_TESTS}) - -file(GLOB TFLITE_API_SRCS "${TENSORFLOW_LITE_BASE}/core/api/*.c" "${TENSORFLOW_LITE_BASE}/core/api/*.cc") -file(GLOB TFLITE_API_TESTS "${TENSORFLOW_LITE_BASE}/core/api/*test*.cc") -list(REMOVE_ITEM TFLITE_API_SRCS ${TFLITE_API_TESTS}) - -file(GLOB TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/*.cc") -file(GLOB TFLITE_PROFILING_TESTS "${TENSORFLOW_LITE_BASE}/profiling/*test*.cc") -list(REMOVE_ITEM TFLITE_PROFILING_SRCS ${TFLITE_PROFILING_TESTS}) - -# We will use our own BuiltinOpResolver -list(REMOVE_ITEM TFLITE_KERNEL_SRCS "${TENSORFLOW_LITE_BASE}/kernels/register.cc") -# We will use our own summarizer -list(REMOVE_ITEM TFLITE_PROFILING_SRCS "${TENSORFLOW_LITE_BASE}/profiling/profile_summarizer.cc") -list(APPEND TFLITE_SRCS ${TFLITE_CORE_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_KERNEL_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_LIB_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_API_SRCS}) -list(APPEND TFLITE_SRCS ${TFLITE_PROFILING_SRCS}) - -list(APPEND TFLITE_SRCS "${FarmhashSource_DIR}/src/farmhash.cc") - -list(APPEND TFLITE_INCLUDES "${TensorFlowSource_DIR}") -list(APPEND TFLITE_INCLUDES "${AbslSource_DIR}") -list(APPEND TFLITE_INCLUDES "${GEMMLowpSource_DIR}") -list(APPEND TFLITE_INCLUDES "${FarmhashSource_DIR}/src") -list(APPEND TFLITE_INCLUDES "${FlatBuffersSource_DIR}/include") - -if(NEON2SSESource_FOUND) - list(APPEND TFLITE_INCLUDES "${NEON2SSESource_DIR}") -endif(NEON2SSESource_FOUND) - -# This kernels are not used on nnfw -## spectrogram -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/audio_spectrogram_test.cc") -list(REMOVE_ITEM TFLITE_SRCS "${TENSORFLOW_LITE_BASE}/kernels/internal/spectrogram.cc") - -add_library(tensorflow-lite STATIC ${TFLITE_SRCS}) -target_include_directories(tensorflow-lite SYSTEM PUBLIC ${TFLITE_INCLUDES}) -target_compile_definitions(tensorflow-lite PUBLIC "GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK") -set_property(TARGET tensorflow-lite PROPERTY POSITION_INDEPENDENT_CODE ON) -target_link_libraries(tensorflow-lite eigen ${LIB_PTHREAD} dl) - -if(ANDROID) - target_link_libraries(tensorflow-lite log) - target_include_directories(tensorflow-lite PUBLIC "${NDK_DIR}/..") -endif() diff --git a/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake deleted file mode 100644 index 2b1c0ec..0000000 --- a/infra/nnfw/cmake/packages/TensorFlowLiteConfig.cmake +++ /dev/null @@ -1,69 +0,0 @@ -# NOTE This line prevents multiple definitions of tensorflow-lite target -if(TARGET tensorflow-lite) - set(TensorFlowLite_FOUND TRUE) - return() -endif(TARGET tensorflow-lite) - -if(BUILD_TENSORFLOW_LITE) - macro(return_unless VAR) - if(NOT ${VAR}) - set(TensorFlowLite_FOUND PARENT_SCOPE) - return() - endif(NOT ${VAR}) - endmacro(return_unless) - - # Required packages - nnfw_find_package(AbslSource QUIET) - return_unless(AbslSource_FOUND) - nnfw_find_package(Eigen QUIET) - return_unless(Eigen_FOUND) - nnfw_find_package(FarmhashSource QUIET) - return_unless(FarmhashSource_FOUND) - nnfw_find_package(FlatBuffersSource QUIET) - return_unless(FlatBuffersSource_FOUND) - nnfw_find_package(GEMMLowpSource QUIET) - return_unless(GEMMLowpSource_FOUND) - nnfw_find_package(TensorFlowSource QUIET) - return_unless(TensorFlowSource_FOUND) - - # Optional packages - nnfw_find_package(NEON2SSESource QUIET) - - nnas_include(ExternalProjectTools) - add_extdirectory("${CMAKE_CURRENT_LIST_DIR}/TensorFlowLite" tflite) - - set(TensorFlowLite_FOUND TRUE) - return() -endif(BUILD_TENSORFLOW_LITE) - -# Use pre-built TensorFlow Lite -find_path(TFLITE_INCLUDE_DIR NAMES tensorflow/lite/interpreter.h) -find_library(TFLITE_LIB NAMES tensorflow-lite) - -if(NOT TFLITE_INCLUDE_DIR) - set(TensorFlowLite_FOUND FALSE) - return() -endif(NOT TFLITE_INCLUDE_DIR) - -if(NOT TFLITE_LIB) - set(TensorFlowLite_FOUND FALSE) - return() -endif(NOT TFLITE_LIB) - -message(STATUS "Found TensorFlow Lite: TRUE (include: ${TFLITE_INCLUDE_DIR}, lib: ${TFLITE_LIB}") - -# TODO Use IMPORTED target -add_library(tensorflow-lite INTERFACE) -target_include_directories(tensorflow-lite SYSTEM INTERFACE ${TFLITE_INCLUDE_DIR}) -target_link_libraries(tensorflow-lite INTERFACE ${TFLITE_LIB}) - -# Prefer -pthread to -lpthread -set(THREADS_PREFER_PTHREAD_FLAG TRUE) -set(CMAKE_THREAD_PREFER_PTHREAD TRUE) -find_package(Threads QUIET) - -if(Threads_FOUND) - target_link_libraries(tensorflow-lite INTERFACE ${CMAKE_THREAD_LIBS_INIT}) -endif(Threads_FOUND) - -set(TensorFlowLite_FOUND TRUE) diff --git a/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake b/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake deleted file mode 100644 index 1896239..0000000 --- a/infra/nnfw/cmake/packages/TensorFlowSourceConfig.cmake +++ /dev/null @@ -1,18 +0,0 @@ -function(_TensorFlowSource_import) - if(NOT DOWNLOAD_TENSORFLOW) - set(TensorFlowSource_FOUND FALSE PARENT_SCOPE) - return() - endif(NOT DOWNLOAD_TENSORFLOW) - - nnas_include(ExternalSourceTools) - nnas_include(OptionTools) - - envoption(EXTERNAL_DOWNLOAD_SERVER "https://github.com") - set(TENSORFLOW_URL ${EXTERNAL_DOWNLOAD_SERVER}/tensorflow/tensorflow/archive/v1.13.1.tar.gz) - ExternalSource_Get("tensorflow" ${DOWNLOAD_TENSORFLOW} ${TENSORFLOW_URL}) - - set(TensorFlowSource_DIR ${tensorflow_SOURCE_DIR} PARENT_SCOPE) - set(TensorFlowSource_FOUND ${tensorflow_SOURCE_GET} PARENT_SCOPE) -endfunction(_TensorFlowSource_import) - -_TensorFlowSource_import() diff --git a/infra/nnfw/command/build b/infra/nnfw/command/build index 8e59f66..b0301d2 100644 --- a/infra/nnfw/command/build +++ b/infra/nnfw/command/build @@ -7,18 +7,5 @@ if [[ ! -d "${BUILD_PATH}" ]]; then exit 255 fi -# Set parallel build -# TODO Use argument instead of environment variable -HOST_OS=${HOST_OS:-linux} -NPROCS=${NPROCS:-1} -PARALLEL_BUILD=${PARALLEL_BUILD:-1} - -if [ "${PARALLEL_BUILD}" == "1" ]; then - # Get number of processors (linux only for now) - if [ "${HOST_OS}" == "linux" ]; then - NPROCS="$(grep -c ^processor /proc/cpuinfo)" - fi -fi - cd ${BUILD_PATH} -make -j ${NPROCS} "$@" +make "$@" diff --git a/infra/nnfw/command/count-unittest b/infra/nnfw/command/count-unittest new file mode 100644 index 0000000..7957f36 --- /dev/null +++ b/infra/nnfw/command/count-unittest @@ -0,0 +1,74 @@ +#!/bin/bash +# +# Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Usage() +{ + echo "Usage: ./$0 [--install-path=Product/out]" +} + +INSTALL_PATH=Product/out + +for i in "$@" +do + case $i in + -h|--help|help) + Usage + exit 1 + ;; + --install-path=*) + INSTALL_PATH=${i#*=} + ;; + *) + Usage + exit 1 + ;; + esac + shift +done + +# List of gtest binaries +GTEST_BINS=( + unittest_standalone/nnfw_api_gtest + unittest_standalone/test_compute + unittest_standalone/test_onert + unittest_standalone/test_onert_backend_cpu_common + unittest_standalone/test_onert_frontend_nnapi + unittest_standalone/tflite_test +) + +# Collect test cases +echo "Install Path : '$INSTALL_PATH'" +TEST_LIST= +for GTEST_BIN in ${GTEST_BINS[@]}; do + GTEST_PATH=$INSTALL_PATH/$GTEST_BIN + echo "Collecting test cases from '$GTEST_PATH'" + TESTS=$($GTEST_PATH --gtest_list_tests | grep '^ ') + if [ "$?" -ne 0 ]; then + echo "Error collecting test cases from '$GTEST_PATH'" + exit 1; + fi + TEST_LIST=$TEST_LIST$TESTS +done + +# Count stats +TOTAL_TCS=$(echo "$TEST_LIST" | wc -l) +TOTAL_NEG_TCS=$(echo "$TEST_LIST" | grep '^ neg_' | wc -l) +TOTAL_POS_TCS=$(echo "$TEST_LIST" | grep '^ neg_' -v | wc -l) + +# Report stats +echo "TOTAL NUMBER OF TEST CASES : $TOTAL_TCS" +echo "TOTAL NUMBER OF POSTIVE TEST CASES : $TOTAL_NEG_TCS" +echo "TOTAL NUMBER OF NEGATIVE TEST CASES : $TOTAL_POS_TCS" diff --git a/infra/packaging/build b/infra/packaging/build index 81ab2ec..036c2d5 100644 --- a/infra/packaging/build +++ b/infra/packaging/build @@ -8,7 +8,7 @@ if [[ -z "${NNAS_PROJECT_PATH}" ]]; then fi # The default preset -PRESET="20191215" +PRESET="20200630" EXTRA_OPTIONS=() while [ "$#" -ne 0 ]; do diff --git a/infra/packaging/preset/20200508 b/infra/packaging/preset/20200508 new file mode 100644 index 0000000..15ec345 --- /dev/null +++ b/infra/packaging/preset/20200508 @@ -0,0 +1,54 @@ +#!/bin/bash + +# NOTE purpose of this file is static analysis only +# new official preset will be added when new programs are ready + +PRESET="20200508" + +function preset_configure() +{ + REQUIRED_UNITS=() + # Common Libraries + REQUIRED_UNITS+=("angkor" "cwrap" "pepper-str" "pepper-strcast" "pp" "stdex") + REQUIRED_UNITS+=("oops" "pepper-assert" "foder") + REQUIRED_UNITS+=("safemain") + # Hermes Logging Framework + REQUIRED_UNITS+=("hermes" "hermes-std") + # loco IR and related utilities + REQUIRED_UNITS+=("loco" "locop" "locomotiv" "logo-core" "logo") + # Flatbuffer I/O + REQUIRED_UNITS+=("mio-tflite" "mio-circle") + # Circle compiler library (.circle -> .circle) + REQUIRED_UNITS+=("luci") + # Tools + REQUIRED_UNITS+=("tflite2circle" "circle2circle" "tflchef" "circlechef") + REQUIRED_UNITS+=("tf2tfliteV2" "luci-interpreter" "circle-verify") + REQUIRED_UNITS+=("record-minmax") + + # TODO Use "nncc configure" and "nncc build" + cmake \ + -DCMAKE_INSTALL_PREFIX="${NNCC_INSTALL_PREFIX}" \ + -DCMAKE_BUILD_TYPE=release \ + -DBUILD_WHITELIST=$(join_by ";" "${REQUIRED_UNITS[@]}") \ + ${EXTRA_OPTIONS[@]} \ + "${NNAS_PROJECT_PATH}/infra/nncc" +} + +function preset_install() +{ + install -t "${NNPKG_INSTALL_PREFIX}/bin" -D \ + "${NNAS_PROJECT_PATH}/tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh" + + # Install tf2nnpkg + install -T -m 755 -D "${SCRIPT_PATH}/res/tf2nnpkg.${PRESET}" "${NNAS_INSTALL_PREFIX}/bin/tf2nnpkg" + + # Create python virtual enviornment + python3 -m venv "${NNAS_INSTALL_PREFIX}/bin/venv" + + # Install tensorflow + source "${NNAS_INSTALL_PREFIX}/bin/venv/bin/activate" + python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install -U pip setuptools + python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install tensorflow==2.2.0 +} diff --git a/infra/packaging/preset/20200616_windows b/infra/packaging/preset/20200616_windows new file mode 100644 index 0000000..9bf533e --- /dev/null +++ b/infra/packaging/preset/20200616_windows @@ -0,0 +1,60 @@ +#!/bin/bash + +function preset_configure() +{ + REQUIRED_UNITS=() + # Common Libraries + REQUIRED_UNITS+=("angkor" "cwrap" "foder" "oops" "pepper-assert") + REQUIRED_UNITS+=("pepper-str" "pepper-strcast" "pp" "safemain" "stdex") + # Hermes Logging Framework + REQUIRED_UNITS+=("hermes" "hermes-std") + # loco IR and related utilities + REQUIRED_UNITS+=("loco" "locop" "locomotiv" "logo-core" "logo") + # TensorFlow GraphDef I/O + REQUIRED_UNITS+=("mio-tflite" "mio-circle") + # Circle compiler library (.circle -> .circle) + REQUIRED_UNITS+=("luci") + # Tools + REQUIRED_UNITS+=("circlechef" "circle2circle" "circle-verify") + REQUIRED_UNITS+=("luci-interpreter" "record-minmax" "tflchef") + REQUIRED_UNITS+=("tflite2circle" "tf2tfliteV2") + + NPROC=$(cat /proc/cpuinfo | grep -c processor) + + # TODO Use "nncc configure" and "nncc build" + cmake \ + -G "MSYS Makefiles" \ + -DTF2NNPKG_FOR_WINDOWS=ON \ + -DUSE_PROTOBUF_LEGACY_IMPORT=ON \ + -DCMAKE_EXE_LINKER_FLAGS="-Wl,--allow-multiple-definition" \ + -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--allow-multiple-definition" \ + -DENABLE_TEST=OFF \ + -DDOWNLOAD_GTEST=OFF \ + -DBUILD_GTEST=OFF \ + -DCMAKE_C_COMPILER=gcc \ + -DCMAKE_CXX_COMPILER=g++ \ + -DCMAKE_INSTALL_PREFIX="${NNCC_INSTALL_PREFIX}" \ + -DCMAKE_BUILD_TYPE=release \ + -DBUILD_WHITELIST=$(join_by ";" "${REQUIRED_UNITS[@]}") \ + -DEXTERNALS_BUILD_THREADS=$((NPROC/2)) \ + ${EXTRA_OPTIONS[@]} \ + "${NNAS_PROJECT_PATH}/infra/nncc" +} + +function preset_install() +{ + # Install libraries to bin/ for Windows release + mv ${NNCC_INSTALL_PREFIX}/lib/*.dll ${NNCC_INSTALL_PREFIX}/bin + rm -rf ${NNCC_INSTALL_PREFIX}/lib + + install -t "${NNPKG_INSTALL_PREFIX}/bin" -D \ + "${NNAS_PROJECT_PATH}/tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh" + + # Install tf2nnpkg + install -T -m 755 -D "${SCRIPT_PATH}/res/tf2nnpkg.${PRESET}" "${NNAS_INSTALL_PREFIX}/bin/tf2nnpkg" + + # Though you have to install tensorflow to run 'tf2tfliteV2', + # tensorflow can't be installed in mingw. First, You can install tensorflow + # from Window native CMD(run as administrator) with python virtual environment. + # And, you must copy it to "${NNAS_INSTALL_PREFIX}/bin/venv" +} diff --git a/infra/packaging/preset/20200630 b/infra/packaging/preset/20200630 new file mode 100644 index 0000000..e159935 --- /dev/null +++ b/infra/packaging/preset/20200630 @@ -0,0 +1,57 @@ +#!/bin/bash + +# NOTE purpose of this file is static analysis only +# new official preset will be added when new programs are ready + +PRESET="20200630" + +function preset_configure() +{ + REQUIRED_UNITS=() + # Common Libraries + REQUIRED_UNITS+=("angkor" "cwrap" "pepper-str" "pepper-strcast" "pp" "stdex") + REQUIRED_UNITS+=("oops" "pepper-assert" "foder") + REQUIRED_UNITS+=("souschef") + REQUIRED_UNITS+=("safemain") + REQUIRED_UNITS+=("arser") + # Hermes Logging Framework + REQUIRED_UNITS+=("hermes" "hermes-std") + # loco IR and related utilities + REQUIRED_UNITS+=("loco" "locop" "locomotiv" "logo-core" "logo") + # Flatbuffer I/O + REQUIRED_UNITS+=("mio-tflite" "mio-circle") + # Circle compiler library (.circle -> .circle) + REQUIRED_UNITS+=("luci") + # Tools + REQUIRED_UNITS+=("tflite2circle" "circle2circle" "tflchef" "circlechef") + REQUIRED_UNITS+=("tf2tfliteV2" "luci-interpreter" "circle-verify") + REQUIRED_UNITS+=("record-minmax" "circle-quantizer") + REQUIRED_UNITS+=("one-cmds") + + # TODO Use "nncc configure" and "nncc build" + cmake \ + -DCMAKE_INSTALL_PREFIX="${NNCC_INSTALL_PREFIX}" \ + -DCMAKE_BUILD_TYPE=release \ + -DBUILD_WHITELIST=$(join_by ";" "${REQUIRED_UNITS[@]}") \ + ${EXTRA_OPTIONS[@]} \ + "${NNAS_PROJECT_PATH}/infra/nncc" +} + +function preset_install() +{ + install -t "${NNPKG_INSTALL_PREFIX}/bin" -D \ + "${NNAS_PROJECT_PATH}/tools/nnpackage_tool/model2nnpkg/model2nnpkg.sh" + + # Install tf2nnpkg + install -T -m 755 -D "${SCRIPT_PATH}/res/tf2nnpkg.${PRESET}" "${NNAS_INSTALL_PREFIX}/bin/tf2nnpkg" + + # Create python virtual enviornment + python3 -m venv "${NNAS_INSTALL_PREFIX}/bin/venv" + + # Install tensorflow + source "${NNAS_INSTALL_PREFIX}/bin/venv/bin/activate" + python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install -U pip setuptools + python -m pip --default-timeout=1000 --trusted-host pypi.org --trusted-host files.pythonhost.org \ + install tensorflow-cpu==2.3.0rc0 +} diff --git a/infra/packaging/res/tf2nnpkg.20200508 b/infra/packaging/res/tf2nnpkg.20200508 new file mode 100644 index 0000000..a9923b4 --- /dev/null +++ b/infra/packaging/res/tf2nnpkg.20200508 @@ -0,0 +1,97 @@ +#!/bin/bash + +set -e + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +command_exists() { + if [ "$#" -le 0 ]; then + return 1 + fi + command -v "$@" > /dev/null 2>&1 +} + +usage() +{ + echo "Convert TensorFlow model to nnpackage." + echo "Usage: tf2nnpkg --info --graphdef [OPTION] -o " + echo "option:" + echo " --customop " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--info') + export INFO_FILE="$2" + shift 2 + ;; + '--graphdef') + export GRAPHDEF_FILE="$2" + shift 2 + ;; + '--customop') + export CUSTOMOP_CONF_FILE="$2" + shift 2 + ;; + '-o') + export OUTPUT_DIR="$2" + shift 2 + ;; + *) + echo "${CUR}" + shift + ;; + esac +done + +if [ -z ${GRAPHDEF_FILE} ] || [ ! -e ${GRAPHDEF_FILE} ]; then + echo "pb is not found. Please check --graphdef is correct." + exit 2 +fi + +if [ -z ${INFO_FILE} ] || [ ! -e ${INFO_FILE} ]; then + echo "info is not found. Please check --info is correct." + exit 2 +fi + +# optional param +if [ ${CUSTOMOP_CONF_FILE} ]; then + if [ ! -e ${CUSTOMOP_CONF_FILE} ]; then + echo "customop.conf is not found. Please check --customop is correct." + exit 2 + fi +fi + +FILE_BASE=$(basename ${GRAPHDEF_FILE}) +MODEL_NAME="${FILE_BASE%.*}" +TMPDIR=$(mktemp -d) +trap "{ rm -rf $TMPDIR; }" EXIT + +if [ ${CUSTOMOP_CONF_FILE} ]; then + echo "This option is supported by previous version." + exit 2 +fi + +# activate python virtual environment +source "${ROOT}/bin/venv/bin/activate" + +# parse inputs, outputs from info file +INPUT=$(awk -F, '/^input/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) +OUTPUT=$(awk -F, '/^output/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) + +# generate tflite file +python "${ROOT}/bin/tf2tfliteV2.py" --v1 --input_path ${GRAPHDEF_FILE} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--input_arrays ${INPUT} --output_arrays ${OUTPUT} + +"${ROOT}/bin/tflite2circle" "${TMPDIR}/${MODEL_NAME}.tflite" "${TMPDIR}/${MODEL_NAME}.circle" + +"${ROOT}/bin/model2nnpkg.sh" -o "${OUTPUT_DIR}" "${TMPDIR}/${MODEL_NAME}.circle" diff --git a/infra/packaging/res/tf2nnpkg.20200616 b/infra/packaging/res/tf2nnpkg.20200616 new file mode 100644 index 0000000..9f09571 --- /dev/null +++ b/infra/packaging/res/tf2nnpkg.20200616 @@ -0,0 +1,89 @@ +#!/bin/bash + +set -e + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +command_exists() { + if [ "$#" -le 0 ]; then + return 1 + fi + command -v "$@" > /dev/null 2>&1 +} + +usage() +{ + echo "Convert TensorFlow model to nnpackage." + echo "Usage: tf2nnpkg --info --graphdef [OPTION] -o " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--info') + export INFO_FILE="$2" + shift 2 + ;; + '--graphdef') + export GRAPHDEF_FILE="$2" + shift 2 + ;; + '-o') + export OUTPUT_DIR="$2" + shift 2 + ;; + *) + echo "${CUR}" + shift + ;; + esac +done + +if [ -z ${GRAPHDEF_FILE} ] || [ ! -e ${GRAPHDEF_FILE} ]; then + echo "pb is not found. Please check --graphdef is correct." + exit 2 +fi + +if [ -z ${INFO_FILE} ] || [ ! -e ${INFO_FILE} ]; then + echo "info is not found. Please check --info is correct." + exit 2 +fi + +FILE_BASE=$(basename ${GRAPHDEF_FILE}) +MODEL_NAME="${FILE_BASE%.*}" +TMPDIR=$(mktemp -d) +trap "{ rm -rf $TMPDIR; }" EXIT + +# activate python virtual environment +VIRTUALENV_LINUX="${ROOT}/bin/venv/bin/activate" +VIRTUALENV_WINDOWS="${ROOT}/bin/venv/Scripts/activate" + +if [ -e ${VIRTUALENV_LINUX} ]; then + source ${VIRTUALENV_LINUX} +elif [ -e ${VIRTUALENV_WINDOWS} ]; then + source ${VIRTUALENV_WINDOWS} +fi + +# parse inputs, outputs from info file +INPUT=$(awk -F, '/^input/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) +OUTPUT=$(awk -F, '/^output/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) + +# generate tflite file +python "${ROOT}/bin/tf2tfliteV2.py" --v1 --input_path ${GRAPHDEF_FILE} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--input_arrays ${INPUT} --output_arrays ${OUTPUT} + +# convert .tflite to .circle +"${ROOT}/bin/tflite2circle" "${TMPDIR}/${MODEL_NAME}.tflite" "${TMPDIR}/${MODEL_NAME}.circle" + +# optimize +"${ROOT}/bin/circle2circle" "${TMPDIR}/${MODEL_NAME}.circle" "${TMPDIR}/${MODEL_NAME}.circle" + +"${ROOT}/bin/model2nnpkg.sh" -o "${OUTPUT_DIR}" "${TMPDIR}/${MODEL_NAME}.circle" diff --git a/infra/packaging/res/tf2nnpkg.20200630 b/infra/packaging/res/tf2nnpkg.20200630 new file mode 100644 index 0000000..9101f82 --- /dev/null +++ b/infra/packaging/res/tf2nnpkg.20200630 @@ -0,0 +1,100 @@ +#!/bin/bash + +set -e + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +command_exists() { + if [ "$#" -le 0 ]; then + return 1 + fi + command -v "$@" > /dev/null 2>&1 +} + +usage() +{ + echo "Convert TensorFlow model to nnpackage." + echo "Usage: tf2nnpkg --info --graphdef [OPTION] -o " + exit 0 +} + +# Parse command-line arguments +# +while [ "$#" -ne 0 ]; do + CUR="$1" + + case $CUR in + '--help') + usage + ;; + '--info') + export INFO_FILE="$2" + shift 2 + ;; + '--graphdef') + export GRAPHDEF_FILE="$2" + shift 2 + ;; + '-o') + export OUTPUT_DIR="$2" + shift 2 + ;; + *) + echo "${CUR}" + shift + ;; + esac +done + +if [ -z ${GRAPHDEF_FILE} ] || [ ! -e ${GRAPHDEF_FILE} ]; then + echo "pb is not found. Please check --graphdef is correct." + exit 2 +fi + +if [ -z ${INFO_FILE} ] || [ ! -e ${INFO_FILE} ]; then + echo "info is not found. Please check --info is correct." + exit 2 +fi + +if [ -z ${OUTPUT_DIR} ]; then + echo "output directory is not specifed. Please check -o is correct.." + exit 2 +fi + +FILE_BASE=$(basename ${GRAPHDEF_FILE}) +MODEL_NAME="${FILE_BASE%.*}" +TMPDIR=$(mktemp -d) +trap "{ rm -rf $TMPDIR; }" EXIT + +# activate python virtual environment +VIRTUALENV_LINUX="${ROOT}/bin/venv/bin/activate" +VIRTUALENV_WINDOWS="${ROOT}/bin/venv/Scripts/activate" + +if [ -e ${VIRTUALENV_LINUX} ]; then + source ${VIRTUALENV_LINUX} +elif [ -e ${VIRTUALENV_WINDOWS} ]; then + source ${VIRTUALENV_WINDOWS} +fi + +# parse inputs, outputs from info file +INPUT=$(awk -F, '/^input/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) +OUTPUT=$(awk -F, '/^output/ { print $2 }' ${INFO_FILE} | cut -d: -f1 | tr -d ' ' | paste -d, -s) + +INPUT_SHAPES=$(grep ^input ${INFO_FILE} | cut -d "[" -f2 | cut -d "]" -f1 | tr -d ' ' | xargs | tr ' ' ':') + +# generate tflite file +python "${ROOT}/bin/tf2tfliteV2.py" --v2 --input_path ${GRAPHDEF_FILE} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--input_arrays ${INPUT} --output_arrays ${OUTPUT} || \ +python "${ROOT}/bin/tf2tfliteV2.py" --v1 --input_path ${GRAPHDEF_FILE} \ +--output_path "${TMPDIR}/${MODEL_NAME}.tflite" \ +--input_arrays ${INPUT} --input_shapes ${INPUT_SHAPES} \ +--output_arrays ${OUTPUT} + +# convert .tflite to .circle +"${ROOT}/bin/tflite2circle" "${TMPDIR}/${MODEL_NAME}.tflite" "${TMPDIR}/${MODEL_NAME}.tmp.circle" + +# optimize +"${ROOT}/bin/circle2circle" --all "${TMPDIR}/${MODEL_NAME}.tmp.circle" "${TMPDIR}/${MODEL_NAME}.circle" + +"${ROOT}/bin/model2nnpkg.sh" -o "${OUTPUT_DIR}" "${TMPDIR}/${MODEL_NAME}.circle" diff --git a/infra/scripts/common.sh b/infra/scripts/common.sh index edd2116..28aa213 100755 --- a/infra/scripts/common.sh +++ b/infra/scripts/common.sh @@ -19,7 +19,7 @@ # Run ./tests/scripts/test-driver.sh script unittest # # NNPackageTest $1 $2 -# Run ./tools/nnpackage_tool/nnpkg_test/nnpkg_test.sh script nnpackage test +# Run ./tests/scripts/nnpkg_test.sh script nnpackage test CURRENT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_PATH="$(cd ${CURRENT_PATH}/../../ && pwd)" @@ -115,7 +115,7 @@ function NNPackageTest() do for entry in "nnpkg-tcs"/$f; do if [ -e $entry ]; then - BACKENDS="$1" tools/nnpackage_tool/nnpkg_test/nnpkg_test.sh -d -i nnpkg-tcs $(basename "$entry") + BACKENDS="$1" tests/scripts/nnpkg_test.sh -d -i nnpkg-tcs $(basename "$entry") fi done EXITCODE_F=$? @@ -131,3 +131,32 @@ function NNPackageTest() popd > /dev/null } + +# $1: (required) backend +# $2: (required) test list file relative path from nnfw root directory +# pass empty string if there is no skiplist +# $3: (required) relative path to report from nnfw root directory +function TFLiteLoaderTest() +{ + [[ $# -ne 3 ]] && echo "TFLiteLoaderTest: Invalid function argument setting" && exit 1 + + pushd ${ROOT_PATH} > /dev/null + + export BACKENDS=$1 + if [[ "$2" == "" ]]; then + ./tests/scripts/test-driver.sh \ + --frameworktest \ + --framework_driverbin="$ROOT_PATH/Product/out/bin/tflite_loader_test_tool" \ + --reportdir=$ROOT_PATH/$3 + . + else + ./tests/scripts/test-driver.sh \ + --frameworktest \ + --framework_driverbin="$ROOT_PATH/Product/out/bin/tflite_loader_test_tool" \ + --frameworktest_list_file=tests/scripts/list/tflite_loader_list.${TEST_ARCH}.txt \ + --reportdir=$ROOT_PATH/$3 + fi + unset BACKENDS + + popd > /dev/null +} diff --git a/infra/scripts/compiler_modules.sh b/infra/scripts/compiler_modules.sh new file mode 100644 index 0000000..d436e8a --- /dev/null +++ b/infra/scripts/compiler_modules.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Don't run this script +[[ "${BASH_SOURCE[0]}" == "${0}" ]] && echo "Please don't execute ${BASH_SOURCE[0]}, source it" && return + +DEBUG_BUILD_ITEMS="angkor;cwrap;pepper-str;pepper-strcast;pp;stdex" +DEBUG_BUILD_ITEMS+=";oops;pepper-assert" +DEBUG_BUILD_ITEMS+=";hermes;hermes-std" +DEBUG_BUILD_ITEMS+=";loco;locop;locomotiv;logo-core;logo" +DEBUG_BUILD_ITEMS+=";foder;souschef;arser" +DEBUG_BUILD_ITEMS+=";safemain;mio-circle;mio-tflite" +DEBUG_BUILD_ITEMS+=";tflite2circle" +DEBUG_BUILD_ITEMS+=";luci" +DEBUG_BUILD_ITEMS+=";luci-interpreter" +DEBUG_BUILD_ITEMS+=";luci-value-test" +DEBUG_BUILD_ITEMS+=";circle2circle;record-minmax;circle-quantizer" +DEBUG_BUILD_ITEMS+=";circle-verify" +DEBUG_BUILD_ITEMS+=";tflchef;circlechef" +DEBUG_BUILD_ITEMS+=";common-artifacts" +DEBUG_BUILD_ITEMS+=";circle2circle-dredd-recipe-test" +DEBUG_BUILD_ITEMS+=";record-minmax-conversion-test" +DEBUG_BUILD_ITEMS+=";tf2tfliteV2;tf2tfliteV2-conversion-test" +DEBUG_BUILD_ITEMS+=";tflite2circle-conversion-test" diff --git a/infra/scripts/configure_compiler_coverage.sh b/infra/scripts/configure_compiler_coverage.sh new file mode 100755 index 0000000..e80c3e9 --- /dev/null +++ b/infra/scripts/configure_compiler_coverage.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "Please don't source ${BASH_SOURCE[0]}, execute it" && return + +set -eo pipefail + +CURRENT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_PATH="$CURRENT_PATH/../../" + +source ${CURRENT_PATH}/compiler_modules.sh + +NNCC_CFG_OPTION=" -DCMAKE_BUILD_TYPE=Debug" +NNCC_CFG_STRICT=" -DENABLE_STRICT_BUILD=ON" +NNCC_COV_DEBUG=" -DBUILD_WHITELIST=$DEBUG_BUILD_ITEMS" + +if [ $# -ne 0 ]; then + echo "Additional cmake configuration: $@" +fi + +./nncc configure \ + $NNCC_CFG_OPTION $NNCC_COV_DEBUG $NNCC_CFG_STRICT \ + -DENABLE_COVERAGE=ON "$@" diff --git a/infra/scripts/docker_build_cross_arm_benchmark_model.sh b/infra/scripts/docker_build_cross_arm_benchmark_model.sh deleted file mode 100755 index f63edf1..0000000 --- a/infra/scripts/docker_build_cross_arm_benchmark_model.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash - -[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "Please don't source ${BASH_SOURCE[0]}, execute it" && return - -CURRENT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -ROOT_PATH="$CURRENT_PATH/../../" - -# prepare rootfs -if [ ! -d $ROOTFS_DIR ]; then - echo "It will use default rootfs path" -else - DOCKER_VOLUMES+=" -v $ROOTFS_DIR:/opt/rootfs" - DOCKER_ENV_VARS+=" -e ROOTFS_DIR=/opt/rootfs" -fi - -# mount volume (or directory) for externals -if [ -n "$EXTERNAL_VOLUME" ]; then - DOCKER_VOLUMES+=" -v $EXTERNAL_VOLUME:/externals" - DOCKER_ENV_VARS+=" -e EXTERNAL_VOLUME=/externals" -else - echo "It will use default external path" -fi - -# docker image name -if [ -z $DOCKER_IMAGE_NAME ]; then - echo "It will use default docker image name" -fi - -# Mirror server setting -if [ -z $EXTERNAL_DOWNLOAD_SERVER ]; then - echo "It will not use mirror server" -fi - -DOCKER_ENV_VARS+=" -e TARGET_ARCH=armv7l" -DOCKER_ENV_VARS+=" -e CROSS_BUILD=1" -DOCKER_ENV_VARS+=" -e BENCHMARK_ACL_BUILD=1" -DOCKER_ENV_VARS+=" -e BUILD_TYPE=Release" - -set -e - -pushd $ROOT_PATH > /dev/null - -# TODO use command instead of makefile -export DOCKER_ENV_VARS -export DOCKER_VOLUMES -CMD="export OPTIONS='-DBUILD_PURE_ARM_COMPUTE=ON -DBUILD_ONERT=OFF -DBUILD_TFLITE_BENCHMARK_MODEL=ON -DBUILD_TFLITE_LOADER=OFF' && \ - cp -nv Makefile.template Makefile && \ - make all install build_test_suite" -./nnfw docker-run bash -c "$CMD" - -popd > /dev/null diff --git a/infra/scripts/docker_build_test_x64.sh b/infra/scripts/docker_build_test_x64.sh index eb620df..16fcf3f 100755 --- a/infra/scripts/docker_build_test_x64.sh +++ b/infra/scripts/docker_build_test_x64.sh @@ -44,6 +44,6 @@ fi export DOCKER_ENV_VARS=" -e MODELFILE_SERVER=$MODELFILE_SERVER" ./nnfw docker-run-user ./infra/scripts/test_ubuntu_runtime.sh --backend cpu -./nnfw docker-run-user ./infra/scripts/test_ubuntu_runtime_interp.sh +./nnfw docker-run-user ./infra/scripts/test_ubuntu_runtime.sh --interp popd > /dev/null diff --git a/infra/scripts/docker_collect_nnpkg_resources.sh b/infra/scripts/docker_collect_nnpkg_resources.sh index 822c390..556c5bd 100755 --- a/infra/scripts/docker_collect_nnpkg_resources.sh +++ b/infra/scripts/docker_collect_nnpkg_resources.sh @@ -59,28 +59,21 @@ pushd $ROOT_PATH > /dev/null REQUIRED_UNITS=() # Common Libraries -REQUIRED_UNITS+=("angkor" "bino" "cwrap" "fipe" "pepper-str" "pepper-strcast" "pp" "stdex") -REQUIRED_UNITS+=("oops" "pepper-assert" "cli" "safemain") +REQUIRED_UNITS+=("angkor" "cwrap" "pepper-str" "pepper-strcast" "pp" "stdex") +REQUIRED_UNITS+=("oops" "safemain" "foder" "arser" "oops") # Hermes Logging Framework REQUIRED_UNITS+=("hermes" "hermes-std") # loco IR and related utilities REQUIRED_UNITS+=("loco" "locop" "locomotiv" "logo-core" "logo") -# loco IR extension: Custom Op Support -REQUIRED_UNITS+=("locoex-customop") -# TensorFlow Libraries -REQUIRED_UNITS+=("tfinfo" "plier-tf") -# TensorFlow GraphDef I/O -REQUIRED_UNITS+=("mio-tf") -# TensorFlow Frontend (.pb/.pbtxt -> loco.caninical) -REQUIRED_UNITS+=("moco-log" "moco" "moco-tf") -# TensorFlow Lite/Circle Backend (loco.canonical -> .tflite, loco.circle -> .circle) -REQUIRED_UNITS+=("exo") +# Circle compiler library (.circle -> .circle) +REQUIRED_UNITS+=("luci") +# Flatbuffer I/O +REQUIRED_UNITS+=("mio-tflite" "mio-circle") # Tools -REQUIRED_UNITS+=("tf2tflite" "tfkit" "i5diff") -# nnkit and related utilities -REQUIRED_UNITS+=("nnkit" "nnkit-intf" "nnkit-misc" "nnkit-tflite" "nnkit-tf") -# tf2tflite_value_pbtxt_test -REQUIRED_UNITS+=("tf2tflite-value-pbtxt-test") +REQUIRED_UNITS+=("tflite2circle" "circle2circle" "luci-interpreter") +REQUIRED_UNITS+=("souschef" "tflchef" "circlechef" "circle-verify") +# common-artifacts +REQUIRED_UNITS+=("common-artifacts") # Reset whitelist to build all ./nncc docker-run ./nncc configure -DENABLE_STRICT_BUILD=ON -DCMAKE_BUILD_TYPE=release \ @@ -88,16 +81,19 @@ REQUIRED_UNITS+=("tf2tflite-value-pbtxt-test") $CONFIG_OPTIONS ./nncc docker-run ./nncc build -j4 -# tf2tflite_value_pbtxt_test to generate graphdef, input, golden data -./nncc docker-run ./nncc test -R "tf2tflite_value_pbtxt_test" - mkdir -p ${ARCHIVE_PATH} TEMP_DIR=$(mktemp -d -t resXXXX) rm -f ${TEMP_DIR}/* -cp $NNCC_WORKSPACE/compiler/tf2tflite-value-pbtxt-test/*.h5 ${TEMP_DIR} -cp $NNCC_WORKSPACE/compiler/tf2tflite-value-pbtxt-test/*.info ${TEMP_DIR} -cp $NNCC_WORKSPACE/compiler/tf2tflite-value-pbtxt-test/*.pb ${TEMP_DIR} -tar -zcf ${ARCHIVE_PATH}/test-resources.tar.gz -C ${TEMP_DIR} ./ +mkdir -p ${TEMP_DIR}/nnpkg-tcs + +# Copy nnpakcage only if it has its test data +for nnpkg in $NNCC_WORKSPACE/compiler/common-artifacts/*; do + if [ -d $nnpkg/metadata/tc ]; then + cp -r $nnpkg ${TEMP_DIR}/nnpkg-tcs + fi +done + +tar -zcf ${ARCHIVE_PATH}/nnpkg-test-suite.tar.gz -C ${TEMP_DIR} ./ rm -rf ${TEMP_DIR} echo "resouce generation end" diff --git a/infra/scripts/docker_coverage_report.sh b/infra/scripts/docker_coverage_report.sh index dac4e3f..677462d 100755 --- a/infra/scripts/docker_coverage_report.sh +++ b/infra/scripts/docker_coverage_report.sh @@ -25,7 +25,7 @@ tar -zxf ${ARCHIVE_PATH}/coverage-data.tar.gz CMD="GCOV_PATH=arm-linux-gnueabihf-gcov NNAS_WORKSPACE=Product ./nnas gen-coverage-report runtime compute && tar -zcf coverage/coverage_report.tar.gz coverage/html && - python tools/lcov-to-cobertura-xml/lcov_cobertura.py coverage/coverage.info -o coverage/nnfw_coverage.xml" + python runtime/3rdparty/lcov-to-cobertura-xml/lcov_cobertura.py coverage/coverage.info -o coverage/nnfw_coverage.xml" ./nnfw docker-run-user bash -c "$CMD" diff --git a/infra/scripts/test_arm_nnpkg.sh b/infra/scripts/test_arm_nnpkg.sh index d6561ff..68adaf9 100755 --- a/infra/scripts/test_arm_nnpkg.sh +++ b/infra/scripts/test_arm_nnpkg.sh @@ -7,10 +7,10 @@ BACKENDS=("acl_cl" "acl_neon" "cpu") for BACKEND in "${BACKENDS[@]}"; do - NNPackageTest ${BACKEND} "tools/nnpackage_tool/nnpkg_test/list.armv7l-linux.${BACKEND}" + NNPackageTest ${BACKEND} "tests/scripts/list/nnpkg_test_list.armv7l-linux.${BACKEND}" done # Interpreter test export DISABLE_COMPILE=1 -NNPackageTest "interp" "tools/nnpackage_tool/nnpkg_test/list.noarch.interp" +NNPackageTest "interp" "tests/scripts/list/nnpkg_test_list.noarch.interp" unset DISABLE_COMPILE diff --git a/infra/scripts/test_coverage.sh b/infra/scripts/test_coverage.sh index 773122e..c3dc048 100755 --- a/infra/scripts/test_coverage.sh +++ b/infra/scripts/test_coverage.sh @@ -36,7 +36,7 @@ TFLiteModelVerification "acl_cl" "tests/scripts/list/frameworktest_list.armv7l.a unset TRACE_FILEPATH # Interpreter -./infra/scripts/test_ubuntu_runtime_interp.sh +./infra/scripts/test_ubuntu_runtime.sh --interp # nnpackage test suite if [[ -e ${ARCHIVE_PATH}/nnpkg-test-suite.tar.gz ]]; then diff --git a/infra/scripts/test_ubuntu_runtime.sh b/infra/scripts/test_ubuntu_runtime.sh index d4190bd..76e567a 100755 --- a/infra/scripts/test_ubuntu_runtime.sh +++ b/infra/scripts/test_ubuntu_runtime.sh @@ -6,8 +6,10 @@ source "$(dirname "${BASH_SOURCE[0]}")/common.sh" BACKEND="cpu" TEST_ARCH=$(uname -m | tr '[:upper:]' '[:lower:]') TEST_OS="linux" +TEST_PLATFORM="$TEST_ARCH-$TEST_OS" TFLITE_LOADER="0" LINEAR_ONLY="0" +RUN_INTERP="0" function Usage() { @@ -43,6 +45,10 @@ do LINEAR_ONLY="1" shift ;; + --interp) + RUN_INTERP="1" + shift; + ;; *) # Ignore shift @@ -51,34 +57,58 @@ do done CheckTestPrepared -echo "[[ ${TEST_ARCH}-${TEST_OS}: ${BACKEND} backend test ]]" -UNITTEST_SKIPLIST="Product/out/unittest/nnapi_gtest.skip.${TEST_ARCH}-${TEST_OS}.${BACKEND}" + +if [ $RUN_INTERP = "1" ]; then + TEST_PLATFORM="noarch" + TEST_ARCH="noarch" + BACKEND="interp" + echo "[[ Interpreter test ]]" +else + echo "[[ ${TEST_PLATFORM}: ${BACKEND} backend test ]]" +fi + +UNITTEST_SKIPLIST="Product/out/unittest/nnapi_gtest.skip.${TEST_PLATFORM}.${BACKEND}" FRAMEWORK_TESTLIST="tests/scripts/list/frameworktest_list.${TEST_ARCH}.${BACKEND}.txt" REPORT_BASE="report/${BACKEND}" EXECUTORS=("Linear" "Dataflow" "Parallel") + if [ $LINEAR_ONLY = "1" ]; then EXECUTORS=("Linear") fi +if [ $RUN_INTERP = "1" ]; then + EXECUTORS=("Interpreter") +fi for EXECUTOR in "${EXECUTORS[@]}"; do echo "[EXECUTOR]: ${EXECUTOR}" - export EXECUTOR="${EXECUTOR}" - Unittests "${BACKEND}" "${UNITTEST_SKIPLIST}" "${REPORT_BASE}/${EXECUTOR}" - TFLiteModelVerification "${BACKEND}" "${FRAMEWORK_TESTLIST}" "${REPORT_BASE}/${EXECUTOR}" - unset EXECUTOR + REPORT_PATH="${REPORT_BASE}/${EXECUTOR}" + + if [ $EXECUTOR = "Interpreter" ]; then + export DISABLE_COMPILE=1 + BACKEND="" + else + export EXECUTOR="${EXECUTOR}" + fi + + Unittests "${BACKEND}" "${UNITTEST_SKIPLIST}" "${REPORT_PATH}" + TFLiteModelVerification "${BACKEND}" "${FRAMEWORK_TESTLIST}" "${REPORT_PATH}" + + if [ $EXECUTOR = "Interpreter" ]; then + unset DISABLE_COMPILE + else + unset EXECUTOR + fi done +# Current support acl_cl backend testlist only +# TODO Support more backends +TFLITE_LOADER_TESTLIST="tests/scripts/list/tflite_loader_list.${TEST_ARCH}.txt" if [[ $TFLITE_LOADER = "1" ]]; then - # Test tflite_loader - pushd ${ROOT_PATH} > /dev/null - ./tests/scripts/test-driver.sh \ - --frameworktest \ - --framework_driverbin="$ROOT_PATH/Product/out/bin/tflite_loader_test_tool" \ - --frameworktest_list_file=tests/scripts/list/tflite_loader_list.${TEST_ARCH}.txt \ - --reportdir="$ROOT_PATH/report/tfliteloader" . + TFLiteLoaderTest "${BACKEND}" "${TFLITE_LOADER_TESTLIST}" "${REPORT_BASE}/loader/${EXECUTOR}" # Test custom op + pushd ${ROOT_PATH} > /dev/null ./Product/out/tests/FillFrom_runner popd > /dev/null fi diff --git a/infra/scripts/test_ubuntu_runtime_interp.sh b/infra/scripts/test_ubuntu_runtime_interp.sh deleted file mode 100755 index 4113b06..0000000 --- a/infra/scripts/test_ubuntu_runtime_interp.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -eo pipefail -source "$(dirname "${BASH_SOURCE[0]}")/common.sh" - -export DISABLE_COMPILE=1 -CheckTestPrepared -echo "[[ Interpreter test ]]" -Unittests "cpu" "Product/out/unittest/nnapi_gtest.skip.noarch.interp" "report/interp" -TFLiteModelVerification "cpu" "tests/scripts/list/frameworktest_list.noarch.interp.txt" "report/interp" - -unset DISABLE_COMPILE diff --git a/infra/scripts/test_ubuntu_runtime_mixed.sh b/infra/scripts/test_ubuntu_runtime_mixed.sh index 71b33de..265a2ac 100755 --- a/infra/scripts/test_ubuntu_runtime_mixed.sh +++ b/infra/scripts/test_ubuntu_runtime_mixed.sh @@ -9,6 +9,29 @@ CheckTestPrepared TEST_ARCH=$(uname -m | tr '[:upper:]' '[:lower:]') TEST_OS="linux" +# nnfw_api_gtest +# NOTE: This test is run here as it does not depend on BACKEND or EXECUTOR + +# This test requires test model installation +pushd ${ROOT_PATH} > /dev/null +echo +echo "==== Run nnfw_api_gtest begin ====" +echo +NNFW_API_TEST_MODEL_INSTALLER=tests/scripts/nnfw_api_gtest/install_nnfw_api_gtest_nnpackages.sh +TEST_BIN=Product/out/unittest_standalone/nnfw_api_gtest +$NNFW_API_TEST_MODEL_INSTALLER --install-dir ${TEST_BIN}_models +${TEST_BIN} +echo +echo "==== Run nnfw_api_gtest end ====" +echo +popd > /dev/null + +Product/out/unittest_standalone/test_compute +Product/out/unittest_standalone/test_onert +Product/out/unittest_standalone/test_onert_backend_cpu_common +Product/out/unittest_standalone/test_onert_frontend_nnapi +Product/out/unittest_standalone/tflite_test + pushd ${ROOT_PATH} # NOTE Fixed backend assignment by type of operation @@ -28,6 +51,15 @@ for BACKEND in "${BACKENDS[@]:1}"; do done popd > /dev/null +# Fail on NCHW layout (acl_cl, acl_neon) +# TODO Fix bug +echo "GeneratedTests.*weights_as_inputs*" >> $SKIPLIST_PREFIX.union +echo "GeneratedTests.logical_or_broadcast_4D_2D_nnfw" >> $SKIPLIST_PREFIX.union +echo "GeneratedTests.mean" >> $SKIPLIST_PREFIX.union +echo "GeneratedTests.add_broadcast_4D_2D_after_nops_float_nnfw" >> $SKIPLIST_PREFIX.union +echo "GeneratedTests.argmax_*" >> $SKIPLIST_PREFIX.union +echo "GeneratedTests.squeeze_relaxed" >> $SKIPLIST_PREFIX.union + # Run the test export OP_BACKEND_Conv2D="cpu" export OP_BACKEND_MaxPool2D="acl_cl" diff --git a/infra/scripts/tizen_xu4_test.sh b/infra/scripts/tizen_xu4_test.sh index 6a479b7..5521b5f 100755 --- a/infra/scripts/tizen_xu4_test.sh +++ b/infra/scripts/tizen_xu4_test.sh @@ -8,11 +8,40 @@ fi function Usage() { - echo "Usage: ./tizen_xu4_test.sh --rpm-dir=path/to/rpm-dir --unittest --verification" - echo "Usage: ./tizen_xu4_test.sh --test-suite-path=path/to/test-suite.tar.gz --unittest --verification" - echo "--rpm-dir : directory containing nnfw.rpm and nnfw-test.rpm" - echo "--test-suite-path : filepath to test-suite.tar.gz" - echo "--gcov-dir : directory to save gcov files" + echo "Usage: ./tizen_xu4_test.sh" + echo "Usage: ./tizen_xu4_test.sh --rpm-dir=path/to/rpm-dir" + echo "Usage: ./tizen_xu4_test.sh --test-suite-path=path/to/test-suite.tar.gz" + echo "Usage: ./tizen_xu4_test.sh --skip-install-model" + echo "" + echo "--rpm-dir

: directory containing nnfw.rpm and nnfw-test.rpm" + echo "--test-suite-path : filepath to test-suite.tar.gz" + echo "--skip-install-model : skip install downloaded model" + echo "--gcov-dir : directory to save gcov files" +} + +function install_model() +{ + # download tflite model files + pushd $HOST_HOME + tests/scripts/framework/run_test.sh --download=on + # TODO Since this command removes model file(.zip), + # We must always download the file unlike model file(.tflite). + # Because caching applies only to tflite file. + find tests -name "*.zip" -exec rm {} \; + tar -zcf cache.tar.gz tests/scripts/framework/cache + $SDB_CMD push cache.tar.gz $TEST_ROOT/. + rm -rf cache.tar.gz + $SDB_CMD shell tar -zxf $TEST_ROOT/cache.tar.gz -C $TEST_ROOT + + # download api test model file for nnfw_api_gtest + MODEL_CACHE_DIR=$(mktemp -d) + tests/scripts/nnfw_api_gtest/install_nnfw_api_gtest_nnpackages.sh --install-dir $MODEL_CACHE_DIR + tar -zcf $MODEL_CACHE_DIR/api_model_test.tar.gz -C $MODEL_CACHE_DIR . + $SDB_CMD push $MODEL_CACHE_DIR/api_model_test.tar.gz $TEST_ROOT/Product/out/unittest_standalone/nnfw_api_gtest_models/ + $SDB_CMD shell tar -zxf $TEST_ROOT/Product/out/unittest_standalone/nnfw_api_gtest_models/api_model_test.tar.gz \ + -C $TEST_ROOT/Product/out/unittest_standalone/nnfw_api_gtest_models/ + rm -rf $MODEL_CACHE_DIR + popd } @@ -28,15 +57,6 @@ function prepare_rpm_test() $SDB_CMD push $file $TEST_ROOT $SDB_CMD shell rpm -Uvh $TEST_ROOT/$(basename $file) --force --nodeps done - - # download tflite model files - pushd $HOST_HOME - tests/scripts/framework/run_test.sh --download=on - find tests -name "*.zip" -exec rm {} \; - tar -zcf cache.tar.gz tests/scripts/framework/cache - $SDB_CMD push cache.tar.gz $TEST_ROOT/. - rm -rf cache.tar.gz - $SDB_CMD shell tar -zxf $TEST_ROOT/cache.tar.gz -C $TEST_ROOT } function prepare_suite_test() @@ -49,18 +69,9 @@ function prepare_suite_test() # install test-suite $SDB_CMD push $TEST_SUITE_PATH $TEST_ROOT/$(basename $TEST_SUITE_PATH) $SDB_CMD shell tar -zxf $TEST_ROOT/$(basename $TEST_SUITE_PATH) -C $TEST_ROOT - - # download tflite model files - pushd $HOST_HOME - tests/scripts/framework/run_test.sh --download=on - find tests -name "*.zip" -exec rm {} \; - tar -zcf cache.tar.gz tests/scripts/framework/cache - $SDB_CMD push cache.tar.gz $TEST_ROOT/. - rm -rf cache.tar.gz - $SDB_CMD shell tar -zxf $TEST_ROOT/cache.tar.gz -C $TEST_ROOT } - +INSTALL_MODEL="1" # Parse command argv for i in "$@" do @@ -72,9 +83,20 @@ do --rpm-dir=*) RPM_DIR=${i#*=} ;; + --rpm-dir) + RPM_DIR="$2" + shift + ;; --test-suite-path=*) TEST_SUITE_PATH=${i#*=} ;; + --test-suite-path) + RPM_DIR="$2" + shift + ;; + --skip-install-model) + INSTALL_MODEL="0" + ;; --gcov-dir=*) GCOV_DIR=${i#*=} ;; @@ -109,22 +131,27 @@ SCRIPT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" ROOT=$SCRIPT_ROOT/../ if [ -z "$RPM_DIR" ] && [ -z "$TEST_SUITE_PATH" ]; then - echo "Please provide --rpm-dir or --test-suite-path" - exit 255 + echo "======= Skip install runtime =======" fi if [ ! -z "$RPM_DIR" ]; then prepare_rpm_test -else +elif [ ! -z "$TEST_SUITE_PATH" ]; then prepare_suite_test fi +if [ $INSTALL_MODEL = "1" ]; then + install_model +else + echo "======= Skip install model =======" +fi + if [ -z "${GCOV_DIR}" ]; then ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --backend acl_cl --tflite-loader" ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --backend acl_neon" ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --backend cpu" ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime_mixed.sh" - ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime_interp.sh" + ${SDB_CMD} shell /bin/bash -c "IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --interp" else mkdir -p ${GCOV_DIR} rm -rf ${GCOV_DIR}/* @@ -140,7 +167,7 @@ else ${SDB_CMD} shell /bin/bash -c "GCOV_PREFIX_STRIP=${GCOV_PREFIX_STRIP} IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --backend acl_neon" ${SDB_CMD} shell /bin/bash -c "GCOV_PREFIX_STRIP=${GCOV_PREFIX_STRIP} IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --backend cpu" ${SDB_CMD} shell /bin/bash -c "GCOV_PREFIX_STRIP=${GCOV_PREFIX_STRIP} IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime_mixed.sh" - ${SDB_CMD} shell /bin/bash -c "GCOV_PREFIX_STRIP=${GCOV_PREFIX_STRIP} IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime_interp.sh" + ${SDB_CMD} shell /bin/bash -c "GCOV_PREFIX_STRIP=${GCOV_PREFIX_STRIP} IGNORE_MD5=1 ${TEST_ROOT}/infra/scripts/test_ubuntu_runtime.sh --interp" # More test to check coverage ${SDB_CMD} shell "rm -rf ${GCOV_DATA_PATH} && mkdir -p ${GCOV_DATA_PATH}" diff --git a/infra/scripts/unittest_compiler_xml.sh b/infra/scripts/unittest_compiler_xml.sh new file mode 100755 index 0000000..46d3bc8 --- /dev/null +++ b/infra/scripts/unittest_compiler_xml.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "Please don't source ${BASH_SOURCE[0]}, execute it" && return + +set -eo pipefail + +CURRENT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_PATH="$CURRENT_PATH/../../" +NNCC_WORKSPACE=${NNCC_WORKSPACE:-${ROOT_PATH}build} +UNITTEST_REPORT_DIR=${NNCC_WORKSPACE}/unittest_compiler_xml + +for i in "$@" +do + case $i in + --reportdir=*) + UNITTEST_REPORT_DIR=${i#*=} + ;; + esac + shift +done + +if [ ! -e "$UNITTEST_REPORT_DIR" ]; then + mkdir -p $UNITTEST_REPORT_DIR +fi + +for TEST_BIN in `find ${NNCC_WORKSPACE}/compiler -type f -executable -name *_test`; do + TEST_NAME="$(basename -- $TEST_BIN)" + LUGI_LOG=999 $TEST_BIN --gtest_output="xml:$UNITTEST_REPORT_DIR/$TEST_NAME.xml" +done diff --git a/logo/ONE_logo_guideline_ENG.pdf b/logo/ONE_logo_guideline_ENG.pdf new file mode 100644 index 0000000..5d673e9 --- /dev/null +++ b/logo/ONE_logo_guideline_ENG.pdf @@ -0,0 +1,14557 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[14 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + One_Guideline_Eng_out + + + 2020-07-05T21:17:27+09:00 + 2020-07-05T21:17:27+09:00 + 2020-07-05T21:17:27+09:00 + Adobe Illustrator 24.2 (Macintosh) + + + + 256 + 252 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA/AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5j9dvf8Alok/4Nv6513C Hn+OXe767e/8tEn/AAbf1x4QvHLvd9dvf+WiT/g2/rjwheOXe767e/8ALRJ/wbf1x4QvHLvd9dvf +WiT/g2/rjwheOXe+3/JhJ8n6ESak6faEk/8YEzlc31n3l30OQTjK2TsVdirsVWyf3bfI/qxVjFl q1zP5hu7H63ZvBbj/eVVkS7QgKatyPFl+Lqow0qeyXtrY6dcXt3IIrW1R5riU1okca8nY032UVxA JNBBNJI/5neQI0V5NdtYlcVX1H4E9+jAHLhpsh/hLE5YjmVn/K1fy4/6mKx/5HLh/KZf5pY+PDvC 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 + + + + uuid:cc23420d-cfa0-4048-8ec3-e93391de27a3 + xmp.did:41088a11-c76a-4444-87ef-0c57f8bb2890 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:dd88e333-1877-4ff3-b48e-839197b495ac + xmp.did:dd88e333-1877-4ff3-b48e-839197b495ac + uuid:5D20892493BFDB11914A8590D31508C8 + default + + + + + saved + xmp.iid:b37e520a-e346-40d3-9f2d-d0bb16169f23 + 2020-05-08T12:19:34+09:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + saved + xmp.iid:41088a11-c76a-4444-87ef-0c57f8bb2890 + 2020-07-05T21:17:25+09:00 + Adobe Illustrator 24.2 (Macintosh) + / + + + + Print + Adobe Illustrator + False + True + 1 + + 297.000083 + 210.001556 + Millimeters + + + + Black + PANTONE 286 C + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + 오시선 + SPOT + 100.000000 + CMYK + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + PANTONE 1495 C + SPOT + 100.000000 + LAB + 73.333298 + 43 + 75 + + + PANTONE Black 7 C + SPOT + 100.000000 + LAB + 23.921568 + 1 + 2 + + + PANTONE 408 C + SPOT + 100.000000 + LAB + 59.215687 + 4 + 4 + + + PANTONE Warm Gray 8 C + SPOT + 100.000000 + LAB + 55.294117 + 3 + 6 + + + PANTONE 409 C + SPOT + 100.000000 + LAB + 51.764706 + 5 + 4 + + + PANTONE 3165 C + SPOT + 100.000000 + LAB + 27.843138 + -30 + -16 + + + PANTONE 7715 C + SPOT + 100.000000 + LAB + 35.294117 + -32 + -14 + + + PANTONE 7470 C + SPOT + 100.000000 + LAB + 32.941177 + -23 + -22 + + + PANTONE 5473 C + SPOT + 100.000000 + LAB + 35.294117 + -21 + -13 + + + PANTONE 2238 C + SPOT + 100.000000 + LAB + 38.039215 + -33 + -19 + + + PANTONE 165 C + SPOT + 100.000000 + LAB + 64.705879 + 59 + 68 + + + PANTONE 286 C + SPOT + 100.000000 + LAB + 22.745098 + 17 + -68 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 15.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 10 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 53 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 11 0 obj <>/Resources<>/ExtGState<>/Properties<>/Shading<>>>/Thumb 57 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 12 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 64 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 13 0 obj <>/Resources<>/ExtGState<>/Properties<>/Shading<>>>/Thumb 97 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 18 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 100 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 19 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 103 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 101 0 obj <>stream +H‰Ò÷wVÐ÷u6PprqVàÒw6PH.V0TP(NÎãÒwrӋ¹  ,L õ,,L-MõŒ,ŠR¹Ò¸\}Z áR endstream endobj 102 0 obj <> endobj 103 0 obj <>stream +8;Z]^_$L)a&-KcCrTq:&HVfelAfqg>=YmB*NDg1\HW endstream endobj 104 0 obj [/Indexed/DeviceRGB 255 105 0 R] endobj 105 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 14 0 obj <> endobj 106 0 obj [/View/Design] endobj 107 0 obj <>>> endobj 24 0 obj <> endobj 23 0 obj [/Separation/PANTONE#20286#20C 108 0 R<>] endobj 108 0 obj [/Lab<>] endobj 22 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 24.2.0 %%For: (Jiyoon NamKoong) () %%Title: (One_Guideline_Eng_out.ai) %%CreationDate: 2020. 7. 5. 오후 9:17 %%Canvassize: 16383 %%BoundingBox: -4069 -4495 1475 947 %%HiResBoundingBox: -4068.6179436713 -4494.28356125641 1474.70925772807 946.368022105353 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 490 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 286 C) %%CMYKCustomColor: 1 0 0 0 (오시선) %%RGBCustomColor: 1 0.567022800445557 0.098382867872715 (PANTONE 1495 C) %%+ 1 0.404500633478165 0.111767180263996 (PANTONE 165 C) %%+ 0 0.406133115291595 0.466832518577576 (PANTONE 2238 C) %%+ 0 0.198311477899551 0.62525200843811 (PANTONE 286 C) %%+ 0 0.304029136896133 0.350257307291031 (PANTONE 3165 C) %%+ 0.59317022562027 0.546718776226044 0.529767155647278 (PANTONE 408 C) %%+ 0.523893117904663 0.469946950674057 0.455934256315231 (PANTONE 409 C) %%+ 0.010559288784862 0.3623086810112 0.403027504682541 (PANTONE 5473 C) %%+ 0 0.344449251890183 0.4366435110569 (PANTONE 7470 C) %%+ 0 0.377213388681412 0.40836700797081 (PANTONE 7715 C) %%+ 0.232144340872765 0.220090985298157 0.210716724395752 (PANTONE Black 7 C) %%+ 0.550409376621246 0.509278178215027 0.476847052574158 (PANTONE Warm Gray 8 C) %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: -1194.48131340839 327.36 -352.591313408391 922.64 %AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 %AI3_TileBox: -1180.36333977558 341.673000335693 -366.709287041203 908.327026367188 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 1 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -1312.55269144792 830.740349052836 2.56924177649558 1668 954 18 1 0 6 43 0 0 0 1 1 0 1 1 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:115 -694 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 111 0 obj <>stream +%AI24_ZStandard_Data(µ/ýX,åžVÅO < o€€ oaA‘g%H&jÉ Òô†ØXÜf³á½÷ü€Ñ{ï½õÖFŒœnj€X : +9 +¥ÈHaù¨>“Sˆ–~9,X#å×­&2‘ f­W¨Öæý4£’&’žæ`kéÐphÀ¡á°1ZÙö›¼RY’'“]ZaO€ü¿q•cÉ_YuYæ*¶j;eV±,!œûòˆ°d¥•Ì’[âØ+#ùÚ¬†æËAO™2rJ²e)D›Cá ¦+u%u‰w¾Ü4ûP_ +KJ“V—–6ål³”¶§ eÉõeŒ.˜%yFÂ˺»™CÃÑBXÆ¡áx€CÃQ‡†cpx¨@!X Ð  @X@*\¸ ©CÁ  .PÈ0Â"  ÀâÐpx@T€2¸i™’! +A@@rh8Bph8¨‚ŒCÃáó«æ՛’hrhÕ±$|‹o1K¶¤êðt74+W%ÇH PáBç¸`(l€Öc)—928œxr"G6¥h½R&m[zäˆ]ÉO©Y‹9i+C^ds0DZ8 J`‰‘x.z E)¬«j˜ac’?òŽ³cÈ8¨@äã(:G³ˆÊ ±ù¬zV«—VEŸÆP îãŽ#ˌCQEñijÃtx,Ž¢9è0j0ŠD>kǑ@¼¨Ô2´§=c7eHeåÔZŸe¶ìúÜþÍì`,‰Ä+:’ŽDÑÁHŒEâH<«ƒ†ÅV´Pw, Ĺ8×@k$î(»ÁX(ˆãY™Ú`X­…åÌΦëÆc›a!Ž ÕxM«V–!ÕÂWR>Œa‹Öwdpqdp%Ό!Qµ"q$µZÓ9éÀW1ˆãYêbªrÆ)‡FeHi?28†Ìf¢2X†ueȱ>É$,¦&âÍÝrdÀ8 +ďijÒG¢£W:†–ö1¥²Ã<â¨+Œcȗ­:°²xPâP0Ž±Ã×åܛˆÇR:œ³Ûé…ÇÐgM¼ªKmjÌÒÊP(Œ <2ÆqÇï÷ã0H(ÿ”‡Ëóˆ„bÑ@4SrÙa>‘8ŠDbJ.;TTk/b9Ïe©É+ª]qU4rÂ)G¨ÌqR“’ょ ,t@a4pa‚ááƒ6 I—å9%‰èæ¶,wU—µ2¤T‡%Ó®ŒeHeçeˆ™¦Ìqcq(ˆ'ž5ÊÔi4 FcÁX0 #ÁH Gc˜ÛX$žÙ‡m*ƒ +J$!!™‰tà"¹¸b±`,CÅ°c`2~  F‚¡`0Ó(5\ ÃF¾H4‹ã ãpq(‰#ƒ9 pe‹ã¸ Œ 9.ÀC$`x€õÌL•!Yzà˜£ÊYæ¸ ؀t`CÇ8Eè",AwªÍ"“!§þss·VÍÔÌpNH-CÒu¬™ê,CJ‡Ž™§Ææ'烘Ä(f1ŒiÌ1m©nÕzÅf_DUtQF*™ŠŒŽ’NJ‚Ä k²]6ŸÑGúF8a…f¸á©•«Êê ++녨D)jQŒjÔXÌVfv†–vCX¶0†5ì˜ëÑùêìîðò~ˆKœâÇ¸Æ  …†‡ˆ‰G&P d`'›”ÎJËKÌ#ó‰ÈD*r‘Œl伧ûuûŸÿO\ñÅo|EˆBâˆHÄD¡@, DqL¢ J8Q K\™x‘H$‰E‚‘h$FQ)¬(…)NŠT\P$ +ÅBÁP4³è‚^Ô·Àő‹/‹ÄB±X,‹ÆbeÌbãÈHÆF‚¡`, Fƒ16¨áF5¬q ldã D#ÑP4 F£Ñ8“@?ÐìðAjô`,‰ã‰w”©9Œ…"q žxsX™Š‡ â¨ôqc€£Ñ`4 E#Ñ@4ÞÈ6®aj¸A6¦q4 Ƃ¡`$ÆÉ@Æ1ŒQ 3ˆQÆ0 Æb±P, Äâ‹\àⶨ…´èb C±P( BqE*TœÂ¥°‚UŒ¢‘`$ E"‘@$žÈ&.a‰J8A‰&&Ñ@0 „‘@ G$‡0D!Œ Dƒ8g|qÅGüÏãïöºOïçdä"™HD>31/-+”ÍÉ2p +L ‰â¡a¡‘°8Ø8Æ-Nq‰CÜ/ïήÎGכkæ°„!얆vfVf#«bÔ¢•(D½²°®¬ª\T­©†^XᄾÓè³¹l“ëqƒ´ %A§¤éȨÈDTj”ÑEMÑ7‹½Z«.µ6†1‹QLbóÉÁ¹±©ñÐtfŽ ~,0‰„™„„CñÁ”Œ‘#3Ç ‡2G $‘!Ç&<`Á‚, d°ð@ `!A舁 ۀ\ðð„ l@8°…<¸ xÈ@!„ †,PÐÀ2HÐàÁ*€ + ØÀ„ >°† (pÀ (là : P¡‚E ˆ È A ° A… "Pᅐ €†Áð!ƒ„ ¸PáÁ`¸ ‡…äò€AB…ÆPP(L€!ÄrA† ÈÀ" €áB† °à¸  ø „ `B!TÐÀ!pt`B 0h`á‚>!ÃÃ\¨pƒ(tðhh8@È`áÁ.(8°Àhh86h@™i€Âjá!C O¢á jZúÐÛɒ„ +à€¿ÄZ ,P耆x@]䲤ì$ïJÒìuˆ-úY!rN²yy +Ë8 «ú#³Bu#LàB,<|ð‡cxx‚2C.€ð `J¨Ð ‚A….4à$LØà¡ àP”DÃQ‚(X†‡ +!@`¦jƒ .8€`ð +xÈ,žÉ%çÄC­Á¤–;G þ™=3Æ+-“4C¼ís™l#T `%Oˆ•R=dPá"PWˆNz+dŽ@ÎÉäÎ)×Í*õ6Á„`àÁ0\€ (Pèà° ƒ$!€áÄ (`-4²ÁÊòRbéceÈ•îП³‚„ í.Â+N©y²ü|† sÊU%S±"æàqÏYÍË´Kˆ.C 6­¹îœg^Uå2ÄXVFy5†4¦vš—c:—!tY‰™t³é”O‘ÕgT¾YMáýê÷]ͱõÓd%§ ë̊‡'+Cªæˆ1‹WV†  Ö·bOO8F£1—!vïyîijܦ+gÈÈèʐšý‰X­ó-C&M„†hY#ç]Ýz²ÖîÍÝï£ÉâaÛ2Ä®‰eߌÕTR"{Պ„‰—”ÎO‚fV5“Dƒg%q44 `*8 T‚¨À‚!%,À PK" < @h`2€‚b t`B† õ—Á’Oµ½ÛšX»ûÜVÈŪٗ±Îô^V#ÌÒݚW^õ•UI:‡¤ñèI'c^]ŸÞ˚÷½:wo_¥œ·ó½È²¸ÚëÝ˞X¿Ädˆ¯W5K¾˜™ç’/Ù]Hå^rˬÚéíËìeÙrØ»–_ÌZS^Ý~5.½ºÛ Ka«8¶ÛËZ½Ð/†Í)i¶šóŠSªZæBº×± +V©÷!«b+å3íí`¡«é˜t7ÕËUəµ-㬺yw­å¨‡Vy/J¢¡º –Vç5u¯Ö…ªµûN÷+T%¦¼Þ=‰^ì§Çð~æ+IEIx÷¹ÁR“*ÕÕ=}/w­+GHÅ»º8~Õ ïIx%© }~ÅL›ºrUÄÌ׬Q3ëdVU„ŸÄ©¼¦+«dÖ)]ï›/câ–#=#2ž.otUƒ™è,Tºû`Q]–<·—ª˜fx³)D‡éæ˳ðͶ µçò.©ž‚”÷÷t¾k-ÇZ£Ì<µPÍ\vvµåÍÎK÷-%³)YæÓþ•©Ù~ΒÑÝõ—äyÁšåá/]K÷8˜W¬Òڙ¬˜5ZÉ1ª0+³¥ÆÊSU˜„4_i˜EæÒW^ö„+_™‹ÒîÉ-I6U—S…ålvšÏ™=ɾ¼vJË\ÓÕåef1›ýãË|_Zvf&Zæ•:³Kû%þx–F{1íf¿}s5;*OZÏZG4˺g´ÃbYÚ?ÅÐòN–6šBiss‰åžÃ£e;TèìîK˛¡ÙM³gi7.?3Có¬ûåÎ虽Ì)–+Kt½\æ¬è,}7ågV³DË;^¡³j¯—5͂e½!֗tYfY¨ÌigºlQ–*sh8<ðqs.oðeÌ~YsC³»)´³*uf£}³ÖýèÒ¬V\VF»2¶r¦•×|—6T¨VÌ»Où˜¯uƒYuS¨†øÒ`ºŒÅµ«_š–«¹eSL««L­jˆ²Ø˜Í¯à˜Q5Dz¨\­wY{ÊبK—ø´beGĖ] Ó2Ç-7#ç^°ìænlU6ýeÕÐd¿#3»/'q +•%åÌ%õ²Øšµ¬B³×]-Íق™'²´´ªË#¢Ò›ùl<6#´ÝÏzh5G²¬$,”Å´YöU…ðêú±¬|ÑÕ[.˜6KçY¡[–’%ݼPÚ¡õ6ÅWRÍKݲ¬•e3ñ\VRf¥½L‘ÌË¿²GY|;rvwdó·Ê1*w« ¦çUIX/.æ9rwX†:Ø[©|•{¤Ž¬ ‘VΓÊôz\‰u¯Ìb‹Ý|r“¥œ9òI—Dr—S*¿l!ºËª´ÇfÍ¥ùkBW‘»<·…LŒJڔ)R÷¯e¶ØÄ4Åtb]•´UKš\ÞÖBºB&EšÊ+³B>‘ºlÓi7Y¦’*KÉËl9ÉgÌ,HäðÇYW-ƒGÒª˜ˆ3/³ +•–³™Åˆ/')'±Ðtʤ{1<¼’Îqæ1õ°8ã$R+%ÚeùR#§ºfé‘ü›ä¤&–Þ‘ÿ®òŠO^ô•31­”©B*srfö:íŽdÇ¥’œò|T +‰[¯Ì µNYE*†GL¦$ü­à”P–vX%í*o²ø¢¹Ò–œûiåÜSNçÐpt° =«CÃB(Pr䈃 +:±è|«O“‰TYŒÕRVBάfþŠÞ±÷B¢R+)=1ëGåX$±DsÏ^´’â;‰é´,”õ,š{•¹ Mâamˆ‡˜I¥RY¤ð²ìE»’Xbºa6­¥¯ß¦Š¾3]šEŠ\TöDj©ÕfŽ¯Ô‹xÒ(í6S±+¡¹3ä¢zå]ÝÞ±*s%ÇôyÔ)Ì¡ý[~%YDY˜Vµb¯);^±4K(}'Ì!ÌBƒ>Q9äÁ)}‘C4,*Yݘ„ù’/’g«²gÊdIþèÅS¾áaÁ+1&á4swM%­ÄÇ,ÂL3,5F²ªÞ»Q]+¹:z1+ñå¦lê{^ÍÝ]Aªðìú[Š°Å²—‘ª²:š^®DnÜ_¦Õ”ìﱫŸKK$_¾D—­ŽCä,qÆ%ͺ¯gÚ¥C„ K™0Ç~EBy«³•<#–W“u:»bCäígi2•;#øœ[}ޖ*œ¢¦õ&rý®7¥D$‰È½³—,#yvFõ²3}‰8Vn«Ö;w¶Ù‘Ófß·©–)"<²K¼—3‘×–vYï”fÚ%Ѽ̤“ê6¤rDä¾Í.¯G…lÄüò´t|wi× ’C*š:fY9J"¼ì¡ÃORúUu©"bwŒXï×ä£áñ +¹Öºa­Ô”—þ\)µ“亍¬ÁKrä,£9mh°øhNYÿ|HeßGV|TVìžY>=]ΗAs}º±iîšúç:ûêgÍO<–³Tô‰6úÆ!;tý™ªBU²WQµZ—ûT׺×Æ>í+D»zeF>««XºWÏèÊ2Ѭ ›gî³uf…s7ëmÎNˆXêZ¦A›éªçê”M¢#šº#·s¼«]-¼wþ’4¾³­lZîڬʙܚI;³]ºMºº©æPµî­¾%×µZwՒ¯÷Z©Íž‹\[ËZ'&Í¡5ýÒÕÎîf½þèú^;cvû”ZæZså¬vˆV³¥ï¥fXÎK¡CÃáÁÍÑ›X¬šH‰ä‚Õt•èÞj«Ð7åËÝoÑ==S/3œP*cª]/"»êC/«[ɡᰀÝè>ìü94ÈMQ ççò¢ËÖe–•©Ò¯µèS4xtu+ÂB%(>i ‡,0a*KË¡áð@[ÊZNáB˜S.®©¥=ZÁ9*wY)œ´ñNÛ,Ê*Uù¬bg9f¥ð +_§Ôe«ÒQ)"å¯ÜµÎRG~ét«¢i•3#Ñ«4ÍÓ2¯¦FOû§Tìe4Åï½8xk퉿¿½ñýŽW*Cͺ²M±v9VòôòŠzÇJsNŸy¦ûM¾æ¬XmÐì#{±%ª²£<£þs¿¡R‡°ð3ýàüNtW›ê×ÒÁs¶äÔÙ¥¦m MƒØ–°ÏcëŠ]ªØá ‹Ïh*·ó”Ú…®p®üŽ^/yÌvnÔ9Q«ð:_c¥xt;ºCTp +)‘^骪ÞOT6Õ"›Þ© ‡¢”˜wËÉbTc¡ïiVuS5½Xõ~nᔯª¿³:_ýîeÅÂW³l76dÏ¡õ˜wù»l¢ÝÕYW|­D,ºgõY“hÕ;YÝAÊÞUO:44ºÃë”Mo°Ê‡Ú²ÚûNÖZ›eëÅú‡l®§]ËT%të&Ä,69o¨ND.'ºI;×M„Gsª×;åˆêÉ¢ºûÊ1¶Æd£*HÔÖ¹êCô)ևάSh;eÉ°‡Æ),¥ÌžáX½‰i4vÏԕ˦֗¾G†XœÌ³æ•Á^RßžÊWæá§~öÁÍLÙ)KYeÏÞªfGì ó^~½­sG+•Ù¨Œy=Ì1;b+³ÈÞªk²iC¬­^z3—ÅC>ÎKdÙÞüêS*+f?S<4Svõ)]i©^úxÐ'š*YT;ÂBEtßÑåK¦$"ú¼iU"*2¬,ÙíҔõcge¥É+¬ãÖ%V½è¬d ‰|c­×TDõÊ4;4œˆn»³vú•³_ÝTÚHwbST§£¡¢Ç~o%ÚPËR=+±ùS•ý2?ä“ÏÛ7Ñìƒ.j¶èuv+¢BØ29}k]rﶚϷ¹æM%½YÅ®IVFšê}0±õeCã*ËòꯇuxöbÓ%3»ó¦Öǒ¯CÃáAëöÊúÑd9Q‰ ‹îUþ–}lUš)†=º;{±®ëÙm²bìñ/K,ÖŽï µØÃúCá¸V¹¡£a=±7aÖq¨/ꝟVê õ\²^Õê—tCϪWÕ¡YÝJF6wˆ®Þ#$2%ÑÕ©Iå†ðç˺‡È¨6»9Vï Ë^óÓyu¨Æ–eðW<Ôºë9„˜•V%j«]ÄÖ +ÖÐ\•é,»±"COõ|ˆõf©F§a4"=º–»Îáä”UÜ$ Oå|dña3›v§b6Œ@z.Ë£'aq,¹Ì«Z ‰îU˜y<S]óxŸ³Q+möQK-ŽœÕ,¿æ)iô«û|#¢Z˺+sä2J²!]$Ÿ½åÓe•9zÑÔü3ªá _dFUÑ?»•,J#+Jߚ-XÔr–ªð§¢REº ‹~ý‡½§¨y3ºlêf2ÓooÉd4ÕsJ…p 2Hxøà $ ði9¥c'|ù¦à8«žåó|ó|U<ÕWYÜÿiÅç\ª]«¥JeD,âà­|–²oåƳåÑuh²J«ÄÖҟ–§ö¯j˜µœI+—¶]˹WÉÄñgÌƲ7Wª±Dì¬üÝ=¿2n¾êFlñȯ»Íï‰e…ìgÍùõÌß¼˜š•ø“ÏxÍrãôʔYi5‚6ϼÔÈòÔ;ûܨ}%Þúû N¯úÓreï*qZ¥=‡†£W²¼±Ì*w‡V.ëÒ<ìÍæ\çS–jҙyÙ«Ú2v:3,H¥m”ïÜsHÌ9¯š- ú—7‹@òü#¢ó¦%)¡2^Æiá?“‚=má!Ú9C­›y±½õl¥õŒä‹~gg¡ç‘Œè#^•+ªMïcmJ§Œ–u|R«ìtgIµ<#4™t—³Ð ÍÒ§3‘7j4×BEÄ7“­Ÿî¾¾* í™t™ì¬X-†6U5OëC­b)—--Çv•µ^w_¬%Þ½\¾ù–›êÙS}ÌnMüØÓ]ç‡æ¹z«\ÇÊ,&"8C˲¼â3r=ÕÔy™s/SXæL]ҐãÛ "qY¾i²#]«Ø½À¹Ä„RèÒߥRÇÞ3ãÂA2+?æ‹ýnD……†Øm|sªØäkY<šª´¶‰ðS}ùÛȄǗ•YÚ_Ï*¡ö¨X\«ï[k_ö,nÍlhžfV˜õ‹fË£Ù2ÑÊie†æÁ²¥&YÚ܅Ò>IC–s…ÅҜæ$+”VûŒ2ý’YµË,˜hfš´L{³Ðïg6fFu2+ó‡y‡ž|֍˜ÑgwM9—`%±ü9v钬ÖÝê°Ôf*Ú½°˜KLg…•èÊ;ùrò~t”uH%IÖÂÊ´—{x**åÕM›ƒ†…GÊ3*I¬}•9G^Ä˾x•×ÃrC¿RIÕ¼¨Æ)æÝTrguˆøAj’ÍÙQI94p ¶/Å¿x„©—óÛÎJ’Õ ½*S˜•®’¯—sŒé¼ Ù%óZ+3œüeï\¬–Ùcº¼GîTØ;ªú]Jº•fí¯ÄºÎÌÕÝ XN¿ò°4†ï Ue½ŽeÅú‡È ǚev¿¡*v~/³©~–ûGŒ–h/˜“CH9÷'Íœ)³É+}ð¾i±–Ø)iðX¾‚-¹û«Nô ÇîÈYu: XÀ*oô]¥mü3%¾>eÞÉ*ÍòSuâÿ§(§Zå~öéÔJ¶fÊLº’?£DÖù•üIš¼›sê²óvpú÷ӆMS׍èêSC…ÚÓ<ë†G…†,iîµk†Ø² ¾„ +›X¯:+7THw½DUY«_}Xª}z-~q°Yþ¯uV¤[én>ö4»Ô‹gi¯c;Ý:-øÖ.mB›1|ÉY·•B›+šuÂÉ"Âz§/9æüeù«W­¢ÃºzKŒÛ ݧpÊ_Kú½þþÅ+½Þ¡³±gÞ{IM™—¦†ì–•åYì?dö^²£±ª^mË.& KY×9qèvŸåÐND®ÊÓ]NG@{+ƒƒŽpg̬[é¨dF 7廙‰ÙþéòÔèi‡Y„§DÂO•}3VñÑë¿ÙF§k™OE”DX¾rÚlF?*ž_DVÆ(Ñsô­èزÙèj®òo”tEþÑOŸg™£J›|<úõª.RùQQ™Ç7½>Õ[)éèӏdXð¨§IÊ֟-ϓ’z'¢)“~ºém6¤£³«Ù¼NwgVl³¨yh³ºo¹Y2I2LªªÑ.N±¶Ûª·ÉˆFl"]\Ô¡¼Ñ(qè¥÷\x»yQ^éžg®CʙRfæÌUáÜZ-t‰Æe6‰×²ñ\Tiˆ9µº¢’'¢²é˜XÞósdJ[5-çŽýQž‰é="—87tɕu¥SYËÔ¥Û4V3ÖRzj(ÈCV7‹0ûc{Ërk>®#›ª ϨÎãÐ]“›á˜ž5vgÿÐ)I„cDúMïáWÝ;?2*u´e•©Ã9Þø,¾/%]–3"ÿ¹Yã-yùT‡„聤‘h(票Èn_됼>|iÈËFtÕ_"¡§84“ÿéÔ¶S΢æó°fжñ²ˆ]ËoñæÇñ­~1Aÿeæ¢ãi-D"‡fDLgÑirê0kLFrÒъÅI„*K†isÂN"¢³f^bNkH—Dìn7/קCDWåq f+ý†°LÏ®º™ÑçDh¬ ÖPf]U3Ï>¦S¡3ç&=œÌôÌå[C7lYi­Ø¼LgµÜjÒsHI­ÌC<$L¢Ê´:M)›ÄÊ<+Ãóøv"XwˬձŽv–Å2Fu<ô۔Ì'‘ó­›êî9E™Sœª»;!ÞùÏço?œ™g•û̯l +ñNóJ›×üp²?!b'mUf!CÄ¡4»Ì.h éHq²~X¨®þڒTf¤nDˆ¤yGŸ4¶tªç9÷®ïkòx-c¬ëíœ$;t«®ï‡X:N­Ïª©•åý\³MUߣ«§ÉJ6"ûäýœ7Ö:xÿºUHÍëTkE×µ ßcMé9s¾3Þ•Ê +3o-„®ÖQµ7źçٍ“¶RvlSèDÿ{–§ïÌÓôiî4Î1i*M‡'-Ð•çù¥1\s3B¬v°ÅdHnßMk÷Yª¢|É’¼Óž­Ï¼ZÇ)!ÒTZù.éI÷½Íü÷™"r •=yyBº) M.ªA›æ¸~GTÝœÚ\g¢r>½eMçm–ÉÇ¢^og¡r±Xq +±Êm+·{ýÍÙíͺX헦¶¡ë‡ü:û:„EòyèW¢bu§>Ö¸ôÖýÌÐÕU•×“ëÌUMÛY£–[óëªö9ëí6¥lWû1§ §6Û͹lèÏ %¦fÜgK¥çöž8dzoî´%ÞÜòS~¾WÞÜVôÙmÞ´DkhóiN1¢o +‘ákVl*Ÿ45Sß]ìnQïÇ»Å|ÎÔÌÇ}©Û-­ô=šՊ¥;Ç´K“®tuÈs§ktÓøgÚwcóIoÞÐUҍ²Å|w*tÂ$²9&¦ád9æLÃ2²ÉôÔ á„2|¹_¯™Cè’WÎck~¶¹ež¦M5Ÿã”+j +¢©z²æôæÑÕ˽ÎåCLtºTÖõ“Y¬r•^•Y«2ϊ¼°ØÕk•˜…ÕÒ¬^&aËa¡ÑJw…–…¬úú3ó®C"¢çQU¶—ٲ̲b++*ÛU9—TΌ2kÊRWV™èÌrV¾:;ʬ+Â+¿°™WŸ’WÖ)¿šLcM31ÕÌb‘ÌC·Ð•©2Óª2kä’VØ4«2W“eEp®vù*ª:›ò*Ÿé.KVçYᘕeŽUM¿L¬"2Ì´*:–tMÑ<í¬R®Ÿ‹¬T•±1³®f>ÍEæ̜³—V½ÒõLtÝòÙgfŸ4Eó©:¶Šªõ,Ÿ•·./ŸIEˆä>/ËT­)–ÞG³RS“¾ç´ædöt«xYrŠÜo=áÐ`ڝò‰t+4…O,̳eŸw/ÊìY‹[mÕòéK§2ËfüÊæsÒS·<*Xj>=UnŠØÓО‡¾B­<Ë,¥ºòþ¦ò¾º<͎æy–ÍÓTñóe¦ò9XÔÃÊg§f|'Q‰Œ:s§ïú§o;£¹éW,ݙû™L›þ{nÙÉ|Í¡i~¿É³!ÝÔ Îs•éUÓâqQKž¦ÐŠ^c{5Eã»ñD/ÎK ː‹|}™Ê,Ý'͔–ÝRï? –Éz¬¯˜]*Dî]z¶´îL)9ïjÚ9}ó²ùª¼ÜD"×e;³–m§ýåå2έΦöÍ'Ë ?õ ÏtÕ)“H·#Y:??ú³t›¹bŸ›éhW…ÆGï‰nlJÌ«¡bX~–'»ºÝí—Ý¥×+ƒvDåÛÓeŽ®å]ùT½’æg¶Š]¶þ¸UmHYÿ\®Úw“jW¾Q^I;^[:¦Q¡Ú6Ç·`}Sr©5QŽ©¾Éœ±¹ÞV²éuY²ÝÔ ÝlÂcéc (dá<aÂD"aéÀ 6 ¹ÀŽ`¡ýȔ/œCÛzó?)K5k›‚7¬X5dFêÛMuŽž–U¯Ð úÎæfû‰­c–›‘ žÕ¡ËåFÆIs™žÇl4›˜Y̐©üñµÌùyv©;,¬ùlnæ3Ÿ±”ežì¨TqHƒ‚œ:ÅBÈ$ € ˆD„’ùlX~xb:J4" ¢Á±m”„AeŒ!€™™@„Ú¬»mÊ¥D­£¼púËHç2FYfðèB4šæ‘‹'f–(ÎíÐFaJUÚø—Ç«QݺÛeY+r²?Ïõ*›“ñ"*÷þÍ­O´Qâåj°K<[-}4/ÐçrF¼5ÛBvnõ¾«Ãöušk +!ŸJâ $ÀýC¼^ÈRñò—©è— :þ!è£ÅÛV|î¥ÅôÖRâÝl]5Qv¶’y‡«5 o&Üa¾èÝ|;Càrç&ëv!L»öÜñêj»Åz-¢!BOÙVè- \åÞµlš_=ܪ('ˆ ÔÇÐ3§Qî¼&¦ 1–›Ñ(ö×­YUgþaþÙhc§¢èƒÝ¥BòPv¨ÇzËZ@P›ŠõÑF6K\èZ:¯Ê ©ÏÞë¹bTPdà.ÆôsV%J«ª#-qÀÚuî€ÕxŸ §,dZR[×»‡‘ ïmŽ¿Å¾»~ëOP0û=0«ø²Oì d§£,OØDéA9Æq?!øÐpºh´Š00­`£…ý#Ý=þ'vŠ ú–D}'΢pá/0òˆYCAß?µ ƨ­aàwÌ98#Ä\GPñÒ¥v +?òDpq„_¦;@ܸÙ)Ì3äKM®-8ßòžsI%Äû(™§v¯säÈ‘Ë Ã(]\hÙ yi#Tyß+su¡©²!¡Z¹z`Õ¿ªM»ëž@’ü"$ã4âã*Î>O^ +%eÖÇ©KÛ¶ïUÚ´•Ê/¢ `·¾Û^M–=‚Ø>¶ž©m?—2•³þ4•…Lv¬¤4‹µ*ú4 ‚ä~8Õ´!\!2ûytzÖuŸhWcâ÷–×óS{b߅ۊ1 ­ï>°ÝDîòêÖ ®^bç-(„ šÊùù¿6¶c÷¹Ó\üï_ÅgÚç«`äš+·9kˆÆÄèçzÕ=›özÔîU~Ãö(Ù™÷¦³ª%IRˆ²òóXoc-{Hì §¼.›ÂôÝ"[hÀÔ›B[y9}T÷Š–ЉwCM“^€ßLí.Øh#8«?õÌ}±²þT­Ð-%7X ÷‚ï&x=yÞc5 ˆí±Q½µéHØÐQ¼:%Bg°Ñõ*L§è5_¸×7íÄõè<‚c˜šL…–r¥U;% ˜Ô«6 T§¹.ÿ´z‚&Á“ÿôžf] ûúèÁLÊ~$WaŒ¾‘×J Fá†O–Ò)ªK ^ˆ,—n6U¶Å¡ 5 ú¦;*;ý gÿSÙ@±Ã@œ§OÍø‡úëB £P7ÄA`¹…ãˆn^Ùˆgª€Æ釾v 4F>—l¢sé¡Kx º§ g÷;w è=þЩºљ.“'‚ ‚f´„êñ@ý¢?x è‰Ç‡Îéè¼+ ÊDVV†¡~8~„ká4Âa0ül@¦ >ˇ,ØO*0€Áz ÎqM‹pՅòýg¦ã‚f‹jäv#UnjS0m”Õ†Á(Éq|²ákz1×E@-2kf.›*5o ež…~]}¹>Àç»1|ÓO,y­'ê +@í ƒx]‘õ9Œ9ÊË Ìáªw™¢ÇI‘¢Šu?hӊ¤—ý l‹hOÚs*z?8 +W†4§9j7$kÆ9O("ŽòÃ(±Ch‹1¥Í벡ݮI%þà¬òŸ†§(=|À§œÊñ ‹s)Þóß@ Э,ña8’e p-‘Jþg²âQX&T ñZ ¯eë º´Ï—]ê¤z^ál¬¾…æ^ÂB€o]ð„¿îŸ¾+.~ž}Å9VÜÜtê:³êà·§†‘ª©8*R9¡Q«B½ÔA;ƒvËï¹Q,ýÝ»ƒ¢Ë±šgœ—î.îo×Éæ{0Ÿ it=f§¸xg``ßw×'`Ô @pØW t´äúª8 ²ÞUTº?'åTÖ§’ {®Çó§væT£Ó”ƒIžßâX€—¹½¯k¸Á¤Moð™,à W,ä€jlª´™0¹ù=á;rý4·›³ãj‡$¿œ!62JV‡ÂPë Eåùè“'üxŸÚIo2ˆƒ¹øeºïæÛdÍKN²³Xx1jbÐa%iZ«Ÿ‰8È»zƒ€P®£Lý€›Ò:UuXÝ`%+£Âh§ ²Ðh¾‹‰8Èëh¡neÌ9èÔÓiöÕNiâ ®)ñ=ØhD щîá‡e'XÔðE$†·ŒAKoðÒDaÐ)‰‰Â@ºø†;äÙŜñ…ÈÂÔ³Äa¯@‰O±ý¸žº?²ô}e‹5ƞ½•¤+¸÷IƦï~Tö[ zÊ0¬„Oti¸Œë8^pŒzu城Ú[ôstY þ²B“ÒÁ¾=îÒ£äF?´© ”Ž¸¦¨=šjr}IäûB^Cè÷œÛþ²Áíé£)²¼ãzHy5²1Â3ø«¸\.™A[u§øûœ»Ù–UhõîQèN== NŒé0 ΫDÏ¡ß!38œmî›!nÁ N“E°¨A¦KfpF§¸áÀ€iiq˜Uw…›Š NLJY ì +8{ ZèúçìÈ2?)³1¸¬Aep­éÌ1h>P# Ä\`õ`‚uá ÝBâÁ-Æ.ƒ æ.ã¬}“/ï;ì4ŠRÍB׶ZϨ£ÔÙ@vÜ-ÒÇ*6Bí³ ¾K—xQö9ŽÊéîÜb‚¡ABÝÅ⻦á]m\ Á~ <ëTùocƒÔ3x &ë>;ƒáÿR±BÝ5ϝ›Ú†’ÔäAÏ-}t@â½ß(ePRp)ãhfÇ^Ø2ñ äPÌ´ þ¯þ×ã{-ur|Td"ùåä–Âý)ˆµÜïÝ7QƒäcåÀij]'OMÇfu7¯—•A{³ív׭֕êOê?)Ød}13óZª70Áá!†‹Ð¥*U¯ÔÂW%^«€©šÙ2ØhW£¡!Ô[†™#’\„m0(õòŒoe n¶]‡zÇ@Ã\æ€lÔ9GÈèˆÛQôhŠò³`«ƒß%JvbWÉN¡ƒ}LEõÉUÚÊÈ£ƒ0˜Ú+®b;?W4=ýhÛsÅ@µ™l£‰Ú9T!˜'t°3â _Öªi((„IÅÁ Õ±‡´àÕfFì˜y`&Uéµâ8‚¨˜²©#ïsACô¯ˆ½_¶+‹ƒNñ!T£°oÇ*š¤gÝíd‚C†!$2°°²Y!™{4ò̵`‘¦ V‡>9«Õn2Ò$%þ¡¢º•s¾Lµk$ØDý²åðë¾Ö„5©cú:ÍüYÄ.¬Læ‡\áÈ΂6]ý$9t)V»“½8¿vzÌÁãDP¯3§,âÁ ðQÊ룺lírmƄM\ jR‹^ :qLÊlŒbŸþ-»I ðèÏ®` "ì­ sW7+Ï$i™bKI[0€øsÁ¶ ñW(ùºú”·i.zªr… ½Í¥Y—dÔÍY˜ÅöãòwÌódAÝn,“­FR…)dÁâ +" +t±¬oZ@´j_P鐃]žLVÙg@¨Ê +RsIQ;rˆ¬`®FÔ¨ Iö§æOçË×âkÖOñjøp“Ô ´)hÎՐ^²ÁÌ_ç%—K S$¨9ãӎˆ¦,<ÿ&¤ÊîˆtÀ9l;PékºR0oÀ®‹êÒ¤ºû„£ñIÛ`Ñ̸ç|SÆGͱC؄, ºúsä($kêÆ®*Ç&îàÅñ±&ӆˆìH&î7sXÄ{#EФ,ÒZ[±HtĖŒ¯$ãö0NC|ɫѤÊ%ևC ¾'ái[#$²—@¡Ž’©ßàmä‚KjCV@»T4h,ˆWôÞf½ÙMw/d!4²qåÌ{Ô½Š}y;+÷ÆÞÖ&np +qúì5Ší‰Þu“ˆÂò.c̨½¥àôGŸ½õ†ô•½2QjíDÒfö-’x{:(yÐC3±r©˜Á³„ðæ¡G¤F´žjk$LúÕ35¿äꙶê¹t!˜=õù˜õÉjJÔËõÎ:œ©V¬dlXî1=Êæ¨fY(½–ž¦E/jÎd'6ô´_šAϱìP@I\˜Æù·[+š p‰ÌýxÆ÷™©ƒñÚ¾…e ‘±þò_Â24ó +nÁêuó$«]^´`i5\㑠ò +sÄR5ٗÀ>V½`ÉQ°Ó#Ï`MyŠB@×Ù«mâã…ë+úGÇÓ{5j(‹"4]£íf ¹Æ³ö}.Ï +g>ûR³pO´ƒâÅÙE,¨8BüðTÏr‡Ä=ÎVlx*:±.ãRqôó)éöu’Sm,UÚdßwŞÀëÚë-é7€×•*®–OERà ¶Î|'G¾HkF¤’<±z‡Õ¨tŅoèªw\†º{æP‘—FvÃ;Ÿwd_IwÇ»“hOºh”„¬²ö¢Ùª×gÕé™;w¨TxâQ(wÔevq§ ­  +îRé ·‘·l !§N}¹Õз<àÎvMÛ mP‘š’ÁÊ¥wºn¦]c†  9D;¡+ùÈ^uª7Lb}ºvÊJ³£Äš]8@<’ŠôȪìÜ Z%%E‘I9Á]»mW€=»$ì$H¥°ô7•HH¥¢!º}ˆJ9€akÎð¯ŽÞÄÎôÑDJéK#„Y±wSøÊg"„ÁúSsˆ%›B”?£j@G — ¡Q„•î†0yNÔA¼‡S¶gC膄С@¡ áLËL-ªÃ7„öN½´A%ŸJ“³ç‹„·EØd´º?y=aáðwerû;&‰,B :f²Êû‚clJÚ_®‹a>9ŒªzB ߈…Íý¾Dà5´ ¡¤o÷†m‰ÜóÉ +W$Blø³\í†Ð¢jôÙ~CˆÔbfCHU?J¾ˆWØÀbY™â¤Ÿ´ïÄýÑú¯…k­û:Øî]‰[@äÔzŠ%p¡ÁêÒi‰.Yô}roÛ(€-|°D/:6)c‰¸wîÓ%hÄÍNBk4O.QÉh£UíTñ…‘$úèâ¬ÿ/€àã„ŸM'”}Ȇt 92S/½~¶®‹æ֍…øÙðÁQï˜uÐ< ÙmÁÃÓNÇâ$Jhª\öÚ¹g‚Ž¤­A°Ëԙ31ú ñ¤-èdÛ-›Ö’Ú„¸£ã¥¶Ûõ5³ú!+RȋMv"vȆoS±÷aø›“¶ã^-ÈáW¼BÄrˆ6GÔêGûé´`mláUØzI²~2Á™„Î*Aì*gh<†<„‘µyÚw¿Ô¥¤°H/ˆ‘êê"Ò5#ԃTïÐA¨aÃ%;Œ§I! ‘m1” }@ `&āݳVˆ, Æ® ×1QÑV€àçv?%JPÃa»;Z¨IP£mŒËá"DThž€‹@<½9™ìN*óÄå´'°i„QUƾÅtˆ ÿœW qxP‡K· +p7[oÚʧ˜z)™óí$ËÎö<âÍ4Íôù+¡>v¡8Ô¯[ˆöãP¬Ú]Ê³Ò =KÇF¾SàŸ~À³bB'˜’{På‰6;xƒâPîT¿pC>;œVý5¼ô" +H§×°¨²Ç³F“Òø¤×p÷IӋ¿†%&¿™_)ØLÕèÎÖO!-ÔÿHíoc¸áÆÉ0¼†îØ­‡Ïg¢D™½DÏ@ chÌÂ0¶fŒ¼"œ¶nˆN5w*ƒòi2"ØöºÚݲÇPŒI“*Løã qòéÃYGÝÊË«t::œŽ2p¸Žç!9à°F$RÀ +göP»)šØµ”hÇ|L¶Œr@4‚08³î„Y„©èÙ q»6üŸ ˜O#à@‘Kt-74ÜSä<¸@þt·Ü®Ä³M¢ø,®VÍ:ÓgilÌç”m ¢ËJÅjäY*¹Ø.®™ðí=üžÑæQ»©² u·þv¢€:8KñGª_ÝgK‡_=è ¯@ÍÚŒQª¶ÿå e¼u2ô-ÒLæá¬çJ~y}É«¡‰s“óÖ3EØDˆWÃGÑQrÐ1Cÿ¸»ç'ˆ$"ì%òܸ² ‹óc´™J#¤2°¥Ê)‹”ÎêÄ*/”ø&);0r§Á¸6KHüßEAüÅêÐ0â·@dBßñàô{©ÃYÑõ6UqÏû~ J———A XÔÄÄ(O‚rîu‚™„P×µ.¹¡Û˜Ý3×ÎJN\3^˜8Ö­hpŁ'W!íá-ËÍ^2D]méœprlbé€á\+•t¬¦ÑV;ßÿœáhl§Ïõ3¶Ó“EglžðfÆ]ë8®ŒAË1+ÇÃAlñí†ãËÌAb×ÒN†eŸ†Ù†54±Ó×ß6^W«n]«²ãBzU ÜB‹TÎi¡ S+•…žJƒÁÂ7G%Á’,x’ì;ñÖ1£{â¤SÉ+m~8†b,QؓPçOèY±“š™¤ÿ «3¢„²‡ø-ùZ£²)eå²lJŠ8‹C‘i·Gc˨X-0¢Û-9¡Õˆf)P‰Úë}¦ +°\ ƒœ’M‹¾92þD^ØJ}œŒK³Úƒàjڑ'NGÞñ%_½t‰ÁˆND€+Çvœ@Èjñ&ª_lã­*B䨔Bô41¹‘£G7\^3(»ÄF™pxhŒ³3(Qa°;„¬/Q°Ž„×B„+´ÇH–‘²©-ªËJ$ S\µ(¥u"I(Ñ«ÊÉR6hI¨s¢<4Iq4lƒîšN~…X]vOs"ˆò +Éúéǘ÷~"ö‘vĐÀh‘u§¶1ºzUðôu º2ÕPAÀ ‰X+1Ú·LÿãÅÜÎ} iQƒ$§¡’½QE=T¬|—¬ûfÊ“ؙlúkÒª'êä$ºõy^žœ QsòäýIC6ñúÎp§cb‰ŽSÔxcJً6Ep%g2‰ú)eÓ 6÷e†’‡ÖyêºèÙTšÕª ±}•ýYéDX•Äm'•,†RßMy^¿ª~hS¦Q åëT•3)÷Ï?Z¦”e F„µ¡Í́ÛoiNjvŒç'vÆ·Ìr'.ƒæäa5¿¥{‚ß!_xDQôðê·LØB"åPɲlºn¸ Ž2TI7².$'ry4ñ[je©¸"†»õ<ËWª‘&Ì Ë´Ë+e¸e…3g®«‡5á€ÜÙÚ<~Þmþº!ÏL°‡ËÄ´èæ(ØÐm¸óÌh^ЌB@ׇYÙ~ÍÌ×6îkc51x¾ì‰€Èì#]øqÊSí=ïP×Ô;Ûé™R ¬Öt4gn\› 7:•ï¹eãÙ7̹›jb3‰gN10­¦ù†ãÌòXÔ0Ý&L‚ñ¢™SòÖÍܝ}WŽ5VÊh¦†‰eçY8O¿Þÿ›¾O*½)¹ +º šÙfA©ç6h@¥ñ yæF0ê'â¦ìL¸7+ æ´H?o „XG[©5%¼²»ëLfþÔLñÄO5³¥0—趩™‹®ã‰–¤ýTÛbfpa×Ì\H,}ZŸ/ú¢ò¡33RX3»R&"û€ ]5—Ùþn«3G* ÿOaËR †ß@2HélTƒÿ+1õWöŒN_¹zmFäÙ6swËB >Ëb•›v¼£tëÉ̓s(瓞̴äÐ(á™r´O‘›iªoCk Xg”É0h?ÏPV¶6CÿPO šU›Y+Þ% +ØÌ e2 Ø:³âeYg.A´…¥'±:SÕ£²¥> ã8ÊD’c—ufuä]}ÇÅHZÛÏ!ý<øç­>½yt¬ϝy ­iŒø¿`Í(-®÷/>vã$^àDZÈ|”Ÿâh²§•dqã'´NYª'î#^ƒdÇòt/¹)VOZl7Vy¹ä>þtÍy20¦ÚGAÂnö1yO%s˜F‚1ûXjã÷,¶»÷Qå=µsî£éX˜^÷±c&O~Ô¥×0ËÆúqiaJ?¢•,ÿš2û¿‡‚0r0#Џˆ%ªQ¼‘ËPf[¨Ü†]øÔc'é{âéàmQ"¿_;ßâ7·–G.Á9ÐiñëÁýM•5N_Ÿ¹œ[p +hþΧNôÈRïCê ÎäQ#{øp¡£ÌyCÇz1ÎÒæž7n„æ –:ç]å¦ÊK}qÞgisj;½Ê‹óN椦½8I‡vqBω‹3`^ÕÜÊË\œéßÏÒpqo›jqÙ±€±8‹Pqd„?D¸Åiú§9 Èâ ý)¾eqþïK%_®8íó"Þ_qîb;|áŠs™F†óV•˜3ô«8ùºڂá¤ÖTéÎ-™kn«Û«Û'¤–íþ¢ž sz«H­pÛÃgó﫲Ì>ù›M}µÍ?Z×±i*)$$4›S5[ÎQñwni2Ÿf»í• yqòW³áD¡Unü:A–í®m?â Ë&×%QZ¶Øl‘s’ Ù썋•ljqgUlߍ³ó'Ùà!K¬e =/æµe›Àõªd«­¶˜ËæU–í¦Ë5[Ûo¢ÏêŸÍn÷ٞJÌq>›:k ñÙXƒq¶’çŸúlf¯õŸËûl®¬Û¶÷Ù>Y;+.0Ÿ-bémÏg;ÂÒæ=[ŠZÚ`*´Ù¢öÚ-ÀT?À0Ùå'Cv<ç`… Ä<ÌârLߓ=Xý ²ÀÂSރ’ÔÞ¯d;GgÚ´`q×í÷Ì?ä¢&ñrÓ²Y‹Úå7ñšŽ¥Ù­µ7øõYë0F“]bPïÁ aj +wA±Ày.ûæ4˜¦lXՊq8G*¶9°O’âƒWŠNàïäuª95C !çÓ`"ä_“M yÁóm÷œ÷)Aj ýÀ­/[ `—¤©œS™•RE*Êþ‡)¾å€^OÈq#tŸ¾ƒp¬–æg¹£¬Ú©äÔ +ÈÔT /ō¦áG—(Aä¿áE®³w9Ý?$PK¥ÿ¶¼Ô¶ö'T‰Š­}볏+ÁKZ#lbƒC%q¹(l·v¹ŽhÌÌÚ·}Ö«5BÈÉԁÝ9,¸‹¢fùþÀÉ„VBìºö÷îúøð¦öö +ŠÇ§Ö¼.à²qûO?ËÆþ)æØA-¶“)Çê?!V¬%5 Úâ6·Øl0R‚yóK±!#E0“ñî<‘ÖžSrªáàùÁ©Zt1 +Ç sÙr¡qGm‹Cl¬È*å}È@ ®YkڂX”ï[‡…ä4‘Köà²/Ä}V#N{_MxÆõV|zf < +òûå–àÅ+ÑÃ"Šwz““;«](+!ÓV†AD¢£Z½L4îiëË7.‹ƒöC)êté ‚E»‚¥½(r€ ÎÇ°m¤kþ“³T¾ì©%Y,Á4?yú7lC»±¦¯ +79È-pқprz0`Üp³ßô}õiÉ6›õà”7äOfœè ;îÂ=ͪ‹ ù´¹ÓCC°Ä7?¨¢Ð„ïKêFæÎÜ\¹uyy› àƒla7›KYcÙêŒ_´Àˆkç°9†DÍÎD¦)T´(ùiÐÚ'HÁ},ž»]5”¯E?»eQ²wسͭsZ^pãòp¥]´/ûC*b‚xå*'³—Ĭ(¯¡Sµäj¯!¥¹C1X°7•|ràŸ f¯{ð (¿ Ôˆ m¾è‡!r‰´‘+·]CÐzßi݈• °©i¼ÐˆNò$ÉՅø)ۛ#¨5—0j)Ú/„ÅdàÙÞAv«¤äNIN.ØPqŠ*o‰…žßü·F§8q*L6ÿÚú—äEä=GaL2!6ã>Åه/ œ¡Åʬ¿ÆlÙ|¼G£ª›q:%²ÒØ´ +#wàؗàHz×ԋ=€É(ëRi³¢“M‘·¹Y‚´˜ˆ}h0õ +¢ž†¿ÍÉÀ¨„Uòܩ캒sÅ]X L¨‹»@_!¿8÷zÙm‘ô±ª§,grè¦Iî]ä†\fÐέ_ñÝ´áRïLÇÍ6D^*KÜé(í  `9{ `µå'Ž +ý9)÷AÓF¯-nKÔ%Ó(YnŠ7¾Søñ `r¹òCûq_ÚyOeYd ϶öýz­FÞ¹>ÐñÃE¯ñÑ“fx0X&üé,d ã,¢¬¢²½æÁ~=+ä‹ +oª„¤¢#ŽÛZͨ€ùGFr`28]ð=”g ÷RC÷3^`+÷GÇwþi5A³Kg×UŠÖÖ9*PxvóAđ'ž@1ÞÉ«›´‹Õ‹ÔZ½¼pk‹\Sïgz†ÝÝ 0ë\yØ_)Cá<·-Xýa+£# Ò«¸1®¦’K¢­v컗z°\ ¥ÿ„JœÈºh¹ù¬ öT2OÁ§1ì™ÿ¿âc,U6¢F’„ä†XÜHè„}˜ˆ` +KF gêÛ_–õaÈ>§§3÷¤ƒ£y(ÇÍwÍ[šØE ¿¡«p2¹Êeaï0ÜQ¹ôěâ±àÄ6Œ‘ŠŒ¯U •0jñ¡‰GÑړ$¥5 £¢wPöm„„3&x÷À@aøÊ¡_•¨‰™®à$ élõÊ"†²²‡òЮîA-`%'!  +à´‘êÄ0Â*Î'HSc ÄBSÏð£-ý‡ Q’´&7êK¶ d­¨öopˆ¥ÞiÙpç–Éâv{p¸FðdbÎ FGÉⱈS§|‹“&Z­åo¬˜¦òÑò‰1çšgô÷ȳÔ³ā[©‡€1ÅÜ»‹}*¸#ɄRûä×D‘Äߗ4iG@ðê̂Àôé=}°/iívTPÞð.ÎahÀ-æŽ0x=”‘²è!HáNa‘Ʊ& ¥ˆ‹àÂX{¨éÿl`èï ¾Ð8DŸÐ¤hx‚А~ŠA7¾?‚„‚U I=‚-@_} ׯ±lÐÉ9߆µhïb—J;μ¤:?|g’( \ßi!Òs‹Æ­ä÷>Åàn™A5·…U€Éª^æҎMòàg¯¾ÇêNAs“íèø9¡Bü°WÀ>¸‡Ûi—¨Ü/rúx~ˋ¢bó͛|xä2Ø¢2?jªý襓ô4ÔÀs¦‚Štr»ƒ”¹—ÏåbÜi@¤fñ°^¹ñ©ß>Y«o‘R¬˜;¬2ž° ¼±;¸¼‚¾DúŠtàI+éUØ¡1ÿ°Ï¸—]9@Oà ‰û¬›%¥®qM(¦e\¨ÚDÐZôýÏH^Œër#Šº‡vJèúO0ü?ô:ÓÚ·üXWùX.‡Ádˆ­ +|‹Üd[ŠVAôéÿü6˜L=•w¢ ½×ÿõX¾…‘…\ÛÏf°Z™õ„¨0¹zh`€Ë§Âß[ö”Rœuô9ÙsMmþƒ…"¨ŽÂ…Î’­þMƒN ©nû¡ë$0HޙK³36•q€Au1ë‹è¼Ã‚«¡Õ¥ôRŒ¯ÿ8‚þ¿ÒŸtîf¢g ÿ’ zmÄÞqùL;õêY#$ÄT>7ŒÔø_ôJI•mw‡†»»Þi>è°_„p¢ˆ÷àíi›¨Í¼¯Q‚‹¾ÌkVk +Ú\!Ê M¿ÈQωÀtòs<¡L,Êzõù×OÜÛóqœè­ñá6A`Yõ搧Õs#Î4QA!¨¦c õÄÑY®-ZƒV`+&Ù³£caEG!2Öº7JIRo¦¹‰Óm>&ÓSDx¼‘†aþYܲ»,Ð5àƯ!× PFÎı–Ò÷±$zÝPè½þµë2ØsÒÍâg—]©ÔN(_ûdeÔKç̖Qxrnj2¢ýsz´Ã~'"J,À5½+zÏpö\;ȇÄÚ¾ŸËf­+±¶ì›Ù?•:âýMVk‚½ߗVÙ¥—ËGvòíA•gï!½÷B´pÁ銨îOÈïa ZÇò:r:]Ùàtóæ7ÌäÓoW7‡v­=£¸Q· ¡V=Ó +Y¶ðÏ£¤¹ÊöÓÏY$ÙXȋIí<ý‰\x~XËi‹µIÂ5›µ×ðǁÂ2N$a¾k,Ó\ÿY ò÷ûôû垦¬ié«]]ûÞ*±·~cv¡ï`ªî›ÃŠ?óÕ$xÑhàA©8‰@µÊ:ÒY,ŸAœu£4CMúGƒlLÒM…ª`é‰ôÒ‹ @ûa9ȁ›ƒÚFð¨ºeÓñs+ÛáE䒱–?‡öYv¶DÊ<óº€V©œ]½¨Ü½”÷bN¥p<ÚT°~M‰rŽù»¦ì: ¤¬Ž¾ìÑÓJÐë›Z%ÿýþ\brÎX‘Ú4€ŽX뎑Åþ4ãˆrôI’ìdZ„’1LsrïUž ÕÊfÊæ¼_ð²29*#O%=S¥ºxVÙã®ò»+᳧Û-|ú„ë’úéüVÎÙ\yV¤®ã•õÊã-q_)ìì‡mƒæ 8j#8N,©ŽúÂp¤”óßÁj3£ZŽ²Œ6΅zyÃà>ò­‡³ô_Š‰‡X&9ÝLiì&õø0‡rc~êÆã¸Í?¾'W0äꪑ¡“.Ùê”åY–}ñœµâ'·òÏ£ÿø³¯ïä.øÈ7Źv¨­)¦CèÃõ†[Ca]à±>ðù@!ÚÀJ;°³lÔ˜Ó‚s¿ä“2&>&Ìjý¼äÓf`MSÉyØfxÞõ<ÈHÉIH$™Œ,·. üx¢*XYŠVô):Å=j°¶”@âN£žG]ƒùêUmdfÊRÒfȵÕrý¡Ý÷e_š)”ÂPÓ(ۘŒ¯á–º͸ fû^ªº³Þà ¬™ðËʸMõRâQvF\hE]F“tyòo’Pä¿Ü×o“•è9—ÙaÄèÿãxškp,5ãš‹£[͍#ÎÑëG½yôÍ0óΛ£/…sTGÍïUÍ~“³FVÛrñRóŠh€„)!ªý7tD23ÇgZºGÜÙ-ë±OAb©×ö¿ãH5êpÛÞåþÜN)'CÎüvlìhÃu«i7f7›»Ñ×w}û0l]%#L[„‹ŸõÜû4äk_")¯ÄŸ]ÒkîÒìÍÁ…¨Ï¹*¿¦ËVy§<N`M +yšïÊJ—”BšÏƒêXFâ +¬’ÚÛÏŠùZ´V¾6î¿6)ò¸¥:²ŽJ>|_U*\cápȹdšûÃX÷óÛxô-k\ÓÄRH³ :%k·‰f-ѨsOçñ£.DSú“?N´æjb\WÑó¾ÉMœnð^¤'5E`oÌI欏súß£í®–û©eüi™Ê®Ú¿8A~M’Š‘T›œõ2h”Hý5ÛRw©•Õð¨CtBÚ[M¼æçy]Áä<­ÛšMc}Ö=sm·4°N¿[d‚Ãÿ_±€C´0òSׅß,JKÅáέ«%ßí|ðVÌGeÈìœÐ‘™½ ¹/s¬4fh³Uì¡F=ELÌJWVö/¯ÆÎ4,ñhÓ*‘³ñXHyhg‚7^ÈŒJìè˜.F’ÑÇâ¥ö))P3ÆÝû¥nãzÁ°ÆØzm9â$NR‰ÖJRb»Š"Üàçٕ:>$§~ؼôÀwÝá¦9‘­Q\ôÂₐ¬¦"pçÉñUã€ô|Ñ Ä .)]™þò xcx霪O.@^ÔeÅz`PõŽªë2ý: DÐhÜ‘Ä@R }9šhsÙh®s™ËæZ<¦y|må-å:ÁñÊdrÅ!¹¼Ïê!×1”¹BH.¦‡\ó á6KŠ~\ÿ²ïàp£}â+L‰cS²~ºæA¶ñ5Înuö[Ï)·ôO­×¥6Öfø°].ºÂ©[á§V0+¾[•§ÖÖM³DzVð$UpÍ;š[ø‰RÑQ ^Ä+k˜¶ˆŠëeØ¢B¸‘ŠÂT¤|*օ$£HгîŒØ6}òV!˜ëÒÕíéë®:®G˜×r©µ,(Ör¥Õ2É·„]-ä\ºñdÕ8dÏÀéX&ƒ·€õñÉø ó“Ç>‡ÌÆùFÍ盿ÐÚ{¡‡æ…¦–¯Ñ.T].Tú +ÛBۊøÚÊBßkb4L–|…º­P?±>.H›EZýHç“BÈވNº"” cy±Jó€·Jsêý¶0­¼,ùÀ¢ ‚&©¢•b…Æc1òAÊn¬aì˜èNB²‘äTÂÈk,ÒèSçÆVY12Ç@±—ö± +gt¦B<Œ¹µï´Íu;¬GÒ4|É:y\¯×¯±ænB‰žó ir¨Í¾M@*6äÃiÿ²É58â"EEî F>Ú>’*Nò¯½ÇO~Ô¢yÿTÁfn€QBòï2Ø=‹D†ïv‚ÈRCr­ÙUÌýpŠI²îwH il°^V†¶e†fæ ]çƒim¡˜°¡×3˜¦L-30ÕÏFéL7Í¡É!+ÿR›øÂ~BC¾×È.‰Ožp ¤”Ì#ì*bùÇÏSFõó(ó”Ûç¶OÁ^ö!Uö0Ç ìš'§…ôÌý¥äh¬ò˜¦†òÁÑØ8Êw£öÆã ¿Þò§Hó»âüš<²6±9'²Þ€ +ԙ;NÕWaï•ÐÎâ¾SÅÈ*Jˆ?hÅfe\V¯ÉH8…lÆQ e5Ëoチ0»ñXêkâ\g+ÄZ@gñ¨Õ”f­Ê+¶“U=~±I°JBz’p…nµEÆa¢Z‡ªz°jv-à=ĆçK#±šä\ó@§¸d„ø´ûuÓíK'µRƒm[Û€qdCÇ4±M–rb&/›”[-~"É=›È뗯ü¶d®Hk¹ˆÊȦÕz'G OgQ¿{Tͼq #Ó2ïòWù¸Ýô=°äðd¬îȍºGÆƛqWƒÉ7œlWn )‚W<8|4_sV™J õD×" ëˆ}Fn0`’#ô‡œ±Pª&j/ðPÌýA“%€OûA¶w¨¬ãÍ 2kÍi‹å·L—Ëwáa/Yé™ð_)¸÷ÕZWðN~ \×ôh s ´ÙÿÝ -pn]ÿÎßc oøýݨóŽJop!âOpóà|'ßÆÊN™ÿöÉ¡ ¤À:HüÇÞËè/Ö¥¤5+[‡(¥¾U…UëdÙp´˜G¯7mEà Öùø«®³Ñ³´¥J dtµœ;˜° +kJȼôD/ÐDe±\ÒHd–HõK +Ns±–9UýºUÑy¤Žâ­™í]Š}K,$Ùú‘^#OÀ‡Ñ7L½êi†K›ú–opîÞÚ\9O©‰ªû[ÖΰX-üí„B)CÔ¸šrVbƒ¥²6UÎZe¬¬àÀ·[n5Œ×‚,›óxN@Œòêýצ‰^wo!Úã#½0JF?– /iöP3¡ H?I3®JOs&Jµ„ íRBÿ„ú¾‚Ô»þ¹œÉ°ÍµWDÉvƒ(5à¼ÃÂgê;s¤µ3r¯]‘ÛU¸ ãI¨ Ćs̲Tmx•ƒó_¬ڟlÝn²±ñ#!eY<á籄Έþ¢€QiZÚÐ#V3¡˜ï`¹øbŽIF†Úz–¤XÇa1Þménóö>l+0m %%ÁûLKpý©Õ>§6êšœ´Îcâ-y+ÉË:\(¤Ž9}@ÉÊIÛ~c–_ Í0¥aUz$vãd «è z™°ÿG«n£$†õë¢ÐÿËêÏfÁÄd#šØ™Ñ›Ä‘ÕŠÍ ܵ%&Ȇ‰‡Ô-jœèŸh?cÄZ®âÞêˆ=¥ä½®8Vp¦ÐY¥7}<ýö&~Œ{)ÿ‘ÿÔT5 J¸Õ³œÁáÐþ…g²Ë0G Ð—þƒ*Çt~8K@c<ŒߍtöMi¼jfµ“Žêöáêm~j.Úò˜ Ïæ݁h\ÇÔîÅ.tʂ\ê–Ïågf³CçÕÃSð¼pèÖ¥-gÛÍZ$Oã2½ãp~+4¤fî³ù¨8é/ÿÁÆù‡bOAoU$ªô +ÜÌÍÁ( a»ãË?T½#²øÀu)¤sCŽûRS³ð¦™êjVA²*ö÷¬Ô•Èþx ˆ%ÕCÉ©,,‘É|T²rUG Þ¨k”nj҉qò¤$U§ºx¢J¬ÀŒ!ÿ°(hY¶júæ/S±Ï ùC.õá±j¦Âð„,-Ç4½¼*"öTœ?g“–v­i³å)Ø^#úÉ;’3“ +R{Eõy‡z´÷s<"xSØiK[± ùÝ% +5)ÿŒ*\Bz%!îƒ$ ,Ù°^BuD‡lґÓá3,äA[TD:@R« ¾pbêo¡k&x¶¢•l ¬ cÁ0hÇ6ý¨ûƒ®Üh‚«ÀÐäãuújSFWnÛëòì7^¸Lºw°C,î{ñ²5]‚[{ pÒ\µ#ՌujöµÞ§mÓi¢kè@K{%͑âvÃhŸˆöÕÐ.ôF@SüdIQâ +Ϝ 3ÃÁY5>¾|1êtág1³zÙØö’è`Ç(ëXÁ±•)I¦VS°q…!dÖCºÂÙW¿Òè8Û´Ž8ºæx°@‰Èª Hw;\ߖM]=ÕNë„U5éX›H‹R¦q›òE˸A†!:±îÝÀZïUªÏaô³×É”[ ÷C°ß¸¾_àñŠ$øÙA +p·©"r˜kVÈ@R‰ éGªŒ“8®#´dSQ˜=ã/¢’¨¾9÷–±Ü¢Û¶^hȪ­Š {±g™•ª› Ãl¨e잫äÒ4¼ô`ä%#Rbï¬ò*Áb˜aÄn€÷éCøeHÕºD’®(c¯p:Øb78ðbO7ràÅ>n`ß7ö¹rö¿†5ACsc tÁE ^<777·°±¹½‡‡Ún?ön··Ù˓g~ˏnW`[¬rÔ¨8æziqqÉåe³¡y]cuSàú R—ѳhټ˨V|ðîU››ÛلËّþ= .¬à9¼ýÿD4syë.¼\)9<£’uet[œø hÀ~LZ £è”™[ÈZÒD‚·ÿTb)ƒ°«%þ[ ¯¾é— +É˅“•KéR%´Ñî:uÛѵmä2óÁlªÂ.£b†£äÅÁՐ«H,²ÊL¼2à8V¢\û*þmÃ6ÚÁ™ƒ¼Ûö¿kkT…xÑÿžåÏ1ýÀÿ¡ÃŸ®\Z~ó#‡þâÀÍ^ó µÿƒn=tmoÇjEcÍ7àÀ·RÔÐÖ yÜúˆçê6à܄¦’¯?A á€ËA‘`‰A[-ˆm)a¤[¬G'{}Szë††ÿÇý§æŸ†RWÁ§h÷¼½Ì“auÆït_åôÑÀκ=ZDóQÈ iQàRV-µefè$rù@jÍÁ¢1ih\ÅÜìÜ–•È‡E˜e$úFúîH>Œª¶!Ôcփ2{ÁXVböE*E•Ç$½Þ&)bbÍ!DU2–6¨ey,䉱=Cš¶‰ˆG4¹Öþ²¶'—ƃÊIpp4UÜü>ÅB£Lè…œ°O̱…z)˜È¼@*HíRRÁÊH„6ü팵P¦MÞÔÂÊ":1A±“ÖÔR¤ä~!‹ 9 Ro%àlè™.´Ú"_öÃ40 ΂M"ðmk 7»©·ÁC?_)}ó4¬PùUè¯Ì +J¦ã;•¦ä +¬í¨,“ø˜„&Ó/¹ë’Ö– fIîJª$žSR&Pҟd²I¶Kš$'G²w‘< I HÆGŽë‘ëŽåHs#»|ÐHKF`$]¤z‘t‹$Z‘ ŠÔMäD*Dd DVù™K‡d4äC*,$‘BZ „<²™Õ¤Eͯ¯û…x¯¸´v¥dº“Y¦ùm¢B¼ /²U K’&9¬'t)‚¢49I5A>\vP$#¶uѤ=YkC—&N!èϘqÝU¯«OR‡ÝÞ¾ÎÕþ{Ä©—û‹íþÐË$dtšÙÃ/PÝê®pÀoDù‰sîÆáÊù‡äxõ'ô×\›¦!2y¦²ByÝ­ñ”ìšWTÐQ¬“æÍj¶YSP<àì—ò^x¾‡ˆ…dw'ùW̯ˆÖ´ožÎ£Ê×z¸_gbidBÁ<{e½¨Õµ„™ ½/ǧ…'eOy»Õú±v„Ü­ýæëàS{G³»ä‰€º·|ê/k;‡\(Ëvô§Üƒ Ë¾¥ãËÀ`•@aº‡ÄÈý[Ÿ­ N2ý$·©Ï³\äq jÇo÷ÿd7¤Æôè0àý»Sdò÷waÉ0ù˜=ô>Lò¬ñ^E: yAáÒµ:º(Y5cܤ$¥L))Oò`Þÿ¿õ!Š E & ¥µq>ŠÁ 6DDWkBI.BÔy‰Jqp(¶ìŽa‰iâ)É;#5)=ÜÓu!óQýàdjÝôƒºe´P ˜•Î¹OB”ÓbÌâÐr ¯¹`%@ÁÈ D°A80‚$€*Ø  Øà(0€0 Á68 + 0F„~àÐàÝK"¡N‚ (p‚x@ƒ €A!ЀR#Ø  +À``p‚dðd  6¸h€l 1A6¸ƒŒ ƒ ” ƒ`  “0ØÀÀ`$Øà 22p 8€ H° +`0‚ 48'ȀHà#h@:šÊ’È,XºÛ£‚mýR:. ±à@x›A<˜¨ò· âÄ¿¨EùŠÇý4pqÁ¸&œ,ó'´` ‰‘Å ²ó@\YIOYç 'Û ëb̳cóT™ZÍ÷`bþâ”á)‹'†C‘DD&d&„NÇI´«Dç µ*†¨,¢ë&O4¯GA“>¨†Ab¹Bñz ëW„ʼn6„†ï̍S1ˆ‹jQ©Aän +ïf‚󉢊¯QÂË`мĩÁf£A*¢½'-¡D+¶eRl™Ó1‡ðkÁKôú MÑ+ZR9 ]· 6ª°¡:ËçC%‰”Ku@Qã +́…[ç±±àÀã!:(ª®֍<ˆ-j.3³,WÑËA]kuEàLj/² +õÃ-Pz)‘@B}UæÔXœ-QáXJj¾ò‚U}ɗÎýQKÖZ£s±´6/‘_¤úG¥Þúd%ÕhZªƒG´,8˜)«tCژPُXA©ÐŸÈú;{ؕ +‡BSÄÏ*áŒÝ¤c²ü‹™>¿º väA㠋ƒ{–ÿ4!cûٌý˜=>4A"gtOù D«ŠÅ+:DqâˆÐNßT•¢„µ‰ŠßãÐ4ªøuÚúø!nBx&/4œ¡EÑË©à˜8SîOÄ(r²(KgØUkõ” I%™|"—ýáõáE¦3ÖÔT2w¥TZ Ý#ó_„Α Чy­{ I‘§ä‘ xáOãßàÔz¿_]¢.óG +OˆàÁ…Š]E¾¤Sœ`hyÞéً(Äõ°êSTšžp%—=X¥Z¹GãPÁù,ˆÅ(ñXãbÆq‚oDg/ †ùAëãï5Rp‰P†öVƒ’±n‚,kwP`Eð½ ’/ì¤T‚Tç‡çpFjøÎYÂxú)®è4T[ðã'…„? ?·N +•Ÿò3eb_Ä2ÍÔíŠ$¢¨óŒ’„¡±‰„â¾W­Ñ¡i÷<§CtßL͝!¢U£Òø¢@4²³ƒËÂÆ;¶ÂóÂ~â¯écëR;ƒ2BC2Á5H a¸^”ƒ=ñ)6Y™ªÏûè ýHWѾš½Úx+j|áUT`m4í{múƌ¾»|7Ç(ÜΑ±¥Ü مõZ8$ V>´…SeYfÈö¶¦{Y5H‘‰‰©RXfb$YRœ‘’>“þ¯ez¡<.XÒr®ò"k¨BQ«œ´;‹\»\†– #@ +f¼•¼Ö)M¹”®Mœ$M³d"j·çª0ÞD͉öøʳo¢_y¿÷©yõäE…ñ‚¶o¶{R‚vù4c É++’‘YEÉ;NÝ2tq¯êåUSÁ”éGr ^T#%ò—4©É!›‰=þ™Üž„·±% +’Ç=7q´¢ïR¬pÐ U}ž! Ëi^%㢐˜9–E&j%µiHÎ’`ˆ‘m>A«¾Ú¼Üñ /Ýæ((Š•!©SÖÄŸ²ÄmÎK&)~µ¿ QªÊG‚ʦïÄJÍ©÷«ìù¬í¨FÎV|ÊBô¨?Êé]2õÃQî6)[hbLÜ©|ô’p š×ži«[L]Sõ|v½iÔh]™Só—ì:)å»äyÍwa Îk‚Dsª"¾ŠÈ}ÙÔ·ç)¨$Dô"Ö)ڑ¿CxpҝÉ=ѓ÷|3 +ÖlFÖ¼cue¾KÌtbóy”WËØjÄINËr°eh +¾ü Q➄UǦµÿ&¢:§œK-:›ˆIU1Ö÷ÔD—:cÞ g*EðU³š)ZzZg/µGìTãêZîƒ+f\£]$㠒¢)¡-#1$Ït+švJD‡gÆ]øæ ÕGÐEX.Z}”š ½§uÅÍˈ‹4OT”í¢ZãBÑP”HKÊR¤‘UD[´^\s?TârÍ|G¦ÈB  :Tã`5Ð7…ä$¿é‰æЙƒ©úŠ5¥™Ú¬¤>B%ϔÔ/¹Ÿ†rørgòçûv’ÉÁ95Q&Ã$¤>E*ü<Æs*OFÊ!4œ˜Q–>'3œŽI2¤6å">¬Á0•Qyƒ+Ô¡ˆÎ†sÍ­Š}ú”^ÎÐ5DâËCþÈÑu÷4ŚRˆCU·+эA +33Ùe0UIÐKD8T—ï ¢§Ä*D4D‚¦*Äž*Ïk"< +aßCoˆè?§°*5MÛíCïBB[“x‰ ¡Ð%Fæ”Ö)„>߃ުyŒæ.‘Ú8 +«´v“D…ŽªJ,M8zG&Xs’š*¡éªf¦XEúHMdx†:-{ڙ¢–E„õÕëÓTa•=¾Ø$µÆ‹Š– +yá?°'§†µž¹µ?5¹£‹¦ Téb½+yª5±D¬† "©¤hŠmÛܘ‰âý"C­K¬*¤ÊŽíúµƒõà‰V(uõ–´"¯Ø},œfT´;“ 29N‡}ĆÆ9Âöö4E’'R§e†,SÓ"w$¿l‘ìN9¼-¶hfÕ·!?ü$ÑíEŠ5|Ma0¥á oTsÚpI¡iÜg‰ÎÚ·…>u´$N4]8òqJ^J­N”y¹xš:Ì«…x”hÈûÀý{ψÂ8Ì +Óê}T:ðëÀ" ÿ¾I)¢çÓ£y=¦.£!/¤àMG]rÏP ÏÓb\ÀO]iGNa„¡‘‡¯í«FúKFþ™dšµPvÑ2-ÊÆF“?›ÔZ :V,ªRn¬Å ¶æŒ«!ürÄ0L=œ5af{ · ¸ KUŒ¨ˆâ.•ƒÇf"G-²ƒÛ¡0ŽÈA‡U ÁV†Œ…\^CE)%ˆL+îñœÌ)ªŸ›Ô_EÅjN»ˆë7´óväQLhÛ­ rY…vVPJòƒPFÈ®Mc)y¶ƒzEÙ0S/!:œD2Q<¼<Ø/4®Îœ³Ý ‰ÐšGð4ș!’<{ð°"&º 3¢¨ ¡rUâ ¡”Y“ð˜rf¦ˆ'òlؚ…móN®iCÉi$Dà́Y 2U!åÎ&C/ªÍƒ'½P²Ps°(ãdñÜÚtY ±Éó,\&ÈËôÏD†hoIŠåY™h&È …Ëɺ)؟>(ˆ¨Ä%®<÷¨Õà‰ñÁé²"lý…Y(ڎ” |à„¨ÓË⑩2äŠ9KKNDÅW~P$B+ѤFÓzÈAC‚c¤ŠêdsFÈh«jê."É.ýðY&8CÕŠ)9"h,D†êɍ˜ÀLÕBÖº˜6u*Øñ¿ŠvEYi˜™ !®úh·„³„¬„¢Ž<ª&e Y(ØB¯±PE‡\ąê/ÈeŽdþ„šKãçeñªª AA¡§j\NÔ£VQDÂQrDÕö]LC4uAC¬VшeÈ=K6DÆT$SDö(1bÕlFDºRŽ )‡£s£‚¤hLT{PmŠ¨E¡(C]B—)ÆW¦ Œ©ÍJRj"˜Z¦ÓV›¢§Ñ·b• +¢½±®Qqf‡Ú‘3j™'lÅBÈUÅßÝØ%õ3>g‘=•™nÁ2źd—b+JXÕœÚ +Z±ójm%Ô¯jï<$aS¦ÓrÄo’Ór™r/â;cwTÕ™XM5MÝÍ5C©Â¯OʸBk…z½®óE­SºŠŒxË:3#Î?ßãD$¶ÈÔ¹=ã‰Xn)-x=0-|†E_-HšRU59_^¿O„{,¤!Ò·SMû¬ï¤7Ù2YJÍ{²ÑÞԒštš¶þMFµ¿w–C²µ‚¥å];­füà:™’ :•D¾A•çsªXÝRŒxO—Cæ.§²i ‰7zâC¥àü[QQ§æ“Ý?c„¨ÚDÕ}‰¦YåuÎHX-¬¤ÕÄw…ŠþFLT…¾‰ÀKqžA‡‘-6‰0NÖl³æ¦r1/¦‰J%„FÓÜ.=&JдqÍÃR4RR‰×k”KÔ(ñR‹¾x»eEò4^2BC‘‘wSŠâe\v¥’-u(þ•ÄGNÓÄn‡ -> mÔÒ謲ìÄV¹DÒY%((f‚þxŠ” +é£\©ª:TK^¢ˆ¨CçÝF)JQ²)FBÊéŒKeÈå.™:¯¢!êpfsªÏŽÆD%)O£r6S¢)©´©iÌ̂â‘Í=NÍISQD¢Œ¬E™aïb‘\vbæė&J.5aø"MÅIÛä)9ƒÈå¨`ˆq¦ + +O‹fÉt?M¢Æ4eÍ¡Ô2MÍ¡¬•§!Š?jŠO&NöLԇê…m†3țsÞ3$Vn—g[¼´] Õõ¦A ²?2¥H?Çù±ŒŒEƵ¨VˆìÖí𬕛•ÑúB‚¢Ñ’VÂôAKã˜íã™(†¡èTMQ7&g¡&W–cFâ{Ç1ŽÏÉ1žétà*«ú:Æ#ÒŸJ(“jãrUØì`¤@èØG }a>&òÌ°äxf¨­i(ªyס×TæµM‘tª$TÇÁ ,u¦¦ãˆ¡uc™:ÔºÕ06µ1ÍǪŽ`Øдᱧ*Ík&j\1Q5!Ü©(’†h+҃!1I…ÂÌ,ÌÔ4T³ŠŠ–ˆsµfÈâYmŠ¦Hæ+YY(RBN=)GY†Y:ÃÐÁkÁ•cV³£*‹È•B# +‘í ‰à,? ÈD[˜lþÔ-~T8öP ƒ¸\îgáV¾ƒUË­Ãæ€Vw½ŠA€p2Ìr 9x™ªk•B逜 +Oî +®ƒ¯·Dƒˆ¼‘§£X- ÕgÆå°Ê¢èTÍU‚¥K§hŠÆÂ)Gª¶BeČ<!éTa„Èx:…/Þè!³® +}SN«t—d%wæ¥V8÷ ’PhžÊ+:˄G­‘k¡‘©Ç2 Kà„X>ÓF6šîMÙ¤Œ”<šÏËÓ¡žâú%´ó娕ÃoˆñòD³Ôz}†Z–¤5DÞĄ©é¯I®J¼^D;u"E4§g!Bµ9+f2Á:gFX' ª~™E¡š2‹ ¹ä#CB)…šË!¬ 9h+òâ~TÅE–h3pBÞ+; =BS^[“ÄÂPMFᏱDœñC3µqf>™ƒär?"›uÐ[¬åô²ŠòP+X2Òª¢a´F VI¹1+¢`QL‰5îHÊ\IpPÐ×ut_}:ÔÊEh¶O㠊—§Þ­$NÄòÄȤS|™*®ru(*~MÅI¦*QR·ˆRÛ\W!ž_S^y3ۇ²Î¯©Î«…G­MÝD×D=R‹ +OduN­–T$r ŽÑE5W”p¬ò¸—r[Tå³f5õé+(üŽ òJ«Qn&;wÈ3%º°J“wQ‰-¾ŠHØu밈â"1ÖXN›ud)‰°¼ˆK‰T•KÖ~‰ÏNÒM*<܈ú‰fè§ +EÔgdbü©òW$‚N42ôüäÅÿÐÙP¨>û)Vž —'0ÆòœJ!IŸÊÁ‚%T®CkdÒr›­¹4zJ§y^D¦és™éËi×ÒðiÐi»5=èÓþéE´i£ŸÑBéØÅÆÜѧt2]Ò«¢¢Æ1’µJ#­áFoˆ÷ÅDQ&X6¹ˆâ"½Êº‡Tc*;ÚpÝč‹—mԃ«±UÖ͈0QÒvXò>6Í$°Eä›|R RÄVŽWQÊ´!Å]£¨Hʼn&lf6œ‰çÁG±"yÂðà&—UåHÂ=ØWtWì'^܃žõ‰S‘Ó˜p„¡¸P½!†ö`¨Â! ª87åՐ' ¦:^¡$,¡t*Žz]bõÌËÞ‰ ^â&'c|äЁk¢—°1Cë`Ò!~0Æâå‹âÍæ`s">¨¡| ”EÌ柋ªnÕà +gŸõ¡S= yè¦"¶æE«ŠHý€n ‹™{C +”ùÈìÊjõ$¡tàÒAå"2§j ¤N¿ÎpQ‘t( =B¥Aœ·­PÒ1†··†ÓÁÉ1ìsðˆé tMëƒ2UQhTüÿ@ŠÞˆ’ÌH¼%á˜tê2áÁ‹—jSÙ’ØgÈt”‚TÍ%»¡l3š–¤‘àÏwPs™à(’/1ç³û…ÓðÙ+ø¬Š÷ ÿ~Ãêø&©Áç£fˆHN\\¤È3lp‘ñ™Ó‡’—âyhÑØ[ýâflì"i\†lã.o¤ñ)œüÈ…=õ[.ôœå¸’š°b—$5~ïkò`'39}Á¡or’#ÕvrÏ1!بÙè²À•n¿$VvÍl•Ò–¡P’È +½Ù[^u*^P®4ò +1*”Û‹ Ù$Ð:y +zIåB Õ‹ètRÔAÌÖ$ÐB6ьthw2Õ)aÃmÊÎÁx#Œ›½»S³è´ÕùKü›XpâŠwX~(œ™Wj̒½„†E#œ44jjþ9¿á؞Ö| ñ¬±=m&ÎÇÄÇæ˜{RB1ïÅ7µ"l¢^CVŒå“Äâ#“>«þFt#5T&ãUŒb‘'ŠG‘.§ÂßқnÇ©X®‹¯F‘¥Š1⬺¬²èQCâ…8Ïeè’~¯2¸"w±ÈɼÖb±.ŠÙÎF‹¡ø‰Ÿ¢Tœ÷§‹¹ì]Ü‘Çpò–&ÒO”ÏÅBŒK9%9W+‹´¹jÞçu¯¯rŽ$ÿ89Iâ «3ã(fÈMµo¤wpwð2Á(‘…«²J{Í-$9ˤà>áÌÞO¢v{Qš¢ik¢dKNã°FçÅ 9ò!©6ò!'²ÜR¾R&¯’#“W)²qkƪ i©²¨fB>!ùÈáö +ºÊÓ½h3–w¯Šö íû<¡}¡(¡Ú÷mh†^ìÈ÷ð<õ ¿¢¿ßkBÖêÂ{J:¾h2tÉU”¶y²‹÷9dxš½CŠqÏí½×SoÄ6cFY›RM‹Œ†8n˜ØÄ\±x3»Tc£Ž¼õúò¨|¦B„ã;K[ie£I¥"$íg‘vc+›’¬=®VCŠÇƛ¶³&­ošTyψW#ÆÏy<ŠÌŠ™=žXüΕ¥"TÅWç*ñÓ´tCºªff­â©›Òü|l5!ë×¢Ö´ÒvRTØæufPhøΪ~µÚÉ[‰¦ÝÁñõi¿'¯ïõ¨ñy¿Ÿ%Úy—ðQ¿>Ñ[FB9!K\¥nzªL¸a!ÜFzá¨Ö MN3íh¦'yÃHû@ õáÉèa2iG“5LF½È¨³õřS’UώÞð4+ž´/Ê]QɓÆi?ôVšˆsœ§™”-âcÖ*ùÑdHž4–ßWÞ3™·æò¤ '-Q¬}EÉãU”ƒg­´ðë[«hµt3¾hÝ_4FŒŸ‰l›úý¢ï®­*Á™8²Æxéˆüh-O›‡çì‹~8Y]ʕ¤¸N¬%N‚7r^\D‹c÷ÜÞE-–,B7ŒëL¶©uœ¬x)«Qn]c“ËIuŕّ8ÊYŽk]˜^«ö¼©x‹o‘J†S2g[ÊO­|F©ç’‘ØZ‰Ñ¥GÇG …Äʼn(ÕQ\Š"±ö‹ïË9rq2…qš‹Å0.&M.öûXœ£(¦˜%q›'QâqJüf9ÃÅÉ7Êø̉Oqž˜Ëâ5뉷Ñ%Õâ5©jñš¾˜´ñNŒ‰\†RÎrò)××þ”4ž|JϓO)®(cÄ•ù½û)R]ýÓI£­‚毓å¿çˆS¬É§¬üä••ÓØíä6®1¡°ˆ¸Ïø½jwÍð3£Øx½<`åÖyvuÞܹŸ/®ÜÖªôÂ]8ÅÕMÔæ£GOÈE_"ғãäя±Øú.¨xêŸ)i žj!–èÞÜ5F232³ }¦Ž(Hxׄ:TõªE9±îœ }ß|ÓÞ¢¦4ÂU„kªöñDX5†ëìÐ–ËȒî¬?µð^ÈEû½?jôØt“ϯ>Œ™Å¡–„ëÑ.ßú¨õóê}µðøÆDøÕ:^uDêåwz“ñ>¯Zç6^ð$ý¯YE­&¯¶Î/¯¶qR7UƛVnä…f) ñŏtjøÎ:óHLÁiLLºT˜ˆ‹ž¸Ý²èƒ"¤TßnÎJôÄ =\ðEL5©¾µ0ç ÐÞµÞrkžè€Ä²AÒòƒÒ ‡ŽåƒñÉ/©t\®UŒ¤ˆ§’ÙèD2— R#úT]T“!v.Ú«¨f ¯¦¨h†Ë¤ÆÑL#PP +…C‚AÑp^ñ€ڈ2ŸE@0T…N*ˆ2âb3žƒ»q¥H$TšN×Z¿Á–H¨þ•9ÐË骤’Á|¨7&T§·íý#7¡òÝE¸›1ZÎûé™P1?Õ°{W”0&œù‡`È%iÈÛ«kBu':î8šèñªŠû¢{á~«³ ÕM¹E¹ƒXrBE­£ëQh29ӄ +Þ¯­vô‚'TЁƒí^ þƒö„ê ReÖµ:³¯è*ÐGǞÒfBehKöEõUτ*z*[S<ë„êËåJ1 3ž£ã„ª#§qv|ÅÕq‰ãªH›÷Ŗt¹ï{ôbBåԟjQ¨þ¦ ±ƒ±¸3.…ª†ëB¾Rð7)T_öL ÀDÏXÙ3b +UÛ iXR&_’BÕõÚ'¾©Buv‡'—«?z,‹xúÌM@ªÎòö8È æ +U;J¹™í©P½)Ù`O… +úåïæ–ÿ{¸dÛT¡ۉ£ë¬pÛª‡:—hÒr”&T‚-D¬–ÿ*ʊáÓµAф*ÒõßÄÅÀB&T»¯ù»’F•¯*<Ķþysᄊ©GjMhÿ'T61²•ˆ*Ø äµÎuÆÏ)thtB…ѱe}˜„J>‡[ UfB(âo×4…ªí@áRì!ƒBµ†‡ÆBJãF¡Jóþ¨Ÿ­ŽãµèñÓÈ`BXzÐËì;dôH…^2þ8¡Š–Â~1¥98¡¢ÎAkO¨Ê²ßŽgÑÒ¹ªqÏF¼×ªÓ~¡B +)VRôn +•´\#ûqfÎێ—“V¡bæ¸.ÐŽÎjùBRÃkCŸŽ+T÷ i2Â23‡B凉ODe#ÿímý …J=n†Î Y2 +OŠÓ‘äGH +Ï,ڀ„ÈËxÂ*=üÕTˆˆ€ßL¨bÕB†ï«&ÌO¨nòàÂuë„Ê‚ê”l¼ò«¾ UWAæLÉîpÈ'TkVµë¹sêÊ͵”œPÅ%gԘäFŠ4•ãæ'T~Ì7–p¾ªm!¾* +Bìƪ‰£PÉ}«ö只ˠ>& +•pöIvM +3*qøT^Á¨PÉ$ÁlpðãÖQU¨X¿7Šwl¡B@¶ùÓf¡òaø]p• */J”<¾êª¢Dk­,TO1OK*;Œ–†…ê,ÿÓBåK¸9ÿ}A ÿíé„ÁX|ÿìր5šÅ*EÊ}}Íò®B•ãG̝HžB%c¯è‚yvÁŽ[5uB•øg9[•$ +ñZeJ¡’AÖ!¬ñ%BõƒRì)ToC¡ôùVN¨¾,€ir=ßg˜x²Å*ë‹ñ÷„JF]1ü3‘ U® ©Äßyƒ8PÝÃÖ ûJ oB¥Ìd€턊€Typ×<Á£ÊÊ Õ +¹ÝdÂtºO©oôrBe5uš™m•fŒu*ùB¢y>ŸP1ì Ÿ«~6#e¥§S¨.ñta¿V…Q¡¢bjû-Ìœ=! ª”"a²ã+T±q‰„ÅuGøö{çV;JZV‚Q¨¾üڃáZS7Q¨.Ò6T’§PÙ±qMʪº¹&?*º|ÿ^^*£%2÷ò=D¡ŠôœË N&…*F‡¤$¤PÑ4Õ¹ê²- *÷žŠúÂÔ؄Šzu °Ôü‡;DÓ:œ&T-Kƒ4bBU¾Ý´¡&TÇEÞV¼oë •0uÄüA"TÓÕZó1Bj è¡J3·›\y6©[†F¨\kòFœ¦q‚G¨$e€X­ïßçˆ +„ +x)1B3„J&*ÙĜ¡zì¾Hâ‰PE®®Œ/GBÕ闖ê&¡â.zÈ¥À섊8œ¯Œòò۔’ª¹ ™þÏèªþ,öË#õñŒP)%ÈhtÕ¾[šzaƐŸ'B…f’8P0µÄ؈G¨NT3Ì+Íy¹ˆPuÂn?#B•ê.šp3Ó +‹Ò¤d?BŶ+^KN¯*ˆ˜¶˜C„ÊJª²KxªwûnNÀüÀŽG§SÐýI£·\'6Ú$T2æ`µE@•PE$Ìj ¿?²e5A‹\’ïK¨ÀfÔwÏѽ!–Ë ¤¯Ù±éûŽ<ò*º¢3¿²ŠôàPy! ˜ LÍCA¨öH¨–ŽˆI¨ì>ì‡Ԕ†ŸM—öù? •Ÿ²$™_Bu«0'Nnb“P¥_âÉs&èTH¨²g˛ó\·­œƒ¤æGû1¹òy ¹þ"#ª˜Éÿ‹/`Pšïúš-2T–Pý¶‘†´¦05|=QçØo, •ÉB:Ÿœ ¡Ú);îzui%¡ + a0‚m^B5bc8p²"‘jP 6*¡²øÄz•ý]@¡¦8 •&WEúuôcÞ]öä{ªÏ–<Ï"$~÷TBu0¶0DBÏ}@û Õ¦µâ–0$TW0En\Bµ3; !7&TJ‰¥pfþ–°7°×@¡zˆ$ÎÞæª)8µyM¾À`Ü1¨ÆùY{ýÂc +•âey¥„Yõ÷'„¡PÍY6J½@\A¡b3ˆÆ^ý·× ‚N%Ôã…*9Å»˜ÔÃق7©”•r(T:0a@Œї¿z5ämBµ¢7Eeæ 2ފ 'Öæ)TWľ  +•¸Ol]m˜U¨ž¬QHneó*U¹5B ËIñgÊw3ÇXï”tó§ìQ/ ôé¶PMºcÆh}5´PUü@ñ'wj¡ÂXeÙç窩âå†0¢X UYÖd7áXb¡JØVùíßBåqNµ¬ìg«i¡RLŽ{cs\¥… +}D[¨Ø–|ë UïJ°qµPÅÞ£:ZKo ;t-T÷µ.¶Ú7¥4”•};ÒZªöeO Uƒ7>]%Ç ç³ Â‚…êî€m¡Ò‹OL(Î%bU¨; +ýT¨ú4DJy‚ÇIÍ!ÉW:º¢Ú +U¹çC*Ïz;¡b‘Iš'Tå:0ƒWw…Šˆ1@¶œP5²ÓK8ŽPë÷•û •;eËHò™PyEšé>¿fÞ ÕrÝP+ § ԔG:O>*æ<¡ú™iè ÊÄHºÁÑ nÁU’Q¯PqôU ‡ÒÞ +U& åù.iäÓ¥µGÚ +ÕÐO6p©Ìå¨a·frXÒB%UÔ¼XÇÉ£PíÖ»JÅ+Ô¡> ­Ò±2ôDêg(D¡ú‡À ‘§ªxM±µ •Ùw`«+Ó}B•w?«ÙŸˆÕÂeópDXœPµ±úþI0=Ü=O›PIË0ÄÌʙBªßó×ZG9hŽ‹Š UÙ[tQº$¡ òÑF7ª¼äÀdyà„ªÒÇÉ0‡ìíBèTNw …ÏB;éqƑiûŠíô…êM¡Ù͸P%iÊTêu¡Šá¤MA>ârÈBe$ –‚éß'ý,(Ö*3îtW‚-¹‘…J:ª,(¥”…J$͆Q‰Ó+\'hudÝÍÇBå?*bù¢ÄÏB%ÏŐÎÝq-TÙù²ªì†Ûwْ„ U¹«@)`*?AûqtÒÈW,TÀûS‘V5Æf5wÄݶêzòV6¦'Ò¨P!é +I;@‰É!X¨0züUž´`Ýg¡û«ŒÞ…§3z͔˜¶P #A³PQĆ»j¬ämo… +‹ì ~ `W…**Hý…L|´^*Ts7árÚ©™6|#¾Gk¡rOçõى?£ÍMìƪl®=IüÜjE´+RÝL»¢3ÆW-–겡òÍRU¸ÚF÷ïCçu3@¸J+ŅCEïXq·YËÁ¿‰Cµ•¶´ªÕG;êP](fv ’Ñ;TnbÝãïbr'Õ +N0âzb{¨î˜aGèÎe"ÇH›É®Xö¡rŽ×fž¸L •ÆÚ~ï[ç $j pE=vŠFuQ$ñ’¢ªg¼ƒIÑ IÊ\_Z·½<³Äp}¨öóU0ÇÊùüPBgŠ”r¹üCP7iÊwüPš˜` ++à!€N?õéxS0=ý‡j8t1ˆ +í„nˆÊ;4/¥»2؇s3±Æ"ª¡å1 ›à­!*% +)͆ù‘U%Ñ3ë5NÎBTʁ‡bL±Î. +Q æ)TÌQ9Z ÔDT@b–{%å™BTL´L¸Ê2ºÌØuÛO%ÍÚljÚ*NHçãÿtq¥àCTÞÿ»lNëA›™(€vÒsÂ4@TëÅSý¤iӎ‹1j· ©„àºå¹&€Zà}†9;ؘ *ûɨAØÕŽF +ï!*ç$ q¤û9D h ?e¢22† +³‘A-ocŠ÷¥xǬrCT ŽÑ»¸ICT­%# *Y²ƒ*sã2›×œO•òê©Èl ZnªÁË{[uËQ´‡ª°ðóCMαÍêÖC•fë”ïi$¡–6¯¤¾ ÍØlÇøˌd+âᡲíÕû¡ Y>T£Ê +(ï *‡úØR#B~¢’­k× 1Deü·Âˆp¬;Mg7ëË£aÖ¸ ô†¨°`ÅCTBéHÕ¢£PZãs/D… |ÌE…èwx¥©rY¬Ÿ¾ÓhoR¬*~72 QlZgU–ø¥6îÓùß'rhiêO "Á¦qIžR}êø|&¦ÞóS…¨`9ܨ‰gº),‚ÌŠ…¨ìDËÉIº¼HnQoý„¨¨ÔBXµÙ§Ô‹BTtȜH^+ÀáßÕxqCýË"¿O@ˆŠÅYäÌú‰„¨Æ±Ÿy_/<„¨ îG/DUÁ¡•=ƒ¨àð4ÆQ]ÙÛÕ½žePó6%¢òŸzsÿ›¢“¹½Š‘LQáù16 æ#3W5ÒðýÄ7P˜WÃ\Ï!ª-ΑÁÁî¢Òö#ˆªJL¼ûïCeûk5Ò*¶k蜮&¼XÈîÀ¨¸R¾»Ø 3aGê!ñ¡ŠìÎ9ÄçZÿí¡¢ÔÑ¡’‰¶J=²«ûƒ"”‹ÍDNé&þ,ŽB¸Œ>K,„[Ò´‡*·bç©æ#+Ì ´¡*0Û佸ˆØa¨%~=\–`*øþ÷áO9o:>x»Ê¡òé?Õ¡jû6ª5o ¸`O#ëˆöHw†ê>¡Q h>•Uú¢’ç«V”±lˆª¿¶\qçk…Qg(ê0…'DÕUˍsL…¨l +†{„¨šÈEéù­4D%²]ÞGƒÖ®”]¥¿OI(qq3CT¸…+²uëa€‚¨ÜœI«úö¥ìÏ@TI¡ÿ³/笀åô½¢UFì&cÚA Þ}¨в_ni‡GØôƒÕ/exªî5=T±#ÿ„ˆRž…—dLv5Ó +5yûÖ×ðŽª”°½çLŽ=iÇFåÛëFÌ¡§î‘Væ9Λ*£1D"ÙNCå "ÉC%ND2Í£N硂 tk3‡ëp KE,´†{ÏC5è»ï·’°êßZ{ÿ`õ~ý0DU€_f'{ª1Ÿ ¢zjז"ª3“Èvó\â øeî%¢R¾L&—ö_{Û耨c×íN8 ˆÊâIÇË"¸®%ˆ"ĸ¾Ñ_¡¹¢šÙvýѤ 9@8ATò#Ü¡T›¨ÐC‰„7Øp`µ?T~¡õUæ)[áC5B½_ŒôΈÇÕì‚NÕCQA;› M6C›Â†f.CTãªjY\Ç8!ªkHq}sºù”ù;ˆÊ¬D¤QM¥žãˆÑe@dÁYIá7DEÔüa8ÍÌD6äsÓ"DEªt·v +!ä®?ÿf!DuLàÅ{¤Œ¬qVˆêe>Ò6~ù"”BT_is A¢Baž®åûÚQ1¹MQ*%¹h#*”áYpsøa¢Ú”ÏZåŽÔT‚·Àu±g:Iûރ`­­¼#¢‚5ì\äÈä(>Åmç(xh¸îÊrC™U‚³j§ˆE¿H's`ôáĤ›ˆJ>z0Ìc¤Õ<¬a¨¨>DT¢óLÔ¸Õە8™/t€Äï#*³ùs¸$aeú£Qå¸$äª}Ē¼l·(ÁÄ-RY +pn‚h#ãd\ K¢ÅnœT̤z¥Jý€§HX `A:•ß¼J—t=$ªf¿‡zÑÇD¢"¥s ½I¢º«¯¾ÐN¢2.AÏÝ©î Qý/µð‡t¨ +Ê÷Á-ITä"²3 ¤#ö…%œò×8·(ðšD¥›ÒwO䕄þu­Ê¤DXf ÂªKQeu[HA«æTo×iD…œ( •&/,d +Gi#*,Û²èˆ*+2¥Ìo;•Í˅GT’Núˆ +ØI“å.éW¨f®jlQý* ³¡GT!7XNDUÏғyü‰õˆ¨âΙÊ1Ð#öG•%üÃjx“ªìGÇâ¼±‚ŽÝÓLp÷q\M¨´ÿe,üY%‡øã‚51¤e3q+üq–U'<½Aë’ߦSGy‘'BÓ(>,ƒ`W™M£Ý·Ì0yG¡Í7‚„?ïþH›Æ„ŠÝºà}¢ó ߘ×g‘_å¥|ç,ԟ“ïóšO9Î̏„šš·òrzÅɆN w–K†“HÈ(éW´½R}éæE))<5Ô«öÖ³þ„|Å + RÁkyf~Í3 F@Uæ)g0ÒȖþkò¨ãâP”k‹ÛZbÍrçûôlÚD´0_¿³ vªØc½65dÞ·ÍÇdë–O#ƒ~؝û¾éG“{€ç—/U(ýôœ?C-®ÿcðF;B¼ì$Hj@¾Ðù«…<‡Ôì“GÛD6;/>!ÄZ ¶)™ù—4­\-;æÕ¾ØZxÆaý­@·2¦íó¶ä4e¼¾»²Ÿ%_Ú§¶V¬›!ó5¼=¥÷UˆÐô[”‚êN#J¸a‹QRª:öz8+ju +ÌS׶šMÞÁá”Ñ1îÚ¿ñ¯5&³!Š&ýëy!ŒMqþ.%~Òç œ©i”v§OVçéæBÌQ·£ÝunšÖøJ¸rxJ G{.ú ó™ú»NÁù‘ïÁÏ!ç$䉦ð/@Fâ +š0Ü?¼ÀâÉÊÝÖUèª;J›ñ€©ãcß ž +‘*kו1!Á:À=šêºu°[.^Ž›øcŒâòÌý%v³ëàqÜ?‡¤îl€±Ï +§€ˆÎ+‡9ÍÆH¶F¦2h ÖÎÚj°)Ó/…Ëk='ì8Kê~Ç@ÚÉq!Çѳ׳¦ +š9+µ=ZÎVpϯË.ÒqÝotº…¤Ù©\S°Ò9bWyLî&§A]0—"qp‚«€HT¡´*¾r²Är9{yÀ«QzÕ*\Ðï"'u-“´¬ŸrËU¸çVŠùŠÝ.·Ý`8t€3¥[• Am!{æâ/Yc€4<Àé€É„&‹ >؋Ú¾'g » ‚(¬¡Â{ÇHiªãÆéƌ»!OŽû:Ûo’5ï¯Á#%ÚʚfN…é{Aýք0²•¦)s®Q]Ç[ÆÓAsˆM )•ç£ÓccsÚm¤1å‰BFËn§;%\"œK#`ŒÑýá:­r-Élt¢ ¢—Ù~—År4¸« .Ky·õ Ø)ƒ(‡[esžswè<ñ +²à=s´'ÎJ•ëb6ògq²l!RÒ6Œ@<‹•³¿_ñŵs?#ù(¶aæãMp/Cææ“(•¦Œ_ì §à‘1ªäÛW¥ƒSÿÿdÖáÉWÄpþä‘£‘E<Íiô„óUå÷/€n8(ã:Žº7î !ë`¶Ó:yá +û_ÍÇ$€™ü§.O§ùbÕIЫþ ëò¯€j¬7r-ùÀ^ú„X+i,ÐÁ¼ÔـþðzºêìÊc%ç‰!,°=¿#×O{9¨dA£Ó&߁\HP‡ƒÐ½Wf•î°¶Ú¨¤÷~!Â@FYi ›çîV2cªhG¿Cz>µ$4¨`ò|œc|4Lp]:Ü_’S܆°Tq…ጷw…qýÚSdêþ€»8óÄÉjàšðß,YöTiÊÒ9­‘uÞúí¬¤ÙeæÝ÷;’p hK´‹ê 흰4€ù³@x7„ƒ%ý øºïQP€z\„ .‡ 3¬ðušý:?èã½óÊÜÎ8îpðĨ_r¡W ø­Lß«‚ü•¬8 vøg§›QNÃçÂ/塹GöTK[US颅»ñh+ dÞda¼Pô±Šaÿk(X:Nã?0ÂÑ7Ç8Ž¡,̅S«èz…XÌÔ;«ç!Պ،jxÚqÉ1VÜÓwš&àL…)în´AïÝ´!"Ã<ݘ¹Ó]¾½«E½fqÌ?E»ºÐ/“«K7Á¬Zâ4pÙÙ #ò’¿ä¹HÍ6vÉw;Ð Ü×P/IWé’°ª–¨WŽË™ˆ¼\Þý– Vtðè²ÿ7ûyl‹”I9f+Ùæ1ÁÝl\+Óã‹z˜ÀÛEzWÃ)ͬrqP¼wª `*¹™¤¬:?O±èt¥<¨øl€ÎìãTTW:™zr—5«2¤.ïÒ4«äíq}+ÊaXÙ07W”I„²®DaWRµà.¿_=ȄxcîRÅÂDrGb2…^ZŒ‘Wߋ#Ø/ëdö¨ªµWz¨‚tç-î2áh”ìïҀU8֏ÖVf€Bñô”Y„3—úò¾F&{JOo]R>Ì¿¶àÅñ•‡5´Ã£ŒÒ¢fÄGO[ïzMr½÷o$ïÂ$‹}°PþEÚ^eØÛŒ¥LÎ 4¦€.kcVûÕ¼`Š &¯ãÄ`]³°P¬S­J,‰R.K3´•ëÁQÂå?›¾Þ‡R†Í³9Ϧsx.~!;èŽûÊNéµh=œ‡:ŒTŸ+å)¦ã愲ð`A1p70=âyÂ¥ñc^Hî ï-‚xώ¼ËrwŽè³ÊÇ,€XÕX)°¶ɯ~J.Å L™Á¼³eIŸƒ£ò’ö²C +H$HC¢LGs&®A\U¨Ävõö¨µ¸ôâûÍ~P2×yÍ¢àR‰dé~¢Ý!°a•‚qZҟHa™›x”n´pyݬì;ѱjFæ4œ˜ê€î;Ê|CÁxj:'N©«#€új÷§ +Ž£Š{ƒé¿ÎX±<ᤐè¶uÑK:v*ìE àAö~Œ ™Åf,Ê~ªL¾/šPu¦ßí +>våöåÑ÷=Ò¥ÕÇK!ë4§Ê~CÛÃäšÌ® ˜ÔՔ"Æ::R<µ^0$¼Ø‚¬ÕX€ŒìóVõ§MØé˜sï‘JÈYŸC’Ð"‰:,t¶9Ã֙ùp"*?¬Ld”-„F%D¶¸[H*ûÜñÚµ&‹›—†ˆª Y¤U ôï@¤áÑ ( õk¥žLf^í3•®ß]½LƒÝ}[ÈsÃTcȖ<²”ãôëŒG–=ë6¸]eýû&Ø×­9š€B§R™XZ5f^ÿIõEnƒ +ÎN˜L2Ä? Ø P¯§$.œ +Å,£R…EQ=&ÕÀ^”°„^“ÍºŽ@ífþã[qƃd][²˜»8à¯<Žè]Iž~<yÉàij¿ã~|÷} ªÁ;œ é'žÛ.ô­/ ™(6À¸ì`å©ñÛ¨ß@p‚!tK™½z²¾røÊ5=`e½îÀÅ:î)D´'=ýJñš£=膒ðé^˜žg†²8ã#i•‡R]ýû)‹Z;ägdIø⍦.Qöšx’@T%ñ’ÿí†U`:d‹×ŽIÉIªÈØ®m–, +Ê°¡"zògµ€Ì´ùààéÏ–Ú2,Å‚kbõ[5z³Å9ä°ç8ø}(£ö• Á&$ñsÖx…×OýírãÅ÷¼ò/1d—œê…¶oDt¹L¨ï4·lô^×+¿`Ü28Ò©ú!¡ Ä_‰BM›ì´‡qu 3Þo´äÄÎs8ЖÙ™2DÞwU‘Ö{)˜Î–a!™òóuÕ¸Nj×Ù&~8‹°U·V){OÐD°¿:[¤(ÄTãû¶'·IÜ$Õºþ¨$ºcô`:íT ~.%‚¤É…Ø‘Á",•Cͬ?]Ð\M³ 7µ.Í&ïtÚá0程Á5`|Gì(H&ždjõ,Q{t…ˆZ"¡OKà >˜eƒ—ÑhËÿ“ׁÆv8Ìýó–®38vI :Âш‹—‡ +ãu^UÍÖ¦ÑWõɎÅs##è°m¥WfùÕN³п×ð‘þQ_ÀÎÁzǟ?kµ¿Ž-z•àH¢¡¹cŸq š2ܦÏÆì£céröMØZÜÄpÇ~^Ä +¼vjtSj¸cã|>§¡›¯%.d.ªÎ=¨ú‚8 È:Ýrò!Ä1Qq2Ð7ôæc ëpÎ732³^¡7 ±V³Öφõ"€2ŽÓ˜N6Þ8›lW¤œ È_0jÓí³XÆwI/”»Å2°6Eeìû„à¶Qd¼Ù–l3|£/Ñ@­}!e;œ¿@`ãÌ9iCøÈx@]â„R÷”ù‰`ÿ ŸßªÏۈ.¤Ì¦œÙLnÄ5¦4ÃÛÍ-9ÚCVžÉ­tdAÁñž0€p÷ ›|péØH¡¥;‰ÉïÐÐwÍñ(zis‘¤¡Ir—H…n;¼âQ’ç};®QFs—°áë#ÁAsô³ê‰ñ‡üƄÈ_?PzBÔ땫˜½Z€ì1{dNoS¦æ(Q¢'ˆ2ÒÌã¨T±?+Ýó¾0wÒ2^сxjÙOœ×Ǒ‡!š³…"R\A,"«›iÀΑž˜·[²Ò^m侍“Pä$µÖ%ÛlE“ç‚r WÍ­b´(Þon™Iåԑ +ÈÈfë(ÖzuÍhõE̛+-¤­P@ï–/@VÒÁ´Ã JÇÓ¹¤OGĝÊ2r‰Î®ñ3lËûUUzf­Òkð»ckUçHøþò5ÇöÞÚ̋:GÆôÄքfI žd¼­¶.ù9k#žÿ¨,ôèá(®àÏ6t˜ áãbø0‰<iÌTË{n@oÃX#¦ä(Wînéá¥oowE}bhõÎXšR§kA‚“ +šÅªâFä.úM&)#k¢*nñS4DKzÔk† Ï,êfZ±§A7¿ïeÑ«Û=à`— aBÁ³Ê í'å¤wfºìÌ‘îGƒ ^ûRgg'Vôõ„dۙN$ ‘¶x‚†º]Jvã#…NÖ÷"þççψI§æg•ÝEØFˆw6šW…ûXð̳<}‡¸XÊåÇ4«Í–Ï!îÀ°¶4L0 òdµv_¶ÉAúï–øe]"R©tÁ?\í $ÜZ¶×lù¡ê—Ö¶6õc ð•TVÇöEôzñ:^(ý9-µ•ÏÁs´üÅ_à1.ïc&xøüÎøer­Á43tîï7ÕÑSPn¬Æ«Ib$:XGq4*!ïü»×òË,lÖnUªHA·a±¹$Ö8…$V›®•GHó¸ï©vÉvNl É&nÿy4O+¢~z›0vžäݠݙÖþÃMWÏZŒ¾Ãƒ«´¬óÂºá… +Ž½ý[t?¦nÇ4–í“â¶^sêß ûO7àV=k‡Përtxhˆç"¬Ö­°oÉ\{—¹Jê\ÈõÿºËǍã_.²TbÕ¸ÄYiÅ(]²N`íy—)½)/±ÞË×°¥w%z•Ú8/1É+éP­pºFZu¤{ΗIJÍK/¬µ¢9¹Öt¸1êÜò–­²1U·Ï±YæǯyÒçààå(܀YP¬*-_£›Ê?œö¶3rÑþð;(UÓ&­ak00!D6F› ‹ßSø7Âÿè_²ê²:Т¸žj´„óô¦É¾ ”$ÖAŽŠmü¯ çånj}귞”P.eä; Æ.ºhR¸ÕˆÂ??ÏV±œlþm«p!cÔÿ9Môp\Û6©ü"(Ë!38~Ð`ÿoÆÄ4eíø|‚ø¯<¼pнúæä­qvƒ*Ê&íLèÝö0®,`Œç—Ž[O›9z6§JÞ'ƒÂ¸lµhhV(’‡Á½y4¢«¥¢°-˕yfGà¶NÄ Xî"9qZà\†T+“ª8ßÚƒ¡§§¹Ú PŒ£Ô©¯êŠh:Ò¾1L,Œ ƒSGpŒ‹‹[â±i@¤›.»G:õZ¨Ñ˜­/M7웈l¥ʺu¨ĻVbãn3;h4ȂYÿ MÂúÅÙ¸Éʜæ Dƒ·.GâMu zzÁnE½òߡÏRÑ=eJ†¹¸Â®°ßdäuŠüü$lÌCÃÂÄÆ i&ý¿À²L8Òéñ?ÀТIŸ +ŒŽõá~\·²ú[§Ä ù\MìŶ6½<×¹VÆÎÈuVŠâö‚Èÿ\–þ‰¦q €êç2òœJ¶D„öóÖuá…'8÷ŽÑ4ƒZjr°T‰Xô„ñ‹CqÈ+ëHVlR‘²¦SÂ&9ÓöBÈuʘp"£á¸@jˆsöŒ¡zj¥Iñ.n–„>?‘­qŒž³¶ËLÁõM¤õ ÀA ôȨ~áiÖ°@ Ó\£3eòç”Ô·?æ” 'À~%Z&@ÞíñE°‰[sHw²B´P¨úvÜâ$H ý|!ób˜q¦‘-ô~2Ú¿Æ%Dè*NyƒŽ‰ØræJ¯,J0N&¬G\ ï8bÙO¯5€®mBÿJÁÓ6U?,ª*‚Ôe0 Šy‹ Àê¬øc˜ƒÝ9W/3¦«ídè«I!Wß¿ÔÖäÌLZfR_@ž—‚":%YÁ¥éð"J·æýï¯ ö¶/¼R€s7j2õ‚yòŸb,K§x’³êJ!SwGJE=ïd3¼1<>ÑCpÐáb» $’Á¾7ą£dœ³,ō$ÖJô±â»á +áÞ³™J•öò¢#ˆ0Ó¿Å¡(g‹æ²ÑKÅuòܵBTfð¨~fö`¿ +dÀ©V¦Côv±¸ e2<Ñ –S§D0éä}«Ææ“P¬o©ô\΂µk8sFœÌ1)ÓKÈ"pA¬gTÙL°Öµø ku,.BÌõ%’‰N`ŽíM¡\‹ª|' “mÜà]`$ð4b7ñª#÷󤷈’|7´odÛ +^Ò¿€ñ»ƒÔrCc™e™Ö"®óñø•ýõøOìñd–¡gyoUg$`t(?£ÇÜ0Ð-»¦ ä¤ÞtûK°îÍêÆfB‹4Ä2]#° ÀÝ»IÆ1lì–çê¨ 0áÅ|Qøƒ›ýoû9D¨Žüߚ,1Ì;„ƒôˆi–„ufîy‡èÏï®×å÷ˆB½©®ª˜öEˆ:ìNçšÆW›Ôp¥iSÔÆ3/È{G]Q‚W¹áÛ\bòCù÷Æë»æ~‘áp­2Ïq–gn:â=SÄ°> ½õE£Ô³ÅȦNc‰"Ø »;÷(ƒOõ„>—ð„²¾Lž›ðæsúA3ÑíáÉꂝŸjÎ2ý¶«j·Þ +®Zn5@®k Õ£ WMlt`!º HB…Dܙ5ãJ£"j*ÊN» ÐU8j\zJ46Ȅ¬Œ7¢‹Tð¸HèàaŽ÷¡; Ë/°üD3?Ð@Q[‹ÂâÆ …D]qxÛň;Ÿ„¥¾K˜ +©óڀŸÔFŸªEÖ¤'Íj…) X¶íþ£Žy ¾³Hé綒j¿Ô®ˆp[ æÏFöëçP&¿w# L¼M^YºòC–4¤ùÇ0Ü'Ne݆s³Ýv©¤O—©íƒê{ü×Z¹¨:•|ͨåIaÐS§v%Ü(Ð9=·l%©Ûën@6›ÆhYÂ:=ë)žöqTàMŵúÉ©ØÄ&¿ㆈ¶¥<2~(´Òÿù÷óN{ûBXž;é¾%ó%—_ÿxþš® +ÄÝÔk +»¾'Ÿ€£¬±Æ‡R}ˆ0¹Ú¹.­)¨‚È­²³²Ì'O¬!Ê\[l×°Vòs µ„ܼ\*ŸYÙÊ_r žæ,ùgâ(26×+q§Ó"f#™Çmõ*FØdˆïýQ£-USg@†`ºÅ×Ju©V‹ìIÕ”IDxBiij³ G¼Œ¦¶øa.‹N!!FP+ˆg2<¯Áó#î•dƎþí›xHŽ&4€ˆ™î~Ð"ª…ì‘ ¢¢'¯íy”ۏZ%ŠÔ­!çÂP‰„l?Eœ¹Ê-÷õñ‚­ÖÔïO—”áæÐáµX¦Tî&lÐà òÄþƒÌµUhºr?‰ÐŸ‚Á¨´„§á) ¢‚*ë,¯×ùÅ­§ë!Ví‹YÑejâ?RNl[FŠ¬y—³’íVšDⱑÙé‡òZ9r+'¸8±Ì®ø=”>¥IÙ»¡áüÀ79°ó¡~ô‹Q.cVlÐ&„¸r"ò‰±ýpªúóPŸÂÕ{BKö”Ò"N‡i\RÖî#0qEŸ{±Ø_ï3‘Òkû×)¡¢.øEz C±@í òðÉÎÅõ¨¦ Td͊ŠÉ?p%± Àmä¢ ‚âÄ6ykF¥Ñ»ÂIþO…— |ÌLoŽGª>Ô'F,Z’öƐϞKA0ü.û3)Ž{Ÿ.=ú†FÄ¡Ýq¿F +"Û-Žê€îsR WcÏBPp0ogár²Ó±¡-l'(/Y>é¦ÏÅ þTþé-ÓµÒ§r¨d׉¶‘ªZQC¤9$!¥W™~ÐJw()Šç‰JʍBùTŸÏàŽüžã=É,PՉA´0¸³4òMÎwt+¿âÜX§–;)ÖAã9r-ó»Ò|À`7Ú±å0¯6€ù ¥Û~TV(ß°O 8óÒIÖÒk4/Ë9·ÖV3q©Ö²®­ðàŠ‡Ã&–"¬ÕC­òœÖ÷ÄlA*4j6±mLә•“y´r[è//Í +$åˆkzÌDqdø! õHa‚ƒ±ù°‰Îe2³½w—8;—¾¦k±7O³o¸¹˜ Ï¿¾?ZâI‰™ùéSÐèތ¤Ÿ6\íœÕt &r ç §XŠÙZl¡ps¹jۃ¯*„᛼XÝOi€„˜éçä'Øå Ø]x~̑ß8ñoÕÏ×K€yÕ§–Üø‘’Ü[`Í +t—ð„ÚQª©nÀ¬YQŒâC…xÎÏfØakMn×ݨR#Sê Ȧ^øÐ 7[ݺ-âVšfQw‹ÂÙ1›Ü¦{“s!ùËMБ×cz¹{¤áX#÷J'.½u~)7§1sh_”Ä ˜Öãxù­jð[dJåi(yG"A€ht O(©¥ÚCÁ|’Gn]„tkDô-J<Ý»·»l&%™Öø1}þðõ“¯DjáQX̎)‡7s¾ö;Ò姦â£2F*'À*–¢ÑÌqJvA,í¸`oŽj°þBŒ).osªPIŸÔ™àaénÚ1Ô0çâØ @ÈsOGROﺘÌ툀=Áˆ›k†éâ@c}§Š¬ aß:™É/Gq,´¦;¢¢Õ˜ž¯¢Çì1áU+(!iI[,‚7DÂin}¡â~Þéfo4œš"_kr‰‰B&Õ/£0»´•„ñ^rsÂ2DÝw”öw­ Ã!Pè¬8œ®£öÎó/&ÊËЧýëg*¸U ¤ Tzõ²ÕCÅv†ŸoUiâÓC¡©mBM¨`ÒÄ·¦s¸Ë±‚š¤²þ†ÎáèâQ/U…rp%ÀíVî2U9=i§¯÷hl|q´A,®{f¬=´Ç.ó+årÆ~ã +p½Fº_r3H}F eb@E™h&NÊÉSäoóÑ: Žt*¢Ñ²×f@v+ÆêKÒKÒæÀ†¶‰±®2ï“!o&Á5ùÁȒ5åÒ!~¤ñszD/1Päöpx`Õ³xؘU?]£ùå&šU›$©^d37”©a§™íógÔíw ‚,o*& ~ñ°#*R%ŒÝ`Dꑮ!H¸(0¿jƒ®å­™‘ÓÖk:ÿ´{שb-„áö|Z;½ð"¤>˜QzñW&®L‡ð±äpZ¤+¯âÈkxMÕ íÉÆ”^ÊÓs¸:0ã‚<"€u ï. +hlî„̺.m¶Ø1%Zb_Š_ÑͺoÿmÏl›ƒÖr@¨…m\V@Ë ;Sw¡‰0Ù—k€§˜ŸI.÷u;µ¦?çl…X#¢è3ìꂣÃBq-ÙãoÇÒÅ&‚ o«—­\fv‘¢Û¸ñ!¬á¬Y:uã[á"Xÿk’ãnaÐTQX iZÚ­öÁcW`kÀG}˜ À›§ +ÙÂy˜! +Ì*Ê +¥à$/!³$üØâGAžq“¼Æ'!Æ)-<Ñݓ&Z§éº<¨4{+d–ÍøY‘ œ š •é³üÌn÷if°=ù3¤­¾`ˆ„¸ã8ŠØä<: ýÀƒ[î–;œó^“äÆÀ`æO9™æxϼ¾º§w®|“ÑM1§ÅF4¢?a"üNzM™/'”ó%UÊDu~zÍÚ2 wÀ‡U'¶ Œ*v"Aøá t2[ùÀ^xW&K m°ù4²¼½öC½´ôþ²wö‡NçB¹oÂáA1ziH†*¡=I|ð~6C(šÇøp͌].#å—Ñöl\FT0²‰¼@§aU$ÁbÍJN¢HŸ ¾I\¢Ý =I ik)¿ÍaHS+µèjsÊ&´ÿSÔ$cÊîÆîf¤9øàÀšWÒV¥?hÙY§—‰„ f®‡x‡Í Fäþ],YLƒ]/ƒ"Í‹!‰1FîõBp§yüÓÊ6E*ô«ÓÜk¢b®„yxžÎÿ 4t¾FFŸ6bœx©æp‡,.1•ï±ýPõ6œ@ßȬ~ú gË>”¸É{ •ÊdtÀJ«¿h6*«àÃénÔVrYÝÌBÙ0!ˆpЏÇGÈ`xTš‘ÌŒ(Ú÷CÍ& ªM”W` Ù{”¨¸B×ð>ž;Rœ*¥8":ˆéÄÁ Á2¸ %tÙP¼D΀€šCéóoK[%I$RÀ@ýYNå±O4l{ëD²Æτ.儌&I ·¹í"˜1 + W4‘ÜKLÜG,fö0 ÃY¦žpôøÅüYµíÀߏžø‹ò:¸oȑ%&ç«Ë.²‹œå5•ê&uº Ÿ %àý`@d· „b{'k²ÒÝPS2óS03a%ç¸8‡AF‡ øRRv1é´W5ªÆÕ †¹ÜsÉ(µˆl¨‡"¥­ZEŒ Ð{TE¡\Gpœ¿âh4'5󝉂•#C„.Ÿ&+ „*½©—еX!Êm~líËâh °˜?–ó˳šê䧎 Ä`$,n¤Îèoàž,Äõ('Œå¤\ÖPÈ#$Cã´i´p Je9R{ÃÐeE{˜L®šäÂÖ7Š@båBŽwtãL#,‚w5 šÆ7:’ÛÍ YìÙÿ$ÐN“A6O²w‹ªÖX0?Ô2ù©Ìzh©¿b†Ó?Ž{ìøGŒLÊÜ«…Η´ ¢ú +[,%“7v!³õéDS‘Ãôë]‹:1\9ÚmTØAn7"cmVUá)Ÿžv y“ِÌB[𬉥½m»+8+žT®Gi Aððõ[ûÂÙ9¼3‡y2ûKic ûÚÎK˜Q/û_)³º€Þd &É,ŠJÁÂJ3˜OÛ¢’Â5(ê- 8 èøï=–{NÅ͝‚<Aa>@ãæ8q:?9•ž—,öw-®'¼J¤L¯ý¹Lä\”Ìu„(4ýº[Žqó4›:À¢²¯|óV/:Û8´JcLm%9`5hj³âõÃ.߆§ +M Iš3!Xà®àÏÙ:ù: ;¯)sL“Î9‘…Ðlº?1¾{ª·¨U¢Ì]7©BŽ«„òS…)û1µ•#AºŒu¦@íˆB¯ *:ÍVíPnM¼X™èF‡x¤’$IğGÇ?^Ï»˜QÉÞ°jA”¸¹\;egþÏlÊÈV15ّU Wž¤÷|“Ј9ãW)N +Û7Ïq”’M1÷x®‘8¨…¿±9굞üå£u†„b%~„íâ¾^J)ghøWè¿î«Ã]Aæ…á¯i?BL(v»×ш™9²!r¡ŠÄÏy{EÄr™t<(®Ó’¤²’ÊÅp‘;»¯GydYHp¥ ¼úŠ'að öW/¥ªqJ"<6JzAü¹  3®™Æ9 0Ù5gr~Ùp„ýßðã‘"$§äfÔLŸ= Y{€§ 8µ]-(7û‡³ãy¿çƒÄÒªÓ|Qâ> ™€¿¹ÍHåـ8ìÞB¬V‡bží;`|h(Ø: #¾‚$M÷ž–øë„âŸ'Õä3èDÚª,.óP uŒ’•õ4»ÚŽR`aý1ü›P\7³UlÂ3¹o4sÆ*š  ©íæøÔ0·"¥ËͺÏÞÝÄ +¦Jm!ŒˆŸrù¡÷>‰ Hň¸õëLŔ(Œ;#ÅèˆÞõZò}d7ô9ÿ/ç85äs1¹)dȨG˜þÅXô|$ólp¯î\Õr|‹DhЋ±wªóT/5ÚDÄçŠÄM‰P ÀQl—8f‚ (àÞIù|!~(Ún HÛ2aV +P +4€ –ÖŠ¥" 9€PñK)Ì„eT¡ýÿü i<±h‘|È¢©’C‹ d©h¡»O4ã’,éñ3Š>Ñ ½ÁT {„ŠæÙìA«8ے™™šÍ¨çÇ I\CfR7fk)Z,Ô Å !ÑP6À(ʆUÉ &“PKa<‘¢}ýUÿ ›h\YJÄFt¤h‰Û +¨Ôãû(Î~"ÑL)‘½¤ô¾Ë¹}ITL‰­Æ¯º>,Úkó}‰LÉÚ#b«€‹Ë/L}|_W[ô…Щï=Y˜b[­yÍk, Û ±b›þf¢”ÚjIwÅ6ðþ)h€§‘݉"õöÄSû÷a(è’ßw}Râž]ã¦"¶ØJÝÚØÚr`ž“ƒ6¶DB +sú ˆýؾ +²"’3ˆæ€lù غ±Ý’ÉMق )`†’í( Ô’í#)@@Év‘£€²)ÛgPT¶kÔ#ÑYÙ*º\Ù®R˜²²E±»èåÊöVV@['Ã,`‚Àß˖ Qþ®Ax!>ý7§2S.A$dù”Tù´×©ºBò©»=UÏn#°ìͧÈ"T@°NU¿> ðTšà…#B§ªþ™`Um@®jܟSXÊñ(}râåWµ&ÌÓó±DTåÊïOôiõªZÚ+ôIاª +¡VÕÇÔŒ&ôéê©êM"ÿI9i¿R{-à課bɟº¡KèÛ +dCö•b/¬V ûɧhRÊ°û\ҜõA²ÔØ¿ãåƧ|þ]5ÚEþîªþ_\_J†Îô¾z?זÍ‹QdŠ¥˜][MÄ$@‡fØª–Ž‡Yâã”/Ëß2V8øwFøQõþžíH•üm.§T4—}È\–üˆd®w”ú™Ù5éµæI+’¯= +-Îyr”O™ëÂé4Í¥K&¿3jŒ?<ôL©^Ê\xЀ–rÌ¥908àrQŁ—A“üó÷X$—+ðªÂn‰I˜´ÐÙzžlPòZüªDàjñ,\I{Ä!è™â°ÄÎZ(y!æò^Ì44g®À¶PˆÅZ&ƒ‡õM”nhÝðþ+;ÿ=ðƒß}ÊàZàþ„9Ú×0€°ßé멸¹"…ú¢@gá£Üç;º¹(Ú|_ÔmgåÍå5qÎ%fȗ¨QÈ'2äá¥Ð¹N¥`óSkˆ…²Xsù`Ð +$0ì* +Åø9òÍ# ‡Äך¡|Íæì½Gså·åà;NàbEE“©|p ²t™ý<âÐIÒé¾~O I.[9³ÂKÆ-ê=8­ÃÐÌ]ÙrÉ,¤„Ar*@ÃYñ,I¹á–Z¹ˆ†ÓÛ:2ÐÑ«s;ÃopaXÍhmO(2©6+@‹RHC*"Y#%ø^»•¶Šþ)nØäm•ËQÆ·cÈj{yȕK¯oy”Ö‰r½¢³%CMŽAû…*fÐÀ<2— “+Ì£GeºG®½“>•·¾aÈîh{з28ý4Ù­ÿÚ趪 ~˨6æµø`ù¦¹‘Ï'¸I‚äZ ½üȳôdÓ¬ ‡-k’„˜h >54cƒ‚§>Io†*¾ dÁ´¥)gGeYªPN\¡”h·  ©.WC¡òìm8âJbôP‚½"쐃<¨” ž@ôÀ¬ƒcX¢¬z„Ý6ªFVX' °A¸Tˆøõ51|¨¥ŒÅÀcPÂëv"õoV(&Ò¶À)¹hÌdPLS6"Š\?P×á ¶‚€ƒM„©PËÈuÀ!¸áq­–Ê€8I1e¥Œw.wÉã¢äyKÅ~ú:ÕIêˆËÈQ£Â®£NTȺY!T˜z({Š†Z!Ÿ +¢¾Ñëñ¨“CKΊ…j¤ø>ú/ò“pÍß0&Åd‰cà3¨~÷*2®c ÜܸZœöà(0A±qç­ß{㒠Õ+ܸZgz¸6®%zrl\ +v>g2oò¡*Ÿ²Æ…rÈß!„ĸL`úçc\Œð*/§ÿQèÆû¯”¦>š7šrvOô€ÈÜ ÐEoVÇUˆµ‹ 'gçfì²Ø¸îÁ¯GêX#®ï ·W7ã2 +ªçȸ>EPá!cúÃy€¢¤¿Tœ|Ñg”qõTèSÁÈûÜ!$’C܇ÙYÓ8÷KA¬As$òå R\M¬¼–¦4ùU˜yWN?›ÐåÇdžLwCìûZQ\Wfá-)®‚ÿ>0Ò³¸QJ,ýý¢s}SÈ8{˵ÃØ«äÜ­Qå¿ßóÙ÷§$¥?l*ª(®Ma›p‚Ún8u™>ÛFŠ sÌ ²!jí°}}óëk ìº'‰ IÜ: ˆ Le} â‚"ûþ(¬!M=­êã/êԐ^>=Û²c¨étLnsKÏäo + XâAö¾Kҟ_ô5iâ˜D3¥G8}rrЬ€‡Ôþ¹ˆW ﹘¾DžM1ÕCçÙ.J*8§$NlÚÛ=U{{gÛQÎÃiù¦Šš(Õɂ1z£Z„êP=FÊ÷—L*a éáÚZåCS/ãK[T=Š¡-)ÿá%NŠå. …ÙZ¤9˜F¸QaÒ]ÔÛ¡@a‰ +öäP 踅…¦ „¤’×Úãd 짙®4Ÿ&*l­x-I1¡¦Ì<N„FE„1”tNËiQãqÓ* 6=>АM0D¶ŸPÎ4ÑÄYÖH–¨µFcZPk=jÙi2CFùµiÁˆHõë%:šBr{ÂpZå–(f²g‰˜RB+–Òa!V-X™ÑÕ¢E‰€JBޒRa Ã/%h|A‚–pÄ&5îì‚}÷ZþОå'ܕå‘D\ BG¢Ð§FÒYVåǜ{*%gTÉý=¦"øȾ£Â6kˆ‹ëˆ^žÑuYî ÕF[A˜¢g`Gfdß'F1 Â^Ä#ù„v–Å›{,°"žfñ¨²x5¤i› ¡¤¬€›ß¨Šˆ²iµÎ‚ÈcHœ‡¶ô±Š}W +!<¡!È,Pl…ØÁz8Vä:2cTŠYÀ:…, À‰*§ €ŒõAïß嫪û×UhÄÙb]³ [ź¨õçÅ:C +ab PñSW–噟4†uÆ!?§…U6…º›èâ'Àg™Gɋ'Vp&‰G…y½N§‡V"ÁƒÓ3²¥ ÍÖÎÜQž‰)×¼Öÿ•xî†03ì¯H’Ò‘Ðu¡sp¢÷œ“«Â'æ€"ð»¡@’﮾òb+ð^ñâØõÜ-ðpbÔÛëH¯d®ö ú›“š='yUÈVÜMÔëïJÌO€…Ý•‚RÝi»ª1¨C‘]mÁ°É endstream endobj 112 0 obj <>stream +%‘|o\ºlH¬…m§üˆU*ö.x…®y­é܈íj˜¯=9+´óÿë® ;#Q¥_ěÙÛÀ\ÿ1ҒüGqӉX:£‹ˆÂ½ +W;”túº!zDÛڅˆY´(~«7dB¼c¥•&uBtÅ!èÓÝAŽd˜ò >_yÿ“x šâû‰ˆÂ[iŸ+.þþpz$^ÁM`ð~¨¬[™ ,ç>ÌņDhZzD6ºß¯uâö:tã˜Óaï/ãYÇÍƯ_Ý`,ëËa‰ ~ç²Sΰ¯ª¨"bܪrùy·a 5]Ш……ú¤„¢U‹zíõ‚ó½†zþEv{ÞQòb`‹…#<¶#!"“á,d]¬–’ìHWŽ +Ä@iyÜ üB£ƒôBl½€G7ø]^¦>ºrãø}Tòî#OäöN“ã¨fUÝ27¨fcÍðz~(Þ_¨ ÆmBß鈜ŽýªœV\¸VSè¹ Fö bÕ!cšlx™`vÉUú€„Àžç¼„`{Þs†0?,FðWp88‰ œÃ6ìñ¹¥¬ßXÍÜð«ÿ)ä ÊËi@³„Œ E¸%ÂU£áºß,øŠI`^ԏSÉ :!w[À¨Æz°@Œ¨ü;|Ò]ÞÒ@?¿ îÀMC^õYo†ÕãÛ­‘2ÂÉÕª°Ã?få—ú÷©õüˆüCáòfíNñºßXéRò…©åãFؓn{ÇêÀ?Æ×;haHÁ£tO9f²T<ÉɌÇ5öœÅÅm‚µ íöý·Eöq1Ʊ£Ê..sûøÁ··ùpºX1‘³ÛŸù/ÀÈðL›µÐÐ"¡™TB¡MooÚ툱ýCÃY/Ì +{ì åõ+¿–9NÚCø·ŒåÕ¤4iMÈ?ŠîÔyâÅÒ²„¹š3‡OW´^X`@S±”‹ýÅQbC.ꙵka탨 RÇ,…Rb ãGPî1^¹œ²wlƒzžôÂó{ ™“ëDÕÀwmõJœ‰‚>#VW´žJw>! sҁµf?±ƒ\‰¬fþ’çâ´4m¿Ë$ùeu¨WÏüüЁ +礼ð´Ž”ÛSãy8|Q%$àö„½Óã«Îô`:³ÐÔÒÚ9rƒ p9t_‡}‚“P ëXJTó±¡àH5 ù“3v6Z2°Ø›ýý¤ +Õ.fÆûç†H1"‹$ò³ËFýõé® 9iþ®<Æû΢êyMÙYHbül¢iBRðTrÄõÂæà +DŸ°« uÉ.Ïà>ô*o@q† ‡<ËLy0ô–‡¾/ãuáåçqoNö;ºð¡Š¤$RˆS.€Â _lc4È¡ÑU¯ð˜] +±h‰ÁË uÒħ½(6>ªRÏwö6x†lcÔ² Ý+(kØQ®˜ºÙ[R„$Aô¸Ný{ÐøµÿÈÔE MÅJ„}«¤»…¤ŠÔâ8ƒÈÉÉ¿–†¶éOhU²­Ð~Œ Eßes dÍz4 2ï³m˜-‘1¤è‡I¹€Zñ¼L-匓:râÒ_l q s°B^+4ºÝüug*ړ§˜žƒâýX-É æ‹ö†þ½qF{m¡Fڇ>è e\[9¸ÝÞë璘§º£èŒ +Õr[ó'¯‚ðB/˜³¤*ÚKöjì…Úè­p+\@8¶¯fŽ;ÏNÒJavÝró{ä@ àŽ!¸ ¨ˆÜr¸Â=µƒ±&5µ'X9ˆœƒÃär#£Ï6äá I#ÍFdíî¯cÛщÎdr‹ `ùD§6*Umí X„ (ô°p›ópŠðh# l¦ÕM· îEìþ:Ó×Ru É0y +pgø:5ßNfEzKÃÎiÅáã9y#Â°!è2Ñפçd'‰ròQ»ÌOZUb2Y±õ`&…Ô9›±piÅk“”ãò¼.fa"§º X©ìvà£+¡"h8ÕDU2\ôÊ ¶>¯ æÏ:ƒGqe¤ +¿×š0—]O0p·ôø&Ù®Nã"÷íaT‘äˆrò†xÎÎs}q˜…sêaMûõ`…ãԊm¥ïeU>iۂ®Àì+ó ]~u±!a /aàÄ¡ª²,ˆµü\À4èð‰AIdÂ(E'Ÿ&\€¢®×ø'H4´YÃãgŽà3כó± ÐTOð Š4±1¢™Å€´ß°çëµw#lÑKª$¸ûÁz›C*)·ó[¿Z'1é?ˆðYÀuk °AµÍÐ~é^I36ã‘-™†$ +?xÕͧ–Ɔ ©P<Q—¸BïNKŒÛÌè¬û#H{vŠ#|—ntÚ-àD2éÀ 9Tåp€šr»Ü±_4HŽ[@|„ÑI'æ †%à—EMIf•f‰´W}ž|„r PuHOQCGᏘÂ- ³àEi»õ|[@¿h/´ZÌ@F}Mu4íe4±è‚qÂs¶8ámÛ¯>‹ +·à Á¦…ž4eÂA [É.[ÿ tdŸr”Q5ÌuònÓg¾©E¥öœ2ü”Ö£°lU‰a•[À᪷ß0Ì-à´ëÓ¯E£ùq$ç¹,}•œq¢:5ð§ÅzwX›[TÞõDÏçtd lš^‡áŸ[ÀØ-ä‘Q§ã}Q»PÌ°°zaš°j$HþcĀXíûO”ÕË0s |•d§cP§° ËÐa9 ¼ O-†!\{' +>^ Ûðõ?þ±!é%…a„RÏPkà™5 ‡‰BB>ö¥«˜¶Ìð.ÁSc~wub + ùÃ莞ªEf¾¬GÔü`Œ?.¸?x9[—(êefßÜ5N>À¦õ"Ó=>Fed^vþ„YûV“ÃBùþ(±]δ1ùlecÒ )jŒZûˆ ÷PŒdl®4îµÚwå±àÕT±“¶µR›–çÆÁÒE æˆêY`)QØ߀ÑØ#þ¼¿ÚOÍùU}”-} I$p鴎?3K¯t3h 4 Q츈†ŸÊº…™Ñl³+‘´H]—”©@W˜të3ÊÛÚ×sÁEŠ*w*bAԚ' •VКO¢À±„[¸7oa‘$„ÈÚ" /n¬øCB PÝÂqXa}&QX±Í‡ü ¿YŽt}ni·aulÓn¸j"3ž&CQY•äJÝUõy'­tSx"õԈ¥@f¹,¨²ûÈ•º£§'K5N÷×u?Mm\¢w•Çô³MRÓÐNP$ Q AÔº¥ÀxDäÄLqN«ÔçcWå¥1‘áËõJYc)Ž"dz:扷%+ÃZ¸ œšâB4¥ŸP±™éÙFœ™R> +²±É(†k¢ä*ScÖ{¼tRÙ^’¸´õTg‡µ~z ʴŠ?1'VʧơÒGÈ\¤4¨Ûx®¤j5hÒPoوMåHm§Ü[Z:CF±!(Ž’’zÒe£Õésí¯Vg9T,£Œ"Lµ/€Q¦ü &“u ¢ç+é^µ+]Dì)¥‡Öõ“Š4”Ê”Џµ„ríÄAóHb2è¼Lb*h p‚·09¹u¨žsK/ {·D ›†¯ÖqH@Ê ò”RB¹‡Ú$Ó?«ÒS.5"wè©#ŒTí4;«·R|€®px°CâOfBñÌø$€ž=K“0b}óœ5Չ<­³*“{!©³õ´à ÂIYÝzçðA—pgW —äôè]QH‹ÏaÕ:µÅtä©S݀ÜUÍl‹Ð©Æﺍs’=k”ÄœÌʉí@!çM”¬Ú +êD! Œs§q–ÌdÕKY%dwXdˆ³¹´º‘nf0|زž¶Uò„ÅkŒkò;ƒ“ѲÇȾ¸i‰KrÚ G’!Ð-ŽÀÊû1€P0x÷`§VÒuQüm!Îa:8Ðü'pl«$üùùZ4XÐ4!èVxûÖpAëuØY½-ÆÀ°ˆé‘P´SíÔ3Òwä‘$ ÛE•®t%4jÎEÚã`+ + %Û:šÚ ̈ýE·´}VbŒœœ"H¼÷¢}wñ‘åD7MQpS&cÚ~e8 Î¨À7Úâ<‡à‚uF§üÑÈæ`‡ëÏ­âöüü¯Ê;dOѹlÊU¨ïÌ^JԔÛqÍóøßcß2ÖÍ^%É:õ£ç!u`øÂæöåZñipLî>Œ²škt.ù"ÎéhÍdyœ´´r¥–U ö|7? MÂÖî$S(ûâsøþ6 KßISBÇåghRu<›ð¸oK0Idñ«;Y4ˆóÿ‰(Pt„˜`³Ïk`û’óìw"^UۆïdL¹9~Œ'à^| ddöA‚ÿ‘ÉO~v8F4ž„“¹LqsB¨ÂÍ$°Çw¼ù4ܟ:¤Oä8:n”È.ª|ÇF‰çh£xܕœFÀO H~Œ­ÊèÝ.„rόÓà(´˜Ù?x (Âœ¹À´¯Fùæü)‘çEÃGT„ê'¬BþÓ·Š×„'@…aúòÚ³ á¥<ªÑÚ ²ê6¢úp A“MƅºKÞʵϤfËúYÎÑ_CÉe=sڈ–•ímSBÆaapqé1!Xì…oJÆ2G™Äýѯ/ÔDZÜ| ES÷@zۅ۬?Èåãäâð€®°°ó6ç¹äŒMÉæ0†þå¾®eY1ÏVEyò<Ås®T׊F@<Îj ž[=°_R€¤š¢L$8iy 2 ùsûÝï5ñSÄ >†[j%@Ž™¢Ñï„q‰\SëÀe0‰0¦BÑ0ØуnŠaÁ»A§Úí‚ÅÉ~c\lJ|ÜRñãÑ_q¦`¨…#àëè×&fƒnœ\"Pµxªî¬_V@ÁœÓö†ºTl¾ð”õáÚRÿ‹jG+ Ì/üpm9|0\±–d¤À”aI”~|Ž€¨ý J 58Yô+ç”~"îƒx›:_üy›A ú‘¦ RO"r(‘œ€ÁmՃ7G ú¯¦A>ä÷?»üDà¤ÿá<Mg¨ºFŸ_xôŸ5Ø°G1¦Êë¦4°¬yžåa^K‚ÁðÙGK’Æ„,†þ¯§uñóuú‚L Üî4„‰K¤ŸŽ/·ËõzÎ,3{w=µ¼‹€&!-h“O¾•ŒKŠtäåF 02(q]ˆ ÅEà؊,èv‹Às0â”%m 1B@ÃÌu" 4¤_o­fÃz rcHú‹&OŒé¸AºŒÅ°¼‹°pAba‹&²Œ*?æàsÒÅ¡Löª2KÑT®¢@}•¹ÛÑï2ß߉€'gj>ÒI Bå–Aw6rG|þ]#õxðü,óâ‹T-pOp†[OܤÿF¿PïðÏÃp-}£±æñ ÕØѧ­)”É—æ’IªŠI§Ž¾–‘Øc§;2È"`с‹yj¿äs•?ˆ¢@{Ù\ó,AüåZ7$·ÁIÿq읜!xþ‘tc ‹ÜÎ Ò+šÿ-bé|øQÎBÍýt¤*Ô×¥Ã~øÐItnóÓ6ÍçôGN%{ä•ñhU>"GyÞ^™|F¤›äy{[䳌ÝcÆÌëñÉàã„ŸÈ +d}Y/Ìf-˜+ìí”áÍMí +/5„·â›ä<Ռ—Á+æé=!zаë%øáˆ1‘\à1À÷„þŽí³H˜¸Êïae8¾|·ÐJßó„uכåöŠxë‡"»íõK?NuOƒË q`eþ«&º÷"‰Í5Aîö#ç,ÝevcU”¶ŠóÓöCa‘2l'=ûËp,"B¦vÞtLiÿŽ0œ }®ƒ/~ÎÞÛ“`vNP˜\󗎲·k`dgÐí”ØØkû1O–ر¢ª•Ý2›ÜnÓuÜY}öv+­s¿•uõI–`= ígå@×)«ÏÎt¢»þP0VOkêŒÙ} &öÕºý ìA"&§ÃäöÙàtb´ÕôÅz~%Óû»ƒ—±GRKÿoë>úžâInºq¡s­¡À&tšEÛ:$Ò;zö<˜ßb|$JõßR“b• éÐä?ývÈÝ ú:øIÖAîδ¤@æëVãà×LNò­¸ÈAƒ]PŸClÖÚ!wÀr¬M -g¡Ò4'ws"‚œ4KïÔÇ/ŸIoå_ÛYâ4Ì} «©Tæžáä§>èЦ½†ˆö\Ø6XÚ³H‘ñfý½ŸWEy°!‚µº„Uþ‚†Þ Žæ€– +jÌDÉܪá÷eýíg´`ÖÝ+lùÖ|­›{Ë5Ô&ÿk鎰/݁$ +%ò{}À +ÍhûÚ0ÅfÈõ|Õ´8¤ß…Ž£'tFQO é ¢^&î'{8ý;„†Ü1^¤W¬Š@/Ù6.‰8mÇÁù„ð[$°ï²Ž3LÙ*€ +<ײ7*XL ­ª*b1H9‰n@íHD0}3(¤0û3^ZD¶ +\RÿÁŸ1Ó…S–à‘=$ž¥ëŸ•wO ·dwO¡f#Ѥ‹×éê§8Xv‰ÐβJæ&…ˆjÄż^ÐÉR>àÝ|]"1×,7¤1h±§1”bpOxL!U¢“e¥ªŽÑ@Êü”ãù¶K[É·#¹œ e•6¦$¬°H=e†]*åWTòé|ĜÂôƒ=PÀòbþ±„èA¼Ú%³Úá‰ä +.k À®{Lùÿ‰-uzj–r6ß*y,ÌoÆÒ$M² ý#H“Wlt°.®bL€5Yè®ÖmY0ÓnãZ¼ŸÉÚ)1®¼›õ–M´v3mOÌÑSáDáéâ@´ÈÉfàab“fC;Á‡ü–ºPQÆrs3E8`ü°¢—@½gíuñ›O«„¥ú¶õC# +Tm—*ˆ.A:å£w$œƒ)ÁŸõ±ä‡A`@HéÎågøžI^¦$Ç`¬mv¼šg¿Âd4¿ã&E×ót9¬2»zü{¶r¤ÒÇe#Çfø¬ä»—x×m¸¼ÇÆn,²ã6š6=šÜ ù“ÕÌYˆ­×؅C&4YÆZa¿Ä¡Jà@/'$à¿7ƒÊ‘¨g3ô‹æš)é°äδÐQ{ðÅNO³S{+§—ùÖW6vÊÞ̈́»XÕ| ÒH1Á‹i.q„¸‹OáI^¤Zm«Œ…Í÷ޟ*ÛPb¿Û ¿!ËÀM4ÖVöÇe)[‘󪹱Ÿ‚¨”Mû%YP±.ˆÐå+o>‘û·[@wgAÝb4(3í×`ìX—[[T•2…—n9t?ûÌêAú‰Ëyߒ}Áeb OF<1*%P¯ãp‚xl×JŸíLx²^ëÀÂwrýN«ÌÞb?Š%þ?ú=ó¢\ô!Ã4V¿Š†·‡ãúªîpp'¹6}€éŠìbâã CO6v.öªÄp}j*6Zz!èʓd^_¶…¶p”1˜#¹A³r)О ©såèä éž_²Œ¥ ÿ/ç/nÄ×» õ“\IŒ]¶„^¦*$ˆsœe×$Ÿ-oär 7ľWÀabƒíu2ü܊VHaŒÉÀ³»qÁâçÂQ·ObÀÌÄ>z8iÀ¾h$•c‚"¬Ú1"d‚²kÆrR8¾küÀú¦FÁE­0Ÿ{x¾ärâ#K|¤E)´vÉ¥-¹gt˜M0I"[çílj×tÃæ/ðê4Ào  ö™jB3Ò»ë6[m¢6mí3ýxl4l¯è!„ú|X‰3| ÓpKÒHäí¦zÊ~@m7;Lí´8Î +I:RpýÉ÷À ¿ y"_”ÌŠ=™ŽÁ.¹aÁSO‚©š£§õ¢DµÙÚ!Eíɀ[ p%¤R} wåü'ÔO@!MÖ'Ûñg©KFµX·˜÷]”‡N®¿‚ª†PjM$˜ÃÖfçbÎò5ß÷Äêe:×/™ô =Ÿ=lÓð‡Ð¤5dÔl2‹¼¥˜É˜áغõòCñ¯ï¡­çÃÎÇ~GÏy&r®Ÿ^ˆÇNˆd#Ú^a‘ž¬AôƘ÷- ¶ÂþƒöøW)ÂÚ{·¦tԑâ…ëD)^S:Ð.4Б*ŒñïJ¼Ù&š‰L.Üã´Êͧ`q+…zÀ_žSóÐTäá4øl=ê£GÇ<ŠíÜÛQ°Ð­‚’bJ*tcID)©Ã–w£ïY¸ŸÆ„™þšp™Y²z•ÃÏ¿¬´µŽ]£]ÛÚ 0ŠtÎâ{Q¼‘í×0ŨdÙ`à‹’hXÌ^}\:;öVêê³Q^)z#êâ%ˆh4êǶœfOݧA‡^mßö8t’¬6T{ü3R 4Ôjv‚ }ísKEÛâG¸P!ðªm…¾n{º6•ÒIAÅRí +CˆF•?"B—à [¡T"TŽ8XPa%ëG£_Þ?'€@ *èÑFãŒ|ŠZÇX¬ÈÞ\Š‘•ÈT"@¥Æ¨TXWª% +UÏ +å®þí4ü´Ã0‚zÿRÂc‰`pYRÔ]ÔKMçßiP£þ§>g?u¥oŒªR„£#—Á6Ö¼/'Ykzæó³œ8]¥ß5Ù-G‚Ÿsœû#ÂÎ&ËJŽðå1øӌ7µnœŸ˜±¿¨{d¸ÁDáÊ\¤Á À=%ˆG¥Ðž]ۊƒ=ñý›Peë)â¬N*@ƒò$z”Ð%d„ñœ75ñDG»uîa…§O‰pÞwŠ8¹ï]Ïî´¿wݹ6Ãtm’,͈¥X;•¬+®íDÍgŠÂ—:ß²sŽì…]p¢°c‚h²Ø??ygÃ$€‚獗6>ã;8gC|¦jñ|Íٝ6‰9¥` ,§ÔSN‘Ѭ¼äŒ’ÑAÎZ-pœáš±á z0Π߇*Nþ̦Ó{SŽ6cå¡^_M0Óì!N¯ a8ãÌ0úpöÞ6WN4UÀé!þÄœŸN sQ)v/7ÝgpnS‚Û WSËíÞÛüӃqPwÏ,W›‹‘h³ê–vb6ã÷Sˆ.Í´!›€• 6·¶bÀ¦©—A³ŒÿܶÙˆ݈½ fØB1‘R¦¹Á=ò-ÅzKîŠ4ã‰fùÞÔÿt¡9{šU[Ú>3èmváŒ5|cvälB˜)¬•±à†4hpî297‰ˆ½Õ¤k‘åFa®¬÷Á 3¯2±Ûw(s:v7™5j'pÓzH¦qAdŠn%‹tÊ2¤,Mrþî`f³aÝ{Ìß L†cÆô«¦ºªÒ¶'4ækkê1æd’2‹‰Çs#Ãàb5ƒI9OB—®A©‚éß=JÓ»íý…Ò`âßYŠ÷ō¥«€Ÿ¶*Ë:vA-“S¿Žò¬èÙF=ÐK·så%dÊe–iJìé¡»Dq&Qv¨Å† .ۛté5™æÒaŽ\>mmq¹ÉšQn7 +p9%8É)©ÇL÷®ÙžjKµõª6—¢xfØ@úc ƒ±>ðé§ÊÊrbVG+à K3uŒþþWi,ƒ¦p€¤Z¯4™x¥DHT™¶HèJ4À¤Ö2v\`²•£)¶cÈ--Bwh*Te ^¦öIP%êû)ÿ„Õ×›TŠ °í2$uÉ`»cATÞ ré ÒMÝÀyOçšY¾ˆÈ WýB˜;[˜‡¦ ™c3qj{“é›Üy•6ÞOÑ¥½üƒigÿcÄNý> •Vµ)q Ãž Ýúóò4 ÓÏL[Â3LXm„#5ý;IŒ[+àŽ Ê·|ÐöÞ!e‚”’…xó€G`Æ3®¿—î¡é¿¿A K“qòHÙOAu¼eÄ÷S€j/ÒUÝ:4AáMDè|Å +ÎÓqÑuJÀK@i…¿¬ï§ „ø5Xî@u#}¹LèjòŸãÃÁò\‚ЂÉòL•È’G"VîöSÀ?ÄùB<ˆ«ïÁN¥P(:21$vٕ†ìmfº~ûÁg‘:²ý“Œ¢½ÃÔý~ +rÆ •Ôîý·îø}UM pu$­sÙÐCÊMëúùÿ±õ6Þ~ +„f\A_ï”+&àÝ37Ú¥+0ÜèÐ|ÂaªØž…ç–²Àb<„tx0kÄbÊFXfânxƒØëwÌ3=Éê˜ù–C⏶Qœ"¥g~Cºþ(Æ»œïÂ7F™Ç¬íYñøùëím[a˭ߕç“-`?ï²e¤·m“Ÿqb¥»*ÝZÃf\#Kj:`ýê¹u ×ÂH¡‘ —ø ª­TIŒր¾UkFª¾±§½ärrNåbGúrL*؂‹™±ž8O8€JÉ.kÝ\ °ÜŸÅHóÃxeõ΍½! š 6 v…µñì7ób +Gº”¡4„•Î¬Oeà)Ãӕ…jÅtUPuXm¤ä¹„â¹°.D5WTýV~'œÌ$H]ÆBÓnv¨8왆@žs{| ïv¾ëZ•uÛ@ñðá¾bº­Ý-Î{ž‘¬ÖB:B¸úrºao˜Wøú7؁F‘ÝOÁvA¯Â¸_ÓXL´ŸÑN +^´–¾8…G‚©}ú£°  ø…`ãí&px@ÚOâÆ~è_¡QÐ4­˜Û7T@;ÔC12§WN몌ýFÔ Þ~ +Ìó%¨ãK†ìwNû)ðÁ¬x?ÝzqÌ"—ºÄ֏¼ŸjSp¬Ò6Eù1–ÇuDŽœ®è0—g|î¸k7‡ïŸ½?í§€ŒlåDKé êvç".b‰>ÛoÊe|QΨãAÚ‚\{JËR4í ÛušùMò”þô~ÝJ)R&O öŸTEõ•YàӜvF·™…ʆmà•þ d\:el:™¤³ß@£-.Æùc•¼ÿ*)6 +ÅOS"§™Êãt\c`Cô´_8û È8ø À¡ªP>E(‰6b ™d­µ@¶˜µ¡W*-©JäèßÅŸ¾CùZ^6¾ÎV-Ulª@õ þ·-X†£Á_C†ÕÀÑà¯ìøž%þ¹{QŽÏ´ið_z`5vyžÛ;c× ©ì +ù^—æÔ ?on?þX†ZØù×Z(à ”:ŽGG°‹E_æíÕ&³òI£m?3ò™Ø£Vu)PòæãŸæÐ?|ÙG…$ø°Þ…ÐnåÜ۟^H…¤Ñ†ý_+ÁCuà÷àv3tC°ÅýÖ2F P¦AöÔ:œlÑB~xûƒsÆÅÿnËÙþÕ°Bmýzt©Ä‰v%½ +´ß–lò`Çè~ +j0² Ó6Íî|GÁœ"€tŸ®R¥¼ò0®=øù87ÕW.ÄgÎã±Ø¨3æ~ +*üCF*FÐc÷—2÷\í§`9Îs*þE”Ëȕ–¿2NJþI:2ÄÖU[•2%d?µüéZjQŽX¯œì§€‹• +ԏxϚòöv5* û%ZWiÞôtÿȟYÎƇ)ž6Ð×ò¡4({ÀРഓß~–wöEJwD÷W?dИʍ+¹ÿ»œŽ0Z§ÕºõíS0‡¼ªå@ÃGÝPÈ:ì=ÚôƒqÁLv‡ù¸9©øí˜ dÓ5?±åÐ~ +XÕSÄ +£É`y*þ¸¾õt<úû)ø`\f ýFŒÙOA&ÿ½ˆ²nr*eEw?_æ½L¶[$"*tÖy°Ìž3§9Ë21x?ÙLŽˆ¿™FØ~ +*םeʃV1¹m%°[²öºâ}î+ÞÀ *4^hÁà\\Ðysaµ¢ã ù%¿Ê‰×3Ô¬ =³´ÄÄEûdJ–`”œó(‘..¤K‚â4¢pžº‘ '$ÞËÚ½rìmúADà©19àD2w~x±`H‡Jõ# ø½-È\¸ÿ—$) ¾<3C>§ˆð÷pȘÉ?‘yá ìåôm~ÍùwóøÉ^͏ÈÏõ‚çCÀù­ðK)+6·.݈áœz6° +éu§‚54o U!ÝOŽÿx˜€ qÛ¹æWu÷N-ÐЄ3à4`AŔõ—Cã´5µ(Y<.þºï?åYõ‹¸Èq—û–3r\"¼§_k€"œ±Kpà*ª&"Á¿ÀPk¦è@ꥴŒä¿]¸MÆÍ)©T +Ê5‚Ýjûÿâ¨Ê,àŽs)FÄ"â«1R ôTKj‚o„,*ZYÜ`(2M¿‚µd.\÷л,ŒõÂS6&Á/‡d‰‡±ö”’ÀpS×DÉm¤Q€¿;¥¤¥“·d*áhcÌàñՇ‚%} ŽõÍßÎ_5ãS‰ˆIŒÿ[¶Øš€™2µ½Ívç~®ë2}à â#œŠàÏjŠ3TáøGŒ‹+ˆX¾ +Þ û’æŝèV¨ûŠ¤òqÂD“(}º”?¡Ù…Ì„°SmýÿÿÛJ‰¼…›…|~Ç¿Ýސùœ‡8ëW1¡7Ëd‹Â¼ô$}4CÜ]Ïn~…ˆ½ÄoÀ=Jۯɳ¢† 3** <Û¦~¨‡%,Sœ?ÌÐnzôW¨¢ÔQ3%»òê^,¬ä4‚É&àEþB JÊV¼ƒÇ_Ý¿JßMXéNZäÅêiÏ¡H·Ì*wÃYŒÓõ;ªX4œðÜÎmxë¤ý|q0žÏU±•ÐˆNÕhÎÐÞns¿‘„»ž«À—‘BÊÆTV«E· )ûµuÝ^…JÿÂ* p×}÷sxŸ´kÅõº +ÂÅÙOÌÈ#̈́ëÍfÿ›¤‚l œ×·Ó§@æòÿÚ¤![fçÅ·Ý~öVÅPG[_GRÃåVpeóÃ-¯,ÝÂíxÇŠÒ5ܶ0N’gIÿþߙ„·%ø¬€†6éÚ) ~·ì}xðG§à³ä­Ú€þ£"LÏÝrZ¢¢ô»}å¹FÃ*4»î—9`ï»-G¸¡–SµãªîݚÝT,í¸#u†×»]šo@RMï3P/Å÷¤f¼[±JEýn©8Éc1McÝN¡Â;Í恻Clw;ÃTðÈÛåO…‚Ô r|ƒn·Ö +d¢Ûnáùåb/¬Ùn{~¹vÜÆÞÁ ×nß |n²æC«Ý†ùZIږ½Ÿ[vûó„82ŽÛìe:¨3Ù­¢Apx¼™\¡:v‹–€š´V’b·M‹€±Rã•$ÈþuÛøöÇ4m˜ýpíºýøþä ~OºÊu+wà}a¶ìÖ­2]ukZÙö©ZFâêÃ+ Ï5EŒº…ŸªãÛÁ‘3¥iɘD@S*ž¨z|¦[!ãY^uÅXnG2iÚ@‘ "$C­Òm ª °ìx1_àÜf{EäÔUP‡nÕÎ8†*"9RýލÐuáºMKšÈ•d½‡×°_M&Bäé«TD »Ft‡‡†ÝCïoAbH +I#TC„‰¼ãŽ+=ãñŒd`cŠ·êŒõ» É¹Â¨`K%g»Ü%%Yú_P›ú«ƒe²Z§âÃA"·p µú ¶‘¡"[·†e**Ƕ 00¶¼½a÷æÂ0{Ùíù™3 g!!>T'D/’I²Ó¹y‹&ã¼-/®‘ @Í¡‹c–™«Vgu[ë*­ù³áÉØÙAoùðJ®q~ph<ÃkÐʼnŠ˜¨Œ)l!êl¡ë,üd¾heÉ!Ú4KL³žãÏÔÀ¦}jK%°YHû³$ȃ.—€zí~ژ"yï¼9™>8à=Q¾‘„¢ëBÅzð†‚©¿m¼¯À?“«2@­ œçóA¢(Ýçû½*@ ?¹_š‡$mÆo‡LŠç±ÅxxSc 7èâL”h¥åÇk@5^±ÓODÈdÝ î!”ÉRè¾ç§têyãöBL¬Ø#Uhß<¿Z’We åȊYÛ{î<±°Ï1v¢€ƒÅ›»H%ƔIccƒh0úyž—c™ÆSÞEKµwÍׄˆh·00`0õ°Kõb(Ò$¥ôƒ/L§4vò´ëÍ85’çÝ£JÛ¾p|/ÝÉ!3ÿ°ú*<ÀÚCÞ´ÕW?\ÜxoØ"V_]¤‰/U R„P_µ¡(Üy¦`m_­²ñîÿǬÊZhó¢þ£Lú5‚sÉ­yá«.ºIÀÞQ ¬«J­A¸r_ҊvûâUxˆ—x]Ïæó(•© ˜W"×¾Ú1Ž¢Ç“o_Á’• Òo¼ëu~fà­=¾°ÿ}§ÚD_ûêH¬)ÛR‘ÙyoE» ¡L&0Ý܇ìÈÒO¢Ço^×(ã»ð¼`vdó˸wèñ-,AÐõ†Oì²Äi6bü™àaݐ¶g÷vx˂Ëδ-bîØp Lm=åÉÝÃ}Hò/0À7¾§HÀ;ږ$oæÖ3†´é¿9,+k­¢îî“Eþ¤à™´¼˜¿×~€›xAëÐgç]Œ)ßãÐ'òDÎ| ‰r纹;î“rÙÐøÞA\€@˜øOX@NhL‡%FÑVÂõN Væa +‹Uú<ä¶ÄÎÊ¡6Z\å:F¹”¬[UÎØ·ÖOô ø¬‰ ;ì=¬#/cJ`æÀ"lÊüt9Ü©i?2»%>À×ÒQ›/z·ö91àZt𞹖xÙ+’pºÐ–ÏNÅzc†Cܔ^äíš=Ý0>…z 3`ì}òò{ðD Š$gªðß+3C3!°‘EÒþ…g L-3jWY½dƜ–yOy#­n`%cÛQ¥Hý–”Kc©nj1°ø=R¼¥ÏÚÆîÖ+L4Ç̆îa-B@áj×b%ƒ1a­˜Ôuup0×yÄLƒ=ßËIí@{Ãç1‰j刊֛‰ý#W3¯Ëè<pŽu‘šK“JÆS3’Ù£Zd÷fð‹t·¿¼y™¨¤•ñË ²3Jêâ^醋 )Rp* ªM³ZåßÊd[j¡ÄÀ8V—hè GRgº&ͽ‡œ WÌgÈ66Ò6f¾üL +ޖçÝU¨«™ƒYôr't(Ì°ÎÅ­+½ã‡‹}nÚù“AÐc )IÓ÷:ƒ½o{}Ãñ®¶¸j ÂØÖægCmð±á¬Íg2A+§S÷d>pø’Ws—-7SBžËRlÑ·€A&Jý¤Ï|çUÅÙÊþÁ66a4ß¡îvl?h9ˆr¸©»FÞÏ*‰‚,kAQ¦VQl½¦/Ð¥{¨cEƒ–"à^Ҍ#”Jøb05+Š©Ä¾‘¡ÆµºDJâ) +/t¾)ÆpA‡œ·H¹Àõ± +׋å×#Ãdw ̈́ÙíEGhh‡øÒDF”Gc“EvÍLböÑfƵŸÔp¢÷˜9Èld¶›Ø\9xÚæåK!šjzH‚eDF÷«äCÿ·l¼ˆþ +Ќ•nB- w˜å©å>[ø T`óÍ·ÉiÝ0s•¥#5‡“²OWþÃӘD²CZây#Á\¸2ô÷àÜc›mVFoa³E…à‰ ì—²4A÷>*¯AvÉw%îÙvv\¸aÞÕ×2}¥M>ܥͿX@‹)TåùFw]=q”ª[úed“$O²K¡lÓb1OL6Ï©§ÚB<°¿~„2ä]Ü-%ädS@P*§ñOã™TtP±£Þo‘è) +ún°Ÿ$B“ûH//MºŽÐðt¡ÿ'^R`Ay— +l$RÙ1€M3t= ýΛH§@HÂÁ²°â¤y]I!Qˆ¬eFk" hWSië(A/¢ašÉËZ'”ÁÃu÷á‚;¹Ãº-ƒ9кŠ”ŸS |ZXT"…2v +ÓœW€~“Ž¡wHÚ^’\7ù¤øÀù +~ƒo•+—ÆÚqEœ¼—Ñ_Áß)òÒ~¨$¢cd(°.Š¸JƒŒ‹äz.oTµ ÃÁÂ'ŸnÉ ¨âô‡·ÍŒŠ#/k¨V¢€…żJhCÆbo„+9Ž„´ZÿK+ä2®ð#øG +D’Õc²üù ]HXæóÁXKAŒªÈ—ËÓÉä npóB_p@˜_›/E%S³¡-> ˆÁN˜°È…ÿ9Öp $¤’ @Pÿ‘û\ô` ¢·óž[oXr(® Þ`ySݍ@”²8å¾ÚØëKe_,Í{~=˜«+–ÈS<@g Â$¨Š$ôøEÕÖò›zû¨t»0•?h†ÈÜ +û1·m™´w¸ŒŸÿX̞òËPÍÎTt:™®ŒBœ4¥Û;ûQO€ÂyR\½jJe>çx¾Gg"‹ÕfêužD ùÎ8ŠÐ`7‹€à*ã¦ü¬”?Mﱞ0*én6åÎO¡f0ˆ©«ð>®Ê+ÁÇÅîD.ٓ-iO­Äd²/"bÑpø@QÊs.¿h v!Z†A¶ÈŠ¿Û®&Ə-“ÃàˆàÅ~án€wÖw›3¾14@¤vȅØI=L-ãïŸèÜ +[ÀÀãSck—(êšÄ1Ð[áê $!R¨4K®=Ìڒv+b¸l b™×•q‰ô±Z N¾­³¬*4)âûóÑ[`Pág…wJÑ6þÉ}칈(jȪAl&*üH›Ð†Ì¿†ý +mèìHÏaGíŠäQß½’vnëâé8QZò†a£„ó ë†ê% c™¤¯C[Eê¯R3àá «xsü„·øB¡n¿ð¹o칩ȐÍ<¸F\žrI,Y ¸b~yß# +z|÷ÈË¢‡íECp¹Sw<Û®0¿]>yâ_ùPEÛ¤Ð'YÐ›Q-ô4`’„W‘¤ùE"k"ÌÒÏ¡©h@KJ ƒcè•*’)”cCÈ¢¤®š ÷ú;R(6õ¹ïõ3¥‰æS\qTÛ@ËuÓHud„¹dŠwäG6Bªp (Ÿ=`4í\=ü’ÙŶ + ÚSw !°®£•‚>þ!Ÿ”pù¬?gìՅ¿)ìÅ4ވ+ç œ[‹a¼ÖÏïEI`£ô +á¤(´0ŒhâìPûɯýB54ÛGêØÛ5”eÕ­.°fC+¼£¢_SØϗ]\Ý#èXäéGgDª™u;¼þjÒ*Ć~c*xŽ|dnÞ]U…äv­õ™ÍüørÚK½v$ØkØ@ц®èriÚï ý¹ _.ªD›ÚëbR‚\~6ç +dMªŠÓIÄ0ƾ8ØpC€ŽŠ?¨0ù$ÿž.¼¡ZŒ| WIKHNç²ÊB‘1ä]˜eÕ|¸rǑ†áPÑ+àþ¸}fÑFŠB¿+_{=´²Äа¶1ÔÃÀ)HáŸÚ£‚Ë'~ä¦Ðâ°<³X-g± ï›é½µÂFu¶¨××+™^?uڞ¨Úf”F/˱YRz<\O/Z0$Ø£^î^¡½0ÃÑÎŖ¥m›Ðq瓆e:xD³xk^SKà’t Â8»T&¹€'æ]᭘ˆ3ӰôóöÁŽ$N/ë~|ª †ˆÃ àriO¯åú\6[T£/0Tª™bt’Ókȋü„-ÐßÑÞ­˜•$Äl¬L¸Y5¦·ÒùA4¼w𰞂JâïpZmÖ÷숁7¶C2vFÛÄÂ`Vv¥ØÆèîÀxÙ»,o´µ°ŒÚ·m\нèc2ڟÜ4‰š‰­k&bœ ¢¸”{è÷‘Œ~`,ï•C‰ø$–ŒÿµäX´¶íľÏd„À5ãOwÁÍ_V%¦úFõ+‘(ß¹j€Î´'|Fpî_ˆ»€“îÿmnèó¿x²r‚«ãqÜlä‡ÖEµ„T[ÞA**à^R¦_ÆYza~ÜëÓ¹CÐKq…%hÌXÉ(ÇvzF§:ÚÈHú ܝÜqt²±ÞºLcªëmoƒ·ÐÉ¡>Ô÷Àãu,³G²%ûöj ;g-@b§à{pڕ_yϺL$áBøðSË­ïùêr&ð”S­¿pB9cßÆ¥Z9éW|%¦cþ´?)˜®È’ïÖ_käL`Äýf ,'@¬ì"/ü•EG¼.\œ& Ù¼(©7p|a# šFÜ4()ç ­ ¨Ø +ëH–Û ¶Šp﷑(Å©ˆ>&˜µho´²;N}u›R–'†ÃÐ(Õ¤NИ§,èèíÝAØϲl‚ú}W^ƒdÅE`΃¾À=UýÓ5‡Æ£Ð|ò í +lñí¿õŠ¦üUŽ/8 3qސûÃÛ†ud¾»›°pkÄöR||*}¨°ôæYýå»>áÔ &ô! +H…¢2µö¢`®B€™âjŒ-ÿ_Å"ö! öê (}HYæ'o¦/F4íØ =Ýδ–Æq–Û¼¿ª»Ub¼´_˜_ÚHj¦ïeß½C‚*¤)Z†aºÕP5Cɨ*ÃuÉçö»$SƒÛÄ°)dØS¨Ýîz‘ÈJF7Qr¢(®GTž!¾ +҈˜k(“åg¤)…I ݐÈã0ÉÃWƒIG)¨›#tKKY$†ÓŒóaÂ4L‘Çÿ Rô¢XÝmÒðŒv8¦mú¬%;I8¦!þC"·úNߣCš !XM˜ÙŽ +xù»!ñÕâAûýy‚,‚¢#²À…ʂÞøÿ•֊Ob Ë[X˄ãGfuܓbðbè@ršÖ~ñØ ¦9ˆi\x^Ç6Ú»VØÒÈ/*ÚaË"ܖAz!çÕúe…F[•Ô˜x8I»NÀ6¾ÁÎöV¶ÞÓïVßv\A¦õz"Em)q¨VÜd¢eÓ>Èt䥏‘t·nŒãt=Ï¡+~0Jký1 Ú3nô­šcė±R aðýèÊ|Þ‘©$˜ñÌ“‘¥ª„°b/ó+ ºŒi/s1x¬nЩẦ%qa½Bû Î ä=ðgAʪ„“n㈠+ø ËC 7 ¥ÑÚùmå…ño5Iˆõw† ꤌ\öÞ± Ôê“rHžû[=sQȋ ]sògà!2”b(žyY͂[‡Äkü›¬no“;|ÊÑéGì ŒàdG厀J'åˆúwË2X¼xyì|×†. "-+Mmª ›&8‘ž±ðª–Aô]¼T3—Lppæ +~7 +Yb°  +×ü)]‘‚q˜6 SxBú“áÆٜõBª‚S¦#À»€ö*º¤ëë¸Mx™ÙÊóh’ç92†ökȉÕGNÈ֐݇ì_?Äc‘Ù6y&÷ó•ҝo’:{Fë†Qm†Ÿà_1À÷ç<ì¯U¢_xŠ†”b˜m68— óý÷'4Ô uRî>õ…EÒÂ_Õ¶Óÿ%Ã…r qL¦¯ñ‡êàT6kˆßs…þ|g°rTÙ`.¯ÝÁIÒN>« 2&±ç}Ó\RùÀml‘½[¥²¯Ú”2Ñgei҂QZ½ ™O¿Ç HôZrèc€¡3c¾ZÞÞكD˜ÆØb‚q¿V ã 5#ì5@ÒpÊÎÂeš}]ô$¾¿’«âlöšÙ>åFosݶó·üÙ\ê$G…N̓½u˜¾[ZßeEÂez—v=¸+›ñT5Gpú^¥Q°¨ffÚyD]s-+™—RЍǀӃ>fouäìB[âQ$¤!Ã{EŒ‡ÖX@~«\ué|ˆw¨Ž+×|®°·=j=›Ù7tÒG„±:.M±Ø©ñ̍5b5? H‰Õ²½0Mözê#/ Q +’®› +ÖF{ŠÀ£TØàÙÐÍ®ÐxÛšÐD Þa²5ù¢˜ë ¿¡eýÖäÃm­—1Õ Ÿ]ܾèðœj .ȇH¯Fh^¨ õ-ô‚å(NÕ°5ÑGýMA½/w4iónÞ¸ÁZò9Ñf˜^+}@¦£ÜìÕ6%f§Á Å26;5àW£)±”ª?´©Œ CŽ°YÜ~`ˆžÞ”I¦ûØ»‰DŽrÏÓDÿꚂ<ù +Ú¡$êç«Æå<^b +ÊN+¯® ¸N´¦Éé‘ 2úª1²—m¦}û#ߍ´1-j.Š†Á>2Uª uŸae& +¦²¨†öQ3Hie‚Ü7ÍM +bUñÄÓPDŒÓõ+¹s®Têïžš6¬ãnP˜ +Ñ ·4ø³êŠò;ßùŠHó3QþcbtOVÔÑÒd¢žW€ƒÔg‡NůË3ê–w›Ò/ª÷(©Y;‚ÒZ”ø°Fã—#Ī·'Zç¢PK0oùrfY· {@´Y¹ãŠ}¡ñh=`¿Ó¡Z̵h:dß+«çº¬ß“ýÍOt6ÙÖ¾„†±ëôÖGŠð"»YQæÇwf¹IXoÖ9 MÆv«¼ÀlÃàùC¨ú¾"ý­²d6¸` ŠØ—™ÈÊÚµa*†$»¬zŠ©‰ó®O"ºcqF˜Ç±*Õñ'Ùä™´Ò‡à̈?þ©4T;qåÌRl\¬Ä7©`by»ú¼Ì>ÈP£Júï2q$ö]`Hµ(6Ô$v}±—1¢ˆ€3”£å-ãùJÄbëšHz_úÂB/úñ¿L`rÒ;¯Ò&ùl >iÞ\SW@ã5ñPÅK÷mƒi +yíLx µaöð…Ö1ØaîÈ }c$»X9« î^žŒ…°¹öNnQ¡ÈÞ4‡´cðŗ:~ˆ©}0²š¼JL“u›5|´¾ ý»4RJò¬Ìgÿ2åFݨMèÃٜí…:›7JÏe“[;·T}J5÷’ÍÿÍ-¿ñm›‹Í|~4+NYýxWI»Ÿj¢Mà³²â8%öø]f¢·¡¥&5°ÐÒ¿W™Ò j¼H €f¨À"$—7y‡m((9âoÑÞ9ûO[ûõ¨É—UnŠ=¯õçùxuõëæ•xÛüh³r,ä¶vÝò GÌ‘cÆâÖ8é +¯$ÎZbú̗¯9úÊY˜† `ÍqÁ½ÐÂ>'Â_©gôH@÷êÐÑ*¿¢Eçnÿ¢€‹EÞ*¡µ=՘¢ebfçõ­C'dw­vÖ«FnÊd×mÖ_0ldò´Œa£¤sDëµùJ§†Z + Æ “gA°Ë›çû¢îZ‹²ÿQ¼*N/PzØHÔ(êìOIÎ÷5@éjP÷“>Y¼'É,¼—ØŸ&éV„¶×«uýBLÝrp…ìã¨â,+½³ün}¼ ,ÿEX´æ*@A£†Ÿ@:D˜¯.áÁœ)ä…aMô£~zj’©ϑ¶0ÃHD$!Xž#K,¶<­BÓ¡_©’ j˜ßH^J^³vÐ|@ÿzHµ’éx¢%«Ò@F€Èä ’úºÌ5p#–TC•rúþál‚ö°§™ÂW–W(¦9\”Â=)ã£;†ªÅs‘MÉV"0ïðe ôëxâҁÁkû•äC[‚ÿ‰ fSÔú0êÓ_ˆ^A0ðsü‡}ržöˆÆy  ˆ¥\ + 9 h2 °Q˜.¶„¹F B +dò ]V{½Ù¼<]ˆüõ!Ü-«‘EFS~Xs•t†Ñ“ ûÅà ¢L]‰¨}(ӅóAcb;°3¿&ª2+Áè[¸æà^¦åN±ïªK5O=Ù@‘y'17,EøäÁ™Ýs÷RU‡ÔÚ`äŸJ@ƒ™ùVqØég$ãC#é±âÁ>öºFMÃ5jú\ï`oÆ û§0ÄÚæHçü'^"˜/m¨C¸WÔ½6„-¥‡®,l~ à©ó9|&Kœ†Nì€á,7 cŸ‚¢ “GTPxö^“©u¶”ÂJW€¶C¨Ó?©“ý+¥I|@ýæ+ „vè<9KþBc"ZÃzwôÅÞR³Ÿh{¯¼RJODÓäK(Ah²Vı³?ðŒUnò ³XÃ;)zËÛ6k¯ÁèuB´Ûqd…»D‰«à±¬Ù„U b ‹åN5ö¥ËF©lÖäàÉkQŸX¬E\aÒa,q€”E1:ðw(;‚ÏvkŸ jÞñ³Î¢"†žû„ˆxÎ"Ò^c¸·P‘öÒÖ¯H×]Ìý&EÒ®ú‹° „òBz\¹.ÉucÙË­2s+꼚[䀪v ‘ƒlLµ*çH—Ç7¾ÜϨªŽð\§@ΩK9Ì7dß'åVrøƒ±(,ö­ñ?äºÖHºÙåT£·¶¹+s9ê̢дI¾®Ž÷¶O怪TÑ£õ¿Ø†¶¢3M$œ–‰É š¤ú’Y…4Y +Ò¨XÇ[ÈrÇ-R¡hûOZÕp89ï!¯Û–( .}·æÆ/*ß#T¦…fÎ/Ë@dø¥B*üT&çç1ÓÈWÿþcæ5Žn=´PñÓ%ß4³¤Ã¦o»òb«`1Ó©)¡Te”J9$œ©P6+QÌ.›VrÒ†Ño–$7´-ïœÌRxI5v÷è´Q¡#ûÝs§ö–~(Cæ ¼(Cš5…Ò¼¬¡û¢Æ¯Ã˜|NíF{Éoð'ޕ-Ó!®Ÿí깊ŽH@0TÁha/S‘|Q/ÝkÝàaÅ¿mJ‰WrDD¨({>äÈÙA´%³Y¾UlåY†Æî,±>V&¯äùÊ.¨Ë‹õ.&`ÊßSÊ q)E£Que2@¥*¡p—árÔO÷¯r˜”ñÏ1‹÷Èe ù¨”1¦¢›åTaáý~Å­&°a ÄìI\b×Vo~Fð  Ík,œŸrlt§à"‘×(â%Ü}–DÉÛs–óþÖ+IA¡5cþM|ƒ¹4ͬ¦i?I×Vݙ¿@ÃAló!1ãÔ«'w…‡q¨çûm)Qw(†pxFÞÉÝØŒ×0‰à?ØQ‰¶$PräLÁ õ–¡lÊ·K˜Rœ¹ :‚0ʨ’·îÝ6‡WŸÉ¢îq'öAƒ]4.jGˆ¶@íÐ&@–¡XÀPÏÝgM¹šzä¼ý»Ù+çÉ)!ߺ„ÚßN}"×CÜíôÈ ÜýàE˜ÃžAläsv±Ê^|f e Ë`aÇ?ðýÆ0ÂlÿÀ„Ú˜ùõCGãøÈ*h Œœ>ª¶Jm‹•Z@ž2Àq£Uî÷ æ¬7j¤Ðî(… Õr/Û{¦ßH{f#©SÛÅu¯ «9hbK‡ *äU—u8Ï{ipS_„Ǫ§„T‰gÐõ;ùÌÓöÅ(Ž`ƒD##¢o[ZF2OÓÎ0ó¾±3²¶âg€X§np‰=ô‘Á4ëBöDP;ß/&¦z$A‹öâæs&í¡œ‹ ôõÆvo˜Xv«tlM®ƒÆáÀn¹Óz„N…¹6{Í5Ëf8ëåmCäÚ¿H2àô}ꑱf÷A÷â]¤Aíü7CEöDoú"{>õz>7žñFå +ì(Šaä*ãŠYÓóRNÈ+#/6krFí8dÍX÷‡Â74Û!j…Šõñ*ÎUq’0­BVæeJ—Z—ƒpìž}¸žz•òÏä$ûi.’R”ì +’ÛðŽ7%{Üù££U݋ö.£~µ¥§Fú"áÛBœuH•ì<²|FÙ £´;bB”:qb5Â(A–b‡Í9q Ûí}^֓¬qˆW¯K×µv’æÝ}¥ _* ±–âK "Œ +X¼ù ;Gܝÿáñ6õŸ¢Ýj½C*ã„b!ô…¾á i®K¡³/Úo « T˜ôzp¿¢ý®šUuõÑãM;ƹ¹‘a…Žð²$Á  Ę½ì‹4¶tv0 +›ÆÔ¬¶n1ӓ†nf­yÜ9`®1˜Zu³>ÐõÆù(Á-b鹔{å`ºà~',Ny’sŸ=€q²;Ô3PÉaú0șä¯kïöWˆyYWì]£2ùc+OÐE}ÞñŠò##H‹Iì5†h‹o_¶ÉùÅÚϒÏR`žoØK·fNÅÒFgäÎ)<%g ܺ_þó‹p –ªìµ ÃÞ»TÐò#¦DyÀr)™ yDÌE1©1ø¸bu(]ÎRã«UC*YH{yag¨™»ÎJ-jðÏøØñ]ˆ”¦~ɼÆ5 (˜1Šƒ’ž,c–«Ô¼ +¬CÅc$ÅFhe ûa O˜Ìƒ_ÔLǑÉ%‘<Ÿ K#pÔ9Š\,/à~öb¨LÔ¨Ò8pÆñ:Œnvd{+Y7âDBLRO—–WãCåÉkÁ=|D¾îAÄJ6’å=$es6ôµŽ;Q½ô\5y­v(zaŠyäà¢, þ¥ kèËâÃzǬ&Ð>81h–ß»hÕw—èb aPNÞÇ•®Â_$´fdé`a²1á¥^Â׌}”°Î½Û×W‹)ÖpwÂÇÞ@—-å`ŠµÑ¿h-ÊÑdê¾´›j-ìNfûÞEߝ•PT` vÏ=Æ® W<øáu<ç7CÉHSÄì +š«ìXa¸F¯¸W#DuâXi‘ X}ñ³¦‚,†Õ‡B\ý!¿ûlŽ,ȑw>€ ·£ê—WÎ ÍÌL„þY&Ê *güäbE˜#Ù>ÆâÆ  ‰¦Ý/¯c”Rrò‚úÊ®ÙÙß:XóÞЩ)1æì7%êÜÑOœŽ®¦¬€¼º_M^Ø~òòh|×ÚçŠ2h• Ä®º{ë+¥E¹ŠokH¥ÔÉÆæ 7(U²J’h†Wç(7a†W*åQÑSO!÷‚Hùnê"®ç2]O×ø“*Ãr>gåXþ‘,ª"M!a×D 8éTb˜LíãDN«{€BuKÊ+zÿn$ª—J +g™þm‚ài5 N]•èNFûÀvy¸ ÝÙµp]ÔpÉ[jnØ+4NŠ”ßì±@„J®d~”q{~~§ÏÂןTUë‰ÖÐ#QtÐv,V!pB±©ã*Q\äîn6;ŸuÁ†šqSA0§&añ^¾FOi´®í¿‚O#↼î$R¯Œp&zÝÇ©íãYÆR½6¤®¤ý*êfÔµr¡ I~t$wHõÐˍ²ýá¤?b@¨òVfÜƜLÉp`xÁ±>Žƒ€fžafø` *V”YA`Øþ÷üÎÃþÛò ¡Žƒd„Òìî8®âªøšcÆê¹ìO®‡nȼ¦õÀðØÒ®}b¿qq1Õº.u6 ìYàÀ2aSã-4ƒ!ë­®¨èa}ž=Üs&×óhôá[ä/yZÖô†‹® o(ês™ãñÿ4-Š~Àn„%]Áˆj§CA¯¶S4áÎúè°©èÙGj›N¢Öó¸Ü#T2’0ÊÅÈù^X–‡©œÑé$ ‚uÕéÕù'ªþÛ£’/i«üH'à_àÎE;žóªµÑæTcþ[2:‹üÍðíæ»±ÓöR§Û|ÒP"v{úECu@$3÷»ñE‚Ñ “ÙŸH?½bƒ|v_A” ۢӘÅ'ìáòtë-W'sï º&ëP{º'ß¾¡}ƒ¡Cíz S<öŒYz3•1ß攁oung(h]S}u£î ܖ&: +ÍUçÓMwl}å¶ïM±DG_ӓ:XÜãO@ù'0 +¬SöÜY·8ëõbÈdÛDZáO«ž!Rû¢n¸TÖ"ôŸgø/jHB#¸Ï3<4¢§¥U›éq ·WR)£i·Ê´ &sªTˆ‘0Ͷn/œÑÑü,Ã_ x”ÿtæ)¦õÃ{†$ °öp×_·á3õªèp\í9£ëõ*@ýrviÕ¢TÊ:É%"1¿‚‘ìAš€Ñ¿ Ù#ÄSñü7 ¯æ t"Ñêʂ˜õŽHù¿Òa‹!îU_¼(e²™ÏBæ1 @[(‚ŸtÁ:¸ò ¯Úñr\l1QDy=$ç–Q.dp¢¿(Bj(H_ìÌÖîL‰™ÀÁ)‚_®X¬ÅØH|ÒìÕK HH… +ñ>1‚Ö·÷±ÿËR“"L`³Ž@&ïHCº/"™«ICäÙÌ`¨¿´a¸% «¯Ù‘ßÂQoaIM=ĵè!É!tá΄œÅ@»%þþŸŽ n™‡âwÜ|²@‡"*¯!3´ýÑl³»,ӛä¾lï‡IPp +;iÚ§¼Ãaôuî3bePí]<)ÿTø] i¤ùö½µžX^…E+¡÷0ðŽ*]n!“ZnLzà±êŒýbP´p©I"àj}Í!Ì$ù1Ä7<[5 ÞÇ`Ý+o>‘ïb š^(ŠâtlÌçñ/CìCí*E0‰&Eÿ;”bpJ¢Áé•g+Ú +úØŸZ‚¥¨3á ˜ƒUæOæ̸ãŽâ¯t, 00¦œø18Ùpè@–©Æ£1†'ìá ð2é.J8>Î&¸ˇ/šÅÇé­W9E¤ø8@ΐ¬\>¥ì^K*^èý7Žûwºc ðby1ÝÂ,0ÌbFúnÀ‹á™‹™Ûõ[•ÿ—YŒB€áX“Š€5öZ¤…Ê}ËóÖ!Ž¾T­r§9õ†¯(D!Q¤/¯´Öî|üKÅÄY{*QW‹Ö ¹Ò_<çT·âDZŒ1ÜbÔ±‰ÆIЭi/#ÎNK‰Ð¤ZˆS>¯©¦_)yôþ=B]_…ÌZIŽgD_Tñé‹ +³akì@B2MV~ÃÑ¡€Iȍ6¿" Aïƒÿº™¿» •$ÙL­"«`Jc´„oJÊèôCD]>Ð^&¢g‹WW‘)B¨˜¤aU\r?®A¡ù¤":ïhY²ÇÇ´—Ã}ü%‰dVXxP+EÍQM¬)–"0ì}ž¢î¨¹)(>|O"[\e“ª˜4<ۋaÄ»pœë6Y•é‹–¶ƒ´{JÊbªc[~\D´‚ ÞÉi¯1¸mNjÙ*kò4â(»Ú³º&3ö°}™_ª(K^x_S\J&´úoá,‘7/œ „¤LÌ&¿ È.ù9òp5¡ŸèžæjØ@L1oÌ·§ìKÙFG+E“åÉ)…ú í== ˜Ò +°ìÐɉMÙ Hƒ:ô4R°?UáÛ`-AOÞ>Áž‰^ðύ/Á¦­‘5/ÎlÊk=m„b,*múÿõŽ-ê%°~p +cH ›mÐxâ_$X1XhfÑuêeîû4OâÀK«·…„qŠ¬ÑW“m©(ý’„Ó6xÃM˜©ÿ·!C´í?¿k;† xnqËáxE¡:þ @º†Þ­ 6_fÁ mXæƒf/Eø©”âÑ7éÊ7ªËPñ­»Ì”²+v?`º_J‰ÂڝM­Øô&¥Ó4vxô°ÀPàHœÇ(¦Ewo0U\¬ Å~ºV,a¯ÚÃdš™”ÊAë.Lí ®Í!ÄßñA#› &Õv¸äëy/_!NW ´•Ñ¯CH`?G]åhI‰O ˆÇ›B¢š\Ú~*ÿ¿)r fãÐ¥(¹(ÓúÓqV à ÚnPKJu£¾U’ÆþŽd>ù‰CˆN:ˆ8X…è:»3k§ã÷¡ºx†FOéòTÔü*…YGê±Úf»wÖæDØzSŒÐ.À0`.yù—÷íÎ`C \ñ ƒ„u‰ò‰ û‰nøÛDž'Pr { ŒQønŒ©¸è ?wm˜É…^~(\#D•¾Éy/ðÔ=jI[I·:n|ü9]ÿ Ãå÷b)UäAËU®†*j¿¿¼/™yz2PšÏhcºà¨L±lüš`0 kAaxå&<"0Ze\÷¿ßÊ¡O—‹!ÂqQ!œ>l%da"‡Œã‡cÌ¡mð?x—>Â0¶yYs‹÷CïœKbmj‘±™Q_¤øa4Ó$jÿÀ09nAK]”WC'âÇ4Ç-€¯gÊ .,‘W§ærFÖL £ã/$QêDdüèVi"ùhþ{…˜ÏƒÓ¢é½7¸ÂŽ}풀퉬Ÿ›²â?¸nõ®†¡ø‘›îÐÆ%‰^¤ú‚ Ì?—gJ\ˆëNÂpvlX—ÕH€¶ÄÝÄ`~hzáõƒ0*õR{zê9ú*Ūä,6Æ_€@ (åÐáðZh@?\òÃ[ˆsÄóÛ1Žb$ŸÀPXÑ9¨­Êt­ÒãX_~çýüÛkEڔôG˜Bw£#YfS”œ%qžpœ›¦N©àHåfiêRøñ”ƒØäÃÀöèÿ(Tfœ_ @™+ÞöüŒå#øºI® +ù”±ÐED˜{2gI¹üL‰–/„´¡4@"Ûó Mw'#…Ûa™¢^Ñà‡†¬åʌ'³Ýþv ~˜2±¦\½¢cÞ 2;»Ï“]Ïgnؒhü†(BÝC%ÑV a ‰*àÇæg.±¸,«¾GŸóyd*àPIóú +²‘ŸÏT‚ÏøxòŽèp‚¼6֎h¤yLT© ?jæVíìrA?Ìyi œ1ƒFAÈ­³‹H×ùæ±ÕÑ®aÃcüh‰;ҏœUëQÜQNægJ(M›¢•§DµM™µi šãà)H \‘õ——fÍ«ãǎý +/€N ´ÎY +X6秋¢+vm[ [÷:ÍF‡C³Ò1veç·~Ä7 ‚¦îa qXסy¥ˆ.DzoðDsü_˜6ù&ò% ßâµôø#ÅXõ)Ý +PQ7€²lV8.Ä[Î\6Äö7ô‹$ØÒ'Y@²Mý\llAºAá«V¥¾cO+œ¼9b€ŸøŒ]O?4¬Ëí{®É[Qx„À¶‡ǔHʬÉÝ›ÍY>ÍÆêuîbÅ+Ä«à™·1êt2#8ZN¨½X QQŸ¢D{QFlâ„w€^4j†Cˆ²8Iˆ#ñ…aŠ(gê©/¶`âî• ’wßû¸ÙIrxøÈñ Ø{Pü…剟üØ%?Eƒ oêóB¿Ä“„ÜGڜ?[‰½Z–q*hVHÎ\[S¹ÆzNœh +eqÐkð-2SVNH—äÐãD³ˆ!¦kn¾BÿM=ÁÑg«qwÐS$ WÎñK2‹voS8|n{Ɓ3S g‰^¸‚¸Ã3Ç%äÌ{Áie0”àS8Bþ ³*Á¹1æBR™•µû•‹að Ä9øÿêN"Âx6W<š}O‚3MÏ‹ 8'|àþ'8‰Û1ööM_ð‚²aÜç§$đfð½»Ã¹dÊoRI×7U#+ßôµ²¨1;å N`Œ$¡Åë›fhè ¸½›:i”É9߂­Œ Hç› )®&.ìF3Ô¥‡öC–b|¼5Ë[ø´Fµƒ~˜©voù¦=ϳW-9¡7'^RÜR¾É#’± =«c*?ܛ۝²/Á㮃÷ôþþ„*<œ·Aƒ_xŽû-ñ'À¢r +KX+ⳈMϟQ«òê&· 2xOp‘-Øìôc’ô^¾†ʼn²BèsZ}Äئá½1ˆÄ +¸1}ÓZР2•ŠjæÏu¤Û9ƒÊÀ³,æaÁ[iTç2 Z”´7‚9ïC=Qœ0ÄÀáÍ“LÌv[X…öµ%J0£n¹•I¨jì,ünŒU‹èùPÝ"§ªöm¡YÇÆUòm\ž‹9ƒúÏ"KNŠ|²~¬µUE9P•_4`ižæVæ…mæe“Û®Bˆxü©³ëa—É© õ#ϑx‹¬Ù9C Ü‚Ö›š Ø´ºõã‘AR²“xÚ&³*ve¶V… +Â6:UÁT‡!/xSM²4@§dNâ˜ÇÅ5.£ ÐÉOª# ‡ýlƒñMQ8ˍ,Y`þ=ï ‹¥äOÑΦO|v]”ÃmU·Ú0ùᦕÙ)]”eKAÝÕ&Á×6°Ý¯#¡RõÃÐÀp-Ûg±Sv ª¨º&íù„ÎÐìõ¢àJÚÜ·÷ºn Ô€拮X2aM\a°P­¼ôÈ6ßV„fšÿ”ÐK]ÈÃoTøÃ― …–™âkz¢›guV¡¢ËÚ‚]ÍâÀ6P·?Â]•æ1•X§Þ띐‹}nŒ_ÍoA°‘‡ÿ©`áñS‘þѱ)žû«vòðÌ°q±,|‘RÄÈ|•ŒŽM%OZ›è Ÿäíòo‚ã…ÛH Òƅ”k/´@ýõх-ücÝR5œ~{~°àՅˆÉõknf,Nˆ‚\•¤Ö9îÃO…÷_éæÛÐ|å œ +*%—'üSsú¶kÅòÁQwñ“ŠâI+J_ eM+Á¤kÛj€jΛ†îEÛó¾: ‘€5M÷$lá +ÒsÅ}ø +· ¶6þWî҂îoáÕ»…À¡ÏΟ®Ò®Ox‚<ÑXtÂ?n¨ÀoO¦`¤|á +¨2…Cª—úÖÜ<ç?Ü'».ÃÔBØ3… +W€>Ðڇ¬OXÕjÐta<‹;—im)É]ÿO²Hÿ=²î¸/ÖAS`l +Y¨è÷€O™tˆbf6íÞ& ´¤)È}i +õA[B¡çÕ¶ð$úÁD7Î`ِòuˆ¡Ô§Sai@½â;={ʱq»A¡¦€.xåˆJçª+ ãÅM#€5":DêßA?²V•‹Â mèî™­¹îS¼8Ø$Õ0¢ûϱw-ûM!‘ò)Ï-œkÀT<€äSàKä +n£¿Ü½á_9ßC9„s²¾|ÑfÙá£7€æ3ŠŽ«gß gm¢•(L•!šâ"šd…Ç?˜DŖëÖþŅ´0!I&šüç[8“òNhb­ûa0€’c`7€IÅL-ËÙ@ÁÇ ­ 4‘i\:û§"€9MX1jÏ¿â_&o{.á]@Xpæ່¯>]`¸K“í¾Š˜ ¨ŠK rx¶M’ÊÉQo'Ó¤œ:F-—ˆºèǏÿ†›ëò¦ý¶€G× ÖX^ëŒÜ`…àÒÉ›qÍápnfàV2r¹ÿêƒ/¨™mA)*Ä&„†x)kGwÖCSáaë‘"ÈA˖)á)§öˆŠjòífa8xw ¿ü•TA)*ÕÄygzµ¾V*ÄÀ¿Õ­‰8}µXE—ùŸJ5EM }y\î«ÈÇR¬+é^C ׉¤cW–âÓÿJH-XYÍÄ(O‹=1¿Éåg.¶6A”#Ïk0¨¡aʑù"V9b´áÝ4'DÙ¯ßGŸ~(nZ=~¦i`7‚=· ^„˜6A7ý¢…Îy –&=UÊÍ[Ë9wV*+"GџÈ|PÿK‚O¹|â+iRRԚx]¢Î¦vÐMr˜ZEäÞÛaßĞ\ß«b!W.Lš®ù}zá¨=Òݓs„ë„ùˆ£Òe»FΠݒ€—0Gˆ$ï4(~Ë·„ÀCâ0¿¿å·Ò»œËÌ ,%¨s’€ïê-àIÖ¥>ò×B’i“(Zù»ÿOÉH´,ºtXF†”|Ëô™²8g’Ø39Ù.æåÉâj‚j½¸nH{•ÀŸœa ö¯T4›ú¢-’Á<4dìzRÚyó¶+úD‘þ(ÖS縡ñ“šÃ– 5D Óª7K2˜¦¥mDî±QÿÁ2òï±!UU%¤MO]›äœ»4Ž"vô•y‚õ¤ §bã0eƒ ºÈhYNÁ‰×…:Òï#í|­ÞцäPæÀà¥qõpªxv¡¯„SãjԚsÏdý5þèT…ÈÆm~Ö¶_¿|Ù©öÊ;ˆÏ¹…þás¡Îfé~.ðE“›‹l„ã ?³E6*2CØ_絫Ê÷Kã›>i¼î13¸a}‘9ïŠÉPA­LɆ4].ÀpÒ8á8/ûíYßq" $ã‚GN§ë.&.OŸ3ÿÌ8EMÆãœP×¯ÁV5xOª +Ø ùÜŽ:ÙáQ7gžI‚î +ò½OA=iÄG´á#  +ûwÁɯ2 hÜWƒð|v¤JªoÅûñÆ ä`'së%éÓ³…0U„7}dz27º§Åñ²«ÿ{ÑCW÷ÚVÖBǽ q³äB| R̳ôWüéÏè@` *ZkÖÿ +ºàÈÍ!ÇJOñ£9 ÑéîØìS_’̵ÊAÒt»)únò#:Òº„ ­¡T¾éö!î^Ëé6D  :c!Ñt*ðߘb= ‚K‹ó؈ºøŒkÿƒWoxUjÀ³%Ò2ٍù¤>Œ«\‚°n{ApÅÖ oÖÊõG%¡É ~jCë1Š0Ë¢i-{(±…*ß¡àøG|r²¶Ç%Àò•HUJ¸ °ÃïDÉõŒÀÏ„¦iˆ¤·uè» XV:X +††ÔðûL f«mMs% +Êü=îå0 ý`'¿ñkˆâu;¤ß3ZZ6â‡ÅiH“ÄœEŸ¢íKpIhã2AKç ¼”;^þO‡D ^+ˆ§’$Z–úg£)Èò_¶*±ª©bZö|1ÃCòoÑç"ï-½Ðoð  Šîƒ9j Å|³†Ä€ð¨åK &N@QÈq„Ea(²ÛwӎG#“:å ’¯ML.å¯ãx* +EÛ³°ým?w¾AWmuq˜ÀĎúzKºwý(Ë¢g:ݔÀš1XšÙ(5?•jŽ÷÷]²÷ïWîà{àD‚œÉE=›Ô‚;;`î>é5—ÅûÏÐj(‘5Ãìã5†Ñ=Äfæ‡5X&ïû‹5…ZóšOqÉ?<£Ì«GÃÃètB%u„žŒuîg6„¹Yk7°®·ò»kpdÄ{xyÆÔ2”ÉDàOîMñ2(c!ÏqH43ÆGPÔëg‘8sEW䍡¿ ”ÅöFô©˜Úàaæaêa~9Ó希ä``²¥üòE¸Xu)´1yF’{˲§LOڈ¹±¤ÀÛP…ˆ¬:Œ\Dэ­»x,Hò”`­ûs¬QÅJÆOðÿ'ŽìâYI0Êً8g²o¢ö݅2¤#³?ˆÜFá—qÎyÖ+,ÑxúQ\†ëlÏ>"W,ùݦƒ—%Ö†Ó ¢¨‡Rg•—-ã—42v£²uR4vD©“ɸ-Eqùz&B Q3±%:vã£qùPZÑ;¢ø¡i¸ ÂSëþ÷µè–¿¯gÿÀ6«fô—¾È-恤È)æ— 4ÊÕt®äf1l,¤^\œCƒ®æ<ødp¼æˆõ#Ñ¡L1©ãÚOΛtÇ-DwÖhœYqnµÖÊӐŽA·Ú™yåbû²_¯% tägAù#¤…Zž['häÿû|lAͧZå~€D T7Šó‰N»(lè Ó¿¡XœÍ(m¡Â™®ýH‡çÇ,d@úMTH¼Qú;©är® XÔÆ£¥®3“îúɪ6U³HàçC9½bÔé¤+X4\òIX ’ò&üäÜ$}CÃ)¦7fl“`εðRcOÉâ±ëSu«ÊZ£Ì/pa~tk„,¥¨§$y ¥ãaai ¾KeB4­ÏìÑñ +>8ÈåI‹ŒÞ ‘öæ!”¯ñÛc>·`y\õs§b®%…ÙJá·Y¨)Âw""ü"ñÿ&½X4°D¤àŽÂ^Ï»ŒiúÂ}_aN:ÿ£†ÑÌ«ØðW(ñ'h*¦Üôk{óG-¡mc{-«óóbë‡ApüìSÆõ1f(iDòÞ#oÄYÝlZŽ˜r^Ë`"!€:,ˆÂ€›Ç¢jÙf "j´í’¾Ç½ulr÷ÃHÛjé:€¯˜‚˜>bª o,í–PÂßH™~þð™ÎaJ€ëŸzt &3 »gXßg[ƒ §¼ì…'uɍa$þ0RþÂp]ÉnñÚ„¾BÂk€Bï,|K™î‰:Çð„ž¤/lgª×|)®‰¹ÆÍ%MÝ<BG‰®ÌoÀ¦ú:3Ùº¦vx.»c` +>„^ꎠ0R©Æ}¬I:x*S¾âÒ?$Aî +{FÿÀ&]}šÄ|ÖlE½ŽÍ›ù­æR §zà$Dfc=ׅÆç{C· +¨ÔöbégÍN“‹¸’&9dÈh‚Ý!ŸS½üî'Q]ÈLK¢Í90@…[“š„çr<,”ô鉵ó¼QŸÝnÀ;L²).1mþXGýtzçIPaNõÆÏ·Šâs™WÁ1·I!M£)w¾¥È­1“<ü^ý|ùsN"÷§ˆ0H%ò\%Lÿz!! ¢ÊeGä&áºö lð¬ÒëÆ#0=¼ÎgQâ\ØÝN]¡ÜÖâ5‡íÊÏl«G•B=õPûºiVr½ÀÏ÷r#§åX£ì#ì)Ð¥‹ +’ˆ-‘6¹íÈ +Er¬fY¥±ß¡ŒFB®x0ì객½P0òÀ­ Œ´DËá z¾ôœϵÀ{‘<pexÇþX·+Ê¢µˆ¨à§Ô*'Yl£›9N…µ–“Ð~£EjIdÚdŸýÁë4±T “«Æ âÑè҂ɮËqÑIz>³øjaXžÐxš0TÛé‚÷üt®§5´ážÞ˜ýÂâ¾X :ñXæÀ +MçPõ”çèœLpã¢)Áié«0)Žy…[ôë‚ù. âRÞW 1"Ë2ƒ[´D†ß9øaÞXªÛ~ÄÛ"یŠãJc•«›¢ò‚B€äàÆ,lV ʳ,†9ÌÐýù’Ÿ)¢µÎnõ­}ú¸hÆ >ù®j~ÁDqքף]ÀFWû7ZIݞ–kU„ËÀö6¡ƒùa²x^=i² +1ƒÀˆùsB`a’¿²`>F˜åp,#ö-–˜™¯©D‘ +År#a Žê7ûüýq–æ8XʹQRé 1Rƨ¤Â”¸ÆY(¥Üú}S˜•g¬#ÏX áQÛ.B=Â]ÇWpY 䔱2/íYo›ÂU̾ÊA̤ —(t0½š¥g1fԏÑJ3±;þGXÞ5‰.þ•ÏI‘Ÿ™‡Z¶Æ3ÔBÜÐ%´½ª‘¾˜e‡ç,ØheyI ÷yM]܈„摒…î@”ª+¼Xâc%uü…æôÖ {ªåµã…WnÚ¤*c‚× ’a Ê¥ä( çó}צMÓ/òØÜ#>E0•Ïí_lRæ!êo¶°«K&¯~€É{Q¨a,s~x_D~Ór“å&!P ŒæwNm5>ŠuûþŽLä|ÅÆkáÅö¤³ð¨Ø¨/4½%ù5ÎáQ´¼«sÀä"{Ã6Õ­Wè +¿¯1¸ +^0sÈoVb' +ÝõBDF6î0á¥v—¥ë®ù—Ðï5ðDz·ÃÐÊk£#ÙSô—uØÚ'zõSc“¿(‘£žÚnô¥˜%¨ „R ƒçXx(ÈÆcÉ>W±%W©½ä˜’å—¯>eÄ=/âèà˜ß÷-½ßtæGs#øc‘ñ*äbog?b#()‰£÷a.ªøö}_¯™`ô÷îGá®û*3?™‹ú©l?¡ì÷l¨G^°‹¼X%B¸Ë½N-ؙ@‰ÊUž VâGœüΖqü6¥Ö«X§5ë2Ü\ WMì+Ú¹÷§°·0„î_‡X¯ «›ú„\҆ÄDÚ¸èa¡/°X  «=NÒä©qXY«wëŠ÷K:`rÅá U%” hèR~±>U0´! t5ï^*˜Ë%ºK ®'à;´g~cR‘Õ6iÁ“¾Ú(xË +…`”œs‚eCRnBËóò†(nܙŒ‰ì!B¿©•w½§¤ùIìš;@q™<ŽS‡H]š;'òúóº¦Ñ+åW0=ƒ:ÁˆÃ=‚iÀʼnçŒ=㹦/~¾Æ_+Ì/ÒÝåpˆ +‹©Û„XÁ —-Ì]*˜XwVJ† …؁R€ó` QuÕ;\„2gÏÁ +áÂ"÷ø'‹( ýð+¦þdC+ï¯ëŠbäö°=*6:É-;[ƒ5fÂo熓 Õln.ØòYC„'½âfþŠ1ï+JØMˆZ#úD…pŠSÀ«ªÖ«åù ,xº•Üþol»oK$;*l©‰ç sʘyúLT5’Õc®DÉçiOýY­Zì^˜è¹0Ñ'ÅÞÂäaGáܝ¦-LPçÐH5}JÜ?’£­9¬…±f&ùˆÎoxS×4º$Á@mar‚òLÍÊ9š©W6Ý>„@õ*ÐDE‹Ð'g_&üc`›‡ª;CαTÌqÄ}/A+È[˜èló}”ż¯Y¥ìXx8¾1ψº4S"‡f  +00X l6ò*J³A删ÖßSNtAv +Íb_ À  hæìS‹\Œ¸“·ím…„Ë(L*| ˆöuéÃó3 +$èfʂ”N„ŒWý7 +¸Aw´üÖý§5)Xûâ,Ì(ù,“&Ìm—ŠîE!°'frFhƬv¬cpÙ[^ £šÊ؍ÛXiF +Âp‘麸fêʧIîC ³šc% È-ð§NT ‡Jé)Ïüe¿ÌH=Bfüo£áDÚÆãP«o}pÊü@—Tπ«Œtfp†‰¼‡Awy՞ƒã¤¬‹¿“*T7nNº®èïÀ/²1÷zúŠ«¯­3„üñqÕ}ÓñÄÉ«¾P9¨r'h» ãâA=Žêß%Ò;Dz}{@˜äóc¾‹WS ¶-õß" +8©N!Kñ„0OíPéAÛ°~1ŠÿlJÆ#7ÀF _잔ZÖȈr +b­J¿ zt˜ÊuH‚jžÚ>,ÈAœÂd€š Žâ–5„ZJÊ=’›ŠPÅ—ж6ڊ%c±çGÑà\&y< žª» #œà84apl˜ðmc‘&aÇ{ÅRMîÀŽz¾‰‰VŽ¼á¸b9C:Š&ˆƒX¨»ôfy»e²5€mÉç,oÜ)X5• åSÓbò•øæQÃÂÔò¸¾2åž.rM ùsžiÆ.ñ{‰ž\#þ€{åR3o-™hïn;‹"·5Bu»û·Û5!†Å q4%ïëm¹k¾|ã1„D‚´!¸q:ÿbN!;托Fúœ#·]Ý"w¶‰I"p4•oDÙdFŒö[À †23u²*1SVô6Œã³˜O ¯'Ÿ‚€`ßwçÒ¿Ë̅$Ð×û:òž«´„­ä¸´½ª¦qê®wÃ=Àz.À ˆ:•s_¿Q˜­`a8Nø^®ƒæ ¢˜jQ••‡L +šŒ£(Ž,±Þ[Œ{J8!m¢ 0ŽN(*æL®d¶#øù(ø=]ßè½a‰ž4ÀxŸ(²R|hY].ìd&‚‹ŸÀxÒ½¾fs‡’¸—Í…{õ‹PêÜщAmDïÂY~kr@p/ÜÐnàÆ$Ÿ§âZHÃ..÷J”©VÓÏS¿ªJMIØ6Kàù" ƒÈ‘S† +zbÌ-ÍÍLµÄ v‚Õ*ÄOz2;ÉFWlª`/ÁÎɝšÈ1€fÃ3Øú €­3Ý cpo¯Êõ +1B+)5>½>’{B$LžÛºd’D Ù¯GŽ™Ó”C‘gë…LKŒ9a$vW,y¢̱ ¼¢!£Ò™¾n©D +åE²½GÅ ‰uÇ7Eã#XèÕT‘]à‰yªIpÕ|˜"HKÈR6‡†(ê¶K»N*Ë‘ŠúL«„®VÀ¨˜£žhÒ4ÚúóÏJ;±ê†[¯a@a”SŸÝ7Æ­ýÍrSÜï[{*2 ƒÅƒf’1®ç€ùåŠqEïd„Õœ,ýܽ{.éP¥Ã²ò=ëc°Eš µV ë?ƒ9¿3Tÿ‚#ì¿bÔ¨S¤EÉ°¢Ëدлò ü *goñLÓ̶˜Ë”¦?|yrÎ ÔøÛÓÞ†#¤ë÷§¼é˜° G8Âц' D›í~^â¢qÂ!׆ƒýS_ZÅ×·Zg­9 ˜h<û‚7˿ŧæH°AQ ƒ™[yÉ<ÆþŸƒ>L¸:9»e8(XŸŸ§‚‚)¯7¯¯8(1~™?ZÌgðW19ŽøîAmråa=vv/u¾ \ܼÄü%’~iìCKo›pÅðзFеÊv(üÉ8„ó ™@Vn˜Á¶VüÆX­A±˜ÿÅ<ª€)5ø·ÅAÒ¹L˜@ª7BƒŽù/ÝhÕðßÝvË$4)w“'(&&¢†ÄÌà̐‰ˆˆˆ„() ªª#¢ÊWuUUUXû´Y SXÍlø®å&>r½S¨.¶a㝠,eG™ø%SÙy#:33#3#3333ÏOdá2C&ðpäVñýã"2½äbdf®”áÖP)ýdG‹È€3$GxtcܽßôT|Q壴Rÿ£æEžŽt¦Ú²ÅŽ1©tŠ]›H¨´¾ ƒP€ÁP@Šãý€  L`t|lx˜œ:—F²(Æ0aEbÀ(ô·Ø­ØI窆´baH#>eµØl´b–ýäÒg±‰¹z<Ãs1$”®ñ*6V)̒‹ô víìR±%õúL¯šì3 2Mk“‡‰W¥Øü§˜ß'ÿõº†)åó(6£WÒ%™E½æ'6¯U* +”å‡Qԉ-ÏYè¶|–ËlbKçJšP|ÅÕÖԇ·$V¯{…¯ü¬Â¹šÄayÿ~-bc=UŠó¼©â*¡kǓ*¯b‹:¨¹¡ãËI`!6멲{|J•jA~6†±©B῎ú°1˜§O\> p¸Ë‚Ñ#$§—à30ç ÛȦy1Ô´aësÓgéÎ};Âdac)#6îd §—’/NÃ惔\"¹-# +Ê¿<ÿDK' 0àvÛu°…M0ª,lvÝ­…Œæd³Á֍àÄÉj³´Ïïîoìv!XqÙPÀ¦‡°‰Áƒ>´ lDÓk¶3ޕlããît²aߧÛÛ¿O»l»Àý˜“@þ‹×c°¥OQ¼`“ÔìÑÿÝ嶀aaçaB2‡`[â»1Žíéún„l~@þÎسm70€™OàÈwuðÌKÆ_ÚÑ®…<Þ!¡E7¤ ØD‚YÀ¶íçtÞ>À¶CxŸ&غ¬*c·W!©FØ»­‡rÖ¯ aIò«¿v|6uþÊ¢pÚ+CXâ¯1ò¶mùÍÔ߯I³™±ì6—„á0¤YFa½vÏýЈ|ë×ê¬f‰Ç+Sð‹YÎ!$§ð9á9 +×扝ˆuí5ÿJ,áIÜ`dU½Vnˆ¨¾¶“|O­["'r¼hÂK)Œ×ØØQ.‘NeÛR_r`J„;bjð·§Fî-›¯5Ë× +¦ðQ¢³LI¾ÆmïE #¡øÙal½©6~ázڕj,Ÿ’Oãè(¾¾©Vm¸Î^Ìô3K^c±×ò  9<Õ×kPH{ã¬íÅÙ[ËX«k Ö±O‘K±|½ :ѽªÄɽVNµ !º-,Ð+~×∯kù"ȵo}^[ª²^eMwÏ]%Úw eOƵŒ/û*JØ÷HCnŠ@C»6úµ5å;)’3€`nÔê5Õ³Šs¬ÇEÒxÍTŒFBv­LÌçÑ"æ œ¾kˆyF±Ö)6«8­k¨döai¿|¤¤7ªß@›ædMۚäÜvm™è`¾ÅüæcÒL»&Z•g×ÐӔý˜ÎbÊÎÁk 7­ö>JΈʣ5X½ €6¼ºöÆrP?·w¹Fæ“7ŒÕ¼[⪙3dµ|†0§”¿ª|&µj³­Œˆñȋ +o,º¢½ü¹v¤Ê ¿f=ג {´ïü†µóº`‘m( =W5Hk^¥©¸Â.²M ÊÐz¹öÚÔb搯¿—M-ª…iAY¹v Í%àbeŒ† ݛ…™2µ„h»šZÞ»5îÉúÈ¡^¹Ö]ø©‰eۗ¤>®‰“îmN]£hm?r©D]á;®1K€ÔtىQˆ~Û¸ÖmdËYeÁe{/÷Pdqé ŠÃ š0z„L”.r),\£¸-ÖR°×zV\‹ ¤1 v&>Xpí\τǭ' ®'[‹|v6íëÕxâ€k¥n±²µÁÇ4×Ù|7‘³²d¿µè6÷ÙþSÛö­-ÝðQ·‹§uÚáli£H1 G›A¡Ù3Úmíp$¿K惔±g3“å³NÖ_ì²î`Ë$x`»­©‡ºHP‘nö½. EÏÅ}$N|€Ð2.ÓÃ|]öîj*‡|°“wÁ«ZØ2÷8"4@ó@Å3‹,— DÑðáµ&ÉÖðYäC6;‡[ãVqʪŠ­¥ÊÔ™§¬jØZ\3 èW³0ͬÔyš­=$HÖÅ15tTÚBÂøk_¼«ržâö1¬zÕu"».êÀ2ÈöÀÿR©Ö ;WÞóÀSk>ê/µÖ©p;##Ĩ5ÃlÓ-[î1ÒºmQ*ÓÚªÄnìÌ$ÅKk„ÆJk'õÏßÄ.;´á¤ðrö-”MZ±Ï`’&‹Å3–@ >ã€YùŸ¶è«Ášµã¶ký@K‹ÿà¾YUh¹:‹ð|žµ™P.2£P½qg3ïçÎZo­´%VéøŠ#ŽÛ°!k¸@ýaqÖ֖ý, +Ñɦd &Áxc}à•f¹Ë¼\cª¶ªg֊I +seÖ8ź· ¥â“°ša³ô4O(v]ø÷€IžEâ/y†Ê¶÷£0ô࣠ýɐ)DT/JWëüez$ЁêtùFT˜ÑnŸ(¥˜«µ3´jçÞљ˜N-U‹FTW‹{b| ‘ N9Šå^5‰/ª­™p×Ë •÷æ ŸßÉÂÊ7ÅA¢mVS¹ª-ÚM{T÷=NÍú!¬¾ªiµ~—ÿÅZÌ ä¬"®kYGR mØ%¹Güââ+!÷ŸBX²˜ñª¸Úتˆ[#-f]E&qT%˜ðÈájf© ]•ñ?1wJ"kB¯”íÒ*³Örm´ÊeNõö ¡Zrc¶ZŸ0ýâµÚ«Uy‹ë d>¹µ4Ò¯´–Ìag5»Î“0¼Yí½ä½4+Ùeµîð+«õ`ÀæHÑû´wy:çل)†øô{Ƭ֊­Y«0&]X*Ò§³Ù²·ÓéSÜ,h­Ý‡âÕ(v{‹ ÔôíåU{cáà`ü’³È4Œt[-8°~†i&-«Ö|÷ã1Kò¯}ÛcÕx}¤«—­Áê‰ÐY¬šU-s©s®žHʼäUµ´^íÿNa2‹ú1éC·ŸªV±¥lUCßÁUM}õãdôä—Տ G&ö±©ZM¾¯™ìS€Sõ#±Ü¸ú1üDóprF"¬üIÕxz˜ïŽ éHJ[=ÎÝØNµEېSíûá›jôf«©†póŽ  +f11Ÿò›©ÖÈN)’ñDiLµÔä‡45—lÓçK5Ñ!ta`6WªÕ›¯ÂƒûÛïoz°D–RM8«Ö,­ ªÑ…I)”àëXÎêS8;¸ðÏíJVT£à1Y"2Ü-'ªÝm›à U¥“ëN$Š3+ +ê3ÅMF+' ëЩI„‚²vj Ö»r0 nBµ¾'Hµ6Ñ~q½)3þ;A<0:ú:¤1t~Õ&íßDuÒX°€éHõ‡[nöÄ ; x˜Y0¥-sþ㩵×iÜ´KÞxê;µ>ú!íÔ)O›Îã\¢Œ)%¿Ó°ÍA¢ÚF Á*s¬ìŽ Qépjo}Š§. ã½¾É"+‹-Ô;×M­5äÞYЯ§vӊÔÁC;$—±k@µ +­¢É\L§>tì&Õš©Ÿ¥òä@Ö&iIòJ†Ÿ¥Ué“'ÈO`vÌì¶41Sé…AãTCúõÇ.2bŽ2é#s‘½""q˜ZaYjVp‹È2^ï7ä/5Þ1ƒÞjŸønxz©µ¿efI—èð!”Œ'óטÅb+ +¢E×0*‚8á\RV©eK’Jí±ïD·HaÚÕtJMXˆ¼ƒw¯ñ:RŽ5$ÿшû "Un: œ{G©Å1áe,•›ö‹·Û'ØöiL‡R#ê<|&WØIÝI-7‡yåò÷œp÷; ÎKÒú߈uÍ:ه¡Jß5nþ´ +6™“N¤–ýíN ŒÎFMYè,j{í[HŒÓ6x@åÄ5HÍ«£9@‚‰msQq…Ô‡B²Ê£&Q2¦Œºm"-0¨ZÔrnoÔ­¢¦ûj.»9”Dçӌ]ò‹Ò\–£Jù´ú£&´õ„©'‘ìŸÆØ:Ã@ú%büžÆQ‹ÓOhÏ@È\VåµRY§mÔšbÍÏUõð®x¤µ(¸*̔fi¼}χ˜œ,-à¶NK‹}tËai̅È3 ɱ¥’,Í$t`¢†Aà +“”Î }•¶I²”ÂDLl•f·š–£¢´e¿ˆ~ÈRò-KG¶Î¡Ò҉ðfÊ©ƒ%ÌüM’)tí”fôÊMi» Žö´¥ ÚÁ>ÚªC/¥-}¥fNZdᯤmåÕ?½Z°ÐIiËÃ¥ðùY€Èôý8Q¡´9Ï5(mEùVd=ôY›‹\¿I’¦Í}pîy҆¿+ÎŒß +˞ü‘†¢~ckìgeÕ=iKé'ƒ»ÝÙ}›~6¦øîóá4ž^DàF}¸¸NÍØû~À|Bœ eê+ˆ1ÎIkùí¢·{ Ì >qҎëK‘”ýõ:<-¨ëˆvpb•ŒÙòÔ Š†á^š¥‡Û4Í~¢­¬j`WáÒâMÊ×D³F­ÑìS¹Òçbf&ݎA#—Gt¸B¿+^¢!ðÜmo‰÷Èsÿb#V´º-€M«ôNÕV£fŒDK4­ÎçŘ?5óOÀ½4hH4.ÓjzN^'ØÙӟ?„ê#®ÍEúÍiU\BdßCI5DËAZMëË AÊÛœ:41 +*à±U< 8-Y@?u"ž< ²¹ð®»Ô[ýÐzå6Ò´Õz¸ƒ£Îö¡Í.â1I"B†ì ­øžÓý°`ÞCc€.ðý ùdºzhø[hkä .è·óТvaל´ºæâ¬Áû õbcRÒâJŸÏ>ȞâÎÀÖ!ɍC«[Vž0λò…þ©,¿¡éù=Ø /ÊÙ¥¥fênh9©j†¦ƒ+$ۑÚÑÞ£6Eš¹²ùçg10µ7+\¡¨Õ6{µ‚4C«pÒpe¨%C#ÐÛ:~\47[>iü=MUz^f\ äòaJœ7ŽÂ»3¼Zh +^ ÈR¶Ç’ž…–ݶւå*dzh„Ï +B®´‚æB…ßE7éËWîf‡ Š¯WÂjÔWò>4²[5°L$ÍV| +S΂ÎTf_ +氁JØX\AKÖKõNO®‚&"v£„gD3ðЋ §5Hî&hî‰9[J6™/AÛ1@³'Ôì@Ž¨œwf2r´Ãµä×;ôZ{sŽ4J¶‰<Ê#pŽå š‘Ñ][u]­ÛÿÙ,ùìÅ´¶–+39kݙÐh1IY@ƒÓN"o +挢ž¡È¦óöÂ⯁v4ù¢U@ …®–( Ò)hë­-mÅù.ZZAiæÿ ´hÑc¶ºÌÜmÔ+~Æ œW -G¸»Q¤@ëÐÀ´bi›û‚.W¶Úœ@£=w Eæ휥K[+;C ±¾n&#ÆwÍ°/åùÂO ˜Åy´û îÚ#@–RB GZœM(wßB³Õa¸€¦1“øý³ù½H^ýAu vqµiãD¦ šÐò[2›;U£fXd´µª°ÂÇë OñÔpz@SÍYP?ÓF9hŒqÒ0ÌgV…(ÂN¶~֎Ló¢¹úg}±—Ê +îᏛƟĥuü³’f”wǏO×àÛû39Ë=ŒÐ°¢_ö/NNæq›HÙP*áÏö3%Ž™e?SUqr髾㛊9~d5§ã³`€›%~z$»ü —â´ç‘D4ù™$¦Äɲö˜ío†8:A /Šùhj·ÏrÎÅH¢0ZŸŸ!ùÖ>낈ËáŸ}Ö0§8 –ñªJ6Ë˔ZËÜ>°5ŽK}†–.Ró +)ºH`˜ŠžÉÃJŸÁ¾Ûi+Â4°nÈíJGŸ4A9jÈ/®xáì_1FÌÏgžëʖâ ˜H<í|Fª™ŽÝ+…ÁºÍg2ùÖ9FTÌìåÑ ÆÁеò ’Šþô@0Å8|V-¨g‚¬ð™j€“È4<¡A|¦7{¦‰>SŒ22k š³6Ù €R*B9« "AÂ!ò»ðAÝ3‘/[YêÜ3#›'žžÑX݁qÈYDþÄTr³MÓ#qŽœY®ø»cRI¸$kôÉC݈-“€Â»R÷y–¯C‹ +Ý]9Ò÷÷LJ‘”<´Ä®gÛÎÈ%Å n±àŒ"¢‰Ð(ԉ›bRÎ@¡ð«ô ²÷íøjBž S›&+֊«q« íƍO€Á=žYÃ^FmؘsÏÿy¶û;›9ñ#¨ô3Ğg v86ƒyç™ÍeâhJzŒZTè™Á ¨¿ô[™…  hFʳÈZd e,„MNžÑRè&”<ïAèyÖÚÇ¡¯ù‡F’…<ûÿ±îF6žSrè»+Lù)?žµˆrèóU·;žýŠún<ƒ#5+~Éû\3žå›†9íâY…¹B(iZñ¬ý‚ÔûG%RXº¾#\æ?ñŒ9Ñ@Ý­éʸlº?³ïJ v^ÐOE<ó¸bE?ì_e㓚êÞElf4žµñnBs=†õù(‹!Q·…!W7¬6›ïLHol†Ê`S÷¹õ‹YA°áLx$de1èŠx‘Kd3Κƒª‚†ù¸¹çì`IVYÁ"suv\=’-1ÅítoëäÆëÎ~+¯`&l,¼ÃŠóߪJ_g­a™„V¸"¼ÛY^Œžyîtۙ8ëV͎Ylg{2gQQcYØkgQŠ\,¬vFƒÓò„K¾¡Øªˆ<ùmfå¶*CŠêaIÆՊ¡e°4Ñ©4 þ×Y|ézD‡s&¤K]7úœÙ“ ²Ô…ðHü"†ü  3àW¦¢ä ­1´ÇëÀى¬oö8:ë욣zÛÝ«vv,ò–Jš±ÎZ3’Ö;£Dó¿:SL_ÐS´:“7 c/tÕ—ž¼ïS˜ê¬ ia¬û”Lèl¡V&ê|:K_^‘;4‰‡:yþœÉ°Í”kؔ`‘Æd×X}ÓÙÞåì§Á«€–¤b1ÓY»hXiM_¬Õè8Ód¢á5’¡:²ºR¬t¦Í9Óp»”휡ÃxTúö™´ó '1›ÏÞQ-ÒYŸå³£CÕH|tjsæg]ޜÕ&lӔÀx&™Î†NOÎ~~2 ŸÄ 5†¦‹|èÌÅ%åBge²³‘lQt–Zúx\q¶'ü¬³³ñçL°.i l„åú}Î:Ÿ}q_æ©:KVyδʮë3‹Œ|RÆ’NEIŠkš±¨#(²ÌYe‡‹˜èµù'HÇœáƒ„àˆ˜zøãQR¾ÊÄk͊†D±†ú–³­6Aæñ°$¡—YÎ \M9òù•ölðìfœ™ÀGð¦œ}ç–Q—"@Èý+˘"ÎÌ Îœ¤g|Íîšx8 ¨ÉÀh÷û·%¶g,i¶›×8‹"€‹€«;8ÓtÒcfl/ó–8=|‹3·®ø`¬QUÈò7cØ»¢zH{Üpv3èDVDÌcù¥Jšé»ÙÊüXÉ»%Ý}¹p†©ê¼(ûU8‹ÒÜ +<*y“'œyDlNÛÌ"œ…¤zp¶ÆÉgóJ^pöP ˆuZ'ÛßÌn'څÍó‹ô›íz(öš¾/3Gºæ7ëµÅ7xœï›5-*êzÌ&Žu:b†w*…<Õƒ.3´#Ze3Ì~Ízl®%éÍîÄ+ìÓfJ³£5ûÈ %¹ ½{eÁ3#ӚUkè±+æ3£;œ{å£t‡&ùù_Ë ¾nV¼rÕR ³ºYE4˜nörUd na¥LN¼æfX?ÑTö™AE7WÕ6ñ_Ü,‡0f‚†Ã²L¤1™¶³lúVå +÷6«¼_ak÷ÞmæD>îM%$ÜËÌmfö ~Z›åó\4å4ÂÙj3‹Ô§aœX}`릦t[³Ä×ÖT§Íèc/íш@*mÖgb´™°hÈ m&%'è?|6 û4DïÝ:|w!G-dÍrÕæC=Íñô±ˆ ùµšIB}²fér(f6ƒüΏ¦y¤—͘. U6»ðùÀ~Ýâ™H !µÂJ‹id³À½ý~¥Üü¨?œ"ã74÷¯YþH#ØÄõ5qÀ£+*M³U_ÈR‰šðºêšñÕ0f®™ÀçŠ(¤@dGý[³ +—Âښeü°²]s·f—ìÈu5YøH¡êT±àó°”iÆ춚>ÕjU1s4ŽX9L„MN§eÉá†I­$à'ŒBTՍrühë±ÙÚîû^ÖÅ‚§]š#ñl«c®—šéä ÎÓRøIbµ âQ31؊šm"`‚…†çHšQíꖵÒRúU²tˆº~š-ÙÓì€ÃfXçyÐԙlú^R+dæ4S/ä¦*”Ÿ9)­¾Dõz=ͧòÔô”fFóê1VYŠ²8iæ)w£Ž‘uK‹;%Íd=âûÅ4Ö×!Í2šˆ`Aj÷¡'߇$gÖÖÌeÌ'$:àŽfÖÁO‹G̽ÑÌj¦6%È׌fŸ^¾h&æ}0>ϊfé|o鋒VÏ>¢™SðCFwü>h+ +l‰õ>Vff|œ À\ M¶ +a Í$~*îÂDs4‡2¼ò•ê=.bFí‰!| §Æ“ù̌,Õ=ˆûJCúMˆûè¬ÞÐ ¾Ì6å1 \ÏìRÉûeÈM¸Ë†Ýµ²Qµj}Ìí`œ©C+夿MZŸÎŒ}dB«‡¥Ì8µx@°@^ÎìUv0ý-Céd^3[÷窙-m? Š®S¥xg&EcÍÌ{6¯:fÃ,½æÏÌÞåwbÂò\PBžŽ™ñ,:˜›ýØ5kIföðꗙÑ·$e»ÉÌ0é³;Bï”Ød}·'ŠŸ@uùLî4q{EÌvD2™±O™eKÃ7Y ÏUK™yèqeÖìªÎ²*âéžq?fLj‰pÏ®ÑòU뛷ɐ.™¥–±!hÂ-Ù£ FÚùԉ°ž=ƒ +¥ŒÞEY4Ϡ粈3¢-#XÇå¡Sh™1…Ø„RyºÐêò7È,õg®*R?ÌJ³Ÿ íⱀ>f_í1[#ûá•ç´Rï˜uÞCÀZ|¡Cë«’€ë7fͭߣ{QZ¸ç¤›Òå Ðî¼¥1[øãÏhh“v˜W³„¶]¥f•Î¨I`IžaCõeÙ±M­Ì«b&œ_éíâlïc§˜%/pÆÛӆ²™™¬C§vÎjŸ‰4ü‰Ù˜ ³Aƒ“¼R‹o&e-­“Û÷S¾Ÿ+ Xò7šêÅ™!²1#+e.O•åƒ™Y¢RÅ©{˜å¼# Aš3C^«ü” Ò*ñ¢v‡¤óïf…ؤ=ÐÀ”ŘzöFl ³-CòÑÉŒé;‚F4ފ©¿IÖs#’§Øf´–çÎR¸~³Üň7˜Io‚G Ÿ~†oh5“œJ¿ +€À1NlÞJ3RØÉVÃK|`–Qe›³ÓUuŠK*òäX`F/[³'S£î/£{ä‘­êHò—-½„,G%O ÔÝ/óû;WK«l¾£±./ۄ‚g«Ôkq¤/»5ì|ÙÛH€+¼§V݌/ëí3NßeÛFðÈ-î\ѧ$“'õí^vFoÅr’$®‡PjÊ^†`¦Í=G½^V:ÏXD£XMõ²M"@|‘ù1´dM•‹l¼3ˆD?(à +RêG'ŠÃk´ø…ÁËòI "oQ3ø»L.^IŐ o·Œ‹4pžýïÐ.â!oSháqÞÖq}í²£pvY'ahc$–1ã^—¡Vã Ä(ÐÒé#ÿ‚Œ`.‹ÀCËË%ÚcÈÎeÝêϔ.÷V£•aÄ)y){Ë~¯¦>”'´Æ¡"œ$¥lÔ!¨An.´ÆéW +?k17.»eáH÷ÝZ(—uò„ÆzÈ-%îpY։Å?pÈ%¶Ì± 5G˪ëÕ6Ž3% \vυ®D¾"ý·Œ»¥7}ËÄT¤]+# +¿·¬ôPüœ2NŠ \Þ2±,´Eã²U~ŒÐöé:ÔTø³eÂd¿^ù™iÙ2Áy:ãqóÓ´§ÌlJ¾ã ÇüÞt5¡ìéÏOºð—³–ÙÿY‹E5Ò=±Ë|¾«{,h8çñ¬ZvՍ§'j§ÔÔ²Ö»Hýp8©D¾³M§ßãüž—™zZ–²R`ù 9oV„M§i\à¦ÓÓ,Kä¢éL[°ˆñ\Z–ä¦ÓۖIåú ¨N–uóŽ—#z>Deoüƒ»U,ûÿÌ&rJ.­#Ô®Y¶ôØ%Œmg–¡¾Õ˜eAÃòeÙÞI-˦#l.Й<Þ¥F;ÇÈvéà·à—^}‹Ôdm Óc +ñ'¼XF®7f †}­¬DŸwb™PÛQÜdQÔª5ã•ßúi—Sdq,1€DÀp°¬TFC}¢2 àaex¨ènÙÍ!-/àŠLԃžA™*¢vòÅü’©7,«@©f¸»»®Œ:à +7qî™Œë¬++3è)‚çÊDüh ‹ +JX}\ÿìN¤ Žðˆ™é˜ŒGóm @÷É \†Oµ‡1 )+ˉ»÷92mŸ¬ìÆléO¢Lv‹À‹³~¬¬(Ë*ϐFÌGüÂ@ÏKï.ÚUÃÊ@^Çèx-9»`e+Eè5¯½Ü^«e;ò­WŸ¤G4úU#&¿GY‰T$æ@Qex;AÏhÎ\t’nµK7UÙèG5ԏ$…Ž—v‚w¥¸\:WLÍv©2¹ ·A´¤‰XIfk‚¬•å—Ž§jšCÕ*)¡Õ%SY¥O~ü³Â‰8~àT)Ë%"É`ëâá*•¹%ݗì2K²Xàm%}Îf]yZ3å.TVï9c¦B2¨¬ÕpY—òNt\ÖÊìÔKsVaOÙÖ'0¤×øž¬,‚˜}Â2§Ì䙛„XzSÆsÉý‡Ò•eÆ]S–?(Ü¡w7/M™çvÅOêXú§ûžY*¯Cóa…¿RƋIhr ¬*e³üÇÄT]»‘ÁKrÐB7÷Ô´Y¯*ÍyØcuzR֚¤2MQ*œeܘ ¡žœH«²Z˜!Ä¥ÞGL”(£Yë—3(»i¬RVzؙRVü[âKQ–ù·£¬T¥k"ª„ÄÎWÓÿÊÚDúùaŠï‚'®K²ÊvÛ¿ÇÿÞeý“A;¦vS|—¯P:”ÁÖæU¨g5q9CGFºP–þ4‡Œól2¿i&”ÉpªŽ†åA%Ö¢ÐEoÕDÂäé#@™’;ɼ ð?YOQüpçtiÜÅxZf±Å×P‰6ž iU$;Ÿ,™¢€-¤slU„t1îÎrç'cS-8ѸO¶J*øœŒâ’Õïß~“/öYâ|²ãÐñ¦L¼Î¯Dt¨Ä'£¦²ïeo–\_"»EéÑÌêÎ Åæ<=;B¦=Y¯C x‚§ š“yˆÌü{V‰Z»éɼü>í¶±¸¯Vãy2…ÏKªXÃu¬%x®£…æ‰MZ£ÒN'óTü8¨ˆ,J(¢“y÷oð¼+žÎ¡¤ +z5YŒÔluzþ6“MŸ‘i²Å¹Ê±šŒÜð7Χ½Ò'ë¬û(¸[µqó­Äq Ù◄R‰ Ð ©'cuÌo²Ý2á]#<ú0¢hÇ}Ÿß7¨_'Ì&Zî×dèk½™6»œ^í É´©ŒjLٚ¬ëÚð€«Â Ä©Ðûlñ_ƀ;5Y3á$\HuèT¸¨t"–!áÍpÌõg2½¶ÀDë˜Æ Ù§Xڕ˙ɸÊ4B]¦X¢ßb¼KögŒâ«ø¡¤>úG‹&“]˜úa·3ƒÉrí»Á°’ÓyL–žx p¨ó·PU'ßÆdk9íúÔÞαb¤³Ov§O6u“Èñà‡àÄÊ“2×ÓF–}ÉÇ>—‚ð†ÌK#•š2Ó^2H°Z Bϔè¼d]'^µÝÖ~öQ¯.Ù²[&{Œ]“³>w‘õ‰¥’ÅÂúTîµÐ +㒠¾ú0«Šxh}õðûWUՖÌu«U^Ê òK8º‹Ä¡ã½ïҜ]K&óêãü\ºmZ2©µàBwü»IpbüY70ʒm_·Áù¦úèFpP±ÜTy8C¦s/JÆ\õq3¯°«d K¶öZ ÓÔ'û³&•éžíJV­†4 ”×dbÑ_—g +ÍY‹Ã’,WñBlR²+úêH’}èW¼…Ø8ìøƒ€zàg¤1ÐI?²¿éˆ ¸! 젓|ì©»éVÈJ2Ԝ©¸6QC @xMIÆæÑÑÞÏ&œG®eÞùÔSÏò“(ۖ$ :ú +Ð*wb$™}îZ©…`äB‰L±ø?Rˆr}ŽèZ÷ºÿ¡Oú‡’d>b±òi"™%·WUǺ4•b²òˆ·¬-G1–Æ|"ræbð6f ³Žnd‹';ðO»BÞ[ú>²«¬¶ØDù”¬o—UÞ"k¾¼™'_4J¼Dß#ëڜqÂ27gÈ$F‹móR^É7EµÇm:‡1Ò§ŽPZGÖªÃj>Çż_><`ہÄ(ógÐ"@o«`Ybò‡"“AØOd=u¼™ä!0y¸‰¬‹dl&2Ñþh¡,dòë%2¸Š‘¬D Òێ2åÕbÿò’"‘}Ùß|ë8Öà +ǧNX€‚€5šsýYè́,LxÂ#Í0²Bf9ñNûm$Q‡ì†ãš +b‹¢NC¯çKÃ/EVV/&R½nlÍ»qÈF}ˆ•cBáÞ¨»Ð:9èìÛûBc>w]ÈlõhvðŽ¥îß²ÕŸ…ìÝó'd¬µ¸ èqKÈ" 4iîØHBövXíYœͪ!+M)¢EÈĉÎ6„Lh¡QmÅzŽ‹Ì«!¡PSoBÔÉ%“2ÄdÙ½6 +þœ¶ >~÷lYÊ«ì£d!o/äÇ ­‹õ4%D®d9Œ ëüyLo —d'$½*Æãù”é@&ìó²ÕÄW?x Ä­»Ø%û5Õd,9@¶­7ï1ø˜ºB²×)a€Hþ‰õ϶œ9šxm^–`>–KžF3PL÷]×\`(®€ÿRùFÔ´OÞéOî\]uüâ³^?€ìzà„§õ Åh–~lÜòg³öþr~,N ;Œ9fƒÈ,w¦tÇþ]eŸôàÂSEŸ –Þ}¬Pæ?¶Ôö±åàÖ6ôÀ¶B”‚7ûXçÜQ¯ ‡#éi¼„LtM4}l‘/¦ÈuÜP3f܋6Ê¦äcnx ,‚Ô:>F…;Ν©Ñ@ñ1©"#ۗj"½Öæ`£ÇFìÂXG[𱦭ñgӍ«N¿ÇÒâ°\Ø{L½Pdr÷à»Çr‡žŒ -nüŸørc£Íc‚\—–ã@u·Ç¸Myæ’óÇ^,Æ,öX¼å<~=Æ_²j=GþÖcm~?5ý%Ææì/K9õXV¯umŒëé±`¼õ¥Oõ–Žñ±cíŒnô˜Êm:9X@JH¢ñŠCYÜ-l4;Ô_@äÇcšŽ5ë1õÐÃ*§¶@î6ѱ7 ÌãvVá±¼D KàtK© ±³Ñµ 0$Û±ìï‡:ë/%¤W{Ç8WM¡äø…[:VaÏÚ±rõÁ&°µÊºÐ숡pè–ÎbÓaÇ“ñëT¤ë˜ ̃s¬{n‘…Š›câ3\;à=víÒ±²‘Œ0·\y9k«â`X'Ëí¬û<Ø8áš2KyQѱ’¯½Ú²§Tn5tŒ;µÌ®AÇìðϱx¸c-t§\ƒT bÃm¦-ÇB_õʱ¥W›rìéÇ|ö/öýïuã:F6Ža`V™¼°ÉÍõB„b±1'®8æɹÒ">bP€"âØîøpì¯Ê[fæ’Ù\8–/9Ÿ Çj4)–˵ø°>“\Zm ÀSîÞØÀ +££ Èb>æ5£îúBš<o,¤>rͤ„;PUE®;ʇl7Æ.O׍‰PۊSpèMê±±|1,Ò.gÒ2Ø k®g‘þ)J…“J û¼I=6ºjc¾IÐd\zcï"z:Çç ì M’žÁ¾Ê?2;s~ÙXyݺ1kBa¥®»‡×¾b‹Ë7’ášümÛUa‚ù^{çìqj[ˆøÔƲFwtË.NÃÞVcýVàÆ®tÕXÞà ñ–e÷5¶rXŸÆöÆg²R«Ž®ÿ)6¶›ÆŒI¦±|{îx Hï*‰îI'Í5iì Ï[d+Ë<Ÿ‡u!Ú`cí„89Mòq¬h°1”‡½"îã¨,·ô4ÕÊM{,cñl×ÓgLĞõÙbœZg,ªÜ3?3!Œé¢•ð«ØšmÆÂæy“£!@`â+T sdŒ×í èÌX>¦«ÌX=B¡öyP¦Z1§’Šû"gq7™2–ud?Šo¿Ê(c°2±Ãw;ìÈXˆì"-> „hpwп6Ý8Xà}Û§¢Ý1œƒŒÅ‹– »5‰Ù±Æ ¤Æ ±=Î#6 ¡Ô‹vŒIC#쩅±WzdrC0ˆ=Þë&@…csZ¯Iøx,I…ü|êÕA†c 5fØBV«ÿýƊk’_ìýÁ@$à}±6jD$’eÙúbA%$²%ÈQãn¦~E&”Ä°¶t: ä¬KÁ?3÷¶ðxòƒ‰ /–.Ý4]w!n(dƒEäùÉÉ lÒ1f|Ô± œ©Œa$'œ—]Œƒ«Ãûá$•ëbP‘êbbà O+¼ZµcïÙ uÔÅÙ.æ5îHQ¸àØK +.&ŠãB¡ä(pG&m@fÙôˆn‹¡ÁøZ#¹&Mï(¿j‹µ>H_sS·n©^Â.ß–±Å’J½ë’s{StQ²®ðŽR[#Ou«Å^fGÃ>‘F΃v2?_L+fúÝPÁ¾:U¼)?-v‚I¡qx‡&in•C¥Gb¶aün’cbEåMƒ. Š€YlóÈAÔ<wªWsPŤ?:2õ×â•ÄJ51Ïé9吧ÌEܝçýÀbZ •*OxÿŠ©²ÿ ­’@jeÅzk}ÅôyíûG^ñôüÊÔd§â驔1zZ1^ÏïfVÃöêY1";gKCëGÅï``Jr¹bjIô»—Æé°«£ 2ŞAšò +‹g^ÅG5Ò¾ö¦mµSÅv÷d0ß „ÅÐÏÐTìá^*F½Ñ¤bHÀ0Ý©f õ仌¨&ñÀû)…ð60#_óÚ +ë OuSÆÂÏk›·‡d¥^˜Jh%Oì<1¬•$+±c@Š-¯è¯ƒFe•|?t(ß½†bÕ ±•˜ âu;£Ã¶ÁàÒRá`P­¡BÚø¦AÇ"l|’‹nÆUv‰pc‰%V Ì^Mø(¶8‘Þ°ïHuꖎbWÚÄ܈íO„I¬n€«UÖxI|bÚ * ýð¢Šv.ÛP¬tŒ)ᦠ,£Ç +RT!~Nª$äE +‚ùÈáÄ^ñV((Ýgˆ‘ªÿÇw’"«š u1M÷ÄÎQƒ3MÈô?O¬75Ý#>FÖ3íxbR +¯tz°¦P0óFíð©sވˆÚáXA¶âËÑobó~!É:µ“Âëh¢å|bÛĊ¹Œâù Š*/b‘PpuõV6±îíÿ:±8´’°o© —ŽÏÄú‚‹ +@±DØL¬«è<Š;­ 0ËÄÖfŸ +Š“uQ³§Ä-³õ‘ã>q{Ûpõ·óÓ¡¸]bë>ÙAôçö‹˜K,Îs牭[bâGáDSÅoô4RKLÐ5á¿PðVÅ ö„ni3ê îðm^Ò;ImOglKÌqwHÇLL!Fø„Ĥ3(HLš”{ 5a +uÛÐ)YÅ!:!õS ?¸Nà³MmC` ÊÞ#Ã"1­—–Wk +•ï¹—HLÍJ å³ÿ +ֈ˜HEíæ£w¥=‰½üo¾ê<ÜÞÙ?b^¢Y¼‘iüQzþçÌËmX”D¤BœtÉf~–íÄÇ« í=N㝠»Ë”u7ZqR?#¶íŒ€‚Ѕˆ ÎJ’bÿ9/ÔÕ²£íDŒ1¤u$µXyjD ½ b´t»À8÷hiÎä…6vB“#ÂYíeÁÆãpÍúø ~ù°³X·ka&©¹ö÷)Ě³<*;!¦Q˜¿`„0mCQQõ¢¥ M!Žã!„ó,$a‚˜ù¼û½£P¯ÚbÃÌy¢‡âÁáfšf x Ä®µNöÐQ%œcÙv¤<ìy.“»&>9 殈ÜÌçwƒÃãùŸ®!„}®Ã'¼@…†.˜m­ #ÙLøÁCc¶ÇcUœ8 +YZ»ýøÖãiP0]f¸¢ÆÎ)µ}Ö7}a66Üh Éñ” õš™.XgãEvOA:,ÐÕkö–á#p]ÆÓL)ä KP˜yòÜi±v‡™ãïnKŸ†ÏÃü‹F ñyE„ôbó°ŽšAL³ß}ý .d]r¸<ì¥Ä] á–Ò€ u +Ž‡ÁJnÞ¬át±ññ°„¯5CN³ê4‡Ò;L(¶^,³ŠÖŠû‹F=wØ%1·Ãp«Ê­[¶5f‡•«­z{ÃäòÀ–`Š‘3±Ã0â4÷3Çފ“F¼Øk•±|·Öa;Z[Bߋ¼:츤|݄ öJ¥s@àAŽý-ÎôìQJw„‰%¿¿äí ðk3o“Øç©a oÔVXü§Éaԅ#‡¡§6œêÃIEã0Z°tq1Z`5õVôpß»»|žaá°k.*Ÿ]¬c©s“4¨.<Eßæùs2§d‚Øi=òt:hSí–(æ1oX[÷ìƝe3„«&ˆÝô͟͹a~íaÅÞ¹]çlµˆ¡ì‘2t¨TšÈ!>*{áZPõï?3Øñ…_~F’TxIƒsŸ¸>Z{k˜±N°8ŽEÍeà ªS҃I¤¡,{KúÙÛ^èWþ3uš•â=®;¸ç¿ÇMÂ.)Ö@T «ù«OöØîgԚó6ggѸoՒ"NÃdee©àW³1³¤”,F#³o4DñK´\¢¸`Ý$ï{.¹xBâEõ¦hL•t#¥™JàPwo±î4“]³o^BõR¯ÁÀ³Æ4{a̗WÅöÑÕr |ýÐ }’»/wñGÍl}"ý<>º‡íׅõçˆÕ(~HtA)Â_¾“µà÷ðˆìM4ŒÈÚ!µi +RǶmAºó$Æé»»§ì.…þÔ +üã³ÉAácK·Í«ÖÀC‘}¾°) +Î"=âÏ7I!@ +ËHðüŠb¡žš8¢Ž^ۗl 8Ú2 0T°¦äôá|<Ž†j~ ©Žx܃`°2Í$Î?ø T‹=_é¢i£©ò~5½K0ÞÂ~Å]קUÖ( Wž>öã;øúôQ0§ m6,hj_“”ð$ƒ…º¹ï÷ñPšÓ‹Ÿ~z×—}/ò™¥ ؼ7Ûµ1PÉ×um/¼š{$"Ô}¢¥Ä¨ûCTÀJú¯ë=9ß](õ½èº3Ýa+î©f‰é`o} ¥/Óã¡Bò½ªªf­Ãø÷{k–R +S·ò…/ÕpSCôtO{ž6L3¡ëoJn˜¯î¹†"6"küàNC¸Í¥I ïà;– ê­c뫶#ÔP}© +ñªí¡•B³Æ^ÛX6#õ+v3|e%óÁ™Å(0äQâBOñ~ˆ ‰¿˜‚­^ªp2àø¾°¬!$ñ]"n Å8[Z(Ó]ÏvX7Yƒa=Æ)¹<øK’¨­…JÌH.Òú·Âoš !öÜ¥ïÉ|òÖ +Ÿp.=)NEDˆ‡fG¶ Š"V¸ü“-”kUŸ²ÿÖbB,9BƒD®Ù…Í^»1ò=nC`5¡·/¾†¼.×Ùø +) õƒ–ªŒCåŠ\i”ƒ³îS7ÆSÝd‚uÂösM¢ ø¡ÿ6ÎPÜűüA¿]Ì Haй­\]OëðkgL¥>좕½D §"ôgéJˆN_(øZ®?ú°Bðõ…OlÅ ¡—ÑæÇâ-‹paò?Š+wq°K¯(¦¾ +Ù{ýc0׶R"a¸¶Y¦_W¶ ”“á@BZÙÍ=ˆÞ|:9é¬0|Ÿfá‚¡ÎǑ‰Êßܵ¤øÀ¬d¶,n2tAr¼€<ݜ˜p°E,` +Þ3â7ÁÄËuL/oa)£Of÷D—°énâyCJT„ëФ˜~AFIȲ*}~¼È¦Ì=¸Ðp.zÚè»yҮוԓ&£q!ÞûDc¢zq÷È1šv ¨{:w[RqìC áL ‰§ÖQ¸!DÁç«ôbã^KÅX|j㻸EçIÕ, +rñÂ×ǞA© ¹ŒYó|»„z1]'4èGw¹gð^mÎ 4örèƒø¨¥¿C§ó5aé•n‡Zÿ|.Wi¼æ@á) &h¤á¶ .BýpAȉg冢»4:o<ÝäÎ.Ú¼¼ jç;Ö¬ýúüFJ®‡€Ã`‹{²°xÔ~ë2F.;ý}—â%4Š¥lÄá?²jAú¿|÷?`O"qŽ%sA@ØMúZ¸*ÿÇ LB%¸Žò/?°a7w3¹Olqn‡´~ÓâýWžènlÄÿ¯œ‰,(;ïgL|9¢¥hFvàj¸`Âc™Jɶ–—z°œe\$dtMÇòY„¡]lÿRdˆQµ!%ÜԎütà–&ø|›vMʙ| ³±˜#ƒ÷¥D½jSÌ +€÷,ààKU2Dc±Û°§¦¦g–ˆ¤„M #-)AX,!°ÅþJ6ÌK鴄 Pb‘ ĒãԒ9iž“½AX-ž§1ƒÈ9†àÔ2—\.s ;—0ˆˆ.! K ù®K.u©KXÛ;Ê^gÿ°‡ Ó.v Á]ʗq "ù â+a ×¹ î1ɔ’ìä +fè‚#Í©£»Ú* +FތfҜ-?¨39Uö õ°éØÔØÐÎhåM-Gî®0t“»k£L{7wï»Ùž04›Ïrû}û +õmMmkdõ‡]¶NÔÆöF˜étÖæbt±A— àÒÎÒêègwIaw9_y¾;­ÞñÌжãw˜¶6¶áM\NÍ6 "Íf¼l…ÀNϸ˜¶ãj‡—ǤKÍ!¤RšK L€¡Ù™a^@+d·ÞWEªÆWԖ%,K†€Î.Ë¢YÂJ³·g™L+ƒKù– Ÿkíè¸˶ +¦Ú*'é̲reytGƒ²ƒ²8–-'eëÒ½÷ڋå—æ±nò'ë”/¬±EQäÛ¸:º*õ諌4Ô4¿ZcùI÷Xi+«JsjF‚É ®)«™23#fFFÜXfflöÒtÆÜÒΑ…h}¯„‘V¶e Bªj ÇEV&§&a”Ùìæn’{v;ûÐDànœJ~™3±iÄIhÃÓøSPfRzlhÍè6,p®>/9ìUA”é¸Û]Úía’Þǝ&kOüó_ç¥N=ñǼx~à s_ˆâ‰×»âK£˜hiH¤9D¦#ý¦¿;v—ojAòšÄ $éì|I‘‰ˆL&Z"¥¹m\üAŽ]¡ššæÐÜšÕ ª&¸ÉïêÍÚY^ËÊ¢%"a)ªÍ"²›zµ¶v- 쾦noÎ?qw¡t¨üÕ’Cð±ˆ<ŠEã!iVå€I P*6HBTNDÌÄ G1b”B +!dFwú•{´>pn¹£>àúÀ’Ù",ß rx² °ôb²þ +óÍ©ÈPÕ»NÔ½4Žn–0aÊaîǧ¥ÏS|ïú/ñ•Þ©‹ +׉]Ÿ(ëëF°a@@CÃoÛ¾Ò`eæ,%v£ë¶Í\oQ“«Ó$4e‹š¸Ãã~žâ¾ž)M­¬vh|FbÁx0>û¼{>ò\õ+’ž÷E„¾`ÊÈKÀ !Ø'%éb³}v\˜þb=…Na‰ Ø¨Æ/Ap’A…\SSX¨œ-{¯>ºíÇÐgYîP TàÈØôŸm  ¨-bcÔD¸pm†åӒß Jôw[Ž±°Ó0^<5¨IE÷ãނ\ +ëínôêrdË87çÈðnHó&0A4$|ð?Ø jŸat€¡ºÀÝ]ä¨ë.”ðT½PÇyÄU'ǪÂ@Ç~ÿšZn‘ æ'Ýgø$à(Àù¯Uœ<;N Cj ŽâP ,!xuNk›wú?è1>ŸÀI-ÑAO]_ҔÈn3z3I„ìAâ²¥¡…)Ôd1^´G¾l;ôúUƒ¤a¸ñšÁK̀bVƒ78ɪUŒéæݶs|"‡ÖÁ†uâd­>US<þ|v +×1¡µ Á3HOB¯àÃ<ûcé:ÌÊMz埧Mšî2”bI €SEp¨oV¸Lѳµ)u¼F›KÏŒÐÃüèܳórò¤‹»Ýž_«XêN¶973!Þ8 ”yÆîzÜD̓¸(CªÏqa3ý ›rÝaubµö"Ëð ÜÍUO1¯¥®Zˆ–H·¿ kÙõ³ +PåUœfÄv†ÿ /b䆲„y´Fé0c@L "┰cÈ虈GJ1>?ƒsŽZKÇ¥îšA¯ ßú@ýF‡¥fœ¿ê¦Z¹®‡¤jÒ`n»tÐnÖ!KkyÁ$DäÚÙÛ)A¬åÝWÅG®ÊUé+ +HÚՍôŒËCó×G¢ +(ÛµE7B Ÿý¹³&#tql…/GU©Ÿ@Dû~øÕ"G˜+?¢PCƅª‘çVTOÆÂd'o¬ú)Ô³Ã˃îH,ãÕ¯l9±£û-Å|_F’•‡˜X+ÊRé»Õ•„1Pœž3„ù®r¾FTxͼ«44L˜&T0-,8ø{ÈJhxÀa_¯¾U!%ús¤ïYªy +Ó;²›±Ê)rÐÌöñE2ªqLR‹èÀ< ºØ•…+¦û%5<ï«^áb©eËpÌp>Œ¾Àÿ-@;Æþ»9‹ÒaüF -ê?¶ë›¯wŠvÃ§&éæ;îÊ?ÜWMç¯mhŒÐ1l6Ü`¢²àXË»¢øßÿá{u~ùÝ 0‚T«ámûmØ\å„sŠ/ÖD|‡ Ì_îÖؓ2՞¢C—5 +Û(ÙÝ@»´ÐmUŸÃÛßw9²*ãNŽô—½èMß韜“<&H%ú³~Ð€UHޘdúj•ëªòèÄK/±4W8f̘.ªèUÆB´šâӁ$‹Uê=™b ¼>„W„*JrEô¤G]zèPž‹¹71?ÞYQF»ˆ&lCmPGãßìM +infаj+»ÊÝ¥(‹ H†Q2ºÃ¹­Õ| +ïh\ ië3 ø õ‚”Åe«õ}¸¤R•œ“¡¥- OòÎi±–ĵâ:‹{!‹ãÆ\JVs¶b~ŒÎ©ï{¤¼'¦^Ì̟tóiß4µ·ß6ÿdZji@l\½§$ˆ!»­D¥35j"’D8œûDÈ ÷)Œ:l(΃3sÎâ W*¸Hv½µ{T4n½iJê! û¶íñáÓó])Nⓐl¢Û¥]b–EN’!Ô ºÇÀÖýŠ‰;á‚2èHˆÒ +ցËáûFZ¶Ð¦D± §lâ¡UG `°ys`È|QOŠÁå¹LHV¡Ì–Å6ªõ_.»ääNԌèð{qí³kt,@3ßYA0„7H>Wïk¢PÑr­ÙÀ-¡â<¸_ž…Ô•;Y°ÝZç¼ÆßÞ>ó‹Mýҝ ¡n7vü§Ž@:HìùÈ*†9†Óᴊ‰U- 6™qÅUpû£_}¢ :ËÈ?@`ÂϚ.p(õ˜ Ìo(‰¶¿@°£]¬é²(dè»Ò0_D+ã„K†õÇy‚. ¤€JÊPA9Í;Enñ›‰® E1j¼õbÎü +^fþ¸4Ã7#h%\ +rÌæ»J½ÌpÝv.<ÀF-®Rî±7äì‚óê'òùEÍنßå˜Þ?íÌwfVG´#*€AbÚéŠ +ô2m<òª‚ü'F‰_Ñ ¥!2È1Í`¢óò¬2žã–ÄãÛÔ¤ZI;(û¾s öêêù»ÏõŽÛ†O˜&HÇΠÃÿ “ŽØ`"І0Áª[i*DcTÌ6”ËoG¶C^¸ö§f^Yé$áXÌõå®ÀSÖöâɝh(ð¥lS‚{áUùölØ\Êú°) áÃz…íã„ f÷ á…/ ×è¡В:!‘Ù„¨W­Ð˜Ï#Ü~ÿ@ pNAŠîCзgÛ=7Þ)LYCÔaAn‘ –Ô!LŽ<³KÅ¿´©PzÒÆe¾í)~×ÂP5\zÒÝá4­¤ÍÔ:КQTéKˀåÎãã挶üÆGšõM»Ì:E։ô…åÚ¹"žTJyzq€r 1ľÄ<܌•³E@(þû•f T ìf~6ã•ÉxNˆºªˆAäA¼º?5O! áª@ugó I¬c‡p…0uHd¢ñ¼a)»Šëúõ© °»Æ(ìH¢‚ÓŽ۞ÚT4V êÑ^̬ƤPÇQ ðît=ºl6Ug¶X×´Õ+ß9+[I¤Ìò  |4º¸ì½Ü琳 iÐ/nÅfþ¾4‚íl^~Z¯}Í\%h†¬!gVv¥@g{?(c +‡‰ñöqH6Ί¿¿Ö¢0›f]2B/Ú2š%ž¤Á¡5%ræ_[Ð+oä%›¬<ÍÁ)_ÖóȺ®!é\M5J Æ»ö .¬é‹_Ós‰…¢py1Ã-\% Q0f$;‡¡šå“çȎð ÜÎô #ðCÈÍ *ÛñfÆUè'ڗãïªÎ'qpÅ!yŸxh„~«—³?|è8¼é„G&į?J") H9òRÏ؄kKF 8TRI­†p¡!½VÛ×¹4½{¬Ë?$±];Ÿ:ÿeô&!të¦LÞ±¼K ;§îˆçǃ8FÄ#0!€g¸¨Ìt¾„æçò¥NÀ?ƒ>o YÛg½EìCW>â¾50U?²¸q? ?²s5 ;·Ø÷ D[lÒ~Sˆ$—x¾7¢]Fž ÆGVüÁ½În”´Úz9>"÷ðÿì9ÁWÜs‚¤2­»á¢Ýà¯ØX vbàˆ›Ï¤Ý$0âÁŒ_ó‘¼qЩ˜æq³‘< ¹ª8ÐGijø# þµ«˜£…~¤?¯Ê7÷‚²¡De嗞ńEÎ=ԓÕ2\b«ø)Õ°4¥v5Î"pIo­ÞV”Õ< £UÈô*:wÕ44ŒR¡ü ýNn¼jDÖ׋5㝋&MÈA_±3ÀßÿeE¸ÙɃPDp½O˜@Žå²íâtÎ æ⏗ “@”»9æ(‹CÔÈ Éíò~’‹0`3ÿÀHv‡Š¦µíä þ·=ECº +×{ ™v‘Rºj4uZÐî/ª;iÙQpD@®o½øû¾Åx»Cùa°4Cë±$Ó +ç=Z§ð ÝÝ¥Õ¶ùäÇžŠ%jÙ¡„1˜Ó’f6^ªûœ%”ï’ &Ž›{8¢õ6æâÃ{zâùYý£ä-Rk35T’á×ñ»ëYî—È’á+ÔðJ±”`ôܸªÞG]OöBâÂ;ßñk ![¢²lò¿EóÿnJÁ º”@h²ˆ/r&ÏYGm9êtLwd'ôä®0—´ìÔr¤¦©Ä¢¡ÇñoxÈ6uïwÇƒ@Æôb_Úà8®ðh"˜í ‘¥j ý€¢ö`,6iÕ­#‚V Ó«ÂH %épL·&v›òwÂ":» í °;ò$ΠË(6ÕrmDÑ՟ä–lO)[’ú&smŸ"¹l +1® V̲Ö÷És%Ð8™2œÍ§‹ßÍZû­…»T͟v잢ÑÆåk‘pA»,ÀO ъ”[aœŠà0Ž¢ÃÕ,`Õî¤Æ:ÿÔËq}B»`êf2ÞCín!H ¯‰0þÄR"l>ÜcÜ)—Œõ‰ÙCávÅpB3sÏëøØ@Íî7ã?4¼fê,Š­1º)¹1Š‹ÅG5רoÁ‰`V³C}ՍÈ7´â”—ç +jç'À=Êó £P~luôOå(ߕº ÎNÉI]Üÿ$~°·Ÿ^S¦¥:S±¾]ú±ÙÑ1°ØáɧiQW¡>å;Ó<$ftµnøç´‚‹±!Q0¢Ðúf\lŸŒùîžíw;eX"XW}²v‰ë"=U¿"œU¶Îߒƒè%¼¤·ÊÏÄýÃYeلˆTÒh §ü€$I5€Èàz€(3bÉ`¹~DE53Ÿ|iTûª¯ýÂ‘;AØ6ª­%Y::É¡¡›Kø© ,ۄÓNcbz¼ Š¢É¢ù%Ò½›%Mƒê#ýDãe,›DC~P¶nŠhßãS†{ÐðÜ9܎e€]…z±em_QX@Ød+G{†ž v !èõ¢Íì>,#HIð_¼ +‚%AÄwBù¾‚š4ƲèΑ“𚟯_àß”äS›8ãEçü“D +¬C"êDËΨ«*q¸‡\4¾òçR„Žš¨1ÃV×Yn¾Fö+”›ïDË+\Ð!ðHԌKHô¼˜¶d_  MNnPN›AÕ5y¤ü®³ Ԟú¼>墤$¦ŸLrë&îåÑÿ8't×ÙE¿Þ>3ÛÌzjV•‹^fٍ™Ž‚אַµ6éÏþ!›{.·»ÖÂBĆàäh·§Û0©KêøçÌî¦97w š~ªé­jó"ˆ‚EzîF µ½·}¯HCµn'ñõ¡H£ée°ú=vóq 7Êà7?_BY” +ôî_¢€P"b åO½ ôf^xTÎ3°-z²r'—ó:4=É匱É=‚ £î•e+÷z/ƒLògŒ[p`¥xù¹¼?™~Ì®%sÃ"äë½#Žh‹Ó­)¡òEªßÊã¿05Â#$˜+M={ ÷}é”? ±nu€äúŸQ"pmm—¢£ÆS¿ŒQk“L{Snb¦&_íG” +MÖªnª-F1(þÓD´UíKç‘ÁhdaÊêÿÃÎêh´±ŽÒ:ñâ*öðÞ,f&=¯éAb@’@êß<„åsÖ_ûˆÜŽrˆ"‹‡&xõð1‰!8ÐЈP!à#+2·Õ€tÁý'µ „O!6KÞ펶„vIû%a±íjÓyš¦¶À¤h¹F겺VN¢:x–gü g‹ëy‚’¿÷ò9ÒRúNMê( QƒˆJ“1¿{Zo+è‹3 1Í¿¬Ôþ‹#ºk,hæÕ¡°±¸½¯Û™ Òkêc&BAï®0«oŠIðZ2t×oHúÝJö@Vâ±Íà4q‰$ò• ¶•RuJöä.oÆ6|’, +} ÕUÏ`eGÉ †>`@.œÊºÝŽù!RX_>°`X1hï­cS Àþ'—Ô¸]Š›iKB=!±'©/ÙÚå ;“æIƬ"æïöŽÿr«Ç¤èáãã5s*) ñ–âÕÓççû÷š ®l,+éS>Éï)У¦êk3ڋ ! ËL° ½5 +Žíßt X-+`Ž£ÿš±xÜ M'ѬÑ@%*éŽÈ8Éñ•Xº…¶­sÅJ9éûBa‡%ö"x#_†u²%B÷ùlìk£ø©T’(º68ò µóó­ÖI¼ã‡Œ.Ãx*Ò‡èĉñ>¦–#Á&÷7* ìbѽK'x/ Û3OÔ#>Éùf.|ÔÔYÊ¼ÙÌk“qØY= WºàãôÈÕÊ|€@šy ‡‰-—iÑHÑ Ñ)Æ2ܝìsp$©L·&Ú»ò\’®Þ¼Õ žMӑõ×àxv¾Mâß#¥€“ð€ì˜ ù‹rD¼gȇrŒý4Ò +ovÏðãgWՍ MºP®ÚW§<¦ûõÁºýÓtm㸸Æe HAP3èr´r ‡ºܼ0Og$2Q—Øc/fT½ºßlôPQš6AxÂԍ*§¿Ðk™^ŠãHýJÏóþäRn~¨Ç͇Owö³ç:.UƒAg¾^sL„²®ÂѬ)ÑÞI¢Õ‡Ìð¸a¸œ%ܱᕥ¥ÅɦµçõÂb•ÏÔªt¢´rzßE '•¬FÐrp (Ï_Öìµ2cWI-?ü±³È +> |ÜHï#s¤ <¸ÆË:ó‹ôs\^^ö/þ´yÉÑ)§ ªã¬ç—‚2kóSn‰xçÁ a),õÑKt»§†ɔOï +ɟò;”åù%ö„Š•$ú•òÝU¸àHx ÿÓ×*<–ÿù!¨Ó'tœöþh¼ñ/¾Aè0½Áû,¯Îs|Ó~KÖq‘TI]lÆ +Ø4Émi!T‡ *Ûdk»uØéF:SkÇ ø™¨0E@~¦÷ÐǪÅî!M ;§'¼QåÈïƤ=éfñú ‚‡ ísÃæ×Ú)¿ +° y6 ‚þZ$oV8vFµƒt££–‰ø2@i¨§–¦:P…O"³UY…~)r¡ÿ7G g3]¯aÁ« i& Ç`‚M’xâº\›´}€zB[y³”ÕU˜÷”É}"JAM+ÏBr e¬dMähÑÄë +â—Dæ@ò“¸á 50h—ÈaÅü©ë ëÈfcÎ ËôZõSd·åJ/·1hÃÁ +/Ýÿ„œRIôpr·’ŸY{ºñâ\ÁˌÂI¬Ö€aÒ]<÷tG¥6(?ì*½)2m3AFQKÄò†sk­yçr=$MŽæŒhˆ^…ÉëĬàô‚JÕ9†t0'#*렟óª&‰ä±àGxݶjõº$6ւÎ:lÍlØ´=嫦ú±Â˹:¼22Še# YBÌ#9Y¶ÚbÖ H2à£Õ¤¹ÆA ø\Žn¤žŽ|…2†‰ ±3ç £ v@ž`$©E†ýá¿ œ‰úãÚ4°/Y‰£ n„¼ÄÕxÞÏÑòÌ«;q`<÷ÆndÊ&DRŽ3sÃ^ñhkxjR«‹¼oÈÇå,Ê3ýDÅï…Z­2άïÉRd'Üøæ`°çӖNR -·š2KÁtË¡@`¶%b„JÛ(RÒE«`ooäê˜}çØC@„ß-”£‰S®B½6åT:/d|ž!.¨HJ‡Ž/˜sµ@v‰6óSº‰¯ÃwÏ=ÿ#“B~+š{¦ eÆ%‹8ds29ÁQ§0H\^"}ã"bf è†z“„í‘5q èT,ˆÛa Q š¨%lI^·"yö]æ³à>±]r1wôY$ +ÇCGœµL  ÍiÁ¡IæY÷&'©©”Ò …L˜»…Yd«.y×ؙÒ2dŽÂÙ©ðàÄÕª% å@7*†¡VI°0áÒVe4a6휞=ÐüØæ0ÐAxÔº/&ÑpÈBñµ]ƒòî*ûëæà/f=Y‚Ì‘z×ú*ÿô endstream endobj 113 0 obj <>stream +€õOæœyñÂ(òäß B®ÙÑ¡j 0¡۶ʂ¦wÕøÃ;ݒ`5D À¼V"‚Â,#m+¿f  þóøùkëpƋ_r@ð@GWrNÁ¦V"GUQË®@÷ãÇ ³Û »]¤‡±‚T£iV] ékßç¶Â¸=e¥8 º ì*­VÛ6õ²©ž>$ãÒ²x ÓrYý8¿þ”ar¾@œétËQKž‰!…îyŽBKrFdíô*£ãþR]w¼ò +ˆqaçu'…ƒØîôðC# +Û½•±Kû‰üÐMµÜ^Ÿ»:o*·ñB¢k†í¯þ¤nW¦ºy›ŽvO´1Ì7A2q©A †¨^»ÅU•Á¨ò$04¸Ù“Sd÷íÕ6A–þ ƒ‘<Ä´P: çߊ¬DVÍLž*3›£ð6Ë$ 9Ê$ìâ@քH6Ð3m6´¨>ê4K‰<¨@¨+i³dze/˜˜Ëàù>e§Mß8Ðl×̪. ÿT™X¼5Š}»DׄuH÷{g’A§äž‡BÙ¥ËÜE($ÜõÚ"Gý“¥·Œ'rç|€Á?Hâßå2lˆ;Û<$,”dëKØ’"JZümޝ‹KèŽå`r ,uٙÇöâT´îê/ðbћý\S¬K_äÚÄK0ãrñ¥žUÑtãk%é°wîç^V‹lù«“I—ó(Œ>wKŸpÀ‰5_°ãy·BßéõB uøŠ‚3òÃþ= -ÜOlÍ¢GÍJ”á_k]ju¥t÷›Ôÿ'‹_…¨Ï!éÂ'¼é„,mÁ¯>'oOpÉYÙld(ñÿ>©ÿ~mêÜÏ?T‘œIýȦ-֘3Ó=˜'¹èÀAqëM´øУ6Ýÿ0žDËã~gÛ9gf}©^gDËÃÝ¥‹ -¨ŠI|Õh5OP€}4ƒœpò8Éì;ʕÈQ㎺OˆÉ¿„®@Ë#—Œ—^ .Áô&â ÝÊÐ<»ÞÄ·—} šËå:}üeLãÑhj#ˆGëzÙ±m;é[a׆¾þj$ÒIÎ +‡-±¾‚Š¡6Áe 3l`”Ä.I¦<¼Ô˜¸À£…])¼†¬E0S0 ’Š" öºrD¨GÿxoÓúkšÉ\á-偬 Fi5*¼Ñ¦Ñ>ü™"´tƒÅ€ÿ¿g¨—ühþ™/ƒhjYWDÁ`Øn™ßG니Ü"q¹õ³UŽÙ¹cáî3‰ŸwUåà î9‘ÃÃþy'+bR=öK_ؾ%ƒCÄ|ò߁çø8Ëu'§Ø3í܎f­|ܕ^¦;Pç~-Z‚ÉýjFA$Ÿ&Î7ÿ”õ—Ó½ˆð©| +ìB'3zT¼#¨ìý“5Áf‚ƒÞÀ}P–rò“¢€I‡”¯Kƀ^ÈP> 'Q}ºº×°Ynvx?  (&üøyÓg†Èͬ¶ýâgøf׏ÿä`äö*¼Q| !À‘å07Ål ÑLٍœàΑ/¤‚ÉáY½~²dPcSÿXÀÒ§m;їñRÎÃÒ¬tÄÄ0xx)O4ÂY·ÿ9³i„ž½8ˆ}áqÝ¶Ÿ+ÖM éë=ªJÍßbÒ7Lf _ ŸvèØz¡J bŽ|q)ØXj ÌӃšօ+‘2³ÕÈí¡€uÅçC¡èS³in‘8º­!å¯s%å:È hò†g1µ=àŪ´xƒÉ‰¤½6®m§ðë¸Á„WÒùþguk1C«=™ÜˆNòFÀTõܟԲû[cò!øý;Ó̪Ký„!·ü}b"gŽÂ$``RŸ™²™ñ2¬žÏxû*"ж’ί²ÇÔeé^õ¥Ôèò¬/ìV‡ââ pMOçZ¦£ ÂaD·ˆr-Ô§×Þ + +‘ma,Ñ«”%nûzSª( +ÿþ“ãÅJÆÃÚ¯DÜÕ² d­:ìgÊÄ '<æÕA[:ê@  î~zð]öRúS¼âܨgÒCo!ª;J‹‡ZWçt™%MǤ2¦Øç¬Ø(+7^ƒçžWâõµº*ì¦4Š•ò¨g2’Š‹rGê¯vfÔóH„Ç6¤²¹y# ñÀ†×'Gåfà–jUô·Ûø„6baaPší‰ÂÅØ`í'"|Ä!Ô%2Ñù-1ƞÿ2&>} +–ÉšÒ'úÚ~^¨ÕR˜u>P”‡uí¹1žEÌðŽ,'%býHu$¸¦XŠ\¡ÔØÆnÃ[÷×Z×+-µÙ¡…Gí‚òֆG£ðg6ð#ú5;ï0å<,Šµ¶¾s:% &}„dJ“%ÂêˆÊ)\ߢk†ôe@X@÷™MzÁG~ÛUÃXWãi$º +ZŽ^=»ÖÑ/FÐìæʖøWß)MæŽ ‰®™O`Ø÷µ›0U”g!cTÎ*"òÀLÿM%E—¼onWù©Î[~•ÓJAþìò¯½³+r°ªä^(&Ò;<äV¦l„)îæ÷Ôùr 7Ž¨Cée&ӏ,øâÉØÛA  +ñ/8ö|arº¬œq–Ig¯¾ý"/¡ÞG… XHh¯êPñà)æÀÂ7{ªÒ©¼‘Õ‹ýE}C ¦‘#ç®â"¾ÊR˜ErÛ»lEHÊ«|±§ºÅіô*ÊJN‚Uã#JÆØÖ¥R³=ŒŽÀ~ëÉÃË'ܞ¦ÍŠj"UdRùÈ@Nt‹!ÈLE.(¾î–”†æ~ê…ߎéHž +K¦¯.ë¦eÜ>maVÁ•ðºLÇÇ +ŒeåÇ •ž‰ÜqÕ;°Úq€Ñ:c×Äj¯"ÇòîÅà¶äY‚úýäÇ }Ç3Êd"ÂØ;M±ô|Q?é‡;Ünˆ¼´ƒ©’»ym㇑8á›F®w]ˆ²Â =‹:»£:Xp™0F­¢¾­X]Ö·G!" ×3|©Ý$¢–ö&ýpý+€–%WäQ;FT%K¨$¸q¼h€å”9 Ëêçõ;duuҘâp5Ø$±mVÁÉö H TU¶‘'ԉsL÷{• 6Ò_’­¹a%þᷛ5$¼ÃW8½É[ƸäðIÑ«¤Üƒ ÆÛÄk°:ܖ¦ÙâÇuë!YÉþ¤*H>·[Gh2b i‹>ÙuOÍ©'¤a¦3kàkP}CáóÄFAƒF‡,``¤.•œx$d8ΞO•U©ëqÚ|E Aªµzó ½KNÞh 2€–Ôê»Í‚ÄO™"[“¾ÄÄÏ)P¨Ôˆ¢’´ +¶ àj,¾ÚËâMˉ‰9ËpŒ$;&Òúµ0û©AfQˆõц`+žU¦Â,&7ó …Þ¢¨TšK9¤Þ‡Sáñ@?j¶z¿Á.¿<Çã8Æ°Í—‰"‡lØkߊ6S¾®d"2éÎÆæ×nÆð‰|åÚÏÄà¼g¯žL½CzÛa$]lAÕS²W®F «úvu¥ƒ÷ÁˆÂBGÇgCìÿŸåúUX§€>ÿ_2ɜNf 4ÍÌ2©2ìÒ·­°i,2ÉÊL±1“Ôó$üKn'ÁÎZÅÃæ$ÖÔDn&pñLeš}x ÿ±1»1"~G¿J0QKèÓÖ)e‚Z~XcÇ°”z§­Ò“Müö”¨R.IBSþ³Áƒ¼ÎMu€B“ÿêCYÏ ¨ÄîEŒà#ž {NL¤µq–“ŠßðW%)ßé?}~,Oºža•˜­ Ü šyl8­´ªá¹T$z6]¯Ãª-úkƒã”(u‹”9F@|ÿÑ8Á‘m:s.= Ü¡Íx¢¹ß%ahÊÖû¬¿ ¼CÁgÁµeÕ¶‹!+Aìïb`~·ø½sؑ›FMGQ_Ær 6ž°ijw¡¼_v"¢õoK¤†OsñâS~fUµŽ7;Êäú£" +43!‚v>%æ}H&ƒ»W·*S$ñÙäì\U Ü) |4_zTÎ!t÷h>#ÄîÓo¦yvyc K“ôóL€OØJ0ïßðïiƒ¿°Êµ´v‡ÿW³¦º\º/õ¬ˆ·°eàÖ²MæÏôF¡Ø…[ZïO6ìÅ¥Ø(…GªO'ý®ۓ‚B¤óҖ¨#‘ƒZa Ô±qmé6%³hòü'¡É¹'»aDò*Ž}òÜô÷{}]¢†— B´AãP: »wæa!ÅEãK!œžÔ½¦œZ'p FQ ]F 9õGà EÆg׊Ûº©†kx²|Bäâ¸Ê5h¡•_2Ï\ B®çëzØyêéÆËô\€>‘By‹pÀ$H EW\'ilÐÈès \( :HIî…dåCVz>#ÁV=s´x™Íè»Õ¢‚«›˜r½<™ôd¸(³ã¾ÐÛô?î4zŒ2¨my'úJŽ%ÄLN$DÂðœ>|S+¹­GdÎàè1 Êr•œF^"øqzgdøfÇý'äNåš«êŒ3]ùýOv&¹Ž »$ÇIŽû¯.ÄYIõ$v?V[Ï4NŠÂµœRÒÞZ#»¼®«€ºÃYÉ==k$r²N $Wp{]靤§ä&­\̚÷È9Zkx²•ˆÞ9ñ—BÒ(§ÉëÈ%ñ4GŽÌó†³'u𠗘¦ 4 0ÆÈÕ+Kvðü¹D9ç¨iÎÌ"Am[®Q2ö ؍˜©"W™F!§Æ°3 F!iANt¨Â løŒ>9ÎÁ9éÓDsÃHDªî­}ϼ8ZžüÁ\üS%}Ð({‘ììûóÀÛ&=>TðýCŽÇr¦ð$+XWÖ(/œ¤zÈm¾D¬vÀ¸_ÖÆp‡é±kžT˜£FáGæ«]¤|ïòPÃôw(7†?ÓBî©é9J,roéÛNø서vÀ0ˆqHðò9BîÆ{>—8y9ìó'õ4:ÈõH¼vú}§Ã~];/Ç r÷½‹32h¦O8œøß¼âñ–š»˜@. ya÷Óx©ä°¯~Zpí…9øl'WCƒš¼%½0h) )—Òy:͏ÛPµùz÷ãÈAb)ÖDúÇSL'—¨mõã‚~9zŠÙ…Y}?½8¤;`ËâÇÝ<_¬É¹è‡‘ç~!'‹ ±Br>9_»<¨EvÐX¢*áÀ}!%JÖˆÚ ƒvƒœ¬`;8RÀÍÙã°ØÌjåÁQ`ºëqZ÷e~â© Ÿ¤ ;Ž3‡ˆÞɱÏãø_GÕRKÑÝ<ã騢Oh8N‡Ò"#ãÆ'h…Û½œpü¢\âÓ%3«ñÜۗKð¸û#rPXÁ´ûówܳPCSªÖÍvgÀ˜ iw\¦Xá^Ww1˜ìv(S}yDßÜàÓN ïmYׂ»hœ·tü»5Æù†d^öé¸Û܂tu—/͕Ž{=±¢ŽŽ“¦[ð9ùåÇ$'È@G O· sãðNÛÕ7„ •ã ‡éu¿Äè#Y£•äÜ)Öhñu|3¦»XDš«Œ˜ïÇéh€ð±†N3ýçzO–ÂqOk¿’ÁV lí(ú~> œ38ŽaÊ'¤F‘p"–ÄÛö\Pgu* fÜ8ì¿?ì‘%ùŸ4äçîçÕ·q8À„Î||­†éʧD…~˜a7 (uMs¦¿Šµ%ml+Ù8-Em_ÉÇFú ^Ÿ*g~Kü VªÀœ$ݸkœÐ¹Æ™,œâ˧W™ã8ý´Í«qýÆ7jc½Ê·xá# +ÏO±”<Ž™âøåӀ+Ž¿ôR\è*2{à(û¬ÂéoôæEqo½°[¢¸âû”…~‡7á¸Þé)Ju´^ªÞ ¸êp€§ì> ¹á©€—8ß:e÷,R¨"®0qÛ>qÒAÏ X_?Qaž¸WÐUЅ9Ãÿ¶wâ ÌÔQñ<+L¾quâȓ)&­+¥Ò·?ú˜;…Þ•Sôð#7°¯,÷(µ}9é1qßþÈ[p #õúNt8s†I´ êJ'J€$†Û¼¬OŸ‡/.… Iö$Îíx ÀÂ(ó†—Äñ¦ÊŽ—üâ.I„63n¾¥í©“ÔsËMp¸ËP¢ ±„]H„ÚiŸf„TI<V_ç„Ç!u>œéÖ}IÇā-ܕþ]•pýƒÿ'é¡f‰ŒÕ mœ_6K»¢K¬æo¿†ˆ»mÄü£·MŒàÉËÃi÷ëÒ;hÕoFGÄy-ô±ÑÌÀ_pîKKNP!.ˆgLˆó½ŽGˆäâ´QÛ Ž~ÂFfœKå==د{8æ h~ qI—äSØÀň{#×à=äz$‡DE¸Vè!@~ڀ8¥=£ƒí ¡ƒ×½0¦õ¥ +"y]y©ìB3PÌ^‚¶<¢é¡,b@:+ˆ“·˜³%‰S&-ý•&<œ––èŒàþÅw*[±}ÃYêd,ü¶9À £g=}ŠÅF1®¯Õ±‡Sæžý™Ô®ò·—Ðgò43>}c9\DŽAû"éGê˜ß6ÑٓW€¼ Ë&5 ¾ápƒxªxCÇ<8$®Œeª°„"w7\íµÁ Gó³xõ6œ¿´÷Ö? Ìz“½êuNcªWŽºoüj¨³Α“ÿòïȍŒ ·^ù.|·ÄT-:ÃÉ3Í2œ`ÁÍpˆœñf†{Ïj¸¹Sœ„¶}.z€\Îur2¯¶N{@=†£ðü÷3n'ý™Ã)ZšéÜbllóµFÖí —<—%ÈNŒâpo¸ —}/‚@ÂÞ^ø£%‚%"Jìz ·‘µ3 |h D›%\涨5Qç|–ïÕZ8Ž—(Ì8¯kõ +õ„×Ǫ„Cˆ°Bb‰¬p¶ÒU¸-løénš\U¸w¸26±¶°†2E…KìQ”S†Php`‚÷΁窾¿†Ñ¨¢o +÷„N™»¾!oTj”*ßæ:»Õ£pËRÓƧûIâ&œ®Fê +m2‡ßHŠŒnHžõj‰էË©CB¡Àq£Š•pªÚNúãÿ«Š9£àÔìÍHU›àóNÃǟ>ÕP¨rUNd‹È)ÌT8æH¸s,R# ÉüüØÓ'˜/ˆ­á0ù¢#Áyú¾y"Eƒú­c–ˆ©˜Žâ+ÝwäDj !‹ûeÊ'Ý^BÚÆ-1–PB»¸ð/÷•ÅB8¹„cîC±L¢ÑA8ÍåVºÜ^Όñ)žâÁ‚úí+XÐxK]‰à2p29¶ƒéÁdÿ{÷àÌnˆT“ëòY FΎuvV"Ââ#?B`’@3A†5A²ý êpp¼fÆûiøP?àͬçÑF|ƒ«ú›a<«°«×ÛàpÜ°&ß"Ûaš î@šÙ P‹—®Ái¦3ú&¸!îEES€ΗA«Á¥žg\­Ž°¾€DƒK÷óéáîδgpcAã3î’Qëïö&£e€ïä)˜ ÌÓòLu§Î›±€½à5‹.;ҙWvÐG×ÝŠ[F fäæ‚œ6»o}–ۏÖD é¶ûàºk?~O¶6e¶‚Ûwb‚Î÷VÁEwœFNðó)¸JáóÀÌ¿ý½{´ œ-1¿r…¬¸> +Ї J%{Õ ŽMÀëÄG vçn‚»µ»»f“Œþ”Lp×l÷σd +qrvkï ¬*‡ŒlJ¸Ñ!j ×µ*·¨À‘7çN‡0>.êɐí)ÅþÀIAA–q·¦ù.ýûÀ¯—J$¯|‰dµÀ¥¾Á(ó;pš uà´ÜÔ¶ù©Wb… é PÚ2Ì Vçi{šœYeàºÈ’>m° O*ŒÑ1p»¬ºJ³ì‘|³áږå×çaaˆ¦V¡ä±ꦑÇDteUkš$/ú¥6JÄ_ˆyÇ­|ªí \z:° V¡ïßʹàÞ$¥úJŲÛ:Wß·ÂHå!þ² œ†´ÝfF»“A¥½&;­[8‡ÀɆ7Û¼¸MÂAàRV³JÝN7ð¤ÛS²EÅÖf’Å€û¥‚ +0?õ4Ø.X‰ÅÔ,ó§sœ¹+FòL¤ùÏênJk†ÀpSwYCÀ•Í s–-êph_:áàd¢Ÿ2"zŒî3È=b¸+Ÿ•ë>Hƒ;J²‡B$ñè´-šìY$ª×³è¬æ£Àl÷!Ó8~w¥,H'TßÍ+«zق¸¯0»ÉÀâäÿ _gž…CT<˂rC;uàY1Àƒ× ÿ oðCÜuE­½Í~g·uF›—ìœÑms*íhÕd÷™ôoÌ3§\³CÉÈ*½€Î¿¥x Å…¿áØ= ¶iŽ.agëžÜûíN{±`zhr `Û߮ս^79Jîv+û)^S¨îuš’XR°Õߚ&Bn..—<ࢿ C$(A×ò<~3î +0°ég9kmþ–J„0çŒÃ·\Ñjt3(÷4¬_–®}=ÉU%°ùÍٙžc¿ÜoÏÄ?Ý«P²Óí7–’PnNýO{¾pß9‘ ÒLý+ÁÖü?nßÒÅŸï” ›­Þ;[¿QäéÕo · ê* ì&æŽ"ӎÀÐs»ß²xã0ñůêÓg¬ãYR ûËoϑñmÏ{®lò›({9ƒÛr%ú¹E~û¯ži½{éxø·^ù‘ýã +¿E€2Ø]qoÙ»^K,Ðçáà7¿Ë¿‘F¿LŸ÷Ö7¤ÈÿÐü&í!äfZ#÷u²|‰4Ü×±¢¤žO\Ã|ûgP/ú6øVÿ¢F +óV_CØDO¬ì[½Ï•… By’†}û¾~"VýÓ«Päýõõm_®ybÐdº¾ÕüYyz&, ;î³¾5|åÑ- ó#:ƒœ]±WV!'CñØA¾1wÚ`÷-6¯>K½MǤCßЈn΋ç(3w3÷H´UCøìðæŸ2@ôüApóÍè_0(ô÷+ö%¾U6Gti­7¼YI`ǹñ ŽÇ›êp<çÝÚõÁsñnq°"£Û%+>)G¾éZbd—U.B¾¥wYX!éÇ· á ±ŽoU»/Æäë¶eå€ +“ „ßaÉg˜‹±Ã{ÛS"kCí⥓Øáò1›ðM×ê˜Iå™Ôƒoã쀴óYð >bÞTIJt¤‹Ø­ª=àÊ÷Åu8ïí3Œ¼¸ ù_ïíís0ÒxHBõF&¹ÌãÃȱŸ(€YVoÓȳ†¦¸3oSÈçÞT5¹ ïü,8?UǽiɽÃ̂Àî·7è§rðq5ܞ2Ú[’›Ñûì £žý{Ë šíhõdSYÿ;.{{´E>¦þ”zPÉޒÎ"ÓvRÖ|‚6F*óŠPˆOh†¬ûë 9-‚!Ž …µ·AÓÛ4ÅÓÛo4ëzѰݱ덼«NÆՊ\À‡Ìó÷,¤±lý3õ„½¹ÎÐ{6Á˜ôQ_êͽyè1´³ï»Dö\fç'1wz[µº\ +î.-oÆ?: ŸZF;Ó[(? Ìb%l’9>ݸ+3…‰‹Þ0)ћÑ'D3y¯DdzS +UèM³'„©Üð»=èm„7&#íRB(ぱk…VÒa:q]wÏ[EÂÞŵ¶[lPìô’œsÞ**Ôi%½A5ç„^—®Çù3mÞlQÖ"¶mS†öږ“]ÞBIlD¸ÙzËên–7»ES»×'\nI +ÑÚ<¡\¼uŠg}}ÞþɌyÉÛ3zB±aôw´] 0IÞ4:Ozmˆæ³ú"oªb9ì£'ÈÛÜôD|.Çëå›*À<ÈÕüxÛkÛo‘÷ìŽ7Œ­Öov»éÆÛFùÈ"ÜÙSJ†wᓈ–‰žo[¼ _¤›ÉJ#ÞҋÄöÙèDDã:;»¼…x{¦å÷¢á ðÈœ{ËþüGŒ>Çãày.vxS‰{ŒEÜqDîVox#67~d¢O„å’”pG9‚”]xûvªY/†R +#V"·âm‰ÃQ;½JCªIր·îðf° Õén¡ô°ûnJ›ún¤×0ߍ—:¾›ö€½w#Hjíá´¥TR}ÛÆO ëÝG1!ÆÝJíá'7[±$¨ÝÓív8?ïFÔԒ™öpl“Iñ²Ó +& ©ën㛟ñ\’0Uw3$ÝNHìÈN¨žî¶®ívdÄ–„òEûîö~Œ™,û.›¹3áû`àzs·ÃαOLq7ë@Ãݶ»Û<Ú@Iï¶÷­²Ûe<»=ʈ¨K+è™ÎQ6u1·[²ÜíoLֈœx¢v'¬Ï;Û-׍…Ý ˆžoí¦,ÝføcóêS}RÛ£¼öJa|ßÞX¨!M½näª5Ýô†%¢¡ÈŒœïX!ÍC&»­Ô!í”Ð¥Ս\ó¥²â‡pŸ»ii:‡Û ¬Nïd¶n¶òNØÍic쯛ÞðÕP uSWö¸ì$€Ôµ×mëÜt¯ïcÿ‘Ó ³[ä Ï4?bø®ÛZtŒ[Àc ßhBpz®[U,@ Òiè³GÇuÃØ*¿u³ÛmÝ6š)JNÒP£ÒBÞTo‰Òºm¶ì'aKŠ³ÆY·è„ ÆfÖ%ZÉ´C}~©˜çRU7ìJ<ÕÍÈòbhPÝ"ÞÕ xêPŸre¡‡Ñ?Víž×I·{Xº½ÝýbNØ—£nÿ¨c¥Ãvê²q‹ºe·ÆŽjˆmÞQVôsv9«“Ú¬ŽÁÜ,ύ­Ø…ŠÑ”Ù„®›w¿n_ºõõÿoDO¢›%eço,§‹u¥[H}.È&¹çØmdÄ$Ÿø!Ýò0P"«¢N^æ¿cZÄêÖ³Ÿ.ÃDÚ榙;'7 +lBÖ¦“Ï9ñ)XðVY·ý¬cDªRqƒªÿ<„~“ IÉ·Y趻&ßM9¡[ü} €Øººmý£• õ|J²jéáZ•Ù‚n"ó:s™¢kçk†ƒbn]RÕë2ØÌãÀn¡ÿƒF–¿>˜~n,¸9Òr!JàµÍï(—¨8>³•Iñ4ÉÑrùœíz5L&âM +—6Ô £2·¼\ÆÈå®Ñ9·aA±>¹è¿êrn½‚£@NnWüPXüª=á¤ç;^T”Û°væÑ!|ä1Úæ–0#áH¾.Ž±Š®=1‘~*9FlT:CIi¿WÓÜÌd'q;›þK ä’w!@réÃvLƒÞ‹¹=gg›>=¶>ÂíQM­,jí©B÷Ђ¹Ý„¦@RÖR¥Ç/·t·ù½ÂävA4—Y¤ˆ I‹+Â-·E‰—ȏîés…IBåóÍÑóÚåFD‹őkz`Ÿ_êF¨ fïàsÂq14[#mú¼sCÁ¢C8äEŒ ‡ÈJn÷ 2“Ü6‡¾§ƒA^è{Üp7ágaa h‘›tt 1#q‹ÍsÆÿ®Ð£CnIC’¿Û"ë¹Pȗóç‘;N©Gˆ“‡®ã†³]«æ¸Õ²¹ëÚCN7Üø˜T }ã&‹ƒm/.g7éÁ媄wºû4n•­ôo;Cޓèb>†ÔzýŽq»[Š,:iJã·ºÅíRðíêYÝâÖÇ£$šašåcïŠÛ鷗-üóÓ©>Åͯò¡"ø†æ'¨-ˆ´S]6„½ËA#ÊÂ`¦Í`•°µûX|ÿêÍâ°ÆsKcð‡›ì=/- œd$%Ót/ó·q 0ƒ¯€`ò—b¼Ã yq§=ðO"'Óò8­ÙÜo+ÄAüÍ7ܼôۚ.°„1Á߶¨Ôпy 7]u¿²Þj'3ÜhØݍ¨pA+¸¾þöf*¼n+åE‰4Á·±ÅÕ·I€ š·µá̐Up³V­'¸Í”Šà¢zàæ0©EÀnZHàFªÅpc¥VÀMÇ©Ü(kÌn¬ÔüoÓ=ã<£ÚØVl8ç/蟨3¡´k-Ýu¯íÛи7*,kb›u¬8Taê +5U3H‹¯§ º'r ßöÞÏp³rÙ)Ap¬Yj*xÖÛø»·)(zĶ6mƒä ëÊjZ½PƒãU ³‹QÒÍÛü °à~`ÄÍ\öåm!X ˜2-¢uNÞ¿i¡N,Ð0PLi»d’¶Ê‡F,¡†ƒ5†ˆ„f.B”#˕%­ÛÛNá^ÈfÜ$õWN˜’ý”¡u –»íöÈúæîÒX +Ä9Ÿ­½cãíHÛÙmuœhÃùÆë¶Ë?"¶'qu[.ØG°vR·™9’´¼óŠاÛÜÄ_¹8`˜Ä œ¹‹a+0x$I¯{0BZå6ÔH ðxÏò‡öä6¥WRtÁɑÛ˜¾€Ö}çíÕÍÜë`t£F„ñ Ûá¶(= ˜¢j°p›@jb·­bŸ+ùŸé¸Í|Ó+8úD[¶Â +QVB$·o›8DYw)Ær:˜zp`£`t—#.o„Cˆ§Iégïgl]ðó+6E“Ũ‹=ÒK ˜¨ÚÁ¦ÜžÀ+–móýýCbijÌÇ8¶íÐL¤Ì¹ÆeðvCôؖÌáñX#7“ßdØچÿ镅O}ƒG2kqWÏmwª"³-54Ö +H¹Ìg¢¶}_¸ۊ-âWÑïb÷¹ž¶Ç÷ÐÔ7²\ÂQÚÕGÊÂÁɚ¶µ\¾VFy5UÆ›KÛþöQeÔûFüºjSq^´Í…·vŒµµ±K¢²¤¥AŒ,]­÷‡·Ÿê7gI2fͶ·[” À"ôN¯¶7‰û]„ƣ震1ۄÚéԯڔg?¬î~µ»ÿ²íºµe›ÂAC‹ÏÏC?t'i¬dë>ü…_þNgl{ñh„"£ß_—ÛÌú“XúkÙ(k«Ø–à˜ÉŸ i &¶ñÎÑéj&Ûöé”&Ü܌ÏKŸšü±ÒP§ùÉF£â`µE¶y—ëiáRb(ئtò}³y¿7ƒ +ˆqüÔ +ÔCaS¿p´ÝisÕz‚#®©šŠZmãù^Ÿ7 +t†®æœ»˜–Ç«M¬'JdÒT4é«6aTÓSŠ\¼¤[µUgPðÀÛý쪶Ëu¤gî9S‹’«¦jc +—jÛöß Ð9Ñ=¦0ÅÖɦUÊÁ-ÕƱ{´wzŠüm® ·îW™>VýDº+ñ¯ l(íŠÂŒÔ–ës<©Jяœ,¨÷…AÊþ@ÐL¶êP›8äÇ “…Úž°DÚ`‚B6°×»uƒÚˆ¹(}&³»QB¶aˆ”ódÅîÑD?<§­Òƒ*:«·ðù¦ 2Ó}‰®•çš¶MÑ«îéý¡a£’§†ŠKÉu¦M›œí¤í‘l?õZY`#O¦K¨ M: ¯E¾d˜6éÐ6D´t:–Ã衧´Ehk«ÖÑ]QÚºî"]H4x#2ŠøŇúç'Ê´ã¥$m„ׂ@Ž¼lA½ a ҆¸V?‹±G›Ó°ç1®1þ¾mºƒ°mܲíÁrm«Ñ#e ˜=ÑfIÏ´K´í$?¶¥ ‹8†gËBåØN_ônRls7!e/²MxÐ(-*Í¡M&±M¹K?ˆÉ +1dA—®Ê¨OªŒbSô±¡Th›K6øéÏ}¶´Ïhfã&“]„6þ‰7f´ñC[=)¶”tçµü@Y̹ñBÑ~gF|ý¦y‚Çb:@^¿&£­Ohv¨?‹ä~ÖU$ɹüÝûÙÞ[-qÃÕ|×XQ¤¯ä/${äpóÙ®&ÌPá„J²eÙe|ûæ,+ڕֳG5C(&ŠSzš‘Oã½z[[6UÈûn”nÀ6GzY²šUȺ뢳ýWG{±ÞZæËç:=gËՑ«ÙöáPÖiÙn9¬}U²‘ØöN Ëٔ‚'gÓWWŠçnOf/Φ×fΩ§XSÄ%ôľ¸½ûÍv=Ãþ ko6Ôÿ¨ÕƒÎÝlGl‘è$‹c]n6€‹ÛS’Qj³%…±„˜µÕO7ØF³!ò¡µ&ÌàÜR©Omú»š-¢"™]lá ÔÐQÁC›¤(Cp¡¾}äLžÊl㖊c}2¾Ê*Ye“óÏÛ4`°$2'†Ã/÷‹Óñ1[æq­ósÚ2W€\Ӑ+k!³˜í• ^N(—¡fÙðØìI٘8õ/·¹Ó<–ä0[βR³á³ÚJÖZ ¾¶}fG>ºs]@–BÆhÌßeËÕƒé×¾<¸w.›(EsÀyá*g-.Û͏Ƨ ž£ÈQwH³ìØÂe8|3UDÑ'6Ýr3 ËÌ|$nX¶Ú_æ¾h6ÑXC¾fÖ¶€ÿˆ-Yäê^Êfgøä»ðíëǵWpñ¤lÆ=<èésGÙd”lEzN¶°ôeÓz€†ä7þ$Z“v¯Î§ÛkÕÑõ]hA¿í]Žf2ފJÖ×ؒ:{&ĤãEÞ%§ÓÑr‰JfR°ˆSîFc{Aï µüRŸ=è§GPx °©CDD‚ˆˆTäø`ŽU®ü r@î)dšj­Vµ•ª+Cúê.E€ÃJD‡zcH˜ÿo<£}ùûý¦€Ž¦× +/0âsð!/Ïü3“Œ¼IA´ ÌÉǺž +üÊ.sŒÒ‡x#S,Æ/ÜÄÁ!Ž7~'f{™{è‚b¤axÂ! +Ãcˆ¼ÿ!¥:6Åýq÷¹`   6%õÍè3³9/¶[lWÚöìdS^°ø†ff{lß À6یf[ší0HÔøÃuÒïGÜ A¾ÝÉÉɏêò¹=6ºÞýµÖÞ¦_CuÛéúán³+Û·3x‘ """·}>õiÍLéD¥#*vjVèRê¯Jm¥°Ø–”Oªª¦šXAHIjïÛÎíû¿ÚT×ví¾ÓÍ!•NVª$%›ނTz½éë +`ÇLé*ƪ´­Q>ŠÒ0XS¥‡ h´mI ´ÅVû‘„V¬W…;êR]aÉÊdwëj]aj"1½ÃAÃ0mS}÷$èzÞâ¼}&®¹³3ƒˆ-)"b9Ï/ˆˆxP,‹Ç †1ˆÒ3>"”¢\¡›!¹gf>óùùdhhpœã:=߁àÏ뛻YCB山͔…³ÑÍ,mœ3·-Lfr|9C È"Øtfþ™!ÊÉÉá!Qว@äØ؃D‡àäјLe˜ãIòÇ"4Bãñàx<ãL™è¤4¨D|^ACÀÒ < „Âa0]>€M>,BFB`NJ¡ËÔ$E€„Rê€h0Ÿ¸ µ§>í¥~Rà +è¢PÁP]‚?ºâoÂÉ'<ªçÁÐSFç ÒL­Ïù7lÀhf-¸3ÖËñ¹'•áø¸—ŸÐù° Ôõò ÇþtGËyFüUDK͜&>Ãÿ¦†Ä.\ç¶ =áa0Ïß¹À¡U›YOÂGféJS{,-Tl ƒé乏X`§¡ +﹎õÈ¢o’jŽAu÷¼Os„µìK–úlb¼PÝCwÝã ÆDgîi•Œ˜RrOü6š€WWÜï•áÀ^(=ü¾ºÒ!u[øÆÀÈíOW "’¡S‚;É +&®Ê2Ðw‚½x„Ay@µ£15†ÏŒpS\VŒø¦(Ùißë<G?{ŠÐŠÌc,Y¶éšô*¸öôA +–5¥f\r[I‚֕ÖÇ© Æ´ꨇ‰0ÃDè®Þ0ú%™0ZÖ"w£s ýïŸuÒ³%Û¨±YòÏû¸P!Êñ‡v¸?ö?]„œx­fHûþƒ±wñt•C ï¥jû@ên40ª”«ÐKä¾øú8ºàšÎÔö‚ïÎPhÈ:z×t7¤ðO X˜W]4)pŒ°c]WîïôÚÄùO·¯£x†2pX“%š}1³oðŸtX¸GSý-1pÊèÃúÉÑY*Z£æÄ®åìؘ}ïs‚ÀÇ<éBVïš;æï_IAü¨:YãÌÝx§þG%¶fšƒf’ +¡¤Ã€<百 ÷É©E¤;ýD8‡~¹4 fW)SHNšyÝÐ"åNöâ}.^Gm³áë×óú]Â6 z´z¯"ò¡%=íŽÀ Dþ}wœ +2°m¸C»·OvþoFÎö¶¶/ …È’u ¾É<ëÕâŠB¸èÊe9é´M»k鏬Øïǘ–@6³ëú꒪Ø0° ĶF¢Ê,R 乩+cÝ2œv|Ú~ʗ\•ÈÑ¡À{^öþþeê\M̍¹qœù_8À±íX»8²Ÿ^ÍÁ¬Ûv®² ÖüñÙº-|až|`Äí ~!sJþ8#«"è$?öTvníkƒ°?˜Õ[G`ñ׀äaå ´„®er)DÅJTÞ½ÂUÿëé½Ö ÓÓIUüõ¥QÙl–°íí@ +²AaÙW|“´38C¿¾pR íy´Y‚dRâYÃã`•à[¿pD„éQ3•dbŠP&_ÖqÔÉÜ Sçrç³g‡NPvãǦ¼±$7Ó»Õ~Q ´ên­CÿŽ_¤’!ѿɌ1Áµ2!ôGäQ!D¹-c£I¶³d0â%HIÚ.Ý¡›£‘{ `4e6¨Ž4“ÀE,,Ú $i:!Q¦!äMó>ñă£nrSžÿú;ŸTmìE"Å`Ô»¶]”d[]KP’Óv©18>ÿuR¼2zvõ€p[¦FQ÷Z–‰›8Dy¯„ZYC˜Ýn ÀÓn˜Šì_ÝÆJ†÷UNû·¢ö]w¿XÖjìñûƿϋ鞧£§ì;féðY·ûӏK2á(CñlÃU<[W0Í3eº¥¶Ð;ã¶/õዱk‘]üôPWµ]˜E…Ç…ËÑJÐ~ÿQ8ˆ>æ ?[˜G0¸°žÁ8dì‹f¼O†]ƒG6Â"0•0OeJ{yþseÛ*ܜߢC—¹è@`ZD7Eì€|¼<äpi/Tæ‘8×*Ւ$áXKÒNY!°ä~NPØ%šå¦$Z‰­#û·V¾M³ÆªG—&ñ5Õ¾ñ/BJJˆ ØZ(Ò M@Ô šóƐÅq$fº{D jgLaÆœžBíØǐcþPt"°O×/±G1 A‰¿Ð +ÆùîÏ:ÕQ ‡<£réÚ.%«,=‡J-9Iû€„B©KVeÇÒÁ•¶}Œ’Ô ’§õ£FÝ~&¹rH<éôS¼®‹,“2¡7:â]¿oúȾ +9F֔#Èv%§°x ¦æXÑ Ê/ µ)-}çՋ,¯ðXY—3D‘¤ÈÊ6nÆ(mŠSò›ÙñîT°·v%›* 7g-ëB™îâþv—Ï]ÓÑý¬¬<6ð¹âxéí ŠéP‘kì<õâÌ0A°C’ô9k·ˆR;OaȏȦ‚Ëó:ùb5ÝÈêº>÷!ÜýB# +VWþ߂Þ:2 Ã {Ô&|Åè=WVgúˆÈ\0 ¥ð[ª$£¶«¾Ä²l‡Fjoõ¯EéÂ] ’_ÅAMDzøí"Ô`h`•ÐVºvÔ °Ä?3:ߧÓy ¯BeB—П—ûó%ïѸæ”K-‚dh¦±.g^PÔÍòzëD›L„þW%—¡æ$CÖU8Æ"‘ª€ÝÏílŏ„wðøˆÚìz3ÜÃÀm®N£´6Aj]~¾Ïg†Ñ’D£†bgÚ7æÛ­èS;É¥€Õ‹ã|á‹àœº&V¯ CŠ¡sK:Þ”€:ÔÅ'˜¤ÈR[¡M.ƒ«JBtٕ‹]}Nçà9ƌ+¼UУðÝ¢>ÌU?>dzUÀÃI:3Ø¥6ÈÀ¦Ñ tÃåz°š±,ã†Ch1HX6LPÝéºßF—WÇ~䦺‹ý³Ø¸>Ÿ/'¤) ΝWNÞE:¼YC˜C¦xY”ü7Ê­Ëp++ÛDæ! zº•h/'6lÁqî¯7Õ5ÔçE‘Ø÷$J·¬~P17•Dj¥ ŒÛ¡V?ìøãˆíí ¾¡³›òÌkqWûˆ¦Ô`~Ü­®[ !<æmZãuÅ97uéàZ]w[\êƒê‚SÔæÁ 1WO¸d»`é7±EhÿSø©}#ÑÍ@Ò¹:ç¾Ësr39ƒµ6vÐ(k6´(MvduiU7ƒÑÿ“Õ5ē/‰ùã¦hL8¸RjÍíž+ۆ5 O –8Ž¶ R\–6’•:ÕZ' A\•–QnHá`…J‡ÐíÛ¨>ò·4w7/HEiB¿u7Ë#`QL6ª;^L" «UïJ]t­XÈ.Í ê2p›ã&-u­ÍoޜÑRÈÀÿMß<‘cê{áÒûißuʋ&.b?Õf炨BÓc!9?l/îÅATѱI °ø´gÌ dÔµÞgˆs_‘ùŒ“TIiGÎåhµÆÔeäVÓådfen?BÐ +œöA`ñ1x_¥kœ®«jº †sBéâO + VPê¬rºr¹iç‘®‚tCºšéÜjœz¤Áƒ¤ܨ˹Ÿ½Ç,Ølâ2†+ÖæXµØ34ÁmqVýÐÀäˆt +¼“ÿvH¢#D8B㠉 M£gl |µ{M¡Ü¦éɍ½z 6ÎËÅM¸?Èo3ç&s ÐâSqë‘=Ù¸þƒo>]¦P‰×7ÝñxLýÝϧÆ-ž‹.0lmŸú^Ã7içÄг.ùC& ÈVþ+Æ`Ô qÖMÔ·˜»çaóÆِx‰\ùF4R˜+åJ pôÚ[„I~ýmű¤¹z=“›‘8”¸Ö›;%Ýèa<®xä<4ÑYî; +5»BCÖS3†­ËIi’O\âãòÒà¯ÏÕ%€³÷ËYÅs:IÀo-s°£®‡—40I¶ÆêWé—«5¤%Èü8§ Ô¢_‚º@¡L1ˆG0¦$ðrU©l×ëu^+F~%÷ŸH`ïV +eĆlù7À‚~cÀa à—¡Cµ"FHú’èP¶.ٝGã)J ¥àT—^¶>ª'p]ᨇ¯²ÛÔ¯±q{~%4Á W›«1åXZFd¬SÄ6±®6ÆäK¦Ïùï3¬øiw_ ~~‡X…綱 æK8("l¹Ió¼¾WÑÅ&™v<³²>{=–P<¯ö 8“ܲ÷×]× +¶†©_<óÔx£ýÝA ¨ž¶ (ˆ“«<@û§pš³dڱᙠ+bm ÝÄö-›3;Ë£+Ñ·U2‹?ˆe¥’  +—“z«+ŒY_ JR6%mÞsýaî´/ì;[y”Œk}S:WS8rß>`ÿKj6_yöR#O™vtåw{6Žœî¸\W•Ò—yE8"£Zr‚ô?([SU.Ò :ӂb}%b†õ2gÆ gÙÚ3žTpE=¼›pçg¶¾YMÖ½š¦bºœèþ¹òb¦ëI°é‰¦í2ôz{цáÓуnøb(–×›ó‚U+±»Â#VĉY+× +pqŠé*‚䘆ʝáÜÙ+jƒ@—Œ«äNDK + €¾ Dí‚"Pu„D†ë@KÅ®°Ë1Ñ7´ ."”zî–û†<‚ #Y¢~ʾ Û¹æe ©}íit|‘(·ž!'ÕF €DW·ES ö&r‹;÷3\Œ‘³ÍïKy H‡/+~øTFëƒö†@ëÙ+{| 1,óYø§2¡« àÜÍ[*/°G$"ü‡0ú°g¾âÑg &?Ï¥–¨o¨ï·A®0t‹¶œ‚Å&(ì¿ÓëQm!䐛„£zœ? ÞÅÏþ“F¿’#‚Ý°ØüšrPa)ßÌ·ç‚BdèrXžÓõàNNՓW‚”Ñ»p‰b™lT´ð²>·GU$©­¹¦K ×v^(Ɲ»ñû@ Lkm*Tóѳëžw‹Ã}zV à!4 ܹ-äüTÛq–Á;#Öoô‡¡ëå#ã§~µ*€Ä¶’¨y”*k“ÕO:ß”ŠOìºôámAÛ$”üEÔ¡Z±9¤Þyē( ‰õe%Ž¾2zæ 1£Å(l¥ª€F\<î4ÑT~h#w͸%”_Ñ+·Ý«0V‹9ÙèþsÏh‚™êyÿº7„ýÏö®·2bæp*‘Ù-ÚÞ¹Â[F÷\±‰aŸ¡Æ@µ¡½¾‹4?ú\/æà7‘ž @çÉoz…"Qc-{¸Xë^¾46ÙÀñÉ´K=Oó‘0ÙHpQ3~D›ÚâWgöƗ¬§ü‹ûØ éÜøÈÝ8—iúNÍyà{ }ÄÒFR+Ìë¿¡‡Îðی•Â9Š• >†K‘haDÒׯ5v.V`ŒµZ4–cý¨.›(&߯Ü{ùíŒÙ—†í79fŽ_5½« +ò÷Áœ‘ ¸É®»é!ܖºu¡Àó÷ïUL¶¯÷QhZd!Öê† +hÛ?mñG±¬ý w¨êÜgˆÑÒ" ¼ Sj‚I,2òՕ8ª-9À£è ÷x1È;ÇfÍ˪3H¥¤Ä[ùÀY009HJPT¬|Cá¹úu#Ò¡#›êüþÊýš9aö|wQôƈeÁ®ÀûOé§çÅ/møóI8YtØά}³”±`$kAüwѝ‹È3êµÆ÷éϛŽù¹E02m +@<ˆV4‚•pVñä̫ͤÒeùÁÔ"÷ÞJ[ ¯•6/¢‘c§„¾ã Àw˹Ú¦%çðuDdµÊ˜®ïöù gí´·Œuþ0çn4aþ°`äOZÎ*?øÀÁÕ q¤“¨œ£ºÅ–›Ùyfq®Ô¦Y™ú7¢ZnSÅ)ߗ1DËÛÒìÂDqŽZPobý)#IQàùێÐP4 6ø5¡¨[µQ5Ýà“6âu˜ ŸuÙàÑ6™6熞¸êŸ¯ÒßCÕ]a<Ðg7¤—6ˆ ¼zN£Qžv"Ž]…Ê@™k»Vó7îÏÁꏣL„¬!ËgwsfpÅ/¤/L^`àô ®º)ؤ–>>iÕ¾"„aqâÄs­VyjqnÉE]” ¿<{q.¦ŒÉ8Æã(å“eÉÔ+ö°P’®cM­goã`ÝXÃsØDª–Êûϑ»}«­äDÚô\W¬CñÖ¦ öî=´ËØbÎï<ôˆÜh¹JdØ\`vqooQX|á8œ=ø ù°B5û¥fÊzÝ\«¸h‰Xœ ù—R\Û& ‡¦j‚[ˆB1V]<*+›˜§}‘%¨rN‘õ±ÄœAIÜ!³„(7© q†&„­œ#í7d“¦. º  "G Ð-õ˜{ò"€Ý‚Ë£…‚õYhƒÒ``°NAYC(;ò +¢“¶FB´„,s\(”w¶ËPÊn:ÞÊAÑgPZrŒÇ2 +eŽ3Ì¥MB¼æ*å -9|G„² +‡¬6×Õ° ‡}}0(å*õßóƒMk³Ã¤ýÿï¬lä÷–oJS0ÿA*àê'Š+æ8|,JëûæüŒX““¯ÿI?ч€ü"Š™ áy¸’«wæŠî¼ƒÊZYãaŽáy/ڄŠ½ÐGÜ`þö¥Qø° s¨‚Æ—ÎfHS1þ_®lЂá毊ÛòrÊU|X›/'ál M{þAh|+^ȊÙv«ÖP17ÃÑÌô–"›ê瀷¨-$cµ@º§u‘"‰é)Xž0‹D©PrgD€zZú—É2± Æ‰,Éé |No@‹˜ la†x‘jæHD_Xèâ$r„ƒb`1ޚq=F݇ðéäˆì㧨Ïn÷$dº¶…Kð]¨dtAŽØׁÄ>ÕL6ž*[§ß†eå h+â/±íD”‡µ¥}ëãÂ8³¼gËàÂqzÝßfX:nØÛ책?òÅ–ëijóþ¼ã7O§øŠÑð삦ßsЃìžZè7G¤ˆJ\qã6T)ÿ‹¿D~ºÙ + Â|³Ábۅ¸‘ŸFÛ«s@˜•À€FQ“2)ˆ‘Ucٞ,®†$NÆu]^¹‰$aÛÎFÊàó õI­è¼¥•«÷rÏSQ„Ú[‰wЊÑÒ9¼ñÐ@_Vá!du!Å9–#€² ÿ ¹ù¾Núôo‚^èQ¼Èʲ.Fɬü–` ò ¨ÀWÀx¼|:yK¸Ìïw¹f¹„ÂE"Ñ`ÄºýzZ’k ¸ù ÚÃ×#BŒÞŠ=AÚ)6¥ØÃR1–æöPmó Ÿ¤åâp$Z½àÏ 1=MÒàü"d8g n•åa¦$´|&¥}^„D˜T°ïj»;‹G°ä•IKz1Y‡Êuïam5t-i|»Ì>yb=k=P’+¤Q +¶N§ØÕ¸´ ¾ d\¯˜Ë÷_´4-ƒ3æ ²ž8£x€n¥€×£áv÷[ì|Nd)ž:’Ø8جŽz‘){ÞZ %±$3 …þ 4È.öâ~Ä<’“QÒ@¯Jô„щ¡¶ ÊvXH¨qú€ËœýU§üÕ$P)sÂÞyaíÀªÎsÌi¬kX¢ÌÍFÈ&ƒ46n˜À +‰ëØ?å"u×; D¡mqÜÈv¡ÑÖd·Ú+¨§ +wBÐãÇëßæ°rChcõ¬ŽÂû(,0ý~³•×ôMw™aüÍOYè %˜ j’8’ùé0ã¶MOÎä¨WÏDbDAQ{xÊ.•þðnÑlž$‰=;Y½^<¥-36ó:¾/É°Ewë&sÚ›æÏê¾âñ; +\L1ÜEä ’Y÷† íe¸>Dy<7Öݾˆ‰gÚ0; E´aNõ¹@•JԕWQ&hX¶@¿@z0",6/’ˆÖßÒXρ¥ٛKm³µü¡ÝñæŠD“h6D2ªCX=6|Îq%GCF·?v’$#&’±ÿj½­ÞoSD1}žF!*Í"†JZ$ 0‹ÌêQ¿÷m{E¤=J³æšˆs{p%ÔáÏæ#~ØT"XüP7ùq}¢×­ †â +nÁ ‰²#ÎæGçnÌY-và–g4tAqórfaNÄVvÁÍEÿ¡‡ùÿ<ºÍ5ꪲB!aė{ãaÐógbþe›«!pp+¢„¢dò°²Æz`¢hŠœlk„,ÜlÂðêâð%ÛtQ7W\/Æ SJ ƒõ38饬Dçô$©ßD¶FŽ†ºÜˆäÓ9¢z:ð0Ú®ý±5Ü Å‡s»b´vC2î"‹ê˜Ê„1HŽ£qFðj ž~ög,øÅ>Ú¹3PØamÆÔ/)Âʘ~ÐÓaçûæZ=Ïô(׍1 t7%ôŠ†’:ÊäÖevT tëÕ¸¹ÆÛe{°{^q ñÎ=°þQص¯r²Àjãý@wÜ®!)œ9­–ø͇sü!1=YƒãºËJ5rj‰ŠwOd½¤˜è +ëƒÕsN”ë;Þ茙/BÇnï`µ‘ +=ÕÁÖ\.QtAƒ«ˆÏúñ6ŽYñ ›Ç¤sse£óŽA$áÞíÂÞNœ­jS!‹ˆa¼é™°5ƒ¾Ü,±KOj¨|FçµQì´fIçe@÷º`©ƒm%rË0¼}nš‹së >­ý=pëðí\Ú&ҊCPSz×Àa²ÔAîàÇV0$¶W´a3¾¶§-¶PYô«¬™U[ ½œž©1× Õ?iÒ„0ØX Œ#—¢yâßÍ<:ÝÑ^®«×ÚQ4×Û|‹ô̀à«N)EôJ­ÏNu¯þ§8Š·{›¯•Zˆ* De¯/ØÛPÏE™–AÌåhfØGÔŪ7:÷ r\oªÄ\)HÞȏÂõÍ_´þß©’ˆBٟ@Ú<|9Fb3ÐÜ1ß:fXтə à´ÍÆXd®àO/l1‘|Î8fÊdªÍ†{HáÂPËLLŸt —-®—‡Y€ÖXËèHßXyZ)pIç†V£É‘Ý_Ò³ Ô Ý6-2aƒU>-Zâ6¥DW˜ ;ƒŒ5O3”ìéé@m¤JŠ—'`p§8dÓ01AÀ-§× àS–,^A¤ +­Eä×ÝÄiÝ@½ºðœ±¬·íùß@U¬æŠÞ1²°õÜØLÅVܺæ%ödÑ\XƒºDÿ€jIš–ÚZ—†‰ '‚”*˜±>tâ—QF“–y¸õØ»Á$Εíó†ò…ðë¯e³zp2Aòd³ßR RIÓkc©·/àÜKW3ñð^然wó%Ü=©?0Ù>]œú‡m|ã­ ™‚Ö¹EÛ?MGjÈ9¢Ô®ºs^ÿ¹º€ì-r|lċZœ6ëIè±®)ˆCpÅÏvxA:5W9T ÅäT™ ‹8XõqHLø\fƒ¶ó15¾î¹tqÖ@¨0\) Ó LÃ'fÇðl²õ(́þ¿ª™å‘!9ÕÛcжÎ"A×"dÕ£òŠ¼î9†Jüª5Clžsþ{Äb˜#ß9Ur½‰ø¯€½N•se”€UÝF°:akž×`KKuj +ÿ쉤ø!c`-Ÿh*^Ë*\´wðb­ši÷‚t˜3m/¯ì~ßÕ2xáHÙ£õëH~¡ÒI,ˢðá‰mËLÊlQsæ&;¸ÐT­Nd~¡a¸Ç\¦Î‰ €^rŸÒ—.§©¢ &Î 107&røMî!X_ûSÚs ¦aÌl3ÎÌ[@ñ70VñîÄâùxZû€ôïü³çq§‡j=g"ñÒÏٔáó ÜÏ}r-wýp3BÂ"Pv®dÆ{+«“¯,N¬ÇÀ9fðpHÆ¡Y¶b½‹hÙ rÊ€W…RÖ&ÃÞ1~´t‡BÒ%T¿È\"z‡€F#±„3o[Ò%_}1LñÜ9ÿDàÚÿWqF"œg=Ú¨PgdÃÍ£KÉ|Ÿ_L]/l¹ À¶ìÈ3‹ÇY/ŸÁ —›,Þ{°]2€¢ŸÜˆxHë-‚G5#!Í)îPçêæ©Ù"C@(Ïñu…䋬‚`•¸YÆR€¦¡›>¹Ñ×F/K´Î³£0>¯h‰4ügèȆ9“7 ïðx˜ WŒ˜ª1|IÚDk°ññûÈØò[¹nFD0j ”z.<»T +¼«¨$l<ÃÚ"Likى]ùƒJlô(Z'ë¸ä‡=®wqŠâÎpUwƪt¦‘Ñ‘$6® +bÿ[öêãSDþAî¼o× ×öۇâ&ðlŒpˆÄÑK©OqûyºÜ¯œŠj]Ûa7«Ò_3$7 °¡ÛF_ꯄÀed:U;è + ȇ1/îÀz*tåX+3ú +ó3»KôŸL óJÒcËáxeâ-†1JYrM¢‰° *[ŸNâŸÙ1–}y¤—`Õû©wápÒaÈ]Q 1h{š½€È™9åõ}´÷*AŸk†¢ºr% €“ù¯ÎªÄ9aǀv°Ó]b\Ì¡Ãü)¤…*ÇÔäÆ ]Ö,HÚÁa…8&°ÜðæW<µŠñº˜Sf´Ïûiþç~t/AÌÁ˜±+΢>Z™ù‹_¯g*[fÉã§KÍ  :¿Py”ø ¥¥ +‹ÎP˘9z9À¼èå!+!ï)jeH®AßPòwècß®U„O–~ ՊýÔ]ÄL~¦LPº. ÑS‚CcÄr¸;¨m!æT3Va!º÷&ëó S\Ø zGĄ^‰Jþ¿¤­LÙç2#Ê__PX;"bñhDlêƒÉpTÂ"‹qª‚óŠ‘ñØIAhÿí" +wXŸªˆÊü„ŠÆTÖX4Všü»oýó8ƒüþܱÈ•'4¾¦tøëƒ4áÝÊI†o<# +£0hËÚ' Á¨¥£*ÿ⮛«¨tӑ„.¯Œ^ؾ¸Åøüj—± F¶“ÙlÀ0ã€6ë‚££Ð¯r¼Åš¹J½’ø¦Xå ðRÊEÜ2n™ “3ýû±2ò`û›XŸ‹×ðV’D† ¡£2ÓdÐ=‘tÅjÚ݅W‹¢Ó#¾°þéÉÁ#JBtçSËØÊ$ +êþú5ç7Õ·gç!U¿Å£T®æsÞ˜ Õâ#% ~_–fˆ>1,ùÕ Záfn£Ê]gæÖÂų*ŠÍ¸$í +ºÜ]ç %m6™¤Dç¬Väáì /¯¯Q^˜Ú)™ŒŸ—Ãx2Ƈéa02û¡ò´²¡*g\DuooGGM2Z¸û¤n¾¸o™|/·Oªo!¤gŸŠÚ0´FI’òúô}uRå™PNUíCgÂ5F^þž#cF¥s|ZQ„Wzš“ãP+çó]d~OtJ²÷´Í˜¿{jcs=kÒL›†ʱ¿?ŸÈñbOÄݘž§ìÀòm¹Y+žJC—Ÿ`Ù@ÔxÏé©*éÒS<¤‹t£'¯ïǽ0¥lL 4ï_yRÁ¯›<59ŠàM~´þÍ<Oý6i'ל¿Müt—¦¶ +Oi«Ÿþ;!_ĀB·<¶N&Îfy'‰¾êdhøXwŠéTΝ¤¿ڎžˆ¶’eK®ë>€ٍS&‡qwå7õá ª °ú—“Ø€ð½É9˜b0q–š†ŒNæɜ›Ò3áÈ=L]T“§Tµ¶]oì@#Ägš5ÏìqâÅ'n²N“Pà·HÒ8YúÞ&˜åéG*!«N¦ÿÙø—øO$/NœÀÍ=lmrD¬”SÓ;ò.| ²Lïɋ%‡•/–îÇ94Æ~juÂL«¹ƒã1$¿T$j7Á÷‰'f\(‰˜açÂ(çM‚ÌLׄÐÌüÏñL3[,-Ë 1I—.m5_M$Ã\¤…æ®°êœÁ¥¹Mƒþ§éjx”ÊXLÊ`($ 3ÔCQprNåKA_›‚ÁË)Ó$}¶4ÛÏO‰Æu-m;âDŽ7£Ðn©}8a0™ïú€<†à»L´w“æÝ2o‚2Üaš‚ Ý¢Ã]8Uæc@ãÄtD,HÙRÈföu¹ 8‘ ØøÍð‚yù7a"ƒ¾&y:MÿÏ?rNÃXÉ øNÉ^S~ Ú<­¤.šH¹¦áâ;”Ï”Ø,³ª]X-’oøa¢’'¿2Íî»)±*sbAŽ°€ÛŒ=pT„Žù² ´à0¶šÖ®ÌöÓ ie®@ºiõ™„-A|eìÎMsV¾ž… ÜÈTŽ›,‹nH†-lÊPË<Á<2po®B»~?«páÌù³I‚œl6M¡è#àúÂ˄0ïØKÓÔ4±+¤EòÐ+3Ïë҈{)¦^Ö»¦U<€iì7÷òÏQîò…^ܵ¦÷>y̚ c¾kêW1Òöj’ž:»­¦çXºHñЮšŽN©& qö¬ÃM¿iRiÃá*Óß6}v*ý—& ëÏs։{¥©¶.ñU“-¨iZqÚºESP J8×XJ=ñ’ƒé|håZ?é^f +/ŒLƒa6ÿÀNRs"»aÉ8rhéu)Ñ@XPŠI`qo&‹1¦I¯nxGiÆØæLgw¤œéÝàØ}p]Š…ÀgŠ†! aßLÓkÔÛ=ͤ„c Ïu‘)8ù@º$Êid: Œi‹Á³L>ýâk3¦¾…ótÅ(>…¥JçÅÔ:X·p,™@»ã©I&aׂLnž¬U3‘ßuS–0IrðAõ„©i@ir4—–Öxg™Ólé„¥}vL |’§=g³âIúEC õíüžÛfOÀHNgõ‚óÑOѾ´ú_j¨Â²m³‹Qˆ™_…/%h¶ôH ×C>*]/qJþ_iäRL Ú¤uDÖ»bûÉï/1‚%v9h²à$® S$UqÊd€L*LgÞv.”n-%LàãLäZ¶ÖûˆÌ#ôÖ±Ç2‘W3å.Ó£èaf¬¯KÅeØû’$~>ð;II—\„,¼Ð%½fbªõa~¢W½Ã%àÓ+¨õxÉðñgV¾RTêb̃ч”*C%_¯ÜŠÃÀXKtði÷©.µ‰¶Ó¥ðU$Äÿsi §ksɺYr×aº©%Á$„J¥Ñ›–¬U\"¶-.¸r .]È|óo‰Ö8¤¬'è觝ðyoI¦ŒvzKeäFÆÌr,K5ŒÕIíÌ%÷c¤°T";ZJ8=+y6¦•ªQášùH›¨ çá!ÙÈؕh&Tsd®ÄäJ5£àú¢hRέôð¹õÖ¢TxXŠë€ KÏ üÁRÖ< ,‡S¢¿ÒT¬Ôy–t¼²ºÞÄP¿¯ “Ò½RÓ~Ø!ñÍ+=K…»W¬ïJ …´ú ÚËX Bß(ΑVb$rTŠxËJ*¢+fl!,Ùa¥œÖócµ ><‹miåVéYÚytL. +ò0%KR”§Òt}—’C‹¥Rö$‰R"*l$"3=(%…%³×ñÇeLúéªPÕÌMŸÃG¨ÌÚÛ¤ ŸË›§I« !Y4IE%.ÍRM„íÒ2Àc†µIõy[n&¯HË©Euë(5¢¦ê´†I+ {®ø÷¸[ú/I¿¡£†à{Isú¤B‚Ü.éDŠìÞ7rI_‚ d×}*GåŸh4D%Éé,1KRô?’L†–_IñòC¬VRíט7àÆ|f°O¨ä|KO¿g}PNýEޑêQžMþòÓJÒ¯¾°\¿¨ŸeŒ4ÐEÒu +h–H<}†á™Ï`³˜’s¸©å$Èc³h4!’¼ õÉ4*o}¤ÜéöH¯ó‰öéJCïIÐÉl²"mÂÉÒMŠŸ¢ÓKyˆ$G¨Õ ©g³^M±¨åÀˆFÀnŽÊxˆ „BuÙÙ¾qB,kúXMP󳊕£jÔ)7:G»äºŸ~V®.îœë« Î~€”̏GÇAüH¼^ é:”?‹b¿Ë0ýÇ2|!GÐüj$UãExø_45RÛ]ä7<òbï IsF¼×€Sð`±-ŸÐ•-aÜáus@ªÎ^®̯¤¤Ïx׋÷Gs{R-tŸåd“­~?:{oã€[?º˜ÉŸŸ#Ç8Kэ»%P¯½ð…1?ß«‚¤²'°´¼Šß{<Êð¯WG¿C”²—¦C)Ÿlx:’Ë‹Øk£ÞK‘ÇÉy*ƒl"˜È|µë A÷öHNÿÀ&aÙ£Ë ãÄxÝõˆÞú­Õ£òw´5þxÔü±¥ ­Ð‘[3x”‡Qíw¶íÜ¥nGÉp֎œ?Þ×ìèxŠYBˆEy·Ž»®Ž6҂˜ +‘ÛpÏ¢|#^.Dƒ‘:GՈûFÀO9"YONüã`ÃËß×°Âè4a-¾Ç‘áÀøCDˆ(pmôZu"^(wOר›tÖ7šÒ7bÍlÅ`â_~yùÕm¯5­Q#Ëa‚ϸßã/ÆaëáX“,q‰’~¡$Ó †T½g£Á–Ç”zTHF'ԋ²Å§!¬¤¢’d&Â5!Û;EéÁë!kʁËŠvwç~+{û(+k”¥2ú8Z‡i*ÒêÕlŒÂªFÝonˆj,@j“1gGíè ³ êç¯ê œüJ|çóë:¨kåöj‘÷3P’ûd ¤ÜÖTÄ`ÔðRȼÆú`}E£`iÑO-!yCˆv¨¨U¿ë‰~D‚k̉EÖMaF¬å‹ Þ¹ñlSdô†%¼§à^T%ù£vŽï̂C¤­GñÌ!a4,cR¨QÇc¡t²(áT"¹”. ("SÔ +Ý®%¢K#Q(lºe€^ÇS©$ĀYlp_èÂiži‚V:år™ #®F‘g˜Ö7‰((F +KT›¦L gý0òÆ"hÕâ•ù³ÑD‚ç€Æ¢ž}æ®ì MÿïæÐhfÔ¥ T’‰û>ÌðU˜¹²½@ÑuAv)¨º2Ÿ»¦ò¼h*®!1^½Ñ.úšqb¤çΔlp%£®U´.hljþ|¤”6Åv‘.Â2tÈ;’ð2«¥Ï¸È2ÏP¿Býd7Mî»á¢{¡™4¼r ÐçK4”ÁD'AÏxª[´¸ˆ6?Èê؍v`{ÀߣÊ$orƒ7½h‘|5Þªšû,"héf`Ø,¢ ¤Q”ßÁû´Ó¸.‹>z4°a—,ú2K1†1Wt­ƒ2ºU!‹’u·A1X„VdI(>¢Uê«xàî½Ãßy#D“ôUÔV¶Míªˆˆ°¸Q°üp„¢¤lÖ£"¡ÆrÇUS¤Û ”Ì9j(\ÂЀÊ)#>ùP)s¨ž`Ë'ùí“Z7©tÐM½…-¶,Àdec\˜ãè÷iÐø ûò1tþš¬( …“}û_)O$¥%â)_K¾Œ»  úw¢ë +—ªN4 ú'Þ9Q"¢»Ã÷Õ8ÑÀXÞ8t]?~Á–Ó‹Sg׎‚A˜ˆJ¦›<;<å™ÞŽˆT«§Lf•¨ß;æ§DýÎV‰åÝVˆ¡ìsøßr…Ù¡À´P!YUÈA½»pВ`‘È{ìïÚË Q° dˆxõ#:‡†FÿE± ª ×Dξ…'D-šÃèUB84s¨,`<ÈjÐ;»Yæ]ç5¢¬ÿQm¤3"ÀXÖ{’`#‚&A¾ˆt–S¢5Á +›0WkBþ‡ôU=&H«ÐuCd‹eÇüœbô +­?Çï†zzO*ËÓ,ä焃X8%L*/#s Aa`…ûDw1Ƅ +ù!Ð8Áo&¹T²=Ù¹p_!.kv "œ#ßí!JIÅ´‰m±ô2=T‘ôy(Ž– Àµ«<ô:¢ã¡©¨‚‹©©ß¡^±ã/øˆ’Lu‡@ÉN^l 2¶Ól-%§«¡a=NH5d–°8$-þF ‰ 5~–¢ØÆà¹MƒŠ®ÝÍmŠã>c†¨˜I(5.±!WfL¯!MÊ2*¤­†2V55Ôdh ÍVàùg莹Díé͐mˆ™!òW–:(Àоj9ýs!4ç0 +Ë1¯uÐ4:x¼Üqv…|š ørò}¡Ô^È-ë#Ü[5*d×LùN¡MJ[¨ýÍêZHAPžú€8cÏ e!°B +iëCG¹’±š/Î?«P®äÂf¶Ìv yÚÝU!'Ÿ<b¦ +* y +¥’–PŨ‚#æE8o[‘!ì¤P÷{i)F ÄôC£€°ñ@4ìà"D4 ÙM舴?°N1BÒ$tMº_B+*.„ó S@¯ !û,Œ«€‰·PTùƒÊ:Bp*&¤î +\»Ÿ@ÝR½R× ( õŠEëCÈFÈhomp:å'„„U¡å ‰gv¼èͼ'ÀBË=<Ž#øá€òr’¯~YHSO%a´V\÷AÓsA@æÑ«Vvó\«ì/£O0¯ÜϹ›'¸ïÆä…¿@Çéw×å†o­‡ää þĕ>â^i>põµŽQEñî†ú½Î°Di‡zTØ17³¸ðSzƖ}„³Ðtu(à£ZRA5sÀÇ _d1ÒPZÇ°8ý¨Hȉ“2A¢"NŒÐ&Pz— ÎOU‚B½ŸQ˜5 ¢ÆÈHÝhu>‚$þ|vž¦ç#rº$HiþëH,²µªúmtÿ…,ÅlßDh‚@ë»  +íÈöKyHV„M>á¡{ù\ªÁ…Zï tÁVm ®‘¼òž@’i ­óOññéKP¦NÜÁ燕R^Ê4ÖH»AA­ tqr¨Ÿh“äà,:ç5”:pʔåi¼òßlh•¸ìŸæNO½h6dáþŽTKL¾p,-%¢9~bϘ«¨ÿY«¤]Uûq©ç€ɆöH 7 3bf ¨õÊ<±~J‘Š½ 6S²ºí”Ó¤ÄÒã>´GɱA#…kρO>ÐY°BPK©pú °æñ)r6—£fë9 Ný (é9£Ä€²äi5ó‚8'%[b‚þOã×TÚÿTSdþg´ß„%Íöú½˜R.•¦Xå™øïL#_‘šøcv˜ãj„¤Ÿ9Qǧáó9À÷°0<þÚc?„˜øý©(µ£r#@.ŸÇf/4¥üò'×?·ÆaRlègë'€ßÓ'u¡øal²S¸»:q¥iðh^PוcñkÔ ’ä4«Ÿ,ÃŽÞáGؒ˜• `B£ŒÅkD1›K„$õ"†«)^I½·ø¿ê°¦y¶Öܤë™Ú—…B¹ì^ñÓÀGÅç\öáÖ+ƒÞ5œ~´9.Xv>z^û!·÷ÉÊq‰€ánev÷A‡ÛÕ}¬ŸÙhî#—l¥qŸ?n½}Ú»}Û'¨kÝC݌Ýøpœ˜¹Ø«p«‡Î¡íg   +é|FW”‰ìö#´™NS7õ¡#<ó©O¯æþU”çÕïÄà.ˆý€e^>ò1bEÿeuè#úÄ01m¼'%çŸO¶¬|˜zÏBWCÛSÄÎg^hªËùèðÍÇYñçíý7¦ÿŸ?¸_]M±O’ü&™RóÄÞÈ' äÓ£~²Ð0 í{÷±Í–=£õмðÁìØӎÍy²Šcå¡:“?`Š,0®ìz˜½az`öÖC|ƒç`ôg5ëQ&å£7ܔWKwÑëqˆõ k–ŒTÓW¶oýCw„I"q«P¬l‡½üª'J™ê™Ÿp%pÿ¦õÁ¦ª£Ch‚£¸/{mm“Þÿ!æ”7˜‚­CS@Pû&N çH¬fá å`ù‹(·P@܇ÅAktrëNnò~·½†xÛBRMbk£‚ËÀ2êq§üÊ!DD„« W…þz~WDš¦ÑÉ$<ŒÓTB‚è<Š·¥ÏΐG@,¨8$DŽ‘ˆB÷W-ö)j0Ïåá‰E·M0º‡­¸EB‚þ)îuºl^†aŒëòÎsyxëý/³xrÀ Úþb© +Ôäaó"{ÔûÆ +¤{6 ¾8b<ÎÙ[Ho.HX÷Ëé/ì ¤˜}}[yºk@€¹À¿¹«QĞĄ7†¹²u!äUõ¤$³g‹qÄKèðÝÒ&°rÅì?”S?)CÍeÑÀmšW1⽨ÁF'—뇉+ӂÃ¥é//è"…l®y‹Õ‰SÀJóùd!V)q +‘“ÁM~pBt¹Î¿”ÇOͺì褍z™"™:S +®+@ +Ãâö3#ºK€!(y ¼ñ`,ìXȌ½¡Œ °qt•Í£Ë5¯ºÛÔ&Qij£=ìO¥Ãýµ)ØÊ·¬E˜¯yÌP±…¸Ç Ø5Ü5^"Ã0’M­\ñÖ|²y„ÖÚGPYX…‘ +K›ý]šÇ=Hûs—e¡é».P®xûv÷…a†ê¤Ø¥ØD‘»Îwc^[‘`$‡ .r¸(gúmÞÌ)_fP/I)Ë!´ ÒåFºËжéÛH¢ÃßQòçÁY‚ Ù®ˆVÕ£¨4øq˜¢.õ‘=£B+Bâ¢{äÑÁ +³Un€.ˆNÒÎíp2äò +ç.¢w‚‰C.ž jR$.µ*Qat„-#)ÛÞ En»ÒÁ y"MÌ5MGóR³É+’Cå‰ÔÖ?b 'üð!®q¡.$ ‹Øñqò j)„“E!šGÊD‘#Ú<Ãp?Œ^#(r'GBó|sM×ÈèD1”T q éÜJ‘CPÄi¸X1X°MpN·èéþDž…`È˜ ù…à +ö›ˆ6³ —…]{êÑä/W"ì©AêLàÐñžöäÐ]ñ×k‰Àb¹ŸJ²ž‡ð©EÂçOKÜ 3ÀýõJ6o+VÆ~öƒCøþ™HäƧ~ˆ©4_߆øÅ6QSˆŸ¦çª‡Lm† ëŠ6Äë¢ @DôzfEJÄöŽ®A„x‰xÀƒä ƒ í–Û´ùíま§å¹.=­†½°0ÕÈƎ­&,^TŒ‹\‚È=§Ã¢¬rq²#\tüк<Û_³›Š ôãudDw¦½ì™—(ŒA)YEå=Žª^LŠå?N÷ÕD Qüçf ð»ÑM­¸f7r¸ ,©³Ü…ƒkÈ­¢]ïµT%./ÕÓËSØD À3¯’*Œ‹Q£N¸Ä~ýH [^hIrqðPGî"ѹqÝýØî×ù®2—[ëOÀSÁm€EæƒÕ MòéÓ?Ôgl¶ë>u~A{ÏÓÞ°Ò¼Œñ`UX)dè¬1%ðS±ˆLöÚzFË?Ef¡…Ùø¡?NøÖ&älÀg(ï?ýç.££~Êpñ¿y¬XB<æá, N…ƒCöœ ’“i8D+ÖQ%~Æßá²A,ö¹JnË0êQä&ýLéqVcÀ,H*xë¦}nò–´Ø»Ê£qŒ-Z)yfs-@([$†9íøJP1qà:×OnqRÏEP]—o݄M¨>>…•'‹Ž*aP“UIñêc3XŽnO@ÔPïŒËÉg7(äVij4qÅÊ=¦•ÎÌé&€2“'2Ö(oÖb«Y‰%¡Ž· :HƧˆòãÊð"MmÂßВÉBHwè>ŠX8Ɓ÷ÍÔà[WùüôF°õ҅uŸ™W“¯“¹MrÚ&à¬)B|]Ò'oõ‰©*vžSÞj`dçØ»áR|','`Ë3ƒÛ1y,/­!Î4Ç&î´¼B|f§õPñpûêHNû1ÃA?=›|5°ò+˜ÚtžàÉ&µê¥îÿÙ~ËS!{©ysÂåõw£¤ý¥°OXówj4uºø¨€X rmR¢ ÂTkyp3a5!ù‰a]„a†Ã㬅.oޜݺ +•Ì51¬ß¹…€TÑ½È 'i*4Ï齈7Ó­4•^ºÇÎ¥{6ó€ Wt,°!ñ«Ì¶Ë!¾ÉÍ­Å' qdàSaaèд4(²CÍ?wúÕ’žp +ÆnRÿã7Yü ƒr­}”§BB¥t•Øµô2< µ–SS9éÚV¹Ù¶ý —R\ÁýÓ\1K +oY9­f.”ÓA—•{DÿkÆ ±^¨'NÌ醃û¶ñ%Én°eå6Éñ¸´¶éÙð™—ºIaèH¸úòtñò4}ÂÙK(!׈È´æÂTÉS’9“Ø @”ƒ¦›ÉˆÇ–) GÞ :"KºÖƼ˜è>1E¬hԇy-Ì Q'â¨<ˆ*ïÌÅG‚²I²“À±búUN_ÏrÒÈ=‚…ÉÓä–S gLÝZœ|É«xi‹%o®O!JÁøåû#ÔÏíåœ|Ïb1ù—9ÐG™¶È5 48@R}µèZ(½—g:,`V›¾3Þ5s9ÈžŠ›éè&Î/‚_Â2ïpR‘­+"ðG”Cޞ—6'žB£ƒÈÃüV3~\)¦³OÌVL¸W]PXê¥DchŸñÑ'!É®”¡ãɅ<SÓFññšŸAîå‚ :½†)¦L5q,v +©Êô½¼_vÞ›2Œ`6_øäÙM /Qž6îÁK®\¨Ýè£1ѕ:?¤R6üÕÞ2¿¼Ã¤×°½AÒ»I²Çþ†s r|My¨¡Æ…\¢E ’Á'€]".P/ÂLÌE4‰XÍEë±k¸<@hºñi%ø‰m™pÎa'B²‹‘ì%8×MÐó.B2-èú#9i«ò`*‚Épé‘×MçÇø-Y4֜QÏ(\Øó¡þÚS¨…ág85â!îˆ÷Ñ-Z¸}ׇÜÎ.´K\‹Ç⠄6M*ë wo…6@¢’»Hšr0]yçÌáqOûAŸ‡Ð\žÇs-¯·õS1'lŽ¡–熘7Oèx˜~~êo=›ø\Ò_dL§ é±Y›Ë[IõÑmQŃàá†l½ˆðZQ˃>“ë|`ÜT^yxÇ©¢‘7ðô Úbðämà¨+´¹AqG ßãppHÇ\†ûÕ×p©ŒU_6 €ÝÐMÂxîn‘‚^Eݍ`ücŒ‡ë_’´Î\ú(„-8‘’fLùÆ'Yš’b” pKa!" c]N£wòÀ¥Ò:ò/]´,‰rþãQžD„õ ‰õ“Ú¼2Vdq¹·í­¤Â"â¢<Ê»¡t†dúeñÃWd¹î,+ÝÕA Ïqâ$Uˆ(F>oLŒE»’­bç¬ÁÀšî|Lá ¦Å°ˆç’¼§%¥‡ö¤>ÿ4ȤØ՝€OyãŸ]]9Eti÷)¿²L{¶ö_Š¥/–âÑw.ÌìôÁ„ï9ʼn Å×*@ɬßɾx*°ÀÕ¼ýý‰®’ïß餩8ÑSZ%)âôÃ*#@9”-r/åƒ]G#oUU%( Âw°Whb…³²â⁦ilv ýLFè§7lPR!ÒÜ$©_-<…U¾!k2ÐO%ØTÀËÕ¼vpòºó ôÌè5 ÊÅמhA+Aäw¨“(òJpÜ7á/åéOaïÍÃjd,w@`¨}±âÌ ¶Jȅûå>ÐaaäùE‡ûC{)aØâ¼·îûâ§ÿOê—n“}B¦òÄRõŋÞ~‘1"ídE&ýM¸_v®C9¥Ä¾™ªKçÍQÒ1à K 65·Íf¹"Îë!¶ÐGïAÃöº Aü íÓ]iT “´¯ H߉— Ԑî’©´¦!{ë#¡Âo)5£ùŠ}}™ú&4 ×äÏ¥PÓ?(µ)…È +莣è–èÔZЩñ´¥âZ©·ë`„@müPïïùcáx.HÇèÑ/ÓîÀwùo5©ŸMŽ-ƒ±HŸ# _´Íi1¯?pœãÛß? r:41Ô8À!qâ÷%¥Í«;¦x„%Q+Œå‰ýšµÿë$$dŽØ ®0½a»¸¥^ÊkÝ@ۛ]B„Ÿñ¾aۊTr{e`†Um`ÿùøB„*Zouî©$%Ž8 xS¥Û·!PUpƒ@î<¹‹\{Ãâ„üéaé§ÀV‹ßG¾Ð‚ªÌÿ?³›¼_‚íd—B§ ‹c°¸ âì@Xî’ÖS}J²£®äD4…'©Û©ò( i¥&Œó‰%gî®DEùëiÈ2i?“îcœNŸ GìzQz†æCy¨ìÊ>Þ³Õ‹WŽÆœ6šµÑßì®ëÆ&]ÞÞ§¥ò”‡´7ŸÏ‡^]-w9ÀGšné1Gx}—…O(CàÅàUÁµ”ž3álŸô4ŸÝ’ÏîG5“^˜>¹?†Üʼ=ñ*:Š÷c¨²ÍáG™F×[júË2\ùÌ*)µÝے²+‚îYô4¿Ã‚+£z¡áÉR­BÈèu遧àúŒe‹1àÒRóA³”ú»œÞ#;)·ÛϽ 0¡ÂQ(×Q'H㢸ôY=#Ò³iRëi#­€Z{XØlž6<‚‘Ú*ëöŒ.õ5ƒ³žm_0B«Š³E=…»@vY$n J¬ô½|ô–ݱ¿»BvèVCVšÖ‚PÞ£5M\x24hwµ ½ß`¾N—Ý›ÚGþtÃgäß=oY»Òœ,<çÍ!¬‡8Ï3Ã8‚§?úÂ4€Ì"ˆ¤»… ûÈDΌi8ÚóÌo# 'crAV¶bÜÖ+*qëH+$9cYøܓ†ª7Â{ù§› §@7§×Ü@I×%Ž[âŽ7mw›pæ—5M×1oÏKHf•Ç«Ð_Ä<èO•¨=4üw²×·ùJ¨Û ˜Ý™^.1¯ZT妨lÐ_ŸÚÃô‚üplS£M–N„X Ð,¤~;{x… +Ô«@{ÉCŽ?²qR Oô(t´!ÕL‚ÇW‘ö VnR]Õ§šOçEŸç&'‘Zð!ÿ0¨ÚGà:½¬$J "N$ã-ÜUÌ =áy– +Gæ?•TòTz£·QÁ­‹Ö¡u×æªôi_%áãR`WôU—ãgÉgTûYüò/7†â½Q8€£–Ø(ü¦š)ºž} %8ŠÚºåÿþ%1„`éßúÁ‘c̈́Êÿ•aѓ±‚ÞÄfàš×¤÷Á/™•*ÍäË]¤%Ÿq¶D‡£¢`ƒ=,›¿:B‹·Â?ôΰœýS¥ö¿·a"ïò§ãHàÉD•5>UUÈ@(ÚÏÕcrǸ‡I,­íó‰é„:"åûížgùÐçÐzhcÝBˆ»ú¶~§yêzki¹ð±mXo¡ö ðB]¢gªBw&ɚ 瘢Säo¢I©<ßÛ1iˆè¸]>z›D<'›z،e2̤ÑW"©Ð¡ó ±’[œ/“í/öh—iÕq ípœƒø‰è=êEÌœäY>wn«aB2w¨i±–{_8;›%0â¸ÞZ¤ýìY¤ÖØòŠ Ӂ[‹úÁŠÓ;/ԉQ$äåîחs7ï­Â//õ²¨Ògÿêoá—)˜@ ºø$Iªã}”è ø.Ih—ýg¬é娦»É¯«U±øÿÜ.'Î\±ä]@ç £lwéhöÕüvpzV÷”¥K´*­‡·`éЩ•f‡¢ yÛñrx`KïhéBÓ® ӜŽš¬D“×S§Zq7˜g ›gîŽÉ5²€ÌŠ© ?ñ¶\qæþiɒ‚ÅÃq‰=u×Ã_1qâK ð ,EÏ¢ÞÊÚ&ªÅžþ“ O° ´í:Úg¸BÇë×9ÃÉ^ ¨7´€A¼Á0ós¦¸âM[y[ô ã‚~‚«¹rB´ V…‚Ù²ÔJ=6ùÌÍæ¡ÄYxðFP²ixš:+sèu]½P©ÜÞ`ä—ÕÛ¢G#Íñ0±szˆë£ v…¦ïMP£ðWÔb‹Š­‹&Ù9•ÖP-ZX/z”y²-êöA +ïÐáhÉMKa^ñøIü‡˜ J<“û¦—b…έ<2¨g\¹a;ú-O˜„”±~°iÓ"éݔHƒ´èü¿ O *4óJP1&:<®<|…ÉøáöLö¤q ¤q®"¬zâ&g¹í¡ñѓ5~FHd™8Of+˜{é ‚ËË"I15³é—ùÑWž|w©7ñÄ!—`eN Š–y²Ò²ã® ™k “Šj Û“Ψ·S™îÑi0‚'ÑEó4”/—®çˆíš#ö³$˜ÐCF$S¦ÑÚh¤!†ºæ4zBDR¯#’D  +Ëí)ü|Kæ0ȉ >°ìYEžY-{´€4D\?ÜÝJªÈ¬à$¹ÑA(]”gØÂA¢§ e7f1n%¸Dùî΀€â5tçÔ?úxó)Úƨªèì¨ûú­—)š »¸d,Ä\0Y1@|ݗ+MGÒHiE¦Vð×äÒ/£GÀáp1 `ŠŒ4·eLl¥áB4.pòáí¤Iq^§Kþ({덈>l}͇¯q+pÐ%„€ë›¢‹²èÆޛ°èUè€!ÔÓØè  +uûF0v‘‚èvä¶úV_ÓõŚ£jqÃoǧl¾Þœº›uL(MZPå¬4«û&â¦ëÑDv¤³Â®;SŠG;¼^eOö¬—ap°MRHw؟ðcÁµp¨mX.Q3Xãîz*>òi_E.ìtÐT\COé$9dôÖ_>üÿ(Ò¯Ê\hí­”ƒeŒ›KFžKHvƒ‹äÃ:¦únïG´D±l…htBZ1§JŸj¡¤€eýßZ"Ð@b‡ãš[•±^f=Ëhüjþ1a"y1ŽÂFL˜(![®¯ˆe4G%¡õùȱ}EÚ ½v‹Ÿ#‘†{žl†™‡PÔh‘Œ(Ëá¤]0£ÅyˆgŸÜLukM7N»—Ê}_¿’k Êå§o¿S`ŸÛúè¬a ò‘aÙmØàr:cmƒG9‘—àQ7n‘­0A–ƒÐi([¼Eȅ +ŠÕ«A“²ÉÈÒ!.º¡cª·èu–·ª¸¹¹”Y¿â*ÜB@ ˆZU¼¨u ºfΣïEº™7I”cØ{„úŠc“ƒM— -ë_jw)PÇÞyҘæš<Œj,ÙV뎲ÎàpO.¨@ÚyéUY½UT ÎéÚk8˜.Ç为p_-gÏT¹6+©a–t—¯·™Üb "ˆü è$ó(JõuÛ&|ÄÒ¤µh2¿RŒúYBm¾;ßMóG½ Y½Š)úCÕM,}²‹å£üÏö®ÚØs–2"gãóØסj?Àˆs%#8æÉHóº‹Ôá\f -;}m.åqÅ°ÖPâaþÄ@f6¢…k&ß'’lŽïB- Ñ9Œi¹_EŒÃ§0aün˜‡š¼þœä°iU%ªÈ½àÏ õٙXÌïJ ö+qw@dq3©j•Õƒr)¼6,º{=¤¸â_ Bßc8Æ<ö0G"§ƒ×‹Íe%Z`9;>]ZùC:FJš×ô÷PÇ©qª''iqÔ h<®zd楝ª ‘÷ð/¬ØTÉ:³Ûç <_d.!pФKŸ,Éõ³0Ñ(<ÊVc´ª“Š4@æěZLÒފ°m^rœ°Ó-+JÓ_GϹضöÖÚ0.r)²¶Ž¢öbS-,‡Üڟ · (pz˜ÄWú4’@}¥¢þ¢ÈpO†:ë›NGè¦g2"œ¸¦,> j5!>Tó/Ò±Ô±à +D@lÇ` F»S•@NƒPB( „ôÇÑ«×íw ©¥ù@rY¥Nc5ªš#;J_`&hƒ·z•jWRV=i Ä*:¹eªG›G^.h³ÓfðV‘@ÓΜA…FjäU$¥%+ ™·c,®À)ÿ6[1Ã%*üô¶®µœ¸pq»­‹Tê¦Pzec¤=‚ÿªÇ!9ÖKoâmx¹qÄñרMfçFî¸êAøP’ˆÜÂ,1€ŠyÝl/}ì4€«–÷ï4G0¨½…4¢› ´%äZ¼óš¬qéˆhgíE”¯77µvl0$®õ’w XåÐ¥¨ë̇ ±¸2¬‰Þ,þ‡°ÞXöËQ %ƒÀÒ×&uÕni7~òåƒtÑ«~"øô†…Ÿ[¥ClؔãgïBù†Í8ÎÁæÄ¥τ±¼{,ò6õ]\4h0ô,Åq}ÀZ;ùY®ÐÆ=øVÚa2¬ +Ѭ¸j5N¡Ý÷<[ŸœU +va°a°Åú]ayi1T¶«,¥)iÝ·™{ ‚»ùyÊ¡†XÎ4q3PŸ ×À’ phcÇCøŸ +|PásAFΠÇÂÉz¯üO¤|œHëÌ«í21Åï—œz¶V|w.e5VЛU”ZÊ¥ z‚zC,¨¡íCD‘o è*}*'´M.FÆ#Ã<#PwQ©þ¦‘":±Î³ð©(FGx\µnÓ^æ®Z )±R݌³½¥íș â‡@üÈY‚•6HCí¢Ò"< øÀé”ÐÜ?XLo‚} ‚º‘¢ô”ž|ÍAYøŒ¢a-° 4^Âä…©3X¸$º±‚<7„í0À__GWðí€^h‘ŸJP'¥aIÿi)/ñcÕÐP²€Ë¬ÀÂ`¹$ôÓá‰ÇX lºöP5=Iÿóœ” BLíÁ:Äs ÷X\óvIk‚:Ò‚FÌPéf˜ÙHa܁TI^ð ²çüÏÛɁ

za?ߥ_Wþ^á6^€.ñ¾&ʵQlùwÒá5Ãï’míǙMécÃÞ¤-è©÷JL˜‘ƒz†Çs̳AΕl˜Ÿ4èAµXÊ|ȁ‹ùu´DòÓ¥êýa¯˜Pï …ÛTÑxüЅŒ–÷0Sàñ?-þ÷W”ƒœF!¡ I2T#ØNâ<…U»Š Ž7´gifcgóÎòlngt&¿a'(#ìÌÌìÎÒggggìΊ¬|h…fq6æLæ8;óٟhx ÙÏìÌÁ,À³;´{¢!ÙԈMs=Jˆ??æ‚8Ù2cŒS½#ú8„©H)k‰— 7›%ÍfC33›yÄ((.}‘ ""‘JeRþy ÞÌ՝à/F/3uàZ­j³R­[iuåQ—7,ÇYÈ e½™yàmúÔG3ûF®›gÏ`W…Ç<4´wvFgg÷ü@AÂhó\°%~>¥²P.S5¶yÍgf+›ŒÞeß÷N[¾„­Ìf¿šÛþìVy·¨ÍV¢l4+[^äN˜8ÙÙð~ºñÐî9lc³uÏЖxû›à7µ Ë3;oÀ†g›GÞ§H%7 Cª×ˆlŒJFc †DDDD§13Y­ò£ÄŇø=cð2ì–1}˜ðŒˆÊ<ß)ЯÁ:»:™á•ÙÍ ód9v¬šÙ7³#VËÄ̬Êj63ký‡·`ffffe†f6˜Á£„ p¨DÝ6‚"C0€0ˆDbAáYªì> L4±TÐ@“IC´4Óß^ŠOÉä<$ü¤ê–™¤ +Â$¡ˆ]¦r0él™|Φ¼Á ˆÝ0yÿšw Tš’~®LÜÏ0Pº…dø±P^¨¬ànšbB.â‘iˆ*˜9JL þ"ÏÝ_¨x°¤–ŒU)‚mÃ™ó–ÉÁ·ZN¤Ò÷xp‘듳2kßQ»0!¬|KÔÀ]#áÂÄ • +ünQƒë÷NõË$ñH¶»cŦÆÓ´ebãÈ1?I•¦‡§E¯:ý0-Ñ1£Ó7šRàu°Ì‡ácp®Á¨ Ÿ“)Y +„ÇdLÖð–S w ºåDÇŒRù¿TxǤºþ’£íðµ’F©-¾xéÄֆ‡Ï“|ED§9G%߬”¨Ä#wIeÀ.paI, ±#Ió¤¸D%Ìu +5b@H«9 ØÀðU (›#«Ju,YU0S%‰,4S\£J„4éIt‹žJÆ>dW2õ¹zìTk*y„Ÿ­xK%iEž m”Ó-Õúx¤du ‘ÊÓç”:yðÍþpwªH?™]J‚„Wˆ8ã{)ё‰ÓÓ`¥´n>L§”<*ÓÃm!%'ã©~ %¿IÜ‰¤$‰©Àfø;J 1Ân”°&0*––³h¬Q՞GŒXÃðçb.„”ÿ~§•S‚ðJÀ('MŠâ›L•üŽV{ĝTl>“Lc1¡™£l g‘–ФŸƒDM’Â$"šnç;Ê3I‰?²}éàûšÁK$7ɝ¦Üä“Öç=i/ç×N©±|” ‰ì ¾žÆ“\™Öm“v70i7:|“~‰Œh2R·,£ipI@A×$'KÚ¹ߓ}`ØX> J¸Õj$Bd+CwLZ'FI§hªÃ¤ÙÀ^ã[¹{ª'II¦< ATÓÂߒ.ZEúöÚ¬%©u¹qfI˘ôìâHڋ© ,ê)Æ\%y_H§Hµ™ÝÐ/}4'óùpl‚j¤©KªVÆ#Ys$×Ԑ !%•H›ˆR>HÀoäw€*%uÔTÓQE¤Îi¼3`»rjõ¡Äé= 1Wq¥ùHI!”·¤=öV.RjŒÆ}£/TÑÿÈ :³<"ËæÊûѵ&þûpåêS\]ûH╠qàTt}Dd%¨|gú(iŸ´¤.©”§ Â]DCd¤ƒA´RnXØDìDÅõ¨Ð(œ©Å;ñÐdz„¡Ê—Ñ#‘}¢ÑóÈÛ*ø {Zç^lÁiÁ;Cã±O¸‚ªÓñ'Ç>(ÅuvdéZç1e`쨬µœdÏþ:Ú,áÖQ-*Œ”ˆ^ûÀVòŨ¡£öâºæsDÿY±x#)ŽH¹Câkù¾øÜ¥kA³Oß±`¢õÌÑ?Ý!O—£¥n´ïï>âÛh€|\¡ù#‚ŠhãHÒ«rµÿ–Xëíþs¯FÆe™uc•`ÝèS€Ö§t„@©FTàÚȼˆ)môb`ÏF#¿l¤w²±ÑÞ¨1PUÌ°‘lÈVŒÂߣHi•/܊ұ]#9<ög¥øª¶ûÓsFaĆÓÓ2›éû•3’T@ÖõO£m‘µŠ+%"”@5Pà…éÀŠd{`¡7€á³[Ljèò"¶§t'èeÓ,}xYbD6Õ!ÛâEäö¸ºYÝÖXŵã°:bË+…Rœr§Òtp%]§ß¯¢%¶wxuœ822ºŠÞGa ™‡ ÀÅ%"ƒîètˆÌ?cH'Öň?ʉbI+FTû6`ö)Hċš $jëüX²Ä¤HAƒ–@QCSŠ²º–nRX•Á¡Dn>F×ä`d¥ŠÛ[Ž¥Ã'ºGHÀhæJTþÙ2ÿ3ÕíÝÁOÄGÏþÝiŒŸá|Q²E/x¸a=Ø[øÌ¿“í:¡ÎE“áî§SÓ^Qm̧`ÑÑU9Ķ¨8iºl‘× }P½ÐVÔún³9F]1O9çÓ4¡¦¨/Š!ÕÓĐ-UÕ C´9³NjÈe‘µŸJݠɢ4—(.ó2ˆ ;ù ≢ÆIè!Ò¨À¢ú„pE¹ªø4O,¾“o…$_螁"“2’â>Ü »"wçßJ'K¨÷[‘Š¤ÁËÝ'Qµ© ÒÀ'Y̔Ax©h €"Kÿ`XzÐl°LšXOŒOѲÖÕ@\Š >Íd´t"†g~þQ‘;FéAÈ&ÄEÎcXA®IFì6zÄI×:P4ˆFcq×'*Ï·%*2ç‰zgRõ¡3¡Ӂµ»$#LÚÛV䌢DòÛ¤‚êû  ǹ;òÖñ}àÔ¯;©±>TÊ“%2 ó]±ڛ° Ø´4ómR−8Q¾öT”ˆM'è#s9IÔßàAӑÞ +ƒŒ±¶ T‘D`J ²òUPïP!Dk™D ˆ2£èqHz¾9úP)AéÑûÃ^31þ›¹¥ÆdðÏ9É+³éHEíCåjDÞz'DFNèÈBô9q›ZŠˆÅäXjÂÐ_¦r抨£Ð–áGɒ‘þ˜´NDþ”‹W"Ú¨!|O(#"Ãì=ï¬@LB^°Hœ¯*Ü…Mó -ω + 9â!g‡‚ˆhwᣈ¢ âÑׇðŒP½:JŠ€Å‹ @ +²I<ÁÄç$¿ˆ9ÂÏâÖؐΟ!‚°Ð`_Òáb–ƒ†±¾³îªÚ2†ÕwÁ£Ê÷ä°È•$¹šÝ¯¶… r©v xÍkÈtþ-elņäa°yúÈ4 ÉþL‘”¨5„Á„>|ÙÞÉÔWC䇘ƒ²Ø¾0ür‚q`¾"Ýd^>L3£MkÅx-Ø}%ÏiÔ¬PŒ¼°¾HÅW!=Y‹úRP®*$—¢'s«.ª=ÉìI¨JøM=Q…J<dSسç„lG° `ëÐ?’ƒÍk‚l ¢WÐ «P>º& ¯/B…](œ·T¨C<&BçU‰†äûÖëçgGed7 SB%àǎl@7Ðòº„ZôOAØC%sÜĈØã ÔX(èľ£ȓPœ­{㲟 Øý¼ ŽÊÐ¥ŒÐ_ŽÊrÊ@MáJDV„”[2@ëw).Þ$·P¹'% -Ú'Ðlõ/7E‡ýÞ{êôÍ®¥G}?‡’8ύQµŸÉú9ñsÞKÚKxè>×yd4‘QՑŒñÿ¹gúÁ = äeBç·Lb?¦Õ Q1î©9vpEegl˜³S ݓTƒ¶ lDð ›]†‰ÒücQíø”ýÇfn“Ë g6¤"{é9îäžuÊÅh_áǂÌ'Å ç6 ywî®>U;*ãxÈ0Þ©°wR/O—çrÇ£o ¬¤"A™Œå?Em)J‘"PüF ”B)ÈROú™ˆÂ©Y"ðmɧǛü„¤V‚ʹσ–C1#dA{œF7½‘7µI|èüÜ`•¿@þÂBÐhɎªšÿq6@fS]ù€Þˆ¡ÜωvT5Š +DDߜý‘8lЏ…×íˆ&± ´3×9RÂg8*‚»>ñÛÖ1]qhR0 ęö: ›Íúði'8Þ(Ðrˏ ø ”ÌP\‡ i H? >ÛµäÉ,•Â¸Gocì†@’ ­”-tøô¨\x¤Õ§È«õ9 åcö4Ê â]¬‹©¢(@¢¦ã È4BÊÓ>+ ½9P­ ;6ú †IdU¥ÿ·#Ð*Bç?‘VP&@d”•Øúy[È=€, Áiƒ—•c%‡BA4þÉ2C@%è¤ÿgÕ«ÿãH÷¢¨«®ÙOIù—úÏÑç? Šß 4Á~"èÏÜá³ý3ØÒü‘5Ó?C‰öü³Oáp–HD9þ!—N;üþì­î¨âþû£¹Léîá¹QÙ3©3›ùÁ‹ü|¼˜žûhP8óÜ~-­ùfb È­)‡Ž=š•¬pV-·Æ0ë^;4/ËxÖKïÑJvƘð3QCý,ý3ô³Åþù¡‰áû°’Ub騠9¤æ ÅÆτüV…wõ ‘ +CÃGqò ,¤ó·5RصUvñ™p´ú>¹ýÌ ±C)bSðó>ô¤àî³ï0°Ô}2¬mòŽ Î}tƒ ¾…$bߕ +¸k{\ûø§B0Ý%×5;ùžÁê_ďäÃV°Ê=¼/fÉò ûõ!:6þgŸ‚|€1O.܃£nüð¨äXàašÔsÉ´¨Òʸ^Ë*Ž¾’ˆ½ÞÚ©,>ðó‡í‘† +‚WŠ@éð!Ðÿx3:¼þš>*¶ç-ðÆ8>Hæ9rþNø-Áý÷y`%N}X„Q©Ae€h4ìqR¬ß 2¡ÇôG¶ùžO應È[LÉñ´ó!ú9Ÿñ¦„›kªùp,Òf>EҗÅ|È<Á'#FÅ &¨§w×]TPø&?¸ ¹äÃGgøÅ<ÀÜC>E›ž¢2ƒ+Ì"úÆƒŸýC2>yÄPÙÎa#ŸÜÂÇÉ°FÀ2„zÍD%_+Héˆ^4B¿O„X¿gDÌ#͈·tQïgj4Ž÷¬5 ÛW>—-0%-|2Œ¬{jý _†‘³H¸§gÒÞo[üv{F¼·~ۃö‹Ä¯qs„¦¢d{Ä¢Jô’7{œ¥¹ìÁŸÄ¾¾ä©žb¤|ìáOìÔCh:ÃÇ.ØÓWÒ¤’ÕÎÈÉõt–žaÑ\ëٍYjE<Î]GpÌw^yÌúY¨iq¯0?¤»×\~<½1ÀüÃÜOoT†'a¬¯ˆfÛ9H£×x˜ RÍt”\&Z†­(ùgŠÚ±¼#í@Öb¾˜u -ÅSwLÄMm܉£3];^‘ ³eßäÕqSÞûè90['Q/ s ë8Ùc¯Þ,dM¿?9¾î`IϞH³êÎ,§íì“yÆù­®$¾óó2â÷NÀBQ£ÔË#¸þJ•#¹£õÅçqÇ× ÎR¡¤Å-Èw˜½w!¹R{°`ƒy²µ‡Q$ґ°ÈŽyP~íÈr1:ËF՝DÔÓÎ4•HaåhgÔ>ag (Kr© ,O®‚¢¬Þì¼ëFT™E£Ï2.¢ /;u©@´²£$X¹K¥àd'¹Ë¹]d'ˆ”Ë'NðMâ7Ñ©¢ß&õt>¢Ë› ßý&á.°wÜ]¹iâg‹zVqžÀôèu˜â"Þ6‡-%XC?¦]«"Z—§ÄÖÕtñ£üM9ÏÁ†Âz”™ªN¯8£•a€}£ìCÊïl–~—çr²Ù!µÚ‰ ÔLòH«ˆü­x0ñ܄ªƒÎ%BÎæ >EBñ%iä…_ÿÃR–£èJkJÈ9QaY'qØ»Û{ ¿×xPtM>ÂJg§óHäiˆŽ{±ÿXe÷ŒÐj·TÇÖËλÉT¥Óû:æe* …[ 3uî†|©Æ¸àïvû è1ß1V8{CÆý + v#֎­wâã—lÞè¥pòœ?ÀÞiZÈÜ^ˆÛ“yqð0Œ‘b{¡¨´žþYw¥+ODÊY˜e¯ Ór{Mfü¢Í°ÎwO± Þdh/jà lŒá4Kô܃ò¼Ò-»ôHìô&ÒüHQCN8؋F{sjw#ëÐLÌÑËD­ßQ˜íÒC-ãÓÏ6Ø2´”xR +üAO²j¦Ò †°2k·&õ¬æ±2?6=$‡:ò7f@ùÔcDLuÿB ¥…>`Én&ƒ„sﺕ~ãˆ/c^µ°F‚ZùdÇÊú'ÇìÊž"æëyPðl†Œ Þ°ƒ.§Ž…BáÛBÞØá2³š|ÜPX؇‘oázp zŽ¬„Ýá…ü­XáªyZ2¤mA÷ a‡­cc®#²;ý´¯²¬[ é7\yäsd!A¶YŠ:0"Ï~î ù߈Éö³7è$‰u$«'ðŒ‹ýY[ÐF_p̗6/…Ý`º@üqò °.Šcì(}¥™ë¼…xÙu;8Ȓ\Ќxðëˆåw¡ mA½Ì:õ¡©Ôl$ž¦÷°-R´OꅐòÿއÙ¸$ =Ë;ʼnU®ìöT¤!s‹!_éõJ.´d†¦uŠ/(l×dµb¤mÖM• Q÷¬ ·Pý Q­óúÛ϶#±Þ!Hþs í>Üs0TŽ#Sµ»È…Â,ß"˜¥1H´Bâìúlb_èN"m…”SȂ Ñáö:äÊ8 }^^3‡4°Å#xÒ!žºêõw¦éç"®4ˆ*Ýóñ큇$—¤'(¾Cö˘"å9¢†„[³–À ²Û(:Cì३(XM¾z0ù£¼{NDK2‚Ϫ"ÞjÞTˆðŽ."£oLޘ¨‚•‡ðjp¡ÿæ3·±àà´áS® Ú$>»‰¾äT4j“¯ÉÑ-ëã,q¯Ù¢2h4ÕTÍTEÕ'ÿk¡lû̒~ÃxûJ¶œí~äRêçÞ³¬Êðßó4Ւ°¢¥©dÛÊÎ/Ü´J#ø¢a‡í“æ€3-HÈÑtÒ¬©ŠÔ¬þÀ´ÛN13I½ºè´ÄœÐm“¾ÈR¯FВš3X(r;;)å[/§ D4Ãw2`́nyÑɐ„EÛXf˜âÈÛøŸÖÁym’Î~¤]MŸÑ*ɨ‘|f)#„b»¹wT0Ãzdd¹{TòaQÆ|ù$;Ÿ[^Á¢fmdyh —áä–02=Ϛ’e¦`)ƜÄû<¶±2}¯wmê?f ø%ˆIÏg㓘>I…Òb;яŠ¼LWC*ap( +Á¶^Û·pXƘ2×NæUÉìVüî–Xøb”¹÷ôØñ¿a +ÙâªV x—Ø ‘ØgƒÚ0åæ“êKZ·¿™vۏÕi…«÷0惕Âú¯î +2Põ”žÛ6éç{@‘àˆø:¡÷@[Ĩb7Ù_ÖÅp£*Õ6Q_D•ŠÞä-bSVÅS>x_'‘ÿ+?9ïòéJv”‰åyŽ¿SS¾4ÅL‹ wb>X{ÝA$ˆ3‡¼ ºô¬zd©ïïazW…>™*Å&槀gÜ>\šè£Ò¶27\²]͑‰Ê¼ý…<ž¡üîØkµf½6Õ½Q´Þ!sŽ{WV>ې®<ð?lï½í’¦0ÿ)øQ“mkܹµ[ItÚ +)Ú +öÿ1iþèí ¥¤|½ññ³àÍ,§¾Òå³Êd|yÍ:û¼©š¶£1$nªÀÑÑ Òʆë?2heËÞ¸K±¡© ZÑ]HJD@¡Ie¾G Nw—ŸÀjÍ\£Ûjå€rJ[Â6OSKºѳÓɓâS«€,èã² ¡u› Y&ˆÅ ÖáMƒ::yåùÄ_Ÿ£Õ Ù!”`ÈEâT­ðÚ?vóà”'ŸÕ×C[q@]^³ÀÌ+i,á®^_ nØÌâǝáõŸDICÙOûhªCÑ1+šxÎV’óA|{ŒvX{ SÔ^ ,XR𸶽qe³7/c Í×%kª­¬¥ìâï^¢¨>Æ5Â[„c…ցßÑàaôŽd¢WM-INâcÐlŸ*ƒ>á7‚—Ú«î¨0XùF"º´¨Ó*Å®ä,ž ²]UٙÛ$¤›'p:Uü™n+² “…JDU’¬7:>¡˜W"zð`QUñœëΟÎ4”;¯FN$5 ´&3sãYØÈ"€*ÆS:E?Ào } +pfwv¤UÚЪa7e¤»2ã stµU5§¤V*´ @v=ýe5ŒÉ“ÈRüªò­€Š?ØÃWՈ«óùŒô`Uñl¢E +«ª›xËy «r;þù¢`æ_UôF*]žÜºVŽÇüóŒ7Y㸱0üä·P9:µÎZ@™ž–ÎÂu¯U@-(ìy‚—«§à nùæ¼µä̔h2úWߎÙ$ˆÚ„;Á^1¹Ê Ûw±V¢ž?…Œ;NjÍAÕ«1€M¤‡Ër%~2A——ërˆºÚÏ ¡²ÿ  UcxsD$©j…Uݼã?úcÕýö‘½V¾Õ "Èhò†ø*‚| ¾(ÕÂr—â×݈}l9é•ñô!d÷¤IÓo¶ •Ç’¬/)l(Eg]S˜PšÄzZ$¬q+a^Y?í·%º ÒBµ—TuÛ["çónÝ[•XöÔÞÌÑ(‹DÁ3ö]†}U¬s÷qÀ%0®ˆ«řMV¾s'(0,Î¥ [.f*)Ì¹ Vܞúj÷Ôø:l¡8Ëó16ðe¼ÆՓD|e§jÇ0ÔÂB§erU&NþL=í¤ÊJf½HêvîÄ¥òˆ—Mtµ«=jÛ&´|%ąú"ðþѺ:މØTæ/ÔJõ]“捿ÿ®Vڂÿ&ñ d0vÈjSU‘K…`£;ùž-œýk¶`Ùò:“ÿ¤Umáxz¦ +Jr4€d|ök|Nâš™k'[Iå~OµØ°ÑCDÕQÓè2Շ—@#EöúÌjÊ/{Vf"f°¢X¥5’ŠýçĮۼù”YyҊ©n¶y(„DŒ‡Ä—‡rX†W`Éž ®ç«‰}8,'+m•T}D„(Æü­¤0»™j Éø–ÓBoTSKá6^»/`§dilæ2ÕH‚'ҏxM0•U.X»8êðNQ„05´–,»vr@­Ø6¬Árî…$+­pI°Ü:@kР9Óv òcÞ +%*X½ +æxWÉlNtĵCåÿ/²¡ãU°ì?øˆWª"_áb9qcˆ–CJñògÙ³ÛÁxŠØ̘§>ÄݤP½R2äl*án#o–[Ô½‚Ï҆/œt#ê½~g67HÁ¹:uß©Vj#× ‚@ñ ʨÀ€q˓¢•òê5ÉèM–Ýûp%Á™n g‰«Ìf5´˜§EЄ8?Ý8îbQ| ’FB¡J®Ä¯q‡?N7ÒýWõ«\TN0¾ÜÌÚz¶Ώ‰zÞÑ·7Í@×웠DæÁ°+¬à-1¸OðŽ­óI²døžâÓC• +X+Õ=†j‡TEè:ÉÃI`šuœ#:— J<ޙOŒD)&eÔvjiŒs…-CÂUÛ>z¦g Îq¹Z?X`l‡ÛÊ +á,œÇø'%i’¼ŠrÜG °ê‘,¡‘\$û­¸0ÿDø̆æüˆîHªÎ†2UÖ$%;˲0ºÜSìÐe¬ÍT€a™è¶{bŒ:]•Ì + •nþ½6 ›ÏšI½Szïhs€m$Ï¡'óJ©`øTî: YUmô MmßÐÄ,y›zË{'L^¿Ù%ë• W© €Ñ|ýSðÇI«õ ]LúÝVԆOfH~41š`Ė%ÆÌÊê.3w MÒ¨•ºöojž|ãhÍÁ÷åŠYæ,á,f“3ÈÎ{ï6ù1°BQ3.J4Å.íÛh,üK_à£/â-òÙ ʅØÖ,BG’o\Èe\MЩÐt9˜´qpæ¯3&‰³l:+`]¤m“ÄüÊÏí§`¨'9Ø,Ê袷WÅüƒ¸¯‡AŠŠPÃü ñòIôC<,Ðÿk99—N¯™jq©¯`0r*àcé-B=X_PéÞyÇQ¯pòú_¼¼UþU–W"¼Ë}< ‡*Ò°_Œ±xÄgû"ý–†›Ó뤷qbÐ3fÊK\҆áÌxÖ¥…B"˜^H(KR€Å]‹E™•‹Yº +Kcs•zÌl4W¹#¨«Èð®”V¦&Gрp¸^LžÅ'7‰’«RBàõEÊ0{5EŽ¤Ò–«@ï" +&.LKx¨s«K /èƒÛû}ŠŠd"ϨÖÐô!SÓü:Ÿ¦ùY®2éÈ_O݂\µMÝÊð~ý\ç½Ä%C…À°ùq%<›gX"&VâO{ÉPX$5µÓ&wE°ì=×Å@¡ ˆÀ0ƝÓA¹PLmü ýÔÏä©q£VS]žI]¥oJn™ÌIÉ €²Þ*Ad‚¤ ÖC„aÇ-­ ÜàZ։ñPB‹¨M„`kž˜¬nM°¡yãØä`à,ðP7ïÁ ´M[I(PÒÚð˜ù(,AfÍ÷Câ”̏Á?2( 4\P f8Š}(—F²Y”¦g (»-ÀT)(çKȃ¢RÈ<(i-UAA1hà8âA™ <îªå8[ ‹˜?û˜M(W V\/,kFÿ7B˓ƒÒD¾à“* Ƀi)^œ§âò³<ø‚œ/Ç · «û"1À ´ìàz­ÜÊ*u•üb–-*umxãàþ`4!fü.Ōí±(#pAÆ$™À–/’<,¯rì[9 ×B{€C„Cˆý¹JÓ½cµð× •kS§øÍÆ­PÑi…PZ ÜW¸Ü\v%Ô0)Ô9åÓÈõ24PüõÁƒ‘ŒI|Oê~d@OÆ9V +á‘üt­*H$ZlÜ%«ì®gç +8L`ðP‘p,…Ÿ˜²Â=kMÆÃ-L„£»®á´Xê5s;±k Ÿ$c‚ZhœåzÓUr½¤°—½ ºÊðìsPøLB µªÖ8[!¡Ó›ÄaûúèE©Œ¶€õ Þ×À¡¸štURâ÷”LnµÍzHÅ.UðP;8†÷ôÎUø§‰t…ñžÕŇ6¥ÙE¦ÔÜ®ª¸dwy¤Û*R­ÂÄ8ö¼q¢”O5Ԗ'€ü}ˆ<¬2{‡ÈK)¬ìä}&‘RZ]Öoòa!G +¥huž–5À¢ªã¥ô9ïÌ °‘Ø‘-ÆBñÆÞÕíÂÐm³þàÙN+*O\2üGš¾yÑ]£^oiZÞ¬¤«\5mñÄNHàtô@¼24¾ Gá»\€òQ=SÂYsCxDÚh,&Ԁ¾ÞrXÅÍãïÂ×v”ÆØë ooüâ”E›nøÉß5ÒU†l#ET &ñµ îœ †}öR¼ü‚07ȹé#=YÌ!®Ëá]ҌMÒ±²Rm‹‚ÜLÎÔЉãàÒÒÖ jœ…åüÈ6ä…a2‡Ê £{Ž:,·ÁÅ®ø¦bÜè -@¡) ý~^RƒÀ ÄÛ­[ˆÏՍæ3©%@«ƒjý ¥Ï8²Ìˆ +GëQåIeÊ®ê +V`àë*¬Dl_ÚȫكÜ췀øAöbÉàø„ŽÚª5Š«¿©Àà.c†y+Á4P+D>RÃ⠬Ю W&N«NéUVB <^ d3ÝÆÿ›bþd>‰M8©hoæ•8TP)ÖºTB´KÈN%¬°ˆ+ϨkTµ-&–‡Q\›?· Ã6õŸr1-ø›Ñ{;~ |?ƒpB:ÚHii+®CË4Uf"ÔÏÿî<¦ßïä?§‘öÂ@aª°œ·‰š¶Ø>uþ„±ETa–ýʀjøöQò)Q©FÒÓ÷*]U ˆÐã*xL¢–²œöϛõ½GóŒqDã\5x‡rh#6M‰?'6·ÿÂ<÷qqá^ÁP $/²1, ß1Uø`“wÞ¹’bEeˆ Ë¡iē“Ð[”bÁ™lsLà å+3…NwkÙø¤`äõ·»(¿X-¸·Ê­ØÍ[…µÏi• ;8ę޶FהmBԗ|fz Ñ>)!ng–£÷¨%zñÀ8’«`˜üŠ£¹_Xa§†½-L¥•ÃL¤`l6\•àøó¨ÜÅÐá!ù67ïXÿbÁ]œhš*7茲HE +Bém«ü‚÷âuCZÞMºýf¬p0–ö¨ª!ܪ-Ï؉[UÞhÍX t04¤¼eȤ¸fX‚2‹0€U€¸8ý&ËÁÁ n<¼¸lm-•4~àƒˆÞ‘O ¬ßóê ™U9Ê…©¬ßŒ|`êͨ,8øP Ÿßç)£ƒõà È0IÃ\ƒ)ˇ‚^Z4)£Y¹Ž—;#j¾U¦Šh‚Åpu‘Òa腀9#ÊP ]ñ° örê*՘ÏbaLj&˜wó¡ðK›ÃÁ(½óÑ>²Þsª^=Î5¼P¸P ãe‚’Q¹%®‚M«Lx“Ü“a i*!ÕLKôÝršçmèζ6ÓÍ DF\ÕT¨]©B{ÝQ\eJ±v`‹Kzô¥ˆŽ¥¿(¸$ôP8i>?\_îk˜\ &©Lý´9‹|^9r•ÉœË硤 +9nW­Lï&ç™ë ROá×!D£eRÝëñl,Qѳ/r$¤äu¡”ðƤs@”ö.YöƒÄ•Ø"P @_ÄþÊ­«Œã§'ŪåK ± 5'L•%ƒŽ±ã’ÛN*¤DÐQà¡@ßÉD¿¶½ò«Îlݎ¹¢hϚF젍uRšL]Õæ4L&tXêûBŠƒ`ç=àbéʹNîoŒ¨L~=[`šäRR͐3êkêªá×Bî^]ˆØé6nê…ó=ÿî5;äB†u•8¼•mLV¯°§ÿh6KÒ ™ÂPä*3áå´yæ¥Æ$©l3©ˆû‘Y²„׏¢¼f£s¡çufGŠ¬=ü?¹QàÊ@õKý!ßÝ Y‚¤Yœ2» +¤´E›vßõ!ës¿ÛùO6 Î®’ºïZøYCWë*(YJ%0?›c…f)v>1¸ª|öOÓÌâƒZ¤nj­Èi²úrå5a;÷ҝëm?ªkÈçøIJÙ'ëé7Þå 1i ð´í¹è}U„»Ê9{&,TÏô6ô4·M¼*ˆe6A™AJÞ‚YùÓFá=‹ +:zº#”¯„„¤ÎwJeTùXjåø·{R¤‹ÀnDŠ:õ僂`|«$ £x¯e¾ùœrSs8ʍ‹"3ÑE“†4ŒámГÒFîߨC&€‡+413­r\}qº¶H‚«,4 +—ôšcæç÷€{TöY`j›²ðod[~œÞ(`ƒª’¡«œÂl“ ùn‚½Ö(„,N˜EªŠåv\Ây‚Hứ: ä`Y€Z¤Æ­7¥ð£5‚ë‡ …Tçñ…xáëzgDä’ZÓvÕ,wᎌẀu†šêžÃ–0ˆOÈKä]3ÉAl‡a–ÀJ½ËY·±WP|·È%Oð†|K†sþêÇPÎ`$ r¾×—„Ôj +ÁÊn1’1œº“ÉáV-/«UÃ?mšÖIû l±]Tò¿‰ÅGP œ$’9ôho†t¡DH%K¦J¼¿æ°ÁÄl!Þ ¿¨ék“b¤Ï ¬'Ê?4*,*h[D?6ê`U{y'ñ$ä/ٙ°—ªgtò’Ґt#Â/ŸŒm¯.*•~¡NúWlG/ šcî“ö¯Ý³Q¬œ¯jã`5éêêVVق‡M^ãcSp!|ã¿\¬ädº 8@X-¬ô¨>2öA Hhe۝ Qe즪VÂüì™I++B„9Aç[„|âÝTMîÄ؁ki¤VFî‹Øú€çá\’ÁŽÿc W€Á{6º} VÐ+¬NPŽÚ«{=ú–dû{ŸrD–.jå¨eõ>ø‹ (`Úy+îÓ(×\Qá󆵏ìO ÛÙQ¹ ¤˜7‚ÿÌ.Q€Ð·ßgl˜S¤@O:šª;$ÀMëü¼.}ì‚"kò6“¦Å©Äè´Ã|û7z~W¿&m™ ZwòÇ͆H­¤ ²ùIÐ… 0Nzeh!¨¬' §/óð-@2 aF¶Xk²&/ü*+r<8ì[(~‘bí£¯Kà¤8´zbŠŸåUÓdÔü®y‚©4ñ½ã—¬ØÑÛb–Ü{ }1 ô‡ÔF  kâõÒ֊ÿ¥«E"ƒŠÂ»]( ­40\ÁáN‰@›Žûa+JC@J¸RLSñwó£PÜâŠ=±;²(VOÉž™©;A(‡µº;µ‡y¦l$ø •Æœœ¹!m|¯.0ò⢞+Lÿ»lÜö€…¢AyÍOÆ ~{_iðô m[|{ d0õϜ.ÏþÃÕþvƒBºvÙ0IÏÀþ6è·ùôØreŠÈ ôD͂'êœôk);i…€bkCý*ªÏڙ· ]o'„ØÀ¢^rW ]Íbçǧ¸ŽÇ2‚iÍêi¦uIÿ_Ñ×¥†®ÐɄz¹gA,n¡ `T( f%Î}õE7ù‘ ƒb,¢1?aX`Aúç3‚šú+äyŽÜªPõk|ÿ£(nOœÛÒ§;CLR´7v’P À|·î1!ÙN‘û–å²;aèñJº²c¡`)‘—eL.Áå(¼ÝÍ0ÀzÄ*Hd*¡*á¬ÍMu\Å0ÔUÌøY`HDU=ºœéïRô=ä0ÉÕS\’Ùd¹g¼‚p°>ŠÞ»¸UßìÒ žE»zÂ"²n‡-£¶NýJ°¬¦Ñ_«ÁÝ\*—ƒtýjºrœžÛt¼(›]ƒ¸X©~’Þ쒣 p5P¯Uª†³«Ia ¤5¸bò“ŒåZfËõCMÖÚ·U⨆K€Zþà§ý“¸ó>M6àþÞèŸTŒ““G°qíÒÔ§”Ö.ŽH +xTÛy‡±Í¡dùÔy˚þ)¨Ÿ¾ãƒþHÉŸ†D]›Ÿà‚]C%ù)h±@՛‚ÄO¤` Ÿ|¡9-ÚåL2 ÔLDõºuÐ'o‰ŒÎ§näÀÐ(¥îP¨cŸö£SJ¶ëñ)3ò+ᓅ˜Øö Q÷tO.5Ü]ªDù& ïD åœÊÇû¦âgiOµ©jNô珮Êä®mD.†\ၿT*ÂÓfTBz¢Ë¢§í'õ7±£Ý»·Îyžò °¨Â_3bÀ?‰bEu[Ûiy²4NI³IyÚ'“XòäÕ0t„v!&Eˆ„?~±ŽòÁÿþŸTHx}¾O*™Ú´ÝÃò˜q^c]¸šI“Ñêkb0@ÿ:”P;á4e€¼”¤8ãCJó$ÚI+HMIÒݔ¥igv‚Œ&4g‹…žê̼6’×Éc8͜hfoÓÏ;ÍÓÁ:ÝÍYºWeTœ®¹7rm—¨á͖JjäSl™½øÿn`ÂbâšØ÷þ'ӟ/m¢‹Å‘·¦Ñ0ëp:n„†£p>ɐIN8%Æ>mÊø4>`ÿh‹(›— Dz +jþ4êé@/²)) 2l½Þ'ÄKSþš0•L +Â34p˜ì Ø ²4Lá“,Zæ˜B|“­JîšÜ9i&’ã÷²>$é0ÒcFqëèUŠSH–ö€<†nš¦9 SR9áÚ3-Ú æ¦!å+U(Ê)Êî-åirB>̗´Æi$ÉÉtJ͖ÿjÜ9—•bòfó7vÔ°¹?PãJö X‰•s‡Sgº 酓7ÍAä±¢õ…~°‚“¯†#”k^@«ù½M·Ý\4Ðââ›C(G«M½œ@æ“7‘7Šùã]6áM™Ðóº› è…»i_PZÝÄÕ Ýä:ø07åø›腂]ÛtðBŽdmÊÄh‰bÌ`ޕ©Mò#‚q>{þì¯~¼Ëø!š³©Ó10œü68üO÷s¤ÁPÆ&6¢é¦="˜LHª;Ì5ÀŸRc˜Â9A“|ßôåm’°é0UËïr;UÊójÑ¢—ð¬I--­i«ÞŒ5ù¥v2|˜š.Fà{×iºšR¬  ø.Ód5A¥ •«þTM© Õ$÷¸¦¦Õ®µûMIMÉ2çABÑRÉ"Œlí€ÿY¯³ãó%8Ó°G(Õ/! >’5Œ¦Ù‚ݦþlfº7‘B My»„Åjöӏ.Êڟ3­´$Î#K$¬ðÔïPHneÑU³‹Æ陥m“ “CàIµ#Wb_b¤$¦§&A±ñ±.}êK‚Ž#”!Dßv©­.)7;…\3\ÒvhKΤ ¨[$‰b˜°¤2³.$IÉ[-š*éy ®bt¦±r]/]õœ¤¦ fâ’GbÊsú¶#9¥ _'ÇGډ# ï:’!þÃH2ÿã'5!éd°‹ +ÿ× ‘Bñ¤‚” ~Ön@¥M#‘¬öÝÐ:¥Êݏt>PQpqhäwÍÒdˆŽdš¦­ÉÍØ%ƺ—!ä=õ#Ç࿍‰HGt´sCò‰B-C×û–\x»ELs™÷FÉü(ê1ÁP +óÙ6 °˜\s!#Ul#Í1ÑÀHl zHüt‰Lr‘6æ0ö°-;-Ò'[üÁêzX¤ì¦,¸ÅŠ¤Wu]¤"¥Gd‰c$.q¨cgƒøD$ˆøIHÛ?ÓÛà‚Axd91­È²°‡ 2ÛA´èt0° ubvýˆaƒ;rïJAŒ$‚ù‘EÀjG–s$˜{[?²Þ¢íÈ­£ èÂi‘±–p5Š~·YrDcÀ•@²pþõoÅD$(£BæՑïPG/pˆ4pܕøÈ÷YӑÅÃÙ"$šeÏ:’nÞR]²[EÚtBÀ“êjIŠ$ðEÆYp×Õ%~>àÉ…ü…‚D>f-,«j¶%H…ÏÚìÕ%#Y6ÿ¤Š /|´ãˆ8Gë£.›‘Ô¼ðjÛ­¨Ù¡ã:*œ®Äy¤£æ>â9@&ôD„=“fäWšÆì1²@£“$TehÁŠôy"DúªBýŽ…€{ÄíÀÀS­Ã¸¤î(Á„´ín7#½¥¥GËa E”¬óˆGëYD›Ë έ •ˆ–~°îhÑÛwt%ç÷©î—Îp4f¢é%5A–8a2*ՐÃ̦^&—Pâq4ėKëqç:zƒ ¼K×2Œò†Ss̳hƒ£h]ÿt”Œ 0º‰¯ªaà6ëªø@G¢Çºì;D0ZÁst3³&&l d9’‰%ŽYÙÂT7"$+‹5ò°#š)9±!^Q´%’ù²KŒIQG!Rh\Ö}Q—,3e-ôFÐä;ES¢‘ÙZ†!…ƒ Ž`£Q:QÈ@4¡VõF&&úærёñF•&W¤u ¶ÇX›Ñ~4ወç}î0‚K7R z®Ã-d×Ìt<úòÕÁ“9¹ž3_ ±”Ò¥T]`ÆÚl4ԑ¶~íïA{Ì>RÞwÌàJg$léÒ騁;¼U³>Hœ,ú~iıHۈÄUiDeԐäqte%£Æý!¿o%9„ã3ŠŠJP Òà4ßÛ”Í3RфÎü×yÙH‰6ãŒ:‚±Õ„îg¾|Æ*$ö¥(…ÓDiø²ÈÔu–úT®¯YGhõ]Hðâ¸Ì|ÑgÀ‹ Dö²ÀP̵ͨ‹YëpŽé5.æʨû›ôê7W’Åh"äFzp¬ ñŽ?k[5ºBƒÐ! óô@4˜<ùtÖø"L^¯é ð¹-εüܨüp@ž¹Xk‡¹«l؂Ûæ8K»”ÃH ?ó"‰T‰¬èBÚØ7 + >ãUH±Í”r›Âãã Xa+‹¤ä3¯¢È,¨@sBd„‘¦#ÁÈ3ðôì*Cl¶`Äï8êö)â Ä/!ø7Jæå÷cð8Ú'ñ«N +öâÂꢦ4ã%ýg¾XTŒï#,"LWñÁÿԜ!±E+lÖ"º¢|6úTÆ¿5°Œ#\‚H#ª®ž7<à€³èŠ +¶ˆ,òEÕqÆ"X°b‰Šæœ49N_Qì!B¼" l9tLВgE5=]뒣!8”ý¬D[‘› €iE"jð. ÒȊüS\V”AL ÀDº¢ƒKºŠž’àº]Þ¢¢ËŠ7Çcð‰*1,£FXS´ŠìQ?&)jì´@Š “›Ï±|°²M.à(ª:Dg{ 1ŠXŒ1ví±͙.€Z+(²ß¸a,% H"5?»¹Ä|"–ISCiÐ"`ƒÆ$dWNÔ J/Å0œè ú—›v¥5`OZ<ëB¤¼Á¹ÿòI…ªFýVÛ}zEeÏ4`5@”Ô;¤îçƒ;¸4@I½]N1‰ÞY;O§n “Ž{*å¹ñpÉñ¨ºâ6™™úØþG8ùšéa‡Az£³OHu6"Ÿ=Z=ÑAN: , wE7vKÑH<Ñb\H,Èe&"Fß°\R5Ñe®DDÏ¥uÛ³ìSݪd‘zå0ÛCTX¶ÃœDQ^#|]ï(!Ջ.:$uýw4~)‡hSÙ} +"Í*QÕ&Ñ<2/ʓGþ‡•<”*›ýCu¨fWe~ö<üˆ ú_§q0 +þʅ x\x¾¯d|•ˆÚ8Hޔ@‰…aèIÛ Lûêê™IŒ ?çúxC™ÂY… ñCÂhF~"„?Ö¡”a|Pg¯¶áLˆ5=ÎĒÑ»ÇY=Ÿ¡RDR^è3Tð¦é÷¹LŸ3„ U•Í3Ú`0Ùc@?lH¶ã•IiÜêCâJºTCF+"&¥¼Tg0dLàz̸ĉ†”ºúr¸%„gÈÜO5\@ ¯du¶àÇ2׳5ʐNJВ¡Ýò24Ô¹…††1ĀFŒ¿>°h!ÒbÈþ6ûf‰ß*ah,æ`Øäú9K,]hè˅ö>Ù´ShL¤—‹"íDÞ\Ž(d’‘™£Xè`N`°PÃ$óã£<Þ2 Ž¿ 2»²ö +ð:\9¬BjƙP¡®:W¾s +iæ 3‘bàŽä±9Á˜BI± $t/ÓµÍÇ\ÇH(¦1/‰%£~È!ÒÀÞ$œžïrüêÙ¹ržŒR·Ãs½¯N(ãBá¹]MV ÓÁ ©™QÓè1žë†M(|ÀfÌM®€öN›c‘ÝYvs\ûow`Gʑ-Ø{S€TÀMԃ¹<ór1 4gÓð~þ>Ein“Ià³Ëô­0ÃøADçÑõÅ>h-&eáJ 6Âz°†÷“9¬t$ëajf¨%§9ˆn˜´ —&2@´‡-^3ê͹[Pœw|Ž¾5ˆlÁT–s9@ zŠ¾* âu8N²F hX²›[M­#çj)fT¸:ºÉ–õð§=§üÇü@4҈ÀR~=ADà«>µX][£Í‘â‚T8HÒú\x4ˆLzÑqʟÄÙ^ þß/‹Õ¢ûhg¯õ`ö쒣a~É:LeЃäF †EHB‰3 •PþDxyDž?² +Cœ¿4ŸvÙ”nÂÇ!]DÅÚú¼ýÒqÌÕ8&¡ÆáRÅä4A¯ù‹ ê i›%ˆùK "ð·l$H5s©>îh• €‘çBLEr¢‹m0y]OA™ü˜Åý@X±mÖY=Мr©ò…±÷\št Œ…ƒÑE¤mÛ=n²®‘¹þCx]­~‰Î§|NÝ8žµ±IBuYñ%œF҉ښg°ÍZ`˜Ä*â#³Æ¡zú?S…(öƒÉ†¯PºEnIôê7@˜ð%ÿˆÈfïpÉLG6 ½ðvh@¤j&®Ô»þ·–É€Ò…ÂRf6Ÿi$ MF× Šx;p“êª´¨vŸ®jò4q¯"®(@FRQ$@ …ÿY Ê´;{•p‰hà(f A­€dòà„¶Pžÿ#Ü¡51CÿÏÐÎw6Ï%%ÿ'y¢‹ û¸ØŸNw™“¦×ýÓÈáðîÈ=:•´¹âX6ǟ’B3ØW?“…AãÛ¶¾ÚhƕÁ:gÕÚP&%?}N–mjr€ý¬Ü>gcÙôw(¡Ã%Ò9Ÿ{ðJ‰?mÃ0÷Îg{Zª3ûoõ8t²f£Ÿ[FÂΒ+ÛOô5 U>ûYýHù1ÆêÈÝ,È@X݊ÉpýsÉJ؏·HZ×OTeý ãŽHõC\ªË6! @’ ÔOZ´†¶Ç(UCŇïÔüèzj·{tŸÉ2‚aÉAW÷ÑÐ~LÕ m­À3µæ˜¢¾Ñ“ =Q ^/FX ,ýXd|”à‡½<̀þ `à*wø}žtòÅ÷qL¸)½O2oAQÚì’ï3¦ˆÙ}æ¼)ܯ,õ{‹v›·êÐK™õ8-~–EûèþÔIžÁ¢Ô +¶CÇ-¦µ>™¦”‡bí¹k2ìÚP…Ê­ÞH^û03 ÜdÕ9}àÐ=‰Ø¤Ï¶CÉôa›Îk[Ì×FÓhⳜyc©Š¡ÄÌL·ß;(ž3ÏkúD¬vó”ôùä<]y>) ü³QZizcËx…p‡$©ã±èz +J1¨«Æù8Ü‹¡ÙM÷P×8žõ\,КJH  …@xn´¬Ô’doOOeZC5¨ŽŽ#!„&B~á Dr@hïUD7[ýúÅégԟU—ÚWP@ÓÓé$bìUŠRHUÛJé(JsSÂ*}|u–:65² ¬1óþÿýÅÙ$>m#– œ m[ùFôíÀŒ`6툣ŧ£ã.ÑrhÚh4mŸÈ„¬P,„T8aE’‘Œˆûsº8 ™È/$#B""§> ÆÉô"ô‘ˆâ$ä^$¶ ƒâ–£_ˆNS‰ò³2j,EÌF‚4t‘GÍ0ÞD I 3u;3×ûjÄÚ>ßX&Æh«ñ¨U—mÛv¹v©®tãڂÚ5€\ÂÅ8̀4 À€Ž“ˆˆTÉoÀl¿6­ÐöUÛ&3%;Œ=—39 ¸33¶Éd}Ó±ì³m7Û~àÛ¾tҁÒÁþãì'Ùg}<{ÈöŸòËq—_²0,db:ø¿ˆp_áüb}e.{±Wsº9žÁ1ÍÌÌÌÌÌÌÈ)Û1¶<¤m+ZÈu~‘E™–•IY¹²*¨PS¯ U•ffbff&bc† lîìì~gbw)Ab "˜áÍÎE3ÃB+ö’‘¨ˆˆOێƒ`^_-a}夭۪©–î]{U«]ÕsgB>7mÕ ¾£[¨”Üî#°°Â€8 …"}’zw€HB0>@D\NJ&Êå$F†„2Š€Õ@‡½"_§æ=(täþ {"ÊÛÀð»¿a‘ý0k‰«gê>U4‡ôø¼ ™ÎG.;f8jŽäçí¸-½‘ŽÜHŒ ‹Öùæ.r¨ŽLDGO:fĂÚ Lue!>x ‹Ñqç¿}ÝØë›E¨@vÚî8o&°RWl÷Ñ~ü¤xAŽ×™ãµ ¢Ll†)ƒhƒuÏjøQ’þ›À Ú2Mµ9ȧkÑ¢¹V‘–¬Ö HÔöÅçIg[s¥t[\ø¦ð‹’pˆt²GMdðñem±c*ý0 a¶ý åô²®øŽ„ëç,5aœ2DΫ܏E+ëSQ¨]äžb¤Ë5ò}ÎBhôFëú1$€å}óúf9âHß«ՓdRÊÎ@&6"šÀ%Ž±Ê)=Hö €Ì/I*÷>‡™ÝéÓVž°~BÅÓc,•È#ä ‹ýI»çnTM«þÖE~ˆdÀµX=Ú¾ÍvKæ +²PŽS +bxî}Í.1þŒÝ0ÁSÃùQæéuH`z‚vFÁÍ<Ä/'s¹Ð©`*8sA!IF‚x·m. Ts…¬' +âNTOH‘]?ƒÎj(š§`ºCْŠ?8,Í>6Ahv$0£ƒ¨@1Ë‹›N…Í8%96«ë8WÌmÅê°óçspÂs1¥*uÊË¢€%ºløàr X—äÉhßx‹+ÃtNUòå7;Ãpx»‚%Á¾ÚÕ'Ðw¹ã‹T K sõˆD ìá&.W0W}À…«£7p˜ Cå^üÀ͝€Õô'ÍÜV°ß ì嗨SÝ +9„†ã`G“`Ï1Òܯ¥8(´ÂI«oYw®KÀÓ9ò hJQ:h¹fÉTÛ~¦ßˆš¼LÆþ/Þâ*¼VÛé’í’±f\}Ñ6H"‡æ5ñ +ó +!héž A Zø½³d*åç +¤Â LŽ°Yx¯y·¾Î®FÇqè×ð£ŽMvz²^Մ—@ ,´ b¬›aœ}zÙþIhs&ÇmÒ¢' +÷‰x73£8æd»ÅÛ Q…;T÷™± ¦‰¼Í·œò¢f +žU 2­J^¤%ŠÆ$EýĚò(f&j“$,ü®ø2ºåƒ¤˜–I_îuPZ0ÕȖR÷£‚~$PyË÷dž#è"Ù¸yž¢KTCæߒ·¨+À¸¨@2hËÎ2¯ÀQ_VA_\|×Í)QLs =˜r ådÆb.‚-ËVTO†%øŒ–Š{²`þ13g½„Èâ~nß~‚.½à‘i‡„‡ŽŸÄ*mëÛpzJo¼ +ƒøOÈêD³cYhãÄ-½/pñcíÞÒº&½?îX~¹ð"ŽÜàÔ8ï˜77ÉØ:=ÿ À´8b=BíR% +׬:&¿£Òßn³SvAD;~NJxM…¿gäñt\’|D‹|4÷4X®+[€Î³,3o‚©8¡@Ó`½1úâÃ^8ÁAâÚdMƍV÷Àˆ)ùõèÙûTƒ_|÷úÃã¼ÃF{ñê›ú‡QډJ¯dß<ç80ŒÔ }”y7ƒ.m Nñ˜ÚBiøQl9x£ç:écÚ~·n#.[²ê9ªéܨ³Ánš¸6œô.ï5 ¸¢"Q+”Ç\„TN¼\ŸØV¿óÀþ‹JƏùbQéÔDñ¼i8Ó¸´Hß?¤{!Kñ·‡¡‘èy±üäºâE+„#x¸”“«`,vs$|çø`†æèäB1©>Ç:^[™[žr<ìsa?BàXx›å¸XdÂU7EA &ôê+nö9(eê¡"ÜùŸ »Ç›/Ҏ½í/ l9¿[øÓW÷úÈ0VƒBU!@ù|јÓlÆì¬ѓ~¨­¿P¥˜†€™zÂ0lÑ¹ö‡n×Á0 ŒôÂ1Ë¦7ÿâw}Ñäm ž×þ5Ĭª„PRøhqC_òzZ(+/ÖDÔÁuSˆHÍtÊpÞØê‘ÿMjT‚%†úë–;¬*Giß& +•v\6H!*:‚¹ÆÂÉAӉѴ5X1"4J¥ªme¢ ƒ"CJ#áÂEñ,$ípÔ;o§;@\¶”H‰ofvÕfÀäìJÔ 2a«X”‚6˜äG„†%E»ÐóՓëLU™O¤xäç'f•À TÇGò +Hu*†ÕߢµyýR^8¼(«²eÁÊ&‘\¼ÀBäjC$—2hßvì1ño䦻¯ÎŽ`Øu‘¬‰l¨ÖE«šõùS]FBƒH.&ú4 Š—íƒÀQ¡ZWà $”GªíŠ"^T c p,ϋdBég~ûÿo Ää¦Ø*5M'×zü’|å·ÊNˆkÌ1ˆ{¸Ô·»Å–Y¿ÝôgØTÁ(înUG5í9½þ¥ÔðX¢½pGÖîÛFûÌR©…N +™0e Ï”ºd¡ÀÃiñ#èràþÕ4.]ëh_Lå„pa`‡Î¿øƒþŒˆ]|…ü%¶ìVø7TUȘ(~1bP"aNýªD°ÙôLº°NPÚL$PG96!Ѥ©á4(œÉg¼ ¶b‡ål¬$֝Èf® Rƒ\®n,ƶ뒟Wηä›[äá = çàCuq`nÛZ »*ùH¬M—V42ë0Ûê=Â• æÌ»ÏvÀ—¾œ¬Ê•IÏæÁnhàÃYÜ1#Cìàè €rxvß@ÎE°ûåFՊ…Ï⢤?µ¦lòÿ3:HšÔ Hºœaº´ÄO——Ú•õˆžðkó̃U ¾Ëå€ g ðG›Äÿ›Ä>Vê¦+Ńx Ñäð!XÇ|CZè„Û =Ðq×,üÎz%¨œ ü„Úš¯õ–II©{Á¯Ånêl´‰{µ:+ùr]šÉ>Å_ù9ŸR"ë:  8bA%å‚E7Éÿ1÷B,27ýß|@«>å—|•Ÿk7õò ö)ÜΫ“}ʬbÐ ¤ª¹8~å"+€ þ} +ÀÇ[ Ïcs¿=D´oßÍðL1iÎtW+Y/úÜ$Ë¥¡Ï€ýþÞvc£ÌÄŒURTJèâ™Çَc +숙ßðí”ò*§iÙî郭÷Sº˜Ê3é|bdx÷§tªä¡>h°Vä¬sÔ°€• B»¼a¾SÈO·w¤?‰]=\Ì‚îå·b5ˉs2q+™¬WÈ»…¿àœ©¹žZ?yRþƒz¨d†HœûBÔ¶®®ŸŒéÿŒ¼šÂÃÉ7ù ™}øòïˆx¡f£Ï3aq^š>]ûD# ²Jßó4òäÎãÉj3sN.Ç¤ï;—c„:ÑF¤É‰Òí!>Ëß³0•ÕüÙÒëÿ„SÏßôÎáÚ§³’ã_À+2‚ÉòùÅr”<¯tnµ¼VŸm U-3' ×í 모Æ0ÞLÀ¹#7­c“BÁða…Vºy¢ö[ȃˊÁ¯ ` Àãaà‡*f,Œø=<¨P4–³&VΦ%’@]ýmY +¥åú~}Ý¢ñs¡$qv=?ÔÌ`Gùs²ç«:âqíü"¦þe”¹{^Ô#äf54!_À:B öµ„ρߒ\¦H”Xš!j<9÷4’Ÿ^*ŒÃeÙVÏjv±Qa*s…AÁ‘gQð{ºÍ¤ß;ÔíŽH÷,µ*ô«±Žò£Š¯q~âN̽ğæ& +¡h±E!½ípJCYsqMº<àÿ®!¶aRjþ´ç‰–žlÒÙ^Fñœó¨–ÿÓÒ­A¢Ôé¯Æ¢O¼´³yDu%0oˆ}üìk+N„„¹ÝÇU¨¨ßxȔuSá,»â ŸD6»ëçø°#€3L@Òܙû k¡ò‹«å}ϼ†{LÌÔ%%ù˜qYž· ñ(DËcr:=æxP–ãÝmö t³˜ÕBàx‚;—æâÅF­mŸ¨ýô$ËI‡ +;n ÉåÆÄ„B¡œh€Ä•6QÐý9%ã¥4è&BêTïuþIöí ›z> &sǂf>îÒèQAûì'ÊýUFò8E+<Ÿ³GÖáÝmÙݢ (‹´Øæÿq†üÚ6Ÿš©ÓÚí¥¶¡Jh4‹c\Êón[š1 å BDÁoÓ{Ì`Å摗«©ŸŽ™@wÞüΰ&@ðçè?DdH…8òý¤šÌ[Ӂw¹&`Tçu±‚‚,nøž³-X?½ ™Ã–ç<Â{¾xòR5:4Kß^CPçžÓßGØ܆â9\;ÌDn¾ d«3}:ç ŸHùê±ÌqÂîšÿ¨V¼æþRhI<WÊ9Æ6O +»y¾aËo ˜U‚Ef€ò¨_‹,Ÿ^Æh/¥m ÄX'ˆ£ô ÏòÍ’S ?ÁŸFü-þ[%8Ôyä OGnõ‚:¶cdY%ÂpCOÕT¬/PT˜cB§ÅðŒ^^> ‰'9i*'<µglə2®„.+¯Á®LDSó§±ÛᎠè!"V»M¥óv‹,¾_¿±$TU^"µìd‘ÑÓ +ÿ/B@  o—/Vñ”¼‚¡ç'LNÄm‹vXSèÀϹ—ܘ±¢®m]›Vp–Ý!…¤{‰€m3T*ˆ”±òqQr +MÈÎΗÞj%ÒÛgv~pèU0°eĞ!L]ÍÑË÷ÍmE9) + Û¸Á¡!̃­z½ì4 Ô.…L\F¼ê*šÙPíol0ö%"Oi¬š{ÐÖ©÷{ãĊ@ +šYËÐw9?ì§4×3Xƒæ÷þ'Á92<Õ É£ÏV_Ô0«Bs>'ÿèÓǹԫ,ûvVˁ\k46° ‘¬h«Y‚Ëí,ÿuRJˆ”˜i/Néèë=ÔªRüTUÎÜéE¡·mo€°CÏC’/õtdSðäjžÃy^¤0dÀNG㥁]à; SMÕhì‚ǘê˜?h fräô“ÈçH©þ*.¬¯ååñR]®‡ÅW¦¤£›æÆæ côä·@±¾FÔÛöšZpB¡„M>0!!|z‘IPÁ‚æ1LcN”ÄÖÕ C+,Ä·Ñ_¼aóòËøùÌNÃøWØx­|bGò•Á‘y­sÁõ(àh֩Ȩz7¦‚6jeþÎ¥ãzåâá®}x +•Ù¥z ¨Î%?]Ý i«lõp±iøZ–Nq¦Ì{£Yhâd‹I|Á¼‹”Û¿°×ÅÒà´ä`mDÀãϦõˆ8Ó^ÍÄ-H½¥;‡*e]©DZ§‰Flñ¡KBK°¤)”z”Ö8hôQ,¿18qÍ[c‹>ŒÙÛ*%¢C‚öñŸ3é5¼˜‡™„O—ìuÁÞ&+?9ÿ÷p5%3šûÑüY#;?4VcD:©²}£}럦bªºTøLÝ¢CêÖÒQI#.Bŵ¡df 2cŽ#ê+O”øÞTÈ0/¬‚UMWQ# Õ?<ÏÏ­†—G*aa ²%³zzU=Å"v€=Øהµ€Ò‡ó?18â1U\½•ocÈÅ#Òã*‡9í‚V àóXÀîÒ¬aú “¶È•˜º|Jò©eÕ `’èãÜ:Ï?Œ»“elôñ$‹;ç~8*WR9¬€…Hj&YÝÈɐ®R«‡J<4v£ÓѐþµÀi§)>ÑmxLVáa1)x+ï ºÞÊ[U„þ’5—…¨ +9,$-~E0†Ïá“Íqú&ª,ÜÅXæ6ƒ°€]jž pµ±µÞ ŒM{­d†6éž@<ðq¶OÂ5²+t1Z|´Ç(![ïÒe;vW>Ô1V;¥:ìß髨Qhɶ0'©3FŸ-Õ×õ0@¥ð\ü ãE0ΎŠ€˜05ŽÒ±/&ÊÓì"j¹¤IµÂWˆ_î­åZfâ¯RàbE¡é‰OeŒíÞא +ðÊ èÝE5Š§n}D]/007â¯Å8ŠÀ||§Õ~Ë,#„»³ì1h&…ù¬KyfDcfÕxQ!;šªÅ³«¡ÃŠb¡ðhbtOv ˆr2ñPiŸ*s«_K,ý†¹“Sù<ȦmD~ÝâñãaW¯ W]=C 6‘gšr0pi¬³À ƒ2cç¯0­}Öu¹ ž@žJè—pׄ>Ø|9×gF0ˆQÆ%àIl¢áá†Ý5 ¾†`$’Nñ[äFvƒÆ¢ƒg..«P˜<9ƒ%¨¹¸›‰Ñêp3¤\Àúö@•5³ÀU(ªJ…¯l–\p9Yˆ–«R¿ZÆ%XÅÿ¢®Ò—¥æcfQ‚$ï<º’³uùƒ&†d€j¹>ÅoÔAvÏâ»pL8|Z®ÔɑFχȳå:ø­ß­òÞÙÎnÝ1Š¾-Ÿø9ÁG•ç͟)Cʪ/|ÙÆæ¼·a"ðZº±½Ï%NÚ«Ó3j4[nïùv‹<±"62tÃÿ1䯵Ð<$k3–Ä2òwŽoÂÒ.n¿ <‡bM}¯fÜf®‹”V¥`]@m´4ž,4$)Fȏe¥Õ`9=©A6,¥ãì5éJ·M<Ñ÷eZ]Íúð'ù»Å¹¡?w%/üd^>yÔ'}»<|"?|ø‰CHE‡ÂÒ üòM²ìxµu·¢A1{.Œ%'ý¤éŒ±8±oí£Úòôh'  vðÿA»7ru&Ê¢fHÏLl•:eÒ^!2éæv†NåúÊ(_2ƒO~xIojI—D4&ÁTŽyÀ–X_€ÙѤÙb—ÈqU §RìJ<ÃE®?Y‰ÐØ$«JÚÒ9ÅüÁÖR•ü™þ¨Iúq哈ɖŸ–¤¡$ +z]ŒÆ“’˜ÀŠDqò,ÑÒÿ_Šm•‘¤—I.–NnŒÜñývß Ûàē؉€„¾¯ó#ÕÕÐøH£UºævÁ(=h#Ã#ù°åiGJ¬…DÌA‚‡Žè²Ê)ñ…3÷SñÉÈü=y#½µòF¹Ö÷G/ê\\/"P¤H,ƎGy#FDA +¿T$»ïõò”¤J|C"_<ž$@(RŽ£+ÚÃ¥m(9©ì‘-c‘° oƒ†­Äü/ 2wé.чD×` c “é£ \÷tˆ¨ü{¶4A<ÖÈ#`2ž@V1㐉Å’±@›öæŠaÄDnû€«Žþ˜Æù™4"›.Bè°RˆÄ7piö K™‘„ƒø"v®}<‡èSÏò]ÁC´ PÆú"‘d¤õ-P )M^… ¼"Mú®É{áH1™*,Œ‰FMeÞOÀ!V¤µùGaőu Úó–Š?Öëa×l±ý "ߙéG]“Ž°Éhù!GÃ…m¹öŒ}8¸ª> Å:úXOçß 27ø5B‘rç”É0¦¥çòÀ%Á_„Mðîcî¡; Zíû_Q{¬/‚`=ô@ w+¿wm৔>²ÝX_k²£Z¬.Ý EáfºÈ¸$¶öº¿\ +ðˆ>.ä;>"Ûd°lvùž@8eÚOo¢ÌJrk GówÁŸn­B'7‡§¼þnHƒ›gÔ¨7ù÷¹QNâld14$O%)¦DEOFêL,šÂQ`(-" m3ˆ‰æð?8Á4øäk9:ç €u XK#nàÂK·:5|PÍ}^E5 üD\#ÄÙp|>Ö¡Ÿ„&ŒþJ8ÜäÆR˜pYêðñ”¦™2©Qú”–lO‹6½'•Ê–éÑ.Ì;l¥xÖç¤Ø4½ò"×µƒZ"2î[Èžkz¢ˆÍÄÿ!öÈP–†ÜoŠOõ=Ö¥§ ~ è);ýÀãì¦HqªPp]è³$ij>e,ö¨jÊIlô>h 'ý…äKÊÅUý­ƒ+O»Ê+1`ËÍX¦MÿL¨ +q‹íЦX„DÃ&ý_ìßʬùN’Éϸœ,¶9$ rý„\"@„%Áo>Zé–L¥|%!7s,u$<Êë‘_™ˆ `0Yi› ®•H8Åùjrñ¦°I܈rÍ¢AÑÆàWHG=™3„vï=ï5 Û·7,zú³ÃâƒgI X#oEv‚nÂÉî,fÏÒÙQêJdxwèë(·°‰ª–#6Hɏ]ÚuîSZ¢Fö¹:s‘_EiÛô¨$ãCiê³$†UД±wÖót°$¤&yJx9†²Zî(~)÷Í¢Q „]c|lwp¤¡½ŒÄ}ZˆdÄÀ™Ùn_Ö Ç*#aL%ɽiÛòº}ÛÀ0<Õµ×öƒ\ÝJA¬6k¤ ¤é¡UŸÍÝ ^ÞÓaU•|½Z¢¢ Zµ`‚Ø ]ıâà4QOYƒPKZÂ0¾Y“gÔìÀ÷”ù՜¿ª}V·S逯!ÕÃÖ~$é/JÃÁR+ýG\t]‚NXâq #,[^ ˜²-Å8£ï/eU¤õ^öï1c|éàü’#“0(ÈØ}më - ˆÈÃï¤V>ù^(#0>ø‡àßÉðÿpþßã7­@)ý–ž¨<®lùϒû ²7ŒP€sR»B!úÅHìµt»aš¯6T”Ð][@ÞGî·c@˜)SR/ÕÊÉúPò.ÑÃo"J«‚‘¥(Þöù½2*PKNHYušøùÊû̃-Ðì§îò¥qº™?lå°¸º‘Jò­—:"yK¾õY¾d{fVºÝhñ:Ï& lZa³ÂAÀkÀ.cÆDï)ÌÎr|b¿%DљےbT\ºÆ‘†rßyz ·k=]¤Ä^ý"¬&Ü·‚ \T`µF-üNËîžq ;A’·zÔrŒj +¹L¼¬f‡:]¶ðfQÍGi@KÒH–寂™èõwä]2©Þ‡¾ä>è`áY¸YŒuFtoÐVç߂>uBɐÊ̺¤ú„Q7 ù¾žÒÙ±wn½ˆ:˜9+P௼'0”±‡C$L7lgH¡Fñ˜Š0,i¿Ùwõæ–Ø-AÑøÕµˆ›Ù»0ˆ$@Œ2.[ÔK²ò—´øÅÙ×ÿú«§0o0±h¥ðZd‰ðdÓ¯ÅF"HM»«±€Õ¸"E³§¢Æ¯ºVߚjqC1ÌwãÌ0Qeþ€¨ r¹ôV¾Ó¢~Õ›¶§˜ _9hØÉX»ðZftÒ¿õ!"tBpÂ• ¤ãᄬŽ¿ìFdš¬*åÜLð5ë#Ë~Œ?…}x(m £×ØÿKÖ%F*Ûûsó®¼´ƒó· …‚Otf“ !t±«y' Y£èa?°Ep”ãbI›:@0È OQþIÊ Ԋ*Ô Þ.¡Ô—T´`JÂЮ‘Eäwü`ÎNæ·h!+:ñE”•C5‰ÙÖÞCÒ¦ºF<Êë‹Pt‹$ =©˜A“;\]íàí$µ9Bl_n°rïÉ,)[ÈÄeµƒ¡+<ÿŠÚ6é$JÖ@M•ü'¤åH!ؕ4?‚q"‡’_ªZÌñŸa51I›ã°ô@%ËU·Ãڒq8+õÆâ&³Ø®7V ‹!ùNÁš-Œ&ÏâՍ.~Ø üz1\‹º\[.Ô/ñÃ?3³L®xò ‡‚ÊY4G}I¼Ð¼ lÔt,´%rk儯þû Sñ±ÙåmfýI^ÖYýÅuhËä€ÈPŠÒ¹ä…ÝÖÆiI©$fEŠýÓFM5†ÉÀ<—1½úUd:ŒµÐEy.ôA)Ì´±†dhŸ€‰ˆ wšÛ±ž}WÈ8xˆFsŠeïËÉ!¬¤‘Ù*ÿÁCϗ9„ ÎÐÄ>¼”%]k¦TË!l.ãÚֆ\¦ endstream endobj 114 0 obj <>stream +ڎÜãX£/÷8Ç%;¹J5¥`sr' ÝN^øT² +gÂþ¤=#ÁMj¾µÇ‹,­VÔ\<*ì°¢?Ad½–¿×ÉՐþêŒÚÔ¼D2‰òp‚ƒá$ð o¾÷ØÝ??zSŠâPa¡ß>k(zo6½Á¡iªX7J‘\eq?|—œÒ¿: ¨¹aÂBS! ‚Kn‰?Ÿ + ÖЭº YÔÙT)QŒ·ÈÁ +{ô‰#•'; íNR^¹`õ²œ¯ŠƒbCB(nª+ ï2u! Òw5DSˆ¹išWTpö‘Õ^»ÐÞTT «GoR:É¢–7u6˽£™ ¼é5g²& 5±Êª»‰{Ue3–úžógƒ^‰•‹×DHy½ º&’©1ÚdLNÊ÷LԞƒìÉnpV±/p=v[¦š#þÔD%ûÆ&`VbSÛ8(lG(À¦º«P__Ðñ°úáðšê>¬n¥ÆO‰I‚öí¿«i:T4‰¡öSU“ÇÏ28¦¦F3ÑrhrÐľ–9Lœ~?u†‡¤§éýñ¯d@á顎®‡¨WôVÆd&Li +Úÿ¼ù¶²Æ”4á%’<Τ,åǙÒfdú(JØàFiø’Ç“‘,š^ ×åU#c&<Ñ4YGïg2'!Ëg"âKº¥RÒâ|V7AÎÇß7ŸQ&é½4ÆÄrö—Úîp&$ ÕÆTø“*¿D5ÃU[GÚ¨ùòJy2¦X+ÂH)ª' +¤:TÆtõ½÷F|q‚ñÌóâ¦(Ý;QÏe*f ·„e¢ñ_uC•*p%æ†F¢ó€?}€¡¡Õ™|cRDsâç¾ÌR0é¼±Ò¥4ŒÆiʖ%ñ`rôïþÛ + ¯O®†8CÙgMMRq > c+C K]-ìK­a‘ï–¢šW¼<ÊåÍ̜{ÿ›±YÆTÛÑ,—ŠÉËÖÄE!^îvm*¦ŽÁ"ð z#`ˆvNÁ$5L(ÃßZ-‰˜—P´æҜ /3ˁch(c•“ƒC‘dðd=-ùô.´Ég%‰Dhð¯RŽrň‡[ŒœãBЀãR¢Ûä±u ïF±,½þ3e·09ìeJEì?s +xׄx11Ьg–|:a‘K@Cûð®â3íñÏ Láö™Ÿ´Ÿ±Ît© îg¶´$³ãRY@³‡,•Ðl°¦¢Í`jnINÐta))!”œ¹ã—€-h:˜ §â‘U–AsW;ÔdTlj8ŽKðgÆ̱AKóð’/āKRœ,Ú|«B#{“˜ý¤ìª¸©K³ÏUéÒs5ñA—–#EKíß¡¡c.½}¾„rI4¼j‡D.%Î1"j\B$6.qé¶ì~´C&\²Ènï7û¥Šá«l ÊR=NؒÜ0Q4͵$UåâXÊEGµ¤Ï‚= šIZ‚GÑUæÃ+l_)Qfœ”X +40Š•ÆsðâÕ„—o©'zªs•Ø¢¤ìg£z`!ñÌüZ©RñŒµrА¥†+ ¥KkV™©KܓU–¥b‰Éd•±¬zLKµ&Ò +¨±a‰óg=QVUÆJxòËP“ Pr÷ˆŒˆ:#¹¬±Ô¢Ê ¦¢J†¢B­D+²€Vj²VI¥â$ݘI'þá]b¥ã +ÄcÆv¾P„ü`Œ0‚Žh<øq&ËT1Á*ÛI¢Ý¤éìL^õ£DÕPÕ_«V1 T¥ä)¡›Û ýe¸ íÞc F¤+•0»Ü†É3?¶µ5:j®ü÷T7¸$JuÎB”ž@™«;‰šeMJÅ{hß"`56=¼Y T‚Äì²{UºoÒHÉp酟ôA¹|”ƒO’º,³'¡q%€àI÷òÙíN‚+NšÆ;‰ð‰bÓ6J(Cšæ$AC–&ô ÄIØ/I_äM"«xIS“¥µTöIŸ\’çÍRºÆ&9¿šáïjȚ¤ œ°’ZòLªW)É-V’˜Ä¥Em†vJQiÁ¥£ Yeò£ÕÉ£©ZÛª”ÃÅ$Ž0«Ñ(tÚŠÂ€´aÔ²ëíS12‚иUOðëX, +免¢ð'³>Fïá‹vkÍ1„Ílý|þ¢<×*÷'? EX$d¦8ÉàHµJš¢¥³$ò"h(˜‚±"F|‘¼|¹ÔUæC©Vý +ýâÁE-½E‚ĸE¤–µEz[„Ko¸à`B‹ÜLœEBܪȌ®,¢ßÈ °}¯ŒŒ±È åÄ"pwà‰ªn¨¡¢_í[^ptEӔé–ú¿6טʒRDGøÿµwÐ*8†hº‰zWQ#.ÙÐù´‰Wâ‹*àAœaB4Üw˜Eó‘~|'â©dGÚ ½UKŠ8¨@ŠèñÎI¡.R©šè;r–¥Ê¡¢èËDì~‰ +(!p·GYX:ß׆‰òïÂb€_7œY#¤ŽÕ½èÌKt x©\¶À1ŸhYC°"ÄØôk;k] +–h“÷g¤eÑxž)õ2ƒ»É‰ÜA~QáD÷¦¹Å&Ñ$.”æIœ0-W¡bi Õ¢{ZƧ+Šh‰\o³™Â +|«n=1‘q¨ŠV;‡‰•º…èó :֖e ÙXMìB¬¢ý¨ÅBMVåqÁBïÐòó +Ixžê~æ +…B‘ƒT«9¨4+Ôî£û^"è‹×í%¢R{&±ê¥+r×Õj4§® Êä&}§PùR©$m¸`¦€ÜЧC1ržÐwŒ;Ù +¹r/¨K©CÅ·øÁ›n]BÃÑMC셝¨©ÊycPBUî&ϨȻI«dÚÀЈOcž6ò(…2¨Î¦ªÁ[`„¾«ÌÄôA×»÷F +]4¡Ñz;-JwˆÐ¿Þy®JŒCè4ìBâ»OÂóííM!„®#ڊj͹™Zš;jkÊNBmº¥°èt»›TÁ¸/@m4ýLsJ„,Óxb3H„ñq 6–ŠÛj_xnÂDV´ÕþÚócET3#òÙÏ$hvAÈ|З=„ÌCû|+ˆ©;x½òšàÏr¤ûo‡‹•Ä*ÂÄ " +KÈšuÁWŒTw«óÌëâiˆ‚TÐ€F‘T@WE•@ 3P)4ô:^Gˆ¼«2þŒpª R…ŠÄS¦¹«‡å‚ JÊ4Z3 È>šR²':&ˆå²Ø2©d«85á†ãà!uAÔìAèxˆÈ±T9Ù##ø3b»•ÕˆŽäQÔ¦€ œ•èL=ÇJ<ÐdNv ¿ D‚e*R5)8Õ¹iºêÖrV dž¾²Õ@€3¢Nèó~{R×óîóÿ=mà€R: V Ã µáÀ@2%ªËP[Teî +tÓ!ë3«7œ@UU¿L ‹smpÁ£íõÈ;™á•åO˜­Bë¤ò Ñà>ë P&‚D8̌žèòòLœ½j{!Jyì‘^¢/ju`@¶—Ÿ‰ ‡Å¼*׺äô¨~D¤ +~Àe¡ ¨;|ÑX¬¢Iz½¼aXj¦4LŽYZ` x-;Ì<›o»ú™Ê£3¸vËÕ0ØË50dÁ~Âß#&è£ÒõÕü`Þ¨{¦×ITà—çQ€Çòùk4ɧµ —*„ÀO·¿Aö٘;»0lÄ +‹Â}Üë3‰êÁ!ù$,RrˆU<ª÷ï䤹IÄÐr+4|ñá¾á‡•0|G'¾£>UâÄÇ4´i’ޝÜGâk¯>L“* +êT^aaÓ®­ šTÅ'éñDŽš0ßq"8|°¤æI6Nåá¶Ù~´a±Ð¯G|P$bÅ ~‚Ÿ°ŽRJ… +öDþ)dVj ßÛ~œï)W9áó`®ñ@¥ú`5¡¿O„eÈ}ÂáÊ)ÕI:bE ၶÅÿ©bµO°Uñ#³%úX1©ˆ}hÌZ¯Ç°!ƒË\€Bù|PãWŸZŸj¸?mUc4ÓîF¦ÎÕH=åZ-¢¦¥üÚTm5tS@m i¨ò”‘ Y¢O°W¹âF3áÄ }<Âeh¤ÞôIDÈc¶ ¨(z^Ñi’ m„®8ÑFĪ3|d|hI¼Ç‡Nì¥8>.׈üF%h²Æ7¤„µ7µ¢Kê|Š—à +ºG¢ÉáӃÑrÕo’àÃhÄêEòØÕ<•d‡aÑ}%Y¶‡òÙ{†“¥÷ô4O‘§/ýÓËöð›úcJý$ên™{°²Kì‘DEA+)˜ìùb ã« "]Þû\žMڃåí©QîÎ)³zÌä ý—žêÄA)º f¦@w¶é²/QýžcR_b.W)ŠqÈF1ŽwhþçìSOå²Íšfò¯íà÷ Ÿ](’™óLîÔBîbxqä&Í)}\‘w„NE¿8x"¯ègqÕˊ>I=@PçõÐöP[&úՍ\–b.¢GRÔõšÂ}÷D—›<ªþ9å×ÌõgêUâú«PãÄüçÇ-ÈÌC™¶=#—»¤Y`±Ã„y07¡ÄýwŒqu"|”ö®Ÿ«¸¸¦%­ø.NÉ¿SÜzĝL‘§)ö{3Ž–5Ö¼eã jÛ QÍ|S:îO0×"]mÙaÏúáóM€jRœZíäVƒø iüP<ØV”µ‰'$…HgRÂ`Êysn³Í`Õºrxr¼—|öžAt‚ßÑ~j â–£ó|&áy ½]l‰é©lƒá8x ¤`Æà¡V°º,*xŠvÈ퟊cËÊݞ°+Æ$³ú8vᷞ•£*‡\Yq’Wö›ÒfÔ^/Ýñ¥]­çUXHä2Ôn;jm†ÞÑà„¸£ÞÔäá|wŽMðŽ_~â‰Þ¥Æ#ÆÝIl0‰]¿j•Öî$÷RCÂîĪ¸¬$F먬¯*jíKX´ ´ú«Æv.qž¯›S=GþªQÄõxYM0®}œá5tLüé  3h℀+‚€ªŸ=btìI‚Ӎùº ø…íõéíUZ’4çD&æÕåÜh(ɪœ£ä²²£Ghp \΀e¾oç‰N9FyµpƒàÈ÷ãÈ?«ÖËCLÿ$‰ û¥„`¬*óïU…¢l‹Ý¿ZÉÀÏwԜGnÿIµ|AúÅV>òGLᬺJ}ÄtÖU‘ò°°ÕG:~„Z Ï/<%0ýì=¢!3t +HXáï7-¼öæžáOe€¬ûJ„®¢MÕ&÷àâ˜Þ§€]•Wœ„Î Í=ã¢÷0o¯,[q=öMÅÕWxì}†|éI‹V‹Q¥‘‘GvD<~ðb@òŒ`pzEnÙá.5Bþ¿t›I5‚ì,¢'•.³–hÂãpž¶1BÓŒÂA ³xÄ°ÝÐ[3úgc òAÄlÂ×Ï9¢ŸŠc^8²„¶>±eËfQ-”~¤¦))BŽ¼ÅÙyõ$†:&¿âȼµºáHzª,sÿtã¹­ ±2ÞH¹Líàß:áàžx"Cúœ‡§j—Âõé#Û¼7ÇÈ<\^é_bE:ᝦ.£(âÀYÝÄ͆ûÛ²ԏ‘‹T€eŽ´9šXEÏ='†qü{戓×x$»ñ…O ˜[„PÍfޓw`·K„éNM(ÎåÀ@å±·†¯uèR-ìèû ¹-ßèKãÄR\óô…Eƒ7¹¯ªÍޑŽ¼ÆYÄá?­WxÊEjßTÁv¾¶ºÏ“ë:ðUú‘Ýÿ¼“;I>@Îe=ön§9Æ."µŠRýùý¨UTÐEÚK‘¥*`Š .„-:sÄ\Må@ºu´vÍ,ó+4°bÊWɓ à/O£¥R{‚}ÛàFÝ¥ËGR•,N¨Mñ¬=sk_®"=LI²Hg&ïA@Mú.9ÃB­Áι +ÃøH»x«¸nOd}ö» ñBo¯5 |>ãE©(*÷‹ñÜ*ð’Ë#  WŒïæ!ĈÈÀ¢ö›üÙ¯ª@óžÆÃÊPWø‚*5…HTl½!u”ú”øÃN¢Îm¡‡°ÿ² N†$þ‡^œ~Æӏûʞç…Òæ¶3ùؐeˆÜwñ=°÷öJö«òˆ÷é¢Åøÿ+!€LתF')Îk9>iUOœï‹G¯HuUÉÄ ”4ðý£qf~ÌF2¡…5NH:g%dÒ1²nUqÔ»騄Ëo EÒt¹åj4üÌ>WHIlP™à-UÕ©»ŒU…4‰mMù„·8æ;K‰*€¹k÷QÅB¬àPƒè=†ØÌððb¸­À#Ô¢½R͓Í]á˜óPýV”½€ê×–»»ªAçã:Ӎ×ò’ÁÖH{MüZ!’>O*®Ê¾ÖT%S•—´£”eOñ¬û|¤¶þgiÚEÊU^sv*jho­jî;ñÒçì$ž.}Ê©@¤eT;N܌šç)ôÎWŒ›@s ¦ÞԔYŽ\Š†½¬JCH¬é9DΩª¡JRÓãcMÊϔœ°›O󩇻]”„0p5¤€…‰Eû¨€åK“t‰Ö·ªÑ9Lµý[¤¸*Gô°$4Óg‡À™/ÅAZCþ0¨‹r¿IÄ:-Î+;ú·,åCz·ô“dL@HýSÙæR†ë^vñȁӷâÜߥ X½¬wæxù|òõ£ª$¬/·^*`†ëU Wa FÁ5Â[:*šXÕ¶“8H\¯FZŽ†¨uâԑ–‡ +Ö¹>gÕ.Ô$3{,‚7?¤$$ÌCevãTޑq&à ¨Ü† SɎ5 +bü—òÿ²Êç 8ôÄ;ÛkÂ@aC¤>!nØH#,‘AhàÜëw cužRì¼Ã²ªßT¯qÝþ¶Aôd//Š-õ#ðñàù€ˆ#:’mÔ³—SaDwn«:xÑ~Oq13ÞJ`‹²§ÜLªaœÒ+Vª†íҝÛѨ¬ã¨`KYóMm™ˆ‚(5Ž¨ÐšÊbƒ=n·£ÒRVEYÅð¨â8vñ7Cƒ97þšwy´ò?~\ô-¯£K÷È‚·sÁbUNTà¥cólÛmZ[T8"DTôËh|Ûšä±»8È@³*4'iŸË +s°>kȬŠG¬t¢ÍªÖÅnþÐ|a€ 9PL‰ªˆ-ÜÔ±$VDJí²3¯7–}РšÚH›TïN€9{Рˆ€ø=¬¡¶Þ‰r¿¸'žUٜ|^‚(f“£Œb` I½Òóv'é#tÝYFg +õ•‰›+ÇAӂŠ®HôSß[[D>¥kÆYUGx –”l ó,n2@7Ä­nLÕµ¦lXô`¢³§)JÈmŠïÈ/™±±»ì3hƒTäObd:> `âŒÎ7P^ ß{¥‰é \—¥.tRFçÍ +œ÷ۆE.‚iešà;8±À=!Ó«ã~G-{˜’',“µ]óýñÇ>zŠÒ`•òÚmwõž¶ +°Zôø.,?™7K—Ißòۆ3×GíA–«yùҝ‡Zù°Ÿ¾ª”„»|3 +^ށdQQ(¡.¯ƒU¼N9œ°ôÄ ïw—ôÑé_Œºó„’c…Ùg裱!xÎZkÁ—‰Ag·wÈøb1ÅðÎã|§¿W5߇¤qJaƒ¶#HÜJFH7'z혅1Ç42±‹š²êÓ9¦"}POáˆYi +‡óòÓ“9í­îp«zû£EpWÿ9£Ug@j{™ï¡Ê&ïAV‡Ó}3•ó“‚aO«Tûˆ‚Þ¿ `–H†[‰nLˆ¶8f‰›‰³EˆÚ達è(…eŽYÎÑýN%\žo%Òü¤-q죡% ¹¶zRÊ™4Æì¨Ó|tʅu¸k{Må^á2Uˆà3§áŸç +ñU’ù–»&GNŒc!®BØÿ§ +ãyS +ðeó{ø§ƒ9è=Ólîù`‚ÿù°f4™ÇIwàIÀQK +U•׀…ÝZŠ÷i3>´6E<òÁ½Âå(2U8< •ÈLÆøv Ü­Ä«(9 ÇAZ!×ÑÛ fÁ[ ì»Ü.f r²Às*DìÕ_¯?½qóÉ-âË*²§-¬Û’8/xg¯4Ï'“¨#PXÍL=¡z~ ᵐ/Óóprg¨À«E²$’0ê3@|‚n©šˆp¢[«Óë[ÕÇ×Q›1¨¢©ðÊúŠpu=ÃÉԚgeM{ïÇPLh@?ߍÌÌ ë¦É{y'¹' +@–ÔL  -â)%>Ã2ƒÝÃ2ô0‹ÙªÈß91à×QÀ’Z°:„ʸÆFÒô%@ L/¨š¾ƒN(+7tMX¥þñ‡¥Ôª"÷GµçŸÒF¶OKQ€Ç*wr®*3ôI›®ÔÙ kõU;²Šo4¦_9.àˆV™‡°¦º·zÚ9¸®Ï£š;ou¹ø~î ]©ÔéÆy»“+ÿY ñ#ËAÈ3Õ.4$Ùâ¿íª4„äš=’Ø p¤þ‰ü€ÎÑeS¬rÔ £­ð{Åõ¡çZêú3‡” •Þ;ag¥Þ²ß8NÝ”3V]7º_º‰§éínë5œzNÁÞpµ£Š\p•Q &nzãrá¿öŠ&IB ¾•|½®âÖ诀DYw%«ˆøh¤“AÉz¸Àý’–¨º Œp-B”0Í5+:©oõú¶¬"oÄ ±÷%㿍F¯PØ©7Õ]…;·» *ٟã€%@•¬jâ VØŠDZôµÎáî âÔ ‹Þ+ÀµaN' +ìZïþÍI-[f\•#üoËSåó(•þKLg¡ ¾H_Ädž /‚±>ɂÇÀóªÊ„Iš%š"?ˬÿüàTN&ÌG<0¶ ´}»ÞÚÉ"Ù‹ïRUl˜ÂS¢1-¶xû!FNRØRÐ +Ü !Å´‘p@}¸Ú(2Cf`-„Yñ?D9 uðÅŸª†x^¤™,(@! vûÐCNã?t4p»÷ìU™°=”ܼ»lÙ»1å´6ñÔ¶£Bâî"V×Vð¿çæ'ÂÒÃþÀo϶Äqûb: ó¡¹qÍÃÆ,”±Ò³ZÍ»¡¾Ê¿—ß;Å"cH¾šP"mo>)ò ,r¬9VÖvÊf6>ÇÒ`Ýùø´ÎNþI·ä­û=ÒwDŸxGWY¹m†¥zÜVSلKû)“@S!É%?š%W£ fC`ôî_^û}°—£cõÑÅuÆñ«Æ|ï„`;ì›ô'mZ&¦4·ŒU +ÞCòÛìމG?Ò €¹ªS¥1tChÁ‘³' 4JXS‰ + ˆ I”)è°¡£hÕù‰UǶ¸•+müs©Ö ¤e‡|þ>Ö<Ì@ÈíD¶?ÈÖLùû¸òcç÷ù’˜»ßAU¸…Ûƒ€ŠŸÀºx;²z1Ãu°mŸœe®^{ˆ jÉ1÷—™x¨+‹q­³]ªç¢ZUÊÙY‚ÙÇ7å!¶5˜È!r)V&µ.…fۏ¸ç ÂüªÞÚ©@lÀ¤¼ q¡Æb´™KI4Ȋ=ÔJöp1/Wa6Ɏ_,éÄ2ìYRAðÕ¢Z~Õx25îJ¬!NM9˜¾1ÛXí…v‚³…;༥5ýY6Ê/‰Sy;°r/'Í°V$åü’=$Þ»à>OѦ´ò:N÷260œa›\`DNà.k£3xV œ®“›•O$ 0hØg|äuDXù ‡½…?½9´pÑVz°LªÜ·{ùæ)N6U >b]ð)ډÿCs±á†²üž=Œ.M÷ùç§{T£0)Dœ3<7ÏÆe°h™=œÅ´Êcή#£ЅuJqî‰Ry;Hg 4˜[„‘éU,ÏÙ?CÐ֎]ã_h¿Å;ÈòÜ°rU&/%új«†˜ÿðòËì¨â½˜gÇ¥öz9꣊eôBH'XsTµ®ØëîTêb´ªœuðA$±3æI*ÊmÞÑҏ + ø¨¿'Vóco4ι³ÀRhÑ;|BÜõ‚Ì ø=~ÌòáǛUbØÔܙC9±nHo%a•ÛP(&œZôhdãå9ž,ؾpqdˆ'˜hõ ‘ªúBd¯à¸zHS¸»®4"~Œ~ë]'óŒû‚›óÎÏ!ÈÀN8)Mž>‘‹ ¹ùÍ$ÕØ5•æKÌEUE™`tâ0‘LtE?…ñe2S=C·<­ÛÌW¬:‡™‹NªvÏ;!©n :@æ·Á‡vÝåÕÐsõXÿ# °p—¾0&õÃe!éáHð6ñ`!ÿ\ÓªˆP“2¹|ðlŠìC$`Ë0edu7[xUÖ´oõ]å#Èöÿ­.=“-ÛÐáÐ\1©&£ òS× ¯ag£ÿZ¼Jπ9oêÏ̪ €U›¥Øåû¿ø²QQeu—TTÉüóg]^øS}8rŸñÛ[âGâ-ü,p狭w‹%Ðò +WFçÐ1…SvߖFÔ՞Š™:Ñèõ‡g—àªQˆ³ûœe7'h ïÚÕÀ¥Båò^Ô£C&’u‰Ð¯Ò€tϲzã¯é›BYb_Ò¹^â>ð,-»+ +QMÞ +ՄÊm Ša%Á½üiÂ3‰!H=áU‡øoR¼«>ï«ò:œÁþ±{Ñ™HgªF±É¤ÖÛ K†Œ¹™o MŒD¡ƒC@ÿVMÊRë¢âÈV(d9[)æhŽw_Α¦´É2ÀÈÝ:Ž^#˜¸Y8Xa8‚ü†h;áMå ±³¡Cm„ò*Éw%¡aÊã+'Ä^ Iä× h¶ ¤'lÂÉi8¤'d.Ó¢fz~4Â>lžÈÞù¯½JíÎÜ*‚'Á>Æ{÷sFt<ø˜R"mçí&w¡¶Eñ,¯JƒV`idfõßH¡{Qš%ÆPNlE²ï³Ùv QIp?‡†¢iƒfo†ÿ#§1ÖSg^†pÍJìiPB˜$¤…6| +rãAðõR7"Ì8¢öû…¨z/ö ÚbۉV”¼Ü“!àü@Á +‘ êXÃhôX +÷âã%½ŒJ̦Ü2BÎÿˆÛ̾|J6ïq¶`;Ú«¢&±ŸfÏûsÔV\E… VPD&þØE_$ߦi¿®Dƒ ѕ"3ì](Žª +ÕÎÍ2*ê‰ôbr…Áî(+>ØÀn!û É©ã¢/¹Xdá71C¶’ã~Òìôñ¼°Q»¥àµ ӊšÈ•Ê…?1êB¤M`؂uHؚz{E¤««²õÓDMя|¨À >‘-ê½qžBÜ ª¼nÔ ÈN÷|4f©Ø¶Èýõ›Œ°‘û‘ovɆŒØ–nó$.‹¤Ø/h¦ãg/¥À³Žzû ͆8ýÅ«­c[Æ#yˆ!kVT÷˜¬/˜jËûŽ¶–‰‹Ôµãô€ñ,&a:šÖ¥Oê*R}|K¡g£z€¥o^Z62á¸ã»¥^VDd{S­ßåt 0î˜nV} òé;´l"ba¾Pf: Ã'#)%¬%õäx»{z½ñ¼kæ MÔ xoqFcÌ€¿1Ò"zÓڝ§c ~8 n×òIømöÂør}„j$÷Ëûü®scĆLǞ¼ÓlÅ÷ùØm‡˜f G«ß]µR¶öýpÄÀ´Mû›%˜ÚP2%(((ëŽ{Úà 6L¶»J=l¹÷|“ æþ8thû@Ȃ[.2øj°NŸ“&z YŽT„ë')¾Õ’ ë‰þÿTÞ©‚`>#>Ëvö!‡$©5 i]%Ò`D¨bšê‹?m^®Îɹ‡¼F‚¸`(~›6Dó?‘U ‘¢GtÄl$úœsÀÓ"a­9ÔTõ,Â¯œÃ¨%“ä,»ê£çô‰¤Ê¥À£ÈÄ<0fl4ìn6;àCu›JÿP^ÃѸ3: _[kjÎ$6þÎZO¦,h®:Ȅ¾RWV1‚°NxþôþØlã8:,ZÃ`±D`?d0WÉ°q ,œö¢®…ôr)H:-]ókòì,æPïòR%¦u ù{ñ)ò“™EÒpë\‡Ñ&Vu%~‚…»ˆRʃyb67Y&F)%æJ2n*cV¯'‡Ât’›´K:~ƒ‚*Ϛîëª{ÈÌÓù ؏ .Ý7™ Ö%ÑP Ì°‘»ÛôAO;ìë…ù\Í#ìBþçûéÅU´BH2&g-W(W®Z¬VüĶ”°ä*§ïTîeXÐՈ¨âj+«Op¹é±W þ¼l„ðP§r©E1[¥\•~‰€oa*" +½G.‡Ÿœ“ZÜvÚâ]g# tN ¯Q[ÝF]œÂÇ|—ì ‰Kö–Ë§ š²“33Ϧ£Ð“°4®wŽ÷aº'µk›aÖ¯Ì#ƒg#ZmtÝ: tƒWYwˆ!ì=²í¥P× 7?¥˜‰éf1<ö­ +ïy>™<´êöÛv=¯õt" íÚG7ôTϺǡ|ÎHãá­úû‹` äÄt–ryö.ömõ²åéøb#ZXaµk!É«0­à:N£ÃÀ•´Â™kX¯«FJ\ü<\¦lß†çÖ-ˆ*5NP¯VJØ'mbwcå\®*‘VÁeœìr1g„¿Äñý¬j²O'€roGòüw¾‹ÁC¿ö$²ÏÜ©…‚JÀD‰øã$8 …¼ºÛÈá›sɃw7ùH ~…— 2Ì3ͪ[L–4»uè/½u˜Ä” ÚO ñÆÈS²¼.WE|ûOI둦mtÀäÊjË{»E*8Úæ(Cæ³LªÈ`\˜×71R…Ãp ÖGIð4wùÁ¹ +‡[n“t„Q#fé Dlâߗ™Ù¬ +OÅ,8XÙdîtWñ¬›BÄ@s^±õl·kÁF8±¤¹ôšðÉoÒ+×Só+d«À’ž.!ل3£¥c‰Ûµ"nå)TuäŒ.p—‹h³ˆÀ‚Yö£=ÔߛÒtAs¤‹¡9 Ò»oo‘Û‡û|¥É´½ŠBˆ æx™ÈBGɝ’¤-å ƒ¬„}Á ‹1hÔeʱZ¸¥­™™‰ÌÌæÀìf×f%ffŒYœ³-H[„ ¶‹-Š-‚±MlûÆþ¡ V,BP·Ÿ}?þ}[XcqâB,Â!e‹`hr¦3!¤Îç³9æ\%ªú‘!2 +Ž‘éTŽèØ"ÒKI²$ [#IÞSusçU³R®SR²*y!IGDšI’%ëd1cq‘dU[EH’dI¾ ’¤•' I’²ªZU­U‡ŠÔ¸²£tmåFµ4U«[ÛµÙ\»ÁÔl.Ãl«ív`Ûöm ~—ÿ¾ïâ; +lW„àlâCdœë|>»|¦A$"#£¨äœ^CЀ²p< Æäq®M©;€<,(4BLb^h\žJ9Ædfr:fM‚@‘/ãך¢ÎV¯ÅX°ãyôz]ëMèXØ»Hý «8Sޖ֪¬*µrOGNþoT½Ì +#³áüM(š“¼*XO)CU‚FǶÏ/—å^Nó¬0œó´n´ÔbL¤¯㇬ã±ÌÑÂjVðݕҸ֪4¢‹i­»a®ä…„0ô¬uÌs͔µ‘t}¬•<ì/¢eg_õ¡·‚à ØÁÿ[­³7ðè²re×w½ðé|kZI—¸d™j½öë[Aô©•TÉkºú“âtªSÕ:^„¿Q)ÈjÒÑÓ +,†«;­úäL2´¢`ÄgÕ»3“ŒL’:CùMë¨<8ÀW=’WÚðHoií±AVkû†’Ù.‰kaïZ=fF-‰áþZ°:k£…€ò,kä¤UïfA¼ÊÕ?NCð1Éj~&Ù0!ýä…IӜhe‹kÖÆΜÉØ*óg"Z¿ñÌ%wÁ=Q‹Zi²…Ö€fT p¡­úƓ³r¼Fã@«n9«Í2“«sÕ3¬E©„í_TR6D€0ý¬»}¤^SèuËÆv$›¤UUƒª•cœ¥ÐЀðíûq­ÒYWY¶òœ5嬽›aŸˆQ`7ÚÎxùÍ4+Pe]Í:¯¹øÄf71–¬ûEçglÁF•0~hÁB )Ǭ÷Ñ®a"k8ãdAh9Ìú9JŠó›ÌZT›bÇ6ç…îÚ+ëy²àle½gl•u­ÜöqŽ²NGhÓPVõRFÚZ)Žp#{j'«nV?¯L?1”´Ñr‘Çó kü +<˜¬·%SÖ±~å^`³TJI¢Î±b@)“{¡t ëa½‡­"ë€T«°‚ÇUÅE`¿•ÆzzµŸ±žð: ŒõÖ&JuOm‘eÿð¿uŒÕ µ2§·3ø/Ö++mu±.¯ÇFøçÌGƒÓ΢üI¹^b}¼v´Ï²ÒW¡ë©ä±–ÕÄʎLˆ‡W)¾Þ"[î‡õ«ìîìa}<¤2î·*®êT4‚ï¯Jë/¬@d +¹×š‚‹*Y4Ç´™SX§Cœ°ŽrnG ëÔÅín„õ"5ÂJŸ E~°*V :XõïPD¶ÁJM÷ìYXø¾ÖA@zî« +åXÿPË~M`=,¨cãN{2W}2_]QcÊê ++wº„BÅÙW½z¦U%k¿¿ª—¹¦ç¯N8à÷«Äԅ W§©R£î6˜Š†uw~õó¹³ÈþÖUô;èìN¥çpwrÛ®¦°M[/Š@Tô¾º¥ÝÌôL<ԀRœRñ´78 ß«K3]Û½ziåê™?h’½ +ßm¾!ƈžŒ¼^Õ}¿©?U`VÊC‘*8¹R¢r1Ã[tÈTWÕ8 u6&)^ŽÛð꘹°ör‚<)x•{õ»ªžWªC¢Õ΢FƒÏ]ÝÆý€Ž© …ÂM›««ŽÍ0@>•™ºz_¯ låk°æk m•T“õ %JWñœ·!m™¡|µó¤ì9ºÊY”k¡«üáè° ZüiüàØtöÀ²²s•<Ø6WùE/s•h—«|ÙkK¡(IxV®~оÉUé1ËO^™ ø¦ÛmLwšÁÕP¸Aû®âü­ÞFg}«ß¸aoՇL€6ÜP—hšêG/ ZJ9Rk¬î´UtmTûdȳճ.+¨~ú¯OÂJè—bÑê…-¡‹{š gÂVÇK§è×êÑàíZ½³¹_ è;ÉЕٍ˜æÕ*/)›ÆU«ÜcjU28i”Öµò¹dQ«ÄíÐ(ÉD©ûiumÄuôK•ÙKüÆÿܦUÝh¾ÏÄcÞñ™¤UVlV×M…*zҎW4žŠž×öÁ–+³µÀŠ‚ŸoV÷"çA ’Ñ«n^\)7ª²&93«ç‚ª×nlbþ4éžì;`6¦å UøýÇþžÒS˜'«Sh¦qö£/Ôëó«Cº²å¹—+Í4…U5ªÞH²U%ÙZ¸ ÅúNÈœJ[ê%gY?ÊÀÎ×uwøvGO‡Eñ“§œX¼l:«Òod5X]xƇÕý VouŽ¨°Øʪ¶¡äñÊ#i@jªkI²Ãå,Î÷ƒß‘d‚ð’wē¬þõAtByüc`5-R<®O–~žÀŸf(d%àp¤­WúxÀ•®0+üN>e}^5X]„Hx}’í@‘?5ÃBšôæ]Õéõ÷S‘àÄnˆ¢Eø2S|nh¬éè,}M·ªš.“~¬ÙÔIC·U]ӈoU †.;(£U¡Æî泪 +¸:}œÉ´Öô —Uuù¤604ǦDHVÝ(+;ô¸lF|Ô»¸ä9%JP«îǕÝDÃ9ƒvÍaÕÍN.¬Ê +»Íµ[þ›·‡L:M³ªC\v¬ªÆ(+@õWU=¸N\à°äï×ÊÓRÎ'Ñ(@ǖ…ñ ‹r®ª*'øÈæ?U•?"¾dªø²Tx׳ª„S¸\QwuX«ÒY©Š´«œTuô…@\+4±g‘‘ªm°ì…îQ•Žr( gRa5ì¡*ŽË…ªÃŠ°x´&˜xV ÀÎUq‰T½Äky£«½ï2Uó’X—Ùn¨ïSEð½Y' ø£Aˆéî©rctú(ÇÎ’û²YÀ +}‹æÐL’§ +C„þô´ ù…€¨ÃɀéA‡‹h‰Qí=ªJ =&YVšl›ª}ï)kªs_X;ŝ‡40ЂK›P*ªˆ¾@¾±Ñù²îL•^,¸2Õ__Hù^€Ž3^x„¨ŽîB座s!i¹ÂTí|!þ»T?Œº¥ú”ž­˜(ì^NˆÐw|ºÀ…¾ÍÆOÁÈv¥JzÂ}_x¨çŸR=FP!ds ¡ÙJw…*6û!Ji5ɲù.¢×fR"5©.öÂcnåV6I…<ör-ð§4ýkt£-Aw»£º¿öG¬ÒçfŽªöt†¼Q=)Ž`kÔ9OÛ iQu°ÛŠªz»*š*›‡z 8êù ªÏ-ÍS׺¢gɪ^]m%±*XàUò¸P#ÓBS»(,5W¨’ˆ^ªv÷–ŒêÍ Q:uûRQìnóå0)BušÙiƒ¢Èe¢Š€×­·b*el3>ðÚ¨Ô· +P5q›ØˆÚ½¤‰§ÂíˉSŲ4¦ªÖËÙÓ£˜=¤ÂŒj~ž“ܵ[&CQwQw¼³á“´Æ§íŠï©(˜}™ xaNöí]S÷ö™>³ "œõÔ-’»‹JÔfÔzž¢HT8i[r?¦ ‚Ǹ¨ƒþ™(„´àŠÅá©Û¢x£·‡$ð#¿Si…3Cö5ÛS¤ëNkû›ÿˆlÎí\ât„;Pß,o{nvê–Ùÿ|öÍT ˞¦ëÔ[ TòXf<Žˆ–ÈÓ_ˆtKC»ZÆߣ¦«Í©wÛl=*”èå4aè÷øZ£³œš–µ%§ê>NDeúó$̓D£¥ãœ²fbüågj*Ì5ÓÍVlÖä´§æ‚nœ:TÍtcvýþ>5ÓY¬6W ©Øj¦ëà.¤Pқºª 3cÊń‘‰Hÿ+Vr›:½Òn»¢±ÜXYN¡’fï®å‘ßÈqfž&Sé33S՚Ü·7r©VÖ×Ԕ1Ó9xŽ³[½Í‘ tË^Zûd*>™é®}`h"> Ë]4篓š§¦2'3%QÜnHÖêë>š,¦à¤³™Š6½Žã‰C=ÉLý; 6øh¢á쐧v©;ªUê=îFú3[Y+SíH(ñÙÀÈ7PUªÃ |,iÿ0p:°ú}˜ ”(LU Î?º‚EJÝI‰ Zà Le/†ýK]¯†úRCd¨Ó.m½Naß9ËKÅîÖÎw©Ì0í#§“6áKŽæ©“º•h½'Wƒue.õÑÔòi`Ók2ŠKõÞFÞR]-ËM®ôlk[jÀ†k©´±—xWeˆÀ+¼šíǕ8…¼`WêöìÚ„L0 êÏÊJÍ Ö.cáPq3|•Jlk0Ñ®ë×vDÃlXŒŸo‚æ)UïÊqÏ2u~˺`¬Ó£R½-àÓÅöHêfú\ÌÐ|OÊTj¶îîÿTÕQ$9Qƒ:„pð@˜mK*)œq^õ¥U)(­¤nCçýG9›âúu‹5GCƒ&*"‚FGí›ÿê֖õšMÖBRm¶¤þê™t¨ˆq¿‘ªMâ“R]5Uè +š×®ý$Û4Rù%ë¯Ö3g;!UŠÙÚf?'»sÖúƒÔ„ÂnŒÊ)¥TNÖÐûÖ\ R÷7d‰Nѱ¡O#°hYjJ·Ü%(Ã*¦à+ @RYmÖ$a¯NA£^¿WÛWƒÒnBHß¾G%ÂíÒºƒø£õ¨.Yœ=íùχ…G§ž¶ª(ñ“ôˆI–£"zu¹ã¨J é„pTzR¶‚``ÅcœrJÙEÝààÍP÷…ºLç¥C¸À¢€Yâóæ&žQŸ“i?Ov®ÔªË¨Â.¨:ª»ì‰h5˜ŒºÀßðI6¡ËP/uªM½î/°”‹zëš[T÷ݬ.„:ËAñc7ÃP!‰Ÿ.)η»E®Œ¢ºb6260û­ýŒjÀ•@À’þy^Ïý7ŽÅ‚«Ípü”ºgá¤u1*|q¹pƒcYœXuE˜ é\-wÉLŝ•“£cRÊ#ˆ |•p&øМ5žŠÂ‘´H뎓½“Í&‡e%ùLóxM¥ >M_€P&æëÃé³+¦:ÚE~KÂS˜n:«ÁveØR‚]é±ûeß 8ÔöÁ¿r´(ÞP…ÊÎÂOĂ:ʙ=ÑcÒÁqíŠ5TCGfxXr&¬xFE¥M’j$–Ý*µètº1g6•YNT+Ž¡:Ìð°aIoCGÂP骰í±Uï(Kê,°ÀtAíšå1;Ð*v–.ÔuÂ$Q.’ãŒá(LÈÔLÕîAPñkæ¨}2™‰S*a’¿‚ ˆÃwa5šx0õG“Ù£^›0_©Ôù}Š7ÚD¦õVc§BzQ%†šKj¸ÂÊ~aÞ +>Qÿ‡½–ªA¨ Ï!J +£æ›…?¨ºdkò1ïúQ-=P¥ ˆ=´sz¹yÂÜ×W} ‰lI“¢ºÐábU ªz„2ð¬úT¨Ԉ~•A…àÏø֐‚꺯OPú«()ú@³ÀåÜ®rØkÕãõ!¨2‰vÌÍ/åó1©i0IõÞæ_DûzÚB/wÔ ˆ©TrQ¿Å—?x=éÔ㚬HêÆ°3¶€úÉÕÖ lôApÝD÷˜YûÄéÙ#S&( AP úVûLK+ƒÎé yê?ÝQöOà +¼«ÆfµViÊÅèÉûSUA¸qºU©4(•÷W›¯óÓñ4é} -TVå§ÑÝw´Kƒ„Ǎ+üT˜e—¿Oï…EˆC,Ý7ðÇËÅóþé‘ðé®=m‚Ê[L'Ä)ýË»ù +™ª>Ÿ>tßá(˧$jëŠÜÌuK¢IÉF9‡?"†‰#«èÞƒ¾=%kOwyàÒ#‘A±¼Ížþë` kz%Ú³¸:wª³5ŒîÛÕᏫ§ñ0CًZ"©§ÎR Ø £0×NOüTìÅOé)õy²)e K³ëÃ=åûdЩðè •§¢â䩐»J%Ÿ!3xýž™†ƒôR9˜ MuÏp0§ðŽK[¦õ*rwJp¼X¼ ù×Có”k'ùÂ`jEàXxŠûH5¥8xšŠ„ÓSbVÈû%ʦcRÊŸ´‡2§Ûã»ñV8’:$Mb?œN{¬SRU®;màȖ…ƝF¸G*Å­ƒÑÞN‰«V™7•õ#læ—5]1ÚÚéÖۛ{OO‹ßÓN#„)Óó*ÖØRkºõ§ÉR{ü*"7 "G«Náe Ÿ—ŸdÅ4uꟀ,IbÒù¹Üpº¿ øãþ*` u~%Nm+î‡ÈQ=’NŠížÊÿ¸ˆ”"”Wsè4k<ªƒêS~Μª÷¿×p +'tš˜Ó5EÂ9#$SväËijüg©¢·\%úR'Öþ“AYýoŽäп4P&Rr +”°¸Á#n…Üe?NåÒ?»½C—âSÅa•·ßØO²7Ý%’צ.?GSÙødµ®ŠÓQ KÑZ}q«T¦žŠ×ÕîŽ8M®ÝúX@¯âòpš3JØǯ{]Ȉ §ÄïïoW>êØô×OÑBàÔFY4’ÅöMoyNÉeZ·¯}»4ß4bPÉA€ù¸#ܛŠ‰¢+Ðá»ihÏKò‚Þ7X4Nl7ÍñÑó± §ãÎ*.,Vº)“õö¶²˜o•Â¹ijÅ Wø|”›¶ê>¦GTиi¤ŖÝé(7¶$Ü4,ðp:ºØª¶oÓ|őS.ž‰o°*¢ ¢\֞:3Ú}ËËÁ8h÷†BŒ3ê‰[Ñ=.›b•¦™Z+ٔ)f+Ò Ûþ¼:6ô`@±©vwÑx}53lÊß=Ú¼…€†½jsš~M—ÿFçúí¡°k:ä– ¤‚zÆí?éäO°HÇ<ª*¼‚”·jJ1ïªË0i®Õgª©1Ã!Ú@Ò8$ÑÄ¿ø¥¤”×ܖÊâ|ݯâIkµËX¥j'ˆQmå´:çÄ2 /Îã)Vg(›¦#|>óŸ¼ïŠãžËô‘£Mç–ÆAþҔØö§T)ßÚGQû€TºeÁÞ¨×ËDâ@µÂÈ ¹4NÕó³WMcßé™H]~ç@v¯¦¦Z=m(§Oâ{éó¶<: ¥¶<,Ví+!¤§ÀZî¤g×K¹jêDgOIµÜ%îÖ>DZÎ=¢å²ÓÒ´\ VE`Ò¸—ÞcêhÈ\÷ÉK¡Ù5^J[õ䆮Õs`‡" «ž¯ËyVÏÇ'3,Ù°-ì[¾K頞ÆúJÓɉ†0¶»tc [¿]:#™W!Žb ++»tÞ¿’UÁèjTòºÔA3R] +Wjhc½ø¦„MgŸÄØ»Ûp”–ë‰<9å— yÒÙo‘à&gê_Öñ|lÐ8ž¸îÁÌ$ªúk´Àõ±DÁpЗŠÉÁó£÷nÙy•õÁ³(0)Ü<…Ľ<¥øÝž:I€Mƒ“SѺ>i-=eÄké¶6´Ë{5ð#´ö{ƒ· Ây ;íNH e1rwÚmäIðR£EÔY:–çî;%â0•£8K ™»sqctb9žò츶] ÷'7}ã‡c¥×NÑ_ð¨4ÅáT–Œ÷Øbéï=$ ډëh½øp¬2§„­¼Ž^’'ï¦ÜtŒh°ô‰ìÎÆ}›•–“=û+=s•Ã‰µÏ†(eÙ¤æÙWÊIo•Ç•—`J†®“c$ò”¬r}í’Q“ÜM³"in+mÚU\+u5®Ýi¥wÁœÂ]4Ãsw.½iÕp‹¨Š²Òí¤¼ìªiò+‰9åŽr0](è÷4¬ôÁKÒ"^Œr¬Ý±ìºJ¡Ërá¥VÖ§¬‘[¥±‡r‘Ý˹¬Ò‹Î,{|UÑ°ªJ¯@îjªôâî]E•Êƒr9.±Ì’ûTzòÎD°ÁÁ'V“¹”#÷ì„|…Ոâ“pàAŸåfag‘ojMn›Ÿ€Î­à4Í󡐆Ë|̀r5WM<¿6hn k,S`ö‘7u¦©ÍŸ1çe­â!öÙÌ5¤™þæ«Á¶¡‹‰v˜ÐçۘKMÍet(33JQ8O†òc¹¥'rËH¸ +.¥w81CM4­{Sœ¥òÿMé{Îdpφ½Ùó®Ýfú…k;Íùfõ~é¹ä0žã,ÐÌÊ9}'÷B©Wdµ¿½É:ÿ‰Jž‹kPtÂò–5Rþ}†ÇøyIÊN“DÀ³Û=zéΉmò5*åEUË[ä&·ŠÐ!ðÊÍn’c [¡"l)’ý6ÒÖr_ÏIC³±C[;<—1‡¸4Gz^]ã&°M¼U X¬ó¸%_ÄÚÄýÙm¡¿ÞÕwÚ+ýëƒgF:´Å5é <+:Í2tÕ%“ó´r æS]g¸9¼X­-‰È¬# {óE»¦ÉÛȗ’êóæbٓ©c0©TFTó†{?)Eˆ¹¹ëA¥\f™`Ô\M‡Ä"½¦^«Š©kNÕX–‡ðn–tãÕ<¹½°³†‰ÉEbÉYx¹ÙüÁ袬A3NCl(w>~š#eÈâk]@;”súrZRÙ)òÖ»±èG|Š™ê%”Ù,GÞlšÀä&“òMd‹ØÖ!Šmè€0ê~<á.ÑÓ»9à¦IØ a:`Eœ¨é]D^ÅAQ;|/Š¬ëøy.UHátC¨^Ñm ƨ3ö™fã4 FŠ#YÀ P·œ³ø’Ó‘Š¢xsI*^œK×A*ë]ôŽŒ|H~ºD§ ãZs!ûz?ö*aá=N ”«€DÄ–¢©NH"jh݁[:ÄË»¨Þe˜<%\: :Kl™aïKûýçq*º£!|p7ßy"Ã8 i™&D!¸+@µíf”²#õÜ倱¦›3¿dÌd?uÁšzúŸmʾÎä²½Æø¢KíÏPOà›Ër5öþ_ž"D±ú–B4£5·¥|ˆÀ·ÃÏÅ׈C˜ÒŒÜõ‚¼]-o-‹MÅÅŽç¼’g}*÷l°¸_ñʪÙ¬jl<°×:ƒéK0øàŒ9KžL9†#Ç {_ ØÆ´²Q&¬ÃÀQ›!³"¥“=ÃP׫ca2Åá*‚ F”^rÏi¶ØëCÇ!%ç+Àz?7fpŸ„”L=°N ãÀÖ¦¶Ý|öÃÀGÜï,\©¡àBÃh þ‡¥õ+t¯gçÌA™µÖ#_ ŒUáPsòՏ_À&¾ªŒÉÅ +[ßÊK˜ õÔBBG`«OQ O/O7ƒ¨I +È¥m2+’i -ÚݸPýU„cҘ'zå‡"@'*ÜÀx#Îz¿&ý,xÑx3–3&°Ù@À¤Yö‘$dIñZöÌTÙù(°KgŠœmŠ:ñ鰙"È0¨' œ…;ηÎöÙÃO˜"OíaaþeHŒç_KY`]Ý`ÐdG +Œ“¦á1Ó'çáÿbR–ÀFú±P¿ÚžXÜ¿^M6k1Áö¿§þbq‚àØ·”ƒ†šAµÁ7!øcã'“k‚/1Ô öB­dچQ`œ—‰åóm*Ra& d;®&°sÀú©x=؋ÄÑàʜ?x4R3,T¶ËæÕ(Š´Ñ¬®°8ð ŒóL™8žç1¹;+á–5íӇ™â´Ráy-±–àð{Üú$*/ ÅK¿³gPÿk2M,9hœàaÈz·ŸWµ +ö?ž#¾GÂÒÀç áxf°|¦=֋Ȇ†Jk+RêÌ­ +fý²D³‚<ßõÞqë²xTf7¹\Á]þýAÂ/d ß'N($f²Í õû£ˆïÄ‹%äׅ؏ˆüÔ Íýe¾½pô;D£¸åÿn¾Ö§C9fÅ"²&§C Xb¨z(°bôýȨ"Æö›£~cÈ$WBl»c™º¶íe¿ÍíÕ¢«ÈFŠ½3@Ô}Éd-ujA叭µQ0…ù`èc^ÿkÿ‚¨úá¥ìE—]°¿ÎnÍ=¬Ç~ºM#~°n´A.mî?@æñòËÑ筘<ç°JˆÅ׶‹5oAäáȑT/ÿÊ9+h¶œù¹ <4þ§<eaäMÏŠv}|À U¤Ö Á¦%ºÀ ÊèP/ϐ¢ع.zó¿'ßà™7ÂT?½ŠÐ} n>Tö‡·^ˆØÁPJÜÞ×½ê´Mn“¦ÄÝÏèPéC srf‘f‹ù³bRe¥£ ³î9čR |Ú<jÙÕ½®ŒéVX›óuq>-|ýÜ;ÙO×Ö¹IîëJÇt .†ÓÄðjD¬WÂ9åU4oäºÊ‰ëÚ‰¸¾&¶Ó<©ŠÔdÿ‰Š¬ýéʉãl¹èq;t«õžÀlØzÃPÝDJçm«ù9©Î_æKþ“Gíd"BúÝÓ«ƒœ£‚ß)úU<íÜPVcOî#ë0!沔âàm”ÄÎ-rAÚB€þñ+ä ìXqÒp¨ö,3××\¹Õ¨¿ZÌæ0ïÕ9z òÓûזJÕò\r +Ae 4‚›hP¤ÅfÄPèò¼û7ï ÈĆÝFôÉe +~ÁâžãI+8I˜q——ãröœí§È.Ä;1š9+hbLét…7ôiw@멵Ppï':§iÒ(õ[êDsÞæü4 R¢¿y•Ðoí`b×#;ð1ŝ\ëœnäÿkAt 6‹F¾œay%ÛîYҋ‹ ±<Ý FñÁK#Û¶ «Eí҆ƒŠ— þD_¨¹(Ÿ“Tʊµ¸«MCè !Èø,a•qñwxŸ9~qŽ '`$$®&ü-a’ìsÏN&ñ*ÖX-à¸ðN yJžd ´ +¸(_û…ñl}‹FëwÜçxpDkS®–‹3ìš @Ôœ ´6Y$9К¦±%ëQd°¹œÔMÂîkm¢Ä™#…Ú” g~‰Ò#.Ê:˾ õœ¦¿å"¢¡Õp‡Q‘7fƸœ€á0uäìÿƒú6W5îÇ?Õ²­Ìµè‚Ísm>벸ç¾Eñ¸x´§–D•œ§¾n‡jŽpĂ¾« ûý{)ú0IŒyaéFŽüi•É^Uyà1€‹#oöÔÙwc¾È +â3íJDÐë0 +I÷B}Z¡óëšð:Q–ªë?‡© ÿÓj;‚º&;>qÎ¥$«–ƒ%—ÈL_ž Ø7Ê ·ÖÀ½÷•‹£ã.o +†¥,A§éü½y–£`[ëf Îg‚œŒ¶„O^¨š {iÖׂufÔß6€=‡°®l‰­Ú.-DU×êð=žÅô“» Ö +oòÝ蘤ºÔ'Ar¸c7$48 \¿£¯V¯ƒYTÛ<Ÿ?Æ]:WË5&Xº`AMg¹‡ô£^¦Çg¸6<)õ&Ò¿rLœrFä&qýüå2u—˜Xq0#IÀ(ïÔt€³;`‡)Ûñ‡„öû%móܧÌBqGB ‡Çóß^‹ÉÜ܍`Œüãg.ß$^ÈÙq-ÌÜö)gÍ ÿã_‰æ¬=J?[Ûý@’\/v–ÃmŸÞVI‹™Ë~›îÛ1c;Ñ¡0 þ¢ÌèϚYu[5SWý…ÌT«¢¸N#Ömç.ž9Xåý¥6þ´àÖýyíñ‰cվىG^EEµv¾hsƒë~δÈnXUÎÿN$ºH ¿µòƒ¾¨ÏÑG@â$³üÁîsÚ¨(Jž€áu0¼°‡i«®µW‘ÖÈ[rðÅRƒsÁ—‘Ö>¹É£Ö Žá]£æ…;ßP™DÏ­™å…gl QÏv1¯ ´Ïõë;ÏÞ´Ê¥^Ύ.ÜU½ŸfšÚd>ØFÔ2ߘ +¢á¿KÏW\¿Z›!èÁÝŒÏ a«.]7Fx¹àDjÇ$€€“(8úÜå•IbÉÄWýO. +P„_QúRp¶!)Àù;dåm?Î3·ï„Dê(q +¯¢Ò¢ŒPT ĵbZ”t· :6EIÁ·}ÉÅ¢œeÁ(é~wø?á ¦D^¾°ÊŽÌÒØPá¤ÿÖ°5ú9Jv›ÕÝe#\9¸T£4‹0 –³_€^$„uÔêw¥ØH·tÛ9znåz&%3”¸p¼øÊ‚æÚ±q¾c,F; ‰°v«âöþºw·ŽtõW’Àfû@Ù³?)&îú¤?5}MêÑ. ð£D€É~2Î=²º)šoš1|rlQˆÈ՗øVÑû\ߧ:N÷hw1Vy5ØM˜CQ¯8Ôj?㉩ٚ̃ÚÀWoC™SÑ+<®.x?v*$caµ7‰3Œt{ö)¬Í×R$Ž)K9(Ø +QÄЀ<6 O<ñi8 Ì`Ìö:´‚çoµ³o‡eÐ}êC¦Ôò¬1ˆQxHT‚—ê  ‹Ýa"C¤[ÉN7ü¥ªè¨œƒiØÀÎNÇá“øav’aSDjëJhr³Ø ~è¬}ßkEVóÒ^†Ÿc{§Ù  VMyµ“ +€Ì°=Éäëcà XfL°ÄO¤a¨.ùÇ5ÉN ŠM'©><½nO>-ïúºW’‘ûæD·OCyY¼ˆ%¾qÉ@´°ÿ×õ%wšŒ¨ÂºY™aUێà¬"?®¡œÊ"3íSs¿¢×]''ë»>—m洙\lQ)®»#ŸÃ ÇÛÉZì™= A=_{mð›_“p¸ûIɟع4Š{ÔgR+PÖuJž˜Å1Œ ñU[êÝ…´ëì7\ðHӗc¬eêWx£•¤s(?gÚ ä!º õ€D$Q⯔‹&ÖÈ^pâoÄÈW˕ +[Öa{{Ù'*ʲɈ8a|â·d5ÜÔ Îæ‘f4©€V zãÆÒ9ÒÄ9'MŽEŽyêÕ 7€G Ð-„í)~ŒHÁÀsÂ"¨š¬%!nmB4Ô “@9¹8{ږñýmhè”΁2}Ù麿áN@”ÌOŽ®§1‚d½oÞ»zÌVB Vڜõ ìZœÒ“QuÇ,Rdôޟƒh„7‰•{§ðp(Á~·âq,Y¢*XaGœ¬GV;óËH)b8îáüq͕\¦A ë}=8´‚œ2„™ÑæYÆe”"šº¥82M›#MÊO¾Ö-û΍ÆëÇÈü£5ÛÏYç<à…2Ø™]tãt)©˜‚ȧã@ìê1¦ b„H:L‘fœæç1ç›nU8ªKÄ´€Ý|úJòiH’¿̘a> ÏzŒ*™ïk‘œŸtŠ©ä j3/»X¿…ñ<‘GYàœ°.Ë߶$æ9‡àWdSµŸm!•a,ßÔñ ê™//&Ë*«ϯ©äЌÿïm~Þ$y'-ƒ71É·.ÏžNBc¾¯Xó£!9 Qµ-Ür‡à ʳÌ΁ç”ò™Ñ!ùj0|* %|Æ U֒րJ6¢\úâó…'Æ(•þüøC¯êýèruÉ»&jáÇȐÄñK„fã3jT´ŸÎV͉£–"qÈeĂ΋ŸR÷ õ† ”ãð5ª¡!èKñI¬É †¢²„[ƒføö úf/æ1úp»õÅüˆØþC›¶"#ï»náoސæÝُyê+‘¡óáù†NP×ÞÂOeßüxÐ +þý·`ê «(|-úgNï÷@tó½‚ÁÎU“Ê÷³ýíØËṉ̃ÌÁÞwãYaøtkì."¤}_7ÞÞhË.;éô`4i¨xá\@—h´ÎsMõ''z“©øŒ„Ès«fãæ åüÚÀY‰3)îA3íf­ „$ +àA–ª-O‡E•„ÔA»ˆ)óS£f“ÇÀÄèÚ­ßžD YhãÉ5r hŁŠ¨…š-²'ªŸñç8Ðøþ±Òy¹ëȃBxBí;‚fÒHÄ`ñäC™`Àue+4‡‚\ÿâ N AJ]ü̚Y8¨ÞZO@ N\an™6÷6An÷b°ŒaƝòü!tX°‚L¾˜qð3P¸Ä=¨ÕCPÞ$†¾Âà ՏØ%´@M7HxaWÄÄ~^qPÅ ])Þa˜)ÁD-žåÕa¦'†´Ú"{X]H[‘ ¤Ð: ¥» ÔÏÃÁ׈zpðxÀhƒ^l՚ìõ q Vô ýâ3ü ñðOr¨q)wԑ]Wt «ë>ýäUðâ­q‰Ìú7Îĝ2»æŒ ÌÁ4“ô½(8ƒõ˅$9˜ÿœ­}ß8hKT‹ƒ +èÁÐÅ7d“øwr “3Œ¤tŒ›¯:X€Ðib`òx*B¿:؏‘Ì1ÉDÓÁâpM/÷‚×:x¡Óëà¥"¡j՟–`ën–,åp”ЦÛ:†Úóê6H9_ۇ ôguÀ_óÊè$î†r¨{9„<:g„$W+ýe Ƨ˜RH¬Q¢³$ۜ²¡ð°·`èÛîT†¨ýÐè„û_Lž¡Wm53ÊÇ’Úééðc÷˜]¤¹„U ‚QRy;ýŒڌhþߌkV§ñ½%ô3Z|3v»Í2ùsÅrjDe¥Û4ÅøóýÑ}m7cÒCaˆéø•šš®-²ùSø6y¼êÕ¼}®ºæ üÏ +¯©µæ‚ß™ +ÝIPۉÜ󇷣f‘ew¹(³Nj†£t¼AÀ¹|Q}åòjqš‚ùòæ€fAP°cwõ-È£ž=©j7*ÑðX¥MÕ ÜR¬…ZF‰/Òü»0þ`³N£¢ª­Å$@JƒùoّIŠÅÊ'®è•÷Ú-8i¼Ái!Žã[h8ÍËj‰–èc^Ò-òd5䈥`„Õcv +•Cï¾Õ©™oRàƒÖo.Zƒ́C™ÈBAÒÑë?ýÊ 0t÷ڔãü&|s *#gËPahÍpû^’áAÂlŸ¦€ `±YP­[ÊjtÿqÏvÔÏaH×URÓq¸h(;ƒ@Xmmpöï]pn¸·må[ô9mGßs1|%…`Ï°æ_†Å‹I"+Ø!7€çûȍèòs-»38@‹^TV'Zo#CÜT€ŒNÇO<äkã2òÒ-µ#ƒ~{ž¯Di:¡<'ñ¿NC.îÈ4^”çPøü8êÐØGB‚·žY¼S‹]uà ….óR]B ’lJ¶í숯ò½Ãá,$Q-Øá2ی¢“Of§PµÄ°¶AWÊñÉYÄB7Ê gÖJ¶-:íóàK£ÛdžHi1ÃýXîÙOW܉0Õº NÒ8§Š2ÚM…6Ÿã6Q „¼íkëò?d•jƒÓú!OÂÆ3Æl ƒ·¡ÍÛÏ DÑÕÖVGü„]ºÿdÛZ2;#ÉÿAbC¯Õ¢äo²V‘CM2;ý™? I +Á»˜h˜ü»—tóœT Ög<Âlâ&Mó¾<Á×~!à%î=™d-ü+%(1ƒÄ¦oT ”I®Âä›E‚˜Q }›t‘n`.:±9ï˜8ƒ-À˜múAtˎÁTVB¸LªËmÓâÆK5¤_ H!lh½xtvÀídòƒÉzȐVÓj~’x/@šs^ÞB2+Äâ» e…ùvSó.0èZ@ë0¿È˜Á8&‹Ð~PÔ֘Êñ  lö¦2&¨„G-:rEÍÀ[n²x`|µüCS´—ùuPƒ*A¹mQû£¡ +£ !¶ê剖¬¨”âøJ wük¾] Éô«œ³å3—‚ßÊ°µÇ`@t ò…ùfÀ¸æ ·Õ Nº½€:HÞhHqaâWó® ¨GD¹ô˜½ÓÓsC J!cÃd¬pƒÖVŒóhV`(:<ÅÌ!”@®©+ðÓ¸ 'HxîxÜÉ¡nÁã5ù_²z$ÜSA†_ò¨4fâ£触v9pšªãÉgÄßs+xø2’=˜HcMØÙ0Òé÷ïHf¤uKŽ±ea +^®\_XﴔÕJ"Î`Õë±àsð‹’=*œ^425ϗQ£.@$gJY¬É«¿K +…q}È* ž¡4 ¥ÁlžeÛÏ© Ť…؇‚ª-ádǞ .>d¶m¾2tüþ?ß&Uÿ»aðô s,(yÚ,£±‘âŽD¢­³s@¶óÖ=ÌSÖ,/ë^`ðŒ8×ìÅ%MZ+žƒIø¸(©7 ¡8x¤A@Bé+EÀÃaþ‡Aªú«q¶ ‹‹pÒñ‘_!óP[«ø ¬‹­V·W„«ä%y¥ÊŠÿa±ßE]:NÏéh¼î_ðŽ8i:æâÓþ›DïŒÞ;UOMœOŠ6q Ĥ.Nþ„2:‚–<5‡i L±À-ý›KùM6Ýj©=¼µ•!ê€yŸ±4™/`~™Ÿ¾H¶åjXáPŋ´/ ^YFŠH))U§lϊ<¡yYŽ:~xN׬zÈ9˜ q]Š’Îÿ Wž¨.ÈoB¢Tà%ÍՃ (pEm$™Å„0¿|E ¦'J^A®n-rð—ˆâýœ…]iË>¼âæJ Áá–k]tqœ¨‡’KC6 +/ Â\‚'­å†Êd+½·B0hê!ý¡Ývˆš$Ñž3ôGK@F)RWìþàeé|̐G£§²Ü")ü$´aBV¡(Èrl£[ˆI\e†mD*‹j)Qʕ[QÊ <5­J”!PíR¯˜>Y6Ø´5?½â™ Êb²pÿ¯¾ÄÊ—v!LˆÛ«)qF¤‹ÒKD·3½‚ä÷ [¾¬%q¯;àXÖT.&ˆ§—çÛ?5*ÃÜ ¤"q“»«%™ˆMçØ%¡Ð³ˆ4Afd ^Ī€(ÄLÆ W–½ úMFdu–`0XÕËÅ Eiv;¬¾Ö0¯>ƒîpÄHÈ[;Nq)…úmøf1Ð3®tÅ~ê5ºŠ¥59F©ÜÝ(±Ót;„;ˆü|m 4Ó¾ÕïZ21¥D¨Te͊hÝó¼ý¥ïývydÁ¢häáá†ÿ’O&axÝ Ìü5»¸SoÖ×°;Z1r OôXÔp‰‚Ú:>îõcÎGIàΆ¼½V[ϗh–@\z]ŸÛ¨¢(t‰‚˸ÛkӛOâÿŽIÐ2$—Ꮰ¦¿¥áz©±ÐQ(8 Ä_A@ Dµ@îhžê3:žø9ÈèY(ñJ2‹×ZW±Ѽ"îÀ­Þó0á—í: +6ß̞˜B­¢íBÏ@‘©æÉ P#ºŒ³˜›v˜šâ’yŠkiíÛûm} +g ·8Pb4±ãÒ œâ¢B†¤Û\²áQÁ`xð)üC庡l½@΅çG5ª˜­tôW›š­‚ƒ oÊ¥0­] +HšÞ¶J$ë,P?n+Ì#…–ÈcÝånMž%Œ[e3yžÓ…/ØS«à@–nÍ ø$Â[Tç)Dp[·~-,à ÜrӌÍ.íVî… + ³[EZ^­ë»Õ+²ðÖ%@Ï°J‘lQÞª½LF’y«HnçöGÁ¨GEÁ1ŒayT­#P‰©·®ð½ðñôÓÔ[kGQ;E3® ¾õtFõiÆÖák}‡,ýÖeÿý/ÕûRI\¢ÒWÑ&¥-ŽÀU\¹- +‘àª+r^…Á†FR§ë©8:Ü}R6^‚ _ʇSÌ'ÌÖ3VÒÚ*3Ã#¬{þ‚cVË­ÌÇÍŒ•r°Ÿ¸ý7 +rdc”Âk¾;®×®‹ìø3˜¤yäã$JH§{ /¤¹Ô` +V+Û-ÇU#É9\Âvñ=‰°rUÏÍV¦ïª¤˜ÄupßƒŸ.ÿÜ"!5q­Mò¿Ã&‡gŠ«5ø+®Sgq+ðªÞñP*H‚aéd˜ é*Üÿ"P:ÎLá»qŊ( +qY%´ˆ9W¹êzì_ºBONàˆˆ=rS©Õæ"W=æÜë›D5 +ˆÇ·IsY|ŽÐP–\‘HáŅѝZ㚻ÐÆޛ·‚Ó§Âu½aˆÊ5~Ëçˆ?á–+jŠáZ£´»ßÌéݏ¶ +Æ<û¸˜«Œ&ƒ –ë- ³CÆXUtP“ö"v«¸Î­÷›îÖ*Q©r]…g5®Îµ¡v#ä +ʕCt‹n½*W>jnXx­Ñ_®v<∧««t\œ” 405HTh®Z#jÍ5Q´•%Lm®Š´`9Îõ Ùy®‹4¦"øÀ¦¹Æ†ÍÈ5²n¡—3]¶=Rá/qÑ«çÊÙãÉqÃÃD%‹LåÙøøz®…Õò3ð\?’/çº@žAˆUL­Å±ÎƒòúÜ]D$ÅO‡k^Pšf³÷é~€¦dþû§«ÂË«UÝ6‘uGÓ ã™ŠóßÞ$ "Úk§e¦Úÿ¬¡6=b°™æˆ»e°É´¦]êÒû¿/æZs0–ãÝô–"ʼ›ºXyß` +΋é“UšÆß³”•dÝ*(Ý!€O¨$ûYÔô<ÓÿÏÕâÔ;~rúìd(ÊQIåY;ö[¯˜&hcÐ +<¥DˆD/ ŽæYate@ðxrl&¬e˜µ½§ç!5l£À”|D˜±žàVÆ AAÃÜÃH]Ì:‡º„º—êJHÎ +ŒbmÁ ƒ¦>™›þ –§u'óÄÙc±V•ª‰œò{iÖ\SÖQÍUՒ¬(thÌ«¤gՏ>µÈÃ‘´CBBÑ8#—›â‘Ìt-ÌÂíAQ:Ummcôˆhï¾#ìoÕ ³Ç-™¢+Ô¶Ðÿc#£•âA^ï[^Ý<^Yr»*Å~èi‘¿eàÈÒP­¨íLi®Œ\èã0oøÉäêDÿ2M(iª |!øš]3 +JA¨ví„û§¸ºÀ1VÙ(‘ÌÈ ¤Î…␵é¦Ånìÿë˜2v;QŒ]Y\B÷úá.>¦qÏçð2¦É`§Uܛ(æDVԝNë_"w;0‰¬vŒÕ9¶|.Š…ÍÔB©èc¤+ÍF…7'_+#‚ÍéâèË"̈X–<ˆq·Ízšá‡ÏÆO`ÿJ•6=™ïš}…üè^µ þáYÖ£K,®óó+âçî§$)¥pMRÀ§¤qK¢0•.ƒMÎx^‘É[%eÀà›ò:ÜÄÂ05~¯©„ÇÙññKÚ¦ÿ°ŕŸ%ÛàûóÝ!ßPú«ˆw7r9 ùÐ)Á«çÎ'¼â§[j?õ`τƒ¤ÔÛ\¶Ä02Ûoò®ýÁ«0ó¾"e’,ן]†6A=Rt3$…QEº¨æx»ÙD!ˆ%EY¤Ÿ•¯" XfØEøi™1Sa/RR_u§L`ˆ +ŸN×çõC +?Al(÷P°†6ع5·š,Ÿbº’ "üqÌ[ h•úX3̉Q÷5åÓÂU¾‹ƒGk+©‹#WZâ"³_œí*j¨CU¤ ±Ö‘^ e€HVۖ ++ÍD„øü_ ×Üi{* @mŸ¿Õç5ᓆõøs1µ@=a_àÓÒ/…Ð=mjÀŒÚ×â¨EÙä ±ç^¶Ë6þºLm¿£xFÒæ<ð,2ËSs4ãL¿<†Ñ_„(?<¢©gP +òYb§±Þúƒ€IV~ÍWÜÐÉAJ'ÑØ7'™`?%Ù¯õU5²  ‹V8Ni#z-ᕅÇ9x! $«…ý2dãjÔá²4xo"z‡ßqÁADfE ®éŠ(cØZ¾ÛišË\ ³F£‡l½#&%·áˆOþ&¼h#ë)Ö”‡8àô<NÜSe-+› È ¢†µÊ*Ñ®— M)"àzK+!Ñì9)k{=D¢{d9‹½FËÞÁ2Èb\vÇÂi•¸¿ç#S®fÍ#Z’ +TXmC/0Õ/þ{ ë#HAäÕÅ l*ÉJÙL¾ù(—OÉ`mà}B»/‰]ɞªT¯ÁÃ$/¸¦†’u©@õQÅÍCF¨¨Œ8àõTdº¼!‡Á™þff‘ U`w­„‹ýoÑÆÍ +-òÉEŽƒ¿µX×®Ã,òwdT^GіÅ^6’jj+÷ÉP®»(µ¾U:¤% ²ÅÈ´TE@÷wé0…øDŽ. ò® ÊÔŒÍÛ,7ƒÃ•‰ØçĈ‚Ò7?áx­BçCnè~…½XjÐWtjŠÎm~ȃþýɑ†dè+!«ë¬&V‚χ$ÌÑLšJ°&¢ ¨ Üú°6%Xèe€#)Ñh¼z×QlYÈ n]†)y÷ʀ7¢ˆ­°˜©0åU‘mz’Ç`­×Ê÷F ý ]«)<_åï·öZän25ì¦S҈Wü(cN«f'Î D[7+0YÚ³W] ¥À &\ÈyS{:#¥©.A8KÿlAg°ÖNÅ(šÿéœÐª ÿ-Tn9î#‚â£ê ¹3­©jîB²ëjMdª\àhÖϵL¯•ç®ìŸÔ8‡1#ùmÕŽ«©ÎI6dc§>±@>RDZF"~qD‘C!ÒMÒ-#1ÛO•Óòûï˜yÆpJPf‰#E157õhfÔûmÄH*º8ì°À !™Étd˜aݎÿ^Xwm§4x©‰Æ·-Úkâܷªªª†ƒ¢wýJI;AÏr8 ^¥†wRÞªâ‹ér]Ï!fSàKyaçåg#è}Wÿz…¯¶H!0Z`Õ¢ ƒ´¹ÑÒGc‘“鈡le›Ðy0Ò©’UM^9yÆmÖۄà?ˉQÚ 1eåüx 赩5Ïpä<¥ Ü”ìU“~c¶è1Ô¨=O-w.“e}ë ¤$ ¿àç‰@¼ 'V ?% +³ …–”<‹1— xc8£È¦œ•  åºô„ù?q֓£gºã°yu:%³,™R†žüxßvƒöhdóz¼Œ\œûj^Q)P)5O\‚ZžùC(y*H¦jÈgw<;_:ª-“g+c¡áØþq$ª*›"‘àÕò>åDV¥°ðӖ_ ž—"tçZd‰}î¨wƒ±$…´çNÙ7*,eÌ«„»¦6J´rtóÜUÚî—, €¡7ô²È>|Ã0sº,±ÓŠ;2ˆáTü$hDà‹ƒŒæf?µ+È +²gŽ#Žaá7i`íº•ãú*yrœØ¨— õàcëN°Ö³(€Tåó3ê#áÇcûÌu13-óÂùI‚Ã=18þ¥yæٝ—Íex‚P«íOýÕuùV8xþ:r€x‘C%ì Ëù0ÑkàO*"‹Q<­ŠX‚ €OöÆ*l ÀŸfKøŒ:0…°n“n-N3¿híá«N»ê +ðˆõb5£8|B +¦X ɱ·ÍŸïh °û¯Àñl“YÐ ”@]þÛüö] óÿXb 61wBþŽÄƐ×ãxW@‘£q %žårðØOˏcykÀ‘JÈ@—{p  ˞1Ø5 «Gà /}P5j‰zÀŽ +×s€R:÷”Á`Iª’A:ôŒËæCËbHíK½¸ÌCÞL PG ( + ‰þHÞ; žùìkJ2bjj05»±íz¬<™ÚÔ6?hdø"v©(Qí¨*ïÿX- # ¬ »A™_ú2yAŒÏÄÉà(' uTdŠþdAGíÙ} GŸŒ àI1Ÿ¡áUU!àÔCu3{æQçöb ÆyËæŁڝ¿S»S2Óß{Ê  Î>Æ`Îa˜ñ¬F&½šd|¬Í)åÄÁ˜}F“õMd¬Ә+ž;Ò_>œ%“7܏äa)e†¬~ïòÌƄ¬êOÄ*Ê7¹˜m`Jðjûâ%kʗ=fy·û8]œÇ(E°Ž$Ɖ«ôîÈ¿-¿¡cûqKHëw..Àpúrž¶"$÷+Ï- öÎgÓSGàþR{ +)Í@´ë?1 +èpT ¯c–Ý@Ÿ›+Q5£ne­Üæp„qæy$ˆ yYì쨹ŋÊ6w‘\1ÊӂÛxµ³'S%AÄö€r™òZF«”q’Tt¨sÉlAÏâCZ'µsNõzQ®‹=Li ™8ÂÄ°OÑq#úØ7¶ˆl2 ¦¿ŒP “©sÌÕm\iUuH,îÕ ËÛ,Ԝm)Ìø8A ÎÃ勒tQâœè5Ø Kk¦ò6kÈdš ;xÛ¦’RVY”l>Vz„@0€DiÚmœo*ug‡™$,"Røt¾µþÁz0{‰sz/#³ôgҕYb&VUqhÞ©y4Pt„ãªb™1-ž’jf¥™ÒŠî¬vó•éíë.õŒìÁzºZ'¼¨ãþÔÈ ùžþ]Uu‰örYU9ir/qùŒ‹èÉL*©“w,±I’$ÉIÌ)2çȨ1u7s̉39I’€±:« ?bSââbuiH$"âÝÕãá ÆÃ#yØ$½Úöbã PºTâáX…CD„£Áá,PP8Ü`xX*m‘-î’-êøoOv–áb*-]–×·»ô•íî×n¯Œ×eUÕuiÕý{”³UÔÊsid8lИ8¢̽™’½vÚõ^nY€œ»êñËÅÅe͘™Ë¹3fmòf—»“ÿ¤šÌ“©f‘œt¯Õ wùoé'Y>]2Íy®>Ñå.›®úY]\îGºº¸ø2íÿ­í.«FÊ咽ËÞÅÜ¥qn»ó¡LÒÊûÿ3Iíò“ºÜÅ.…§ÿ/²K:@uŽÌdΤñ֞ÈøõR%½:CU·«·FÉNeÎÞöf­^Èý̝!G³vWtdr9—#â)ȄËf§aRrB¼EˆxøL—¤5š‹Øür©ï^iæXUUɞ¨Z1û*ã3Š¨RüÉàÙá¼éGÉ,›¨$ý3IP#0Øh, …¢±q¤7-=-4j*0@:@LDŸ dQ‚†a0 ƒŒ1ƀ¢ÌG ^Ö3]Ñ'Üë—P @\çó‘€áðړ«¶$dX2w$£Ð;,= ÁP˜qÒÄ͒ˆÐBìÊ <š€$Gs+wEdÏ*. p9Ê!¸„ä{€G2—!Ë.uT©wPÖ@9vàÁÄ,èTÎ; òwꚣYâÖ ¾åL‚µ‘tæyÍQq\tÝh g1ÝåM€ÿ2Õä€ûY܁T‡ïkñˆ5ºFO}A½Ó‹è_o3ôÿS×Þ°ËÿñÐ?ðMžkÂÿ ¶8”ÿÀø”-g‹Ì?©â´"ÿQõ^ü÷™”!‹nðŸÒð` +)»s€Ë~À™üos°Ó8âoIHÊÖ@zõ¥Iê_ƒ”þ!Ì·aþ¡?»‹T7‘{¥øëè…ïÇ üÃ*gO_é~ÚD+܏³tÕö۞’h’ãù--…ý΃®ÿÊÑl•Þ³cŒirA?¡'±Ÿ¦\1¡ùYXY_±ÔXmùk°&ÕRþØý·Wwì#ù?qxáøe§(UŒß…™+ÅßÐÂ|}ðƒ/ #C{úS ¢Åyzv§G{F§½‡Ý?V±A (ˆõ™|Ê} .ܧ­Zìöùa%cÛÇä¬/à3Ã:Ökäí€ïÆ>…¥Ù¯w¾¯ +“ìO¢×Ä>%͂ãUçM¯OaæËõü"&µ¾]&XŸM_Yý/`ÃÕÝI¢¥¾ «,ê ¶ƒXže¢O£b¡ÐX–% ßvÙ²þK²û|Ɲç‹é0 VŠu>±ÄœïG™Øü)úŒ¦ù=Š¦”h•ùV*e?ë;”þd’?ÍÚ‘ßâßh ÇùY÷øõ—1Çç¹~À_Åh|¾ÛaãóH»Åž–+Åg#P‚…ø¹ºVâ{½Œ¹Ñƒ!þ7¢$ÐØBÙ ü¨¯˜'þy|ö èrþ~s®2U¾c~?ÈqÔÒúI5ÉÊgòàÃ{â +ž©Œ&ÜJu÷Yí/³ûÒ­îñÛÎG÷\˜~7÷¸9öz’ûuìx‰{o;¶âà>ᘥҞ C ¯Lhßõ¤3i;{ø³XÐC Ðϳטèç»ÜýÙCföqJß)ÜVÐÍg±XډšW·;Ój5Š)ƒmXÈSÙù-fNi{>> „+»÷Ï| ,-Ïf€åý×ñ‹µhYÊZAp©ÅíÍÀ™¦‘/;ƒùQÐyÈiz ÏsH¤¤½!è㛿ÖðáːŽ×öP'J6óáÈzkã¹®@[)h¼fž‘ñ·…Ƴ›f§ÖQ.>ª¼w¤'ìÝìoI …b‘ å¿wƒ ´æcuÔ¸²çMí=ÌÞÐåI~6•†g‰‡2 _}´ÏÊé=}Í3|^žØ‚4aۚ+:øäô‘Túº† ÓQžAúdb÷åÉK¹¢«à=—á|†7 (™2fÉU?àü«5Ôï}4ÝÜaüο'0Ñwzó8µ—‡LQ9|‡dï%{óŽ±z§+oâ•Xh6‰Q)z@6<ÓRÅawh֝††£î3ØáH÷þ$ºóÁ@4 øD>ï½ð£–"÷‚fóÆ}ºÜY,}€h§¡)Üˏ\À(šT®5})OLò‘ßkᢅ ×>'&ˆ³öõÁ Z˜l”¤~¨½N&3íSቴíήä®|K©™xÏ®Âì~L¤Xöí|¯]g ‚ŽÄôå¯ ì‰.>M¤ÐõÔPÆT`ˆ´Ջ¶ \”ûŠ·”ûF¤ŠÚ?ã9/—<^æèm@MꨈI¨.Ýú5¸Ks/H_LòVÛ*«”ȲZ×9ìq‚S‚QTTøIƯWëƈ %üðc”àˆVä˜ãM8ÈÅÖ՟Ua.²—mÏK ‡¹àR˜ôh—Ü[¨¿Ä{®8B…EƒLRɤ™ßi’﨤,—J?¡Àøx]—τ‹À¦zÑC-²9¢  \%QÇV©ð‚g2y«Ô×æÚþp¸°˜ydhÿÀ1:ù[ö ˜Ñ‘ÿ š¡+\y(\ .„„$S·l˜ :ªê/XÅX–v¬¥åb"ù†„ÐZþ+=Q»OŠ^ö».Ûù©]®röÐ;Ûք³Ñ`‘ï³Ê3xكÂM£ÉTBØ:"–bSˆJJè_¸Q^NhJCƒ‚¿ 2冢u +EiizJC«úhûäePYa'J qÞÝ<bZ;û×ॾɭßø˜}«Zvxb¡QŒ±]ȅ‡~¼²úÎgA*Üʑ<˜ˆ~Œ]ÜÆo’<ޛí.@x0Õc×d·IÛkÒ¿»8„L“øĖùqa=6sFG‚ir‡Râ\šŠ§.—"ð°aõ:—‡׈A%Ž#0¸|$zW—Ù¹‰>iö´¨ÐB%bÃÖ &2½F³¦„L¢7 Ç£h«Ì…þáëµ·o€­x®0)D8T¬-ÁýÏH}`dz@$K¾'ÄÑÃe̤"æƒvV¦ç´[È}ݛø!vÑ멾¦I è9Nœ¢lp:ãשô„î;əIH'Ø6G&nñI^ë¼òõo.Œ"aýh8kä ÝLòš\荃«-1A¬âeCxV€sŒÆo7Ò!)¯8xleÜ`*ÆbhB +ـ>‰*0œæeµÐ­Õ3»„»&*ê^ø­•SomuËá®»@Z Ð5鳝GÄö™ÍNŒêVm^L>Ieÿ„¹¼é™‚^@®â UÓB¨X8 +ßsÆë²á`%Tèp@¶A-H=û£a$±'Ñ%›¦^ 'ÚdþÞ7°fE}†;”9XI{µ)¸-¸`¤M>ú^4^”ÿ9Áƒp²S|(Éâ} 0Ø}§´øóìnέ£g; D\PÎ& 9«U¥Â‡–ã©>0öüæ¼b[©wdPÉԜX† ;„íõ¨œï¼ 3•Ù՚æ¸Fa=<¹ñ†a? `ƒ§å#Ÿw­!C½*n­¼Ù¤¤HÏdp˜q×CÉhï“bD³„ñ~«Súb¹Çãi«âlܟûïC×3ê+Д;5€Îe)Û ‚H·k@ÔcžÅáƒ'hJöð¿tÓ]\ˆ¡õp{WÂ,ùe¶´%÷Q.04bÁ§ 液·È/V i2+±Y´vÐûäÊõä¾¾c˜1ï–l¿—_<ÃTµ-o® +زŒe +)-dyv à¤ã c;JœH¯ ,ödz»ÎєÓPЋmø×怦¿ ÍÃwBçÙ.æO_+j\í¼*ß<˜Á:[÷ õÎs좷DɆJcµI/¼OØÝZ´¡7‡sk½å–cfƒŠ ú•ëé€Q²w_®ìx ösL’J³éCÊ´LX¡+¯Eµuvúãαˆ³>’ĸybdÀ‚2¾a¨@Dƒ§èªÎeDhòšÚ‰,°¤Db Ýk¿‰¸@y ÞQÁ.@’ qÙ9ÇEâ§*À0j7 +u­©@È%,35hïÌ/$ÌH*gÑî’l^Š¤v(އûˆø«Øl£FÀCBÓ•Ù-Œ Ž*‚+s +KÅ/ßØgò…c§S]“-S¥ö•·É.Í%Š}~ľä‘6}Q”ødƒ/ŸÂãÜü]·a¬Ý_Bño´áh‚u7”ge†I»G=ÔØfŽñѨG#Ý” ¾Ù €GeŠ;씢V¦uÒhq†Hû]SZ̒ðfÄIø 55@ëD¾`O¾Û¹t‹G@ìö„ñð¯ëÙ­8x2­TÌFÏÈ$ªºLa£@.ˀ`Ÿ$*R9Jp ÏwBèÍò›$BÈٞÚN+EbHԄ¹ +(Ÿ)ۂ"è*=œNnxFs^×-?ê“šÈöxM”¾¨¯ŒË<-'µé<+;@BÂ֊ɐºÉ¯1Ù¿‡±²\àÞï`+ I€±…¢GÛsŠ¸ PŽô”UcìPçñÐ6~5,UWþLª~Cˆ]ŠÜâ"|hÑU2!ÿûoøc… ¦ØÛª+Áåi˼ô!Þ ‡x‰ j‚Ý{ã·0厸•ÕmS¶§"èÃçŠTF(ˆÎW͍¶m1Ü%Cˆµ~<«I2cªg…t¥¦Bz<¥³hòƒ+ZdKL10ã¨¸@º;.%€ž$ɞ V ±_ÿC’Ü^Á˜.À›Û33â(ËÍR²™ äŠþü˜YnˆòôÙØîhI»6ú‡HZWnj +sÈæ²B¥!¼×À#*›µMÝ÷a ‹ÁWM1ËÏÅr/}í¥©C™( “~u-rf䇴fyƒ¶Ëî5eè?ÏtFÛY#þ/ÚMÅq­v@d¾UGÙª·D6õUÙ4„?¤L[— …ô+Éâ{»ò©DŠ7(ŒÝ€#s^Ëvç"˜ ˆGRL²DG t¡XV³š}á8?‡1–º$D²3ƒDÉk0©o-Z†§”´ÀŠö ¢A<\ö7Tq2Ó½¬O"MÝÊܵfšNÑ×IôÀ©Žú Ù§¿k:«ŽÎhüã±øØ:+¿˜Ð’̵‚ü„bâŠ"£þ|uøÇï]µX mæڥցè†D£ás†UCM jHÛËw”lvòy¿“x +<U?݀ ‚¼©,˜±¢Äi+cö5qð :~á¢Ø­ßú6ávŒŸ¥/ožžyÞs~1ÑvÓZ[üBã±ð#Ü%å6q…ÑÐzϑÁ×À#$<Ãëø÷Vƒk=³>tÙnÑHñ¯¸-:_H(EdQ\õöHF*ðD»ZÝDuÈX¢sC¥ð¨eGÝä®ß¡Ì¤8æP(½,VK5¦Ý7C‡zp²Æ …yÓFÇA‘ tf!*ůÖû +e±žèÊï*£êØIå| òž3zcj—IRË¥(ãûgZÕԝB€Ée&(£‡VtaãFEPøQNþò„„P…èÔ@ªûårTÝ&Ð)ÖO@»¥qþ2C™¨`|&ËxÒëíZñÖìxí©®ûÿ·,ÎþIçýùÆiIx¼Ì&XµÀÊí3U ‰r|úÄ*âóyÊ°¯”OÜ5jH6`,&›jç„@ǀ~Z†B½wÏÉâëmϾ°'TðG{: R0Ôå%TA5yz²¬‡?z²‹zö<á¨\Þ<‡ çò¤Ož¸ç–5ðÎ +0ØïhÂÔ½ùÀKoÔѝ€;»ÃIÌþBhšnþVÞtÅzL,S¾ ìM@z ®÷û®ÉñÊË·Xly¦J!ÕôäpËfëBœFÝÏ;:!ɀâ(+­>ÓÃ90j% ç"Í5â +­Ü˜”M‚%DÒUäq2ð³¿eÿVîH¹áE~°‰4÷_eEE“J}ÔN ΖÁÂ.N¾áøy"/qk£z¬!dáXÿ¾ n®VÂ]É"Pˆå⊛۔‰²j"I›îTšŒ„C9Ãɱïº8+í‘Ä$†ÉX?ؤO) +cð$ ^I2Òʬ믔%XÇ¬§Í"!5~I¦ˆ{‘Œ]Û÷§¬hÜñ[66Ïn0+Ð>ª§Sö½¼bR~ð]™)a¸—a1ýëw1ÎYUþÊÅàÐ h1À I‰7£ÓBvãÄ ¯†èÎÄkåóéê‚2ѦøJ¦“”Ñx´7®e<’SðS†dkyò|ö +ìv¯¸õ`ä¤wÅaªqÝg¶þF& ¬±Ò—¬Kÿ¦¯»OåM$ ³+ۍ±6élTþVÊ6JŠÁÚ~Bí=²`Náaã¶ü5‘Eæ»ñ*ü\˜mæȧ\禙ß&4ɼgÑézÛ7 ±w" ª”$Ëå+Øâ!ø˚‚ZtaÀü@gɨúÚ$v#q³ šz¥ç#ÓÔ;åªz15ûB"lÔ]Ÿ×Ç|„J—a„€¦—r9³I“ð‘mpÚåÑö¢šLTqѳ¢-$Õ?KÄ=€”ÙÛ%Øð×ü2´~Ùd‰˜¸J"«FQ•Õ숌Ü!lÁVJ:`UÒü9+ƒÜý‰Oô„»y˜¦ÈÒSÃy°D”uSÁ–Fý7”´IkµÉA\Ðf(›B2|Õ'èÚK՝¹)?n¨-½!ìÔ[Í2…M}“¥¹—UÒjQÈw‘¯xș !è¨*ÐE÷é+]EÇ·°‡u#„•Ÿ[{yªÌ8e(Ûj°Å¦¬A1Õ ¢Ì§ˆ;0ú\«à7­¿¡ c)ϳˆkÏgÉ|^ÌÅ2Ñ~ ÑY„®Ž’âX +Ìۘ¬ý!¼gšeìß,`’å*åȍôœy–É_‰$Éd¦S/çšÅh€äñ=¾+2$þ©Ä±(q‡[´­«ÌsP½¹?nü=µ“Ô%‘Áü%!(ÌZ ΤãŸÃnLDd%a×£>ý~ÃÂðêûæ +¤èÇáIv(’Àx9t‚G´]G®í, JJ0úK;L…/tJF èF<2  +¡K¬“Áü]hZ—½Qò9éX²Oz&jB=‡}ÁžÂÈ#SK§K„óøÞØ¥ œöóá.äZ`⚱­‚âp Èé›ãÇ(k|xIâ´u¬hZs°àÑ¢¯PeáPÍ%”Œ ~g9žˆaµ£>^9’‡$jh MéW>ɦ°ÿèRwDco¢D1#q®“¿çÐ ã×Yv!FRl¤ D‰<›UÊÓç wáíð-}R« +š¥1W܆,£³F´öƒ +¨éDƒäÈRŽkæ‚3ù³Ô&“ ð3Óã!Ä;¬mUY4”ˆßh‡½4×±y%ƒÏÄJ²†ÀVn7ãø%qæ½Ü õhÔ¿°?–TÔÆcàý ÞI/Žê±µ“ªZH£•bºg‡6‰ù„Áÿꋟ]r&þ’F”GYA§Ë4ŠýÃúךÆöÌà9­ < KÓÞ{0;küò鋠3r´BYthŠS +·3t(¿@wRÒšdø]©JYèˆ\ãˆaŒ`#ÆQ§)£5Kôš÷ ’˜ïË¿)KÀ.r —@å&1!å4²j˜LÞ=’ÚUŒÚmĈœÔó­ô ƒè·ºš¸ +ÃýÕÕ.íÅÃÖ%&ä®ñ}߉¦çEP\E&ˆ×e̎˜¬Î©àcÝ„MsÀc‰ë¢E‰×Á?ºòÂ-$ž`·À®»Ó{±:K7÷( O—„4;ÚæÌ?³*ÖäþhSÒÀMsûé¸ødŠt±ûr8ªŒÒ¶ípâºxSœ*š4Ž¡Ña7°Ýã¸tD™ˆ¼ÕŠj×?¬Ž–|¾ôÕýVe*"¢×¢È•ReYA”âŒ8':8tÝvþÁ¦‹j>÷Oö‘Š’wšÑ“©4CåÈöGH'wŠ~÷Žfú¡ÛoæÁŠ˜?¼¾B³æ„6T‘qtyçäad™¨úmp~öÐÑéZ±&•4EÔ]iß^Å,E4T„0P¦`¥eiMþ7f4­¤z‘?ó!u@Ls€’1« +®h¨šÔ("áð!¦¬ÏšC ÉùpN¯4ø钸Æ<c¿©lfç¥o”SÚNÔ -°¸d%)ÆԜ(9‘RUt‹4V½ÿ L}CD~ÓÍ( +¬)Û_}¼*.¢`‡³Z0êä0T°WõF˜Äê$¢|Úºï f¿ÝM·þ–Åò‡ú S”¨¯^Ù³:ñnîr˜vþû¢µ ¦…ÚPfFs¡„½ç0œå‚£{qÙÎÊò±;˜Ÿ2´d¼`KÔ4ÃT⌍P¡ˆØ·<½€# S^³âDAÍvÕèÀÅø²êƒ%ÛÑÚñh)|ðù°e­¹>ÒºcD¯©l éÁ°¡„‘ÖƒQ…o”#X?šRýúSn˚òsó»UÎ/£Áß Y~é¹L`¦Ë×(ÙÙrÉ´ò”ã´/ƒýƒrƒÿÐñü™D~©+Œn1Ô9 +ºT1Åí² ç·yyΨèÐùÉ҂%ªÐµ +E£Téê .•Žq«+9Ÿ—ÆÐ+£_ú¡¥:ՎØ@‹jHf=–ò°)¨iz¢Úݒq¢Ç^å‚ò÷$ÃÑf|ªa…àïu,Ù> ÞG>Kä ô.i‘°¢­~í¶‰Op¡¾¿‘ ¹Ä#V TÈ.6tbCT€]„´¦‰3}BwqrÕf8Å_³¬äøCÜmŸ‰˜‚êâñ~ý+ªÍòBÕÒ¼æ'Ù¿ÿ.}û ¶B|8óUšu,*`Ù¿UÕ;V×SšïSŽxhSÕPŒìP4Ž#£ÜS0Í¢'ªK= øn×MEÝt©’ƒü?‡l![™Â¨[‘#ôá÷môÏüÜûSUSŠ™$¬ddºí +:;å|È\š+•ôM:d&É1-Â%Ïêþ’Q LÏö<®]Ə^~†Q‡$}Û_+MG–.¿à‘q¸Ý'Z…Ñäqô6’¡}™ˆÓ{>}P7dYKé?ßJ2—Ce¢µ^r¤Õb–ï7ðSÞog-%bÄ pHýùÿű»ý)ßÇàÖ:ôêƁ´8ÄÔuþE‡¸¤7I!.%L2V#\’Vä˜` .Aö‡ ßOúpÛvh·Š÷d†™åáö4yw¸š L.|?5‡ÛF£g +/õÈÄ8Ü~;7o¸eæïŸv̶EÏ׆û“&²#Ÿ­Aïo‹ïv 3þL†ˆàcMn°WÜðs7 ù¼ÂEú¼¶û +\ q}áÇ÷ùéÝaà^Þu'ª„DðùޛpMÇÞµ&m$¾„[Ž4Ù/ÔÁÖ.$—áÒ¸ˆØŒ8t¶ì7ŒÎ¼5¸Ó•4/ j›‰ÏšÁÕ«‰s”»·MN² L|ÊP${õ²mg©‹JpÛÔ¤›x³"VàM=ƒ%êÊã'rM~àâ¨;Ÿn÷£nàÞ5‹\n,ÓÜ.ØWK/Rn·‡æ[ ¸í9œ^¡VÄ9D`ÕHƒÚkòçúàÄ®¯G¸Qªrüßj@˜ì*Xï¿í‹Ìë=vøý[A:5tо]l£÷-{.Nùþ av{üx—«ŒÔ¦S{q㲑‚1»Oü-ZÞ֐½ßw iy‹F tYïß~mÁñýå%_ú­ÜN ¿gYö´œß–zYïä(¿í\Oôã·Ñ¥€¹ ¥ŠªÆµ·¡ +œzfhN¬6ßfÕÎâ^.gÙ§·=ƒÐˆÂ:;7kÌ ‚oOë_åo÷ÜägOÓëDÿïñxDÚg—`‘iàvK)¤¹%G.ÕÚF–0ÓcËG£?ޏQFØÔG >úßû ¼$ñs‚H¡!ë€ÝÒUGn …QՂ¼¥¶--¹²‡'̀?T¶ý%Òy5Þ +‡N[¼u%ü‰·a·Ú~x«q“þô‘y(¼å‚2Œ‡ZyGˆtÄ0˜—C¨ƒ®ÓóvûpÞëöÈÀ¨È4è Á¶D¨w·NtÞÕMÌ7VÅ£¸Û:ko.òÏf¹‹‘–{e©©OrÝê þ‡­ØèKñQP¾ö‚ã¶a%n«bhsLcÌ6ƒªTB ;E*®×nr½à¯âÛdzbþÕÜÖ úý!bÙ;ì­% )ÁÿÓ¥8l·¾UÞÒmdqÞÜZð)ʧl}§9®Öõt–[üÄq'X¢ÛÝ6.ÂpgÏxc@¤š[×ácV’®C¿â#q }p’ÉË­É. YŠ–[2êKI +›p8G”R’Ê +¹ r¼gãi…Ürþ¸Í ·ŽÁœüªD·iIr£Ž6Ã5 °£}ž”¾p{9´™pi݆¶vÑ_‰ÃyGŒ‚2ú‚¡ÜH½­ä—Ÿ· /˜|*/^<ѳ¶u§³¡ÜîýÄ´në^¸`º­r@Ø®ñË«!ÄÛr[>9áìˆôÂp[+–ˆàEÖÞ9+¥hÛ´U:ïGÕ4þ϶'&€‡Õ¶1·ã¶jXIÍ"¬ÍBŸRÓ"¶ÝÉ`¶ Ëð×Vuÿ·^[8VºÑa±*µ.—k+zʱñï“CÖÒÀ€KÞõlñN|}ÄËàÕÚ¾nŠç°Ñ\rŒü¯!ÿY/.ªQ9´…+µ•KÛÚvÜÆP[‹`©äÙdêXÿ´%Mò/ᇴ‡  ßçRø$ÓNÄ¿KÛµÞçUÚÞ½ôŸa%ϲ T¯9#Hlύ¶«§$͆u2émO%›ϡÀ‚fõ‰¶ý¼ÆmÉ5åÍK¬mÁ‡Xˆ²!Àögk;…bFPi«xà¦þ£ÞlõU,•²uÃ,8H¾Öf},}°=Т%‘…Æ-š4LöÆ°nIC‹Ù:vFñ*ÿët c·Ìî‰ÓÿŽb«&ޕ¨¯,#>痭:ޚ“m—ì²…^ø HÜøؘr:ï³7ôS3”Ó¼'Ûµeô@Å.K¶»AiÉuk:y$Ù®;P9²E«È”öýnÏlÈV°¨ûéA¶&Œ@û±µfº=kVÚþV³Hø„)ÿ¹¼ÎË'ð[leàõ½wõ¿¸ÚŠmEwUZÖ¦Øæ^Áb;(gŠ[?ÔaR5Ò [Õî 2lÁ&¬§6c€¶Õ/<«°íS°Ë)(ôo Õ ¾xCÝðkI,«(wÒʌ°ýîaßÍÙ*¬“&¡ˆ9ë­÷m•%.·[£³ØÔ]ƒçíÛÝ s¦ï¸_«»ÐñçÀN•òk—W¾Ò÷zà8Z1~§¾,„¹Ð®àÎ9ÝÓÒâÀØÚZ¾Š»q^‹žòZa¿SGD’ã´1^«ÚŸ«Ãk%âȕ{w¥»ö®‚ÀWj`oΓ]{@ ©9­ß\[]Á¢¾#2FÓr­{«‚ÐqUˆáíUA3Öæ¥oÃæ¸e„“õJýòÚa q׺.4\«YV©¹Ò.Ñ& 1sÐ*üÖ^Óï˜ìHX„Qom»*Ý&TzÀY»C̔¢üjIé@ä©('\µÜZX)¥W֏ҕÃhàµPZáÕZ>©3Á%’WÙ*µµkr³µ‘a–S‰mã¤6Lj¼‚Dˆ¡Fk {†ÖòFiµñ[8e‘&òVíž 0ô:!†öw—U›P™Ð¸ôìxUKˆoZy˜UµÂà÷bD”è‰<糇†{(iÐÈÍRê¬?!°%Õò‡;ªa¤¨–˜ØÆXsG±ÒM]>›×ˆ8õ¦Ö¶ßl Jjj¯]ͶêÍ:…ÐÌZÿÅYŽ©-m Ĩ;(|PõR‹²x¬è’ëe\òZj¥FÈ\©=GþLë[f°ÁIRjÁØ?©V¸Ó­ˆ°zØHUR‹‘C ²¬¹ˆóÑ»º²$"¸pîyœ\\uVÔ +p w¶û„¨o¢öà ,YNÂÐâDÔ&UIòɯ¯mv¶«Ú AeêÒVçÿim¿ÆR¿Kç`4õÓÒõ‡=¾¿›ÿ 2ÊÚ´ÌhÖÄ*¡×x³*ÖAæÒ¤ˆGÄÓö+ˆü'âf:o¯Ð_žímá1×hľvZÄ$¨-ë›Ë[¶N Ckd¾&)Þʬ1l?\œ¹Sþœ–~|˜ÁÎ;$µoA²µrÚ?E8ÒqZBDâPi°ðüV6Þï[ìÙ/E”,{5-%§iQ%Lñ r4­ã ³æ\”"™ií§ÏLT´å}ì(ø¹/§B3-YS)ŠÔÇiuüª‚A#+¡Þmàúûem¤›¢¹¥Íµ$¬¥=€ .fò³´rp)noß(–֐«.RJªè'&[›½[{`*­<%wÙârJ+&DŽ%Ïx]U(¥mO£”ƒg1¥„ÏQZ1DZnÍj6Úè×ÀÇ^¥·ñ²`fÝ3¦` +@Öàqd½^òh¯ë%g›­E °º§Dl ¬£íŠÀEX՜–¹9Ú\Õ ^„Ü ó–ì3à—Ä1˜÷Äòh©Èvýpkz ÐnëéÎý>ÍV_ür¹D%p\’_\ê ‹„ÝOè€È°zcÎÛF ¢@gùz¼Ãf{Ë¥»œç²”­Ô?}’g±rðƒ~µ‚Wéì“ЦÒD+Ð[cX ˆB@4-Æ©¾!"¦ì±²Ô:iU³ôÏJVnc[–ÎNÜì õ\òâOV°ÚƑEaŠÐÃìgáðrÚq   ê méå2š6—ÕéËÒGÝEŽv·k5kÄh®#š×rBÛñ ,zR ­óﶘxgÇÂ<ÿl™µ –z¹dªÜBW–ù`FFâÆd™+F÷µd%)ÒÿqJ¶MÇÚ × 1ʞ/´íïÄ]ÌØ/³_hC'ý[ou÷]ßK·Ê†•cgY@+§¨ÀZ«!ä Z[ j&€vhC:g¬ì;“_þg'L[Bn‰îcÃtäÔx»?+sH,B÷4¤õå¡Ü*ápþÂXF–³ù©ŠýkÝm%…tÞ\:ω²Sΰßg¢É`è>Ï®V'ÊÙÙ·!ŒH*t‘B uF/ø +â26}–ì°7 tbàf:‘Æ:ûD¸Ö!â}¼— |¶ý =Zz‹Ü¬ôø,=Œ±ðY!$)ß³ÂÅĜÁàíY £Íž]b톶¶Õ­7ül±.à‰“"?…îj«g5«]»ÔPŽSѳÍΉû ¡qJx7é{Ù5]UØÎ>!Hç{áͳ@Í/Ï®êšAÍ*r ¹úà'ÐÅ¥àþÞJæÕ 4- 2q|w¶ÁÌ!É úXß,À>šë”Ø¢¸%K@@…#ïîkHÉ~jñÉ{æÆS’džÐ­ôCŸAáu:[¢ Kg* ÑÙÃk Ÿ ‹{&¡³Ì[8Áۂ²ÍŸŸ³ôáÉ®’ç–mxoÎÖ+ØÛ?s6›À\±pÀ ú6lá5ë`\ޏ©qÀ̪œ­,Ån•Äý¬€MÈ×Í~¦ä¥Ýl…Á Y+(<™ÈY0ۆì>΢¤Þ6m¯$,Û¾ÇbþÏè[Ò ÷m†–žy~MS²Ê•@AájÍðh#Õ”úx' 7gÞ®uK¬BØãX}Sœnª_1¤?¥’ØçÜ+lvõE¬Í§€¾L>xZsìwÛÁG/ÝbKbyL»0"aLx:“è°ý͎ D<×2þ*ìTɆUHA¹íä·A4è<þ*É®žzù'e0Iâ7vœ#e±J|¼BÉ6ŽÑÔAÒÖ(+ìE‘ä¹°àA@Te‰vM‚&Y,Åç'ë÷DÙ=èÔVã¶Å3G]á²îkʞq§P¶ÖcÒ lO]Óç>þ'ݘF÷J²>6ʙ À*Š¥ þ“EZjŸl B÷d{¹¤»??Í©ÚjÜÉbSgÌoŒAÀ\bÐep­'šXDOî_B—-;“"Eb€9Íߘ,–NVòh*¿-R˜¬T¿ýÿ<Êp嗬x¸™ Ñ\b´7¡~!†6ýŽ"-þPÏêѓ,*‡M²8E ދÈæ%}é¿w8Q›Y"üNc6’d»j6r«Û±H6b™="Å_‘…=K¬l?Cç\Z#»Ôè(fdS73ìåm1€/²Žb&|‹Øß"+½4Ûc®R‘0TL‘ݍ‘’4à@+¥Af“¤´±X”®FQùÌÈ©Ce¤ëÁñc¡‹9书uÚyý4Œ¾*A¶óWԁl`òR%Ñö¢èyp~oWäöYܨœÀã\폲) Gv‡”ÁÎg¦Æ +m²T”}fµcír™y!³Ç™œØ=7|"›(c ®ñ±—,žzÂâ+ù´_ˆ@d¯yxÒD–cNÙìÉówÁ؝߫ëX´éGFS°FêXkÍ÷m“×7‡¹§36n[õVMWßç75Çf¹‹Hr¬X–êH4•9~}ó]«!—¥†zÈK¯é¢ŸæECoƒÁ”¯”pèdöÚتƒG²À½îAåéÕôãæäõ‘Б$s$SöÝaÂǪhØPn;†'•aÏ·¬•§Ê>5Õ#Pñ'b«ñ¾5UTÏY<Mö°a&~}=`Oå·û+àþº9NheôùßëµÏITÍ„9 8É ”o—ìÍÂ،÷EÆøY¼êR_ˆ@nL‰“±­ÔŒ$9]†ãõÄ.ÖþRë/;kÀÎVW øsœXºj¹°Æؤ˜-*8 æÐl±!É=@ÄJˆ‰±]4,³!geõ„ç°‡g¥³B¹yäat+ÇR¨ë('šhfu±éü*W¨ÞÜ`Ô>Kñ¨vGÉÍуÐä'çØ&ö§éO€ó—˜F¾¯Å…&FE‹¶vŸL¦áÓ!rùm6Õ ü’/m¶°î–·å£æ®î®œKÚ_·Y`Zaʾ4"¶ê㬍¨;«°¤tÓï(a­ â!KEŽ­ à–Âøb­Í—A|f}Âf¹ÉD!ҍX—°uVS +A–ZiZ–‚ÝN÷¤Ë7bƚHXàB ÐísÁ:«„˜CÍ$PÐ,asýþó–íc¤¶ž#ssr¿Iú@XNM°&=NÛ»yž-Ç*…¡H{‚Aÿdâ™ãd|ò! Þ # ¶rƒYž„/A[lÜoێSÚ<};>( LaéÈêxB{{›sác^Ïætù»ŠíU¥ +̽F¥°œZ´Õ«oôÏK°®÷“oe©o|MJ‚ÍIIG° ",‚½9(¡>í¤”ÁÄׅÊì¹éÖ.EÉ ¬ô2øÀ€ý=|ýEE ìj3XgQÎÀªB¤ÆÀÊ%êRÒ¹>Gƒá´3V)(M”$ ý{PF”dy O,Úܐ©5亹I¾»—¶N žjpˆ¤ë¨Á5¨Ìûù’·=ˆ¹i÷Ø`]7m{·#Ý7›¢kŒÿ&Û`'Ë“®¡˜ìà_ õ˞Ü` òVÈV×DïÆN7ýD‰Ó.Þ`‡±Ñ&ÿ+´j ¹­FRÿW¡¾p}Þ-â†1Ø-¸“ê`‹qËb²%¸ƒýœZcÍ"ùüYy>íÁÎÿ+å58Ï÷/• žÎöÁÙC&î‚|p•ûø`•:Tgï€?‰%ÿd™Ù°ÊDáü2¥a'ÑKƒ4™ˆ‡aæâü5PøÁnñó>˜£ø¯ÓÛp¯ ôƒÎñ×?ÿ`š¸üÁß7?Žye°À[ðª®þ}{…õŒ]Ù¡!¿°Kõ+½‘ŽMþ©ù>› Á:èßqÿdñÇ6 œZÀ„="ÿ¦a#Ë¿Eg°¿(ë"ù•(WÈ‚I_Iò:náò¿6 P“ ,cƒáò ¿’Eÿé÷e^ˆÐÿÙÁ‹µ!}.hH$ôo¥\_é—wn3Ɛ ÙWïY+öõ ‚l"Ì__ǹÁ³7‰0OÄ!‘°­¾N‰…Ÿ~Xêëßõ€+´Ž¡ðGCv;̄Wÿ ¨>†ä©F_…¤éN#¸x4”3ô砗íý½©–×ç«wÂÁÎWét°ùú=¤¡D»?cðP`hò§Áû‹}¯ÿ~(l²úuiýí,¯>øüۓÂ%w§‘Â6¹?ÜJá^ÕS˜ù2Ž[_ûÐÚÐfПÜ×ÿp>í"|¶Ç°5¾ÿŽÑ×x Œnýý   +‹ã¶¶B¯ †· ì.€ÿÂ"|ü‡[^÷.PáBIHæßèfG@q„00@ñÐëäå*,õ×+ÍÒ¾/9ÿZ'+lL·Ö±­.æ[á:®°=tWX·84ϼàÀ „±j‰†°ðkT…ÅK0u/k^Åsàéÿ’'eŒ†ü͆‰iasÂ?ôM{K®+³Ÿ¼94 #àëê,’øô„ Uì-_‰pÓèYVy®ZÛÂÍ·óýòþ‡†¥pð²>¼«Þà… Â"N˜¸´ƒKR$¿€oü•ÿ¶·(Ê“âwJûl³ +$ªRX<ì-`6Üûo#Ü£ ; ç=ãAøœ–*€‹L8ßÐK?Ãà++ƾÉ@ù„Z;·ðþͽ_\çíp/[òBƒL7 XWc÷Ñ: ¯A‡\³å÷^—Г/¬?¼ràU=Ê´þ®  ο’âí`˜ÕçÜ4KÂã*ßõµËÏÈ ûÊzg™êTk–;ŸÞ €ý¡ñþuüñ¾:m=élX­ŸÊÓ¾]ùÌuÁn×¾Øvõ/ìú^øTÃ\_öLíg#_A‰Gy™ðI†&pÆ{€ƒ” Ö²kP×$É®úÃIÇ®€Ðö§ÎaלPIZXï+Òjn ¯×u¥ˆ¡°¿–ò´ f8KŸö+aêÄY/D˧®ÑXh‹¡A­Œº†b‡È*èЈäØÅNWo6]¥é°]HÙ¶Zë[C€Fë¿ÿÁq%—ÁøôÂARÑýr|}fŠ\íVþ)ÏÀ‹Øõ ä‘`V̹fû&æYƒû¢çÓª2×r56æš.Ád‚ á9W¾Bjø—k ˆ‰$V¤®ämh¦à·\ Z€,W`zå +Óòª\;3§\õëe”+X}rír̚\5MoE^˜ú-ƒ’\£ì¾ðr®£x<Iwúƒ?ª[ÏAén\Súã:þΛM¬qíIVن̼OñÞÊw ýÙ\ËÔâ¶:÷WåJ. ª*EiŠkf9jËÙÌí%®AØF\ã{ÅWÙw?/Xá*ì9gÂÕµâÿ"\Õ!JHÛ¬]q~«|·ÒNŠYv¢)P§mÀUZdà*ªn³U&±¿GÙߺv cR@eDÆüVli÷­@ƒ³¾UK]ç[oʍo öÞº›¶ÁôŸ‘7WÕ U?§W…·Z‹Ì÷»µ]l”ríº[†×v«V³[oÆxÝ +&A±ºu—iÉPinuè¼iÑ­zñ…ž[—vç{ùÖÜ*DL—[ùƒ–Ü;ñ¸UÀCÅ­Á%íã(y#y‚[¥ €Þžà1H¼ãëèèJg¸ÀTmR˅;*É«­ÕŽJÍÖI«°ÑŒÔTxñ¨Ùî:|Ï<Ç9)Ä´:Q8 +‡‹O@…«W“°ˆ”Lž3”38™˜¤µëõz¥^{måÚN†ÉªªÊ¬Œ‚,ûÿ»ÝåáÑå—›­–YUU™YUU™™UµÊ¬TlP,[lMô°ˆ‹±%ì°W ›X‹_W+Z,öؒa;íaÛc±ÕÄÛ´{­µX,‹Å:Å#H€0%™`3&ØLɌ'\Œ<ƒNŒ™:¹É~/‘)çáTIí¤žP;x‚hDt &T&L)³¤2rI™ÃlëñŒ™™™RjQdd:#Ö½*Ä"ªf;•)ÊÉUçebµìq' nÙ>ÈÀ¤¬ Sy9£3v`Áÿç̕託ƒú—ú¹·¯jÇ-­2×k¯}¯¥ì¨¸ÞÞûû¾Ù·Þ7ß÷×ëÝõt­ ¬t½^¯AåÚ÷ße{³í¯ôÖõz¥ëµo]Ãð&›*=i<““#ffP^ÞE4Žî$Ʉ?$Êá5æ(KÅFþ ½¼HuBN&ºË„“N¸2i—Ã\$\Nï:Ø4ŠN\C¼êj`m3 m((7 'f%C‡²»¢ƒ mhé1;HÌÇÐaý´À,/ýÑaC-èCtHt@‡áÐ:€à.MUˆF¢¶‹.™"@9©8ˆH[åж­¶íûlßal²=w¸ƒoŸG:33433“st Jr #¢áPª½ªì²ª5ÊÒê&,Œd9~ñßÁTâWÝáD·ûÆýy¼úß-bà0 ÃWçqp—á§ö(QuÒ +ït8‡“ªÃh:Ú +n³¨H#8K + o"$%Þ@l¸]iiÌ¡¨$ÜUpÀ¢`DCc1 Jì0@ f.lP´’0rxä:W¤¾æXÀ†"ð«Qûæèk +i ®…cg3ô)“δÃhR ›ÿ#`Ÿ¤ò)s„ùQʍ­øæþbÐ܌P44Œ´RÜ뀛ڣ–÷Cé‡Æø[^> œúIÊ-ôq4tL-CÃW{5`+P.· šÃ˜ï¡$þøðÁ{ó7wEotç÷$ÊükÆ¢Z)]~ƒPéa¼¤‰Ý‹ÐšŸeîÆÙ·N쪢ú%'…é—¶ÛÆæω?»/d÷›•²:ìq¦C¨¬ýÃâ׈áÎpG‡Ä}Ë<“]Dé1le*šrÊÝ]†¾ÞÌ¡¼\0A=:X‚L̅øø'I3`7&->Fƒ»>š(·¢ф¬mÛÞM#:÷Ò Z!—[šxMâôh’Ǧ)‚’ú©TâT‡6Fl&®tARözµœ•W§bÆ&£mÙºÝo⪦öœÊœi"¾¥©[üÆ|‚µ¤|V@q2o³vLÝÚƬûÄTE'âβ Q*îaâuNܗì~8¯ÿÅ'°Ú—tPžA×|˜!èW=¡Ûþ¾$<·¦•ãDÉ®i2G֌Þòšªáx“6é°io”Â3·äžû¥’.›€žÒž™ì„‚cò±aìOu‚¡‚l õ¬OqÕ´O'ë +Z!Êô¹å1®·0"g²WR’¡èÄÓêX„¤Cé:ÇS¡“qÎ|vYO1ÕCw½D•( $NbR9{6‘i¿\ü‚¤²¬ ØÆ3Î6‘mXÀª8¹QëòIGŒÌúâŦÞ÷3bž6ødvY¦"”`pü‘Uå¬N*Jñ›ÖR²Gi’@iÏ•K€èÑë_„¦ +ÍBl¥.ïu$jqIá6ÅޙµàŸÉ W?X¨kXp}õ!g…;ÊȒñ +¯ H€°;Éùô­…e(nur±8»Ë[5[Ó棁RR Ñ^Út %Í @Ú¶õُ0R-P̛Êì|2vk6=iæôòÄ>ïˆÈz법ӣ¬Ñ +ì÷å( ¥Q`3ÊH´(êù³ìF,MY åbÏÀ¹déÀè£`ò‘A'$_¾aX£½×ê©xÍ3ΰ¡rúdl¸wÙ¶Gˆe;qÁ¨ÀœD‹&??퐛ƒIƓ¨í≥™ À±ß…m-§£¡xÚ©“ÐÒB½‘FÄý!pˆ\¼ ¢Þ߇óãÛ©I´õ¾+V§ ¨Bb×Rþ)W¾Òɽõ!8íiÝ]@ë󳂴ýÆÕg×iðÆ.Bœ“`Õ “ɤˆü°ë o9sç GýÊ:ò™›¡UÀK†((íç Aص>‘À„P™3@1Ç>i¨Ä|s|ÛüI£=Oó³4þz*e‡¬¦† ‚¦G=ó®S^ÅB¦-/Shr›©!ÁPò\Ž‡â>z=¦‡;Dí3xVC“õ¡]Fj ªá54^ý8j²¾Ûð`W–uKˆV,ÄÚSt·ÊÞø9B„ áҋ¿åIÔ«£˜þ‘ÍøÎÙiw_§1UNýÿ +Ìx ‹­4á˖}š]ÁˆéÐduP®FÐäTìtMkÑOJ +‚É@å U³Ùlq& ¯vd"1ߚ.#å°оà§è^ǼàЏÁ`¨C_òì"[ŸH <}"àõ±ˆ¶gG̱|‚Cn¤Ô4&o—½=cób8jæòîW#9³»¼Xÿsì`I'SÓÑ¢qsþ0õ{Çw5lx³O.П—³‡›­1H»áÂÈDPäYh†7÷F¾F(!îpÝÜ`·¥±ø_,Àåo(Û$ã1òs¬×¿±ü §ÙdLÿgöO´¶.Ïñ‡ÊmžŒO6=ô˜]vWšw'Šhµæí§@D¾FV#s/âÁ9å´‚Uijp&­<öëLfe}K¨ú[(=I "ŽF˜¬] +?j…–¶ÿ\„¸æ~ Ñ"ĖPØ«í¯‹žÐ9&E¨ÊJ'e¶"Á*D쇐ëñò?f»Ëƍ$ùå[±Ý¯ÕXÀ¦Ò..¬~ i°¦[}×i,Nä›FÉ`· 6HAÄÞáSÈÊÅHLÈvA2"ÎÁ¸Ä\ ÆRY“ŽÙ.0©]dÞ’êœû1Ò«º°PB$~¸ÀíîÇǃ¡Pbˆ +Á%‘~üøƒöþ;%àÿŒú0•òügÛÔêß1Âe@~%î‹Ö¤Þh =fñQŠZª2Á?+™9¬+ËgŽLÑB˜YÀQ€zûo`¥4kw(~@ïPùHùU°ÁÝ~`É>›ÃÈ©(…û^Q¶¨àF Õ὚Ø3-mæÜB¼Ù³ ê®B¸Ù‡T Þ›¾ª-˜€ä)|¿f©Ûûƒ"´u¨²ûje,Ÿè¾•9Sæ~œ©„ñ±¶é³ü]€£q€é™xð{‹ÓžÎê_ހGö8"È@ËoÔÎFe]Üe_Jâ?ÑÂMäC06KÚJ8‰¯%•‚ú‹ŸÑ?ÁÂà`¾Ã XÂd …Ú\_ÚR¢‚¨æA5tRt¬ìH¿OÜÀ¨ æ§cê’=þ CXÌ ÷–ÇÅÁ+µÔ…¢\Ë=‡aE‹ 4ƊŽœ„¶ õ÷\¢R±˜ºD8©<Ÿ­§Ò·ÆaŽ|dGža~ú‘$)·Œ€*8ŸÍ'Ýl‚ßì<$9¹²¦£A vj0èÍcàèaïýáè9åSS÷€&qs’ÊaYK‹‡§À-¡q{¦ö=::Ø^¦s‹$‘[|’Áy +?ôÑl†£28£¸àìÕ `$yÚMFn…¡Ô´îç(a‚ûƒ€†wx­©˜y€ô4ezÊÇÕxFAtÌÄü(Çé[»Fe†áÔߟàG®TB)x§Ø+xvˆrVš‰.œwÇ<—§ûk ûõº¡©Ð`CL~k,í&ܐpÄ/ý©{ò¦ÿ}y¼ÁåÁ GYº£Ípm¶ùï;<ãX‹zÊ®ÛNㅎE4­M*tC‡9K,ät1/ÞºÈ%™Åڅ¦an›r¿Íq*T£NÂyÒê”Y¶Áüš&‚ks¦·:éë½ ,ӇäûàPø]¨1fø›IªP-?AÅ(RЈÏύ‹ŠÑ1|Q0cÓ2¥ò£¬ŠwŠUØ +ñ0 .ªŽ¡ÅyL°ôÖ0)>EX‹)Õ3ŽïþÄ#øÃÂ"….85eð¨ 4’ˆS1¬Þœƒ­â$ºs„j* D^;<{ê:(~‚º0 +ek`š5°‰®Í_=’ã‡`§~ ;•!mÂÿ2ÕÅ@ªøÈ}R,Åkâ12ñ³à¥Ô8…QÌçy7‡FJÏZ¹'dƒ} o -DÙj ¼ÿ¼ÈƒA—÷·¡ ÈSô Y®™ ñ´£~Xé™,,ɳZbV°zJB¤3̃} ³Ièà2\X٢͡$;Bz¹”‹tð2,>PÖ¯Pýo;…bÄA>OLH¤™É2’QŒ•\[†h^a€²ô°¤Éæ^S)¶ÕW‘ì• ŽQN^àÈi1-+šu¥8{\ܔ—æ?¡ï!U @ß@=–¥Ñ#«Ú©+U¡Bᄘ0wèÃ_™Ù±œ(Ãwöcó)m! Ç1îŒD^ŽW„eË÷ùù©u…ÞŠBÀÐ+»Ó‰Î¨ dJaÍò`Oy9“ß˹¿V‰ÙyÛ8ŒÊ•!ÿŵ7z(H¯ôîxÑ­Ûs#=äãšè[TbÂDkLÓÜÐۉ‚ i‰¥eÚ0Esä‡Vd¥„‹|˜mu~®80ÇZތŽ“[Ï +LG¡ 6G@•ñCœÃÙ8Ç`õµòÔ0#i{lƀòõõ¬úû±ú2†’q;‰Mð1¢Põʼnâ@¢ÃÁ–IsED‚9’ŸuIñM†Í²døöHIłd,ù(p$¿ÙË ¢gAfC­WÉ·}¿“·PƛßÛaüiğPØgÿÿM”©3‰oÜö¤[¤q´õ#’Êü{ãtDƽ¾ãƒ}¦ Õ¾›øâdêr"ŠÙ R8ññDò«·01¤a1ç$âYé ÑBÌû?~Ÿ®Ê„h=¿ë !B˜}W4KJ"äýqÕ'Bå·?֎=óùdÜ8õ) vÁ»ž²¬x¸‚8,z‡Þ7˜l;jÆ.Þ1¬éÅ3+`^Ó9\˃ðœUèß4“#ã³¼]9¬‚qÈÃÇYj8L¡|ÃØDV7L£p¾MŒ]©4åZ¢rØRkï ãÎý Ë0dÒdðÅacÜ0ü¤²CVe|"&6.8Ì íù°ìƒÎo(!ЦÖ*÷ÂÕ۞öC,EÏò±757CR9¾B¿yÊÝ +msx ¶­ÂÿÁ¥Â[ „õ=1Ù |.…½ó`àß%‘I|Œõùêªƒ× OÊ'Â"øãí]m„¹Š ù[jK¹/Âð#'h݈p²”îM9Œ)}-ûA€ÂUÄÃþAòŽe}0ñáëG‘<ê±9xûŠ¨¸sÈyð[]p@ÜÁӍþW'£i¡¸< ÛÔÁq®@VsΎÎþÇz‚wqã÷pã(yàXúz– Ö¨‰£Ñª1Ät‡Á„¤Ððe}ÁÀ‰Ý¿ >`݂äŽhÁè°kä@}ŽM¤…¢àpÛaÐtHÐ ŸàÊÁ½T@äanE¸A±vL «zdŠ`¬äpË£)J9AðLÓÕ¾¶8ü3óö¢éÅjý!›ÁH°–AœžÔõÁ“L´’Å81Ÿ)ë*''û2$£ü +Z]¿ôª^Ÿá.ö5ꦩ |@SÏ!t@ò=x3¶ÇÌNvØwý (ßûƒ ÿ¾ž£“î0w²}¸ãbV™ÿ·Æ;€n¢¾ÒÚN=¢ÞÆáý2hyïAâ1ÅH¶ÿ!WSàûokØÊ@‘…ÅíEÀP£éuxŒþaj*ٌtÀÎ_íè쨀Çþ«¤|T×òç[›ÇŸÝéµëû ‡ë~판íg'ÂÆZ™ý¬Ó}vý®¯Rõ“…7ƒé7ϸ²åUÑÛ þ†¼\ š; ®ÿZ_êDϧ #@;掰uOG! Jñ‘NÞN_yúpÇ7Vºàn‘?N¾àOҹɸ\>Ó ´ò‰Ñ·‡Yoʜm=ÞH¢NãO>ƒ)Ðù¹{!§îy*|N|?… +øšìçáû–^ácGtfƒ/GQ/[¤yh‹÷ÏÍÜÌml ïYlU–¡bÝÛoêbs/=Y”÷ä9ìX8ø۞ÀtÖ^R±81útÚ³Ñ òªgO8]Öe/ÏJÇ^%:ìq?Äòõ¨=8Ðõ–íâóŽH4×±m=;Y•œõn]r‰á½zݼ§§èVUiöûM=¹£^ÝÜSôÇ}Ó§§yBwnzS[\üœÿ¼èQÐã!ÓÆÌ.T õü†L8î?°¹‡‘ZŸï¼µ’öæÅGÜj9ÜDodK·OÜê|y‚Ï76·¼¡.éuåíÅçî®=@ ’½yýêú À±¯?yò¶¨¡¸àrãýmˆ øtž£:ˆ/åj‹'ž¨“Šˆ—)Ž›Ûº<±…ç×¾ÔoœëÚ˂óþTZBìMÛ¨ay}1QÔQRälÎKÌdÄ6ÃÉÌq_åçT(í4»£Y{=-“¬_µö;.¢¼¿„óªŠ×=*Þw%Î;ÛÁZ>,LzùÍ PòÖ"›y»r‚x`yeį4S†Æ*äMè{Á±EjÛ"Ž;ð­NˆèÄå½|6pU'Xœ7²cSâ­¹‡ðp,õÖ2MÐ +‹EŌóÆ^Yْxa,çF=Ay„†ä°ŸRóù’ˆve͕9cR½ûiaÁÊ}48Ôã¼Ý°Åš©·1l“ + ®g$rÞ_`‹èg”¼Œ±øËÀb»ÔÁ“×@•ÜÑŸÓ$wØÀ|Õyÿ²;!ÁӅð¢<<Ç\¹`rèÙÿ='žGPã›Î"YR¾œW-„ làÇaå*1bÞ8U©°Þ Fxè3sÞà."É Ž^èØFçǑé¨q/K¦"Nƒãd1J”W Ê9à§pEϟ›Ó(+ûCÞÃÏðu§ò <#V†‘ÞN‘€ÿŸŒüxÂ8y ´7_p›—„”ÔíoF§Ñ(XsyÉ +©êCFç¼gB€Ž€y»ÁpTåÊtë¸$Kà~,ò°k”€qéóÉ£Ö"ÆõëÁB|ÕÐPŸ  ”/heP€.®)I.ÎZE€»8¬Ü\¡¶Ê’¿—*9S¸ÑÈF£¤-UGƒóƒK>m8¾šÎ[ +¨ÞƒÌ+(ÉÄPBæðÑXÐÐ<»b•G+=Rd,¨íPîhpę©à-zSW«:ïº%2‚ŠÝ½(·Ñúy£® ðG§J&Óg‰+V×yY|8Uì:¯—"Ï +D‰`$+þ^íg¤çœL^ Öö%}ºÂÏÍM¯ÞCÑÚü~b–IX}Tg-;/m²ãtƒÍ¶.)j(QîÌûä9ÜvKJÍ{g´4Ã_CªÀ– +П~vÔá\«Ä±ÖŒRÐä"\C._ I»Yl¦Á³¹C彝w…å[˜²À™Ìªô@ƒ„SwޝÍ`UÅLìòÉ¼äÕ9ˆçŽk™5’Ôh@Ç::žœ±ÜiDø“À8ÂðAŠ€ ΍_ɞýX½Û¾w¥vÑVx½¤ §jÌ+Þycj–ñ<`Ò]‚–qÆ¢Æ܆>‘‘0S©ª/M ~/Rø@Šj ðVÓíYô,U]ºD§©$6ØAƒç]¬~D@’)€ – À·–“g mÞ¹F®ª>Än÷(*s>*9V&*Šzªò¼Ý]rˆì~z(#TmE¼h{ö-zDû ,X-–è¿Ì^QÊéYnš³œ`‰lsO§Nnž·» Ñ H"%³Âïq³ò"jP ÞK‚°¡UvžWÍ·Y©¾>Œjb ôw^†jý~©vã'2o½;ȼCU¼ËòvY뱃-á¦?(jù‰L°Žò<¯ûŠ‹4ý› [°f¢+©qN Ⱥ«>ÒÈ{¨lõ"RZ5e3R\•9Z7EE¨_q7C©’°]°HŽì*ÔСçµÛñèo§ +Kô¼à›í×ŸÕ f6YPC™c‰ÜjÎP~C Ê ³fÉ¥›ŐÜBÒdEÌÓeFáÀB‹Ö(!ÞVbÁ¸NäXAÎs¬Öõ]žÇ˜W­·*±Ï …µÉ½vã¤ì¸Á¡Âfõ¬ÇojÒ ³›º< +ʚbÕ疶ùæ1êÊáKUoŸ÷øW { ÌÊ =Mìód¬o¶©ÌVæ´o,#ƒ#–“l=ñR€–ŒßÑM“ ³¸ [’$l‹ g]…|·-À-ÁƒrÀf¸œí‹åâh+`÷ĵÔbø–Dv¾ +–ºµ“Õò)0Þ×9QpKÊYˆ>¦d,@ÆÏÛ7ÄCšŽ“Ÿw:j,.³OòxОúºB ÿG˜Ó҆nҏ٧3‚âóóFF±^±°â¢I¶"Ï%-ñ/rD–¨+ë矷»Ï–þ½"c›&#´ ¿(æË8WŒ¥a3«iT›Òٌ-BÁ) %úǹE\n:jö&Œ¾Ÿwë¯CI¸lËUÿºPÍå†\ ²©r³€ß´Šá…ô`±@ë;ï®ØbQG‘Ʋ(;hí¢ t´Æš_æ×â/ܤüì7îF¯Ø«ª / 6áqüóæaW¨Gåƒò€vÐ~¬—A…Å}˜i?o;/fa]Ze + t ˜<ÊÔXKëaà…Ù˜åv Eó ¯”ýŸwujÃ-¼&YQ:'Tm<;‚—BâPAìÕ<ñÁV4̒›­$MÃà„ôO.7±}ï¬öé—ÚKWÓÆ̺« Iâz\¯j\‘‚‘P-­¸i ŒºàBv®b„´T«„{ùm֏3 +>MäÅE5”Lã§á· Z© ø¹BO€¿½PÿÊmÏ¢CD´µÌM.¬ +§ç¹Rá¶ÈÑ^§Fhó¶Gú<’š²åkç»]2EDo ÷ŽTN^#Šü£h0c %nskø_N7^—£“(ûPBÊȪýV2!Qª‘¤Xµ¡’Ž—Ì|Ѝ•$ðE°×–h„ /1ŽDðÅ´ b/d«]¢§U’ع“ßN·r× ´ß6&V͂¼˜TH얠ÃĄZ„„Aè  XQ[$±”,–'°//!~€‹cÕ%²P2—¨=V„¶D½B»¥Û_¯%Ĉ1”Üã$ù™rU’Vïè|þ,)Ý1ö8Ð )Â1”¸\1—h›ü²~ Qî*!'𪪄šÓ‚O%G©š:*ù‰Ç×c“‘ +¸”„½ôs“¾ 6¿Š£h„>Jx‚’߇Ÿd"’wO¢­ÒN"╸–=s’ªTFsN´yÍ$ÁW~֑’„¤ÏþIâ öYU’è›û¤”bm² +qÛH²Ï`FB|âöq¤/’ßÅâIÕ붵Õї»!"Ñ«Âãɽ°lHºT-¹ÁBâvåó ‰¾,H Éͯo +ŠÑîã1MdÔ$p«GÎׅ¡äN©6Ò¾à1e7¾#d뜄¤#Ëà9bkÐr„ÖP?Ž¼•»6”ÀÇŽ8…ÃV³â?ÚønÓÈy²¢ÅU“>#"ÅrÍÈ9Ô+/#¥ ƒu„f)¨@e“;FhˆÅH¤€Ñ0¦xÕ½¼,±y6³È™1_,rÛ¯‘4bèZý'sº‹R5°ã¶MʕvHø`ÑþJX(r¸d¢?-&ô؉ì⛈k #e"Z-¨è%r§¬++⹈Í3î‰ùö†ð7æ^…n'=±QMƒ¤öÝþ^”¥iöþCޅ~ú&‹î!zQø9¹séÌV‡¼q·Ï!O¹7Y҇áÚÀb½C¼mr–¢÷ÂJiRgûû~¢û]—NµXÖ8/Ë…\[à'DU™@6!ÿMO\BÊZÆ@~¤ˆ›EHNCÃ`*ÿ eB´¤ð ät.xÔ´èô„Ó8O­ q…¨ìàGb1Vä~ÿÐ}¬‹âۇ®†gD£ë£&’¥ú jnú¸k¤Ž”Ë —Jxñ± >ڄñà£hìђÏÁWF‰ ‰CñbštpãQ%Ö¢‡Ö{ˆW +ÔËê„Ô£˜§ÆÜ¥G© h»~ôl0ŽÍ…ŠI–b†ãÎcQ$õæ¡5´Ê™‡ùøb5"ªAAµþÏ!è6iæ€P¸k‡G·ªÂ]xß +”€Á#X +²‹ÎŽý;ˆèAß1¡í%"ZÞQ¢Ù ï‰+]¨ÑBIN;Xâ:†ÜÙ/Δ(;òhaÏoÄØqYðÀEÀ‰ ÆСz =³/¸¼:¢LKö‰Ÿ:¨Du¼Ý¡ò¸€ú<47Ͼxé 侏¨4é8SWqH¬Ž,¸Æ+:. hå®þCL +AB ÐËsíÉû”Aÿ:sŒ€1‡>BǗCšâ~:DùÚê[Žh7?É{pDó<0¨ø$4Ž¢YrÀ!¯ì‘ƒZ~a;; Ìšš1¸‡Üõ—ì¶ÁåºáØB‡óoËßÆyF`×0‹dÚH3*/îâ@•íWØ¿D=—Gº‡+Žq8KŽÚÛBpŠ6¼çUÿ9,ÆûöÓê7NÑyßÐÕÏØùR'ò½‘0Ä櫊{mçϨ7vsÿ¸Ý ÿ‰ÈjÝؑ”醆qb#fopg#Xʍݯ«917´³ÃÛ¾9¢ÝFÈ®1' +­ÞmUØlÃJ‡í"ÞÙ|͹„„` +dÃ}×ҍu}±‘è¨1S ÍäC >‡–ºì[5ó† G )ã`édýýªÂë÷RÈ/¤Ýk€Jå®Q&¡åä!²” *§‘0vª5nýG¸Ò5¥AråäÔp^eîùä&Äx9ç+5®®í0jÐæ‡.–ªa 5γYj§°zyÒ§¡{èZtià"A†ª¬¼JõbЫ4Æמe7iàØÂéàLÑúk#²"Âðœ)B4pk°l3 ~ىSwôݒóI7™Rüëx 8Ʋ=”ú œ>㞁 shË3‚ë„ ’;£8ÈÀ¤ÎPW ¹9taS”gÜõfЩEÆ6 úfˆ†5£†ýÄ}iƊvfhsç^¶Ìˆ^ÌŽ·­HTÝe˜¡Bøe„o}-·Ë¢¹ÅÈ{Y‰îí•q]2-$N†± §µfÅ>“ùBu™ËHòà~¨•5ìÿ=¨bå0;ìÌ0h.z‡SèüƘ„ºeí¿uŒBUUqœ^†X4Sñ$œJÈz§8e”i +•mܲÙÈ ÁôIOȊå„b%¶Ìyf vÃnÅÝ +¶öÃk¦¯œhÐϘ$12-k$&bXÇæ[sÎ6ŸACþ endstream endobj 115 0 obj <>stream +/‹1’;¯Þ§‚ÄžZëº*Ëqy6:œÔàèÑ: + ”ÕUÍrÇ14w>á©U ^V„ñ\&“-OáÝe$8—過X¾½8a¥õóiesxÞD7 c—Æ6Fv90$ªB ’Ä«‚upo¼K°Lpîd¨!_äߧ£n „T˜ÐPی@»ÚѲ!\LKf¡ûˆŽí{AÀ¬¾"Ë 1‰VoHš&m†*Ñy×ýÃÄ˧:ùÆbÿ.Ph_ÍÕ NC׋òåCÁYåK±ä€PÝ!C3ŽDUÿ) #°°BÆÿÒH–>&_)*j…Æ$v‘MJ b›.%ØÙ¢ÈƗbÝ8éµýÃd$HÇ×,XPX\Xd+çiÜó¸hÞ +U)°Ó*‡KCrô?ÍßÀ‡ž–¨¶“óÈw=‰8iÖQv²úk¼B"ñw"þÃA-Ynù‚Ÿ T§WsŒ&”ɉX°îFÐ(Ž°XŽ,n„Õº^z A”Ï:ð¶–o©â¢]}»pݾ…í­þúÚ9!҇áâàw57‰‘b.©óûyi >k´g–*#üx¨’Õÿ®Y.îâB©Å£ᒿ°ð:C'˜‡vàgé]>™€–j÷ M]^ڎ­0Ö$–«tC{>4ojÆQ«púŠýícZ¿p}žN¥†P›1¤ñ¾1֞Åpƒh¿§%lp3.˜„£]RyËG_Ð>BìùÍ?©%³©Fü‡6<q‡uË|ϖØ/MDŽ‰pS~ÜܱÂRµ˜Ðdκ%ÍÃh½à¦º•I8ñÐ÷ƒ…ì ùX2ìa€Ý»*ú‡ å×øÊ8±s§Q`¢Ï +ˆ^¿1™†ŒDì•Sǘ,<à|œ³ž öMäێVtÜú›òÊ7ƒa z˜ ·ÉQéŠplá ½~QóÔ4‡@†4~ÑÃ:ÙÊ`´%Ga\ª…}ÞÜ0óÐô¥·ÛVNº@Œ#´â÷©0+d´FÌHÐ1å­zA•Lܸ=“3Á‹ws’ã J¹øq¿‘™RB–pºï$F‰Ù‡Ù%#(ZÍî>Zª ©s‹#ÉêǸ¥›}Ó±ÖòGÑ·7äHþØ£æ<@:C^5¯œkˆ¬ãÊpGÝÀá o›^I¨d+Û² +P? ”8uÙ>À½ðA82¿ø¼ö +ÍÞ7<1¢u&N&ý:˜ x…}†•µ<KÎdj·$Á7 ŒÍL<_–c«°ë%¦äΰ¼ñx”húö²RT'™æaÄ¥8":¹õ"¨¸®Ñ¡ÁË@*oó§0¬ö‹RÙ§S-ŸU–©û**[‘Ø(úA…aLJ ¤äZ݂›&ò8c¹­lüÙ6‡ùd߇«²ý•ª±Niߥ» Ð4*ð׬ÓZ‡ì5È`{¾ŸKÁW¦wâÜ¡ LKaMöjhvêÒÍÅQðÑ `te·f‹ð]Ÿ¶¿Ü +ôNÚÁMHý0Š˜ $gƾ¤%½†´ßIÁ™ÚX§ä’|´po¦v‚ÈżÅÉòP +ÆU%󚕶µ]\Ÿd0B埕)IN-R˜\N°ҏ̖ӂìU*ÙIU!݊ççrãªh/>7ŠÅ —Ö.û—Šx–•\nàŠ-  ñóLþRÅ¨®$žÊä‘c©”GÂ*Ò¬ôMgâJHÿÕE–ݧ ͝m|¤ÊSLó “þXäG9ûùE:±ÑÚ¢TGgݧ~Âڒ¾ÒÒcÃÁ\Ô&³j13»óKì£Hc実Û}"óˆ#Ìæ2½ÒEY0vÊë(D«ërnÙ3p²XœÆ\ɤ†yVþ˜Kî%jl.Tú;Vœ!k/jÁAà!— ¡H†¯pøúr™LPÖR¤2›ç!ÜÌWf®}ÿ†öv b h®güƒŽÛc'¡ûƨ†ƒLro/ӧʲ-@¦7TÊ ˆ;¥.'n kA éºÇ㬰Uœ*­RŒé}i§”m‰0æóÜÁç@v;ä,½>ɤ¹pæãs8Í°"Ēˆh`ä|oVÿ1{•m¤á Þì´P½o@ñöH90U$ý7ùb@)F]w/&Ƴ¥]¸…Uö®¡3ó?µÕ6,:kP +ž‚ÂÃ¥Z»en@AäëâHk‘ôúP£„ù4×lËØÓÕ¶Å|FT o(bãFY ãø=åg!4°¢4ë©_–j9ÂBØ'ÉJ]k-¨8„êä՛µ-#ä&UÞLckÇpy wÅ» œAõY˜lj_2€\ö8ve„—-Ðlç~ŠÓ |KªÔ¹œ£QÝÏ¢©5hY n"3#Tä>˜†Ú$StŒÀ>êÏÛ"°øC\ø^îq ˆê~¿¸j11|~‰h»H©¦>àÞ¢ÈÒiF)1ãûՂHWƒÍFdQwk&xœ†3XüÄêqæ[@BAžñòðzÔBÇ_µ„Öx9ÈY$>)j`oèGk*º³”¸„Zöf“óhUtÉíà­Èú/¤MÍÊwåˆy ­Wí’AB¨P#3{.,6V†\0¼EÁôô›´Â~Àë¥P¦„Ý‚€pC|†EÁJøI,0Z`÷Í_¶/2TSì¼0¼‹¢Þp=ª4géÐ ÄÍ­[Ãlþ¨ËاÃgÕàŽ›Ä%3Vûp’Ø֛̙ʤ!={b¦þƒ+É¡¶&՞·Ñ^›pOj."g…š¯=âÀ@å¬ršþÒa£žÒáÖÆÇ÷Œ¹f@ßs+%AµÏ…¹Å jÌ !Ë|ºmT'ôøJ‘¡â +)uˆ—:ôs˜ÓdWÌ¥ü¹@µ9-ºef4ò“ÚΤ¢PÔqÝÖO:Ÿ!U?0›­Aû1.I'QÕø‹Flgrãeq‡G¾A©ö2ïÃíÌe›§¤Õèóýĝ,$„Ü —Ū=i?¶WÓȵb„*=%PòʔZý¾ëfeãØØW2–ܹŽ„B‰„í˜ÿñèá¯3ÁœnjkÆ<0¹w6š`™@fÃ26ƒ¨ þ>ʦû\¶v¯ _ù¡¨lölº +_“ZÊc5l8ñÜÝÙ´¦uM¸‚\¥®Á¯²5À«rÍ$Қrµ‘uׂ%kð«à:%ÃØ1¯HWuyýj¶o2“GÝD› è'’áiº›dN“™ñH²ÎE¥ihÈ æ¼0 ¾Í²B«tKCÚņ-ۂÿg=¥Ùª¤á’Âi®ãGƒ¬*=ª½"ÜøH|Ð䩋R~Ə't;EUvD­g¢D…g^֝ ´C¢„e8íô$D‚ñ‚3÷FÔÍ„e3| áb¤ßž\ÕIS¡™O«Ac‚ef[W(-ÃgaåcûHßÊ䕨Œ­›Wg£1’b·‘2cšY¡ ›"‘-*(&ã4DÉSjuPhÆ\rTDf¶±îÂHQ@ƐšàcÚ®e0bº +‘Žéeñ0Gë«‹)Q‡ÀRÅì^ÔL“´ÏÄ$ç¸kÄà¤Àøh‡¹¼LÜE¹œæ¥†‰­Þ”š”¹ó +†‘ºÍc!­gP(Œ•ã`(hg–§+„û¬žæ/ƒAöÌ&)L‹‚‰0׬žaãŒË«rt«#}h`f’WŽ|!'0Ççe~ìñäeNø?<Ù$Î> €s‚ç‘/vŠ‰+ _n‘{É{”xϳ_GŒ<¯^’€Î“Š^„+— +˜¸« ®Ãiš¿ç\cyaº/Ì&xa[¶,g$¨ßΫòº?òÓÅÙöFA­%:—º«W2—@ýݓryK*pD¾Ñ䒛ôˆp©«×»ÄYKâ{(À%ZS&û#Y˜À[¦ËŽÌ3_Ûüæ¹p‹ýQ,´-ã9׸k™(­{±ÐïÐtkq3uEW!³jÉa´+›¡VjFžâî= µdÕGÓâoia´È+ZlKÑDæÃ4@þäÙecPĎª,Ðb:%׎Ä›}íYhØ +Üã,ËÇ&™W–€f!¶€Ž–eÛjû«]ïlw”¥Ÿ…$‹ýYq/´Ìɲmǒ“÷Æ1ÊN³½ØW±@x:.X~£•f¨ýM Y ;,+U,¯üÁ +^°C&]!±¡¾\ãVÀš€ÝðTÚ†=`g¤ãWŠ]@;žŒãþ8‚%yFÅ uR~päÂN@ûÔ0i%œRŠ¨©¯1£J ²B®ßR.}ý«HU*«bFŽ¬¨ÊÜÈJ©'ºt‡*fHó¬‘N%å´Ô>d*qæؚ„U©X…ñDŽÖR±Å”h Q¹<ÓˆÊ- „JÇ»ž'¢£¨ˆ§1ΫOæ™åµ£uÊSlÚü9,B‚Je«ÀoW{rG€Õ¦Öã»ýÿCy ªC£vò -g«Dƒ¹?¡umC +í…; «¾ +ëî.vÇä›s·¶éÝN°…Ö#@» ¹Œ5Úc“0ëYAÁÄZ‹œd–0šG¿^— º(´5%Ù0c¶B;4tz )¥¶æ=Ž»üê]®¶‘Àåä!÷~%"õ•vܨÕf0OO¥9…V÷é‰Eú²JÚ#‹:€½¯õæÈóÆ:ÎrH¼—ü×'PS*´%9¬-´¹lmSœß6ìðÛ°-Ô2v6¶eº ]§FË«ÐB}W¡×žöª">YњÚÈÓünŒÁï0;ÈLÈ5KRnŸá¨=¨˜ÀU¾ˆ’—ëýö +-­þj¢ª¸H íod…Aó¿X Ö¡Xh…ñ+$²Ð²‰/VñªþŒÓ9`qª]bë]}M¸åџÏXÚ ¬Ë?ðhô‹WäÚIÌ$DtY·ÈwU[Póú+i¯þè§ä$ð¡*ÉJ`*ʍ¨à]žý¿—¬WZÆNÛÁ-Üd‹?ÉIoCÍw•1†OBª†_¬–þ¤,ÅËØ¢{êåC“Úї°1›9 ._­¶ G#Ù£±B9˚¸¹P0[} êeE4¶ž€ðB|C;!JWvI‚õŠ2‚¡%Í2€ï:O+ÒRN±£é-Ò)C_°E%‡å¡J¥Ù{ìóAØ0íˆ[Ö×Ó"´é8.lEÇåã:ü¸.ÑJÀC©€s” ·™;ƒvœí‘e§œÝ¢ëÕ¯?e]¸Eá|SÏáo·À+C›¨}âäV 5êÓFH“ñÛäF:”©Àa„¥œ-¨ Aá?Q¡@QÄSEmà á+ðHE,Eþøs"l¡V÷§–Õ̗M*äS¢ßä)êí⯦w6a8Á@E†6êŸMÑQL„©¬bT[Jq`Óè.ʝéálÒÐZ[XA—hÜ͊_àšÕ,`Õl5öR¦Qô¨é2´|&9`ÞÁ9b_^hh[<Á¾¥ £ÞhU m ½‹!ž‚ÉÂ9ÁÚFülé]ßóƒØÖÐ~¦J¹ÂeW×Ì6ók¬ `9¬Ps„ù¦Z”‘É&mh‹U©ØOm±­fc±­`Ÿ x76V<„y€Œïe8Dª&'9Ó2šgÚ3Þb@À ¿¡mA¨¶kü mCRàÐ6[y7ëT`Ÿ ŸXiS5Zés;¨¨Vh›âW.û(0[ +Ê$0 ÇˎCky€_ÉÆvc;¨y +ëˆ ´±vž}éÐè”ïÄ ¥@ ^ö‹Ì¦Î?ßæ-›]¢·Š@ ]ù±¼$dp§ÂL=jm!¯fŒfŠ#Šshùø|³‘GçAG)üÃØ´ml@Aþ´àMöÌ%‚*7–I(>:Dfc½Â]uh•YÍò…gÚß Øuh]×7‚‘5W#•UâDØçý mŸä#œw cJœòc/6ي*æ!¯v—ßF ²³¨V8Š!<´àóWd1TÖa;˜#|ŒëO©(± ˆÖ3éø¤ÌfãÈ1ÈA ŠâR©ZD,l\ÊIÃ|àýÜâ,A4Ï Qþp~2Aºï%¸Pޕõu +°QN}ãö³¶mn58‘ ÌfåTÚâ¡ ³œ| óà#FtêÈ4 k{Í Ú‡›Î¡F~hÓÅJ?´•†èq~î=²a!n£ØëQo¤r®œEKÀݪAÄé©÷p9G^ñíÎ´½±Jk…_k‰Îç‹åFÿՉßqÉñ-‰ÌG¿<ú{§hu ë”xZ6Uó¤Yý‡®«G1lý1bKÂ!΂áñ!9„OW0х鮉V,ãÄé†RÃqøÖ0”Dn€Zè‡ÖÚ¨ØU0@˜È&"»‚-ˆÖ֟ßJd ǶæáEƐ¿/w:ø4«wóƒ"¿I/ÊÕLLì,8¹L±ÂUê˜'[?/ŒGbÇÖ*nÚ¦ÊIBö)-×Ó®S ^ϖwP¼Á‡¢í̗ëÛVšµhJÁ20&¿†¯ÐŠn™4dÍ mˆ“¤‚†ú‘?Vâ)&•§l <ŽeìíóJ]ÿ ìã’L+¨h©ºÂtå¬ñjÀpâØ^×f€Õ7­Ó ¨~ñ‘ÑQ;~Õ(]¥6èÚkÄæ0n| [æ5!uaÎûi%Œ¢êHXD¹@ÔǶ¡*ÏK‘S¬¤g[dyžÛ^•Æ?5Ar¬c³=üÁ“QËþ|‡8î&Çç² ¯pR`Ú°Ê1#J%šŽÕ®Œ»rl…fÚÙé|Gœ?%¹·ÿÒp… ë!ìÌ_ªþ¿Æ×ýň1äÏÿ!¾ö-$û–½Öß-áА¸B¾€+T² Uà­¹,;ŒóʱQCŸë椡oÜm9w€*ÂÀÒ º h-”ð6 ¿¦±(rªÖ3œø)ÛK=!‘,Qo&µ·˱ÂÁݾ<¹]ûàúß zÜ ž/ë´D1‰¦—;—éa-¿K_jTÛzåµËo³'N¢Õ¢1 ðÔ +s¬píêñsaÆV¡sž*ÃD‰¶s¼V=èEàRPèRZS¯R:æÑù¦zO‰¶¦³eÈHúXŸsYòÐ +þFÝñä<øYŽ$MjÃÐC“0´®† ‡Æ[÷”[„Þ.j²ø8”9/bT1—h#xü +$Ž&I]«˜aú&Z^h·MK)ÿFl¥<±ÀÈ +:ç‹Í ~I´ƒb-—hÁH—h¹ шCèï­ã¼­|ÆÏ9q‚9F‚lõåéØEmî:ü¥b¢rÚ +Ð¬ÛTU8 7ܾ8|Mælp2X%¿ã&D˜S ï‡:øÎÚؼïí«zØÞ¡6 §]‰NŸ‡«Ã @‡¤Ôswç¯Ó`0ҍ½ëó`$vçû&âåDR·}ö€äMº5,<.‰BStÁÜeCpêBî`»"AÑÚò¼Å5JÜ1)wñútEøªpˆ"‚íѐ²sjGy;ÔۜøƒäŸN#vBÛYA% éB¥†FUGÛºTŒ½ÝMì]—ÆŽŒo0ÿ¬‰Øy:8Q}Ë ŽOêôŒŸÎºn¼¦¸Î:ì³øêR™6,ŠÕD~lBxÅf` ´Nh%§|³Ân6‰²îÌBâÇm`]ëÂutuyþ/l“ôY…Ö«ê¬ÈI‘4¨Ž™F-Û©þ§K¼Zõ]íÌM'Ê_Þ7£ˆÔBKg±˜, õÄϪWåt'E;ù2;5›K:§3Š7—&wk˜7¡h3†ía‹è^¤mCÇ*:֋ ÛYFŸ¯€lq×J¸+®{—++w1O—ƒs/`¹›«~®«ä3¦Ç˴ʪÙ}ZÖT^†C™ìV=u¦h;OO œš‚K¬Ç(ÿ¿ö 9.ÞA{ê™Ü4¡›tÙÃét̜ßÎ ð%”:röà†5{¼"sx +ƒ¢˜=ÀÜn/+†&ò5:e½œ`q9a¦åXEª– ýÈ0=Km†‚M¶r8FFϧ T.Íû‹é†ä +l¡Œ= 1r“.¾a'r­øÚS¹!äX»2µõ@nM´#{P4J¢“>$žäÊ~_+›-iöÑn%ÞGYxÚÝ +MÐg+\•au5j\ùf“”{ÿ¢pžúàmCÆÅ … 0Νn5vŠßň谸DT)ɕˆTÑ6ýYZÕEôpßTE½pº,¤„4Yr8?ñ$i8"s —Ïë80YA ǛÀ^+#™LszsŽÌjî¥,\ÂUE6˜35à`ñz®GèeÕÂ— n&Æ­»1l­7ÛۊpsóÇIH¼æ+‡ Ìâ5pŸ§SUMÇܤ  ¸h~S>© éT€ã>• vêwKÉ7–#³¾e·?7à „L·{k¥Þl‘½ùc’z£+Ö@è7÷dÚAíÊm0oéØà7‡ÀFôæ×Péˆ7{¥IÕUà­ª{¸êÁُä^¡;T@‚nTÏÆTI6s‹ŽW“rË柫9ËU€^'mþö€pHß!lwE¨¤?Ín_ J…›‰™)5jw˜§ˆ,µ{xr ·ñÔ_°ÍZ°\›ðÔpATÇù(êæÔœƚJak‚#gˆ.ÂÔ&a¬4•Ãb Eì/?çB“Z²-uúp¤º¡5†¯ +ëi£€¢3¦M4•j•ՐŠyt¸1G´Uøyh -tËy¶Œ‘³U7EMî£N5`°P¥U]eT¯R!ºT'UÌ6ú؀¨Ä×3»©‚µlhŐ=Hãy·ît‘ ÛwÄwàm$L#lfG›lļ€mÐ$E,¯_ûn±;„]“ðÜAtíuÀå,Q^¸Æ0!‘[‹uFËڥݱÔZÔ¥V;:'²S+ύë@Æ3hMÚس<b"²ë³k´c!HØ  â÷JE´ÄZ÷£Å5Š2OH…S\^E‡í€"49ÏÄdjaR»QK©} =ì‘Zð)­ûÄDâ=é­ÏFí¹ãªT?Ü·‘ÒËifªœð´×ßP~7Ö~è³Ål†Ó^c¼„Å>ˆeÆÈÛ-œt ŽGpjãS*­šlfQó:üL“ö=¸d¼¤ÑõÕ väÛ±?¸! ÒòÎÁx¥Û.ä°nfÙ´­D(±)%-EF.­È‡!ÿs õù˜Úô‘_cêÅh¡å$%¿o†ïÖ À‘»Ä ,—ãQ¢1Z¡F8±Q +…}žÇhsøC9F«ùuŒö,ïèxÐBüevo ·hS˜åÒCø-¥#ÚQÜ6HÒQ4TÊ Mñ2—`fnÊ'-F¬ˆ:ãð5-'D×g¬Ù‰TÕ)G±w$ʪ2}ß®d´XÆ:ñKŠsBà–?Áu¦PF+·,¾¥uö2IO䝘ýÖӕ<”=yu›p ênÉö:ÇzÏ×ïë.“㉧A¥ q\…TFk ¨UF»-òø 8ü#—£žh´ R-ۄe9)ž0Ȧ˜²@‚\ޚ+é± Â%*´€Ÿ!~<%V.7¬0Þ°XȈ€æEUÀT>^pçè­ڪݪ…à‰µXzs³\-¯õd€ìœ™m³´Xâ°h™ù/ɵÉ[Ãǘý©è2«Œq‡þ’üÖk¦R8Éi´³Îf¾têxbêêçhV§”?Tñb:X'TÅæ)â +qbðf {cß]S‘`rJ#¤ÆDÀmÝ~óªò{ڕƒ²ˆ í·x«XÂÌ¿I%>AH¡½º˜:çýOËÙÄT 5Z=A÷Þ{^/h5À-¶áUíOv‘庒¼j¥˜ìð '†þ¿‹ê 1õ|coÿ&Æ»Ýǟã¶-Õÿ-ò-ïׁ³û ¥!óˆ‰Ä mµØ)wš•€RáSg^H‹`Gç©Kibdµ'2jÄÙÐë{Xè.‹ó0¨Ï—DÒ(¥µís#)^¹hxžÐ2ì]£=œF¯Œ¡×h­+P¥§|ŽE–5N‹ÏP*<+ú21v3^ÔA¼éž[ Ò²§³࿌i£¦›ñŽU‰ô­ŽkÓu»F«ò¥|?`„*Qì2;NŠ,¾ß I +ir±P›£}ofmDŸž£Á·gIbêdMðÑ ÛEÜUæ ©±Ã]£Eù¢\¬<õuP0v Y(òVšlF×hû±e”ë<±×ÄŚV?Œ£„¨ÅHäÔýíZ„†P‡õý\,Õe|8•[ˆ˜S2!€FÛ۝Ø-FÏCΆé_9mKÙý0í=üSu¹‰b£µà yB‰í5ë¥~Ä/Ø$[F +  B´-œ­%ô6œ+€N;…@­NdzH;Wˍ=‰ßNSúD=×µÚ¼š¯fÂüç5@‹´ÑNò¬„Š4¼¶6Z þ:ÜÞ÷͝ÅQEF Vi?ÏÖJöZãž"üB[ÉRSá.–…»_=…€o£í.Sh¿`>LNU˜T­æãÕÂã^êûqŒC²ö8,ªÉ™È)ځ.åö Ç +­ût:ltƒ¼™{ðÌÕq£5i×*ÿ´béD¥ õýÄ>^3:òÃ`´y¼üp×֏=<¢îÊS +º†È·o<š„¦àf&c2x’ô(Ê*}L΅eĐ<(çøe¢¦ìà“"}Á÷ýÄ¼Ñ +|”L(©7Z¥èn½FÍ¥ᒕ®Ú®-à5>áí¥*ý³BõHsdï;zûFÛ.¼G­´Û!Xñ䔪’¿Ñ®?K8è)œRGyõ P??ŒJ´*~uÍԚ»•±A_ÃсŒÀnaáh™­0;•±„¦/ö—D½ï0¼ªZr4µ +:ä`ÓÅæú}Õ¡¬¤¡\€áôÔe(uÛÌ£‚ù³µ³…Žû´fð{7"™8n!é¾T)@J8ÚöY„£UÁÊÑL¼-áh';“ÖÎ/¡ŸO3;fÈêN©x@4ù‹®Ž¶:tbfÉC+Ò`rµ‚:è!ëàR矜Úuu×Ì¿“š§ œJ&Äv÷b©0 E)ƒˆÈØ¢ñºÀcH.Pœ.M'éÞ(ùïÕr,¦€Î@\}À„òýûaØæ±%è(`ìÿ&2 q´ë)ÔñDÃP®c 8¹€è»Ôf>{Q8Úؾ·fý†ÁÃÆhWcŒ…:kò1Ïä´Gϟ/5 f@÷ø¦/6>(åÄÛTë›*HHAµJ7–™Û(ë3ŽÖID•5€ T7†P\Ê‚çñÃ÷ÅnŒ:øBû §6„ˆó‘’“†M¸{W°ˆÖÜÝÛ[cØähŽ&aIò×£òÔÁ›8cK®çÙà ×s*ÚþÄ-ÕoœTŽ¶/¤YŽ*>ï*hI—¤O›Á†À…úã»â¿H î‹ecK`H1~­Ÿó6Zm¢ÈÄ>%';¦×´õÑIHžF;¸£’J”謑0†±} gqzŽVé笫~üV="Þö„Gе8É÷҆4¥ù c3ÍæóùŒ*èŒ/AÚ¼=['& eÇñ|#Ñ>lƒŠ€!ú àNÅ&éåSÊ[!m̵Æц$Â`hk/Fç=TOZzƒ}8^¬ÚCӇSpâ뎺¶ßšpÄè0Úª`o½PLT–Û{¤—ºeú‡ŏÂîhûàX}ѹ!PæAbl8p~WÄ[¢Õ«÷j¸îh]ÝØ.­ä ïh+ƒ§­µxo³fï_fÌP½:—*¨¹AÝMÖª¿Rh^Ž1V³µ ƒ¬£µÕi¥˜Øˆ©B4x´ócnFPЃÁ»³cuU.ü¥ ñh[ª*T‚Bbÿü< (ƒ1–{ôw˜"A¤äіªV>{S$"Ä.ÙËè¦Á;5Ûä]‰dühZֆzit3›³í#gTÙLÃæwc‹%ÍXØ@$ò×í4Ø® ôLn[+ê݁²–ÄüCG]ÝV +ª¶ûsLÒ:_}‰Xo8Út½·´!­x°è­xCZü¯9“™¢LI‚g¶zBp÷ó gþæd óÄÑއ5£¢þÌí¸ÀM¨ÀKtÉyy̪ zHk!^Æp·J2ٚmrEóÉc.¨\éíRõHD­à}¢ö üoY¹Ý¢ÆŽ­£#i·c;Jx™; §¦TÒ×Ë¥µ‡™fNZu&[{ˆ•Üj>|K.CSdŽu<·ã•µ·Á){™GÊåٞòÒº¦< ÂÞ·FÎçŒõÚÃ%HÔDF–dtiÓ¾6¦QëL¨¾֑$·}4½Sð@0¤ ?|6‰ªw˜ƒ™—J÷]CˆåuU"AêRá}BDž1ö'™Õ¢$J +M¶f=“Ô€—ü>ø$q+¬ \÷‡º[)iç­rûØx.èIAù«g)2—½ÁñÑ¢Ê͆9iE&ÃðbŠŠt§ix4üeC҆²´"¡¯ZZÇv¾À¦ÜOºPe¥BZÊ>¥RÌÓHô *å渫K­,I¼ÆD7Èòieè÷•iÕc'R¾¡'ò9¨ZGK‡ ißM1™%ʞÝú¬FøÎDq€çhudìÖg’ʲãváZ×Â;¥SGùv·üüƀóо´’ÖòÖ1äáñtme9žVÒú®óÂIŽq²."ÊXr‹ÜtäDöø€U„ØW}±ºU¶#m³Ëffݓٕ‘È—ƒÌ +µÞÄtÒ)[ØØý °ÌÓ IB/@ƒQ´ûäKB‚Z€ú¬( ÐW“#*ß[(À„rð¤ì Q +¦ž373D‡xT""$“P‘N WÖ½Š5ƒ7XˆÅ¢ m(È ƒË»4⸻˻ß=¸(x`€ú¡`€Î»¬ïP ֍(ïîðƧʹ1fff–½+ÿÍ̤'³Ž?°Ï‡êο¢×6{ÛHž˜Ad‰vâ]@]Ú°»º+ €€H9˜¡¼!Äè€Eˆˆ‘ŠXÑR!"‘€(å“XDUUõ×½^öãkî73»ÿÑfcãUwýõ4;ìŸiCn\Ü}Ìï¿gáø3¨—ýì>øíÿÍÿñÏßTâÑ%–ø¡ 3ÚP”¡Í>~5»Ÿ¹éÿÿÚÿ?þ‚»»»§Ïî°îîêÎn †@DW8‰") Ì»_S*¯$ZS³£s'Æ ™€œqK<ƒ6qÃ£›Ì1733öÚmêu3ÉñUƒh¬¬æöÊÌÌÌҊhlŒÍØsJ˜•W….tUÙÙ0ÌadfǟŽ¦ÄüGÿ·ÛíÇÛMtuw—Ü卪û@Ìù{Oa†(͎@ +ùsˆ0Ñ+!ÒÊÝÕ½öÚs5¨5­bKk{lÛö8M¶gflÓÌÌ䌹™™±™™É`fæBÔ@½N'ˆˆÈD”Q‹H*kÌë­V•EQUÕ«¨äf2ähªÛÛÇÿãїagڇ¾³ûÝüfêfVL;CV…–Y%Ό”àCD*")BeffUd"’)£m³£Ó¶mkÛµmûlÛ¶mÛ¶gfffffffffflffFë±2»I6®ÙQQÒÌ)odUU5&0³©³2°B33333³‘6N ˜/lƒì7ùm¤Æ¨$Ü> #°¢X4Çdò1Í¡=€+> b0BTJVL' ¥Š”Bˆ`ˆ1f X‡—n*yÇÔaB\±!‚¡Ù‘{ÞՃçÝ¡${gȪÿxó(®y×Ev„NÈÎùƒA +ëÂëãô“_äi¬ulqýÏÉ¢ñćHÜÙJ’G‘ ‡–ºÀƒñ·à;A×J7ÊΤŠvÓ¯£ÝW‰BþÍÛN˜>™Jþ.”)ó)´ëÒù”G·9t ,Äñ÷¼ÖLöÕT¤¿¼Ùùs™~®Ðkâ$=õû\LùrºÑµÀå ë»¹’ÙÐt0%ŸçäÕe…óS…Z‘Ö~e*dj<“ûIº( +ý‚ÉÃîȕ—>ïÔQÏ°1•€uA܌¯œ9ÆC °?ø_ ç"Ó¥$’áV 4 ÌHN½>+â8Ü'ykG× +Q(#ìO+Ü¥4zGC}Rɘª[nDÚßÙåaú MhRØêX㘞Öc֝{¥ê&ß$"éw& ~GL€ ¬¶r—¡÷[íNO"dìwGþq¦¥ˆ^HÞn¼¡\TÑMYþ® Ãö…™ƒ]6uæœÚôî›zæ´]šu&Foñ’áj”ÝT7I<¡|ÉÇwòîhÍòH\¬>h4"adßÙ©†w¸ŽhÃ3APÈP7z8$<Ž Ã9;ÖQUx þØë¸ùù{‰…y<®šÇš«°] +®OD»î>CvV¹~zPTêr7@6ï\˜¸¿>“¬* =ƯU£X¾øâtv}êâûPùŸy¹X¿Øv÷Èé~[óUƒ %·ˆ¤€Š£¹6NJrŠéb:D5™ð!¯­Öۍ+“,£Éqß÷ð²>læ€è`“\Ɂsì½TJ~@9 ÄÕb‹B,*),’W8îÊw°2«O‰8ø¥B"VƒÕU–¶Ç?4‘mo4R+¶˜k±½Ë^a9â½…U‡.ÜXô.F<­@Ò×êK«dƒÐÿöÎøð¾b ©•‚šŠPYôi c Ïmd.PšPy¥Íbښ­Ï—ñP<…Qà0QãÂS»®A8½ö#ÏUðÛµ|$ɘantH«°·?V{Ó +7r%ù"‘(dãI¢d&¹‚Œž§óÏ4¶f%W£õrӁòíßnþ”.Yo´öTV 2€<»˜:€¿z½ìÇÿo ¾GNš[W@÷¬žÐ¬Æ> #?+éx½eˆc"C`ˆ‰ÅõOžõZc·ÎõDkhÓ¯a †ŒÈü:UÖªú³æî]ƧL1aú©ˆzsrwçþñ¶ gxÂOfÆ»T +KÕ ZèsuX³d¾V`¤¸K“@>å0 !ôPœ\ƒÿ2þ$|}0 +·i ð̆wÙªhõ͚Ž«Ø}—–ë®Ã2ëÔ'îNì.cY«èsý¼ºåxËsæØãßà‰†¥ÔH¥Ý´jfˆ–µ¼rKÚf,Z Ø#iCA²ÎImBR±€ÃaÞ0Œ“ÏqX"ä­0†È\2Fô%à'Çç6IU\Åé û?76YbÔîÆéÇ +m°56i¶hMGè I÷Pp«]¶ÐkßâïÂàU8F_ÎP}|^ÑÛ®â¬äŽ…:Á-Z!K\üÌaäµBƒ‰;¸¾ÉŒgGàIH[Çö¬ía®Ð‡ÄÀ†Í퉱,íÔw™žÖ›· íVù¾§ùRg çџâúR…aÅ¥1­!¸"'T›JÀM8íI~MñxÜ3áh8ä©9î!‰Î¥!‘b±qÖu€ß—_ÚøxyRøðÍޜÓÒ7ٓé3ևK¹¡ä©.W!/Tø´0øüi@ÆlªÐ5&ÒÐ%Å×YhpF18"ÂÐ“Ö :/Å1~ƽy{pI{ÜW®êA뮡™£Ly;Váïdΐð¨½ðc¸±¥£1F Ø­µÂ6 vÁL‰â"µlT?$&ì5 tÒœD'wTA&Þ¢DFdožÛÉxô çÝ^ì—üòî¡( o¨yꛣB¾H¹© OV‡¡wK!㑸šQà÷‡¦ Sb¾ I2º+“ņ¿Ž]„«ê`î% H-Ý|8fÉa:(d3äó*‡Û<2™•4:?>®¨¸8Q[N„‹žÇ-É㤼ӾEÅWÉIãDsxە„|é@-1ä2_ýÇ€ÞžßØÙ0œ?XþÃ[4¤gcaV‡$± íÅ֗ ¬±¼OuŌ¡ïÓޗ¾>À³â?ñ¼c5jÜò^~Š<5n:0NE ýÜtìRcûÎã[A€YFÍɄÝ@¡àyÏAò±Ïú Â:à4öܚ?€b0àF\*×qPÆZ”¡óØ ¤Ê WÆ6Gu˜á-ªÆ1ã»¡€ å’°3 ¸°ÖÕi<|’6ƒw´E™Ù0æŒÃt­ÍÁÒÇUž» wbt@èc„4wÚiÄszukŒ¸ÓI›¥¡‚Ýßâ#¢™ßË¥›l\Y'iúüy{_i¼hb†b‰³¹šë¯ÔÏ2v51[M>Ø_kŒl‹ØkäøŒ:¦çŠ!q˜ãGs­j6-!æMr™q¥o]&ûmÎMÙ¸ˆBŸ‘ôb€B”ÏiŒýp×Ñæ肾éëû ˆo± Ðr¸J”™’…å²fÖ#oÞ¥ùŸ^{‹´a~Œ®€RŒê[<ñϗ¨ +}!ùzï5eÄG`£¸0Μ’™Q|'©i% y¬Ø&q5™ ³À)¸û1UEAƒ€¿*®ª‚¥–*_Ì ¡¡/¬ ³Ý)‘i½IÁö«8öἸñyuLJ¬c!»=Ôá¯2ò”U¾ÞRº­ÎoíÇMßF¹˜\°„=d ‡¸{5°³'º7u»–]H7\°B|R-S¸GÍњ5N»bÐ1MÁ‡ã˜&S1ºzá֟*k[é¡À&tÇ%%Êà³*ŽB…¾‚ñºqoû¤!“ºŠÂX +¬7Ýü‚BjÆE}ýH'äf2o®7t‚þgQ +:†Øg5ãAݯP ø2„± Z\)JëM‰0Dø]ò…z|ÔÇ8þ e ÿ1ˆÒÞéõ$)>å&Ùjd}ìñOnÒëa• KƒšdËÕ?@âÁȌßÓVŸ§ùòÖT€¸<„'ûÓáøæ½'#ˆ%>ŠŽ:¸x2hP¦p·%Ÿ€G*úé‚U¦ä):¼Ã¹…8n3aÓТŽ%*êØÓ­…ð¨`¡%ÜJ8ð¬_ÞnúÿrÒŘÁA^©hߒÏÍ0Ü£BÀxšŽª_${ʤ³"Ëá¹÷lK8Ƕ°PxÅІºû A¥1gxÀír±)té ˜ìÃÃr|Ÿý8¹õWƒ +B-<”FYdµ¡—g¤bÝÈ%YøðX˜é3´q›¡~­8ArnþåÚȸ1’#j +`9ïPFÝ °>#«²3ƒk ã•µ~â¶ç•wõElÚ¼•—áªåðÂý⪹ɐڭÛT‘Ù§ÌԃMÉîk=F +ÎO°åvÇ¢U€óël‚<獥 5ê ›j'/ó¶°„Yê#Áò/v;cÒþt£?ÆÑӋì iN0Üã"Œ+©ðõÍõ°dñ`6ËÃR¨­Ã/Xˆÿj0̅‘(¿4÷ b4ùäqi©°ñ‡tŸÀÄtZÁnb{ƒOVëŠ‘¯†XáIj!´Å‚.ƑZÏ«@ °«VæžÖ;.?¼šªl%rª`šDn=k«ZYlPd8Ó&¨צº.Ÿš“(»¶Åª8Ñ x!È®€rÀPÞÎ Ir¥Š6k#UJLFZÏû/¨àÛ$ؼ*R\¡×€°g+;!ÿÛtÄ‘ÐIzGtOdvP"ôÅf a±óI¾ › `mI>ˆp?±%8ž=-Òtz‚¡y}A¥ªø# ږ³“xÌV—5ôÜx«@ö3D÷ϯzkAeWϨ©<3‡ 4¥šÄmG¨{ˆ{™€­©(;È¢™¡_s[Üw'PòßÇðp±kç‚iIoÆÇ@¶\oø%C´§†Œ¬ Êà‚¯ÏM4&U›~Aᝠ@‡Î^¢iô9 ›9…³I^_24âã³K<Ŏ˜ì¦È(Qp1¬6 €Çæ·!}ÈXdʏ6WÉ` ÔÚÄ'ú#ƒgm^fÐ"@ FÇ)›ÈâN”˛Å#ÀnÍbHâ|OE MERøìòÎ9"0úA-/Haºµ©æi¼]¿xgbTLw•Š * +©_Ñ®ÒÁÛYˆ ÍَÂa åjÎ' ÓˆOØýŠ¼þb… ÖFXÙB´£+†½—äÓvº +Yª]Ab¥ +ú•6 â!þ÷Æc0›¯Œf1l¹ðÓ5+&g´ ]mwlj”™‰PυîÓ|Àèˆ'ä¨÷¹RÅkij¯Úžê•Nµ35λPGÍÅocíÝ7jÈdµž†—`Xå@(g¯ ÙÏñ•§z/œ5¼|Gùj²rV-0¿s›m{²«ëµ$p”×æSÖïêpO4Ä <¾Ûá¨í‰÷z8×b@e(ƒSoŒ¸Ên dªzØ¿b<:2øý;VXhUϒÿ,̇`—­c¤¢>rÚ~˜£S]6ö֝; + @•À èË&|8Ò© €_í2~jKÚtŠ|GY +¨5Ä@•áü9-D(Åë¡Oÿ$PÄE#ŽÊèh/ƒû æœÑÑß.Â˾€Ô(à‘Š’dÒm'¶o¹ýU‡”DŽyÂs­>ͪdè]W¶«4~ Dò9A¬e³31ÅxnÔ+!Ԝ='0psb×¬¦uš5Ž™“ü¤ÈÕ(´0ŠÄ#· S†1)þe´ïXÚ_0ú¸œÒE°|MŠ€Eڃë$Ø,l%<¦;}rXUÛÊ]à‰ïÏ(ß&ÿÏ«buÑ··6ƒûR1w{ ª!̀rò…8îÕۀôù]/¨ûÄý«4X˜ ƒ‡®n˜‚, rÜtÆz_,lÁ”••žîKÔBkJ̘,ˆSzqąä"‡qÝó'jÁÃ5Ùe +†ïbm‰l}5EÇMµ<òãgbôA3÷<Óãcê¶_ÿ"Na<ø[g_!°Ü54·ï(7½Rµˆ0^ït¶Žo±*zÜ Q¸›Ú,Z¼RÌÉK8u5 Ñ6¯GÇ +æÜfØå¨ø*úOk¸ÐœHz@nê† ¥8…ªnë™Ìòx¼î¬‚$œìx%{®¡X¶I 綈‚£ÜÔà~Ø#&Çq†­“B§+½¿3@™¾¾ÏQ:Lsïéá`!²Yyàٞ-®ÅQÄ¥¤xW‡¿[š +êBÈfD"E™H§ß þKñ ÌdÿÖI𠉐•Îó1¾Ñ¡Oo¯5é>^ctM‘‹_B=Ó9“%|üvý°ÕDÔ\pû´gI¨á´A«Î¸V@àO­ÖÙ$Ö}VËêÇ5æ­H;N³xÔà\ÖÉ$ÅrµààÝRØŒ G»hJÑ16T$8y¢@®Â¿gM²TÞrƒ]k9V1g¡á™´à¸ò“¦4Úå1†DõÍ9NÉ4*¦)B¶Ó¯| ~Òq–Ëñ gGH ÊMŠôˆ¥µ(ڇ¬ãò(D{ƒ*±ªg +7rÞÈ6Û0*.]KM1¥Ëwz(<‹Ý´JÌA)šwú!‹êˆý[´í×'T7›¡íäÈ[àÆ_ç0lÓL`+sökW²|y9b°c2'}sÞ»Ž÷*û¾ƒï’ôºts 8¡ß3/ G! ¼kñùñpÔæÌ~R÷š9fH|ËíÇSù¨Óç—Þhñ@%JŠW8HkŖ®Ór$‚œxŽïÙ«8?ÓntQû¨•%ÜÎ4¢¡u(BJ_5Α€’:x)œ‡P®¬C^†÷„J6% ø¦rŽ;´QþuÛ½‰ÃMií €Áï30áÕAéJ"=öZ±ƒƒL”&ÐTü’– 6°mTuDÕ)»íe0“º¹ºž¸p^‹U*Iç¦ò$(ì â­8u’÷µTN²ÞÖã2õ?éáNú5gÑVX˜`°¨rߪ‘™ D®qÐN9Sõƒ@²ñìÁ*™E;Ï»OìõÝcXwÖ»ÃΓ3isð!4ŠpçY’ªÑþÁ#¸‰SÃ0'Ràx8L½`ÀuŽSϧ•*½„1n`;O +MLÌvžÕÀ˜ t¬ÚO _ªç–.¬vž¨¶ÍTŽtðkç +}Ö®³ÜµC«å¨vž# ¶äù6“æM‘‰Í¢›æ ‚Ýô/‡mib%ÅÐÏMG‚Æmkž¿[‘°>«8I&§8=EbÁy¾…‰ Dšgÿ¼\»Ã#ú¹lÂá}Mœš'­Zم èÔDS¿bjžáÆw3QÿÏ™æy\”-ohžS0Ú<{;ˆcÈpž•äÆ4s¿¡¥ŒóJ2·!¢5Ææ=—ðUM¢‚îÐXóŸÏ}ß½ZU.ùzQŒÂ'‡d +ÛfYbíÿ«çUˆñú †ÈçK#¼U([ßÛəF¬ÒAÅ8’â3ú¨NÄÍÛòƒS'gå‡x}Ô» ‘$ƒ½Š&°‚kïr–>ATåæï²@îAfœmÑ9Ò íåÒìð£Ûg¾)-‰£µ>?cC:ÜIáïª"Öª˜Œ‹Ðf6?Uzµ%(Û{௥þšÊî2´(‡kŠ­ŒÞ[äK0¶&>Ç!0˜*ìÖ!+û +̪dr¹p€½}—Ôºõ͂=¢\ó1ØÀ+0þ9XgúâÁs W½êoÂj ;´°‹3i¸Vêv)õ¥M\Ïé™ði<‚j Âr5Ô²ujSE!窼Hõ"y â¶Ä>‚çl®|$?ýƆLŽjÌó+]#_|©j9½¢¯öX‡ŧhŒœÙ-Ößòñ/0ˆjhµ˜ô!ÿ^¬“ÝÊÊaóÂHÈ8„xV?2ØÃ-„|þowò²<þÑ#ÿª{Á4’e)…†`¡+¬ÀxÁçoÉW ,$Ÿ”ç­sF~"k-³·ªÙ4L:Ày|Q‹œÑ-é+­©™!Xøjú¸zT©j‹x¼á"]Á *oD£ï‹/EyŒî‘£øZ@™?;e° ÷>ecë <üo1¨ð‚ˆ‚ÿWŸ‡]V%cå Šß“HÖ ÚK¯DLÆ®Ïÿ÷Ô¹·"”Ôß/i›¦ý0çÓ¿ã-TÃ] Íkº!zí곚IÉN‹¶˜¼^õô WƒfYë«·KAU©m¹éy·E‹žµMÉ-ÃLûn­«„BgË'؁%dµEãOr¥|ÏBìj qiq‡Ë•!.*pj§Þ}omÐ3#„²G^Ç|€õƒ6E«ˆh‚» gIs^ödQž¯„¹^7À òlaÜË[w0+8¨"kOvÀp«Ù™Àê;.€J§S7äRd×P@Ãý•X=q©hÜFÀõ*ýɤŸ”7ÖFՈÖKk›@0–ðX¬Èòg\C\„¥©°t‰¬Ë‹LbTÿD 0zõý4>Aµ@ò™ Ö©zBŸ¢aZ§j]iüw¢Ä0ÜYhȌBíRj¡h¤±ƒ5±æèá*óvýG¨Ä‡¬¥¢‘¯‘À±ì>(ì¿ÒE2«Æ%UƒµF†øé]CeãþeMð·: .pU™H„ABy5úó%ÈrÓªfXU‚|eîj ÞÍ9é…9APè3ÇdYö¹IÌzxÓ£ÿæJGi•NMÁq*\£ð‡À¸¶mºÔ` +Q NÂñMÉôgܑf,ôlÉXä°Ê¡€¾»9FkhÜ´bñn°ßþ†My깚]á=§ŽÇ:åÚMã«êl^ cæp,“ìQÇbü´x¯hªV§½Å핂?5ñ÷s +÷B‰æ&ÉΠ˜ºÚÕdèa ~îm`ÅYº÷³*†Ïö0Âí®‰–§Tã ܵÄßÏq[îØÁ˜Sd€–ÀM?¶0b/h͖ïÒ¿úÚR‚ÆýÑ&¤3`à‰q6ˆjtðQ6‘»áæ( õN—LÄ(âs-:2½¨"O1銅2ØÛÌõޝt<2qòVÝ(à( +úx ÓòDŽagÿ(hI¿yßÆ@C…”G˜  ÿL›¯sã°ᬰ*.kxU´:8¡÷´UX¯õ"F¨Ê˜-)4%í¡°×˜Ð€g#%D’Öü^’"Gz›²“€wà-š]-KÊ2Ò¸f«Ed,§¿ýÞ4¯á…Ãä`қ†kD²tˆU(Ùté:ÀEÎ÷Bê»]@Ü¥Êä¼èSÑØ¥•áå. ÕÁÌÇf 9€Ê& •7Ä!隌øܟYW )ä+ÖP¸ÓŒ4 €!·®|''¢ELF€äŽï.t ¸à® ¤ƒn5"?‡ÁGM»c ‰Ç֒³"#B”¯#€¡96ºÐ´ºÈï"èèЄ º²â °„âÎ*PÃoI2=Ÿhˆ¸[dNó`bPÈäUbìß96³Èººw™ùï…`É°énÑ8Bí±gfcxí—T­•î¡žøv%Çê:¦pÝd.îýXðb:}›¼ÚÊðÈ,?/×B#Êy㤲đ¾ò@ +K'þtåBÊuq`uÆ*4TÆL°C„U 4,ß=מz/B©Ôë:(=‘âJ_õ“ÃÎ]dEè< ª•Q?´·Ó¸­º’‚²+_sHáNHë,Žc Œ=&NߝÐT÷'6´M%ñ X^QRlÛàKNl,#wy½Ž„jSR0;2úD,sÿoÌ˼íôUöúÄ{DéÀèÆH,˜r9yÍ'ø±ÔžÐLw¡õd†ÕÎùæ X{ÂpÒf¼ÙU¿ö6-5ÏÿÉ$Eƒ XyqˆZ%‡P„½PNž~®DcëóÃ=yƒ¯—i8¾;iu'ä,x©ŒÑïsµO¨×ÈÆ9Âg'“]ô¤ +²ålSwjIø}²üœ¤¼(zâÿ"Hë¡föÊ8Ü얐ÏÌT9Š&c°À0Ú¸Š¹ ï/ÕÒ©‘{ ®ÿ„o8‡RGNâó|¶ýDõ@Åd×ù\uóädO$™Ñ?`ÅC9­´g,Ì3¢Ç&êĤßÌ|•¸Òclƒ48¦h*lÕÍæ›ÏMeDuC^–Møò¬Š>ú;Ô#ªäÄÜatÒô(•HˆôGº3üB”½V·¸”È¥øÊAÚÉúu+Ò$®Vs#ìG5:ÑöÖS'àÌFnɺ¨O‚càG&i£Ù9:¢ Ps)æÜ#nA[NG § [J +ºévÀ«©F7€kòý¦ýHy' 8ê™8or- ”áTç«s2D:³ì^X$§½P‹žÞÙ1qŸ ¹ø3é3‘Ð2¢ ¥3F[·7͓®wpzƒÂº+Ҝ2LqÝ*, Ÿï€•šrIå–øu“ Þ@Ä} —$8Zb˜a”ˆbŸFû^ˆH°r¬¥$H›ÍqÅw(£G##ñ.&á‚Uwíßh® G‘V"F©ý¦MÀ°öÓ-´2Æ$ñ&}­‡â.C\)6ºá—¯è ŠZÿâ1•çù Aëч«M¥„ˆ(©N +g–ý±pW=+üÈ"Ù¶ùFÊIòqAUÔ¢0p•©£…âRƒ^AV¸! 5LU½èÓ Ë˜P¼NèbŸ}°’1xöI¤8XÑÉM¼úíñày[@ð²Âß M‡¨ñŠCш£ÃŒŠ´WÁy‰¢ÛtΘO ã’1’Áª¥ÔæßOù6b1&¾|qªÞƒÂqô¡Ö0ÀQ7/ö)áv4ªÄ¥°Rh|ÈôxÔ _¬æ¯¸¯J§M%Û¯‹ÂxE0 +Åp`èèØÅ]d,Z>óæbµƒfіj»ÿQwk»œËƒZ"4P¥‘ðçÚÅԐdŸ>o´¨¡eñ—ÙyU ¨ Óx„šÜ]!+Þ!ªçÁƒ\¾!²âvw§dÅR}.R>íÊèàk°“¢í‹[Ìpƒ~rBŠ×w ‚«wîSÅ´ (ð(»ÝøCÁø?Üi'_àãl@ü6^"5´Þaî…NòZ®Âé_$ÙoÇÄlk\™ñ)?è–äȄï ñFv¬«1¤Çqö¤+ʟ·®UØ$ŠlzälàüûW[­ž[’4›°ªa¸÷Õ¨5cåGEDâJAÉÏÉXßJ(gD¿X¿ØÂúƒvÔÊ­î§j®=N‡¢aÌ Ž^z:)¼.§6ä¼è/hÎïÇW€`»¤£&9\˓%/‚UXÂn„Žy³¼|oTɇ–ŠQvT´Ááã¯{p4ùÏúºÞxTlr%Ë a¥ÞŒ:ykß.8 ä/\%lٗ€OÿuÍ —¤A›ÀOiž[ŠX|n(Ÿ +Éǒ×4qÛo~†k[©|Ôß.x öÕ*2\¶àV‚ʸpJXncø@Ɨ]?Øø:emã‚Ùî7 A§ºÝۄ•v¤¼©lHV&ʄs÷pÞ7E»•âKU­2œ¬^¦ !•!JÂôU3áF“Žä¥, sÆ)N=€\–Ê»„+ìKÚ Ìx²~C`@&×ÉY¾áy][Y:Iß`…Ày9Q+¿r×\E£Ç`”î:M†Á¤ 1reAh„¢ë1$ÙzŒèð馆¥JÌœ_÷Ì̟àøŒ7'|Üú$Í ,† K̿ʘ<»AªnID»“”ûOƒi—Ü´YA±žRAÜp!Âbp„Ú@CÕtƒ“P¿¢Mðã^ЪчçÎD»’à"Mks§”xf¬*6b’×m· kÔ'TaT5†¶\ äåˆáçB.8˜á+äE@•ƒ&n¹—{·w†¥ +h«U¹Ýo®¦ H¯R¥BÚ]˜¯;ÿÄî¼3Vó#I^”,L$e}*W­¬Ù 9ƒ´ {«":r¿†ÛÙWÆú€·6Azc…N8ÁÞ@¬ÏUDkÎDÃùd!c5£Åõé,˜¡ØñÁ'ê„^mBçdmaC^F è“?˜ï/U(Õ÷ ×>їúnÛ1ÑéAPè Œt²»– ™hww]›eÃ"¨Ù뚍Ž¨í«2ÑåÈÅ ~À¤¶J h»ð³`=ðõ!Ǜ&:œèÐGág!ŒôjÁú8ƒäü:f û¸ÅÇõ¹»»ÎÛÍå¼®ÜцJCƒž÷žDè…Îç…÷HrLýsмº‹æ]5!ýÁsûµål‹\~Ö& (Ze‚z¿lNÙ¹ +‘ý¿6£Q÷¡˜<&í;±ÂPËj\¯r /e ÃɔCFÑ¢|k6i¹1‹â¤Ÿ +@ùìçÓ ÇÌêq3g"ÿ`¢OôdAãþ9í©agÒM+¯‚WÓÚ;C_”Šê%º$yƒãqŽÓØ3" Ÿä'¿F¼ünwm +é_5•Ñ\ \ZØ:ÕùÌSµiÏÑ: +ÐzØM®@áõ¨¬^t²F·ëÝ>ŸU| ª¥JðؘoÕ»¬C3óGDë5ÍòH ý!x¤F‹Ú¯Ù«èiŸñO¬CӜ#)ÊÔ¶½q*¢#Râ©m× ú•KUÁåz<°ãn#=è«q’aÖvÍjh"uóòWî¿ÐqqðG*ˆ9{u•–ÀMzpWºÃé…îñÂ;f‰E¶Ý´_†Ÿ5™˜%'ÆEò·2 ·à?#ƒOG™ R†°¬T(Þð¼¢áϔI“hÖ%y«LûM–3-TC„®­-»²-ŠôÔ*ýÄûF€~;Ì$PL|ŽŠ‘Á¯„=`/f98%ÜÓÖXÃ5eø7—²g’fSHp/sõۊc @•ˆ­ ¯O‚>†'r;y°˜ì‡d“`}ð?ÙÖý  MP÷>Aµ¥•…=ŽÜ†LŸX%Nãºië)d;ä0¥êrŠt42§Ù7ß5 ‰3øÂÝ 3ò /'RÒl‘èLå¹¾ œš«ŠYçԘÀÁnôÃU±É¨§Á䙑ÎÌÞî/¶KI»U'úMèä&€!°ÛÁÙqa¨‡Z&šúEŽx˜4ÂòT©³_è“qÂx«Í€Ñ,0R¦Á-ãlž@¸Å÷,L$Ÿß¬ìá”l20Âò“é86Àðq ηîŠ]\œ#¹ÐgÃ(Ëg5‰Œ-âGmöÉ«Å®‹e"ƒ>`/©f“~GýÉÒ$¸bˆwEÏÝ"ƒ©lbpÌ–Ö ü°ûãgA¾= dÙqÆֆ6C- 2Çdì5^ áT=¶ù±23DX¾µ ÓÈØNàSސnL7*O£CÉÅ«lüàºhÄá3/'`…Ø `%Ï/ë7<`$@H̅Oº‰(÷·ž”Søÿ}6–0¡Ÿ°Ä(ˆ£°N´³ï9d½„³$¹™ÒÝ?õÍ»#³ v/–?ØÝïaK–—oûí´‰†^џ»ƒ…|썣b3ј_ú“øù— ê#°M'ÍþŒ¡çö™Æzžv(…7•9¸ ÒK YZ*âášgØÈÉxÖ-#z—òß¹ëEÎöBqUNÍÜüŸbM6N¤=KKáÊ}'Bd •ˆ=uhèý\äþzŒÞéggø”d ¦$²_¾‹êœÃ|Ïîz«“‚ʾÝÍR îÒ%칍±õËþ|[AÄùŽä2šd$ó)2VØüò‘Ž*ì,C‘.hCGvª ®×gPƒŸLß  +‰­쏯ö7@SØߝj6¬àðƧ¡ôÿŽ’ÌôDhîÐڔ{þõˆd¯‹ÀK›±0ßÄÄeÃöJgÈ7|=>!9’ø a7¾ôÉøº’L Í<–»ÏURÝZñ¢äž¬û¦Î“Å…_"?œ8ï9®QÅ[¥`‚ [A‚ê!r¿Ôï$‚ Ëá-áÐWqÍ´’„Ê‚þ¿+ ½$I¨¼÷V¨qI‘up ÝEˆ†ÓwDÄ:n´…hx(º¸÷#Q$= B~´`w´ÔñÑÐ÷SY°7Ïq¡³ã‚+}ìeNŠ‹”‚éÒÃT.Ñh˜+kLӓ›Ègaý„›_X:Ô&šC½š1u?#` ú‘XÄXͦ`áõ†Õ³~í´†º_• +#øaœ"@áp!AÞñ§%›¼’mfÉÉ.åÙ &Àœ^H0n7@Y|ú÷,Å¿È;t}E쿾t*f‡è;ó BŠ4® Åë Œ½T|ò&o+Ez+³¦é<¿6—ÅŽÌ¢m΄ÿNBðÈaÊJº8:"RçÝ­*<ë3½ÿq։ҹazr Ÿy`žDÆSó‘­' Ç$6 ž.Áíßí6ÀFëˆ]~xx¿8Öô£uþyâY/ÜùæâÛN¤Ä]j3?ðÿøΡ¨söÛ4ÏòÂV`ïŽå#;ñý* #a%Ãe,˜L_ öZèò±ðS[ÿÿA¦Åöÿ±ÄÍ +®9g4ƒ ‘Œ‘CÜ•¹ ¥ë!+·=ääªW]À f,ޒºTZ¦­H¡å|ì )Ú&¦€Ôï¦8„ »¹”ze–ìÔ½@‹2“3_Q,S•ó”hl£à…q­Úhž^d_j5¸ùäù‰0,VÛ/¯’;}’ªLhƒEƒ!–u‹*D¥ ǎЇô™øÈ8 ^Urà"öy‚ük‘ M>0ëiU8çqÂ\è= ‡TO <–Y>}ŠQ®…C/nUÑë¿Yf€êRpoGFÎDìh<žìFÝ©H+Ó±« eþŽÐ'c·‚Äzë8ÕL¤Œc½xÎò+—&YË×l¶PHâãà0Bü†fÕ Û"D¬ÀҊ=,Ʊ(e·Ùn¶VÊñwËÆm‚øQ÷ + ¹“ø¯œ°ÀXšÂd*¶´ àußFn½’$œê²èçɳ[ ¿·QÙãT¢#僔GIôÜò/$S"4Ÿ†~e¬LQ—ã,HŠ‚î›HBbëq#VšùÿâfbÚ.Sp ÚC|1à­Ô!¬—xRÃJïãø%‰ÚÍ5êó?Û½Ê]¬§©,Z’ŽºB„QUkv÷âéÞ®Ã¦S†’æÎÏ@䍠Kaå&‚ñ¡üÚ¶sº ː\ux0/™4=`π#1¿€²®øiº0q0A —ÿ%w5DÚêZG†n!Ñ~ƒ5tv‹Û»ŠCüvÄ8Z@s¦~~5¹RSž5ۋ€ãКÄÂÑ触9ŸÕ–Ým«/ō3èÅû)`ÆÊ#.%»±–"’ˆ‚Gwžaûœ"æ!³œÇ¥qj íqºX;Ä2?†¡#¾£í +´ú#8w­?‚tÈb\ûz5®§õ5œæYø§µg¹˜* —«•P>F]g ëSŸ³5q3Dñò¦µ¯ˆI=¨R¨=È£?Žú䠈봃ߵ¸ÞI ÚÐRtòÃ@ f³jj×â”Ì,“૤˜H‡L0ò•¸¿*0‚x? ¿X~£I{'¦###]tÇ^ÀÓ¿BqÂÒnz?¶˗xiCˆ‰°@Ï/>IàÐõP[Ô!Š¾H©ú’ºm`1š9šˆ¸låÍzƒV]R{·}ù ȋVÊ(يíöÆ­w…HˆvŸ›–X‡<@jq¤ /¤z"àî-îh÷}1 + Ód¾ºA¼išÜíÒ}ÄÄØ ¾µeA`êlµåxڛ»!Œ€Üp0œ‰ÓÕ2ˆ°í=YkK Q<™¯(H«ÃÔNt»‹ÜIÕú ֝ -Ãéׁ齐Ü×ÚaŠúð`ž/áÊèe”!²``­Sè._\À«òÈ(DY"ڕ;è0鑛Ü…ƒ…q8Š«,¼Xx«êpþUTJSøÉ™· Y›‘ q3Œ9¦X†×9‘(vƒèÓ%²<ñÌõŽÂP£™4K? D£Áƒ7,añ@¿>G!у÷•P~gl¨q¢}Ög}#Çyiè²A|\(2Ý>ÁŠ•BÌâ±3K,'áçH©|ÈÎpÎÖø)ø|©\mÛ·En/ÎÍÕⶲEkfʦâDgV£¥Hˆé$ {J0"ützMŸdݨ=jºæäaâÊFpׁM±Pës VÏ4®Ý ºåÁ³û¬ +nrM«Á1W°ß®8sy†²ÏzƒâðºýÉ(~•†WË_=՜5ûÒH˜ðˆùêé€â±F–vVdb;7WqšABdrG!Ré?bW!98Hß\þkÈ4TחžˆœÂ‘a¨8K÷÷%ü¢ñJØZ1³‚U%ŽñS‰ŸØ½Ë1x†*Á(L@Žº +úôp„SJÂ3Âg܉¥ð)8¢¿œÅzÑx|à ë’IÒTªÇvObð€Z-¦¡Ö?“"Â,Ž©eX•r0´W6ÓA@|i’f¡}”’%¶åÝë)[”™ñ²¸dÙP¾ËO| \hq÷G%קtò–´ù? Bø˜XNà1æÓVR)‡³¦‰ 4{‚(v˜t”«Õ¶Èh䟘žùm?¯ÜÙJšú+8ì@°T>æž:^ÃÛúhõÚùC^›;klÍîš÷Ù}Ÿ´†œõăn%0>qf4£-[Š)Wæ 8Ž~̼Åâ8¬lÛ?ˆ†¸xŒÞTà’ëÏ*||½íœùE.” …çÒ ÝÇôžƒÄñNηp|FÏ©¾ZKO íèiNçíhù†v¨h$$Ȋ%y>ͪ~ëÕk˜lF)‚õ+à5PÉdø‰;yZKœ_âïöÉ!!4©ìûñP*`w€\™(ý¿qÇÃ[0_ÿ8Þì¼Î¥ßú¹ûýÀÊ6a߈e¯°‡ƒˆËE|WFÙÍ!鐲i`[‘wŠÎ‘­ò˜\%'1ű1¶ÎS¥^Q«õk&ÌQÌيÍÊÜëÈWjiA+}#÷ün"/šG›ÒÛN/¶û õ[º ˆª:ž¢Ä¼ „F²J(ùÔN9`vÚyþSY²ÖÁú6Iž´e~ûôÏ:´m»…Ùi9T"ð(y†L31öó“û¿ë0E¯€(}ÃÂôÒðõ‡ÒO×Ùñ„ó䅩ދL%p*’RlŒ OÊñ× ™p4Ý»HUølS¼®Þó¸2@÷‚`qÏBÁw¡(–¤ y¹Y6Šv½—^„tÙ|…ú՚*M4Á'£îpšÀL“t +NÿÙÐÑû +’ùòÉ ®nd¾Z“Å×c<Kw¬WJµI·Ÿñ†ø¤x'äÞñöÃ,“8J ’èx\x„áo¹aeª€wF²š‚ƒs! ‰ùÐYõÄÉ°+zä-Ä˳¶¦ÊJBÈ·ÏÍ6GTÃÚÚñÿ6ŠprÀ^«­Éþ$€Î8ˆûæOs1$—¨~¯ÊÕòü†ùñð_ÂÓóðräAnØÓƒ«²•†C¸o.wwD­˜öVø%Í 5><ºo@˜-/ºÝüõ Ñ¥¯Õ@ÑYJ˄eΣ›Æ<éc‘)fLµ13ÿòzg¯s·íá~]þ…+tM³¨~ËeŲÜxˆ%x¹f¬r€ "–üÆPÖí‘×"Âm£³È;:j‡œuýÂ!y3<·Òégð͌ãÏ[3}j<ÍYkÚ}öfü;ZãàA¤^<ð§ÅIæfŏ˜(µ¿Àw"À2Å=þ¸ÏÔ&‘6ðÎ%N×ÏÑmÏyüõˆÓ§=4¦†½ qQ庫~p™ +A +4y%å»GøóñR“÷€¼Ýà»eûƒç­¯êa0ŠàP)ÜbÉTÂYñÑ߀[·|]2ÀAĒœãŸÍëˆÊ¦þ~r(¬¾ûL~³P8Ö¶®`ŸÛÌ*ÏyÌMÖî{·³›Äê{eÏís¾7பÉ,„Ô-ŸC|·ssëþ'DcP»KÑg}ƒZï…À»ÔŠ“fÑîÖÇ@úo7ØîÙí˜üuÏë†è­îiö¼uú™nž¸Œ´)ˍ*A–VrƒÛ¬¶‹ÃWíes.`º¸ÉT×÷fÕaDí-ô"FŽ_Ûí©cû’Û¶Ô“Ûœ/}¸íý¬NÿZiÜU䉦„œ;ÑHSy°aZ m. EBäusJ6´Ùcô¥€~>7_Âð:¿Ð5Ýn6^‚š› ûó=?èó.û8ƒ'!"ö۞xãĵʡq_ØÛ¬^Øb„ÞÑ=;EA§P°‰'° ­ +ši·ðþÔ®;}ÛM^í6ÞƤf <±ÏXמµÌßZ‘Å—¸P¹Ÿ‹ÚvGò:½ L¬<_úœ±ìx8C›?oÝöÀÚÞê²éî7gï(¤¬¨LX§ZßWS`.³âýzA-O[M‹–ÕÏכ¶žáŸ[WÄs\N‚Ø® VuDbiªf1àkI×"å±Oí¯ßÔc­Àêi©qgÓ%5ñi}õ9ÓõeúøY¯Þ +šP1ƒ:øDAõõ§yû×c»5Þß×;+´– Üi>,]N«Ï~Þ´5¾àõkš³¸Ê{¦¦tQŸ-­Ý¿G3B÷Lܝw© ”Žî‹ÿõ@sw7ß¼N¼Ì؀Fb¥Ø& š4 AÃ>!†¤›#ö?¹y*Ãàü¥öÖsXÜ0ӚJ׎Ž‚¨©Òï`‰z&9 ¿„~#1·)!)­{œÚK×è¶xŸÂ-¸§ö Î|lUÊWñÉúº¤*–æAx¸¦‡. 6ߘ¥áKJ½§¡ê·#õBa +7„@ÛÂ5¸ÐÌ4«@a^ú‘•u” þc„ƒ ž@½‡bÿ§˜š°Uqh‘Ÿ5‘¼@„q·ø•˜ˆúaè‡ªx`à„½Ñ`A&qðJŸ|ƒ*"À%ÑOÅpiìEÛ=P Keä·iöðŸqV3âëV-•O,~¥“­z±¦žNP¤ˆÂL݉! °¿¢6 ® ÑìŒcOÓ³sn_|áMåxá%tÖ XTô©ÔŠ$9w[Ëå!ë¿'^VoÚ'PQ„&NtKBlNÐép@1bÎҁÄlà +ÓÕø-NôÐxX(ò±U:Ûo¨ž{èQ:|²¾‡:€ÉF³d7 +~iÖÃmT‹xßF*XI‚œƒ’Tõpá•u úƒáP¬‘Es^*ãG$ƨA,ã<Éó¥ 9]Tƌ‘ÑHR,':GAâh!º#½. ­¤ë®l(þ:£™Ž/ µ;|&sOÁôxkf“gÀ±¿@ c¼/MKàëïO•vyé¾&ÂYŠ*0`±·(p”¹øx0ÔÂÚIçŸ#‡t5òÕü‘ }NJ.½ +- Ás7{ñΤf˜ß½eò…B¨ ]4b ?ªÎL;«*Z6‚Ž‡šdÐˎµÍXyþO<èi×Á /÷&?·}ÄÁNƒ!è +”èTÀʌDeIIÚ¾Z*ó¾>B‘ß:´HQÍ£fl¡•)%€h”ƒ€²2®Ç kNŠ²m9`ÚEÏ+¢­¬x`ʺ.#ÁäQç2À¾×a§\šÎkæ§DnÊd™ ×òú¿ í·gß ­äH)ËÐ)ƒ/žâÅKšì *ó_Gžã®DC¡éãn©›"‹Ý¥-=ªs}²µ‡CÂÎBñ9J-nXhnþvØ1"6"ž4Ïà3‘(jàÈ'ӑ±Ž":Bµ´j1–#<ɺXWp„¢bÔ|F~ˆ!Ôîã˱—Wޛ<î—QéÛfhÏÃÞíþ0öSôÉò(x*zM^ç)õl눒^Ô!‹U–VëÑ«4–º tø¨ Ðߘ¿˜ƒšâTCÿӎ ºW ± ÛoîªPž +-0/2×JÕïÇöœG‡U†éŒtBŸÏ©;•üò0 ‡—•]}]xA¬¬ÍMÙ´Aû^ý¿ÜÛÿùŠsòþ—E ‰1M\õ¹›pûöxŸŽ@B^ð a\Æû-E˺etvmß\*&cN·{#fŒŸocùŸ¾b~Ì°q§ }¤LOL'Gü‘Ý +˱ϕH ýγY=‡›IÁÐ1 kþf`^í±ÙÃ)Y«zai¹Žß^=ÐTÑôjRÀ³aHw™…kgN"‚! ]J\¹?ÔwçVòÚMä€ÜÉÆGáü- ËâT^4½Ó€Ii®¥™taÈáÉWûÔ+"î{Jэ„N'G¢ê;ÒÑIÎ$þO*BA×DofY~úM]§¨l38¨À Âüi,ö=M;ä2ä²Ø¶â×¾–É@š Y$†ã¦n°1 +©(§dÞþ ·fн“·`ü¾~{Åî1¡à¼sw¸_ëu0DwàÇ·ƒ®ÂĦj¾½ÕØTý(íH£Ÿ>#RŸ¨£Ûߧ@Gו03õ5§Ûíž )&ïGá­GY‹A™7Ê.MÖÜ(ÅRiÏZÎl@=n¤”ôNÿ±F÷\Û°`V§eægdºL¦AæKÆh¥Á£kS2–­¾R_fÀQîÀR%7$7UÐeÏ´#/Ž‹¦6}ŽA£ðÒzÌá\ˆ Hô¡óŽæƒ)«hÑY°.’ßÊ¢¼©Óª¦­a RÔý7/ +myÌQQ”‘ò‰÷CA2A”Qu -dÂŒÿÈm‘A.´@Èå8ï +‡Ÿn‰âq—J”¢+ñIôÕÆý’(£cqgHÔXž}H9MlLäŒh%Ah +Ò6ƒõ<“%HiDÓ+×a Q^*[<Ñ8Qa4›Çà‡ó Ýu…å)Ð5'x¶@u%/N¿¶úÛî:«ÝA¨f !Í ”IPk +089¦Úa÷¤C) „†*ÆÚäPFYžÀ¡TP“„4—“GB?f5ÔÞÚ¬ÑP Quit>9 fh/jäuÊ櫞SøuéM¢¸³:H¡€´Ô?¡w«ÞE.A@CS¦^h Ë2‡ m=A6g´æ/N¿*‹¤:ædBºPf7”Jö˄ú–þ¼Fèí‰PщPŸ0ۀ¼•ëS-ª(í¡µ +³i()¡…æ@]¥&ðê ÍNÁAϊ D橬QŠÌUPoGŠ‚ž¬Îœ‰Ø ú6AQoØžÚ\biNàøòDQ¡*›{5mq{ ñbÆÙ7Û%.±@«!ÊjÔj°A†: KÝQh³,v@½ªö˜=ôJüy)¨€n_&Pt©37@Oí<ô.’ÓoIj„[ÒÁ@CAˆy—iŒ¹”ÛUá%Rðç{.1²€¹·î'C[kU‡9‰uî3—k<•GÏEa|s>ü•9ó³Ü¬Ù’Ÿ%…G²} î÷4dׂëdDÛ¼ÏjÄÆÆ}z`½Ú§§Ó§‹}ž6ýUëóã,êó¬Ÿ Ç}b!ô™µç“û—FÝX+|þ;ðyRSk§S$[„ë#OàJ* Î{Ž&ô7èží0³7ŒáË̬)<î,$Â\BkŌey'¹¼VÁ)V’žÿTg+z^¬mòÓÖÙ * K~çÌ´MáÄð=žç²WO™ElæCÍu·Æƒ+âëïÁ—ÝÂKžt5לG "P™oó:žÛi3ž+S/8æøšÄó”i 3«N»…KlÝë½;¨t6Úé<Æ*È\Ҏp¦€ aúªÅ%]Ãæóë ÀI6©[Ìãœ4ü)Úpõ;–='+‰åd‚¦ µ"‘¤rŽI˜µ›¼Ö¦+ÕD"Z‡PÎ;rùM²……QÎàýI—ç ÍÍ&Ù¾÷¦¦ ”ÌaÝq)!ŠH˜æFf”ZJAÖ̙‘É ‘•6!³1Wwš‰™¥Á•òÏD<ý¶<æéÑßÓ1cގ6æ>Ô§1ó¹&"c2ÇD©ÕL™“˜,õLAuôéâ “[ ±ôjAú3ab.+þJBÌǯˆ(ÊìÙ/!KÂê7üô~9h.²‘Üì]m":@Ÿ/u 쎶(a^„+hO?þYÕl’ï\pÁ°€.y#û!Ë"™U—±#1𫆢øÉT'L."ùõör3&´)Þ s*8τ(03üÁ//ËõnʗôǦ¾l72+÷²Å{Å^Ö!IS©Ö¦Bu{+€à˜,Öz—úONwÙKk—þMO„]úTwµŠÖ%Õ-uI¨ƒ¸q…å<_Ziê\ºµFèFëR.}?FE.+¯È†vö‰T­ëK7(’ £úÝ¢#2,ÅPŸÒŒ£“ë†-y0»¯kY¡$»²–²Ô/­BSœI‹[Ž«Öï ŽüҒãÞ0´Rì¯yð,Ýß} m"Cå,——䦡­•X®bW…­Y–– ,ïòÛ¼ª„èÏ¥úK–S:ütŠ¤!6ö½¤~²²h:–ôNe—±äQn]ŠeU릭åŒÑ‘•¾ÕSÌYÌWÖC?]¯¼Ý½œÂé--ˆ´âÆ(¦¬¯¬„îô“Hßr`â´„O¿Ñ•7!¢Nû¡lâF:2e˜‘vä›hA@›ÑŒRºÄV–3Œ2áßVv¦b“Ç*Óp aЫ +v‚@Ǘ¯,¬jæ Õ*÷‘_˜‡ZöĔ¤®Hœýãn[rêÅnUZ¼ˆv‡Ô:íT7ãf*Gp"Ÿ€Qòæ4³³Òu6ÔSLèŠéÒaÿp@*#+¡¦|¾EiL-.®MY¥ø6ËæÕï$“ÏTÖG¦,dÙ­.†<Êî=ìx4µÃ:d 8áe¾˜JÏ-n: œ ”VzpcMæ5ѤÌÿs:IÊþ,]¤ôo¯}ô0<ïÚ)î#¸ä†ÊƒlØå÷O²@Ê2Š¢E $¤R”ƒ"Ü/QN±ÁÏM/°Š3ªåó–¥^ԄΗ¼©Ke(O”A"ìû·ÁU(”¿PX~g¯¤Þ¡,ñ‚C­ÄžíW`PÞ0Oag’ <“пŸH¨(‹‹¯?YÝ:ùÉ*8•Ž§d€>ÙOØ)‘Ÿ¬7»r{Ò1ÛîӘ•@Ô¤“zêؒz Dµ$”òdsàÁ“%¸QºÜÀÇ‚»v+ó<(ƒ“:µœFz“¼äŸ“8à&ÓÁ/°€AÒ&ûÅq#Všì<÷A“ðԝÉì%uÇ(UÅf&¹xbŽS&òÊdy¤‰IXœ¶1yo“çRg0yÎò\q×Íð*`’ÿÅ#ø—%#=5,™ñÞ­¢6lW’½å²m{ᬤü[•„«ã*¨$ÿG.DPkc,=I~éDš“¬‡“½­¼&YôB‘ÅeÍDŠ¬;l‘’܉ê“£ ’”¿gIpÃHæ›÷°¸ù³æºííÓ{“,ÅÔ°Àš¡*“™WžðI*urNö•û¥KP¤üw ; +Ð+sC*r9?0v æ¼"/^ò”dT'”Ÿ]÷ì~ÕÀ ÿáÁ~3G|熈ABSQÑ‘<ø–Ð"–é&ŠöùfIA¸o ÔOg”:òxòºž’Çòl^o-Ñ´gûë}@±®ŒhLb™Ê³{Єэb"Œ@É!—[ +åñÑ\û•æF9ts]Øi{ƒ4!Ïopß°fÒvƒGyàÑځ—)kBgÚÇ;çŒë¸ë¯À\ùú»´“oFmˆ ÿky3Ìï®eº¼[†ÿn_¢£·çe™¯%WªüìfvÇ"jh*K/Zùɀ£ Ó6ÚØ Y‹ØœÓIV™³yUZN™úf”Äy+áªmО~½›ƒIEƒ¦½ÚÍ$ kDÖäf?U&7Ö£Iº¼Qô´^†ÓG•éž•ˆ›Y“lßLWȋ3•XmÃùjKk)—›3(FpçÌñ¶Ί :3ýP/g˜%ÈàÑמÆùá (H8ˍì±)À1ýˆü@‹\ºÓ†PPú”tœy/$âÌ©ÆÁÿ&ñ¹ìTÊܱŒ9ÝÓ0n q¦MaKÄ,ÁA60µ±p +i®†Áp¤K°#ÅöE6¼¤Zx„œy)MšTœ¡§kÔ1‹ tf[ Uÿ1ÿÊ4ë֑èÆñfeÏغ´Ö8:!aå:ÆÌë=}óÐ@2߶ƒd‰î`¨Ä) +±ÝÝ9¬ÿ¾ê¢C9Â5Оiƒç¶ ü=ñ8Ét`!ÒÑdÅûeø—Öµr3ÊÀõU‡GªkÕÞÀÎï;/fl¯–—A H³IèГ«±©y \úV< +€ +%æÕ؄(3¡Î(®˜žžU¡Uە F9¶ C)äA7‰r¿ +Åx"’Ç?`"Í´“|‚U•—š¹DU÷u÷i>Ÿ;¸ˆˆˆˆ!"Û¶mÛ¶m_¿mÛf›p5a_–/Íû'¹óÜ)&à°ýۊ! \1I²ž{÷xÛ#àÿÿÿÓG°û?ûØì{°Ñæ&ßÀO>ˆüˆ¤/™þÿ¾8‡«Ý}˟ï)DD!‘Hj«Zœ!‘t¹dumµª,’U,•’$«Õvfø1ÿÌ̈3D4<ªj bsK "¬ÈH0ŠÐ +eö,"œE։mœM嶑5'BŽd@ə³­”¤´¢%¶mß6`VêR Û¶ýYÓ3L@8`‹à€¸oñÁÀ~h[º˜G^柩Ç333ӱɞ™{>3""›f"Ö¯v4"Õh+™° +¶m·Éo +܃Ô÷iF€ã©i[¢@""""""¢¶T”:«Šlµs t†Š1¡""RDDm²­ÛVµmÛ¶%IŠ!M’Y ´-YA²¥4@ríh贝¶uÛ)ut£æHŠ”øs¥hv,]) Y%Ž‰§ÀSíK²Èñÿ"fLgffFÌL×g:¢Õ¶ˆˆˆˆˆۘñã®EN…Wxmþ¢ª@RAT¨šàÁÿy øøˆ1›`fffffˆˆ4QÆâ^õ"ת&,1’$EF‹\DDDDF$ CDDÄ"²±mÛÄ m›mÛ¸äF +INÃaI¤àØ6é*:ºŽ ­¶Õ ¥¶"¶m‹a1èÀ|÷‰ñ€ùÿÿÿçóïí›OlÓ mۆ6n³Ø`#ÚhC£Ñ¶§&¨\?ó`PI(ÆC2É"¦<€(0 ^2DTNZRf›+‹R™aXHO°ÐdMVXw¥ ô¨0 ì± µIáH˓eS3XÌmã%üRlcsrU~…d‚·+¦!Mé+Œ¼­Ē:¹ÔŒ^Í)ø +)dS4dÏÈ<.NE‹2ã}̏‡ìÖ²ÄFãd2SÅ@iVÁ +e E³yÐbv‡Mõ±Ž + h(Ê¿”¾°×­«pp̜Hq¶ÝCB…ŠÎ +ݕÙZÁ…9óD!ñ¨0)*ªh©¶iÐXa-àj:7‰No =pqxB¾…ª&ÜL°jã1}>?IS¼ +ñš˜Ñ'[䆮 +«H8’OH/¼Æô…8‚å5wQa÷ü 6…Ýp†hßá˜yÂ;m3RÂ֎§²XɤFNæÕè£Iˆ¥|¦VôTHÏ!Æo½ø8C‚sv â†BCš ,ï)dòß ° t½«˜Qˎ'm×òŸ‚n)}â衐úV!/ªw÷H¥³Î›Š +éI·ˆ +Ë‘¶,µ$ zçå˜" v9R»:· -ûEšá¬úÌ÷1ðq“öðCa¾Oø´*1Ÿ•²•æÓ Î [³Y]¿ÕՔB!™6•ëLÈuSh÷ÊégNH÷¨½0ý¦Ê8l +ÃzíÌÿ#³šBiN]Å@½#…óò¦9לšJZ +ý®ÁÏqéaX +A›Vô¾Â%­âýA¬ÌQ­<|Gh0¼†Gˆ½I±18ÄÃœMHД†Æƒ‰Æ„N@„Vh(L‡B‰’½4a¤°÷aù¥¹mhF¨x‹ k”憣С»d|¼a™æð}®7‹‰ì F!/Š+mښ\²[ŽºK´ÏUQ˜°·wm¬EQØ­!ª0\‡eÀ@ҁÍÖõG!¹ÙkꬥGÐI…Ñk€…i+À3¤i—p“L¨Ã6ÎdPuj®‚B¯ËÂà ++"fP…® † +KÇe$Š€Âöw„Ë13Æ?¡öÝ!.Ú."ՃŠG˜æþƒ{ÂTG{B¨H5'¶æ‡Ú'‘ïɾ5²&Ä>þ@¼)ÕB¯ok£Ûñ‰fž0Üâ!-úv ™Ó7qÄ{æAÆXškÅ”Ü ³ž2&¥ Ƕj<7´SÄXX',?š EO¤ ’NXñ°Kt%È-tÎMJҔ  f¼žíJQvh^ ÚÕµ+´šfN-F2š«Ê ïVûôU}ZAD9a\Àov‚*1FÄ1øM«Ö„Ô‰“Döb4¸â ‹3€É™÷ÛóÑ&̃|(bm÷ufÈ&4‚Ë>x”Ã"ÒˬÈnK¨»ø5!ÐQîÎâUMØ7Jï÷ˆEeð²€šnõRúñ¤4jjÃ:QLX‰>’‡hÚóÓÎe5±Ý;)‘Ú~;Ò1C3Ø3aØ +ŠðD„æ8ºÖ?ʚ>K닚 E_Ïp”ü{"” fÂë7—˜'»Lå0ßt3 Qx¯‚‚,œÀƒ4þ$yèíô.^`a¾†Ó®:ícö(¡ñeéϾ]V\ +pÏဠ!‡ºÖ2B³øO‰%R¿„rÁßÁ çd\ ²'”Oðúgöf%Äá³6Ô¸YŽ¬«„§¨L+L)ô¤Â%„†]æb»ÐàÅj\{±@—"ÇMRKØÑQ›“BIdÅ~E1 ò|$z<)•š=V"ÎUKHëЀµW²C‚Öy½—‘ƒQI;!´ì>¥P¡Ÿ2´b~ ùTÃY¥„zñwon–Àl;#%dE3üǸOe£„µ4Z'>QBþ³ñj¨bHšg“˜fd¡„¥D̯˜ü böŽ²oGþôIèVw¡vé– 'NoƒÝ Œ”¹˜d×!ûßóš‚''"Ëù+¨$ =ôX bA-ß ¦À讫6I¨·>›bôQûÐ{ÆËH‰5_¬ %lh¯þ}ÐøÃáÖ>š"Ž8k$¤JH¤bu9BUàÊFÈ2À­è«—ˆhì°H8í'aj=B¥Pœâ˜’)Ö –Ë a·BT#áA–¥ HX† r _€„ÏÞÙ-„m6h«âŏð DÃV}„éO¬‹ +›sz2yփn+Üåc"”aiñ Úo—é¨õž­§SFÈ»ØØtú©cP€~hÆX:„­Ìü…þŽN!œ 1ã_9h‡Ääç‹t¾1ßêw!tlʲ!¹'TŒ½7]„Ü2ž’ÊR/!ÔݘÓÌ}šìêÆƄ³ iJ#F\%F5(c¯„&gèDrá³v2N?÷EX„WñÆ\⩐ÐBz›‰"Œz€(BWIO„X²Ä ‰ðʼnzÔ/‡Øóxò×DÈ×¹Ù]"[¹˜¹ºº¦GŽ.Ô±“n‰P.`3ˆ}'N_3®MUã#ÙI"Tr×L’¢QÆ,ÄÚêü {‰ðv•Oìq|8ÞtŒVÉ]{‰vž™L)fºÜ=G"\ó!Ôê +2º'êÜLéÿÄp‡aÆé^íIš¯Øæ5¶.ÛÎÅÕµIÅ+‡P3Dw d¢$tÌp¯÷Ùz39·‡9“Â16ŽµE˜Ýà#­ô"˜ï Vbm3æpC¡ªAÌn¢µ®VÒ +-Ͷ8Q¾4ED…Я±¢YaˆU„Rž ÕÂ)È3!¥— ¡özî:wfš:Y8eŠñ©o#v0¦Hí„d=3Þ¡ˆ¦7~`\™6‚„±aœJ„ Ìd„Öœt£·m+EchnW¨æ,F#ˆKÛ ƒe˜¸yÑ ä87&ß.2gb +‡VG¯bw!c°ëÁj½,² XcÄaš¤!ã³ T”™ñLaÅÆHÔÊZÁùC8ªNS/êžPž-˜Z|„®®\|Ɛ Ti§à±Ñ¬B13’ï@j ”ŽMðø™[]—õ@HóË®!‹!€£AÏ°C37k ù÷÷w=ëɺ&cùZÙ²Ü ÿ®¸•}¸|´À×É#‡&éÄæ½çvf:`œŒ&òUBÆ;ä´´o£tŸ4[=1OA”èdíB÷WÛkµ¢& è™`… q<Ä ÐÄt5ÛH“n#a¹„æa~bK ^w¾¯$0¢ ~UY,KY¤Dä/¦ Œÿ9@$ÆÄGČ çåM@ϑùðïä'|‡Ë‰7ÄÀ°w¬0od>܅l¥0jç‚ýd6ïX@(d ¨‹Ðµ³a:O‡Ò@f¼+[µM<ÒÒø€-󟣁͊ÊY£ðüU8ØÅò3dO=VŒ¹@»#¥çjŒSÛ$8ÉC8€Ibz³M‘Sç¶hÙS+.Xƒ`ë¤küÙã(áªða²!ô´>¸]ÝIâõÆÏ÷Sñ•¥ž^¾ÿ*FQ2»ÀbÜ\KûÁ—>…˜¤ˆöDàšG,*]K«/ô²ÈŸÒék1¡Ä±¹  4Ø`„ÌËóhá—¢¿¶Ùº÷]¢Û¸eÕýž(9“áÅFçB’N7’ðpŸa‰ððWå(ážQÚ ~Fà鱁6ñÁÁæe”VÏƘfy¦u,dNËFÜ¡ÅCB8ÏPü2œ:Ñö:§i%/#†*fàªJ²–E>dó6óS’šÉ‚JÁu°ïçA`ò¦ LTE¨Û ö4‚}©¹N(SEæDÏ Ðbðr¥õhÙ×ÌÖ1sÏPËØÉç¥C¬‡‡>›ì[¬4¶ñ ¿[¯˜–^|³ˆóp=ß3ɜÖUTÆxNjÖøAná0Xég._„QÇ;“0KAûøî6“Ža¥1p “ý£hµ|¦ lqFÁԓ„÷Øäa®qnD=|Gš“¹0‰ÍOvÞÓ¹ãŒ7z§˜ÉªÁÀÀ?Huœ’À +¯S«î°jZ4Гׯ·g¼“ qÏF_0¯0—8ï'P Ó@ŸÙ¼.¹gFá³k9™idj¯JðÝ·U]QR q…Yض`cšP»Ÿ}+‘]¡ ¯ô­Èp- ãRÏæc}+G\aI¨€èñ,À‰ gÖº&Ö@¶ðûGж%î]¨PRš~øݖL(Iæߥ/Y`=—•C·I&9ã!CÐñ„Üzk#„÷d2×?r»Š@múEƎÂÃ_®D¼/Á÷2¿³>ê}$óŸ +ŸÌs(Øh¢<(ïvôŒëýgkKYTº®gꁃtÐTnÏ3H[…§¶…à~R¿ÈՈ€ógi¥€€ ³X?wÂçÑyD®¿î‰hH´uø£Á'ÐaÝm¤°hêQÚ{-Ø#ß_-®ó° ›tâÜe¡?LÜh,!ÁV>J’@{NUlÀ¥Đ|·ÖUGT.”IƸÄQ®ŒQgv¾ÆÜâ2ÌòD‚06ëqúÙg«F0’ö$ÿtŽ“<^u*þæ¦2R* $^¼hVœ•Ýç#ƒ¬ÀS¸Â1 h^ ¬Ø ‚²@Ÿ>ÂðÄ"‘…# "‹éa!ˆ3¢R/„ +¢·gˆ0÷ûñ·K wFڝ”(½DŠ_¼º']ý¡4[Ÿˆ/;wûü)‰È£Å™]Axâáez™.ô?h$5eç}ò'lÈtñýؚQ­< nJ¦¬iæóð81—€žúÙj`ºé0‘v{K¡+¶WcBw„(T:½íì öþl2#”XJ§ Œ®Ñ!…bҎh«äÇ6ažr‚¥ *"ðFY0 ÆwKY⛚¤8»M }Âqex05|/ +¯„­Öú–¨æbÀòªæUâ¨W«A¹Æ9¸—¦wðT n()!É`?ŸÉ2GwªRcÈÌ7·`”¾\qg¾pd›TãíĚ+|\M2eççle”-h‡•cx8b¤v!BJf›Én_—œŸ 搷u_ZFá}Y™0Û°E­‡¯¾NÉÌ¢Ww.œH b݄ +é퍠¼¡åUÐX¼¹L{¤~®>ìBep¼.(l|”2(†rìµ°{£ ©­Ïœ‹ehNŸ[.-tÔ#@Õq ¦Ä'Ú`”’…ótÐ`@š ‚f$‚`v«íIQ¡Œ ~„»Ü=Áˆ¾µ?^ú«Ê™2BÀ|g‚^^a™f1-YŽÿÐB.$8Ͻîÿ:#ÃäWŒtë,xô.‰ñÀ–àu@ôRªq™áŸåC¬×¼žÑ›PXP +/3£´Ðàð2Oj˜â_èVIÙb–‰«ë/§‡W-úu}²Ç?O@Äx™ˆ”h› x-Éf±, ËD¨Úў¤, ‡ÆaÜð*w@§#͸¬ÆJ9õÆ&‡³´g [Œ³¼§Zà+$ÐXýü”¬„ʁV"ʼ2¼ }= 4§ÎARœ\dΑï0öÝ{f;#‹,ñfHfín€á£øs‘F]xñ‰/r1ø`ñHÞrIJQ½Åüë{&H³e…úðän2â°ß×wc.àýˆ«¤¦ò9\\‚,Ù º-Ê¡>¡Šg@I“ðNt{ŒÓ.BcH6y}FõõåE1Þ)¿«?@£,,8—½78ØYöÿ®p¦žiåÍ¡™Äꆉ_6J¦pXÖ[hv³!y\ ß0ä¥y×öY£© ¥Ë=ë]u0–òÌRãô¾'Wžlpñ^ DTtÕmgÎÄRR¡™·gŒ#ÌØ2êð?j1¦N/þ1£¼ª™r™®¥’IK‡‹©¡ÿ`̽Bmo¯Œ5IQG9ShÙÀÆí|zQÿí,˜= j#èR1Ѧò5ûu{ސ J¸ü±ñí½ø]©p›É÷-]¡¶ý{ ­1!ªY£4¼­Æ)7>ªqiÆy«ñ)Lt©d²œ1ç«q ¤ªñRãD¥“ ¼Î—­.Ïú¡ ¸âÒYäóSÂN㬼ŽV j|r¤F00ÚNlÕÈ/ö +hKosËÊ£8sv»õ´¯4íª-´Æ°‡ÑÌ:¤33äÑLd5ÎN =¯q¨ð÷®‘3²ñ{ÝnÉ^¬ªªÉü‹ { öïbÌôE;üþn }%I-ÎSŽ6&}5.>-@Sƒ,Œí!¬ÎšO~dW߸»ÿj©‡À³›Û!Iö”s¶ªåBJ‡'EÏT$>þÆO½ÌˆatÉ&VÚÃk|(8_[«/ÌÅ° d %#ýûDŽÿˆú(±ðÔ¥“+Ž®º 5åS–6S:­=åÞÎ=Ù۸籇\Îöh3Q=‹–æN/Ëäébò®w5EUƒ\G€FD ä]†šCJ<ªI"㍠+¶¦+l‹›¹`ð|ÙàÚR[ÎJÙTð+ÈC¿&Êù õoeGbÀ"Õl§Dþ’Ù¡ql?‚F ·@ íK?ÿ‡F§òŠ^P‹ÑfÙmî¨^6è'°²¡C(¬գ֟ؓè¯s¤ba¯Êá*ÀÒö©–aó+s¢ÊIQa9€âàcÏ +­øS¬ÞƷď٭ø‚~¡UgVÏA_Þÿ¯X¯€Ò&_ËÝށe˜^ÀÁ@CÌí¼¯ßº2OôP+ŸjÛj ÷CŠ¶ž F9|AÍå5^÷8£]:±,o%½¯*›®>±é·w<“”Ïo¾ïJŽÂ—:“ˆI A“Q w’>Cör=c_)ê•Æ¿’´8:رI…ï‘!yC.ðÅ«ýŒC VàÂs‡WÆÔ'5ZWƒ«OÁcÖZÂšíj2Ia‘ú.qŒ›¥/®=¯/Ænè@.X%I: d\U†äCˆNù“v7ͽ/0ê íá¨j R™ž¾D^!Â4`œñAD°‰Ü0Ù>û’¶ïA ²'r‹mcYBvûS^ bjI@ó°I©QÐÌYDšVŠä÷}wj™ +É-/YÌn‹ÑKª,ÝXÓ¨|g¥ß „¢j¨Ô7Ðx°ùDˆÅ³Lœ_ô ê¤Ù7’® ¤˜ÄnFF!¶9ÓV8!¨-ٍcž‘C?—_&X÷¨)Æwwï²ó íHFu9f‚óGÂë8`P–8Xó +s|q %¬EÛbds[?8~˜l¹{uÝ`ß´ˆJÛó|¡ ¸!¤!Á[8 ­‚ˆŠödÙ<í4§’&Îve\jÊÌXìrŒšêÁ¯)Q· Pu + àÉGnà€(¢Zôïªw,—Ñ#¦[§ì5ˆЋ,a(Z}†\DIؽn¶ð¦T¬ÁíÌÏéÔ!ÞŚåO´ñÀêo™w±NÝGoÞ灊Õ*Òס ro¾ÆjY¬Bhн©üæ­«‘ÊEá 7zýÉu„«Ð2o‘‹6°f¡§ùÜ¥ځñe?»:MTÐùع~îKíイKÑ$¨+]¬ÌQU½ùTX] êö, *®àv¡Šï õ^vJ~0C0j‹ÂõÄêflÄ¹Ý ‡‘—ÔT$?®da0ÐÀS>I}aN÷* c*ÜKiÌD!?bA}d¤‚$¢ÛE‚žÃ¹@`„5çŽn"ëá,¾žÞ8ºÜ *˜Ì”æ×p~ xE<}i¨1ˆ Å“§)vyçç*nWß`qï–Î’­Ï ?˜$aAéžÙjLÁêÍIbç·s›î„5}‘©cÔɅܛwTÚ1’µ?×mBs¾pµã:-'Ö¶ºIÜ fë L`܍ÞhÐOê)3†ŸJ’¿`ñ¶eŸêV²¸B† + @̋Ĕ+<'>Pmè­¨‹Äuô2O¬ŽèÐLhãÐ?¾m3b×.5 +ò€¬Ñ™ŠÉiè_àu€‡¬ðuÛBÉCúé˜ô^VõGú\ËäÈxm™ßš±[é®þä5ÌhöHÎ|vù®Ï¡;ÂDâ^WÂÀdÕk@™ê *³^'p¡mij[¶ +TEmxA9Zöv6›-°é~IsÚ®éõê}#ê7ñÝ!1^vÿ;¨òÈà¬ëŠÿ¯@PßbÖqX^˜ÒCO%4×k`¯Â+ÊH’ÙèáâŸBw¢;7:…1Y![¼ÿµ£ŠÏá}Ã-+"rq¶½nuxEeí±¨"žM´>\ÇÈe°…«âÌf#“fû×£AcÓée8Ul¯¤”Ý?¾Àç·rùÿ&eåÆÿJØ°?à•òŸÄÄEƒsùý ßðöJ†ðhà‹ /£‚;o܉¼àt¯\ŠmWÚɶ;^—G-‘+hÝ8džDÍFêùTˆÀÁ/Â!€}Õyh½`¥!Zš Æúuý +:'ìIx X4ô=\òó`gZ`+eÉD'î€{¹¨¸ðú¡<±…iô¦è†`W(à֊ÄB-š¨÷çÊ.JgØήt…éÂéMÞMÂ=©%ÔÞé2Ÿ_¡ö×µçLlwvñCƱ4+„ Èì… vàôŽôf¡§ÀÎ×S bvã”7]GHá…1¦P¤Šlvô!c¥°‚@fx™VŒ‚ ®‘à +=#Dd.mÕØl\Ò]˜ç¡¥ ¡#&æ6EöÙZµ÷RaJ0}GRâ»NiÌ{qÃ%|”„ŽÝV„0 ÞÑÇy0Ɓi¡ö”*‰ oà Æ&¾¼!UËJ|l_'MÙ¦ ×:­SÚÉUua#¯ðXäýÈœ×SzµSÕóIY+…°¢ç„nf“Í•ߟÉp÷Ñç©¢;K ŽÛôCêL™!Û¹k0lúˆv?S߈˜Ñ†ŸßÌ ³ßÜ?$<ýÛÊb¯>èÚ´/åR¼Ñö Ò§ã¬íArï`þâþìÀZÎkÿ`<ëoç¼å| „¼5ĔsÑRù¼¯QìÅw;üÖ¥§õnêˆAÑHڳփ鏢ǰ­õk¦ëF¶‡D»MnÀçRÎÝÅÍlïI$¨„˜ÛUèC>O¦Ü¿QCºÌüËé±O¹!mU† óõBÍø\I‹Di`(Šñï +Ò +9©ÞA]*…÷‘Òr$¶×FÒ$…sc3Ž¢¬Vî¿S¸³áÍÊ=!Tl(÷€{[âÌIÝÚÙq+”q•@üéÈ#’½ÀbDãúB2sô¸Xù·uÛÉÁý`kԎ֜vÑ/T0uï*þyr¼#“®2H›Ðãðñ$ïLÐ]¤H"ñãËÌA/(~Ä4')@ þ¢Rڐ+4nä°#ÕWéòÔµNf~41Uî3z&4¹…gã·ÎAÑ-|Š¿üVÁš¸ÈžÖ é žï-D¾êü:ÈmæŠÄ‚#³¡çl¨Ç$ÙGö`ˆs_yŠk +ú’4'±ñ~( °×¦¡Ñ}F¸Œ±`AHo7’™hÊ +â`ylxe/,ºõÊÕÒç b?ك6÷¨ÅöE`g\öt56ڄƒ|h b®=F´l ˛ö–ž$—æ͌½y2E0{¶‰ W,u +=›<­ ¬`\\xÊi!Q:ó†éòmðp{¤cwÖ!U0uÓÃ˃Ûóª"îƒâqÚƒ@>ƒ©J6éážž†í9ÂcøàWË “ÎsN£‹v÷ 5hî¹[ f²æv÷§ QqŸM§F¾o§g +®~Û?^45ÇÅüìù%Þ]©6­|¢œ×¦:%Ƽ¹ºE«3·Üz™ˆçÞüÒ …—8 ðó%B‰Ì‘'¬K™é-„q&Þ+]í OŸ5>ƒ§dÑǓ;ˆÿåÇu`Iòo +ªeÀP‰4PÄðÎ2ýÛ/*XÄãǹQù¡¯Px‰yg|Y›Ù±÷·Šj,ôÃݧßÉ7Í°W(  á„I"òÜãËõI9Ò%óö#t¿Ü·le3q…ê瓫ú²·QC«òÏûFXƒ«&›‰ÕÈàÑí>¹Qùä}ǝ…ŒaŸã‘r?!á:øÎI{¼Ð…E΅Ÿë­«Â\›P¦ŸË28(Ώ8Cg¼x(:6š¼—‹îEŒfxKŠã˃MU§÷Ò=”8[ #¢‚xŽä¤9 ü› Ë×Ëñ⣙³PC:Û°‚Çœêr§¹3`zÀ,®CŸPyìRÜ-„v-žôö×aŠ"®±ŸµAö„³»ü†pFè«B‘"aïrIœÂhíñ!)fV%oýE(~XiÇ·¶Ì‡šä¸8¯Ó…/́KUÊ0šò™ÔØS¶”˜¼³½€ŸÙÉê$šH™í…ØöžµÎ»?»R,O"–­Àï@“ÄàÓ4Ž‡Sõí|]©¬“õ4mŠ.Z7à»àþu©º× èÚ«>2<µe©CÁ¨x¹Ö¬Ó0qEÏyœ–¸…ñŸŽ~óT¼Êæí1à¦Æž•äÃHvRbµµÉªaçUx‰ÖRóá bfÑ—AyZèÚc2<øS«ÆÍÄ>Xô…%Q$¨Rʒÿ»˜_ü5D޵Ȟ ’µÂx‰î aÿ÷ªBŸå´ï £b•qzÿ"4U2¾À4Њ=÷P³©_úCÿ¥) X햿@£¸ +ÙJ¸T‡$b7¢lúY E‡—áæ +Q`ˆâ¼œ4Æ_ +,óÔSþèí¥¹1j•Ö¼_ö•Fzg䏒¯ LKcÃzr"J…*Ú¶±2äSé¥W fô1ÙÖ âgï£_…(O„Šušåy'7 +o[G—Ë{vË܏J£Wª§Æ@äcH£%TJ6}ÁIÈ8wæÑJ±÷zîðØðî6 _mªƒ´³.Tû.©B‡hâ°\˜{th®Šþ…ÏŽ¦ÊÐf-SPø ÄN6£†ªÃÇ—¼&  +@„B,v…¦ïN—’ù]ÌÑØ<¤êpÏ·Î7Œºé˜ÛÀç\Ò/D9=е.î@ÉxóWTbט‹À4¡'I,͚@³bŸvic¬4gá¡9dªa(¼J)&#Q¡jDVx¬Æº  ÆùÚ>XԞÖòæ„ãˆj2I§Q^uòQ‡D0Ðw³øŠ÷îü\Èó%Þp ¤Õ¤¾^†ß߉++â+©t£ö2 ¶üÔÞÔ-°™Kz`<Ó-<™€ ÷¶CËÓ!MŒõ u©®Ps|¤{ar…¹†Ã²– “C‚[BBãw8÷é¢ùB*€Á™‡÷QzJÓ@ŠðÑåoS˜ Snñô~’'Á5âÊ°üˆMi*êG[p]P퍶¸àÙ[á}š¤1)ô—ªœmð_À[Ý´‡Fƒ.²ïd£4ºhü`'”>ŒG@r+íp».®’uIY:ÑÂcÙrÔÀ“ÛR•ë0¶mљ +Z5Ôv(\w©·î¼þÒ V¯šOûCñ‡¢;îšþ|ª ›§|Šµže¶¸¼Ï×⼳۟O#Ë[äþ.ž9þAM®":ŠŠh+‘œFÃpw@w”Ævñ%‰DHI:÷«\2¸Eè §'I0t‘2HZh©ÄŒñ¬µi5ÙЕÈç !y( 4fs‹<ÄuÇjûk“—‡=âa€®±C@.âQ@Ë$G™<›l»º0¯)‘œû?ýøÎjLÅÃÙ¡2 H;-XR… Y†VtÆ3k¥Ú<Œ/:e…¤‹´ma#S³y ýß_”ƒSÚDÊt"ð$ê6wF¹"b…ðaÑ{oöÅY´v“£Hí (o„ É»<¥å{?0‡e°¦œÎü`F¢Òx¤~ùŒñµ²“û×Nk3êcÒªØ1IQÁIÿ­uûºñ†µ¬%L˼¯r[R —,Y×_á$ çž®ÕË°Î~è¹ü{•@ªLFѯhdrtÏ8x‰a—ÕM3x6D8Wð¿ +‰Sm/Àè| ëe¸KãHu‘[§*;IHŽ{ŒÕüŠÆÓ#jðþm0p(P¡˜Ñ’}ü¬Nqa ÊÛbk©Ç‰Ð¨š×AŸ4ݪÑeèý7¾K]_±Gö0Oõ–—ùï#Mq] }¼ ‰’À^ñ–u~W ¨~QøW*ª~ŒRæ|!2^ŸÆ¥¢éWª8&e`›1 DÖìüêùI*Ã%×·¿³åPM72°Ä¶È•‘59¤nœ –]iâS»"ÍèÚDNKþ•4™Õ÷‘8^Qg7rMãóñü)ö{RoípIŠ¿BM5Má>âèÌdq?:=&«r_ Ç®£øÍ!Hö×°!Twœqc[­•»ü”ç$Aâ#\-J99°Ž­É}æçåªþmš£<·þ(FãßrûO, ‘z½M-É"QYfnùúQ!Pñ¿äš`p±j,^󪛾®ª 1íƒ2ð`ǎ-DYž2&qï0?›Fü$+OÞa½¸èš‰ÕäbZG†c½z5ᘼÏK¯ šnPç†W“ƒY|NHZ„±ó‡©0ØÛ"Ô©9ij©5Üٌ…‚]TºÐAwÓ;FÀ¯¸_aÑÜÞ*`Fg„N†®i–ãqIyš2°|±aøIùwÉ8«¾Ñí7ò«öžçi¡…´»¦qí¬ÖaZPÉ\ /ì­¼«’`b®ï´Ê`c%;|4’—¹ÁO| ¾Ì5ûX;¤”zôŽßxRïâÔ¤Öé-°2?Ɖ¬Rúû‹¬MN¾Æò|å9„>ˆ€}È_2†³:i,laKL¡µA 7YO/ë¿Ø¯Új€1(=@s›zBÃàï +æ#ˆèè?]X9ÃS0ºtö2† +òä2gØ §í±$yœê‘~ ÑÔóš˜éuö2̤K ‹Fcñˆk­ˆÅiÞ¿«3°a¿8ˆÑÜ³Gª{zlh›2Î1[³Æ((ÄÎVr€»ê‡ WÕ§$g˜ MFn “Föõ†€±‹¤Ï¡q€$å ¾z›GÜc(¤†ˆÒÛÔX®4Š~⑇ݘÐ'+L$ÿjúE‰g$±(G¸]à»ñ_ce?Æ*ÊWHµ(}ò&_@¥Ã•Û¬F„y ^P#n֝5³£ Fͯ€Œ.€¸Z‘¾òÆS.7ä€òÍU•:¶Ð8&½’Ó2J,M%+yñÒj J(<¾š‚E~tqç÷-iøV€)Qˆѐã°eâ"oÁ<#ÚÒƚøýϙº­«¼öÜ]¤MQ×u¾ñ5“è›)0è¹²Ùt˜2õðV5Έ>.D{U¬CJ„þÛ°$)³a2J)—ÞX/C{$f»ou¯ã ííÔX@6«´õþÊ#òÌqѸ™ÔÂS8€«k©< «7œªYÕ#öMŠö…{6Ðiþ$᜶@9±8íÈEáÊs#®|cAÑß)‚ctVK±³„ÛÙÇKÏ@a1[z‰kiӁJ¾Ô +âD&¤¿ž×#%BÒ_v%ºýŸ Ÿ çF,‰¿qfËhI&4¥ØߪÕj†11‹"!NZk°×Àƒ<À®9ƒ¬Þ½B‡‹eB®)µ‡`™¦Ö3btUD꫙ý¿­ešYê3ÞÆBÏtõpÝh9÷¯5ï7nrZk 3&U9];+b֜¯®þK …D®{x ý™~åâ«LÈ#BÆð+L‰,à2°0tVö”WM#“•Î~&d ‘cQ%÷Cš„FÁ—ðwæý™)`‹KÔäàk©××$Ôa³¥-¹cPã òmda@ DPªøç;‰†6_£ŠW6U*¢ w"…öWc¡7 #­±9áC<äËp†y«‘_@²=‰cDAð$ ýÙʋ^¯z½FœÇ[yµÉ½È@B„# K3\œEô`)[ÆF[‰Dz&c#ߒ + øJ +ñ–‡nz'Sì¿úpo,%ò6‹}¡ûrìQÁ·8̬qrÄB¢!Ëòq¡µ +NSËc¶"ç¬ïЁ“~¡¨Tc#—Ÿö +<'ðÌ-ç#&SÄ=e‹HØ&ÎFªMÛøÎsËpJ +÷ +¸I]%ŠÃ%wápfwú™eގh*&Zªy‹žaûSÙKœY½#\þÆk¨µÀ¢‘⤚ϮDAfè¨UW“ßb£yæiíy{’cdÒ?”dhÞ˃¤§æ%±òR͋Õü×ÂÛ[/ +nØsh¨æ-Øn, +1òŸ¾Š¸–µVf²3’ß-a1ÜiÁıî':\bJždpD_BP¥â¾J½FÀ¨•Ï‹D϶ΧSö¡àÅsòÞ0,.öÄwq ”ÛAQf¤ò¶bóȕ´óü ´;ê Õ¼…RÆ\ êÕ·7ºÿaEÏ·~6ZT1ux`t ·z¡£iYvG}mi¿ínÛ`맖z¨{ç*ÁÊ AÒÐÌ L¾]ñS6k¶¾ØI€Äwê.ógrÇãz“*x‰PÀÒqœßJ“v9›ŒòâÐƸ¶1t6[–6ÄâžÄ}¸à ,LR‰ 5’Œ‘›@­¬5xM¦‘×÷ +ŽU‹¬Àôv)êƳ¹ÆôÂÈ(¦ÍÃe,fet +c–úØ"¤ï¦ÎOø8gH 7È;̦äÐÉ^6g{WC!‚'¶f-¢‰óS8b{ÝÍ3@ÏJ¬O¡e†dÚm›¥8d¿{Àgÿ¼ڟÖh”‰h: +ਸ਼C³Þ"”Á £òWÃØ-TBIŠùê&w±Â­,Ⓦ‰.fop6gðä„ÝgL)mÉÍÆ|¡X³q0øE—Ù4À|e¹¦Á¶‘1AÊ)&Î~øÏ`6½¶âT°D¿…·é[é?&uW~1¶´N­2–Sõ~²Ô§";Xï©ÉÔ'`£Å xÁº-r˜ÃƒÌn<%©rÊlM‡¯g°Wc¶%hæX;™ñ‘T¦PÕ¦,¿~À2Ó£ v™'ëÖ-‰A‚­ñÄL50.™Ú‰è<Já#Ï©[½2Ä gŠyVuŽ_æ~ÜúTàÈшén£Åuo¬Ë}Šëšý‡X‚…i3?$†®™ý<òŽ;µðl\ï=þ,‹äyӇo³1’(fùµ\÷ +7™)LfuN%¶Õ-.À&)cÅ7FŠ=7p°mÈdI]w±_j—ûa‚° Ãöðo”E î·2†ŒìþЦDS'£ä;k{3ßü4QÈ]‘Í O0yMØ*$øêí¡ý(‚[TFÖShm"¡G°$-å%êU¬#C¦F!ÇÓ4îòRìª-b!®-Çñ›Ì+ HŒÐ†šˆ¯äTËy{2õÆÚo¢-¸h7š]¶ ¨Ap­nñ“J°yª¼™µÈ‹ø#¿%\P•)^ÇpXÌ9yå õ‡Tïz&hÄŽoDvƒØSDÅnüê1ž |mÛ #1’‡ÈjåáÇìiNRƾ‰*;$ïÊÛ 1ãIV³íF[™8t£Íñ[ÝÎüYŒ¯%q;wsw¦~'íAè¯êß uå< ÙªZ˜ÓÁ4k@2»ž»Jó/§1íó,CÎ”W7‘"NcS¿ÈÑ|(Í~ŒLÜ£lHæÎê;vŠ¶ò-õ¯ó“ç<§úeþä(— +ÀZEwÛܷ∻uYȘ«Ä Ÿñªïiâ’Þ§GMlÈèn'™çBæ§Ý¤C IÝtÍ=S©°óÆ®ø{lÛÓø¹-&1š_±1vâ¼”b3 G"ς=gåRÁ¸ö¾‘ÁáÁ‡ Äb·éZåïÓSiK¹ "™Ý,э¾M'=•ÃÔˆŠ~Höù/Öú 0’â(—ƒ²Á ¯($q!2Ív”œÎ… ž›Æ}¡q>Í#A7K™JÖÒ·"๵²ùΆ±Ó_'÷ï»:ÝÁlÞàÁ¤=8ßEŠÍè&IúSçN¼ã¬èR[Næà2º•ïGÎ|,<¹gÈó0~Ïùøǝ]“PAӐ,xŠÏE•æ’0µ Œ\”z»4ßu"ÝÎÝ}K÷@߉–µ©ÎEšÛ{35LÀƒÀ,‘iýx.0(p Eì/ؐWږ æ¹vHä¤Ïé[Øn0¥ÿ©þ·ð†ë÷àÄ¥uÝÈÊ_êBÝ LÑ6vdÙ]0ùZ›0–0µÈHIÿõèeT’HnWçã)†$ÍbÕ]€Ú b/ôBKmò¿H¾È^úÿê Öh®~±T®Cå¢zÈ2&ô@à£Ó^ý/ŠN #¶6Îÿ´xfO<vùØ1Êø†´„ $]7Cžz™ûÝlFȒÇúoyfTÞf³ðëÿlå ¦bÖÃ4bêÁ‡±5ЭÀпå+’˨À«Ö>ÚãèO@Np×eÇÇÕp¤=uß¡ýã»®3,1».’ˆËÌÅIs°B[ñÅ%»@•LŽq\÷¤h<1‡?÷Äë™Â,º¡çØ0©Æ³¤øÞ¤†Kª¸®îç•°kJÃÊê‚RrŠæñÕ¼\Aºœz!(E„I¨òˆxÀ‹_d›yû«÷Ձ jµ?2Hr…x€½@š NLE\"FÙ,nÆÅ3ô°Ö+YdP¿”pENП¡ÉŠm¼¬·x\Ùá-nŘ\Z4hƒ \¼nqç€Í->ãÇtÊá™<u‰9¸çÄ¥‰&1A5tîÈÔ7ïMûÕ¥öâ\ÙÁ‚ç7r‡¤©c xæȨÜ.]¯x„xò¤/¾c?kWÒA”§=‰/:Me¸u¤¡‘bÁ®P‚Ó™\?k¿zâößòH ½è=T˜¾ñi; "É;òŠl#©—ƒÖ¤œtÞ#†}öwœ}~aˆ«¶í(/ÒìE ˆÊ@s,£Ÿ–Ÿ²g“`¬ ÍÉ\kžþ>˜íj„Yˆ¨ò%[w¯‰[>ì!P#/wɇ(ú‰á£œJ×!8VÓ tムc#V‘5²1¨²=poãâ®ôðœÞ¸ ÂH¬=E,(ÝX‘bGðå0;Üc(¼Ul¬„D¿°ËDÜRk†GÞ$؈7z[4ºÍöÿ’þDTL9¬q‘Ë‘‘àÝæŒÁH)+!MFRüΝ’ZÎìp,÷Ð)%EØ-K‘ªUfÂÉp1I$Õ –¢°úYåq“!.ØT'Qi “i¼Mo“$8Uí¸¢©û Rêä;í ¥tŸxyT°xǧ¦œ·C )=5¨#$r1YÁ³&^©Q&‚ÒžâÔšëãeoåÞùW·D›’‡D̹ä ç/h¦p> Ù«5ˆôlFÂÔi¬o\ãhÇJDcNø^äîcÕ9Ð0ã86™+Òw^èùÃAÙp÷áÏ5 +ÁAõ~ òFž5ÊÞ[éÆ* ¡º(™êeÞÉZâÿöcE3DUVS2bë“Rý6Oö|œÚ0ÿÊ_ˆÀ篘r×Ï u×œïÙòÊ8eŸŠTð0PYÉP0c¥Y  Go¶¬ºÉåK\AÂÞŠkõ9=¤u|ŸÒ—íuÉ}Soã–FX卛‰&WkIå¦SϪ)ó)NþN“ëˆAýü4ÀwÚ¹P{h--ed$äZÝé$­Ó X€N7”QdÛr:Y¤Žì©pÔKØ2ãn RØ ´ŒÝÛqJ?+R±v¦°^QØßfNï}óm«c¬®£`Œ2C›g fË}]œ B©FÒ·]¶¯OPmj¡Ú’¾Ní/™v^À?4ªÓÉ˄`Þ)ìt–vúíXþUD4›€7!« '¼HêbõOoašÁl¤Å63|zsèF•Ý÷»ÙÔ[}áp™Ù®;{\öãÒë Å5êÝÙ¯ü¥‰œþúÇÒj×äßßwú›t@»oÎ_¯EÌëïyHû‡ÿ/š>ï‡f¦ì÷uôîá ø`MV†€ c£?Øþ+¨óµi) KŠ€9Xý=  «G*ˆv´[×ù{’©@Ä ,ì6£1 +˜ÇZúÊ»sˆôdï¢x‹±\¾²“n9!Å{/'ÜlC¾ÇeE{­°R½âL‡*äw+vaR“ŠÈ÷`÷ó¬úy×CsÃúÚ¼§Í~\­²–+Xíµ²šéÈt=À_Ûò„!eðÃîüͬô»a¼+Q +À+38ö“}úð,¶Ýi"ñI)2Aܑ$Òj¡RÃ*’RUHKÛ&6Æ%íûœËDÀTÀԑ#ñOZp¶bĐFÌ •y!yÆ3Ñ8HLu¶XE¬f#úùG kY!HœQHñ­f(V,IÞ6YÙ`®ù0ð¡xøWêq8;Kbí*«ªâ©øJ”φ8’ëÖ©Ïp¸nX=®´ˆR§ ½”‘>¬¢‘èº|4˜­‘¯À«;TBöý…¨çÒ+ƒEϨ ´¾ÊH:‡ŒÑ(AQDí+÷w“RãùêV^Ú>J¶C'>yÒúØ|õ¦g´ëb< TÚ«¨cgØ·æÒ¯ ä•R"5¯t¬fB·.• ÑØÎï\£ÁÕ:¾K"ãà0ÿ“üs^]òã{nŠ ìFS@…Jðe.¾·ô‹6\ˆÙLsO_rÀ šiìÌTl³À¦ +Â4™èmqOÂÃo…1c-ò³(ÉÙd»á93&J©‘ ùU¶ø¦|hgkó‹n+v×&»GÖڐ\è¢À€­Wä%¶‘ÑÄüu¢g“¤ˆWÒø¸Sò–OðÇdtŒÀ6Ðú4…Ýl+Ñ>b /y?°æD—1Èomlê°~¦ÕFJšŎáFQ‡P'(¨ŽCÓAH•ÔìÑ7ʀ•©éÞe2}kLPiŒ´YôÎA †­pbà’óî> ¡˜B8q›êÈuÇÔcíµÁ¿)‘Œª§óøf)?oŦ­åñ ÚWœ×±)¹|j‘¸’¶Ñ-RËÑüB2–Æâ +Z;zŸÑl6.×W‚5õÕ\yG÷ê¼8ü·GWw¥7ĊÜcc >Ò]F̛þ‹¡¯¨ÓŠn¨1BŒ˜RÍ¡ÊNð¾¹;h§SDeW¨%&â÷þhý²d[<˅ÖT¥@J ŸÀ%8þ>×ÝéãFO5bŸ k±ïÂ-œ!%e))‰TòŞ#˜ü)ð þ®s…Úþbáo*<Í0$LBÑ (¬äž×gœçü¶Nk oS#ƩТÀ탞À„½®Š§Šͤ½õCø'H°R¡XéIôj V.“Àó +R1;$¶2´ïþúxü4]g6ùx¡"3ÑERr +tËRgFÃT÷øûû$«¤BeԚä›:ÒK¥ ÞKžéva’>鶠«B;—Ð,®øNÒÝb`ÝBê +Ò€ HÇéAý7ÒÃ$ôêŠúØœ ¼öeb[[ÌÁ›ÞŠŽ Ò€<󕇨H MŒ‹5ñoÉ¿ÉI¿iK(§œ¨xد"=û1º€óAóø…Л 3Á|Qàj&e2ùX3ƒf ÍÿÑ4±nóÈÀ×}èB‘z¾° +Tê4Ùì*Ô\a1ÐÀšÈ,£(ƒœèî·UÍ«I¤sXÿ}‘ì»Ö ç9aÇhŽSԀвŠÐ³‡¬ëoŒ’§?|éViÀ +‰ô¾ºÇP„¡K-Lh|¹RÝ6’u +œ69®¨^&ƕ,­¼% +Dœ§È0-/ï2œ¹S|æ&÷cuâ0UcwM $» .”Jƒîý SâàH.ãmNj Ž¡®“ÛNä!ˁ´¶P*›·tŠ¦'Öð_ÈÃT‰‰Ï ö£pàguò«¹;C ›†Ih9³pPK§Ç[  w£ÎRëñÔKôýá ¤îÃIá\ t‚÷æCA}[˜©(MºçV¥¤@o½wC±o"l©SûÜԈaRŒ{@@(Ï Òu÷¹¾ /6™£²bð¢ß2„êãÊÂ˼Çz|,ÞF4]B?¾Ál‹îЂ.¦¨óBz>HêXøe•²–‘ks#Œ +¨Tq·£Gý0T;öƒT[ÍŠø“±ß¬é_.RøXÎÙJ—#ÑbƒÏögZqƒ`êCª„t’ -ÿ‚Ò*—9̃ð}xUǑÊŠ*Õ<›ÝfB6/Ëa‚½§`ž”N9MÂ7EŠ§ïìÍr§¬A(¬>=€¥—![„£?ZÇÃd + ~`–PÂk–<\)nEŸ4V5ÅԐ*’ ƒ^}™íK-ï5&k#D Á~4†F98a‘ &=˜ž>x÷í;PWe›}”ó’üDb€¿*œîS|¬ë^„Ú£†•GEä…ÝÉþ¿>²q%¹ DjëGr&ÓÓª ¾‰ƒ„±Îüœ®OCÝâž,7Ón—Œs]|c±‘ª»¼²t+å.ý@ç ^ºPÔôªd¯ó >^õFoIA¼·ÁA„êe·¦êP[á|M°®¯q|¿Êõ?õтŸÞ›º^Êx@»›êrû€Ø$ð{îâ•X*ª`T*] s¨h…w†®} >~yÅ൩Sê0Qi‡ÙÞ|à·©Ã¾ÆwzqBÉ"VuâG¤ŽD™‹3Iƒ’¤·ð¢khW¹zBéˆ>™ªŸ{GW÷5ƒ%®ybŒ>‚,‚z×BiB–WßNsM™kké0ÔÚMÊE ñž©yŽº°ˆæë)ØÙsÈð~LÊÉF*Ĕ{1ËB`ŒGÓ␼Üy¿',Ó¢‹ë·äý‚1h⠱˲¸:À Rîè,)@ú°ÀDIÇd‚ìä¸[iB<ӈ)z8©$¼Î^B HÖlÊjJT1z;­dÚ´ +‰É$QÆÜeb£å½º>ák¢žE%àTǎõ/½¾ˆ~p€!Ö<¥{xcÈ%¢×úGx\Œ"k ¤Òk˜ 9áH+ú÷çÝóØÖÍßú´‚¨â~lE5'_0†Ot%¾s<±cáùXº)Œ32Á’ÐÒLXÈ¿%Ûo@¶Ÿß‹¯ûÂ™_$UçÞÙþ/”y°¹Æq!Úð^ÀÞG~N©@»ðþª+³$\ôw 3Y£ˆç(Š,HÍ·Gª€g. ;©èÒºv[çäíمܥݹ&ô‡a®ýƒª€õŽG8¤bËÔ&R`_BØ4 ùxp«]%'9ô?v<ã|ÆRo¡ƒ·„lbëDwûÙ}!Õèf¿M´šŸR®Â¡pÏë¥(uv:~?%äLaj»3T¬XIçP󛄃cÜÈ°l˜#wj3AÀ0 [ïû5ã'Ü_Gœüš;ŠDh"ç‰{(ì^pž)½Ï+©×íCÐË©Jây‚5r©-÷RÀŠr2-5ì¬`d?ƒyÐ1 ÁT¬ŽEur5íŸpĊ}$ÈÎ~ÂKr \Édð‘Éa‰æÞX>ù½Á¿YÕðÿÒm0j\o’»~¶ÀuŸ ú†ÖÈÓµN7(ãc`S/à/E%/å%¼M©ššc|Î~ ¬96ގÑ6¢G2j2ØëxNÇÈhsìkÃ~~âÑÜàêcFTõÀ÷1øBÌAÏ¢W ’y› ÒáD9Øç¬Ñ₹&W•ê€prÚ$BEåŽ?ëzïì>}FïW‹ïãªÁ&búÝW÷h˱œÍÃâ̶ä¡#ÂC;¡Ú¾±C Š,|!{Ž\¸µ; 1W$8OìšU“ç}ûwð§#€ü*cሼ­©Û"ö¶¾¢f]Bí,3Bº&†\ºéú±‹þð±ö‘x|¥bQø½ÝèŽžÄ +¡ +úAÀvzÁþ'Çʚ81*“Àf I<ú t/«ç¿QÕ༌yz¤4k¸&Mèçnpˆ;6”aöLŒ@ÈÂ/mX,å]_Êr;͌„ü•B3þÐÊÞãÜ[¬£j"§INÒús}'8DoÇÿ.²S0÷ Däü0)F$ßeì†(no1t±³cæÛø(ÊÐ º5L(ú—« LDzq¦àŒÀµœ_Ú#ôãqXž¯có+“Ò.ʍ,ªFx<¹mº…Ê‹ìáÈT35÷ÓÚvìÁž(â:„7`â?¸{Ä!þB$ðýwäŒ*Â&"KÉN†ááD éèdÉüÃV0 +©%w4@‡xÃWw¸…Ç>[7L…¤$žŸb¦Ü +eÙîIh,iM·Öë~D«È÷‚ÙÊ×FG‹*…wPßö† –ôo-º. ‘ΰ*À©;HâZ2ï$3ëÍvÁF  MÀa½}”¾·ç<~\QÜqþ4³ñÈëzŸ»k"î¸=‡N4¸×ˆokÖdòRæ#a.‹$}²}…]ìÉ¡a”¸A!°½U†g6ýÇ ŒY4 $È|y'&…ql¶uðb6}B’a!ÎÉ‘^ h‡èíõ‚*_1åBo½\ãwª A©5zù³^¡ÓßÛZ ã9X"‡¿% Ê0|n½¶Ýð§Éîˆ8ñÕ`"ïÛì‘Æ ÇUO¶BÞ P#U=šÉ„;Â}!\ö­¯F¯”}ÄË¡geH@aËӑ1Ò6ˆÅ€Œî~r®Žíf<ÃÜ5Vž6HþPVÎæ¹î¶s@ô BRµÈ𻼺5Ô´ïÊ'‚Kˆ[c˜ù9pöŠéyö^âyåS`iDˆÈs óÿÑÙ]OpÁçÒz©tÉÄqã¬ï.kQò–¥eb[ Ë &‰b ’¦(^½ ®AmágƙçD+ ‡ˆp…!ÊÉ'U¬lþYbmƑk€3mæá!Æެšc;¯d‚SQH9Dä¡*ª©Ü‡*Mkmj і +êŸÊk2ä#d† F²ì‡?Ø`F\ÖN/­‰™*©Íšúe* òs:tÁã7=3|´t"ÌÜ¿¢ÙQ_ÀT± |°`¿3 ¯¶¯»D¾ì«.dïÃôÊÂk(è]uÝG–9êÂ:Z'4dãã$PUl°W"Ðض…iña ´q“±zBMChÚ¤÷mÜ?ß©Ñár5ﮑÉ 2†ëcÃm›m /"Žsœ‹¾MŠl8áY…ºzv1%¸L¼Š’èÄìâ´4p$÷›`LݔØôN¡U¹÷<ï“%Ü7%(H}.€üLÍ7ú ª²QùÒÅÒ×MpŽlùaxǝÍÌ\ޓø„¶§Œ—’SFéno¦üåÝ×Ó¤ÎMÍVƒ# ê¦Ybñª»ùÏ òÏuò±UA~v¦Ó%à€È>ŠÉ3k”£°;NylF^µ +–ðêc†aÈò”*?Ow_y4*ñö^kël‡Ìð¯_̪í=Ò²\RãÞSœË[ƒÞëfÃ|°C(y»àÁ7´ÀtÊ:r®"{O^™ü‰VM‡õ¡¶­^h·iá* ­õÍg©»5ºCñ cxžL0E]JdåœyYÑfdbç@Y5I`þ©âb·-¥NÈû}5›éôƒ³Õ߈ËnÒ +|¨ »¨EX«±Z³j3äÕ3ˆ·Žx\¬¼֍”ùJ²A¼[ Å;7,ß0.~‹q³‚"Y݊VU"HÞ㚹¤OÞÑ&.åžxÓ{>ùm¬y[jcQ@cL´ +%¦¦4ùÓw÷딗—–*|qh‹\–nTåæaÌ=J˜Éà¹óv +À8Tº}|‘“|dÊóP)yEÛÄÿŠÚ“µ<4(á6:­“¬§ ©a[Òõ_ÓQǗú +àgT–”³õÁà‹J‹‚HldçO 1†75­„Ùm|¾Ž£QNˆüÆù{Þ¢ÌÑW•Ý3Ì$êD÷:¡òPó‹¡òP"Ø9©Þ­¥Ò$_dÏPÓ5XŠ¯æÙy>íyE ¡ÖGùȆ!6ò7á¤yl‘~a¹$HR· ô-¯“}Œ0 ÔBFpÂcpu•=äþ,©c¸{YÕÜßPG”fP!/˜pùmšß<øú: ¹¾ ˆc¨¡B»È¬BnÊ #p¤ÿ.]Gþ(TðPºšû$BºF^³C~—0›`Eâ?\vÀûÇsÉ·s÷½-(ÅdpŒ­²!*ðc«±dA…rô–?åš×€"ì<}ôÏÅIa¼ÖòV]2É:.†îý{MqÇ7´ïþܳ€—ÅEŠgÕ1OâôinW;g©Iq»*%Ѷ4A¢–9¹ óÁ£–óðÍ XÉö™J!LÄ,?Ýz€kØçÅËSA„"0¨s=Á²˜ÎÎsahqV½–‡7_§þˆá)Y.1æ°ß: ç’öNÃ[Žs(I«Xcò֝º¾Àäþâ%=ƒ®ßñœ£Œ,†Ié +ÙDš‡uóp%¯r£ "v‚ß±ÿ~¼TÙr´¹ +ûº§¢ä<•ªßt¨e,&VQ4)–Þ³éEwær¯M¡ JT×6}xãX+’â°¿‰çÂ3lÉ%ÄÛGÅ! Q0Æ«§ôىØéԂVæÖs)úGŽÑê5æYPšàK-x‚á+'eúïj·P˜×J)š¡EJ›Y–O Zd{rlŠpÙ ûÁž8ŠÚôôï.· ñ,r•O‰ÉGœü,èÚ,Ú©î{l ¹ª"o„ƒËš© A¾yœØˆÑÛëlߊE8ôI +̐̌“l(—V–­J/”adM +ûSxȀúû¨`svŽ„BË OíQ]‰môE°Gz\s®…Si s‰9NޝÑԊд$,ÌAO‹á8ؖoÇì=%TQPüwJŽOÛ, +ÜÈǖ•ç= )Ã;Ò~ä +µ¤j‹™$ÅíÉ}°4ÙÚ©B,9H•E±çèÉ:Q¸zr`ÂüZI¹,—g߁dŸ©@@`6?¼…¢$2Òc(t§bbtÖw^ ¬§é’3×GjK{x¦OíQ,¬!”ëÇo1‡DVü—*Nó0…·…íÀošH$žrY<¥–ï„Kâ“9ãgôVöuŽè ìá»1pf¿{G? ª`¹ëIÛÖð"M6 l|¨5¾îÏƺH¼¼u6²QšÁ¾·J©m’Û`ÿÓb·ÊÓB?ŠV÷EÇ$i÷gƒù(QÅ*Wu(g"qœî²\Íem Éuœf÷Èô3žø vÊç>"MžŸDÙ}¿bJr·°¸'¶o ¶°ŒC˜¡Gý˜á’õãNAÞ+u]WòmýÌ1^߆l4–ÝíÞn8„{W5“¥4|8S­°;Ÿ­íSº±ý ™_@Æüñ1͖À‚. BH†¿¶–˜g¦¬SlZKp¶Tànéî<ƒª¼S Á?S˜Yb ù#þ(§mJ£n‡*Wl¾‹MÎ2L=,íPãQ”ÀÉòÔÝP?H²¡³ýmzjèäŽi¢¥¡ Šxˆ$‚,4—Û\}w“æâ›`Á&§ÐBYÏ9¸Fë(ô0C¥£/ԑ·|¬¯ åÚÜ´"wl3¾éá4Ì*1¦dë§D™#Mv¿ïL +`Ù×1b:Üþ!: Û=ôb~h«.<ˆ†¬…„ƒÔÕbuzºå“qB"é£t¤:âŠgµˆí?9ç4ªò»zâ×¾1§-a­¾©¿Gâѐu-3‹,)G;%… +:Fg·GŽ2Þ åSP2ðÒÍð¾®3ñÀûÑÑ^i2ڕŠ &%vöÃ@‚z­¹™ÉªÇõt ào´©ÒÊ㘋[eΓg£„U^yQ¾ ŠR‚’MŽo>aÙsapÛ^-×lÃJɪ ·!¶+ì‚|ƒð ꅠÂ-â9)y8ÏlTs3ÜÐaÉçâ ÊéSM£¦çky……XvåP'–½lž’1¡k¿¿D2"¨€#¤!Gù%7±0‹ÆÍÑû SD˜Ö+“îq.2×Y±iNú™“¶þášþ<„eæC>¼:µ[¶°ðîŽ=Dü‚,•4~à•£:œˆ#Ṉ薡˜ÃÖI>û2‰'Ab÷c‰Û¶¼þ{HóåÄÈ6Q+^E–;’Ú:S™¢‹RÚ%lû6Z°ìæÀæÐÙhc½í =ÏE[<ºòH$¸ßÐSw¢¬©¹!ŠiÆÄRظ"±4$ŽÍGäÓµÈ>xB&=¹{H9ŽJ6ÀuÚjF«q±¯›aÂ"Æx9gâtX$ÿ¼Èص&Cœ{ ô҃5‡)-…¾HÐq£ù˜s67‚Ä­BΊ>‡M‹iâ°ùlÁ0ŒWODd²ÓXJóٔDZ¢ãQ%ÅÞNV‡‰Ãà¹bÈa…â¡×hr§ŠâH6éTØò¶˜€6¬ô𔘠+€ä"îŠ5ï"¨ðdgJܦ„À¢זLäR_Ä!ߤ›Š8¡JRIÝ0J]k¤#!N\ËR¬œP©À‘&âìtñâ Ò*  8o€  áåC-iV»€`é¶è¾­f•mDahÏkm%T'÷HŽ. ‰êJˆ¸ éÇ©hôÀÞNãųUS`÷ë× ¡²Ì&Â(ÿÀ*!E®È þ˜‡z¿©Žptñâ.* XÚM÷Ñ!‹qº„@pæÒ`¹[i:Ü옌ÇØä=À[gx€õÊKšG|Ü!°7´â ƒ»Ð¿¡}ly'‹ÖÃÎ ¾ô$â±aú¦Ö˜ + +™± ee—? ãȚ‚´Ð;‹0[½%˜Ò>Ù[_€‡\eQ+À`H†•lâ’ +Bâí+D6a,@pxèYÆiNx„Y´¹ØŠ +Š#d †qä¸÷TõZäû3›‘„Òig¸+§ø %ÇêóÙÀù(UÃWÎÕûh”^tAŽVIFÞ LÏ5Á¼ßvOæ܎Ý0ÿëÃâðÉbÙõ€»ÿ_`—á¥óהÄיDšZ]æ7uòO’%CËîV@#Ä(§l—jâˆÇ’äz_APÛV¶CÌ°p:È錈W#M0ߪ wy ½PÖ±#G­õ–)Ì ú-Ÿmm…t ¾,Ȑ>Rn‡™\Y-ÑýJ|8ó%V†Vm™çy֒À÷±‘pªÅ G`0QB|'ïú&©4@©² Ý?Si¯Ó$7*¨y aó‘Ïɘ +IÑ®Œßθ<·ˆœ~D¹ýqךYÞaµ1f€Jׄ„ÂŒŒ  +Tþˆ([Š’3Âr±M†,ï×M¯L¦ãšÙ)îˆ%cYì*†çš¡.„ýܽBíAMú¾pƒ*'XAzvžPWâl®Ë>]Òm‚Àò??ËTƒG[Ú³pL=~ÅRw«n”ûgéV‚²D…œk­Š"Xòãvoœ‹\` ÿbÄ*z‘f+ÀÎí>"-«ƒg¸ +§¥”jèù¬{é&v\D#ØûWpJþ.C+^³ì?„b´Q—-(J,_Ìh[_‰s¤êdßqH£ŒGK–)Þÿ"Ô·¾þk棇wŒûðYƒ¨¹íh3ɔÈT«‰0•þÀM0E»¼Qò͝Õj–d†]úßB&¤¾êÔ±‚Çý×8p¢û6ºi[¾ØÁ@€àXgP©nwšp ºÑNú®Å[‘e`tþýg&€Ò»È]ÿoèøçXÌ"f$E¯?L\±åpä: Š/ýÛ#TlŒ ûÞ‹æ §·D…á°D\ÅÙÛï&t˜Nó櫁²rœ¸«£3ãx†ùOà4C…ð".Y¦¡SaÌA}õ˜J©Ì(ŽŠf:Š0yâ1§ +àÏ,äÍ¢ 62F”âó±åp Ÿó¤øP3î±Ê¿V£¡»büòƒ”š«½ßÙ܈ŒÞ±@û[¸Ô""1ÈÛ]‘Æ_ „_øogË KSŽm¬Ài(DÔ7 ®LrH¯Ìq§waJi Ò+](÷FÜRÎÝ·âðqeÁ9¦æ!ï-ÒǸI:åýb?mØ´òGƒ)»‡„‚‡^$TAMö€‘ +Þs6DºÈÊë…ŵƒe1mӓ¹ Û¤“l9EÙCw-8å`dç²?~EõÄ8=Um4Šàr'‡Cž,µÆ˜qµÆ³&¡”ËZp ýX*}@UŠÃ)äET‹Ä2³úípXm>.kòä鿬‘f’U¼­¦à±_å-¼ÅG‰²ZÂ̧ ÐL¹£ºÕþnKÄs¿…o”ŒÂòá(õûª€šNÛSRîãÉ÷ ŒûêW7aæsñ¯„U²TˆmÎÊö¥J .§1OÅÝYÞjü؊5nZ½š1AÜQãÒ6ˆs‚»%lW#ßm[´nþ.<ÈàÚeÚ5çª`œò’³Á sÕqt—éÿœyòº’ÛúŸPp « ‚¯”˜ÀÌhvf¸|ÖQ™ÐgV_JÕã‘APˆo„ëúÒD$””Ü¥ÃFâm`(6ك×Ãï–)ÒYHT ëVÜ'²¿J;y‰¨Vь8œ¤65'nÐr9^ŠZ”’0#꘥q¬€Œä֟ƒ\9ˆçؑk¨öì~Y՞¢k˜Þ1GEs_VB–_ìPĀWi3tôŒ»ü"ö+FŠ-è­'`ˆ«Þ)ãÄñtԂß0NóïñBãEasé+Õ?\qY#Û¢¸ ÀáVyÞxîñ¶08ÎÓ®‘¿k”(½ÄL7!#ïAP~ +Q¯¦ÇÍ*Ò߃ Žm` týÈÄÚÊ˵£±`kó8›Ñþ± ?Ú²ï lÖ s–‰>?;ó™z´ˆÌ¦$ü¼‰iÓeׄÙ0p„\¡yöéøÛØñ˼lOí¡óA½©3ö +¤Ì“Õ9ïƒÊJ*0eÞSgg=þ +QN-ˆ^µÜeIBô*ãd±§rBø},$©Ã<] ßéÂ9¦¹ +ý‰ì>œîáôô3:Ÿõã3êcïöÌ1j7Ëc›ÈÚÔè +â!C¸_•Ý©£uKbúj‚ªl,µø’{B´£tïqH)q¯¥.>àÇÈ6^ÏmãA4~e…ÁWlm["ƪ˜*~UuœÌ…(":d'gP!! !."A':Ú¶l—JDDã!"‘ŒB+%–4U" á+ن®´© +3a6$%ÒÿLYÔË£®E™,äh àÐ̇˜`ɥʈS NÁTpDf—`Û¶ Cm¨Ïëšt,Üf–9Ò]`^Œ˜™0ð‚ÝØ< š¯¨ÔÞ3p@±H<ŠEÃqy–ý€ ¾\€Œ\ltˆl2”†‚AŠ¡Â0ˆD0Fªør"©|-œX„a¦/À‰Œ4²(ãèµ\lýOaT9Ë¥@"Ì;´¥Û UÃÃòæê3Ž­Õm¢V¤&ҙŽ ÍØÌ´Vã°9{ÇX"¥?Ò§T%‘ b18{ñš†$Ÿ}~¨ÿßÇ2 ¬‚ÈIG%žaÈ'¹ÕØ*ë +‰Ä ×vÐx½µ]+1ð®V|Ë 7ŽHn%Òãqrf‘î±èbî·TÕÅ [e;E8@5” +c 1QÆ;ˆ¼à[¬Šœ•BÓÌ"²¨$tu?R°‰E¤ ¢Ì,JXëÄFCè;àø'Ø›;3ْ Çø~AµœŽD¤‰ÍŒ@"þî){Où‰.VŒK!’V­¦¥Ò eHˆœ5¢yÉp*ù¼—]ËZŽf"GÇ‘»w Qε(ÜO»ª‡Œk=À“Š)ÝB•#ô*¿0¨à="¯ÖÄ|£!•OU"ie]] ÃÍåù–ô [_MwíCÆçf:šVµÄb«* 8|H‹REÍéÄæRaz…Òàs²UÍÚøÛÙI;Va“ÜöD[†4Ü!ÝÓ»d&˜vH•ŒÚ>Ћâ þr!Þ5[\ÔT´l’c\³Äñ²sHrʓCEåC%gÈ!]Th~ºÊWêcÌ~ˆC +”CFAŒ1÷ÄdçÇ@!«û(Åû$Í8$4¶íä1 jÏ*®UäJ…†—“‹ì•ŒÄ`֐ü1R ©âù.‹£ÜvIòcUœ?Hóšzœlä&Ýñ‡Ôcd²izŠÂƒr” ñåôWƒÔÞ>ªÍ˸J>¬‹\—;HP +°W„…ß²ƒ ðŠp_FhVøé Tiƒî1z‘~]Œ3Ôɍ«¨ì˜ÖºcAŽ}î§cƒ\»ß Èbév“´p.ÈØ\WRé`æV‘u„‚Ñ£áhõc‚$Sí±Q¨Tåó`]é=šå2Èî0ÃGQÉøêåÁ•8"AR{];ª\uˆA(f†ý›0Èà¯[–€Ý²£¬Ða× ‚ì-Ýý‡oLÚ$¤°o>#|u¬ïhl]hhXš‘/EmKdßdWë=úºH4¥¨M]–69%}ºuøh©‚œéŸ2˜`ê?‘º$fM¢4Ì”V½h +² ¥_ɏûOºçÐғw‹‚Ìéì‘ ñž  ËBú´7ÏÓy‚4û]ò˜rõ&kã)ˆÐ푁Vœû¹jÜR=…9öRLêô<Òa…< }#²脢‚4’X®mL!i„ õk›ƒÚ™°CAú%è¨ã’7_•}L`‹ÿ ]âb.' µ‘rvN §ärJf‰èÎCP¥§’hæåÛc›DÕçì ¤ÐAžuxd ««ñ@¢’23Ãd‹Ù? u˜eb™ ÊÙñ€¬„¨!äj]SdÅdi¤A q7Ýـœ‹¡î:6SuÞO×|Q]@ +™ »#ƒ¡ò_ÆÊ>w4$X<‘8@¦|ë\Õ'x¤¥’‘¨4}cðC¢ÃHˆËz?þG¹C"Z=ÄrH$*Nawëøï9Ö÷#ëýœsã'Q€L]H¼¯ýqg· é +‰šßcJ/6Obèc»Œ ½Tõr…‘˜RTù‹` ÜLå„ÄÐå9qÄ@EVRÐP 4BPòvTŸýπ ´ÅrH´ 'ÜîÚ(T)nFâÁˆ @J‰+ÊÚNa?$^ž,˜hn=ê–âé„OºÎè“FÅUÈRæþ1ïö7 +ßÓöÚ¯ûWt>+š+ùÇ÷ ë$>ºÓJ»ü­±~+ß ö?BT>öVZW 9VûX( 9ñV‰÷G¤ E£¶3 ©f䨂þâ¾1˜?Þô‹6Où£^T·¨<?’Ò˜ë# +⏻c>-ü±ŽÞ0õ$„ï6¼eEÀàýH à§ì•,²÷£&ûTÂt¤À IÁ] µ”/sϓAZ tfc>;Çh0Ïb<ä6ðbXu˜¶Î1BªÄÊ£â”}é8яM¶ TЏÛôü(ÚŒøéƒqhàrKˆ4?’Ñ „h + +²Äè‡êøÐð†š#~4ž¨JpÁ«¢áGã£÷â]R^ÿW>š?©Þ™Z±Ð_¡ø 1÷W¨Á>*ë0¼|'ÚO„[Õ3ñ‘†…Ù}:>ÿôIuM”)˜¼Âg‹ìÙo ÜG(²Úē„ Ý^–™ïōd¹ŒÚǽ#‹+ï;£Ófc»šør‚î÷È>Žü +M»;W±ÀBVy4±&Ž*H–cͬX‡|[ê# ñHMà6ĝ>š.-ÖD«^#ÓÇå1Í<\3Ý7,Þ6Gò±"mûŽ¸oÃáà +%ôё֊žÞFìÌ´ï± 6áâs˽nÐùˆB_*Œó‘qwß°/+Ed‚zÉ·B“üӑt¶Wù$[99Ó|ì5}\æ#1´Â’Žò°U}Úë1+˜Ø³?,+¡Þµ†ÇǍ‹Q!ôÛ27”ã#‹Eï`ãÖIM·Ç¹,oá’Ãc1>VáÞÒÁœ¢J¾Z¥øxÊõÀάò9؉ސe.füúEÕÓü*|DEô0ÜkŽD£Ö:†‰Ç j´öG`|t¥³‘ĸ I^2+rèÙazèl˜]C¿™ð\U¼ì<çãL¾ÇC ̈>!—£Ì c5 èTH>t+±ÜR­=‰Ø£Ü¡¸&똈;¼€-Ȝˆ…÷èÖa*~!Ÿ¡À=6³ãíPíôltW'·Ç~@& z¶JÁÁDÑö8ÆĐס•öâþ?˜å®XjWï¹NyɬŸ•»:ߑ¨øŸ?LìbÍaؕ¤ ¾l½ä7kµzägVŠF+#㘀À­ÌÊej²Ç}=Š¾XÙz„Yðcè}ž ‡"2!­Ç‘Æ ¼èH#²x“—U=1ÎÞk`=nžðG©eµ$[6{Ãý©DÔ£q¢Ó<ÉT9=úÿ>‘ð5=†{g{­ÂôØ)¥ +‹µô؈ñm%=ƒÒ£h°#¡Ü¤Òãê×{X*€ÀòÆèQõÆ`[ÿðh=f ÜÚ±ü¡Ü¢„{¡T>?\Ü`³ôHHu¬³³9uDGy+Æ`ø<Ö®£oõþ>ÒóØ·Ï£º{ì<ÊlT§¥ ökÕ4ÒÎdæ1÷­É<²eÕÄ5„cÁb±k ¤WbzÛSfL'Mz‡¤nSmÙ ;|+‰?,8[5fË݀A¾V­|»’¨¤òˆ«©m:Hv¥<:kÕ|€YN³C«fï[Ò§pTN—±j!휹ɪÑ!¦YÜ«fOä +m‡¡ ü {ºÊ¬äÑ«†,XW¹‘2.ôÃ|\UFât<®þŸh¤l3]•mrx—†ÿ»ìti…ÏFãqUK¨P?—/gjò %ŽE|´Ô†Ÿj{{Ç`Nðrã¾+òÏ©xÔ. x'-™_Pµ± t`Dy• ÄJËÀ~QÁ8m7˜ ”;|(…3~¢_«édÄ–+Þ¥ðH÷ +àÍÆÙF‰EWƒÏÚ×ÄØ1~19ՆyšC#²ÔaÇý%h‡>•³nÎ +6ì(ºyd]ëiùãÌ?p ‹Æ+ùê`Fˆü¢GSZó®#qô ¸à5èÚe]”u³—¨[Æe*[G€ÉÙi摢kV­£•HÚ|Ÿç7Âw £Ìâ¯&Üg©@·ÄŶ'Gû^] êsu,YïŠ??G™Öñ8çBo<܄)»°êõù—lÑ"Ԅ5.8NàA`ãÐ`=ÉZy˜Bh#ŒS¸0êX PD× +];Èåß,Ò Ñ›.}y:†õèBß©(LBҖáçõ‚‘=íç((ґô‡)ðtœŽí늾1ðŠGîäúøÆÒ¶ÁKC„f…¥GÛ62¦Ïx¢B"‹B½ +» éIϤUX÷*dðp…¤#Ûq»;›Z˜ Ôª°ŽTa²?]EƒÂT½½=„XO@a1-\µ•L]äá  þRØ܀9)á*…9ŸCßÿع|¦•[Dõ´ +[h™ÿ +r<¸¢FjŸr åç"U5ô {|Ža'7\{ŽˆÖ÷¶¹>:G¡.ԚÅÀ6›9Ç"ªv²Ý(Ɛœc¨v\”jKåZ(ÁEôEتճÿ¶•…Àäjٚ£6–€íÐp“REá²Ch³ š#UïÊވ’yfŽxÁÕÕFŒ5zœÂÙD«˜2Ç1–kú 9”>Ps™sÆíO,1G|¨ðÕê&2㞹0GØúbÃzlŽ Ž +§QTâÂÔKZrŒ«›~â7W\Ænú-ˑ^”ug’ ËqÈb€ÊâÊq endstream endobj 116 0 obj <>stream +ý[¤P‡'öÈ{;VŽÇ€­Ö}5×8ÂWÉuÜÇõV?À«¨­ý±Æ6ÅEê{oÄäèp2²%G·ëˆˆÀwَ’#¶@õ$ry@Crt= A>à7ŽÚŠ¢ûÜý*ˆ;Kk¯ Ï`ÄýôðW÷@CŽaб æ¦ãU¹= øˆã‡Æ˜­ûqÌûHG¤>…ãµËò¿øã€]õ—‘çÜ8Öm)ž—ñNT Š#MÀPã(ð Y¤p\^ˆ¯°o¼;.×c4ŽÂ%Q¯Ä8B®Òâ¾GÆÑg`¾^ôâˆSNBٕG +تÉÑËÆÀï†G««0ÿii? $ŸG¾ŸÉÄñpA^%Žt߄£Þ8‚Ç›v#Žº}UÈQ3ö.ǚ;ڐ3„8jFˆ£Ú±[ñŽ‚2òpüz8HÚkplSJ!—x=mj½Ä†#$Ý n/cÏ>¦á¤ äq=ŽÂ>ž$)ŠT^!|bµºp܌‘ ±pt m»p-aokˆ…Q8²P‹«"Œ„YÔ ×yÚmÎqkiÁ&ç+ Žåm¯¦aßPöœ‚£K»Àê7²³½fQàÈúÆ!ptS°0'šÎöÉ$‘£Ž¾·¤¡‘àÈT”0ßvûr¡Î­V뛨7ÿ‚·,0J¹(1ZAgïó»15•ña7ªhõ7‚à ÑÃ51Ø»üxÛüürd—°ü€˜ÊuÌ7Î 7ƒØç#%ò³¼Ìö^L4øƅ¿DÐ{£ÏPª“=/)½Ñ&yyÆËê°°7þçf$ÿ›Ý&lj"oÔɄðЛÆi^ìRwËoÔ +Ô2²CŽ‡2Þèր7·ë—x*Iύ׹<†Ív#Ì…×›gäŒ+^´=¡f àh†Ñä“ÏeúsÉAÌu£Ó=fãÆ\åᩙnŒé“ҍàêï:ûzêE76à +å‡ôÈ7ÂӔV­ácâ¨ízœ†ÝøK½G0N“q£+»™áƜƒ„©pˎ„­ÜØl@%Ýkt؍GÞnëPSnŒî[ºW–A£öÐAˆõBž¶µê ·ñ°T£É“Ž‘ŶÕWm#q.‚v±‰’hE íŽ‰¶1þ[ÂÌ6®òÿÛfõK¹ì ÙF{ ß>i é ¶±)ݱ«Î˜Í: fP˜Š“\*wU7d6dÞ¤g6â¦:ÙéÙTÓð^‰µznÎ3’!#ó|gH'¡.0ìʪ»´ÌKc¯ÃEA‹ƒ÷…ô6—B™]”f1kkŸ—Èß<2¢F¯½L¹ÕvXÇÓ!:$Ӝ4hy* ´×n©WýJ¬ëx9è¢Û6Ò؜h\õ¦³…ñ<‘Æqªô]›•h# ÂáÒØ`;p0Ù ]€4 +t ªW ×Θ8$œy2Vb‰YÉAæÑ„=xËz\ñTIürØ3òˆ£‘µJÉQ“îùù|ráä^/ ­ÿà!âò„H6Æ¿!Î?£˜ôåý2{´3ž;$jÛf_+°¶‡¶?ã\ w"ŠÁ€47?É|±ÜOw][Ž>ãÔ&p¥¤é¹E»gìþ”˜9@%FJ‘`¦f„ àÞ˗ùÚE9àž~»3’Ó»ÄÍ(.0mE€ å!¤"ÉàÜeÌu@u£Ï =c«‹ýâ9×b5'sóo#ßéêCAѧîÐH…Š!• éTIš‘VKÉgT¦wš1gœï酀˝!L_6ü„gFGNU9Ÿ¼G°áÎH|—1Àª.í;_A¼› +« dÆ öËÐÑCŽcL½}”•ø€×âÕB¡»µ¸ÛÏ6ir*¶ +Ð^÷œnÊåÚUĉ—‘8—èn —EXÊuÎcµ,æbp”ì¢ËH–JöŸæ:®šJ—&ój*—QüÙ£4Çg/CMŠ¢ÓsN™¤–$âÿ(Ƃà¾`pŠ÷ð$–õºsjgö9èÊ:¹2*i®Ñ6Ïåd,µÁ€oŽI1e¤yQA@4ËÿgdrZ“ tHkJGÊH“«W2þù¸\h™qÓj”Ñ}[à0ÆÞ«°$c6»Ûð1€&3u‡WÙY—m ÒÉxîŠëž‹µÁ¹ÇÈ"3%¸ÔXG•[D+–6…ëR°"z¹º˜&#”ÓXùîÔr¼ª1ÚÒ•ÍÈ\° hA$#%] +'äpt¾ Gä|©Éânì’IºZîكɦÆ2c ªr›–ù½12>ùNJÿËQ£°ÈX§’NGŠêßJB:?°„}“ <@dDCOP D×`ë9 \¯ùù&1¡~Ä áÑ ¸÷Ç8É ÷“©ì³ºêk.\f}ºè£x,zxææAûä7|dGIQS;µõ­ä1ŽÙU͘ÖýEa‘óÎÒ¿‘ÆhM} /q°ž&ͨª%röu¤GÑIfÁQ¾-ÁA÷™C¶_›“,‰žˆG‚È â{ò@Òôy [ä/,ÔÅ ›#«òlP-6L¿„ñCsZ·…b€­‹“xÐpñ% .´6Vþh-û\nXˆÝc»°É­a̋ž’l‹š}ˆâ݁b4φùtåÑÙq2X½Þ=1’3^Ü0‡9SwÒ|y“2<ýô˜]‰µ¨¨IÏaÔÁA«ÜyØ{BbÄãñK°Ÿ…1^Ã4O‡ b Ã6v>¿O¦Ò…- ¨‚v3\™O¶­Û¨Ë0"Hâa”a²¶Éåi‡_hÒa,ÐÊ1@ $Ó28.UO‡ cfRʉx cžô÷¡ä½gZ`ø¤¨"½´2/ŒÏ4\ …Æ/ëô.¬£Í…±Q@õœU-Œg$‹W´˜8”5%3 +aÔâJ{qÉíE$Œ·ªd+2ʝ冗ª!ÜðˆßEZ‚ +ϛ7LLÆØXýFcý)¦>˃±’ G…)œMOz¹/PÄé“à`DÉ4àN?òڀh¯ÎÛl0.ÈÍòø&ÉKCäHÊ`Ügò8‹*œ™ˆ[.™Òî‡L5‡³~¬»`œâ’AMµ1· ýFå’wñ´Ö1]s (0ù/QÏ:̪L`ðO_9i"Ù4âAÓ acf)Šj Œè‘B‘ò¿íg%ãQ¼ž84D¸Äy ŒñV2® $ð¯}hªd¯ÁÅÜbôß +Y¦yœW#4Âhw0AÿÅ'Æ}ÄXS‰58pÄ°{ú´Q=7 +¡á_ÔócÄyOå+ot͍<òÞ!DÔÂa‹¾gy¨ÂWmlÖ¢<£Õwïª__‘9Ý‚†¹Fç·÷ª¿N@õÞw÷Š–·tƶ{5ÄAƒ~1 |ñ8.ñÆÊ{_ŒØ^]ìóÂãë~›qCÇõÒ¾ˆqd'ƗÉ}ô抉\yì‹à8D^[“]ÏúbH¶Íͤh™ìY÷¦“J€ñºãB`ùU§†6¨Y£Æi‰u{ôÄ„žDéLøâ.óŠbÚ(.¾( +q7ýs>‘žœ–G™î¾¾‹ëEVvÿSD”Š÷bËiù1ë^üÊkü÷bÛ)ÔʧŒcóÇ}êUÉYBö䢃îê0POa‰»ªûÚ.QÑóˆWF¬ÔEÕ 3ÛEÒÝA¢Ý¿Ñ"å íÉ(à•©´ËºØSLÈñWÎ \½u1rqS_EøayÑ6‡fj›m?”k³›&å4PB3ƑŒ +ó𨨹_`,5OÀ‹ÀE2S9‚¯—fâb²pæ1ÆIær¦„¡=]˜á÷,óB@ø´x¸ø‡,b÷ñ¡È"ÖÅÇp‡4(D¹š˜…jŒ ¹zE„é!;9oÑEöÿ"äà€Ø.bóö—HÒçùë © V©]l I¥`g2ÌÛ©ãÆžé[CÄÛƬ?´.æµ×D C¢^çÏH +kgþ‘·8£'  +©€$\yåÇ8Õ9ˆ¼1]ô"'xØT²íà!1^²Ë9ábÕ¯bA–ßñ#]ÌR'—À¼×P¿¢úèê+rÈJ‚â¨asRŽg,!Îû´ñ1ÎEòd¹DĀßæâJ@'ÍE îü0¨É\4¼ƒB‡BibÄ`4@éR™1(áb (óTñg‘5%$EòáÆ‘‹Ÿ’‹·> !=.BÝ8†¦ŠðÊè¶ÇD‚á¢I©2rý*žaÅQ=7%-¢ë -$.êÝ7Ÿeæ¸Å‘•9+8”(üÿ–‰qI ¢Ò¢Å¬n€ˆ°ù¶Il|‹­Î2á‡k:oÓ[<´ÈÄ®x‹† ‘`œ9º[ܲfœÌ§¾œçY³Y‡> S·(:X +ÓQ²£[lͲ~¿iô?™[ìeÍÀE¾ üñ‰»¢|k5cü°-úÔ²¨bs+’$Ú¬µÅg®þðÔã¸Øi‹Ô[€ÕA©ú„Ú¢ DálLÁ{´¸ÌoU…õ |eN±#*Øè§?µðZÜrZÔßa]‹z'¸!ºú]Il-ºF:È»þߘF‘Vk‘b‘í +CcµXfæžaâ>}à¨ZD‰(®–P-ŠúêŸvf™È°†SÔbWÃjµo¾ÖÎ|ú“Òâ†ðVáÚ’ÝT¢&Ôx!-’¢ý‘]aS;Z„WX”G͗`è­&óÓj%V‹¡Åv·"´è¦·£? e½(h1§ÇJskh‘µ(@CÍçjöôȶjó\ù,ºùô%' +zy{°#gÑBlÏC ˍªà,Ñ4"œ^,®N]=ÂÞQ Ü,n],⬏m¬wþ'/Á¢z5‹ô”C=½Ã{b‡fñl±˜‘íŸ9¢ÁGj'fésS˜¯Èdé÷Ûëå “·51‹ù‘Åéõ;ò*º\`ãŸ<‹‘~ìcQ1Ø4,JÑóú8µ,v²ßÅo0¦®WM,‹ÊÛöÁ±£³²X¾U©v~¦ÔCªhӕ²È^I<„²H®Þ›ö‚7sÐzЯf²¸óÚ_ލЏU²hÆ<·7Þà®>¬«‡³Ð+ŽÒnB84¯HœÂ$¯6sDVÒ(^q_äø¤"€WœÜØ¥¢6‹‰œè]qŸ¶ ã-aîŠøyDǑ‡Ú‹Á€þfŸå,cWÌÌ:œrØÖmÉçF#bJ©+²“sYn"VªÃª£7aí^3†qEA•øÀ+ó­(cÆðérGY‘(§wûÚÙVLf„Ó˔—$ðŠ¿ ê¹ÅHÜyõzO¯lE0Œ!wEò§,,ô^әãÛ±ÇÐR‘ÙS<–?üƒž"hÑo>Þ}çˆvkÖÄ5ç°]ö›ÉÒä'¶Å)Že+8ʼn˜A–yñȆ5ÅÓ1PSÌ·iP†#¤ÙÄïªÒñÁšb^狝øïšÕ˜#Å<Šb@'…ßqÏ^EŠRéýÅóÜH$&ÆF”;òQ¤óFi-E8$‡PýêQ$L‡GñÊG¶í(: ߑÌvÓí/GQÞ¨®á}²¡„2ˆ'–ÔEä ùQ=±ÃÞùH¼Ê‰“VÑjKâĒáETU83Š;µÃíԖdgŠE–²E¹˜H™Á(‹ÛOäEQ`™`–Pxa®,,¨‰ PR®xŠ"8WŽ€‹‘™(VéªÍ$:é­\‰¢W[ kDQû•]3¨„(þ‚j|(öÎC¬<:§¹RԆ"@C¨>—¥ïŠøŽô*÷fŽ$¡œ!œ¼IÜ¡XñÐ;Qœ¤ð}­KÿML…E^i<¶ X=(úSªdyqÅÞðÅܔ˜VOԎŸå7'†ÃßòIP>&K¹usÐ'¿7{Ÿ˜;ñè¶( ƒ½¦èéF4“Ú\°gWª?ë’EŽñO¼(ŸíñÏ@gùaujÏD5ÛÐO¼]á:{A[nÔÎà>ŠB.!¡×Qã=Û¿ñzGÆ]o >ùƒ.=DƟ<È[#üÕN„üÇéCòv¢˜á•ð•$—ñöxwz"Œâ¿F#-¡.šdž˜uJô-ߎT €—]¤ý—J²,D9ubX‰Ž Á‰\ +8q>œ:ÞÅ ‰™lð@;PßDèF‘ùž†Iö”j–u<(5bH×Ac#Ïp›è€E«elì7\Q y+Ñþ †Õ…5´‰(¢$_fÑÄ3šæËρxÆzMLW’kâ¡e 1ÖR­ŽˆŠØÚJL†±è„1Š†©?BÚDrÝÀO{ïÃSÙ0dì\"_=@*©HÔ÷e`Ÿ‰úCÎ5=Â&žF_Š[iÔx©:«ípTj{-\{<œ‰Qì±lÙx·ÊDíâÎú]•n‡2q”N˜ý¾´mH€Ö2,¼N*/<%»m±}™6ÉD _.‰pdb +z'ŒoN/hЅûÑþUÁøøYLÌ`à/¼m»=[Ñèt­¯861ÄD÷iWJÔJ»DzĎÞ,˜ ÕcŒ±l¯e0q·¡°254F|`boþŽ“©IwõW‹C<7É)ϳm@zÓK\k?S%ë !x‰<–¶®)üéq—ØΘ +¿Ü'ÍìŽÕg®cƒC;æ‡ùÌG`õ+d,q׍¥O%HØcÔiïê\âÐ '`;ŽžŒúá Oè•:²Ë݁[¢\UN[ÎLq–¨léz@xx‡Oc–8Á…š²D“Q"³ýAgÑ:;ºÒÆBÕ­ÚX"²Ûã]à€|£k¢Ã[K»@ôN­Ç+‘PNÚ)Nº{E¡kô‰¦î¶³‹#››ÇúbëHV¢µ äÉ]Är²‰V"LÚJ䀉Š3ÐD;y£«DéО¸+8Ü_cU‰Æ]ö“»ÚÓ3G•ØgÐÅâ­ÁàmÅKùpµ±yú',í쐡ªOâ,Aúï/ÌZ”'l³‡—_ §û’%háTnáaјMÝ!§H¦%b1f³øYjå··ÊÝ?ϑQ¢½Œ­OP¾Kœj ³×mÐu¢Sª6ÜDê^ð:Ÿ³ìŽý±“¨6/îÉF¬Q(ê$D(’œÎƒå$†Ie$€“…¨R%D:諸IÁa"ڒû*"—rq®9´o’”?”‡HDà , ÖØûtƒDÔgúy ߞ¥4fµW¢„V‹þ‡ˆ¦(M…ÿÇ*ŽˆÛÂÐƧ¨4"woˆ€'"ÀMÕ¨©%½A±Q‡Ða“d qÀÍ`"ù‹Û(ÑIn³ˆíøE6<Ä.^Æ)UʍCD“ZO¸¡m 9†ˆ²£;8…ˆ½GØFˆXT?Ø$ÙK³bѵ7ÎN`´×æ– îgô…ۓ07lÛ¨À"MClÏތ±±7æLXÒà1ÐìP(©˜PÊ9D¸Ü¡ÊݸÛÄ!ڡڃI7ûçz +M7â È¢v©Å ¯m{Òo¯´Õ ñ'ýžŽÒOmˆ>V¤<84ôó³ÐˆAXËÐTˆ9>·­ÕiŠ«Œ!æ;߆úyIbˆk%Úá]?Cl¦È.¶ 8§Ã¢’Òžåå./Ķ•Ì²—¤±—ò“¸/³…˜ï¢¤¨Ÿ?9ÐX3` ¶÷nxĬȜDÄm—óóîA4aÁó€ˆ[ $ãÌ`ybˆ@贆î§@l•²Ên1 ¢KÀܤ£®¶¨- +_ y—.>­¤Ä’ȱt?' ý!#?YFËK@"MDPš/uku.ÁÈÖmÛ"žhצ¬Q(?búd÷á^9†ú=<huý‡³Æ´&YM›·¯ÈÉSgHSeў= €ü0ID.ÖÉÔ¡9ŽRR€9á}øF)° +6©$h‘ß·ÙòËa‰€¬þp ž˜móè±]¤ƒöCÉ=L¼¦¥©å«OdâTöC6÷!Â! nm77ŠÒ½Âú¡Þ{/Ø2¦ý `ÇõácÒÉ ¸õa™?Á„¬'Yê/”NIêú¨ùeT‚;ðCó¶ݲ6}bJ¯ fèŒtD3O¡Í~.*o¼'¦Â³ÂåHÜt}H´ï'Œ² ‰°ÿûÒÅVœã;>}•íâ‘=²ªúdhȸ…Ôë…ú°2¾þ”†Â5Ùɧ¼öÃ*††d5䌋 ï‘I\ôz͍d a:Dóa,KñÜ¡üÒêD.Í=~<‰òÔ|á‘kšÄÇ\HŠBÂ_Ç?fÛ"K:°_E>Žå:à÷KUKÉ÷ð¸Äe%ZC Gór~÷>ԟxU< +ÝC/Qʸc”̇‰é¨´µ1’ ÜCÒoFŽ-ך;lÕzjS{¸’6MÙÝJ áÀpÌȯ M[ô+œñR§Fyçٙ‹õPë0x‡ÐÑaný§‡„R1ÓÃQ¶#Áz¨Xt1ÒÃåLÒ#“Ø:gýº%}¢7ͦó%ŒÆ Ác.ßõ¬©‹Iè!(M±Æրª@g˜Uùv½ ‘·UH~‰®‡g’ܱÆ0âmæ$Ëc#Ù1u##«ÛÅüè2ß¡òpB¨X²:ÀÒB(¯8X)¤mЂ¡áÜðhM0>X‡S\›.ùìȤ{<ìÚ2ð€*R†5Rl`ÆIW4ÎÕ·:Ú?üøѲš)Bö ̸ɍÄCVâ1À–С٠F&WƒW°V){  ¥ ^¶>_Kdv_ß)‡ÕŒçJT4j76A ôŠð§ø¤'ÞÙäòßoµwè 7´V˜âškÍy§å5§4³}r:EG²A²ºCÒ³ƒv¾&S8s‡sɱ?ρir‡üÉzüÇna–h7ÄÄùpGÉ Ü¡%ar”¹7ºãù/¤H¸¡w:V.Ð=¥p;&)ˆáw%ÍÀ0ҙîe•TQ0²îppJÊ´=\È }fôOÌ%sUvø?žbŸÈ±Ç3ô?0Ö7v˜5„;yÏJ̼Ìê0¦OšKC¹Ù mÞ5¹†I{.“E~quhAÿ6Íñ²&ÊäC=ÿÉê0eirŒQƒ5¤GÔa]ƒ:Ôõ˜Uuùš§CjV3C WfÆ]5îÃß.^¼9lsjö‘Ú4±ÀÒ!í¨!—9u̝)f“ +mĒ؋¤Ã^P#*Üv?ۅ/çÍ¥vñ袚PÓµþí¾'ÒÏ!p(!É琿¤1.¢%kè_9n¶n,(gÆ!øbáw›Ò…øÔG®ïidÌ3jøšÌNˆud†sXh–‘ŒÀ ›É˜Í¡÷ûk/Dù·À°ïl4.‡$?¢À‰¡ŸMµvèÁüJ4Å l|L×p¨rvDèR;x}#’0ˆ *‡Ö`A)ºœ¢·Däò±q¬¿9’wtۛ¶tI”Vï‡i;ØÜçì?9tÃÕÈ cEˆ4/‡V’¾›€CÐ(扏‡Úažºçñ˞-ÂùdfÔÆw:ñ²¤ƒàßý˜x‡fŽ ó©o¢ñ(‡ëþ¡áºT®'û›Y8†÷ªGyZ ˜ö€!à¸Ú‡=‡s ðºí+÷Ø#¶¡‰C¦õ7ñC‘ˆCR®‰‘à[‡bñDð<pxSd´åãz8Œú%ÚÓNpUd!ñ-wBÃ!¾‘ZÿªJDvK û "†Cm˜KÑ°±¥ þ—ü†bx#¦k•Ù8)…C®ãl5Û0ó +_Ätn¯i-gC8¬(ž}9í¿ý®"O<ó@kÓKÄàPgF.ðÛùŒ0ùg8©ªÓµL1£çÅ%ÉÆo(œ¯°ýØ/Wd‘’øT|Á7T0§ŠØ0hE +Á„¯ © æ˖"øtÌÞðúõÊp4ÜŒ’zC×ú¦\Í'FÆs¸Ú ±³“M3Z>ÌÉœx\º,À~Ø?;‡çhWÉ؇äCÃäëëxð½kBìŠàŒ±ózýVƒš¹!´ÇŒT$PaëÔ+&x:Z䆒é0׫Î'‘–qÑZ×½Ämá7î&¹ñÆÅÅf…µû.À‹ÂžÓqtf]T“áG_<̺°¿†¶QT™.‘›oCñ¾>eX¨d·z]¡c›`z‡oGõì`Ø)]¹…Î;ÒDµ¡ KKÉ/É!*ý„Úð:Їš™Â¶°Ê[fÈ9°a' éØ£;ÓIN…{6,.t² +ÄڎnŒ¨HxÈE©´ä £!ƒbÙ°Át êâ8µÑÈ EbmƧv©JDÏ`%*øé SíŽÁ3*ŠÇæ”fT%Žqì¥×°Í£5z3oø£”Y…,ÞYÔ q»âMÃ`G+t®«]C7^KS¸#¡k8±Všwý,͑ô¦ð UFuئ~WӖ¾ú€¬!nÛO@-âtļ8\€DÐPþ¥þ<¼Á>?¥8èÀ<_8E#ÚR5¥†_<Ç$n)ª|Cy“UCœ ‹ø±®ÓT m):)7I&K©†Ä +éjÉ_¹õá BÞÊ +l)¯W YÛ­ÔèÄašŠ¬¡#ï`ûšÄó¶&……j©Å¤a¸á‹Hg¢í°ÔúÇ[C,Ó.µÉšB]­¦¥ˆ‘ÆŒ·v/àÏp–+F7 ”†,²Ôy0§åßv;yÙÆQ’4AWže‹4,-–Š#–±6£‚¥äÜ?†pÉ­–æÂR¦íËîIý„ +~:óغAL•Ú±Ü‰eñwOˆ ˜ˆBÃIoÍDh(:#ë žJìj¨@"ß;gèÆ[^6GÈÔ Ê=ì—ᡏ®4ß ÜÑþ {b+eȔÔï > Æ*…ï1'wÕîýn{%ìM!O?Ø6Î,•âo“¨xmAÆ6ºT9_ÍãȏÀg8}Qµà͐ô(jÎÐ…tº¼›”LÀöë`v¦fHgÆM©…öÜÂFHvw4f¨C]՗VG ³Ä i‡¦¸Ç‡A,Ì𨁢o´åê½Oˆþ’!†½Âf¡˜ÜX¾Ý4QU2‡•ªàz;‰o(Åõ‡‘w]…‹ Óeèn‹â•@ñúj…¤vq²Ð\T†°ßú¡*g}cŸ)Cß “é¦.Q€')Cº 7þ’ñ„  …ôàŽçw‡`)þ3¦JåhÉp4 ZÐcãCJ†/\œª¯Ñç˜Ãx¶ñF 8×íÄ°äÌR!’l¼ÒАRÙӄ¬ü͝'~á°rÚG”¹Tš q÷œ + AÌ(úBœW ,áwÍ +R¼ð=}†õýI|á%<à ³_õ^xãĆÚ4™$" ab'ï*þÕ±;Әy¡ÆÃà$Â…¹¹ƒïZ9%,¤Šlк™Ùãd-$ãÆ5ðBޝºœ‡øz -NBXޅtI©»P×ûZ«(&:mÒgö‹5´¿;¥f¤Ò.,úh¦ìÂÑ=Q—Š Àu(ïÞ5W†Æø5jâží’KC]¸«ÄÅ÷-Þb±]Bð\¨Åäj|#J}ýá›08F@w7\عŸæÂ%Å] ‹À%nls¡û†÷*a€ZBàð”3!'6åR.¼jʺR´Ÿ\n^ì¥ S³¡óEÃñ¨zŒº‘J ¤‘] £¨.Í[ÃÅxMô H ÚÉ2’Ê%;ŤU‡Hº…E —ñ8ÜìaFø??ãî¸\…UÆÀ𮧀@š?͕Ðúø… + Ø»iIŠkØBRLABÙʵňNH_M…b-<½ÓUJåû5ƒjaw®,µ° ÆM•¸-H#ê‘#3‘A.»í³PX¹5h!UÏ6[·Øƒ¯x:GHSkᶄԔSxق™…êgí$69[HÜ·Ã,tn€ÍÆQdYxRZ§²ÐÞc\ס¯Yû’Ìȱ®Ä6“…;’'Ñ1l’’,<Üc^¡ÎDêáøƅkE2øŸM½-wD6W—¦àøDy̘ ã'ܵg~´e˜Ì=tk 8«šã¾‹¦º”R¦”";÷‰ád_böÿ÷Ûí·ÛÍþñïwÞßqâ~¿ß;î÷r¸ßï¿Ó½üþº—û½ ¸w¨S « ÆÞ)â3óÉ2uižDa2YäoµN*ˆ¢è•]F…ç!ÍÌÙ&-ÄmÛ®Rœ°z©” )Åôe[+$ßQ’lëö}KѶ&)ŠßaÛw•}ÿ÷ÿÿú"ªøûŽ¿ƒü`:•¨¼$蝠wѧõÖÿz_½^¿zUÕ[uR?©×;¬þzÔÍfìöÛïöÛÍö¿ÝÅï%v{C[‘¼Lx<Ñ;Jï8ÑÕTéD®·µÒ¢ZªÛjëÔz•C;l‡µ­–¬mG;Ö÷¦„¥ J Q¥ZP¸ˆ‰‰øˆ ñ¸ƒ¸£SÆÃù ͐Ô|þšyǜ>ɓ%߳Ğ$‘$É +'EˆÐš¡‘Ì؈ÇƄ|EÔb#ÖOŒtF­+i—4dwŒe)Hm»U#.¿Ž²¹­Ýq¿ãåə)‰,)²£eÚ²£=ÊiûÐ@bàB¤L 3=ÒT93p$®Ó)™›q¨4ý»PcPÐÑP@ ‡Ã¡Q”–Ý, +†Pdxp€xtp@Hà Å0 ÃP„AÆgnÓ-›z ùú.ý.-_4íž3M? ç²4s9ÜèCQ¸+§~–§$Áš3=á3°¿è·b¥+nD­*@ªw›EJ¨ß\+hÐb纗€ëyµÝóú)÷ß·ŠNñ2'6«‰ eCÌú‚„QyX ZŽhÙcaæÉÑ9À÷Kžf5ÁȳûöFªBNÿh{\ v¯tê6þ­:îô†¿qñÙK’Qqí™ed©÷¬`ñ^¬ƒ‡K‹@ÏÅ W²P¦ÈXæÉ7„ø 9Ì„sßK%`Æò€~¢ýöû|?ø¡'‹¢1f¯Aæ-¸°ÜÆ[1sº2~7/ZL_E‘¼8ëÕ¬}Z^ĒìçFê݌‚rCÅKÿëã–TÈÙRÑ$ҕôá殝‰ßvº­÷Ùßvö6ÿŽè®lŸþD‰“ø7»­'^öÒe Ù­X]|ì"‡ŒÅ6‚oXoåéL¸SNkÃ]z &”æz=yºò¿5ç]JUkT>cוÓúg-N#4±FVÀvèÒ øê·W4Ná«o¥úh1•Å_ùeÓ,G ’ìIë‰:<|àb!êøÉvÀ'#hF5ڛ¢8OtH¢ŽÓŒŽc*ðPƒØ€õyðÚ¨ôÀmO6‘ópbÒ®Á*c.“ò¹òØ«vpKLGLÔu“1Õ;ÌHÇ ÕB8¥ê…ð&ÙKrü¸Y¸!}ßJ/hShš2ߛ=W&fñ7@ÍgÈ—2ì›í!²ØÉ‘ž˜ŽDJ F¥ÌxdL ¬Ð3#Eà %ë(^3џí±& *á°SÇzL;áñ¯( +z>"%Iµ¹ ïøŽ9UHJÄ&«¨Ü4„‚A(tÁUl–‹Y¤3*G¾Ûíµ¦v4´©”£7œoÙç\æäئˆžr~NUô»]¶€(cÀêÍ¢üœÎ žO²Á{ïQwüQ£ºTïµ3…Âe!\Ž©]ãtðD¦çõ %úÁÂRÞDB—è¸HâbmC‚Ñ¢©8‡$B²?¹„Á†è–óùÕEÆÞL”帧åpë9PKi_v\„Šh=Á‘(n_[f Ž» p)¬Ç?ex–'>þ¹,[)"ˆ ]œÀëR>Kð4PêsmÊBä€ÌÈ«@Ë?(Ü ­BžmÓkw‘x«É(÷òKØ<ҌJÁðûٝhÀ$Áç˜P°XÓ ¯5ƒµ°YžÄV’É~žÑ–ƒÈ$ÎìC˾p™_,x³zM4l‡¸€oâŽ*53%?@0¢K`ßPJÔmM +ÅJ—U"ÁÉågš{, L¤4‘P–À#ÛƒJ¸Ø®Fqâ÷&ßJƒA œ×;×#cOˆèÖ»ë]Z…ÆíU¯wkãF#wê ÷cÜ6 @1=Õ£¡6cï¥íÞ2;¤‡9X² ÷·;'Ë©¨ÞmM xB,t¬ŠÊåFÛ°O:àé75WÜN!õê úíP!”/Ÿ8ˆt;˜ê;kfQMÀ{Ý«ÌÁ¨WÜ12íٟ;lI]Îv ­¹ 9õ—ækbBŽgÝNÿ£ÍpÁ%ÈæìÇ®¼¶½÷]õނGâTË ¨æQIÇ™©2cš±ù@æk+¡þ»l¡JâYêO# z($Q2rÀ!KÁ^Y¼Âí)ÓÍ +6çs˜¹î}BH•§äþ—•˜H’ý÷lÝÌsҖôq·r#}Ž¾h³”|Wh”´Ñ`«Vágžyw^&Zsd\™vISmäŠ÷¼0„·Kƒ™€Ð»ó2r‹­s˜Yo$ã™LÆÅ ²âd áøæ=€~µÍåtsk65ÌÀ¡E ¸‚zèÒ²hbÄ2gE膃Ǽ†a·r†™Âl®z”1äf5_¶T¬p]›[[ñVA¬ñjÀ•ÓnvC_UÞÙ,†½I6{N|g^‹¼m‡<77È\‘&öK‡VÐÝñ?‚]r\8û;wAX„uOÐgn¬Çã×Û>Æ묌/n–B‹ewsg.ŒTq=¸d¨$ÉMÏ}Hd¿p4‹lù?ª¼U]¦Zƒn‘Óá‡Ás¬GL½Ü¦×±Ý¸…¨ÞSpTÃø†¨ï[VŠFw4§›šÁŒ+í¥CQ4uöKåé#k=$Ú0WvV´{e4»±— iÚvÁ<ím *è“OÈYù¾JÏ ™ ’ùMñ¹6qMѤ YQ4!¸¢¬R°Ÿp6Hq}ŸD»ª•ñ‹ü)ð“ùvö”yâσyûíàb «&Ó\ScœÁ.ÉÖ2¼ gãiÿÃ-óÐÆ% r´2´ÅÆ̀;@Á@á±Ü 6æ± %òYŒÎmˆOo¤ÕŽW‘Ñ8ËÄ7¬ ñÖ>ٌe›·$1ò:û ]),ŒU>8¬ð;NÃ}uÏ{š—Dayi}gmÁ:›-*’í¯oW<’!çàGµ9§n@v¨í2ào9$—©Ï°ððŸ¥H©J w°Õ$É×À¿v·WöSQ%Y6>oz ÷“‘ õ#É[Öü‹[f3(y^‚|¸htYφÿ»i"YïNJbqê%Z¦svòôÕ2ï¥S3þ?áêZ‚ò‚ \½·Ï‡0þùi'ôYÂ1ÏiÈÆÊìO87 p’£ÿÉ ãèüµQœgÎÉ,¾MBRtÄ>Î1>Ï`œ,CGýÓôïÕÏ ïh0m¤¤¨ªi6—%bà K¤H<´¡ít•ç¸1¼È»à•œzmE9±vé FäéGî²rJђrY|nüI÷äÓ·ÜA¢Iÿ³þåˆ7†ê? —H®í…d‡«~¥ÞÒCÌnóÍOÕJ^¤~I}ù¯…¾w¬Ñ‰$yäRÊÉhð´—mÇÉÏ g¯)(f[ŸsŽ_™òÁKÓ»‹Œ¸ôeåáÜ1Iœ¹˜ Ì✮Ì(1*öÒÕÑ™v@Ľmµ 4f“¹P3¢†«`¡æ›éšþ';ç'•gî…z(ô>š“!1í˜}àZÙ&¦™n\A˜oM/ñ$}ˆÄîf- +Uck”ú eö¡>ÿ´ÿ<Ÿ¦°jƒè…b 8OϊþÒè’5Jßæšøg#Ó×! +r…Bo¿ƒAùÒM¿’@‰;±„&"KGë¢øÉK¤í×.®uòd:Y«Ä€¦ŽR˜çg˜ž…ÇÂ' %ù&b˜åh›l‘„²&=~t"M t¼Î„æ„J™ÀñÎ5=&jó³»,Y¯²tšæ”Ä<0鋾ü~ӘvëzgÅ*W’¾Ix)yjò‘hMîË&€U P$YÇ]Á˜Sá D!x҄¸¦m’ØõH44¸#ùG$ÌjÃS±ßˆÓÉêªì“œàûÑ ÌÈo´¶1"Êh1>?´ˆ<ÅoäG!?§f?ä)s`y‘‘'‰ QŸŠ ™šð¶þKÇ9ƒ4 ¯ !¯Ž$ž`yèÄÜ Dq,§¶  ÉÏ¥ž ¢t¤â„"i/É}%Ô4î¤|}ÐÖƾ£}©¶.d@@šÆ9 Bg>&ØV#Ì AõÓñ +¼È׶‡¤ I£a=¸a¾*HYH¯ÎC já—Çv ;t³§„‡3‰~ºPòŽz|# >RŒc·÷˜‘ÛŸ“Ed¸sAKLÎ`Ða„{B³Ã¿qþ–€"WS` ”•«ºâÕ_–hpèÂD'€‘Ï_LYè³;žj}í&?*Öׂ‰>¤¨Žu=zO+Á° ¹ÍýªÇ\]¥ûKRz=T÷Ä謬LÎ?៉“ÈÆ0v %•^_Ö¿4ë}u¯u0òpŠ+sÄkőÏá$iýkÎQñ¡¨ø³þ\ÉlÃ}Î%0,º›œ»K¢ ÆøVÒ^E8Ÿ9'Z]Cp +ñ*TË{ó²v¢zäí;1I®ÿ`XÝn’|$5Mxz` ’TÇŌ…ÇòˆÄô W$È‚äˆ |ˆJå£.+=(N9ï ®%ŠA}¼Ñdn *ŠDTUúâö8{Çp¨¸¸XSõÌX) +T¶ !|â>côr¹ÈFD7¶Mc¥=8xωƒ7ñ½h“¬ðE[/r˽nC«m€\;ÂëP˜1ÕÐ;ø0RžÇO.ÅI“;•L>µü9Š¥•3ÀÔ°? Ç E» #VYëÄhvÌ[y㭍/Ɓ5šã`Ú[~N˜Ø¤^shÆ ŽäÞ¼˜ ¯åôÙçY©Þ+lä2!±öà¶ŒÂpˆ*W¤È’±¼L…™4½–ØÛEásˆ¿ßrJE…¢x˟ÈoÚ +Î.|PC™>q£áòӃ-ΫíÜ?qpû¾«ÙjEÉ ÒKØo[nNb(úµö98ÿv©ß&øhºeû”=,ܔ1DÒ™{a‡Ù¡JÊ$50(#(ÿd>+Gݓ1º`؝,¸<ÔV ¤.Ãì›ÌC/«Ÿ¶&cT¢ïLv Õ Þ>à²ê¯&G*sNËà—Ÿ2 k$«´6Ä;2Sy#Ã^{Œ³ø>ƒ¥"+ŒNd ØGdçWù‚‹‚—v©(e%¤ücðæú† Vº å‹àߨzñ¢qÜJ=–ùM!6~ÅÚbƒä(‡}°j<Æ,*- ¼^R˜e"N㘹¦†cûiõtó¥ öQ Œ©hëöżÝ]Ø8¥”»1Ÿ¦š…ؤ‹±—]c\*“6H5\½›=%>Mçzeqc6Çѝ˄”\ò#\È4`ëԌ‘©Æý2ÆO2Æð6ò-?™ñ +vhü؟ ôý´>;»|^¹Ê„Ñ{íe¬%ªq¯Å8¿u’YŒŠ±³c²mRÃâ¹1[éBD“¹G+AËuž”2;1±¸nb×M‘žb™X*$ܽÞË4WØ¢ëjC7ï &.W>o¸•KkºÒˤóoÄ2qÅ5µ1îëj:À;{À1>ÅuRH –Ø$bB[‡ Û_Y*Ä>ÇT{ÌQ\M—¸P0WBºw™¥¤ö‡±»d¦QBӀ¼VI¥{SçaÏE%Üa‰&!€S†© +WЩ”ò4¬ZBăY|ÆʃÃ^<öò´ëb]Ê^M:ê)uã‰àIk‘TGðEM Ì§B´sú\a40´™©N¨ñA_ §j’Xò&?aûÎúmÂhà%Œ(jÁ$ŒÁLê§|{Ra6¯>GX?M‘„ŽE‘OUͶ„½ÄìÀ—"™ÝÒ.­T–ÊH›Œ'èâ¾’ààO0í³$ì cL,âƒAMé‚øǬÞ$&‚Ôü +.‹^À]‚—MÅCÙ¦E¨¶¡œ=tÜñÓ0=£ÓÇÌ_á"P5¡ ›ê ع8ê?l¡[øju㽨ZXB(Ÿ`$:åÿõÓcÿ…O¶©T8w2 ÿ"ZGW«äâ3ý]¿Øì åLòåEäZšÑ.¿Rñp©TºŒÕš‡}fíáAe±ûJõÇS§.’Û¾˜‹—RöE•à'ڄ•Å'¬@EÆN<;W‘6©·!<þ(¸ø–×á+ý'¿C!NBxWX&3†Û½¼Á‰š_ßyä^4 ·‰ÔÈ®<ݕÆï{诨“jc/¦é…~½˜“˜°õúB”¢Õ+™ WêEzE¼HàŒ -½¢ºâCªY…L_µ6»št X~°çU^D3wòâ)yQ¼õjz|ÓÎó#pe_¼S¾-2 —ë¶Êu Rx±PB%ð"ƒA•¿+M=0| ª¥¾w‘—6fÞÅ/wÉE#RKÕÏMŠäe¿_ ~†£2vÿ,Çœ]ò0uø؊ ºìŠšËëØl‡/ ++$‹âæŠOŸò´Y×£êÿ–R«¯aåƒp[|½Kʉ«.6ð85uñ‰èuýšyuOoNC©ïpÚë#NÇÏE°ïkڃ[L§÷\$c™iÖ­UX7Sç\1ô+†w :knÍE'k3jb.‚ƒi d"Í3IËÅ°‹ø•+æ1¡¹‹&u¸“`¾j5yÍÀ¼²ºqÌQë1R §DØ‚ãÙ­·dXh›§X±rû‡í‹ËÌi̼"VDúƒH¸áò<âÅëÂ('Â{ÃhÝJPÿð-Qg;.ÂÎ>1^“sœO¸U +‰b{—æ³]µœ÷&'Ë—ðŠ‹­f)o!ZýieoZáÏÕ-´"*éiÐbpή¯&‰Y1Ó²©Ôa̹Ί†ǜ•Iíp¿0y”uŒ³Ú höf=˜+“`Ìäº6‹•>å‘Ë‚Œˆf´híŠæ9®äҙÃO²(“Çm1DdY.ȯ,»y‹“>ÈuW‡ŽÌXl:î,Ê"w|i½Ò\a»¬àÀgóCrb’E%[>~…èCô‘ÅsQd1b‚(﫬o…RÙIcØü?VÊSÒu1Vº¡ÅÒÒØ‹vÝv+´Ú¶¼Å¢IMý1x°+JğbuSz±±¡8b՛<Ü™ë„ +™î&|Xì6p̗K;,f·µÇ" ¸é»ŸI˜aåÃöóâAÅâWEâÊÄÙÖêj؂\×`qŸN;§,D¶`±qw1'2e±?ƒžsUGpèi°°'6›æB²¶m¤ë–Mç˅Lÿ;É ë›¢&•Unõlø²ð~€nº[Îö+†'\K0¥º²<£ò}åÕK}•ãœos¬†ÌWçp£L€ø*¼Âjšèò÷ê[~R#þ°½zw%Âd½ +ÇÜ1Ó«ÃÀ¹Ûø¡ã{$Aç”s/lTÎËdÒuÓô¶U!sTWIÃ<¥—!ªÑõR§~J´ØåÊ>ՒÉ©ø†®HQÓE•Á‹+OhG¯[©¬;\1YB ?K^õB&QÛøßjW7ß[Í*Æ»K0-‘°tøªO£‰¢)à,¼è¨±q„%Ä*ڀ•ØlŠzX^ÿˆj\V«>øÊjÜ$“÷ˆ¬(Œ=£dkÕ¿†ispRÚñC‡ÕPFW'ÖBø²·Fü^æAÁSñšCu蚀¶î²fÈÉtwQŽ}Õ$v ºe,1Ëá°æ:tM¼9¼E†RÇë,¸ANûŒ<¬€¾kbË:,!®Â̌õX¼þŒâzš+ÛQ[¦¹6«VßãÙÃíª?àŠ+¼æòòj;‘ׄ§ Æ;›´™6ƒájdOµaà‹Èá^câÿg%£^³ö{òî•D±j²B¸–qׄØA…IAásˆ‰Ñ]CàeÈ(ÐÄÐÝãLŽI\1¡ÌŌì!Ç&W!¤yS‘”¤Ðñ$‹š";v,-D„¨Ýˆo ê©-W’ÿ®(‚G60} + Áõ=Éô`¨-ÜßüdÃ5¸kEÚ® b§ºè¿=ÿõà ÅbÔ¹‰4–Ü–©ç"qD Üþܘpèّ¥ìöðøç¦b›ã5Œ‚õÅL˜ fòé<; ̪?RJÔõ„Õìږ÷D̾êìùXÊD½„Ö 6gŸ+ÖzèàG*Œ°ßLuȘ Ã>8÷¡ºY2's»Tt¯5rqNGkß¹ð6äô1¶n[öš”%Tzs¸úA>®sHï_$ ÀÔ ~o¶ß±.©öù‘¢BZÿŠ…‚É!¬LZ¾ÇaSSªÍȘc–—°ÖÅñ× *ó®%Âdœ­\ênDwÉê2“Xl¨¹ ‰ð`Á{i,dadz†xèöŸ‡ä„qrL>)pxLïø:ç@ õMde¢í®7£’×2tF´¨LÅH™@…ÞÉ´ß°Qšðɱmƒ»Vj ÀEM™¦3ÆoeZ_RXËD´àž,f<­ 9¡j„o(óÓ±eˆ£Aï!™-6¶@f‚Ø’·Kù’‚yNP‘Ÿri™\ÅDe:y_ØéeA¿ƒGM­Ülß1~Äú<ˆ¢;*µ ³z¤*0l'j ò3µ^_Ëo&x¡³'¢UÆôÓÊÿ2÷f(@Àn—»OQ•3,g0‘ÎTa姘õL^“w8¨øLCý“ÌÜ7R-5 +Mpì‰ü¥÷¸m¸É€8)f„6.–•ºhž3@=$ˆ#iKŠ•XºV°ò8¬¹1åƒô¥Ù´<2´c°Nßa9¡¤ûJRh$v®Olo5‰¿Éµ€EÿX÷ ŽÁ©½×'_¥–80Ïw#¤pd³"œó­ß<Ý7N4š‡Ñœ !LfYë^ˆÔ$æW÷ÔVÓY­“‰ÅÍçI´U¦=Ü™¤ÜãVáÕ©|šwy†N)½`ÓG_«°$&Ú¶Dä™Í¦crÎد¨ £ENA–([o©ƒ#ß]TøE*H ³R˜ªäÜdÁ….Ú*Wæ)ƒì :þñ Lï­îXÑo…hþí“:Še[rŒ"3Œ1«b#ë,ÒXù +?"8ÇFˆB¿­ý´“2ÑrÙŠ ÷3'!ÀÛòý"M¾Ö!b|¬&Êí£XUƒæIÎGy“•´ W¸¢åóÇ֛õe‹®®4ÛA©™ö3CÑßoÎÎ7¤)J;÷°ª‹ˆ‹ç[­“ÓLŸ¾Ÿ±|‰2± +¿žž®[4ØøÅ#WÍþ蜿í àc2âåÍùI6…~`hÕÕ 0¢‚^ 02b['›žÏÑdU0pÉê@\¦1éûo?‰ðb ²n|Ó¨AÍÞl­žÏ‡±l¤‰"ÇÑF±S¸p¤¡`æ÷b¹*qÆ!ö‡c`ù£ÏJlÜÖ=·Í@Öބ@¤ÇUᎀŒ™¾gÍâjF„=3q°pkYÛvF_l[.ëg¥Ž®†£ù£X&ðMc¦‚¬ÏPo +­‘¸xBlåÅi¾ð‹Ô0vÜ¥™ƒÜý#i£@8²Ã‹Ñf%2œâ^gëz¾¬,Âíæ†þ!gËR؝Ž6æÖ{‹’+ƒ´³1Z Ë)žó ª@9ÅSÆ]ˆB9‹ðŒ¶“WÎZžBœ‚ê–‘,³Pź§"Åwj(+k6<0™HŒ+[ ~ƒ{X±ªhu0ž‚ x© +w՟$÷è3ԉìOe^qkÛªV¨¬¢hÕY츍Tÿz‚ÑÝÖ" ? «„miiu´ª¯_¾Ô| –úR3ÄÔ áÔ3HŸS§TÞÔÃ=& tÎa&WʂX2ÙªT¿p-Ã@^@¶5ödø3Gœ[0°ÿ:ú<§z§ù¢¯Td;WpÀèÎdžŒiäg6Š²Dap›}ŽU Ô¹Bh™ÕÏ8Ì@e‚Zá³.S0’Cµ§UEò˜mCX“Fô'ۀΠl#üÔõë2ÿ,4w´1Êv29yÉP±¨nÀRð6r&Á8©rn§[‰d’,6&òQ2êÈ°²8êGDŸ©N p@Ëòˆ>{Ä]Րqlå)QÍÍÊe€‚JS•Ä¨& Oƛj‹eËL)ˆQM'"‚g¼\1˜Î› "©¾I¤íãhòW¹\ų3jè7teð°¾¥ñæ]¡*íÇ¢ÆËw~ޏA}ã4v¢ÞÊù| •è¤Z *Æ_PrRŽrË6‹¾ ÑÜÎúµG¢JÑù‚54ßUH»êÁ¼ƒ@z Š7¢Ñg¶é1ËQ‚¡ã;gþõuè}Ý賃z™1òœiéðÛ©í­Õ >K…Dø`&*÷Xmô9hjæ}oü"¿ŠÎÆے$/‡ÑÆ°q 2FÉqŽ‰iÇe 3™eËqÌöû&‘}xJoÓ(ÑÂøé`jêµ®¬÷¹Sˆ§ê͞byØJ8EG£Ï6=ºáB˜±yÑ\…•¼àœt+o<A|£Ï\L°Ê@MD`¥D¡âݼ–õ/% +¬‡Íøg îõ‡Hj¼Â + '@Ò_Ý}²}}‹ÿ~ 8³„ÂœÒ»‹8ö‚*QÊwÃð;–„eFbÙë¢R/kýFÕ™Ä † n±UYës(aÇòPuíP(SeR†:܂C0/-†CzYŸtòΌ>ÿC„l­<Ω%Ššy'X2Ìïâi¶¹¹èP‚¥Sœí1%È/#¬Ñ®ÖÔûÓ°æ‚Đ¼S™úØ¡m%œZ¡Xýá`(a|†ÒÕ +½5ÝWï© +I{+vTüsO ijâJ¼´™:¡°èóÑ;©ý̤y½CIÏÂsþìVû𚲡B÷[òQ`´ ‹>›Pžò³Ï A\˜õ¦Øœ*Då¢Ïg®¯%vÆ·a¸&©ÖÓ²‚Ÿ­¾t”U”šÏî[R˜:²¬>+.ü*j>[ÔiÎÈ}ãl£›@ Hû¤Fø—²#“(؍TPr3AàJf†ùۖ0·õQÀÆav¾ږ¦«ÁÖý@¹,†ÛÇÒàÅE7,ýÚe‚–˛ÿ’õ÷dö,ùúKä6S4^5GgI$|"¢Ñåݐ“³ìÍ"q– A#„ Ä2w²´<2WÌD +@›¥õ³˜6þ†X›eä ϯH=£´x´?r¢LAm~R„ÚùaD²äØëäêžÕ™e† ÆÛì|2³äækQf9,†âcÚíYvÞAú¿l~Hd¨¤'‹Èù\Â,ßY€þ ÍA%æÖZcÜ=Ž†¨ä‹i@²Ëӎ^4´Y2ãR ¼$æBazܕ¥,˳'ÿÆ åtÚÂÐxmcdYª,Ûö€r*J¢si£²¤X +±;¬Äî¦,Õ(”c …a(ʲ¤TX‹PKeD•tP$ÏILKW€ø{ZRŸíuÉ2Òž+T\:²”ªqÉ9ÊXƒ¼°ˆ5tÛÁÍݙ3èÊ=ï:«¼Â̚•sÓeEÅOLEŠþY"‡}«Ù­2ž5ã+X™$oÁ ëÒçÃ'h}?¹ –%ƒ¸§|.ɁõXŠÀŽ»Œ^n)ÅÆ +25–üžBhY ¸ÑN!ÂÄXzè%%ð¢+Y<œƒV¡±²žbÃ+«ÃÂý +ƕ„æNT®Òeã*5Ëtæû®AȉåÚ?ïâCòJXÆg&{hÎÓL –­¼;Rg +äŸ<,§d—Sq +ñ:,·CÌgö’JZ·çô0ü‹Ü¯Lnw™à•ˆë:–ÏT>ݜ/[”aù´Ëé`…ëÃò=Òv8±¬Pj†!eçƔƒ:£‘38!°|L2–QŸ“¿r=ãV –:ph,EbVF;R(;)‚x2.~eOڕÝyW9°wK}e¦=¥_„úę¯ì¦ãÅ}Ϥm†Þ9<oc¨z1ÀhL°ñÂܤ^9ž‚Vèó`؋ÿßʕ†€´©]9Z`äõ²z¨2ÖSe]¹i֌WâeE¼òq.F +ë„Wª"B:¥žïÊ)¦iÚ/*9ÛæÊìy[ǪÞ(‰»²aY‹«æ`?âÖt÷ÐØɸ´+%«õ2¸WMm `]ݲ+I­‰Dmb¦.ìJ{6V)Êíöé͙3²•AWbX 8¼q ÓseRPØà¹rX¡zBseUï~èJ?¹òt&s(G*w^5: R$p€r\)vº¤š± ôW.Áœƒû)—Aox H+m(=^“¹ŸvÛWò›h]ðâŽáJK‹™E áÊ[ǁ|Å÷L©ØJ…‘ó…¤k%ŠЅɫ·R¢†¼H9;™=¢Ä‘Ñ`Nƒ¾¥S[YùS¼ÀÏO‘ N +jŠ¶²¼&5ø%6f+&Îà_<[³Q¤Á‘ËáØJÙÒ1hØ *“ Q÷µ§;ÎJÐb¤¹¸/²ú•ã|Êo؈…^ªû[z9 rɵ ’êûÖm–•±c¢ÂJ¾&þžènE‚²’ÿ±Wb²2:a”B5V’h$ÆJòy)À+œûk•??9 +…b¥Î$Vš.båó¾?%ŠÂ+É%ÃJò¶(¬ƒÇ}<ìš…°Rt×Î{V7>%#ƒTH¬Œ;öµ5L«ÀC¯ÀJk½Eþø#¯V`e¶ÉL®?MAxÛÃd…U–îoaí-r¿Ú[%ž±rÎàÕ^Œ«pÁÕó#«Bf¥Ui§Y•d[-v,Ž¶’«Jî±tð*Ý/0‘q»r¯©\¼»Ã͉ƒTUɦ°éæX~Ÿ¬ÌZå7Æa‚_dÕÍ+’ÙâÕõ2w*¡r{Üüέäßµ¬Z¼Ülé(UN#™ÁÎWã½Ñ¤’ȍC‚z À¨²ºŒgœ¢Êù¨Ô£4쑜¡Ê݊V=[•)  J6úÇPsQÄ ¾RI$(!çþÐl:•œý‚=ÉhL8•òƘÉ.¸©¼„Üõ‡BÊ­0Á æ΍0Ôfš¹öïfÍmÍe6ɉrJœ[9>5“`*ŸþØã®Vˆ¾ ;*æ2G%<–:òz’Js'.4*/È}óx›mnƒ)‚«@ìñNëØDF$•»fxÔhr¸!R¹àæGÞ>òuB* L°1¢ÒÉ}ù×°Jˆ©–Ñ!HÅ<*ٌ¢£’Ì’/lð×`f Gå YܓlÅ "|œÔí˜ çe)•Š„•Då:UPˆ¨T)µ2‹†ÊéÄ`¨†¹‰júÐÓʃ6F„R¨ ¢áÑ(¡’ϨS3|oà«IÊÕ;³*_õ×úÕ`P ‡GA%ŸãÿXRiOËX$°ÔbË¢×Ù3Šª¾‘ MÕÍñíAÏ>e(JY„ÅØJ¤Oy¨l\e°Ìn ‡-xŒ>eœ¥‡¾tz õMYË2›èžÒÊ3M­)ëœ>6—‡DNYö–O‡è)…ùuýp¯=©ˆ!QÚ6±¢—c¶R:±î¦NyžäA›€€°Â#4pÕ:43-r¤zŒ#>õ¡S2Ã9%Ù·³«^ç±^3§Ä*Ôa6x*.Ò(§ü=n ï’M·Æ)Aà :ž,¸z„$(»É*4ßòôgx1m1?µü¦´)k‹¸:å:^Íh–Lɔ¼d¸PùÖÚ6åö +³Eåtuˆ.Gâ¶AúÒ¦)cÒo’¦üÍɜ Mٓ|°W½p¯°f%õ  šr”ÊÎÌÝ^)• à +'ûåŸMò.¥tŠß‹ŸáA¦¼Ì§P§¯l}+8cJKå£e«¤˜ÒБZqˆ)9SÔÔGAÔQ0 í„j³Ë‚)kÚÝôêX?T^ö¨è禴â:é÷+®6à›!Ê&Ž¨£w«dàRn¢TÝo5ÇB@Á– Ù@ù~§'Nµ”Õõ/‡XéjpIJ‰u¦¬c¸Ä!)?Pª»øžK)g”¬a!.ëÐ °¬]þË{ñJ™î•²•P\u¡VJòU撀æ2 sý(UÍ1ï“Õ³v¢QS£”£Ät”Ke6ÛÎø+–Å!˜ïÕxRÂÍD ÂT¦—Æ ê !SWW›uP÷˜,‡æ.NÊßòá•Ñ'ñkxT¤ÌØ ½pvŒ¨ÄÆ{APRZô0x÷¼@FHRfÏ­ñÏ9ûvþcDRn—úØR–¬ƒã·]G)çÝÀ+×öoÛµŒ‘’~‡C´¦ÙÌq¦§e"vÂ&>vësóô‚”+ƒ}3ˆ”ã}δ®@ÊÚ¬†,…?¡ÛÞëÿ¯Z÷ìÛl08”‡>qã~eV–ObœºÏ¾‡ ÚàE}}­ºƒG +X'­U$¯Dw”2²á +ÐYSÑ«£Œ}Ç;c¼k`ŠÈi›¢LtS±sºïiŽ%_÷Žœñµ0 Ä% ×a¹Ã‘WЏèÒ ós£„‹ó—sÉ,ä¤Æ4Y4$x&–½D%4;CÔÀöóf·ŒÜ‘QB}º„ÁÉà&%û&ºé.¨æ¢%žA kÁºßÂo/J2ß2ÉwGúþÓvdv—Sâ¢li¶ó¨ý™‰Šµ.‘áKÄeðÌð¤>Xy¬eP>/ãAY”2 M7 `q{I”©;e@²#£A±ÕK#ù ìŠÒp€ÖåÐ=—ØK.´ÕéC.P”Áîi»g°Oƞ([þ0€ y:P]=9QŽòý²z>Håy¸,Jÿß¼¸PÊà¼]˜æºž%ÊõàÉÀœ›«&[K¢¼È˔mÙ“ǽª 2ž6“Ë7_¯´:í`sžžs+[ÿSQ†§xˆ1¢< ÄӒ@_~R¥Tä­Ë±ûMs„n!D”©pvÂ=`Aˆ²œc·Þ݉%Ó­€zVÙ_¿24°Ž–ڡ܉çþ²¡D ß!£}¤PÛ?{)‘bxgPKŒ8\6”Y*ÖÂqúÆ¡¡œåT9óÅÝï®ÍP¾£!CÙÎo­Ó!¾ØõQ.)âöö'æVfŽ‡[X)Ç6iÙ2á£lŸyÔXœ:¡M<&”ïî&NH$”P‰¿3&õ¼¾Õ&i†Ãe ÈäirëC70ÎÓ³l1ÂB7°¶SÓ¡*MH8(|Ulj¢fåÙOhü'eVl–ÎfdP‚S…AÉ딄[ÊùŽ»K,(± ‚*÷Rò™ƒ)‰4Mª4?,D#5çaÚÈÀ.ãS©M ”5èey¿KÿBa ,‘÷1ŠC ”‰¥uF-!†˜Ó'5=€ƒd|ô +-„£‘O7þà€p (aM‹ö¶‚ÓHQ@)%: ¡$âvRT(yJi¹6¯QÌ ˆÛ'³§£L7‹é-ü“•ìWAið™åi ) +‰t=èO®ëÁ:в™Êök¹`Ûº÷¡É˟I½4JAþ ¹‰7>[\-óô´¼úû싪Ïòò&‡Û êæþ5/׼…7gÁ©ºÛBU½² ùž\p³<‚Ž!dÊÍÑdڎ=ìj®»ÄsÉ6 ìN H6û =Õ¶[„õ¤üÌBm¼ãדžœ¤sR ÷Ú$zòl_~$Ózž'MÜÔ"*È; ùyöK>Xžô°”'íH£-PêPå{ò=ÃÚÙ.’ÜOʊO¬’Ò ÒúYxbµâÆw{X£sDŽ jTLUÿðŸçÁöVûÈm*iwÒ\ÕƔœÉc芦Xu‚•Íl'7Hò⤁]˜j'ÛY0ÅÂ>8o¶SN*ߜ¾ºI%-úñV(©£ó/ͤ¸ªo²$É ò^t²†‘{ýéúJ!cu²%xm+ËŒn©“iIm¿9PrY‚:ùšVn¬±'Ør’Q€*q‘{…˜vZo`\žùƒ“ÌF??šùÿü²±Ñɦ·ãfª\EN‚dJ¸ R “U¶*Ki^¡Y‡£Š(s²|+ž,\àå¢?¥9Ù@½’Ð/“È©=è.'{ÁHcÄÝádX5ÈÌ/‹‰ñÁ͖fYlLYáÜä>Xáï0r$¤+¾ç(^=N‚“N>™€¿×䘆˒ü&A1‘%­§\‚‚(ÿ/º›ÜNwmDÙMìÚôf½kS¶•ÄEV«I{ n=þgä&;··¼ äÙ_EqßpҘXÕފ…¶É¨c‰k’!R5˜Jƒënpj“\‰_çJd-m'^£eõH«,™âiRá?€Mâ}º‚ÒnLò57êÏ(1ˈ×亞þiҚ”fۏÇï–Fa²&µš„„®&Ù”ÕäÿLD‡Q¨& ƒºTAtD2t=Yêý™IïÄ ‘ '©ÉQŸ ´Û•E»i}Dڌ»IMaB˜ˆÇ!,{( á iø:2m2!P!l†›pèhò.ôG†´¯a—Œ&ã3M’øNé‹%Ñäa¥}™v%)?¶˜I·ªrÕÌ¥öd•K$u®a±îr¹ù¶TŸªÞœÉJë'"²XÍÍär8´Ÿu€7Š)iL[Ôªß1“¦Wh⇠àLŸ´)cQ#Åñäè.ˑz™ä6ª®OœZ&›TÜ¥Càüœ•I%¼?^ðŒ™Êd,¥ 6khÖ°ÂØÑ ”É éü,qù.d¡ïdR¨§Ì½µë;*&“i1ËÈ5äõ22‡¦:<}Lº_U“<¿ïAÔ1¹<Ã"Çdð JTÿÅ0D“¥&w&ûÍö 0|ΗLª:Ѷ‹zîëV2&Ÿ~ø©ÂcR ¾™º˜ÜÎÕ|ž2Œ²“’?±˜Ï2h䶼õXLdä =xbTцI¤š¢‘BÙv'c˜}'Ù©/ “æ֓z¤h ç€dSŒžjŸ=Æ5ÎÇ`R–’&—ÕÖ0ì4úÁ¤¾¶¾J³!ñ²Iɘ@Û6oPÀäð|.˜úd8G¦m¶O|pÉ´R” ÖÍ¿dzC§ÓCž\aó +ÌHL ž7V~÷’ëñ¨ÝØË8bÉ~`/™ÏßԉÛÁ¨—” ÔÓ!ô’²4 ¿-áÚ`^²x‰â-’“\ü:r—LFmd‹³3Ë»Ú%¥qç¥Æ.yü>Jž%ú"ÁýË&„-ѺdRÚ ;f²Ô%Á^Ö=åF#y¢O“lZKBÀ)5° íeñ©©¶Wïx·SöF&w¦ýÚë㖬~aɹs̶d® 4ÔÃáÿï<ì`¸ð&1¯ْ¼ b[ˆ?cýØëîÁªôr¥‡Ç*Lq@•´$>_–1hÉ"=ß)ÆÇæá,©ûÜ彗À,yÀ÷Æü©n¥,™*« ?ùÆnç3 +6‡6ɍ.ní‚F32.†-ÛÄ=’Qç–D’9Ö¬ÿ¢¯’ØåžØl ˆ¥!a ç‰ùJºlÿFœRo;¨ü¤ƒ"4IMIöpk¥!£$⎮d£?ȕ$C‘7“m"Ð +ŽI¹•4¦ ×î„H¸ l‘6oÚ m"-¡¼ßç®h »N|;yµ2­’´™S¥¹º™‰½ùœ¡Ø6¬’÷ƒg€"T%5$mƒیµ5Q$F0¸(•Û¤8EÊ j¤’-LÚ´l­@ÞMT&H¡’P¹m×1ƒü” % ÝVÔF«qѧ¤ ôJ—/Ø=.|uº˜¡S2Oy@]€B>e§&NIk3æÆçØ”Ü&BöŒ’êäa€”AŒ&ÒIJîWQƒÌ ½ Œ~ÑøYA¸½HɉP`}ÁšÜ{¿-G dY²~ —¨#Už€’Rº–y»Lm+²Eɦƒn-/žmI”¦sOŽ!üè‰%_@Idª~øz‘¡äR‚md +]NùòÀNI&‰³µ{I. –„’\ž»6))EÇD‘›É§ÇjµQ2֐Ôì¤IägdÀc?ô$Ë­Jž$¡ÉfEAÙd4³§y³Jr’^ê­K(“¤…l$–Ix:y“àÕÅ “´ïÙTaO28½NÜÓ5-eЁÃâ$ášÌÃË¡®ìѤp݋ *b”Åëæ¦}Mæ•Àmš“(/5’¸-eåÆ$—þ(¹ [!&)ù´›âo#Ѓ¥ú'J² _Ø9¢°_듼 S®Ê/¾$­+›¤t×Uւ\¯æQt)p‡æ.íƒ%Y*ç ­±Â´XIHÚ/$³ùc¥é¿e0.„*IƒQÒóìÞ®#zFRŽP Œ\¿à] ‹0×ð½Y»©e I’p·½Ný±É@=XâGòj-$ÉT°à¬º§›¬bۻȑL¯ƒ²ƒGоn5Ðöª‹“¾ëI}îG;ŒäZ†ïÊCÌ$`I˜íÑÐ`¶a݀ù¬FÅô#Ù +’nÏÍ¡ºe½³ÉÚ¾Ñé}î‰í·¬xAd‘¤õù2ºÚg;’ÇÃöâÄ¡²†üD]Î[rLȌä& +Ÿ¸Ò +’2’È„jµ bzøx¬r„L–‡è¢åAU`$ÆyJ6oQÿÜ(g ëOÐê,i/=±ÉSèy º‡>]¢€Û=ýTo©šX ~=õ ¾ö:Y$’Lf§X´µ·I´;×B$ ݊B;‹.àf)€HÚU ñ„Èdh•K?ÙuTtŽ­(aV©»bjMÏbÂ@Rʜd^“G6Žk$$E„DH6ÐøÇ÷t`’W2}/=H†Ì4U¦*R͹‚½¥¼\kÍË“ÌÌ%®z³[ä@²D^.Kð´K% $[ÀŠ˜Cˆý ·*In¥üøÈøˆÙìÏ⋐|Åøbç†ØÚªþ#ï«Ëå¯À®Éér+2ý쑥ð^Hz‹ inŒÚ (D‘¡Ü³S¬^1Ù#„x ¯*˜ bAŠ:œtU;ê kcó2’!<2)¨yû/©G +/ìÇëZ˜[šÌ l´G.4•„ƒ {$ò+[nHàô0C«­GÆâ +õHÓ¯U«ãôHcv˜=²ú®¨Mþÿ8‰ètÃ=‹úW´ÎŒGʋ*%ihØêWƒ¢•¸‰*uJÁÜuŸ´¾bÌÌÚ ¯‘¾Œ'C-Qµ¦ú‰d֐wäq&¸ÕYPãŽ|\ûôCÍvd}æÈÓ f¿Ú3‘.íHvhOˎÆ;t',+#ב9f~2MNÞ~ÔöAǵranc֑Vyù6.ÊR‰Ú§ u$¼‘kšŽtc{µ&/éHÓ×ÙvZàÙ·X©ïC‚Ž\ª¤¨ î˜:ˆh#|$GºýÂ)äÈaìÈ®öè8’;Œ#QâÆÌrr?s©âÈ֋AHŸøF¹”]Optåb8jL^þ!yûJÀÂu¨ 8²6JÞ¼È~yÔß՛ßHšhEY˜4û¸|#›óŸÏ‰2ŽònD·ÞH~Ý1¶ÅÀiÔßÎ9É÷GC5¦á× ÍÐFîf³U0‹D4²4ŠÒ•Õ¶kŠ(Êü–k\#‰ËuÌZ# +ï7RUä_êùʺßéÏ׌‘ïM·¨üOÝXV#×SޜéЍqꌠ˜~u]F#+¹¿už¼!4²*U2Uã\`Å¥"1ö/H)´"Fåþb?²/’e^ÎM¼ndŽ•k<ïEš¥QJÏw*NڌÂűÝG"ÍH¨ ö¡֝‘÷Rg =wOïâá2²I»õÇK &ñ_–¬5wp +t“§eè¬ +2’è-«¶ Óê8Fÿß;°¥L™"÷0>ë0„† ú¢""A"DøÍÌT#h33Fwú”3MúC¬ZòHØ×S·ÚtÖh,w€¹_‹µaSfò3 'FN¿„D ë$kÜ(@kc‰Wý°EEÛ8EDJTqX5AõñTeá2;-5E—1þ¯»)¶ *!! P’d£ÒT˜&Ù R¥e€_„YŒ4у4˜»‘FR©¼lgID£¢AÔÄnÛÚmÛÚ¶[ÖUÕª*Þªl$‡ µñ]·Že»m[·mmÛmkµ-,IŠxZ´Ái3Ÿ¢‡ÛUc`ŽBBs†Ñn%í´:Ø93'O’w’Î;;ƒ3àBê¹/ + y<ӆð´7­ß¾‡-¶Ï„· +óL·ïï_}«}Ëïp8Î^ý÷Z/šÝ@Df¬•CҐÑkÆʞ™Y­üº„À¸†50Ú˜Ýæ¬ÖW !š# @#âɉH)„ASä@‘^H‘!J°´”($0óŽ“AˆÖÔäF°ìÒ 3"BBø 5ØM„ÐÙè÷ÿö‡ŒðpFÈñ ¦s*ˆ¤3˜s; HU™Ý*$¶XÄ­EN°-."DÂD†fFèf¢ÏœLTD$òљG²â€ˆ°¸¼ž@&1Ù¿  +.¡Äâ)‹ÏÂaŸ ®â|DÄ !!¾Giå½ß¹N&Ñ@†'Ÿ`¨¤Ü=@3p@’X4 FãrU ãð-"˜\p”¬´x@–HÃ$HQ†‚Œ2†C!L´ÌY¼ à<1<§ýÀž˜á6Å B6íoPTÜtª·³ðä%Z–¼Ë6§Ê°[h§  jöH%Ã7žƒ¾î ÙT/¸wXÊؤo°ZCÖjÏLâVÇ)Þzˆx¿6¯§/$Ÿ¦¡wNæڙg¦­û*ˆ£v¯öÿMluð(:NáF5S{Övœiä­¢ëm !â8% Üö›Xo…êTÏJËgIÙ$³i7ÙãÝÁÛh2±fT|K¹ iÚ5}0B2– 3NeXàLŒ×jöŒSâ(XÕÊ,/ÌÇؔ8Ï8˜Ìk^7û%Ä[žÐœ¹¦"?k"Y?Ôü+ºÉjwÁ.ñy+OQ½ô–ÊÕ4ÐèÂøďèËú!E–Ã_°èèÊn:¬Ò£È©$DŽ†Éta®ÉÇÏjÔXöÍk€÷x°ï2K¡ægŠ„@1šKV4=q›Ö’Ê×!$ÍMˆF­t8ÿEÇCXˆ=2Fyd•2$6II\êJÑbæ5ٛí¥JÂóe’ô$ºÑòM/„×T ›èœŠl> ¶J?ƒéÚh„Ì qº¡‚-S‚“<‘€ÖPP¥#¡M‡Ê…¸ðŒ(ɊŽ¯ã>›€—­“КoFCBŠ’$§Œ”fæM ×cӂ‘©swˆÑª†ö…qÿkC•{Œøξ㐋Oˆ8õôŒª,ˆÐ‰A6)bŸªäˆd¬ÙõD±hÓZÀÉnԞ8]©qZ€ŠŸœÁìfâj¤EÃu²áWù­åêå×oqØ$)hcEò‹êކ;A(íPi©¦9¹˜énÖÁÕÎùè2#çX_ë@…5Û}­‚ÀÊ6ïé§VL†Q¦;¿rÈ=#2û¦J/nSDG.ÿú¦ ÄP20BgI—²:B+¾Ôl:{$m­Ï?%â. "”T";IkÆ~¼©¾QÉjGɕãKº±"Ùòׇ£Ð/º¨É“Õ9…m»Ÿmä~È ›¢ŒŽ*~Dô;åÛruÿʅŠå Rå•5 ÞF½K× +~¢)ïZ }a¨eæGbÚü¹ß¹&-1ž¦@Úàie«õº…Ž”ØIíö >ÆþNè0†t±dA»¸•¥æçßFKÎë ô!e&ANƛÒü9$ª8Ç ü…Ò") ·ç&$ Ê ÝL­|Ù|o4H ¤Š¥ ¢ ….{ÈË£Iß §:ãxT‚½_ñ=´ˆ®C€9Cf̄/óLºV™äziÝ;æ}ʿбÉIkÈÜ8¬2-ìĦêÀ[ؤ8ÁFeaéï%ºú ¯v®¹ç±Äf.6a~È1“ÑN˜z§¤9Úÿ:&y瘡’(Ipâ,Õ7Ü{v£ƒùp/¬…þÚ¹í¸Ô©Ô°±|eî8”œ‹«ª *PrÂj?n Œ[&^lÒeý_6/B¡µx§*ó^ü(Ý=ÓV§¯’xGû9¨¤(§-höj<ÓR9žvÒtAÄÀ§oª°r©å"v„Db)éïù¦ +NÏ$>³gø hø`>€pÞwÈt0`¼w€oÆ ­Pÿ™zГ{ éA·Íó‚ôj!wçìy1úÀ€z˜ËWÌ •!­RýÃ/±‰<°R\U풦Œ+‰Ï@„4äýÜ\ӟØ3â#‘@ÌÎ>â¼ÉŠí ´|ñ&¶´z…±Bûd(/…ä~\„jº’x-¦"@$رZ5¿Zт£:¸rQƒs’îºÓ[ñLœ’Ò'£¬À¢Kt¯¶)ªQܞ ÊSÉdã9ÈÄD)þ×K)H´,òR´¸' ¬ôTêUééo£q|Û÷#q  HcpY«(¯~b´Iƒ¼P¨›`*ê0¡l`õ¿Õh€.$¦/ò†XW…Ù 8 ìa¿30„ëðÍ¢™7H?iRkµ&ݦAtL§Û Y¯n€ujßËÛ@¶Á¬S[màxBnPУ ƜHõ'fz̅¥z䑍-@A¬>âu8ÜÞ¨7°Þíg6ó<ܞÕ`ñòcÎM5ˆåTûS‡H ä έ Ô v¯aq¯ÜRnByO@ƒBëUh­€¬¨/¬…ßa饟Àؕ`þzÐë™Ú¦+͂ßó©Xz ¦!":Ah= j,ÙQÀ«¶ •ó`Nš¦Ÿ!Áà ¦R4`E"v $á"á@ž0`™ð/jX\‚==Áûf§%(•·7,A@€=yÊb%šš?Uœ°Øê™—"U) ˜¿"È&{AA푆ÄÏ G$nÕk$0=‘tÁ‹Ð_ öÄ?4©§£ÔoaEU4ô‘:+Չ!è>y«_‘NÐç +âÊãªÌÛã1¸‰ Œì± o÷òñ¬Å<°ˆúrü6×÷ ä+¬w48Y0l\ÞPDµõ¶'ß“†!Я{P,KêDiA²ãý0ãÜ»s,H7ò,[^n^ÔKµG-lzQ¤|Þ z +,¦ötn`â4#–%Zÿ‡îÂè•Ú¶RžÄ¾}Ýã©ÄRdžxÿÝ£jøA—&´Í“ÂLõY¶kêÍ×®^~6óU&>„™Bž}3¨ßÕiòTÿžùæ@ºC㮐€•oÞðmšŸD^T•´+ ´WÛÀ)V¸`?›ÐrŠ­lÀú²LøÔ¥²ÍÞ÷ª°‡Ûûݗzoý²So1óešÙ Y1ª¬˜ÀV@;ܯRڋ‹Â…“!¼£é –ñ›·e ¥'Þe êΑþ¶$˙4:¡³;¢Î4 4j)™ãZˆF4’|ë.«â x4øÐ8€¿¹ieŠ+¿ÀCôðn5RjOz¾ ®À„†NL°}‹=€†»ÆÂRCóPU´Àv^KÀ,à×±~§6O}¨•,5ú¤‹ŒÙ 0ó@O +ƒÐ ‹•ñ:ä0­f‘0 'j°@¥'.,†}•óV̩̉p•Z€Ê´Ÿhd€‚ á*¯¾¾2¢€ŒÑ)R(`LÙQËu"ÄMÁnéBd%2\ÿ·D5¢@I[ëÈb„"L^@þ’X$éÅþWùžD”L^XWµßúWÜáŒoõ°TÅd€îu³$¸š‡‰ôv"M£$`Òî© AÇTN€3U Á@F¨©b£ü7ûÄ0; +bí—_õŒTþÝç/0»îŒ# ²"À±H6lˆ€…qEœ>Ê9C÷ÃÓHɏ`?ɊîçiḠÞ6ŠÀ¸QÏÄ;˜Žfín™g’dCø|2fÍáJw¶„’¨¿pqds Žñú.øż‘éàtÊ%4rÈ¨æœ ?MP Àk…ÏÜ)‹mÆO2V5u;:p[öŸ 0J€6® jᤠ°í% F½k'ˆØŠ OYڏû­©š‰Åã¤ÁÊRÒ@‹ˆ‰8SJ’ÿS~ù&Áxú†ßBÿh¦I¥ðR  ?˜k"ê,*~Ú ­ÍÐS09XžU¶ïôLPËåNõ&n'-£Øfì‘ÿ ðÍÜm‡éÑÿ¿=™Ž(ãøÿfUýƒ…þüÓ…Hz¶mÿ[ð»{­¿ÛGœ‹…£ù¯`â#ÿ3ŒüýÙáØi©³ŠÿïžÁ\ÊmÿK¯ìTÃ×Á|k1éŒý«|h­=’Éú?kÞ– þ[§LéT§T`\å”Q±ÿŸ3aI濬m¢Î‘øoìPDøW:„yÿð €~íê;¦òý{€ýÞÒIÇû'’×fÝ¿ømяôsòØ;Ÿ÷7Ó9‰ëÁRmÿ°*`^oڟgà s¬ü­pÉ¿±6iûE#È8Öcý=O§ªþÞoöŒú·ñ%,¢p4ýý¹ü•ôï _š¢?§×…g-èÏ£WÌÊÇ8=çÿœhÁGΟ ï·ÝaÀ, ‰ÿý™„U‘ñOSëR¡âÏ~öoéʅø«èÈføÿjžWûbbÂÒÏûýýÕd‡ëàûwÆÖÛpzÿ‰ìOöE)3 eãýöØV»,ŠÑý—íMĔûٞÚTÀýµ¼êZHOoX·¿¼I'?Ýp›g±×ÿècn‹ëÚulÔNëŸèù¨ãPŸßˆè«/1?6.ÖOtAŠâ'ë{Ó6©N¿’÷¨™~'Zãd¥ßi³%"ý£@wU£Ÿ4°ßôl‚Ðώ"'BŒœ/Û£ŒŸÒsŸ8.²_…Ëß"óê=;°iä¢ü/Ê2øìdò÷OV0¡¡«É|ÌíAþšØÇ¥ª`Kõ¶È?XbØÔ<¿ÿ›ßî¾Ñ¹¶r½~uvœCp£õÜï"$&>¹Ï% +ü7*K"õþá"Äfú<bL~¿«<³†ŽÍkÄ@†w„r³çêû~©æ.'ø>N;ˆPž5žéý{|ËûÃ>æ¸Þàwäþm“¢N$©À„$º¡ËÄ/y©ûÓÇûCj­3ÿ¤·ìûRÁýzì½þíúÞ~òÛâDÐÞ)NsQû~còIÚ7=) ’™:û{âôœæ1ûþrÊ‘~‹•Ù7—êÇ͔Qê­oJÉØ'fNÄþ‹ŠdÒ¯°¯­¬gÃËpì{W®Ø6ñä}}ØƖÚGîÆd.æIðÃõ’x,¢yÒ«¯Qªú”†Ž=߈\¨>ß(AIU¸7-%×]Ô)iTP¿©¸·™KD~?¤§?NRÓ$ÏöT[‚ëù¡wûe´Ì¥c雷ü¨Œ€»_ًPúב ÷XÒ?n<©B#H_|pƶ¾¬p yð¾ùe¢æX*úg„d;*ÝßE{œÊKÏgºwW†ÏžŸt¼'ný½fçG96Ö#ož¤&W9+?uœˆ¸'s­ßÀ ¢ùt¶&~˜ù¢9Aæ¿¢R«o1?§SÀ|Ó®IP¹÷“ýÿ²ïž?#,h—äÈfd V>o%èT›m£q§øPõFŽT¾À ÞŒèê÷²ÎUI‰t šLl¥rò€îü҃` ÿ—áÆQ‹í4Ùùøo—Žt~ËõW8JŠ´·ßb0ð?ˆüíb;˜ø@§;Ž¬Õ3õz}+`B6"üÇhg ­Žú¬‹D'ïLœ ±pýVÄ÷›ü¤lAw +⫘w¢‡_å"¥G¾rýg‚Ë»­fCÃ?«‹"“åfË]˜R(tŽ¿<ûH’¶ùFz:¢ö&ï²çØLèËÄâà»>í•Áo×òŽ©f¶|w}NZ\/ýû¼øûl)Í î~­îFÒ·ï·©ô=áœuÁŽÑ×pâýÒ®‚ïÃ{ŸdÈ4Š™{4?ÍMà#Š½÷Q‹"™æý €“³DO y¯ãð^%ÞKÞ{ J2÷:Whö•Jwï–õÐî÷‡ 4ìû+Oƺ:ÅÙ%mê>(²ÍñΉ#ÄÌÖùÖµ3¨aØr…z[nÂI€ˆõ(•¿1`‡$^õGjœ¼É³ïmíÛ Tõ;fÁ'ÆX;‚(W‰gC¼pŽ3 îŒ´:4$(Á牆˝ÞðßvFzÜyªu˜§ã¿ ~ £|ؔŒÖtÎéL¹þ'» »Ï¹Â%ªJWGá 0'ŠùîÁúY5ҋšöHB.NÿoE&Þ :eºg¯Æ{(£å!’jÂeŒP$âIâõÆsVÔÕÕÍW|nQ˜½Ø) +X…K¢F²ÔS 6¶¨±º¨ªø„[Xˆ}ûï‹Cx.@Y—“£N®C:#ãÂx>’Ä­@à±ýÔ$¥Žûg¶Mýå‹ éÆÿ-ýcZÂl–ôt[á&td|ŒHâ])¼Ì–P€EŸy£õ+¥É6"pQv±`¾qÙî©%Ígá+zҟ¡j@Ž(ñ×r5¬p6KJ¢‹;9ܦ›þee‚4Õ7+ØkÐ†Ø @̱&{pWYk$v¯Cd;m‘zl(u[,‚T¶{UnBýˆ¿Qd$«žL¦¸ßk™)-T0TÑ`‰ùY–ҁ\’<8±«TêŸñQ⎏ôwkS`iÂû£)»Ÿ\óÈò§†Œ4­TÉE<\˜Aäñõˆ/,:-°MýôÝsê$ïü 7ù7u”þÅ´^PHX¶ˆ(̯F$=–çجfB‘Bi¢ñÆ”{Àø‚…ŠO.;1ð97C?ÆJý£,OÛ~sèd5¢¦ï­Nc)ƒã¯ Ö½,z½ž™õŠˆ8« n¸Wé˅Äù¿2ܨå14ì&͹Imr`Wój'ðV{IÄ»«ºœI´$Ëõ}ˆcAº¾dœ kuÒì’†¤kötŠ¼þ버^Vß7õÝ\ ­]Óærqò…hj"F©?mXj`Ve³º8•n`oÀ Vˋ½/yw(pÐ_Mpn RÅçfsªvé–öL£váy΢x”´L¿n¸Vx©mÖÉN-ü­ú°…fF†ûI!áY +1ŽDg9]pj +]œHó™"Œ(o64X”Š@ùcïYɟj±Ýùá Œáú…Œ¿_R`­·†r ¹w‘”Ž †uÄùªëmð&Òðêyš§ÚJ¿NLxéîJ32BŽ¡ö``uµ£»&]éCRÓôy¢¢ôpË +ðX°¾uu†3ýhå‚"h°»;¿¡0ß´MâЎÄGéIÖ¡)"–<~Š¡‚ …ÙÐpP(gþJ’݇2=Ci €½H£^•ßþ¡·`÷ó<ûWªpµ‘—‘€ô\&o*§6R:ó-=Î}H}ßÌ ÓxŽC:[€è ·VüˆÃ~(@ˆXER.B!pÁêV–ªßø°UÅÒt¤q@Ðq‹v§ëHÛ +8 õϘWá³þW(%É5ÚyþªTèÆR&Mq ˜pÒ6yD ôÕâ8þ¯DäÕ¨ÊnÀ|´ÁX™%}–ö²¡ø*çlÎí¼—Ó„ZP³h…ÐҏÔWêÛ(í½5*ë¢lñ‹O¥xîøÊ D0á! &çJüGƕ¢ŽO™!ZFhcéؔÀÇŹx`s–êÙ å0ñ”¤J>$‘£†Yx>ҋDç¬ø˜(ñ®P.N_Ì 1šŸš“£Ö ÉÐÙà‰¢™XC|”F÷ÈÈØ=Tõ>~ £¡ +6 ÷¬Ç¼2¯bY¤'*ü1÷¢!Š› *„h3–Î>,)“|Nú"Z’LÎ-Âúü‘2ÑAýÇÀç®^üã\aÁHhid‡‡ÆöM¤Ç«E³˜u&ÿH˜"³Yé€(¦l8&§yƒÔüv= +,Ã$f“4 x@¶$ºêr‰¨„4:§!jp#_1¥â9"‹ +¦B…Š7ýÑÎT°§æwE·¤ß864hYÆc¶¨+fÉ£p‰ì/°áϕk”A +òÁ¼Ú¶I.`V’3Ú«55.¸”ñ1²}A™$ª¦L(Ò ©/s–šÈǵqA¯sà 'یëĨ?_;FÉnñœ†¾J V„P(\[ 9/„œhƒ¸­ŸÄ¶^Y[þOÒ"‡Ê\v±3–Ó×C6ܘ2¦–Ã́ٞŽÐÒVxáí°P¦hÄ ’7bÛ¼5ÊyØ26o`YM­£°Â`¼øÈ¿ÛEö*]oê}D_’$é$-—dåfÕ#θäŠgùì|…ÛÙËô!ž9ž ‹–ç1(c§A‰–ß-#£=!ˆWwm=¸‚ú)|›B'»Òé +}²'AB¤p™ût‘e¢¢Pí!sb]}MÆhDBRÌž–â"¬ÔX£¦Þ-R—xÀ”ëÝ×ómòúí³hƒÁeÉÀ6DZpËBz><¥fòАì{4<h³ìs'g[»&H.èÚǍNAˆ¢)]±É.ÕI£ÒÆñәt(ù ®”§5¥³ìZÑbíA4'¶@.l‹¢Ñ†ÎOFÁø®?(µrž¯/2ò›ÀL·}?%l“ W­l«çG¬«8Š©Ö¨ûÒÂnWÙÐ_°RQþË£VøDx‹ãŠ)'¸™¹yÉnS9SYÒµ¹×ôÚã'âèÎG7¼ð$ÝñýOŠ&<ËÝD=( r>ª¤bׁ󯉠B¡©¬RÑHÖÕ»gð° Ü1ªÃÙÉßZϦ“:c‘2ÐgRLš'¯,M\šá½ÄÛ¿`›°#‘`•‘Ðõ¸kó€^±Åë‹Ûy¾P7^ØÅ+#l’Ö}viA³ûuïnû8À‘ :¶hB¦o™0”-R8+êÝØ¢ØYÁ)bYsŒEãXåeá„ðacGl Š¼Q“¦xoè&Ž÷…Q ©þœ‹"­‰¯',9ðDO0éÈΐ¢Ÿ°:N–b‚QÊ%°¨çÉqÀ®'jl.+ÛÚa7*ŒTHۏmŒJdf¢pïy 7ƒ +¨|‰ då®Ø5­tƒüt©Ró‡@Uµ\:&¢ê-“fÖ[¥X$ztKM:žŽ£ØrÎÇjÑr²Ðàpˆ Ëã'†c#9ZÁYtEÆà—­:>†å:»øø}¿:8¾p„õ3Ÿ=+£1‰œ ÷uy7—ö<‰ÃÞàgðÀæi g¨@’côF6ü2בß⹍¬OF¿­}ÇAG$zÙœ «Œð‹]I+5Fpê—òX@˜FŸØ¡N§B.Œ§.ñq#ÜR:g1A„0Ì°¡G0@]nzm›¶‚dj‹Òtÿ1½rvãop@Ý)§Þf!¶`‡á¯ùy° 4Ûó=LL¡ í€ÈãáÎæƒW4s4¼ÿßÂ×ùI¾e¤ï=m^ÉÊæaÌ8;òξ0ªB¬s† áhÈaŒp¡è½àìg ®¢’¼Š“³ß!@g–‚Ç?ê“,՗¹\´BîíDs,ª€‘ÊwηÃ##$—¡¤^Ä!-1€=/’è6s»`—–ÒóÁÙP—"¦s{âC;Û$ Ýò@Œ“å84à·â à‹Õæ4Q³iܓ—_:½&È…—=Œù¦ãuáE2½ÐPMÖæÞu¶j@b‰¥æeœz÷9j“+ë’Ž¥T^Õb¯÷Ã’ö9?äòÙó ŠÈF8¨Û¬ýRc¦†ëÞ CݍØUYˆ+Uã­ï½ïyG–ÓÆœÚ$kðùˆVSÿVˆ ô™Ï­—žŒIõ+…6® +:¤UÝP|,²ÝøÀ• 80Ûц•…‘vw¢0 q0;“ ¬ïžù¹Úøgõ^5/•Ê\yŽþ5¾‚Œ)EpžŽz}UÀf \% ý¤ªQ Êø'ÓUÝÀANNìðs^ü1z“MÒh3‹J¨ây…Q½J_ÝÍ+ƒ +O¾CZ” +µaH2<‘Sd`©½>ŸÎuXuݙz6*8æ;!é Bi©Ú @È«(–¬ 7kî*qÒY—8…|Ç¡^9á–z«ö; +Ǯq×iìb÷ Â!õÚ )øкyRdðòº‹+Ô§dñMŽ ,«N¤mv"+°Š^x†ý ´sLë0…ô ˗bøà ‚.ÙFòŽb Ð @2W|Ôä ñâN‚b²šeDÜä‹P×Í6ß52&ÞÞ;Uá£nîü<$µrÿ  –ÎÁÙèU‘n +£† §üÓÞ:ĦLqf O0"m¡[cö ª¨ .Hø¾ak؅Š[Á–ÄôOOªÚßi[@Ô%·?w¨HäŒDRC"Kö\ÁHZªOJ©ÕB6…pÔŸG›ÁD@Tuh,h³÷“¦³Š µÈÿ.žf»zíÉCf#å÷WAYø9xî·Á>˜Çw`ªÉý‹(5“­6\CÊ|¸WµH°)mV cïh¥L*îÿŒµBéBŠ'Yì×ËBq8Ê®Õ_‹ò º]r)ƒ#ÝA{x.$¬„f$¿1lÖ"êCšOµ»/|Z>¥£=KѝcôÃéþ©¿MßQe?=±ã„¶b‚öhì€p§»½ˆŒS(Û´pÍj~AÚpž_jõ2ÔÆÆûTÉ'pژqöHõZp{÷xn +ƒ]ïí9¿Òº˜4£} Kðº¹/(F² 'ù‚ü/â©bäâE]Þ³ž®€¥àä̤®o±î‡%¾¯ÆiLô}_η®[uS6_›o0õÃr¢Ó¯94ÇM§'Йœ)«€rÂкz¯ñ‰ñ°ÂàVØ&j„ƒdh"ÔÔC©'7åNìË ¯—Q/òaƒ,cîø¾¡7óÏ]^Ö^¸G±Pí‚)¶üH¢77†-GMÃ$5 Co€§PðÎfÍ#MhnÐY¼ÖŒêxâŽ`B‰(–—Ïþxdž,È}T"Iå&Pèä¤ä“$Ñ}ÔÍ–õÝ!—Èb‚iä0QÇï{”üL¨  ƒ[|Р'M`S-Úµa]Ä\ýÁॴŋ}‰í‘›ÃükˆGõ05’ZîÉyÚå.éò!ºkyÑ©&áɋ(š<_‡”ˆÛtÄÞæ8Áè$ì[!Ü–7ÒA‘"¬˜PÑ5c³?†Ë]!UÙ4Ñ0ÃqÅ°„w€IÑvhÆ ’ÀB¬¡S@Õ2å>™ð!jº‰­¢Ð*óÜ+ù0:¨OÚ¯á ü¯«q<ŸG)à†]h[ÜÏOÀ—Æe8‡`<"b2‘îõ¤k;ˆw1´÷ù^¤}ùTrþ§[S+¦a*{ih ð|öiKۙPú²ÿ†}Õf'«4^çåÑ*Ñ|Ì#lj c( Æ7AâÜ:tgŽX/ïº*ì<‘hÑ×ˀ#""pŒ‚½(ÖyÝV½ ƞG㲸S#–jV½´9$cœï@`_[j*«jyٝú^d’îÔÜ?|Ò¸râëÝb  ·L ¯iSB§á JÌ­~ýìÜ +Â¹DóEB 2额sÈ CšPá!@çÖÜM¶òjL&â–õûø+¸€2B#— ý¿HŒ©êšÈÄéDEiìâ…$Ó²qìªæ–~/ÂÃwgì–3®8:ýÀ¼EE°œV#PŠªP£QD\¼ÉêM»…âP`Û ¾'"I’E¹ÚJØWH|£.‹Žæ†a`£US¹ølÖ(¦¢“‚ÌÍÜ/ É%*tiÁr6ŠÄ§Y̗‡ì_˜X½?oqҎ Ôa€É,L?Ë:á¡gضÚ8ŠZ‡4Â}–c»Ÿ›`•=M"F@u©qù/Xûsƒ'[^â{;šÂ˜dX#dYy§æ„¿Uø#…xLë( e0+½B&óþCµÐðJ´Œk±^)¦°Ÿ± ÁÀ6;º/µb—¸Gd×à›ïüÿ(*ç íRH2N¸ÜŽÿPBٌ˜‘)ÈȤˆS°Ï ®ã ~â5=ì©}ª7ü£¨îã¸R/â§#‡®í­&+±ëMúdøóÔUp›wè°¯i$AŠǾ +>ËDY“’”•ûUnp˜٘™‡‡†@Njµ‡üu8y’!ÖC©ç† ÷¸Ú÷v<2ãa¬=<…ŽMÐR8¾†g(X)’®¼Ø᩼™ˆ„$ÂZxämõD„UÀ¿ðMm3\¯hÀ;Oš’äú#%E‚³¾Jêá—jà@›i¤µQ»—œ¥Â¤^ˆG<´¤œï‘±†ä +öê2)*‚ÏÂ}E§k†èÅ¿,Ÿ&Er»–ï>¬XÒL!8úkÔÊ4fí 7Ë&E`XFŸdëˆ3 +*#͘#žõ¹é=8‰T5íK¢& hÇš›nQ•j1¼WÞÐ9îtÅB€=¿âzx)ž†©™~à +%…á‚°JûßEÙ¤@<Ê%œ u° ’€øclŽ4¸'R‚sфÜ\‚·$6ó——˜ø¾8‹ªól챞H`-)âGûò&›¢c¶X¼äKz@5¨»™ŠÄ\l…1»Fµ­l„ç€I·Í³œ 5³JN9ùÇ7ý( ?Ÿz6Ð×J‘ýæ ŽÇ>RÜÆ¡‡„E³R2:Êgïe¸Ü›!‘ÜÜb–¢ ÁœÒ@VÁ¾…ýbNoxÕ[¹ÃùüU÷Þð G Iñ`ì=UŠJRp‘Ÿ ’¯„ÅU™ PcU±MµÚ z…ùºïiî˜H+,+Ï-ðÚºü$ˆ¢žU§Ëj\ˆÀ¥¨'„°Xeˆš âærŠõ`J”½ôLp¸ÍU½\?\ŠÜ/ˆŽ©%&àDH7š3 N.E0m§åìÎ÷5 ¨§¬¦—èÇ4¹[Ê8=&Öæd—¸>Þ|ª;ïš +{Ãvþ³‡„ÒâÑ5ʯ7tîIö²j„W¯ÁøI™Q"„!þüf‚àÆáü <# )Yëiˆœ©z|8Ö|ƒA\@̖×’N*2åÁ¨qñ¤¶ÎÀ‡´Z,ò ԕŒ¼´‘dµ\ÁvY=Bþ¸Bü9;_ŸÑ ¨ºÖ/겜˜R™NdçèµÈ™/ô-LÑdëwPÌ{@ ¨fäa†¶¸ï‹§¯žZ›š53S­ÌbŠŠç¨»CQ¶fv²Q7j%]ÞÇ Äºõ§² žAs÷¿Y»ìoa£ªŸŠ Kª¨G< pÂøaiyqŒfçÆq<ý!Ãf@;Â-æ}ƒã2Eã Ñèb¦H€§ †Øñl´ÇÞ ˜ÌæA9E2Çé;TÉ¥ÔU™.tNlËé¨eRӇ SYƒ%‡%N²ðš¢jqzÁ:_܌~ +ñÐVEròòŠC +cԈÜ2|ÚÛܺBFáaóèé,„™ â4ó.dŠ ¯°…ßL¶x?Îâ<Õ;¤eŒë¢mpÌmový½A=Sß¾—ù¥Éúîb*U#Ú)¥ftKXVPjN;Б»†YÖ]W“Uƒ)ÿ ȹ£1d‰=¾ ¢BNc]ÕI“*†iµs¨°$’µ†‚ÙCñ¦Q³PÑ/¦P^kD¼·¤'sŽÜS„n ¤¤7’‚–µ½5ݳP»5 ø§Sk 6}¿Õ $žà'öXQÓöIŠNNtú´øòé/A•T4s{÷äo3®>œÇS´¡Chð´ ¤}{§i^ü,Ê6r'¿Sª¿/ÆN… +·Ö‰Ù™¥N!Ý]“÷æ:ísG$l >ñ¶(Û¦uA9Áz*f»ErÓ—Êž8õÍ*Eû’€S¹h"ÿö(ÁÂ˦U»þ°iõ’3wMã‹BÁšD¼%÷ ç¡âÛeÑÄü±^¥ë¢ çe4Õ5“õ”`s&’6ª™T?j3e½¬e²Äªð”é§ó‘L‹–É2µ+Tôî˜ØùoÄ<º9cêÈemî'©;ˆ! ddï%pî\ï"Kæ FãH*؁»b²ïŠ—²ïØûo—nEÉt©Vڜ\R“”—ÒÊÕMwKÏê‚[ÂÜëj‰"™´$0K|yº’4L„)¬*,%l¸[¥P^N•¦ÙQ¿T’ô“C%cԕ‹ m&éÎ <æ*‘îä9éM‰YiöIY]T£VTÁÁ:’úY:˜ê–çúϬ?ùΔ OÙÒGm?M㣕]¤¼Ê#a›É×ù펞ƒU…`G•óiBÀu”5¼X£ÂJ§jöFeLº¬£E ÷ßfd²9¯ $ P MÃà`ÙÖRp ¦à6®‘¶!ìO. )QeMl¥ ©î‰Òä¼=)ÿxWàèS"bƒm¨pï{‹çÔÈ4!¦¦2ME:UY\ftJböÂAðÙ¦0¹cüÈi†Àh)r®ø5ë­ë8ÛÈ:Wa(ZQÿ$jæ+´Úò"W’Í°CŽf 7rӕçì ¬4åZê©Z/;ݾ×ÿ©3[+zw°øü?’a2זN&%ª“ª4“•¢Ð?Uf†°PèUW´jgj2\ÚË*¢ìfOú”²wàµ-ôL[¢gï†þàÅÒ¾¢ÇåmŸ&eRηS|‰8DŽô'{ýӗÿV°Ë²Ëb§K9¸½ooc]2L"?n»¿ü3˜îz>é~AÙÍ;eðG½±mvf€¨¢Veó FY(õÜfÒ²|rdõŸ¿ þÕÐþ>êuW{¤¾ã¸€1tD[]?+ó ½ã*SPÙGITÁ¼v¤¿t’ßØãÔ&‘<êKʶ¡Ð[¹‡1Ιڙq±^¶83èš&tŠlˆ¸×3´'®¿,^ÍGv¯ÞËÇ?ƒœ$‚BV;ä%Ã2±.çUґ”ùöc©B¼‹éˆÆÉ?8œyåG¢J4òyñ%ênù*fûaP|î÷ÞÜ­xoµ/‰ï±ã€‡î²J1yð°_5s*]eQ ¦öj?­¼©ècç(c{œ¦™€/xø•1L‰L4Éê!‘ÿyë?Úì,mñY¸Ò-íh±,EãVòàLJ¢–Œâ ÞÆr§µ€¨4]8ôä¿%FkG¿M÷e*¢Õz™:ÓNK°¦³sÚ­øyŒÛðr¬o'꼏2rë„=™÷˜xAa ÿÀl>^q°Á4 ˜®#xŸ,ô0ü±9xò^eú#r¿ûÒRœ iÄp¨Ô6{ö®‰áú‹/¶<¦WìñL^šú1 öÆ·ˆÔ¦ª¡·AÏE§,CŠÎ=ÌþqQ=7ƒ…æ`™-¢¤õËë2ò= C›Rxa«J±.µòŸ1 5a9ÔãÇ°vÔdèãs6:PÚ½‰Èבð¹=ª+@ñRšAƒ?­r ʬ_:;Yè¨ú HuœÊ4VɪYjŠ[„â¬,"ßuç¹$LÒ/u ˜¹D‰Oõ»ƒ‹„«ÉAè®ôn„÷ú™‹16(Б.¶xzè­iáY1µ_ƒ–hœýÇ¿Œ•xIvÝ°ìñò˜™cÍpÌθˆB)€Z‚éüÚ뎼Ü+œ̱R'DQ”€Ž>žuÁ­ÿ[;„…ÌQþ¦‡ ) u­Z/Õ{Å£ÁpþƒÓ°ìÒÀ‚S©ÎÛÜs¶˜‘œ¦(N<){RÁ5ìì$±ðÍTÛ®&uèU3ò¯jú‹A ‘™ªW˜âĽi~ý ¯XšŸeBÒ왱Q’Q†miSX̽˜Â;š:43ø—÷ Id>Òôöƒ.ºÜsùŸ)µ¯¯Ù{&va>èïL“ϙԴ\™È"sj檤~I[n# ¢©;ÓcI¸d¾Ã*ó™¿:ú×!dR‹æ[‚ú˜¹CÎ!õÅô3µóX€Pš™˜!eÏÀèöˆÉü"!&?„uÇqväðpä ³cŸÄŽ‡hn'L»Î½ûî`ÖWöôˆM3²ÛØW‚I°Íµjô—/o¯°¢ûܯ¶Ö yßË5¥Z/¿Õ3õ¼œ×ό+·—u¢ì¢¾KzÚN}ír_•e"éò˜`”ħ\ÞR†HáÆ%53.cß·ô¸‡ÇÓ+ AcìñG©'qœO1ÓYu~l–C÷?xÓÎ@³qT!°£óúEÙ¨Ówx“äñ±ÎqÇ2ºÂö +ÉÎýñK †mXxiãì×;š‚ÛýJGb¸J1¨±f­¸:“sÔ+7JªAQTL_ @ !4eTfä递HC {¥§ÐV8)ݯ;Tʖí£ì‹8¹³Çº¦#Ç@¯•LÌ-þâÀŬ¬—X9¯ÿÈ~\*»‚AA•SîXø2†o;dýµ^¼|n¿!ý—ÂÙ]¼n3$&Ó é·&×)õ‰Þ,H!ò/¬ÑŒÕñ–§@Nß±«ôÕqö‰\¤$ïô‚Ál­F¿²ô/ —"M@¢Lø&«” +[2„äìÎÿØgYÏõ†zýñø—ˆY‹ñÄv¸/69ÅïTÞìjÀ„§–¡9Tóø[ý>ÒáÇÓ®õQU\ø ÏG³÷YüßeeÇ#çŸN¬ÖöþŽAÈNw¼.}"aÂÏí(ÜS¸ÇÓqwX»Û ¸úÖ¤55Í+DÇ~Å";ßfþçˆmÂ6Çî ée›˜çmòe®‹6èx»Œ¯ +Ë–Û²¯¿8†%õ ÇgOëà¯ÿ¿‘ «À!ڈúÞö˱Ç9®ë-÷RË[ÀA’â­qm\žÐ›7iå›4S‘y?‘A¥ñ÷ƒqå…8yB*/t“ƒ‚AÛE>L:¤äדëbA9žÊ_F%VçU»¥¢&A­w^5s)uôRÙÝ<â'Æ@JxÌ=ŒVªÏ¸0*GJŒÙjMÿüœ:ì/ډÜI F„MçDŸmŒp´¦E_$%¢SZ=õdÎ0ï4Z¶Fô*^° ÚæL‰U.¶¨GŽêÑþÒe˜w* >:ÐãŠÌ+(w•&cHduV\*oùÎ:1=².=Wô³­¼'8=ßãìt!áÐЉD)ÏXh8Eñò Fƒ3%%7 GˆâÁ“Œ Š¿eK/˜£â=¸Kò@ƒ,öŽêà«ÈÙBêâ8–9|t5O:š«s.>7)œƒ~!Î<ìÖWã³ÇíQHFG´AÐ~,s‚}nügÂ3n© dŸ¸!ÓhŸîŸâE©ŸÞiZ ¢VRéïP³Â`.Îê1ÙÊWtDâ)ýÔäZ¾,ãvdºfxÌÛĈ‰š¹LJa' Nf5 +º@f›pôp“cy‡~þ‚)i9kVhh ™»C„.ë3H:Q#v‡ w6ëðW‘.õr¤nú<ðf°¦+^/¹çaг¯Qƒ¿-áa#¼§åâ»ÂTQÊ 9n‡Àã–Èì¼ÿ†<ô:¿Éš£Cwû›\Ú¶¾øÜãµí׏5qµ•:œ mâÅq?ÎØ_;ŸKžpúƺ¨GËÜ¡A\mü(GÒ隦J²u:w˜Z§eæÖnÕ¨Ç]´;;¨ ÃâªûB§p¡K÷̝éí™VÕڐŸ¦”ãÚaRھǔ´³æ†¢ÇЁϚu7;“Û9Þ«m8kÑ ôÍK¯Gg}ûÐu]ɝ¡ëਟ»%°1—»…v9 O kUvx(m»ç}®‡#î|v`…ñ¿p.Àô[DzE8Ýp x;«š$ё3ê.x¦5ÄÙÉ΄ëF6¨t>Z°Œt2½o³§øvGj«Úüª*èQP ¦¸Gǝ4¯Ü†±2G6;ì’ÍÒüïÌҔÊøôæGB†oœkhû›¯g~Çå:'ÒȲëéä…&RÖaBR0ºˆÇVŒ“¦Á GdÀKà„â*»ŒSøª2u§O+Q8ÆJ.Ðx€ÇA+¹Ã@£è#‹¤ìûƒ²JeuîS¼éjócaªñÅ8,‘G§w&É`Ÿ;~»Z{8þ(£¯+TIÊ×°¯Ä˜Êæ”!ŒdùêÚyÙ@b¯e˜re.²*‘9O˜Ë‡‰ +–1Ž” Fý2#=&w1æ˜> mJ­ïIð×D‡“5þ?ù3…CN¿Í÷eu*~šª¾V»c U0øh¥ãPÞ£Í{™¿§r ÁåXþµ ¥1r…J]Nދ„|˜¶œk‹Dˆy'9DÔ‘%[]°[ržÇßÂQÁ [•ÿ8ëëxïD±ÑQJV™㏪0°tJhØ“Ƈ‚Y{iE+¼²8b„óÍrHkêZÚñÇ!AZV¦Úâ”â<) ¨üQ‹SýH¡ÈÒ{ý5úpP37$ņ„…(K×o±b‘þ ‰Ë|nŽr}6¬rçSB,[0ąÆÁíïþû^šk³ê €kN»i[ÄT=æn'MûvËƕ¦kÑJƒÞã­Áñ<‡Ò„…)M2¨é-Xb§P/þ®?‚Ù[¼<ʸ¼FM¦F\␧æ`­Ä!Â#n0Ø¡ßi#qøRš…PºmW.,¤2†òü/î!]’+Zj‡ ZT)fYÇ}àA/Ï®™ h9ñŸóy.‰ª”.4ßB“;ÉÂ$’§¨\ç‡Î¦ U°¾ûªÖ9pyõNpSjôÓÚ¿p0ò|Z…€ +‡*‡ÊëXi9± +†Í±Ãÿ²W„CRWõOmo]Áz$Á.·¬Rå?¾ÒИî ÈãÈÏ©±?0.¥ê¶G³ñ4PKùXI´S¦ÿðEŽ'ðÿ›†a"«cý\%$z™ÒT8‹}@P,e^}çËÃO-ƒ\tN£ ýC Y-ÝqÒÿ«_Çw0¹çªOU$¬o—ÜVÿcíܐâs1¯'¨öoïŽ\£×îò Zz¹Ç*¢C§”jW²$o¿Iƒ´q`iC WÔ0`NÕAAçöL™ à}F Ö—l¹$›c` 景µªu +~gLÀ© †w[lOÒVá0º7ÊšQªÁUy1†âÆ^Hn`oQE”R>Ÿl;Ÿâ~½¡êwj·*V1û ܖJyc5ÿ'Š§{:_^:ž÷²ä*qfÑ1ވ&iŒÐÆDmûAd×+9€žŽ²¢i7dJݜ(¼ï8|ŠºbUóÐuCJÉ5—Å­vк¡ó¹²rݬAz–G]ÎK÷$æËŒJb’1}yiÎQ{¼/²8D7©†ÚÓ|é´xα)kyð"Ç@,ÓþC¬°(ŒXøƒ¿¬‘qÔ‘‰÷á j>A=¢e_!áŒLJéæêF@tJGÂÑUŽÔR<3–¼Ï.Äü(ckvMà—ý)§\‹á v2$çî埋²,é{å«x54*%úg±Í^›0çì¹¾ +íO›¨0Lpj±u`Ž6éc È.:b—â\%ÇcN‚0*[+|‘ ʦ[±ýê–îüƬzÅx$®”±3£X…À9¼;¿íwŽ°ÌìٜŸí!À-®¢ZgLÚç꘷bÜ:¬ +]Ø ™Æ“â¦FCu&à-"u²œ« +ٞ6ÚTW^Ço^`OpƒÐÝÓþ„*}lΎé '¦Ü£% MFp–{ŸH“–êÀfJ;äU·Âˆrh¨p,ÒHєÁŒ :8fŽê€,ê59S?uƒþ+{¦G)Á¥Ïù¢·ò(q¶ÇÉØÞj¬ÙÏÐ>²6۹طý \C„](e†ºÎd:ˆÐåã-Eæ4<þ˜Rövo (U˜u10å"‰ùœ r“úÞÃ(Úéj…ÉÊ_ÕÁœèûd`l1bˆ¯ýËhÛBXœèK&CVìÅrl!›—Á6- }RäÏw™Yû© >˜ ²ô;§ªv–uÑ·T–(ǍܑY'úfY’SбˆêF“Ëâ™ÅãÈΊDY5˜Ü,ԕ¬QÊ P‰£3“r%Jéž¡)El.ˆA§yFšŽ!Jfþ ­K#CöYþ’M+痜¢Àۛã¯f¨Ö‰Õvbb«Â̂p/Þy}[ Ô·‘úâÑ2y›ñ´J-ô1X’NÊg#†x§ìl¼¯ä&%‹x û€eL†Œ¨N4"q9. ŒQWÎ)À‚6Ž'ßm\ðºÝjÖLœ‡[­91X¸`!´ü>ùþÂpÄ]D?¦ŸYe€{ۃòdBjû`Pi߬siº_øÕ¿F +ËMª‹†Á[ç0R5œÖ\` Ê觋d¸9÷J¢t!!Õ¬ç=Ã?ϵeµO¡fË:ˆ‹v‘n!ÿ䪐tí‘Ā-ê¶Ó¯j]ÿ¾ÿu{¼¦Ð†PMð@hÐ1° a +ÇÒÿ¥Pf÷•‹k؍@¿8 @:ºh š[bI̐s™©¹i*®Q +‹FESϏìFNhՐ^: _8V)$†ôè¤!‹Áz!¤ÍR<·ô_îֈ ¶C~‰™#Ç,ªÜsØÜ +I%—ìó ²tÍVHÊ:ùÖ&Q¿” 'ú¢ò½Ò{Pª)֛Hít ¶-J‚š9¨)B}@ë$"Ñ +‰Pã …ÌDX'çVßv/1óR2:Í9H¤E¡®ÂRÿêÅÔî²Æ#<7Ú§”/¡Ô +™äQ­pນP“ÙÊï‘õ[ƒ> fýVH÷RéðnßjÕ&,¢?ò~ôZ!‘ŸŠã0ÐÚ&–ÿ®ZøX\+tôÚìàMHêçf­P0ø¢Ì©-T+4õEéU ÿ€“Z¡ï}¤~úêœç +ùü¶ ø€°oˆ+¦òØ+ù`êó֖ˀØ[èoqÅ*^—Í™Ê_Y\± +F$™þ%,’+PË·_¦ç’õè ãù +֤ʩÒ&B-›ï•lµÿò—ƒ<¦=ì‰e)[*ÀëñŸƒÄԇÌF(«"}´ªk *+£û‡ðöñ©La:¢L׳|Í ¢#U/v¢F.¹Vå8g›xÔµ’ÔŸô I¿2SO U&~gLaÔÎў Uð÷ä +ðï ÒÓïA‹Ç5†N0¯2`Ça¡òp易…ÊãKÿM"Ä[ɦ£¥qoÁP{üq:ÒÿSàØ×v! ÁÜÞ¶kð®ÙöSÖ$÷è¢'|›zBTÀ_PÙ¡H™T¥(îN­(ƒX¹7P-g£44 ŠHÍtfFdh~ 3“ƒ¤4ƒ89çl¸kxí¶×0y¬Q¡N{׀Ι +]:]‚ DŤk°sGdÏg"•$Ž(‘DÄä¯M ô=ЭÌa×¾_±ð¦FWóMQBÂRi¤iQ’0Q‡8$qT¢ 5„Á­^ÏѪçœ\ä5ÂOyÍuFd’:ÚkbåÝ^ËÂZì¥}¬AÐ+9‰éŒX´\.§kÝs §*ã¬QTUU®å$šX +±h»=uÙvå£iËUì†õ5oèÊ2Í +Jèf&}y†vF/è Zžz  -¨ÎY”B 2•õ†zëÊêUo¨z^‰×÷}ãßsüË¿ùr‘B&'Kÿþà•vgßõÞ΋Ãc•*j›4rêÀˆUôæHœÊŸïšY톙™™™o–fb6gfgwfgí]ŸfwÏ;«aT + U˜‡6""bh""bh"­ÜDÒ"*ŠÌÌ5¤hCõW«N·}ÿ~àÛöýÿÿÿçøÿú}ß÷m6[šÙƌÌf³Íî™mfãûÝÙwgŸ}n8Ÿñ|'4HŠ¥0Ú蔆bñ‘Ñ "óÎXÎ:¯ÝµBÚþLû×}_zß¿}û†Àµ""""""2zˆˆª.õõz½ T¨Ä|Þ3 ¢`@‹C2M!÷:2 +d",7œŸs YG„´ÍÀ‡ÈᎇBWÉÅè€Z‹þ+÷ +R—LUÀc%ìj‰$nÐÀüÂK£,H~ýúQ„ïyÛ¸|Lìˆþ Ÿx¾žóáƕLN¸ +è(€€›”ÀDýKd{.œa{Lƒàû³YYׂø¨çSr3Ȧø£IùhV +Ö¦‘}gWÈG$þ¨[אúð¿[Ôâv¢$ÀüGíæâ©f7,Ö|­öoÈʓF]XÒÖkQ›RhÛ ¼šŽdÎ7Ì4FÍôÒn8›Y#ÄÅ*٠锟S X5ã² ÓorŸ¤\þàdiDiÃwAÛjšâ >m°µaTLGWÀÅÌ2¿6Vq&ß.2Ž_†t<`ˆRý2ÍûHÅñœÉÖÛÙñzTÈ °~Çm~Ÿ%"© ­í41Œ´Ü„ꈴ :žp0îâê1ªôLàQ ¸£?ɃLˆŽC-¢/µ«rJ w쪦`H€Û”MOâ£@ÓÖ*4¨‘„G¬ 4Ùo”b¡º‚¦evèÙƒ&ˆ6y½@O¢BÓ:u » Á]ûyv2P×ô’óäuˆ( ºîšš GGçLÕ%|æ•|-v‡&Ù*æì„AFHÍS–éÄÝû_(XNՒLÈGnDÐR&&MLû1;M–1H=(hÊsí¨ƒ&#ÊxZŠ£04©=`°»)”ÍöÜ!#ïD†s>a¶@彘‡'߯uò‘\r‹2àՀ¦Õ¬­× ¥A ©Î2“J"¹Ù@úÊ ¿¥íÊôjDR·±­†Íjä%‰€¥ÆÉƐVÔNœžé‹a¢íüÞ xúGG䮽pý‰>ÆŸÔ è*ÆÃ]sv?OÌãºó3/ +3â=·ÿù—ÀƒtlS>&=pøp±ü‘ZºÿM«Åñ¾=AµìÂԑ¦±N¬e&»ª¢žê\€¦¥¹1-$išq6 S¡!ð\`ˆ£°õbÈ8í…7Ðqù]/ Þ7 +Cp¥mÃ×K2ê%žÀ‚³ g›lô¿‘•ÞFªjj"ƒxÖÇ}K¨ ^y=+ÍÂܨ£Aàxºk¶-{ýB÷PÁn°W%~GIªaú€Kó†{`‚ËØà~Kín°Û9Ãó©’[u¸ íµ,['2,i£qsÍV¼bf'Äãù”oäƒï)ÉüYÛ¡°[Š?ڝ8™À-ÆM=´B8–m‡îəÉDïôNxhùþŸ!Ȕ­]L róÜ8 G¦&^dϸ_ök¿H_$ .zaÿ W` øxDx;´˜ŸAº~¦Œ «”¸ç!¯%à1¾ù¡)l‘䪡¡u¹ÇŽ Å”í¡¢üÜþ6~ü3)¤.­eë+SÓ²EQÓxZƉ‚h1¡‚f£2·>s¨er-Vjü!ä®Ã"ñ­&–è-çNeÕ³K/ØAdMìœÎš^֜®¤+[G¬A^//ÆW@£reÓêuŸÙʼnDˆi YÆ!$ÙôÃ&Í<»@jp4ÊR]ŠD(ºf-û†ÅurÍH#+ vù!ä!M¤B9òÔt$\EîÝeüÞû +[ÞQÕ)±(QJoÐ8¾+Fœê¿FV‰{ÜîŒ|ÜÁ髱!‹:=©z¨ꙏY"²EáºsBTôǀQc™SP,„GSRÅ.^CVDºÖL:§Ã0éß5kvßF£ûc õwZ[ÝUÇõèì¸B§5ÛDRAÏ®éüïàÞòUÑÑhÖÒaáaÜKgÝ,h(•+›}¡ˆÅ-BÇàÉÅQIR— »2„dSw;xɀ¾:›Â ›PO~8ÆÒO©‘G5A |›KëKY%`ThÛKÕHæX,â ÿâ(ìT±ØL¬¼æFPÂrGÉzIÆZ‚_ + “‰M‹i±MÉhv)V£W³ÏY—{W!¼ÃÿÁ)¨Ü³ƒñ×ü| äø˜ve?áH†kBrM"iٗR󄦖Á~ä*áÿäÍRƒí±Á«eÓÃ÷½lZ”$îã(áËò’=‘²î½'”ð²bª&ܼAɱËù–| +Á‡(ptے-É;/ ¯¿iXÔÂßÍEŠ™ûå<‡‘œO å{­Û“GTα¿ã‡Ým‚$S̃¹¾øÜ +÷û²±)GæµÎP0íû>UªÁG¦Ì3ýæ‹ÿ~1‡¾­½ûMYó6m¨+5„¿’ý[#¢õÓáf‡­ðÀ:eĝk~'’Äz)ž}½H;¶’ç"z%¼‚WìÁÛ¬t~»‡d!«´¯ÔO<:”Ç}vÄÂÊß®¶ê°ÊªßJ3Ëà%H º2jCÚ/N†ó‚Nà ÏÇ'½åÓESO—*Yô/Œz +ʊ¨Ùð•5^v†%ÿÖ~.ì‚Œ4ôEWW©Ê’–i“*Y¸3彜ø(‹‹»X²0S‚ONWá&Ñg=Lט›&ý<(gÒ(JÙ$AjŒ¯‰òïã&˜b‚>Äà”LºT)pÐËñø“­˜¶ÉMÃêNǐ•fD¬ðƒ³¿5¡ˆm\J\Õ@æp‰3!©ÈeFóÍ%ñ Žd4ïxÝxtÂìX9_”§!´Ù+æì¿è™2xD/†bÆðMUGŽ«re^ån’”æ‡Î•?»›ZÌÈ ÜӐ,bÅwMȐOÇèæ/‹«Üð,Ñð8c,Ê/}Ç7ÅXvÉWn*UJrn\$ìcm¦1¼©ìÀ¤ì°qÈáMò´ãŒatãM0a_ ŒDm:xk¨ñ û^ÿãE#Œ6 ¾è¿@Np¡r“+/ïšEETõ¡¢œ»è̤ß5⨱aׂt…ÅÁiï ²%ôˆO{“u€po*7–°‘*(*ˆœúNý¦lôÄá•:¤ìH¾‰ו«iÝ# Üs&p±ßôñUôbs繉~æ1nÁÚMî| Åo­èeOC²/oÉÌÎqõE©a¨kÄæ&a³f]Bz¢[R[ žp%736¢Aè}d̲ `D¶6d~Û Yé5–±4ÜÿáUÀõÑMxÿ‡2}íõ¤¾Xô¶]Ürª³%RCÁ·%¨á8¥&±}ð¨YI÷xh“ÏAsŽ¤$ždFtä(ù÷ ³3N@>ƒG3ð,Óº-{„ÿ–¦·\¿Öá7+º‹9 söek º›êHcÜxëì‡ #Ò¶dx†XãýÍ + šiœá"Y0ÿ3·ÌLQîtŽ^RòšV.Ïè§Lá(nøyB7Ešøҕƒy¦ä£I" ´oš06ÌT,[.¼²ðŸª¯œèçfÎkח€p6XïGKìx°{{˜xœ(Ò`´0ù'7ÙFÈ%eʪÃÙ®ßUünú…ªÖnaì´ÄaÜóím^6@‘d¥²××vT~—Ö»“´ªz~L¿ù6‘­>âÌ®™2Ó3z$#¤Óª÷QıYbè<Ôÿµv2bÚ©lÔ¨OŒU1éÛü…Ž8ÅÔ¨@7,?œ¼¯€Š\ð¢+•¡‘huÄ1‚BØÐ{n²EBÄ6\K…Û·ǚ“‘i/ю{5P¥‹Anh9¸XŠŒþ‚gö‰C÷Dá¢éÕZ§\ôî»þ(H(_$­œP`Š‹ì95£9æ˜PÜOAΙÌä~LãàùŸqTè7âRIß©͑òRIp7ì`ží¾&Ç2•H­mœnv–V= 2R¦ú2úldG€@w„pÚ¶f™ÿ_wKÑÁ~¬Ï̗ÒæRÆEPÖÓOšB¬Ä@lfk­JÞa*Ɔ«åa¬¥Ò2 ¥ \£Ô°=9êA M'‰:ú‚>I õ¯=ȀMÍe^«¤ízfþ :"Ù/;Œ2l#–SHp0¾5D=Ôk¡Eû8ñQXHS/Ý2  Š±’dv`oJqÓçY‰ÓQŸjðMüi`x:ÈÆ<!€–&;ìW‡-d5‚ÚŸØáRÖ~9ïÐh3²ÃEÖ ²”Öø yçe®ÄçD¿îDþ÷{Vægø^=J6w Í,Ý¿âlNFð\ÈÐ^ ®c\}ԗl>cIr´å!¡Ït‡£³Ÿ2¥µÚÑ´à ÍIЦsÑ&Z •t»êˆFû÷s„³}b¸ ´åÌÄ1d³¨r¾ô˜0靚Ume ˆ?ôi>kvöé2j›x߬f½IáCbˆèe*tÙ®"–ÔLØ|¥+xîü5Èø­#)°WoÍQ-¼'•9kÖõEå4süÛT `VÿïYeڕF†¬˜E´cƒ„;>F-{”u³´¸xZ´ŠóÍd2¶Å»ã_«’ ôÍ× ¼ï°:¼?2Hû%,ô ++ëbd«Ê!\LnaÒÀ¡è£D3ÊC+}‘3-³×Ô ›-dòFeÕqN|éñXѴȃѬ›Ù$ŠQäG^ªö‹oüØΤ ³KÍ~AmFA¼JÆà‡­…vÙʦ*ōƧ9šb¤¶œ£0ªIu{cp”¤¼fò€a6ÇüÍZèà…ŒÐù¬‹Y +ßJ@¦â€z}–R™QfH·,‹øƒ2yӅAüµ kr¹P¼lEWõ˜°•Ó¡XŽŸqaÖq{õf“ûÀ#4—‚“χ–f æi¨Õ¸4¤°’ù5PŠË¢’G“•H袌?eýðÑ·^#j@vhæeî*)bL¾ŸsÄzG)f»Q–’îR§<»aéA +и˜ßUà’ت+Žâ,¾DrP_UÑÀM-”®š¯Qw9®ãz->ų`Ž†è#¯„¬ðȀËîI)õÿ\@ë + â:µö*ðE®E}}aÃð£êñsÒ.Õ®âJÖ­ý.ó"P±+Í®m’ÐÔ²šæA‰Â‘™£¥Â©ê½I®rp6 8Ü"ÐË¢wŽ$ù..*£(É·êÆ䕤3:GrõZ]" ²Û G0ºŽñf#(VAQ7¸>KòÄô7¹»È!.$ã·§åÍýqŠ}‚Î÷€Í)PDàGŸkÛ7Eº³å¦R“ãe4œÕÕďágžêò2ɖ;ÍÂË˨üsR…ÑQŽl‰LÔ~£y´Ý +ªSr %”È1pèõûTPüWCp¸j¡]ہ~Zä»kϝV•w?òÂÂ8–lžaÏ0l’ˆ3Ì ¡'q§€ÏIåwDzS=¼I’¬›"ç¢')BµýQpp”sà ϕøSPyDð¯.” +²¾£»ÕæÇ$®¨6Œ†vPر¢iƒ\éÖA9KL\NZ¢îVnE䁲óIgeóœwqc‚"ù¡n¯ÕŸ‡FÝÉñ®#Éàâd?ÆÒ؟ªà¦º3ˆÎáHÆBc\m¡˜l‰Â­ámK£9$‡ÕŒ² ƒ¯ÊÐ#ô¢A1È,õšQ‡Wë!}¯†­‚4íÑ!†i wk.˜9ߝ‘qõ@YPV4ãc‹·èiˆð6œò `Ä8¨ù“Œp¦gM§ œ>È~Za3úR9çÇõ~¶l*•ï”jáÀüW»e杫|©ƒ“+s»ÕDÙ[ãF³rr¹:ðZ‰¢$}\Ý|ÿÉ;´Ï5®Âžmº¸JU.z4qŒ=ÙÊ †ÇŠïf'ëRèaÖéJ§ŠïIéÔ­òzÍ"ðÒÛ·}¯É´Õó(,:ˆ„‡Bý‡ù  +([`p"²J;ŠœW mlµçÂSn ð†ÖžÕ@„"¿‘ (¯Ù]4'Éþ›§¤€¹w…çM+ˆ¥d8QIR 8i…Ý0³Èl&¹ýIÆmA¡Â>ZmJa­¦1͖¶j:tm[ÐÊäÃu”…;ÎÌ·ŠÑƬr݁éËJfvìîðÎè³eÕÝ®ÎkGí¤³²Z@ñ2O ‹¼CV„&à«–…;Vî­YÜeñd—±2.²²3^¬H\°bÕlµîcbU±fímæäecVºLÂq¼pšË’lX!£Ð§xtVÚкE™nÅY=àÓ¤R¹=O²÷UoZF¾*l…îU`<ñªS¯¯Šßož[’ï¼ +˜­òñª<0\¦¢q~W…*}kW%–*(p¡ÙHWµãçç*ê5zé=÷òÚUtü àÉ<¤ëœú|¶êf +™ÏÛï³NãZEÛ©Qy,‰jU½JÎ&ê\-¹¤ÇiU·¨žÑªH›¿‹š=­ªHæ#ÃtHО« D*bþÒè`U…EýUݓW/S¯pUyª•™žÒ‘ܧˆBxí:›WâÞªª¸Ÿ¥šØ¦1ʂ¨Ì©*iZ(D¨ŠÏÔl5ŸVvT¶Ÿªçåm}ö]óèûSïÞN ãÀ)\¬ÜOå_®jÝüÔõÙ™f²«ê¬L àûz/ i›‚)TŸêΛ`¡À„›K¦õ”´r +1Ó^?§K¥ƒÄ9=UšI£!<&ÎSaËS(OÕ±6Ìϼ§¶cnRj;•‹<Ç:§CvJeÎùaCšMFNo\§ÖÌ,@„‹7ŒÞªTv¦Å)p´øN¥Ÿ†cB^¡m”ZÏžZ`8æ¦4BaÒ·)Ì+«MYŸ˜ÙlÊ[µcSµæI§Î!¡Õаª[Sþ›:Ú3ð{^MIWLñ _îÁ˜ûíSSæ±uÖÛ¬I<¿Èhn…LfJ©òÎ^¦À†mS™JùzßÉ"e2Œ#S dP8Ë¢ìÅS¨ºNL坦íaªd0½ S©[væœúÁ»º=ñ˃ÀÔ-iŠ/R¨”;!R?[dÞhöw)õ]{ÌQ]—ÚhÍôs©º‘§(ûj t¾¥¤ê1hKä‚^òöµ8Z 覥ÄÙ ¤B«ž¥z‹fEþ¨U‡RURÅ°Ôv¨ýJ±sÇ,(¤œFWJ¨™BußG[)˜Ú•ÚN£ìUª•J«RoâO¥âèR/ŸËPJ‰ëRO %óÇH^ŸÑWÀ”¾XôF)€ôHeáò'•…ÊžÔöUº“âé¿×{‡Òñ¨+C¥Ê‘hלIåżn;&%¥F‚Hÿ|‘-“¾¤ìçޒbÎس’òèÇÊ"%Uø$j¢ÝH¡ÖZ0”‘Òiç~u'_¤Þ_¨\Y„ã”f¸¨ƒS^H<²0WsŽ ©»¢œ¡1zû¾£y ¡ +Pmªe»É<Y2 õöÐôL™ê”E(K¯©ÇŠ×>PώþAÅg)QÊ)ûB÷·œ (×Å)%2ÚZXA‘PØþ´vSAv +êriԍŽ¹ ^]uÙú• rŽRV;^ó” qûcþIóÔ3¤ï@å‹ÿkt6P¦ZƒœI² (ör©~•ùçæ L@}ßS,oLÎD&Z×ãñŸûO³“ÊSy‘§“¾uöþéžÛƸ/PNƒ1!òûÓfŒaõ§Ç©—LŽø•‚ÆŸøK òû «´Ÿ¨O¾~:=›ìª¥Ùþ"éÓOfþ|Iâóm,ùËOз¤'¦&Fð(I{RlªOfüStú$<ʓ¢Oßî­D‹fOHñtv‰ò®âÆ&Ÿ39íñéît®¦@|§=:–9×¥ÑßÈϾҫ÷DuŒÊš@r0iw÷D›Ûdö±£¼_7÷䚽½=õ#¯=ñ4gO§ÕǞ¶Ûsdø$Bnô$ž¬¡'ʂF2SƟ§Ÿ—„ˆvšâ÷!˜êÿQ“:O—²Þ<Åá:Î< o‹ãÈà&¡8ÝãÉG21¥œ'ýÔäÂâéþãȉ§ã%G °ðd‰MÊ Ö¨ž¶1ÁD³ýwê•ÎÎ}§s™RiއïÊR:²kcpq¹§)i§ngÓmÚG.í”+õÎNP‡ ͬ &•6œ;vªª¤ÃN÷ãù:ÙNÕuzËÙÖ)õPˆ“öôbn;їNžk§ÚM:p„ ǟx"×{&'ˆò–Wƒ‚86¥%€?N þp^´rCÂÌØå6“þÑÁ†Ø]õ&Ëÿ[“q_^Ò·$‹):ðŒhÉê.Ö6ÚXJL@¶/å1l䴁+„œ„lƒ™!‘Ó>3 vœêí·qÊûl­¤à²‹¤T='ïìÙÄ tÍO1q"±T.ĸUØ'˜Þpš„ô §{B.á¤[`.=žw["kP’©àÔïá19å88o*ôœ„^E”IÖ&J·hü›®ÁÚÈ=Pßo¢2–I¼õÚS.Y¨êšs(Vƒ·›Î«TñºÉY#m¤›nALõwXt›¨ŠЀàgLkr®*ÃÚ6Ý[C§ôšÁ¶4E»Ý¦Ú”Z:ƒÓ¦à€×Ìt…@yÑh܌O÷l¢®zZ¸æ#l:.JÝû5Ñé¡Ì(ónh{MZ¼0ﮩYY3ä;Œ@"×$//QZ¾Ä£®óOâìaNzêŸÆ%x5f1,ß —3ÓnµPˆn˜çü´-VMæx8 èËê?Jõ—Ñî {Ch.#n<ÓDÚNÀLO…£K“1 +KŽŸXNU ÛÆu2bÝÅp?è~iJ/šz º…õ¹„rëhôzµv—êÁCÓýß«Ušîä¨à`€JöÅ#œK¼ÂôM¾Æã@.ŒÚ.¨£úgÒ~ ï3±Þ#uí¿¢ ¯£°$²µ #çm&¶:$8È4üf‘©F Âÿ*&Gj„]ÄuPé:3}{*™$l:H…bl¸RÀq•™î‚‡€0f2É"âdS–É^'ەÉä´ª2åøÀ6é1eª†ñîãó´G™’O`÷d’3 è&“òü8$A-™¨*‘“Ll«š¢® ÂUdb•J½ÍNh|Îi1º*î +xÏ5&iîÎqOʆ3&õ_JÐeúik¬èÄ£¹Ñ$SE}2K, Õ.2㜠+ú'¦ۍ41Ž¤âéƒ- 6Þgä9)c"± /ÃàØä) +PlbreØF é¡#É-}gƋN˜ÎÁTu„ÉE{{0Á³ï—ªáN7Bh°”3R„eÖ©¤@ëH¤w¦‹N’vÝ7IOW’Î$`–.—¤üD÷}©$Qc"¶@Ž™uHrø5SŒÄ:¤Ý& +ó9"=¬—ŸV©36¬îf„9y¤t>X$¦$¬#½'s$Ø¢*&t ž£Â.üqñrÈ·²Ç;øL]»LÄꘒH§üµ-OiÔ ˜zãÏÿ€š“Ç`ßHâ®Ó6†1 ¢šñ¢Õ9ý2e£KE;Æ g"ýÉ£Ûé Ôu5W«D}üp†0)° &œc5)áùg8Ó»dPtÆíHÛè”E0vchhfÃïP:P™*âpYè:­°›Ý­2¶%º™ÖÿҚ°R¯‡ÓødÒ睊ÂBÕY‘O×[V•':¯#Q)˜ˆDÏçÏ ëR ûa—÷ØÛÏZSÏ£Vҏ qMôa…Z=î¯(}º$ +ú?c(ñ“5dò¾HóQŠì¶XG +á=¾vžGOa‡dá%ËC éuç]ê2§ägWA"ðYy,;ÛÑs¥ö*tå«sEp‚2ý +5þ>õŽðL—ÄfÞ#FÓBäB?·*‰š"}‚ëçPÉIø É悔 @‡þ±‡Á(þǬ`tªÌîÈRà + ƒKá¸×t*iQf/Ð1[Gïh¦iÔ¤‰B¤hšn†3¸¤Ôú+‡ç䦃0”ÔI¼‡aI¡(`ö¨3ƒQ<¢ìÆÀuR¶Ø fÆw~ߊí Qsðv} P–—îזÎL)À¾ÈFü¶‚£û ±²¯hp¯êvSd_BMIûÝ€ƒÐõ™–à,ŸÑK֕¼'jeÿ—I©¡!:Ö6‰@óߊN ®¢@ù²f>zgaÈDçïÿ‰Š®ñ¶A¥-Ñ_âcüñbÛÒIä•BÏ`'¥©¸Ýõt®8ÂJh@×_ì2ö©¾×>å>ï­:EˆöPçÎ uÎ̳̎„òÊ ËÊmv$šÀ±à+þÊÄ!:Rj’Q“®©\—+‚âQ"…SÿVÍyäȦÈ]]9÷NF/Ʉx=~ó£bà™‡MbµÛÁ|āCM̼‹hƒšÿ+w8փ’€7ìM’ÎÑõÀ”­&€@ÊAÄ(h|Ðìäoáx“ˆ’ò=8‰ÅE%%¡Ò31ë‘\ôL:“MS¥àþ"`,ÆIA‘æø5gEìOçÛY£™ì²Ý§”Ý€—Ýñï­½^^&¸qª·%žèŽZñ[æŠ. ý5’_ß×ZÅ1a •Øjp±"ö±|Š&ëm~´2*”õ‚ºûŠÂDiSÖ¨§Pª¿ë#pS”tI²ŽR´‰»@œ}"?h— ‚u +mÒÌ"SQy¸`¤gàF¿êŽ“`0v?| / È(*ä ʅ«ß3Nýˆ2‰îّ^kîí%I›´Ð~Øruóº6adŒÚ¥ 叞ñ(eŒ#ˆü]Â>jŠ¾La®+"I ÙÍÒ,þ‰ºÂèé0z¿à +¹rr5‘C.Ě2txK™ìs«ðŒ|M(ÆÑ ßÛ„´\ys1&%!”FÍ°L\lj,î¡g)Zÿn-ÆûR9­Öæ81– v’ùn–äŽÇ×ðê /ӒÒ;4À!ë퀎Çh’ ¾OñZÁ1W6,º<ƒÛYÄÊ _ïêÓ²ñ·ýJùÄ'M~e‚ó¡}dØÒ»jJÓ÷‰pÊÇÉ»¸ü1{)\œcÃ.75ÇöÇï>ïÀöPbŠÌ sl6c'¶i×õ‘bæ–”¼Óá F8Lç]ô•Ý=ÉlTâc¨r¸á9ÿ;§Éƒó°F'8aåªøõW¥d±Ìó«±f¹É¹†ç9¯îš×H-Áˆ%½²5N;NÁ³š÷|Jàvþü¨Ÿ£2ɟʡ%¶ióÎ4é.èÇ6‰côÈ@ö@†ðªÄ´øВ8ˆ^§BSÎÿà +žå3we>‰bæ}Ñ'È%ðRÐ ogIöªßxâ^°Úù”ItéòÇOƒ™0M~Ü5Õm£*ðüB…bË>.mäʳ6ŒeÚÜR.¢‚ÝëôŸxf„ëÑ¿âNL³.ÄHÚ%@Û˯¥‹ÁÃ$ù¼JFÖ[¯€•?”؉Єó$Z§Ú[9Lsîb˜)’)Š“¹gU:´g—.¬îðçýPãó"tɑºÎZ,2·–þ±þ%hۂÐòyF"Kèôp`„F•J¢‰Íá8!P((ÿCVÁ´ÈÏ)9+5Uaá#/’šè×R$AÁ8A»„èöÊ°é‹ ÙŸ~.”µyf)ªS¹¾ª¤‚<õì.†2Uh ‡s6ìሢÓ+1[(¹ûޏŒXݯÿ%º&6AåƒY&j¢jÕpßd¦Í«´ì»ÙXá&" ‡ktƉ—Ê\À§f²$„Fð +u½íTo»Þíq")¤ŠÑ¨’ L×Šp5âbœåƒLD%Nc–ÉW¨¸D Ñûh.¹Žô¶$B’e‰™^NÚzž‰LO›*ߞÌV€ò ”bÃÇK0©Í²ÂIxCC©}<Ð#·jM5ŒÒÞÏAnÑ$ã¯^nf–õ¦ ÁçÔdIçsÚns \aN¬çܐ\=Ï춖ٓ­,8§,"¬¾’±ã¸û\¢Rq¤É&¹ˆ8\öA†ùÃÆÒÉ*2qž¤#?°X.=—vËÚ¹g÷ ¬5@Bô_éùUšºà´†Â¨°!üƒ×.+9 Î132”KKþ¶çâY_R,V¹ØRŸCŸv ½KWÄtÕ'ŒÂÓcNòºG¥ d˝]·$…s¢…‡Dr”£g[]UäÅla7֑EŽ"èù åæ8 ?ŠQkP™'ø£nyy¢V P;qD®¨À3/ÖL‰/ob~®ê@‡8D#R;²ÀY*YØw³Y¦ÄŽ¦Ð8Ú +6“Ò(7>‚p”ÈpmvmڈÍڈeTÛöŒÔ9„¤P躇ðÆ wk±8ø7ÑÈþ` +)Ý×5‘Î`ÝÄxôˆÔÕÿï¨U\·íO6Œ8[´…?Sls~z!*¼¯ËCq[ž²"`!VýGüÂ=IiwË]üU¬æÝôf8†Ï=ùÅw@#ȞxN…ÿ‘‚¹xÀb¶Þã8ÅÍmÇYã¼ÁÄ$ܺØ!÷ <,|Í:±±£áäÛw¡ýڐ®-Æ 0 ‰ Üþn‚L}>Ä5C¤U=-êzõ“'a7…x=JÉü¸§õʹ¶„Ms– h뚄"NVŒ") qm©•€T[ˆµ#^Eº<ô!3F |ù]…µÐ;d߯¯­ß6Á´@ÄÅMBÁF®sµ`ð ,¶‹¿…#™§ÖbM§oL²JÿۋËÉÓHŸ(øߝŠ»v)E7B  +,fޑ3½q +y7úÚ>€tðäê‹àÃÄzÈGÒ¯%ì²%5Ñ +ôúá—ì5öВI!R,9˜-äqô'“„y%øœgÍ2¸âŠÝÑÃÛ­ús› ’ûÂåZ¯4E6cAûãoÉBŽEÇjK#ƒ} @ædÞڄÏ9ðs¡–PtYJ5XlâÚÄö-C¾‰©óÔ^•Ò/骖cRþ½Cþw\‡2¢“8ÎLîÆWnƣʗJ´÷……Kà–ýK¢0ëÚ~‚Óƈ_.û§¥ÇПĪ‘mwŠVùN3ðžŽ".8èÚÌ.„Ä!Ú°Mt<‹hD :ÍH +úúf)šÏ Ÿ7 endstream endobj 117 0 obj <>stream +*GD_7y×jœ22 +P—˜M5Š¶ îžc– 5¢= Lñºä x¸ÚÚK"°Õž+²HYçn؞È­ÒPC²ž©l"Ëÿ#,€F±–Ó%F0®XåŇà”B‰ÖÔ¡í2–¦³‘ú´8·§O·…T´ +»â4Ó¨Ýxʲšó±© i š°lk$¶l̦ú@h~͈õƒC‘7<½‹®—,biß.@f¦1‡øæ ß½ô_²tŸL^ŸïÅC¥Öqq¬h"¼<*aÉ¿%"ãàþ’7òÀ9™Œ*ÛÇý°D þ †þÅÑè¸U(C©ÐîÁ¹*¼÷Ýòãͼ$zïkxG›X”U –ßøï°÷‡þ¯¶èÝíC²d«ÕJ7=§öп@Æ—&üȋÎ2šs¾ÿ±³ÎŠëq“‡lBQ ÙûIóMâRiØáƒeªg¥1ÁF.žŠJ̉¨Xˆ»±¾¥ +OMʉ›E«Eº½ Šã7<24„‰ŸYrÉ)Bo^î6eìÌiy­Sʍrjh¾¹¾Ï–d+Ƀ1Él;“ €ž«ßm¸æ8˜Œ–1î#0Ð`†¦*d€ |÷O¯£­ÉTf€í)%œ’ó=aœ›…Ø‘úæÂC¡\­lP+×3Â3ìåöOàZNŠW:\TÜA:ƒ4ò÷3ÞÓ9 ÛÛ1Rƒ'³lå«_xÀ©’¶öl‚Š…xóéå—óˆÌûÉU9åð0™$,‘pä!‘Üt#ÉgA/&Ê0… +O“ïÓL$)žfBMæéÌ¡¥i02¬$Ü¥5 ['?DŠ¼\¶µ¿õ”k¯ÕՌ‹L°VÃêî&i`ŒæAÈ#ed/²À`Êf´ÒɜZŠå—>›:h»°"`j•Ö• xCánÎ3äIó‡ì"1`_]4>õ?ݙÿ 3ï4–ì(PC§ Š<ˆ¼UBên"v©/æÈLÞI¨¿ÏHG¾ÿ€ ‡í*xd͛±"A?³?mO¯ëå Û¬>hþUëŠHá9qí ÓlöPCq†¬BaëÒì˘†¶|Ò]ôЖ•.ÌÎ$™ìé8—ÄZ+ µO „ýŽ’R2" t©èµ5µl@¿]˜›ò¸„FM{ᵑ?@C)-²„ BÖŽ™ mu°oF÷(É ñO²á¦o_A¶“PWÓ~Ž%ŽŽ?iÄA<ðr2#@¼´ö4ûÉ{#‡úH½V€§ûªÌ¾Ÿ^J1&¶›™Ÿàf n“‰•b0™çú©³)Sb›†¶± £›/Àød&3 v–gãY#á*DLÝÊhýd>g1dE{“Nÿ&b9'›¿a7ý»ü©©Éj¯þ¶UÔVÏÕ蚁ÈS‰oþ”dÑoHûÖG8ۗ ä g߂,° à&]õ,$Œrlb©JKÖ@íÓøMé-%û‡ÊakûÁ“C}öxg„»ÀAoãk͕µdZz5ÞÅ¿°;99‡7A·ŽUi^žL ›+mpÙIkvh´Mvi‰ÍKô‰D}gs$d‘Ѹ04BröSwˆ|¶u4ß,É ôʛR(h×Çà‚{_ÐaõOcïˆõ­.i:VdKîSÌ H˜}0^‚,tàð ?qwœ®E¾^2H v‡ÎbyÆrÂú°cɝ«£ë$ƒñ§ñÑý¿bLˆñ2°£ÛI¶³þ¯ *ÀGaëצ±¡J֋¨R”.îƒ4T‹EýÍ«0 9Ù¨:NìïÎÑئbl0:Þ2šVCϱ¤ÞB e¿Í”éÊ3œÅ‡B{Áïìw½ÒÞÛàU^”¡U1s(ãóT..Äøþ#žœú5Š3ÛJ/{º§ÆÑÉD¾Îrx Ç»€:Ü|Y£FÍ38®¬$ ·‹û& ô©fçïpç¶àÚžÕÇ ‹¦ÊsµlU¼áþ0§³›-Åf÷ˆ7ÂXD»-J`_Ԕ`±ýå½L "$7¥øârÕ1„Ø?Œƒ3yÎÕvr "üÞvÂ,x +Å3Ä÷ ¨*GFchºÇxŒˆ´¯†› à÷ðž´ËÜçÍ…õã +ï±]ÍpoÍèܫΈ¿É[û ²Ä:½MfeÀ]ùž¤ªÎ0"¼"»§ÿÔÀẾëS§gåqÏ·t}#0F¨¯r “Ž H$m…G3Â?=Öø‹råÝÜV¢¹®~ˆ“#¶v+•Ž_M7¬ý©âx}’¢€æ ø1ZíÂLAœ‰¢?lt$)ÈÇTåáÃÔ`WXíÆV +î¹i‘ +ºa KÝ;¹d»™0¹Ž¸¡¤ÙÂ2L1§òr¼RÀ&[`t°&_ðeËÍ^^E¿°`™?Ü1£c-žÍ¡;›vØæßSL”!\ïs÷(ݬÇjÏOØÊ´ù¿E6úp»œ:>êœs*ôØd8øå$SG‚KGñ«'“Réâ@÷U×Y%<àõÝ ¡àˆdb­”(X'=-Ðääím6F©©ÊsŒ°Ú$¯_ÐÆ ²bU7-«vî4¼=„BìUu!‚6¨üBžGÄØS‰ÖÿƒŒ½1Rõ£WæÛ»Âí`Š~éT™séjÓT'¦?,äñ«Y“ìðŸÆ˜—§e;Ž&t&¥ýãõ¸!twcÙñ.]yî‹m-¿0ò^‹Ä€*úð`Ù¢FŒÆP%Hã{ éÂɐ:£‡†–á)fâTÛð̂+¿"ÿÐÁXÊ°§ï:Y‚ö\€Eòmˆ©'‰È]¸^#V V}Â-;`¾"ÇP™®B;“­…­×~€Æe3ˆuå%Zß+2Äî™Q¾ó•…õ +‚îð"³˜Ûz¢¬ÁŸÃ«<Ž1 )âl¿‰ƒ‚ÚÙ§ÍL…jáÅ×>ôZó£tUwKAÆëÂ÷4ž …?UÙoWͪÎÝéßT»_†JÔØ@ÀÙ-ƒ`&0·¢Ì\ ‰EE­ìŽ,É²‚ {"‰CEdÑà“ÑúœKÀ6T“©ÃÎ!X"^MÈh§bV$ƒmÈ?9‚Ëá`N±ÇÈò¹õEE&÷4\rdÑ{!õ`Öpx0 Ô#œ*ÄÃ2|­Y{þuÙïÌ¢Ò¤päø;§“wPËùûl£Ç@@xý@.ë1U¶`ʦÖÉ/kQ`Q©ÎâVKÔÀÓäçÔf [. +¡# âРím~ÈáÄÖ «ƒ©ªŽƒY¤“Rñ»܃ÌÒÄÁ¤±æ› %{ßìŽå ¾L&¤ƒ8fOÇ^¨N•Æ(zȺ»ôî†ðKPŽó=›ª­g§ÆX¼Ìæ4üPí Ÿ%áß2jœHIÅ(/)FD%¤ #±ðrHVS¾‰ ã&ÈÆ%Î6º‹ÚTØúKéb bÿ^$n¦rô]û6µÝ_¢áCZ=$k5 +þ¹OVŠNœÆ <¸ÃǙíJz™FC y*c‘·Ó2rZźԥoÕü‹ª¾—28*„^ïqioªüƒÇ"…4Ý0Pd!†úÉß,mQåµ}±¬¾¼V–\%;ɌŠV ãMôÕSÑÈìx<aå‚(at,^­ ­X’e‚6iK-Ÿ !`ö÷¡†kuDÃcÈÀ=TLΠyŸÑc¡îÓÄü8ݍ…¤£ž€€×ÿº'’¢0 å'Êàj¬ñN“{»O¤èF‘bßÍ%<<Ï BÕûž›/4ÅûÊõ$e~xÓ'ùðĉ¹ÖÏÕÊ]Ù)’’¢Âc(õeˆä˜)ðKM ‚†$„Zp×âyÌÖ+FÑ:š‚KÕz #ˆà–3xÔw‡pl˜Ã·¬kôgÁùÑt…`Ú=%Qiá¥u¤›¨!0Òn@XvŒàž±g7( DQV$PHŸõ » `[_ ³bDþð¡ýõ_¤“(Û0Ú!’ÙBzÐs‹*Ð`,M°š‚),¼ØxÑ?e¤;Åf,2:8ۓ`6$_”mPð;ývÇr~͒Ç2æyYØEÙî`%؄÷}͒ƒw[¥•a[ì×9úwâq­HržMhk‚ú7ëªî„ö)Я›š$ùF)™â>s$,€cCPZRqK¼ÒºÞÐg=ÛكÆ÷Ðvco'®½BݏuåLöízä$7ß` +^‡Ê4göP€áJFk 7Q0™÷~_ó$6/rãƒɃRØìzCfˆŸKìmE³Ü¸s”˜ rxÂÍjz;µe¡$EÍ‹WÙG¹Â;¬¡–ú y¡ö ¹àVšeZv] ½ïa[*°‘ÝŒ°e›e"hfΉ_ý™²¬çÖû(Šj>eÑ+‘Q¹I Ú¯¯û›Z +àTVšÍN´‹li¢RY>× ßàbW§ãê!nIðÿñD"ò?hy·°/²"ëÇÌG©„pØÝZðNJlá»u6 ®³5Ф[ÉÃb_'<·zÌöÓxªš‚>îÖÉÐé)˜Í¥CÇA.Î/û(Ý{yþ.}•%8O¨µ”H=ržSSٖ†¸Ó(ÑþCƒ©}-ÂýèM 3Jµþ ?IC‡âÎõ—°뇭ÌE +0ÚeˆµJü-'ï¦ yÆ~½eÉcãÐ%©ËçØÒ£ˆ‚“Ëõµ3Àß`=fºpÜUóí%w>zÀ¬^aÅUÄEfìBfÖZÎYkGÕt!À¥úóÝGJ Ù¡h NžñôJ%™°å¿Lé[3¬*þm ¤Øž` TP'ùwуƒøŸû˜ÐÑ´e. O;aLÁV7†Ä– ·eEøz—qô͐fñ +2[¡#*?L„„ޏ€ýFÚ2Ê#€D‹Û˄‡ÂòÒ¥ì AWî†ã #!Cƒ?á§Em²á؄·ß³yž¶}ó]Å,i@>mòZØ"%€hTÒwYŽ° :OW¯ƒ6â6qàuüëÀ„ÄïR¦†­Ï¿û“¦ðï„Øsˆí¾ Ÿš‡Ò$XhÍ_Jw¯Òʑ¯Þ +JÕìÊqkØøK…Ôúϭێž¶‘X¡L‹k„üšŠØ³*CŠ9Ùº9ÔÔÔÆ_”¢ ò¶{O)'3„Œìå;ÔhC£­™VÖûzµl}·!t’_ïÌ€‰ÌH0‘Y0SOÂke3ƒíkHAœ'¼c,2ÖkÍüa¯S&­€9qΐÅ7Mù}ò¹¬7Ço¬"͈ÀG6MØ?a(¾4̵Xà‘AÇ31y¹hjfb‹N‚oÌÔ×D.*8±ô4)Ò½øt\ýEò’›Yô²/‰êó³ÄACÜdÓª*Ð±Aí[V ¯9”ØŸOÄŸŒ?Ëú ;´C¹[6Qq3xþ~ººY|³ù¤ðú0ß wÏ áÆ2»BÜ÷ŽQëº~fu™Žši„WîЫßwf¿Æ°MÁOªÓAâ5ø¤Û%ö}ÔPS{ÔÂ#%‘^¤fÓ^¹Ö9ÉKY,.ëò.íô5:›@q d‘Ýõï'!”PJh՜¿¹q÷bÀ5‡˜N8 \ÈA‰ñ›˜NQ~[íÙåqcŒN¤0%ðH?ó$榫i†ØÑîhg2Öa3sxBÉ_O="¬#ÖKuŠ÷ºðd#;fa{èàTô6‹oÓe“pÂôŠV±O3ŒûKü?9&Œ±8—3…S(Ì ëÕ¥ùtQð¶/ Zß÷µ‡¬»N9<àºÃ¿¾ÑS†BvØÝË4WtðJg\¦ÝÓ]A¬aþ§Ž·;.,à¡zK@í`**;-ÑxJµæoI¶AëÒx¤K‚2ã/wQ6½Ý?>ýËÏ[m.a 6¢6aѸ)ºä¶¾YéÞãðYt¤÷Ñå¦Ê_ÝْF¥¾Å{ï|˜Nk¿ò |¡¯,þ[íÉCO¾Àí;­-•hé&/ãGÚ9´ªîd'­ýۑ#[ܘs‚Ôuz•˜(zká2QF‰À:ÁˆQՉÿ"b\tªŽ:f³}Þ¦u›NahŒÐéZ؄[¤£ÌZmbM:Wl'ŠÂbóò;Ã,©qÕR\yóÕu;VÈéœý.8ÎÎl:ðcÆ "±Sœˆ  d¦ â<³O«}Ã)å1yÂ)ѐfœä€¥"¡à”K*ó›ýÑä›=hB4y¹éº–<¢H‹Ú¬_ž÷–` +ŽçM.6/eРؼ#_ÁY¨j†½¦Ý Nñ¸f<½G/:1À `ö¸ˆ µÇœ;Mù÷’i¢œ(Õ¨Ò´dã5aƒ>+‘¦ïÍ(:zˆ¦&Ú¤' Šöe)Ðd9ŒÍÃ#ºšXýQ_’±žüS©Îë2ó +Žeæ&6B Îν‰S6ÊLÂkæ"“‚¦nº™õ£³7à1{Ã8Ǽ8ó·§9¸­^ύcº óõ|!\\?ƒ.›Éb¶ÑÍmuvxPy§aÉ)¦T5æ·%&c"@ᔶ’Ü/0÷k ø›’`Ò«pAn9Çç/³3û~™¹ Uà‰Ñ*ì/Õé½S:S ñ%ùuÿ.xY™å ·„ ì€\çÛî2ª–b^Pf ¤œÙÝÁä •Ñ¥øŠé ˆ? ;½«UÎ +\ڿç¼Ïõ–¢EŸ:³Š–raþû¹åY!%Û|ù×Ê´rºóI•ä@U³@0ÖD¹C"©’^~×÷uLò7éFÙòŒ0»8ê’ßÉñȒ’6³¾²ÑxeØ÷%ëÊåQ‘¤Ð³ÖÐßRÒÆfM)ıJoGyQÓÆ)ärU©|Ñ{jUÒ5ýÜTf”ë!V£T"'ŒÖ òõCµAHÀS^Ç6€±š²3 4¦L碎’ `ÝËÁ&UR¶Æɋ•HÀÒ %§G(î>¥Çƒd¥þ<_—\‹²>e#@…@<©žl ü1Á“Í5¯À®,W›ô8åØNcJhÞlJ'/¢é''¡á$eÚÀºÉRú…®Ù$®<4ˆèþÐ9Cç¾qNdLn§Ñ}Sæؗ튤£–œ5NHւÏÑf•[IP \¹’…†Ûܙ$”ÛU’{(U®¡‚5@v–:pœî-ø½‘rW÷+$\,vR·Î©q¡ÐHù«q©ÀÐ!›1Ùêõ„`dal¼H†¿ULáMƒü°Eº¡†š&қÂ{Id´21‘ÇèyEÚd}%DÞCšO¡¨8¤Þ¨•ÊBnaŝ€„TlVZBHy/‰ƒ-741M2ÈX® mPúGþOŠñ¬&’Šq¦á´ëO ;ó@w„Ó(rùO†®H•+L©컖 %ě¤*º~Æ»:ø±‹LLjÛ>V“Û+5˜>Òːsý' ò˜@)§Íî­{ì'ÇìH¦¹V‘#ËCñŽáXàŽ +YÒ\;ÖNüرŽeضà%6žy…¾‚ï_œkçXð´©Õ(p é&#T)¸}0%–?ŸÁˆ,æ^BQ½QôÞȱÔË10‘¤10|ÀË]Ä7¡ž n\ƒ'3ãçÉhã|ì S ×\ó@û$…¹ÆzÖÊpwbúY+ ·§ ‘›ª…ÓT¹àc ä’̃pœüï”‘áC±fSFÊ{¼×Èù:ÎfÓҞ`,„ ¶%Ç3Œ…µ²xS°º|Ü iíÇwªð…ŽNäå‡C¯„N»qXò¾Síå˜t·çlb<á;Õ3.²?'öNå?1¨ +² ñV K°ÜkŽ7—S›kÆGP^Nì Ý)Ä`¨r™MŠßãƒ`‰¡Ó„l2wÜáA0àÊPP”û½xƒQ¨CåÊ( ]å½­ +kT"ù¦±w—Bè[×—œË¹Òî;k¹ ® ¸3ö?w'©¶SŠ(®ýÛèXÖO©½\ÙFùÅÍýg\˜MóÃ/§ÐâÂGªGj[q6ÙÞôH~sŽëkþ$ZS¾Ÿxl饰åèG —MÄÄguU&`f…Þæ½)ú¹Uk‘)ó¥ÇNµSú6ƒ-¯J|՟<κùðú‚ʦ@K-ðd9³×SVŒØPS›Î¥nƒFÓb(ÏÒyíò=£‰eYßía¼ž5/šmÑ;•Ýº’KÕ%̀Ì)¾åYQpdɒ“½³ ½TÅÍZÕõ–µ ÄCg¨¶‹ºâ¨ùr*XNJÀ¸xÙT¢SÚÊÓòQ…Ôˆ» =ÎS§Îib¾Þuó`†¶nÅX‡jž­ÅºŸÈ¥ä 7 ƄcñÖòY†6Í]Î4€ªü§œãÒrUVèSÏj‘-çä‰ÜêŠÙ’DW§ Xó¨i kX&AwM¶r¸ïÂ×4èÍh'ýŠ{|Ȧ¹ùŸ‹î¾…K ‡(›PHáv!²r¥R‡ó2­¸_ 9šp³/^(+`Î=ƒòÜBp 7J…‚8ˆ×–NÙQT'¨CËLÞj,‘T,Тæ’*hz»×tª$;ŠÚîÙ2! Ò)µÐ é”À7¹’ æ©1\ÏÚ BâW-¥ÜÒ`×UœržY΄*:~t +Å +0˜|•)âÊûY|#E§f÷õPë#g3þ)´Ëx>ßp¦$tr¥4¥ýhidS5çž;¬Ì´ýØæç>lžH#6™IîèFÛxØZŒg_,,r2^á9Ÿ‚“ª0Ìãw—ž9JښÏÕP1èÚ +H¾¤núðç4èœ +«F§écг@̚Öñ“ ­ŸÞŸn‘§D¬=‰M'ªèdíR‘ö*݌»E­9Õ®CX:†•lgH6'TºSºL¿Úy”ZÉ´*Û#ŠlDŒé<~¾¦È¡È¬e"E#aΕLßRe ‘ØneæÍißiŒ¥Ìà8Â"X…ßý8 ”)Bú”*˜TÒClH}o=¨]ZGY³œ’ŽçÐ;ŒyÑRóHIH•Spf÷¥@Vc“Ò-…ô®¥Þâ)§ìՉwÙ·¥Uà– +ÅQÞ8˜¬x2eÔ!¢n˾nu«ÖÞ§] LD4§*YŽM”àÖD“c0U^p|7ú€]ñøK°è)õ‰RÉȀqQR8Ô¸³‰à‰W¯*y¡ØIܟ™‰Ÿ^!?ÂP׏R¦4ÁÔ&¨VËÒŒr +ÊÓ,w ›¤¼1¯¦ ðÌCm°”Aª“ÁK +­Ç¦fû» +!ß´NrÊÄö!§”ƒIu‚ÊÝ)Ì'€L6–Z+?S«]fB†]HÀF£¦cŒßûoÉ®k%ZMÛªÇ)HŽ>E÷Ù±âŽSÿ÷ŖIõ ?Œ±V¼C™ó\s3È՜‹ìB Û`i1ÂI-ÆÃ&Z~s„ß×Ç©Ò\­H˜ld“Q&Á5”× b'¥GpÒÊÅǐ C70³ÒåØ ‹‹íxRfëçH e¦„Б—WFl$åy Á\›Šöš½Ëh4eÄy†²e°±p3%Ë!"7í”)ù×,Ç-`[\>˜)‰B–׸šžr=ù*!xBÁØÔPc3cŒˆˆà#â>PPñ‹û‰ˆÈe[är +.rr +NäDH’A’‚’,Ï…²wûûû»¼ú_x_ûêúý“odK’ª(­_·¦ëº®ëìm{ˆm-xül²m۞™affffhþ™™±‰ÿþûþýðL&»D&›Ü#›È#”].ß ¾ú\.—_. „Ùl¦Ù,£¹›Ã˜-ÿÿÿ÷~ü}_ÿÿÛ÷¥€Ê +G5;Û¨T T*‰dªÕjµ5T­gµZ«„:¡¬êêÂjµÖ¬V¶ÖÖjµZ˖µZk"Â&%"‚aX„û†È ¥‰˜¤i›4IÚ5ÐéD"ERD/*¢"ª***Ö0 £Ú‘…³íó…¸+2¢À Š" !iÜ@d‘"EU˜>ˆèˆˆNNèÝ@5 "º w¾GÐ0+e+ƒéM,ö™N-Lû™Nk¦Ó7hJÁLžê¨„ýcCPÐÁX< ÆÃñA[w!6 +n$(:FZFP¢MÅY’bc BH! ˜TDÄ:’³"96ø+e®OQt>FŠ?ƒ¦;F»‹B·Â€ ´è-z4¸§ Ú¬Ém-gε6itƒÝˆ +UÛ![¾ïi<Ç|Œ‘ÑÇA’³¸­Þ’÷¦+_]<6‰.DWZ0xÜٖÕ8ѪóQ×EяküW÷¹4ƒçË0îÏG`˜3¼›[‘Ý£áEb!ûÅ©Õ}ñA¡òD{݀¨:ÑBÅú~T›áýmˆóã4ù‰¢ÞŠX¤v†dOB¢l -%¾BË4ý,”î…L¾75kÞÆï¡Vcf}ˆ¡çW *âDLÙ=£uµÂ@Á–1û*1Àë{P\«/õ T%íô-'9ǾåŽ@yՂõýAmÀX².¢õ•:àØ·™r—F¤ö"=ç¤qäŽÝ2`ۊ>ÿõ)«¢3¸pâ0ƒ¹ B†£ë§û•ÅƒsAGy8°Ð‘ù+j[/b”OÈõðb ‡üN$΃РÙgÿªK¢ÿþˆÓÿÛ' à®+G5¹…H¼ʉÑz¿/3ÿîJ@þâRûíŽ$%¬¤÷,cÛ¦]k© SO4ªÒgöŠo®Üýv\ t êäýÕC_51îO­SþB§Ûü¼ ;5sì <9EDƒ€|‡ ÕÄP0û†K$› à ÉûDà'TÂ4DZZ'ïñß ·‰MÇý5—˜2º3×ä÷V¥$`Þ%·Éj«ˆV®*!éÙ# .7lØຽ»&Ðï›Æ "Ç΍¼%èøÐÊÞ~¥0C¾2Ãàó¿ ŽwÁÃu»¥{šI#¤à81v‘ ™–.^a*K] 3£ëÑÂI· .U»6óƒ9Tj[ÈüB\¼ZÒˆ,–ŒšO£¿"{¥ƒ~öˉ!š»ú_‹¢ì¹Ç•“¨Âê^‰ìLQêH<ªòٖGܙrÅä±I)åÚÇaç$þØý벜 ¯JÒp­MªOöSþÀáÁ©Ž“-P”¬€i‹€ƒ8q³¶ô%S£od£‘Òb0$¹ÖWÎú÷ŒV߈ë֊…¿9À¥iå’Ð +\'úÊF'mWEÁ]Obå'Y0A "›ft€áwJžIMÆÙåÜ"‚‹«*„áH•yZ ñ)Á«Îא3/µ–~`W…´~܆ äžTõ +˜<ÛDZj¬!» +\1ÿ?dš:&´»Ó>è•Ôyl0Ñ`Rø,|ŽÎ_µ@Ýë¨ €¨„àÝ(OP$(Gˆ ­o€(ÌVTß Ó@€$:èDäÙLÜè»ÕwÇ"lv¸fiÄ8˜ÀÜÞ]Á~åãã”C€µíãcœÈÍ8Ÿ^RFx4‘–mTy×<]wOÉ,4!ÎÊ+|®ˆýôØÖÛÙi® `0nï×gÏ8²C©› b2$ .ú \ð@§n7 + £AØN!/ýÙlLä8Þ£†w2X +5ÔDR¹œ¡6s­NÊ×xïì™ÜÕi\Ðp-¦N£g=!¼ÏÏhÌP‰âÿ«ðƒÃÌ/0{$6Z¥¸SÇ7 Á-ÒDzEŽ¯Î÷¡d©§µ‡‰;/—í5ÝÍÊÒÝvÄØVµÐŸƒï%Hº6åkqöÂœž¹ÐøXVoKgÉźÜi†dˎ—¿Š'$©œ05œA>nÿä=•ÜX£6aqæ.P`êLi2èÀ| ”†Iî„GäØE’ܽNQáî î« Èc²fˆ˜‹ÖzHÊíBT75fF/µÜL¯?÷¼³é)ÏZ‚x6£¡­UI'¦ÈftÄÇ(ƒ6¯iáÔ{@C2ŠpžhÞ"»(ÇW4’óLBHšeŽæ„ˆc©`9|¾ +qX[´,ݯ_GäIDf9L”ö(²ùDµBoaÁ5Ô|tkRî@RÍèé-ðþ;êÆA Žö–rBü©ô|ž|òXU\0Q7ù§% +ŽÂxÈ´ƒ“i>²‰"/¼{$ÓÜu¶éýù^¿0¢1ÙA.ª”…¤ù÷xl~ēŽ.¿&ä’]VìÓ_0㋠õ¿3™Ëõݖ™Hc#¿_Ž¶ ^nЕҍj6"}ïâ9b²2ÌmF€s؉wÒ—g¹x@q#…†4=F&¶±‹}• + Œ¢™[^1‘`-A·K-&{Þ؛ïE¯jy\Bã2‘‡Ò5ŠÔӛ ˆRjþ¯DÈ¢7µ÷¬zV_×½É+%=+«"Mµ¢:— ¥‚ d EJèwÎâ;ˆì4­®‹‹…È%1‘n…TãŠ[”Ò„†ÁK¦\éÂSFÀŒžq®Ýw"êi)R¿Ëüú"zÔN!°¶k¤•,Óz„ú¾ûKÑ6^RS .·°ZUtuµ–K“‚¨rüu’JI@áÑøqê꧂Yü{8D„2ãxÑ æ%)s¾Ö3ÙôÈ!ºÕ8¦Êȕ19Baº®óàɨ(^bíÃ>o§è‰ð‘¼q¼ÙWš.hKÕù’-ÃåéC`µ;K°?1þO Ò:Zt[¤E<[ +—Š.°WÃ3Ÿí¨ÆÍ뜝¤É(¡ô,ãg•- ÏÌÅ\¨›$²åŠ.x#i ïøÕêR/‚V”g&!¥ê#|~y&îá~œ4Šw*s¼.ºUhbá@xçÙËÐßsu}X‘pE7¯ "VTt=À1rg¦áǙ›Ë·ÿDׯÛ$òÌb‚Õ>¦žèZ1è8~µbÅ\BÑe¡Ýü$… ݹ/*„\Òx[K*ºrû!K:eã~P .kEWÞ ‚ÂD˜…×DÓ`Ñåo ¤•çf3‡3ÑÝé(gd,º3Ѥ>ŒÐ‹Ytý±»@©?q:V‡R°è>eƒ’NV±æˆ"­J¿TvÙ{pžA}ÓPtçõÌoÛ6꺞Ò›òÿmø}&¢¢"Ù $”@Ï /êwö äŽ_ Î$ ÝÁïúÝ]C’L*MјÅqĚLÑ5š™B.Íÿ”ê  $‘Y-ã=î"šñ¿@Â@ë@ɽI:eVì¨4äk`–<~ÏLƒñãç=þÛæš“X>{ ÔÁ›ÿwà]'xý域¡yý2…ŽpÃÝ=÷%þ¬¼%St+r)Yk姻C[ž‹½Ó锨èV‹°ݧ¨¶»LÔd)KQ²À¢›DÉå”ð!ð™ XtK«ä—=·ØÚn¦¨¯hOVsbi+Þ¢‡i7q]SK‘Õgõˆ°˜ Û[y¸å?ãÀ–‹FQEw_S€Q[ゎXŸYÚ÷ð ò­Äõ Ù†ì3)’~#û¿­åK=­)Ž#Ÿ^ßgêM«µ@[!@<ÓÚÿ É¢âW’ (ö={5RkÑ “NŽsÇЎ“¦3Ú_Õj·ë¡±‹îmʓ±ågP9¶ñŠbG£yrºú?ZHIÁ´ MvÉ—Ð "¢Å&¡³"õ[òÃ'°÷±¦w‚Èdhm/º¸†…– $\Ý!– £=% ®­ +J¿Î¨T÷)®ŸÕI&H‘ÄþFwÄÛïã*ñ³š9Oɗw†X~‰Q2C¸¥ âŸO­°¦îÀ«\(y9M43]%׬‰9bU>­s¸¹!¹®~ö*€ýè«wE´ë%æpŠõÅþÀGIŸ‹B05. ±´ŠgXL<Ä“F.:²”*݇nŒ©—ÇßQ + ÈwžuÄĎÕw–>h\|.Pï£XÜÉßTßN}Ó¯¿¸õ—‡~£+–š’š«b ÀK[1wE‰ñ˜ÃáW+òÜɝ@8C;*æ^4™Êy°Uˆ0umS¼bPá–b. Çåë2I+ä(.dˆ9ÖÅؒò¢8µŠÛŠÛɈ”Ù)„³Z¨JÐS$¤B"7‡ÐÎ^b}ُ£@ÄÅì—HVP“TŸª¶$ä'7#1S +€H‰ÄG<†:ÓÌÈˍØÓ &ÆfÝ|1ñèëC ÎBœÆâw違hqxáꀸ„óŠXíÓ¤1§fóå ZÑÎÐHî²5>¼Ê?˜9ÿڇO‰à'ÙºÓ ò‰vø׺è’ÛáM¾…þF¢–ÉW(;êTë\‡·NÙl¡£‰ãmÀçpU‰ºåp¦ècH4àÄÞ Ý»¡HênX¾ ë$_”r… ‡öì3ÌùHmÄU8i†±=,?O&h’áQ*=†)bxIz†a˜"ÿ“©ƒa¤Ø>˜ÃQT/\Ÿ õ¹…¥ÍÔ|ƒœ‚¹ð¨õ¸…ِZxܵ¦64’y“½dKለ‹9 +ϊÔ0ACáy5]Îòæk (RCxŸë„Ç],8ƒ*¤OÂMé9 C2¾æH~„Á¢šj#Ç2q>Ôqßé$gÁà—KeåK·Õè…` H¬¾ÿñ` ºà|có$¨œ,‚1Å IqڎœTƒàýÞ¦{½8ŠOd v‡;ºWMvsà­o`×ÁwU­­`ä1ÛÓlÙøbàVä^øÜØE­ÀCCîHå.MYBrŸÀW©œ.G‚Üۅ D=Y×KÁÿLô ‡8NùÚë@ŽÊl€7Šâßñ&Œ+f×| Rµp£à +Øûÿ~#Ò´ÿ èDÚŞ[()¾u±3êæÀ&£­þ¥Î¾f‰,Vü Üü‹Ú.<{sD+ÐÅ¿C¤R×½¿¸=5ÔþNoÆëo KDÎ[P®eJÖ§ñšýÌÍUñ.7pœ8¤»~ƒmÿTYÀ†RýúM ¤˜r6ÑoêNüù͕ j»ú”ËoêjhnöMæ g-%Y\Í} =9¾ÝáGòo_aÝ迍<·ö´0³®x'Š†d ¬—g_ãÏÞ¼¹“!ƾ¢Ì›Ø=Ô×7p/Bi©=}å +µôMMWÎe:;ôe1—}¾ ¶·°hóXOúv®W‹³úö?•¯DÙ=Q8ÁEjòV’Ú÷g`86µZ<:ªN:y…ïrç*™”!¥¦|7¥øê7<ðõHü½ãY€|«˜übô½¹4cã®%bïe®-YFÆUÞK¼Ü!i}ïÞq¤Ä¹îá¾ÑÁ~îÝCEd”`Š{‘dLŸêr|–LӀ\óí÷ @l{«ÜÍ^{ 2TUñU'èuŒ]ø5Çß|"óQVÕ +þzüa„œ^ÞKGÅþæ4Ï¿nzAog·ŸÈ øàÅWêÞUáØ'­ ‹“^PÅá”l +ˆ«£÷ÚW +|ËþÑ'Ú •ó^ÍDÀs©yAÍA;å"yõXÆļlú á¥èRË[Á ­+ïÑqÊË X¨Ûø1AãQò ½N0…ûv+& ±íµÒÐ{ú"n–¸øftn&Pï "9ßðï{LÇÛd$Xx'°•ð2§(~§Ã ’0)ª´Ôƒ÷± /P˓¡w0 xµŒˆeÑӉО„ŒwiTy´m,èùÞÝ?9‡¶Ý]Ë0£`»ÆՂÌ’én€Ð‚°ÂÝÙefcôhHk» *AS”8 ¸±n7·É*égÍvAÚ {òjdz‡Õ®/§>N»CŸIrøÍCmôì®7Z/HØB„f6»×ZJñ² ºÞbžëÐhtÍ36l¼(&ߧ…Wy|ç ÿFäÖ]?™£]±cfµ®­K›b[Ë]Ÿ‰›Ëœzœ4zluU‰bÍÜmÊ^}ÕTéàE•çI Ø£™ë•Z‰‘`eeŠÀ³U}¹¡Ç +-;[L-²i¨+>»!·©b d~º°9Ÿó¹%‘vS§ëÍJ>ƒŽÍQ: +©fº“CÚKØÛj*Ó¡Õµ«W&!]NnÀC!½û…fº^|ª&ìÒϊA7 ã¾ t ï‡Lxýò÷çzMéÙ*]ÿÍùú£tä)ê\4JmI›†ø È­snßNQÈmD7H…ß䬤ðJŒ R©6·òÛÆñÜKiNDS³¸›’:YiyÌÍeÌ0—>M1EXN/õ¯UØ!+^‘0¢^î¤óÐ8Õäf²Ë%wÚ¼[ǍOúAZzŠ› +¹±JêQHÿx²½Va„qÅç¯Ä´ 3aí9P¨ž[\)X£Fl½ 1‚‹Å®xÞÎ÷ª½~ýjžŸ7–£¦¾´¶Ù¶Ž …÷seà"“›#Ó>\ïù¡ï‹vìZÉê-äœmÄc 7Ü +‡t6ÛÄåÊÌp—ÖIe¦1B˜ÐrßN{‰w¨H†’­WŒµÏR©3\à.𫬫ãÙڃ®ùl.ŠOå …ÃÆkÎRˇô¿Å&äe-‹•¶Ü¦MK¶ÁÞ·(ŽSx}»«43ТÃ'ó­ Lã[9Pü½½tèÞގ±xý“„A`,½5º²4¸؜{V^d,ÕòÖǀ¥ ,LP–ñEdÓá혝³m¼™ÄeU(åE¹¶® mk™ô³µnΝ-`ñ§I™á¥jÅm¾lKÑÑʖ ïN¶½„‰l=×Í8a²ˆ:H¯›‹ÛCKónOÆ¿vÖÝFHiJM\~œn_;âz@¿ì-›ª½¼vUö®Í°¸ w톟 ¡ÕµÜz‹QmeÛy>îglm0ÜJDŶwò´ûY;SjðOçD|Ön¼ÊZ/øX;rÅéd›7¬Í À,¥R1S,šãr¼Ì¥MxꩭƧM-;μÔvS8ôI¨Y›ځ=léq_szCí9úlÔ^ +_„.‡øOËĞv¬šá èvڑÛhÓö%#µôàïàúº&¥eã:,z¢ËI»tS'ñ©Í Ú:Þ+èÙÑލ´Ñ&ª©5µ99 4õ"S°âEû'Q0a+ZÔÅ=ö•m¬}MbWŽRâöYžlDë k9› ;G÷¡Aº¨†ÖoR;(#煶ƒ&Ò1'RBH:Jà‹šoþTH 8Ÿá¿Ìø¼ÜOð|Ï:ÒMâ€_t`D=dÍTxjK§, t‹ŒŽd«•¥T¯G0 ƒq;{†!tDêÝZ0ûì‘p!¥—3cµa<¸œ¡—©}%Ér~ZPØ0g3 8DøSš<ŽA«o•ˆÄŒyCH™ôÈsâg;]ÿ߅Qù®”ÁK⇀¯FŒ·<ü+‹êèt+ÝM݅‡ÒÆè¡Odª_¨Þ5nö»ƒ«¨ÁòùÇþÎtÀMJñ0ú!*H­ ƒªbñ‘9Gہ…êñ#q{õ吕ÔîçÙd¥~#<Šÿu4û¨hz²ÜS†£Þ`v¨BZ®ãÂd·x;u0njÏ#\€PgKHÖׇH{*€Y*ñh˜°€Î×@y³ôŒ¾wÆ_L@ö%oE˜%èv’ ä\ÐX+ˆÆ6ø‹HúÚIß9%Nýt@ʙEJ€µû‰1†R´Í5[¬3­š°pnA^j?|b|•†Ÿ#¶<Oü«bŠ§&§dm8¢Ng̀%!€¿bÖàä[GK¡”-…GMÈãÍ +ݧZÚ³þ°¶J”õÇ Ḉ:†G‡”é¢7‡Â&± +/N!R3 ‚;…òõ<´ÑSDÑSäCB9F•cUµk$³_ˆù €Ô¹mT²¶’Õ–¿XSg@©ñÛkƒ€Ha#j–FG‘—‹¡^ݣʼnšJQŠhËËÓË+1†?§WJðØ::ƒ‘¹òü/8q«HšZ(ßVqãJŠýxÃI²ÈøªÏÀ8&÷†PŸ Ìã7¹—  &4eˆM=à+ñ¤OÑH‹X¯=õ[!4”Ïö™O³U„>ÿï>… ›=5æD¯ùÑ6|‰ugê®å]%x;ėޮÎO9‚ÀKDÑʓ'µ0Ó:[pÏûÉ?樱a+ŒæaC§yV… gɟÓL– 6Ö­0J¹7nח5­í/å|ypÌh †2j!£þha!£*íéÆR;áóÜ^¤Ëuo<½TRã;eɨOF±ø‡ë¯Ô§íÀ°ê• ¸W¤¡ˆè²™‘BGok$ÒÌ;/ +ý5Šp1(až@ ÷ +–¥#0Œs™áþ½ªÐ q–EVOQØpÚÙ§.,´+;¼¥ßYhïE*:\¾T›ÙÒíןj¦9¤!nr ˜¬Àë°ÿ¶— [r5dܒûH˜R[´èقmÈ[ôcEåhóÇÓǽz œ¹Jb!ÒV3yLUæ3¥ô¢®×JEò‰¤Š/”;y¨ÙiEåÔÕñkòð 8ö%z˜†+© €ï љd&S +0¸¾ÝÕÒ—Ya7ûýó#D¬ _/—…‡Krhâ0ë7»ªqBÿ·Bè?ÞfŸÅêÀI¸d€é¦”þò[¢nv¢jÎ< Ø`s`#²«’PWèU ¦¡TL&$¢É§Pٚ#yh㈠MX~öô¤=:6ýdÚùŒe ¤)L¶'ðTK·9"¢?ü¡1:÷=JAÃäïÉc¬Îsø†QÀ~) b_}1šêû²Æ\Ñ|$šß ۖ@ãv–QӅCR:U?T²ÌÛ¡‹E•q hº¼ 3ƒLP{©S7iöT­ª±Q‡ëó±Ùý§èDʽ© u!+#Nxsû…wT¨Áæ®aúÀÕ!.·aË],`°Èo÷Ÿ£NÀ +œ]òR׍ ×é€î$2:ªÂц+âìÃmÍÓa1„iˆ¶UG +tB;_j$Z%jýŠ‰þUM„£ÆTÂüjÑ!„ž¼!¶ ä?’™z–lß¾ý™"·M*ˆo¿ôaÉ\K–ãå3’¡mÉ_òé _?N½êŒlÄ£YTä + ˆÈ‰Q‘!p¬‡“éđµBnf4|<]¾%ðrGtžýd[æë ~§rƒ‚\J 3Õ¶À¹KŒåp-{Þ±ÙÝùf|±å\"š4AȈàÊ΀/<„©Åb¨CÐɵ È¡ÕsÑԐ`Ôh’t“èèö%4Hė¨qsá`È`€y@˜Ý¶Œ×‚ðX[·-“ýû¤…ô¶ehf|Õw´>Ï3¦ƒŠ4×i°Ä²——Ÿ¥ýjËþz#¦5–db²b$Ûéõˆw³óЯ Y8a[C~#Åõ>‰dsÒm ¬  Ðç¶ÀŒQ ëE¾ts¶¾Ì)uŽFŽ.¡•5àº7Çþ<Þ¦:/ÄCƒE&èñ% Íɽ·:ú«[cUÑöŒÙb¼óé ç ò÷ -åì7_OqQÙk†‰u¥Lãyb/•y 7Þ©ªÈè,í +TxÁmuI}-ە¡Yô²´ý GÏ÷!a¢ ±ƒ›gm£%¹óÀEø,©+½ÛQ}ÙÒFZÃlVH™ó´Ñ}™¤HÁmÆUÒDÕ|ý{ô1JS ~7š }P)ŒÁˆ‹á'¯aá¦Éëß5¬¸Ÿ|Aü´Œï³„ŠµarOÀÄîàxÀ²E›\Î@GÿOïS¤JÌòºpY¡¤fPùì0Nìû•mNž½n‹Ôþ'_C…‹W<Ë ø:4=†§)ÍüžGÍo"ÅQµ—MÏHa֞£­'£xºY_”W\¬ÆЕäB-jH4)Ð& €,¶Wù_ô T¨tÁ´E5NðU1ú ” ÔÇԕ=jíà‹àtUؤ—藞{RN5Œíi7…·Õ°¥Ïz56|Y»xýXjª  ::ô @Ik‹p aâÂ_=Ló!Ÿ’|Éת™S$MRÔU^|#8uË<®(Ñ õGj҃½R(v +*bj,‡*Í+* ©4Z˜f Á²ßáYÏh y%q)í ¤rþwÇ7B˜Ö„w»Böü÷¹_^jo)|ù¶‰ç Ï!€¿&¯^¥°±ÒyÝË,è½\"K¾ ¾=™p ±¡HÆ ý¸*Ü$¨z ”Y(-¡µo4#È#lq†6(1À kILäáÑ»‹ì2¤ÛC³Ð ÷›úՖÊ`ԒãVzãZ‡øR™ˆ|Ç +•TÛòÃdu, +Ò$’ Òk<|,¸΀œ´ ñ§u‡®ôÅþ¬RóyŒdˆ)È1>ÉÓ±œÇ¥„Ãßg<=Xs¯B`79© +äÀáæ¿=C̲ù˜æA¼pclaD#¸TOsÉ5"ÎÌk ¸5¶B„ó/Sæj™dîTåñ…ú5.=5AÀ¡ºèOA‰ƒÖÃÈ1éE7öƒ]€½|)i=”&yËrr)xìçbía¯ýÕ £Âµ©61*éƅ`Ï|!ÆhcÀBœ1_J¥Õú7}+­d -ÀlSô÷\“±za(r—íö[‰­lðˆ§ÒX£¥¢¿ÄÔø“ôl帊¤³8‰‚ò%ÆNû©.pë31Ö²”ÊÜâëVGlÇ% +„ù©”õYd*í(Œß"f-q³ í"£ÿC¯Å‰¡*‚¼pÀ<Þ7Ôdª›É¡_+¢ YBnæ">=ªÐNÊšÛ­Œ„Èð‡Óc²^[}nÏ*JbH)›á¯® þ¨ª<ê³-$åƒzÝËx°2cíR“&,±~YæSÞ´O?[ê{AX$5Š O],È^cLWþËJ æ ª È>Y¦ÒI"žGülg‡{l¤.-æ€H/úÔC¢lÈ£ÎQ#…|mŠ(ðeÆwÖ§:õtÉ ÊQgc›‚¬Bð§Új˜šrè7¼,I#¼¡Õïsgÿb¨Ê.¼‹10p诐¦<¶Î-qªlŽIHªϬU‚vaªMŽ Nk ômÚS–T]ëT2eH„¿ k>ÿ敟»t'}«*!å[ҟF íƒoùðº²:ðoDŽÄIÙÝɷئìè0œ1¦ÁÈdhõ•…ƒŠ—$ŒB7u/¤ŒëŒ}¬¼’œzXP‡ %j)Àt› ?Š@-iR´u û~d³Âò|bM¤P)=µÊŸä)VOc‚~wǀ vöFZ \ƒWHQTŽÂ»e¼ˆ‚Ü·+ÂÅÎ|숊)œÙ-oâ<ò-Ãó )lbWGÇK è†ä FÆ(uI,«˜¦Er•0ü_ΰã„ræ"Öþ}±¬KŽIÞ")t Π¼çvnäÞÈ0™Ç³/ùKuÁv¸oPá,ÊkE!ÿõŸÒ¶úÈûŒ +Bè'üë˜~²r¨XWôJ˜ó¦²&ÐéÛ´œþCtŠÖ‡Ï8I%F¿r³˜;jæü[ü£Lü¾yUÅovmÄemô]Õ¯]Ѫ>–±È3’ H³)W,1…ُc ¾ ³F¥'¬ãe)³sS`m“ç«| Mçú}Hû~¡ˆžgÖ3|äæq:¿øÔYÅ Í(MߪnY›SýŒ S;Á¶Š)ÞViÅÿô*M™Mg†ÛH|3¾ºûê†|Ëå£ö‘mú2ºƒrˆh®(>írþ‘ˆDâÜuìšU䦶!X?3ó‚2³XPÎY7X…[¼†º %­šìURˆWÐi)JñØfŽ£ä̃ ± dŽi„w)[ÊÛ||±V Öúf¡[B-b÷Ï>.>Y•Çhvkó_—!à®Íè’Enx•Ý”¯àº¥Ü´ÁÂöYÛrnS9ÌÏErÀáE—ËŽ× ½šº«d0‹º”«Iha%·ŸÜ© Íò،ÔÐøCԅN္SCXÕowםÄÔ‚³Ķ1ŸiÅ3·Ú>_>2+To­ŽV€I§Li¢ß‰a¤¥ÕNÚ`ðz#ô‹w÷Ãú˗áQ%0õ¥)çz¹3iF…p÷HùÅr*!Ur*XÉÃU<{©_Wç,_ÒE¦ßt·_X<<1Рéøب8±M<âÇÝ1ÆȒ´§5ÝØ%6’Šeûš¥ÏÁ÷EÆýÃÆR喒ãuq¹±}Üâ çøâü3K|Vs”ÿ^ð› ÁLºçè~‘+Ö¦UœS2¢fÃôòhR®w:ٸ֓U;“oBùí‡}·â¾%8žáµ +E¶S­W̬Á¯Iɉ‰¼‘-’Mk$!p¸©ißY»À „¦ns¹äzÅM¶#R©'‚; bp£ò\Ò60µºª2h/®ÿüR×ð>c°~<Ù¡•WˆÂÇ¤IúD#lw—HÎÀ]sŽy‰‘ªÛ@*a2š"]"Ë~ð^Óã›Sn5,i˜ñGÅ.+jxÞ"øÌ\qXt[ä0ðþf«áÑ(¹˜ÅŒ¬/*‡ƒ OŽ­ð=ÄOì5¦BŒH"3Æ=÷}_&H~õ" )˜px#TÁ›Ó!>{}–yä¸èo¡ªˆÓn<·ußÁ8Ai>Ÿ¡Iœ¢tˆN¡ª˜ÑfÞG’!ª?e{ÒÀ&-֖t/n?!öî¾¨Ê Sóq}}²oZ º‰kPŒìÀ_¢åš ¬Õ.º$Ɯ òÉ\ý/úƒ'9øQÚ¡Épé·$CJÀÒB7»ŽÈSڌZWôI +žÇ+“dÄtA 5vÉ[AÄBpzÕ^‚¹Ïïz B̎é%¢•$PiÎKÏÂå%v +÷dÐxi– ÄpÙÈK4ß%!_‰ÓK *¡u±YýI4g"œÛ%¨Þ46޵۟ëRæÁ®.íO®tÅXì¦KpÈ^tiג£o"V»?`¿àQ‚¥ÝGËEhÖ¼—òã4qP¿%åž kOo ùÙÆn©µ¼U°ˆ¹¥fÞ§nçu[BဆÓÃÝÑÛ­û¸ÑÙòÉ~¢@‹K£¥>ÅÅÍg ȁÉ|E²ˆêÕx*ˆˆðÀ=J¸,eø€ØÇwÙy•¥ZqP“¥=… 31nHM2õò[ORÓC Ô!ÿP•sŒ[œèUꋆÐÿJÇ­ð5Qx­ÀÛì+qþÊ´'|%Èå•”çޕBÎˆÖ'€s%™zŠ+kÅ; ìb “vnX ˆ6_¥¥aÇ4<»Jtf@ÒoGýGÍN0s3*HP:ê›NGÖ˒ø¨ÑK[6Þ!û?•NQm^M%tüxÚz!H*q41Õ$%«ˆ]R›z¡¥¥F-üP©îFQåÊñdb?¥ÓÀçŠy¼@¸>•DÄzJZÔI¹+Ü) +“>tºÓMöBÑXA°a¥ÔL¢f†~̄ÈNk(%ÈÇa}*S…é¸Á/)0vP>…z¦€_¤œ° )‰ƒç’Ön‰µ•û(AWn‚…ß2’8Äi$D¥×]E¤¯£²Xß&Q¾ç,¨ÎA9~ˆcB œÆ=fXðÆtPÊضø(D+(™¥-fd19#” ”š¨·¡Q@©»5hÿ$¾æj ÝÇ&eœˆôãþò4üÚ3MRéú¡ižÔ°7O)a½tìv»œG""ÚÇRäeÌ"õR=ˆ\n¼–ëu“vÑ¿ ‘×Ù¤ÏꚔϪ…MònDüL" +§ÌåÀ5¥Øò¤¹ 3ÈÍ$/Ô·Lº‘¬®hÍRÒ({«‰¶³á]¬/µžÄsZz UÇ\ÏÎ<Æ÷–d a‘º–$n[õPs¢ŽÖŒèðî, x {c]Kê¿:†Q*i”E|OI¢F•Š(Šè‚ô4²IH²UëÔèáuÑ ø(‰|KÀB(霝q”å§Q~D™¤ £E°Hgø¶9•¤¸h]:%«#UŠ9ÂÅ2±\S’pË $é+úWZ ü#±Ý_fɛoP2b„ÏR'i÷Hu.95§ Åy½9D"¿°‰Ä"ŽÚÊ!½s„ U [„Ä‘;Gê©£MuâÁ$ !â‰1R¿Þœ¼³çú0ß*JŠ2›ö‹tǯ(Ãd¿’:$üՄ|pŠtב–901WI"5ǏßÆÓK†&ÒÊhK¤|íVzõéºXðˆ4Z$Å"¿[»ÃîÌS íµnZco©P±Ì™Eå<;릗QýjÃ+,•©ô”ÉUFq®—Ï>_Èsıè; C2©K5Æ×+$#ëô±Šœ, +¤¾ ¤L Gé~YþøÜ ©Fk9] Ã-!…”\‘"þ Ûß =7Hø*œAªDû´qíÊ|y-k2Ô]ö­µNÒ”i€ù ø~Ï)=ÛpÿlH aúr—ÿvdø€DlèZB ñêIbåÖgVˆÊªUd×ó£½Q\¬MŒ:èQVk‡$}$}i*t ڑç£f§þ!¼æùR¿—™ùÈ»ðÑ;}à{áDìõ‹,´k)ÉöÈ--•TÓÒv1nöè (ÙDBíVJ‰^ý>Ž’G#|]>)¶)dr0!:ñ1I5¿Ôð.ÛâÑÛý µ! 3DRã h”b°‘nO|¨{wô$[hä=E-J¢É9捜„¯¢]2þ¯NJz;ª9E@·ýµ#¸ ÆYúíBrÄg;9\½Ð)vô7I>ƒ6$(£p:ÂÐÒQ3:‘GGâEŒ.§þßôϑì5Z¤ê†;3¶GX™açȘL#§8ÁÍL„¨F*FæèFϨYŸƒÉ]ŽÔ†ïšX^fxù5ôD‚ˆ€J¢­¢¡¶£3nãþ<$¡Gñãè}l„=AÔD 0|Ðp€W|"‹#0)ΚܨŽ$Äy8:‡¬÷*Ugá( yÜ͓8-@{‘‚0p„q@ l;yÓfœÊŽê6iy®«ÝsÚ ü¼ãèò‹U¹mÔ6úDZýãdamt;‚ù E;`‹Àþ7be£Dõ55Sa)J¨6¤Ë}šq´«¯Z­QÛlø@q·F»‘¡º”ŸÁ1ç|¦$­ó²³M aX_ƘoE*I£œÛ*l ýûÄæÑHÔQíì‡{0£:"â?ŽÐsÈHÉAÜng4.¬FrFºBío'¼%ð\ÎðËÔ÷_÷«ÉÃÌLŽh –[©ÓC•`éÿ|ìÓs‘”tÆ[FÅS ç¹Ò´y &Á™2‚ٲߧœ6”`'# L­¢+s£H¥JFþKÍӟdžš’ÆKö~¡ªs¡™¸@ŠòÔ(ÃK"F|^cvÜÍÒ¨D”‡Ñ¡’aJr2,uQ*-[Ðï`t€\¤ñòÊb>iËÿëW+XÃÚ#AUìYÀFHÓÀˆ0¥hCA6~p´ €ÛûsþŠ!±Øn !{ G¤ààoþ ‰_¾‹Bk´‹ZªÈ.‡‚Íu›¢¤‹n:iâ9a…s±²ëñIظ\4đ,¬Ž†.j}¹ˆS ¤²ú-â)–U#Fe¢Ì~HD ¤¢E€'J=‹˜ö¹«Ê*Jü©åÌêVÏ5‹4WÜSPÞ²èÌÄÇÉ"e¯ Ã,žy,º<÷‚ŒA±(kb=#‹BÝeY E¦`ƒE·€QÔÖÑùW„ýEœ9zXÆä+Ø»^‘ï/Â>-»¢AÅtÏz"»„S*àc*@N™+¢ÇC†ÞŠT¨³Žï$Ÿ9ºWdà„s¿SQ:pícƒè¨ú¯¹?µFh´|ùcµ)‚,3il¦oZ —¢¾’ œ{‡šüTXiH[ðY>R³0 ™×e¹o±?]æh¡hG'ºŸK (ŠÇ"ŽöiûÕ'Š4=ûB7BÈU ïDÝðu"!…ÅYTU}(›RÊã\RH)7Ìht'XXÀ½qÎí‘Gdun¼Á[fKt+Á÷²Duƒ Zûîë½8$ì”H¬¹BÖIH5žDaǞ&‘5à%Q–}VúØÛ¬IÜÑ ž'D³FGË JOúŽÐp+{)¥d蒲-í‹sê‰í R· ,‡m´¦WDM²„N¶!±{Ç7fc\'"™Iïš1†ÂèˆèÿABD:|œÙ‡HöLÐbÔ³QÊÜ›ˆâ†èÞâüíiâc¢v7|!Ò Ÿh% Í 5ûú0“öý!ì‡@4…mIÉþ¦‘œîÙV§KQ ª[Ý4ä 3o¨=*ÜóB(,ËY,bÞ}Èuî+<2aC& * º‚Væå{¨vxcí¡Ý§ì»Ê30=ÔTUŸAû&?YÅTw¶ +Bñy<ÔX5x(SÓ[Ã!ú“‘¼6²[äÄèÜúuÒ2Úµ†\ 'lH[՛k…! Í!Á—CÅÂÖj6 ίdààÐßx ¿¡S8M¼Áƒ'×ǎ +mR;(NÊ ™&ÀðNmˆH&I·`ņ²QÔA_Cf(‰"©¨PßÝj·° (}†þmo†µÖ,†HÎ0ùxû»¸¬ç£v.3n²ö4;3ó2Z7ª@®tC˜.îBíò 3¡B½uêÁg¿•¼íñ@Ð/çFƒß&ô®K~ê±Sf€¸ÛÑ -؄wd27n!y1K >‰W„IH¬„ŠÓJ‰µÁ°÷{Z耚ØÌðxÜOîåˆ^nõyAè*€A°*týë€G{ïeCF…pw¥m O!èo9©¢5…J=J^³%-…¢œâMÎåQH–ª(toùE7Mâ8ð‚BRD`HâG3ñzB0¸’jHÿCD;!¨‚wp>p¯Þ„úUJ`´>…ñˆBfB‚¥@Î׍ í/¡^d¦%Dzp%´£¦p¯Úҁv‚åäïuòò/ê'»ªÙ?+#${ + ¨3™ÚÐÉō$ª‡5"LB|qù6ôS!“%˜ÁþE86j„Æq@¨’Šœÿ 1è´%×7¶ð‹µ*{÷ª=–YöaÕv½ÞÀ[mûÏóåÚ³Üçø€ Œ£j Š +†šõÈ/úÈÈ߉ bŸ Ò©Œò kcvžfœ1ï+¾h¤ÔµWð>ßJµ&fio BtڏǂþG’ Ôñ.£Ú’A¶qdÆOÙUîÔ¡Y7v8Eƒ´Ð L«Ã ËH™»è¹» .LÑðŸÁròн‹ +4 šè±A.Â9pä¼j@9&jՂzÆæyCyÅò‘ªS®Dá›øT¸ô¼-pŒAðA5às¿NÖ'H +ì\f‚ ‘É>ã4Ã_2èJ` & +QFT&^Њæ* PÐ`‰rξ(‹_ Îç'“” A$ÿ8á@hq ‚MŸHtž€È@:xEn®ý èD5LP›& قŒXŸYœ™P씿Ï@ë]Ù>æ)ÊLºÍfÏäwñ¾‰Zt¬¥FM"6'’E‚z©_±ÉéWŽ–ÂjH&MÄ€%B¨.gBA´X¹/µŒ<˜R“E=õ +t,—U +.œE }t’S ,Hñ‹âˆ¹Jøظh Ÿ);f„3Sñ ǖöte«gH>¼0Ð>rõG“‚|³øVÝܤÕcäüd€>‹ ùŸÂnQ.Ì´µ;ÄâÒ (ÁŸ‰÷ÑM5 Aâ3úí)†iûc@5F&¨ÑQÜjß=G.tV-=kó‘»;)Ü·oë‘O3 +öDHƒ Ÿ‚˜d±“o€Š¶ð˜1Z½2@•Ãýºm7uo(®× ; ¸}õ æ…@¹Š9·ÓÝhs)iêãÜê>¹¶¢µÿ#^®ðÁÙÓý‘"›±eü§Ï¿^™·ªîú牖Ó?䥺:?—hC›.$ʹ¤Ðú8Š‰æø;¼.Œ4š{$@°ÎÂ?µ-cp3t§¶]÷›lè¸Jͅ“ÑC…ÍŸõXþ¤c2!xÁO¢yÜE¾ë3h#Ë¿FþýøãRAÑñË0Á¹Î~?fª6W$_Ìä;@™ç~({m£ Z?ßJQ„9yY¡gCåêG˜ÅgMBá©yœÎ´ÖéGØ|X!p2kJ?è G¼ †ão³ÆEœis w~؈¿ztÓT™ùÙ%–y£Øl QV~.èPªhÁ;òÓe<­”ã ¨I!þ@ÒºQ€'s} Hõ}º pïóy‚^Ç쥯è<æ³Ý;ì0…HÎóÆ}vôôöI:›æ0ˆ7ñ›j‚ÜdÍ4 +ÿeúڇ¨2Ò>ÀهÄí¹ó ­GlõŽ©—È« +S¹Aqn4¬êƒí’\¬¥€0¡ù\(ØåÁ¥Ï¢Å¸Nú$õK¹æcRZôáåT½CŸ¬jì#Ãz n¢ý|nðTš`ðRÀ3é +{>D8î|$ˆNWÑ×Ï)¦âïZ»JKšÎ4„ is•xٝ|„&%¦ä“û.e.z#´Ñ‡{͐ê +!„øi¼ƒ>âØøˆï~žIs/@’ÔÀ6š¥…¤‘ ЊS÷@cr–æ °=4ÍC8‡ë¹]ÞÊ/ÏÀ5Pø+0¿ÿ=t™ì,4~û=F˜ +¬ ¬¶ ñ¶¹RØYYHb–‰’{ät +MÕa&Î{(™»xϞ¡þ’Wv +8 ‹ÌîÝӍvöð˜'E£g²wáŸÂFHKkݳ­ø¦æá„jªD<‘©Üsà¹@›bƸ‡2¹pÏ 3mN„øö»=2k¡5¼–,üZÞϞVýԙȰ¹á™F•¿Ù“MªæKèܲ—=zcyìdOácÞ‰ÃÄûWE# 'çzt<òž³£“k=?äÍxÖóüUµµ‹õpL%ÅWOúš'‹ö¬¹§\Lƒ³Õs#ˆW= ¤w˜êq:-b-ÊSoî $½g©Ç uáÙõh¾?*‰=´UVH¸fÑYV ìųhR¨/5B\ ù½f!ڑ D¢0ðËíŽ>’Èk»ê§&£TçEaŠ[¼ž¦Á‘¨D¤!/Ó@örgÍ]TҌAÀùÓƾà([Ÿ2ä +­ +¥$œ7¥ì´'ˆ»óˆÌasŠÜ­DMât0\¼¹Á¶u sÌ7‚—ì„\õh¥”– ø…-gYz '±nz0Î0?·\¯óg*$Hbe2A5.ڍR5ُ¼ôSÓwŒJ +.ªþÀ r„#ʒ錕V)]NѐÚÚٙ +-‘´ +r@«¹ç¿†úèîú*Ð/¤.„€…„¨c<Ö!CU¦þ*©t!^ +h”Ú¤h–áþŠ1´ãGC‰ä½Y™Dô©¨ñӉ¬ðÀϛ“=ιÚûð>p¾m'U®Zº`4-P 14Áÿ´¬3©aëÆlk^ʤƒ®ÐäeÆ:¨c³*Ód˜%‘¾úBÇÛ\¢6R¾,z| ]që‡Y{m`P ³ Zº•4Ýñ·C‰ÆÀé HP“2‚¦€½­*›$Gc°ÐŽur‘&d»ßÈ´ó=š +1ls´zu&EØv6FcèÌp Ýjà-@{_ø¥Hº ©(±ðÊ%¿ûì‘ƒÕ ‘Ëüm6‘éI“\4oŒª˜!Êkب´V Ârucá󄚥7×4@Å t ¨¬þ;9í' >uÝÉo©ß÷󾋭f@±OKÝh¸õ’És$Ï°T®gp(@,¹àõæ! ÉþÀ¼"˜Òڀ{ÊqšPlœLˆaCã"©LŜzíŽö³•:ÂÏGküɱ¶„¥.?žø›–ëf%ØÍèú °ŸÇԛ—|X +¥^â$Qo}ÌØ0ZÕUí±ÑŠÎ€Ü§ÖÖ ?ë‡B5˜V[…ÌÜôWx±~F`¥ý¯ƒ`Có€å- ÞA¤¬Ü•yy€ÆVVæ žÚ²¹!Nñ +ÇüÕ'Aÿ_‘âüâû»¢MŸ®Acër‘(ÑùÄQ‰Ú% +hš²´ÍŠÔóeéQ.E‚ÈÙdL­- Áµo Ÿq·©±AÙ7´~oÊRy¼¹>Yò%löÇåI÷ŽA—Ûq$±v!òÄíÉ R#†ðghá +EÒæ½_…ÄÂ…,*Á‰J %òÇÖÚ0ˆq(s™ma xÌõt±‰çÇN+º+-g@[èHÆðÕÅÆ7‚–L’ ¿* bí'˜6d,+9L汸€O‚~r-Ÿ¯âMÛÐiSy{|:d ‹ø`ÜÄhuÑ´éIè4VÁ¬ÄF¹!y%$wÁŠÐºZ Ÿ˜S½ +7m<¾¦ÒߢšÓ†bËÑ<Öê¡ ˆ.;ß¥;‡î&]Ë'?X4Bé­.N›îåŽô’0î‘qn-·”;¡ú4jK½Oº;g@,šñÚȀϸŸ¶ø:¦±æí°Â)Òê )a©!–¦Â0Ïö,ÔðpÏè© ÈäiâåòÔsXÝbÚÒjHôd;OýáQÅ%ý}†8”?%²Zx7€g ªJ£”LA]:JÖ§ï+Wv!Ñ×b§¶+è¨!ûÎS2L-Q28—HdId88«„Ì=à„¼XQÈ»Y*§‹Vx‘Ýåïü¸kwMƆýΓ̮=\ð'ÕªI5MÑC̔xÉYG/TðÔüŠðÀñÂÚäÐðføõtÍ®WÈÍ«{ä¥>ÄÇT-/&Tö@ó<š™„Y;#> /E› ®ŽEG[èÝÕ¹ÒÙ"6^ƒRF×O =+ÿ2Ëp¢·‡ÑïHã] +At?òIàDž(“f¿¶dqF6Æ;ËNhÑׁI.ßmçàyoGëÑñôR±ËHH„L£ã“&±¥yLhbÏìá·ñƒI]® šî5»ù"ö)¤B˜ û]‡x²¾ðø) ¦ª‘ðfÉê*‘àÁ„ø)ˆ Ó½öž¼óJ˜~Ð ȦúzòvU“ß]'R~Õ˧-PµOâٛDü¤Ð Ëf?ƒw†‰ÞöÀ_‚ªß·Ð1ÄG§_å…"LdŸa Dç0aA/&©È„ãî+[$ȔWͯ=FpË»XîXÄtAC†dü7‰Â`þüC3*â7Ñ«g¦–\ôôg‰é8˜Š‰ÄÜdjâ¹û¨DÄŀÑ1Ô'«€çec —w\>‚‰$!ŠfÄbÄDê‘TkŽÕËBS˜+<_°ÙÑó¥Ây–w +ŠéP<Ťüù™r맩K*­l÷Cªd,¦hÁãåøӖ$¾ƒu‡`‹)ZLw1‰AûƒÕ$+4˜[acY Dòú›…3_}Ř¢ðB=„#m¡kŒšñsÛ7BטvàØ"”Ê|!·y±ÄûDX® +։0óNÑ;D¼Åõt9¦´G—n}ÅÔC§€uQçñ¯xÆÓrY¢â‰ -æ¨J¼ l‰xÜiÉ^úM7§…EÎCb=1Þä½7k`Êp` ‚²“ ØõL`Ï'Ý3—ˆRú®É¤G‘µ¸Ðã^ +Ù#€ F'²?‚Ô䜻A šäZÉâ¥OD‘Ræpeè>ã +LJÎÙ3ž\|ŠÕ3°=¦()Í +nP>,%e1d!KÜVå€ÞòT¥Â.ô8+܆úý%±¥ë_v ¯vV•¼ñðÍKÂ|¤é<‰šÜiÂöu°îé>\ìó!¢‘Á„èÄC…Yn•7e}"bŠN‡ÎÁÎV /ÎñœÇð sôÍî‰SX$ã=œƒÜ0ò€iÃtVWfLHJM"R"BÈDTr $Ãn+´”J)ˆˆT„Û»é`·ÚpÛúÄBÃFµiû<mÛö †Ì Ÿ†nhþüÿÿü"üt¤¤”ÑÁ$ɟ$ɟ¿áÆßwFèÅ ƒÒ4':‰>½¡B·þÈ B9‰ƒ¿ú„ó ;EØC1„EÄãbPn!‘ +)r"" 337CÁ ýÌÌ 3ÿP03ÿçÿùÐÒ0<ÑÐ Ñ0˜aP5\ ®ª+¡Šäà®`Q¿/„“ŸB.¯\d9ADÄÄH”¢!‰Ë0ˆO²äŠZÃÖà†©˜Cƒï0ãç‹ ‘ÑѸœ*ŠÈÕ ÂŠŠ*hPTuTT/*jÉÔ"ùj @T*ªjQQUM™ž"¨äý+ÓpЁH4Œ†ã¡1w=t<<\€¸¬Ä˜BÈ9 +2Ä„1„  XçÆXKi؆µú-t¼çžÕQÕ²æ'Œ +ÏBÖ¦Zщj59N`EiÊS+ß2ûú>c[šZَ, (¾ÔB‹ZC’ZAÃýû¿ìbRÀ#xæãà×ÑjŽ|½fzZ®©¢‚êãL‰” k϶žÛþ¨ž¿°Áÿä"æÿ3¢0 h“»*¥0ÈÊbH ͘Xâ¬uï¦ÚUŸJƒ¿Y¸­ 6Úï"æà4‹Ÿ[uÂ/yN-«hYÕ)xëÊ垣|†œ®š‡³í!›-.hA#BM#dÂ=:À@ké>¹•høÅ­ÑdÇìò?+!ûÝ A˜Û~ÖÑߟþRe¸h(ó,Ö#ÏJ£¿TõA šêPÈÍb¶Ô´D6õUù¡¸H¯³ ¤Ìa•9®«sÖº†¾q¨KÀ¿ŒÍ„›ì@i‰Þu³®3Pƈjl›¶D€¤ž‰¬ëfzzµke•¯Mš£ê&Ýþ2Ë-¼ƒ‡Ö=þ§¤´¿4_ÁbÏQÔÑìÎóˆ;Šþ&¢c;€úeÝKzYgâ¾TW›ª,÷ºPv´²´^ŸüWYtdáir*ky¼ò³p÷°­žç K.´6K¯Ž6/é%꫹Éz:V…¿Ÿbdeã/hýC¨Sÿ%Ï@Q®YX_5#Yþ’ 1Y­´Æü†':z±¤~ϱ×"kéyuxº]¹4§Öˆ"'‘å³Ã ÏÏëÉr‡)-|¯;þ—toå6¥`$ËÞ, ?3(:XÿËð'(Zu—œ:–½ÆÐêãû‹Ž‹uÏí†|°Í8–gào,§Ê¿ ÂU¾`½~l«w䕥ù‡%#uŒå†L ³ ËØ ŸY®êñT,Ú åLíТÐI–BòžÒ¬b]ñ¾å+?ÅòÚà#>µ³ÃS¨´E±zÕÁ˕õ©å̂ÿµ> ÇεŒÂæ«bÓº‡…/À –¸ñ­2Ȥ#—•N3ÃržIBh8fyq°1¬ÿ_ Q¶ž KP¡>¥…õðýnäȧ‹0»¸*–3‘WX{ñéeŽ¶ðeŠb턅¤Sϳ¼ÃKXÏwðCFX´¼†…Pyu¸¤$^ª†"Ø@¶è­ –)ø첒B»Dô!¬óüJHÀæœDš偌Xm˜¨a×E!€7Š,XeäéNJ¢Gz7¸Æ>¿:ÊP;+`1$kÄnL]ñ +ÏÊ¢@˜Ñ#ÆÎ +`åúùÿ +Šä˜Ê'Važ<[¿¿Ò ´OÑ_ý—¬#~¾_•x +ZK1ÞWV¶%Å1%)üª2ŒS€¡úÕöUÁ2ˆÛÿ%»¯À*¤«”®,ö\–ØÙ‡ÎW\RªAåt–¯Ð•ÑÖïõ”))eÇWù}'9TÕ¾Êã½ „œü{UDrö]1=`žãî¼ µ90{5ÅZ Ü®WÃy>ó¤T½ê[¤°(6½zGZä ‹^ñ›ïóŠß)Ø£æUš{æe/¯| “|¬ªú»$)%B(˜ <1¥LG¤SÈ_À™lú ±¥ð°!jW=°€jB±µ|Ü·ƒRDMH&P¶‚:DRÐޝ´ÌZ]݆Çç¶pETˆÈ0‡jÙp§¤i~½BD\B‰gO#€ 5Œ8ù +-ÀήN®v>RTG®\ØWQ .VÀâ™ð—¨Øë6éÏ°®½°Ð‹ë4œu®|ùR^©±ÈbAýìƒå^+3ïø yøÁ¦ 0LyÞÊY°Wa­Øoùa­¡0ÒeïV9¸Ç­á5€© vÝ +…¬çV¶j/ÍT­ XÓÅ­2šð¹Iv›%f{râJŽ¾«ö+ã›cm5 +ƒ +2×ð·È¦#`f4èÌ^G#uïÞ<€‰ÆôôP7óƜÉZu(‚‹dÏÐß̱bUú~$å@|£¢.+ä +5¬ŽÐ‹25IU´žVáæ ¢{\^žÛ´:¯—¦FS± ¦SÀD«ïg¹³Š¾WMKSõÄ#¶fÎêY¦j!ô7«.K÷ۋ­¹fÕäåš+ͪcߜYmbo“&"ƬÞOÀ„:Þƒe‚= H¾¬Þ+ëFý¡- Ý7xeÅð.˜šOòŒXRVÎKØ4ZÊEƲöê¶ò5ÛXuyF«ý̺eš© I c§÷**5ðPY®b*·Z‹±ÏO¬˜! ½Š‡–dª +Ûß~m¹ô…¼êK.=§Š§ áêM÷h[³aå* 9V]:¥Lu%MXÙ+wRÃVˆ¦¬`eHÂc®r|ByÂ_±ãÀê„]²1e«½øW‘–>ƒ„ÊW2ø1¯Àœ9Ÿ£¢§´ðV Ê>(E†AU.Y"Ž}eùÛÊÖ¨wHÃä ÂöqA 5¯Ùmdã'¬ÊcâcԍùVõSOôuùgZïªd©H‘³VF03jkܓ+-«øKa¦dÕB1 cUF¤ÊŒœ£KèoXErâ„Áªù$ÿfxâ®2¸Q î~‚—*ß·c€%ψŽaµïwJ䚅ýfÍðv˜èJUA‘è µñö¨ +$A“ kŠ|ïSa՝ªUîXË/ÄäÊTa#—*ûð¨žg( ëÿPs9T1Nì`¡*Ï]Aˆ˜‘>¨êæÞ¯‹åÝÿ©^r±©4V€H܊TXª#lÜ19¡åT +¿u:ñð!N¥xëM•Ó -˜ùkªÖd];؉Jü¢ðj”l*<¦©0pÇxQ+ÂôL•ƒ†ËT$EkxL•Ó³¦aª ÷ä)ÜmazT5”Hæh?2 ŒjM +£t†6á +›THHÈ^ü+½KªnÑUQh·2ã%P—r©}üÊ~HÕ IuJœRñÎ7çÂQ¤GE¢P^óIßàæÛC%ÑÕÉØ?2poTŒF…CrL +fJg§Ï =V%µÞŒ*¾Î¸××#֔ë 1ª£—6¯YïÀ‰U*ɯ¨š— ¸ *nÙ¡z,Íùª6 v×á²P›ñrNŠ®S:SøhÍå¿PÙ "žšÐPä艢çT7u8AeßLkÇÓTKˆ¨P¦ÕÙN±K{a¬ìm7Xô±Å*¨P% ˜"m‚ÊûEŠœüTzLü"m÷÷©(øZ[¹ .T°@ž»›ïÍè¹3±lt`°Þ.I‚àýL7ÆSÍTކsÀ²žÊ ‡ñ¹¾Sˆ„.PLÇ»S9ò@mMA¢¶í”is„³Sü9KbÀb¿í¨ê”E["‹žø¼Æłߤørš€D ؆Sl(–^4&/.8Ep¼ÀóS€€S9è³GGo +Ç<ç0kS­É!y£0YúœQ5AÇÒSç^);6d +ûr֔€Ÿ’*_S×ó2NRPC)-eÂ[`Õ¦ +’™`m:S^:¼ÍԋHu†•™bHéž-ý2•ÍzF+SOk›LiÏB¸à@š¶÷˜úJ" 1…Ÿ +S8^Ð }°Ý¤Á ó݇)nª Ð Qt…µC L€ÂÔg Èˆz‚Ñ9ÖÒ©Š¢ÁFè­Ns{©²R/qœ!šN/R‡NOìRw)O­«)qvðyËO2Öw‹!`¡¥ÒÅÐe)¤™ò>KeDºÑõ><*ׂô¤ryü•òE¨Epµ wU +séPôRšÍ¤Ø𞞡´†™6¥ú“jlsEK©ºmL)€Jí 2äXÆx Q­l€XoÏè‚椢SÊ¿I "%*øÀzkR3Ïs°a&?=Õ.2H·’Rs씔¦²W ðq‚^˜©£n䊺?öŒN¬©ðÛLkš¢Ç§-8’žt6íÒ&©¨fP‘ò×Z‚šªùŽj"¦!É©c8"õJa)‹ÕRç „XHuá­ÁÎ Bÿ&º8Z™Û  + bE_FN¶(‘L+”[+×]ÅÉö1Ê¡/‘|’ +á¹vÂsœ×q9 +M“È?åh‹…£‚BõGR_©ÐíF™«"seÎkÞF†¯ô0x§O¶<÷µfZˆ¢aBÔV£^qÉxâ²o _¦QÒ<†EúÁ°d¾+Ê71ûbTù`+à±J£èCu¸×|!ÔzQçá0„µ3VHÙ¼ô¶¡ã OO_bÃGÈé \ŠíPFY~‹"d DA8€×¢ Za•Ä¢ÞÏ_[õ%Æ5¸ˆ¯²vÔe<Ÿ¨_Nt¢¬RÒ=Òûj12Q­aɃë§+“ KHŠÞyìåªêoD9TpµFó$‰:ÓLXmõ֏n-Êý'6þCu,sjY#²È“¾Š(|çj® +P …ftNTpÏÌ+Å¡Ê´ÄÐþÍÖ+ä5ú˜6Ôê®rV‰ ê\C¡þh±99Uþ +"¤CDŸH_ö  6X§”þÆüìNfqc¨jŒÔ%ýß°.#K°,ú1`iŒµ¡”#|óð®;Û)Ôº-IYª)S̪?ϼkÚ»M¨˜ˆ寐A" + ‘, gE(0Í~T§é¯jh0-f–Òƒ:Oº_ú1ØÉã9(³-'L{½ºRz.Ç\O„YçTª.¸…`Þ#(hFAÁ2Nå²iÚ'B}™ÇǶÙð³OAi"¼Š$Ô»@Õ ¯:à FΧÆ14 —T¨èJ˜{c^ƒ˜"`^à§<í4PljKAŸz8±"P‚:2®Ç»A¾£¯‚3w0Á’VÂ7ìiÚoɝ6ËÀ¶ì¢¤ BäI#£ÝÒÚÄÚDü}žë Û?ÞNýFv8Qm ͬ¢¶!ï`´°r¢ì>é¶O˜•©Ä ó&EàiôI5‘ŸOi>©qÕå“:•&Ÿ´0š’6ÚÅ'%Àî ØßrôÄZÏ;K³!”î°àSC¹4"Èt)©FL‰žÎf¼ yŠüïõ¤xÞ­§kG^=Ý'²lš‹d§¡~©„v9é¡ÊÇzz-Éçé›jy§áYÒ_LŒ…©Kèe—¹ )Êú ¢_Wy + +ÅxGӈîÄVgŸ#À“5a.èÅ ’0n÷#]]§ðp%aŽmÌÇ¿#N‡~âoáÉÚ4]}õ$Â,åa…ñ@þ©£8åHŒÌ@ö­"à$$Á™¯pŽ,FŒ®'åƋ›Ên“i>S„s<ð €%Û:dÛ`۔†¨ÚFN`œ`°Ä…ª¬jSD˜uìgà¡VF›æd¢˜˜ãw[>}D)ê?Ê…`5ük6=ÍÕã +¦ùì¥acل¬3™“4qd%`¥ƒŠUS}±Iµ©€ŽU^É~§ æÓÕ5|›êŒÒe%œô¹É#(鿦ãõšTF‚vMø®&̤§®W“ñK13Ã@tL6Žïyؖ‚d-¤c­%–¹jjL˼6ÎÍtw+¦£Q)Ô8©±SSØ:ëHÀÉwÅÊnšàPS¦ wþ¤§»4O%ëJSóø.ãE™WùôªA?:§l*±™ÜWS^ +u&«þ!F­ukö‰&²Ö‚ôС̣Xu¡i½UlÐdŒM1¨K3ÖÅ»ôÍvA‰›&̱ŒÈAÝ*™·?:õdB–¢#’ãàë'3”²a¿Ä¼6}&80ât›Æ£³ +Äë„5²û¾sº1„;fC>ç’›D7Õ@”Ø`“òf-$ë¥_ÖLv¨Ê…6ý*ÓŠ°&TT€•Y‘ôkjV®T7moœëçj®”ž0èaӓz®xÎl/)䇿#˜©. ØV;êɱ&a’\Zo/PSŠW%²c6~ÖÆðЄC3ª’<ã‹+YΤqÄ¢“XځfX܁& /ÎížÒv ²ô·q6iJ¶Õ;Çq•gH¹·>% 6:´'é¡Å =i¢Ïyµâ«ú±EÆËEãî §ÎRÄðwH´²¬9ˆþé­*xàžԜ3qfcOî‹Ár@.áp,û¦I*(ŒàKö䕱b…=Y”ìVȜì£Í!Æo]XúüŸaé,ãŠ2 ÝÂ'c IL~忞Įa­æә3Åî`aÃf£J3!ìƒ ³ gƗzã&º^õbÀJ(ª40=(sPiÃ7I…œ™˜y©„ h—ÏŠÌ'BX@uWE`X&•£Tzr²òĊ@å5¿Õ³$Û\ÜérÙ|£èxam,#UÐ5^4MxÚ#ϓ/àP”B4_ MLsq@X¾ü¥Ž%EOÞKø$=¹e(^¼Bœ8œT˜'3Á ,-¹ƒÆ„aÐÀÍ +3çóÇ54c¦'ç<ÝbP#U'qŸèG)u™ É "Æ|ÜNx²¶ΠČ4O¢:¡:x²ßƒ`lƒ½À-Na›ãÎvÅB=I*â̊II íȬÎ5 @Œ:3Èæ>ÉÙx@µž|>0gP¼Xu¾Öžò|a.B¸ä: ¤ôO•´³õ Z¦#×h´ıßÕHðÔ괃? ª†¶¡l¬(˜œiý£½šÅWŒ;©A”ìA +§ÊýÖ81ö$p¥*½³±1*wîÅÆ4ödC"‡=¹QHÎq‰•öÆ6FqÇÚ܂=É›•VãIWÜÉ7DØðŽÖhÅYähI,AÜ 6èÂԞĺ¤ÄK°Ù[¶gtÙìIÍèVä¶î©ª­ðí;pç­ìIãï܏là‰é ‚’¢Jñqî·Ã?^søOóI³'w*•à”V\dÆÀY)9\bq¤KBHc¿§±ۂЛ)(† ñÎÃoÚ$Å`F©ƒ?Nªžï ¹wð(g@µ ¡Ì<š®CÕä62·'/‹}‚ZXƒŠ·'w?Ó~4MtŽ.–Ê5gbÚ6W¤ü“Cóþ×ÇAn7aªzIì&ÆQHÊ£¿ˆ:y#½'A‘OmÌ]SýˆÀàߥ¯3•ÿŸt(4|2öí'<šŽ>Pœ  +¤†OŠËh,EøR—©ÄØŸlp0ûÄÕ݃˜‚Ov¡RŽ.¢\Gff=ûƒžN±²,QW.ڃº¤ˆáïÉHipx#æÃŒí¾RfëCsÖB¦/ "!í\šH÷$òÄ{Ú՗úþ¾ŠzÀ£OtOÞª&¶¶nŽO¤º'~0¦Šq^÷¤Ç4®‡ð=ù¼ÞdSȹ^HiÝY³ò;n“¸aTù¦¿O+ÏV‚Oî Ô>¨‚áßø¤IJZ›Åm1Ãë:pdÔ«‘hàùšÞ õêöý6£þ˜5ØèŠï…”P0ƒ 8Ä)¼B‡Lƒ ~zœà´KÉøBö›G/ýüƒVfkKñA9ià @hx« \qْò╠F5²Ñ¸´–íÑÚ÷,œ¿î˜a[¦]D ù\d¼ÞIDo÷aãúoWHr&iQÔÍc „#0÷ääëödÈuä_õ† ßb6{ߍÛA„3¬ž Ï©.Õ°'ÙvÄÐ΅+ÉóO$C£˜ÔDÛð¥Ð£ßúÛ;Ú$Û€F jù[ÇdË¥vˆEqY=hZ$„”=›ŽiO’C;{RqHð™U BÚ:.X|Ïý™;Ì©³W·;9A¨úú• ]bب|ÂÁ@–ödP,„Z#aÓ rÊТvד>ø,N†íb§[’0;ƒ§¶µ‘&¹ùÙ-s۞|Œ˜^On†qi“aý5j•Va¯'[÷Ó‰_O6}ô‹Iÿž| +¡Ýõ­Ú“™Ð-ñ°éš{´Öõïår¾“L¶s%7.kˆ§Ñåj÷å†u\fº¸ )ÅgOÆ»! ¬)uö¤v*@!íÇe?Ä%û*BOÀÙçyôàêÚde¼êÐ&a)» ’B.äÙ©BžŒ ©„Û;öד`Ù öd +ŒþVæó{&6ŸN—£¡æŸEÁ2aîÈ܈\º8¡¡Üò¥ŽšA"„P÷€ +M¹ç°  0Mß*©s»·@è¹@©¡Ÿ÷;‹ÐP2#^w ÈócR:S  ܓÛöø`ÄA„HPA Öº'•k£Þ_:B. Yk4юž‰¤JB©Õ&3gCèÜËGùŠ5&¹©Ã F…›{²¤-ò†«‰|+Ô9Paaú²Ç€Z’ü)!³{rU¢!¡Ö§c~O’œÝ“w»Ù,x³IÖ"!…ps߄‘Æ‹$H³ÝߣĬ$B\÷ä\~=.ÇuO”„&oÇ-¾E„˜Œéfæ’PcÄ +[!¡s“­Ï÷äBÒ^‘Õ³deh¸{íÑ$´¾{ oEÎuÄ䎭0+¨«́ÑØÑn"SAŒ›0¾òÐûf¼ÔIhb:ö6èÉe˜ž A©3:Èþe)¥|rôó—Š ُM›üðl¼_,ìKhýj·åÁÇ;VÉ':#O6ÞF\ UŒIÇÜaJÁÏtT¦4¹‹B ‡,$EÖÖ‹îòÉ QZ䍱?j©€tBÐòIäƒ"É=«•6±n]¬]OÙ¼ÞôˏH>i âs°¶3&Á–°p aE»jÓ±ÍÙn i˜¬OjΛ³ÕEñ‚ÓƒùðÀœöÉéâÙ±‡þgáB)à>™¨¡¯Ÿ²D䒿 !@^Ž<Ž—ä +j¡°²SA+’î“,1ÁîÇ ¦É<rk +8R(s\7Ó§<'$#&û'o™ €çûd¯;‚2fâQ¹Øõð“9™Ç3`bÝRˆ6 &Dܑƒ—B=Ü¥ˆÄ,£ºE©m´æ¥*ñ¬ãÑ.03~rF†@ìd,¡‚Ø6íåkZ4RÞ'·Ö÷|k‘­äBoC…’NÚ¸òêRÖ5Qßã¾ü9çr§Û‰É(*´FöQ½}°_ŸlΠ<[~‹=½ÿ¨~”hO¶–Æ;œ¨O‘ý@5J§²ß +Gx3« †6Цóa=õ|.RVЎ,<âxɓwGœš+¼ZUtOä5êG€²,ˆ~^H÷´5>| £è;HB7Â3ÀC2†VÜìˆ8K Á‹vÄQW‹ŒŠ%NÓ + v®üº8ÏÃ=%ý“ú¬mº»~gæýÁÕ¡¹ ÷*Ê?«Œ'"Þ|wsöñª,_°ß§¢·³)Õ£HéƒH‰´¥¶®¥hõAÊ{æ'ƀ¡X`αÌ€7F³‡4Gž–Ð ç zdQž1ÚZBoہ„ö¿Å>hTÄ2›e/i !ԕ"Ú)»[–‡bKjÿ /—!¨‚ ¤„5ÿXÆ!yÇâ:"΍ÓK¼]eC 3¥…•ÿ8ÿÂDàAD%‘ÈÉo“fk“·S¯›fžÌ¯-¬t®ØÐ1_1ˆUõ \Ž)Pêæšfjþÿ:•©ô¼ Ó¸"mØ1nt% +˜öô UëŒÂpa&€ôâð×&{¾ë RÒð¯2É]ÛÜ*v5ÕY—?6Á4YÜÐ4†L%0Ãä?ºL@浯·ƒ“ˆf$€·ßyµÈ¼ 9ìûÓ²(~¡øVR±8¶ågn²y*ªQ"W”ʐ¯#x³‘_–r<Ä@Æ9€"gkù'ÍAçR¸ÅþH¡ ­æNñ&•ßÊ]gE'Vú̉®¢Š]5UËj$”hš^b8Çk¸0<´©P2˜é¢u¬b€u &Jnü +è¾R?†>Êìaýê“ôH­v¤ùK3{šÜx„_q8@¼‹XhL™âØ6SqbHù´ö –%) içؘ\@ƒ€ehF ¤‰Éa.¼ß`Lø x­{ÆT8;å\F–Ó-U«NW+'ñAØ:ß#ô96»úèOç] _+ïæ‹h­z ´3:p¹þz<XZ H¡»õk¢Ï¹‡ªÙ­×žM?4Óæóeiërñ‹¼£ÏÉrRçÈ(š’8sœ8÷õ#Dòb•EQìÄ?&=§]n°Yâ¸<%±Óé{ElŽZ6Hm0XúÍ _‡C:"o܇ƿ¡Øý›@6ˆþ§Ÿž!ׇíB¦¢ÁGmä å =¿`l>,‚÷ç¶C·ÜžðT‚€›Ñ*8Aã1º†ñùŸ‹Þ¨ÌèOæƜ¬,TëùYÁN5k1e|Âg¯q»›/º uñômárºópï1YOá ¼ø)ú’OiÝ´ +µeÙÆÜù›ý_Œï°z Ë>ç¶E¾5ÓA®…óˆc}v$Õú¿Ö'´³4R~”菞BfM¶ÿD³ØK01Whº­³aõu•;kœ¬6nr·bÔG¾zòwS0âU×ôêèìMîŸMÊ«¢×qg…&xV›ñŠã ‡b…ÿСÒÎø8ðdÈj"3´H 0&SàÐب%žBNìŽùßðÙ$ÂbÀóKY‹ôl–²×âGó¤P#îcªëC°iƒ1¹9ìnäö/Dh︝¢Ž@ˆ¬Ëª†ü9¤ŽuÐô¦CR_@ƒ]Xi¹!úE¥¥ëòb¸ èZ]µôØ%tâäé9?e ­uUÌ)êi¦à™KrÈ}¶Ó+´€[ç~ðwÈðØÑZ¹Ä2"rdƒA*ZTòöÎo=J¬uݺF+Ïƒ—èxŒ.g°ma‰KÅ(ƒvˆ=uEÖfevY”Ôž>ý68ĺî©ÀY°ÌY¢s1C9¥Îâ¸ÒI_°GXσQæ;Øõ ¼dh úsügÇaQfWεòHlіës ÖTJqØ˞oʘ!aa@ƲÛƒ?¡zb„ˆ<Ã_½]';E}È<|ûÌ؄H2%–.ŠÃ!M ´J!Œ"ª³éP˜()Ò¿ž¶TKH+ŒŸkøñ³¹ÿg¥í’çclãA©û©6ªY8 <,:À|¡*µ¹&}¬×O0!;íë9?Áé:¯wÜY1 t±’•TT0^s\fÏmH7ˆÓk$Xó7e¼¨()u X…ÌQzxYÉcR_r·G·Ød°;QP”þ äJf¶Dy£ 3Â/2‰½,“Õæ$‰B«º˜¶«‹A €CRßIJ˜@,+ã‚)õ-;øyÊ`8 oäzš•ÀÞ#ö3{epp×ä`Ð+¢ÐÛт?xĜB8= Îe$MŸtvXˆøB “köˆ_¹®bö†!2©’ªæn×ßCüÞ?„Ô-¥5ºBM²iêŠ`Z¼± ’¨°Á|eŠ÷Òº'þú>ϐwVLÍQnjhÄ`öXRB¤0¡í“Wbv—ï~„B=ew¬#|'Z€¥¹×,#S8Ã®"Úh²Q÷Î×Ñ%€â„(™ºã«ep¬5&óÇǪD82¬Ò¡ìk,š¿Î1fÖþúVæãËv˽ø¢>Yÿ#Ьõ;Aó]I·%B¤±Ø ĉvÝ Lé–>u¯ ÷ÁÌ4•™¥Ýã˜ÿ¯tmDC±B¤Bq#~üü…°_– ¡B¡Ð#<`·îëˆû¾”(Œ>Øі¿œdù…ê*Ö¥êÍAs'ÉæÄ&Ȁ£Á.]aØò’Xk~Ç['ôW$»¼KÊxÞ¢^]ƒ²1 +[?ÞÝ*6-þôÞÈôƒ¬¨+98Jç ûD}Àˆz†BØ=™RÅÃXó4Ù+•ï|7*%œjOÀzö~¸âbð»ØpÉïœsªªµ•áðÞl'a3Kºß4W™ÌÓ®àfn/QÈ“ƒŒ-P¸Ñyˆ“"+/ðI0våpÎM(C!îÔ0+”Ìk¢~vĄAçVLÕM—gBe¹í|„8¾WuÏH-Ï #&ØèçA%ØUYÓ±Dó-NÙ)i ´©OÆA™’ÎÚ¸ÊJ†ÄnnaÖDHƒ{ö°Rc¬&™ +„ ¹‡áÙa·{iƒ:äÑëØì¶m„ØP,œlˆ²ñ—žCìÏH!¹p¬ú‹ÌBù>ZØ¿bâ[Å´Q†eÿCBFîÍ +gQ8ÿØW}zK‡lÓ%T‹+Lc ,œµ]Î,3ižc“M_®†O•¸o ŸëÉ°Û±šèŸ`Vâ¨)é֖hÁm8Î5§i›%‹$Ç!ôiƒ?â¥ۑä•,nEGë +R7P¦ã˜«Ñh‰KÌ»réMqÒa"†d„™Š—¬ã…Aìs¸îÐBÀÔåüîÚv؈9ìFbC¸(Î8‰>ùQ•X‚ó?Ê_i tÚº…ˆÌ¤ rgoÅúu jðªcT]vTILàQñg”䀷Jöñ(Š³‚¸k;}~Î>³iæ"¹–1ˆjpuæP2se2kº<Ÿ½juaÓ¡—Ù1%ôCkŸë Ë•Ø “öÙ,x¬ùß2föVrábµÁ + ýZÈ{,ã„eT¡2者1—uŽßMùÆR¤ëA‚Íhó±Gѽáð"ˆ d#>Šƒ¡=.╇Lü +Ÿ¹zÚ“Ð>¦r±O?ú%µ'ýÉ yGíß,ó¾ nðƒï±-Äó›9,•d‘; 6ãpÔ +«*NìIAGV‘ úÃmRõ‹¥bˆ¯}`i†çOž(9sö×,a-¤’ȍÁÿi˜þª€ä©V3¤Ù†<Ìf@ ”܆ãÿlÇIðtâ$: ·ÃIÏ"ÿþiø‡+|ÖB`EªØŒG²û6+pâ0¼jõ‘;/Â/Ïqý%V°Á´Žbz#1Gì'+F¼ÒéÀ]€Qeã&ÿ%P!÷?£gó¿Pv 9#E Ëû‰D 3Õ~)ÿMZÅ@rag€6;)"´ß±&“ !l7š› ƒhOûòì ¢¾Ò¹´¹íJOþmïÓ?´ÒÉŒ¦û„Úˆ¥ÜgôÚÊ"A֞rôo;Sh¼ŒÔ® PñBC(aèAV;7@N¸²©4¶„l„Q¦m,ÒAÚ/J†DjEM€6·‘'ð€ì³ £ £0 ~ŒªâtB‚o €«Â@$èñÐ3@¥À:]ðîŽâßlîŸòKDÀÒÞ&,¿«‰–ßÃä£`~0,Sõ +äÈV u§T{ȍïŸ1ÉüCëQ ]AhCþU畱ÍØ”~ž1 xkÃ×2õ€Ü"ہCzñôýön©á˜ÅÖN"Ÿ=b@ü¥„Ö–U¨Ê@Žê€Âßâ{C&2´¹•|‘÷¢¯#[Ú¸/ÊS"Hç¤Dâ±üN€;1Ë.:©1Ö=¥3»z …Û/!hϽÀn€,,Èȴ֚¡lü_1®—ÀÿJììI‚£ê€°Ý#×pHÁlaüa"룴 +Œ gZ s*HA±üÕy„ °×H­lìÂÆUltÐê»@2%’M`aLów#‰0¼@äk~w-’}ãÄè +9’óGHÆ@êA¹-_ 4&sÍm>.BÉ&öûv8D‘Ä?¢fc _â3WµAð¦B; ¤,l5‚×h@£3°ù-šqÕ5(Om™ ånô" +‘ïcPy΋ò(£cû×ÀÔ0}OÊ¥H<Šì·SZnxÙgÂP°hgÃÄÐúÁ·¡Æ…ƒ8‘2Y •V¹ëΘúOffy)‘ŽÈ–W …w@KÅqG¤¾šÂ²Ï# ô£ê;¾@>ÏR@V q-Ь–M¬Ú÷CQnòž 4c¾Å”ÃÞC ªóÿàÍ逸ô»Ö¿ã"m\…åB~C™•yrÀ†Ø,Êa6²9r ëí)Nèr 8ª€ÿ!JÀ $š‹_*îޅ`½€öa ˜K“%1ÐèdœÐ‡Âà¿ùr'gâSÊ ‹lddۊ2ýVbsèÉlÏD˜Žc˜v½ jq ×òbú‘"9$¶„~tàqRQ’¡¡Œ”%û Ä<ÌøÅÖª?¬XK"“ƒQ‚—F؅*:"ßØjD€¹Rb®CŇgŒ53³% H3f5\5â˜2I þP ¤\NÃOˆón¡ +A>–PJ'dRB‰¤úÉ:õÇØàA8#}@´Î˜üÖÒ­L’MhìZ™•#‚ ²à˟ړ@‹IGÍ‘âœË¢¤QìóA¡…ÎŒ_–ížnÕξ÷_94H²Ð‰ØL)©>…kR(T€X?{¼z4Ì-° +­¸Š·Â Ê:' œ’âKgԔ¥4*KYBvŒUrÒ ó2p^ cŽkº· +gru®F²ó& !󡉉dôƒù¯Ò<»#3c+7‰>#*€3FÎ,駀þùî}gEäyêM6Øn3\ +‰ìÉͶ ¹s3^q1ÃÔí4KMyãå¸v…œÛ½ ¬¦[íGRÔ"Eg¨ˆ D²òø%MÍ";cK”¤4Äi&RhpƒÀvtúè/Râô—I¤Â’˘þô֊<þȉÀ2SŠä ñ>¹RzÙS@¨§œ0üEس-cÎóÔ%L¾J +–wxl €eà§`R³PЀœÎ:Pbùx€Z}ÿµÍcÊv@_ÁÃ^—@Û {@ï)9ãZʳ­Dá€y¾*Œv”èØhã|6@+ä_T¯ÐwèâÆZOz>S…r¶ Pè¨ü °`ô y€ë†ώ¯Çñˆö›ÿÊdCaA¥ö3°  ÿ|€Ví ø¤4·J·1¯r€y² À½Ç@_^· è@’™J~+*tQÛJOçŸlǗ c +Yi“Ê( ¨´l…50eÊ&ÑF€$™Döï¯Â&àÉÙ©|J‹Õ´­^ÈxÈf-£!`–ä:–ZŸÚ AW1Üê» ©êBÀ4j? J úê°3„ªÈ‰s[»ôcßOÊP1u€gƒÏ9@S ¯8€™ÝžÖ2½uŠh0=Ùӊ$ci•ñ ð#î+½{˜ÊaøJ‘áKÓz»×àY‹&Š2rÊéYÎTd2úW©)@)ʯXÜ%“'@fA,tbg í–mF`àÏã»l±ß«éGÔhäxò™¦Í® ~L#ÿúöÌQ<‰•Cºº¶5ò!À¹ C”š’>Z d,/€xÂâoX_Ëݲï1šŠx'×äôXhô§Ågå/í“ýT·úp`NÕ¬- C4þÿbŪ&‡{Üvª QÖbÜOFO¸Sh¿Çò©« ÏàÅm¼6¸0Òâ`öˆˆ>†P3³ÿÿ/.Þäé/쩽ÿ¿n;ÿyïÂ\«H³û?‡=Ú þçî”ùYËœgXQªOÞÿe¤¾îößX0[ÿ3úO'N‘ ¢NËn2~ŸÿM uúgžªRÓøÒƶççÏø=ý§•oô_u§´ä¸ÓI<þwå (þ¿føß+°ƒÿß=þýçuýýóÞýGµpîÿ½P·ÿ¼×z„Ì%µF–Ç­':·Œe¤ë§?ӋœÁ“£¿è‹ÐŸv´9ÿíXkϛŽM²_ûû»w¿¥؇)Þ¼ü;$VE»£:mnå?söÏÕþÖ»l÷Tˆ9?q5…»1g¦–œ“ýïE¹ƒÀ#÷.ðÏrèÄsŠ}?=÷JsR˜¨¼÷o«8£¥Å=6óZ%ÿ ”¥Œžûï R(¾êÇ/FJ"`½ö[‰Þ Ë{Ðà-»Ñ”ogÿJ{—u’çëôÆ~û6Dê «~G›™¦~ßjyÄÆð»îI©ìëö à§ß§Wíxœ¿=ýN˜•˜4z›eHw+´yɍÉD%ÍCÿœXݍ+¢ÓˆúÙD匟ìX]²{ßN` lü•Ë®†ª1ÕTÀýò»(ÐòGiß +ÔWþôÇUävDM}cÊï¦Ü)КÌðü G˜œ v¬[0œÒԅóA}¹Ä±müýžækÀG§p{=`-g¯´¥rOfþ»‘Òžz?Þ?jçRsøÝS,oÀ­h9ÿ}ÚN*Êßć¼c‰xY^[27—ÀéîìbNØmIRä:õÝwQ¸,Q¡B“é/ÑwQVºÜ$çuËý~KÒ£Ôÿ™ä7èY¬’oŸÙì¡/ÓÓb·_î¡LŽ`uÑ܂`аŽùžØ‚eŸ¿½Ôr.&œìsÉð3Yò»£¾db؞úõ}úÆqèõ}WÃËÅÍ›"¬¹~uŠ0Þúa©Æ2Ìj%Et€rÖgša¡]†] ’áÍ£¯m-Ñ̀۔Cu¯~U  €_îzw#‰Ï/ˆŠ?}ûÞécß›>‹ýÏô¡(Ó¬ø«s—4lô…VòEÿèS‰þb-Ø:½_¡?.ZB%­ —@ßη‹;`™·çÓØ"Ýj¹cä&ÏÇj‹»¼€š_|È"þOóý¢³.xù¯@g¾0~vBÒË2$’øpˆ_ådו$²¤+ù0æϾg×gÓX¤’G{4–Š±Èc¸ô ؟fà—S#’XOc¡ÊjåšG¿2çL?ø®'F®ß¡š„7­VGPÑ ¦šý¿w'Ieô÷‰Mš­Âùý>ªµˆ€qS|;¿7~002 "Ý÷î­{¡Êêûèw¬²õ}J—f©ùò˜¾…WÝA.q|Ÿ#“¢U_Í&}ï-Ùæ€1°ÝÞ»Y{iõÌÁ{ɛÏÉîë=ÈSbRé}ÖxÕ§½$;s™¢ïçN“ç}s¬ê“I•÷œÈÞCäÉÓ·ðÕ}—CœÃGþ6²ñD=÷Õ @'÷‚%Ž¥ÜzÜ'õF~µg õ#üք=U$Nªû•çX9Üïìmº|áÓ«j˜é%ÃÓ媷t&V˜µÄ„YÃÒÙ>-CðÊ]U¯=‰:Ñ̆gù„n~Â2WûÞ9‘ý` +ŠS9µÆA:àfö)í¿ï(½òæ íyè@û³Ç0ÚtöŒÞõf/«š³ ˹<ÑR‡—}›â.˜ïڅ +·bLöøê&Î×LÉø jjá¥tQP"ûx¨³ìkhˆ†…áº4öì^{¯5µä‰ZH }@­m÷zÆI4?¯·'‚ZB¬€“°aéô|m~'ğ¯&Ðu}äCÐBOr'»¾ç+âÓUã™ÊÎÛÂjÒÜÇ3Xýkšìi=ö0u`ÏHlˆŒzÞ&‰½Ë\:Æ.ëwßMÇß;ó¥p2Öª­×2°UõF-4<Õ`·ÄÈ^”<Ü¢zîÉ üÔ»…Ý*Xœ îîi’t¨_™d‡Ùƒú*0LL—Ü"Ëõ@oƶ4ïé#¯¤r§Ђ›ÓµÞô¿–Úp\i\?‡u U¦1}üfc~éÇ/ßÕIOÂÍ€Âl½Üýîdéèہ#e`£÷~¤¡yU²˜Þßxå6_ WáµÐÌMÖ~viø"8»¡o <Å4Žè¹Aҝñšm“Õö‰‹‚>zucBT%½Ü:ç-!`¿Bmவ è#¤nþyOØßϛ¼8ìó{³Ž|ž/ƒÄG 8ÙPóš"1Áiu›¹*üpÐÜh)#”ó"è êÁ¢ ÷.ÔÇylE€¡D9q.Nž™ºáÂ#üÏ8:|Õ&/ÌQ¥×N­ƒxgó¿{ºæG.¾¾ì–d z<<=Ÿ5z$&«7yf1-°&'Iãևy^üg±›P&Ì'·AGՐñ_>Þöòd©Á.o IFg,µ0‹Áz*^„qÔnùÞ¥Ü[ˏ0oï,ÏȐbyÅNz割ñpj+_<™­ò±-x™Êïu.%!ÎÓ|Ë)àÃ3ùMÍ—ü÷ƒ®ä×}©ÝHŠOHø#Ïf§y,]äI —ÎÀÌK— +']rƒEb3 \È'Úˆg˜bõÄýLÔ.Ü_ÐzcŽÏg2ÄT]>ÅðËÓABti„-º”4aÞøPT„¯ÑŒdD(ìT!¼^ªKDöQ#…ó¢Õ¹ôTW(Œ¶Â‡ + +[ï#a#XÓñŠÛs)9(Ì»dxHÙ,ÈfÂNH¸Âé <]†4¶¢zB¦…T%å…e¾™.JbC4™è¹qXàR =^’ˆËÊ ¢cṡS£jñº´<ˆ?ˆg•$*´tÇX¾÷ð„xƒDK&º`‚¥Aãç…d¡KUÑx¤”qÄCø`÷hIn„µjx2۝A²´ЩWàañP™ËÁ¡´„Ë”IZ}Œµ ¤‚Ë¿¦ 6;60Æ6vÔgëB¿^Ü>Ýëïõñ +re¤_ƒè+TBHˆú +/p 04W¬9;¨—ƒÛÜA”kÚPM·â±Ù¬2 ±ç¢ÔQ.ŽÜˆ͇»Žã^”i·óºšFÐ&èBÀz=>¼v‚ÒŸyç詸´wg…·Ž?lÚÆ7iؙÏ8äµ? ïqØi…³«RR*¡Ÿò›£9æ%Ð×W®¸eé†ÔÓ-¨EPÜ;ïwŠv>hÃ&–C\.é +fV¥!B­ŸäÊM7W Ç­"ð“›>;´lŠI5 ‡±œÊˆ¡òy^ÎzÍlˆvýXi`æ5Ë~¦?NûQB“7·Ì9ö2VÄ;õYîù‹n°²¯”ÁkÝšùqL°$y–=ÞQÇäÍôÞïÐBqþõCԁ"ñí fñ†ÖÃÏÌ`þ2M³h=$QNPsBܐ.VHFDŸ)¶ßÄ&M1ïTù@0ªQg±˘íá­I »Tàëq?Ž#‹_ûk½Zے’¯6«xvM®ß)ÂP¥¨D×xcêj›IŸK!èÎ"¬^+ ‚Õ(Í]óSXz™gÜ\íæ8,%;N¿!B7í÷‘¤þv¼‰Ëö,ùäSDßçPÞçO6x:¬BÄmFÙVلñ°äÓFs,‰Ær²a˜oeŒ¥²@çù+:V5©’‡æÉû…'P˜ÀŒ¶˜yOó´‚[ÉߌíEÆ£²éRÂ5ižõ` pþ4FM@ÿ…®t¿³Žb†®r-ˆX;”œ›j¶ªKþÚÈìøÞÀ +`qàRÜákÇ ›Ð-]DyçÒzŠÏvcCY%øŽX BxH'Д=9©&P'Bt*°äÁï> ˜eNJެa”z8L>tG`Å ’ïØITjö0+‹t›à(#ù;–`^”ïðý» ©•KÚ²m7Ùqäý¹AÇüè—Yï8ŒgžçÂƼ¦àýpr+ bà‰ºÃGÂʃfLë̕u?Ð^MÀ"J†ÖÚêz¸%‚¡5zµ€Õ˜M·¾ #c”ñW'æobˆœø\c¸­ê"ô¤¥¦àQù"%*U +åâD ¦ÈúkólB ꇂ-‡*]ŒfÓø“ ZxfÏÐ&äÔ®ö EÙÅiEº'y +´Þ {J&œ—Ó¥ >ÅdѤ +ðZÁ9¨7íà¦qð)±¿šqäZ+ª¸ÎhPFE°A~®Û Âê_‘ GHϨC«ç¤Sr¹böè{Pª!Ö%\xR a1¶îÞ?ú'˜øéí@ñfÚâdbõë=‘¨ø9µ25÷>ÀþsÛz³úX÷‹÷¬ôu” ÖD‹þï6P£IémI]ªÃ¡3óé4·a‘‹L%‹ +™Ø֖ècrÞÌi”uâwCÔÚÔ]Ñs€–¢,  Å=-Šwi“Sª±ÈÈ)gQ€až­üËàL1·ujÎêäR÷Ç‚­m}™‘dW¿ Èåîª~­ùڊ•ç¸ÝE©Êº³äÝp0È|jm]`Ž:±2Á6oÑÕè r¥í3\%†IAë×Öà\Ò/…ÿ{5;eÝUù] Ôà%ãzáýÔAi©¶–Ý{Æ¡ªé.mÛ#i'ÝãÍ7õeSʨ^—èŠ5»3ÖTÂ4Âo©æ!)ؔïÄ`ÉF ,0¿f{¤ÊÙT­S^YÉ̸8*1ÊxËváßG~®™Qå‹™hîÇ·\ݙI5å«ç•˜©:Pƪåé±)êNYï?bŠ%Bþˆ+Ão÷úñÒ'åI©¼‘ŠÿËPVÜX™1<&Ž·­üxýBÁæ¸æF–€LIëxÑ8Ecg¼ÑòïoEÞu&ϊV¸kO­é8˸x¶L@P+× r>Ã?¨³{*EèF,Z)"gåaÓ­ëåˆ ‚½€ù_]ˆ'}B¦^4Gs@ÝÃ65Óýï0Ùg‚ÜQ:6Wî]^EΞ‹Ç>-JñnHijˆ›¼ÇvX4pHé‘?åìÖ¼W_øWŒ½£§1„Л޲»Â|ûÀÀ•:uÄ®Qw呰յËÐA~Y©ùKË.Gw2ŠÌrOÅ®L½ à/L0ªÄ›ÒÖ6o'/YÿÔOdØQ #‘õ²Ñž¯¸lŸš\±óÍWÈ9Õuȸߩû½£AAÌä@c®Ê«üM ô§öà}Â[‘Þ@SÛÀ“”Ùºí¦ÞÜZ/ÐpýFhøtÒ®eÝgä3Í(g•VEdëӎ¬ÿñŠwƱ$ã¸r€ÕÛWæƒÌ  !=A¨9²<^òÄڏJCQ:i8îÉcЇ%1Þý…V{-nõ0Ôi‰²É?‚Çh1NE]/3î{)æÜà¿1,9@I2ˆI×lŽ Ëä“çQŽ‘î=ƒ& Åޜ°&|l#“üá¡4,¼õvDÊ/¦¤ÃqÈÊ ûñØêu4 L¹F1ñݘMa¹Š­Ÿ¸.Âáp¯Cw…Yøù©„ ÏKYjJ·‚ŸûôE “0t·<<ê:­~ ¿.ôžÖ“^dT1#S(X™Ê‡f.Ø© 7Ö9ø`æɗ•º!Cß¿»dòm….u\^‹‡ïmHùÄ\åL®Y˜«H`°ÒƒMdäJ»¨kœjlÛ0Ï„ö…­³™Ä[^°47˜ºibÔI¦h“]ׄïÃK_¨ˆ„…ŸbcŽ]}_í/U¡ÜHXɬX„É4ίf—”2LÜ¥!ZŽgzhÊj0×C3†°|ñMÉI9Û1£bE©ë¶³T$ÁC„-|"÷° d±X(6Mπ´@i’H¶õ•\škKµ=¸ÖáÁµoÛ¶m²'f>óîÊeA¸Ô{ÒP"³Õ0b +Ûø¶ïû¿ûÿ'ÿ¿I$_ɶÉQv¹\.—Ë7Ô ¤GCiˆLGÔ"¢V« +lÛÙ¶e¥mm­¶m ¶ö Ÿ°m—mšÞ Ó©™ÏÌ|f>3'ÌgfÂßþ÷4t„÷tw¢“Ñû¾ï«f0ý0øÜúzo• ¨®8ÈUlØ°Œc 4pCoè¥Â bÛ"øÄŠ +n Ì †Ô04ž¢šøþ«ìùŒïö}× 3̼h\ÃôÆ#7ºýÀæ\€þ`)jÞ ¨†R¤¯³dÀZ"ʐ ˆâ1spð‘P8 ‡ã!©ÔCï€$(`&@Rh\N¦Ïõ,‡ !„cŒ1`b˜Å“Ê `ÜÆ<Kô£r` +w¯Ù´J•ñ²y}ƒ*2SÈw¿Om§ÆR,’H¤ îOàü›Š¼¨=Z ¨ü&ÎIu·MœÁäRh• ewªö`‘^®&¿ùÀޏº•ªî ƒê›ÙÛ6ó6²9Џpq|.#{êÜåZè &<.ÞÛ$Æ ´è^ÛP}‘Íë´-ò覞*(xìÊ>Õ2 +pçk«äLŠò˜m½‹é „Q1È´Q²®ªö¦ ÄR˜©)l$©¡/=~ãŽ¿Õ @? : |¶ICžÈE_2X¸³·GrF Þâ¨kEnö BâXM©/!H‘ä:(qá9N\ÝOšÿR.gÍô5eÅМÑåzd4±* iÖ«¾ýË£—ߏ +êzšû¾‘׫Áj¡&ú˜›[¹J`•.u(Æ\;õ†Í¸šþ|PÐw$8)hŽ5½[0ð)iƗ'"­{cIE^¡6/v¥½€!^[”à¬Y>]+}I +ÛU6(d@B æ̽$‰êõ¡{¡Ñ°¼è½Ö)…‚3t¦ðE±h‹5U×ä`¨ÝŒY`£],ƒÚaP0Ugì.õ‡Ëôb¾Ó§mk2IÈåHƒ› oɱùɄbðíû0'’û°«Y·Fí)úÒ¨ Ä%KׇuևÇNè˾:È5Ä#ä+.r«Qfá˺ÔèØ7R žXì/FWˆIi>êú84¤çUwg戟_ §ŽP³3uàÝ|C¦‚Õ*GáYQ—Uf?|õ¬ÓQ”²<©i,qõ&C …êéR&¼>溮…;‘ò"ÚBL}ˆ2²<Œfq?GLÛuü;~ Zãÿbª&š´ªv»äªc·@G ȶ֒&à>ùÊÅÌà/·Ã‰úè Z©ØØzäý`YCŽC4éÒMl»•Â"ùÝÏÆmö¾œ'$Yÿq$ƒ‘aËé° M<€K´óÕH†:!SAýÂx4o‰8˜5èØÈa¾CÕÒň̡g7 ÑDŽÃ_sÇÏkãb—bðOãq’á þœdþQ}8IøÆ…× “ó9P-'ÊéÆŁ8eò»xRã©íÕ­±®)¾ Ã÷^ñÿßpÜD&ùÎ)¡ë¦qË‘®ë„ÃßÏ7]5Ÿs V§F²Oš‘}(±»ŠI": _”ÃÕF*0y¶Õá?˜b³ƒá(Ñ µ”[9 µ%<›†d涾¹$I֖¨xÓ¸íNs·>Ó® {C 1AÚ,ŒÅRÕ·•Â~&F‰8ë¶])H¢"Qçý\U "ÑÆ`ÚÓ븸3´  3v$Êtíñ4HT5 êY²–a›)¢µ6²ñ;Dçt½ƒê¸€µ\ ÕÊ`–“Y™T1mñ!:°àOé>’0`ˆ|¦þ€_ÏTª22©6F~F>ãøPA$¬Úìé!ˆߖÑaP½;‰ó˜f’¦Â“¼ÃF\¦ja¢÷5 +e@7¢ýŽÈZÑ +õÇ!+S.>°´›„7âÖïàÐPûˆ&’øs±º79Y㡾 +XO)`Œ•°Èæý´3T›™Äàk0ªy7²E䗜rº ¢¯ý·~b`…È'ýW+ÀÖøj µË¨°85F;z„A_ÿE…çÄWZ XY¥F…ÔûV}èá3ФHÛ-À¥:@Å\ú/Ÿnó/ôuяLF|!¾€²ºh´#6Âýÿñ®? ¶I Š¿F;4˜ú/yŃ ô_:Çïl¶JBÝØçh”„à¬u’hg›úý·LÖèAlÊMe/T‰¥.Ì`^Åù +µœH ˆ4$aák‰œ’„K¯ô‹gw$Ì7Äüfñ§ñgF)S €Ôçì%¶Á°ËYyEd1s\娹C-+ýqs¸¤¶·¹¹×¦T_zFk¼;}Êæ8Œ‡ð±‘K±|y¨ÿsÂd:¹žµýP +Å÷ ’ï#Ѓ"Î/×Þ莋êk݉C´%+ÔN2FUèq¼åNz®CvŒÆ9zqcûŒƒ´ãÇ~6ºRÿÿ"‚X[ÜúfnT)®ïåݽ)d²û Úð5|ŽZÌþí .Ãó3>R4J–笌¦A/¬Á!̎P +kšÈ×Jœ_”¸ Ehæ^zâRO‡ïÚr+ò@-•.9š—$c˜}‚¸j,üj¦³ç}´È,F7Ê B¿KRb$1a`¤r´Y°b´– ‰lýA6±ùåH–îÚ°˜-RҁÚx1àͧ8kĉk‰\æ¡Ê™L¢ ´_™À€±VµØ(n¡‹ëZíš`(þø‚èמµCËißm¹DI+#<¨v§ +vØAcRï éí-·R•ösš1þ«“Œ‹ö”~çAjßúW‡± Ñè3‹¢ÀfÙysØ$(é¨þük\½É¿›òû¾hØä5׌npÐi‘ú0GŽ\&zzè@)F_¤½,,ˆ[›HŒ¾ÆX%v0$(Ø ¹$ˆÂc;$‚K¤èŸâ^,+$Ó\ð§¾Jw ÙBE²0. œ1%J•ó£ÔÚÊ/=1U~ÿçOñQŸvü–öËÓgÅ-Ną…ä6ÁïÇ-6èù2èl€s° ¿g£ŸZÖ¦w½HÒ¥Ùðe‚¡Ýño£ÕdÈå"Àß9 röT˜ƒŒ¦ë§GÖËx¨ONUT=p‚Q˜À–°›ZòKœ&”£Ï£òÞødۗ ¨h/Èâqƒ#Z-³J rÊÝê9*3þ· '’@‡ÃæђÁð‚›Æ0 Ľ¥d©.BR”ó÷êk´y^å¿è%qÆP»ùuqœåۏuó•êÂ/!\UÎÝ9‡1lÝ¡H·DŒ½‡–†¼“Q'7Ê'̅|–ãì/Q¬îÕ-C¹ÝâO­*`—0Q1 ëämß# cH1¥Ã1ûr˜Jì^Åþ‚S5˜Ùõ‡ôì6bð/b•]y”0¶ bÃËY6™{æ×غ§ùx¬ëŸ·+;è¥1à”ù†*ÉA9¬iL–™ (ԖGµK¦¨Y‘4( Ò —=›m¾‰¸#pD.《è‚èp] ùÅ­Ua¿jAHèb¾ æ é­&m‡6ø}¿áˆ…_ê|«1 +ZÁá*6AHä—t/28^H@Ð*õÏd‚s§§žz-‰k¦Dš~ñ(ñJNò­s³;0ô-(=ÎÒi ÐUætLkíá§ù…%"´\uõŠUÔ&PŽ ùº7´¤‡FtСl|] c`Œ ÕBbÜ­¨Í8Í(Ç~.0¨jñéxˆÊd#"åG=Ú-FÂl¬–àÀ{F”‡ßŸÑ€ˆ|ÛÏô}ùv¨ƒ`ßèvŸôÃxqr;}æ&‰ý}l‡ša[üVD~ø¡l5ê"ŽK–îbb’5Øs÷y2Èmô‹q“W¦² ç©òŽÆ°Æ;_G.âTà"ñ±Ù†âáhÿoQ7}ò±º«f¦EŒ›Ã——êtہ!ô7\ôgxçòx9¾%,0ÖÐ6ÀW‰m/-’(zÄëíé°{ʀö8¡ÄC±o[™ ßÿ À!Ý@@âÛïѧ6¢¤ÔŽ}·bR%YVFþµà|µA¥F7í+p$ æ­àîÀ1š/óÞ̕Oçëãx«±oËõF?æ…'+µ¥=ÓºÁɎK*–.‚k¤ƒ©ÖŒš&ü(²œaÆé!²iøÖ')¢<—9Á( + Yœ~¸°£D0 RK\m"_]Þ¿Tïa‘x\DK"Ú̃RˆnëQÍ"¡ñ°‘RËI‚/r]/RêdÀ+p©Áa÷•8 ª ë@‰ÎÒ'w²QàÄûPpú Âÿ€j¹:A9Àjƒd8äÍï|’¢Se‹UÅj­á!”vø^©~#9%ðÞÏA0>\!¬špÁ¬Ú_c½†»³Àó§ RôúW̐õËKvƒˆ6ˌnFˈ¶…̈lÔä§FZ³+Ql‰û¼Ÿ²÷ õIŠûC&7Füšä¾þÜܷ˘¿4„Óc<ˆ™šëE•ö²‹½¹r_¤q̂t=Èç덌’”›\ævWzށŒ¢ÏU•3®¿ÍºŠ¹+éw—_GPÌ óìßGöë!ÕH+]@ÔáXäÐ2Ø*51Ÿ0ßø6|?åmϳÜSWÀàШœ\_ˆñSùˁ¸çØÌéZá]F¾R¡§ +—hÁ§.@VsÉ5O|‹ªÕԁõÔ ¡2#Äã—Äêlq¸ûäˆU0NÁ h•UÂo¾h’탑†í1˜A:­"5øë÷øûŽ-Àq҃›?0Œ‡Æ“¡¥D}¡x÷¹¸ #ÉKI¦Žœtù.ÿËÓÆ%MÿŒ‚CKt™‘ïÿj|Çl¨Bî¬{Ë»Ü +ºtW²¬]–tYŽø>Æ]Ž>n_m^FºûðP:ËÎÛg]Vbºj#£äÉô³d\<°V6¥œõî2?¢ÀØâL +EMæx?ÁW¾­crçÍ3ãÉ7û–Ç&õ¥zud(áÇÀÞò$Ææ4\NÓܲ:dÛò@Bì©Àà„l;bg ÄMï9'¯¨ÛXڋ«B¦0YÈZ˒kz‚0>êöcšV]Zdº/:Š Í=„þ×ep·Ì=ƖöÅU™ •ê‘R$)j¶W4k[J€:]i,f$¢3žk¢Kê…:–qïV¨êú4ôÌ\y9ª‹©É°¯y•ˆ€èâ†qåÅWriŒlcË;ÑY‰ûuyç|9À ¢LÒ©}“ŸùdìàèÎp̗Lò1~W‡Ìkà I̙tbn裄'ZýŒ…¤ô ïLjJdS1gA­ ŠCدbz<²Y+4XqcWë¾t¤ièÞ Š†­Æ ¼.i2œG<ŠÆ>c¨ˆ£pʝéÈH”üwäÂjuÃÏj°$œ%Öù`Ic?Ã=èbúàŠ´€ž‚•”%€=±{új€Æ¦-­t4 —cF6C֙ðý(?«Û 3u{ •Ö¦ÿ„))¨-Ë9]P\îó•Œ{\#¤Â†±K”²Í=Ÿçîef!ùû: •°fÎr¥“ÈÏeky÷´—ðxDK^!¿õthՐŠP^ÏÍø$–©…3dõ3ÐkTâ4 +­LόüÃáa0DCY'ȓ¶.†OFVïø5;~VJrÑ-$u1„´P)›âºuÜêõUȑÿ³ÎD8͎ÁzWgf0é+ǯ"ŸËÂð.ºmÉtYÓÀËÔw8¨Í†¨lQ•F ÃTNsÀ‰2NÉBÙð˜µ,¨6îoô¿åHPöþ³?)Ðþ>6€üe}¢â1jý²†¿´OÌ‡•4ÿ¬D±TŒË8»°Þ¬ iÌÐÀgq󑾄8ð—[Ôo!zôP+Rӗaš$ +í4”À9 ßÙÏø¼/ZS.qñþ}•£[Ñbüh!¯!D€Ûů ïå SÎsºi?ëì­½Yd%LãúÛ¼—˜–"´pEÃÇ™`ùp8¼ãÕß(½óê%1ÒÐP_A«KÌAMªeŠBÙBØ+&,‹6šx¨ßDƒà.§+s1@XøGö`Ÿ[)JãɞÍIÎ(øÞaü6§pÓ}(ÿlÖ@d1³¯ÃÚ÷(Œqm5)ê–å{yVqf#Ö³îJ)úy'0OöŠ„ªC7Øù¬F/ãOBLaY!2‰QÊȸ‘"NE† +g¨Žô8ÊDúž "]Ñ!‹<>èЊ4þ¢k$”r4h¢ÔĜ*Š’dÍH:󦃽MÏE´Dò™'œp“:L H1`Å S¡EnUE¦MÁ(† Ä,盌¤>Û£50%z¦b^£ê|?ØÈ_>&Þ¹@ÿ:-\ó ¢ö† ¸kÊ^Cä{?ï}sñƒÿë,Õw°!ý½üS¸‹ á… °å5ÛI¦&€wЭà7¥Ñ\¨¹×Áㄖ"D2Œž(üE™¢Odƒ¿?¹¿"v…îü˜2$£•‡:íu°}l•ì= DýÍdŠ tgúÍÇܙÙJ÷1z}'1êk/¨0aPíµ2±ƒÂPO¼?‡£mPŽQ +Zò—×j+#˜‡¶`K²ÃCÈûjJä±ò$ 0>@—/£0]KGÞ3ÕÂèÀžz<^•p TTº÷¾Í)Ò¬äaÍÈǬX|H,ÃBwôöÅÃbùñ&3Lu-]„"“Ñ)T4üa¬”žë¦…Øa†2²Ç`ь±1´–/pÄB¬rªP€Ö(té-Ä¢HÙ2«jí€ ¹ÁÍÎû·ƒ%mÀ²!/ón÷Þ.lô On×,Usé3€¸ÚS„*““t|Ÿ€V*Ðįþžø‚0»Í-¯}±ô¢Zª­–°ü–ÓæÊ¿…ù÷q^Ý»¤Ò¼Úg„Y”ò>tZMo橖>ønxMg—ì…©‡°IG?%Râ 9˜¢žº B5„|˜í$ù>è:ü¾£F"m!2¿x†kùóÍmJ ބä +ƒòØ‘jDW€CÈÖ´yݗB¾!Q¤U’lž@p§¡/lé`eZ萘MÑ»pg<ÌôÐƂIZ‰6Òu## Šô;Aû²)'4¯í}Dç®™~L¨¬

„Æc7D½3•–êW¡¯š27Vº  èpc§ÌŠ` D•_ZÏnaÂ(cRsÝÍw0lV©§1¢4a¾ïC]D=¢ÝšlGÔâ!1Lµ¹,a£Õ]â¤Fw 00ôw,ŸÓêC#žB•ì.S†ª ùW“HŸÀ½caG^úØ!ŸÁ:>lŠ“À©±ÊÑ®Zx䫳 [{´º4³mŠ¥~ŒllN¼@f·V€?¨ ^ÃzÜM î5ÖS³üg u|¼Ú%ΟʌPø¾Pž&Œ&ó_eϤû6˜¶óyÈ¿[ͤSÅŸÑzuì&Å ,O‡t¼+˜‚/Ú"|ä:¡×þ(rÇô¢a¦eó"t¥-Õ¾b‰Ä60}’”ªšë6aj­3`“‹Â©@)ß!'×Ì­n$8ëIØË?Ô¿„1H)µ#»ú=äqP¾Æ¾±!ϓðQĀÒގ® IÏ\©©#²×¬Ws pƒà„A4€Jj¡AȧÂf–~kqŠA˜CÖ5&àyaà0–³\%F\B­`Ì%„ã£Ó£"¹ƒ6£H–“¬‘êL3Ֆ[ü¿ô®GN{™„<›2¨¿e¶s«y4ó¨ ºY.‡øYÏd2yU™îR„"v“ŠL¨ÏjA~9g]YG[Ã' +…S%ùœ— +›&Rá’`*ïÕbÎúW† é3ø¹.¼k.&µ-n'¹f›E’ĖÆü^œÜ„Fæ]-·[ü@ ('œ¸Èf¦a¢Ãœ¯2½N*Òtë͝o¯\ëœÔá]×3sµû1°Úë.a&cýº`œrU ¿Öɒ Ì¿C1]=¶¾–ÖßÍ×>o"‰¯‘Ñs7×BC§Wp‰rMê‰c,êö° G{Ê÷=ܽyþ\Mq"Ì>º¶Ä†Ô9ټϵ›㋰ɛnsÍp/ã”ù³\)g6¸Hjr$1¦5ԝÃWÆN´ÐŸ7&Ê»5¨Iò3M(Ëå¶ÆÚ+–'ßMÙjkNãï&ãxI±5RJ<㦢$ë;@ôµö½í9:)Ú1ǬÖø?˜wyFî¥Nkäw½O^/3kØÄÂn8X¹¬qR£]#}¤Û•5¢U––3Š¶LBÔ:H +²Vós(8–Ì5k]õ^èx%îC kWo‡^ëÎ.|¬õÛÒ}Ê­ ª:näÔBñzѝû'i¬½šöåÕVy`ïjÒÀºÚ·Eʉ“JzVs5ò<»;•ÇÕT҆†u4èVr4—×j" ½€“!¾¯ž%Ì®ÎM¯6&ʈ¦[gA±­ÜpY5ÐúV)®j ΰ•‚la[ŸÖw·ƒrTMëa×RV˜‰UÂ%-ÝÕ<„DpAµßXŽð—ZDE¿§VÆ4ªz¸f·S®5ɩɑ¬G’¢Kt¢öéemÌCÝ·„\ CÍûFr 6c¥v⩜V¬¿£¼[h@3É"ÔGó±2öíYì"ÍÏ슚ɔdE–}rÉë÷Æ­µ×Iu 5»ç6˜kuL±r bÃl?U*@[PsýÔ²Úg*1Wg>¸”¹jј¤b ž§£EB6ˆ§—S@Ö;m_,Eƒo; D«÷¦/€»×i*ŸÇV7CþUKýÜÌàD §Yî#W×b1·ß4‚ —ßnš‡\œ4Q)!¡eJ¦Ý¦h›M«4ÈxÚ2„¹gw oâM¬£1íÔši¼Ig¶dwvP4‰úÜàʀå»åz.Ívs=¾¥Q@AE%òPKSg¢y–FçUð¬—dÏ!Ó*[®Ââ¨Ñ¥ ƒ,ž&bk•ã,Òły•f{˜‰Ç˜l!ÖPD›áPG¸ü0æÕ[íu‰ö,žIcFU'‡u½¤)Ú³£ÑLM× &µ€ý®h ôFõä)Â!`ݖið¿œÛ9"x5²è^H›äïAšøó†ij¶çãýÑd- >Z_•¥·í +N&¸<š>!»`ÝÑd\V ¸=Üç°ÖÑüècúõ¶¦‰‘Ã5_ÂÎe´) +îL‚kfÙmÕB2ÛðH$Œ…ï ï‘¡aÝxWÀü¢ uzèsuÑÐæØc\’i`]Ä)ÚÜ8«_ÚDàÆJG£hœ¿&ä5Â7Iݘ–Íâ5íç­ƒ' AhÒ´LÀ>áNhˆvø¾¶ùŒ‰ Z~ŸŸyÒ±ýŸóC»ÆiN_Î5¬ÎA ¦Å°éíh©¢h¸¬˜¨n¡9¿Ñ"µG cDКðÉ[šB_Å-%BhLËúdÉìׁ³¥þO à)£í¡²ƒ†1C³A;™yεì!¹XbD?æ—´ælŒáÐÑH®wCºÛ{D~æ†÷/ÃpYšZ¦*Z¡Nþ™i‰¹ä“bÑ >ÉThÐð83Å((+¢ dHÔûŸY'Qÿ ‚ªÂ÷gÀ`Žç—ôQåùÙ鉄Qòâg‹‘ü‘wÌû>ëQµB…‘×>#9m ÷7Ïz Ò¢ŸMŸÙO»@()ß±P7‘)°ß3õÒñÈ†î™ <óÀËEbø@|¶=#ÚÉÙ3Qr"ã­1¬r³ +ž-ª]¨þWôû®žýx!¢X”==ÿ!mÌ-hL+GãÑóÑ3"–6çLQžgb½„_ÝÊC­y†çè– ‹åÐ’gÆÏÐøxˆœ ‹g \×ý¾ ÏÊ g‘ pqÿÓ&íªëø“ÅòwÖc£¹rï š³»:Ñ¡éEÄ^sg^Q΂t[ü0âs~Gì×RøÓ:ó®£KC±–ÒÙy]ò:£³hü]þºf¯Ã5A7gIdifèÍbÜ{!0nP–9K/®ß"kJŠÓ%G|NÎzÂ-ƒ±Ãp<5%Ÿûgž©Lp 5$p–t¬1Iþf$ŠJ 2§ 'ÙÀ$“I­[ßôæf+>ô¸™" i B‡ñ* +c×ùÑµ øʀ5ìASx»kt +,êí¾·ª ¥Èh)›)‹ +nâY¹ UFPr­Ä^ج3À=· ™¾Ò}Í8™2¾)m>)úvÍ,;°À#°˜ÌÈó;Ø{‡FZwÛîÈ5/i¦k#f ÅÒÑÌ,™‡uõñMú©l"_TàŽÐŸÄXó©g¦l]­<(š'ø¶3#}â~ôµÎ(.(‰9ÓtQ˜#‰é2eæ1‹Ìj ꒙Òô5wŸ¶™¹Ë0)Cœ…Ì´aZ?fW±È¬þ2}¢ÿÛO¬8„ŸeÇìÆdNÄژ}G‹wŽdÌì˜y§»™ LpM.fXOS˜™”pü•½$Î uüÃ`YI`EÔ‚ªý§B!:±q3µî»ëë‚MSC˜PðÀŒè²àá$4‚JAf®(;qY›dæ|Õ£eFüËÎû¯ï¼d[¿ÌŒDMt_f?óeFœY¤ÒŠõ^¨M¤¼z™ñfJûôÝy™´XðF½7/;Ä£ûw‚§{-®––¨†=ˆ ðqÍÀ%_3÷cÖoú„‹yýѨëde½÷Éi™o˜&WÂYåÚ[ÍRœn£½s½¾IûJ¥YÇã+ºö[ý¨.yk·®YFo󲨹š·Õe™ûJÂùëTªÐ½2õ›ú¡æï5ßÊ¿ŸeCL6³eÏ&îÉce.}Y}B + ºU´8hU†–o,äå„”Ýj½¹ˆV*«>Bý6~Öho”Ë4Sѓöä!QU:)³_ ‡!SÕàHYßëÙÔ3‘,¸Œ¨l”Ùÿ;H&Á,ö,6»ÝUÜÔsQB$ʆceÌÑ% e8?E7•'ز»³"ã|º_';Kޖ9ٖ~ŒÆRæp'ã…LtÝð7Ù¶ó'Ӊ•d1¯ Q™,žÒõ\dx5¿®„ZétÒ3tLÖNëü¼-LVT¤DÑEÉZÁ蒙”¥}Ê¢™i– Ô.$]É®ô[|ô T^þyó©%ñmJÖ-—HãÜs”̝J¦…àþj>Éì’gŽ:^‡ 3«tB)Êñ~dÆT¤“üéŽìf"»fåSŽ,dž”"MÈ·|ìãC¶J֟Š1²öC€á°9ÌýÍ/2%Û0°…¢Ú!œ=ÖµVåšÌ]zOdõž m‰ÌÒq±FdP8û«£9òoYUˆŒ.üÍÓ=¼í $èÍv²þÌU´ ™F†Ø?°T´4zAv^8S¢ÑYÃCT0¾ÈúA/MVfp­bÌ£Î4 óGa›·pô‚ÕòkJ]¬X±Éܜî8•1C(ÕlÀ¤÷±%3ž~àb·ž Ò=gÆßÆÇÞlƒ‚ì =ö}HCé17ß³ñ6„ÎcY€ +ÔJB„ÛœX{±¾bð‹-©÷ü^Š¦ÞWD+óˆ×‡cXA›sDÇêz-!’}¿‚2>ǘYˆ®j DB4}˜}ó/ÇNå×°1=%Ö;9V.t×do!ê±GaÁa*ºÈ»?‹ªäu8¥îÉ»¬ÂãÔ51á_‡Éšˆ°s2\ºÚ<îk1qlLña‹¥Ž@‚ÈÂŔ-·UV‘îQo)Knðl¾m–Æ'üHÐ3,€c%JÀ>ß Se:©iÀ-¶>›¡~Æz9,劽Æõˆn°]ëÌk¬ŽM/ax ±°IAù‹9ìÜTa@:–¬!©Åöc¤LC˜8"hb \lØÄÈ®¾À¡²Ÿ!ÛRK/Œ½<²dqÝÿヷÛÀ¡Ùþb‚ x ±±¦½Ø ǚ“ظRlqcƒ ºëbÐüž‹½[mÉr¸hà-V'Üm1#l×bU QyóÚ¸«Žž5C®/o0Û¾Ä ¸9\ÑZ )@>³ª˜y‰ØöÝ5¦bÚE&*FÅ‚Å®Ÿˆ§êPéò°£xCɟ +{…>ÞP¬œjX؀8$Ö±gè.ÿnî§;1öØ²+v¤Ì[¿àƞ9±l.[µÞ¸Mæ qï‘emrÂØQvÿ~iŽFéOb^h)ÕáPøÂ_p¦!_È…}o+¬v(k;`ñ±>p ¿ÈÕùº.!r–˜C‹æ4Ûc7kxT‡®‹á‹˜HfҚ€`RçtªJµö|=ÏçDLHýõìk<\æäa1SÚJ¢Ö‚XKá< 3™\ˆ‘TRêÓÜMˆ€˜µ/Ì'[—³JöˇTcit¤´f&x'SÕx¦ø#¼©‚ª<* v¶èP¿‡™Ì(CÁ]–„Mëa$7ú p Œ¶]°0à‡ÜHþJêâa¤(zL0Òæ¿ÃêÀG`ú:²È=ȷÜÎ5”âì*G¯Ã*ª2 kaõ«¢¯ë†ù§1#VÆj¦ _E¾‘DÁx‘]6Œ&¾º`EË×0³9Q¨ÔðӚ"U$!JBS¦ê_ ~(î¿vÊÂa>B˜OvÖ®ˆ8ì>W½á3 ò€3 |ôÇpšaÝ«˜èí<€ÑËY~æV§Óþ\“aðU‘MüÂW‡'G*¬ß„…“}À%b1L6-¥º²q†aoƒ ;á\8j?3Žca¶uÒØ´“gÔ^am|ë%ï ¿Ý­°®PÄ  zk<®2ü}Ðõt7< + ©7¨4ÝBaWR³„â}ÂN¿œ} ÏPí2„ê„}ãʁËcX™0üÛrýãÊ0O”Û0¯-² +&Å âñ¿ÚUÂÂЖJU_uĶtøaôfø‹5‰ˆ1Û:â@˜Ôâ²v·QóK1ÏS·`~f,×M%•YðÖ–öÝÀ<ì˜ðýA‹.Sb,7mû°\0JßÈYՇ.a›[š—6#$j4ASô†!Ý ˆs|íìÿ¶ˆË×Æ_rÇEjGW0ƒ—“âòa¿Œ7ÏÖ;´~›¦}<Àoµd¸à VÐõf¦ˆV4QòúJðu!/cÀ”±£C +[³è¼ïjÖ­±g¬%é˜Rn7d”c Ìb“ß"ÛäðB +ë³Î« œQwÀ10ÏØüÖ>:L¸juFjVEóUÎû°!ÜD§ÀÞÈ0(ô³â¦‘³¦³DŽƒða ø’ö +>Ã^%cJ¸ù/^g¶Ë»/sWL?vpr¬!—’¸ó­ ¿ëF§¹éd½&„!0×ÆFã¥|¡Þ©Èõ‚(~¹RÍL_w 8ӌ.›ØkL (ŠÔ™ã÷6ùé¢})³ç æ_·"ûç¤Z Ò ³ñ¯œŒ‚6a‰&s«¾*¤EEv +ÄꮾŒŒÀ6TCÄEsç¯+k–¿Ðuѐ%ÎV0ì«iw‚®YgéVIÀKô④_$f,!?™aNÖÍ/@•-ÇT¥Ë¯bMS\–¼T&×ð(ÙÓðk;XjÈk5€µÙÛ(j½/ÂY쾬‹{-m&¶eÆíK•q¨_+1Âce©AÜE VV ý¡©Ê<œŽ¾ÔüújeÌ°«³ë +ël⡸ +¯î岦…›DV¾~1ù‚+Òȗ)µ}|USÿ¬áZÕuŒ+Á2®šør“^s>DônÜN¸ŒÃWÜyŽ:SËT´É ­^0J ‡ÿÜ«!,ã^–è·7E*¯ýg¹J'åõfƒHô[ìÙ«[e¯Ñ«M˜ùE {ªD+ôŦõJåYô-ÃáPÂFG):þã¦`osì£m¾ãJ ®a" %(¦ÌN7½TÜ14!-i¶ô¢)”J€J WÔ#º,ÿ+éH×ÐK;†êô«–ƒû}“‚I ,Ryç¡RËêVˆÉ..ØøAu3¥ÓÂj€ÊàõXAfRAݬy:C}È«?^cŽs*c-Ø®Ob©{ 宧4K×ÕeÜ|¬xe"¢Ÿ¨uÄ?kž ph†l¦ùðÂÆèäËÀñÚF6vÒ5S-צßulB‹ìUþÞwAæøޫ2¹i€¡|×ö±v}iË!S"IûR}Œ ¬w—`Jk:=‘СádÇÊäÒõîu¹C}/CȸћîJ–¨µ ¥ßqBº +PªWî"{Õ-BDÁˆ4Æ gJ',•cˆ= + 2L—¿©Úr˜·Œî¢ZF•Ó—!{þ+_˅@œCŠÙТ]êݳ¤ëðìÍ.w²Éɸ »ìJyN¾{6ÊI—öìØõÕzíȸǦrÔO`ZìŠý·ðuþ"†Ëœƒ]T1»þ9©@ëÒ2jªÊt”¬ èRäºÐ˜Iü + !” |ÀȹêÂw•2®Å»»„¥k'½üºb~BñDï#ãv‘ˆ» “ҕQå¨ $ßÀŒä«4 @Ë­Ùy×*(“ÎYå¦K¥U.áÊU7û¼teì™s¾ZázfÒU†¶N厗¶QMá)"×À.烸rxk¢oßê¢Këq5·«y‰[)º¬¡Ö2q/u c5O쯬…×Q4*÷²GN»I9¾€Õ/™ü­ÐBÀmcÐkßR5˜m'(éÒ- Ԙ ú|`ÒCöïÍuØL *ùÚî[ƒˆZZŸg)¢h9¼hgvÍåÙ¿_WÛÄeµ²ÈR8c—ë´I¥|Ëuy»ùÄ7.–œåª…7Mé2ìšåÞVÓyѺêS›!PE'rٖkm 4óÇu·¯Có·6.»=·VËö“ÿ¶}ô¸ÜG2qÜ´;N…¼óâÏ<Ê%RØBk8èª5J߯,GȚ|Mð½R0Áöµtd¤ˆØ ꞡ/läBRÀ–²RžJVÈS@!C5}.ª’òdóÑ iÌÆRÁ‡®›?/7Π戫F¼[räÒA¤B0A1’2™`7üaֶˮ9+ƒI¯m‚²†ý#Û9(0]oyN'‚Rö6Bècl F]ñúo,Ϧ¢]$á÷à ¯6^ù ËlpÔ¬^Bæ5Hæ7DMª-´46\îÔâ5ž†z6wª£0ÈþŒ,œŠ}'OI¶®[/–MÚD*£©0(FÌKOa']f-àuì’9gŽz)8W =îÆ©ÃêÎ^fq6/pSºbÙÑ#ßLÔPE¯º‚^rfú‰Éó‘ëu¹àé¿F. ãáÆ©®\Õûžhª“„ÔÀ‘ž__¼4/å¤èu/!=a`FÛ,~ ºŽ7ÑN!Ú$c¥Ó(æ•72ˆÝ©…YÕƘÜÖëp#×$„ÞВ«†Âz)€u­Ñ€ÒØþÎøF¢å?7ÿ“wYéÔ²:Ü C‰E9e–DÕ +Pû8ö h:lN„½ÔÓØá¦kª/қ5RR( +Kµýf=öÙñKq*6ó³¸/øK”ÓÃcËA"[VèBM¶¤¥½ðþ̟§‹KƸRª£†m,öùŒìô½p´„J*5)öItnHýPK´B+ ‘ÈtGNïˆW‹¾ôè쥐OLiÏÜYB Zl´—…¾¢Ô5íÈëv"Òè7B;8{%o֓¦xàsçØà[è"çS†ÜX„›ð¬Ç¸X'VN€Þ…vF»ÝåÍ ¸& Ž}¡›U]˜ÂSXn‰¬ôPôðˆ_üÑK"è(x ÝÀQÛû±ká–À$7¶~»Æã«Îy„¸‰jðƒÝDgœÅOÖ°Þ_ê•Þ´ 90œku‡…+€•ʬ¡Z·göb‡|€¥¼YO‚nO´ª¼àyÒ(Våë‘tëFó©ÿ¶ebî&‰…\ ž%4ô½ª‡Z8<1€*>™'oFÜ\‹Ïö4ºó&F?.@+…^Ô¢Ë+‡[˜µh{;y$‚z)0]–¦vx“v'‚³ `‘®.ra•ö÷aޖì9îa7‘û‹IÑE+.»a™.•«&¨½•‹ë{“ÄVW&Vøø²f5He€‚1Ÿ]m~€@(¾¡¿‚A)f+0la1Y$ù»[Ç$ºØõ†xým¹µ­›ÄL£˜s«Q^Ý[8œ8 ºÀ¡‚=/`ւûd¿¯¼ƒÖþâýq•¬¯¤v¹`f½Jº+ Z'žL;† t¹1–ŧ/2 ‘5B×1ÑÀAB…×:ìè¸Ø¾ÿÿš(k?ëæðAQHÖR”‡l(ø†ÓñTK–ºqtf‰Mò]ø£º´`-.SNbº[°ŽCPù.§Úu ÆaꬕÐa¦áz¿J^3e†bô Kìë^aµì¢eg\Å¥²dé^øƒÙd\£&·Ð~!¿Ì&,ƒA¼A\öVDT÷hP1BœÐ]3äUÈ÷±a\\oüU?»zÝâb?Α¥ÿ˜=ã !® zþ: ¨_¯Ã­êÏ3˜­ËâÿJ®íJ?0®çô¥Lž’VÍ׌ݙm0•âÕãš'\pk¸¦„&Yt—ÅÁR× zhq‡þ.®_IÄj4–y–H†“Í°BÑ27z†®Ìî FLJ3š¨\\ó,š))H™8jN©¸å(ЈR¾Úš:KŽâáps˜ +ÛU0iç๨ƒÀ ¬[õzø‡Tüž¸>¢'(®ÿ‰èæB‹AӘìÞ¹Ÿ>º˜DªÁ£DL˜šëî:‡7!p7©ââj7]'t÷‡ ißSn+9?îyOl%#"¥dDزé'×ï#•,H\?0+ą¿&&tºâ¿Ì¡ª?¾rÿ: lkÇýëÏ¿¿í ä÷Ò\̋¬¸J­DÑDÍèè„ÖV\¿Ç+®F/¯·¨šó¸*†(T»Á@ ³Ëš™¬ïî¿v鸆£—ŒVÄ'¡›®ÎUL ӁCcâ…+®™ù0#f×½âZ<_ÑâØâÝÒþ)`¶‚:ù +VÒDP•DÕêŠßžúumÕ6h §X€ð,3ÕÆÂL†¸zoÞú ÃúmˆïŒÅkJò_í8„˜¥ÿÖv®xZÌ)¤ h÷²õÞƨ hMÖ 7wÒþ`Øoª6ÑÙ?‡â+8“¼Û¤_pÎúdxXcå89,_dtyæë¤hˀT †àã§mH-îç§ý öò- `‡ÜË\ÐºèZB/rG;léBÅì0>Ԟç xó4œ¹a=YN4èÅ´KÓ`ôUçV¦¿¼+Ä»€ãjÍ ü3›Ñö ßa¿dÈÜp„ò+7 +·jÖOŽ/)»Ó3:º9]€Õ$e0´>QoYP,"'‚üé *lŒ}1cꑧCƒÒè‚̹´³9¢Á:™Ìvz² wVۊµ*šLq¤¦î_®)Ë5€N{Áý­ü‘¾¡°¦ H‘q¨t÷(å-:.ø1 ýΏ ˆÙ®ÃnJ$ ì,$΂w\°h¸AGsXŒ œQZæúÓÓü@ª™IÏò!¢’d<µƒ¶Ó¯¥‹j‹‘ÞÆÊc½ŠËA˜Ž²18!↠2³‘ˆˆ€^¬_y—¦·ü0i*ÚDì 7àƒmÏØÉ59ÙLÁ‰¶Ï´ÙìßB‰Pqo¿pb)æRÒ¥”ÜAäÅBãiåP³Ëx8õïi?Þä㡀<ÜrÔ>ÿ7#Š,aèÊ2¾võrù—¯È<‹ÜaÜàúb_C=ÙÒJðÆ!¦ÜR fì(˜BÜHÏäŬ'äYYŽåT́ :"!b°ÒÞ"v?µÞëA❪SB8\9´ø }ÝQÏ´ 2=Ár±Poö"Û³”Z¼… 7{’µã¾AÃ*•ŽCÑZÃ磄˜VA0ÆYR[õ5‚Ì%ÂA[ìOZc‘Ü«\㐈R{àÀsyë™JŽË¢HŒÒ>¿Ô Ë+Š€L$W((zcßùyC`øa\éAïpqCfЦ"Ê&"jF.nU¥5]ì o¶C’¼§ÔÜ­ò–çFzևiKvw´ Nö£‚>stream +M8uîÒe Sr½¥óîeß- ×ï5ÛÖ9Rj—nrD° X|\ç3/^§:kâÑ9²xÏÈU,×3ÀÔY*“p¦´&¢)’y$öƒ€º·£#]9r hVW\‡J +z_ë¾W®¥Ïh6’ã)B×Ô±–K„»ˆ²)¹ôLÓ\%A¢RÔSôÖdoR±VsTXˆ(°èx´"’£öˆÉXŠÈŒ£g &øVñE‘8iPEB÷it &R$’А±²Ç<ÌÅ¡V +åtLX4ÿ*j+‘ uAºnEôiΉcùÅ1ÀË÷Y„•ì$Ï¥õ"Ì4K¨÷è$zÊJ0rTVù'°$Cö\P_»œ|1Éx[Üݑ÷õq]ka¾Z֖?‹*¹(ѾhÍF†Kw°;1.y h ^×ÿ]R—ýÕŠ­+åš +ƒWÐR”ë 435*vs™Å=Úuôü‡Úe&G.™ûÀÜ%è B²“4Ë0[¾’ŸF¹,s¦ÃêoÏêu(½°Bztd ðc|& K#;êÃMØ-ר)ƒŸ> ðgyN$ëòüØÔÿ¢'ýGѤ+ŒŽ\…0 >’™Ppç x!Iu +†Ó>îh¦Îð‚¶'¯Á#ÙR Em—-ˆ|îÂþ(\ûæ" ÅëÍÏS?c‘ÁÄY1˜m!ý2<^ÖBò2{¢¾&Ÿ xì%Q·¸qû)('ø‰!ÒöaE7Š’C–Ø 3.ÓI&Ëæxãa#P>øÔ§ “ + ︗¤„vêÁ”/ÓTÀOhœ›ÌîŠÖûÍÙüš±HB¢`•cá]³bn𦎭2˜ó½ä jQ} æ1úÏص“l6¾ÎûÔ±Jž•Õç¨V\FëESó)ó&ž•2ÿvCŽåç×-ú"‡›×àlô´sG¦ñbK¿ÃrsÁ©æ'^‘×µ¡|ùþhnƒ“$ûœ13ª6‡«%Ïö¬0Ð]ñŸÅèèYѲ·Š-'HÉðŽ*R«Iª'#`äq6~IîUÒx±¿­Ë浿à~µ´ç³ W lŠC+Èp°†áX|¶6(öhŽqÎk¾õÐ3ý0ÛuÉä {ÙÁOÞ_výd* ƒƒ9 Õ ÷‘¬„rºc\$Õ)VG+4µW¡5l‰þhÅ=2u?Œõ’;,°Æ¬|Šì»ä÷•Ão‘vô¤Q=„ãn¡J ¹¨_£ËŸ±b[°ä4¯ì—ÝË…¾5p?ÿ«æx?<¼RoTïRP¤êî†m 9IBÿ£gá„ì[ÌjqäÌÑè‰`©BÅÝʆLèÃ7Æ-D¬šâ¦Ú‰ž–p@$éŒGÚ`¨?0fhšAW¨^~šªÉn… “/>6 ڝ%Ó8)ÞËËv‰`G*1Ù,B¥6µÛ(²6 >Ğ*%¼u»ñy0«ÂmӔÜÄÿ”NßÀ¹ê* µH!‰j› ¸¿ñ'N™1Ùa†õ°PãˏA V¥ý~ÌÄ,;òÒå +Z„Å•ÃEË`€$,&øQë?vsÑiu,³=ŸuÐaÔ½¡úënµ¢rt {…Ï!‘ã…ʱü§Ž”!"y(CLòñ†3GR[/×4ºú(ª©×ýï} aÊüxâtÈ+Æ\.Á€0̖’º{(#Ó·“‰ò™ƒ¥x·@ßFR‡Â2ÅÚ š=`:0nØcµ0§aéáãíµˆ ³â¡¸»‚âC)|,#™:4T÷tžó“‰åû²ŒFƒ…üæ$t¶P–ä: +½š‰ý*;£d©˜Â|£ŽÂyÊ&%‘º@è°GZÌûKQp)DšAZQØâq$ +RC¬k¦H=#,®è’èǃfjàmåqG².ŠSŽ´1³’Ò^òdæãk7ÉÒ>§›#¶kmAz¾&KPð}V7B6jƒéý½~# ý¼ q:°V(n¤ÖïUßHTz­Öú<À(©ø3y.U»à_Õ<6Þ¥[Ž©€þ‚9N°¡— k^^[+G– ˆþø\)ã‘[uWhðyWUÁ—õPªõ…%$>üžõ„Ç 3 ½è­ÆŸ¤/èŽ ˆ™Ô˜£a÷.72ŠÁ•I¶”ôÙ»Ð q“UgèâþJÉåÆLã{/:ebðÀ¨`4†•*R(ŽXǀgjïiý¿çm&û·N‘xY0"„4a1k ±YªŽz\@‡ XV„+.aBä¾p/$¨E?IL`L $}Ñç¦6p74,%éBe0eÔm¡s ÁÇ ›÷0€$­e÷1@í„ ö`Ā؏ÿ!øš-§’ÁØÄ Æk4ÒoÄåuŠ¤ÌY®8©l±WˆGTÜÅV´/Òp Ï×ÏÐIÛ•Ë ¡^Ÿªâ€K1y$-4"ò' ϨK´Ì£’_rðôƒ9liø%–}°­žðuŸ–b9øès ¨úaú;·òT;j¸îîK¦\ý+•DÁTæŠÂ „±¾/ xì´Lƒé l Òÿ^’cÒ0¤ +Ú4+}YØC¦×Q/#Ηi|>j.H¤gFœÿ}é0É®¶°žMh©‰˜pz_F¸ ` >®`$†b±3FJW]26ÔöKð®wš®z_îèÁ 3Ï»Š~_z]ž÷DØñC;Ší¼ÔsJ`/ ‹Ðf§%ä/Œt°†ƒ2&0ìµ –ûí’†¡ý®²Ó1TðrüË_-$ †1’¡$#ø%—ð¨jJóüG“–x7¿Dn¹ª§Çèe¥¢Âç6G†DzUëà—¼©‹’Ûh 8¶Y:¶éQüÖ'؉ŞÅ-$V.Ý¢¢Õ¨Vƒ(ò ý,ÌɜÆâ€-ÇÌ3÷‘ëýdÞ3鮹<លåÄ`Vn#7—L~PR×k»qQÚ\•8/wRÔ¸z$©b͸þÓ6ä1. å0»{ó¾kqÈ;V\•ßžsukAÑz_¶"­€ÖäÎÏÆ3qڝ2%.hÂ]®¶¦½ÍúncrO7Å?\¸ý_*ÐZ据w”˜ "â‚"2ˆ  âA<>I’D™$IÒ$Ék[Š´eù¶më¡mÛ^‡Û6-¶x[à&Û¶ÌÌ Ç,{jÈ®ÿþÿÿ_?ýñ»mÛÖþíÁvØ>‡Ã6Û¶mÛ&{lÛ¶mÛö|†,D4š™¹aîÃÀ ¢» Gt:¢""ÑKJED×»à¦hfhf8âd¸Ìýÿ¯ýö׋t$œ„^sŒ¾B¡ªª®„Wýƒ—T•ð_*ï{XÍüB/æB^!!!2TŸ„—Íp†<‡5B’óß%NÐð>uï%^¡ò ÔÚ¶Ý6,4IrÎãÀb±C3¨T…mIõ¶mÛ¦yÛ¶mû¶Í±çn†Ö KSSãþïï‚ÿ‘Áwه½êhÈ.# Ttªªj=Š®êUÕ +WUS"\@U%¸zÕÔ073ŸÁÝüщn :¢²|èèVUUUUµ;hÊH!‚â."â"„˜ˆh0ÐÄãDDDDD,""ƒˆ:R “çËè±×Á %4û/ì:fv1DDDLDÄã ‘°q„ˆÈ‰ˆ˜U$T2’4I’$)´b­Ìj}Û«õ*”f[l±mÛ& ¶¯l²=³374c¿lF153óbðÿÿÿÝn§#ÆÈÈÈÈ®ÊÌ̈Ìêìeƒ¿,Ê^fffefVv™™¹ªƒÝ‡Ü18"„˜ˆˆˆˆˆˆˆˆ°ˆ²’!ED(¨E¨4<73p€‚X4È¥ª¢fŽ}€/*P *F`€lJ©nŠÈÉáC §ÌLä*ìýj®ÿšC6±6…P YÍŽø/è2ÑydøPu*Ýeω™v*ßL‚©&–Hú13"R#Ó$ o±£9ªrðTI‡1y;f ¨/’7I bÃÇ\ ê‰m•ÉǗl¤Ï¼ÞgÁpõ +čúé6À\]æ>[\‰ÄëXb¾œ¤ñö+™•¸@ÞÔj€nÎF¡t!kÛÔI5w˜\ýãŒI6;”VŒTÛ£H/SÔÜ[N“.¼yc¾;#Œ]õU("Üxº#Þñ¾LFl ¹Î –Ô`„ŦéÁ¸d„Yô££¸êáaÆ0½>UD, JõeC›ólGت‘2ÂÃ4G€÷§Œ2ÂØ~3ÌU£F¨íP…¡C1I–×M©iR“x„‡lÆW#ZXs9\X•£q~z µ¸1ƒ%côz°räC›x ë@L¨*^:<~L @tˆ‚6ŠkÝg—ÍàqëæüсýE¦’“€–ÁCGŸC)^¤Š„ÁÉÖ!¸‘?#±Yc½¼±V ñ°°k +ÿP†çåÇAŒ%SÎ̆˜¡Þq#Qí`­a…'*Žg”µºmC/Ä·9àúcW&žœg406»kò¡×eíœ.˜¯Øü QIÁC­&¦åc™ Ĥƒª*®QÏ«ÄHµ§_"49ys–2ƒ82û @÷o@bÿÀëLQâfÃöxv؉aæÖÞ©e0tÈ +‹¸@q0Ñ2/BÃ@gN¼Š"ƒ£ËØÍ.ý+à- G¼,_jšfÆw¾Ðg…­x"Áfiºz­:&FÚèç[ëT÷®Ú›»šI(à×DÇ!¸¬I)°t]äû|ß²ð:ÞÀP1Àj¸ xŽ ¯Úr”  ‘Bök«@™ÅOÇú¹b&ÞÁ8UJþaÁq0²ÂPè™ @~¢G=øØ᥋q\ Øâµr&Å<ïȔTÉ>âÑ£ô5áß< b^npÀ!ž`ƽѥ×(lL0Ȁ¦æãƒæ$XAÞOÜõ 9y¯ÍJñØW‘¦’ò¹ab2×­ñ¿x¾Íxµ×Ö¨§è÷ÏdKäÏBDP<äZŒ‘99¡¤nVˆ÷XI‘g_²³Œà—,~·¦Ôç+Xͨ›xœt1ØZz'/@䱓󅫨š¬(ôiÝY‡skéÁ¾[¾ß÷܋¯­%©GH„?C(h&})EˆdÊýT“¡<^–ø¤ÇyžÑøs +8PtÙmjB»|ÄUSWX?Ø=oi]—ò ÉBeuDYþlþ‰ˆ¹'t +åù-ôÛq¥8=·6‰9ÅUI»Œ&Ón—ñ5€­2 $:¨á•s£ä€‚NÎr›ˆÝNNC©²‘L ‘(é3ÏB崕ñ#å u¹R…=²P{$ko‘m²£0€¸1j«4|ъ ü€Þñ² n/ÉØC Ô{K[´QÊ,Ñ©{~“µEHþ¥0zܦÉ=Á·hM–ñ-R°/‡3®Â E,MMÈO@é؁žÏ¹.(ËáLžã¢‡*DÈoPg ŽãRr¬ ãÀQ Jª$‚m(ì4>ôÓ̀ÚUécÊ4=ÿ¸¨ƒ™Üˆ^ž_ìœ;¿;+üDOMš¾òn-[,a„;*¶ÅC•äàþ/HÆK:YBZ%ô rÄo>~$f¤P?åJ“±©ú¼á‘ö´…­F좛ó2‰RQ¾bdº¸íºÒApe´& 3t=T…æ‡üttæ*göŌ¼îôŒb¼,J¸Vƒ8ÒQ¹†uܯ0Œ°ËD^ŒmÎa`WFÂçϐŠ» ð1͈‘Úƙö,Ø6qÐÍyZœª#,úè@#©åaÇ8@¼–çÑrÞÿyÉôt‹+>éÅ´ò +Á.˜b¯=•%a‡&¿\„„oôÂìπ߇{J‘h…;ºÄؗDš­º^/ŠðÓÛ:®'qûÙõ¼|ìQlAÂ/ĝ¤ÿØÌw6Qß>WA¨FjõPN +ä:9 ÎkcáÍwÜdnH`ɤüð#©yç•FÂs1ÔA|Œ„¿–F£{Ɲ·•¾·ËS;©øPy3Ðf3 +™ÄÚ¯&"oB‹¿ÅÀJ‘ã'YÝG1äÜ/(«Zܚ$h֖­ŸO+ÛD/Ӊd—ÆîÒï{ÑXž;°€X·†â£}Œ‚T ° XIÈó +å˜ðLRÿ H½ +˃ÕtzËm²Íšƒº¸&t=5éˆ7A{n¹~Ü͑ÆRïƧ®£ÆQjñxðuÅê§Å¬mô7ð’åàyÛ¾jÜõ 3c Æ5¶YZJdà‡–œ¥FކpÕ4…¾EàYg2—4Üú*F'Êä2;DB¥ç캏lÿÅ$þ¿½léíZžbA}È>YŽ€î2W½ ö€Xq¦BCD…26“ßXOfX’v–”McÊÂÅ••¹ñI³ä‡1ÎØ|È|F¤çŒ­ŠuçU>ž2¬.N«¤ïªf¥,äÖV#Êèý6 ‘õ–˜g¢`Ï=üêç?^¾ ÏÅÂØp’²Ì¸`ŠI° yTŠ2*;òŸFYԅœ×¹É0M‘ÙLÁÔ¢"lÏ0Z*AÊðcžð¿Ô<Û´Š¤`J‡&Y)ÝåÑXo7jíˆòÏ֓g)Ò{€êE\ÖÄÐ÷“ÏÃGðC a,—b7ñäOM¼²c“ +³lõ,Û r߀B¼=i Q÷9ÄÚû5cb þ£¯¤»Î«¬LTïÑgõëí¨t’lãúP(B¬Æ3ŽÎ’ÙvŠ¼>¡ž„Å)¨s§f퉵¦’á—jõã¼F6Ý4ÉV6"V8Ÿ3¢væ”ÕÞ³¶)!0d4~ÓW1Ûd='¸Íº¯¯Q LCêïéµ0¸Ú ŒºY ¶ô€¿\ójv®3L8–’“ù%šúƒ´ 3OøL¬ÀtAäXñ% ªO‡~–Cø @È –3‹pŸ ' +m˜Ò,*ì“!p¼|…ªˆ4(ÉGàÌÊH}¨H×Ø_k`/7ÏéK˜ˆ9A¤„Š: ‹! 4äΠÑ,'LƐyÑA¯yÛЫë:Ⱦä ǾöÚöwܚPßq×[‡l MùÖ9˜¼õ9s‡÷VZ.bhcœº¾oé³LélBA×ü¦YBÑ°ªu €z‰‘oÒmìÀûÑmZaµ×«`ûYÐ ÑjÔu‚¯š5Ǻ °En”v ™2á® ÑË{Q?·]æCÙ Ž&»6(Õ —]Æ[c$šÎa0†ÀɤÉ +&i·^ZFÆ4‚4¾~Ü6zsoy‹oF§¹—‡¤}A2¨qãGöž0vyZEà¡W "W„WYåÂ%¢ØŸwÃµÉ + ÿ!°}}—^þmÃ÷FZã+ægòíC-ÐÏ<œµ–íÚ6ÎX**68KŸšÕ`‘psä^!‰.t 9?¤K!â´`Ôøm +‚ÄA˜Ù‘úW ¸•·8|ûPŸ’"⹚é ZPúY‹˜mf‹ò.O¹yv¸êÙ“"<„Îð¢:hD6î†d õ²q +- Krd3ÏâU£s)~‡RÁ¼oAQèTíYâ™ä0ïÉCÑÙ4ÿzhÞé>~í}ò&w`†c"ÚXäçô·ïðóCà܇òœ¨JLŒô<’Tœ@S«ÜBÀ#T=1Í G㏠ÛoÙþ¿K4%›§‚ÑÑkb¼~ž¼yq>›óçÁ¼,cXäE81+‚–ß »T3¿r·qÆGâžÛ«Ào¨,˛¥ÔÈÁX§3Jxۄ¥‘Oé*ƒ°N\Sm 0N¹½©²ü~4DÃȞï pª·Ýú'ê ƒ”¹Þ#÷j⟘²ìòI¥HŒHUô³!<`¿F-”ÐèígŽ•èäšo0ÂtìGºØø̱#ÁFØwø°°eqp¸`43á5½n`R‰ dÏë2’Èë®?E2T@‰i!‡"#1 ¾­»·÷紑¼îת+ß#«ÃÂñ5MPOù n,-\"ë@ê"ÆûVKX42B ™ Õ¯Oi[·ß±+¡M½®—¢¡µ¬Ñ`¶Ž û\Õn¸wƒ¯»ÏD=öº(åÚÆä6f‹-Ä­N)%9>ðVj»•jU»d†à՗ÁŸÆ:Ä8nÂî+ºECtT¦-‚œ=ݧ»ïu³ˆ=Þw-|8œù§\vdçQ°Ç\é;"Jž§[ì+„ž¨ÒPõºÈc"šY\îp¤×°= +éôÁ¡ꣲ,'•Ê·®{ nÔ 6dv1LõF¨¡@ó° àÄ ZTÄoï ¿s™“£>❌CHÁûL€¹¯¥KH³;¢`Ü×ûg°Ži ûÆrCë‰p†‹ÇêbŒïcÄs½ë:ËSãV&Ù7ê〵ªö›»˜ev·dh9Ð÷JÄå¸áÈLËÓÉÒ‘~BÑW;n– lB@?ËÕà¸`>ÉÒðsßшH dÄà¡Ò^À¾Ø¥j÷(æžòTÕÉ}Ÿkè ž°á7ÈBÇáÕ=zÐò±¿îï½³{`SYŠ& Ïç汏ù`A8¤é>{:¸J·Tš'åÞytjlâ@”ƒôÜ_FèJð’èHˆ + šLç@ä¥hÉ,²´jåt0èé¾22Fe©¥Ì®’7?Ý×yA#·°âwÿ +ÉåQvâOq¯Ùf%®P ¨E}Ì ÂųR°DƤ–‰3’?çÛåÇe¶~vv/'ÜO«gu•3[á®vÁºCPšîÍ~(>Þÿ/©ð%~Í\Dû­èvG­ø>¾ªª–Ep8šÈH"¸éFK {–œI¸7Ú&‚£ÛÃSRïÐgÝ9Ao¦oè­Ï2ÙÝl—5n»Æà=÷†*1íõ¹‡Á­š0^ÙÓ  I1†¤“ÿ;„ +Á¸rHÀœFсÇ2d_¢‘ r È[dùd/ mƒñI¤ö€ãŽÁ'¾Xhø“\2iËCÐÉLQRÑÕV{îʖ¡2ÝÒ€~ۄéšu °?NË°óšØu;Û b/lŒX•iRmTÌíÀ.rç@frzú]Âs@9Р&£ñéêŸópÇw€½C´ß±C€À"á¬9”ˆ¿̵/I7’Âÿ5›ùIà|æ2X­¥<öÔ-ÙúM>+¨@ßì Üæù¥•å!±¸^z×l-Ü7jv’³“ñOºÈˆ)°“Vƒ º>¢y„›¥áÀû›Þ>j{ &GÚ¬ÅàrÜÜ#áwÉ`–Ç‹…¾tº.‘Ю=B&!Uîß sœmè’WµXì‘T7”“h,`ÜÊRSDʸeöþÂFÅæËvÿ‹JYk +7UInprY 1:á%7^F&7u g§áÀË_'ûÜë~Ï°·õeï⛶V‰‹ ^—ŠLH¯7rÁËïoú»´0!e^ áX¼ +B~¼âýñ +Bànª`ÕãÕ=$¢iÈËffKê8^u0'oċŽq%#2ɛãà…dYpåÐÈÿ5ecÞ§?o€+¡4^ÃW¼† –xå¥Ks/ÓÖ#Ä+dPég ¯ÅHS/psñ*‰!…nE(¡‰*¾€‚.Ÿ7ÊÆË_Õ葜¡® o£tvõ^aCäÔáU,x„ùžUµ4ë†|?&=)`.`ÅI£¼fa ÄóŽGA/˜FFí«Z¸Nþ//]× +3›¨E8ŠŒ’0®Ž‘ƒ(Rc(¥Ý̞Y¡TO­ ÕýMòÀt‹±Žï“«T`ì½¾ qkö*àÃøwÆ +U&ǎiý€€|%7?ª1ŠY|ØI +õÀàÃØÀfOÛæEÎD%G=Ê%7lz<¶ÀI¡ÐΙÿûKí*‡åV`$_CÛáÝ%¿HÿíQÈñ5&'Lçڈï†?ú–p(½:aù×vòó…abAÃMëÕ ¸X8“J†Â ­¸mà+ê¦éZ ±œ%ŠÓ<ŽžÈ¼a’Ä:bf¨ýßî=X·Š +³ª•@ $Eþcå»ÚÉ!ó0Y0XLmk‘d×Çöª›UQì§,À<Ì¡{Г¿ú_‚ÉTú×l%îãý ¼dÙɸÆRØáA”º¶vŒÂdž&ãMž¬9Q ݕĨmññ†©›;o‘¤OVU^k®'yîž67õ„«¯Ãð$} +J–®9Ê£'ÔâËQ'ÈùIëÛ5!ïõÿäŽ é)S§Àg(4ø!àD‰¯ბ•VåQ¾RÉú\‡÷òBEtkö±‡{ÍM]{¾z{’´i1!FÆyCÄäÈ.ræ©r‚Ü8ƒ£”h‰ŒÕ7\Šm†;û-uPt¨bô¤ô7²Ò&@s'2HLÙG 𪺨1ó«c?D|M#Sku‚7&$$#·Ô¾þt¿OIQaZGt¬ãñ=ž’|ò½†ÊŠ~]Ü9SHA,~uU€ sSÔFùé dç– ¹Ò™[{Ñ©œPG† 2j¬ ”]gF'ÀZќ¡\U•õ¼·~Ò@æX•j¡Z)qBýgôz(šwô¾B•BÉf š$\‹@°È.@ŸzìI·mÿL«Á¨ùî¾c‚QA!œ<1H̺C•X0$=ÉF¢Îy³jÀýÜôŸ8—«9*[KÔ +ÿ+CŸÉ»(r'|‡†õ9Z6Óktvwï ‡–´·nä<Î_KJ7¥“E&"I_¹ýõ8½AH‚×vàåc¹6+ß÷| ŠÂˆ9̞½ÇÿµK@‚O¦µÏ +"!eJdDZ¢µ›©Í@RۆHþ}¸O‚Ð|³ƒõÿL„Ð\³‚·i­BeàP÷£QV‘išøfóO0!ÄybPÆQþ‘TÛåXq9Cy{Gx¨îÜ|5Ì1—´‘2y›»=fí¼^òÿI¶ök„KfΊ˜+Щ¯z–i±ŸžsÃ+ø¶dåßпòƒ,X¤á¤jXçç½A ££hq:IIðGÆ㈆‰ÞÞÌBɉz0&Úµ‰áÝFîuƒ.&wjª¿î؀Œ`BÊ,‚îÖÂÑe˜Z\,ÖS†X¼ú=b-?ÉjÞM7jX¬`"¢­LWà /xê6]¹º85R¬ª€w (Åʕ–¸:b7i0„ ¢° ¬6»gíW„à ž|NLìå¥ù6z§ @BØ®¢nX$͇oÊgØjŠq‰ ›{° gJ腍óÝb×<̯!ûˆŠ)YÏ^Üۅ¿¶Áx˜^¯x±ûÝg 5„¨üÏB?:è,smLŽŠÊ@ßxŠœxûÁÈázá½õ|ØIÿÔzŒ=ˆOn=ÖËxÀRÃÕ²výV å-d¼è.’<÷ÀÌJ]uN«ø7Ž>b¤8n"Üõ¼1'aºê©ÐµÂU±ì!Ý#h¤&1IÊ6åàKJÞÉ`5NÝ]P(Qã3#éÙR{»,§ƒNòn ߨ¡…-?Â7¯ å4U¡„þ¹ÆWƒÎ'lIH1:(“ޱÙwF»ˆ)Ê=6þ‡Œ»‰ Órò•¬˜ç •5W%y¨Ò &–¿m•oéo„q­0“à22sœÃ/Qߎø³<,a‡®ÆZ—Ý6Ÿ¨ÉN ¯^8ÎRÕþREBzn3êeÍܑž\To‚ ‚ÿÃlYÒ^w(ä<{eýØI‡xï=kMY+Á‡Œê;ü¼d˜˜„o—<ª†U β깽ôáÌÒªÃÕڏҘ:ÌöòEoíïã¦ãy‰Œ®ò•$³8‘¶{*p,ÙÚjx%Ô1À¢¸TT·â«z]Иü ŸÒÕA à÷Ò£zËeïyýñlÂI(EpI‰œðý …Ꝯhk¿ãa‡È˜tO;Öy$þ@‹/ð9X/ôu÷¢db{òºý—¤2#±ÿrW0 +R§à·­Ë p¡ƒm'ŸŠkèIø õ:“Bôö£²5)”óΠv ¨T\˜”úôÐæ&œ0!>À,EºãöTBU¢“kY]»% ±îÙj5–ŠÛ¿ºQ#³&Qq(,º +Xñ\=î# 5RÓFÃl‹×Ø»pa·÷"út¿µUW(*Ç1ímNÜ΃4EÙ¨‰ößUœî:ã4óOªÚË ã¤}mr˜fu…eþðFnõ¼Ð!Õ}Œ˜^óØ&W‰÷B?ÚÖä˜óyÅS¿&¼V_È £Sr§›Búöwè=äáKÙÓï@=ú´T%ñºÄXÂ3ò*õ°<$ýà-pƒ+¾ôU\ó5¸réõ£ˆÇ°Yևð^‹Kȋщ{£Æüm^ +V #7i¾]ÝQvCÔÐ;Á\ +ñ´F¶ÃÔÜ ï.‰:¶Ìš-€+ÕDŽ£Òҗ{$¤ñ|&ßu¡¤U#ZE£èËP´¦‘rYœP$Q“ "EåmôÉ\¦¶é=ož^†6@۝צ̔(+œÇB­aG¡è^ôg“`ÿA‡$0$y&ùá¯5(5šq¸n»×<]€åsH¨„õÂé>Ø}=gâ©.b¢ˆÂ ÝDncäI( ßܺó*£´(þ —ó ‰)@q^˜a\s·¾¹àkՒ×ìêæ…r@€cË .›*»À¶‹ôڌ”Ä̍, ŸC돁ÚÔe¼SCL:’¯y Eí‘֝€zM#ojIĉEÍEž#¸£å†uÇ°JÃGت6wÊ"™ÙÐ!]Hî…å#y(naÃ#)œY>J‡zŒéÝ+à7ýH£¤YùX¡Vç€jº‚Hˆ„$+ViTÑ5Ú¹rf¬—Â0pH˜$©)+¨÷ÒmSÂ+*Q ®;RÎå^€½WÆH1'´Ú5b1»G1ÙØÆ80|ü˜ÛpI¨¡6Í &rÕy.Ÿ†ó>sªÛ‚š×QápáÝŸ6WÉÜdæPêÌp¤u£&¦ÆZ”HEÆb‰œ³x@£°y(ßIN–”òûrÈè +ß.?)>5ƒ³VŒ¥Ñ+tEؖ¥Ë¯Ño6ÝYA¿@pW υpgiWD oþë€9L`fÆ&C=à¢îZa¾jf-­(¯KñDo·8X}¶Mò‰F,qBdƒT#u[¡ý¦"Y:K=`9ù½£¨´ÑCÖñV˜3šŠÒZ tÌ]Ó# kªY8»!÷•¾auw!ÖLYßÍwA-!ÜÕ;Z†€Š +OÓAMÌ~spëS¤ànDj +¤qXÑS5yæà2ð0†ŸJA¢~ê: †ŠÖ‹ìª±Ä°/ ~æG*Pgxx~âDÈv6ÌnšR—ÐÇzbãäšësàµÂï™Á·ˆ(|Úp±ºru.Ó¡G·&Ã9(Í UtóáŠWï%³fm}‰#§i®‡ÿîÚèší¿yâÔ}˜u‡PßH> +Ké28a4bw¡‘(<^ÆܧÂ.9§+~„@HôOkþ+6`øãI]hsôIJ1S‰†wzˆPàsZN +ƒ\ö‘¹ƒµ¡àäVÚt^ߥ0d Ï TÀ^@ ;uŸo_³ŽßE„  }*:_fó®½£ȓ9:øÉ@ Ç³Ë„ÊH E]o"°xvýK"-«Ÿ“Ë[ú+ ­ +jÜFËÉäßrÈ`•ÁŠGDKð— ˜ J‰˜M4›”p!¡Î1"f`?ç f¯“¨Ý¸Úª˜ ´j”rÄDÒ°•+;wâë©c‡\™À]Ì.ßiL­.˜ù0ªû @2ŒFٛR–k•oÃ0i@¡GX[TR!ÀMÑ·ÅVÐcçš=©&íiSñF|F`Ï´"ñâíš°d>£àãÔYgLŠ….;o{œ•e·7 rÅõ€ žY¯½(fÆ<ªÉ^èðÁ9³Påöÿgaڊæ¬ã±Éúœ ^F\äšddËpˆþÎNÂü…d<ÛkN³«ô†DDmqÚ9ú ÀïÜpº­ŸêVê:–¸Õn'^‰ðVÑ©æpù€’‚l–EÁ¦®,›òœ½Vo¢ýébûnݯžg`4mRÅElj¾‰át[Ï:††:ÞQ9 –[=ú‘h¢p#v›$–+»Y‚ÐAã¾ü,NÐ% ™ABVãR{°ü=, œ‰8ê'HeA‚n þ ·Í^‡M AÿjÀŽ†%]Q1җ…Ü7(AqÓ3ù;«/*öÝchKQ¾é˜7E@,ƺTÍÑ®0 &Š3ÌcrÇ&À +œD>½Û[huçmß­B…—à‘Z|Ÿnü¡ ö§Ds(_5K°È7nÐ:×ß<±-ٍÛ‘îÁÛÀ}Rpئáß_¶-R)r™ ÚR9Ï1‹¡g®$€À½ï{îsˆ¨¡I`;FŸn7@ßùR5ýñ®0œf“á{({nÉǠ׈q`¿¼¯Ç§Ûò9¼û¥ŠQ qÑÉñBêÿ«Pi%Ƅïq.SŠ— n!­ÑkxÖvüôÓeñH³'ê ­zD¹½Üyù°ð¸X”p ûΰÿ–›ß…4á-@6&ÞÃ[èÁgâw]ÿ×µ©Ò½¼)vJf6¼´®èfÿÒF +Ø\¤IUa%Ɩþ×é²e¾lNò& mwëé„sssX»tåXµ“Þ.Xÿ{ék–ÁçÖ¦cnEöÊF7H4É`RV‘vtTÇlo¤sã_X#Ѭi0çi€ò—Bí±þF”@® ðÅÄÖL¶!"ۂ‚JXqS­_Ãõç_¯Æ`Á]~þè=wõǹ Ïí±».oÝ¥&YØK]ڂº#Pñ˜dٗ×åsáEš%}K‚Qí>“5Γdw;ýÌù‡åfDÈm󮫤”,ä?[§ukTä»ccѯßõl"kç Q¢H-ÜEb6øÏ ú·k€¹‹¢Ç›4‚rÜ0Øù¹«ðŽryÛ·ouZ\­:tÿ:é×~f•_¹»Vr·DN‰+Æá`¦šYÕÙ—@MPpd)6Á²â‚Ã:õÈ ©dƒ%x§¨õs½›áîr÷íHñ(<-_RP·ÛÉõÛ$ÀüGÕz›_çK ÏZ9øv.+CAš4·S þ泔÷ã!•ÆIøDÃdJt)¾FwèÛéFpò9wýbpÔ'þå(Ûà}æx¶³h˜?eì ãýàf»T=:D·4¸¨f‰Û­éﰀ™Öü oÕ¡™^d;W¢n›¨€½íLA¨I]pÞæA;WPGu§Ù¨gÍã¶_ĨÝF +SW܇Nѹ @B€Kó!4 ¡BúÛ¼~+͜_™™ÛyÓ,–.G P£b7Ò>Jµc'4Ü.”)+9„lñÁø‰_ù[òX¨PŸàœ5‰#kL:HxÁDøtîÖÅ¥š¸ƒ†“r×Ø0è®C`u2;'´¯ß½h¯4 ѵ˜+8Vï‹ú(V­° ~#¸åXwÈÓÜ[y–¶‘úb@JNÍ÷Ìî®5í.š _‹“ZÊbÅJEZ“» &|’’ûÕ\Æ LwÃÞã†V„ª +Lêœ@°ùµî +Œ¼’D¯Ý`5©Óq.ˆÌÞ±4·ùƒlÀ^È4+ߊñþ +ây7îS·íç9¥I÷Îbô]ìûú_ ‰zegEêábäp²ùÚª1NŸØ!rTd&Å ÓU+ÁæL>ùï² ™ÌË­E +ÿ_™8ƒe‡Æ‰1َðNPZ2ÉÚÞ£ð099fuK1ºÐ3فè+w2¼jK@ ?ÞRßGnÐÔAŸ>MM©+>êdƒÝ@ÇJÜ£bíÁ '˜—C×NfÆó“@kP??©˜WQËë»Ä½×”˜5’~‚W ␹¦îj‰û¶Uü8#¤ƒ<ŠîqFºFèÈå·O2T¿ +Ì(†jùꓢÄ$í9à:p4̀9$Q.’œä—Ó`ªB=¢A_~„ò¯†Ÿ?­Æe>5„t`!š$ŒI{P¤‚V(IÐ;”Ï‹39ø>N€„`¦Lþ2Qj>P** +loÛ( à@ +;ÉÏÉk~黝ø á$ïóÓ³—¨Qš )Þþ7…GQ.€5Ò{ˆ†Ì8VÒ!äÖ札€="ù@@’~<Œ˜Úxqd‚'Ü~GQZÊZ iÀ08%[›op7JD8¬Èª¢(èµ°é£rb"v—¿EMQº­)oµ:ZÛÖFÉՊ»`EIt½œî +Õ¦ÄQ( 4O¸FìÅâDé½ÿÀ(wÛÒ ~à Z"À;<>(ß#ú ¥ iq”@˜CY¼2ôÄé—"BCíˆß±·–"À·Œ×ÒQ,e4ápß±~Fÿ›-Î>¡ó?-ib›XY&°NE«YžU(µ!v}l턡µ­À ûªáia˜8¯„ù¢Å´˜„‰ ĨQUßØs±¥Wé_½˜S‚Y$ÙÏW©­Tkµz(÷‰P9$3d¢æJ1DTÄ¿Ñy=“…½» KØ~úÔè#“A.¿’]³È•¬…g(vŬõÎt¿UK@}Ivø6¤OîX*•õ[I5ÕR½ì/ w%Z¨ Àu7Á¹‹þîŒË®õûÁÀ.FÁÄ+¹!ìáœXJÂ2l¤ GŠ{ÈæpE(}g…z‘Êï ÈQéÉJ„ ¢¢(¶~I ƒÒ¿P´°ŽˆÔÀúQ#z-£YúÕ±ÏÁ;= +¥¡ F\˜ª™…)Ñ@þ8ÇLÁЛ‘èË`—Ä cÕfÀ²gŠPëУƒÜˆ¡ù&¢˜õ¬‘éüû¢9Â3єC#ô2l£´ë—”h…q4±ÅâS½s*4±iˆ¬= -6!ˆó3¬!TÝSûCU^ +k´C‚¸ +o¯oV:]ï؊7 áž`!¢’4Òč xOõ&qvlúÀŸ‘,Eá^"ôÁ0€|E˜ï¢2MùRœ¡” üXìHϑÜå„g>¯„’kŽ ½Ýd(­ŽÁ[»¯Y™´ Š)#ÁoBhâ̄:%¯´Q㓘ã‘-Í ÎÛZxÿÈÄ ˆÛ‰}BE,ª€Å5¾$3Þ´m#t]†^K˜a¯bc<\<·AåtPfb:ù~ÝR6þ¸…¡o*¿/o÷á„É‚ñ™ÁÇ .„b+×ÝüÌ!±<¡HEmD¨å¯O…Šu š„ƒ/ÍÅKÏê­½ÿ ÑAÁšþ)fɼ$JŽŠ-JT ¶Ý˜¾˜ûñSW÷›M)©rqu¨Q€ú!¥.ÈC4¢&x#Ú-Y9Sr¦ê¦,ÙÄ_ \ £`ðÄ[ÿ$8ž!š>ârÞìËë’~]øÒ@aëØ»œžù|SáãzИB—*KšîÙÁÍ ¢`2ßß•‹àGC—ø©Á‚eÔÐK—êRµb}†×Y|Œ¯ÞJÀ5•æ#h¯Ðӈœ„¥í„Õ!¶å1ñ¶ µ +ôM”aG6<Ä;ý`4þ¨™« vú[kp£ ¤Kô4ÔåËx"knvî13ñ'BPàùå5lœ² ºÇ/ú#š£"jyQÔÀ{Ó­MëŽÓŽ&¾M¤ÌçóâiȂӷ!—™‡¯!®¸žHŠ-x—¾iig]ŠâŸV9>ÂDîÛ%˜%-rh§ ¯1 ᇊÙZ 8+94°ÿ~áх¸Œ¥Ö»= E<šÃ8 62òñ¦Ô†©”Yü™âÁG³÷JÇV­Ùk§ô.⯚¨TÚ8L0)È«Ò +ìÑ¡z¡_!ŠlöÎcaÉe&0„å1%¶5¤jÙ*r¨ýß#5évÒÞ*‚ï·ãí•@ÌbÕkij€›‘62rw=Ôo¶¥Cw*W…Ö®®4ÀB{–¼Äa€0FÜ°e?íK:[qmp˜1ÒÝ(õµ?ð\,™*#^³PµT„¨·êjzˆKvÁ×=A-“©â]†?c~&D‡œO˜Þ‚Úv$:g8 c«ê2¡+®ôx([‹g9:9íl@ò¦»U§‚·Ï@ºÚYibâ'·n\” J-øxîÁî–Iù‚£Ai³ö·Ò‡w8¤ çّɍ²uånúÛ3wKqð¤Ê£W˜øFìîÙ¤b·ÒÒ—›Î^|F¿Ñ@µ{BC¯ˆì.ä­Ñh]­±¿•3È\B——í¹U Ƶ° \i’%‹šWAyw›…>ßhÔ †e<y2qYÅÀ)__ÚoIÔ5¸¥AÉt #E?ÐYØ"‡Å5R¨'ïÅϞ+-‚óǯýÆmubL€Úh4´8¦ðJ|%UQýÑU&§õA`á2ÕJ7`xN^z:t¢ $BžA?«WÖº¹Ò%´Á]5°mû7kq\b÷r~°Q»ªÙØ ,f×Xeb~:xhPôp¯ô² +ñ%Å@Yá2-*@'F#*l‚Äx|FÁ>K'=ƒa¦˜·3oQ±³tͪQ˜ŒöF NM8?):HµÏ@um4H²Žùo>¼‘a›ôQZtK…®³ÂßèJ«d„×{´€}µØ~È áÃݶ";>/þúq鯴Þuñ ++I\‚„ÇíJû«è° IÖ*ãŠQœ?*</Jig³ttéHžÆ¨.h~§—NÝz@çV8$ØëÑ (y47>b.¨¯4$)A…2®øy'C,.ï•Ve49Pg«½`[·YØυ¨ôJ3Š¾LwoÐíW± aá¡ ºfŸôJ[¡× $Òºº<Ï©ò^”^È2"ü{L+ø\¨Û6¶‰Q'hUF#Š¦-/5LJd“¨£¢ã·*RÒgÜ^zcî¹¢jˆ¨X†n›ï ærZ‹Î.bƒ9=xÓâ$¥ù}´k(êzûMnœòŠéېBTÁh´G«ýL¥}nFè†A©À²³(§r*´·2q“ˆÿç…ÜÕ+ɺ&x’«h­²üH:>[WÆ@ß´Ò*¢"lèüVD fU×1àÑûQSáJÿ.„yeæg‹È\Íáp^éÓՍÀ"£8ÖIV“^é‚[ã(V^?L®p $~uh  rM‚­É[ ŸŒ{{úåD.wä¬húBCKïŽt +ø'ã4Xædœ^iړ# ^iNú9Ev”‰æÖ½ÒÊ)ã+1aõåØKOw êÌëÖýýÑ:´ŸËÚoZ¡ ׇ9ÅàÑ¥ƒŸ‰Ìi{y³ý3 +~X'UœVsói°eãB0, 힒c:9ûúÖØêÚ\¯+mÊdIL1gܦԟ¼ÌË`ÎNGÕy±^Ñ؋Æ)ù¦”LHd] +¡ʎc–‹;Ž¡\àŽW©†‘£"ã/•½Æ&Ñè÷p¡¾6 –µZ 7“Êö/âO Áqb„+l²=œGÏXV¤(Œ\†$Š/ŝNÈT9-÷¥H¬]Ä+¨aݲ¥½Ò«³”ŽŽjÿX8 ¼Z–âÎð+:5Ÿº-rΦG Ï€sCW«$®£§–»W5c^¨ƒËHßÍUŠt‰z)"/Cûœ{87»“Ž&eº“¾öœ†<&kÁ&y9…$3BŽmB©ã.ÝOƒË<ƒ˜j}}H¯VÎ"Zn9Õ%PŸË“ª+Z†¸@F ùàü~"<éÕà–¡_=¿t‹¨‡NíÌ£Ê/?r¡ žÃþ4óšÁ×Öu@'c[àÎ` ÷8(à¹9ÄÃmlÌíH¾:ïí9þ¥š. B +<Üôíi8¥FöoŽöŸIÁ ÿ´‚•"õJy9M¿£‹ÁÎ A7„Í·é÷F! ñ£>ý¼Ôo5ÀÕÖ±PÿÜÃ]ÛՈ‡‚EíÚ%ø¨ìqfªdàÄ,¸ý±} tä‰÷þh,ûõÓÑ1ÔǹMõüä“O)ºá$û`4,=~^¿-”œ1{jŠ‘de“:7ÙÐ1Æ%’i4½?ª÷]£á³£7 X¬îéJ9¦‚ CöMתU‰l²Äù$Ѥ Ùá ÃÔi5—#¬VP.¢ô€g%Èó"ð=ÞzMSxu&IAÀ0єü,ÇN#d¥À³®)g‘#¿!Ž£ðc§PbéO7ûI–Èè í1eU(÷^n¦Ù3¤°aºG¢%vC<ã-$HL™22 VƒÀ[ë6· tdü(2ռᔶHQ@@%QÞJŽ_ ˜ù&0gãö²½xi`&}ŒS˜Õ™Ñ­§  Ÿª¤Jž<­î×Û­ëšA| „W½§wì]­›Bºƒìñn}m¡ éÀj¥<=12MRl«‡(ÄÇ.æºqWyfX‰N…÷æ٘Šå µÄ4®9ƒ`D¶Îê²Ý&P)leXPÏMÔ¤‰¦1iÎ3W å)”ö¹¾h hQvMÝé–[wÝ9®¾tûâc¡ØN§®º¥^ﴖHU§4W™ÝMxU~Y–›²&.( +Juo7.‹ˆP¤Uø­ßÙîÁ/ÄŠnR00"‚‹" +_ÁË݇,s‰fèws¦<1t™,¸Ü°¶JD0rCÒ†Î^ö/ëj~’Óö»>@/ÉAñÝÅÑûL'4¥À“Z Ãx7‘é2 ¹7eV¤ýõä6 øšæs¾ÑÊþÌtÁšèèpÒÉÄ"ñw¬ý¥aâÄ%É¿\ë€PfºD#™¥Æ>œ¡ð$›+¾vòú»d•d€“dÝâiå-Á˜M]‡-¦=¦zn‚tÉ5ÁŠ:‘hEÀ(5MÔÉ8ã9Ð>ëpý©%ƒ0³aï` å^õ¨qé½#„Ü39…•iØN¼We0„&L?~G¾k½ÚÀ/‹¹'{—Ó „›Ð?ÀÇØp14ï¾0þҍ¬ÖÙ=t:š¶œ^ŝBQ û®“P*lœ^³%þ$Ý1ÉYZþ@Táœ3˜®7~qH‹Ó>íÙa[ÚkCFOßÃ*N,c‡FKµI?*¥{ƒ„°= +‘n›ú +'ABak›FȎsQhDØ^7¯zDSÇ• :Œè«ª‡Èhm¾þ#2=ª<ø£f®×~*gg\VQÌ–£2Dk¨ P¢LˆÚŽTá|I0b@$Z;_nݜ!T_äDšà„š!z9àªBü…»" +Yâæ‚߈‚å¢c¨Ž(FZ"ù÷!ð" +OÖDdX¬õp[ná»Û _bw àjˆciµWàc\’Ÿ·gˆ®§!^¦EtêJ pnh菌MšqÓø7ŗ½N?_A(Â'_(óñ³2Œ­Ÿ*¢bÛû†dÚrüDK¦SÉI%77™&G/X›Ü<¢D+îĜ»ÛR,s'‡¨ù8p\SîЫ¤oÔ¢Ä8³­þh€Uª*E¨\"ζ–ŒRìÊ'LSýÚqs5ˆ±÷û»?ép8¬DF +9§,}ñ~~\ +´M¥EÁL ,±¡ÝõÜeÙàxÊãû«ä¡ç5b¼Ÿ¦=~»ýý眾Hü»X±í£ïÛù§NéK–>Þèg³ýKx(c:eUÄ~¹ >÷ØÇÌÐBû¼ Ýyâg¤eÜ«<} +ÐiÑ@Ši,‚ïØío2ð<÷«‹ï4¨ÅBn²Ö¨Fvù7æ©X¼ÖPי˜ÕÙîÑ­RHdï}6Ù¶7†Žbñ¬¬yüx„Å‘¶äŒ©†“ÌAnȳŽ*ÆÚÓsç ¼™À¿å?×T—1ƒÞ |Âí¦šÐiÃ%›zHµô@6N¯|EeØ1Cª½iâw|fòˆcþGÇZ"!šG2®ƒ#3µYœÂh?ÁpØÀ9y€c_KÛ +wöDԛ%¸Éè?v#Ýbkc2°À¸±HøüÆÓþ Qko4ÆNnÿ) ŽÌ¹Ácõ+¸¢/q "ئÞÓǗ |¬î…Íë1›n—3¦ˆŠ¯Z,K$›±ÚXhQ¬ ìýّ}``"þzy¼”ïý1­–iU\ið¢Ó4|wŠobQýN#額襉ÁÔÑ+sIž*®v°Ç‡ý|f+¢ÞsÓOÄO +ýs+c ˆ |Þ)Í3…< 츠£Íòõx2®7ê@5H0°=r£q.÷|5†µ™ñóÛåÎX/í ¹$«°e±ß^å› æÃù +|‹ª-äDå?Å:ú9Q"4(ãû]!ðT 5x$ÂèMˆ-¤ôáޅló*‹F˜ãÛaˆ,¬zº‡W<Ö%ë5~ätD^}“³Œdï³n|#‰«¡Q¦®&&‰t•Xð*v?—Ä˒çœè¿êݦjô§•†“&%ߒ‘ hœ•®5‰/1ãõSåI¡”ÈfÛD?ê›ÓBdƒòñÏIòcÈwtš…ò„¸<ëˆu@+"Ì[ø‹6‰÷g(»êðˆøžpP+›6f~Òߥÿâ'ü‹ª‹†è7êòXݲ€†0š$½éZ¨fÃ|˜Ü+]4Ý=U¹Ð1ªÚRPÎ×lœÖ›Ûõ ¯9ÌB‘ôf…×¼wãŠoÄÇï×la«q`¸€«@]6$5à%iLRÐå^$˜†à߇Á«‹üÈÇÅ vÝKRÁ:¬Ç­Ck\ª}¹4Œ™D¨ , S¯á|Λ é G>õ9¸ /Ë96 Ö…}%þ^ùĎø¼òæë0ٔ‘~7Grïò§„ç,ŠÃå áH?‰vgãôê»í˜eoÿ¥¢…¤™Yþg½Æ“¼èÀ`œÉš >¤.â0s•Ëß"÷”ùQ#<*Á"#A° úð„˜Ð(coþgwW¹ ŽÅy›´æî€(à“Wì;ÑEz:6`ŽQQÆÈ}81Öf#ÒÚx3Ï·åê†N +a$îݵ‚Ÿ EÉôŒfhð) b?.€_Ù8ÑäÒˆi.ùb+¡dSאƒGÏÁÇ|ìAU°Iö u#åŒD¦9¢ôª-2ªËÔ±¬J0X’EhQHî.‘šwGÊó«²ä·vL¤–#ÇÉ¿QáMb]~$Ph’È"0Ò¿0ïVˆã‚d1†UÐÐ1ÀSȕwÖ䌈û#rì»ƒæ² Ýá²â +UQ’¨¾ÓÈé@\þ„ãà´ê$¸…—¬„ºMXÔ9Ð!²éúÖ(Á¤“Ü$N€ꃅwòú´Ð °À™[ú{’)Î$¢%sŒ¨|ãϊ¹^Ã&“Ú›µt2ЕâUŸ)"¤ÉîB ÿƒ4ì,%yªFÓüáZÖlp/É{À4cÖB‡a¥~½Ê;éøë^«Ås—2ëô¤+"Þ$Q± Ai)1}Òx&øV—`%” +õI2MxE¦p<›ˆ³mlLZyðê]¸3òÍ1Œ¬Îâî鋪Ø4`Ý—Ò#9K ]Çõ0)Øê'/òŸ7¢›HàêÅAç«Qž­ÓŽ¡½,OÁêŽf®ÙsÌÅ•ü Ä"ô zc2~|Ê`"Ž½ÌI[ÜU Eˆ! +ҜÖoY‹ÈNŠØ78’ÿï6áD0" +jš|á[Žë9 ORô–:©\­{ForøcTë!Àä. Í}Àt +nR§˜‚Õ³ûèEŒtP²±h+?Lfàç{=· 'Ÿ=AÞ†µ})uvÛ ð ֎fI_¸¦˜±y~v%.²c©Åp"U¹ïRʸm®™]²,önùU±àJQüáM úw¡ãæn Hç?2uÔÇîuaí.¸Ó¬UèãÙnrk}Ðgê³ wNp=¼Â–¿U{òTigÙëB5P´*¸’,èӕ—¥œQù =M¼ç‚H_¨¶ßÒ<Ö¡:•LÂñ /Ú¼ÃL‘>™#éHÊ­’ƒLÕdû WÝBûƽ‹iᔍY'ljõ)ªJŒOcq%Rë¦S¯¥Êž|Ì¥Ë])¾Ö^žAR¥öã|ã›æÝC,) •oe|֏ôŠ®Ó*9½ÇAÐ*Z†æ7ÀþGÆk”ÚƒGRõEVËHòÉ%OZï³Z‡“TIÊZ6¨û¢½Eì¦Rš{mÁ¶~/4îþU䅶rº×´Cðôô¨¹;‘o-AçÇäÁ-‡I7¨ _â%½¹1þ$3Ä\wA¼äZúÔi@&>ØO±ë”¸7zavÓ¿;0coÅl;íM±- ½I7rÂ'ÈÄQÏK>IwÄ«=‘A )­e–Îy¨ò¬sufšù>ÎJ?ŒU°@¡¤ÁþJ‡©mA{fj¦¢*/}í!§8y¤3ÁñψÝ1¸¢JRª:¬6°è K}ȖÔыS±º¨a?¡øÍ hÌ÷I:ïo§Ùÿ„-ƒË ’ï(—trNǵPÆnx"‰B‹Ûºòã _f’Ù¬5îëQڟ‘Mל½#Ä-ÀôãÜÛò7dlÕ ÄΏ“¾D$š3ªÌ2H—ñwݗe©+±f%¹k¦w$±Ë›2m&Ml†à1Í¿kƒ™þà·¹pú­Ãn}á‚A¶Ð†Ñç#ã«g-)¡ªÕ²®äœ®êø@d¿ÎqŠ-P0H/u[ÝNè¾%ĘÃ.ø[v‘RÜ)K¤yÕè¯È<ˆŠ~MMÈ;¤0· ŒMŒˆpWUY¢s+¹ß?TÈs +º×ƒVÈsš 1köqT: mà3XE5«Å™e”Ê8ú·š8N,gâ™<#jžñËÂ,R*¬BÇ\rh”ª5I‰ÓêÆúþyBù[’Շ—m9½8^Ðoçû´h {jÎAV')a1héÁR&0¶,uþŒâŽg¬xîÀT’„´ˆOYŸÛ³Ä#k!¼ÒQ3Z +¸~¨ãÃøWn_KÉàÕL(ÿ+|LQ¾ÒÒåö“O5£JåtCćy­ã.Å}dW+vx÷ãƒKm ™\gÀ6Ž¤edz¯+è$ ­Uð‚+-ÄÂÿ¤†ŠÏêoVR— ìDšÓÒéö#+$š±)ØíA|?ûà´ÙŸÍ}¹ì »ÔͶ)Ñbß9^q’Xºë™(pÃzöuÐtCŠÅrbA5ìP•¡á:tKoEŠ#Bãs[\è×FÈ [މk?˜aºÍŒ/£B`vl³òVà÷;<â£ú åЎNÆ5çÁãiTš¸ð¾U¨»/g@S+)A­â+èª< ¹‡&*ðxŠ:Cr¸W:þ6hj¨î¬†ûQnÆܪR/™ ‘ r–qxçÕ]¢Ÿ‡¦¢ÚŒ/½âPyÙ®ù+(¡É]Á)6²Å”¸”iÊ È4‡F¼…\H3ô_È­À÷4xTø"„nˆP1ñZÓ KñàÚdÂöéù¡åq¹91×(ÞQAoguxo †ÿ™ ŸŠ]‚# ˆ<Ž6dxøý•îñÄf¬„µYÍÛIjˆ¤ïÞëPAþ +Á lišB’Ìj Þå9Ifý©4Å"G´!¡=JCÌ؉`ݵOÚCŃå—k)Ñ#«~<}<œÛµÒmlVb}@¨šˆêx¹ËÄ+' êûEel08mp‰Šƒå¿‹Oy!^¿xbSABÏ-ðàפâT„ôƒ«ËÈ΄ýø¨äóØ­÷CÔ5{HóÅà'4 T §‡/Ü*-?RÐÏd":5“HRå˜{IoÙÍënç_]K¥Â{˜kâ·Þ¿ýHû„ø'Åq —x£Ë?ìÞéý¡ÊTÕDï$Ç 9}/È䀷Ò*Ø;›ßüÈêQÄ)Ú©6ô*E#Ò=Í+ï+hK(„푱 ðX´YAË5™¸ˆâz=j.†0Ióý¡eŽyðoŠc¼òˆ™ôCËÓ—kðä‡WôG‹9\Sé¢j¨¹z½­­TÚ䀙8‡[²Ûá†?ÚÔ<ä¿h"*ÍãYÌ.]d»c<ƱBÂEf +öñ©MWØÚ@š–/ÎR÷ûà8!~1¥É`K=C?[ ÝAJY…?;û `ÖS]»' ¤—vm–pÂY|q×¢AŸ(e阶J>G=Ö²Xõ{¨pì˜v0Kˆïó$¢øa™¶êÛ|çÜ@JӍ$´^D%BF«\~ΜQªŞ¢&¢‹~‰"*9šl¨oÕÓª¹wš¬èÐ9Œè9¬µÕ :}~ê‰iÇÔ)Ù"…5L¸Sp“q¨Ç†äS1%asddh?!19‚5}©Âyº‚9}0üqä \E6N2JU›HfZ‹îÙâðpvQ‹:f0ó\íԇ‹»³×¯‰tâFã²l0„AD0´wKµ§ÔÔ§“ ¾Œ,ÐÔW:‚ L9bÁú˜Ì»XJሊþȟªyÂu0L„h{`RrûÊÓHþ‰_ÉiÃüa5.3A×3y8P@dý·¬ øRž£"° (‰• ±Sý3Ãψ³ »¡äÙ-?Oq#È;/±µ`ç¥Î®¯ Öµ«Û‚ТþŒ<™s¨G jW0£ôŒ%hC#Ò4Ãóa„æ…—´ÑaA•ùƒ.gY'©K&iÞЌ²ï ·a:Ý3OB°j²܇f³£"0AqtÆsÇûEk’*<¯!ª=5[økNš‘` ê1±ä<¡¸Y_»€W9_҂öc2~½9=èëƔº¶Æ¥f^¢´cNÁü¯€6~ÿ=Bτ.ºÁ£w»ÿ󲔶…¦[®¾¥^{­ÄŠk³ÐµÜî䍵²PÕô‹‰9‚ZÈmx•+ó~ 2QÆåprԍ‰øµ´nlov‰X.ÚÿvKœ©G¥ÆeO=bÁ·ÀÁ¤@Gâ Ãùpf…Ròͪ¤ÈWSÉ w)5rö㍣Ôį,,ÀY¤‹Í`†º­@ŠGe¡Ña`Z pü['l߇S7e:zé…ÜXô8ç¡Àéqbˆ# 隈ְÒxQ®ÖoqëFÁK8š“6 w})J'°Ðr‡Ü1Ž‚Ñãg’ƒ}5_Mx—n„m8ƒ;Íjň¡ßªG +HKv¼X¼2wVõ¶­Þ?<§Äñ‹˜C1•$íٞŒSTð*™õEq©†ØoL¨ýÊ +EÐӋd@ù‹©v p½ŠŽ_U64ô+GkìÏg¦g +췝b›#ÐR#)¤kFZ×Á¾¥·”sx˜3"U`€)¦fþjzE¦öÎÏ`6ã ¼L9)ü&¤¸Ð¶$2,’|SI—Rcæ`Z…¿Á\%Ü3¡ºG"˜.!D¦íbßZ +3Ȭ[¨ÜìÞÀP7í¶ÿ âÁìÊùñÃÁ‹:‚våÌ%uX\ƒùw›|‘ î€ óýVJâ&¸ aZ]lÚ«u+iñ*6 r=ee­´@8”û7f”[Úf,À¦¹È¹5LldêŒ0¹ˆ9&È*÷3D˜ÎÂË s¿iÆáRÂ"Œ“ Ü3Cµ]‚Z¬ÄÄNksÅWƒ(¥²P˜ÏPSG‰àÅ0M;1TèWÁ¢xCÆÏ9©"ÎÖ`oGùœó$˜ù'm(P‰Tÿ{©D-&ärï±®¸=mØšm#óS¢@'>¨!J —í!PGL¾ éh#ZMˆøUŸ.x³G\z Œ~œ¢!{R‡èÛS,/›¢v&\?†³Ú9ÿcˆ3ªb¬Æ†¶Ñ¯ÊdCù¤ºFç¢AVüdlˆAË8wõm”Ïp“Í–)N\3æó¬ÎF˜ÃãÉW÷í™ ÛXԀ6 FZ½6, 6ØF‡Í›ŠýÛhß»šÛZêf¾o:'Lxmæ0¿[{“_µ60˜ç»&™=Ä"N{ñr7–BHñ˜‰ ;7ßA0BŒIGæn3 Ëä²xû³™š&‚¿"ý®r¤E±ù~jàz·2xcxI¸=Àùk.âóށ$iˆ§ã ßÿœè¦ëØ0½jPPYaÙð£çgÃsêˆoÃJ2âFǚ»¿©Ï˜Gê\uÌ3ºÁ'†^‘_³YÒț߫, ÍïQ¶ ¹b¸z䠁ÇԖ+.×ýZEø§rô:ÅþŠû¦¡GAE>Hã…T¯ ӍB€ÉÞÑ‘˜E©nJhÒ_ƒ%öe®¹eÈæs„S¤ÕåR¯ ˜|î1v[D<ð»Y_QõõæVÛÕ$q"T·™01:øeë9÷úS=ï5±nÀIÅtNž:­g/IÙô~=óBàzT&½µ¾Ø¢OŽä™ÓY2Ð;·†=|źس!Œà>:†ëM—ÕF¨äY¬ðÉóTû‹Œ‡Èü}ýó{A{âCJ³'–† vY£½,ßê$X¼’|†$TýÉÿƒö å3…úÁ¯Öi ĝ¯ˆiÁ+{¼¾Îƒpô0™ú32ܐŠ{ڊF‘Îörё™•ß›ÊL…s†T‹yâyþì¸=Ñ£vÊ ê•H¿üs=h܂òxlr ]}ˍçøJÆ*ëbs•s„;2Ž ¾2!ýG t´>b³QŠØ ¸u~€àê®è< ·æÏÐö„Þ ¿`P耠W¬$M:Êp”^üŽŠ¨fd±M¶)ó«Ñΰxfƒ8²{€¤)ý¬avc)‰y?ÄO}zî¦Òñ°ÝŠR\™8'ý¤œ‹iGý9Ɉ…P" “¢k&U—°µA; ~uîŒ@Â`WfúÛ쓵í¶'%ÝVYze! |LÁ&1¥>`ÁKìdC–*ÆY5m^‡/²œ ”â*cMù8ÛÓ5¢Y*¸=`k¸,L£]Ý0&¯IäðŒçC2½ H±n:þL²ÎÊÏ"dõ¹#ú2 a‰HHf4Ô¦¿¥¨ۋˆL>ΆZØô½ôtå5³ÏõfËÅ#Ms9Ý…H–¦Z(o-dÑÍiÈâÑä òoŒ©XáÄ>’ü<ð¢¤ÁÛ¾ÔRT ‚¼=Ts#ƒ‹OLUÓN³2f!ˆ§(ލŒPe¸rÅ>Òiê72j5•1aI†$)”£¡Ü:úz@-Æm2PÒ`¬iLxä1Cn :¬h)D£±x¬Gúlèžñ‘Iœ TiK@;SX%vIUUOšç¹~äÿ|¢æÐsvÉԀ€ dQ)Ю¨‚éT +¬¾,-7|̐I<¸Fnƒ‘eÈpûâZî(à"@%; +NYd!€o!0X¯«ãOè*d 3Ê0Íì," 4š£\àggz8hdãD1S'áMfƒßÚªwÿô±§ ò0âîÛ*ßöÀ}}pyü>èaˆ ‚{…(ø)‰'ï@lk© 2#Û´á\zËTGʈž‚šj¨`.t‰ÚàJ_øȾÌâ³'!0d…àEqÜPè²³Q›Çƒ~¯àl4ÔXê6÷ú@]Ƥæ܌ϯ›nÔAY±cAÊ¢U(ٖšú6ÄŬÈBØË\$œa§’W&¾ˆ½¸žÓhÆV \wû7±ç¢h6Zþɘ©dƒáZ+Ž “0jŒ8£¼‰W€)þ'_à“|qærr ±q‘dÒÃɈÚ{´gòö‹iXBó£É÷Œ”‰“»ÇB¤à%ÄÖÉ¿]œ òF:ÖnçY>J³@/‡H'NéÓ©%È ¾x²ÛeÜtåáÎö\m@Ì S¹¼}Ö8]Ï{’º> c|±%á’î6çûñ”P%ÌÁžù‡Ù4ˆ%ú{Ü#¾¶é¶Z#Ò=l…üBê‹öc9…h¬Œ¶Ã™~˜z…dFȐH ü/jükŠ£ŠÇQ{L𑏦 ½?裸£´3£×ô®ŸTj‘÷¸º¶µ.Uçly:ÆÖäƒ|sÂr]]@lñ÷h·Z QI@ph‘l5ÑÂ&žšxþäÍ·Í™:Í;òzÁù$e$¾P!™žš½Ü)DÎzr°ÀðUÅ^G¹K¹+ró™/-nmi"őd[r+,גҰ¾m;mۖ@ÇÌÌL½¦›Ù<«™´×{ªí%p¢™LD5Äã}÷‚[\îÿþûëòÿÿÿüòÿ—<\ä!|{m{…ð!(a Ê寇š p+ˆð!x }ë¶mÛr:3#3›™ž033S#4DDµ“I"ñD$?¶«ömÛ¶LšÛØK̋“Á/Î1°v +ñ¢A ì€É:›tðÌÝ4Zòþ[ñ)"òìŸñ…ÈY›b¨G–@»G'{?~HBœ{r‚ìEphƒ8ÿ±ˆ/ »²ƒQ]·ÕÎbîóX؈löƒ£wµ}ÜG(÷%î¢ïÀÆÄFŸ’m‰tù€x,wÕýçÃ8Lr³»ð^¹;²W>@®¤’þs{Eî´E:^èêó¯üǖúgÀ3î„n´œn\J¹‡S gÈ~µÒÈËsòç0¦©‘¯¢Rm&)Vu™™{‚¸Î́·֑ +sc²LEÿf#÷Ž[*Ô8j€ö€àÀ“e¢ôŽNY ›w ‰ÜÃxCƒ>gr§SàØ'ŠØ ,´Á0Dª™ìjª¿Â>îZŠ»æ^f†?Wµüp¸g63ÿaÌì‰t¦”ÇÝ ½mȎTÚc¤áh°Ç ¾·ÌÄýlæâaD §ò öŒq/f™=e>¤â7“t$=kï÷°ûĖö6Bj©upwbü¼Ñe‚dwœÅ}¤àóÛ¦@m™¼ÆŒ ÷-¼¼Ð‡9 )è +ÆÆt9",[1э|ĝ{é¢vƒ„Ç™CÜ7¾äû‚擳qwCjY®4-w™ÅùhKµÒÜ߀3=‡»ßºâT¿m'™Q¦DdJŒõÄp/;¶, ´$ãYÀóÕq²HñåJ‘]›i˜BßÏ´¢~Ð4:¹­[ë îB}ÓøLʎË¸Ö åmJw-É圊¼l£–#ôáÒGpÇ*ìŠ>–të&§o‹|Ž¹îr\¨“ ÎeÞ¢gѨ+cgeæ!—P³¿‹këú®}{¿"€H“|›•TÚ³|‹°Ædc0Šb}Çø~{òEãg†Éhzœ“'?<üú~òdGÕà¹TÌoﻵäÍÄoeÆyŽ+2œÉ)%¦­ÑbF™ïlàOaçە'o'wÚ#œŒ6æݎ\ZA +góM$ãÛ5ŽºF PÞ.c7ÏZ~ïr^e÷<'é©Ö7¥,ÓÛ–Rʼn>¨g?õûØPÙ-“œ¸Õ ÏÛ+ #jêÿ瑱¥ªæíxì­ , ñÂ%oð^êø½îâí¾te‚ð‹ü»£(ñIbA¿Û 2Ù¾ÚÑ×ÀÀi¢žïQR,¶q&¬ïH¾)€ûg`ŽúïÔí¬„ˆç«ÓWFâãÓíªQÔ÷ûnæ¸n†kœ€É¶§D®* Ò6º]•C.>ßNaÅÐb•i‰mGî*n҅GB¤?·ï;* +[JÔdbĂ­‹Gîì4V‘Ã0?gÃź˜œíg34sû·çÔŽ%E†»íS#êG êd´DªÜÞKь‘]‹Â”óR£†«¼èNRÊmWÐLþˆ‡þ·^×â¹ýo:O¼‹!Í ÝD‘­q{ýW`µà—R+'½a¤u@»Œ!ÿ‰¸øÀj5àH”ÚXl´AÞ’éŽýx|+ ;²UÜvH€¡FÂ.RV£}íÅdaÿ<¶h-æP–…;x½Û¶=©|ÑxO=û½¤i7˜ˆuÜwØâ ¯—hÇÙLýeë2À[Û×fÏÌԌAtÂMg³Åu)~ ‡ ®º«íây¿Ÿ=®—(å{:¿M<ÖV2õB|+§¶grJ(ºŽ½j6 c"&Qâµ¼×B—´½ûR]|PzéGÛÙjŠÚ Q½ÞmKÉLõ¶:XœÙw !WO+¾-°Ìì¾þhé–l™]פ®ìe¶$îô€oé¶ õêf{ŘÙ2µ…ƒ¢8®w­qèÔÚLaúñF{oK¶§nÛBd;w ƒäF;·Ä½+€†[–BJUe¦!Ûô¬¾ìb;VBm'A…o n¿ÝÄö™ËKd¿=`ÑΑH5bƒˆí6´‚JýSøI“‡˜ “"Ãh¾NáµA¦õï×°}èK1%˜jÜSxìÚ7Ú%pܡ휰ý»7Îî†Áþúxÿ†”Àº¯]áæ3¥üI-œ ÊH¶|íõ¢‘iŽÒ¶ÚWK{ “ ®­×>g'Áñáë¥Õþs¨*´|«Zz¼öܵ8¤ÿ–8A-}QB‚\švíˆiàA#çéˆëÚuÖŒž®iyŠ·Šk0%èù\ûÓ#D÷P+ˆ?lÜ Õ¾s ²s².”l¡ÆµertÆ:‡ÎD[é[»Ä§uz)g¡`?YϵD$Ž¿Ê·l´v @ï)#I&&ÿ:¾Mã +1´ÚK½/t'Pÿ²vöx¸¥ŒOµ§8³.O¶9#ÃÚ¯jS8믑y>½¸°’f¶†Ö¾C$„ wË/«\=íG û„‹Hœs 웒>QùFùkU»T; žþ×ù5šªýÙ=¹W™¡GÄñOµO­(efíNãâ£ÚÃR”­e'®¡Ÿ¢’|Úc”Ãf„½™©3ÎԞ®NÜõQ1ÝȂp•Ú8“üž8sR;ô á¡% +IöI*yuD3jε ,ò2¥h•$—ê³& äKv²Q“qÛèÁÉöìØQ&éÙKšÎ³wuöÆ´õ|Up¹~µÂ¤?¬fm´ïzº :;À> á·@S ³—富0;êm”²èì¢ØÀãá(ìó’áBL‚tµƒþäí†Æs:(ΎמBÌ®-Hž!˜ÅA!ʞ2íò4"Õõ03‚ùbot=_Qýx†§­DØ9È/÷þ"¹…_ÒÉc³§ÀÁi¥ÎŒY[³‡£Ç¹QÕÏèjvJÜ}ý)œ}³ìÏAgW>A9G³¯õvÍþ¥8ÔõH&µŸd`t:³ÓžOK]6xȕ™]­ôq‘ü÷bvÍ×p­Z‘n¹Ø‰ÙË.Ü̧mÄ7hÙitc„“T„CC¹0;µ7¶²ô)1ž9Þ¶$¡æ ËÆ}¨+È$ç¡2L+âáuwÙÅâÀՍãb^—^F®ÄïpaO\v>à¡¥«}<êmÙ :–q e®ãŠõ~2ÙYöTh»žèEú±,ûã7ªW6 ®ïæ‘`=‰¨dËý¡Š¸Qaþ ë·¡oh»—ûÀ¨ìQÙ8à²÷™K?“=X‡Ãþ»‹7Ûwb%c´ŽH~^£eÿ0‰|=֘ÃVÎn©4åÔ:°«Ôfe³ ìEcÛι^Áwûsõ'û´uÔZ÷=¦ìOsô”sœw |Í ƒ,û¼&mª£‰w9áMöŠs¬ÃkÈuñÝ(pY¿qímL§Ü“ìêkI FYÞ1 $;¡IÉà*©Ȏa«hEvA07$»»þךb§dKù;ÆtdǓÄCUc BJf$é£õÈž(Xۉì_žQC9¡Ý¦?¢wp7ú,н!;+BÒȈ¤` ÙÃç,*ì@è²×rï×¹²Ÿ%IÖPk2!Ÿ->îQ@öˉÐk~Úä1$’µ^~ð˜{Øü´wì‚%õƒ^â†P¾èRa;v¡0ê(œ%É°wb_„5DZ«î K‡cz·î°YՐÝØ)JqÊuvÌù¤§mìD`¢®M(%<ŠŽ´ÇPîÈ5ö¨)æw˜ƒ“ñÚDd» ÒHÀ֓‘»¤0½¨‰_ÊR`¹A.|uíƒG´RÞO¢´ÆN$7Ú7„¤ö»|â„ä÷Ó×ñ &[‹=0r{ôbx˜À£§Ï7^±“3|DÅ¿CèË §ÌERŽ­Ø£@¬ÇF*öè·s ·(´ðÐÌÀ6ˆC'bà5Z„õ)K±?íŒÚ7]ýÄ;OŸì¦’övØkAÔú§\ «JÑínØ÷rے±â»-üåD”ÏDÂG촙gPÛTf9öÓÎr˜8{¨JÆMT:3ìÛíûNÊ?|&‡[ˆzà¯JÒĎ/±Ø8Šð=Ñ´ûMઘU¥+Ça_O˜~îNnîNxkØE9$à5ìÿ'ë;·ª™<ÞE²ÒS@ôš–aGiÏ1ì‘¥{¥NsÿréΰéPaØ3‚¬\†‚ö+àvmÀìÂNôc•#`yïlÒY˜ÈžrÝèÏsÂ'P +vÖPËÂþ½=–&Õ¹¡3Ù¨ÂNñ£B¼j/°I‹ü<_…zXáׅ)o„>qâAp(5*™Qx( 1ø ì䙷×fÍ]WdÀ\W2Gj”útv¢,S„kRF’©†([³ƒˆgvmÀýÀNÊ9qØ0XššÁ¾>àI;NS]`Ç6œ +ìOD,ˆæˆÝ¯¾ùr<¡ß Xã{…ØÂàï† û­Ì†»êµ*Ÿ-ÃæÞJˆq ԞÁ¦çÁ¢‘ÏxÿõHš2Ô i–]‰í_ÿÕEŸ…¬OúË¿®Ýz}JØæ¡ät÷׳͖¤Fù~”Ì79=ø“õ×v°öS†Ç,ý];“ƒ¯_g‰-zOªu¬œôë7µŽÌâ’tW}0?­•Ãû¡³¯r®V–.tÕÝÔ¾4¤ž».¬¥xȆΘk¼ã¦NY]gçPYÈùIŠ¹|çò¤ë°±ÛI­É×&ê¸É8°±‚ëÔW¾œ·‘X¸s¿ ݎÈÎÈâë—ÃÐëPFH‰yI©R®K#Ío¯O/ªÐrf˜e7töz4`Ç^ºª{¬êryœ“ñl1“©×Ù63Å´"ãÖ£È(«˜Àz]¥é~ú’ᬝ׿եv*õśà}÷$íÅ"˜TCZ å^Tƒ™†îšÅ‡êûÄ!+~x‡|S¶ññX0ÄS/ çzfc ¯£Û7>t‡=‘Ì'ä;<ØuЂ|̌ÕͨïúI`¬•w|½ŽrÈĚÎ,gï:Fšû샏ùô•9ÜÔùÚ·v2®u×Á»ž´8‚ð“(í?vpî‹rNÞWg‰c²W×£#«®G/„U¥—–܈º^VØ.z¤#ϳ!͒KøêfÄÓõó +df6.XL½;K×Ùã›Hë ÈUP)9òIºNgG× gÜÃÕû3„øˆpà1ϝG32ÊàΓCÛd_ñi‚Dps]nÈå[¤í°·cøuåÌõqŒ8<µ=lž3Žûu•rD°gÊÕ ?±‹ôâŽ%Fôô¾ÒõOy½&wQrÀP!×ù ÖF…Ö\ãÂò‡–½Q {l%Øg@›þ,à–õq%Œö˜E +ïìd.\—öu-¡¨Ó䅺Ò&É×£¥˜O?U”(ÎÕ8É\Áõ¬›;dn26ulu…{õDèãë¸á5ñbu%Á*—C*T?ìx˜©ŠòvÑ #w=¨5ž½ý„绯.Æ­Úª&Ô…B}úZ·ˆ³8™÷ h¦VŒ/Ž˜ãÌuv[g­ ¯ë“ïdÏjšT×:Êð çÖñbfÊàýì-ƒ +Löv_[Ϙ¤Yn¡µ5-'™8à*K(Q+®f©pzãÍÖIM†?„j,I†¡9p›%,×§É 7b‰tZùÙ3>’‰(-?àóÆ(žÝhÔú–`T¬©‘°l}iÆTyÌ-â7ÙûµžNq½ÖÇ} #•ÑOÌÌ0ø¡@zõê»Öÿjm³Ñ‰¶\ëŒ#Ãۘ跿23EâtÜaqW2Ä8îaòÿ—Øžq}j}ÉV‹ÄÒÍk]i~Á `öK­‡Ôꞃ3Ëÿ«£Ö·D£Ça5ší5þ+k©aƲƒ ìÉLëÚî=!,º…³*­w7½õé r­°s›´®³91 +®ºX/ªçMäÑ:šVÝ:Â+p'IfÃjôÛLªÙqØ¿H]Y—¾kÏ( fÒxÑ:i¬îúòːW‰Ö©Œ3šeŸõ¢(éF|ñä=ë#r¥õÊj†òò¬KÈeI»³¾ª ¹˜ÚÀ7‹ø’€RJs˜ôÿ£¦¿Χ5/mæeÃÓ:…ÊñQZ&Ê¡Ñi ±˜¹ó¸ˆÆ¸r¡ÉŒ ï¥9hû&¢k»L®9Ê:C¶ïƤ ˆ± 2­ž_Ì{ÈÎÀñƟX›^Z†P˵£¥±@ +Šl`Ìùù°^§ž'dÄV‘ +|vܲÃ!öÀŠ2¹ºt–lɳ|ÐëEۚHÍfRÝÁ²ºÁº÷[¸¤2½`O©W•y‚uºñRPJèÖ3â4÷vNBcV`½ÔjÙ»3kë>`ýoۣԉ¾œ±Ö;B•Ž;8t§‚v@aœHºûˆ3 +aYÖ6E¢8&{Máw¦Œ$Ò®õ•jïO"zIÊ7HBd²ÛÂMþ¨'íÿ‹J%Ðt'5›Ý5BÕr$2Ú·cÓ`¬€/µÀ¡Ô8´Ç4W”ÈÀhÃËÈ~¨*ºÐڌeܑ“|šDÐÇË»lä2>¿pUF¡ãÂ@ï¡„^q„Uðòr»™'™o–VJ hjÈulðe¦ÍËF‡˜”¨Ü)<€Èúà9mWAÜJ¨…"0 $ð¿Rh-"ýÈ¢\ª¨ÖD×K©±Vy—eôˆÊB‡&¯&@K»eˆ¸µÝ­½«ÐՁð4ôíÃðµaLUã–فa@­I¨~+…éð8¶¢¹ý +†ßPÒCºšÙsŒš‚ „8ô"¢ 5I,SUµ´5Ãô¦–ÚXÌ®I¬/S¥YU«rÓ{ŠïiÄ͛s³Mç-J;UnXPtÝ 0i7YAyˆÔÉÏEk -!1«¦CEB|§±‡Ï<õ¹ÈO'FÄÏaù£õsÄ1ýüÏ 2GK×Æè)„O55ÿ¥´L>ŒÀ!òûät!Št¿lsJ Ñ‹ 9”CÚ©ÔDAüvÆ}^# "Y½"î +®ZÌN:†úq=9,ÊU;jv¹ŒU„F ÝK‹R‘h¡»hô·‚_°Ü¶}ÇrôëË.×ð÷*(HSiíê¸,‹„ِ‘„*¾êü™¡8Ú«¡-§Bb©±®£O%CÒÀ—° ¤„ `SGå{í&í¶}»pa]Ìl(Üg÷¯\$cËÏrúÓ3øÕxì¸Øábæ.ù”ô+#€‚ vXØ®üõ ËV¼*§òªCý`&¶¨™rnTK¨-0ŠæŽuB÷A r ­ê¶wøöZ’GâWÄ+ódÔ%.óq¹ÆoŸ¯¯/x¡$t›Û÷ÐN•yWð£øpãq—švçè„m» #½í­¦5ڎÆVÈ’dB_!)h"U™ÒHÃüÒKXë—A¾ŸI ˜Úx|ƒÞ E5,…TÇÞN{V(ŒC3jœú·mê•egä:ߋ-+àA+ˆ=ÐL—3b´H،¢€Qjäê ÚC}€7%wåӍ‚žªªfARxŸnŸcÎe¯¥ Ê籨ržoh¿r9]^–ŒÖ:6±,¤ÐÜs3sŠ íÓ ž ûã,£Æ~Á“ÎLSfájÜ +“ë¾0\½xqVðd£`ëEQ¹p9ÄÈT*J‚k’Ç"¾ùè¸DkaýŒ`ó øYur0°ít —ÿ×=¬«*Û£›ðÍÖÈVŸl<*»×qÒo. FxAv7¡kâؘ,AæxBy@mØDÜgç‡8Cj¢[ Ä®â›s­~)¦Y¿|ùcÏé}Í¥#;Ó +D1øp8ñcöj˜Õ /é3”÷ü&ˆW™+˜KÉËf¬Àȝ»²ôRuӞu,ûƒ/qHTq1Ás8}¥q/Áë +»¤SĖöXÿòjg—„ŸQOâUå/ÂxDÃE¬¢ofV +i¯3®Ï1£0ï 1ÿžTÈ)3ƙءgë¨Ü4Šaƒó —U ŽƒÇÉLʂj“=æ TÀ¶´2 åV#rxBvMK +:€>Üy"=ßG¬Šš‡üí½Ù¼îðù’äï?4Ñ\¬4r–Õ ªñ²ØXp…gE#MCþ„ÝÐ~žä‘Úç¹Og©ӅP×Ààè ÇÃ]›G̎>¾Ãu-=°M3‰ÓB…[Fzú(N<,ӟ*µ±.Õ¿ì• ÏH»|WM}ì—o/-É öôY¢‚ÅÅ?Öå)â`úèАt9]_ŒÚ"…9øa&¾¶òäõ§wDz?²”žàÑP‘úÔÄβâ?7¥ðòü߯0ÞÒ3㎿Lh1«ÕÅ©8œRÂÉå$ÁÛÊÈ3'‹ò¸îèˆÎýYè{—l ¸Q…Þ¯ký¯¾)ÃÌd¹«×hÑ ¤„E-,º™v½Œ¶)Ö¬ZUî6/bèRä!^OŠ“ú¿?Ôd¬ÐrUr2uw¬+íy&UþI†mFpœû,(þÆÙVyz£#•I$?i>8ÊB +q|{UÌjÜ#Vb¯]°êéÒj¹³ñÃV¢tà[»€ÚóíÑE~6#‡qò`þ¤®‚òÿ¸Cº;:a$¹å‘Ž=žo\]”rPK|’õzQÔXŽ]ÁÃærPë¦9Áç(rmNa@`‹ÔÅ"ð›ß,óœ@.sòïö3º !bûØÕŒXKŠÿŒu‚ˆ™àY"ã-_þöÉcÚÔùÁ^§~+Ébf˜1ÙH§kDs„2£«Aè{}¤A’ߐ0úŒp^ =!¡Û¢Í±ën/;÷ið7ÒõÈÐæ­¤hâÀzL·FáªÝrÒ°c­ÓjÕµ±Þ¤+( æx)ðµmÄbªnÙm²z/4Ë«ÉA—°õŽ̌"»çŒøõḐU•)HT¦]‹ª1öT tV†[è?7„, Œ[©AóE³¦vUßF8Jk;’âD”Î ˜–$¦ô—.×0ürþÉò‚êKÑD„Wϛ¤ƒ–…ažœyNMrù 0Í¡3M,ËƤऱßaDv—1ˆQH–þèö›# „þ’üêo·UÂòààIö!©¨5HxƄ•3¿¼mÚ>ƒû³+Ó*Wƒ°ÓvoqL|ØòèvÑ¿¯Ç5t%) ™!ä»[û̈:ÙÞ.ó„& ‡¶jŒSñÿtˆÏ€Ò‹ì­ÕÅú±jã¼ L@Ù~??ëZ= &uF–Mÿ"YãBšê4¢M®îbÌF¿‚EUëwŸ/ÎMùπ*LLƒ:^. ̆ÌÍtqa¥r_bF*so!ʁ±2•Í­‡Ç“€}Ùh´GΡCÌ/Åù~øð=¯Ž g³8ñ»1Þ2㚾‚ñlqËû ù”ûžú3b(_¿÷£Hy/ yª[Êêû¥8¨ä=TÆ_°ÛJ"'Ñ(`ÁÙ­?ï’¼¢d—/^38g؝?ú ÝFäÝCi¸µ ÕÞyxé<#j¾vœ\G‡†ùóé?î­Ít>Շ¹Nšùmgíß¼kg¾.]Ñt9“¨Î÷"³v—ÞÉâW/ž²téxˆI¢Tˆ¸(·‚Ý؋D}S4ƒ*Îw•ÍŸÅÓër·›lŸ ˪PÔzÇ÷A>⁆gžtUi–zNØ´NAòò-pfFo¡ èø5ãâYæÔKwA{ÿ€•Ë³œel‹IÎ+ˆ‰™Rtq8èGtCÁĉo~!¹)§Ï±TDR…ü5±ý[ÝÔ9þÝ)P4aÞxt¤2†‰'D˜OðÚ ;f¶4‚&ÁDìfMÐëòj»¨¥‡’ÒNÓw!ÅÙ¦Ó‘[E< ·–)@" +|­(!ÐaÛ­È÷˾OøÍd(”,>Ao«ÿÝy2ÿ³Ž¹QšxŸu °¤Ô@Tv #ÒÚ\<¤b*!%½Ç‹YPËX>`ž¦C'Š«O NNìX#èÏâl¤¨‹ýG-™ˆ •õW93ž£Í¶r4CèÆQ€P}|MM蔭Ykê[MÎ Ø9»ûhZd—‘°jB÷))`ƒ2PZì|ÉÓ47) } Ùdwâ](mT¥2Íë;nMh+5ƒL¡-N^P|œ'ÞNل÷Ž† XA$BŒM.I5ú ÂS"¦²ï#©°™åÞ8Úò¼—Ê#”iÑ›Ómby>r;fBMêÙN8!Ê»J0‡á¬úàX|qÊye’5<:¢l$¬œŒ‚d¸§¨ `§–PY'„`‹[O™~`Ô1 TØ4’b‹Î؈‘q}ðÅÚY"OãVÑoÖ/ï4u˜ïÁ?v$C‡""‡ ¤fáBÛ¹V²„Æú®ÒòŠð²»ûAê pªûeg¤ʂÎ.~€_ÈõÍjUdRÇ2ò9ãÁéAÊ +Æà„0O±¥©Ë]Šä‡øc'Dçÿ“е¥ÏtCœh±ã‘’À íÌ·,›× Á•j7¯L35Ð-‘Í[ùě;x8°ð(7Nkš• ªu†Fd€™ôé«ÉŒé4ÁAƒ…tò‚œŽÀD +v7ä#P!Ä[Α™üŠÄVÙPÀF¨,YÈUÛQ^'BÍ<™]N'Ðòè”,üÊ{š3•¥Ê A™&h"L՗lÅú¶ñ,öì/X376Äï+‰·¶YÚ5w£ô®éohŸéøš¨:̾ÎUŒ¡¯à4ÇQpšV#N:«~@výN…Ê-è ·]—œd×ýf‡‹pÙ£ÂIÜb‰ß$`R3+`> +|òI .Ãý÷ F`3Á a ¢lñ +ˆƒTºu8þ<ž!ÒR‘`ÔewS”Ê(׍q¯DìÃ% ÁãÌ<²Cœ†å²u(1u0¢hëÁÊŒY Ûà–÷ß=yÅ©ùM7XSnO°B323щWځ)ÈO×Ivѽca¥¿é`ˆ +«9Ԅg¶E^d+¤ßRq{äԞ³—u‰¤ +FtÆ}Ü+ÝrHP‹œdnX° ت4Î0¡1œû¸'UÊà…:áÒu© ÷)í‹+*òó¬+`&( á±G§!ˆ‚h• löþTԂã|ÑDt†ý’Î"Š0؈ãE)éR†ÁÄ50D”|ن žÆ{Ÿ/Ĩ…äŠàH.hÑ%-t2DYӞà _9r:à*2)´âŒ +ˆ>Jbö»Ÿ´D½mn  28ÞcBøÈ[@­{döéc³ËbðiýT\ýoîAÇĊñ<ð^@GTnZ~՘€ÿ2Ú¼àû RIRâ}¼%°9a¯Ž¿7 Î=-1fßت,Æ0–NjÚ´Q0Ճÿ3“>ùs¦Ýî–còDZâó®`²EÔ¸#ÊSґ„|Ÿ< ÀOjÛº\Ó”‰Ê3–"Ë°¿õ´ƒÐ`Ã[ŽóplWµu¬LšÚP=]x LA<-¿¶‰¡))¬M“Ï ½ØŠ~•"wçs¿#Û² {ˆžÐÎb±ÀËBˁ¼’ñHÿ%Åކ[Ä +l‹Çd‚<«U·c¸†ì½§OpÿÐrƒ3#€ +ß$ŒjÐ ¬Gª±DGU’pè‡ vA¸ICØ®ðŠàÀCÂÀ¡€"ÝÀš€M7M RÀh2ô›dD>Ë$8hì¡9¯Â¢+G2÷Õ&Êï¾8_‘‹zD«“é¤ äªòvˆšŽ‘H±³!Äß «+Æ1ÂÇï¼xNA9Óéµ_ËHÕi[Zs ]P¯œ-P$JCÇ$õ ĈN¼ˆ`Ú%Ë-Š¿£€4x‘ C>_á˜C-§-ànÜ×qÙ)Alˆ À[Iñ»Ÿ3k cŸkL‰‹‘>b¤ àø^@ìC–àEH…˜l„ÂcÞdDˆ’IN[Éñ< ¹(ÿìo¬ùЄ"£†¥À ©,ªF·¿ã¤âÈÄÛ¨˜ðqC$³~é áwÁú ®›áò, ›Û Õÿ£cVܝ½€Ô.æø˜Oú¶zŒÐ +î—Ê…ÃçuY#(¾–ž–v +2]WʓAÌ?¼ž“t¿ç»(4UGÃð8 þ{®`p¨÷HÂíÇ©Y(ÊAHédbkeª˜`øÍÄÔ&UçS#R¼Ý¯5iì'°J!I€«Tës»Ÿ·€ä@w´A¥]^kBÇܚ p>E' ³)d²pcóܚKf™¶ õƒÂ¤¶º«­_E\œ7â¯z"5ΎàÉ)á"ŠÌœÙøÎ~ZBW>xG#Ô¯E½©¸±¯O6i„Í¢ü€ãžOĈi‘ /ÍVx^ ñgïk)àÂ÷Nš1U¦ ÷—úA&«}ñ'‡P¥²ŸIh¨;¿Hz©·ßW¢ï#¦l ƒ5UT™ÐˆfW‰Ð\Óp•–_Dï÷,~õsªáÖdo¦oCH0w©}ÛL4©ðZÔ5•”uNL…Þ¨PuÌ]ä’ÉÎ嶦Acм×aþHzÁfŽrÝݼrs§¼Yҁ–wÊ"óTe_u¼OÀ §Yej ½ÿ ªY8Ä-˽Ñüc²_²ø!"ÞAFÛ$›uAN¨ÛÅÍÁ ƒV8£Aš3LA~ÄVx¯SUH² +Pµ8: ³€jøX}´=puþT½·GĉƒØ!ƒ*Ý82u]ZI]s˜)–ÝoLî3·p’!\óýÀÉñ"2Ó +<ôˆƒáýêaFïxr¬ CZ8•%Ù ,©ri•‡ë +¶º-,‹»µX1ÒŽ D|Éq@ŽÜ2¯àžE­Pkœ +-ÎB%É?YLL€s ìÅ´ +y»e"ȯ = <€jâág(Ý"t­âÜõ¦—=³Õûý¦Ç³0LDGöv[&S*ü}G܊Ž!å~zÚxRŽ·Åîsß@†˜` ´r„¡&JXk¥X„rÀ‘ª>d_ÍIU#\NÐZÿû)ª²$Qûg¨P€lyøº¼kÚQX¢9ÿs_*”Ò²†›±Þ$Oâ6J­—NrK™§K®4@êPH>†£4ù*@„ì—é– ¤>RHpN3áÔQeò„ojÁ@#Ñ¿±)pe ·Kd?Ýz”&á@MH‹z‰O +µ $õø4Ù;Š‰QBDø*}Ö …S4’èž&U{Ÿ[A¹Žšwó\”ƒó9·ã6¢ä ȸ쀭4JͶ-6¶}Qš £qþYW€Á‡Ëòˆt¹ÅAíP/p«+)G5$Áϖ‹%z@Ep‡ƒºƒ%þm$ž„æ"Èý3¬æ´:Ë3$Ï{øß¾XJ&×îË †aá¶zÛ>7ð?ßêQx¼á]ßKď•sKÙ|âtìÀ_7 ôo tŒ$(LÝ@ùxxæŠÔ7ÑÏx,égH#ƒ„¼‰¦²À·9§|{¾ÔÒbäô¶¡5Õ¬}ÉÎmï&;IXuGŒÉ¼G4ȎvÌ|͍†ÂîÿèðÉé™Ö~¦ð5€(â®i#vހŠÜÏ'09ëÝD÷´„iÌÀ4Èy¨/P¦ ˜#¨’¼TGÂj©XÁö°Ò Œ‹w/Ÿh>OòÖ ]DP¥Ceá‰<)Ux&æ¼i—p,b”ÂZ)×kýO”¢Ñ€ Á&Ó¼kqp‘·œ\0g$T¡J ybì§]wb«ÜJ¤HK£>ë aŠ½ÏÐí“;<#4æéW?ޝŒûv!!Í +^¥#퀟”ÆœC¯ÀI/v—Ö¹ÑÛÔ¤»2I›µlÆóè`;0dý’PO5KkrνªÐ`“gòŽ·{)¾2¡ŒÄL'‚RÊD”KkMµÔ ³9ƒ<'†fàœõ³íZšt¦”‰êþ +ˆ A±ŸãÊ*Ñ2¸Ùá°,D…À¦÷3c¥’ò(WJæ#ޖÀY–„^«`IaS¸%Vœù@™:<ËjEûVNždqA+©•5æØhîpôš ×ҠЃ¯!¨ÿ˜õ (¼†f M°‰É›ã"£é{Mb‰ÀjŠDþpáP”oeï5Šd!FƒÎeð+ã¿)ç1W5ù XaªXa©­Ô€#õ´Y›,<¤YU•õžºŒÁ94©Á‰-Ö¡mTÆvîi֎çU°Qùm°ºŠTFü݅‹ —.)/;n@˜ðd@XU#_ü§Àc¨¬¡€=c:mɱ©ÆƇ'ûŠ!ÃÀ0#)ÔOcÈ¥V±€sZ¦>û*žêeYñw|ô3ˤ#^0›ö¦˜_ýðïü¿ùÖcŠ­3²BÇàó‡!°X³ÜHnº~Î!]h©\Õÿ'3`EèºáË +n7}“øƒÓ荼´¥»÷dÝb"F:¥x6í0–ä`Er¨Ðc^|½³œäMÒ|OøÓé?pç€ÍÚìK‹‡(æxX˜SÐá6/±+ ã%d‚Ä*Á„x¦E›C0^6 .t +>Šþë §—2"H¿! n™íúæ(þA‚Âø};¨»Ç(’l=ÈJœÉ%*!×lþHsAFpâ`XXÞµ—±Ù%þ5D(þ–ö¾xa…Z͹™OçN™YîêšÑR8¥ËLwÆ­JJ!¾Y YõÍ…€å¾!®JÓþ(—âÀ+Æcñpò9ê&-‘|?ÜeOnü¿OŒ>hÇÒ‚æ¨ðÛ[C™]1˜±pc)(dQP‚èJÕÛ47ƒç®®ò]GZXµ…dâ½<ݵŠÂMì© Åƒ±ãûþ=MK½þ¨âÌ|Ýêу¤æ)6§G®´k=„°x¯Ø“¤ #·3¬Üg¢íŠôîÊ#sù‡ Í"5sGù +h!×·v¥½Ý=FÏxˆÇÕU ¥T´HàÅ ì áŒ1¿¦R+ÐÊ,ÝˉJè§S“rX^ +T”ž‹° òìàc¬„–L÷jÿôö’ÌhÇ=ORg˳FZã‡þqxóވÑ8µ‰§ôŒý8Ÿè%¥~†¯ُ¿X +„xf”˜öÙýŠD~üdpx6Ñ&ÐÌ9J[±ŸiZó줆a‚i¤¯×$¼DT^3l?ÅEqdIdÝ;ÞŠ’C'Ù™sÐ}Á¾<-³PØfWêø[³ñhdo¤%RÅHbå‘ijôR¯Ã&ý=¤BL<%ÆÓ«AƒGÖyS¨Ý ՏLjã•ú}7ÒêÑožR¸hwÈògÑÛÅíÚ ‹7öfð ´NÀK­Iž‚Hu‘½G6œ†ãçµ+dRÎ{ù ~&~ Ó$0lוÇAz~’c¨úÿ,‡Zî]ܛ Šë…ŒTS’Ęl¬©Ïh G4’Y8G‚ÌR÷¤cC®×$æ:*š¯>v |ä»_©ÌóM#4¾‘$å€0¾]  °JõMÈÂ(wÂYóì[óR~EŽ†ûÝDÀŒJ™á?tŸ‡ìT}Ëp‡ðÖE¿Èy_&‡¡¬ÚqÖRlI³ @­³— Ñï5rÝ+ç¡pFH=®@±õʽˆÜeÕëC…ņÙYˆ™Ø-ZaðúYÌA¿KíÌ¿h«2¨!%BI#½ñ-<³ý\é ¿cWǬ=ƒÅ•·wWÉ$»‚IoqgSr-/,WzȏJvUž²”n;œg NC¦ˆ¨w¥p½w ¸bd`ëðYžt¦€~ftÃoː4Àû*ÂyB[7GÀ³vßš!Ë‹±áayÞÈúŽ#„íú~ƒÎWp°&¤ÖÆ•Íu„Hz4‡óïÊBtÌb`±ù'^yF™ð寺ê0ôR¡Õ)•Këªt$,0ôªU­Þ=!Z®µbH5Àó÷Bûäi¹z…´ˆ— <žÛ¬”¢T•#·ºÔÔ> µZ]©Ñ Óã®*F y„ âÿ›HÁŒ1Ð^!¾ 0ä= +Fù»v!ãpáÅ«a(‹Ž&A9¤‹ÆÉ]:¶¢Ü䇻GV«S# ¸ 0¥Ã¬É‡Œ §¤8œ3DÓmw˜ðÁ¿EJašH_¡€ŒÙ³~ZÕ`;F >j¡Æor6cÍ|Ó{KGióÿtÖ¶+ ¤Ÿ„「CªÛÍàD¾5] S‹¤qª°/âM¸e_ÄúÆ3Oߌ0҃ϳáè-À—„éÒîÒÎSôýÀÿ¢ÐVüx¥Þ¥ÅVpQØAó»÷¦¨ed y<34#w„ 9`ºæ–B¦7֊Vwé'ÇZÚDäæ9}C—È~x<-;ˆ΢ó0à 쫱g .¤mÚ T4¾Éœ_›^ò,«@i"ÅäíV)9áԐ·dj«¾²N‰NR‡% ©+A“÷à4z!|´Xun°xIâjh”+éÕ°f„í@#øGáÉK“ãgñ.,èF{ԡҋ9åY³mQ @Ð9QœxÛL#o#ù ª§pš:üžYh}òÞö>y£çFºxwIÅ«yrÃØJ8]ܐ>¡eí”3#>Ez€ðĉµk÷;ÄkIÓäo3:Ã4ñé +òÄÿ=ZØø—»Þ9ˆGàÓù1Y1"oxÚoÓ§üEø”òÈ+…–ãÂTÇ_7<“½ ±8IŠôyªH€‚j¬&H‚õßw(”­ª`ý«‰pRB’ö^æ Jb•À¾™‚<< wéWñß:€ûs%È9z ²ð X‡G¯õÕeOßaK`'Rì6Þú¤!ɛáus¬FªiQ (åKa¬émåÎ •½s"C£ns ûßš Ýä~x½ácÿ¿u½µ0×yøëâë.3jÃ:Á.}vƒç8ºo™½‚øNý3#ôJ4Dý:åU™š„ó¤f·&öB$ÞDb#ýðÕ-qíOGTi3•08D˜¿3æУ’ë«Âg`vEÙ§»Pñ›yÏِ‘lNº‰ÉDE ·‡U#þåÈWρ@…¶¨ I!;Éë!™– åv©ôåv ×¸=y›©#ÎщFC,’îØɾÙJ¹™~Ϥ‘<.¿tô ávàÑ2ïJàWÂo.AÇea³zGS¶LV!Ú &Ç¡&ú½tK>'úÀí¸„Å7É~XÉF;ZФ´ËoT]^“ çoÓ1•ºÍ¡Ð#$3(HörÉKâ€Ã×ZÜ©!Œ3ñ‹+؜¤+Kdb°Se+ªëKP‡Á8jÒ&H]p@™DE>¯G+žºf¬;(ÇR$/õ`]áê¸ýl¾ðìÚùÃiTŽÂÓNÎq(W·üÈÚ`]·³y¢Q¼À×ôj#µ O2”wÌËøa(k˜V'†òâ•ÐZÂ#ރªfÌþŒ?‘ZcÞá¡!Ž Âljèóó}”êByï±Jh…¹ù6 +•yÞ|›´DH¼ÚìÕ'æԈʅpL?Èž!·A6”a4<8'0Çe&•J5Q}pË.ŒÕõ_Ò-kØ–¦uW­"0,ˆ&ØŠIÚ´8é-V‡DíP?ü«@¦ÐH ‡ˆŒÜ^¬†o}º‰(„¡– ð}u¹˜¤TÞÛãÁ<]Þõ‡Dƒ/ +·øjAÞáeø·üô1úŒ¥a:hBåh­2”æ8Ó¦Êd̵Jàþ@Ð†ä »&Mޚ•MX0yAó'ï¯Fz8æ-M(c‘‹ˆ±IL½‰K‡­Fl”‚ú&w$Y·&dAN`$­b0mu8ƒMYjá¿6…è/ӈƒ d,•¡¦«¢¾ F~ ¥°a„šŸµô¡¥°j_ÔdIT<Žyú^MÄ +Póä æÝЍ&D€s<‘6³Æ÷;w$!?:oŒtîO—†IÇ#9œ2q;fŠJ;Ž¼¹Üã±t oB1ÀdæòÇÇ C†fØGß_rB¶$³µ +óH/Y–‰N÷å+þ/"ÈH…©Ì8üÛ¢pþ8ª ]%ò%T®´·ò·òq~(×ñ牰1íØ ”ã© ôŒoŒõ™õ4¢˜Ð[ââ3­Ù»ÿ-nÊ´‚ˆaY5믞÷>““A³ôþHâÝÅÅ-š/>3YˆOµ{¿T䌞…Œè YeFTŠ¥æqÝ#1©˜È8mªþ&ÊŠN«ùJÄF½Å 18df'Ù"ÎDI0Øt%3²’`cf"<Õ´ $©|Óî$³o¢9þ,ÖCٕc香^ ^¸Bw»¼œb45²¸i‹‹œÝƒïòғIVt6Ó !õú4×ü`Äì„:¶‡ÙzfÊ>IRÉ'ğÄSóuBJ§Ù‰G¤Úhr©`¿a)¥áв‘ åaþÚÜYÀ÷/7|"'Ž™Ø¬6ƒ”F‚²”ó#¾pøpÿ™ôëO‰C9³t:M{äRdÝY(¦ÀÎ橂ŠZ³(/Ðók˜vԒUù†( ã«Hô%Eä!ÕX +ò‡H+,C"´Î‚/ÿß»˜Ñe·ø­5¥†¸Ü†!R5_p±P1Î6uOƒXÒ#SÌÓ¬àü᎛#:¬BÁ\SÎE¸xè›Z»øÇwŐ`võt ÍS€|9_ó†Â\;¾¸[¡…†¶¸£Šøº网Îւ +¡ g²õÁ‰Þ ) ¾üx,ðaܹâBª2" ÛÍ5iiby3zͬ#Rÿ:ڒqíÓuâ©Î¢©LÎdX4×èW¦H=¶"BT‹kAwS¼³þL:†üË>,˜¨{C̉\³ÈɍÂ?>Gª%Ɩzü J†)7ƒb}ë8%¹ +µWw26(}Æ|AQA\ +Úþ¨õðÌ TÄ串àÂÎ2H3@©}Â!GT·^·ù¿@Ù(K@¡—êÞS½ïˆ€R­Ÿ:4¹‚*^´®Š"šÂ)=ØÁ?ÉñRÒPœ‘ò/eq¨ f¡ôñ+.B!”Ÿ #;bJSê[£B‰ ކ⥿ÜÒ'¡*F@V-Vü0/yì|d=ÜÑ"j’Zz[°!P\œÌWó0Q0¥¥Ý.ü¢8.#}!UR®—Q<:{DéÅÞÎ¥ÿ£êS‡DqGîð17Ÿ½×‚Ϧ½Ûóvü°S_bÜiQDۍ= ǀaMê«b,ÍúZÇ`nôWt¸ål:y㕣ôV¾ê%‹™4¦H”Á>a)÷¡Ðy\Â0µ€ŸT›ƒ$î#IªFR¤ àFÐø§ˆ(諕0t(ÈXûä0åWà7Bà.\±ï¥Bð^$2Þ +ÒñC{vˆèЉ0íëqž¸ôözë÷ÞêØý£ÅÖ%C»Ì½»-šxß³6ÎáÈñËQ71uÁØk²T Í0³8¸'=[áUdېgRkˆÍôeiD‚]GÏ@Aø2¹¬1•¸=«.©„´üÓ®içžÔ|¬M­öÔZÆÓÄà"Cw¶à ‡-iG•s¢ýÖ§­(^íé 0b§.¥µF¤I|RT›ó9K+Ô”üoŒOÿ,ßÎÑw8̟T¥¢É‚ÈÏWq˜ |kd\°¼†°Œù.¯âPoÕÿ9D³¹¼SЦâgbš§Pô±L—[è©Ý•ÝŽìri‘ÜŸœMė“B‚~‹…äed…Ì´ ìéÁ§“ ™jZn,Nr%0çFR”iLŒ5bώóÁDQnC\:´<üÅO½€±±ÖuPœïÎÀàšÇ`ÀOSÚçìɎ¡P4À4#¿¿YöԞ´º"¬GI²áG¶sÒÛe†q …3Úº¦óY°-=H¥BP€øBEhx|X\Ù³‚Kb<Ÿ¤e‹ÞÒ† žJº%úBé× +EP4¤ª'Éɑt:¢ÈJ®PÑ!¡Ù·‹yfI +}”š£@ivD·”¦|°“< Ð̂=Ré*RÃÑBkƒ\¬’¨qà€ŒŠ´JЮŠ3±>EvÖMc\¢«EŠžC:.GÀMü÷IW$üèT¬i&‹czËʟ<ãS-oÑlƼ–ºxxsì+ A10bº?XìLmÜkÞÅ|RÆmððCÍ (Ö xkr´z„™µBâÍj3M›Ø8;W›)#8èÄPr×uŠ* qð„âúª+ڂoøÄ ï'Þtµh4ºøhԄu¯·Ùò$֏÷4Ÿ±4ÿ +ßù> †Ðø«g›ŒœeÀ„íèÿô™Ô ÝWÎó›DE/¥•y;±ƒ°ÙmqØ&¤¨®ŸÄûùTUÒOx¼aˆø>'&.˜Ÿlåk)bèÍr© WúJlb„›Ì°=„ŠÐƒ êì¨ÞØYšÍ²‡„LX6cÊU{w$Ò3³WS«ñ•@‚Á¾ú)ûDd³€„…¢×ªØ<0c D!jsOt½5&o„+chÓc¶–WÁ9Æ[]Å)IŠ…¯˜MÖR^ÂwW«NE­£û†òBÐ ׎›ý;«†b’òbmG‹C–•!jÇФö’óÿA«5 ¿¾ˆ\øµ‡×+Y ñÜxOKJ€Î·y3#…TÒ°îÎF#O¡ø4ÅR’m“`ï®Ó©v=*­„ï‚ÿ)Z¢ô‘ÂÉSÈJš×ÛòX"0ÖQ +!PðÁÃ<G"˜i`#lófì¦íö¼Fƒcçg1%Îr‰ð +÷ú6‡Åu¤ÄaÓ´9ä›rj²/;V<¹£ŠõÎÜ@]<,ç܃Í̓kl‡º™­vÍd~Ø +›Nhb©YDȞÞQdmÜ¿ÉánH8ø‘BÖ =Á5œrŒŒÍJ_-ÿPC£`ü´Ÿb³"à f˜_RyÀïa@cԜGÝÝòÿ®?&V5Ù¿F ñQA°)éƒØ7;’22s¸š…ÞfSéynƒÒ2¢ÄJ±$eD( ±íK\$¢ íÿZ…ê¿Be!Xß F¯~À>àòpp™[ÃüçõuÐJj †¯åÒ1Z÷¥l*À^¡ë;8­ú&®ÿÎôÙA͖¾$µÅHÔhEYÇkFçÑäÜ.å}]òíÇjtƒœŠót ‚žô“/º½wöí^íøZ/.úÖyÊë¶*zcw¡çøvÁ#ÿ¿u 2³òã*âp*š)$ c,x!U0ü³›\˺Í/Â;–Á¶m×*ÿ={£+C'ðÒ²/в¦ÌÔñÝÊ·A OÆ|Û¢† cQ695ŠÑçyâ{TÀ÷ø5|3¥ärðÿRŽ&~û4ŠH<0=Ï:|:…Õ +äÜj(0‹˜~ÃÛÚ_KAh ’”fD>©oíÃP™]fJÇ®¶t¡ ï² "É`|$xL‡ðâ :DMgQ¸<¡2ßòõ}`SW8ýWe2³uEZ./ˆ ð™ P,‹U# 1/ømërº¤-¤hÔÍ~ :¡ Î=­]ÙØpšmÒYiNWNø¡éàëZxT€=QKJó¤m(M¤ Èz­pÛò}Ó.ÁC°*Í’›l)"¡JGU>`Ü] åæ;R^פP5I 2ÃXȉ{xDrËäYŸ(䳘كD(Ϛl̜à×yl[ó‘+ÔQ˜ÔÙËçÍèø‡í¥ +@ž5ŠßØÔú­êé¡^^{캙?¿jñöu‰ÁI!sè¬&–±•DsKi™ÛÏ#€}O¬úYà¨-Ýi )Ýhƒº±ËÆIÎ. ÅÓ>ÔÁ ì$Öñ»P—¹>*Sî°b?BP7@“Ëü28ÇRÃèý]–,jè d$R”Uo˜g^£A4¾¬†B›3i닺?‰Ú?íøz +Äá³î‰!l>T ´CÈϔÂ}e“ÞKH®‹_ĒpÝ嬶ÑY¸™‡è܊‚ttQ©þZ@ç?múúÂE–9H‹™ÝÙ)Þ"¸ê/öĵ,-K‹jס£E²ü á\ óç' (s=!‘%—ƹåœÑ2cnâËsbqÉWi±*¢ãWð%15£‡ç€;Ž‚þïgEt¶šgÂ`ÊAîæC´c°U¹s]¹,*X•:¾úOK°Gò8c¶¥å{ö~àŽ/õá™okñ ~6µC=Áݨ®I92z$mh¦pNo+؆½; +Ç@‰â5ȸ²]+sk ëü­@HƒÔeLÍ<¤J™êÊä‚ aÀ¯µ§‘.b¡têªÖÙU©x\;N=‡~É (m`ioÜð-{´˜Ta&Ì°ø×øÉ5¨j[AŸ7X@ô'0UzJ¯1õ„Âéü3Ø»`QAcY’p¸Õg «r +”7¥dÏ6£›ª˜›"½Úºþv ºŽ?€¢- +“0ñBà;s€O„Ò®B•rªÝ´ wãåMUÙñÀÓ"ûä}Œ²9bD©‹×œ¯¯ßUg‰vk çVÎYÀ0-ã +À#üV„Ä$é©¿‹;[^ûy>1Úê˜wÖ ‘Ép¶Åd,øfùt‡ì^$ïc’9tþ±=†ºï¡6:)Èþüýì£ÃÿÆ©)Ù;l„Û¤O*BbH÷R;РãÕÐbËӱæzÈ14 oîÑXȟ+"ÃùÑç+^ڞ ¤í^ˆÊÆãwµÌµw`ôv'rãvÖû¶ž‘ÜM;0–Ë ½ðð&kd­%H A£û,±—q«D¹,GWñïc˜¬ÊC¥äEbaW¢sÉCcÈ‚:£לùj» ‰í˜-èwEbQŠÿüÞ#T|PôIüh)«¦ i… šÌPG“Û0ElʓCkÈ xÎJu‚ãÏ +˓q.6k°³[²~ݐng ú{ò9ù3ÐÞ\UÅÕ+"“ø)¶UŸŒ9æú™2…÷߬p¾Å?ˆ©/§²¨.ë8ßúÉçþ$ÆÁîù­€ë´$ÈT÷´>Ájfß8&qzšQ©Ó¼0CwýD¼j3OÖ:p”¶*,%pf׊E=Š@Fb®Ö2úufV'x– {d¦ jëÛØ䖊 h(K‡{žm/ÌæÌZC("Ո‰'¦jÒÆèBz±@p´š>LÍiÉ%‡šW‹S Ð6€¡Œñ¤m ,ÓÜ}tXÀs­Kµ›è”ƒô8÷±Ôà`=JíÄ»ðOp;µ&-Þ¯‚è +{u õˆ"±ò¨JkíCÅ nÙæ528–¸-ªýT]E4îV¹zt…ö4!Œanzx·™ƒB@e÷5`1ßÜ:XvkCoÊÌDÄ]¥.!Ýr0™[?I5Kۀ悉N×ñ_ƒ™ +fÐA];@"Ê¡;@Ò Î+0wz´ðe£¯ £ ÈŔT'ÂS¨½Ü+ê•,ã›_&@Á¬/»ÂW$4]âRGT&¨å.L#b• +¡INÕKPäE*gƒ/AÿhðÎúyŠL¤ÄÚõàºÿB«·3d" ÁsÞ?s¨T+Øä ú7>APâržk.B¦© iŒ¶ Ç ˆÙ²D1‹5å‘ÔÒ.—pLD9QD +SuU*€&É»2H²f´¡R¯ë4‰«€Ôÿ?⑄îŸFò¹Á`J@XØNÌ ½ƒ:ß +¯?ìH²wè1—z@ÉK»·¦áþÜðôqì69dGJ¤YÛ1Yî Ìôµ^ÀM<ìµxIvv•‰€D4Šf°˯¸¦»€ êô9@šù!Ee=-Ã?Ùí²# 4š f³± +gH²j\Ñ~ô`&Q3K÷›'®‘EN3|¸â´ºjêm;1à¥ÏMc#„*u†·­[®þ3¦Ïõ³ƒü¡sæ•ç2à8º•ÆPûTŸ¤”{ ‚&`ª¤6‘bgJŸ‰DðÕêYµÁàqƒ~Å°¸d·ˆ—˜†®àŠ…K 0kï¾üØ-Žh%NV¯ˆõ"²]ÑQ±#0 +û .ï‹^Æ"C-à_m¾)åÿ~.ˆ„sÊôçzWO=áˆ9AB¼HÀUL £²ùÖ½;K4.™F#³jn=åÉý å(í—Ï•Ãí‘[Ø/G½Æo½Ì3aB^&£ÁªEÌá¤8 ’y2®Í*7ELdDÚ G¥h5[@»·æ?5ŔՅnþ\1Õ1¤A’E0韀‘̐Èâ6ßÜQ¡ŠÃ¶“<3ŸªÀÌIÅX 4{*ƾ­•#¼õԒ9b·Šùp<ô%`ÂúÖªD†Œj[¬¼ÊÇlñÑ •Z™=‰l(mþÖâwT˜ß¿aSPd§ øe0kȄ[‚3.u‡L*¾5šE¨­>6UÖú•¸61lãfćÞ>ö +ƒÂTý²Óö—øþo±äã!L£†â‘Uu~̒Ûo㽪éB—Òh‘Š¹&!‡ðl«€Wň–Z† µ&m8ݨ z(zûva_–hó"ü§+’fÀ°t꿇rÖà ÇôðÁØLwÕm ”䥞„ ûbøU„$ªnqç÷Z)yA!X* ’Õk2Ý÷-Š.c]âŠdZâþ•²«©Y"Êö +e ”^ðV•¦•5‚¹àYUb\¢Y‰ž“ff¿z«À)|"e[µt&Õˈfá<ø¯§tg —Ð&òÑí ;Ç®@aèZsî«)OFٛ.q3Ú]ç´XضÄá˜l(Ɛ$À f뚶ûø¦åJk …®©rN)LvÚ!‹¤ªJ*¶]ñ¬›iq‚A‚¤O‡(3!"7üjÛ«ÛWÕ÷;œâ×;òòÑ'…õý23Id®[rÛ©ƒ\ã2:ð/·[mȬBíGÍp¹Ÿ‹€o=f/d¤h3„Ž¨×þêî0¨'ûîÎN.‚"6šÊ¨ÔÞ#0±HD +$Byšý ¦D@p”x¨€*)† ˆÂ( +2 ¹çX=öBu,‰ìU/9—7$uŸ<¿¶y Çó¹@CS>?ìÿà†t+¹—ÌB—*ѵRãpžáùdՓ5±\’§¹T(¡ºuÝýév¾µB"ÚÚùÀળó•ë»ÓcçO™}z¶Öù÷ªù"l|rÁnŸµ!Ó¢‚®¶u@£êƜ¦úó™f”y ] Ž#ak~Ô‚¶É¨‹NfÎÊk"E5ÉËù‚½€£mK ‰óe‰ â<Ý®bRÎ?·G"(Xê³ù̏2BâHcŒÎ7`(ÝóL*â,ç@3݄PY«C¡$ՅÃ!y ZzõF^7ßƦùP÷7÷®N3à¸ù†‹v0ùÛ|ãwHAšŸ {BbÕúÎi>S7õS6_¬ôçE°¨#è{T}ÍÇ&•[7† +âËÜ9} ß³¢æ— cβ–ÖèÓ|Wá'¼R‚>˜¸ùöÆëcòÅ{|8vâãË؁ϲ¸€:a¹ Íןà+Hߨ„|:ʍ 6F8æˑ’iÃ-¤áÑõ2”]%{æg À ´= +kÊà™Ä/!g¾„º‹8"SiS~Hõb¨-^XWŒùµÇ¢«ýí= /Z3_3 ÚÅàSäGã2å6í™>àƒ1†BÑ w0"„å˦›ZˆS$* „ì X3ÿ+­&„µD¿ xö‚ÐIÛØ|‹:,Ûòٝ’o®®2Mmb>7þ5Ó~@^NIÔHøyâˆùÎkÜ5T"\~öH$•¢ã­}!|o̘¯…TÆË2Ô£åþËwΛ®ûäe)¾9éÌù~ùþ£à!•@úßdˆr$Ž•Æ„÷’JéÚÛQê¨b²Ù³ˆI¾\þT€2!\¾§;ä1tq‹šô[¾AÁ‰O¸¿ †8OؔLÄ ³|DâX‰¶Ú,_¹9‚Î=~Y>f,4M–O®DïƒRF5ËwZ`ß?ÅL©Æ-Å0Eñj‚Œð·ƒf±/ó‘ŠŸLÇDيî`J½”G%¼-itS´ý*ÿVœ«è@ç1úÍéçª|kïçŽm—¦Ê÷æÙ±,?®Ôˆ@üm"zgBÄa8±Q#¸OQÜǜ^®M/åû6×X,]Z×Þ+åoˆ +³å­¡('åçcÚ0ûçl%kÔíÇ0u'îÛ-TOý§ ~|¢£ß6ö±Xi”Èji(Q>ł±â'0¡Ø“_èù«ä—ûåÉ'Áˆ +ò;šøwòa/‹ ‰+{šÙ6ë°£šøêÔZã©¢Ø5ùÈ »ãöªz¤Š É_@~év?‰~›¢ÝÏäó¶a‹7ÕQÄ1ù„A¿ŸòOÁ-RSJ?ò—x†ÈÏ鑯1n‡¦풟ê›gÉyK~TµYòïêÀûJ~è<«ä_Tâò©þ÷i6ô•Hë‘|F&ë%8}†ÀɗÊfÜ3uÍa‰x57ùèÓ¬’Â?ý’o0›ÅËØ5O"ÜÕ|ûÇoŸævŠU ¥Ò#_d›¡“ø;·ÅwŸ#R^Ž|¡„ÝÈÏç,'kF?V¹o›sFþÀ»£›4Lé{ü„¶…fa‰œš|‘¯ΏÐ(-òÐ+òÚChÏghè1%žü ˆåŒZ ¿íñ–ÌŸ¼ñssIAyDÈîPž[S;AtPÅ>ÈÇ[‡K0WµGnêùâ5ñÄ—fº ez 6€ZX–z…ð=·C#áΜ³Ɔ¥Ä¿'G˜¶ Ò}ü2ôÛòöRtÊúøÊ1톋™,$ªlü‘(~#®XùÑöøÁt“‚ ÈßÖã«#•ŸR +¶™™4~;»BÈÐ)ŃJ¥âøCÆFÄhò,<¾ó蒼Üïà*(¨+v«ïøÚYÙó¡í.g¶kw|{B±Mè wãÓ­÷|ÿuüx F¯ÚOqÂ¥É*hÒ\N€îUX"¡Ï +ù/ø9)jW–×áøìhSá?Lُ¬pÍ Ä5å,x6ÃXC™¾ï’öÝß¼@p­è†íl|c}$˘è‘ÈØøÀk›sMðJÏ9e]«Zã÷Qpa’æèÏÍ]?53ÈÿSnà¡h ݁gô“ヵÜ5v¯ÂQo½°¼Ó˜§|=ÿÜܞWeéð}æ‰Xßj^RЀJöT/:ŽzÑd|T—€?š Ïš:ŽÂ¡ÇøµŽU^v +÷AŒ¿8P8|Ü1dãÛ ‚mV´ø᪨(?Œ@yvL¨GïÇŒz”â.~ã{i—B¯ÅêâðÙ §ûˆâçâ â0ߐ=ú?(€‰"ó;ì´:cÃôeY|¡;ûui-ÇdÒNZå»Ùß˃ÃòWüH±`°m+>Q½\F‡Ìïþ…lYñO¥¥ä£ Yöé˜ìUñm/çà˜‹Å,ý©øÀQßÉ/´ÁQñ1S<è²Æ֏ÜË2~J—º‹—͓”õ_80 0Ç7Ü3:‘W`ü˜dŸì‰ë\ØDtŽ#®¹oßú-à$딮wV¨0&ü'iLü…Âç7i7r©[Kü TFlä7)¹·¿«|«už‡éL¾³ô‡ï£†:‰¿ã{”øæx€ So8|C9|‘´ÒIҜ\™r$¾iø¢Úo‚“²ä¾Ô’ÑÑÐNöÑv â«{–õøÅ<©žˆŸ‘èʯE/þ®”†¯–°Ý̬?ď…tïá#y_(#aû1høñÚNiå#¥ç ñ]Û;ñ¤E_lbØ~†c¼?íƒøæ̊µ/X²añc" ’m` > ßÁÑa‚Í +vñŐNv$úèRnøÍØuþ ֕lòý•4ýð~† ‰ªÞ‡¯•£9~ +´TÞ Ñ~üょÎ=^Kh2L^×áË°“Å€ë´[†wt, f¨çð/à\üá¼¼g‚_c-‡/íäÐR“\ÄZ|áwrK»ûÜf=Ù½ÁE=W\ †äüŒøÁM¸=é^ù%·‘K6¬Ì^Ì+Àf~hä=šf<ñ÷‘ðO‰Ã?O™v«‚¤Þ‚í_øQsŠZoÊ­X]«„ÂŽZ%êw~ïs¼ Cá?).~ƛî‡&î¶,pv¬þå#] Ÿ°¿ùŽ§4Iø㨠½{…ÙY],|öðw“S7¥­·—W‘þ5Oì}´Úå~,àwdU†Þa$: >áW¤0ôÿÒL’vÂàÿNÊ3Rã¾5 ~©&»®¿9<´V b&|9´çIøÉì¨ +J!Õ£àkU#2ÌÈQOí·´~„ßÂ:›Œ4ÂϜq/30hÁÛº\~ Á7 °ÿáDø˜P³yÝç©Ë8Ò?ø&~RÑßàäþ÷p\pœ=øÿøÂìÀWE:|Š#ÃÍïXå>ö@ښÛÇ¡Û˓æ=éVül™IçàðF›îâà_ f½%ÿS ôPHVÁ'Å;x øPßƒ­"p¸‘à;ޜçnŽƒB<ƒAæ‡f’žÄd9èíc¹U·§ª6þ|Ÿ¸hÒfä½6JE@^ì/øÁÉY,¤.ø¬17S=­²ùÄÚ6Ò,ør®úåÊÙbO¯6ðÅìd/í!–àßµ¹G©OÒ°·ÀZè„0¿à½µB.ñ3c ö3r¾>Fy$®"ebþ÷q‚­Ò\üý­ºÿþÐ-)Ñz3ÕøÖåz–í â~àt`Î[yxb!ÊüBî üÊù%n?-Sné£T‘vhÛŒ¹¬E´$CHèÕ:à Ú ð€œš“àÑ«êyb3™ïzQ '€@ðÚ}r­7‘QÒ'à‡ßp‰ëÓû˜=5*䙨72;FR}€%»X3# Àÿ:Cá)’IÄ!ó#Awóû±|­¾íâà½ß‘¾÷ÙAp°(~¯j^ GìuŸÎŽj¬L÷mäǂ˜5wÙ#ÙÈ6ƒçNƒé·t¹oë{ÊÐYnù<•Öž¬¾:·kÐ GnXåÖµ7ÚÔ9õ}„±f Z˜Aþº.ôìÅÖÜ=NçÏ÷¹rø°q[#®œJŸcÍW·Áæ{ÑÙÈñôå’ù^‚çL$n-ß.>½¡}!(V¾GMoÚ߇Üû*³ïÃOÓd­ü¶4*"ò½Ë +,·ËÞÂåÃ蘃xÐ3ú-kuˌÓp¤öô½bA†Àü»Étî½'RIf¹Ì[êšDÔwï/o ÿqƒê}zÄZ¤î7 Õv¨¨ €qï½ÑɤH 3ý~ø¡wø­í}vE¢±sœP‹qZUa¶­ì™r²]v_·€÷ ÷à_@²{4bdrßZp{éÅ{kð ±qe€%"5âJ^Øà¤k¯½!ôY1æõ·Ì·Ö½4Û %—ÞúŸu˜ |vÖÙ§rû>Jmúê_a¡6È—Í ·4uÌ0^`Mpê>ûÛ@4¥=rõ}Ô=9ÁÓ.ªy4Áu¡î¹s‚ôàj䊪œPNìtoö¸Ñ©Òs£(w‹Eà’q@ ¾7-Ó½’ö°§ÔY¾'U»>©D B\L*©ü~$î“áºw!ƒSýàq`€`L‚ª?Js­Ññ]@–Wqjº÷ÿà"°Ì÷ƒÍžÈPÌ6ý¡„ð‹Áy=` #¾ò˜ÃjË~ŒßÜï¾Kî©~á6÷t„rd7ïO®¹÷éðBÝÅÓ]ò4÷^Y;Qëïۇô³Ô(HÒÍ~Âù°\ŸrøċÖÜÐ*Z°Ïêmÿ’{6d†Å¼­J«°Ûýå²:Ќrÿc?;¦qü®ö&¨g[ÙæþU“{b›> Ê#/¹—§¶Iøì±óî½ãlòÛÙ~¹ßx§}„î[ú,@øð5{dà+™{ ߝ=î YÈÙ`ºà4êT–eÑ ¸DîÅýŞ[Üw8æñçYï„#aCނ¸ÏNqkä‰ûÓNî)æ";#î+瞚׿GQ°_$— ýΨ§†ôñK¸åÌeïðE>˜€r†÷1֔‚Nn)ë£Â9¸áÐím†[XPX4¸On³Þ) +Ž€wæ9ƒíærxrëŠüTàþ|” Op<œÁu·×±À½Ùbn ;7àþµqCûÕ +»ƒÊÄÿ8j£ Ê·}e¸Aö(w…Pþ·¯P—ŠB WÄ-Ž(å t +:)ö‹:¢L!’ýö4^]-ˆ>{.¿=yÀµÎÝÕºÍ z›Fä– +ÁWˆ¯ùB?½½ µ×î¼=ú&;®í›÷]UO#ÃÊۗzKkŠßí ^K:Þ>>yx/®ÎHÅ(M#EÔÂíùڇ·_{y"h"ûnO‰œ“{·$]ÐÝÞê™ìÖ?‹8±1qS⫏Á-C:¢{Ïíµ?œgÎ@ b§Ëåö‘BؔdÝáHS¼œ©ÆÉíÍ"œr•ó„Ã3V}µ®ÅÍ`¦ûƒT}± .™H ¨§;@½g? sӌëY!¾(ÎmBAœº•íÑa×’8þ¡êµ<_M¢£í#æÄÐöyaø³}ôã+tFÅüKÍb¯ºîed#BÓX ($mq‘í,¹f‘ËÑ÷±=N¹½»ú֋Åöáà¨ë^ò8¾)l¸®˜B{Ìf5²°½9ñ„›ãR;Ô7?>MÙ¤6'±€ÕÃéû<ì.ƒ`>£dþµ—¾^dYâ¼®´¯= ¾9üíp¦¨g2†r­ëS«˜²áœã dºRx=ß4­½ ÿÙë#ˆÎÚ/Ò8U0’7S1$H{'czfÁÄE|Ú÷2.µp‚*†Ûé¥È氐º«ýŒô1;ÈàVYó–e™Õžo]ƒåƒÈykN´G㳘3R‡<àÈT{¨Ó.ã"nC!õÛ >3ª}]™=µo¯” á³’ÆBMíù-Û1¶F‰«Îþšà sôôÛ¦[« KšÂù¤*G.²Š{˜¾G ÍûkÚ똉_ê×)ß „9Ó~ß ­ŒŒÒôÉÄã& +"úK{±€¾8¨ZÔaK{õ—8!_¼Ò~ªç)í‹ßÀM:Ø-i¯Á” •Ë&xà ڼ)ð+ÅxdèL(]Ñ~!îéÃÌñ ™“¹Îùâ Xϳ\g@Ïò1AD{1äèQŒýe_ •¸•†â4¥ÄÛ‹è~Aá) X/h¿ 4ådÞwLæ.m¹æáùFª€öËJe^ÁYõ8¾øŸ½NÏRoå<û3üòÏo¤âÙçLhIg¾³W€%ä‹+Ӏ«x—K:rnºÝÍò<@Ë9û5²…¦,¡Á>ÿñY ýa`‰§®þÚ«ÀA¦…>Ûìø|™¨Éh{͞ˆŸˆ^@ÜjöWé±\O³7ßà+(Ö7œiē{7÷¿?"A-f¿náüHü¤Ì‚`ö¥Î{F:Î|!Ç ¶øeo†D›2Žö©ð0²d…çpäA°_WˆJ#ûa,û}ž¯ì¯q¸C>m"{–tAFS4Óg.…U:Uà²J´~Bj'Ë&mU¢ã×é]²O +Æ÷¿ %ûP~†ýiHžÀÝî£XêI0p%!a‡³÷\jdÇÜ^ªèCö®ˆ|à X¶ô#û/ˆæÓ´@öñpÉ/¤æ铁¹ØóCë=¬ºy}ÄOԃ=öÜX“¤2ªÅ¥¿U| üŽ=Cà=¬HB.×±Ÿ­qò;¾\»Ž—.6Ý.‘#Í ¦/>´¤`Ž}Ú,§Ž’‹TB²°•Ë]š€!a›{£–ztÁ©ïÈnà -)†»1aôŸÆŒ°Écb Vwkëožõ’W —ó='çõ:bŽÜ{„÷”W¾\ˆ§ØÓOØLhXQì¡NØb:À{ûh~Hñ©a\—8<&ê ¢”·o›ßy©Xƒ–ÿ ì‹ÂIÅôròöÏíÞ +z#dý,Ÿ6 ê’T{ë'üô!¸ÆΩ]9gֈG7ìu(®2—g9ϐŽLîÙ!Èå¯XG£7fù°¾•nWªöòìÏS¦¯,/¤Ç> »ÛªÛ+ۏ"Ë]ÞÝSûP»ý$=Á¾¨>P£SÈW™,¢"ØWÀŸÏ |"{Ä?´5›»¯¿ž€_ÑÙÀ~Q5ÀÕx”ÖØ×#à\yýʇü"c×Hp{CpˆÖ:àñFÀ- qk$FÀíô—Ã÷/`ïË +oà?âÎ{ŠÍñ$VãŽ=õÆɌKÀ¾‰vÀMÉþ_o¢ºN¤åòbrfà^:tp¢{½TªlPŠcÜ_³_-Š•¿B/d´9?Úؤ°7«Vê¢þóõ(l:À. Œ G½Â¼þs+_/ ´F'ë_bÖ_^¾Û°•# «]{]õ•¦²›…ìõò<ësÙBK<ÔݗOT“Õë…×H ¸åYW5=9n.2e*6½>Båk~ñ4:Åüc~Úóz Cà<¤rjœp £«ÑDóúZ$Ï“¦z±€À³¼~ö¢wÎÅ(ã<Žþ¨ª…óx>°ÙÿÊ]O`®9¢HÇnHUDi[‘è¾Ds×Cé¹Ð3¤kvh ¤¦¤¡Ï¬ÒÂþ¹:ŠI#çÚõB×!øžÃ +„Æ®ïTíi'ózðyRv¹^`;$VHŠØüœQµ]¥à¨šæy+ïîѸs}ê¾¢ê^ÅȪޔÎ>õS,µïV}q¦®âßËõfz¢Vaw:4T¹^䈬­2Á–^YªßŒòÃõAûOÈ;]¸^}S d×}œ"b»T ŒE8\ﮩ®ð«¶íº\úÛZ€D´ÍᒠÍÐ Ôßú´èïЂJhöv– j¤jß'y jg0ʁCújÖ ´Þ­áëäAŒ$ÆõýÅD¤àM›´&ù k°^"PJñÊÍÁ¦À±¡}õâ[ɐ ýRòÕÇʄʚì^½åâKýå') U¯ÞؐLE€z@kÈ©±ñNªR½þ®¾È›&¹x‰áýOScî,फ_^jÍr²NëLs.žbœ«×¦.ÑÚÊÕSCêýz耄©ITåò‡ ðûVoZU·úv|äûB¼G[‘P(þ™ ÍêÊOöZ(òeõš|„A=—É굂(ó;2£XPÊÌ"Y1îâíYlýªwû¥Wì£d ÊXôÏ0úµ«Þ³AYá,ÁW«—˜ Dv"sÕ×9(ãÖ/Pj¨öíjmFpƒZÒ[­ú’_º(3ÿ +ÎÀ]’¹i­6«.x>¶ÅáaB[¡\Ø*ô:©ï BÆn’(jÕ¨^8›ÀìÏàçØ } ֐¨þÚ~Çì1«úÝ*Ç÷¡?fjçO½w7Ÿ|»oÁC»kIjïS6…–é‹Œ~¤AˆÛSŸk£D6(CBº;õñôY†ßü§³—cczúÇ-„Ò†pN}çºmýNã8õßá|0$*õì7õØD@þM½ðÒ=»½®[³JÏÔÿe¸“¢4áãȋ£LEÎx¼© +ÂÇ矿P.4Ž`M΀s·zJDp€ Úƒ<ÀèßÚ>Ã2é—z(´ªu(t©§àBº7KBÎR/ +œç) ¨Ϲe<™ •Ò^3$4d +Õ·@ãTv¢~ËãcJ¨gרE=ä:ÐÿúÕ oæäOßÈðøÁ(˜vÔ÷ø×P€oowš#¨æ¨q)ö*è‹yDQ£>»ð¯>˜#ì<¯œ1½õs?éaGFHéi±Aõ¥9‹ë¤¢~ÅÞv Lÿé¡\Éþ§¢{‰êɂôRæ”1êAӛØÌL¾1,"ž§ëÚFš‚bÐ0@„z¸ ·ä9rrèÜ:#ç3¨á¼è ‹uy0àîõ°ô^˜?â…ËEò™½ãUÏ:È!Gz°>ï§7†4?ýu¯ÒŠÁÝ§ÿ+£>½a<9Ÿþn ǧώê=}x¹#¼B÷ +ûõôNSâÝõùð®°^¾%¤cwúŠ$&d|(l,Ú?1åŒì);ý’ƒ¤Øw^9yHuO%íH ƒ±`ñçéô¢´çíÕ$Y¸‰No™ÑÂçA{r‹÷ŽіÓ;hÔÿ’WÙÎ0íÇéi¡ÆÚ3ÍSåpúˆ!π<_pú9’B$c ý›>ÙxåZ#(/wÓïBô¥Å«Hä¸ÐÔ·“Pƒ!nÓcƒè‹xݚš@ä*µeãÂX³é—ʈM¿šü¤£ Vhz±ý+j«ÿÃò™^KÁ¸c“Úè±3½œfŽ FåFúµÁõƒíÐ&ÓgŸÍ âܔ¿é-éNp€§SÑ=“ØÆôÕ|(@ÿ£¬¶æ*¢Í݂ÁWbz%ríÞOC>û‹u ¾*‡éç{ßo˜ÀtÍ9ïxªlô…éßS¼ä¸ò× Nóû+».¯ì™ˆ£•0YöûÉgB#ªh—^óþ؊‚ù¸®·ôIŸŠÐ #<ÿ¶ôÓKEZKïz¼?D· e{©¬9¦¥¯w¼ã¶ÅÕD8ó¼È+\‘<Ȥo¹ºÃ.cœËaéu¬C ©'}*}ørl¸a¹adTz»Ëñº$ùâÑ´-¤¿!Á +Z}FEÞ¼±O{ +г‡,hBº`9Ö:ÚKöÕw”ž¤òòIƒe ;RÒ«î¤bã&ª{ áÀ©} +²Y‘TkÒK sÈP³²GLz,÷úuMųïÝ/éÁsûÂ?THàYKz.Í1ëª*q¶û—G̀Ã6\ÿ§6ÒæؔAêp}Fzll8–0îãýEú,5,ôØ%<Ռ‰4\šk—¸£•ƒ'ƒ¸ é?&¿Ä(X`8{$¤·Ú_d|UÑ/tÒ¿Æ1àîWC0ªÒ[€Ã~šÒ¸à ˜¦ˆ»Ãý oxZ¯Ža–þ£_›Ë1/¢=t¦@÷Ä/(èOKê‹úÁ¼+f +$íèeҏôýg»qGºŒ>ÝÎÍ@§Ä!}|mø§¯z@¸óŸ5Œ8ƨr>ÍÇ[N&±oôGrôç¥ þjô7<Ñ£éEžÅcØÅÛèՉJƒõ/ ’ZU\£o€/Þ¾á=£è7p_Fm÷6¤Ófô¶"¬@c»¡ù>Ÿ›ó<ç3z2zÔ#îT8Eq èÍ»[Œž²Žé¢‹ÔÂÉ`üѯ©E"GÜR1}ä^^p!^‹¼hU²…_ôñk(’øÇi/½è¹A/ß<ôë áúe© ²‹>÷5,_>a±éo“Z•aÒڗµè) ƞä6¯Ð’‚UŽb«ƒy±k(‹iCSPÐXôp´ÈŠÅ¤L±†[ÑÛ®“Ãí!E¹¡¿ôõHè j,ž=E¯+׀8**þ¥â“µa„ê'a—èÏ20¼eqC£¨Dÿe@’DFÿÏ½Õ Äßö +ÂN¢_ †ÃqÄ¡78æ0JþMº<ü„"\¤¢z +Ñã)›-¯Œ‚¡V_¬ïµ¦žð¯Õ?ôAâûr&f‡Ó˜\‡|21«enÛ +ÉôòÐ{£¨œáºVHóí^‡ýÐ"æ»Ê9ôÔvXrŽæ¨ùQqèݲz‰Þ@ òòqmyAé0ôS¸<ޔ¼ñ¿ÐÓ|°†M8aŸµ€P(îúÕȂ05U-[$ " ½›*ñ@Äl¤wD5 ŸiySÔ߄•  OöÈ$ôe§r¶Ý8ÐÌ •÷t®”F«zHÚ:Ð_B A£S…}>_nüRšãÅWúýxd»C¾–fûóò†ís̸X‹¬@¯ÌDE‰ãÑ +ÐðzË÷„ŠÉ<«ñ%MÆ‘><ß©C§—ùuãeB¶ÿ¼AïÙwþka„‰œÂQd¸T[ž£þÅÖìŠÔÑɆèϞy½Óí«[¤¼aüyå«í‚Mîýéó¬~Ï x¾ %gà€%(¢î'J©ß#…Óîó ¬Äd„ÀÕølû|¾69*‹Ø„0CRž7Ä£úM´1Éæ0y^…^¼Óež¨uݣσ¥ó®f|^dôù<;-v½ÆµæB¿Õî¿óºTª—²´}Ѿóhø©L÷µk¹(ã¸JÎÅ?:õÝy¢üTÝ°ý…)/‰páy5¿hªôfDµ5{¼Ü¼b7ëµëüœL»Å —fÉßúc6íñGûèÿãžužDÁè9/}pçQŸi‹q®Wç©ýRMâ!  6ç-»,®„G-ÁÉÉðS ýiÓšè~©å£óz'ᓻu Å8FÉyt.–vCçå^ê¬pâã&¤Š*t¾ÌÜl‹L/Yž‰ˆÜ¾OÁyî'¿ÊŽY¥21dO ²³Eö¢?¶G) ]fz¯Kœ§½–?ƒìÜ©ø!S/ô Jàæ'nÃxl¼ù¦ÞÍß8 Êép¿þ±´ùµùpQ ªd@VÁ½n>éÌãK7³jäð7"ŸàÌ8.AjGR¨øÃÍËvº(5Ë=ÈU6^Ãoóùƒ2`ÏnóÆÇù$ <8á6Íyh¿K³Íg¼€ÒvkB ÙPì2*pò/¢ûl~*z×8+=Z4Nf^~¶HшßÎsÙ¼8¶’Í'aãcóA…Tlþôž6Ÿæ`óá–@ž„vrù×|öT½æÓ,³:Ó|t’¼5Ÿ®û*òœw÷æ³dÛYóA…cÍÐçÕ|†$&Z1W¥ã¾‡ÏܪÔÕÞ]‹&/‘ êð8‰Ü +¤&Õ,Õü*$0›§JGLUaÚ3ŽZŦJŸ#m'ðÐ@WMWôÛKóáŒtSVq=¢p2I±¢ÌŸà¤iN!Aª>⪠±k”Ö¤½~}ledÂ>aP¸8«´ÅëI®›Ì8N¦vhޖCzIßínŒHæóíú7ö`™€›"° §¡KzÓc_d]7‰ *Ê÷Ìë;3¯˜s‰þ–^Ҙú;ó®+ã¼ƒàŠ¥Ç¼¯I—Ô@É}f\-Ûd#p\»Ì?xd9a(X܀<1…bÜÔ*cþœ¦`ªmŸjS!uâ+ÃSԔùIJ¨œŠ 33˜_ç‹%Öú”™}Qyó=!ÎÖÄîõ•d^_€ €‹Ù#0:2OÞ9WVÓ̐ƱoӔ™Wjøù•:,…h±;ë®7xyP;óbšH¨yd¤*Ë1þb¿Ü‚hrù³1ÍÔÀ¬ºƒ×$ß>²Ü0¯e¦t\•¡ˆé¾9º‰ôwLÕÇI3|‰i\᪀>†j€'æ…ÔÈÈL/¼²÷0+À|NÚRHZMÇ0O–øÖÖµŽ¼®{Ò;×HŠ=$Âs§ššf̺cF!oÀ“R_^¢3O¹4_Þ'à©{R^Fnö¢“6Œ/Î 52 –‘'4Mkl/¯¬[è†Ñ.[ëå!þ½¦leä_GÐܨ8ݓ9줼'Ç`¼>lóBóºg°d ¸åñLô±a»2ÿBÊÙò€j-†üÃZÔ?rº|ªíÃ?eg¦–º-;ã?L\f­¾30X/-–ï?ª yß²)¹¼¦ÛËv!çíç5vèñçpù†rˆMjèÓoÚwLc¦©£zš-o´(!E$»´¶ ÷üª¥üšÂ]é´|ºŠ‰Š…CN[Z>âŽÍ¾0)Ù¼B“énÙ 0úëcå1ŒhíÃjh“u*H¬j?v«I0ý„c8ÌÙ@d`yʬðÁL#jphÿW^q»ì0L«Çò\ +…­_ü– +î ÔSyÒ8D“ø„‹å“Ÿuß ·ô†Òa,Ù/\¸³õÅ®9x§f<ÌæGá +,o†áÆöäæŒðü•wŽá~/Nϟ¾òގLÆÇ-Eå +)nÕÊ+ïVíÇmS½›Lþc¸gÒzlíÎEN—ÚÊ…pÊÒíJâ&ÔuýZyµî'¥|P‰ã±ÿ‘cÂͽ€’Ÿ•·L£s?!/+máBs¨ØºhŽ•? +÷Xw:a¥T+ïcá>ÑOtÈõU^ÝGáʱ‘Ò°p—ªv $I©½~áUyôÁ(<ôø"hhÅ_ }RGŽŒ/@»)ÜQDùy +W,éQs&ahÉdq^vQÜ-åÛ)\º +…XnÅ a .æòΒʿºÈ¹«óN>¼“ÊÓ8·º¢{k‡Ö}ZÂm7iH¼mkýG×K)¶¹•VÒ^O<*AjÊÇÌ©'Q%Û°SÄ +~à¶ìȞ´¡´iõ Ü\•xÌë^W 'èF«¬Ð7èÄ\Ä“Æ +)P(/S²u ¼jêìd…Üx`ª!{Rü`îN¥Òɒ³‹)©S84o>R~¾+¡KžŠŸÛ ¾õ¡•zδ-˜¤'s .ƒ1FDˆß1è‰62±íWdÆTrpP< ß1\ îW˱;°­ÌÁå33ZP€ŽzËIÊñö‰÷èÒ ¥jËÔä÷…ÇÆ+X÷2ø;yqÃ溄íäá#*-PÆ6Ͻ” +ŽÓ¼ŠFžq=F]ÿ •NވšÒÙÕ9ù¸#Gåä§róõ˜Ž/±’;¿rëä@À4ùZïÙq‘>ŒwF“c +æI˜o!¬N‚?\$q4.H[Ô7“?ÇÕë,v>:#lþ€Ux°N–಍sT¥“§ ðúÿ¦ˆQå.‚R/y̓»äïCUï,\`Ç=«€êÈÓû•éÐêKj^-ùýôÐÙÓu`Íãj,ùÖV 4Œßz¯_ɛ¡ +ʎïå«tÚ·’_G4ü¬a|öùÎðãͶ³Ÿä©U¤™ùèö).™h&y§,T‚J×^:ò’¼[¿§&`б0¾’<îp‰§°ñ'ÉóîI›°Ht:I^¯ó®!L]‰0qRa6’îv÷J¦‡ÎH¶j‘HþŽ +!¾,„ endstream endobj 119 0 obj <>stream +e¦Â±M9NƒŽÚÛ#Ÿ;Âç‘gJ]@YElyr¡<—ÅkkTy] üE×üƒfŽ÷¯ª«´käwÅQ]܈|. ñ‡›ÇÂ%{[ËÈ2Q%‡6Œe_ Aù𫯉eZSäÓÃÐÊÔ,ÉO«¶¥£ÈçiEßm|$bœÈO¡\Dþ2Ñìn +â>DÞNO "ßÃc±ó‡üRzÊ5O"wÈ'uE®#GößÁ@3}ägÎ (l(uÿrÙAs?>Ð\àb¹\¿Ü±57ä÷HˆÙØÕÝ\"Çɽ²sažlDޗ›–Œ$D&÷»Aj#ä-àã£Ü`#ÑL®:—ü&†~ší OõêyWI l?ÞíøЦŽÝ8&ÈWÒãY–u´ãS¤Œ‹ LQ—Dȧ$¬‹4·VÓ 8öÈ°º3’@^ÓFJêìÿc¾å'zèýxwÒoÆ/ÔԏO¸€hÁå«5á‰ý}¢{}<"螁ãb/wÉsúøÁžOeÎHR;/¦|¼iÑc§Â³>>þÝ9Ciõù‡ÏyðÁšÍM öéÌq°s|È9o1Øã*‘îñO¿[ ó)½TŒ“üKÑ9[ý½ÿÂlv|SÆ}沧–nÆð#Þòøˆ?ëz´«Æ%gŠ°ôñø<1~ˆ”å Ç]~±ÕOâBˇǧº7ôƒÇ§é¤E~ÇG—†ÞÙÕ’A)oïx;L>IžwÇãæé¿>0ãA ʐ|™OM%$aâC6²ß7[Ǔ+ GŒn¶§oP3äÙNǗÀ¿´àO¹mÎèx‡û?RŠö€Ïñî-!Eè,à.Y;ǃ ˆå¨¤W‘RÒÓ¢<­ÆÏOI‘#­ލ¦SËÔKvÅ÷±þ“aò ;MŠë¹!|m»¶/pü´ÂÇn5¶YêWlMé‘QÞå¤ÚöjÍH5hØcV4–½ñœyrÁì“!Â×â//ÉɹòÆ7è<;p7±»·nëP§—„0ª¼`¾l<Òºj1–è¿[Xï?6žnT]ÚZyüÃÆël*©È_úí¾ç99]¸Ÿ74|j¼Å¤â7ñϞ5ž‘Sµ Èù64 «ÚhÏà*A•â”ÏN܊/'87λ4 §:ëË©‰6‚{74`¢{”Ök*•í?£¦x?›ÿ¸ó¶Ã¤¬ñy¨e3SÌ!°/”ã0Jä83~Ìà”~8²&Œ €ã‹ÔxH²Î¬ë¨„x¬’=KkµŠQ*{"tX]qöÈx¹;À¯ôÓÔòþ*èÕ7UCƏWf“šçhEÏܺ|Œ§;ßÅæhˆxaç)dž­‘îr_›a ¤¥I>/‰áŽT]¼þ´8‡ˆ j½ûã’~¤E÷( ¢™"ËÊê¦Hô¡›RÊÓՋOGn)’D$èy9°âñ6™a3ž¨-[¶*>Ã\b1ôïB'äuñîÞJÿ½A±ö?ÒR¦\|¤Û² ü´&̑F|µøÃHâB&#ŸÌL}‰á£Å?¦® ?‹×…¤3!’4—þ„Ofθtk5X,þEð…æÇéí⼇Åk´C<ª‡¬P¨lò%[5Æ>ìYXîY{õ}ªB×ñQ¥$¨õ1ÛƎ‰ÿt¡Ë/bøÏ¢}v,m)‚ÒèöðéÒäùbӘ_axð]NÙ57ázx“ÎWDèÚ»Ô+ˆ—ù<¼2EâðÛ#½~ƒ„Þ=Ø! ¿/K¸ýaU^YÇÕá¹Ú`„1jƒC[πêHÓO‡WWú¬õäÍÍÑHðšFHÄÔEL¥IfIsfb¤ŠÃK×Oœ Q!8¼‰ÎÈ ®pIò¼›êkDçüò`iƒúÂ_kèïNz™°'7üÑ$Á†x'cÔֆ÷HÁ8¨Ì]gÃ;ŒҊª+¶ÕcÃÛI„÷1~:"wÞÏ@sŽÃ!T¬ŠX Ïø:–øªúzgø`Š't°,Å¡-0A -±1,äÄÌ«|óC×¼WTL†êþ\Šá2rdxcí·4ÁÜ?^œÑ”2…¤ÀÐ]x‰á­ $oï<¡ótž@#VyiÌ|¸‚…á¥ägËÆâ,7ˆ÷“?ÞÿÃÎÂ3n/h=0¼S£vù>ûŸ±¶V‚¼uSj;FÏ"üƒ 3]µ…7Z  ÷Ê Kž÷Egá#äÇë°ð“µ7'‰8åWx)s–w ¥ŸlNqò ?Âk€áù*Ǟ-&Þ +OrÐͺádí~›¯NøñÈtlvæ⌅#ËE þ¤Uâ¾Ý’ MQø1v©= +‰ÉŠUböà'<&vmG‚*ÁÒÑÏ°ì„îD;ºÑ›ðà yMxt/Áur‰û]^~ r‡™ª¥ÉÌÿàµÜ¬É. +vð†³X²Nlê;±gíCáñ fNO(*T òÊFøB{1ýÔ·ÔÐrFx7Z]¿p€m€´Hàë?Ô`‘§ -iO¶Q"ÂkDËtcëOÅ@ø3žô€”D6Þ¾Fyá¹Ü^:¢±èþ‡'´hü׫2…ÂyºÐÃañ/—ûàý^øJ}%Oˆ×óÒ¡K± ÛëF!<ñ†$©f=oEJ1õú?«.}ÉÔ¶­:Ý$.¶“êOo£Yðë <toŠkÚ 8@ò¤°ý+xbq61švÍÛÕ6Šj…\Ù3|zV®Ò$›½÷†ŒGðK{bÎ;¡›õV“þŒ ®±”æ'±<½“+šI8‚$ÞùîÐ<–ô^ô,R;öŸW10±—‘rSò±¼*øŽ¦[^ûÓ¶C[a 9ð3I®Sy7“z–þÿR…1ÒbÒA‚ìïCS™æ]÷_à…ÇÃ0õ_Na]àmªE›í˜þý9XÈ|dX¬,ðˆ5g&øà¹WB“KtõZ‘b=¦ó>ц:¬ùt(Éð<¾pµRžlגÀ»¡ö¡î})l»½`eÒW>üc9"àxï…-Úø üŸ¾° €/¶‚!&m6¼ŒbæšÄ&;’ñ«B(| -•]ŠYt~ÁçŒy¤G¶‘iU.˜ª‡:€9¶ SYLp¼¹eÅì=-aÊÓf.¼>Îf(ŸpæÁšŒ¶È2’Òi^€_¹tîIà p=Ì4ŸO¦¾‡DE€/•ÂPÎ!»–ÍZ­¯5Os¼^Å“ލL‘ÐðPJk0ÞØ¢àÿöZíú©%`‚T<ÎG¥²zlѵTÍûßµ8 T%,þHå҆c”–ºÿÞøR?:þ¸ïªJ>;hgý÷]'ڗС²:tÃév9R-é2â…c# j3â–ñï©ÅJŒ³û ÏæžLÿïÌ sCY^nIìFš°çû{†—6‰U*±XBÄݞÈìïMWÙïáõÅájÐÅóªRš­ßáKÕèëN=öÿ x™ïgý{ÿ>’A‹¨1¿Ûk§÷¢œº^üÝòÚꡌå0 aÎÖI¼†š¼Z×}¡öûÊÔcx$”á¾_fò†[!ÏÿòØï!ï +Ñ0BÄÖÉÿûú=6AB‡:Ù*ÒT€—xöÒ-ýnG¿gT¯ÇE΃-£ÄµPÓÀñ>¼çxåÇø¤¶fêì„õB±†³±\lüžaPfœGãÊÅïòFy´ gìK°Ùâë‘`˾Ÿ‹ÊŽn×·åkñ1TˆÞ~7{IUmÅæñ÷ÝÌh|`K0àýνï²öœ»!ªPÔ:IÛR¨&¶PD´ò®”1M5~ҾߗÍÉ©‘&}¿„.J5Iž¬ì;½g™˜ÐNïN~U½ÀT­°æf¹CbÓ[þh³¾ Ζõ~˜Ì©”ZEñÝØãáJ'2sw•ªïÚ)Ëxÿÿ ›tTúé.dúÓÀ+Aé÷‘ÑЦÁæeÑɾßUþr¾:*øæ{¨•/¥{OJèRy]éÄâúYõÞóY?AD S÷Ïg¾ËºþG„é¯_eâûDwpÛdë‘žy…¢ ;æj0ò]uÂù ùŽâ·Ù•€?¾S`eÝÕ¯> ߇Aº¸c-¢ ÎىTÖTÜ&ô9 ç=l£R<êt÷n­õŠEr©†ïš=D«ÌŒî}5¢pꊼ9¶ʽËh 9àt@‰­@ME2(³ûÞp¥Þû©œÕ6p×ȲÎ{7ÝvYÇrÚ5fj˜ÕF´ Ï½OIµÜ{òëzVå—B¥œ»j–€ŒÆä‘ßÞ³¯ú›ÎDs:…mï…9’ lv°&8Û»ÝD—Bβï­önPéÐWñŸö®¦F˜m…„í½{Ä͑ Dܱzï qæ\œ92›hÞÁÞY/<ùÆÜñYÄMïr…óñ²Lô—5ÓÁ&ïå®w0–EÑ/­ÁvKh0³øT …ô^Y~  ½úßfø,"ÉŸ%ֻºËd ¦æÝ2î±*™Ð3Û¼OÅ®ëH{„O½ãL cÄò.¥Þ X½4F)©ÜÎF½ë«†¹—Ó1*1´O>½‘3lÕëØôô¡Ôœ/—L)ZڈÇu”){Á:[:”Ùî%Ñ»Î:®¥K´‚ÕqX’¯z'7fÕY˜wîNôÈó"çO­¬H^%êïWœa7é|W ÷Á¼¦Õú:j±407µK†h2œ›‹PI냩Ç,0؋4£|æ]zÊ‹¼#ž€ä_ɺ º«_稫,ónƒ—º§B%c:Œ£ô’›0¸å½íóqÐInSt—³¼ᣢF"óAÅH g”Çâ™[ÞxòÕ¬ò.›GÞ ²ð³ò3Þ³ðaõú0¤ý–„’ĨÈ;=ÌãŽáA'‡¼g*íô~SXÄ͇2\¾K`Œ¨ÚKÿ!¼÷õN·ãÝë. xaປLnÙ8‘QsÞ Áöâ½è-³-V/ýéŠ÷áR3HÄ—â]&’³l‡ØŸxF”ÚðΎq^†w˼ +v^ñjDDuW)u÷Üí*¥M,Gb*¼{Ü«£ôí$½£qÏ«˜tw;^ ¿¨TãïÂíK,–€·_՟T˜Èå Þ³Óp +·ð)à¼gðՍZ >ÔÀïB <ðž£W£Õ×¼,ð^t•€F›]ä€w:^-ùöš­Ž&jöGLsQ$æ™)§›„šüÑ¢Õì£êV‹£¾Íð4Ûk’·dcׄnšI©¹¦ÌßßzŠ[ý(J¨ PhJŽ¡ã)‰ãÔ´É(ÒSjrG#Ï0jî +ì”\’‡šê8Æ`9dš», .Í98 4æçKê«,ë¤ ù®túÛ>Ȏf¶)Ji5¹H*ÙEk +ò lÿæD ÑÌ»šl^4ÉߚÙ,&šÉjæXíÀâ?Ç]P;ö1óqÉ(9Œ cTôδTëeLHPVuf‡•–­4g²ÌcˆY˜ß¼ZeZò,·ñ7“VU£»ø¸Z\aŒRfÚ9÷ qÌäuø\RH;Ì\ÒóŽYÎýÌb5ǔ©Ð¶LA‡LՌϔ­‹œ¡s³Ê,ìá_¦Ò‰°¦ÌÕqÂ%’F}Êä‘Êr¡°ñÌ݃jFÚ8ÿð"Bš½päôÃ{Ækê‚ÈöÀ!a“rÔô îâÊó‰p}Rx¯P”-½(ÓG]æ0ç4èu˜–©@ß17Øÿ†6Z#ÈËõ›ÖÝòó4–ȵ3^FûœÜ¾/¦¤Y0Ÿ‘UéD0úW·d™[kú*âŒûm9ÛÍD?<­3ÀËDÍ`ƒøét1¤Á´D§˜òbSz%ÀÄí9ÚøTT„Î0KTÉReƒ$dÑþxÝ„aÓ2n„È¥¥˜¹5rPéô–+C¥óV¬€¼ÐFI½ÍŽåq§i’i”bÒÔbŒ¡êá~³Z’Y÷(Â+¶µMï·¥.]SÛÙûs¸àÔ¿§åÓÀλ¤åÖ¼ñðÔ txͅYßÒý5g©£}Õ-u€É¥êÿ »S¦Yò<Ïã66¥@cWìn“5,²Já«9Tü•\HöK2Àñ|# §–?édpÚé¶f€à#M°#ÁlÈFïª~Æ 6xÒI¡ÛBtÎÔIgwÀ©›ùßp›G§zZîU€SuŠ›ט‰Odz“NyÍqعM1wÁ.¹dDà +G lZ¾ÉaX5v¥QvT(ð4´IgØÄÚõWB\l6}7IgÿÓ)y&B¢àÀ·Žhç,œòIŽ¸'éÔ8âe“^âÛÈÓ*ó—Zëþ&‘ñin3úµ3Æh_"ú.€µÚœt.N +L¤S­GòÀ’zúLé›yGbs$ðR xX‰5Ñހdñ‘tÆWå‚ÕŽXÞࠗv#,WkÞ¨Z91izMÈ|ž–BÊ°¬-=.áüÁ)pOËMNý}KπkWœBá÷Áé1§eǧ'‚$lÄ'ãÁ©êø€pԑ®÷§z5I8 O’NoþV9­pșÓrÃé7-'G÷ÿ²3£qZŠqÊÈå—ã)㗒 + ’ÎÁëC:ÏG”@‹0͜aÂD~¤³½&9wî?ҙ¿€d•%Jç‰àÇxrfz $E+ÑwÆîÞÜZP*yi7QЏ4º‹|Wtz~ìdzÀDO$‘CA]Äü˜U¾üè‘N!¨lQ3^v Šny¨eVŽÁ֚ˆ£"—á¹íbŠÌ|C¦.nÝ.öm¹»ãZ Ï>ƒ–Þ~¤³Š‚LÂ<C™#CÆI—MڏÎX4Äá€ll'Ã3ð>iø&3wm/ÞÓ0}”\ŠÂ‰¤3‡Cµ>¸[ŽÌ ÷C-›è²F`«e9çØJ.?6òS‘¥åaµ¼¢4ë „ÙðR#fõhŠx‡þ a¤³-J KÌ2Ò¹ô€é7¬ðŒzhé¡C?_Ö0沯¨->)à3ŸîˆXçŠQ©²-…¾ñÎÎ|d)ñ¢ÇXˆ°ÌÎD…g&$á,”Y‘NF.¤y6²ðlm(#W!î7 1[1„È¿¹Õ:<ä=0‘(Oiïꥒ@:H& ¯½GkJž{ï;‰>>ËLáÜQòS"Ç^ôјèþÂÜýÇ!ǶæÞÈ䡞àM0v"—šñxW¯h§ªIÇRp`ѩבÎ]Ì®åˆƒ}LZ4H§›ð¸­õè¼ñºâÿc– +¨½[ÀX€ [±– ãçét®µˆG:½#[Ú?ÆsârW ´f¿ÍÙϟŒG@FÁÔå—@¨ŽÌt‹»ÈÀ!¤s•c *éfˆô¦~±…G:;֊貖,¨%Sƒä²ØÈQGßM¯{ˆŠªöÆdªw|ǝ­ö³H'®½$¡›S¶(€ï ‡Ù`k\lêߖZó´Unã׳ë5šõE ‚³2é$`/ThéV©Rïg:¶N©‡dè¦AZIB/é](Mè ûú$2dz¡­ .*ҙ!•¶I/0$iåþ8ª÷”Q‹øxH­0±h؆ŌՈETs4¤Ó§;½£?6ÂA¤t&·":o"´W ‚ÌFšY¢YËF”uƗ…|¢çV¥"¢Õ۝u9¸ ½ØËècÈÐSf–h ÔĸÏ*aš‹/ö¼ ­veœ¸ eLTUl¶»|t£êLµËž¨ ŽX ·ˆ[žu‹£ÜÒY¸(j÷t Eʱ‚V¬¸!­e›âR]qê»2Á™9ÎµÀ¾\PWG­tçÿº—‰‚ò•‘N¶èf®\c|X™iÄ +þ5Xc×D-{­°äóýäd"žQ^@Kgù¡ðÐE‰tÆ×lï$·4DvkÙ<Á<•‘6K ¼`Aø˜¨èSߞ éS³6nïÚvAðË<Ô땰\1Ù­ƒ +YapB:96åª}Ò)à”S$>:>F!7›¤‹ ÕZFšÏ¥ì2Œ6“ì+`¢7L(‘;kê?98Š,€æ6ýò%¨ƒÃÆßZv±&"p-9?¯ø}@:Zxfð +†YL1ËSVžÕò†ÆœUjµâ´T¨ 3(H³2tv¹XqI-H ´V]«;’²|ƒ¼{1x Zl´?’‹[‰Ó¶ñÚ:’Ü÷9\¤+¤aRrÜ">‚˜s tDY*(Môè¼;–2ƒN7‰5W,È„ôÑkt-󡢇 aMD>“Ê +i#Ü~^?sËc[R²h‚¡¸žDÆ¥ó7[ヘ«Ñ‚ !ÝûŒGj-y{AG>:ÉÂg[~¹É^¾ÖØçCyx;ÚÑyÎ:šY{|†êÂÈ©'½Â^ô„öteʎq$F8¡¶^ø°‘REÕ¯ÏSª©C»žÚb|[V5)˜ î#—døX†zظ(ŽòÏ{t:õï1o‹àƒ}~®kYÕ]™ªÅ©GçH@™Á2` œ–U<<$÷~JG1)IT‹¨úáCÞk‘VÙ`æ¹^ªÑ|î6&¯]1*?›E֜£¸;+ïZ–yZ,º¦+1{Sll} PðD«ïõÙƒ†"”W Cè)·­v-å!!Ø­dñ{-c­ Zc,Ê)6 \‰x ƒNòó¦–&ºBÉ﵌¹ˆõ„‰rs+$´¹BÏy¹}u¯×²˜_wZ¦ÅBúIºç¸(WÛ&õ×vY¥8ÇeW¯¥fÜE«%:üšœ°CbՃȮ¥>¬= ;]˜Q!Ë5 ¡Ç?ƒ€¯â"ÔÁB¶ŠÕåÍ»¾„3- +r 4ãÐû¶£³VýLó Æ£ÙÑÙøˆŠ0§,Š€©€Á2JºxŸ]x~Î\ l§CtVïÎ$|V¼ø)­ì`ÈóN1ð°evÈsqu>2Ƚgl5¤ø³=°Ë*$³!(È´¶º¨)8vëxd¨œwµÂë?¦°„ÑéŒ.׶QÍ¿kDšB =ºŽ [: +²·Ý [0+J«ph ²/:£62“ÔŽ òÿ=ÔVKÑJ¹ÀÙ¡‡Å-€h|Ò^ e²ŽBĀ4@ãê¹1SŽªLSñ¡Y¬m،*+N°’øŽEg햱caÏ!b˜Ÿ-G·?-Nß³Xtn¦íîÒWG«$¸gã፟3$B²0 ÝÚ¿`ÿb'Žü„ÜÅZÿÎÓ§«š…XU¤*®aƒK +֎!µ$§xµ+ôùäY¶ Uï7§Ù½´ð¸ÿ¼¿‡à’ZÍú¼ÔMßŗ›W+‰N-¢ŠaK¢"Չθ…&:ED"³.».,¨Ê™3C¦gwJÞB=ä ˆ°å}^ DÝ)êÝÕúàSð¹‡ýÎ:A¨>Sa†ñ„\2Òqb<'‡a‰DgávÛÿ±fW#}¸\-y€Zv‡Ø’Âo^Ç´8£d¯¥ŽéR̄ûž]o7Ñ Ãlôiõ5ϓmÆà9âY3EXŸ‰NŠZç Åjƒ6";¢SзÕÅRŒˆ¤NŽóěgK$²­´ 0@¬ÆYnÍJvd=j–@\†G¢³0ÜyŒÉ¢«Ozñ‘𠙚[f}bm’äÖ!«¿áu½“ó¢aK‡M±% ̝®øiԖ[µ¾0ì(ûn¹ÛVÚ4Ã,Ý6sÎjN„T!¢š3G‘‡æFpÑúà %.O;@¶töz„.0GIúfº3DšÇΘmEªÇ 1cÍKøy«­éKz%~0Y§, :õ‡‚ı„­ŽˆN·QXD'mºäÞu±“ÀÂìj†‚ŠzAt:—߃åŠnîѬ›¢’…S[F¶9³8:/sf| 9í»”º‡Î¦¨Ÿ¶ì#5mïöXNp3Ÿ¶á-rBnO”›oÆ- +àwR ÜÉY9¥†c|èdž µâd±\FD§Œ´èÖ""Ÿ×‹ëH«Š_'æ– 1T#²„/†TÜl¬å[“äwM¦½½>xÅSgr "ÃsÌÐÉG*Ða;t +j‡AܪZQ:µÕ.ü3úzÓ1Ó[÷y{Ĝ‘ˆ}`5onZÝqcë (dv s* µ¨‡N)C½´891‡xÃñŠJëë"áßÊð@èë +9=9êÉòì``€À*’Ä–ŽTm >8ƒmÒPߙÎÀºÉíÆ;¥^¯ÙïГ°™ÃÚþ 0ì]6´ÿ­nõIGJÀ@#B1@ +¶dfÝÃ|âøÝt‡Îk”q +Éׅù±vY|!ãGðœzpÎMdFш›´ïVÕbµoè$?¬¨lUl2Fý&Cäõڅþ Ü-ï})Ö69Ê£*ëK©:Gm‘£<êñ¢·-+›PHdöõK›  “ŠB¡pÈÒZn´>iÆHªVÔDD­;‘Ä•i§Vȝ)Ih)ð¹5DšUóo,ò•Ö,!˜Iû¹"Ï:'Ùԋ (zC>Nwôþ]ñéòmE ¬¬B=ô£‚S€šA±ƒB §¶#{íÚkx €g@~p×bјWdeÑ6ÌÄ9£ ¿¨š=÷Òҙ²h¨¾M9¸R#cä o±^š-ia.Z@msM¶W„=´fîŸ)z=¡Ì( Ù=í8„g@i·‚º:;‡¢ìÉ¥ÔõŸFÁòè´rË´Õ²!=¶{ò°¡/¡v¡C …Ñq"¯ å¤CÊ.Gp 8MƒÆӂ¿¥¯çþWiÄ,à­ÄJHZJt°o`¼‰p“]J_ïVïDzPáh;I­iW=³¡ +"˜´…›-ÊÈ"t?X3ޖD±¨Ü3ujŠì $œŒðÌaú#عâòëã1ÝþÍ¡A`•g‹l‚†C–7¼—ae{"è¢ââb Ö'z7=DtÕ°{’³L¯²™Ól#ø£ZÃïö¡’½FÏÂa~yZ˜­7RÛz‰´}™žu4¿}Î VòW‚D|ý®¹(¾ÎqƒnEÏLk#ÉÓîI[0O>ÙßA&P+ˆñ8Õ +š²mÀ÷—*ü ­0帄ýÀ°•*ÿk"Þö² +|¹ßÒ'§|jÿ–*­9©§²\ªÎà2`óÅ)Eéࢊ<íGBx–Ã)ÅåÆã’äON)Dôк×IpJA]þÿ8Òþâ\ÃÔHQ82*Åê ô¤¸1‚bã:R˜÷bZ þX¥7+")&ƒ ›‰y„ 2·ÔSÀ¿YÀñyON¼×yÖ?¦÷0ìJîÀñ-I +ŸŸàaLĺ¿† ·œƒ³“ÐJUìúY,UA¡{qÓA—1goÒÈ:_Ay"À4•‡ kÔÂ!ˆ`$©à¼h)“,‚˳vøsÒÁ¥"<'æ¶Ú;³ +]þ +0Åß×äÆ'OFþ|'š÷”Ã÷Ɏµ*ª Gãóg‘úÝê:'@¹³ƒ^G6Õ*£Iþ' ]w&ëBØA_cá~rÏVëãM«ÂÝä°xB¹+7­zŽc˜ê‚>Ä©ÏâêK€”_D乗#€\ø¬PtìÀ”\ãÆ*’J$eœRòý9%“„_çfFúéÿƒ·‡ñŠ‹~ÄÝ­zÜ+K؉ŸB’GÙ¿'vø¨ªÒG54Ûð¬ñ@(oÅÙ¡ôv £ÌÚeן ²¢ËÞp~Øêð·=èÉÐ1?©‡™à¶Ì2;XWZŠSÌã¯E€WUçݝ'#V'¢ü¯xR(¹:̒x²«–1Ú{b¦® åà=iÃUA¾e…‚”sÔ/êU÷ÉHI\Ïtþg–NÛµšåI ¸ÄgéyWf¥nÝҎ@¶† ÄÓu¿Hw¬÷[Df». =÷pû+BˆÏr¶1c‚ÉYmTTŠ—,8@þWý*-a tùq¦ýþÇmýR@p7…Ĭ¡-¡Ô‡üV]áþ€«ÿFQW͔àckÛÀ 0»'ÉFùúQY1=æGz¯ÀDê×+‡›ÀûÏõÆxÑ6&±¯èvýoé²è/cx)ݹ «ÿm”1»:G`&ë$šéö.]fk qmtrV‡ú—Ǎ¸Øª»€„€/ ÈÓSˆüulƒÌ|çx8ãÑL`Ô0¿…±ç&ԟÛ0=ï°M¥|ªëŒ \Ò @(†-ƒ@‡ì€Aþ;EÜ3!É”§*iºµx5:/H ِœ09s§j¾¥ü8»Á$Ï؉^H"$žÅ)ÁÇ=z—kh|-«Îi[pЪ3€§NöàX¥:ÞÈ47ȴВÃùh0êùÿŠàZ7ÉyŒV'ŸçT0þûQpM‹ <ü§šs{œÛ‰ +ßneí”dșÓð +\%^ °Ý©Ð‘…<¢ù÷óA¿Eí”Ôcx׿ +5uQí攁€þù;Ÿt¨õ9ÚÂ.ÃBï¬ö@âB{`È6ȁ[o]^<±ìE£†4]¹+ŽéÔn¥üRóT”Q§ð†ìÀó’æÐY2O,öP=õûüf|1,  Ô÷/A²ï~†ÿ‡Q¦Ùå +k¸4ó䟖£d=8œ@ê¬GÌgŸžˆW¼Dg@€Kè¯Þö1}U/¹.Š·Üíÿ§_ˆÐZ#ø\G†˜hLŒl변+tý jP# gEødµLÅßÙi”¤FÌO5©5Þîì½­&sšÄ‘ɹ<Ù_ä41„ÚêAÅ"ŠÑ¨| À$Q¦»²°·^DT9_ÇW_ uWD¬%6pèÚä+=%ýµúb ôxÙ¹ 6 C‹Ué{-­è<¯Ê`ééä_=‰M.½ó9žµ}2]ÀÍGš¡o"ã;nµ¾QÑÇØ"õ!šïBÔgoq +ƒ™—:5ÚC|Yb©ý§VÐÇõȤëx¬Pý€œ•¢ªD¡Äqêf¿\ø7ù€d'£‹¼ÏÙÀGT˜„§ì@ ˆiò¯ûú>ï@KêH½ÖlÃ%ç¨ÀÏÐ}ò’ÒRˆ‡I‹©H%ñïù$J5Ë,Âː [óÚ5@F⿨μ*¼g7Ïÿô£ÌRûz‡²2ƒD møÅY¼~öqæökÌ»¾ŸzŽ(Ák¡~±9näµ, ˆÇ¸•!º[Q  ¯ì¢,€f•$ÁC±+9\‘ne %•¡)› aóO€V¸/“CWnyîÆŠYœ ,úßB=-†´B€1{ê?£·W¿¯Hòêkì«,`Ñ +ÀÛc lX̬ޠv­ä)•¤ɎGHª˜ЙxÔfîÞ¼¨Ê4njy´†ô €œ©¾°Žæ͵zþ‹˜4È«–€Ù†Ónmh4 ã5ÄJPV_×>|2p„`³9ZÃgM€LùµÚê 0lnÜ6z}ÛïAÿ 'hŸv£æ@ÚÀèRA¶ï-ó0= +"!¬ d,ró±uDKouìi‚’±Ÿ~/é°"Ó+p@iÛÀ¤0͟S@áG°@OE…µ:À0o™Ã#œË¾%äÉTñ…E ”_ÞàÓWPgwÇ[7y¿³Žœø¦Ã« +‡Ž|@æF‰Ôv €qñ]ÈP𥟾ݽN8Ç&¸Aýh8Àh“ªãÿ– ¼ûš1‹xìªKÎL|÷6fÓ$¨”’IπŲOŸpgÏMJ>¿P1‰O~ýæ¾Uäm«FÌÃôN´€r»CTFF1{Ê\2l/}†Û¶€»CÏE,s‰Œ?¿ó ÷i¯óI›”îûV‚@{À{‘§™1µûMÙ3AîÍT´ê˜Óð¶m©Ð ‹ÓÀۉ¦mÖ§·.KÀ°Ä d„SçúåÒ«@ô‰»™8δ—I†X½Ëû.a\Â,Ùߖêg¸£L;:½ú“•!¹“˜¬l),¨à‰+ÛÓj`cšxÿ_„¾ö{† é›©ATÿ7~l€s@Ã×ÿ;«Úß9†|÷{ca®ž ÿ<Ð@hԈ Šÿ‰Ç}<4Pû$aå÷½ÿW Ažÿ‡ ûïï´g¥L8þ[ª`‘ –Ãóù‡L0Ë?¬h¼Ð@‰.¹£ÙÅUý=CgLpՓ“0“À/tÑÄ-ä#Ƌÿ«Òªÿö\v_ƒbîE?Ø}ü¡/ƒha o;(Šƒèýß݀/²²mmuΠÿÞ¸ûÿüA@‡·wrÿ»" +ï¼àöŸpo'©T$§ÙÿQ÷Ã-Þõô²çy‚¼-ýŸE¿ýŸïáÿUîÏÿ¹Œ½ó²cóRÁ‘ù?»F<Ç9_þÏ¢š•ÿ“·v“ÿ“ûXϓ¸‘ÿóýñéZéÿ)¼èãÿ|¿ñŽeýyÛûÔõ5H‰GÛÞÿÞ/®Vš3ï?EÁv÷—j*•`’gò?P»æ«¾…„¡:ÑmÿÝô] `g(ôiÿ •ú~ŠJ¶žýOœX@ +͗‰Ò½••ùsï3ö?»¥PÏÌ<ýaÿט¢x¸>þcÂßb ¦}ý/®Ä\1ejéø7³v/ífmK^ +·áÞÓ1Ԁê¼ç}ŝL°;ÿ© Ûëï ±ä‰ææ¿ÿÕ7ú Ór>% =¸ 5ÿNý‘ i·–ÿ.¤œô¿Nƒ0vÿ% ÿÞOŒµÿO•bÊìûÙ«0y:ø;ªlÉ bÿ(:)ï ±[OÛù_»û/&@ÔEåôñ:!ÿ/žûî5‡AXÀF(¢>þ«D•_ÿçZŒ0,¼–—ÿQ/×^Ð}ª…ÿQžr©<˜-ÿQå|Tn`…ÄŒüKÅÿdЖå^ÃúSÿuc…bø~KÔAž¡¼ÿÍDõ›N£c&Þí{‰ZnF¹þËòTz ÿëjÝ i?G¢dRl‘k=øïZ L‡x!ùWãø gQ÷þs=âKùOù­ˆzÿT!rßa¤Eçý;½´f7Û?NŒ@’àí²os[öFwíåþ=Fïü€$¦Cʸÿ*Ä}zª\¸ÜÿöïºY2ÍÊXÈVÖ\ú?•P[Ú[¬ßžíßO*{SÂøØjÿ—ÙÒ'Ùgû¬ñ³_(O­.ÆYBnÈ\&Ðbu‡ è'Ž÷_ÿ¥¿ªåàÖ ¾þC=X¡½Ì먳…‹€Až÷Sæàp~˜»þ ¦þýgYÿfòf„H¬J~tQtÆA°¡I=mŸ2Çþ·ŒFOð¶Eüw0ßå«?&¤àÆf|;G=ÙÓ¿õçÏóÇ­þl‡ÁdVÿ˜2I’2knŠ -Ð-w´õÔÔɲç‡nt‰¸@¥ ÄÒ?Ttt˜šþÃRÿ‰n³4­ïÏàth€`°c° +Y;ým‹dù$ +}O7ý³Srr.û/fµ´kx5É Nl¿vþð™þC×wûº˜þ¤IQöú>¦~L…Yy«[q°™Ùß “þŸ»ÆT»ºäe¨á” rKRž!MlHsÌÿæ=Yº.§Û^º¯º@‡ÿ|Å¡g~ÄG¨0ý––¢œ)þývaëdÏû;5v¬ÛÌ‹þ2”ý¯ò°<ý3²æ«:!JhRAæ©>µÁ~§­/†r ÿ‹YéR,j@ÿœ°a„–0Š¸ ,‘½ÍK·Á2åó_/tæfÀ…lÂP¥üVÐÊ}EY‘Ô? ”>ªìbÇ_Úb’Î_¢ÆÿÙð1ñWORWÏYŽ¬sþbdT\`ã6àçWÈ¿‰ŒÈj–Š¹ˆÈx/Z?}u5J>ÿ,ÝÓË_˜‚Fº Äñó^¦õ×4š¿VøEgûE{­8låïÖ¿P ¶9ž8n ¬êy·‹ù;¢S°ùUäŸÕø€h­:¦”-3<Ÿ»zÁüÝ݀CûÜücÎ̓¿-ìˆîEoF†Zc + ü7îO¤¥m2ÊVþú—’b_'¦QÜUþ)à“¡h4Éø¿gH  7Sz„üÕc¦9È0 ‚ +žÍ¡ü3ÖÁã¤ùóÉ_Šî¾ûÔ^"L@' ?@Èä&™ŸË¶\b—“Íښ[£Ávø'‰üöª%"¤½;}ª~‰øëwXIÃÜ·YÈ¿VÏ +[W0ûÏۉñoógoõ;¬„ ‚…i’ydntCyüã÷ÕuXà_Çn p­ø Üæ7ôˆatЏrj=ûOŠ‘Ƭ”î~%gF=ûú׋ùeükO+]nhA¬8ˆ=ŠÌ3Öºñeñ'—‰ìPuÅa ÷) +Kû9RðNÑ°AžÈ<ŸUB_¤Öð»|Š¿ ÿ|IiÆ?Íœá%pp;z‹øc3=Ä`;GÔÄ?ÉÂþðÏÓ¹‡’«ì(’Mk¡jtE_çþïyåþ‡:§¼mE_ø÷¾ØŸnë±1ÏÙ£¿Žö¸v´‹‘?ñ,%“tÁß&«±€YÈÂAÀ*ø#=ìs¢p^({‚¿ˆ%\[¥÷ΰŠhý>„š9R ‚]†åèûä‡Î^J(1Rÿœ½-G-oËjÅÌ àŸÁÈÿþ<²ԁ‹|· : ]’˜¿¿»¨²Â¯Yq€ò&šÓ²ûýç‘Ôïÿ2(\v|£å& "@v~?1è%6ŠÆøýòv™à¯ë·Í öÿUÝË«F%:”}È×ÀéîþpØDO8ßr¤ö´¾¬¹½ß7¨qΏ¤jjÞo¦³bR…ÝÿQ•]ÐUõÝ,°ü%_€Yô~ÂêÙÔ3«:7ïÏi"‹+°_©î]HPI$µõx?)$úá„.,4.Þ¤P>M5mKNßs@H¿?´áý|8H$QË™#”G3¿û?„Œø¨°»;7V·•eòÀªx›U~‘º¿ƒsΞî·E3·V¢)F÷ÿ­ϼe{üß1tÿýûÆCgóÍçþY®Ú×\Ɂ/mî· +þšòcé›î½Ú·Z„ae/ ¨'ÙmdÂmÊˉûµ¥“\‡Hù!í÷Ò +z/úÔéaz¬Ÿƒ¸='ÔOL9Cñ\¢¬\ƒû šeo¿—ä¼ýqkcG¿!~Ô«ök+ hö“>°|AçP¬ÛÏÚXKA­žµ–D#ÕþXqŽØTÙÕ¯,.Ûï=Í.´ž`èÙOÂCué9¶?äôÑz`™>ªií¦4v8rö{JJR)kHýMÚë´œ©ý^0.É òàcOû¥ä ªLJKû5ÔñÝEïÃXvÚôIìˆ7eÙùì™wm˜< ŠÚûhx¬GcV“‹’i;û=Р!›Öð/€ g?â4g¼Ñà­Ð‡¤_){ý»}‘˵Å5ûéÕ£)vf¿fºZeÕ¤ÇìS~wE:РȗýšœõÅoZökD¢tàrCv¹²¿,mE;íwh®)ûñ7¹6–äOöÛ4(ˆrC9 xC%ûåûɝUÀœ€µÀ´‘ý+Dú ;¾ö!û¥ö&²Ÿ¥»ù-]C…1Ò;¾ñ¤÷âb×ÿ?$§ÓˆRˆ¥S1žö…ý:JÎ|3ëGڎ,q/Zˆo±ïÐ|«D Ê5ŒH OÀ~ÒûןeLþ>e¸öõךbj<‹ç=v¨TÇÇK„øÀ@|®JšzŽ:|»`hƒÒõ[eí;‡À*DN®eÇX¿!¢”á±(«>åúóta÷šßUJñ´—M)‚õÿÌ" ”üyñk¶þN)öfhÿïsìZ?J?y•æ®®à6­Ÿ¬¡ù3_TˆVý·Få¿êWóž!):6ë§^ªàL^fÉúËêb +ÊÏggþÜn=>y¬ŸWÜÔØö‚}½X¿'\á)PëU¾O¤yÿjÚCq¾±¸°PÏ[8úØ|côˆ~7ð|Jÿђ"¨mª(Çø¦?ÿԈ[pÿI¿¯ +?MÖ±½õ" +õ>Î“B2Gyȇ“¸¬Ù&XÒÏÏ`žìc{W¤?Ç¢Ý[N2ø4¿¯™qПU&yĕàG·:ª©Å‘€ZôëwÍ+¡@u°lޜ×·<,öŠ~û<RaäóìïÏÀÈ⤿`vDÿÝn½}MR´pv@è(D?$ãòàµ*x184‹×±v¸¹[Ȋf`üì ýÞV¿-çl.epA¿Ímx9~l¥P-AÿÕj¤óÁwúùÞ|^qþ2_ò¤<…iŸè^2Eh.6€«`ü‹/m~õ˜$›Ùz#,®Øk!šŸß}—ŒTñ´Ž ñ:_óÞ®£¢ÿ3ˆléšç¬æï¸\ó +÷ «¡Û󫷌>f×mÎ%.™û†9s{z~+ÁäÃ+Tí‰çù]ôDx“$ A|Ëó!Ð#PdÒ¼á‡ÐHûq™Fý^ºR4™ÏS©£¾>ò³ÅßIΝ1;Mha¶ñçüRj’%ÍRŒAóWJ҅8xs {B= æW8@r ÝÐÔÿç?ö/‘,H(¾¦¤ÄáüµgîØ0ŒH‹ØÐ 33î"÷Avnmî랯ùÅ‘‘säI `\ʜ)M’b~ƒ#oQ˯=Aý%ÿž›©ù³^pRÎoU Ù +þîƒ5Q:ìÅà‘âÝ©ü讶ßý}«þ-j¯l£)´u¹¼šèfþ%Û.û…ºßá*É&þ™‹}ðë) Vªo—?ávÐ(GZþ–rsC&œcÈ`þ΢)­/¿êx +mØÇ6žBJɛ†j [å2à$²Íɏ¼IU}üB†ÞåϧIÿ #7&ë!â*ÿøLޑƒAgÞ櫽·ñ|a~–ßÆÌ`”«ÚDcùÆNbœÏfA]]ÍèËß!e”¨ž™šŠY ÂaÂÑl¡n£°~齓âÿ†0ùòŸ‡Ê¨üÎK ä™+K~ ßðȾ‹ SâO-;}Ÿ&»£‹R”IDÝÐ k\ÏAoòSýÆI°&?ô ¼hoÏz\#&ïüßè™(gô²_òóqã…]`u|þ±%ÿåºTb0°•¥äu¤v_é’1S»¯ïGþY¯N—âîa½”d8ÀB[šÑ ùó¼\“™åÐ¥ùV4¬ ¥/|"šl4gaÐp½!"¿óÖJ±¼¬ŽP V¾ÕDoŠÃ£ùU#³D3ñ07Ê]BPǶá“õûÍ»ƒ&î²wpùy{Hé[kZ`=;˜â<«½×’)pŠ÷ÿ¸$·S¿‡àŸÇo£Ðjúޟ¡¹Ç_ËInÇâ·Øvüš 6_ Ðrè÷`+K…Et *½wÄH¿¢v=0rªr?V‘QEu;ÿ^v¸|“N@\vãW1S„äQßâÇD zfµDâé-‚ ½¾c§ð¬ó®“ñïP¨\³Š˜#Í>Ɵ3m³EíÓAUm‚ÿŸÖNfJ«Ãø½¾ ÇVñ#¶«†ø>x7´²_üÅ Ì:€¢¿§uvñSàvHÜ«ZäâÏá6Y´Ûǃ*µtøB;%¢à¶v”µø£½tv7$þøeŸ‹í Uãƒã£l1Äâ¿ÒmöÕæå¢ú +²_j]´m€È{á± <êr÷ÈBúÃ/)}%ñ—³˜B7'F¥ÉÀ!©¦U­ÒB…REä²QQpnƒ¥ÏHüRÐ >ù4!Žùˆ¿iªÙ|±*Ý=y#þ7ªfׁqéÒÐ"~ õRQL)'éۇ yD›·ð=ü}9ŽþòðŸßàçf¾#,T¬œÞáw‘‰6“Iœû¼Èwܲw[Míl?&«Ò`¶4®áçmƒ®Ra `\Ý4üîXãûAŒ‚âþì/ïô¦Ê¼#ŌáÏÒ¯òålðq(Š0—ga·ðW qRŸ¸dYø½EÙ¸SBÓ"^á—aïqaîë&çnƒV<õ‚ P}„ßózÑÆ +yÿšÅ‘Fþ‚W*pt¿­¬Ö% Â_Ò~d ýñŸýiíã¬?…º–ÂÔۓÒ؉ûå‰e—÷=üØ+qeùzSJ) g.ܟ5.¿•ZLwp•KPÁ}—Äâ'Wþê·¼KÀý%˜ýã6M$t¨œ5¥’n–•¨ß>©ÍË.UfzÛW¾}Aóޝ ‡ë|¹sºýŠŽü1?ÏíX‚îÖ<ÔË& Zɞ±$2ß.œD¡ù†ä­I|Ûþ¸®Tjr ¾×ö§X­eó„Vÿ*¬¶?Á;ž·ŸÃ +§Pnm_3‘‘J‘ˆ¯Õ8FŠFZ)ËDËÎZ•fûŽˆÀ˜NÚ`•ôMÍ<þ~X øü»öëà I‡1  ³/G"± üÑüºòNªØ°l®d©$߆LÝR…*Ѻ”Òh*+ëªÙjÿÒkœ=Нp~LÍ.O¾â&N=ÛÇccUJ)Þº,ò•¾Sû‡È’rºÓq·œQûn¥T¿ 6 e†Ç ÷ }¨ýJ#·’g[¿>ã³É@¤IH-Ê&dZ+ˆ,X->Û=Lo¶ÑiÀ¨#0þ‹/âøÑ~þ9,á¹ žQi³Ï)¸?îÑ«‹ö³å¦úRJŒÃ¶¥"íLQFt¤Ù'&F¿y?yhíÇJû…§ˆÓô$œíÇGÃK~ºn'AüúÝ7y,оfÞrw„â«h»î˜á°q}Ùß~ÇC7¯Ùr§è³/ '»GKæâ׍S Ðð=ú8Àýh8ØB™j•g_èåqˆ‘ß‘w®3œÃ$øXU_éàý¥Ÿ2û=¾ˆCÄî«èG 5f?3ë1!÷½[@Aû®@Z»~õ]R¾nÅàD²°|É£Ýí$°ÓB˜ەý+ʍcñˆUöq\ÁêÓ)ûX‹ºÙVÊ\ë¢ìŸ×¨D +÷÷ Ç8p%+5Ù×@©¥£æw¬+Ppôg1Î¥o™Â$û ΃ó̾aÀqÜæ—ÇÄŠexUuÌˍ}ÐJkìÏ”×1ا^nÆþØâÙ×7[{ý„¾²R9–…r½þ/ æõfÏ~-Åþ͞´ìÊäe=±G‡Îm>ñáô ºkóDå¿Wˆ}ÌÆê˜Vè¨/0hij@‚Iô'ì§lTmü†ªƒ/4c?Ø÷[¨ +Ž½äbÅ”Ã±Ó { °Á~Ô°à×áYêÅ%ö11$P5]‚%f³\/Š+ÅßÜքÞy%p|‡Ð_ß7á¨qØ~t¼²œ˜á`êllA/þþò£†÷`ÿŕƒønÌ-à +r_X lRsì%òòú86Ȏ49‰ˆãõK÷¢o}¯¸±´>¶Ý,Ðk”»ŒÀÛ`DæIí⭏~ɓpv}Uq]%~³;WחýO¯&L׏~6­›?I€EÛ\ Á¡¢ëgþ^Âw”é|˜Üê/†oðçòHøcÆxþ¾MáÉmöh+®ïŒƒ›IáúmËù]'üpÀp ®¯•mß­¿G8 Ysù­ïH¢­Ê8Þú·ã÷•µ[¹Ïný”ÁãîÒÒD»ru së—o2Õ°5ÞÖ÷¥È6TmýÊI»a¶ìrö(³¨Q³õÿfk-{þ^õUö\ ëæEÜZ´>–êÇpØ­ +9p±[­ä\ÇRë§èLuž9'nŸ¹OféÒúÙÉ=lŸFë»ÄæQ(¶Q cýg}ÁÅ ˆt:ëï†ÍÁ +L¥üúzí6Fän9Û*gA:ƒE[¬/ÒêÏ8_þSAœóï7J[Zë/¼¹Ce>ƒÔŽ8]Xÿáð°°ÈÙ0Ö¢|ÕÕ&P•ä‹ù«ïµ]®í¼Ó\Gd€¦½úrØ)@]È]ý!´–°S~‘siõ»7¤ÜaSV?ˆ‚±ú± ᡯ}\†.bö¿)* ÚM«mTŊ…Ñ›Yõ¯ÈËàj!61~ÿ«úŠ“ñ6ãXZ++ý|žài¸Vç^ö]Ÿ½É ¡J~‚ SŠêSù< ‡§ôõ$3 ƒt’³¨~…Ç”éH+·¡úæ¿Ë/g=»ƒêj»VQÏbÉ\~Ü£>_rÔì’Yw¹§þµŠÛ¼=ôj ;õ3Õº²\äÔ×ü!òÄ—²Ûº©oÝþfíòŠöËf6¬Aþ×3[L¨Ñ…¼Á¬Œ!X°1<ÁHýěïŽd/à«ÇRÿrר{¯ÿæðµ¸òˆÞmìÈD™7´hç pðécR­ÿ²Êðì¾õùOÜC2 j1¬V—"^wö>„ËeñÒ/¿®]JUò|ê3¾¥„ÿèWËþégôµŸ~ší;?ýÌ)Òyú©…=ž~¶sïô³¬m§Ÿd…æ'mfÏ<F°Í`!YVA\ÉÇæœ>6xH ©þX€¸0—ӏ³`œ~&KÑDô·m8oòV<’Œ¦»_ŸéŸ&´fú÷,Ó?ô’éÿæxLÿIÕµh”Ôâ ӗ١oyýîò,˜~g€þ!˜ü“õ.éñÐþWúÝB}pð¦•~"%•D¤/õF×¢ÊU§ò"ñR#¥/nèZO¬ŠÞ +ßNú•%ø€t2: F]|&÷›ôk’ìGj@'â0ÁshÖ[u…=Ë%ý÷Á¾9È Þ:­)ú16Çgè0òl—8Iß¹çHó­(²°/$cç®e-¤˜?ØAúñ¯…Ø$ëR«X!ÉúC¿o·#”Bo? +õ>@aBEjÜRè½A¦ÇåÑÿUɎÔµâÙëèH òû¿=ð¦î¢Û{EÉÜs¤·Ú~þ¢Jï·ú§)ýÎ/dÕcüTÏè_M…¨8x}Ç]±eäP»þŽ¬«è»Ì¡–² $ðç7·KC%Úºø)úÒrh*Ðb€¥(ú¢Ëc$ö˜‚=º×JzõµË˜±FÃ}'&ä檵¢c7t^ "âQš†è¹¡aúATt›Må†^ŹhÕ ú‚Ì<¨2a{ü©¼eÎú.M˜Ãy¯Al8•«cu§ÀH™iCÇòç#-ð¢µ&þX,åÐÏ +EŽù4Am£uñ»$,/[—/…²¢AÕõ•\—½—Ðf{Õ»Åü:‚ Y0B?g€¾ù=iéœïF` †,òAƒ¯;’•¥—Aºƒþ#pl_8Þh+šE"0.ÌTÖ¡ÔÖÖ<œ{ð—K´Ž?¨Zjõ$6>¾ Ý!©€à€>8ª@‡|ÐáY §²1@ß ”Ø֬Ґi=üÿ|‡ªÝ“‡ÌW8D…•)õÏÿåâ;:™ÞýùñµüÖü·®Åò ùóc%V£kÞÏïoëªX’ÁfÜü|ªÓglõÜÆÏwX%N Þçï¶Ï$4:ƒ…àŸN{¥8Oۃ'ÀîùpW€ÐmÞ&͙½5¹,®çkÇ þê f½„€`˜ ±ƒ€q˜ð&»c#®Øolw{€ˆ?LTòÂTVd\fOÄr±ï{|Ë·eÄiž[éð÷÷|ˆ¸7¿ÎçŸ~çs§ÜCQ×ۖ)ä·z ŒÝC·™™4Rº¥óÑQqu¦ÛäEPDÄNRDDÏÊ77B Â꛹¤ÇÒSå´}2IýGz#`‡½sz[´5·;çÁnˆ¡óPTƂ +kVÇY¶jñ¥2D-íÕË[´{87K9:dK¾Å݉Z6ebÖ OÏNMwâ¡àùðælq¡2ä‡ã„8Á´XN>ZØZ)Ñ–û|Nçü•õ̌ý›ï|örž¾²Ms&º¹£b9¬æÖhÂΘìÑ”0DžWûHqH4z¡˜‘ ‰r-Š¨D2ÅÓï{U…UeUEUeõálû€—E(+VbìtãJ í‰?»ýhˆ…ڇü1En ÅSî›(„Š°ö¼ëð]¥À;ìŪ±´d›cvjgŃjž¢ÂðJcwàe,Ú„ã‚èÐ(Reiã™T­¢JKmlš‰ýŒQAA^X‹‰Zä½ö™¡ÓQE›4ªªl6\x1 å>Ë!Nx…Ñ0 }:Wx>!D»Žp밈SMôÐK +> (ˆël|FU&u+1aw ”¢M– #„ P0a  ÛdŸg¨Ô<¾ +z `YH* †$rIJB¦=84 +f*0D8HPB  ZŒ‚ B +c ²,ø†­uI‚ytç22F‚¥êgg»íK å²P`ÚlI`ó!p(Ž˜çP„Zº¡Æ)¬±ƒPø‚ 7ÞØ'Þ`ߥŒóú׉è+7mY3™T}éëxÒaLX°ž¯‰#âÃ6†¸A˂ݯÄT«î +Æ|I"}Ó¬hÖÔ§cˆ­ DÔWÝ8Æ»}ç4é©cI)¾øJ"ÐW÷|ï¢Áڔ9<}µ¾Q ¾Ö ›ªk¾Ð3NïÑ+ôµš;¹1¾”a/šåF?6Ÿäê„ïÃ!ôGâaƒ,Àíˌ÷‰¬{Yã¬-lOÇ „³þª†bT®°å¹öSƊ¿Ê·½/Ò҂QÍ~¾¢·«ªEô]KM“à$â{ލiU‰{ãrØÇtáA!4¿¦nG•Z)8WñŒ·ð8.‘œ“}*^a™"ÞÚ¸=´~vD‰Ô@`K—´ ›8‘@~È͝F ·×‰ùî1©-z&ß)²0Öpä¹¼öÉf 2vwè‹øՖ]íE7(ǐ°jczñ&¹$»ì@÷|Bb·Ÿ\ŒYM°ëOä]îu5±Œ8×}ÊÒ6kÝò4ˆ‡&±®‘ñ_ˆv……ÛÉÈêQ0•ê–¡ñê¥î#îslÚÏÊO’èÂ2ÞD.U2Ö$¦öȖ…oTú¹@R ¥ûÜòîÄ}QI¶š Çmõeµ—æV]—’¯ZþÀ¼v²¿Õ\{0÷]â q9NCàj%UVír -WüÖLÏb«r¶ê¹:Er2_|ËfÁ¡²¹ŒÆu¸ð,Ú¼ 7wA>ö¥pï=x„ÛØ •-)çXÈ­æ†=É͉Îܽ³É…ÃMs–kê@љ(,$ØÖì Ü؁oð­+ùO„£vÅ-m-<¼`m8é±Y‘ùÁ–þz”í;òZ Yº¨J5ìúªxB¹.ÌÖC…ä–Sáâ‚|pË]Z¶²ž“"°PšµÌåödgˆ8J͝Cò’1°jK ŽlÕçèRr‹MEqýùWÇH@~j%³ånÄ* l Ìi‰"v{ï¾ö1Æí®¤Nþ6q^»tóçåèh +ۊ{°cµÆû0d¸i•Ðòüjg…¸ª•þ]TgëÕ¾ÚÑwíʎó-bj…oôšc,ÿ”Ôڌe`ýF˜Ú¸A9­DWÙ¢ie§ 1:µbÚsO´´=KõÌÃ¥m ‡5Œ¶è¤Úª„Nk ÏIÑÍ|*¢µ}å$ +/“RéÉ6%´¢„ñÛá´Ó§*¤¶£Ð>îü×ÞÏná|Öϼ zÖhê瓙­)^[±+½}øeVóûN5;I`ŽfŽ¤fV܄ 2k” ¦þXÙrK2¨lلBø],é}Œcm꩹v,uCYp¾Îã,(u¿©t¦ùçXY¼å*`ßü; òÅÎu„h÷ŽÕ° â!IJŽTñVþLó?XœXҚxcðTibb‡Ð‘[¼˜ÂhÐxoö50b$çÞÅœI“Åz Ä`Û÷âG¤®”ìñ±o¯^ÐV‡…Nï"4,ѝr&æ8ê%¦{°ÈšÇR°·áóړbŸãÿ]­áÊ+ãî醀õüO¾þ]½6‹X¬áirþJ3`׏ƜŠYœ½ýmn'û:ǂ'…ÔÛqcí:·oõ™o<@ +äX¸Ã…f'þÅ=+å +ãÃfÒd¶Œ°ðÿóÊV¶åPÁ(þÈß©” ¯zZU ÚCmEÉ+…JšYÐTu„rb` +Gq Ã[=KÓ…£qC?å)Q4­šV€û‚åI{4äëôF#§!;Ÿ¦žŽ"zE…RƒÁý†žað\;¤8¦!`ôÜ&öÇÀI×.üM'‰[øý‰ÞÝC£ó>Ğm%i'4€€nÞf å)‡äšÝ ðuj·Éq)/|‡N_oД·´Mû® É ’ÆæO?Cm ïl_®¶iöó»ö9柪!ã›·6֑Lžy럜ÃR²Žå¯Eô<Þ¢ÐEn0b# E< YîÕ +ó --s »IWTx­'wD×(þ`'è1'Wã0ÓËS˜o:·FÙÁXš'}•{¡~MÆ¿—’ºY"Àœ“[Bœt)´ EÄD>oª9HP$æ"u[„|S’?ÀÂuÃK¤›ðÝ +̗ê ¿hàìÒ.æMù¬MA´c>´ÂÑ)…[TŠù/K⾯üÎ%n[Ì‚ç<û£Fíç't!ƹÄÔriá¢N3ùŠ÷‰ÐóØ bvæ²ÿ  CdÖr\=Æ:³<'cð8™ð›`òey@K›Úÿ|ù¢sè\щã$½Èš½ä3üU§ƒ¯Bá#¾î™B¨eø7ŸÜŠ” úZÄÊ!ÛnþŸ ¼ÏØü~Ä÷|Ǩ¼ó—;í³Â‡zxw ïé² €ÍËôÃð"Ç +l•Û ù?½¬ÙPAŒ%°H)Iʵ'98ÞΉFû1á[2mnhÂe0í“dŒŽ)z­§ªÖO´ G]«ßêë€î¬Kž œPM9ŒqHãÍôòk•º?pð?˹2‚ Þ̉¶V’,{ýež>5s‚7Z-V,䫉†7Ä×ÅT3OÁ@SÊpqêðxÇJ˜òù7øm"¸ÍÖ¿æ×|˜çds‚s‰Ÿ‚0V”W“.#Œ3­,P@›i^dórçúzݔ;Rÿ ^,wÛBHâxD\ùâuíAL—…%ç \X0bߪ0 ‡ô„­7tkfeó낏ŸÇMrC?ÅÝüø#O ˆÑÌ0®ðՖ¯éÊ/°‹¿¼” Øç)IÜ|'|V£(fn©ûÁd}©ðUo44ÒQlx «-ÍtBô ëֆ½/(Ò¿¢e@$6Q…‘|+‡³ Ûqëóy±Ï¦ŠœÚÁ–'ÒHB†BôI6¼ŒÆ‹¢^˜v¯`‚_ŠWÇ~ØþÈá¯(s¨zaÂzœеr×Gë"ÅG!&¡yª\‹% Â嬂³¿Ò Á¿”² ÛÌëHØo7µ˜†/¡udúÎs‚;àü֔ÐÝ1’€£Ò™—; Þþb2E0v úaDÚÞú†‹êüóÖdØݞC=1¤ž‹wœó} ¤|à.„2(ĆRdÜIÐq=%k£«È?“þb’AA%ßÏ!& „Ë‘f_DÃmŒgè]›ûï_ÄÏQ¿âàFCKŒî'“çqN7Ðvç¿ üÇäGŃèò&[ÒAƒAxåѲç¢Sܗ¬™’2ô+«ô>J-¥Š†¸Õ6‚µ®Õ¼Z14)„@W\[F–JÚsŒGÄ¢ëV:þt܎>‰e~2ô3êõÃÔÊr Þ)Áu£qA  ²BĚ·Œ…ĨRÈæÂéJ + =Ï[¡¢ù_▚-¡e^ì0bÞ'‰î4•¯| +%ÍÜJéBë•ë†­\4÷…žâüç…¨!(Œƒ—!ÇŠþ,Zn3n¥…¨]>á}Þ>Í>kÚÎ`f¡œ“ÖԑԀލøÃfœxÐÏðÒÆí¨¬î%"Nñ\G€È.Ð79‚pïšì•ËÙ}Î>ˆ÷r_@ïQÑç„ž;9K—d6ôGºß¢tìù†KEŸ˜¯è¢Ê®ÌýHäzŠ²=ˆåxüÆ«u¶+ll‡Êvn/ƒª%™çò&–BKÚ[4xÌ^=rb͔[†—<ØsýaBŸëÆ46g®Û+è³J¢yÏ dô#ïLf'äÅW¥'|ôM©ø™…óØ°®Î¶©~Eˆ¤AÃ΍¡{`ïËHÇE!„ýuÔ²eŠž)ܑS›)oCîÍY >(՝ŠÀ[àäîšp™8'úÑ>Gœ"ŠQ‰ZÈ£žjñ,ƒïþ­üY2I!ê„T¦ d!†I ¦ç4ÃÊ pP†{&=Q)è}݆_b…m:-¦šXx׬RŸIL•Ò¦1JP« µ T—ÙöCj +ry@îÛPÎ5ǸÒÛï2ˆ0Â&:#©;›ßæ§ìߤý>ŸÜ-ÿK…Tò‘}JÑX5S%¯ƒ Ö0N©"þœ7½ÿèÙ8óÃ:4Ä ŸVM]S˖$?¤ ¬°»Œ`4P;H©¸ˆÐ¦D,àOò6íJæ*+Ýiô®7àŒG ìûdMéßÊ@g¯P.X.¥Obоšc +§?̀¹æCP¥_Ê%.&Å9æïLx"ƒ=o€Ê'^Ó60÷ùîÐww‡ +Mà­ %5ÓHž¬u +˜¢Z#XoRI´h*l±Ù'"PP Y!o@­ï·mIæ&çê Ù!-‘‰!¤±‰{#ìÌ] Ü$î{ɕk~$üŸÚP # >öiy¢<²­¤šPì0cÀtK֊ï&¶|SËímÞ}~T Ä6Œ†)žˆtïðOEËE—ØÙ³€Ôx Ύ¿Zácw}·Ôˆø÷Õ× ƒXÒ*f흼rzXdF΂j’Ç@+ÀÖFÏnR*T%¨Ú89` Ú<ëˆ~…-¹k¶î+6^ŸY„Œ[„G7­ô-䖑£ˆœçZf>ER*ªwÐq —ÍeêL8ÓÏ‚ +Îh“¸å‡G ‰W¤æ‘ØP‡,Ÿä“aUρvUÒUñEô!c<% OO°<7Ñ¡zO!óÔǁHÊ]ë [Jx&xrŒ 6%ÐBà;WˆÉÊ6‚;Ý·&[•»n„¶`kx_^X@"}¤P¬Ÿ.^wÏé^rŽðÞ}QøZïÅö0F1 Ý=*>,X†Q)½-©¯÷ô~ ³4à¸Äow¸‘€¢¾š 쩶äõDù²sÅN ›Hwƒ(»$%æ)'}ú-±4š†#MžI›ËOPáý¯P¼|«R*á}ús)\!7f+¥¶ÝO¦ÅÒñ˜\®àÄÙ Ä饵¬˜‰Ÿ|$1&"H>±‘Íd«&ÓT*™’†=ɛvƒzvä4ó裖 ´i@Ü¢X´„~•ƒ-÷ z"]흕ïÚü¥du·.w¹å½>!ä™Ðå]'Š +®—…ÍkEN¢Úµ–ïŒÇnn›?ú¥Suÿo7„¸¸÷‘ÖêJ;èõç7Ø~’c§ÿŒîØL +ëñ:H℠YLnj°hô&ê*G²,dé‚CŽG…W¿ –ý5ûû–\Õ ß"Xt~8+ÇB'G“ăp‹_òÓȔ¥2û( žApñƒ«¡-ßx›Ùœ*”# 3ƒ‰pTνãâ2Ntä3톍*¾Œˆñ䢒fS$t±ñÊÊ.ðj¬Ë(zâ;Ä ºƒ§Z7ŠÁ²ÃÎ7Â~՜‘C#¡bظ ø+à)£Ç»äøä[»¬†lü¥– ’±g­ò•£¶cu°‰\“æö=lEIZ/JÐ::f!­×Œ¨óCnö© óêb`ÄYÁþšBŠ¬¹ñ/j›€¿?$NôPY>+D:y}JY:‹Ü2MŒ uxv5ٕÄ:g±G?*Ό‰"Í,2”©‰êg¥,Ã;fóÿϲm‘ŠÜËsD#ç#”ç&6B—*œ…’N~Ry³Pãô"XÌFþ°Ì›­~ìÊZŒt §­tà"TMäxÔÁÒÀÆCïêë#d"€(é¸R_…üR~_"K­Žáx bŠ:ô¿Tbèx ø E–v·0@oâQqZF¥_Ô&ÀFÿç2hÓ؁Ó1´€è¼õG±Öà‘(1Ý×b ÈC¨ +ž?Dýœçßnó]¦ÎñoZ–…"û|1Ò$óZ1…WH“ï‘É 7FO”É,¤ÆòiÀ_ˆÏ·J0VD|œQ0d¯©/íñ{´ƒKQ±¦¦-ΘÁíï%qò£EÔ]óŽ½`®ÆjRj³(×;HÌ"ðЗ/€Ô/²è*ƒÊ +ù~h½ÊJ kȦò\v6ªx;9¶¢2 ýËÂßõ +¢d%á„5eÓL +‘ó†µâR~ hӜx¬Ž|øen ³½OÑäóÁ(=Î]bH¨4T÷jSí•-ø³÷yìCôÅNlôw¦k—g¨E€™=⨤WdóW VžÎ‘%õÎÊÿ +„Õì…í@|-FLæl™pê(cÂCÔá2Í)·¨~\ô+Ѐ‡3 Õpn#p Ð$(9±ÔQ ÿ*;Þ$ûÁxa€a ±€±_ÐÁ>æúƒ¨x[ˆðƒÖÁQh Ô7Ä:ceEKQ· 1iª!•Ä³:Ú i(ò.°XÁ uÎÊB{¤óÂð˱ý`½“[¯ŒÎLfg\YÆÛÝXyLèï@D© +'·d*²3¾,£09vJîÑúUÍ×E :O•™?&ޗ½ï–'#P®®C[sVÄr¦Wœ>;‚ЀÐŽ”i:³ù´¬Û˜âŒåŽ>, ‚8ÓDÀ.P–D´šX'Xòא[ljçLMÃ8,J•žÒô19 Î]º¹˜è@ÎæÚa]®œ]f`9gF™%å"» +¶œä¸ÙÏÝÆ&–’ìÂe¤\é¼Êts"‰‘ŠZ‚Sœ¬:Xæڀs¥`‡’7gº™=Ï©°-ìkLTFx5…º¤,Äzëè4Ú&¶Qsm‘:”ŒÒlZ2Q'½Œ«;s7ïiqÍ|ږ8n¥L‚Î9&pé˜ÞÖ}KZL†Ä•Â“´šÕx[fQ¥Ú—îxì‹öÉLRã“îê¶ÇA…±¶Uz‘ÌÖïdãxô袟Ç}C \ïøÇ2…ô«-${Ÿüõ¦Gs/šßûØ¢{Kވ” On:Ö­¯ éb€š¼ÛhŒû¿îÓÜbG‚ý ²jÅñ¸cÑO®.òÈ£“0¸yôçLȒ“½nJ†°~VkA€äkŸ}•/§¾Š}{ÃIùž‡,7P +ñã +Lrú̄”ͼ‘Q‰®{£€NDB>ñ¨zG}þ !qewxV N“ã¾×X©ù-„»Ä0Ë»¡°g«×3W0ó(þHO/ø\Žæ×®ÜGńÅø ¾ß`³<“çŒ?á×Á•øL„}l\Aª ¶&*aÊ|±æˆÝ qïn²Þz!‰Ÿv±¢m.~ñÈYv'Xe¬Ñk’xÁ5b@¿½‚Ƕ"ß|KõfM¢Y,|–x£v‰Ðð6åt¬–ú“ðûb1hþh©kp=§ìºÝS”æü7 WL@ P˜04â¡éH­e,0Ž"HQ½XÖjޙ<Fö©KnÁ9"ù8)ÅZMzÜzWgÜþhjºÔ>ƒ#“³n&ª¦J•óP¶ºc¬å”zà ëÁÐʸ᥀´wt¡ž8?Í斿½>ÚV0§ãd ”Çþ\ØçhCVÒu_¡¡&ëýÅrT Uû=9‡6Û§ž@ŒFÎ^BFÚw6Ÿë¡ÊÛÓõ1ž÷1^Þ*lO~ÅÎÊS2œQÙl¿æ¼Õï@uÆ—Åç§UpmÍÄ+sõiÕá‰BaôF;áÃ|®mX…fp¨Ögd%q. “Ï$$ñ"°žh®ú§·Å 2Sò44‡hÿ™êãâÂï²[þ5|)h(ìÒ3cª&¸v…æãoõÐ°Úu²É’ +Õô_Â=ÐÒ`$š¶kA;@sÚDsE_Q ÿ³¾$Éc:&º(,ÚÙþÇá"™|a†uæüù°ì°ø¢QOBÄ<«ˆ4£j‚¡k'Ô«Êm¦ÿ"–¿á᫴ƃÉÓ @pj¡‰IŸA ëà»þiÐ5 -‡Ÿ,¨ýö´˜þOpDísòh…½˜U2%/¢dÂK§;oiÑ& D{±Lí“[E5ÓÀþ ¨¢nLmŠv \K¨´Q)Ü4yoˆalßêëÂü˜¹þ8x‚²"xÔu"öä0q‚!^’N߇‡h‡…X¢D÷Äç‡Bš¼Ì?¥=Z%ªªà9Jü!ª#ý§ùυڀ´FAŠ`îWþ Ž9{³ˆšF2M÷¨.•ˆIý Ã#jH_rŸtf™a§A,öT‚(zS‚Í<¸hlrÌ»Ö^…¸`¥ .U¸ð=›ÓQ„ïø¤ŠË]œŒ*¬Â¿B§*å  âûÌ4ÌíN€=š–É€ƒ~Ɇ/Ï@5Xð¯Ø¥§jªXڅ݄emÁ[p9Ô>´aö<ƒ]Áuƒ]ࢾƒcä*+œL  e††)`˜MŒ¡š I¡g +ÃR³I†² +é §ÉÃòÂNÙ&l’Mδ™\×ÜÄÂJ? ¢""à+iG²° =Ä*òã°—½WÁÕ o43Þò#(¨¡”kíðÂaþ–Üu‘T ¤ +P5à +4êñt‰£Ì1ƒçT,¡þ»I&2h) 2G»¼ E[К°Â‰O|ke@ÉGÎVè¢²»òæý€·8 —{û™5«©Ú`Ý¡…q¸×—ӐKã+Š¦!ÿüÊ ÓÀŒOL¬f˜dñv»HOנּ»©ßçn>C'õp5ö­©²Oy×EžÀùìÎ@š˜†‹9©·36‹³/é;|Î.øæ¢1Äô1 €@p^ +…3…çô¤t½ !´·½“/O•#€Aсµä;—^†K†J¿ 7tç_'²ÿ˜­x£'ÍЋ\p/ÝA„ØuãñÎþT'?¡\=ü­‚ÔyþáH»;ÉX›yh ¯™ÈcÌ–·sì8€âD¬µÝ¼‘÷>úòøœ–Œzځ&3ðýÄ],Ê}îß"ÞÞ"–#öšá-âŠ2±àcodSñ$ˆÑÆ+%{„¶É\MlF+tŸ÷º O:5£=íE?quWYP­ØS¤Y5ã`r”«^CË=ƒ†;a‹?ՠѺbÚ4¿7RÁmÒÀPS‡’{´µgµÄÊ[J'§ìM±ð«Æø¸ƒ]L½{¯Ñ€þ¡sèQøN5LJ‚¿PYâÿ© ¬p< ­Þ3óüYØ7•þáJ_7Fˆ¬w•µÁ†¡`½Íh ³:¬úà +Qôê”ýåË7hOP€A÷Iz ¯ÖxZ^œÓU°Þw%v^HH\|15¸x#Ñ]úIZ•1$P?.ÂJ‰â'‹ƒ‰æ¬·¦>g¹²‹?aùX˜/Ž¦G·HØè÷ëïRº@4íÈ ð¾~Ú ¸Íë¨ÀDÂí”æ/kòË\¡Š`O[ÿ¶Ú=€3q}7ÓĒ„#£$Ñ̃‰™H˜¿MÆ»1ÃðŠ˜Ú¾K‡Î³¦‰jÒו¸dåï4D ÊìGù˜þÄLøSJ wPѨLøå +Prk à]À»€q:¦Þÿ´-˜çÿ×À©°(G{½ —û“ǽåòP‚&/Âÿâù‚+Ý_ªböO„ˆGâXÇ¥’û}Ú#F>š1?¦pìI‡µ_­àÙ<à}j€´üVL~êHê€ï¦>uÉW]ñôc2ÿi«ç ™|qeB‡µÄkaqõcDP8Àºd/ ŸZèupâQ¢ñG¸4?Ž§ž¢q¡ø ï£FهþæÐhHÛ՘̅Dð}í¶¿ÛØjÚKvme¿„¾É°ÇÁµë¼åXÖªŸ8Ý õèaú‡¿IÏá2¦¢¿ ~Ðz‚XÏ?1ò<ÎÃ+5à6R*ätY™F ›D@iQŒ+€ BEÆ°ú[{B23žè¢Ú\¸99Ü4Pô³NOdûz¹‰O‘§¼u¸?ý ÚáŒýcЌÑõçÃ!œ®Ïæ;ïϤé#$&x/͌SU®•6ÈYµGîKÃ[õ*!gÄ~5]Žý\kKÉðE^`Þ "éIµóÄá°½Ê؀gt:ÞÄÖoáïLƒn§À•Oló4 +¸Öك¹@Uw¤‹.ðŒMÁÚGÃåékL¹½¸‹•i¬àŸá¶Ý›ìñýӑ´!š)Ëþ۝s2ÕۛÃYÄï?w·6%(eh±Ñæ¹ãuKÉ)»Ùgz]ˆ´g𥪧“¬€Pæ Sã%ïŽ +¡Ðg"Áã­D$ô%Iˆ 8DYÇٟð—ãwõÅ·±K70;hw˜1E0”A{ڐ7®GWú?™ONª~¸S)%/Ì _Y* zÃRþ}!¬VþüÔb¸å<ÒÍÁ¿UãïùÄÞïéá]EÝ|T;KØ.\›¢ùk&¡Ðj¸õñƒ2ª{™£Ä¦[¤%'*`ðLÀ:ÒՉ…>jÚkk4#70Aï]”â*Šo¨¾ô‰´éê´I-/ ຠfƒ,\àÀÕçpÛxuŽˆ™§¹ˆ%KJ1–KC µ8OÈ/¿Ÿi_6X|¥ãªE´Q Öµp¯Ô·}¤ÿ+9 ƒö¸Â4e¨gØÔàft›œÍù«q'U2ÓLnz×;îò oùbú¬£‹ª/q¯ªSıöùƑuˆ'KãtÑ2]–í›@ÉD>ŠrÁÎþÅn6†Â½ á®FCSàCaœ½µÌ^‚å{UW3'úMy'”#6e~ŸKÖËnò@”S +°1Ðã~Õ+¸Ób-ÕÔ¾ÕnS†é ފI¯¹ô¨b W¦Svä¾Ú_ø´ ‚H[ÊÊÏÛ曗Ê\<Ïg[:jõˆH”«gz˜­¸X8Û$Zñî.¡Û‚{Vl«u¥j›»kµ…ímÄ@^ºzBüè<I9$ž,LÁ)¿`yVÏXU‚ÄøB”¡\Íü¢á~ľôu$¾WûüY¢lƒ£KJ˜•Žp…âÌM¤©o´ví ¾`EB­:¨c™¯Õ4ÓT¶:K˜k®.c£?Ŋöm°Æ~ +¾&°cÕ¢fd±ùÝVSl\¯6†Ê`êþ6Ÿ«“ÕãTÂe +!…õ&¬aGÓ¸Ð`ÝǪž îú9t ‹`w'µB³!=x|nYžR}¬\—û³yú#© ˜Ðì^ó2spùïdE0ÁI QK䈉à™`S ;ø£¸‡ë“Á”;tC…‰$…Ñê0ÆÌ00µˆ@‰–W™Ð(žÁ° !É££X&ô°Èãñ™¨]èAzvÐé]filÅ7†9¥/Ÿ„5>$B}ŒŽ\ E#í1M]ºnԓÎZaØY™©:d5*¸T4&\ÎÈã„T`[ëVÈà +'# ”׺[¡D˜ùèŽmCMÛO}iG» ³Ý.<œƒFˆH0Côg"+´áèmø‹ÃՀ¢Äðtó@=ðbÓSºO‡Âøˆ¦ï‘Àï#2º[Û£h˜#õÉwûë±ßnëeiLwº¾4À§¿ðø¯a\pÿÌkA€~Ñ.¹= +ð˜û cICm« ±@a2KÇ8…jëfƒâkvYÕI»GºòzýN… læpÁÇÔaN°v±?\þ%™±#A2ÓrN'N·,Y 2xpÔ7<’`ÿ^>—z¼cV·õ!e“”Z$YÁ è‡"Ҟh6!t@@UË1þͦô«@>HTŽ“ƒ¼†€F=ÉïÇzFC¹w+?1ÂÙ*FklÆGÈÒĈ‚Ü£ü4eüP5‡ƒ&ñOùñÓhÊEàT‰ERà²mƧ¨G)¬³‚Òó¨Bä>ûOÊæÂÝAùy¦ ŠàgVPbdÆAÉwŠÅÐP¿‘¬èŸš‡ÄŸèG†•„iú©ä(¥ÇOUHmŸØfU§JÒ"}bÏl@ùÄ©9ÒH >1«ñqdYì[”4xºU'¡Ì©ªo&«†?¨ÉJ®qE&¶žÄ~†À™Ã¤î\©옿㝠+áZ›–CªÌ¤Ó«Ê!@'õT8'JèÀ¦%B™“‚¸žŠ Ê)s†œX©éÇ-,Faœ<ë»5ß´ÜÈNx“à*Ð#œÊDnMlA­J¾²…÷@“KÙÀ6„6V=҉bIV}°ä£Ý9°¡p¾9ÃÓî»Ù+Én:6®ä̃0ù¼i%‹&nò¤’«ñ‚JOyvJdQÄ ŽÜQ!J‰<’@Jœ$cb”RORAe\Á ‹Ì%J +º'µŒ ¥ŠP‚%”¥ò»µçLbã|Ò¬ÀÐÆæI+Â5ŒÂ_LÿœÎ϶JÈ5ÃI%± ŐBIÖõÉÄÓ$–PnÖr:Im‘¯H:iŠ†t)(#Q­Ë@‹=È"±¯†×A‘ÆėùT‰àÙL<:D¸vH®iƒ­ƒ‹Ï†¬|Á+„TtgxQ*SUŸóS²³£n¾«±<ÊTAM‚¸©H½‰ýÔ(y*ߙ@Þ•r G%–; +oj@vDž'ª#SÁ6FŽH¸ 33G^›l‘£Hø‡éYÖh/~ 1O†~Xp`ØTaÈxà¸~”Eçm¨ +½ëSbE—î/mó‘!”viÐý¥Cì‚C°kÔBÿcÆ´Ão@I¤Gæðæp ÀþÀý'•ð†‹ tpˆxF™˜ TÁÑeX l>% +%{;Ò¢Äcz1;°‰ä[œŒ²z$ÚDAêjø…G%,2%gûCÅI5€Œâı"œ¤­ŠY¨HºBoáhFˆ’MÉ8ÏPSAüÙ|?¤öyG´郛ÿ0.|ÔÂ>‘D“B~fI› +‰„ÚlŽ/üî”ÔË ¼òìs7cFtM¢Y„è£;n$Fqƒ@XôêB‚ (@ª.ôw©žHjúÉ 8O?4h7¨4§IÞc℟…ž˜põ©á.Å^8T×ÅJ7¤×x3ùTºÎ|5T=ØýE@Š†º¡.¾ ¨f¨páÂ&CïcUôÄÐgMƒ¡£3ïDžV}/Ä°T.ñ Ê.\T_FøúkSƒy2EWËIy o¤~Ðp² Ekr“×#)eóžíÛ²UÜ6¤ö¸…µ%³¤‡5zŽãæb³©ÊìhŸÀÙF’äÉY²,v‚802‘å¯u£HdˆkèÉíÉzÑN‹9<*5ü»7eђ»®œ?חC²édÍãH5#iÛðŠóQ'*-¶]dÏAEEí`hÕ œÛI^f’þð ”Cߝn°Ð;àÏÊ$eoIÑ>˜ñ ›¦õ€8Óÿ»CLy¤µ‚´Ssý¼`hǧ»š ŽÞ‘pŸ2ð­?¨8ÂÏÀûÌ ^Èó„\ƒ4c)¡•ý‚DÅȒ×ƹñpJÂzò¼À#fà4øx¥à¶ə¾4tó®zAÚešÁÙgs2A×2„»5t~ ¢ô»i‰ý“ñª„¶ý2~ï9[ŒD¯œ+¼wØþ“»¿¤|4u¯L”×ßýRœGÁTWÔäøl_R¯ āàîùæ9¤’"֛]KàÐI¯vLù=Â\ÝÍëðe‚ê‹& 2èÚß(äWú”|W3^<ô< Ô +ÏÖ©Z |{Ç;!ŽàÛ¯1„8òÄYLÍhì-?“¹dôméz µæ—Lê?4„—D9i˜?Åt + ó›Ug“¯ëlg ˜ý»/øpzÑ֟ŌL;±DáJ¶|³ +Yµzö²‘JS;"sLx,<Ì©(¯ÛŠ·óº4-‘OýÎà}Ó+•5M‚ِ@D’ +GMÛVlƒåBp¦ˆtˆ§ß}Äè*Jk3xÃ-ïú +%!ÍÄϟU)£y­K +M1nه oé–ʼnaX¿ú‚¾‰M$ücF3w1 +H:$àϵ4èc*GM.³!.n«êÓ{˜AÞ>A¢`­°¾y׺0*ïˆÑñ†î ½0à‰´àÂqt€€Kñ²xÄ£r¤žžÜ +>Í`l¾„ËØI ƒã6ð`BÀUœ[2ŽˆQ€:M@LZKu¬üÝÖc QÑuN_þ&¶ sE}nž™&ûÕk¡‚þ:Ukb.ïr%zd!tQcWñ²ÐfŒÑçÖ¤Žt ¨WÑëŠñ^´"UæÕµ ª)Ÿêâã;¹©R<"ce“3½`=ï½íòƒ¾~ï歔î,xg$¤¿<ÆÂÀ¤É)~#Ó[$Š€“0Ëv¼êðýH¾kŸÅ“³‚à»´ÝÕ³ {î„<ûÓ> :, þqIGoã_”RûPÞ®±’oFe£!•…ÉÍ.‘èú­ ‡ …n£swòªÿYI‹¸ ¹µ *˗ëËFJ n?qAXm¹Zöw1Dڊw½k}ä·iÌÏ¢˜xñò™ñ†Â¥2ýþ½gGžL¬Ë±eÎEﳈ†ÔÖÀ¶Q-ÇÞ’øŒ‘µ{þ¹æ¹‰ ýÚa~Öî9‚½ÿB.)ègø©û)n‹Åa5¸%KÀRsT~ô’ßêÄ'CÍ} ù®¶삏ô¦ð ©€­`ÂZˆ¤Ï÷"Iْ•"ÄÄd!_3$c73lt¿»¹—Ëݓ„ݦA ÈsyþÏ#bǝÁ瓘ƒ!0l¨@¼?ÈÈi U ꓈ÆAâb¼4ÙÏv4ÿ„4w·\#ÓLB 1Á²ÿRߋ¿ÂÞT1½6ÏX>ÊÀÆ0ýIR”̐PXÚRÈߥɎ€1aGÍ +"”\Ãë˜ È ÷ùfPqÏÎ ©bt˜6wC„D]È<ÛÍÈ^«¤A ~‰05~W9_¸V!þŸ¿×oRò¯êŸ²õïáðs‰›&ê«3Ŭ<±D;âk„ŽŠ>U ƒëЉ…Ö6YUÁ¡Fé än6ßÿ1ÈïÏ…$Œ‰xô£ç(ZÁ¸IÝ_ñߛ8.«ót´ûÒhëb»m´dŒFÞ<šñ<žhå͝O¯j»G¤“Aæ„OåÈ8X0*Ð¥ʂ¯àj‘Í,Rð}—‡‚™A#€¤†V€-¯œAƒ çb™ìZK†:«p€^R<…¢oˆMýð’˜MäÓkÜ.°/WAÓ×Éf¨°tÊñrxï|ÞãÙZî•W#^“û¾ÔPë{^îw÷ÙâØnƒg¸0¯T'8¡;!w‹AÁ ‚L"{'+­E§Éem<²L5}µ\͙ƒÐ U×öª8¶;SxÂòc³ÑjªY<ÍJ­+­¶ñËðՄ¿ö‡‹Wg‚Q*쨩‚->/xD÷ì"tn8eÝrÈj:²—ÄC‘¬³3’ùÃGV Å”}VOɒ±ílçØ°r†XÒ|gu=“͹eF6½31 Ñò“‹Âúã5¨ 30¡} +ÝaÖ|lÌ(d¨qV™:—XXÄJÎ⍑.)½Ë"d²´“ñg̱”òÛèÝæ‰À[ÐOå]R iT€kk‰Ã›Å/´ã­0vp=g¨´»åÀÏ5ÿÛrUû64Ýé¦æB[äѤ£HJëѶ½ž¡xÍäz»$‚3o(F óqþ¢‚N™9¡B¸Á·Š]®:vš”çÜÕÄÒ$«D•g72UǏBeŽË€÷Ð µrHh\?hÃíªe™œ@ +b3Mƛ8(a<ٌ¢‹·C¿à°œÜ–[¾+¬Ëô€0Õáx›“˜òñä<&=†X ?Úgkn¨E‡«Àp mDBÓRD‡1Ä&~Œ—þÎßÎë-ÉSÞÉÄÙmÖ&þ5tïŽY­Sp ø?>‘ÖÚMGˆíóqòD"vËÅpŒc¢ŽEÜú—$B¸åfÐäµiL¼™Úã7¬.™´oµ@XúîÓ +Sù>¡R…á[iê¦wošT`ãZ¯ì_`¥z ’šèÝ°éT“-Qó†Jy«·þ•Ö伍ÛÆÈŲ°b=PÇÒýDß >%Jݽ¦KçxÀyëÜ^â}€±#_a½5D2r·©WݸH‰[ùhA¸‹Þps¡ëÛEMP¹ò˜Öm(ú]zwS¹‰ôKSTm;UAeÒ!zÁš#Ó{GãYÏ9lŽôÞèÏ &[ñ×︒G[5ijgë¤:ki ÎÍtz“¡†StlXu2š±µö%FQªëÀ ¶äDT û&]ASÙY©_×x.¾¾ΖÖ6a¯Ûl¨…„´ì`€…®ÅTz±\÷U¢®op€¸µØ=&` +EKêdkG!V­]œ1+ZK9<˜¡ï5ˆ +{€5"­~&BÕ‚¢\ÂÅ&‡Ï怪's¬\´!rB5´qjñš™HIL-ï)uŒ@ã€íˆÎÚ¨cA¨‰²wو’P §꼕_ž‰.žÖ†nÕéú§‹;f´ƒbÁã{†Œ¢A@Þ2' R¦³a0u.#©¸¯÷aŠà8ÆIÞYRÔB3ÒÎ{FEÑêóÅßk-ðÌ1šèKFô2ì¡Úðf6ÜÃ6‚âܚ…¯g,P@zFˆßŒåé‘š#Ñ-×:»Põ¦FB¢™‡À_º5â Ð+ÁŒ é­uõE“I̛ꋁÓzà¦÷ži‡,´6ÒL„kpQF%ü­ÅóÃ|‚ÁI°­Ö±mq*iÖQ§sDû©OÉt ¥äeÁn¡bp\|¨ß÷õl3 ºƒ€ ‹V°´.ˆP`E%¹y­\šñ;PìJ×ÞÐÓjšvòq¿²Ð£Jf<,÷˜G®Ù@¶­SÍOº1‘ .Òù›&¹Pw¢€·f÷Bvw ó°®U)Gf]TQÎ+äïFyV¢Éc1Â]À€N]”¦ß°ÄËx-Ûª1» +8ÅdüÀ¼™P@UÝÀén,6Œ»;¹ü³BëÊk$HMîð(Qœ۩r0Úϼ€Ré›4¤ì€)zcJñk†ÃuNÉCžTSÙ´• +å=ª4 ü³f…8¹‡Îŏ±Áyꁭ‡,J·‹\ցhÓng6ï/AîÜA(A‰9Ê[ñ9PQC–“>M]txÏ[8]›ñ¦aã(bAÔkq/"JÐÐ6Y°’k¶ÂŒôƒ®ÉéeJ‰ëP +¿`wQo/UÅP +èékáҊ87[ËÛAqa´Šovžó ˆPT¥|•Wì&Qä™Á–/©ˆZ[Ù^‚¬¦{Èñ˜Ò\ÃL[¤|쵨ˆ‚4‹­Œ|â≟°“tÏ8墹{zK¿HB¶.°YtÐcñRØ +Ὰ¢¾†Ï+~ñ…ªeUcô¢á瀑Trú ›¶¡êh> ›18¼ñ>!þ¸óõ܍° ’œŽ°¢aüV!5‚;^u]tޞ+® ¢w0 ™QÑëD`ƒDf/¬Þ#@N7e³­=0ŠÝACûn8¬4-ϑcHn¶#kÀ +žª°4bÍƤn¤ébRc‡Q« §Ý}²@ÎÂû§‚«,E«¼7+•³×}ù€Gƒ‰f‡H½Œ5bs›RÑýwX÷V cémv£âˆDÞËH=·A‚‹:âéïd>¡’.ÝVüÍÝ&%L‘‡v'³âa’wÈO֒/˜¡{Ù,ˆ“SKñêB,ÃÚwüM[hð¹ON§Õ”Ÿ‰$MˆŸŒ$Ù%ªc¥qY² çc^À ²$ã{GGH[Ê_cOœ û `ã2§FYôl».¸Å#÷°wÆêW‹'ü1ÿOalÜB0Ú îW”eȋâˆe[b’’ %Œ­Oµ±¶//RL`¸ ¥Éþ—„×íÂ5:Ý^È46{!ûnጰܾÑ÷4U™/X¼äwïÙA¡|/yD,fRöWêȗMÈ¢ÎÝÏŋº@z*H-Å&¢™h±!€rÏc)3†åx.·Æˆ f£Ï鉎†}R[qÃ}î6ó‹{[ãuLsû•íÛ®ÑHF¾1F³+=Oo'4e`óغü·v¤02àÒ9d<¶++ƒ´@˜-3`qú;Ô½ö» +€‰#œÙnvV g6`  wö‘#KÛ*A•^FPI‹´y0Z<†Ö"ì[Üó0¶i굈ü1% LïF"·Dˆøïq¤Dm,zJi”¯©Øóªu™ü¿]‰:ËF%Tº‹¦]þ¥ H'BšaÁ¡_–VF”®£â_NbÊåV‘Þޛ±þ¦åUýÅw[Ñ!&ŽÕ0Ât>~U« ó*¾;±ìU +yóI2ù QŸÍ*zº?%ò(up…,ﺏ‚V1’Ë´F [uSx€‡f”gÅD“‰d#†ˆA‹5v¡f‹-Š¼lG±w +“ñ©Ãގnx5FjsUQ4 +ÌUN\¶f*cíV㍖´ >d’CR5ÇI[0Lc_ôÏöñëwõƒâÓnÄâÑIsÍÜNV'µ¶ÅÁN>¾ǑB£¼a¶ 8^ìj¶°6+Q“FÓy؂".:{ÀÁ QmÍJŒùV/Vš!@· å'Ê»‘ÄmÀ’—ß·¸Š:+œdâû¤˜º†;äñ¶ƒ$4dnÝ÷p¢™ïרnfïCžÝ쮯yoÖ~¦ÌÀð¼/wBÕ÷l›?¹šà+!<¿‘kâf¢B*S´¯Pzl³íPý9ô tÆÛ±ÉÅýª8º-ðKSúÌRžøêï-k†‡S»`G4üi•'/œ˜¹)5 &@*Ç:ÿSsnü±)Òp2Q”W|âE2oš\ïÄ# úw×áí†5£¡ŸáI²'Š¨O6åä܃¾Ûr:&7Œ'pR¡íÄ[žó¾'©B}]ru¸qĶYQ;%¬g{èÅ)0éÚüßô5ºΠªý: 8m¬ÁMØQ L8ÿg¿£ÙvŠNmcÜÁ.º©­ìvè55 +lw}Ž4•kÎ`õÖá9Jg©ú¬‰܋uxÕ«ÃàÇ?Ì­ž§L¬:3‚~¢ªS 5úy8ƒ©Šú©Ùä¥Î!™êne½¼û‰ÈŸPW™RaAÿXÊc1ùé"`áx>$l!]¾¶æ<ëS…/c„ o£[ÒßM,šáf–æ”:L-º\„èr“Rkô•¡V>b×®Ë8íм +¸(±T†Þ©§RŒÂ?ƒ3á²t½Ã¡Ðådè¿°Œè*˜W‡žMç(s\Œœ9eâåȕ¹VÚmî +‘È*+¢5|KÀw$8ԇgùÈ"w‡³MAÎFEŠ·ñÿgf£.‰Hې)=f7¬ȬÀÓùTlS°Ùˆ´Gˆ ±DΞ+‰j¼ÑiÓÓ¤[ðñ çØ;Ÿy˜?$¢”mf} âƒl8¯Í&> ŽÂ8ZԂ›€Ý\ÌoMÙÙf­¾®÷AÌd#ƒa:u¦†4_ nj”‹Æ gYB…‹O:*L¦Ëtf/6I8¬¦’ïØÕ/¿å›)MÒGԕá®xûäVˆÎ6'€‹Âì•8§ÏJ +¶óE¡pÀÇ4É÷ZíÓ¦CÞÿ)za`’™P´aß4ÐÙÁûÑø ·G^˜ŒS' BÒXšÉôp­êb“¦[Ã4F\N-XTÆS³Oʶ)6Ê/#_Ñ¡Ð8 ŒA}¢Kyw«œôn牁›7«Ç Xà|ƒ€owˆ*f +XÐ`e}¡“ÔÅ7ñô"">hÏä02览×E0½BÌ^ +Ç¥ˆÊ‰u\&Ýf°+ f!Þ§ž¯ÏS^v6"ûº"(À–EŒ½—õÎÄ«$>Z­±’' +åê¥d‰Í†€Æê° $™›äeÃ!V…tæÄ.§³3ˆ—®¡@e=‘ Îäá¼jhÒÒ,ML”÷*-܃šW*Ԋfä*ÑÇí’æõ©t9R”Ë4ÂÝLEuêduÌÂ}’5 8£ 0"òfú r@‘¹Y&D`֝Àøxá‚lM„­§Ssõ7-åÀÊ?ìYkH%(ë&šµÆï*Uò]“®®ÝŠÑô;ÇÛzOÈSŸ¥1ë2úyÿ `Aã ¤@\sÏ7d½ùõ¤0í%§·é2)þ'ìˆävvßÒéÛÎú×@IâU¡€Ã½êO>®„?ÝdLÙªGC½Žap­ÖgÀ71SˆC2a>-pì(=6À×wON_M-öw9•ßAŞúöF)ŠáV’Ç”Ì~0©HP G¼Õ-MÇ ÛØÁ°¹WZæ%;T<‰‡Žy–DÆWВºGÓy¼-“usn{M;Ìڞ í Î6°'$xV ŽÌÚÉ¢ jsÎ`iûª¼‰ÂmjÔ©ƒ) ^ÐZÃÎÞò±)BcvŽTIÙ`òdçT«±§éh‚‘  ,Z¨ÍÊ'kؔ2akÙ¢C¢µ_Ê@Öo¬'Þ£«›iV›Bý©ªW  úƒÓÔ¬«ŠRÃÂì"DMê‡MÊ"@ºmû=͏+9Wv BÓ[¯-<×,׎<^ÞY³ÈI±ÈzTŒx +MשĂàaVIŽ¯ ŒÍ$t—ïÜ8ÃV-qk Tä¼6Ïw‹óZb£f§2uGßX*¡Ì¾ŽxÑã¨üé)]pY$y(7V±|'ûÂЛ \wD{ZÐÚGbt7¹þ³=¼SDÄdk†2&„98åç4}…–WÒï:…ºè{ƒ¾|.ÃIWØË锕ï9s”¢ì¥¡6Ü/8ƒ³§d‡-Úÿän…WOè¨Ç©.cž‰fmõìÒð5|ÌNö‘_%é‘Ù zôü: ×~TrMN_òÛdmVT¦Äâö³çTÁêòñ2røÕÞ® ´Íô!Y2¾&M[(_I&Š@îw®j0 ?€kš&@=÷®:ÞÓâLØx@c]EOLñ©¬úEÕq…½R4ŠND*Dåi²äZ'ÀqfžÒÍ÷R•­u’F÷Äþ½› Âő®”P^ËãLzxFv'YdµýÓ¦’VP:‹p¿œŠÑæ†dƒ^9 ½Ù$PpÑ<=N˜ Ðiï³îRÌmøß$I”¹¢gf)lè]Jæèâoå Ç;ä‹<¥§Lq›F'T "¶Û…cnÙh¯Í°—P#nÊÛA§`tˆ)ÌГ>ãl\v+ŒM†òUÙw¿cì`¸"™!„ôXÐôw[s‘å\Ÿ™E1@ +®½´ §ãm¤þù¡XoÃ÷¼²)öþ‘A†A+™MÞæÓ§èiô¦PÇ´ˆìr“×ýž°e Pr;/aBoÙÞ±åXä2yIv&$B½QÊ;nomEB¬=!¶­°dàÉX3Jʀ}p…PlÑõR̓da†‰ëV÷‡ªtJ$tC V„xOÇ L}±/Âòt"³\aâ$MED/ÄbzŸ¹Ã¬u„hÂa +Ë©lkd}âÍymŒ=©ãØ:«][~Ãö ´Âîú¥ +Œ:ܸ‡t$Q:•yÛ\\۝¡já€Ú¬“«Fž˜'žþ:ó(}¢Šë¡_þ³[8J¼‡Y5»äű*Rœ9lT!ÛQçöJ³ýuö [U h¤8¾Ïh d|‡‡˜*ñ¹snáu†¢¥jõðtšÎQ5h9]§ï¾íS®ŠxÊQgšÎçí=㯲5ýî¥ÍcT=*–žÌÓTƒkhρØa&ûƒlO)!*°ë~¨ZOxªyIÊö© ¸3­ušÖ{j»Ù£H–ÚöS?ß©[]`ÒR¨]ž…¨ðèԅÿ´A_ê¼µŧêyêùžéI,5و˜ßžrA,z'eÓB×ÿ ‰¢h‡ÈKIÁ×¥É&ed¤õl/¿S2ëNË%±V6 •fë]/ªšpu:x¸}j:…ˆ%¯i¥¡èe¥!š[ù9™`ãîŒè 8zÍij +Š-§äi‰›¢5Ñ+BY˜ùÛƨûGæ2ßc¬+3uÖFNÕmj´Fx;F¦ÉkS"0%3՘užÒcKӞٹ;¶ýˆÓš*yîr/ÞÚ®Ï_M%X§ÚßR•ú½‰‘›]?wwøÓi„GÓXmÁABStZîËƹ#œãô™òÊòuýé´Ru¦á ÀMÆfŠéFn!_§¹L+(0\WøN¥á+3ĆÃLLë鳃¯¸¥Õ¢ý÷ ±¡ >ò~n8ü6÷-ƈF×`z,¨×¾þQ^aHܲx` +øYÙ@,Uˆ&Eºy²ÈNÌ 6v¶‡¬å)ÅíôÂ%fé-W“¢?†ƒ7ÒÒÚÝѾ¨h*'p–R/Â>SœÉ‚LW¼(íÑ]ý{êœW +ÒGPŸ4~(–%ð¯Ú'+­ŠºZ¡Ð4wNgR´ +µÄT ‰.‘We÷”¦L6M)áððlÞ£YàD)FÊÄF¸&¥DaÃQZm…ý`E£¢_”ö­7ÈѝÏHàÿêêæûÇVlJ©¯‡s¢š”ÇuŒ*€@€-&•Û´Ò̒£ ÈƬz}IÕ²\IÓw§w¼Ýâò¨¤øÌ(_’jÚ¶PÞ'é†ÈG”oYŠŸZ?:Òùþ°¤Ãz¢„.Âl¤@1]Zó‰9äàd3RDëÀ  +<¸o˜ȰÁ.RÌdRK9W2ÞDŠ\@HË.Žkdµ_èªÍÜ ¥¥Úékqžé uÑÜGõ8: %t`Dö\Éù¬À ÓyT“UÓx³:Ú«([}vÌ´?§¦¿£î“¬uÖ;…°¤ù@úpHÀþˆXð*¿"¾ŽöðøxN¹ÎFÝ OÍIuœ#êü¦[@¼¬™EtHAÖêõ¿‰(®îíÌOg¡äÍÅÝc){éCkF D ?¡èè0Š$ÒâÈç1úÿ6xO|º†grQÛ"“zõZxÏq@’[GÛOf¹¤i õŽOGt¸]E‰p ò¬¢q”>Þ1O¯ +Úk*š,¸øCAž>íNQ›€+ƒwô<Ú^Šrâ­ÿ%P´ü…ê\¢< Lғü]í$z(øÀr7!AdƩᚸHTž£yÒÕmCU‹) }BžŠè%Šß>Å­Œû‡¨†kΣ[¦ÓB„®y !Ç(ÔJpíÚO ¸Rª ¦q²ž®z{(†Æà€‹<´<¸~ªP0áü­u(‡ô‹:ÔCÄ4‡hUdŠÒ¨ ¢5™®W$ôJ¨Y{‡¡C'¿/t5)ía¦“Lp‘¯ ª6h=ŠÀ:ù¤¢1R…kÚi ®têȶaÁw + UiB+ý hŽa³A" …ˆÝxEÿÎÓ)Ì¡n&WÏypÃR„"ß+EKJoP†ã&–:ßèhf)±M8•ŸAõ¥äôï²y¡ËêTo·YÅÓËG ý«s4õ7-ÿ;D ZaG EéLø·0bµ*ÚCψ”ß–DÍd9*ìaœ ~Æ°æ5á á­,ÆêÕÀ­¥'éÅé$øÄS_¤&DúPHkM]¾¨±æ·RÖë´«^@ћ¢óŽª2Bçڌ‚IŠ·í”îQáÚè¨èÈà† +LØãc“.ýç|@sÿƒ fA +R„™T8*´—‹HÔæq§¨¶U­Lž(,¦Ó·àxfî ¯–RnO¼‘¥*§–¡„²ò$ <ÏÚNDÑFz-K+ÂìIs«iÀp+&bÏÖQ Q¤²¥§ÖÁC¢mž|Õ±€Ñ“N ={œäÁϵÜt։Ò'Г%g•ÔÜæ‰&⛽ZÃd—':œÐ*Œøœ/ãÖôn:hÜñÚ¹VÈßÍÏ[ç@•ÇàO)ð«AKr§pô¼ð̄¦Ì0;IõyD«ð+&G îÄéFÌLÔwCÁdÝÉ%±ðϝ×t²ná"ʆ{mp_b‚§ßKæØ6! +½B–tî-Äbg Ø1f/;…Ž P̋›]‘íæ~£Æ£%Ô¾¦€Q×}Œ3?ä8qÞÚÀf*¾§8‰¬ÓÖ¯µ&’ZmïêŒl¤¦ª“zàÙ©Sr ·û¤Ù“WŒ ¾É‡@ÀËn—Ï[L ×-“I¦$eJF‚°õæÄè@ø é +ÍÐ|N|†ˆBEœ’y"¬m‚zA"š•œ‰ÂÅ®:2,OŽºF,îU­ŠÉëe›~c©W$ٝìÅÚˏI;#zé ÆV«.f4R߆"¤8ªó4oBE}‘ü§\AQ#“ùՑFpӏL\hyD– èìþô¿¦)ÅÝ9ïÛ­ E %*Eç72T“u‹硔ü0·Þ‹)ò¢Â +$ö„ä'‰™EÑx[(1R ãb&8¾PÃǘ‡2~Z¿ˆb…1ß }±¢™ræâSõ´ªœ«Y;œ…}î¾."EÇCžr•ôÝÍ©"åÛ¸µ§«ž2V$"›)9ùÑê/|ñ,ÄzðUxwM3V;¨ MXŠªBmЫjZÔá‹#„(:#Ur)RHѐqfš¼Á›çšx¬Îà4Dj©:Jt†MñbHQdz.Õ¡™+뼺ÑL6iP=ö©I”%òG6¿Éµ(‘»aF$iòêÀ¥©îC–±f´aȋ‰)™Ÿ WX14%Ÿ+$—T!ŽÉ´O1!•U±j~[W„Wrš.hÂSƒØJ™Z¹86dì“t¯Qh8³ñBd…Ñ‚ymNI@^™Pp#Ÿ>§‚/¨`7JçƒÍ^™¥V{P¯ËD¾~_ ù˜R>"QãcŒiDWˆŠ{QB†'"ÕÖpöþjIÍ>xM[“D½6ańiøãAÍ[â°Ô„…`dºIÜðɈ‰83kfèTt£Ò~‹œ„ ^‘1Da!F”|+óc¨fšQF.cŽgdgÏþÈVöI¨òy|L±ycPdØê¡~„ttºgiÙ¸®OÄf±HçxaÉé_Ô#ÞÀ›»ˆq0èý *kÌ+Çz‘ÊÃ^ÌȌ·7HÝÅÇí,œµÅ©æT·D<8ƒAñ̸Q²*"ÿÁ…xÑ:K+JÄ *™ÍëáØ öÈéyU‰6¶Å³‘ c¦e?¦XIȌÆÆƳE㩟,¢Á-"ÿÙâk0šTçT×vQ—¸d­rœ=.¾=ÍH™ºÃâ«Q^¦iD§Åªè¼ –ÁdÿEVMé&È3âk›.Q©Ò«yâ+"\åŒJ–Òž0ªÄRCªƒ"”*A's.ĈÊÌR4ÛÄH–loQEM´2nÈD"þ»¾–ëi$󢧲ÆÔD–üsŠF2͕µ"ΕBœ)WªçH=("(È%aú (5Ã.\ãàñ ^•¬qéˆTsú‚ƒMg×ÕQýbPÓaDKŠBâeĜ®¨©ÏbhL‹Š{ڞñƒT0ȏm +™ÌZiê84á5DÆëpib—B†-–´¯¸E*—Z=h•Q4D“ùgœˆ‰`Äá=!™Ð©¡°þÁ¢îÈ µIÎêÔ1 +Á€´IóÆ ¨V#} 7w‘\žŠmãõ±­—Ý… g²¦4M„H4©õŸƒ&ôâ±X K3Ÿ±œ_ëׇF´I„TE²:ÅkÆèñˆ(.jª8ðd´‘Ÿ«™‡d$yQíñ’ÑHC(>ØÏ +å$2ê …¤.ßæuœ$F^ZRäÒè]‘ …P˜;È”´-RoSSTlŠ«S–I½§1GR±¼Vrš *“p +zŒLSéÆ{[ô²‰1Rm uP‰ ™—”Å€ÞQDH¤ÜÑ; •dQÄâXc4à|@1©SÉþLMÄÀ%­ÔDA¯‰Z1D‰Áƒd¦Uç +Á0>áAÕ¬¤_(ðDÔ Ù²uñGÊ8¾U.6jMGX^t¢_­ÕÑLõµ‘u„ŽÞY¾ù¸/Ùl[ØHf쇗 )’)¹H®J0FæTbÐfؐ3hÂl¥¾ªÁ÷’ØbBð€Kv(ÌHÄi¤"êS$Ìã$½ŒçÂ,™“‘df\!¢Œ\ø ¶GÕ}᪙ÈS]©èãÖI\¯ˆQMŒ94Ñz§<‚Á¥**jX\È6ÄýÄ]¸‹ˆÆm æÐ$¢‰0þ0¦b*R™ø!ñD„ö„U•ì%Š§‹2e6ãM Õωª)k³úÁHß?4%$SäҊ:ë4Ì/ÑæT<”šB§2qƒºÔŸbÝ`î™yÌ»ËÀ#ŠÝ1&¤dҊ 27Ž¬6z Ùµñ|@|ŒgRÄqWƒÕh3!+oçR4ãOÇzIˆ51 i ’J”£¶Õ®ŠØclÓU#l|b±Ñ!Hý‘C/ ì^„\ßc˜ß'œ©LzÌè¤ãÆ,Y3ùyXä—X„·²èðöO™åˆ_þ *Nj­*b¶K]2BãHÉC¦á]F1q¡qu´Îxé) W0‰} µ¡F0xñ¬ «âx ÕWÕ¸ã;5EÂ@¬£^î‚`@3³=)‘Š Qí5Oæ"Õ 9OÆEcˆF2ã(¢L<ŸŽ HM\*¬TTóçaJ8ä\ƒ„Êá¤:…À‰ nJމl¢žSªˆ´æ;ãL(¤mRJ%|h `¾EÉøئÕ2æ—lw@oR¸h™ðk¢ÈB¢On®VƒÔÚ )§‘àP‚`om§*¯–ÚÍäcN°Vuùvš*>^Žà .ÓÜO±ÙN²6ÈÀ"ëEEâi:¢ŠËÉîÃ#e¿¶HHÌ'üÒº?EôÖd?B~yи„J%ok3gÊt–€ÚòG#P6Í´£E¨Ò1¢4SÅj×<Ña`hàÚá—u+Ü4‡ÅyÆ3‘4Æe’òN)uú_ÂÖX‘Pxzõ”É’ ÚãPTiÐ"ÂF©F0ØTGnûˆdx"Lq+ZîxDƒY¼ö…ãŽÁf!¢ äi’!=Æ5cê©._L‡&ò¾Ôɏx(t‰ÆnŠVTc:·TWÔ,¬pí£Ý>ê÷78ÿ±D¤!¦,C݂S!Ê8äðÈ*Š‹q| Š”Hx;kþMÝTyŒUˆœ= ý/‹³œ8ñ–ÚÿÄ èù„2³D«,4¤¡×¬8«Sˆ:Ò²,GfDØC ú¯ÅŠÞõwC!‰ +‰·§ÇRŸ¡hÉPÔ£.ó4æë•2KsúD롯e„[Š2¯føɐ=‘(’}y•%4C0’Ä!KÛMä[I„Bª” µiˆÄSô‚z¶\CÛMòšš&4ÁSŸ—Ì£qÄ«ÜÚ¡r X®¼‘Ù吴/˯6„e]ä51s(Ÿ¢sÕ Eý|»Õ†`@!úSE²D•ƒ*S•”ÖÖÌǟ`PãMÏ(GS—S$"H!£ˆ RŒù‡@®‚⌳à(Œ 6™T«^ègœ‘Õ  © ¾‚(ÅÇŸOJÖÄpð_¦‚Þ<+¢ ¦)KbäIe^T0$U' ÅU?M¹AFs¾%%ƒÜÒJJˆj"è¨ÍM±Úz 9N11aϛ óZř*“\Sýi,Mí=3©cÓœ* UŸ¢÷šãáWÌ'­ùÄ!\ә§$hT£ÍGfV”2è72‚›+TTþ+{Ǫ®e¸IMK¦Wð4yW‹„—Êt;µaX¸‘QɕŸrÈUÙ‘ê9uŒ>PÇk*ÍÌJXÇL´¦êà&‚F0‰ÐAÃÅØ4AY98¡éw …‹Î‹d&ÌÚ +7 +ÑڜºO¸á²ëÉ%§ZØ»ƒH›KG‘žWy®9L5Ë} +Õ㬩:ûÔÐ9dD°($#.N.)ß7UQ ÖÕ¸Šª˜’šzÆl܊pÉVÙß9Ó +©¦¢3©æDùyK êÌ4$EUò /a©ü…F4¡«üƒ-^Ämø…3t½8¤ƒ"A¼+xLu'˜Æ»F$&VˆLg<3O‘«ß=ô1ɪÙãéªM©„lÄbý’|"N¶Ô:®°™éDÍfî ¥Y£„µ›£jÆ*%t +C"*iXY¥«Ԙ¨!aÕº^ºRK¨È/Þ}5Œ`•ëaV¦†„ÜqcŠ(‡ô¬`k4Ù7CœŠ1Èðõb+¹þó;Í[áüp¥ñ(AcY_³jcغPbªFzš_š!N":Œ¢@òâ/‘·d¨¨Â=ü%ÌÊ£r­¨åè‚Ê:7†«¥}ž¡¸*Âe¦D‰Š‘)v#—‰&VÎÔWŒÇ™çÔ3q‰±d:‹b‡–JÑ6®S"Q^ jhä'ùHÌäp°,‚âRÇÆETsÙÐ5ŽÍgê3N§yæaLyQP9"›rŒúë÷‹x1lQ©5üö¦ž™„ GyJ‰DÙB1”–«§~Ö&ˆü$ôïZ)Øà¢iD˜‚~wîRڐ1*¡l‘%V›”êò+Ac +“·Ô0ØÇ/2ÁŽî‰W óOlA³\EéªP.˜$›"± eäˆòÉ7äªx3äc¯;²®iCñÍÓÇبü¡i‘é›íLH˜Øôeær) ӘŽà¤ã …Éݪ™&bJZ²K‰Lç3ˆ°HödÚÁø½Ð›X S<ˆ”¢êò"/„è3¨®UpUhV«&Śƒ…ýÈÈ9ËTÑçd0Ô:T3ó`‰M­d ™›ˆâÂêôی/ÍÉFFÚî!f"b‚ $•˜:m•Ä㌆qjü¯¸Jz†K¢šIÅi•öÁ›f2)ý,s/;B®ŽF,÷HH¼Ö¨å¾ÄÌ֝ÈJ‘bkÊ¢© WȦ#²*EÓÖÂF—Uf6—*ŒP< KŒºÎsYØ,Šƒê©DŒ˜H y&\ˆjÄЈûÄ5óRyÒjBñÓæ C¿DªÍ”&Â5Sgið ¹Cºø!$¤‚È›ŠGÆsH‘64ÞÌהç4A–„,Xëà°"Ññm'•ˆ¯í—*ªé4ȦÏTzSÔIŽ„ßpQE‰ …‡øÑ´‘S…dŠíúB‹Nüj:ÞHIzš3›ªŠrŒU'‰™Æ¬Œ¨K +¢k…ÀéYTQPˆÅ¤Ðe4ôf¢@ž¶¤ÔâGS +é<ĐùLIgãzŸ1„ñ*ÏÄÄ뭐”T©ËHÈê÷îŽ%õ ~ÜyÇpŒœÈwgÈÿâ-•ä ¶3}P>͉OK®=¡ä‡¥ÀQC‘ΓyÄg´~„èiÙ¡¦¤’ÏR«N„0ÔÌÄǹ¢„1Ž +Ÿ¸Lû—ßÎøZÊ3 OÕËCQûPø5vÔ/óoMPÍHËàîP™„‚´KȄRäëø¨K %´ l—°äÆf$ãXÍ&><=Ç,1ÕìR²ð©G„А|t{8"9krÿ~2hí)ʃ°”šC¤1sÓÉXÕÌ£õ‹+e7Œ|&Ð@A½Èy‰SêK«m8áBÑ¡}>1z-}¨mcŽ|ªœfHb\PT âïåFÔY¡ å5‘ éõ(#!a'4~ Ò<Ãk3d®(“ÌØõN̯ìT*P+³’63A¦¢¢^lÈÉ¢r}à>!³ªo­ ™“ª›_B‘jõ’’›fªjQ½ëµˆg˜ˆcdŽ¨ÊÔ結xHaγH„%W&”3öГ/‰p¼áêp7¬9íŽhB±+ wo–цª`.Ÿú£Úa¤‹Qµ"Â?Ӎ䜿‚mð龚ðùCf?Õ¸Rõ8O;D§p¡¡Åș1dœw՘8K$r‰-¦E­ªê;E.i-j‘sWyä›(mÖ\j5¾!É*(th}ÀP >/¦B·k\Â1ïË$|aDDÝú*=µ&¡À¯‚¨R‰èOjuUŠEªA +r ƒ¦æ#¹Ñ­±ÚS¢’P9ýڅ°æ¸:Åï23 å$æâ 0´•fEÓ¡`ƒÕyæVˆ.(ª¤6ö5?ë¾YÃ1„ ­ö·ÕVQ×W©2ø€é­1qŸšmÂ4´…EH9òЂÚQ|Ib{!‘Ë1GMœS݌tº=zé¬è£ˆaJ贐½ÏÑ\¨Ú"-ŠATUäκ—ÒrÖ(˜¥zM/ú¬vÅIùCR 4åò8‘$(ôQôeMKSýTÒ§ O¼BƑ¡úäCԒTSaŔÑKu*ª¡ŽM O=2T5¼DrŠÎƒSS›zi¹y>1:-¨J²pʚ$T®Q˜ÙÓvèUOLŒxbÆDÌÄ4F°AáiYS/1]2ÅÒ:úΡ úœÖòÞ1ÕKÛ¢žV‹¡Z¦Š¸åˆšÆ(©[ 3ûÄ0cM”Ù·ˆ¨¡À±‹¥©?U^~U5Vd“æ¡¢´Êñ…:Rœ +‘­Ãÿå"«`Fj-隆\ãÁæÒF•HyˆâÁ·BZ 7´sü‘Þ¨1¦@XÙkÂ:Ó¹„82öÂ#ŸÈ‰p=ûŒœSP1µj·r¥À Õ&’K Þõ +®óZ®_NxÈ´fÑj0ˆ² ’¨ª‘‘€K&D¢Ä –H±4m½á6Š»V‰X5Uò`‘û¶ú—êàhTŒ&Z{òÇ+g]¤B…= +šâ…TÚwªmܵ&Ê£S^ßy_¥Ô€”|b“â$ÐÐÄz»ÑÄÌaV!˜£H¾ËC´S½D ©NLE‘ªBÏñah/PûdÿçØ{Ö6Ò +¡xkT†¨² œ§J¤uéŒAXžÏÙj¢‚÷D×EÍ9n=âCºØH¤“׫ÄQôD0•˜¤8S£ô#C¯ðuØW6[°2croTqB“Dõ÷,Ix¤mä✾oÔ8MÃxO] ¿¹Ð¥¢‚¨â¤ŒÐW!øˊÌº"SDLQHS¾È%¤“RE áHÕ¢a¬Ä$:E‘´ãË£ŽÈ•«ªŸ‡ÎGŒ­Ruˆ¬´²*ŒÇéC1³ºž$F#õ²@Ý Xþ8¸¦VÉRÅ ¶Õã“ÿŠ*ªÔT1" +ùʛ;tß5d©wpz”éAGùžÑóxÚM¼Ô¦åLK^U‹™4pöˆ^(ãØ_M¦"ºa™?â4´ÑŠVš¨ö?jÜYãCÖéÎ7ȟF¼%â%ęÕi©>ÏIeŠ’>H2…päÊà%Ǥ#Í2AušQìæšQ§9ÉHB/*S¾ÔÄj/m(‹ÇêfP¥‡‹2êDÔÈ\eñûqD›®!×2AJ˜›54a$zPi)Ã/èÿ3  g85#ZÙÕUŸIà )3:e'Rñ:_höVþfþ›N%•xhNrsHB!d¤«#*‰£¢CHEŒE^ÕÇÌÐ$3ºÔYƒ:eDoŒ É$byBpñ ‡©QDu²Pµ&yÑDuÿýM÷بÎâºIèy"F$² Éõ ƌÿ­ÚqŨԖ‰Šˆ*dKwfã¹Â©ùJôƒŒi«î֑’›si“ KfŠê‹8+ä§2‡MmÄ[oEƒ$KæžÍ%\¹Xåâ¢)&6“Çt·J¢ÆÈÈÇbþrFÂtR7Éo†âÖÃÏ¡¯Þ K¨Ïïz$M'L‰8=EB­¦õ?•9¹³Z,1Քk"F“Hîmõà/Ua3 ¡Ku¾¡FGžKÞK•…¢fˆ/Ñbî)M•H U/RLö©ŽGˆÕßäÖØ4Ã"Ûbü"Q -*dB3r…!V¯mf:ÕªðÅâïÕYMUxÑxRî^Iº>F +4ÄJGBªc Š¾ŠþÛs¡Ò2”¢“^Þ*äE5l!ä³æ@oû ‰~תÊò1¼(%Áóªî†1z·Ö{99š+Û¬#‰Ìf›’`—H?œá7C¢9Jèä"«ˆæ/ô…i.­ªGˆ…yUx—‰íŠ2•¨6‰î¯sÒHc¦S §ÿÖ5û¥×H(Ÿ±]%^•D,ÑûÄp3E ËìŸnTAŸ¢¨ +Y{$Tm¥zü½ò¸™V¬1£%1'çë¤]1 ®ÂöˆC׸‘aˆ»œeb>š+­K't{P¦,…ÎÐÆ:ɄØ}E‚µ/èÑE +8 Awo–]!|ðPXÔG¼­Õ9÷G“‘ù´"Î֖*9â l~‰žÂ#¡”?¯¨äGÅtjê“T’ÏeŠŠÏ:O˜/ÎÉì\•xìì}&èc9dNWє"t»ŸGh¨J:†ùÂc†®¢qQtŸß²”‹åÖ¿›<¡•U 2$"4+¹¶\ ¬<0ÝÍ)R(4~†KÂR!Eš‘.ü£¡Ì}•ŒjÈ­Uo¶˜ßð¬ÑyÌ»ñKV”'™‡Ôˆ^r¢?B±WíFMuÝWMË[ö¾ŸO¾ þg÷iÚ+$^ÛCŧî‡{öZ­h¾Â«öŠÐÆhu2Ñ¶!Ýe"jevK¨$œšÅ\œ}âgЂBrb6 Æ)(¦Ïi [Ròpõ®ÎÂïëfk‹ÎDQ½a¢zp·œD&=­›î?Ë!ª%²3¾¥]X·~#D©ò;‘ ýR5“G–hÀ @`ˆÀp +$@xà @`¨ÀP€Êt6LA´¸×Yx$ZÓ +‹™yV1bqw¨aø)_Ò:ˆí²¤è™ cFM ©‘éé;όE¹ 5µK£HÔ§!´ª—„%æKý Ób¢ì1ÁÀ”>‚>E©XUjŒ„ÇGȳ_=Ĉûr÷RUÿì¦ZͼJ¾7TôTM­ôNê† òC›*AdmG|n»Š&ÄĞüðª(dB×?fE쥆²-Òß1m*âYååâLˆ8I‰;Æ¢ìؙ4ñ•%tQ4?îq5øÓht*‰Ú(á7¶2$qzØé$ ßâèv™FÁÆH΄Œ… ªä?•ÔDPë37w¢bÄMäu4Êc" ·©›V²Ï2$=Áçó-R5\„}W=„UVå5©Kj~_‚D‚¬š‚s +¬çl‘‹îµŽOÂöE+ìÌL‹¸\Ž–E—©9 ;nU¾ÃVáúaí­-lk)Ã%Ûþ¡c!ØO¬ "íqŠéUR¤iÜVž¡QŪ|E%o¸j­{¦¡Ÿ„Œ+-¾5´! ®‘9‘îŠyLè&DA#¡}QÄB‡þŸ’ZÅ»O”‡‚br~t2SùñEð¹ÕÔ~'œÞ *Ékˆa§Õž[hQ&ªYLÐT?C[®Òñ×R†[Es*ñ„©D&µê’&#̓cµ¶}ÆòÅ܍Ô—ðC#‡HRK*8‹hc)üPKФš”"=z$³jõT$óp¸Kn㩋Í.ÓSµ'>¦MÃIU.²Êì­Kh«ÖxÐ;»>A¢øF1%#¾çNaãbÝCŸp=NA1Üô_ΊDDlùJTg2ԓ1>Pñðš£"ž7¢a¯uZ¤”Æî4£ @35ÒVZºØ4¿³·Ï©dKi±é3ªÖùT93Š òeø7¾i"5sۏ9/¡ÕHT=Š‹ò«^ó©R”›v1d^f}ÍPÐDí +g”—p'ª4¶»‡b¶Z͎Œ‚žÉ9^ÑÙFGÄ:þt4§Ùé@ŠpPÚOãOVǺòïRÄaΫ‹Ö„/­­(úgŸ°cce£SÐ]²‹ù[«×Ž­L2ªa(F&ސ—rsré<±a/!S¢’?·ƒâ ¹×Ê©D–STÜ[¬¡.¢D¦¤¨#†L°I\$žEµu'Â±l¨š)Žqûe#Ù05úiêßQ`2_1¡ü-Aõ©J§øù‘Cš‹t;ÁÅÆEñMdQ±ËJë‹bØÍ´¤—Á*ù"TEdÅU䣠ÖêDêH,Åþ&Jè• VÐHÜrú‹%ˌ‚44‘Ga*jD½äÂuÅÕ'â~dQ¦ç^ISŽ¨ +Ûëô©âª*<áД!?Ō†Ê¡ËQ¿&´U¶(^C³;L1ÎgzK–O1湿MÔª1u“øjHðE ê&Béô›fõ¨è;qè¥RӗÕK¤xƒe\–’©…ó`§F“rˆ‰f¤ð£¶ÈÇZߐ­õ +ÕˆêžàËE¥Î¿ A$%1¬’‹<äM"¼bÖ/¦÷nHóÌe)bË»\ª²(Ðj±4‚ûøSÌ#¯0G˦ÆE*H´rÆ1”ÅëÒy´ŽîuöF™Z[=L£§*â+DJq‰V«S¢t W¬ÅE~6õjI_¥dê5ÿæ¾1õ¢ùÿ8M"ŽÝ¹ðd²ndiŸcjNãQâ3ô©(ÃðÊ£ôÅ¿’Äb6M„P¤ $¢Ô„ìž"9G;•\DõÃbJÕ¯ñƈ3r!FŠfE±&Q24«ÎœÖU½%µªxçI)sK´¸aFĵ £JEëIZ’.Éý]+ˆ†bbڄ³ŸՃdˆj13Äž$Â8Åe‘C诨"Õ÷‚åH¢Z 'z¬ŽÆˆ¢—Æ£8õ=¸ê'æ…+á%CDUbNU  D‡QAÖ+Q! šø¢(ïµJÝmmæ§2Oº3"•ú\¡>“?Î?–W¼'Ù]õÅHõE6•4¦—¼nUHX±—ja•.y<Å׊ŒÑtBô?êÄ-(–¶"„lª÷¸1¶lЉ‡ÃÄë„ Š½¦ˆŠTDƒ£±´0QÂI-¯J&ÚÌèA5 ?'zæ«99½£ª5IÛ¨ÉLã…"Ç(2äé…ÑĹDé‹ÈçTõ™T‹…§+ ¶‚^B†UI°_ZKˆ&T2e™Pic›æ卩–zˆõ¤rºe¨u¿wTá¡p£µ¯‹ +%Ü)hÔ­¡(<ˆVÓ$ŒdÈ[Ñ>f ÎLˆeAìþiPà tËOÖ¢°›4”øäô UQÅ4¯ŠsF1¢K+£ÑÓ ¥í‹0AÓ3c=HÈ/$éúÔ.„â +ܨ¦Áz¼*±š¼ÑCÖ…Pà"hªóßš÷âO¹çÄ)­a’¾Æ8T^úäò–Pô!žé-¢¥-ž –/—+֙jûÔ؜V±‚…EµEýãM¦Z²åoIëš +2;Á r ®» +‡ÓPEÝQbO4y7KÕ j8=ŠªDñ”râI³†[ KÑÜ´„úç=²„?‰ÿ –„ ªªÅ8°ÙY4¶¨7Äô‰v®“ uWÈ㛹þy°F S謷S—gs¶RYÈlìd +¹)[ü!Í|äKíi~"9YGü;Ef|•g5Yï‰g« zqŒ%Ì°XåY~ùæÏËÍN$ ü7凬-B,® ӟ4G4ó–WawHün|T…D%¤Jl‘–§¦I”„«Äµm†l™GyF2/M†¾žf3ԋŒjïEªµ’‰‰T—(JÆüb”)ú¨]¸†xìHX!o‘$: ™Þ{¬*ÆD •¸r3¨Ä¦Ëåº;Rh¢„È)õÒ:_EWéS%I‡ä$B _ðšªOïpÚêE²™žÇ”dVs¢_íd«zD“=tÄ„:Üļµˆá¬¾©ðJë+2Rj‡Ut¯¯\¤3Dale ‡wêdR‡Ws[ 8ı‹„CC_JbæcÛÅq[öù–žsH×xÉ*}ºGéF°—Ïø•°,UBr¡òÛÄɁž±S¢áý‘"1M¤³l‚l‰Ûð°®V_vCx>@ñl琤B2wL¹©HÅÎp„‡#©KÔx&Á÷eòF'êýL”:›Ïj +B¦^+=æ¸öD…‘)Ec"Æ­úHRì“(˜ä<¿º—_Õ!É\]6„œÞÄ]UN#=R4%Róçvía­"aæ2"“ @c¥Õ£Jæ]Äñ¢fvbõRŸâF™ËëDŠx"RX3¯ҙVesÇ¥ò‰Ÿ!x*G‚J„JîoTÒnu É©eöF˜S”Õ*©E½‘hXd‡Â!”aU™jÝ3#LåBK}&ª„Rî(¬šØ  +>nªyÄc!›ƒ6Á}UEÃx»HE¸Bä•ðej‹s ¿Áò³8µŒ³ÊºbŠ.žèë¿QµŠƒ– —Ёb³¾ï P¸Ç› q‰xƒ9n1)*bÑ0q’V[bŠ^Žã‚‚ËG}£ŠMˆTP…Y§ÈafVÊ0˜z.Ö(Z֙ˆ?\úf’³¤¦9©ôÌD¥®ù„1·($°3Êí;Àp@”µôqw ֐Ð×Ñîô1ucqŔEŸ}‰GÑtjÓì¯/7)5ì?6nô»DP˜;I+â!š«ÆÁºÅ-dZ"gHˆék1KÉáŠÉ“åleR ã'Uã*u˜…ÿÆ1kÆÇü•î°–¼-RD¦lë`í÷T·A õ,»ÿB‡I ezBÅÄ?¾;ëƞˆ)•22z5ú=RØiEb&LPHN©e¦@3cN8¡¿BâB5ocŒy8¡¥Ó –žª†ü tUs§¤’_å /±ñÌB}z†CÔ´Eäë`”q42^Fµó nqBõžx,Gwr¹¢HU—x˜1Yñ ÿÇ|4ãµÓ*M)&N0Rÿ*ñ'•8¬™©ÂN6Â-äFM¾º±™Kœ¼y0S¶ª/|ö ÖÄõ absJ돼$ŒÏhŠ ~AŒ§mÍõŠ¹m _áIǦJ6S51߄yCÆeO˜w&(¨*üäs3LD­s¢(¦JÚ¨~±ÕR1pêú¸U¨»î´vPðP%—Q)ìN|H^©N*ÂôBr#ºPUZCcvdÜI½ªe§BedcÁRÎâ}°¾Ì„mã8óåB±¤ÏP¸¸:$2™ð['q\Š`…A²½Ö˜è¤×+Ƨª ‘° +z¾¬£–8 ˃%è˥ʉ@—‰}똗Pš¼iðœ}U•†¼Â¤‹× ×J‹â³âº0~ÃԘt2HÑñNJµ4u6JϬܙÃD/Š:)O_æÂW*³˜»f{—Á°Œ¼J֕.NÍMrMž`ð@Tz¨I ‹UzCf­*^‰òC­ÈÛ("ð!# ªiLDæñl Äÿ¥jM%zî +á"ypÓM9är’JèD<(tVIV”"%N›¡a;nYZ˜8b¸‰–ƒbX{N¢ÂäÑñe + Y-­ ¨+KÙð-™yT°j#u=J5Sr„ž—iazÉÐ¥L i-þÓI¯òdkUTªÊEBQÖS¢T6‰¢O¢B3–,ˆ‘¨M…ñe¤„¤ó¬ ¾pf,ÿ4) Ž>Á@X­}’ŠK©“"^ÁZMÕ[ïø®’X(%{¯TDÕ I،qË7ÑâqYhº0HÞ7ª9^6Èá;›@2§Š  ÚrzC´AZCi Íé¾¼ ó¨~23BóL|™@Œª8fEGèBzÌEjRw2ý'BeÚ­cC¥*â%×<3ºH•,¤"NEÉ"Œ ƒNTa¸—‘“ô;L‹ÈRþ„̈́\JæD=v©ªå—ÓH\•SÏÌH5uU¤ŸOº4¸ÏüÑuö8¹„Ès(%µ*’é«ö™áñŠéq.ótD¸q1^yiÊӐy/E¶:rlöˆ —žª™¤µ?Î%?F1Œ—Ç¡ë׳†^ÄÍD”Õ‰¡…†52™­¤– È_5.Ò,Ùo†¢Åo!ŸîV*#!¿U.¢‚„ýY4ÊU²™qƒ+‡ƒE…ã;MÅL´Žß”§?&!<姎óš•ÃEdzƒEê{5)OTƒÁ 8-;\JV5ÛÐÆ?ÌA¦‹g…èäš …ojÕê2®)¢CÔ[‡dzûÍᢊéØ­ºçòŠÐ !é>šÌÓP8­q”Ä2Õ;†¢íʟzÉYCŒ—טUK§pw#Å«bIJ–%ddm‰[u“P{Çÿ"zR“ŶHP°¦LD‘ý‘­Jžúc{O£Jf“fLs5¢Wy§- «±a¤)qg4T“™àªÊ P˜,ˆ¨ÒЁ6œèH0jւªC¸dhSŽ'™‹LH : r.>Q IVzô‘ 4ð åœ8ªCj'L™E„ºÈµ ÏÓ ¼#‚·lŸÂî$ OP•p`HŽj^3“Ùpy)\m ›¿—äÿ‘Š¾:5D1óvrÅÔ ]¦ ÙÏ"•¾„¡ +1aSB„ }¢Nœ.Ãqu`ªAF‚Èç”Ë"ۜdÊSÞMÓ™G5ÞjÁ’%…ÐÁQHIO£D"©<§‚-žy¹âÍ¿‰©ÏVg}ƒƒLŠñåàB:@B$…LU‡ªž!¢Gu†êD¥J3ÊH÷J²„!%:-ªh”ŠÏ ‡JA$—¡(W½:ä M®‘ùb•òd_ϒ.ù®hëT%yE¸öÁâûŒ†$¦"N1N"%¡-ˆ°t\Ìé-hL¤Œj‰ÍlV“SUj (s¢ö +¢÷QÃýôÏtF wÍÌ6ÎFj%aPpZ5NT(ĆN'ñ5j‚\j¨ú¡irZ΋ŠÛtÉEdN¤Q°BÉVëCĕö.ûåþ˜eä¾¼½£ôY=ŋM;û‘|•581m1$҈–)ÝHŒ!3³E¦d¤Ÿõªˆ 3ã»áM=±zÃakŠʈ‡˜¶jÊڊ΄ÉQ¿TxR¾ë$Uæå4QËä—ì*©±˜h„Íwüœ{è"z„^Ƒ "’Q…2aVÂDŒlöZª3Ôz‚<¿ý=ŠV†\¥Rùìiq…+ü&X2‰Û1Ò¤d¢‘ àË{ç3 [UÞYÁZˆE|;IAS"!f|RÍy‘¦vËß*ÄSCJS]KÖÛf¬®G”_üøhÄâŊŠáKJ4,·@Ò9£jçobÌBsÿ2"Cª†Šø¹dj¡ED2R¥¨¡ýLP+H¶[XqxšøÿÉh*ò %ª4⚊oª(%"oj$ª$rúRˆmUmù»f\ãBQL„D¨#DÆ7ù9ÚG •åñš”k㒐bHqÆ9Ü%ÿ]ž§õ3ªS»ìòU=±¨×8nû Eáô¯l‰”P4k25ºÜâ¨%IŽ‚Šžº¥ +Ío±K¼ 6°Ê±T ŠÐ´"_}݃Èt’/¶O^pXˆêKqh +©‹6 DqǤ`D?µÔ‘ˆïÒ=©ªpM{’)¹R©}œ ­6”ª‰qùi‰´:ÓPÊ;™É<„§ˆ#e CˆÈb¶ŠefU°y¬}!l—]©…+^ܵGÒÉkJ$<²A#bìbif[[UAšè¥yÌm—㛯·X’œl¢âá¤Q…÷2F‚èNÉ=ÃÎíBŽY(^-•e&6Ûĉ!·FKD™(Äa"þ¡^^žO14X®»Šr ˆB¯W%sÖØÙaÚHº»‹…|hîG”¸(¨òXXdFÞWdyqŸGÅ^8/â$!1_^ç”ëzÔΉ™AªOJ\L‰üËÔk|Ôâ—¼¿§C&‘Å¬†øü#îLƒ&„3²Š#d.§Ó÷f&iŒÍÎÄùV9¢q¤JGËUB5CîëKÝRLLÖøC¦¸¡tW#µ‡t¢|¼ó‹Eö˜¤ã—W{eý*%z(òሃÅEµ!ߔ/šiF|ú„"æTÆBÂ÷b6*â¬(*%"T¨071G=GÉØ(ò.O” +Qõ{k q$¥‰š°ñã5 + ÏÄ-õµíY—ÙtF”ŒSÖX÷÷x="¶9-ÜDfÌö™ pša‘·‚(DýL6ãk[CæHV«ÂÐ$Ÿ™ +2X´úêE> [Ÿ_¤oD…Ù‚N­Ê„í)Í3awí“K–]ã9s±X¾ö2sTÞÝû«Tñ|ñåœK-®› K=Jf1-v¯Œ¨t>‚öÈdÏîÚ]!³‚¨äÎ(ŹL¤)zX²  @$ ÈeÓ)I ©&—,!e†a(Ž)rF €tzŸÇ2Ó*dI¶ +¶ÒÝàãö̳éA†àíÎ3m®Šþ÷µŸgÒ)¾6N/Úút é#€Csãœ,pÇN…XéaÙCŸÛM™ã V¦·~YÛÌ ™ˆ•{æË«ÝÉ(wÖY×SL<â±-3„£Žê}9ÿIúœœ¬ˆžu-õâ2 +Kæ}3¡p_ªýùhç(/‹bÔ{’ÅsŒšx•t9Þ!Z +ºã¼<àp_n¾ÅL½24|h¹(cOÍ$aópìbáÿoïXGWA@œùɄñ–°¤Ë.ëd‚– ;ÇÔ>ÂÚêJ†q›÷¤ÀtÏý®3<ý¾øK嗽©ؽ¶Ûe3UÂ%D%ùT…3z\·0ي<ÝTüÊ É¥?ïŒÑ¨¸Q×G3û²Š>‹Ñ,»BŠ´j`Þƒ;ËkڜB"|3,‰—M¼v`õM”¾£!샴T¹módUG"‹é}+z{‘"Ÿ½1£+³’6³(›ÉEýÒ^Cv!dÕå>å¹Ò·ò‹³.KýF†Ž²[æn*#—'tåߖoµ¸ìÀ!}/_¥UM/ÀMe\œê+J÷-½ f—µhõ\Íýp›Ë8%ªú•¥Š«+ žkŒöçÜSV|0fïd’ÑÇIúŸ!€¯0¾§Œ BL +)[‘— +÷R¶š ¨€ë|[ØW˜ÄiD:ã*ª2øUwÞ é:ØíQ¿£µ°ß' ,6øãy<ÂëÂ+f•Ä…7 ¦Ï`gX7jN&Ðr!_›Úö§;°ùÉÉ)ÖÚgbòøUAֈŸÚԕ_7œk!ÚŽ]⊣5õ©èÔÉw3æ嫦‰Ù3Ýds1€8Þsð’†?é\ñL+áè5Ûr¶1I®²]‹¤~u'Ñ·€rz#`¡ž€QUW ]%D¿æ%Æe<|JË$Õ£*ºU.ÂÙK.À­m)*ìw‘D¼špm_¡Uüá„X@»«cãe™»+[Úhb4¬ D,ÜÆ=^à]âL`лì0^Q÷w|é¶SÜë<|9^V÷.ð‡9Å +xãáåÖR%¦ŽðÊ ¹8Ç[tÓ!o>Ä+Np͍œu”‹Ÿss/xŽ[è“ÞňšqÊH“wù(½Ë@ý÷Ý?¾óçw_ø%ðz…?ß5{WÛ¿+W+dÖMa‡Þu;pä]Ö¹ˆwñZðj(œŽwÑö·G^wò®X/Êô®mÁï]ÝjŽïbM%¼^SŸ(#^Ðx¼Ü^ +ðâ˜1 /¼à…ƒ}—4~.1x‰›ß5Œ)& ‹°‚±p"nÂ1–ÅdðÂÄ¿KFv™q6@g,/L^Ҟj¥ +8/w^!çgÃëbh¶á©]â‚_¬^û¯žþ.G4¾t„ÞõÓ»¯]¯6/ç‰#:!Æ% +àeÿŸá‹/xówÑȶß5”“]Gê¯ø»v¦À œR©Ø¡/ˆñY÷œç‡w]ô«+þóx "ómGNՁ#º!Æ%”ù /˜ð»‚×VâÕºBÀQAÂËã‡Wo`’ð¢šxúÓ­•«uËIAõÀ ¹•n¿¾_s tÓ̼ü1ePè–ÿLþÔRoœ2vµ.^š‹ [¥÷À+qŸtÏJ÷3d&ż™ ƯÈ@óƒ¹fù߅à%Ð\W ðâ7m=\E@síúWª¢ê/œ¸j ¨(†Q/ÿ…W: Á eÖåTIê.6Q¶YIv±:5Xs‘ó•»E oñ"ƒ *žÈ5±’8j vP⼌ï94eˆIœæ.6O¶Ž¬$ûÉ0dª•ßE‹ËîöggMwlöð„)恄KAŸÊ&W›´ã€Í¿u>笂Ûσg”Oo_å·-םyü;®ó„»œrÿ›ñŠ ¦Ö54²–PTœ„Á8¤,äiâ„1—/¢º€¿˜B!Œ&£¨¶S=æN¸ãwz¥¸<Ó"dR A´1 ++¨‰O\v@­¬­73Z´Õ 8¢Å嫨•FñyT\ؕxh¡4ܛ‚³Å¡®xç»Mëê¬ KkJ×´¼ö…£¼H×{ÁÞñÃ;.úÊ´\ÝßÒ≉ãâ²Å[§6­÷˜7â^EQ¿˜,.Côïâb—i5ën{á5-ˆa\ÒÈäTâjübQ„ Ú‡”ˆ…qœ]\⋟$¦\†q8-Xä³#}v×Ö¨¸~¤ÅEԏ½óÁw?pǦõ ƒfZ¤ÌŠÈ´²d°kTÂWS®@5;”¦…X'.ÅO²i´i…XŠknœsnq–£œwü _Jå¿iÍ h%@12æ@Œ"§ Ã<-h4­¸Ζ)z ñI›u- ü³.ä”dσ†ÂÚ×\%šÓ\…ÖnGЖ3û]f¶Ü Ç NÿÔNäVE;ɳóhIQʆ2÷Ém¹Òþ<­Ò];oþÂ+—(=RT`EGKÔ5I³h[bøtg<–7ÛBð”Àš‹z”É}.KÝDyJìD àqÎÒè£諦#Oø,†ûcù]=I; qЁoPuÇÇ*…bͦ;÷Y:R+ا×nýËZ[3€ò®Bøª¡¥xñty–Ÿð£šç`çN w&}·…ð/$Ž‘Ü|14Â%ÏÒ”îá˂Áp¸b[涕­ –`d@²œ#;ár n¢¤R3@1ðBàÈRq":ÂyȒœ´_¯î{b*`O‘¯“’ž„6„U+r›~  ö"&òj.ZšÜ(«y2~Q€u¼Xúi¢9cHù<Õø²zí¥yØK!¢d†M'!äø›Ø9CêäI¨÷ÇðÂ¥r‘ô×H ×ô¶Ó?4«Kñ¢vŠŒòp ¨t밃ÖÿϘ'AÓi²7©N‚š׍Ä%À»æt +¯€i†#”ƒžÐýœt'Á¼2~ªDû5x`“9á¸, So+˜>/ '㛿›ßôiîÀ,ÏôÛ_(Ôéæv¦E)ªú½ÂûÕÁ¦ŒŸhքÂU nvø‹Hm†- &õPÊ'8ôPFO®–o-NTØh Ÿ£Ü]µ•4Ï/È­raLžî «õ¡}8ÚNry>ȅVû:àVˆ_/æ³Ùý³,ºiû¶?˜Î„Ð9`ºÇÒ1ëbªéhI#w5÷¬N|ö`HÝלDǯCLkŒ­3$/ Âô£øìÈtÃa— ¸ðb ¹½øa —[׃²;9µˆÇh~¦+.n¨#Q¼ ±‹°t’ËÂR›èõå”Râ¦ÿKòšxQZ´¾NmFë³<"IÌ´W[’éžØ.㽞€ÍˆÒÿo8ã™×ÏÁžÙpŠ·`ÌÉ~øT7»¸Û]F»gëȀ&;äv†a .À #B=ÅU ’†-·Ú4ôPäR)@a[†<§±týÎwE&ÃÌ‚%»Ò 1ßL‰/ÈúhèO2º½ g/*浒äÕä6CI­ˆ¿j¥eUjëo¤ô¹ Ü;ÂÖÙ؀j¼Æs Š ‹t8ÿòm‡¸Y»÷ðµ +&q +¯p¡¿»© ÍL˶ž:âJÙ>P]XM½(‘ςܧ Jøkëï(»7Û¶øcH;ðQƒ4–ä¦/øŸ†¶G·"G»®Aґ´™¬d.|eŒXcíó@~žœ¶X¶=K«ÖºðyÐVA^+rýD9_d‚ž%=/âZõҘÛÕÜ#û&ç¸rqç2ö%6’# Þm1zø|(L4 rJ² –‰t¦ól€Ž£UJXõ–š¢%uJm։÷‚MUÝA<± øûgµ™¤¨_ëq–S¾=\D5Dó—b2Vî§ò¦Ó”K~?÷¿ú@Äۙj+´Ó*Ù :Ɣ $8¤”“¬¬…ˆÃÓÇâü¦eÒõ @»ÃÛÌ„Þ Ò´sçì ƒÉ9ÄùÞðí{ÁSc@Œ‰œFS‡›9ü¡omzÍ9üÍJ`^.™—á* +W¹{ ±XL²Ø÷َ%ŸQC—«Nöôôê„åIßršâÖ³›Žpm—%ë`mH©„»p ÉÈ"MeOåð²ÒôÇ Mˆ]Ìʟ(©‹ø‚5zE›« Íä|®‡ õŽ ´¢W?÷Ì  6¾“\ÑÄȞ؋ÁíXƒª‡mWzWNŒ¿‹á‡HLùoóìU–ÀPX:xuªW§EhX†<‰Ú¬ä˜à}Ç?•b@Sç³}e] +:¯híàJƒŸNtè€~W/ƈ´¸~Á»ßíÅf+šKLúy«§|lí(ff4Y£ògpM·n[j†Mýe•åm@¼•Úú—UÖt¼ëä‹É× ÆZEµ*¸Ø`P|Ó§¾ÿ‘}# u¬z§ží%‚@‚äÉSyÇ$šŽ©Íiù¦Z-¿0?ñ£þÿ³•SŒ ƒ¸CQ>ÿ;DY“4¾ÃY( `"9Ξá,±oÉK Šf6@ jT½†Ù ƒÌéSXÓüc<êÐz©ÐÜä*¡5$ñ¹µ*á +šVÎ9¼äa(¥{z×=ØEeê;\È¢7ûêFV*›Ú÷Ñ8÷„¥Ô•ÞFŽ…ƒò­rjÓÊÔuɦÿÎaê´ Ë†^Gm“¿Aœß±36´Çož¹Q:Ëi5êW.*›¡Êñ)Ä©l‹S‰ÁñÜnÒÀ­Õý󡲌üހ$mÃŒ)a›d Žè>stream +lØÙÆ×^DmÙIkæ½²9ì¼ +^Amx°n˜3³I{‘4¤Ñ²m9y§_ÔAY¢÷¯æe@:À w†FÈg4wzÒåÒÏäiãJ„CúP&.‡‡æ¸‹¬Õ6s'¯gbœðÿbI¢î&ˆjäœ`O›}Iû¯"……Ód–w†˜xÁB³íʔTAŸ&?—ì(4Èy=]HÅJ?ÐÅQp[/‚m[½$­Võ +J„×f4Ƚ´>8Iâ2¬ž™‹ëñò둨›7¼ÏZSŽ×é •Àrá¢Ú¸á¦'ËLé´]ÿ!Œ¢pâãá,ü7ãî©%±d|Ȃ<›kj ÉVÁ¼Í[‡8Õ㊇_—C³ìŸ´žâd#%NÅT ´£ï†[õ B2¨l„{P)D› ®h'-LÚ¦©çN³®ËªW»ºÒ" š,õÌúbPq— j͒í’vèK Î%ÀD›˜ ÝOYr;M>ÕOÑ!|Lsî‹âøÁ¿qLÑ'T›ì ZAÍZk••Ã›šತàëÇÛÑH,ºUÿyøgS‡ŠaJ™Œ’˜ÛÌxdÝmD`­Ú3¤T0µî|ZmÒ|¿ª –‡ Ç(kÁ1H«Š9-ö(¹Ÿ\¯6ûŸ‘œ ÷¯¦²Ö¯H{ËH5ÿø!f[·% +à‹éü÷³‰2T[˜h_å +ޙ“øÒàíÀr­†}2 wÒàW›ðýj_.µíI(:{Y)ìÐPÊ 8ÞWYb|]E•`ÛôîT û½8=-3+æv#XÂßâ^ÖZ%B·™2&Ñ^Ü,?ٳޗø(‹C90¿¨³–‚¤UkV‡èÚuàÙPðpr ƒ4|ɐB©]’nrhªÝ¿¤r‹P#Ñ©Þ=/z²’+E*Dšâ[à4±¾¼Õ–C€*¿+bRd— iuže‰¦ÊäSÙ®Ic’Úgc1®f° ‹P½æ˟:0-£³$²ë?&?I©Ë³§ö–ÃQäÄU.|5 6b-$YQàø8GØUͽN›³ÊÇo¹ÖCõøïãñG- £!5žÞIA”a±¥<3]šµT‰uŒ‚¤) F°púWu«¯Œ„g½2?àsŸ¡ùƒ«:gžÇiC+,3¦“"gWHë9w²ùÍZ$žqҌ;x/KpgKµ?.C¡ÇŒ>§©)5 'EwþL µ~›mTüu[ûTYöòb}#•vC⽋Rc>è[ûE¬âÊâÝB12ÓBî’Ûžß}“Õk>²¸í-HŸçÜþü"8)AͨØÅæH‡ŠçN¿´Ù'þjí‘q S­Àÿæ;ßk#Žx4ÄÍ*ìm/ýÁ1<(Åܦó”U  øÀQ‹TK¨HL çK¨÷ç@ûA—žŠ`f,ÞÔ*6z6ˆö˜]¡M˜=ÍL`W,ú»v2Z§=QyÕmVÌ[_&ÕvۍÂkgïsA©îIoð”ðË·¬ö_ÀÖuû෎eKÑÉSe 0¦\xaØÆ(‡ ”…ïüÖ ֖%|R¸nëH‰Hl‘ͺû²õR)ÏߛB³p1ÇFQsÕìŸ v“MëZŠ‰o¹¥i‡ÒU‡ý¡þÌ/’®&†¯ ëhæ¯Ñ¤ÍS¿Õ6xIÅsøÜ;ZH Àå*¬éõѹ¤Dš](ږ¯2¹åèĎZԔQïrâÆ(XºÝ­•!OËõ{WÆÁÒß©fÂN8oFš'`ÁóÐj¾‘WÚS<ñ¯VJ¢<àã¬SÅ:Ž¤õpJÈÀ 6…#/x Rç +"Õҕ@çÓ ~*©Q¥I_œÅ‹²â‡ >̀?’$½Uqu ÷fb *g¬rÎæë«UU+P„=¤¼&#¬‡3ùÓâOSù«vø«šâ³¿œ/…=¤Øýkà¾@—ˆ`ï‡_àB¤¸hó,hƒ¾U–ŒÖ€cÌü>ˆ–Éݬcƒê/´e¢¾ñ¹¾¡"&ì‹ÖºfuÙYSà…7i‚"Oqo° ¯ɝ˻9° Ï…щ·ƒ”zÀ¨1ÀɐÇ`ÇѬ¦Ø€•›…€LxBJW¬™´k.^ÎZv°‚ç#• aÝuŠéÚ"¤h¢ ¶° u§þu›¿m#síÚ`UŒ‘Ž‡Üõü1Ôíƒ|•ògíOaØc&ª™40©*0dvEw§Ï®™ÀQEæ×ú‚`•@㘠íˆÓ˞ÿœÈ®yŒâ Qé¿%0ï½»RÂ,˜lƒ”ĉ±Te’8niWŽÜä·°wóÔ+¬Ó.DûììäÕí„e$î¿+¦¬…— ¢Tؘd­½ˆŠñcxWsi—ÁÐw¾ˆ_5DÑ?ŽJHLF×0͘—|‘Ü_Ï"1ÜZ~tU9Á0™1o°0– ׆ÐOÿB—΍Úyƒ¯.GhéÎÿàŒ &“$žwŒ×QTÏENL€cº¶1HÚê¯ØV$-Do+æ,Ûwwgvm跘¦_±y1ÅËšÜ 2Û'™¿%fޏ]Ò3+Øâ w:É=cB¸¼ŠT+ků8è-¸æƧEnåž_K\¡Í…ú. Eõ­ÇB؞YaÞhZ;Þ&4GsVf…+îÓÁ9u ¤_˜EK¨8–KDhNç $Š£=ÓJ\Oþ°‰3xˆé·5܆M † x&ie¼GT_K¹áÐp¶âÙ8v]þ)É·¡3ã€EhÁ$HB[_L¸>Òl›tÒ •:8=€©X}àg9ǔ‚;Ã+³¶†(ÓãôŠnƒˆ*ú-£8’9ºA/I!©“š—`qSX$ƒªLR%rýwF6ݜܶpÒ╱9ÁύædÙñ…ŽO¯\œŠ¥Ëœ•°mªelýä\'ë +5ß©oOƒª¾iÇkF90Ùš4üF…ڛ±~ÚÊ'g @¾T)Û*Eîô•oPþÍýTÊ^íûÁîž×2Ü>%öX§6ƒ8¦“´ Y›e$Ƅ5E6N­BÚöكvš%ÄZç2&,jɇFsl»ÉJmSªHlmK2yg:NØ$è†º# ÙK.fhѪ®dõÃ|(r¿ÅØß›Ô@† !u-²³…ÈËÁ¬ Q&´-©,OØ|‡ï×¾k£ðäƒ{¹~wUš´"¬b`òˆI¶DWÐIø·YÈ$¬Ep¦Á+&´hëLêPõŸB¢£õ ¦âcd ¥ïqA¥ÆPo¾¬ÄÍÕ –ü¥ÿtùœ#N=RLaã“"€½`®È©ïÉýµñí(á`¥Å®âY¦qÛèµ$P©fÙÆÎÜzɐ.ÃsÌÌìgÆ†X_÷ÇgcSï(÷¢€ëaŽ»Q€róÝ¥ä0s(†$îƒ4„ +@Â]ì›hUYôÍùíF5ê5ßìES¸6½…ãû¨ð^º›×æàìÈ© fšý¥%·Oü3§`½ª°Æ±…ðþ[µ!ð%o÷öng£Àò³HµùÊRíÐêë]Ø[þœq\ämx$IbÔÄÁEìÌâ)WeQãuxik0nGÃd £DãXË´4ÉrƒP0<J¤k¦MgH1³š<ÂhåӖ²ÛK©ÑRî»GöG~„8¿&VoÌ;ÏX՟2ÿ{6IHJÐ"#-‘)°ÔÐHªï ÆJ ^¬¤ø;¼ôzEG/Aåƒ1*ÓIØø +pÿ’¤°¶ñÇhpšrò'åÁ£ßxLèPj\»Gf†Õ7pÉZÈX®¾M"X~šÔS…«uV܆7}än8$u¦4@ÃùC4p܃o|U5¤ô +í(ÜǪ³°†©žPrÄW¦ÐZi¹Æ§c(z9Úzêœ3^{xLÝ#_mr¡ñŽs~C3S_…¢×›“¨S(è ÛTvÔû:*²ê Hå€_ˆ±ÖrÿÙ5Á߯ Æס¡Y´Ø}Ba‘ÿ½ÌÒr;Ψ‡åÕü—aJÈF8  ©¼”µÀlÑLÔU%|–Á¬¥!ÃGBpöð$AA¦nÛg%XoŠ §(± ž/!»/ƒ`ž7Ÿƒ%іI=±\ÔÖVÎù¥”BŸ–®êW,€J–ø-±{"Wd§ d÷öª8³Õã¶zr®OÓ⍺mòƒs© +ýµÊ  è²½3Fߥb!SmêÙ4{ŽÓ‚´‹±Ig‹2ÆR¸Øė¤^­ $Ø{>šÕ]î_nÑÞËßÿÔ¢P²!¥˜R.+Ÿ»öv€còL2e ætÞE†º¨ˆåc=0î¼^÷#n§l¼…:'¦ä@²:yýLNCj5ë÷b‚Ï@•mA©Ô"¡ü¯àBÁÌà/ä5›AÛàç{ùŲXʤgG…/Î=Š¡$ò*ãÂì7l¤rÙjRó™çŸœÑÉ°:òÃ=&e./ÁU)ÜX)Ñ­7óÿ¸703ßÝM1ÅDl(›óòd¸»&\©¸:—€~IÎ}+Ü%BÍ¡`Œ O•õȂ—œqÚrÏˈæ`••¯ ¾{la‡ìêaiΤýšU'¢X»Õ¥íµ!î<²+L¨  # ŽUƒQ±’%©…KÓ"m¡d׉F Ã.:~­ÇžH!:hõAkª¿yØ +¢äÐÁ©|ð€8@‡™Xž–£ ³}œ”tcb¢°vKDFTk÷Q QH•ùƒŒ0%ü¹ñhœ•°¡7áªUPQ…™ÅŒ©£×·¼Dµi€œpòGçŒ#PRܨ"#×\HI.µ1 šëÏîWý%m¶®^gØÒÌwóêeÉXX+$ä„nã¬m@hþ›¥‡³hI_’•¶ +„fŸ‘ÿ@Ч0¢´7Ã]ÁW|>29ìñr4lÕIø†É&‘|ª¢"J<6Ù¦Î"ˆÌô&|ãvTɈ`¯š‚?Hòa“dÚêÓx‰9ö–¶9Çç>uUž*ƒô''Ýo¶`»)9ÂxY¬Öê-©WäíuÑIؤñkñH,di +s©ÓŽ¯Tú|r!€Ú6?hã°£41Fk<ÄCŒ‰ K§—âT¥xß8 ¦Ê)@žԖ Û3XàÈf‹üšƒu^è½½aœdj&¡$@ÌB·5ì°Xú:æM®Yïøõ¶r%ì¾ûÎdJfÜ +îL¦åer4–|+¹Z®νLÎÆk@«ª®ýÆMŸÇ,܆:æ÷|Š>áº`1ãG|D +³¨•&E w3^𙊑üŠžr/¹‚G¯ÎBZ;¹ÕmËlò‰o¢1­KÇ 7u‹ÌmZËñÚ¸JÙ¿&l&Áß]ÎòÉVáògJ„”¸‘mÞà.ŠBŽ,Ô).å8Gøt9,e$¦’»üZ¶½?™ìTþ-ÂLuÆôãh՗ŒcrBèæ'úrñCù3 ‘¶²2ÒډãYC?‚A,~ÉÈP|º-sàšǟðÖUs_y~>{§QlQÁ]h<ÉÅW{óeŠÉ¬?¾ž,…+…Ħ€f©·b½x¥x:>Œ³¸ÄŸ“`ë1ׅ¹LÀ0Ó„1ò¡5G5Ï,Ñ}z¯Bsèâ:)’滉0—{ŸÂtå¨× sC&±Ê”“GaÆÅ~ÿ`¸lG#ۏ˜øÀ´þ_í…À0¨ê`•›Å–¢žÈ¬±Â:Ð+ÝU€ÜÒ݌;Ììô¯ø<ø҅ÅàgPu‚­`¼SªºSÈS‰ ªîƒeE„:Ë«u&Ls™Aá#Êi +èKAô+ï.×áø]Z×Â'‘¢Í5:Òè¢$À^ v¸–pEL­òåH3¤‚ëRçY¸õ ?"|s'>Ö#R‡‚"ýEKߐ=Šä3¸àxüzþÊUNîa⠞ä{7ùLgíªD@Õz‡–4UQIc–KÜǃïÉ`m/~Á0gƒµëÖÕÏ"khT¾‘1~R”É£$GBŒX?„cÿq 0³(Ž‘ô¦Ç€[+vÏÂ+Lõ¬DámÒò¡›óI·ÝæÛr n¡:X +GYT‘Ÿ¿ž¤š®Í?^˜ï°‡pšPa’Š›9Ñ©àTby÷š>&qԀ€Á¿îC×» ª£‹óWŽ™ì} Ïû€ ±ýxô^_îfcO?&™‰Ÿç~>h + ,|6§ùR°ZÌ!2l‚´ ֙ àÊŽ­œ„¶«w,¥†ªäAÙÇâŸyϤÊÏ÷™nhQP^ÄÀÒÈ´¾Ò}ã[ÎFrää7$ù¿$]—^†˜?†Š¬™, Æ蜵™2[Kôù€ Æ%-†¿fÓ²L݌‹m—E ]òH£ {Ô©û›ˆD֛¥!¢}¯çüAf­P"xÉ& ‡ìT1×ëÿÆ÷t` Ãü9— ÇÃߤrÆc9–ӐI†»/šû&¥ËËC%lŸ¹ùðQw"öXòH´íI8}Åì0­á¯–'•r¯ՐvÍÉD{Ä]¶r;±îç sADU¸+v …¹ r¤ÐŒÚ[xNÚ%Úd%;=*Sje†|u±<6^Ìöp.£«8۵ǐV6é¼Û ŸUÍçfJô#H¿6•ÊÀIÿ¡"{ R¢ˆ^%OÒOY90зCÂùWs">iÙɨÔö¿a3¹`¨Œeò­„$à0ÅgƒÀd‰\µ¦#{kuBN&ƒm-·r*o–;?´ÊÉÀÚHúԞ¬€ÏfŠïêF´y€!P«Ï^2\åˆ÷Jªw-ñm²ßLÇhâüÇÜoþдè9Zñ @½·î²$›®F®¶¸€£s- ˆ³*€a‘5K°Ó¸±fëN +I\nµ ¬i¼ +¡ÂâŠBDÛZÔ©ƒO™p”w/¶n¯?ä/Ö3V:žÌ6݉Iü¾låäxCšM-ØsàMjW»9í;àø†û;5àðȈýŸZɚt˜t&éƒÛ9» }—Uä#ÌÚKr°´’Nr†aÜ$[8˜±Á<ê8‚”ˆ5L$98·Y˜¸& +Y½o,Ÿ—j®ÐêT–ì=ɟˆÓ2ÛjD‚j‡Ñu9;³N LSGÿ" ´tºýð…‰Mû†§½a¡c²Yh<§óÃôen`êÞëVFÔR/1KÖº²2g}v8—fI5ª6Jÿxro9vû´×dWèŒè¿Ž$Ÿ +vmz MoÎ-SäùÏÔ}%>dz›Í_üeýj>Ú…È ’£é¤ÀÛV‰—ÜЯ±cÌ8#S¸H­žñgÐí½N§q· KH…C¢¶\¯K\,Õ9dæžãZ¥Tå–ÏÚK4ÑÐÊHâ0h(†Ãèæ• ãêӘĺâÍL ÿ“ÈòSÑ?'YÙmÌ4ã(P£ž3ÕÈU!و®#€”âλ“·8¢& üb¨ !'Pô@ÖðRŸ4œ]w¹ãäÚ2vèäêcð¸; #øÛYgÑêÎße±1ióœ­äΏ½<Þ$¬Ô.PÎãÄð€ü0¡ìöW¸xó +PÎÊHwƒË^¡)(!M¬ï¶ã“Ø°¤.`ErÑ4Ò-ºc#…³ßXUTØ7ÇF5¦ÌöhKӏà·Yï952™P^³Ïx^þõäR‘[ &uüìPµ¶TÎë‡ú?»®åI픳ür~u ž²Š '6S£s:[ÆÀÑöqøò›j#¤^r1#2™·^`]¶œ 'qrF°Ä±3˜ \QrYî¬{ª‡h.Ò;ˆ<zy*CՒl‚ßS² {Éni†ÿíº¼–y*Lˆ=1ëvYÿŽyó¦<—¶ÙÕi €Ÿ È6hĂñŽñÀƒ€Ár +ÿ ò¾¦TïË™î¹ +"w©êÊޗ:ÿW$¨E*Iò¨Ÿ‚UF!X˜q8‹¾–Ýè©ÂË/ŽR©ÿÝn™gòä=ºjÂIir¡äˆP¼ëdË%¿É>ZÀ›ì•n¶|˜ºM‚¿@Rf‰ ŸúÉpjCÓ^ûìM¬»P‚D>:nFIZýò²šÓ ŽÙ™7êbœÁ5i°å..ÚÆÿ—Ö L¡Žýf™œð&¨š£zkEÂA\̉cþ†ëø/×a‚i'(a:$ðŠÖ}8ˆ°NzLerG²v£œ•YyÛËÎx> Œ3ôm›’ÒÂɦÏ\ƒ*΃¾nèÿ,Bú *O™g44 ØE² ÁÇTœÓà€^¤íÕ:§S ÁaXŽ/û£­ Š«¸ª€ÃÞ·Œ§É/¢ggR¥B±Ø:ëǂ”Ô,y¦ð<¹¸ºÄ­£ø‡$ÅéDÐG™Jµ…¹N©ßñOç;Pæô¯aå<É–»+ æ¥Sy†ÿÒ¬;*ÉÂëU§;u 0ì{,0-&¦—åÔ¬w¥äÀØÈDšÓv1ÉUjÚ †Ïh^ÖÍ|uùÀŠT„mn„<£\R˜çٖˆ‡Œ±·knM+ˆ„½ôÕ(Ç|+:`)ÊÀeä@β"ˆÒš–ÑcñR~QâFú’ A /©(ÊVùÏ)Ýu:–SäE,¯PΎ‹åš‰÷ºˆ¶ï_AøLsêÏ3 D=F þ¨J|è€ýº33% élø~ÃwyÃóß²§aií§,\xV(§º5§$©g'Yø½åO<ˆ÷ +›2‹Psçƺ6èb ŽðýýOWhΞ7¥Bz×@ÝþÐ8 [ +Ð÷›AÜÁ:´ÖÉ„¹•S‡ÒU€"¾€®ŽjÙþ+’ÐÇì¦8¿Œ¡“´(ZÑ=–2½Ýä÷8@Ô;–fÔjùÊÅô4°Ù[f¯GÌw‡û@$X¥;â}ÐG²ÇôxæŒ ×ˆ5ÀÝbƒùíH<‹D°êØ×–ž®ÇÝO¥{juêk$atìÞH§¼e¡Àæ®ß Ô=vñÝً) `%@Qz +¹b¹ïöLÑ÷ߓ-Èòài \íƒÖ>1‡Êx×1Hp8ÖïN̂º>«^¾)½Ëê”C»3['â%©e{ØýøÍêT‚È¥ÛS1½cë+q~A57L—º³Ç3|,¨6#X‰¸°‰Ý5ãÚäi^82Á.B³˜Å΋²y¬ULg™÷Uê§0ñHlAjOÑ0aÔ@ó§ßµjlb؈wø—fm©?~œìƒ®ZoÂÎaå™(OnÎdÒ™8­Rw Xä‡ÄlC©,J{¦>ì6mÎu¿®•DÏkb*9ZšŽ¬÷pÿúÞ($øzPëéÑ$8<¯Ÿд¦u7F=wGþ”qãöúðZ€¦7G,:{# c«_±AÑژO‹yƒ¿Ûž!Õ±Kþ* >Bõ`RÀŽZÓâ‘ì#{µf©`è!jäëhf . º±‚ú&‰¼eÞÅàA¥ ^ÝHJ)ìƒ);Þu˜Qܼ0óƦ@º¬Î°¾j)!@é~8/Œ’ aI2ó o܄¡÷½h¿ +C\‚j“ƺý´ž%F¿¼ átD“¤¦N©Çy7®§n˜q§/4ÚF ,àŠ"ªFxùÿøGl +ț UðÅ°@÷4¥ BpòҔWc—†Ê†ë›‰ÈK°W(±²”qLMeùaíNm¥D×AŽœ©ï™UH֐’(1Õ .¼ååây4aӞ'´'ãCô@\ê1oHÓ'b’ü‰ÖXåƒ2áîŒ{Ž[³_“Ýýò ڟ„ +󗘐à £ÊÏnp¿ôcñèÖÓUäpÚB×lÆÅïz²Øò "3e`Z„£Ô„µWºÍÛ*¥¿¼žájš‡Äú·4‹XP÷ñœ-^š1AzzΎ‹» s=‡8Õó 8áß[:$ޓԩ@öù4ˆÓgk¦‘;'_äz–G;#!£‰ƒ@Îm0þø<‘ìA,&0‹•š¢ôƟ)]íà˜3¹³RÂqÌé"1–Žèsn—u7mîÖM“´¯ñ £•ÖK(»,Ô_1"QÇúDh͕áèŠ?ËshÕ|Áü„z[¨’í±£8à D.@Ò²ËÜô—©Œó+͟YLRµ#»¯œ~¦&d¹£,gë©~lµA8Ó?KN¦ÜÛÿd«—î³OÜ +˜½=0SÛÓù¶t‡p+R–Q2 S +×î":‚^Z½2ÜÚ÷¬pkÕZÌ9™Î’E±n8¶Q¦…Û9Õ âÁ0ª…Ç«RÆ|z+7Föë[c}Π¯_n( ñȽñÖëè¼àÓ,A£…M&fì¹?l(Ž¼ŒÞ  Y=¯Ç:ŸñQ÷ß>üSbl¸Œ¢DÇ>ÄNˆsuÚD´èù´ Èx3 ¤:œéªÈ4à$fOxϬ}È¡`tŽ}zôéQ¡Ö®;Nò{ÒÌw}Ë_g‚ÀÔpÕÍamS¨Y‘Ý”‚«Ã‚¸PH‰rWæ‰Ü¼ ëd \O够 "W+,îʑ( NͅY'¤Å¢¹´ü‘rÖP5g¿•º ÏpR–jôR¾æh îî`Duê9¹,i¢é{͂BG Im 9RHâËÿ fY9WN¨ÆÎõ‡¤ Ãû9Øv<þ À“XˆHqü‚3‹eù ²à©±¼ÙTTÐïu'V®•ÔÖ&Ã@DÍh·Õ`°ÿÞ;"™œø¿oAwC.…´Ž‘‚IoC¤ÙnPw©j€¾½NHœÄ½äÐ+7ÌH'2vå}œó¶³Ô(èý¹ñÔ¹¦|AzTH«wŸZ94g̲Ë7&K$Ãæ=GI£î>3 ¼±Í­"kâ^—gb‡ +§+¤­¯Ü<+^3E>iì`=¤?x! 0Ú:©­È`(5ÉÀÌ'ÔÚ·Ôa‰™=»9EJ;8Eçpt®$žà´ÞÌÝé î¹r BµWŽ2 I‡šx¦T¥Í¿´Ÿšä +‡é¾ +s•Â {–KÁô¶ŽkæUõªmHqùY»£/êÌÒ\‚½¼^§àOO:“Y7XÆÎÖ9Mk…å‘. Óéѧry†W *²á>C|ïÊà‹º÷Ƈ;ǵßq^LXê1ÐÀÎYÒM‹Þ&Þ÷\ñHg׆ bUÌ‚(ÆII¡S3•ãµ; ¢Ä–$†MQwÀHþ¿B^šCûý26©'­à°fÕeâÙ¨9r>e``ÛãwЀ“XdOޞŠUËÇI¹ŠÿÃ6£|^«ÁÅÇ ¹ŸËJà³-òhHy­,w’'M6Ùa# ÒY2UäÜä'-}KlèØ\J‘¹‹ð®wd1Â;|=bÇt5yížÎ‚Šì’:HÒ2Ñô¦mäCß~'“ß lþèkƤ}J1éC!cÕq”CvÞk¯÷°²YxUþµJšÂ·¨2üìjó¾öM¬‡¬„Åac Ð(r­CC†b‡”hÇݧ’–¹—Y‚1-ØfÛ¯ýòñ{7c`Uíc6t;ò‡•‚a™í—†Á½¦)¿<ÙÅ%+ŽQ’Ü%¦e éX¦Tš\$xcº¢;Gç!À$•¦} ¡¢¯ƒÛþßóÂA â´U(øª‰qw©q†ÝÀÞkà>ù–Öiʘ¸E“˜ \zÕ aX• +Š"¶eÄ_ñ…iÊ䍆¤2Ýä¹LÕOÞÚ@°R"cÝè@4ä¦zâÆ6 +!«;b†Ü’›7²Ýøo iÊè½ 4A(7 Z€ ¸™crhÃôdSùHþݦ‘ä{¯1xyaˆ_”iAìVK[›…ÀPaϨ¤üÆÄ.i}±T{, £n«¡‚6@9Ξ÷PÈürsO®ÌDx`…ºÐ1ž„Ð!™ê0£6;,o†bOÿÏQdÀ3ðïÚ×ib4 Î²x2l—AhÔÒªÊJ×ncÇc¿A4¯ +큡›éeú YŸ²³Û*6#¤ŸmÌÕØc ÿµ’Ãw¦›¦‘a%Îî/´’‘—µôdùöbÖj7L=—kÂ8£¥ ) ¸2gÅ1ÀNêâHF†(€äœæ/ì”Y+wý êNHEÈO3J€"k¶;ñ®Á—1ïN“…Eì¼DqÙ¤]%_¼p™v *+1ÆÁ2Fc‹Ì±¹” ˜ l-ØàQ?°ŸGã Íћ_7AÓT舑!]ÐτjQ®«è߈yaՌuØ/ܹf E­ŠÃב…à”Š­}Åh_P"Ìý3&û÷RlÃÑ)§Æ=!§>xŠŒÓüú ‡T•I[™À«&˨m((öݕƒ€:Îy?äLâ_;^'@jO SÚcÀô`±ìº¯V©ë‡Ô‘Ìk9TÁÉm’`Büâfë"y€ +–w{9ෘ_£7Œ3yºxídÉ# ô—-¿^Xá;¤°_"+f˜…ÁÈåüÓ\©‹›|H“¥¥ E5È*®®˜ŠFùt;$š>Ó8€ó?6ãùËe@Ef„þ[-氂o¯«ËªËè mÑ!íWÐ[ÈD¬âñÑ%É®YY­[ +Õ“lHWG%(+@­›ËöT>y±Ÿk7 _íüGWÀüɸw]‚wdûa§Þ¿¬¬*اx_r¨ç]‡ÁI/Žø¯‹–Òm‚Æ:µ,6A +Xã¹ D;‡—Ÿ\ðiñý ‘°&ÓM¹Ë‡)ïScÃèâxIhXƒÑñƒY™mA:^¹ùׯ–¥A ‰„RCTó=n( +D€ÅÎF†>\ßfT'ÎÓB=ê˜-ØpÊdLb¾o$ô´ô4”85ñàxØ WDE~!/@H qõÆp+äÞ¹¾q +xà +;dç/Ç{ÃÓ™(@Lop6 É @1Ú ÒYV‹1*™¥]¹={â—ä1“VÑ;&è›ÁZsáˆC#YPzñxJ¿yUýÈPF²90šžñ‡P +gÙèΦ™ÃGK`ûc`ŽÑð‚()gN; c6ËV ji±·ã5ÔJÔ~f=Iä>§BPWÅkø^›á¨$r€¢èUøْC¤ž¡;>©Y…ezÔk³]1Dºª E“±Áº’èO©OßpÐÕ*âL‹/±/9¥²á¤ð' 5ßÍ8¨LeàM ԃµ%8k„s–„œŽø–Û‹šÝ["]q¦äBd˜Ê~ˆ¿ñ8¶éãEbèW&'sꭚãC$iwöÀx¢>KS”)¯·gï’M¥ìY ¹]ú§Èv« úôv`DÍÎZ„,‰ ‚ÃÅÿ¶>¬¥ ®P@³6ð·c1×ÌҌÒȾA·çÂ#"؏žÒø ւIã h­kÐ:ÚÃD=rã`…°bóì¸Öǧí/X'}ˆ˜ÉⱸnxůbáÔËn8WŠöÔù¬ÜqŠ0ÀÂÄ€2mX£ÃX”Ú9B†yVÀþ'ÄKÞ¦®øŠ› GßÉ'zgޝ ±Ÿµ¥Í¦þL‚: ð-7kôV< +à]þ,ƨŽ’*™:—ãÓéòÅ ³{'¶ +~ì×êL0̱í2²sM¾—ôK £—’ITÞU÷;œ€ ­VÑ{Rä)úK«ÅŸN8ÈlÃ_£yKˆ/DèIš© +-[܏4œW‹Ä»ãD’¢cºt/E+s/UØntDՀr¨ÿ(&lV{tz5Xי1‚jKÐÃG*ê] +„Ù(Om+Ÿ’¤¼t„)Œ«©tÕtƒì‘$Š´à Ý¸‰%ž½D¥bmÂtÝd÷ôí¸[+ˆR{çãÀÓΊMÅìt¾™ù¶Yû.éà(ª¡ô¡a< göe3g?¬à{´­Ï-¦±m)0aÂgŒþ[ÿ»ÿx;†D3+¤N©w$ +d†Ú†Á.v@Ùù]pýÂ[Jµ0¯J§ëÇ_R-ÒZÖûüЙíþÄ%LHî€äêoÄ©†Ù`b fòù.¢3Aˆ¦ƒ²ösÞѱ°î©7ÇQ6zŸ”eCošƒHK:>Ž§XG.Έ¸…[l€æH™fq5ǃ­:cQêŽjÊÀú#—¬ÅzŒÚ¥^֚ Ù›ª–~m9”c‰"<˜õ·•-Žúd<èí¶RQýÐú&¤ÖòZU뙜G¨ôÔT1Í>ÏhVwE( =6ÈÊ 1 +Òxêæ^«:ngóZrښ0Œ6›'~ÕUrGé]Ñû\Ÿ î–åàK/¹ê+jׂy~²%e+¤Ņ‹íœX•¶üboÿ ?ªrÊhrdˆ) p°â¦d‡‘#Š€£g0°S’úØ"=YDFOTýK1ïç˜PÊJÙL9®âlªìʋWÃ5 ˘ɰçÑYªwQÊÕs…ºZŸ“ÐçÍå]b½n›kX_­¥ ânÙ+ěOØ7ꆭŽÄóýÈúÕ-ŒeëµÈ>0Ù÷ C³éGþ‚±wZȱ¨r*Éo¥ÁšÜI,Ëâd|R†ÖŽ×âçK‹Àl9þíC(Žµ¤Ãe5 ä®ÖÊüt×¢¹{¾¶¯µ¢i¯ύÔôI[Å ±³ÛP¬Ð52aۇ8šÛ^ÕзÉƘƒÅëþ=]v\'Ûæòlâ% ¤³7k¤öø’DvÊdO)y‹…k‘9ÝâyȁÛ^òÈ óúȶ笼ÃÍQVT’Z-‹Qož˜ˆº¼Æ¶[øï*ÀsŒô@trk²^h†’¢óx(Çîìeö!í„鬒«ê ÏÄÁ€û”z9X’r#q&T1¯ :©®“€;^3[lò§3Âvë°86U›ïÁîÑÁ­ã攁„s„…á@_º[¿™À,@§ôÏyixÑ·ÙMU­ι %2L–§=¹ª¿7Vïwíõ| Ø":èwi«8˜]–u·½Ð“ÒçH×iâ†À†E ¹— ©«Õ¤+< Ù$·c)à + †àBkÜ'Ô?$êU™·ÉðG®7(eJ9_Ï)0lW`Õ,lŽf nèޏÊÁÂÔðk€Ô¾7Æß3ü½ù}Ķ˜ûjæùüÚÓDä¡ÔÆháà ‰é÷>=“Y˜Û¯_é睙Evs.ÖO§1ATþ'Ͻ8Šg¦l +‘§_ÿã!â*5Á i:6ö‘³š˜órOƍíòNïÅfâ'ùm­(“óèÝ>{u{ð¡Pϔv^5x:ñ!×ô˜l`GòØok[/²dòÞÐüx‰ÍHãdÑÚäS”/x²ÈyamÛou½šT’Wuµ 7yüðD}Á(:²Ö ‡¾Í€©5¥Yˆ‡½°ŽˆÞ}‚K@JLß°:vÛ@a£F*ßk©fÀ±"IY?ÔÂD ÅïÅwgÊz¯³ˆ»á|es™Ù ˆE É¡¥LÍ@qrû¢±¤„-'YÛØŒ(§Ô½¸!×W’œáÉ+07¾ §•nv.ñÀ룼0Ö«!æwÌÇÎÔàÕò/Ǖô‘r çô¼B›ôË+®3moÐ4^Kvâ­[Ÿ=ÊaKè'ÕüìÍàÁ-î­fA©gw¶G›mvèîçhoý#F¨^ ïpc÷¡3Oˆ'½æº¤pXÌsZoã¨Èd5ñfGuk“㓲q©ÛþFłêÞíWàQ"…q=,?é6Žóú¨€q«¾9½¼kH¿¢_äÁª¨ÅP´‡2*Ì« ú†·¡›\3ÈւDž=£Êã[ŠBËú”Ä ‡ ѓ×hF Zóó¦Î¬M\wϔ¹zéW…5\j¨"—cõ8F —’2«‡Èií—ÒV3y¤âÊ9‘ßõG_RQ¼nºdì‡Ic+Gɜ䇉 ëYÓè¡ñ“ĵ£QØ`]˜«Ÿ+}OëÆ^ÝYÛ‰ôJ&°<}ô!—80Èó:¬4žÞô挺üɾÊÐDÕ¼Zl±ےªízçÁ˃")Èv¡ÆsŠîf&›wñêdZ­;Zo>*_âÆ@LKÍE… +&¢w}ç}By1ÓXMBZì-$ÈN‚¾m3 +W ý‘×™º'T–TB]¦ep­ª=äL®&®Rò{z*—+uk‹ÑNàel™j‘”Ððul$Öhw+‡|wg­"ʓm(¿E>¶ÔŠB’â}V™Ü’ïvùtCIÀá%Ùúš[[ï°þoXf²,HY‡êÉщÀ‚ǘîeÍ=ÆÕúL¨â’Уt†²Ïȍoõ9.:Á‹î#áÐá,B0 A—°d–âzR§ß‚]ìÛYp”óa²á ¼c&#Â}%L˜‹:ùƒY‰„eºFg¶dà‘E«AxCz:ÖàB¶&‡˜Ü™›Œ!>ÁW‘ÃТ¦ +?Ò:%ÈÍÎ3öò`·œ°êhD3W„±E0ݚý3$}&èóÔéËBhX}Œ"‹ªæ{ø…¶è qž]—*DÒò,ƒ*m†¿ÖÚØÔ»•ÜßÐ-MÑGþ oVáÉm/ ‹µõéݍãtfÒ@ø7»ÄMÌ!é¼Er-_½%bÑeD œ6]ԍô´˜gغ³ÈÔÅ:Âݔû·-1‹al+Ø áè"T×:2«ê÷k, Mf”\2žZ¤#/Šä»D?ŠaÛÐô½ðáN´Þ\fŒ@ bâ9±½o¡ø^V +‡ÚE[Œ>Ô +±~x=èhÞð02ʃZÚØR3ýPF¶QÁÒôÒ{ÔaÌt7§=Y¡rœ6Eô“¨&O^gË$U¥Šêjs(ôÈs,ܲòNl ¬²ÈJ³¬jh´–¢zx”Hd¢éìx¸¢%‹(fT:ô1Vw!K™t³<×v]†£"X°U¸ˆVe‰ gËv¸°Tµƒ½< +îÈï1Pµ’9b²³Eé`ÍÐLDzrp!ÐHUæ +‘ŒP1è–P†½±µšHf)Ìö\etˆcøìÃZ1&°&ŠÃ#íù{2ÐwXÑÅ,ž79¸X) „pÅ"ø”òt:yÐÔ}1Ni/ƒtaUõ_aQKjÝt_É«´mû&½ª%M:¥< IôÂÍ]r/ñžæªÖ­êªÞÖX»'º³_$  Þ÷]]–Dãg_]ŠÂ–£†»©…¢¦^$ò@«VÉÄ#ÄÏDɨÌ×gr” ó›ŠyQ´”®Á(¬QCí¬ì]¡p=ÇM”´é2·à§ê1»€?eÔÂ8b­¡nH\Wª!¶Pn¥s9²D6H Yûv½‰8Ïè+9ˆU¿¥ÕaQ©9c&YªqxGôÄõäwÞ¤ᔔÔÒX† Î>THµ5Wݛ'“XmÝE%ãg@iϒُ6œ‚ÌË9n˜Õc5 Iæ}4%RñöEËáÌmϖR¸ÎK¤„d'fߊËÓÊAHySr5d!ž{­íá§ëi9…$[8Д*öi }÷J3®,Êû »_Ì$¨1Ä|‰ç˜„3J!fm ¾Á/*iBT¶ k¥hpÑ6kãnvù„¤­®þ։b¼lÛ +á¥ð9‰®ïrUvø×ÜŸ÷¬ÇCò+ ˜J¢!8ý],"EþüAQ%Û6Mÿ_8[¢O^’:–Bí^ø¡{‚O5ýnL^±cy£}x ;ŸÕé‹*"Šïm}{缶#âz*.Øã)mf˜âZ~^7>gUVtj¯ÕZäj®6>mõÏ#½¡€ƒEzma<›ßêÇeТ’Š§9¿7([L|ż£¦²(oǗ)Àf*v‘r BŠ0-Ëb„kXAüua• ’²­Gá[dv3 Êö`µ ÿ¸}¸O2&8‚Jé§ég÷S«^°Sˆ8 °•‰BEOµÆÏ$\“(AÑ ÈŒŸ‚š|ÝR¥=ÖÂÓڝCÊ2Oy`8"I3·qñX;ÓZRßõØþ“1UNT©£½¬€¡Š•p”òD[1çgS¡GÜ]y庛ÞþØòGcōï耋Qa;5—¯¢‡Kƒj€úù2KWH<.…d½ñíi6¢ +Ž cϔnGáŽèÆç9ã#P"ϳÞ4PÂÔP@Ló@é‚üÓObÏSîþYLÁï¸mœ¤/XPáD_`¦1g¤º‚²9Ž+hAH2źûñ-­Ví!u$ ±zœÝ-‰»þ¸ªä:˜ˆ*zýœAp£<¬Á¾¬ÞIà@‹4y€±¥:]H)ÙÀö¬b¢lô8¢Õ¼´äØ×¾‰G¸;Mºî|o€ì û‘Pc͈yȁ;€ûŸV͐eŸ·ïü1ŸTks„œ<¤ö™uƒ@Eq–01##nDû¨ :AE^g;:GïLX­£Ö]zÏÇÕß £¸ÆM;ÍúùÙ÷Eª:Ē—*»ŸF¨G–‹³²B~î>Pœ³ßÖU6T>Ëß Þnã«K] ‘©:WÒµxEvdÿ ȼ>î€Ma:FgNøat½‡yQš01(R»È®R¯D[0òëзE:ÞdZ5Ïëªäf:Øk÷p. Âã´1—†wØ:Éiç;:/:ؽÆ蜛 ¤¬ƒ³²©ö–³™–µ‚¸û©EÜQ´·­D)ŸõÖ« Ü P„Êž°®rEÅ02XyWóD’øM_fZÚފ}¶ÞÚE1ØÒÈÔ¨OµØÛ9úGÐbN¸Þbüþ¤tD£zõò"‘¨0€.Á]†c¦!VÇÕÆ B<K:ý_ЋþÌæ ×ÔU·®ˆÈià`bPà›L…Dw3æõßH\³¨°…ÆM<ÂؓLEVŽ…ådš•–|q‚p‚ƒ(¼ÀFfÓ}Ö·êÕ| + +¥&6ð-Sp&mNM.ʐP«st“D• •G 8*]ù'PG2N™ªB% †^x¹HJ[ IᱜØl‘Z•ÞùÊýÃ\`j8™¦¦A/ôäâ´5éÒDl›—©Œ*X:k÷|\৩' ö%Ê3ô>ï»Ìø˜ ¾_—•Æáð*ìrZs®¤'»ìN(”JFGàÇö¡ô60BÑíbזű¿![ÇBÅfð»w&€æv¡¿„[0ƒ ‹­a6 +Òï¡¡™Úž—ºÆ㉤ÿƒDà¿A;bNŽ‚Ø2Ž1ö“‘f÷3B…gH ¿Ö¸hìĹ|õPÝNPLBö@üì4¦2y<Œû[ Ù$v©.’SX~¼Á ‹Š+²’AF¯ª³@­ƒ€û;ê‚é½Q‚/@Œ}k˜’­èdÿ¡)•™À¹»`\ö?[€TF\ÿnüƙ9ò(j×2êÄü€ËýAkÈúû YôíféY5!OÊ+ªý  ©-¼#<6ÙóP-J2ÚüZɃ'†íßrN¨å67®7Öa m÷p`A”ÿ2 +4~Mµï~"’Ju(Û]œÝ(Չ˩fZf#ƒ +ÜçhHrã(b2ç^ǶÌ_Œ…d¿ÉöAO‹»bïq&!Y)x¤?€†¤OáO¶t­Ö„#ùe4öb.m¹Ã=Rýñ:pä¬â‹‚Zl†ÏêK†Ãá-ÎLS¥ÌpE°Ë+‚êú•¥kíUíbaí  ý7vÙ6@Í»d«^swêG4Ì®î4€uÁèç¼ä|<•00>)eŸ>?=ƀÏidð¶t·/zé%5}ë Jæ‹øÁ°#ìp6A¬‡CõR´²ZïH1ñoŠ×&»€Üµ l‚nbØËs(Šià¢Ó 7n²ò¦–}Sͯ@ìÌl[Ý#òe' Ú©aüì03qúòo¬þãgš”&À4¤pː4…iE̳é!?JŠJ{qŒÞÒÙ'@¿„ðbWhãHÊ=þIãûWˆ2I%6K$§?5+¼ÇZ¬ö{Á–Vèl§mSéªF‹ˌ°Ñ“-n"Ž‰ASUMø^êXu±ñ(uèžÎghfD^y¯%³S²±|@¨Iâ9íµ +¦Ü@-ÆKÂ\wLØÀ±Æ¶£â~-à^È+‘ý¹oo”Ž„äʤ;¥|R†Ì}Œc[.:¡ +FŒ¥o ˆbs¬= árÎÜÃñÜP“”¬GÖS:`äß X¬èÓl +³ŒkKe‹MhdÙ'Ú=¤'¸€~Žb^Á¬§~Å!íLäµÙ¢`ÈtàC·óó-P†éH•µ£Î´ ¥°Õ7=Ô^#„£«šëLI£¤JsõG©+ë:E_«ê£‰©4QBÙú7 |!=œ>'òVŒ¥xÔӘÀí¿ÖŒu]Ó‘£ªÖgAžHçÍ:„ÍÊ÷‹‰I +¼õÁÄá=¿Ü @Õ°¯™7¡™öâ ¸‰yŒú×ZÅÏGu’hŽt{×ܶ#xÛGÍ +Âv˜š*ÏHˆiŠOÖÏ'Tjá¶àÜPÄ©•J«þÆ­-ü/Ñ¢U§˜F…îñŠÀ‚ÔÞÏ%`("ƒI|ËwAKÜl|ZŒ[$ëGÈ2ƒûdÓ¨ö}Frn +Êý\êòõI k: Æ+Ê£˜ŽV­‹£Ü…j# ŠMz^3L^–Ôn°î2ñâáísd{D|Ÿx&D/ ÞzŒCpð,+Mïkq0ÄG©É¥-qÌÝ‘]œBì>rddeþ4[͉ë<[¿2)å§$ÁG²¨#bEN4Î ëð=…EÄh¹‰Ö2#Cœà÷"ÅK•¢o¤à9™â=°–PûÒß0'²b›ªn§A)êÒeÈEi‹D|üè4øúê#Ù¢×5ïEŒÑÔ\sø+þ†–ÈùlrB`ҟNŠ.É˒»mš‘F…qB!çL–·ÊóE¹«6b´wqdW(7ÇÆB0Ì°Qg–²BiJü,†“˜/™Êtúàў6×&·4ʲržúF;«:%ANP•>[.{íۑ4ÉcÁ±VÕ2ýš»œŒ„kœfAh-ƒ£yçósºràS‡Ac&ßÏ­%©?MpEè!…lõé;1­ß â’OñmÀÁÁð'ýޝϡéc,ŸˆÈ\éQ´pª–´:%䄞2 + Ÿþµds5 îME KòOVq_mðø0k”g@%ælÎ9"ã#N¸/ǚY¤j^Ñùo¼*fiy$U•Ðͪ5¡£šÆCtåý(‡`VT³(%zu%’¡)v)Ž’Çì`Ó"»¼²LтÓHd……ʉ¿´ø僵à +‹}Ï¿$ ë}rúþ’ÄóSi—é&ö Lñ0օoD ÕH\ƒi½ µÏç.0€@0¤7°IóGóë¯^¹hñH¤¸Ëœ +˜6«°UÄrš˜ÈæÙ²Ñ90ùRš’ÁL‰70ýv8N„1~³ìäp¨50ÁÚSÊ¿$?`>µÀDÛ`LHk™•7ˆEôƒ h÷¾ëòÎ_µ‚ÓÒ$È;¸xoæ1-ªo5(»XÕ¾œ¸1UõQSGk…BxUu@À:uvŎA  }:U7¿”ËíÁªs|<ß„é²U¿"ŽØƒ²š±Tï:ñ¤©œíÕ_›ÄCäyYC/·ŸqM;*ü4a«Õ/b噽rՉC§ã°êlw½ÛIÈF Äü%¹êPõõû×ùBréÅ3a”áýJ ‡Ï|-ï¹2Ô±£ÙËÐA Ó©_Ln¼F·P þ²ð»Ó«^½™‰é)Lô@ºCcb ‚!²;R)ï¬z‡vç:Éêi†í¡;i" WËÝ-–³'L!Lû­ »õÔæW1Á…‹Ÿøš3Ñò/CÄVÀãœ+U¿ièAß8¤Meªl9BG¼7ÿ OÍõ½ÿlš"HÜ4—%„.íƽLç\a1º•Â„&‘@ñÝXŒÁ3&TŸ ½èªJ¬|¢M}é)9dº­Å1¨¶j©°²ÿuv›Æœ•äA…Æ ["O—qÑI× 'N–¨ ™‰plÌà$fgM®ÝÖ%2…Ÿ˜D26¹"poä©ïҘ¥Ë*vþÊéˆÃG”÷¬·Ü_¶L:ßÖ@¯K£Î¸2ˆ÷pã8½ úR\9¶•/ó\'uwD/çS”ìât!¼•ÞÞL݈(ÑðóòHäC:ld>j=À"QgDÑÑpo×F¾ D4Qã,áÿr^©£“ŽJq«ll›6ÙÃýb݂”๟‘oßjÉd²ù³,?ûÛÄ;ò |‡Å°*”·†¢ÉS²‡AiÌóI§.2ðÜÿ{û]ß¼2tæýÛuL-نG+Â°×‰cc´ïßctñÜѸêReÀ½L½u½‰;êªÉ¦ñ6fo9¨¨äíæ5üª­ÃåjX\½”°ÈFSrˆ¹Vwó14…(ªƒ™ÏÓ`PíøªBþú%U&;Ôèi´x]Ìa&æ³Ä#W¥t5¸e.!h#á²ÀS;å´9G†«}K«åÝQMUE«ô/T”™¼JIP0d* 1qõ>¨®:‚盃R/Z‹¼CfO;Þ¸-q—”ÍAuk‡7œTáà}¸‚KY¿Ãvµ›¹ÜêÒôÿû÷¶ëJˆ‰sÄޙ6©ti%U{l1ì2öI“údyúvdÐw÷Xñg©F€p¨Nx›Šb¹ü²|“)˜xãØ<7(`p•·ùÚà“ðÅvªê 7gz[ѪšÁÜ.dÙ&35ÑmúøŒÃ +^cy`¯ëá¿44ñåˆl)G¢dÒ{È)ð€6ø¨‡<„—Ë-ªd,+H;xE$jcó7z"¡‹ÿ?GÄQŸIa‘ŒµZ$I ãšÂÄÝ©ÀQÍ=és/­%\ÜúUJR I‹ˆ¸¢‘¦‹›rXòÀÏQÔ8j]o‚jوØâQÿÍ:ôPHü’ˆ÷Zc/nðøëÙH‰gʉl¿›`4u´;ZùCàm5ä·Î-ûwüï‰8ÐÌ¢ÕsÚFüÁ¼­…è ‚ŠùÅ'VoIEûFçÏßmCõ: Wøäa—V±þÛI¾ëìX¾bûŒöƒÑ„±|Š¼TȲ¬ÆgvÃÓ}sߺL`¢!…~¹‚JÜõa€*jt@4KÞ9‘ë€õmº×€°ÈVåàŸö@屁eß f¶9ôW ØªRCêÂÑ;j/@4º–•×o-LëÑ +óכ8©„­´u@«9ú‚Äõ¾½‹„ÓFW3 I;þ÷‰<éMäQˆëôÌ]Ǧ²ž–x>]'ڙàͧի бpÇ Q²Ÿ#¿Ä{/¾9€Á!û¤‘:Ãh_tB‹"Lù³¾ µO…•rkb¹zˆÿ˜&]×ÇxEk Ü¡ÍløA~þc%q(¯¦ z3ez4j?îîQÊûŠgW”â´ Uá|,‘ÃßE˜ô  d&E¨Mmq öå鈹շ¸ÈœamêcÿÉ֝uØP‹¼óŸ<ö—r?a¼re¹o‘ý­¾ëþM.7[:9F÷> ÿÆ/­*ˆ§IaIў6n¢Â‹.•ÒJ‰--äyÍ<À*Þ»ÚCšZܕÉù7Náa˜—{ã–P§ñRmjúkž/k_½­b±•QÖ˲g1·’ÐMõòU‚«ïZáHm÷¸‰ókUr„b½Í»˜º {¦…ÑÚ#ˆû> üïšoð˜ÅøÞ`ç°>h §É1Ím±6šIš¡%)þÒJéo ä4MXÎ]¾¢&龂_5Í41KpÓ€ù+X"<ý¶2¿Naï”6“– ®Y²ªG_ڑö4ƒ>ò4B +NÑÏ©SžKFÑüòQxN'¦©ûézQÞâ¤c _\ šìD¥9=WÎsî\ÍÈ¿˜BãJú½¥(¬B°—À|KdkýꊽI¶®Ú?!lÝà€Á‘áÏn3øD[$¬n>Ï ÚÍGܤhwUH΄2#:_7jìÃäʜ<>y¨KéÔ4’ä³<N òŽûRäVµûv#]¬Ø1Ȓ‚Ê> Ó@mB0€Œ¥f]U^×Y_¶A¡Þ«›ÕW¿í6êÓ)Ðe—„±4[4+ìŠ×¡Œ®†ò8FEÍ­±Oª Ý 5Uš°Ù¿‡bú\ïoµ€ +Y©üÛÄvù9~ ¥¯Û£pè3sîlvŽÀÂ;uS{êW¨šobY¹qÂßpܶÕcŠó~øò‡6Þ×VoÖ±å`óUԭ̔Y—G0Ís(¾A°•0+FG¢Ân¨nÃåL9L„èH"T¡2ÒM\[û*¬˜«ºKâÏ ©n­ž=ø¶È(Öø¤hóZ -èt±…ì–BÂÖY(2§ÄªYQ‹õ§ŠȋÑ;›Ãf™`B¿Ç÷hª“[D<ãÂ\A`ìPþqܼ'Ÿ©ÂU–¨ºŽdgü/“yàÝ´ùŸôZ¶t¥ató†jÒX‚±ùh÷2FŽx +Dü¨ß«|4Mæ_±{#ìôF*ÓÒP‡ŠÝwRÉ;Í`ýîÿ8HþŽ3(ÉfÓ€Õ ìvÿó]à~BßÆ7­Ò|ÿàw„Éè9bLÛz®¼ kÄ,Y lŠ€ë,:î,w±¤–Р+cpeã¥ƒ8—^L6ÝË°³YL<«H Â9TÅ ¸WN>ægy7|¡èó£Ñ®Gºf,ú^_F›DŠ t¿“x‚MøÐûÊ3…[’”ºIXgma¡\ÁÊ2¦ü¦Ó@<'£i˜Øé@”Q‘I!±w@_¡vþ§ë†ÿê Y^“I)›d/’£Ÿ~LÛ½±—ˆ +a¿Y¿‰*Ò¶øöäX™µ@™mbª8ـ(ÏŽ +¡ø>Û,BgKŽžvhy ûv'(z¡ŠþXAöhþ£“Y Øãäd6š½€U®/MfÉ Y©‰ûµ‘’(³FãnÝpµÈÚcÁ¨­Ôے|HUpI\Ã_WÅÉHp«ŽNúQ¿ã'"? øwœt$SúÐÛ A¸ó¿·¥:Å(¶I¿ÏÌqÒ4ëš^Ó.߅Óú«Ð8¹ÐÕ‚©)iïàHÛ!|.FÈ ½¶Âc¶–¸%;=,V¹§xÝÁHÆõ£„(·,£‰Ä¼TΖÁöí 3b‰|/•òMžXWo6F‘“¿gJD• ·‹9§ zž3´–Îì 5³´§,\ìä˜Àч&ûﬢ×hí—g;†6©™9GÕ,íC~ƒç5´úœ uhXäEJª]‘¡·Œ¤nޟáìÌ8 f…‹ě<¢Q4‹ç`æ§æ¤Ž³ÐJ‰¸Þx]¦77%i`]¹È5RP+aã8È҃Õj=Es«BG«Y¹•€ª™nRóœ†Ày×eËö³ûƒœÑé¨/D{ČÓRÍPÓÃ5&/÷ÄU©ð†æ¶ª +/úû6$íSo´+³×»(ÖöËüÂvDÆ"!ØÕY! 댶¥R:Ð}tG€ø|G˜Ž¶Ìd‘°8ŠalÌy`Ç÷—ïîÍJo¨A6|BrØ k*¯,@Œ<—]jEÑ!+* ¶¯‚FVԚ[9š_Bqˆ¡·ÐB)ÙnÂxsô–A7n,kþ/IF¿ZƖ&U~Ânr‹ÝÌecᦪP#ƒï›„ñð(àÏX` 1°Œ#s9ƒÆ.äÝ ôå®ÐО¥cÚR$ðð¸ÝÚ;•¤ýW䦂9¸má®t!W!´nڊ’:Ym<˜§øC”ÑnZü´±±³Ï/ˆ®Ró ${}wk‹•˜B UEF›U€Â€}®$àXVëÑÆ×ÒjÕ/J) ´È=çª~b-‘I#Dš½ÖÞè ÂVüÍ;ú›¼÷&èj‚WAªS‹6Ü8Ü3fµÃ€ ”^Š +èÑЁšè/!¤6–­®÷¸Ö¡®ë“ªæÙ%Qå笚Uë‘ÖOo¾ÿA„–Åú)·ÇEH´0|]=ŒÕFɆPãžÀ­5€VáTз€ÝÚb€!d ØMÈ â‡Fá¡ó)Rí›Dà%ˆÈä4Å:mÆw¹“¬¸®Æ@¶‡7¸xk¡§:Vgµ-í€-¶é»®4ÔÄϝ˜D®„‚“Ÿåófò›²¢¥PYÍÿÄ`B—©7¤]AßIÑ2{,i +¹äG&~ÈZ‘µGtD7Ó¥ÇG úlW$O5¡Ñü ÓØ¥jü°Ÿ´îGãêg²A·„­˜÷u‰y‘•½TB§H‹‰…mØÊíKã4Ÿ~ª®Վ-ðà'0ÏݒêÎîSó§ +æ¨iàJb5HécnÍ¢gÜðˆk¤¤È¡o‰æÝБõÝrñ¼í%ˆ©]X#;ˆ %¾3~C dÁ÷ë¬rQƒ1q9j½kßWV1þI˜¹WA†ó(Æɘpe+Û¿}ñI±ÄFæŠùƒ€ÎÊýMÝág¸œœ¾×Sç@÷ŽPúáIÆÅÚìt5cH9˜¬pÁþª5Õpj›¤&D7Jù-<_c1€ÙË _²8kÑ + ÿ°,^ЇcOõsuhh(bSZwòêyz’¢ç÷ØsC!2Ð-ãfLOЯKbôþýëڍžÁ‰K%<¬·løŽAúI/x!WTñNrg«aâÉbÒWnÚ<*.FñoŇè…D«…‹6<Ž×âԃYé%‘lF“r1•€å.«×»>.]TÊüycU›t/!r;0Ó%g—Ž"©±p[?è&Ó+t$ŒWSÀs24IrÐüª Q/êÖGÿ;^!ÙG> ¿+•=øˆ±tA¡:q𠔍zãïVt×ԵНq…FwëpLšlÁ©Ae}^U£cŠå‹º•É ékižª]Ú¼‚"Ûٛ3™ÁÏa]­Wx‹ñ‚î¾ÅËP²´S£°vY%KÖx.N¦hîµP`™7ÖP5s¦Éd?Ó®Ú-f°)˜â1bM•GÎkhž6F5ي=$'.3ëŸâ2ëEìè¢Ý°öRW‹òójøs¥zG8Úäöóœ˸Éíž2Ô}z¾É¿ Ûºœ$ÓK;Å*X´oaïK •pÀb»˜HÂã£æ[R –v{—!¸½59 +ªÆ³+Òuah½,r@…¦Y»ÓÊ]–Í +MrÆŅS…%Ðuêç²²XøòGN–úy ÝÉFºv˜xjÂÃÁŸ·ZnÔKrZá ôŽ­ÂOÂïVyЅgórîÊ/%CŽ`agcþü‰³&özï³àóž8žO¡¦Š:3ƛù\„7”«h¿¤ 3æ÷“NŒ ;®iøêëðK”ÁÛ-S_ì9§‘ÍëAb¥;[Yüric3àÒÛNúvqåë~'˙jȅ”< ±(‡ ƒí¹<•U>²£`Sßí5Á¿†4¤ÿŠW5^4ê ¢T6O=š=äÑv#„y©\r>A–’ÜRGm…!êvº>PæÔ4ORÊó–í}ë9"¤V)M«¬ám‘›ÒÒˆLâœ"L5t{N<\º§O z:[|`qäµx1>j†é©.ïYÚ¿wʆrÇ? ÖýËÁý' +Ay$Ë6àÑ^’¨ƒ‘ +AÀ:¥ ¶Ÿ+ýÌãÅßå1Ñô˜‡Ôƒ0œF »ÑxM)ڞ—m¢½–ŠŽ¾Þ¼‰gVÜm#j:F¿dtäwÍ)bõU(&£Hä[}oòç™."ôáÃYäùe%5TÄÜ'3[·†‘ÚY„Fö¡VˆÈ¹š‰ÜØÒ肓BL~RÓ£R)–ÉÈÈM sãhåýv›GՔ^Ó·2ÐÔfÈc0¥‚n Yšn…­%Þ@£š1º´³xÈJ’ýM]¼9ŸL@Aù¥¾JŸÓA2‘E† ?Ɋ,tÔK 3éÜ'“Ͼ,ɨ䨦5 ¢$ÊùŽäKjGGô~*:ô)ãã<ƒ…÷b—'Vš&ͽÎ¥ßwi;nöÂ^æÉÌuϾÈB䑢Ϛ‰¤Roä}³ÿ«ÃG²Ï¡ŽœlÕ"û·JZ¢ä›V¶‰F鬳“ò2‘²ô+ßìݵ„Q­ûó¤ýP¶Ðk$¿;Ln‘;Xµ€TrÜ œ†[(@|Òði2­»X§’Úfßãö7’Ï‚Q‡Z•æ¡qQDNª«~gä•z%Z4 å˜îËyé®Ã)ˌ÷aT pñ8§%CG±”KbL±g¸ëEÒãÎ5@jNîÛì(v‘º­Ykh]aP0ÔøiéœOí_Ï ³ ®x`Yq›n¾Ís e[áÂ%ب¦Áõ\½4/*I¿Wè>DÏÊÜ0qêÙѕÕ#u̬©®H9†¬ ÷=!9"l¯Ó3óð(YÞ'úÔ$ €â ÓÖøCùá +*QÒ-aTŒ+x$¤Qg~ì¨C&U˜•»É¤ï º”Ûœ¤ä ÝůïAЌ£pOKš"ZßQ“Æ•,4Ð;ðè¥×Á’ +@S» Ù®²»ÞÉTÍ#ÃΞ”I%>5L‡:E •°Ðv\3¥.¾AÅî%…{`g½^óîîZ|¿€ÖÏ)͵a( +P•±kxñØÕüJ.èvI‹®%u9ãQb㫶½Í'dBVÁÞ­0?eMÀïbîZs^ò]YåsØOÃãR˜ ºY'@c‡5gôÚÛ…–¬°nðÞë¦d}bFÜ%K•8¯:]a¤WÓ7Ú;ÆD^f‰÷ŸÎ— yùûpLž¥üOØ|YÕ^éŠ<©ÌA1Q±‰Ð{õ¿æü» • ã¹Hßiò˜%Jj_˜§.%*0žxs”S‚Û¿p]žÊb»¾yô7:Ó"RG¦¼Hü•xüHÿüG[Ž:ƈOvÒ°åäÎ{´Ê0qô¸ôFö¤ ?Œ¼Û}ãs¡Í²{ë*û +dhpË®c‘‚ÎôíÔÒÉgd¯Aꌧ³@ÃZ‰G'zÇ=‰^´O/‚²f à³2Q6BîqDå2R·"Gc7I•.¸×RžRÇ(#ÃùLdlæ°ùÝ·Ð1ûZ—,¥›^…+9,þL ãÂÃëCeH'ÔSDäRȳƒ„ÝvÙ(Á§_½9äÕD)¹õ^U5ÑpcPÓ@t7¯]'©DÌhŠ:vô¤ÿ£¶Ë#½Û˜þm¡Ì$¬âN·<ªâX¦Õ] 4)ÇB¿†QJ%gŒ@¢•¢†ò£\äÜÇßBl´»ýù2L‚gM:‹4tŒ{FL%§.qvsÑêÄ$!Œà¼+l™xw !FxڈAÂZÈ&\Ìß‹:ÜQêrñ8 ˜c‘£ Æ÷難Ÿµœõ€‡³… Ôå^ºÖæj˝ٝSëî¸H+g63° +…¹Ksx¡Rï1Ãˇ“ú ÃÈMõ*†ÿ}Ô» âÖ¾Á0Þýáöx0un·ÿ80[Jr?\.5qÔRar Îß ¤ð+”³V(œ]̨;' üiÔ'^N†Ôo%Œ.0C= á¸Ã 1ðøœwX ¡æ_\l¾ît9jWռЦ3ê*iY3 p¦Q Æ „ Œ&ª¡)J¨mÁñ¤4® Ď! P8Ñ2D˜}æW߹غɔ¤”I–—E¦rªbr-‰‰åbîa·D蝸ˆJAö…˜ò¬)Bi+Mµƒ s)lzàécNX• .ó¿*[Ê«x’Òè$ôªéœ•Rߑã“OÑh˜2|†iX5'!Qx(ö“j bc>á DŸ©ce1‘á†ýL­14õ¢vIÈPI¹& òō!• +Õ0ˆ£ŒNÿöyÌ®yM´NTaWêòñš3¡ŠÌ|¦ñ°K‡ª‰h/75žmçêkj¯4ð€‚P€ ÄD0€AA ‚o'BR”Zàþ ٜ±‹˜Ã™»øyòë¼8ò7jÆßá!òb"Ô-‹Š¸6ʼÞ(&J«Š¢ºL=,¯ ©ÍcÈA—PÌ ÙghòG˜èeïÊrÂÒ¼·Œ)æÆGjè=ñEI9‰GnŒn„ñò¡ Y~Y¹wDbÝÐh„‚:žF嗟aÉù>HÄq0hƱFëf4‘†–;vw+N_>éTý#!ÅG£Âi›‘U(.£—¦æ˜|/ºÕ1íÄê)Ô¾GYŠcÎu¹zN]*xŸ¿5òe•¢¡«RïÊëH7U^4T}j„ rT6Â…°IÌyÔQ˜>UmÍá9á œ‚b~¼@<,t"™2wL(åïuÄÞ*¢ÔXî³Lº+ˆ>')òLS"’OÕ°\ˆKêÏ:ä"áLLèê+ÄåQ9¦¨¼ÌÔº“Ïž2mQ&—ý¢“«3B6ݳêo]Ωã5žïÑÜu;\Q…j·«î(*•CËâMìmOñ•¬X§Õv!‰ª¯z¢r!òñ ‘™VB«è$©ÖìAe:Ʀ“¿K˜ÝEŽkñ)’”…=cF%Ôái¤ï™=˜'NkøE(ÑÎH –&|kÂo«k{ï$ˆÀ.ˆ[0[°}ôFâ"ŸDô+3 +êÖe¢¶“"Š§¸EF,_LºçB¿ãe)Æó9¨hB +!ýZyHh&Š‚¬# +çüü}ÅCãKâ1zU󪈬ˆ7™ÕN8õ@ŸÈêÎ`A/CÏØ®¡š‘Œ‰9g·˜ÌP(OHb=:±´qŠ(™nο*\ ++2:YQP™Š¨=*¦˜÷Ÿc(¦Õ™Óø÷˜Ë¾VÁóGC"ì1 ‰Õ5QÚêq?=Èm8ˆêµ#^u‘­*"k¢£‰ª@ô˜Ê8žP÷Hs™ô™’Úòyü ‰`ÖB½ \C¡tô¤ºš8I„C¡8Áõ3ª-ڌ&E!QWLð¼8¢ðJ†äŽ'2ÓËþåˆIÚ®‘p#¥­¦i۟;™4ߨ¢%§zI·Pfo¡UÁКÕL`5†‚]PV2F†2ÍKU"R2*º¨±¢" ‰DDS©Ò¬nØcdÜ[c©T)¿X¤2Q•8äIÇ•…N%®,6 yTIТˆ¨ÖUO%aØ»V'¬ ªÍJ” IPNoÓ!qfD¦ÞÝ3É¡ølxªZ]B12½‚ðL-#¯JJ%mÂg„æŸ!–”:ÆSøî™H—%4ùº!2ý¯Š¦òNOt~“«¡ÏšQ„¿SÃ:­3a®eá“d*"Uƒ3ÇZKª²œm‚e^†˜*të'™bÊ¡”ÓϬ Þñ +‹Èa—×{¡65ùÔh¸:Q]¢52i¦QL +é,¢¦4òÝqk%$ekŽ ŽokµŠŸ5ž Ã]çm‘TìÖÄ´ÆRՔÇaÈgƙPyŠG<â‚K¶zMðDa‘·†g±‡"êgÿnp q­i ªGë5¬÷o¤|óòÊl +iá&ÝGÜ-Ø*×û Wæ­é¹K™ÂD +™òt†\Fo‡¤CŠ3Öj’i*_fhVuÿ’EM7õ5é%¶&³©™„”ÚPöéIP˖Èf¨¸Ÿ4¡‡ôêÞâ9O3§=—"#Ødö|ç$±³¾N!± +œ|›©•sÚìÜ°&ÄHVñMYæ»Ì vßY†¬! ;žïFª/ÇYµÏ /ÑBpÄ]‘ eròÅÚŽÂç—Ò$‡˜èU‰Ï¸6gÝ5ÎPð¦IC<š„¼"ª”‘ž]êJEƒdªEEèîéîR«§6!"e‘š4…E>a¿- Qvfj&MRULí¯”ŸuBJÝ/ü×Oì͜Zf…xICRÁáx¾ñ¨ƒãÂ^Mm¼E„—rÄkT"3-0†¨¸—ëó!20Ì Ë:š‘™ŽX'qСk^ÈÔHAÌxÔúØM›R‹™Â ÒW +õ¨^þˆ¼ÂuÉ¥H²?"bu,ƒTÖe%är‚ýŠ¡"ې"yZªEƒ‹ æ#áGù6½®Q#ArˆF",síþ†+#ÒÔa—S^ì t(~¦ÕØ&.<Åårpá²L/ÿ|–MÛc.'³Ê&I¸+†ÌǬŽ5qo«`§þiB$nu(d%•%fä¡yE‰hÚ‘¿Ë`åâi”Q“  +èà&ô2q +ò`´$RA>²K˜ýT= ‹I¹ ·©/4žÌ’¨¡o¿ ‡dEÍ>—ÚêBï Z +³áÊJ&.í¤7'ZÍ܋hŒƒ¼b=ãPXréJA´‹cV£¡eÓ|Õ!Å]"ŽÄ ŠEÅ8jéÏNJµZhI}ÔQMBwq”í=¢ ÂSOSR#YèqM¹9ºfJxËÄԒÏ- 5$¤kâräÑñœÓ©’øå -ñ¼Q¦d\aŠ¤¸k{Txiþ’(º$dD‰èDë®ô’øü¬åœ ™þ# «÷“t° 9ƒ†ë cp|†ò˜ñYÁEy½!SÊP¹a5c`Ⱦ0D•L0ØL˜¼ˆâuxM^òŸ&†ù8µÄíD‰EÏ¥^Ù3ÁÀaq]sJÔS‹ô‚šx}6<¿:ê0×£òiŠé¨J!ꠉPëàP·OèNºÏœÂAȳõFèy{™š- PÁMõ¨q<Ӆ/,¥ÊÁr¢îøRáeº¡H¨üsZš»”Áóé!¢³âs׌å=ÂH†fȀ>ä<ȕ˜Z„Û¶c¢žZ,ÙÍ;˜Â÷ß)È/û[Deå,‘\r±+–òòš’z ªLWÂpdn¼¬²Âë¹cҊ‹' 2EÔF’HɊ=35Žáöb͏‡IYYIAA.ɪ0Ì,¤óÌBJ¾W‘Rè^‹ +Š&J™¾Šž©Q þô¢˜“ i(¤^J u WdAB6‹½y5fJ!äï4xáX*9$œ4‹ùjYº„ °Sb|"¡(›Äâؑ‡×¼,’è°„H†¥ÕbšTÓ½‰£ø}1"½4=TŸh¼'fb³BPªbjRájɀRãÅH)Öðg‡ W‹Ð•’óøã҉Ë2$ÜX|©R¹ŽT™ŽŸ9L¨3ú©Eú⃧†%ŒJÖM;FÑƉú"Â+*|2#ô‡T‘8^ô:}‚V¢-u¤TÅIT Å膌…ÆÜ\Ì·$YÂ1ÒUú…CllQ¯*‹)”Nòø 'w}õªÝ.!Y…jݝ™>²›Zª˜1Ñ£`õ ë+Ne¼ZÇõmŠ"*÷èþ1Ñ`Ÿ•Õ zEäc»”‰Ëa. W_Í+æ)bT ÙYjºˆXŒKà¡P®ªÎ]¡Z{LGÄ -—)Ô¬,²’Ë«°*h$NûØs¥j¡bU™¡Å‰¡‘ˏl/GnMÇraÊ%”+K%´Žü,™W˜:‡>¥i}ªŸ 5h aO!,í+¦ å¹ð­ˆ¨ÓˆˆeU[\‚”GNvñnŒé`H”l$Bá@©©uêt'„ƒöK—8"D͙¿bÃ(Ÿ¢ã}JbøÔ6ì+ÂDR{êRâHQû!zµLdDw¸Ë¬je™ðùddXäžbájfö +‰M‡âÒ¯ò$”¤ó‡ZDÊ;d®°eñEZ¢!¹ÔdNå›JïÛ,1äZÑÐÅ÷ +U!üHϐ†Ø„´±!n6OyÁUÈØ1ҕ°ª’aâ(rù¬!“OӒù',¬dZ‹¦‰Å¹v‹ÍJOvÐÌÜU$"ÙM]u¦&¦Õjƒ±ª>‘OêÊ’Ì. ?TÙ)͌¸JHÖ~—y£$WÈ4œ]ŠœË§f&¦Ô:Žk1Ÿƒ)rɘŒ š¹;$•¡X„D(%QúÄ~ˆÝXíœc §1Hí%('=-Áóñ£žH>\½Ø"’7­ÊÌÈg{ÇõS;ÒpŠYiR…YBüRe¸pRÑ&%Æ2rúÞy %ªD ÉŸwÈ èu ¥†ÅYqtÒ¢dQR&i‰ÚI†uÕâ[+\3v•Í„æÕ¥ÏîM¼Ê2´÷ÓÅ^ ‘{AQ>­¡ÆJ¢u1Uŧz»¤Dj$D͐Á‚qDYÑÆuñ„”‡ ¦^YçęaÜó…<,ß3T ‹c6I '¨xKÃ)õècFäq¢„!ZXŠ,ñ£>CÛ¦¹’p¡ 9ÇNðœfÆ4õ˜ÊÄD…d×xÒaT+Á ƒ‚/‹p†V%÷ê.k ~PܚŽyŠÈå'ΐDUOu©Ï ËP:%A6þZƒR,%TÍص×ó‘¨'l4Ô¢(Ñl¨$¡–CŸ·Ôk_! +ûd°`•àIŠ9 j1¦btØJ‘æD™ ;&ªbŒTՃ"^[Д}’›Øx4T#ñÔ×åpyÏjŒ]”’ºN.iÈ`kcðË`òԅ *Ê!I!Än³š‰hSXÃHç7«ZEÝíÕ ‘Dï"Òºbbâ{k7DðU2iDD]»Œ‡­% +RI”ë§`\ñ*5­¥eW‘2§)I¼! CS­Û`LÑ!S Ӆ‹2¯p3d¸¬r5f‚ƒ¨&ÒR„¸0êæá$Z4¬J¢HBîÞ43Ó 3Ê£Zwò®›ÚÁ%¶h߬m§Ó멧¢ªj>jv>EqQÒp…pD¤š3µÄ:Eqµ5#᪊‹e¯E3ƒ;ºÔvê]ÈP¸~0Aá¬êbrÔ¼éégZxô?JĽŒRwbàfzc%Š’C×þÐâXPBìGÅþiãÝG wꡤMS—Ú¡ýù¦ECDB]ª;fjdÕ¢Æ$ÖªÖa¦²(Ï̈ âø¿ØÓHºzJ¦£‡ Æ$„j2òÏ>zH‡ÏâR#¿aâ2Ãé\S5û½ —.¸îS>H‚|gªnu<”Ði©A$?žl“]¢*,¢0»l^²" +•·¥°xԝ½6ÖK^_ƒ(|‡ò1†…´C)6n©Ô3oD&¤îyX-ªïOŸºþšk©‘†k¤h—ò#\þ%d—VK6z™ˆH%Ù9â´`Rc/3¹ï’u”÷†âìHCHÿ]‚8•‡)fRw(ÏM¯h7†¸N¯ìtC—ÕEDL‡óQ!¾hþ<ÜT1¢jŠ‰ýDó²I*ÆÉ®0eÔsâE-:S´ [¦-äW˜røLW¢:ñ†&ØîE3Ÿ¨Z\ˆ¢§bC>åmrÁ]Ø<1xEê&ž”C(¨|I _aø9ºîþFûý‰>DDåa^H_kuë’.Ôt&ܞLãé#ÍL•I¼+ÖSÔlV-É{=èUŨ†«XAÆÕnI™K²""G‡¨AFƒ:o°hVùß.Ýá_A„>õ×ëñJ" ŸExªºUõ#Nhá©ùÜ9Þ…× +=”˜¬8¢J;„,¢D~Õ63:s.Óíö«ÙªVÔEl‚Þ_ ö MÞe!îYÖÕԕ4~#!-¨XaÍÂÑÍNŽi…ê <ÿ‚Ñ: õb¤O8U>š’Êkd*Ւf3A6L«‡ 3±ÎÌ,ÔmÑ>Á¡Ö„"!•Ab&½s’!ºc¢UÓõ¼ˆìu*¿Æc¤@šDPÆ·¥‡LŒÁ`ؚJŽ4"Ô å T £%üDÈëßìŒo¨Qv'nUfѺ9zØ-UœMÂfže Ô·æ5‹°?1ÖâqšÆ©%§KØ'ñÿ÷êóöˆ\êô77ÆiÙ>äúвm•©äªFÅœ&âu­ ¨FI˜‘‘î;S«ƒ6/ž"¡àÔñí ñSù»]³÷N->&‰Ù|‘·cE°ïñΚ`P¥XŠï7a!E˜&¨ˆVÈL ‘ +߉¢$Hћ±¯ádC·~l–—¦äsõ"qDCxéuº:LBQª°ý_‘w&u’ÅN5á‹Å{qµ`«žöñ҄Q̄«ŠÇK®Ž,0~¡É¸çM¦š ÿóFj+ +Ãã1±4‰¡rÙeÆùôCzœ#ô_ ©P©eª`Š¦f$n,o §8«ù?¡«•VyKl.i }}«àÆæ âG±½‰“…² Çg֋%tzùÄ+‡Á"Flbå$LiˆxÌD¦Ã&áJÍØA.í²‘à4£µñâôT3õFŠ*”"iÀ“c,ˆ>óÏ*Ì° ¢:D¥$*ŀø@& ‚l`A8 €p@XPZÀ$x8 +p@pÀ2P 8ààÀ:°L€È@*È@ +0Š0Ih`ÁŒ¥…"QÐ1œb(\,Q ¿ˆ¡h~Ó¤}oS¦-”*̪¨U ZÅP…¢,’P$w&ýxª".\¯RŒØDdá&ëH|½U»Õi3 SϸÞD vVó/ø-‚!ž¸Âé•ó.³bb"ïZôOê +RÅj¸²Yr¾Xì÷—¡®â‡ñŠFRµ¢Uo–¨—E¼Eí42?Iˆ£Èú 5h Í'C +µrDl† =¯y´™£1ÊR³»^DïÐÊT)2C­ª…ÚÁáÛ%DƒñR«ù?öÃ[|)þ悯€„ä[ÈÒ2$L¶ì󠒏{FÍÔAØSôå’uQÓU©nìª+Wéó4©š Ô„&¦ZMÅÃ2GÞªê÷S$8µR¤œÀ¡3B¡èq–Ì~»—žÆqrZv´^ÜäÚb|ÔÓY3ßP¥¬À3* +šÌ‚HKe™JæLŒ2±ˆwþ\ëÈpÂ4»ÃÕj蔊ÏH?Rµ…^J?17쟶‘™rl.‚¬ªøˬ*ÒT‰¡üRe±úœöG‚ÒՓ馚Ã=¤™³söÜÞóT5Ž¤¨:³–I†’"“їBäȆÁU)EH4f‚œƒÖ4p0I$ûïG‹S E¹nÊÁëT1õi)ôf!ÞÀßÄɏ$²–¨Ô‘ê’¦Ž€“˜H‰¹„^°Ù ‘*/‡ˆ¡8dA§1PóÀÅ%Ñ®8QhƑ=©t•ÙsÁ=3©=:hÆ15ڔd&r¤O<‰x¸·•™c$Ù«íÎUÿq ÀW\yjß‰‡Y”ê"*%µ•ðÓáqѾµÄº }g ƒi_÷GiÂ;ؼ²gȔ^.@¢0…]÷»y»g%jGú<ç¶ó´ä°ÆF̲Jç$œcaúôu2–¬U:™IŽYN“@f3£ªWìs°Ô7ë$ùzi†× 4älðîŸcÒ #ÇmÆæƒlâ+ßSO->?T•e²¿Ï–átR逍xé}—ko!R­Å$eœÜÛoÊ&ôíº¦6î;}p¾éXZð*E¡jåa/8¯ +î­:ÞЅŸˆ üP;<=ô±M±®ÜÎÀ…­)•ó4)ƞªî?%ëƒmDϐq ðd%4ј'w½ª}̪jÒ¬eÍ6fj{€·q;#M¤&û/ðÇWc–…ùh¨‚GŸÖÑ߸2þŒ:+†íRË žÛÆû©Î+Ò¤’ïZw»O™S¢Ã!aÃ×ÂþŸ¢“ ãѧÉʇ¡²¿™[zä.é“vÞç´Gø»ßi +›Ú:êÚmÅkÀŒ_cÓȀ?ŽÝS)b&ÈËGY>Ouœ´¶X\O¢_iu_nÇ #)·ÛT“ÊþÕ]xXe{ŠN>N±(‚i±6ÞV%sZwü´„Ÿ1è;]ü\k +Üøƒ6D>á”Fw6¨)‡-qÝÎbw¹ñƒÅ°Æçâd*àÃŀTñd”Éå܃ìÌPwGÛÆÔyêèҌ ÛÞÌ(Ã×=9I½MJp”˜¥TH°G§‚ü€3v7‰É1¤·c¥î^œò +O€‘,;ÃÄ֊ %÷/ÝeHûVA¾R9þ&ªO%À¢Îi“©éâ`p9üÃb²ÒFä°Ï ‰D¤ŒJ QܽUêØP9¶s äÀNƒãû¿ä~z¡üÑÜN—îoÁ4G8¥ºýñ{$ÉJõZ]^^300!÷+Ÿ&_D-RפfÜÄo#Ô­!ï:bò&]ˆSåªÕ‚pŸ®é;³QU›%*³8=8(£”Ÿè‹í¿î,ò²ù®q0j¥ Ìߎ¦Åå{%ü"v½³ +‹òÇe#; ÉÄ ÇãÌC®å©Yv}Œ@ªT¤ñS?r^ÅËW€W2ÔÒx¹=a¼`§ßðñ‰/vZ*·rI“>=á„1u†ÿ%맦›Ør°ábxJ,²²Ì{Ԉ^‡@:S¤OžmMZÚÁ§mò½ç¶"qÛӟØ?­¬cð®ÓÈë)U͘¾R–ÂRêÙ²½ËÁ3ºÙLjÑ' fµ(kéÚ[tÍéå©c)[@öÙÚlÔc»i™ +}}iGuGY:=ó.+EèíÛ«ôúV@‰øÂ!)G-JmW¤j”Hú)˒D|ÿìß'bõþç妳t BÁk¬áâÉåëláÒ '¸¾¶O+uô–F•PÞ>ò0#o ;Hp•&¶0‰x®‚‘|2¡ÿž,¤¡ê’ú*3öâÇ\‚¿‡”ÙËI½Ûc^÷ΩL¢¢½¼ÈšY²€‘ÍZä }Ž—x±Œ”P£:©.¶„¡íŒ# uÛË +±šÛ{fÙ±~Çh*$OS#Å/5ÿ‘Ë:эzªM"1÷§Œ—ÿÔð¾÷—Ìr_F +„Š‚dª¥±Èåè[É +¬Ý‚¯ŠýnAqô㇍–•ç'K4+ÂýŒö"«c@ ^ýžŒ#Kˆx¢‡WºiZ´Mµ¤ܗPŸ­ÎG,ƒ© 嚵&ÊG…x͚ó)0ÝúyÁjŽ÷Ó[Ȅ2ýޟ'ÿtd%Y™ÙäTzØj‰—e­ߧd Õ54¦è“ÐsŠ\°æÿ§Âf&yÁ;þ_Ç'R-¾¡hBCꛣê!$V„ûk5R^qæàL¿Ke•7'×³2s™õ=y›(AÏǎê ¿ÈøO`hc€-°·,͒“ٝ±ÿÂá~c¥Ò³»"§QD݊<þëÏ·»„Pû£;t¹d3Ci&ux>í­Yùfqlˆ­A¾oG:ø ìF‹Ã³ª +âÕv|ۓ y÷.6«Ù'Ãԅú eâFG¯‘%ækøֈ$ŠÙä†Ì½$†E„‘nñZÿ҄Z`(_«_ÐLçt¤µ "‘ƒ°Ùéy-€P.è¼a?§GO.×¿ªàçÕ÷ß5ÀëMWý&¸l聘±³¹I~CýVþëö÷ +篝¦\Œù±àËåNË:/M_n•à9s'¦Qö-r<œTˆÿ@^€ª§–01ÀMÉôʆ©ª.hÎ íU,'Ì¥uXü'€öæ¸&Az§F*æqàPÛÅN€¥ +–Ürž>I_šŠWYÞ¤â”ó¤`¾ÒÜ@ÖuYu£*o?)F±k<×6-Òmj—>ŒæòuºjAÀã-ÝÝP¤uö rôÅI.˜Îk‡Ûñ Iê•{eâüU'Â)ÇÙÃó…òބ}-¯ .0ìï¾fNŬÌàáõð Æì$[ýwV•|+Êdó‚;ƒÒ3ù͓œÆÜAŽÝ¢¸qŸ &ƒ°õW¨‚ïœ;½Ñs +ÅÉnXdùgëš%?ÿ,’Ó¨,JGüäÔ@j^£È80Ê zڃQ,¦#Ã<Ÿ h(šGgüÌå‚v8há[‚ÚGb^e%Ôïî:p‚hêï9¿Æ—ÄÃÜñuy›Ñ²‚ý*|ÈYa©OoG”Q|¡ÎƒÎëy`£AËì&“ǃT“åÉG³×ã4nO”,v*!?šk0b?RA ©¡óli¼Ám‡Õ;N“ã'3úF³Ê²Í§ f¬™3nŠì{—±=B°NŸÄ>uÂè©•Ó 9üy™©vj:u?Á ¾¦©¤Ðrá£ÿ)6»{2&NVõWæc@û oËEñÍa—Šl +3—ÔÑ`çT¸Ñ²IƑÛL.LJØe!™¸Ä¦1æj)=ú`6ø¦ÓΧ¦r¸J’kJ§Ôœ·Ã÷’dÆú ')¸ˆ;5¦æÚQAl§‚Ϙ'íÖe„hæ4i¸I(å¼]m‘ÙŽNÿªè2½‰¤_ÕñolÁzŽ85ßé·í«Éyµ°/WʶT |M"0éîUܱú%#WODjv¾äsrt.ãKýR}hŒWî› +žƒð^ö>jÀäÁÛÀ¶˜zÖEÑú›åM£†]V›0B(ž’T…‹ÅÌ/Í\=_€Xۛ;#yr÷òœà¤Þ„ñ©'Çå$ekÙJ§9K4êH\´¡hüëü誘ÔbÂo®Ž í¯&Ձ¦HýÁKƒ ½aGš\U^¢H!íü`ºŒ·²ä!)…àèÁj3J5=U¦KâH|Üû=3œ¨R]:-F«'Äâ<ãv ä½³S&¯CåîΫcñò½ ܖìƒôèãi +…1¶}w”ôsµqûōÄ9´!G*¯¡AíÜê~9(8\½°âo7£´MèŽ2Å?¶çW}€ƒš8y/G”OF&|l•1f†£ˆ ‘úÖ²>±* IÆí9‰Ð"t(ÿY ¹7ßMøx­Î[Ö4Ätõ?…ŒœÌ¢\tm:¬¾¬Å͋»’3$ÅHq¤–}Y*E…·«¬÷’¯må1“íXæ°É­œ8ήZ ð¿±ƒÏå?“RÊÛ×B”$¡æÈx$h,¬eèp%X›qÌãH]¥„ƒÒwÓµ9tÛrOb+ÿ9Ö´>ª|öy¤j{ðžâ× ”88IkøaÛ2ñÌ©]º) =V3†kû•…ú=Ò¿ÍC {¯4J¿f (I +í|R…iÛàʒUtþhמ^>ÛH›bÎôVk^)agó¹ü UV{ ýA]i»JG÷LAH¾™X*,øúO}½Mc'øºþX¤ž'"h_“¢,p«‹`Æ ÙõÄH7y9±¢rØÊlQiv˜{;‰?ã&Yß"œ •„”¥ x0R?mmˆêbIšC0'ø=‰-ò‹°‹õÌߕVôIÝmªD ý†“ ¦ô’ÇsZVÏHÞ²¦Ú+y½fÄg÷ÖYåþ0CK…p3&%L¾å’(yAbɔðf¹¢a*½p!›]ƒZ2ȅƒÁȍ ˆ +¯½Æ‘å\“;vΓhŒêEª‘B:šVc×8 Št¼ K—7„"m0}SRf'7˜+–g”ú†S.â&ÞmÑHnñd& Œƒ›¹£FSùØJ'­rݑ5®â,Ú¿e°Ã¼cÀ´!s5ØÓX\«ò0ìûmJP&³Ö˜óØ4!Î)"íT~R fö "6Ü#òrÝO¬¶OÞ$@*1ò.²3|õ]?i%Õò"˼@“õÛÙ,5¨Aè~Ã:’æIÑ÷ +>ó|³Á<êËEvfñÉ°]¾s…HÂ:¦ôÎ,DÏ(gI‰ÏƯÌFM¸ [¹Úª=(_ú0îBœ•«Ž—ÔJØ1J>øñ¼f°ßJ»:\O7ûÜ]†t·8‹ï +xΕí~háԓ±åX|!ð-3\Û­Ç KV LÁÛ¥ºpEÉÌږ¨ãs[‚èyK·³!.a&ßÝéøo<Ð:â_OWåXªãØÉÊýðù‹1–FzS½Ë ñ=7´d%zø|1q»QÏP(}2ÅP†÷‚dó¸_€kDrЦòxÉ/À°@MoPêi_73szò†Ô8uÆۘ¨“æ•ZíÊŽUBëÉY“ds°ôÑÖ¨[rhB9†ñ€ó³3[¦ÔXJ¨à–”¡ýw(œ"]ú„/úl³–Öyågxåì.Ý_Pº…w—5Œ‹ánîÇØܼ¾z ô×T¾+õÙ¹,Æ.N/¶ñ±›cm©öÌwqOYâI`Ž¡.½¸­M]챃ÎlœÍ_+,3¥¡SH)â?~Ӎ3'R@ODm±M7âu6´%m@ºälPþP±ò`ü£FÌRàBƒW>[G¿¿Í€¾° õŠ%ÖL%Öw‰/Úl@I¯¶>«ý\é"µ„„–ÿÎ6½üõ—„Gϐ__È#$¦¥ãªzn{ˆ”g@š&äͨõæÁyŸÖ,8¬bþùy¢Lm-f¶¿.•péöÒg š¢­„kßßT¨T>2RiYöl€H‹1æ%ÈÛ<hT‡¬¿’">„çF- åWØg¸àíw‚&¤#¬Û}$º}²@b¬ŽVPõì©BŸë¸!U)õ3 ¨T sv{ftrT63ÌùJ¿ áÖ° ÓàŒJÁÇk´•ƒïXÞG*Æñv™ÂÉ©Âޅ$q( +ÈW DS‹½WЩÏ<¶vyP\;ኲ±Õ¯Ÿ.ÁºÿDÚ¶I­6Zžÿ9<2•\¥÷Û*,ÜI<ÿi8[͌ƒ;~¯¶½§Îع‘!Å.®a:¤{|€)]ѧÚ]Åp?l‘ ]§„Á´…ƒ–\'ͦ/ëãùªØæ– r lúƒ4“¢Ê5çÀÛqþ ԊýVU¬ÑÚúœ›/E (Ê»¢ËðêWúxyí›Øõº‰1U“5y˜lI‚0@T°.[k +tÅA< §jj¸@ô(y¼ Ê_ök†õ¸ÆÛ>Õ¥Y‹€pAô;ðz.Ö㎎Êj=cr±¥Vj½7{Õ³ü +ô%ýüT¿ëÎÏA2Îñ8qUüWu ®ì¨sÄY×I‡#YüÃxršJ¢ðS›ðƒz}©îù`kT‰Cä*’â´g÷@ƒ:ZNÃtYô~ÅÃkŸ1]ÖTˆ.©Š Ä­\háQøú㥌+•E£VÞ*ðÌ@¬êI©B+›ýuZž’UÕ1gb#A‡r›³ÕµÅ›KË¥O+Üô9ÒÈÀ–¾ –šùeéX‚w¸¡ ÊÁ'3ê4(óÉÊjJŠo£`+?{K 6pv:±³ò–4(Ö$¯j#ñô‡-ÅZLÏã»ZPÄ>›/¼yöeûãûBýÑ!FÛïÕ$Ô ‹;-XMît‰Š¯ž´®zwšŸÓA¤qGºl@+o´Y/{€°KÕß~,ÿ.-à†O\Ž¥ø §M|5Å<¡ŽÔ_@pþ6Kü›™†ç/hj%‰)1;º{f͆üÔ>†¾eö%ƒr‡&#ÖVbm­PÕ1ýÅI]þ¬$÷c1ê_­h‚À5}us¦é/¸JJ8ÕÒvŽÅÔ¿(Âe(x m) Ù ûšµf©lŒªº ŒÙ%D¶Ý%—S/Ï ‰<(R„ÈÊ?J3ŒåB£ØO_x‡cùÿ| úâåj‚ä˜ì(ù¿ðN•ôœ~¼œŒäÿ…ÃŽ “å’4Íbªé¸ÍŠ†+ÿ³°VÑ|Â0”&²%ڊW‹îò‹šdE’®wU\š/D0*=îüÿ¢¹NDûE;Ð8/ ,`éšj O«Áü\4â‹é$¼ÏGÆtìâhuÒ­§ì?XÎÜ!SáQí¦Y¿6àł#»{åH:ƒüý‡,ÿ«P€ÿ3–>0¨¨Í*ÅJ†$Ñ£îw«¹rl…ÕæCU÷Q穬S^{ÔoÚü½ ‘k&·¤Él\èáøiák5¯Ûÿ< †ÔÀ¬x%vDòë @À‘zÞ9Å8%¦’•Ñ4Âà˜Ì,Ò¶ãûÞ$1¤›øF°”ÎÀ’zS0ÉùÉsI|®uÖ*¤vçôFRz÷ˆ§}ÜäÔó6yl¼ÔÙ½B)‹4µD ´6ýn•=¹î6õ”ßZ<Á Žë²9)Ò(¥zö4w%¿ ÇR+aÃâOs>q7G˜+÷"m¤juÅ»½FT((ÚÐ!ˬ·ƒçŸ>Ãs +³&MÅãÈJQù*›¾i\¢y$O@ƘfÖ®*†Þ Š[×®£sñQâûjÕ9-™ŽC Xr‡³=¿3ä^kð̈1‘NZÏSòÿ˜—¨ƒ,PƜÖÎO+7ìVog@1S”Øר4Z[å²<:[2²n”½Ê>ïñ‹,Ð=STëîToêý‰;jÊÙ+B\L`ô€Ñç€ð Â5LTÎfbÒæH1™wõP‘é…€'šiØþf°qÛÆށ½MT?z²§v€ÁAx)Ü3A!R¸«Í4ûš‹F•ŽÚïÕÀ2˜£C–µå[prFO3”@Ìwq냁Ø%B¦„|ÚMþ©•˜?à°×l,s£çtïc ´1ÑŸð‚Š™×x „¶ÛѸyö'ÛÆ!å3ÃÈ_¢'Äã+ ôâ¦dÕõP¥¥$ ÂiDc=P-›@}‹ØâL£H®0;êx!Ô«£?H¬Û,qÒ\ƒ[ˆÑ¢kÄTý±Èšº +ÝE²£ž’±q€;cÃc1ŒÅ¾GÖ\ƒ Ó Áp²NŸªÞžÕ¤ +³ÎBŠâûÙ4C½æ¶-Xþ¬±tñ­ú²&&'+~¤Û°"DÄà)gÙû o܇ç·]в- ÅQ!AˆhcE)†Ý‚?¢è§y;]nÚ³xz'rѳ®o¢Jt…F×ցlé’ԁôÙ¹lIs¤q&?žáLÆ w`K{"OE[nju^|é 1_Åæ׀o]n­‘¿„&£ÆÐZ7]¸9zOMt“v9N±•1SÀ&¦&1Á½õÝJŠA ÂS‰{ó3®Ö³Yû6åíÀ×äý“8%Ʌ }ÛgÆ3£5R…‡¶3ø1Ť“®–þ»‡š²g¯Œ_—S· Hh3$]m^2‰žíåñØCq²ªzÁ9;2L:fy™þ°S©³ç©`鐈´~¾žŸs‰iÕ_̞‡,¯à·¨Íª“sX˜¯zÔPÔà¯àAÒëR^º½=áát@ ý¿¨5ÌüÑ¥”È?ˆœ'N3ú0[ѱjæ¡z¶>[À0Œø5Ñbkê8µ$®í„YÁ®OO ó#ãŠ#êIq’sºžÔ¾é"Y–çžV"Yš +9¥5R˜u¬iìßROè繇›àÿYm´mm×ÁEŠb}šØ<G!¦“Ѫß;“Ä GɞÉ9á“Ã7Ò"H&6ÒR[)ìÅ~¥~#XY#$z¤Ï´‚×d‰x{†“˜üÄù&•êúÀ(4TïR#ÿ´„6‘BC‚L%ûò­r°.˜·ÿÐÂ$ޚÆû€âw8wŒMþ½µdµ¢µ³×á@g7`Œ*´ÞdHÏ-½Öñ‹¢1ý˜^%ÿ.6$Ú^¨A¶½}¨*—ho°Qй!ÃFÎoÎÚF -¶Áo"úݟ7•ÎUèvwßÎi¨ÌH°¤¡l"ÅՒªÔ’}…?¹Š0pÜ& +¬€l+ ÅQr­_m„ú,>Òf«{}i(ØôSgÇõ~²y,E£À%Wº;ŒÀïÏÊãO!ß0Ulš&€ßf;J˜?N׸šÚ÷dJ1´ê·ÞÈ{¦Á¾ë*¯÷ôÒÏõêqÃÉl3€E3ärðVj'v¨´›w~2¾û×ØÍB鞙Vhf*£“tŒ’ÇËÅ2p•f  ”ø€]›&NJg,p6ðw @7Œ”Š³ D¸U;4ÑÿC͍ïÄŽLsR=….4†cS ©H,,ŒÎºô>~«ä·ß/i¡¾Õk@ÃLώ:Œq[@Œ™s/Þ¸ú’fy$ÁV,ñ'˜tóùàÿ@CõNJ®{aøøáÅ.hÔz'ÇDæãåb©þ’Ná]aØ«ö<šª§U_7;w&ì](E)< µ’¯¡4ÿ"O~L:þ¼¶‡0j6Þd †HWh—„›§VŽNW,á“UÌ[8Ð†* ®—B¼Tô‘'Ȇö­ñ^ü%'‘áïíüöüCV Ì[¨zM2´Èf‘ô›$@".œ¤™tå–.οÕU +›9ڙ'Zw^­ôY¢˜DëÙ ®ˆúþۋšRý»&ò'î£Ù´ki%˄ÂeȒ«Kt¯¼ª6ZjvDÑ¡f3.ú/6n—”­-%öÅÙVàŒL‚yZl[ù5mí׳y¾¿öä*çJ}‚l«¿p››¼lQ9â…±¢·‰·MðrÕçwpDÈY"à‡ HþÝxv*.qƒmj·t ÇSQ¶„òrõ’4Xæi. +&.BŸ¡ÅxÃó »Ï R‰¬— +~s…½³(dûE@‚EfZ"rc%Dûh⠙Åoõ/4( °¯RXµGÚêǕ#Z‰o Ó½y<ÁmõÁ«I¼Ç‘èMÁúTί~ \K@vºb0NöçhNJØ'ÅF®Èfjãí¾H¹†tÙ +ž×ω8GkRÅ´äÍÂ9o>ó‚þ(4á7»ã¦‚4Mó "ï:+å0¾ÐW9œ¦è¢ .ÿá5’¶Q3Øg¸üä ÎÊ© ÷§n`ƒÁx~Ǹ¹Ø)Èp!<âÍCÒlÚ͆ãíîxCbŸÓLCÏ]ðFîÈɐJ5½w6†ÉA€“ÒÉ?ŽÆ"¼=àú z$Z? oÉü>{¥×F,gàŽ[â·ÀiMë¨6O<¤ŸoÁîh®Ÿ+œ±œu±” á˜ÒÏÙñã¨(ì‰F0­ +hò9ÞD,I±Ñ 5M©{Kh·Òu|©ŒçwßCO þ˃€v Ìßשl®üÒ÷ ’o|JË¢ÞSPŸ5=Ý×-•(§ºð#oñÁ`š ð[Æ,˜wyþ-î2W<Ùø`òÄÜo^(ԗ£ +ö“ú–ëøwis5”—ý™ÔgÂlÀo™’Z³/G¡F:æ[ÈœmšÚ þ#ÿ4V¨bù-œjëâC—yKhÔØ·O“rz¦i9ç[òŠ¶sºéù[fˆ]>ØK¼ß‚à â„Ø?ßb=²–KŠ× ±%mö\‘byO糨ƒ¿åé˂uŒ³¥i‹jÈ·›žÍ¤·l¸Ä‡Aºo±ÎŠŽ¡­%„X¦|Úç¾( +ØqCV9ò +1Ìɐˆ¥© ï~X3ÓÉŽáQF¾ +¹?ܺ®-z8ýšd)x]¹å»Û‡´6¸c2LÌÁ¥z¡‚<+úP”;{Û¹=J­M•|³Ò:_ƒs›(d¿Bš ±k75¥»w†í(ô¯ c€‡6;œ.qâWóþ‚®}qq JÉûî äxßE·³J)£¥2å<û$ 3pô[B„¼.rbþ•À«ÃJu`b©T#£í  G^†º|4×Ñ9›!l€ ­¬L°Õg88î‘~&ˆ©®îÔÀ|uÅøIØêpT(þMÁ›í«rViA9¸yà¡ï\.u|½@Ì&“•w½ª¿‚´G“ \Ð1JŽ®%*.¬å5N ¿ÄýóÅö¢t‚||`è!Æ¥ÑÌÁ¦²Þ Œ*+ñëARed3ldG3ê «àÅÔäh›"Eaš1÷xZ4¨föuyXá ¡Âd+góqáÕéQí(|Nº"ƒB²É ã.ƒ$úJð4fåø ºªÁ™>~OPEÂU: +)\#eçÈI{>§`_Ö‘´¦e%†jÙS•+ݶ¿i° :‡žñËD^®:š§ÑÜÁAºRa·Rr39Ó19~ /l_mEM;4Õ@wsZ_;cfbóõƒLµÍ“E#¥ôs+‰g‹Bµ›É<”/G·a(QBhP¾U/9+‰¦¸ÛA™V¨ÅXåUƒV@·¾G†DŒ‚þÄ"! i mÜ2 w‰˜=-¾†PÞ±5BzC®æ\Hækg§ÇüEæžk«ñ’DäËÿÔÔhBTžå„|N1Q¼´cáuŽbT½ (7ô{‹C"€‚4ô®&{KLh9R|Íûü‰Ã\MEÖI*k­gåÓ"õã2EñóΪ”û†? |±Å‰ž.tÒSX’¤Í¶[²X”¥ÉÂC6hðô€)‡­Ùü.¬º(®v5ÇΛg¯2)Î&< >eY»y&½âlly4Ò¸+d•:À~üd ®Þ£Mß~¥{ì¸U¡,,Ö Ç×A9ZǶco7åÔ/ɕD8‰$x·“¶¤)èpà<ò­æüú¨@dҚÊZß)À'°jyg8¯Ç¾×s{•SÆ 3ãÜÆYˆ~FàÄ/ +e+,ã*´<€Æ´áÁ[¸7Ü@áß#-ð€`Rý íâR’K…nàÂàU< _×Ëå$`Žÿ5bRÅ­ÄägÄ?´A5HyϱŸ¨•û헄câ8Å/FÍz®XQ‰O}̀iz!)‹I(©5Ճ#Þð9ÇÅ-§\ÀåëBóÆS†ð¯À÷ =K´O€iEÛs½,JöpgK“)ÁX¹¾´ÓˆuðZ}kz&ZóòNc—[ž;q'7MŠ-É{ ™ªß%E#ñÛ(“%˜ìƒÅ%€uê´÷à¢í€rÆCåIu[á];!ñÝ¿aꂻXâÈÀƒ‰ñ–ù5>]ø¶T˧—ÞÂoiu´Ï‹ØÚ_È!ò‚* y“óî]„ÜçÅ¬%@ U(n^#ÑBuyyÁ£w¶9 :ô?ë“ø°?U4¹üÍLö—LèYìÈ` LÂò–äÓâªTÄA¬=¦G?6ìjÏèõÁ ß]iIš¦6iܲ,¿èåÌ÷Ktrü“@êD >% WGp„ŠxásÈì4wœ#;ùÈ+ÌTðÚŠö@¤XÓM0(ub”¥‘Ò§“&-“×oê'‘±M**J@·7÷yi™fA¨.[ø;“„±Å”êÐl%ÓÑqØj`©¥Hî"?º·NeÌigòf‘PC&30;¦Ï +‚~ÈO‹žÏ.ċóàÎʌžê-Fç(žÚK°ÌVÐ"Gl”ÙŸ©=bfáQ,§ßQPu„'¼°2hÝ´ì:1u8L6±`™:Žìãü”XM,m2øŸ¢1„ûµ¤šŠ¯w8.‰¿~Ö8 ÿ^…qÚÚLö<†BúŒ¯ó4Zt·XÍE^ÿ÷tá¥ì"e`»É]i'Røl£±Â_?Í£vk€þ:þ¢V篈H!H† |ÔÊëº Z¡¿Þ´>Íw÷Î剁L&fˆ§– ˜2y}®OW,Å×Tº?ï`<ÝH"V})¿Ö dj¥±ÒßÅÔb´˜¸›¡ÃcÃÜ|“Û¤Ûï©ÅeCý ¬>n2E/É_ò[Uß<Ä-k¬Ì€ +‡òMT‡¬6Îìu¿t@ö¤û5ÇðéÀ7ÒÀ¯éǘŠç>0©b=SåÁ^$öî6C@ÁÑöŽ»z£²£P{Y«H}¿!ÚÀ‰óób.‚-}yå Æԛ3âÆ?@÷ëÆH[£yØl[nyañ¦Ÿ¿ÄOÐÛE74RÊ„í¤|âÙ>ƒu}QBªúŸV|fJv˜&ßSF•ò¸GÛOþ‡‡¹• Z5bShxúq&eUWáÏÇxbÌÉD;¾f­ô̓ àÕIžK‰ñçý¤hƒDž/ªÂt†0«™bŒ~ĒM­í\”®Ä¿ÆA™½’ ¡ø|‘iē%À$ÎÀcû@”mùÄAôÈTR@ýìlƒï|’72˜Ö ]À@ÃI•A¡‹pÍc£ ì$E‹õ(´À›ÊUCî&§;[Ï˶›è鍨–1qIxTSd¢ÖgõCãÄï…9$¹ò}™!à[zqM. @é¤<„ñM“6z÷½Ô‡Õ8^\+3v“È@fZê%ÎFi˜3?½®’Bnûq|ýÍö×à³ç3µS8?¥gž96 <+àð$H» ÁmßÄ¢°a•lþ“u˜‡ˆÒXUN±VFsî(59}²“Èd m5¨5C¼…ä.֓‚}0¸„0+6¸¦Þ#“5ÆÚ;Ì/a145y¸(*ô¾<ÿkûüúV ¿søì;¦ò:†F:OW*µ¹êÑmD{«×Å´µp +'ÚPµ£Î3é%,G ÿ}G›Ù‹¹ädêC[ÉL^‡3Ôáæ—Ŭo_¯ë9x<µî›z®BM0QQëº\ó9À¥ +&¼)zÃF°dDM¨®Åh¬b/ÔDŽ6°7SçDÃU?D›3<»c¡Ã¬w„o¨Rl¶Þ Z;OR9N+öb¹ÖŒƒ¸N&$˜-f£HrœœZô”Ó z©ÈRî–ÏãЩ&OÐuYu¥HØز …G1Š&Y¼45fýoF‰fNÏâH=æ(}:Gêƒt²¸R {–Ð`hßZR u00qöAÁ‰Û(¤4» ÖàŽ`Œhðª‘àcŽ±hxB¹È4 ϦÊ/­’¨Sp¾ÅâªLm ó½[¦Ë#b ”ó_öÁZÎüP2¯ Êãmç¬20ÃìvU`x¥–aŽcÍ hi3¯ÙRw®6ÈÉåJûLQïffz4Wã#?§âç„nlt@Suf¾Lo²pR3$¿¾aãœß`Dì~‰.ØcÈí»_Š$~‚W9ê?Yp%Ç=¡ö¨æ›-X$çÐ†R,déeêÎ;I¢ÔyQäo%87›$™Mâxõ60E{Ï\O„|k 㕱WY°xÉ:ÔN¾ÇÞ?Rø‘Çêæ((x8KÝI …Œ±“.d«¥=¹üö*ŠtHèî¿L¨,è¦r’ŸûÅ7©6Ši«&¹?;T‚åP$NÅ¿2Ý᱅K’4@@Køâ&ª¶˜^j½U€/9z­}éÞu¥ù#ù0Ç=„ hêÛ<¸Ò&y€„ø™9Ÿåž|gõð¹·æX_6K*Ur%…¸*ðG‡Ë]«ïǜlùþmÜXã͜ \ˆ}ú9ª¦ˆo –À,YéŽçÝ(7Nǃb +_&6¾ìÂþ­‰¼%hyûy/ÙÓ|uP¬º¢c»Ðþ™=X΋¡Ò (–Âë捃ˆ=x±bÈvAꤚ¶uúü]Y2¡¢ÀšÊI':úGïÕ8ÌÊegöÁ7Ÿ÷¤s ¦Ð0Æ +Ç÷X]£¸GaŒœ*„ZÝcъ[%±$å@m@jíüÃ撂ù£Óù«ž&‡I‰í3jÍúØ Sz2çë*X{"½›H«‚‘Ã\D 0uËŒGJ)sÿ ¬óvÂ)ˆÓáøŒ05i MúP¼ÄÍÖ:9!ë›Öƨ}‚†,>_Þªo^\’<>ÆT ¦ª+Éä(¹"ßï” +=ˆyŒÀtóô.µ.4˜£’¸µ-}rÐ8' ÿãf H{zú³ÆÉ}šÙ´Hœâ7=aΝ4Ý'AÁ^ȍ &½…HÁNrU}gJ E°,ìöhÓEðpVÁY’:KåîM8å ˆÜò ð$-,‹¸ð£Sç4ñB˜ç$ßk…iö¨ëHi‚'€›cŠñWÚ ŠXûŠ5 LvÈB¬–‡æÇβ¹IaOPqhŸQu€€ æòòÙ¾°)öõ + èÛ—^ôÎoJ¡uD×uÜòíÝzÞáÎ[¶áÉ|"(tTDòGx:×&%tŠØð§osÇGŠ÷,àØÿC)¥Mԋ¿¨1®<[eՉy'õË#$‘Óï nkÅj]‡‰ñ؜ð¥¢y Z†x \…j"m}ÕÊËÜIQmeŒ`ÇÑ1_bk»X{²2žù@4J°ÞÆJý ª'Â≇4y´UæðhÍѤB&t])J„QÄéZ$‰®?"炩ÓA0ž¦BÈ¡Zâs¶ŠrR„á2rz6‰MµGB߉j :y›¡¡‡'(„H}qü²Õbâ$QŽ0ÌBÒo$V•oŒ »Ýç§%3¢6ÙëþÁ0Êónw +„Áàú'KâVt¤6†º}ÁgX1¶ "¶”®˜ë7¨&½¬+q·%HÊ`$$úŸ®WïùcûÖfÿõפÖ0£‰?¥Ûôðac¹¾›,ÿy*‰~Æ£\¯ÁM°’^/: *îö‡LE¤´ú +¹ {«ª(±BEi$¥ãŸ¤Å2”ÂEâvg_a”„yJ&YáIY$Û¾Ð92ó£ªÈš®›<#a´ö¯^~3°F2ÖÃc +i;ž%gðN– Ÿ´QÁ$·æn¯“èáCñwƒZ[æÀHJŸ–ÊÑ0Ù$gzü&èËÀVX¶‰¯}eDYyøSX•‰k®•t8µ ɟº +¤¤¿¯m69N µŠÌ]á5!á”I*¢º‡-x÷œ¨Œwžâ0t‰d!N&AE…¶5( =ã@rm#à ¯ô]|_Zf;Ô¥”öUG[by— +òPãûwm-?¡ø™=çN&=Q§ÅبöRsþËQã<‹ºw/y´n¼0º÷Äo‘pˆÉíiÊÄW‡ñæë?G²ç“yw·RÇ%ÚheVB€%þÊC¥¾‘ Þ+ÆcÉä èêHÛÜ—N‡ ãÜ$ÒDŽmɬÖ]›U29 ²Ú‘Ÿ×â“Oxé_ +J/ÆóÕ©¨’íÀџTñT"×ÙùÔ‹ 8ªíw¥€ÚX½pƒD‚z©JÞ €yÃ8¿¸›îd/3‚Á»Û°­ÌÈV*‰ÀÄÈ=Ùb²\Îecęß90³¬u\:¬‚õQ¼\Êäôl½Ž¹FuÏ+bUvH&K‡¾+ä»ÈYò<¶ `ðŸ4²2v÷DK>bҁ» lfBd44dÈ«ecm™y›”:ú.ä͕ßØnÖX'©hóN/~JÿŒü÷ñ<\zÇxóâÇË~<TïJcŸ¤ªò$íJ‘l‰4‘á!v3´,öéYyý³÷ÍaÇáJ¦‹-U°Løk4+_Rž|^x4èOÍy‘‰j1BÒév£ É¹@É9å´y»%‚Öñ rÈS!H6gt!àüí‚tÄo)TO6ō“aÕÚ"² ˆ!Å´Œ}zKÐeà¬ÔÁÈD€ËK¹ÒöñÂ糍:Ÿä‘6ü6þ}€]­Š=-ý—É(L›Å¶ü©)$Žëfÿ¼§G¥%[ìg‰­è݂+×îC]¯+çIÙ6‹4x;Ö¤©XÆĜ?\ö 1OìVǐhV¦QÆmf&½â nwq¿ëŠBŸ¿µ•À>¹•Å#Ýu®î¾¯áý®„WbPnF¾7«°ë +Ò‚ŒËIí}Th­áœ¤Ö‚LP²¤f&hAs€6ï€4q›‚†ºh˘žaFh¦¥7†â¬u’píŽÑD®Ô5û²B;üŒ)6÷À§R걲ߏÛ]AˆâžŽS}Íû³|M9|mKi·3 #m +jbŸ_րXßè{ÛÑ#3 0a]wða5¨mº“& + Œ­-‡{ BŠ‹kÂðA ÆEꮟþe¸¿WÊ:äã’¬…12Mwø[…Ú‰GWWxGK¶¬2+¾Ò+—X(ý1.Óë½BqEûýÉ ø¬g5ç© +¨™<òRÔxç¸j²BšÐØ“ù| +åMvÈÐÁúO­CÞ[Év;µé…GDKJ Ü/zÈDÜz‹P ÿ!š4葅û3ÐM Z˜¾o‚Ç!œr„"VŒv+ªR^åæô|+œÎøáë-‚åƒ¹ûß8¿©ç>²^ç,Ý{Ç&pùðG9]×FvvN +f¿ ð)'û/ SšMØ"ªLlà'Fž÷À{² …Œ{äž+®3îÊçì0GK$÷ïæÃ3¿rö—JR©Š)œ%~ü•ÀK•—!BP¢pjn©I%Îڟ)ÔxÑÿø–Äðs¹§ Á«¤*Ý[m°œ7^{g³øÉc—1þÆWRmIC²»;˜ÓÔyÞn´6–6ãÆŸ£wKfûmȁ º§¶$Â;ÒÝ!ùïzÁqÞ÷½%3Ðj;m+›¤N¥ò';^½!w¥ó¤ÚWÝ;óù'È|$­Ùžçi럫©t;2:¶Dþ`lnÁGÙRíæ¥.?þãpS +l˜Þ¢¢¨€ÑÌÿnµP*ÐÁ>ì5L²ÍÿG$\| €0¶‰Z?òÜâ2¥FŽÉ»OjglZqG¾÷íÞ9¤~‹PKîßöãäKȱÊ' +M m…0Ñ«(HÐ=¤Úv%Ó+Íççm¹hH«-2à%¾á¸žK­žË®šߞqXIü?©†»…®i ’´¾à#ᅥ /O2ëÿÿŒ‚àpÞMg‰mԕÚ3.!æ„÷½‚Ö®ì[¼æ€ÏMaþ¢p§HþæJʶaÑ2Qw’Ò i§"s`㳐)œó¢i2ÏÄV|!UAût:9[>ÈE!n¨=ö `Òa³„/0Bé8°¸4>’f…N}HåuŸz³" È2[}†EÒz¦ ¾PöHwùL°Þ +G-$© ìX‰{±)%9ڂƒ0âï·b!Èû @YA”bœz–’÷Ëš"Æt Á.††Ã€ÉÈelê†w´Æäf8ގ‰ÅúºµúÒT€çâŒ0P¢`8ìq,|QQ|:HOÃƅ,ȵ6n`Gk†a ,EùG¿-b˜Ç0x’ç]ÜÚà©=ðg"*¥,ͼr ¤¡ äAæ]gRM5Œ²_ÊäšîÛ¨e3ñUŽ‰9¦8¦óu†A£õs U'ꦟaHËUÀŒ Ðóš#äØ00"Q'ELhgkš—2¬À¤õ +'€C$5ªÜTt'Ä)Oü—á ïÑ6±•Æ &1êOT‡®’e01§5$_ð '•1%ÁqfŽyÊ¢Ru•1l’ŽE É.´,ÕQÐ +æÙփž°ï@;ÉvÏß¡b/» •ÔD"0Ò¤O ždqµÖ‹rÁ›‡º¸‡;CAñ@ù¥™U^ïÝ!)q£¥—a>_‡©önã˜îÏÁí„"F’£œ-RD0«²oÃc^”l\VN‘¢#aÇËÌê>¡0³‰ ᬭÇGöíx*Ò$YV¯^¶Nw”ô0šcw¿dþ<ô–¥‡Ó€UÀ99Á]PÊg±õˆONè jŒ¶¦Q, 2Ÿ’wO0Èâ†2HЭL´@}PÝ<6Éc ä`lúûiî %ƒ«Ì#< +“Ñö\rÃõՒgêGí«ˆéÀ|PÊÂ{Ç~„èât+÷·ÐSõáì1D¼oUÕÙ | –äßs­Kõ\ûwf¯t@¨%±j˜î±ù£ºì~ö°éö²£ö]ïƒ[ûË?h¦æñ×´o~–TͩԔÔpÒÝÌ?Ѫ.{Y:L‡ï¦ÕæpA³[% 8˟Ã{kJëu§ÂÄ8>¸Ö•¿I›¦€-qEŒR¤3d6\'´-HtŠHµûh<…Zr{ÉX„d{ø@€4ʝ¤e„dù“Æ 5â‡`8ô±‚¶­áøP$ËÂ;i"ÅÔ®2W4 +©iÉ.Í×ŧ—d²k=sËmuغ“áܵ;m¬ù“ÎQ¶Ñ엜ö'µ4Víd¼ÙÌÒ³©xñŽU NBv ጨzŸ]eøó™›@9rD,ä>nô*ÏH&‘©p@ Ÿ°Q4ÃÀà(VÙgþÖ± $Ç*?%Ȝ*åW7=jí*ùëy‡[múߎwÀ¼ç@wúè]ÍSÌІÒûÐLõª™?;3 pÊDTÞaä‰ÖåcîיmÒF{%Õe¤Œf“ɼÄ픮ò™É' :ÈÑLU«æóHJ½ÏÁÉ©zu{Ïõ¬hñJerùÃj8MQ-5½VU€¹š ©Ó®ƒY¢nÃ+f3ˍŒ—nˆ ÿ½@›œRû´¥¼Aב÷xŽŠRÛ!ޗÑFù€/{醂øô;U…†ž{@ŸíZs“ÚkîÆñþ©Tz±2óçí]„ã2ÄMî.òNL‹®ßñfñPñÃ(p`ÖÚDÊÃþú³g8^W¼p!ÔÛµ~ÑÓô®p¦'ßÆÝÆ°R1cÉéÖ Ó¤ã´Éti$ýNjŷìY-ÜqfÀ ªâµxwÒR„DGÙ[A†:ìómdÊ~ðT@ßi›¶ˆQZŽï£’ *ôõ5Y37bR¢¤ÎsÌÊ瀊Ÿb,Á˜H«F(1·Î ”!@ãÊ"˜€ñ1Áu q"­àdV&oG\Zã V²„ñÒÃ×qUJ¹EÇx³¡ÞáFԜ2ök¤ŒƒéôÛ0½]g$À×sBä¢ui$ÈÕ5HĝS‰ ê +,¹¾C•—ÔÇ›8ô«‡¸=a¿UGèOà +ÀÓlEW¢T6²CÇD”kÚÍMðsŽç‘Er½sóÝLæ6A€ëÀô€\;çî”9žmƒ +3N*Ó¦T…cYž…ïåqñÛÞýÖ«¡Èÿ—Il+‚¼–z[@°’þfo›D«ÅgøÛ°ô@´¸-ÌÛæîÃLðZeí›'ö崆rXzd#ÍnF, ¢%š/‹+$DŽc†öiT~­.¯m¦ª2Üòðf~ÄN«ÿ÷lOJéE?©g§µp@ڒXòÙ°253¨ÏA%0á .Ax"µäó~ïD(DwòÀ`\Í¥ÆÑD}$rJ¡Ò*¢_ ´JtЄ³Õ6¦ ÐÃP lâ&¸0'›¬Ü>¼èº =ĉÚöê'ç½ÕÄJp5•ŠðR»k¹µfÁʌ(áè|¤hi2ÛS08’¼¸à­ÉWÇbdÀ¬±I“Ñ8çóÂêºb>F;§!f 2–³^e˜›p#´š]`tq~Ô“¥ñ»½¾ï÷;½ e"—ÿ£l›p~éÜEFÅ#~ ^š@ÐxÇÜ^rêIÒ&)ü5“¬a ÷Ñ·„_ÕÅúK»O³ïk°|Ï óނìëåãlÈÚÍò”µCPJZmCâ[õg4TIòb§ !"ƒÕòåÎ++¯°[ =cñ³¸ r7iÏÑ_/Š¡éÉK¦„å‹WûÑ=6ÿ +§F×Tþ”‹abC"wÜ(}ø½ÔÜoÞ ÀlP1 +{F Üùhjºè6Žó·éEÔàZiòvniëA.8ñ¿jØ,«t§ANÅnïŠé|)‹9y>°ì¤Ûz YXkÓ'ï5Âä>§V§”£IÈúü›ÄFˆ)>)Z‹_]Ç!X9m¸‹Ìb+xŽœ•mÑ©Næiƒ»ƒ ·­”j> …(~Aòk¦u╛Ý£‘KYËàûД‘˜õf,;ƒ_^°üŸA¡þU¾š·`#P €YۏžœÕÌŒæJ‘&×Rd"UëJŸ$Vñü™ÉÔK§¼÷¯ŠÞc¿|·³ToT„ +Cðtyl =a y3h^Õ¸]éjó÷¤˜‹bBM?öG¸Š­Ãmá½Â£!À·Õ}êN(u½<‘|§õ^âpÁћÞNjŒ'ÄÓsqa%mŸÌÕur¥ö®AcEDPÛ«¥½c¾jñ–qÏš)_ú0‹<¨Ü@œœzé—íétê‰Ýì’Su@x`úù¾¶® vÛY]À4¯Ð1èÅ®âvÕRò¶šBΪtMÔ©§¢Þ"P³Úd|ãý•8|F7§ÔiWŠà1Úãê­«gµÑ¬ºt$C±^ŽËôîpRñNݟóSFd·ˆ‘*[Hʦþ%Rà#øN·F$å@zUBp@tÄXt¿zWƒü¨÷° Þ‰£EùpfèÒýå­æÎ¥S6[…7ÅlYû yÕYOoǘaÄ»×Vì0I^Ìì;ãXŸ"i4+%³ HÕ®…'¤­Ó«>ô,€¤èPV ä„ËEKÆj.:m"ênæHuR4h2Mj=„]í"@Ÿ +Ž·B̈|©FRÊ?/Áa;Iô]û1¢,™¾nKUF8_ñå°ÃXº|!ilFhÚËÔnú‘˜jàÅÃ_½sl­ÓE±èr3ˆæ–ü’öd㍩ěAw™ø%‰{—«ñ|P²¢Ž©Áü½@Š*Î+sOa&d»ó·©Ø×®$X“ŸWž‘^@ú)%CC­ÎÌc,u^Źt4œ³Bڎ1@ƒ J ô4Ôæ—‚l N wÌëç‚9c€s=ŠˆÄÚÀî’ózÑ"Ø1U^%Ç˜‘¾â`z¼ÛoÞ·L‡ë“ŽáLbƒF6õJ—o§¤¤øW +K01çÁ)Q~Ï|ö1ÝfʗKï;O͹!÷-ŸR¤÷@Öם‘”³Ç.*›5¸e¸)Â<Ôïø¢ºöðÓáð}ñã_‰Á9-à€Éí)fÀvqrL(²e yø †±Òk?„ÄŬ’±V÷˜×..¨]ŠÉÉÄ#»£Ù#ˆ¬@*ñÕÄÒõ4éPHÿ„jð$Ánå§C’>8W0–ÐPoö9@é÷¶°6ãél"ÑfZôÈÑh-Êb9ªryë–y²|Üá•,;½Lç[Î¥nSmÐ"0½„»hÊ­/›ro}ÊmØó0¡MõjZÛ۝úd´îé—XS”_t" ø8¡ë ùŽ$Ï@+¬;!Iœ9RªlOe(ߐs0⌝§Â>JZ™Ìû͹ú^Àí Eiª$MH/³Q݂§Æ´ÃqTYJ»ŽX…Jèh¹}-ÿòjaϏìƒÎr }†=/ꍆ{]Æj¼T1¦*£[`‘X·t‰*[TOЇ¡UƒEÒ¸ÒUåŸQÓ¦à½âKI öp•¼Ûÿr "±<ÁÎsʓÔ})ËI¡7_º;ÅRœÏQ™¿'"ËÜòCe$ê0Q¨ãçuȋ29¡ ÈmžE¹L]ßWÎiŸ–ÐUU'tè4m±õ8¯‰ÆXJ@•†)Àô§ùnMÐ p»DY„Hóþ¡¿c2s(t£„,Ÿ÷‰šGqû€–œD§Ë…b`ò¨™…QÒ8kÑ'‡ÿ§GMýîqœ_Žz\ vßÙ!¶êc.zËj_z’TÆîã˜ÜñxT²´Gg@¨‰Wì<C•  ˆ?A“W||öpî®ÙRƇ gQÔiœ®¢j°YÄ:SÒ}8NæÌhñ_¥²É—÷AçÿôX[r¥•ª)T˜ž¾èÝu<øbÚÔŸ¹B€0ÐÐJ[}Q!´8…XÇ~ސмâÁªÝ\6êÂøÄ7ÆuÅ°¡Âüì@K™¸ð! UYüDª©_ž R6IÎ%^Ó"måßû$1QÀŠ‰7ž§¸¯Áv¶7ö—t2\UÒ¨‹²4ð ߄â*Ðø:õÛ&t‰×Ï»âãwE6N*Ŷ§7ÔÊ7å*v˜SÐã~ 0´ž‡U©kyúx, +÷j)¥— ;†ÁD £r'ñ °æ1ñWM²¾4üÐxEùéj†G‹ü4Gå7n+1¨ ¨$tÞ0ÄÖi>ՕÙíN=?æV]W×ú‘vΉ$à6ÿA‹ðj…jºQÁÀˆ÷cJ·u€à…2;¡cˆÑû®ÉaHœôá›þrl.Õ¾ïÆ*~±)ʉFO rGFØËRüŸEX s0Óâdž¥ú¦ÈUdÉØÙïd-V£`Òéuœ_5T]a4ª–ÿJÈÙÿÄã5öÆ/ŠÍ‹cÕRÿ]àÔa¿F1}¼@@QôœDÐå> ’œ¤Ïg…#Šˆl +¿š²Wô UÕ[¥ ͞Þθ _ë$«á–9™˜>­&‚ÂÄuí`~ çp¤‰€÷*‘Úò2ùrٞõºþ^2*í‹íl𙓢•04ñc ·*”ª‰@%äç –¨Mi€-ýØï¸~’ Óat“u䦁›(݌áp:˜úŒ dÊ4m`‰_™K¢ù5½ãbZd`VËoôÑ·<&,*QÁJ¸ÉH¥Êoø³š«Ÿ8/ÝDG²h[Ž¡ð’-E°”q»N§¢`¹ˆ=uº{*ÒÐ üãiQ +Ø× zÞúˆ ŠN"¸† {\ñ£¯Ç´®~Þóg–ýE +‡MÒ c&ŒB)K~Cl7¦” +Ü<†îµ~l“ÀBÓ§ø.¸ælî³9=B׫k¦)g)è£Óa̽¬;^åû¦dˆ©äè-à`bUõš.¢ô£^ÕYÈfJü±„’@t”Æ؄}œ'ˆˆkfªPY(ðI€Sό¹ëHh‡ƒžêûY6qÔ¡ O´Ô »C¡Â2ÙÚ[ûÀoÃFô˜H:[ê…å˜ãÂx9‡_“oàýŠ³vy›-áÀ:ȕ&N0šya-èׅÛÓ5Ô:2‡rÊ°„?ѵ;¼ìÓ D@¶bn¡b`;!ÈÍèPdàšœ.¿k£KjnO¦Äi>Yó )4t5C;yê»ã ®à¦× S} +Ô7(z$ÂœÄVµ­VÜ[;N„ª‰ÈZè:´§ôW?4–rmQb’¿àŽb…·[*T‚á›ÇbàÅÚ>ñBa+úBe'#ì}Ä—üÒþ*w­2œE@p³Wà ß6Ö¸HDÓ4!rîÑR­Sõ.9bM­çP×Q÷ó¯sõ´ªÕÃgTñ˜‚šŠ÷Yq4Ës)U}@çY™“Z*^¤!#1M€·~-é-@µpéÞ¿©£¢Þ÷Iô:t¤ó‡CJDÞ*æӖÅqúKšˆº·r0jNÖàðßç«s‡iœnÅJ’,îÕX¥ßŽ|FÉeny«ññáISlP¯_¼*ÉðýJ ¥´§RôUѼ¬§BC劎úª‰™w¸} ֘#ÙJS&»·é8éöG”T&j¯6~ŒIŠžG/¥5¡,щÿÿ?&ñ¸Mâ@õ®kLN/Â[òFLïîül}[("­â«|<&AžJ :âùÁ'¬àøCØ¡jRBéŠ\5aDÕ®67íFQ:5³Ê"‰ÎqªI(;„¶ÈIó±‹îë.÷` 2ßIÛÛýTYi#»$,nÒå ]2”ÈBé¡w-‘\ +èãñÚŠPU»Ðn…4E«ŒT:Eø +›;CIØ5¡atÕÝ10uÝÙ®rB‡t²V‹w­pó´a"g%l‰÷ÉR|]…ÿ2:’ÉI©Š:‘ùä "]§ÿa”ç÷uFtÉoPŸzý*QEmõ->û*t¡xoC³7ù€µ(tÈ|¬2°Õg³_‹!h’–{p0©ÕQ.*=@Z‘ÒáYUÄ"[ŽQùÎÇî\PØԃbÉì"™¤»J\°>Øîã6Õ¤(°“_2,³3ÊmXd­MÁTˆ:ŠcŸ(Ç×o”èӉa·Âëڇ(÷۝Á%Qż#|ϳ 'S(¥šI +ÃþÃJ©CïŠy×bC §é„µaÞ÷`M°Ã‰CԒ¡R?Ÿ=@NŠw›Óðß´é¦U Oÿć¶>ºy ´#Ëm¬yÖI[âÔ$õ‡(˜¨k(+ü|Y§ç}NÉõè;18XCÌyÉêÕ?®Ã#Ç"ÄIÁz½b4Rñ9ÇmX´d[§2Xý„›™o‘Uw£úyè1c¼Œ‰´*ž2eۃ¼ñ”¾ªU€ÕÖ~‘e'Ž”r$ü¨¦Þ¦!${ýPomÂÄ@t˜FâÀÖaҊ¾‹út:Þ%¸¡Ôd¶€ˆ%0¾ë$ÀЖ¬}X(°m ô 5Æa±l'¿Ãb¥¯ëÁæà|^,’¶Êeù„3Œ"AèÆAVà'Ö¥Š’¡obÑ$á7‘è•V÷ ›’zVºEÞ¾[ŒèÄ|áÑ.ØCå‹óЀØ&~YŠ¹ÉñðõJ #7¿Mæ¾a̟˜âäðœc€¾7ü_ZôÅÿü«; 6²©ioL92W¿yƒï…ÄšQI³Ž=0Aûüg~¯C]—yçævÀ~<¬@WW÷Y¼Á°’úª‹×s ò3•ßª<ØË*˜iùÝã§É¿Â­|ԜÄ` â;9ŠzÛ?5•\‰G’<(Âs!RɯX+¯I5xÛÑÿÚ'ᮇYϚ ÷Y5™5¦ú˜Œn`™Ê« +µ¥*\ªdˆ¿AT¤,;…þÓ2ô7‰ke­‡KK‰Ó½DÓËõ8VK‡¤=%öÛ#Àæ¤(3Ÿö¿KékVzÒ¾WìS’p Mà7Ø´ë. ùÚzƒ‹=«r8&:H'ٓÃF±‡8#&½äòNîJý“An ï³"qÞìO®”挌Õ2i,Õt†^xG‡ŸKê è s><Á:Ý·ŠM˜c«£âCìT>PïìO<üp2¤qÚB\ê/=×»Eʤ$¤”~?|ÛoT‡ŠÀg7ãыAå܏¾ª ZŒùºt~/ «ÀDgÇ .SV¨DÀûÔpV Õ8lèx×|ó‰šð½Y¤™¡õÌ+¨ãԒp`Tï +b!sg,Ñ`Ћn ö0-QQz­Ùn¦g0Öƒ°ü¯}í/?Üvš±îN1¡†Öòx}·þ·«±‚ºN™yÏ F÷ÃÕ¸{JµvłC¤<üžÅG£3¢äLð›jÔîÒ"6@ƒT cͼRði(†Å¢ejÊ­­ âôʟù-Ò*³ó^ac ò}±î|a}©äÜҕSé)¢dŒIHK„÷I¡yåz먍K´ØÖ Å {¯¯ô:™('DâŠí?Üð,^Pd÷—±Pú~ã2EÅéöJTZ9E +£8SNA!\.ßqZ•*|[¸bcŸMF¬Tˆ°Â?Bö7¼€ëûHb¯ëô®¸À¤\€ftœŒ…?SRýoÎáf?v.íý0 \š×0é\D*òË4Ø ¨6ô³q‰ {¹$s<#hÿÿnØ\9p¯9ÈQ4:¯Þ'Â;lÂêÔ!©FÜDô—9ƒÔ]_î5<6)]Ԓ8W‚¨Â(ßÛ\T•è9}ì|»àÕӞ”*¤ ŽÀ%JÂOôP›ëþ(uþzšV#9—”¨¡ë¿ðäHÕÁÉfÌÎm¥Æà+)_æûç^Û;ã$>ÄV‡(ui¡ìåÝ4ú›1ehÕãkº {Ù °Û$¦K”fŠk幞َq _‘gœJºJ¹¾ ó‘|K}+yLmPEdªlRybWÎ㶊Ÿ/28uø†&Ü{q‰*¬ðOÜM?#Hµ{¬PzGãh ++V÷m¶6ú¶mÛ×c99ó§8Vßÿº§Š>®]EÇ ¢y_@Š$Á4åË ůé¿]ûáqÛˆœu´·ñ±9D՛Ý?—±’°(?Œû‡­Á|Ì؛ÒCs•;¨¸òðŸ¬>ÿ2Ìo}ÊU¹(fP«ÄÈJÕX§±'d¢÷„ÚõòÔΟþ2l9“æÓqRIÃb¨Ü&<9ŠÞ*ºvMÞS% d4W ÊWóüôoû銺xðýÆ°èo?rn~Îb±u{ép­[Më¡x8BÅ>|î¼4Jk°|/¡*Վ¡Ð.FQâG«ñöÁÿ·7J£b¶O˜‘:ó*©›$/›3*Û'Ìdêͱ<‚p£¶)SgPÒw§è¬«£þزÌáÒ‚åû„L²¹vYõ +%I…ßîñ!Ó”‹MÝEîw¬ge01ôé®T¯L¡iL°ŽžL¡|—ò~„6WqH!”øÑÅÅÍG!K#|‰kÑxâƙŸP‚tònIßK¡iÌMGÄQ—Bùç`ڍBð.ñÑ(؂f£5¾Ä5äfA_£]ý‰o!%ÝÐ(iH_"-l9+gâk¬—°†¬!&£Pjüé·òKö"úe¥Eý‰o1%]•B€Èo»Vü‰h¹£¾Ïý¢´Æ)ûni5VL)”ïý㝓D©‚Ú™™iºê§£ñT¡O)4›ÇûÕŠS)4²À/A‹úºn]š4V?–T¹×–R†1Èx +U:§ª†7¹T •ŸÊ®§/ý–YqeŠBðŽÕùDÒÿÅ0ŒX9hR(§éþáÁ‡Zb˜d 4”5é¸obRȲç33“ËP€Ý¹c “Bؘ3»í›ß ¡¿«Wøm£nb¹ø@ÁÄħteûà*Š‘zHRhƪ[ÓN²"8 +Åõ˜†W¯måi(r¤¿]+?´JW±gadðkF‘=²‘Ad¦Ê®²z“2Å”ßH‚YI ãÓ³5~L#ã”,|ÌîKePôQöS‰‚ÇôÁ6CdǤDmèX*°?r ,+©cwo>n Õ 5š—ÅòÔ[šÅŒÝ(•2¦_Rl(ʑ, Æè¡Fċ=ª·$ «¡Ðb—Ì*Q°Ø}Ø ŠÓd½I *&}3 R, ¢ $A1pÿ¡ãÄ0ÿabØJ‡3ä¾&Q˜ß1+FìQ†phˆˆÝû‡‰CÒ÷4@,–HŠKŸÇàð0@?Bt–T5OÁaF}ÚІŸÕ Ð°£” dXLýÚ^!‚ „7I䊲3S dì¡$a€Ò¯~dšfÚ¥ùr)Œ=¦Ë‹2§ÁôB€Á¤M›È•µ` ¿Œ»ìC¬fBõÅíôÉ~pR&©ÅØh€0ªs­zMm E–g&À¶üæÄÜ +ÀêåÄû¯ž3Üjü‹¾g‘þb”œ:é¥Gnf’ OuÎ+-\A~A+Ã/f½9î떜À“”äæ-¥á”ÔXš[±òD¾6=pNî(ò]li¼µXÀw ¦+XûFïZŒ“¿¨•&UPKÉ`ÁÒâhW颻dÀ“Ê Ó)%Cs¢tВS+}×Q¯øÖÁRñhéW”4HÐKß4˜´Ì⼨¥ñμLBÙÛî‚ÑMJEEõ‡â„ƒ”Q‹è.]b_p—üdxlWâ<#…v†ùxì’Ì4u`—d9®+՗A ëºõðÕ%+`B ÔnÄ&JL—Öi !]•îŸfš@DWú7st]:¨Äs™ïá~7@œ ³dÔ §¡Úv t"ÊUÏGr$W|frUªæX8®~ +㢈F€©Šâê[ÜZŽ— ®«¿1† ӏ…;âð Áõcj×#)~Ëô˜ñ¾•6ŽÞü‘ƒ·ðZì.±ñº¥ÉT‘[’Ì$Yà–|€ì_Ãⶑ]"Ø߬UmõúӜù•Ë”·§K€‡ÑOŸ3˜"Ѫ+¶½.XçÈmcžÁÄÿó*r,ŠÛ˜¢ \°DÑà[¾D™M?ŸòjÇ¥ŠëWø}×h€ Ú¶¬{$Nƒ$>¸ ÛÛvjd¦ÛWõðª¿_ºLp»j(ê£Kœƒàe5¼È@Ù.À 6›;&–o£øuÈ ¼}›ùoÁ†©Ž@Ôù€Žk½ɞVSq  ¸ †Ô¢)n…ipA—&ר2[𙀠„ÕÅËgëãò<&ül)_Ù8®ò—Âã[1Ü[ 2 “sz“ãÒ¤CÕgxR:@Ç¥þCF…âO· Ö+ÊJÀ$Gá1Vèœ(Ð)äM‡—aR}ÔÀoìB™mc h endstream endobj 121 0 obj <>stream +ó"qÖã+rüÐJæܐ· ۏ·C—·5Qò´bŠÜmAõ¡JJýúb݈>áå^~¬ÛËÒÈFBÙ_ÖãÊÎÿÅtâ„Êjr[P´˜ñë!aâ¤jÖd[°´hòõ…Yá´#‰¾'‹Bª:nÁ6¨ÂÒÓHô¹Ë×mñ¶€ëD\F]bMnK֕ë -4åhp fü.[܂N›S‹(r ܍‘Ä?gÇà>.•üÿúŠeyðqY£6N¸6ÔU‚z(\b3»A™ëŠá¦-ðú_Qn#&p\‹¯-,%Œq£-ððß0E­Æú¦¹´ñ/'Jïy¦-€¦Ù¬µ|4)ê³Æ%y;|vWßóòþ´%]œ©P÷ Ñ*©‡¬1Ÿ|Âñ6¹o‘xӖ$†L½»:€¶À{Wpåg½ZÖ€Ìo%ŠÊ m¾ùkó04:ÑWJA`Üá}£“-@r\ŒN¾×å@•à˜yìÆE¢6Ìmù߸|Áq'¢ÞlèÄDvŸ<°(zق-¥vðñˆÎqQrÒÅßÄ}Pâ¸XûÂõ Œè\®- €{aIªÓìڂ 'd6ª‚Çk †DF“9Xm3hFowñ[´B²ƒøç­Jڂ&ªÊý…FØڂ¶°‘w°ØÓe4 Á¬àºŽKR/¢Q{%¬ÿmoÒç`òòÝðνˍ}êl ¤àûtùù8G½- sø¦Ðò4Þ¶ &’“4ùn ÅEì=€L€ÆÕd¹x«ËËm j‡á-mÞ¾Ñß½èžÆe÷;#ÇÙ3'NŽæ¡P¶àC—$[àAÑpÖ¡Œ{¶@o1 +–³%±lAõ¬@Í7͚Êق~u (RqÙ!Ÿ•sCW‘ÇåÙJp¼k}ç{=²œø- +×ÂÐ7[@( +…¢Ê¥-pFÀ˜Ö0…À¨ú¶S¶@ãXʇŽë6ï7œ"xt\v’§V®- a¦©‘Æ!Žk›ˆí6¯9®“²W¥ySY@ڂ5‡|-kã*‚Âÿ‡€¶6®Èè«Ô»+ýnڂ"§ç&­ù8¬-X6Ë®sõ3+ÖÔœjíC“h ¢;»Ï!/.ÈT[€ß7q‡t±B(•4mA åìà·+šÐ´Þ°A–ã¶Úm)©µQØU!fQ#Ç3®ðµ¨#·¨-h~´>h£=òŠ¶ ©whg°ÉHãr¬ðÝñËï²Ð¸]Ë£s ä¤qA5~¢æ¯£-0GÿD‚ —ʶG[0â?Uˈ„‹€U1ä‰S—ð¤_yς†Æ{ç•JVn ñA?.MÛv—Ç̬|àyïKÅZã¤øðøݱK®QËTc“›“+4ž‚= Þª7+ ô|P‚ŽÅÛ@ªXÝ{à&Ž±¦ÄŒ¦ÿ§äNÎ.ĝbÊãß 7æBÿد¤P*¹<Äz—w"b…²ÄTì)ÅÊ/ñ‘Íèà½ëo‘ C+3¨äĕÃ^ɐ©s¿¥tÓÒhlk:4â¯KshCí—`’‘ë+ºÊD‰Å¡&S<-Ý6 J-$¨éåÈ¥²#:É×îÍzîù7yb7rónº¾Åè¤Fî•Ý›WŒcøé³My@ŒÐà _W1&Q& ,TÞ+\RŒ@qQ÷˜åD–¥°@ÀðbäRð·È²È½\%?a|Ç96¬nuJœ’®­MþađK#º•oÛpau‘Hz +™¯þ`Ô =?›p¡) {õ}xÑ)®e~qÁ®™ÿb70û!P ÄƲ"ýcõ_H^F âÜ ŒN~H^ñ8Ðvó 'y5ÄkÃÐó–vÉëò‰Jr +'H^2: I‚7uJ^$妶÷# á‚]]'XÖá‚TVi; ´Â¼·—„G×%/ JÎ,$Ïà‚/C0…`tL¸d€ltŸ%ç˜ÝX@”—qåÓ&p4ÊtæG8 ¸€f›™ò¨aÈà‚aûÜÈD +.x½”K¦f¿7$/[ù]lNöv$à‚4 Z†Ç‰v¿Qً̿Ä>͂ $™–}âó¨xSyQ›SÛäòÑ".àT’NK\àõ¨'Ï +ÞÌ8À;ãá÷Á¼àcaï­jhCÍÙ4ìS?.pmS`§„ ,9 ¤Ð-=ó^Çm÷‚í*±¼-¨ÇÜû§…q²˜ìˌÃ3¯Æ'‡þ=<óÅ⠈ÃOæÅTö© }×ÄLæeÜAaT18ó +Ȗ¡`7.`ð_\ÒV`·|Ì72ªÿ’™×rcOÌ:‡—ÁÌë+6Œê8áדy±Çd0¤õ\¸â‚F¡ ˜V$`—¬ •Q\ ƒC“†ÆYŠ¸` úS­‚D*.À•xàöÀ.ü å ø€U–¸@¬_PL#J:qÝ(E!qÁ°>aÔe0ƒF1¯JÇ/iªàwqa¢í\Ä‡ÛMu žÕÅ8LàÚ¾"±òᆪ¼^÷ÊÊõIhøSŸµ;qÓØ*ö43ß¾…P2¶Lß°º. §d…àïñêÇqßç¾²™‘ÕFMÛՀ4‚]uÙōt+¶zÚ:Õ 4Ž¹qÚ¼­ld±= ;îÞV“]òy~q·îìgØADZ$u–ãe8Äꉄ À‚?ƣܠ¼«N€8…Jë1‰‚ï`*A,œ!` +WUN¡³ …“¾ Œšœ$ÈkqÅvöPÏAnÌ +¾ˆÉ‚j hÐ |´µaH·é ;“ÿ¨/ +uà$b%ÑRÐf®§.Ü´ÅM°½sÅ>øÎÍ‹× Kw7´4(GWgšæ%ÑbgìBw¾Oʙ VØH%óái°®L:Ïý‚¦6 +b]ù¯p#é¯ñ¿ØÚÇo'ìUjBG]9=0E…t¢?Zr!b|vSZL,‹5ؽ¸VuVŠgœÎôÁ +ºZ4„È×ö§Sêrq¸`ôÅùjGSzMÕ'ý†‰¥yXæôÞï™%C\ʺ„œGӠǯ¬#–PÉ©*‚¯¸æbrü®;ü¶# +ï>Ñ.O\•|¥è©ï2`ÇÞªÁ¤ÉÂJ¹ŒqúùÈtȒUÂÖ²‡9Ò´ÉCÁޞc-•©3$™Æ:Ž?»p©ë…[´‚Ü¡uÁCñª-ډ±ÚÂ@aÏ¡}—{5`˜_Tø~ßM &÷nUۗç>`ƒuŖ€B0;s›•°Ö‡Q8<µØ>Ü)úž@"HŒ9"ÐÜ} + +9¹N‚‚½ @ôþ5ñ‰\ý*$h qäÈl™Aùè6áj]U\Èê»ÕðŠš|K9((aºÁU÷Ÿ=1¬ëÃÚ 3u”ñ%asÀ{*»T÷!+S®SFÍînâüi¯\ÚضæÿäÙ ü×#ROÑç2fó£ý±îOcD ±KzâX'$ÉÒÖkO‚Ë,ä¿:¥°qU|ÅMç/šèŒ¼'éT„³þöë†P +N@ÒùCȏs 9ƒkjµ­J`¨§X~ñáƒË…-Òᐵ­ÊR‰^Ç}îyK›hº9zt£ ˆHjc–Ì8©ç™`UÕk¼ ]"«ÎÜÚ5Ú¾»Ký}ÆpYӗ2†ßØҝ]`óÉÌPoPI§~zßäŠaåÒ¸X†¬WÈĕ«N_šwd":XE¼‰;'UO: ãÚû͑ -µÑ%@xÎ,CÇeŸúø®n„ý…•g/øÐÚ•È)lãBöG÷S}PrqÑÈ©1ŸÕìøhË v2¹Äµ7Á4ª‚UחkLJö¿e #(í¦V S ‘^4]Œœ²»9»)¾E¼1º\ï¸÷Ôû?S˞œ;²ì9Õ¦~xÔ9}>ór·õAÂ*mT‚—[F[?¡ÀA6qåYQhjÖ^× Ô÷Sç18gÎFÍ ÚÁ¬(˜é¶hÁ’Ôê)#3 +dcÓ&[H]—PU*2pÏõ½þÅ£ò‘û2Dž3Å?™Ê0 ^Ìì?hç¬^ó®H¤&I÷Û¼Iñ?½„Z…zÅæN ­AƒõhêÌiºjï÷œ£Û¡.ÙêhՍ¦n`%‘÷9WØSž™,ÿŒ€Š*nè«Þ¼©wÆ5V–¤ú§±ÌÓ;‚gr’ÝÂøqÍFÜÈml-¢äî&=9¬9DB¬'Qi¥²†|d‹,AÜÃÇï™÷Ò]7¾Ææ +<šGÊà´ÈòpÇÙ?‚Êi°=v=a†c­2;'q¤7&G¸f ¿pô×;“ b|üo]W¡Å4l4€PñYrĀIÙf•×~䪘  +ó¨?^æe§KcâYŸçz 1Úr¨{ÄÖC;iÁÂDdןJóMQFL‘̸@óñaÒ߇Á+ÀNJÃTûي1ÌööëîòÖ:ڍ±cR„êjí!=B:‡£K³ÿ_XÏÉߥ˜À „9üi)N´JÀjнûì05çëãà8èNëÜI$¶%Ïú‹&´"枓‡Á5ש›¦=O>ñö­ôÜ-$²%Å^uÌLK‹Ït¸¹¨[°}¢»[¸‚µ‰p,ÁÑp;e;zl¢‘¸€¯wõ¤R2qÛ»>hêU ÐHuݕ>åÙ. †œXØɸâjJBž –Ùº§VJÍéCK¦·gâÃ-C´%פüRÉéT3ªr¶%ÞZMÕx‚<^>cĵ:š<Ûãûœ^T€ŽŽù¬»ÈÿºWb—N;.¤÷UŠZ7/•1†úb_xN%úF Ë»!ï^£„Gí°^2 ž!ID˜MÔÃñ3(ƒt7ËC\Øg>$<š+EªeäӉàz\ĦùŸi¢kíhþ Ø)šŽØqŸ¸¹¤LZeÈñFš½Ø]ÀLYqYieOŒ£¿…Èóˆ.ö6ŸÏl} -I"`àÚóþb¯2„†Ø¢Xbe‹±qŸ7Tj?Oê¦ìª> ‰×R tXcVèä;)“Ѹj›ÖY‡ŽRWW©ÔBìöè_Èו봠è—?ró•Ê”Š¨T× Ñ4£ëýý€|•šJ)@QyÍÉœNå›(mùó)=\é¢pF · äµ%OŠo`Aï»ÜÍb]’Máë4ièÿ”{d’ڐ¤<6ôÔ +7óÌí¨ëBØï‘~KùŠ[¨»ºy;|èÕ§`m/ÇßúÊ¡{Hy©¯Äž€¼oïØ)"«åŸë¼Àré\ÉHÿýt þª†0l‘GM¶àquʝꢿQlûêà•½w²Ë¨¤¾Swi"Ñ{uzC™â¯Pº:xPAqÈaßloZæîÂî Æ$^‰¾ð¸î'8Ì^P}N”çu,û\4{µÉŒ9íPáñn´H)„ú´Ä·ÆÌ=Ôæz<ðžh¹åjƒ‹K%žp¨¸ß—…ño×Î˼n ë]_¥‰rÝêk¾B„tF£YK3[©Ÿð¬Í]³µEÐÊ#|Ze•˜Œ6¨6ÈΎªóҞ„‹¢’Ú'˜¡®¦õŸãg¨m_lŠß:»Xü]ŽêŠ¬~á® +­I”É›Û-ö4:ž†ˆA 1\EÑTó¥Ñôy`âÍæi†åùcâᰤÚß)>7!š#¾ÎÁA(¢ +ì”›@H á £žšüêí žûߞ|ðý>¼€˜…ñ0ÉÑ5:ŒÍo«ÞãµÞNñGè㳼طð`͎‹ÉHãl_¡‹$ŠÙÀð%zñ'×íŽéÑ)ޒñ,æ +ÑuûhU;×NYÃÛtH•·.‘üM ªé9\`]µæÉrêlôˆèÂ\?ÏÏ?´o é¾déD€€¿×ÌÂs”RR¦”dJdøFÃséÉçë!6šÙ¥"ù܀ ‘ÇõÅ O3…Q·Ê6fš8y&fµRlòä$9ãW‘¬.•„pBÔ&Ú楪o 9F<"ÇÌÐÇüŠ`é0Ú ÓD} ù õ’óÈQ Rrå2 MÕ"E°Âëf¹“©žBhŠ žŠ ND‚_¾MMÄ+4[’`„…’Oá ·0äºÙAµ-îS•X¤?Oz#‹X‘@ 2Ì'%|9<;%ˆUŽ‘H<œ›gªÊŠÒñ›d—=ÂÔd“Õxž@ì0欒 8‰ƞ-,§– r.CÇêՃ‚Ž ²ï9ë+û/—2D’oˆ1ÿ=ïkZ”ŠÏÉw«¥ª»µ7EúÚ³‚×wúm¥ª›:zw YDP‹>kqn›Ûŕ¨$„ Û~=V‹Û Mz÷ô—Öw}<3æAúœä‹(¸ˆLus„Sszp?'³E{tìw>v +4…JÅgÃYÅՏ¶z”e.Ž Q4N˜Ó«ÑÎ(ô‡)§+›3té°JAvœ +ž°¸FÃIj)oar?ōÁ=¢(ÖLqVŠ!8ÜKѪ=Hdߦ†dÙ$‚¡J(- ŽûӔí(U&QR¨¬<$´Óʘ0ºæ µH¾0"!wETt|Š»d«à1£ô–🉠‰](C.¶Õ 8Å.Ä=¤ažøRˆEÌË)ܯ+‚Ÿ03aòq¨:¼c&ŒÄܲù5Ô%³O ”žb2‰LQh‚1-“„¨Õ±£*h:Ý}ß'Ù®[âöiú`Icj§PŠ§QâK­Äh¦Ñcڛ{ƒ%æ¿¡TMlsyÅ(Ñ¡A%Œ`4”"$F™¢p†82g$ÓŸÁ¡7k G7k÷ćLj1xACWe󪚪î‡ÒñÅDý¥àº›R^ÞÃbpñ¡hM> ±M®zr|¡ñ.R  )šwñ%1¡V2SEÉΆj*:4uµdöi¨+=B9´bõìÈM„)£,±k5+™˜R/5 + +™¨’•¢%¦EÍ1¦f| ‰·wD%½HÉЋ*bjõ³î+>û¨J&La ñ›ˆ|&£©ÃåR¾Œ©ÕN[ñOï*5®þ³Ï“­lÉL”Î!³B…tfH(™×DG3 Úˁ„.漂( %æ¬+îtK#éH+B¦BªŒIýÇâÎCœ¬*è¬TçÁŪc9«¦â’øÔã«Oа.b'¯Èe6=¬Nrž«ª©2 9=Dø)"Œu"l]…DYHUá­&prԁÜ9Üʤ9ÒhÐ îñ2â$C[…e»´En߀Úûۑ!kV ËîoÍPÎsFn/0°Îxk¡‘&Ó5„ØðPU7¹üá}¯0^¢„£âg OÄ‹ù¡‹<ÅÕB[S•wf$ǚý,ÿ3AûWKµ‹èfT4¬YÄT…k%äĜˆBhœìaÂÞeüò˜Ø×0ÎRªEx"|Ò&aŒÕèXƒh†6\7U½Søú(‘Ô¢ø…]CËFŠi©­Ä¢µL æã‰aÊN«@#?†C#éçۍž„ú´¢fb)©ÅOÁ’èe(Ècô"Ñæ5剄9åžÅ¬DˆƟêN‰ÅG«:žÔHˆ 5ž—'/5W.RAŠxbŽÈ u5Á û2VÅX&É«êñ®Q‚ĦÂN°(êAˆ'áU,rÔg +¾=Å°)¹˜ìPlúƃê +lÚh•E“LxÔqwõjAîg¼úÕ`°\,5È,Â33†ŒDî!bIÔÄ–NGKɛª ‡.¤ªÁ¡”-RèE­,‚mÚæôJÎ/UÃ<'™{:HM g!'ˆ”œNËJ‹º¬Ë¢¬= ¡¹*\²šF·‹ÛÞy¿Šý®.ܒ©ˆ5 TsBTʬÒ§†¡Z©ÎË»¸e\ª‡X¨’Tך†ªg¨Âz5˜P92DUÔƒä¾Ú:HCo cèä".s„ĵ)<º.^†»°òÐÃr/[Œ a¿!‡(S¬ Ãt›Za¥¢™× 1Ê !吙>—8#è—ºӌ.9à<ŒÀH| +Ɉ3¦Â&ÿPM ¸ÄÚU­¦ÛKýoÈjV¬jDàãԑQÉTk1£–é#‰bb™`[±yÍIcèv$ÂéôУÕ#o§6ùÐ㨚"šs[ŒˆÕCÂ8£HÅH¨(á"$¬¾Kˆ¯4åÎ,TÂ9ôH1(¢¤vw'®ŽN…Yrµã O!ZŒªî(kj1Šzj]T¶\8w(ý´r¼u¹#8EÔZë!íO•jé1„7¡"Þ¤E¯ +4⨑@ *T!f¶2A'5J"wÔ+Bí”åóuÞ&*›Ä‘9Lm1Ñ+ ]HÁuI½¼UðØÆ´ïŠ>­EgZ"7k.1ÑAÓNKÉ[ݬ zÄcÝî¾h\R{˄Õq‹MÑÌk´™ZêYRÃðší¶FO ò„oñv€BÒoÚƐBµë©CžœÆ45–^ˆ×DAD S™®õYÔLå\­(iz Õ*TOÄYçP%†I(™zú28õ†Cµ¼ £ ibž™JJ¬Š‹«Ü±ÉËMµÚz+Z!ßsi††aѦ0oT¯†ÇèÞ4N‘ñ¾ckcX°áz áx^SÈLM‚ˆ4ŠnK;ò}††CÕ04šIŒ¹˜Nԋ"ÅT¼ÀšZDcâ)(J³qŽÕÍý#*bï1èb)$´Cִ濞ˆ¯'6hŽ:’ÄuÜv¡3ãÕù‰-B;›âÄÂÔŽ95baªãzuG3ŠøCrrÑn;’Ûð†6æ I0Ø¹®ÛæÔùØ¢±W`}ªIÈÈîV%|¦bPi¨àó™—g + +þIí)é| ÞÇcJ‡šiMTlHìJ¨!™ê£„hªæhh›››(âè4Q«¬)3ÔLøásRR34&Ǥ^Ídj&Ë%Ó Šÿ¯‰©þŸn@ý íkA¡ò̸Ç©P5Ò|ªì­!Úû£™Xè}8x2Ué- 2$%QDzí`¯|Ö£TyˆÅTØNçx»zí;æ— Uªid6âV?|Xy†Ç´ÂÒ +ãiƒÇ=ͺáŒ:$õÔð^ ¥°ËŽÀÖ!T儁-efQl 2쾪¡ô5tT&‚´‡é\j¸£KmGh‰1ŠŒCO eØ÷˔›¢é¤ä’øó ¯›#hËý¸õ‡‹b䢒dz붥 é¨<1!újòWƒÂûê4íCó6ÐЄ ɪ6æoÜžÚ °<Âۊ V)LÔû/)H¤xr[ru,³P'ÿ +«ªÂ5'Ó«ț–@("ܪzTiJ܈UCµÁàÚX.®}Câ ýŠÈS”9B1T¶<Š¦Lú@ä @۔Lž7¥°)¦8Åm>ì:‘‡žÛ¼BÏàñ¼–i¨mYP‹î>O=Tb$½XS7â4¡‹ÜÁR«„ºûË¢ÑBå(V&< `ٍUuŒžä+VMU$’§¬ c‹x¿­"¨-NIÄ¿¥‚u)ˆ$$õéBJ¦ö^õ½„ß”FªÄeJ5œ¨§o†6à.ã%» §’b‰Ll€€s]‹Ç Å„wÕ©Õ¸‹Û ­ÄöG‹ T§Œ”"Í)aÍ؊º¢5³vzlE—fL5´¸ë¤ZC”ÙÊF% RñQ­—M<>¹‹SŠ,⪘Š¸bÖD\¤Y÷™:ÅC…=Ô9½oº)U1~áÝ+ø’}Œi0©ûŊ’pJ±nÆ4y­f_ÕëÁUUöÉ#ãp ½…‚FqÉ k64µ™b.O¼š%­¬ :IÑ¥Ÿé.¹™ÒB—$.sÚÖ¨5õMޚz•‘–tfeF 1²àò,e5KG¿Â„l&¼â* ¢M4o>R"5D MõR(;Ía²3"åõ'£",B9ŸHXᏒj90X{¢8«VD–%¡Í8BQemD‰ÍCPô'@G¤j1¥‚tC⩲+­n‚® “ȐêÄ{¿>+\t²&¶ A'VI3³0H5X3.J5¨mëǂ¸fêUuH„Žñâ(&æ1ÔòšòyLƝ²§ {8b"¸¡ìþÀð„ˆOáˆh†(¦\Ú*|:YSœ®0y¬ÖÄ<,AŽ +U°Au2Jš…sNÎUÜ3©K“„iAoƒTÔJMÅkôëæÅäþ“¢Å5›M¨•ÈDÑÐkbž¶ +¤ø†â$æPHÉH[”2È¥iäk/-Ù?%¦ª×rˆQÀ˜£Q{7ýxjC =£Ï6™?‘Ô ´âÐp+”„Åò8ežˆ§4ŽæmÒ° D²!T/3ˆù‘FJÏ©ðùN3lëW'Nåé1áÇæ Y˜9¬ÃüHnºœ@P–‚á'ÀðW…‰åû‘Š~ovVˆ²’ƒ®p|(FA*›¨.HNç¥À)¨"ayôGÄ«ÖlމC¹c¬UæÍ،)²)ä$Asڐk´¬i|>–’MÌ[‘ô®Ï\w7Ý䒓ÒÔ¼7„o>º5B¸-ï…˜ýbP4S²eªã¢âÄÛèEsdUâÒ13•·ôsš y G …úŒ†}‘è4¡`ÊQÒïw"qãÙhW‡û$±‹DƧÓÓJ=ÌàË^Sð‚JÂ.™(µ¦Q13›Ük5„xµÎ'ˆXX+¡ƘT¦~Ú£"$þ/ÈY¡"\՘Á§rSI y1¸5Á í$Áº”?¹“ÉwÔ£ðÚ'M©1Uušmó¨m¤„ i8&Jc`Eô:';£¤I^.¾JÕúZçd1¹Âl#ã?¦u7ÂX¨â$%%%Awj&§‹³zh[õWUœ^ü‡ò •ƒ¥¾`ð9Ӝ,3Á%Æ\\‰Å„ß© +VÃY?cöËϑz]CO‹A²P©®äQ/ÐùtRqÃ+ü :Y6ÏSæsVóÊÄÃބk +þÀEÎP§_U?˜›D¿?ÒÉÃ_->oˆ"©‘Nè[RŠôq"×ŲRŒ§r—D)*:+] ¿Li*S3ÔÞWâ‹SF×õ“:£ŒCÄíMµµ~NYˆŒŒÛ)š!#¼ +-Ô+"¬8bªÄÚ©–5äPª K«ÍÜ÷22ÅMœjL¬~i©$§%hÑnʼn˜Â‚î!WEÄPW$J8Ÿ/Dú§,‘Ã|¤“²ÃÕ +âˆÃAÕ©§!¬€*„ ‘«&ˆCq +b ÅJ×e•Gái5dk4.„c*ü)ˆ‡"1;ˆ'$\]džö§:»Ñ…™*£ ŽIƒÐyñŒ › +–Ī°¢Èç˜Ì#³¹°E,H‚c°ÂÜSu!v)a²˜É¤Qö”Dì$±0ЬÙàCt*Œ.fN̈¶ª¡°YËÂj«È”x„`s8çëôˆÃøk7H²šȪ¡x"®ùÏ1Dà 51d—Ô¢b2ꒇҗ ËDpÙ¬@sl.Çá…á¢Â-AJ0o8m ¹á XHDÍ"‡ò©Ô ä()D!– +\¬¥øêªsr«ª¨Ž¶:¢f£(Ö^'©šMõgAR=âRN]âšGÕ#ö¿ÚisR~ÖT’Ây©‚…¨”ÊdÄ¥áY,(dÎ +Õ÷hH”1T¬E‹ëÎ\6í-ß/6H…¼B + +œ> Kü¨ zÖªÀsîŠÎcP|‡õš8-ÔD?W˜5)ô,©¨ÞÀ“ ûJw-l;ìõkr¡¿Z€dBìÎEHÔ*5Š2Ô9“:…ôÑ‚8FâIBt›à,ªËH¥ºœ#ž“gàêÒâ‚\#™6":!¨Ã{õᢀ!L¯‚æ¡NòCŒ[ªšPÕƂÿ»¬= +ÍOUœêLeâj‡,:Q†“Të!.¢î,nüöQA#a‡ÙŽ×pè9%15©üœt™$ù•8Ѭ²AbñP3eü™YÖécšùO®Ç"ڃwúÐPKcð5§ˆ‹YÇþ¥—Gé°°:@sLÑÈN­èS5'R…/ˆäDhj¹¦Ú,Ää‘$Ì?´ðPgCªÛ«†Ï3Ê£&(S‘jâ MECfDv2„bQ‰BJ¢Ò°Ða¡,›¹¦b¬¨mì0Á.Z ú§ÔÈaôƒð-Ceõ1d¡ÔÐùš%³¸ñQÓÑ;£‹ã¥@¹ã,N¤ËD`DcR§^bQ©ÿ˜C|¥"¤?tujHgEB#ª?V›8Â.ꣶ’‰‰mZ×텸J S‰ˆ}L­Û3a¤¤ŒÌÛ6«±ÃaÓ¹‘ÄÇMÈiâF¸ÎP¾Cê·Kt$„¨#ÇÄÙcí’–i*u,¨FϤY˜âD‚/Œ<²ÊÙñ´T´yä ׅ6 F*(±„røZ SÓ0¬àD€$íP™"/æ!“¡pDÚ#(£„=úzµ„JͨB%âP)>P”*!Ã0´*J-Á +ŠåµI°´îT˜ÎôþE““HÔ-@ì¡¯ì ¡í¯©à•¢B¡Xr9Ƈn…ò¨Í#PpÂ㧋Œ¯”/:Jöš=Ð÷7|¹Ðz‰ÑÎI 'T›¨@BbIjuI¸Iˆ +b;UTrW‘•¦´¿.ºÏr„ØÓOƒSPHD`¬b(NVAöxq"HÅ ”ùêµ­¡¸‰êÏQ_$]àLc +㇑9̐p܀*Öè×9ZÅVžøjÖ>j-ù§bXÆÈE® ™hL³Ká™ÄOÛÿB–ÇK“füß<[øö”b„í6fB±pƒÊŽrè†E‰Ô¸ÑMr¯hÅåd<±…áƌéb,¡EQ§Q¨Hn^O¡8#ÊgÄ"S]ãÔÎX¨@¤.×+•Ïð^@Œ¢ø*}dAµf@j9Ôfª•œ6.¾BqU܅úú¾ó±bE£$nd¦×yñh~Ҙ™áéͳÓH2‰’J¢B´9h*$'Šuª 1EhQÒò.<’å¡ ‡ñ]T¥&ž_|Єù„fã™Ï<9Ÿ¯*6Rø}jŸgä‹ËãB ÉÚ0'áÛìÅñ9!ik„]§‚$pQ1ݤ1qý2œà2 \Pßé¬ã-̶¾&ñ0f[ð#,,Þ$¶·©oA%7RL;trDÌ+†I†Í cØ"<›f™! +‘Ÿ¢î BEZÕ\c™"+¨¯ ù(ìóÌÇ"ú‡¨ô¤A#“ÌÏΙVeºA,}B\x ™ ó6 ¸©( +PWDêfçXI0&jh6ΈA>cˆªpô–¾Tâ +ÙwÄmQ*AøÚpªd'šê†Ú)†‚T6ÞG¶Hil '.æGJk%ècÅ#!¸3WþHMÅ $#d‰WhóAXÍjûú™ ܂Â”ª(–>¶S}Ö q£°$jæRd&¡ ™¼JATòª7S¨I µ¯4­v!<"ñ*ž°ÔåÕ“þEZF âK҉ vB[* …ñï#Õko_T*w@A²ÉdOqX¥)Q¨ ô€TñnK#ø…>Ö …"š½Ä,.Ê ¶E#(ÏÐT ‰$¼R.zÑi=K^ÙV?Ô¶ÓL£ªUÜ1n§Ó7<áÂð Ê&rz73Ӊ§Ë᜜!‰àFâPA;…ઠvÐd÷uæÆ´„&¨Ä#?Lˆô0ÞÜ +šÏl%èŽÉÞ-ªbº×6©FQC½Òõ7.'‘©;òàðZ¥Tw=ªþJM)J•‘ÉëÝü/"ݳŒ‹òi!í‚B{àÌ ŽjÅNˆUi‹à-ür4¶™µýÖ'N`}R-ßJֻՆH +Rs£b<4—¯´m¬ß´ñH4t£Ø6@@ +’®C3…‰1jƕøäP·Éˆ•Yßip3vDÕÓ,$kDb{´.F¯ íßì#… ­T‘ÓÐl‹F¨˜(ò¾ æțˆè·,²#jÞՓNëÜm6yðˆìqH×èê5*òÌq² :mhd³©“Q£UªpPq¡žB[Áp¶D*00³Úí‚ÈB´dW „ªHÀPd–j¦ +|UHÌ!Â2B3ÜÅH®{Åë +¡8L9Æ̈ô)À°{r4ò ]uҝdí:Io-ߝ@ö8Ñå>W_‘ÙN=ðà €X+“ët¸‹ EŒ7\IŠÍ%9M@€r^‹Ç­ãPÜ +?ˆÁ OKSiºã…Ãì”Á?`í_bX·’Üù]z$J]M'íHyÞÙäv‰luh="…‰H§¨ î’#ù[Ñ>cã] +ã"¼~5òYã=D8¨ÉۙE·ê?Ó®˜`â›9û‘ƒ$npC÷§Š™âç’ó˜YšÖ<ˆÆ»å÷pÑç-›ªq‹e¨+Oe? ÂH_2ÀEú¡îŸ5ņl58ÕÜѼÂT·‚Kɍ*N«+"nÏô½ëÝdoô=¢Ý{›0Ýõ0¼– '•MøÕu,dEc§vÖª/lÿ¹J>J]œÞµ¦ÿÖYŠ/‰s]¦•NxO„©ñþ>'Œ¢°[¢nÈ°WÝ&åÔ6ªª.(-kŸŠ·¹¥£´¡Ö;PðàêÉ1…®Kô°}ŠùôÊù† €ë÷ gr¨_ÔeO À™·‰¹Ñ„Í«"N"‹ +§A!\Mȉêªë“‰NMÜ@`S£¿rß[³¹M.ÆíY¢¦íê™ÒÂ| +ÐÉwìĆ_ã éƒ)GÜöÌÔÁÀ€pOV ¬Ràñó_I +Àyž¡R2¼¬¶§¬¿5i6 ÑÞz€J¬’×ÄL Ib·õî<ªšè¯ŠÈhÕMФ2÷¦².œ'M§¾q-R‚…2OÈÌúä6ò˜ ôDqeD´z(Fø R‡­½„G“a„ß6ÊLÔ-O+w⨅Çböh¸({û÷u¶¡b wǏ»¾{Ú¥ƒæÀrììŸï\Êú”TLÉj$¸k_UN«{ }æEDðŸpïÒ 7-„À¼d÷7«–õ±¹Vk|$P¥Ó\ÏpÖÌÌÙ +ÃÙ,4ípœ×턇X˜Â ( +DRéjƒÒ%Ȟyžõ©ÏWm1y+ì'Ç7jTÝ©´ž÷"j ÓÁ{Ðî•íyÍaÄraègHÄö„)ªØð  d­òø0æ|ðl¥‘.ř™”÷¥EQJëôìLÑHƒ ›‘è¾AôÄ`sc€³mÝÐDsá¾äÍíOÔù#Pý- èpԙYƒóðÇ!éÛ£ ê1yÌ¢-¹u…dÌ´Yï?:„j›“œO¼Ùš9ÔìTß)i/EôÜô&×Ném\AœìJ†bÁínÕùc÷Ëô¶ÑÆùÿ+,BŠõ•+ œ‰Ó\%F¤,½)÷)ƒëÊ·sš9(ŒžQ¶¤hamýÂúp‡iÎÈïÿò#æp¯œWŸYŸíûIö–i`^&Eäƒe,c¾Êh¤¬Dæ·6žñŒñÐzNˆ˜þE^‡˜àg dGt±¼Õ9d·?…H +÷aô¬Ë@¡5äØÝÐUíü¦œšï8U3dŠ\­0÷ùÕÐçš}’¹é×À¾:–Ÿ' úւ£:óeÙà2ª)è»Bžњb¹p²liZ¹É ”Ë©¬ÖPVýÞm$oÑ21ÙÙÙ+'Ýϕöê•ò0§ŽÀ/I "ÞFAÖ´  ‰càAיœ³O"@;8N'¨‘È„¹nøˆiüU-§Ðúƒ ±ÈºémÇìžt ïÏE¥æÀŒcîyðˆš$ÿ›6oé5/µ0͒·Íޏøñd fezú±c¬R”‚,Þ¾ÊÖI…rýY¡’xwéM²³'0ŒÍ¬yhíƒËv¥·Aʛ‘nŽ8ÜÈQÆoš™€‡ÐJµªr­;Q1(]é˜û +éìžûvØa£ vî885&*›þ¢=ÁAè°ËáG¤!¶˜F£ñÒ´‡yÖPh·dP˜!ÇÁ\;î!‡›-ōˆÕK±¶Ô^Lи ßÓè(°“¥êrjèx ˜ýÌ/}NܯLîsÃóyÇ°Š|n¼'u~Ãà_ß‚A÷sÓx³Øs&éfܞI½^:Ì+ +ïŸp{? ­0>ËUHÖ¯A™£\™VõߝôTïB#m8«;´âå'EY¾~@½„|gñݵKŽBÐƹù‘HEŽ©âÅÍçޓ&ñë¦Ù²ý'S>‹¯D'£ k® 1¨LŽ‘¼"n,ùìEÛ̓Þw)‡½Çõ:´ÖÊÚ#­ |KÙE™Y8 mAYtPX´Ã·JGŸÀ¼!h?ÃgM|rß6| zhNg‚a—ü£¥<˜å4}©†£R)“]›žãH“~G•E§æ†S´ÓB}9C"`X o”ˆàԛFHł4“¥)ŒW ·zkßïŠîæ }·Ý6 à÷çÙTjËúGð­óÚpàÖjÎuÛL&#6.@‘bòÐRD ȚžãùB!³YI ½JWçyLÙc3Š!bµ‰E”»möè{ŽÛ¼&€ŒFk@ú«Çu§óJÂk$µNÁ·?l­vêqp…ÀbbjF?s€ƒôóYtߙÕõÕ6ς$׏ü7x#íÃ@çÄa¡ #Ž4lxy©ÆiÍw +žâÛ]ãÜá”H÷Ù-Ub§Æ„£êÉqÓ’ðUX҇Gñ.Ëñ$ªFî^æÛ¦„ª)@÷¥¼Ï²KÁ7YF|(²8…»¨NyGf_S.§› ³®¤$¤?ºÖJŽJ²ŽáÀž °Þ7"ô§eOŠÍ¼ý;h+ ¸Nò“D$•¹Îã±_•4p Õ=?  ·ß‚ÀxaQŒDسžºÄïØÁ8_ +L_¿^zÁÚ¬åR5/ž€”X(îEEG%Ìtîwߘ–`ßȥظxÉo±)j^¶žZ“SS·:ûO„S7âÔ^0 NÁ£ž¨&]1q§ºÜЯ°j<¨¸É4¦‰ÏåÀÒ Zç`¹çFéÏ;µÒú¹üCH’Èěp(H ,ë ª~¹×=¿Þ£Ô×r¹ª`W|L3GúÄñÝB t6Þë^s—Ú¶QuÚB®{BþG¥²ôs“@ƒ¼‘”&§i©bt3Bú‚„†)€²šfErÓÁi ×#Ôt‹ArÆQè7³Œÿ¥7Þ/¯ñÇ$9ˆU³è²õY‘f©fÄTW(ïUïA ù|T•]‡’lօÆæ§ú¶&ɞWEY×_R9oÄwÓ2 l8 5jº¹4.÷v$ìy¤D=t\ô²EÕkªJa08&}ä(÷r¦vKð°Iˆiä:‘9|C.';ö¾0và3_‰Ã‘—s ƒ@Wöx*ì¤ò&ý]êÓ¹+”ÔÞ½ñ#²ÙqÂê,(š´|¸š†£ˆÊ‘)XêÁÊqkþÄ×ýž-ü)TPãpqŸ¦ÜHh¹û9AÃÅÀ¦#—±¨ðOx}Xô6‚lä`O{ÛýƒYVÙÙ+8xUC)ùÊ»dÿÙGy¤ivßj¡øyèèÐ¥ÎqSÏHj®éwÓTZ ó§÷ãNµ÷'Trãõ¸O•šŸ¬^Ü%oåÎ`^„U­§ ^YàɳàLøË+òòØ«Tn®Ì&ï˜CŸìˆÛSҰì󛁺v“"µ8œÆLJïàá«ÍÜÌ7‹ÇǝîHã=Os{$c%óØ°#„§‡÷!ž"…ep+ƒ¡âƎLéÚh`€’$7š±±ŸnG–^ÐêPKÕEøU7tȆæ°UÎEÑ@©ˆÂú‹"䮤0Ž÷Þ£KÍÈKTàãY¦Íù‡,jϬr>BêAývQð"1#pâMÉ`§¥¨‚ó±ÇƒQÕné-(VSd%‡åè‚{_Tqòž =&8hqAti¯Â1>+ ×õ¸˜.LÔÏ‹­Ší½ö3ZJaTczC€Äaº¯8Éð e¬¶|„œBÐ0©ÖY@e…çðÆ16älѥڔ·zèõ ÕÍÑåp¨AÀ£92ÐφÀ¾¦•B/ˆ²¿†—O)¡‹ä%¸ÏP00˜Ž.Ù9mh.™ ¤Œ.’øUbF¹A +¡t9Ÿ§Ðæ‚(‘ +t¹Û·Ï™™9̛Hy©€Ä´†¹U¨&ÿé–Ýè!a³˜<ë.Ú÷Q)ñ:Ñeè©  þ‹.ÔuÊ©´p”Š"E-¦öÀk»'û¯‰ t4kåݜLS°2áBÛ ®XùÐ%'J¯®:>ÀíºHEu€é^Ȅ!Õ  ՌygŽ5kø¹Àä³wgØpѪ¬Ä®à%R‘¥,dóíâÐf́.F®!æ#†qè²¥w¾ñt_¶èB=\˜½›´n§iHpÅXÑ¥uµ8” ¿~B—AD˜¼[iÆÉ'Ô]R}…•£Õª2 a8ˆ³^•;Ãú>è2oéΈ«Vàßи콣³ŒÀW8Vþ–LJ„rÀ_¿2'Âìé4È“Œ¹w3à·2¦€;érvh@Ǝ?´ûo«Ka=ÒpÖCž‹ žÁ“N{“êÀðú>–ŠHR€`e­;–j®{äè ÔB¿ñ Ú@\ˆsR–ÈA™ñö¶“òé­7Ë5K(០MÑËZŽ¢Iî=·ó vWcA¤¥e Gé-grT|o_[j(“Z}¯|®':ÝTï«ô.…däÆUFDD:ƒ/&i NâeGÅÄ8LYƒ<ÜÀ¥zUÔÜzf›Ø5¡°…3Ù猬¼»D +Æ!Ÿ‹ÚÐZ¶„cœ~!wÓ£ð£j¢BñÚ·ùUÍ ýhbOöœ*x•¾G‘T%Èîº!Ñz½£·€ôW]”åÎ" OåygŸLp²³Â·ìxk‚pb‹gô ¹"y‘#‚ú¾öºZádُwìˆ €³–„güPŠ†Ñ"a5&!„X?û¼‹zµ2lt‰eI˽¨ Bz/ó5õšf²œn쇛‚‡þ)Ql›9;ÔoR~`QGµÑ„Eïrãn!Ô!ªHÂÿuN¸W»òóL©dn‚!«¸¶pAû†Bíp©ß›ò¹/b‡£¢¦r10N¸½ú#*7¯}ðoÓò¢#vcv4‡q;­p]ŽãOn¹$øk{È\ÑC0:ÜÁ©KÚ[…–ðCQ0¤´È_ŽœêHI¥ Ãâ¢]ʂ"+HÞ5“ÜU¸#V&WÎѱÜ@ÿ, ¡¤â‚HӀëz'‚Œ¶#$œ®ÿAs‰™ÿC͖Ttd#(ÉÕÁQèþFcî†k3¦×m1Óª¶‰Ê¹÷ pc™¬Ê³}Œ6 ý¶&È®ºõže¨bø{„šŒGÊvÓ¦N®JüQÇÌà¡^D=,Á¨”ÙÛ{ĕ1ÒÔ ·Y'÷¦”€]ð5'"rßÄg€îlkäöÊø˜È +ëŒtGHnRʑÕÂ~x¢Ò¸¨tT®kî•~£÷š+I j®ìùà …Ýá•Âƒ¤õ( Èǽé?ã½5Á»Òz¹F—]8ZâØL¿¨ù‹9š@H•ÁùhZD„aÄR&¿Òm¦¢¦åš×W Ԕí(©Tʬ¦pð=ëW,…¾+E1$0sæàÃh#ޅ…eõÉ5Îè´6dY»~/£8Ú×ÝNž œW0ŒA c'‚-:\³ŸT3Ðý€.zŒ@‰HÔ¿Ž•‰º¸8aƒµå›Ú¾'œmk I¯,•5¡l~¸(ȃ ¹ Ô±–j{lÚòªˆX=è:μ%Â\Šq?,9ºM?2§w$¡UĽSº›‚´Ë6õº5w)$JÉub&¹nâŽÀ„CIº,,€Üg TáЁœ“ð#Q.Í‰h;®f“ÝàԇC™¦£ÒL6é疯Ïìå¬ÞS~NF¥Ýfv•Ã-ËaýÙjcM„ì»-XZê*:i‰BÕ­ EkR£J Õ_˜1º9#a[=\ÜGØШj"Wë?ILZà6¯PO2Ådɱ7Ô +][n¡w k hºÎA8hC­Ç(Eڞb…ø|t˜uO-ìÑS?QáÓ¢k¬¥²Boz²`tÏ ÀÆãÉW;ì¿R‚t.Rx9nmL›Hõ\­D㛢ߡ%Úà3IlŠì¨\û:F0YFŠ BÝvH #Ý6W2ö¤xŠ»ŸçkY熹7%ƒ' Ý»ƒÄ8íš7³M³£ñ¾!®ª&üÍivŤHàä÷/!aZ˜/\3/2î"bGFa-V×/×¹n_˜p&ºAw™Áª}˜lÌXN%Vi/_°\’Yt6ÇôæÈçzŒ ;çXØÊÖµƒ #ȵØr‡(YX‘¨ÒNáÜARý©c‹Ä¤œwÑl¹+¨4ýÀuåiÌPc×Nù F´^VöǼ§4Ü/ÑϓgD¢² ÿĕ‘•Œè˓‘äFà]ê—cr©ùt«<ݳ0hYFÛüè\ã’~—ÚqÅáT*Þ˜ªþã6Ulß ñ'9ñgñaèör¯¾×Kâ&و2øI1â +LŒu8–>Ý®+’ä©êJ ñ.!!¤*Ëü¶Ð3[»˜#ÙÝc[&k©ƒö°À3[Wø¡(™ºu,‚ u,Šq¥ÅœW·Í^òÚ­rÝåúÎRÐ~_ñH:Ôsá vصgvö ]qj]?„¥ÏlÝkºw»¦ite%píß<<¼|C¶éà?ãLAEN¹¯s끸A :N ¨¾÷äMj•ÍJG0…Ú&úQœï’hT7išù9A]rÅQômâPŸÔx~O¢™eÚÇbŽ²Ñƒ k +%ñrÁ¹ %bÓë`h[1¿ë±‰ "Ñca, · *v'„°ÄìÒ+°mšb%5´1Ãùš0û¹Š>ƌÄ'Tms¼Çm€€n6;ôWˆd#Qô0“`B= h×'‹Îü®­gÁQ²L"{š ãH{ě°FÙ2µ/…z? +×£-r®ì’ãÚn¢$´ì(ºŠ.|ÓYs*è~ Še¸ £§‹æòÿ„·°BÚ|¾±ÄÐü’I¹Î +âO€Ñ<ȕP +•Æ½ŠØ8ÛL#ÍcÄ3ÃeŲLH%YH' +f]$¿—c>Yä›<)‘Ìeµú˜¬¥ÏÞ-FÞTA f%T›"3Zx¥ÐŠºœ•:ÕI +TE‰wóàiΨ#£‚åx»sUb@œTè~ÝH fýîàj†$öM©›X † ½,«ò²< Fˆ.|¬ß<ì;ÊcðŸÊäá%üËˆøAõ„~Çî@ô»í^܁>e²f°úýnæ›WQ˜Ñd­³m 1ŽÁŠ+yS%¬lÛé:¥ˆ'ÄMÔÄâb›)PA;k™ïWt<ª«þ; ˆŠ}Kãìgcö ÒwЀ>0Œ„žs üê#3*ñ‰U‚Ó®ݾ¨m :8¯|K~hCSQ\]wø+pé†Næ' ”F99÷{Äíʦ¹Ý 8Ò|@ÙyÔõãVüùaŒµ!ãêºÜñõóÌäúÅL0×ȍj PyÙ'âaD @m’å? D·ï©-ê(GZéàä'Jp Ç^ûØ&B[Ӌ%Võ·Ý>‹£Sçê§@¢™L¥ŸVJ„‡Ÿ”d(Py0w÷‚Ñ`á>KÉúw¸ãã´î锪àù€PwÁÎ +r¸Xu¬`QnNԫ݊)—„ŸšNÍùÙ%þ¥ëWñ]PÕbÕàM¿¹í'E–®|WÓoƒñd‘‰±xÕ"Ëg¬mЯ&M-üƒÞ ÐÕØj‹¾‹p„§+0¬¸Gê艌{t¯Ð3й$„íΟ"ß®•‡Õ œ£ræò]{éäõMw.‰Îƒ/ûK³(¨4h¨çÔ¸röÕ@„õC„þ— ›’âð/EîÒÙ΂/°“í‡VšêbþŽEõedzÔ½ú!±f#»þ/,b ÎåÎ"tøN +,‚Ç«,ÐmÑ10ÕÉõÒ +Ø̐˜šð G‰§’M˜1£lã¬o-á‹9N°‘,ëH±~*TŠhöÐve:ŽˆÄOÀaÛ³¯Ò†Ó@ØÖÇë•à™f¶cT€€ptêâÑîÝ#Ò\Ú¿8‘d ©&è«DÛÂ(ý"Xc³9‘Lf¢Zœƒ©pÔA¤ÂËޑ} áËÒ©ÆnDàà„Ý‘O —CR§P+Òè1é4ðÄÄçҚ;ߔcÄà +Ù-Ìƒ9ԕÇmփ£žÑ^‡@û։iÞ¬lK—ÁYœJþŦüq²„¬r›r”Þ¥ÀñÊ2Òì¤C:—š}朸]ª—jŸ)æœb­I4›RCyOjqm见ú¦àgŽî`¾ZPoZǦþf?Øùq0º··ñ‰IƒÂaß5ìydºÄòÜ@Ž®ÎýbÚAmT}GàXb%?¨ó§((ý€O]± D7yx°–‡Pó^?¯aU¢ê×Â[Ñԉ“°¦‡‘ÀÄ“¬>°“ù\ðž||O±¸©k@L·m7kF!ê±Ì¸i²ŠÄɈùÙ­ºA\†)&Tò—dëxÒU¤ÜD¨­2Ð܊Q¨áàîö*wÃÂj`CùHÿÇ µ Sºóñä%Ð~k ÀÂ136†™÷a=hL›Ùëè1Õ!FÅÝÏ÷>¯#sm”Lç]2áX\ÎB½H8°0Ïc~i €.øÕñýû璪DÛâîíÕ­è0¸½ŸE poÞn± l5Ù4(T£žn]¼~Ãϗ +8œÍóÀWn\L4=ô’=Ó[ˆÅ  +½ÿßt'™Æy}À8A9Ô»‚1P´å;ì븍,¡€B݆!4ÍôËew¥—Å\Ýèu?Š*A¶Ÿè¿CÛë EÛ øKÒr5uçeÿ ݾˆi¸QÀ:›ZNàͺù\1Æ_Ùñ”ˆ¶­…že¢b ó¶-JÒXB ’œ2†{Z˃ÒÄïáþpÅÙ8»às_a ö1˜8 1r@ämÂZÎãWâ…|NÙãošàÚJŸ“‚E8-3iÈÀ …ñz+ Y³O0ޑjäŸ Íu»zW“MÄ¹5oWÉ3äôû¯@k¤õ(+?¶êžåÆkݓFT¦•®Œ¦3¿lŸI‰"Zìí?„¾µ!Ôt"°¢ÊWŸrºóeº/dDƒA£(³É5´H¸ÝµAî÷Ÿ© üۛ=aå0ÝLû989@2Î03þN±«;‰f/s¥fÆLËy¦ïeÅJÑW »A–Óu^£àòÞ~ÕÁ~x.¾Qà`°B¶.1NPtìv¡¸\ðXés¯1°M \Š¡·”:Ñb†ÿ?ZAÊÅÒ°2‡ï‰[täÔýla0–f8£4l» ~baõ·Ùjkš‘‹é†c˜ºÀ]†c>ÐàS@¡I˜¡L9Ûc"W pܺº´¤¶&U[¬YâM)V~[ÒñWè?ËSg3*fw8ý"Æ ›+™_Ïêð!€ž˜nxQS]Ç„‚æ˜^Ô3h ‘DØðV/sïS' %K¨jzŽ"qõ•ÂÖ͜ºNQªry&ê7Ïh´€8}NÂüÓè+öRК÷CŠ/§>‡Žÿzî"˜y¤¶Î_$>Ø ÇIM–¸Nîþðe—J‘R¦Û|¬Œ(¤ÕËK¶.G]‹¬ž0™ó—Ï?×c¢U:ªÈ + ¦8oɉ)š3Ÿ$¶‡kú½³ [\ž½gOh‰@6ñ˜qW)ªÃi¿ÒÄj2égjL¹ˆ(ïm)’|(yº ;¸ºwÉø†f-Öèªú:Œ©õ=Ä t\3‰ò^ȝ^ã9È%ª …édœ.ï?Âò Eo‘sȾ¤i*4å!”Ÿ‡®â¦¬M*eƒF_‚üѳ +, Wm ëÉKª–˜'› +¯ Žvmsbè]`+çÇÉ¢e ½=oӁÄÄÏzF¿HK,_‹&ÿ*#U$!tW³úCÃam¸’SÒMª ž¾ŒÇÄÉ㹫rAQŸÂ¾ ïfŒ4õä¨ì•¡á’¥hF %›øAÜ2OÃa(8º&CA%Èkš‡ Ë +¡i€¾É—ã®»fœ³„èyåÚÐêò³–Wñ7êá'žJeµmœI5‡Øǧ,%÷ë2$dƒ¨¢4~¸UõAžª¶«Áӏ·Þ¹U> È0ÁqôYºm‚O¹²IQb¯2)‹I þŽîç[þn-ð'w¯U:f—­tÖnJ?•÷8ŠXúÄQ Î0‘âSA$Å  ò¶ûÞÊ h×½±¹@¦Ö ²ú„s—DFÐe ðl²ŽÚØ*Û@Èü²È$’ ‰ù"@(Á]_èz¡Ìçbæ³ßE«$  +ÀÇ¿•Ž!Ê7½xÈe€Ñ*pªäªžPr›Û ɹ“/€“¬?â⎼ØÌPªø¤‹ (dbCr…î@ AjT.r4»TƼþN˜š#hHÇrRYú]Ž-™»÷¼ïD¡A\&rÓÊà/Ô+ÏüJ<ý¤`Ìtfk” à_l±Î†•Mäô$ºOþíìPJÀº@Œüt>È¿n&À¢Ôw루×[Ôîq -¬ÁU FÑî>Wë‘6©£ð]҅;¹Ú{à N` +“'wÉ|õ\Nb ©—ü•î îΒûÙD:j7±2 +iGw\©òÝ\«,ÚTM3&ÆrÑ]ìAîvù؁Ú~1qM0Қè9WPJgðè“ÇÙ«Œ}6¢GÄDLáÿv=QUª£(%]g6v@7AJN³©s[NJ@pZ +/Y¥w ǐÞFØ6܌r佺³H.e§¬¦ž© ++xtQêøn9ÌfÚDàTD˜†Ð'øÍP¦O°õ”#p A{7QçýVKÇÖ(¢²îۂqö´À¥ⶶpÕHBRÐ֚t @½M +)¥HŸnfºø…ƒct0¥©Cnl^z}°¥Éè´Vب9÷ßF×e͈ϱžé;v¨Å}c¼Qq±‡È{ìƒÒIOsNÊäùÆq¦˜}Oå½ô16-d7øJ¡·\ÅTõ[üÃ^ފ6³žPìdc¿š4@bÙE£ƒ.¥ä`Ì64‹ý*¼0SîÙN³¥0YÃ٘«£™Àcv\°š•Eó”ûü– Ý`öz_“V¡ÍÇUØǨé‚10ÚÈAŒ‹HPý`ɐ…•Ï$J#žƒ¼x›Ú*K”>-øìYѐë¼íÝZ¾0¼JH„¡viLÍ?¸LU™ÐJ¶8%‰²WÆ7^Öfåz*„0 “Ãc¾á·Ýym֘Ü浕ònê5è2%H;xR:J_zO zfgaV¡ºmMx.ÙeÄH Ï3/)Û9¢úÛ¸*¡•`ÅùEÓ?$VÊ|¥¥o1‘ `­äP2£ÚK/¨e‡¼Ÿ(m!©m^«‹™£q‰áNnÅFÆÿa¦xÀ)õ ÍK¿G +Á ¬>:>àVç_€ãsç“Q¤…‘ì«œOgàir +jÇ?ì÷Iíb'ôøï©÷ˆÃЙå }/†€.(ª½øEêl¿£1½œ{M­|ãX*j ¯¹ô0uuLžpd¿”¨ÁÖª¯ )tñŽ0TI +w¢²u"96¤üÙ±&˜ïª¤fdXMË6ݶÚ5–óm™øoqœ'ǘ´ +vÍ¿£Ê³¯Øq¡¤rƒDÛOø* âRö’±Pï„7Ì^é%8ØRƒ­Q‡4`ñFXú¤ßXˆ’hx+¾kbhÛS«üÿ%DFÛ<-/¡´º½.ß5É´‘¾-N=b¹¼™s24gä‚k+ZØWÀªÉ0Ön=ŒºÃDETc>œWÝS3ÑÍ(¤@1ø‹$v€áçãø(:›±4(+§Ì‡7ûwx¨m\J 7•õ²·PLä»Ìä"™Þû6óõ`:º+2n菌s¶7‘E_šx¦]öw¤ô¢ü +\e[(Ä»³ßØ<å©%6 Ç¹¦&µn—B÷Š‹ø\y3åd@-–ð§âòÉF²X¢ØÌ¿»0j)$Ål¸BÆߴ榔nT»[¶X™t¦,=€TƒÖÃæÙ¶¨z>Ô0D³÷óǤQÈB4,Nßçl´„ˆ~ÛËaÁX)G5†ño.ÚG“7[™fÊp¡ÕÄ dz¸«úæ~Ce„ n¹¨¦ûÀ©æ†¼wÕÌpԝ Ó.BjÃHtŠ­å´Í3fkW†3·â‘3¬^ìŒÔ §6ÛG’XïÈET +î;ÏŠîÔ­Åoǁ’˜ÎàxºµÜy_5œìA! 7ðÀÊ 3¸NŽr¸I`;aÏ'±|`oyøqä¡ Ïɧ‰¯·ëb·Yè_K=2д®Æƒ}æäT$*Ú÷%Pªƒd¦s¾€ÎížCj»€ ë'–•×»CfûutdíÁ%Ë{íä¯Í?çÕXëàU&ary±†lS©;°à0¬göuÙá;ïjϓ1#;&ßtèØæ BA*£Í¤Xè¢óâUÎ þÙ\捘 +`ºÑwØc„nÝÑ"ŒdítÂê/d+]²Gƒ`áþr³Óq|ÿúB‹jS¡_ÄeÓØöf¦ä ±þ[reµw»`ø2„xþM"`N„ŽÃ}ˆÑ¡!Ì­aô?{÷¥­[¹˜ÉÖ}n¤ÙP¼÷hýz>ÙAØ\–WOGíŒÒ€Lü8RQMxÐF!Bèv¦MXC º)záàCÞï]ð;ýûó/Š³ž7Ê{'?`"톓$Ï¿†š^@aãhäq]9ràҏ£U¼ ¼óóvµeÏ+ëÒ»øՇçMBŽðbe¹Ø”?âã3p¿+ƒ-¢8õ4n|ÒM¯¬W&!¶OÑz®ìîªÐ Ðy„ॠ²Kž%æ,ND7…}pðAPI×À# '9òe^ WÇ—Ñ»eªÔ.“†÷ö>¶¶¹þßͧ@¤eâj¢¯š4¯}®ƒô˜1íîÅR-brPD¸€¾ÙŒÀÀ¾ud]0¤ÆÛHÜ&&݁h=s®hýL0,ãd:‡Ê¢þ´[Laßý±*r9dª¢¤–æD,–ÈgZ–Y¦ÁX$D†Šo[ƒQ´5ØÀNÇÁØÒ²vƒ…ìü +£ÎcA^Kl D_õÏ–ª5úŠ–)•|M}Ò¾eíb`]¤'ùÀP(ªõƒÙ€u a̤±ƒÃæ·:©WŸÿˆÁڔËÓÆÎÄp1°•žœø;rV%‚A 9¡ í ì¶qéÂC1Í þðµIC +""òðDy:à€ÖDˆMÈh£qD(ú™ï[@ŒÆ£•¶qÿuÄX'Ò5’ºÕäêC#ÆčÜ&¶G%&$Š·@aF¶–Òø!ãæÃq•.l„þ#²åhSè×NIÊUj¾Iµ;ùiý"šÄ€úéæe",Ò¼ÜA…I’ï¿<". ”›ÜJwVšI̙QKUD;ašø™nž¡]5ԉ†ôÑq (©üI/yÇ[¡_ŠÃ(¶u·ï…é¾ fßRåqÞúƒ[h¥ ‡T€AÝ;=Ÿ¿2n"èÉU «F“œ#DíŠK”p%ú=5L’µªŠsj¦(:3µŠ™e£Q¹a Ž~úXˆDØÐ>Û­‘û|Ø ßüþqZQN}Þ²ÆYÎo˜°Æ?·2ѕN4d`–Á¶I^¥€¤ÙeûsíþILߘG¬Ì‹ÝµUÑ9ÚÆ'ӕçטvV{ôÁø–0Šðça¨‰Y—W†ñF¾Ù½È¢´â:ZÍEO3¯zߓÈmf~ÌÛà‰œ3¡÷àõXÂùžmɇ#ÀI§µØ´„;"þØQà?yy¨ÏnóÒYùS‰¥_5$+ß98óîýr‹R±\á#%^0dÙwÚZW&°WN‹í˲ó—'c2v ¨* Œüý zX® mPÚ¤vÕ¬§B|«”a@,’ôo&_#©©ë (É}÷‰L¤†É¢Õ¨}í–gœ3”ÿà…p¤³PÃbé][ˆ„ÐñԅZ1„ÀV óœG¥­¹*Ì|¬õ#¹úbmI5²úÔ^…Z4w€{|¿r^0:.ü+äk¬êÐDLµå¡ÌÔÍÇÑ2 êÎ톔¤É¬*®¾ÚDøR¸¡Æ֑á·ü´PzPËß~|à¸Ýv{ÛòZ€²jL(‰±^i«¸«>Á d25pÅeÆÐài°¯dʬ2ēèâ`ß{˜L)І3‚¨`ÎH›GÜ3ÅÅ쯤³ú Ç[Š×"[Mlo à6sì,©Kûìj¢[H¢™¨Þalh”0ó÷Åzè% ֐,PöÂ-£tšÑ %øÂR𚺀2p™Ñ l¡;þÁ‘¶¡i¡Ö¨9EFv¶³ÓÕÄ4ðg`I«LüùíÕu–^4|*ûГép ¤Ã7à1í/ { ,¥­-ҴΦ<´úp±G3ðÃcˆ=\ »õ‚´¼QçXÆG&«î8ñÕӎúæŸðaCëxb‡\~ÂWGüàÎxv0Vèý@ø·S*æÖb’E-á›L€‰¢¢&öñÏð¤]‚©æ=?‰á}ȲÞJf|‹|fÞrâã[Pȱ®X<À›pº®ìüÐ)ªH•÷dV +CÁGÎS☹œN–#()…ëÞð‚*ؘNé­D…2Œ®`íÅ`‡gr„e=˜ZüW;#pÅ>$šZâiNQÉ ²úÆâ{‡~ðºÕ¹²-Ë/Š°·¦ð ¶¡so;'H?n.BL„'+ö~pû ۙj_‚Cƒ¬‡,s5|@’ŸpªßÉ¡cßd}Œa?—!°]AE +ÖUôtn?ê¤>ǼPօO +æƒ&ä%ë-ÚgoèfÂ+¡t=Ú֜7ԊvÅÛ(^O©ÀÁ½F½¡ +"þÌËO(U´&ÂÕÛ¼@ߞ +N¦ù^ÀiZFðÃ{“ƒA~çÏìovX&Xÿy¸e~0ÛBÚ¨!§C#ºÌ±ü3)aŽ9»\`Í1r¡ëñHKe‚î^rï´n|3„üT­è1"–úҘ%)ì€ÛÏ!1 èHäøæ(¡Š.ÏY ÀˆJ—R¦Yè¿Cå&Üü3Ú'µŸµ9ävP)"Êæß*µ¦šh$(CÜô’’©ž'T XÓÃn'å $”˜`Ï\ï–à‡yÄÜP/¡w¡ùE²~sòQÐʁÞ/®>Í£V2õòó‚M}ã6×} ArI›>¹±ÕÀoˆß$·}EiŸ©•»¬rÉÈÔh!ÁZÑg€ڑ;H²œhÁ>ô·El AدºÛ²žÌ,*w`Jìw‘°È#:Í6G†"!i-uã°0Z, y«Š©øHêÔ°Â,ŠßtŒpÀšǨÒGB›\ªƒÝ} Óƒ þ$Ž´yRR¥%¢¸¿}$ ‚wŠä¦Q4”`)*òÇ\åg…Îóò‘­ÏNLœäQ£& ”NÓ&})¦Ýëõ8Ƕ¹ü +0…ÖàÑ(ÈnwLNíԅMu²R+!WÊÏÒ$Í¢˜ìFf“C<»$%̘Ò!Œ¶AÛ¢ª©­ |à\päl$;¸µÙ>|_yt†V÷Š,AŠ%É%ëÖtüÇC©æXm6 +ã&˜µã°Žà;œ`9ã~m:Œ°Pø <˜m4G¥ÜpؗõXê ÛçÒú\€ÅÑ}4“ÒL  ‚I!–¹²èRè*Mxѹc­1…¸ ¦1FYŽ"Î÷`seuü$²’ƒEÆ£K¬{E¸mÀ<ƒsŽ+ô†Ú6u*\ÈVÉÕS))Í9Uqè`ð•Ç=]㒷ò§ qfÉ8ó:1ՏÓçÊê;f4-ÌæàS:Bàø#zÜZó‹ŒÄ£´èGû‡ÐvAŒ³X3+kz6} +=L²žziÖ ßdçJóì!~ÀŠ –Ӄ’XáO Ï°cþ+ìåoýQL-uvVÉB;”¾&˜äÈ*D Z—4'ü71ßÞPez$< +ÌÚÂf?\|e֗ÄFgÃ֖½¶â£·4ÑÞqàƒW­Ù5‘2\¢?9vÏÂá"FZ‹x!Ê)¼¤œYF6Vûʋãq¦‘È~‚cöÔ4#`˜þüa-O^ë¦TT=÷ÙÙ9Ÿá‡‡q»ÌÙ×ã=L¶<Åø…DZþÈ㙌(Ô9¸èÁép‰±œì|ë™:äYÚ°€A }_ŠÄ¤s¼É©Eœr«iM±[XÚ©.Ĥ}ÕۛËþ­Å÷šXƒG1¶vým×n  ܵù`ÊÖçÐÈKbŽ‹:8ԚÆidƒN‹ØHœà•—4wBçØyîÄqxt™¸¼d>¹ê1€n4×%#* ‡ë­5)Ñ´ZÆu"5Ç7fò®å·jÚ3’¼ð]':üg˜Á·À÷‚_J›gYû½òô@ƒc1€q&¿B/¥åЧQ.ö¶æÀø ÊÛ;ÖI|ê"^ž=ô~‰õZÜx%ÍãºÐRͺY>m«Zb.°~€¬O,¯‡âÕY–øØPãߝêÌ¤ _$™ÚÓ&üoºÌ9“+a‘ÉÓfŽ(%Q_Q@…ѱ¸Ùٛ¯WÅS/iï€{ÜÌfò­±òöVÜêMù¹y$9ñH+F–O‚Ö ,ö(­0w<ÔíAª†ŸÎëåYNMzˆÓÈ÷ÇB"Ñ"=cœ¼{ §¯´û(T ±SˆÊü +>«q¿I/Ñ3¥G‘ñìr‰iÂÁ¼%Zžó7ð3hÆÒ$« ?xøkŸUôߙìT]xÀbrÍzäLû îÉŽ2àˆÁeíëMO+”9‹i;’}Ô +?%z‰¶¦ÔqvîFkayja$Ysڐ6ˆMûŸñSù}قÁ*b™•5#â~£Èˆ`nàEÇ-ËuO·òƒ,ÿ²ûmvy"û˜¾·´6ÀBàM´©ö÷„Jã)IÁR Â÷ÜdœŠ{ˇà¯l0;‚_³‹YP|ä:˜un ý*1(Ä R“PR^775ŠAŽº»¹!ç‰ìÕeôyÏb~ø5åàÄî,>0|’… –Á_Nš–ôLîIï^v ýCŒÿ†î à í¿[áW6?ñ #,ˆ;`ûŒîÛ·õ'€åŒt‡Û€xÀ }àñ-*Di”ÁÃGDáHKø¦·i×®úŽ'Á@FÛ"óºšS%P ¿¼‰ ùŽp禄²"aS‘Éï»õ"Ո9T‚3܋i-öÿc IUìlr„˜KãX žÛ"2»B¬†efà±y>æ Ã'¦.Ì9fw +ÖÔiÂñ„Üp¶G ˆK;¤GTvY²U÷0_PšòÐ¬Ü¶Ì Ë?c7e:+æVà¹q[‘HïÎ ‚iǶ`êB-­rø<b|¨Å·e’ݦB¾ åÊâ¶Tñnå¥[l E„ªæý÷Ù¶d ¸Ñ!wÈC%Å´-Š +“5\€µÏîA2®Î= +/DݎÁqìâGÈzµ,)æÕØÒµI Õ¶\Sü,—+?Þb§ô!ŸŸ²-…и ¨;;SK¸-pL5Û#c>Ìy†w;~ +§dˆn"ë¤ÉÐ'&¶Å(Þ9õu`›m)ÅÛØgòÔ±-×ÕvÌSíLÎwoË]Z„#°ï×6p[²4ùL£>¥yse/ú ¢â“9½v; +¯frl[ð˜ d¨B»-;ô%Qph–ïq[J/wëdAÒ)äÚt&@˜l‹%íÔÆésÂb[B.}Â,9gÞ_ eiçmYVÒñ +jƝm˄XëiZ¾²i6ê#{ʓö“0'=Óí‘Ê€ £´×rÂ³¦ŒcPOCIâ›jä ¬Wë[rfœlCwiTnšZ³uãšýÖÁú÷ď΋ö~m¦5՝½v¯—Þ)3ŸD…©žiÕ6tç]Ñò´Öð¦É°JÝ4IŠ´yujZF 領•Ö*)1 }ü𸿉À]'̘JÁ:p÷Ô³”ª)›¤³2¶k`Qmݹ‘T™*ÆFáÔp™]a:¥?aRÆÅù‹ã¸fùÏ_xPDÀÛQ3[Ïn•8âÙ¦=RÕÅ^°ì¯b^ CuÒÿÇîlJIbRº¦¢°’o~¯.³Ã~©øÎÙ6H«V„ú%´dĊŸëIQp1gäõùOÉSeÒ;]’¥äY1îuÔõâºèSæÖý!ù»«n†L Ê#Ž’ýw§ª©ôÆlS!î¾Í«Ef3•ßiS-\â•Ó›^éA&·< rb`èðg¯æ¾ýà ̚¬÷ h}g-Îì×õ­†ö hyÊkE4‡£'VbZÜØ­ÚVÉsúfô¿*pÄ¡rá%èå^`“¥,‰5›E–Óoý^ €jº…l ‚$û £MC8I›ÕÆä.øS¦£l¦NÀ™¾i™§ˆµœ·¤ý‘øYàt"«=Q2ö²IM©yàŽœ$¤Ž*¦¶4ÂD=Ĭ+IjîäuI:å3/*a cýe:ge»"ß`Ö<ËéԞb\ÍK5–áTZå´4³¤EÜr GÇØtèAq„‹O mƒJ·Ó2>ìcý£ÙOє…&23û\²ˆ†ê$zӑ³-Ûé^ƒpöŽI?˜‹-ú›ÞP˓ @¨RÍúlB6އDcá,ž¤Bo$Y´þÒV µ›”{ú…s'ó@^!ü½É¼/ûÌF‘ÊÑLªe +OPÉ­C» +°{í.š3o¥4À‚(´«IÌ4Ü==¦l)’-'ї§¬~7¬{m)‰“UGÐÍ"G»&²C´ðä$ÓýGó¼àx‡©{Nð$Û½± Š#uà \áŠÇ:Y?9W˜i+Ód_RüE²ƒ4ÙW®û‰Ï`-(gŠ^ò¥­«[ø1“@ÔEsýqêkuÀÎðÕܲÃé¶Íô›rT2«gÈÞn×Ѿ²véµÑÔÁ™‹aB_~šp68ãàhû,(³öò°þ6™|Ø®ÍD—,­·²­{5¦=lwÅnj¿(|¦ÑZj´Óîêâ@m•l~Ú<ÀÐ7hÔ²õwn‘v`˜7Y žpÂ,HÝb¡Ê@IÁ5EYI}έC˨4*ŒÖPQCû ¦~Aþä *âƲm×ڏOÒ_±’ +0ïd"1…š¿[ÛtîÙÐÅ=y°âàë47t4³\FÁù!P€Z×Ïþàÿ„c/ås/WÎI$?EE:‹o±):š3È°ÓI#²£Bø‹‘{MÉhëb!Í¿­Í1֟ ݌7ÀÛô«ž\ÿ±ç9ÆZ ¯}ËX¿â_1­_Éö à\E¨ÌÄOhGJ§õt°ú èOÑzØì`oъEæ¾Ä‚¢ è˜-¨(…ª foýñP£iñ+­w;‘”wB=_ƪÇ^´B/ÊlÖ¤r]½äoBÈ©jJe–!«ç®§F#¤fqp׿uñÆzzu •ôc×h”°fëÆ~<@‚N çÈ'údF;«‚z舮i#Oʦˆ‰ÃIŽÔK·¯cð͉›Ýlfrš‘‹T&@ÖúúIèBú³N™ÆwéÕK¿ô}‡¥ÎϾ÷šÊ Pࣕíÿ—è]\˾ÿbÙ³™fQ„Ù‚Œ£mB#S×í½ã¸ež^ŸÇµô‡±ü/’RäÑ¿mhSuò¦ýJƒÍ*w.8pö,ä*eY­òóćO%CÁÿ¦Ùœ@õ…Êðu¼‚Ê—_šä«¡IbQÔu9Q’¢*|Y…ç½ÑçƒN‡Vª„ÍЊ´Ò%|’wAâVKšrœ³ÇÐC›fÓJéÿR2w^ðð¬’!ÓØ Œnÿ;x¤X`Ê +ÔA‡Bñ¡9§)§‰•¾j¦,±Ö™yÕ«6¿oúZÈ0¨wè ©T—” X:¡?ÍxÊsÛdåãp­cÔ\„²ª|ûáó»;_ßîã +¹•d›“Ü# ƒêëb—D›Ã} ÷ÊBÍZw§¤ó¥ÉeGpoŒ68S$xï'¯í@Aì(Ž¼4ÛDö\Ã"žåfæs˯Xýþezê©9ÂûßOí™IÜ·Tæ% }j‘»çAg/(Yìl$WL´yZ¦ >m¦†S£ÄYþrö)R|c\ðŒ„Þ˜ÈÕIþ°B ŠÚ¹ü‰0`°‚SÅ/…¢]ö±|ÄÈiñ‘º•‡¯¿ó¸ Dh•Aùß +Ë›¨Ç0fä+J`ÎùqR`ð‡µ7”Ìèqw:éÄÀå̌ǭ”ûˆa:#€: /ˆýퟔ­¹VåïÀO뱓åçÝê@º}²1Së ß`u„x–Ʉ˦ýuº+­d¡˜å InMÌÎŒð=u+®2¿2¿L¥¯¦ÇhÇ`Ÿ71ŒXb®Ïxqäö'VãZÛÉ·±e%r³Ça2¬JaÀ4‹ŸŒ{…1RD~¥€\…8NÊá´½]¸,÷UîPàUÔe¦‹T8¹ÍÀÉÇ¡¹¢ÒºÛŸz¯ ËKyàx¤^lìnyœüUºÓ@ÅT«W ;YJ8¥iãõP&E·Nda®áÖ¯pȱ&Âìé @“V76ÇÆØ7ûþ#É£thòÃ~"aßKEhDéÌíýÒ¥uÑGav—ÆÈCí[1`úf²!ªBœVÿ‚/Ö©3ì%»»]Ä×}ŠÒñ‘1 \‡Ž\Alæ÷—ѳQW‘ùa¥ dPyDŸˆ&MÍ Å{lfÖßÐÝ@éÕðÓò€B2Ì@#Mt5çfÑÍÞVô4üã‹@N jöœW±h&PÉãF«ypÂó@¹p1­OAÒ]œÊÊ]Oîy䯒ö¼s·´æ<=d6¦ˆ°´ôUs¬({´þ:Øí‘q1 +ʋ')¸!EÏD²]î4žýæ°·À±gùƒ¡.ÛÄؐŠP‘JߚvP®’)y=1Æ(¯þ–Yï$ +qù]ì!kµK†[÷øúöƒ)kmöú6·ÇP€[¡žrëv=m7¡PFQƒ6b=m›þpeåû“o…ܘVV¶‚JBÞâ¡Å¾€Ç2&öfßòàã)Bt^ϛù–Ý6Iß«… ¾hTh²@аa¼ûLžÔ:Æ!d׎Ëfý˗%äžfèmÓ艰I £Fç]ֆ×rþ¸r…&17ü!ª;twT <Üë»Ó§3˜þe™ )÷Š],}~êqفÈ'óAà…7J³0ÏC1gJɳ¸œ ‘ M”Øv‡ |‚lŒ]¶_ÔÍ~ò·ÉN@ +d©ÁÈÌñ›Eç|Q[t‰§âA]‘íSÁ‹Ä X<¢3¶Á瘴\(žÛ=˜5ûç!¿ŽÑ¯…,¿VYuæŽë᫆ DÊš1Ķʸ‚›’M¾P=;0 “ª™Â«Â76yŒˆœP¯\¡ØªYKÕÖŶàøOO»PîÞ€hWôî´,3 ~b>F ž¡àÓ$՗xÏÿ›`ü‹~w3ït þ¯`©òÆt\÷Èh\¡re–txoÒPþ~ÂÖÒؤ $Íܲòø~õ&,3·|r"¬Îm“TƒŸ³Úà 7¤^˜×îcxD‚"koóE”¿DpfhJgN?*³£f]˜{ù`cpË…äœé "fkné#.&{ Ž žé‡=>1B%¿Äáfù×,ƒ}͚–ÅҐßNž¬ÐM劒©—“òp~a^RQB  'd×ëÏ[Xÿ„ ‹$± Áj(ˆ¡VH*`t“Ðwª£›•Z”‡é:»zï(&@ÅQðºÚ HIK.yUsÏ[ï¸Æ)\ĵâX¢¼LBO' 28ÉPšãѦT9<ód 5°‡<õR©’ŸfjçOõ¤×ÉáŒa+ÜýU¶î%¥|‰Û¨qÕ$¹gh&LmHPp÷½Êúô`^ðÚÐÌ-\¢ë_T‰ƒbÈyÁK&[9‡\A 4<"X&¨ßO݅‡à¥Hص¼æ±Ý±;` –Áem‚­4R'6KuøVGµÒÒyØèêÀ·™ó㝦‚Ægùo¡uJÒ¸±èV«³ÀïKï,¨ÚÓÖ3%8§Ï=ɸ›:îcì+‡­qb¢í3$[²è²ˆ÷A'G›ÚJºØ^è¸$¨§¬í* ƒÔf’Âv¨k¤ˆk­#ýGpéÖlœçD§§ §þÅçr`k…=4p4֔ª¾™ÐôØгµ4„…µ«‹mÔë/jGL´V½QŽå2'BÊQWâN ½u+§’ÛÛ?MXG®-ñÖXã‚H> Ç>?Ì~"ÿßÍxúPäŠäø2/¨/Ý7|êlº§ÉÌɐ;EÖó¥¢µl;˜|$ ÑÐà#ãIIHßfh·X&†Ä¹“ãBCƒ`!W`@"pÕªPý+üj&¹Íñ¤Ë ÔjècÞP>6_÷?K#jô|DŠ±ÚÁÌ"øâ¦,…Q6Ð@þH_ ÿ e¿â|1˜±‡ð „ô ¸LÌíÃDÀó„ß­ë L|e^ñì¿Z{ˆJëÝ'0þøÓj\€ª˜F †ÆT1VKN¬Êm­A!; *§4ÜošQGǒïUÐùA“±_H‰©žþ9Y Í8«—¸9Ë +î‰Òˆ…xO./¯—„Bê>ùsª1QÜÅ Õc{äø6Wnne5iQºˆI‚>›Kà㬱˜Ý¥oâß$)Aq—p;< ÐGRzúMÒÒ +aË?Œb³Žn3ßnSí­—…‚¡ÒäKBX­öN­7ÿ2ÉÞ¹SZ‚Þ Õö»Ë+ŠVÄQøE¹ÆéY9ÊyV*jS…|—öƓýø(ü“ýo˜Ð +9 uWƒ.ŒÂ=æs‰¬ê•îþ5HÁÏ öIýš™î ýZ>HX†5çIÍÇ /ôÁNù©œö4’TÙՒ¢æS7Ó‰I5Ö‰ú´>¢ÕQ½i eŒc +á'ELÀ””§Áx7ᔷë+ÂçO3ª¨[0,Ý|tÂt2J{#ô°9ca0ç1/*™–` î]ké(™ +Ow´…k|Èë\½¹’KL‚Í#3ØùOC¨èÊN`–wù­5•Ÿ÷%È߬é@ç¹¼œÆˆ Þ(%ÍlÃ+Ò*ѧAj&À?µ˜PµÄ¾Qúáàg†'ñô&рŠqxÕ SÆy©÷? +éˆe÷¶áþÉ –ì€çÓíúÐUÿ‹ãÚeàÂÑ8˜˜çW¡bâÅà!—º2 KH‡ +qþ«srP<ÎÀÞôṆÏELAgíäxGÝNÙyµßLÞUlž¦K\ñpu§PÂó r\¨çÒ;Ag‚±ÉE·¢Uu¾òK[šíÒc8P<Îå¾F‰q7Ølº>s–Ì<–Rì:˜ÏÕfp÷Oe”Sg'ÿA©ãˆ+™&öl€RłâfêF¤s3€£Ð^þârö'«NÐ!â‚i›}Á^D&³—b‚Ã4nèfç‡N½pÖ6Íõ9F|ӖHd²‚ówT8ðg……É.‘‹g­ ãñoÛþÏàyõààÉV§C;~Ûù“ÀD1Ü=Ì}—R]ƒÛ¥º°W¸ŒQɄIò` ;ã©4ŽÖÒôzž0³½,[T‘š (ñ2˜í±S—£ün`7 `üdhtˆ:‡åÅ^ˆ˜>W°æ6¨cJ•Gk$?P—ÅšˆRVý4äûÑ ¬Â¹BòR‚é6srì"³oã{Ö£ø-yËö5* +ÖÉK˜èŽð#_¤8GI¨1Ô9¬¯}¼Do¼¦%LlP´ViàÍeµ¢:Éÿo_^Ã^ñ›¬\?ë§jÐ2ÛÙQQþÉÚN> h#§Ò—ß8ZÆ<dž*‡™cFreîy3£n¿ã7ыÿÃ`M,X0Ñ¡¹àf›Þ±q ¼ñ +ؚ»žð žžóˆœP¬(_.¸oÊÈ]GküÖ©%ôû EfQ®›Ö¸aêÏʵr²ðŸwÆÝl‘·/Œ*è÷©Wž›¿j5ŽŠN1R™öMÀ­þÜF;„tøÇ˒ˆå£¶5±_ô…É}‹T¹H¡Š(ϦeRÁŒ™¼Ž“ÞÂÛ0-„déûtú˜¢'*¾K>cÙ܎N”v±9EgTáÁ^ƒ©„Ç¡8bs²â¬R{sD°C¾ ¸Pù®TÓ2óàì' ìJaZ@˜ÂQjà¹lï¶#Û*.(k—Ïì÷OŠ<«×HÑc¡n'C%6Äæ1­5½¦vvš® ñYoéXg‚ÄX9@›½¿¢;õO[ÜH¢|DÁÍË@kšî-ºÜÀã@Ø•ß ÌÎ\žô5y@ûWù澸ęƒ ¾L0 +Ùͦ$¦8¹ ߀\¸ÑíÖ¼)õ¤È +žBŸÔðöÆ· ð·´Î¶òÊç§Ky“*£ê—ÔË*®"ã5 ­?¼_*H‡c·GLj\@τ҅8J ´ké!m)WT!ïŠ&<5,z~Ü?8àÝë—Bm–ùÈg)5)p;-„‰ÃRú–t–ö‡µa3_ËbD K"Û°,Щ«•—¦ô˜kãüN2“D áZ[Ί—àw ¨Ž°5Cjýˆò6,R "§ðqU.m…È U’ƒ”cˈê¯3ƒGû›²ýÚÌ®ž0Pk L)p§ŒÃ¼5dWQu<…!‚}• ™v¾ +(ñk€FF~˜ökªT¾¯³70•®®‘ ¡nöáþ‡“cšª:ÇÔûy±´e#XT¿$’(ÌÛËÚ-;À짻èµMLm'ó I˜ØOÂ3ƒÖïü²ÍÛ_KŽ|·IÑÅ ¼úFAøyàméÜ`Y7<šZB®”*Z­œC“½9ƒ½!¹6 [sWÎjÃÊþÏ çãmn(v:Líoz¢]¼œA£PŒwœåSè +Âc }ýžàõÃ*FœqY¥Í¬.¼ Mø ±2I%ƛ$yߧèFëbI¦¨ñM?ªÉæô~ûqîj—à…Dã$t¶‡Á‰6º;é±'ØÜÅ^e¦£eÏðâ^¼Öý% >ËÑJ!ÔÞò +‘¢ëð/€ìÙZ›5KÌä4@î”Àé…H™¸kNF—6½4³-Rc¶`û‡öÏ&¹ëÔ!)ñž½Ïiƒ§?Ô\ـ^^Oüºø TíÜÐòÑäMmYï/¾ +@‹QÍ^Ϊ†dªØk” KP€ÿÃpÉ:ѲDÛZP£Èc“+ €à;™ýóiyz’¥:âwζ”>­][åú`ô0¤!î½ÐégkÈÁ±¡+×QòŸ:n˜S+­Û·éu‘âY +̉ ‘?¿o±ƒß¡#@ ë'Lïðˆ\íwÛDÉ ˜ /úêÝA7‡r³Œn*8?E.—7S©{hë{¾Dª}Ô|Éü§®ñ_’"rÛׁ09ÉN¢F‡K͈ÇWþ}ƒØ\¡t¦§) +3È­Cip–Hªˆ¶–tYtí·òÏÇÓüxµßm(7À}é#âÎgñävË(qçå®Mè# %á1LüÜN侂ÕÈ.&åºIÿ[Áò xÃýxä2˜Ô±Î{>®ÛGD™\îþàFE} }¢oWD DD'Ìƒ²Çêø5œÚOSIÊ«†%=›Èêõ;ÕßMæ¦Ÿå]&®²sú«õé{”t,x^\ÌKýÛé J›`¯Ø³C6Öos²ŸB1шƒ~b@-¢U5ºÚ Ä&åOH€vèwi‰>¢*B“¶Ž”®&΃ˆÔµ¢<Å¢ÐyözÉÈlEž’%ûž ­hœ?ƒ¤rÖrMk+¸OD Ȥ¯¬ó ?™+¢ëä22oó#ó¾ò¥„ñj€R¦e;"Ùíålî+9ì™Ç¯FKÆ©T‘Ü枤L…p]œaʀ¬Ü.´²a­i#©g™mܖ/âÄF2!뢇]RºßP¦¬©ú‡”¢MÌQØ(`°£Iâ¹ÂHÈ}Êô/²ÝѱáíötŸÙ+™Q1¢Or]ºFs“)Oôв>³A vÙ)µö¬Î@úàeÖj §·§>1<ÕÑ~¿ü&™’¤#úƒË)MFYÒBŒj¼õBD( J–çcZN¤Â+!\@fª†¤b (³_Ïx] +óËÂÙâ—C8÷Œ•õxypÙ!šd ÎÜ׀ԅÅW—Òò©bw÷å$TÃhFgw?ŒCÚ?Ü*2÷ Š;å5“DNRK (9K!\HCÈI¥‘€vL O~~‰>ó7óÔË1*‹ùbûÝwtÅb¾Ò«Q9 †Ur$ùÑàï즋׆†G»#o÷cBëõ{Ñs,…ß«ú¯üôN8ºL ç›LêfxV%s· |n»ûñáôØ"æA‘`$ËN†Õ.>¶n<Äå]Ácu+{­Ú~‚“&càªéÚQPƒátV*rÈÑ´=B( U奃!"iƒ¨á + MGô”WÌÁÍc_º$µ¾“±…¿®¤ «g +´³PÁp©R0%P£q܂qëDO + ¢£xCà“tè/cú +È$nàr>“Àƒ0B±1 Ñ|뫂¸Î¨Ô(´'Ooû~ùL;† §‡! +SÁKP==}Xƒ¢ F’µ^`ÕÁ`@R¥5É^ÇyéŽÐųÔZ7À3:¶_…·Í}؜hoí +Í탱ýµ¬…ì¸^ƒ!a–8ÃŽ‹1:ô éApŠƒaQR®F5 lñIžcdÇ|+µ€o«ÆáuZˆdð …$À´©é™ƒUJ×-@Gq/}JPÿ<Hœ?§Z¸KŸw²$ˆ›,NkÊ-Ç´”m±‹LBáP’7Ú/Âô`.íGè4Ü·mïðMlL[S=.Œw¤Œ*¼~Ô,J™_KL“øÆjcüâù*<<„Dã¢m~çb¿4R!=N&äì( cv$jiÙTí™Î†¿bÉáSXõ›íú(U=A¥/'X"v€€êְ‘¼YO”M¹VpŠŒ9<,Léß½rÎr@ †dÞ +P>a»“8ªžª‚Å$DgNr{ØUîUž×3 <⧌‰×G›×hà EA0‹>6“Pµ°V2au€²Í=Ä,™[U¢«ôpÉ<û¦iA}¸+æ-Vóoǵ ÷àÅƅ0u÷aÏ@ƒºŒÏ܄H¾֔äH¡t*ªñ³lGØ[4˜ß+Ê q,èíëÀæHž:ˆ.))J£ q1(Û +YÓ9ïàA®RÈ~R~Ɠ º‹)Íh‰w¦Ž¾· P¢¢áÝ#{ÀUB4ò†T’À’xqFún¼¡:`ŽK +q°§´ké&ŸÚw&Üj1FZ•‘Yn¢+Ú?gb$¤Â› æà4'ÇÙ +`÷\Y²Ž:å„ST†<*ŒGðV}5J~ׅõOSµÐé8à!ÀŒèé>W9ñçÖÖÇëºîwŽÒЂ#Ö"ZC<Œ!X<^ìû/™ Z]ÅL‡¢ëÆÃ`Æ;-f'AåYÊsH}¸ð)‘ŠP&fÉh3EÃ&èûIç#µx\†Ô=2œÈ)ˆºª–Ô¦ +šèaý¬^·· )d,@Ïܕæ9êŽ}£[™>VØì_ hg¼§Ëožlœ“ôßß©Åk9§ÿ•‰eth‡ÁÆÉ7µ×n¿ Øbõftl[Ããx˵—¡d²”p¹‚ORïÐY°NàÉúWI²Ž©Ù˜¡ÎÙiê‹\yʅLݍRÐ÷\ ª;àõÎÃYÃ)Ðoç- Šå!*{ÌÀüÆae¸FNeï½¹´#ëªÞ¦Š¦oºIùNbe:“x¸u~«„ûU@KXñI%®ê3И¶¡FJ&ƒ «÷AaÆó¥Ñ‰ö¸é|âA˜N'i-p{- ~¡[:É̀³£¹Èp|ø÷.,–œÜY†Ý2ä+Hƒí^¿áÕDñD¬FsN2–ûâÆbVáÂaq0IÚÜíC¥:H㠗 ®kú2_“q8ºéõ÷å y89ôæ#Íl!×*‚¾4¿cËô`Í/YÙ Ip%ö¬Ó–éSÀ™ÅIéRqd܄v#Ïɛ´XÉßM1Ü[|ûæ† æCL(hÁùM׸Šv©ÍxÂtȎ9ߢ íöW «ÆĀíÈFëNR¾ä࣌=妍Ž—ÏIô„® Í7ü˜é;ª{ifg6ðŽï­¦ä)QqÏt© øu{¯˜Á wDœ§Û¶ó_:`躏¹Ä,]òs3ÍQ,ëVjК%ñïïâ¢çÅ%ü“C[ü\—ª¿mtç¤ZX°×ËЧ¦_‡öÅSYÄPMä Ê£n° ݐ©7„tE Ò œBT¶Á²UFºŒ33)_^Û©¢vK(K ‹ýë³Ñ4&œDš¸q¶ ×7¤×œˆÛ*jbûc Û«”ç>ŸÉ k-›‚>8¬š)´˜œþÀé=­¸ô ˑ7í„ÕMÔ-Û9®diw9hIø1%á{0ļkŸhäÓÞi¯•Ó¡,-~)Ó¥mËÎÒ~x u§›È»8°XG+ X\‹%}Á‘¤R?8&u묐W3XA©)Òß{Ò,‘[9öã»ëH¹Ä³×R=®ÄhC%”×ø„Q¸õ”ÙÇ´Éí/½LSIwáષеͫéÐèÞêÙòbnOC]æ$ÇÇ…¢"'ݽþ–yÞMA“JZ|µàÁ”Þºcð¦îåRëñÜu&ki€&vØÎ[´Ã„éO†öº ^^ bó±›tMJÄR>aùIïs5¿ )tŽÜ$/;ò4Œs§ eð@:$S;ÏÎÒï*Õ¸w§Ÿ·Û‘\ýÏ~Ï—»´xÊÑtw™¬ïÛמGê"Š£kÔBïNSY4j£*ycp:Dðu†IzŽ,ÅV¼)sÚçö±0cË8V‰á+3óéNyôJøØE¿M×e=k–"\•¢Åg°· 7ÀêhsðÔCw­¯eb6"ب–òÆI¢O## 5Q\Çò¨“Àm*tå,èãú’8¦A¸gÒ/ÕIä7ñ¡X&«¬NVœ™{²/Ž£öáRÕ݃XYj*z_+«I¿Ãß9×ù¢àú·;ÄüŠÑ±‰Síû •Ã£lQŸj|ñ֌šÎ|Ʊ7RÆËG> Ãß½ ,Dnª,;—/sŒ@‹hòVÿ*Œ$?²ÿgGVHµ…)&Žl >,g_ÎUGÛÈ)$‘Oô"û1þ왘„DLÀþŽVr#ò¾óöKQÝ;à¦Ç`µ–Bo0‚™Ÿ gèO!‰¶Då`&°¸™<²µŒ:¾©â;тÑJ`vëR‰YÜHY„kˆW…Å$šçè@@錾÷Í¥ÆAĜ­Â€ …®(“툟\W§àaØ -äg§ud»±‘‹õ·¹®°+¬&ƒ‚Ù£Cth¢ Οz[ +,tz(K—{÷‘šËÔ (™qík<Öá"«aO=âõ‰r‰<àŠQ­†›,>Íضÿ¦êŽ>Òt"=ÅU—ÀI'ʈ¾Èq5—ë23¤÷”x%V±„øMæ %€ãô†gæ’e Ô,ÉHM²l.ªTiúÏsQk‡ü +Æ¿¡ –Pæâ'ïì!€ ‘¹Líq‹n{¢ë0PÈî¢:'l.Årýî“î*Z€;—ÜG/sÈ8RÅÌ×ßô?§¢w©QõœK¸B•.ÆGüÿ\^µ|þ K[8˜¡^1R,̹µWSv˜ŽÐ ò\”:…Åkàb‚x1± ”ÛИ‚å¡NœKÅ)Â'ƏZÎ¥®«bóG7¤m9.Æ!ނVl©9<ñ!3g³|…·*J X¤0´F¢YÔîu$*]Bû4|â8–ï0¤ù¢™¹Ðå ó¬zoª¹¸8’ÞX^2C­¹”ã0=RÉ­½•;¨¢ÍÄ郹LªOôwVÒf.šY8|¤}™ Ž‰QŠI§ëæ¢ÖÅ/œþسT‰´ “0CßFã=6°àVYzNüaÌaÖeµ°.Q‚Wƒ®h|fe¤î–4 )¦DéÃýofR¤ï4µ“«pÙÞDhæ€iQÅ¿à°\8vrŒÎÂs^ºIÎÀKMÐ1œ"dùe××NH<ø~‡õ—Çvå‹a}°ÃɅ¢ JŸŸV±ó^©ýcu­°339.ìǚ€Á:û?\·–Ì{²A⬽V’©=säÁê$±EMq£'Îé:ß(ákWk¹=Øw‹‡ ·û­ ?|l2.ò±“,tӝ2µ@ãÛÆÛÒH5cO؟èŽçK:O/c%é +‡ÔÌéÏ7k—41£G¯ûÈ΁|@Ú ÊL²çFª¦û"ŠàáÔÞ§^ÀzN5ÎÍAn o#?A›¦^j`V2GÎÚmBý6†Ñ€s,¶]èÀˆ ô@¶&f˜PZT« ˜c•)åíâÀ_%YqªOìí\m+”p ’¶)ԁ‹ÊY(õB†Ñ/šLÆànè ¾h“ÀœDòxú•#’ÔþËhÎR;¿¸n· ™IÑEXa’˜ãDÔÑDTÙ³±´¶Ú Ë>캳³¯m؏6þÍô¾›?VϚ¬g¿Û:mlÊVn.1qÏ¡\ғ¨„ûƒa™ìž¤öCy/RCW¾Qä"‰š’H5¹/’) ˆÄ$¦šҐ}{•óÑt®L5Ë9Uµ˜‘1;~ qêl÷VâôN6 åS›˜L=×à›â©ÔŒWûƒþæ0n¶±ƒþôAßO- G +¾#Æ|D³Ù[­V¾ÍT¹öÏ旓;@Wȕ!Œ¸6o{\ ¡Mo6î%èOàæüƒVù(íp#)&¡×ðå ýÙ9ù'S‚¥×üB– +„ {¾>;ð—vSòï¼+ºª›{LDë+Ñb·I$g¡g‹{ )`·¿„·®2ËùuÐC&¶ÿ^ÚÙ°Œ=8I՛°½'DUã°©k˜t®ñŽá¢J‰óâô®…$Ë,tÏE€§dýV2¢¶ ñN{.®ýwy8‰×P[™2ËøO1³+ȎúrEL—®^-€#9ÞîI/W +ˆóö}u¦n溲ì, Å ‹Œ£ØQN«÷0Y(.“4ž–iÊÙ³“é~B E_]'ûl”^™Ã]¤R‹˜—1 tñ ï•¿0JD–¦ú¼Ô6aKÊäÖ 0Ëü· /™âxpdIÑrùÅçϏ:hR-ìƒN¨GG“àä´VdÈÒEˆ÷Uu€”°þGT#0U0±çÖ©ANËí´Tà’Ç †õ· 9n¦Eâ,ÃkփxîO¨·|¡ËTÞÚ˜sUå}I¶5yj_y[÷¤’ÁùD½g ¥….ÈEmD'´†QÝą̊ü„œÈ=ÉÇ "2ç~rVWÂþAGœ'£ cFÒ­ˆ600‘ aa¹„8”ñˆ#áoPfN–ç¥sJ¿vZ’|%á,³3`£w3'j¡†É<Ý$úÀïzÂ:Œ"åR?Ü£„nΠ”{d/E}?">=‹†¬_¤nú ½¶B½ri_:äXyÉã_NÎÆ$ý½Œ¼õ9•µ€ò8¼C¿ÄG-­¿ÓÀªtxÐ;©ò±¹ÕHQðiA+s~·ª+£wŽhSB¯‹|ßÄâAŸãނcÑU”´¤@Ǧ-‹{ ho*•”ÜÄ'Ïl`{—Òë™5+ñL–hÍ~ )yç¼MSÓËÛՏcO؁,]“Û(â3âèO'=>(R˜Ÿõ=ݝjšRÃdïÌ,ž'øõ¨8ë9nWx‘CÓ[‚£È*à s+å•(Û§CÝÌÏt͉ú'Wr"®ÊJ[h<>‹,aø—îžSJ[J -‡£ùhY ß{vKd+H ::mÏ&Aª>ö¥¤_NN,õ0&2øŸÿÍm5§ŸD |%ಖ”[™¬%""jÎ,yäª'Ö|eô¦ée5”ÚÕM=c¢(ÂÎÌ@©_!\N߄c}•ž”ݼ£­½‡©I¡„îŒ}sP,óøèkœ¹>žT©,Ä‚×{‘iÈkJmC$ð–RåZõÊÃ6ˆ±wnÖÎW “Âҥ㏴ Å~ZÒZ?ª‡Þu 2–ãœsË0êËè]—5hEÒ{*‡¿éÍUuŒ‹{y{~Ã+«‰‰ëÛüór$NÕÏAÅFâ7Y[‹@§ªÑP(33ß&õ@}^« 2ƒ¡l/Y—¥DéYs|¬RòŒd\ÚW#á\×jðôÕQV©%bV mKN ²…ÿ›&#K§E‘*CŒI ´ tàa‰ºÖÌ*X²"ð›ìnT©Ž­ ÞΡ>5h¬ßЪ¤%º a‹C蚠P¢•;#ØóØèï'¶V-5VÀL•\ÚiˆwM(Zqÿi:±™jIÐð+źA=-ÞÐ}%¨'&¸Tx&Òmo¯;•Ï"lþ›tLAçtÝÒpÁé·ûòK“ŠËéa ârž•5 g ‡V÷¼É›jÜowpÊ í¯5 ·‰Õ¤µ ñŒ!•†‡~gXV£pÚ§2Ýð.U.~.bó8Øæ³AymÔèrW‰çÅÌx•‚Ñ^¬OD‹íhO_¢•çÞ&ãT`MËáF”b60KŠ·ÿ“[.ër㏤8ûMᢦ~°U¿ãó[‹ÿEüó_ƒø±s›]4ÜÓv •´cbXÖ"ˆYÓŒˆ÷#¥­wY&¨~¦cbáVÜYk¼H|ŒÿT¸ðh3& ¦ µXÞýu+h{Üÿ wSÞ*w&³ý³q»SÊ“Pöl‚•0‰ +f¥|NƒúÖÁŽnèâб)¯P-±^ނê5R:©ÿ‚Pû—Ϥ‹³¶ˆ®°œUÔä…%eIãvupM¹L´¼Ú²fÊ=‰™z•ýƒ—dS¦|%×Lâ¿þ7ÈÃQ¸Çú·[+ÁˆÃÍÐç2‚rzAÐA†-w ßÐdUÊF´ÜQÉKåU ÌáNŸmAlœfå'=êºqTñÿ6'ѱé`Ò²aÃ|8píoâ1Æ ™ ¬£Ùe!›I õà$`…ÄÏÊ:éšhÖ"I†Î¨`ö˜]Güò´rAiãtæÎÊwœDÈ`M'r,t]Å +v.!’ÜÆê3â[†¡èBm5#«]á_¢ó +Ñó~e4©äDy!ˆï‹³åR†š¼ª¼ý®²©øåɚPæòXùÊÆ]WÂÝC]ǟÑÚT¼JV±Àhux|gÄuöëÀZ¿¡ÛpúäÏI_.†(}îCƒÐ†©Ê=vtµIû„›¿ +EW´jPüº`<¶1 ÿÆm¶Ä +‘Ø#TJp`\¶T^'ÌÄJS +°_¡Ò+ʑ,¾‡…ž°í›©”šÎåñ7ŽÐeЩ}kžó¬™UfÔE6ÂÒßäÁá¾yR·ì;Ÿ¤EÎ:Óâ§È>ÑÚgáhó(‘¤›Õb÷§`&…Ø¢jY‡ôÝGÕü(Mss!.ûùrƍ3Y¼ú¶[Þéí¨“Vōfþú€Î k¨´A5_AA4ьv]þ¯íc˜PÜdüiŒ2z^ðÃÜRä{G8σ‡Œ$ +’\Ä*Ë59/UƇ!¯‘mw¿™‘cTïÎOðgêRH¼%¢Íˆth‘,÷“ûA¤¦­eæ5<%¢lՏ œØSMe“°î#`7Ú úYƒÂ„àà‡u1N°jåÓ_'TVGzãÖC¥vkŸÝàî?CXýëaš‰e{hbvŠ*”Ç­áï§ÀWO}VBiÂÒËÛQH±¿0Éq·¹çW³_¿o Œ0¤VØd1|ŽLp–~K(ŒytQQ–ãšÑÏH#ϏùRTüe­E(@¼µóùؘWÜê4T½ÙÐÖUèÄ7zªh*Cþ(KëŠ1}¼ŸŠ3ôÊʔ ô÷]µ4öà²^w²LÖjÛc‘~(ùÛ`Šå™Ãa+Qü[ýd(™0 Ó¶\²˜{þìÓPuó¥¼[Œ¥Ýã°½ÕÆ +KìÍ=qnnâvéÅ¿[ÓBÎ`ý]rÙÎhø¶ë=±2.¹c˜yB@ÈD lR<ƒO<Ý­2î‡zzTÜ­–Îã¥2"ÔÄÀWÅJxŠ)¡ +è½_Ìý. ,5” øŽiôd?C +&|\¹½Øià÷äšX '‘.‘C#¦jÓS—ƒø¼„†Õ¾ bî'âÃ¡|ÒC +EKSÑöã^¾ÈDuޛ;ÐÍztëLévÉ ºë0Q¥¹`ZÍ;FdÀõCn~Ø;F±#ñôøÚëûˆ»ŽÿZöÝ:!÷ŒïGéÖú1ó¡%ó¡É®“+¢Â€Ÿd&¬¤C 2†{•Ë¹Ù~TóÌÌW‰#cë^ü6™¯£f7õ1¾üHí/Yö—h¢OMP­«ø1M¯ëúÃL³wƒÎA²9Ö~?vÉÒ#“? &ùã +ïtKžAË´•.ëu+6Æ\“zª`âg‚êìV’¡Ááfz­×‚çÆ.hêÍÅÄZ¨wnQf#øŒ©iø#˜µ§  ãAÜÉ[5Ú.ë.ã`¬2‚%œi¨A`„YÓ§Apš¯Q0,ëÌ–C +*˜™Ëñ—’®R—ÉÔۜ#Xð-½¨PaóH6Z$e;dTÖôê‚ ™8"Dï÷Qnþ°åº×ì°™‹t V&Âýk¯ÑéÌáƒä­ê¢=‰wŒÿæ MɄ²ÕHJçdÍNÏ~ë‡Y·Ó܃õBÛ?.ø/B#S÷¥ÿW «»ŽÝ’¼€‘!NfœººµÖ¡¨ùùH*&…š"’^åú:íÌކL¨©Ñîk¤†n£}+ö$];•¢+þ}”¦´¸ü„M’» PÄLòtmgHRžIuTÓìÁâ-{ÚÄË·:Z“qgJë?ëª~ùUúŸÖ=µõ&ž±Á…ÿ-’GB¥áµ óå‹üúÁ tãÚ ™¼okÜÕÈúKqÌ.¬/æ!üsÜÚÿu—`Õg$æôZ¬Z礊“$Êâ ýöM¢7p…£öÁO%Öz„è*Tó÷8Є«wٍ÷V,#ìºdª†:È[Æ¡äx·5éfèÔف‘n2‰ÒTÌ¿04OŠŒKò,¤° .û±pp‚õô¡Ó“s``¥ûó–ªæD¤h¬%žÁ¾O_ð#ƽkk>azÐH$ýñ][ç ÅQ¯Iî״Œ*îB—RãO©kqS‹£dbÉzÝصºbíÂË^P̦œõ½Ç8œP)ëK‚è{ŸóU§p,éЍo+ÛJ’9¤›ŸÝùUúüƒ™IV,ØRx ӜF¢N/+)ü>V•‡=a7ÙGö1JQO–y¸Já:¹+ÏÀh3­Ñ/¯äTÔM¿ý$µÐý.x\m£€Pä´^VÌí¯}äpÅ,¢Q¸q øÜîýªQè§kåJr〈®ß•µ±]‚}í§çΩÿr §"ä[ɝ•žö9Œ—¾?Xf z™=顅2ŸªR ÂñªzCHJï`Ó?7”¤b¥$g’…+lÍÄ8ÊÉr]’„ò&K)`ï›ÜzaÚ±»‹•¾¤Yȶ“´„èúÈW¦t ŀkpÝ2!¦%ã"ÂN&l†¿ðz㑲\_ᩳ›©¬ºß´È”P¤Ë°ã©eÇ4Ñü®««AÕõhϤ2"ñ»Î¸`°T[~D†ÒNTÅäÝ¿; *suSÕKJ4:¿^l³ÛFVÿ©V]‹Gð¿Ú挫Ç)Þ`Ë ’ž%ôìČI[hƼV}l±‰ †ïZ9‹¤­‘œîkÅǺnÕ¦`Ÿ\UâpŽ–0‡ÍÀgaœ$1­(”r3'  «åŸ­×ñ€4§³¡¹Ò,BÒA¼|ÊÀ$ž€> ã”l'£ˆ+×áoý#= +ä Z@÷i¥šØÓuZµnÑ\|lßЊˆ[6ò“hpò–‚½´m>qBdG,}Y5)l¿¸ê÷§ÃØWÛãÓê¦ØQR^1|÷¬ƒ sÚN7Nà¸þA;Ó|›¹Õé¯ø¢ßéä4ç1’ß5áÈ<î«ô2PϦS?…Oo¢ŠØŽõDäãcä—ò£š°?ìbÕ1Þ)7C‹…áAwg‰ù³Ú( \X¿Ö©®7¥É‘"WHµíU“rY7O†–Ypқ÷ñ=eȂ±ïìµÆ‰˜ÿžh@ ¹~éGÅÓÍC0ŸæÉòå!žäØÖ®+Ñœfûù¿l†S%wۀ)2”‘¤Ïy OVnÿÿzB£ýÇr´Œuà… +Jဤ˜$)”•~ö +½"F»å"˜=™åÀ™ÁSâ!Uñ·3,Jo/·€+NÄ ±´ʔ¯&ótMøô\ÐÊÈ{jø,h‚‚݉S-&Ágbô‹ ÅG¢Á´5™Wù¿¤É{a»ãЀh+ÑL3ã7”÷Þm> ±z±»VZãSç“ʍJ+h¼2³†Ánk5Å`I‡fMq{çÿVÆÅM"˪ ±~H›MG¶"ø`¬oã.7 ½ÚX4˜÷ÝÈ'•},Û±zëÆ®¹!“ôN¹Œ+6k”s(’«·ŒV½Tí%nJ…„ ugéD­@C±Ô½ÁÏ'€”õʨ}`ü½ÀÕ²¢?ÑNµ}•>Ð0Â潄ƒð@æ9,£ŸÑWa%Še£Fàâ=_u£à¨ÊD {7Þ~gP + €»0ãoÓÙ÷©áf )X‰¬˜h7 +€Â„¼Éi‘—ó»ƒD‰+TΆÌ!΂-îuCKï¼!oÏye§wqDžçX›¸õ}ÁÄÅþ¸xtŒ°mٟȀ8¥2¼Ê_DyÅ'мòÃՍ%æžÉ4¾æ/.s<2c.+LBñ9V0Gn,çrôûÞQڈr+GÏۍ<ál ÞÕp©ø(Sª¢W3õR]yxp‚0{&3隢Èúìnë»%O¤8ÇÍÿRßyê[Ðí¢L¤Nߨ5^¾¯Gi ãR¬}kC ¼¹×-1¡¦êº¨ö•xá·ô`ÍD±ú#‰ýüiÚ=óUE½K5jR«Z‹âÝÛ³«q2¢÷-€n•”÷oüÿ'Á\Œ Ø)VÈÂEŽr₫û±û¶-^òñ\nù™Qñ¬€<ÔQîNyèÏz…ž*òÏՍ¬8%ƋÏ@kdUvƒb°µC²{|.¶¿Ø"Óiƒ;ß²òÊ­oT¹Â'Fv}DSMù¾hŸr–Á’´‘°‘æõG‹×oÅð©ģ)¢ú5õp¢ŠØ%wçÑcÂTš¶•¿¿¹X<g)M/xõš}5Oe‘+ïH†N¶Ø¿» ò ¬f”£<Ÿ\–×Šöµ5Âþ(°ÁeB:¤vò£ ŸnPp“ÿ(õ”Nþx¶ÊØã +®UD=S ð#^2I>îm×N°ÜPIuƒ5(2©#?½ ñÙ½^¥Ú(2DxHí¨g¢&¤ñEÁC¤‚£ušÇ·+g-"R9_ï½yQÞG¤d‰}(“rUÈ«z +›P!vAéßýlT÷JˆÚû“7-¦·!±é`ëÀHðž§uoåØ+îîysº°É®b$™&Ý\Ž:Ä/¡2„ ë’ä#üuõ5GØ &T!üKÂÜŽð•Ê)Ú-ÜÍØ«£ˆÅ„RQD'LàÍ©½¯Õԏ2©&F¥ ;2Š7ãÏKì³¾À²Ìêpž«$Ç©iû¥waþfÕ ù!ñ_&v:·Eþº«ÚÝùM‡¾`ôëÓõ¤æDRìE‰D‡Ï™Œ±Zs] –Ed‚Ù¿ŸMP]1g•žj« + ~õ!àҕÅ4%ò *½v{¹TtýæRSë™ìQ˜ëi|^œ…e`³ˆCxo ‰i­òýÊW±=c¶ +ßUiäÝÞ©; *cËLjQObˆB +uü4%Ä÷q¯Šëe· q®Ö/¸†C.qkd·[Í'xᤒ±@­X?x$tƒ‘E¸R<Ñ}‰#¼jª°üPÉ*ˆ¤üc +wM3I:xo<†Ôé(ã>]JXŠ$Wƒ†{74°LÕ?“^qI¬ä?v—@ëuŒËÒa見hËÅV®õw­”›öǐö¾ÒEà :A¼|JpYõ‹ºA×pÁ@NídŠ©~˜/c^ºŸ3I›f®BŒåµìéN àCXéMiÌ´§·8õ=ü¤/¹¤Ë[qXâê^%Im ¾p@bè>yÐýŸÊ;P’°¶'%ÐM”Ü“Inã'qú_ÎՈ0ìœ1³ó‡QIªU/`²Æþ»QüŒ)Á·my…ÁžÃÁ©}…tZ²ÉTº+rµék¸Eø¬c¦¡ –'íjKëó‚ B“[y‡c¦©v¢‘íM¯² œJ_„3 \/rñ܂]ü]•Í%:0žÜ‹ãÀXVóA»n)úƈûk)vžQ ¸§+SG< ZÞ2ñ+»†×”,$ê1iŠ,ç+€ˆ^÷;D%F”q¬Ð6"m Dmt…ЇˆÖ}¾ò¯.ôS?^`³ž‹ÑS"@®îôeæ˯܀©.ø[N©?ú6Cãëv5ô6D¶Ý?¤¥¿£‹]}°Æ¾™B·Ã³&ãûRNw5±¶pìfFéâMzw•‡†œˆ$–P§Ä;ÿ,NyHnºwÎsÒ|rx)„(Ïï’k€®Dé@wòX߁Ý_kìÿÛYh_q󄀡ý.¨TÔÕ&†{¾kѺ¨@û£°kv±³þ¼í ’”‰pŒ²š²g¯KrœjäŠwløÜDßðnx²šxŒÛpÀºÝÏóæ«Ž&ޜF^<æ?b&Æðtô>µÇ-š +I­«•˜·Vfd¶ËÃ61PÌùFϸ5¯<ëy"‰ÝüŠB³Þëy%Sæƒ<*±|ÆÞ¬½‹"Šº›nE¨¦Š#›ñ—˜z¼ÕWÚî˜yÔX3÷’’áôáލ»–/±ÏpÖGkB‡d`às[¥‹^Ü0˜[è6¹ô_@ß՞÷IˆXÀÚý_!ÂÖÿ÷›ÿē#ˆ¤B¾²§Q*aä'x)ÊZö½5‚D[)ÊV âY·X×Ԟ—m;î¢cDJ¶kJGÿP=†+~g Çÿø°¢YAYÕm+uý±|ì;–ò}wû…,÷uÛXøÊû>’Ù׋A›ë÷ÊqhlgúèÄä5§½ñ£–æ‰1ÀÒY=Ō];ßпI"M,Ùô¾ÑjìnçµÕÞä@¡÷ïÈ«:²øí¸!\Kó™‡@„WiÝW¬œ¼gí4!­S>í"þ"'BµMT‡µ;h’­³ áùvðᚊ ƒÒeOóÍBÚ 7¿Ï·×ãÛb’y$¼(•¼ú«*ô<*KkXÀ3RuÇnŒ›¹nÕô‡‹óˆ{ÿ€†Åãü^|•ðKWÓwOxФÛ|oTo,Ê\€ûòvI߈‹ ƒ’C]'àå¯I¹æPƒ8/˜‡ *uLé% 1”-ù"ÛO'Ù×ò„I¼ÁyãWzô‡¥/1 ²Œ'{o¢c|ïŽ-ÇøŠ¥ b<Â:/…†r‹:¹Ò~¶×úFb1sòؒ*ÒèÊ»0…š/Höhð.îÖ«0í ` ¶GÇìPljú"½m©+IvúrEü¾­É`Ö}bR›¦’ñÔÑjf—%2ý„2@¢;L™U5䈭(æH¼³É¸êŽE÷ðݒ5Hîü¤¥RÔ¶KXX$£û.xå6ƶ?ÉåŽäÅք= |ÿOjÔ-«^vt ›LsI5‹‚:Ï_±DȆɞÆ—Û=ëÝvlbs yûÞÂ#ŸY©t°ÏGʝñ1÷uTúƓ":¯7ï)£«ò&~d7q±ì˜`¿E„†a¼ÉgfòXpójê"sôÐêš´ ã ÝÍ8ëâ{¯>R‘¿ÎDì”j¹uю¶^ð—-ª¨ -!R y–?K#:›Ãi ¬Ph_`欝”eÑZùVââpmINC ŸÝ†æÓæH¡Ÿ3)áâwÅRx>QZ(z?ââb¶WÝq01RD’ýd;,ayg[øˆgìùÑç +A–J>/T +:{v(Bªìi+”„^Ê؂ŸôC+êàP +ÿýBCEë|t¦]*ü„˜Wy¡ÏÓ+}%¯™ý¿C˜ÀxÐT‡úƒÿŠŽ’ác|%ÁjþH[ø”åŠ9ƒÈ͟¨åAŒ{ر Y±VD `á¨i¦I¡æ2B¿7 €ëT'ü}ªþù½DiÇíðÀû/>ÙÈ3•nŽv\§˜ånZ€•€o8ä,”õ%Y•ûÐg)℧‹ãAžr«ÚVÐàkæ£Ç»ØŒSìÅê\D!–nÅ>ÁT·BD¼žn" ç n ¶Ûüdé"ÝËqt֐rž+geàkLÔnþãR›¦ ÿ]QÉM£¿gϘÈm`'ŸgêU3Šjo´¬ˆZÕU—µÀ¾·®gHԞ¹ ql€¼'‚·˜PýUáe”©¦”Rj'ÙÛíYV;P"&ËÐãwgŒÐùç,¾Ÿ€ vª‹L(¶ñUƒŽ„Wµ7e=£÷ß@=ª^ÓK êU®?á1âꑡŒsÔ2TC¿¹Ðø’öSŠl×¥º¾—nZz<Ô@’Æ!ôޏËÞÿ€CÀ€ms­Óç`ž1Ï[2Ò®ÞÆÊt98ÁÉé¼B¢–Žÿã Ñ÷Ϗ3®;V•v}`É|…ê-ɟw…_ÆÅÞMHià×%xì í2 dÞJø凪‘Td<|•6ՙªK §YÆ»y'€Ï€.³N{fù8Ye´¨ppÀ„ÒºéCò‡¿Ølû:8Ö#>O4W"#rÏÇ0Y¡í3–Eâiø8rϖƒDãCº%fDÙäõæ?¸üŠ,à¬(0£*Ý>·õ3iY SŒU/”6™Q‰'zæž:˜¢lC†íîy‰‘¬plÜÑÐÔúôœ +´•úòj•=-+Œô¨¨¶‚4ä^.¢ØF´“qö«ÎçŸÌé„Þ4“Ã#®.Á±/ïY +€t>±½£n‚•Êò2ý+.é7lKØ/6Ï#gÒâÂÈè:p7ü ‹ £×Úf÷ª;)HÁ¥òÜ0¬£´)ž 3ZìÌ5Dp †x r7°k6AäχHV¤ÅL–9ñxg§8ÖøþòU~”5â× ›­‘bXè­:Kkº ®¤M OJBW0>´MO7¡ºâ2ƒÑ,ê +m_ªGÝcoí†gÖÖăäk©{?À¹˜€ƒËUIÞÍú>Ö`Äh&^´>¤ú=ž,¶r¾ +ÞÊåä?³§gÐÀ&ÞÂdý÷tÙNša¶}- a‘>ÚE?äX•\7ÐÁ°šdÔKÍ qŽ0ëîwX1´”ê€<Àd;Æ}Í´ +JÂØ¢³™xÕ§as‡½éHžúF" +u +Ç1OÕ5å>`Ó +äÌ &WIOTÈÔªw=(¶òÝã/q˜c¬Ö3¹àÚoG{‘zB- Ì4ŽoUeRÿE[Ÿ²F×æODk¹zÈ+ҟÈy]I™ ­X*N0¸‰²¸™ÚäSH1²‡xæ&LºñjÑòŠÌó¸"ë+çƒl“$‡n›dRz‘!erÌûñpà‡y;uÄ|×ñóÉˑ2íiºvüiá  ©f|€ZÿU›:‡MÕUñ÷à-nr•‹œ AÜa>UPdÏâV0Üî¢'TÝÌ"‰­õ˜ŽIV×H(+ 1*]œ ?´½FÛ¡ó Óx„Ïò0÷Ï¢4dëÏ½Õ«„`oŸªl~\¬Éeø‚Ðý9 +¹ß•ÐIA2P4”:‚Ÿgs~RªðcšL +ŠCW $`2âá¾0´(ïî·®ÇwèJŤ‡RÒcô,ÄPjÔßi˜ÝF•óô¨&«§~Mœ4ÇîêîªÁ®™ðµ f÷” 2œð¨ì9w˜*c:}%<ÊçœyI”{µÆe·]¯¢#\m J·$ÏóÅtì& <1]Få±T¸tƒ®ißÍ\Ô +Ùá‘÷3âå€Y‰Læ!ÕC äIéÏ[–ž§.ÊbM×Ó|¹#YËi0H?¥0øL¡¡ÜZð¡ÞƒœHñ]ÏâðSèLN[âñÏHtÇ .­ôžqætU’Æ5^øn° vœ4Šžih>xeR'[×µul!ûã3^”-|Î ä-MlZ9åz!#ãÆ Ë¼qáSœ³™rƒ»´•5¥rW£sQt–­eËë’øósO@¡V.Në‰Ì¢lڃžo°òc~O"3R¤–q+ Æi蝁 /]›“™Ã0Ž˶þ\ò˜àƒ§²Ãëçû¢Þf)˜£¨u \9}#³ZJÝÜ4šE"[E%‘ÂoÁ—vÍ% KÃ&xs‚f«Í5b ø´wTðJóKh_Å\ŠŽÓ9€,>’¢â÷NQu¹Cb;”Õ3ècҐºÄÚ)ç?0žmÏÜøζ‡÷4RN·-xÛïj!waà…AóÀ‘¢KÍWÔ%„Z1 ý³ †í;òb7(ñü0¶ÏºjP¯"=?;µK0´$i’·ä’®mÝÁ]Ý¿‡ÜZ†®)B?$g-Åüø¯#k!Ñ¿}^÷ NÁñ3‹£·ç‡zÕýc½!™o$´ ëša§CAk-€`’͈2.`’¥ª‡´yDÁq׎Q=ÀWl.r—˜X d¨FJ–yýq?ü{®Î;éÉŠö+*ÿŠ|Œˆf} Þʈ¿V²ãÒâ‰'˜vGé€ ©•tÚve-¬P sçóζ{"Ž¹†¯ܲzó}S÷g¢‘ûd1–’Á +¼…+`Þ<¤n1Ê lJ„/ǝj ¾÷¬šu<¦˜™˜*yø ô©v~³Â¿¨Ztd÷©tÍ2:í KX°iúSuN· +Y© ³Å¨á)ŸˆP¸-ÐIºP\+¯íq»Êa¯7pëg*“¦ãOÊl&ïcm¾gçäÀ~¿ã{…;V±xïh¸3½›LL0ä慢ênh±½Ў6X@h$jº¹~£à½Å³ÑÔ×ÎʾÔؓv?ÚSv—ÄdõäT“„½»ÌD⟠åìQ2X¢ÎBVQ§HÜB ðð.è)žæ‚A•öF%r ˜º¦WîÐA= DRA°‰ +î—ð&×l¨Âq.ÉHsˆtȄ–­ïÐ.G4ÌÀóEñ2/oi7ÿû®~þ£ÀQÜ!þlº0øÔA†KÉ`?—cԊ€ÅÝ×|£ ­Î€¡<šG*ÅÅàR›ŸTs²D{ëäžQ*Ä´ ¦¨»X”‚®áhBO‘°$l¡F{%$G¿Œ×e·£ªK1Rä8VìdEˆ{¡"AòþeÂÔÓ.Ó Çl¥ª˜tÐP>¢~œ´ŽÈ²hKo*2¶ü8bîÈ/oÜ+{âæ l 5—Ö!äá+ÛpQ(G”H#¶3/–‘€VW>ªv“ùXLN̾·E„0duÆØ/¡VY³E¯òïú©q:h¹|õ¿JsA©6昬Ú^éT²ßÆ4–ƒ%¨p7u´Ùyû:Hè(FËL'ØÛ>¯a!5uÝfrP›…÷ áME`H¼Ö¤1Igf‰ˆ –óÜñ›¹I°«€_Ífñþ׳°m$ÒÜ6ˈµÙ(×p¢bë$ÅcíT흿^ëY&Ç£ñIJˆßõsé#oûý…±Ý¡–lŒ(¨%mé2ÙD ¯ïóÚÂ@ëÂòâ\Jòÿ–¯‹?Ÿ9r×J'ŠÌ†k³ñD&:«@,z5‚-SOP4ä!Š|‡ó‹Q»þª <˜TíƦõ¡°Ëýxp?©R‚+ìéðNß'pób—™€÷¦q•+ʑÁ„võ:E÷Âk4Ræž$>q[Ê8¶›¸óªK€è{õÞpð_©‰JßÊØC֕⠴Á$Nmíø’ß 6ôsS½d9x?[u1!7Ÿ= ~{¡MߤJœn„Â1WçJÍ3ã)´ÝV4…EJ<+Ú|<·uR³Zò¹ñ'ç3Dîæ“>“’pÓ|lŽœ““:‡h—o‹4ªÂ—­‚’(™ìöLë0˜«yKY“ý¶p¶•M¨BLkÚ’A0 Ð-x‘(‹À±üyXTùg»"ù|âªy­–ÂæŽæL›O÷”,Ͼvrxt$çbÞVÃ8ÏfÚ7 ôþ—ßFizpd°#%Ä(¡÷S;"C ƒz!¸yÓ¬-º9¸a¯¸Öw¯AíwKÖ}Ûʜs|œ–Äá!³n@tâ‚^ã»QëÖ.ë~Ó@ÿ gû£ íZ»Ìþ0¬nKÅÀä¶a$­ôœF\ˆ:•õÏòž'CR{svi±Ãª\_2Tåú­?`©ähÍã%[Ö]“= óG–äÔÙeæ–ÀíH`´IUC`dÁŒQ³¨Ÿë¶œ¾wU °]¨@7+|' ý&ڐ„‹@ËsÌuMåŒ>ø¥0+EÜw:4%ÅÍœԠ೩l.ÜêQxE©Z¤-ú]éiŠñÔc3ÎT0O®„1/´ô +0g ’Ngѳ*†±íŠ\1c{Ó⧙Q|lɛsÂªI–¦†Gæ'B<¾sý}q[¯þ‚tAæ)â>þàöTzÉye`“€v#yDr1QÕ*-f3²àŽûKELŠRiY=ÅÅ´(M¹Æ¤1ÚyÖCš×Pt±Foõ耳ÓüÏçÿ–ËÃpÃfqèÈÖ»òuºáê÷Ø_!ãü?l i[á@kI"'(‡ŒaUº‰§<@F؈Uô#%3À’àý N-ƒo;˜ß1ÚL[äf"—ÛАQzþX``ìGfAR΀þEe™à‹S):‰Ü4×\tÙâ>ú9ÿ¹tL€o›”Zí&‡MpŽ75¢”ù T|¥<áÚt0~—W›& +0xX½×÷q¥ z‰2?M|}˜ Þ¤ Øv‰§ |¥ÏLj<’ã.ÓôrsÞÔ!«qö°ãÚ1 –þ[Gžy´õÄѓ‘D»ãEÂ6\g„¹X­ŸÐäÓãצ”Æ%{⠋Çt Éù– ÈwY 3K Vš²Ñ”ðIçi¤@Óê€ÈE”ppùW³¶ú"ˆuzâ©°°W”žêqñó¾+y•në,ÛÁqX*'ÎßöxÌ Õ»´›K~Ø$¯ËA´Åƒ#²c7•Ê§}­äP&Ï8DA?põBwÞ7“ߕ–B|êÓ¹ +ïJ t_ì¶ +㐫ƒÆçýMHPÄ™¥û´*øÝ`XÙÊ1HÚCîoT?9‹¬»‘)CߞÄôÑá +ŒF¨sö™}`6Ö®Û;÷+9Êx¬…¼à…Gd¡HC9—¹ug±A‹_Ê1'¸ÍHæÉ5߉ ·@¼0ÖËN3W~‚¨Õÿ]l›>K“Zq¦Ý·Òz%ïä¸í©q !{w£É¾¯™ÕP©Æÿ|¼â•Ú§Oð®…=fól}{™ V¶¨EÆÕ²7>Ÿó + +\ák½Š™Æ)âàwN3õ|ӔÐMtÄè+Mƒ—G‹]¡Z3ÔEo#Ö_¤kŸ“´†5=9’P €Ê +^¶àŒRv<±Ã¨¦6nÞF[EñV«éÊíêùˆܺôãü%BnÂhþ°$é€à~Ç"Sœö©LôGêž(͕¬¸qÔ|–Ezp@À;†Ú±ˆ5_¥€lÅ.%^ZV~:„œä&}8ªBl}£Cw5"Céà,Äï~=`¯”y”›fk¹‹ÁŸòE(ùü6,˜9ûýï"ÀˎÜï,•5ñþ ¢Œ×·®úuÁâ/ˆï;æ¦x*ÈZ$Ps•Ù̧JNþÆW;=œ 19Êy©…,5NÇ_¸v…X-Í%èøÈhò4^ň¦„øÀñnÀœß‡û2wpч³ŠcÞݤ"óSOÛdH l  p÷=W¶ðF +?b›ûnWŽt®v·ݲ»ùӒUñ5•4gÊ~Ow{fíªh3 S›M¥»{ôóÙjÚ±”^FgAàçT[ÖÝØõŠÃ×*ôJÚŒXk7Œ!GÏNÿ‚‰ŽrÖÌL ¿9©nÞû¡“(z ?-íÍ ‡É\g+nwÔʕšڒãËì§Q ¦($uÉþ;ì"÷mžÆÒ©_·lA!ð;lÝ–+æçøîSe¦:®q{jH¶sçñq³E "Åì¢Ú?üYj€AÆzŒt½MÜïüùzIcœÌÔq'ºŒQ¹ÒëP!ƯòÈ¡G9Š$k¸Ã‹r·'L&Çs‹W´.Ö¯vwíÐnÎÞ3pK3iÁ¿˜ÁÙ ær–NJ.ïJknüÜÅGí7¼2_å>ÇÏ÷OgŒrًM¨±gz(¯lØÆ°ËÞâIzSW6¤c3SE>î Ž#²œS]æÄ'hæBŒ°ZäÉ6¸D3²Ác ‚))eJ2%YYTøÀÒI*0¨©0 }n¬C“¯Fê”9Â0âoTc&ÎÉ2á.L‡*ˆ bÔ)dA +/Çá2DŠê¼1F˜1Tíã b!2#²±¤%’Ì%,á"Î!o‰)¯ÈDRÛfù‰6ÊE'Å»ŠLhMDLèáVÄç_x*§ø“ 8-Aš`⌠†aÔðx=Õ,›úŒ„ë ä ó•Î`àœèÇ}°4èSCäxªh厫›ƒNº;Q­óNÝ Ž‘ò´ÑTƒdl¡HU'Pëí;ᙖ*°õƨ&b¡§ +©ë"S!?ÂåWª"þnÈ·teâ %M5Ô¤$™…ñ7e$3dÅy¬úÍŁ¡Š=®ˆÛkzºé¯ôÁŸV5å6bA«±ˆGQS\ìÅ>$2eP0ÆÓ¡¨0~Z-§šš¦a IÔ¡Îå8É32d$e9¡C–XIª¢•,AaŒ+‚kÞ±Œ=¹M;ú&CJ*"¼ÆDbÒ ¯‘ê¬ES#nþOØÇ%C&‘1ûáQÐgTѵZj š"‰™á¨ˆB?/}é͹TEd òõ«‚ÌЎIA¯¡sˆŠã䦘wú‚<†Œhö(f"ÆOâ0\æäFOÈX³?–rÈéGdÿÏt¼§¸^ŨJÉ,çÑICœ»F eÖx<ÇiH¢“öš“´Ã»¾® ª/ª›çT±@•·BVIŸ\o V)Ô*:Rï«ô¶.‘x$L¡ÊCg&ƒ²åEB!ÏŽ­•A$#|8” 994¼ ²äp\ž~-凔³O%‡†gdRŽa²Pµ,–¨¢pË|ĨÈy×ù>A(³…"IlñŒV¾ŽËEÅI$(ŠJ›´œ¯!Nœ¤ú°$ C<é Cø!‰Øq Ãr¬’’ ‹ài*.¤Õu‡W$‡lÕXü4¤l„,0Q£R7œpþ?;‰ù>׈µ•báQ…š?q¸Äꏚ¶ÈhHÜ2y —S+ÉԐ™ˆD-¡))¾R‹£é>R5aŒÅbHsи?0©9Î-šˆ•ÜD3uvhê¦r }(I©©J3´h6C‹­Cä6Uó·:µ‚žù=?"T“Hm"œl.´Óƒt{ ÊTæí”Þ‡p¡ÅÖTà.äð6|èA‘œq)U=#MÏI˜iÝqÙ׏çîGH¶–TÔ2Ío$Jœèkö•¯ +1ü5euOAFàÕÛÈÖ3ì« aéÄù`Š~!ebå#Ž×B±‡¾©ñåWÔOYU*J#,ꌲ˜Ï‹6 ÓÿC¤×íd>©ŠáXÖ¢™ú-´™*÷âý(NŠ," +”2H„©®æ£9£qٍۄâ‰Qy83™†Yë[øèҤɶ©M>#¯´o¦ßs³1I¥õh 1­¦]jj,C­W IgK‘ ÕÔ#ĸ­e"2 +C„%ô)|5§±LƒQJ´!3ã:2áöÂM‰°ªœ¦šamŠoðKg-õP“™Ó'ÔÂAR„ñ5’0N «$¤ò`Yø0\Ón0‹Ð‚•X¤2¥léR,Qº¹uô]ÌXÆ<-­Ù@E>Aؐš©ô)ÃÓ0 Ug(§±)á,(‰Ml"U3,ª²ÃDXÂÌ`\2Õeåj‡ˆ4ŠjŒÏMlg刽·ßˆL¢3ïk©™‚¥NâõNªV$-D¡·$ª¢ÉôϦ¤<ÖTU&¦h !FÅó +ÄV‰$Dc|"_+ċõS$Îp†4ì¯ðATÌHVJ‘fH¨:TaÐ%Æúë´R#Õ°ŸU'ŠRٞzÆ>¨ÅPBKóOÅH¡ÎÜ$!ϧvwónã åæõ¶ÎÜ'!%âÈôä/ƒ@ƒ± Ÿ¬ˆõ˃˽øð¨%óI„w:i¸$»$¸ë3ˆ…K|³QM_‰†¶‰cP1fªacŠv±á9ÎÜd;8QFg$3ªU·0⇚Uz¸|‘ÐhÆ(“>b¨±3_mˆzÔ"A¡Æ +¡ Gò¨f¾Æ°FqÉšqÓÍ)Œ$¶Â8U3^ÎáƒCœE$²,ËÚ'$Y)û…ä + “KñELöSÍMä„:¯[êÞ}UV´ÉjD6¬É/Õâihè}ô–& +ëyyCáŸø ³/>© ëG×ùP»<›ÕÎúÙWícDããÃÁuÂRMLÿЗ–H5½ACEìß9?Ü¿^¶N͋¢g0DяxHV¤JN_œ(Lž8ÌïÃ|/eyO"ü‚ð҇òžšõüŠùzý?oÅм°_YU•òå·GéB–iÅs"Ž`µñIÉÄåo–ICåUy͌ÈçÞr©x­X—ñO±’ß­¼Eä÷S£ñrù8Qó4 'À‚$ `€ ‡:„g  8ÉÿN üL~æS ª•,_öüÕò."ìRDŸK¸©áƒÏN³hd$ÌîžEAARÔõÚDq÷1}š‘ôI”-jHþ]²}àª¦z–0ÙÄ…L©Âv÷à M\Š$ŒƒjþUÕÂa÷rY5¸fRÁšÒÜHè%¡ºjԍðò’ÏI‡bD±Bq¶cpBBì?DÔØmL*&"D§hÓâŠ$'PCd¤D÷E8aJ%¶¢üaJ"MÌÏ<õr¥fÌH¶U,*“/³”m¢Z}—ø4f´fÊU–­‡¥úcã×Fèé,$ÈRD·„é+1‹L¦•®²n¹ƒE6S2ñëéb¯Yõ–„'Œ°"±3J‰¶‰!­AáHõˆÁªìâ_DJ¬ˆq‰t·Ò1ίÏ¬HS¹Zœ.Üa"º[ƒwFÃt1¦ts 1§Õ’_W¤Þ3(¨F“ZΔaPÕ*Xhq ùˆhÖ¡ …9/¾Ç5™)v‚¤¢zÃaêÏTIý –'Vú6Å•íÈjaš£¦ÆDDtJFz=¢½&mj‚ tCHa +¯Méý‡ÃÊ@\øöÐŽ+øŽUS›(2ç2ïŒeyª“Ao±æÅ_“³ˆfˆ3³É®ŸX©D<¡è],Ï|:\ÝU1p úŠó<Ê£uCKQ‘¨¡Ø]5òÉ }ªBš|‚4âÏ%huDo­1ýa3)¬‹¨JÇE”Ħ΄KЄh¥D+àèIvƘ"ZC¦ +á?6Ž\øâ! +¨ ¬M¹#.ú…Ñ:Á! !0À +³Ê'–l¦"5Y$d*ú˜%ÊPD¾±õJˆ´ÕVèoÂÓbǔ^q=^bqLì¥9I|7”IŽ-dF–¹A–”ÕaqBQáé/FdSBCõY¦JÊ%5’ÛBÙÓ´OÃȸƒÖWõ<†°_›¨€L†°%B—GÎØïdwMZ²L„íNœ®WB¤†ÃtB+":V¶qFÄ^½drý²Í¥jHKÍ_ƒ*Ÿ¾(z‡ŒiÂì ?R=²µ©Pp6•N&~„Táš´DÃÙE¸ýÙÊ)Íìò 2÷;WqРøâKå¦M›úD"š­­z·d2 èt±ñt¨ôÆZšÒNÊ£õÂéNŽ=¤'Q§åQ¼USqŽÔi”¶Ô¥`¢HÄ a°(Æi,†D™¶žüdºQ£›ˆ¸N $•1Y"ÿ¢4í™H-Rº¶XH㐧¢mÊD‹Â췊–¹f¦UA-l,Õ‰©pKbS#õ™R?äz(f"tIX[´ìS…‰¢&5â\ìc‚xj:U'lʽj=%ÁEt±Ä#!nº®p[\¶¼¶®AÅÀ©æ%óíúª,6ASîÃàzC„T1ª +nïx#OxÅZ©^½áõËxUF Fݖ¢Äá^kpœæ +! +™â5™ZŒ™§’8ÕÝÿº@õÇBœºâŸ¢Jm—Lxvíß q1u¶ë#ŸÓªQŠY©Ö¸E”± °Ÿ‡¿P*JU旊fŒù‘'å·©sZìÃzxYHÌzö˜UñH1ÍЖóâ‹Xêr1Y*n+¦G#±Åltˆ˜d“8VV&f£[|‰]»©Å°°T›?SnÄ3¸í) +µÃ&š±+víe4hÁöŠä[Éô3¹¥¬–ÆÕ9)~%~ÓÀ3d¡šËÌYÿ_'Ÿù5¹{bHéûä˜êݨö¯;òB†/ﳸ¨~è”/¾ño¡ñO_>‹}'„¼cÚÐñÿ<ÑA,o—¿j <8vhQóq‹'{bL¿ér×6_/—ÏùÔ{Ž-ʺÅóõF£UŠ^$Š(ÃY%”Þ&ÊIÜðñfKc½]]{¼YÐÝ,z»Ý9±s$šŽ)н`.”¤¾4´®($®i5< /I×đpqàˆäH¨¸ãm·†*™8NW^Œ½ÝGñx›ø §õƒz¼5Þͺ·kºñÓÒÛ ‡·À¤DÞîoKïi8’y?Ëy÷Dz>ޘ׼˜]©=Þ®‹#y>ŒåX•ÔX7±©ÄèobOÒÚOZҏ$Ò_G„%WÜx»Fi˜~YA{ <ÐMuŠFá!Ý*§4é¦:M£ð@·ò_b%Ï ,}(ÑŠBoTä=ÞxÝaQ#98“Šïæ˜N[†7N?HýJGYÒãíÁÞ®ÚºeØãmšJä7ñ¶ˆ0_ȁU•z¢yĨãè²Ú-zê}£¨u%³BÉŽ¦—ˆÄâÆÛT`ɅÚíGþ”çAl†ïrîLáH¤¦á÷#¤ðB%æ5Þ 18d¨_¶uªÐS2áTM{FTûCM;þHFDH8ãÒ7°=ŸÆ[1ɕPy}ƛº]SÑÇ3ÞNá‚ ñ¦I@á *Ž;5Þ¼*Wn¼%1%BTבaãíx2!c ÷n¼½%úE,ò›r·kÅÇÛu{.p3úOj÷Ž„ù¼<:8Þ6ÖLÒq(Ý"$E\‚‰;kRŠ©K¤x‰¯@%Š”ÉN„’d]#̳P tl™BÓè+ã“qˆš®×Éñmï–QÒÊÔ{OÊöÃ÷Ú%2ÄoLQMúâìø“pP4àz}‘`!é«KfIXQ òkŸüOÕófò ½(“8‘ Iê5>UÙ°³Gä4çÒÆ t`[|ÏèØq"ïÆ ‰8)ƝUO + ß3 3ÎûžHþ±ZZcqI04ÿ:®è.ä$9ž6³At%Vz•×XÕ ‚' /çòˆzlˁÜèIâ éËÕà:*o½?HAè:Rèn1ˆ¯¦€ï†Ø(8­õhS ¯‡'žµÄ­H9§0Ü´» +ÇfF1þŠ¢qz Q%d. cŠvP€V óeýÜü‰Ñ½8¼,: + ¥E–€ãÁSOãjžx,J?AŒß시’”¸sM¥èŒró)cÖ¶;­³½õS¡PŒE~p(e5¸ …Óܶ™q †¥GËäé.¡Æc»Ý+!”r- &;|FÅ6ôQ ·ÅÖ1ãñâ¥|awY¯ù0ˆ +c:EsôwŽ`ÄÚ ŽÀDÝPYÅBRì`„÷lO{žâ¸Ÿ ½káÁã˜C‚_ Gù£IB)<_šü›Ø\«–R‚ÅY k܏췒¡Â-¸.®B)”(yoŒ-3”ò¹nñ%‘^X>Á¶Ä”£•CK9u |ñ}‰RVC}@Wßz‰RD,]…ËÍe9P¢8×yp Ò|°þD) ””ò樱’ÞHi#a?XI°ZqZèTr[¿…³á…ãÁ’F(…ÖntÒ}~å. €(¥oü¥‚œ\¡vQÃRàØۘ¥ô{œTâJ Ã¹cǨ½’¢f§J94&èÈE)<Š3TTIn:ƹ¢}wûYï®ì”&Â_x~+JYÓ7Ë;»·9jÂ9#ù€)})Ã{÷Q.Î-SÔ'ZÄË؃(E ¦_¬ }D)t‚Úýœ¢”É‘¨hŠ»¥Fuᴪ•(åèÑR2rÖ%JYX”µù×QÊFZuÛ2\«K¥`é£$±|¼ –ÃdêåÀ›4ü1))Ÿ-YÁÏR ã†R¹]¡1é|Œ½ œ‡DMBAQH’>D€ öPÉ7È>ž^ ¥k¢3}~ÚTþí÷|p4JÈON¸’¥v‘†ëúmƒCŒmî EÉü`MÛ¦­*£…Q*/(sm=â°Vª¾¯Ù¢‹èAU¬ŒlqÊ/×¹¥,ÉqÝl´¥Û_R”òYŽ0eqÅ\”òögS€%€sQÊ¿¨ãœ°?¡ƒIú‚“¢ÖQa'š.WyìԄl“ò¡úHÝw¼L§šF)šÕ-¼A_HÄYõõ ìcҁsþgˆ¥Xš!¥<¬1%¥`"„l%íêÿd¥“KödçC ¿çÑpQ±¶ÜÀ“”÷' Œ›åÖ=*¥(,,h_̈ùˆ°ÄB)EÓlw #m¦~(¥Ü˜ß Hoj×xH€fhΝ‡ç¼ð’„RJ|Äõä¼íG.MRjøKç4ÙSJv¦sz4槬–ÕÿÝ1üh¥I¦ë)EÞ¶”‹ýZÑ]פ;Õ¯¤µª† ËiÛÈÚϔIÔ¿ çÐáÕSÊeF®þîƒp:& æSJ_I§󲖪Œß‹_ÁNJeiß4x:ïÂçŠD¿×…¯ºB“-Nmt¦ƒ/8 Z “·¾Ú7øB§–™¡°x|l.%Ü iŒã ¾xÿºàtl%ÈëVƬj^°h^ôv‰B´OÝÁRƟ¤“žE“»;Rkà)Jd¿­þJÑú’£Rf=£Í³Œ­š(z_XwGçñ|/˜]ðÈÝu^ÊÙ_”ñýÛb]îíb Lۄ$++y&&±K±oãŒ×RÚ·À ®;øâÓ­¦4Eè6øâÚ=—ÆøÂô;€eaŒ‘+àh'¼ERµ{|Tô‰jëRÁy¶¬ÿÀˆKQÅtólË|%ц›J9ËSßh«æ¨µn[@ꤜ\ iû»§¹Dëäb&× Gõ‰c'ù~€¾å¨¼êÚ¤ç¦a÷wxhï—’Ùšu xBð&%ˆìƒ75ô[¨a`=Sÿöè¼Âv2‰Þ睽Oì‰ë¨jþiG6F$Š@Q) ?[,T£RŽÇâÊΐĠX2t[îøìR†æ@¡!åÝGµÝ^Í«›€VÛK¥¬ö§ˆ˜®µ£&•"[ta Z1ŠBñ©âNiBbTʆÜí ®z£R†Û–ZY3 R”؝‹[ë½1zL÷” 筶qËð§àPRœÃڔ’nnô^2bî‹)eœ3Ã11z[¦”A~ýÁÒ0,’Í”òó“ôØ7§¢7ÿˆLõ™x»¥&SÊmÐÆj½ Rhàãçi«¦”Õ¼–¦EãÝ šRÈõÁ€ð•á/ýmJñxä‘ o†É%N)·®eS³ü0Åð·GTð Úi~%%ᐻ %ruW•¾«¯By»¬Ÿ8ƒû gL'ù“ºh0\/ÄÄhZ6¥l+îÁ[[ì¾)å”OÄ,L#·à¹>©)¥$= ¹°[¯GN)¼ÆñÌòÀsJyŸ]¢·èYM±ä{iø|s锁Y3’¡˜Rà”ÅBÐRžüsJA¬Àë…ð2FœS +àÊL¦€…¥íÅb8ád*(ºÎ8Gî«h25FoÛàìŠ7RŠv–®eçQø£³Ý#¥ cN dŸma€“ùJž&Þ=ϾU»TŒ½i l›˜/ˆMJ9×jh÷Fo†3)¥/úWƒGn^E#¥T$žCrqõîŽRBeH½{Vs Ò¶”øy‚3ÅiðQ +sá×@².ÌlÎ>¤‡¬ð&N ON]ÁyÂË].Ua²„0)לzBw…"ݒpb±j}Á5;é/4°íÎú%>ÂF%u&б $}RVð\«õÅ¥œšLöBDi€k”ŒÅ[§G”äÝcõD3¥¡DŠµBÎâþ ‘ϳæôˆzÑfO°¬Á¤(‹*)®ÏGÊ`Tú<,úá6´"çR–Ê%;®|Ê•3‰Q +Îa÷¤YAûÒf”r°ý:³£‡w7,È8J¹G\[RùÞ±ŽRæc`¨·LK„Âë(Å Ÿ†P¥°ó(¥à“ùp‚G)M8Zç)”ßQŠxxñ–·;4RÞ$ؓ_Ȧò~»Ø*êkÝÛðfZ +aPI êŒèE·k’EϝYè“XOÒ(e"è»TV§Õ(…‚S§ÒEi”òoå4ÜF mÏ(… -O)]˜m>(¹X9—”$½æ<R|TN»æD[F)§ì-S\€D0…3J¹û…—¦ +™F)O($ø{fšpŒ&äØ +Y¢ EOtU߀wƒ»ƒ•‰ulþْÎBg”²[û×ÈÒ°5J)#–ŸßK*¼oR<ԋ®²¡)F½æÜÂ\7Jâ‡BÆF?Ÿ‚ŒR¾¡,h#û=1u£5c0³'æ6?©E)ÄïnÆ?ëNøÕǜӺYÁº ïBÙ-ƒwÞ\™DóyþPí&%WbvŒRÖ(kÅä99oÔ(eØ_j¥ßÕªI~ARyÓ9‹Ò ’BXO&ǒèãõ¥ Ûr¹}Sm¹Ë[«¿y|)OªYÃ-l"ùü b”²rIª_ ƒT 3Jv‰ñÑ +¬DlGAÜ5XIÏdéC®|U¥ÇËr•i@§5~Š îlWär0›Nª)a_IۏDÛ¨rn¤SÄÀµôN‡K:µt’ž2`ÿýW¹!#¸ô×.ɛ ’6]ô›)& ô…D³7áŒ]ùZ‡‘:Hw’ru°¥"ƒå’fY!¹³ãÐ+Òä.âú3ª×¶*ûÊŒ%Oh( +ݞ$ӊhßåv´ãÂ$O~“«¦Ž@âá‚ÚZƦÜ2)rOß Z­Ô}[ž¤‹RcâL·mOà)Jy†–ßûgÒn Ï(Ò2h*#Òê`2å.Ktý#.íçĀ„1¸dÌ'ŠRä3*5…d“¨óáb/yüöô¹}—„ ? +/zyè;ü'"IK;|HƒMØ4ÔºÏgŸláÂN°@Ýĵ8ŠÂ¥ Rc„ XY¸ –ÂÐ £4uò QŠ’8Ñt“Ë{eŸÂ—Léìm¢@J|‘eaXºJÖôžÂǕ;rԑ©y7oÈ%›s ½j¢-xߜâèD–” +QzÎ/¨ÌBÎgϾ-p®=ùâXѸ¢¿U*0JF×s Ë2è¥tïã›ãäwžÎqŒ‰¥^évLÂóuŠì焉ªÚ•@ÔÅ9s\’¤ýq·Ç”Çe`©ÊçŸ!‹îàqAÊÚÎÅ/5´ Ä̘Ž±¾Î$˜ ÇiˆªÔØ ºåØ©F­aÃ0Ÿ\Ü/̤Ö­>„»æR¥®¦ç£”ƒÎ²<7á(dÕ13r)gŽ{”r9¤i€V¨ÜX@ô}”2Rµ”\ëSc†‹{”R¸5æ°x(ž¼°­QŠ‚ß(ðê·¥˜1Ja^62 3<Ì·yF)ǐ̂%µ²âÝdúôøúüȂßÀóÜß~¡­L/!kÀ©äÙ¥,˜³¶¢™¹•I,WN¬«`ޝ÷»¬HJì%’’8mÉØ¥å*mö@Ëãf`¥Ì/Äím9–\gE)æBd*óëæ¹¥(¥€¤‹=­}E)ÄAÔY1!fj£ QÑàÈÆq;J±ÏŸ üýIÉÍhՖ°Ñ¼j-ºMe낸л„nDôû¯iašªð´%¥¨8B‰g¦ÈRJp²JÌ<â۔”¢j8>ö%°„Êwlý$’Ræô@R‰X/¿çÓèKáÛî¹ì.åº7²Rzxÿ›žÇex­’R¦”ä5ÍÚډ%ÉKãŒ4¡åŒ kuz$9ìʽÕ7’c ,a@æb? 9)eyÅ)H]:A=šÓ´º§„6éÒÓÝȤ”b;«w0Ó´!MJÞlÁ峫ϟ¤”´,¸†L‘ u›¸Bø±ŒR0¥ì®X9ˆ9FJ7=þÉÙßD›Õ9w=cH½±KR€ ™Õ9€ŽÌÆ{»Qe'H•›9E7Ý,zI–Üo€)ç;Øì æp’,Ž¶C·ý⣁Ç(e+„ì)«ÊFH*BøMô=4ð>Jáڀ?."Õæ¥<–=îÂyç(ŊeFŠ[ IðåÐ +§ñÎc¤”.,mxF‹éXJ)eº +:ìWBv+#”‡úªz’„QÃÈ.—§[_i¦ê¶ PŠ6dê}XL"R.¦´c +wPŠÆ{XÚ©Ú6‚R<H ?gJ±éC®ï¥q/Œ®C)ÃÈYJ×Û®êP + ]OsÍâPŠô¡¥‰~8”¢¬lzì7Ä$C)t\´cºî/?”‚”g)‡épQ +E^ ©c +ÇâًR¤ý‹C(Ħ-#¤¢é%×Ü|ˆX¢(…Ṻh1; \‹Rj¶mPPK볎,H” `HšÄMÇ÷Ö#C”bðs¯U(;‰R,6ôÖCå…(û<.j>b¥° ‰AߒE”" )»º¢Ô¢ÀmÆê1.@¡lÿ€(ÅåîväR°×£¡ã]O”RÅÛg¹”\uD)wEðãWÛbˆRø¡K^”¢8»\àT”H¨¢"¦À+ží‘P”âØ<.áð¢¡Úr¼|3ôŽRÂB°¤qU_ r8Jy é„äƒ +Jä>stream +ÔD×L153Š ]Ù`Ô ° ˜hæfN5¸À—ïõÑ\ôÊK&4eØÉ1}ό %Ìe=È¢€íÊ_ÑkeÝEÝJ[ل[=¥Â1ØV—28Cð˳ªú­3¶²õZÙÅDk5ÅTÁÌÈ 'nÔjãÒ´:ùo7¶^Z¹mã!Z 2Ý.QBš.ֆœ¦\¤pÙ6 +—N%ºåP ›K²Eõ¾N-µÑ®-ÍÔ­ÁI³,.kŒ,‚uu&‰åÆZՅK75ñÊâ¦!¹¢7µ²U±bµ­² 6©²"@¥âƒE?”é’HeJH'@O+E¹ÒFʕ [“W·ô*Ë +0÷ª YÁzG¢ŸÞ0 Ø+°Ú8 Vl’ : ŒÒø­ª/JÅ*Ä ,Ž<ÿaàÔ[e|/$(/œjò ÆH +L¶™k—¸ü~«ÞÙì[vª¶JB’µê×3 +¨V­£ÖHHÂ$o~íx:1 1¸L­:±íý_Ъ‘Tͧ’%1ȦVu·“¢VÁôö¯4‡Á—«œøÆÏ*³ÃLYaþ£ëC G†i·}³Dén4Lì “ˆˆÎ=Ï»è| šeùXŒïTt)”ï‚‘r~^§ðŸ¯(@´µÞ`Qj.lz83âÝýžàځ,´dÅQé  ®ò.Á²¢GH£¡ÏÍ<˜E.uk$üŸ½½jï13Ð÷3TÄì~éê%Àa‘.‰õ½ÒjŒzaŠ3‡<8äj¸ÏJŠd6DÕ-” ¶§¨‹›ì놝b`ãAÚ9º ­¢7$RÈwð-˜lGÆQÙɕ'Ýëk ØiÎ>u˜ÐÀ@Á¤\Z“0¥Ëgdt8»ŽžèÁÔÜnÐKÏü¡óæ2¿.Ÿâë¢ï¦¾( yû„•š`i†×˜oÞXú(™t8‹­ƒ4Ø _Éðèý#(7=—ÑyÀÈGæd…Ô¶ª%o"AŸàE$£Üél<0Ü€ ÑĂ´t٫ؽ„î ¬5#GB¨ãËÎP#‹ñóÂ1‹³¢‹…1 Dl¤Y„îÖ4ûÐ'e“TðޖxcMpõ¨7Α¯ò×n~Eß8­d\Æ#~˜ÿo<:µ«q˜ÜIoº7í¿ìÊZÙ­o඀Iäp<½PùrÎ"šp€ ߑ€c'¾¯[‚ãèñ,œŒ#)¦}%÷wK_ßÁq9hõÞÆː½õw×Å\‹™† é•ZÎx Ð&J§ _읱 XÓ¸t¾½ŠÉÁ{wëœ1Wa&ãÎxTâíÓl_×n† ®*^?#˜i3„Õ1¹P帝±«ñX-kÞ­}zÏ+ÿù­™Éª‰q¡m¬®î¿ÝCÄ~à!í#£ûʉ6TÙmþߎÊ&C‰6ƒÕ-(Úúq‹¶Ÿ/*6ÏË$ÓÙq‹ö{¾ ¤å2m”Øí=YWFÎA%L׺•ï +Ž¶-¯ +S5ÚD]r’A[t]¢sV¸mzUøH¥g«‡öEÛz6¸%eœ~¦%s*Ðì“5Ê8¹ôo!7£ Íæ«Cl4ͮˠVë÷zš=Q”Ô›Ãaš¡šæ’³ù9E*’¬ÇÐlÇNF»Ê–šý¶{pôMhö‡Êɑ5Í)Ø$_ˆåóe¿Ó)B³¹L™}Ñl«I)eþÆí™íCÎÔvfË +%IáñÌF5Ï &ígv,àµÄ7ufëßõR7 D<³ÿ™Û½å3{ŸG$X„S 3 ©.ÝC´JÝc žy¯‚C@kÝ[È µ"¢®ÅÕ8Á¯Ñ³($S8‰™Œ&8¾ IÜkîµN ^jAN:¿Á Zçۃ„lxc‡ +–Üэt€º× á4‚Ãî)N'æ±9xÉ­{‚x)vP†ÓsÍó_'¹?Ø÷°~®úùûâ»ÇÞÛ¸‘u-›#†‡«Ó2¢4dHöÞbù­$ÜCàƒŽ6Ü”íh÷ÙÂ$à6`r¡ì {£„Óùhžnj[Y¡ÎàÊ0Ä$Yéx£áÐtq‰Èô=!…_J è—æ˜96*!@M˜ õS=õâ)g5;fºMË9Û(ˆ˜u¦‹«&;Û’²õœu¬Íüö¨jÚ߶Jþ{›M«ç)f%øÎõ<OTÄG/OC5>ô—ÊÔøÙcâô‡q2ZA S5ŽNÀlxóŠ†ì~<—mÇÔBíÉÊAìÑ7D©¡ó¡“2˜bz^ŽòÌi=9¾ÉtQ1ÉÀÉ^zU¿$†%°Kí?h»Z«Hö«Ãÿʸ¹gý{™ô9ÁŠ7R0¶çd40,u*I$£û<Ø¥HâòßãØÇþ…—÷º»ŠÓà +;§Bá€Ð9÷³›(1O³.ÍI€ P+jVÝ_ԉ]¶-~¼ÇŒœ’ÿí?bÖ,O(ç×ìe*î³ÎäBþAùÀ8ëǘa0t»!ÀˆM.bµ*ã'^æeWRµÛ÷È6|£àôì¡è`nßm?ØÚV4ª!¥’ìÊ)VЫ-ò+Œëö|…sîL (Ùü`Àx|<¨r\즜u1€1F)EU2…¦áxùNÿõ"¯A©Ø>‹vÈ-tj"ï‡>íÀÌ|æ‚ÌZJ°Ña¡ÞžӚèïZèt9/ùqYT½.âëd+eâB'GaÓ½—„Ñ#|(Fbtþ°àË ÎÏb [ +_$±Ø­HÁ} ŒŠêº¹¾\ÈP½ŠºCRÉxYƒ0zî‘E{±ÝórbbӆB¹²M·(ùÝ85m+§Ú$­X¤0gQjÇQì£èîšTŅÊÁ©4fD +±¨<{ÀÈ ~Å\—dÞZØK¶`¢P +%™Öó'£‚S1¬ÂÇÊñM¼Ã¬±Ó8´j ¾­Ÿ&l êK.i©ZȍIÖ1¦è»–\7°eqðšÍ5¤{xjàÀ¦è5`¦¿WŽHþ«†JÚ,E àIÎeŸHÖÜ¿ìœïÀ‡Yf*֝2VBê“3›ŸÔŠ}ê- ƒjpå €Ç>0s`‚±¡.|Zðxz™ì¦ƒf#Âç1­ +6:¢.g­4^ÖªïaÁeˆ›|NÆ Ù%{@’M‡DšNv%ä#¡¼¡HáB]Þã™ê¢ÉêìH¥" +êu9u4‚"‰†ÿÕÖ!\øÝZè¦ÆÇ ® îÝÝ\+ 4÷®‹€¿—Ñyj>'v: +"PI.½âÍê@Kï# w»Þ³•&Ò0-óBtË3½SŽ;P`õ2­Š!sÐlpqm$jÙ}=õ}À“]@4¨÷SgÜïàå§îAoÌú¸¼%d9´Éã¢íÿ?f‡ƒ'CøËG¨kÿ»¬—ÛsnL“dýK'6¹ì‡ÒÎ,ÊîÏuç^Œ†ªzó)véîR"S0˜tWh´“%PóˆìkÊS<¶gœ>œ±)¤éŠ˜.ˆØ*X*- ›Ù„hÊô)UCŽíw@G?Ÿ`ÆçÉW<+®S½¦=¢+ñê` ”Ê®ƒ#t/èºúÓmrxä2b…ÇÜð¡”nŠ¼ ¤ݕ.e4Ôib˜ ‘Íz{l?‰§iX'ámEڅf'+¤z§¶ 8èe©Ç˜œ+¹ü¨ U-ép€LuÑüª:T¬sU§êÐfZ$˼Ê8ÎR)qCIÝZµ©pÔ¹)u`¢60dã…*…;FÊ\a(¨ê<*ˆH$¯#*:gM!–¤M_3Bͤis&SÃ𢌪ìí.ðÍL…WÁ7¯§,ƒ®Fü „=y~IpÌáG–I>‹ƒjœ÷Ñ ^©hÇJää¥mÀ$éd4àJŠq±Zð°!p„`Á%Ú@Š ±ÂuÑ¡û æ7ª…´T@yï \àŠ(©££”žx£Õ€n˜{↔YEd÷K¤±¥æ>Q$Vžà<²lâétí¦ÜuZ[Ž2³‡UûNm‰8a»¾w©ÐÅNJ=TéÇòFuÖ¦Øßy`qAìê¢Ö¢ œY<[Ð—kBùU^`ï>ë]žË©`v´Ž8ahº›×Ô ´ý#Y†{|¡aß(&´݇SÙè«&Ê PWV÷ñ;‘pU•J–ÈE€qé}^ÿ’ÇÓE7œ̘a#.üŠäE¢”ÂWy6“^¡ÏDFÇúÁf©²Œ}‹CØ©xŠ×¶PD‘ÖR¹D‡qO`ã憎™O +Qª/’®G<\Ìýb5Bͅ.<;\”¬ãC: +•Ü +&kå♈{cRx¡>ë£Opl@{]@ª„Y[k­ÔÆ7M³’õ ö!qd„H¹m‘ÆÆ¢P]F›b¸t:Kÿ¿{ZEëD7pá{¹: p¨'ó7ƒ7¨ +Ysg$WË}òM±Cª¤ӕˆÀ$šÇç.*uLR]Yê[•&°'e2»¬‚Dn( ô°MúQ0;ì­ÈjV6Ùån"’¿Ÿ…|˜„y‚w;šh)?:ê'›Â³*S£ÞÅð;qC€0øé;@‹Ÿ¥†·"~(@óŠ+xÜ©÷`[Ââ‹PӝTˆ‘£`úg[‰°o ‹o,°s‘³Z=sïZgSSo%{HõBi½ÿ‘EκåÁ²‹—2¿Ë)߉Qâ‹âG ÐtOYÄ¿°}ùÀ6ÅP—þ£»=G@²}•ŒjO™,´y¹õ¿P¸î6¹]SᤫÅSï®wœëÔaG† Ç·F‡&áߘX¢F¥v”¶(-€ªí˜dO+¦À„‘¹» E†A\ð]Y!àd!€u ÝõP:A/bZ~L?ø š‡ fÌÏQϨk¬î{ùÐÁ®0.­0Å×:n9å[B.I B¹ÌÁ¸ª þñ ÆUm«’o^¯ØÉ¿¼Ö{ÐÒþ¦G®¸¦dœÁyLÍA%«DÞ¬Xql{OÆ ,IÞø ÞË>äÁØ*”믇\Mx€Ë]”ŸÄh¶« þü ȨÈúu”<1‘ÄÃ\­ä“õiÛuE2ä5ªWÞÚ²Mküš_Õ(m^0¸5í.1Ù±߾h¾ã'eÀ~[õú¼Ÿf{;¡4,ú3L§F]¾9PÇá7˜ÜÇJ +„ÀµêÜk‚p“jÎâän¦¬‡-ídØY¬iðãáWØ3—³€Èa8®…Ú(ŠBðóã„ï^÷]J¥DÙ<ˆÁÌÖ$Â¥WWe|[Ù B‚õ(2Aí9ñqÑø=†a5Õ2¾Ã;Yh¦¬¨£®ÚâÇÄ&wªjœ¾aI¶r…Ô'S>-YýÙž¡N^¾LJ¯*Ō1Èm4(XÑƜœ«›‹»-O#0Ãð½IÀ©ë$ùiLß}Á=>C™´ÿŠèD +‡ Õª üž°Z‚ˆÝÁS¯ex÷éûOðìÏû‚˜A© +ivªyÌ5ˆ‘ãt# _ÌÁRÅWjï9ÿê£Ã73T˜6ƒwv1¢ö´ E›•X$ ©ŸS¥ ÂqÜnˆ(6±ÊÛ¤é¤%@O‰ŽLÒ;/HOT™AFò3ÛÝHiÅVCçïl¿C%Ì7#«†{*Í¢fžaŠ×èkî.Hê%Ü ¸ªœä”‹ÉFݟÉېAÂÄ,<6í£Å ¢N„"€¸ÂùRA-ù4Ä5⧄n ÒÀçxÜ6 Ïm¾®bE HÐa‚ېx2àtj¸ e0ì®!]gaù-£szØW”G…ÛžTEÚ©ârÕ=÷)‡D¼¤€Æóίgª@ºm.gÚkjLª,±AÔßõq6 =¡º³³ÇB˜­|œ×ü˜Ž®Ž±!"©*ñÀ}úÂ/¾c<¸%(“8/8ÇJc^]äDk)´°A`{šäW©²S¼+ãâ=Dá©TÏ06Âîüs4&²ðæ+óÇ +H å°8«k‡âYº¼Xñą4wÅD¯7ˆÀ«3-þ +‡IJ¦p|.õü ¹ #óü¼'S¦Lmô ‹š¾- Öíò‹c^©z4)ìÍ6's„³þ±ÁS {ÛfrZƒÓÅ­SsŽF{N®Éò_b^`ÇYûʉ{ã-æÁÝRaAI”—Œ\“œv…ïUŸñ>Ï°]Ô8^B΋ro°Úþshb¡*áV˜¤qÕèöØ ShŠº^æšâ¶fv‹Æ"»!÷D¤·íÜwñ‡ó¢tÑ>n7á€wè@ï:´·þ:d˜È¹¢°¡–µÝÅî¿N8§C¾~…–•tV—5Þô®?ý-Õ(GyNºœ4}H(Ë PˆN_ƕGìó5 R°(󚶞šXã>á=®Â„T×'–¥‰F}4Ò+kO¿Í ǵªê`‘–#)³dQH@ À\ÛÏVAûR°íg¶mÿ;óNú×]0ñ†JªwŪ|Jrʙë¢2¤ÿGKV°öÓSÆ ÿ÷´\C…ƒd!6¸8ã@j9:^vÐI¬¦A¨²—oÁ£‘Ce +‹ZmÐÍóÐÛ¸®RX¿dR­gк´íX">LúÉ·‰ÅÝñ€F^€:l4 Åî´Î—>Oá C; TGjíV‚)/ŒayqàhŽ +—mÅ¡Žq¸ô…^f×O ~¹Â*¯"eëxsd,mPRò²op–¥å{9 +fˆ€Ö²fê à„í£SΝÌò“é?ºS~¼šú ·ygœRqb¸'¶Íû©d˜Ò¤¨$°S¨»«lØ =ÀöXó6»¡ÝBâ˸­çyrÚÞlç9 ‘‡¤¶ÚœiÙ,Íào_s ¨"ZE M©vR³ùÉÚ};ñ•w Goׂ·õ×+;”Â#u G ø›ÒOÞ¯‚QF´,P +Î"æ$¤!hg—î{ôl»O¡ëë¸DYh±ƒ+Ð逛ÂÆ|¿ +2vÜ1'2ݕr¤@c~]÷髈€;ÿ©Ù#`:ÎA-‡Õòé¥KzÜՐó÷·5/¶W]>݃TºLy<]֡ȘÂí‘ý䇿kl†ÂéQR\ÓìtÃ1²:s4¢Ë§&÷€tGZÿ¡.è-uµèèX¢™cêø%•¼NAððF¹!÷ +Q`[¥êh¢•Åfªü#ã²oüºúR^9øÿ¾çöy5u­[iãÀXrÚ%ÎQ±ž÷4òK°&qgdÊ0zG>– +‰ñûۂ"G¯W @ž>ýÃȍß~Xô‘Û]ÝkÜüÉàã@ₑc)¯ù’\ýDZñk…¶Ü/7Lm8ýÑ^r4ÑLco$¤nÉ9Dâš8®{÷R‚$#DZK¢‹üBn>iq\µM$@ j͍§¦p|ĉÙý›:Ç ç)©¤ì÷ÚÇaåLoÙ-9ÜÐ÷_ê :uãQRT%Žî|/”¸o´"cn—$.†wª–Ä=)CaߓÄ•"—eM³ï'ë^m¿R»—ç/|ƒÆAˆ$\):›ü’»w׈ē sŒm:~¤‚É=Bw±,¹Z/ß"ñ83³åÄÑø¤8Oü‹È‹Ç@–‡ Å՞C.¤úš.O&|WÎMüšBÙ5Ê«*¨§…œÓC5ÉqU“¬ÓBqQ͏Ò#Q͏ÒB"2va®z?Jú(F­ÿ°Å?œØ‹pû<ÒÔK)b‘šËî/tOB‰é+l·žåô5i{/™ ¡Gzê/d´u‹K/#õ,©ÌI}™Tb|†¦r3U3èILã©&DÑDŸ¿9ÏhçYLMÔ)Õõ§8R_¦%Å4nd|£-ò­Ô¬òŒJyFÅ—g”L2¾N=ZëÙ½•†”¢–²xÒ=ŠÓt$^j)¾VDhÌÅi*ä„#’ˆRÔIZñqWUŠ”P¦äSB¿.SQ—ÑL¼^¡–4ÁwõÊ;ÚrÊ|¯ÔGă攻HÈè‡HCS撌ěHb¨²gÕ²ÂÆâ9Yy¬¨Cü(.fŽ3“2X\ݗˆ}U¹J×Ó~ôUz{•.£Ÿ`T¢–™¬šÚKî9lš>aû¯™suót¾[bœÛsmO¼FŸWxÞ#îÅüËÿ;üÏýëÝöf5TU¯›ˆ÷Ý+³Œ+"?^ҙm]-‡x–3±DQ,Þ«õ^- ‰Ü屮z2[Uò˜Ñ/’‹0‰ôŽ,*ÓQxŠvポ!Æl<×êÊñ[wb+:¬Ùâît‰¸í“•*"ñ‡$ì¤Rnµò9ÖL‚lDÇ+VæAÝæ²u4oßQŒæ;g)!ÖfZŸ:F­ÊÈ]$C}éÄѧ!½›šmnÈëë7‘7*êr†«¢éCÈUT\ž(¥yŒR°R:!1®L¹ž”§§ãÍû ' qe*£ÉKõ4ÉR$²ßð­R½Îô³‰fÔZðAßÅÇ¥R®‡^í‰ç£ª¸°Ï‘Qôk|Ä;äçי| vFÄËZ᠙½äš‹fä¬ǸâÚ$Â!sšŠ €È¦¡†j~–hk;—ÍE–KŠFÛî<ìQ(73B:é9E³4ú‡D¹´§åX£éOK~¨"Ø:vxE#›ü =XУ‘RJïú¾y\EõJˆŸ`U‰}ps]f4Þ("59]‚1¾Œtš”Ê_½hIҍ) «NŸ‰’ª*TŸè֍cdœE±~Zj¶Lג uÄyÒó>ËV2guÜæt¸ÄŸ‰2§Y*l™oÆˤ„H,B2£Ô¬r¡ÕŒä¬™LÐiӎ£&«Eòńf›©H3ò!âb4ÑMÐ|ÑÑÌ®J8·æ®sÖçý殛Gçgbg#ŸYÍh³0±N…bL¹óôRÄÈ*‚E¢KuèX“V˜QèBµjJ¨jU²Ñ¡Çai QS*4TNÁ²`xÄbñMb9Ɗ(’¸5“„1B) y¢åª¨•çáDª(UÕ©dVS "tëô“h»k8çќºrn)eZ ¡™i}‚Çãñ„ ew(›(ˆ]µr-·áªùüaþ×ä{IêþߍÓŇA÷jDßÄ›ÓȦgnzDì3=Fž“21¯Ñ¹-FzÄFZlôœ/NØlaãŸÂÕªˆ4dÆAF&ÈȌϊˆiUARŸ5»±ÈchnтÂq +Ò92ÈVÞ®hbº.êHÊûš¼eH<S‰S¾sÛÅ!ï|ÿd¨¬Y—ä;ÞVlxJnö …dkzq}HhÄWb4A¦žCõäú"ÜÅ⇌TtëDݐ¨SüÑøÒH$¦GTäÇ_“‡kA#ÉrÝò(ڜü[΢ÑJ£NyÒ!îääìl<š&“[¾¢Q+H«!{„4ÏÉ«ƒ½¡Ìƒ³ ¥¯6!ÀH @’Ì„ÎÌ̇ÂÌÌFz¡QT”낁yûpBïlôNQg¢5‡ˆ'%4S)Fïù…¹Î|íøùQ›4b¯¶Y…óš×*Ói'Cª˜ãR!g:SF½"«ù†“ùp\mæ՜›‡Ü½ íåzøjÌÍD'gWÌý?IlH(ÈA5(KfRņ޲¥µ¥Ë,¦¥GWݸ$±šÂb6}‹¸;E'¢NøDg8Cÿüo =DSÄv‘9(/—–yLWk‰Xæí<÷N›Ò*Ÿ¿I¿™S“Å؟!Å4N_óqˆ4fÇNÄ÷èM ÑøÉT.?¼HéÓzdY« +©œ(Ú¼ZÈbx:ššTEi²†¼í–Ç iµI +G»iýR“&MBé £tƒD!¦…¬Â|ç1YVNî‡Î¾¥PÔÄIѸó³$B|¡ÌÅcߚ}ۈ8!Ҋj£¨=("hu9ƒu~ü‹ZɤØââ^LÑä[5ñŒUÙG9ã1nˆf”â( +qãp9”i-üμ3Ô9)CD1&mæöhšŠ»¾‘FTjhãÆÐg^”MM½¶!wl¢KˆH|£™Þ!Ÿ A^ÇnÆX=n}×­A¯^¬ål­HæZåÆåÆåÔ*ÖÎRé#ᙜ{¤ÔT çœP(,IX—ÒJGÅÉÌÎJ;ÓÙJJMÿj¥ûZ”‰¸FûbDµV¯S¢ ;¢ KV«²æñ•Rtb¶-aϪɪòR墋^†­ yòrÚm‡SãK‹©®{¯Fj¿?tZ<®~{L™þžf©9¦¾ú®?>mÝeeÑ**£ætêœHT›ÊCB¯HC±¸l~þ¹uYÓ¥¨#41{…ï\T‰Åbb1óH«Ø¤5úü[™®>·Þ7·ßI£Ø©8Å*҅CŽ~e]JŽ)Ã8©B„ ÎeI)õ³c¬#;M›Da£$¿Ê*³n3¶.tBÄ`”_é¬ ‹d”s,)k?>ڏ߆±zd'iÑdÒzSî«x¦ig»Á’/’¢%MeÂ$MÙ|³ÒAGGŽ2‰"þ˜AUµªÕ¶úµ`?Qº§£‚²ehϱ²#oÐՊN+h%‘Vp:¢VÜÕ഍™7!~ÆóF+™¼Q;è…Î]Q—j¼j2H’áF“}›b˜ª©š¢”§Š2UÄjÐGh$kñ©¢|ņ¨Öf±˜Í­Š ©_Š¬4"bd‰½Ӊ˜äT­Æ÷Xܙ2…P…6B¦ ï +ʌ®š¤Év9¥~ˆdÊjq9ÍÍPxÒ­+ᶥֽˆZ)“}d³"C‘‘ÍçÝØŒ;r¹>YAäœSŸÈiúøZÿ!+Z2¥à…Q! +¢°«éIA~_ÇzT×Ⱦ¤TÛWÇ|™ù¸Zc´šÙ¥:ûjd<9 +ù¡’ž•W|‰h­‡2í‡"Ãq "­çpý¬5kƒV {ùm%‰Ã ’/"ÛÎP?ýG ¶¢Ñ[âNGÃSzÖ!Ù!V‘;[½°§Mè4²d¢¨É-’T¶øš !)fnwq¾NâECó–ÆðE¬XL°Š8ÑÑYÄ9O&«HÜ-'"‰hÆP†q®ª\täJk­³ëIÇ£–Úñ.-yçJ#¶¬,º88$½98rZE9x¾c%ˆ4 +±H ƒB"¶Uµ51dó‡îªz.sü™!‹xô¡‰ǟ°stà(Ÿ…i·*ވC„*R©øǧeڍ‹’L•A‰ +—”Yêº$®·\ð©¨fÈEñ¢­æ(¹k3¥Œ{«…Ý-}$·Æ%R[LE =îÒ$=6­#…Ð4S%{p”™ ‘ƬÖ̼ÅŸU3öºØ‘}žxâxbñ$RQ"HRô#K¶ìغ¦è£x\[Ë Õö­\w„›‡¡¨á¸áf\Îî¨*ãJ,ë´ÁÎ[;›ÆT06 [Râ +’r©Hçн"µ§âbE +»¤‘8ž*°[¨tUGj³°Ð Báð¼jý»d"> †B1hdzB­ @„±Ö÷3´°I¼ð€ùǏ R‚(Uµ˜p‚ hD‹Y´¾*‡µý.ã/Cl­âië G¢[_±“`Ùúj¶ "PÆ1ŽæWìáAáÞÝÇùÔúÄòE¯4(Š{x0R?i}¯àáaBx€õ1üð@D¢¼d}–Á}›îŸ±¾×%ë{⿃`g}6z­ï¿îÀY­X;Jq*³>]¶Äí  ;ð~ûu09¶ΖZ±e}ý²:ðÙÝ.Œ:èOšf]"8¢ƒP+ 4d}lðx_AÖ×ꛃîK¢+ë£n6s@Mie—ô‘ʁ#ë/9À5 +9HasÈ ŒƒµãÄÁ¥kâ õ:$BR8ðž,8Ø}N!ç2Üù ;|áxÞ`ÌMp…wƒW»º;37Xé.78má½ŸÛ |8ló8mpf}=˜)&ëZé+¤0ÆÒu°ÁÚ©×àrÅ5Èd}%£5pÆÇyY_rÿoÔG¶+ë³èÕÀjjUƒ¶©Áàj ËúNÑiðÆ4¸é°¼|ҀïíÑ ´*Dñ D ­Ï[Ÿñˆ"πý­Î@²Â$Vl¸¦Ð ôc­cNkÆ ëe ÒútZøY_©U‚§(ƒ›=”3a2Hu ¡õÑrd Y>l(d€ÇÌÇÀøÒ1¸ûÎ1˜˜Õ{ƒ|D5´>‹b=1È 1pûú0¾߄…A«9 9ë³­Á #[¾µƒ›ëæÀ`õß/8ís_˜Ú$òƳ>¡·¾Ÿ6±ö‚½ÀuÖ'yÔ¤SÃßÐvØYŸ¬ÖÀjVæ¤ ðÏæ‚iOrA€CqAjÖgeà‚ú¶H38 +oÁêžHŠfQTó³¾aw ÐúÚñX÷Z?×ô…Q 3PނåjƒÃ[ãûÌèiµ>K^{œ·àÆ´¾¡Ö÷z F[“Òª·À=ñ,·×úÇÜ;‰u¬ÙýiŒ;ŽÔØúToLìª;_ ³Ì·¾ï‰M„=U ××BU ÞúfIô4¡âúÞTo¹ŠDUPOo^.{lâÖ'sáúþK¼yýzn}üSC¤­¯–TÁú·ÝO©‚¨Îa“åAy¤%ˆ¦ +’ŸÃfÑ UA4 ¾õ"ç Ø¶¾™bª`ñCð'j}oëÖËs >U@ºÞgȅßú6ÁUA2< ®¯.Plëãg|>U7½Îó>UÿÖç@Uv­åoë+HUà5Ç[S jà**ö3 °h©y;*øê*Hš $‚.hèÖ7ÙSàŸè)XVœç)`œ‰÷Ùԭω~ð„àúV‰YH2Ý)èºõ-åÙmIÎõq²$ôØ,Dð$ççý'¹ƒ‘#Œ×WC†ÞPZ…3Á(âî½>Íæ_ÎS€pi_ߍÀ__»žW?£Ît2•.‘öí3 +m>Í>oì“Ðn~ +Ò& SA2äOÁ¶û)Èp÷)€~Ø7fìk.¾÷ ûv²F?hŽ +ûXúÏ=ì›ñ)@.ì+ÎøÜ!+ë Iûлˆ+òS w®wdy…}Õ©ä % ìOAô T'›R37 +ˆ÷Î~ûʂ‰œóð1T0ö}Oç‚}U- Øȝ‚£aáhí ‡oZo’¥Må_Ÿè¶öeÚ@æ$ž"üúF‰%WλW;Jꔂ÷¯»’‚æ×ã6HAìû2‚}‹=<ĵ÷¸s!Æ/HÁª‹\½ ¶˜|HòÑcWÁÐd›¾x±ý²£ #‚¢À~þPðä康!›‰@¸°¯M`Z( Qw5B9È ¿Ppª%Íp˜AÔ †, ë«BA“£Î˜B÷ÄLÉoN@¿ô¤öµå¨`ß4=o€'À}¾N`®&ÑH} ㌤µkÖBï}@›ÚÆ»5Á]`ŸMšÀñë[6(|} •LpAË«ÓÈä 2ÁÜ×Gû0Ááê—`ÛÖ%˜^¶a~}ÝXá×J0™G%°òA%H|}Ó£% J£Ïg À5¢/Q‚äÜëãåI3 C%î¾>:$aÅHø•VLÁ^«Gp¢dG`ÞÆüµìêõ±àо½¾côÅ+ÍIFð‰QAlZFÜôo9Žzäï)‚wÏÁè¯DóúJňÀŸc"ò*ˆ '¯O‡€Ø Aà½>$1UΈÖHüú43ˆ¢DþTÏ÷;‚>a£ÏÁྠ+Ü°oø@úÁ@°è}@ûú ð;´ºûTkà?€öQódÓQýÀ?†çe +?@ÑóñØF^§ý‚}ÍQéÏ4I ‚×òøPÈÙè§z@lH*8Eö²¸<# XN “qú”ßYÄÝ" +¡}ã•^Ñî¬ÿR? u€î!é€ÛñõÕ耖]f|}Dnˆ£Ëa(9 Öæ8PX {…¢¿>ý€8°¯ˆoÀ‘ün` ´¥Rš°ÞÝ^?E,m4€ñÜ5ìš5¯À>±‹€Ëâ6H(ìR$Ša À˜öñuéÞTYñ=_ÑÏÀXï;È)Á1P>dv:Æ ¸&-Ée©°$ɀ¤«!ŽÔaß2/pML „þ½Ãξ™Â@ì{.ptîù°Ï¾€Y?/ %اz@üÕ`Ÿ±ÌS5&qÓ±[ Ûe ÀÝ-ŋ,NBÀ>ãeÄýXà‹¿aké+Мt’}†× +„À¾G¬€“%±”U@ل*4ØW©€öí~ +öíÛèþƒZ +Ê2")p9싰Q ‘®—( †ø¦Ä>®{{ŸM×°%V±oÞM ]2@MÀ¬(Ë&}¾«0ÿ‹¥M苗#_žJêþ#}“§9HçG ÂÆ0^iîÚ`çŠ@á‰Af”EB.¬þ£zêCàè-!T8‡, O&7<@€ý«?`à”¼é’ˆ}Žàêá”(,È°p/¡|;ÇRˆ}­ïŸ4²vÀ±Í:À\G,kÍ‹ýÈ©‡8 Yìsð7 ª„6»ûŠ„¹ ½èbß1eäÅZ“k€ äÿIýû +; ÷°ˆ}ü2á ø°¯ë "ì[Yb‘†bžç…• ö8w¯ ŠpPìkï`ßñ5r‚x×ø¾; +€c!3bÆá¥è#4`1ØG~@ ÅSRF’r°yyO…}Gq؇Àð&ö]6¾¨ Œß @¾6ä–0"ï8Õ»Hþ½»h¡Í€%çf€¢ÏgGŸg‚‡}8n”rè?:µ³F6t΄Ø÷$°0‚\a8²î˜’õ(#fè>/ãXÐ7ÈÃfÀ®YûnðÚ 0ךk̀‹8Œ ?²Ø7ÉCäM±…ÐEF†ˆûÆ[3À/àÐG›yľÆ͕¯Í€ÃnàùIÄ۟ó‰4ìSøùhúQ§–Û(ÑMù…Àž2;CE]Un ˆÅœG£-®rŽ€PôXµSـˆ²:/yQ¨î7œuׅrMÓ#àFõƒHXd :[%ª˜tâ^@oæ‰,BŠîæ£eê·|օQ/‘ ã$ÞôO=˜ÒRe5h„ÃVöºr5K€—Ú†” p>ÎÃah$X ¡CDC?ΟÝJŸQЈ¼Ú©BT¢Û:ÜÓþ¼é¼$úà¢gÃ@{>“vœ–BR9¢h+“³è¯»m.Ñm¹IJ/ž´d’äȂN5üªà›Šá_ÆÀSpS¶¨äÞVΆd¬MÃ=*Úï`ó-Ál} üÌ#5ðûLr=²I4#Óõ÷¹Hè’nÁz¯ÃC”ën^dªP¤€¼çþ¤¯”A™lÝ^ ¥|fÌjÙ¬ø+>ã˄M×n@75,´æfª" Àì}6ç­ï(p:K9;xãr@|ŒÄ0^£Y¬˜!¹ƒx2C‘¯w ×‚A,tcØ6Ø"\“4 ‰B f Ø´±‰Ø%4®`nä`[[<@0ÎçÖ);)øG.V÷yk†P%>ÀuUœLv|zjšÝ…ß +Òf$9”eüËñfÀà":Oþt4àL„I:<À_›øÿë$~±ÿOé¢4¼sƒåÿ­:Pª¨Mü¿°?ÔUŸuôÿ 0WÁB;rø¬X%“ˆ@‹$C[³ˆÌþ§Xˆÿ»¤õÊÀî>:ýÌ#ÄtאýÿË¥p¡J c¨“ WóK’³0ïöñ°»ÿ·ô?Yêã¦B5RÜA;ÔK0w¢ Oņz©œµ—ÿ˜j‚ôì­mò;þãà.„jQ‰,ãžþƒ¬ÈV!Û´:Í÷/Ì®¨ òÎý+™Ú*kcò?Ñ%²È½_ºö¸†ý+D²MDŒZáë_éøÝ)iOÿRгös;àÂèŸgl ï¼Á"xÏÿ‡ê^P5¸´ÍÿBÞJk% +Q?\ù—+°ÕeCÀEþ™¼OÖMt8ãÙ?O"Iz;â¿Ô"øƒfy«²„X×¹2zzðoG‚¯6*Sâ{ÿ°ÌÑHѼB_dÌÝË,‡f ‹¦zAz›³cæqûƒ®»êՕx>¤Mû×f'WûÔ¶–è~eYÎÙ§q‰y©ÐPÚÆ(9TQ | …¼·$Ò?ôÁRٟ<嫽 ;"cÒ¼ív‰Êþs¨g¹Å¦²¿¨RaïÁ’­ìÏPfÁtYŒg 3¨‹ÌéoB)û£jˆ§‹¥“-D¼Ð‹dÿÂóݞ¿i÷bî4ªñç›8GÙ¿oËèʪo†vÑ»y`\9½YšÙfœ‡¼(žìßi§ëVg« ][žìﶒГýÝÓÕÏ~®DÉ+Èþn1Cíüº°xjêBö/~¾`-Ò¼ÝÀ+â°Ùÿõ ȉÈþb—¸>ׇêýŸ}iƒnœÐý +CûaŽ=u×ýø“ÆçGéêíý+3Ð9"ÕPçã¢õàÊÞÄ&)š@ö/[‘ƸøR ”‘ýù);ŸÇõ²)/#ûÛµÁœª‘ýCÑ>'Q^ü²ÿ´l”’ÒI¥ˆÝžüDög÷RÛi̐³Möù>tQ7="ð¿šóÙ_CބB7ï;WehS×È¡œÓç :Ù@„ìϾÔ1éxëZ’Ÿò{Ð4CdZ×ûBCöÿ)s òyªÅd‚HݾȎ¬8“%Èþ_Ú4ëc^ȶîˆEý¯ôùË >|h¶³&Çþ&vՔ¢Œ˜Æl÷xû3ñ6j¾†ßýØ_f@þ>Ü*;ý•°± +žJ§ÃVìÿí±”bV¼Ì‰¦Ã"÷Ó$lØI‰†Ó"ª¿ØÂûÒ¨¦ŸlÑdµ$Íã¹ûwÜIçImtžØÿ¾_ˆ¡8lF”û§à*¸ã•)%tLc0wÓ[Äþ2H+ïscƒþžŒ€1¾(—¦”ü‚W Y"§š²ãŠâÄþÑ;nzv$ ±?۟ÉI”Äø§ðÚBJG­ØCä¤?ÿˆ2-:!:‚+GRì¿jyˆÖ(èO«S­€x4mò³ ‚ì‡Ô¬¢ú€fäâ(®Ø¿’A ®ãÃÊŸïøƒsìÿÜÚzª×šâٗGb3ÌuIچ/…ì?Øß/ìß¹¼ºœçH + eÄÉ7Ô£þßå`‡¨‰ìïŒTöiM1²±\_°bµN!l8¼IdÿîȾ'5"Ë,m Ù?}$ (dÿ¦Xì +¤­Z‰Ó‹ÛÖ?}-Df2åܚiÛ릎oµúƒcçãìt¬gF«¿Á–Oª)©ÿ· 0꟮Ï_"Qÿˆ%5ÆPƒYH‡úG A–Ÿ4žPÿ³/þÜ€˜þ›qD0Þ~°@n9ÐXZÔ¿(eÔÿšC^÷77o[xýŒÇ£þ†™J³RŽQÄ»ït™êÅ.Ñg먿­øWôÈsÙ|ê=FýA§æ L£Ÿzð¿BÖÎBã£þØ èޑ#¡þ¹a†qXóÔ"V*o-éÀ>¨¿@ôŸ2'ÔÿÇgÉÖ8ŒNqb¨núµ;?Ùð‚úsõ1É3©¥­§¾ Mhè€ú³KOºš` ԟš#-¾W‹ÇïP0 þð%&ãëï@¥ƒÀT@b!yæß+‡^+öÚÁQ6¥õ—ËÁº¸ÑJõ¿YyCÄԟõÅu’œçý°©ÖJ|¨ÿ=VgPG8Ô?ê>&¢QÿxvÒ|%퀓3Lì4A‡õ¿C°“šmÌõOï¶UÄÓÈ+Yâ º#DÔÿn ã£æ½¬62Òkx,#õJ3EÃĄ¦¨ÿjü™Ðäõ×¥úHî?˸ËQ [Ùµ4ݾÏ"â«[¶ýy¥†±w!ýÇø¨?¢. ( BY†èÓTƒÆ/{ÈwæýƒÁ,§$ A1ŸÛB†1Ü\r½×mœñYÏ]í‚Ÿ£þë•8Ú 8—íú%ꏆð³XAœÿS(A'_1-ê]T—…ªù\™Í$¡”¥„¥µ¨ñÔ>”"{Dý؁•ìoßo²Ch&­àõλþõ•¤»›¿½ªC1& ’ú£“!æ ‡<‡}RŸÔ0¦>øM!yYëí¶š±SÝÜñ/©ÅRêß«ÔÎOCR^ê#X„‡™‘x©?* 36Rí½ªF|©¿J9\È©"ßÇ¥þ$›3‘© ¸Ný£á/©>6;õ¹¡NdԊa¸¶bEGS'!ùKðr¹R9•Pcäš*Þ®µägê¡Ž”L O1)ètSn±"Ó§è`}Ú Ìð~ñ­Žåâà€ +ñÛ÷…²õ^éϞÒÿïÒQo2q}´å~Ñuظx¢èú ¸Ä¥ š{e–ô‘¿ÀóWÑxš{Xoþ‘;D5åÞÌÿ’‘^*Ôó-¨åú]—¿5û×»xŽ§ òǻެmÏ5ª´ä¯›»Ó£„-ðLÚ_…ü#UYÊ˵0O‰þÏñÿ¨€±±ë‡d’ü$º€ŠòòÔ»>‘Þ¯DcV$úòg~rŒˆºã_駿³~5ÆÐ(;žÙ¾ÿÈ7[>Ò¡!ã÷–QA¼ÜæÀJ:!$Þÿ¤øw4VFIüùµsúonâ_Èö³°ãð§–z¸Ò¼ð3ÿ]Ë1Xjó<¶„¿Áèè ƒŽäà?Œ‚c4Á¿iÿî‹ÆùíÂl +ü$È Ê—.mM° øS^/ö0í"T’¿_ÄÉm È,ã÷}þh‹³C‡¥ ¸ù>÷ô 6_»;«NîºÓϧ{Ÿlˆq:r[î8£ŸkéYƟ\¨¨üˆ©÷“ñžV²°å}×[§"º´ðþ`ã@Á¾€‰Ÿù|Mu¸¬Âî¼ðhW¯ÉŸî{TvsBaRMÛbç~æwšœO_3/å¾Ü —`ÓƸ¯.Äݵ¯N¸Ví{ðåÂ=öÐÞ~Zƾª MneD‡¢Þ{ñ¨¶o ngO(¬9lßÓ5Fª‘³3DE44Tê¼7–§}òï="uڟŸ-Ú÷D:!eZ#;¯ʳÆíCV÷[ŸÙ×ø‹—/ѹÊþQ§¥š ÙOàõØR;A „±J6Çé¾ËÀþK>/Aƒ,!4œûAß:ˆ$´^ÛÄÿÒ'j€õՄ«‡ý›¨|#mØ_&ÃNüsRE•¿÷Z´û" ÕécϤ*’«ªeú ľ]; w¸Ÿ#G°‘™­“ÁP¼ñBíÅ·­~1坄ˆ}T„Ã.ÊÒÇÐ4%ړIbûÆ´ªïÛÂuÿW°ÔóÙâHňý ‚¸bŸ2¶p;ŽÍ.ÕµbŸIõ·zæ‹û>zB¼Ù„Íéüå¼7 öM˜ÄAS/|q@ü´ú°ßñ½~•ÛÅeÎ^ñK>¢×?ð»Ç;^lÝ.vø¦+$ùma\½þÍû‰æ¼:¬Md×O`¯”±ÏÁá¨ëS‰½´Z„Þb:9êúö¡ž—–¬ë_=¦¼]—l€ö›¸¤Ud³>³LQÃ]ת\*Öõ‡é?³_©,=:–]ÿ!w̸h„E®¯ +ىZØBȲoë3øáš@é¶ç<ˆIëù󇼱öªU㝬ÿGµ8¾ªèV´1ë+qvI0Db0°>#GcìQ®³u¦«xëk‰—×=DÓ'`}ûw£€?¾­ckè¿ú-ÓYÿÎç˯¾Öbë¤UA«qÿêã>S·× ÕJ–$k~hœ2QB¢[‘(4‡£D©~/»»rÕqêÿßèÍûÆâOê£?¹øîw…EQ_° uIљøÖ@}t>¢ÐÑuxú¾Þµeïô19çQýN_Ø L#å9\XŒwú܈§Ï¨U› ÉÂ)¾Ó¯88QåcfÊñôùÆoÅ£{®Ê/ח%dÌ)r<}a[.ÿR§_Î4 6&ž‡§ïâ^d~ÔëûŒÐÊëPݸu #9ðk¨8þ¬§#¦¨”ˆsð÷ôۏ‚QÐæžþ‹€¦½H ¹§ORœíU¶7ÄqäqÜÓG†ið3¬…÷ôDz\bäÓß!¡7Ńä.ÌÌéߧ¾3Iehgœü¹ÏŸ) ­-gïjú“Ï:$D¸š>x” |Äw +v¹¤¦!Gí³lì—jú'(M'‘cP2¦ÇÚãQÓWyóq›¦~ƒÅKôÑÚ&oiOÓoVEc wLœS,øϬ«é_ùÔ³–©b  Ö—¬jú…VøéV6å.'` f*RÓO5Å>-ÍãÚÉNdQMß g}ÁÅ ³šþèÜ¹FÝ¿¦¯Oœ2´`2Б×ôé›q´dH#º±UŸ¾{T–¬ÎG·U”ˆoXxޟS¡>¿Ða®cF›¾ •‘`ݸ-7}6t¬+^¯qGRʕ´núuaà¦()¸A:¯uFgkïBósEoÓT=BâK`›>$Œ…!ì3ƽV›~½2!UÝôéX0M4núE#öYË'õÃ8Í#7}ïbzDèììtºì-ä?‰•¹Þôy€QÖhoËîjéMŸŽ>¢¦ò{WS¼…ý¦Oý;-]wòµxõî–œî´àá¦o)õÔ_ÅxÓ¯KºjPÑ¿PÞôG˜XhWÙéMŸËÏNºVӃ7}ߜþù¡O¥FZÜô-DËEÆË.Ó§%~Ä}@K`Õ66€ç¸P‹>dÍsßlZœY"k5FpéS1nò ‹)}uûcšU Tš¯’þóîԮݤÏñpÅ86[îˆûÁÑÏa`~L´-6ý_`L7&>øùDŸÛ¥¸‚‰îè'H;6úà_+"¹ +}½Ú8AD¡?šØÌ>ÈØeA?åb7ԅ;Ð×[[Žùùúuxh®§ˆú R—^ýã1l[CøçKœÛ9Ìõ¿ùÎGA°ú€·¨|ïÕËÞñ©Ã1£sþÜs)¦ïП,Οu]½¬]„_½*o¾úµù r´°º3›Oi{M½+ªæß# dÖõ¬Ðü?~"“È—‡?3ij‘KÀT„<æ‹û¢«ôml_#Ò1̟VùX˜ŸZô$iL Ɨÿu/ÑñaG>×RÅÝ°å¦q«å/)¶ë¾Yzt'nžUîä°ùß¼>Ã.¬üò»^€|›¾¯§ü›îY¦'n§AÍ(AµõòWÙ_Tšž|E€agM>e§ËÑË,$Hs%Ÿß!g[¯ÝªäÊ\´J¼’À|R–ñOÃF>·b*OK3‹>äÀyB^–óV5Èo&ã`Án¢?Ú¬˜OF6Tøéñ‘7©Mô:Är‰žîJpâG?!Ô`UšCl6¾â‰ñCÄ4~¢˜ù,#]qŒo¹_ø-Õb¥äc 3"¯Œ$öâÏXé6[¥Åo´ð¿ ô•·£hß­¸¤^CÙDñuÞ2ÑZ…]q&~{èlúÆ9$>íãƒképÑùˆ^Cüs¢ËÂÂهŸ¦…Ú<ÁÓáûx~]v˜Ö³†¼ßcD°d31üÏ£AC9X\U³ð›xQø™ÍɾÚ8fIøo©…£Ód;~ +Žx±)¬ßü¤—_¤xL¿à»o¡h¹êy|ªiü@2ñ–àÓG°ZQÙÒ`ÐÜ ,&8ð©ÿï"Klù üQ ºó%ÒJðy–tÏÈ¥XEþ<{ðÀW_sí>Ð|xA¾¿Ç’-6¡»Óè~ÿåá‡^WÚïqHVï#¥¶Y ù½löɦY·~ëÍzÞ¾Ïq¤Ç٘¾û#}ïd5{²ož£7nvÉ÷|£ÆÕCàûÝ.Ëêßi <Í}˸½Üu€×{0›"-LÄR#@À´˜Þ ¾cÀ"(õ™CXßÎûí$vçòÞÍø*Å>fKä-Þ³ ªÌe”!xï¶áÑ9ýŸ¼:òîõbaSŠ’ÔÄÝ;ß-2 +A»÷…  72•Àøºv¹¤„’X¥¬ëEç™×BÿâM÷·A¦ûl6Ï¡{VŒžítî»9÷h¶{jæ<ºØUÀܟ/CÀ34Mü:Nî…øU(v?÷SŒÚÙÒnº©¸7 DçZŠ¨îEjœe3”3p¯yr’ùÃcÑ·ß`#)Ê3€Š·W(x¼Ô—:d’n¿H-¯½@“±Øn¯ª +pè=çHdqê‡›Í®í¿—¶¯ÒÖö¥ *ˆ X9؂b¥AòõZ¸­íïQ,Žôød°¶·ˆç¯¹=(öäkûÅÉ3afúžú8`Û³H$i¢Þæ°íÉ°æg¾³'òð»ÝØýŒð(·"Ôý.aÛ++ÔÍl Ä÷]«Ol{‡ád +Â\±í–*Qï×öïSQJ3µ°íOjƒ‡ðb”,¼¯ßÜߥ Ú8p5ø ¾S1¶7e m7«pbûúRf´Hâñ(öhÆÔý)mÁÙö ÒƒžãÚþÎ00‚Û^¿Ôˆvœ§[`#I±ÌZQK<‡Û,·0‹lût5«•Ìã‡-¶}\Ÿêß®ö\«gÛ·|xøêNYŠó„Çí'ÛÞ¢Ð%”ïÅÎy@ž‡¦^¶=ön˜ºëŸ™fÛãÄÆ¿žÈ¢¨Á!¸¤v¶ýO­Îk×0 ©ÌõÊä%ßΠÓèq™Žb{Ÿ ™^¢ø¼ö0«¨0ºèy0dÖ~1î5raí¢j¯aöe +€B[¨½®ê,ë6æ³óû…ioˆ˜âxð+ ñhOh§¡s¼¡=ËÊöًêkÿ–Ó töیÖÜJ¼Ð5ð5ûÆ[m+ý[1{~o_>K̲ׄttZ–)¥‚²OÿC 8Iõ¹!ÙÃs V¦S2;<¦U:S^!M”*‰ÜÃϝr‹·Rǀ Im±¸îW§_$öÎn]‚ŸƆ}öQU5ìuiŽ?;mz‰×u­aoîmM†°?u‚y‘y +›¦óEüë ’$ö_Â$ÊÀþSFPûþ°?&ú7´.R ìhû”a–6(}öz덇g3C¬çö•þí@Q-v`¯ÔèëËÙ½@ü>‚žš{•ûäÁžLÚ×Y”«ÜX‚=þE'4àÁp«öíÊæQÌö>$²—aq¬kš6¿äK÷ž>֒XšQF*Z +"°[;`OP ’ª?Þtèöˆö¨l=CÀì±z…‚ræ8Þf:}KÁ ÿëػ²YÇàes hǶ7­ +}QffTPìc€wÖÓF=¤îhb7ñ+°oO•C,h ì7ˆ³ÏpO»÷`lªÜÔÑ´ 1¡*Š¬|؏†ù×`Û½ÐM…×S„ÛÑS‘ƒÜŸúíráø»—ç…?›'Óm@ZFÙØS¶–7Êh\£‰`¶PI÷%Ç犻"JrÍìQ¢ÿÎÅ"[]Ĉ#Ø;äßtglBhB+©œC°ßXÜpsX°7°§ñMxmÊh`Ãc‹þP%?ÎÂöa/Tì ¦xÕÀ†Yk`O¶H†iµ‰Ví2™N 2?Y€s¡ßÞë¿Ø':ár<:ôölä³³DÏG°© à1€u‰Ë ÐÉ "}—¹•Ñãƒ`¯µÿ—rD°ï€O0]/¦è‡rE°ÿŠX®ô‡F½!ØwL\;¡îý{èŽàF’F«H¬¼öi¬ÉÜ°ƒû ?sI‘Õþ#ØW%ƒ¼J'ú%sú€!Ø7{K±2H”ÿ{Ø"*/ª®@hdh¼xOÛVçy–úzYÐ؏†a{½¿?£†R§WD&¯·~a Ž×S¦êg¨H{H?sOW¤Rãõ–ƒ÷ƒòŠÍú¿„'»>­a×;‰ÕC·Á©ëúÚ3îÎÅ +ËtîÍ~k =€#wÅc=÷\×cÒµšOø8²®F˜‘ï)˜Ò¾åøç‚g]ßG»‚¹.¡Ézœ¬ëÿµýD’H|<Ú_ÿcA|‰wpl}|hã¬õ\ “ +ÊR‹^ÃP8y]?¯?„µ!!fQß\ÝÎ5Ò¹`yNÑï d½°ý<@¼pª½»¾áˆ8_†„nQWÿ3nœÞñm XI‘èpËAìúà¿ÚÂ*¸Tï!2ë}½©¾ˆX¥úV4Zvû4qY6K,—S#¯à…ϼ°Š°ë£ÌªïW©»>>‚S…ùð}L%ôs<õ˜0 +¤…ýŠIAöÝ_Ê8i¿~(/¨…Ād½IÈu»Þñĉ 1¹ëíΙqҍhˆX¾¶Ü]ÿÞÑ"Á}jдºÛ_y×7ú4rñ1V›1½ëm¦œîúøæJé!w}:ù(Š%¶ëYû>Zì4 +$ÆÖ ’(Vv¢¸á9à“λr–Ûõø÷q–ò”aœI'«ÜªqV†šûýÅ·¶ë·Dž®ü²›“~t)Ç}s¤ƒ¾BÎ@+|=±]OœC¹Æ’Ê|ÀúŸív½”;w}Ôµ˜”8tw½æû7º´ÞõdÐY8Ö×ñ®—£ð²T¯ã‰žÏɬp`×»>Ξ½Œì„7 þTUéýfº¦¼ëqßiTˆàƒOD©È¤þj¼fÌoA«®¨”Ve°á­o—&]ñ?¨ÈPÛ ±yü®×ú Ì´3GIU¾7šßõ¬lƧµÄÿ]ßސx)ߒž`õ'¯7¿Õ×ßXâ*¬›ý|$E ‚´ª§ç[_8¤wÕUׇ)vF…¿Ú÷Ìõ ÊýVÓÂt̸œ1×ò/A²¼1sý8¼Òq©è$WV°e"”…r‚Ôñ¹B%‹¢«õHiùÒßNaüµ0eëÍßó‘Zï:Ngˆ3ØÐú{‚(óÆӕpiV WÀÂï §Á#ˆ)äå}Rt²·ÈcF~*-éˆõY_´·}r´kQa ­ß…x‚ õ›À*\Ü›‡ÖïÕïÄÔyv)ôÆ!5/«h½/˜…X1/¶õR´ž8췉­•ZÈ´Á|f‹ü #‚»õ(›ˆWPjÕk$ õ–Î<Ïëý܆âËõƒÐ~õ#RìjéK]½§& ±´æ—õ)Øà»^â5yA†!QÉ0lEá±êê|¿ó2ãñ³(β«'1é&ù´µ«w¨Õ< +,8Ø Ú®~}òŸÈ{Ì`-ÖÕór`¨èŽí¹ŸŸ˜Š•ºÑ#Èïۈަª³¹E·¦"ä6b°®žv%"pAÄmBÄ"ÑÕ/¤÷‘3ÐZ9ËñÊ,¶Ó¼n»ø}ñOøÌÕãR³çæº>’êe¾l¬àß®iªò…MªßŒÏF¤›UoÔÃ2üv§Ä¤U¿rí a{Qnè3¤ú å¢úêwm§›Ú—UhSO‹ ý0gÜuAŒk©ïçìèb0©LÊôo>¨GG=M®^ßõ†„8‚ˆ¢ÛNqçqë)ƒ¡¾0×Ǫ´(1ƒ@ «Ô÷’iÞ`•úôI|"Ž"¢xzT <‡§÷×ÁËö!̼Ócyfn[æôW’ånh4>T ›>¡Tð,P¹Àœ¨éƒÐúª²d±LOkþà7lØ¡5\Râ çғ‹­ÓŠã.“–>Ý=ÃìÈ _é9ú'Ze~…D¢GR¥ôN°ÍHé/ŸpŒÒbÞæ&6ésI¤]6Ǚ_’~YJ05¼™%Ò+'U 'c0‰‘€ôIÛ49eÖYøŽž´„îdœÁCŠÞ¼Àƽ&( +¯9E“ˆ?CEO.¦%zwþ§†u·7o!ú Ý6WìX—CÏf|.ìÇÀטãY¨yätB/@Ía" +½G'¶Y +ýà†Ø*ôüxì.˜¹„¢­&eyTbNSÖÜú]’Gm@Ѓ±¬¦¼ËØ×ûç…P˜RÓÛî—5Wèç_I]búŒ!¯Ïçë¸<&è‹Ï£Üý/|ނHîêʋ´Øó‡Î]óèÔ´yž—sT +‚D;ž·M|£G”Yã»èç-hgtªU­v~+Ãà¤Ý|fº÷Ě>Á=kÎ×?Â7‘óüy– äuŽçœÅƒOV…ÎÇwb¤×F@7¢ß|ä%•B‹¨Ôݼ0šÇbh¯{ÄÙmž9)(ÕJÙ¼J¥Õà@®ùèÄ#rÙ­ùÍV&”š¿ŸÂ&ÍGÔ ŸðJ™Í›ŠìMyhèäÞÌÿ$5É&éNÂ}’°&Na” å0Ï©ÀÇH‚×eIó5ž‚²ÍêŠ?°'Ì»Ճ——bmT踸bhE/‚{b^˜û dHÖãʃz"žËG!œ .o3 ujŠ=Ëü©8u ‹IKW0Zþ·Þtw1˜6‹——t·‹âÚ¸ZQþ†+ÏÃPKhÁÊS"ÜÓ¾è1]TùÕЯ#»_Ï&ÝMBÓVƒ_Y,‘Uø>6,åU¸É¸0”z£|ە¥AgVÁ.¡<”ÁŒO¬;ÿ{òdÊò÷lÐSÿ×R9ùú"Ԉ­U¤É“|r¬ ”7O0yՓš@_²k˜+y² ÄIÞcåÀ-ü"y2z›—G¦Íwš +&¿¯&–‹$ŠŽA ½ÇÃ3 q‡=Þ‚¡!OŸxOBÞ f4:ù÷5)£TBh¥†x€ü +‡)É ÌpBy{éÍ:6ô½¥HP1ßãsHЬ}Ï÷–ö,u/57¿;÷oÂÛ¡;þ;|Ûe)lD( •×ɍ®TóÒîø~Æ ùxÖȆŒ¼1¾T‘@zMW 0¯p€.³vÛäÿ7ãp¼½ŽW®W¸öçÆggèI`ã³ +"®Ëâ5þoT*º^dù ñEa$”]DD—ñŸœíÙr,ôªõ9Ƈk‚²0ž ‘ÀGX')_ü' 4ˆàE §„ÎŇÑpнgǶjñ&nã}†Å‡èBÌ,±Ÿ>Xño äp5ÃwEç=xŠŸY:‹9¢ÅGÕ ÂÅáj 'Þ8Büê­M|Gˆœ•ø$§µ‚V_ÓY #ñ³3zˆèàI÷Ž4â­¦Nñ×_q±î'ñåÒùP{'öæªéV·²ôž´ð?üç® ]Uìá ¨Œl‹w~àq¤¥$ãÞ±”Ã3÷áœÇñ%7<—€&Ç4¼OV±§³ƒÒT†ÑÊ^âÇX¬ †k£ —âÂgśª²ÒÖ+|ÆüǺŽŽÊ)|Óò®†½ "Ž'<•åzáùó+áE?Ž© $þ€wá©ÑDš :„Wð ÂÌ]W$qÞþÍ©ÿó+š8x˸¤û½ia‚h!¼gp¿ú +ï žýJ.F‘+x_ðÌ+ߥ+êÃlÀ6àÏdDð8­.âx¨dcÞµ$©À—§DOšÞ6Ú$ž¡»óĀ'æ‰4æ(GZ ]ÉN°öB¸ÒmjÀ‡"<yb…Hÿ{¥‘°#s¦§1.«@Œéx1ìvABìÙV{íD7@çâ¿l(GãÙÅ-áh‡Gý^Û­ÅÁa遌ü>&®nY³þûä¡Â1¸¯lÍ®í; +lá «}¼l"ƍþu»÷ׄ‰¾—%vn*t¸Æj8Kë"¨ +ù>áW‘Å_MСYÊ%½’äûfAyˆ‚²ß¢MŒÂ„ˆ¹Þí¨'Îd•Ib°½¯Œ}lbßAW¯½Ó´˜¯—QÓ{w7¥ìÊÐ}ú[Ö»¢~A;êh^i-&xÞášm ˜±~Þi¿í¸R£ê#‡ŠbŽß¼³eqèåݕV#Ùç;Y°Ûäý8íÑßÏ­¯JÞñþNðQ¼§Ë¹ðnµúâÅ^º{À/ÿ‘Å›°TíÇ9U'õk“:Pq˜´‹9ð^ºcN[,lLAVêҁ¡5•l›KD7Já¥xŒ±t×üMRŸ”J÷XJõRºOÝÐÝMî£@„JwOsWǧ¥»¹ùQóèAƒué¾#9ÛÑ8ÔH"îݚÛñ7ÍÕ¨øAÿ\”Ï]ƒ'yŠ¾n]ºÃ~Ü ˜î.…=‚¨Lw§nŒKüpÊrÒsV%íó.`º#/¿Àßx˜îèù˜°?ï€éžÆ¸c§'.¾¼ ӝhe8á#é±¼¾tßê,øÆgŸ ¼tGÔfÂ͕æí¾A#¤á÷w›#¨N¥»¬!ÚZB-ÝC˜Í¬r´/­Ã|tÈ°t?¡¬tgñ)û漨¯Ç¦¥;Ê¥~HI*ÝQ²€â5k"­Kéî3N„¯ò°'ÝcBóï*|PªSºÏ½Nв¢;—(ݑÄUéÇA`žEoÜ)Kc ¥»|s4°|L÷Kqa7¥{=õ M“A +¥»N,«ÕYîW”ÙÐ1ŠýL¹¨lc¼Ò½@©GJw©—Ô:F鮲J†Eêž}7K¬tßSõ·rbéŽpæaüO¥{-Ù@û ƒÑ="ü »‡¾Zr°”OWБ‚/9Ÿ¢ïò´ Z4ŽêIÉ¿`ñk(M•¿± YšW™bèK¢û"Æ!×ÓÌ@[dOûû2Å®zÿ¼D-‚¯GM£ +'#v +r€©É›¨¡šÔؙ[%¥€ªÆ¹2ŠÎ7‘£§¥}OôºY ²¤VÈ4R Õ€bûÐȝ¨Õ,Z @’Ê’in ã­f†ý”7çp¼}ñô·|¹^Ý™“  ?xòðï:¯jd@X¢š óQ1ž›mô€ã/ўµ±-÷GÀV¦¦Ì…™8aR}|Åuι]¸ßÕϾ6¢–AçÄüW˜EÊ.8a€© ¨£Ã™UÐ + Ÿ05SÁñë¥mãŸUçy쨀>Lô`LdÃ^X…Ä^¢¶'nE38c‡ŽæCÛ^"TjP2çtؐšã¨æ߁‹7e…^¢·Ø«hÏmÉ^;–ò‰ž¿ly¨ù5°Û—¨qŅjÔ¬!\6 X#+}–¨ã¢¨1÷RÔóœÕݪeTZHFØÀ «ÊZ‹ ¦I n­ðc23XËË1é ß/ö5’Z#;Îû‘¾H.Ž´ÀD@»@Á?•1²¿–ø…Ùfê Qã÷˜G—[ªòõÿ7MR¨µ—vðÈoK˜lÓ¤å6߸á4þ8âñZIQÃOLP3–…R‰ºYŸ†è¯¬G½ï»(‘0ÊF©å9S×rËç¸Yçø(Ñ9hlOãA‘ +r#T¢ŒªN ¡æ’ÛÍ"N…Š3"ÝѧÑn¤‘“­s™T"äz±¤|êáÓ$B‚ði.‹î‹8¡—:>`áÓhC/ Ջ=>N~IŒw +·§Q*¦ØE`åSz<ªœ:ŸÉ­¹¢¥= 7O¢ÂӜ©Àj±ÝÓ,óà”“Ún2±Ö§}„|œ؞ŽO3%¿ʔ4zÁÒ)x݉³S"j\ïcÄê%Çö4‡ígwˆ8—Óì²fO‰ê‘F,f«SÐÅ.9 '¸(SM4ä4͏hO6ã ö‚ØÓ$9ýh[P„Îòž†Ý£{¹ŽZƒ„·D Á½€k ý|}KÍGõ(>5qîÜLùÏ“XŸš#©SciçMÍq©¾…Ä©™(§.÷p»—_­уÓñ —iÔh ¢L¾!=Š¹ù¤†EÙJJ9bñ¤F`LŠÑiΩ9«—^̅dq¦f(U/깜©a9KÙLêH(ØÈD÷´ë¤¦U¸…+=DRӄ$½gû%’~2ƒdzñê˜H +äù‹!ʞy-˜@R]ŠÁ¶À¢Kf„Dp—fr{\6¡]B³·¾3\ŒÀNt£žHÒãb•Õ½¹9ÿA"“õëÀ(åš +?ûwÍ(Í×@UIKu)úûË÷!™oŠŒœƒÏųbòÎLM*š/Àïɦ¹pÎÚ*: #À?UqÃÙ¼ë§nEé*ù¥M¿Û¤Ú°ìÛµ[Œ²ÙBÿXèÞ+ÏÑ='µéJQ”SaÎfGÅÍ ðý-ÊõüÜÀã s# É>±éæ*Ì ª]ä«íŒÈàn4Ä`¼‰3Gydû"?¸–€z88ƒž¥eu—’J©|oRá&1 #Đh‚FøMùеø 9ü†ƒöö–8)„¨`— üG¯y³²›ŒÖhorˆÐ¬Hgà3Æ£Ü1m´OhóŽ§ç§Õ‚ªus˜,q±G}­¼¼ýàP2œ¢pÆ [êΘ·B_§ž Q˜i`„pêû/-R]0qø¤Ð¹Š3šV½8‰27û3r†*ç_>à8šÞPJ¹Š‰³ï¶þPüþñ^¾¾C{ßOîÃÄ!«Š“-/SzÉjÁʍÙÈÆ1´DŒ§@ƒÔ”rqVØÕF *‚¼åÐéÓ±¼ðÁ¤( ï}ndó5JÝ,Àb-ÇêۜBFXFx )ê6rNhÍucwŽ47ú­xÖf˜…ïûkF̗‘ :1¨®Ñ¹?ÝHÇæ¼kbX:¯ÇéPjI’³ØB^=F“¥Ž…âD¿ãÝQ¡ˆ—à®3y~2딂%‰ƒ<šÆtBæ‘”,Vôˆì®ñ‡oŠ3݂´GÐõUTÎN¥lÚñiÞïgԝR’«·¾sð#¦T˜õtÜqA*ÊñGêðé-£¤¥76V#EÚb&ïhoj‹ æ¿Èxjrýÿˆ +$NÂH|®Šƒýí;T'Só!ÿÙÿÜpÁR&H(­:r* žÝú30 ¤þÀƒí ?ð3ìÿȉ$01Cƒð_þQ5„˜!<,Á)K*"\"‡ð`(…4¿ÙòÂs,~[¤bÚ@Ð4ò“ô¨È,*á±ßï©8'­‡BxLƇ3V€\}ABŠOµ*I€: <åW[ºLS~3<æ1ù ¯ O~æüñ”ðm狽D$¦‘8v$?Ôc]>t>S_¥ikå,â!jËéß\ÎQÄSFH+ŠÕ„‚ˆGà uàÁd7¿ˆ'H’:â„þY ÄÓ>’£…p +œ@3!…«ö췏¾….hí!žívæ";} „dXénh-âi^Jð°*ô‚¤ŽÑøJ¼cå)♐¾â ùƒösۏÄ<ó£ÌÃà°\é‚=|ц+F ÙÂ;’(:p&÷ŽèN”»á±P‚uàID‰w E0| nîd± ¹¾SÝ|s5¦­²óë;¥ï¿(‚šÞXQ UÌRÚ»Cm¬úNmP[M9ĀCd‰úŽ·“–búÎ,,Ñ4é;È ÅÞ Íý‰š¾“Ù«‰Š´¯u˜¾“Ø؛à’-¥mé;á3Ì=»WõH!‚Iy±ÛNe\@K* Îœïsú(0ŒÕýDKþ(þ¶Žî¤â0Æñ'¡¾s¦íõîãO Ál~àßéâõ˜X$òãå¼ÝÈ2žÉÚW‹0֖ AE«ðSI‡%²EˆÀÈa‘ŸŸM}Ùßɦ€_üÞKÞMÉ×v<Á„{úí9×æ¼A@ËXÂü¶ò˜'\¤ŸÛØÒÆàeS@R‘ƒ{ÔM†Aâçt+¼3Öá> ")ÙÝ#,|9àÎɐ>)€ì$vÜžÿ[Ý÷®-w:Þ Žìq(Ô:½yöxgÃl~\÷¹>l)’‡¼>Äҟã÷Ð]Vù€’w’å€u/ØsIޙÁ/C†nâÞóöXv EÖr¼ V_$1l4 Å\õÄÕ_Ãi˜?žNïŽ%p½)¬:ðTƧ Hu?TÿJ3oØ;lýo(÷ãüzÇ4©{vž¾“ä«w°4§{ôòJÄö IFÿôÓÚ²Úòå"ë#M—ƒlògŸàQÂÈíïd»S'=TóÑ·ºöþÎÍ$â÷üþNs}ëç¨ú¢‘Á¿aÇæïh³ã^Z‘¾-àçïˆ5öµ-IÌ +$ŸÕ”Ö™mÉçô,íقI«þQa@ÊÚ0 ©áý:v@BöLòw°#ðô ‘¿X•Äà~a¿z+°¿ãý’È’ÀÁAX´‘¤úS|}iœšº£ ñ—i–qË{’šèðzhɉ=°ƒý£ÚÒ1ìéî ÁŸ¡Tª’¯fn}÷žDÐÕw v-,Üï |VôJ'+p”‚ê#gÉ8CsçsÔKÄE|’à6æíŽ68‰ˆ +AS€x]w/U€ôÝT•ƒ¦µ0ðŪ#œÌúöhÙÛ? âôŽÅ* 8á?j^@¾síSï@îâ^ýò—õZ™¤ í"5BiT#a ±:ÆÞf”[–‹ôØA}' LViBýØß)•}O„:G»¾ÀH’­®V·Ñ Ù~ÇKe‘²álìwdS—œ§DÞï O¥Ó°ñòw†Htã&58ÑÆ#“½{óÑ‚ü4•ÞÁß¹‚Á›åBÄ:¦æ½Ï”yцùŽåfˆÒP×ö˜«>~9€Ä|½}3ô‰-.òØXªéå;MÇ#%߁…qH³Ç$'÷®¿ãTÁ]°ÑÎJ$;Kt-üI‰óìÎòkîñgJW¤êsüŽû|`þ˵¿ÔàÁ~¤ ߁ $¼½@Olz±«4<¾hy )KAfC<¶ÁÓ'µÔ?Èå§ZÅC}€&ôŠi&BT<‡ +§ò-ϨtØîÏ]ٟjñX!vÓ°ÿÄédË?ÉYz?]%0\â"çÒ³õöÆ~S8*xp\pmeع½×½~P‰«L +Í 8HÐ:£Rã¤TñÔh7oÌyw”ŠgnÐó~8À,^ñ$8Òx„XçÖ㉟nÜ ‹l”Çóä"Ïf`…ÊO {! +THû !Å4ôóDÈÃtÈy ý¿/*$zùõoEQRˆ:«íó[R°Rg$ñïñT±FO aÍÙZ $;ž‚ˆçßÖ °5ìx„Uùm"ÁEÿ!ҒÈÓm²”MF8›XUt!©O sYy|Ÿ<‡Q;Ÿüzµ²ŽõåËʓ 1’œÂ™’D"Ó B +˜›4››!Í&5©&ehòH5ç4gc…IÉZÃ4yÊݤI‹Ü"¤7y¿¦W&ÀfÈÖäa Ȍør\“GE3Ȅ¼¬ÉJ>{„}ìBò[¡y¦ñ׋v¶CA«š‹EhN‚ +ir‘¢PKfÒÕ{ÃY áIâMR{}¼l¹ ZÆä«ò°Á‘jñxûg†tÛ]›µõe„!®Ã]ë‡!7Ž¤òä¿aÒH&fHb…j’Ê6@ˆ¶­Í®¢¤E½Š0¡V•ÇÅ¥>Œ‚ââ éš1$;À§ÊuŽ 1dX¶HU[9#Í.[†Už6‰‹ÜjD™dò2$—aF‘_Ò¿/Cº;„Ä–xˆÂ1Cb}žÄX·¹pS+O“[ƏäoåIÀÅûqh÷Šk†dÛQc×í•ÔÊãc]vcU–—øÒ¡²óçH;¿¬sWžSJDññ…e]ˆWù•*O »²öþéOœWyLñ×s,¢X²2CjŒÚ»DÅü¬ò*µyz¨*Ïàüôé£K«~ê¨òLÁÁ½±*O’Ü +¡Î]V’AŠÙ¢‡,O­*ObYè.)Pkôªòýè†Ô¢´U†‡®p Ó6˜©…3@£³d¢<ƒbñ~# o¡4ïR`Ýõ_ëFð”•GFc¬³SN•,yÀɎ@ºäùá3Ãç&hª–<£#}Ò«΅äÇ[ÿ9bÉS³ °¦–<Â2¬‡¦?·äy%_pU8l>P/y¤ÞQöêÔKÆðG%–b¿oÉ£a€Öeâ~ö.$=hI¼ù=cÉãú[×Zl~êKžPPN,¬Ó%OÝA­ùî¬LLž´«™ É“G{ºv!Ý-3.‚qJNf“ü.¤“p’~¡//’Ó]÷Š1°Q‰ì(2op)=•.“ò¤RÏCž=WÏ +`ŽC:ڐ§Ç û0y h2ñ’§ ~:ÀéÇ`òT‡Ã…ç9Ž]𸼐<±}Žê=$/$PP  +»U[¿äñÇÎ.ꥁ’•þ'Ò *eÝÙÈ%QÑä1œãɑ‹Rg•Y‰Û] b¸×’'Æ`BÙhºä©’¢uIm´êBú’mC`a¡KžF]bďXò4a½vF1-yb>–€›L¤dòÔH—¹· +8º.¡ìÉþ+p®BâÔFêöy뎧>KÛTTɎ礊UH™«ª^ê­ÈÃ@ªå§ñ¾ªeZ!]nc‚ÆF™â¨ÈÓa•Èö +{® ,Á“Ðs-ªBºƒ¶“ÇÅ!ÍÈø3$~‹æYÛùP~¶ :˜gÅ,BïÛW¥Ò`ódqrTt’™ƒC:÷ükF× <&8¤HǎÍÜ6`0O`«æŒf&hèð%~þa!Ü.Kó8 TH_(n@þ"œút ìðs8ìM#1Lm¤†¨ž‰P$\† õúâã3Õ2ŽÒ;¹”Ö,¶*•xyP +ºÍSÅú`§—WaïÓÐgälÃ3YǼ)x Rõwü5Ð]Œˆ½¹DñD«íG ›ó‚Hœª\öž§ü‚H¯•½‘ðö”œ˲ÿñÈnìÉyÚOy®$ÿ½*"ç1 .ã(ќŒ–\ÜäA¤óA$‡OÅþ­£Ó‘ºÀ®˜I։H¹ë!å +6Eõz늩ˆ¬¥œƒRž?ˆŸ©š%°¿Ðϋ1¡æÙS‘öœ';yù<ÍWӊXŠHΉ +—ŒŠH7"€D`3åó¸òrÜã-ÏË÷l­P¿ˆ¤„ö ^:P||‡]Ð[Žxӂ͢Å9ä—OuJx{ó±ÝNñMЧò¯v‹ÒGÕóí݉%±EY<òµýzÙ'ÏvðKŠº¡ß25J䁉÷12Ék½`»µ“ •/ű¤J¿L"W“®ÅÖ¦ŸàÃâ›$’ëœÔã$Qw¨‚?YÝú-*TÝ6œúc\݄”=iC’¾ø¹%{Ò9oÃAú$rpœ(á)þÞEܪ?)­"«’R¨ICJaºšAöõäwnfÑ  7Ù ä _ÞN+©8Œ\@0s“-R:¼ÌÎ|@ .-ðWJRç]ú|r”-H±ü¤4¥àå1PRוò‘.<6© +•þP&¢Ö:ºAœÙ$°9Þ¤G¬T¡4µç«”eI~©®’?2–9 J +öVȬ”yz§Nˆ] :üW:ƒª¦d ™+ƒ÷»†/£Cñ&#‡–‚$hÍñƒ致ÁI;Ê{ìŠüIc©ÊùAà—ñ‡1,Ý~€+–ÞÞNÁXÚ¾óF*–â&p=–Nxz© wj”¬ÈŽïÀÈw™qÙ¦°'æü"dû.ĘÃÉf‚(b8ϧ/ë‹›y 預(ƒ[œ¬¥Û¡±%V48̸BɊSàïª$ˆtK㌢iîR¿ó‘Fz¶­M†"1d¯…C qe] Ìõ¼L‹†€dÈ«!ü‰PÀiCŒ à;[à¨<Ørkb‰€æzù3;^çK4¶æ8_â·Åá¡Ö˜Qº@õ‘š¦*ifç‘<¨þNE£?¤òfÇ¢‚éÕHÊ3&âg"r"Ó´> “S(¤ÃdyœQ7$ö9Sè€á*¦Š£<ÜX‰lper{19zFEÝoŸ19‹Òz Ǥƒ29­ÐDg¨0N~^¼¡c0à!Áz”A>2þ0FÅ&HÏVŠ0½ïîö „ËdK®Q«¼P*.“®þ$W$.xŠ‚4Šñ• s‰¨+S°}X{ñpØUÐ%±¸ù[ÓT#€ç`OÑ<ïl¹„N‘E[Áœ¢Á†·L Q‹0‹‰[¦ÎXµN8#Rp֓$‚À‚‘o~ÂÚ¸´)R˜IÑÕ¢äfF™>ïÊpˆVÝz^E?pRÑô¯Ína¦Ã8´®‘4ÚÐèUô<”“–Ϋ¨,áv}ñT+ɐɥ&Ž_EÄÁÈÑ 3՝¹'#ºæ7¬¨Ø{Á…{3Z4̇˜0ƒ+jF«ÌjÁ¢[6¡‰e‘A,ÿjQHÿá<ÓÏ*èƒí'k  ZSTûòEì¯+chòt›)š^l_SXu›|ø-$øø¼4yÂjL¨sØ ˜˜Ÿ¯Ÿ¦øúË+¤¦”6þI’é.&’ÕHVjt¥¿¨­ã–=Ñ5Vcyˆi%¨¤íF-°‡àG~~™zd“JuºT™û:3Ê+ìßDé7JÇKý$šßèÖS¯â±bûÅËQ#{w²á(3Y‚œ°¹áˆáwGUNÐ#ªïQý±C9ŽR1fWósy÷†#.Dš+ƲéÈ4EÆ;Ù#ÝÆP»Ë¦'hÍ}¯ì›â8kÑ +¨d@†FĹÂڄYœ:æ2sà2³©€ƒ8oýÖ+-:¢]ÙþoD=Nìß@ð6úØ4&©b¦0£ËôßU—»Ù…ò¿Q!<ïW'‹ °Sï’þFµÞ1F¡}óU¦üØtǖ‰Æòº%u›^ÝÖdÏ « ›J·uµ‰Ôr}Mõ›/‡Ôut6?²6:–‹qšw”9m4äœ.ÜYØ_±(;}ÑF҉/•67zVñfc q£J³Ûq2á=$I¹QMyHšœ>M4JøæpTØ´FnœS +Šßèr#w#6¥êQ²@™/–>¢*27ê×hËó)7‚䎎IåF°ù4àЀ¾– +›4‚±Ä…‚ýšx×E’ÉÖF™ÓX úš +ßx´òÚè®Â·½¢ëúTúšÇa=®¼‡Ò²J ÖëãâtM[Õ²&p•­êš)./ÜˉحÑû¥d‰,ý¦‰ l[lôxK— ñ‘t^b£²fääԿس ðªÜبkŠ/y`…ò‡­éÅ~”äkèXӡ僶 .SŽFžÊ/ûtbóä%ªÕ1à;ß3؏@Òj¢Ù†-¨®½D‘†/։Ýš¢XSÓ 2¡dØ:퐼|4ò2`žô•w4úžMK¬rxws42ú„¥£ã“&V“Kéú†±!>/k;wáƒ];G' +V“êJFi‚j$!Ùìñ½M¾Ï5"f©c5·µ§aë+§‘Z8hƒŒ$:€É/zø†a{烇5©ñ v¿º!§ÑI½ºM>HÓ(¢îC*1à4ú¾5p³2ñÑá5¡»Z3=¿B[£¤GE†QÈG6÷?ò® F)‰Ý«tQÉFY‡&–•«Qð@ôcž÷lÄ¢W íjeOXâ_‚6ù”µŠ)"ø˹m”¦ýûôãȍšð×tãÄMAh.ÛF<›‰„¯†âùkjÃ(…Å#WÛ(4¬&x A»Éoúkòët‡D 6šŽ,^pKš§È6ÚO¤7Ã#^¶û­/„Ó_áÇS)¬Í-P,³mT­‘eÙÞaúˆ~֟/ +Kå¤å*¦U„6m#¾vd†šÞBf¶­j†ÍIßÅ@v#â¶O¾_7*‹Jcí¾”öÑu#[Z›ŠÌ®Ä&Jðö6¦XÜFÈÑkÀ§»=«Í›r€3ƍz•4ç6’&r)Áâ’H+GU¾MC/= Ôày·¦²AMKm³*bÍe { ý¡–Bp±Ñ|’Á ôØ]5?áÈ/1K›î5,¸)-Ø×cÎ…ÜffÀM‘í`•?Ê'—LCy]±Éûî2ä:J1.­ÛÑhgò즦±¤âMJO>¼ÞdýiF•Wœ¾é„Ck<>ºèŠÄ@ì#©G"€' 5–Nûg÷ås${öUœP~R…¤‚Ÿ R]c'‰r =ȾS®ç)«)R¯qºhäü)3–6‘@‚ìJ9§M8ø='·%ò(„NÿLq$pÉ£s;M¤© ò"jM¹®˜…XB_ gõŒ¤Ú'–‹¤”–EÈñR"i*T_G<¨NÂ¥œ×‘u€n)Y('’ÄÒ‰-U3ƒ@˜DÒFÿâm›Š'’NYcFáàÛâ:]ß;5æJ‘ž´’%âá_0Nê‰I0÷ÛLÒÄՈ6IâZçޝDá`¹ÛŠ¼|#I­XÍ&Uò‡Œ³$)(g¶-†‚šÑ|’–«$|Bܵ‰Ì’ øGW?ASeIšÔÒ‘]e!R¸vòÒú4æQq1¹vr¼v56%Á×NfŒÂ°ï$]Ò#Ï°—ÈtI×»9m±w‹¤{(]RÃD:钔ב *\J±ƒqR—t_¦O‘'9¶ A—’ôÝN„î[&#&Ɇ › >R|eIBš]Òº'2¼ÓxNÝÀQìb NÒçȌ‰“T6d:ŽÌøMj3í$hƓ´aÎ'¡3͑àQ\ýJXtf øÙˆ'Á‘^Gác€)”äØ/G²V¡´îBÈÆͲW(…¹íÐÎØ"®PŠÔ[aÅ<)ÄÓ´æ²9J(8.à繘ë<¡Žª˜ˆí+¯ó$@„æ6î*ÔÎý[Lå“|/õq’ÙÄ`!E‰ëŒ¼I׈—ÌS°ý"{L‰€é¥òÓ˒àÖ<ÕüG®²²k#º( Ë §å:i3•8ܯyš3âÏEõ$ð=Yž®[³‹R²çH‰ò å”Ò`ßÊ¢ˆC=ýE0®[° 51 &*á¼ÑgM%ˆ]h †b{OE#Í¢•j77®¤ó¼N½<~‹*aéþ„™kc æ¤È`Ÿ0«êŸ%WãìRÂO?@ø­t¢P?¡©’5"—Â¥,]°£ö æ2»cê’Ôñ\ºK”á’ícöÉï%/9¯ +¿„¥“ôŒ›ì4ån`ÖüRÚ&ž¯È¿*ýâRÀ"&ÆJ~i:d屬±Áøö”|¿DïÖWà~émxŠiŽ +‹_2V„1·5¥•I`8 ¿tÇ]²ÈM&à1÷w :ê"1&v„) ‰$›Prt â~ý,#±Iµì{" ¦£@{;yJ÷œzŸ¿à›ÌÆ%üV·»HÇÄ-˜:§‡`–Þ´O€\¤g_`¢B£µŒÕ@˜|ï+)<Æñ˜þ0™“qÔýØKì`º¸Ä(t¼LÖûSÖî#PqíoÍî叓5¶+Ô[dD.&#PVDíù„± W0™~4aBB0Á?ùßœƒÖ4R]°~F¢Ð=¢Ì_ú•",c?,P7´Qh®LTCZkYS…ÙßX~ ÓÄ Å™µ²þ]bP1Ücb]JÿTéoœ˜Hé´ ¼ Éõj옇1ÁƒÕgÿåÜîu¯Lw]&ªáë;Ar’Žéü¢´ ™Æb–OK&¦àLè Îµ†CÚ+EÈ13Éçny3ù7ÐL¨’PFÖl¨ën’6SþfP9ÛeR>ќ&_)ÄPšW“Õj@k(‰¡w€MI.auZ9:Ôxãùôt»‹6•2î¤ }¨ùIQ›:ހC즎Á?£Þ$4ƒ¿ü7‘®aA8Ájc¢ø¼ÀóÌє²¡ ‘¸kö¦kò)¾É4‚;Þ͈ŠÊY+ª!ð9û;æ9#»¶&8†ò¢^\XAdØ"qx´2ñµÓ$ ƒðŒÙÓSÊÞw*rÞá©ÊkÔKÒ°™'³§µp”¶êÉP+üsÓxZ:I=:ó!ä¨XÃ"Ûë” ®øØå„¿›ôøÑ1Ώˆ”zy” +Í'uÈoKué›3"]¿Cnq>±yà\ŸÃƒÀ\Ÿ’aÏâœÀ>IÍõޏP²í(Ëò£Œ¹jÒÿ·á£ö*V¬âõµòîñ‘[hÛ-æ{”Ø2O£p8€“@Ÿ”šœôÐú[=¶ú¤ˆì“nLõ“0xeÂÖD_Ñ Þ= +ã¸ý÷¨2§·;:ÔX$ˆJ>9~†¼uO6™| >)(èðÁ&ŸT‘–âϯoò ÝüËÏXn©YšGѧ¸\Íö˜R>C Ÿ×öB²ò‰#;kÀ€Ã 6JsN.õR·“Oð ù´Þ<óÿÙ¸;ê÷ -ü•/ݤ;*ÜÝ~*~O;}¯Þ€Ëz€Aæˆ/w÷8ó¨HA.é“Ï&#pû¤€œèŽŸbuÏ¡?@«°äF²Hvr±=åUWž8¤Š¶¨`ãÅü"@ °!*Ò©©×¯Ttžy@}È=® }kžA¯mHGUjIý/™:ÿbŠP8¾ÈsÛ¤ÂQŽèr…‚™dÀBª…ºÔ‚!°b–¡”Y:¡¬×ì=þ.™jÉØ&.‹ÄÁqÜóàځk3[ámhpQo²k2Ã¥f1# +µÈ”Q†@×j+/õWV 8~©)ҜôÇ hè Nއ•9™bQ +ÂL) %-ŸS!5VL¿)HŽ” ¬—l%)9ôÛT‹”_è*¥7)myžb] §Uµ©›Ü2ÜR©Mù¦¼Ó‡’©پ(S[ʝ«ør*O™Ð)_vø²EQGL 5xnL•\#›ìNݒPÀ;š +å%h£©èùՁùR#åjJ½.‘(ê©®ˆat‹Þ”ý»iÞvj5NYÔb2tJB¯9Ù)w‚´ñÔb؟X¨b|æÐÀeSPј÷§"™ôz^BWBEù*®PÉ /ý|þWˆ +©çÏløÞb8•]DY·œ!¢ÞË9,ÜX²J2UQ±™‹­¬Á»“h³~‘ZEõwf°¨j/j—:­ç*=s •„»Ñd­'¤ŒªCÝK_y ŒJß}MQ`Ônd]Ö;œJ•i_Tˆ+k߄_í¯x6 wØþúõ¢*7g¦n‚ÂýD0âEU¦úËü"C/*p<¼¿X×Ó-lôEKuóËshÃÛ ¿Þu4œ’–\9 +©Ä¶|QÉ€¯©Wì_Tt÷`—ÏʅèEåÍÅå˜ÚñmUÍ6o*¨Œu>xœ¢ì•Z°€QI"Ç6Áƒ ÆÛè¦áž½?¹ïS½^ýj„QÍJ¢è·_U –aTŒÔ6—G5×¸C–` Òb)‰‰š è–:£°ãM¯¶O4F5:2ÈiÔÃ@„åå©¿DÏ`#JÍaT)§• ´ôåÁé§xϪwµ0 F•€?¡8ºœí}9FõU‰’¸ŒjXÐUÚ`Œ*Êü¨i‘!£J¼Ehy¨R™\̤í9 ŒjÓA`Èç‘Q]¿½÷ÖH#ò–‘†*¡R…aA +ÌzøãHö[£«WU|,6ɨv¦ÈÔÔ˨Žñìq£‰ä1Æò'fÿ*¿·’­50>~CFe¼ÐýïHªr•¤°ç´…Ä0ÖøSÒùz*(£‚ñž4ßI€²KàuÁƀôº5¢ŒêÐC»‘ÈC£<'J„(æ§eEk.>†»(£B´eif1*ÓÿT2¹c5‰¥$1*!.ˆ"Ñ1ªFº1 £z{jºµF…¦\†P”5`¢m‘À¨Ns£„FÊàë¢zoèsIÀž‚-– óµj3ΖÚñ»¨2ïê¯jfã/*ÛxÌT’)kr^T&¡’#ª;ã ^÷ú·)Àr½¨>´æœD Áù¢Ú<ýԈÔÈñ¹ÛQÿ1-6Ũ4³žJdwñSîŒT²QCébTl¯VÙ@O´¼Ôòyb'dRp£¢4k˜áÜiŒêx(´] ?1*…Ä‚i£ZzmJ¤4ƨ"ÎûgìbT 6£¢¯[ó&5  lÝP™ŒjAZ¢”¸Š¢Jš®À›C»í©£‚1Ðtõb ú/rÚá<îRt±fƒV‹Œ*)…ÑÝOü[4£’m•*•·„̨Y<À*¼gT@árSŠk֐ýfT$nþ{ ²õľ•iÐLìÇ2 v‘†þz™F£Ê|Ì@°ŒQÝêT®‡‡M]ŒêêÚÊ%£*ØÏÎU­UFåt™¸£YÌÝ!£‚·m_Üõä¡RNe¦-£’ÊY")@ ôêyS‘QÅQ§RH-Q•·@ n‹šÕø)!T…¡’D×ÑTº­NRãَÿÄgcT•munÈ/Ý£êËj¢Ïe.Œª‘ín¯þ["™Gª4_Twt‰u }¾xy®½;¿‡ë3J5pXP¹ZСóTIƒš¼'~]=䮋ªÜ’âÊ´½¸¨NÔþ ÅpKQ뢒›­˜êò€"™ +p#¦ÛÖ2ÛZ”"··Ù=»ÔR¦¥w#Ì?ÿCí³§ÕW2>ÍÒa\TÛÌʜ^‰sQàn ).ªIŒ‘E*Â%!ý WåS/ªÕŽó-tVmxô[G¸AGV¨-Õ½¨®%º:"’8ª¶{vg|QàÅÈç±/4.*þ– >œ9¬.*z-WýÐadì¢â/+(ùàM¤‹ +Mӝ”1lωº¨:j—¶¯¹¨¸CŸ*O*.ªò(e-þ†ä²¥»¨îw(Œ8‚ÊìÒuÐ6ódº¸X‘²ô‰‹Š¼à:´¨¸0mHˆGWRWa&•ÄžÂo\ûY°zاYô÷²¨Š 3‚4^W1°…—ªšÂFYT–²äÐڂÉÕ|Òd|Qã–ÍÀŠªª¢Zû¬qmŠJÅ4MrŒ&Ô=±¦)ª>㒘ûf9ïUe]ƒ‚ù™¢rU©.Âð )*õxvòjW&!'EuÝæÍÞzY8RT~L€Ž¬ŸÁ1EœÓœóÀQ&¹Á~µÅc矷wøŠ +Hñ”Î8ªf­oÜ=KU[ÔIE5B“Aù¬**‚½ÃZE•PiV 0$©¨ü¶lQZB~òŒPEe²&”°“:uÞ٠ϼ¬^@*ª +N»¦ V +Ê8èú«¨j§dʬô†wOQí„h˜aØ¢Q1Õòá½µ¢gÀô°æ§Ú€Ò6£|¯¨0šG•”’ŠÊn’¢Jü·¬jFQAÙàòv¢* 0Ã8w̋†‰ªjßz¹Sz&*ék÷,i!b¢J¶Ä:ŒE)g›¨@°&Äi¶†D…(TyR6²(՛òbMW/PJVqN•O¢j¬…‚ÑޘåR 1ˆüó†¼À‹¸J\&nT©ºR¢m÷4¯ˆjM§êrg+ˆ›áuNKýT3¢:a¨¯63”Q±+2&Àiº›ˆÊFÚíÌ°óæ"*²|ÀØêw¾^šqCÃFqu¼€ó$\Dånêß­Uˆê…MxrCCTV^Ë%×Vú՛Tz#›ø¢BTcÑzÆ>›‹&K¢zX^D%ξm– ŠOzØî—O"* Wwh$¢²Ô@à ˜¡Õ@ PڋˆŠ6‰‡Æ-M‰¨ŽÅè–$8—D¿Ñä„;ï7ˆj ä'O?º]lÕìUØ ÙàçXòˆ¨|YÐ3rÐøí¸S]Ü0…ˆ +\)³A¦¸˜A¤ê}Rœ »¥[2F±ª¸Ü ¨m ɱJ2Ä®õ²rˆê€{á3¢?í…ã +QÍá`',¡U§²ŠX®É œ®ŒØ&0U'<ö‰¨@xm{‹%*¢ú8l2•ÇXöC*AQ%Õ~è%Q•”•œK¥$+¨ÏtoDTmÙJøZPxT˝…®+ûéh¯‰×[v +aoB04*ICÊஸB‹¨,%F`ð(H+¢Še`É“¾®ôoDTñ +;DÕ%CŽ*p(ãYQÅÿ5Šœ"ª¡”Ñ6b;Ö¢Š¨œ[ž;m>ÑA`ijØ]Íô7¢}•, UHD+Uâ9òÆÒs¨ˆªÜü¼ÅDD…‘ÁiÙY!>’ê­Î+yôDTWADï]—^ÛV 󙈨îLÉh™’<ã¢::¯E¢âÿC"5`H‡¨”ÊZ!*ú´­*5M—b•ˆJiÍ5XB"*˜” +Ý*!f:ÿ ¢R4;Ä»½ü&Fó· _UŸ³€%lT§K©#ª—ñÙEô7ñ²åË ñ•ü¿—ö#ª”`èu†âÕxzFo]ê å·´êÚ «Q•"³¥èå”U‘õˆ +dn”Ž¨œBø7鳈êìWncDeÅ91é?#*° 4i;ˆøŠÓY• *m0î¯'m;¢Q™•X8ç‚-°­÷0ðˆ +u©‹R –4®¨<¿ÕaFÿ=¦ † ªÑ=­è,YHT”dØFãSœèË}€øöW|y‰j<(-ŽJTAr÷ðS%*ÓôÉ|8fq—¨"žÜš‡½®Ö:X/IªºYç²ÏŽApBþ›™AeH³µÝ§D¥2Ð +.ÖT—¨ø3]ÃY¢rLt^,Q%}·(Qa€„ý^³HЧš8¶_¢ºlè (Ì3p¨LRL'™~€mB§ª[ŸT‘]¦'Ð=f1¡‚È.ò3͇™­× ;UcÑM û”¼Ià y#Z4ÅÜBY ÿß@ Q®îhL¨rw{”È UA>IEßÆ Õ3¶åb¤”˜øV'T^çF¥øÞVÜ>òÔŝP=Ha7ëiôýCrO.5ÎO9Öû w*’»%{ɖ|@ŠøX¡òß:ÊßÕäq`§º(ë«Ð3‚K*ø)¸¥h¡úõ|*ýÅt/PM.Ü7ä»<›•tð³±M Àèäpð]Ô¦¯Bê• ̚nÖX¡BÆè¢$%e¯Jþ”ó ÂF¼@¡Â‡âõ掍øv«k÷QmA,TÚ`óȤ™ñ+-TŠ^pl†­PQ›­U‹ºvZ<< Tõ‰@.¬¢Péð:[Ÿ»¤PáCý)T˜Â¦ûFô¸Â<…ê€Ç~8WX¡ý @g!Øò_­"… +Áavâ{P¨ìJWõBÖ/…*Q¿Ã·’ª¼Ê3_&T~éoâ *©¹Tº“ߝ“L¨Ú ÙE†÷ÓÉP•n|u¡~2W}[)T] +‹Û·í U2 30¡ò'qªVM¨†y:ÔïrSM¨è +ÊöÂ%bB~WèL¨¾úWªÌÌU•û#>¡â×`‡GóՓPY‡|eñ¡ªý&Sâm¦ä¡EÂòïHُ«Jñ"žD¨nª/]kúÓB„êßý‹jÞE|…µðзÓÕ@ƒßÁj„JwŸ‹g—HŠêuÏTfr”ÄŠ&Í `O…Qä$+Rn¹É( ÿòòÃ`É~î—áí¡¦Œwü‡â4!½Á3©p"$t‚Óðc‹*ŽT¤éðŠ3âa¤~ÅéAt8őÄAR†ÂÂC˜dᚇYBÌ ¢„Op\Y¸Âˆð 2„Y˜ÛCÁnHXÆËÆR…º*Blª`'Ž£è(ÖÍÝL+6aÞ£ÏTÂÔ3– …M„âÞ38\”‚Lþ¦Ó„5ˆøM(tR„9BЮÛa!…[(ŒŒ [¸¶ÿ!aTò!äÏr¹ß±›Žƒø¡pŽ¿7Ò',|'§Ñ§À˜Ñ +qfóÓqqdØKfU<Ȍø ð˜b 3Ò(: +z ‡Â',¥‰Adï{KÙë&FBæ†Éƒ„;„`B袄¼˜Ñš™;׸àzñ?¤Ëþ™Kø'—_æ8g‡}7~8ÅÕ_`¹0òYÛ.'ä/úF½Ã\&KBªt…Ž‹™üEÍåÄՉ9Z©îT_љ_J™y2Ì/½tæ¢^ÔD’ ¦2ôŠ~œŽÌø?ه˰,+½•´°ÆH “’$¬1|„¦ +rÿä áìf W ¾GmãÀaâWíœÒ·•¡ƒs¯geDR™“U›7µ“›e)Ñ|mP:m¬1›3ª0oÍxˆÊœï\¤Ú҇‘8çE´JC<Ÿ.D&:_ϙ_ëiÏ°sMã”ÊJôóBù•¨DEįZµ"–ç‡@Js¼U¶õo¼Œ4¦°îá'{ðkÎÏ.hªTŸ¾”‹ª^c‡°™ ú›Œ!p>Ÿù/’"ÉQlŸè¾á¬ƒ„dƒðï°¿†ý¥4ù óRAòˆ J/Sº¿” ±Èÿ!dÑ,„ ð7jòoR—üQ†â¡ü~µÆZØ))+5òoéyc3•°•’äïòeÿ‡÷ý`òì9ÿ5|Hñ©Rñ©Š8(¤SÆB§ã¿goyø|«_Ì3ägjÿ…ü¤xð"l„ixþ“r9÷©v»‚â!|Â4_ψ3’z!Hœäa¶í#AÛ4É·zS/ˆ +R÷‚'*xoCLQ ™F÷cšd±É a7 ¡[ÂÓ11ü±4-¬°‡‚©øýa-‰{Ãñ§Ö„ð±lB¸Ã´…0ք‘¼„ÁÄÎðs2)Ug£ðä³'#jrKtÏá ¿/ˆìÔ8ÔxA +<Îç)ŝS(ŠyW §°¢&<‚ôÔÑaE$„þ¹ÂU´QÄ8”ÙJ £IŸÌ7…¨PÒcÐd‰**©,!U½ˆæ™k=ÌF…ÆbIhd:Yïô.(è»®MFBî·! ³³Ó\ GÚúð„#¢|røà>‰ñ䄐á4;Á¦ýàŠºÃ)–$Ãf{ÃDAÃÂ(þ¢ÉVþÇI‘,W¶ücH>ÌÈòw©°&ÔÃÅä Tôž³þ|Bã¿®Œ¿Ë‹1c¨FöœRÇç{£7g‚õ¹H~˜7º Ë¨È”½ u)šb:ÑÙjÏC*]‚-Šþ¥ïQP‚A¿ú4'"~PãnÅb%¢?ÝÉè§îM%¦/²„A!Ìu=8<…Í`Åe6¥Á¡ØŠ…Iü3NÒ}9ç ÏÉpqtTšsE—áuù”y!§xÎ1ÆË^êJ¹Ýk&nŒãD“…‹*œ@U‹ûrFCÿ¥‡~š{Ê(’†;îy aÇ°^A¦ç˜3¢9ˆH¹HEqâc$â9?ò¬.þ˜J„)/*kÉgôö|ÒhX/MÌă'f¤cøïy|úüa%JQe›*ŒEý'´ uBâ y +ZØGAiÐ;b3ŠÐM›b]D(1^'·b‘¹}|`ßá‡EŠŽðQ)Ñ¢[,Ø÷+:Ñ×à¦BaŸl  ?]Væ†xXP~ \W°²…}ï:ìó¥Ebi€Ø°° +ľƒï⻇…^<,ڊ¿?†}>J±Ã‚†T>TÔϯðf…}¢9nõóœô°aßñ`ßB$›½BvtX8dy}>ÒR,?<ß2W‹3ØWg¾]Bcˆ“)¦ÉÐÔ2ÆDdÃ⚦± y”Ü-"OÞW¸‡wrXð8Re4IÐÔa!q6è"‡ÅK|j˜ã¸W]`»ÃBÄ%yXäEÓÁT‰,Ô<,îþ…}†a‡E`”ݳJ Äk°o&°O5_”Ž¿>Åa,…â)`_©ïo¿¾Ù€.¦œz¢sX øúÌz#öëû n“ðñÂÛ×ç­L kŒrè8,X‘¡;/ìëS¦hù¬Ã"^=õæGx: ,¥¡CxX€éõ½=,”Ç×7+þú +ì›wÔº“O úСþH&ö…‡kˆ­í·aþÄwEí=ŸQa)3{btX¨Kê3ÐÝ«>èë/|†e¡—uIçxáû,¿‚NÎâ°8柛…mXü§a¢±Dm99öû +|Ê!ΐ[à €ÿõ ‹’)îæC`Ÿ”줶Ža1`¥½øyú +Ì ².,ï`Ÿ êj¸¿û|²½6ç"öÍ6 gÑÉçÃDÃð¥e&µ°Xû4,,’"´tµ¢Ä¾• û*ö…ò£öUK^ØÇ¥ž ò_¹°ÀvìÕûà…‚•H±ØG»°@ +ö!€$Z*_X”Â>9'ö•sا%bß$iäd^X8 öeÎ +»¡û œE%yå0öA–ü¶Lëç“TJš$a]1ûzÃÉãÉ40,r¼° R†Åú·±È0-úç§a¡É·að—„_܌¥H³. rå°È@à°HJ +Ý©&žmR=‰( cuä†Å“aÃ✀†±Ïvò×ÜPµã°Å>ԌëÞ°("ö± ‹=ìó‘ —Ö°hˆAöåꯇÜs°½°oã‰êßaßyä ô­’ŽwÇkœË"&ì›þ^'•¬Há°°¨röɱÏÌžL‡}CÖ¼rXÀÕaVš*ØGæWà©Òa¡/•Ãâáó-¤oIwľ‡E +oX´6, ZÂòŠ6,,û'ïBÑ %¢•K§Ðb|Äa¡X vÛìqX\J‘Ãâµ›ûXÜU„lºµ“‚ɺâ°Ðù~ÃBûø“"† Tbßѓrz¿ÏÚãÎçᔳñxj`Ô¨c¤µ‰[oN/ô½.žS•N/ôÅ"ÀÈjN/p“:ƒï¡ÞÚä–ʃ¡S¹ïA¦7Üè¿/ÀM¥$7,”EK©®ÝÆBÇø•å†…Îõeұ߅ÃÍ´Ó>úÞJÌÊ?nX LiäÞábwì7¹a!Æ#&Ú¡‹G꺲õZ%Ä_ì]à¹X `½³2R‘Áí.,÷ÖË@[>óªaõò檉—Í_J:¥²¶4šBµôˆÏv£sµòõ+!èç5,X.¹J*áöÓ<œXŒ1ŽdeXxg£kP aéf7,œøHJ7,¦ #Óæm/®®sLwÐZ°7,âҊ; +=Üåo^èU{#ÙSäIí†E-E>éC·´Ñ…ú¾Âñ,À)D¶ˆ@réZØÞí¶¸&Sº'˜çô+VÝëkXàÅI+ RŒ2AÔJ¡5,@æɁ©žî™Ìˆ¨êlX¨ÖÙ¥Dƒc%§\X²ȹéZ$̎ªpX+\؝¤^–J¾^Ú ‹ à ô½Þ÷ž(,Üýv¾ Výº…(8ÿ’™K+¼Ko’‘êss qåö’hAþó]râô~͜;…]&¨Š–:/Ф–þÁÄ^®¿ƒ ²GñºaA'`Gƒ#Ãß°ø-© ‹IÌV©P5%¹T—¿QÞ°ÐýIE· ½Eùߙ%€¿æ†ÅG«Òµ¹añ©+Õs›æÍ,œßªdfrwÓ´‚”à°PäºwZ2D6OÜEŽwe™ÊŒPÆa‘¢rjÀåàñ8,Ñ܌˜×`yˆJÓ¦NZ>‚’$gauXÜÍë7\< 3H%BuX`ÀÃ@Lkïú0lqXüæ;3´ØþÌÐaQˆ4VÇ0Ò"$gxù˜…¥B78MH«^ì*í‘ñf´«e¡Ê¢(”ߘž›X¢ØÓ¯Ã"? Ä nÊ9!DYP3G,;oíÀè°Ëx‹¶Î&Ý̐„d·äc#µ$´ ÐòzjÜPêÇ¡d9|üéQ֏…í]ñÌ=³c2õ€¨)줰 Ň²qWæ»DçUžøAÕaÑþæ3å(ÕÞN‡ÅŒ†1aun_—ƒ`02“Dô…ü€Ùë…J9˜®Œ,"ƒ,îµã}{¾Ã¢[ÌSŠ¸ÀŸ;wX8w£ˆŒ1¦\ؘÒòª{P }ÐÕ¬]ÃÛaT[ñ2ݕžÛÈä$찐™S¬ìùãa±àÉVæᱶó°ˆË+cê茬ñÞDŠþà&^:QAÒÃ"¯»¾‹îÊk ®¶`ayÄƾ<˜¶å—ÏOx€%Ýñ®ö° ¦xÇcùjM´ýYxãÝ씶 €Q{…}0¾b— ÃnÕ#l|ÚÅb°Ñ°ÀD¯Ð!øbAh?5¿_ñ̹òp¡Ù¸ãVñ¸±!­+d8?,¶®Bü QÏ>PÖ¥íëÅ7ôӐæ@R4f¸*ke±à¤z2Y“8W ÈNËtÂVŸ™Î>±ÐI¨5“™»ˆÂ†X  +vØ x ¸!óÙÀ-€É!!â¡gV⫯Ð!$ Éš’|’4k…5!,OȁԒ7^ ±`›‡ä`Ì øK”)—Ž}V 3 ¡ËjB“Š«YÁº±àúÐæ6–øÝ"|e¤É>‚XÈj¡+5G9Y‹S¸X€’äE¦±ØÎòG`Zñ0ëe÷¢ +‚Xø +¡¨[ âÁ—<ý +8܇ƒrEæ<ýàí˜Ä‡Pº ÷ÉÒ2}¿ßZ’/°BâÿlÙ=rþÄúþ±›A,ºÞŒ­¹ ‚XðÜ(„¦œČ ¾uc¯ˆ½%' +BäXZʇX"¹Ýnaì€Ê椄ú\‚½ç¾ +±°8^l»+f†VЯ3ôÊêÕ0ã˜O꧖“„&Ð5ÀÁsZZ”°Bô]Gà%$a…e@P<9”|fe]\:C,4c^¨t¬ß"MXG` °¥2›ü&¬€øÄìVÆó«†=6ùD,²v #l} ºÂ"~Š±¨P—þ£õõ–ë©/ÄS‚¥Ü³‡ˆÅ‹jßì€8NÌ´  nÆ'E+ÑVиM$¿zD,&KššÉ9: + ç½9»ÂD!§¹ØÛ¤¤Pö;äªÓ&b1ՏfM¼ÉHÄâ ì…þñœ v‚×y¨U»l$b±œɶ—*»g+a…Ή^p¸½lkÔÆ7ö±1%bQmƂ5 =EB +åúŽ)v€å5—•{ +-‘å•÷I0a…jÍ6¨Ï4ï@‰XÀÇçúä5)àü€„Ü©ˆûeœÓ¾"ˆ7GÖ¤ÜY*)a iaÕÅ!õ~Á žˆ…l}ÃùɊÓÕ!† "<³D‹ºª'…69„¦!NHÄâ !f±÷â +$5U¡`Ê]µa…ùu^œ\ï/¨ïǏ‰°Âbz©°ò‹X¤Xæÿˆ³5`Äâ–w¹§¸F, ϦÿEMY#±:)óìšB‰°äІA[a…n“Nl—ž7‘“ûät+e³~—cý`…¹%óo¬F,ÈOª'É¥¦R4bù¿(×À[æW¹àI|>TV¨zGí±È¨‰ËH``AÉÁ +Üg:Qx»uð $GÀÉh”§ž°PjÑÿ6‰Å« +Ú9çŽX(–vã¢`̱&¬cQƒDfÀ„…S¼Õ <¬¸õ +Ì¿'(°Œ®ó°BKÍ'“¡ÍÒÛ#%NX!¯f؞2G± +äK%mg§œá˜°Âö+SÄ¢s«ÎÓïә°‚­;õ¡Á¬… Š'Ò2¹ÿ—»á±À +EÌ!C²!­L,¡‹´ :wZ±h‚Æ×Qt¨F֎Æóô­¡ÐV(ëÎDÜÉLM†#–=˜ÛN[/à +MڋƧ¿ÔˎXyܨ±™UÜÄ«àŒ5¨ \G¯ÚñjœÍ’ ÆêžÅ«PF'ˆÃÖí= ÞHeÖ|$"ÌUh ¶ÒhRÊÍU FÈr½XaíH,d_ƒ×Ü«| súƒ š«@y„¶x7ÅÐ7s2pæP¯é›Éd®BäЈW#^Â-š`sVRÁtðôZ›«@ËÈ£§á.4gψ©v±áàëG¡±(š)¸ .&ü5W¡—É>‰‹?aœ1b‚<†C0cG,V îmâà1`<š#É2K¢kÐNšÝZdM"r.sÄÿU—¸!'G†\n_Q• çÆ*7À”û™2Š%¹ +1Ɠûg«„G,róQÛN±øóKFß,l™Öä*dêÈjO2«œª‹RѐÄ"Ü° v:ÍUhAÿŸ&iô#ãD/0:z¡„3ž¹ +ýž4àÂVûUú ö ±$&KÜyq³\@÷¯íGj¨\…Œ⢠q×Eeå*˜…Ëi§r®ƒ%ê +b¬7µ"ʕ#*ÚbSˆmuH7bAÙetàIìòm”3bHµt:zƒ¼)Í> ¡¹ +Oôo@u|õˆÅˆ…¥ßáj‡J—ó~Ï;ii;`°8ì°\B,h˔9‹…„X$³Ÿ=:3.”ɶ\…/_ڈƒìÊuå*ÜŽ$UƒPIb‘ˆáNAØsw¹ +^ à 5¢ m¯vÐçíí¬Âc„YòÞ<Ãw[Ã0Ĝ*E)&cL>Ñv½zØ ‘?!3ˈÑUO… ¯Ã€okÙ¼^£ ¥qYFÏ6…*œTaZÓÝ ÑÂbÑ?E÷ Ži($°pH›(æBˆ‚/<§~ùƒô<O'lˆEp~¬Ô÷@ ;Äb:]R#7µkI…h‰ê…‚ +N–˜^ÛÄ°Pý҆XLÒN[”–"÷£Bó¯âa¿tˆÅ¬„u÷ÉÎ[ Ý”$Ò³ÐØ»5ì»é¿§²±8öjÌXL?T¨Ï"íÎÒä;v±8£(úl}°¸$bqPåŒù†²nñÁúH-^|D,MH$³^kºG›ˆE úŸˆÅ>1 \½ô~ 7r9Ïbö‘ÚÈ}à)|ðó¢*:íîø Œç⍔ˆÅa‰ÂžŸ޳ؘSàÅçV¨"ž±¦è/a^Jˆ›ï t+¤éôf$bá!,b÷‘mWD?T?gF,f~„•õ”7z÷ËB9[ 4ۈµ3jLÑ«Ó@F,´0<í¢ꊿ.pae0o#ÔЈTeHB`Ô ìætöOø2Š° ´@Ó{ºó=æYƦ +£à£Ùuš–Øè‹Xè ÛZI2ã$b18҈R¥@ÄÂ.Ù+E]Òéz+˜gn’¬™¦þ̈Åݔ[Ŝ‰ ‹˜šÎKƒ´,±«ê"ŸO@³¿°à åäî´LÐ¹ð+TÄ,~UÄð&åë®´–·ô± ÛìӚ‘è™Ú7uB»j«†jrJ¸º€F,.ÑDðìK‰1uB΂X®GŸênÄb W¤µËÆGjxña$z„‹Fõ·}fÄⶠ+]RF‡ù§‹É|qVq¤ŒK š9XÄõI ê*l}¢uágÁˆEÝ}ZÑ3µF,nl`o²,Û4b‘mD_!ՌQ'(ü&Ë#vќ“!Ój|+b±%ë¢8vfÙ I¦"w@-Z_8ŸÑÚÿ Õê§Ü²ˆ.ü·`TÄB/²@J´aå/öÉTĂ3èZ+ˆëÏ ÖÖè?2“X©€›ZâL´Ónêfx`ÊJài-#, ¤lY#ðæ„6BÎ,µàÊ%fÄâ%(iIpÕ YÄ" d²axatsB¯@]¼(ÅF,…í\˜¶ˆ…jì¥Í«ô˜)b‘µØV½ÛA/bс¡ç9ò¶ºfø"í´ËRD,D¶ÅD;ÞG·M[D,\˜(ÿcÎXm‡VĂt~¼Î±¨êù-€F‘ø-'¸ÄvGš1±°€.ðÍA‰Xh°±?×Ä´EEçýV¦7sŠv7O/bÁøQRÂ5O®i±1À­ho® Ðß¿Ÿ P$ŵ„´P ++Ãb«ˆ…#ÀæÁՃ\öúK𿂧åš]ÿŲø2D,È›ÐÅ +‚ˆ…ëÏìU¨Ð8±(i–¤š·‚„Ö¹&‹¤v"‹rÆw…/§¶B`~…½Úz©qBH]~V3ö%IÉ#u8Y(h7ˆ…"™{´ÚÆzË%nœ\|”ôMÊDƒXH ì›Ç,iz‹À;º‹!í$ìŠÀc‹Ä]–.®}Ó ÄÂÖs)¬5¿b‘Z‡ƒEý¦ +ǒçt¿ ĂYîÄîéW«3ÍEÊ©  þÁª¯Ó‹NM°#‘ S ­RàŽ{l¶ÇÝGT/X¯±á' LÀe ìaPA,ºþS XA,¨A£öGsâԄE70êeýOMs^¹è§&¸BžÓï™Õ—fiX¨žK€‚“NÝHџšÐÏ{πXŒ±Ç3ñªäúÒÎSŠ\Ïãԛb R)xÀ:õ/÷”P ÊøgÚ¯+ˆ@,)+îj¦ë—à© TˆÒ“þ,¶Í©á þC>,BÓðtOM¨S{Õтõ©,uON´·•’ Ȇ6òßî ¯—°`ÆciܳÚÇ[´”SÄ»XÊÒR;|N2½<,)QðÔþ°æaAR +ÎùŒÊ‡j<ŽöÜH¾˜êu«Àu ª‹x-šñ™ð¡STè^”?N\.‡jB¾:kít¡ÔˆjÂiÙ#HÉ¢šU¢Ìú-U£šÝú~ޕÍË^䤚@ç¥ ‹\‘Œ”T‹Ë7Ö\ú&—%Aø”ä×ÚJÁTºï“ÐA¨¡,jÁm:7;9ÇK/8›€õçV¨)«¥(Š¨&xýïÒ@-ø°¨€yOÎÀ´=,ÌÂì(ÞÃÒrâ“Ñ»=2»"ž¾.tµ‡…\å4[—Ñô°8[æû»p%r|ßhrOö†3™‹²wpWsK +g¯¾_šú>ù@´`í»ôGC}iÂEð;5 é÷aÁ¹¹!§»˜uø°ÈúÇ1}µM۠Т €I*0“•ÿÃ";ÖÒÖá“hüa¡ÓÄUº£˜@å ¦M‚|$Åa9χ]{8¡ Ê8›àWØTȚl”ûÅ}X|º~Kö‡…Ame{Ö!:Lébl=«—O/ ^$&pIÑ}‘˜2¨ñà˾iý>¢¬M2 ÍVZLÌ ™Á}Xð‡}^ç ²E¶Ï·yã™rwð–PŸm‡ñÔ8ÔcÁ‘ŒâÂy‹† úÊ Úóô’”qü°HÃ]ÇC}<-4`*ù°s€=±˜–‚ļy€†×s]Wô|’x_6® Ä¢œ Œ¯açƒÍýIÚ 0#x◠‹BÕ݁žFbQ âªZqˆñÏJ5¤Ï¸ôX ŒÇøPCÛɋU•0-Å{« h\$ø.¦°Wíë;lÁbaŽx´‰xo&õÍB&WI-ÆG?! Tš+³¢@,iáÔ,B…3;ĄX”Àwǟ֛Uˆ„ù -®«•¼ª±øXmm»&`Í5J¢”œM~âxÿVüYa÷ÃFŸ ŸÒ½O•ûFþ¨ïÖI(j år^ôL"SLÃPƾ"ÅÄ*B¥©t0,LÉ¡ 'bQ™é!Ã1 »âGX”éá驋¾$t­y—]P²0à–‡D,8ÿÂ…=ƒöMv£$@#M·úR${"œè0Ä¿ø•e…X,Eњ3¿‰­ ýŠÓ­›ß¡%!IÇÎÔµ°m$Üöá*®Õ¸EÕ^ö¨˜b‘pg¦iÓ®€QWÏI‹„¼[¡¯@HŠV2±@¬jhø¼ILˆG.Q¦¯©®Zþè.S$B,ÎCC¼;Cìá±ù˜‹ZyÛÈCE‚%¬Ü‹~2·à!;[b4÷è7J@€Ê8ø\$ӏgp‰¤H¸Xbn¡ŽXÿÿ×á¯Ç $zÙA,<ŸæÿpÓÄÂFgZˆy C, ¤\;Keί=‚…t›;kÀåAa€X$-w Äb$vа¼œ*ò¿Óæé%c±pCv±nA,°Ã(2¿¸y +•-µfa¡5¢åí@,Ì0ð%.KםKüש~Ž@ƒ‚ɳ$GØÇÍڽĮs6ƸìƒGX½ð1Rë7:7@,0 °Õ8´Ñ6BäKk¤;úžíªêÿd#ÐVZ¯þ`ã „XÜ¿—ÚW:@5²lUу¼³ É"ÌÒoÂÞù³)±}(À +`8j‹ =ÿÞ'äŒ`ŠÍ”›œÏ`p6˜b¡-Ð +©@µ«³(¦·õó£ÞA,–8U…<Œ4zÈʏY{҄¤±(o&ï¤baǪ„á7¶yTŒ@JêGbÍ%ô÷ œ+bž7@}֋ðÓ&Äâ…/ºmìA,ö•Õã–dª½ŽêŸ”iTgCÄbæW3'“BW1ÂÙH¥^W^QÅ" ¤ºÒ¶Š²e_6šüœ™:¯JP1B°4«Ÿ¯‰ _5‚$¿0q´Ú@.@,xs5ŸÑ!Š?,–¸"\UYkTŒ z¢Ûk™Dîä6‹VŒ°cá3S” Å åØ!yòÀ™&‘€X¨ø¨õºÉUŒÀØ<ǒ\‡9 £ò†q*°?ûTÈLç¹ß‘ÓSÁ#ð¨Üb,ÃÇúaq·àÒò7Wڝ¡Uv–QíÄ eQ±jêJù‡ÅgîÖ¶¶Tø9›…b„  ˜N—j#(¶¯Á–³ Ý^ý®RŒDª ¡aŠ”É‹Þ+–÷aaO`žÉzn]>,æÖ×ü¶½F1(cW&#›‚ã0ù° ¤—T¶\6TÜ +Ú¥AÁøª­‡ ¬Ù´:¹h}IUB©3¿Lr !"h§¡péö ´C1ÉMh¸ÅŠJ×^¼Eìú®³?,"~² €ËX8‰ôúÃbéôîÂêÿͤ!ö Ø1ñS¢b„<·ARw¶¥ÿUŒÐN1ÔofByÃbšh;IqX)­CØØÄ2#q÷¾aa†.½)©Eø¾°j¡BÓÔÈÚ'5d¡Ò¡Ÿä‡ÔÞÙ @üFÙt»7,® Q¸3 Í-7,'X+—|ÁµÌ #‡9[!ZÊ¿€·àqX°â­uü8,Ò$#k¨ù fÒÃ^L$Tä À[ˆ·/ÂÎ;kÁrò !³‡f= U—ûî,/9,ÀD½¥ žÂq%€œAn×]ŽêÑmv‡Eç‹\-†GZûù7=S0ÙÏ[H„¦°òe ·ÀõaqFqt& +á"̏±š\»³¦;‡Å/K@¾š£¿$ÉOÇØԃD!²¥•CÚꩄéa±‡‹áóÏØAA"С*×üèJև…¬¯rt7:ó‰´óG„o¸…äüΟ*VmW±¶iÿˆ@-ºO6½Qè£„¿  ˆÅ¨$gt–¸Ý×qË*Ȫ/½+ñt@"Pv>Gw_ ·Dºk¥ÚÊ3q Óԙ΃“Y ¡ŸµJ§Ñú<&ZH¸c‚ÑāX`º&I…ÙÍÛ H)†;ü‡…«d[:êˆSXphQwcOþ°è[¯„Ç=” .vKe‰ýa‘%™-íúaqwÚNňu·Ø8{|.=,ƒÙ`äÞ?þëÎhÇkŒî«æ 9ö†Z3ù¢{X¼äôòØlÇ¡ëwIô†½“‡Ånà܂’D†/A"`‘Œ+ÂHq'kÆzt÷gáy²NEb¡æûòY;æx;yXÞ#þðG„\~6 s&wÎ?"dDABí³ü$$=$Bºá‹Í0Pœ¢¡?¼Ê ¤‡¤ô`%µkï°°AÈîáZ°vX\1lÍJÍ +$Bƒ¼¼6ö#Â]ÁW­þ÷­šp•ø=,D¸\_§ñė<,ª¦}hóâì°à¢CØ°|>ðyhÎ)Ûßa±/u«\QÉó½çŠV¡ËFÐíäچ끋sc6>§-T(¥<€1 ¾è­íÑ‹(,UõŽ“&õ/Å?Þ6·PŒOX…|–qMÉ~|áÃbºá"$õaaŠ%¯)IˆðDý9y˜JPåcƒX”Úþƒ©‘w vç<p¤ö[Û¨nº3"(P'¥ÿ«Â3±˜¾UchE€XXéw‹†UÛÃZ{x'Ɨ)÷”o†B„Ô…äÑY؞Ónà6ãGiÁºB[ ÔqßTÍo’ý°àº8é`#¼…ÈÛ¯ßP‚bÜì!… "Ì{‰Ä’Æˆ½nçÚÇ-)DPC,iï”ÒŽBB˜®ýÃ"UXzãqZ??,@;àQ)FKñ♬$…Õª îEɃ֫׆© £¦¾ê™¹œ1ùº NŸÆέÓF’‹–ÁÈâ¼âBëlRbÇ~Å?y<,&ED;,f!•Ç"Š.”eóÙÿ6Ø>ÛWˆ€+„}­Ãb臕G˜ˆP1(l¨Ãâñ·ÃÂYwq%Žó;ÜÀqajEzXøU¢Xk¿e¯õ°À5’óòÓ™R!B!1ZÉ_ò ‰;;¶50Û;c=,”öøÞ¢ÃàÓâ ËAÀ¿Šë¤°Xw.] úoC;»3¡ÛT©¨óÜÃbœ€êfÓÌgî+D OUÿq–--tªÑâY!B‹™ü<1˜ÌHþ:,òhÌè‘Q¶Ubõ2¯Bg«aéËV“nžæ7w3b¦ÃB €sJ~‰Œ_¨:÷Ù»Ñ.T!‚"" ߟEš +¦u}´¥æÎâ째•Ã¢!~æÓ`X¾¢B„ž‹Ñ[p\;Ó^¤+Dø6ÑR8”?Ÿb ­î ¼À²È1Ú(/'éLƒ`°sXèÌ·+Û`úÿ_a…ȍ‚ÖÕ܃>…9,x?ø¡ÚÍ6Ía!V(gãâªêVéL P@„(ü¯‹k‘ëŽ Œd@`_ëãNRW2[­vÜ!0ەòƒ¦`°$Ãbbø‰*61 ‹ÒUƒø8,"¸‡¹G𨠔Õ!¨º#0Zš‘pBìÂaq¨dQ¯`ÏeÕ!üVêpÔä™Ãà¾Bï#Ët>‡\Û¡”WuÔ?¿Ð{Ö·iuŠK/_L°VÞK]Pƒ:äE7,ìk7trˆúÄúh©½ zû>ŒWÆC2Tb£„£Å×°xûD!’UçƒövmÀÖAu;l{>+?&SOt2’¸ûb†Ò´î¾"'¢pÃÂE§Ÿ|á îü™ÉnôÊûrІàÒÅyâr>„ EXÝgau¢ä;É C˜¯†0ù!Ó} ¸ŠÎ ΛÈGìÑÜj”%`‚4p<Ô«!Ðæ2’‹¥…¨ÃÆô×*;Mó +¬¸Âî×0/ê°0 Sc9Íò|²È¶qRÔXChºUáÍ3lŽVénAXCÐ*"j‘Ç`õ×[ûölÞ°†@S$oßüG!hÃiä«!,è*ãBn˜VChUP ´˜I˜ÿ~5.‰wׇgœ×eÝWðWCª€[žä‚ŒªÔÆåЬ矩â +wC( ®Ñä‘šc¶õxÍÒPøuÏvX@œ‹Ú4:,N°—ó!ù†¯s\¾Ó½À*íB J†¼?Oø»Žà¨ÃB «!+03òn¦îž{;+\9„Âa˚e³·Ö0°rÒ¥Åaq£VãJ”“*»a!³‘Ój Z _–„~â¶q÷ÊÖnX°ÇH½á왍g´|@Þ°è +ÿ¸KÇ=ïH÷ˆ¨1ŽÞ°8#º”L·”€k̗ íâ9oX°š—×+\|È ÃÚï*ƒÃâ*Óȳ Ð*ò‡E¦­í’ãŽ.xÓ²4 ¨q§ÅáìëÇsâKªœÑb «¿>wÃÂîJˆÙ Âö‚à´y Fт°²£Ó¶WTÜ° Sa›œY“*Íç +gž¯£X[&lX#K„qXt'T’:_7䰐òÃ_¢’K¼ÍàW‘ÅœÃbdr— õ_è)Ÿ6‡¦#8‡…r±ˆ'yS(o§FŠ\, ®=mÝôÜ3ƒÞL^>#¢1ÈÇ/?ÿA +lÊôD0óèJ‡S<Û܉ä=–pˆ®›F‹)–¬*ö í°@ßØЍƏùò +Uûv~wXxëŒ]ôå‡1©­„û^ÍqP‡÷³¯:‡6§7xËîÓXéV*Co‡;¸gس;QÂ{¼Šg;,È4¡J'ÓfgXÛìÄñt|‹Ïg³–VöpÄ±æ° (uꐝ’P­›Däñ=ÂÀŽ…Éeÿ{µš>{¯!nBCRâbÅHrX̜£5YÍa‘Ž\Ï1(36óT&•¹Ù4뷀Ç##&@,Hèæ°È±eŸ‰ªðΊnÁpž3›S|9,ônZb}¯øB*oXܒx ?sh({¦8èï õ,„e¾YòU]±~øÃbTéÚ|LÈ°XÛ1,¢Í)Ar ,•~$Üdš=é%‹Ô ‹P4òÚyp¬¹?9ÁÚGJ/,TL êhrÈ0,¶·°.Å5³uqMqÐìkæQßZz°&ÎD{¢K­¾c†…ÆöÖQå–Îé +×`XŒù÷R®w{; 7²ýœóÂ#´1Ɋ…Cš5"àÆ{ øQ³óçl +.©w¢¯ˆ›sa‘¸Ð˜F–Îi1æïqWLeÑ),,‚âI‡h#xÍħO›+Ú%Û,·4<€Èϼ±Ë……ß Lþé«Í……÷³cG܍ÛY­A–PtюàÁîÁQ¸0m· ‘G75œ˜BÈ+ ýó@=°ÀÇac¨Chê 5 3J$ÂMTÌï`¡§fa ¶7)…Ú ‹:òËòyGÌfa‘Å9Eâ†E[añìw1W82Zãi©Âb LԞÐ.#æ\¸Õޝ'#x……ù ‹¼vÐgw¹?Çh>§»¬-,>Ð󷱅…” M5ä+ÔW6põ§ú-B ‹&Ñû‚ýt¶°Á¼á‰WW֐8Q Y€)(½:ˆÃB­J‹„-,‚:(ë wfêÀæ´VèÀ$)ÏeXX 0’%P™Ú©…E»_ìJ³öÿ}hÝ6ùj#܇H#ƒý"¤ƒ!Ñg©ja± ÀBÂIŽ7Ñ­¦fn}·-,5|É3<²Š²Kê:J °¬ž|aÉÎA¾Øν 0ÎÁÖÕ±!2üŸÀzܵ9­½……Ü'ù—a=%ÇI%É0Èû¤fYó\_!¼DZXм£^ Յ‡±›ó4'çagÐ^añŸNCz°u[¬¤Ìٌ/,&‡iá^¤Ô°%¾°ðÿZ-¤s0_Xt=á㙀¿´ ‹G5PdŽî³$~ÇÄUh÷^Ѓ˜$l^Xð!'ÔX–zH~VNe¹fžN×LpÈVìBR¾´ÁØr²ÇÜrŒª>_XœËA`eÏÓ]Xxk†YÒGÛ7ˆ~PBèÔ ªdX< Ä˝}gv9¾ÁšÁÙV˽$ÁÂñŸaqÍY´3a†PÞ`¯qù&5,•Ë]Ÿ-(xI‰gêËÆXµUÃÂ}#Œ±AÁ—ðCq”+Ô7ó'o¬inXüMb¦ågjgïÒ³aõ›pXL×iƒ1í Ž9Ž9³Ié±Óßó¢¹I â@(qX\ì “\Û …fsìâÊo”~›§øb”5!ʇŸÌ àÛóíTTK;l8ÀŽÈÐ>ž<0X6,T– Î:wd¤‚ºÇlQ ‡ÇÏ?¹"HczŒwöGXûŠØ Ý –ã³LâröBØ †» ça] +œrÞ¢jXÌJú}$Æg¦†¸$v?‚ëL…Æô€Æ´u×@ÃŤ‰¯4òüxĸkpJ_¤õv¸k€FmZÆRtè®ÁbúIþ"Œgœµ¥s­ÚVâôÀ3ç¼Xâ ‹ŸÙÉI‡Ì¿]|êr…þíew ¶Kм†S@ vfÐÙhÑÙ¦lÕÂåøÈ£Á$Yõ®A ”m]¸ +(’ïx‚ȱwæ,ª†EàÕ×±¡t©¦*ÂؼkЖ9™ˆ5Mì>”5P…’š-úºOŹaᵇê‚c’5õL†8M¦zëñ +’¦pXP‚Áѓ|#kðáO±o»a!”¿ÔÀ>Ù5¾]ªh¥ª2².Ìüx=R¿nXp~R@‰O8–¾a‘Û^þexÃÂI®D­rÃbÔ-‚;j/ÈÈD¾ 6\N‰È$×è­|‹ÍèÀ÷z„ߏ7i™Þ_‘º'ÙÇßçBÖ@Rð`A¨6,xJé,€{½Ü:åß°Ÿ5,yóÙ\*§ ▟ +„Ö°Ðꤥ2ÿôœN«ÛºÉ#¶MˆÉ®ÝH»P ‹ñ¾íÒã>wÙeó.(GXøfè¹k°h2‚Å#¼ú¿D¼4û°/³}ñÈKg¾"ê^A=–R½B„yEW'©î\±ÚòòcW„;ÌðºBRë8¼uë +#ñm6¥ÚWS®Ä‹'Wü ¯NqE¥ÀYà­à%^z[‘NˆÙ +gÁ]+zªUO榖7âE³wyï/fù)ß$^²Âëb†+„+^ùU0$¼4¯"U]'€Wq¨ª¯F®À ¼©bÑX…¢è6÷ªÀ1&¶õKƒ÷fU4TUñ UñSEÀ£ŠÒn3êMÓPELâ>ü¸ûÊ¢S¾]_Saá1š?—RÁ– +˜žT©¸zT€‘FʼnÜWTÀöÛ6U찄 +2|™¡b¼ B*Y¨˜ð"†¢Ï]×ÅÔ§8“¤nŸã/КB=QÈNáZaA§ˆîº\§Ÿ•ÛtÛà¿%û.A‡Ûê´)̦àA5Å54»îr˜)ªyLAÁ1…Dï’ S /Å8—"O-Å7_¨wCa)€ô®KQ¦ë*֋³KRd×]kS +ÆÔLé]$I¨MÖ9;)`™Ám®OJ +CQ·-H +Xw-.Rt8¸ ,R¸¬HA¬»ø )Ìh vxs™|å@ ÅÜ!Ä©ë7Gƒx‚#äáUlD—™QÌb¼xI¬/|Š×q/L1¹Íê¢8|²`‹Â +Nx™O²D‘%^¾E´ñB=ì¡ÐÊ¡ $^ø4£‰—†‚é +E¡Š·"syP<ŠW™A„Ž—²‚‚YñRGP„5P(£94•ö6ø?aOñûÂö•ÑGaâU_x‘âǙ /z @Eñ¦ãå×zä'¢§ñ†r¼h.—xù Rœðòz‰×ª/?3•xÁP5”»¢‰—0 /êñ²ðbžâ…ÙÄÛ1«]+4y­l0¯]§ó*ÅÐkVû”žœ×ëÛíÕ­r¯2™ïµž…¯Ã_s}ù)Ð×õ¨¯ÍǾv5»¯Z¿"ñ¼æ—jUë׋¾_ãÒ~ùµEý×Ë°ìð¬ 0ÅR¼0»>`vVݘ"ëÀö‰`øûÄÒƒx«Æ:€À1 6ÝÔ`ß­ÁVmò샫ÇQ›-ºÃ_ÿÀ ÷ ÜGœôJu +ә*¬³;ë  {²Å°79ÃÞv +58lúö÷‰Lé0õðñ]Ý·pçp:~Lƒå4L“3l"~"7ÅîØå8‰Y &VªÕ‘³â'Àsö‰‰\¡OÌ21WÇ4InW,ëøu[úžÁæ{OÀë.6+ï‰çĘLƨÜÎ`¥1’÷Ä6³+8»1.Iûus¬%Ö±ö|ÇV†»u|lì=Î GwOd0Ê {>UÃAŽïQÿÑ ٔÃÈ®TŽh!Yã[’Y’J¶uOäÖ‡¸;6@Vo9Xä@!t[Ídg÷DïMöêžhǓÙô%PÆݳ ÷„P¦‡@¢L8IDí´òžˆ‡&Êb2›HRÓDÛ1ØIϬ‘1€›22ºôžà\5eÈXlÊ*URV;Q6ŽDÛ±¼ã=a Q–ï$PFÑ ûNÖLzß½›Œtkqùäí³~Oj“9ƒÌ͔àW›,Õð́OœÚêáa§MÜ«?JGÍÒ/DÅÇÄcídøz¯ë KOhu2á<±ÉÞ扮$q$y‚‘x!à º» ÝN -™©ì¹N„Nè”NL-8pÉçQÍÍ [¼Ë‰û.91Ó%ƒÂqBGœ8Q7“¡Â‰Q&Sœ@u¶éU¹“o*ëÈddH¾ Ó&ï&&ë¤Lô¦JÖm"—Ú„uÙǜ84aJ㵓}®‰{°&È©“Q¿šX¤I»šX+5±§‰))MH⤉_Ióىùâëd 2я7RÊL0Äe‚Çë$y+|‚¶“= m²Þ˜(p1ñÉd~‰‰æe2Ïaâ:a‚AÁ'˜xn20Ñâ‰Mô/Á±¿æ-9œZ8l2/A&qv‰³t‰•D&Ç%Bß$Ådhm k‰rM–HI³Ä±É¤#Kt^ñ°.-5›Ì Y"Ý&û‡%Üv²ò+±u2©+A¶DZ]­Ó¢“ÁR%´N&I* +©„ý~Jä6% 6™ÕR¢g(W™í÷ò x&IJìJùF 7‰øJh”àÖdþ“ÞNÝ“X ؁77 Ä?®$¤}ɬýç +™°;/@Òö¤œ„ø'³Ü$bšDnÊ$d"e†Á$`4eÞ- HêJâ¸7%±÷ž$ÎQY¯$ÎHB$I|öH̱ÊXŽ„3DíÐHà‘`´"Ál"ñ6* GDçÈË£²n‡’Ên [e¼ÚÊ0keµkç+ë™ø{eÜ›•Õ*$8ܪÌPÁ!ɍ«²$¡•ÙHk½²H«Ëö +‰Še‹pÒg·j´ +‰R +»k,C)$P¯ mE^F!%T,“ŒÎ2ÕË-w)$$še*‰ Ä\Ý!$Î2¯âÄÀD7úYF`Š‚’–áZ@¢Àä?¢R?#ì#Òã#Xµç©Ú#žÎ²˜Z˾帳GD’qz”µÌÜO5ËäwDAÛGë*’Ž0lŽhIŽà§›M‘#¤JŽ<9B¬I,ET±ìlQÇËlí•!则ñ:(à•­½XÆ@,Ë]Å2©A7ËÌÆå4Ú¢Ž¬?´T²"–yGHs±¬gx‹ûƒ#­¬ ôÊ*Ë°bkÀWflŽe˜ eQ¡÷-\Ȉ +šf™x¶L(Ð).;Ôq÷p(o¬-Q\–]á2¸,#Ž(âZ&9:¸¬—t8â‘. ¤8Šº G~Ñ¿.c»Œ7êq˜8Â5(qDéÉw\>±Ëü%qÄqD>#îÆzÙwûËdf0K«ÃŒµ±¿˜Ùm ³…lD[#n)³(5…Ì P1;3cАÆX¢™ý2"*§ÙrQöjKFH°™Ž 0䚙°\šƒ¶±%“›A¼ˆ·öfÅãsˆ}oF/bٌœ.iœ!|‹ØQ$'±Â¸fO€ÄŸ³“fñ\ÉAbF°3ö]’îÌɊ€†gBª¶æ™+ÚS=“>E$ôž=9˜¶Q„}– EÐø™iOD@öåD”h$M„` 0`P,׃¤ûÿ Ùï9 +m‰pu -%1thV;" í—ÑÞD³)"R@D°V´üBÄz[‡9’„W E£IþÐ8Úq>D×£™ê!²AÚ a‰¡Œ4û:¨¤MÎ!úµ¥%D}T#IBè!žjZþvV­ÓÂj×û^›·VóŠ¢åA ˆÕƒ€©«Ùv±ƒÈù՜qCm$‡5”!æ0G¥ÃäùmÞÅ`²FAˆ‚è@¦ŠÂœ|Ö¸ wÔZ.Á[s8A¤nm: ¢n¸FAÈ0פ °ºæ偐âç]ÓÎ@”Ÿ×9¥¬ «ìN7¹¨@Œ Øüˆ”`۔@ÔHØÐ ‚–é@Z.4‰þ'±A_@è[lׄ«˜Óåà^5sñcó 2|:üruzˆ'#9bŒ²!ú”µlúP͞ ¶Ù’øÄÎÆËÿl)A´}#Òöy£i«TR[!hµEðªµéø ½6Ìml›Ë³ sl[v‡Ûd¦nK˼•ÿ°ç·éׂ‰ÿ w¸¹¤‹Ûݐ«ÏDþCŠ7ÔXÜ"VÜÎâqz›ÿ0ˆÿÀUÇMÜ&7CÚYö^þƒïò˒å­µ)7>Qnu¹óòèÜä3Ñ­,šn„þÃÌê†ß¯×ü•vsù¡ånä÷nO¿»Kj¼ò’åmÄðöç­D¨·ÎÀÞUîí-Â7Ž–oÉD}sÉÝ7%þ#æ7õ~ßAñe¼ö;bh3™““¬]-eiÿý!ÑúCþæãý ˆøƒ0Žîoüîð²P.ÐúAÏå Çüÿ&+üðŒïä¹ +€³«}À€;Ä>tœÏúpõÁIG€>5P1ò:œ•U>Lõ—ƒug¢©vcéo®ß +nù@¯!8Äo—ªßE>ô3$MZÚ¥ÇoÕý75«ßڋB>Hë·½è²ßøÇ‡ÓÇú ãBvä7òŽ¢XàtüÖÞJûõøˆq +I·oâãUéªä[…9àùßvwôoòíeKcùàêÀ7âk"ùÆ)ò-U€|qáòø¶‹ñ +ù°åñ Ô7pè¾å¦¾-ŒîÛ.{ß*J$òÁÐ}£.uA ù`º¹šßF‘Ŏê¬Ìeò¡|2“´¸¾N¡þðäƒ$ú{PÊož~ÌðPæœÕ´kµžDÍ{Ƒ¼‡V¥ö~{J¼‡þî·äßo“ýx™ç7_ݔ”ßöÇ/n}èx¼õ›­¦¿¥ÔKÍ÷ÊÄ­8AÎ!¸ñyüõú fOp±z\—9¸Íá¦ïn‹)\¹pÅ© ·å=¸¹á*ºÃuNþpÞ¼‡«C\<ƒh¸Ù:gâÍ«ö ë=L|‹½‡i7œ+xqI‘qѽÞ3ÎTظ–Ž«†:nÃ÷à¼÷‚qbïaä!ȵȉOcÃ¬Ø ä ùÂrSï¡;´÷€EœBá{—²8-cE§^È)YE®g—εè\ã¾²™Ô˜aÃzpþ‘+¶ +H.‰i±SþG´Ê÷PšJŒ(±¤ 9ø݃H ×»*9L"“'a²¹.XrüéA/cÁ½þ¾2˜= r܆=x+¹dZ׃†&§e&ǸL.Èõ˜Ú»¼×õ`ݕdÞLXgrüïéÖq¯ñ•œf€.šuÉi–ÜzH€UUN¬„z0bz J±rl ^ž9#Ñå¶þõ´‡®¦xôÀF=˜kqÆ\ éAþ•+sŸŒeŽò–Qc/ä¡;z8BæˆsS£‡¹ãÐ2s²ìDsËÃCsT­æ”5H@Ïó“)äÿgZo®Íòjœ3 <Ï9•©ß›ÁΑ<¿èá9ùÆCTÏ}.\Àâå˜xÐöçÞŽ.¡ð°:ӂ<ºOÁCkˆÎ'x*ºÀƒ«Œ®»ï0vtº{H¤»âQY”7T9ìàúœcyÿo74IîðŒÓ5p‡Õ¾öÛa˜¾ööv˜KN‡µ”85koxìh±5;¨";$—"CTEÓQP(sëà´Ð-ë`qu`ŒÓ>Õ!óÀ¯ÔaœN:n‹·c)-ÔáF6 u€ˆhôs¢Mò(È<1Hœ.:9tx=¡ Cƒ{:£üjÊ}VW¼Ô°º»ï¸6lx{^uPCy¯a0ÈÀº`±¹Œn ¤âÖÀMu¢NkȪ¦:2Bwa Yáò¤«w¬>¨,ŸXS³ÔP[£„ = %Éià_u’¦!¸ê.0 ·ººWöz±“†m‘†%îÑp¥Ñ€±¢á]†çÏ[Þó5 ·ºA·ŸT£>ÿÏpÕ>vÕ¹Û3€_u›/CõZ‡ÃePúÖé@&ºŽ*ØH¼Ž–É ⦠΀í=]0@¬[;ª_±ãÀ©ÇÎQät²ü4Ìn{‘Á#g—2¬B;Qiä~~ ­J;cCNíNêü¹vQÃ|ÙÎec€zn»ð&7ÞΫu6 Ü!eöwPà pãÅœë,†±kçU1d]wÿ@»ÝeÈØÝÍÐ5 oE½dˆAUéÝUˆÁo{·›“ïR> í;kCÒ·z¸^ƒ*‹íóÿßa1 *ÞÓ, ^¼…a³Á3$a@Žð>† Oß`Èî‚ÁÁ úü¿ž¡àñxü‡g+`ÀF¼-ë˜]¹Í,TÎkÄCá_ñîû¯ xë˜ó †”Ï÷¾1±‡ùI€~çÍôi!Nš¤xM}ÐÙëkõ…ÀX_'ñÀ*ÅÛòœâÅ+ñ^~‰W¢•ÞEˆ·¾¾säVC¼y!ž$3ˆ—Eë âpxt,AµéÙì ¿NNB¼&ñ°Ä3v/Sñ´†‹7ÒÀáœwyáñüŽ·-{!5@Þ×ɤݒÈK#É»•Ù&oËIÊ«Ž½@ÉÊóԈZÞ+‰–—‡½@^ק‹ôøcÞæ?jLR¡y%”sÁî¸óšïÝë˜ï½²Ë°É¼kÔÆðE4ö‚Úÿ´*{¡ JÍ^@`Ú •1=ÏuzÙ õ4ÇRoEöB¨êþ´‰-6•#ö¦×#Ôø²îåÄØÛóªìM5={™|s½·°½ö‚Ó ·WÆ5ËÂ=Èë…e¹ÇÿR÷(ìQïî)7§Þ¼Ç¹^P¾÷~ë?ø½ ¾Ì«à3 ¾õTn7_7ä“ølD‹/߶~|åz%ùž(åÛ~Ëw»^pŒÌ·S›/¿^è±óa/$ùó× ND_3½°‚šð¹SËB^t> +oìã÷-ÏÇû+A:ÛνâTÿ^þx/ȗ} +Ï&;ÝÁzöY³Ñ Ðñ÷xc:ôÂÌ xÜð‚Œöyßè.D©íBìÂÒáºP˜º°U•Öƒ.¨~8^˜Í…Õ4XÕ\è—zD™·½_ą”.¼ý߂„öÉÞB˜líøû+!`r ¯m Z«'çS !E œ[ (®4°v§¸=-œ¯´PÈhá;hAõ,äã, MœPq) + ÷ML'²Ü±€³Ž…G´O±ŒbáIû: ³°Ài°@ŽÏ$a߯@¹H’HW¯À_1|ä +¢ÿ®¨u…Wsâ +çìV @jдO´ÂZ;§}~Y!—Ç +nA)XXa”¯®¤{C9&ícš +ʈÀ*X¯*8@§ +‰÷ žÊì}TÀƒE…Dz ¦;Pá£}¥Oøì“OXB ž}yè`Ï)x¼)àq,jFMa‘Ó¦påRˆ–Âæ°{Rp8)ð*´O›œ¤°#IAu"=´OeZݳoÕÂ9û 8(rÁ2 +qQLQdö 9gšƒöa‹]vçM…èU–ë8xò'°™PÐÓAA‚á +_ P ͟€ŸpÖù€÷„Žê (2OOØêNàãe'HûT' »ÊÐ viŸsBéqBw?¢Nûؾ ¼t%~í­!!Ní3ÃiŸïÙA_Ò>‘lmmB¨6Q^äsþÖ&4ìÓ>xÒ¾õэÑ>DmñUQÎs©hå¤}Ú©£}í + }˜%¹YV#ú¼Ü“몏CsðÈxwçÙGÞX¿i:êadƒö‘ðì[E›PŽ8›@š9å”j6Ax‹¸}Ÿ}:ûéö%’ÁÚìãæ„Z˵BŸS6íìca³¯Ef_þ²o0Êãî¬Ê±4› àªì´ Ÿø&ûî2aÓÓ&°ÇO¡û¯÷Mj…6ÁznÇôj˜„mÙçNˆ²Ï)š\mˆ&°âCə}+4!¸ìû$8e_p²¯ö}<4¡5"!tì#ÈلhB>„&¸¢Å¾uûûâJCì£)ÜßÇ  ½f?¡#hØG¡ à„}+ šð€•^aŸ*4œD:x'CþÞ@²¹aŸù¡ ôB=hv徆}m§|Rh>=Ea/¸žh‚y$bÅ-Áhüž•¡ nŠHۅê®Á˜Eîa_M¾˜@þ4è i4jŒÒHbØ'=ZÝ7aßúE&ˆGú™ðöÕ6LÖLˆÃ2ᯑ M™ðâKý˜`r0Á< „z ìjŒKԖ Œ–ðëG–ÀNìÓð+!7¨±}%ÀŽk%¸ «0qTB XSOìK"%ÌbŸQ/bVw8ÞÊ2«©”ÿ$mcñÕËj"â”øORÛ$°ûž’IØlIø”’°0I $¾‘ð ×H8ƾ²H Ëˆe¯ÏnHhƒ†:­$'…À˜±X"G¨Àƒ=—ñó£'fÎ× #ØG ¾¤Ú™¬<áԌÀ)2 #)W! ±õQQšL(@BBØþk}€Më{'E~”áõê©eî˜#ðÏñÙ x­¯AàW-Òß( ˆŒ>~r 4\ U”@¸´>á€ÐšõiBY.@`€ àümø¾?(Åü°ûe}ZÜOròJþËvÂzÏ}@¢ò*š Y…ÃÚf}ÀöÄɶÛØbé¿dæöQQöÓå›úɦ”+öRÕ#û'샊ևÄÖ¼>¨țXëó{eØNì=Ì|l}çµ>ƒ0©òA´®[Ë€Æ4@!´¾ (žõý©HãL­Ï +ò=iîÁGíÁı¦ ì”Ö·Q)¿Zßö "M;{g2EðQ AØ•Êے’¶X„Û»ÖPîPúÏPöë?Qیæšþ‡ýSîPúCé¥ö?TýQ»ÿC«zB„dfff&˰鵊t·‹Üì"Ÿ|ΠÀ:`M´ ¦šŠfg„Í@eãJ¤0²grÑ° +º~hmGȄ²(ºV /B(Ā€ôÖDöS^?¸€š*p±áãŽrò°:î+3&—…¦ìOdÉ-WÖNy¡;+(ôԂ+²rå† ”Øø±"S^‹Eg×Lú\5€< DŽÏ šÒ &wŒêëYÂðÒ±Dƒkò´^”ËB»iã=·³Ýtçý¤<.¸Ô]@#lÌÎUû-·9EhŸ:ûX¯ÙÃxOßF·Ü[»æ‚U´5ñJîµ_²W¹ iKdK_eæüUfLŸÅ¦ôKhB[´!ì í¨µÉ1wœáôç)NÿYÏ©»xÌmlõw†T©ž°éÏ~J&·Ô®vLökò.¶%¿aeÜ3¨ŒûFføp€ªyÌϓí×ôepAzBä ƒ0£D‹h›A%¤S€B Œtä–4¸zžfÃ!­ëgãé$B! p𔠄>.¨ñy:©é09änr Šb¹¯4`r‹6÷à¯ÚÕý ÿ‹­Ù·Ôš~—ÑV¥†Ü¶zË}ö[ò5 r—ý–:ÌÇÔ]>%ƒ[ö XH}%t0ID`‚ ftÉ-Í®(ëÎhâ8a;fgvF_6´W²Ö17˜&h‰áã‚U&™Û2µ/8c” YIì¨ÝPsÜ9Ø y bŠ²6 ÓI­ªX\êÄâr;‡©%Wô´A5då°"ºÊà”ÛPÙ«zF{‰PT*>ltM솖 T<€˜˜£l=éßÊE¥N`Ç=Äʨ-‰5÷š[T¥:ÈÜ;Àx8]`S#!¨—ÚrÞ­l6€Ú%R °~˜8°ˆ¬"VÊl «©“`-µ46è^ V¹<ßô·ù û +œçÞÚ%u3",­çäo=é/csî,³æÖÖÔU7éßÒ5ùۏÉߝ~Œ¨ßç©Ë~È(`°¹¥õœz‹íø$ƒ3:¹xȨ¡PʃS®ŠáєŠauH•š±=y[RÛA5Ä¢UäÓ1w–ÎÙËܚ|Mn¹ÿ‚Ïߥkö'²å¶æåKĐد£õ¥ÖԾК: ÎÉÏxÐ_ç“N‘p!u­äށU¤ýÀ:finÏ~…sî*”‡é¢½Šá·×›ú$0#” +‡ÄÚìŽúXhPI^CK¬S«ëQ}XڗČ®XBN"^EO¹ SÇ“Û.KV;‚¼zI÷sþ:Tªµ[rK¼”½¬¢&8”LbÊý¤f”1‚B±aE^Dؒ™QK“Sö¬\óo嚿ŠL¹Á-µD"“o©õ8µè~˜\A¡§šÐE:w]é«vH=ÅF„%™ ]a>£¾„ìG[A¦'Š%3|Ì-4€Ph‘DI5 Ž®^²WõŒüIh¯]p@Q€DŒPAˆL#B]OÔ®8¤¿ðn0±~@טQ6æ;î#³ë•§ø冏 ®&ÜR{óA{Y¹u¹µ6¹e/B§ThCúMc#HÑUF”=™·4_“¯Á1÷’˜ÑVƒJ({sò"TBØ°ÜbÇø,] zr¹!µ$4@BÀf ՀɆ'¤‹ýh-ÔaóQ endstream endobj 123 0 obj <>stream +mÖ¶dÒä‘RÎM18ÇD-çnRJ„%/B|P8£©ËðÔrJF)3yr€guj} F)‚Ý5¹'’M 7Õ(EOÊ4ä¢Ó¥œneŽ±ü…B½F)&$J˜öÀÞQU”"j\…lß­¢”ò-º Ü?9§F)$à3ä]<)X”rDù´¢ì"r[”¢ÐI±â럅¢”Í„ŒK¿ZpE)”ˆ„ƒÄ/·E)ºÆ”ô¯æ#U÷¢”Š#QáÉy9pE)ú•XV¡—E)ŠUªý“ª¢Už,ÿ[Ý¢ªDÁ¢”ÅZ +gj²™ÙÝZ£”#¡?SÊœ¢”1æöà&,Ýâó¢”L’Å2)ïTM”2b̶À»"gêÊl¥¤W<Àä)´ñ'Kv 1Þ¡2ý%Ü(Åôl‹ññö—p¼€R†v%¤d¼©u Ç:PŠF™†ÐEÝFJ1« 3[“Ê]8ƒR¾ö@¿G’σ„Jéô + +â¡”œåÔÊMqtJ‰"Q3=……WØöJŠük me-PŠÅKAãk9Œ€R*ìÊfh¼êñ¦:@)²ÝP¡uü¬Ïí ”**¼)”Ã9TŒÔMì–J‰öJ ïSXÝl(%¬PT9+éf†R‚,¶¦DÆÇ\Pʈ±G+6>­¥Œ‘{0fÑ¢tsƒRÀŽo°èx–ƒ P­Œõóz +J1—ÒGª¶ž”òA]v…Ñ~PJj[¸_¡”+Úe€U¨bŒöFB)O€lSþú¹K*ì !·1­®bëëiA)P3íTŒ¢0(%èçÃ5Ü3ÖhPŠ¹YÄoÅR +ÆJé¼Ëkç€'w”‚«º+£é]œéèG¡f÷Ž%(eª9)î UÙ~µÜ£˜Ë"¥Eëcã û#œ*ZbñʑA)“O(c6*æG£T”¢-ay}-@)¬™ñšØÇ R@)}DJ‘Á¸Àz² „H‘d̼8|JÁ^Š#ž¦f]A)ói”ÀÞ$”û°J“JaƒI'MPŠ%ˆÿ¼\b_¡èuìoHšv’.”Ò;>|Q¹H›PJ6ÌRBìƒL ¥8;¢\~(SMdB)•¥s‚c]¹Ts²PJ„‹I_¨†p›¡ºC]…g›bGC(%]>¹ 㺠¥¤þn֘¯B¡¤¸‰ ä¤FH(ŗ„‹½:7K#”"HµêßbÜ:e¡”1“çK“¹Tò„R¶.΢èÁ’»>”²–‚ëmäFpòC)N¹™ÚtPµŽ%JQÙ$îÀÍø¡”&ízˆô]Jº‘J‰ÕÞ¿µ*&ÞP +”•eµÑV!JÙL +y à´ë‡Ri½lBvYœ×›Æ¡”©¤#õf ù8”¢SRà2qðñZ ¥edè0ÿŽ†Rz‘*;ìÒcóî4ª}(¥0›HX˜"D)¯(f3V k!J ¯Êh»11QÊa®ŠD…$c#Ž¥œú¿,¬„o-ç@K`ô®¥$Ú¢Tàg»ž¼åéPʪœˆ›ÏäÅ4l<”¢Ëû·rœ¸%J‰&0QÍv%3 ‹QŠI!xM²åº{Ì,ð5ìŒ(EbéA€rhBZ”Bâ¥D²h=…ò‹RT½òïk£ž½Àâ+à+-¥$MQÞq^ʑ¥.²•‘m ÂKh”‚¼ ۛ,‚,¹½R²üŠaoÀÄÄÁ4J™/vm–„Ø(Eï6’6}Åëc0Ð(EŒòLÔcŸ¯¡QŠCú±§z”¢´ÏãÈ!=Jñô!îu<ÒG)]@Nj+£Àê'y¥@É{®!õæô+ Ô>JI~«w[¿£”DäÛ2éÐG)ö,咉t®[g(ó(• €7B–ÑW݄aØ¿x>½ËÉ$þσï>?½[+.Çà£ÝÒ½~/Y·t%—tKë 4Sᇠ‘”“sl6¤o‹’µ@\B$7<¬ÛâòõÈdI´L[çÑö¢<Ò¢Y‹Õ$‹[9T=14ۂdP~>8k+ѐ–í6,l$Kþ‚H'¤â€ +Ê &‰0 =ß\`LÀS‚-ƃâגÈ¿^ËÒÇÅ®%Ã|ôȵ€zY·°ÃhôxyµSAZ-Ì%a«–U-Kªe-Ž[²+Ê Ü´òJ Å«JäÏÒ)VjôYòÚíY@+åYêΠ6Â/÷ÎYx7†–³ÌÎ.ʛåZŒ\Ú,?˚¥zJ³L6Œ29¶æ­&âlz”FnþeÕª8 ï*K†Vº¯C”`ʓ…Ï0þU’eĞ‚sñåÈR¼¬GŠ,éÉ2dd&%ÈÒêY‡%àJaz­Øt9 û±ðiTÁÿSOb,™æ«š bžYîß´XêÓˊeÁԓbáø—üËq€Å÷Q)±´ÜψeO‘“ß—Lƒã„$rÒ cX°·7x\a‘®ËNX¸Î*C„¥­R à=Æ¥ÁÒ4'P,ü]ø–‹èbÉr`¡˜™¨Wì XROâ'À²–s$ÿ^<õ¢¿Â·±¼_ñ ±„>]ò+W÷H ÜWü?ÏT}EÑaž¿HÄk ³þD† +ØàüGÛ죔Wn (½ŒW¼á¨á•e¡Èw%ž‘ÝÐðÛ®p_fv¥À „°Ðº¸º"Ële§+¼æ—]VF’çJdz6*š+Âçùr…¡JÁ©CLðpãWõiǕÎcYóGqánýzpCaøc…|hdöw±Ò¼&öZ8¬,Á'*ìcƒ•¢¹ªÛ.‹ÿU þ‹†s6x±ÖŽê_*Ì÷^½!UïSËû&+k6©7"ÖTµ +.nïà +^ö¶:²OÃäÊ +r"ÒWáu„½ìUÄė7yć+ˆ™ÛÊ]¥ÐXÁ¨«ä)=˜«¬´¶‚IÎiˆÇ›n!Ïiw<µãg•%qìQVá&ߌ± + Aÿ°ÊqAÕW…WTeéªð½£¼²UQüæOL‡U€Ð—ªÊæ|±LU ‰IT…{Y>šçùï(9ž÷±qS£_M…õu~3•€Š©8èón_]fK%eÉv¥"ÔÕ¡”Š9©´Ö&%•,JŽTVwkvRÁf F*FÞ&21ÐD%Ên¶¯îÉëéÕwŒ ¡ù‘²P.Ӓ„JWªìä ÒÍ,ySPIüóT@nÅG@%wAeþSK?È:Ê>åýó+ùÞñ帧€’ROaY8OIÚZ0ž"{VJ +Ò-ࠌS–Í1#œÂô¥ôߔAƒ¤›²%?p¶)²)ÜDcãJ4¥ó…Ly¦4­ 7SÒ+g™âې$S86PǔN³‚¥˜’Wzp˜²”7ۂ)YæÛå—,Åܐ^J¦t‰²Ká¥XÉ¥ð{Ì-¨ÌÜÔR:ÔH‘Gûτ!?¥Ú®LZJ’P2n„RZ¼£OJ5ó×I™MµIt›°Y3ñ²ïY®ü›bdO&)á;!’z…ŸGJ¢4µ‘²1ÔeŸß*C“祏¢ž=ÊÙyöÓ¹£4“¦Ž²7«œß8¼ÈÅ«B]I£ôÖå3JN#%~„ѤŒÂ5?€Æ(ò £ðÑ¥MPe'.M)Eé\V²(ŵ IsE¹ÄL|ª(ÉÎ%*QPÌ÷è‰rkzpœñø§Y‚(3ð—ŠžÒë¡h£0Æ› +Yr(ÀÆk_7ŁF-ŗÊz9ÌPx-H– +ëRŠÊîyZ(ãIË +èLŸ•Bi,Gye;¶MœP&ž×¶¹Û:d¾êÞ¥¿EõyàêÊR:X'6A‰7ME2矜;4µ@á‘SÐ\|I ‡õˆJ:ùP™‰"”Rr’sÜ$> ªu½#;ܞèXaµ%ͱ><ÐQul~Â=BüT%Ç÷I–ù6iŸ€_Ñ\Ÿd™ô üŠ·óIV©ŒòÉJ1pŸ(³­q%a“ÅôdYŽA¢'ÌKÂϓUˆ+¤y’7¾4Ë Ê%O8kã­HðD,A²ùwºw +¥Ùà.Ü ÇTävÒɬ€ÔNò,-,é-šä_OÆͧåu¨[¸PдNîueuÂA*4Itže–ÓI&]§t"‚Å…pÌÜúåB€»©œwÊäôULG“lK©´Ç‰Tl"®Æ‰Âì$úéþ’pr!h`õƒ“NÉMà¤ÿ~þ&ƒW“…µDlo²à€ò&\ò÷ÔÝâ«ìS7ÉétmDB ÒÀÍJ +Sýψ•M¬AτazC ³fÉ}Ï$øý(ȁE_ôÇeÛì£LMnہ^¢&¿ åiÂ1,Uiš´>è¥Iõ*ÿ¤‰W½Œ£‰”îmATuÎH‚ïÙ¤cfµò3É"?hz&pº²3á0 õə$þü› ð.þŘ.qÔéØV%¿˜×ñ*NYˆ!R®‹ZþMÿ.òûà|L†åÒ1ÙozËÆÄûYɘ´‘ÊÌr1Á ‘TL0cc‰É¦‹d“DL$1¦[&«;l*5Lø݀&dI˜p“ª%“Þפ*˜ìg`r”x&ܿ҄Ñ}}»N¾„k¡ÜKÏ)ŠÔKðDJîNŠy )U*ñ’õæò.9˔v Óų.i9é’-ó£r.L±”KpB +1—x'M¸¤o_¾%›Â˜è–è¡(ïٖ|Á&[å/גlùS-§Ÿi ‡f-É?0Ïj–ðʲ¤­q·Q²díGǒ99بû zH÷7šØÏù†GóV¢Û8¢û%‚5b±’£i¢„G\G’¸§Pâ&€Ÿ<¢õãT"MžºTrA¶ÇHDª}Š› ¹úÍù°ùù6%ýò‡o¢”'ÉY²bGõ&akš”€Ê„Á‘¢ùÕ£â 6JXë>.J + J 3³}‡)…þúÌ $õÜ2-PÒH`^íýI²$ÜÒ_ˆ—ïÐÜI +ΒÎê$‰Ç#CòŔæ$_šRcÓ3Ž)òʼnÄÍõí;’ZÔD¹&K”þª)Z?3dBœÚ¹Û%ç.È®[MÌô°œ%’1W6Ó!Ô0ZÄ 5$j¼ð/Y›(ñ$ؘ=HËó3O$Ú#ɦ‡ˆ?G&_a,3D×óއþâî‚_Ê)N“$Ž~,I8€ƒ2I’é؅q$¹OOÑ·IH{·y IÆl•Øœ ‰ÑÂüHȖ”‰¬pz²#Q—˜þɑ,’#š ïüÙ©‘.SIw„=#é¢Üa¨`.Xæ^:ï)Öô0§RPRß-WYÆýW¥©«ÐåHš÷Wtn4/¯*—Kន•h/Üe@ù°b»A¢·œêŸT¦çÛ_ü|of¨³¿vàE°DÇ>'űà,›åM£h8„,UÍõÈU’™ƒ_ÿñ[ò”à"ÍaKS²ý1J壠ģÕôŽŒsEâhô=ðÜQ•ü¶ðŤßöԌ’‹V6 Ogî#Õ¨>wzF5´ô·¹yÊòX_Îáò!nˆ E7Sz°í2öà ·s:{N©Ÿà +µ«#NWàK'&HÐÏì §^ýßÄè3_¦ùr&î‡Ây”‘"¡LNÐ ¬Ð#müî;LZ )¸<§KŒ‹²=xiÒÁŒ`ž17‚ÛÕ·'£¢lBV“ÖÃB‘OÔÆÔÐ'¹H¹ÅœÂÚµ`þ“<†3°¨•*ÏI ‚ÑMµ1@Osb¿õƒÍÝá—L Æ"C)åÞ+ÁñÓø)º"ôd(Táó~8>ÅxÚq¶¹|–ufŽlŒ.Ä!ÌKò|à´HH(¤n·|¥öó½2*g.«Ó¢ý:´öP t +”ò9bƒyõ©Týñ(à}fó¶wµòKH|yº×hÞæz:'oö’)Žª´œi/Bl±oG¶ª g' ?3ˆe_ä.[^*lò…`߶ᥳ́§è­º‘ÜRM0ŽØíá¡5…:ÉYD´‡ˆêþ®ätµd Æ^­0ϧÜG8/CG¿„ª7¹#[ìG-qØknØk O\\MI96µúœovð$Wv2ÁI„@Cً…8ÐØÂðFL«ü<â óö^JD(Ýf/ÄöçÍÈȄ*m&Œk‰jïn] {ÙæÖ,R¬¸þ‹¡t?'šy Í·¤AˆÈ²ïéVJ—SQQ‚[Ñg3åÁei`ýʆÒJ×oÒL¶N_Šƒ9þy²Õ\Ûõ •öK¢Ý­jRäK *ך1êð#÷搕‚qïSÒƒOBHɱ“Ðî`x2–çk’ËiÙ NF%iǽÇáÆɘºÖøýàó'y“ahøRp=Àæ*2^¾—‚™zãÈÐ#&òJFöÛîkm¬%c]5>˜óhW%ƒc"Ý&!Eº%#oˆhѶé‘1 LÕå<Á”Ã×ý&“T“~}Çõ]§Q‘4\í†Ã1Rl6¬Dòê™h2ªà P[“ÛÁÉ(wÞ°îÿÎiuþÉ`¡¼Vw#J*)'嗼¤/…½ «r‡i@˜´rr0º|–]m5°Ÿ¯ÜÁl +á&µãm‹ Ê`z¦‘»cHG·ˆeð{ ƒÊwg=VBà[ºŽUm¥h‡“Q{†Zש ¼ïá¢õ·®Ô9-N»JJ¸HL§œ*¤§'Õä˒˴ÿϬQ¡C€ÉS‰ +n–âhɗÙÝVŽ|7&ú¹ƒ +oj¢Þ’YVǞLcÕÒ¢”¤ —Ç¡g)G¬ä̺×Ƃ@äî€҆í >¸ò–e^yâÃP;GρRé‰X®åÁÒ¥™æù¿å—6_sçÙʆ¥œŒ³h¢œÖؓLrV†ÜO@†™®UÕHgØ +svÞ5ò7^$¥ŠÉZ:`€»qoW²‚¯L³ A4ç4(%°) n°ý»CQL)×òátüà)Á½l ø6ȜN`ApÂUŒ hw†ÝTˆ‘9ûš@E™+Tm•'«1Ìeï!™â@Û…r&¶ögºzA†ÅZ ƒ3´~[9ÁLÖ/Ü개ڔù«­ùaÿ9ìéJWcUbq{ߨ§m[¼ñ»+b›Œ¥駏 +·&Æ ÓŠÿîöRBk™uI‰;g]…¥a¼;R˜ðž‚dÈ?ê™~¨Ó›Í” ?#ÃecáøÌÈnÆ­ñåƌ”Ê—q)H’[/.¿¤3¯|—a3XgKûA¡¯ÈÎ[@J›Éoܙ¸µmB ÿÆ܄õ™ŸŒ-Uš *aÌ&–swʝ…ôÊ!bbý è“ÓNÅrØÈwmßݱ2@Ø>áÇ©éR³Þxµ½¼úéÐVr•qzÔgVõ%GªxT iK<: =¼[&[§7Ö¿èm•*" {6¶““jrª=È/CxtbÙV-ï~BðMG¶g2ÊíJ@s'^{å‹ã­¥ßÞA㣖ú<¢¾Y$Asíå€t¯ßÀôÃÕ s£L 5WÀÒM ãP‚;}-ÉÅ€4‹ì/(Û¢iœ©·²mšžøEáŒ^_ŸˆMYJÑÁ2ãp¶ØŒÈô‹Ó ƒ«’Ø1¾F]œˆr^x¤áN¯Š#T3šU#Pj<Øàd3rFkþjf- ù¥tÓßm¬£j’x»…lÀö¼fl¦‡î¥Ú¡¹=çtÙ¢ˆHýo}uµ¼o$?‡ ½ÚL «u'Z\§Å.lÒÒI¼¦¦*,šÏ²—sû.%q01Úã£" ‹Œ-ÞDÐ`ôJ˜Jc +#櫌¼ôÕb“eBòjÎxtÆ3î„„d'ÅcûK wŽ|×|7Iðfél€Aן.-,}§Éw®aß%™¶úq1åí}$²ar´N˜ü/U8‘~…HQÿD?îƒK¯70îïp®ˆ´ï/Ë?íüêaïÑá|DÁoü·>Œpx®jÙ.% ŸZ§cñ+ˆ ÉºÁQ2Ӑäø¾Œ*¶¡c¶ˆÑ/•½_‹+õÅÔU”+šMbÊ(ïÁ1zµ;¶¿S˜GК+Âf­–+Ôm#{¤Ã±1ÕÓÑ/œ2J\ÄåpÂ°CŽâRš5Z½&T‡ ³ñJ A„xŠPÅ3¥vÁÑX³ZàÖ̔‰ue?f՚-FØ/ ,<áwªQÊíL\u)ë½bìÁÎáP§œM«Ve~Z©©’¾hÙ¶0ôIm +ÕhmÄ¥ ùž”>¦þyýûX]HVQ\·QKB¦Dñ)jØ%:ØÒÂP±»|:–*e!ÇZñ=&H±FB’©™\:òŸ´ñž1I µdÕː®|ƒ—q`s Vˆz* h +ÎL3ƝÀ+–ÂŒ+âEJn×¼Š¨w_9Ôf¦ 0Ö2¢1ݜAÿKK:„}mR]Ð4ò¶¿ŒÖêñ¥mlɤŒÐJNv5NÉû\a·tFbZ±šäù„É¡›F«Âb2q5U}Uho§ +-jªv×À[õ-‰ù³¹r9ÁudÙ5`ÖU…­ªAÝäd3‘Û˜|VôC ÷­â¤!q=dÔÑ5F©ðvdÕ-ûø¯¸ŠÁÓßÅ yc/Q¼£õ>FâË$1B×±À§%4,üY1@8­=ù^$7ÑÖÜ{Ô„¼@€6Fg'ìõÝ!5Ãǘ1•uÔi·;ë£úALáaªüÈ×«Ü níãß`ŸíL‘ˆŠ©m¢†€JӞYŸUµâ0jgÔpÚª>Q +¨Fç +*Š8g™ÙÅÒÙMEW}Z>«aÇ}qÃeüUܗ>Œ/ïî?¹vXÍè΄ç…Ï!v=¨-µ¨VJg‚×Î)HÁºœž»PçÏ`.·¿À;ÙÒLŠ˜ä|sK¸dC50ùw2ÚA8ønšµ"&|ƒ‡¸úe1¡9x˜¿OyÆæÅÞíÉÝ8aÁs/w ®K¦e›¶´›ú"IÏê½ÖL1Ê bÂp7Að“hºtFû†A«ŸE +§—ÀʛG)G•¸vþI¸àf)INS¨ `‡”¶ü!Nxg9 ÅFÊù²Lô^λ3ˆ÷3 ñV•€@R+XÝó®Œ_WË(ÜçÏÙ%þí~l§•ËͦêF]°Kæ×ËG ;f$*΍L“ÑR5€þ)ëã øöHí~飑õBJìk[ðˆe¿i†½R؄˜asâöp\W’æõtÊI…‘˧¹x=fYŽ †å³ â7ô=³~˜°ˈç¹Õ®§ÙS¹þmWN¶n˜£GaÃ[—«”¹²žŒ.ž”W6CoXÁ:ðqà_ÈV÷u§!pÈ4O¼Óå’A‚!OOÔqĈ¥€Œ“µy»ÜVNÕ ø3âÂýi†æ!Ã~´%©ôÌÂØ.ñß +üaF#¡u;²ùEe}jkjŒ˜'v90ElÝ>¦ó°Aw³îbéDW¸S W «¶¢Hˆ¸‰ ýi ÀŽÐP61ߟ÷é‚ÔçeºFA䘠à ´>…ÙHp4\äfäéªá¤¡¿5U‰¼Ø»0ъãù6øc³˜(„À@§v$KkúJÏMˆÊ¹0Sv΅ }Ä£iäk4é’t•}êùÌ*bfÉÔtî'Æ°FÜè¹W;µ ‰›ÖÝÎoãFÄ» ®ï°M}ƒpq¥^GWsùâa“þ»süχ¦¥jÙvWãÚ&žç4j#S%xcéY7Þ 0#ž<§Ò©'. ;Ö[aèñ Ƴ1]¬ .W/I((P'2 ì{Eˆ¼³ž”öú‘¢£æ}  ³Õ)$̓em(… 5=²f¨ÃaqõÀ é‘5éQY4E¯ £!ÞÙô°Õã“g$£W\ꙵZÒZQNLG¨'hÔx3E%í+3Îgµš·ÕÔÌØFKŠã†N@voË]¬*ס€;Zy›Ùü؁¬Ž«XKÓP9aÎD+ò>r|ZDª W–ݘÏ-ÄI›(ÜÆÔ»r¦ýÖ7ä`¨Õ2í܏¨ýÃÈvK•&½9¦WÐò35°+j5@‰üÍzÊõe±‘» Á‰î¼x©‚HëwÍZ!Uèš;ŒýMî.Ó¶•^׈ èŒSy|“6Ö¾~ÍïóªáÀŽ_ê„÷rRsA®uBԏý–©s »#©1;$èYœ=+vëz' lª¶ °S'ÎË>ã„^·E/sµ­æ"M†`´286©ÂÜ°{j€o!v*/#Q¬;TK‹ERxíí… ÓQ¹/œxc õ¢ÛÓA\Ç´Î +mÝqúé÷C,uZÜWRšB ‰è½€ê½ŸB«Ô‰O®|ÞïÕ*côL¯ØmœV!’3-<þC0‘‹B‹÷W‹¯Fç›pj'5·õ’ÓÙÄ^êDáì2Bž6ö(ý«fAõ?^Akw6݊{V²ó«w€šÑٜÈi÷Û 93ÄUKUtÙ­ò,zÝ "ÊõP$uâ [#_Q°¸õ í¨áSK{™¥9RÊ»ÿ&‹;E + Òª I™´àBßú»ˆgÒ'À™ Ÿx`’‹Fó†ÈÇÕzW¥îÚ±ìŸR.¨Ê7é¦eÍuGDVF6i^‘,…§œ G*Ó6ù?ÃB‘†Hêp€×¡æçiƒa8%º–‡.aÆP°œX¸A°éÖc#W!_7©ý87­‹ž÷ÃéXÿ[nۆàƒÛºs:}‡ÿ•Y@¼Úwƒ,ݾӋóÔåâÄ¿8-G;Ñl1Î +cx°=ðÿYÍ+µ÷J^#Ðã3\Н­üY{…Š4Ë8¡9+Z¶æã´õÕå¡ï,hߤ…ì{‚}„«Žî0¤(ºœOa›jþû …e¯Q;! +´†$Ú\+ÍnÕ½G𒼠¢€|^HŠM:émé]W~·Z’/6L¦_Ý‹£iÞ£cQEZæ7!Ý +Q–òÿ³FQ”˜µŸÒ•֌UîY:©GSk_4G(³\4ig\ãéD–…›aœÕ_ð´jaŸ‚´ëF®kIe„‰´3ãå¼k1²2hK¤G" ˜\Œ èHž Ci1Þ¹ƒó”É¥‰$K2%éÅIJ< ‹{õc¡l2#&þ7ÉÑÝdώ‹J¾æ"|¥$–‘"ªÓ›ÚþùßWë¤NLrͬ: &’vèÀ ¥´š0*ìÏ¥J”ɸÍxå«ö8Á„K¾áDDrâþ [ï™éJr"mOZ»š2ÛE2&…:ª Û‚Éýü¼ý5="Ëö󑬈ö‘/a€c»s|É”„-À5&¸È!5yÌjݲ<¨_s‡m\fÕfO—Ø: ?Û2.Ÿ‘\„“+‘®‚®qùËa=4৹©RL—Oóä7{ÆU]Ⲑá}˜ºr¶?âB?»Q'Ò¦UV\P ¤â ©ÅXħᒫ¿@w³êç·÷Ã¥¼ä•©¹}P ÛÞS­äÂÿ®Ô+²¡ä‡ÍŽêDÊá"Чõ`Ԛ…]¸d´‹23Ov[=—ÀiŠŠ…icáòíTÍo,;±>ƒå±cå[JÖìOZ¸l®_<‡ýlá2’?Å e +X‡ &x§6Hý ³p™ñ,ú¦pÇueh:wç)Òu*ÂNn4ÅOº®ïÙ;QU.9áÂú@dêÃÉ9.üï¯/sž.ŽÉô+éÅâMLÂÅQ3\¸CšõxPá#k1%9áâpËî/­ÂÅ)ž@ƒ‰f·Yߙ(2|As劁âÒ08·(ÿ%–3)L9i˜'•‹)(ɒDI²x9çñ´|dcŸ®lØÔ]“ù?3 +ÅQYgtÙ¬ZǚèŠÄÌå”)<î&“Œ&ÄLr8E ±¤ïŒé«  dò{ürŠ“þÉO8rÅډ¦Léÿ¾è„͹Û3ÕåözŸÈYù‚‡IUp$(ÈÚiãè²pv(›(Œ 8[,·tïXÃ/2²©Q÷-ÛÚ¡hÓæ{ãÆ&é2»9èNcÒ¯]TÖÑdy,Þh·"vŠ…,R,Ñú)L)ôn7“˜¦H c®'rŠ=hö̕¢‚ƒœF.?/癩æFQk µ×îCªvÚû|‘h—-Àù6u¡À}"¶è[Êæ­ÇïxpÒI©ªé0Ðå¼í×9Ý m™Š¸c•©CÊì\oœ9wÊAD=Š½‘òë’Ü)ˆE»ørÛk®÷ÍsÝ҇~ˆƹhëçs=ØÌ)yéÛRæT + Ë€b"«<O¨"à|=iքÔêܤ!3ÓäY¾–—ÐÂ|ûj­tËØ|XÙ9¬p"í8…ZIΑw:)hÚÞ'š™7…P6ǟ J;,²ä¤mؓ ?ß4_HRL\Ð`•¹ˆ€GááccˆnÄL‚(Ë~ˆ–È¥PiykºjÔmù#2ÄsÄÿÕÏ"í„Ô×ÎyÖ*×ùlÀ”ý´$:‹‚Ì&äÇ&G¨x90°~&L1€[¢ßu:¾Ž§Hª\¹lQZ`NÂtL[ã½¢iU`¾þ_b @Jåȋ9ÅfD~Ñ øžœ~DÚ &®f%ᡘr'hšsï8âP#æ§Ä7–~Žž +5ÑÝ$þñºËÜ©þ6E_ öIWˆçF¦9çUܧg¹Fò‡3ÄgåoIýµ\Qs‘/’v¤OÚsb~AÑænJpS¸#ÐJ'’_ˉæàU+–-o(»‰îJœÁä +dOKÆ…Õ ªß¾Â®-¬¶H ÜÇ`•PØSç] ÔhÐB=žG9›ÙýõQl*–Uæ{Ž2¯£Z±˜Ò×BP¦mÀ">òŸ°nµ Ë{n“bñX8µ¨W9XTWÈà‰jŠý4M>¸˜E£ÔWùµÏmÊ0Ü >fmMrÃ/5´2°”ÏJD¸Ù­…é›Ñ¤O°o!b¯šfTbÔék±rŸ^ñ)2q䧫Ëö)¡Ÿ\×_J“ÐÃб@.oX¿³¸I©ÊnÿPüžQ€d¾åäù3Êë>“š¦“˜Œmšò¯ñN»„(é\E€m·‹C‰£ú"(u8;8>Û¥/¦úç®êfGvÙ¨LI% ´T¹Î ïÞÍÐPÉ'ÜfŽLK°hŽþêß²Ð*rôMô©G½ìN@ñ!ÍÊö“WÚ,g ›?â¬P€°£+å7²·OၴL$¡.–pŸ’.l_• œt,r&"â:ˆ,ˆˆA)G?ŸÅD”V¨™—”&æP¯Ï^µø»c/9(­,kØ?"Þý6ƒ’ÉöäÆñš#¾a(2U©¯PrbYA*ÞÜt:n¢.Q55ÝdÝVéˆ¥}Ó×ë#HØ=* ¹d ç¥~?#c‡gÛÀ/9¬wÆÞ¡f¦Ù“IÚ`Ÿt¹ë܆<Ñ]Xf¤ü’ÆAvç kë­_5—c+-3ÅÛ¾:â Ũ](P…ªëÿyÉø¤A=xÛ±¾QAö ü‹ Ï:ÍÐ8&~ŸC<|þê՜G"Rp…ƒœoâøòö±èwoExÈi>!yã3E˜`;|·.ªcñ‡m3ѧµ *4V¸Eåé•^À?ßnÛ’ô–yjï‡NLâàb­»’æ`¨\yYjÜFA=»|Ÿ9É<€Ê얄ƒ!¥Bðï>OâZ=ŽOõРñöÜ`†O¶çc`Û¶“/™>y¯x=@_×H´‡ýÄ_“Xÿìv¥½qjO¥L£€5Š¦ã·‘÷WoJhى…Ž¿ç8´î箟«,4PSP@€~>'Š ÀMª^Ct¼Å÷?Hhi¾1)Ì{¾o9ÌFM‹ú¨«¼ÄÛMý"ÐXB~V¢â?ŠÉl¦•˜PûùÏ4ŒQF†,%2U’ˆÓ¬êHIè-°döÁ9¥±–½Ù‹‚Û«U$!C/´²3™â_l’',DoR»úÇÐ,–Ýæ îÊg[köOÚ¡hdÀ¹Ž4­øÞd—žèñ„¤o‚U÷`w”ÁËÌÁ +°2¼EÄKq +pӄé ÒoÖCÓ°pt|ß!t™ 9„ +GçTÕԉáƒíÝùòvlä"ôÄ45Ò&õòú º›Û­ÄàÉÇ?¡¥Àn¢Ð£©ÍQ2R›Üé.P‰mq á—´öi¬EiT’yçûŽÁ¾:ۚ—S«)j¼ +²èÊûÄ ]0ŸN£ +%ÅM´óÚÂÙXHç¯a€¤’f°‰¯› —ípnÞývÔi¯D%tà19`:V*J9©EH8a¸Þž¼ãõ4՟RjYÊGgé¹c,k'$5ö0_Ç"šiBØ4hÝhћ ógÙ/ÉU)º½ÿ5éÃxÊÇâhéqƒùäh/±xøk›ª6𠥛¹Óî>Ñð¬Ç~˜`Ü÷¡!Ø°2/ü0kû.©î"L³V»0Ϝ©>KVä"ŸvÆÍ>uÐUæá6¹çjñaþV]·v…ÇJMO÷Õì³~4ºoU™O _wv)Çø‹ý1’©”B§Êâ<“ïÔ +Eû¸Iè„\ô¨òŽ[ôjóÒî»POjb‡ŒLÈ Ðܳ7ÅÕ ¡ ÿɊd-2nÀrƒ +ÌF%ÉÁ ;è6bêÜ>Ö`HlÇ ÊEäZ’x™›TD~¾­k<}þ%f2jªT(íՒú%‚ ;oàïâJƒ@¨å4´E)î&Æ!ƒz¨çá×Ú¨¿Ûl­7à#š™;›© ãñsBKK:•ÕSB¬C‰í±\LX€0–‚`Օ1˜×F÷d/Z+^ž;¸ÍŽÄNFªìÅ]ô'oÇ%‰Jh4o3}ê9WÉé5’šñ~L¥sÑk¶ŽA>3…Eà‘EÍ\h«¤eÇLğMKךjóf€/®þ z\²' &aÚ¥á­YEn…Q˜z{îå ʾ'9ڃ±|5Uq~ÕbÑ ÷¡Øq +Æ̬#6=Ô¤ô[i —\°”ÔaŸú¸Q@üò“"ø±†2×ëRì'þ¶õI`p]&¢#{­iL8 +Ÿ¹•Ðÿ¼‰þ/¡{6¤ôÔ cgéQ@ +œ³‚m‹§$,øÃÞLŒµ)d: «ÝËúöéVûUëãS9ððY^m®7O\¹>•ê+†^oúö$Dœ÷~Ŭ ,l¾ëC4‹"Ùdû©–&ˆPYnӏ0²´ò¥ƒ”êu˜Ù>:ÖiˆÌhN‰Cáš*“™üه¼ÏåÀ­®€tÖÐU'ú•g¸ù¥ ¥É°Èèï*›…¥7” P_PÂ&/ºý}ÜUÓ°‡üƒ»Ì +—(£­ïˆ‹à† ›ÌeN7E©m”ر Đbؿদ‘ ?…~E$ĐR*¥ž=@™9~h‚ÐÙ¡ø°%kLŒS³ýD\‘Ý0éI> ÆÜ¢„ÎLýݍ¿Ñe™À ØzvŒh›‘÷óš§+墂 v±s'Ùjxì ú®Ù„Æ$Ò×ÓXºe•0їàuË_3Tjòæg $Ÿ,±‡͘Î~ÜœkN´†:]H[Q ïç$‘Š),; „cž” I1æÅò5-_°ôP¯Á€û¹«öå²W>¥¼ïˆ#‰—à\ +˜XQ>aÿëä +Œ¹ ë®r‰÷žh´šMîB®[֏ý¸mfE?»ë‡‡÷ÃRª_—–óáãF—ð"_©ùÃPSßs¬Pë¢~]qˆµ2j”›ˆFކfÈ3c^ÆVc‘SH¿Ã©ÔîЍq«H)Æy…GdƒBëjböG@zÎ4”Ü¡¡.<{¼/½§«ï‰ð‚XyXÃé§ øT g­ÙµI0tô#ØO¸Ì҆õON‹îß± H¹ÖñTjÔÞiaL[Iám“/‘‰ÒØBZ: ¦ù|ÜÐÒ_[KÀoÀȨ¦» fK«fíN–‘"=6”!^¿Ð̏¶†ˆ¾O*¼¾šÆ©w"<ž…Ùr”Ç¿b='TæïèÏLýzY^1j/ÄEº·åG +«[U Ê TƒäþŒ·*G m§ùËJÿ™ O~ó–^il»ÆŽfia x/äMe—OÙÖç¨X.»QˆzʼnÏþLÑ^)©5³f8˜ö]V)fdW2+7ÌLBðЪ0ú¬Ç’]@ß ¦E0w + š\>{­DQ/e{3vÏÇ%•ûqÒ¥2–—¤ˆ ³#%:çª}í¹— %c}ƒ‡¡Öôša$jò¾è \eRi¾ADsr÷{QàÞWÅÓŒà°nõ—Òœ¹(]—‘qP–Õ¶ÛHk1*ž%ƒ)€me‰Tø52l.÷íœuӜdz”²ôhK7:V$â†ɄlT5„kü²Æê¾XLÜÖº¸%P£‰Óåô˜J6NaÓYh‘äš¾ÙëÂÍïɏa¿ž0‘Iݕim^,QB'ˆéqB!»K‹µrp-¥’0Y–!€¾ÁÅËÔ~~³;ì:¯p®.níH—»ö¶i›Cs!ë›ÁQ~Ï[ô‘àçÊsÅí-Dÿ6Ø ü 䵨zÚï@Þ*…ïÝLìÿ +ˆ†Zï/#öôcïk&„B’UÉ^b‰©ybÝ®„„¼ +>Ý«I…ixL˜P†]¯Y7Hzr;ùV]E˂b}ÐÔÎò/¡gãæ¼Ð6’œèB$Vœ#›vÊ\ãÕ…EöR%˜‹•Áî7À9Ú„Øŀ™Ë)—´&j¦ÊŽQ¯…<®L”Ö ´æqUŰƒ÷œÄ•£B·àØš~L‘–î¦níôM`+.ÔÅèãÝŃÄK–@§ÿœuêê¥H¾ç?й¿è:17üLÂ]yØ6NÌ^‰z†92ìG¨^wV-L3µsà˜ÐlF@—<Ÿ„/!þ* G +¹*&¶M¥YzÑhx´ñB\ë?ˆ%« +¢ä:ÔS;äB2irè£LXK¨èʽaÂa!$|²çàˆ$_ª5î;‹’äU€¡ +•:å÷­±;¾ ¶èpØÇ»]VÝLUÝ҆|V;ïX…¦å{WK•IYص‰3Nû4HͱÍ0±ãE[ÍÉSø#ª·$4óúkŽüCTŠXÖF:CB!8õÇU+¤ o¤]°—Úk-œ£ð;xù‰äS­}d ¾-‡•é]hÇ&l%;U!N­?Ÿ¬‰¢Ø ÆC²MÀg¨@YE­3 ò©èr"’¾"€åâjžs¶æ/óq»mù;Ô[¬D©2ԋšïÛQ­AuÉ£b[ +˅?ú "{!n7g7Ò¼ +5HïPèa¯G 陵{×e+™ “.¬ÝØÅNSE& f÷J™çüïÁÊ«e™ŒRR(ÐRW°^Š¡8 -j : ÏbV½b§fݽü«S÷%1*Ð1/æw[2tÿcåIœK·6í”Ë;Ð+oRÜƝTb4š¯@ÝS2ÃÔ*S½ÜLaH•:TôÒäM +_§iOpfQ—¿ | æMúpÚ%R2»Ø”Êú 8É˕«—z¹Ía|ñ6!Æ_€ŠHƒ‚/BH^lPÙª¸yæÁr +Hí8¦v웣ãó·ޝ2Ƈz‡µ¼ïÝé±iÐä€iIg£7±‘£ÜÈ0N¨˜\{ +­ÂóªÍ®ôÞúØJ"G'õ˜û\ëÚogï(}%n¾+œ=bôí`# z¾¤dEˆØ!| µ+ +Åj ôJ¤ã’ׂfŠwN Lâ¬r\þP§7qÁ “¾ö÷æåV^×ã™ÌÀðÀ áT¼šp„Œ]kã?ùӐü˜<ø$Í‘Àjíeÿôr®jjAâé‹Ð¸G1Gåz3Hå;Rú +“ –ú»¢‚±¡SànÁ"S¢ÜÆIºR[¯֏\Kɽ‚lë¦".sAj½iß³ óYéºRØCÑÐ@i,­Cœ¥N^HTûÓ˙Ký¹©º9ªÓùû¸òÇ|¯‰)m^²»YøhéIp¤ |àNÿsŸ@%ƒí%#:<+ÎJ|bË°ÅB)&ÀŠ=¥«°ñ˜§Qè&،Ñ2;ƞ ûòÌ,hâ}ŠÁ6™–Ä 6ílca%,&?ƒ­§!b_‘E›Úü©„‚YÙÿÒQê¬WÎ¥VÎ%ªkvÈa†YџˆiPMæ ë¡­BN“„ØŸŽÖœÁçéƒxù“ÒfO À<çÌûx¶…›ÃºPèÎÔ½çXÑÙÿ¼¬ûéetiëِÄhÍå Õoc[@9õrÂVî[‹8(E+îÔ{Z0¼ÓG9úI•‹ÒÉ/¬ˆãŠ„¸h+•ÝäOËØ°g’}Âi2O}¾ ­ ݀‘ñÖ&ÿ[šÝk<±£Ç +™Þ¡‹Àðé`c:Ñ?§žÊ>T„äòÐG§‡à‡jQð µãÉæ¯ "á)7²òZ6\!*ð |$\ò{§¤{aLݱðŠ<ÆCZ“µœºq^ï¥ç,¿¦Fèò¼Ì«PÄä×ôdºI @zl‚éÐåZÊw +zÑG¥&‰pÈræEoDZãú²É>š­è 0-+=Pv7ûNÇú²&˜õûg»×^e™`B…¼žVêF‰6Nø@àŽ÷åÔy¥‚áÝåáIcúƁnIåsèàB&À®]ꔠ¸l˜ß °äܳ,ñm'ÑГA #´ÄÁ»l$ícmªH.MnhŒŒ<™gÓc['“°rÂ{‘þÀÜ ˜Û;ò%–Y-ÔttʇðD&äù³褂·oSCȵ/´†$ʾð²Ôšzÿ NâX¸*¢Ô¿û×@1ç…;V …†Ízá-À 8hª:æËü¤7%§§"FØ5˜ônL U­yŠK ʌŒœ;á}à—oôå =ž\YŒÐé0²æ®xó·ûô‹8èÁ§£…ïp½ï~ÓºóâD§œhŸúr þ +v–ñŽáujº™Ç8֌=˜¦fŒkZ¬¡ø9ÊPë !Ë&ØRÎómæ~šFƒ‘o÷?ž08ð:Á™§©.¢€§È/SÁýf"ºÈÄ'f¼ŸÇR¿7¥M$m¡󇮈–ÄþS4½õéXAðߧþ\ý°O_³{ÑHLPáFÌæmìMòL]k,­i«½ù€é¦ ô6AB.¬Vj?…Më !GÞà¢ÞlÅ0ãÏyý *Á“‹ªbç½'x´qá9ƒYîCò3íV°\5¬#hÓ·*Õºå-S™ñÅã–ab4A½/0ÝM˜[n¡@ŒüJbµ ý‘fÊÏÀ¥f©*]fáã  -WâzÙw]>ð»* óŽÁ!w`•Óט2HÁ=–ì±]÷Qðzçn²\?6ÞR#βŠ”Q¨5撜1[Ǻ|×ËXA'%wÀEãñ`¸›\öØ??[ÀÀ~có5ÜRˆŒxÍÒ·¿äFÍ{œ›èÚåîàòD'@`2-ï¿ þýXxL¹{ô$#Ëäó]Û}+bª`ÌßGTÄÄE¹Ãí9•Ï‰ÜÛ%y» ÑÆ>Ký;?É4í{hBW;:o`J£¼¥YÈ¡×0ÃÇ ú¾ªg¦$á–—¨¶ÄȘv´hÇ۫樒 +þÆ¿Y'är +ˆ 6þ† ®u…dß\¯¶bá !ÒÛþHÌíªY`;•–Êڐü’ ¸ÌÂî(¶n§¤ðƒÙ \°_b¾?F)zýs" Ï ‘øü^IæEq\:*{_Jnåƒ'Çæ϶‚GCcÛ.Õg£Ùc[lþ×h„Š‹‹KÂâf¼„щymë™eBèˆrû$h¹¶êÛ,Lß=Á’M’:qhÐe…¼a^—¨öcׅ®i7݀‹…v÷øLë;§ÎÁ·ó7U-Q1 ¬©†·¤7c6K½W/ô€R•#+;'­’$0Є¶‚îª.±üèf$XÎq!ޔcrŸ’¸Óús̪‰ G×@÷áâz>¨:õëN*7‹òkƒì²¶ ‚¹i ®²Ë¥µK¯6üAf²åMèR~×æ9©~ô»‘^¢•“ëx ;e­ïëùäA$>“OÓÚPƒ ¸ÓÜHÉ3qXýÑX/rQPѝ ç¹6<ï’œ\>öT½¥ÞX™r½ç{x4U|6AŠ€iû©%à +Rˆ'×{¨›«ƒSrT;ÛñP›¦½Ñ|Ã؏^fò¯YÉþñ11 ŽAXè´ý%d˜ŸE‘j°ï§[Ì¿€*t¶»ã]¿ÁŒDIޓɃ3ƒ€,ÑôfÃ^ހY#ŒD $yÒOª¸ÌL-G²ê3ìlˆ„¬ +È +.\»ÙÉfZÜécÛ¿z ø/–"è„R±Ð þšÒ˜|e°Í)|lDÕÕ@Y˜'•Hƒdu€˜v¸ðÃìb¨Ép%r40{¹Ïi9æï $JWVŒ´A#'4’ѹ)šûck~êëWè? X_4%¦Ÿ™DPÜ àå™Rý¥¯Œ¹š”@ ºKâ¹22AíWš[SSR’¤Ž™5}ÿ„T=ŹzO¹ºÎ0OˆH°@}3 ðuÇLÊkõU­ñPoâzÆ2B=³„37C”ìÆѐèˆét:N͋¢¢)n‘P% ;¬“›T(¼Ã©£²Á2¬Â9D«*:««*¨UY=yµ^U3«ÙȘå™%ÚÑFAgwtgCî +Wr÷ëoƒF´ÁAcaA[ Q˜k=¿·³øãÒÏÇø÷þwüñìÅßÿÿ>J"šá°Ê j"⤥²pyÄLÌl6ñ²ßúФÏb[#âa}µÚ/õ¢…fhI»ÇØ> ý݉hºr3¼-·Í‰£§cûxûxûö Oô[©Êu¡ÖµC®*^›­¼ö¾Y“g\Ќk²Ð “m6f3;ÑN]ygH;í£¨ôúU ӐR0Æ#Ú¤Vî7BH088:@6H"LÌ¡Œ!CF030ˆ^ÖwÌqîƒCüýöÀÀ9葢¤ï¬X _h‰¿ÀãYÀ%yéiX¨¬ÿƒ“jóÎh('¬k÷Ç©i^8f(,˜GðñJàù›XY=öGáéã⯌1u ꎅ@³ ìˆÊ˜(|Á›¹þ…6}NB‰êa¶`žŠVÐS‹#”mãMao7S@Òyký{ÕN‘‘z€Ín€;‘o7öØPZ. y,d{:L$ŽVéœs*,¦!§³kmÂgÝ?JV$, î–câﹶKÌ$fÅ¡ÂyõTC8TzBôðìƖ˜÷TÞàQ»q*ŠAùë&N Ôj²—L*‚NG$/r÷J¬¶ëX +JI¿2wï)6n9Ñþª½Hz^gÑP–v•® ‡up‡u÷)ឈP”÷4 ;Úcà“-WœÌîYH§^QZÀnqíšs "h[PÁ0ʍ‰H›dF‘"Ö¹†|Û b‡¿ #æ; €V=ΙB2LÑæK*y¿FLÕ?~ÑÕx$aâN¸|¤¸ññL,Wøb"t¼ÐºçGD]+“éð2‘'ÊôLÞ Z`Ü0»¿¢@´ ۀz—ß.(l¹s(èïdN¤E2~¬ 6G*)¸‹‡e¡,êàæ;‘ë\ç,çäéáȬ‹ú$8_uI1²mQ‰œN;&›øBw_p–tͱûÒך››{R^ö´´…yÆÞ@šöâüìx<›sílæQ³|ÉV!­¬1!°Ôé%˞¥Xtrj)Óp?¦î¬¢X Gå%Sº5«>.:)¨:æâ­iÊõh‘0.UÁ'K~î¹gBægG—BFq ˜ÄWñoȃT™Aƒ5 Q(Êσ8ïڒýÜå]¿eItÂjˆÙÞ!Ax¹ÜÜó¶+]Ér6ŽMÊ)R ¦8Îa-‘Õ§$ID™#Cúôž"U­p‰ÐcP©dÐÁ¶U{o„ôw›FŽ .Ư|¾°uN„F-Ӗ=¬¬0XÿtÌ2^øTà_?É$gÊá’É]±Ãë´é­ÂþÖ-ÑMÁŁýp6ÿ°þ#õ(ŒëÛoŸ^¡sèŠZ䷁Ÿ-°õ–Ì^kªeó‚bJãu™Œ)–: ՒŽFÕ^æfµ“$A*@¨H³¤ncGi±™ æàܒ؈&-¶-q+fqwښ ¾Iς–tèÎug"šOCöÐ xíŗ¤^vFÓaJÌñ– Xc*lH–³o|—a&œ?^7eSÏÅÃÎé3_†GÞ- Yc¬~ȣކ纴©–Á~»û/‹^7N®æÃjsoeL©7ÜZ›H<±«B"”}"eð +V=—ØúÔæ¬WÚY§jÂì¥Ç¯~~—DFEô`àÖ¶ÀuKãA/™ÉKŽiý~ôÝ%!Ydx;Z8åj}8 ]°Kb%u‰£Ü¸ .]"0X3¼I½IgðcSÂÄ®¼1:=?!ÚP™ 3]“i1KÄ({y֕…8'aøÙT…í(Ö{¦O<®Š÷é“[†°kBÂDú%7¿WΑ„伆+†á +‘É{ýTô}%T‚9d¿¿ÖhCÿªíÌJ6/t8]é:ÀÂ'زí*”ÁÌ~Lÿ µv<Ґ´—ìáç㐓Y¥Ì‡Tì¡üh7dAlC¢è}QC¢Â A{g‘™÷ôȨr#A‘ÅÓ©ž†ì…âê-ÿM}D¬ ¦@d’¢öÎIVÔê^ãû58rX­o—Jî”_6D Êìp„~PWîëuƕZ"á\Çp’ AÏÖJ×üƒhCVÍBߞì£×",neèÑؖ_Ò8Ùâ ñUÀ½bfq!Se 1–Ó…(Ÿ\´(-„…p ¾VäGy…8“Aî3Sðj!/ž‚ÜӁx@ºË£ìÂy=lÀ…ÔGɬš( ©—] ­½‡v0¤>{/ªÁz®úÌÞÞ§_'=‘a#ԔKçB á P7$ÔIý،Õ*I¤0I=o:÷'w&Ý +5q‚ ‘¥x@Ÿ÷¬.Ô¯,ô&‚ àŽS“Ü– œºpSéZì±ßPáMWY£^0€?Þá|çI ¯‹³¿]å5¾Bø[À’‹b¨Ýæ»´åÅoÕªNò};ǸM˜©Üi"[¡.n岝Ìɶ„‡í‘‰KF_׶?„T³Žt€Ï´D1eÙ$zb´›Ýls†uø†È¯}¶épɱšvÝáRDÐÿAw¼&íÁ˜0fØ*Q9.'ià[ÀLói¢æàk!àÒºiºQ,ÿÐ((­4²_#Hb˜‚oÀ%úSޕÑudŒˆ{Û0iâ{;µ>®^ÿ :‰.#ŽK³žþV¬,Ž&l'ŗÀ¨øy +SbŸ‹¡Š`HSì8%\ZCÆ Of$ø¿#ná#@ ‘¨c'8.Õ¶‰%Xþ’«y^c;=GâO£R„U¿C4Ð4«ð=.«Âå”mzڟ¹ÒôŒ¶Ê}ˆCƒbU‚/x¢á€1’Ãòx[h7FÑE¤BˆhçSL(.~0oÄ!7"9S'®ìMU¬°lÊ©ä浦s–%"mzÃä!W EYÁü­6ZzÍ31]Z3»Ó’ÓHÂvj¢»PzCwI .YÝ&~{xÞŽÉ ýÞUÕºI(ùF@cEìÏ‹¼ý|8ӝ:a"ïzàÀÏ}²×qÌøׅãk@00ÍÙäCc{ZE1Qa÷w`ª(Û£·P ~u.\Ar}ž–.þš¯ô•nò⬾uÞ×ý=?ߋ¢|\ßH+<㎪çîâgOì+ôÂ$Eìtûy|’áSܓ+;¶†¤o$Zð݁„ šRµ3¢iÿ¨úIUÂIQqùšúù?ëV¸I:I}ýŠtå¦>ãÝ‹X +=½™àp¯ãŠ¼6²ˆ@ >d›¡-·l§wL(|•°‚¢[†òى±¹P7ÓºqžBfv!…Oµ!ߺÁ þçÓù2qôwjˆÐž3ºBEOk­^ 8 “As™Wgs`Ý¢Ù¥ªµÄ b¥¨òÚrJÆ Âöɲ©¨`wˆoø +LK eÏðÄÂÔL·Õ¼{•µsê~<ÁC}J ќ¿žîÊ@2ëé/ž*‹dάñb†¼†cúGTTmƒoô®ñm×¢`?*03\ï ¶PÓPB @<5ƳèÉ8ì!3-|åÔ%+£·z¯¿.ìê +L.kº†ÝµQ² Gš²vX&1…A2 kÒ á%rú˜ýý1élq’ì@J¤¤ªgkJ9ÊZðƒ)άÌ%USvM3C¦¼ð’ÛdŸhZ…P4‹¢ÜÅS+¹½¬–PŽ$)¶lN‡]i¬ÕIÅÖûUüh€ÞK}YZ y|͗-֛e•åÎYêo…MSœ¾°%fL·ÛŽ:ÿœ{”½ªWI>EyGàQk¬ÿâ€*,±ä¨!ò˜x*Z\Ðü:>Ã{²xÐ€¶àôà̪}¸{ug©Uy.ݟk‘§jì½­D¼XÆĬæ5ŽU]ÕG2Re|Ú²GÒ=NšzDE¦«ƒJϐŠõš,HÀ~0•¶žx\IØש5äŽù ÐFâï£ël=Ê>â T~“ÄnÀÜø?` {Ž'x+˜+\ȁƒÛÒor;#&»g¼Ÿ”hKM™·ç*Dõ¼òèÿ؊€¤Œ'TØ`±ÃÜ´÷ÑÝæ‘@á—:Æã¾=v’ –øpÔ&m×æX…øëšäqûZÈ6ˆ +p<î0Á¯QHOŠ²ÉýÀ–¶ °Ûk÷2Çêþø ŒL¢£xÛãÅÙãƒï°†ˆkÖ »*ûµG… óðKGAKߞþc`¨ÇrE·]Î48á +È!¶F—QMÝËyæM M$ˆÌ dSÈñ«Žìù¨ÒÛêÈãP±4¡˜¢šëÑÇGá룽Döò_‹Ày}ႝHÐlÝ­äÞ1it àHºC3õœøir²yò-‚Wö‰ØWíŠíÉ ˆ£½“ÐxÍ驅T+@ñ헐z÷Kž%þmÄR ¹S3°»¶èÇ=Þ¿ÇÀ§„XÕíLë€6axÄbö]ß ] ҋ)ŽÒm+Ÿß^EsÊ —!“¯”ñ°èz®z€Š:`eücZ\¸¹ÒƒLX²à¨‘ e¦Ägä4Gç/Zí‹ 4%z£‘j{Áà\4ñÊLä×snáãl©IK®Wq" ådû¢ÄÐ ¢ €_¸ï9þÙf Å&zˆY})z$;Säô•sñeç\úÙø5„»QI£cIÃgÉJ³§ñ¿{ª.8–pÊÿ)Á¦¶Ehèt´ÅYõEß2“)îˆoìž +™ðø­•ÚQ”¿æîH^”äA2°¬•Ø®Ô(KHn1M²…hbÒ¸ ‚Áãù4X3;º¼ö'ïԃ‹òz9…xêø0$\rƒèÍÄ&„j‘vœÊV ù[GžS +u(Åð ò§R@ÔÛâVÎ`þ,y#ŸM3P[S¸Fõñnd_Ñ0nT~Þ×@–ˆ’à W +A|²!°o˜ÅÕ·´ïâRSÜHWB`V8ÁÝVBfq.ˆ’EÈ+"íÁÉN9Öã+ˆç,m}òX(—JZ¬›ÿw‹i Ý~ZÎqq/¦¸š-”4ŠPČa·òƒ~ËÉT‰ÿ–pg"±¼A¿ü6Œ&[\£ûÙÑï`Wë>’k—i·Ÿ™¿ýŒ Hô$H‹%‚—^â( `½¼»¼ÿÈфžƒž8Ÿ¾°­áԆÀìh†œÎ_†…ّ ë§Õn¨§øÍ/~-nýh[Ô^©½c­Ÿ1>ÎFÕ]YÛhÎpܦÂêIȶýP…µsÈ`…)ƒ“ Fõœ–ø—ãähÞÀ\¬°jÀꠝÑÜÄ͎<ê¤-Ú»{¬`/ßÓñ\0¤ÑÉÇ8-Ý8x‚§šO,ä9ðIº'†)ÑÛn–'§›B„¿¯.‚û8廣ú§NÞߞ4ƹqgé¨ñ¾À+'hÒî9˜ò‘§x0—ÒÁöW|ęx(F ç Ôcܟ;À@¤pNøWVj작;'‚GêέQ°}81\³“Äoròù|¡g0Qņs´O4ú‚fúX›…S`à*~h€mIæ) î‡ à'Gâ²[$’7 ª‚£È§¸:ؽ+û›YÍhßi­‡áÆ5ǓÝ°?Óƛ¡ú¢ +ÄÀ:¬">ŠØ š!©×åç`($õy…÷¤³ê,Ê»‘›g .–&C ÅÏq)n}Ïj p Äm"1E„ñ±~4CÞî!ò>ê¶#¯»UÊØ^¥@”â.DHÐ +.èð›o¡ðœñqÒ¤òOE—zuŸ,N'„¤ŠüXÎiT‹‘=žšU¸!†ÙK#*ډÛüìâú±XhÂAöÝØL“”Áqñ·QG" ȅYQ#Y•8@”yŽKrþ,&…A@žIZø +\EO#q<-(`KgÅ[kD!À¼¿.+ՓË»\8P- %n'ŽG.…Jü. vw)ùJı«[:, E°Ô#~`Ñðê¤i¾W ʖž)  "¬ԋ6 ¬:£†<}¾ø7EzgÓ¼: v,(”'7¶6XTl +õs«}Ãj8T +ƒÎŒï[>kÐùÓÚY6¹ Þ½Ÿ,âFöQ ñ“WPæ'jEz ãD“çá‚dwÖG¢Ãn$í¥>ڕΜ&.çX \f°˜1û‡Úh`D—güœñ³6N²ÆtuívïU–u@l•ƒÚlƒåÿ‚92¿¢@…¹m€†r½Œ?\ ‡£e—WZ¸œ/3\’>qEVn¥v…6-„Ÿ`øº‡« y%=J|‰Ð9j6jmã“50ÆíWœÈ퓜ÕSn_¹·%ï9Cý´nw‚„Ž7âw”Û?_!·Œšù”[Iîl(ÜF4Gf6”[3ƒÈ2n薌¢áf …öS$ò{©±Ûxە~ì_@e9n°' ‰^ ºbÎ×e2G…5Ð`œ~ÛJ ³7r Pºmü¥98é9bn»°zqô¶çÍõU»nëéL”DÕz[L¥¨Û>‡·%¾òá=‹ÝJø¯¹š~ÞL3]mÚrè؅n[Z®×f)G}Û!ÈÝZ´²ÛúªQò*/ãÄ9ŠCʒ9”Q´ w¡„Eòcæ…úìyNyðw·ñ#»ðø½Ö±U‡”Üèôð¸ØMrsË}Ýü£ŸœjboÀ1ɋÙy €z¶w>eÊ ½†|Ó¦˜ÇA`YÇdüëӑc%`p䧗0¸EªqÁ½ ß4{úVÖ &ûQ#Qä—ô8xŽ4âW?Û!‹#ÿØ ¬ö6¦+†/‹²Zž»°ÝÍ€.XŽÍ¾†HwÕEZ¿Uq rê¶ +&Ìʞ‹3Þ!ýé+靉1©ÝŒ&Ò ônRœ„ƺÀ+jêþF¬j,«s,×LG﷝V¨‡4r„¢'ù«°K3ÝHÿðGçó Þ ê «“¬ é-rhÁº›= ʄ ¶hËE¸ X +»Ö#å½ç°©4cñ€×?’Qó›…OÚT½è‚¯Ã»iì¨)çº8 ݄¥ É¯Ö'Â/Ž¨“¿·áÄ\Nø’æOˆO”jȝ.¤®‘”½ÆM·ˆ)€BšG:*Æh(R+AÝýÖmYz#6Q=·´àJ#«”3þÐ(t°°rý¹Ûc¬, ¦VoÇ[\ téÙiYãàóOéŽÐ-ó%*~„˜ã4s÷pՐò”D¤0žg“°ƒåd~ùÉ7G_(‰ߢ2#pÎj;`ÓÖ¸Çß Íʸø@ËæêÅՔb²Šû…¶…WHÞꌃ úsÊ·8UrÆâKÁxiäF;'RӐŸš-° €|SvŸJ +Ëɺ2Œ;´Mòøu(?KÁøZ{Mù}JÉã§{vj]¾%òq3¶f;ñÝ"e|;¦ +ÏˑGR;ۍ‹§+҃†5‹xÓmk*ÌSÕÄ:éwÓۓ¥\æ,€Ña}„q.ý3ÛóÃÜ!ØÂ[²Ú1K‚ù·ÀŒ-"TLĹtÇ=…‡çŸ»xräwíEÉVŠfãóÙK™ÀŠVDŒÆeŽ¨I°ñˆgQ1PnãäxÐjÉÎm“9ÕG„Öœøô7zæ×ßÖ±}y;j#Î ›e¯p>‹ø½p‚? ‹ ÌNuáL’wÅʝN1·UN`ÓrÁ†Íl%ó!xí ïn†PÚ#†Ôg.~‹}¨¾œs³xì^«kqõøùÛu6h×¥AÒXýP]ðY("ä©Л4l`‚ãžQü\gQ]Œò1«¯¿K9²ñÊ «[zQ꾨~R Ÿ14"©£ó/,uÔèՉ”Úëc˜X=¿aø/ô®ˆCSXG RŒƒW¬û +]ÖѼY&_–±¹êk(t—vš2X?QJ)UM‘Ιè5…•’¬AµžãÆdq›šžþvugÐÄvòŒß +&BÎÇA¢÷³ù`x ‰ågéd·ÊÁD2,šÙ`ü¹±H%—3ÁÕ¤`ÞÐ6Ÿb­]•Á`w€p¶aL©©•; ¡ÁÎð!KfŽÜ7‚´’þ,èu~ÏɌŠmæ¸e€˜Dø¹2ºÕ#bp +kø[Àå÷RHª›ìžÁ^ϨׅFëþ©X7/îMçÓçhb˜ÐÂm1h…ƒVdUÓ^§ŒÖ³íh±žP5å{€\ØjŸ¯ÚëŒÝæã‹:Y] jð°^×E}¶h¹V4A·˜™‰&sÖ/qS2^¼ÛNóÀ±äh„|¹¢‚ÆTRÇ_|Ú½M«îŸ;ÿi&ä‹øE¸ f2ÏÃvEÄÆSøÎ}ÈÍ€MºèCó`u.T…#&/ë±ÑËe'[(ŽÈÕZ“,Vw¾®ìØÀ(æ† Mހ0ÄMõ+Q°Ú7˜¥—hNO– ¬wÍ*ÀrÑ üŸ… b ÍľäZ%Ñ1«ìH2þJd™yGÃqYÁ •¤lá^šR³^ +ËmÑì϶W ŸCb¿ûS‚¼PJjÃT­±¦úOÛ'ieü’ñžN¾ð†êF^[o_„ •<˜..Àù¨«™q&Öäˆü¹§s€Z€†bîÀ\€bTÝn!k¾¨ Ä‡ ßl=9,4ñ-à v“|7)µn²€¾âªt]¡½80K³; á`@@ô\rxñX£ÀžžÔQt”¶oCÆCN­'CB"eô4½T_"£¦žÔ¨Jh©šœL¢¨ÅÖ ×²Çêúå4-L)‚‚àÙ|â8»D1:YåŸ-/õ4i~:TSý¸øÕ£º 'Î +H×ì i̯Ӛê¾P°™Y¡öoó̮Ǽu¶AÉDö“2>ý’<ð•4äÜðcü¡…>ïÌÒ'J×&”;Óü…,5Þxޕq#KïOƝ³ê§ÆAkÚ@dv±‰Sº3È¿w5 Ñò¥Ý[õ0¬fj}:”õ߀M<â"xÀð³)(}YÌ»- Eå@€*Aþ5©ÐŠÿ-ž(o>„¯@DüÉ´-!s-èÒQŸO9 #EcÍPûÇpŠ!ÓG(¥;üę<ô ÅÑeË6̝"Çá žG„sþöE»¿¥þÀ+žÜC¥Ñ ÁÞM';ëfXPÅþÛ_®NQìýmEîäì4mÜw¼™bŒ€ú·" ðß¡8’WÉ'HÔ% 1"†S}·Ú“°¦ùÿ.O`́ìåß‚;H «l¼Â_áð]‘â²Rú[Ôß惃6þ7#S…/·'úRŽo˜¢þn¯ihɀá_k#ïë@&cüÂO묭à‡¾¢|Rö¦{‘ÃPÖPr‘ÔÍQËkV—fåæ®W`¬yº\xêÿ,xÀ…ê}œƒì×Ù:…FÿX +*[SÃÓUiåÙæCë k—‡Â|5öjÍÀ¡Zø‡¡-ðºsÒX !¦"& {(•M˜Ð”ZçÃÜA4z¦<‰‘‡ƒC3ð‚º°à  g@¶‘)ÊQHœcÖç mq!݊ÿ·VPðhé[E‚Ç(° +D¦é› óíHepzڃæ Í}t胉©£Ž¥éQK,ß Ž"+ :æpƒ™Ñdx2ÊÑH}XÌQTªˆŠßw2c’Û®\Œ™'sK¡¶xÍì:÷“þ’ +0ԗ¥’®ï|‰Ê0¸÷ê""zz#  yÎÐ_Q¶=.^u^íó,oyuµ6œYfâ÷Ecœ’Œ¢þõÙHy3À6fÒz½â»It/ÄkÅlέáH\÷]{ÉTEä$Q žØû ¦ˆ‚Ñ1BÖLƒ{ĂxìÂöB…v¿ç¬j„ÐCæbÙgUÕý:*ã{-ÂÿŽVžÑ.Ø#‰ãnåÄÝ.R¾ÆŽ+ àWE›%PxÐ˝ÕpP@û, .ÐA4¿<%äÁ¤Ðƒ¬·M¢§¬Ñ³ÒvF±•öUI Ÿ¢‡ÓŠâ &{‰OZ„é¸|ù9aV ²aè(!b6Þ¿3äòÙÏòá‘u/™õtÀŠ¶²ïã—هż[ñ{6ê“gûKÖ¬|ð8‘ªñ„ô/.ý­!p€p©îB¡ñŽP{!úÀÀxÍ­(“»+"Z>jq»PøgÒ!“nm/Ò=ZÕ1HÎüDP +ڟ ûЂé–i„gÖ%×À^nœæ7ô¬–Ëf¿\Iÿ)o‹T™7zœ(Åthî ·!¬B.þÓ&> €ÖSNú‚i×FBb +ò•øȑÐÆ]Š·ç·{¥-SúåÐo[í1‹6Ì.€Êî/ !ù«VݝozMµ:¼€}®ò ЦÛù$’ˆK·†Øž¡ŒâÞº|"™çÈaRæ ¦E"ÐНœ7d÷C-î„ $FyƒÁÔ9÷ lñ„ÐØX¬‡žãn`f +Ò½lþM¾!âryts§Ø™¯Rð/#ð©^Ú>‘ãÊÙÅEò¸µCgó" +dæV#ÎE×Å_G>W<×ӟ·&v¬‡zó,±¸CínBZX"XaδíNØme·iâTLQ{zLx,QIr™¦“b¯§MQv%·ã]5åçb(@¬9!}sC’º* _s{=P4àˆÁ°Øm’ÎæãɄÈd(˜èŽVQužŸàòß[¬ZrXWñZ©Á˜£Z2(†Æég‚«îhØ©Íً$~4¯Æ–z«aõoŽ¿9Þé1öK.èMÙ×%. k®®ÊI†¾|;²£ò'SK+„ýЈ±2ԁçÅýlèT8N@›ž=€^Iµ5V¦% d9–kb&}i+†?u¸ *"‰~f±,ÁöÌ%@Sì/lË:Mص–…4ä}ö‹û!6‹´Õé3 ½-ÈñtÕbŸp¼T_‡°‘÷J‹“’N˜|ÅccE ]¸Ñ¯ÍVN‡â§ˆOæ°c½“x’膅W"=+Y2<%r%U§ Wp|þá•Î֕³VÐJ3ˆ¢å‚$¢  +†}3hDñ1 &&†ÏŠ+ú*e(öF²½(}¸:î18á»ëü'EñÞ("bbËèpڀjL©=¡¡úÁÀ¬"R¸ X|:yu0iÈF`Ä¿kÐf㿗ùVðåLs„µ³O“á÷Ò¸‚^4¢ÊÒà ¼Þf-sÂR%P»i3™Ö×Z''~8uF"Xì”çÐ.Roñ菕êù°‹O¹Còë!ÇûûàÎè݁v'x8ډQ7Úï8ÖÄNôÂ`|+j% ÄeŒ¨†_ßËˍ8:ÁÌÁ +ÐÀi—×dÚ­üIe[âÛM”äJ,gWÌRD3rJ”*ÅèïZaÁ`л½% ­$V ËÃzÆÍH}JîBb +ÒÏ\ýUçž!'ìóÐúšå‰öDÄ·Ö ZO¡r]C,Ü .ÄC¶W¦Oˆᒃø˜˜1ZíÆ D£³/² ˆ»rx»sÕšãᢗñÚé˜÷a2"äC>ƒ„=9±³ô¾0¼Gä¨(þ²¢&©àªnm}ò ë‚ÔÀÝ0×{ð#µ!}%¹0„]Ü&ŒÅ.·.-œ— ò–¬ø +,K«3<áËÁf½ŒË°¬¿b.Ž½SéM†§‰Èp `1„6a/C»Aí`H#6Ãh{°îŒ Î^¸mFðð^¢§cJgý†úpd– ÀUÈ_Y¦B*“‡øõI B0>|»:FQA*áÖêHs+a«…¼Ê.d¼ÃJF9G5=Ý+æÀ ”½„]’¥(áõ±ß´OB£®P.ƨ13tÑÕC$t¥,‘p¢@¿›ilq7õ?ª",ñþ`«0Ô ¬"ŸS5t4‡§è›³k1»„PÙ;VnƒaB>°T # ákPíšâ8¾pœÇ¼\Á¢°¡ vÒr ó:÷!ÕÅÈn¤Ã›r¶`þ)—Í‚q4PoùSvóö 3 Œ³Æà6“rAf†Ó“(øS—á^Í(¡Í ë‹Ø›ar¡-îÀÛ¦÷š)¢•ÝÃ=F5OSUdƒR\jå+5 +]‰Sà·?v>æJ ÅB‰]ô¿»žOMè€À ˜¹”èπ)¦bžÞD!‹(Áp®ÀWÿ¿›€Ó i1@WàŸý•Ç @y9d`lJCþ­ Ir+# û]íS-"Cº tïŸÈu!Šµžõ/×foMÙðüóÆ°ø筝ÞñöŒ’|:?ÿô¶öG%€×_ Qàaú‹ÖPtþlÚ•‡7_÷¤ÛnG“ME×iA&ùÌrmƒíñ=ƒ ŸºÌÎÀµø‚Y@ÉH|â󂬏ýd*ËÃw't­ã˜¨ ß94±´Ì=s |ÑØý=rbßcÁgï¥Ñ|S¼‡´|twïêé [÷hëv8hç^{703îU2-÷GÚ^ÅÀ]{Ûnʟö¸IOyZ‡o¡Ä­'û÷`o:Ïâ !ÅAØhp ag<çYÔnX5sL‚ªW2 +dWÎ[MJ…°Âқ¤òËØh,ߝs¯þä™#¬ò$¾2<ŠÉnUîEÀ3º8e—œ\ÔΎŒ'œÇÍ ¹x¹E8¼yz‚)MÕlà=!Ut|Œy,À›â݄¾OË;ŸÂ„'œ*—”âeŽa„CÃÖ­"ôÀ¥ä6íY¤2£Ë±áÜׁM‰Â Ð•Äƒ6°w†33*ÙɈ +‹?ú@$Ɓà²Õ^à‡+§±ùçïJÝ%´fcùàïh­`È+I†ãòR÷Æà Ç_8öz$\Ý蝺š†3±Ó[ÜÁz „z!ê<’™lëa#wÎyՀ¦«ž°Š£–´Ä‹ À$6H½}ƒ(p-â•Á]=Áõ­Àmæ. Œì#qã9¢¹ª·1L IþÑð‚à :aÜt\«1$86jMôAˆû´¸? -žŽÝP‘Œðƒj€œà¦X!ìƉÁ,eµé2 +äŒh!:ÜÓºå”ø•{XāXͨ(íOƌ{{frR"Ô( P8óþ¦Æ:tHdlž­nÞuގùÄ␱S ˜ŸeìÏ-äS… “¿G´Ù²tÚ ¥ ƒžJ@Y6[FIš÷fåæL>X|ÇÍÓº"³ÜÏb{ =Úç)å©o>ã3?@ÔØðr™9懜ÙÐìm¾õ&-Mýé"BYžuÖ¥Šw‚Óí›ÜĊ•]†%I*Å7Íi†e›õh4màìfn§öYÓuÿ‘[ŠZPÄ®`ÔÓ©¯ñõ@ é!4³>h 2V³ċÐt;¤+ŠLs\K!ÀvÞf³~ r¸1Ѽ§ÀáÀÍõ&mß6E—±Ec0”‰r™ÞD_Ôí!t‡-ºn«%Ów˜`N4}(¢8ýÀˆÔf8V lVÇþ>Ä 6Á{P”¿¢êÞ ½f_ dQÎT Ë‡Ã2h§=}p¾ª¼ƒ&®Aû0s6¥:æSÔ­«TbPLË!=/(½Xø˟“Õy"ð‰gÀÀBmA„”2 Z\F™x݄V}¥,ÄÞ¹©wû8ÿ¢Ú"͗Ì©i¬ ?Y¦Š}!äÍÒ)YýCAª>ì$ ó´ig0x#l±'¬^®žÊ÷^@€|>8#{\ÊZ[É7Â8Þ«lº!c1AÚ7MŽ°š éž)`;J©1‡x¦¹•>´ñù6¯žv¼¡;ï3ÿãÔz&8Ô6‡ñ+þU˜ªI|¨ ¨æùæzôN`Yáj•-oÎ3v¤<²ú¤å [µ.á/wÇY¥Ö'á/Ž~ÅÒiªx£œfÃF—Ò\XÉÏdéôV–í&X²nÎõ½¨‹ ÏpvU¤!NąL›…âö T[rD6Sâœæ5#¬«z ̱M@Mk¢! Èu¯5Ù' ºA4S¾mf4¼®³ÌЄTø%‹ÈÉX– 8¼nó‡~—»êUS¶usÔ݃åSbp†á1ŠSü7ç:9ŧ(÷eP‰ÃäDiØâ;š',h°ìPR¹.ÀDÞF³ˆ”¡ø´ö„ÙÃp6ˆýr„«¾ÙÐxþQ5z…hçàЙ0´È¨šïË°¸Û.• ç2âKëè¹Ðq҉˜8ÄlŠ3Ïrb#“Š#ü9»îZ—-ÅÒEŸ6F؉JàCÿì=”!ÿY8éJÒá?K ß/ʟöčö×Ò"Ö·ŠÑJά€3¿ëŽo +d²^'Á•fä}‘;@a¾Œ‡»¦œ`ß°zkôҌ³ÆátݦƗ‡)Á&îJ4FÇíMÛáyOY |xH³x0CÖm¼3ς6´aåçå+ژ—ka¸>Q˜]ú¬ Žºa[ Ø0xTf7 Op¹ ݎò»b¸Œ˜}ÇTI +”¼T+13óˆDw,¶p‘T‹È÷M2îÅó£ëމè3Ì©"dèmB1NË;$bP©¨NaŠ‚8VmvéÃÜäî¨Ü–všm‚~’_óyýTvºi;‡¨ú„¤çu´I4(ÊYÔGoSßZ÷>6æ°ÁÊ?x>+áÉ{"æÉcl 9¬ƒwôZýíÄ]™^?/¸b;—?› AX:YÖs]‘:H4pïl½; )¶êÙZ¢“çBPˆÊ5íóJ ֓Ì!2žt)![SC¸—"Ox0k竪ú*˜»CÂa|—6(®‚PJь͢Jü‚§eH=K÷×ÃY˜¿!=CÚR4ÁR—Ì8†••)‚ƒÂs<=!mnƒ¶Þ`:8 †5ǂcpâ +/‘#î^!³éٓ~‚ÖºCÜ ¤´¦ð/\’—T7)ªSéL²‡PÚÕVÂâl9‚ŸÌ=¸_]|lÊO$³H÷8Dœ³ãɗNNv™ÄåvÄ:¬mÚ«‹X8bOE¢É0!pΡY¡jEƇèéâ¼Úp’Úñ_¶ñ +´8)~›éâ„d+$r£N–-]Ê.pеX Öõ-TŽý5¿â3|hZƒæuí¬ß;íp4\çoâru舌*Ö µѾçÙåÄàW×G@µžç= rž‘@êiÏÁ<•x2¹7ªØ~d[ <{¶ˆÂɜ‡íõÓcW0FZc~p˜>J¼0±1¾EÆKÝoœN ð|Aêø˜_0µéÖ»˜6ûÁ”ý”l%60âTv-ògÖPiÖ0­uçÕaӘ"èiZ'èIá~¸ê£!DЭfïX8?jµA‚qYW*†Æ<ìb¹ïÞèDxcÛ·Hùí;]š]”Xâ!í•÷ w éQóERÃ4PEk‰;…×rz}ê j`z<ïõ•lò΋MÝ=æD çâ‘/ qÑA©Jïp ™]fçNƒlH<õ‡+‰7fñjÀu?ØãóÕVã8d„ ¸‡K‰+¤”¥Nê—)ÐK•¦3ÄMâÞÝߘóµ»Ó8 .cçÉÿrì¸qçzÅî¾¢9)é·£RÎ{Ý.÷¨ì¿í&P³]ÈQÄxíBIˆ°Úy=o—ÓîHÊÉÕ;Àêë+_lë“?ù©Ä6ìê–ƒ]Ç։ +Êþº#%ë½®b¡´~ܴ㲐R²Òç7­ÝÿÁµ¹d®>ëÙWFÄ:¾bô«SÝn«CÒË«÷læ-*“¾™Eهºè=²çO§¥eÓw]p€XétyËÙKÒäkÎhgº¬‡çfû‰·Í–Q¹†š¥KJ¦>m¥{vÉö“îè̚¿UëG0*ÒÕK=óèèãÙMÐÊ֜æT<èâN˜ãйN%TŽW5srS…ÉA4méǶ·@ ºŽ©“O¿A:*iĄÑûøs4F‹œë§š`¤#Ëií}ls´]ª¯¼,5D²gÑK:nÍiWi.ô){ž¹~‡Ë\rØz:‘6Xµ=o9¿Þšå¨’ñÊñpËçrœô?lÊÑT§(GÒ¤cŸ\à)ìÛä҆¹–Ü5K1,Ée:ÎG.žÂ%/rvTNêîî*“!º¨nèûhæ5îUM»Ÿqß6Ö'ŠÅãþBÀ觪vÞâ¾Æ²æ":Yq¦;2ÅÉ\FO߯[â\mž™#Žvº½C\VZ.cH¾Ã]¦V1“¢ÓM_Cô§© ØàZ›0‚µàbãÚt‰[åìÀ…_…ú +; 8wÓÂiœ ÿ·TæýíńÏbsѲ~/Àכ¤š* ›Åh?ðá5U7ZY¹KHØ,qåT–&(͉4f(I±‚#¢Ö„†BÁóµbÖ¨®{FwŒü[blä(iX§I«9)ë°N„¹]¨æ7}ƒm›¶¸¦[¶šsP¯jÁ@æëæ¤c…eÿŠ…‘‡s¡šòŽ›lšì)nµ%β僛zV&½Z +Ïûp£ç„ ¸µk ÃtªŒÎ¡uݘi*Ž=è¯É)Ƕx6hâ°eý¼m]|m;‡tŸgAFl‹¹xåðÚ€ò†/†¿K¹Òc¥ÊtiƒEMN«'Áh£­lá-šŒ m¸€’7ÙDîëâîlQÈH6‘òÆ&òqi_Ðj—ÊÇâ…Š­Xfã.[Ô؀l7å ¯)ŒxÉ{Õڈ)s'§ L¶ðgř!¤\IF5¹Íb­5¥pc‹›Â¼‹ÍÕúžØ¸ +¹)(·[˜R”[Ø¢h¦|§¿ªÁöCbu†d2…µûkÌuF̔{æâÔß±Sd#ßÅDØqÈRÒ[+¦Ì 2XDH¹üÑ)þˆ{¦zHن}æÃÀZ££. ÒZºÏŸG…#÷ª˜ž2v_ ýü¥»ÚËÏy6¥§†x«ýɼlV»Jòv Ö¶ÀÂÈaè?Äh镦Û[åFºöR h£wڑÚñ'ø]Ó쵉 Á¼è¡Ä¨öb¬ !—:’E(š½ñ>LœŒbcM"&=´‡ã‹,ɼˆHÄ? šœèÿÕ5FÚö´ödÐzō*bb{t³†ã$ÄþõÉ ‡ò+sïšLN»üSlí¹40…BSc`›k܈¨+9Z#À8(ùIòû ©á­©áµè›˜A¦D?í&zh`d’s-ʲÞ2bï()vÞúµzKÚA'ÂC%Ų—ŽµƒŒª•A®b`t…Á£>wÛ. +fÏѧŠ·(%ŠAÚS„.î¥óh÷ *ǎ£.nrQ_#ߐÖ°”, +ciC¿þ¢^áÆc"1,öØp£¿$T–b5ÚÁÜãÈ@×ϨršàGþò1´]}ÑøºP0Fˆh´¤¯ºQB‡˜ãtK6nA«Ísg@0>ÐCvìÔ^‡‘”ÚMÐ<êS\w´—¸b¸L.3¥wa÷#°ˆ'÷¾Æq #ç<&Û¥ ”͉0„ì%h¨?̛ك=7œ†7Š=ü:Š{\Ì͇” À1¦ŽÀéZ¢p¨Ó:”9d‰”¯ÉóƓ¨CÖÆ'IÙöHôK í'¢k™ð² ýЊËÞF÷ÈÌè7¬ä:6)0ƒ(ÿù’(]î½ßԗÒTaJ“$AXÑ*¥>53TúCzD)X¼¬¢È’rF‰?à»QCÊõJºS²I*P^c¹§,GÒpØiƒEZy<ûIE!&’ †IžAše¢£&Lø¨­;^PÚ.d‰¯0*þ +…Â0ÿI¶b५ +½qŽ4K<¬fÙ§ê(Tñ²ìk¤ˆ + '¼:Éü´„ut(¸Ùz?W™kæaqˆL) À+2]›ŠXùÖ̵‘:U ~¢xãO’6ó«)‚-gÕꏮ‰\Y!E í˜äJ£1<Ów^üÔŸµzX„bfkÿ¬a2¥c±©³”YÁ¯)‰4%*´’gpÌ°ä‡çí!:Ê®ëý&²ØmÖtŽ£>u±pe*ch#ï$‡–Ðf¬ýO£LHî{^A‘m>r·„2úéPmF/Ô2 "ÃRg v¤Ç4°÷1nc5Âr$£4ÿM·Šf†­8|¸ÝÁÎö@Jà#“Æ“zE¼ß” e ŘI¡ÀÀ8‚F<,ÛÛâØZGœaéÛ³¤~™à8|Ãrø4J©4‰dióØúoX_ež+!Á{dStK—âÆ3ׇ= —ŽÞÞ|%9ÚÆ2¹>qk1@ÅG"Îö² à¬Ë·Èþ‰']Ž÷*„ReˆY#д! Æh#( U^1¶¼íkzÙ7X ôjÒpt„&‹Y¦F{:r«w ë\2¸'Y*÷cÿ4 |2äÿî»}ÀÔ$ Ç-Û +1%Š5Õ:ú] Tz? ”¨@›¨‡–¬¢k>D_¨ +ì$DSO†Œ‘2ÊO5Án ¸fANnB)HBPºн…U¬ÂÚfø`¶Q±Þ4Æã¼A«Ï.dAx°hÏߧw”9GyŸ£R¨Ê¡¢Ëçl’‘Þ•yóOÎêݸ‡ŸV:˜òAÄݍÌ+ÝIWJBêÃ{tLf鼒s‘.…h¾h›2ÂÙ'úŒ]‰ëŽÉ,1X‡ˆ©åËþ„mHÔ$y‡¶W@LÆÐø ñ<ȆW‰ù ëxÕÌà´õ̌-ʼnv Àn™¿â+Û@Àµ¤U!R<#K¦kSŸs¸\"™7m¹š“:Ì­`–„ÌÓ&Pë:øý¢4±Ó}Tø֗ý8z*X±›HÄAz@Ÿ[‘f„ +WTìG5²¦¼ÏÖGÇí¨ÐÌ`P XÛýž?X¥Ió„‚CU{pØKó%µC爴’嵤ÏÁ'µ~yºW P±öü[ñ¶Aö÷÷qa/làžùTÆ»B<œÅ©Ú¤ÿ@ûՅÚQ []¬ øäM½®n͔‘ÌÌë<€­Ìj©N1 ˆ¹í[ÏÚ-NÒ1¡3¶ààéÌhúìáõÖQ8\¥ìd>\µúq®4‚1dgØ˚îCó˜'šxöÁ;kpÝ?ømx21.òePøŒŠ*¥KÙª3ELlG:|ÍpÌgI-T’Š­çΑµ¬HYQÇú9A:Ê·KªÍó ‡ð‹m='ÁÆJN¡»+ø3üõ–:Ճ3´µ*Ie‹?‰ËïÐä…8”Yǃ)J°#ÃKù˜–Í‚Òwò‰Õw;þþFkƋ»¹cAØ= {®¨°œÃFª¢;7ãíÉåùÔ.[]ÖrõXàêzèæ[ŸÊ:eà.ÝÈJ%æ$&‡>‚nN–8؞ DVèK 52ºðöæ ¹bÔ,öþjx§µó)Æ0ñÉ©1ŠJ‹å|DæÝSê `öpä&ò‰d!fûÁ[³áHVÙñÑH÷ìI‡¾tH>€_ÚÒÉñÇa~®‡Jû0âκ0o„ζtówÙ%# Xù¨˜{{?~Ó8㫍w«F·»Ù¡TÌ ˆvÌm\@ºÒ~‚E0Ë;¾1#™»…]^ã©]¾äÀÒåä†"®Kêÿ 7f c3æê+3lu«MÁžh‹Š˜Ɣ+*æô  4ðs™âK[œ“!Y̐èØI ¦í¡Ll(U‘@ ³aöiY˜ú +mJ/Tt%Z7Fê„"»à^àì(°¶1¦!pJۖìxÿêù_G:˜ª>é Œ½Ÿ ę ]›3õ¬6KƒöP†¤ÿCˆmŒŒ}ÜW]”NJ±¸ =·O:ߍR4 yßèÀ³TL ]¬(Æí 4]´€û´Q:a6f4y€y‚ž² ?Œ˜!»: +æØA:A„z"Ç\>9ƒHŠ~¹ö¡‰Ï‘©:zW?:v¢P1IòBul8 ÉE$ÆPw¥fJ™\àðqù|09_2*o ž>À3¢]YB%øŸ¡åµ ԙtL‡„²eÄãñ¸W»âIÐ #•M83êlìL‚ ÍÂÁíÓÇù!XQøO#ӄ¢¤uºã-Ðó ä€]Ì´ïn{Âp K”¢Ñi7+€áّ,H†ºX„¤N™ü¸:A”2&™. m;)Àe´¥5¹¬J36ù¨z$N8“ŠoÍ3TúlQê𳡟©H·iË˪¡Ø‘V%ÌÆá5£mÿ‡€‘yû»¬ö]É°Qr +Úy’ƒ‘æpvP½u¿Ä¼Íl5Ã0.¸d&X…ñRª¶é=¼Ý° iMZŸ_8/´ÁW¿´øGDå-z7b²Íp± —;&ŽÃ aé-»f”8jÎR&hôŸ° ÷\cþ±©½–j€ñ…Ø€ÅeµrÄ{öª’lf SH;ÁÆž{ð›»Ö/0"²¾[ 5V0ª¸ôp¢ûpbª¨A؈ý¯“f^¼ÐbäÃBÓòšSìá_t÷£ÉK­U+믳‡ñvèÙÞ<¯@ô܈îhXPM(ž‚8{ À7`³,dÛ+³‘²Ø,É÷r¾âíä"vWƬ¸§f‡LSÜlÔuÜ“„\ +"Óñ|CTbŠ'1?€ŒÇ‡uÁÌý­»½…7™•?'l3r?ô1½2áAu~0ʝÇu­N~09Ô&?eü 6EäɌ5Æ@D5 ¸ÄÈð^AÆÈ[Ÿ¤ßy N[}P£E+ çï33Œt@p€Áa~ k\?«ëã<ځ¬w 7†»ÚŽé{ª¨<šÌ²lÖ8ÎÌbg3= „ºŽÙ<°ßbjgT>« W =ejyãÚ\qÏxRq¾äF‡³H¿t}øï? Pi‚¬(1>0sô¥ô´S˜b¡„‘\ mB˜6¡O/?沜&­ˆ¿ï˜Îs$*؆5“µ~È#Í`oÜzŽæÿ\G5ò˄mL@°#ŠæOlÿD?_ûÂ0|)3„F/‡]R„˜FÜ»ÌR‡¡>ï`REdÀí +”ºsAm1ðÅwÖnWŒ>Í°o)ôû=ªN¶†àžZ™,.ðô˜Í¬m¶Y0,¦rtbE7IםH^æ¢Äç·ä—¡éì`MÅF©Hn€=2w[~—Ýâ{SÍk‘^ Ò]®¬D×dӐ_Ïgû`.jÓ¸©U ásôö}#$ômá0Fk)úJÑ[Ñ»äÐ@Ab=Ö[ýð¼´PÈIB }sê|õ°¥Dþ`w¦ÈEмùNÔ Þ ªG‡àÐÐÁþ| ð‚¼Ù»z3s’Enó’ÕU؄©Ç¯ÞR'žû¶ê wi¾% Š‡C̅ÞUª~˜:×rÑfÞP)€]½M€Cì˜ØÆÑ%fɹù 9?‘·Ô—ÿŒ®{DVLäMÜ· ‹x"oÆSänæ~žfÈ[ÕèLjÄ`ý‘§»îml-òsÈ[áå— —$è‚O›Ì„¼IøFU$͌ÛÍ]ÊÉ­'ƒnKȉ‰>,„¼‰ +xÍÄÉH“€E7L%’±Ìy Ú?x‰i/Ç‘7•¨‘7©´¦DÂKÀy“kWg +{GÞr ÉÛÖ»$zQ$’tmD’fícUD’îÒe_fFm‹«’¼ùÃe:$o %‡"’O!Ô°vbdíb7Å)Z»7ycrOÓiíÒx™i‘·Ÿ%ÜL‘7”@/㼡È[‚eΓ 7]À t + Œ–>ûV0Ö9¤ôDÙ(«È›XÔțJ‹¼ †#ou'’hž•oäM,± ^­%m#oþEƒƒI¢°a5 ¢ÃÐðœ¤:\bä-5pä-i0’·ÒWôŠaYôŽqœä­<ˆ =¥<òƓ“{ðTc6F â$wê\™Š]¥÷ö´yä o5¨­îpc_ü +§âldIÒºÓKFÞ rN¬¸¢uZ§X yÓi†J¸yT"‰!µõÁ=¢±ÒˆÆÐ"¢g»¢MúçÎ,ÃHà‹¼y± 3‘ €}^p"á^äm£ òxÉ65M½ÄÖlW2F£Õ¨šò*­¨µå"‘·ÊIæµ]­ÛRE!"o‚Ê^@ÃDÞ^K¨"Æ Ò¦ <˜â89͐7N$‹¬~æ7 Qª˜™$CAÞ"'j9‘„btjÛUÿÃÛ{.ò6Êä;1äM,GäMM´9mj§j]­kQEY£o»ö*Ir‘·ßYL@"1•òˆí•dŒµuØò©TµUÉÔ¨~YÇ@ +$ +°vIŠ¼éyy“iú²ˆ-r-DFÞDŠÉfâÍ +JäxÛUŸ]r(ÀÔAFˆÞ'@ÈÈéÈÛ4»ÞEòöÈ!1Ý©ÎjI*ÉÛÿÅžµIØú»íN˜mƒKCzG'Ê3,ñ#1ͬþďdĤØțç¹,»“‹Q’Ô×noø¥Ÿ>[Əܯ.èRio‡È)7HL‘,ItÞ7䢘2=­Y‘7¶ï;aڗ«wp³î®É*žÔŒ¼±ž³m"™cÊ´²KßÈ[ÊÉöp…·K‰£–¨ÉÚo£5š†Ýbrx}Ø'ò½lí1ˆäU‹MÉ¥›äyà`“’76V +-ª(‹„*¥*OÇk4•/3wĪ§ÑJ-~ÙI,yW“DgFþë"LÞØ +‹„÷MÞ¦iŠÉ›%˱•-y͔¼1d‘à‰ájoEâŠÑn—XÉ[vµÂhϨ”éôªÀ’7Ñ´0;‰’7á+j㙼™UÅ­H`ŠHŽ,0›É[¢”V$a’`&obu¤éhƒ\ n—¦’·$Šá¹"),¥wïgP‘€/yó. ”¼©”}nK¥"[Ô®¥ö[AÙÓéU¡4–¼â’7'ʑ7 žâýxÃÈùxKlÖ7{zFëÏñnëïôßã ¤Šd¥Èo,³B´óxK}ìx†®5÷¬¯o¶>ÏÏñ˜>ÊÛÿ t¼1Ë"›9`,¢2‘äpq + 1n‘˜ã2Ñe Sº’0o¾ûʶ¬MvܗÜPŸ¼ÈþÉyX ìw¸]e8ÞEå9ނAgCǛ9§WþNW °H€v¼y¯;@rð<Þ¤©V¥$Zªˆ¬Ç›‹„{¥˜»ŽþëT¬ x7OoŽÇ›H™sÕÕ 5sÛ5×µíöœÇÛ îx3C$là\pÍÉ0u¼aÐNÙ6{H”1Z®HDíxÃ2 ²AÑänÂò—´FŸ¨-¾–‹dÛÒ) AòÂ05ùu¯ÁñÖFg¶,„Ï=o¡öb—t¼´tã-$9·tŒã-j"Ç[U+ou°%)yoì#C%NC DŽ·a°Ø®Åê9p$§™BQ~‹úzŚDp¼É«³ oF1n¼™¶xÞÒ}lÌ$çôbÞØx»»Sã À`±¹¥l$å¢kŒ0·ø©™Ù~ØÍîoh¼!?ÔxCܤaNŒíz70åõ` "·ñ]$îúhc)o9ÿ r¡‡´ó}¤÷º-_$ë4Þ@¤|‘À£Oãm ï‹$›¡¸i¼ÕÄ°û"IÚòvù1÷ÁÛàævÅêr»%1° FB‘G46Þ\NfxœI‰ãÄÞæHܖ‘¬AóÌHž·Üí{RZ“}K[ò|Ñ©ZTÎÛHff5’…Ÿ2¡5Ù·`NF­+Uã-˜Eѐ[76Þr¯¤Gõ+4ç¨+TêÕ¹ÙX•WgW¾N\zJÓRh}Y­Ãñæ‰sçfB¤t )·ÝhÄYnóÊ·á^•{A‚#-L@*¤¨¶Ä‰áx›­åxçÒW¼wNÇے±Ðy,˜t”f$Ös¼‘„†t¼Å ðj(àŽ7Q5ˆÃÈ<™oY°~+06îñ6ªª'¬¿Ë²Ž·Ôc>n‘Yw¼‰ÍüO…íx“Œ¶ºx7ÕÑÜH8Ìñ¶‘Y“õ—‹”ã-è;äW§”ìxc†=ó÷”q+¼éD¿ŸwóLSž5p…èFbyÇ‹qÖ_¡³·{Ž3€;ÞBR:ÞäH†9ޒ¸·ûFçxËñÁÖžÿŒ’f9‡ÐÙ­Ÿo“]ó ǛdŽ„œÞˆŸ«õ—žÒTÝx³Ƹ~bsÚqK­Ǜ|ãÍBÌ=p¼¯¤ÕZ?—7¤Š=÷n˜wî>êHÀ©ùÆ[ò)li §ØÚÁvÞÓ֑Dú„{lÇñ6߉Hæx¤MÙòʝ‘ƒv/Ú&ŽÕ>o ßgG“IߋC’;|¥äD?áî:-CDåx› lj, +n° +)ǏŠ/pTöxò‘ØóƒæÊ9ºI0©b5ëªÖ‰ýx“’ð7‰üxÿßîE Áe¼·!hq?[Ì'šÿ É.7Ìï oÿê{t¦Ï<. ÷ÿ#“LQ^'WoC1u„¼yò‘$y{ kP( +/‰ÇñD ä-€;X,*>К{/|Ùªû–áR4GÖ]Ï©¶½¼’ òfX.\¤*ºŽÄ ØpY^dwï”RÔy ‚mµ´í ömÛbñmÛ¶_Êöðý÷?Ïú¾=¿¼&:ý4B•–‘ŠPJJHDDLDDffFÄ›Pjj††&Єa3â`P¡pŒ†lvDEFw$^¬-j©_¨†F¤ªŠ¨ÈŠDC54Bå!]Q¸2ã'[Ì行n"²›•J ™O|ÿFïôCµ‰“c…ÊÉOjO'Ÿá·³'žØÓKèRDB‰((¢¡™"¢wº u¨CDt-**"¢!¡kåt:¹'©ÝÌ5~míj×ß® h‘5ÀÈ®­Z¯×»Þ5`$C’Xp×»š×  H: >…Ú²0%H²,«uY×uý²¾:¼yšt€ÈH‹:ü‡”¡ÌÈo»(Œ‘Àʧ-+[‹>áx™¶ oÙJ§ÔjµµÖ*JÓdû¾Mñp6{ضY-Êv¶Ùfòض…϶ýÿýÿ»Þ©ŒŒyç .sì2r‘ËÅRŠ Çó™ù¬¹P"jg¨S"ËE»Ê—*Ú;hM##¦OÊĎ3±“–°k=g>Ï/#‚,Î$°y¾¯Ã+çfþú„PMÝ a-âÒ®æfäãvæg/#fÊ£Kú.Ûv:¥ÖLed*Öó˜Ûí˜:í­3©+ãÊÈÌ\û¹_Ÿ‘ +O!(h‡¶m©-ç-§•JÛé´µ¶âêd¶+•6‹¸ˆ Q¹±L¸IԉX`Jó!O +‰´ D’F’d8ò­Û¾mɖ$)•i…D*%aF®¨ Ò ­˜[”®}míóØd“ùÀó¼Ùæûó|-øÿ_ü¿³ÂÛk¯ý–ú%Ôí·Tzrû%ypàw”A111“ñ4ž6•™À5ÃA"Í=îw:5 ¢A*"**"24Z9•g¤ˆÔh歞šäb5!#‰ñòL~'å‚à<ßå.dÜãö»¸²õ»¸“­Å I¹³öJå"Ì!¼“A/lëÊ´÷S¨­ðÞ{ïíTK-Å ø£½·—W¸*ºkÀ«ªê®w ògGž™ñ(GÞTî½ÊÍtÈ¡*ÙjY¯í•FmgêŠs5í“d@ ¤£ÒV´m+ÚLµmÛ¶R ªmÛ¶u-0Ä⃡,“$Å7¼½5¨µ#¨o3Øömß·ø¦Ë¶msyì‡1Ù'mÏâ?Íåò¿áÿƒˆ?0Îþÿ¯—]±ÏÿCå¡æ}›ÅâK‰ÃˆÈˆP111993ž #0†ff.@C35ss$ +µ!" ªº†Mª\år•¯‡f&û‰¡Ç×¹‚¾²?ûç³/”ý9È; +aÖeÛÁ©¯“ù÷=}#{¾}ûšÿÿ¾TÛþÿ1vÙ~_“ÊŠ¹P¨­¨ô§ c°°rP0%ãQ«22 P2DLLNPtN‹‰@ 3A¦èTÏ´Í]í-•ýÞÀ÷µ5›RµEPzòI)fUOË«‡ßJNícDæž[è§Éú™"YEn“»TübçÈ Ë®¦\ÔÔª‹Q$LµH ¶ÐR¹Û_ýéVŸur,îöëT÷¡ÞE—9%V//S´bUPo"ÛKýrÇÍb‘ôƳj»,ËGÈëí6 àâ¾NKÒþñ ‘³ŽéÖÉ%¾Ho W-ì5A…ëÐ1€R¦B»ç$«¼¯Ûžu·"DàhkýtÏÁh¬®TFeyIËHŸðú`†@ÕÀ³ÄœsÞX…EK2„½31ú]ä\dU6Á>s½'<ÓÐ AŠµ!:!4–?²ˆvÂáž>Ê p"_ù`‘„¯ êªôîí?£ô’<Ü×Âïô;ei‚ÈÿØø÷(á·ÉKŒ1&˜]æ ¦r’˜Û±€ÿJôýק)å×&À:jD>+Åއ°É^qBº€a ÷LhãûŽlÛ'ûw¦x +Ïbö#©|Ž$†aL©³Ú4è´Ì˜³ÞõPñ‡‹y¾<ޝeH…B7r +녽¹£0u°eCHEŸZˆ` <Óixï'Ír„8Ôa9×Z²=¶þÒå ÍB²‡*ñÌ¥>ªþ˗|ïO"Êæ/j3õÕÐÖC²ò!kNð”ÞJ´VÚ<<*»Ø?ÒҞd ¦ý Úð<\Uì(!…L‚Ù€¹HZ¨µË„nߋè}W`{€»ÅÑú°Ónˆ X̍ڤcޗwµ÷¤w×Â÷…Íà»À%⑟‡iéï%/Ýf8»0ý×ró£×²[† ¶³¡~aÝr¤³YÔǗ̱cƒ‚{É2‰÷þ>ýˆl;*hú¿ËÕÉH•3¨4Äi0»¹ݸëå¯ÓfA]™w…4ÒøI$™>´Ý,V–¾JõÎ^JQ 4ù}–¼î"Ip}8Æo-¥=àn’>õb}|Љ¨³Æž˜ö•_ï[mß7|J¨*áVÚ%þ ݤŽíüX‘[՚uu5Âbêø‰ +¹‰Ï'GƒØ }­28ËtÃ*Ëne€Ób̃x¥G7y†3d~©¯„°ýOà,ó²ec0Y^â³ÕÊ2ã÷÷)–@s¸¿ÌI \P×{‹$Dè¤ +cü­Í½·ù°ˆŸ8E6‚#5m¬¦,ßaù©$ôUԎO €~q3~æìj…âb¹Ö¼=±¡™Pz'Oø[•ÚɐaµÄл'Uƒª°l‘R²Y0ã/¯D]Á{3~¢%,&¬9†¶Êh(-ÔÔ€Û â8Õ!..Ao}FŒ&'Q{ÐDå֘4¤K€Žä7–£ûˆ´Ø:#_òÃxƽŒƒØ01·ñp?>éû@,›=D.—³H¶p9ù¤†))ˆþj6 §òl}´ôGŠIå ÷ÚÕ(;qôµ‰cÓˆ ¢rd‚h¨WŠwÆ Oùd®X¸«Š£'»Âž¨>Tã*#Šs¢Aצ^ôåo~Ííþ„Ö#Ûºâå6Œ¼\»„)'ÉÜ ‘/3`t,g”ÖÁ[Á}³Èظ^WÝúFÊæ9z²ØoZÐýXW ÇëõL±nE³)1{3¶T 0YõxdðБ¹­ßM ¹ƒq59€¤J£µr¨y,ΡT£Ëå`rº¿¿˜¼ÒÖÀhXcJµÚ&¡\\~…íãçWy5·· Ùiç(¢7¯Yâü¦Ë7 ’¾“ ó®QsÌ–Ê[Ò%7(¹âê%ÚT1õèÞèÚBž†h<šoÁÖ*K³Éã®M?c‚Q2B@¶(,?ö“v×ڏ™Bx3“µr©±;úCü_PænÌÌNäe !»´íéÇÚät`?;8c¼º„PD×Ɍq‡j“PÀ£nóe§¬£ +WJœ&Ë=xÜB¿A„7ÒfN-óÌêÒ`̎ ÑKðG×89\Í?Ö±ú†3¹”Hä¾vP‹3ÄO¤¨1Ò …ö°LÆÊÑÅîˆ ¹Ÿá:Ì$¥ö©‹Ì ø¢ï¦Ó4¬]·µÖh¹ړ4nü÷Š$«Yijx¿ûß 5Îö©žGR׿È鬇õ¸¢„dHtîöJ¤’Y#=í—[é[V£Þzl‰WsÉ®¬úõ­D^秃I™’îñïe¹”+…}õcÈHéÏMÂl&§!U¥Ö D´C‘%#«¾eù§,AÏwâAhsA;+"É¢ÒÆyí|¥ h$Bam¥°Àµ;î÷ª†YàSâ7Ž™€â—z=z[`!©‘ŸAë~NkXœ.xý¢w\ë^Mw…²”âŽ1æŽê®¹mPäö•i¥¥N馗6Ґ.mX<ÆØGù@ۅËlŒï¤Š›¶6ŒÌ­HÈ©pduµ1Û¹´A­•”yPÀåÒþ·ý@X„†Î$Õ¾Åjì2ÞրGè; 4åøQ'ƍ€KÆßè?Ðÿ +ôÒƜ™ÉHÅÅ^Ú(/ëÚæ¶ p#á½,{B?OlëEŠ 3²õ3=–GÐ8øáN#îþ¨pˆÝætžא7½í¯n«Þæ¼!(‡Úär¦bs²ÞA‚#S>2z7¬fãV47;P¸ Ñ•• _<â덈X0(}þL³lT›{¶Ï˜ʛR̍^«—= ‹Äf3;7Õ%¤Gw:²çTìÝ9’ ’¢'#ã«â º!²p-o-"¶ W(„v˜áêä¼H©…jñ0 îÓ?² ò¢@·>Ôúø/‰¹ÙÔ>Ó#Pt÷ƒ’eQ\K Ë#CÞü~j M¶Iô2Õáß3šôPHƒóØhÚàÌsç÷7^L¿}OU¥^o`_Œ†tüC~1QeÂ(ö}~Q!bQ‡9íóK‘š×6ŽE)ù‚#úŽ®­n&BÅ9= ’à• ¶±‘‘Óɔ„OaCõ,µ‡š°qtäˆTŒ!Q +Û_²pƒcÆ"ü³.7z GÔ)þnŒÀQ½{·¾‘ô¿à•s©&@.0Ç)n¬ä;àm)?¼ª Êè^™’q—/â´ó aI<ôï;*#"$e÷¹&)E:˔˜æ(lcºâžå°çeŒ£ +jÁ^¥¨_  M@ÇB%„-†Åïp©á€ä/Zvíb ÖÐü8Š` HwëãŒöo½jN4¥£"`çwï»àËåӚ$ž±Q¤”[€ió±¤ØB®ó[¬¢¸óÛž>Æqø™R"[àô)ÃDDµ[w¬ˆ‡“‹ô—à™÷¯@ð!™£lNrk5¶•AÒ#[¨•!¬èºØ²‡ŸªáV¸þC:© _§l…à\ƒø©|à]Œ —n­/™®üÛGVS“¨óµº"bm™Ã@ew—P¡ ÅDl§ïòÚZ‰‚:%æzä#¤¯§+ÔEç«Vzœ7a¬ÉÐÊ^FÞ'Øôª­a_ø ÊERŠÈ븠ö{ýÂñ3eV#š=Q™­ 2:WvúZæ|Ö¿6v§–S[h‚^­aVSÃÔ®È\á}‹ù9iÄDNDtGŸ‘÷Ù|| ºkhïöO–j_‚(ÅT´LM­¬"û°_[G‘ÔÉ3H@y¸­=EÔ͍„fØN—_ö۟AÓCõ‹"S*6Âփ¼æO=bò9^€²$Š‡×LšÁmé¼("h:wÜc9hFéó¡-íf+¤c€€ø„±(Gmˆ-Üfó6ðÏ¡¶Î¬ ëÆCDsÉø‹s”;-‚5º—(øPÀÆ@Høˇ{ÎÒIƎ2⒏s4EÇ,.¼í´añ;Î&ô§Yܜ¾ òím- VÍ@¦]{N‡-HÔ¡À9Ðҁó‚TøâÖO$ìÐ]8Çp«=ѮٸõO˜y΀Q]cþƒÃºb1öœC@T#úÀ mâÛð°å><ö` mk.®wLvýÓË!U mDþO½÷tqÍ ÃF #‰¢Œ¡•ð_kÞ¶ä…ݸ|¦v÷¸u­ƒ‡¦&‰î9žrÕ`z!֘Or ƒja¹%LÞA)ãSZ²¥{²–Ñ –e‚ÚgÓD?\cŠíÐùŒ$x¿òa‰œµsk!E +,£fd½:+ +6Oò¸¡Š1\$øí¹0*õñ¡Ô5LÚ®¦mÅÔ†‡32’tbºCÂO„ +yÿöc¢…7nªRM’èE ¿vsñ%r»nW ­:0!Û$çž:šïi|"Ö2J‹à£§#²»zQŸÀž!Ç‹R>vs±Å±ÍgvdLÄfP°LDLL%0%­Ì÷òEà.jº1g ­×1­·ÑsJ´C/Nêèf»ÑˆN<…*4^’’ÉQîEh¦Y?ý¢æ`@¤ÿÍc71It›Äa†Ü)žæXK§QE Ä,ÌEX>ñ †¥æ¥§êöBÍ»òŸÒ7F¢wsP!Rw½ÈÒlà_)…zã67®ôãÅr @0¯Ïq†;°£àc˜‰W‚z’%=Á1@q¥¹± ˜WØRµl…ÂÝÈË1J#ÁUÿÁ‚t0%ù<¡Ì‰˜©|Àӕô×>VèƒöÕÀœ’ =*ÌaWüÕË}…3c³ˆJý¸¹+ô싏¡&Öjjuù, œg¡Âst±0ˆÜ{T9‹+>m ñ‰P: žÚkøºtaS¸^éöš¡Ð( íRű)Äý§­¿hv¤Ì–G‚®S䝮âé0õ;mü̆ÔG$?«º8V¨Ð=Ã\ÃË×^}ŽgQׄš¬’ß¡nĄ ‹‡u2DLª{ûKÀ¦e§{A&Y‡ +$cM³uNRµíÍPõÈåàè­_¡f(Û­cçñžŽ=p°ÜòÅ'Ä@}F3Z#wˆÑëá Pdñ€¶iŸo{^Dºp±Êµ([ßAØÌé°J>š¾~6f¤˜ØèoóQ´°½A–ļ̝¨ ]€´I‹ Ä»CÚҞTZ(Ês˜?0|ï'”7ËW]"*ÕT²3¨èö>ÊBOs.µ]\5Nn=±~ÓŶsâ€ìÝf“f 2Xo¿3| £x°é"úœñ4Ö×¼§÷úœ +X}b0©p;,±Í2”ÎmÞ%3 ÃmãäEAⶓMˈ«[•—“ñ£aúTŸ«~Ñ.ú–¹¶Uϼ]ˆ ð%'ZDÛƛ^0S½Hå@d_UšTþì °Ðwp>%Êä®Hc ±”ÚÇôOš™_'ï°ÏÎU °Ý!¼›‹ÁY"‘‚³nêuïÒꥤÃl±¹Äcé¤Ñ6Òƨ +vÙè:ÔYëv{üÒ».RÊ þK2Ž½9m'UæÚ*4d„A’ÀáØñ— +5õ ½;ÉÏd#ä×pYdUÛ¬^őÕm(ûamc¡ÊP’Tš‘ B2}h<§YàˑJË{OØ~Œ ñہ"̇#c38–Éoa^=S™0nÃrµÑ>ÉwÒ Àõ«_Ô±0súýmŽe/B«ã!‰ˆE¼I£ví¨ø®zë!.džrdíɏ| B®xáO‡ÇuažÊKšd«kË ÉÜ' äñœ–à¹û¬ô"÷¦‡ìÑ·\½À¢nP{Ú<ºL$ò¨)üqv•:}s±ïˆAþ³$h[^ì!çËՎAóÕw8Á恤|%3¹õQÇþo*µrn|ýq䂍jå_-Ùæ{ƒê م`ÞVÖž‡eQ Nb¤h·aºwÌ(F‘{\yÜÇ*z&PPš˜8;pùüãzêÎì*^ðûÁŽ’ï€ÌKçZõ?‹Þ¬}؀¾‹@ú½´«•ÝñÁþ«2×-z¢ÜeÎO!ÄoÔÂòldbÞWEš·<{“”ì—üí‘Zãàý™E=¹F‹êpPûv7+¡}ëFíœÛòèV€Jw FO9×hõ¹=¨xԟÃU\Á&Ø}—`È"ÆÉÐ*8žVá8*óË[’§éÉY¨Ö@3nDptN`ˆïäøÆÔK'—`wöJ\[ÛF8Ü+£9؈6§Cài}™¶< A4zúì“Ж7Ú,;†Y¤ÍXüq‹Þ”)._[Wh+ÿôΩdÆ/ýr•À9C #Z8ž‹ÁFt¡æÒÌ¢bì‡àn±-£%¸À倷ÀvÓwÜBœíà-ž½+ðnT ”Â^@°íÛÛ +K,Ë=ì!ÀÀͨ9 +¼hZ!§iÆš‹g܏¶ÐŸ4+r+lÓ5f°â +ãâ|Ì]m$°~jÃnZogǙ*Œ¨Sý¸ŠyA£¯UçÄ\NVýsA£ZÒf@Aþ=óœ‚uÈT3Glxõø× öàóDMTÕ_ cá"UbÑG¦:m¾ @åçyòƒëÊÙv0úyuƲ +Wý®…tþ¿>žmiíúʆeþ«?è]€3ª;€õÿ›¡H“Å*fbˆ.ï&Oñ F%yšxròÓ3R ­@˜Fô—#$“ÙžÂJ¢ït“¯Ám¼ ÁRÀƒéâ#‰`”êà·§éð|hò$(˜6ø¹ˆ ´ä‚ELkK»ÒèÚÜ(ŠÀF(·æ‹sÀä|JÿL¢UŠsˆcU_³§6 +e/øÿe¯lL@G”ýd—õ’që_Ϙ+õóË`¦]üû\Êþ?„8+ÁnÇm’©3‘T$1€LçG¢Õu?e¤g™‰áñM~Î@ÇÛXŠžŸC±· ¼ÜFÿà}]󪏄Öý$÷uº QóÓÊþT±Ç’ªˆ98ìf­ ¨·¹Ðä´~¸Ý(iH‡#‘jèYÄ.à9HgTº„ÈLzqî9¯<{º/…C’µ|ÎF炲=Q2DÚoÕcß°g¶x>Å-£D7àù Z ßåߢ‘þ + +$ô{™él á¢o|$/ƒÕÒEK—èP¼–5âu~ +Ãh®b;½´bÖ>tŒÖN=ZVCø™C5ÔeðëÝ÷rôùñC@?“˜ð8ãüa¢nŸk½ûï!çïå ›[!¢·wß"{ÏǤîöyq=U;ˆ`ïuÉ%ÌN{ÒÂesÉcñit=+¿‹FjC¯ã-ÄýÈ¡?¬D| ÞW²"î\u#@˜(fòÑ4ê.³æî“(aŠ†2.µúŽ´ä§´¾_lÊJÚå#y¨½œ'ò"í凚‰”ƒ/a@ºî÷AWïú›T¿„,Ϩ¯pž CŽs¦c©,͊¥µÏ¡Â5-’ôÞXF#gixØv!-ô$Œv´Ùú¿µGBFRÿNî”Rç„&DóÏæ¡FÿSWa²F¸Ä¾‰ª+²ÇŽ=ej »¶»‡‡™;ø£xžâüÁì5b+0­Tß)þa‘ÛGeTʕò}1×Z—Y[ '7ãÓ§•ÂèªüO dãw½ÀòÿôڍrH¶Arn¸ZòkÊ%½rýtœò{xþŽ‚A¥À¶âù§aZRHø6Ñ´cºðEkë¨ Í0ŠE鈦!ӋD#³zÈyOAr"=…ý' i1l¬tTÕ % #åmfbæÎk‘­ßguŠöe#Õ¤ä„}25ðTç/æ»ÅZ>9©·×ê'L6|€R6,1U6à­P+–M-…ñ±¡ $/(¶ªä!myXl…±dlÕ?HcCC Çò¸¤8‹?ˤñwÕæíån$ûø;¦I¹)ØzQ`Pž`«)Õb~ ØVŽ^…8Ç©Ö÷tÞx +u4(51»êʳ`†[ÍC&—Ùé˜,Çy°µ›îÜ 6 ó<.\I^ü +6)x Ù-›Êa”ÉSƛLP“½…”šçœ~L•ÁF )€9`Ž~)5[oÜ\wžӘäó‘/@¹>[ b¡dbŸ¨œX@ë|eláöòÌd%¶åoÕf-§)9"pܲ–dâiàEÕW‘p±ß8Š¸h…ü…À‘¼lЈòP«Du¢´Ýbvq ŽL2BSŠiá°P·`'°³ôyÇH$lÙùq°rZzÿ` W [fÁ»“ݧH¨gDÈ4RՆI؊„"º~¥h©¬C¶mâãRÎߛ—žu!— øäŒÆ»jLE½á;*Úlˆͦ@‘P¹hÍtÆ}¹ŒŠ– ÁÁÎ :AÒìðŽÒ„Ü  +äG:õž]äL}]Œ±©äÚuR¡R –*ç«¿w C Ð9śè·Ð :úFdZÄUÎjºõå ÅZ‘NeÐo]É@G¸œúÖÒ2ÈG&!n`×Ë;¬ëÁù?¸öé';膑_TÎ2¨7±«ZíªN݊7a*ïÞ[Á‰ÐÇŽ€…fÝ$ʵ|ç²á(°ûä™a”À<ž¸uÏnÕ×.)_ 笲ÇeFk<òEMˆpÓ¶Ù«—ÃaߙJø¦¢4,Š†»W'ó.8°ÿð­1ƒ¬‰P`·?/¸îH<ŸÐ· ‡%köå§â!Ð<"ç„ +î4ÓXÏ$’ïáÁ‹gßKñˆƒø |;»ü’ºèùÞRìÆë•{Rʖ ^Â]Þý +Oµÿ +Aˆ/éèà?hª ;hM¯}ÎÆGoÀhðœKHǵYêç8÷ÜNk41£³+ˆ›±óI8‹ºÉë²Æ_…6ó_ |ÈXȾØ×qk`Ø ‹\GñÜZíÒ#>žŽÕ:¦üO†[°öY%%Àõ]ŒÀ1ÿö'u4¸,tMù"ÌxÝm|¿8X¤=”{Â3è(WtKnM¾ß!«c`¡IÞ]ýM+AI×±ˆ@ó.‘PÄJ_Úbs‡}ë¿A³æPIø +Ä`œQqp®ÿ҅´9”1ÃÇJ6&¦^ÑÇS ò_À‹Ë fÚJˆeܯŒOˆ4!îñ͚ñôµ§–„8œÀúmÿ‘7‘]i)~U¹mläm>Ì>T#kxp[Q…á_¾Õ°Ìóz‹T½GH.¿hü̼pŠi âÕ=zÖÒ¦Ž +£W)ñwë9M³u&¿%»'0±E-ÎE¸È|—m V>û@~>Rʛ/ÏdùÞË7%½‚^RäËCúéظ®~ ©¼2¿.ã¶=ë†Ê}Vl¿¨à¿´¬^1NÍ +ªñ–ì5ág¸–/> Ùh~‘.»t¸é¸Ã![÷r2ð¢<z!‚Í+†à=+ùá²»áò6î:NÕ 6a–(S5ŽRŽ¾Œ +aÆ9³I¿jEg¤E…Æ%_åmù¤6ˆÞÜw& +c$iã¦JÐvÍRqª +Ô-Z3 ؾF_Š*˜ÈI.0ü×'²k˔3픸2#~YÑ.­Gmr¥GґæïVf( µF ¢y2•m»Q"ÇØ/iÔ§‹Ò¥š´Ý¤™CØð“˜yH¹*©˜©“Mž÷A;qv4EÍ •¾wˆòšI.›“ô#E­b&¿dU8&K8±ä _÷0’\â 10ªï O*ǔDeéÌã@j½è˜‰ˆ’¶zm¶UmîÒyÍL`|‡ðZÆ1й#2j})Ê¡YåØ!—ó0­Ÿá÷~õ*†º _y‰R "ÊV•£Ì©3bMŠâ²s¸ÆU%Âñ–Ï“DÂ$dê% +Z„œ·gX,؎‰9Xÿ投Èröm‹“?d9æî´HM1A '—÷ò +× {‡_8LäŠ ¿°ì•åôo(²Ն].BR’È™=^f°y°TíëîÂ8BÀ·=QÇ|”X¢Ým¨8k6Òê•VFæAmÃÆü+ÑMÄÀ9P÷ˆZ€Em¡‘:½4NŽá””)wÒD¡Ù\ÎÁ?JLI²¤TŒ¨erµHÉïÙFÓWT¾ÃÎ!YWØn0ÅúÂäD5I6s$*cvê Á=~Yt…Æ]v±é^íÈäÌpÄQ>.{ºùÇD•¿Ð°f"°´- œîgUÄUv¨ù¶Q¶bɘJ­®‚”äÛöy˜o->X“–wãU¾:c2—¡2ŒÕSÓˆŸ x +†76%#˜‚QÄ3ûN’ ë‹4~ËÉ`-@ÏB˜ô>`„D?`'TÐSÙèD܎¨±¶:(w|ý´›1$%x2ÿ'þBù5ìՉÉx«æPH˕½É¬ã•Á…¼¸¨É–ˆa¡‹ûU*-)Ã^Ýł‰Æ2ê·áÔþÛpM› ³AeÇÿÐtÁ4du¤‹ÜˆcäíQ>!­Nfؔj²"Ð,¡AÿD\³Çn…šðæÛÊOpvShõȏVÑ¥è+0µ] +¦IÓóbû‹ºցÈUôB䅺]Š?‹`Zz ~KZ*UuPò¾KLÇùUœ&ďÛãz¼¤‰0I½”lI+ÝFBˆ°Ý)ƒ S'èÌ¿½»©„$(Í'%;å±ÝVuðàø‹! ‘÷ÕÁÌ7n뵓ªùBÆOý› ,2ñ†Ï["ҙ¢:  äî$×ÿéêNÞ ´8ߟão&5M zŒÒk]tY®5Ò+¸ïñ€Ë™£~€1;!øP¡–ÞqÓb—V&=2¦’¥t҃`”ÎŒ¯“1>S œTHzä¾pëÄÑ <`8‰Ø"ô rjín¨‰!>‘ûH AY--|ó°)Bµë»%À%Ff7­‘>OŠÒc0O¡éÑÌ5[˪m¥¤j8ozžRrL¸epû1NƏ¨é}ý}Ç!a‰ïYHIq)y}•"fõ¹)wµ «Dà­üePˆ¶¬“'Ëo/¶—1Ø +÷°;Ö#Ý,r}ÂX‘¥›\â#D&³#R”†,-SÍQ Ë>u*Ç‰Åã:SÄFñ­`;2Bnßµ±ž¶§b58 æŒ¨èDYÆ!?joPʆô:¾òÏ©J ˆéÐg@X’{P€±ûр,– º^D°±›I¾ù›b'”WH+Q ¤ £¯…f«(뽌/ƒñPÕ/5Ð?ŒÄñÄÏQÚ×l'+×Sƒ{ʹoðß©w&ìê=ëQÂò„IU• b}óÉ„sÆ'7äí·m>€ Ú¡Î”ŽXÑ£ K`{9X×ÍêÊIå^"( «uÀ§+ÇìÜ  ›³@YTdÝJ}0B¿»® .±‰"R±ð$j=ӗ\®4¡µÞ—å… »úÐ"ôñMµ’M.*ÒRU‰îb›æë}YuýQ÷š¿»’M³±• ]_¢t²î'õq“:ÓÃB¬ÿŒìX´ÚŽÿŠeô%§P½)ñßðRB„7X2¨]å¬÷œæ†Ø ƒÑë*ksـ02.z[ØuMÛ; ×fI¹5ài½”€¥d- ܨu,nØ©®X%爇÷!Í} X±ïz šý¥Ë°‚‘ú·ŸWøl£w*”að͂_±¬1zS‚Cv à_/Yî±ç#¯Ê#÷RÞy–+¬£¹$a?žŸÊ Òl»ŠHY±™¸s)Ä6€R̝ãEÞç’>׋¬©4xVæ–ÿÉÜà&¹i-}sP©ÇˆqÕeŒx*„lßy|ÞX³xkMLT "×BÑ/œ/¸^Y«èª # o3ýéº ›‰j$òj¢ŒuqK¶›PƒIfލ/ZÇØCá!JÊ`֎Ðl¨Ü[ &Ôôa­» žÉÕ¾­ŒíjËÅ®k׃º ¡Ót>‹ôíI´dØ(»øäLå’ç»2aѨ™ƒZò‚ñC€lìƒèAnÊ#k‹£2¢ýrÁm3H¢9âÖè…Ɇ‘3ø +\’>f\I;‹G²L&#¸`]%8ò*tä$ä#Z³”±}XÐ!-דÒ5q¡ýyR}ø4Í©ŠÔhmB8˜ÿÔûÝþ 9˜úÆ?Ã4çÅK®º[ÀYõUª×tá_qØ|Ó­5L >Zù”ÚqƽþE gÄ#©èßëÒô‹˜ê7Ö „£û?˜Ð+¹]åÄ9Fa–qî6òiñ-Ÿ™ž#ΆÃp¬@ꌾ´ÿ¡ CكìíÊCÅpÚÄÿò@0ϐ{L‡1²©\Øb‰GÖ7“y;?ØKÓ:dऋe…Œ8{s\' ²rº”>2‚cAv”m\@Ô®ŽžÇBô/Õ9e% )¨Ž-ùrÈ$°-)Ãs\¬l¶Cçc‚q§œŒäÅõîÑWÖX‘ººe*(|Á¯·- ÅÔñ¢ðÄTOŸ˜Î’šI[(˜ Þôô…5-Ë`PÉÙé9b´ X¡uOê fÕÍ@§K=§á´Daþ—Œl²Â£6eë&!K9ô¨“ã#gâÃê „ÙErøI™nŸ€™!È:jQfH¦ÂAÁa$¡Î3gŠÝvJïü¢à‘6Җ0+†ùgÓkw`;¤¢ayiÐíõ:&qfûÂ`¬bâ 2 ҆-OúßZ~(Ä<EPÿeDf”£± -–¢¸/Q8Ýb¾ÖèGµôIû&™§Î?CÔ¼|øÞR1z­òKË÷²í´y‰õyu„R:¼™WaO™V>•Vx‰—áœÁ¤ÆÛ€g8«j9-VF$R¦jI’=æ`t]ÚNXb•NWò¨{›€/®}¯Ù Ïé\îGÚ^Ñàã䪡%{wÎðЛ±ñÇH Mt“º&ñ¤aŽ0ÁÅnYÖ%Ð&91L6Ô¹`èvváª=ñjŠ/·JÂ0/­OìûÇp›QÝiÌöª¥¹£Ÿl:C=ªº8ºJK™‰™¯P +"Ü0M‰}±¡ÉW´¢˜2!FÖ14²GñbóùÖÖbTAë’0Þ0yÏ Y Px,tŠUA?ñ7W)h„ºDÚ&‚æÿž¹’„û;îÊÚ ³»¡YJø3‚pc”ŒÆ>¹È…ç„͆†Q²ÑCtÃsk͊°¿õs¨4‘©‚)O„-P™:àÇ#ï+‰rµ0BRyy\¥¸tjÓê2>ºÂ9ã8-EÍLB‹î઱Ò}%5i¸„HyGð±‘F¨ÀY$vü²w>M…‹c ”°zôc_”•_ž€m½®Œ:ÆiÄÛ?`K5„vؚTNâiý´±6¥_GG¦fêGµìð šú(4"”ÅçäèتÃn(v÷¼œÊox–¨­íxÐãcâjPKÜw77X¼çj)ëà¾Ñ—Vhĺúñ€²30ŽS…½XÌæ{Ԝ‚b’f ñB + +;=<êÑ +QüocÅF# š+cˆœ•W‹üÉá˜[+¼É±0ŽŽä¿¹ÈíþÊፌ¶HËÓ-EÓY¡.í󧎉 ÞMÈ&ãUÒ+ :¡n_„v}‘gážÈŽe6TºMš¦¿Õaëo"­´›šHJPlc_ +2ë;8T¶Ç/ñ)¶@‰_ÂËút»Ù©±„6c1®Fýð ɒ«wØØ JÝÃÀxæóˆu?[:-mÌûSÆ+¢´—h ['€ «Æ ›^ºiÙ3W¦±<òÙ7k/¦®8|ʦ¢B +MӖjÓ<{LMæªd_ñM#`ï5*[N,Á¥=1I‹'8U‚ÂååÁÌßâ¿OˆK>˜ô‹†‘~[²3Ï XöoðnG–(cH…瀷å,Dv‚Ÿ\ÑÄ>š|aÂ;üCD~j[}ˆêþ!8A_¡tù)UZøñðll +’X¾Iá77!ØA¥ÂÔfÙ¯aœÀ²•©üˆ †hoÍEQƸë#ò>N*ûÐúŒ-×!û¯ç!ñ…hxÙda¿qÂÚþU®…ÆÁèeí2ÄAúQ)EÔ?m@àÛÇ#~ƒ0莎QéÝÇãŽfØâ¥+êéƒ^˜ #mÊ A³Ú"—–u[ ±ùWý*¦Æj3ò¶¬ÀY7 ›…üh‰jéͬð¼8WXHÃ/r_pžñJiïœv'4¾ ¢Ó woÜib÷Ù¨['M‰îXÑ3ï¾ ] y*ÝrIâ?pSõÈ XCŠ¥¹Î°ñHרãIk˜êXÕðŒðhl¾žå”ló¥.]h³,k¬ÅF±¨È~ÒÏí <.10ßE ÛÃSÐÕÍ9Q–ÿ»uH ûÍü«r¼y•8 çËÃOT‡òn®]ø¶¹£ôƇxù Çå'Œ +N¦VÚm® 3n¤n† Ûˆ¹scƒïnx –%¤?k|°%ïB¬U®åù‹”c«?å-Án8 bT®9lX€º=mvÍíÿ(yÐ,Ç×½8)O™ç!-Ì­Ù)i¹Jñ³FK*Z!q¡ ›:ƒ@t”„ÍîŠ9Z@²o؁ÏBó[äŸI¼NÜaùôq¦Â0鴘}ÀðOWp€&ûÜO²tsîÇxĈpž7Žg(”0cœSY§Ûxh"Ï6jieYðùó "ϯ„ôP‚”öÄ픏´¨i,Jyíƒo5[ +¨äÙçc'½âJè·ùgì3ÀÓÌCˆ}C!ÏЄr×7L7­ö=¿Ù"µÁ¼~aû Ï2n7r‰ºšæ e~C1ÐaIà§WwQúâdcõú…i™E¶^OÁ=4¢„£hôç5O7›R©ƒÀ[hP p×zŽz}ôàÅb;tà|MÍ:1{ܱÂî—üî:)ößÊËO+èäÅ^™§€Lìât,_³¿h眲(Ov‹›sºìæß+eÿ!±2T¼ï™M?SšV…äÎ) Ÿ_àöCä°ÙL.€ö+N©¿®K –h»àr(50ýåå)ñEóÌFېËv$D¾·fcã„6 yI&¸Àݞ0DfvÇþ–Ã9‚̺ø;‹ÃÈerEmIà§Í/fªz£Ö°µÌõòƁÆè!¨Ø¿8Ò †yíN bñ¥1\|ƒËã°·_š™êT,´IÓ]Qøìôç ‹ Žýâ%jïÁÇ@d1 ö38ÊÊâêÙ`’¯ýþb¾G¢ŠþVpá}¯É'¿•#َâÝÄñ e?$îºÛ—×ۚegIҚŠ”ø~¿bšÇœ&lØj7åZ%p–•5 ÆÙZŒÇ#ÑY™R™Øù¨$Ï'ü¬¸ÎõD©$‚N¿7ûJ“ù(aâ¥͊s\³"&ҒØÝ/$B¾æŽ¼%¶Œì‚›mƒ¸*Îz©]bò͸ÓgI²@ÎV)úþ{U3e*³ñá<§TËmpœYrØàt‡Q +;ê#'NþÇq~+ãà`X¼QxØ·+ºR˜ÃÃuwQÊÎAèžó¶gÇÓ×› ;Á :á8 '¬ÇÓÙÏ + ¶Ï°°GîÆMoã¸ËjþØ͜]éõ—G΂xKX-‡B†g‡ŠüŽgp~ýßAO}•Kàÿ[ã¼ ô®ï‹m6o½Á $”ÉÆÁélâyaȕF¨³Sê\h²íÙl1.÷d:q¡8¸å‚À¤ƒ?à؝°‡:C•ÄM麠Ql ] 7Öf*þèÁžµ:õ€uO_sLÿ‡z«uú‡ûP/+·,Í=tÃ=Öê­ä-q ›p¨r瓍i®úö³Q®­%íé¾[òíŒæ7Iþó<l¨eQPBØÍ*â7@˔{»óúPogAlwö^JA=}±¢6-'6‚:–j…eòà›Ð©¶$qIæXÈYÂøK=)=e{'ï$uÊ.ËÛi^¶Ìú50'ðfnËÅÊ Üƒãx;ÁœBsCa¥tUŒ‚-õ›¯É{ç.?j%ƒvúñÕ{t? Î5O¿)×vvÂM}ùÀ‹ë´bÄU§'9Otcc_¦ðTeC¸•e™²Û1›¢eÛ"=HZÓÜÓédë5;*€å¯àXL£¢„fŽZ&«Óa$$Lÿ ˆ[˜“vÓ`2HL4eÊÔDäA¢™HØ-É5@uXÓFü=ҋ,ß,MÕ“$T®ž¶ŠaÈV<ÞmÁ0hªMì&yWßcL„ÊgC9g¦¨tàï,TPmºàHþ ;ÿFü= AÖWkҐçú›„7Ô-h˜Eö-¼ƈzÅH¾Ï’ †Ú£ä + D­ +!ݚPa Eè(4Ù „n7§0$•>@£Ô,š 'Þ/q4ÛëÓj~|9¸…—C:Õ@ECS9ڇüzFŸÿ¦ò(nW]譿߅¾Íî̑is0ëóÏd¢àû»AÌÛùáÏ_Ì6{3i}o¯82M²]iî]œ™³Àª DôÃüÒÜM¯&xnåà1C"41'îÑCÞS ÛõG…žSXz‹×L4Rùø[ZYmgçvã¤Èdíi | F¾ÒpïÍ@©¡¢”Ô˜0wx¥]­$¦°áÙð‰tãE=¿«¼.uC{5ܓ’àH¤½çÍ@”!ëóR¶5{}“ò½*6AØüñÌHûúhuÄýñž2×{æ]ÔnìS)9 ½¾FñÏjë7~™c ¾ÄsÕåsØøÞ8ɓ3¯H‰P}µ‘îHÂ>ðJìRaz4)#¢â%Ð>2‘U7+¤Ä“ùcï›òã»4oZNäD +¹ 3)‘çTnfp&Äîß-Wŝ½.Î-»’‚oõº>òsÆ*Z|PÔíÆé÷zÌQ=É¡kß ëKˆl씬+, NBãΪ{T‚„¦Î#GV¨± (æpgû<ÃÊ؇h!Uk ûŽçlß0Ž1N¬/hR)³‰_eú]ÈÚ/øïQ)ÊTqHÊôÇY9åoÓ|¥ÑӆuÙqŒ7g×.„¸ÎÞ&Y± Ft7$ǨÂæ•è–æÅ-p ë[XIØ¥Œ9uøN6’[¢‚à”0Ü!É,®Þ.NYøÇî@û‘GD嘷éŸÇ¬†¬.¶2;¤6‡b\ f°À÷®“.ãç<‚|‹WyaOzßbñ + ….iÀÅ"ˆD÷¶ïû˘®¥;tf”a® u¿²YxÕϪ«¥z—;cf—Ë°ý5ó•íý¦µ«ˆlucsAÀ$-qo)Áaàrk'舌uá–t¡̀Э5€E)¸2ØÒEƒ%‘Hnóo€V\ÖÃ{ã1u˵PLóÒkYú\®88¯eS\€–+xÀk[„ùÈÐT¥0‘m¯ä-}󌅴Ãv´‰²Â@)°¤B¬ëȅÎÙ"L¼“³Tîníp‚*YLÈÀ!‚êJZ±T?ÝD÷ÄÊ*HíP ÄEéÇÓÕUœÂ†cn! +ўõΚ$\PAw úr”ù`-CŸ´dò¿§ïHÛµäHn@j±b£«I£ù[$çïØU”áæVýJ ^ȈMhó]%7 #t¶«¡|ÇÀƺ@±ãÜ­ªÏê¾àPa¬È=0¤+?‚hŽâùhSÞ °®°Äq¸8 -C¢P:¨/Öp²ÜËv=҆!¢¨ÀpŒ‡^zÙIÛñIÏ.¦žÐh¼Æ0iÝmd im‰œbHÑÃI(Z«Db:©›êÕþ‘._aùªcój\o0@h\……²NK®q•¢ß*øjðÀ£=É +­ÄD­Nãƒ2=“”¡”,*`Č¥_Š¤îÂòžÀ±)(*nƒ±š`ðJÀ›õq—[ꓸ‡ÔÈt'p&&%Ü1“šÐCƒ×­Ћ € +;`b¼ýƒ‘èŚÃXÇ|=B†è…f¾âXP†–a«»¼À„›Ñ@©ßóÛZ×aÄ eÌáL¿±¢/;¿¥8¥•€Ò,œ à²ó pí 5tæE„œ&j‹TÍ/a +0'ô“([p¼€Œ‰ÀܛhK+SXòlIÙº=D÷ %‹!æ*õ~L¥>ç뼁šî—:l·B`³F¥MÙ9™Á[ðìôÖqí0bˆ¥ucî ³Œ)Dú9r²Goá˜X"õó!B(.†í¤9¸„3]žB•4D÷¿ÜÕÛèÐ!Rš£Þ +‘—ƒ\Š;Ë͐ …ÈOýï'w¿Ž“ÎË•¹³Ý¯•bŸ4~ ÉΧdt  º_Í fÝ/¸aϒãM5w¿î!74Iùé~yªïã»_ªZñ B++¾ ·Jëšxí&̛µ<]ëß0…@{6ËÇ+5o=ïZ÷Œå7.°ÆÃòx¶K…Ô“Ög x¢óŒ~9È®è¦Ïhr;Öc(‡SdµŸ–õm“Låރ“Í¡,ÛÂS5´ÔdÀñò¿@b»Õ=ø6IS†ø‡Î þ¤Å1¥Ô˜F紉š¼¼“@]T}ñ+‡5ŸDàΓfä—ÁShHPAU*pò!ø¦szi_Ëxwx]‚ L¦’e7Ënt´·(/ÆQà"ùSAV?C/Ž`ésAJU†Ý—ÙRI-»áàùla§N7ý’¼«†’¸º£ÌRËq\{~6ÀÛ$AF˜‚0þœ–:)<¢OÜÙ׉Èé¬ùe™ž¶«ïlV㔹gqIæ&¼À#óê Œ“dsÂoªÏ\ $’æ›ËÉâ՜&ïÞ"qd¡„ŸŒ¦ºs\ùV햴½¦ª‰Ðxòp²GßlÃe€+‚yiv^örL©¥6H>ß½叓…§†—ȲÚM;³Ü ”!AG}ººÆbžèóê'­…#ãÀ´¬‹©ï‘ +ësN_‡IyNçz¹\ñ#WÚzĶ¢œ½qf¤'øáïó5Ó±hдµ~zÔåµ[¤°¢†‚ ¸N몒ÃùÚ¹ÏÇÝJã¶ó»·TAxŒ2ÅbÇ|šÎ\ª:ëàfÔ M"ä ÂfÚ|ý‡Hô”Ôw‡5Ns³°³ÅhÉ ¢‰lÒTB R…&© ¡QŽEXP€!n²3Ú[«!”,È}Ú·ya,ì,/ßíTûA7GÓ­ùÁøÙ¥4 žãôÌë£Ç{7»8®Î˜»ß),3¿í?´kÕ\±gZª¬ZlÚCY€ :ð‡+\*û9Hå°ÜH>WdÇ[Õ²Zâ•}w"‰hJÇ<§ ÷CSé@<͑dîÕÞ; Ñ×âI›t[Ž¦¾j/×ÔO,xX\tÖ丩¼¸¤(dò=‡»f'íÓ­Š.XÐÜ-ÄÚé0„>Ýx½ë¥)st)ÓEP«0Ñ!t)FŽçA-¸—èpü¬CZcôT È_é© NwtNM§T☞V_RpCÉÀ,יó:Õl¤ÈiŒ¡Ì©Œ v°Ùȁæ Š'¤r;êl'â+ +ҚYZ°/pn_$6·$ÓÈ$örŽE« “¢Óó-ÚÚå|YeæÀÙþΦQãà×Џ 0i…ÔÞȜi}Xè4Ñ ÷}^¸‘[×^.%/sßÿ ‚KŸz, +ép"#$ˬQ.ò|*@ó»‰";†¾-/gý¨Ê½\§Tå ½„€9šê)ŸI x)ãWèP,‚ +Pu£;„M¤xàdG‚#+‚£pø‚¬Çà—X´ œæ ÜÂi©62,˜£çUÀzlÎÿ3¹:AÅüÅü‚†“v¬'ïiNe&I÷ˆÜ¥ìO¨-°vh»G\ñÑW3÷ÀN"dZíHÕRø ¹òÀé;ޝ³Í?pëqÁÃu ˆIýM)ÄWüV0 +F_è»ZYI5xˆôƒ4Pðõܶj–wórÃZ.´ +dtß-ZvÒfYCP!N!ˆg¤¦ž°˜ù 9µÎQÍω™Cÿ·ìH‚ÿM¤pCAl‚õFH캛?ò—„hQÌ-Zbù²­°]z¯ýºôaÀ‡€brèBÒô¢Õ¥sZ cùX¸Æé–÷‰änRk‹»_îÚ¾6o´Ù«žX"ÁPv&©’+øÙʟßÍE4»'m‘Gú ZÌ_ÀE.}bљMï8²¹åµˆýj¯õ¼{}PéR—Ü°(£a—Q­uˆ}'Zžs»(Ã'Ù+U +ä®@;¼s@gks6 5…)†ôžSühIBqÁ4M¼ÑŠÍôô’NÓm@õÐkÀÇ‘Œ• ¸ !cà›hïrCsIs ýk/öÂ1] +íÚd|mր΀é´-óÂ’)-«ƒa—P¯ ŽyvX^Ö˜ÂV¢RAÑuz,¿ Èáq_Æ ë9}ɝ`=¤—ÛŸ¡úIûEñ ˜‘ëÆGçÆNk¦,'Ó´½L@½*݁édŠ ¢;&â•á¤àâœ.´#¡¯ßeáÜÅÍ««¶®'ö„“…W1¹’2íhâWeonG —|E1Ro“ž¢ÅppBì:$uÚ(µ_ÓuH<Ö§Qé–h7éGÆú±à6÷ã@5”É݃Ǩß3ôØÄrQ~1MHÂÅhŒ‰‹¼ë€•Ì« `®TOnÿ˜;ö´_Ä RDµ-Ft_žh·5Î<‚³†¤Ø£ë¤ëÑ䓯Fûa•x6¿ßAŠÌîÉe{»ªéñœt{_G²(7Ò]-ª†[1Y¨ôóV-‹ÈrëcÏKˆ<öÓ¢0¿2”<»f^>3ðÒ²€Çÿ­'nš^M¢ÆIgAöª5 ÔšsðrfóØ7©²Ø~ã^ÙºWä.ÆòT#+Àú¬(p¤"¬þœ# +ߋ^v¦–Lè0Îos'*ÙQ.¯OŽ@:²HáMÀ_Ÿž ´§ÈIhàµhêc!ð¡ØŸց˜ƒmÌíVÙC0a"ùr´‘¿ÚÚ,9jQÌy EÿI D j춚„ÛÏVÑÓù)óK©þÕ´øÒÏæû£L³_TN‚x]-‰§—¡Òøó \UñÀšª€dd=VOÁm²’´:¤71„nuµõÚ·˜;r.I÷W^úÌÐàW“€†Âœï°0x3¿")ÆÐl|Â[*ZÙ ýÄ ’hJ¯C‡|A•„¡ùì%21j)ëA’ßmúZ°ž<Ïp¿@X„¯¢tP1ælØÄ´—>[ ŸÒgøÏDä•„xÏ1~'Õë :°¼‘dcÖù«a¹lSP‰5Š)Ǔú÷I•tP0¬|6ì7,§á´QÝÅ¡¬÷ +žÈÈÆ J‘` ö!k!¿¸l Iª&Ú¾Eဳ Åµw·m^’Mµ#_æ„ï—óZ"âÖÝ)®*zî¢pp -åõÇBFÝC–%­7À=­¥Ûؓ¨àÛ "`$|ܔtœaÏUˆJЕÈ®+ Nx~ hF’¬9µ¯Í[Ïwf'Îv‡ºYZ+ðœÈ•’Û—HЊp,ëÆgåAŽÓF[ia`LR$˜ü—`¼u*À*öKŠ+Ü¿k•`òDøÂ5˜t˜ÀÀú—.¹@ˍËÊðk{›W:¨<Ë¿ú}©zWsÖþäñbd`ê œî&L4Ù ™0yêħþ<*J”´B–¬_þ6†6VÜ@T]ùÀ ¦žK¾Z ±‘A( ÈhÔ÷`×ÂÄ …Ž>´n`¢ÌlòìÙµ +&ÙË^”ÝüŒ‰`ŠÁU«@ôИfBFê@;d»é}(€ïƒß|J÷œûæÕ.{6û4ñˆ`*EµLƒë¨_Ò0ÄØoiNAÈq#ŒªƒØÌñ³ ñû›o4ڍÎOs¡šx c¡T¿NCð ÖC€<ã¡L…tzÂ?g‹D<=Œƒ/¤>aÿj¬äZ•¿g.F‡Ñu9L™’A}+¨àâ@¡™Íe¢µ9¿(çÙÀ it*/xk߂pwÈü˸is .‡IÀÂç… ÝXQ>\Á. ¾)N›C¤Ú¶?¾®HKwm J"m#¨ŒIl JzìÈú=çøÃT))Ü3—¯­Á,rD,¶ª8Xø…T$îrAò¶Iê·(†GsùAMâ›6 ~«Ç_;Í.rŒ:æÃâÚÃ>m[)n Ž8ÇÕAœGï[C›·BF|ˆË¼òyÿä°@‡=Õ!((k˜$Ç>x­óÎÓÚQ»ÚRô±î…F8 ݬ¯¯æõF’R}HËɚ¡{¿+×Áï"–ʼn‡¬ª>HUÕÖt´Œ!GœZ "“Ìõ§ç ð×øæ®êb~· ¥0#UÁZ~¶Þm7æ¹7´l—öëAT¼5)Ô¡>#_§‹Apl]€cÅąö DŠ1¿K¾¦RfCäȁŸ-ÁÛ B¬ªŒNV?¶ 2¾ÕÑøM²[µ„¡k6ë(›S$Ä9kz¼4£ /!¬úʜ§Õj¹†Ã—I@–_½zW~é-s‹A£¶[d¬©1ö +Ú5¢‰\Sê ÑhÄtœ¹§˜šºî$”fnn–zK +,­s§Íî‹tÐ O ¨GÜ@sÀ§Á‹Ñ¿.2§#øC$Õ1„ýå\ʞª¦ÈÚl¸i‰Zcôãk}eU3á¯P‚÷± ºÓ8z3¸*„¹5ƒ|ÇދÃpÞö/â‚ð™ÙÏI|}A'uV¤^ñŒÔâñ´UQfæ8âéÇJRxPöt&ÌþR·!…êmX#Y7só:Y]CÕvMŹ‘XU¡òl—þœ—Q3ø2]C@:A¦#yøÃu1ÆÑUH‘d ¾õ¾«Þȱ†u2o£ã€ÑIu <ˆÔÂ%ĩϽœá½'%¾¥î;E©_ÄÐõ‚?±l ò<©eNìCÌôdÄq\ÓV·èËqKAâÁ[Eo»ŒÄÚސTü¿~#ä 'êŸs—:=œ4?lIŽÁæ˜ÇÔçÔÐ=î›e¿H®a0 ˆöÄùć‚¢ ${£"c£޼r‚GîñÀ§u™L’8Œ >ù1!öÌ$~~±š$éì‘d†Ê@gF艟nè“o÷—™àUú|©±Ø$„ ­šø•ã¶G6‚ô2‚ýIɉ”—¹uKi–‰3 „ß±•6À ½D¯wX;'n”~üì'áø¡µhà¿ PÂGî"‹žÇdºß´tðLšl<»MtØü-ܸ´ì„ÑG¿WïnݐÆ%&u2wF/4Á"Œ$<Ç9 ü£jTÿëÔR–@!iO|„L¼BZø(ò+[i©ùùˆOpß°}nĪuΝPÉø¬‚4ŒÏ`L!¯ñ8ïÙCã°Q¸X 7£ò'{,ØûAƒ0N6èÇ)–^ÿ¡Ëa¬¸ÐX×<‰ú’+ùÏ- yT2øA¢“g·„ƒú¨yºç@'fÏøcþð{o Xâ‰.ܲ•HˆŸŸ÷؊«[‹‹’ .êG9]FC’ k7„Wod5%£/vÛIý³,¹0ö"o›÷,ܗIx4jøEÅ~ä½JXçÆ2”-òŽqçFoˆ4MºÌx?“È"n® 0"å¹q/Ö¸gÁC(ëm ¸ä¤cà@&•Á¿\l›úÏIÏÈ/ŽÀôÕt×m>á^Øû.§_&úx—ºuΚp]J`9ˆ¼I7|Çê'ïf祰WšP(v5—^¢= +€H®©…ZW\¹Dò²3°ú…°®WnÇVðLÒ1,ŸvS¢‡ îÒñH#U+Ãb(Á $Ú8»¤àÈáÑáƒ6Ê+‹p$©½P8çdÈAè4ð +JZ×Îdž­†P ÑKƒÕÀd6Ûª‚¡$D€ÁÅ"3ÖTŒdû)å®Çu5ÙU\Ü?XJñÀèþ{ @8o ¾¤sça¤’ÛJ~ٗ¿µ­9mž—f¯u€´üý‹jDxêB¬Ÿ¾õv;¬/½ßÁ6DÛci¯—rJE¼²u^Å|\+2mÆêuànÜlÁäßMþ +ޒëÇ,Ô=z+bì‡x۔œ+Rÿ[+Œ-µ¬Ë߃ø&Ú¬qz§Õ¹q¿XᏏô¨XÞu±‚wÀÄ +ëxÙÍ{&Èúþ—ÉV<(ªY…5æ-oï£y¼½§¥†>š)¾5ØyÃ.k¬àš/ZÆ¥ +å‚×&šßÔṠ÷­1ûñ‹ŠÕ›x_T|Íüёc5o¤œ„N•¬àtÁÑÊþe=™C:|x“%ñ' K4´(óÒøf…_R¤ +TˆžuÌ + +… Þuˆíe‚†/$„°'có؁\–\¯:<,§°'bà a§)°Ú°¬OFbs P벍j<$÷ÜY13Þ¸-À¢B¥TÀ&ï §)Jµ\²Ì•‚€‚¢x†„>™èÌ3„,1äãR–íšI%.ò‡ü.„–©žÿîúe l1 +<4²5âý|Ðò;Æ{3RÖe´ßHní8!K^¦ä EV§ç6Ö¾®Õ…jåá¦*‹A†ô„÷³u~BÀ¢:³¨¥äÀùi˜#4˜&CÿÖÆ@ÄäSµ^¾÷˯ŽdP1ƒÎ?)†G|¡Ýd€Ö!\Y|‰Ö#ʁ\â<‡$ˍkNpX‹aAá#Òß¡]ßwS 8E ®è ”=uào݉ùÞpÂÁlT1ô3ÉM¤O4­½ÿà?á!Qa"rE¼#ý Â襘 /´ðð~ ù̊#[¯ó¤ˆ„è¿E”ˆ¡\»¨IIò:üz#?!&# =n1LܶTÎA~:»ßFaEXŽgQSV3Ø endstream endobj 124 0 obj <>stream + + "5TÔNNÝX-h‡–´V̤ŸpjL£1‡µñÜ Ø¤çŸ_Ój¡³™ˆ’'LºR#Ø1ÍVt"ò\Ù")À¦X"]™û†>SصÀ¼ æ({EÔÜ¿m]zVIqGè#Eš:FB„?C ¡8p2þYÚû “ŒŽñ€ƒ£`J‚dìb®0b-Mþ]ä*ƒ{>â„äÞ·›ÿñH€X‹ÙI‰jŽ )GD²”ûË‹9t«í€Ò/ÐZ£ .€¸Çš }Е´ºvíü¥œÅ*cU;£=dZ|ÀµÃê”'+r¿îd'œ…ÂC­'ÒVéUöBúLn™¨Ò +êð/©&J[ÝsŽÁ£bl]ˆÉ"M±Ê˜@Tït* SüV òè蘡­z¡TKax>øfa5°?ü8‚ëS@ÎSïÃvIaB·š®½ª–ÜJ(RÚb±jóсÃט@@Üm”:Ç;–7Ehìxÿåe¡òwMå©Rd·ÒêþtBˆ—;õwÊy¹CŽheŠÐò¾HV-ï”jLJ›[†©—É¿À ¡”Æ5óÆDz« +hY0sDq^ÔsŸd#D·^IÃ3"„]m<¯t¬{¾YUßzÖì€,¿Oø 7£¢hÇ8ƒOBÌöµs ÔôÚ[ä9ç‹=Ujª¥ZÙÞ6:_Ã|7šèáÈ協*Â#¯ÃâüˆT¸4cVNø#Ô°@˒@âœcOĕX Dç´V~t‰wX$ªëï;'ÁFD84¿:Ë¢$ºrî™ò»Ï€ƒßøkÅú¦›b!Axêí°¨dËѶ¼S̶P?©pOvJÙ{F ºÀAper!àkÜà +f[À<ßÝÑÏPºË Jñî+¥´,Èk=3hyl zW8ÙӅ ZJ]$;îDÌ$±^Ž°„PG8ÕrÉL¶½­0 <|°*Wo½cÈ9Fòq Dü°ð—Q@?"úlœ‚Z7– Òl%T…ʽŽ áÛ ¤œÌ^`à ºù_?#Ò.ԍ%Ý¢Þ"qA=J½‡Pø|<¤¸ºŸJãÛô˜¾}iŠšÿ]ÚôËߒ‘øèRêT«] \‡šÚ +¯À |LZeL¾Žæá8ˆŠƒØ¸\§<0=ÙÇîå*ƒh`•Uöè4¹.éKé[F +ei¤^«DDƒS'q4Du»‘Š"+|ù]@½ÉG,}Þ¦‰à2Cú…jmfóý©þsÃ_ì9$Š2­Õ›€€‰Á¸ê3†Œç„ ž&´#²GŸ¨ÓÆòþ®6R‚ê†Ø=é+£0?YjYÍP<šãÊ¿êQi¼,ªjl ÀÑщh­ˆˆ”N’wÙÌσØ0+#uBVÆY(C#effŽøîÎΙ1ã¤êÁ]pyeH¢T‰6RH¼bÿ„¾IUšÝÀ`E7#…ˆ‚9¤Sñȇ“•Ê‘ÂÁ²IE‚ Fn⠛œ™É)¶/àqH‡ +ä‡ +DF ˆØ8ò³Ñ¾}›§ôä3 R0¢"$WV¹¦ÊÁªÊ*X͉•´e.—E‰º™ÍfufDŒ¬Š|ó™Ïl³ )s¾«³ºàè®Î¶Ïòm‚¶ï„°¶odÁC"ǶɷI¡$'®ED,A"†kfvVÄC¬`El¸ÚÍLì ÖZÚÒ2³–Ùl&Ì gFk«wí4Ûëõz­U„jÛZ¯×+¶°Ù–´AÛkµe\QQÑlV„¬hÇ¢Ml bk­µ¡jm¯-›m6ÛƒhÛl)X¯Ùl6›Íf6Ç’å‚d~Š¦jÂ'¸ 0ˆ÷øv “lòå’ 9ô =#<óÏçŸû¦Ïÿÿ`¿ÿÿψI5‚]èUUEU¤JÍȺª)¬ª,Rãª*ÜUFvé,2Lq³ÀÊg=;a&̄ÝýîÆáX§pðLˆXnÐÅ Õtº¤@”À$(ÿÛñûþ}ɱHƧn‡ø­K +‰8­Û$­›nó}ñÖÚ2o۞[ +W&åõÌÌÌLÕÐÌdžΌ˜!l‡Ûž`UTµ³àÙ¶…ö‰É0ɾؓ’Ç—øû‘çó¿ÿ'â'ӄ*ED¨Ñ!@šÌ›–U¥1ηU„Yñ˜‘G…4k$W+Å7lˆ«;»»£º³»;¼¦z¹ªŠ^uW=_¢Ä§eruÌÌf³¼Í™°baˆ”›9<8ð눍åÀ›âU]Ua7ýݾ%ìu‚’Œ@§å28yÊȳWï1[#—€òØ"/ñHÂ9{Áx%'Ð +•Å@ÛÇZ ‹›„ÆïmY­Ø ƒ5$‰-jM—û<ºžÙZn¨èË<©«A{ËY±ÙÂEÅUê²êɧŸŸÜsªQöw±¯¹4wZ‰œ•qâ4þ˜ºÛÇeÎ÷«’2AîXΉÕ"$â¯tÄ6 ûˆ?£@¿ÄPRLø‰¿·pr Rü‰z†±à³_w`»ŠaÈ­;far9ÅEÒV +²2>¤|Ÿ#Œûõ½Õ;«à +[ávÏðkiç„\JË´±»Ø(B —ÔgÓß½S²·;›åFaòo5Y±42¹‡4ÊüÛRd7Æ]Žƒ­>cÇASÁMM OÉ¡—%Ó#àۗÏÃVrKz€ùzˆö•¸qý։†ô T<©øIĉUÍ儾Ž~-%îkw¬ H½Á!/Iø˜f ‚秒b-/°¶2QjÃñ·{ÞÝÕW9C[iÌí»²A\K—Ñ„!šè†YLӑŽù5•ÛiÃé Åܴ癖F)YÐð]*ÔïT¢0U :Tÿ/á( ¢·×0Ð6¼Rè(ã³Öäë/dŒü¤7,59ø1åäbàý± äV¡®.zx&˜8(**áL2wº¡Éٗ‘J"ïX¬xÔ3Áç&+Üޟ’;mÏ,²™à$‹î½¦mŽUõ Òp¶ýê´Á+ ÚðÖ~3!?ÿ1 +ӱܞ‚ÓÓ¸þ˜ ¸æøŒ>+ðÉﳬFiNz‹ „¸eŸoA¼czHMÏŽÔCä&€4oÂSlÚÜ,KY™0vÁ@?!”àþk(b¢~æ'ÙWÝ¢Pƒj‰ ÜRñ\~âÚ‘JJa—;^L-ÞcìÜ` ¶Q[K7G҆ôçiöœêW›¬W3Ïd×!ôÓqE–2”ÌЌ™Bëcœ ñH»»ü÷І2Áù§Rï¿®F‚'„²X¾$Ièæd‚ oNñáùæc’+ü*ýãÚN7sÂ{ˆ¢RL€êBôð'½–d‚ +‹’ÝÚŸ1Ã&Àš:–ùÇËDÝùVŸÓñ &ü]xxâQUX6ìŒy8ÜÅ^_ ìRö41ÈàœYrSH7U€Cÿ›dmDP"ÄÐ1Z¤‡ßS‹x‹K~³8.Æ­ÐyØYàhL½½^ÇÙûî àÇaœ,-X7+#ùUüE8Pî Îô‘8Œ¸CTH”€[ï#3‘G¹ô ÆòÌÂv*_8ø¼w2xâ]!z÷v!ãÔ2$Â^}›!\£…ödiP…°’“T4\ÅýjiÆß´pÅã80öœk¥£eôm©7‹£Øí1Óºž(';Iø@ܺ¯"eƨ„¡Ó\Ž8¬Mô¥ëë¹±ŒØCAÎ!„ýÒ¢×å â&¤[ž›)Ù]ÀúÁj¤‹€®¶” ú uZK;Æø‘¥ßÈ[eBS뚻‘'d3fhÓn­ÆQ5™Fqq\˜$³Iõ¯µ45Õ¾ Ù•xOG¸ˆ¡&aVßxøÈ.-B’x²Ÿù´{²ÐnÁ”œ?¸»Ö¶f¨/FQ2©†eH)‰“·‚ƒÆÂxq’¥£6hšw+´X“ðï?¥Îa¸rræ¥5—aÒæ{L›$ ß‡TxÉÏÝiF?I_@5›í«•¨¡»¢€AçÌðÊÜéÕ<”†Z+›1Ä}½¿~²P/Ð8ÉÇ | !¹!–A€<Òüb+˜<þH¬%fîÉõwXå3)˜›ú4É\¨š5­•H֍þUøeVP©µÃ½· ú‚®z%W!Ê!Zåž'»Ýnf¢¾að¢˜NiÎñצa¤7÷.i‚\ˆé‚ÑΧ6%£»µt‚@ bËl€·1 €vU•g¡.ÂK(â#³wùð,§³@ÛìÃ1o« $™«g¢_‹ÚE¹?õúâ¯=.ŒAwàõÏUŽ‰[i¬Hø+8ÀÜΙ(äðËÆ­8ћ†mˆ•¹7×0—AïQ¶¤3µoýRoX&œôÞp‘ÒM—š±£0wU‰gú÷d¡f³/xHf±ŠÙoÊ/žŠA8ªºÐ’mìY,šwõþžÕ_èJH+’C#qo€¬7²|JÒ«„.,r2ÀñçU¼xŸùʁÂ*+†rq²Q£»+sL•lÛ`RÔpáj”×ܼÿ·|ÊTǶDU¤Y’¸#Ð÷&Pbhÿéèb˜H7ƦZ·ÄªŽ\Nø¥)þ4ü^¤Ô÷\Y8´pÚ3ª± S¿`Èq'Xþ¡×úv îLFÉC­£g´*t—RóõùBßGP鹙×=Òñ«ó#E8®U& _æ–&åŠ;•£ñyӊŠ³¢ xM€ܙMðvÔ^lM€fW¸‹æ,aaFkT«ZŽã”V6±èæF`&»?)×ã°>QQÙ࿨Èí%–ãPÉï/TDSXªð¦Ud{¢{ҋs] ´¢H,»éa‡”’Ԑ#Ø: ¥^Œ?S8˹; YÉÑW +ä•\©–I’샿†¾šôróŽ0PhƹñTwÝHÀÀK†OåaMC<ߦbSO\x›5E먞Pƒ·,bªŠ‹”Y/ÞiM6YxÁó2´h ãû$Ió÷©ª±Ä;ãî¤ÒÀ8î0 ž*‡é¼s/‹¤›²Þ™ìÏ@Y€èPÓ(}ðƒÛ‡Z관šë ¿–‘±d£id‹BˆµAe™2¥S/ý¦Œ7± ¤°¾'µë/*P+¿Yˆ*P‡ès]ê÷‹õ0%TT!ß6ՑKìFõ…eRò¿Ùs>l(¤Ëña÷åK¡ƒs=(~5ÑhIúæ”æ¡ÕZC÷SŒh>A!‰ºº¿Ð²¬2{?ԉ£vÆ´Lo²ÌòƒÉjU£Šº +ãéLõð4IúÁə×vL:g?ÿØøпô/õ.œ fÎbp89 +këgÖ¹whQ(ð:NæYñÞõC#€J±š´á vŠC¦³Y˜¡ˆ ß#ŠO¾wšº¬¶ȖÜdšÜ“KN)ooŠvê| j,Qxt:§#¨ööbz’Á‚í§o¹'>Þìxø80Ôä¾j²i‰v—BÒnê˺)Q( +IÑ "c%Í6" [º4N²•’ào³%¿\fχ(Jà}"|AèÛ¯¬hÑHESÝü€@åÞQXëë<óoÏ<­É›¨ˆÆ½+Pñ‰å¤ÿŽt^PÈ©¢+eô^y=µ8M@½9®êRŠÛi¼¹ý É £‹Š‚cÛœÛÔ7{?@Yenõß0nòË® 8$ûv>}k Œ™·%ÇöƦø.¢r‚¶¿[=<³èÞÀXí¯³ºéZb#²7µW-$?~ ¥zW³UP¤¨ÆídOÁ™ñE_XKíÂ7ofÍÔ  8fåÎAçoé‘TŽŸ]Þzn>æ,̓ˈ +³±^M/ulÜ]y¤2O°þÿ×2S"b™8ûGð)cÅ|1¸Qt„‡ò‰QqdÎÈ­¾ê¼Då쥉µ>,œÂ‘6K½šHðq'¸R– ·&m:p«nøY‰¦°?ċD{©>̲”7-<É¥j†¦Ò”Z‹-±€*|‘úèÖ»È i~Úÿ»’– ¶D6$Û6•e&ã÷ëÒLV$AQ•ü£ô1¼ ÿ?Ì-¼@ÊÓª lƒxQ…Uq&-¢æ¬0£¶@dz¨QPñ¾»oÔ˜üYᗦªù­š;¬ÎêXP%G'¦K3 ¤Ö¤ÊxbøºÕ÷*L'헛Þv|¤ë†!RâŠè$<,k5Z(8IE>”~ ©Õ¤ÍQ:ξv–¶èEµÓ›ìiiÒ+s3Ÿ7¿ü‡rÅUø…KÏZOk!­LÙS®šq]Z„ž8ÜðC<6ÿÅHzñûªÁ­Y_ta¸Æ®tâÙßvïºÞ@þÊß¿é³ýëؑW @ÿ–¸u׿ þ ›KP‡/ðÄn’q#c™Ê\þ?d‘P¡6ŽûÁ;Ø]þWÂT¼´-·a$˜b;4e‡†ì¦O”™¡Ä=#0ˆ$œ!AeçÞêP‹‰|TòR¬Ñ±ÿšM¢oAã‡Hq· \`¬’æ6vÔª[Er‰ÜADZ­t\óÖÒçÀŒàÛL +ÀŸUüDÛe1Eâ@^’œÈ0ŽR iâÅ7˜ '²xj=´0ŠÙTMƒ£Ò8è»Mf¾äÁ+Ô³5è@Ä7°)FY x6ŒœÝ{üïP ¾&kŸ9þ6õ{¬Â²/쉝7¾ D½Cë+¶HïhJÎi˜ëŒ¸Ô*ƒúù6h”x±:¯©|~ +Çᤊ/g¨Ò]PPIµŸYý罬¾fXWXoüU»=2YO^)œªX@Ò_ãš,ø½p±†‡@yÍÉZ¥˜µ£@fù$ðó~`ŽlØ Oo¨˜^²Z²¿bΐ"mқÝl†BÃ(]2ÔO’i@—Â‚Ý ™¾+æÖ ÿ¤’#‡/`g™Õ^}ċî”b/Ãã9kKØ»|‹Õæ„ûÕð´î%ñ.»V…S +pÿ°×ìXqñϜk€ÊH‡u +2…$žÈšÓá-¾ëȸÌZ5Ujµ(Ҟ„‰þ(„¥Óf"%‹IÜáEZ/øTàuAÌ@{W»DV"'~¡B΄å)HÜE"‚ßNüßêQ6Gâ©!LÝ/*ãY¡¬â õ³8B ‹IáOšò’ ܹæODÃnÐ_#ò’N(ˆr+p6˜ŽyñÁI‚OU±­g” ɾ…@û¥{bÛ+a1Ì`XñrM˜$ÊQ4Ýïoa3Ņ[Ø5ÌûäŸù9°@ᏐÂ҈ ߦÑH¿‚Ê’‰ú±Ñè³™zŒ¡à’ÊVŠœ½Lz«õ=ݸx7(ƒN¯¦g¥‘¥ƒÑ +£ÊØs§6°¤Þgö0'ñÕì[ÍnCLàXh g?ûþ P¤©õIJŽBz<Å£Ç3zYÂ÷—1‹h -Ê9¶K˜Ÿ-ÝbÄ- ±¯"ꓒ5 /DF + EÇ(GuÍ(D?Š€—Îa!ý.BmŒ4Ә4z"Q'PȂ³œØ圚LéE‹äŠ(:“ùI¦ø)7V‚AE¦‘qà:ù*Ð-´Ñ0Ì:è –ú`žÛÚ¤‡F¬D@Þ² +ˆL¿Ê×9\˜®î­^š%6ýƒBðaà=êÉoK‹FDùyé`0rz€FúYžÐ‰¢òœš‡JDÑËö³t»ÚTvµ¥¥×A”ØÉ ¸x¸†­ÿŸkh©ï  ÜÏ H¢†{½!ä{‡§î†Qö ×+Um 6ƒ‘?ñ÷7™ÙU÷Jv—2¦!”ç@¬Dh}¾E¹ƒ +{û>ôQU±š·ÚÕ÷ßašÿþ´žblùü}ŸœÂCáÿ1íHñÄ®h|çüé"õƒy +ͼrM¡Ìk`œ,…TßәËë`U(¡CßñIpЫ)צ Ã÷”Yö!Z…ð»Cëîû.ӓk4H Y ʛ¤÷wYØSÁ¬Ðò·%Ýñ™s£Sàò¹ÔpƒkK«Æ~_¢ ¼€/üœLC:3s®ž-F+3†<ú*" +R fŋ¤Ô?Éuù^/#Ô4ÌXÒ&ls»¬F# ó󆯞 0;ä‡%aN\üæå a¶kOëÕ¯HïåUO€I£`®âq̚ØæÙh`¾‹ú“¥¿WFÀl·qúÌAµ’ ŒàQB&BÞð—Iˆ˜W¿vºOTêeOð€ —Ï©åÂUZór²~ÜñÌú¸á_V‡*¶‘] bS°È6î2°Ë5µËM†„!úÖ ÐÖe|Ïæ¨ËƒÒZ”.æQ_ZÖ;µª˵؏-$Nd-[<Yñ¼Zˇq9`ЈËÆâl —]±&p¹bLÚ·¼ôô­›öÀ[Þ ºeÞM?IîùqPåJ2f[eY%[¾‰ l™ œ„íÏ{©.‚q`-ƒ¨Ì•¯YÒÎHŠø*Ä +a> e ˜‰U-SEËaU¸lûÄ6Àà¢c,7ì™9žÑ>!t ÜWýÂ"û¤Ql±yY–íŸÛÐèCR"À&º´iyt}r’Tl}bQ3 2$Ærv·#‹)b ŠÁFQNaÑCtJ°|,XÔ%ΨB¼Þï)ã ôÊròÿ*<_Ï]9wüeâv‰²J0aÐ&¨p›š „ø©¬iŽ´A©†3À3Z>õOb‚x#ÆQ9_ å”2Íät„»b|J Ó0­,=WYoy k•kLMÁ*ƒžßQõ©½u†ù‚$ºŠ¤f_£wîÓC•S¨ÃˆSم–ç!öø3•Ê®„HVŠOÚ}Ÿ…ê £ròÝÃACT®Ñ‡Z ÐBe% @å!Wàæ‘yêá)Å±N¹Hüۏ©ZçŽÁಸæhô‹Ùð—)§ª}yS½¡Å€® @϶ý zPö¨]bêÑqe÷$$TRP#g LŠ…`q2Âì<Êÿ±†ªh®Å¯F8åý9wC‚ûQò¸¥ˆoý‡AO&œa²B”™6R’~‡r€·à}1”Ó,–úÉs®þÌR&eøiP&C.ÃZ (K ®!(P(ךtòNzÛ/¦Äªa]}öd÷u+ߔ°ɞüS/–PüfÆXÕñâJCùq<&ጆ+(ŠÄNZI¼b3­ÚŸGH÷yqïbsò@l +*¹`râäIÑ%:8Ù%šc'F¨w¼õ~‚“]Ë(Ge90ð'óz,‰dW—ƒšI¾üÿb|Nj²™Mœõì­d"@èžb M6ùÎdqhDtj{ppéùғ’þwó¾D&ô^}´]  8ëÙc‘ éŒÑs4Õ$Y6zÒôèß_âè$?ûòÐú ñ"’Z^A¸ç•!®hI/y…U‰ÏXía5\ð;JúC¹’2pò<¬äôWdÐ]—oŦ°ÌÀ ƒ-¾Û6%+N»™ß_!ÎŽ,2¡§¬1¶wŠ°‡·dä½í]†WÙ<âÿßÔJߕW½ +ö:ˆ¹#¦aCþ1OÛõ?´ê…ÊUµrÞa˜÷Þå]t¦y_¥Û²Ždõ ¿÷œfCvd‘¹98æ¡…±¡ɒ +DwƐœö¾>‹OäžØ7q´?$w í˳L[ÒòýÈì{͋Ö*sDÐâ‘mâ»?ìÈ»?å^ǧ—$R U`†ÿ!.'’1E߁ȍŒJHŒ åxBTý\8é7ž¬3a>á뻤Ɛ1ÌÈ),Í0žøopãrazBBs.Ÿ˜ÊBò"K©ùˆ"æ9ÅCÖìhdd,­ÈÎ`[ŒTd¡Î¤ÈâÿچAäPdü/²Ä6sÃ&Š!íùãÔZꑓ í£Dö1æ¦Ô·ë#¢ÉbOÏ`"òiQF¥åœ^Â;ª& ÄB?JÚÅUQ£È%9nÖtÈÞJS ‡C-e^ÌžL¬!K¤‡$)ÑP×IR:‰?žÏH>‰JU×¾?h´­ÕU?š;‘kWAüe….ž_ü¢ò¬Öé¢(@8ÎßÑi§LeQ’W æ–å½Vyƒ‡#’Üðf8XÌ>Ùë!FfXn rcIÆ #2Òc¢A1 Xaϖs Â\¨sÅD†+,ûˆÜÄ$±·l›¤,¤stN¿ÔajŽ@Töÿ‡+~ÚÓ-’t'5S—‡£–€¬—äßi Ü7@EšeÝÖç +ÅÌ?¶ü#òö’¼§Oñ‘þØðñԟ€µê"øú4Ñàbò ´ÑMðÖctùj|.ÔiÆ3McÀ`ÏæX=‘WtS„mècêu°Ê¸âz8“&uØ@©‚Ò øØ9ZÛe­99T´ªlÃ1uÔN#y!žyY{}øƒ=~½yT³}!=´“…‘@a>ÍßN’‡3ô­›ÃyŒô¬cpô˜Çl`Ó7$ ˜u'0½º1 4cÕÿ;ûItgÑEvÒì%ÂKxL%A¤ªšx˜TY’û#²µ«MI¾Ê°Gîˆëá@L¨mÇ^“¤ûà|V¢L\T„·„¸³¢}[Lƶ©3F“<—âmY;ÜF8j{ªÆð0W’ÒK•CN¨èÈö§ Œ§Ø@EÙ->+IÄ?Ÿ;~ÄⓆŸ‚GßWÁP=…(9E Ló9f“i€¿HÐçÇ{f`Àz EQÚ¨l4>;ŠHµu~‰³2¾Uèƒ]Ù;…ï{ËBŸ©÷&X]Hr!߯æ r= 8tDJ§Ð’‰¢ 0O8ÓáZŒ?G¼9úax÷>oWP‹üa3!aÈÙÛz2Ú)$E!¦f»ˆˆÔ>ýô;x"§W.Ït`áœÂ¯‰VO<è‘ O‰¼“šœÎ–Y€º’=QK<…a˜µd>º#€h"×Í#, æ£>š™ÒêKóPÝp˜b­†Jû½gôgÀ»Š Èæ'&RŒÚ֐š2Ca0¥ä¤9 º^Ê/ۓÊ3ïç{(5È×2b~<;`´)=¤Î98`Î +ƒ‚¶¹Cæ =ÍS”p®ÔGÛ v'd% ¿ n @µ5  ®÷ä3ú†Žþ +(}Ël~ÐÕX߀˜*Tð±-0³þá~ò„Ðwœ0ÍU$E[3ìªKŒ‹I­båùÖÜ®$•hMÔÆÈ(­…5‡!ÌU&¿°Æš<ÞH†]G‡¿ÀaûL¥'ƒÝ£óg¿G¶$t0¾Š±'FÀÌoGY»R7ûcCÿfCŽù ä/¨o‰Æ\ˆgÆ1ä‹cç‚ü¨“HÙóN NwZÙ¡}zè uW¯! àç¨\+óK&z:'«k‚Ü{ðB“ÅEs§WÖùFtä‚Øž³â–üÌÆo¤¡¸§(b3ّôÀ±~Š{ µÕ„Q`!lVú¬a‡²èª>ÈLð÷¨úàä`.Ííºúìœe¡Žä ¿&Œ²}‘ !ÏóŸo×;§pCŒ¨I', äíeSÛPÜuÃċ²äMÏÇc@œ0r'š?¦À`³·¥ ´ÁßÛÒ,‡ú|ýªç ļƦG‘îÅB3ÿò¢ 6¿n,‘ðÇ«<8äGvއ#¸f§Ü‹§03Ęk‡Ÿç­ms’H·õéà£ùäº{Á–ŸF®ˆÇ"½ f”I˜–XüÔÇàª×½Ñ0á½à{ ™T$þ×_1‡NúI:ðý…$ Œ!ø态ø®áóñ=/¹BB#,JÃî•ßºdK%'%^ž\’ÕLÅ/²ûQ¢aÉŒoƒ Â¾ËuÓø~䒉פ/Ɨ+GNã‰Å>@°éc_\×_Š!ÿAÎGÜ«l9ß‚ÄåùËBË!ñ=¹°AXÂ×»áRþÑqÂ7@‰6ñqïÁr­t‰/fŠŒø²èñlTæ 1O(‘RK>ë?X¼*éÊ+ƒ‹‹…,Áë”ÀÛk҈Œa±E崗:¥Hæ»Òè2¦æ3À5|XmbuXæÒñ6L·ñr®J d-t1â<†}¹¬áv>\ZÔºáø¤•ëÈJ°Œ}£óRwýH1ô¶¶.™€ÖŠΚɹ|‹÷õÀ°˜ Á|Òaç_g£ìá~z5B§óWCìÎûgƒà¹Í"§K@í.Ù,¦c|RÁ§âg +­ÇΡ°ÉÁC­ÙG|©½U \°J‘ Põ ÔB#”®Àø/Ò>øÅ6(€Ï)¬ê.®à˜ €šîl9ªW…9Y•áÄ]áÍR–:kv֏I’=TÀFc9ì¶YT º:$ ÙÏ… ç´Ž‚¾3ˎJ„‚¹àÚèõ¹z¡ €VÚόá^‡‚(DÜ®ö·9Ëc¬H˜Ö_/ùÖMþãËâýë›V¥ðOÿ·>B|ò“ñ›5o]«îì·rhú²>Ìa‘\Imcÿø2m•8¼ÁAˆb> †XýçýóRRËbá«õÝ4[«š›#^H/PØ2›2Z²ŽÓ +ñœmR+” ½ ÝL6wuµ.AÛ6A®ÝÛ¦ðâ"ßȈ!÷J‘9 ot+ý_¦w{=X±Ðá¶f¿.´[‡íšâԗßQ°Ù|ƒ3ü,½[maûþjåÓ{4?ɯo³U Éz{,ËÀ¡<ÌFKÏíF=ŽÑ_‚Üî¦SYÌAŸ¤m$q cú>bTw.še SˆjÕQÆ»LR®ûwíBÆdxÊWÑ"–LÅnQ. ¬7ºJ-¸½®©·Ïk#[cNa±/¹õõz‚òŒ'Ü×>ó›Í:†Áú¤ìH8A¹NÚ,ç¾¢˜»òZ†j'§z¶å¹x“þ澫®Db”Ç8Ú/£"Æ:ßê=öx]‹@|,®u(꼀úÞÇØ š¤ï›. e¾ÏšE€ÿâýä6ñÁ¸7­>/ -¼µÁçsðøÉ;:aÛçûQN~|q„øé;€³{b9"Ôø™Woiôœ¼oLÏ©ÅO>½•¯O>jþ ø¤2gVŽx &ò“È‚¦ø™‡f¡ƒÚ˜W}Ùn7¿¤˜…ÓQ–,>,ÁfÄ÷6XÈO†>͌ùùäÎ&¥gEä—WK aÖ ¿Ÿ’ïÎØxe|âW|!lÁ–G#Øéyì-übè_& +qè\¼I‡_®È(yèœö]ØJÛZº\ ¿¡—Y(ÕY1¶Bè)§«ôïsܐ"*ÎE3%È?º˜xŸâ>x²½pÃÐ>zÝùJÈ×>Q8Ó¾5Æ{X Q†I ¥$öQ8t26Ôuw=öï÷²?®½˜}ÅãoÖ.N×¾€Ðc”I^y(+µOŸÝZÑÖ+Ž|š;.°Å2æÀŽMÖfÏQ©¯¸µB62{SÇ͒ñ‡Jy)nuVw†¾¬H‚{®t#(@ïÖYQDUó6ªLùÀº û]z§òz4ù3DÿM§*–Ûž²ûGWa3`sÊ/=6V™ E`ùÅÒ$ù×ë(f•IÌ®]%®r_˜׆ësO-¶*@…Òm Fª²Ž¸•øÔh·<«2Ž’µ‹¬àS‘@bw}ÐB¿˜#oá׎(\;ÏÀú¢ýt6T‘ö×{l=ǦJ¤QS¼üa€–ò„}›˜Y‚äRæ5/¥æCí¦hþÆÛµPÇw‡õ ‚†QtmoÑ ‚~³òˆ>Æí(†„D`Ìq6ƒ»Sý7ºVpºR<ŽXï#«ÙößfÐo/½îÝ»àl)Ô·I>qýZ‡ ñµ]Ïýבò’±‘ÐLÕø¬‚—ïN Iq`aR’]<Å}Ö Û»Óºü,êWwf€ œ/FË·ý.O¹0˜¾pò"ÜW—ÆŠ ï L¹µñHó&~Š!5B¾²ÌóR 6/ñ¯ä­¨TÃE:…k$‚Yì­Aö÷·åu$ÅE4Î`*K”]±S‘á*ro¸:`isìúÚÔm„Â…Aò`?š”iäD=¯È ;ðPVS…9úÌ.=äYh;Ò‡¨²HmêÁSÎc˜™–apä7øµ´NÕEßÞñ’uǃ»T¸)¿œÞ¢âÔV» ¬ qÂ'Xº‰q…ÿS,ˆåHœÍc‘¤@ƒ>l'ßòµXèãÂô}ùø46­µ¸+-‰MøXT~¥ Û#ÄNÁ[;я7²ËŠ$œÀ„Ê —x€f‚C;{5Ѫ¿¦‘9á'—£CŠîÙoÅ鬷Œ')ԟðÃÚ#—­?}ˆ +›>ÃÉ©ŒF{U¬ò€<:Ë݅¦N¬á©þ;›pxл¥"øo÷À_úZÍwmÇð~| 9˜ZüsS‘ô}øÃÌ)1+µ‚ÌÙÜñzŽWìÙ}ë³ âÃñ#E(×ñõ$g˜º[*Ƒ¤kv¯ÔEwDå꘩Êv= Xˆ¨Fdû>àO¸ý¹3kHoZoR(–á±`j¬úT7ïüCGJ&x›ø4ªT¥¦)CãšÉÓ­s0ÖùÒÔì_«¢xÄvò؂1™ÜbG¡Ž¶´K³êH™Rƒ”÷d/ÄZ9Rùã…ðñ+"µÌÛ¶ãC»9˜æ11ï` +»“«;)r^Q®ÕçÀÓǔ2Ÿ]ôä&!»øҏŒ,¸œDÐ_o%”HžY‘Îø—Œü†µ ³ØÖ¤A!h"9G+ …À1Æ¡€5,'à×{Ùj)€©&¿ØïÇÚ_Nª¸ÊIP÷úEèŠrÖ ğ>Ïó˕ëÞx6KàÄ?o…Òá®ä½Ç`ùx—à­…ÚäøL»¿ê‹‰ŠHèÐ^ÃÒcª†Oœ1&O/WÁT”©ÓNFxÒßødÿäîŠÉ~‰(©Šìq9¼p„½+â-ÖwOå-ܙòsãt@©ŽŠS2¬Ï€åö=ƒ„ßÙȸ30v @l Gߣ ¿@ÆӜb×o[2êjv댵1Ú.œ˜Tˆ0FFB˜~k¸¡—QŒE ÿ:S¢s Z{.gê%Ì{÷æ³Ó®í_è~ÇO·QŸ·ß죍õ«J@Ø`E+½´øk)9‹Àº®‹æáÖØ%ýýA˜\/¤* !$ëܑúˆæW‰]‹D§"qÉË`è²2‚£­sàJïmöz´JDÞ/K³è’u ÄÙæý²E,ñrш9‚¬Ë·S§*âÏÙU²8fÂfBAëO†ªØ «Í§t­Áý¾TO2õ"÷õ‡p)B%tY#×U”Ú {S>¤vF&µÉ‚´šŠ&\£‘UÁCØ d¸“¢}‰*×ëúïóÑ@B¢uGø'ë¡P3hu+6´‹‚à§/'óÞì©°K}^<ðíRªá$¢5/5k¥ªêi®}R‰ªÓ·¤Ž„n؁5v~íÁá&P}`©¶Wº üSêHÓԁšò¡ãÃ2[¾ûyÕÝwkÂÏèdSs˜Ø’[³¼ •võ¦`ÕžÃj~[eòEó¾$b^=®Ô›4¨g"@=–ÐTA¼V2ñ£l~úÍ©H´ ra[Nʇ~%jªðp¶ú5 "S²ò€ÐRžÒ' ¹Q>ÊO¿ø!Ѻ+ +@aŸ…ÚÓ_‡ñÒöœ–8ÞeÙêxD¸Þ¦ÉWÁiÄûÖG´f¦÷þEÄs#­{ègtYüµú¶pPÒä8¨uykÄ)! Ž{¯p(‡ßÏ:åü¹˜rý¼ÄOtMîôgÙ›q.`¥aDq‰:-z³£’•á + á~’“Xžµ˜ngÿ‡u;ë‰Q½¿‚»þۙÌ;‚sÛ<§<~V‰HZê¬q‚¸€³0c¡aɏ.ÄEŠò&%°^R†÷lQTÕ*4¤´:ëjYgð<Mœ¼Yz€w`ƒ–$͸lÄÆ=òšgn¶K,)–UKà«gÑA¿º*Ä1jRğrCçYá0ÙOH¤(Ó~tÖu·Ý»_J-Ó‡Ó‹-ä^½½!QcšÜ©õ™ÖCZìò·¤ÝTN/Éõþ*D·Zy÷Ú­MJÌ ЭÎZ9¶0®–#hãHäs°%5@Æ:»ØÝ+d¹ËŸôa³^& +î ¶ ÀôUx¿‡ýdýö§1BG î×Ö7‰«^¤àµ·ƒöD(ÕYç fvH=Õ1ú« q¥'ñÜʬ:b=ÅÝK¦JšÎ¦+ð¥øf@ÀW§ùä%¡Ç¥FÝÇ'˜—N(œeIÊ +…Os~)µ=…|¤kt™9NÓàAu„é£ÎÚ3?ÓwX˪ʗˆmÚà”Ô•*¿!I‹ 7Á¼%í´f˜h¬ÙKZg)†xùÿO\Þ(=XžÔÿ_×ɜ:¨?yBeÀÁ5=4Ü€·ÓÄ.ïs.ƒwThom ˜s§vÍÂ@/Ò|§ÙÐé²KÕ/Ø8ƨ‡xµ0NBll°+L†òs/FtFDÓêæ hæd×_m¯HJüÆe*Ùc?÷j(2iKBi-W§D¾Ø˜„Ý¿Ž:Ü ÝNonÙÓsÆÚÓÖü¸§Ö 1´¶OHZE»~†D,/‚µI “èUcæÝgñÝSÈIOaêÚÖX¶`oŠT-OOÁôÆúŒÎÏoEŽÃ }µàV¡ÖW™ü²¡2r@°Qv–­ÒF+D³å¦ÂðuÅ ­·zv’n»vìr·¶¼TÏãg1ö½ý ·“Ʊ|-0&ËÄ©«5çJA\¬”€v•”¹§Ìô֏©Å½Ü0#wJ2„Õ€áª˜ï² + ½7á@ Q%%m¯jQ0ÐßN8;\¡LÄÙh…úŽFåªÎ²Å8LiðÀ´<փ½ÿ²ˆÖ\?©Î¯Èp‚H•Ÿºåï×ÕÍ6½˜Y^ÁžôŸ9¾. –V$4ÿüÙpŒ‹šE讉Vž‰ßƒ–Q† +†‹Uóæ?iÂÄÑ©Øq_¤ë"©[7ÐI¢×¢'vEҙ°~«‰Ð,Î3gBQ÷†uLʄ +Æ*Áûk@|3s´°lÎên¯ü–禡í@‰“$–NÜ&\–`‰½’\!{HdÿlV‘ÐغÍMXä¬BZ¥NŸ>ÃÊ\Ç~bÌÁaRódä3À!Ù˅Ñ+"V‡‡¬WŔ|ñ#2‰¸OJâPƒFÚ.݀‡Á"ÒTØ6ÈÚ:PtH½‰!ô&tîP7tqQ‹Øh¸D)'¼™³uÖІ˜øاJ¸-dnû÷ßà óئ',IŠ×@ Þ¨é q¢Bl&kb']‚öçáh úW%£¾å µ‹ +[à •Ò$í³Å~l|¼7|nž­‘Ÿšúöœúíkó=cë¤À¦Ùr,Ò'84£!-œ¥´ ™ú&èþÛå2mâ3}{ÃÃm™5Ku™Ì(ö3ZU=&Ýòj›Öp1ÄÈÎJ7° +ølS"³Ðie/BñÛ}±lÿÃÖ½/šËkió“C£rŒu¦.Äm†Y¡¼»o¿pՃ2µ¬[<-’ôÑD©¿EKɞÈÌ÷ÖBäÞ6ǘCÔÆHi¾´âWïn׌Yá_Ýÿ¨õ"˜j&gyê3xà"½(òjÓÃiÅ%àÐqòçiIƒ)DԊMgÄ>‚÷Á,¹†Ó;Ó¹¯@U@§!oé1qQt¢À]m9øp­ÅAãÉF®„ìBÁ搖ÀNèˆTÔ½³QL–Víûœªþ;ßPÿUùýõq»ð°¨XÁQ$™W + nñ>š°ùl”2Â3æ 18øûQ߹ܷž ̘£˜1k’­ÓïE[="P´Êû—» H†ð:MI—¯ +ë‡Lv’`×N[ŽA‰ç𦱪Aá™Æ‡Œû¾$Ùò¦3xš`8˜ÂÓÐëƒÀ²Y ’Ùxšœ“@ò4·€~x¤Ç<í9I +0ÏÓ:Ó#EO«P[çàK ^¢xKjmô\O3W™Íž¦ƒÅÔç44ÔÒUB‚ØLD.Hwšhzݨhù4F\1½._ÔP< OKª·>­ø²rÚ>-´ÆÌ3´àÐÖ12Âøt#Liý´a†Ìý4ÉCVcI~*ŸÀùàüWÿ4¹5 –ÿ4qu?ÂI¢Dr¸¶ÇF–Ú}øx2 &ÄD + Ú²è7Ìkn„{¶ÜÜjoŒ"¨•„êI‚Ú{d­ ÆŠØ×÷ýæ(àÔ怦Ì<ô.‹&R ?_¿#箆Pû›/»ôYp*¶Ö + M¨a +qîÅ*”"ù•E^ótƒ +C­/}0ì5ÔØaõp6ÔL¨(ï®xõ‘€¶CMôì“j3µP¸#fƐ‹‘Ú;û˜ŠõLÐ[`ÞGÔ ët™«0Á™nݲñ €€¿ÐçDµšÎøŠŒÚJ%¶¿gE’O“2ö˜œê­>³w…ÒEm§$†=†Êaxܑ0jŸ£|V¯‚ +æ@èŽ0gÔ—ÒœZ:¢E%îQ£†_ë^€„]ɍڪ>yÚCÚ\ô“t¯‰ÚgZ¸ÿ;jÿÍð@Š"ïò|áF{ԔsòoÏ9ûIby{3H¤uÈã0¤öçžBjàÞVR%¶MDjZëþ²Ej¬0ÿœ‘š…2ÿ×#µ¼Y PÔnþ“Ԕnjñ«é’Úbô¿™ÔX‡1üT+쁼Ô2yü‡<©é]^p„R»(ªf{­¢ÔFçöCY–4,M„ãZa° ÓDníÀœ#Ý8Vj“<éá Úáá¨ê/d¨áXKm õ‰¨¥¬ãRÓ4žÜBHÒþÄS^j#u­ö†íyÈÂ!yS‹A'‚bjËʔëcjBä¡Xuå[¦Vbv%–™ÿ#CÏ+>kÇÏÑìDS[Wí[šs‚µ +a©÷1íšZß5V(Öv ìˆF¹-¼hѹº +I¬¨†Ý¾ÛT4T3¥F +e°ˆ&Ãóv»ýwfaÉDNí¡ôH™šNy×5TB<¦Y]xÿ¿„Ä¥(ÕØf41G&Ô"¤ä7yj!¤§¶8)Wî©ÉDÖKbÂXÞAå叚ÈË ƒË4’X-€jªåt Z€äÕ8pÃ1ZCªäªIÚ»´ú‡ìë¢F)<[³`Ljòe{ŽºÁ•Bž¨6^^¹çã¾kj§2ŒÃ¨V›Ï¡Q ´×Ò¼eA&‡l4–‡ hÓ*Xé¿øv;ò«€UÓB!ú‰æSè^á×.ʋh1îí¢Z5ãi†?;µ=j¹.r©¦ä©%áow/5,SK\Ú»ÈnrԃKWK¼=5>ki÷TÓ¾–ëcHؒ5šLˆ-´%L;‡Å¿STí!•LŸ—܍uฤj²¥j¤á6U»~TP꩚7ªÚGo˜ª¦5Õ]RU4Õü{@ä'›im°…ãˆ]Õ¸–E‘¡,àÏçA.ÄlO@\­¬+.>fՈ¨mÙhÝ"Ý$¢ª}Dhy­šY7þ·j¬ +ϧȘ䪱—À€®³Æ¾ 6‚áƒn"æ>[¯¤¾jà¥ýCá™T7ytÀj5¦¤[Áj»iâÄN?,°(=`V3:/ÿ±Ú(ˆ1\÷D6£aþÑ汚¿°6VÇ|H!Ÿ@zØI]ÝL–bà’uYmüUž¿M[Ä{جցNÒÎj„qeá À©sݗjDÒAt¤ÕHªƒèéMcNýZ?ä΃Éì hAÚª]'Ê–²ààŽü…ÕÈ8‰‡+[ ü” ¿4cz¸U;€ý¶š´xL²1N\"¥[mˆy/a2DNäA”ÀÕÜlNO¤Ö±òoí;ÑWCOÛn$UªÃé\®Æ#>"s5r$çj,øBW;Cõçt5Áî+uµ?zž3ۥī™8{œíj’{÷ûwˆì#`ŇÀD36SàS%¹„ºÑù“³ö›a´×Ѿ|m}M‚Ðþ´À/D_àŸ`: +U1 ÐòàsáNZïðÿlí$HÛÑ^Ò^(‘:Šõ«}€þjµÿÕî—`4Ô°ö9Y.XmoáÍ*o»HHµÙÚN"†ƒK|'„°m÷;tI„5ÍJÃôNÃpo]·m•TñY¯ñSŸËfD=òQ扳Z«ý ã>$Äð— ê/ Z HYäÇx~ÚÇ^—ãÄÀ4gq;¾2ž|ÿõsÀ;†Ú;vߚÿõþþSÑSP=²3•7ÿkÁµ,pCN[ûÜGÔßÀÐf‚¶_ï°°Q¶vP3I7€X¶Þòký (Ø8âCδƒ…é)G×|ß’þXùý—‚H€¢§àã…ÕLŒ®àöÉ]’^"á]D W\Ñe·#wÑ" t—‚V¦Vÿ})Öu烙Xçµ™R_[¯!@þ°ô¥äoě (UµêYlMGœN_@rtƒî,¦GqýˆõuüX’•ñ:Ö¥L““M,ÀG·QT2xï¡ÝØM|>] ìëͲ·t[7 …ݬýÒa¹ë.rÛÝÄ1mWñ¶©K‚/v/Úà©Wð9’¬ƒ ìp5Ê0Ú·[ï3³IrˆùòIfs#¼Cfrî$V![nREItÔSîRÛVkñOì¨jü¸´¾yã&ÿ`-Ã,Üò']pÏù&¯qÎys…cé¬{±J3Õz…'Ù9°"ƒøßρ9h9rØGê‰B­Sô§êÒÝÊPõÔÊò¸±–—¤Ð¹Ùgu¨ï¿ÜÁšíþ6Ðü“ Üӕ2–a~K†#&—c¡.ƒaâem2{²c𘌐TŽXÙÇÁ…5gã» ɗñm¦q;Ãc [IùžØXtÕtUî#?( +ü•›°é ê÷¦ÚûðÂ,ÜZ Ôó ž5M" IÎü$ùw¶à$—ŒHÚ~µ•Y^¼$]‡þç;9$Án•‡NÄÙíp}$e׌D9T¹ë-ÿ(ào³‚›”ã@J*,¾©‡CQâŽ)ÜÝú¸}Y]nZ†ål8tfÒv©Zp‚õÚ¾eÌý]ê#Gœ€*ÈgX‡Ù6ÚxŠC„¤ÒQŠnÇ{UY±­VíFDÒµ^]^3È΅Ö\?¸N{Äed?‹„ô½.4@6]+ó_gÛ"ù$ÿ|Ç9‹~ ž(=‰³^ÆË#Ãó9KJ±S‹ÄJö³Øª:UÀSõ!³#Û*­c»/­9`| 6ÎÐèNu˜—9Î{÷` R<ÈfávÎáº@ÇÌÔñëuuäÑüËCþ |揜 >ãíÕc7˜©CŒD/Nc¬vºa9Vòá¨AµSe.X€ËiÉ{¥Ê8…[oXd-ñسQÕ³ºÈEó€fEw‡t0ê(Qô21X(Â^ð™‘iâŠ'!ZÃ.w¦_:ÔcAB˜Œd̈†–¹%!6z¡nµ"¤yÍs¢òSACÔ*¤ä×8¬ÿ‰$²ÿ¡NÏSòŽTIÀž2á …ðÀ¿‚yí+s MÕ¾ Ì"¢›Èâ™+¤ÀªÔä†Äœç@ôVٌ¬cHÝyq¶}Z4()`—Ä³a2N˜‹ òä•4³aGÊ5ò©Ï½íü‹úÝ¡”y€œêP1»ˆ§ÍŽ°ÑѨè€ Þ`ñyTì$ ÄGÇCKSì} ¨ór¥¸-ÂäTî#•5äa;2Æ>c‚³™®"ÒҒñ>´¨¥ð7²£sjlÏN)y0RÐÍe¢æè…H"Œ?™­D’=ævg‡ü`F•ê¶â6®æoÑŽxŸ–€X`&)¦Ÿ'˜™>uzÀ6 ’1Q]NÆѝÊóÆ$°”IiÔúôžœÓç›/d¤ًDø/Íu(äeçPÉb;1ÅB?óÀ¦—/!ªÔÖQ@QWrÊå<.µå1k&øM8Uïè2)9Í}Ò­#t}“@ââ¹þÇ_Áú–‘·ž–(»líl(ˆk)àì7bØ%"@ èúÂ2ʔ^ù¼50î¿Þ½/-—ö¢§ün”•ÑÍSü‡+eD0Ž¡jÆ©tsüH¯h+úþ¡Ë«Ðýa7NƂ­EÎ/º7@]€lë¯vM•€?w®ŠµpJj®çuW0ú&nV¡¦¾Š¤RgZG ൧&M³ÍÛƌ;)¢"[®ïcœE}åáÕÓÕÀl뇙;š>ØÕۗ¡vÀÙÕb2B.0;J(ŽÌcã0P~œŸrOÁ]]˜×ô¬vG˜xjÖç$»x¿ºÔ<o4Y}‹u4ېB&«[j3ã†è Èr`™RÆI—hëúa€O«°2F^hÖ  +È*Ú쟊dê*“ ”×›ì_Fzi‘.ŽÖ(‡©X·@a9·èŽ6Xuì×&\²ûÓ†P2¦àRú§_ðúµ±†‚ö®‘v¥5SNZ>*Ó&Jȁ}Écò2¶©ƒ,Õ,5 Ïx ä¨qA­I‘ Ùn‹QäÌ·5Z*¶c˳Qc“¸ó<Ë´¬‹$”“¸9äǚ]r5`Œ3üP9‘ÕX~À„,¶.o[½T¶8àˆ¸ÖüP©uˆ1çD[p›¶íºt@gQzzd7ÇóÜÑ4°q¨]ådð82“R±ÏŸS¹’¬¢¬ý±v˜îæ×X ’_dË9§Pw›C9T1HöuŠ]‰FJ²]Æ!;=Ó\x!ć-ì€ïƒa h2ÀÇF M_÷ªžlÄû<䛣‰‚Vž³9Þõ¬hjÕJHŠ+t±áA3¬ýñü*“ª´EA„/œüIEèHdÔ‘.!·Û Ê p:Ó.›½°<WUŽîåu 1֞† …q@14Ú%=1Jð ;벋×FÞSPÚŸ äñá©»jù뇘 ‰ØPw¦²kÞ×Y—`DW]dƸ(ê÷0>¢¹IWïÌ>aÈMdÓì¢éµõfÚdȉ·­â•k©î҂æ]æÃTøÄÓHPVaú@øáC#¤ë:é£C@˒ä^ú,ÞÄ5¿ÛÛ=žÀ…ëjµÛ5pÃ4=¿ ºk'7·K¶ZU`Ôé=+òv ªGyæ0êJ@ØëíK[õƎڵ¼ÝjÀä­H½$F €½­öv/È·SÞMËòT9WñØ+/}À•ëM¼þ4ý7ßU¯ïu §îšÚß4ԉâ7Ќ«+)«ÿ)À¸0úÆܙP ç‚ã³힆;»åb™v)+Rçÿ&p× ‹¯j—‰Š]è`°®Cˆû%Z”êqÁ v*ÏiØHúÛ%°W:[vIŸSqX`õ1㠐n«Ô6ï>m7Õ?k5@óÛ¤K3ZUnž»Îß#- ʹî,ÒÁì°wBÿs†Ñ±,ŸÖ+öŽ»™†—<•ª¸ð$µžrb“ÐðYòWëhUtp›ÀAç.Eºþ- ‰ã(:˜Ý?cÎLVH¾;×X-:¢8ôVQ\‡èu\C;µÆÕ}û‡µædE!†(šÓ×B‰âÀzv.TðÌ÷ÚWG W‚}õŒw!-=×ÅP6ƒnørq§ÊÉ}ÏÐg;¼ž¦k¢¢½]æfð4ôV-ŠÈún©4ŒÄ™8°¶é/IYQKfۈÊ(Fp&Œíz§G°åèäq+w$ÞtˆÞâH̘üM;Ò9’1†Åƒ•C9úO©j½:Š”®NgE öυJ—²,–ûÕ3,6¬bÐÛÂÖWìA5n€©¤„—åJyA©X—9µªÎc Òv†Õw€'äU&–`áü`ÑÆתñ+²:eðï‘$*üÉè({JÃP*â}ö¢,B+ +?‡z/)¼/9ÝeRŸj¶gTn»ÿÉ‚œþ|Œ>R_ÎV¢+•C°M ’¡%…6*Ö~NÍF>Ù)ÌIÉT˜Þ Ý.É*@,LÎQpՉa.g6Åc“óz¬¨zq47jöß]Z›ºã°UÜäü "O1aJeô>lݸYiJÙƓI=QT²árAž c»ßÿ™b(†ÏüYݐ If_÷> ÿtG‘qTá«­šØyizWgMªß9¹Ÿ¬~ðv+¨i +|Ïúmž@ FJ‚¼·.ãÛRHò"ùjÆû§;ªö~Õ/FI.¤}6ƒr? TÀ5#ý£qÉ·‰ÜŸð"«U@V$š9zd¶3HA5ñÍNÕc˜ÏkpSŒ?¬þS ?H)xŠÆ®!j« ¶¯5oДöØ‹¥µz˜Ä¢J—ÙUl·¬Ò !÷_‚A[p¼¹Ü¢°OP«zÕ%O“'¥alܚނäœÃ]7:¢xöâåBänhR+xoچövmÁUF¶ñ“B¡ñ¢R²àwÔ]M¿ +Aïέ¿4/ òmŇ·™> +ˆ¸¤hl2%±Ã6ñ˜|/FN¯ƒõÅlM¸ù°”¾*4"2wð—Y h(èeôó{Ô aRYŒ/=UU¥Ѻô³2bÇuR_z ó‘ØrBv‹52³C[Âò ýêÀ³„é}’Ü*Ò¶ƒ<7uL†G‘8¯*ýæÏΉ øl?ô>ù˜Â øàÐ# kÐ~XýR ßB×úkðYN¤%˜2 Ë¿»´f@m>[ú5z2 †Á•c'Êè7k*w((N£iÀÇg›Ó2 ªôô#Q5œHª¼ÀR¬¼rŸ]N5n°(T(ߊ߳5 ëC˜õN,øC!<ç=A”híaÕHLŒ¹€ÿa}Ø[®¤™h¬Յ ß ëÁ ¶ƒc)Fe'2fz¤ãšT“ôα>8ŒôåpŽ#âð~tgˆÖÂ×?NÌaÈ¢4N~>Ì0ÖBºIÁ²ù è\ø/¾Ž(‰”£¡Œx£¿Y§‡³Ñ`¬lúÚ;´FìÜ8¿%åý‚.à·¿¦lA<Dø›o?öh2‰üêD­2D·»Œö5þV.+«%-&ì‹0W!¶ý>‚ÄÙ®žÎuUƒ‹ú­.m"Jz\”NV›: Ø0ö"©É“\Ù;¥Œ> ‚455ç—ß]8)×€±ƒ A`(„ +h µ‘Ãm…™¶Úªµô¨ÚòØÁ0×%cÛ½-¶}™â¨½êFæÙY(Z@ÌZ"¬bV#i"Ái +Þ箆œî;pßp:ãöÏüDJì&Æpüï/ˆëȃ¶mÎ ‡ˆˆ(STc+«ª +t7UA%PµÈU5$‹‘²Â²ÃbØãacjÄæf"ºª*«MåÃð„!ÄøaX„h£Tæ# £7‡¦b"ÆMØxýõÛ+'×0>¡h9º%Qp² œ¨Džs€±P@‹ã1i©š\lˆ`€Œ¨|Fab †¡0 + gÚð¶oâÇûÑ>`Ë5 ŤÏÑz¥~6Þûªbñ3Š½¯}±_B&»&Õ¿hyå=t‘efæs¦×•R.IDFaÇF9 D¾t¬u¨,Ðpg½?ó݀ρ3¿„=¿I›¸Ñ†Ìü’IêÎ/ÙB¢{άt‚tõËJD8@΋R1™õÜKªàܚmXõ$ÝKÂNÝýÅÌ@äpb}Oæ[€C±S·}IUÿƔ¹áÑôœb®ãx—– +2I†0è9ªÀ1RƱȾ› (/º¡X[P9­ÖR u«} ƒ—;¶/՝_ø9ñΙ‚<üÁ«¼Í˜Ú름âחhtˆ¤ˆ6g=– קÄÝCõ]Ú¬v¯ñœ©çKؘ“êä¬Êéԅ>zW›Ê_~bë7Œ‡ò%Æ(èJ«ëõαò¯|?à4Qsˆwa«‹ÿò¥hQãV$ª˜UFã§gHƒ»ýŠOó²)ŽJ®Ä}ÆËwHébÐÌIpúaÔ {¿ª+äbçï ¢kÞÑwÃw½¤ÿâ¸Øàë~¤ÑWÕÊó×RÚ{H¬‘÷ØcI0«Î„(;*ƒ¿"¹ +f40pƒ!@¨Oá²úHj-w„p:ǝµŸéÏ%q5g¨8ñ=*ýX@p÷Ò¬ ɬ²t²Z Ü컗J†¢ ³z™d–š86çœXü ž8³ۃsÎØ»êkâ ¤0ø³ë¥¯0ý¯—.rEŒçù²-G€ÉwǗÌ9±OÐÌJ4iŽ€_/ æ…ÄÖúD_€K0çP$À8, +eG¡¾òPÀ@³ß*¢T7_k˜Îî¦Q¥Æ5U«qb/£U1˜EôÒ 0ôÌ!ͅÍ$¼‹ùÆç}±n~Z솢ݟAPØ%Ú3k¥ô¨ë–@r.?O›£AziÕҜ& »S/rƒ—Ší¼ƒ0œÓþ«ìCÂË¢Â9¯¡— _ÀVv½‰pαØ%%¸ân)¯ÇÎjpÎNô’K©¡F/Ï)é¥6õHÜê"vX‰”ÎAâĒwÀ9¯¨•LÞÂîº Ë^t£Z¡ ¹‡.ÄޜSYKº79mä:Kcg@oŽÜ×¥Ò3‚^’ƒÏT³E’&ª†`Œ +\DwGÓÇWʀ³py +¸îæàk"~¥Æn Êáõ}áž$YݜÌÂ; €nΕüÂ{ÃK§Ê-í}v‘ææ(€ñõ~mŸ9^)TSÀ2‘Xl7¸9ÝC/ÍÙ±£"fôt)ö6'Šï,zÜ朗CtçæˆÌ,Xî5¹ÌÅ6'é/€>´6çÊ0«O…ž©á¡Ì”6øVJæ @›ã^‰ôâÖ¢ŽÛøW ºÝ%ÔPË¡ùšÝ<îÔ ¯9û•—Œ~ÊK +ËØlfO=ÀlÍQJ^JÄa·]R¨ö»NŸå1°8ÀÇÇ'ƒ$Jlõ+þ§,ù|àÝÄx)ý²‚O}—4©:båÃKÜà%+sO /µÁ^ò@ÕAj)œ)Í©ŽBÁeGÉ.Ձ%xéœàॹ²aê;ª#pð’PÇñ÷^Vš̟7ÙÃA™÷`t 8y0¼äÂ¥‚ú%°}¤2hxÉËpD1³p U£:F훦Á2awޛÕaeSXP@ò3c[ò^%÷^"¨ˆéc¤áPê4JûdíIÿr¨öƒ• mïú\îËËb—…¯½KI&º¯{OŒ“ÌHê›ï~ü]z6aéw ÅGÔQ5ž!öXMùÜ£­0šÎԞG¼×C9™ÝNÀÊ½%Xw—¨°NŒéu½Nê1jààƒˆŠTê.َʜãæ´¥r@s6|´Ÿ +*ÐÄó¸Çw*£½Ý%YߺK “p€³Eu¢\q暿Ó2çrშî’‰·»tϼ:ÿ\wiÙÐî­ÂGó¦Ì¼÷í.éî.e>ÀüÇã1¡·*ssF82MFæ¨æŠ,‘/Î>åÂÚ% \˜¶Kœ^28nQµ"dNĉ/FQöȜ`¶Kä½u < PÉv©ëiÕh¯èŸ#&–èÂÎå1gÊnôsäâìñÕèSF-cÎãíª*¸M–0挖\ÂsÙh:1qQNÝ]̾™·ènÂb{ñlïÆ©bNE¥Óå1ÕP‚?¦c[Ç 2SÎj (æ@ç- 1k§ÄœL¤e0+Òi΄@f—Ù&!Ì©2ÌXfÑt0'|TŒóGÏ`@‘Çu°ÄjE Ìy^v¢L*'°‰ƄK'«§Èô¢_N£¬Ì8æ ºѾœ«â Æ¯¤¦¦/þï\?‰‘Ê—£ù(Œ">ðUËÚäå tä’x9KÛ¼TÎX×a¼ëL\ài綟ɻœÓo5ûzâ.gRÌï5a}I]Î Â%v`snÇÿÖ³ÉÒå°5ó`¡å?€lôtCYβ×Ìù$÷ì\ü»{¹¹ y©Õrªìq^÷´ \mC× ¾å(t†öȵ@÷FS¦8ñ–3‡ €÷~ú/DšÆ©[Ž´™*L û¤—¨n9'L ÅL©h[ïÄQÉ9Š‚N²&jÂN¶œ\ŠžNÏ;='CHl9Qd@"«®åì•|« ±µœyQ&~é²#aÕr€'=ÁÓ M!Ôd'åÖ¢–Ã÷ÝڅhdS¦åpÿH`'p:\|‰_RÕyƒ‹¬KÚé7Rüsc¹ú¦fY-œ‘"ðš©kwú7ñÍ6 ®œR]ð—ã—,çø‘Íí‚c0ñiOÍ +²œé䋎å$èªX)Ô؃0–s¢v2Ù XÇœùûDš žhZãˆåˆZ«ó©¿ë,Bޕá/ ÃrH? Ëy¯‚“ 1+8á=éËIg;Œj¦#+gu°Šl¾¢»Å2°f­‹"¿WÂÉ엇 d ã'Rº,’™Œ^(í,ü_ë‰ûªh‘µ`³cË/=¸Á²à³™"Zr Ž+_xý–œËP+Àz7a‹dr c$°gµI„ç|a“°ÂÕÚ`¥튮&%‡2uÈãÔÄOÊÙ.JŽr< +Õh‚ä¤!­ÒÒÜO’óP¤Ä®HVb‘C2™Hì‚ڏu­¨Ž™“A^¬¿KMrÈՈIŽH «è.×þd¡%9'ìk2¿…’œU#4âÛæ*žl‘q$§íŸÆËñã%ÖÉá³°q +Ã5"ErÃc4Åõ†ól:]ú7$§s:…Œ‚#DŽ§ãÞÑ2ú¨#$MHPê@†©7¢ Vå2™YM¨œ3Dʳ‰„¢UXÑ ÛÛ +3À×l›˜Çó2 +€P%äˆTû8ªÈÖq2áÛ8‘û¸‡‘Úé.Rè€QaŸZúù8Á¨ â7ÒÂúÜ¿V!çmð7åS¿sԜt¥ëLå šæ"‘ó+Áˆyô¢/[""çÊ÷¨y[Ø×c¥Pܿ̕¤B䘓ë|€õrÝ©éŒ +ïQ ώ¦ 9Áh0?²U¡¯1dÐ_rš?©#Ã12’ßS!G?¯…EÑKN-Èڄó셙áÀ27üx ôãjL1™MB„ÅÙ8РͣÉy ‘”˜¥‹Üc3¨drbÒbòüÓß-ˆ/X3jòr¶Ðº‰"ÊQÃBÅ)‘X¢Õ-¡0‘¯£‘DD|''öÍ¡Õå+û8 Þ©<¥ØJfr`Ý3ºáˆ@^¶mæñ'9‡Ç5Û0Fskù›áiÀ*ÆI?ÎÎw,"a Àô8¸Ý£礕©r?ü8Gƒö¤£R,ï8ÄeɎ%¬<Ï&ñq¦Ó%€]ö +û¨€€ƒón„Ÿ°*^å'’"ºrÇA€7%7Sp|‚­ô8án…Dž;fºŠ\¾Na.â&£QŽ§ Ÿý==ï8UðܨÒjëŽl„/ +§H;Œž'諺ÿ±È@ÑÜ8ðXBµDíb…§8K,ïÐXQ$ŸïJmSB{Ú~ªŽ{DQŽ.ª²îÏ÷ǛšãDüà»YJa¨3ÃçÉJ¨ƒ0XŽk³Œt$åѹtO9ŽÈ¯&*qBèù8Šã>p픢«7ڔòn)EçmGR=$Šÿ`8Î ¬ÏÈ<À•±q¥ Âç3%Øo_ +É7Nžõ3¢!c.úcAm¾0MQDñƁF óW§,»qtpn³ÍUnœÙý>„‹UB⚣“ *««Ø±Àà»)JôDÒ=$,¦Xý‹Ø8‹04±µ¥N–™×8¥§O:G+=O•ZãÜ 15ÝÞÈöÃÇ{ˆ2MrKÖ!Õ8Í/”™!f‚08¨q¯vۜ +]$û³0 È`²¿R‘à +hœ÷@æ–ËdkÒ’*ϧq°£O[ó‚øÏ89¼òJ¢Ä1æé )߯Žu8!Áå+do Û[XTÆg¯歂< f¶k²›Õ»odÞ0ŽÊ…â0Î: ÚâE±Œ60ò ãHB¹ ªžœ:ÐHeÜv>¯æR=ÔãìyíÂÔ×ç”J‚mYæE; g§A9…vX8òZÌö·'d‡bœ!õíÉM$÷°»×¾Î0'}#ƒ0^Öã˜î57ë?,@±šDýÅ1†0(ã!íZ=Ú(¤ ªŠËĈIÈû èkèߝYÒ@œ2‹Y¾H gŠÇØÒ½lAªü£‹ÏAsB¢ØÅy’ÜÄ)5…Âù飇Ó3ò.”…ƒêÌ-zª-ÎsRdG~‚ÛC3[‹£‰ú°# Ÿ×<Àæ±Ø›/Ý_+DªçoÓ+lBåEŠ-]d—}øÁ ÅñXŠDPwP¡âp˜Å‘"YÎ3 ŒP±¦ª—Ä)‹38ÑÂÌ8Üo£êîÇ?^ŽÛUÛJá4[ +®8E¸ÙȐ~-mÚÅ:qÚ+lã»M»f ­8ž£Zl\¨}ՓqƜVeUq^(–hÇs!ÊîÑãè5nB}@ÖÌä%KlGê ]Jð“áAW3—§M”ˆ ͉†“æÌã&Öf‡îO8™+³ˆa9ÂʛghrôÜÇÏ{¨-¥8_•âv@Iqfrug Ź×Ãé(Ž®Gg +jE0ÊÕHVP§Eˆ†B^>4qz?’@`Ö;ÀðWyeŸIiƒhž]÷v’ 礝DaÕR³±“èɍXÓÆoöߤV•Jšå%S9FþŸÂ-Ž˜‰ÓƒÆä½WU°i´?˜“nðDâl^)ëýÕÇèuóÈ !c DàZâT¶°DÝUߨ´œ+øÖ³ÜoœeÍá"ɸՕ_CœÕ•jêP™C%Îk2âÕuÿRâLÙbƒ6WÂRŽ¹bdNuEð¬ÜT©C³sFvíûµüPIW–ž‚n™\Ðp`‰™!/òŽeô†r% ç;då”Ôl=/$Žl êý§q¨9L|ÄA×cXi16•78ÀW›Ʉ_Gœ´¡+œ^4,Aâˆteó醓c€èJï¬ó1Ûh™íšŒÆÛçJFN +Ê=­GC̔8:K+‡Õ26މ‘‹8Öyp|˜yfŸEœÌ ¸¦ÄF孊8P0ÐòíIs»_%ÐDœ[Ђª>µ3CpÄÃ!º‚¸U&]¹Ýu~•-s&o-3æ?;cs9ž+Û"«g Š›P™b˝'T_-©÷[à© +®SɇRG†n¡…ǝ¨"hÄa™jìE8ÝÎ#€“«)4šIn™pnòv‰ŒÆy(Xp8S5 ¨&Q|FÕ$'X6οŒÜ&ÌCêø3PÛ U¡»¬z¿Ï`—P+5K<‘`QØ­[™: +‘ºiÍ¢|à“! ÇZ²ãal¤/¯ëÿ‡~«k‡Nª[‡zuB1‚A¹vÁ°DuÁüu¹À`K#9©ºwp°«°%Ä"˜£ÄÃMÁ~ÂövÌMÑûŽÞM±Ð`ßö™LËŒ“À]­sÈóšÓ!ÿU,pàªß),ú}µ`„sWÿ;…Eê‹ô˜¶W“ÄðÞ)ÓõÐã^"Q`Fw}C|pz\P@¹L¾yß?AlºN9 —ëÕÄ7Za…ôãúEŽBwpPWp^ä9¤€¨!¹%;8»úµ_¥DBùèà˜Oq€V³s\ٚƒ#ãòA¡•9IŒwCëçìwç;e-‡!†×uîFBåb(¾“58±rQ¥ñÍG ŽŠ{Gq²¤Á™aZX:á‡'6§yL™4¦Â N‹SH³ÖîÎUôF(P(ƒs5ß@ᑾíK6§à:øá(à˜Kò"§œ$”u†œÞÐðûó+z¿[}Á!~øZ€pêw੦Ø2^pñP +›Îg.89HuÍômy¬òº•…¿Ñ÷UÁ™F Õ;16QÁ9{üâZ8j2Á›€£-+~®@w}HB +Ž3D»‘gfD 'ÌÓ,¡½‘œ•Uck1{Ãn²þTžíšT~£ù+H4ÕLRGÖ!Áñ‰ªæ¬a7L—’LRBp.}CPa£ 8%t#U¿Á¹X´_¯€7ÖùÀpŒºÃ›f²ûfÿï1ÔÀqs_Cö\Ù9³hà XŸÎéæŽ®æ7wõ7ê;؄"*#MCÈp ÒÓN&‹4̀€j3Ú¡JYdÀfMzÈBôY°êüâ A“›·ÃÁ€ wý;ÒÇ"feeo"3]ƒ^͏?—g ûŒŸbø¤é…×³´J1ρâíE¸¤82ŽY† œéšîÆcóNj°ã'îUû­à€ƒ‹ðlÀAK1î¤zƒÒ€šïUöþÎã¬Ø› ÀIN¸Û"àx¢w ˆ®CàØ.pÂݦ8^ÙQo"^ÕÇ$I@D™ÓqÛM~\VøF§.ì÷FÀ@Zxršˆò@ë–ÊLÐx“ tbø5`ák:,î v¿†Ð¶aØ|pøûEÄ4f•Ké ¦ù”7ZX/c)æ"zµß ªÝ7?T”ÿ¦/b$_Ûæ Æך ™–‰-§|ÖÿF'Ûy“HîoÂ^øË¿2ÖÀ?ƒ³m>„ýÍoY‹Î5²ÓÉ:sÖß$ÃÔ3ç·Qj9«þ þŽSKEzŒ èo‚Ý Èu£" ‚¡lb…7oC@©rSŸ–:ßoÎ%”ó…0…ÑýFƒ™+IÅÝ¿ãÆýf†¤–“²úµâ.¹ÅØNÐxÿ¬ß«šMÑ{È»jÔĦ¹™cúÍDc¸µº³#ý¦Ê>R8íÎBàŠùù Oƒø–LÆkðëÔÉð¥p9ü½~MùLóAö á7éº$yÉÍ%#°o@¡Ðµ%/Õø˜= äN±ûFDÏÓê™é¾9>Gd–Ɉ‚ûL粁*iëlßè+r9¶÷ìµ cÕì›ú€ ™ìpśµKŒ0²o&ºd2 VÕcûf çÞ"5}€ NƖsÿd#‘Á´ÇxªEy¸*ŒäCçd‡úf”«¤¸€®R$Žè †|ϔ³*ùíO²9K/kÇg©b-Ñ7G{ß}“1°ú|g›ç›Ÿné|SÙªä1D F9ÃùÆt0m¾¿*‰a$ÁdÜpm*#Æ,À…*B:&z’1Àš©yÍ \˜S +|³~0g +Ùó̹òD‘#Kê!¨‹‡§¦—Å fÖŽÌ DãÑ¢më:C#=¹O÷ß©­œÛ}OÑ9,¾1}Efo6Ÿè%¾IVÀÁ4念‡¡ÓDÄrd§ ½¬¾±w‘{½…oÅ´ÝZìÙÖ#6$ˆHß& ]4a+Fe|sÕTÌç—s7> ÁŽ”«µ@k£¨-7ñ‹ïÍHqtžß`e͋;oˆ¬áèîv¶e÷â;ãY"ð¡{£•æބçYjAR=‘{Õ;>{X¢‰ ghhÀžYº›ÁÀ~¢©Ö`*‹ ŸÃå×tðj@ÛØgojù–n£¥aèî÷¢7™R#‡ËO`½ÐÞP·­ºš¼¥7†0ö«n´ähfIí!ùp¹ô¢¥ù5%«ÑÍDr6È´hs¶#²“I´ ÅÀ¦ +,9¼zò¢dÓ`u½!{qy£¦›Ç[ØG.lݎ- VõFùûŸÜ‹n“AD-©(ª7²ô"X½ÈÈm¦Aìgh²Gê%¸ ¨7„]ŸƒÙúݤ~¾Öã΅G#¾Ñ#Õò™$ôCéð›¤§¥Œô(xÚƨ ¶ỹHmÃÁ´LŠ"•:z“E¡³Mù3Õ?ßÃË(ÀËNH.:5Ð~î9%Énèiæçp ºm·,Bѓäó¦*ÞÒÁTȟô¼¡Þ[îFKoémÞjëx3oñqÝÓô¾®7i^²n¦ì­DÌ]–!øå¼Ña¾øÒ.9ΛSøq{P>YɄßŠŸ¼aõ·æÞÂ{äM6oŽÿ&k(D½jÞ\ÈèË⠺߱ÝÆEë"Šæ 1½Å6Ý(ܙys{¡™ g³œe¯Ù ­ªÃCoy.á•a…Êžü!åMTWw1”77²¡P!“Çá"ô¶öŒðF7aPòxå¨N¼9ô“x3*ú9XÿFÞ°©+KþLÀšptµI 3iˆ7pžLì¬aŸö“€¼ápí1æmè5X¬—ÿH 㠁eã\­—°'oV®Ý3ê‹,ÞÌ# ` DyÁÁþM¬¥Cs£mÀš6»ÎÄØÅ®¼±ƒã0éSë6.obïýý‡¦8<~7ðš¤LY‚á MHáfèš/¦¦ð¦oG%¼©üõ|Üe=™k¬ƒ\|ÁPoO‚ã^hôm ÃàÍ<ˆ²Ìⴂ7¼ëlœË­ã, + pëX0ÞI», BÁ˜`§<Œë‡ + +}SsIT>“|2Å؜9­»±Ì®»<<Æý[LþRKnFeŽnº¡ï¦Yq§FŒi±È‰¼Œ˜–Qó\Gb"|7;€X°~€ ZoÆ^jLnŽ>q#ãõ@ ©ìÝÇ&Y®t潛ñ®# us§@šuGvòÛU üF_qJ eŸ„Э͟SÆîf”iÇ°î&˜¥ês>u7qv›“³`ͧÒÝpŸy¯/ÂWRçÄ@Ä¡¾œ€«Ýܳ£%²2®q˜v“ŸÑW&p7e©óDþóûv“uÑ2‡£áhU·NŒ8Š&Ò}ØT^ˆÅIµ›½ÕpâþN«:[Шݨ#…ËÀ V]^ªÉ?vӄŸ2ўÝøt`ÕX&BŠ†³›øÚ.(ªCzE;5ôuØæ™jD·çâCæÑ~£¶GÌ͌ÇõHôYv#²Œ‚·]ͺAUF™uυŒ£OHvÓÙe +åãݖ:ÂF§¯ƒì¦ð1ÊÅÛ¯U…몡Ez²AjÎÓ±›rˆC¤À·ÚLu(ÞÿF‡Š!æ\–¹i7 " +Á^ðÏt9’A:‚,'Ã(ÄT×t,Áejìó^7K„Q2…"E à´ÃKOJ»n&n»‡= Ü<^â{}"×Ò4¶nú–q>m ìÂÔº©b–üƒ_°,€°±z©›{³ò‚)­ +4´šuÃM-+<3 `J ë愌ðZ2¾ÕÆ<Õ«EޞnŒ$·0Íå=çÎBËhZÑ\-ló/¶ßIÿŽÔM=ê ™à½g€ŠQ7È9ŒÞaØDå0Zºa6 )±?È@î)BÝDWŒa¤nŽ¡/•«äݜa˜¡ÿ4êD»ñ„žq½Q’L¦é&h}}A¡dÏ n¥kh˜LUΐº54ìÒÍ°ùŒ ºD˜»-`´û³¡F’n‚š‚U½¯È]T¤›ZýE”¸6}µY‰²éѺbÆH‚„°•}¡õ—èæÊÓ¡VŒDõP3b$ÝYžÃú¢SÏPàuÐOG…ÓÁHëîÑ®,niöt&9C7Š4‚‘Á.›¡Ê\"u£Ó\ñE©§©q ” ¬cd¥ <ŒÑ÷Mër¬r€ÀÉ«·=7[aôÜ(6tš · +#$Ôä 'ðÜÐ9+|ñâIb®¥TP˜™}¶/CçF¤T…ä*—$¾­Ì¹MÃbѯVXgÙ7‰{]" ÜTmžÐ¥ÐòÝQ:1©3GÉO¨ê(.sÎÜ äy$Ú®‘„Òûkä&ÊcGAW…ÃU™ø#DeÌ{nl›ÙmÛ¸(‰˜¯‘.›™Hg9m—»oH3…ŠœøðȈá‚&ÿJbϤoʍc– +fB*F±%åf †¬Èï >QÈåùh"q eŒé”~&á19ºŸÄÇ|´Î—»‡óf(kÆÔ&¨üð +T©YU-M^ &7¾‡èÀC”à=å¯=°ÿ´1ÙÝðû!îs̃YÀ7¤,H0çȐ›Ð'‡å‰°{‡=g-”ù?Y¸Ž*5³4HpI òqÓçïBQLÇÔã 燛l›½ß’­£É]v܄÷²<´›ˆÚÚÑ{^–˜ŠH^`èFBSŽa^hPhˆÿŠ +,•xYnGnÔÄr 0ÜÌﲐëÐ7nÜpæK¸[o +\»,ߔ¦œãkŒ?df}.n…8”†zÛ)´¸~äábŽ7҄Ñ$Os¸ªNú@ ي›Î‰„RÊÙ¶älõœ«RÜÈ£gpT%nŽóäAâæn&Ûù¹å› pÔ}3Aª7âìS½'Qµ%Ñz€Ûï¤$!}¸éþÐ\‡`˜ÜÃáF ®š\]i2å¶á¦ÃÊç1±ÓpsÒ¯PÁV1(£ ¸‘êïhcÁŽ¸71jÇz”B¨7‚ ëhžrCdö6½p¨‡¾ÔÀàæÆ#ÜhÓí‚y[ø£àf-`.†1^ÖCp#dDoëï¡ÙhV ŸÇ n¸!Ĺœ>ӛôßfÒzêS¤;)âßFÝzstAãÇÁÚh.ž«Ž¸wN½M3¾Ó™=ÖÕ}›õõqóÈÜuC}ºÀîv~øUê>2ÍÛÅð£sžè6p äãe¬b„ëâۼΠSê üyoƒÃ܉´e¨sîm ˜Ûaqèÿ+£©½ ¥47 ‰jíbsC·ôJTãáÍCG##Iy›§Õ³ÀhxÈۜ–GãmÌ$¤ Ç„ƒUׅ%ݦ  9еXxÈï ·ºÈUÞôT‹¾Û¨æ;ñZËó5©è¯2ŸtÄzqŒvzbÝæ9|«nz¦´\DSH4ÝêQ!MºÍêA-t#Ú8d攄“¬éØsPl˒ŠÏ+®‹ZðÅÙq¾qïOaW±ât¶af?ìC8íþ"Ÿ\]ÖÒ +åÐÎ*ƒtQ =’ +!šÞ¦ØۆÛø\ÆâK6&m`|@-°“€ÄN0ù¶-R°Ïê/€ù0/A>µŽËZò +ÑÀB¼m¦\fD_µÍ$¡ ‹° ¶´C`Q@K`ÖGÛFCXn ý<‚°%¦òišms¿.Á ƒmsn¶–¹6†‘¹ÀÇ Û¾s¥ÌJØ6}‹rÈ60Œi¯ˆi9ù™ã.dnkA¢äÑK¹U®+ºvt†g·—é•BLØf¶Fk£Èü>?»´ù2–fÐñ 2äM£sƒ¡pÄëÄV—QˆÂ½6sM®6"²Äæñ…îPn‡isÀm³Z +Î +”>Ðþ/1›R&¿æR£É6¢›à†´ÌúL² h ‹l£Y’Táø=d?uΠ ÛLuf84ù(_ÛüTà<¶©kÒÛ|3l«oÃm`Vÿ­Êã۔2öHöJF´%ä®gÁb›º»ÊWP/Kå_Ó6qGƒmA°MØmމ ÌN-kSéÖišûZØ6els^p=:EC\©Ojm6˜|ø-Ãq``ym´r]òrN~Š¯Mäâtâ .ªÌŸusИµ³:¡'›n7G<Ì÷õx> ®Mö©|®ù$4i +¸6Ɂîñ:{ê(?ErDl§ç™/ié/ô%q$[³Âæ§Ó7[fm€Û• ²C5ÒDem`ƒ~´h; µÁiª»Æ;‹TF—/O㍑nuV`mƎ0 óðë«ÍÍP†›š’Î ÕÕfí˜g{™Ä¾²‰àoö‚þAR|FéJËUËSwUmžcõ!Qµa:7w€ÙÜò¶T›hÂP/*Mˆ6PmšT@ɼƒNGãÔ&ÈÎÙÙ|š¦6ŽšÙˆ3#cj#;ÿ_¥ÍÂq[_´ƒ÷€JRfÛqÚ  ¥I sé ÜÕоQu#˜tHACq‚ÚX8*Z¯jפ8\¡aÜ0múåªmhÑë§ 0VòЋt,y•K›Cx‰=„˜ÕèI‚U᥵\·‘ÓfÔÂTþ]Ä >Ž’'DŠåŒÁ>'ú”›6ƒnä߬åb†‘t^_b¸´™––6",+žíbi£Ex+m”Ó*•6Y„”Ò&î¯ö#‰3J»J›Ñ¸*C¼„ ÃLÚl>/AŠ °aË!Ý~õ<àÁýÿ&Z[2Fð¸7Â雷Ž6úÃȋÇý#y*Ž6@#½Pp¶¢m´ÛçEPic{0Íè¿4&b_7~¶¿—“û|^ ژ;½èÙ+ÕÄ^Y´y5h†åšµÀšÓ}즢b·Èœ¿¢h£–ÚÆßáÁM´<àcçn=‰6ò‹¼ÊÎ÷Ν6f©DDx¯Íȱ†6¬Ù£ÑÚLÕvÃi²±=̺ ŠP݄¹Úì5øÁÓÕ´°Ág£35 —¤¨Ÿ—åUy¯yr0^QðÙ¤µv Õ̕FÞF/¾ý)1úpmD—ï†:¨yà5§y¹¬Àòú€ ²,Ԑ´9©2ŒÃìDb!è(¶SŒÁÐf´•³o¬$ü(þ´Ð×L,XTý«xù§”W¯œÍ5/<‡h'Ô"Â͂Ãêg3ã°yÁ±Ö¡ ÄÎFð'»Q“`Ø_ä $±Sâ$¦?ðà +øÀӲѴ‘_#èøcií0j˜˜õ±%‚ÅHH„€Ír{Q5âäb Y¬ñ÷ä–þg°é¥Çf°jò-ãÛ`Î6&ô"ÒâÐ%1¾5ˆf6ϵ¦W¢±XÖŒŠ—†Ø8ّ)ŒÍ¦ÆaCd•K´êMX%ëL]/ÇåG›‹ÔÃËGWß< ß¿<­#66§Òþ÷­y¼çO ´ËFÖ;<¶Hð°¹?kEº3Ž™–˜áÅ, +ÓÜH‡¡ÐËRÄØøüpßR¢d«·ò²Úü¦â¦]ÛèÀÁ" @Ï@‚Å&hý™ŒÐZn+ =戍²Îµ,`¢ïfÅæ @$†ÒUl¢uªÿþ} çaî;Ž^«¨j’ +ŠÍô3Ñj´Í§ú#Õ[iØ0‚¿¥c´¦$–ï´A&”EAšÐÉWcó œj‹¤äו̈Ò^&¯DìÚmA¯[7h^›: YUh¡bÃ;Á$Ÿ9‘`Òü?&E‡Íž©B­ E4«%8û£É£SÄ@¯l3,ÉG3gýR +˜ì"8…ÁKÇ4‚aSgƒ6/Isåý‹"œÂ;N9ØĘíòÜR-l†ýØ1l nV#©*ž(+ٚQ«àZ…ÁN›Xð¼31#\*bÂf7‰‰_™Åœ-ðy ›$aøIê0%9,fåçóÁF¼O¸¥&àÁ&·ü_ϟގÏt°}¿ÆœRx8ƒcúÒÁɯæ=Ï'PU¿šÝÌLª4k„‚ 1µðŸÛ e&òb‰oä5Y×h0¡É³ù%\«Û·˜Ã¯½[qè•7 ­¸TJҕБGÍÌ •$¤$¡I +²ÀÆg÷¥­œ1”5$%‘f +l~€ê"ÜkjVCO5!°Qµª»Á5d>[û5åûÞP§¸¤Ìb„PÞÖ~ Ø`–Q¡ª‰ê…±'ýsj¯Ta붸„ÔÅðC]¼(k”ˆ 3ö5îÆV¾vDöµ,Ö$ó/GÖþéB"‘Wn*£ÔTþš§Cõ«EÞñ¾‡üÏృB²X»tk‚9€¥x’"vPSƒ¯¾g¾O5okªZC]Á¨Ö$§Àh1c\@¨‘ZcNÆÐ{ã«âÊ6ÂL~¬ÜïD,Àî‡fÀæ*¦5s´YZr5¡ïÙ¥´ÆÝ)§¤50Я=%m³¤5êÁ¯–xø:ê|(1ªž!öF„Öð7{xP#Idà}ù‰¸þooã_L»ˆ!*žüéf xàËËïAüq£æ™YóMÐí€_|Ä°(W¯Þ ÀÕj¦·³Äwöjâ²K#äÀ®¡*…†Š…\SYs¶i(°dsS‘»þ!³”5‚»Éæ§kòå¨ÑD~±iò—Ž¥ü5DXÃû—Ãؼø ¨r²&êIû?¬¡̘¬³Iɚ'ûòhS ‰{Y±U¤L7dd %üUZÍê‡ú>7“PY³™—;3k¸N!kzédÍ#¼¼:‘ïòa eòü«!]—™™t¹á±Fé]ŽGÿñˆEǚËL®ªûôâ yȉl¢%ˆ¤S±æTršfE%*ž½s©‰5Wrûø=È-‹a É`÷Çö¯ÃÇÐÿQ¹À6Å͜¿LÚ@/+0„U“–wLEGò’—r‰L&$T k¤’_§Ý= Á [ï#ь/§ f(­!/`̈́ãkr?©T¦È¬ÑD«ätþÕ¿OÃÂø«a¹ª™mPËAG¿hÑÛô€ù[O¸pæ/ vLœô4T¯FùáŽR¿@°†?Ú¥ÌՌ^ÍiP` :Ù,}4¯†¦’ô|*ŸÄ«.Tðj2绫G6ïjmÏ]ÍTß­‘iW³Aa_7ó…pV0×ÖÊú„ºcH9LºšµŽF ]͉W‰s5‘wd®¹Ëh,á|×wðì»F7JxxÞ%öúV£±n@’wá¢[ éaàV#Ï~ö&¥pkäÀŠîmÙjøMõrOóAw_ÀN6fdªh5YmÇ ´Sñ¬æœ#— 4Ó₳š(©‘È`kÍjríˆíx÷0« WÔɲš>£©’7‹jÿ…Óðþ…9û’åOS¢©á¤v_¥i0!v5ŒŒ¦yƒ@ɤpW©¦ò€Å#sà9 hE% û™%ƒÞŸših…Óæ©×È3/_I&7k¸0 Ç0$Ñöõ©yC ¤Ø˜›4ØÔPª;*äbßb?{j½P“òÓS£¥««E¶“§f9ÓvðԜœ©Am‹–¿ÑÔ&Ä^ú_¸;Ì&ÞÔõÂ~ð3¬¹©æ… BôÐ&jt ^ÂpᲿé€7T£5AS£úÂptÖÝ6X35}!·6ø$šN™šãÀoæTØIGi†Ëevò·_ÆÔlCà.bÓ¢^ÄÔø HCäFHN_Ö+=DU·ÌÔÖb͒€‘ñßØU–åvm\vJ¾!šÅ‚ÌZèò°ÔÌXUY5rÅEëÚø¬ú9„®€¢g:׆å&£")»×Yu ï$þ3FF¯«Èqۚ¹2/Þ0ƒÅëÖx\8¤¦–À¨"U>Õ´¡ª [*x&PZ)ö8Iê1ïüü…ñ4]•¸² :j j´›gÀ*za + PӑÚt °‡cuìQë˵V$}+Rqµ„©‚–=SYX@³JU¨Aaè’ÞX,gÝG) G$ú0HB ¬sÍ~F Ô𩅄ô2:`sP3lµ8pä…9·ò¤hÁE?5¨qyÞ#«fW:…Ԝ=f%U<о¯,÷牽Ñu“žá~×ø0öÃöhämA ØƙÜÈGŸhåN¨&·ýÝ;ÕšeÞªí7NѸ¾JÓ +ˆ†lRÂOãD¹ŒV~šN¨C8@¯›Ôtvšx‹Rê·9N¡>ݧ9–=J£iCû†C¥afÉI±¬Bj.`^{“9/ÐÀ}.žò<ö4iÊÑ8çí àñnÏÊf Ÿ¬4§›8y…ÎK‚˝—Ë1ÿþfR&$¼“È ó4ÕkÈ<Í+t)èì<4|k@Þ¡œÍ¨éÇAgÝiÐ3¶ÃŽÄ„^×p§ÑǦ¬á¤Äþl§9ýx÷†Ài§ÙtaÈMiI×ÈNóˆæD§›æ)—6îˌQ +L[éÈI=N 4'n'“õäМÀê³»0ó¬ÓðP?5(Quš×µxmhä¢HI PêCLâ4•ÐØänÈ$tˆé4± †šcbǁ!uÐ.s«±æšNŒ #rÑ¢Ól‘&çtPWK<§ÉÌâðJ2¨åã1Þm2M²ívMÅÊTþ+835Í"¶1MþVœ&òMÞéDš0%º¶mé…Æ=|xQÎç9#»s¬©i¦Ö×sÛ¼)¨7 ‚ÖF“kÁ›f–3Ô~†p¯l‚ã`Ûþy”P4x‘B\t1¢Mƒ1Î|s@­y/¥Øl‰úgJÙ4NåÒ ”½Ó¨4_âM##‰'©¸¦INö!‘Ä + ­i~iÄ8${}i¤w- +±¦¡˜µ*C¨²šf݃6ØaUw¡…‡iFl+‹ñ3ÓÈæ´öRCÐÅÇ¢4$„"MSª ±ø™ÃhšëY-jE)Ñ4JanÕxÇȀ¨ÇMc›à8Q®Ï4ðùò#5žiT¦êÞ¢¬3ù(ÁR€3͜cšF—“*Ø VÎÙL“‘7«mÛ¥W¤O?'»±*™`¦)J’Û‡áb—i¶Ì?(è|,ӜØ^ý=°–Y{wkÄüe©ê— ³´fN)0Fd„i4ÖNú‘ØtΏ¹'ó#yrÀù¢"ÓäqzUôzœò쳘š©Òš)7§+^C©á%ÙÅŒ=((hÍdM×CLƒæÁå6ìp¤z5Ÿ\œ–&±„Oüö43LcK›RAðßMM£é€j u1.”gœJ…¯AÔ:†M¨VÐJY¥høñ^">Êǐ­j I¯4 ³ì‰B$àH¦ÐtAb° ÅâGMøÃ)^4†t8Œr‘ãG¢pçgèvaÂ.͉O‡Î‡t‚#~N¿º4GfÞ)´è"š4iŏ ãÈu6Ì¥˜ø!q2†J£8‘'RT ÷Í=@>Z<Öh9Kã–j¿I‹ÿÀ–*\:³4â0´2(" ¯,͚fµúô[­8dY«vIX®3¥HhKTëi()õLMõ‡Å¯Äo› +Bj#ëx¥Ñ¿ß¤œZdE]iOMœÕ¡rS²ßqå W!tšm¥¡÷&P?¦ùØ´4QKM*(»¿#S¦'fú*+;~‡»‰¿s¼ýŒžg<¸3‚$g¢lldEf¨@Ô¬@C®R¬³¼ûèo«ËCpNip3ZÖ_«èª'mNЦ3ä0Xì2ýÁ”ìÔ‹“@&-ÁBÁ>ů’Æ•\yŠùÜíC(œ½aȧæeZ~@4 ”6*CžJ‰‰ArÎÄDa[Pý@¾¥™Œ´ÍOSQ8õÈ®ö+‚¨×“fÆR]¥OQÄøÆʼnC'ͳ¡q=)%YNšx;PMo‚ xXZ`¦Ëá +ã€J­¬]»=\»ô¬à1Œ-I¤¥Îjüu Zªólbǹ\MN×0Ž ˆ>†0?,A{e5:†Q`( ó]ÃÔY·ŽÝ,V áƖT/–5ðõôF½é«€õ/®DnŒô“òزÃïú£Æ¡ +PoZ 5ãÞ»­ê¥Ý +Fëœ34ÍGZ÷—çÙ7T•EÍ?°¾^ÉN/ÜöŸöú:ÇÁÿ©Æ9!ˆ÷#ˆ(Yú‡"OÂôU­Aá/<ñT âÒÎCÌ4’Õ áot-kÒå3±™ûÅÚHƒ³ ƒÑ» +™5Êr‡Ò(†g¸,PÕKK`þvZIl’_¶&«l¬ª&õ(éežn‘MWa͔Ðq@ô*~Ò³"<øhLWñe' 3£†¥tŠ! ‡Ïx®\Á´ÆõúÒ]9D¸ «êÜ6 +“ÉŒ•Ž>ÝÛ¤18 BJï uÄýVf–ËöÄ8Xf% +Jƒd3¬GӅð̂Q@—EÈœ‡– ®ìÄÀZÂøïEÊO"Ñ0fî¼Qá ‚òO$0­žd`(lÐûžõƒK1ÂÏPA¼œ?£À Z„OÝ×UØpË8–¶:Íâ–øPcÜÛýU‹c·³µøö—ë Ñýn+>4²^ÙDCíh–y=¼-=¨‘g^ÒXœá ÁÕg3A¬<ÚâlÐH”?CÿŽ]é],Lƒ»+“sÞÇl ‘7è­ å—àUàD€B&–Móc CB,i(dÆBҀŽ£ô^ ”½ÚØ=àWì®Ö·„ ðy© !ºà“À ÞƒKLbc§‡’Ç(ɝ<9¹½h}áWl«¿Ñs ±uxÒ1“‘pæ«gõœËUKªñæ~E##‹ìÛìV@Á¬I  œå’C=Yû&„!ñ•c÷̀í’ï …“k?ª¥aÂ2Å°‘Î}“àg\þ å +ÖàþPý]‚z2Ûp5[YIVõô+¤ÓŸaN–†¸ Çg˜ÊùFlJSgÀÆ}`5lqxöãæë‡ÔJÉ}Dgï\`4™BÙÝ=œûZ4R‰‹'³T”‘? +ÇVë[ —ºf•?åÖHâu鈹 Èåf˜¤q¯RLtÁãO`ï$ݱ²®­N:þ „†á'ÏžmǟÑCÔÅ%–DàEss†ä¬(vöyÚ|¡£Íµñ·rÚŽš­pšÂÑð¦îÉF0&þä,[_å ‡8œ4$þd,[pÓÍD’ÑFğõ|Mˆ€¦ZežZxS§ò"|*B„7ì @\y®; +™)üáÄîäœÀ¡˜Ô̅8÷¢|?Oþ8øó$Î@ˆÌëýè†*¸7~ +„Þ$ˈŽ+LàOÀԜscNuôþ8ô +ˆì\{¹î£úô_ÜFð8 +/Òý]B>Rp¶ukE)ßOZf×'&cÀ÷U,A(»u紐Àî“J:±÷Ù²rÑ©÷s" (ÅD q0E’÷ƒÜ`’l®Ë‹+ï~jIÿ¤'µûÙ-°û™ñÌËOüÿÛú8Ù~’Mr•¸÷ÑÞãÚ, q?ºí†¼ +÷³XºGL¯Àœaà~þaõ4Æ0ºÝ%‰8]¢CXv#mzªG‚/Ðn(‘ï@wIÍuýŒü7ýÄíMû$±üà©x…]ø¡Ékó^?Ž«(aE:s¦Ž’øÓÄÙÒÎù¾HÙS‡éEÊ]¬Ú[³ŸzŸ©ÃHêD²qÀ áõÃq­Pb\-SPÉ~ÞR¿Ãh¤¡ Ò}IJ,zÊay™Ú¢õ¬5Ð:ªH„å ;>Å~5ÛJ¦Åì0ºH\ŒXš’HÌãzý¨$xýÄ!(8t ʀWvý€C™ìLœ¶ëÙx¡k®ÒÒk1}4\?X +·~Xð(ë(Ä=™'[?̘û|Rj¤£iß@‰É cœ}i1¦3uŸ#²b’0 ¦(§Äì”NċO¾h< ›»cr@à3؏*Z¼ +/hìg[²áDÿ"œüâ>³à1Þ³~2šWæJÉî Òü¤Ñèn5Õ„í¨—䡖rz~hÀª$Ð}aõªjH• +hé¿: ¸yÀ–Eu¿dEéÈ®py$ö†ùÞ²”=‚¡e?뮲“V§ôWjÈùa+ƌ†MÓiÒ×p> ]ÖÞüð3XWÖkù*é,ÛW‰üéÚüà{Nl~î!P!^ehÊè`”4iîU€5ŽéÊ=..‹Rz4oÎdiˆuFF~ò»Šü€aÙÑ>°+nß õÞ®ë¶ñ69Ê恟lȏ=†Gȏ‰Œå¥÷%–).ˆDéYy²q+¶…,¬—Iúԅ*ê´-ipãGsªùÓD°`ÙøÙ¤ˆwâGy)q°…º?˜·\¼÷nÀø¬Rѳ @¹}`Qå/rñÄàY‹žAບîLSƒ ¿ÂAÀNWÀŠ=„ ¦¢L À¡ûÁ•7lGu –ñ¥øÌ‘z^ó©òµ#”qÂ1R±¿†Îw‰;¯Ìaöá‡eÓ?eé9*òÆæáG°#UW¾I‹¿¸.Âã‚C\2_œû÷!o"b†€bõµÈðƒþTč¢(5T€áççÍ:ŽWÐ\蓎4]Ìiüü’ ‹zð£EÊ<ézô~j mŠàÕz²2q1ø„œÌð™°à‡Ù¢xm.«"åae‘ÞGAÓdÅouà© •€y Ûtx +w$7¼!‚?*¾TÈЯ™àçö…×~«Úk*Mi<’ãÓþˆ Á¿OLpûT9×}Ÿl 0²Ï+°ïÓbŠ¬à˜ŒZŽÅ|ŸÁDyÄŁ²eê -yåÝ¿\ÐÞ}†ç 6™P8;û’gW&C’A½O[òÑÂìgÙ ¤÷)/ J@ÀHG'˜™ý±G×ÙFØ Æñ‹G£ð>ÞEë&á.Ls€Saûvâð©l‹ÒÚÝwŸîc•2ˆëy÷‘¹8l¤¦ÎÑî㗉û-ú$mƒ½¿Z‡Å9³9—-¤Áƒ¸}†ý8û(^E×}$ó§UÓ§[Éê÷S›Õ.ŽÜ%3Î}z Osaj„ƒžŒ÷Us®I›û³¦WB¾¸ÞOW v܇i™ϓ}ú¼ÿêáU܇Áýt†cKGÄ}´íP¯.+¿o7…ô’îSzGrÇp©í£±Gü²}š! 8;.ê9¸G—Že| ¯­îé ‘è*¿Ý‘?ì–÷>üt¼–ÞmjOá5d?$kk\1À^4JŽNÓGÂàÍÍ#Ôöq;‘ñ†éÏǺX¼f¶øÐêZ_¼Ï¬‚çÊA`û¤Dªí£Š-\æ\’pí£[ v=–Ÿi½Â삐Ítýö—²Ý^÷n¼±7 JZ˜yˆà_6ªE +ð +ý¦OÀ΁ù w¢Pi¸µû$u܉ُñf´´mA4À€pjŒhŸÿoÛþ‹/¡}˜¼…#²†z#*Ð>šÀÅc.²È>%âÂU²Éà³cJ¨ãðìCYZXF8¸Ÿx‹[¥Å«6ûè”Á¢µ|ÎHf ·Í>DŒÌ>8qjûø>”Â…Ÿ oVË>SÌëÁ1º‹k÷jo„²O¼Û‚Ïxïè¿&û4sQF£‰ïýƒ±ÏˆC´{£Â ]‹}Ø‚oi… Øg.Ü@•Íx>«ŠäWø~D²†m€Ç5ƒ}Ø(d¾Ê×EG…™¡:  pÃ~öñ“4.sB7^!ú l/@ÀBöéÃ3CõõI_À$`¯.‘5@„dèõzy}Âãu½’ +¯šï!»U4ÄUÒ¬㓸>˜Ñ¹xj‰(×ÞúP0šøÚçq\I@1Ç +ËD /<5œM}tÉ'Q\j[«-µ¶ÆîȖfeUÒw$Òúxˆ gi‚7ê£,;àà¥F¬úÐým¦å{ê¿4Ðì=½î“@Ögk¿d¬­“ú}-áçðæëcãàČ¼ŒPÔ¬Ï,(ò)M£|­C¼ú¬uáKŠHPˆAÕÛÊȬ¨Ç¤MÔÎÔÕ ”çf +L´¡¸º&¯}öþ­ƒsšåúúIi_UôwN}@½Ðpx QDêäSÖCKƒï¨* %ÏÛ¬ÿcòz7t«#ŽIQÔfÞf°jàÆiÔ(65C}˜fp^æ•àÉ#󎆆œ¦íJ`ä¢%¶‡vúˆù ‘Ö›" ™ÎîÁX­D"rpú°«pc»XëpßJæXèôûDž«¡Lcó[J *åÁf1PûùìYc¯O´ŠPAl£°')}F¡Œ[QàQÑWs´¨ÇøuŽ«®“> -L™xbíKТÔûF,ðܗn9¨+¡>GU¸þY9F7)™ïæÑg:kñ‚»ä¡O5,-$Ðù2‘Ž>Ãê:ù{}йª@Ft#ßÓG…‡çSX¼àFC}† @mž}VxÀUºÖ`M Œ™KÄ·´‹’­Tž\€>ZÎT˜jßùŠ«Ÿ\†#è¡ÏӨҍŽ8L4¤¡"§¢ujwCOQÚ÷Ӛ…¡OS¡“=Ò£ÌBŸþ,•¥„ÙØ0IB2/XNî{§mð–U¶ôQa¢.ÿOnlþùЦðpvwgʟOïHƒ³4Q–ð†A(ÅvÉçƒòăR˜ÅÈ>ðšxÌ|-¼J<ÂMã â|§v({>ŸYäښ4D€­ Ëã)¢Æ{Ð+ÁÂ{ʇçËóÿÞ;þ‹…÷×/hóŸÆ>ëKp3šÝ %ÏG->ðO䞣“C¾[¿§ÿÂN:ŒRÁ”$<Ž6ÖÔ{~å,s>ÑR¾ Ka¡ç'Sfú©äôÅFÎgX ÒP.‚—|¶ˆbɸ<>^Ø AØI2pBþM8ÏHË'pɌ‘Íg¦Tø3¸ü5Ø|þÒæpIë÷zVášÏì6`T±ŸÀª@6þG¡ác“ª Tΐ擱êVÃë'„=‹§šÞ*3ñˆ6b왏“ *3Ã$\Êžl‘F µ~4óQZ-ÊÆlÊÆ!—Ìä+˜",è¸w¼Ç\­ÝÕ,ó±¾"¹p¢9oíJ»=Ûë ×ð 1„¨>¿‡3´Þ %˜%Dì€ùÌÿ²õËgË{†;¾|ôèñ†nŠ>UKžHŽTXh]çÛåó’F¨Î rÏu¡\>Ugˆ µ«P»„ ‡®ñÿÜò‰Ã–ø0'(´&?j³~Q4”ùó¢›åÓÂaãLîï",–ÏŒ¹OÖ\HBï)Åæm÷)`ùhŠáp/ uNz(W>šáA÷m*zºœ–šïs°BÛÃwù>Ë1åSCœ +ä´Ãù ÌUÏ­cŽ÷Å!å£ ¤Ç &׿Q>t!ó‘pg@'ӈQ`Ãx <ù°CQx²…5 ÄRÂPýþØÀ‰°þ'³xó,òéúB‘Vu·oäx%@ÎäFìŠä#–*|j?šý™aÎ +!½€3Rf:‚yöZ†9E>#Þ@yO5{ ÕÙˈ7Eò©Æ2›½'ŽÛ/ùò †“ +øþøw´ÁÞﰖ¨”ÿ¸fó¡{NKü ÝñÑ{¥£ž¬´„H`[6§¨z#W]OÎÂáYs]¯mxPØõ6på¥]O4˜Ž¼³‘¬¶\yÝH.2ØA}g:ø(iXÈëÉþãÀb[A×áŒ^ï:ÖxK½ž7LUÔëü{=Œwñõ°èµ;CF_oª¡‹™ÙÄhëµ.ØëQWL Ö(äPJüë¹?ìÉ%ì¹æé¸&ØçöªŸÎW<¡?.¿Sh•¸`oƒ#f\| õ1á`ïþºù"ì9ÿ×êtéÁI‹4šy {GˆîÊ% fêã;å ”Üq•àGö|,Š%¸\’#­W,,Kì5u9˜›Ø;þeVŠ=öá›´!Ÿ÷‹ŠOkÿýFáÍO1öΡàó2öðâv½ ‰¢¥ó~A%µx?@‰Ï}“´QÁP’IŸ&± ­½ð'È8â£'J%¬¤ìa!P´xX7Iÿëð2O1Ëv ŒîÒ¯ Ü Ä‡iùÁ—`µïfeÏ?¿Ô—K0QŽôÝÍfÃː׸eÒÞ?¼×t6“^Åô@J¹ò®gJ‡wñé^òQ byOTÄÍÞï™4!4µ‡mö‚ÉÐëý‡1\½ð½ös«iêÑ;o¢ŒžÓ93|¬â/ ó ¶´Éˆbsš$vÆ¥ßÍ£9ûØÊñÙjñ3({Íf°h ,NäHãIµ¿>ÚcÓIæyû˜J¸!io·˜lø$R9Ñ]1èHp/ä¬á3^û¦îµ÷7Rõ‡RŸÒýK ‡ÝÅ©½s0o¦fõ/ýLÍͪ½¦2jµÇ¦‚µ?¡ Lð °ö–í-,xéIÒèà3äÞÂÇÖÞ,©"\{^”g㮽3³ž»QsÌúVОÀÛÛõ‰Ÿµôü¤‰Ôb{ +‘ù„˜JÆ6B{ÿˆËö¾Æ¤ÙÞŒ×þÚè¯ekÑãü0ˆm{¸¾ÇZÚ jÐ2YҊq8{6$JÀ†f +++¹=¶–{s{ç€:Մèö|¶²k=ьÖtq3Pq·÷46P[5–j¡n¯l7«ðQd ª”r ~1³–¤KnõÛóû D +«–3à^[ º’o\+²¬ V=XC{ǑÒì) +H\¸§ðˆ¼U憦–“‡v‡3&°hê>\µX½÷äÔԋ{_0‹ÅE¸¥K¬ÅçÂÑãA¶©‚Sʶ̱¿'¬åãß}í¯–wºÓWKªÕIy¯–Õ¹_3a]¹W™Ø¬Z¸ÉIÖó2à`ú¥ØïQìjAŠ 6âX¶ ÀMt yl]-{˜=7X» ²¹Zjbä²ùÌïQ9Êи7#ËRÝâøËòVKñW…”Q&ä0DÚiV†³Ó=~PDË'”míåýØûž€E±°Þéô+‰µuªª(îÜ-_ ]÷~/ïŸ_÷\K0ãøŠ|ºØ½†Â\v¯ªqg÷ž ߓƒÙ%¾çï=+l÷l‡÷M[›%¶Æäî … @PHŽàÆàx+s©ò´.„{µŒ6¨IB!ê=Z¼€ºB˜Þƒt°Í{«ŒFExO¥"ºÃ{7’&ÞÃëð€lñÞ® o¼§Ìeà߃8ú?̈́,Š{•Í'ÏUB +ØÅóžz°pÞ£f„ +5ô¥æ=BÐ{x$øá‚Ð>tç¢LïñoN`)\^udJ.»W§»Ï¹X5•co±êv`ºÞ[/8²zýqӆ÷À‘²öކ}åC—ƒªÞNH‡“™tHRDü"ҁÇE:\ž–íüìÏU%íî-ìœïÕW|zV¢­ °#>}/4$2,ÔÚwæyÏïË}ô¦ ÷ßöeB$Y™QðÑõ¾GàVÂ~¯\ÒàaØt (‚–?6ø3ó{µÁ¼»ªf0d’Ôï¿ì÷\X¤µ 7閼ë夃oþÞó“,q<҇//¦x,Ëq\ª¡·É­I¿AÂA`T Ò\…Ù_YØۈ,ÅÂ÷õ#u˜ÅO¾µ  :à q„¹Ó=ec¾€oo\â߯-ñ‚€pÐ6 o2I»Æv)Åvw0›&ZpkÅŸÚy{3ðaO芛†€pnÃéó$íA¢ˆ–!ÀÁ÷Öºò©£ ÐR{ºBòc›¡‹ "Äâ¿o1RD0ÊODòôôwih3UZ|µqÙÁ÷œ˜ðϧÜi¯šU÷LˆÉÈ/‰8ðN1îùlÅ ¹x" gDõíÙ¹Ø`â£ÁÄ¡”N2Š +ÜÔZ“áž ÂÓ X‚9*†pϛ›ìͪé*eƒ{¬3%RdO¤a÷Qàž/lr#ôNlÇ.'îùé­ÛíoO%càp¶Ð#ì&ù'èä'0ýÞÂrG™ùpÏÝZÁ@Ñò֞¡º=÷aŸÎ¸<º=8xYíÒ`Ó&›‹OÈ·aK¡v…ǝ°(R{³¶=‰?JǶG§¸ ‹ó$^~j{~þïuÚnonòžç…È@< 1¸Ôe+9*lûÚÓ;…;zt˞øÑ֞MµêDÁ¦hík½§¶G!wøO`bø¤=â[@àšyW"¬=ÜØ5蓄Ãb?±uˆW=ˆ>¸8%”¼Föe3ˆ5[ÓÒÀ- $[Ӟ0ƒFª>áÚÃXø®Ÿ:&Â(Üj ¾FÙÃ܏žà$hâ i¥'Úí1êÞȅ4¶†“ºG*Ëz— '”ÞàI®žúPŸóõìCP¦¨Bɝig"žêªÖþ&ÉكãFZ*¦¨†ÐÍm¿\è”*¿«84™ƒ'%AÙ2À̦ …Z06¡Îmu³©˜= +Aµ¬ŒÒƒ4Wd‹ºá¡Àìù¸ÐÒQ¦ ›BˆuOàZöü´÷^¹ŽªÌ)ûª;³²@˜ âMKRöGښ„^/§TU–˜f1`úؽæÉ÷ã"O@„,©Ò4®mP‹ +„`Õ@@Þ!>‰&H"ÿkB:ÍcÏ å(©‚)¬¯GiE%½Q¤°gDT*ìa7µYʪ콕dì)T}Ò/ =`HŠwÄ?s¸ûóˆÜæԓ[wžÛTE¾Al#ò=NZŸü×36!ˆØ'\ä.‡=°*tôÅZ) †=O÷ 3>u Àžº=‚ƒðGdPZ¾PHØHwÄ÷~öìÝ)ƒµ©!ᦴ¦ ìy9$z»ÑZȓQEàž/iµsϐ’yŒG"E7îUv±3=ëÎߘk¨êómDÔëÉlU?lbÞêX6 +ó­âEɁT¶úO õK\š7é@àõ„Ò1àz¿Ê]C²Çü_õ®'ôÙ`!é*(éAØOK»ø`Ka¶s=Œ¿Ð zkÀs”ë©ú„ÄéŸqvÒI/àâf\OY'.‚jQ½”$N¬ã½æú…ë!§l´Ã¦¾õL*Îõâ§[»Dœuá@FÔ¶žwBl£.ÞK¶žª¥[ÖàÝè“Ƶžºã‡J¤a7¬IµžÞé`±n‚_—KèL%y¾ï7«Ý8:¿ˆ´‡½Û¡ï¤B]—U¬²Ï­d=ePkºƒÉÆ©`Ä꿑²žx}Å^nħt¬ÇØÌÙ½œŠ±žèè‰uîY>?H+Öã(höÜfÏddÃzIJ=£DX8ñ¹VÈxæQ»¯I÷ô7ïA×4’½ X¾ 2ÂÕÓ@8/õ³ô\‘;zÔr^àûy”pkÌl¢zJ(SI*Vîš¬6AõT}=¤ì=Còhï;ÍfçzÕ#/þ¶¹ê +MK@R‘Ÿœ…ŒXݕíñÒØÂè¢àTÏ!‚9œC\"HTœ›©Íx³ëo©TÏö)¶6Ócë´=&­©€TÏüy#lR­ ž–oåpΩ‡Ür9yÜ6Þ£n:l^h[á‰è/˜zä>ûõàZ==x>¸·âwÔ ÇB×6%)y +ïüý׈äy‚\[¨0;”‚,POãâ#¢°v‰-G‰V +­•úèµ7»IzÂ(á'˃‹Îqƒ5{Ñ&ãNz–ÿE´½GË@²Ä±h +g‘‚Ë'T2Ô£µN¦çyRƒPrjUûB+¡Ý h€”UÝdµ BP>òb8¦Ç.)~Œ&½(z®#$(%ѕşž'B sÝ d㠌žÒ¿?=– Ý ¶»êxîøŸ/b7Ùéé%„:=ø_nLIœVoˑéVw€á€ú<1§GtoC,3»­‘è1’"–Û¾UqDõ»-i`clzêH'Õ¯eA}EtcX”õ‡¤<\Òm&7Xzô<2x›¸Äµ˜ ™ž.‘e[n Ýìg1à.cz å2ÛÄôt2ã&ÆSB ¥GÝÝ8øhزŽ•¥§3dcòó€~±€JÏpìâ¸Z!#lJOé”fA“3­ô‰Ò£±ÏØÛ½ +°JOZp£×®oä裶Æcu¹'=ÅMe 7äx2þ¨·9Yô,™q¦FcÏü'“aá¦4FWíƓéŠBkŸ)ҝ&DzÖ|Yþj˜p°>bÐT•é@ÂÒô ‘y½®qh‚ô bÅ~ÆÁÎ7#’öp ¨ªêѳŒ9°!òHbŒ:¡z TƒDîØ®åèé0 Ïê’äFOÃI8…-ûÄ&@E/×'çÓCqM¼4.dê€2>µ5¦GÑ´#7Èà¢EORi=ÔQ·;Z„EÏ1ðZêð.)6Òûýî¢ÈÐS*‡Mïw(b¢gqdJô Z0d:`rƔògIl'lb…ªY҈èé©?ò²=¥æ&zäþ嬼뉯=Á@^í-ó!Ùõ ¡C!k‡ò´Äê%*Øøë‹Cχ– ž÷6`¾›6ôÄü`§¹‰çw¯ý¯†Iߪ^>8pø&žýûYŒ!‡Æ€É‹BdBθ#8·3Æwœ&¡Wç&BO©V¯Álê #]€Ÿ ôü +c %BË¿sÍߌþzº ïAOì ½8èBT´(àˆïV +æ. z=pÕs¦rñÞyõrCôlçWÁ˜¿0g=/¼EWmÙWçL]`<'i3-‘ñ;ô¼Eñœuë‘Ïl‘çÚ)?aWöâ8ßG4!#­/Óíçé¦Èð ®Ê榟§”m%ÃÙäöã!ÅzŸò 2¾’B +xC'5î¢USœ +tÂHü`SÄçáp ³³X„çT "€-ä=O:U +ÕdñZÈ%­ö¨i‹J\Šò~.h46à[èyb>)̍ÆMîvžy•Oìñ«\(ÏSG.bG®]Òxž.ahÈ£S\ãõ4užAZ/ wÜ¢ïµæù5_°6™ÓêgcÍC€ÃdÖǖž‰^ižõ,9"ÍC¿¾•ùŒnhƒyJk„Û¬³ÑŸ¢y€sQ ÛXˆôáOÄj„/¢½f„Z©Í¶“y´¥Šd_îæà̓ÀmæÁ®ö³¼Nûö`Ð̸„2óÀG"ÄÃÄÏü(ž•é÷{ÏÁ½ÛP1%9Q’šÌ£óÈFº±5²ñ±zc¦›dÈ\žç“R’ €T!¢a•}J*È<ÐAT" =–,M.k„"»€ÁõJ\ÿvË1Œ0ÃqâG7yhcDšÀ¡hæ1C²QtËÙF(ס`ó¨V¥5é+)æцZ0 ÌTîˆyª¡ÎSUÙañç³ÉàîÑ݄Ê<Â@6¶îòÜ4œ+o-Çá@3´e¶^;!ÌÓÏC,$(ÔaŸ1˜g‹ÈÆ[‹uâ9˜ço‹ØTt¼(¶Ó˜=j„ññX#‹eè“Q~…˜„¤.dÀǺËcIÉÑ2úHQ<_µò#°ËÓM£àÕíÂqŒV‡.Ï0ªMbϬXˎþ¶±<òxö>šÜ•ˆË③n¸íy +py '1hO½å1R,Å$Ð!8ƒ§;îµ ŒØS ÖÉ r•Gï0eyŸAh{Õscy’Ž€1xßqםkpz½î5¥> }å 3îXñö£Næp­6(àOÿ(&ɬþan›{‰ ‹»Ugt 2)·‹°Ë}/rÉ#±U'ŦÄO\ +ZòäÀ[PI,Kéâž3r<©Ûß |9UÇË7 ñLFj•îÏL¹þ¨Ž3q€—2Æ=rSu²»Ï0L¨ˆPòTŠz|Ûp@ ä"ªÎŽ‡Š©x3É£Y1€’ ”ä™?Õ)ž¼£4®Û ‰½– €h üWÂC cÑ ‰ÖÝÔù5@—"°‘ïxDVþ4à‚çùƥζbðr¨ßéö%Öÿ&¹úñl{ (ð +•ß1¢ÞƆ ¬ñkJ:R'”4'xâéë¦[q¥ˆ&?5 n¤a£mgÿÛµé ¼ÔL +FhŒ}E—Gîµ-(üônòӀaè!¨§ï¼zñià<ÎZӎ§–YÞ<Dƒr°‰&2~)e]ß­äv©#ç­ã©d¾ÐTLpç™Ñ‚‚P"<–Ž§9&€‚Kácƒ†¹°âC¤6èbBå¼Åú@ j¡IÓy}§ˆ4àÖlp׎˜Ç#@ÿ1©Ò!†q@£ñù´ 8Ñ )á¡Ù.à-Å`@ucn-îàÙ¡ÙÓ ×¡ðýbäØ(¾ñe볐ad3ƌԏTOè…$O,"‰Aáý CSöçÐ0 n<;H4ÿm LaȾapdãaJLÂÈudžvØxÄôݍŸ“·ÒŸa§—2-„59ü#Sí^ˈ¹Ñüˆ‹1ž]ªfM +ÏØAmbPøž°YŠé74¸8ó02>e>¬eÆÚÐT‚mh¬6jlh‡R卾«¡qr ŠLÞ­É퍏2èî–7"ϊ2ÏþЃËÂÇàilkÁ³  'd=E¼@…Iqe@«<»Ú„~ùóYp2Ð&’´h»æ×B?v2®ê Õç +Æ#äÆ.ƒÌŌy¾Ø$ÊÎ<˜›AÔx°£~ñà\(¸>p˜L(f1öì?äل‹')W ó:«ÞKü§ñƀÜÿ#+4N ç [<Ê ¹í؁ªNÞrÌÏÄÇvx0iCï‹p<|´xì4D4L :ÖNñ·cQpÛI&K[b%†‰¶']@îêèÒ×TGU¥T>Ÿž8UA_æÎvðþgó…d\PmÖC|¦Y§r²A¥á™Ð·}#@ã8›Ø,â+úÄ7PŸ¬~¯ „£3E”ŸèM£º÷Á¯âÀg•š‡^ÚyeDøî(®Bå…'èÒ§Ëԍ1(O€ ˤàÉ;~AÎ÷™-<›µá¼íä´ñ‹¾—!é Øy@dÄ+RC +OV5#O&ÛÄ <‘*ˆpá¨ÆU +Ï4•šùføà=ᑴx8O¤ñ±R7^™¹ÄsJx¾ù4þhõÞïª>ˆ‚/@wIûò!á! p­ žåÚ|%¶{…<Å2AÈ8vz†Bi?x®v8

æ˜ëŸRÃï@üôåÖ½³ eÉC(ò‡5xD)\Ÿ!H` +¬~ˆ×Î æ @ɹJPOF&õ׫õ¨žŠÀèʒ×1×6Ăý\‘(]´ð@ž‹Èß-àáŒJ“”8C3}Y?òÞåS©öXjäl[Ìz©­ ¥$=Ó|›Ìí¶N·{óôIoÒ‘jñ!#{lé\©«räî8¢m쇗*çH;º€§ÝU –6t¹™ö2kv,Ä1w¶] wÄ#ƒ›Õ,žOž¦ã_Îmã_ƨ ƒ¡ï¤x ®™N‘¥2‚W‹r|'m¿‘õIUZý›«‘áž 7‘œöª ƒbäþÐnÒ~qX”@öŽênŽˆÎÁõˆ ¼G«ætÂíÅP%;ÖdR5Èâ!ÊôâmâÑÉH ‹I-%ÞYÆdª¡ïq¯[ܱWë>ÎÄEr>äÜÛu½t®Q`”¹ªúÔל¢ø€üìÜùíY4ã¾J¥¥1IΐkéÇÇ®òýÂ÷H@¬«˜a•ý#Í0O_UÎ4—u‰§²×\¯”x±2¦bdùŸl ÜÐÅü@ëhQ*`¥¯^,[¶š>Ä|ò:A¥«‹­‹Œ°ÅL=*ðZ +O'[hNI­¯å‰>¶ž±TÓèµr@–hž–‰3N ±T´­ÉAÐ×´7a?šåëvHuaГÝ茞R¨keÂ._b¢8Í͵ìÑü +·E<É,q-"¨:mþù¿kyŸOGm±«ŠêRÎçØo§g(Ñm6 ˜~0¨¦ÇŸóÇ»sòDí÷¦Å±WÎqp±œØ"õñDÖ²?R3dºsÀÈb Aš›¿Ä5Ð7ÅX^{è+.è¸)lò#É~ÜE¢¿àH‰,Ž_+LÉCdzOÄc éé¢7f Á€®¾’X¤<>nÜ]&>¼ò¥;â¡&|X”ä›x±Š¾˜/ 1ËaÆqVˆT™6UyҌ< }‘qÞm,ÐJ*ì×%½9é¯jŒ÷tôì¾ DsêƤ÷ÿv»-FuÞ¼ô—FB¡NA +ª3 0ûW‰µ•µáëì/¥ùæî1C÷øìè‹"øä/P©»DД|Öø¼P¯köGîÌÈ5žÍi#CÄçØ㬠Oq…v28€ðÕ²×äÛ#­1YЅAÄ6TÀzšµO»Ù€_Ö@kƛ)™ö@Úm³h>¦ÁA˜×çg© +þåÂɄ[ÁYVQʛ«d]£]”™ççM Ëz„ò¯ÁÛ%ðÓ5µ]ê:WsÚ¤½|'¡Â÷AKôq YÓ u®‚t×8Ð7N9.ߋؚíê0…‰MõI)mÎdz´º 8¸&ðí×@`Êu¾Tàèߨ+—_sgé0e¼È¶ú)!‡Ùo¨+Ø,j,¢ºÉæ”ôåtÏO²èªbç s™Òዹ!Úke¿ìp¼çÖ_ÊB#úmt!µQÀԃŠSjfSJ9ˆSçrÉP…ÎBa­hêÙ;{тßG¦Á&g"=Rv ì ŸIÌÌÍo%fw¯(p©ì‡ð]Sfú‘p À(«DW,û2…ôàîk¤²†æ‘eLç0ýÉ`« M½”¥”/-…‚€>êɘªtÀÛ(&µ·r [-]R‹~¶Ã^”a¤ßõ¦<ë¨ÍwäÝüò-SÐd: +QÄá„ñ©P”ÝZ^) +v­ù¡LÊÆU£ª{æŠMº±°|`góå!™õ§¦g€Ö;Z–3f°Á‚ÑQ±UûÏǺ6ùKþ1­ÒÀ€¬•eG‰SäÆ&û ôÕb?(vQY×ï>«À ½1;ê“õàþšŠ¸š9?4ê­f ŽõëÎ)k›Å)³ÀêùòP8Å~õ]ú¥'Ÿ‰,Ÿ2b^0àPdtVÊ[”0†Ò R“kD¢S…ÞÄ¡4—ïNƒùL¾fL¨=9JÏÁðÛ߬&›Þj5AÈ£R2â³Ý8MÎ;sädbŽèÓpZT-kÄD4œ™¬­©Éu]ã(øLÉï*Y³Ç25¥b¹´oÀmÄí•BՓÈ܊¡Å]U$îD¿çùIŠ r‹S¸Éá‚iP–Wï)ÆÒ6TÆYhx~ Q_ðô}]›’Ü—²\Ü:ñÂ}Ò߀z +êÎÎ6ªÀÇÊat>›>2-é&æHß&‹ÎF/À|GªòÐnÿҙA&Ö@vB„vRU>õn‘3,;&Ò©÷B+þ"Nä˜Qì„Ô‘>E×ö#XGáf°7å +ôRË6Rv ݤ +îhž£FÂÉ䋐ÏÕM"º6¸ Éþ8øV‰“5I^íê¦ËŽåM›5¦¹‘õYì§0kºô(1)š­`Šÿ:JYsW螊wuÙOAL†žkÇ)t…*‘å“׶TkòÈQ²P:Ù¾†:ó ÄƓ@Ì÷”r)ɾµÈ…îˆ=T<½mÆÂÒq[iؤã›à7°OP¢¹iJ¿$“^@4 D/76’F™Ý_ڂ5Éú6–Ä!ÃÙ'+²¬6(ŽÆI;IîœÈqˆ©Wí½â-›œIV„$À ‘§h¿“^4®ìn3~ KSҙÃ1 3rH7Í06^ñ:>1›ã¢nïåã®EEFÄ(éDa÷(F1O:'³„Uü˜"_„KcøÂÀ+(t¼gyM`„?\¡£?³¡:àå`±Ô¹ójÃþ•Ó 4>&}ÚhPÜ•OÏÑ?t?ÏÞ|wòÃáümL\½Ð§ÈW¹p `^¡«AP‰‘qJ™»ï¯¢¯°ÜŠ+lԟ[ÙN0÷¥0)=§Rân%Pg»eë™×Íp›(yàE¯u_ËS1 é-K¿êKÕ°þë}‰K«V-A*Ûxëñ¼›¥ÙŒ"uðz\cª¬ºÅ³qÙ+] Œ+Áè£%=šMfé˜o‚@,µ9Í֝v¸ZÄJ_cÒSU5yexMtMRˆÇ3Ç"O =°™2CÑ$\‰›û+kXXńì‚e±ô+ÚxOîk^qcj[¤I:~EÔÒBq2i^F–ÔÎYÛî‘K£Â¹Sc7ÈLsS£Iüà€$nǓË–5ÑvQHlkªtæBeN¹]۔àIi#?ø¯[miøF:3[¯}N§‡á-(5¬&†=h'³ÀG»®º¹=Qµ%ǏÚ[µ—2@~!)‹%ûœbîjp%ÏËb ޖ.:üjÀ~Bäd‘ûxÊ +^öu¤TCêØyIçTNk±ÁT‹‡†q?Ågp8âNŒôw+ÍOS±§ +›‡ö^5£YnHeqƒýuáBáÈqQU¡·vS¤I2ºd1+y. ƒoW.s ŸÖ`ÛûA˜3©nA2 E»ç®´|4Ýæ9w"õc‘'|/‰ §Òíˆý*›/,&߇í2y!ÄÈÓbáxA›§-«‡ñm¾¸ãYY– )«2´Æ²‹=m·,z §¡>[j"”b¬è ½‡ÝIž~·xXaÉIÀ³W døÌ׃{>ýÂS #ÿÀ7eLÅ̾‡íëŒöÏ/[Åâðºoj[l˹€Q ¨‘šÐtPªôN·ï[Tö³­a® |jqn챋ÿ}>žSÄWYDgõ¬ïæ \ŽÉWè7¼l-"jTôÁ)iVù]C2£„…Âæ!­ÐB‚>oÂCÒàTº9`åÃ<ßp.™ÒðÏ.Jg‚Ï}7P&ª^ÜA Ä>MÅã™Y-8ÐâcJØõe"~ƒ1</†1³©|QÑCü«OãÑZáZ§SbMÙ(-}撑ál=ø¼¸èØC:ô#àgK½¦UÆi‹¶ôŒÅ–àsA|Ü¢5–Ÿ£”XFWY¶IèµÑa¯J–W›ÐÈ'ý:PÂn•­0ï.Çô­ É"Ãèí¯¹øٔ€«hÍ^hl3Òöœ—”rf„ŠÏ2þ¦Ã5%²XÀ‚aÇpáKˆµ§P"""2ÓDÊ7bØTUeÔª(Êr,w˜€ƒ†UŽ¤ý©,I‹› +ѽl…ۍâ‰7SðÇñ2<…þw®ÜúL&G«ŽTƒxI_‘þi`nY¦"›xjW€ýJ’Ñɇ\¨àY"äêäkXUÃƾ¦Ý/!«¦·,eo1„ÉBéd;>tŒ¥-¼"œjÁfô±ƒ1ÆHÁðiq]éüåA©Â߬+–àEª° ÀӞóãÐ}gxPT¡$}\Ütªß¬èÂ'•I¥¤ågG°GÃÂn)Éy¦x¾rE3ÑRçAŒÊØü@$°qÓÄޟ¾ºq6­=“”>7FìWV§Ì¢N2g£w‰\•´Ê†‡°á¦h~þÀnðH§ƒè/:LÊÒ_glÌÄ·¿»‰ŠËĖÞì,QÁÊÆ —À”Þᕯ²Ë^C§'Փ&¶’ }›,|žè¶+þdãtÄ<®ÐîÃfœê—%s'/vÛa”˜|¸ûE‘ÓÌ$/«ä"Ló… \&¹M?²°ÕظÙ žNwøðÀ +£ÙËg…¼8 ‹ýèFfHâ¤`ÓÒew•M9ãCt¹r1Yô;;³æÁN¦Òܲ¯Š#ýRýÚÍü:æ=Çݱ†…šHE°Ó?¤ÊR~›¥ÚÅ_Öý°×T LG²x½v‡?èX-ÀýÐÄZ!¸?•˜ÐñÔiύfX<üSàòCäJ¼7àc凯ÕlۘÙuý0zˆ{ ôïš^Iv¸,]g­™ŠñC4R|õïæÏI§ÊS×ʒI@HXدC"™ªN * A>-f$Ñ°~xL¨öäf£¼»÷Ã6:BW-DÀ“ÿ‡;×ö„µÕ~ˆâÕÝc:!™õ‡Ác1Yrî܈Jœªúˆ‘øx6C0ëèhÞÅÐ@ø£÷É°D˜ygóü!¦É’‚{$­Ê :5gääC}»4í|õWèúÀ&ÿCÏì"F +æ„jìCtßؼ¨SS’£×Ñ5±=¥  Wæ1:ªñ1£D*éobèëÃöYŽ‰C¿|.è>³¶§wºSÚ¥ÄÝÞ¦û02Ç-àð¦‰ßN̨µIw¸!îKÝ©ád.Ž·Җ Ã>徍‹¤ƒÊô8­¸$_A§¹°Üœâ^iS2ßÌ4n4ïRÇãñ’±nä ç3Д™*‘Ò6fؔ#ðEìædåÖYÊ¢6-——[Ø/X[†(ëßD;J:˜ÉÑsb¯}Ö¿Ôò®ew‘õÊ¿\ÈuOaƖ£hKN˜¶À躱&«ôAê¥BÛhÂ.¸ÏÈ0Ipк18 <:­•/QAϦ(ß5Õ2( I+˜SÜqß¼™ÝðÉú²ÖD!¹àùˆ¦¬Ž@<öݖ$Výá:RãðJh ˜WencS#ãz£xÇèÀ¡*<÷º`Ø9…G7ûÜgNO63(à˜©ãCop 3Ôôè΢âz"eÂÆê†ÁÂI)»i‘lU¥­4À[½™ì°Â(O]¤y|3etñDl +£)>ÔFj¾t^œïû›¯ˆs02KúÝ5r(.ØaÒëõeÔdB#㺳i4@F½‡›PÇ/ë–TV<Ì;Ö)ÙØâʜ[gåM†½•óހ¤æÀu)´QÀzª\~dïm±·wíXqdxêñp ;4$‘VË+hÙãÚAei2Ô0­Ž;—Œ}8rŽú‹ÚrŠ“rnsqÙuhD $vn ;Ñz J’’¢TTÑÖ!,ëU)# +€mÖ{ Fª“.š·~ë%iúæ3“À }jz©VÊGŸ•‚aŒšQ·9¶ï™nbDz‘ëáD¬j:ÀÚiuÌ@Õ}¡½‘KE¡àa‘-{ډöuƒ+•é@ÿ‰§0µŠ):-Í> +>`T 0ÙÊ0§Š÷ˆOH˕›q²é.ÊAŽ*i“G‰ü~n »ÝÝ=!³>›ÿJnîþhÒüª¬–X) 敤µøú»Ç ê>Ð5ýÛ+!ßN´€uÅ7œ#/ ¦Ä²kvÂ:\M¨µ1]ÏP,@g2šw›DlpÞËÁ‘²×Ãð<¹hË4ށ$Ð%z‡ê½ a›€Ú¢¡$…-h°›rÊ®;ŸºçšÊy#<¢­ÎZt#S¯o9ãlUbiÅ6ÞIú ×4Ã,òè/!²‰fµh5po ó MSXQ܍ÂÉÈÉwàò½W©=Im® +OTºÂK jjƒzõó"¾LŽþ«ï÷Bç+ÈÀËÑ;^_rv$t$éÆ°,BÅžãvÌ2tͫ硇Q¦á˜OÄ(–6Â+w£yYã°|ï…í¼è46ô ¶ŸH/Ȩ¤¾ÊˆÑÀ¼Ë>Mlj·ØÓJ,FñœÑƒ•»9ÑQJx¸N*f…G*Rš76˜×6ã}Ò%( +F¸h.×ê‘~ )}'¸@E4HD”ט˜{!j m—n»Ë¯È@uÂ>¸»(ø*Š•Ï›vJ J1Pwó’ÆwšÄm-¥Üÿù%‘Ž9„ðͅ*áTXj[ʬ&7i²ëQ"J¶hZ¿åç@檧¤+562A°1T'¨5a¯˜³½zQçÄàD‰ìÃÄwMR¬“§3[m²¸ÕZ÷iKËÜó²É÷±bû1â¥xøœÎÅCb±|º£X,µvð;gvNC{o¢¢Ì󕚬q¼…åø…Ÿ-[eº ¡ÄêÛðàèy ¯Òäç1t¡çñ´^ñ¢&Ìù®as!’YÇá ¶¢¨D ¨ÜñÐjØHéâ|bÝÁôhhØR$mƒd­›6€}-á$=MÇA}MàyÝûGô¤ÉJWô "I9•ˆ´ˆ¢Oüÿ«¾HɁCFÊå ñí)™±ã n’R\N¾ Ù=æ2&GîÂZn£<`¼VèLÙ­øMm‚xíÐs&,7:!Ü¥s žA)êÐ{¤C!u·hI°Á!8M ˜“Ð(h¹kzã=ܓsJ#2ã©A kג¦z´êôƒûîâ¬\\‘Ô4 ѤŨa‹¹“RéëàйlY™$¿nÅCš¼Í2#C Ø¸×ˆê¯ÛŒ¬ÄÙD,ä$«õÊ UD6žmúb=`>\P˜£LþhqþPE%×"Rþ»ývt#ÿ@º†V†.ÿ-¡ ü¹mØT¹ë"ŒÐ /p…¢ƒ ϙÍ)x’:æÆ\Ñ7vƒhoi:¶ï•*Ê1Z‡¤CFc ÎË|½s')÷%ã]Ú§Îŀ–¿éNc¼Tþ+ñu#Euèòš~‰HVäÿC6á`Øù%—!í&ËÆä· F¤VQÇ¥^ºJĆâ}~í¯c§šKè¯hNTÉÈ=ðƒw¯}”þ ýädËa¤ê(3,Y°Tżc–Ÿa\3çΪBÒ*ÿ¯]{•±7Ë  «"•È7Þí«o„eÜzR¾9ï0áÅí@'‹Þ¿Ñ*¾^(Â)€ ¶9RÔZcÝ·3ÉÁ¢”:½E<Žu³è úscBÈïôÕ6<3oJ¥G½Àwe‹âHâÝ;Ò×1=n¡áTX‡hbd°âà¸Jªh%ðpÙÈÂhá¾È0.*›Ä¾Ð,ÒOéGƒ; ¥‘+ÉêR[¶´öS[×Òµe¯úÚ=ÞLzòh¢”/­§µms‹ÛüdØFLXÉ< „!™ÐWzt £KÞNf¢o…ÙóÓÝ»›ßñê¸8(»em%Ê1'„º@šj‹y©ƒµ6¡…ÕÃDTâ X ·ì>˜†¦œ÷*Ï2Ðp(Ç0üBŠ‘bzj¹ÁÁ]ô´ƒR©ýdÀˆ€ ÚS=0}ÄH€ @3( +RçoË^õwqé®4*O²DîñqD.¤ú¥¯)µ¦Ê9ž.§›~4/$äîTd“Þjìö°àÐ 7LðZ{PR‘ÐPD»¶›OЄ`!ç…ÖÒò0´-(?rü¬\¢ÿ9‘p!r\‰úFœ\r!Ù;©”IX¨''ŽþWõ6¥ˆ<=àþô÷%ÇmùÃ<Ž‹_˜@ì +Ñsëèb3«G)æá9€ó miƒœa^­/ãô+¼hl]˜¢¬PYwÄ9îé}ݰȝÈûô“#Óüç9‰†¿à¡Ž-ëæåÝÓ<Ï·^BTšjü»©D«|SÃ/M™ÓÛª†¦"Ë崁;¨e\§£òÄýGíY2"Ôe¶åÑ]0d½âXÄàH¨³¿³¿ +¸Üt’{…Îú07 +ŒÀ _²ù/ƒÆ»°£7 Âž=ˆ‚µÙô)¨;0V(Žr™HE‹Y“ì,B:]ÒÜýa~ùùEàE‹DÛ·@'gE{l¶P”-ª/£‚­³^ó¯™Z¼åjNbTNªâ´7Ôª )ÕÓØOJô×GÀzX2š,ÿ°ù8 Åш“µ[Ç!xU-ÌÔ¢Ô,OKzd`îԄ—ÁmæoÌE™‰o@:•Ãà姶î¾ô†Šž{F´òrgÒÌÁ¢qV‰˜Õ +bQñgvß-ïÞ?¿cÇ«W€;v`&¶@ƒ]0ŽX§yÈ¢1°7?ýIêy»8^_b99Ký®$9™Ó®+UHñX\ku<$Æ5ÏZÜE{0P\…ÍŠ‹&дËlúœÕ™P sHpÏøÎ6qú€Ö;»3ˆ«ˆšÕ9eÛg³!wØjIT˜Vçm2—© ó€Eù2»ºÝ$ÿ\ßlႎ͜0‚º3ÅåD¬¦ÿٙÌj!m„i;uH ÷kÓÏÅAw…ŒC‘ß´nŸþ™¨É ™Ï©òœ} Ý÷ð¢Fñáâ(¨"tœ³â%ïRÀ6zåpöV14lR$ÝHÇÍ ò¬—ð¸ãc|!JÁUò«t©Ü÷å"u¶-YȔêÁʲBàd`tã>*æˆ.ÈÒcÂV‰¤;»h^½—a$]FS1o(­¥´ZwLMã¤8 +Nž˜Dóß\îð +NX$8Í0¨â©#~¤VðÑäíïþöÊUu< ³ö(.AåË|Ò409ó×êf°91§Ì .o²~Õ×ó4RÆ©¶k îÔj&<éX$Iáå5smöB<Ê=F |º¨ókwÍ+Yâ~G—ÆW®8 ·“çïò¦ç#“¸ ÇeÞÍ¡FÃ4²õ÷€“·¼² HÃîB¾NNiwjáÂCÿ@©¨Á‚o¼V>ÉýŒÅРѣ­Ë•KÙîU0¿Ã³g϶þa{EòfÙNY¾XòÔ8fìٞ@M"ƒë¥ æ(0õ³VãMz\Àø)Cq•|ÚQämAz¢BÍ;LEôvoQwó‹Î´i$¸k‘s^Ǎßó‘\%ź–MÒLZf[Àcÿ«ÇÊ_’t©DRÄ*zXÏû[¥*ȚG`Èbv,©çé-1Â(çRbœ:¶ÆxV¯ƒu£VàN/)Y€Jï¨V 2كº!EÊBVxħcíÕþˆå‡Ëõ‡œ4RGá%Ñü öóÝÿ'¼QñÃtR^Ũ?å ãõ°b©7Q&ž!td•‚«˜Ó9{œÞÐZ¡Ef©”«Ì¡G!heõ¢ÐE®êVj6`Ýߤûté­/ üŽ÷‡¦ÿFuò_+ÀWÇqºþöþ­Â}ÅKþh  ÌL_™µ!(‰«ÄŸNlà‘²Ψv¬Ã¼Ð˜óŸM<ò‚µ,Ä Z?«a&º¸V~ĞÕ:$Q™zÑΆþñ•ÀîožœÛT +lëN"Ïééސ.CŸÚÉ:0ç&áº1/ò¾˜¥¾6\†­¹OY0ÓÈõ²FtO'¨Ú» ~ g9¹)…Äçü²Ò­œ 8 ¤3`sDr,Ì +,Z…÷ñå("'nª’m­¤O3çŠè«c~Â›ôG‘aår¦m+ÿ_‘H“·QšŒ†H¬ðÛîb…1¾Ñ´…üPŒ‡\/¸¡lžágï¬{LÊ̓Gkã싿iäpÉÉÉL³%ð)Û9£ûjÐVà¢{‒¦1"ºB‹r Åü_Y¿I™‰“s=;•o?Ÿ¯Ç,E܎,v¯’÷•®zŽ" Y0q›“&?ONóJæ¦7‘›Z³¬šÜs"›0ýEBîs:˜óhŀµÊCxW“ápOϜû±â +@³óÖŒA‘3ª¢ÇÉwÂ+` i¨¦Î"Fzì®CB½¸+a ©ërU®·¤W'd tJëÿ‰é˜j‘Ø“ôE¿^}ü<˒Â²è ä§D»J¿(ÓÈ}´×j‹¦QfJ´g˶íaI´áb­dy¿ê<˜ƒ£ˆüý¼Ú•f6:UíÕ1&lӔÕÿÓ®Á²fƊ‘됓ÎìT'A™Ý n\)‹9N¢*a- +L콡l(þà,"Ê­ž='0¡@Q0tV³O¾ºî&ˆH²oݸžÒë3\SQvµŠÍ–=TJ9BYÇ|#Åìg­FžoËç ,©G­“;Fð•9¤î§>ªÚMC­A$ à€¡ÌØ +8¦Ä›ƒ$è6““0€±SU^ŽØ6Ÿ³IM¬>Š‘˜·Ÿ÷·Ò~~¯>&8ž¾Ä­4Æ)€9×ç/§‰q h³ƒ’o§KÍß<ĵDI䣠>r¾Ói0‹²øK–ŸžÄ p°ˆâ„&Q0Y‡ÉMԃ4`c=ž1:ßÁ-nc‘  ”Êÿ' ¤9XR—ãÊ7±|*l>QÙg–‰H¢„Ì25ÅÇÇ ©³±ä©QózϦYÇ´ Þ¢ê« +8ašýÈC}œËN]¸jìƒ ê™¦dò†]§®GT 2**øìOep6ûÆH¼ÿ*â$Ào•þôßÚ\ªj³ZäQgè!]X6Õh„¤²¬~Yq&0@͵dëIfš¾HJ Q\Ouƒª%"#‹Y‡ãyWúk‰SEMÌA›°\&ˆNZ¿g¦ƒD§''g, 6áÉæb’A‚¶Ý#U_ÖÜÔºYã~†‰fšø#§Ï4‘¬gÜdáX°ÅP¿32g¯:¯ºPˆ(Ûm=8*ùH’àÊs¿RÓMÃ3Àdٓ’ñ€­Ç1{žXH`#€§×—ßÃÁširzúÚCeÃP^Á^8P«/{XÈ5ã,[ŠéÃQ{ÅD¢*lpÿŽz@¬¥Ó.@⠈“\毬ξ޼‘$+ð'«Ù±ÀçՋçTÙÝv_zû`0ç|nh­A¥. å.»Óxi¤ % +0™`ªL’ÄG³Þ‡EðKw„šYP„sdiÆ›ÉTê¤#ŨæÒt°/®çǒòC -B&5fb¶Ëã ÏG…R7¼UÈÿ+ýÏI…Í(º;z®‡²éa \"Ì•³ ∢›O|a€žÎ•íK6ʓùˆ¤ªü(¢~¢oY¡Ô +péÈkqʪí֖--]¬Áh8ü2° w'ì{òÛ*ƒ§¥Ù¨QaWܪ›¿"¹É:@ì…G¦`…ÉWÉ±Pî[¥ÎSÃéê$6ŠI,ç1p—õèz€Cp}Ð܉‡#P%PQÖ$áUö¨2i{6w@J#yØôXóÊ.Fwƒäç8¡îÎÁSö‰J.kåƒ2î)Ù E_ÿ $G>Ñ(¼Xk ù&l9%®[‹ío ½š$nnÙ(¸õ­ D×my *Ǹ¹Ô–@PK›[£- ¥¨…Š@ŒìÊmX  ‚ ‘Jç¥pšª’v¦”,å¢T…Ä×Ðf4‰?_rm3M’“d£dT¢dŠ¨‚(ˆDBV‘ô X2ÚÍÌÎò§ý'Ï ¦…ÃNÓV¬cçØ?îXq×ۑg—®c±ZwþDdÉMš ™®™Ñø¿¿¸I†¢‰¢·íMf2Ƀ¨=Š"oª¶aÕLfc0:ÅYÀ#;2‘P˜LvD˜G&s…F+£Ãm‹U¬SU±ª|Ä"Ç*¤jc)ŽfÇ#k‚k.;‹6p¦Í‰”ˆ¨E ²eLÏ,IV˜QÒhT"R’rHrH’È"Y³¥¥I‹MˆÉ‘‚C Dd! +·#’9’ŠéÏ"c…ªÚÙaçË~ëHTT*Q"Õ^ ÚH;¯ IÌ(6ž¸Á¹0l@óÝ)ì«\­îmA0Ip¤¤êëØÄ(p'äw"B$$;Ô'bŽÐˆ‰G¬À®•Ø4ðĈ/>óÙ'çC ÅÌ&þ—1ÅÅg;“%^pûl1›™Ü\ÌH,œØ°ÀÝÝ_ЙùܘoŸ9AÕo{·þ¾n"ú´tWݳ×:¨:Aïû¾ëön{úý½Ôä\9ßí»wßßÚï_ìZï +ç@þùÁßÿíÿ¾o·ßîV+´Ü*±V«eÕ¨}«Õ°Ö€AbÛ´‰L¶Ã ”Ë®‚Á|â>JÆ´"{.[灳Õù,÷m-»•Uh™ÉK$<Œç3ˆ\ ѕ)s.è|ºòÌàjଢ଼xdtW2rJIˆ#1‡ÅLLÄ"""&""r™òHÃLq„AÈ §ßnՆÁ…r(­Œ@€àÁ |þ0 h (èœ!€'à~Óøÿ¹ß㷙wFþðxlîNRÈ»ût€è<ôÓÌh6ûéÃûðx¼òddö2‘µ©|š-iFU±¢H’UÚ,̬a'íŒówÞ ÷éÖ%öŽ÷ãyö]zzÑY%-Mÿöñ™GþŠ¨Ü¾þÉ.óï¾ET­ýT*™…ýì\r'aòéG?‘UQ¸ôTUõIwê¯Þ‹U§š×6# +¿ÕÃýÿ|æÚK‡¤ë@¦ñ¨Ä{n㐠9$ +ƒ½‹ìv B8ZrN¤K$)É)C@„R;c.¿XÚš}«¢ÐN¹˜[Œ¬Kg§.DoÌÎàKMÊNYœUdgRÁ•Þ·“Æάr :‡î v†Å³Ðrz…©å¦ƒLp¾ÀÎý—:C†|øùŒäuv‡µæt¤¦U…{Œ„ë ¹V[óÙ°­3“yŽ1¼@ZgÂàKM +p½‘uf†ávÈxsÃ:UšWòBruÚ$Jz `PduJç +Vd+¸˜ ǚó͹Öq ̓ý%ŽûñÐFòAt¬é ¿1 ±–ÎTù¿² 霦 +ºJÌPH§…úµ~'E}tJaêٍ‹E3@§ÚrɃêçü•ýõîÏéíŒQã:õœ•^#2C´Ï)Wž¸A¢ÌØ9•Û€¨÷Î gÎ ®A7åœÍFAÍÞЁsªý¦©ËnNe¾Üô˜¶lNÍѲü•%՜Æm]H˜ZhÎÑÀà͜#<5káÝ°Ù¼œ¬¨Ã—Sô³Ç¥–3‚¦Žì–3DL+׊&`‡:+g•×ÖT¾[­.‹Êys؍Ý7)§õ.á}A(gÙ î‹R'§î ¿²õB8ès"°ðr™œ•$Ë Í»SÉYLa¨ŸéUè5‘œÎ î#o(Œœ±±,‡â*%ræ¼NÖØ`ÕçqJÐbÞ¹J`ò´¢½™A/@{¾LÇù(áJìºÞ¿g˜Þw6ÎP<’¼Ç4ÎäO—^¸“2άTœÆé[.N°›´šð¢”²8=üÄ`ËÈTqú÷ì„(ÎãÑù@G7j5q~¡ú‘85Ë2w>þˆ8o¨®g‘‚8C¢­n@/‡=œýÈDÔÑëþŒü ÊáüQ\ɇÄ!I:ãN>…kûMÜÍ&º[Ö´›øºb7Uq7ǹкޤ5ÛqLS7›h‰Ï¢¼J75'NŽGcÝ ^U`J)HñÊÙ¹Iœ\¶…p:Ò3‡órñ€Ü‰ÀwñÕ*ÛeÃÐ4_ÖmfpKP¥ÍÃmƙÛ&ã: )D$Ú¦áK¶iá]d°Í¸‚õ‚õåڌb$t¢é"n²6ƒWHŒªÍ(uµ}^\ö®-¥'ˆ·B€”ë Á³ñ]vz·~5›š;4f³Þ>i ¼Ò*vÊf1}²žúW¼`™ÇÊøf6šÈ.—ï®Ã|sƒæóĦ9TÃfÎ3|Ê×4›ü§º¤×¬.诉9ƒºf0vÍi&EØ|ZãG¤kê lÊ5›C’v\³Å¯ã/k…ÔâÖÄ-`lMŸÂ»AC]­ E҃ÀÊT±—¢5å<3Œ*™5cr¥L&kjÐTk¾" +Á¬ ÖÜ éU‰BêÕTGáf¸ÁWÓ=ê[­¦>„êÆÓô‚Õ|²¦US¼<À¯¤Ÿ_©¦_ð”áµB5=ÔË©©h;™š=ٙFB”šÝãkCjj¡¦Q³›,&îÕºDÍM5Ý3g…šÚ”€šµ¢à{îˆb}š0! F$:<Íï̼ªÓ4`+Öaëñ(?œf®è¸„Yb°Mó) þŽlšfÆCl˜H§ãݕi†«Î± aš±™Ó]š6´sY‡‘fi"ˆÉëx‡äÓñH©4Þ<”fß26_wƒ”ü’%5ÇOÒԒ˜X¤Ÿ8²ñƒ4‹ißNqç<š5]RßÜÎ9šš:vëj¯î„ Éèνיˆé†­Ã‰êy5À"4ÅPT šÎê“Oä4Ûw HLjšû˜(Ùènš%A4†–ú3£Ùƒª×¡üÌîֈ° õ™JË- +šëxLܙ¸`$>Ó¹¬«=S‹È虑1ÆÊ3ÅÕ ßH³ÝÖ\SaÊ1«73jypfiÊ mš>Œ;1fÃ|¹`L½äT/fK>stream +ÝT$湄G9vGÔU€©'ô…R?Ì$FubÅ̱µ”®ó½nh† ?o҂ååÊA¹âI•;ÛT’å"Ÿiö:æ£Ëu·”ýØU$ÌUwP} ¯nD˜º ú@˜‘¡ÀV^ÞÜߨòòs/SÚÎÜò#³Öp¾Ã›Ùï•S9—.ßÁrÌd I²lÀ´)Æk¤N¦°f_ó +0ý<ó–TrŸ*…ÚÞU ­×^|è—E¬š'ǂ’E ¿Ô1Ð}sûRÜuçêË „ؽ ú2 ƒÍ—VµpÙíy26pe8?®®Ø\g$ÜJCµ•ñ™3c+¥† h­ž*J닜ýÇ?ÀK+ë¤(­´[ ›Z6ˆ« +Õô©ZeG.dÀÊj>sBÌЇòSeqUEm¼Jˆ*µ†I²¤®2ž1[\¥džšÂ*Ýòèº*ÕO—¦žÄÀÎT•ðz¡*‘úL•½y¶%UªUªO`w‹k‰*£f JSI¡žÊ€˜Òq*eî34•iÔ0•€g#¯oPg:n©Ôqˆ…RÔI/J`áˆ8ä#GÝébÊFÂ{®œáö# r ¤d‰P…I +¦¼~ÊâRv>eêzJ\·³ÌN ¤SgÁË)U6EkãN©:äøâÊM)dSÆa55%]>þÍ¥$TOµ” )ý`:)KÙNU[)ÐTʸYÉÀr.•”7╣L :s"DR"î3åR”3“HٖGUH©‘èHYȺ’Ä„x/ÐG)D]Á— ¤h²‰}AÂÃrñ~Ÿ+*| è +òO"šRR‹1\ Ži£4K J£Äz賌²c:èpJ/܃QjÄ pQj%}ËI +‹òtG{ø_eۈh gw ÞC‰“r(W#lk(Û AÜïÃP¶äÑ´Pj#úF¡¬¤NÆu~-"0Q‡q'¡T}¡*hÇû;D.„PöE!µXÝ(XIABƒ²!!Qªg¶}OIA©€Ôˆ ¬ R¦ ž(»®&l¶b—®:ÃUSýO(0<4ØòóÒ'ã0ã®ÿèá®BEä;ˆùy½ +±×¯( ¿¸ùNI‰\}zªz2qŸWµâ’3OºWò$ˆ‘§ÃÙKÁŠD2 £ Iä9ºqˆ¤9H,—Ï?4ø¥“²%¦¹ª yH¤s2à †9éêêôãT9É#¶¦ˆÐ9‰ønœlþiõÃ+Nj€qȐ#Vâ~Ç>¼ý+0=âØ*q‰ŠÂõëVì¤cØd¡…dVÅ{<âšÎ4kÒ^#”}lÿÎÁY5Ù¦t2³]†5éô¼>Ðd %Ϥ`}W*ˆñèOÐä/9 +t§™\ÃOxÎaTÉH1“!4-“²SôK™Ä†Ì&’»ID‚‡LÆÀ°å˜”ÉÏɘŒêˆÐé=zbUŤtTOĤ¡:am£æD›Î0yýEÂäíflÛ%JD•wGpÝWå ]r“Ÿ)—ŒÉŽ^Ú9:è–L@„-‰ÈH!¢¹Î9Ò>4§7Ø BKî>BK‚%z%¯cõ-ræpµ’‘ó‚±’‰¥Z%Qëæÿ±ðqH+ Ü$ ­  ț_WE’v<óü™)ŸG²S^WŽ¤òQ‹F²—x­ÄHjû¨6iÑÒ1ï‚"I¤ÌLÞáRüÜOH· +èúÔÎ&H^‰MAÞxH¦˜Ï!8 +”" ©À„òGj¹î3?RcfH}¤òr™em"µ×Ͻ[Zá‘ÉD|¹#CF §½í ;2£¯:RKyÀ "ÉTE æ¢)Kž6Ù©»äH”ßhJ"Š#kAŒQX&ª–¨Éa_¿®n¸ÔìL“&ŒrÆ\5þìKxjÔÀu£¾ÅwF]U0Î,8Yé; ‰ Zé®@tƒÂˆ)€enç¸ÚFÉQ‚j®™¬lD=ì—US2?-~>^lu8žŒÖÑtµV*½©û_7D?¿C¹FÁÀ9»Âåƒ&…Ÿ¨ºzÅ|ü2tcy› ~ó¡¸sY1zˆT Qü¤ñ€¯ kð0t@ƒB >ƒ¦˜S\Mi½µa1  áÏÝìZèhÉPb¥1äI„Ê‘‹yñ@»á sTK#Öe¦üˆûãìY™àJèr§ªEûø£s’ç-êΨÞםë?M^ m)QIY»°‡#äõؗݔ´qÌÔí@é·vlœÑAŠåA5áRm옱˜`pŽVDú+[ ¾ÊnD*ÈÀjýâ¾jáôDô‚ÑF&§/øޏ šDð÷颳\e +ÿM ãN-NK0ŠÂÂ~Ë‹Â$lŒ r“'„¿Ÿ€‘†´EÂÖ3¤¼;“8‹ÉåĢŔ‰bHúzüæ¦Uµ€HæJr[•/ÁR‡|Ë' oLEæÀdH7 Jݞ‡¨Œ rè×âB½: øXq?®€wÀÎÏSöĎôÄgµ‡°„i9¾x^ûÓv8?Ç[¾z§þˆëÅ˹ûœ ä AÙû\L EË9Ëõ"Ð÷ס®Å0l[z0¥çôȞ‚®Á»ó¶>€†×¬¹ÔP™D=?s{.[#=zõÁ’º Ü$ÈÑÚNÎwá7áòÔ¥¤Ã+~ lOöŽ}ú AQ ÿ]™¤À‹Ôc°ãXËWþ?ƒ8v¢fmÃùjehÝ|ˆ\Š<|1âþÜ©ÉÈ`œž|eVUÆ£§‚‡…ñH¿²´ËS¼A„*Âx.>j—«Éô›èÁÚÞwë17%‹[ùäV]7‹î¼Ã‹šäf˜!LBhÏý.Ñ,ôþ?CX)¸(_â6҃ü·Rp­g÷¼òDâK@­ýkx¨À“•§EH>r]hÝQÙhQ Ìq +zBb¸W[Vi/dãwk„ÄG!F¿Ârla§ò4K: A¦g'¸Âj° $ÒÏ¥õ[J¨çƒu¬(&œÐ ?Ý Õ¸f…Ö¥ñqmŒIPÂëøV#ò•qMÒ…]"ÓÃúñ|Ý8CÏÊ÷ù¾™eu¼Ý®h~ÛÇ+‚@âíÚè^9I½.¢¶Ú“³š<æY€kx±Ô>¶ZŒÀÞ^;UÓñŸùÍÅé5—”†Î0[˜°¥49³;²Šáx"®H²›ý)çÌ ˆu4Ã"süëA¼œ†°¿€5â!«fµ¡84< £UL(އƒµn%7WÃ1¦´+:j†Ž'œÖ4‹ñrWñÿ–}9ö–jî’ö Iˍ)Ðù‚Áö +”ˆQÛ÷® + ·ˆÇw®V +¡eK$ñB÷jÜænDû³Ù±­cv-j–Æ8)Y‘M‹Op™A¤•Gx{l#ûʆ:•6ÂrLáQyþ¦Rp50àÿw¼y’ŽDõ£¼Dü ˆÝbyאXÁ;‚ÐÊîëŽj^„ÃDfäª.ŽqÚðk‹y`'¢5ÉwM[[&Ã÷Ï£­PKÍåÓs”²úGx“Çz›$ïTÎMæ HDC§ +^Ár{Ý®ˆˆö»ÁM&Î.UîøêøŸõQƒô­¿éÆk=%ø6†í/BÖþzgˆµ“|M&¬xó«\G£µ@¦³^kí+8,¦ágº§x¦Çw}i×=‹áú ÕüïE ®ðRUÑ°)«5z1ÎùŒ°‚æh þâ­·+›¸-c”u4¦õˆ½ËU?²¹PȦ‡Ìýç+® +m0«0f¸}R ÷BQ A ”! àil$v`YOR'Œ}v-Ö!V³0á Û¢$g­z@L|mý¶ê¥Ám•«Ø-:RŸb£¡”“gÓ0oûËahÞÛö,Ñý$óhÂUhOÏm·-Û'9¢ö3Ú(UlâíÒ;×¾QAÀwm§ñc®Ñe/×>lW`†Q«¡+[ɗ}’²ü®ŒÃ¼€ªÙ0þñÁh>I@‡,k`;h&z/B29O±Ð›¼@Ö°‚xÿ†e§ñ5(…a1RtV0½‹¿2/ /’ýÁÄâåþÕ-®¤ÁP6e¯|Ž`Œ—kf~ –‰šÅ#Ü6R}äcŒ#guÛCAò +=Âk•]•…ü±n’³—‡5”}zƒóò݊²NüqN@ô¿´@dÿ܁Un"¤4 ‡–t¬³!ö³ÿÒ©}"2¼ÒÈӄ|Òx¶V¶= cT¥> >vø² P¥ÀŽ@€ñèOî*؅,/%Ɠ‘c=Ôo†-æûˉ¼f}zsXN ‚•Lpì¦/X>¼À›!¤Ÿy鐰Œ>~Ÿ·‹/<É Ò›]ú'M@š*hÂ8çÈ2O/€ýC¶Á;W±P>IšfàÙ@f»ž¡Ý–: ¼«0,N z )µ¾-(Xÿ;v0?Ac`ܶ'¸»ÌÇ°´º¨K B‚™ïuá*—*z`Ô¾Fáµr_/»tÚC©@®‚Ǹ4’í%¶Ÿ…KØdƒ¾ÚhŠÐæV_'ÍMàQp¬7¾Ý,-s «Ôq±:›dӗÈóŠÆ@xî +ÖÙY˜•}A*‰¼0¼)øÎeKîLÆBŸ®»`6ë܎2ÔSvÚ¼ Du‚ü†ۓÉPsŸ¶i d‰þŒ†Šxt…XÁ±²'ã6òfØ;ýjâ šP÷î-?;<Nä†ocHèå0—¡Ô?u›à³ïâ†hBqÑ8*¸Úz®QZ!×ê{ç;Ôap5k)^Á `t‚ëŽ`ЍØ"„Õ.I¢v,èµþ˜6êÔћ.|-OU[€t½ð*¬Ãù}-ûPŠjíPšú„4ëAÇy„õ3¯)@ãfðµ%‘åÑM›žƒMÈinÜØÛ;pþ,ŠD~—ÁtŠkdÓ·Ÿµ€?M*;w=¹ËŸ+uqŠxx'§0‰Z\aðRhžÁÛ¿°šº,7äè«øÞ³Àzؤyš@;1m±£ÙŸøçbï›z±ë§¬Ù»Ž¦‚ÊÖ+ +fS‚+AW€ ÝUâ+*„IåÙlÃÑTrÆço€$Njì¿WŠåT¢ >ìÙу 9Øjf[éü`ð“ŽTO@tˆÃQ1Ä¢€2N†4Œk®Ô¼©±m! •×{¨]®Ú;'çÜ]^µ°-願“:¤é"×ÐIl3¼à }Õc)ށô|i|²DÀÖ°ÀÞiÉ}& ëRö‚iö©5É?„†x+¹ä,8ÜwÆ7,ã ­Fdõ0´-;AFŒýõ>ʁáNü]âSˆƒµPÓ°A H !µ(Ž²ø8w½xà8.{:ýž +.“çôªQ4“ÈkÀ1ÔAT3 +;øiŒ"RH»¶–S¡6赧!Tû³/ÜÆ÷òô@ddÄ-?6)ÖÅý6°4Lż£‹+ZpžÏu¿û¾ë³ÛÆÂeX^[­¯ßâ +S>“åí2dª³œ)ž7ÊBŽÆö9fg†+Ó³t"u‡¡£U ìHò1½,!úM_œ{ °Ét3WJ·‡#ƒpª«J–ƒ\âà„¼ÔB°!X‘G¼»v ÐÍÉڶΌ}ójZltô‹)+€zÙ!29”däÙÙúÀŠ‹#Ñ£%o7Jfꐚ“§‚ºÄ/†‘Ñòžè×òò£ÈEMy2úîøÚãuÙ„á. ©Â%ˆ.cêìtŏ”x?ðŠoH±u®°“êkïãkÎð>!§qBF FÜ£†¢J9g‡¤£¸˜Æ +Âd5Kr-ðç®Ï©Sœ=·ORŒû¦À¯LSKW_—е½ òëó\%­Ý•ª®·ðþIäup—=¦×·:i?›©¾BYæ¤é‡`*¬,3ü#*ÿçyÌÌè)µïêòˆ‚uwòöµdm¨S†'%óØâðˆWZÔÁۋRÌç4 ‘:æÓ¼~9p Èm]R¥8n2¾¼‚†‚Æ#ÖÕ^úHx`ÁÙD·ãچÌõÊNÔ¹¹©¶ãŒÉa@Šô<¬A¿ªáZT9Á7t-ZáÚ=…Ðëë.v?¼ÄA}rè³s÷âwÐÌ0iíFƒ/X´–¬Màq‘‚_º2êàrt¹0¢sWÝ2Ä’|UQ¦a÷ôÂc–°O«Xˆ #®€wæwˍJ¥ô#®ÿH9°ž 9êä'lîíÇû/{¾ãï/~ µ /9é‚ô‚Ã<Ö8ØT½Ðº„sۏ³^š¤ìÌ/ÿö3g›@(:²ñ½H@Såǐ;Î+ı§¹£DUå9½ò.0^†h|+NDãþ­]#ßF ô8¸î¦"b”k£(3"? €¶E•–’ÃÙ7ÂõÍ ‚¸T’H…j¦èÿ¶Žî3•ô ú•½z«ÛçÁ8ræÊÉþXâ)„á*TO~ \áÃìJ»1Spé ¨Ÿ·,—pµA®Fi¿I@‘ó~¡õ:¼7ÇVf"‘Ï6ŽX¤Õ‘Aº ¾qC G·z ¶ü1•Yä«·—œjþgãð— \ +~7&qì„À<£zêÓÙy²c¸Ó‚M£¢[×^›ÇWéB.4ûédý“}”?Ïó»F±”ïàõ…×1kWô¢c›t[¡²üÑoOÐwI´Ùºby ¼L¥îˆ•üÂõOÌá}8øÏw—Œ¸l P=dLsŒy:ÂNÉ°Ïg¡xÒ)þíƱ*̖Yšñ+u‹-C;¯@C1: ÔÔh–yÞºÎl3º>ÌyðÎðkUH7½jËÜsr×<Y[ƒJ| &ÌÃH‘zBÖÖ"Ù5K6${IBzkÙ97€ß¬—?‹‹²¥Èï[/Š>ó ê䠙çnÈÃzv溺½Ÿì,&ϳ[úcÄL’Q…²d+à|Hñ¦x$ä®kçü´z}s ‘o`Ë@™bª;Å5¾¢ÿ#øú]A£‘õwjr^t­0”äÄdy5²5Ôؒ׬›„ðI²ò¬^ò‰°D÷th‡óç“9'[”£ ™rR˜¿ÐE˜%k¢Ýò\ƒ,ðMdÇ}·£H Ð Q͞Ã\à‡ó@&|¤ÚÝý’tû(Ÿm)”dât]BŠ]ø#9–8oS<^Ci–A’÷Ì!ôD7¢ö (ÿÊeØ¥u{}›%ýۂ1ÎL~O ,òŠIg^þÉæTÇ24ðÙ¥!©ÀÙ-X ,À’ÇbUè„`M—Î؄P;^­gê…Z~‚à1ÊT+"Ùð¤Nís)ÓìïŒï5 É×:àÖ4_CŸ»Cp,e½0¶æ UclK´ƒp üÛjÀOW +>¸;Õ²è–2¥Ÿá›Â/#ÙØþu±“8FlšÝñš¶IŸ¢&ÖɁáûÝ°—Õ‹ö¿©ïR~µ¤]û„™…Jõñ„“Àåc¨n<8¥?ƒœ:¿§'Jg™Ð·àxKV€L`òUT0Éf˛Ÿ„ÉÙÀbö¶³X{=Þ" @Fb«/¢=sÎ]·À*áâX¬M‹+ªóÙáϓâS¯^nR[kX·îs„i&X R|D§p_*ãÂф:‘\©/$m˜/¤æOpXåÌ´‘[³3é8ÕÌKÎ٘””M«’ù‡Fxä¢àg—ºÑ· SX)‡b§jPç jÉ©CWU~NâÂZ%÷T˜;O®ö>ún”»™u{Féè!Q6•·5¦…hg/\äyoþÑP†÷¦J9AçÄ—ÐXÂô@OÛ+^F;ù…Ö¾Ê{Ü3³iBJSMçÙÈ¿Á»¢|L€ƒár?3\Áñ&û|ìKÎH‘%¸¶o +]‹em—q×»rt¨a"Òð`ÃÅ1ÐPôü¤ ï_®˜õ"8¼PZjõ* Ù¡ E©ãÃï@ÊÃ(æ⾑½ŒÚòŠý¡/«éÝäÖ2â#ðÕçQŽ¶#^ä=}Š"ˆ­}(XLP”Õ 06{‚¾t}n- 8|q¸¬ãšPñ“Ì(~¡>zÌQϧ߯£ª…3Y@08>Ə•AyvÖÙ5—~­Òx‡ÛB#æ—åÙ}Z=0e£¾3'ÔHÊ:ãa+'JÁ}䲆e&„ÚNât çÅgp\ü`K™ ‚‘ÜáêÔî&ü„a¼6¢ †SçÃyŽwê4' ž’·ó_\$H}Ë«îîÙéËz›˜ß:Üã©"²íI[»«Š©=Äωbbî™E uþ™Á7Ÿ±YµM:ç2,H’ÿ‡1~9h,Áø^Q³¹W€ê’L‡ –²®Ñ w¼Ö¦×Œ?|B5äþ|ƒ­4ŽqÞ`¿skނcœ Wq1ªfím?ì¼ß_½ÙXÕp²ëÕ©"˜g ´¶ÿ#§^®0¥¸ûQ;núYsByGäŒÝöÛb*A="™”™*ÔâHk1u¶ >`PGVCuÒÆYco ç&åzÉI¸ƒ·¥Êág7OÔ_ddæÉpþ‚š¼%ÕKèoð9…!áø‹yŠL\L´ÕVuŠ¬PҎ%‘?ö cì[ñl´!jˆ°¼’ÁȃÍ?+Tþ&1¶‰÷{SL‚+…S¸-^÷ûNÙdÌ*8ؐ—CÙÆ`@O–VL!†!†äT ¿‡’2¹Ç#ÏÉ_´Ü´Í8ò´Ú •O€×Ǥ  Ÿ Û¹5ñ¬é¶ñ,„fϨ>;¿_ö1…©«EêX˜¼]ÅÞ:±Îóò5Â@LñÜ(19 !ߐýý™Á쥠róù* +@Õ| mW(?ô—sþy9¥Ý]ÞÊǙå€öÐT'„Éd°¦€%¥ÀðS‚2j{J(ÜÀ+nqVóB, %>9ø°x‚Cd ætyïôR&ž•¿S«’﮺“…Z‰_؅F#WÜw¸®ðÀµ„ÙßjzƒŒKÔº íÅ@ bÂ>,Í$6rÙ§[áiÏ·Éû`¨²Ô{yY<Øm¹yzP\.Y¥÷ ð>Lq¯øÞ$·ä£-pŒ9”"Ã| œ6Ægú58D±±¯·÷lBrltJ]ŠõL¨Žd6Ø&Ì2lÛ^Ö(¡T¦Åqæ"£.…ðØAŽ*¤ìzAx_n3vôZûfãCm-E7f‘üôzÉd‚/±…}\™!µÍhÍÿçú´—r¨[!/mlX×B‚ͦE€ÑÅh‡¥ãßîfßÉ[¢V4ÌçXB #sÂà&DRØ ·½dƒucÿòŠ©ïÒ½X!&¶±@Ûk—ñ—!Ž»Äõ°Už—Ï^^7ìôš½|­»ŠN`ÍÑèÁ05¡AEZŕŒŽO‹{âf 7§c¸å±*å:\/¢¡pTên?}dXày¸ ÓYàÒð8ÿàHq$õ–§ÙÌL=,ˆ`{…RÉ랈¡EuwÏ( l‰ã£ö5\[Aí_êÉè O;‡°9æ&Î+þÂÁ¯,¾-çø™G þ‡Dº„†„ÑRk"T¿¢8’ôžŠ@7¾~ ePßX‡ÍW«ˆª0˜Øù‡€1|.“c…YBb# ®n©+d…gûä•RîdWŸ#ˆÿÚwœ§X“šG=]‘tøPÎ¥ê‰ú´¢÷Àá™D»£·í¼Þ Ø1îà‚Š‰,ìBÅ(\Ϊ/X:…P£Ë.½®ÎHå^āFÖÕÊë‘#aJ€0¥ õA›RØOI-žþIä8߄-d‰K¯Ò^–•£F/|¨p«Ž¶ýši†·ÃUl–ùD³'hVybà'òûétMæÞRhýo ÁÛÃêN2z´Še!$»]䏊§âH“,̀`8$õ>OF¬ ¹Ì:{nŸÏ}ï@ÖFJfý¡R ÁF–søí0`Â$«]ç¥ïÈêYZ2+™¬9}*z˜¯äÚ6Z'gšÒ(Y•9üٛ¬¶°a¥kô’¬ +M>ŒíÄ5²ÔŸ*Œúw<“.»¨b*—ê¾U]—‹-ø(åX/쁾c}‰;J÷IÛK¤F’KÀÌJ‚‘ª öc ?†,HY(v— Ÿ0Uv[ lP°õ5YZ·˜ O–”•Ò¬²öO¸âՉãÚú,¸~ÿ~­%†?Ç¢€†=»Qmz5{³'`¸!è>ý¹žäg,L€ÆÅãàW[‹Šå-0à%k¿¤cU”¤Ø°®'}#á9ÚÝ{`šâ^l½$# 1“`¶ïr%’¤` nN*Q‹ÎX‚-‘œUgÛäjƶÝ9iÀ-X£!ò“ïÌäj·YHE­ùmŒ9¿EÑz‹>YYñmlÕ²/Š|P/ËÅsÜ“¹ækQÒ˜…Hõ˜õúq (7IôÊ ýLôt¬PŽ+>ª +ýø×Ê ¦ÿ•¿PÝ»çqHn»ñ¼Ý|gHç‹7¶¥êç>Ì©=FN‹0æŽÜ O·¶ì¾nîš6kðÿÞßt‚¢Ȧ,á´pq  FB‚úÛjÿ©øòµ:Euya³S;õ֗ô37õ™¼\Šˆæ†ñ½«à©pӅ$ãés,¯á©ùa¾ö¥(™Û”¹»6°=ß<J‹úüt„6Azõόf?6à9J˜3ÏùÂ\3>»·ÿL° @ òVøsÛf¨½…$CÝCäþ²Z^U›J\#‘œ™v2/iã!] A‰†g*ÄI]ø„VÝA|­£¶îTo‘ Õ4~Ï [=ªà™ú¤ĆC†I–O÷À_%@ìûè]ñ"ÎYu]´}GnCè÷gl&Ñl2…eXv6ìùŠÝ{!o–w¬ÀgE&¢N¿÷E! ø Æ/4 Ȁ…5h䱋   nÁɱ;9!"ç>ײhwÁ&µb+d ôÑ°D¶ä÷¬§—O$ȑ +^ìˆ7õsԞXÑNj]tú:eC×ÝeO*x\ì>z…lšÐ–¡J"¿ +‘v÷렕.b³«¡äR YķقîžxÙKïp«„™J¥dªøÀ®Ô ¤ûà ]ⵀ"–¿Y8<êÜ~FLP’Òà‚³>1Rï="dMcA²Éѱ°~ªaâ'Æ>% +EÄÇÄ÷¦ðpº!ãBöü1/ÌjW‹Qî²¢´7DŽWu™$¸ó°¦ý?@/®Æòš#P)í½hl;ý S…S+^Çn%ÿ—ÕÏq¦¦<µi"p¸P|+Ìð Õ½º¤µªH±ç™Ž*­ä§ÐD ûŠcd§>œÀ@_Ûü¥hû3/F‡gf­wÒ¡’¨êÌëM?Ò µ%S×$CB@ðü *’ ¹è]<ºóô/¢îèî3‘Yà¢>‚~O +;æ›&Åï•3Y:€n)ªÉ⒬+ŽŸ¬–ï JäŠû0VEQR-oÙ FÑ1Ìhê…yÍúù.E˜x\Öõ20ËìRÊ-Ì®M¬äVlTôDsø°ü‡ï@ºgFÜ!@:÷æƒçt’hÌË0W˜CæS˜‹¨Ìå,¨3fË[úd·Ù6*~¢€ Œ­“¦:•ºûOä¯Îō&Ðåˆí\Þ»QRFÜ#X‚„¨'Y-#ÿ,iPëÄcç¿0J“6>nxAÚ(ې,eŠµÕßG@)%”i¶Ó2ÔòT—.ƒ<ÊÕ£|jkÔ7UŒ~¯e ¸#© %ڑ'Ó"äöÁLW{‡åïà˜»ÊüRdŒƒ +ò*Z߈иªa#ÀFFÝõ€"EÁgRùVvì â‹Wpdûp*Øq÷“î9‰{O+Î J + N¶éëüæ›óJ°Aw8¿«±ºßÃ×p[¾pÁϐÌ0Ó¬€5ÒÙe!ò ÃLFGì ÌÀNÉZ¿mI»(†F‰›¸“ÆPuIî/ˆí خȏd†Ã ´Q½õkó¯›øk׺ƒ4\"HÍÒûï(‚g†>)lP¤{&X'²4ws ¸§ ù³íd0¼qQó¥M݀…í¶W»7ÏF°:²l넇¬{"à@`Ã^ÍP¬…ÑPþú>%êÁ]h"'E,cvY½•5vk¬*$…[w*¡x¿¡t¤­:Ò=¢bh-LâQ,º' ‡æFXǞq{2dÆ{„ü° +ôޜé¨é¥‚¼´ Yc€½ †sRXm䗂 II‚[&Â(ʯ†Ø·Ø¥Îº®A8’Ú‰áíµ‡wI·â+ë„^‹ù d—ú¬œ™¨¼fÁ°éƒÄLÎä+€ýaø} ÿ…NX㙁&D"7‰YÙZ*z^?÷E£÷Wù¾ï\xâëTšû¡’؁HÖôsõ¥ÆF“J¢II§m[åh11P'÷ÆwP4ÚtZ™|¼ ˜E4=߈ ô—É·”ßXÈB´­NâǠĥí‚奨¾ë£ãA¬3aœ¢ ã2|îUþévÄîðä}¡Ÿõ(Íp:¸EՓ‡ŸGûЂqçu{,Ѿ¨Su1T]ã]Î1¯º{A”ö³÷® ðèeT?òý¯^‘ñý>¢i:D7Izú&œAv¯Ÿ#H\€%×%ºÕՃ6Iöž`fP0¸p^€µ{Ó³%{Ô(zöNÙ¨d9̞_Ž·Óèüì~±ŠGžhñŸ“‚: ÁQ|%’'3a里]½5 ¯F¬Í—ÿV úФEú-\ýrTZB@%òÂNÛ<‡\/¦£Ðü!3 m¹´}-Ìôa }Ü'TPˆõõ”–+þ#çâr„»R ‡½½‰îg‘00ÆOÆÕ,RúŠÍ[¬=ßà’ °QB—]Ò_  ]’¢¼¯s ±Õ¹é·f +ƒœZ&2yEÙñ]Œ=UµÔÒ`¤æNÿ-gœU'$.…›=B|ž–6åâ]8AϘG”¹?9+]èßurB¤Ül. Hp›`¨ÆJq¶/’¶uî}S#ð ¸g)m– +~©¢\E.œK±˜A'”BˆdÇC;0C„C@~ўŒè¦©wi£DKå  x¢µZ”s)–Cº•Â?|ø:L‘YÀ(ܽ¢6yM(8üŽ†TI¢<˜O¢Å äfÜ¢ +…¸"èPctMÅÿø8F*ƒe¼éuT¢«º±:Žh ¼“RŒS¬‹–â›_w ˆ”êL}æÉ®JEG:Ə½ ¨ÁôkH€Än%• 4Θ"‹øÞbv‘ +æ·[¶}‹i‘§„¼¦hEž§(§w6&´~ÒèÖT†A°…TEGgl­üW8}ëQÊ;iˆÑ4Æg Z«ecpåÕK¬R2 hì¤eWAÅÄ®†WÊA,S™§,®Ê"• +äò²Uwé\ô€.ê–Ð<{RË`àúMÂâ¸zKÊâ}§¯‹m +ǏGæÿ¡…™gûù|o ômÝ&ú•vQ杄 ‚¡Ì¾<{ÊBð˜ÇbïÍVÐV vàÀÛ¯Ò±`óóÆLcҔW„V1å 5óð'|þp¿ûQ.SU/$amð8{µ×Çøq„¾¶´åE–G½p`IۉŸ¨fâšÓ± šÙç9é¤hô”G+wÀA4÷]®p™‚ñ©¥uIr€ö¸9°«A=Lq ÷¯`’€L +{å)Ë@f¯)Eš+²ˆÏD‡|›nÀØwùº"¼Çå§f?.à›éQKøÀruv’Mÿ õ“=›o€dÿ7!åËÐ_«ÂX8L‚‘^¿ЧP—¥’í8¾Ø¡î‰¥_wëÀEú@zOTÊðéͯbôd´íc¦€_Ìzë½9¼Ñ`n3yG]….ì þŸëÂbIYšö|ՎøË—º%A!CÆ¢Ô¥ÚãllÛ-½[jM"bkM¹5øÁžA1 Cö©(\Üø, +þì0ŠšóI¤ßá6ÍÈi@t7¥Ë!9©ã ®Eì‘'ËÖïx•x,¬€[Tf˜ ánýN@«•±¨»Ô%ÁD„„î 2ë9¦ã-äü! sm×¢2Ø=Á’$,­¶ÏŽ¹5B,XYm8p®¦%s~=O©œ¸˜ pZÊ;ìi`¬Íª­tI¯O´¦»Õö͗bMªã8‡8h¨Û9zѺ‘ß° þ!ړÖ@7u±Ö¢x—0‹¨¨€ÖÅÿÞ~N7å‰?ƒºL)BhD/¦„AœëüÔ·;% $|»CÅ €=ºì)’5àèù“€IˆW™–~µ’ÍÂEì Œc‹Uw)Âi»¢Tz̆3W{XRò7 „U{ãzg`¦D3o\~R%ó×ﭻСò}Õ¨ôÿÀš³w˜eºœG'ØU½¤ƒïøw%BÅò ×{Æ<×rï ÎS¸:”i€„FJÚYüQ“CÒ6o±DëWŸêóJÃ{QäxdôÝÙx+èå•þÁO6Ïûô`¯é±e¬;&Üå~éÈ`Å3«˜$L6Öw€ð{,5‚!Ty¤T Ýdµå2 ¿gªß<ç Yj˜ ò㹖8æÌ÷ÁÔ#°G™ër¼Ý›ïdIYÒOïÔàEÝm>H&™nc \í¸²–ÊEûáÕZ(LÀ= þ9;Ï@»©ã*R…ü‰Â+¼v²M*û"]άà›‡Ž-lTd;=„ÉŠK¶‚·^q¾0‰Ý6d%Ɂ)HÃð=õï*@[= Ϗ®i¹‡ÖÌN!å7=q‡2Öo„¶þ° 6ØSø…ûùÂ4ÅâmÉ +ô×ÃÝÜûFW¡{Š£»¡ö¹ç)ùÿ"t‹Hä-J6to£,¥ï#.9®Rsê‡ܵ†ßsÝ,(VË·ƒ­óÞ¸H ÂæÀ`è`¡ø†ˆ×\«¢>Þ{ŒŸÍ#Œ¢u\ðÛöRe~‡9Pd{ļ¸7 +èˆN*˜?"ž¾9E‰9€×‡ÈU.1ŒBÁ+šÿ?=|Î ÒÔÞÛã¹ýé};â¦(oö¸è5ûàuÅh|&ya’æB²¨é?Agè"#_¸Ü;äÙõË÷i# B¼¥Ÿ¦ÃtVÃ@-əÊ`GüDTÉ°Y!OáµàÔ³¢·æ(ñ3ßá¼Áßb·C¼XZ…¾´W2Öìªéù¡LXµ£–èñ„ûÐ0¬d…õ¡f…ÇÁŠkÇü§nG«3§,A@ËOÌLk%8X’ÏB¼Š ‹SáÑûFëÍ£ÀØh:ž ™¶`)¿|Ò<žÇqþ”˜®„ +µîìøÍøß_Ž-v¼çJÙ°¦ã€“Y-Xáö +ÄÑ-Ãø¸¾:î)‘žaÅ'Q)SÚ£ÒTÂfAÈ$ñYÀ÷ë´Fß,k¤€6Ã_ô±Ò—'“&@ò^lEܼìØä5 ò I&?ó&3Œ‡\*°š©7ÒÑGE)çéh0%8“¶"ˆ˜ œÙû0G†ic®sôî¥2¨FȱÞÇí§ÌXœ5hl"wx(vœˆ„&‚£S:˖¹ÙŸ™° wQÔÝëy±[`ä¡´'ç²QÛÚ¶[¾ ë"2VË[0ƒ§‡\h!þùÐ&/5à†-£Î^œžÈJ>x•Bbv8¼¯GLÒ"õ~ÈzK¤ ²¢bœ&œ ÐÕ ¡Ò®¥F’B±ZºG-y7éq‰ ¼‚ô¶ra*jªu@V”ךr7Š´Z®j%å™Îæ¬y·œróèœ{ºÔ‰EнM͵/xµ|ÔÚ¤'&€>äÑâхh1ËÌsN$QĪ[ª–‡4ý€á4ïÚîéµ¼ CØJ¿öR¤bٗ $S²û(°&ýnB9oFw«ž"EüùQÁwŸYïêÒ7Ê ä€6Ò5P~Få\.NNl9TlS 5¥Ï˜Ñh!Æ|¥; ?gÖ(=ÿˆÇ&x£ž¬ °—×%Ó+ a¼>.3À×ûñƶ‚þÎÛþªßúÙè—2‡¶ù½\Rp÷(‹$?ã8MÓ=)æ1+~ãI?ƒŸ…<ã¼o.J³¹ÏŠ"ã‚s3}«Ætå.§`椏{ٔBŸ€LÎG?É2ó¥¦ü¨|4DŠ…|Mk|Q>ñÙê/|cJ”ŸqEðm3ŠŸŒ¥j¼`”xËñ3·ú\:ÉïX/Sݪ…¤õžni>xÿ˜ 66tØr™íXõðC H5ç%¦ñÕ­yÔ¥ìó²CE­åQšrtÊËgؖ¼Ðþ!föSÕU›q¼7þlÈ ÞP$UâÒ5Fz¡Å>áåu¶à­SÛyÀK=\o¿iÈÏ;…ÞØz7›d-ޙé¿ÝIÔOwt¤3r÷ÂÀ²øÂ3ùævè“–Vµ®Ëèå¤Kd« <ØÅ/—𭡍Ã=¤NnD©[µ«û-ëKȓú–µ—“µ±ÑTJb»GbO\æ°³Ï0 +Áu+—­¾5‹eˆAt¡ €ø<… ñ¶c×s¶P­ |Ä"_1¹î%Â)J‰/z–ö̹̅üaÞ4†ŽCÕ¹|Úvhž} s D¡á{@†—g«:JÅÌYÕ³„émƒ'‡\gôó†e;Hß hnU‹k%zrdŽÑ«âžd~P7—zâvWtíK×[Ò!EX×^§†`Ù/¾‚’V_jµÙGfñŠž‡ÞfšM»ólØQL Œ·FCšÀó~lƒˆ á#QTþ& ŸÐQ1UîÐÎQÑÁ#ú-xÍC­ú]ÈýãöËËZUýß,Ø3Ô£üÕz:2Ôîš +Ã\èˆ\ëø˜¯šÐoÜÎ- íTçœ ++ˆå֞u9œï°à1$Gk÷βF°”ºlñw ¾µ` hF.½=7I²ÓˆÌôhgh?G^|¶ðè^XƒFT¾wˆUò-H—l²À_ÐÀj¸¬Áç¶póº_‡t¥RðùZgåï9ª”à‚Ãú„MÿÂvÉø¦° íä(Ô³{‘ÂE€gÉæ€hր:_r“2¯ôÔÈ+j;ãèÄã„åG#jÀ‘ò…{gy,ñ‘TkbEø‚ÁbÛ8*`¡SÀƒ#ðTxÐÖ¾{0JB½Ï_Þð•Ðù“‰¹S7g÷¥|Ð2 +Ä%Ô?mäà,? X²Á²#ófnÏTW÷lIçnG±dÈ +PPPêÀ´@ݎÅÒÒ=Ê ž…hIX «rB\A½ü ´o‹¤íÏØÝÙÍC;£*‡®ºÖ^ýWõKVïÁ“‹­É£ò – ‚4$«0á +VóLøª}Š Påvú§`){§êÖÈ2Q²x,l ùmæ)gH'2ûqGTÒ*Ä7óëÿO&Œ5Óp¿oçœ`6¨ ý¥~ã`–`cSóˆ„ 20éOFÛ;Cߒ Óy²\$Œ}`Í|*sp•úAÃü(:ê U"EAùèj°E@¤„Ãûҍô¿º÷¡Ä¯ó°¬õ21‹uŽbÓ ™Ø#( @_+¦BA@ÔýL¡(…’'P¡88&$näOn,”È—‹Ñ~pãcé#é­E¸O¿— ¤1²›ÅŒ´7úÑçfÀ„ÝF…9fTؖ­Ki˜¾~ àaå¦<’•$=A£ÂÛA˜ HO¥æ°ÏM=¬k®—BùˆÁ–¦zÅÍ[!Edóúz`L¶ü ©-½ª“+`ªòÐ5¿g̕ÃÄ~ò0^¥Ñ‘‡ß 0F‹frTøAwMÈî&b@LŒ1ýs\¨Ð(Q~ÿî.£c~ù)þzÁ”W¥ði맵­3åTkºéOèÖÿEâa!ú¼_³:œ~ªbêªÜpaÑÚOLËñ2Ô2ÊxëDNK«N<^\ãÒXc}j¥ðùŠ:Ø|kA˜v€4”ÓXþL$¯ÀÓEDxd¤·›4p™F„ý)îÂhÉ8§ÔÁӞ7ëÅa=2`IO´êr]˜×=¥ÓíåÎp ~nÍÑ®AÖï|åVÆ-÷9d†Á+íõ¸<ÝÈ&54™ãë>öjgC‡Î ì`TP “ÁPWÒÍ5Éma-ŠÿJÎĔ‚©×ü”íî( †¼ “CS ¹ömva¥—[1:LËß©‹¼Ä¢Ì® ͔7é¼DlÌ/5²ê7(Cf7¢¬|4(ÒX:8BA …Cà0LCH£˜ŠT1ígi\- ¶¦pËî K¼è–Âó#¦À†~`E¨…×TOERÌ´†ï§*cÖ§J±Öó؞ý•²«wàì½4\͸&¼ZÛ‡,^H]õàÕÎþ§ãÑû”ƒ¹„·å„ÂzúÍpIy‚HLÀF7Cׅ6Ɛû%ÍÊæ6 «öä|>4ð•Îø0¿¥´“ãÂœ·•½ð|¢'ªcD-íœO(ý|ˆZúeßí70 ñH„µ­EtÚÜbæö"jµ¨ßâf)ÓÍ4ß +Á‘eZz#ÃÐC%,Õ¢k´:ˆNÕdRJîñ Ö +šZžkµWsjŠJ 3Lc[óþ™ï5!Q€—´UÎÝ1ÅÎY7<êITß,’ðúßI·p¾Ù[%ŠËõš¥ +8ԃês +€Kòø-ä2Ù¥ëßéCÀ ÇÃñªN£‚]¿Ç˜¹§‰Üzÿ­ª¿¢m§§ ú‚M> [Vÿe6•n¤Ý /¨æÖyBÖÀÃ(´À}Wu•PlŽu¼eO»˜ãÍJªtQîvjÍÓtMyXGèÆjÖÂZ€s_¶0€Eÿý:x’öõ—fý@|€=´ .! Msõ¥üÈ,«†yßwÆo')¶ôÛÇÕþÓír—ð6ûÞ y}¨_½«ŸUÙÁºzEøëKoÆ?Èò¡¼A—WÑÁAY— ¨£rÀ¤÷Å¢¦ù4(²Eð€0ڋF(FÛµ•„\ƒ¾ƒ Vx‹iõcD|ã?ÄSžŽìٚÁ J4ßõû0¨Â5‚«Ѭý䞱]pv­’+·n´Å6k\cNÖªº{âöúߢâÑxPþc' åø¢zÅ~ˆâlå@Þȏ 5& Ézé«lé}¨OªÁӇÙÛ&UšhMhÊŽW5—&pÃù; ŽÅAmAf]­bÁ™»ø{L+ƒþ·RêÆÖøu ]žÝË«&ä“D‰ˆ'ÛQ|8âªæxeå|¨¸•fx"¿¬ÈŽ@æ’hAU;it#ÐísXƒõ:c]@¯Daãu¨»È] ƒ ¯È¼¢ +Xր¦JF–q½0ÂßDÉxÝ ÙG·'¸yÁoŠ«5Ò@„F‰àYøԂ¶• U²ÏÁ}V燋xaÔ(Ç@@¯›A«ªô¿›c#•ƒQ$Pª?4ñÀ7‚³ý2¥ÔMH1e¥Æò¥d{¬ðtɏ¾iôÍrŸ¶ÒÉmWr¦ß/Zxè¤Ì% {áoFç àˆLý}͊ &_Ž(¼¿¶)تå|_ìI䵘ëfðm™ów4wٙ‚¶.f! ªÐè*ÿ6`è·wd˜Ž…Ã5Ÿþõ}—1õb^W,HÔÐ;¾c„¢®­Ï²ÂfÄTè’W½IG¸ÊprZ]ÞÝ»>Ê±è5Ì)U9€&)ÿ;å[¬#…H–~°¹9u‚\­Ô ¡«òÑøctPEiUà©Ô_öàÂý˜acM'Ä0B ›¶ ®·rZ É£ˆóˆŠï €“ªM°µÇî¢uÈH\WBœõ¹„üêx-Û)44¼\‡ˆ-2M¬nz®Q c*~=’íUw–Ó=Ԃ*¸qãَÒVf +®j¦…kð°“Y÷$5‰x;ÿìàŽxò ÙJñTš)êfÖ´…8ÔËý«÷†Ü3ÞÙ'`"IÊ4 7Ì×¾1TŽaóÌW ™Ñ†ƒû›ã-·Ð…@l·½Èy˜Àfܱ_ÓT1Ð×3êëyw`¸DÂp*k£íÿí¾4¨ÚŸc^¯MJuÅZåî5*pbq²LOH[ñãAÕ§„‘$r$ƒU*k×ùT¢ Å-ÜV²K‚ìæ„ÿËS•98B¸®@©T‹À>oÈí ù\dÐfE¤­àŠžÇÄ|k_±jku—<\ £Û +e]ÆtŽbÊ"ùw±Õÿj¿ð?IU×ËBÛ-ÌY·µW,ø|ž¹àÃÑ&\z Fqj~,r¯ë¹¥£³]fz†µˆ3‡ýN@€þp^CGdîÂkàˆè–iÜââ0dczð¤cœ^B)† •n·µiŒ]È!à#ß*Èíe5Þ7ˆfAßMN’.¤làOÁ¸¶ºKÌA +„ÂlL²€n…B‘¿×¨æ!ÚÏG +ÅY‚­tõ˜¨|nX‹H6±¶„„yçf^Äà?+4â[±éÍ0™|R‡GwFɇª±Ì„#¾8.Âëÿa¬^ŒîìXÇÔNëeêÄΧLésh°u)§¢þÃUàšZÛø¾"´]zæê©Ód*óG ’Ó»b¨§.Y{É®¥5–ËÜ▜ßàút+L®€,’ïȁL\OÍÏYʼn–n£\ æ¶Çæ¥ì7XÐÈÖ=£pkQ~5=O>çAJ»õ™Ú{¶èVöžPH ­°¾ï¹¤hÒ~º êàö¨>ÌÖE½ÍÎq´v Â uµÇ@·çڃƒ‡R1°L.fg7ðulb­Kb_ÁßEÚ½6рG©%’@G!Øc•DÒ4p-;µÓQ0¶ÂQ©Ø;ÍÀº#ªl(ê/«ìm·´éC)ÒuÉ«¾2¥dt=aÀ5…ÿµþÃ;­Ð"€>Žå%Y¤Ö¹?AìóÍy<™zôLۏ6Â_‡»]C‰‰ùìá% ¶Nz6-mç>¸ÌlíG>~Ä +¦4ÃÀD°Ÿ •ÄÌJ÷3²hø²ß“o`€c†逍´ PÉî%^ø8pQo˜# ¹nŽW$!-á)h5î’úRÿ(¶‰5§öä@v<ŒFÑ(‹ *@Ãç¿zåúq zpHÃO\æéGé©Þ\ÞzÈzê…r´”3‡¸6Xdø\?ï€Ý0&G…Šbr7¾Á£ˆSÑ OºcüÁ×».ZçI?ˆ°!ë†Ê9çöɢ˂ü…bNÞ-w&ü뮹áÕÏD}·Ö2m˜Û¤â6f¤éÂtBº«ÝkSÀq‹=á¥Å&—U]2 ÐIRB©ñr)i‡”á0¸Ï%Öyãz‡§ ¢á¿qº7ґ_“ZÝËi‹"U'Fyõ'N;ڄ RöšÙ®.ë ÉH˜a™ˆºÏm£w[V )Æ7½b–!”i׀ñÂƓðB1Ž•R‹ý‘¯A^Ÿ@RLዠ]ò ¯“äð2cTÌÅ‘3Þÿ–(ƒ§tIŽ0)â.‘E©8&Šr²!2v,^p2Þ +¶˜Z?¦a,’fJóÛï"Ü«!M·1¹,“ˆ§À=ö2ɎeÓ$z%P¢uœHÑľêNˆ«`"·ÊKmè +(fä©2҆¹ÝÁÖÃW†xDÉê“ë.Ú²!k–åôfKæKÕh\ï,”àR3q)Éê.®~MTdbQ)´…„&“ÃD¹%èﻨŒ¿JuZk£(î.ë?!aÉz[Œ§R$œaâ\5~P w$=0î÷»¼Šk±v¿CMñ%ýŒ(¦E9\tGöb§ñ!@e ƒïKÄý™ÐŠÑì0ªÐ­ÈZ†)vIQP»¡…ОŒg¼·è!»$"îqw•'®·j*/,ç%ö©¬ î?åԄKÎQ\ÖèÎ_æî¹êNaS\xŠHtóiß8†&%ò5‹¢jcfæ§LA\fŒ Ûq—ž¨Fæ疲՘m£¾h?2ö¾xøH+åˆJÂ;êÞD‡LvU!áR^76Þ¡æ¥Oˆ–þ'õ36Ž[À€–û˜·(eZZ%‹‘.€çö½Ù~Ø¢¹ƒ¥êT۔¶ˆÞŒ0w…ð;H4ôå\?'U}„hË픏ÿ!䁵 Ö%Ø|iiRqG7’ªð gz›9ƒvwi):|b³eoÆÏà £#É †|4¢íú#ù'; +÷ndžNáGI‹è(Õ|Ïaù4OØlÜAq¯×Óó£±q¥©St€3Zª€Ãq™†§Eá´ÈÓâFàýnܤ²@ŠwÚá€Õ™Š’÷ ¿ÛïÏ¿°FÕΓ llÛP|5 Àè  ¤‹ð¸QlÄ+ú£µòf çŒíôܗ7Dôçí-Ûys½a¾LȐÜËBdt“}çJ¶x'ÊðçÆ1$nàÎ[ÙN 8ÎbÐJ²ê•Ô:Û™âE—î¸IŽÜrƒÈöæ…íkAŠéDé4ú²M@Œä³ +tNAJO¢ãÔþÓ&À&ˆAþ?É~ÈNFÉ«xÕÀ¡_y¼ôö¨¦À¡œÿ°3ê|í²Ï1¤ëb +.KòEW@edÃýÃÙgų篇YÛ—†‘}½7£€¸à«†Æ ›ÚéÝ>ÔººRՔ™‘Oæ üÊq+îPo.‚tÃñë´*~sˇDëÖ7m…ÖUeVÚ¨6ð)¢Ž¯ÆsŽSHóžµVˆdfXež8~6C|ë…x·I÷QéÚ9É~Ê@¡˜'“û1¤„Þ)ÍûðÐ ê!jκ›j´<ºç±€xF¯í_ëÃßîK’¹ÈÕ +I{§Ù³´®Ðà^¯jŬ1©¦¹C弄KÁžuß2 ¾UTd[päÇ-Z×óæ]âSlOöÞF/9{j3 1Kˆ ©ÉOL†t*u¥×H³Ô9FuѾç$m"õlD„ ++1årèæÊ/Í°z¬&×I2Âÿv’;ŠÞАGt´Ä‹úT-H­7Õ«LºÛGŸj¦}áÐ“ž$¸Yq+â™ô£ç¦äccôi…ËpªÅEߢ©É +D¥òxÍýÂ\՜ìÆúÃëÔÄGë╹a +:U†’<왶ÌbƒÎ¶NV8Ä,6rɆÓ2‹T5\¶‡j/¦õ ZÌsʞ>Ž]ü=†¯(}.!»3,¨‰ÍpW¿Çú V¨2ØcÏ:Âø.àÁfébžk Š­Î¸~ŽxÍÁ0(¨ÐÀ£­ÕûšÛdÞs|”Ϙa;(ŽêÌÔÚBb+4ke@vþíÚöϹ«ú„¤µ¾}—¥ºäïÄ$"ÍÈ}ĀÇ^ÙéT½GeöMàAf…´ÿDU¼ùrý¹ £†$“©Ò›àô|oÞF¸c/sò©Š_½ì®¢9쮦À.?~õ» ÃYºˆÈŠRâç:Âï Ú–hÈ{ÄRú`Vô¬¾ê¿Ÿ^.ëfK *ȸiË7¯ûþ¬ÿAq 3bÙÀt3‚ßØPCf`PYþߌ…7,2Æ4Guܐ–ì—?¸§ænýÙUhcv¿ûPf» #¡¯3§NÈžç<¯Škø쁄´P˜;¢ââCeº» !áû5ævMEèË@Çî4RŒëöVµ#qïa:™mª®ûÔÁ¬³:èlñ#æ‘}!Pz«ß™kjŒ–}Ü™QæÂÕÀ!ØØ¢Q‹ qŒ •%IÉ#Ìû܆—y}1DŸƒŒ¥ôbÐúUpÀ{¥xðó¼5Â0ØW˶3ê+ç=Ž3pô˜´*64pJº@NF0b8ùkŠã†BӛRÍk` +!ýe"6òˆg‘»;ž‰‘§s ÔYãÁ-ԓú7#Õ¤ ƒ#vLKAÜ}lÓs”äT0~7œ¬†ߏyD +”`á”ìë:Á\~ဃð‹yÛPØð¤;'ƒ$¢…Æ#`Wë\|ð+Ù«è²ÆÁþñp*ÿqùô ^ŸãG‹vd»$¢"C›¥vlàj`ìþìJÙ7æ¢gI2šâÂâ_´0°1´€ziG„3ŸZm€žâ°”¦Ä´m¹ÖBãžHI—%d¬HÃyÿ “ó65çؓuß%œ‚Í-Ø9N „žÝ|;½šv­Œ,< ¤w¡ÂëÈ”’ã¼nad4*? #ÑÄ4¦žµ¨ƒ„ìsî!¨ˆêts™}­šSÌ\ˆu‚C– ÉEôÄVZ»ë‡… ‰ýƘËeÚJæ_BàñjJ€ä ï+J§|É%Л7Pä0µQJhsð¨Ë &ŸR~ €îL ®aåXçQ®aûʨ,óäÿ/ýiùôM4):Ah)§Î.”êcé z—˜ÈÂjEL­u‹Ï–#Ål–íÄ4Tbñîþ¡›_’2§Ü]H[T]±o%ëc’Š £î`> ¨êãçk¾©PŸŽd €eBxµ»§|±?W1Þڊóô—‰uï*ª,„ùôÏ҅½Éqh€Æ_uʼnðØÇT@¿Ø!ò$2Y -åKó?á=&ñþyf(_óùû¹9©k]íŸ'î>’ÈÑ ¹€óëÍdGq:K£Â2^[kqþÒMjìJ_‰1‹ð,má`QÆü•r  +Æ@1²/È éÇØM»Ãi¢•~ȱfªØY…Teï\ȵíEÿ3ýœ)„ŠH#¶*Ï©Ý4½=´…_ÊJ¢çU¤7&Ú½Ð>QÇ*¦Ž=_¶Ò4PmSš-·#*Rļh•âÅú?…ì »`&æ'½&%'¿—ÌûÆ[{…Þǧûé¾ëÏ҉—–k“Ìô™;;.Êr-HRybê¯Ç#Öw +nýk–EÉ»ŒµÖö!ݙ˜EÿÝÔ[éÝtÛm¼ÙÕwv hK´|.Íý˜´†x Ûw²§¥&ݜßZÉÃã1™ã‘9SȀB!ËQ G²žÆñ'YŽ‚Xõh0*YÊá ÏrhPÂrÔBˆBñ¬ Õ,0 „.¨Ó«Ð}³p !I, Bñàm±î@ŒA1QL(”ˆY–1A €ÁˆÔá‡Æî]¸Ýã[»äÅ!÷Sê_²eŒ¼E~ÕÑc`¶ÛïÕ£'”ïÿ,îðºIÃx%€É¯;8+‰T—%mD §(*g‡¦à³¦pfÁë–Y`Ðôbޖʷôýa§ "øÿBžg£±ìŠûÁØ0<:–=h¤•ãXµ7PزCXßÒÀMÜB®pÀr”ÁÚ¯͂ID¼“ÿYðšV;)•×W@âÍ Íҝ´4àûðUu¾ ŸSÝz _€ÎTBäí"*äÃá ßkE·¢ŒóERîuÈN6!#÷— Î"g,7~ ¦Û¢<– ¢wBá™3º%iŒÄö‹ï°[ðÅaÉëbÒWòl˅0eš¼ 9"ô8€¤Ñ[5c8?CÉMª²„¶¡Ïê2 z,4¹Z(^ð‹°”^ò{ÄáˆKgg|òúøÎ×£åênUÞñ'^Óã5V¿¿LóWünÿ$B8Øä°Æ./#¨‘@hä@t7\o„Ç×дŒGty‚\; +9Ëv咐Ë5‹‰e¹þ¹]k°d.¥ Rl c…ˆesÐ +aQÑûŠHݑ²iGäÇ5.˜ G@™RÚsER8Z ÑÀôŠtWÒ ß¬DµÂ&Äêmé&1°ø-:7Œ ÄѶ$V²xº0RB3Åq ۊ)º¶Í€)~È÷³èၠ]dÍ~k*ð ðm,v+€qi2 Úˍ¡äl؍àÈI÷Ö´y;”­mùèžc¡£y‚“—r•-£j4ÎØ$Äÿjà<ð‹ŒÈɸ¥•ø¶8]^¢x³…Z¢Oè퀓q)³ –”#§t˚Zowv€qÖM÷­ìFS½µ’Ü—åNòbPý1„ˆœÒ©«Óë½~8©ºS@䰖dK ‚£ÅÀµÊžsèn„*LyÄÝõ j‘3§g¢–œ„ƒZqvƒO»(p›IøšÀ™Î¾–öJÿ>ì;q‹÷³(–ö‚z#¡çH6§Ýì q'…$ã.ɘq 1·cg"åoų7äÌër)›rŠÄw=çÐNƒ bÚªAsjB@YÌEœcº ÉóKét, +ÍIÐ-A„sÀy|.¸ªôâƒSƒªQ¼tzó>ÜA|sÎ@4EŠa«šs œø‘ ‰|$"µ{üInÔ#æ…ÑC_ْ¡¨ë"•3ƒo37óØÄDGéh”)CdûPÇôëì%¹¢Ò,͍¤#CøzŒÍÙ+4ûtÑÖ86Tc}D6§s3Tˆ1vÆïëÙã$¸[…ÛD:€§.# ^]8fŸ!b`œyJwý%"¥§5d °~ÎL_ÞñÇ#, oÅԓáý§d<“”§kw¢Ô'âQ7 6à£Bæ£äÅZÀß°yï$VËõ[Œ$þ±C˜ÿê§gùf®˜´Þ¼®ˆú ä,p4ÜNzŏCóÉ¢/÷Þs9Ýٜÿ-ò ÞRʐãõx”B€·¾h†+cõaz¸þzâ¾r#,ýࡳ«ϧ­eO¥®c°4 hàC~ôílé¨æ ÁEé(¾BCd~LiR}È?êË´´tŒŸ¾¡@Ì,kƒI——ªnÆZüƒB±¹S³†G½=ßݸ’äC2+ÝaìÅ€ßG(º‚£¼T[Ôk1úӒGu)F&7fÓ'pÆ\RÇ!Ïø„G„‰»ÒçeeP3ONI Êbþ;@SuŠß…mêenU&ÿ2Im†`Z^‰æ]ˆé‹ž’^'t㘆mR92轈:r†cüߪÎzL,¹¹~$ËM{9×LÒVˇ”FMêÿ®Pœ.ó¶‚õî–| 0æî+|)Ϗ+müðÞw Íþ]‡cZEõeüî`¹{z‘¬÷¢omÜsfd‡ìè<*"‚”'Èj®)õÜvô•‹ìўaIŸhf ¼à®Éˆœ› JéQÿsÕ©‹zô5dÇ1‰*ʞý³óœÏÁ1Dÿä]>a"QþYˆ­ îÀ†ðOÈÇ«û“”`]k†ýùøeWer¨5®þLõ@îôgäÖùùhþ䢣üI»:2ҘÅ_Æ2kܤ²ÚO¦¹d´Ó`Šý,qk²~†ˆ‘Nˆ˜£~na=“~î`@ ŸGêôÎOˤÅÉCIù,ósÔ4ȗX+?i¨ ³¤p‘ŸÆxf6~rJމŸ|¾×„Î…ŸqJÐ;÷ +üL-®§ï3 Īl¢îÅxyŸ¸˜3ëY4É×'Á0Í;Ž/0ü”õYCÅي¢úƒn”ûÕ4eÈ¡>¥Ø„ÎÈš>/.ž*IŸý{­µWôÙÉ#èó•ÙÊ~Ÿ\Ï'°†Î¦͕ói8@nWµæ“Õ(X(¿Å|Ύf3^–,Ÿ»š½®SOù¤ü–>ì"è÷ ÉgJƒÈ'åO LA|vp8új45|¶è#|ré"ø䞴¼>n‘h{:ô{z‹¨R¸=ï Fûl¾õžîô Ì-Þs¶0Û'ô!ŽÝó¬ÅŒ¤À¤{ŠÞy䞢Pƒy¶@4E¸ç^íöTúö.ÛqešR˜U{ÞýÃßc*|Âuõ`™=y¡í¿})5ÙÓ\VšGG;±'ˆDO°'ÕÝäõL€V4%Ãõœ +¬“|ZÏ×΍ѝ‰ëétä… §Èê9”œŠê¹ç: æÖ,Lê©%72ý - ê邤9=ù¢;¼Ð’7ÓÓжD2q'•žÒÊ8ûz0Œô<+œç“쌞öPùkI pDÏËæðC½M½¡Ã«Í³Ù#Åeœ¤4ÏÊ$@ýÁÄ)ó4nEóíÌS›£øU‘¶keD‰•ö¸Y“Mۊ”°¿Skÿò k’ßùÀ¶ÔwcÝJøÎ\ìR8n+{çýÿéô¼BïmP–ÂލžüKO‚%KTÏ%å½W¥º³†RšÀïН³`@0®xaîä¯ê\‹Fz}¯Èü38!ë¶,w¾cÅLè îä~ åp’·ºG·“ÐX÷jQÛùva;þôØ¥…û­®O¬7#¹ïÓ[ endstream endobj 127 0 obj <>stream + zò“Qð$¯*P ±-žr·@f ¢eÔ9°‚²X@× ªB8¨BH"!ÓdE÷#äåC^WnÇë œQVfW”•ýú«—ägtFۑˆWІ•–šÑJë9uÛ2["vÌzP ]AØ uÔ_™%³+3"§“Ð +N(ªõ+ÊÂ~IýÄÍ;*&TÁÉl˜@ã1O€Y*à 6<Á…-¿ð„FT&ˆX¡Á†¦¥³Ùð T&À&耛 î&c¢BL«_Û±ñ[¾ß8Çï 4MÃ0!–eù–í—Æïû~aû¶oùé¼Æïܾñ–í›Â-áekxcû®ïXWÛ¶ÈʋO¨cüÎí›Â„Û†ã¿a䜦g{¾aø•oüÆs·%Ô¨œØwýâöÛwmß7úµijüžç6¿HÀìz†ñ{7¡~a "&äô["A„¾oü~kø¾)H1ž°sMˆ'„˜K1ÁžPËw>ß/<—`B&AD–EpûŽå{B}¿¹}ßñœ Ʉ $œHPIÐË°œ×q]Û¶ýæw>¿1×òKÛw~Ó¹œ×4Ã3Ïv×0žÃ3Ž¿ðœã/-çxþÒòÇx|ǹ}ßö}ßtL×/ŽÇvϯã"ölãwüÚö×2^Çòl¿¶-Ë"õkË"1{®ó›®gú­ã¸ŽÕsÓqÇr³sø¦ë7Ïgy~sžkَíŽqÚ~e9Îqú¥åx~i·ë:Ÿi¿kœ>¡@‚J‚û–qZ¾ß:®çX ÇñL¿v<Ïô+Ó7»ñ:žå—7Lˆ_¼®óºžk<¯oûÍsؖsû–sûí\¶í܆åùÍi›¶gùÍé·¶aܶqø–ßچm›Žk;ŸomÛ¶_Û~mÛÎéøµíضmû®a;ÇkûÅm|Æm 4~Çó‹çö›Ûynß¹Ïà;Ïó;Ïï;ï†ïø–ñ÷Æg +o.߶-"ã·<ßô‹ÏwŒÓvÇu,ã/}ãw,¿øã9ßómßô×7}Ç÷Kß8^ßùŒ¿5nßx}¿ömß÷}Ûï-¿ø]çï}ßø=ßôÏï}çx~ßù}ßùÏ1^çxŒÇyŒÇ8NãòŒÏuNã6~Çqüæ6žÏê®å·ßÏáÇeù–ïxÆñÇñÎéy®_˜†q8Çg +r\¿òœç9Nçô<Ût.Ϲß9LÇ´¿4Ëoã8Žç9>S¸ñ—ïüµqø~m<m<Çñ—žqÎiüñz~eœÆíZ–߯a8~c|®ñú®ó<ÎošÆñ×¾íûŽç›Æç~ëú®åø¦ç—¦ëÛ®_ú¾EjøÆg +´|Ûon×øL¡¶í×Îí8·éû½oŸ)ܯmã3…Ú~iÚ®q»–íØÆóº®a»†mÇßڮ嚮뺮纮iz®åY®cúkÚ¶ß8®ó®íZŽk¸¶sZ\×8}ß/.Ãømß´MËò ÏomÓøL¡¶éš®kø­ë·¶g§áw–ky–é9—_™–eZ–óû¥aš®_ºÎë·¶çû­í:Ç㺞㷞ëzÎkéYžßšžñ¼Æáyžëyžg\žç9žéxŽgøsŸåüã|Îñži˜–ãY†ç˜¦ã˜†g;~kü½o™¦_úµ_zŽáZ¶çzÆãY¦áyŽç7–g{–ßX®eY~i™¾ã‡ï9m›žm[–a‘š¦ãú­aº¦i<¦ç§íÖË/-Ç4MÇpŒÇ÷;Ûq|ãw,ÇùÇqÇð-×ô+Çr\Ïo-ßò\Ï7¿ôÇ3LÃöKÇ0MÇ5\¿· ÃvýÚ¶ˆã3…Û†cûµí¦_ێí§ßš¦a|¦Çðœ¿5¿wœ×±ü汝Ç6ã3…÷Žß|ŽmúÎ훎á÷Æ_Ÿ)ر-Ëò=Ëø+Ï÷;ËrüÎòmßw¿÷ ÛsýÒ²ŒÏhy–ë¯å~ó¼–q[¶åÇíזñ™Â‹ß¯-Ûs-ßò<¿·|ãò-Ëy=ÓtËo.ÛwËø{˲¿¹ŒÏÞ{Îß\¾cø…_óúŽi¦ßx®ßX–g™–ç»~eŸoZžãúžç‡íŸñ™‚ËùÓ/>Ï3.Ët,ã3-×·ýâõL×3ýÞö=Ï1<ã3…;®qØ~ñùÆg +7>ç3^Çð›Ï6žÏøLA~aÆã¦á¦c:ž_<†é:žá[¾_®c~ï\Îi9Æmûið9‡áûçïÙÎå\Îc¼ÆãÜÆ阾c؞éžiûµg8Çqù­åw¦iX~홶i¸~í~gú~ïzÆß;‡_¼¦ñ™Â[ÓtL×7ã´ ËøL¯qŸ)¼yn¿9M¿0\×ô›×ù‹Ãõ Çp ×0œÇuŒÏo\ßy¿yŒÃ9ǯ\ã3þâµüÊwLÓ·=Ç/|ãóß0×vL¿9þÊ9M¿òœÏx-‚ãö;Ç/>ãtýâõ}øýⳌãt]¿xçù›Ë¯]Óõüæ1|¿v ¿6œ¿vmÏ5>S¸ï<ñZ®g<¦qy–£@%A$ÎáüÅq|~ëY¶_‡gûÅgû~éٞq<§_úŽïû¦ó÷¾é›Ægùžçz¦ëœ~i:žqüžéü†aY†óžm8–m˜¦ã˜Žé—íZ–íܮ߹Žgy®ß9ÖçöKÇ1×y<ÃoÇ÷mÛð›ã5|¿7ŽÃ÷;Ç/,ËvžÇ4,Ç7<Ï/,Ó/,×0l×/MÓuË°MËoÇ°lço.Û1üÊöKÓ8ýâ6]Óó;Ó4]ã2þÚ6}¿6m×xm¿ó,ÃsŒß÷ ÏõŒÓ6\¿y]×o]¿uýæ1L¿u-"çqlçõ;ãq=¿pLÛv]çv Û·†¿ëœ–ëû­ë¹Æá—~mڦ眞åZ‚J‚†|Æiœ~k8Žá8§_—q8ŸåX†ã8_\–i:qøÆíø~ñ8¦c8†á8·s‡á¸¶é¾qù~qX†qº¶i¸ŽqY~sû®q * "µ<ÃøüÎùýÎ9,ßo×6]KPIÐç¯}Ë3üƱÈkÓñÇs^¿uLÛ4}ß±mÏömÛq-ß·¿ù=Ç·ýÂ1LÏq.A%A ×u.ËqüÞ°ç÷×wÏ7ýÞ5üÞrß/~Ë0üârž¿x,ñœ¾k:Ÿëú½aÙ¶iyÎë8§çÚ~á8—oÇq8¶íx~á—e[Žá÷†ß[†í:Ïåú½m¹¾ñ|ÆmŸeùžáÜÎmü­ë™®s¸žg8Æߚ&¿ë—Æᛆñ™Â]¿ö×0üÒõ ×xÓ¯ Ï4>Ïu¿t|Ûðkçñkçp¿ôl¿6}Ûóüâ÷<Ë/.Óò‹ç³LÏ/~Ï6ŽÛ±ÛñýÞñüÎ8L×3þÊn~oڎß;®kú®á9í<e9¿å®å›~ë·ïxžó—¾c~ëçZŽéz¶ß:¾ïü­c¹Æqø¾c8¿qÏã7žoœ®s{®qø¶cX–g\Îážßùo9®ñùß9–ãwžgù•az®qYÆãw†q8¦’ Á¦o™–㺦ãٶ߹†_YÃ]ãò+Û°ýÊ0>ÁÎéy¶å·s§ï»¾ãš~ëؾßü­ã—_Æiø†ßÆg +* "6L¿yß/žß3 * &äu<¿ô=çò,Óy<Ó&Ô9}¿sLÃò„{¦é¦'Ì/ $d™<‹Øù=S›P¿ð{çøLA‚ • 0-aÃ8'a§2–€a,a[‚ÌfƒÃɐ°n9[ü¶ãx¦gzÎñ{¾ë¸Æá;¦sy†a˜†ÎeYžï{@èN$>ù*–zÐ å¾óM¹;£î‹"RW•snenL݄ÌèŠR3²‡NßÏÿÖSö¹ ÐÓÈ*iåŸ{P(å +Õ)ÚnÊ­õ íÇÜa¼æ>JD¤©Û®úËЪÜY”w™IyڎʽF¹;ar—ù”;íYÜH}2;“[Zg½ç–‡8õ[ÜDy,œ¼(œ>lõ]jNlKçìOؒÛÚñºÁå³$âEô43ZYjÈ-Š›ç¬—äf âÕÁõÓTû5¹'jGýdf¤À†´õ‹Ž§ XD¢%µÇÙÛ쌺ULm©% +£\RëB{ò*ܓß¡ÜâðÉå™ÿ27‚È.9|ÀxÏ_¥cú%`FúÌ"”à(Û”«š!¬-xô_tCúJí¸uõ–¾ImH·crX! FHná°*ʪxÉ­‹§ìi—Al@dvE:†•µ–M¡áÃB–åf´¿èŠôЈ‡ÙigvEZœe¿ *}0 §ùåƸeG¯¤ƒKò¼ SJævì3¬€¬³_²Ç`³£)v©$Ḑ‰äö#ä¥äôYsvŒô”ÛOVÃêç)¶{ú.^’÷óa°ZÚ°*rJ¡)·µàrÞ(uÞP©³|G-Q8íƒA)ë9õ™\2;#…ÓÊô i¥±B©½ýš;Î0ú÷¬ˆö:b“ \>K-3h–Å ÕÏÁS•jqí2àƒÛeFÓµcne¾æ®óMÿ]ïè/‘¸7Bj·E‘ʽ)6uX¹«Üà©C£ö5µê_&Isԍ¡CýaìD{Þ/ڗȒWß/ʯ(RÿïɳrOÿĬ¹¯tÎ}Htö.rœ~lÇÜ-Ì=a¨)r⠙üË-©-!CfWjÌ-ŒçԇBiÏ'Êû¬ˆò= 3+ò22ÑÜ¢ºÍ-ê»Ð¢= mê»Ð¢üê6ýYàHý*¢>­§Ä–ÐŒ„Ôè–P%2åU„ ym©1õ˜nÊuݎ¦RbÍ}DŒè©dv´âzÓ?ø«vm=é2÷âPúËvÐÞD–ÜÊԨݒ†«vC@!íÂЉr5À‰r5(V»+ˆGÝߏÊ=A·!VÌl…—dV^9fIZM½÷‹òèH÷ÞoÚ¿vÎ,ðWåy¼$ߥSnOdC×.¡(Ž©s3õa=¤¶‚JG‘×ÑI¶‹ú>_uðw‚–ÎÉ«vG݆‡ÜW¼£Nû%yØîÈW°r£‡0?K&`FÚ’/13ò(5"¦F„-‘ aCÄ|œ|AåÆFtOA¥Ä ¾+'íÎxN¿¥[ò,8¢l˜PÌM¹ã|ÐîW²ÏP£ô9Ø ÿÚ¥hKa( +ƒ•ÅSò+6äV&—Ô_½eŸ¡ÕÓäuÔVÂÒ/?ÖØe‡Sªž§‘˜Qÿà"ÒYjI¿Ž¡¤!V0gARlE<‰Œˆ÷àâ%â嵁µƒ©mÈú²ºþŠÇރ+>ÓD„«ÈÊ2kú+,3çOòBêj†®P±¡ÔR[na—@ìŸ%ØÎÉÃs!±¡ ¯Ç)¦÷ƒ% ÊZ¨ùqRéš|*€Hpƒ§H¬(ÈLŽy…í }‹m(ë¡åóÄ¡5Fe";FÁtQ^¥¶ÄÒä”Y¢Ó~Æ +e–ö+º¶ØŒY¢“;2·"^DO%0äu¶{ò •þt¨þ9Ñ„vE´ŽN3·&v¥kî&fFW˜tŸé¨~ðGõu†Sß„ö½ ´' +¥Šá‘ñ§$es›ò¾ÞwøCâ¢ý/p¦‹âèS’²±EyŸoÚ…Tß&çÜilÍþ‚S +-‰õš< .©;^1¬„œHÀŽÖ˜É›ÌZ¯#Ö&çìo=¨ÿ2cjahÎ-Ž7ýg»©oËý6]RÆæÔs½iÛEýU.ê×ܞ½ÍåwˆÒ¿÷ƒò±3Jy™SG‰5õNúßxTnëFív°9Z+8±CiÃʨ e¶Ä–ˆ!¯)µd–öcnWÜD}Åè B¹:Ґ•—!33¤nL×ÜYfÉ-l÷äÔ©áÑ°sg‰=³°œÔ'áZòf’:‰Ör—©5uV.ªßzÔ§Ý]ÜPyZ?„ +‰½]†¢L¼˜û'õwˆÐ¿ÅV”½kpôP™%p‚GR3”»Ê=¬äUäu´ÊzM8\rmÀdO£;î+5ävç‹JÉ܈¶pـz×àhŠcl,9@„ 'ü’#‹ ¹¥ý˜¼,Š,©=Qcö&bÈ­Տ“6=M!`CÖY‘¥fĪԐ»ÓOIG˜Qdü€ˆ œPÁD†Ñ!¤dvÄÊܜ>+÷ügrHÝìÇÉ¥ÖÜ1ÐY5`" Njù€KŽ%’ØQ_©%ýSjv¡$\4KÄzž@ÈBpŠ€ œ%HP0@òj4LÀ”ÚW/¹ç„Gþ}á Š"C6Å|ËÝDŒH³ô<Å,DV +P‚œ*Pùi’[røxíœ|ÙÓ؏žo*¥¡…ƒ‰‚¦V7ztí`‘ YIĈ®-9£¶*,˜PiA”¢ú‘b3:Y ãÁY`„ ı$±cöDM©»Ôš»J-™EqÓÜc¹¢ëJ È)…f̶Ԑú1*õê%±1·%vœþÜLÿàOÊÓܐYYѵD†Ü¢Ì”ÛÚÏÙ×è”ú4@M#^É«‰Œ™e™5µ4^´çý¤¾ÎÊÝR¹:Â*w'¨4µCŒò èH}aêÿ|HþXýy½£ßu;úo;¤.ð‡ôTÿ÷£ú7žô/K^Wjʬ‹×ÜKdI-ŠŒ©“Ä’Z™2ëÚ9ýSO¡-uðɝñœ½òÊA•Ä¾Ð¢~ñ§4µü1B¯§$ÓEùr¨<Ï ´Çýž>KM©míœ{Xå +U®ïGýw>©ãQ»ÂÒ+å_º§>ü%MÕÔ¢¾ÕŠL5CF}p9­Ô”ØÚ¯©‹Í­Šœ¦cêë¥Ýõ/y=÷­dVDK¹M‘1ýóo‘9»/´g?3‹nu†R®H¬§‰)7”*ÄYE´–Û”ÇñŽ¸:7O>§èäm:¥çƒú#\ÌÝÌɟȒØÚr»5t á"ŠjñšY¡0úÏà–; ÎéÇÔ¢¾K­©Ëܖ»‰˜Uà +È:3Ú¶xK¿8„©ÐÂB*ánµ¨glüÈ@µã)%2”<À’CȆ•µD̈-¡aivF{‡•Ž ¤€àœatøÀ° +²rh Y5°‚œ<¸ˆ HbI}¦&•¢©E‡PàOr!4(ª0ä¿ô0Y¨!Šê`sÌZôdÁŒOSˆW‘õµ{ö$¯c¶ƒMÑU¤eÜæ4=OZAÖ­ ë4>Ö lz¬"b>Q1= -Lô„P¯VXàÄ“ÂKJ·L“‰L©›¯'³",«Bf<§“#Ê~†† +” Ñ£n1^7Ô µVÉ­É,¹}ñ–|‰P ڏ—.ÊÍ@ŠŒ¤ +ZjT9Àz€¬è‚¬'pÆ­Ę́%!ÂÒ2!$a°’á”þøØàê"‰Ž0ã‡.E×XÓw¹%y\r7™%·2¸¥6…NrK’ήäuø; +Î0:N±éËèŽQ:`3+Ši߁N”¯Á=·,²¦v„+™åÀ*²fPaShÉý„mɣȔ[^oÚ³rP]…ƒê9Bjw‘*ÕÚ1µ/¸ä5×£ú.†=†Ðà‘þ/r¢ý +÷ÔîxGeÖì5¨Œ²6ŒPT|bÈJŸHê,0¤!>^Ò7Ñ!#3Ll†˜Xbӟ¦VíÞvHCL`Ð]æÆäU»å~Slî3V(û5å¾2kî67hϺQ›´ks“vanJ¥f¼Êà–zÎ'í¶tO$f„Ò°"jê°*Š2ñRö$\Íæ¦ì{C¥× +$Ä-b…J¨p0Y ä% +˜Aé&2”âL%³cÖ<ö@i±L@‡ò ŽØ e- ²^P#¥2[ò66©+•ª¹E§0¨v,±Ôˆ„¼Ü”Z h„®ö Ñõ]!¾)CW `Û®g¯ÂAýsKã=}²Ÿ( Xdu€ÅFØe‡ j‚®!b@YÕoh[ìÑFÀƒì†(ˆÑÑ17¨\;˜2híX3²v`£D\Hì ŽÙ‹Ï)ݐ6ž A)ƒ ¦™ra=°Ž×-#l èºÚ-÷˜o¹¿Ø˜¼H`H9°~~¨xÈ« S@è § 6EZšqûú£‚9EP)7 %­!§5¥ž2cú%`J¿BŒuËx‰]cvFV!Ï”Š!ÒoëA»&`I߂*Š¢-6¥uª?EtOQ”ö:D)ï¢Xí¾tO?%øĎ¥š©—x1û/êû~Ñ߶«Jý~Õ)8ÑlG X:’JbÉ(UÊ-y5uØRß :badG?Œ¥n1Xõ{½£¿ÅPIj×ԺԜYï©«vKíkçìi½ç$2÷ÑhE™Eå|R® ­ék¨Iê)³%ã5¹2ÞҏÉ%u2$¶&·ÔE^FkL-êËrÕ.-GíÖtT©˜ÎÙ á*ºÚäšý0(ýAÈ9’‚é¤=ŽWý{=$©áIÊÆ£þ+´e¶÷Üw†Ô¿œò;ߔÏõªüŠaÒ_ãIy™[S/‘)µ-µ¦Îê%·°ÞrÛbCfMdK-¯‡4ä÷;rëI¥.˜ñ‰š_vü°Ñ)ù¬¢-F~ž.€iîl¢\¯f·Å¦ä¶xLîLnɯԔ[›œ“—©=y\Oú …Ñnøôo¾æÏr;jkrÌ}¥†Ä‚x =]0ôā“@*0"B d„œ|@(7E*5³+º~xÉ›¾í—ôSjDÚ Œp0=†G Èè!rÃaÕ»ăŒÔ­ª$Ž¹Å6¤Û48ž*8aƒÉ‚™ž'° ë‡XÏ íÇ)7•R;b]lË}ä…ÔnXa+ÈY9Ø(µ1³ê­•Ê “:ì§Üc>¦oó=ÿے?‘1ù°¥n¡Æhm¡=w_ðùßÜ$ý¯Bâ¨*´äÖĬ(»ÁÕuÁJ‡“†–É,‹á%’…—Œ$ -€`€åE´‚ÊFRøÔgnKäe”E‘!÷‘XÑÖÄ6¤%Qó¢É)÷ Z:‚lpý,µØ”ØÜïù÷‚Í®J Éo¨²’x!­.7£¬ì—ÜSl=O0‘‚èƒkÌM©Ïè’ý‹Î¸¯ÜŒY˜O¹½™ûèìw@§ÏR[ò-4ço[þ+4æaÕóTӈàC„¦£)¨ôç°á‡F6€V€ñ2╴š¼˜Z–ØR;Ò2Š‚©5µ> Tß Gê¯rÊlÍiÁ-w*§ÔŠÌÉ}Á%µ)3æöeë^ 9Åg¯r +âr+r +Ñ26…P5·«š´§©M¹%\O¤õÜ_»&¶H|ngìP9HÝV.ºËtR>œþ2¹ä¦ÆܦȎX–š‘ÕF§ÌòÜ@ýP8¹,³!,PrÁaˆ¬"XN?ÄÊɟEýÛR_éš»É yeᤅãÓ¼b|º £Ô^£Ô+Ä]MdK~Æ{ú+n¤Š!·Q©«#DúQ‘~ž!õ'y 9y` é¤;Î'õo„UGxäU~Ƌî,Þr û)·,ÞR û%µ7àr«Ò-·4^ôÏ *…À÷£NÉvPn… (¬¢¨âÒ_©ýhá”(4Ð_„**e{N½xÍj>f—Ü]nK­08õ_ÜT»¹”§É-·(2æ¾ëQ¥|ÀhW(”vipË­Œè©¥¶ÔI´–üš¤/ÒRúdz l–?.¨áÁD“Sfe<$·t0½@‰ ¤VB8¢€ˆ¢¤ä`òÐÒ3hـ²à²Ñ„†c‰E÷µêÀb…3x˜Èð" +»ì`b¹í*Ÿ‘¾Âóy¢áYwCå.ƒCjGXÍ-JÌɋ`1uX”[Sî-¸äVTêBb³çÁqú±ŸRŸÑ%µ3º¤n2Cê/3¨/¢†HK¯àh¢]x0È' j|ª,3åS.ù„ëIûá/i_ÒTmW¤`ÁB,àÅX)¯3¶¦/ÂZê%^L=…¶ÔjP­#TOŸ†S +®íÒ35¤?`”'£\ØnɧЊ°XCM5¸æv•kò½Ÿ´»ûý·Ç`ð8£rA¬Œ}UÑVæÖäk¿¦¯Stö<Å%ïµ5¼¤·;šJq=¹Ô]-¨€˜@¸ˆ RdHÝì'k‚Æ# +†'tÅ ‰¬¨0Ò~xù4mP›F\È(—›ûûMyÞo©ÝØ˜/¹µÑ1÷›ڣȄ ê™?dnKýf•Ò@ÇÙMATö«ÛQ7ñ:fMȎZ_ðéó~ÌŸñqò JZ}>jÏb¨4%ôu{½ê_ëAû×îÉ㑤ŠÀ£!3·'oƒƒî5¹¦¾F]¯ÊÝ"IT.ÎíÁ(OJw!• Û5yZE¨©×«öàT»/n¨þ08í9¸AêÒÀžØVt;S“ê·•¿ Vù;Gþ £nK÷ÜnXý±1µ"¯"¨ hvø8yIû•õ¡AyØsç Ø:BªÔŒíÙ÷zHR´µé¢:ŽGíw€JÝ:?†ØÐéÑUA<ò[ÜP÷¤ ênäBÚï©> ìh·©U{XTkC;òƒ=¥©`•ËÊ5u“™2+ÛIy"´—ñž¼KçÜMÀX1Qí°‡oƒ‡ºËàjYnH&péÔ6³d„šRjCM4;£¨œÑõtþìD¹0x˜ýJg´Ž°ŒžLÀXºeȉ‚“!' 1Ȭë†4†C’Û%àóM»C¡´qCågä(qq»£îŒÍ©Ç؜ÙWnÚë|Дvq>¨Îí‡N¾† +§.³+óZMáxGS/´ç~BöÜWbK]…sò­^rË 2ù×®éÏ.?N`„ RdÊííÎxK„‹ԇ–ÏÓ.ÈÔc¨Pò6¾ (™‘éç;ÚS¥|lçäW`Q®çN"ºÎô~°0» 늧ÜI`G,%öDLÚÇrÕ©Ž:3«™¡U§^jP?斴¦ R}UN© ñ*²®ÐŒ²47æÎûE¹+rçÓӔ";jG`6„Ðàˆž:¨Š¬¬àh¢_zžNdJýµkþ(®¢}6Éñ$A‰Nµ´×ù¤\ 5EÙÆç ¶{þ-²ãþžÔòÔ¦§©ÅSnqr:ðƨÇ08ŽL^̧!ÊÅý þ ‰Í€fÊCk¨é¤f„ +>pèôM`=MwŒ %–®Ù§ÀŠ¶¼ðxÒ> hãE{™”o™=ûªg–׫ê9Ãi6÷{BÁxÏ«‹›é6øƒn1ˆ!jJ‘-³«œ³?‰%õ–Ù’Ÿíœ>­çô[:§ Fý܉ÁBF¨š{‹l:Õ£J‰X5w“—ÓWݤRÁߑ”Å£ŸEqʧ Vý8P^H|jo?'23ʾԘ¾M®Ùuñœ?;NþGƒ%öÅ«ƒÃ´Òà‰ö´Þ“W‘5µ'0çžÁÆHKâjnc=&¯ .ùWoɗ³0¸ävµ[î«Ü“/-y b„®TƬk§ÜúŠFZÑÕÕC^7À™î;!SëbSfYbRßäÕä]tAXšPöäÆ#*fg̃ÏýF8õq„Ó÷{þ,´%ßÁF¹ÝPÃÔOȤþŽ°ú{ 3å[;$–Å–Ô…P.ë垼š=óuH%^È«H´%î mgnHÝ$f¤£È–<Ííé¯ÔŽûN航@O˜ÊÒèŒÚœ1K"f´%‰·D¡tª…F´­Yr,y G,"«‰™“ +î‡é&Dî$dCK4¸æµ(œrÁ¨TLíùÛÔ¢R¬ÜÓ_í˜[]p¹×‚I}fg”M±Y_nÇí*3‚H@$%à!dÄÊù§Ä R.¶¥ïÚ1û—ÝÐu¤Ö³Ôê!¯4`R;#zÒ`´Scê5^TJ¶sò9àR‹.õš]2‹#<ꁾ#_¦£ú+”'a5³54j¿ë!uu„U®Îpúß ©\pª]â“+Ó=}[/Ê»("ù?(~HÁÀAêŠh%…H}¯'í?¨P+ÜsKÛE{ێúZÜPû*œúnhl“O0r¤¿‹ŒÉ›¼–Ú›ʳ(ý,ŠG\7U®‹›j—dV$ä'T>½Ðqê¶sËBù¢”_q#åYÜDœb“¿ýœZØ.š]1Dâ}X<µ+ÜÒ +ÂUäÄRCjY9h7¶“þµž”§<헴¾xÏmLGýu>*·‚JǑMŽií¥ÛÅCœîäT{œ!TW隺¬çìE\AQ8Á!ÄC R¯±M»-\U*¦£v…B(¿££Ì‰Í-O1ú«Èû%COlšúLmÚ]ݦR'hMÝÕa;¨)ïBÇ©åÉa^sÂ$öµsú#^C× ,K#f?NB¡S»ÁÎS‡±Õe¤pfc¤`narǨᔻó9§*(Ñ  +«ðøâ5ôd¢ô$û%w—©ÍÁQne¿#–…ÖÔ²tN?ÄËH»auÌb@CäDƒkjqŠN¾F ¤v†EW”ÜOZoyÅBy ªM `1¨€™¡$¿ìXŠÉ±1T0õ.’ºŒÊ=XTò3” »Q¥V4¤©XIê”þ¹ R ó!·?br_qÓìñ–A`•&–³‹AÌqKÂ¥ÔMȈ²&3¢lØä +‹L.îçô];'oó5ÿ“ÙÐNÇÜxŠ?$XQµ€†Ç’Ë ¹ó€Ð©™¹£Ø†°.8#Þ‹” ‘µ¤&ôô‚#²o”ýoØôk¿æ®>ýYÏÙëxG#àzÐLÔ~¬^7”PpBP'pEØ5¡¨Û«‚ºÎ5!ü°À&r;b52Šâëi"™ E­zHݦg”å •Úœ™…õ˜ZÕ.©¯ÜŠ´X: >à‚‰$VÄ´ê%¯­Ÿ‘g8Õu„H?ЇԽù)MåxÔææÜÊà˜Z™œûFû"µ #‡*¥.y–™Óú’† }Q¾ucbU7¨þgÚ°#ÝQ¥Û`pªÝgºó|ÑßçìMÀ’Y,)/>µ8V8³ÉQݝçÞÁf(ˆ ̨‰†Šf_6ûOúËxÎ>Æ{ò:Ã#?†Nµ‡¡å@éJ¶=Lt<”^>eÖƛr@iŸ3œòÂߔçÁijQ¥<‘ØÔOìzšîH$dDP17&VÆ{f‹Ã§öOµ¡3åwB¥öB+GÕFwŒÊÀÚÑC&…vdJ©—f<§6(„úàL¥Z9'¿2[n‹Äf%÷ódåóƒˈɥƒnaèHyt Ût¤~m'åºÌ¢½«§ÔgvFÛ´¢«‹ÉßvU©aUJ‡8õmA¥•L,ŽÏ­ j·%) +È ›‘a%ÂÎõg:é/csê48§îÒA{ÜrÛâF*ãm0˸è0ÃIækò±³¥Ý/™½“×Øïxåýœz«W”½³áÃåfÌò|S©àÑT0õetEÖ Z4d?ãS Ožì‰BÀ&j²K c̎û’ÊÂè~®µaQ74ҢԆ¬ \DNì<ý^h‹A  #.䓬ÇìetH­Í.©‰M÷Cn3Ø5Í̪þH ÙÝJ%#6FwԮ܌°,µå¥v¼ŠÈ†šbtF(^±ˆGÀ‡®?V<¤.£+ÊÒ~Jþõ;jiAäD^S«Ý3Ÿ' ¬hà¼ezz¸Ø–×XϹuýÙ_QT®©­é’þ›`’Ô +"Ò‰ZSKÎÕê)µ< ”WA¤þÁ Ôïý¦Üsâ5tU™-w- ¦šÑ +ôQ¹0rª\ 1ù$# +ùàáÐHÁ´Ž¨f á/!µÐœ=«–4dE‘úËؙúàPÿ8Î-Œ×tâ@ŠÍ)m;¡—£„5ôäûQ»@R·Dâê©= +"Õ× xÄÝ!Fû“,ߐ¢´_‘9·+tŸí¨þ‰Ø”÷£<Œ(ïÁÔÉ EQ8ၓµSnƒÀªÔÊ¡¼ï÷Ü]º¦–DfôD“C>Ý|Ik×Ϗ˜Zò)כê?_Ò_"u]ºeÖµcò27'OãEœ䟁LFUDÖÓCÆkfuÁ¦ÎGÊë‚Íl/Õu‚HÝ8Õî +I^,Ú²zG}Ä¥ÜfƒÄÆТ~Xí²¸™ú2v¤ý ž©/ +jw¥6dqíøÁâY_nK¬ååÝi9¤®N°Ç*ˆT)Ä©”̇ì3´høèÖßÐÕDmȺÒ1w™O™Ý)6µìR÷&xÄý@‡Ú‹°ƒô¿¸9úsˆÑ¾TbQä(³-t˜ú‰l™}å¢ü ©»ã%Iݧݢ“ß)>{ߐÉÏ삞j@äÎÒ=}OêÇä–Yܓ_ݦþ MºƒR¾ÖcZ]nȧvžúå_8¤Ÿ…£ö%bǨSwå¨ÿÍýqD£ö‚Léjg\òZ›žÔÎ t'ŸºN1Ê€“$ÅCœruB¤þ·6!’7Sj9Ð(±.\ÔW1Dr#¤ru¿çÎûE{"µ» :{à©ÿ†Lý„vŒ:yAõœÎǼ!µR—…“ö®\´¯É5ù×ï¨uÁ‚({iirÉmK÷ä}@)¿â&ªÃ؁ò¤hò«Қs£¼ºÐiö"XCMq‹ORÊL©Á1÷YÏÉç;°xÌÖð„°¸ª†R ÂÆG+ , áÀyâvÜÊ~Ê?dvB§Ï‘.BAÈb<æzÌk uJõËOUÊÏxRî®W•þ†ÈxÎ_ÆCH­÷ì=¬„¢f@LhǬÍ÷üÀéo:Eã%ÿ ,Q^d(•Ì„¢>p1Ê $°ãv¥[v]nÉCÍöU©±„“J'³"« ÍHπÉI0¡¡äbKö58§ÔŠŒùX aKbF-‰™v¦ñ@éCŒ‡¼F‡›Æ†]Q/ØÜB§ó=}]p¹çŠCz›zœ -µf~ž4P¢†—›’Ç™?Pèäî‚ÌþÅ[î/: «ˆíF ‰5Aºvp =¹xÍ]8tú5Ÿ“wíœ{îçôwÁ¦b7ôdAÝà(õ—œñª>uœºÛzOþ'|ú$l:Žtp”L8`Q‡ÖOØŠçƒnq°`Z68:åÐiE¡s¼ºä~„ÌvG+QåŽÌ‚œ^tF,íÇäuˆÓ¿ϴ끎”ËCœrUfJ=ÃLœQN‰ýùŽ¸-ˆJSÜùDaTŸÁ-±ºKo GÀdyk^ Ñ,=hVJ´‹ƒ#:zl°Å𑁕œeN´ˆ¾3!ü kn4å*O\5–JԂ¬'6"l Ψ½°êá²±DÛ|Ðî©dÄ+¹M‘5{‘–Qö‚ P”Ê,ÉË~Çm‡™Jp IÙ`ÓÄ@!ãáD‚ö%BæeâöE³S^k>hÛ5{ ­ž'¼G“T8 NàäÅò¶ÉácCKÈ‚ÅìcdJ!á2jCÀt<}xù\+€Âb:²(+À’šÒ \6€¸èŠ¢f@¤–„rgnÌ-‰¬HÛbKþX>W + °xV¥3¯Ñ!¤dvÜÂäŽú ϸMÁ]K̆®jl¡ih¹Àò²°úªPÓã$3jUjÉ­ÎõB&?³ŠÒðÒ„¤öc-© iKhCؓš‘§Üe›$€QфY.ž'»B\x?Q5 ÆÑ0P-°©ÁDæ¥ ^@Pò@ =.hÕxšàEƒ*Lèm=6¼z fvÆíVÏSM“£é«çI„L*·ôo=iHÐxdm?(ÄÄHÚ@‹ՙF!¸Í &0O^=O`=P6=¢, MGS¾ +¡Ç‡Ø !"f< .¬t4Á.7|x` A•ÔŒÖ2Kã=ùž¯ÚÁ-yÝÊí£ÜYÏé³àŒX•®ÙÃܘ½ˆl誁µÊ9¹17å×聨Ä|pt- Ät0=Áý0±‚AQ­àPÖädUñ»Ën(KRºÒ28˜ÞMP©d–@B¸†°ªœ² ³Èøрä—Ž± &°ÌøAÁ‰A&`©ÁdÏìˆÂÀò±Ž˜ýXEÈ|¢2PéxšÑ%›‘·€ecéfÍøQ«høàð‚ŠÉ!uš_Íï§ D+ +ƒ˜"-3BÚ¼|У*˜ùà(¦¡ñCC ȪRCö"4Ÿ( °ì(+péêÖӔ!†Ãiƒ,Ǔ«Bj€lxù8qxý8¥ÜŒZ .L@Ñ1ú@³¡ÄA†c W¥ ´¤j†E4m]Ž¦6A2Àl0½41zÌ5"±àÊ«`(]píp#ººØ”:‡–Ð5§øüOìx4 õ0e@#5·EÍ0=N8—1;‚ÖÃäÂëYjý†¬n3”vCãUXDjaÀãµÕKjSnEÛïÙõùŽ@ÀÚ5} °N5ºcB Â^À²qtAvƒ*2rq!õ 6F­‡–1 SƒrYfO®-SÈZp’j1zXAifup„Áˆ1"§“™Kc“î,ÜÔ_‘5÷˜N*¥Bˆ4‚M ‰Å ÆçGˆ–Q” +©ÃàÛÏÙUéœ]›ÛtÈ +m¹—Ȑ[±£¶Dì˜Ñ2ZGÀŒ¢HdFP1ßr«Ú%­2óZë=·-SÏýž>L©—Њ´68èï¡E„µ@¥ƒIŒG“K؝ÙõÞOTËèZ‚&„!ÂÞ*B.`ép +ڎĆ´'lEÚ׎éËxÎ.1(íªÔˆ´¬r4Õ49˜ThÉ]•{N©rÏXnF½Y•dVtýzº€•#È]ƒã‡Ìxµ zò຾àúL©-± =í†Im-h¤­Ù)õÚ+#²ŽˆeE`EڔYRwå¦Üš”;“S“ëb3Ò®zHÝökþ¶TêD¦ÜKb̾æöüUhʝ¦ÔŠh!¯TDÖ&ÇÒûb#H®Ê±Ô!¦ƒ©E'„eÑakxG†G´…á m3¼t4€ e?´Š´XCÙڑ߰ +ÊJB#…–AZrBY¸&†’WOSĘ́xù j~°tLO” „Í †hKvÜctÇDlÇÓZ8ˆråXêóyµ ZFØ0"k=ƒãÇ=Ã#ÈÈ+©‡x im›B*˜ùàH‚UxF„ X@Q$bFÛ °¨Ø&† ¯K&¶!«.‚ˆÔx@axéXÒðÚфb#’ˆ³(³äîÁt½kf$Á~G¨8£¬†•,1€D ¤Å´.2”.´p)¹Y3°|¬µM `>Põ +„q½ÐòÒÀ–Ė{Í-*õûU§x@iû=µ,”× ‚ªilô gnø cv,•]W<¥Þâ1ûPʍsÔõ@gʳ(VùÅêO£;î-¶äOâ•äA°’zWÕ&Çôo¾hw¤rIn<€ÄèŒ×¯¹xù8¼Š®17çþÒMý—.ÚÛ67~ Ô„špˆM-OŽR BÖãã%gdbí’Q,5å·Kᅫr]¹ê¿‚Hå9ȑêºß3«3”î7BjïrKnWdNþöì]fQèCâIR3ÔÇù »Šbt‹2S>•È’Q-´§ž"{jy¾ê¯¢Håª(N}ž¢ôçŸ~ï7í¾pÔn•òzÁ&艆ÜW7ꐳh·u›rW¸§îrK^Uà@{\pÙ«tLßÆ6ÁD¦ôKhFYݒ§ñ¢]߉ûJZÏÉÛxÒîŒ-Ú]©)ù—ó_å¢S$°¥^ÂåäG¼X’ЬǴ²tÎý„-ُxe/1B¡ÄœûJ÷Üm¿çÞJÿ]R»Ú%³<à³ïà‚á2Ү̜}Ú¥Ý’@PⲂ`éhÒàÚáôò!·:ĨϢH•ŠåªCh—"m…™ kIì¨Ôp»êÎýyÁf_"{µŸ,Xfô _x4¥Ð”}ÌÍ)eB3ڊȂ¢drÈm®GíævHC`9ꔉLÉg ²b ê‰âಮԒ| + ¹ÇvOîP(û%¹"4Ÿ'YQ” l¹Wˆ‚Ê 2^YlGÝÅ[ú1:¤Öõ;f7¸x,i„¨Ht°ÌÀj";bKdI¬‡–ñځeÌVPíâ!¶ˆ‰[“…Տ†T—uDF„‰e7¸~žJjCXQ‹ 2wP©UùŠ®(7!¬ né«Ô’; ™‘vÌ(k£cö-·äÎB[ú$\J_)1|LÐBˆ.¸nÉmpghü¸°‚:1‹þ®œ”ÛAyÞOº»("q]Üæ¶Ü’°œ¼‰×Ó/ñJnMÀŽÙ—ZSß!F}) ýŒOî ‘ö+(ê†ÔQfÊ]ÆýSfI}$Ft•Á)wâO ğÒ`9é” r'™µ$hAP"f>M%²¤ÖÆVÂ퐆¤"@8tJ±~FXyU‰í".Ž57gï2¥x@§TÊÌh…¹)³#±¢(|‡ ­I­`ˆS‰Ì(Š$Vd%y%w- §²@BÐxü0A+r’Á)µ&3ãuCK*¥†ÌÒ䖼‹§ôgÀ¤/ó1uWOyeñ–X×ÎÉëzGS58'ŸRCfSjǬ*çì]ºg¯óM»9ŸT +ƒkÇS­M"f=P2:äþµ¡%t-Kî2¹ä¶ÕKjMjDW1¨ِuu“ú®Ü”+ã=y pÚkPLêÚ@äó~O«ŒÍiU1¬þ:õO‰Aõ3(S“ve»(×ñˆ £ˆäã¡;åî|Ô!*†J! †œ -·lŒÖ 5Æ(Ús»âFÊëŸÛ›!T‡¡Փ0­8èR{ߏʕí¤ý P‰›Lâ® ù„˘M‰)u˜s‡¹)õYÏÉë€Ì>§èì¢(B¹2v¦Ü7Ó.k§äY;¥vGxÔ½ñ¨]™NÚã~P}ç›ö7À$î7G¿(˜;îígnϽ•“þ»uŠ¤vwˆÒnÚE¡­2žSß!R§z@iWµ[^U;%ÔîíQ£\ŸPɳrÐ,ÏGí…Á)ïÚ=µ5žt_q#ņ sä€s仸‰ê»_”Ïù¢üÚ}±1÷|fh‰,‰¹=ù¯:åã)‰ §C!–“vgjП¶£JÍ̞~dVe‹ö½Ÿtÿ Xaªýõ”~a¯ÇOLJ7HÜÄ#.]Ÿտכî%ZÔm–òJÂåĖ¸¤Ø×­ª€“ÔµíšÛ-#Ô ,Ú« u9șö(ŠÑ]Eñ¹½ùIõ pš]q#ÕÖà‘ò$µ!/:#23 +'õi¬PfAXq¼æà ±Å⒟¢8Pa³ãуG44¤©\NI3۔Ë9õšÛSO‘1³¾^R—†wŽSÛÒ=³¿ž×eK’:yIù+¦uÄ+ù”ûAy›¯é÷€Q.‘*¥B3B½tM,qøÜa¼¦6ææÜclOþíÙÛبR/ŠÕ©:N%ätBÄ4ó5÷ +2AP¬ärËø0‘x±(nœ]*’ÿM1ٳ،N=àÓÊÒ£¨¨´Y–-$èƒ`0†Cbi¢d3ó €SF.´8ŠÀ ñ-†"@ó´éÚD6æ®Ö‚uý™N]±XÛÐ#ð;¹pP¬ºã _Q,Iñö•ÈÊøŸ­áf‚L!HhÒ!r~\¡+óŸÃVbß*jÙV9Cþhýða|q³öð{¹ô§ ³‹Äv +TXHu` ¬aòY´vr ÍhÁ—iwË:ŒÖ7rô;Æ+¨–ØØPÏÿÞi‰`\ }›(‚7c,ú®ÃbT 2O }ĘÚ° +`„‡Yrf¦lSfºÄ½> SuJx›Pq“<¥Òïz-|èhÃÆÛNjèS¦öR*S¤_¸Ž;°wq‡ì·€üÝvÁóÃ: + +=tð]èUËbþÍ`Õ8–øig•ü™/}ˍ¼kÜ\ÄúLHê‡ì¿Æ ,ÝÅë?Y ž ´. l wˆÑà]ÊbТü:T(±>MB µV=‰âm/-叉Oü•¦øþD¬JA|­êù`Òlüãˆ)ËÐ2[­BTßqàîˆçÌ&'eeÙLå´¼­'†Ó¥W„*ÍŨ E-°…0ÕìÒyÔçs-£Fx¢kjLXóÊÿVd +/÷c‹ÕúZÇ([‹ÁwÙè—ѐ¥Õª‰Ÿ0H`6%ÆÅwCmS O†XK×z|Ô°‹éåe!Ç *iåÆ}ý–§,©&ƒ àåÉe<`KUŒn>o±?C֎Ýt¥oPÏ(æÐ&ÀG(EWµô PèòÓ¯6œÅÝo{\KôIeó´ëßRv±ßÀp½ÑõÍ®ûOo€Øvn¿ÁÀ†uP„ÓLj$uÙøý|î`”ˆ]Þy·OÍ£å¶ ÓȀb~ûl€Z\¿úô,{5…(ê_r¾C“DöEø·Ã¬M=¿´<ï¯3„ÀO*s[Ã`˜° j÷Åo®¬BR¥à"¨K—Xh¡¸ ŠÛ¡²CÁœáˆŠÝ‡…e1ÖÐÙfŸú? +Ñ£¦<ÛJ é1yˆÑô(’–æk¥ÕV 6âQ^Gþ0&ô½jޏû.Y†×}ù Ï7ýbá_°ß}Ø%|à3üÄ®ðt\p=´{w«àFÊH±ž°`¥ôñ+ñ¼LOÁ‹nki˕º%ÿ¹²¸Q ,Ü* +*0TԔž7-&Øå¥ß£Â;±ýÐ=DZM°À‡zYœÂ +ÞHq!ÅZnDÐ+ÝïÍ{7؃x¤Rcrƺ‡uÜíUmdÓ¿Qü‹ËR¥¹"H%C(AjÍÆÂõƒ<ÊÓlö ±G’!¢­;öL³ë5Qnn˜®†v“É›ÇÊh/\@©sÆh1½ÚÉþ¿BùÚÙüBTù[ޕSԌ§5V…G\òQÂý1'&¶Ë4ԙÿÏ殈¹s»úEšp¹ˆ ¥{™0£û cl"ùÓ!Ðbp•—äŽîœƯ¡)ÉÅ1½ +5zJŸ¢Ög²S5š¤Ù_x®ÀVéatï4KUR¬ÛB8c?ÒšYŒû+áAz»Ý.’×fõ®zpìˆNxƒ­_NWk#ˆù¡›nau:ã)¤ƒ.» åµA²ÈûäˆJI5®Ëºƒí2Vÿ[¦yçêÎõ*%7¿sí[°{S“Ì ÿ‹~!M‡˜±Y›ðÎ$„F@a¶÷9Õ|¬–Ú¼Ô9ƒÆå)=g6gøÙëø£Aøñ!|´» <ôë§û^„£2‹Eî6w'3•GÛš¨Y´5F8ˆKðb’Áeœ`8GóD”ß&®cÿ”L»û ¯&%Ö]¦d* {BÙ%(á*o‹ÕâÑI¼Ñz!âöœ 4Å +y+!)0´Àá§t#Ò×!+I ¡&‹Â,o:dm.J¶Ø9Ì9Í´ÕÒ!=móDXôº.™e(?%ð&ÊX 01€$Ç¡_„2lÂ>§‰ ×ñ‹y=`ÅôËRÖæ?r=0­9ã ‹ãQôČêå¢|s<%™cù\u›jƒÝòPz9Yq'î'ŠüOÉCôÖ8×!–ÒÚj‹Ø熦…ðzþC}G?¡8õxÕÆ5ŠÕÔ\T’:½—Y-»ÂµûÞ³ßxîŽH˜ˆÁ9AŽtbÝsZ­bãFïHT!ÏíÁ< +¼ Ê/Ä%+_stµzxa¨}]|¸åˆ!¡¾Vç®Fïí>Æ|¨…ûòèµÌrÀèR´õ²z¬2*—?…„–$씅 @x„žî¶ôü—ÊäWÒPbèn0HXᒏ…п !›Ð½ý‘e\ €Z2ÿŒµa¡¤'åðÜÝ«n +V1—§û¼Ç~¿ôã@rКõâþƬ›(@ђ1¿Æ„4~/g¨ ²®…¥Š¹å‘˜d‚C¢¾òø¿–‘¯u4¬ü­‰H†a#áÞR¬2ΉÊìÃ?„)¯* ×Ð۞eA}º¦í}dV<›Ðƒ²´ªPr¼ ²À–€‹Àäj‘ª}]1<>ËWԘÏ" X¥·#ØÒâÅ=Öª¨º•Be4åñ,)º'þ;PB‡a±µË>ƒ¹-N|õN…ó ¸Q¡x8 {¯'þ/Ë%¸±»äºÖ9¸9z%¹­%ly´OÀÈåë“AÏʘèN¥tÄ \P·çõì{°aôiëY²¥ ev'64{©Ècò¹Ù¯ä©,¤Ž¶ü«Ê©¬v7}•) ±k¸0u.†õì#Ì} c<*ót°Ó[X œ˜¦5Ý>®ÔÁ’4Lj r qsâ’âÄÁàü t›`"-D¿M¶4– õ¢EN¦õIÁÓ@þL` )f×¥’$ô'¿ÙƯŸ™”ÆÔ)®7ꏇ%ø&dƒ=Û<;œzùEÅò{2¹~ôqe1єÏ*•–Ý^¦q‰”f‰Mèéj3—¹R@[D¥›[µz[Òá6ùT0—9féªq +uö¤¾Ac÷³°»|«¡K˜1ìL;]¢2ØucöÉ՞bTl<ËdãŠÍ¯_Û섍DTĽQ«ðmѺ?s‚NŠ ‡)ÞÍÎ-㬅‘ßà÷ÝvŠµ+m~¥G[lŽ^†Ü·¼ÜÚ@åø(<ë>ú?,Äïм«Ù,8A®Õ lƒ!)ÒOôÛhu¤!Žq¹!Þ;`šæ™„ Ç7&ª-¿Ñ›3ˆð‡ÖïA£Oo$,Ä£àW„²¨`'•®¼ ¶o}mƒ“äƯ‰'ÆSÓBí¦qOQhíc[–ó›%‘Å2Økø\í´¯ ŒG醢™ FJãy㹇 Bª]ÌP(Ùd36\-0 ¢$ï"Š”ØÒ.ÇH&"¸ƒ´ÀÖ0Ö™ýÑÞ¾8ľܐ¬Uq‡‰ZA”M֋§Ò!ºèÓ>Û¶Aè$„^òRˆü*£šºâ xq7ƇðË͕觇¦Ê3äþHÌ ®Ð|ÇçnAãMÙçՁ³Oß»¡"ðœº}b š!I®²#Aàš¤Ä=:ۂ±qœë«äÄ`5@8¹O–ÇÖtQÀàž„ uH „u'NЀÉá¼÷«ßÔ+Ö$k,u “ëâ~¨ŒóÀÎÕÚ]Yé5u+üˆ–9ñ™_Ž¤q†Q ÃԊcœcF5®Ö­à†#³àWnGç ÂÆ1ôX /Ŋ8r³_ãq¤ÒMI+R†‚eò%ÖºRÛxñšÅ´•ŽDڛ0JÛªM¼Ë`…ëÃ@˜H„ü[ÍzE²tˇi÷!_^Ö#…IJ ˜ ++ü%¢_Ë{6-ô&íά¤è¼Jk0¤ö0¬îð>+Q©ýž²ÉCZ±”ÖKšm<¸Ž¼–IµV@C²tÕk}ZCÄ¿~âR8¦ëK ž`’mÕâŽuˆS™Ú^ªíb44ö=FɸÈ[Ð^‚”……à†Yee=œ»`éÔõ†ɦó®1ÄâÑy]ìê}ž7¿`m‘ºúÓ)…U&¿b-A­¸x/{M9æÅö T´½´³Z§ØMĽZ‡kÔ@,´©N߯?ÅI½è“$ÒÀmÒ Ï%·ìə¿t‚!u]zºb¤Å©Ý|¬ üŽmzªÎ1^fãs&”©&–D¿˜âPRÈ»B²ò_H~lG¼ïƃ<óp õ°œ_+á‹Z†|þ0Øk¢ãÙ¨øŠþ &^ôÑjðրgúÈ;̽hº`®*böބ ÄBèH±ã?Äÿ7!ÊŽ +óHúnW2ãÒtx¬úûOjà ?õA-_”îŠL±Ak¬ÃɲÏ9S’æW iæ1År|-Ì䚥É"tŽÅ+fv~AYÕÃCñiòòJŸµ©­l Ùåˍ\ÿÒæþˆmF0‰ê6éÐw¹>×ôÑzá~r|۔n^G!f’J¡Ë½UÔ9nöX)¹Jd–ñJ‰/³];@5V»™ó ¨»ŠË–¸ËFõ§Í_R>õ¾|r¨³\œä&W $­ÛµÞ¸åŠý5ìØÃùÅùåôV™ ]ä9HdŠ ]‘Rñ°²v1Ðï¿­íà’[É5!@.¤}iÖqÖ¤˜ôöЙ†,CO=ÄI¿™˜Yà–>û®Ï!£ž.Šo[Pq‰ãéœ÷îR]JtŒ5þüÀyÎ?ò/úãZ΅$a8¨ÞÞDå9ìéù¡1¤{ƒÑsìÍ@1¦;³vy?Õdaî? ‰(Ι`[äV\ÀBxô³²rÄ:€6Ó˜çåT¿E¾© V"¦õà’%:e e~«Ô€‡Ø5·‘PÏE1 ùeÜÑ;­xzÖáZ wë34í؟^Ÿ á¶64BÓxá2K±õ‘m{¤Wz{×¥%'16Lá’&c”Ç—>x‡¹-§0\µôՀþċy!Ó±¦Å… Å]{“¾|iOԂÊ…LƒÔÕtác\×X.ìGÙ}§ÉuKcË]Y8eø"›Q/b­£A±…™Öâ$@ ñß¡†iWÞL*·°ùš Ñ3Á•€:§@am’r–ƒ #êÞ8'´t¡>aHž”ˆÄ&¦h0Ü#÷¡±#NèFŒDÞ ›]üØ2gI•^-6 Í{åëЉE&i÷ÂùJ*9Lõ šW#óªøì$_gBò9炬Wވ¸MxŽ`U†¬ÑÎÖ,M š¼AéÍ‚éu)H)I¢ùy(bŠv+r¡å¿! t©ófÊx$§0 2·R“ÜlaÜ#À`Ùá>Áx>MÀÄ ynˆu!gôã‘%0-ö †ËM4ËÛÈ!Zí‘97½o:(;Ýöý½“îwÏlnê…ô?/f |КØÍíþT­™Ãíg®ŠGjßÜFØ©èCA“â–ã‹ÞþC8°HÅ^c +e§1‹ô‡¿#µhå,“¼þǼ…ªŽåýÍDÍBñ7;e?yBñ͟‘Ó1õîÅÓ!!§·˜Íˆ<£—²î¬”Žš[F²ªµG$‚t¹Ké-g(›qMG`ù¾¢5Ý\+ sôÛ7€ˆ}´.\>^Ñ«e:·ŒDdV/¢Å‹~ ǕßI21ÉÙ·¥ÎxûÆ삱¸­š·îü ªÐ +ºçiˆ|µ'$oËvï ÖxÆ߶\Láò–ŸxH¸凁èyöʼ˜&dFW|9Û¢CcR®ûªŽŒý¢kAÖø¡“÷Ó3ź`tPdµ`£ >62|Þ,õ‘qóÒ +ZŽ{ý& :½c· ä +ßk5+_©9€¦Z–½AK‹“–œ?Ñ-é5™Cú¼g•pŸ‹Fûöð¡nçq®š:"œ÷ï""W0ð:ûI0Ž¨WR®±¡ølÈÎÝ ¹B³ᓙÀ ­kæšDc?Îm°bnw=0nÚÀºwÖ)ݾ…‡}žH¶æZà¯CÎÇS‰ìÒ¼&™uìÝð#VÇ֌EM‰Y/Ûø© ¸iWEƒ°+lnlÏBðº4XÉ-…G @Ïeìš,r¡wÆò^™ ¶iL?rg‰÷šâ¯eâÃ-ÿ€¦j!þ@H[Í‘˜ »F7O}:žpDkÒûc!R}±9ŽšM[©þ;Žîa¸Å.YÿwÌ‹ ØsÒVam @ˆ„ñ"jf­·)ÂuB}¾ð¦È_/—•nŽÉ¨Q½UÐ KúkïfÙL*Ï+ŽU;#=~»n‚B*hÁŽúœl¬b$ ?3¢{}‰iæ™´ +@¼C‰ÍI©‘*êûÓqŠ0¥Êû[l÷-(Mà‹=Áq¾x!¼"^Ù ¥ª`ø²žU꯺͉•$&«c¼¿@%,ÍN±Ò#pe\AÁ#¢¢ƒ¡ÿøíš–x­Á9ÛÞ:†}„ÜïWôÂÆñ£šh}á½.T£Cç?ë*9±r¶â‚‰¿ÒV/Iþ4‰øœ"R¤mMÁ4Òm( VÇ ZŽµ@~@Ö¾DJîRð„Q¸€Š%æ5„Æù…°ào„ Û®×,ç4h)ý/£ØA®5ŽÉIÔlW|Ûz[6w‹R¯ø¿¾Î'Cõvà-Ç­ês'g¿ ”‡ÉwÔÁûôqø³ùkYœ¡ÿ„j'#µ n ù úâ¶^¸× +ábÕ稜þ- +z6òï$¢³d°;×s֞ñï¶óۈU1 +j8‚xÍÃ^œô\^‰ŠøÂþtŸPÐÝ,´SŽë¤uC+o[- •¬þY¹½ÄÄéÚ¶¬kš8õd~}§”ã*^~ôB3˜°£eÿ€: %Œ^¡áêôü_®"çxU«à‘—žKeëø¦ýš PŒ7ÏâóG-ÔmSønÖÎ.\«Ñk˜¢Ì-K¨Ôv3'tP¾XÃøÊ8£ó©PDybí4•ÚÚ"äšZe"×Bû¸‰”&£¢}ÝãÄ°Œ“,¤0`ivp”–Áúê"ÈÓa@œf®3…pPdŽÊ}2ˆi%Ñr œ‘"ˆ˜L€èˆ§ŽÀÿ‹“ry˶o‡ùÏþš_õäw¸ÿ oJíUX_dL¯é_ù\,ZâÊüÞlgÕ!œáaé±E ú6âØa‰ŸÝ‰<Ì¡Œ‚v=Ú_î‘áÆ9 ü[(ŒM³€¼H 9×['8X ØÔ§M!qFŽ% ÷õå –îÿþéL5?ää4Õ`Æ%†E,5c@jXCôŜ’vf& ævW¸Ç÷vÒ€-êÚ ¸~ôÚQw:ûòœòj׃ÔŲ«°B‘DâÐÑçûƒÏÚ·ƒ¥ÎJ1éÃ]®=põ¨úi´hìá…c:þ†(ôV~øVƒ -:ŗl ΆÏ~îëY’{bÉIŸ5ñˆ8̌ëª.,ü¥hÎÉEؒa&ðL°–‰ÒÑiRcSUÃAð7µ\JØÏDújátàÿ|ÆGu–Yc<[ÈçDœï ÃÞ¿kèzªc *U:II¦’¿ÊˆI¾xtt$|óæ½8:4ýƸm£IèP@Gqñ`‰ˆßÜ&:ëòÉôÔ,;­:j=òBe¹ R¡~ÃÝd ᥄pn£æ?Aœ£ Øt†ÜXæýÜÕaɦ¦íBºá ’AÒ }Í©ðj²^gò‡Qó‡*6ÌHjÚ۟ÅC1mžSKeî:£mJØò¨¦ðÄ'»]CoT¸?òy¨÷ìtr•0[-º6 •è¼=˃¹òâXj÷€ÖBÖw¬ƒ›oÛ*œ&Ðn;íe\¨±Š¥ìڔ%7£«?€¦zJüì…,÷® /“R!¾ðuè؀t)ìL ÌýOجc£Ä§/öÎ 1n"†™Í¿¼ŽL4÷ä¢9尿Ëzg­¾™,ú™Þª^™‡$MãŠÈøÕlöüÊ ‰ýs%^8Ìçž‘~Þ¡dÐ/ìkØN£Ä7„eDqþM¿!Bɑ’ÑSk2.ð?iùYJ.!j@Y¾€*/‘9;Å¡…³\ÜL8®Lá4MXù_¹^×ñ³7‡Æ2ÀµGRj‹®KÞUp[€JÈ>p« jwìèKñTp,9¨kæ; i(ÎÃh—O›`“­qJ0 q㻳\è;9˜)¸¸È`déqs„Û†¿éB¡šŽ÷A +¤Œv܊^,Ï9,ˆ‘ír⡽ +-ڙj¯òjÔÞÛ§µl‡5’"EÑùÀ§õØ8êƒ.I=íš—÷ìæ“úŸ86„¨Plr½ÁítìS÷¶ÈH±,RØпá*š¿Ó÷ E¼aW\„åsJ]t»´n÷‹vl¢ÝÑ;€Ü·C›Çù8{ + +g¹fc]9D´ ®°™N%R LÉC2_Ì­t{ÍؼnÈ­{"„ÁºÊ}¯BƒÂz&^|ã…+üþ¢õ”À‘R`¸ØXð D1« ëÂV +êx.*6¡b>- +çJ*:0½YEµ8ýuw@ù£Þo0°5¥ÃÄ¡¸Æ@ »úʑaʃaž¯ûÖ§P©53>ä)u…T…n͑"ŠõP©f<‹Aù²cEŒb„Xj…˜J ½œf?LX/d§Zÿ%ÃQ«A¤„(!HÆßDß%‚Ÿ7ô÷GAŽv¡¢F¤µ”ÿDÀ&/F¬V +©·³,æ|±>¶S&"q܀՞ˡ›ˆIGáä„qaæZ3²8€uõÃW0-ñÑAƒÚ+K è>`¼™t‚[|—¾GÂi!A˜«³Ø;íJt¤ã€ßÀŒèÛ,úîõðï’á7 Ëp¼o>DeͲÁŒ%ü⌞L»Ž²TpšLÍÖ¥øI¹.¸¹äTÂòqôUÊúØ¿ÊÅÿhº”‘à½d¶?›¾‚€reaC^… +*DIC\xÉ;(ÇHÉùñÛªª*ZvFüürÅ;¯5ÜbNùžÕ~—4*Ӎ!ÑaÇS­WÀÊ7Ÿ$0Oħ)üWÙ¦UsïÑ×-”¨Ö{:Ҋ±—î +½؝&î ô„–M.ŒçI`£#RHúYvH’2v שFЖÈx]Ýc ‰[) ÇY™d¶~‘/b¸å2ÂìI]#‘ÜD}R?ý͗må_Qä)NJ3£'/ùã©ÇXjә'潋ñ›n lMiڑúrvw2C±XCð'ùN–Ekô ýØ€2“G#ÉúíÐCfãјGښ±›ê$Éãd+6¬Žr`„Ïßñ*Ï 6vs @|RýyºP \iç€50FÜím”†).öÆUÀ¾QOÃ×`q > φxqB†R{¬Ù¬MÅ U¶cÁ ¥š"6³†VÜ|Ø!›ƒlÉ­àètÛ¬?Ú1>ÞïꟊTŸŸÐ½¨'nøB=Ï©‰­ñ¬¨9B Ž?v! !徛0\Åbû¬Ö;VJNpꁆò£x’°Œ¹DœGҗöÏØVi†€djtSÑ]‰l¢­‹’æÜ,c{O DÇ«°¥Ð\@0ˀÜ]¶ë — +â4ü%ý ©ÃDÁ¥f¯„Tm™|ø„Ž®rIŒO‹dë#Á4‰¡~\S­·`ÄRßÒ-TwÚt iÊT0tԔԡà¦ÛÎÏÜwGòÓ$¿=ì£E¦o½ÆXì †NìðvR”?:VŽ0MŽ¾:ýW(ÂY_Ú9ðŠþצˆØð‡ÛöeܧE¼UYSþûréa¤%yuAAÃCö(ÈÿñóY±±Û£°,8»õ›´A ƔòÀ P?; #*<YIRjÇ$ôÙëý• õÄî­C6Lˆˆòž€7QÀ൥ŠàHõº¯(ŽØ‰Ša+RÆqPN©8atS•Ø`þ‘Ö•`ìmi¥ù•7\[Yƒá›ªßQ§?–„-½[wпÆ&úòT ZtE¾µƒ&fݏÕ‘ØÌ¿æ"4K¦*äxqïPRݹ+Bò±kèq3Ê?&‰CV#ÄÒ)Œ’Of`¥B$ÿ{™^=BH·J0” £qúîþŒ4bÊÏ°`Ÿw*¯²«!GÈ\pÿӀ *Òw<`lãJñ» <ŸíaÔb(½Ç«âAdºÛΦw‹JÀrŠ‘›ÀÜbk¢4°ª¤ã¡Ró!±ø!é4¥¯1–vPXL®f_°Jæ·җè¸>ìÍ_@ˆËù7™œ·Iã…–&à ʗ’ÂÀY[hèY,§ªpµƒ×Dú‰›ñH'w:US +ºÎ8ŒƒãwÂ8J:öÏe­Üƒ0w’<>ˆoî~«Ääi€_ÚAíñP‘$鑃IºÙ/MBvbô#‡:msAFDq¡ÍP‚nE‘eYJº‰‹Ï¾à®T]Œ,Òá\±ˆz(Ãéå£@:q6Á«\'¦„2ÇuÁ5ŠÉ_ð5戹[úRg©Äͤe‰(†_ÌYôJ™ z³]¨×X°…nÀ.Zjx‰3Ž*» +»W–¤1ùuº|HKai8}Âè’S1þ¨/_#§-ȱlÉû¯åëâJ>l³KÝ6mN¬-Štßo”¡ƒ;pë¦â­ 0×t€èõxeó Äc³d÷QºNù…VÊ´ùûwvÌë =õå/¥¦’þ™„S@Ž”qĀ”Bï»V,úåPëIÖ]ˆßKIS§k}͵IíùŸÂj8¡¾³ÐtÿA,×Ýp3”j(Yî6îÂ7ÐB‡X,_´E’'çä h5„•G;¡>z«Î&mÜ×Ø´‰TWj"¸¶Î/¤c,Ö±Ò ƸsæeG_.”ü¯Øg²Øô!ž€[Fgn?*Íã Ñ¿˜È'˃‘lEÐЙŸJØĸW/úð˜ro(È´‰;æß3«W"˜Ñ—'ð…º×*P2×IÙ͖±o÷&Ù#¶*waÞȈ×|†L^†ÊيÙÝßï0ŽE®&b&;%Á‡Ú ]ÂÏ;¼]¯·*ŸKs<ß 0íèŒ5°Q±LIϘ~T®|‰Æ² Ü ±iN'0X #œ;}ëÀ`'êLÆÜNÖëݙ!ÂEé O ëhØ¢”RЅb1¯û˜·Ãbb??n¬ß_DÆ©À>–À;ç§G˜%9£Þ W몜ÐsÜ:j³.kôŵ -‚sûUڅ§I–]õf«¹í7QVÀÕ^Öδ£›LFRŒ;½“›_vR»²6[ƒ¿”ÓMŠ¼£¸)F ½Â]Çy^0rY֛á_ݛB_†fêÆØ (d•Ã_û¥eeq=„CJf¯d`ö #?¯€&dE/X{H²ÀÒ.Ï¶ƒ¸ôì¦î «b=6j‹ÀHLŠlV=ãõ@Zcف¹2PE4@Ìf†\ó8ÄvÐÎI»ÿJ¼Ô?IØ#¬¸‘n>)š5íf^ñ™Pú/{Ù"Py—bNâÞ_²«ï)-Ø¥ú£1©z9΁i5ûÿ’YƒpEB’À €sûÚ¡¹ù±ÜÝxîVY@¶¶ãܕB®±sÈAS’mVîàÉ †¸ |© ·îN¡4À92¤ËöÄÈjÂNaïÉÆ謙àÎڙ2&€FÁ +`›Ÿݳèa@øÍEÀ,ÊMÞBÕx`p7JÝÚ@ ŽÒÃÕh•À‰RqyÈÈ-_Ø—¥l¿I˜^g‚öŠ£uq‡ +b Ùāk}Ï/µu‹j.^Áø3_ÀÌâ[*945ä'|#”½;¬ž8²©qÚ‚÷Nü.Ye¸ÈŸ¬È´·JƁQÁ npa¢”¸zÃL3ú’s¾Zd“ &2‡î ÿ7Ì^`tl€íƒ¦0¸–0U?Ór±t^m\B$öY=¬·¸5© +®PüoBaÃö´C(K¯üñ¿Vs©·="âñÏáe(mß$#º¥êi²e„«ªbK3”º¡È@YbÅeSB¿P-½+ sû]VîÌ?Lǒ´ø³„2ª¡?®†cð7š£³N€;‡Ž†#ã.òÎ:{wÛŽÛ`axíâ+×àê<ÿzyî·Á…>Øá8ÖSˆÄ:‰ªK%-…¡Ía÷ÃGOò±¼Úam‚Þé;õ&¢þP“2€Ù®á}å6=.8H'  “ŒÞ%ÙQȲÛX鶉ƒ¬eßÁ— ²¯5…€lß|Ê0!/Š¸É½ p.c"ƒ«Vcn&œóbUÈ2Öµj,º×ôҐ4G†  ß6=ٗ‡¹5œÉmþðºêÌââÃfي eNI˜ç«X=KûEDzLOyŽíèZâØUØÀ`¤]â,µ˜h¤Ý9»>‹ˆ^ÁSOËŒ„¦£Í¬ÓQæYWËÈ©ot1msq\ Îéüo: £À`ĬtÝùÐr™Lu`©Ò_·«öÅ0Ž2„’1¯3÷u^xè%…±hj¸ù¿X`F0VU/'û6֛ÄÍ7,ùÁí¿X(6½Ëô"ÑËv”;¯ƒ…Bæ:yê;¯ÑH§Øþ›:꼄†±h5yç;/t Eýł#k™—‰c4åÕðU^d奙àX^Õä.-@©yyØм"æͼÒ(•¤ÒyÝ%‡±¸Œ0(%ä%SÆB‚搗<Æ+ B^Uy]šTd€q—gb,Âñ‰`–S0»\Œåe‚Còb Ç+iº"P¼ˆ¨ w¼vÓ£Aêñ¾_Ç+@©Cï]ð¯22Àù¢~ý;^£•>_v©cÄv¼ª§x¡gÇË©ÅëÌèx«ŒÅVÕo\ÇK¯‹ÞÛµ7^^ѽ⼂Í3ßz°FÜ&¬;/{ðUJ6ÖÀä}ãâÎ1-jÇêıàä± +h‰ã.ܘÃI Afh„̬†¬Çw#²áYdŠÕÈÜî#k’ EQ²«Ï’™“·& :,Ž…¦>Y` e2ͱhC K3‚µ„ä£ì&-0e‚‹*‹ñ~U™Ç"üE¤ReŽÇBEY™1»2zìщc!K–•Íã)W¶ÆtxÙ?lÒò±L0W{eX&#bYuíÊ°deޜbrÎÂp,HÈÊ cBQªì[^0¨lí;pcÑ©.e‘// ໔ÞÆB´”¥E³MZcÑϼq)D P/PØX`PŽ€ð)»ö6ÃS½RænF™º¹Æâêås?(£Û> ’;éBÙT}¥ʌx”am,Ö]›B=‰R˜¢8ÊÀû6y–J„²î-,e6h.Ð|ÊÈ5@ÒPŸn,´zV ¹6NŠå¡%O™NHt4º¡ü¦>e{k)Ç5ʊˆŽ2³¾g.eôÔEȬ”ÑYB#…³&xÇE™m>¥ ê¦}TÊKY¡O™ž²w¹c¨SvO™8‹ °»tæJÙxړéƂåZ9¥,±óʀ)Ñ+ ŽE±©‘jš1Œ@Dæ¡Ê€ñ+KVW&„cÑûa­Šcá ˜‰YÖ»ßXPÈ­–Éõʗ •6KfÙ 7h4ËJ·–¹ø-ƒç-‹¤[WàXh†ÇÞXtEâ–ÍŸ;¨e´ð»eî™c.3í/¡(ȄÆÑ"=¯-:âËPŠȒ„ÿ.+d.ûp,îÊeu1È¿q—ú^v>¶+f/È~c¡Ùluö ˜÷²6©¶Õ7¾LÐpPðÅ¢+n,šâ͗Ѷ7*ɍj m nHº±pÚ½¬í¿,s6$Ìô‹a偂þË"f/ûÜXxGŽTò0®^­7¨ÝX(yZßXø¹]v+ÿ»Ëdrn,øy½ËþšË~l,зÅð©U.Ûã.{°]´¸ËÌ5új,@¨¶¥8º …´Ëfnw™Žj.s\얽Ÿ¹ì€+c}³Îe‡ /«ÒÕ8é5ʌªÐ„À à,ÌøÃLxý‰"9–Bsa… NÂÌ4cAmÏfnvf˜}+ïüĬ“ý —)f‚£b1×ã¸ð Ìa& ö'¨Ú +Åz d˜cÅÌÈ>cÞµ«ë1SùÉ,Á—™Ä7³îšy>i&Dc͜Ô,“Æ¢nÍæN6Ú|¯mf;îf 8¡±ÐNŽMà}$g½4Xž¼•›³UÅÒX¸Hg±µÎ +´aÜïì +òL»è™9³g0>ó˜}–AcÑwý,§þ3™Æ¢Åm¶÷Œ ¹Ö AãÍ, ÍÙZ¡úÐЀDK-ŠfæiÑÈÆh5¸æhv´Úœ?š9iUÛDÒLÖ¤©À©¹K…vVZsãk,˜ÕÒ +ùÒÙX4ÙݜÛÆ +hx6Í€ÓĦӆö¤söiU/¨YG‡ýE­Æ€ÕÆb¨USc¯S«ØXà Õ“ÿÚU5E{Ռ?«Uk,ð«…‹W3p`MÈÆ¢ˆbMiRÖ(a·êÚXàꆆ֭Fc7v;PÛM"v7éŒEù7¡#ÞTÑXTIÞÎgóv¤±X"½¶Ö›¨Æ¢´½ÙÃX,üÞÊb,ôÈ·À¢oeß®^üfvý&<ý­@úoP e\ápòÅXT /+ÿ$F*Epef­' +ptŒ…K\pÉX´v Žæ˜bô—“ŒRpGËXl†ÛÎ}琱PHה}š±páú'57ãŒF„Výisr€Ë$êkëÀ%,ŽÔÐX0éŒlg23Í7cr—+ã C[l +Ü4Q3Øh,|ìŒ琙¢Æ¢]^ΰÆb0àBÀí«±˜tâtªõXÜ-Åhÿ[þF67ÎXøé·*MX’¿Ñ!®’Øۧߒ&›-þv£4c¡¾>ˆy¿ù*c¡¬ü­ùÏÚÅGà^î¿y7jÔÛÚ?ËXø«]»(’ëjEîÑæŒ=3šç¦œ\‹^t©E¼[– î’ÊXœ8XøZ‚U‘iÊç}Àýò@Še,Nµ>3tÆ¢) œ½Acá ÜRaà +ô×QYc!¸¶1Ëœ¤ˆP’hýäÕXô¸õwà›àHô‚Ë”(ˆOHX g;Ƙ)pBáÒ,Ütb8ók8™Ðá +æÃyPˆûGœÆB]â2ÅaÜQqۊÆBR°¸RÏçâlÊ@‡’a±´š±8c‡2Z‰+’±PŽ«.cøÍ C1õ*+÷¯€H +9Oä„d,ÚýýÊX„`QÌX]rëµä´eɉ('ý¨Wr˜c©äî3Û$׌ÅI-x•³ŒŸK˜C™¡ÉuAŸœ J1ñ“ÈX%aŠ)%)G {’r$É|r]L…/sR®@y½—d*7 ªÌOܕÆX¸ìU9;%m¬xhȁQå¤[‰± êÊAåÊÑ{+gtŒl‘Çõ0kúMyDpå(•¤Ò˜"'û‹E#ªœ!*uàÑ»58eV……ì>¦a,*ÛRŒJcfÞúç-÷…]ã o­C•wáÅÈÿ᫹ÃHhrc,4ÞnÖ\×æ’b,ª~ŒEßI¾¹½ýæ¼[©[¶ÍÑ%"/2½NrsY`sÖ2rs¥ƒK +çìÅB,ç¾e,úÔ¹:»sJæ9𞓉Ÿ+±ÀtARÐ9<¡Š±(:XÓDGæEç<ŽNéRÒ¡hJ—²-42²mº2ŒÊÙé†ÿéCÔÉc¤.Dš:x^N£Š±Èßԕ?È4Œ…£5|Ušg°‚ÃX¬4ÄXôý<¶5uªÕÓ\c,Ìéq⇯¤/ž±9ªS=HuÍq³Œ…í´ê€‹ÆªCU­N&­NšYœßXá<§#ÏX²—±ÀH^­zÕ`ªk9ð ó~&Y\ݓWÇr"H9ºcQJêä£ +ÄÕ½,ä'q‹ór|±àpº¶‹0]æ—¬WÝSÁBP[,.@‹ÅõŽÂÕ͕,?ouíWðVç&k¾´XxÖ ĕ¬Ã.giˆ„0,åÉðˆy+_{ÔEfÞ°Ù:*Ãj­ÀbÑêÇÖéý,¦#*ùA""—ÖŠEŠÏº’”qU,4ó–T,ÞÍ~ 8ϺBÿ= +e°u«®uê‘C㊆­XXÁ Ìkp~ÅbáëB+÷¹è¿Ö%=Ø:™+pUJ  ù­kЭC°y ñŠÅŠÅ¢1n]ϔ’¶ëþ›½®AvÉ,•vô±Ã‚ƒÆŽ‚ Ëj×M°X ÷ÙM]êh'‘í‡Ú-#kWe±øµr‡r°Ïí ž“Å^¸X,:帋ßbÑ@–ž÷æbv…ê)Íî/,6ûQv±¨}ë^,„w/0¸ÞIt>øN’£:K~7êÜßÉðÔÒÀ“ÂXtiÁ³c±®§…ç c!™×£\ +—·ÃË +c1‰xÆÄC«âŠ—B>xj¾ñ6ãÉÊ}ãp<‹|Ìã¥ðÅ¢öÄ$Êz¼èu¨ÆX ¯Ê{S) ϋ¿çÔ Ôû%Œï­ŒÅf‚ýb‘H/”kõD?Ö£gë]Oâ‹ò~=i¿‹5橞‹®F{ŸÁÚ#‚QÛË ßžYñ¸gGÎ^„Ù=“x/Æ¢r½—c±é{êïI„±èc>CØ_… %æ·ù³Où!¾(*>c›ñ©Ëãkم"Ÿ1l”¶›|Æ´òúåSƒæKB"çC`Ï÷Mè3 c!lôl郃±Ÿ¾rÕgë €€â 0OMÝ)Q OÞµ¡rÃB—ÙWßç쓱¡}•w Y†´,ƒÃ‚_~à†E[ŠW9®˜ö±a18Č´ðN PѾRÌC¬×ç¼ëM@õ2ï‘ôfÃÂÆI¢Ý°}ÎïÍÄS’ö!oڇ„Kø` ‡ 7,”¨¡Ø©. i| àÓ©}`”,b±ãPÂs™ÁiN ušgGfɊڷ¾þnڗB.F–¸´/°„AÚã”"þz‡Å%Í¢Êy¨ªQ§€zvc@ùjc¦‡í›Ô¢ý Ð³Or¾‹MtëfßôáÙ7 ˆö…žÿ0 óaÁrDI±›‚H8t±ÀGIEö±ˆ í´ª( 9Ăóy˜öe¨¾%µ¯¶¹TÒÓHTûÌEí¶IUÁ´%™KˆE¢LÝ Ú‡dÚ'âþEڗ3ت!¸QPXô´Œ€´O—ÈhŸMD(}ŠÈzk¦ «@Ä ´/³Éù²úCw‹•š.ÐMê‚h€ }^?ÂTýÁͬ‘†>€÷*¦ Ð>tϾ¤ý¥îˆŒ6‡~¤³OL‡XD }ΓXèg_ÖhÞ +4ûV™}&›ÑÌ" ‰ºêÒK:Ó²o7bñ¸Sö•.b¡ẗÅp‡ì‹?„Äbج>Hcæ!&I%°ÌâIfŸ„Ä¢xÙgÐV'@úhÓ샓X4Âì3( +XöVöѝì+!±à’¸nȾ©~Ä­“Ãؗ1y+±/ðò‹}‘Éf$!±Œ +Óxz„H$ö !^I,Vkîa_O$”XÐùçö ÉÙ*Gb!áÒû¦% žâ³f/Y)‰0ìkpG7Å:2Øk"ñ±èœ¸G;¹GSÄ"ûöÉÙåÄ!e·Ò‰Xôb1Eì iÝQÕ°Abt”"±¯lk—` šR!+yX1báÖðtä²(ö&bA®d¤Í’B§cì«÷ç_åd‰LÁŽ·€4q¹"öËøcß­ˆÅÀÊ|ˆûúTS Ö‡‹é¿) ”SEdùh©¢hA1ߚ$×EYë7«õ]Qú$U¹õS¢ˆˆG„\¸¾¢}®¯.o}l}W»õÙY®ïbÄ"ápë#€õ@Æm}˜»õ{¯™qØú‚S듊X4‘±€ªùÄßðµõwõ#ö¨V$.ŽXµ>w´¾Êˆ¶"“‘jV±€ÐÐ$#­®Í³>ÎÑ õ½‰±pýˆé¿2ŽXÄ÷÷3iÈT>#ŸI:áãõÃ@•ÊªõMº­±¸©›¶¾*I®Ë jl#ܦo}Wm}‚ØÖ !Bõ -#Î\ë³±€²­*­ ƒ(bÁÛú "#zŠcH‹XxP­/Ý â¶>š9#¬.¿=V¬³Þßo}ÁÞ4¥'Gو…¤‹X°ØúÌlF,œÿѾTE,Ž×úćX”%ÝW ÿ¥½­‰»Üúìb¶ q´ˆ×qôR rëS‚XĪ.!¤£®ÄÜÖ%óÆ&ƒX´Dˆ…„:)µz¬™¯õ½ðaA€Œ…¤µõ •o}*9=,ôÆõþÛ[Ÿ1ãFÏ0ÅÖ§Ò`ˆhƒl}—VŽÐ]˜pÔ,üð‹þ¸Ö÷òâPù°ˆòeÖ§÷y(ëºY_ͶNëãS­ÏýaA± õÉ;äÈC‚n „þ°PÁœ€Xd³  +±¨§z‡_³>oÇ !ÒˆEEÊùM }kôT×F«~Oë‹ uÁ"ƒXDè5@ƙ ¿v±H™±ð2õ¹ÑŽÌøG 0µ¾·E,ˆ“BÄâçþÆ ûA·Ö×bKëÄJ8ĶãïÂ&!bщ­ceˆEíR­² +±p­{èÄB[±HŒòI64е2a(ƒX\F ¦¥é!qË +±ÐLÝÒÜÞR Æ&7¡Hë2Ä¥Ö·MˆE('¡`™C ü׶7¾Ù,–­ï³ƒX©õ¡ÅÖתm¾õé:bÁª?,\œâÔ±0%rèI˜q}™6×g3X0»|û°Uü°èlèŒëÓ±x6¸ X?·¾–›k}³ÏÖW¦cÖô‚´ZŸÌ¼5?]o€¢Ï2x²Ö×&ù¡a‡ P¸ /µÃ‚É­SÃõÙhØú֛^Éâm$vX˜€H =,r³ù„©õ•û°P/¹«O3cq}\¦aE?,âs}ڇE×7÷|ˆr}z‹ Íóaq:æü×wÁäúò‹Æ^âúê­¸ +ÂÞú@bQv(ˆ…=º “ÇÒ6 TvíL+û°¨ê„ëÛfÖàÖ§CÆ\=,„²u[Ÿ’Üú\B³¤µ¸¾Õ,•á6D+¾Ìõ0ºõFEåadzX;øV‹ë9 €S•@ÆõY=,f:È­o‚‡b¦6ËpÑ +<Þ§1@N@1í€}Øw€}8WJ)¥´3Yƒªª,¨ªªªk@3333333›ÎDÿþþþþˆŸù°Ä,1KŒZ¼@@a@ø:Lh°lÓ €× r´ÔˆÀf4šU´Ýˆž$3Aª4*Yÿ£–÷@Qó~Ä&'‚§ªL†1ëìIfÿ‰N©%ða„Šà%FÐ9ÓüÄ°ªMF2K.å©×òÔªSèá¦S¬Tg;[/¹RìÚCˆ)*ãàkBûPr¹ùTÑsà 9ݑÜOý¦÷È‘qžá8!¢w§]gäŠïBmXÎG ‹SQ|B[1|zÏDÁÜPàÍ!@ù¦¨IôH¡©øaɑøEµý`Év2ѯ¼ s˾ì¦ín¬cúèØȚÖ÷TÓvÓ¯»NIÝw‚*ãm¸Oðš(—Mt,wâ7u6Ãøu×=«h{Û,ZžÑÙÎS±ó»+wŽ7§ãnßý;Qs@Zl)F6_(×A ­íA¡å…âþ#!zÿE–s¬¢ïPÕsÓlZ'Y žrýãçlY²÷¾§œ.«MËK£éù@ÏøF¬´é¯‚쪣ðqZë0NɁÈ)’¯èa’¿@Ãr>Õ±8šhØÛËs ÎÊ}÷›ˆæv¾ê¸>#%×ašhüñÊæ7 ‘ݍ%¡íÝ4­Ì"èÀöLÃ̦\wŸ¤¨·¢ “ã‘¢óE«ÛŸC5çUœbs7Òñ~¥ƃ Çìűz‹!œŒ!Ù^RdóƒTy¶[¶ç4tvC«h킣!9ž¯Šž«a’åd–å{2˶[rÓ~íW~'ĖñC+{´¶ýEBo=™%XŸ‹–ýÂxÕö ×a¢e{ѝ. +INzÓ]Áï;áÕÌWqzÕ[œcøê8¬¢÷7ÏòÜU½ŸrçvAìß3Ã1¯åº;Vi>Ée¢ã6g9Žð* E)¾­ð;¨–¾§Ëñ¸_:^Ñê¶ VÙx0ÐqŒ#×=…P+n†2¬îcE÷aüªÐZ„Pm¦ۆ¦÷ .¥I¾Ï@Õû'Z4EÓá@×x/ÍtŸˆM߯–Ü|èÝñ³Z{ÑÃÅVRLóUm;•äÚÿÒDëT6?˝ç©g½4û¦óŽÕCØ\¥•Ås¾ªÚÔªùM®yx ãA° ±AÂ3b„RÛLÇð-€[ö `†æh†âpŠätŽè!‚Kf+R/üJ2Ë^AFO7dÙÔÖC´f0#;Öˆk-ÆÉÞÿªn~×K†§e¤VÃE¸¥vå«Õó$·}Ás XüdŅة"ѳ…6ÂgkMÆqëÍÇ:Æû¨_ú L¼t#(F…µÖh¦cú’åW^”‹3ŒO# ûYs˜h½W¢t:k1tr?½è9â×\ÐÚ¶#bÙ~ãvÍ'*jïÉLt¿ÜÖ_¹ï¾”Pš  ç/&éÞ»ßz¾°ÛÑê¦3 +2Û+3¡íá«äˆD©‚Ò6–[¶Çí¢éE·rÛÎU×xg6ÎGRÍô¾ß8V½ŽéëfAp:ϋNçtà-ÝO bë±àöþŶƒÁäJŒèý²:Çcb±9XÁ’#¼ÍCŠ[w"ÕMCY¥× y¢é:ôH¥yà‘2ӉŽïWHdvOFï=vü¶Ü¶õÛ®Yސ7­Æ–[¦”ªõ`ˆÒnºbÌ/ٞÝrkP›0ƒôžq ×_šéý’˦»‚×uEDq½ävM7Ò{S‚Á© b•µ~±é0átO߶ +ž‚Ø,"R»!E”VÁŒ4LN˜=¿9ñ›Ø9 + *2㖚 4ß¡¢õÌ«œÎ‹îF×QZ$Ä)¶.Ð-—hXýçjÞÇ(j¹Í8Éú%WÝÿ¹ë–ŠäyTHq<žê˜]dÉå6C Ç-³î}ÉQ\A†ëÁë:ïܶ璊â|-%ºÉÚÁˆ0(¨KӂÝý'yOr,ãOŒå¹d:Ï#uätPFs¼e–Ú’$’‡R« ¦YÆÇ8Ñ{izo̶ûHFo¿5èŒiJÉ}VóÝãø‚ ƒû(†ïÁ4Ë²÷£ºóŒŠÞtCDì¼Õ ÷o½q:¢¡·]Mu\/aŽ¹½@År4RòýڅÛ]%Íõ¶˜âxLGñ:jَ̪ùÁí˜ïÛ+yj­•,¿Öf¤cq@ìØ^ªÕ–S-ç?Šau 7Tk(~Zr)Í0ü u,Ò̊+i~ág¨á¾Ë,ŸƒÅ‚ ‚½âL–^p9Ísçɦ‹q²õ.Îrý¥Y¶­rQ7ÒÚÖ7µpÑ*·á¡æ«¨ŒI¶énœî¼g·½GBãíT¿ø ^Ü|=àm0ÁäNEµQ¸A*«PãÄb‡kîƒ(îK¹î=£ 5 %Ç+ $Ë##Ö\Oò®À ¼ëUí(UíªUí†Oõ|7rÏpYJó}üÉÌXeïU7?é˶'f¤¦'54¯‹náþ,¸íׂÝv*O±8$VŽÇ3MïE˜ZhOn;DVWU„†·”VWUtVÆç Áû?Óvº×íDÍwãØÛHR¬M„‰EöqÔR )ŽÉÍ(çuΪ ŸÔœw‰z½E½kþê¾ãp¤^E”ë UšMÓ}'¤ÎóªÜyžõÛæS¿é:V½¿$Df¤Æë\šk|L3}§i¦í-Dz]æ¶ÿ²âü mX‹•KêöÓ,Ýu2K¶xeÓM½î»fwm'õ¾í”ÚvžIˆnW3kó]ËrAÜ4<èÔì(*§›×WôˆÁ ©k=yÉ̟^R³›Yžë(E²\Ð׌Fµ;¿«‰†ë;Òñú¶ó‘ÂïŒVúžSÇ[q‚ÕGü0Å[mµÁ,ÕvׯûÎÉ(ž¤¶ëpžmþ _jßt\/Y^ ó<œ¾é²Þyž‘¼Ž¹EÛ»Dê90Q;´Ã-·jüV™ž2[Ö£Z© ©q¼¨<¯ç)¿ãrÑö”„Êî¾Þ·]S¬.ÂG©üƒ=·¯ìþKóœ'QŠåxªiüöŒ‚Õý¡£uÝÒºnÄ8e–Ê]ó\çOì€Å…رZó(†Ùg¤â9ã¶|'ŠÓm%Ñí®_²}†óŠÌ¦f£yšï2|ar"Äp]E‰ÎŸ$Ñx™g¿üžïZoØ®¢…Ø4!Æ8t=2ÃU¿l~±ŠÎã8ÃvßõœҒç’Üt¿ †ï¡¯Þ$È8¥FžNi%¸œwv×y)Ì°ý +"VÜ U¬W~Íy¦£xQ ’`[Š2ÌÍW]óo¢i½M”=Çôu«áí¢í!³n:£ ²¼ ®Ú  ©œÆNÔ­w¢ïY·àZ·ÜPšá{‰Ó«.c“#T’?° J›^¥ÁHjʼn(Çò,Ì3µ+ÏsBbßí\§Üt²TfÇí9ÔfãÄ®«øùŠ{!çeÅs3P³Ýéeß­’èý§¢¹Ÿ¨UρÉè¼Û4¼ p(z  08æYŸ3Mûi f¼×[Fãg)–«“µ2"z˅‘ØðŽ¼evD©z.åÈEö² ·½4Ís5ÑrìH-Ù<Û+ €Áh”]s¨"º]³Ç£Išó1L5ßCΚ˜¢ö¦8ЕlRÛt?[p1p°ÚZ’å½+¿;VåyAé;¯Ä8Æ÷TÇnUGd}âÒëLD ¨Ú¶7 ¡ÝY±Ùu»hý%NG›AV¡ù¨_lG«›„Ž–›‰ž.·š(zoĺñ„X6<¿Ë2BÃ#’Ó)Í했äu@OyßÄNX‘ï{·fzDݵ +ªˆÔöĐÔèÀf{Ÿª.ªˆÎŸ*‚ӳỊ"“Ü…± + GšæK³f7¼]´ ”Àk­é>ñŠÎg»dv>*Ûó<ã}¢q;že™žÏ¯C^ßtE`4VCo,³t;h÷ÝjÓx©Ùþ«žãŒÚsRIp¼ÔQÜ>¦tfGn*éõCmù.D¦·¬ÊõVŠæ½Ï³}ã$Ïy¹Ø` ÃސÕwŸj©MwcõªÃ@n©Ñ@Óø¦îOjÛýàõœÿ±–ç„Úò]+´æ‡Ü~0xn7R é$½Ü‚W4+¤¦C2bû»Bì~R›ž‹q¤rWÁë{“¼ÎçTï' H‘y‰Ùsœo; é¯ê•ßa‡Öûªyîf‰Ä^Q•k¦cp2Ž\p&|Vmn¤Ì”\4ÞiI½§bb÷¥àu6Ë.8;]/ ëÙq›Æ¯8Åê0ˆauÀ/9hxK”Þc-Å養ÈôP¤|Ç#pšÐ9RóÅŽky–ãz¦ëúöKvŠç…5ÅíÎOs;!–m§CU÷‡W¶ß¥YÎçDÕ{êz¿âÛW¢_q#‚Mn@ªwͳ|?l"S†ÉÉHËú vͯjb믠Ð{­©ó>«©Mç´¶—ÈÕöBè÷â4ëmžk>5îOjá{/xî‡rßy$W ·…t¦çvÉô'|®ÈJä<ÁEŠal?+_õÂé‚Àó;«"´Eh¹îÑÃ4®:¢ã­†ÖônŒå9 +)Bf,ß1ᗚÛæ ÁíÐMguOì9˜¾z½äHCoŒ*5 $\³‡™$¸)´y•çMÛwÍ+ÙTK׳~áý£!²½sÛÎóLÕø'–ìNˆûfÁ¸ííWž·Çï–W9O{†S…ÕzÀ^e'S.²,ҙÍJ*Ífõ´nƒRb¯]%ÍñOFqþô{¶?½ë¬yNˆeï“YõþJ ~G~Šç! Íñtœä9lšŽè ã[ªYk?ðW[óHì Y¦Ömsë6½¥LµÒHžYn)Q.;t ŸZï³Ed9¥wܦô¢å àóþ{$žkRZóXôÆiŽNßt;QwÝ/{æ)¡ùߢu,Ïj~¹Ý4ÇÖP˜amÈ®4›©9.¹UË‘ÕI%Åïƞâua¨wÙMï‰Ûô݈HîGj×|ªyNgzƛ,ÅâP˜áz t,nÚ]ó—\²_‚`Ò + Ry*G#-ߧBh9!#vž*)î/GÁûcGo4@_q.ŽUfJ/Y® +në;’Ye"Ï-úIÔ«Ì¥FÖdko§ÀÐĤ¬ó íÙåÈi¬%¦º2…ÂdÅ®™múmçw¨è¹¢5Η;­å}¹t»¾.7*Ci$Wô›žZ2ËY™ÂÎ~ˆ°Ô*AQaßSÕØéËË}£Åš?pтEP"ݺpSdfŽ±¥H¹Øb8«ä8Ù±2*ÑùmJD–Ûá~¹‘<»ÔJ”`nH*»n¨K·&³¡¿÷K¡1šw‹½"%FJQE,¿U ’BY×&qLvË=2­R¶ÞEUad@EZó\&´Iש¼‚½j«H¿Îv¬h8c֍Ïzåý¤!9Ÿ éŒ.lÉ̏D$çc%‘ùÑWk;Ø) DÛ$FAÔ]"Ñí>É2ڂÑõ>±,UQ³ÌÜ(S°K[#Ô¨r ¢SùÄ9¦#Ëýªo:ë¶,OêhîÇbzÏI)½ñLGðü|´²ñ2Îò}çÛ¥DÒ2É:©S|µU)RCY1’´Q–Ñ$'¨0œ§'/!¦®Z%-™mÛÅN#Q~¡I¹nX’Y šg˜}…‘*Æ:÷ӚíIïÙN-2¯ •´Æ%CDX*¸Þ+˜$¦p RSzC“ºƒ$>AB"§8%Ù4E™y˜¨Î2FR蟡-3ãØ›Ï¶kÍ$:E—¹n¥i…Öü,øMçäÂýMîºÿ5Bó“–Îü¢¥sþ¹Ôµ63$4΀D:1ð FX­T"IA`.LIaÒ««ó7«‹ Äd¥&a™åY©¹d­ÐžCd7,Ñù .·!%¥ë`Ue}Q’X?Ԇï=ÖóV¨­:Z×¹æ:•jÖÛ0) í¸´UÖ¥SÂúJ š;káN½K²Rm£³HlfìžÓŒ]󚜖nËpIT$Ç£¡ây.Ñ:ÿã†ã–àr=KtÆWÆ÷)“—Ûvj«Íø…¶á¥aü~±p:¹O¬WeN$±´j’¸M‹d~kjBÁ·ð¼RËî#»ä¸c}„ÊÝÚ0d1£“,€ÅÇ Ç(ˆ倖Ž“:(LÀ"…‰89KG¨QÈŠl-:¯ µëϯzNgªÎ¹fvIAdwBª2 +n¼dH%5 ç¶ÊCòømì¡"вb#ËŠËœFtXÁ‘ +bx9ÙybbHV“TL‹¾X¾Rif×|ÆFìŽíÅî¸î㊹ù¸bnHJe»õëìãêsqÕZ‰` +©†8GBV¤p0p Lj #8f¬ áP1bÄ,B°±ù¹Ð|‚Y–’¶€G]l®‘ZLäæ ÅíŠÀì:äÖ¬÷mÅuªP:*;qÜvi· ð¸ø +™)À£I-N€p˜ØЂãƒ + hà á¡Å,/(¨¬Ñ¢ÙmT‹+xŒÄ’;ÖÀŠ¯ë æÔÃÝ¢'ƒÄrË rÝg;‡R¥*£+µY4‘Pzd¤|¨pá˜0ÁŽê<;HÛ’#"©¢£0 ;Æ#0Ç "ÒV[ºôEö4S³á®Bé: “Ë …Ð*å¹¥FƒER«@&§*ÄÄX%hyiJ`Cã|@'Åר¬àÔ©Šà2—(,‹FŽF"×lÕ jіÇ5J †«u^ +™Ó†ŽÖv"£w~hž +‘á°KbnS)«9ñʈ¬’„Õj0ԙ6øÁ$Ð)Š@“Ì`5}ÐB§(H—Q"´Q«°‹+˜ ©ÑWŒ–Ë]áf©ýAœ¢¨11 ¹™бâ…C8(XÁ1B  À‘p`¸`‚CÅ %R aBÅ–ã:¿/‡¤×+ §©ã¢Bä¶é×=§¼ÆûEß³½¥–[,F+\|E€Œøp\  ‚ƒƒ2¤à€À 0 Ç:p0`€ÃpL AŽ XpH P‚£C ‘H^Œ€S((•›„Z5G‘Z™¡ñà¦19nV (Òú +L3‘Ž DpL€€ã„ ˆÀ8(p ƒ‚ (à€£pHP‚£„‰Ž+f™áƒ<¥p&•;‘Ì,P±¶!–­wnã}­—̏õÊé‚Ö³ÞŽöK‚!7|AÂ!A8"€`VpD  G Là@à8(T Áâ +‡ +-.:`!é‘À7 ÂÀ¼ViPf·dD¡ä˨2‘æ›IóËM‡Jž#aF™QÐÒ#t@ +)¼PÂQ!8à¨ð G DÀÁ@8(P Áq Dž .8Dœ1 ¥åGsYÔ{䵂½ZólÇÔh¤e{‰©²äZ]÷ÁšëŒß2*7U'L8$P Cƒ +8¸À18*@ðÀáaƒ Pp4˜`Ç 8N  A Æ† 9ôÀÏpˆ¡P…£µêEµ(LŒ%Éf©­P±ÔD”Hp:C&Zf9>dÁÁà + $ÇTàx@ADp$°ÀŽ4p|èð‚ƒ„(>ØÙIBp.‹"K†X*ì’ÚEõH}¢i„–ᤂ³HµÎBøhÅ*Ä(¥&y „ %R¤p@ˆ@‚C&àÐàÁGˆ38(`HÁAà Ž4 ¨ @i9°b㜠¸,ŠÑ=êÊ9ªB‡¾è¿®˜Z’ËÎ÷PÕúG)3gYC©ÄàF¦y@G  >p@pÃp4€NˆaÀKŠï€š%>ži>G¯!Õ©ÃRHk蛕ÉöC*:3`šˆ9FœpáH` 8 0`Ž €àÐÀ!„ã.p<ˆ‚€+Z 0IQ6Èù‘0Z·>·_ŠFf‘§•G †¶ƒ «Ï세m7”ÕxŒa‡£öŸlX&EFp(€À8ÈÀрˆ€Ã(phÐðÁQÁB ŽHpˆaB€ˆIñ'šâP…ŸV DQéàPÄؑ@ŠÒ!Nf°\€A#E£²OʵÆs ƒ+jÑx *»ÏÒ4ϵDÁØ _t](HޟZËîH°8µUÜdÙ,×{pvÍÆҗL/äÇ+–€ ;8ØÀ±À8p ‡H0àƒ‰“Td¨ Àè|Øø‚H0›RÜŸ6ƒÆ.–QðéU™Š#ÜÄøÅö¢gŠ ™µÆ³ {«­óP¯ZïÕz[`E§(ä%TÌ@aƒÈ0F ”¼Liq"ÐQ‚Dà$JÀ‹?V¼èyàeG¨£9äf¡,z[ðù¦M§Èr¦ê<” ¯KjÕ{hM5,Nêmû•Ûõ~hU÷sŽWj9Ü°/L©3Z¨XèÂÁàÁŽ +` c+D~JvÀlšV"ˆY1ÔïøÅÔ¨í!ušû´cr&O/·Æ°7’døÅ9v»vá{åu­_VÑý•$Y$Îb¤@€1‚,à‰fž|¨LH‘Ù&0ccD@ +˖€*RBP’ Øø‚&.¥.,±]Œ^qˆ¥Ñ8”‰¼b9¥Î™¦ëÖíٞu[V#e©WGKf E˓\p$AŽ€84pˆÁ¡â 0<‚„ ,xáCÀÄr”Z¹™c´Wh"ˬ5'–ÌN%™¾ ±2ã€òDGŠñMGp=«%÷^•¼†K4ëMÈߕ†Èî¾]2<•dyŽCN”œN’Ú¤Ö漚ÙMÙ…›èýmûBÄ"»i†å¶ŒÒh˜•Öö†¸ev,v¤ÊBØ,ÅCô<ÑU$™ä#Τ9 ¬:ÐVm•RyjµÍXvÁ0·àZ¢Sk(ŽOe3U08g/t¤öË(Z©1ɎM˜tf!žûÀëÚ﫞ù*L°» +“«.âgÈ ÌR­1‹Âú(ÒªzˆÓ‰ ô•‘ë~°Xr%šÞvš!Ô•Ò +S« ÅkMDOÔŒ®7‘ øÎÌÆïœÙvÿû}×íLÍxà՜ Å뜌ævRFó»¥Ø½…oJͅë +×!A}ՕD‡è jŒV ȝ€Ü1»q‹¾[yŠñK¥ÜD–\oBm™ÿô®ïœÝu?¨=ßmªä·+™ ú]Ça‘ù·\ºŒ’œ¿Ô~¹ZÉ)‰¼øQ%/¾ Øi-ÆÕHÞóݚ빆ý6Í/}QënâW§Á'ÉÌDÑ©l¸Eï_¤av¿'ú Ÿ&¸ÔÛÞ_!‘Õi!‘ÙQ«n:¦z¯‹­£ˆÕwåM¢^z`1+ƒ1êå!M¢»l§àF®Li1^§´!ª·*SZŽ•“Ik­Æ¥6AƋ&ñÓDÖS-ë±Dè}”zõ–ù4S°<ŒãVϖëÎ󅲋XNÝ Ëñ‰x®ŽŠiígºOq!×£³Ô¤4Π÷Lw*íæ +¶áõæ&¾¡gIÞü¢ëv¬^r=Ø®¶$$´~†ói¾©„~ÃܞFa|Í/Ú£Õì!MšÃd«ê6ݪº‰ç÷=ÁÍ1«€:ßÏ!7 ÖI­ä*ÅÖu:óxR¡µXµÔ€ß°7¨PÏ-J×ÕHÃõì3cך #”™ËµJ®ÄJ¤á—“€hŠža•ˆctŒÄSÛáÔ¶+¥ä Â,ú…ò©l‡û7-ÏuÐ}—&Xei¾‡ð™Š©í½–K–çó,ãq–⺠+1,Çb «¿b¹éHËrOAht5>¤°!@®JóKëÛ}ÏôªÚ¸¿‡j–»‚ÓrAEí{”™“PûΙ…惊±¥$Åm&l¢â*p ä ?®µ”ç—ÜL+efÃú  ù^ŠÌ.‚çj­AŠ7݀ÉSŒ„0JM†:fw™ñÙ£²¾F +'à Ïù¢ï¼á8?bF)^Ae;n‚K°âU«º‚º–ý>Y±þkÞG»nÿS›îÛ$Áæd±êpÀìÇ©4š)ÜÏCO|G:žÉõ~Ó5] œ(º‡#µ‰ž(2Ã.8eø’ß Áín¨cö 4Ci”ã•›ÞW»l»œ&Vœ + &µ >He$‚Hrª7MW‚Ìzën¹‰ Áä†×vÕ¼GIrÅy³Øf¤brÇ®¹î¤Ä®S‘é‰Ö÷¾¥y¶¯0ËvgØNÔ¦ýÈ-Úo#Íjë:ÉQªUgX¢t]Msl?!å(.Á…Él…Ïk®èKÿ¢¨unÍþ"׬ïъï¾,y©eë‹S¶^Å8–;á³J{ñ «{Ãî3Ì2_ô¦Á@ÄÇÈAÉ„ù'6‘˜ÁŽ)X™Š98afQc_àù²c®Xh\%²ÆJÕƁ¦‰NãL׫î<™fx®¤ØՆˆ N~¤hî# Ñoì4™Ì$@ñ% j¿˜D^s-G&³=Þt†ëxŠì ÒÜ™§ü–ù'€¦Î4Ø@©ð±z;IŠá±àöÞ1+¦OYJ¡ð ¡5ü­W¢[gË q¥IÅæáGW™Z©ýl¿ì9Ö®-·c—\IókîÄÉu74*{ …©eâçhœÝRc1¬JáÓDö‚˜%·!©ÌY äSZŒæ’ÙUÊ ®_Áï;Ç®zŒ`yò³¦SáóºË ŽñK”asM/º6JÓÅxN•©@Åâv¨i?2ߋQÔ²S˜!’oÀQ2c!ܚ[avՋÜó>E &÷qô‚;nÑuÌn¹î' †oy~ÕEÔl½ñ4ÝtÓ횮„‹RŠ8ZhYOBG)îà¤Ù•ÀG± BË·=â'ʍŒQ™ÈðË>|v­9ƒç cÇ(MÄ—e;¦`Æ«~0ã]O¤nAܒ#QŽåVµˆpŠí*Œà؝¦É¾û=Õv,C2_DØu慠³@çВ ³Q‚µøD¹SüDÉMü@•yÐY¢·vÙEøªÜX ³Ü„Y4?‡JÎïPÏ|eÖÛ íØž¡ó ¤µÌ‰†ÝI–[pÉ*µ=Ep,Õ.À)º™#9‰+·@.¹9Tl$v–æÆ°û Ô¼áct† bDªÉvÅ¥ø‘b£ æˆ>B§ê͍V\I1¬Ÿ‰–û2Ò°ÿ¹5ס˜©‚9ù½4³Ð6ì4™]€9z;ˆá¬’À³*+™Œ6¡Gi~òô‚ãðƒôޑ†ÙŸÛ¶Þ‡©µdÍ9ÄP½Åø…ó-K5]ÏԍåÆ÷lVqŒˆá~ÀJÇ8NÅ=ˆéº!ñ’3ÐhÁI0òe/àÑìòÀcԆnÇü<ೇ±I^3 ëcžç:”¥Ù_¢óY˜ä>ÉRì®]÷•„Ìn„ø(=€ü­éýҊ¶û‘zͅ$·ì É®;I³ëþ)Ն‚ØD3íª¸!ŠO¨ j«0>­MÈù¾!Üx×2\jBk/ó{c1ÄR IzÁ±i:@'yHÑé]#-ëWü²îh„äÄ|Ût‚â)€Šâ M'2!Ø«n’lZË`3 ; ©Ž)¨Ñ¢'àÉEüœÐtªbs8S1=‹aVœQ»¾jÅ~Å(5 9Cl Rgn”ä*Ë1¾K3ܟ¡Ìz›±ÜŠá‹r“àÂMCà"3!$rŸ<¡ÒC A£”fI®ý"Ʊ¿ƒÚ3T±„mYFÒj EqªL˜5ï‰×ô†™¨3Á1}~AP:ÀÉŒr¤j£‘vÕA†Up T´k˜(þcø´öF{á3…&ãØe‡QÔ²£Nµ,³Þzªas'x¾c#’úCOR|ÅÏ>„x¶û ’édÃú£WæYæÑmÌ(¹æ(”P·PìT­=ð˜–pqĊ0Cäöà¥æÁ'Å&gHΡçHíº8)6I01^ÅQxÑ®'`±š/Ü ¹1è,Ñ%Ü$É+à8™± j½Õ,ÃyNä`ÈfaÁêÄxŠ)ø´É²KË1Z9I ÍRYj­X‰~ ¡„ 3Õ¬ ¾"9™,zDP鬅‘ʍŠÍEÌ~õÊo¸È hñRu DvQÔz+4õFÁ†¨ .»CÏšœ¡9ž"xOu¬§`ÆOŠ ¢¾¢u f &µ 6Me^”âf”à(Ñ«µ-Q'Åæ!ºµá×-kÈَ-Ø ­9ü0‘Íh±Ü¬K^s-Ë&² .Ba™æZ¯ÁFª­ Y+Z5œ¢w  ›G²ëMé5ã‹ÛsŸÇ*Ƶf¿JsL/Èt,A&éìBNRZž£²e˜}ÆïÊ .K bƒ@ˆcr(È4Š_–œ…š#³ 0Eô%Ú_-÷‰Y3]’Ÿ$VÀ\?-Í_µâ:ôL½¹î(À+¶’_$4BªµišŽ„ ”Z- a!h Ð>è\ɕðášó0jÉiÃì*J$5.˜¤RGÐ*­A‰—ý@HÐÛ +ÔÙ  0žæ™®›’ý/Ì0}„¨˜)P”X˜J"|”Þ¨h¡*àáƒÄ€¥*¶pSÏðc$Wt¢£D»â$¨ &¨4›*¸hÇ°Ð!’@Eúµ!J-CŽ“Y ¤VœÏ6œw~ÏtA¨3?(³A*6=Lg|œÎ:ŠZrA¬º•.ÂL÷ÜÂÈ$Ÿ‘f½-ÀáځE(|’4ïaÁö ^¬fP–[¸<¿>ü–ÈT©Ì~°å}Ís¼Ñ£•ö²ã;hªâL´\Ù) éƘ<Ç2Ø Ñ¤Á ñ¶_ b{,P.D´43È|É/ŽUn/ŠWq$€ ÒB5‘É@V±Ù\½ê?.ؽ‚ Öü¡† +ÍEéÞkQ²õP”fˆòë>²ÜŠ›†Í‰(µäV ­ÔFä0•!ðb˜¥@ d–ˆY‹bœ ã–\ ¡› ãK´Ëþ†9…ù$e›.ÀÄoê€$W+Û4†§3@Yp*‚Xp"L.9”å—½‚JëƒÌVkÃLÕ ‚S à!b`Æ2ËBPüŽÐƒMPšÉg»6ď›lW„š®‘#V0U2…œ#:ŸUŒa_õÆo¤¿q@„ñãªø±r“`t쁒éX‚0¼”+’ç,™F*–/à "%V€8ô™Cü”Ô8† ɖ±%'ð±%»8Nµd? —ꘀ +9x¼],’Oh!‚Lh~Id"†BngRÙ ¡ÓYŠß[4MáehþÀEn§h΁ç ÍÄOë-dÙçۊÙw®c=ܾ‹rÏx+~–Ì>àÑAðLÁ]ÀrKñÃuÇqºñPü4ÑEØxÇ6Ǫ³Â-ûˆ(4Àª7¿*9?­9噮ˆmç-»g? Ÿ·Œ‚‡(b8¥¦¡§)M’…'µH¶é@®g7Vp[­Ù "!xÊQ _bÇ ÎãG ‚fƒ•êùÁ l‚‹¬}­J{ +…ÙIü$Á€‘œòƒ¤žIºïbÃy¾§3 9Et-Ù5%Î0.Öp‰²KŽ„Oҁ,Q<ßu +#TZŸ#úœ-º„QicIŶá‡hÞՂ#Tï ³E·N¹‰Év#€Olxˆâ%z–è3’`s|Ke"~Me/ˆZp \ÀkE«¶jø^ÂÌbûÄDf¡‡èMBèTVÒä’[ñSÕæAü²Ç(zÕ3ܵQÎX ¥ØB—ÎX§ÞD ™È\¢cøgyù(D±¸ D„ÜR°âDÔdÙGèH­¡øѪ‹à±‚C„%‡EçmpɎHa³e 2íŠàÄ*ÎÀ³tFiþ`†¾Á§DFC»³å¾„’¨—„oXG0ìžafɌŒQ|‚ XÍæ:~`^_èA";q~ÕIŽ[q Tž\ œ¥.èxÏvŒà|Mg|Jf(†Tm!Ì­¸ͨ3(Z„!·„–¢wœ(µ@Yp(‚[qF/û æ—%Úe7Q|Bc‘fÕw²_y 3Le€lË-~Sj+†Qj-Um,Q¯< ãÕ dV\àPY‡ŸµÜtR“`†SÀ’øibÛÐãÔVâ‡U—q Ëû`Éý”¨”ÛGR>C9¥ÆLG FÌK6mÈÊ.Æ¨¬•&X…ìx%êU`Ðԅ—¦•….z”§X—«Ù ˜ý@FèmÁæHÎ"eFCÓ£˜á² ¸@blÐâ;rôzàäžà†«vfn E:öK¶üÁ‡ +Ä¨e_`…ΑD% 7Bî+Ý5$¹˜¤9‰Ÿ+7‘¤˜Ý©Ó¸A‚í#|(¡l ê;9To^šÔ<àtÝ?äxÉQ Ò%Ï^¥m½q7Jg@`“bçˆ-ó4Û¡ø©z»p£T¦açIíJ F3*Í©mû›Û¶L´ÜOfß4f˜m=‘b™®ÅO×}ÆMgR\Û] qBc@D›^‘vÙ±bãÀ ²Œ $øô@JS,§XCΑœFfj×ÅDÃä@–TeÓ¯Øë"ĀÛ#|¨Ô0à(9¨Ë;øD¹‘ø]¹±8Çð;V²_äx嶡Æ:V d(5!'ˆÝ€F«f ³MSÈQ¢ŸbÁ¹@Ãû(>™eßÙ@Ëý)Ùq$ú„˜ 6ƒ“nz…°kÎDI¦+QŠ÷+Mr¿ÃSÙ“ îCI•A¦úÕ@ +2«”$W-P±¡ùH ïâ<Ó©šR{€‚œâУDæ ¥Û¦pC$—°ó}7˜éªOø¼àTíºæÕl‰…ï}°æ9â­/Q‚Ù)ˆ·[ »ìv ÔT³ê1Ž\s2]úg¸nÆQë>â¥Æ¢ˆ%÷ÂÈeO!ĊóðÓ¤vxÕf’›²ªë¦Zz£¹¿fjmK¼‚ŒÒ\„Ï”š _֛ !ØýÑ«îQ˃Ãædœc=*Üq…˜!¶…œ#2 +:Gd|Rk%O.9®—֓<µÜf¨`÷˜è˜^ÂËќ‚MÓىàÕ[G±K.$ fg†õ¾êØïÜ¢ñ@ˆXp"F°{‡%36Þ6_S  ¬8@[v@Yr€œÔJ¤Vo C¤¹„˜-ùCOUۃ˜"³2Cf¼•9ˆ1*ñ³b£¡ŽÍq‰ÔvE®˜¯géìEQkŽÐjnÃÍÓ[*{¥³Hª5f֛Ìt¬ß"íòs˜Á¦˜ÑÜ:œb“p#ôž€s4g1ܒëHb½ÍTÃx«˜_# ó[üœØ"a‚M ’-{R*KaœzÛð“tÆHÉ D©%÷¢Åöàe™5 • ŧb<½°Å1ÔTµ‘øÙ²Ï<Ïý¨–Œ†Í“Ü7Áã4»?pQ"«@Õ&‚§Ëþ!Tûk˜p¼á”¾GœÎõ`Žâ} ™mXŒbԙ "—Ý RÙ°;„•ŠàU\‰`ÔډLÈÊÖ±p:¡¯™'/Vœ!·‡«´@aw?aøLitœÐFô`µ!¯oSv݋3¼§™Šõ\"õžˆÉ 7,ò";b:»a‡Èm0V.²œìØtÛæc·ôRw¾ÃÈ÷¬‡š!JŸ>ØTµ‘àɊû s÷! ïo†WhT8ÑáãÆÙâôJ{`eÚõ¡§É­’$×m–l~5k–÷4¤¦5„V#FÌw<Á ›ê +ª4!Ó/DÄh1œ’°"”&A^±)¿d=RÛî¿x¹†) á#¸â¦ûe'Ɍ€1D Œ˜ùFàÁ¬šQ‹ûYÕvFk;ω…ï!&û€ bÈJ"§ˆ]€# Pºæ2Hd&x²à¶[´S§yï¡EN·€$?“­ÓûƒÐK~`Ɛ‰€0ÙV0Ãœ€ãdŒæ'ɯ9 3|H *°ˆ$¦xƒÝš§ø5‘Ep²ÔZ@D¥@ò +‚ŒQ»ƒŽÕˆpŒÿ‰†å$à ‰€HRéîSؚOuŒ—1ärC!Ä:Ợ¯r¥©mº;ÜrƒäR4ª|M«%ƒÄp:X16“'V +ᒼAŠ’k1\ 9׬ ?CíjÚîŒVÐ׌4‡ +b³ñ¤¦×ížÝi½dxAß³=¢oZ!n ïvžgÝÊíp¢f<Êrl +r»!ô¥çI¹éþNtŒ/Ar½¡.É_¡Èpšáú¯{ñór z½Í0r¹éHÙ|%YO‚§ÊMB‰7#¨õ&òc”îYJÍU˜^ol‚ÊI¬Ù®õº÷LlÜïÔÆûY¯¼_¬¦ó.€Sg0ê2%Ì,6˜P)”8»D†Nf1Q±{PžóÉr½±H¹Úp¨Zm/K'8õ+ž{9V½ ÉžGŒPj%K®8h™o¢¤r+1soHÁŠ= a^™h¡RÍ(bQ(r] ùŽUˆbˆøP ñÁÂL·ÔyŠpâçôÀ‹#U†0û„oÉL‡j¦Zßv3¿¦ö(L~4Õ­2›f'Z3/Kf/Š[p-Q09ï7Žwô¥Óø02Œ: ÊRä(ÅΙ‚É…¸ RO@f5´R dA ‚7\ +,U­@vÀ”À0+ø˜T˜Ø9£$ª‹’',N |°\ ˜aŽcå2‘JÑ;ð© ‰QŽh‚¯@¨Oi7X° *Q-À¨3A'3 ¾#w“kæ{ •â(ˆFi‘è”ü„:u–“»ë\Ãø”å—=ÅI•ÆÁ÷=µkªbrÇ)2äVÚ²kmç–c‘zÁµ0±a¿ãÅ¢6—§Ö ¦Ò{F;¥¶¸='€"\ZÀ$ùTL>yzɽH¹Ú|×óýD†ûIÛsUGdwZIdwSGs:j—½OvÓøáö\—vßø.XîW”Š›øÙ*CI–ë0Ë1;‹"ß[ "֚Žö+®Ä +e†#$5×_¥‰2ÉAü<ÅU¯ÒNü¶ÜL­Ö\(Ÿè1V¬µÉ$6ÉÔɌEó3ü ±;˜Qf1U0ûJ¬~C=ïÔ7–KV£(¨lïû×u»qΔ ÷ÌÆýQnÜ®û¥ãu½r:bÔ\WVát¾*¿35Û¥YzSP`µÝoq†ï'Éð½Ä&b´:³ŽÁu·i{L¬œîc¹¥fC×iª_i3T±´g¸Ø—ÅÈ}¨Ê-Ú%—ÔŠõ¿ëÙ/²ÄRÅýGëz¤8´¾÷V¯œ?´¦ñ#F®7£ïüN†VL‚ ñ zµF BëS¢]pÍ*µ“(V›É“ë-¦ªÅÄåj›…ëE0XÇ«õÆ,«›@¯Ü:ŒYpD)¶ -Uñ!R/–å×݈5óY’\mpŽØ/Ë19ê–lï'•ã!«dz¿è܎Hãù<Çv¨TüéUïA|Vm1n¤ÒTŒç½ +ñmfJ­‡5\ád;1nÕQ†K𗧒ÛåjÅv€‹ßÒ/y$¨å†#ïc$¥Ú:~’ÈB~Vh3E,39P+«X=OY¬8ÄNÕÛL”Ì¿©ŠÝ™WµI]ÓÁØAŠk`¡r½4¿ÔJŠ`÷P(±øÀCôÈÔëBLR<„OU›Ÿ¥2?Jf 1À†K"¿ 0¨èáx𡅣B +œ^¼`'Ô4½,àHÅ~ˆÚ+OgÄH‰pÁÄ#6,„S¨FyÀy2CñӂásµtŽåƒe cú˜t>¥Å"ÍGè€×V¬b J’T¬TÅHøœÈb›ÌÌàéŠøa$§è&ͧ9ˆ°™#T-€ðXf!#è”áF+Ö “”bå&;AÏSê •«ÎPºÄÏÙÉóŠm;VßÁŽëÙ ÷> +)Þ‚÷¥Ý÷Þfj¶3¹m½6èÍ¢× ‘á$¹Ö@Œ`l?Tö^¹eÓ¹8RµM¨A’kØi¢›DµÚJ®Qg@KRg8BQh ŠFï&•ü$ÚµvBH•Á†è !‡[ÞðR“0&±}¼Yô 9Me ~šÈz²bq¾­X܋ՋßW»ò»íw¾UT¶ç…d¶ÏýØ.<fԖ‡S ËÅTÁ܄Ûò[±Z†ënË츊Öò²†ÞôžÀo4ŒÕ¸~Û%³ úÎñn¤â{²»îÏ@Åq2Š\i+Èô}æ©Î§<ÅÞt¨æ¹b•ü„ÉU6åÂí^šb}ˆ)´5Z2ƒçÖœo:x=û]õ\ïCµsºd5^ՒÕ=¹îý5o1´Rƒi†ã~Q³}ŠUÏ ¹õÎ.;ŸC-ãY²~g &’´J›àä©UÆ +æ"E¦r­B;m¹Y—Àà~¶crPïY/4Ô¾VÏüãÛÈ3‹†‡#ƒË‘ŽÁ·i¼•y¢ïÕí܎¨›¶×¼Æénœg|1‹ÆÓ\ÁØ¢[8]ØL¸Mß_šg;Ë°<—âvO‘cÅ&Âɽâ·ýY©EœTi`¨\-Í*³$½¯‰¢ó G°7VH ŽGzÖ1…ñH®øNr‹6ßwƯ;JSÌÞa¼Rû(ŠÉÁ,Õ{階‡šæcƒÚtCjûîƒÇ+nLÎ$ù%'øtæ@Å*ŽF J–œ˜ÉŠ¨éŠGð¹`ÑreÀ£‡È tk‚šéXáÐ<Œt쀥 !†Jf |j BÕàSdÖ #eƂ ®&î#­m½¤u^ÃX•Ó&Ãû&´ÈáppBE x̧Ø*€¢ !”b@fWpñ²Ið0¡ù¤i¼>Ol +”Hi^È钐(±H´€HSëB ‘ÄLÒ<‚KÛ„Ï)ÍCؔAEŠ’c‚ˆŽ@V*7Ö0"F*LäIpíjQ”:»¹ŽÕ¹Cíüwˆ½Ÿ‘‚±õ\ÃlKoú$$÷?Áæ:O6Üó{KqŽÉÑPÉx“£Zš¬— eý¥)v1̊t*óðK’sؙ†I€ F9B¬Âà3t–Ñ´BAT’Kèñž'ÈٖàtÑ~DêdÐ×Z +Ÿ.¼°ÌZ×þ–)VZ +P÷ˬE°*bëŒEÐë GšÞ_·ewWDkyIà2¿¡1v×ä¦ñËlÜ®Y•ãùœlʲ|ÇnÍöšTö +ä/H‚4د5é›îÄXޏØQ¢Cp~!08ÁJ³ ¹•F¥Ôîã8‘Ö-„Cc@Üp›6LÎEêå滊Åù®bûU­¿zåvXGgzà®z¿"у„‘3t¶‰†Å]¿pQžP÷MçÒüb3~ÉoX0¹®bŒ¢ø5½'˜ §$He€…LՃï[Æ‘íBJå;±;®w ­èT-N8uûa±Ö2Ü µ[¨]nÈ-»ŸV£q%ôVÁIr¬Þ‘¼2Ó±ŽÁ=¹ð¾”½‡aÔJSa†åXa±}¸YŠ_ƒÔý$÷ .ÂKJ„°è<ãXÅÖñƒjÛàâ…?àÜbácg4"{à$%#ÙŸ±ÄjËÀƒ$0óUC ¡Ž1à‘ÜRÀƒÉµA' þó݊ËɂÉÕPÃpKn»Ô¦û+Nñ\‰RŒ9ŠÙgÇ|!Öý$IÇâ ˃ð9¡y³ì*Ê2]ÎSnƒ$8vWáé,ÅOV]…I¾s™zé}[0ŠàRÚ"x ¥TœŠRËnœrK‘Ó”†Gh®!§ F†ƒ”úh65€y†9 õ‚`ÓmWÐ)’0µÞ€Úq~ +Nëgž\klº^!Ȫ5‘›®_½p>ôk–é~¥‘$ÅބնÝÔ»¾›ñ3z;ø$¢ç)CˆÅ&ÁGS‹ã‚Š’)—*†Slp±*À¢‡(E‘ ÎT̀(ÌP†DÐHÁ&É’ԀÍ%Ï,´ñ¼ 8-ãXÅ&#{ûYÏõd9Îø¤ã%«d{6O75{–gôM»›bÏì@j˜ÐV*9Ž«hÆÏI–‡BTë‰Uö«-»Ë"RÓ;3åY!Ññ ÛuFP neYž3 ŠÙ#”\Å PAÅ E9õçˆýbªÌdÈÕö»ªõ3|œÞ +”XY:ƒ†Ú2õb3T¥Â7•6#ÉÇâô’㡪÷ë»ÿõÒõ<Э=ÌlÁ˜Ùó=I¨L¤hÆg¨±R#ÁÓ‡¤Îñ¾k6 T¶‰ ¯:b‚ÚqœOº¦ã0³„V $FØ|%y~m˜9Š §ì>X­×òâtƒfy3sÛÀòU?Pùª1à8•©rÁµ4Ïü¡^ö¢ÕpÁrÕ¢ EÎshEË ½í Ü¶ )³&Aæ "\ò)Bg«XÎÆx„~à„ ÐB Ԉ‡J΋À‚?HQf…èùžOšUi$K+6£–δ|Ç"RÓ£ivµ}ð)J£FÑ}Ò7]Oô]GœÎïÕy]÷±k}ˆ1*ž˜dÆ¡šãfž`o6Ññ½d)†'ajÉÁ]õ–éSكéO6 MøÍzûh>¥uøA*{àÅÏ);C4¹Bü(‘él½äPÚt´c,Эµ‘äØ›"ø+U1,^ó !”õ Ž[„ƻ⺌eZM´Œ/^Ýx.Mñ Ҝw1žé| j¼”嘞F¾_ƒÖuA¬ºßÂ\ï=~¼î'f¨ÚLìtÙOìXµÅZ±©0Áî"H.8¢vÌԊõdŽÞ:®bB¾ç2Fñ 2ßõškD°»vQŠ£Æ Jq‰Dq‰.bÈt6âäŠ3qzÕqªã¹«»£õ¾lÙ®SEÛ£ˆÌòº’Êð†¾ô»™$ڟâæ +nDMQ»MÚďÕÚÇQë ÂJ´Ë€>_!P©ljæÏ(’ó=Ðy]{F÷ížÙ= ¡å©›Ðö‚¸j~ +VšöúvƒéëV#黆·4×w½ç8æµÍg!ŠåTôxµÍ(Ëx 3”Qp>ðá#)JÍo¦a8ky.e‰ÕV§è]!f‹NàOR„jØJ+ ÄÏ(=ÒÄ:rÅs0P,¸™'X&*¶›,¹Þ(Ø µK’YkÚ/¼®huûOq±¹øuÁ¥ Ëú,·LÏè«Vƒ»-«á¤*á;³å|ŒŸ¥·„°š”¨×Š›¢tÉ0 n$ée¯yŽïHëY?"ZÅ¢F«UóDë/¤tÕ$læ D¯z Tí¿vázÛnÙÑW­*ݱ .v¦È,Ú®´’ñ.|Tid¹'@!õjC;ÞPÓ÷YËs>Ë)3 +!<[Vo"@¬¸Â+¸“æ—½D‰¥6‚G‰ýaô‚K쒓Q¾ñšÕ3½© ·½rR[’Y]ÕÙÝs[Ο(·Ø’ºqJåýbZqˌÆY†#Ná}a˜ÛÈò+ 9 ¿9b$ÈáàƒHŠ ±›/zBéÈ°©H­R®iN¨i@„W¬,·&¸,¥ð#†Ã óhÏ‚Æ« +/Bn$ؽ'ŠæŸ»Þ¢ÜtŸ¨Èm—S%×WœbnLmÜΈ…ßÝ@ÕüâØ>b,ßGŒæ9èµlïÅÍ4+ !H|Ü8iªWd!Ĭ6 &Í«3ŒPZ¾f 8CîI­7å^dMóa‰ÐBl˜•¯CjÙ~(¢2Ã*{óTã[’dý*žÃzÝy#A«¶ V¼æ õÌ?RËúgYïâçoªa} +sëÈHþ«Ší,H1þ(Do )Aå2\q ëí*î³ç;)÷g¤‚½-ÐâE «  §9J2Ý×i’í%§l|µqkãՒí¹4·ÖDLk$£71‹ö·ða­=PyŠS`âo Æt+B̐šzÖ#æº8Ìh ¡#¤ÅvT"³#{ #ýbu€‹"Ô!Î. ;Fp#W|Çð³†AÐQ2µ`"‘G¤Ui#†Ke3˜\n:S4h}ã}‰ÜtRHð»›&Öۉ S¦bè$! cG©£•‡šjVŒb“û‚ »ÄNV[t}—ÄÊ÷‚ºi6¢Z2½©·Mõª÷>ìØ-úUÛm¢äúLô|ρªõ?SxÝn”ÊíSx]†n82Ò-N(Ȩ3d$±8È ÅeüpÁÉ$ÕwÁ¬8à›¿[1ŠÕ#”`A~ Éb­v­Õ,Û{(¡5Õ­Ü?ÝÊùN­¼ÎÛ=£¡2 ×-œ€Å(C¯4e7­bÑz“¥X}ÅЊÍÄÐI­qÉ d)…ÆÔºé x±3„”à‡O“¹zæ_€rWˆ)‚k¸iB;dÅÖs-Ïm‹Ì{,'µÝ²kÖw¹i7°X¶ €žô;šf¼/£|÷Wü¶Ðdœã:T}ÏÉçGì$¹Cì4ÁI’^p9O¸ϔ}75ó¤h>J2¬Ç`S±sôNQrÝ PCôÈ©ƒŒF‘N±y4¡ÌZ(›ÊR¤TmE.XB tk‚ ³)„ðè\bøDöÜ‚ƒqŽõ4дgº¶óÅõ¨Šè5VvŒÞ F”OŬšŸÂG«˜£´ + ª²'»n¹E÷‡ˆÜtb¤¶!Nªb€ð¨ ùñb‰$½àFø¦Ê¤L¯(XÁv‘à±B3Išñ=Tµž˜Mï+”—&˜ñã¶H¹ÔH–Zv 8AeÜ`Õ"†Le-Tm|Ni@,¹èɤ6aåI¤Iä5%2ËUÁë|Õ ï+¯dvÀé¼ïýÒõi'3º)¶ëþgš5¥ŠÃ@ÃÞX’â;ŒÓ¼WiŽõ,Ïð^äˆ%AËu캵æ»zÍMp² K@¤ÅÀ ŠAÌ4LÄp©,EÊõæãŽÙo²brÁ®¸ÞòÔN9~¹½z¹Å$Õzfõ Ïy¥÷Ào7Š¼g4˜R,3%U­Ã•öR<ەˆè}nP[.ˆMÇ ¯k9®wžB×qÎè:nüž#QVÉ=ô,µa±Êl¤g|ôœ§QžñA*Üïä²ñF-Ú~óÇ ©ì¼êUbÓ\‚@D¸t!…oˆB‹ ’Ä( Rœ^.ŽNd(R¬4§—õljÏ÷›ê8‰}ë·[4;c–­ç±žï[ð[¿ý²ñ¾êX›ìÖC±é9êÙîAǕÊRëàÃ$_De&Ó$ãw¬c¼ §ÓœOù§ªöçLÍþC+61Bo +H¨c?-¸í¶¬ÆPš¿ÅB Aj¡qÕö²Y2;`•mféy ”îŠÎíŽS:´JǛfËðJšam K¬4ªäžý)Î,73S®2U.fX\ £4,VÍ3ËlòjMŠ÷üç©ìcfρ®éW7Ðwne4Çr×y»ô½‘"ùΒTç‘T³¼cÕLO8¥ß%£t¼åT~g’ìzë&¿¯Î|®äü +_XÜ +±½D×[ +¡ÔÙò+Î$ùUÿ¡–ý @PjTØdˆ‰Z¥&‘aHInIÃgˆAÈÒÊAÊu!F¨=ø„&ò¤Rûpƒõ¢0²Lrq†µ¹Áê0~Xm;Rµ]S×kJ»à‰•Û˜i–ù9P5]‡pLnEYž›nãzÌë[/X›ZÏûa~÷Â#a‚Õ5Ù%2×p[‘™ÝѼ?Tä¾ ³g8žêYn¹mã¡\·Þy-ËMÅýMDt»˜¨¸þ1üª5Ù}«µ¬›%³sjãv̫܎Æ8®S@Ò¼ªQvµ‰ð0½;À€ÍzœÐ,¨0±$À$©P ‹Ð>×2ÜÕÛÖãP½Ø¨Þ±·¯'wÉ]Ï)¹ì¼´ûÖ‘ù›Z8 vó¹BìýÌR+ H ;K"‚÷u¢^o"M,³`6]·‘†ål¤á» T<TMïA‚UgL˜R(zŠÈË­›O=çAŒ_r)|Vl5O4>iˆ^7f*«ã:JÓ«r\Ús­Ra†Ñ€ÓyޚU»ãy¾ù<Ò5ª•ÛI¹í½Ñ»N¨ÝªKÐ"§Û¡ódfZÝu¿¬8 '^w’hx‚@¨ J˜^)ŠLf;Ü-8ãÑZƒK²É$ õ~a¦÷3ˆf½ _Û +²K- †ë•†Èü]HgwEëZoóTçPöétû¡Rú]ЗLۅÛ5µi}Ls|癦íCF빜ꙋcR:FòÊ OšBÌvŒEÐJè»£<£ÔŒ « YN$¿äH¥Ü6Ñ%˜±3ôˆ&¿¡D¥6“+®óX½â:ô0É]–c9¦ö]ÇÌÂíPŒf¿ +0}ˆpìúšU°u„Vc ɬ† 3­GÑ3öÆã”ç¥h7pžl:"V[ ¡Tš†¢·š¢sŒÌ E“Ú1¬f!Dm6Sg"C0¹—f9ÏÂ,çežd=ˆO}.S:rªj¸ä\ì %0cÅáIþ ۟_õœÓQÜÿ‹Ž÷dŠÎ+Í°7£VZ‹S 糦ëGDò}R™µûö³æz5h½_iJ™ .µY ar!z–Ê´LǬ0·0ÄdÃ8Ü¡¬8µ"H.™P£Ì4äÁ3Ì0ÉO”a÷šé8?CÛ«@ÅæŽØuÿG-Ï)µè»’›Þ¹ûUHs:¦7Ýgv×t_!ø’Pœ.)¨ì®™•Ó «ðº •MGVR»Ñý²çf@­â7[-³¯ÐÜoÃ4ã[ðd¡µÅo&C³ÌòÉrìÄU‰Ÿ©2™æØ>ÝÂëN؀ÅV¤Xë´5Jô%[´– ÷Çòª®£Ëw€é†%€$™lœWh)€Or?PsB+³¦ØÛRќîéhN¶TvED¿+“Ù5Ñé’Úw~ˆuç_šä:ÎÞ÷qÊë~Ò¸»ÎOÁ湏ŸÑÙALtÊ%[EÆüŽï;Òqþ‚KvŒ•åTǑJM1êÌfÚå¶ÒT*{`âCªð²”òৠ¡¼4¯<Pô(øŒG2jû­àõ¾§Û±–ç–ÚxÝòJF£H%« X-«@}Û­Ïúby%ižR×öêµl¯¨+îÁË‹Qd8V7A’ñ)Ks^¨Mïq¬a®˜e+µF “ vÉoÒo_å–í]»q½§vM'ßµ]zž“ûî;‘Ñ]•Ý åx@*{ß3u÷ažd¼‹4 NÆÉ·@‹¡“ j¶ ˆÈùFàÂø$aE;¦`ãmË`>±‰¶ö/˜Mg"€Nó“ex΃ÎԚ†'4F°:×+¿ãð³dÆâ ³# ÍñÀ’Ðò”Îð `4Ø ës¬bø?ª³$›ÿóD«!½ª]@eTf¹©lëUßOžWô–§›ÆÈϖ[-¢^ + Àz¡¸1ãgŠó;gµ, ©,/™%ÛMüšÐ-L±4¡îš ˜ä8?c‡éí¡Ã´–ñ“uV!¥)!%ŠòÏÅø±J›à‘C5I…‡ÜqÜÊqkͅ0j FÑÊ­„ù%·c5ãÛ´ý*I¾R½Ò>ŽOpã6}﹎áÜ´]څï¬g;U×SM߯\2¼.Ö¬8Þ¯gø­„(V!v¹‰ ©Ô^ø,Í[ŽXj2Nó¨ºÎ3µo¾ cՙ TGÔ¦ñO­œÎË=Ë+VÑs2QrgªÆ'¡ÙY•ù[ü‘[™Ò5Qôý&ºÖß@Ùú›(:/í¶ûÉ«š/b§è¬!Ç t×?†XklšètœÈ@–Yq=W3ݍ4M7Īë²Cê; +VžWbºbÅ-5ªúN$4ï+Ñ鶐ÌÐôÀÛ³<êVî/^áú'"3;«"4½$ïۍ¥4mOå˜Þ»z¹‰½Ü@”[k&P,³¨Ô\CËTÊB ø+ Øl%+ñãtf¸Dæ²´bËàÂÔâx0‚¥:|„È3œYn(Ы·™éWý‡Ú¦{bçxAß9QÐ/Êu÷½Aq:m¼nڅã9µr½ãò+ãC„è=ê¦C‚ûƒÖ18Â¥µ ´K&J¾—,¿ÜZœb{È1\šñÓ 4¨ÈÇ-ç!ˆ1Åz°mš±Ì’Ç8ËüA¯ü$³7\uGNö,ÁÊQ«ÄNW ‚„*ás#NÁØuýxóSºŸºßi¿s½.xžW…DßsrÛ}§VÞ/Vá}hZÏ¢<×qšr;â´lª•ë «Ôˆá¬Ê$.aZ½µ(bÕEè8­eˆ¿Gø’ÊN‘Ì4øŽà)†Sgɯz ¢W½IÖÛ8Ù~êv^×ç©Þ5H(^w4ï…Ü|'$7_;”î¯DµÜ`³ÔŽQ³¼%•í‚èÕ̂*wgíºí¢Ýwê}ó»^úÝ‹¾›·Ô:p®Ô@h¼Ú†N5Ù,Û °×ŒÆö ¯ VÓû’dÎ'UÏ)yß.èàْ[@88Ý 6Hn3Wl">³^9E»á±5çpà!$C SÉ”œ ä'×5ž¥4$WRÛ®cnÝ|oÜóÌZ !$J·e¹šª˜³›¾sÁp>‹¾¯ê9$Ö­§néxL”Q$p¶^Âj:Ob¦iŒcƒ,ف ÷Üá&ªŒæyÆ{¿s»nî÷`£ Y^•õLÍv•ã˜\ r¬îQ“û‘ºë¦ZzV‘ïöݱ“džQ”zG·q»•%ùè‹ÍOUÙHR‹m¥9fWA¬BCyv¹$±Ø$ˆñöÀ3DöPZ¥$·ê/Nñþ¥IÖçPÅøawŒ¿QFÍ Zk%Ë.¸'nەû™Wõ4ÛÎï4Ý{š¥»ï#…ó‰ÖøËèìN‰-׍Uw_FùöŸð…íÂó¾C‡âäzƒ +‘ó:R¬5)L&¾"±5Lá†ˆNA +´KŸR’"Ô&Cª *E©8L+ Án9¦úå6ì’õ9Ô0~(®{üÄv§zÝÊ댈æwTHs»ïЛΠ+~Ó Íó¾^3ÂéY—dO¦©æßDÇr,Ñ.4jØÈl?nÇq K+9Њ¾ó<ãv;Q·?êUûŸÞ3_ÙÕ&Á„jµÁfêÔ2͊ÇLÅì%~¨â”LÍœÈI*@EÏ4WóËt+.§êu§#µš±ÌrçHÝvh|ÿ²tç•Wºø[¶Ç4dFLÉl‰H~G$4· +Š×yÁoº'ÖÌN(-Ó Féz;Q4ĨÕ6fÈ|r¬*C‚Ãûƪ¶ 3KdŒtÑfšÎ*Ø,™¥R¥ÉLÅê'N/9”fX\° +¯ RåtÙ.YyeûW˜Zk,†Sf2Xk=Vs~ i Ï +é­‘GŒWt¦ïÚ =ZnTÀì 7If2Ž^v"–mw$DÇûJ:Ó#!baÓÕÚnçtLÞ7¡h6<~^qjšÈ@ÔlµyÀÉbójµy¿q;é5Ž‡A& +ÅÌԙ +Û[öÿ®è;–å˜ÎĨ%—Áfka£ ãyr­Å$·Ú8¼dÇNŠYr3’`s,ˆXnF,8@Wk,I3¨Ú®óiÅw.X­ß©Š½y…àþª#²<--Ë-³[fá|æØ>a&È ÓÔZknÑ{ +)R- +-Aä'—]˜ë·ä:bvMåºý8Ó°\ˆÒ).å~Õ2^E0‹ …&7í¶ëªæ{UHsW.üŽä8V'!šå‚¸i{Þmٍ 9BëÀ+3dÙ.¤¦÷Çìš?í¶é¦Ý÷] + '5%J¨“æÖˆñŠm‚F, -Kq9Zj*‚[kÊ­Z?ŽrßyE¥ë†Û1|5=‡R<ãCìT•½,ÑvàޟjéwW.YÞs·Ó‚ãw+Ï°·¥W[ÎN“¤ã‘Àá’Ë£D'‘uã·eÇ s$_”2é‚Ù]øºåT S$v–Ô!pˆÒÀLÇ"ìTÏ'˜Bôí’Y‰ŠLØ»µc9%–š‡Ÿ(z 2\/RéyUí ¥¶MÇܲûJ®zÿì¶ùICdx2Í19å¹Þ#…ûWø oyŠãŽ[µ~;”îeËsø¨ÐJ”brØ 6ŽT<§bh•„-ۅ‚èyFëûŽäXÖ§à“ †ï¾güλe³ †ÔZ"H’.Ȫ8të®SQnÕ)(¯.˜@±@Ü<Ř ©3À0±‰Ô¸‹ñkN‚æ ¤vÊ3Ì­&jÎÏ8Ås3ŒXl-ˆXm.Š[oÍlÛo¬¾ëbšg<4K†·åžÝe·fz9Ï5݊ ÖŠß•[ í? +:»%ÄvL±íÄêEaw Bæ©Ìc(¦§‰šë€²ä½ËÓªM‚(Ä/~Q‘cCKM€ˆ—« ?JÄøij „©"¨ÔF~ËoÀ«˜Û q¯Øä &‚Ûøm½¥ø…Ùiœí»eWMWý²ë¼Ap¼ŽâUÍs—õÊílžæ>2²b$Ho(Rg$rÆî=Tsþú}ëÖrˆÒkmxm÷¨h¿o +6§S݂›¡lBÛPƒ=7Hq~Eðr{‘†½‘«Ê4Ü‘c4£æ Ϊ5I,8fØ\Îí§vãzDCr¼ª#2=huMƒ¨…6ÝÂûUEi5®ŠÐl8Ñó Y8¿y…ó¥[x?y÷¡Ûy]”+§cnß} «Z=÷Y–â}Ñ î„9ֶܾû+K/;š%´¾­zœ« endstream endobj 128 0 obj <>stream +8 5Oj(M°:wÈ}÷›ŽÕUÖ;Ó3\œ"xO´¬G^áw8Ñ5šÞ¯suK§1äM³À¹…ã ¯i‹_ԚŒaR|ê=÷s¢bú+V3#f¼°ø%Yp!b¯«ÿPÍø(~‡2¤BK@DˆpBË°è䙅&Âljl‚–!÷*Y3©4’¤x®(HŽ'´®ù5Ñò™…û»]³=¡ø¾â÷%×âׇ·Gr³}Ñh€½e4NÌ,±;‚Yô¦öm§ÌÂiÔ<×{0|Lk!`¢_d¶ä3Ajé3‘â•Z„êçՈ¯šìÙMÖ\Áçk–©v©ÅDÃâR ­ÒRœ`v¨× +¢[H²KÎ¥Yî—(Ãù™gxÿ »Ã(b¥éTÍø  ¹^SFÉr+îBŒRÜEX„xößHÏ~¤·Œ?jÍ÷—&܋â[X¾ç¬z‹ ¤*†À$†ÀBä†ÀCÖÀ‡“‹„=Ùão8IN5à—U^ÁAøÀî.\õš¢7ˆ1Ì^¬Âñ”ŽÞx^Oî;Ÿ ô%2µ§sbçy1GvÝJ1n'tïE‚îýKÞ¿®óL.›ÏƒÃáXÅl;Sô]äÆ·ø…åUü¾î-Í2ÿå)¦—¡¬‚#izՇشŠ –DÏU 3ÌþӒ÷Q¯ïÙ}ãyÁt¼ :W0&·M×ÔÆë~ªl½+·ûvÕluÛlyÙö¼ŽÔꀠo} !XPôí—)²÷fžÌ*Ì@©U˜‰róŠû^nZ·SZØ}ÿýR3A\ZO¿çûUQZ Ô}7g)®b$ÏÙ4ßt-~Zl:Mv?z%ۋÑt. C V«5ÓúšÕðMÕx'p Ö$(™Ž-@B¬"à ˜“âÔ¶¬7rÏ{ëX½úeï³[9^ +Ÿ.¸=]r`®ÚRìpÕ¥Ùö˜Ò™ åVډòKíë¥×m³oÈ$Ùt1Ë1ü‹W\ ,·›(º/¤=³ DI³ë0Ý.R±?CrÀª8>-¹$ÞE¹UGY†ÍñHÓz$¡2=,Û¯>Mèb6—ráwJ*}Ï#xå¢æ(Þà¼þYË|ï·ìÑ£€´4bGHý¢¬zka~íY bû$̾c³‡«Ô&|ô¥àÁ~y$§Ô4ðÍMôH©y­Þhšc>Ï4M÷ä®û:R6ʕß5 ÕXfÙu(~Zn7в>™ußùPÙv¾jz_d¦gåÂñFÐ0½e’e9íW®—Ó£Ðɲ7°b9Ɓa…j@ +!S™%9кÆá!R/°B&ZÂ÷ý‚™jÕ)PI^5#çÛ@É/iƒlî8^±$½â‚YsŸÄYõÆággzÁÕLÅx>©5 6Nhp¢Î:ôDуWvÿ‰È솔½FMÕ+Žå9‡ó\ÛÍv͹:¥©Š*SñCebç‰n’« ÁõVü¢Ð ¸€ÓjÞ"Æ0ü )¶?Mg+Я¹Ÿì—DÎÝÁ†û%#{c %:† Å:Æpcônq†óMoºŽ ç•_±ûÉÑI>ƒ KcjÙþ“%˜\ + °7&ÞԊFcY=£a¬Îó”[v]‘kÖ«L¹ÖŠÛr׿#9ŽåKèP©Q@ñ–;àD©Y€1¢O€zŸ,»ä|Õ¯»ž ¶ˆŸš +ô«¾“Ã#¹éº%—ç ‚ß%µ^lBCm¾ïz¶µí|T[†·ãtóc˜äz}ZÛzŸiûžô5óo©á £mýÒ¼ŸY®í\’m<(ýFp*ϓnáuÆìZßsó]Ív'×ÍG^át"lžÊ"á¢g ÅsCªÏ۝ç ‘åA³s¼*³)[¯§/œ1Á°8 #Øñ,Ž[ÀP~1XÑ®'ÀÁW§Ø€Ø´Ÿ¦¶ûhÇqY¡öܐÊÖ«øùŠ{ñ› ŠóÄê¼Æöß;"«aã ÇåX½Î¼˜ä}eõ]'„[nàÐi‚• ÷ +6ãÕÝÿrçx<€‚ È#gÅ(5בžó4Ø0±9PBE?B]G ):[ñóº£ðº© 8@ˆqdb!£½âvßþª–LO…LÎAKʐÄMV[Ñ܎Y͂›àâEZÀ59U°¶d՛ %3 6_ö„k™L3ìÁLu  eƃé]äpÓ`¨`Iì¹ï̲õP–\r2Yn2’[oMmüˍ†·ë®ó@ã%ƒØ9J7»kº#]'ô’ó†Á©Ïú6Wk^šÈŠUø]ÌŠ,ՋCNýƒ§ËŽÇnÂi^ óµßø áS(G&’fSš%'¡EN …MG ˜¬0N¯G©4_VŒWRJ×ùh½æ>üä,ˆSg*†Sf ȈrQxi2{!üºûPË{ðÐ[oÚuç ¯è:køÎ z÷Or߂Ét¼@Ȓ‹CÎÚHQ¬¾Ï}Áï».¸mçYu†âäZfËz>QilŠàlˆÞx’änŒÞtœÌL˜\oKnÙo‰«›.—“K-ůÊÍCR™ àԚ‹ãU› +4ìíÚ%ÃۑŽÝA“Þ+R.4¯·l‰}ÛÁ0Å÷’cøm‡ªž›‘’í1QòIh~ÇÄ¢ó,Ü Í´€Ç°‘;‚[q!pžÐ*ÌÉ[ž^õŸR<3Ñ,\/:Kô;IòʯúÊSŒ§zÓû¥!2;pœïì®ñ\ð{o=ßO’å»K“|OQŠëK,¼Nە÷¡„Ê蘄Ì萈Èúo¨²»-÷MçB¨•–‚Û]˜ç½ÐÚ¶KfßvËìÛßýÒíj¦äºŒ”\ŸôrK1–ñ5ÏõšÞÏ@ŽÉ¹,ÓûE2þ†ÉöGí=­t½ /Nt 'Dí>]q$I2ä֏БJCá«Zƒ’÷:×ñ\VH_JjÏ ½ä·!¢w¿(hŽW¼®ùÈ­:Ÿ¿ñŽZ6Ö;¿ƒrÝú#!zߘ5ÛC‚Qh pŠÞ0Wn&N.¸–æ˜}Å)Ɨ,»âF˜WjBnß²<Ûe°‘‚£@“¤ö"؅ižël¢ê:à~$…Û ­mÿ‘Ù÷ÇÃ~ßuKlÏX•ÓHI–û2бž™-ç{¤]w”'–[6 ymû/ŒÁÁÔz ¤nó…?°ùÂ5øˆà0Q¯6¢nÛO¢Ä)Åá©Ä#ç1¼± XñcÊlÄÕÚ6È]÷däÞg½íýˆñJÍÅ öf ß;èP¡U(yš‡x±"+Š×‘üÄñdüÂs^o&¸É2,ÎGUãÑ<Ñw+F±æ 4FïŬ6똃 V AˆÑ ŏ”™}ï×4?hEû‘Tµ +P•Û‡š'´šdûN'ùÆ»Ò4÷0Cè|¢åhmr«ãHÕþg95çS–`÷ .Ù1âԜWbÙxr¤ÜFÜd½‘Ó}”Œ–K¶—õÂ÷€×2Ý  '3Â*2gU­‚%½F š,;-œ] N²b;Rh2O²>û•ã%¯î»Á.¸eøÌ¢û$|Eò-Ó±0Ó¯@Dî%ÕÙѺuT Ç¥øa­Å Çü#ô­W½¢]pŞÝHZŠ»˜±nÍ6ÁOœ^rЭ›ÎG%ëA–Zn<Õ³þgŠî¯b2C„$ÿV¥¡$ÅvG¯·çx.GŠ®k€„ÙÕ!‡éÝâ“^Ów$|YõC®: TìN²´bk ¢Œj‰~ɝ(Ãò'~¸ì!v°Þ>Š_öµç‹Æi¼0ÑtÂk;¯d™åæጚû¶aù¥×äHÞ«Ït$Dq~¦‰æóHÛþe6Žg‚…¦ò܂³‰†÷Z´è^ ¥¹š)P‚kÀQ:3Dµ–cïO–Zpt’æ-Q0¹š)Y5ï[˜`s"vŒæ%Ë/¼Œ£×ÝDIÎoƒÜ{>'µJ¨â7Lt"X^eY¦KaŽûH°»Œ#VÜ aTšËS¬Ž35ó=ð@¡q™BËàòTö! ÏÉv/€¼ð'É0þ‹ÍgMëuªf¾ +ôëŽâWå&# »Áðq¥‰ ™’s¨±2 ªéfˆðDZ´RAj4@¼ØÁ60¢ä×dE_1ºídð€Ù?°(Å!”¡E€ÆêP+Û °î‚áX\„«I ÍKç5¡ò¼–¢x®CIë i× Ÿ*´#˜[J3,÷#›cðýúÀ3´Fa~Å©d{¿f|†ˆ¶K)ªïV˜aø 4T0Ÿ“ÛEɦ ¢é:z¾î.n¬Ö@€ÀæL’ã:š©Ø’ ÃC°âwô`sIÆq+M…ÐJ-CÎك–#ù—¨´<\ub•]÷‹Žá(ÑRåxp⅃ŒöʦyփÈy2“¯0SD6¡…ˆlà S‹Q÷¡ÄÊõ@‡ž>Bd¾¢õ!4…«X/šZ\Þ%H2ߦÉÆVÓt-lºb&Q«¨š_R ïOìPµ¹à¡b됒„6!Æ7®ÁEªm†©¾ûaŠõPžW^°a+xªÎf Ã}?WõB-98Xl f´ÜBätÅé<×w¾"´/˧@CbA£t‡ + ¨-ó»C꺚(X=EkMû…ïyƒà{;Róބ¯* BÊUŒȲ +…N½ˆ]ëyƒâ{9Ïu ¡W܉²lWYŠÅU¸é¢-èhÍlÀêáxîʮ롮íTœ^ù6ZòÉóªÌ Fã—Þ³’k¹ˆl‚L7íˆT…Bƒ‚É}¡–  .¹ž)Û΄9–Ÿ»è¡b£ cOñ»b‹¡Ìb›Ér©ýÀ[r+’Oe4T°7äv§"ètFÂÇhmÂ×÷(v½É@rÅÅ@Ézg¹ŸÁi.âf‰£üÒ×H½ø!É+»Š_•›$:¯ZÑڇ=ãKŽ_õ;Vj)€¸Ü4ÈÁC’_w¤×\ʒÌbÑx)€Ol#€–̈Ysˆ+aÄë~@RÔö°sµÆÁç -CO “+θE×Íxn¹ÕTÃø›(úEY®KñÛ²Ë ‚Í­4Éü§ØÜÏÊ®[yŽá=”ZqÃ,¸–d۟¡¦J­Ã÷%çkÒõšR³D$ü®}ûší½ %v‡ŒPç`dém¡EŠ>ƒTó‰Î³ÓêÚV+ÛKjZ™dz_ÈINä~±U±oºA-´>Qô2Gn%DðbÞhmãqµr(F)7 b”[|¸fš(o¢Ã{`Q2Û ’d6ÂFë>‚ ç›Zw¶+Ç{a–õzšè@êšÿ3eÓ±zÕ/Ü4¥Q˜)"›Ð‚döÇªî¢ ßUŸä|Kîf؎‚,ïCÔ<•5(©~Epé†G–_s+€RmA«µ¢$7¬¼¦í„ÖöÞÍmgòƒåf"܊sá£2»°BÅ:T‚G(29PrŒÁ5 ŠÉµ$Ë{å˜~F9Þ¿$Åî*~Qh'„Rg?U4ßB̐ÜÆ® Bºë7bý5cþ:a|_´M£D ،€†:J†CÄ°º0¦æ<ø¢$èxŠ…€™jóógšë¼œg›†ƒ%AHœølà)£ø’ð‰JÛ°µ!樬 Ú +ÒÌgšß`³-K0häb(ÅfbÛx(¿¯¼ˆ—ª¸!Bô /MiÍ ½[–â=”g–i•‰’Kí£H¥6bg¨ "‡ÉŒƒŽÓ-€R ¬ð ©$­Ê„×±9D¤ùŸ§²5Qht¤ÖV©Þ€Y®¼ï +¦ÿ0vÙG’aû6H}'ƒUV"¨ÔV©^©‰$¹ì'€Rk%€æ)„`ó çÑ:ÆRj®s«0µâ4ø(ÅAø˜à0ˆZmÅ.»Ç’jM§*Æ¿4Åî^²cœ«xR”‚kprE#ðÂéõ@3‹AITì¨Xƒ.ÚE +gr´J“#DvaŽ½³é¼g˜~Ð +Ž’ 5+AjÆ*7ìx¿D4×[D—§© )V§™Žõ1Œ[pvä%€žÌ@Ž_o)Q°6ග'YnÕM ­Ö>ô@­f½¥0Åûê¹N¹eÛñPÑý”¦øT]ÓÉ4Õ~'yßÔÂó€ k:5Sj!Z°Ú:vÄs/|Æs>Núž5«vŽSíÿŠÉ ¥ì¾‘wÍÆN3^÷!Ï¥ø ³Ùýhüè*®3¿d» +1 N‚Ël°k­e»@NX^à Ñ|ƒ ^Á%ˆLäX+|RV¬bÕ¬Iz¹%©hô(ã6^èxáWèP©yà,ÁIÈxÓl¼ëÌ­6evÉùŠIðñê~ÕYeÝYaÝCÔ ¥I’Ür°b ƒ!ÔbûUÛu>Mx‘NèWøžÈV±à^¡Ô:|Gî )ͪ,S.—'˜ÜKÞ»F™qÀq*ۀâE‹ 9Š—Éúš'ێd˜õ6 ŸÑ2zÀ%I0¸>XnTŠäÄ誠ѰÍ1Ø •ÍHjÕw¤gº ;Jejˆâ1J2_娾aÃdf!æ»þ°sDǀ#/ñƒߑ‚ɵ0Åæ 8™ŽÅøA¥Ý<Ã}›':¯ÃgË.Ã×uÿ†ûRšZXŠIhŠÐd–Ü-Å0» b×܇PŒ/B ÷i˜e>ó\‡at+‚6X™¥ÕYŒßV’ïºÃ $zŠ(¶;_{6Vö:Hi#Ë*;%L/b—FìT™5ˆ±Ô:@…ÏéÁI·&Ê-„Í”Û%ùMTÌÿàr#ð‚¦;èô!Šõp°â&À0™aIš»^Á…¿ð:RµPt,Ï pH‚’ wå +E ãm+ âSd©u€‹`1€H%xÚ(K®· +0T¯ /X,e× S™ã" +0Ö/ 8Iq3Bl«˜¾…/éŒ(X¦÷ $þpJ΂MÑY„$³¿*¶Ã*µ9FlãV‡¥2 +hè\ŒæÈðž3¬ Á_©Üt°bz&—mç åZÆpƒ3‰j±©:¡=ˆñ¦øX^1ò̒@ׁÜZóɆçZƒÒr²U+Ð07Eé•7)~Í­è™bs RåA³[a·øø==`å²@Cľ“D ¢=sÈI’w¯Ö0ÌdÇ2Ìp¿P¥Ê¬XÅœØ1rÀÅÏ#Q® 3Iô>*6¬¿Ðœ%Ջ •\$‰Uwàҕ7@rU;àôvÒTÖ1ô²·@Ãú“fØ\#¹ˆª6¿®{0LRûe$±ê3˜Xr,L±^B ˜ ‚§(=âì‚ÛÐSD6ÌA¦{Î`F“øIu$±ÖJžZot®c´8“DŽXg´(V‚åÀQÌU›IÒܟi²ílœj:¾°¿‡ºÆûY×w;MòLèl‘Óù]ˆ• ô"|–"Ñ¢3Ð`¹Í4Éz#0ýN­ÔV#EH% ÅŽµdgéµ®`$ˆ¦# +ó[ì\Á¹àɪg€Ñ’ ñ‰õ_-ڍ)6Ž×€f¡ãĖZÑî–U2= /`¶›£yŸS +`ÛZ¶G¥¶ Œ„•¯úC¾Ë Ñþ“áXÿ Ë£šj±3•â†*ÍæHÖ·±ÞhAãe’”21ŠÁ¡ÍûŽ¡VÜ "–\ŠŸ­z…¦2?[k5Mµ?B õKÂJR\„gLCg˞B§ +Îŏ+Î'ú¾ó¶ï:ȽUŽä=pëÍA +vŒAJ–Ì@ +¨W(¶¾°}Ï}— Zç™ø)ZO¨É†¹<Ãê  µH±¼‚@†ö¡dÉ,͖Üˑ}÷¼žYàáƒ*c‰ï㗕6ãDוðUÅ-RÜRàƒÉ“(NH¢^ı»Oú¾KT>ÀCL…®Ç†ùR¨à˜`rEpˎïÌ,oëÛ˜ „èÄ`2êNŎWœˆÐ\ç’LçÅø9u…Ü/”HroÒ×})iÇ‚‡©ŒCNTZ ž-¹1MhP¾m>[v–æ¸ïQôšk°"´þ ~ŽrÙ!¸¹xí‚@;†1Ô²ßPÉy)Q.ýVŒÏâ˳<Åð×ï[Oç*6·'ˆ-Á ëXo Ò0L¯cß}șŠ Q"´pS½Z‘”2ãÀõæÀGSì५f!¼b[y†ái¨cú!”š3ŠQ`¦X I+6?Pm%|Yr1†cy@­¸@«6@Si;T²¾B¶Ü`¥k6±ƒõâ÷Gä|áSü¾æf$Çò*а<ŠaU[ uŒ_Ü¢õFb>ˆ«¶ RŠâ  É=àX±y¿ðÈ®: (´3^6ÈÒêíƒyåÖ¡¬bû´D— VWÐjgè1’¯(>‘µ8¯â†”µMôpÕ[üÂð&KqþÅyÖ¿0Ó} 2Pi+Ls_zæÿLÛvN­\yuÛi¨i23qSÕ6³lçí8é4h”j?ϒÝçaÊï|¢m;"µ<秛 +j#ú˜*¸­û1ú¶½ž «ã!­ûÊíYo¢ôzCFßüäó,¯ÃŒÕÚ%ù0œŸi¦ïbšä>X»VsZFãÅÕه¥8púÎ3±3ÕIv A‡r  uíâgËþ×€^ÏÀb&¨¼€„.^ðh?†cöLµ8´Ñe¹ì%G1¿i5³@«E³ èLÓ]xÑã}±³Ä®A¾óLÜtÝ-´@±yÁzS9ªélœñ¼%ûNyÛøÀyŠƒxARÿ¢s½aÙ_¢‡+obgË~!åh¾â‡Å¦#Uó×·Ìs¬Î åêåâweÖ#uÛñ<ß4PàlÝCäP±™²jcܪ£$±Üxªf‡ëm"¶Šœ*¶.Eð!Ó°)߶ž,»«7 6Oi#É*¶!÷Ë~Ag‰ CÍÔZ ,·6ar$Ä´>i¥çQµe J½µ,¥Òp¦ä<ËRݧàҔÆà…·Ý5,‚ê—Ìr,_Œ‚Ýa”[q"G.9§˜=†)ޟà™rk†±*•­9‚•ê˜%N-:ReA©<ƒL‘»’èW‰¨3”¤ùN…ÏJn‚‹÷-A‰V-A‰QÈ/œÿPãTæ!äz+V×ü,׌Æ›¶t’á©ÒrӁ²ý7O7݊²¬_á»bëðÙI„k¾ŒÒ]g¼²é®Ûö‡œ¨³-8å¯ãÇ+ŸB§ê-ć˞¢&jM)îÏfÁÉ(Çû%ºîEUۏ4]7¼¶ñ@ˆaø¾®;‹_V}òk.GJÞ çz/ÆðýCNUÚΒm'µ¢( +·‘óTãÙ8×v0|Äì+vÀäbüÂâ–Õ2½ :Qep Ì8àL¥ÁàÑzてù¿*»Or“sAÔj Ij1»ë9¡ÖŒŸ‘»»¸ÙªƒøÂûDñ¾¥9îS»ð½`Õ}÷"x•6aÆ+6¬Âý5Ot] Ÿ)6 2Jô>Xr-~Äô+ɳ]Oulÿcݪ‹ø‰B3ñsµfÓdÛ¥0Íú›(:ÿ£ºûÅ*Æ3 ·±ì’ñÊ.:ïâ Ûmœä~Ž3mç²dãµðý@žÌ$ŒÁEÐ<ù¦iÍ]'c8æÃ{2Hr8It®8Ÿ(ºbìŠI‚±A»ïùëSˆÉŠ] ¯Î@”Zm%Ï,·è˜þ¤ÙuŸ©†íAÄLÁ2˜,“dª[m+Я¼ª63œԍ§ãD×)©î;¨UŽ×ĺýÀíŽØ5»%¿èµ¥%¶[•Ò[®fúEFÂü2ªžå¶^yžŠÍo^Jós!•ù‹Øt=ÇfóváúïÍF‘JFÍç©ØÙbÓðr•Öq£Õ†sÏ!yÏö²„ê<¯gwˬ\_%Ԗg”’Ù¥èÉbÓ0£4Ï£d&È N)ˆì.½´¦—Ý–Ù £o:¤®Ù !.ˆRºj¤Ò4Ì<Í?àP™j©ý®è¹$ؚ…!²o:æ¦Ôºíhžå~‰¨4 4`u‡¤2>Pj%È1{ՐZ vkNc#£jÍöO+Ú æ™/#èõÆ—µ¦FɝbDç¯Ø´='vn7#Žû0Žå~¦mÿ*ÇÛq¦û!ëµ&[Nu,®™÷ÁÙ²:>Pó@ª2âՌObÝ}ç©Ø~ôŽïÀnؚ ¦Ù7Ô¥æ:‘éÕ¤òYŽ´Üækší`/Üÿ rûÜó>—‹qíojáxWHt½(#2Ï´ÝOYšçDŽâ¸¨ú>åÒû^Lq¾ÒZîÇ-¯ýT×ö!ÕM'ó4ëažæýJ2Mg¬Âm¬¡Ò:ÈX»\œ_j-ÐñÜHr¬~·åF‡åæ »S·ñ¼*%¸]’“8bˆÍÂÑf¹“Ebl<ݯ7>Ls7JoÉ,5,œ“¨Ë­Äy·P³«ÚRÁi‚Op)‚Ãøm± }çý"¡²z uÜÖ!ú"/±¶¾¦bXYZqWø+ÌËǤf\3o£Âoê’X>£½:ã|¯ÎHI¨ŒÏnR«{3µám¹ft/O´½GÊÎg©ÝÑñBoYÍøEŸM•Îo› ¯ô‡ Óõ*?aÓ0²JYC¤¯4©LæS=¿ÅØf,·è>Yòu‡õÆócIj{Lkۏ"ˆ¥æ1ôr«qšã~®h¹kx­º]ק^x=k¤N“’B£-‹Èi8Ör[NÕì̲íÍ/ûŽ%ZۋŽÚx¤"ùÞËT>#’"»•–Øg1R°4ž([œÒí‚Q:žÎ3n·åªåI ±Ý%¡ñXz];DgµK¶VcÔ¦°ªTxË¥É –ämV®üʏÅÉç/ñsŎ’´®`FËø¡RkrÝw>*Zß3Mëm¶^mØ©¯yu ‹ì³¢ÊZ!dT„áê¤J`ÜùIàü[L}­I7ÕQQ=…´CvZb–¥°œUXäJ¨rž¦ó)x‹ÑŒ÷vçy\Jó¼##·OUìíKt¶¯Øø#,1ً“TÕÉSR‹ÖQЇ“W»©:‘U•¶k¯°¤R[Ý¢”,#©š©'-#+²ÌV+]Óír/‹ÆȾ¦ÔmcSl·ß6œ&¢üBû8ŠÁyÍú™&»N+´î­Ðø¯R˜­DÚŸÙ‚½‹P]f£ª1ˆeR†"‡b—NЫ4&“‘Íf´\mçQ˜þóCK¡n½LÅâ:ì4Ñ=àH•Ù4Õ|pÝî+ïW‡ÖvjQîz´~š"Ÿ%ºÔH&¯ô QV¹„hikÊiŠÈ•……F©*…¡d›Â7AZk­˜Ù’»Æ{¿ê¾Ou«Íeª•FÔªóIFpÿPzDêŠ#6e™íDM­ƒ\Pa"ؓORÔMXRUËÒUŒ¢#-&¬³°iKݳ„•2êr7—ÂäH!/º 5 n#¿mq·°Qš«DµàÓ¦ñÙ)µÅä!„MªÿÀ|ÐҐPHê‘9A¾MÖEÕ¶’קB¢ù‚Rúɺ¢jVum1Y‰Ñ\Oï·tÓYˈ¬/„ªï'F³\ñꞃzŠ¯…Í鱎×ÕRWSЌ0¦®ˆØh:B6š†DM%Jʜ±Vèájz$ ;ÊÎlQ-p9Yø£H¬Q^Â#0µ }ö%zËm…ÚößuüÆ"ɤV‚ËoÏ!ss¨¼f£ 3cÑ\òòE}qYÅbSÔt”M˜““¯«*Š†%õV%µ5…¢ôt¥ÂÔ¤uUՕå 3ú ÃR•e°_r¢¯’÷­†V»¦'íÎûÏ%2ÝVæ™ââªÙʂÚ!;yOH]„’ÂYS¢Ëz)«ÒÕDDr•d´ã%•$®jª;1ùÎQM¿¯**Y§¬ž!0¸³¨Üæ³cË©Šá^±ÊZ¬[e;TNã_× VȤ¡š'2Pz°à˜ÙP 0à¶Àq¦M¤³ÊvªÃÖč’a¥455©MeQ•ÐdWo<át f8dv' +i½Æaèh +*…zJœKø"Á‘‰F63 +š9àyґ@sÄEG4(tQ>0Ù „(;$ÄV§‰§î7䈉IYõÕEÄ56¦òS?M‘çH-YM†‰Ž‹nãtÕ"5þ:f£~a¥ºœ²L¨ –>œž’Fœˆ†\HM¡! žLIԈ)+´ã ü½35áx=IÙ\IU1µº¸¶[`a6CVä¨ÔšEæ¦kƒqšçx¢nÿÚîï`Él;PUb °¦+™-°‡—ô‰‹‰Ü%mN8B*²¨`pê´P_3eEÞ\¤twŠu¡jrzby…õ¹[ ­àtÊ,ŠSoçw§’J»]yůf§òŠ×ö["Šø“Ah†Ôä#‚oÍI†+$Ј­gRDê!Ú²”“„pÎMJ>aRSЯ-­$±¯p“X:j4fKVÏù¤«õ )£¤IO¢cJGÀ"8|,p Là°êy¡À¼äÑð†ÁXã&EÞEV ·Ô–­Õ„$öõ•]Ӄ†Ü÷(9îÅoë̅úevÕ¯µï-¨1÷b«Iâ}ÕÁÐ~ÚL0¥3Ò`Éf$¨ˆ +€DP`à +Ã$ S@0+ÄÛ¤,®´c«ÈÛ#Fõtsõ$…B¤„U³ír¯H½è2Ó15™+ØÙW鼦túj#£¾Î>R\_ ZEAaîò£Ì% o“º8.¸7*ŽxZ>Tq>\M•(²ºWVW+ 0/VîÔÅÒ³–ˆÎ][Ô%±›ÊÈL¿Ëç‚Ýóš‘)ÌíLWQ˜‰¶+ºªEG>)”nH’1! Òbd O<(¾œC TÅ +N@5#˜< i^äL}‰Z“¦ÄuáõåÃSVÆ©«° ¨RضìƳ SÃYšB¿Øª9dCƒ@ы +Ë-8^,PÀáóᇜ 8j4@XÉfE‚0áÎr±ÇDZx3åü9£êò´£ˆœaZZ8Þ¯¶ +ã•z¤É%?b*·™µÆ`Î]«ñðFtÎQÉ ß +8‚%&pxKVYÁA¢?):p[ +£„ÝÅ̸°µ –¤‹¸Á´TÒp̉iGJ)*‰ô•9nÁWŽd6lÑùåƒ3ÉP_³ƞD +Xʛ +NAšޚ¾.$LM>¾ р•dÅ- ˜h*òùú\1ÎBkäL]bي‰EIÊ +Åk5&•1…Æl¾ln… +–†¢Í’¿ø*i‘ŠR7\ý€&؞€,09‘@Ò HV:- + Ѽp¼˜ðPÀð„X``0#{(|9‘!¸´ÐõÑÖŸR*feqÅt·Ò-V­7Ëuk®$"¯Q­¼ÒC±%+OHiA7/hQ:8~'6p¨`b><8@jÒ"jŠGA0$º’=)ä[%ŠZ‘5§Œ ̜W)%Ŭ¤€¢¬º¦Ee5h[ÃSFç'ɇA-#|LÇ  ¨~¨(@Úa‚#©"„K/) ÌĜ +s¦oCÙS˜âuژ%uÞHG*YDP?JXjì[J3ܦŸ×d°ˆœ@\m,¬, `ɐeáÁâ + +¶ÐÀAt’‚#ǏÁ8¦*øŽx€#oŠHZ<1(à¶È—¶¤kKÜÈ«K+tBKtE2½bû¶b5Ÿ¡.9؋«l\?QÑБ‚LÈ­Èb ¤^` À%9€ôãðDŽ`ŠÀÐé@â 0éÌ<#þ:°§Èg_eœ¶ŠF¥”V·ŸÎêZNï7%ZGÜôƒžUFþ¹$0ö9!@B‚cçŽkH‹ˆVfÀ„‚€Ðô`a‹ID+#8cŒP@ê1ÂÕŠŠ7nQäè9W +ªéjz‚)‚ú2nËr-–Fg׫*h¶# ¨T€Àác‡/ÅŽ +pÊhÀ’ Jߒœjd& 0¼™Â nç/Å·ÜKa}qN[•tÑYµå¥E˕œÆjç/q“› +lô)AT† t.8àpv€àÈé`Ã p´\€"—¶(3 +®0ÁÑCJ0) ,½Œ °i±@UN‹‡·ù±k]xm·(”´C]¨ðš;dN;b:£©8IqC&莸H@cDE&-BéàP¦ØÀQ$a££[ŽŸ8v2LÀq!€ÓÌ堌m£M²èK¼ÉzSeµ£¤%&%Ž7I‘×¾Mbµ¤ÕՙfL)ê‘ÏL"ˆ¶Á±dQ‚£¦CŽ 8~R`àÀ–Ä0`ÈE¥€ª‰òÅG3&Ô̞ókqW¹WTí? QËXWÓ,-òKUºÈ´µÞéZÂ2EÝ&À[ˆY»1¸¦\aد ÙJ›wÛò6´=¾R=Ì\oLzh ‡kéjÇk< R¯A‡Êh)NJ_¦ŒÑ „nr¶pÁaâ8|#.pTe  à#  $_¤H ªf- ¢pj8ªy‘0>þœ@».;Ô¼Í4(®š+Kè +l4ú’‡ÂʜšÔrVacs ©éi<àJR³AÇNŠ 8ÝÈ0ˆºÙ¡` GƒPBUñ©!LI农b;:EÀ§M”9°•Æ_”aKÚ.ÝVINî.-°² k\ölòš·(-}u;¿4[nð¹xQÌ +É ¸Ê‘yÜӀQ¤DèŠÌQAä„+ãRV1¸‚m}úڒ†¼kVLÞuÖSX™èHÝv•Dæ/;ÑõW£0Ù +—JÜbT%&A*ÒBi*²‚zUu³ º>–¾Q9WMWÑ-¬¯¦¬3¼¨i–õ—#?•áÃMhû ï™¿Šh ÏHˆŒ r×µšæö§­.uµ +©kçH(«£KTeÁ‡(•ó¢SÁ¸"#" +ÃSâšsq¤úÀ¥'KR¯ «iwäë[ÄfrrÑRrÊњšÒ†}}]…Ù0¬¤T™0¢$§ªîP:â +ºƛšpĘªj¦¤Ä<ÀL`,GQaÌ).4Sª =ÔÅ¥& +e$¥ä7Ù.6š.–Y·i NûąæRÔ ³pE.É4-©YT©V ~¿,ˆQPI ^4%6#º“'‰±Ö.PAZ!DDY4MN_Þ®-tÙ×:ÍêHޏQŽí0~^mØ,½ ɌîŠé=wäDŽoY¡‘$›X „˜C4E&¨W2”ÀXA*ªpטÜé*œ†lºb¿<1yyIyÁ ê>ula›FÀ¸Q/SJ]>îؼ' +Ïã4ßüš©8™Õ„öIƒµ:¦†Y~\¸`r!4$F(À4™A•ÆÁJã³bKzm){‹ŠdEM*æ­ ¯jŠ˜·èɎ¢z¦¥¬”aQ]Ä(«òÌ÷jE§U1½ó[Sj;ŠR ¯ŽÒAÐrÂr¥§”fGƸúU)s©tĎ¼]Rj›§¤4 ‰ ‰I¼²V+¸²BFy“˜ìÊ*)v…u”Ú+š"Ë·¨Ôkk*¸½yÆF3Tõ~AZ¿@i›Z´¬M,‚€°®;DNÌ©È×JFl«U¢E­"!õLŠ–E’Yƒ›–ò¤+ð[JìjllýmB“5…ÒgIGïû*ž_JBÇÝLÃÎt h·o·lï-B£Õh¹ÚÙ#1½z4V–²U"E‰Ë”˜Ök[ðüþýšñ«ˆÔð²†àlH}ë7¼Z¶º'!µ»&¢²þ™žÌ„ÆSÍçÀ Þx+Z.å¹ß©ŽÑC^ðh“ÕyHKê Å¢R#£¬ÒHRc2 ødeöAU{š¬Æ OajlRšÎ´w£‚ÝrÜ.–dæ;¥Õ5 ™í®è´f·ý:ÉÀЀŽ’´^4{¤ zR|.£œŠQRÖ­–Q‰RpʪL%Ö¶"w¡©ÂÀÞÑ¡tÛví¦ä²ã¦\ø½¹…߃ڴ›Ò›n»±ÛžAj¸ìÒxMùDÅ.¤Lš1Ue⎟ĺaQb®—Õø5&BY©s˜ È4VHZO.¬°P‰‹³Ksq†ß€Ú²SèìæÓ ;*Òr+‘ÀΌAã5êîKÄÆÛP·Ò^žTô•ªÔÜD²¨ìÃÃÑf©¥PØ1[+8±[ŽSBbß½Lc´_“T:C”jeâY†ÃÍr-­ßÄNt\Eá*(׊íSˆ¥NÕCUHeÁòZõxauÇRáªñ›KÍåvŽE•c¤Žº‚UNaFZ_q¡T•¹‡êi,IeuN&yÉÁ¦Òu­¨ôœÕS¿BˆÝ2 úaû,r™òR‰ +{™J"û,]ÑBckËÞ1}ÅÍ`¹ä Peӈ‘•‘+*Ìi•e†ce´^p«[Î*i¾[’ס(‰Ò/ Cb5FQæ¢..vQ×ÖYЩêÌdˆi­"k4^K¹µVZjI*§9Š «‹•Q3ü4ŽzQ©—QY𤥵\TKç©dû#"9ßÊèlïrÛ©[x}©ÛVW͞éÖ´J´KîˊٲÞùž‰ˆ®çRšë…×±5˜é—™Ø‰ŽçJ"ãC³sþÓß‘®ëUooD$ÏW%ÍóOJð8&÷Üv3§ µá¬àrcJfysÓYß©Hžw +‰™%»i7§·Wd侫Hµè$Ø©4Š–J ôŠÉªß6slEfËnËòj&6þÚÉlϕT¦rçsImŽi¨lO…4ßo1ÅõUNê;wŠìÄ4ˆÜÃ…&q"ÊJy:Êòy’ +7M™E­å¼¨ÐlMSc²oÒyÍ'ë—ײ¾vè=׳ 3˹’×´ßø}ë(/VJãG‘Íi%•ÍM‡¾Ê(Èéé¶xÆOTá5¢§pš’(\†üŽÕ’Aã´ßЗ\[µõ3‰Õ<’NædÚh(Î癦ë$J±µêÈ%Ã9ƒÐqX0|ʈL/eD§[QŒšoø*óP¿Øª^v>'*– ác´öHJё߱\RRڞÔdn3*qµ]žÆP¾Keª‘Û’úÎäªåp¤è·%6®×~çtXKqº¢¢t>Ej%©v• ·f8$W}~×w§mfÇø @Hq•êUYiüFô†Õb°]ôᶠ÷«ªóÀ+›/Ô¢ñ9Y¯¶kÛ±›¶££âù¨$8]sÛî©r ±ÛKìŒË$f#š‹ã:‰ÍE™¶Ü\Œ”ÒO+*óÕWØ<È)L-¨ÝBYJ¹‹àpšW©¬öuK‹‰ß`°^t¤’Wü +F4¤U62˹co;VñÛÊRŒ­ÄOir…Jó]Å}EZf?ïX[6è½Ï‚áûk[•çk·^oV~G j†`"-xŠ×‰ Ó½ŠÛhÁÊ®Ci81§øž.EFņ÷LhÑŸÕéb¥•–Öw'yÎ$¶ÇDÅõ V\‡v×úîP»ïò\j?3$¢¢:‰ºÌX°XôâWÌöÅ4§K?ÑíÈNóº*%xŒ¢®†Zn£~ßuàUý63%«)¹ê6©#y¾êˆÌo4烅Üwn{N‡Úuv䆡æzf÷‡Ì®í[îٝøÈMOI¨¬í®ç~®d¸ã•mOÔ"ó(bɟ†àsÊm;î‹fƒzÛrOm{;f£våsBBs=VŒíAË0Ś.uÑcª]ô+ym™eׅ¾eü¬"µ}’Z>ëè o4$ŸŸåÏLiþl{n +fß¿Cpêeóƒ×2>†ð«ƒÌÖÚЌ'Q†Éu»Øj¤äz“«Î³e»ÊS¬mƱKgšÎ_·qº+ØW%2·9‰ÆhPNç6«'µœ7©Ç³=Áé·!0Y]k–G¤ÆíˆÏ18ŸëZOŒ-+ÄÖ¯i= !ÖÙŸ’ZŐj’ôrë8V¡ÑTÅê(Ñ+µ:×-ìU;*4~ iZ©j¥u½ÚJˆâºŽÓ]çÔÊóĞÜú¥#·>ÉmÏ! ™Ña±ÑXrÛvåýfý²ç–Zxg液‚‰¼Ì:Œàp +£‘؉Ë-¬¶ë^.Y?ºMã—^t=[„Žó©ëBGë{ñ;†+v™½H¿Î ßµÝ +fÏ Íï€ÖñÜM•+DZ5ïxB±ŸDâ6¬Ù &S9ıèË&ûu6:çm´Ri([%6ЗÙJwÊm<ò‚O—ÄèYOê8-§u}J‰'"‚ëm°Ñ–=ˆNgãWìÖs=ÛWmü5¨w‚*×½Jâ·bW G½*c±db—P}¾^gÏ!²Ý(†3j"§¥¥Üú§£7Kt¶ƒ‡Ú{‘¥–Z‹£“<Ä8EAn­±4Ç༒Ìòš’Ôø$QOÐVÙN]ˆÈ‚÷‘„â~+"3»¬#´<òRš×QŸ”]o‰†™•P¯â3¨Up ªZIç™†ÈúRHq½p{nC*‚Û·–ä÷)¤8ž¨¿íPÅo¾jY.Gªž»©Šß¬Cj9™æ•¼ÂÎVlÙUËe½ñ9'—íFܞќÛwÝêç‰Y¶=I¨Œï…”fí¾óEAô~”YÝ ç³æ{u NÇJ®¿ã6¤*1úÖX™È© ‡1×¼Hd5¤wLMç–¦£ k‹Ér¥ùpÅ؈ŽÒøfR{űèL2Ë ±g{”G¬®ïËìZŽhEËyø@¥]ŽXo¨¤öý(nûÁšá`œá¸¨9/ä=£áT4¯K*‚ëŸ`3Ü6HýUT¶/fÏ÷Ž$UٍT\灢÷@ªÛ¯3Mçq ì>±¯kq†Á™ J‘ùT×z *Ü_ÓTëMŠêüKr·néuXFhxaJgw9Ø­2_תäT^‹J‚Ï5«q~JpnÃç]çÁEj®â7E÷UÍwèöÝ'!FÁKŽTp V=·’ƒk”•v8uv§i.ÂgÄþ0DZÁbm>Û®¶æÌ4ì–ä®õЮ۟ԲûB¬z¯Ô¶óØo\íÆñFDrý‘ú>ô’Ù‚[sÛ𪮳l|;¶?…Êù w @ è%×eÚå.fÛr,K2œÇ0,îåY¶ûdÉpJoZ®éEË ¹å8f—]*rÛ¿Gé·)Q¹ÇJ®ƒ°¡:£ÅÂ'EŸ©†ÁÉLŸâ¤%à@“`°Zï#×|²Žñ.Ы7åüþR#.eŵV[paÓÕúÊ.«™×”à2‘‘܆ã~Ûp]fúÅf35Ã5·oýpû•F“¥zËlµä6V°6K)z‡3ŠÎRÝZóႹÁc¹#˜Ç$ +¯9…ÆÚ~¶â¶¡ ×ܺóPž_Œ<¿&hé–Mø`©©$Éx(ð $ÒùCÉíZ6Y͉G[i@Ó±½¦)Æ£ÇzdœÜMۋ"2ÛC:µÐDüœÐ ΫuÈ+eê’½íPCjwVEhx@+N˜=¿UÑ÷CDëú°KfS©fÑc¤bl7SrœO5Ÿ†ë8б8ä•Z…¯¹Uϵ껎v,MçÛo~ÕqXo¼ï«žï@+ú^¬²÷6Ó²}ʅó±_¸˜=ϱD¿ÖL Zh>Ùp}ø ÃuÆØ°Jbl/šKꚫ—·h]¿Ñn‘X­Þ*Ó®³«W +Õ*g+ææÛ[‹Þ(ˆGìj:?ó4çK”`q1Ñq\–¬–bÛ³`¸þ+Ï+!½ïC°˜Mß{¿dyFl»O̖å|Y1¶ Wü6ô†Ý„à0´îÐzN¨-×i¬cpÌ®zïì²ù8U1 äEð +Í¥Yž;i~ÅÅHb©M¹q; ê»ã<ÏýDãtÆjYÞòJ¯c^Ýz-—^ÂÌ¢×`­ÚKNf·lÐÚî!Ã¥çv:H´7N¶Ÿ¨=ãŸÜw¿¹uïOø„Æ!xÀ_ÀìyN…jþ fȼ(kMDÎS¢õ fY²,îåz•ö‚%vÅo7Y/·jØ •,tMÏ}»fwD`´»¢ ´»kWN×42û´_dÛ!÷ë•ó‘Ù¶Þ‡Ïù²á¹_Ö쏰"ÅB±3äµ;+iŠ¡Í8Óõ›æºo’ ×[³ÎXšå7›¨ºÎSMÛ¥ß÷\6hm§¹v•»aµ'ww!¢û!l¤ÐHŸÌf0«ØV •ä PŽJx´U=\05¥Ø]PW\ _•›„¡÷Œõ« ––¤ÕE':]±… ÄfRNë¸#¥´\µˆìVC skyŽÕC`oÀ*{ŸÔªû'|Aã 7Ó©l—‡ú'‚ç[ÆpƒۀóM·0B‘ÕXÇä†[ôý·%Çu8¡Ü;Z°3­ÐûîÔÂý€<ÉV”è#À19©•nGä¶gTuã#”ùI`Ä š(U[DΒ\ÃÌ}Ä8ÆßaÊoD©h7–¾nD©æü ;¨€1¶ ³Ú`!ú¾ –óS”_i6Q² ”|oAÜZcfãu8ê2 #Â$ 1L&fQí +ö¶Â·DOÁcԆÐâU3Pé²1Ü,¡YÐIBãyŠí!tª[+Cb4ß,8MU¬Mы­ƒŽÕ -µ—ez¼Â鄼gy=Ïp=…ɵ&IJó?×r%*E–"µRƒqœ:3!lšƒBÍožhûGÎÂÊ°HF3݃ËÀãU7XQbM€©z¹(^¥ièa"ûàef¤Êó`·äX¡æ4Ó04©Zîù5ׁZ±\4ì-…é¥æ »q»eyÐ,›®Åªeö4µ† šrËp±Ì\ªTg/’Iï4[³•jˆž$¸ËÓ«Âs +ÅpN±Q¢Yi5×°7›¬×›ÏvL(;-P¬ˆq" +… /0P¬`¡Æ Ã0d‹1Š-XOY´ˆqÂ(ŒáâD1h ž€Ñ„¡‚ØÑâ„'H ž\ƒ5A$”IR<›,\°`!)ŸÃ¤'…†0^ƒÆÆã‹alj 1†ðDQFÑʼn-ˆÆ/:btÈXñâ… Ì`ÌÊAjð„èDùðá 1|àøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹O¸¨Àé²S(9Š'°bÖÁ†jMi-»qóDïM©Ô^œäþTncIE³€©k@Q—íÆKrì—a¦ûTìZ¬ ûÀåûN‚!u•(²a».æH·ÑÝ® €»%»«·r¹y½Þ’Öyž/ +¿k³ŸàùªÃøë¥V5@ß + Ý’ÕÀ‘ŽÍMÐr›AäJ“j« »¥×Šõ”P¡apùº§ÐI۝á{\Gh6²B㻋å“¥)¶&¤ÆëTŒoº?¶ß„O×]ð›äGÝâºUÀõÎïd½Ø–Ú7]ÑÐ\Ê}ãÅ’ñÃòýG·3ú²ÙX +bۛzãý*Øí÷~Éð X3=pw͘ëvqjVcO܅™+7¾±|‹“ÜﱞéRšã{Ë2/Vá~ì֌–{VÁñ*ÏûUÙ~eùþ›Îõ°[³ +¬Û² +l¢k>Óm³ŒëñDã4~¬ì¼žjºŽfjæ§8Ãs>Røžïif Ò¬‚9\p"zºÞ^˜ìºh\O‰Ó8bÝu0ˆá8eZ/Ֆ]@íÒ-¢®ïdÅù7\q!|®Ø\žâ>p·q¡$i®À +)Š±9'\X…ë]¹f6ÀÚ¸H¯lÈ0áþnNÂh™+~Äö PŽè¼ø¦?ÐT¹Í0–é†Ó²Cݶ ˆÖyÑ*Ï;úªY åÆiÌ(’ùj´àDèˆÙ…Ôx]’š %¢2L­<ï&ÚÞW¹e6œ[x3Otއš®º+¶“£™ïĚÕÐf×.XÁcÞOH‹3Q£ÞÓËj£nJË@²ì’“qüjSi’ëÂjÜ?Í¢Õ葾ïHètÉE02…6IÛ r}'´ºñº`: ™g™ïA$ïWŽó=™d™ŸiÜš)Ù.晶»¶õ&dÃ!Å,µh÷mã$饗0óDñÓÞÏ ×öŽÒ¶ ¢Ú3]£tÿ¦úU÷8‚Áå8éz BwÞÈP¾·r”×ЁÂküHç7|Sø `õ}cÆqÌa#fW€qŠÃȕ›HN|æH¯¤ªYðĞ٘yŠñ1Zn¿)ü.Æ©îƒÅêJ´éV`Ù9Ç·Øw’Ý«•,ÏŽ– ­ïfá,°^Ý`2,×Møð¾ðp¼J)žùÓkšK«™áxΕçq±oøjÝ0”¾óPÜH¡EðÚ%!¥kn!Ôzc^ß~¥õM·"h•†a†Jí(×3>ß + |® fYvÁpÚÖsa’õ'~Xi#ȱ8Âpݤ¸ö#£jd³kðqÎo(¥kkáp¬ÎïJø®ÐˆU9^2 Ç3IŽç>ˆe|’:Ï[ú²U0Ôe«À‰•çÉ0×ý–%ZÕÆ힄Ôn,±r<gšRë˜D©Y`᪫è)ÓýLÝ4ŒVù^ ͧjéxh'³¼¡ïœ†Ç/Ì^‚§ ŽD×[ 1¹(ÜÎ7}ß­ð±:#9’å–Xz·kf£êÓ`œb{àB³ óMÃ@j¹eÁpÓ¯ÚîÅiæ·$Õ~gÍ+–mIªÙ(ȱ¼Êr¬‡qìZƒ‘Ž¹!»hþŠô+.$éWÂgëmĘÐKî¹uïi»fx1²ó@àlÅ­ ×vE«œÆ5M—uקj7T4;O9^W»€%¹nÅÏëþ²<×¥í?Töޏ +ßóEÉô|¢s;iöŒÒw­©¡5 tªg>Éq¬wñé𽠡ø^Ѫ΋i’ý6PuRë¦Ã¥éˆÝ1]‡q«.!¥*̓ ÜÊq}çĒՐjÍlØ4áz¿g™ëÖìF±Ï1†ùv¨Ü Z—à “›yªù9U4ž˜eÓÁ<Ï|¿sŸÄ šNÏÚ®¦9¯‘e×ý®ìþÐ +Ï Vá{Ï+š=Îy9SpJ¸ê 2Qf%DsŸe9æÿ®g;h¹Å/+îÅOÌ®Ã,£!tÂ]0¥ÊÀ(]»à¥™æ·<Ëy›(Zo´ÎñJô„ë3„q<ã[o¯1¤Î-bÙ6¨Þ·9Qõ] ŸÖYÓZ–÷“²ý0ͳ¾$Iž31®÷S,¦ µK+ü®gzރ(¿ÞZ˜iý­`s­‚íÕ톕ºfc&¹öÿDßuW,ÚÞój–G¬–Ù ©dx8Ëø^ qŸ…O¼JËhÄ Õ|bӄß)¥ÝørÏhÌ,×|áØƍX}%XÞû@ßy=Ðx šdyϲ»û¨lº¦ïÛJ]7  Ñ| -Sk`¢àFÜ(Í ÙxQ«ÚЫ٠–%zßíÒó®ˆØ*HRÉôd™ó @p¼Àøݎs®Ç…çÙ4ãv&Gµ^¦ÉÞcµi5xšnÍrÝá#V—bĎÁcޏüÚw#D´ÿxU׉$¹Øp¤f¼˜NcªE»(J¯ÀÄx¶ó–ý+G¶Z–'͞åY·s<Īµ 2Jó q~=«èifCÇ9§±‚LÛm Y"9Ší¿j;¯c%Ç}(µÖ6œlÉJªa2‚TnB«ïx]ãíDÇü¥Øœµû®Ëq¶éV‰Í‰˜á’‹ðQä&!–ý>R³ÿ¦ºåsµRc‰†É·é=“Ë®CfÝw%F²þD—=†PLOóTß ­ï¼aU¾g’,óA’a÷啌«vAqJVƒ†©®óEáz!ë¸ +6Þ´Žu«Íç*¦_ÜJŠÂûÒ¬Ù³šVCjM³qŢ٘nçz0ѱ¸mÐÏúuãéXÉ÷`ö¬‡±3†71óU—Q¶ïr¢á¾Œµê­Äžag)¾ÌÊ÷ŒVùJ²¼7tÅÓLû…Ö¸žtK§!åÎõp¢ëþ +³¬AŠó*~Æð1‚eÿ Òìq’õAlºßCmׯd6|Ñù ”£[ÏŽ˜A¥êL…ÏXÐ4®÷õžÝHZËh´$ÕuX˜Ø$Pñu{ˆ©rsQ’ë‚X´žŽ4÷ÂLÛÝ@ÑvBAóJk™ß­$Z Ÿ2= ».Gºî½å¼q«Þ¿0×úßtNH•ÛˆbÏ.Få7Nf;è{Óê²Ý€^áý >Fj£uͯqºû5Å3^…Çê,„Kهª6ű<Í3½Záûau®Jåt2Ç÷Ý̱­·¤šÕà^Õn¥r¼Ÿi¼N»M£ÁÕªÝ –ç\¡ï,ǸPZ/è¬'JÉôšÔ7݊‘|WñG½–í9ß,HVÉôXŒe}‰œð~DŽœ‘ ª}ס“Þ*X!†µ‰Ð‰Š“½Ü®Ú6^’º¾ ÙÉb;aÓDOáÃjû‘Æg5œØ¹ÝËr]oJá}/¶ík.>fÙÞKò\'CÆ»ŠÉùHÛ{j¶,Op,î8&÷ã”ß!Ÿh5†Ï³6É8ž Ÿ°{ —[Œ¢Õْ{Î;ÍíŠWyǃA¢ù(Â52jv£M³a„žÕ !Žõ~ŠÞ4Ò¯»oª¶û ŠçVüˆÉ¡Ñ}™e[O‰ÎûøɂƒÄbA‚½±l~P<ï˜eӘyšï^»ê#z²Ø^øÊû•"Û®gZևÇv¥º%³“ŒÓ qÕö€„*Žàä*îà[2cQÄz›©ŠÉÝXÅwš©?£8ÆÃð•û)Åvž sü’;1žù#F4”}‡´ÎõLŒiþ 9¯â''Šæ ¯íº'¶Lï'J¿ƒbÉòŽÀi6¢Ö5*G¶¥˜Ö‡ñ.€bü‡Ñ«¾²ÜzûUÍv¨–nô=£ÑõžÕøQáxKì\ÏǛ”ç©øïa$¥Øt²]õ™éØ}%yÎû8ÛþŸ4~W¬Òi¸Øٚ{àEu\Á…© D(Æ ­îº¡¢6ݑ›¦Û‘¢ý2Kr¾åhÖÇé5N~ê»/Pf'|¶Ôp¤lÑ:¯ññ+÷¨Å3¨|Ù f˜Ì@Œ^ø>&2¥š +,§jƵí>M³}'h¬Ïàâd&åÉLdxæã4ã4€¤q1ϳ¤H¾Ë(áx0ʶ]˲œ'vÉ­ð¹b31’ñS-Zk—ž7í¶ùÉ­:o2“3 ’ó2€b½GP¼w!šù,rÂÞJŒg{“ëæ ‘Ý }ÏöÖùÞ«·.°è8Uo(É0Š2\÷œb“‰†ïO0zßs%ρÇê l°Ô\ð„í>O:â×\ÏUÚÌÍ&šÞÛ4Õu/Êõ݊ò쟁žûKí;/ʅëm½d5¦[2Ô-Y ŸUíWYžõ*xÎù'üy%«Õ®]@Ū]`uۑ Ëú>.9;^u>åþ S·Uçù¤î¼à”lO»e³`»]» Y=³€‚Ê“š!Aì+HnS·ÐÊöƒâwQFt=áT®ÇÂ'ÖoˆÉ‚#!Ã'ÃL÷UxÞñ:¯1£8Ö¯0ÁìÏ.™Uë•0Ãò”`Ç"¨™KŽbõŸkºÏô¢ó"I¯7=Xj(A±ºO“}œÎmÀ$Ûz` ÒBì@‘ýTÕ~ð×ì†ÌS,ׂ؅f"4ëoŽì»žæœˆOœ!ƒµÖa¦Ê¬¦‰ÎGÅõ¶Þù^³}'"Ì.‚ÆÌo£æ¿çw6O6]ÎÓí7VËð¢Y³½fUNǩƓší<Š`z8Wu /Lh'K°¹ëXÞfZÎûLÕüb•]ç‹Âñ`–ï;&àù*¨á .Qó›g›n™ïý¨ð¼œhÛ®&šîãHÓýâžÄ®ëœAf=Ìö·j~Ž”Ý7)®ý;Q8^3[V£‰-«¤Æóz¦o<Ÿž¤Â÷hžl¼"š.†ì_á÷E†i?‘j¶—Ý®Y€ÝªY`¤žUàBTçµøáÊsÀ¹zÑ£ÕFrבW: ëÖÌ+·¬æµìFJ²M§‚|Ûá8ç5¼ÜyÝPj~£1v©}qµØ«³$ÙtU-šž§»nÅ/,¤8Γ,Åð6P³ßze À×zfãªî·4Éöõ­‡*‚Ó‰0¯ÒB–Yj/Ë°F8×£JáPÄM³Ú¾Ëa†ç<ˆ`öI1|±:§ÁâÇ<ÇrŒûQ:^’:ÇkRÍh«t¼ë¶,¯)(­FԚFcÈ«VÜ5£ÁãLóQŒh>ñ¼WI®û8R4XuÛ= ©YÐ$„V” Ï úšÑÈnÏ*¨^Ó.ð5é5PŒè¼‰RlGbßt`Fo{QìœNgŠžÃzãuKCdzWìZ_” Æ©æ‡¿ì+|^rÆ©»Nše×­R4Ãâ~UtÏ”ìÇ©~ÙSž]r*‚\q r¾êj°Ø`¤aõ¡¶Ü/yrÁ¹<ÅîÏÔMGĶïj¦e=Œ3½ç‘¾íp¢lº"U¾÷‹¾ñt k;ßô­‡#E×!³pÀê[oFjî·0Ñ}ç\(M» YUóZV#Zî(Ãù¢øþQ‹ûMãx?R7ɑœaºëdší¾ÏÔ]wÄÂ÷4ÄAЂF»@ % '\ö ›®þŽS^cYM³!£¥FÅNçz7Ïv 2Ý'ññjã0EïârsYŽïI+½î ìvHuóVx_êk@Ó©vcDÆjʐ ø½€ÇtÜÁ&Jmæyö}ÏjÐ(çtNjYÝÖўؽN˝ß%­ñ:ßÓíg²é^ðŒëÐë™ÞŽ³ÍÁ“ÕöbTû…SxžñúÆZ×vQ¬Ù lö¬"/ZJAh4ÀŽÔöˆÕ8ތsMG£dÛ îºçU~—Ýžíu·i4Fcõ–¦¸þýÒí¨]¶æ¹ÖË(Ýýd›.Å8æ{üºê@Ðv]JñëíA ‘¥)&×±ãdö¤é5ÁÊú +­„XÞËÝx*Ʋ~¸-ëa¤^q'ŒOôà6|WZÛw"7Uh%dœè(HòÝڝÓ%Ñ鎈ä~íWNÇâË9±ò¾ÕPÛÌ*YfÃò4Q2_EIæoˆ©R)ŠíÝ 8Ìޗ Ãö>d<Š0í/)®íPŒê:ÍS}ë•[5]LT|?fÙtÓ-O5MgÂGKîΕÛQÌ®3]ï­]9]Ö ßÛHËo8Ò´ýªE£±ÔÂñ`˜cý…¦¹GpÌþì¾éÀGj=Õyn[„ÖÓLËr,βÜRûî§ð:@Zl"z¦ÐDŒa¼oš®ã±†ÅõhÃÖ~Ú3\5WQŽáUŽf¿‰›®º„pÚy×2»¹i¼’ÛÞaÑs>«yN8…×AÏjÜ4ãx#ð¹æYÆïLÕ}Bñ%iÖ³k»£•¾½®]@”¢U‚§œ?¡sޗ ÝwÃé™/Lòž%¾Ç8Ïùgx.…IÎ÷@é4~ždÄðãgÓzèûGº¦šÊïˆÕ9ÞNôm"4ë?à|ŝÛv9Îù^ŽžWĺó¸ðBýÅRّBûIžï€O³0«hü dz&?`oZˆÊÕ¬š •¤x.ÃM=D ½¦xÎW­h{Þ획èѶÍójf×¼šÙ%qí@±E¦Àž#)–Z&d¦ØLÐH©­Åûãõ75¤f£H=Ãêªé= ™áí(Åq¿2þ)ÇK)Æí<|íº?æ¼V{¶g¤Âý-Ëò)èlûçá@Ãù?Zq#µ]K²÷›Âi™í9 •Ùá<×ya5î/úžÑÀbËn¥k:Ÿ'».Ũî{ÃêÅë›îÊ%Ã#Yf±Ù@ÏsÛ,›U¬šÇ*Y $¾¤¶ó@‚aö +4Sf5Î3ÿÄ7Åö $:fAœ^¬J“jåyÖ-Žtœ?jÓ}”d˜\ ¬´d6íýR†ÔXˆÖ7Mô~ȋFã ¦ë¯mº–#y.ÅÏËÍY•ûÅHn0¯p Ç®:Žôìßy¾õdô”÷3ˆèþJ¦—ÄÒól¤h>‘J–ŒÒ÷B†ëº@ä= +«75Tk2„bsAk;ÏgUÛÉ8zŽ8Ãs¾iÛÎ$YΧ,ËúÅ.8™çy3ߙÛvÑ +ϛžý=Îw^ ӝ÷Â\Û¥0Çs9R4~¥9Ž“qüZ»™–ëÞoٝQÛÞïDÏùâWÏsí'fÍù`Ö«¸íRҎãd¦ã7Ÿë¹®ô¢ñ9SôýwÓ4óašè;:Skv’Ü(ˆPq›*Y®fjžó]Ñü™¨¹ïgJ̓ŒR¼Ãˆ§ýºÿ²gŠò+®š¥Ó¨ß P”’Õ±Ïö?²=‡If·´¦é-­izÕl4Qf 5TiÇ%û.Y%Ûó¹ží:Ô4ž¥I¶Û8Ù|hÙxëvCj=«AbÌ^s¤Óðbã ÕªÝ¨jÍòªZ2=ꖞ¬¾÷@kû¾…DV§Räjƒ°”öPSÕä$«à8=»àh¥Û˜néx̧¯!&IlÓL¿yÓj|˜áŠ#a3†O)¶ó‚N³ÌkoÛ=£QÕ¢Ù`1œBó±’ëGªÜÆO‹MÄ&WóL۝ Ëu3Œdº—dúî'zîŸXqVAàÂçmQ^ɑY5f)ΟءR£ I~ÂWõæ!$çE†é>×+·ÑÌÆõ~PwUë®ó‚ç{+²^EÎ֛‰±;0»‹²ÞY=«‘”VAMTœ‡”*›zßuAÞ´̪Z6Î8­ß3­‚ß•í—råv5Îv%¹ö«ï<$¢w £ÕWMûYšå¾‰­¸P´?ʅã­@VÑg¦ã6):Ï¢TûUüºÜ\…ñ!n¼ê`¦ÔˆÓ2Ìì<ïåiÆ¿0v­½8Ñúæßâ4ão¦è½Ou헁¢óÆkœË5ÓûY×|Å-5À+3•f˜[Î4=¼ºù¾ªzo¢«³4Éö(î÷~Éh´0Éþ>Wj/†Zn$J°zÎTM·²<ó[¹âLø°Ú\šä|Ìó¼÷8†ÕS³ØJä¹'y(kÎk‰Ôý%W­ç™º÷ÓmÙÞ×kv‰mï©8Åx•&9ïâ<÷Q”e>õÌnÑú$˜Œw‚Ó~šhÚ]Ó «ó<¡oZNBi<³ô1O4_e‰Ö§Ñ}5[pf¨ÔV¯Ô€¶ã:w¨Íç­é¢`´ß‡=ëG–`r(‚Xk'ÇóÜs;Ïû~Ín|¿dZÛ5t n½ 5¾ç#…ë¥Óþ5ÝS +br½/Qþ0J½×8QŠFçù¦‹Q’çf”i>v{Fà &Óc2£1Œªó3Œco$ÅôÜj¶‡Í¶Ù ÚÊYpŶÙ8^ãv¿©ÜN + €+!9È0ÑùçWÚU]ZÍì²Ø¶ ¸Ú¶à,zœl?‡¤ô’×í†1Jß+9–ó,̲©öËÙwVìڍ¥ ´»«$9u;¿³néxFAe{߯\陵ÎwÇÚZüÆÚXŒn>0ÊÎ yÏò†Ó7ßÅh®má, r³à»=Ó3Råû“bZ"DûY»ä ^uŸÚ…ßÑ4Õü£ž÷̒UÐ}Ó`9’ý4G¶ÊMGaä©EA àSl7áS¥¶¡F +¥˜öW±hP»o<§šÎ%™¦ë‰®ílžíºæµ,ü=£AR««èùz{1¶ýËéZS+[‚N÷]LríoY®éP–dý;¾o…ØtÀíxîé]獄Èò¤Y8M3íߑ¢ù@Ñ´ßÄo‹ÍD)&'4×CnÑ}gX2«-)fù™ídüÌt;϶‹Sìn§ &̞ߘØ9] +/·=]o'ÄµÝ qn#¨LGÃtãíDÝv1ˆ_k5Óð[4®7b'ÌnÂ×'R<÷?€j¿ˆ›p½Ã'®/±s<ç˜Û×7 ¥í1³n¼‘âXïhŒwDƃ «Ùbó™²õElÛO#-ë}¬ê}M´¼/1’ù!b¼ì^¸ê\²â"°8™í<Ïý#ö—3Móm¦æ½Ë“¬1 ³Ï šù)Èv] s½WfåvÓ-=¯¹…ßÙXÅø«8O²ìª‹b*ÛÀ£4ßà…£øõ¶S5ãƒÖ÷ÏT]wC5ëÙtþù]÷™Þ4ÿ{Þÿ®ë~rÛî«kº ¯º ¬5J­µiyN…wÒÜb‹¡†Éñ\Íx«yÎwMçŸZ:žtKÇÛ¡ªó@ÖvŸgšî#·j~Ìî³ê~L3í·NóxòÊ@妩̀ ™é‰I½Åº]päç­Óû$Ü;…ÀÛVÁ4ë®óUËû ² ³¯DÃê8Øð½æv'a‚ÕCŽâ{ 3ÇvÉò¢Ýxñ;Þ³XµÜPž`qG.·A«4C.7‘¤Ð5GnÙ{'÷írÏs>Y³Ý†J®«^¥¥<Åär¬âz0›ÞG¹q¼ŸeÙÞÊߑÃõ6â#EÏZãu%¾-4˜c¹nŲوêÎÀù\@ÈÌVœ +™&3¾,» Ü´ŠV# + š§˜œM5l ,߁ÉêÀݳ=¡Ï8ރ Ç{äºoåÂùCà·þ‡Š¾Ç8ÑxaT^'µžéM±g{Ãéünšßµ8Çâd$µÖ†ŠÒx°zNH}óm˜î:9âüïI§á¼šÑnÉôzœXd ˜Hù±ø mIÂfMIp¼Ðª¾¯ë9àu?bßvÐí¼.¹UÏÁ>­'Ô ]·guJAi6”×5ž(³ +(Md-|Àê,I5×+Ï[bÙw&ȱÇÙ®“^ÍhüHáw#Ã1žd8vlj¦ûÁ¬ºoR燈ÜühX۝ÿIÓ}䎗œ¢Y`'Ì>XÞ¥ñ¼*7Ž’ׁÏöh–m:èún%y¦KÁóe’ý&G´]²ZVA´mã<çÕ2/F³(fïø‘ñ)|áúê¾+jÕt^pœ¯ã©šó>*Ûµ¦Y`”Êõh–j¾‹²M'BD÷Qø„ñ2†d<4KfÆ9ö¯0Ãü*;/©}Ó q¢ñJŽá>HQŒÿ %‰¢'+Md ·‚x¥VóLë§Zº ¤^ÁŒ!ם…ω,e)¾ÏHŠÙO­Ö~¬j? q _âæª ¸çCûªì»¨»Dˆæ“è˧ø ßðmÁ Ãì4Õð>DéeOY’õ4O¶?y¥ëù¨ëº˜é—ÝÅêlÆrËͦ:žûPn½}ðI©r©ýX×zewÝvÅwš­› +5km䙥6cÉåF#%ã}®f}»ö«m? Ö[Ší÷VÕnxÁ]àô…»a,sôJ»*JӛZét j¼ÞR̀éY~ÐvÉ'™Ü«ZVà;¾Û´n„Ð#Iª¶ܞ3 ^¡eHù¾!DÁ½à ûƒÏ² +’¸qú¦Ùø±ŽÅ‰.±gža¸© ¸ ¸Z59N·ŸÅï ®C('Ó\ó}Ô¶_LÇ빞ëDî9NHhîÒºÀض ù…ÝCÜ<‘­ð9É;n–Ò9Í/6'XWƒÍ2ƒ©~©·é:2ûÞï8Ýu(v¦Ô>Ô@‘™à¹2ƒQŽßš‚Ðö\ \o.’Qe;R±ÜÑ9¯q³|ïµ,Ï~ŸTÍ÷IÛu#Hñýgê®û¡²ù+Ì2>DxƏ ÏsBêûךæ+½e|U½™~µ=»ë¼PÜNˆMïS”e½+¶8_ö$ûn'ú¾ê¦ÕðrÍôDŒ_n+Ë1;’ ¦5ž·R4÷3°Lµa€©r#¡ÃU'ქ&Ğç>•Þ€JïèZPڏB ÃGxõj€Âɕ¡Åª-Qìn̦ùLlzƒ˜…¦#«_¹q=¬í qŸBÇñÊË·L¢'ëÍÑ LÔ®³‘Šï$Éñ=EyÖ'­ò¼)ûNeiî·(Íü%َuóq”ï»!Vñ(3èºHê¶#Zã4ZŒê<=bs&Gñ}ÙMï¹_²¼ ™e‰ÁåINbTïc–ï; tN8}ëYÕxD'ùˆŸ"òϚ֏Ç{ +JˆÞTšÊNe»>VudþÆ*ÆÃTÁà¢Þ6?ûç¥ ¿æ´‚àã +öQärә¢û.Lò~ÇjÖßXÅy§—œO¾GÁg? «´ +(Hi'Qs .bø6c?š-¹A0»o+æÏd»ì¾mx·ڦ#ƒõ&aåˆÎ ¼fàc[¶@Ã$w‰ŠÉµDÅê H0¹—fzßÒïU9¡a é¢/è€ÕxˆØ~žè/R±ú U|ºªýB+\oƹ¶ËnÏh ¯é=Òºæ×4Õù—$œïä­[†´Vc‰(î_¤Š§×uîvF5{†—”¾ù·zÕWœb½7¬~ô’õ)z èb–Ð.~ÆԔSµè,çá«3Ñ¥6£yµV2½J[zÏsÉ«^q.Ãt?h<ŒÊó–Ó9L‘¬G~Õ5¸™g«èDFm½ŽT]_AžåB~[l6Ì´Ÿ‰ë5³pÓ™ƒ‘¨˜ƒŽ¡ƒ‘§–„•¥9  ±>8}ë­à JŸøQ2ÿXÑz$XÂJ{‚”oû(Ø•­zpË~ÔªïR„Rj%rŠØ-Ó-5àUÝѳe· bD&¡ÅÞ!»Åø`•]'#›ó 4jÇPÁàlšb< ž©4@Sm-KôžçIÇ )Žç’Üó^)IÝש~µ‘8¿Ôš[x¿' +ÏsÁvÿ•v‚¬~Âç+DO֚Ïô¼fÏ|—h¸~#=Û} ò¼0Up`4³$ÌpZ¡øY¢“$ÇðC-Zë@bµ©jÙS«æNEő°QšŸÐi¢‡(·àB˜\q8Ø09e‘˜ÛÑè‹Í×ýzc9†Õaü„áOüdÙKø¦Ú<ŽXn2Õ.9œ¬˜œ<ææ,«!­÷!A.{/;J- 5IíœkØ> Jï‘Yw]ŠQí7NÉn«ë½?Qq„€×VŽÒ$€²ÔD’csÏ®[oE)Þ§ðùº‹Ç~"„HîÏ(¢éX˜h~²«ÞÁýOEez5Ïò>(-³s^évXFi5†¼gzÑìÜÓdçaŒký”z–çÕ²ÙHâ֐³Lë-¸dÃVüŽÖICt½*¶LO9%³Bçu×leu~ÖªÕ+²Iç•N‘‘8«èRMê¹o›oóTûKäýHÑ̇a¢ëjšlº*víÆI‘<'bäbú–éq·i6z¢ò¼(Û¿r$ÏÍŽÕ]m±©p:èöM’ìBƒ~átÔí;/&9–gÑUF²ÄJë8FÉ]ž_kLBfv7Ñ0\N4­7VßuG*<ÈifIí¿y¢ý3^õ4`tNt<‡ý¾ïbžcsb–æfœÐLèdÅ¥Ëü§›š-Ë)‚½ðY¡ §ó=‘aøÞñ‹# ¢ó'v°Øb”êºåÚ.XUó¹Cë½rŒíE¹Æo·g4’Ó9£¹Ã«-E™œ&29Rf0Ïpf*¶O˜ùŽAð(µEŒ[n&Å0< +žDŽ—Œ/{0;„H5·‰†ïx’ÞÄpË"Â.û—¾…ÖÈñ‹óëOPɚ# ynµL±Îp¦d|¨4 )Jd1r´Þ`˜ë:Ÿ)ûŽgŠ®[ñÓd¦¡Gˆ}òü²—à¡Z›°RôþvݏTx^ԚVA sM·ÂôŠcYvÁÁ(rµ,»Ö¤`vþšî°ÁZ«Â4gÑ3Þ¿øÍÁ†Õcšä}Çp+† M™mã™Ö2½d€Ù +€ :)0B¨¡¥¨ b›jÏz(ÛGÒËMƉ®ó(fé'¼T×´NQ°”þHjő<¹âJ¤Yk)U¬2—,™Q(ìm ŽëÁ ÏxL®gF¢á/Dñ@¨3“g—›ñ+Ž#b2»1ãvª`v” Ö[ &3@Yo.O±|LTì^Eó¦ïº!¯šÇk;… +îCË™ˆ)³Ž Øä8ÞçHÕv.M22Œÿ¡¾ñp¢l<Añþà כ  1{ŽT½wvÛ}ë÷헑†í[­$0žÒQ[ïˎ½ñXËp_-$œ®ä×õ6ò ‹ëažé£d{¾fø^ôEï³AfýÊSì­Æ©¾c±gwaEo7´ˆØlx»t¼dužw¼ÊõX¤]o6[,4dÑ—Ú ¶+í†J¶­lº*–®—äU«ZM»1„–ÑHY’ç`¢bp]/=Oç‰Î§,Ëv¢•MÇ´ºéœVwÓúÆV×t0„SfzˆÎÖ.ڍ)È ïÅϔšM°0Ø=XùªGøžÊt¢cõ%!4=•¦Ø[¸L*hÍôzf#$˜æ§ð…ɉءJ«@ÃDc¨å–Ä¢éDv¾g 6U.§µ<½Æiø@Õx0˱žÄ(—óló¢oÿOªî¿4½êtØ2Iô}iëVÁ6;§q2çWàl¹Ã÷@ñ܊Ÿ08f»ݚÕxñf·ðbÅöÁÆjíå8–'!Š÷(F³‰¥ßhaŠó ÌÅ(2©}°e¼Jsœg!ì’Sáó’Šå_»æX–f?ŠŸª52BiH)³$w}·R<ãaXYBs€âeSóu;` r—à¹ZKbßvCmÚÿ£¦ûËê<φɮ¡UÖ"è%'B NïZ x}ÂßÇy#å’ÑFË|[†°y.™CŽ•Ú  XÝǚÆ#¿e;‹4ìF*®÷LÓþ–eºÎƒ(Þ¯øyÕ%¼Å´0¡­ø©Z“jåx@PµßŒ×übHUv¢¼bû8fÅ¡øm½É‚Éqˆ©B[1–ñ×®» '6/S2†¯ÚDù•7ÁsD§ Y5ŠS«‚ŽÑûЙ‹ó n¹uã}Ãò¨xÕ`‚Ö!z¨ÖJ©ØbÃäV–dû˳«ÍÄYuԎݷFgºâWìG¤%Wá…Ê-„W=¤Hο0×y£•^‡EïY¢awaíGI–ý@r 1ÿ¯{ + —Ü ¢—ÜNÔíߑ¾énžj:%9_5ïu¤l»'Ø]„™åVâô‚›bÍðz îü +slIzµ]¹o>Pêæ“ði±‘è¹R³QºûAZ¸ ¶W4Tj܎‹¥ïqØJ¯èirsµevG]4¼åZ/" ×MäH‰Ãù(;ïDÊç낱u(—Öt°^7Õ¯6)X­bÓw”$X‰œ©3¿±{J½7^átF,y.¤YEÿiËoß/ž²*¿S1–ó&z²Ü:Ô‘IÂçéŠulHmӕðM‘’"Á¦é‚P2 v l¼'yïâë]šå=Ĝ_*’ÛyÁoºB+³“å˜ÜK¶wœÊót¢ë:á•M'´¢û/h„Èd¾`د›²ógÃý<]õ“ã˜o”¶íœÔvu뾋qœ:ëCtæižïA[µ +4à8Í)¨$±;°8ÉaðŒáUŒë»ât®—ݦUÐÒßa¯Ì´]¹Þô +§Ñr,÷IèlÁy¨¹ZK1ªé~ªî=ᖼo‚Çù㶠£²s ·[bé{9ϳÿCN”Zœ«¸=[õÀ¯{µ ×SAf¡ÅZÁ}Ss\òꮣi–íT’e;˜e/y-Û»¹ï¸šÜ~¬¥7ÝGQ+MÃN“{‡zæ+·k½éQ«þ¢¸%çQ›KY–ó`p ™føθÕÆbÇëm†q ïC]ß½4Ïýç)U"h„®¡†µ¹(ËûFºì1Kt>Zo D1<Í3}çS]ß«n<•$Yÿ &;^QŒBÛ@s k€„9U‡µ–rDÓÑ0ázJ+}¯æY¦»³„FHêlˆ]ӍðUÉM0"Kpb§H‚Ä(%V};ÖïÁŠû:X1Ÿš 5‡£4KtëÍd¹U?¬Z{! «›ØÉr›`ÌvðRÿ0nÁý´å=Ž•|nåy[o1Œ^k2†_kÊj{¯>˓b³ñ(‹-ÄTYsÝ·fÕh«ïþ‹ ֚„¡5ˆœ§3£Øœ´šVƒh[€Jò,§‚TߗճÝíšÇ)F°z UÜᇨâø4o‘b©ñX»ÒXàd±4´H¡”W9)ßÁ$Í{¦Úïr<û)¼p×j¼hf؍Gºæ·~ÅÅŠë7ÈvWø¥ñÛª³$Í~ 8Hð@Jnb½÷‘²íPü²ÜFüP¡u»âX”gÿÕÜjÅì:×®7ŦxÊÓ«-FPë ÄÎÔ "›Šs—CMë“Øø]²ú®£fãy"F±I¥×°^Ý`‚†«NÁvL‚Œ¬ àVÛMTM‡´Æ햂Ölô@Éy%I¨¦ØÛ×kŽý+t¸âL†ç|0Z¦wóTëXòÖ«¶‹ñótvÁ†É½£œãù,Ón¸ ×y3z¦Øf-ÁEŠPf.~Jñ—%֙“ë®A†íï¸E¯úIRŒ_‚ì³4½î@,™oAƺE"gK¼ŽÍ0Çê!v¤ØTø¶ê1ÊöV»VAìÆ *Bó»Dç} ä”YŒ¢UÙÎu쮓»óXË}f˜ÏBx%×1ìªß@×þè6n7CÙÕvÂü‚ó™²ï<нEðD•¥v½½~Õ)Ô$É)ЀÏ/M08 iºŽ –œ"ˆåV¢ËË8ÍþŽßV\Œ"\Kó̟iºñHaþM´\§BÇîagè¼c%ów¦i<—eÚîC(֫ꪳŠáAŠã¹¢5ŽWâGå&‚Ü’«‰Šû-„Ro(~†ä-~”ÐTøœÔHø4¥Q@#Ä>Qb­½<¿ìnŽä!|Nd)̱û¯ª¶“y†ña¯î2R±?&Jæ“,ÇìÛo\$hGÁÊJ=Á‰Ñû—\ÇÐëžbxÕÖc-ïW ázÛæ±l»?WoVæ N‚Ø*~Yn+€ºæ(Ä0‘¹n¹™B±0Ëúä™nQ¬)†ó9UñÚÒ +ÇyÏè´Úy?ø|ÓMhBƒÑ£õµžíñ4Åp0ŽOläZH‹-G9Þ'©ñ¼!Ôí_NËòd˜m|̒=7¤Îï~¤mº–$šäé5¡ÖhjífJÞ¹j>5¬ 6kÊ4êGzž{Ó§À>‹ð™:óŠõ6Un!>­¸“ã9_ã Ïe ÉŽ…üªäͪ™žÎò½ÇÁ%‰Œi؅—¢·‡*7$–ۏõÌ_ActÆ$fa†ï n)ª=»Aôp~‚_Wì]6db9a804-41b8-b7fa-57a829b630b588a80bc-8a8e-459d-a92d-5dcfc6e2154d55773658.5593\Ë£:ªpÀ<ª)ö$ÕBŸGõŽÆtP\@oF)ÓA¤‹jšLäЁèž!]T7˜Õè‰êš€W4 +0=]Ÿ˜mƒXTϐ.ª?ÀAôÒEc JŠê»„êÒ +ÿÒdÿc0d281ce-3552-4052-8b9f-35799f5566bfeff119fb-938d-4e0a-b783-79d4270c4a33.3826798353050235496297784ed4d840b-2a65-4375-b599-970ba7fa4bd6af02c622-b3ef-47cd-bb22-4b782533dddd2288m10SVGFilter / : /XMLNode; (xmlnode-attribute/Arrachildren) , 2nodet(100%valuwnam; ,hxxyyobjectfAI__1ididturbulencenoStitchsTiles0.05baseFrequenc2numOctavturresult1feTininopeSourceGraphicinComposit/Def ;4fractalNois€«¨aa‚†a„€X†3 „$å` 1ˆcH”bˆ¡`€#F(€‚A›Ùvòù˜/üœGWgý‚'(D°«} +Ë|ÐÞ½øÔ[Íь!¿õ²_Êq—ƒR½•¶¶ºÑ†.+¥îTq¶7–ú¶O&ª­¦ðäDD¼ÝªmTvHöÍB>žàú¥„•®Ø@TÞbH+qÂ'›­®|훡›3IOÝq]í4ßâ,¾teOvv ÆWЕE» oY¤8Ú]ý«)Ë +I&-Ñc-Ë۞`+•âò¸ B͋çÁϳ†68;ϵ® :(-6ï¼MÆ»hjØÙ¢º¬'q¥90˜Ñ£¼`o{è# ­©£Yº6Ã0x:qWºœa žžÁ{b¦Šv´ùµ‚]/Tpîýt¶Œžt•lpD˜WÜ.pîRžê žøb“(hÊ_ò¸é:.¨û«Qó?…²¼…f•a´x2Äø\žè®m@aÑ͆¢N’ TbG{A“SÕå\t#C€ñ•j–Ž”½X£†[ ëNøòòF3܉$uxç[[ŒE™È‰1£«lü¨ŠZją9ʪL’ŽX´Š=S4Ӊ¡@õ–˜¯MœM +¬P)k¶m‰zýÖjfø ·%uàé¦ës‘lM·$$$‰&ë ˆ@¨j‚„©hh€–€lÆA&yp4J³ +–ÂWܚ†6¡, +‰ƒ•‡1À£,Ð]àiX00r€ƒC>$ÄËދ4šÆq–xp0ZÂà ƒ–, + +ÇYŽB‘’gAá8 lº'_ÞUöı–âÍÞe…ò0Ú]„vAʳ€±@Y<”EQ ãdm“<‚ByÊâ0ÎCÑ0”†E¡Q”gÁ]i4, …β(Œ€#0okšçÅÅE@Œ¾ˆ€#BŒà‹ˆ—±04Öa”g#Q”§a,EÃxHŁ@ŽÈ¤Jí£(œG¥pƒ H° +MíµÖÚ¶ÖÚj­µ• £I x0 …By˜†Ö’ÆižÄÑPž‡Ä%aœgQ@[’–( cQ8DZ (4в0 ì^À&f!BÀ IŽFa”–, Ƃ}HДEQ`Qš&q€8$Ð + Vpn…l^pÇÃã0’da(ŠäÑ}@Q‹ã žiWá ,z„¿gsÏm©bðý“ÅN fã +hQ5¡±¢^a§pûÃøÙá‰ZڀØîï¹™7n™»^w" ÞÒ ì¥x$G¹^ÍÓwúVr‘`zã·á þ8‡a­DÞ$Ò‰Ê>‡™ÒV´'u/þT#ܙvS†cÌu †Ì-èQ@­§ülÙÃ7“uääúGúÝ~#>'µOÖ©,ûb­„NƒÊ6¬¯¼/4SÆÑÉð:Þj1Fny0C\Ú þ¾ÄÁ¼»;†š×:•´¸k3aH‚D\鐾/8Í +üÖpBmv@<²à-3…Á«=W€d +_ÖC™³†y¥ÿ›³DåԓX‰‡×N¸U:.I&e +ÙQÐ&Vô_ykrï> ]švºáTßõŸ!ˆMs; ¹àÖlXf -JÒ¥ Å^Tzõº¨Æðã Àl‰Ç»\ZJ6Ó7U줌üHÝÃw_ +:'‰lùš[êZܚ5¸—] ôœhvkg›¤sÿ”ÃÆϧÙ;Ñ- FS öÀKí/Â¤™wé`é`)™å+ÉÈ}ÇC×Éo>çsŽÃ¢‰·M¾«í7÷n#o͒IÂ8j}âòëiü"Åà2¯[i¡4ÎQöäPçkŸØJ7S<6ΖÚBs¾Ò:f~ % +ùâÉuüYýÌC¨£¡&‡Å†Þ ®6Öô-yüÅ,Gzh"W7´Y—¥°«¸ ÿ’.2 +œ¦ÚdD)¦h´¼RSm*8Ó:Q_ò>ݓñË"ýǁ¼òÆ”˜ÉDlq¬„ •Îܼ;ç’ã÷¤PçS‰X×!ý-ñY®®ûÀà«|ùêëSM>ÇÔu]uW›Í­H3,Ô +yî{rÈdMïð’2Î𞙓V ÖÆ ÛŒ'åaþŒ4…¤Rÿ÷~2$M–Òò6—ì3vƒÞNHþ»Ð ·‚êÄÖçQ!«qY üw¬œÅ¯µ`ðI$øŒ^‰Ì)®ä’× ©“…IÔWrZV40 ´æ¾ +œÉ(;îæ\ì°Ã˜ÆÁnm<÷XèѨ{ƒ|ȳ@µüÊTKiÑÇ­Â#F}°‰ÝC‚’ebPi›Cðþ¦$dA⌤|yóh!ͳ:ÏL©SÀ[ðÇ÷Úsµ×Ÿ©r³ÀõýH}„ëâ)ÎI|e˜]í¬^g‡´ñS˜3ÝÚ»›ØáÊAÜAÉÓûîj5c'ZB±Õ4ìªKþ¡$Uý‘é q‚óm(ØT’‡ÖØ<RqŒ¯Rû¼Îý¸K)‡þl e¡¦&“!j_sï­H>øÃN\<4[hVÃo‘ W2Šb‚ú©”2@{¢¤µ.ZRŠá@ (,@t—ôˆròùh?GŠô?ñ¿AôRŒ6yfRNc”ŠIoëȗøïíègû`ZN¶qþ§Ü]ò1à_Èûi´çÏhQ°UÔNAÍ¡¢és°çK@ÍM¿:UžD0”vÝaˆ§/º¦šT>h~žH†sx2ªŽÈSJë„ïˆ^¨©—ß¿×û:ÞQ.›âDãOŠ°2§ž}” &s'ˆ¹ú §„ ¼]odzfJJ7Ö¤$pO›ÑíÎK¸¶u' –<(¢FBûg5ÀóR‰:*¬ÄUX¶bPÿ¬nŠ1RÚqWÑ-ÛjºCoVF—Ðß®”Wƒ ýD_6%;^}®…»õ¯™)UY©ØFÙd] U°ü´îõÒѺÙr'´T6û¿½'çšþ©zßÃÙ©õc’äj’¦Wå¦^A>›pè´lmC)»Ì%Ì]ª+—ùoËÙcf§Pöí±Š â³Ñër£ÔRôˆª>ÔA²B”ÑÃ:áq Ï/="ҁ…! ŒnØ=¤ù‚o8]dA‰<Ã!ãÈ „“õpÅ#‹¦Œ~wÐ[nÏ»Éy]ÆÒ(Iút§ |¯õ·@Ù/K2ÂYÓ_[ųû¶FñMèm…8ÞYDu RšÂ&ßݛi+±¥Ae_ëZ'Ô}mU#£àµ>ÿÍó[{-× §S aä@E5ü-Ìԗ5Ç,úU pR-9\ÖîXB3¼ä´<¤0®7'’DpӘ»#ò¶Š/›GrmÀƱô÷1ƒ†éÅjÃî±ï6∠#e™SMñ¡úŸ%z“)ŸW:Ôi<ŠéŒáßét‚#å=èü±&Xá »FDDi´ôfi+Xp +¢—u$s ©·- ìm^/"ªWÅ3])•µ'=è C&€ ÃQd +Î:0Fj¬Õ½ZÄ4jÓ ˜” +Þêuà:—±R\ ç$>‰2êÒqÆɁ$æyë³p½.›!æò¬äçm +[qŠÉ¯“5÷+â¬~7óøÕ^6öðá‚ÉIw¿|g"4’?;Ù/þ6#Ï¡ŠÌÎý»¸_¬·ûFÛÑIʶ‘•Gœqª™ü¥®³µÑ£+sž1”ðò9</G>ù1̍D§;‰m+j›¤ 6E9ÔÛ444Ž¦ÚªYY…nLzu—55-‡™õð%ûí†Xb©„¡ $àƒ±•ØH/õ¨¬“áÌÉ$d4ä¥þl—óèÂìd± éÁ©Ë.0ë¶rNVX.ð®Pi¼Èé†tˆúAø¡šil×CLs=xiÀdßµç"ý龍³ÅeJ ¬±çƒ ¢…Úš9£4õ~z„X­—°ãҍi镰ô‡¼Üò,LîõdÕû)(Å#Ðf;_–D +‡ðXÓ0Øw‹Ë3Åç©HeˆŸû‹ÇÖlÄõù+Us»ã¤J—u{pKe(üûNó‰2ó#µ=L¼kr¨ä–1ÛØûd}’OC{1n†8fî¥ø™ïÚ õo¢,ŸˆíÕWúvŽÜ‡ºfӆhzS&ÈÌÜ +ì–ìLP4ÛcpÏ –ÛÈقÏêAœG +l¿ì?à§éµ¢Ø½b»D7n³ÆVæ.<Žo¦Ù‚!TRÉîsˆ\ÔÛî“]šHáю:ó¿G-A4Ų±6Þ³‚+ÍÌ7™§°QFló'Š×ï="´r)VÀ–<õ,%i<–³ ¦Y}—Îqp9“+lϚ€Hkg[‰þínèߜÒÚÀôÖ)ª%‹C\ŽÿÀø¡’2’Òø¿fƒŸ,'E‡;2P×ñ'àÉúgô ¡f^°=¢p"}ê DE®\)’rüã- +ðeŶ¾ì̤ÃÐ5WÄÏOox§™¸÷¤>M>a_¤V-AÓPu9'•SÑ¢Ð"y¨«š‚{ô…×êŸNá]¥ãƎi +…“(@Ѧ¨Î~¦|¶| ÙR&˜®YÒæ@Jÿη%~Ž¡(dáT<ã%étyáêuˆfº‹FŽÀƒ·ë3J¨0ôཻ©SE}½øP4lËQÚH£#xb£ZoÕ¸‡-+ZÄ=q› :ah+ّ_3nrQ¡[9iýO‰Ê´Vt㹤gh{¥¸ÓÌ.@.F¾Ó•ÂPH’!8œXwDŒš*픷àr6PÖ·FófÓ+2EŒBQiP+cQ.ìË1žgøV’äÊsO¦¯×:4¨¤oÊ”ê6A¨´ÑMMr̳œB¡9‚:=§!("²Í"‡B$­qÕ˜|µz Z=G‘Il†¥™è_–è«EPŠI‰!–=ÍM)äøË}gàm~ &Ib߶+µ4[„3eZB[+ô¾õˆ8AÒ~¥¨ø)vt-oCOzý¿Hg9‚`zpÓ`˜äÀG±¹E‹®îqWagmý!•ì S–@(¸#;}ù¿ ýR2Ãù|4sÈvW³MSPÊv‡´±­wËtƂl܀~¢ðýrÕù D0X‚ÉÞ áì1p¸ëÿr·PصZ„»ÅDDÜdG'¡¢è“¸žÃeÈÉs”í̄Ҽ²xC8ûx¾Ãª]îDñˆ,_„”: ÿ<‚1[p؃±¤•¦3Ò~'.ê6¾2RúÈdÈrðVêx½ã^VŒÀœ²Ûø„’¤1ºtô~B|z:o*¯ÃVã|/;áàÓ&yb”V–H“›°+ÚÍÚ¢šØlÅgàŽ:"º ;Kù˜tlƒí}ßAÁ{_EÐê~w¿tjMr  5ërR;-Ðä$64¾D[YŽv®›3—;Œûa-ª¬ð±¾4 +ƒ1çaCEd¶.g)õÖr˜úØ4U|ò/qè|[&µ€éÍ<«–BÁ6ïà Ë1ÔúÒÐOåY+*O&1=`Žƒk6Q¶7u³udšt÷#¤ÞÈ·¼¸L£[ÿ¾½>¢|‹„Ŭ O‡¾VþPÚíq(UcF•w§Ës?šÔÀ‰[[b8áÆ»úƈ(È«Á)zšq’4WÖA%`ÇJ{}ƾ"­™ÞeI[p²,Éeq|QÐzm]WlØö¨ë2 \sð=ŒO(úÁÉ'lPj ½Hl¨²n\T­W»Jh †t|-hPŒ-ô“üåñ:H.œÈœfFtÅôBrHޒ¿Iº&ytŸºóéoO— —º?ÄÿÙ¦/snď¡»äHú…y'yØùcÛ^0 Dח9[RYðUÂÛ-áÌpE‹ÐBÝñà)¡ÚöíhG™¨òŒ3Á*ÙãÍ-w}‹ó<ÕL‚4-›÷ )$£È<4<æږ̈е°QŸgTÒ7Æó½nÞÙË8.Àà˜„µKá÷šb™—°:)ȑ¨ ªÏôŸ£&š`ƛÁou`â™EÂV“©Bzôm—µ>àыËÈ4“eô`Rn©…ÁđÚ¥7"(ÉfRL5㬯¦}6}£?Qïb±ì1EÔͨÓËA§‹RS«…¥³j ÏÙ÷sÖK8@ž|êipç56WpbfL™ÇMÌÊGua“Z‹iBÇrv˘¶¨ò¯-˜çÃöf®€Aw>eHL°¯+ô'¿¨&ôېîÁbJ߇’Ú-_¾`ˆ›=„ ,†`ÝÓây½é%½çE“¼ x“ð¦õßi+k˜ZÛ ƒ¸òî`OöÝ:¨£VŒ(¥‹Zن¡û¢-â¨GõjÛyéaë4´ƒ¤dÅhEMf—U 1‰õˆLŸˆ‚Qˆu–À©:&ëÔkO~A½VǪGß\KþSi®¿»ŸÝâüG»z¸Åx+ZH‡ðò¾ëÁՀKBŠ¿ˆU÷Iµ a/sŽ¢)„ ™Yá8òõ€ ¤Òg©rà  `JÚ UŠ™¶è}œŽRúµvá.¹ÆràÇÇ\7fA63ړ3?e30j^10+Þ$jíÚ¥pÕøoiÁ±ˆ6ÿ€„œj©{¾j2:Ì F%†sÜ9÷Ì[™àq«ºß*…¢/5…ì œ›"¹« úéÉ)³Ï çúRÖ~H¸=èàN'⯳Öٚ³úžwÉö.¯RŠWð洞±ÐéÁ¹†˜a›îZ¹“Ðö%O7¶HŒI;=OKÏ|¨ëˆñX-P>eôO—…¨Ê៕õÆø(?'™BÓI± +ÙÞK¨ˆç×3ƒ•dˆ¡TÉ .ÿ8é:´Dü—YNDy6ë-’r“^/ÙKT&JLÃó6Ipº,ËMÌFQÖM›Œ(ñû¿ Eÿ |qéYÒ/Xüěµ’õóȄ ŠØwáþÞä{'æ¶u$–€&#ñ‚hj¼» ËÏ«á"!„ww„Ón ýiÿ¶š×GÁWaw7‡Æ+ûŸ‡BÖaªcŽÎš]AüIV“ ­—í©|`Ìý·Zù®”¶Êm’ö 2rª‰Þ° è5é#™õú¬§”ïǬŠ$ÈcŠaÿÒ<¼ªòÊ[¤%F@„Hƒ›oÆà +g¬!¬%8ÓÑÍÚu»ò·á|3ú >­¤<£0(‹hvH–nܦä‚j”© +n^,Ž™||?Û,œþ„IùyÐq˜ÒÞslEVǎÙU2Ó®ƒSË%§ä¥P¤¾›è`;*ùŸsÑ֎ €Õv“}ðàõ…d™³>:‡©¶ÑFÚÃHBÝh³{í[lûˆÂažÍS¦lM¬¾/{ðÐDÈ)â`!²áá¹PΈn^ -Ð"h^±Àë3„Ý´FOW`ýJ©|䟝jô?.¾ï|Y˜/(¿ÕjŸrþÓøD䇖o9ž¡šB) «`JªT@üe;3Ép«(eNñBºe¹ßÁán‹ìMÃ[;o2Ó螶ð³xÐz§’¤SOç*%±VõÑNʎ,Z¢Â¦àE‰Êx q +༬KÅ,e…Ädñ)ô²DùqÜÀm}®&Aê…j"ö‚R™ÛÞyî»`éyžƒîQ"©@ö½ë¦3õ&eèyZ¢?tO¬W‚F|A>œ¨ṉ3˜‰¦T&ÝTNñW‡ƹiŽ#è= 5ÙDÞ" þ"cØâ`сËM 8ËÞi?‡q§ÕË>é;Ñ^T ÜÀN2¥#úxÚùéû™D}ýzšj˜¥‰î¤ºx7Š:Os#‚!שŠ&YbϱSÒÛ¯Å÷?`ÅëWUÇpýß.þyÊÄhD©ËÉÀ À,†j‘bœjG°N[mQÿBˆŒ.ó29´VqDÈê^Ú¯ÑHÇ觭gBfÒÈsäì‡ZÄ(jfªª•nWŸ%©ÌQ +K¹ÞG›â¦NwïÕª[ßJJn<à(–¤;âHÐX^^KJö¿ÚÛI†íš€Ð’``svjVu‡yî ]zM·]¿BÝÄFÔÎò̒ÎjÏx­†S"Uݲññ§~×m °)7žêdoB’F—ãéKÍ"¨#¹S2%ª@ˆl„ÿ%!ŽFpIÖæèº{¡9à§`–PYºæ<¿S³dLýÖ U8Kd4°2$9U˜žÔ†€S­o/£¡JÎ!£!fïg™N֎€Òþ R¶Q<ð;f)4’×l±kI ¹5’e'‹T^ÃVÛãMf ¯‡âE Ø"°è æX–§Þ$V¸˜7NÇ(!‡Ô¢†Ý<‚Û*×@Ë©¿:€d³œÑûÜlf‚ñÄSqC Šbc(…8gFÔU„Åxc*ï.ù³Ó†­íHø+€Âêt‚Éwö”w%¶Ÿ,ÓpdRÅNMãM(6Wh¾ÞðC0~# Q6<1j(¡Ø°‡>hòXEk1I­%Žkt¶5·Bb$¨+è˜1º†4µ,ž£S' +à»(þq\T¨¿Ä'øÛLáÕåd3*ˆ»î1ÿ¨ÐoÔÍ£/mr¾K ÿön°ùX¢G\½\[q¦­#…É‘5ý9þèŽ &Q@àÊҊ_]ÎRüœÐ´Uy¼é7`ã͏-FìÕxÔ«ÙÖ~Ìg¿ q»„ù˜([6r €'ŽŽ+°0ã۔àö2¬!ýÝ[æBQ¤Ò6õ¤ì´xèÜ@ÂÄ&%"ÌÙþfو{œˆÍþ•AKQé +¸IgK0æµÊS»ÎZ?J]¡9^“Ì +Å ¼&ƒå0…O†;=råݧ¬_„ë •5%]dàÉ<¿ç¼ÆYޚãêS‹¥/¦©â?^°=z“a`Êd7i;I»úT ÿþ”þøì?8šW¬k·ÄgW>4ùw57µ¬s’Úrç]½g—쬗š7gØp±Ž9Sµö³ö#cʶeHÛúÕå·kU—É֝WÆ«cG³»ÏZÄ漙Möê¦^̘ôc?z²%TÊê=[öü‰gý­Z%¼:us{îûû9SÙÌ1{l[ÿú§Ìò <­CÖõÖsOm;>¾m»åqúÄd¶fŒµf—?l¼7m?|6‘»ŽYfmÈO-õœ±£´›nåA}ðÄzMZêµ;üR=l›†u?ÄÕ:yxŠÒ™Ïx™ýœÅò ;£?™Z†ªxTSñì1²ºÊ=Ê¿Û¬öºw„©Ùç^v8OUïôOY_Ç(Õ«ëB>íÙQ»ÉkP¡âxÁ@¡˜ ` Â£âpPᨡÑPÀ€]yŠÁbyÜQÓmH󥦙±Ìæ)/Þè;d;»Úµýò 3zá!ååAWtµ[}<áÙNãƒËÄÎà)c¶TLPHmÔhD$X& –T +@˜[WÛó‘ È4&§Ôâg~ö–†™F³ y{-»›ÚB‚òT[ˆÈStNÃs†§¾×§u®º,S›ï¬fò¥ý˜y'ëë*k4ê 㪠jÞ í¸$&•U(D$ˆ\$‘HpL pV +È "`±p@FÐPÑ)ºÊZ §±0žš™7Y,Œ…A˜FËBEûVȆ–·î®:gø|®;ñí%Mc Õ·úÔ~l„eÇ·æ¾õö0„vwe}— ĵÙâ\îé“y‘ˆ¦"[$@”)âšÔ©Û$©8&"“ ‰D|à [&kKƒëՍ†5´Ñéw¶—e|&5ôX?–'yB »sk<«D]?³LÒ?·LŽºÖ(3ay˜¹Sæ ã1jµ@ª¯S¼<ΘáC³ØºX ÖŸ5ðèÒX]»©_väƒæ‰je–Æ™¼ÑSªG¨y»áž÷Ù<s¿ÁgoKc—ÙÝÒØ¥‘”K£ÏéK­O.[Õ:E‹¦§ô{}jy åã±<–Çò¨Ó?µ<$ËãAv¹ô8:;{<˜ٜ‡³ÕNéõ ï•ö§5µ÷4ÆÒQTMëGÕls‘Ï&Ñ02-ÊßMÍ·iÜ>gČ|†ÈÇ?F͆îËõƒ¹ [CµwP‘VñvͶþI5dhŽª¡>©Û†R ëÙ2aaNVÞ£lf …L"”Èf $"”(LD$ŽG„Þ%«µªìm •d’y·<–I"Þå*ßU§5÷¦j꙱ä=¶U²n¡þL+©®ê0µñf·Ÿ?³»3»3þû·gOïî$‘óöì{çîz3%·‰™™)ÉLíÌÌē™™©—'-ó¡¼z¨göX—z)ÑÓ3z¬¨sqόwF½C»=³EÄ´<ãêñ#šã3š„Ï×ÿÉh®z’7¾ñ¿]ÍTßnãábfgZ.DFƒÖȌŒxÑÌ0š4ĝÙØߊˆØX—k±ñ¶ ñá7Mßå¹»>×wCLË£õ^™æ]ê~%¨¨ŸÊ/Õ½!<6Ì\m ¡ÄÜÒ=øãñ‹µ¿·ˆ’‡Ýݾhùï+/­Þ^¿’Þ¬ýÖõ{½½½¿Óîx̓è=ëvwävò­ì]ím=®Ä“¼ó ¦ñ‘9í&ÿ¹umºx°0O ­xOµ Ùlèò?ˆ7Cl̒Ù÷Xq;9™ù­Úç»!wžOï×'›å²ŸE„ÕõJÈژÅBãoKãÜ]35»³Ä»: ±³X4@EÆé¦*k@ä‘D0M*‘@(4‰Px€Ì"@*0_‰¿E›¯L½­çõiÅs/ÿ(ñ&ò—¿›æ}çef² ™UûSç©æŸ&ÖüAC»5s|º  „…‡£A"!b1€Ùb9ÐDäb 1qṩ< –h⊉‹DA%B…¢ ëèþüígXò”'«½²V‘ƒCQ‘ƒ’ai`X& "$&.( DdQF`DD@qHˆ4 ’ŠE„¡€RÊc”‹T KC…†¥áfG©Æ()³)+ ƒL#ÒÓÑ]¥‘1, Kƒ„‚‚:Ôà0q@"Ð$2YPAá€$"" ( +„’8(G9Tx\P0@‡„…ˆÄqa:• +:#‡Ãb¨ÁAb₝J%9P"AY€( +Ž ‡ª`qAX g+NRá¨`AT¦€ªL(°ª_¥]ÉæÔowÎÔß¾L¸o¼_0ÁõRÙéћä§.Œ#{é9§%ýˆØ‰H‡ ѬÐRï˜ÏìÆ¿_„Ö‡tJ–»¸ £±O{—ŠÖ7>ÛÖño÷2_7Ûo¼Ö…·Gi|wDŽHzù…q„ÇÉç™H\xœ–…š‡ôna›ÍÓ»§T¼…‘Xx»0”QWiñÚ¼¬ô²Ü[z¤Œ Ýå…Q·ëZ»ž6î.«Ý‘û«ËkL»ÇxµñQ6Ÿ^â¥'ëÂÈí7rߦ•ÚQ¯ÒIÕ^ŶÝ=§×£´Üjf²ùǒtµõŽÑðú,ÿÔ.¯¼_#Õ¾ý¶7—Ü7 £^mÌеB“¨ ãÉoµ2{zÖîB;·c†¯šSyiªó YkÚi“jLÕ°Öa5ÔÝj¶òl-êc¼7]swöŸþþ?uxuçg®¦ïÔάÚ6ÍeÚùž¦- Û%¾ªÙï̕{Ç}4Ýg +Þž ÑܶÏ0¾O™K>OÔ=D$DcdZlDFºÁ´+sÿù™º<{}Mß<»Õõð­Ò3א*. :þŽû–{íy46!ÌÅBÁa¥)ƒ²I‘R™P— “žáá£-,<Ť?´©¸·û½%Æ¥›mƒkN‰ñJYÆTê-ÃÄL²¾í½.Ù]O•òp¯–¿ˆ¥hÉ°[B\²ÄoßÒ¡¡;]\¢U´³£K—faäñ`æÑ%>³0v—Xójœß<[zÜRÕ<'©š…q™¬æ›iÆb¥Á:Õ¸¼hš…†éhFWv_—‰%!3“½ £Ïyñ.“>×]V‡•ŒÆ÷n±÷pò SJCªtllLË|2셑†ŒÚ 1Yš\„hW6×<5Ç®ÁäÔ\又Ę`QD¨@"8*ŽIÅÄaqÀ„¢bqñø…$8"ǃD 8.XDăBbqADž‹ 0THßÓ]ìúow—kÝg†×ÜT;½ïÏÎß{zŸ¥ù}#3*çë·Éø¸·—Ú^W“qçù~ïîÖ*ÞÎ,~¿÷âÞ:Ô¥¼ +@b¡À÷Çõ3 ("•ˆÅ H îM©•…‚‚ 8($T( +"8 @$("Á²­¤ÌZy¶{EA…Á * D‘`9€"4^ Þ!ˆŠE¤ñ@í´«On¥…‚ ËêvG¼LÝeæîÞÆîn.£ð€Œ”Y©Ó¬Šn»«q÷¶ UoïfèÒÞzeõ´S–ïµU¾»[Ìã˼ª^jYWÛqZ×âîÚf·¥VUm¦¹Íä¶îBnËSÉ֖§ wÏ™·ùpOõöfaáóTî9»3uÏËÞXÖ¬¨yã¾¼bK3Ô~!®ÒöïUª[ËW{Fä«ÒÅÃSüÊäÂÍfMÊÍë÷J5o?žÊºÕª"CÛÄ´ãÒIÓõÐì0óËø5¼SíÜÍUÆR=  Щ(—éïþ]UZ¯±U[>,V»¹×Ê{ˆ (õÁ*ÍÒL|p@…YˆPþÁåñԟy÷À¸Í?4 |þÁÊ2Ë(íÁÕ>0 2Þ»T}ç87OýáçÁåÉ«²lîSÄ (ùÁª~p@õÀ`èSöЀª *{p@i †Å…¨ȣ& JËãÁ …‡Ca‹„J"q<˜@ ¢PÀP‘\8&@ j@©TÐɂ™ P0è¥33»j€*ˆdB%@SoÌ"$¡àˆH(ÔóÕ}×vÙO‘}ù§ÒÖø4î©[T0i40ÈŠ‰•D2B¡¨< &5€D&ʄ#"ခP(@D@*Ž +Å¢ò  “‰HÅb5`B¡h,C  Ê.ëe°b1¢¢2¡€O"’I…ŠãA°`áp@,` ޜگ7XV&PD äâøm[ÝܼÛÌ«Ì˼ȼûmý.ÿø×ëëyàzV€°¬•‹ïܵÿz}©ÖZ–ö¶B½îíTþ{ôQò µIË¡i²ÏԌpCY¿©I˺P  ”B ¿Xó6µÄ)Hó<ÔtŠP(ÐíãwA»mäg¡Â!ҍdÔ ôŒ0GR܈DóêËë\˜“5g(W½~ٙd|½~5肉Iˆ¡´ÀèœQtg‡5‚GeC„+Ý÷¨_×cè9Hè è¡Ì³Æ̛â?½åXB‹ TÖêÎÅ6XÀkä Äó'’'Äü¾Ün‰Ñ½•:H'R.Ia‘2Â# ¥œkGÁ*)^ G`+ÉR´Ùr itãXjS|æXy‰ctu"xéÃwg€Þ]V¬èS`pÇ ¢XGYȊ¤ÇÜn^þ\©µ›^ÔH2™Â“¸â2½f"$«Ó­\›„üÃÁò`¦at֚øiw{›>… nJs<Æ{¦d,˜ zåðc`†ž„5ñµãý¼~YÞ¢|B7ã„×3%1Ó÷«§¿ú˜òºñLIÛ%T4x¬K^zŒY])nÕ,‡Gò%­}ÓT˜ì¬æ՛;Aò˜ÊÁké»*c-Ìd=rYg<œ³ + ^¡³eͪk‘͇ˆûD"F„OÓ[–˜Ã cà#HÖ ¸›p.zXå®2X„à*¬3â’Ü —Ö"äSÀ¬´¾ð, ÔU€À6'eÄÕu0¼¬v:» æúaÁH¿_ÔQöfkRÑq:G_¡ dE$Ë"tá%꣥@^ãN襽uY9Û :»°ö“5\lø[œ‡CFld +î¨ä¤Lž¡ÙÌL‰ó)ÈE /˜º‘dF¬Ä3SH£È-íÙ¨;SKjH­‰ºT”¨¿ÖF« _Ô¾ +€rRÇM8R‹S·ä +mÀl5ßAáºùV¢~£÷5Óºùˆ´R\vìíc?¯Vv‹ÙòÉb9–3žË 'Ñ°& FKÿmª1Ëd«˜ÖU¬‹_}hçV¬—8¸öeQdƒ†ñƒôÆ°LiÇö/×4©ÝVµ•Ï›Þ¾I§ËÈr׬ X¦.U?6áë†-…Ÿ¦Ío@HQÊ®ô·¬Í@RalçíMŒ~ª÷“ï4²Ò2ZhnT€Ã½ ¼’Ø;´ íý”µ€)3×Á´5ÒüTÊw„á¨g¾È¶ŒWJû/¬—ã{T‚õÏAivsQF ·$Xëz×Û¤¼çêÐÞØßç€|Œ›ˆšÓàÃuu~‹7Í\ƒë2T+ 1CHeç#KАWȍHí®Ž7ý<µjež²v@­)!œ®1 êüH•9ܲ"J +â ø.pô*-ê[!9(jôF49c®«°Øk£Mp‡Îü‚‡±a˜^’ËÉ~Goù#† {ÎRð?Jɱ¯RD€Kœvi:Ed]°¿r$ïzîW⺉o"ËIãô&§}ڌ:VXyחâà·Wõ l~ͯÌ@ŽùŸéþ!Úâ(ûQjÂ-‡ j‡øVoËËý“ÖR*¢ ‡]™RBź‡i场ˆ€å.— i³[ªˆàzô¤èP*„§¿uøиCÈp +6ŽI<»UÐwS@~ø#ÖG² Ô¡ÐBúgv«°Í… Wÿ&îgõ&tHͬç좍¦Y(³xaÂõžù̅)}zžŠ0ȝ?…„ç!&4 :U‘ç ¼Ò–šŠàËBêÝ‹‘̹sû .‡°k÷­îöª*:7tàD:4ç܌݃XÜd„øƲî‡qo ¶±“c„Æ +ޛ`ÔÞ¨$ ’BBeüF ZÚË®]/Šý·U¨—2ê2?lÚ! í3éàæ•Ò•Uz>"úúíïªñӃå†"o ’Økƒýh¬`Ǎ§÷º ™ÀÅ (pv«#6£/%f2' ½”WÆ hi)ñvU’J´Qà| $~dKlÃQ>âa¯É#Ú\lpٟ¨ÒóoèÖ§0þ-× +qr!#ùŒÀ|ãT­4\ò)}Sëe€Û†•>ê&²x¤Ç +ßÿ= S´D#Éwƒ¼«%a ‘iP5 EÐu{åºìßhNæžØ ¹“¾G}›ÀÒ*X::-Ú@<è¾v¢¼`ès½j}vóY{&JIøRJœÐëÊ×ÏuIU#°¹h´ËŒ¬˜[~²ÆÊqšRm…¡C£Ôµ°­d‹Ë^qàËVEÊÏX!(ô®r@¯ŒA,$Ö(6ÿ T†åÂjZ­7+ÁºÑô`Š--{ïÅ|eà¡7#f¢× ™y“B׬ÒKLÚ'D´ÞH$ÌïEúÒzÞ¹Kæ”R 46¦‰2$ó¥7\%>¶v8 \· q$eDriEK·Rec#>D[Åî€%•l„¥,ŸŒÀZ)üO;.¶k€^uÚvDOÅÒ XG¦€%*´‚¢ÉvCôrXQ|´*sA›áÍömæ›rÀm]nÀƖ†ñÔ +–?uñ{2¥fv«e¬³I…B²¼öºLõíæ$åvካpPEv/J,»A6œJÚ°¿áÜý*œ¿´ÿn`Ñ~¤ewàފÛÂÅiE%ùÅvŠ¤»Cfaf݊܀CŸÃ/oŸ8½ØP%e£ÒË9Y©*L'˜Âo»@4Ë8Ó{̯ðd­Œl͒±ð?-¹%ª´¡qΩµ‡ „µsîÌâ½n¥¬ÃM +IeB¬pï#LÓQ/#jµ=>œ" ·g⣯y +hçOè«Kã»x­%Hj§#¼ì_;&ƒ<¹YäRŠÒ¥T%!7cÛ ?öJÊ=4«ª„‹îB³5ѵ²î›Ž*;2ôr—Ô|mhðÞ2Ôò"k~2öæÍÆ #øÝÈÍmʛ^ÄÉá5ËmÖAo ƧH)åÓâ +ÚåŠÞµ.Û{Y"è¿,ß pc ºS7h‰úgۑQ鵉›ž{sÄ@ª£o ÌÚ ¬àLÞQ1pÊ~;˜½þ«–Bž¨H]ÆrÍ©¨Ä®vJÔ qü+p·µ"í(Ÿa ;Éyø7 »aæ;¾œq»ï+g™>JálÁÍÝSžf†½adÆ«Ó[š‡ešúÎQ%1È Õ;Ûd…ž 4ÂR e -þ=Wþäñ?vñ[ô­åŽ¶¿ÕøŸ¡Ñ{µq#Žßgú‰X¸ ý€½Ýè‹àvE7îÂ>sÈm.ûÍRŒ©úXÀ1‘yÊk¯±X.‡ë6³©®)0ë} +™Rœßæ;WÂU]‚qQ7ÐU äýM#oÄ÷ï‡û[¹¼9·„FÓZ3ßsº9ç@¡ýâoqŠ¸€D¸T Ûkä— þ,ñü!§’ôUGF飊n¥á½n@ •Ý¨k*'fŠ›:! þÔãÎEš}†øwÿ]•¾›º Êë‰CsÁ‡ã¢Èî ûŒÕm´óèj– Ňâ‡Íß&po„꾒Ï3ŠÇÊs¸%™«Mљ…Œ­ ™ÔßÞ¸7äÁÎØ»(ìQ 4bÊ'҈ö@Pã×Ð5ÑEƒ8I Á‰“o›ÏelŒˆ:ztº„6G¡ ÕXHGÛ³g’C¢¼Ô;e­A¨.ýl¼ˆÛ¾íD vØ¥ïÔ܌×mM…¿ P3'j,¸ˆ½Èÿ 8ü³“‰ý Ÿtläâ.:0@ÏÙfCCÀ©Ú£ì’´ö¹ ]­ž¶«> °¿Üò}OuEB©èlàæÜ/ͯQâ 㜬6'÷eó~Èäz?¨À¿¿¬öf'+býö¶gÒä‹~°b‰÷G À<ß`~Åo +ÄB{]Á+—6p„óog}6ùQ3‡*@ @5]É1ý¹NÃ?·>™¯üÑÍý^‹¤VÜGÓ²~…]Å/Þ `4'@&·y±™g ³‹«±–ú¤®ó ¥ú´jF՚ Ð.üý “‘OÈ9È1¢68TG‚Ì­†¸“¯‡U#ß]¸OYSž‚• 5ZVuµ:6‘èl^ùœUÃ{‚ø¿ ¼âÍ}r!ž5©Á=f§ÇŸvYcY±Äý›î罺 4„$āŒætL! CìypÿQ³dßàG:†.ý8 ÌWz$ü›G‚Ÿ\žß×ZÁ¾l!õ¤ö°SÓï ÚBüºS/en.:u¡¥8JÇç£÷wÙ º¾Ø¨=ތHh›R]Iy„ +FՈÊjÄ'¹‹…ýÔCº@¥R§,E›æɺ{E¨²7õ\ô¤X‹9K¨Ñl¶6O Vۃ`¥ F± 4'êwý¾B÷kÇ­rskíwã–Këî@ u›<@¡§ÖP±õ4†xˆîÝFóLÝÇÊNyæc6&q(anMfäyx\èÝÄx65Ç ¢Iį V“¦Çò^˜£Ÿl˜ÉïP÷ç• +ÌÉ +›°R‡4û­YÆӂg«;À5-ÙF÷Ç ¦ ÔXÐÔ]{¦ü§ó°?–[mUû¹„DËnˀšK~mþ5ÎS”Â&Ž %uóÝ:qÁÌ–Ö@ÝIŸ"®Ì‰ã œ;X‡+#ôӗJY +„†>q×ö)ÎKûɑêeІuÄY„lw½¨ "þ[£­Šp½ºÉXǫٜfª«çòkAÄŠéþ&½wÑû ñ“áíò +À܉°öwwõ“ºè +Ú ãóõpaS(TA°†?+U¾aô¹!f„Öl¶÷_aÛMrsæþq57£'Å`ý|𥷭(RŒ„Ec Ç1ìBcS ä³eGö3jìꨲ³R¨`ˆ†š€XbJ<ÕzË·­1¤jËx%!±4Vn-|)Åû¡l“ËÖ]Ðb;â¦è·1Ä5EÕ `îƒ=;*¾èó¹Ý5®þ4A€}ُå­0 tl”ÚãJR/¬Q×ÄJEÚ÷:ÐëzC²eØöX,6JŒQÚÇ:Q¬‚«ìsƂ˭+"7fAcVƒ¶Ã‚ü·ü@3Íᦏ‘'¯/aœu“~”“Þ-o X´=Aîy>Ùi•óÙfଟRÌj+tCÀ³é|XìÇLç‡ÏMB¿2:@ §ï+DöwB×p +’‘âá ñôéÛÒ +çN8D·‚Ë~q"ݺ¸f½»£ñ¹1¾‡ëÆK®] 8¥«¹ËÈЍäÎœ¹ ·0yâÒÿ‘¹/Ù{¾9? ÇÄì1ýúP2‚ 0>’WXW£æ¢ÐHÞ¡­T{*2lVLäêÂeé¦í`i°U¹Xñ=¼5ò™ü”#·¤ ‹TT‹¦–µ\øWðTeǼÒíL¤WýgL¬¶ë²úòñÁª2!™ Ww®$=y +÷pq{««ZúãÝ ++ †ß*ɘsVU<ÉÃH¨í="Nÿâ¹9ÏE®ñ¬å¢¼ }I ŒÀùøZ¦Ÿ€rW‹JÏSóï>݄„Oà'ô<‡Ö¨Xb£$}͘ÍåW,ž\¤¹h“{¸|k.¸ÅãŒþ¸Íjç¬B9ôÁð-åx8O¹Ì*®æfÁìð+ÜmEȋ ûSƒh¬ÖêÂà’ +t°hpåö.]c'¥¬Qóº)Òïêð’{¤¿™q„ ƒ.8XäA$f{ g)¡ª`»MUí£+ù­|¼#ø;þ¾žþÌýëÁ°çôÁIGÔ«ÓH;y2XýåÉ- +N »3hƒvš …`•{Þ͓6ÇaHŒÇÎæ_òÂÅLR1žÿáX!°AÛÜ ÙVxŠ8«Âr[ Lãk>¹É4²ë“‡²kzíÊurˆÁœK…µÆ,R(WWò†‡&ÏSÍ.µóøFÈeæ ÓÏÊp1¶ŠÔ×­Æ,Æ©'S'|ò G£oªÔ^§ô–F >NÇ7C-<ƒáÈ,4çê©Ü2GN&쌗‹åÍ3Än÷)hT¤ZF¥§£Ñ·cB]ܲ7ԏagÌÃõâƒ,6È!Øî1ÛÞ0©Ä#¬æYT¨!~ÄàdÕLæ¬î]¯¡ƒv¼S”l¯Éäæ9áB̎K? 4c#(UžiàvÖü¯†F¼þ -¾«(/G½˜Æ7;Ӕ§ø^²Ë–P ŸCã,…9Ó@B0€¥§fo`KVî/wsŒ څ\­d¨¨~Ü%Ô RUFeómHŽj8øÇ‘tfY‚}”Ú¦Øi»öôä>!â*`…¼uEÝGC´_߃}[ vFpDÑÊûT;^à q¿…¨Ïú–5çÇӉŒÞ2^¿·—繏ðQðˆ%L[EÂwÙ¤ý׌…:ºhb­\ܚ"¤ËÅÅ^~ñ„fIÄ΃X a¨‡ÚIÇÒ¥kxXâý®š4,GôPo8(`ò#\hý2„òÚ4–äY‚/DwŸX¬Ï[æüN‚˜«JØ-Ái°1{U~ÒÓP[uA¶šÖ6Âò¥RöބЋ¡J8ñÆ4qžWôÙJ*•Q샦Y›TÆ Ó6yn€  +7 ¨†CuåħmÌ;À‰¸\ß Ü¼ d¢´FÁÝp¸ž×¶äò¬U—"`\Ù]‘?;9 3Å J¾¥¤¤çÏÕi!¢•bMÞå-G1(±íÚBBænn ‹_t]}ÞþkÎoî™7¿G>­žÿU§ó™Uó’oã†IÜÕ)ô´.´=å¨3sfPœ+)”û◜ȼ}‰‘ÖÔh­s¹9âÂç¯ÎÌÝhÀyN¤œƒ½‰†Š?i¯¡û®¦cmڈ§CotFì,Î/9N€^Ýқ¸Ågãh1Z‹ }j1Ɲ×ÇËëDˆ†enyýße„D~=¢ +dÊ —+ž ÇÎãñ°&·z¡ZkZr@¾Ó¤;8"˜`.dò:u»'z•¿Ð-MD{Pj0šÇkàìë4UÈ¶Ë \^bì݃%){‹æDŒdé©RP„U EAñép™ö D݇閒ÕLÙ³\‰¡\ÒH@”q쏕_²bÇ¿û†>Suž¦uh«Öu;«¾=j¨Ÿ2õ–ÊÀ´7*9±3O°§¡žýüH?Tm €ñð q5þ~ýÂù¥²eܬ‡…½­£èZi©u<"¨+¢¦n×@ÔÀŠØäÑQ7,xE€cZ–Åaa¹ÿ;uÙd‰*K¸lMX6¢ó˜_}ˆ“…AÈh;$ž%VˆÛz9ï¯Óë{¸‡òMkKWbRK‘NmøDä^sϏÅ#ÿaƓ–FN\ëïñN¼Øƒó‡ð¤%‹Æ64̯¶þÆÿ@§»FEïOî~èØ­F¬·Ÿ àù#SEÀæ<¢@bè9VwŠÕä³øIò܆±Äþ8¯tzëéÌ4š t¹–ËÀh¥A™$ ’–i<ÉQQ/PÔàléb"E‡8Äð°ß±AñȈ+:ßCš^Æ*¯»©à´Yy³ª†J?WSŒsžl„Ôl—u}óI‚Ì`­†:H3•H€j 4­eZŒ(79 ùU±B0Ÿ¦õö“ +œáSƒ{´†j1% Æ TŒfý *äH-=F‡ Eû>v´JšuÁ`· ,c®u”Æ–ëvªÌ|ú ”æҎ©,n?KǗ€‘ +bFXíWÕ.y“Dhn€liȍ ‚È +EG´Ã䶂IØɶ± 0ÞfÍgk¯èæ asäv¶ó5È!yÙ`7ha=à–‹Ô:4ýÒµŒ¾B•\v‘)pmçÁÒ;µlÝ¡Î| zš^¶z78ÁêxòÂKvt“VŽ €Âæ©GÞ×/u&·º™^àÚöEƒ·Ö“iU£$«\?*™+#…TΪoP䜶¬ËÊ3‡üå3÷áNÐiM[yÌ» ·¹¾±£MMW”8ÓÿQ[³Š˜ t"’qeÌ:@g‘óó £¡ùAQnžpduÏY +D:}&€ý·=wº!:òÍ »áKkAô¤ÅãØgÖòÀ‚LZ3Ø©#ˆž‚•ìØqyþ~–`Eÿçvbn£òaã­ìÆE ¦=?XWy?:Áqšå TüºÌñåüɤ̙!åÿ§.ÿ>¥¶vôEÃÓj4æ¦mhêg{ ÿŠ‹ ‰âByۚ%â¼³-ÊÒXmY¯hÈÁQXÛiœe^Ƀ¬£0gSH’’¦î¶X4·klÿ™u{D? ~?¡àú¡³&ÒMÏíD'?zZTâ(m¡þñQ0ìe-þ~%ÏPñiöCñˆÙ„ ©³öτ³•W]–Yz—‰]ÌÐ õ©Éª+îRÀÌç\n{GÉ­¦ò +H&ØçØÒÁžE½qëf¿ñÇv¼ Š˜Õ V#)Ìã‡݁ ÷íÞÝ +CÃ˚ÚzÕÕ¿Ž”« +ÏËA¨íõèpÀ0¥› ¸,ë@ã §‚ÙDXY]ç¯Ê°$õ)Tzè>½›O²Ô˜îx Í´ƒ­d:=͎Zòo1N{Ö¾?kga’þ³Ÿ ,8Ϩ&k‰¯áPOö&´MÔ1úA°¤ öVµiíCÃ2ÅÂ~ü—5´ R§6;·ÞڢĤ°»zµíú—vÇ—hf`3ŸËØÊĨۢLd•Q{Øêum¦/Õ¡eK¸Ò3ˆ—ž=52àók¼iŒÃZòé8Í÷rO«–H#¨:`“Ψ(&Ü݊¬‘¿»­šb»ON:d‘)‹%òðݚ7=`;Fk3æGH vf[P÷F2vƒÿ|"Ç»óEˆµÆ§%àlðXxbNbS€I05oM`À?ڈ«íx­äú½… +÷ªeןy”!KšÄÆÜ­rÇ PV×2£àY¡€j§%=¹af˅ ÊLVë=°¸ØÊDÖ¶Ï\!â[2ˆ!{cCxôV.¼—}#H)NÀ3ô>ý/gظÙžð°çÀmp¬ >À×RëõüÛÅü©åMï›âq·¬hg +Ú”¥¾ÇW2.WÀᄚïҔ5p5€®f:[|)ð_V׌ôäEÍ5=à^©GПëm˸A:pù ”Rã©K@˜N¤³MÔáM–Um>>¹êÇ("Ïgr×°‡§>$k¢" ¦ZXêȝ٘ði±¨9§Vþmâ<Ä;7|nÔ&Ï0âï Q ×®9oÈÌé¾u—…Ó¨!/8'dhb¹KVnžÂÞŒØm­¬ 9¦Ì½ <±3 Ð;(æ1îŠÀƒ=ÜÇÊ[)LÓќ:ì҉a|â'¿:.u³‡õüW5ýnðÒĔN¬ˆ9+«j-]áÞfFN;D•¢íX`ªW°~úˆ‰ì|\š2Kf\ó5£rÆâ¤hs"ÌHN£šdÜ¥ã\Í??Sc)](s9¢áϺ…íbB\DZkÔAS|E&èñùŸ9qNËî5À+nCüæ^øüÿm=è*Íú³[C,¤Ÿ6ŸðÐvF{Qœâ4m’)÷a:Ò§á´!ÙÐÀÇTPê2[0¤J3+øÁ&€™•Ly+¿¼9¾TÚ%À;ÜO‘‹µµ+ã`’Q ×±’¨"‘ö9³¶yõù™©/É +/Xθ̆ ½lŒ˜<û–à,†ÜÀW`µ×¸a'"… C0øÑ ·ÃÑÁ¯ÏûxÎȖ$ãETÍ©Ò 2 œØ‘苆IV!ŠÞðîŸT¨Û¿/@@« rp^¦¨0}¡Ânæí7‚'ç¤wñ7Y€Ô*;Ö¶ ŒÿÏO¢8'ƧàâYl˜œPý.â ½)Ì;®pàP‰Áµ­¦ù6Ù9 o%Hл¶1ÌW&(L·ö ú ~Ìõ 5x«*}¡³}Tµ•‚Ë™F’´Ú+)r%ò=[”—ºQ±}q ЉÇop@7÷ó‡áÊTSí‹5q?W!7|úê(ìꑬô¸üé<$-y䋧Šk6®Duüº»^͔w÷âwÆIºÞßÇ÷qfÖ-•(Ùn\ÃÁs¼‡:å%V×KY͝é¡#qà[1¨;N8#²€Âã÷ˆ'ûüÃYq߄m£<ÃÃù d’zéwmEQ†Ð‚\4CóLw@0¥¡Ó›’9~€þ"[¯„Ò°L>ñ92#)ù“­ï0ÙÁfÉl _lfO؍…9̱ÉÝÕѹÈ{–àýmè,ܴ͛ü"M0gø˨ßwýõ¶éP­^Ú ¸€ µ"ëåÅ1GºØPØìHj–ÌÈ/N¿B_]µ1¯š~y„¾6•È-ž˜á¾Öúnž®ä©Ç_ƒ^ÍXôzOµh_?]s}Ù+V¸@·K0ØÃ@qsÒÀ?‘t&ԇ·ND­¥?“ÃZw›|‹©ƒ~£m zd­ý¥ÌÝE?êwí¨’VP}l¢ ~0Ò‚åã=¬“ss”wå‘õ8~ÎoøWV¬'C£ëöÅj§ èig™Äî ›iàև†ýÓ®"s†þ³ 0’4 œ0¿@‡È6d…j™!àDeå(.$_±Û=õ¶ –Ž1Ü~üh©#˜pÁBµCÄìs·#Œ̏ØÐjU?›P&q~/IX¶ó›ÞÕØàF—‡e5ߨa8’°flj`ÐTÏ,CÙ,„(Yžón}Œ +,ÇPöˆHè`ñ\ƒ¹Dõ_~g Eã•nv¬«“LÆ ­‰øŸA+1‚ïkÁ¦`$öǁd>y•WÏ¢Š}ÙO…m½*Œ‚ìÖ×XŽM÷5l¯ŠfšÀ÷Âb¯2¤ýú^"Ÿ«à‚hºµ6xRP…Ý}avá˜3‘½þ¾5ã´ôœt_-¤ìM…½š®»o#kÂÄÕ­Óq n ÷rö(­™ðWš9O5¶"4"ÄV5ùp2ø\ã¶ç"â¤õ¹Û6œÏUl‹ä +Ú°n îŦqÛR +œ%èý({êŒ_* ÉI¡B pÏçwd54 ÝÀš3„û󂩖‹Œl¼˜<²Å¤Ü£ +?;õgò~âcã;„ðÝ«&YÊp^鈗R‡q,¼¤¹»S噗.<£!#À¾ÝZºâï¦zÉvOc¼è@ì¤Ë"º¯ª¥v£æ”³uÒ+2ƒ­Š +!9‡xÖ±!œÞÔ݀%ñ%›EpÚ>"1½ÑMǺg§psöÔÄþƒhjôô%ñ%d Xô=E ]uEÅ6g¾³µÙ!˜s2úO-•á:ø{G„„²k±J¦Ü¬ ¼|²­È_?žaHîÛ@xŒY]à 鄱«3Óì*wƒy]¡`.b-h+o^”ÄVÇR‚®aå¡ßg¥I,B›¼Š¢Æ.—ˆa +–ñ'¾IX†MÅîÿû +€ìpÂg®MglÌו±9¶Ñú-cX¿}Óh܍¹44ïÑ* ³—\aâE>j— ƂÔn0 žÑ@¥Ī@? žJ'.›ö§¥t‚áG< ™íÔXé!·Lúg$Þ¯4/J¥ß˜œs%SؕeFü FIYPri9¹¬›0B oa©EÙî°N0º ^jNG>ØN£[ÿ‘9D›E6þ'Ïè;yoô‡´&«r¯act§¦\¤7v–]BȦ˜+fU25Õ|ƒL!-†òp¯'"·Q†ý Œ$ƇlÑB"Ŕfï†CÍöCØ¿ñ‚ØL貝#§åDKŽ¥ÖÆÖÃ|͖9ٗҠ߹%å ßâ딇85 ƒBuJ;«‘!ħmSÄ»ç}nê +¢Èˆyî‹P±uáøڑ[qtJýP¾ñ©öƒ_ÉTvx3;$op+ˆÏ<ðí+bdõR°°Xåí@+@2Xä™@=yÙÖÛÑ¢bdNo)`Ìët#‹a()4<¨°³ûnìB¥eóX¸¸=‹+YR†ÔAHZ8àëa†_S cÅ»¥Ú^—ÈãéXÓPE.Y:v\Ãy2T1ÇiBVȥǿNgä0µí´íǯÐRE²Q’` ŠqÚÈžKgªx&"No.L„”v)ÖÉPéÊ ú‘Ê-ýÉ ŠG³ØabkVÈs†ÐÒÛC §×‡-)%Œß,­Zc׍ÓéÇ£÷yªÈzùN*Ó¨:>ì6™ñÜOw†,RÎ-¦—TpÚ¯ŠÂQž_êQDŽ –TX‘©—PŽubÇQÓÇ,›0SƑOò]ß8‰f€,`¨ß_¼‰ÅIQ`àçíTB'ó¾I6¾7ª˜tJ·5]”)åsYø MjÅ. ËLÜE=>§Çƒº¾Ê¨ám¦¨é PÇÛéáÏf–¯GNH™ë!fµøP·Q¸´,¬ˆÔ˜vÑæXSÍ"NU”GÃûçˆK&)*§ʓóñ‰>þ÷òëD?!«½„:ÑW*tÏÓï5O_²[W"GsΞ<<}vßj&S¨æ‚;²vZáb .QØ>*?è&ˆåˈv0N´¾¶(F#fÅ}Ådõ4Ôû`§ÃMÃ6¹(¶æ•Yø¨ÑP‡ÕˆP‡u¡÷²¡ŒzÀfhÕ š_Cì$ +i×òn²§Ø‘Ëõ½û¬”(i–Fæú –ƒ¨ ŸSé{°t=zuŽI|ï’ÿ¢9Á–RÔóÅ÷>µbÓUp´ êu «O9±V$™V¡[ØT+æ´]hL±¹N÷÷X!,ôçgNÑt㚠+-äóìâbŒÖ)ür„Ò “ŸÍZZÕmxy'@BQÁ¥-°Qc=~½Õà»ô4ÅÅ:Ç4©ZQ%©YÖ;,jЊk=@éÉaõ]÷ìp¡Õ…ؼׅmöÊ.T“%ž'£ð̺èzI*F¯oŒdho֋­E êdr…âtŸâ¼&µŒ5#R_^9fX,à¢Ðö2yºqƒAÊhüƇóG7ýNJçþâ +4žh~+Ï4Þ¼‘»Ë׀ÃpKÊ|¸Eè"À·#*j3Ah‰À'nÜݙÒáÓ!Ùê‚*ôñ‘ä|£4¤d鮝c¸ö‘ÄŸíæþ5M¸»4sºÄ8Éfô2¢ £ˆ2°ŒÃ’—³b<–ÒÞO^w(EŽkæŠ/ª²9P’¤çÑØ\!Ú¾¦^y0x^‚%¶`\ò·ÿT©wQ4`àcÙgNõό{µJŽTýØàÕ¹ËaZ*(Sªºœ6ª?küÜíùþ)ˆdCõ¢šéƒ%óÝxù&,Ã| w0ßéU4ßÈD0Øðw§x0n¾X"éí`ï]¸½Ñ%/ßoÐ-ßuC”ï¡MÊ·Ü¡ôŒiY¾;/ßèR‚7™A©Ü3¸iù暷|k¯·spDniSѳwo1ö»»IFWh¾ÒV +å¿Ì7uK6ð¹—1ߌL>' Òøv~ÓXڌç;™îó}£Ÿ°>ßý6Fßó£o {߄¼èû:E.ô]ہ-ehyün,fM1°õ­ú•^ù¾Pµ|×È ñ„.6‚JÁ†…ŠeVLÆ ÊÄ0XŞ”dÔÔ%h1šoÍ®v1Ô)%>ÆùÑé!ßdL@ÍËáÞ{W‹ŒÙ5¼ AæQð GStêcC;®ð¢„ŸÝÛNØÕ \Žã?…1"µ.'§Xa²½—GðTXn†>“2Q"XígאÌ4D'`í{à«Ñ45À%ÿ¹?º·ñÖæRo/Ž@²¦¤j°b1'oš‹ÇTâÉ/h& Ö6ïÁ÷ ¿çúÂD[º1V†KŽ.³u³ÅŽÕ@%< „z‹À”ª€E`sØÚ{À³2†¸Ø]1—4)¯-¹”DŠ|»¢§¿üc?50ð1¤¹{u"+|äŒð¹ùîïN)‚„ú,ÎXDUQ@‚ÓÕ®%xٕ«)ÕߖòezÙéL2Ε—qV Œïå݊Ìýæ…bC'*åƒu´˜*!˜,æÛÍÛÃDÆí¸Û'\ӄHŠÆŠ:#²Æ‹çrØÂägœ¿„« ”ÇÁ±VêÜL5g^kà٘P´áŽ'1_G늡DŸ•”³ÌS9zPW¨œ£Ü1¶„Fý8 :’U‰ó‹¯ýó‘aýtæ¢=£‡‘m3ªØ3ŽDNï@ØpTøÈ׆cF™– Ÿaz9µ{$˜ëCcã33XàÁÚg*0ømû^ˆe#AÌèŒi7é+vÐýk7{VYkòÄ/²tŽ¿úZA×+ÕxÍഐ_^îEØPfñB ¤vjLð‰oóJ*&ËޏȲp"X›à4û¤AG¶{ÌòŸæq1i%y4Í×·nâãé‚TÚú¡×ùIÛ ,«³ß”MÇ ¬C2šÅu €±q/ÊzŽÁ¹œ#ê x¯6Bù‡Ñ"[:GÌuø²­ð61A™ÝÒvH°sْõÁw4 Fg@¶a¶35.öÖM +$ñêw豅6ö…-ÔqLý¿äìµlˆåªªªîì±Ü:RtMBÆËîl²ßw9@Éa ‰ [ +]³ÔÉEw,…În ‰…òsŒ7+¦úãrà7›”‘Ìkñ€fJƒñ› a,_r#Ç£@Œ/y9 SNˆ‰ÖaH.rôLªÖ|Z vO&«‡õ-M1OÎB9\¤.ožŠ »(²ÛF;¦lT~¦L^¶öŠ!ÚéÒì¶>=ÖËqÚO~’-nJA™Ró>Ž‘Çvµ-ypÀ6ÃÂTô랶q+ÅIå‹.é1¡}QH•òG endstream endobj 129 0 obj <>stream +³Pdʋdœ|«ÝR'x¾P9ÖªwÌç,¬UÅYJŽs Ã[£µ ÔÿQäöV;5€qßî5§×xbQ'\ÚD u¹œÊ”àù”qµ”ÎEÍÓ®¨ÃOüm¥vGãTÜj€–Ëíò€â_w´Ù¢ã`t°8Y]k'•Ë»aà.aû•h>78¸WEŒt8 ukMHìíÊØñ7ñ0aœ‘çÃ>¹mý”è}E3ãÀî[¦HêG²<(3ÍBfšÂÄ÷'s»Ï™/)Gó·y‰$Ã×OˆHàþZ˜oQ|Oœ0R€1-Pït†Bú° Ò 4d5¢Zܧás¯´gC€ïç&ÁKdžƒZ_‹ûނGÅJdå1­¨¿™±=‡Ý1ŽBpÃý˲*/îà#Î2¬« ê@SD3R0M¶}Ùã>J{ŒuÐ Tz¾ÖUëÇñ—)ã@+ªšøqTÎ ‹gÓóDž#ÎKÏÆä]ª 6Äʪ*0ÏuSžåŠä»@öŒoõ¢àð^U€·¤-­ÀQ~9î£ø*#IóuTªÃ¨`)“‚³îQÚ')£ ³ÅIÆw‰.÷r33ƓÀ:D$‡Æ“˜ºHz»`s‰;o|¨Ï¬ø[R ·k„al0ÂŒôŒ7F5âÜÛ4:"ò©@-r„G“µ’ÿU°ìƒ;°,„°)¸Ñ4¨p_m 2ÒF=¼ªr‰‰ºÔ,SUߐöSþíºDP–¡@ò,Øà ‡ Ô+Ì ‚ür‘~„eiF2sÈ!sKî”étvGPݚ (30ɔ!6QšÙvÈ£®2Ð2C‚ »H¨?Õ ï†Tiuv­QÌü¹¸þÞó”!!Þ¿Úh<Š@uX\<îj´eHP—y1>¦Õ·áØö%‹a.l ¶º´-$v,¬A‰g_1·øŽ‹á•ÄÐ>¤g]‹»ö·±–7E«+À\â½ÅÜò±„Ôã­E9 #Ú0ÙÇc<è˧Îü¼‰™uÝrWçÁ¤ ÕÊî –´Åuaë´=ŠG8¥T!dæu<¨•a%QH³ÎØ,ꉹ¡ôX»føóžÄ‹Çµ*$„GÜz²ÝwyT¾±1aw´ƒˆ§‹Ü@!E~ú—;¦{ó{ËÈ˜Ë “ǯ—P}ð©âñ“Ò[ž«®yïÔìH¼ù(ïŒ Ìæ°±%kOü„ðÎ5¡Îê1¬&Ž³;0iÏÆO}?Ž”Øîäåo)#¦•Ý€ºÓ9SD"õünh'€Ýé¶É\½½}?—¢”…¬z%ÿ +d“šŒ Úä€6#Œ™-wN´)µ0 ˆç[ò“;‘!esî %uN‘܉ÍhL¹SÛ/5wƒõèL<k˜BîLPøŸŠ-î\*<9Ó/͝êUÔ"n)L&O{—³ºÀÒ®%œõQ`´Þµ–6-*ŒÄ¿ÍÙ`)ƒÐ+CäJú»¹+̉mø/ÏøÅ݉nnOɔàz>|ß9$GoñÎHÒXޚ—Zǜž †H±Ñœ³[›º3õÙÇ֦Ž.'õ%ðŽœòN.Tøòéε#zhûï¼Ü¦ï¤¥2¡ˆkýN6„çS‡ÈïDS €ß}§ K¶êÂG*µÜ¦ÅÌ夻“Ž¬îξ÷‰,;sçàÝåÝNoÇ]fw~T&ZNâÎk q{—Ìžì·(܈£m“ÏLØÇK |¸3Z!v2ºSd…¡1ãfå»s<\¢«;‰V´sµ€ºRÔ¦/Æ6ј²;õÚï¾þÇXBҝžr¯(¥žww^ +qHQ\a$ ¶Ùwê"ì`Un ˜‰t‚âH9"NJ¦¥Z¼œÛ´ö_6ºË‰:«x§Ù¡3ᡱ֭÷ÈnØÁeò%Gރ5!@߇”°&WGgÁsµ•Î#’b°tÂîB¦9¡ëߍeÑöéƒOÁû2Uür§Ú<\ïwn_ûâ৉âæà¡VüIG!Ešé‰¦>س¸úÿ~ +#}ÏDá53Ž)êR>Ô±öIXEó¤&0º5q=SÜUõJo±é˜s%;o¥ÞY½ {[CÑN«'T +"ž»‚'%jÎ B\#uÛֈw4«*áF¢·)€zô€`–fǔð@³Õañ¤ÿdܐٳØúzòZ9âàÂha•òu4šâ9Øæ ô«Büu1Ž¡\ù“n ;7Ù©¯#¥”ß«u¹=º¹ºu?Í*²²5e6¨4·º\eËDÒù¥äžUI?ãŽÂ&â+•ÑdäO{íÅnKРȐó¡(vqmÁI³*4%B l×Qђµv±îcà”ö8¸@§¥yër‡úÛÒH8¿„c|gK¯&Öo&ßC;c—>B*Az`¤d֌êû¦vÏ2—¨Ç_B D£Ç( ˆ¥ƒ&œÈkü + +E]7ƒå£1L®Å†:Òç°Ž[+]ÂÞô­¸Dhåöø[s€ŽQ"XöR´´Vé5ԆÁ\‰ŸJ΁•!RæŒ[Ø-:Énzyü¤ºÄ®pÆw ãBòXZþÒásÅ>”ŽŒÆ®‡Èvá„ý¯ªËˆ¨;ÚùxÉÙXÇã°ÔW¥µDº³áw±—NM¦ZòF-«rk.—±­gbHçãW 'ï‰èFÑd¡“ÿ¹Ãʉú|Ž˜ä ÂÍ\Q¸(Oè”Þ òog $nA S;ô[šmý¢)E0üç˜òßËj-†M &í4ʼjª\¬¢Ï˜Â.(æ~¡°¬Ž¯÷íébè$ÛáÁ‰˜Æ[3)VB—ßï@ ꆁ÷©[¼q]—©F„`ÖÉx6MTçÆq´ÏN+ ŠGð)­täç~õó]æPv8úà4à‡öl³ï^q²¬kL—¡¥z¡)áVXø\' +?­×,ñzÚI¨¾@¥¢ 0昞ö:ò4ªŸ)lB·~ˆZUu²ðii7Ãgm!F:¶bË Ð +ÅÕìN—;åõCA8¨F™¨£üãÝ¦ª¯ªˆ åž"d¡t±]Ðܚ©Ø@KÚÜ óìfؖTDÌK3¦Õ{¢•ÎªÊßc>¤RG. ˆÊî,3’Úp» -`@º˜k¼ðVÙ¬¶?&y£ßóØÍÀx.؎_Óß˵N Ga ®4 —[§¶Q^ߑÖ5¤ÐfRr0P‘‘Ïêvƒ«k5§u+9­‹®L“–‹`Þ§¹q(•_Òÿ°ºÌD÷Á’.Î?f¯kâb»t@¬mHRÃH“-Fc´ ”:ßØ |äG~ÊĘ9­áÁ¨—÷`¤䯰b¤Ûx%e…i-öz:—’SŒSå/¶} ä•xðÒÀþ3d‚†ÆÔpwœ ݝ" <Þ£¹ žœ&y›˜Á£B6]ZŸA θAK‰—ÓO,Èð½Ö×£(Hì™H)€XY2f¯ +s09´¿²²I ¹Ee˜G +mˆ_­¬€Ôîí+¨Æó‘¡-ñ«•¶°œ9¨âñÈ¡øµ•ÅJZÑ× +3ªŸxGAkæ,’WJ-·[fšaÅ0áxz,"ògeõ¡0aŸ¬x*ŽÎ€¾ã¾SqúF'µ[_¦Ä<´æåDàbݜ+yUŽI)E‚^>©Udÿ—ðqÃG:ÿßZŸØ+H– XvpÁ¼ ëSއWŸŠIqY³Ü6 †ûtú€]Ï÷)ì> +%Á +õŒ+…±¦½Æ(Ë܈¬ÀèɅKWê“nÓ´(\,¦§F ³v…£!å¨+23Oº·×ØYnˆÒoßçËØuù˜áÊô—ï¿[ð¥* Ã#;'ô[­fòŽðâÔaý¯Uàå€Ñ*§¡îûʘ7©Õö¾s̨å~>A\ùAð®j{,ÙïêŠ~r°¬Ç~óIöîbýøªEäë×n¿‚äÍõ{F`߯aQ“j°Ùé7Qô…è等E ×#Û /À\YiÓTo¿àÅWëM¸,ºæ'ƒFI +ñJ‚oNÌTñû¾Ã#Á;¦%µßu:P¹àñQ*ÌgØà»Ú<ɤðnI_/kyAz’ÈNÛãÿùe›LîÕQâ~ÂZ{gQ5ºCÂiäÞP’pÕ¸~E¨& cƒ•ƒF¢‘$ö •ñr ÞOQF/Š°ÀävT.ÒÖ^s߻ْ{Î56˜ñ^ Ñ-“#zVt/&[hW¯*äD€ÞGS¿CõÉm¸Š2§EÙ´ðš·Ðht•AÏHè(’<ô«Ç#å1…M +gÆCOóÎÊx… ^¹«’º &ÿ)&͚´L‚÷‚ᯱÒ@<-§@ۊËv°öŒâ:Fª‰ +l §”^¯{Q¼89ßHxjBKı'$EÜ»°ýD¾©e/r÷;ª¢˜[Š¤­2-fž69M<àà‡5 {ÿ‹4'P2<¬Ÿœ€Ö£AK>]D³`á}ÊÄå®K”g<¿Úœžc?\«Tt%V¦Ût >—b\Ã!H}¢qöÞ¶ ´váúŠ•”´Iê{ \’°L–9.yÄw_i{e×gUtP…•ÿÓ0¼jËñüAÖ¿èû—bõ'$¥á²ãdɒjPlm4á  %ØaŽß’J'¬šLÚN‡ñ”¤‚3š±ºHµåWCKJ9  ƒ(â÷yg«QVöøžæs¯ß¥¡?™¬‹¨¿ *âãðþô%faÙ¯” >ƒõ¡VŒ.]W* …ž¿<¿ãÚ÷ø¼ÕøFuãYà>ÀVùT²›_÷6U•Ï‰$ RÆÚ-—î7D¾5Ü<¢ ·ê#ÌʺöJZ¾+‰+biçÝkEW,MU i:ñÀN̗˜T'pUý뒪”ÙüÅÜ(¼¥»W6 ±ŸÁ4ǜŸPTøødü,ÆÀ =µ ¥kˆ]•ˆUÀŠ`IRK*/+~P'zI‘ê£Í¾Ô·é˜|®d£—j\™È()©9ýYÖI´ì)F~³x2¥HD^úA¼@&Û.Š·‘°u²ÖWÔ!éÁ(àiÕgº®D§#S¡Ò`naÜû©³†‚*T!0 ­¿Z’HPŠ º6韷½éºc¤´ÇY´_óó>ßgAdVËâ§t9„ªÁKSƒà”ǝPËÊÞ`i²ï +æ ªæ×Â\Žæ¯%Ù¯k½8)u%ZµH%]M jƒÚé¨Ï\ÙÚŔaUÌHaë^y„ت˜ڄÃà âw`‡× +Oå*©ÔXX!g`¥fÿ蕥@‰w%#O•éLw¡IÄÆêÁgtó–‰öÜô¦è¼­&Y±¢¯#[E®0]ÉÍM=èðЫ¦œóŽ8çÆÃ…ÄT¸Ÿ¾t§T™âÓîUr3Ù²ÌGåÁò2Rî„EÀ¬~}/¨L'¿˜/É „ÌàIBöê恲¨•µºZ©`KIQmåi[X¡dH>†¨£Úf,"š:óԂ¾3ÿF²p®]Úò44€{×oFZÞ·Lé%ùyÂæaùËtv04y¾ÖYk_ +lqMJ„+ås¥ã˜þ“ôÑûÎ+3“$9V%ÃO“êÞú»¦€(`ÇçK…ÜÓފ~\¥h‚^*/6]øøJð›áslW¿ò_䫓’@ë"øu`–—ÔÄe¥¡Rê  åîô‚¥í¼¦z!ã 'ÕwíFxՌ›•ûHTßÕ[˜9AÈÒB)A“¬]ßlU렙ŒžÛo‰…Jz돰–ôá>gU_Nz…ý÷^j – +‰´ÒN$×NßÚJÓh)3VHK[:ÛÍ —–Èæ{R ŠºlU5©—ÕxÄA4çÞ,Ùw4põAÞ³-#AÂñf¹9Æòo®&#S’æI$V$Ɣ„ùÀûÚª¤*ˆ^J˜ÔÌpØ!w·Ûe Uƒæ$†E÷(å|irWe)`MXOɐ=ðÑ7f+…ëžd x7è^Ek¨‘Î_*HrŒIÍ×u¾âX’ÖçÝ?êc©j¸µÅäâ‡b¶š‹j‡OB~[²q‚íka0æ 㨸F¶Ÿ&]c 5¹ÀGö•Ï£Ÿ?d:TY’ûDª3j€&â´mÇþ¤¼MU}˜«£¥¡õ"&àþ$Á<§¶¡R„nif +QD½å*Äê¡Z=äB“‘ßåßÀHL*KT€ˆnFd¤ÊVàVM‰lw±uY­+—NK|š˜·z^ qÓôH^«™ÒÓBn7G½ä‹{cۚUE¨ï\ùñŸÁ†ƒY3ì]}FWø8¬Cr­Z'«áÜ,¸(w%Øèî·Ú©HRq³Y7ArÑøæÓpƒ×¬âTd“ët tvÆ~râhWÀÁFÉgn»Ó*É%(p;²ÃÚà×ÜÉOÁtž,‘æJ‰%Éô³þ“µ–¦î–ÎHo ¸_/‹ˆ(ᏠE¦ÇuÃÓCš­ R|…õs„ÙÍß,h”V@eÅý8îJª”‚Cªt–SpukP}î¢/q&r  ê=õ±V쎸75FhjV©ŠºÎ©°ÌÖÁ°ºt==åzK<'6 ë2£Ë^yXø ùVv +™{ãKkœ,cRøи#Z֐oAp7DÔïÐ Ð 9ЖÐ@ú”Ìò?Ðè긔v+$fWP\৮іþÙÀªÍWî>-œkŸ“Þµ|7ê;0ýU¢&)]„Xb`Ìbß“ Ryøý¢mŒ]@ƒˆ¸“oÙæC ÍÔ05ÎQ^afUs‘óŸ´9k“‹îy@i?œkË É†];¨N¬é +·¯ñ4ÇV ‰þžÿŸ|iÔïJýÈà»f?*wÇÑ[’Å÷#ZÍæåBÒΘ³*ö£Å²T¢ôœ}¬ñII9^99z bƒ`ˆ)…**žQ$•€ŒÌàš{Ƕ‰VMý߀yÆ(é6ºu±¸XyÆr’˜J!Þìfä„*ÂGnU4«s‘ö“È߃^8Ò{Ú ¯Rìgþ*ÞHmÖÏIù´ÚgÒ¢•B¨¤È'<…Þ&43+–(út }jҟf*ÙÚ!@%Žc€ƒÃ"XçŒZ؂êpð”Dj“b +¨ô¡ ²”êb£Ã-É Ï¬2ԉ¡â˜Uqå"Ù£ ºùÒùö0çf7{¤Ö^ï¦Ë[ÎXÜw¹)0ëÓÃÇò*kõ ^檔¥d”RJQô‚Rª™÷L徉’³¢K ‹H×>0[J«Ù÷ˍϳ„·:õç4±‘÷[­€-*)U‘/.¾¢xÙNzBÔZnŒù¤ƒô…@ƒ—{Úx^4ƒŠ‹ƒAñlXCÁbõO2éB!y– †¦ÉmÈ3ãà/ô†za…bŸÎö™ ê©ڈ"zr²¬!Ðzܒ§µ}8Õ°y‡Ÿ|Àíå² )»@3ñJ† Z Ù²BCÉ£¯×Å(õºÏýXˆŽä¯”¡šÎLT<ü†²ÜZHàœ‰þëJqhހ–ø㗇ÕvlžÑA;ý’ÌtµðÕXzÒÈðòœòBˆŸ œh»ãbŽœd¤?I 1|úÉ݂aӆæE„! +M†x0qbƒÿÆëùèåÍʈW&‘|]Z^A* ¿ƒ$ѲDZŒä ®„ t²Õ '€ùµ+]ËåÑØshSW g­añG±ØÐÑ$R›Ý¹»ÐZäŠW׬É% 1ð„%‘Çó .¨Î`0ž˜EZ3¾Ãµj+¿×]Ñq5Ëâ&¼NàØìMϓâö-ýŠ´O…)‰¡l@ãé ñ×I˜’&OÐB’“Êü0ޑ&´"ÊåLÃˈ܏ô¾w¯À‡»_Â7à¢w8E€Ó|Z–ÄÚQLêŠÒ$“«uËW áÕÆà狘—‚´<¬Ž²]ÞYbO>ùËÏöüù/dwþz\´eñs: ~7dԖ[[ÕJœžL _ +]pWµÜÕ^C½t<Ö'\~œšD=—ª‚fî+¨úç³ ÎUÂK³ñÿ´J2¸OK˘SûŠ”Dš4>¢Ô’ÛrDÙ^ÕâÊÌ Lô½Ór„r–;‹ûNÇQց;êÉúe©Yj™'!EŽ+Äÿ#Íó +@£¯¤÷së'”ÌžS¡MF hȍMËêA幚§fØiÐ^ÑÈGd!™1ÍCWè¼qD%ÚÓ°Î!áZ°kÉ|¶å©}0YñY8»ÖOMàÁõ`q­@u  %*•äT|v±J¢MÁ÷½Ð؁˧'Ônü<–ß[ ڝ•Ú꺓õ·«®Ã¼w{x¯ªÎFâH\à9„SÎošXd>« eŠ¿ ÖmǬUŸ(È%Ö[Ÿ]2;IÈ°¢‹sóÇWõšg_Ù_‚_„¡ ÏÂt ߕ»4¼.¯)Ðދi%†~DÛjÔd£¡Þu‘¦9܉P–ºzÙÉ$IšTXhÓ\ ,4±R)ˆª*Ɲï ;æ.¾ +'j±aÒI+VÉÃqCèãTÒIi8%Ö²ª5î‰ÚS¶"À¦8ì¯`‰økwf›ÄäÑÑ ÈnF¶%D=Êۇ‚ù€VK%@O£64ÜHl¼—í™v0òW}ÛçT-LQ8+O ‚ËÐß+=XÅpD¯° E'¶C}&áyìH‰fOꓴ‡ôW¹!’°OTl%®§oJãòW^*–ÍÚ´$ûR‚Û•D©XX>¾ÍÝÉçÖ¤²ÿj g¥Á´H zôb ®ŸK‚XW·±| ͎æc«´’ŠÚZfŸ6‰¡5Ta§kHOi­b$3”QžÔœÍûšÒÝý7„Á²™Ë “ 5Ö,Vwtæ'Ügh¦1ecØS)µA}îÔçú¦B!YI†`b¦²!j0!6Ä{vydT4Fy†é:\’S<"¦cl%q ¸¾4*Vx8gĚt¤³Âšûêä5•„Ši䑼DS±Piè(“࣠óܹœ2Çò(•g'y«æWÐá”Ê èåJ&jaEiX'bŽ~7>d!PX°)DœOFgñÁIÓ\ävjQjÕD¡•*fUÙØ?\ Õg""'^Fd—_ ‹µדûÄ cç‚*iµ0%ßèexq‚]‹Žƒ¤¦}"· Ç瑟ö6 HP§¸ñ¸–qÐí\t‘Wêº)σäxBžQ=‘ËŒ¬çe‰#¨68;¬¤þSáìC6ʒÍýN××ü©abrÒðSÒröfâèd1ϖŠÝø×Ҋòd£¤º%|Ál»ÕÀÇ8$1¾ ÄÊ +@-ðý_Õ£™¥}p`Á;ç2³kówEDDÙLÏç É Ý “ +M#mB[¦2ÒHѐ$ ãÚLfû`b†šÇ&Ä0€“2óØ +ídæ±#ÍHÊH›E§·Õ ´¡@46S©h¦¢±°• + B4šÆÂ@ˆ†*¹„h m¢6¢±°%•f$Q%^M ŒÍ.Px0â h› ˆ8Í` +V¥ rª}$h–O@k°P §‰‹SÂ3ùd*ûÀáÕç‚ÆJ…LErm& + F¥ *‚Ë Ô1h}j»ÊTLÛ £jˆ6Åàó°YèÄ:%ÉÒ‰eò!ˆmœ@©£¤'ŽuHœ‡ ƒgƒj[úØt4«©0ÄÐV"p¬ÌT\'Yg£Tê(q¸I’8d wpšy”–q2cek++('Ð*¡õÁh2%PÊá`€3’†Ê¡´ m¤½èhG/:Z™™`L BiTš©8N4Q @b™|2$–Éga[Ø6EAT ™ŠÅÈ&Êd¼!*b ‚*3!¨”¸8EÐåÚH3ØÇE:1*ðŒ:¥h›xàŠþ$C†4;Ò8Ef{#¡Dƒl™ŠÈ  $sÄ5Ù'¡ æéH$hv`M¥†¤Øh™,SQ=´"2((@`â”?p€l„ :#ð¦T™0³LŃÓ.ŽÐ†câ,#x‚u 8Pќ ‚ëTâV ¿ pÊL…c&̬cÃCñ>Sy(HSªAHM†@’b§Ái™¬¦‘ðIÍ >|68F Lg§aÄ†ÀÌ#‘ YŒŒ"g%Œ¨@9«„ÖG@#‚J¤ÙS‡†i¤¡}$N[ˆT#¸x EÅ"U4°H Ÿ…‘ž,Pϰѐ¥TQ*B•´° ¡PR8±R&òð8mK4à¹Ñ(p¦¢y˜yljG!¨0€Š gtñIãq™¡€ˆd²ÊÂDÃÂ&Èdn³™Pà ™,qÙ`ŒLdd0 4&IŠÀÐL,Óë`VC•©`¤€pxHxl`<u⁥ @ìgÆ(4¶Èl€ „‡Ãœ„&ÑC‡Å@:¨…–l £`A!a„±A•8T™ +Á§03Ï@¦:¡ G@À̓ñ $H03M ¤ò5߶”G:`fÛL Áá€Æ€™M”2". OH!æ(ˆ'{ñk^Ÿ©ÄLP˜Ù¦¦÷¯ +3+ ,d.“ 3˜©¤QѶ†D¸¨j ©‹ \@àÌvñZ‰d2ÎŒ$ÃMC!`Jp¬|Æ!€J]„ ³pr7aâ„Z2Y¦R3Œä‚ÔóèEHMöiH@lœn0 y¬&Â$º|¦Ò)mBÖ1“ÍFÒô—2a< %3™Cm@š}H‚LÅÄ âÉEAˆ,`$APjœ¸5GFMº d*'F•JˆŒ +¾g@i4qÈ8 +„” ÌTL›ʄ£y 4”D@`f™ +Ç"Â#»#ƒ&)X…2D!™ +'¤À1Œtp>§ ˜¦02S#«’Šš@ +jh0r´Ð€ê€ÈTB ´kÄ¡Ãã0cT$‡C49Qø–¬àá'NÞ,…™x‰#• +ÚtÒQR× ã$Uñ¿ñll,¼TÆÁH>\^¨À4QPџˆÍdŸ B¦¡PÂÒ@Ô:§ +ŒÏIæ`fÂÌ2 +”‡)=6d*ESª +2 +8 !5و‚ÊLâÂu°mpZ€¾6„2-Äf•‡Ú§” 4~ÈDâP1LÅsáhíÑ'8ãH`2Öh$@[¦b€¢5ÁHfV£½H1Áنìtʑ.môüìã2”‰)%ø5˜0³ˆ_0¥€ÎTB†€À“R‹°uP ¬6.¤&‹Á43 ‚L–©œˆ2±QšgëQQüjt‚³L傖â! ‘ð„“þÂ#B F²À`1-`;ÁY¦2bl*ú“$Ž‡Lcv “ÍR¤ ‚‘t´­B6j{‚³5ÁåÚj0Å®9T2“§HØb[Ø2•5˜@èw¢ñÉ©e²Yjûä&"E’žN ……¨´ ‘P0©@ŸZˆÒ(dM&‰L%4¸å̶Y P¡j”†'bš Eg´&Z"fHÎn„±‚ÊÀ!K3ØÂV ‚J”m‘-Dê„^ÅB„,p˜l!RÆÀQ"”›RJ+—3 ¤œ”Àƒ@DA‡Ïž¤¸Bë3ҐµFÄ»m"”ÖÉÏ:S™àŒ.þz¢Um!%’‹ÁcTA€ÂYpPC&!’R|ð0@(™}(X ¥„“EHDùìãNHÚB !¨Äœ4Lú\œs(B–6"yø1ի⥊)T2Ò̄¦Š•°f %¯–°–«e’S½*h3Uêd>–ƒLÂÂ*QÕJ^ª­£Õ",ÑdÆz°D‘…&cÅj4VÉÛ±(,(µÖëcà ‚üj¡€e!aQՙe¤%+± òbÉT1Kd¹VMå‚ÍZ+W ¥5³ÈX1UÌD2Ëz‰E-2˜ &¢²DQ‰…VƒˆÀ^'‹Z`´šÈ RÅ6”YË¥‚Åf®IÉÀDÞÏd-“G˜«Â¢ú^ fAÂJÅ÷jÉb2–0 KkƒÅ\.ÖHZ”ºT+<²k•°d–°\±–K¤äÕ2™µ^* ™-šÊÅ¢p­bZËÕb½T.‰œÑX³™ˆåZ©>4‘ic9h‘X®•Ê‚Ä cÑ^ 3Š +Â¥¥D`$š +åbUl,´ +—«fb¤K׺Qµ\*K‹öR}…ËÅqX´ÌÑ`± +UVŠÝE @‰%Ròj€Õ€ ’A‹F…­×…%¢2ÑHX)L¥#q²¼,`¼,+”š‰…%³°Ð^¬‘ÖˆJvò,ÐHX)§`Ô &€– †ªÁF.kä!ƒÁ\&‘–ìäb ÀJY µ\ªÚ„¥äÕz±h‘A4³°^-­³ÈX/¦r‘XRD1˜…«cQ¸T+˜ëdRÒ¢èŒDM5¢¢±P@2S +…£Ñ`«èàŸvûæ¾eÇíŽ {¢ñI˜„Š +t@#ïá Í·SC¾ÇÌCˆéãÁx N ƒæ=€&2¢*Ú'7 +zÒü ‰8 €®…ӛŒH8¬Èpå$“ò² |ù؏œ€R!Í®>N’ãä£qòÉ‚‘ôPœ|²GXµú$l"h?Vʱú$‡!µÒÔX}.VOÄ*ÒT¨Ted8ˆZµ!ââìZ¨ÆÆ'GH,‚éãlàd*£F¥1µº„`ºÐ¼J T’GÀƒ6’Úø$Š#ÉM •sH|ôBâ“) ÛqQ~"$>)‹À¨¦vÖp•Ðú,°:JZ`’ø$¬ F¤@AⓙJírbÏ £RN=Jâá - bm"îã´A`R'…`ð80€6>©y'›nÜÈCÖS;ë %ª +âQ"îCV`²0µ(@2وµ²!¨Ìý¬ód*ÍT¶eɶÑCB£ø³™©|>÷ñt>Ÿìt<ýpE¢à3r8af¿©:­“œrAÈx2•-䂐)ÈT86d¥좁úDˆhmO"_T™ŠŒ´ ÁRF¡‚#Ž‰«ÁŠe&[G­£bF:!y\HMv1ãIÀ1ëK¦r‰)v—Ú©1*ÝÕ†ñɇ‘L¤Ì:´1ÈÌc†ÆÂ~ÜÇI;$ŒJ•ã€€=%×iÓIhh|ÃÊ ,A&#½2#y +0ވ›E•B£­Ôêpf‹1[™ŒFџĈF˜(ÌV&›¥6³OêQ +‘©|R'éôI˜BGI 0J’JqúlÚ@PZpúÐÐ'†Ð@ÊQ,S 9¬,†Z†FRŠDDBTPâ\ £KFÈ*#ÃA„ÒÀ(m-`ÀÈAÈ® NˆRÔ@2åYØ®@›à Í)ñ /Y§´µ½py„i•AÉe8hs (Òv2NFjœÍTB8d96>y©ÀÙÎè⛏'‚è ÐË.6„™ÀGÓÂA ½¶Œ©xøl¦O*‡‘”ˆÊrG/â&4à™pÐæÑØJQ$@Û6¡Ê|¬ÂA›‹ +4#NŸOêôÉLÅcB0ø(éǦ`°ÙŒ$G •ƒÓB #Ä)Ð'J:š©¸½è¬2£Ž20 6¦Z¦CÚ +B^ÙQˆIƒa…JŒ Ñ,C%ƒ2S‰)'"%šÁI§<žÁ†rж¥hH8(m¬+?n“IC‰ì0'ŸÌTR0´JJ: +¶d’]R + ¦OêGÕè¨@H,“Ï ,STŸ” ¤\PË‹<—$ \ œÈvÉT 0Û¥Aóñ\8Ë’.¤ÐvÁÐ|<—†@à\hžÎ6ÌD´æá m +†‡ŠNšŠO ã#¢ —¨t‚‘Ò†¨€R +TÂö!š‡ &á m„5 “èѱNíÒÀ12\F\µŸ}œ«Ö&5IæO¸ °LF@{ )&ÿPA‘ñ@©  gBj)<¢ê¸4¤D ©eb"¢’pZ]^"§‚YLœ !ҜLD °‡鄀”„B”©dÄ\ +šF¥­ˆÌÇ£%»xL˜™ië(i©ƒ…Ò˜ø³&@ “Åæi°À@ƒŠM¦ÒK`úÈ^ ,jó6³pñpÑF+½œ`ŸÓÉ!#X¢†W-"=3=€(›ŠNƒ˜>9ê”ëInNC¢‘y%hv´1 Éސl Hr"B£Òِd¦’ÕFõ€Q©c”$¥#¥#C£$Fc±ØÆ „¡Ùè(éh4ºp,46~U¼*N§ŠJM!•*VªX‰"q¡lBP¹±CŒ“pbvˆ9èEˆb¡šBJàZƒ†P6%p­AC  qJƒƒ†2•‹ˆS1 0™y0 `“Ò&Tڄ^3ep«™ˆ¶¨Tɂh M-:  U²¨’ˆ&{!í<°])°N0  F "‘8 +4K⠑8 +R$@0‰×‚JWÍ‚x N§:úÀà‚Ð1˜ØhJ%åÒGgÃutŠ$“ÄAâ8ØDºñlh$H2Q¢HdN@j²KB†%1RóèEG12Cç OªLe…ñ9ÉdÉFÇ +2 +LâÂu°)LÀY ãqAè¨}Šûåô±rÀ¯÷|˜0œ>¡XmL<ÐäGbsA8!À@›ƒ8HŒ€t./²(¸XŒ€t.K©sч‚ ˆz.©Ðv©`Ò¹¼ŠÍ…Sì4X("YJÇ¥@º€d¦2š‰8á±ñÁÖiHÉÅÃ'ã„Ú‚”ÁPøh¸búälµÙXX7"Iw#’t#’LeããF$7"I·1pˆ††† ä”NHLóãH%RGIG’ŒmÄ6b IAŠ†ä³ÛɌõˆ +tt2cÆ †qºÐ(8™±’s2c%¨€5€6m:#©yØ>É‹9 *V¢Hœ@™J…† Aåh{‡¤Y„¸¥¡SâsÃÆAC 3؂3à 5pŠk†œ‡ ƒÃC¦B#mB3ƒˆ{˜hùª86T¦‚*A• B>6dõcC0' k¢±°(φÆ®LO@ÛËàžFN˜xªÁÓÈé"A³1x’²«ŒJ1¼™T)»Ši©Dê”>JžL¥„ÑQÒ +Ug´< ­Túàˆ +ô `³J8 Ô@ +L ÐF‚=tH›ši#ê肉Gh”>R^(µ”# +F|ød*'$ ‡ÂEà/ ‹™L“2aÜÁämXŒÎ©g&ÌÆÇ¢P ölÖç}ñ½ÃÞ÷^9¡û¾¨7czÌǟéFîæ†cüålgMå„ +cÜ9~³ï[;¦Ó¨0¦k}Ïóeï¯Ë|Ìù>îó?u»1þ÷jrŒü®­©.¾úË}©0r|tf÷×û/×}}™aGN÷ëðõ6|Í­z»çP#üw÷jÃ\woßGç0ù=:ïgÈOcjt¯aŒ1¹[ý¾n~®ÿi2¿—0ªæKȑ9fŒ‘7¿*»¸þ^ëÓ|p7®ò¾ûSø>Fÿ·.ãvCæ†ê>¾çÛ¸Ë1öêÇÈù:n¶>ŽÜðu\ïØýÔ=ÖÇ­¿{ÝótÚ¿ð}¿ü§s_¡·ó|ØÑÝå¿6ëîfç:ÞïçüãêÂÖÆÏ×ÌÊ0á¿ï÷®Ý×AÖç_>WøO=úS˜0óñFUÕ§­»Æ†ïÝÅ}ýïú>õvïçî§ðõ{¿ßµª÷{þq«~Æì_}Û¼ðם_¡wëKïWøž\×ü ctVõø’™áæ»_íí·ýßù¶·½„ÏÐ}û½ó+/Ô·ð9d~0½UWã6ŒNãƒð©§’bØùª0¾ïnøÒ­ÿóvøžz–Ÿûø^y73á¿øöz²¿¿ø^ó·êێ¯ÝìýXó]ôÿ\í÷¯ +_jLŽÿ8:T¨ÂͧߝìVSþ¶ç{O»&T縎¦to§Ù©Ýûâ‹._=>wL¨مêéç”_¾·ç[ÿÎ?¦F÷†êaŽ°ýûíFß»{Õí{„Qû¹o|ÏõƒÚÙ.ÿu¿w~øíÖÕ3:ëCõøn»nß²¾?É¢5å.û›ã{ç5BõÄö·¹ñõÁÿè>.Ç×Þü\~ú«îAõU×—s[#»· F~ñãÓßë÷í ÷s¼a®oÇ܇ý wsvvÿû~ø“_Ì|…½›°5¾Ngþ·Ðá»×ïyƏü½¼üuáÓøÏ_SÿŸá«¯?ÎŸºÿÆÇFߧޜ©íÍ/W³÷f*ó{Bunn»—¯¾ÎϘíÞÇìæîÔ^g¨®ïý>ú{GW~õSãBNÈýÞ{ïì™ áúóçßùËëoÝ{¾ÚʹªF~†® êBwýP7Æ\øžßÇ_]®/ã¾Œ]7=c;Œ/¾{lõwÎP™!ôÊ­¿Î0Ÿ&| ÷ct§ õ=÷¾÷X¢ûB÷øï±o»¿ÇíþÜïÞ¡2ìØ»Ÿô _öS÷8¦¾çm~¾Çüùü¿íÌý ä誺¸ïÁÏ|²ÂtßaÜWÿ›dõލªÐ=¨ü::È¿žÐµ½#|w›c|ïïýwîˍÉÛ ¡ÃM¸1¾×ÛߛïmBv‘ÿý[¨ 9ÂøKtq3î{,1Ãç«ûÉï±À§pÆæ~úà{>Œ.¾Ã×ÝÎù7zT¨ÚºŽԇÿÙ +ÇÇìéԟãv‡Ï•{¡?ïð#üþ|üœ]óqT…ž™šúø]÷ÃõÎÎãûǾ0:ÜçÞç2tßm÷/~ä^÷Þ?¿V¨Ð©sÆصSŸ“Ÿ·ºƒïU5ýベo£òFÍ÷̺P#ÿ类;ØГûûÃ×g˜û6Lø?7BêƒþÞ½±75cÃQ¾ cvÃ÷Öî÷ÿ÷Ê®Ëñ[þÆ÷é ¡zâs0ûߣ{O_ÜÞä…éÞ{ïçïd÷Çÿ2&wjÔôݨÐ÷a~¯·÷{Œ¯Uã³²7/;ömŽíŸ ûi¾÷Ä܎ê»rŒð7ºoßfö?m·ýú=·þ»ö·³[‡úï=§®ÿõñƒÌ°¡n÷{Øʟquc÷ç¾í÷XfLõ觪þ4z*î÷ÇuÌO=2–kä¥B¡¨d* –­ÔA '"0׈Y—CW÷0µ_+o@øPCÆ¢½X£æÝ×TÉFTµ —ªEk½tK^­40`Å°p©x1l Z*’ÔsoýLè~=ÆöØï8_/û~\÷ÕCº ÉD iá(ˆÅÀBb¸H=h|J"KV^) G-›Ê*eIKúZàª%>kUjäUÊd*#¯ˆj4˜¨ä`€3â¤0àºä7'…#ùÀ18äÉjæ±Ït1²‰ 0BÜP:àÍ ÓúÐ4ZŸŽ‘¤ÇEA³™Š†ÃÀJ jӞU¬¢`³‘ €ƒbzƒ+…öIˆñP2™8p#60BLíá ­KX=´m26@[z8hË{8h{>`à„²,àcCV@ + "ÀAÛ£”¶9ÃA,C3´q&šŽŽ:>H8 .HáÉ0: M@§H’³Jh}< +)’¬ˆ%ˆ +6ê/•‡hs‚‘LÁØ0*倘>( )”P¦‚hðP DS(Áã!¡ª‘2J¡Øì£Ð€@û( ´ÇT@û(`¤,d”zaš’É44Ï°FÁKQHk‚ñxøh ¼ ’NH:š©˜JH Aâq¢0‹2!#‚L‹€7'Ðæ­BP°˜eHH.Š€/m Ë%´­¡£¤N$*P'‚ÊGƒ2]„xåºädµª“¨£¤=aTê.N¼dõI +BÍc7F61Š,l£Ò©£¤Š•ª“Z…d*lÑÒá|p,l|‰,D1‡g2 +9 ¸ .>/>™J„é]ÄÆÆÀqœ}Y„XCBW3M +‰OÎ44Ûq—’ødÍà ±$öâôIŠÂGÍc=L Of*›}PîܨSp2cmP”@*g…ðMʀ +¥ÁAT ±2¦ØE'²]:&^ž ÈÕâ\>>ž‹‹<—ŒÊ³¹hd!m$|Ò¹ªIB8€í"2m粚xy.(³…™V iAa-ECʅB¦3©àliÀ‹èAŸXQúT|j,ˆÒ˜†€ˆÌH=l¥Ú‚ŒE(ÈTN(y®pú8A|2.«K!Îf* +(" 1¡‘P¨!„¤t¤‚Y,™ 6òº8¨t,Ÿ +h³‰Le62óXÖÇ vRˆ“*¶Ú + ´E”L ô§,d*ꐩÑIÈ…ñ@ÛÇÁA›Ó‹ ´mPÊ|PÚ¸“º”8À +(m‰¡±°ÔfÀi×8ŸH`Z³ 7öã×9!tq]|õôNåÖOm^¨»éÐSÝáCý}gýä‡q]]ä— £þ‹ß5õ¿c~üm_OÅ挱ò~·wçÂ÷é¢ë[Ÿ»MýӏϺé/]=FOøúÞnrôÔüèNSáv'wï¾/ö¾ÇüþíûÇŸ.|û`ú‹ñ¹|ûê7ü÷¬2wC†ªºÉ/ÿ5u=ßßsñ)|N¹!»|MV37¾çؐ#³:è©nÿ6¿ïÂw›R_ú +ÝGPß{ ̌Þ/ö¾N÷®îQ]õu•!³Ó¸¾w|Íßå冿Ýÿú¬ÿŸë~_\M…žœ¹Ûðµ5ú{ԇ¼ï—÷3z;¿~«o߃/&ÂÍuøÔ~;yGuîågÏÿÏÔýÌÞßøïðùkdím֎£BÞ÷ïîêÿÎQalß䗫ï%ÌvuGeíoÍ|ïßGçÿ®ùéØ{ýýîÔøÜ6ïconåwû s5÷SõÿñƒNa÷:kÿ[î÷ ŸFææÍ~Èþ4£ïã^‡ªûûñAýæºo#ä|ÎûÎ Y?7ä‡1û=övÂ÷ÜÇëŸîsΆÝ{á[ש›ìƎªv»n¨PS=.÷óÎìuýîQ]ÃÖç¿ù®ÿ5Tv}ÿ~جٽϷÛýiwó§®6Œ¯ÏõõÇ|ñ®fFïÿ6çöcÇÏϯûý>ÿܗ:„ÿžÂø +ÿÆçÝwòj|ܺïßcV÷ïý½ngPy5Õ}]•!„ouõo*|ñqG†Žá‹ú t×}ÿqó>Ü×ïþ!'+³s|÷w/ƍOUfkÜþÿ|Ê +Ûó·_³¯?¿æÿ·»Ú¾©«íÍïÙ=¿|ØíP—Ýÿꧮûoyÿ;õåSþÔcÝ}WÓ¹nì÷tßS˜ýò±;3gûG]ïô_}‡ì®ýÁuVï·0>VøâSnë +Y]¾nøœ?U5BUÕç +BWΆî=Û×Å×÷b7³çÓÖ÷Ña;;+ó‹šì"?»oÃþæ¸ûúÞ~{g¾Lد•¾çê¶òs¶KØ0r+÷gCÊ÷#Ô×ýïNo¸Ï1½·;ó•ßW=Ÿë«ó}ìÎðm·¯FŽúúÅÍmšñõKÈùÙ¯õ=nø÷ƍûª¬ÕµÓ#¿_ïî]~ðq?ø¿:ïÿ½øÜá÷{?üç”ýý=}Ÿûtøbn„¹é1ßû{6=jÃ7~»öogÝåÝgçU_·nÃw«1úo>· 3ºM½§Û c2üÏtîq_»îóüççn2?;üøžºBÈ1½S»©ïýË÷ {××oý}túú¾ònÔn.Ãè¾Û¹ý„îÒG™üôºsw?Ǩ㦧¾m~™êÔácVèÒa¿¾·ú W]ú{ÑÅîæÛï÷ôùcøî?üÇÝ»ù"„ËNÝ?ßçˎ™ Æ\….vjfn§s¶Ëç}ì¿Oz³î;õgÏèžï­Çßá{të]S7:õÖÍô|êñgo]î·ººû¸îúT_Tú¼ÿšÓ“óý=Fè6Ÿ[ýµÓÏ÷ßïñsë*¿ŒúºÔoåÖd®ï5??gêc÷fMN§ÞÜO9£Fö|±cóƒo“ßkÏäNWü^{ò¾\Þ֍žì¢‹Ì­­ÞéXa»ø²3ýéòF}·œ¼ÌÍú¼]7=¦ëϹ3Æ|Í}Ñãnï{ѵ?݇ð—a|Ù±YªÆ~ Ÿ÷{×þ¶¾TªúºÊ ·ÛŒüîüòýjƅ +ŸçûUø6Ül‡ý½í]È"o3rCþlwî ³Õ³êޟ>÷vOq>÷ôÁd±kBw×äÏ}ã/ôÞ0á[Mm|Þuø¼sý©{Ç®sæ:ógGfÞ÷ٛEfò÷{]rvDžñ¹Ôçôø.s£»|ŽêS«¿°Ù¿ás±¾åßôøÜÅf{Õ·}?BߣºøüÛêTÝ÷•¹ßWYÕiGîè~L˜1úFýÞãÈ͙»Úw]B¯îÔ¿_ºÌߍíÙɽBïÁ!üÔMøþì¯÷­ÂÈýÙÉþéÔõ_w:ôŒìß Ó©ëjŒ +5#GÿÇîF}•ŸÃ¨í© ›õñ'§'|ú4½;9®ï·þ:|­þËP>;ŸªËø1÷¹³ËØÏÎ.ak·>¨êT!„ÙïÝ鿸ŸÿµÆ|Qù½ïìï-|ï|¯Ÿ®±ÝÝjÆmÝ¿©ûùê 9ŸaÔÖO§ÿÔÓ°Ÿ>}v÷ÌóŸëGÖ_MWíLÈû;ÛSËùŸ®sñuü·¯ùž!ÇèÿTß¿iõMMÛûü¨ûð5l¨ÿðcL} +_÷ÈWÓ9îÿSòÂÞ×ÿâr?ü§ïŸú¶õíûnßëËç¾õǞː—wߦ¿ŽÞÿKv±-PەÓÅþ÷W^è`ü}Ùïùf»¿·‹Óa¿äïš¬ïy„í/ªrwlùùžÃQû9Øÿ̏×æsÇôç~1˜Ì>W~ž;ù•Gýâk¨ëҗ3óagóz>föÏþ÷èίû½­ˆ¨æ+|ú^—SáS转ÜïcüØ1ßã¿›ûa´¨rju¿=º»ø/×?æÓW~þ{ªûOvÇíÎç#ÔÇíþ`|ŸÑ£B×Íï aÂç÷Îp™µ!Üonöá>gÈ*|åßstvßðEíw òÃnØî"»êÆôçï½²{ÜÜùÝû÷hgÔVÇÕ£ªïr™_÷C~ÈÐ=#ÿ&Ìß×Wã/ÇoSY!§{†Ï7>‡.6\߸ù6ìÇéÎ˹°#/?óÂÈÏü®þ^¿õ‡±òG~öLåç”áú?îæÿÜç߅Ð:åg¸™ìÐ9«Æ÷œ·™7¡æ§«ó*ôçœÿß½û±ã…7:fȯó5|½¯LOm˜9ºçãkåî÷­ÿ:½û—Ÿ‹¹—»×ÂÏßÝþv¸¾ü¿ Á¨„‘¨¤ÁPM£Œ¡@ƒ`,IŲ¹C"0“`(F60ÆÒXå8ã(Š‚R)¥ŒMÑûÈnŠ)l:üC³Ý–£˜Š|#ÉNP`ù2»˜G\§*àN /5Eñ§x:Ȍö3KÁ¦îÈ'í©Uå‹xؚˆ—â/GþÂüÁ¢©¢{2a§$2èTþI`†íBkZV:Õ@î üAbõâ\ùÈ/] .ÿfÐI6ª¤ÄЯCgìbð´xÌ0#Û‚ÃU¦ÃìàEޜ(½ štm\±ÍÅDRÜx峃¿3Ž¡I+Á"Mš>TTà1!16¡ù!¶>êæÜ]]¤\½Hð;)tpò~„ù£yà;j›@`ôK<t2ŸÐ5E?Dmâ ^b Û`¯%™ò×M©\«~Z4Óºl˜³¡/â›}3?i3@ã떺Rcžú¸!~ðR/¾´‡뜩M¾‹Óé܏‚5í³%'~¾Óø g –©Bj–›p¥?JèÀOî´|a| +4"jڕ­!kù“íCòĘ㑞þ\€ÐՈä ®+” NÚS=Ãaí^³q RW1d(ˆ8%E‰¨2Ÿ-ғa…­O +u¾ÔëœØD`Ü£#îh¶ÞG®ö¸¼2bsþrDg°F¢ˆœ÷cô1[1jLÍÍ58×bːÌLD7¶•% +Æå!ðùÓkç×Zv`T‹¤@0õ= 0ø¦¤Whæòp+³fƒ:®½}¢ž$ +)džûòÔàÆ=»Ì9ËÌt•ŠMˆLF…¾öâ5”™R9_ËRæýºË‚õÔ<.ˤ'+E$áá[;Á:D ¸åÀÈ-¹Ó9XþÈ¢>Mégt j#ÔFpÖ*Åb3ˆ(±œ3rr›É32í‘æ&’Fx[)ÝŽ÷v5Ok9#ôPC¸t\Á4&Ø&õ4µb%<rì]¦³˜‚9P&\ÇwPÁ¿„»Ûû:[gïxðŠ¥ßS¬›¥zvµù—]++¼™À‘‚®•'ØEvQæYãþœtRƒV\\"+ÞózM]ìhÇoéiêÄû»I„nIúÎ7.«Kñãï)Ç2¦‹” +¸HÖ‘X#ü8£UkyrȃulÜgÁaEÚÞá ACSh3ô“Ñ0.ú\ÈÕ݃WÇ÷I }Atgë(DŽnö{GZ“7‚(‡z$9éՆ@ΏØH®šŽØݎyNNßHtWa¦¶ë¼H©ü¤“õZa¥£ú³ÎÉjÇuNÆ +_¨a‚òùÀù>HâÏW´FÛªã2ًö4º¢±xKì£Ä>¨ÓÚá„>hø-atƒáÁ…Ô“”8lwƒ˜fêàFµÕÞ)ùE9ó‰³Â Ðiè¬ °וR#>_«ê纇`°ÃYה%c±Œ…ŽO²q1> ƒÔôD¢¦Öü2V7ó b´(ۘ¤O¼IH×ÏÙI€MýCˆÈYb2Ž¿_1èh‹¡ðxq[/ˆï†B÷c£ÓûîzÊ|(“oˆ۠Ñ.±ÁÑUN؃›b#ÐÌœˆL|z´s1dœ?~òé«•ŽUe“¥“à +?çݍ¢ ÃËO.Nc¬M+å-ÄO½“¦—[6t×ÊÃäúXZº¥ +‚s]u°*¯É(Bå3+‚TÝa L~;x–~͚«é4[} ý³¸N~|³±#~3gÞ;Ü"ÂÕ55 +šM²Èç*Î^ Û i6;mß),Ê4¸ ób µ|RÏÇbŒ¤`½Ïò?P^‰‘i™(‡np`Ĉ¨È™äIGg8]؃òÎȁ Ë"*$EHé–ĉáò<(ã´CJǀfm“%T×ÉWÛ'¬þìs“p{ ú1sÿ»P¾¬sIh)”½1h.ɽ–éyäÚ?'ÙIGcL±Ôe.zQòÇb÷ÊH:ÔímÞI`±äR{Úe:/¡sç¨%R›lÙíJ²(OìŽÇT­2Ö°Ò@çkKQyl.9œ®š‚¯|kKv©‚‚è0|:Í:¸¼ia‹m&íߥl Mz£`å•-ã)ãcXB²P§ÝP¿S(M¸Ös„2Ä@Èԕڴ¼ f°qÁ•$’֌I9è~¥I:å§þ&¹Å¼üˆŒ7»HÞgªKRC2áX‰²AŽ·™<ђjÂæӕ‡˜´‚»AµÐ{€P÷=l’Á¹M¾Hû¦To,¶ðjôÀ)×2æñÎöûˆˆqàÔ.0čaýwÌ3RW“æ2i8@ýäŽç<•Q³s.ʳ×R»#Mó[$áèýj +í¶ì($tÁH0gÐ yE vCÔe£Š2Û¦'C—{”Îx»A¯Q«wvFœ¯Ø“è“ NžoŒ<è?ǹN”Žài¥¸?ùðð3Ùàú5^I/f“èªU@Ýö¸P®vPÓüù2[8…‚8„Ø1ᤠ+Ü2FDNCH– C/¤ÁCh€”H|:½hm©|"NÌܜ5ò9”#]í:E!ݘ6š2)œ]¦tDO\1Q³Ç4^ž|ÔGƒ#9™üB÷Ð^J‹Ù µPâÀFùëcŒs·sy™:­Ip¯2${PY´gá1>Ù4‚atõEM›]ج=8ɛE'!°–ø|‘3–ÀãL? S*ñÏ8è$Q⎔1moúò[g¬jÃÎÓ©uÊ⑨ÛÇ cëÔV­D'‡3Øàw¸¨ê•·27trÂ¥Ý[²€V MÀä Tu©ý•q õ' ÁèžTLHҏ.Yr’Râ»ù”ŸK¬ÓU=sË,¯H™e¾ram ȲZnÞ9C„Ë+í8†-Ü!L‹¬ZˆSn…®Þ‚¥j*Ӑsd}å˜ìè¬Ë`YÂýëv@p›ŒÉ¹[ðtÐqvÐd¤|Þ`àöàîè.ŒR~(ëÿeZô‘o`€@Ɖ'Ò³k §u`&4ä¥t—°«ͧ]rƒûŒÎ;é ŠäRºégfê!EìÏs%3|«Àç؎" ©½§‰NyüH½¿ÂÁÁºgYjí”%ëõa°¼o™AàôNƒ’v"9åÂβN]ª‡R1XQ*)ègí7²'ecϐ^ì¹›,:îê@éÔåÑYÙ°÷õXª‡cHՒ93ÑDã‚)ŽÜŒx±j™¹Wwp«îöxݹ8;ñËÿ\ š**nÏ¥ÎjGžÓÁ( v–„æ\L?›Ì†å•ç2ÐL d;ƒÂNýø?òÓ.@X$˜%ÌçÂ_å&å\ÖuÿûÆÐêR‘$ œá¶a_)…çÒ[­q‚¸„Âb|÷zeˆž’÷±› *5'ÕGbfˆ¶ÜæŽnASÈN†n˜¹Ðœ‹²Òi˜‰ÌN„o¼«…¹ 'æ\Jû*ß¡ ˜RçTbi€t)>¸Í0—èR?Ï1¡ê Ëú/rY±›‘1c§sÝÎ? 9dn 7E¯¿ÌcÌ;ùˆ.€›={Ÿ DȈ/Ž‡íÎå=Næ¬.Içr’s(1Ä)96ÔG$Á0¥v1ø ÍñB-¸¾‰iæŠ›Ä`.’%Ìð§½C<¥Ú·”h.ÿžÙ§êåf.Ð9XØn‚7»IȄ¡ º3j%L¯ö¦ìü;eÜr´×,oþ­Ì¹`üi+§¦õ…ç2H˟XŸS .æD )Œ 3Ðö¹ØûÇ[;~ò»sûùœæ§sÙÿ²-èɌïåÞ"ås›ftJI‹Û¯•ô1çàåûa>ìWÖBÊ:ágÁ.dçû´N?ÍŽ¤;‚AÅÏ=RÓ '­Ó$Ñ;ZÆuzt=p¦BO¹uÆ,$%˜*n4ê‚FÀ)ßL6þ#o ßÍl¢'XL[·vÏãâ›(0@n€yÂK-„HÇï"hE@Ã0Uä`Rå%Fè՚I&L‚ŸcH l +<¡‡k"+XÄlÓ̗hÕ"¯ eç?‹…¿€À¬ù2DìÝ +Þáj˜ÞT,B Žw~åÃPNÞ°Áó»ÕÇØü¼¤ÔxäÌ8÷ý„³/…š¨+àãB_ê8Y¿¸w +ÈÈ xf!J᪕/ò+ÞÒwç‡1Φáv ZÄq–þf;䚺=iU‹-~ÁÂø Ö6‹œÒ™Ö•žÄ°b¡ÂL$¤LK{Ö;ڝ^ÿ÷œf^ eì E“`êÈòË-8~è;BT䌁®á= Ò­?6Žk™›’­Èüv‘ÙIʉÒ8„ °3d*Œ)ÜuÙï«’Må«L…ZpŽSÏop¾ ?Eh¾ÏUÿ!¯s]÷ÞÄÕºëz ó±vY¸§›ü`#Ý´^ßj•’HЉ_ä’ìÑD3ÁBKp0=t’mÚhMµu\ËõK6Úµ­NŠ‘ðs ½ô!«ÉÜÖê®rkÜh*Èc™c͋_àØÏØ»VUì@ò¿¤cÃ@j2mțŒÑ•#2—D³yíq;#f×¹5÷ü¦«4ìÂ/َ·­fÄ.ümª‘r•§/qD„3ç£;Ñ_6Õ¿Mˆ­Ø<ÐZ¢AܸË*0žfL„]ëü4Zº?ŸÖÀ¥û_V}ëBҞO]Wà۔iDSE³’+j#LðhGÖ¼ñ;U0è éV ~ê´+îóôtgabž `v7×Máo $žb#J,iӒ͞&‘¦³À¹­ÄCÄX9pil´¾JŠQFSzï^6™ÜíIB[l4f9O,šãi—8,ÒtZŽn ¸EX˜°UmJå; H¥´=|"á,ñ2Vn‰Fqä¿VÞ®Ó·ìèÝ­[+t˜Ô!'*UA2*pgfp/“ʲ¯òçÇ]õú6^ôû›Iæ7¦¢?…Ç  ñô͵D½€®ÝZx¢;Ãp'·aÀv˄‰ÄLI>¸k6OQ^øSÍ^6o™¥D²L€Í¥šÞ)ÇÀe‡Ôn™Wñ֞Ä\ +'©à\ø©±"7-íOÛu‰¤FÁ›±µ þƒrÍ5PÙIU7°ã4ˍ¸ùᤗÉq\MLx ªlÍÒõÍqÒCÛ9:ÔÀ õ’aR®Qe]AfFUG@¾j8·5bf¢x5%b[…{ÅWÚþ*f^¥+³ô7Èá¾Õ¬p"°VãSÇèÕT|=TñÌ=In´ap-ü{ÁY&(tœ€‡C®G#)~-aGÎÈH[è.å6 ØrʘCD§uÒ!²û%°¡‚´ßÂ㧠“ÙO™œ³°®bTG‰½ÈU…¡ÊZf^OX¸9é­IøÙ"9o}7Å܅«Ò*üÑ`ô[†ã¦7}$¿øÒcƒ¨ë‚‰øîa·dÀöË+"6èsfHú3ƒ[« Á;§¦3!…ÂHW›Öò ¸Á/z_Q¾N™¥Ò*híJRÀ‡oP#‹ÍGB ›%vª¡/ð-„»¾?cŠŽÈ71¦œÅõ|µŠè|ÃüÈ¢VÅÐævºÉ¨½±Ü<Ô¤…®§Ë±.Ù9"hþ; +òRÁ8bšÙ©…õáò¼®‘u_' ¹…etø0’Áf øS¦H5ҘËãXé:Lý>8½+“×Fƽ|eaV%5aL.4õ·–¹jâövN'qP¹4”IÝöSy´O~Ž`è£IQ•Ì*u$` 'þê×uÄlšl2žø¤~Z!””4ÂÄtA&¨Ñl²÷Ê2b€ÚœBßv[Ùi‘ûã6ɺG#ð +*E)òøþÿ»pÆŠ $šC7š%3‰Ä¾4 ÜŽ !àýb +ήp‰ÎÖ[Þ¥1/i9¶S¬@ê<Ê$cš–m÷q»BßÏ;cÂ&‡ôéƒÀ ”ÛÅ%=!4ÀÄ}Ð&&'5&ÛF +Xü3êôšjaTÚveA +ŠÊ”Õ] +x%öAæÏÄ[ïˆµ‰¶dl¿Jo¯v‡mr§µvŸÿ®ûì¸Øü›«Ù¹¥œþ¨±rs(!íÖÜk…DBc¦=æÍJ)# Úªáonôü“"ý´– ÒmÍIZnô˜R· ‚0á°ò´ºY|àTÔô+Ý‘÷34éޒØMXf²ôŠþ‚ Q¶X“ÔøÓ¸ ï>“Ž‡Ýû//`ÿΕ¼)Sw÷"Ku²Ú}„Qºó\T§8|b°‘Æ\!á"®{÷èâÓ:w˜½v2Ë4²5víÉ-ãÑMVŸØÑ `ˆ…?³ûôÿV¬š*P5|änÓyá}¥ooâi<è( µ`MCˆ=_¬-IÙCŒ55SùlÒÆÛÎG zöLVÕ_QžW4 Pÿa•ŸøÁ¢´Ó Њu%}ï,o‰ 2Ý°ÉÔ×`[Xw}˜´îÊ ü` FgÛ%a +£‹2f7ŸíôVÉOwôN;  ąº3`^ -’‹fwu€¥íuáUŒ%ùxùý«("EÄÑcY¦ßݚŽbN1«;hI ¬±l4\ïöz2±ÐJKâ@plÈëð¦f,t3ɗ´Rs–&\ؼÞŽ‘'Ä›bx¾*.dz‡5¥UÙtÙDûÕùtb)B vH©ž€€ÆUZљñrZEv~Ãý̜dà·Ò +òÂÊØ?mfAۛt5*²ùþ͋œƒHϽâ®M0k–×z N“Ê ›@ô—éStÊúr c…Á9þ÷1‰E½„IÉuG$LÑÏÌõòw”Wˆ‘#î "X Tf}=‘ÂƳÎfl¾-C/«lçÊ(E|¬råWÜkƒŠëM…8ÖSšv0‹×&}¸¬Jö ñ?n4͊Yfú&ñ0ôؐ)³/Ô=…†œü– §YTÈþb½.¼„œIN¨'ÖÆ!–ãùˆáÞ·}Úímʈ¹¶=…U™DhöR”2-ç¼5¿r|ÁŠŒøáÊÚU‰öf쮼M0…“xëpmà*€±ðD_ôêegï ŒXŸ ²b€œ9Úy*Á–¨!èƒ[/®Xõœ Uªsvs'1/­N݂o€dñé¯<ݍ1§„ŠÂµ”ž!¹ 6¤I ì îi…¢­2”æÄnϳ¾ o©ºv)¸Ãܺ¦VæÍàMÌ¹Ã(ØhL:E¥5N]7Ñ" ãÓ%þ+«‹»ÙZAnÔ^yéÕMW07 TRÔ?kù°Ÿ°éTÝ ½ÃÏïoǦø—ŽÈ=  ÜtM䀓¸€x­õ¥ÌFù%î$ˆRɕ^x$œV_qܱ¬óçÎÚØÀïÞÛ@‡å“Ò0 »E 7+¡K#3WŒyŒÒ»2Ÿ?ÑàeYyùÉŇ„ü¨ÄÔXþ£"RÛâ£m'EJ€\ˆU3•¢ ªXPÛJ±$ˆùÑl܏I(T`¸­€!o«•¿œ¯<ÚµP§Ž—ŽÞëDv —áº5y6|¥t(<“ó¸ÞÓøVVW·Äü€‘O䚍ÒðÓO.Ù4åƵ‹Ó3B.€ýÓL(bçýæ_eٚ¤|f¢ë U€“ìDû“¾"RŠ8j™o +ÑëV8rfŠ%,IÁÊá®9b–±^ZEÓø=»„Ùkbäé¡-‹…@Ś’ª±ÖºY)u©ªvuÝVbѾnÜð²=œ£‚Xf{¥Ghö_«äöX{µ˜w/)¤ò#XRÍÁærLv?ãó2&]žZI0¶6YNÜ6“înð‡Ml cg]#: L”£‚ÁeN #«D椒ÝýjÉ ÞƋ&ºÃŠ­Û|;.µµáÛÔÉCkHa£4ÅÖ>UÅDzuG8»n/Fœi&€ÜçCuCÕ¼Oöb0N ôIËP‰­ –U[_:‰½Œ‘–† šö¨ü>+=–æ Iýpsrä‚Ò•ŠëÈ圁,ð¡Ð<ÍÒþ»X˜"ˇ&ȏ¥éDï…_(šÄÖ-„† øscÃÜW4¡ê¡âüS¯É[Tý[S,ƒÜz¢(Ú´ܾ3ùÈcµgýŽð¢ +Ä šª®ÙÅ´$‡é"Œ Kp1wäâ›p¢'ÏnHl×ÚYfÑzùH5ìLû áÜ ØÜ?ï9eF]Ùe(‰åo/ÌŸä|ŽºR¡Å/Í[˜‹%â•~*[`WjÏÕ6O0zÕV 9UĐÑÛ°¶sS\–*C¡– +´™&Çњ®ÈÅ'QcM:^Lb/ëM¿»—Óàe?âÌüaî •²ëú,+‡¦*xs`ˆ§"¾üçEì´ôýiA.a–ô¦sž¹¬š€_è«ø¥EN"ÒôO&'(—x0;Ú#+ö"A["‡|ÞÐQìæåÓÇj—èkÿ±E ›ÉêÌc}\ç^j@º§—sñ!$)¹«›Pq]íQ¸iGТ&ºƒŒ± +EÃìE×jï?$=¾dZ´¬b-Ÿ`(pYq5ȂQèhMGâÜr²œ­ud¿x¯‹ç)Óhub³‡ù.¿ôc 9ÈSkó6 ¨,Ã2“G¿%ºÌFâË#²›B®Sÿ™v#N(` ÀFNåËZzÔ³R~bvµÊdóò@G~,¿'%3=N‰š ZÿÂ6nÊ)ÙzøÑ©€+û,bÆÉ©êí[u#éTè2…~Kp–gÒCÛMYMì ©Ã ØÌÎüæ _¶D©×šà㔠ß6’¹"©3µÛL\Õ"qAü©ã†lÞèØÇÂÒ¥ûJ£å)ÕÁ{¶– •Æù Q!,­ø·ÑÔoë/Ço°Ž¢T yÔDžÈß-Ä܆NAˆÖK+È6¦×])DÑ ™òL{ÌÓÌ¥ÆLåJ +Mæ/Ÿ±?ñëû;’q=ö²š΄=ŒãBœåž‘¹Î·ƒÖÔÉŠÛvŸ»#$øRN Á.ec-‹ã’lwœð >Lka$ªhv’HŠ]»)Þ¨ªýàHÔ o5³èŠÑ`FF³5] +˜ètè@2øZ“±6Ÿu¿NǶ§»>S&.²åY‡™$BkýŠÊBp |µ¼P9£»ýˆ¨+>œcŽ/ÿâWpÝí9H¤PãD +¯ò,X]$Ìڜ‹G]Ðøígf‚1º“v¦<-nÊ)'\î¥U”+®{h–@Ý2­Í<€…¶Xö¸ÎÍøœB¾ Š!‚gŽÔØ$ãb²òÀÍN,¼1¯üЁTdób­ˆÜäµù2‹×…Ý{õt R—ÎD¦F¼Ï S—\Öê;¨·*8VóDù_­Sõ,"¾ùÎJž³|Ï0»ûÙXZ+z +Œ‘­ü€ªÆ¤Su½M‰Åª” ¶…(4XЉ1Œ™úÙ4Í®¸âß-–VpÖoaEÔÖ5­Pwd}ÚÁ„;qÝoÖ= +³C¥3šïîïêB¦|\ØÅä4ÿ +2¨X-%Ç[S~½þÛ8ޒÝMÕy214“pçðþ~÷r¼W’Ò¼Ax¼!Þì™evƒÌY÷o€³=Þp?L†ûí ï6¼u–r¯+ñ¢ÁŒ’1Þl§Ä¾H½ã­miý17{ _àóðêgS‚J·øé'qΆÇpljš­9|¶\»4maÌ(xàX/ç>ž8)_°{9O3¨“/Ì_ép´Þi*‹a—;]†;ꨒW¾õÁÁP¶U!÷)î?ÌM9 L¶üѐƒGæìg’]ÆPTj„î#€sÆÀlÏóƒ™ +ö[=bKëÁpw›‚ ­Î\Œ¾©ç¦ñ·N¨]38c/™#©ƒÖ+…úö«1—ƒ]ø¨þK\ðíýâ#Ó´'ÃâALo½¬þQC ±…)vVíªà¾(âæ€9æO­©n?À“ÜèUÄ#"°3ŽFÄ;q}…3wÌg¸P·×X1â}«ù-¿ïk÷¸¼‰8§ä /Dþì÷YÈsY@âõ­zÑR*z-î&¯DžkˆÒquˆÑÖ/w é—~œc¹ª—}1«ºáë4ª~?ü´ñ$}Õ!dHŒC$^ì 9J¯9–%>q«ðeyÕGfd€G”œ_—.’0±qŒT"TRþ™S¦74áyÞ +( +oé ~@t€«Òúq]LŸ&†Õ=¡†±V9ŽÑ§Šç4]ֆOꐪ"ÉÎZ‡œ…÷ñcӂ‰«$(ó“NbºriÀfªÈ0ªèd•Ñï7¾æ¿M@ÖßÌÂ6¡¾”6¸ +È4;hÑG՟[“¥µº‡š“:¡ÚW éR^Œëu)p¬ÕhBžšåÉ-ÓԇΡãã“ùU2;ѦkgÙ¾Ùͳ.›(•,.m™2¼:.Ù¼$“Ù9U¹š¤>àsQ¿ß¶”w?~ 'nÆ܈¯Ð2 © þú݁Š±Øá/ˆï~+¡F9¹Ên¼SzEÉÊlø†Ï‘ÈTFX…Ýl ïw±‰s‡¹‚Ïk=Ÿþ^2Þ`L®œ·<÷y+Ìs՘$,Z™ÒqÌVq·:¾,ñбI*ÄÝ?ixYgßÛµ¶©ggŸ¸¢Œ»Ìcb‚Ü˱BÏï;êÐuŠç òú"`ʧñIß$Kˆz[µ¼ì Ai<¾DpìtnlUI@uý`›µ0ÿ+åÅ:‘y]e¬-àCÓ¶yNnå”f.ø" †;nÄ/|­à—yªY2^Èÿdé"®‘tä®Xòt3F;¢JÀM„M£tþãxì•=Šî흣ûì¾o~ÖQ"Â1ü‚v§º8n#îÿ|Fúš/eeLúþn Æg)°é”ÚGmÊ +YÅÆ —o@±˜IښýÌ`ɹM +àG +ƒrk΁£Ó€Í›ÂXùÝ]5ùÐÍÒ(¼§©¦ŒjG¼E¡Ú ,[crä–Uô/Ä4 ²gãÛózÅÝìNÕ)ø„†FÝBöÑ+¬ §Ù²U<)s$îþ;ÏB÷Ô§îfàk]3Aª¢‚€Õ'®Õu¾ß ÷¼·g%1ð1Zññ-Ïø”Ô›¶xûv¡eˆéE3H0F·^‚0^= `³¢ÜTƒú‰9N©#rhö¿¶ìµÞ ¬ >âªäsùwÇÃ&ÿëDA€ÔÚÔ,RÑýÇÕ1• ‚ø®ýŸr~BºnUXŽïí¯ù‰€Êœå/¸«-_[¡¸nø|ÙX±±Àm@lRLwYÂU@ÊË։¸©H‰ãXF<‘}/=Òñ´-¦¹í¦xòåC¿?ˆœâÉC+ä1ˆ'ÿî㗓MA<…4Nj…R<Syr2—O®p`;l û¥x +EÌhÄç.ÐMæíÕa †ç +® øÂÝйßoÖu%‚ß«G`þ¡6Ãk`•ojìFՁÎ2Í ÅlGýŠMEàRº3iʃ1Õ÷½ +ͪ£µHŽ ñÜ/I8ýc“Çd¶ë,µuÔޙÕ"4o5±vªÌ}¯ß¿N²Á©V=^˜ppI(4³&a¿äÖ³Ý=‡Y¨×®‹ Ô1…ªÃOÂh¹w›hBSª³¾nb3¸’C6Å$O5€ÕÂk ¾Œ$P¬…ø ߥ—˜…™¬ˆ#P<2[ò¢K¤çZ€8„%?N#ÙûÔìñ8r~3¥C-itðlñ#²£ŸÆôIFfSóY±˜ÿYòH±51Dv¯èÔã)9?ÔÕ¼Àеۮ¢nÝ*Æ¥åµéüð»WÆ程®A^„#Ü=ˆ¨!-O†¼y$’ÀᏧ$I€Å།§U‡°ýxºùß.‹Ð -óM’Ç¥Þ/i=O{° áKh'i<í0 ]§ë‘˜U$&ä•{OÿÍ „È€é¼iÃDÍðÕ&9ƒ´?  XÌã>~=fµ÷Ý﷘¢ô¡àAüŒxžHvêWh/Àb)ê´âèÞiŠ|C†{(AD¾Bäeº}ŒKîó4øF;¥©8!ÉK[¹[:#rՀ±/>cøÌ@¿9ò}YE> ÉÑ?ΓUoEȞ`¬ïÓZGX):àƒ²l -òv’ÍÞûdZ™ºõGýV3f7’lböýK‘Øl´Ì 2"&ë==jg ÂV•9Ÿ#GŠµÚà†æu÷fT•ëÂݗ©kP엳vi@Þ?[Ò/†ÌÞNåùάÔ1)‚³s†‚w嚁l×Y)ã΄5ñiP~Þ(”d‘ÙgŒ¶61ð¶>p¬Á7@Z³ô?ìÇéVÓ +°+õLG֥̬^ä€[úˆÄgȞ†m^Ö°^MU Çî°²ÇÑΐòdÓ°~c|˜1 "ÖʧBÇkŠÞ#W¶·‚ò0ñ6v֐ݒ˜Á³ŒÔ €[s*ÚY¶vÙdZ¼éÒ:»Kc‡ª!š)O^Wòt{Ü_¶Ÿû~Wí^Á"JúÐàÔjpª°F?¦Äõf·ðÎ WˆLÍèÜDJm}›°¹I“°¶Á:@ðñs×Ž5ÈÑ|?,É[‹T?Êob„P¯1è©RõÐ!b–Ü<3 ^ûpˆç21ÍՂz…~ž{zaW.L‹Ûš«õŸ¦‰<ԐêÕP`´AäJ*õòp%_3ÕrsÌXzïôÜ'ž¬/õ +j!ۃ`·µ$ˆåZD°ÑA±s®Ã¦‚§h+¼†¹ÎV*ƅm۞­cBßïñqÅýegcQ!<ËëêÀ¿¬|Â|ùkù3jó>ä¯iq¼úÖU×9ÉO”1**5êñɞYA‹“ÐÓ«äšXf­‘ǶѿvÝcAžöw  ªÜ*b8ʽšþÍà0L·@Xœ/IÅ끬e@E‰[±céµî„Ø2)¶ÄY„9àÛæބbÜQֈò¾a+f>…™†­À"bï›4WŒÿµCü効NAê¦Ä¥`Ò0·Õ$E_–uÒq‹zt,I_*»q…5 18?݊¼Ä Ë5õW1+ˆGDnÔjÝÖÜ4 à—l;$áýÙó]E^sxç.ö…ûÙæ.¢DIõ "2ëWèš0ÿ†Á8À£±à*ðÜãrQsýˆÿèõ`‚n3O®^$›yvîvMáñê ë뿳QõŽ»™yÖ-­.–U/kϟ÷¹z­/þ#U/ÖnzLQ&²!º às=Ы7‘à%¡µ´ªW{V蘭z%õpõêµB:Ö/aù![ªz•²3®^0œÛRõV´Žâ>ÿåU½Wryâeçø°¨z_s8.Ï0s¸§Ç"`¯;ND´ ËhÆ\{ÀhÔ·ø‚ïáãX4{^ý!μÉ¬óåßR¼D Äß[:Ú"{%@9”U|,‹×Ú+{Ÿ½2z˜A©¾0â× ñ>|¾’4»É"ïdw¤mÍ.Öµ%O8Cfýí†ÓnôÒ£x“ÙMÓ &l™#·âÒ¯wK–ÎõnÒã…].§ñÉø”àítÂiï_$·‰Rò°¢4 èß® (|ù.Àr)¾Ët‡KÞ"lt†ãjš¶å]áq"¡yh›F(…"䡳ùŒo3Š" ¬—oÀ-¬xÉsãÆÒD?‹e¾¡(ZÁîà®yZý+£¾Õ¹Í¼ýcáÙÏûõ^¼ˆúæü¡vÕúÄş°¿¦q&R:{0K ÒNñîÓâ»[Íúf¿¡æ%pÜ B®äy¶ñ6ÚÄY…¿„ýœÑÝ!tþS˜½»c´¼cKÔ†fÄ "“gçøÅ»ÌfOàþ”{Y f>¼Zυ§¿ôîB­åŒšHã]ñÌ°+Kšùa­/-2Úòîvâ‡Ü33Í l@Ø«ýÌ%cÉúÒÖyl¨wW1Ñ3퉴x7³²`™#^„§¿RYC†ô»Ì¾éŽþ“kàÝeÛÄAŸá&’UÀúú”Ùͧ%)i&•šCÝî’ß#]Hmw'TmtLñ¼bz:𥇫ëâBßÂWIƒk×êÍ3šùݽ,>QzkŠÓ‹·CøÝoÝW º\[™ã•s–‰º"·Rf œ¬Í¹ê1uýÔØ]#œ[¿wke½^ý?ÏƲ«Ü¸™ö XÝ0¦äí÷ŒÅÅ–îcã7Ó Èãõ*4´sš\S´°Ñ"õÌbåf½”•°¦|ÚJ5¢¯  \kM'¥ejříÚËᾕ𤋮Ñ<·ƒ‚eY€´ü‰—'Ë2¤¸Åöû¢à! 68zépߘhÐf‹ W)ôº…Ÿ<Ãµ‚zÝäJJŠe/á;úè±ï쥙ñ‚'’†FÎUhÙ¸Mà}MY +æ ð Ƌ?²dàÄ/l Ԝ Àfb8o +[XÌ߾ט¬KååÒmm‰÷™V‰…SkG;\2zÝFSZ¯äk¿[Ž‹¸«PÚF¬Ëö‰–pÅŽÂñ“Þ{+Ô0âÿ-ª#*Žµ‘vÞ;cvu„…úºëíèÀ”´~gyœ2n»ü]µjM•³t٘ˆ”–,,`wµŸv×#–»>¸ö€RdU˜gCÑÐc‹¹/-×Tûå ¹°ÒTˆ34 ž¶Ió;À 7 Oú¬Ž‘ì°°qE)҂•ÇQ5[£S£Ðۄ½dx•=¦o‰ ܝ†–òžCoÁç" çÞÔ CôÐՐÉCuÛؘòŒ(ŒöbÏBÃ$7h´±¬¤‰ÜÜõÆè o7;a ýgßê +ÊÞ%6ƒ! +ˆœeڇ@ÌEŠ›òè~¶ ÀyÑMQKV&Gèö!gôùrȒnæ„êQÇ<Ö- óž¤¿áèRÝåÝ¢£9Ž.ö¹†'$苍Ј—Cb 9ëËTtëY%ÿÌa<ºÜ6a¦í趣r³A°õUt7g®ùÓM•©Q["–Lè?¦±à_¿©¿¡<8¼·è½øÇÉÒD-£»ü:1žÁ˜ ïE“ÔDÎÀð÷ú€T)°t­x¤/( H¡2ãç"·âëPÅì^nÄ·à†‹’¼U–v€½÷Ó^\”xÕ ‹ç›É´BCðÊ#¢œ"gȝ,c«;ÜQ¡B߃‚Iÿ†žlögLd{T‘3pÂVù[rZ¤cB¥RYYî:rüòDùlh…˜°€[R‹4¾/EïùrË*J¼]B*rDj‘I4%û-ƒÙBÀR:³¤Vt¬ã*‡4žÏû‘ou?iOÑ߁=ýȯæ}Ì^là;ÿt ¢Ù 8Õ âY™.ñº¹¢{¾t91Ó=-ø÷¦Nu†3&ûk×^Ó ä¥4¤S2]\J¥•Ñt¥ë»Ât—Þ´O •†é¢ƒ„r­rŕîÐ$¦ûËKc@6ïH€aºû¨äsò;Ìm™é:˜‰¢\·O0Ö2p}w0ËòDë౐8ð(fÁÊðY¿Ycj½ëÊè~p½z?‚?ÃI^(B²Î¾DyÕ9ßoÄÊq}(*Bϱ£UVƒuÈ{ºH-á[e(¡§¬²R;Öp­¼õpr-ÍÈ9® -˜L©†•;CŽ“då*Cñ|ƒ4œ¡;o`iaÙ²âÊdKƒ¾4Y(K¯ì•MµdÉY4+ t`'fÍt«;ÃW>hÿ~˜®ùI«)Jtåù,…f= 4c˜ŒÖ…1sæTñPn‰ÀnXdªžê++²•$^ÞJÒÖ¡WãòZÒPZŒsHjóÙ Fi= +Ÿ´ðŽù)À rÁr™+a +ñg>^¼&G˦Á˜¨ÑqAOG¬ïzĘx¬KÏú³‰lzÅû!$ä*¡¾³õµéwӂÏ0+ŒÊØèÏaªñœ] §·g;Ë1œ%²ÝÚ(Dt s°…pa©’ò•¨TãWÁ}KÝÀwQ@¤5m¯TܕYæÈÔó.ةԜ.V +g,je±þ×àe¤0~-žtøj3J²G^…›¡äT€Ïí{`|D¤ÛYØ98SØ “çS|BLGv5fþæ)48GLÜÂá€éäÒa4jXU!@«Þø½×éš_PYCÔ>8-¹K=tæù⻝¦¹ó{7êض/qÃT˜S÷µW õ¶^QJÞKtE]ÛFŠóŽ‘¶)tï¦ó¹Ú`9íÆÿýÆæ”ßÂÿ<ù_ X•JpS¿èuJìcÃÓ0c±¬ñ#ÆjitË´Áð1¥·Î-nï”ûÏÌîŽò÷¯ RÁâ­år:ö>‹7Ú^빎`ÿF<õ[ٌL7àu?•vðԉ‚ÂuæÝm…±0ÃØ2¥1ÃƢРֆ@ºÂðGÀݙ=XMVv £¡V¯„N€ÙiÛÀìەZkã;OžpúÌ(gH±T²ÖW;a?Fg35‹~Åö9s+ÿò‘C£®9ÐÄAåÆd-^’½¾„YÝád&6§ç#Þ£Çâú€«Žœ5OÀÂ3mIlM’W–¼GM6lž (3G\ÜJÄ<ý÷ Ù<\˜U€h‘ýˇO…œA9dD¥Acbe&†+§\°|íy¿ íµrLeù¤xþZ¦šñGÓ©ÀçÏ«£M2Äu äÏ ˜:ÈHŽ´ö÷g ó•E‡¥:Z +Io^—T°{³G…úqþ[}ôßxyæŠ0ÇMج(ÿØ’æ5#†<É Mâ׫ü‰/ ´.X'û^9ó4ãeՂ§ÓœFw±ËH%0¯‚A±«Aé.| +Åx22=!v¥[ª5'Y) »S; ©–VýÌ&3Ç,@-Xpk"5n_Ÿ³ûé:ؑ…\ØkO²ÞÁSÀ˜×§,œ6Jícwê-—ÞšÆɈÑTí]ƲY½']0qÛÃabN3l&¯ cmùƒò6V‹ÞÏê6¬T áäöŸiÆû»)u0’b®xb4ùÖùO‰Õ\@Ç1Ö7Ñ>=Ë/ðÃÀ„I»®…CYÆkO{÷ãœz³ +¢éÂýɋLrKÊÝq<˜8”Ł'òˆ®š}úÎpÑý óœpx¤8æe$“Œ ¶e¹›ÖÀßcAë»ÔnE_Ý<âiáz¹~ŒÄcÞ2C|ß*’a!ü'ÿFXUóu2Î6L×%>[³ "‹Bx´Ò–ÉfêœDã{ÅÔ¨•¿ø’¥7¤-ð]¡Æ`Çަ鞩/åGõ?6W°á²ÿ8MæâëŸ%×À04ÕÖÏQ¯–`Dßÿ;ì?•‡Ìîã­}/S¯;©;°à¾î( = ¨h‰·rÆXsyªQ˶ÁèÛ3!|=Ãâô]qO<ò8Ÿá‹X¬«˜7eú=™ˆô-\{O”5ºâÉUŠNX)CÐDnÿŸ'8 +?Úôzüd6rWöÞ9±%î9Ñ# ¡N•™¹:¾ß^±…üq¬§™¿E:úؽ HûsÑ#˜E· ñ‰ÓÆ|ÊÒKß3W5•;_§o£‰ö†6„²ç­Çì,¾bÕ%®OÀ"mlä§ë"./O? IÞ!ùmKh…ŠxÇñBcëºz|Û͘8ž*]ç˜6þîìÒ +›¼ð•&óSС?3v¿DOTk)Õ¬OžZwñ TÈd\­M;"ûå{tæªÆ(—gŒWT&°/Xè¤ï=a(“p<åp*1åîéW4^ȚÖø0?Ê;´Z~]Ú5J͓ñ8àœ¬%Ñ:!ù¡ŠÉ±¸Ëe¯,&2E)²¼›pók—cÞë㒹z(Z=•«8Â[qZøܟ•TtíºÄôò¬4þM»~—ú-g=GËM«’'·s‚¹¦%iÜKgîFQšÊ§<*6m¢"ôÙO(-ÑP…ËÈ£'›,z~#×tÊ>"„µ`I,¿·öŽŠUe¦$Ô' ýã¨ÿK'‰Z¸^ÿ•Øei"µ~¤Õ(¢êšíf8ÝÉßÒŒj«cYº0 ›n¡ÒI¾n!r£4£êW8ÁT]Tõ)V~5®A=$| V`j½š¿i)$߯önñ)[TØD@ŒfU(å¢üâúÞfhʁ„TëÚD7µh€3/ò|#Ç-¥RŠü¯®š›ÈˆF²VB¯”¤&=(¦_‘Â6@‡燓(RèȓÍÔQ‰$šÑr·ºr±]Rÿ YMހ2õÖ¡^µÜÏ·¯V€MàÓkÏk<©y1”q`.[0š*´ m…F(Xʲg¯h +µ¦¶j“…ᬓѫ2(np*Ѝ† iCà‰N úa¨Á<ă“J,»Ú’LËàÌYéòd.R«sÒ„†)IÏöå&dHýr;¶{½jtÖr¸ýÉMÓ×h,ÿ=™¥ùú-B½¨ÞÎdšt¨5Z¶{œ2õˎÎ8f\îv«“ûÊÜÚkføî°å˜Ù  m?d®D*ž™çLÌÈ÷Û`Õ'ٟ›(K4|îéþÔàSƶ„àŽ@­ŠL옔°ÈÄ}… +‰JËIâî­[œ‘îàaõü`jÔ¿XG4 G–j ‰Ä罒±,.|N"6U ]Ʉ²Á„´]VPŠoÌ´%šÔ3²æ;Gv)4o2}¶ $RîE²áÃU®¨ºæ˜ÆìhbJKG¾½e}…w»p͵¸9"fCÈè®ñ9mgQý '~T¼PùÞ,Dȇ0=„‚µï¸ÕaéŸR3™ª"iÆP÷¨“KƓüd/ðоDhzý8õ.ÿ`¦-Q¨vNquç¢Dt²8{OY#ˆà,-‹DC«0ô ÛÜ8e¹/4ÃZy¦Aþ5«ØFÙTØfƒ»ˆ[’Ë#ûÓ`ŒÎÝ;/…á¹ò9è+aèÎb V¥â(&SŽŸæ:†X]3ÙÚН4 œbÓpM3)3¶¾êÑŠÁfš³É2˜Zš«O±uÄĵ,Zc Ÿ!0Ên¬áMŽl”ØÒu±òՅò…j9+¢ö>) §xF²}.I’ÅPJžïfK¸«ô‰ú˜R/dlˆXFPë8HD[GÙ d¤Ü‚œkheQ6±ÇU+k'¢\˜ùOu—´ò2IçÀ´$Ä|f:­Î¨Ø&äÏÛ%ښŃ)IqC3ü¯½2êÉØþl²ù± ²d9M„(ÎٙüJ,FrdfðÝàÀ-G¹öõ·y’Žûæ{†wûẗ́ uOP¢‡(eªä²^> QWòa l”xŸ”Æ‹1z¥Œ.nãô [¸.,Ý PkƗWƒÇà˜]I©{ªT7w`»ÜÖ +úAÝô<“¨G¶×Xëp‘¾t“eË|Ò8”N~últ™ìp™C˺½€Þ,1=6Ó9¦¶*6« +ê#ÊÌJ’`,’[½Ò$ ÷’slþݜ«ƒº(" ª3Ä; exGöß@Œ*Ûõg +ÆØm¡äþ ƒ×ç$‡àZc(äs¤ß +ÏT6Š¾‡Ñ,eßfê3¼V탳\/Œ,2ðuØñÕ Œ—®%†¾Ø|€Å\*yfn<æ“6¤Ò}èŒg+¥û •áð*h`’8ex•µøÿ[»{™ŠºVËaïÙÆÈ$ßv†-ÖPèÌ×vہªwˆAe}Q¿ïШX‡-Ò=äá$\¼)Y%¦…;° Ú8¨Ï&Ğ]vˆGÖØݕ,W^šZӍ¼…Kp探+HX-AÉ+çå].BèÅ'D–&Þ¬A£ÀVW²ò•Fæ-6‚Dd7ºŒÞ:@ÄM7ºÑ)BS«œDšòÕze¸Àx; z©àÀ…ó1`~FÉiLg‹1”˜„Ôº é`².ügOH? ¹«JéBÖ؆8¹NV «§ÞeHa¦¦ÌŸ•À:F% EÚëòHñ"ʼn%qý·vFZ«šéZf[é„ +7!Éê‡r˜5>f¬ÙÚçñØåÓ*p&`DÛÜ6‚'§ß©@֓RßÓT⪴ÆfU †”àE´äžª‰Kæµ®™Y9ôò߇ $cŠèX+¬nû‹¼h2³ÖÝÁšZØy֖Ì,äŊ :Ÿ[snÎmÚ ¨ÐƱ3¼v/“çCŸØò…À*nÊÆ/ҀÎxöú%`€@iwn´¿]¥gäV¢p;ö¿Xm˜H­dïìn¾V\¯²-AªÉé8P~LZ«Ôi@4q’Y¥w×1¾ŒÀ·l;¥¯økGÖ×`î}™¢•¯ÍQxæóÂzŗfãKÞLÆ´²Õ‡ï­“úÔ*pXtû†„`J]–;¥ú7þʦ"pدÚ:°-éÒ§ºòÝ:áNéIÑu;•#KWR—–£"HÒêgÌL\º(Ï,FÖ̊Ÿ•¨,©àkE¥²•l¡‰t¬Zø1Òdââ¨|wX÷kMõÕ Öx”4u…S•íMÉW= #ô]oÚ(;”¾ŽìƒÞ'Æh¼Ñ~‚MÃ{3EÜ+t4úõü·z «j2 ¦JP³»uʗâ2KÜ6ÛU‰† +U5HñÅʨe¸uY`ëZ™Lÿóë¸oћ$¡ªÛG_ÿZkÁš–¶2¤b€qŽ>pCÏõ©¤RB[ÑBà“‘¡ä!¨4݈™ß³4N§C“.ExËBÉÜÓÕöI„š˜LҔ¹…µi˜$¹&ôÙò¤ëE3ä´W;¸¿šPú3Ëï$bÁ}x¾uŠ‚1°§…3lÒ¶‚jÒ'‚>œ~qÆ¡)‚ÔFfçqôú¨ÔöWf:؏Œƒcþ·K¿%ŸU'<­Žòy°Ûoå‰õ2nö 8—0‡SÌЃsçÐÍ.t¬5˜î±½µã7sÜi‡sÕ°½ +9Ÿ£2W§o# êp(«¸•ø® +lõï‰D‘ôÞÿ~Zm2+óZ‘€Ð?Kÿ÷"-x\€íöx|[GXÆ9 ºixâü²)7ÁºOÆ“µH ú h½ЅåqW Aþ ÁVø­.ÿ^„1šËZ€ ² ˜/ „=¢ÎËR¦”’”òcØ®8WˆŒ‘3µªEDؑqª ‰>Ö!Ÿfö©)‡'¯¡ +¯"ùIÕL ¥¨f-:T ô‡ª™ árž@5ƒñyÄxB‡Ajgˆ…+ŽE­¹.­ˆ(ÆhîàgH’׸ZÒ/\JéT`,ãÀ‚2ZÅnÌ»¡%´¡Ø X¯ºg‘2¦WhÌöñ1´Ý,þ RçՃ†&ÁU¬N>f~NØ3õš‚î&¢n+dVÑ‚Q”¢KÕbª¨xk$8HY}¬ 'ñÊ°X²œšš”!’©S‹|µˆ(è—ìãtŸ +–Z\Ip¶=‚Á"é&<8Œ¬ i$‚8C’ÙGœ¢O›vt„gÆ:ò%ÁãŸJ ÇÒzŒH§6 yàÈY?ãXŠ8>VD4±ù†¨-U E¬’t¾¢(v1<´g~¹;+ÖMåÊx¼ÙE¢õÌ©•ˆ +9†=§ózF"dSûe‚ vç9ôÿw¤“¦×¿:kjEN¹}£—¦Díø‚8ª(N…K‹qvŬׄLb‹S ƒ¡L“wƒ|Eü%+^,| OäF©F ¤¬¼ä(Neü¢Z¦nXTL±!?¦t‰F´®„§B3ï‹NTd2Çç£Q¤.… ’&4yÑ.‘å.úÇ°¼ê¡P?vˆèé* +ù` û@Eò4^t›¨xbŒ¨EEÿQ5+x +]aùˆê±xf›u3……JŽ%%“¢UFKdR©.Â;øY? +µ!i'7YÍ 6RÜÙ¡!³Ñ5Á¾ò)380é>ª9N<|ƆtSŠTú¥™@æޚ¯ dš4#&1f!¶”ÓÕx̪º +>WC1áD!NШõ!ŠÁP¢D/³qÔké÷‹ÔoœMÆ!=/Ô)æG<âÜ"¢ÈL… N0¢š(Ö?DQbC•Z$,*’º¶ÍšXSDªOy1M¼UÖHtrC®X&%¤ÂœxòœIœ‚ÈTDb”ôs‡]ƤÅb‹ü7þ'8*ÑÒëNe‹-kÌÐ"/•© ,V˜b7Պž¦¢1N‘ü½X³èÊ…^ŠòÇÊDcŠ,Ê[^”픶UÏPÑ/ÎSnpqŽÍÞEpq ˜Ð~×f@‚¿w +ː«ä$,3VŒTS\>VnÇwq +Uõ‰&F{—±3YöÛcåBa~Cj^•…¼Bs¨–Ô`-rPB”vRU9&â¥ÑW1Ó!h¿l¿-‡­².Ε=² S¦u© ù½}™./¡©).‚¸*¬Zlf‚<þ'D.Ù¿ä䇸h˜¾ÌgÄ«ºc KXËã¸Ìûõ =8anÍt¼4B^‡²ÐÉ^6U¶3«ªü[áñDFâÄO¨’Mþlµ…¢?¯ RMÍBTDÔ5"h‚î!²*ªqŽÑXtHz˜m‹7!*)_„è&æVáj©Z£ÃCoké*U;ŒiVAAaVC‰!Ru2‰x/*¦+A5iÙb¡X¦Ä1ÉÁoY°%Ä"g'҇F×ë@ŠYZbKúªË§øÄbŠzø;Â[1ÞgÔFž%P= /´a¬Ûev½V«tEO,2|ІÑ²ËâY¿ª…Z Vdäâj]îEl?8l=hÒÆ=äd?.õ‘Ý¿MâÂâ9îJ0Ü< +£HbÕ½_p›ùÄ<¤·¥ÅÇ´9:υžÐ#¤yÏZ£ÍÕ¯5L¸y1žÓ'H$È o3œ"‡0È_Ñ&ºHE? +KpF8ˆ7‘þS5&ˆá‰™°ƒ$ôA\«1•] Òµ¢:é̼Üyqf­~µiýûn þ¥FŒXÇ£'Fçw[gÎIAR#À€ôpeR²”jhªh»&h.£‰LçàŒ¦ß…,ET—…<âå–kȲÏAkXt$"Ä'¡’s3a±á0rap¦< gˆaÚN|&Z%îDƒ.…“AGj:£Ë“˜ðøPG#ÍÚOe$Þ „"âòq…ÝkÄ·'Œ-$½Äl¥7(¬X ó¶¤ š +E þÒoôw‚‰s2W-¡æN05‹V!-åÖ¢ù!—†ƒC‡q%6¡¥¬À‘º¬Kè\ªLײML“â…HBÝ >ôÿœð¡ÏŒ‰ù¾élâ¥uù˜rçŽ%T!5ÅפSk”K'“Üä¹ã©ðKjp W¨êõ(ŠÄ²O´åMInFwrùð+oåõR1.Ö±I.ÔY‘¾[íك=ªQg´©±—IfÝ$õWØû|&<šÐ¾y‚¢¾Ã#U"¼?%u‚‡¡‹ð¾|Š^F‹Ä« !iݗ +-ÐHŒ)Öë ?Œåv·¯~XF""T²žB(Ht3Äó˜ÑŒþq±¢1„œ]BŒâö²±Ñ"c^JOɚ ¢ª’ŸRBCÔ 93†D…Zù¦'ŸÓÃãDq1Z%7º<´ÐB…ª4åx¹ñK.|$ò§Õ)‡;4DKlƪ×8xäð­ñ¢2aèl­ÄøT>1Kh‘l×’ÎÌ¡â¢Bž©©Kt‘“„¨j•SÌ8‚Zĉ*’¨qÉHCkFš·&\§°d\3!«™“XC54šIMÈÔ(L©ŽTMpâ©ý+7ý4¨3rõUšM‚<䗙 Òâ…¦äo}^C2ñ9+ˆlWŽ(hScÅ”z¨…Í°ö7dörÔUoÉð51<Çh(Õ ÐdYËû ´ [:[$ª8a‚tˆȄñ¥1ù)üá_Õþl­¡;óˆ(Öt†„*¢+oz‘Ók»Í]Fb E±>흞"Jƞ½˜ +E䶟pQb; ‹„»Bè—ðw•7«©±,RLÐGJÂïëO¦¬øl$&—*ÉD#‹*I}‚·IPسRf!ü)fÄ܎Ì5‡>tqˆG r‡ˆÅõZѺk´m¾ù|±õçÈTcˆ‚(úàØBÄGkJ›ñT¢œOÕ­¬†A>FÃhÆÕÓTˆ¯k’2sK‡ˆÔXµ\- ±3µ¼…;Ö÷’{ ;½§º…n ¿@¾Î7¸ÈPP–7yæJ Ë&91e)C#e+ÄA0÷*MÞ0ÕÎ<49R’cy3)‡%• eïJG6aè°Hr¥£E"$˜,Þ¤PÊHUœ}A‹œr„ºg$|v ªÅ8ÂÙº["¿ Qmjb䤩ÿ@ô„Ú +[?…hÈt,‚µ@ÁáHxÇ4†[$P‘|écáóÏ+ TqÒ*þiÓ"4#R¿1âml5¤ÍÌêe"˜–SÄtúÂ)!‚~â“‹›ê§ªg3Ƹ…—nŒAbmà3b¦J\Nå™RäÀ’}õ +E¯Q›D‰A2Ccà"ôP(R"DÉÏZR?u +C£È¦"a .P“ +³­ÐÔf ǔäT2uà S ì:JhtTŒ?xlÒÕàOpxÆ4Lþ>OFÎZ/éâ³L8e?DDŠÚBù’KuŽ=¦q"‚¢¢ÄqXrhèU­ðÖ§qš +¡¨É\Lšùd‘U)#¹S÷O"‘zT4dâRE÷乎Õ>¼Ÿz‘JBSCK].‰ ãqšäUŸI^î TOUÌX^ô&+Ý¥»ú„%"o¥Üð%ÐTÅ>ÊÔwF-õº2n8Å>>Ù¤A‰p!B%0”Eœk$¡:ŽZFâ)+(¥iÔP +ÐÜ" …MŸŠ6s:`ÂŤ×ëZ©ÁuƒBm4¾‡ËŽ`oÚéÅ%eÐ¥$Ó"%HH1©1è6-X£Õ—/ìזNxdúgT!­|‰P¾C=B)…H¨Š*†|P§*z?ŸÉ‡uOjWì©©é—é^?M+ô%70TE¹¬\¤X4x‚®=Ø­‰`²’—©u¢ÎPTÉD½ö¢°™>Oק ›ï"J•΄ÇâµC(<þåZWBÄ£Ïÿ’zu—^§¨ÓiZ½Œ´'Æ"#‘š„b.ôASi^³þùL8#d+KÁŒ +³d¡³Êq‰§3b å-Ž@JK±74Ñɜæ!%æ?íNV ~2,Jô«[b ÎyhU¥ ‡¢«ºç~Y¢!64®YK$4‡åŽèU²º:µAtT¾á”Œ½-bæaÊ*¦¥)¤ˆ +‡}r¡ÂŸÈ Þ;.Ž^ «±•sˆ:æc†-11K…•:š'aMq+ñŒ£ê$¾¸¶Võ/“êUóZf"aXu‹¤JoQµV¹U³"©âeu,“Ý÷\¾$OnŒ +O}"*Bìª<È¢Èö­þ`w—øH¨Q#á-e4”¨èÍPAޜ!¬ M[Šª ý'TA%KÑU•ÞÃÕ©¨Êa1Ÿ×4±‡¼ÊÏ'H,W…ö[ëÛ¯$äDU +ҋ jB+H;]Uy}¿Y´µLB²&u ¢ÓwŠˆÙªëçt:'½k„vX 5ë<( ÉóiŽ•på­ztÀxkC)-.G7Àb—_‰!Sy¤ôvÛ1QA®|æ[K{Õ=1œnÂaO㌨¤s<·É•Ž„š‘Ç&¹¨Z«4¡r>“ù!™—á_ð¨w»J&àÜ抶oÛΐúâ Â1i##֝'üR阬±-A­›p_»/ã÷6nÆV;>S©=ƒéÓ¦%Á‚«•Á‰lvæ¸l’/z4 ýҞ$æRc"84éÎâK‹t2D._‹âZ¾Ç¥­Q2L~%aâÚpÂ=x{žUt€äwÁqaÅb'ížBž\€°b˜°‰°^rê‘AzYÕ3J¦ÎÝL wK«]˜ÑÜßXH‹àJ°è*Ž£…Ál!£[Š…$QKßÕßA”p‰/Íý8× ýüJ•­™ãÛàË0ýRîß-†Bmœv^±æŠW¤-'ì64cšÿ†ÑñBÇV¤² ¿‹£ò²z¯%Øu©\h œaib+•µ„»<Æø¦z«U™9¾f8r~6ªŠëi4]7p˜zÕ¥¸/zm‰ssq¥ÇmÄî҃ŽÎ± sÊDÁ¸©ÜµeÀ5ÑL›žÜ ’|úû_zV±úm…§#¸4ˆ0EÔ½%Ņd±ë5Ÿ¯QX¾¦žôØv{(§…ý–IO‚;6”`A쒤Þã’~üvJ ÎDÈTW®ãq,ÆLĝªþ¡ÀPøÑÛê$/vš—»ÞwbÄQp™Ému—+€éœÅ"fÀ|ñÁŒ¶ÎR !ྈF,€¬ƒøæ™Ca>ï4^3Æåb)æÐ@Ú3Þ*!R¤ÎÒåz4®™ˆ±ç˜¼ÇÌ8ÌLƒ;Q©å1Óà9mÅÜ}ÿ²r@žƒˆ"ÊYA>Ûå  üõñ¨Ï“ÑLª^øJ6a½ï.¡pï¦gëŸûD¶Ì`/‡6€ñ¡!”æO™;Tÿ¨–ÚÁÄ8GZŒÎÛ³ŽJEÓRø7°A¯iäßi–è­CÝҘ͍$^¼þ3GµÅ°çÓc„Çíbc꼀›¡Eñç€1)(ÁÎ4L9¸Ïß$jgT=‚4>z.¯ÑÊi\šI'»Î°¿Ú´–°¤,JXÀ˜†È¿å chª&GÚEâž- …Íf…­äpP¯ƒBV?«.ØCFJ+h<~¸@O7x¼é9b.ÄRV³Øqšvwp–R¸È¶lË{¶pƒè4°Ñ°"ÕS¤i=ù‡YJM%(>‘® Ž0Š(DI:ƒÝd´V¸:?vG°÷–jR` lÔ +ɺÊüPh*NˆRˆü™ô»D–*Ñk× ,-YxhZUôhkk› £çZ!‰1îlfö;*@l]¦X×´: âªqý²‘ކȺ„Š½ñó~?ifq2Ýíæù”h$b1ªŠO–`†Îû—W,7.ݏB'dõFä@¾ cŒo#eŠ"Òï+·‹™ŠL¥'°ÜÛ#hG0®Ä[Lm]p+Á;š:Pź|¸Š¢œ˜_Ù(ªöl¡4Q®÷€$*§×¢é‘qwD©/ýI~1Hç%bp¨E¿¶^ä‰vP2óž)Kh5?šÔRAú{mMÉCÓ?­Ûüɦ±úÉ_¦ø ¦íS^ט V>ifÌði>Úîi³';W=ùE»è flÓ5€X~¨œ4øYÓ7š‹µ“éøc§‘ßœõibÌ­Kj¿p]éT× ÆTJ;§ d ˜Sf®rÚË¡•È©Ê_º1N~˺¡ v”ê )àd­Ît»iÕBHÜÇĸÖ¥SH؁®É4O}P¬)æ +ï°åUœ§0e£™fš°H‘°ISì©×+š¦þhšo2=Ï´F¶.gŠ(– 4S¬:X&M_¥'œ1EQmMÅ´yÔ¥—`-§n&bÄ'Õ§ƒ!÷æµ”¥Ê0tñ¥¤ÿv¬z©Ԁ—Ì¥g—ªôtÉ¡r©ŠÙ„ —¼E§[4ñ5°%à/´Îj‰m½hɈzë5K0ÿù—QăƒÊrk”ð ø=O·ÂK1”Þ(:ViÐSH T¤Æ ʓJK­¨4~dÇC|¨ ÷”DŒzB•’w…EJÐ#Ì(¥,BˆR”j"¡óóÑ%³%f\ñ˜8¤X>ªÒp:Ú.txÙ 8Éqõ&Ø&åKgšœ§—IÂÈ€IÂb º¤$ˆ`I(vbF””Ò =qx$#·äd +õ÷)Gš;×H8wâÈ.ѓß$%F¹ic@"Wãä;‚æžêfÎd3£e‰c\'{ +¤Ìë¨YQaÍøè¿JkÀ¥¨[zÉRk¬<²™ ÝBx°UÁ +ØÉ5àYŠ¢úV«£(GGNÎ[Os”º`HŽêè,Ž¸'Üô…Ìਦç4D8h~jc8¥‡kTk6èäƒô›Do¨HÔeóƒ:Ô #ío΂Ҩ~—Ñ íCú:qFnþÈ©¯êÁ̌!s­)£zŸ¡Ó‘ÊVÍþôf#¸Ñ™¥g0°T²‘¸#ƒNg\_Ž¢²ò¢xïÔ¡. +EV.J’Bס,‘Ì×l>ZT×FpÙ-ªQå,ªÆO( ¦…êaÜp.2@ ®>Gá†ÌQ—Òó&ÏȜ'j5*çu±3Æ:LG{ºˆÍŸûKuIêj&²ù!‹ÕåۃՅŒ¯Sò‘è#Y̜ØlñèÇWqS«!¢U7Ä,äN› +6|(l]>س¢£?õxPHµ—úêø)bq&*öâM Vƒê²˜msíÆ(ê‚GŒ£ãæÁ÷©žá’•‚Û$¦¨ eÕï¢O´RRP'+„Qr@A¨®,Àm¨—Q—µgbY²Ã1՜|uù}x¥—‡Uy3¦f€í½¿¤ÜZ˜†œÐ=©:ŽRL fµÉ³| +¨1)’wT–ñôD…ÌèL¥ƒ mŸü¢þEõ|ǘ |˜×›,ÛoSrkW_­ @¹‰î©²ÈÕÀUv^“ֆǓ6QUR†õP±ÿ×"_¦úá khœ¹vAêc!bD%¤þ©§»ú0v‹Â ÞC`ëàimº(íÓ'"SæÝzªä¼<ÞBLV)p·`¦Ð•fMªæF(ŠÆûÙh—&+`ˆ‰¦±QÂǏ]‚[‘ðÕêò\×5s–¦;­¼fÝzw ˜e VÈ=Óׇ´šu/a3’!cæ–~­'Ó÷a4¶ÎUÛWæqz!¹-Çø^–åM娀2bH %2²9˜@¦ÉQÉ"ñ=<Õ«Þ\ ¸²§YЦÓUXwpK-Ë1L Fô"¸ǜé‹9J[œ ¥ÉD* qÓÅr£‚”`(“3 +Ò&£Ð6|ŒY«‡”ƒY]Ià†¾”"ôSp` zàV“ŒeƒÀ§Ê4Ù¦ùbf‘, ü`†Kñ6˜J$*Tdkš Ê ¸þJš,£}€áõe Pî@H¾ÍœÒ8 +ÆÁiQ¡Ý 'BR;›€„j ŸŒ›Û–Hõ;£D珏\¥(_`ÛþvùWÒ>)„‚Iˆ=!~ÕÇ 3'M2!J/O¦Qþ—`(2owEòŠ/¨ÐoÔ"/j!iø̋ô /RUånþÄ2¯Dr{ËJ³ZHðÌ k_Hf‹†šZv“»@óÎÏ°bàf>Ф°8óL*³rL*Wª¨¹Š*µÙà%`0'{JRrÃ'¢Û¡L)'ëÝ µ$·@Ñät@K6°ª‡øƒ *ˆ‚%5—ã¬f©cÜÃ‡Ú É6ï5wˆþ·Ф7¯ðººdgr%˜’¥PzSku š‘BÀBìOr ‹Ï?¥Aÿ29ÜÊ9—ùn~é÷ßÑw'øìbV7n$!⚸RCYLL å"Ȋ®;+’^¥/ÚÐl »Ã7"±åóa(†Ö´zì%yÈ4æCæÑ0c÷±œ\´þµ‡NA{Œ x;Htè5·r4×ø‹Ý¢Ð=TŽRq7:+íþ6)8“zžbŒQÕüÈ֝Eô ¤†*rË +8¡KI+“$';œTÆHãz5Æ šÐbV©5YÆ3z-£RM℞$‚c"Ê:¼ÃOj¢©Ù.Ò®߂°ËÉq¦ ŠXrpÜÉ:e—ì'a ŸsJr““dlª·lM×{Oo3úd„îÊ)q.Ách£ö—´ªBK65Àã V‚vÿç¯6¶ž6t"߄øãžD‚”iÿ,‘”ƒP? 'þ$…ÇŸm¾%Œ­ôʨæyÞYAL F eZ(ï½ÖÈ÷òé3c±A/\('9PïþíÃF~™°_ؐ¨À˜ºkÊ +Hë¹ãqãAíÛ[÷a]2 ³ Ԋ¬h/Ƚc3—·ÚÉDóÏ¡„ NcuÌ»vÊóŽ{/Iâ²Z%à+5äÖQÏS+⯊àtî (ÙcîÄh•ë¢D¿Ô/:„Ä-@$ +/Lîޚh$ Q +·ô¼¦ø…4옺'QöQÀäl«pìMP&P"> +ú@Ìî±ÖBðy÷ 2Š4®‰­èAfÈ¡‰HQ$F$t©ƒ¬7oˆç’ÖB‡f!hxLøžtÉñ&ËO)Oˆ)OSå0Ôýru­)ù°³ +ñÜU–‚x_è7‰m¤•ËM'k'Hö{2¼ëaBgÒV?yS˜ç¯8ç˜ÀèÒ@"­'úg!B\,˜÷>bûøDHcÖDhlA­ÁEþåK›^zñë23Á'™ LÚOx¨Æ¸CøÐ-*Kü`GÇGm¼RHVr `æÞøoísžy ˆú÷Ƥ·ÿµ= ZI,©ÑÐo #;>@¢ìņ6w …[C¼±ÿ§v:•õΰ¸2ÿ½@5ŠÌï*]:Ì2)>ÐclbÖzÚägôM:1—XìÆ6(Á\N;àmÝ`2;1™¹âܧ‰öv‹lF¶ÆN>Qà ¼ ÷‰«—j€çô(ÕÓeí'Ô¦N —YK¯4%r}àOäZ¤¾]+MsackZ4#€²‡ýQþцl%ÝÇY¶A$µÅ<3@‹i,©lè^07rNE§" +6Ìtu9ˆ…hô¹d;½X„¯}rº–šÏ\¸¸M~¤RX©X=¥š ˆ =K’挍̔…ÎSþ Ù̅3¼iñ€³ ˆH€-O_û/½=rõÒk’@€Z`þWÿÎBѽÓÁ¼p™î´ÆW¨Bê“Už‰¢IÎß_”™ËäºEq*“ÌÅûÎeò2ÆjÎe›Fh’Q„G=*"íÀÐÊòioúô +ZB›jò¤ +gsG +äo|ZúHš¹´©`nÐ(¦9ús Îr^Xš½xb–h>°lðUÓq“ìK5†C6‹Œ±Ÿ˜.Rµ`&¡6]+Ú ¬ùÍ0ɡί¶ÿ¤è²Ç*ŽÃ¸âë®]ÄaøÑ`ó0©¿%—’Ñù^4.ûYŒÒ­Ü™~InFî2¥¾¯®Ó룳"Ö£s`lâ᧱ÇnõïS0ê+b^$“ ´:–c„Ÿ©Il fbèÃ1 ZDZ0Å Z „¬/>M¼×Ê÷Hw<' +ˆ‡z%"»tÜ086u&¢)o"6Ôtî\()÷ü™m¹i·BnyC£Iãj¿i5o–ľ*ìrÏÑðn¿Ý "†ïä$ó(õJªÎvü\‘,P›†süóƒ€à-8üZêËâyuˆAPˆs'Õáï(”Ýó$Š’ ü+ٜ!< Ä'2;R3% Þ;ÂÌE7ÑÀò@´MÆÙÑDCÇpLýMþ~Cg&¬”$ÀÎe옎åI$¿¾U=*®ÓCáïþ„"݊åИ⒵~Ñ ·`óÓ®æ­ò¹ 1E —eðåQ,äÍè£d6)¼îÆ\§çý>‡ÁZ ìEã®>f®§¢G@ 3ESFßJ‡…îÀкïP|ºB´ay¡Â5VcÄ(ÙÛ¬3c–öòPÅ¢Iu*í-ºèúª‰eE%X …,,/Ö¨Þβ £‰e­ÉÕd¼zgÝnAì¿ôD´¤×ؼ‰vþDý;"^̀3²ôÿ1:”¨ûè¼i uªWÐ,l%{|'ƒ,BsÂ$Li L!U½4;Å·Dö©c—üžéÒµ‰t€Ö˜è&#)–Îù£ôþ4ÎÈí ¬`àˆlì=qå©dуz3Sè¸H„~|Ԇ(1•{ ]²W r)d:`ƒ0>ÙHš‘)½µ†;]Âx’õ)6&‚ñ„‰ùÒYËoò †—Aà!šè%p)¼ò—]·Ãœ 4í(ù¸ÂñžSÒ2@ã)foVDý•ŸÀ„¡MAÆP§•Ý#Œ½S_6g²ÆR¢H€IÞaËÇ×î$7„„Õ=cZw5´„ûüE¾¼ƒ‹æŠ +7<ˆK†RÃÿuP[7sÄ Ð¦’ᐌýú²*2ö‰<†alQia€Ä‚Ü×ÔäÑLU!öŒ["U<¥ùN£yôS‹g´˜„ûP!ðØN¨¸Jã³x‰sÖµí–pxTSj2 #“ÓnE)Iìµ ÑûL’ Í6È=œdürz™%q í\jì +UúÌØk¬‹°R3ñD‘ã&I®Dìʾ6œ‘EÚòcÙT!ä:„IÁÆòF:U]á²ácÔ¾SÖTF`X99A©Ãvàíe¥iÈþlFú#÷4/=T™¥…³ùâÉiäÈüaV§ + Èd­ þô^ä~ud"¹NàsL‹çT¤´°Úec:[N~I‡IQÀXQåóPZyÞÎEö%+I¡;/¹X5oÌ×£¢Tèªõˆ(åÐ6•.õâW¼ô1S.|w¦óxIÎ ëÏ»’H@ë†.Òq952Ø°?’i@vÉýŠ ‰ü0.3SÄښtÊ~áöEÊļ÷1,™|jHoñ>¸è·¾J2ø=ñ@楎lÿˆ ¿ m-½ÑÈ刼ùêÕÎyœWÅ{ÁâøŒRzÖV-<æ®ÑU7­G¬5=›D­åµ”Ÿz!òhkÛ¸ž’gNƒ4tK°Á3sR±çÙ"'¿:ŒpOÞm@k¦,õ¿9žŠ•ÞÌÜ´OBq–çÀæ>ˆ-`hi¦1œ0YèÕx*® – Žès2ÖÄa‚~T!:çIW½Ã‰_åFßF«\Jz˜ eÊäf·ÖLžÉ×v%”â®’óT ";Gdbl~0¢XK¹*ñ,Ó3ôbb>ÿž×ßhÐå„.ü¦ÌÓÚÿ9øP_*è©OwL¨Ê :«ÐCb‘YURóMm^­d%²òéftó3WçÁY%_k³¥´+ó„›©ƒ2öœÀùŽ‹¦Ï³Þ›ß»@Fì2ÓÔ K +or{ý*óãG‰- +ꭙ·k|8C`Œ9%—v¬RƒR‰!¾!(IÂÙù…•|µ9LK}yîÓÅÿ0% Œ‡Œüþ±ï® 9Ž·ö 4A#ªcYG’x1·C<ˆºSw{‹ð@ÿN‹Ù?1 @™ƒôU½ó3òð"‡‰æk´Ôlfeò©eÊ]j˜FžÂa‹µWªÏú'ývæ1˔ÃÚûŸáŸÄïIƒ‚dõnx\$ÊG69Œ©CÖ`ʽòCùߍ҂¿Ñl$ÍÁ[”½¦žd«½é“OÀJÂg¨¨ãëê³ÒëÈd‡ÛТ$·=‘á5ç]Uφþ©@#jÓ6ÇÑÇÆÿgHܟÁ Dí—þ!¿š<ò›Äʙ¿n‰UÅtd5†þêþL 4[°0võh" a[† óxœÆ͵måORq*ì6°üØ—s\‚¡Ú÷îÀ•×‹ê²iöBYâ­Êw\є¼¦¥¼«£¹ UøxðvÝoê àX„ELj¼‰ºf,Xvˆ1e\+mˆÌ“×pxÑ!¯Þ„Y͈5nêBùî‚Ò;ƒ­˜|ë'juw„$¿Cݝ¥•­°GHXB¯¢žî—k’ðÄk“«ÓAy6c`ùÓ¼—|¿“âk̏Zy¸<3ºú.crT0üq˜oH{cxhìSþ]Ú}Ý“fM¶›ñKŒ|îi•$^á˜ëFn‰»ýu°*ü~wS͚:®u¸Ú·’}kɖ¼a<¦Êcé(!7Êä™1˜éE#Eü‡ç˜ÁR@Y›qá?9zT¢ßbB¾º.Úq”ÛqE ‰Ýºëö°Ùf·øÍÉSñ«ÿ]ø†U¨¬ªÊ˜…²lÿ—/⻫ÄM5QWûAÒÜhÊEZñ•cz/x7ÄöB–™šzÅ.á‰Ê¢rRI°^iéC8ŸRo¡7£Ø/’„²%q£?€î‘‡…àÚl’Ú‹‘2LýðÓ )lý‚œs†4„ë;yY2K½†HQk1*L.(æt{N²<Ýà‡ 07JHÊqú¸#ç‘À?AzÖl+d‘À•™'9gÁ‡'”@Ào£AˆXúA¦iÆñÇømM Žpøl¯ÀJg¦|?½ú£-ñÐá|¬ F} ʇгGb`ÜåZÃ*g W’•²âEÔvÅÙîI 6vâUt†XϬp<ð5$º wiM¦pÓ(Xé² ZLqÌ|m¿Ù[m˜6‘­ZIûÛ,´¤òœ6ž#T= °,ø Ø;ýùë½[(Ôw¿üÜZLîÍm¨·ºz§J­F9’kÊÝî( ‘ ¡qÒØ;Y¤JÞ>ËV¬Á"‡û-lçœ,ˆM9áô%p MŸú¯âjŠânÂf㉠þQõ. +Œ"G€I¾ÌÐÒÁ*‘›fÃFô4؀ËãÙGâ- (W¼¥‰ú™é!åHÕ)¡3u[ù¹¡KæÁ׈žÂÇ¢Ÿ&>gñÚ;xgO]†aQ¸ c²Œ)qEíùáP™DˆWXn¯óíÀ´ã‰$çØ-ZŒò?%ùªí)ñX‘´Ï?ÿ(Ç)º‰«…ÀXzG{“²ÏcáÆ\0|!ìØOÿ¨÷ˆå9~„( _-YÝIx0„X@PÌÒe <Å.”ÂJF¹‘Šx¯¤#õÐö£=L (ƌ[º ëöa1  µ‡$V¤ìÝÛRP…£âÿן5…èÁ`¿éAèÈ$ÃqĕŒLÕSZ.–ÄwÌcmRbÏ8½s/v|NÓ šmÚß:¾Õ#xæBk:9è©åxã‚L†¹Lyzn~<ÀH–áŒÙ³ËJ«Éƒ—b)r%¾v$.† c[~WXüÞIÁÇ64ÏìGKF‡™a4AŒCE Àìõ2Æ¿œS–ýŽÀÔ4"~eǀõ5«·ª~“S’è°1ü¬±± £Q½ÿæ5ýða¡ó„‰Í(TEïû‡‰DŒ?Õµ¾m0™Ö¸S9®æQ©9ÿ> ;²±»³[1㤽é›ç×j?&´/ŽYÿEÈ·Öò­À[¾éQ h<‰ záʁfg ¢$ ®Vj¨/¾&ñaH× +åږ65qw Jàú#¸}x¾^ÅzS•Ó ®˜A'À,QÆ ìà©Ø’ÊHµ¾䁠TÁ¼•£I‚É_¹z‚$α(Ôu»ïȳ7ž°pà€ÆVix抙)“%)lƒýQÿ¡~gö–?(ßI^‘ÖqäÅ ÀÜ C¡†÷â~ ’#·[ܦ”ß T¹ ´\Q¤÷^³«º”¥=’ƒ_rB»6<n8¶³¿Ñ¿{zõ»êKþâñœ£ž0h¿<²tiɽ4®¥C€’0H}šI„´åŽ1ÔïUÇôrTpé~Éù:ÿ²qï&5t`þÐ3TŠ¿ÔK•%ò…O+±=ï#4áØÍÒ¦­ûv5ò•¼‚ Mª«!K)ueŽ2ÝÑ^~¤ü(˯˜Š9)ü˜¬§v|>B¸‚ŽŽÝGó0‡uw…|ƒŸh9U6B 6½ÎNcôìjfÛ£‚¢¥.^Öó»wϾ_ÁRz84ƛéò*ð“Krš«Üe¼›ÇÆú=²“’SIÜc8èèªÏ¦ªnӉ¿Zå׬¾‰.žØJø„¨Ùv·µ´ˆlX-Ùéå8dj«£œ˜¾Ð,¿†šz-fëh›}«¦YúlC‡ö:iÏ«‹¬Tp|Dœ4uÑU÷ BωTÖÚ:hHD3ØåKS¨|QpÌóPªØ@sEGLvKRäêÇyHú³,Ô¶*möD¦8‚fç¢rl—ƒÛŸ«RØÀÊ'ûÑáT ÚvÓ, óF£%‡C¶º‰x +p*E6am“¤G'#TO\À™s̓¿ƒÒi +åÈb^t #áµM€nÙÐu†ŸÒ|B®к Ã;Ù6+êÖ¥1ž·VekÓ¥‘ +9zä¹è’Ys‰1UîÊ&½{p$Ÿ½øtkßÈ¥Id{üÎ#Ú»8„Î×\5­ìê`E†îÍ0“3RøÄÒwcw®>§érÍcöäI'•‚¶ÒIz½`ârÅk”œÎˆ'w²xaFºàùãÎK§HjgC"ºÑ'n²•‚Ê)õ·‘E ÁÃg%E:Ñ2cÍÏ {÷¡2^µé‡»ªý‰ g–}†$èا²m§ w^ça•©¡Œ+‰¿2Í +6J=uÇ·Xšª„&ÁpAL®¯üEyŒƒ/$&2:%—JRJæ³g0ã^Ñ¥S³”Ä<Ë°p:^A\Ó~âŠäÓsü (u±¡)×±:C1k[‹Ntàhô@돞+iSÑzÝ æ¥Tû! D¿áWdÆ' é†ú£ºÛ„Z¾É$!9½þ9ÅÒÝ`P€æ"?½Ùçë$ÕB +ŠxèÇ>[V†ç¦‘Ž…Ãn¥K¶ÜzEÞÞsG«!“2±«(i¥þ=?H|Z 41ÒÒ;VKy锄™zeÙ~f „rATѹ# :gà‹ÚÀu©eq„BM"©sÉÝXNâ$Î|ÇXýqCâ{É¥Rv¢E6Øç8Љ7{¬‘P˜¨î“»J|Å?>tRðˆÄ¹B:¿›”›'ärî´ðõ !A(Ø) ±˜K̒g Gå3Üì´p}÷Û+÷*–à¹ifAHf°Wlj½Ìz'—øSÿ†Q£¹Ø‹j–?^Å7cÈ#—=aá ôú¹TÊmqýH.Q­ƒ R}ôp’‹5IÓ¸¤¢¡•â¢ø)-K@Ñp qÊhæ-jÔ—¼.G>>1›z#Y\‚ˆgEÐðãܪᩦPo«Hå„;•AmLÂg¸æ"´r&ÔÂå÷cÅBêY…® +—ïÿœÁµƒ³+\¦mišbªÂe`5ŽoRMÃguð„KRÿÿGց—+«8@Õ& Â%«Ü\Vé a`»pـ‘^3˜6íÄ˶ξSºcGƗŒ1M›ÿ荮jçT°Ÿ,Ë bºqÙ¤UlDñl3·)\ê.¼&+Tń‚ºÀÅà{Èý‰ÚèZ¦{p1.á@\[œöå™,؍ª¢Pƒà2U9@“³1p¹¡àZè<&ÊÀԟ‹à ÔÂÓËc¤,֝ÿÓíú+˜˜î?Gàíþ—¥íà€r-ìˆF,…6l^Þ¤7óžF}%°4Â/WŠKEM,_ª‚6Œü¶ì§Ö ulýN³œ§©ˆgуÅÕH¤ÌӇE9&µVL¥¡Æúü>¨áªW„!ï¤=“÷òàË´—¢êcqo°.ñ E…)|Ò/MF»óø‰dXhÇ8·h/ê¥è$†=ú:³=ú+x4ß}¿!Hª5dw­—ê·Ëú(¢…h[Ó&$ZýÁO¤#bfiß='ZÀò¦0“ˆÅïNP0$aþ±„O#!QjòÃš +™;ü䂬&RQ¸G×ó ¯ Æ +¥Ð2g£ŒzÄ%&ãc¡8æ$Aè±.™yfïI­ÐEbIî{&§ÉȦï™> ÖC Eu>ù3ÛMіç=ˆÜGA}8 aô×.ͬ#Öø‹/餶G È ‚ã~ӑ+h³±-»wrî{-z:wï×cå˜<_0Ú›ç ôgŽèHR…ó\‰I°x‰þ÷hé奱úiHЕWAε žP«`•,:¥ÅäÂf © „ÉQ•»H˲KNÇÀ5æ,AtxS(űœ»ðÎQ&T,òAFÑ(y µ¦tˆk¼èJ°ë…Ò¤³òóc'§(nV£$KB×=â"Òt‹‘€<¡è}Ñâ»KÀûKÉa=ö§û¡âæÝLœS¶Ú8IóفÆ;–zÝôÌ®©ƒl|§~¢—fC›¥ÇMÀb§ËŠ1c¨S÷›Km³™zpîX§ì="jghcšÂùY£'g¶»Ëy‚¢ýZ±œ‚¥ =êQù(#$m‘µ…‘åÃÔi¼LB¬ ”¹Ò÷2e´.•@ “À?×Yóv—  +'‰¸–ÝÒV hõ¡!i¤%{€ 4àøa¼Ó^,‡kø¡ÊEü1Þ}c_KI`¡ï„oXǵ(þ%y,ò¥g­3@rɱ͘ xõ:ïèœY4^ž¹öy²„/›ÅtÿüÃ!ý=ÜÌ +L[a¬éOÁ¯`¼ÀöÓUÒëX–äNm=•ç‰øî‘Nå采FëtVé\7¦t ô’_­WÓ‰Kêƒd|8QÙÀóÔpä™!X¿D—e‰âÛ Žzc¦šfM+"×N÷=ºüÜ^Ø äF߬qš7Ÿ—E{=ï¤?™‹½ ãÚ)Ÿï‡Ýj½7zGÈ0,1ù^>rt—僕˜Í6K¸MãpÃ\>$­&tÀ¸şHÅȦ%SRÏìËL—h=Ë¡ÕD˜ÈªrÛ(#“îê.¢Ì?øÆ­…9Âr5iMyKeQ_7ûÀNg¤6ø$.Çù3úÂÜlôý)†Q¢w÷Î.å!âî@¬§Õý|_ïõÉû³ÛI…¨çAõ¥&ôTYÃNœ’Ñxè¾ó¸MµÓÑlÇì7nöã冞ҩî\Q«n?:Ȓ 3Q6M‘Üv)ø”c'(܎lr‚9'xrYì°6AD_ ‹~ˆfº&ÈÇ-֛ÿ¸»«úTüœHÑA H²H4»„ë°u輋± »xe±Äfâ¨eA!¼ˆÓ„[‘\Hæ Œ"Ð+[DŽbÓÒfùŎƒ´Là–0ª¼Zø‘ŒZTCe`ö³ëço$ŸseÇôœ[ÞÚù{Îq¶T¯Fs’˜`ŠQ69« JU¡Iá)$¥N¥xÍN*³ Ôà „¼KÎÓT³¤¹ËÕ âæô‚DÔAõ1¥ BÒ±W6ÙQ•êÞíu×5èY1 ‹ƒp¡,Qå`Í]ÛÊOÙ÷ãC?Gv¬ %•_úøè$1–±ƒT[ŒùY¼ïG`<ÛÞÁ9ל +Ï õšŠÒ @EøU¢]L$2,Óï3ù;òn1…éöŽê¨Œí¦@­VÙoRÌ@cOxLÉÈVpå÷=pQ!d}55æ®&/ýÖ«dû|ÐKg·ÑàÙ lW<3Èì)°\ÄÿHú{Ã\©ß díI¾S{:Õ§Bs +ƒM²ô¼K•yøù p؈)âTC 4!®hQÜ÷$î¿šWšdÎuȍø\""‹-„Ñû¤ ëÓg諉ÑkM0ž¦1Oƒƒ­¿‡ÂÃ×Áaà„¯$¤‡×c¡ðO>£#ˆ6Jt/ŽÔ¤ÊýɲÈÅ&[½ •Ö.©_MîK=“­wRIS5â7¥8gÑßlVO°ÔíJ쇠ÅÌžÃL* Øª.“Ä¡Y̱j!í q¥ÙùÑ­Ýõ^#±Å-û»c_ôdÆäž1ñ¹0ÈÄ?!ßq¼àp[&K–Å`"Ué9l!×PùMåwÓí>KïáÀè؉Ãe¹EñßBµ„Á zYþ9;’Ž0m_$iÄîÚۚlƎˆ!™’Ÿå‡?4ö¬K¥ß½ 7‚ U¾´pø˜JfB%š± f†”¥}ÎÑnT؃#?‚Ö”í|“ã͆¥”„QJ‡¡ï)nk1‹f`@8‚Ü,²jÏëg´`“š×tρ„‚ý0gxI=(ã”6iĶÏrWìS Ô1ÐɂÕ41˜·d‹yZ4\‡?Cš!MÊ{hÏGΈ Y´•Ç¯|4¬¤tDr¼Í=!Zë”.*ø§c./71‘ +aR¡ï±ÁÃÕ/,ÿßõØĕ"PÐZ)ce%ƽaJÚi¬*Ÿ#­tÁ›Ï°ã.o¢V!d ¹êSãÕ'Àéð‰VH ÎŽ +8ŠPޚ/Ÿ¦!¯'qic¦-Ѩ»j, 2])Åßµê‡ýëHMT)K‰Í/LìÂuXjxÞ¥¿ tö®:Á&nöÅÜ ¦¨½²5ÝÒV¬áò¤‹D ŸxD=n±ya„|+³›¬¬û-¿”û%ÒéC*@F5H\ûqm“L +Oo …Ío•MUPŠ§Æâ¼Ô4I'ÝŸpà8ïg²ŸõXHg.V„bxë( •ȸ§ÆóAM‘þÆêÚQ.¦‡Wñ¦Ð"8κӡ†$³D…2°r™w/Lž@‰iùÇ·XtÄá¶ÎË=8¦ŸRL ,Õºõ_Á¥ mÌެѸ'" OÞî³ÁYÍ=Ê¢X<¢-ôß9àÅPZÿN• eód‹KWÝƸâ0ƒô$þ¨DiDÖ¨öj,pŸv~xñèip¨Wq³'Aª*lB›×X™ÍN*M ¯8Äâ'zÔø»Šð‰J•jhö΢ zœÁ݁†8æ=(\ñlm.l3ȆE,ù¹°)˜‡ð…4Ä&&P8ê‘ÿ,óW +‡JpZ3ƒÏ2Ø&j5Xk+6}Äì”ßHH ÷Ué4ÆiÝ{åÿDZ¦J€gÁy¦ ò|'yÃz÷Þý’c “ì5îœ{ÄÈ% #|/GØp„‹³aZÏ­BáÞ¤œû®_àx¥ÅU°ö­=)dŸ 0<Ìn¼lˆn‹îÀ~RÌLÔàÿhÂ=»Ü8b}>ñ³›ÿ}söPJ‹:÷ ™=ÿ³æC¼’^¥Ÿh§0 ìmJk{òsè¹ýhCÏ5bªxšdÐ$¾ÔÁ¸ã9Š<¤h6pþuŔ2¾…x^t¿&ÀA0ɧŽCDk­ùnG¡Z6¥'ëY´ú¿Ô×sKÌ4¬e¢$ÿû4Nu@©Ø7b-‹{BͨÅ,ܚ¯9MþhDvk&&»Z”±­i7贝Ï/2?—7?j|àöeY"c’hþG»GLtÖBªéòþ+&q¼7ÒB" ïžnoihËn‘¤œ õ"Vj6§ŸÈ¦ü÷%lÚ4¯ÉX|coðâ¹½Ãہn‡' uøýøýÊr€…OC‹¹EÛVó¡¢X²+/m€N”'ÌMQ\csÏ'¥G +î©LÆl˜ØQ[q|ÿvÇP¨ã˜Üˆ>±Úž•iiŒ’?RxäF5JE£OóùºüNžrEXoå™éL’)bð^MÜφŠËRÊ'§×€wrfdb¬+|¬Ì¦›Õï&{ëý†ÞZ¢’EÂÜÆ••¹ƒ¿cù'ޜy%¸ø°ÃÕ¦ž»ÅôÈ:õÓÁ>lR»…•½Ó‹Â†gq0üEK‘jðÈ=#:·e4z1]˜™£ÚD:Etí9 (N™)Éâg½ B·Ä*¾>>nj\ð vàwõ© bùÐWÆâ·î”Á½¡|#E|ú¤ €ÔȟŠ70ZÝä„:"õ[Fº`R<¬ƒU^K”!S±Z …©Ì‚a3ಇC5{6Ñ;ÅçÓAôLz ÉVö(McZ…q© alÙè£2O^„Œ¶âÆw¶ÍS¸•;×°"/]Éä‡Ò\r¡s£Î~(dôYƒ ¿€Aª2îªòçÄE`¼du>ß™p°ã/¬ÃÅhzWüG2{1ä$ûóðY‹s¯l‡’ØMíŘr;Û¤e¬²±ÃQœX͡ƹ:ùRÇðý ƒ…"ь/™ÓMiÝ*›`Cd"Ìu‘СQ•9&<”›ÞÑ ‰˜ðN +©ú•A’dzž¤ÿ&C?~w5&”ysܙaÔµO„´½‚=³fE c‚ °àÎEübÚ9Âh©O(V“žó†–BÞÃ4æ¹± +t¥VixFía¢I~†n™jëRd%c ÝÛ/’Ãm>Q1‘Êid{ÏEý×ÿf@âÝDÄfAè¢LôùY®ÎfUù¬9lë"Z µ…SwªÔÀs0…›ÅÑ"ÝàH¯³uîýŒt‡ójšåV~â&–ë^`uÓÊ«X,ê‹0L àG…?Äë7Û)E9À»%Ÿ”; °±I”é1.ÿ¸ö²IK$EâVeøìb"­ê®Þâº_“â̦5Õc¯Lßàd̕„«[È»!Ãö]í, kôAªêð $Lz%ñêÁ“’¥©5ߪìBZíºXŸF==æ,ˆ9L éöZäÌÙÍ¡§ÒÉSQ»,#w˜ ´I·Þi§%”oúa]E½¥Dš@y›l%ÞqqzÜZwÛá~ÂqÊŽŸ:caаÐrRkWŽqûDCyùÖ@í‡2PkÐ?þó;„Q'¶¬%¿î‘1ÿ¬-Ùr% Û6è@T¿¯:\Ê~³Ñ˨µ4Z:bÒóÕϛ„ï4bØ\[`Ò¡þ ·/?|ÊínäV‘îàÞipEEËn½)D–/ª"ٍI·œ½e[BÍí¯iâó×½}Ÿ<£ ëIñþ¢¥þîCøNm‰Ì_TdH¸‘ äºp8 0wÒ´¤š¶úõÓH:™„m¯ mש¤å‰i4 &Zó'gtˆífâ\¤²§J‚yä¦*ê8¯í†@¦vâ`¦{ƒa•=$ÙfLÉç¥ÒÂužx+´¨ endstream endobj 130 0 obj <>stream +OÞK—¦ý"gPü²j™¦žw¤Ïލmh¯ $ôp¼sóRâÄТ E]cµO#HdÖ(ý’9Å|˜#£9†’ .™ÀªØ萎8`Ó(%5d4q)*?/xñL›¤HˆRŒK­‘ŸÓ¯¥¥Ã©³ÉŠh¢zN*"_*ædÉKHôÕ¡N8—ø §ÐlK@.Œà”,€v,'ÏÏ)᳢Ñ󭫅³F¤tecâ„4qšÎeÒ¥†*°¦Ÿœ ϵfR‹/ 3ðwg¤:Tž(EÒf»Mø¬¯«º¨±ÜØ ÍYºüÿsqlÚ^¹fN#Šù‚”ØJnÉò´ó*ü(DÓH¦•kJ(ß9iÍ–¶cHLÇmB%E|‘£]”ÎWj~ÑÎW* !®_CTù1»ê$?‰—Á,pe-q~‹?üÓ[ç8½;]ž9¿âY„ [× rw&î‘VÅÞ6fm¯D¨²Ó˜ñÁŽ8›%u£©íÛ`Ìòh^OY¹„ÌèGÊlAˆd£±‰X̔÷ežæ:3IeŬ¨Sý­ÀÂÇÈB# ؑ°@Fù~¾Ôìk¿Ô%*× .:áÞNø  ‚¶VQ À{ ‰(¡T·›>zYÅËAm/P>QE àzÑíE`‹¾€b$n€‚Á>ŸA!º‡ Ï\‚:†%4'¾,Sy½Y`“£Ay¾BÚt»Ÿ¿txY§ò„éó$P:Hñ‹¤ 9Q#ô_&A˜\1«G#ë488.l$V†£Aᤱt™ûÈ»Î3w¥ÐW½…®÷Úяl¡2tx_Òl$õ†Ò=ˆc6íª8÷¶|*îA5Í%¾ԁ3øh)ÝçGÌ?„Êùëu”óŒ Ìɖ"L*Ñyæ9í*gŸªb1×SAÙõ³Ï ϕ?܆¶b”‚Çå8˜ñô–EÑ|*<U[“oQ„y$q ZˆêA,Âu¦×T0Ig¤°¬û‹5¾_tì¾RTX·8ïL)̀gÞVM•G¨ıɹH ܇<07®Cõ.mVl P„’7m!«¢8¡x}&˜´ç:ýàò!¶}ƒ3À o“ÄE{(RÅañ’@&Oqñxæäãf¢ä£³ŒæÐ9´)ê«Ó…('m4¼‹EooööÑGþ8Å8S‘ªxŽ¨Z2ö7·ÿÑt¬™­€©(<\.²b}ÁU½€µžE)ýuëÈ£ÕÐ6obÜø7Ê_§ŽF´‚ã­qkÔ'¡k­ÆbI£-¾àÀ‚r~§çoXâ:ÂBEN»¼£ñƒÀ™Â~ÕiPˆdûnòXæÚìšßÒ¼6¦®‘ð8¨n=¾ä"Ț iªÁ9iÐñAR °ÍPGW~âÑt©»çð…âI MEŠˆãBpæUö×Õé>sàF¾Û‹Ç^ûR÷zúe´*x<ÀÀ›oIÐy—E`R9çeØWµàÛ|v$ä`ÐQ¹ûÅ·o y¤6`É7È~FŠ!RϴдïJ? ݤô2Å?whÉ&©lƲс®¯žisrhpô%žæñwõoñ¢ž³|Mj¥³’b¤ç«’ál!h‘H`PÞ5Ò/ ¸Ú”œÆÔG]íNzDíÛKFy>#'( •? o°QS]LɍJ¼œ–)B_†küfŽH€AE}öaiA|IyG²õəbx­ @Ë(¯¼àiŒÙã e(橑Ïn<?\,R¡ •{-=2#ïÜ3D¬êCˆ*I\$¥ƒöÓÄüã€"Ç=s';#ò-ƨ ÂؘfÂz*q¾ )ͤ͛«•W’iü}äçùñX½‚¥õ<¥,2Ì% ŠQ¸…á 4*Éôá5^­+\Q%¨Ë…‘¯`¾–·Fö…"G´n`rH¡qÕÒ¨FN9û·ˆŽHN8ÿ’†ûлóº0©2Øã="²to¹:ûsÈ_󍬮ï:$7ÿñö²}ññˆˆ‹-×;›}e“ÞÃo<"#jé±9bÈFR8Rø"-]Šêa¨Á=×DÄ#Ò ÅŸËAғö•6ø`¤##”P¾Î['OÒڗɈзô¸#2HÞ¤ËÝA·íˆl ’®ŽËEJ¤ÓFDáa¾HÉ' Îw#òP_C¼4 ÇFĔJz Î:C‘=‘^4½ôŽÈè³ÿ%n;·z¡I—¶Wÿ#’ Úé£)Ò±²ÙúEkޏfÿgþŠ±wQC¬U54YN÷•‘7›™ÒëñR6¸EGÄt}ÌóÌANñˆXN>»ev{ }DðÎMx̒+›ð¿ï#òý©‰„UÜ1›œ¬è‡GÄÜñ舙}(l†qD¶Ôq~˜â·¤drDH±R¬ó{FÄ9"¹‚ÝOnÑ ÄðL²ē‚ÖÁÛµÚtÂ[Ï°1çn…vº º?÷¢câÏ>2…êCiÌ7§Ãé#o æÜÕ6Vâždàˆ$JÇmDPÎUцÂûeD6œ+f­=;[hñS-#R™ +Õ@Ë¡¢Ó¶úWŽ…8ü€ó ¹+có‹¹íDA•ñhzïX˜\J .סéx4›î€I +]0‡«”R•§×slphÔõ8¿MQÃW:„:ÿ0”µ›lcQY´§gž =ëÃ[$‚J*Ƹ˜J#9ÒÂDÄñ,®.Kl:›".ÉÕܝÑ8ý†5?ÎÛ³<ŒÔô:+p!–" @)©—/ÈKáüJÚ ¨SB'¼çowÔýN?¦‹#ñqÕñÕêv‡ž…Ř,;ð^ˆÔX¿Y)g1šrÃ\š/öÛGÑßî?jªln´·Î ð4¦Ã@ËÅÿÁ‰3íÍçm·iúoÁdt3F"T’Ç ØÞÜyù(µ€úaއ‚¸/Fìό17’Ù«¿|2XÀƒèÑ{ôJk"WO9fL4Öނå÷½@ŸRu\»ú©ë…^Øîwž˜Ÿ±\ˆlåMl9=aIéð<Š 2‚, |\!²&ˆâí€Ã2 +¼[cŒ¦³F…H˜Ý14ÿÑk‚°þ!©y0ŸEÍ©¦g˜fw?Q¢é+.­ºÜЄ†Tñ=Cr*}{ +ÙsǝTååÁ–L-½!B“tzÞOZ6pWW€ rÄUå±õBˆl㨖s‡Jb5Bˆq×eÆ5B<:•hn"pÜE€ÆÔ>Å¥GØ™ír«g¦`s„CNÂG"N…HÑ˶{™?ƒSԄÈÌöïX‚Ü ‘÷È …n û¯ú:ýâHˆìÌ2܄"L%'í¯Sˆù«ƒq*"¸ +aKŽ`…H\ÜĂ-á!‡0¼y¡SD"EÍ-7%ý`(*³qþɟ­Š:F­ö yx} u]8Ύ/nk)D*2úËÉÀ4Ð`”´h6rÃea®z“Û/U…ƒ˜cý’³ö·B¦BÄù19ÂŚ¼þÜâÄá+B!b€n¨o‘'8Š£PˆØ÷(”.+D$aeÀâùÐ +‘s¼+¶]€…Ÿi ¦O9x ÒËÃâ'":²ýÓÎvڟª€!bD…™9È ˜îÍB$ՙ ¯Ëæ܁í³ZI*†£€7…H)"!"ÁSQ dMt W¥%r„¸°¤þ RãÊÖ.-!DÆØ5±ÏBÑEÛ+ÀóƒQ…Œ"Ê،P¨Œj· +‘gòÒ;´¹U@¼Ü(Îß©ùôßSjæRýþ‡  A Áw7±~!²ãsV(ÓÖ/D ÆәƒD9„ˆþ ñgbFáK÷"¨­bҒC³,49i1©ãõPEˆØ®ãî6YtŠéHõ!ŌÛÿd• zqcÈ¢8µÝèæäÖX(°2;þDþ;Õ3ûíàßÍá=BÆoÚYÌ0´"<ÙåÓ +Râ?ˆÄ’ŽCϊ>ª¯øÔÒ&›fíÉ× -âOÎr¢ú,oKˆh0Z§¥„Ü¿HüݧTU¨ïтWÖå2±’ì¡NˆÈ*ÇUV©¡—ü‘tZô,þú‡üý3:}òsƒ?›ŒÝF@Ø-^6*b¡z=,0"]Ó¥ƒ–l8Áý¿þäyÒd–y±ÜÑ°g9‘ÿ¢ûun þ“­…¯ñ +"eáé5¶ bü‚¸£‹¹ " ÏîX¥Z^Ad¾„…¢rŠ‘p÷ª¦+!ž"OÉ΁v:ù}C:îêî3ú݃/ˆ¨o´EžëÂm©"+šb +"€hïÉtŠ‚HE×)lçD.ˆT:Ö Îì>wTqîÓ4s… àÆL«h6AD÷þ!°òXò ós‘ âv«ê¹Ï¬¨]‚È´ ÒàùAÄ|K¥ø2RDÜ<$MÌH9Œ€Á¬øÛ{@],}˜Ab\¤  ¼ÛMAä¶:{ý¬Ctu ò¥ñ.«áOE'"ŸÔi—¹›=#¶ˆà]9œøTtÔUSZZ7äy¥>ÑM Êe¬$©@¾&OÍ 4n‡ÍaEå'ʸ7d;H "a‹ 8VkA$°áùÎwäj‘ê#èp­è 8òsêÛÜv²(Oµÿõ ސ}؂“ò2R*0,䇺H²ƒZMÔLÙħ  bfQ ûÎIƒˆ§ôcٕwë "͑Œàžƒdèþb#Í^JÚ ƒÈCBcã]Pæ4½ÂŸÈæ=¯€CÌVíöÛõ@rC®Ø ¢éëJa =0ˆí…@& Ü%0ˆð×E½›UèƒHp{¸ qÂzrLÍbM +) ¸Ïëø²â¹ø*Jç@º¾sªÀÓT ‘ “¥ÄW"x2—„—‹‚OትàƒÈ¹„\wÄAdü{?ª‰»zPyñr åꃈáø¶¿j&êslƒyÎY"ÂÁ†Â³óIĄˆùƒ¸ŒŒÌ=eÕ%DÇø྆-9DA¬\ÐCzB"ùñ7ù•ŸºñÆóÜGB$\º(_Ä:X·AY½¤òw—’@5â¼$D\‡K6ú îžFpIˆäYŠ$؛M"Dþ ƒro*Û €ˆóý=Ä /•ÎJ»<â_Q[0ܚp~E§)Ò¾D²"*§ŠdϦÐÔTÑ5’z†BŸ°A$»øB0º´÷æç¢l¯…C¦J5Š„J=– ¬üþx¼úDˆx[!{Ýh=¹.Iq@4›Š]ýPÃQ?p:ûíªFGýF"Òh*Nµý]ûL(ñv‰ü ¹Ùz»ëÄ!Q‚ Y õÙ±Lˆˆ§¡Î˜Ú"o-iobþ¹ð½ ¡ˆ•2TÒmá¶8MuÔ"3ó} n¹¢NUv}‹D\'Š(/8#𣘠+îÑa4Îr)¤QõZËy`ú6)¤Qe@.p'"äì5x,ԙ-üE$ +š1ç^ m‘= +‘ˆËí€Ei‚›Bd.ÒbyÆCE¥ù°ÅÁâÆ£F!™hbxW=QˆÜ"•@ê¤!×%2oL>³î*oޅÈûqÛQQpD ‘¡Žu¾\à‘É©¶ kkí3¦º@ ‘Ù;èb¨‚'Tq ‘ JSÓ ‘$í~ÃðÒQÍdú`Š³ÊÙln ÜO–0Dîí>~N´~ZÝJ †ˆ3)ƒˆåÁî¢ í÷VRI3 Ðiÿ^6ç*èÅ÷™f&‡cñvˆØzˆ]­At:£‘ý£c|D´k­î£rˆ ñ;U“/*‡È;ÝdÝ¥35¤€ý='/‰´`c”eÔ!Ò- èà~pˆäQé|KFƒNÃ! ü‰3@ÒùÏUmZ² nuèü- @;فj’›FĹϖT‰!ð†È……®kŸê«!R¨[M5S ñ|iõÐ͆HÌ=á”Âß:DàçØÚWù7éÐ!ŸÖp ´¿¼Ã÷ jBäŹº!b<[C©ê ùYmˆl³(¡h,Eb"¨¸ú þ|ŽF‡èlÖáÁ…*á¡e¿°öV͂ȏqP1 [0‹^U§° …¨ëS܄92䅓‘äXB뤻´}x{BJ Ê:q‚˜œ´%íB&x'Ã9߉}â±KÒnLw¹Gã*®Ì¡Rm‡).dՐëùXb>öRи]âÜËxÕ41l1‘Ìaï£ù7ªA/Ú帄¥)(£]°–¥ÉžÌ§œƒ×û(_⢭Õ5!b»$æ|fžº U£vá&B J}’|QòùñUO|³ a²¼ì¨)DBÿÈÆhYà>L¤%>kšûhÄßéN°’EM¯ØEE# R›XŠkÇ}tHÅxp+Q`—0H²ÞÄ.ÏÈÐS¼=ÏóŒòg"4W‚‰j’DfØè« ;¾IG“?,‘Âk¸ìâ^°À Þ°’îÚ +íÓ¾QO®ö9…H~m<­4§æ€¾ Ïª"؀]lxÎÃáÂ$JÈ.[¶ÃiÕE̸æõb³@VI œKŒ]˜Œ2+Ê f陙šv!ɸkÑã äD[ "%#uÇÉçbƒ!ê0âñæBˆÄÞüÎc ~P"­tç”54™ +!žsQ'H†ù!Dö‚'©Súd`©“rŸ®‘šúÚð£#y©óøx›ÞZþ‘@'©]ã‘óc@• ¢‡ÔÑ,lj€U)AÄ7RÌj(÷›H)ì¸i\)*‚È3âxËéꙖÅQKGvõûÑ®»ZD®)ò؜Së*zr$â1Ýø—07Õ)†³¤Õ8ö,}ª …bbpÉùª/ADOÛÊÎÀ+ñ^Vž›´0gë8 "Hi˜øÚÀeÒ ‚àÔóCbÒî`si!V$§¦“ˆ²4ˆͪ«ô$`Oü§´Uibfo‚[I‹â²«ùτC”É +´ÛAÚ&ÓGŠ;RK0öàQ쟅Åx°û©"‘8«]¼¿;þa^¦–«‘ØÒºäj;~É™jA1…°³f>ðêuÎ B“·Pðëwg¦¯RƒTªø…µ„ˆ.5äuª?`,ÑƁ'÷A„;Ò.QC\S…¤ n׏º2 åãRỎˆQío´ãê’÷£ò´,,ß=HGx¸"µ:CDýû* »pÈ4w‹‚ç¦p¼úl¬!!¨Â¬,-\1xÄç¨Ñ†ß!£åqJÖbzÖyÝÖ:ø½òý}y8Ûh=¤"Å u$H¥[¥"zÔ‡Ü?"[f4eú& ËkŽ¶CtÄ ñ¤Å6$ox‚-gÛ =îîþ>FCÂþ¬D‚ðQ²L”IÐ\¨ŸDR6ÑØ/s§H">‘Ø?o$6lUDº%á.T"~TPÛÍOGö©¹ ’w QhtɃýAAdP‹ð,8Q„D8ÔutˆTØe-¦þlUüƒÈm"Ámºía–T¢È!ü›ª Èt¿'BÁ8Õ r³óBÜ_ŋc-Ä×ÊfûRµ•]® ¢aIp%ý +"œDÐíW¹´ Øõõ‹JD®}­Ed¸—} +ÆÓùIñïÖF–d˜úq>[ˆïÉÍÌˍ bcËDqŽ[Ây« óÑ4L×wèb—f,[MÄ)@ÙŸ®û½¤–øŽöj=Yz…[ÿ· 7(ˆì+ùÂ鎶Œk  òŸ°™Ðû)_ ˜ûhN4ˆ˜¨A…1ß*~"¾kÎ>X]p "iñEœÆ4ƒY|y•´DŸá„`>ÑVÁ`‹hü}€ôIÓ\?Q¸}îDÜ0pËÓ>LÝuÄ̟³Df˜’Xï DÂ8T +g&>›sW¼À{o|Ÿ½&ÈôµõžÆ ¡@IAþ~D´ àõ(Ã0ÊöšWÅQ&Òp$‚ˆYô=;ە2A$ˆ «»óTÜ ÂS:‚_“w‡‰™´Å.Ù*• ¢eZpJC„õ'oHŽI:“2وʞI>Øû}ýN£ä}%ÄÞí‚iå* Q(§è¢ˆ ³NSÚêÓ»ó<£óìÀòÀû`nÂ5ñ¯ý–ǐ¹õþ «aéõTki1 +>1-HÙˆIû4]ƒ˜p4ƒÄ?u² ɯ›r@qÀ/š¨ˆ!e*W4Z9»‘œÕêh "±ðš—ô´7¸_Áè ð˪´=«Œƒ\ÔH>צFt'ãÿZ¥ R|Ä‘»2ü@ú‚jdrÑUy«ƒ¶V’ÚùÉL“ +"iÆ\âI¤¡+£Û}–™x낈ÆX‰@-=þŽ»’·;bÕyÒÉí¨·S“/æxŸË‰bTDèƒ]ùÎʎ† KA„wû\ÙZ2ô "éÎْ‹Éš«hi ƒ`:kÓֹ¸Èªk©aŸp "|mÒöŸ‘ð "T:ÈA{ýõ3ˆTÞFÏ(©ƒÈ¸QÎGœ±Bè4ˆì˜û$O + „¸MŽÆköPfÁ¥‡ò´õ֞á‡ìÝ°Pû¶Úש^®åzžé‡XĦ#vú!Ü986қÖzŸý‰ÜeÎ3ìî‡@€àQúñ½ž8¨’ç‡Tãʤ°9§¸`?$ûë\iôC²#¼>y=þÕìA6£~ó‡¤ÞÌ÷iP¬?äæSzÂÀÜkøCÆöH²ÌPxqþøÀ_Àìèƒ?\Ph mKŒÛ•oó‡¨{*-o‘:AŸ?¤8ÎBá÷B áÉ>Oðùe(±ÏXô‡°'ˆ;VŸ§Œ{i 8QÂßѹšHÅE «É®„ò©ÞZÈ-å†?佌=ð áIªèY¹ÿ—séV"fŽ~ÈbrüãÝ é㇄«««º2xû§_èc¿<É(ð¨ö!uœÔÕî‘‹¸É~’9RT;šù•}ÈÓÈڎ÷å¹îCvhc,gó!D"TJ‘ñ^m¶çˆõ›cäCÊum“'æC j^­·’ü±.âqùbÊËûó!ñ¼ôÞ oQ˜|ÈSŸÀþ}&ùÔº"¹=`¥ò!œ°ç(­VùBV \ݒ=-àù–î8ñ/!ó!•æˆù«€8-ò!Àë%¤+¶|Z„E4ü³$d¬Ê‡ý¼q*Úu¸x•|>-%Hj𹶘w}ˆÇË°á‘7²’î×V%%…Ñ.\GL OŒXҐ͠ü +±Špa1hgý|ô2Eb9µêÁu™ßYí!°ÆBà«,Ƅt²ü>(ÙÜÔcÍ#“$ªâÉb¥!L·íÓ +Ð{H‘‰ÏÁUQôb2ð!¹‘4¼²ÒDÎü¢òrmƇ,âpZê²fáCfŽHûŽŽëãHñ!}f–ˆÜ^>„êϤÁo{œù:Ô5¼S¦ò!ÂÐ µ†á…û¡Hÿ‚¨d2ÜCðèÖ&“.ŽË=éØ6/"…¦{9§yûq² ×ýÝ=äðw3*åèÒI%wéR‰‚4qÙX}ýü8˜=¤'ER Fþtg™Œcp€‡ð_¹ Öö(WöÑs +ßì!”´ÞúÄËí!©Ý^»îTp°‡Pb£íÒÎÂnҏÂCêÝCçÀŸæǒî!~œ óËqa:Á×Î|HŸÝ˜þÆIæ÷‡…t‹â÷Ðõݗ’i’ñ=Äí­n°ù™ÎŒ{ˆéy?IU@ÝCcÚO`ì¡>ž"ë +v{ЁŠpÂî!ì +EÝ$õõ‡î!'x-wÉÚ1—tï!!1’Ù¹×5‡ą¡Œ…êíçC®ÀÉ<_–KçCC¾Pðóˇ¼G)Ä·nJî|ȇò½µ)~>ä÷P3s˜‡Õ|Hã2Cz`Ìòsù¿â•,ñƒA­é—Í BV>ÄÀ4ñ`©|Hu“‘eV/’C>iΐ䌰.‚Õ¸€^Hù ² g¯äC”¤iˆ<Š4>$ò!,ºüíÆG>a†òý]¶·¼g*}3Ï֓±uU}HÄ 8aý%†#ëCÜùg’W§ƒ²&;ú|䬕ýbJ Ïg"h‘±Üz>äïK¸…Oi`¦ª|H4@ˆ9—ñžÚOfÙ$¡çz>IPþë©ot +häCÞä¡ ßfÕ7ùà¬>55S†(èCÄóCµm1b/Z½ÌhhJéQðÙ=m ÚRtZ¸Æ“ áe&a¦j¬—Nw>¢_›‡wÌôÜõù–HüC¹}Û<¶u@ý‘i•¬éadͯ’£ÖÒËÉ;D‹¥¬%`jÌ"ö Â]J"»^v?‘±"CŽ7= MaŠE"2–å{šŒº +.ú£ü†±@øOŽQ;¤ ]¤ˆÀˆ5µ’ãNÂÄQ§æ#&MÜÎ: +,ýO.üè5:Ғç¢ÄɤÝëíøì1¤jÍZŸBbÔvHb’ÒQ2pæ41a‡°¹KÂb.Ù{A€|Ç7¦“’&]£˜åƒJŽÕ{fë9NÒ+–|ÇÜïTSW²fM¬w Œr¹[œ ±JÕ£ hF'x\ +ÆW” ž›ì´&øã¤ÙŒ<ˆ;Ç;”J§o§'þ\ÆõՒè¿æT·Â.¬E£CÌ£ \ÀÈPjVœ%cáóùÂÖC¼³ï·ò[xP¨XÉ·êË!³N˜ŽÒrˆ¸Òê9¤Ç¹Ë)0ÝäÎΠ¤?‡99„Þ"{çYš™ä̶¶ßçþ8$:}wu §,qˆô^ߒ.e×*yêä—+Š§Jš qˆÊ…Ö×qȓÙíi“¿Í%ߋC2_TMh¬Ã!Œ×–'Ñ0"‚5I’ž0Áòtÿ2d ‘{= ÷Â# ö–JÉÄ/¿!É8~ÃY9]€oÈ +Mu-Æ7äˆì§'T®1pHtI;;äć„â…àø\ú">ú•Gò³S‰ÒbŸù!ÅwL(õq‡ +içˆà"núb䍫ë·Þ‰y8d]ëÄeœ¢±î“‡,lÒ÷m.·àDZ/bʇ4pÈxÇpϓ!…xW¤‡0 C\WNÀ8$—wûvžGéí® ‘B9&8$ØÝފìâ‡äۈ+-Ç7¤bS‘”©¸‚oH˜©¸×J»ÔAþ†àƒ›¢\ÊI'÷ù†ÀÐjƒˆÝü~ù†dj¯vâ‚Əos/LªX1d°Kú iJ¸—hý¦$óÂ'—G€‚±çƒÖoH Ì'#ÈmãŸoH¶ã&$t€Cèúü oLè¡. ÑZdH(t.(àÎ\¥[aÂFd¢À!¬îvkL)”ØÖwàd—Š†E´àÆŒŠÏ ¾1«pÈ¡ÌîÍ^Ý°è„C¼‚„ü*|Hæpț*Ž»:ÇE6bó)úCà5Â!“ÆCêÃ!•o6Ž3÷s‡CžÞÎφðÇõ]!Ë_²À¬üùÂ!D¶y“FàΔ¢:: pãü  &ã(Eô ik<—"¹Ï}CRñæﮓÒR´ä”Öº\Aÿpˆ 8a)œ"Ib4á’$X‡Ð Ï¢B‹p3£¹wU2 mnZg ­¼{qȪ@k9øx‡€ADrÛçÀÒ©ŠCD‹א0]CÒ£AQ ‡ ²æ¹SRÃ8DޟÀ¬h‡Øwc±“vŠŠÛ€‡4E5T’wïÒa‰’Ðù1±)؆ðȉs ÙÛá£5Þ…Cô4žò*…C^'îÛw­±roµ¸v̑‡xB‰ù8À¢yq‰þ…°.otÚˆC‚a¼ñiZÂ}êûîl<ᐄjŸï¼i½ù½Û†¾Âô4²`hÔ]ÈMðָ͉دÀà9ãÕ|Æü½pì·wqÝÒ˵UrJé5í Aæåµá8žYSò:Õ³Ú¹cö@‚†(ÇXd³‰Þìu$cúü®$p>Bÿdÿz‹¼þž‡”ᲧϪo“S~•Šï^åW°í³—ÖYBïüCiޕ?ÍðþNO¿ö*éeÜ*?¥,OÅ×ځwEªŽ.Ô°K 1¬btáÔ¬[ð#äwŽ Ù×*– $®h%”…CœYDâéMÖÎ ^Ý1-ú=;ÔrjY¹‡74W/~»/wŽƒ0_ +™PTŽû͈«·Ž‘écÇqñ·P~¯Ün ú‹3ŸÉ7QþAл29[óªSi¹™ áhÜtŽ=]’Áÿ1a†dÆÆpÉIÕ +F +½7ð'X„ŸOèYrÕuÚ%X2ôÞ"SgéÀ¸¤ŽK]6EÞbÄ J|PŠùaݏ&xš§BÞÄr0“ŠøntU°Râ‚Éz Фprv ÆÅ¿ °úqÊ]‹ 2À–™dhi¨„ÌÎlÈNA¹Š¥Üª;·1þCßÇsaœ­;·U |<Ð??,¦*[-º„Û ‰“‰ŠSÚ<ò7¦{²4žçœc0_sɁ\ùAÞÖÛîÁG*Ֆ47 D#!1{^í…š•Úï¬CZ7Z›íú +KnùšË½F٘dqH³ˆ‡}’ï¡/€ ­s>Ê V s‡Îâgt‹“)“Q¡»T2õ5’‚>•hÎê ;Ÿ´0¸¾Ã[^¤·x¦ëMʄ¨„ó·%¥· ¬)6ŽZ%IKàRàÊè?OœûøɅæ^Á`§zFƒÚüÿVß:“ć.4U·æÙӜhBŒºéó3“¦=š®ÿ«`ê¥-rIœq˜¿X§Aòëû=¹FZ4ðڔ÷­0r8«U Ý̒“{ï|K››Ž|)&ÍÜ´>ØZ:Š¢¼ÞA…¦Ocó„âÄ/ã(Bü¼y>‚òiÔÃVP?·´q«È4rÐ=Ç¥PڇT¬Bªñ)讬›ã`BÀfv - €œðf>ímÖbÌ=g‚bZ¶Cð$+aú"1ï/òÇ< ¸å‰B`Tyœ[½$0ēYÂü`°<ºäˆä7ÝÝfŒà`ä¹vJy¸wA„ S£šÎ0õ¢í_æYÁPÖ¡>¡ÄeH0¶·U,ã™NÄ`HÓfOõ _.@kФCq1=~µBҐŸ‰£ 'ôŒÜl[ôY[j™°dÌ•ðغ >ª +ƒ\‘ë0¸¹ʁCXKÛ×o£ÏNi*1¼¯·3êa|j‡ ¡l&Ñ¡Õµ–óô™‚$‘ª«ç"ÆBlÇ!š üʋ†oÖ=¢ÀF²sw¯rüŽƒ¥Ë¿_;Œ1“ä¥ÒlC¹.ØsóÒüEŽG*æŒCê%Ómü)»5á­$¨•%ºsAÁþVæéà!¥ãùž^¥ÆƎGêtŸ‘‚)”¥#È L%‰æòÍDnÇ£ç9CXÓEy̏[m@ý.œäA‚¿oKöº‚/7GLÌ-ÑÝ?ØÅñ_ûzÛôí0e;Jo⩦ +ïd¾>A¶4§¦…ýp0lÀNž¤Ÿ¹TÂyvH+”ƒ’ߍ;’µ‰ž'Y~(Ÿ¸ÿ(ÃoýåE¡ì²å ˆÆ͉B¤Œ5I +¢»œ &œ\á(ÇXr}¹Jy†H0èRyâ?º2˜2“Êœ¤9à?Ϙí:[ü™€ïU‹1‘M.Sr&Æù,=kÛ±Š&é‘r¢Öüá §ƒÛdfÓ$ò™Œ¦§§„'^8™´BcðÂh™å*×󈭇‘B­T´ [ ¡±±|·ê¬9ÝY†Ð S 7•MDo@rf 0 h›pJÓË<=׺DjM‹ +£Ñp #™!a³€žÇºŒ$þà tÞü”ЋØÔÍ LQ×À~˜g NÐû_Hoâ"î"1å6*¦M”§¥7 MD/sÐ? zÛ҃S5dnEgú`+BQ à»j©O}€g2"˜üYjÅC†L/µÖyßä´LkʁŠĆ¨ËÑ@ >š>Á¢ðJÑá€vúa àðu|ïÒA œï(“h`«#ä >ĐËß#Øz!ô&QägtØ%9cÈø«Ê˜ÜËÙhÑ2ƒ"#:Žw¬ ›v !@™ªÙ&n:ÚEÔªdøUï*_X—IßÙõaøØ 9™JC‡ÇÔš'”͉ÈIèÓî$÷YÇ;Pe­dpÐG¦²ä[¹D9xVÐOX–7\ßÕijòHO9Ò>AÛYè( D¥T Ìò¯xa߆Oh"vú$K՞ “*f‡©ú:sÃÃ0ˆR£¾»(Ok§ö@Ä÷E» NŸuà¦æ´±´.¾0¥ ½Rƒza’ª«-g9ՁŒ|«·Al™–HÿeBiÞ¾ç)Ÿé^8ƒßø‘!Sd­Öè¾]°‡-ŁjE”ÑP­N’È®™­ïH9”à%ñ-h­õ–œûÚÖì›*†È4h]ÍÏ #鈳¡„»*¤v°…d¸øG>(†´Œ‘Úvì —`‘?gC՚ᔝ2;%PMR *éèæ3áÌ­œ à(uÎÌŠC/Š(Ι0Dñ&Xè ‘'nä"oBË&¹Ü5UÊԑ?˜Š)L ñ¼i•)P^L’Q½Û&ì¦Ì >G­Ãúîjb¨ÝÏ·ˆN|zš\b‚úÏÒ[éÄÞµð çÙrã;¢´„0ȁÊQÊcWÎy™Ø"V;͓‹+g¿p¹EAV+ŵ]åßm­Û—:J‰®n#H#⒞ST¦/çš8¶ËgY9›”<,a2xbÏIÒ~ñ:ºÇ£(e’‘l*©Ê9ÃLL¬xÞ!)é-‘2žd°¶\ZtjâˆÐ;U*q¡!4+¤I¡ +™FÀ´¤%4áôŠ2G:†jâ :3»4+«ÿqþ²b ̼âÝQÕ+q_â€%†PÙ&î‰çæÌ&®‰ª1q {ˆCïì½³¹‘Õnwiffwgf–wwf&–v7c +gJ„}†‡։͊˜ëÒ$zúÞP]v‡S»!÷£‹¼ Š¨$¦‹C]lWšà."¿8œ\íZA«Ä×x”R`ÁÖ/¶æg,U·P +ïžø,z%¬µ¬†…âœ)!MKüÖ Dƒ­ê‰DDñ‡fЄ€"ÊeÁZ4“ú€0“’€a1vPÄ¡(â—0¸[Äáò•6£~™b—íŽÇcq°].™R©ƒœzªiI þFŸŠŸšæ±)UT%«æë¯&¾öÂÊ#³ ;ì’30ZUï4s:þ®ÄOŒä‡_tð‰¯ ^$@J‹Aš "‹Øúøœ€b¥,E©ôLâpŸÏg1‰Ci„ÈÈԌ”ãT«êzÑ ‰©ÄAZUV3“XXEV£±{3³Yoí2æÖqÝ0¨\JÉu>99ñ /½E~Ù»1ŒãFƒµ§­ËMQiÃÌâŒHYztPԓI€}yR²81&‰OØv¾ù\s2E“ȼ¦DŠJ¼˜WDÛó™EUÿNjՋÈ{uUºJ>\Lm+÷fs"[ӛ5/M‡–—]^Ž7v6ÑTÅï=ó ×rüÐÅݐ]ò .‰ûÝ9/ÏDý‚óèšyùÈ/ò9Þ <yžá\$ÒèÀ@€Às»t6÷!B +°xÛý’($͛—tIDI·' +ý)F-L9Ž;C¬YÃðGšgI'œÇ¤'Ù¡@LDú§ƒTãdR ieRN +2) E¨„›È#PÂxLH$¥ÅVä€=Pl2:Dñ³XۅퟆÓLìƬéRgP6‚±fêªt·^ 0(}d&¬çÒd€÷ºetZ YÊŕöA§ÃyxŒÈ2†„@FiÀ§'\‚ûk_”¬Ô^ÎKgÎ|þ(¶pn_Üu¢zRÏ}’ßT…ðÎÖe9ÊË- ;™ñîÎÖ¼jDÁú-1ÃéYàeN.?Ô¬áæÆ2ïO_Pñ“b‘ÙOw-· xO‘÷3erµ- *ÁÈ6‘ÑÏ* ‡H ôÀ=Xßà'E +º3ó'Á$c(QÃûÿN–%RÚº¦úh$qz'¼˜¡&<:G&/2ÖÕJÈÏ*EDGÙX4eg|_ënΓ{ܬ·ˆ´J–©¾ÎT¤›>¶ýš+ôÀœ¼>&í£ŒîÔé‚Ió)±|ШÊH³À¨~t¨ž=%âçƒ?-òÕìÎ*‡PÈø%¶ìyi]wWH|EØ2ÌÆ\Ÿv‹„B§û´‡¤ga wÆÖڈž™ ׊;2{0¶1^j¹£·Æ©°Dé 4ÉmòÊh +Œy‘¥v‰1['D òJܼeø²S(›‹ ˜†E¨gà3î~uÖlœ‹ë“ô KC'hÑ":+ÏôJïC‘ù‹QyiD°@ˆŒÝ]‚Ã*Ì2{9‚ÂBZç,#JqTZtŽBÐ' +&®óˆcnÑñ‚Ks’5¢³ÑJNódzçë—&ÍNk5Ðd ·F9Ãrï׸¯Lx7̱CZ£ GV¸or¼BÖ9_æôèk£à`p÷ñ`v¸"ӛdS†¥¢Û‹¨~ytº:R>a-Ò-¯TÅr@y8=–_ž‹ûhêñW´´ô‚Ó-8–Í…zˆDY[=ÓqRRà¦c™Â,Ô7ôgåmB°r Óà&.[MP't¹ŠÖš,û Q…U‹ÀùÍ¤åy(ïsœƒ£©‡†“}ŠÓÜöxi*A¢ªwö/(ŒO=øü ¦ÜèrgïU4*‡­Ž!BàióB$s 8UñÁ^£˜`âܜ¹&]ÕµLÖÍ`>46M“GÂ3ۛSê9:Üm©û”Á·ë|Ð9ºˆây•Ió Í1<Áˆ/A¤¹%ÊF%v´7µ°¡b¬¢<ÉØÈ +Í €½8þٳˎ ¯á†ú™W"¶Ö–Ëÿ¶aÜP’ݝÎG}jƒ)“:~°±Rkžï§ì$H æ)mká”<7_Zp±BÂNÁ^…íÁ4÷J%«Ou„ƧkY" @ îo[Mz0 OÍs¨MÅSÜ<&,Œ´¯PS‹Oæ¹M3 f/?daÖ3$aT\5^Å_€?L/èÈü}¿©“ +Þ"HUšÛ%v( ðRµT›€7C&pwt,G‚Þ$‡ ݁ð¬A”x09ëœPKA„ɲ¬ûw <\Ø,p$„փϵI<ˆÄHÐ †¤v͉4[\ɍmá9«Ï:Rt9AJB²™“ápKX:Ì ²€Úžä÷ «¹ù°Ñ=©}½ÖÏA5êô;î×d8U¢ø¸Køš†³Á­uU¢ +žVj¸tbžùT¾´2ZùN7Må@°`_ˆ„AfV.t˜ýˆ¼ \Zì n¨ÕÂvp^‰2 &À¸v© ¥œÒöø0F…™‰úF–É°BÕ©»eDõ› 4ðƒ!ClÐÛp>©üë!™„-o®™$Œ«TŒ_‚_$V¹êÄ]0} Ê]=‹/ “ÜH€˜ý¹L/¸$tïêƒØù&'ڂxµ“«0Oo ± )f€…ÉXKéó($DiqO< s ƒSbE'!8ÇBðq½æòq’‚W÷sQ@·%9Î{éadX5\(·ÒUó'쿎uò¹G!ëõQÊ@·Ä;^¦¯ôS‘j¾uì×ê¦bQ+8Z›feã¬e°²à®x§Õ¢¥›‘ák©`œšæ'£a÷g†ÁÑ +‹Ô"€x‘+‚pq˜‘U„Ï +;ãäpšÕ£¸ØÚÕ¡uîaÄiPР-u¹Ê«q° *õ›Š¦d·Þ ° "ô¿ÚH­ÀH@رänádzÎ.° +¤ àò¯¤ Ó!zNnjÔß̙Yœ²îÎ昄DˆSN³á£é½ä +)äœÃ–r»Z”æ•:à#vWáÁzékPï +÷œêB?€bhˆñE= ÿ‘ÁAFÑÖ7̝ˆÖVBu’@Ôœ|6lG;Ð4"=a"Í }'®GUǍ‰LÄQšõD_`µ¾o ð’Èg£`o&i‘ø„.s9%øú&)µ1ÊIØ-,ÅXك‚"Ii%žŸ41Ä"—‚L8kþÙÀY¬¨Êɲw»1si)9÷9hšãߍEY ½*, +”#Ø îbÖL°+ r ïzjÌÁþÆÞ îW;Ú.Ý`ʂBS݀Rä4‡‘Ł¯²pÀ#qÐíDÉFŸ2@`à ÁaÐ4À‰¹ÑÈG)¥¸¨Üž'øíMG\˜z”IP”Ë!Dk’õÓqÐആ 1etR¸Œë¢:Á÷,SZ¬ƒÇw Ó­°Ø™ áUÃÂtGEp…}ô1Þ¨Éz˜¸`!â·7{_­:à…Ž¹þV|Ë´üéŒF6„¾-Á‰ä©}'š‹&;iÐåÝÎ}}ø £µñöîíoÍzCás½øšQälLjr8èà ÁAü£X!«$¨µ<”\‰Ž:óäÀAìÆÈ4 +í®(»«õZ‚|ŸO?ŒÓÙÛôo|¹™, ×ù˜¼–£3ò×æ{]HÖ:=R߂V aŽÓ°P5š¼È-Ä„”Fo„iu᱈“¡Ê®mDvéòkhŠkû‘,‡ÈO˜ž¯~•(ÁV±Sìbà* iXšLÎ6‡ËãiQY–2Ræ䆬bíÓ(`I&º¶¢èuwVH£œ£ƒ.­ ®pÀÉxP|¹W°Û̼ǁVŠLŠƒa릒õáÌÓ(c–ip€õÓþÑ8ê ®JæónÀÍÖÎ?åóá¢_—³þ}Pb* ™”·—ùi‚$') ÖíráFnáJÒh–xWXYYÙݵ +(­Ç´ —A÷ÃÊøì‰MP„¯Á‹È@ùïÚ[‹,ë7€Æ {DS‹ÁŜ@©-ûa€GÝé <þƒ’&!= Vš·ðndÍ>¶ÿÜxo.Ø _–hµÞ‚’&!r:Ún Ô`ƒ'oc-À>0؛Ÿ°³Vƒëè/ j¡c<”O-…ãé 0S + qoWâI¿þç» ‘WÿîmÛCÓy§5šQb‡bÿÌ-T:…Q°ÒÛ哕ªEH¨YŠŸ»’HÑt˜¯Õ1\ÀÀɱã=ÀFVCIÍßîré@uU„5$WsS›T(⫼jžó`¬$ðP +Dãâ:*’#ðË0/ßZÌ+u3‚"9A÷"ÐQ֊ Ž1Hõx³'‚BO˜jÞ+>‘¶ H²ø °t6/(t œŽ‹™bsÐ]ìUØ4ê ,8@ƒS¨¦{┌#ؽ’ÞFA˜Iá¼ rø¦fgô]SÆÝ`°íž íh.×,‘¸8„<|~±ÚoŽ½ŽŒÔ Š¾OËØ}’‹=C’ê“îüÎôßú3»½_á&c=0`XœgÞø`A~…p{è*xû +£æçC©‘ËŠ¥oƂϏ‹ˆŸ|ò%ÿÒYяßG~‚4ä;å.X‡Sm#¦öñ+“æOÙÐñÿ¹`ª®Z^4OÜöt§àU(d*Úð\̏Ž@ÌrzíÀÜNü±x«ßL£}ø ó¡6~˜Sòâ µðÍê০Y´tì_ìÐ%ï·à{ÏkÏÔá†v/êü¿4Fø”Zn“ÑôûStLn”èéCN×ˋz>.Õ|äû{ŒWsØCY.œY¹o9G…ý£˜-B» 0p>¡A“[#ò/|Ž¡A׺mç-‘TLìJÅß&ÎÙ? µ䆬ù‚¡Ÿ“wC‘⁉môeŸ–E]”Å9Om U¸Äžº¾$ÈÖP2Më1!:@O“t·×’ ê2¾@Æ1È ®Ð($Šh­Ÿcæa µÆ»ÞÔx*р=šÊd°~Ò #.ˆL÷”>êc8ÆËÆ­ ¦#ûâ[ Æ¢%k^ÔÀÑ¥ú²Ð›Õâ©ýÝôò4xŌ:b½×ç‘J»ˆ8LMáz‰h%¯rþ0 Ç J¡¿ÇöA¤A„/ˆªï¸u)© ÛÌäúÃÔ­0ØC–Ë ãâø5Ök'Œ³7±'\Eâ¨ä½h·Ê) epC´áŒ€/Õbá¥V –ìÀ–Ýžø_\iñ­WЊÇõ¿ˆvÂý"3oÁCqõG‡çÛ¢GÆö§ÕÊÏÝ|QóS!ûRÂ2ç)Èû‹Ò¸ØC¦ý¡!…ƒä´ÝAS*`($¬ùR\€æšfæÎ]#œk!EåF +ÉL/õϒ؄ƒ¥4<©£CNÖL+Þh’¼F»Z›+c:ÎŠ·¤â^Ê %×ÅÔ-Ý°ÔTE·_ᲁI¬E2g‘†1 +MœŽtU˜Jàk^6„C¯Â0Ñö-ÛH^¬¿;Ry¹}Æ\îL·9çDãՈb˜2{„ýçÀ;9H°UäêÕ Åûø”tý~4ð&¼œ|R rÑ^g֌£;ÆلöµóÝUZâá`¼¤fµ¥üÕQäëqÏB¼Qbj(¥›¶îkòD‘-ë„f@ #…:]m'%”ª‰÷I–åa:èÉLUƃtýI3ÏåφØRÊn»u˜ „Ê;ý퉡$Ȝ± Yy2á1™ûŠÔW;)Fë\àû[F&ӆ̧¦3cy·¤S=ÓôÜf“©N¡Œ’ÍU÷ÛÇzœ/wÊÊuž1ӕœ¡5ùPù.—à×i8Vhí@|xÛ6ŸøËtkªÉ; |Ë9ŽJòà;ø1ôŒU,®¡A{äVàŒëK/|uëû8>Bԛ\j}ü}Y˜ å€Ó¹‚£œ‹Â+…ØKð´X5®€mÃp8¾tÅsr%g¾—ÐË +€kõdAn6wJ! À‡–tœ˜#÷g?ô=¬QY{L{(Á>Sdjxƌµ¾À9¹xBÆ5ÐÊ^ÈQ‚H¾WÌÇ°†Ì™L";Ô ËP9+èDxÆÃ2£¨}¤°¤‚or!F»æúüQë%R›ç%ÎT»­Zupì :gÄОo»ŠeÒªà¶êS³Ëòi5=(ž™D¯~‘ÜקO¹Ò9u¤è5‘qË-¥ÏCóË Ï»b\ÿòЗ)è’!Dºh%ÉW-•.Ô¶á‘Â&VM‹‹÷ŸÂ´ÒñÁT2ǀ × ºásÕ_¨¬Y |JdªEÎϙi"4Öhçx™dάõb[ò1xF»Iaµ“×þ…_Ð+MJm 2x»U\¹pˆ£œ×\’ýŒah„§šÄ$VöOAy ºp,¦’¯@^^—'_‹ÿŒÃmYËB»'¢“1ž +GpBܾjdã#<| £RÇüüQã'¥Ç,FÌk»uW^ Ê}ƒ@ä˜Ëì§ö~´2… *Ö?ÖÏѵÂÞXfš&ôÒ} ¢ú‚ßÇ* Ib‰¹¹¡"}”O-Q+ |ڀQXÍ¡C°Ô±J*^údõ&@˜PÚ$B$§[Ÿ¨­€ uNŒy¨8Žr>°Sšú“L"9†C0·Ádg³]î%$& 3‹„4‡Bl*aH$Ø°O’ôO%\àÓ²î=•Û1°…np?KÁBg¸B¹/9%݈³²#± =q$ƒšF}€}V›7ï)$ „ì¼Ð¨/gƒOe|DMºÒÖf§<Ì@pL0—8À¹ƒÄ¨o] +îA¢ñ¡ 2}8‹¤Ba¹õ¬wc¬O*ÊMÞ¢6©Lk“†ñ°C㐯ŒŒÅ{n}XËŸ˜P%|Ñ¿¶cDˆ+(<ÆÌ2§6Gó•”Δy¦§¼eglï—s€Šqœ5«6R™ÀÝ9é¡rÄxŠè*»UöÁ¶ƒ4¶0tµt©†N¥!M°Zs&ÛG“ݼ€=Ñœ,l¶â}¢ö3¬ó>w€"°Ý$…ÔìyȕìóCû/¿À+ÑύnÔ芚º9·,) Œª¹7§v§d„ŠøÒ%¹p¶Ð 1œ“kú‘Ÿ†³ÓüHJ0Ú#0P…;‚Duc4ƒfQKúÑÄÿlqükàDHl ˆË°Æg¥ÄS2¤¾³&8+ýž8ΠlWïÁAõêzèi•è¶D õl"x?xª…úX'?É´÷çàÝ&ŠÛÆêE)H²IB‹h†V$ÿ§ÑÿÙÓ¬$°¿’ìHGæ9ÛC‰¦@/ã&é¨ðcx•cÐiZ柸7í6æÈ*, ¨Ê*& ¥í dž¶LO…ÙðRçá?¢P}ܐ¨@ōOï”ÜžŠ?Æ&Û4u¼¾pÂ#%!TÇïü di;è›×³Ê|¥,ÿ6fXõL ZŽü^š\O/û[¨iXLÁ–ŸÃ˜°r“$¾;¸"kg³'ўÙfsܝäÑ©æ+ý'Ö¿õtNˆâkkbãœÂðëçF}Õ¶Cd%Îà9˜—šVÊë!gPç_pÝÞ¸¬VÀ3(‹‰çhK(¼m°‰`>Æ#]“$ý…Yf0x\rѸòœ!oêŒ~2rÿHu33GŸŒ®[¦$´)HÁÊé m]××µ}ç\`elÆø–₯oÐ +1:÷—¢¸%À{îëðŽzK´±®,@î[Q&|JÞˌÃ6Š£Ãá ý7äîóû³ÅÒ­eºpÞg~;,+ÁQрBT*NF3 Þfvüšò.«d6A¾é±ÂzØ},ÞфøŠ}ô™ µNðõôÂdn^ߞ¤ó¹ü”¸õh1”ÉHûi¥TÑêÙ¾ñRÓ¬XÜٚü«¦;v{N–%Ý3µmô¹ÉØ2R‹/åW¬Ólü eÝz:í´%98‚¯*hc>K +)zVʼnxñX¯ C„Ðqð1³¾«€ÜH¥‚'øľ’0‘Áªì“çg÷¬aø¨S+qÆ]O„~Iœ)):eϳÆf“ä¹™r&S:úßxŠiqÇ(ýp‚.Œ|Òï œ¿’BžŽ^ºKêD_Âï– +É'Â!&«èŒބ?摘B"¼oƒdýUçô±Ë-R_ityEË®ÑÑ]8²—h[ª¡’® [Ìò<ƨ9dÔè#™9 #ûl.äGoKNôà’-RÑ®eØ#T`±±ôæVO÷'¶Zœ¼€Ì9ƒ.r˜G¿¦œ„aE<|îx ³é4ЛVi¦ë·´ØڇSÒ æ%¯ê­]±iI¿€²2@ŽWÁvF;¤7L +È#’„S¡îלó^S¥¸RfV¾Ÿª2n`Ç_èôšƼMÎíþdŒ"† è£ÈRúÀ—mI7¬PØM º92aqd<›·å¹ÝDªXýjRáÀñá3ˆ +ûisVÇâ öoª å3t{£âö`„¨V\”ŒÉ£ÇoeÙKpi©Ë}t`ðês /Eß&üw§üäÃsçqÃÀCòr9~ ·6æ ³C…&ȆŽ­Í0ÅÑļØ[^¤=P_X»Ùl üûZçò)µZƒê{ÍK!àïL½úÌu’™ü#"N¦ h ‹.B$"É \ˑÐ}¯×š  +#ïK‚δDUó¸u44˜Nö@áЈ9PÝÏÖQæíÏ Ûw $þ)+ +¢joC b@½ïžÀ53 Êk|ÅAòŸ:N9G"6zrZ~ Ê=`Uü3áUÕÙþI†&èéΣfB®ÃP=sƒšr‡ tXô#Ì|h=bƒj±ó£õ½/Š½ð@ÈÉʇÖKPÏ ø©0Ѐ÷¹?zҌûdM@JûÈEÙا0播*XÃoMäkêÔX‚féãnX±©HSB@V ì«ê<¸Uµ–W§ˆt„Žúž‘»@yÏ&¤–îéí|÷)’h{°ƒ%µ¤=Þ Äɞ8E{҈®Ç%¼õÜOß&ŸDŸ-¥ÃoR0Γ×ۚÇßK1§ˆ_´< gIe\(ϨX¾ÊŽç§¡1Ìzd<ßëÕV<{@#”ï±ÃÎt&C¾'<#/£"f±y ò(¿å4—ŠÞ¹£$ƓâüÀ`¤Ý^súj©.i0Û¶Eë«ìð,w˜ÏhˆWê¿ÛQE‰”Ç$l‡ìQ»•Úy'ƒ ¦LŠ;í ç(fvž‡~´é׸G‰pyj‚zß·Ñëסé¼G9( ­uà_eqc2qõØ®+XÍHuǯK§Xú’KQŠÀ㯠+p¼Rê4’h’ è§gÇ+]8Æ1> tÂúüøü4¹¨ _¤Ø*×Hy0üj" G¼ÑŸQ¹ˆB«™gę˜ñåÝT­N…ó“=LæüŽîª!þ–c~å˜óûH—H@r~ø³ÉpùŠœÊå¿ +rB¥‰X’,wxmî¶Ëq¾¯£µ€5»WjcÜÁ,V"›Å½ëD(ÎdêŒGš9írå'׎è]â< ïpÂ=˜\‰/ÃqN†r\á„Á¦pl[ÊdpڜŠ²²ÉÁ…ÃãÖ)‹Öσ-<† e”Áì|O57ËLÒ¢à^°yÔã& +å¿·…’ÊñAÉYÊ׊ËHXÄ@9` +ôç*W^+wY +ßndL™á­ºd³Ê0zlCxÅ“³’£u˜¨‡}Ö7Å׳K|;­:*œ:gããæd̸'§x(¨d#ÁeŒëj.ۉPK­±-ØóÃhèeœŠ§ÆsIà ¦”§*Oµé=èÿ¡YJMa)Ɖ¹ŽßŠ|ÄÒ¦ô0è}ST °Ùfо’ÕÏYuµu•MäÄHÀ†Ä A~ž¿ 2G¬¹…6]›K^X›|¼‘ @ +€.òø }È:³ºðŠ‚A°9"á¾(É>%nB™ô/Ÿ±h¥Ô9ÁUeÉ_Ç ÒC’À¾âÒ^ò¾/ýk·þ7ÿ 8-yªƒs*ÞH…üÐ'xJÕC +Vk†d…kjð¢iɲ $€°LŒŽêZejҟaÂJç{¯81î ´—¶•ßI³‚Û`¾Ôs¤ c#Ó}p‚>p™Œ$m`Øm=–YnÝ£=kHi•@ì•Ã åɾ_ C·gôlà«à eÞ*;ótr¡W"X‘Ƈƒô*Ð1ŸJØõjw°Ä¿°Ü;­ò{ò–òZ/ð€˜ŒœWõ`R?Xýeë¥Qqu‡A^$sV 31ά–¢ã(o‡ê`ÿIƒÆ=iJYQ'Áq{Ãô°Ÿ6üÅãuAQÎ*°èfv®îóÇ´3Ù¦“T >œËX_‚;WêšV $þŽ’"½Ì]\6÷¶ÚaX°6Ê`b†Â6̸›ˆ0ßÃf²D[ñ«H7'8C¶:D¥…Kà +VŠ»ýÁŠ¤€ˆc ѬùW86¾ˆ´Ä‡·,/ÿïꄂ1ö¢IN‹¡@¢Yv\ä0<ð>ý¸Ô™ÔHk Q_„%SÔ$™E'é§Ý…éøÒPŸ +ÍÁ;1@I U Ì:ò± É3¨%^½îI¿[‚Î Àêõ %J¬] S„ý#ÜHb +MÛY)¸øæÑù“IGy„—ÝCѲ2 û'—¢0ªÅJvŒJ²çQ¾€!—w”]!çùfd^$ċ,¢:/ÆF\ßpwm©ÊgPºS)ÈnŽ’Âà†ù(»&Ø}Q­r ‚¿&h_Ú6i3ªg’c䥳ùNhãõ”ÜÇPŸ€vD3ŠW&`GÌÉØÛ6–Õ­ñëïç­é­&>‡€—½/eà¢ÁÊU6 Øu•x5nê“ù$OŒ+÷ÃT—!Y?ߢ€mTñƒ¼½7%wÑ=fL\–Ôû%ˆ2÷OG~I·¬¼l/iAƒ®²¨6¯•Å°o`6;`ì"u,,ddr…}á€öùt°Ïlþ&«9’ÚIú0;‹¤Ðb×7à:®.¯S3^»Ì1Æ 6H‰I¹)rǑ¤×\$/uç® BÞ¶DF:AšXNcHUnð(/l-«}$ǎ1¸‘(¸Ó@•<þSZü¯Á!oO¤ñú%ðÝ é»F´ +ÝêI-„åD¨±¡dcG@¯íØs$µ¼¾W¿×lˆõ(ýÓ¶¦vÜh0<éM¢DÉ`[É(†¾°Ú8^átá݂¿†ÜJË `Íüƒ! +á e H‰t%Õ2CG +Œ|ø÷SvFÃtq8öLöÖN‹;JoùRÊÆ!‚ŒnfŽìØ Ø·}¶ŽÅçÿÎäè‹Ã-ÎLC!! ó=ɘú|â‰û) *Z»[×P”¸ ¼MmVbCÕܳ¬Mfò>tÏ~As\LM€¤ÇÓQ)™ '=ö™ GÉá¹àt‡ ¶Ž}¸Géñ-µ€$ì&Êoà*”ÇcȌ :Ôò2ŒêÏDj*%ž¸”´eâu„#Oá±…— C„é— B‚ãWK Y)ˆò£i¡´ÚŚbV˜V÷À Ã}|¼ü‹+ÎBÌ k*¡§ 2m¨¯]´ÄR‡Kàì81ÎÿiY×aTpJHñ?Ö ÿQPŠ "TMLéð£KƧPO~ê†à>8¿Çê)Lڑ肩³²L¢vÐmå8“ ýÀgU¦šãjÑwìÁ¶ãÁzrgQleêB Œ@ž›ëÁ†¤RAç© +VhZÄr"lè0 •j×ÃÎmÚq?—Lë±jRëZr4Ti:"Ù!ᘽßâ‡Ç§îî„J¾ÎK;”Ø+"ÂèLúÊßQǂÙ¼°¨v¬î'Ò¯—ƒý"º­±8_Žõ7¦i ÌÒ>ÂAM s¦Q*¬%ÌÓÑ®ˆsMm!Cßߪ=îW¨BÕð•ÆDs[g/°‡¦‘ïnl+Ì0ñL<«ÚÀ|>J8žHXsÞ&iÜ7"!ÖЍß-($OȂßЖa£¥r‚e‹j²«ôèÄ¡›}Š„ +³cI/—=ޜ„Ù­Bhř ¸²OÁƒ;ü +Á*g6*ZY{ºål)ª±Âê<}4[ˆ!ψÇX®¸V z$§‹@"Y EP—%»™Ãg[j3»-Ñ«7cf= •‰«¬¢¬1¤ þ©–ܬ‡â¤¥AãUªþ!l¨ÛÛï¥+¾mê¼ÀFn}GqbÏÒ¸¹O˕xá+±N;Hù̯i8„çÏÙ]1g;ümYî1íLÌqvðDÈ'q«ˆ&ùÌèCŸò„çҺӍÚ½²¥—AÍ¢‚§J3‘Â$ï³ïÍÛâ÷rH)±jK•mæn4üg㢽Þûž¹Ùh÷PZÉJûµD×Ö\y£KFÒèØK¯¡ + }ÊÜrÉ8ò¸ CI<­ái3à* Žûa—°£¡‡zɖÙlMÂÖAq ‡Qzv<>RR2ª Ò×Ég<~Gù¾#½Ä„˜Æ‹AAèÌ1C!¦(YY¼£€Ø,g´Fªø¹2n1ÀCjñ7ÓAÅÈR ~^$ê•Q·È‡<,«wœ r—ǼVLøÅóÇ,‘õ¥3`DÆYóÉ'ãy¸2$g€ú xúH£CFVù†ôPx†\Ÿöö…Œgw¤Bž™”­&¤Ùє|2/’íA^@…»EZ< „AÝÒùüBRó ú£éêèïÇò •šI­£ý¤µ[ >ö ËFü©MÎ44üÇ8kÒ#h|kW%m×ãm›ÈõÛ©ODnz¬±ï  óø^ÆÎòˆáÜx4cØ„GÕ÷ËäMkë­¸1ÅOǸk²áx*‡ÿÄêsŒC—Ûæxû:+Zú^Ž¨ e89–{ èe¨‹#Gu8f ]3m³Ã±ìJ¤Š1NV™q%²ž`âÿm "SŒ3-TšJuÑ|YuGOcÕe•–Æp$ç‹F&CPECœ’ ªŠy08¡zcD„ÆñðuPšX`€âşÑØ+"¬û}<Ç;£¼nhØxfDu3†nòÎ̈êˁâóôºø>®Œq-ÌwR'#ß6'h“5-/°¶ šÙqžvAoS™~ŒEè“Ƙ9åb¬wƒÝ.ÿbµÀU¹/~›Ÿ?Ä^ŒÌé‰W~yQ>´»‹šÁ³.ö†mv¤%¦ +Þ^‹ŽIû’pŒ‹šK‹5±å¶Åâ¹z¬µ7|*Òb1 †gÑ8õ²e±>ÀXtRfñöö#X$YKTÅN¸TOyjQæ­©øeÆùéz£â‰V.Ÿ"³ÐšbÄ_ñf5–bNތß8)*{GÑ íæE1¦ötíú¡¸º˜Š¿aA‘Y1g7 «Ìng̉B?qñ26{bFš~º _YÅC¸‰N¥>cŠ©šøÒ¥Í)+4%&­°“ȉ‰ŸCQ#¥öGT ]âŽxìJõº÷¦÷ŒX¥šÕ‹XB¨N…Šaÿ¨ÛHw¸‘M‡M(Ì1Yz7kˆ%e¿²‚‚ÆâÑ`®¦"፳´pÀÁI TÌ{/ Ç{ø©>}=\´¦¤ñ°ýCö­ÓAÏ£â(™K¶cÊuÅVÖ>ÌP‡Ññ@ûÀ`£ÒÉ«¯µfåQ]‹a˜_-†HO–J¡GEêiëܫ惌ôY³9ˆ ªeR?¿Jôöç•Æ$bL-­YX–gãýuïñyh¼$õPÊ_,±¹AŽ 9˜oIT™³¬8 9Ÿ¢eã +1,“ÂÞ`"ÝßtÅäÄ#„s3êó&ÏÊò(éËgv@‡T|è`€!AeѼo&êʀ魩»þÇa3ݼ³Žÿ¶ç‘$× ð?~Jt/ޛ¥F"Vw°øŸéØL +lR’1 ß±åޮʻßÒE2P4ªþJ帇aô` 4Ì5µŒç Tð0ÜhñÜL Ìüøۂö®4FãŠWÿpGÁxº¬Â¾iÖùégåöð+¬¶•ÉÞ›áe:{z#ÀØÒö\˜¨µfÂ&J‰G°¾1(M¹Ï@”=ö¼Xà9±³jHzò¼æÚáàz†õÌR!½dØ¼D4hl !) F`ü›šÿ'P %gÏà'lÈ©æòÄ~ŒÖU/°/NÁHùk•×é ~¨êâŒÑÜM’ÅH[š[õÇ*Z§ñ‡vÝ’’t…ƒjÉÏ\ ˕á1}ºôþž–=Á¬;‰À¡ˆÑñ‰4®tlø,ÆË¢%œmŒ‡ƒ7-ô¿$¢ùx(ˆoœ¹³E¢˜‡ªFÔ™R9("â ÞaCTaRcG#ünc¡GíË°Dø>^ªÇ<¥a²‹zãj£çÆÓº +õѼJD)Ý\oUo§v/‡h\U¶áD4ÊÀӋ¸ð žÆ$eæ\åÙDzxõ@Ó~P!ÐõÞÑúxýðDÄ^§µ›¢¹¼ðC"há“Á°ã!RX@êXRDç}ñ¡™'ƒ6p0Cě¥g htì.#-­Zmɸ$Ÿê@C ‰¨‘Õ„¨laìÐnžø„Ç E×ВŠ¹º»çë\ÅXjpå®! 0ÉÛÏÉ9È "®…¯0]‘"ò>ºû‹y9ä(¥Z‰ž?TÝô¯"Oí¤ +×ÑyçšÁC©GLv¢¢G 8äó*ë’<4wÁ<%´TÿºG¶MŸ —o[ÃVÿ¶®ÕLìc4ýWZ¤y±¤Gg¡*¯3ïÓïÕ½ŒDs§Ý2b –þV§7ÎØÜvh8h¤ M´<ä,@§àŠ¸Ýh.Kg'½´ ¢ß Ÿ1­ÆÕðIÜסÞ—{ǛÞhéuŠ?"¤›AǤh-µ½çwøQJöÜ2ќt]J¨N6õùx@Vó`öää ž^mÁçpÕ"“ÕoA +æt>( õ܏Êcr´‰oô€JI´WB_pô`ŒA…¨ þ:R/љe*J“’º÷sª¬GèE"ýcÄp±Ã’fä_Bu£`î-U蜦ð«NnšH™–BŒ9ÇâîE ¥HmP¡Vesà­¢*A\ÃçÖv¦©^•…U«Ÿ¸¹û÷äÏþ’è)ÏfäªMâåÊãõՌ͹ÆkLy + MÄ54¹fjè;Å?qÙõÀ&ãêø„H´Üb¬|Í{HÖèá!¢Ãp¤@ÔB¼˜pEëA庴f(}ÿ ½·ŠBÙG©Fdòm±g«Ë,ý ªBÆÁ#‡‡?¼ÙhL:\ª`_@̛…êNßΌBÙ cCΔ–“­Ð߈ÕCl×J­KÄ&Žb²ّÊpÃ}¨±Æ³×BÎ +úK/è„ÞîV¦{QQLQ±w+hC s!xoç¨Û֓¶Hj£3îkÑé"…*Ø&åÑájÚ¨ÇP;¼=UiGD5 +[¤x’×Ø:6IÏGñ–ÆX‚“clÑ_3†¦P’mhܺH.UX7Ð18}4»ÏÖe8ïLVÜGˆô¸Ò +)6F§˜ê>ŠŽÐy|‘hO¡ï<õUþÀèF£UÇá’wT$”þ¼:a„'gô®¬mçvAÄH®PÿI[p‡$ÓF2àdÛ +ÜqžÌ>ɱ ´ʾn¾À7çêþҔØùcšõå cTnõªJðo¢ÛêPЕt1·}þÚß}¦ÄA%U4úPýöã‰Ò<ý4ÔÅ·#å&f\§»`Xߑ]arª ´ÑRH“h² · Ô £ P–á}*ð~vŒ6®ƒ—CûçÎG½¿®ÌEТÿ%[JÖ~Ð×`žÎ9°[÷¶P¢ÿ—ÅA»œƒè{æ™èzºû|1>,}z@ØviÕ+FŠZ8è.ˆÃ^ònI4e¾¸Ñ¤Ý°67:»úD4ýé#¾·äÎöYˆY ¡]·}ÌñÎ\®ÙÐú°A§ ËÅ΃q°3ᾩ[A^sÿé|» ,n¿Õ5‚'rE¶üX®hëT—¼X%ÿŒÆ³v ’¥êôóãK‘Þ2ؐø© •ÍóLI(¿ã[‹„ÛÂCÓ8A¾„Œ°6’Ɂ‡Cعj)wсI9+>^4贙Ԅ9ž H·ÔžŽq "ç$Ê ££\=›ßLǵð«(úB#þà }ÁcñúŠ„û]È,Ö$“JªM덨M´ýßøÍNNTÇÎîÀ†…Ð"7—2ʵ9˜ˆjBR !«oâFÛ= “ ãkŠs¼&†^rÁÇ1Ï©¨2³a!áðܓ,ÇYCHs]ɦšÖðmÌ1òê`‰ƒšu=Jcs"OÇ[#ùr¨Tø´5€É,íš(t˘„þ¤È˜H£‚ ËÅÃóiÓ&€Vù]á®É(«Í‰ŸÕ­—nA–‚Jå[GY±Aͨ@~®Q`-™1slHxÞß2Ž£>Às¸ki‚«ìL¶D´„âÉ.O%f&ª:ÅSê²¯%.s˶ñãHå¡n,Bø+F>Þ–Ô3‚KÜ!Xâ!@<í­¯/ĂِÅWMÌÌë§#n˜ê ɝû®ú¿whTþ9YÄçpUˆüXGý’Ôrá€Ëz¾ñ(À‰lB˜²N[…膙†Ç *Œ\•Ø>õhcMøáò9‘ðHO™DÓ»;ÐáM˜ŠVÚfدTbÄä"ËÕÁ ÷gàÐöø™8ë1Ó•/,QNÁSog½[»îI™FÐs‚Åa-éN6=ý6LÜ@Ãi%—ÑTÏq˜ ìû¡cHalpœ—†’RCÇ|+ö]€D³@e!ÁÀÁóuЕ¾†]ì,“â°9sd¡›#À ¨jÎälΜöü³ñþΜ-j?¾‹ãÓV?1·ƒñXâ?SYò-@òñ»68XA±¼™ +±ž1$&.N~×3ê­ÓK?¥Ê ”È«“DÕ äAªÜkë>ˆšI ö4T{îQHP‚+ü+o¯ ø½øىeü%¨_Þ/Mw®7$EµórP×x97wõ»NŸ@G=Ц­ÕgM¦az¡g<ÉyerŠ˜¸Ù@bÎÛõ¨KW—¹H]þ‰¨õy€- MžM;Óð'' +ÕºÓ¿‰;”}¡1ݺ[&=™ù„\ŠåÿDt‡ù’šžè‰b®Â;Í˵ˆ§®øZH)$ñ»®Ü\¦Àz\Ü!VïT|J4ëÈp{Պäì’ù¾„ +Z‘+—ÝÂüEÉÇM¶ÜF¬H?7#ŒÜ~35.Ζ¢'Q_ HéiWØä)¤&¨9PÕÔñše‘a˜SÍ5Mí’!ݟÏþ…·å0c9YZû2pf¢Õ³0% ŕ ½08!ÜEyQ(ñòÎ0Nd¸U5JU2=‰kSX 9à¡`Ž@N“»ŠO …¡5ÀÒ–°#*0O +ÈL„g픐œâk&<6ú>i±,SÓiž£)øž‹—ßRRéõ2BKLT<.À) Vò®ÖW–Œî?©CRƒÊg¹å +:®ç£5ºúÂu |Œ%8ŒÊ•ç¤›ýù#Al!.?ÛتË²îEÌ÷ä>·‹¦ï#ų©ƒL‰3qÂMà“@ö‘“WóDý÷ԅýr²ÜþÑԑ\9 Ýk¾É[PΚͩY¸ 2=3’¦Úà Y,åÏÌWa ôÆû¾Ut~z°ñ°]Ì!¬Øô¡¨§€ÑöË¢@îûÎ/#ÕíyFg·Mِí¢Gڌ`;(ª° dXÓR@q}s¤ Uæ€Ò'-o€.)’5 Ìh†}˜kc@@á/À…ºj  jr«;1þÓ )‚Ô06BÅ  >d˜*âœ7¿Ã0¦šœ´òþÝô᥼v¹wˆÁȨ&€ÄˆŠÕ#Õn n‘À—Í"P>–vñÿWc Šóÿ/ž‘Ñ^„^-ïÿÏTB[ûÛùU… úA鏙Bþüa›Ó^ù3 =ð¿3³1ÇßcóCøOþP»ýýÇ}µ¶¡¨‚0ýìƒ%áL `ç͞ÉrÁg—¦ºÏ/73!»dðÄ>I>tåu,ÿpýJmÃÃößrÄ㼈6oj äA»öRŠ î¥ÒU¹ŽïÈÛWʨ¨&¯H«ö£»0) Aë‰ ›0yî`¯¡aõµ1j§ƒÓ(‰ˆÏå0êÙǏãÊCÀ,i¼6jÅZ’zºBk/¹¿UZ«âMÉÁ¢q­Ó½ü³À¸ƒ“ií"¿;Id?þOå?ð`Òøh)¢Þŏ# ¢úJ|q·$ŸŸ¹jÌ·C~ŸçÕꃟ‰pÕ^ìù${»V‡0x¿—¸¶šl`(Äw6îÇȄ0ûv¦íí½Lhùb!¿‹nßL!;Öc'«L)!ÇSÌÙIõ?wÔÏ×q|±5‹}؊ý+˜…ýí=f6ö—Ï÷‹1Ü+›qºþ÷ý7ç*ïvÚÊԖ‹U" Éú0øjj3ò~°Û ö!”ôëj ­Žž–ìÁYô]2Uz¹3 z‰ôØ`—Æé¡ìy*çÂp;_]¥›ó‰[•:ö• ¦[ò3#!µÕðe% Ì,vøn¤àÂKJöVؘIÁƒ‘Ú¹Hµ‘(ÇGi•EÔ0¾;ªƒK‡.ϸG‰Qêð2úÑâZZ =]ÕÀí&:¹?Á¤“ïÀñ”7d©0/*ܹ_\ ÚPÁn©;—›‹Œé–eM .1¸¢$‹q(fÔ!’‰½K•Ç®?­þ±/ßz¥¦ +u%Õ¹/ôÆÍÀíÝÜ,v‰wø¼«ÇÜû: À‹aѶŸ´³‘´Ì=¶Æ‡u8Á"1`WôÂK]6&^¦(h9Wûx”hÓk˜«l;/֙Á՜#W:}¼ß6ä,%þ!ÈB4nj8­’’fXŒ*‚ÑG+TGX¸! +z uŸœJ͑¾ß >‡¿Lâµíô‘Ö†j?ÐÆ&ë+ü òŽ– œÆy‘ +šÉo…(ÚV‘sW΁^¶–´)3‘ãàäb<éçAßTwQ!tˆy•2Áß6¬:dCj`ú&|:K¥kÝä•hœßߏk4˜IJí\K´Zâ¿$êY¶–ÀÏÔ`/•ŠgHQ4bkM1¬ŒÆTJlÒuU¶a’àU“ªžê B +%˜°òi²)Á΀[Ÿáî}á禱°Ó6ø Ö;*‚âÐuf ×AÈ:/#Ã=¡®V2vÜFp”ý¤ÕÕªžúž}aò—‘¤wª„Yï‰XÙÿ¡v“G=¼1q{°è[Cϳ¸öÎ(êlÑ_g”}uçÜWtП#ëbÛ*ö^€i‹=ûE¿O…;,ÐgJBxà@t51"îŸO֐$œU”…DûڏCÛ§ÌB4‡‡,¢5 ÙÎe–9{Le’X-u]üÁž …Ó>|/5›Hën«¾4SUôa¢õ`]oäE‘©Î˜ÑDlzÿ”ùÃ÷Pfõ_à!Y(HиüÚÒa¾M¡†*ÓCç&©Q…åÂ–Ý O·\ÉÈÇsÒ5žä ò€fº«l.÷žÓa¯b+{rëñF¯ &Q5|}P¡‚Ì/,.ÊzùÙàÚM”¸¹ëKŽž+#â©&qå Ÿ.®}mx¿f¤¢* Ó¬\U ´uÕ#ixo\€!_Tªˆ¾õ‰^o kõâ”÷;ùÅR秚˜½£•6ù¾’‚6ä]›À…Aй!jJµ2r<à§hXLî“LD¡‚òlqŠ¢Sú6Òk¾>4KÎU.¯_Ï$ÏE+²çÐð™£k¿ZÎÐ>ÔòÀÔN‡lkUÅÝic ¢ú ˜JôçõÌ°ø¤Ÿ[ü!¤!m\ZðPª +)ÐÓãN¤Åuå^QC°+ä^ +5AòËBåÄ)-5ˆ;á­¥t6(?>ÚãE\lÜ%Ùk¯ï‘š¬ñÔrS!·qòôt¶B+^~Ží:Bt^saŒ¡TÉ+³Ž}@¯þ®íb•aT}WîX»×ìó~Õùy¡™pyùÅôlÉBã¦ÂlG©ˆl’aò÷ë¯zØ3Áÿšž„\Æ5_i ‹ªt݆¯wƒÈB±%j0«†ôÀ‘ûUáHêͽœÙYÿà7ä)¥ÁiàëlT¥eÙÀ×:@"²%œ¯A·CÅit+ì™H§ŸD‚¶+”†BSnã­îa±þ<ßB""¥`bôR‚,¬ö¾c‚¨¹R­£ÊÑ!Ŷ->Q>2ŠAXyËÿo@¤yÞ}ã|Dá,ЛB²±$…L¤L— Ėè[`a)á\‚È<“d¸dN-bÀ)È)¾™Å+“ÿCz㣟æÍò|¥* žCj=Ìßõ5(¢+ÌLiÛ²ƒüU™hæ“V¯‹¾JÌ쟹zX€Û’þÁ‡-"­«9D²5š¬Oè©i>ƺ̅2¼âVüy­Šlf¢} 3S©€ò(àH†Å†| FοÜ>îÁ(³äõ#? 02j&Ñ݇Õ01%‚:ìØ1ÿØ%5­‡îù~Gé×¾»S<‚õ®³7-¹Þ_‰é Eõ [Q!ÞõB–õF7)#¸Ï´ðŠô-@ѱRF¨3ÑX̽ÿ¤“,™ÐН` Å%‘ÙxzÈMþe`ÔãaXFs¡‚},…eŸõádài1Èg“%­Ð„búyýºX\LÌNòÀ¨͋Ø5ÆkaðTšy‘ÐÔÍ6Œô­'üP@,d»éûµ0NÇé†í•ÂBJYk©‘ÃwDôðÄÅÄl …”Š€kóŠ6:¥HCGÚ<¾kÖý<à ¿å:‹Y€.òyŽ ‘ÅÎ äUJ1;•¦¡H¨8Ç[ã4; mÊ©> f^ÐMopú‰Z ßx`?êhF¶. |ŠHœ.3A9셺ÌDà Òë1liR춅ӗ‹]“¾Ž¹•û<‚ LŸïÉ2@¨ +~­þ¼T±9¯0ª^CîßàÕ¡Íßý)×é—Y„é ~ݘ3оY“$Òwˍ½ò½»žÝgY |U’™_ÔtÈÈ*¡Î­)H +^wj;¬ív7,R8VÜƑkp’AKèäÜ/z·|À1ÙÒÒMљR^Olçì1›¥ž…ˆ •‰ÎU@¦"8.ö%'Ê/¿I?¡0Äb‚¼AnÔX¹¶b°)22øâLÒ*uÖ´´èïNdKA<úh¿oÔ3ŸL‹MâÙ5$êÀ‚P‹µïá- 6Sˆ:l+^þ¨ºsŒjâ,ùgal8ä+ÞL@‘N¬-‘Wwjé-&eÞU8erè^#î¨H@àW标é0^¿ˆeɳé¥ÛŽþÜ ÙP &&"²ŽðŒBº±½1ÁxŠ²¼&­NŒH¼ño4Òv%« Dw† Áî¬Ñ´lUÍY5InWîä§ÏíC¸FÊþ±ðrƒ[j¥+K­¢€O †êóC†ƒ!H#•›c kŠü‚U|±£W‰/¤Ó CEâckâqAQp¢cÈÁ.MIžÔv5Ó{Mð0.•bxTçLýõxªÔŒB^¨ôèdNf\j7u cDÑüè:‡üÙF1º_/ƒ¨œ{ã» ÷œlô³˜ƒw©ÜZ•) º BÍzIAÉn >B_±ñãD …û ¨•ÌÏ;öÖ{Ö qÊ CœÝ*tF2uõc+@¤Ú§ñ.£BXì!š#™í֝€{¥ íN2N2š¾ù~©¤—ºÛlÐý¡Žÿr8mw8º’Òî걸5å!†á¤CÜS¿=vj¬}vúš} àž˜â&}-ÃadÜújÜ /^^„ÀÌL‰3 v/`úöõHPPÄÄD8AAAf˜¡™¡F:S“¿´>Á¤Ó‘Ö›¶ÝÞ¦ž öGŒ´†qææ†25…ZOH$=:$$¤CÔ—(‡¦u-Pgh*µM vŕ¾Y‚½bÇ7p¨m_ ßÈd»,$?›“ÌRÿÿ¿ž÷_öñàK-ˆþ‘ޏ¯n…*Ï6TZAɖZ:&Mª 6‘zˆ&ÚsF:t©ôšA¤–VÈÀZ\ ÒÄœ° äβ‚rtiA®,Ý0W¡w),XuO!3 +¤…™q ?#gºÊ‰—Ù *""]04B£«Ph@##4-†NÑ£Šý±OôLçh%’¼ÔOåD#;ÙQ'@NG(ŒFk² ¼ÓYP;Ϲ,ªÓ³ÁÝ¥Q;¦»´„ä»Jù=µd+\yšÃÊ9Á !É‚­‘–Q8CÇùh&‡QÒÓ ÝìTô͜™R³ÄD¨CõȤР“6áΫiǎ$]¾´ri²mÕm«£×æýSKNšƒŒ´1ړõ¹þ;•÷[#\ÒwÒÆ ÕÄû1«ÏYN+h†4"Ôë¤M&s¦Ó t¦)ë-g(ÊÁ¡´dÑÓ¤- MÒ4x;†wnf5²êtkw·<,Ö°hØ؎ûb±Øë‹m5p +—4ÂÁJuÜÊJ°w™ýàÑÝ_Dã6Š¨ÒY(c¤ÙHΨètTçÕ”:'%i˜+"#JeP”G⎈ˆNFHHyÂR‡‘Y‡åâTdóœ%X jHÕ©W]¸[ð +UgAhURGei¤•9”ÂKÊdLW žê/²”­™^ªZ˜&O=ð!¤)݅” ۜ*ñ´iT€u|Äk”Ë—¬,?ƒ©UE…£.ªêª¬ª²’,ëO2 f´ÎðR1纲ºyå;{' hrfËåemšÊŠÎ—eç?£Y.Ÿr¼òƒ}#Íw!™£ŸCr.ãÃ1g;Ë`v§f¦fp’O ÷„‡´Ïj3‹Æ¾ãËF¢8WêÏ5#ú÷gfùíÜ ÈƒËÊ`œÍ§9ž/ú½ î? s¼4Óí¡.6õ‹ª;R@ܦ¸¨;‡ cPð¢°@ŠÇS]ÕÜ97D X.:HR`Lž bdÆ1Ff®†@®s´°;ý @ù^jL§ˆ cÉ˜åG˜4qÌI¥ù þÛ=îçuu¢£X03Z ê g>_Ë©2,ãñDÇZ4\*?̌.5‚ o‰ð6Ô<†]Ò9ïXž²€¬úxõu¯±©ö%ì ¥À|Çb¤=ZZ°jIÐ1r"ïðR,w5ZҘHª­Ä² #ì~);›bÃîÒ¯ø;ð±Iim`óN¦i!ýqñëZéNç,5aä¸yéû¢©³þ:L\ûS£Iä’ðW<ë$);›ºÞ«Cü÷jFrà Æ0›$^…¬¨åÂԒcSFÈPʕ Ý¿ÁC˜Ad)ŽXÑȼüÀ­|‘`BF3ÓLßç'õùõÙ)D!_Tè(ã´ +àmLJß¹vFT"±'¼WRÍʤڥ Ó·QŸqGŽ.SþqTä¸@D'qà¢gDŽåú#RäàÜËæ‹fr8ó컐:»žgŸíŸ;^ „÷h­òFüq׏b{Ì¥0o Èëf]àÿµÊM­::ÈF7äÝ*0åÒi•‰Õ÷ÂøÒìà:ó7XßWˆ—Q£d‡&|3ùaßE,)c«Q‹C¨˜ó㙪Fd¨|§*R§ü†2­-‰Q¡т‡¨`>Ætu +Z¼9ŒÇÉ¿¬Â󐞙#çaZGnÛ퇸$c°Ü¿ðñCDÆ& ðþíÚÿÙÛ +Ü_¬•6y®îÄ:¿2[3€ +±ròTÙ;q­ ¬¢ÎDOK4È)ÐÚ!>nbØBf0!‚L ZÜä 'Àí“íb7 +Êí°t%7¿³ŽžúàÉú®m%ûoHöãØڕ´„ðþPwŸ8ð…¬ ¸ úæ9ÞSnmmEIKa¶º&|°d<–žÄ©Àšï¬cx$-ËǕÅèœ' +@âË Õ`Ãð"H÷×âGÆ¥AP¢bód‘9Œ¡HäÃoB+(Š.ºç‡L©ixN CYFü »#²öÕLה¨Z2EpC1綉^ŸX´ÔדŸØ¤L ú«F1«ÀÆÏïÆ ”D­ÕAõ±Íì«Å´F½<­‡,.×|€S—R9¢b#±žÝOŽâ +ŪßìίvXÁËMw GÐͱW A”q ò¤Ž¥Žñ@ë¯TUŠÉ]Í»tC,o%‚MfìBJ)êÏ­±;‹óɪå*ZIéÙ4Êlj$ê}”a¼ [b˜ãYvD+ˆ^8Ų–-¢þ¼Dþ+$iñŠxgûÌUWԻښ‹¤ ísÙßhˆƒTÙgbn_yDºý86]]Õut omÿðG_Æ™?”6ë›hèUԂÕËUدWþ +PÙ(ñªv;@ðh©&æø%j_E:՗Ւ2:sØÎtWÌ„´»¥@ºÛ ʋzv„@i©óg¼ì£(‚z¯\®¡®wy ƒ}Øz‘Xn"mœƒ@ñ‰Y8¿—D øqPéËå>S©®B~UåN°IðnV€܃v‹;i,Le†³ÂÜÀOþh·ÉanÔÆqҁùN¾!ýõ?öŠCR#-Âñd¥Ê@“!­h… °†•C!Ɨ…툉žÿã’Pg[îOf`ev"\"¤ƒàuGBh‹Ô\S€[֛ÄÔÊ «µ’“Ró¤(îô†á:vê­ +ÒÆüð+x/pfl¢ iap'+]Œ‚¨ ZPJ5Ž +±ÈIÂYNô¥ û¾‚@Wê!‚Ål-½eÈ( ¹=eì‚p7“À#­ÙSÂ]ð±¥Ä¯Ò$#¹r4ÚG+°…å’hO@䮪9ƒ·lÕÉê×ÕFëÀ5«^uҜcœašþŽ±u–½}™Qï"Âq‹¢@ôâ0œn×`‹.èùç}iwßÍ Žî„„iK`x§ºw߂Öë;ÕdÆ3â휦*Šüwã3…K_Øb^5|‹-ù¸_Äü4ºLÓ{’Þç’؁Þ3ýÌ£eZ–úHfÑgˆÙqÈ¢&pÎàó£fïz;“Fю‡HIŠfòà¸&›ÔZ|ÍÊhu`„/6ÞÏlŒMnÁgÁ~ET·Œa§yƒE½Ð*\Øon×½j÷úFÌÈÍ3SH†™d3x"i۟;Ÿ•t¡ïˏ•@[^$/5ªgw N°Çˆ~©¾P.¡:?« GPÊRD#wv—É· è‹½{jÔWìiRKú‚¬RîFi–b>ß©A!nšzšúւuÉò¤ ¤ð÷…Â×V&†aN,€êÍm1= xö$€LeíRÒß|Ρ»X—E‚Ãâ)ø³üw3*•tBØt%(±ÄpÏ&´Ç€8ø»ðû¹=$“\}5 QüÊ{Ç5íRpåXÔçÔûÀ»^œÓg<yÍé´!šÙUÎ_a;¡«ø††5ßÎUÿ+äìô$ÜöŸíég™dŒ2 A5cÊ Û|&eáaïm /Ý쭑È^íÃ&G†eÉ&`Vµ &®60ÑP<~ÔK…e…AÞHkÇ7à6y,æ#¥¼ofÕ§w'”x~}XX^èéÏéâE9zøþ;Wq)t%leÐY*ðÏñÊäÑMí,BÈn¼œŽ<ÜgK¤Ð|sCì‰Í…,ˆëÁJø {ÔìÞ4Õƽjè1ÂC–^>3 oˆñ}3³Õß­`”#Ì ú°Ò¿§^YÕÊ`äè•/€©YàM!³,ÊXË¡l»¤6Mfª L÷›7õ"þŒœDjÄàD´“€¾Ê ЙüƒQ̆îO¬ ùüµñN¾¯§8¥€>±B^u¼ÒÞןB¥?èŃš&Rƒ +:Ù)Úܧބ=2xòã¡¥Ö¬î‚øÖa7óQX4ˆó¨õ©îž¨…vÏ L“,Ån´UÐe’À@†¡ +ÿ¥cÄ]ÖqƒyìDOóYÇÙ0;Y²&¦h¢Ùžh õ0t‹@øªÙ’ª¸¹§œè.QßIU^ʼn¨C6B®¹}v ¢ê1ÃL[ô"rNÊՍ+ôªÏ=óC†~—ÄX->raц¿Ê9i)Y?ú•‚ˆ"qêÙ +n,%`˲€¥ð!0±nbK‰ÇÊnh£0üï¯äý°øaûPrá(2MB§!-ÌLo⏽¥šø«>ς©ŽvQ›Ú𫄠oÚ&n ¥‘Qeàù”s‚"à±´ñD×d›’ª¤]Š¦¾ÏR@-ÑpKw]<ຨæßâÀ«‰¢ÈÍS5a48ýŽ +òS´uà8µÚA4 SÞöhûpK¿?ÄÜè0Qþoîb@òþ¡OžÛ҈µ¡eK墬xŸû‘¾MMüqkÂČB´BJ"ºQ@1Uòœ`£ªBU(Õ¼3ûc))GtÀVzïå† +,°äŽ‘¥[-Tƒ= +­.â6ÊnµÊ©‘ÆÄå@ó$MR.]|…%&øFŠÝ´ßF0(†@~ü¢»Dˆ†bžm&±JÿD1†„ðUg¤…Z0Œ4Ë'/®& ™@½ã@OVwÂÊ÷îiÀQëUåÖžMÏfÙqÍ É-©ò÷° â!RÀO[ôÚ}]ˆap]Ÿ°zOdhpÈo1qwÃE(vµa@ÌöÆK§©,™Ø)d |6%É×ïƒÇ·H’'&€q˜Ž¸–ÀÙæàñ‹ØaÞÛG”¸¦Ârv8.Ð)1çÖÄѝ¬ekÞºôQ´ªêì£< æÀ'¶U`¼¢«cª"ö…=° Z¬4UÝb$3¬y}K^Ó,ò|ühæL됟¶Ø<Î×=…™+&~qÞÚ¤‹¿¹[˜›çBæ}ôð@ÇQÄ\‡~ß_(}MW«Þt·ö1¸üÅêÜæ¦ð>꟔ýŠ‹(Öïj"QÈ>ÈôÎÒzYÙ֖$¤â¹ún]\Ăa2À|1¶±TI¿mCq/ɔú^ +všKÉèIÌLŒ‹ÿŒ-ٜ_ƒ‰$œEÊóÂFÞ7(/RV;$ “ +x°{t +Ä3:—"¼"¡j3B\¢Îçß±ðñÀðÅk—ÈlÃ)ÈsdÑ$…$ÉGBfp%ÒNº\\÷næÁ·ýeEiRã‚jnº?Êl‚y>¦Š {Ç°"ë˜ àæEi€7“\µä…åH}…wV^¿„cÑ >~ ‰åؙI·¹pÓ{Ú’b ·Cî¹íX°I¨:’ú„ó'ҐD§ø•äÁv®àŠB(8wU38å(qñµðÖíDrô!ÿ%‚KÔb!~;Üœa¦‘s aá"\‚𧼷áTÁToسdøîÌËû7õ¯g÷ڟÁ…CTÔ tÈ\úäš÷ƒ‰S3· ¾¾þá™w¨ ‹¨(%)iÐSöõžw+Ä؀ÇWÕÿhe‰¸ªF¥"w'Vª²+SâÄJ"Mœ 1ôÈùÓpâ7°7Ãå-` ?˜ÊACžYµ :ÜDšà[ò¥›w¦kHµ–X™Ý-Ž]±uÎÁ9¬ )¢F#ž7RُE¡ˆûUö&öøèÌøD3óÑhWLœG«³[§"G°!隁Ñkp!È¥GlÏ,…å<)ÿ­©XˆzÓ¡×unÑ[ §„G‡òyŒÕ~B½8ܱ-‚H`Ùó<,‚Å@†…„Hü5ù„V–iÓ|OQ’—å´áæó¾R:Šµðq»cƒ±ÓZXÿ‘ÃàÄâ„݁å \iªl˜TX1ý%‡&Ü`×âÀ¯@gåçcº‹=gçýû•É–Dnhsïí+BêS3»ß³®Ø|i EÔg\Q4˜A«‡EvnDz‚ @YJÙÐ' ÛøùÓýzÉ<­…å€çgñäª<_( +ÆüBöÜÿ™ÊY‡•0º:è 8 &h?Dè3øA3Nû¤¢ü }©«TÌl#oêå˜qƒ·ÆÇW¸Ç*‹`(ÝÙ ng2ÌÄÃù +“¼•ÏÔd™‡6Žæ~Õô=$z›Aâ€/Ù³ˆ(ˆ~)Ê2 U¢|¥Èç@¶R—Üøg~1xÃàGHˆÜþF19Ðf\¼tߐƧ òãs{J o¾#Géñ?å½ÞÒ䞷*M®_<‡Î„8‚ú2•(”°€‰Œ+~l©k“]o~yÚK’Ö£·‡?ϲ²l«T^‹¢YÓ¹tê†åèdX§ï;F‘Xƒ¨ûã 30Aìh`¯EˆJIG ÅÒØU*Öo0ãž;<9]%RbÓp$GJ`i<òÎJ­.-²7ÇÍÊf1ŠU¤fJi]Ï=ÔJQð÷:D;ϯ'iÃN@…(¡c‚æxÑâãéƃ®púõòÆ5ÐþŠ‹ùqEÄ<œ{¹#ÝLC¢ð£Û#eLS)Ý +Û×kh.³©8ìåꁾR͇¦•+ē!! «&p¸³ô¾vî_æ;J¥ìâêòf,,¨!iª`|ȟÃõð†È™{–t(ۄ"åÄ0ŠC2T¤Qæ.(€¹n|:ÎYNœf-zI~&(ð#XœX)y`?…Ž4ã/0ÏQsΡûQk¸€ý½|ùIÇo¡=k9½ÀgzeRàÜÿàé÷–ÊÒö¤¨0!jp‡²Nu° ÐàÄý:&r@xù[—VæßÄ\šy¾báTD†ùÝ5zLfä²!iR[R{g+øgaÉQa#Åî gv¾Tn•Ïa®1NΚ¥Ç5¼ùçsMg §ÊX·Ó5[¼ÄõLùøç BÎ_ʇ~àødÒ0wÈ¡ÒÌë,:/Öô*œ(×z.ž¶åzѓ Øû€@ìÁ|g°…!¡ß¹±€IÚÉIB€¨=¤³ i¼ rÉÑ)̉ˆbk*J)j˜Å$ADa‡è)0b«cCå€85Nü¢£B ڝdÎ4Ð ,Q{†£®$wHLŽmÛY]™«%ë’ö7»n:©Ö*37°žaQý«1ŠÆ‘/_«™™~‘¹3šsñ]lُHù£vb„¦fbÕ÷ßr’0éå×å9‰3{&%džåÁv%#@LÛi›úo-âqüèI>¡?Êc#s( ¹kBÉž•Íw=/R;+â‹TàO*øÈP¸èhh¦“Å!"@|±a¹b›>R€|ò™ây,J†ˆ=,îsòòx@U¼€ìp"G½ ÄÑ&j.®«T‘H#¹RÏІLPeÌ ñ“,øµå|•¼:©,‡¾Þ%N²¼>H_ìBg8séd&î”4î(!Æuz4P +â8ÈgIM8\áè¬i íÒz}á°Ê2¨9D.ú$ȾŒæíëS"³˜â +Ûöj#[×Æq½¤àÊ=Š aÆH`4+£S›Àg;ŽØF +s+ñ{R·áÈÈ3]ÿވte²Ÿùú^ò•-ùXy'Ðe ¬C32Å°&ÌÌn”ϋ’³ ›I8iYM6ŠT|@¶þh?Í0“!ˆè7ÆzˆÚXûã/¢„Ìè´ä å‘uôΦâNkÀd*Γ?·=ý¥Ø C£‘¾™:#žì-E¯ñ󑑘¼£o@ÑÒº +r@<¥’=hYÀóŽÊÄC’fž˜Ý¾f#ï$‡‹‹ä®ì°h—kÉr +Ü$fò2~¤Ø¯Ò°A„oŠ=/æáÇ8 á"znÐÖ)SÖÉy»¡ÜOB¦×â«@)$\ÖìŒZ (ˆ…·D “˜Õ`d§XD%~K'[#ŸYªˆÉÛCÚÑ_Þì´ Zl Ü¤&RÓnt„ÂKq»·ý>«N¾8 »(_ +#×ì?-¨kOŽÏìHg“óÏÉB­…"›Ë +Ãg0´‘ù¨p?OîJÂ}-‰hùxw(÷â܈&š‰7Qr{}"öh•™¯¦Pöø¨oáõÜ ÷Äŀ4å!);¢ÂÑDa»H­}"$÷yrpº Q¤Û“£d¹q-ˆÏì\í¯·~ Ö ä¸ÒE#9Êób¨ÜY†ƒ²‹~ɝW֒ýK¾× â®üǧGOÞê0c\ ð­#Ìùpx›ïMp^.6N +  £Ü +Í}ñ/kG¤þ>$‚¤vÁM.‰Ž7TØi«”1~q o¡‡?åbÁijYü=aqÆúù­^.霔$UIÏ-¹4£[~}^ŸM yëîR <Ï/SA²³6«´%K41âë[m¿›Ç÷BØÂ<ëñYí-!±Ó&^+ bs-ìè%YkªE‰.…¥ì]ùÔV–‘©~A, Ë_ßší+Á½`΀(ì!êþÖîå2û8 þÚ,¹›´í>‰ˆ$TƒçÃ9Z £,ˆ|ü•b{=i#` ‰tüî«SÍ>zQ;%C!®1%õØk†±D.]M-ŽäY9~‰¯ÃWu¨zrµc(¹¢_ëµl'`œv²%ŸFñÅëõ@Ì: Í`ƒs8†g½žŠ̊v¾}äO ¸Æ†¿{$ßâI”KTÉ^xN¶x¹ûY8h6mbb<®Ö$žÊ<,z±Àï(ÃJ1?pÞ¡ hÝ»š\1Éâ~xÞKà°ïÐâ± ë¬&Gx°ìAOâªÞÎsXˆt(+­,Ž©ÌT;áàQʋ™° {X"¢F¡‰‚3FÍ jQs¢KHš”Ë,Ç/Ã<ÊW\¨_°w¦ì‚3­ª’.E½ìT6kZ¤Ã9ôDùlÚ© qåpÓå¤îd4Ù}3 *>,I»]²CˆT OŽŒÊ¢M¶)-¥EŽ[’(5Q,ë´ w½êKrÚ]ݾÝá&ˆS,7‡ýî°gŒTª\à¡`Ri‰ÑÙÊÒ#G” c=¡ÚBô§wÅÛåkܶtŒ¹ÍxfähÁû!䜤!jQ›u_8Z&%Nñ –öq/†= ÷§´FD2tTIçhš±(¬dR¶swæ6È,¡~W¨I£å̓‡)n1 ±ß8ýWL/Pe]ӏB @D‰+²9ÙÐr…CÿŸûEÁFóÌIŽç´HÐÀ¦T$£Ó<<ÅU€b¸"˜”)\p)9SsE9»ð¨çþ½~9"G›Ïæ$#›Ññ\ÝoJèo +¶_±ûéyñ‰b½3ü´W 7„Ë'ªÿ cÖéuÈ@«d!üLø—„Lס³a'mI»³°KÖ7Ü=þ)wÝIT/Õ© iî$¾³èæ&É ß­uWJôwM¼\ӏzlz. ÒBÞá¥SRA»V¡Ÿ‘ó=@ÉgL$šÝÑÍï‰ÿÌWS +ÏW…ҁ~MÁã랕òŽ…¦7%`ÐñQúçÑ·_î<Ú1/£û +Ò*4g6p'öXí]珄¥Ãø,ÙZP–„(wñ“2” +el:Í¡hŽÍ18‰Z@h›’£…©J&„ñéßé’$œdtZùìs— UIz ³èýQkNÒ¤ÕeïWÙ.è—F£ßóó:‡Þ ‚šV„sƒM@ãyÑ­k,F$Ñw ÈÈ[Vvd@<8ù|tUIQò©F8S,4‹ºŒ‘¡f`@͑ÔõÒ€2ˆþ "긺tÖwÆÁ“»c9&©û!ŒÈ@Ac<Ý/ú²ӆ%Pj[úãûf•š”¨(my5“f¦È"HŠø&|K'iô Ô% +–拍ÆÑ 2–ÓEDk¶ºýªŒW¶ø|Šª€Ð$Oö ² ðïJ©àì]­n³ˆŸe ™ã•ù8ÿ>A¶6…œc §êgóþ\Hõœ#CëðÂ>aîó3ç Opó¤Ô©˜£FcïTA2>n ¹UD_|¦ÞÄ8‹p¬M·‘à¡PÆ'“c9wß½n)ôÀP\ œ! ô3þj&—$c^®wÅàCg×VיȳòlT—Foíþ»rDåAsT¦’_˜éÝiý!žêÅt¥©ú0¾ŽîºÕ~°òô·ƒO]l„_Ó:«Q.]Î!šª‚Á-^rr>ÈÞº\Éô€YÅeÓéW#¶ÆÍg÷!s¢:{Cts@Ëd)Œy^±NBâÁÙt[ŽiL›ŒUäà„.f¯öIžÓðÜ(Ãrù³Á0ŽeJÖJ`Ë-ê낟1£ÀヨyZ +ˆ-t¨%T=qtì—ÐtZæ9BÎX ×qìL Œu„ío 5;B^Úµÿ½î°gºÕH×(Çî§m•LE¬X‘å17­ÙMäᬐ³”LÄ,¿é'£vÊ5ò¢ _8Fü›sž´ÅÂEÒ !†QŠÊÑ±Bi2ñ5dÁ¡õwÖÅ:ºk"/Òdú–†Q\¯{NÚ³.XµgÌT¡G@w`šßà4yŽ5¢Jx5„¤Ç ŸŠ¡K®'›®ÌàÚ Ý²)¸ÉH"q܈ÛSÇÀE±²åÌg cKˆËã57^ ¡»œàQZ/X‡¨ET\(u{ìSC&È'ttptøœ¡¿gD92øÜF'À8ÌÊY¸Ò‹> gm )å@ÅKŠ’½a9àæ9³q(ü ?BÇ+Ët4­2ðœõ·#†ÓɆEqƒc d:Ð.Ÿó¡ŽY¤ê>AYgr윴iÑBëÖ9ù\†3Ƃ0 Cfùýr$Õ|ò12*zfZq\M꾇=r>-œK…ƒÑ€ˆ–ˆ`‚‹åwXFϤpAàêN †=B«$ÂÑvm×¢p%ëg¦Uå©ùOf”²ÏØ͜^ÎëíÐß²š[åóƒ½7˜\ŒÌæ¶ìLÌ«¤òœ†mˆ1Ư?Î…0\¸ðWPÏ,™Yļ:™èAüAòªHºKF»=dQA™%€¥J¸Î¤( G‰:Ð PC$ÏPû“ßxBIãm{hÊ¥D_YU©ú^„l*L‰Có¬/‘L‹X>EÒ@‹¨¸½óå¨JÖÝð9a¢1ªyJã£Ý¶Ñä8h—5:û¥â¹E¹Ð[‘´"ùÐÀÐó.Öcª…V‹Ó¢+îMÝëñanÒõŽ¼dĀø„ j÷ èmŽd?o%‰ŠFdpÈçÁ,³,Æ"œTýqïˆpÿ2ž ö8h¾ ËT[軲 "ê4\­éT.܆çcÉc†R;KYWï™d‹x°Åb÷³j)GšâÙð4¤E±¯ÕȀÄZ —)cOYäƒDIý“ÝÕUPƨQ³¾wó9@E’k9É='Í¡ü¦È1\HÅ'Yã$ƾ…Ï&UZ*ÒR×>€L´ëï<©5îS´‡œJaƎ”Ï3¯QÉóGºï7Ëá«Xzp_D7ü¶K´dÛ9@æRF+À +z©)ÛLU‚¥R¦Æԋ +úQ|åÂ^ìGÙi›ƒò!=„ABb×æM¢-Èá_íå³AyŽœcXnûUI qÀ€„³D)hßkÀÚ2™0LPÇ5Aß º¯T*@4ò)H:,ž° ê˜یÈàˆj&ôå ù‹nÛ9[ÉÝB)¬—¶Vu¤‹‡àçâVELÙýpÇ·L·ÎmO.ÌJ ô…äB‹FZ€÷â[ãÇG +qtºÕ-’X•ÏôݛZLÄ°âß|¡ôë᥆™‰®‚™EÉøõº2%`¸q# ´gU½iôÇyS&O†ôÔüqìé…±˜I +(=z¥ˆ¦žâœåƒ¾XñC_Y_Jù>÷q9iã`!«JÛÐO"0Æ!¦h6X¬·š_¾[ &A]'ÓÒ'Žh³°žã Hë‘]哭·úKÄôŠkUµ“ú{–B•$ ‰Ù…‘±k9}“úd{;™IÒȈV©ð»ôɾn3)Ö¾*öï ×ø±)&¼ Jãß&Ö(†Ùàˆ¦Ó¿0s“:[‘Ñ\1ý€GÄÂDŸ…¸/¤™¶IÉú­›uŸ&)¶K[Ñ(˦ùˆ”U*iŠ[ ˜*˜Ì¶×@V¡A.èZ%€u“Æÿ_WÆ™4˜UœOõæ’‰'™»|¬`Îøô×QqÎjÓ´, ÃeRÓ×@¯ +ø‘`UӅy^…¼VJ—»FÆ-b,šú¥;ڞââ :•Þ D=]ªÇ}9ÂO ¿p@ɟGeL¦zýK™áš¸ó´2œ(@»{š§¼Ìv^=ƒ/Øà¤aÕ hŠ™ó{>¶,uD¢$e3  +![ÊäMPb`Öã=òÿŠ‡z=(€àoˆÃãMÔæDå…í¿ü»7 Îg(’ +ƒ“\ÑøËS8Fñ쯆„)_ecÜ+d¥0Ó!×±ƒt¥àSf‡ÿ#äeN2Ðøaü/éÖÔCro.‚D*吉B䂱’PVÞô¢ +©ï’ŽrX¦ï<sÉýªÎ=FG¥àq:nÕ;‚•…‘ ätf“´íuˆJRaFœ”TqÑ˾€ëf™'e¬6Š>ÿd#M¬Ÿ€pBXçæ½KqEªW¬•»yQx +ö¹ß9ŸºÚ´…È=BVåW´0’¹Q%3m¨o–ŠýÔMWªŠhxLÿ”YTّXؾ©$9_1»:M<ˆS†ŒWÜU# ¤5¼$¿¦bªF™d"c +=ÿ#Â_íюxÇw ¼¦ +Ë.Nu9ŒÐÜ٫猧°(…*¨BÄL!•¡ØAҍjÐY0Q‡qä,•å´\(<â4[Híö•E%^È +"‘&”UÃ3’ˆ°ž–/¼?Ùjë)ùÖã…ð­ØU¡G†Ã؁_«xr×u퓡cCV#`_®à„MÅ#ŒàÒ XÞè.b5üƒŠ Šp¾Û,¬wÅe$¨¹.vG˜Ii7܈û!UàԈU‚¸ ÁD?.â7›‹ÊÑ1ÁÒÍv" Àˆ"õV\vՆÏe˜§ü¤¤‚j BóyØkç„9: s— ÓyñõÀâ+.Ú)[KyÃ×,ٔñ]‘n>sŒ€Po]®MúbŠÁ@@ññ-䍭å­Y(rf$ôj¦g¯*aÁ+DBÇ,ºv ¤hDŒ®2u©Eagþ9d\cÁ,O !°øl{*»ì©¿üí» Øp–ÂDX„vá}Ç:°©¼¿#¬\°Æ°!ÿá ºB$U\°ö0ø÷†€¢)ºžªwp 3Šš )æŽó +NÅ|ÆʘÀbå“€·&áwþí„'ÒÔvjޘˆž¹t&¹á„ÍŒ +¾†ºx•b1ÜÏÑ ë°C~áÅyòYç¦;ɟ +æ·Å6¨Ö ð¬ûøøÀ]r‰›Da3ÅíÑν¤±›í,;ßyV|­*›w‰Ú?ÑB|£´€NI>ý¤@?ÖË9Y4„zûg× +>5 )ÝÙ¹d*³'waµç£¾OÜ܇¤mI˜kL풫XsÞx +Œ]‡^†˜¥ü6"… \l8Šø>É •ÈL0pÌÐ֐ò¼@1-ŽUªP@¨­Ü¼¨=`•x^Pi1‰zÊðí£8–bÙRõL¤“YÖK+ÓU2IÂ"Ø‘®N¿äÂBª'€*c“hðê©:`²ÏèÚñ“ØÀ€(Š¢ÔÓÏÌ d¦cÕ©UÎ$l*tÁ½Ü»×_uڈßf +Ú¶eŠ$Ó]ÀÔ.¿ Yzk'˜áñz“Ö› =ÓiËöâù ò„bÇf·Ä…)YÚî:MáôRjÉì˜îÅhÅäë w¤ ¬'8 ½:J÷H…ΈÎä^-" ã:$fˆ4Ò×(óì×e=H“äøß_¿?¹Fnr@\tu 8‹-”¤I³Ñe³Ñ#Þ|ъò(ÇB¼Áú‰©*g^™¥3áäi1IwFõJáË)¬¹÷¬‘t:~Ý„Ö5< ì,8 “³çÇÃë %x0%¬üë÷ ±âg:ñ°f9QÄò´ÏS¦ÄøŠª-‚oßañ™¤7?¤rl ^(Œð4ío(6Òėµº#'ŸGZ}0ÏÔJv™^€Ü@'đd -´T;ÖŸ€ÅÕɚ0£Â-Ž©þåãe[“U²>5HãÙìzhä]rï`AºvLJ$߶ +¡Š´<§ÇÜù¬/%ˆ&”[ª>h-|Œ²ë°Sõ ÎyP®=Ï{$,°Ä œ3d”~“UÀ@¯Ü*̶1øpj7ýBp‚wͱ”âüOTšàõå“aš•¡‘Ûû+՘ɨÒÏ«ژoÇÈnÚu*—¤ÒC‡ÏàQŸ˜÷àÛª÷ÌÌ#ËÝ jAêqaO}VZŽ;OŽºq–éJ¥eEY 1®B6ÁõêÉýú–‡«¥)îá)ëáô ÞQ)Ï!ÿRð!K?%tw2—y¢%:z sf€¹Ú,.ÆÙIöÒñz¦jÅäÕnÄ N_JÿþÒ£qÅqÁiÀ¬ÑŠ@J&/Á–þ´í‡Ï%|Žà;Պ´OåArªtsKcŒ&b{ßÑ{ƒ“ú“êdŽãxðÚÿZ|~¼ÛÓ~\R7™ôÞdM-È°Sš"imž ™¿wâ5z«ž¥Ö>ä–GØ'à¥lä1ðRxÝ°Þ6|0£Ì'‘ÈD0ll5‚O)L0còC¸í1.ä9Ð˘Q¬ïŸLÍ+æSMŸ9ºPÂè1/îÇZ ´Š…D®DË_(cü»kÜ&Ýį3t³H,r01 > +z‡Šâ®ÿW–TÇÔ½J]Z<ø$f%ä<&â·Þ!2®*5!\AxP£…áÀM‡UÞAü+3(ÐÐ&³ŽJ{³OÖ +cìÇßߘ ŸŠ /mÝQšÏ¬+*”—>˜/ͧMMފ“Wç¥Ø(± ©Ä×g·†±z1}<ÅÌÍó\N/ÞRÍ*ÙmJÚ¥W ñÓ5A³ ö8¼`°BÅVH¥ûÁ8kN™ÑÍ'™ùü4RŦu¦¡mO B¾gP'tÂòC&mI!ˆp¡Èd‰ùÊ:€ ‚m®#R¾¿1Ë4 +¿.ì ¸²`t‰-À:rnÑÊ~x[|wþ îƒÎ8–ŽB6° ¿ß5㗝'Ú6€™g }Jk‘qo›¬6ãQFcAäxB’b}Óìy–!¡…"°/hïW]³«y É!ëÅzÉ¡MMU97ÄýÿàˆÄËg'Ö )ÝüXþt£ÍÕÈ'—€ ËF÷¦_ A«æøÑþ«ÉTۗ{óàQ#XY~CnžI& Kv /è*\ìzäç¦Q{–f*uF±~áþ@¨?F½Ç}2]|›Ž‚ËހeÜ5;‰£Ðn’b<48$ÓìÉ°Š@Œù§"Pì^€›ßµQ ]nÅ%Š·îj€ó¨§ëUʮΐ…Óí0óàd°z¾Ô9(K¬k[‰"+‰ EBêC,ïǔ[6QÂÑÿ.AÔ!¿àÓ@Æ6¸ ¨ë‡è¥8zÐÇþ7Ô㣲ÅæyÎP…Û14͞Ò¾ÆÐ!ÁLúóšà+XeHì%ÄvxîNL‚`yÅPuê’[pˆ:ýyN‘•8ӕ‘´S+XjæbÄ>[âk$ži;®¸vyW*ŠćTKÑñé“r´1wçAeYˆrp͟d=º2&ˆ1£>š3ч±“R‡«½ÉЯ‘Ý€‘€¨K +•ëfۘ%RÈya¡óøÒÀ.êti¢=5ôµ¡jÐs#Ø:lXÊè™ò8þÃô¥©ñ};誠|›¿²–áfåcMŠûœ|Ærހ֠©Ù3›muw­*ž¼Ï{>»®&[ #‹¾é¡þëì`¶‘~깅Ýå¢xÍEcháƒ%*HÊ…Y;×Q aÙZ-Zðã7_7FOtpüf…—Ò#¡¥þ—Š âƒöÑvݕTð˜ 1ŒÙýªX[_8ÔIáä«÷çø(þ½·ðoxo[‚dóÓdaÔ[ €\¬ŒÖÈÆpõ(öŠJ.É +[Þt¾áVå  pyR1ò…"ýnjg"Æ凮Û~…Zp‘y/Ú¶“DÔÍ®~¨&ë +éiì~bÉeˆE唙ׇ8B²_-¬Y†6Òõ¸€á :Z%VM…ÖýbñÒ8jAб(íô¨–sìØ{¢Q€"F‚´”*Ì£ë:Ûz°PàAfeå@&±n`8rS7· +憆R¬Dñ¸!R—C2J/Rì'·Keû„†CŠC¤Ä )§±$üSí ¥¹0@¡ß€¯¼2EѾK/V¶S&ç(NøÿRyèӌyí¬£ÃE²Å:×A¯ iN´Œm¨z’;>¾elˆ™!,¯®œpãØ(Ô\"œŸ^\ü"›ŒCÿÿPº{v"€’N‚]§¹®¡ÃÔC’ÇN·sCì"X°¯s0V)€@—÷Öò‘ÒÄq½b~?úIË£Ó;¬ê÷É*°ô,3bÎ@wýó·i"¡!±°Läqá%³4B*P o •Ø9ç/àËv|BêµámáS+GX{څì±K¡§HZúúz QΗY3_…ö›wއâ ˆ•Ç­ã֐²2¨‡3„Æ–—Ʋԋí‘ßÆnwn(ŒÒœ¼LqvlÀDÀò‘`4¡#°ï(OÜ»F!ӔâíqøR—Z Θ®›´ñ>mÊ;žÌû*°û`´—ݱ„sÈïëK|™/ö IZŠ¬€L‚òŸ™TÞ#P‚ù-pŠZ ú}.×8ÐxuÄàØÃÖvÁ†7\¶ËÞÄô)Ü]¦—R™™öìÐ1­‘Š‹wѬ–|ódpF¬‹ƒE‹}@^*-ÙïÁœ¬Vj {"!ÓÜpðê'c.ÛÚì´3£‰óimçÓ~«­FwvÚIo&í&£ 3¾e&Ø'a|ò_žTKϸHp#?à§6’Mx(¾PÁEQ)F ¾9Ƨnêd[óK{,Æf‘Hªc¾½hÁ_- ”§O? ñ2”dŠ1¦ 0´ Œa]PíØmY2Õ¹ƒf—8̖º0#¿|½ÀºÈ‚ãϪŠT¼åiã^±õðË.eI“z,‚Ð Sjl+¿¤êÇƧ4ä¬Ào~"u*ÉÀ>H()á9HÒÓ̀yÊ=+æ7¾ƒ&  °<´>àWÁ²fÒ`)S „§Œ¦ÂúM·Ê°–+Ü;¡¼(à ¯UGïíëÄDÂó¾)´*øóôW Aí§Ä0u°¼ŸŒØ#Â–±þºÊötƝã¨1cr8¸µà¸êgŠ`jÚ£Cáó‰âÌ/„ÁÒKkõ %iƒ3²è½¸y(ˆk£4÷Z@Kw‘#ÞÜ—2n›VšÌV/Ô¯ ¥¢fŽ–ÝØÎtç.iPêújÓ¿i*(‚º%Á9¯¸quZ¬Ž$(ºƒ¿¬EDªÄÔJH¬|µªíX‚ÜPòsâÏA@´Á¾ ±KÃíVÅY¿^âCòƒrj Ø3C®·Ð¸\5¬N VÇœ>Éq‰¤”xœ0æ‘5–Ûú2C)©Òï«Ç]dM:¬ˆ´;×C¦[-肟t%’Ms2›ÈbÊÈôeU|')/Ë̍ŠjÜX˜Ô/%\Sž0 LõhÝ 5Q‚毌¼êx+ÙRYiJ".~š©ƒàªy‰ ð¥˜ÜÒôTD‰“K@•›éÂSç~lå«øÝU.[븩¯±Ñ+ª“ˆÃk:QŽ ¼dª«†é#ð1TW´!'dT7¹÷7rN‡¢@èq$Ìke"8»Ò5'ïy„Ò±©“× —¶ >«•3IÇLÕX–ýM÷à`„XµµwœmùŸt²¶¨ù%ô·—°,D…4ZÖÇÇ!Æ:j™×’àLØËʧ,ü>"£ú½Òí=WjÛìӀv ö­a¨Ãá ºÎ:[‡cáùZ»©‰þ5dv"ÈæÞI£nh`ÂíÐu@‰ ÁF‘VÐ"í±uß=ܐ¬½¿Ç¡¡)jqY©L¼ËŠkgáJýMãý×vP±9ÿn±bÎؾ§,Ü­chuñ¤¸„yÎY„·ñ›Œl\ÛJP×÷ïB{”€ñöݥƂ„Þ¿þjl¨ïà‘ +i,Y +ÌÓëHR= 6V“P±• J@a£Bå<¶êÊ4 µD¶]HÉIRÀÃE­nÚrk½«¥;ŏ(f(h…W¢£#IýŐ8ëç=ð;ºæ bö1Ëõ7Üñä@Øÿð›>~»+ùj˜\Úܺ^iä +LUbº6t½_§Ù$©Š³;_v¤ŒBÙ +23õÕ¬(MN÷#9£‡Þ6ä‘“§…I¯NåSl šŠYËp5ÏÄÿ1$^aÑÀ-ÖÙ»ÃO‡@el²Ül¹u;Ÿhû‘\c>K~Å pNnç 3),Èø2èç¹TâtiRgu*輸ÚÍRF.¾ãà*’YG’Å0ÃØÂr¸¦äT*·³À¨Ã–zs"ôë"Hu/å0‡ÁoäDåpŽQWi‚Õá)t7¥6 7‹zQ­FZ2W5õm>L¹“Duó;n]«zY4qCM_ Uºù¼kĺ #‡¿òäþÏú”ÔðÂJBøÜ6 ÄáŒQµ5ߊ +oYOäÿô[åÕ4‹ØȬ åúmú+°|F^Y¥5 ñÆØ_N#p=óRÅõÂÁ°[ҏßà¿£X ª:F±zÝæåz°„©ÿÜÔJÎ60ì ¼!·ƒ^—D# +1ñ}O¶@€V€|èÝ»%¸àûÚÀçá:є§}QÔ@oyÈŒiµxu;Š”à%b4¶/)&ÈÖسÃ/Æ*Œ¥K‰(wò?Ô{„NҐÉûöL\’\ùP*¥&uEЙ $¡^rëeÑóšCùÿì‡gœ!IK$÷*¯L¶{sç¦ÿgù„˜×Ò®+Ã_ ZJëûd)ž‡ÎzRWïyX½¢f?ÏU`Jxº@~/9ÁÉ2èq†[*Dw0ÝU‘ È5ÿ&²RâY'»Q½es¢TCç£Îç-§à1g£(²*ÛÛ£ìò¾ëÛ~#ñ«.ºxjÒB¨û;ÀÖªóÛ +Ç<}ÿF>Kñ ìÉm·Âc¤Åä‡Ú Ž¿SHª,¡ìh`f× +N©‹Úë + ÿKP™Ù–±ۖJ}ì@;Ü& ÑÔ±ÜùYÃͳÅUf¿“J5üï) µ¤Íѵ¨j`Ӟé"=çêہ—sÁ!/"ÔîœËl*Ñ7s*f½ + çßXfü<ÃbÁáÆa³¸Ê……€{Û1φP?ÿÛ Ë#_@áÌ‹™–ÕPԀ´t|’Ð4 ÀÄhÐDv,ü-š§Ú Ž1#€"¸%C°j§å´á'ê‹à¢³úš¥¯Ô‘9;T$´ƅ _–‘“lÙ&¸¤”­Šô„îâf˜º­Áë¥h•iv?h‚ÈXÞzÄÍQ61ÓaD!Ÿ2à ]G"ÂL‰QT¡ÀÆiüx¿Õ‡…Jd“´ùŒÎzE0MHå}Láj|#þґ¾©0×`:ø]Y/ênåDH!]ÿ¿£³§ì…(=»aƒ|)¨DÇÒ—•šˆI·.dÝ/dÖÆV¢erp}Üÿ…æYYsþòPÄ%¥@Í5–ÇâŸØ.ÊÀX«L:e`Ð@ì<ÆàŽ'²)îÀŽR„@3 dÊZé®ëVN¦° !X X’i/øԍúMñäël 5²fZÙë ÐÂRiì]œŒÃ%ۀ]K-#þ “à ÕÿïÊ ˜ ¿WÈ •Qyën6Ék0AYÅdRc‡i‰46J&¸ˆ4Õnø BÆ2ȍۭKZ%¡Dϛˆµy@¾7ý¨1v$BÁ ÂÅC\‰¢ñ('\MQ'™35ÂA×0ø°ã ‰c£ÑF¬=±x˜Åž¥Ùí‚rÊþЈî¿ôq<'dÊØ¥ÐXJg5cøGofM âu +Gõ#¢HP%ÒÀY0YaÓ²€)ì­q YÔh(§ná‡í°DÙIâ—ËTÇ¥ eIªEÕ0 ±Ô È9ºß±ƒÞ̱cÃ@—Â~3;ŸdwÓW³Ø䊱ê÷ÑmGF`£]K˜p :¨ş!.’" 3®ãSKA3=2­àHVt ñåâ)ÒKìé@´€W£ý¬\§œÒ–Rúåò‘ÞŽ†]–3ĘÝY£»âä(rÐORÇ«QQ‰3@…—γ€µë´׋†QH^ž´†Ñäތ#yIðM7ǟ&8¦1Õâ.³UæL†ˆÉþ°Pö B³(ôP”#8AÂ÷¼¡é˜/Kp…"URÝz‡šé-‘mÎÏÔEˆë¡ÿ܏Ôs ôø`´Ì»?¬À3ÄÞ¿+Š–=ëÄ68*›Š½"ѵñHþ˜w¡fMìϗÝÈy)ÞA…›°ÃC0•–ÔUÞhWËmO åªÕ+\} •¤/¹3šH…M ۚfI—!E /‘‚÷¨†nehvixT£€*­ê¢†ð cº»3zÒuênIåÂëϊ€Ì b¬Ö¥Sóy0+ºQk+*¤ûú‘ì´ƒû¶ÑNaVóxU‚6"—·Þ;Úû˜‹âgzûÍ)‚éXÉ ¢y‰²É憎¸"u|« !ƒê ,RÙ”[J9~c\ò3Úß +yœƒDSHÌÕ­¢_¥[Ž1oØÇ­x@+Ææ9o ×Gþg‘¥@»aÈ#XðÚÆT 0M$캒~soìåÅÆwî)må°>û¨ cßW•'aNѹÌü 0ي¿Øeù¿çÅ؝Ôq‹öÍÊÉÍ¢<J ¾ßcöÑJT™Ž1œíò¡† ­O+:Qëÿc]9õ¥3}Š ²²H¶½‡_MÞ² 6b‰ ã†âž¨–¼ÁRèü¶è×-ýã»o³ͲM`Ý}å´A°)Kôuij*)I#¬±X~/eÿcº‡¡Ž¤°‚ôˆØÒ`>ÿQQs°LÒgDò£‚#`ÒÒuaeÏ£>Ó§‚x«ŒÈoÃCi£«Íã‘{) aÔ4ã +I®T!ðPL0!ÞÔÁ‚ð/m½HÙ±ëù]Ž3Pýý Ài}‰ìïï)ƒc {JàØ¡y‚.4s½qÈÀиºjÕœ 1—aS„°Î‚yšÐ™®ÔüǍÐzôõ °kÑKc–pº;± nf€ el ¨j^E¢ÈÁòì’ÃÝ qRu˜»gÆw ÷c¥¨Hp‚F¢hË©1Í ‡'Î6 IÜÖ“É]Då“w4IW읇l<ùݕÍxº¦E´ì‚8’¸ŠlÈ=~”N-mê*ŠÕÚôߚ-oêŠ#³.m¨H8ü‡¸g]š‡†÷œx­'1øxsp&”„"Ü£2’—4˼íd”RÏBÞÒ+'¢7I9™­# ¢ÆwŒ +ÏÎH°jE£Bc ’»”:¯4úG,? £Ï< \ÁÊ¢ŸzqՌ¾(Ž^~ôËØKThCi «lï²øzFÛ{àǒçÊ¿ÿO–[Á„ųôë§Ã²6¢xۄ.“ÛÎ-ZÃ:o¶s+™3¨‚þQGÖ{)S‚@íëÇóàå&5͑èq&&”–÷pi3š6^%&®{i%z味;è€þ4(ëKö ØwûÅ£üä\Á™þñì ½ùüº( ڛiÂía³ÿýËXVBDU•—Tu‚ëEÍ +MÎ6ŒûnPÃsˆ(EœS÷F›ø“žeÐ\ fMâ®ÝõMÙFcmëOÓGXß¾†ç_GŠF:êÍ“¡øÓá_„GRø”6MfAÒ\çGâprˆ9ú`ðb·Ók)qðdIp.¯FL>_üŽDÄh¥G÷ßÇH±2ô? +’ð?1R㔨ÔÄ^PÂSÅÓí©q~ø[nLÒ¼C›ûØÐW0Õ°¤Ml(C1Uœ–ÊVR­l*±+9õˆýŠ‰Ëa Zæ²cuf +JúÞsM)Ƒ’ÚøÀ4Ù5é]Ô ˜ÝqJaƜ±qws¼sJJÝn!]™ˆÔԔ™Ãít +VӀç\^ +¶4pÝݓ’ÿy3w•GÜÒBZžÒ‰š°Û¹/17&Š ǁ…éœWÊf3‘hcILIäÑ»UÅÔ²…’ªK5—.ãÍ:ŒÇjØ ¼¸ýÞó¾>h–LÒ +Ì&/Œ¿Å1µV€4^rÃÿP$‘9¶ö4Ûù\@AÖëb¢‹~Îo!é °uBPCÁ˜³ z'Z lmŠ*›–"8@TÏ ­7¯!-*úì‹h­ áÐFí^Ñ4“ ‡FåՁH»¦”&7˜ñ^åi­„f"Á‡Fó¤«cŒ ‰EÈŝô§hŠÖq•¤a>8=Qíïìá‘4$¼/m#oak4IÕÜô®wÈN0J+J£¨Ðôn义{å&3hj[ùLK줄tuB]?¦Ö•G“˜¶ ÐDq’^Ï3_®7X-iKÇ_fDŽ¯A}`ü™Šôƒ®0U‘ÈÄ ¢(í©/¨È­ïv ©†×éJM­„Ç ÉcpGm*åˆt4à4!@[$^¼{‚#ŽayJJÜӏß\öæ7Ú7Ÿ‚ì=‡( +ZD jk¬`ã“×;Ö;ÃÖHÊF«1á:4áWX47ÑÙd$|´¶ß/I‚¡›!@TÌæ(é™#•JݕîË>È EÔDc«gé¥zd2Ðé疣»½«º$*œ;Ü: $–Bÿß$bÎãn”"×€k0&áPXiÌ^ç*8¦"3òº%Ъ{ |ᾖêŠv†Î1¦l·!fs1ÔTägs³“‹V~/¾OpI!¢L(NšYT/ø9/Tœ\ *˗Yå´XB—ËÛþ.Ž j*:Œ5Ñ× M´Ì…Â8ç^„5'–ÑeÐ 2,c¦óìÊ̝*X¼© ­ÖÄEXÓSgâר-›jŽo“¡º3`ã’Ñe:cU‘ُ/ÂBh•Ø®42ä4Ñ鱅j¾.íñ-¡…°Ý Qw.tx°¯@é¶[}L›&œ²L ¸b 0ÏÜï_UAº¿ lJ.5ß]~ôU•² Å-elÞãÌ}T'ýH%S¾X‘þU^+e•âOijGIT*ÏbüJá ¶âãÓcNaðú¹’ú–9S!¼R€Ûþ—5€ßctj¨€3,L +.Š)Áû峨˜ ~pߚá#ÝÎæ#uˆdÜÿ¶;ӎ·ÔêAÃ%âå.{ÖÿÍgÎçŽþyžlé+ ëü{VÁ¸•ä¢,np”e;†|őã¶Ôk¡UíƒÄV7po…h…?× þw<ϝÌDP(ù\¦¸°ðA ܵ×Ñ棵8B£Kc¹wŠšóÀ¼ ƒuLpóݽs'6x=´³‰kG^·àå’É!Éf"g Ì¡y +œK~*Á¡ÅšLo xµ"¹ÆzQÃùaÕö9Bÿ_r)&T Æ$öW…™t$ÌR3¼f¢F’#z͆ã~=&²Ã™þ5ÂCØryŽ{nÕÉDŽØÞÆb?UÃ7uÏð€Kþf KO(œŒ| ‹ «á ¼Äʌa鰈PA¯z=gS^…`ib{¸ÛAÖÔ‰T],îºTÿv¿¾sM„$ƒ/*˜ ¨Í-‡»–0Ï¡>‘Uˆ€Þz8ܲ:2Eí°îòÃäZÍ.¥NrßâœFçúúÐè:K½ Ö÷!×±¸KhÅ;,GZ?ÃÊۂl.ek€'Gä Œt ¸3AW|ýØ‚ëD/p³’{0Iˆ‘l +c“hõ{&ÌzAµçæž)0z¡ý`mCµâøö>&³:åq}oß¿Åwh— {?S(õ-½½ŸšŸ¼©C—ü+rÎÎè«îŠÎÝ„ D÷l²Ô˜¹µÃ’{çSF܁ºf׀·M¯ëí.7`¨Ž?œ ?‹w™­âáK^¨!³$ã¼b‰7,Ì ôJK4ÂmúpXÃ0hRg%wÞ JR ^±=;!–lùŠã‘²8ÈóR æ ¯»¿ ;ðÔ@‚»„ ËÔV¶N`¹r{Ÿ&(Øís‘ñD÷ojgÝÿV3”«BL³$ÔGHj/à‡Û™ÖCX<.Ӊöz  +×n7 ߊæùKÍ<ˆ™¾ê¨Èx³Û£=¢=fúasBŒ—Ð!&3!Ô>—>MCêÅWó=0#f#!(ÉÏ#ÍìÁnçžê!ð‚^`1“[Á;”oùK ç—òØ0†ÇŽ®ûl0®NbÙÅÊ4”ã<(Ó$k“ó2ÅC,ØížÕ¤q`ê…Sv–ˆsvيPaÖæ=¥PýŽHd06ûnH-¦2\E‚‰7ªŸIw0¢¸¡ÆÒ¬ÆéZ±Ë§XáɃ\¥ŒeŒsb'¼]ŲQ¼O ïͤ°H1Cûnç.Aî#nus _Ø ¬§±1®C.éù€–ÇÃÐèÀë'Æx夣*ÜHàz$ +xöW±ý¾€b¯&nÆó2Êå7äÑÌÝ`ÇٜËAõƒäԘvÕ_ŸgÀ¨-à–àõe´—Xá$Ò+…™z@$Bìf!E +Ë¿õƧ۔Á døì{ÓBß³Hj ¾{ΡŒˆ5¶g06˜{öì¦,ˆ@3 ’z)§=Yç‘q ˜òf2²~?4– ,½ä,š›Ì_F/êFoâƒðuç;IÆylV×߀Â&ã[§²ÍQ)àò5Óÿ Åq}5ݒlÀ«æ¶Á–uÚÁ®äðDÍí06ð˜÷¤H·áCCCAig[í씷ŸC'T–i73333333333333333333« Ù(ÍÝ®èdÇ»€Yˆl¸“¹«Á'Iæ¯ 7#-x"8’‰†•²Â¼ “‹X–YšØÌÎP¦"ÈdÆÌ8ÁT*܆ÙPŠ¢ +zRÒ‘dQIHL³­¥Ñ|Ӓ¥‘kžrC“—¿Ô9ÆìôÜ!bò®$‡åN„ÆÌpÑ ŠÉS¾|Eì¥gùoõ´§˜…Öd¾æz~›‹jŒÌ†*˜Y‰râ1ãÊC\WB|Ò,7Ë¡{ggÎIÅeŠ ŸØ?ä.ƘWV—5²69sê.ÓbØ"æä‡åáe“©F|Fx† ¨ôƒ’€Hˆ„¢A‰ ¾& +¦HPlh¤Œ|p>’†ÃÇ@Â@Æ1bé`ID ÖxÄrÕAR®‘t>…˜?xB$xù:ºŒ…‚ìц¿ö֘nõ +°F÷-’ý“ø'/Eoý=ᄤ ² ‡¤9žß4M É^¥†Ä€yѐ4o ”ÁSÌPM2$°$ÏknDÜ]n4èi ý£3–$;ûG±u DµMŽÎLx®€vÁª—P¨^J +Ú$#±CèN!©óm%íšu2‘"é 7f«¸­W}?«V|눃 ø¹< ΃įuŠ×ÉNEŽƒ$Ž±'›Nj‰y¸O0ÓðøJ(䂄Ç_ªm2s' áâ=‚Eiew$`óK£¥‚oÁa %¼º¯‚¤Qk¾H„ØXOõòtݏà rÞþ×nb‰ ÷¹Ð5ûñžÙ˜–Üf¶áßØ$“™ð‘5BdxD¢$ÏépYèńúlíÝLŸ‰ +<²¡‰GŸD”{D¦o„ƒw¤â]Ù\êùÏ ç«dFù#ˆÀïTðGšúeækݏ܈}ÃÉ >$êÍ~ÄÛAØAýÈë-ë™ +ú‘ú2â[Qš)²ò‹Ä é÷RÐXbtæ9O—÷‘®il61¶E2¡vR¬öQ=‚¢Òó˜A"t$5 RÝuð”1NôœSøÈ^Õy¤ QO¼G<Œ?Y亭ÉØùuf™òÈßcÙÇ €=¢Zî€p®SäûD=èÂÐx¤ÉAˆ¤µOY"Ö#t$'ʑƒ½m1ƒê²] %Œ|,(KŽ z¤ã¬RP?äD<à`֎ë I8\^Ò¿1«#÷Å/Gôìѧy„X4bbñ*13Žˆud½~*ˆHˆÍ.„Kñ¬ìÈD¤íãuÃZ¾|]W¤ýy‚ÇL'G²×³›À¿Óªß¡Ó½2rIB1B›Tâ²MË‘ó"¢>Ò¨–}íJԈâí"éÝá+¬ãÕVñˆ&**IÈ;™;pà*Ƨo„ÂêOqDŒ +òœ(ø%Žôñ##ðándÝό6"iw*^öiCÍÿBs0BáÁ¾·WÃ@}†#Q½Ô§'8@ð<©Æ,_#Z…ψµ˜#7àˆÜcläJ×?#=ËÁ.€º-cÊù"ߝ‘!²È‚Öúl!⠋žOVð# òñpòKÃa “+šL¤æF˜&2`£¼¸¬•À­wQ.¢¸»T›+åµl ™°ÜÑsƒ^°)j#»Gyíxxi#Xk6ŠXÔ³ÐF¢ÐÚÑdlâ8Ix¼RÊw²¼ÀFÐf¯iD7pY«àbý•óSÆÇÈ;à’ŠŠc§Ç!Ü3 +Y h+ø44A ø3r»Èfk&’¸–ªàÒäl¥i–3íñáãjä• Zc ´‘Ñfšª‘óû%™¤°—mTD]—ÀФFîÌÅô4ÂƶKÃ;§¦ã7m*iñÍ»¹ÇfM˜F\½‡ü +#1!†|ˆÅAàþûäul¿éËh$òN3¢28´ aJD#Ѻe°'º à Ø®¤ +oüÂ3ÂH.î ƒ¶Ê½¹ ÑÛ$SJ8#p<óŸ<=š]ãU$l}¨ƒêðƒ¾a"u2Ã×È[ÿ…˜ËØí–:ïRïé嘹¿†Ô`ÁœÈgI¬ÇHá5ˆZ'vŒE sma¨^CñçHÄÊP¸.¥@Ý´iˆTG"#‰%ã½úØDE|eär¬Î®È1:± )ÊEtC>„µ‰Éd¤ÅʔŒ û éøÚKdäÄ $~B9NPsK‚H¾¬ (^£BB Å1ÂèPÂߕŸŠ64F„6zk+âGpã¯%_£&†1’¥ÀÓS>šáw1âÁ‘I7.”,F)ëU~/2ŠÁ#Yh Brv—ÈÎKµ »7‰Ã†k7h;‰ ¢0‚•ipXIs/Âͦ†0¢ç#IÞp0"¶‚!´Ž»z½“º3ø +«ÍÃé…w4␪WÄ.íMšZщœÈü‰¦ÓӃWtÕ ‘§A,ýæªC AX¼1üAq‡Þí®ŒklÄgÿRƒ¸ÈžJǒ Å‹ÌTYœî™Þùè€`Œã‰0Û¾ÈoB99`Ýòj¨\‹ä· öž‡BE$bÉϐÇ -”Ð âï5 +Þ"—éqAØRr¤íöÐ՗ Ý9¡uÚ[db¬Xıy±NôLXŠ@ŀY'<›È_Ö xFá¯ÏaíðWDÚòľ8éËÅ¥{Ùì$ÂYd2ÁW¬Y$öýN3Ä¢Ó¯”é­lyþ˜çŠEè¢ +(ò‹„̈0 ÛnîHŸöÄÐ EȈi8Š0¿c{Ñ Q$š‘ä £Z®VÞ¬ElJKqóPE°d2ÒDN(‹5 p³D}Bu'Ra´¦Š2zXT+Dìé5:¼ÇÀÒål]ÜÐ +СMDj@ý&WúD’— +]·ëxX ÂLD•¶‰¡1Hj-- t&r"kv]ÿè'‚t°&ú Ÿ½‰L󴄈ì)k%EMd Ç@ úÒD 324‘ZT±éB‹Ë™ÈNöù@¸ÆŸÑ õKûýÀD*0ožDÁC¤B[àGÔopS{ô WÞ唢Lފ”•ÈIAŸ½@ðé;*­ZH…‘’©O¸lglD‰L=8g J‘ц™G—n&À•©Ë¦·ES¨ïˆˆ@ŒÆ‡Ø §àƇ`Äp¦W$q®ËÊêQ7Pló#BˆIxøà#"†©Ø/ñ2O°X<"|¬¼Táˆ<³èÐãÔü‚ÜìۘŠŸšiÇhj¤ YšÇBc#Bk1šo3ՈlՁ"‘S0}!¢À¯FDžÍrÃׄßW$B­ÂÂÙÊ¿‡`ߝÖc´¹ˆxÁ} ¢ŠÔiÙ¿‡§k õBÀ7.,EäØc`3Öw("FP¦;>h¾;Z'"’ېoÒzv&"îv%"Ø=E"¢ G#"̛³@DdÈG#al02R"ÂS¯±í¡ßÒ3ó…kcÌèÔdÊ¬Ï/šhˆT GƒÓ:ďQ&h"îãVaŠÈ¼ÖÞ#iâC„o€VÉBx»u‘ 6õ \´Îó‹;‚a3Ããþô¥Üص»‚G»÷A„9PßâIäDA„­NïCRgÓÎlÛ v-@ª!{âFKDNz²$iD´Yß{ˆ"JêÌàlTY£~sÿ!4R±B¯ŽÈk»¼ü+º©?dߺ­×Đsž©±‰„œˆ_¯“‚Ã'ó!Þ;–,vg1¦%¿$ÑfÚΠOv‡¨DòÿR Á‡°CPŠ*ÃB¨‡àΑ;G&!5ô-eê£]ÌC&’'‚!DJoPÚï‘1œL}Únv€•¦j‡ bV$ÒwH©ÔIO,(üqˆ+äº9$%}6CŠÂ´N$뙶×ÙÜ¡’NìÛ î¤,rKî×ڐSE‚2Ä ì,ñt€ÛnC@à ’m›Žl͇€¨B&¶!k™‚—!¯Y Š‰]Oƒ%³ 5Lráò¦~˜×·‘d¨Ç( XˆãºÍ!²©½¢n4¡Ðrȧ¤‰r&ÑB:ë±ëƤ‰ÕNû:J¥âˆÓ~VÈà ÂèÞC‡Ü¶†¨š*•ß² e~{¹õ¤ hSÏiHäµ¾4´ nC’)h=5³Jš)íh#˜ÀhC†˜ ¹däÅ0ÖLê“ÖÅgÈ¢0é àØkÈ/êx¦ ©ÐRJ_ Ø̐ó>aâ]RCØbrŠí íö‰uÅBò¨ÏŽ«®HBR³oçRÀ¿ƒ”prt âÕž!å×äS:Ctxh÷vòZx±¢>3Bi¾T=Ë ©ÙîîFÈyþ^ÂÌií^C h܁@¯&CԐgJfN#ˆ4Sþµy±­K4Ö¦Ì]ÈÀ æ‹ÒQ&âœÔ؅øx$B!ÕõlÑ"ŒÊ:´ -Ç'RêPƒå¹{!!ƒfø…ütBœÔçÕõ…l·,ëÚÂr”¬Hjr|!Åê¥fAhÑ]©èyvöƒÇ¾Ók«T*è\xÉ.䛿L+½bƒ'ÄÆB”¸!u²÷ªFçÅ`¨D‚ý 9vaBJ¬RAB x N2Ž!ÞBf ß Œ +ÚBêUTB³Ò±ÂÕ!É¥…è9¡®£’Gh!Lê,£¿×Vºýä`Yâ"’Jb!èæjÞDž…ˆû˜â7›ó£l}…T·—¨ ¸¹ Áëw!7lÙjtå3¾â!Ú ½àU2BVÈÐÕ1ýÉCM °Bꃎ…Z¡iû‰0+@šüÂz"„Ž½$‚P±>=ː^7Å.äFû‡­Q!ÕÅ4¢B^©Õ2hÍ%´ˆè'Dü±2Mr­P¢ê iƒˆj AžCÎ4ÒÎBëÿš§ûî$ë é­BQžåÌLà#Î\<„ôÅ˳“ J¢—0Õ +­Z4¤ÁÜB +7Ÿ¦Kü0‰;ž¬[t( r¬s“NˆEk}× 9!,Ì-ÌnÆpB°S_·çnB¸Æ Ci`¢€);µYMHŒÿHGöZ$0ÛºdŽ ‰Ä\Š9B¬ñ‘¿àK6 ’þ ?<{= ,ðŸ]=‹Gl‰Æ}‚i¾÷ƒqà^tá©A7iÙÅMHHM$M€â•%€„øÚ"BÄ1!qp…4¹ôòÄÏÙõ¢Xºgè)H€Dlè÷çŸ@^ÏôßOás…»Œ[58Y`ßa„X.©¨!ªÄttÔ áAX…H[/zH -²BË£t.ØÏÑ>ø:a,DŠ`*sƒ ÿAÔݔTˆ{køBžÔ««úŠ”·™aQ&9#+5×Bˆ+ÁðX®›ÄHc54rw§µûàñ,w½ètâÒ+z9%*?¤™;HcïŒ0×ÊÁÍ°ƒØ@YèƒLpK. QÇ p¨DWR´”¤jhÆ0½«&ô¼5¥gvû&D&4ÈÍÐös‚¯Oˆ<¥Æ«R- ÈNf˜iNQí ¤­¥T§Bä%ƒHtX£‚ìåÐObê×!²¬ŠP“,*Ý¡QþDV•ŒÈ qµrHƒþyûÂ+ÚÇåŒìÀämz^‰‚¾çhT@hXˆ‹ölì)$`S·ƒ¡'pb¡é$ü¼:³ÁB8Á\%Í=•šÉ’û!Ã&]$%™Ð¦û;°! Öþ$ø éÝ6‡ü7Íh|CÈ=ü –z‘ýÁxV‘Á©GÕ啁bò¸HÁ£lÌúA´p+è0i€ù,+*wÿ ²Ylì¬,8€´ÕɜR÷|G+¦*Fe4€tϝúø%¿$d&U }ÄqâXA…g€ïì®súÉí?RÉÄh…QVä˜öŠgH¦XFT¨E_õÿA]CAZÝ0²¹¡œ•Ÿ9þןçՈÔÂú‡³]¸p²B$ÈÂû>ÿC…™"œ ÒýGúö#«eCj̇ÐJ"~þÑMÝ±µVh0?¦¤?¬ûO…ÙgÈAgóùh†€¹¢N§wÞ €“O`tµ¤âXLkIRþ¨; W»8¹äNêÖ?ž¾Õ×KOýS¤):¬¦õGnÅvÑ&i–ù‡ÆQÝié¶š¾'1®Œ¸Mú'ìòGD7¯qâ8ùÎÏO²ìÖ1Ç°×ÞG©×¼ÆõMï“æ?xL‹¡‘•ýUȒü˜×T‹Euü¥/ôõºÀ 7º3ÿ[4,ˆ‹h”Ãï¡‘»Xºò8e°Æm£ÉPþ ‰Q&äórúí%¬O —ÀÐ#ƹ'ôqçðƒî0a¾œsü±jEr¸ªˆ +à ¾Da?øÄ,˜ü¥Ç÷Á 4 [‡„3á8b~yY©x³xn¼š?ºP$¨,גI«ÊI³f?Ô沶ôÃ5N^?jA,%ù„`ù– ‹õ©al D¤QýàŒø]~§œ°´¡Býè×ü€~òHĜ~Ø!– ²fú‘õ—!°¢¥¾øƒ#­¸ÔŠôñÉÝl+Dlôã·æA{Jô#†œƒ˜ä2 +*knó#£ù3õ2?@µócãŸ;<®¢.?¶2cùÑ_Ä#T~+jó}‰@rê(?[$óè—Jù_ÓoûÁv’9~ .œª[¡Æþ!Š ƒã‡Uåõƒ¨°<0uDG·7ÒO ^÷±"T¦û€šth4˜S‚šÑïV¡ü SBbMz¸¾¹&_Æbh'Åöqfæ×÷™‡°Æ7ô>ìØ¢þ]Š¿=ª¼Q¨ҟñ{öÜ÷¸±‘t öy=2† ¤×9w똎Uc¾>xîçÌëCîsëú`…ä~cªFWTÙoíCmUnÅÚÇþζM¡VhÁ ªê¶”êÑv~ÙÇ ‚¼×ÌB`2VÆ>Ö‡|&Ýêþ:}]‹Kìà ’*á>òïxsôõí¡‚M‘;Jßô¨¬A­®ö éSÀ–²‡6·7Ñ¥ÒæNZÂTև°{E°`¸ðm”Æê-ê£M¿@ÇD<¬¸O/Tþ’ô&_ƒúøji¦cƒ0=ˆ™£IçHV,°Å±]y”)Êf„õS·Y²¤‚ØȲæ26 H0ӅSãdè-{8úh*Gv¡þ„ŸºßéAx<²†>ˆR—7Æhéd>Lvªuj~Œ”ôÎá½gê¢ú˜9;Ü +í6 óGž™vGˆløÇ®Á `¯Šlô#[Ú5o-ç£wª;:ؾÈ(©L½‡¬À¥Tõ}§É‡CdŽ³Ç>Fƒ¡~´Ô‘Jº#óñ]KJßáí ‘Ëg«ÉV•-˜ "’Î؇d×^>p’uLê_!áß8ƒP©m&yäà8îWë‡MtñÁ‘lºtöèØJ0é>­V¡Ùá%Ô~bb†*æ­ãC ɼ¶/|¸ÖåÚ\ê­y¡êƒñS‡î H"°a0øÐÁFUHè ¡"z&> dµ6'ñÍñqlÍ Ýš âÞç`F“ÈÇqيÝU}ŠÃGþ&ͳÙ5wz¬Ì”¼‰òÅx–`ñagBMxz“Ð{Ä¡ ˆ'­‹ñtÚ ­¿þ=dêÇ[6M4lT‰@·Š–Ç•Ûäƒ:c›çwV‚ß#¬[“D¬€oÛ÷ð€DÅFëÞÃv…~>öL+ëAmV\7“„~1«öÐú•g=0u ãK¸ðmLlêj ï0ĉt46uL{¸dŒÛ¸ïÛf¿‘é殥(éäf ?k÷‰CæÁ’kDÏyâ‹!$ߊ•ˆ$}νðALÞЋ«.‚^žP]Œè;ïÞ¢„y{¨P:ùák ±báUö ÑR°SË*W¶ÅփÎñ‘±ô¸&0tsÎ#LâjµPì| ÆáÅ4M»öÀx§ÆÚæÊìì íAí8fëAcÑu¦“ª04m‚@{Pc30 ÐÞ³‡3|“”€GVy`2™²Ç†B*ñ'@ÔdÉ:1岩¹ { =ÂM:Prª¯=.4Ù¶AèqÕShË,óÀÀ¾tbÖÀ]ïÀ¸ºj°W¸›!Ý[AÁ¦T” æGXm>—é¤@üyt¢º_$A‹b“&ðÊñøéôg>ÙJ\µ:ÙòøšÃH’©Úô¿—®ÇÀËa]…‘¹õ˜•Î°õ‰´«ž­‡õ7,åˢϬ‡ +òÀ0:ðŠy=“ΛL‘!癣%æiÎãh&Ç ©zõð\](Þß!=ğ%ÔC‹ÞÍôõéÑuö¢â\<=Ä0E‰áS_´¨¡ÁÓ#óÀ3ôp1 ñUé±f‘+Ãðœš>stream +ypP–|•–`+/Ô¼¡çï‘HC÷•¼ӀAur\@l%•9G¡˜´‰Œbð´ÿ•·Ô8Õ.+µùYÓ°C +‘ñ‰;ª™ÑÀšß(ÿ…C“Í°F*ÓâÊϋ/ÃÜö–‡Æ …PGç\:““ÇêªüJ¦sù4)Å[v@æ!U<<@åŸÍâ Ø 0y¨br{I\´–<\ÄX5‡ ©¼"¼E_쌣‘OD˜2Ä4>‰pä}WUw)Ç…ùÁL‡³ÌÒû=®ññÐÿфŃ¾ÉC‘@¯Á´¼Ê2ùøӊ&õsÇËÛ¾‹Àñ8ªÅsBE“n<”ð»C& èÍ`ƣß,þ!ýî EMþbx¸›wt³3Q±I©ŒPIjêgDƤߦÄ¡t›Œ ¢Øˆ([Xx”0ŠpIìHo²DáLP•®+ \›†¥ N´àÛ¿,egÉèk„¸èòðàï¼Ë¶Ç38x°æ¦â^#$ÑàÛ,ú4ä<“DA-xÐ¥ÊнkcŠ¹`óóûnZ$q×7вe}Dô ߁Ù(ýƒ+c7T òDIgï0¶&þ…Ú¡Xx^o!:¡wì0ƒxƓIfŒLçQ ¯pâgŒÑ¡9…B߁P–¦PÎ+ùŽyaÄwXÛÈ?™ºy½0°É,„Kj•RzýîÂàls鉤¥ûÏùœ'¶¬Òjæý?‡òâÀO2GïŽñ GÓöä+ñihG¢<ÀYkf…wðôm“qàÈJsˆï8œ™‰óJç˜(4 +³3Ê`Bª§Ì¶ +»cÝ$½óêÐ}Š¬;Z|(çß®„‹—ãÜñnߺSÍ -(°uÀ ô: ѬǍôý’:U7*uÜAse´à¾°F7°VÃrÆ ƒÀx” ¸ƒ…1E\·ê»á#NÔsÑÚÂI v`¡‚«u3yÉÑ&rKHÑ]œÕ¯&óp^Fo‡t“Ž ì°8+Û4x;(Î5Ký`v;:ë'iœUiºA9Þ¤á†Ö 1ÃAä=Ét.G“PQ†æhåÆՋ¥‰‹÷ð ’ŠÏCŒ]¯&§ØjGXÐA0;rD‰¤v ^>OŒ熳Ð0ҎÙZɎރy„Tíàs c˜í€ü:Çÿ]ªÞ΄„´í*F:± ±§Ëûl³_k8z·;°@X„±èJÏ °c¯r¹rzo#º¥.ò|Õ3ž3½Åe Gù¥×Q£ç3-|¬ça+¼Rÿöû)F\i,Âß& +;b}om>!=ú\‚µÅƒ‰°c©]¹ì¨Ëm ñC¿ +Á¡o }LeÚ³h°ø³ŒA¶]ü`o†¾º Â-EW*Îb± @Ì(Ž±7¤B¼òÑÔ^G\«c;=gÊÁLÁ»ífÁK¯£öü¸0{вzGÄÉqi?~Œx¬Ã|øÑkPr[aë;…ç‚_¦rp \õ¯úàÉR»Ô ÉD¡&°ÏRŠEtiˆQØD >–?0½5\RT†ê(õÍ£ä$º“5òÇW_¢Í j¤½JëêHõIwª§ymi‰{”ú˜)ý u ÅBri¿ƒ§#be):r%LPØ + :ü¡; fšÛ‘¦Õ—.$?Èhú‚Ê10Y[rô[HÃ.¶b},„+Ò­©ã÷žÆ¯…ýÉ´Š÷ªD§¼)FŽñ72e€†‚Á|Q•CæÔàÿA0‰92£š+ù$µ7e.-åدðTìró*Ncÿ „ý~öÈ!}‹•Aûœ —š{àZq®°9”9j‘ +Ú]!‘ã"!rhË`P!:‡¨2Ý,@cVâ‹Vc ï<†·ÿå\s ‡d#Äd’Ë—ˆ#fñÌjÙ×ÂOÑië>/ï¥Ýq”¥|‰€—1ó,&ÇùáâpðóÁkÁћ¼³~£ÃAJe™ÿm ãð°˜Ð‘“åÁ ÔA ðÄÞÙ­—7çÊ:7AÄLâe‰Š"ÛϹ&µq¬GaÀoº¹ŠÑÔ3þºXŒðéoUÆ8Tú‰qôŸ" ví {/ÐÐS6nížFòʱíˆoŸ±ÙEÿ8ø3;8΢JäÍ §,»Âú–¢>*-z±;4¸IˆìŽr*ðòSÃA°@R‰æä’=ÐYqD¯Jñèûž_ß¾]„áÓbU†B ª”EÝ}60žaCuƒDòŽv8B2ð/¹dpàƒÐÒb‘a£dczbz‚þj†ù Ãë<›gUnØ`È0 ™x± #IöçOÞ$hYXG¹tq£Gäý>ËöÃQ EæQ88ÅòÇL퀢Ä»#¹ŽXHl½Ò·‘•n¨Æ™.°)Å␐]yð~tñ[ )AÔ:á 'X™pìy/"EnÌiË©áHHŸÉn¬D7Èbª„ƒ”6€Õ)uoςÔ&`8’@ú  k¼u ^8Ò¢IxÝÀ…#| bŸäqxØ?7¸ëS€#Iv×ÖüM÷Z?¾Gixù<°‰p(o:€Ý?àw~àhî}Î"$’ ŽíÉhÊà`¾7àÀîûèC@b•ˆ¯4¸‘ —Õ„ÇSâzŠàȉã\ÿŠ•Aph'ˆqà—éö.I™7"V6úOb‘5¼‹ÙÍ4Η^¼˜Ú¨Ì¬ +¤³BQG@àˆj÷ ‚ I"÷Đ +‡ÔšNM@MöÒý‘ô–ѨƒèŽ+Õ"à¸f% +à)؞x~ˆíÃwaèj í·•"}†Õ>ËY4¶oxó\©(ƒYG>šrY÷Wz­#F»ª¯«¤~#ÅMë"™Üîæ‘à7zOœDnzßØð6g»•„û†Æʉk‰µ¾öH(¿¸{Å|qØ72×Á¿‰ˆÿ(m½{ü&Ón1~¤à…Z£7’O*|é1$cà€oˆb¨toµ÷†.•¼¡º,í.ò‡þì§i°7¢ w½!ÖB섮xPà^¤%½ÁaÀ¦Í ÂÕ%Ê ¦ÓÛ ú©È¾È +{-!:°ÍÉyƒÙâ„HÐváx£_$ ̯1GΌ7JŽÎÒ)ƒ+Þ°¿o8%yTº¡dèÍŠï§PfLÞà: ~7€U³l‹ øn°"%URv ×IŽÜ @N a,›¾†ÅN¡%¥è«$±…Ïž‹§ZµO‹µ×T¶ªc,˜ÃIýºñN¨ã…3ô|¤õ ¨¯îb a©¡!–m#ò;îµ1érñrf™&7RM5¢ÀLQ©Ám`4á¾êÝĖû.Š‹s;mC×· ¢iÜdn„vÓÝ+F¸ FIó¿ïº­È 6Ì®ðQ¹ÐŒÂÅqãxîÞƼ†%²˜ñŠLø2ê£Xšq©`|æHÇpC¹—õÿàÁ¥­-7„+‹)øl¸¨Sxþ÷³µ ½ÓQ˜8 ž‚K°2 R¶¹Ú†~ÿöTºÛ£ì +ð€œc·‘§Ë²˜IxÝ&+¤m!1ÇåÚû€cJÔÆNì†5fãä"é$]pÂN:­ä¨ô¶‘Õœ‰ž¸ó¯²éÚà{’’…Úëì„øÈ8b˜6¤ûb‡¶ØJBÚFe12„b›¬Eïãؒk„Ew™OÌøÔuâÀø.fãñ&¶!}êÂ6Ð=ú:ØغmÜ͂ s½µ<¼Œ$]uw­m€qm8¢‰îß44s6é^äèÓ6W0kÖáÙWK¢Al:õÒd¥¨ ,‡V±¦ ×!¨![ÓÆaãT¿j¡–6˜Ør|âk¿0…ÒFe¥0,ú¡àÿi sd];NE}º/ ÚPØHø‘d1!Ã&‰X •ÙH•m0]X”*çÚhnj°BÒÓ3¨|64¥ã¨žvå‘φ9` ›ÛÙXэJgÃ˃¬tÉaV´ÏÉl,–·˜N<›õz]dÁlX„Íj,L[éÞʆÌÅè$‰T6´(~–²Q¡t a ý8@BÙÈ·›ë\ó—\“mq› +«”so•làØM’ œǚÁcÍaA': 2 +%6É }x èl€ÆÆßc¦[̑Àn—±mx‰«CHõ`\äð,5ÊÔÊ7õ…j8e)¥ûØä„ž|P{–›í‚Ò[ +Rc=ê\E8ÿ3`qÔµ× Ö›R`Á¨¡5"Ü„òõB|O£íò;›ê™)})jä—Ѿ“l¦¸NuVQC(,ɒVŽA@Ìw¨qêb¢ÂØàq0Ô _‡"r¤…×5ÄwÇ`èÇÙu^'çm*ÁµÅºpæ·' 4ÑŸFÝuÄ<ž“1´§‘cÉ[_Ujl4 ²€ Íäi\¿g“Ì¡@잆  tL¢Ô$²Ó {ñsµÕ’F§AN—¿L¢}³Ãh}œžíGÃɲ{´k }Ú4c ™Õµf£á‹ÎëBÔ4ò–Ý yuVh¥‰GäpÉQ˜iÜ焞uÙb¡C™ÆYºUÛN”È4õl[Ñ­‚^^¦ïégMâdAñ§\½b–Ûjtåq¡üQG›@X\ _— Xh ¢ÖÈ!]…Ü+9 +hjþZdÁ#z‚†Xç2Lhˆè R _Å{¶º,“Ð ­Ïî؈'–‹>èKDhÀ3¾çùpLH"¡aÉ‹¼?»ÑƒÆޗϔƒ†KæµÃÐõ#ðK{ów –LˆI’—f*uŽ†J±Ì±ÐDÂa£ƒ.b@ãƄ·„$<7ŠÆ†ÇÖ¡uŠ¿è㍷ё7‹Äx CûËÞµÃ^²âü3ÒAÝSÂB03’­àxï+Ö øA®™´/4ü«idSO-ÞL}F&Ù;,.X ó×JÈÙˏ¸‹ÏàÓ#QŠºO«-X.ïj֜÷ ߒQD;áWЀRžÃžáÝ©:‡´gäu8Ö ã}Aìé/üÕ­*H‹y†EüDùº8‚`ãJRö—³#{QÄ3–îá‰YDÜwU¥Ú07N36Y7=—=Ó¡9‡î#’ÖÔ%‘þם?ÝBeŒfÔ´ë¨]΢DÍ{LF\#6£ô}3’d9@º¯ù63@lË^¡€¸äe@€ÁIýP#f$¨ck@̈ÜÄ»í×:•ÐÉøYS˜ãÎ:eÆ]i&0™AÌÎ=nX(ÿXQùÿ¸ Ú ò@*q.Ä]DfˆڅRG¡ +dF9Ç1 ‹v²ö®³Dó᧠ù8µ¯y'fTêŒÖ‚a%¹(F«n ۋ<Õ3YŽ.¿ê7ièÓUÎhÿÚڇ¯TcL‘z¢¹Ó‚¶2Ē¦Ø°™pÈó\Æ;²ú*õŒ Ùüñ<˜9*^ ®a ÁF:G;؋/jÖÙ÷€ø|HÔa‰áxÖM§û'@úöäÌ{/8ª…€]Ý\qišò]Д¹ºp–ÀÄÖhBxT@Ž“Yz*2èˆ "zg,þÉï֊`Ÿ Ã×^šÛÓ©]¿*<<—¸XÞA84þ‹VîYèù!V'ÒìŽQx$†;G@SYT#æ}¼v¾Ž^³Ÿ3Á´Is,ÍM1,‚€vìȳæö¡T}‹’`ZÏoYÝh^AlNu#† š2âqZ؅Öú˜ n)ÜýáŒ;p,ò¤æ ã£Ò ‘B9Æa áî!êZàîÔ±ñÿ{в .´›h"oY‚¡2± [Njx˜„¨ýËÁ8;läænKȬŠ§ô” ”wC*EŸÔ=a1¼E +N,í = I*§h÷@I‰{úî +)¹É’Ù÷!´-,Fΐ76ã½øNá¨û mªöUGmj*pæfŒ_ֈ®áe9·zærñ±¡»û{‹z‚W´¢'gœŽu‚J3µ‘²Í-oÌ̀óñ _DL⋌Êgø0¤šÔw8¡ïG¬4šÜ¶tÃÝå-ÉuÚâs@T¥m0Ón7.pӜ©íÎø:—e2”[ÆX;W¡` dâpÄ?Ù'nëŽ>c ˆµÙzû‚º°E­Æ׋ÿ¥ƒe?±‰É͌„dþÖj"Šµ5¬¦‰HØ@ìü¾Uò²Ñ†»Cڂq/ØK-?±¶•àZNÎc)ݑõ¼}ƒ¨¹GÝËäÂ)_»œ™u±ËÃO@BÃRKÒ£üè.Þh¡žû‡½™Å¤ÙCHó÷¬Ž§£¯ܜ/p>ûO¦Í@CßY@˜Š½UͺèVՅòÝ +žˆ±œñ‘”‘šU);8lò¶©6}’èjº¬æÞ6b_¡…ہNìMø•mÂY¬|ªi-—÷¿°¨õ³ÏúPv—^s좺€¨ÈB.¼¤¼Ò•÷kþ`·iEϔ¹JlOGXeè¸Å½Æ³Mâl õٍªóÕêû…ê:’ œ(3,úívi»§®Jó‹wOG ¦¥Óšö0shÉ-¤ªï‹""KóÉ*Áo˜ŒšÑ^’¬Ãê(-5 ‘°U†–x@e G~œ­øƒ"•¢¡oÀV?Û´<â†x›äÉP&!m•ª?r‰0^• 1^ï,‡ÃÓ½üs˜KmÏavG°ekIã§ô>C]6Ñ4nRq?)Ä~·›ô3-kÑYŽnŽÚ£0`Œê¾²„’&Ûwá¬(MãG1GºµÍÞÿ4KöõE¶=øLÊÂO<„ñ˜sV3`e84ì5¡ñҋ¸RöÜùÎܽ¿dÑ`™Xóóoù`<Ž9ð`™^®÷—¹¬å—*‚NŒ]1ÁP 9å?=©‰¯<.IOŒäAZX\_| +“9ýÄ^7,P«FÒ(S@ýð ©âÁG"TÓÞh“ÕYÜT–×—2¼ÐmÀ¶£ByxÄ1xW,õ—o—çÿ Û“¯MðJròîޑ .`à5ÿÓ÷«Yj2HP2ì©HÉÎ>…­w@'pIã5u§Î˜ÌHg¢†ñ໼˜Düô>×¹—üj„ _•Áó(¬ðøµÊFs¦ð—ÆVÚ<Æ¥¯69tq}ÍVÕT!C=.å$Ðv‡o´/§BòL“.4ÃÅ 2Š 7 ŵ[{Á’,júÖE’Ð;+$4ç7•“e¥U†0³ÉÌá‘@?4‚„:'ëŒ3ci)ü²íƒ{ÈRãŠÁ70ƍ­F7 î…H± þhï5¡¹×Ž‰úwE9ÌÔéŒ@k¬`®€g¨ F¸ý6)(ÇHBOÖd1m ‹ÜÄ¥½Æ™±@aÔLs2L2ônåŠ4lßòzú˜Øœ¤Ê'ÖlÖsíp¢®Ìºæ ª‰ˆFc ハ’‹ië°ÄÄíNPŽç&û&ùòM•…º¦!×! î£Y-^H¢S#e)rTƒ¤ˆnXÉ'"Û÷,=ÊRhù>“¾ Ù¿_6¦á4VËÚ­@Àø*?žÆ;3íUýóœ“öÉ8µNwZ¶JóiÖ*®8Ar·Â/qIåö„ ¼Ç ¥h3IhEðä]ê~h~6ăõ˔¢!ítå©é> ¤Ôk1³J,h’‘PðÑ  _dj¢PØvR„Ü>‰ju¥K¶»]>9÷èݗ¡Æx|E#ão)– ¿øNØL—òzÄȤÜ2TÌìÕÞAB uø»e9`—…‡9Õù$y2 3àÞ=ôý³ݎŽ¡B‘#½[ã”N.E<—Êd”[à +ßb¯2¹yãˆ1˜ÙÃTMQ¯ÅÓûU<¸ ´Ù'L‡u5шýËàí¹dÈö¿—ãc)Û'ûºX o9¼#¶ÇñQ>³.3m ‘Ïhn +ÖÛ³˜BO”àw–$#an…ÛS‹wB¤ävW¤#L;Á2®Ñ·ÒùßWƒ^ ‹×’ÉæÿÙÇ8³¦>5MO¥¤ä½É+Gå0ùíBÕùíÐgªWƒèÊùµ8´,f‚a~QèV?Kº äoâoƒ[Á½ÿØèÊaŅ°N³ùP5æ +ĨžYæþUí_­L<në®A>›§ñGÿÓµ¹¤V¢9Fñ‹]BG?ÍاªÔ›IcëóŽùž +ñ Œ8¥©•¨ÚÎNeØ|2œÃÉý„| +¢®+ÜÖ*V>ÙG'¥üðé0šYîZ#{³¨ eš´Mü½ÝĊ´üre¶¡‡DJÃR‰0É èãä—d,Ùxuµ(xA4«IärxÄOoÄkßd‚§øI I |*&0zo¹x_ýæ²ñ`–¶éj¿àPþ,¡b¿H‘O_ ¹XxNb-”ñoëaC<“^‚Ü¥KßJËqŒTî"wP«`(ÛOcl¿V1—’][±^úJ×#Øc›û)Û?P4ev°dä!9´»ƒÚ}"³ÊqÏ~ÇÜŠ*5ÿÑë57ˆ<1TWõ=‹Ì|pÜ Ò õj>¹Ã–7 n‚ؓ؋ˆžæÚÎër.±O+IDPuØë'ÛÙ4þgÈ2TÖµîäi÷ôC;Ú°5ܯê¡i[TÅÒñ†e Ûö( šl”»#qe-,†ƒîa6=lJŸ‡_ÐUÈ»ËüëH ¦ ’‰·ü˜@þE”²2`q,"Š¯j&uîKÿT,¥‡êam´C ¬ö³éS1uAôñ>—‘Ô”öcߞG;ý4‘$Í6JVtj`Håw—L›1èN¼6,V¨§%ÆÜrl8Ü*„éÞ­÷æ*W&g«9‚Šuíÿ"sZɿܳå`("¡™®©­3?¥Ø4—­û!óŠ#ý¸k¬FÅCNš„Û-IJ|;=níªƒZ5¼Rqþü%´¾ÜS-O؝@K/p©Ž»[ÁŽ÷bÚC¢¤X¦×øÕ¸ìÓø7OܔíŽS±P½ ¸®È:Ñh`²ô˜ÆÔÀ {XaC?çnûÞ!ý³ÅG©Ø/tóV5, b#äÊ£jfÁ¤±²Ç“ƒX¹'/7=41*ýòäI0j¥48aœ;HvLŠ˜Dò§K¡Ç B-‹™¹ ’? ôëÿOBøVmLÎdì£v—¿g w?Œ== k=sL!‹Òr=®)ÖÃ[ >N ¾e÷'÷ÿ\ú‡üOä”sÿë™æ üníUCç÷®ùsè¾%ÒÈûœóƒõ… J(z^h̶þô•üÊOz|Ñ£¨%¦D¬3ýY&œÎ÷‹u#û‰rÍ/ l!©šÇ£/ Cêkaé o^ÕõDхêdGV]ö$ÂñÕn´ëdíl"‚y‚,ÐPEC0ðxª ´T>›‘6|¶»´/ÙInï!ªÓ£š»Ìí±`ƈæ÷ÀıÿËÌÜü!ŸÇÀtx»£>­c–Ѓuƒ;T·Ý'äú<!7µƒt{}°LÜüL·™£pÿ|Õǚªû§9ÆßLÆ 0â˜tPÀ®ÀÄdü„0B&èö2fÚя×ó‡f‹ö$U‘“Fl§™ÄPãºp#ßÆ¿É!w0gµçÖÞ0®Q‡òô¶`¬ÈˆcLŽ !êÀÁ‹ÆÃ`%4xƒÉ^]h9ÊDˆ_‹³ ³µ§—ôÝàºYŽióKò©¢.ëöj, Èù£i¶ë/}Th³Éµ^£ëgLЁY¼µ¼lE^÷uÈbÔÂrb°Äšj†€6¨Ã{‚W.ìü(Cv+ í‚0Ôÿ :QxAX&ÎXÁÖÀ›ƒÏ¯$:,´¹Åû9»§%!„e¢tɇ›Tî睂†zP€6D$•ϼÕ(ÿ,ãÝÑý*«êËïðJ")¯BHjW +‡ŸmÌ㙉”*j8îÿ}èÅÄPôÛۜO„$TlÀ Gì3²>§æW%2:g†)xð1¸³Z'Íá³®•éŠ‰6ÒN¤|±aéÒæ3úÚ-8ReªU3Se.ËJó•Û{BTßh+ø@X: ýáí„Òp嘦CÏ EÆ>tÇq ì j#è©÷èÐ͓]Ç}ÉÆ’×U«*y0ªþÀ +ÇWU9¤s›ýpaÖ2{pSµ<3 ëàßÜ$þÿ÷ŸþKôïamགྷ“GõV6M÷­©ä§§:…âœêŽ©=ñSƒÿ$Ýtzӛ*áÔS;ÔáÕZÉ¢¸é€ ÓÚÔ}sñæòáÁ1¯±pü#{üƒó?è¥ß€v‘“Vƒ2GrpCö¨bîáñŒƒ™ªã@>FהÊÒ¹kJaê8ÑãËÊCaÆÂö¿3­®X°¶Ô¶mÛ¶mQP‹=Zš<â\.1dÁóþ&îß>[`/N>f2šn¾m‡ÁbÂ%¹ûöÄö’žåÄZ +ÍOô}0÷•ká÷û´`šßÿŸØ£ý§ý×3ŸùƒsŽ…øù çH0až›ŸÅ†*ò@ˆÊ¶?÷;Eý‡(å€â,ïƒ{:©Õ˪ªÊ*k؉;úlfƒ ¶ÊkòâÝp{ fOtïэó/Î>[wyÿÒÕݛ×3Ç{è;8BÞƒ÷©IÛVdPP,¸ií¶Ói5+¯£ØzR‹Ãw1EÚÓ¬”­ÔNµÇ"M´te¶mÛ¶tî9LF±4-"""„""DáBD¤’ÄÃԋÅ2"H-±ˆˆŠH?bDR:ÊpIIAjɒÞpS-ÈaT!F[\!ÆLmÅTQ ÁAƒL-*è£"¡òA©¥=…<âË,k˜ ֎‘µ6qís4ß®X bÄ´úÚö²x¤ûÚkÑð¶C¢Â¨´{f5(cP ¢ˆL …Cb9 Çz.> p*6LBPB ¥ò,I)c€!!dŒ•€èCˆË¹b]Ø:ŠÈ¿¯Y±D¹íY¼mg·0‡½²šYŸîü5(£ûêáŸ`ÅCt£YQ;eº3”6¤u˜%¶‡ÊÃPšÚÄ7®òšrm”\®RV]?ÊYg€èz¡,aíSŒ w@5tàlNICޙ‰ê{íçݶ‚<žG»½fSmñ^{Gˆ4 qÔyˆXX´äÞ >Ò[¨ûõW~Ý6n?Í{jäJâ3ÒÎñÀKc¦[ê¨3ã¡ðÞ́&(ú¤häK|„áHe2ÿdIÂV³žuÂë7S"ÕØz 3~‡X.¯•°í^Ž¿s¤W”ÀKiXðý"Æþ1;ûݛyŠÌ#ÐLHÂÀã#bàÇÆ !xnô˜OÁëÎvçҙT84 °rxäaâd¸ÙŽ·íRÍù‹Èٞ3•y³?åúlýÓ7Ù9bù( KB½2À¡u¾(kÒɅ?ò8ŠÂ”иuàÈÉwEÒñOh\@^óC$ Á%·¥8æ…õ ¸DD"”©Pz×ýû‚û€1ߕACµ â“ì“Î0m“ +>í«Áöã³#üšðÏ5ùÏ Ï¡¨Ouðí%¬qŸÒiÎƒhîÜL=L¨û"‹éÓÀ µÛÀ—fc’Ô½´ÛâՋ†øc÷ÿ…–‰£Mb–¹ÞXƒü8¾ó?N%ì! +-Ñî)uÖBà¿@}û(K!@é3!0Î3Qm•Zú›‘ÔÂÄP£` —ó¼•6&W´ËØIÿjËõ*ø<i·÷Q Q%2Ê]£ :l*ŸƒZªîôgãê¥>¨ZŸ^ªVJ^[ÕKK* Šw—|¶ü`X<ù¡EGZÑP´™!ñÿTà§òž-ñڜš:{·y)⃺XŠœÐы’InöRhäzðE¿)H0è8ShiŒï;• ¾4|O,i#œÜB˜eàá½:ÊüTÛxoǸ۶Aâ=„B6Õ ï=›·0Iý[iß«D6g݈óòdJ!‹„ +@d¡ Œ° ƒ?)±ðHõ8‹À{ÊvUc0ÔT¦sŒh&›²ÞÉ¡M]´I›½Î0IHëMO‡¾ؕ¦àùúh «œ@w©iQO*‚­4¸s]Ò¡Ål]ÎÉê5¾`ͼuËOýAÔfÛ…HD¤é¿aßš×­-0F§Âu´ÚºKñ`Ö­Í é-‡Ã gݓÿ*jøÅçúXȼr]pÙºûNB @zë_$Ü/h¬¿™Bp*b–ÏÀ rHYóœŽxš`ÝþQ¯î6t:eDzizI™F]]´Ž¾wÒæRÅ Tw <Þ+/¹}f"‰…ûÄ¢®EOY«b¨kœ)PÈ¢î×3ÊÁ*‘5ˆ §»¢ÏB¦ ͱm³EWå lh×"Å#„¾õ9bÛìõÌtÿ<ƆE¨ô5݊¼^[k È)‰ADÉtÅwŽ=M@‘M—±ð/Ýx”îåÍH·¸È%`4¢ãœÊ½A€—tٲݔpdCÎ-h»ô#~”î˜é2ÃÜÑýoÛÈ¢ëq¬>'¹Ç¢»Û¥xrÑæ~è 1FWPüP¶ê®¢_‚9£ÜiTbtÁ+Ñ¥ pºÁOÏËë˜écÛ[}\6,ѝI½¡ûDCÜ á ;a#~€î/Íû0ž:o[§H)<ªÒ!’»A—Á­6? ¼u-ÅaÓ¤`‰ +ûߜgV‹Cю]Ž#½°`ñ€ååªþ[Ì?îT +ý¹O üo>÷éj‡æ¹|%ëJò*ÚAíÆßÙï#èj‰´¤k€A¸ò¯-ƒ¦^Ó±Î}fù¥(±ìóbXç¦fÿ30Ö¹/zèÜö¾¸Ž™ý’Äîp$6dcBM·²=3áؘæÜçžX$¦=çb#O1çË=:w*…qî+b•hnîÙ?=ˆ–Ÿêh9ñÍÅ5·€6JÖÎõêOdÍ!áa¿¹šË‡2xV¼¦¦‚^˜80sV×Z™S€ä4÷L•$0˜ëÓÜJ>5XÜ”Q䄚‹À׉0Ùj.žË·Ô«x@«¹ý¡qæN„šÌÍÝ1ð0÷1“†ôŒ½^˜ÛÌ0!MpËb,ftÊæÊÒ¾qͳòŽ‘¶VqgdŸû…ä1̝zs}Êb‡v!³m®Àso²ÄÀ8ÈË "—ol‹Õ7Ŗ‡Û*É-7ÜNÙ½Új%…¥Æ×hâɋTݗ¢rÛðëm€¢å„Á L‘¹`é kúv…+ÉcÎ2îüþÈ —,Æ¿¶ÁßC;–½û8J„Y7h òÁ¤»zH':å2èp%w†§\º_×чØf*w©ˆªÑ¤ÜŽQEe ž]²jÝú‹,ãßP¾V drq®B©þ<™Übw0¶íR¾;5}>_ÈQõ­ävA3ˆáïœ(*þ£šä.‹°UršøvV£ÜƒŠV®í¢»Œâ`Çï j™5ú]â”K”óÖró-א`Ñ`ݶ•$¡¹M‰õjñd4!LæFWÚ2ws0·Ö‹e.ö<ûwLÖ6ö›*ȶÙ;fso¯ ­67„r›{•XfBέûäéµ\À`Ün°õª•øÓn`õ?±Ð1Tf>.+føÖ¿H”7n½•+Ý?'x¨ç«$SHn‹ ïÎ +%O¯öNäRåsT 2yMG¶ZŸ>Ààf™0HÐÛoÿ\×½O*^ ›ªîÒô“ÊQ|Ùb̬¿ õ†¯ÚÛ4ƒ Ï ¤ÓGË>ˆ{¾§‚ÞÄ| MåQ­íêzer‹N/]õãk,ÂÐiî7ŽL8xqÅøœB>8jBHäøg§'¡Ì}¹„wáx9×͸ˬKVÐebˆ’êuŸyq +ç¼ùGˆd°=ã°Þ0ˆ‚ï ¬>ǀ 3 d‹VÇH[óã¥Ã¤'Ís3ä¶n°#åPóÜ­)”ŸµÿÕò փ<ö€½JdJB„ƒËQפ +Û\-•·zⰗ¶£ú†ÄµÌôy*!â÷P²yсtaD`U“°u,”m‘¯'æ3Ø]Ñó+¼‚S +¾C@ÿb ,lwŠ%ü„êQQphŠxz¼G"×:®ð±?8¦#m.сÖ'ÎKÆ£¦$˜nõO\꭛³¢žoŸÒãyöÔù§øܸÛQÀ­›¬Ñ NYaÀ¬Küà)²r±$‰©’'Åïá¢ê<Æ.RˆWß0¸»u¥ˆ´³±*Œƒ8¦Ä—f ÆZ¶bóš tážsÜa9¢2L.VØþ 7ÀcñˆP²}ÀQ2Aù2`Ù=` +GB3AF£à 36ç\‡Ñ”3†šå2í\Z§. +Ûl_ÂRIdô´CÄ'KcˆÎ.‹'²v¢0Ò¶w×oDTêóÒCÂaÎ鄇wÿH)9AÀøK€ ïe&OÁÏíG€¸4LAu9tBÜ271z?^&,З³ÃP;$˜ü´Ñó¹@SzWÉBÙ^èRò§-¾—ÃïÉ 2H˜Ÿ–£iˆ’<—ø„s—ðÃ)#pÊ8΁ ¤] HY‰5 RŸ47Þij + ö +¤*x>ýg¸æBèÚÖ|Õ9ߝ‚ö‹ÅHó»®lG…†sbIX,ÓãUd¨?^œ.‰ª{ û¥õ„‚ê².í1aÎÝ¡ôxâ°r£~OX9¦ äqؤjð¤ù 0—²þ .Š|wÒ¦·èÕ_…Ém1;‘&uí lTä ×åYú浑•L%oe=ÎÆ°Ùs‰$ϝH±çX·º-t&n^Ðç÷°ÔҗuD…eÃaiK{y‰†m4ÀQ4˜’—¤ +l2æßÙ\>=Ùà]i«ÌÝìÊ5õLyÍ"„¾Ú›w@[Ù\VV‡ù$óLÖݛÂMÓàL0€gvüÓÈ=Átä¿q÷-žŒû!t¢YÛÀþdR£âfŸª/c 8DëéXzýŠ_ |ùÍádTd¹#½HãÈÛ.YŸ rn‚üÎ@˜Y£âGŸþ`]ï¿ý~û-óԕn.C‘\ŸaB~2ZìI O°x‹H2Ç+$¸.k5ƒVý¸`ØÖ¡ëŒ]N{ ¥2"ciR@·Ä„à/Y 0PD–U= <áÉݞ@–a®L9ìÿPÓ{ýðLmbþÍKÝEE—§„8UÒ$‘¡©Y—Në­ŠµÌúÆ=v<ÏaÅÀF}h9õçù¦Ò¾‰7¤¤ÄÈVWÊÚzÁÂÏ]©‰X[A•V@piŒ0ëí߯èˋ]ǯ÷Cý—d«òúEýáাXpRHHI–ÛØ/ÿþcꁿeM–Ñßó3yˆ¥„œŸ¨Pðß°CÌó¨? +¹!I¨/͔±uϱSe£9fD±FÞ(f:Ý3žw@`íò£²¬f?¨a.„ +:Àò±j$A¶jPbxUáíÍåÕqɀ ~l™wÊú„ÄB¾³? ßdèf£Îô©ÚAk°ÁK œëÿ£¯Í¼!†$ÅĤ¿¦5¶ñ%öV¿ƒCGþˆþg"ÎÕ,+¥Î"®.Íñć޳]W +ÑãLJ¡ÿƧôµ†•ÚË;ŒZ@B[2Z®’4ƒ×`»ç#="ð ¸dôòœÊa2—ŒtÀ4hJ*ö‚YHqšäˆ‰LÝô +†aoÅƲ‘«Ê¾…Ùï!ÕñY„%| Êᑱk¬^ôHÉ䊀òœ$Ø;° <Ž1 £hN 1«D|5Ï0Öñò”…F_€ :‹¿\Qòú½E°è² J=³=è5œ«V´›ÌJ¼6àä˜tÂ~©‰sِ|²jjBCQIÑ)¦ä9€°"ØWöÿ +@"ldý'èˆ +g¬™çvlÂH¥\…Bòt*™<)Œj/—bHjCÆVu±ˆejS •G|7BȑQzÖhÈлÝU8ë3í¸ô ÿýùÉ%À-di«Ó ­fû25ýX„¸É€Æœ|@„ƾ€*Ý¡p‹¼é! 3àÔ>ŸܹXRµÖ(Å©éìy‚X­"Še‚ó'5`Šñ…ÂvžØ,Npñ¤u ª@׫t ϶ÚÔZ±<ÈHp œTt}¬i Fe[ün§|´:þևÉ]AÁMDއ%ªbµ¬‡‹ºÑ8ÁÔOGŒ#N¡¡“2?HEsM©vAx±Ö vNWú¥÷³£T€«aNÿ:ÈȽ (:ˆEl Öi¡R¶)æm¹¿j:=–‚!‹:Ú)¼©²H‡õRŸV¦Â2ˈ`â‹o¶$ç"Iá0ªM/#ŸSqìä)—„Âmé"2;~éE)… 9ª…ç²¼…ÂĔ„(½#ídÛ¹¬-Ã)¸·ƒaš± 2›g‚ú*ü ºëõ•sW™gûqʛ;ôX+#‰%Ÿ* ÂÆOþéù9°âHңͭòcc–¦ãû)Ãs{—ó–$d†À…úq?J©«ßc\äs-璗TkÂ!³Ë%¡Äu›Æ3§8¯°Í¨M0äŒáwQµ;z©%¢šË.üð49îþ$ό'¸v¹lÇlY‘rAØë5Ó¥†Z˜aÞq_RQÞ$‹†j]‘ °W׍¯ìˁˆÍT‘#¬Ï0ÈÌkZÚJ2|h£5h°´:Ù°8wà:æÐ=„&#&RV¶Û•0 #7Éß²>žülÅ# a%µƒ°bã±bâÕ[ŠÁ´B͟‘°ZٔÒ_? +Q¨…ò)Áô+ò\s„jDˆ$l÷ýÇPBŽrŠ¬( Ð›.ƒüîx%Ïúê= `$¾ÎÙA‘ÃhúVX>Ó@ ‚ƒƒ“H@vjÀx±2›h"‘xŠ·§ „·N†<…¥¥ÞqíÚX¥QjAõcKß±üpn€ ÷†ˆ¶%¡çC\™’T×Òf 𠶋N›!7˜.J”`Sf@Ž!⅜9dÞ (’¦ªDB ÍúÑÐo·¡´½kyŒ ÜÌ­B0žµ<˜%)ë¾ÌΔE,uaW´,i^/5)úÿÉØ°] Ô+°O”Ð*4A€†!Ô_Ñ#|T:¬¾Pñt-t ÜÔ>*…<0ìƖ„æÒ³a^˜xÈ6æ-×j½º8æüÚz¸úÄ1a¹ÌÇ¥,€PI/pÛñ{äïí_ÉØ.סï·ø‘)LdkMÆfªFÚ[ì/Æ#zdh=Ÿ©`ÂòW +,T¯È”%ÓMŠ]#Ä 2Ê5æ> ü‚’*cô£¸b§Ê +¤ cø)£µÐ·#¨ˆÏðdÌ@2ð*ñý7G?achZkF «U°À£]Úa^}9IÛFӌÝÛ!4Vƒšc•tG^Շcó' ”bQmåÚؓÊpžÎëñ‰]xK²Ôô¬ab¯:ˆ…ŸBñZ}Ëð è^êB:*gœ Ë/%àƒ•£8á áý‰%Éÿ¥v?"cv¡fr7ÍM€ì²tüø|ÉØÃþ…4¼?<>™\¥OùUas^ü…žÝ5¯)Nh:eÀ@A_b +çdæ~ ú4QTøÑß±û-H9E$OmzpáÀÉkÙEÊÉ R§¶|HtÁžuÃýDQÏßÇFZ‰a€»ê÷1È_~vv«¨]2“ækFºö­s#WÐë CÂáàǪÕbQ$Wá«å»äτÄ0„³õÖüQQŪÒöø…·2eA>ØÑAnñŒ>“2àU¸ŸPÅ;3D¸€·a_d0´ïO‹T§^ÈÄFk»”3ŠOú?E3 cVžÔüÁM!áh+әw4‘ZŸ»‹Æ5*·ìýœ–áA 8Çõ´¤?R$`ìۅeÖʋ•³•X#öõWã/$ý…‡ -eT&àMòÐV°k“Ð3êrÓtw‰ëÃA&@½ÞŒA±DɏÔiyَì,¥“w(9ah{{àÙ&(Ç +`@¶ð/eÐąb/Œ*V^_–ŒRž¾¤ ° ÉĚÆñ©µ~ç +~°´PŠÂÜö°W€RG +Ó×ýãG2÷„þǑkÁ6¨WÿJ#‘Ìœ‚ˆs с÷O+Šj¦‰¯BÓ”‚<EW·+͆£dÄZ5ZcRÐϸÜÁú‰ôº©Àãw2 ‚æäLˆh€áDíÌ–JQ{–»¡¯Jb¬æ<úŸÆv8¢g§¶¬vaŒܵڶƒƒ©ÖÊec Ą“ ´ƒcèE´T;‹ÄJ¨r< "@¯Î‡PPÓÅö%lnD—É_ãÜ.M*Šäm¢ëWÿ« ¸Žfç³øe]yä_ O¨—«"“õ.¡q0ƒMj€ð&–nwö`ƒ“V `VÌ/tvM…;4½)BÖ÷ÛÇè‰ +æA–&‡e˜ô—~+’f¨Êê{è’Í*„ä˜/GrBÁÞì’-ˆÒtÖÁ3FMv‘Mü?ø x0 ÞSŒb´Áyž¨0qÅg è ³Ú“K°ôk?ûXš1ÅëºbҐnŸkÕU˜Ïhöå¸Ó~1+îW´T•®’³eî¬ \ e䥌µ3’Ìødò~ûÛ©9Aß»5J:€¸&^ÓC9Vç!ïÚÒ;‡nƒàÁƒIæøDø…`Îðõ$6›ÃFà»RV ÔÙø‘‘ Ϊ\3R3¶!k…¾F ße(¢RJÏ(€¸¬v¼ÛDè©¡7ÑP&3QØ ÚÉ ñ÷!„™·™¹hþ30“|÷S¡†¹:[qŠJÖÀ'M&ûÞSžÃÉHƒ)t° ŽõÇk﮳wœ)hž ÆQpÅ8r Ö;9U€´’¢Ð,sÒº'CÁe¼Ô#ó¹Ý17þʔaœWgÂ/ØNÔþ]‰éÜa@ž|‰ðñëæ$Óçíwu°×{<1hü9%G÷Dgí!A_ddâ[¶ÎtB½Wä˜(_NiFÒkÐjÅDý a"çnü‘ù™ìQÉsû::Xª×¦£7â£ÃÛ/"“ó7^áÏ'ùÃp4Šs3ѐëI;éFW[¹‚8x´žaË  ú3äûM(L•™eñmÃò‘kLoÙbb*‰á©Ó9Æýû1uf܍yʦ™7“^u5µØš ~²ç&°lxx8(.{t›ˆªÈÌ°ÕQö|‹ðâ`аŸ z½ ‚ÐP~FŸçˆz.0À ŸJ=.X`<­þg &~?Å"ÔŠˆüÙ?£|^V§=öï±®[ú–ì,[ \ÑYœKœYkáwc9˜ÇŽNDíaZLæGºhG{aŒËKf&áu¦|D)Ñ [­Kᑠ1,Sòg¸úq›ó:¿³’“ö4lüÒ¼@’Ù.xìñК>]V­C‡1xóç*»Bè43r_Ф‚ï@p¾ÖνI_ïð¸ï-t¨ïÈ"‘ó‚,±’‘ûéè¥!¯DQV#ÕÕVßêt-ÿ_¶~š‡¶©šÐ2¦b”Ѓݸùt¿ƒ'ÄSø´+áÈ2dŠñŒj6¡*è¯÷20FÚ²7˜s¼GD0&ÛxÛVxW_!c»!]Ÿäy³Ñҗp¸N-ãë ïkø¼ŒZoÜz[M~Wžñîr§MMEÿÁ­Ôÿ¹„Ñ”p—CÝI/wVaÔ8]Ž ˜þDòÕ·Yq]¤=Ì·Ù%C‡£à’ZBÀ(fÒì½¢I¯dsôùìüå½ítn¶âCd 6ñ¼fçGˆÎR‰Ölòg);5ƂˆzTá3d…šIž­º©§ìH¡4¸šîA@2v®=ÊøÞ¸X1ÐÎ +fL‚½³žýÑ%I ä ?îÈT_¢´¼FZœ`:W–'æüÁÄÇÄá‹2Çæûœò8ú9]‹È8°÷£WX˜î°‚Ïóñò˚ÒÞaOk\Ë4$éË89f¹ÿÚÒvj^/Œ ?øl;áÿØ…‡úzÀ¿À =ï@Zw~u=å_P—vÁqvš=²?̲VÁ¢•7×gSØP´±ÚL©m½®“šFnÂj¨×¨ÿL âTÃ`êO[:óŒJB‡gŽ'EH‚Å+?у'ðk@Rà“ +mÙu¬À5¤ÕZüSúYíš'ÐÀ^,©í£|a+`«YËu•¨Ëéßû:•tûj¦pã›ktqØ~yÔÚâîoPs†¼ârH’\ ¬«ŽËˆ«òjá‡?u§bÛÝ5£¡€tx?Ø+ÒtQŒgÈҐ«˜îãƒogÐH< +ƒD؃·™®Ð6»¡‹¥&>ú—g̓dñÉ"IìÒ·é½h6`®*FC‰k‘ãýšR¶d·GúÕśÐ˜·9 Uh»x:ºù:Í°^šV5ø ŸòtÁ”Î0rÇ¿ +dî¦SC:8Ê)_ðwä3”÷É´y! +EÜÂ:²&¬áʪûÜ(®¶ù(ÏÚÈÌ|nNŒ¥(gGê àKÐ"a »PqS„Ž­Xž]’¦_wºm6‹12…aÒ,èNDz$SÝ]Ú¤úG#@ïÂe±**²%¡ëÞiÚ+|἗D†õ¦>Z +uBÄrù¨F?ï\6f° Ž$ö]·aLˆbr”Þ³¥ŒA(‹@äÚe½Ã³¼v“„–Ù·ÇÊh‰à‚‚6áƒG¤l ]Ð'dj·®²z—½%B<¥ŠìkٛBÝåڕ·ˆgsˆ2<}9ÿiĐë&>r©É +G՛„#a< Ü# ÔY¸Íåڑ¨oÇ®¤ZHš Œ§eؑcŸ “Ñap¿mèbíú²?7s§@³n|孋%ú‡ i?6Å*F–:óQ e«ÏRNOº~ì&…PêLÂՍïÀsÌN6b"Ýë‘üœÏ€Ûì8a¬";I•›bs֌¥UT]Úd¤u>$ê~B»wÈ M+#)…´{aԈʒ&éaov¼”–“ÇÇ-){TX,¾ „–ñ«°y}¶s¼·Úê¼™ù@}SîL¬a+8BÄ&‡‹“Aj7T¡À «pŪ†ÜÇ?˜íPI Ym)"­?á0Ë–PELD|JÈ«´zmPb:Þ:¿`¢6¶Œ`XWýa¤ €ÌðqdדÐ]rnš€O’Èügq*P3┠’·‹U|¥}·GÉDЁT†DŒø"5Ñüé/i½ƒ§£þÉr‹L@Aä_Ð1cØáÐò!ºD½J¾.¯U +ùgGv'ä ŠøÛYí䘝¼ÂÀFÄ&»O:xŠ%í·Åԓþ[/D Iañ¶k¯Ã×^_ëIY=~(9ô9a×zc¾'ˆäÐîéy//ÔC0‡é%‘,Ò®ÐP€Â1s²:ñ©®V¸3ˆ—;ù7ÂsóÇûšÿ=’ÈØÌ =éîð]Dß;Юé҈÷ÀtñŒÛd°Žå†]bn0è‰j«“Ç*4Q¿ÝÖËo¹Í®û*Øe­1ºÓ˜”"“øÝßR}HvÅ5=`ðø.Ϻڧä@ƒKæàøíÍÍ´8ççAMôBÄ |ðö!†D±“ö­ÕM=:Oç­ØiŒÈoîûüL BZW‰ÝdÅ8`ö2ÚÃ!¾‹YéÀÒÓöÏUð‘MÔÁ“8V2—p©í¿uX®Ÿ“ë½aR—o3Î’?¬Á€¤¿vƒïZïspíԔ¥‰ö¿ +…¼¬“èFnf[¶h5*fõÒ\58!>Ò`=+{içðòÐfÿŸ©§O> µ¬6ÆL=§»²¤–0­Š¥8¨Ôˆ-5»¯©˜€Pìüp!С¡VIðö[d'8¸'ÃÒV‡Uv)H:`îԓ›Àå?Ò$ࠉ@÷áXDox¼Â¸3Œk+}LºeIà/Ø\ïˆü¦f@CC êm$vl¤àï +®£]ß2È.˜žÙ÷[mk4yÎèšÃ‘PGÛ¾¼uÔ¥—c" Õ¸KvTuå—Ëôe »á/f·% WřÎZi8”#G"ª !}›=dyÚð!tKÈh1ûuð˜.\„¢«a£þ´ôÝñÍùîÂ_Ù¼Š6£"=³¶ÿ.+Œº¢ÍÃàõ>·W:β~‹²èÂ2µjG‰¨„ÿ` +’õ‘ÁЈ$îbTCðUÞ7þ³(gÊÈ{Ë!¶ñWÄÌ]Zd*XÀ1LÈõ¹$F1ûY<ì՜$”v/˜¢×AÈN =°Æˑ—Öh§}  Aùnw2åb" ÄÌXT®ã þ$VlƵª×êŒú„Ö_/ÁâA«Æ,±ì#Ž†ÌcAŠ±‘$ Ž¾Dç“ÎwFܽŠm&ÐΎrþít_oj7ó>ÒdÐ7Q"¦+G[µœ7¨¯›ö}Ò¥áa^^ž¡¼¦¸öPå©af0)02ˆÚÎ Ìe9F¯²kC·ÛÝ%ŒLÂ¸Õ6/ëÇ1x吕r­8u–Ú» †ž×Èú P-ànšœ*ó -––Ê]Ú9‘œˆã€HÖpã¯öŒÁ»ÈŸ›ðs Ül3C +í"pµâ1æ)(à1‰­eÚåcâ 7ÏúŠmG½UkÀ‘KÅO†ºß Êi3foÜy7k~Mˁ턄š•)Ù¿@Ë/ž¯ut=â0-m۝†trîr¨ *Œ³Žûõu:÷TDM“T¾¤Û¬¿í»ÂƒÉ‘‘F’s0Gìy‡W0m)vËÛÊ¥µ,E?‘f_Ä<2ZOÛQQRí6ÄÔ¨#‰›…&få:6.çx7=Š ¢W6F§ÿא0ÒzNjßÚíìô*隹3ëÌì T0Të|)öOçФÉnjIª‡ÊPX¨»fŠl„ÚUw6$#£ ­Ãì`n4ºà¥2iv—±‚ál­y(®J‡FqcN݅ µsI  ÎxSo…•ºˆÑ{é)hs¿Ñi8°Âh%6þøÛ1Ĩnr´˜nrx·«wÆ͊AÛ °ëÃùþÎPû@F£'ž)û郖„Èq[f‹«C†Þ˜=‚ ”$V@¥FÞ´Š³­Â"%ê˜5zl­£ð÷^;ÏӓÚÜ(nԄ˜:ê¸_ÌÛÞûPð­`¾£ùKÕaÄ袮Ù®2óȃ¹KÒýMqO´7qAûè2çw% èÇb2âuùF\7¿OLnü¯˜ï›ÏÿÕ¡²WüuLK9k±? +áy"ãÇ „¶tÿôÙ¤¸úò^©Î‘+H¾>yÙ€dûøAáÌo“èˆ ¹“9d~‡‘SR$"ílNtƒ„¦+֒Ï,M>˜"°‰Aì³9À#ïÿË=…ˆ÷[ÚÃM«–•¥‚7Ò͝ñ=vVŠB”%ßÝ~‡²ÜïFxÒðWhÒÛР†÷òÅ õTiãþ݉‰®ìUÊ߁Ÿm¯0ߺŸ2Zâ/Åf‡ùÅgBÎÐO=¯Öœbö¦À¦ØÔà)6Bó¿'⌇d[rY¯Y¼·+âÓô”Îmóbÿvˆ éÑÆ ¼ËÒ¬Á¨zݼå ä ·ÙUˆ¸Œ¥ûïÓEŽ”D†r¦4ƒÌE¨@LRHoϏˆîT@^a¼V„­¥a`ሚÙÄ;(¹ ˜‡9’.Æ<À—EBìMÉKßͪ7^—ç«i­ ž½ø¡ÉpÞ§õ AR.. o3KfvJö”­éwdŤ-Æó™©ü‹æG2D\À@ØA¶s%šÆB*ü£µN2RAMEj˜&¡iˆi2-÷’/®‘VK.G,‡Õ종8=ÑPI“ ïÖÖ.€¤‹¶taus°o-íúÕù’z¯%åÇ´ý’°K½QìsÉ N˜7Å[Oáý¾³_üoKú°í»X®¾r³Ó™FgžeËO*ú`K[ ò8i¨˜ ‰Ms ¢D¦A ûU„4Üm#!™2\LâJÍߜp²g\WÄ7¢ԋ?ÄaĖ¡3ÚCŠÒ +´d`]¹õ‘£äõtŒ(¯™1ˆ–bà±°E‚]cž%Ža|fõƶI¢ºòcGŒU1™1t1IAr ß\PgÄ Äla/ôP xÞéÐâšY*o¶ í—‘AS]8úCBÅ ,4ÆÍéd³¦W¨—ÕI®Àºrëµ"ǔ×+²{GfÆã÷XE‡Jªèž²P*êó½¢­%èy=’Xž? + ƒ%<¬ ôX?YŸpz˜ ™XmlD£˜h 8JQâпwyöK»c÷¨Ã=¦D}@£"ÜZ=.¢™«þø–ÕR"ë8€s+}¤ sÈ£g ÂÎ!°T…ý±çzØôÀ bÑÛè%îd¢Åïiu°ƒ´1¢TŠfÞ^É{Š°›I¿D8Î-zj"š"³¹0üô>쀄‘^5t¤˜lã7”¼ÅVÎ +Á39vö¹wÍÂlR¨A–BþšÖ¶€Îó ‡u$#ør¨¿¢ž4Jo·}>Îðn›¥xð!«H±Ì*̙PØNÎðe¢ñuý–n N¯¡z³sj 2áòỊܱ́ysñðŒ£r6÷˜tR uOê›F•" w7þSr:œfãß«ì]ó)aõ·ÏÇ·¤²·ïè¶wYæ0¸ug]"jçLq² דʓ­%]ÒÆ˚õ ÆWâqÐ-®ÆÐÆqâψ*(tOü—v«Çr¨aL4‡ \–ƒ@ + „@Ë·Ì&§.p»!¡JÙÐÇd²—Gªã?ãó\¿à|Ï£ð× +²™ ëÂ+Az´Àƒ,„­žìælœ{êøüî{ô¶t„ENwùrnïNS°i&ËÁ}ä#O}ÏցåT–ﰝ- +Q;2>è~?zâ`?Ö"‘ ŒŒ\9¾œE>æmM8…e- †½ K–«­Æ`]3—)|™Dç‘^Òᇌ¼f—©7ÃDr˜Ã(¼„´¥V"B¼jowOÈ KtM”–„,'œåÉ£>LÃêçûÍ£N«‘ýL#¡‘ –§f¥þÞ¾3TÂc>⒈Ùúeƒ¥ö@‚Å€–ý€V‰†^hؓëëC|‰å­ùÐ çïvl”‹áOî ÚŽjË +G?TqBºJ‡)¥50šÆ*‡G'A&$†vá4,C›UjÊ-,<‹ÇµÄ–£`ò³TÓe2 A øî‹! ?<`Ȉ¡î´®‘Jzq‹ZUÀøEã¤1( I=úÎx— ¥+ Œa—Ry#F°Bˆ( +ŒN5‘ƒ ¼Ô¼HŸ¢r¿Ò_Ñýí3Å"PӖzºüMÁ –âÌÐâñ•¤ñÈ1âñRmPà.VœÆ½½ûÍ3B C½æ›ô{¾G¶‰s\™¤GE¡˜1ëTWµˆÎ–Ä䧓6cÌã‹|²¸÷6‡Ì°S}Ìá”IÛepeÝ:° л ‚B ˆõmØ#œ ÞjšZ2Y´ƒ¯Œc@4BŽKùxʄ9c¥4؅WÈá#:¹ÒÙ2 ¹Ø麃Sq^qW–Y»Î÷5nØp‹t$PQRµ…õ5v °k6³"ýňqNb¥QHh%‘Ô1˜ÝŒ¼î»“„Ʊv#_⢅| (kIŸ/ºIô‹"`×6gåã‹Rq‡B9òRñyR¥Ç~( +> ¡žRƒ¿ßƒ0,9Fâ1ˆÞYvu!ŠgC!ˆu)Ñ]ƒ€ˆÊ÷»@¸îþ0¡Ák¾³_@‡¢«…?ˆD³|âÐQ&Δt  ¥2|PRÄðü +.æiÑ°‡h@|©‡x®¤0âN.ÑrQ,èª7¬×ÔÞ.¼ƒU¥’;Œuù¤´Ûàp¿yß1=ØAøË"¬c¸©ƒ„Ì'måçhm˯dœ:;€;Œ ªQ=.”d¶d|V*aчŽ8’|DŽS¶Ýivý «j¶Ý.5a¤VÛ´ !+çD…=VÆH+nª‰@Çç«{ô—ïÄkàº)p ó_ät»ñ(H´¦aÙÖ Ä <ÐA3> +W‡þ¶e'¡ˆkÒY^ r)Mšyv@Ÿó$ý•ìF/@gg™¿kVªöj¹xU#/ßÝ " +²+,f<Ô¥žS«ˆ ‘?Дc¡x¸$ü§?ðà¿JÝ/ø£5åŠ×œ¨€0]—R µÃ$nD¶î¹ÍÑb0¯æ GÇårÜ2ç0`…ÓZ„l9+´BY쏶ìwß –:ÎåTÈý̝?¡Ç}uþ°¢cú”¼dÃÒϱEÔ6[QSFÈu ËU¡§ìþ'tŠH*aŸ‡°+é0úM9«£4±*;U†9LÎ\G ז¾¸ dç{¤ö­”L»æ¥·á`”]Q=PìàI wø<}RŒ>¾ç‡xb94Ž,?…0RÍZpÌ5+ÚG`Ÿþ1ׇ ª‹5Ϲ°r0”L`û­‰Üt!¦t^=â?æÙ;RòÌ*5¾HV%¸ò²‰”׸Ë)Ýé5\1<í%N$½ÕºäÑëqÙÇÙp~èÁ¯r´~lïù»@åkùÐNl­ÖHÖȹýnt,}äÁxO%,Á€Ý1 mžÜª,ø`"! Ò;â¢ï ¶F+^{;Qß$Ú|ó9 MôžÓ¨æęÂ> =Gè°É¬ råÏÓÒýâ×û"jR{!G$$Óµ†> ˜0Ò¦Ó +ÊDÐo¸gGœšR¿§ÇAžÄõ-ŒíðY5éÑ [EÌ]畤7*­®ñÊkŬô®pÒ·C°ú€º*£FI¯GçRVbÁ!–Ë͚0¸V® šå QQ„$;N_•D:Xd1Àôë$zÏË ÍˆËä;˜.à•ÚwÚ C,Ҁ`a”Ž{®Ðïú¡G>aê8ÑuL`ˆa òğ]àö=âòh h|wå¹åÐí7 р´>XÑØqåaÒkÅ{Û¯0Ñ Ë-õ‘ ï|¤ú7¿Ã¶KìX}á +° ;–꺒jGùqäÑg:å10gêkŽ°€7æ…óú%nP8fÑ&ggàØ ½Ï¹vḊéb‹eT$Ô鱔2`bÖåeVJóÉñioªaˇËà›;ùÝÁã´ëíÕ¹‹ÈŠ¿²Ãð?,.gdãð©ŽxòùжAäb„ÿQ{q®¡JZ¶¡.“(NÆPr±'ä=(¬H‘DŽ½¿èhãd÷è/‚ä\r5‡Jó_Sתí-ILÓ9–.…»ë ±5à2T>™¡ÖºØ›E‹Œ!7>hÄNH&.€AU$p¡.,*ƒ&ªw~7„¬jþš¯Ë—ú½ŠCÉ~R.žP%¾ ½³È†ÃÁ½Ð—ÇÏüÀ)SKÝ㐒ڗM‚µË&§9D£B–—s®¸îW¬ ÷ÂE³Ùúk;ÅP=Éï.ٓ?¿Ê|íjROe—Ênèôô¢ZÃ\RÓ:¯Äé.q*«"/NcMG_xæÎ1šuˆ pqf ؋Ýiá‡ú¤Åèa˜Ä‹®è0SU¢4#¿¸Æ¾>à0q:¿cÖªF¨C»ÿ;i§ÎGêmšf#Mh4†¦d£²dGn–™¼7Éâ[§2Yî_»¯—Ý;€fºŒ]¶B± †`2³â™ûÓ«±ïEø†À=ì#20ÁdL×±`Ž¬¤¤¹þLUڙaKz‘“e4[¨”á#¸_I„‹0 ¡üRŠÄc:8•¦Ê{Ϙ(sDt÷O‹.Ž>âFl7§ÈNÃÄÂa˜Ô=“‡’DJ¤„½XKð£Ô‚ý0´C@v™™ÚÏþÜ2‰äæÙÖÓ+U0úµ,y4Q¶S±iÁ{· Å-–[„žBø¯BR„‡òD&<©—ƒ”Ev„etÀÆÍçR)|u¶Oò¡(+ô(y¢û#ŠQøïÕסHI¡ƒf;2» ! úà.õ'N¯ZYZad:ÏQº¾¨“d¥£0~@ò껢6ëGÕ£€®|0Q0ÄË)Còl‹ =À£8»t¤lmƒ;ÊçËʼAI;Ê»˜{ÃçS­£°¯ójŸ´‰:Ê5´L°yú2•Žtkè—×ïPÖ+G¹%m’x)Ô0qÎxxÄmÔfFi!ÜG4O’™;Jo½²ÔN2 +91¡øŒ"yj*b-D=lç@1Š·—šLÎP£ÐDê¬,eIEë¢QԎ9ïñL'ÁNJ' +ó…(ÀsY’ …–øóy s[F¡Âÿ±Âçúy_•û>a$¡ÌÜE‰ˆ‚»•Īdy†C_.Å(ŽÍQäeÑkÄ(»Âu¶ö€†QÐáü°º_Èm« Â(Jçú»XcìOz +ǃ å6êR<¤ó[°†Üí4H„„ڌ“hɓrÖk# ›«ôUòZ¸'R(²@û¢h{tB‰}@ö…ò‰g(W ('@JMƒëž$äpÚ¸±%”ï,6S8=Åâ‰+ÇÝÏRuúæÇ!%šüß³å׊2ÊÓ¨…(Ö®Sô¦Š‰8ÇJ67µzê4¾&”…Ú}öSiÛJ7·œ"bjÃ].Š#„R–_$ƒ» g°É[a¦\)Ðc å'VH‰Ú~Pz-9N⬠8#AéýÚAy_fYF/r„Þ!’¸gåç32Çå ¿©þƒk͟––Deeí²²E™6B‹SÀ⤀à f¥)Â$2ã\‚8[¸$W%ã +(tý(:5ûì=!:æÊâôsŸÚÆ*¡«@ Óó«¥ý!7Ì3˜£È2‡"å€ +¹p*¡0)`I$csC~P8œ.«»¤ Û¬5ˆ©ŽÁke#€S6Wû~óƒ·ÿÃ˜š2ø¿=eÂekË^&¬\cÊ:àÿþD}8dŸŒéWI~´M~ؗUæ‰V듄`…¿æs¡ÚÉ-1ŽâɧŒ3(µJÞ弝ôTËî˜ÇþIj>ŽþÉãmk)¤GP:®Ó-ð¤,†ôék†á¿D)4µò'JU à¼P $pmÔ(„§ Ð±^.‚•  sú?iGA:‘ˆu’j3¤KCœ®"JãL©…?ƒ®uN G‚M®ªü“D.Ëo©—£ùÉ× €R¸ømKáëöäüt2æ3?q½îDñùI4¥ ³<ê‹ÝoŽãG7ò'^åP¬" BüÉ}Ò¾žL嘊¼Ã𶡦ëÉïÑpìÄܤ59Ø}B«vóI¦ t=yp4V,'È'uÖî“eƒ'ly–S¯´OûÉ-û¤»„hSrÍ öɶòGÏCz­H \Ÿ‚)-цëf‚+®X0TŸÀ[=4“_²—8Z>᫜%ÉGñR àüSª=M0/Jä¬.ÄEÉӅiL¸1бFAGÒÎ H&÷6»‚Ðjùcؤ͖ҧÁ @Aå­ð„eGDÚÒÜ}Oþ‚ÇNñ¢ùY0 ”§7'†B”z{<±s^ÚS'`‰xDb~žß‰Jœ™l(çZQÔûW؝Ø-1a¾x @ƒ[X¡ÑÁ6w²8ünÉǐû¤`çëmÆ#ƹÉV âG ~1º¦Â&øÄ:Ó³«k¢‡³Ø0„ÊÅC$ªêŽó\øèlêdžh,3vR•WÃ쇰ÑxqÇщzš<)€v/ y]¡÷F±ƒŸ×‹ï.Š“)’Mõ¬ éir@‚—™Œ@‚4êE¥ÕçäwûžN¬#doò²lK‘ž“Ý54Ý9j“x¼&ÁV +QâµÐeEsŸó=”ü®Ê§|/'Ö)ź?'_CÛwÂ&đIžê9¡3— –sbÈåƒs²ëL!âáI!¨7þQŠÙlNZ3&B‰ŒãU%œ„ +aÿíÇ΅ÜyŒ››µ7NŒû2§b9ùÿD‘ôWÄ¥rÒ¾|ÙèɁñhå„]×­)Œ €_&'¿%'a›5’5-úOKÑ`䄏†_Uj¾SÝ&!㸅“/Õ¬Lz 'ÃCšš;8¡f(§ò‚Ö"½)Š“ÞRh™ˆI™¤ß •öT0ɓRæùD.%€ÂËÇ…¡‰ÁeÒ0œ€¸, JØKòÖÛÃÞ‰n6S"S“ÎI„ çûЄC~“ ’`6‘ÂLoG&#J5‰7ÃP’a›Èµ C'Šk’¸X'O)/28“|ÝK'!à„#üUºÃ¥Ûƽ\Âpœ„iÈÆDB‡üM¶éhGAŒßÄê9Ý$³w>_i¸§Ü’¿êŘ n`Ëšp£Â?7AtÆÐ +ë ×0IÒÞYŽƒXæSgê¢ÑÿR·§ Ï,TÄz¼[Xå¾GšÙ¤¤}ˆoȔԽû¥pãónª ~•mDdFÜäÓ8=“  ’ÅÇJ†°Unç5_³‰&³É¡§±{ÆS²—<ÈÀ‘Sôæ¡Z¿H.əT‡`Òq.ìª5áÛ*Ä&ҕžÄjŠá?>ÖÑ0'<‹N6ùëãÕ$8ÃiL¾&\žKB‹õ^ÚG(ÂkâU”<¦šÀæ§ïqS«M†¹:tºÓåšp5siuß`‹ +nMàØòL÷ôÿ3YK’dÂJ:Á¡Ä`MàtÒ©ð W‘(›&º>£â)Ó$~àS5AI5ÑÞDÜÄ©I \A2>™fjÒýä#I'©`jb.ùFZ®;oxBCŠ‹>‰”†ÑrQïÓäî5†Ã’ËD[˜jWé?§Éy÷Lè“[>¿Þ¢ÉÓï.é5šÐ¦0 2Ë¥§IÝyF +¬ s˜&_Uzë7٘yJ€Ñq•ÊD?K‹}K»ÆDhA’ÎúÆ(Íú§"º•&kë¶5äP~ôÉ%ß|X&J˜±XÊñ0hIœ8|ÚǨ àÑÄ{ð;™¸âcrÅD¯Íy!t&“²,R >5š ‘sˆJÇqáñÐ D€ð˜ò¹žeœášØ‚*)_8Ceáq²$Vhb”DˆƒK^©¤øQT ƒ»~Fæú%šð_ًÚægB¼òžÝk&#{´qWÔŸIY#`Ü!ˆ+=6H¸bSYy&€ÂV_¨¢õ(ـ*ãag!ě‰0ðÂàŽ À²N§ š–¹ä ‰­»DÞµ| ”K¢ çØ.étS^÷u5?.!ü×HÕ]—ŒG 8P$1ljîÉÑpÉ}`L¶0ùÅbs% óO™§tçț7ý]5éT-‰É`Jþ£Sí„tZãoÉR‡aT:Œ‚B{ÕäÁnIµsɊPÛ¢Áùجän ñ؄œ}ºpŒÑ™‹v‘¤‘©h»e*.!~0X"B&,“vْ<z¤%&½Gˆz#綖2Îp QòOáõ“ÛÜ+ç`SÌË ’E(WK„r)Ö­ÓnI”Û…{«D<2û)©Œ£sÒCLþò¹òÊ$Á[†!眇ª€Ï#Ä¡µd2‹f û©¸Ì’ݦœ+ÆFd 2ÅîÛÆePK@>sØm5§¾yYñʀ<Ò8Öb´$‡2g ‚bí¿‰-Ç+ož¾®J ¼K\@iá,±lfUù$š%⠙%*r«yÛ ³Däþ^/ª.KŠ0€ótJ) Ë^oF2ÏÝnûn•%çrR5{R%Ê(DŸŽ ÷,!=¢œ¯ä«–G₱DÞ£“u°˜k46‰%{L ž u%›¸ã\™m†%{ÅÑΊ8R„a0ؖšÎ÷WÒ¿•Á-%ò˜3'¥IÒòJž_1P f"î@h•¸2à S"îõBXÕݕx¬p4†ãÇ6ѓTڔNj‰>õ%€Wg¤šîš+ås"Q˜9RéDàÁƒÄ©$ÿ‚Ï ÐI®ÒwJKjC¿ª?E‚b¢´‚äV¢÷ +ID¯’‚ÒIˆS,"K°¥K֐iÎ{IXO +]Æ:Š¼UɼŒíÄ¥tVr·ÙlÀ­†o“𔕼¦âÌèù¼šø&€ž‚ÌfŒ2V)5Š;c%@Ÿ#§'IÂô8@Ñi«ÄÝØ/Ѭh¡UBÝÀ‘†eU×@ŠTr_ˆ5§¤]ГŒSac†UÂ&'¥ٓ€ÛƒôJçÏA¯n>åÂ7ù)áÃí@•tóè­#ÍàTbõ«79ó‘×ÿ>[§„F ›¬ $Q*=dÎJB ©ÄÉÜ@2ÈàÄ¥"IJÕ¨üQ =‘}µ+bÁ†JRJ«Š¦R҉P‰ø % ’÷`¦ŸÊH™Æ~IB½¢O;’¬O + r)áI‰£Õµe¥D§²vJ´ *%Ûº .T¥œ’ÇÐ^!zééˆë<=oĔ¸žTŸÇ[d{0%y­ÀvȹÏ,Açlm*-IZmiÙ{Æñ}žò9]!NÑ4L!Z&”@:!~a"(B†ùBPJ,Tïý$B Ö dP)`¹œDHêÆømŠïà‚±‘ób¤„¸H Å8$'a& òÿ:©&JŒ2'é&òr9»1‡‰WYÿoÞýý®m”<δõeÎÓ()_(Ibi“XÍSBRãúÊ(q\R'NIhóàuñ=Q%K†£yùï äIÕ¥úõ ‘ÎòÓÂDDÑ&Q˜DÉ¢:ý}F&ÃœvK„ÁÂî‡ J°M“ôÃÄE(ì¡äk—Í÷Ÿþ?‰›É™oX(é; tP<Z:¾©#d±à'°s$êI•¸žpM], „2È%J™rü ÀŸäÿ7"CígŒ¹T/‚'œ;†GbQ¦Ó¡íߜ=:k§ +õ$«,áM“ t ‘ãâÖD= ìvÀk¦š'!Èáy”É“:ú.ž„®c}ìî-xT0œ{äþùCèš1JIm™ÊÈÁ¾wÍs’’¶ŽD«œDlihÞ§pIÅèÛ*ñc(ë 8‰ïÏ?+r’xÂH ¨~&qòt_’(ݝëL ¼z'ùðd—ÄNúª¼ mõd’„øo² ÓMBnjfcd“ Å#Éj0²¡Ørˆ…'[’ÄyJMaãÌ$ìÂá–DŒ‚¬$ñËî'{;æ6FKŠD}c{# $€ä@²¿`¸ÎoÚ»ÄHÓº{{MÂuM‚±Ê/Ž¬b.x&y·ÑƵk—Å™„Ë(®}Ò;ð‹Å`x V¢Ó’¬íÿSb’¾»²a +KÂ7“äó!,²ë5ªt  +0 (6¼¯º„Ò(`Ò&PèÈՂø4ä—1fƒÀbl,Ȇ‰&dv$ž›_0æü'tC°–R ,³$5±Ÿwɒ°Û*Øä'küDK –Dí¡Ü¤yHP7Gªèðt¥†JbÀ?èè=uàÒz!‚r)R’l`•‡%w¢ß" †}AÏDRžø°þ‘Ð$I;Ai°`'m[йbÙ5òµ!I©a¾Ùv$ RI$qrÃxڜ%É]úÖ$ç&+¤x¶)Z5‰Ä÷e?fj$éé>€A›] bD²m¨—^ËfC»x¥-¤®C!É"•¯%!‹½ˆ]8!ÒZITHЙ)P‰$ĆÎà(5=}Fó±ÄÂê="‡<’ í<‡‚‰ÐÉ!â–ø>wv$ë¢â»pÒ²&9Â஄qèH‚‚çÆûŸ û‹5Ù»¸d {8ŠôÍB;ސLN6‰…ƒR’F2'âQmˆ¨ŒduÆ8>ÕJÙ²õ’%F"ö.¹xK ¥cëÑñíWäT—8Kc!TƊ‹¤Û« ¥†ÞI͹ ƒ‰° C’2,’éG…G€UDâ•4+ø+†VŠÏ7Ô, +‘àuÐÆHoÍ¢îD‡Á§€ùµ1(¸ï»©ÍavcwωäœæiÒ8­‰D-"lÛaÁPŒ +t„ÀãH“#'«ITD +YæFÕ@ãçÞS$½ DÃÊL, ¦¦UEO3šÓ ©tS½LuÙrI‘i:"¤²z¢XÀÄR“Yœ6ý0ñD3}Ù8mó´Éìľ™oöÙv&sžyXÙÙ!i3ÀØUøÊf±ª/nfœ-Ìn""¶´n9CÁ:Ñ(lhâà6ÌÌlf׶Mjð7!—š +ºï#FÏ.è¾Òà!ŠcÅ<ˆ½üˆH¹sŒ€8"~ñ„‰‰HšÏŸó”§9@ÄA$00ğþ¾Oyâ-1ç<æ‰ãÓ¤–R23Ò’6ÒÀÒ@œˆTˆ\üþ-¡Bh…¤¤VʪPÂ)ضѾoÛhËUU0Ë02J¬Š&ŒêÝó˜ ‹Ùbï@0l¢+i}&T .‚BRÈ5¡&Й L8O¸ Ÿ'&,ÇõLs#˜ ÔÆtƓSS#fÛ.;mÛ¶m³°m›mÏÌ峀Ù袙+òLÍáÝd`ª¦pšˆš 6¤'¤ó@§3‘æÌL )åÔÌÐÌÌtÈÌ;Ö Ìj:¸sº²# šª 4}îGHU'ZLµ™¤ª¤Z¢´Ñ62Ê2 :8á‘éLAë²V_aUbD\½†•Õ̦v›Íff†hhVn]»irKŒëÚì€o·fsí–=ßIZ)N¯ƒhWnÝV]×=ϙ[»Ãªuë"Úõœëf?žås¯µèÕyœV¦äA‡ƒ­Jb‡Šªm¥ø``Ń*µ­œl€(\KÈN¥YíåæûOéyy-Š¡fQf;:m0:¦n:Íl{Ù +üÒþo?UW‚ªTE¨T%ª‚ …©P¾° +V•åÌs+øíËQÁÑ­Pé© +fæ ‚§p« +¨B… o…ªÐ +­*~ 0Þ>ƒö\Pž£ýLO}•J'³/¿üò¾}/­Ÿ£ÁeÜ¥õˆ}_÷Ù_?ýË@yO}ÿ'Ê“—Êÿ“ˏ—Wnò7´o?…oø›™Ë\w‡x5‰w•cs´ÀYÌì8G³ÅÌlf¶mffqë@üñØàûŽ¤2=ìëóäñ(ˆrÇ»9žÇñx à±áŽ™w<æ AG;”ˆ4'|3LD’ +®¤¦‚“'âՑð;ßò1:‹›_úŸôkWx-‰Ìí*¢ëI(äÔ¨ Tºª¦'¨dÛÖ +€’`8‹D£QÎb~-: x:HZJRH¢Œ$=§Œ!@@@@°oŠÚMHsHQÃ,R¡Š¢ù5(r·ãÂãªôDލ¹æD{Pùs‡Íw‘ß­e–HÄ'aŸ4³E ƒÖx°!'a.œÏPq“Þì¸#4¨ˆ¦ À ÁD¤õG°ÄYéÿ/Ã3‚*ßÞ¥Jà¦éP+_Ür¨ ÐáÑ áè‡×.‰‡Ž†À Zþ8ª!ƒ_µ^gá´UÈPk¥%Š¡ÅÝ 6Ô=aæ£ÿJðéIœq¡š +~óºI+Êç×BÓÑ Í?„õÈ÷a…öю5ª_u•KË«'…ò¯žY(”jmùLpü'É苶Šü@3F"ÕQU·î<±HPa/i"Bˆ N(¹Ä4(’pü2¨?k|AõEG\еD4[®%¼Šwܧ?Bè+s o[(r&žÆ\!F†j0%ù)´ Ô654•÷@ø cÁßµ¤Py.f@󞸩ÃV±æxKA¹~Të“à›5šKB7eñ¥ð„IÓ/%éé¢YþaÉ㟢.Uqû³ñÒ%¤Ú "ž¬ðž–?ãòêÓnÊiþ úr:îɇÇhi4B8ÐÏOÔo¥W!ûÉqŒ÷Ô½:öZêg´sVE?%ÀR3|!òÊØ "Àÿô â§cg¶Íˆ13EìðÓ:¤§õLrïãq<ÃñYƒo~G;»¤œüÚœQÚ¹_ìãc}Lɒ£>Á/ÇjÖÁ¸N; Sœ âhñ™?%d_¦A>ðøñ=Û³Œ$îéÂ0}¶4õô¥=,‚´é*{ry¦Ã‹Äg»a£«Æe%=!༭èYuóö@Öo{ž}îŸóøÛz¬šg~›cŒyÖ§Ì6ÇÕòÌk®eÕ9)¿byÌ%OtêCWWòìGcψI¡Dg<ÄÏ^RñôJ’ÇñäécxîƒKM79ïbnô5½·ì̋i¤¥ÀdKĺ¡b8ýÅ uɀ×fra _åŠ"šOž]‚nú£iáxD­VÍÞF<õ‰ ͸ܚ”X·?½¹JМuæ§Zlx|Ñ[u˜e‰+ @˜€À…cEÕþƅc&1Dñ7Äíq›”{QìJþZqO¢æ Ä\8¨n§Ùab’€‚n\8nÒôý£ð€†ÏÌ9–¶Vœ—7ô÷4hÜ'Ž N•4‡ïYœê;¬_;y8éå #ð#.JfðkA©ÐÒ6â3¡Žl3|; Ç" €ƒð¹:›^ò‰Qw=…åFBÈë|£ãB¯ÊY^ÿª"«aB( +³N‡?2¬ëTˆŸ1i½Ýˆ¬Å=*Đç`9(@꘤ H#E!¾¨Â‘=*Ý!ÓiDVᐽÞ`µæÁÕh‹*ÁU8¬Žˆn\(NìXC» *ï§'ܤÂáH/OáT³äÊv+ +;Dž)£F(S£i§¬w­„²kpDžb˜¬?Çê—s5ªŸY ¹ Üïèá½æQ]j6Û®cAáà»\©ö&9¥Å›Tú„Ã]ŠïïŸCyò!õqQ#HívÙãb1R[\°x%“C8L × ·„ÃJ˜n< €€} ǚ‘S(!‚ ‡ÖLd›„ÜŠƒ8ÒÕØÖØ’n¥’²Ò7:Ë‘ 3«Ì¸È2ru+2U /ŽqÚµ:ì[Ͻ"%E& ­pL« ŠH8x†P?›bO¬8l¸)‹©w•J Ώp°Þ­`CÏ4¶’¹Y¼5ƒÔ«,h±Öo€*>)áj—/ Jëí$Š`wÌ¥w\À)½çr¹pA¬7ÞRY½KÌÇÊÓ [·7pËẏZÍäýÁñgóµ½2ª´Îi·~ù9oÕ"œF¹Si²UèfýE!€'ÿyžîލòk‘ÜŽ¥54•öÝI žˆñ)A`Am/…œ86j >š/×~åðéàZè6.3õýÓ̶çñ+L<Òa¬͖XÝègÖSßâà)ôP.Zñ°ðÉð!­oõL*#ùöB8fŸ ò”\hGû& ì<ÒɈ°Ž9‰Ûî’ U#Îy¡‰úT‹‘Éâ>5’>l…©sÁãP®gh\ýø[ÜFŽ“\Ÿ›ØgüÑÔù‹)KÞ]€¤ë±±X“Ò´ß4ðÛôá¸/j¬Â!­D= ÅdM.¾jü*×Íþ|„pPU(zñ'Gan'2Úß«eò¨3ÿZD°$ÐB:=?áâÔºUg|`Å3Ðâef]F…ƒ”Ü!€ø e©ž±¹ÍH8ŽÁBg)½Kl6 } m*&ù,{–"w‹¹òA3ºÍVKÚùhí¢Ø7]-[^EJîm¸¦Êà¶õ™L{pЮ½TԖžsxKàÊ0`†×ø‡³øηŸ—IÒ£<3qÄö´ÅNªü8£H¶@Ô°Y%šq$•‹§*w¯4HÄHGÉRfAŸ¦H–ƒƒÝŒ§zÌFúégm†Ú$Ý -à¸Âm:$þ=ô›´OèÔS½IåKRà +‰TŠqÄYpp¾Í ÑЌ¥ ¼ñ½s$è¨ÀBíZ íQ9®¡¢‡ õÁoX)?oc‘>ÖH¯W#\×8X»è ¡á¦‚`Ë89Á± %\óåÈÓ¯UŠ6€e€dW.<Á{÷ôƒsŸÿ&çˆs 6ò3CC„LqpˆUˆ‹ÚXl‡ÖHÉ¶¬Ïd2ï‡nÕÍ%Q—‹HÇê&ô °–µ…ƒÃæ0Ž¿ÍZj÷Åà#͸‘P@x†¥˜c-LʐCƒÊS)Çóšåû]øބ@ë;ÖÆ#™áäFù¨;8jõÚ,­T¯M¬åTâúÏp˜ r»\¢ CÀ `Fýa.¦LjHté˜ÔµåbW§ Žr‚‹‚÷ì™%à„¨xäO3VY,¤ SâN²GƯÎ؈¯$?ogg˜$}§€fÁQŽ0Ñ$¦3‘ß¼®ÀÁ:hà˜Ç§²ý*ú¬Ž¼Pƒc3x>›Bf­1¾ßNñÉÝ +‰ÒWÈ=§¶? ²:\ÊQR4>Žr]0°úTžÿËGµ™Áñ©e%nÀO[|¹`Z!¸!m0)¬êDVÖ"]& +`&9ªXˆ§'Θ  ÍV1>l¸.á3…+£F!]Ö©hõ»`pð§@DGüoezc**7<Δ ™ô{ê̕ùF1cp\"¿ +Kƒ¸X"Š®m•I0X1¸ów:š¹xÆï=_’¤'ƒÃ—4™N©ú¦BÛJÈè_:§ëiƒg\øEà1fÀˆSÌúïÑ4ïp`"îÂ)õݵòä~?žîó@órWÞµv:epTéU™³Èà°_cü8r:zVÐ"• +wQp”M +ï´\( ¢9E³ÛÒ/ƒÃaŽî…38‚ãУ%¼¢3¨3q#Ç@à] +RÄïeÏsŸŸÿ—Ю …fppƒQšäoŠäSÇL‹âÜY28 „÷÷¬Èj>¯p²Â,zìcC¿&ž‚W²'×Õæ'ßÝÚi7fxŦ-YtË ú Iep¸ZôÕBNÁý¸Hr¡Ã0r‘4ÊáÁ-K›L(áõä°^Náà°LC‰"K,}õo¦BÂA`d-M†E›«¾à= Ƭj\O*†¦/«â¹È¸ªO°wðá!hûø}r;—O *0Ÿkkùõ㲶ƒ‡ö-Á "Þ¬&®L·,&/ó&BÚxAž0<2º¾HæT‘«Ïª^òöVõBñÚ¯‰Ã© ¹¼‹ø˜HdÌÛÑ#€yÛk*óÏ°f7èÄ B†G–$™à¡‹DsJ%ø[N4iE‚¿)’“¾Fð+éˆà¾È³Ñ¦’ˆ\&ÿ_ó’W»“S›-!˜éÓvm\] (¢I ¼íØTzÀ=&bB!Š†Š@ïÓnþ {Ãzqp8uŒ^›¶ +ì†Áðç8¨ %|ŽÄY@F㉉*qCŠ®º;}eÔ% h¸OÇӆ(¡Ï¶™H-c¬í]tðQ'M8}–ô>çމÓÓÕÿ±oÅFê=ÇÿvNô" ^ÿáF/ˆÿôŽ{ŽwjGÿ¼Þ§pZa™còwõÈ2%ñýÁS՟Î!Ğk>1°ƒ&J“ü óì¬(™Ä~¡&yÛúMH¾Ìûö^!ˆƒ<R¿²¿Mµ¬†ð¸cqG4Ý8é‡ô¯QÓÜWmN'ô#¾ò¥µ¿z%Ϛ) ¤ó#jV\±óÍÅ1¿Û_"巟Ü1ÈÏ·_1)²åÅ.tÎ~d¿ù-ÅñCÊ£3·~_žAsËÀïêGõӂû>f%ò>ØKƒM7³`‰àp·¸¹¾±J°€¬¼ŒëJ¬úÖ»òd‰¨O$­çºéÓ¢×F5β»b á[¤Ï±ØDßN>º0x+)ã#$èƒ25QŠó|ã’A/bø1Ó|̺=»D˜¯¯¥³Ç’åk׊Z +›òMò‰”X$ÍÀžÙ†NêW5J}Jø\ßp ŸëÉðí}xœÙŒ3¿w‰ºJù³+U¦÷À…÷ NŒ~Èàb÷º¶—H5"ËXutoEõüŽ*Ñ¥Å<âvŽÐ +õbdd¯obžÃBHºÁ½Ã×»Ûc_„ì9X²=$78skµ÷Ê?hÄI’ò'˜!M™Õz-Q¾)֛Îê ±76„Zª·‘#a}Lñ-õԊ Ðr°zX½¼:Žþ +˜™T;½K[yЋA˜xÒÎA¹R¥7ú¬xéDzº£/ÑÓõÕn,ÔɁÿ>t¥¼ŽöÅ?9ûøP÷}eXRˆÈ²¼Ä®ô¡ÊêùMPkŒwðe¹½Ö]?1ŽˆOq›e œÙCòî ]b2›èV‡ñàO>ÆâÍ}2Ør…Áæ¦34”RFñÀ_q¯)1(>@®j÷„Á‰ä†Ö˜ûÊ|ܒ2¯«cº@¼á®Súi?sxƒ}îIfÕ0)¦ùÚü>HՊsΜ‡ó›>!âzÐHø~e¨e6‹‹ºvBj3`Ôu8âI ^£„0:èùØ¿h ,E™Ô‰ƒ_ŒU79M’Nñ”*! ƒ*b$%Êè þ—H"­÷—uqË¥OÑé~ª\ª9ÅÚà_~L fè\ÿџéí¤<<¨Æ`ñïÂ×ülåþŒ·RÎǜ‘¬«Ñ¾»&A¨^:¦¨Á¸ ¡L¦F‚– byk€Ç˜O֓0Ò»È/Ÿ‚æ~°Póhh‹£ ̽fx&›IÀ^‡>§îN\a¡­5î*4åσ„ ‚™NЮjG½‹cûÈõh\ÐB‹Cç™4f‡eÐef̌Fd/uãRR±Ã‰NZ‹wÄÎ8¿7Ùkô)-ŽñC™k œÇ +uœŽ tEk´1«ZUµ6¾ƒ=K GT˜Úµß›cSÚ¹D’jXø4N•TËŁ|³5ŒB2 #!f$2QQþ}âóF¼B„–½)ÜðâðúP[ RæÅÑÈxxsöV”6ß02ó(¹aÑQ¸k'ÐÙàJ©ål»î¨¾°På©ÿ;^|…}oüÍ/³O#ïºDº™<Äeª@œÁ: ÑZ€)(B^åÍL̈L  -»N½8|ԏ=ÈwJ-IqìÙo2f òùv,¾8jùâñK¾8`„ÍMHoÅñH1_$ŠÁõ‘=[é8,ôhÏI¦E!à©(5HZKX:fÖài“¸EO„±>®u+W˜U¯ +Ô©ÖÁ©Á!GfÎÐæ$Qòto’ŒÃ×I €qü¬/¨Ä.u±ÆÀ8RùÎâàã 7fÈM]'´lôÃæ¼·ÍX^[‰wÁ³Á8`»æ!Ž6G, È(JÀnL9Š%²åƒ%)Œ¨“µØ¨¥”W,íYjSs;韌…ÉD©‰yà+ŽîqüÍ­ôua¥m˜6‚Ú9²Á›–Õq²´F†¢üf]ôGŽiØå‹cº‘×]ÞàÔé– /VŸ?<ðV£p8œŒãÈ(÷â¯+s R³1;1ÀÅâßÇÒk`Ð2ÊÓiÛ` oÆIÃäÁÅïUCcmÒn¨¤9åÕ%)k¨Îr4‡£jÜ¿Ž¬)'F¹™òa-bŒ‡¨qdIÛU^h]N +'M¶‚_…°$èøÄKêMp⟧g0gÖT1‹ NMµã`„3 A 68õ‘Ì&@Ù.œ6.Æqèæ>-Øü9_ãî3&XðpAFy’;X—Ú\"é!Áq&eUŎ囊.¥ø„¶ÙÆ¡>!š…mÄmL‘ 1I¹’ßÆa šzSÃ5Xå°Á¼Ð…Uo8÷F €~¤mè&âÅÁÁ÷q{ ˆrt+èMí“íú±l¨!p¿qäÁŠþ½oÃB2¡àEÊêútܙO‚¸°l8|¡`:$ÌÇÁí[ciD%¾â”ÖôbÌÕPB³^‡ã ¦þÒP«ªnïq‚(ðC“ã°·•šæ(Öԁäx¿œøNj߅Q1ˆÍ.À‘…ù¨1™&ùˆÉØmëǤ, +XtÔäwª0Càm÷GˆwÁ؀ǀrV¥ ÂŒ":ùd™ÄQø}ò’5œ$M¨Gäjôv¢S1ŽƒHRã8|Í÷T$ !…\¿²܄÷ˆ¦]§žCqÅY:“-2™4Öt"c?„e… ë.ñ)ڇ2©é ”¾7Ø)7*\Ž#{­Òís 8*èø§æ8ö†µ'™´Ì?l߉Çh'JRYçr!EúÇ#ú¨Š LoÇÚ¦™‚k†Lб£"mb4]>¨ÐTmÐۖ:ºn¥å÷tš’1³¨ãÐá&è³tðkÄKC:žæà˜dÉ­á8&…Gx&³V,s}ÃCÞ"Òõ¢ŽVÝ¹‘aê8(v×Ò-:YD#é#eÅŽ"ìÓ:j`xðG®¦U@YCGëé8¢qÌÑqˆ*_fòªÚæ7¼&È{%©O5ƒ?ä<::èLÅÁÜJ 1Éœí «Zc´ATÇAKZÂØ a`O:WuZÿìš0wI²×q fræì8lÈüŸ·º5šŸøI ²‡Ï-͛ÊSrm<‹ ¿îWyž¹ãàSV¯rg‡Ýq° ƒþ†TMµ¦˜ çº«*‹Ñ˜‘£’;AđwÒQ€T¡°Žè`Ü0%-Ùïò«¦,â„E@òÀsªMiaÓ\ Gr–ų@åídù2“E$Í˜Æ×Pq¿ aÎYÑÔ J݁Æ}†BBp[e!N9T˜ðš§ÉE¢>³%²ÎÛäZtEîE¯¾9_UîV\+$kò29˜Ž7 “2ò]"K¶f1KK|fQօaÿ²¨Ñ) §¾¥ÒøÝ- !­‚?n ¿²°y +¶•ôÂ|Âz +³˜ +·c1°wŒTb‘/’h2¹yžÐ‰.·þ¯€•Èݳ߃‰”FG‰vQF¨ + ÎIÜT&ѽ' øH¤®  Oý A èÂveXP%$äà;¡4ˆú*Ë)ZBçãZYl~鳿¿,ä0²+£6M—ZÖ!D!ˆÐhÌ/‡ž-E.YdY6 }< ¢ºŸúÇ¡Yà£f±éH\\&Êo !äø;©&À|hpFU +«=üVU˜{“(FÐ5 z¦’øҕÕð샓Ezl³`:pBŽ5áŒBwþWªrĔë¯[ŒñÅIbÒ!¤CV©dg§Ï$ ®ßoävÏ.\õ#òfáœo{æs$ªÝö9™ÊÏbÈ ZÅ6”ä~rÀ~B†ÆÅ ÈX™’ö‡ÁY¬`Æâ,˜çtõ½¹%c‰¶d¥X•÷¢Á­'Ž¬hQ0~Ð5å'ï€X²ÖAhÑ3\" ”“ý‘@äCê’ÿ¯Ó +íHaUÊǾ§É,Œ­ËÞUÂr[‡ûKP]r~7¥ Èå,…ÝÕ!Û±J²Çãq%Ÿ–HÅGñÉrܦE-–ጃnd˜‘ÃIÓlpF˘O:„XP4¹QÒ2iAFÌ·˜ÛY¤qY°Ø÷£˜×p,‹Žf»? “åàº¨‡#E–7”Æ‘cóêЗ#‡Õ×Î臛ˆ[½kváé%·†­lȁklx„0t GSíKž4ѺϞÓ<"àE7ಠԃ^yѦ +wd•Lk&ØÚ,dja€þ 2Mh!ñMQ¦B‹Q<>H/‹ÞªÈB7–GÜ)¨:Ü<•‰ÁYŠ?ôÑQ,…;` ëý ˆc /ÏV­ààXe„O>r?`à݋{òSÔh8x@<£t²ÌSn™èÍttÀ#¬¼ù8¥s¼d«ñ«±Y|‰·0f-’¾á Pu­ytÆ0•}%Ÿj³hi»ìaäËYɌ£'Ö ${‘DóDYeé‘ åè͈­ƒÄÃÌHìq3DÃPÌû‹EÒxî$äи¥$ñÙÍû‹X¼s wÀ±@L˜†˜w'C[L†5+̸9PݟôÐ'¢;Ärücë– aߋ·é•õÌ?ñFЃ†“tL%èmoU›Èx'¦HØF¶U`u•Ùq CH‹gH³à°KçüÑêhÙ²°?0s¿ª(‡ðsbÄbû4¾ê7(¯ÎÀj¥Øt³"€{f¡ÁJ-5Ñl?ÓIYC¾gx§mü¤)jñ—?qEš–F/_d_OÈ^!?ä@Ÿ y9›dܧ ÿa8Ú÷ðå°=®ÄªbÊÙä1à°Ã®mÜA§JQž¢Æ(þ `Ò +‡‚(Ubn'÷Æòm08ï#Û'Ý5–YÄq…ZXf¶ÁíZæMãd (ˆ {±¥ CW (‰ãi‡*ƒ5¨¸âÞµä×6BD#’kDbà¨àS ]Â`hî$_ÞRÝc±ÕϼfJõO xTgî$Fߕ)Տ4–ŸDˆ±ÓŸH<óÙd˜R1èÜIÜNêTD]9s'„WˆöŒeåÈÄOz‘‡›ü‚ýg別?w®rÄÛFD$5Átt?é3Ê ¶ìto™úD,FD¸¢rDÄ0Lž°´Ç*Ýé*A!G€H+:äë>¥ªCä«tv½l߁;Êø¹êÄbÄȗHæëÖ`Em':/…2ð X¼†1Ç<ƒU*G®?KjÖJÃáêî9òñێƒ,…Ì2­>PL j¦Ê°) ÊÈ4æŒ_“ébÆÑ0èŃéwic½#´B41œàYR²O0M^ۑ<|¡L§(º©›!Ìȋ@ô;åè}¶È¡MÐÐ>4:þ[æ£cˆ¢ ”HrCyF¬ÛØêÖD$…6ŒĄr…)÷…¿:2D"Zúíö±ïñ3¼–U šÎÍߙw—¤CÈÝ6|‚'Zx'çœy #bÓ!Èü¦§–9=n{åœ1¡Ï)d\âzä™ý©ç'Ø5ӟTUß)zF—4՚£ëqÑ|Ó¥Àî^èdb¦¹—‘\/¹+ÜUÒ@sØÅ~ѝžOfŒ0v»n¦%€ß2þÞmÞ­û“XŒç@;®™ýàÝ›a€…ã¸4;=IÍ}‘ÎqäÈCbB]-µü¹2·” íìAØYpeæåq8PàÓ"À¡Ê@–µÛ›4©Q 2Îrú•#á•Ø Œá;œ8¢Ž6¿ùßtù{ÓBnÈ`Õ¹@<·³yˆb"·K¦ñÄjåXÛ0)‚Ø°Säñ*¸2ó[ Ü_Ú¦ï[LҐ´F_1¥A!^ë%9±ap ë–&ãêEd`òÌõΛBN}0£-†(Û#©N„Þ}IÞÇ÷£6FÌÃ5ºZ8«îÁÞ½5ªfœ¡¤‹}x 2¶øÁ€›§ñëM!£„K°Aq•5"GTB×%l_ë°8œÙ… V=0$ÚWþÎgƒF0TMú€Irà½>‰4è%äe»N°!SՄС°Yœ˜Î-šdÓçôQÙxÃU Ú]ÎÓh›Û‰M hgÎÛ¢´u‘f`:’ôÔ)†*ñZudtîÖ ë4ËëŽ ·‘zw>5püuôˆˆ`gðµá±C!”Dð@,wÊ>Øo‰—¥ ãFm){ÉíPoJ:˜Óv4ö‚鹺qòDo {`Åô)ª9ÑsJôSO”m씇ó1±e¬”'fB:§bìÁ¨U›[ ¨Ié +2Ø¸géSq‹=Êþ.{Áª<ÑO­"HÐLºó]¼bH‹TÆ[³äëÐN…+®À’o¡,[2ç9ª$@¤,#¿OeIÖ¹ùXwµõô{¦§”„mhT%Ÿ®Â}±Í1éåøâE{OßD}m;~«Š±rÞç"<Ü9¦ImÆ4býÄ"/ Ù0×> Ýèã +ÇÖ^_ÜÅót°$c—WÃWªiWñÀ¯øSsHҝ۷qrþé7&,ÚÝô ]b’ágš±UE0|T´dÚ ,Ž…ì€ YCi„zƒòˆ0³À¯ÀI‰»£ïrcÊy×;;ZYè˜æšrÚù]gÀd<ñ.™q÷Umê[<õ¬¢ tûŽ#‡ÄøP „’ÿ8nÁLIÊ5–ðëiÄl0Ì%\{’žt æ$lÿQŠ‹ÛGâœnUì×咫XO¨»êðÉÏO† +ëE‰ï”ù·Èù’ÚA~èþÂU&M>»¯ÝWýD +hQâƒPDdÏåI~ycozª,’‚Ðé˜TPÔæ€%³S˜1žìeìU"Í´û˜+r yð G¤×¯RäqTRQ9 ,ïC +xé/CÖ.±F¼IcÄ!V­±O#ݧ Bµ ׊læýœzÅ ®?©òFsËàjLÀb^4´Eª—Ä¿Ÿ&ÎÊ$Ô0]Þq”¶ê[jí¸×6ÁЯ.'ߟ&ceá¿ÝNˆ•:\wÀ÷aEÏ\;î¿ Ú'H)ò-}#O+º¸8cNr…¡G¡ç™¶%;w™Zݍ]0¨€Q¤®¸o„ªºƒ¯ Uóh¡; ̛''D«ijL4x-£ä5žgª"‹•ÞTGv v¾v"²Q ©G]Jœj!S£ +uDZþiOܱÄ%êÙ[ß '6X(0õæúj‰l„0ã¬ÌÚY—´¾³V¡˜À É(h RRÀO×|r#ð08¼˜âªŒ/Ÿ±Ñ¨¬ûötZúï»XiˆÙtÍBð[¼ æ§ÄëƒÅًԯcNZܟ?T&„¡€Þ‚ç&ßå Z5cÛvpزôDØTï؜Xïö¡ÖÁìÖõê½ìQ*£ŠE]§Z# þT›ÇüŠ*vï™Ä˜­Ñ)®:?J¢ÀZ¹5ë%„Ö} +„€«ÍŠdq’²}=À9Í+“ú±ÿ&Ý ðz-Ü@¢>P&“Яk@'ïïq«¨µcÀ‰WÔRE#•Y@;w}=«Lø‰É*UYûd‰ƒÄH:WØŲzgÞMÙ¥Ô¨í ƒ‹~ƒB'ù«bL©Œ6æqñXµ=C*¥ß°†Ídl‘ V™Àiàs¼|àÁ¶úV`èæ‚}-È_̅v7ª_ +k"íy ‘aXù Í i­À3·֌¾òk<†5Mx»à¤Ä1˜·—Ünt‡\µ˜ÎÌDpBÊTèYžÜد¸Ïx©ß.ÍvýÄ­WˆÆm½×—¨e©cN= JÝ+á‚þy45 íG–fy¢%¾nƒeíøÂ[4OYÍýiu…^ú¥IfXvÁ_B¡€*C¼ôÕ^Zm0 „U¤ÖX¯z*æ/vÚaʇ:éŹbèò4j|¦¿ Í’.Àòü iuÍg„!‰™l©Ú‘U™Ìâ¡>ìå œ?[¨{ »Á¤s¥#»ÖòBÔ8D±.5‰žÞ!¢êC¬;áDw“yÛ!¡5F¬ñ“V#²€¼&ҖÕY•g*¨‡ˆj\¥E¾•¼|ÝAš¶úñϊE,;áVB“Z&;ß®J %m£¥B $CG (1%úþujÄb˜$ddÊe©zŒ\¤Þ +ÑMûàèNgÔã=%õ—0M2Ùú¾aÔS ʽ®¤®ì«ùQÔI-‡›î“ëSzbýMPb_Ƅ¨q²ˆ¤žB·ùÓ«×|¥ž¦òÈtM¡{@ :*T§ŠZѬK&ÎTPšæCÉ-7c#iL*±˜£Šp[N…*e¯.ªÑn4R®ž™ÔŸŠNÐ Ýh?ž5Láʪ3Gºq‘ÈÀºóé³ WÆ¶0 ‚ÖÄïÕÌ)~ö4Óäìa(å/šKف%’Ž½€°ée=^Ën}¶eÑ낂g^~ŒØµ§*;N’܍8ä^/úHBKäí>›uËaö"ØÖk„ ü‹([ƒ HjðL:šŠtÊEA.–}[®üsN!uÙîf0Xf›ð=J|‰ô·wFŸÔrß,LªmF àZ#`55 õ–ãJôÜBÌñOþÔº›%¹Ýö˜4°ÎàÖÇ0ðÇ´Ãkaxy–L·>¤‹sÄ¢Aürò`ìÅF\b“…®&5ÄEêñ¨§³ùPÉàFŠ™œp*œDyL‡PëË×]"Ãz´›V2@"MÓa}xáIfѵ ᲝB‡Ï‚×5yâ^8ãÁ‚™ +J=öÖßv«YZ疲ÃæÅê iº¥è*L)Ó@š‰Øƒsæ7øâ¸UKú9Hª^à ¸“‡P¡›1~6»Âc-'ÙqˆÐÃ­×<Äô!uë2eï݌}ÜóÒ¡!Iö˜a•"ºGF’ü‰aß;²ÉTÐE¤£æ$¢“Gsb 'jaY=Ä°xA%Na­ó¦˜û_¼g)š€L]^Dñ$èúGu~&%Hx¤år=äIÌá›v± «€eö1& +ÖD&WdNŠc!xy ÏÂèu¶Ÿ””QRD!“üi2ó°ZØyIìiEï¡H0ĪšÒ{äÃÃÔäÊŽ”dýÕôҗ”> ¦¢Jk™²‚üƒr'@.°/¤mëØIfb¨äNsÿÀåZ@F™¾ ÞɄľê&F"y` m´ÃfB¿ö¬aė¦Bò¸ÂžBa©†U€b¸,m¨‹s„$ÃՊk`Ý é^J¸—µ©̾mÄɗÛ8²1(Ì¡ÈH 5Þ¸Å_#¯è8dDlÝY—H<0òpŒÐ~à\žû JRaù¤µ[Úx‹]ˆ @øaÐÒbô³¦ô`išŒ̺[2g< +¶ƒèJnlÀM1ÃWÀ½ºRÚ÷Ç+†Žä'¼zMÜÁà=RgÃøŨMXU·]÷RÖKþ•ÕËíٖ!æœr œ}ç?"¼P`Ú¶ k0‚Ñ—tÁ¹BEAÞVåÀBÊ1†Ž<¥[(€c!¡ã…˜&y–`à„ÞGQ<ì=|9ÁÁ¡’œdº'¨ßQX,ÈÁ9Á/M†MºÑ{çrG1™GXÕG Ö@œ÷ßkª‘% +ĨžM*:j0È`8ÃD¯ù)±0ÁY Lm<(…!‚éCb+‰&]¼Ÿ…5 +&ülNɦ ¬‚t†m¦öÛ¯Žç²È†«pneI6‚£È:¸¶ö$y.¹ÁdÖOmâx€Rt\®#¸’m~;Ç挖;Ö4I”ä“R/ðndûîÕNº†f¥Ö¬±}$¶Þ³ÜœCsàA¯Á¨µ&Ž;Yè ~»gE°àÀòd¶¼ºÈŒ‚,EfûˆB‚ë(Ô‚eD +!Á/Â]Þõ>þz­<7מYA7 ®™ìËJ0[ìÍòÍàB‹9ⶈúå–ÍxðÛZKp¢ª×{½•¥E¥îTy\Üp#bN‚›k/ÍÂ7Umª’`«"²xÂZ¨°oBƃueÛçDŒlRQ,檰>n¨í·ïYa候âAIƒðKp„kúT‘àÿ3Q=ÏÅp»t‰}q>Ïɑ¾11dœC䉚/¬ßÍ-WÆ*sÁâR ïÎtMGvÑøR™xIáÄíL‰§³8d*Šuî{ øüďX»ô^‰¤S*Q¥6}Öm‰©8gÅCáÙd¦œ\¶°7/Ž¨r!J¢FMB>ís+pç?ÍÃcÄBÍt7u•…'.Zü4 *£Ã¸¾©,úZ°Eȕ¦}‰ W¨°ýnΊ1eÜ°϶„|W{ãŒraï&¿vâÿ>< +£UúÇæ,a×1ÄkÁ83Wz¨-Lí!^¼·Ê€mknð$«jÊF}€&ê"6¥Ð¡ïœ»[0$ šêN“. AÉd’1¸ç‚Ÿ”OdÁoø\joÉÀ8>‡¥s‚ß͕Šƒ‹Ô QÝ ÎÊa×÷õ)í﹄{,–s“øÈwÀäh÷÷åþä֏Âøí¦) –tqV.‚ãº,¥Z:?´ÎõÀ×"œÊϾ +¿jOêéLûÊï¤irÙ PÐÚ±1¶„(Îý(Ž<´ni3m‚ õ=õÝ$‡‹êþ¿‘Cù'Ž¥`»gÜî²G}¥rÔê+Ÿ´Æ]ëÅ9î̲Æâáþ¥à!›ÂÚ¥ú€ŸAfðvQÁáüA‘Áà1܋©Ô爢+¨mßL‹ÁT± %lt Ky)´6¸Û=X{$18R{Ò+N2¾;õu¬bBrì£`)8ÀL3ùÚFsÅQYô0xÅë~w ðS| +0 ¿ ŽQOPqÏU7c®÷öÐÇÜâvH.Û¾p 2-M«#÷kJL8u«koŽ±{hÑ)§îÉVqÉK ’¶ð`AW(Uy)dÌòV’êþÙ­¢±®/:=˜\g£€uÁmõöЀ’£´±'O+9¬TÊ&B&•e§ +kÄCâ:k»NT +ÕõA༎Þcy£¡ÂŽÑ5sE Â–U$Dî=L.Ã<ÃS÷ÓãB½ s1úEÄ] gä^”D¨‹¶+³fœâ`Ûא²Öl Ï P<ôî(²QûPtAçü¯[/ˆÚ Æ—EPù™×ÞÁäŸã‡MKƒ{ì7ìÃöê,6÷&”M ¬} ÓWV5S¿t:¼`–×>±ŽØÚD3Í²qŒB_—¬·Êk›¾ÎWPË´`Cßýús…¡ “<Éâœ+·ÎMÚó„Ø4¨K¸éqÏ~xHÂXæ¡CsÅr= +³yÈoËä X1ú—ʪÊˆ{œ?>cÛÔJS3š¯ðä!]‘åݵ>'f*j __êC¿ö^eú&ày=g¤m*ÿ±×K¦dã›cÖ{€ün ð6Âó£õ6M‘ú5j Xjƒq†Ù Y‹g¢Fýã9Œ`Mÿœ^âvᶅÛa6v9™™@ª…ZqÍÔ'°bÑpÏð?cÜ´±é¿ +œ¾·.ioa„p&aÆç:c0¤iháÎI C¸štZ„«aym§ˆÒIÿ–fò֞ªðè±, +wóM[(û{½€Z¯B…,¶òÒÊÔ˜W‘¦hi„%!AfTùœ+p¾kÔQÊqãg‡ÂÑlõS«Ó3<ÈPúpï׀_teNėAÁ»EÃZÐm +#ĝƒ3E b·3>`èH½ ¹‘°`ÄfûŠ¸€E¾ÎNì‰.j~U%õ¶'UÄ°?Ã7I³½yleúæ–"þ”PšKV_Œ˜%⣜-Ôo3÷›D çKtú¬`IČ&( EüÐheáÀ œ»=P⊌P•P¬âEå£Gì6&;Oö‡6 æà×"vÍÀµýzä_¶:PRÏ7š'º-lVT'‡yOú3¯Ùä„9DþB(6ŽÌ—LØÂZ¢¬Ê{ŸÔȘŽ—Mº ‘¿O¹—ŽpW5r¶­^ +dìÎÈyŸËÈ?a® ìbd¼| FvWëߢf‚1¿íC_¼E‹Vôa6¹,%LÞѐÈ}Ögò²D.ý‡§‡Œ§-t‰œÙÕ!'¶"hÉ$PrÈI‹‰£!ßAÇÖBȊ ä`=ᏺçn©ÿ!€ƒ1J¦²õ“ãü…‘J¾ #Ÿ-›ôD* o¥ä:àbfäº+•<¨ äÀx×"<2³j¡èyvÊ([çüæ0(õC‹ä{~jFþ°±qŒ…þx)ìC´}èúÕœÄ쉦ÀçÄñe£v¹oÎf¨‹Àš~|Ò:#ï´Ü덖˜XorÎ(‹‡£,G`"C¥Iáúι+B¢Ä?0¦ª«EČø²|(#ÉÁ Ãg9O©8PSÖPM¼ô—·&Oèb%j¸æ#‡ïk¶äC 5A:üŒ€Å7ÊY +=Ã7 +¤gO ؉·‰ñŒá|ƛk…á·u1®˜¹ìøaÝÇÃӓ'§FØùΣ£çŽ¶ø<˅ƒk¹wè?’Ö4dÖ +ŽË{Iöº7 4V$q³!zD½9çOâ·&C¸oEÎküÂJò2×®»¨~ñwûL?¥Y @æáø…ÀG¢‚)¡6­ºf&5nì}:ÕÛ§fPb[ŠfôafŠp}¥ˆ¾© œ¹ð FžÝêªôkC¬ ¿„k°Ž=öE³4óñ‹Ý¡¿Qˆ‰;Ï$|oœ½É<@•j2GßS ‰¾yª/WLpÒ!"§“s&”ºÐ±ÀÙ\#–h#&N†ÑpÏÒ(”¡fÓÑFr +œù‡¼ð&¬á.ºÜF󐁥…w)…ŠðÖec5•îýԗ#'ÄÜÌӼ﵆j 7w6ø@Ĉ ÛHéɺD¾#h£>KJPaªƒJZ‚‰þ“g—=Æ}k/ÖåÀ’¨¼e´ajË "§£·ÈàD…öŽhfÍé/l˜¬ö»¸ã=[&X{ÈI ÅÒDD©¯)4¡y(}ªÁ¼%äææ£qš”7TÌ#ª² (¶ÕêšVêéi[ì)ŸŽ½kn‚~âÞi;É'<´$?2ˆÙÔò58‘Bè3aɗo嵕4Ÿrt²Õþj ¬1› ˪lœªTÚ5ˆgÿüæ'DMã+ÑO­(»FÑgh‹ÄóŽ[€õºÇ©Û|JÌw´‚Án°_E×Vƒk߆¬ŸAïÒ{7òüoÀM›T“ߝ2¯ E®øB±wW ÄÂƾ˜Á&+«[æe¹á$-‡Œƒ³ÞFžäT\ŸÌó?“Ù˜†à® ½ÿ¤MɦIPƒf~52j0©7/êð”ú¢žòõÈÍÆæá>NDÒõü‹:Ê&íA›Õ>ì\>)\ÌuªøEÊMŽâÓmbáÈòLRȷȆ‚ Žö}3³…ñþt[3í1‹Â¤+âå\,êÍDŸh c ·…X^ +nG¯Ñåü³qŒsc¿; µ!Ùo¤l»ÖÛ×!á³|—þíBY&6F4xv£Õ_õÂ’!Õ۶ҁ‘Ê[ˆO˜Á¡‰ÂàzhÉÁ +øE÷±mž³IÖ¹EåéI +þjˆ ˆn&²E·áW‘¬Àä”ÉÌÇÀFóx&¨0Œ š0ĺ3—0\'¸X(t֕Ìb«b«#Õ8 Z«‚iÞaøtd>Ÿã`ÇLâKÛ0 þª‚Xz3GC…ãc™öʼn,÷³MúzB>.ü üCMà$õÎ3‹¦^‹‹}NjT‹½‰ÑXÔí4©]L"á`ÜùÁÓÿ5ߙïØÍ ósÝβ&Ë-BmA„ÂElíd÷$)úÀ²TI­7! híw3tœß]sÎáPŸ0F[M&CªVµ ê³ï!%Z?Ñùo™ðÍò{­,ª·++„#|¶/Ïd!Á ,üPÖ³†kw]‹‘DßPgµúÝÇn@²Ù§+ÝPÀ:Zarÿ$ÙÚ¶Ðoùø×lˆ;§+aì˒fˆGùQÇkïáHÇ<Ÿ”ò@U·µ©ñ7ª [¡Q’ŽÐû†Êe›³gý\,>GDÍ +ԝkûöÓ v+€m5ê‘F›È¸ØA‘h+¬ÃïÞY§B;H-%ÛÍ[™[[/G fÙÌÒâ·;ˆ8Åÿƒö±Þl,ú¸Y HO¹Añ\t‰$΁¤4Œ3æxeu ilå7±?Þ)¥ŽÃ+GÎHåÌ ªËé=D¦¨ÿâ+Ù +ÓÌh€ìC§ˆÜ(< +Î]ÚRԵʡÃsŽܶ©Œ´ü«â¸„%Oa(#7KÊ\³íìä§j¶8âvý¸µE’á}ùM獒2·ƒ¨«o˜0*¶¿§2î¼£7 ݙQuÕ`Á÷íº©öÊ ‹G)hñé‘DÙDÏڞÉ:JG•Eˆ%£05Ê:J2òòƒ×£©£ò SŠË%‰!T Ź<މç“A:xˆÿ!ûE$ìw  ÖùNBÌ!8uÙ"Ëلvì"™SŸÝ[݁’¬XÌú™5܅#PæüµH‘‡Ü³²<râÃLÂPuÁ_T)l¼/ÄžB¦è›‰‚:yŒŠm:¼ÃbQ&~aÖ-ʙ5OC¡c‚0>O8Õ?¨þØÃθÄÆ +ÐÀ]¢n¹dá¯Hê¾æóbeþi”ˆglÎ+|ZY\ʔ0Q2J¬j, +oR‹áÖۀ¯ˆBXtƒç {“àÙ[}CÃà<Óã—.}¯~,…*Ä|ö…·”!áâTÛIº–"Ôær\”°³AÕºÉR23õR93~hvÓ-©{”âbò8Ž®A"¯ ¦ÑÐR5bLZÅÑB9`µ7Ö¢R¶Å±¿õ-bÑUyŽ‹KŸ)¥½ \äé(:uÑÅØÄZC¡ˆ^ Ô͇ö’XEŽùèâ˜;þ:~>/¢[#§€Ô«£s,EÏNÐeˆ€%×ÊØȖ¨Õjq`¹U:œÂ‘Oñ"SÙb0Tȏ”Q<AԂÚmÜa8U˜vXQAÍAšNhE‹˜²Àø¡E£é•–[A#n¥Pª_Ûþ<™ðP?‹YxÀŽ&™Ô`>IÐääP € °)Pe€ÇëàØJö«ýě—|µc0¢QP{8P Á3Û;˜Òü†°×–ðåEþƒLÚ:øì©3¢;㈻yÐFðHH€ê¢ù ®»W1€HRnìMÆ´0p9öͅ¶”Êåµ$”çÊ?uÃx´¹þ235Fhlž¯¥æ’Ýr÷ã©o ±ZS=÷¼C°ÏÒ™ÔáôSñ^€ä=h¹ýwÿ~IáÙºÌ:#^ðë¥ÂX>ÎxŒx%Éå>îµkš0<`âN¡ xŸCò2Då'G ¦@3ÁSjà¦åá˜S·œ5ÏĜwÀxXRŠÔz×R2¬úéÒÖ;#؅Œˆˆ÷Ãš“exÃg쯑G'ñ +̨·%¢¶°Y·w`aº6vwÄÎ Ç6È)H͓ÿdmÍïº2<.*M~W›8F&Ÿpõ."%²>qjv9– Oõ @Q1ö"×XQ¯¯\ñ¤'NXp®%Ÿ8xª¢Ÿ‰WùN©dÈÑؒ•é憜ñ­œhx.%ïv½ë.émi$„l5ŽÇ+)er¯m/oÃÞ΍æ‡_¾ ùõ><ƒ´E‘H£ßöë1v3‡ ÿ2€~Ç7W½—]eð!Ñcc¼ik-~äœI‹_ Ó’#ù\ëÔðÝIák&Ïzßy&§¡ÖÎr-žc¹®œjºƒE¼ï4ՔxQPÓù=œ– ߘ鱗ͥîàÅbã–ý¥ 4c·$TäŒ0@ƒ«‹ïóLïƒcsxàÙÊ¥¡‚1­ý…Y}‰)íAàä°÷rÑïÚJì²ùÃ#ódl€ìmì™N Á꺹sZÔq6V*•,z{ {…Y9!Z0Äc/¸ÒæGL­»¡mHéu‰²-`:Ýw„éê`×üi +3л±u¯½P ±œN©Ù©&qò ø¤J ݳ벝 ]5caß<¾GD_é$˜£dY2]1Ýä|L2p!šžf]GÅ?CÇNË&€ÂmY&nÃS7Ë1–™AxEF=ù”̍A« +Â|Òo}ö(‚L ï«ÆaàfBb5ê¸=%¡ö`r£CÖ…n®øpöóMJtí` -Ǻ=VyŸ…Nœ­£¸˜½ýÑB¨æ@«L$¼ØTöû㬊ê«ÈCêƒ<¶š8g.ýa¼\o—l ç)ÖÑàÉuG!À÷Œ*gdp¤CªŒ\b­Ë‹‘Î_“¥#õØ-[‹†¦PùáWÓBŠð—ù7%ºkØæÈüCJŽá"4Áf©‚*hÓ® õ:‘W@8œ²$¾x/>ð:bÕ mɯ“Î.¶~ÒÍ`G/ÉE·X‹HRÞUl[ 78£T8]Aý|1¡}L« ¥ÏO5rtá(,Œec¯C„Nbkòf •|ãè[ú1ŠiÂýÈBMŠµs¬ÀPªDùóÿ¢ƒ„L±ÿ€'߬Ý*ó.ÄÇßü^!¨×3ýÜàT¤cìÏÓ•F;A­d ecQ¡~윈úlWj¨-lj˜ËѤ¢Q^õ ¶Òù›ðrŽ ?DÂûˆÚ1ÐÞIBÿ÷"‡Cîue—éÅ]yª)OšÇ¶$ß-ÐdmÏNÓÒi4‡ +Z!¦Mò +ؔ@’“¥@ø[÷¬ƒÆI§ÂêKõ¡\ªeƒ«3Ôñò",®BZß¼ïCÕuOß¼î”ÁCmˆ¦õ; ‹Fkø# Š|9‘P8؀r¯Å +íTžŸnú }’ìô¯¾,VD¤R$6´V­ Š½ÏÛ +:öKà N§ób%¼«—o‰õ-¢i¿ )a ­–‰Å](t"P#¼ôͦ Tsے™gW ïP$ߕ²Þ¹æÛB{?Ô#,Ç! %‹0«Ñ”d3hŸÛÇoº6â]á¼NíT·•ÁG‘ +aºkýÅߖ®•½ÆæÆ"6œjÚG»,)»=îÆý°"¡ä–îz’½&̳Y¡— +D®Á;AàœOôs K`/…ú+Àыy¡«Bׯ*š[·Ó¨6º›g_eÎ¥û˜òéôƒP¨Æ·1Xó ç›åMD˜Šº~v¸TX‚…Zv ¡Z­ˆÃ$Y{=ŒHr”@ø®òŒM$ßϘŽlR{±1J ÌáŒ:™“"ö†ôáÆG°·¦³Q’&IYù€}˒QC|¤×ïiy-Ä÷ã«·ٔèÅ^ÓvÙ´y3‰2^·„¡|´¼8@6Å86LÌ$óÐPR6ˉpÊ[û€Êá·é\¤þÁõ…}¨ÈÀßUt(yâ«cغìd~å䶀È–ʨ%ñT†±Ðåˆe ‚‚ÅäÙ#µFÀqåñóÝ×g†›×Ï>iq#!‘K€œ-Q»,%ҙÉÆ&aÔªßÖ(H¤gåëoó¦+ÒÄ-Ã=-mw’Œ´œ—Ü¢'›ï×g[—•·Ÿ`rað¡ÆÓî7b¾­dnëÁ ‡¦Üóy®k¢ Ô$u×JqIL|ø$³¡d#²ûPr¯c»ñ”Í|¿¶2e3߉ð­A=ä("bÔsdBî=ÔÅ]"òþ|`v!ˆ§Ô"Pq‚r(«»¥-—ÑÂÍ:&ø>QXXÁ¼ØÙ×ðçC¦È„”›±†rŝðC›î°UäÏë¿p/=]‚#¥Ç0ޗ€~®h_8å£<¿áz$â§%ËìÈ@щÂíVÓ4’ܸ—Ãh:¤"Âr?ô—“îÕ±2ãl}×±‘m)ï­©Q:¯è'ba]st ƒH^ !VÜ°k +cAŽ'–£&ܐçÜÈÉÎΑ'2ìúy³þ9t žÂ +ô+ðâ¹ø;ÃÞöÆï ±e!Og'u†®wTP#;CeL”˜Ú*ws\ìûØVh¥'ÌiˆeB7ÁzsÀÌZ*QFøbþÞ°ÜW©da̔xá!©€ÉÃ0§¾'MseÉäP­”¢O™Å¼Ó‚>¡ïvª©Á•€’$¹ýœá½AþCP²%ƒåŽD‚nØ0Lñ7Q |¯Ðg‚ꍷö5?^AÁÑÒø\…Tñ­cŠ‚\€¸Ä½Há欑äóûÅÜó¥ä^éÝۙ3bf3Okв"8'õKF T°|N¨IHؓ +1d¾õØ`g¥Øâæ¼3 ¦ùÏ  PÐíþYçºÄP¨ÏHu“i,øÇûß:‡ža'/¥EbҎv:ùUÐègltŠ'o»ì/!&øqíÒÒ£Wœ_°T¨Nà0Fÿy#a;\ÂÃ+Û±…þúî; ]ãIøC˜oý¸ubéû žEúÂûQŽ1ü0ÝYõ¡²}& oñ!`ªÂ­™5 ¡hWúÁéP)ý˜EH ʞ¯è±T¥hÎB¶fVüQQsÓ³$ƒªNiÎÄ1ë!ª­¾$ 5ĠбJ+¢í‰NHÌñ´1Æ?+²‹£éè`K+F} +3 +‡ª@ËЯ0B?â_|r¡ði²Eú±P­ËÚßf +)hD¸[}[—‚»”»Þ(oõìô”/WER˜N‹GeYØq!ûîXhŽ[I).eF&÷Ž©Ò‡E›(êa¡d˜Ûaa@COKÎF©º ÿ[P|?¢Ø.:Pqæ[/c¿ ¡ªp¿rŠœÒêt5J²BÆ׍¶™ÛÚ]b x[!¹«‘³š²'ª¡‘÷0î ®ãìO©z£ Æôâа¿;˜]x ì3Ñ@?‚é +Nçð>lqñ²€÷F4$Á„µÚ’¦HZ  ã´~›0TÁåÃ2äX|ŽœŽÛðŒ§SÿÜÈb%Bif}–ˆ?@^SâAöe¥Ö–àá%30ñø¹z¥•ÇfRDŽ$PæË1¸¤Q;z$¼Íæ'*§B"»ÀÔR?óC4 ˆôoÚìj•,µýšl)Å R{Ü»‘$ c¨àHŒK~°4àᔸ†ªž<Ÿ§o>w<›²x3Íp:3'±ÏH—‹ŽÈªí›¿U S@Ð+CÈjoðåÏ|)ô_;{­¡²Ÿ¡è{ Ì\#=³äÀáá=Aj%"u*&O´:0ѐ¶˜÷¦—šcTúö§¿P0™2Î¢¸Ã¥–ºï xŠd`àãê Ál"b”]‚ÉÃRã4%#Dçü9ˆ5›./¾¯[c3¾ÝR’\©H¬@ÏEð:Á³Âÿvÿ¿Ô°¯/ Ù_IQ S­Œ`¥j{ßë(+Á¶Ý„qîªQ‘ÔojŒÎ—MÃ!™{›A,~”På»S©°æ5w$GIp{€–ît¢Á¨xÌútY¸NþD‡À)èfóF?Š¤ ÝpŠ±¦`¯v¨–éTã…àÊH¿—ÍÏ8žRÄ»F ¸¹å)ÐÿµúGE`g˜ðÕæå&°‰ÜI¨ý“ÆʋŸù}¢hÓ¥b„A}’IìÀ® ·sÈJë²W™öåÆúaY,EbæTd—L'bƒ¼úBÜá#ÜÂnûˆ&Æ·ºR]B!ˆesÉ·@:d]]:LV‰ +æ¶K\;î·Ú¥ YȞŠ[-´f¼gwÝ­–å„(à D†¼¶øþ SÝ©O„£ûé¼hÛý3Ìà´Õk‹°zZß0|ô­™*pÛ>k,UyÕ+v —ú\g£oU†â=Jã‰{ÏépñFÉ0h‘hÀìԆؽQ”nÛï:W¬l^‰<%Ä8ë†CӒ@˜Øÿ +ù »?ø:øÔ¢ŠùÝ#f‰ÞÅÛ7vⴉô*xn™ì +Âc9`$¿%·~U +g0@˜‘qÂ%¬Ü>"IíuòýÍnBαúOŽú#YÊççN‘VNÎtòJWXñç¸ÁbŒ£nÓ +W>"œ4²-‹~£„Eì™gà@O!h;Q=°Ÿ3ô¬ƒ_Ã{à„öjÆ&ÉQGk÷)!ÏÎüxŸ[½í}ݧ{Z²¾`Mg+Y ›](&¸_>2œ26KEGäÜr_ ¥óß@VÓj…H— U7Üt܀^7õ%’ÇmÉ=ñ.wúõzd§ìèjÖvó_áu4€/²L§/gsš`„ )@ WdÜ;€@ã('ÕZ8ù¡˜4ÈL¯T˜lÆzhàûÀ8›?\;Û‚ÃÙ؁þˆØN/®†0¢‘Ý/±¨už£–3~>®Wч.eÞèýkGß!ɏ% ¶{ÓQ> ×H1Þ&7ÎØ*$Yû]âL †Y;ë—%;‰žE|KòèÏpçý?èðžZv„ ƒ–n¡ãIFîW0”s*J…ì¾IB|´³QÈÍ pNÀ„)äC UL2Q ­™P—@Âíãc¦hÖ?£tGMÊ%’,ዢ½3€Rù*Lž4‘Ë;U”œ)šÈÁE‚g#¯>ɽÐÍk²„SÌÝÈ«XH‘Ï~šd™ñ6³-éü®>Õ¤ç"ãWòã GýmB¸–ï럜³9à,Ö0º“øÇóìç«´ï+úu +aôK'f%Aäq… +î(Ñß|¹4„(§ ¨õüúvc’–d/ƒw÷6+QԃX_¸;¡º^aµbÒ¿ƒ8Øx ×mÉÑkߍvùÄÈÙm’­è…;¢¾Ï(–ĝšSñÖdÈ?”^—$%†£‚ÎXoãìöÒbÐ-²g¸Ê¨2qU8'ŽãÔI4‹'KÙDRĐAUŽýÎ †üïÇ ÁÂU€î „S”Ø%XŸ%M‡’Yìˆ:1J3ž¼88؅ÉMq#@؆úûIZÀßÄ.—p“- ±w¦{òü'ÐGCPÞN„Wy›—ÒBæu^i™WÙÁ¥úÖ9rhÒ®:8¼Z+`†ÃŒ$*ß\Oø•Õî,"Îà1‡~û +˜Ëûî–G, + Dp} \*7çÍƎ¢m‘uT„e`욓 +~ö¼sÀÀÈA?½`£¾Áη¸Jê|0vÐùïy:²š[|ˆ_´%º¡L:. ªAØصì¡t/­‰2:?fµŽäùz Î %{yË@Pþ&†Böà‚õ¼ÍœÅÌ"O‹”̑éU é¿Ï/Ǚãßdë +IÄñZ!° M :¬‹ Ùúú \ž%8›ƒ"ë\ÓO»tŽÚú”7ßþ7­†&ò+¿Í›RãvAi+,ƒX„õýO™Ä÷Pâˆò»i6*æ 6v†/£<:ÐÖ +|f"ö…’4/…'ð!iÆ´ÔïA¶Ú­Lþ¾iDú(îÉ灈6Ç?˜ÇQy¿+ƒ<SRåÙ2—Â{À´\y/Å*Çrº®&˜‘ꗏȎ«¹þ±h@#½Tœ9KÎbIÂg#>Y»Q_ Ÿ¥!÷ [)ªX!Á‘5©G'¼#±*¯©e&´ïJ¯ŸÀ*Ù22Ï'ˆo8“aÇð7,tˆ9iF) ÃPÌX剘xº½&“ qv“«|>ö?EU#FT3Øöƒ¡ V±Tp¦ +xÏrsS€–§®Î·R3bs1 3кNÞNØħGGlчÉÅÝ+v])f+_T*uzИêqMÁÍB‰DÕDGWü{ ¼ÊÖ+†{z´¦ a‰FKüu¨@H¹QÂç0pÖJZQ½„3ÉVEÕ®ÏÄæ÷ô.F#_1‰Îê–äfÈ>‚ÇÁ\ì“Fq´+i(œM%z±ÚíÆÜ ‰R2'àªÊs†R#üÛ3ê.Å}ó@ç¹i”M³´*®ª‰/pr7õ!£K«a~V]AÈD¸èI£Æ@Üziw!«@ØdMåñ2IIú*±Ò"Ééå0Y"dޘ”ô=¡WÀæÚ^.^¢ÌËdSd$.™mÆ7úïØɼ„ˆÿ«øº¶XizHloêٍƒ`€‡Œ‰Ó¯·hD(=‘-¿f²_Ÿ,8 +Ü-n5™Ú—l´q2jà‚G?ÎÿÐÿ"”Ôdñ¿ÉœÀMÁ b÷O^ «ùHF“ÔGÝßgA~ˆnæÑ]ùÂÑpȋEÄ»Ý˧5§ ËÆQñÉDÿƒFÔ]2‘Ü} ¤¥ë Ÿàþ‰ÃÙ!”ÒêŠáyº»˜!Þ½tÌW‰O”m´P4êí¼·›ð ‘$øá êrÀ/s+‰œÞèD]RœÓÝن>ҐSèžÌÝ+›ºfw§{7Ý âqliÖÝ8zlL´Kí­t©Ö-&·Ã;xg0’7`tÖýŠwˆÜ +˜ZÈ;¨Sz=¤`ËøÞJucºº·%š€ä!©²t·2‰GÆ´ä\™¿H"Š=yÍM,`ìÚØ$wBÉ5媞»“7³ª Åòf+.T(oÏù& 艢È_´.ï´U‡Ý1ïFàá\ͦ‹î<Ü´#ÐRŸ]Y€Û“‹õ¼³|M‘æù¼zÂ* ãÄtóÃJÐÛ쀇@ÏÀ›(· ô?xӌ>&B‹Vÿ_Š¬wP2îB|6CþzK.R'_ÇÞÆí¬#‹éq • ›ÇÄÞã‰ÌÐW‘·eoó1 +.›Éì·q;“Â뼺°¢\÷®7Vcâ»7ÎaP›Ÿ·à…ØFoñªX.•”jÊ†(¦`c|~Öö¬ïA?Üí܃féÃ÷æ’4G×Ï5Äw ÝöXxé_”ÉρہðH¾9™c®Ë÷{ŒíaÜ¢óM¦ÌÂæÛæ˜Î>é™æ|s +º†ÝÌ7¹ÿ¢ÊR“ßÃBLaM}—]S΅¡¡Œtþ +ê…OæÃöÄƦíÎxÏòß ~­oãò¤Æ-~:ùr?CšÔúæ; ÌæÂ$£ºÃ¾[c‡ö“ìK’þc&»Ä¤¶’É-þ#-¯lÇöéE;(Qï¾M{“Òåû~]™¼þž÷3'¡i¹³L4ß·Šm‘Ø>BxÆWY¿­\Õ|಻ ¿iƒ"T $äÅ£Wǒü&:`D'šÉ‹%¶æ·ÒÒÏðB>4XúM¿§èL:ýNy +Üw¸£õ·Í8(ñ)ðhFêfÄýýŽ¾Ë/Å)¯!åeËÅ +’ZÌsx‚ì±Ï^šRv¶pû7ӂ‹"ûïd«ñTflüÜ*Cº„“@÷N†@p…>gFÐ\x@!ÒmÒÂç,Xày"Æ¿mez²çœàÞ,äš?çÿ.=ÂÀ#:(aƧÈðã(8ª +_ìuÜ?0N$I9èrFüZßàÃTËÅ Â9w9ýUwÅ\>äø±ñ8.ýц[ÈÜ ³‚;ìmhobÁ‰¥ÏÕDÒ\¶‚çÜo®ßø•w’§ +š{Á™Úøcðwý,_Yçü¨8gÓöÿùdp®F·à›]1ƒ“2“[ù njÕòö­Á?h‘d38;0ô?­0) þ=a +ƒQBd"÷5¯’èɌSˆ°iÂÂî:[O˜¤4Þª è­hWqŒÈ³r׈ ²ÀN‡¢Fî8ò†%#ÙIP K7àÛ£uS¬ÇÔ œ–†N’uȶV “˝•Þ—_Übƒ’d†¸“ªÌ<’÷jN´3 ¢“áÙ"ñ©â­—î6žÎŸX¾¨€è)klhà”˜ý?®‚ +• +¦¼yfòo“ðó”Å#ã -°Ò©ùŒiržÜ}IúŠ¦Z©g´úRa½JÞìK¶ÞތY~ÉEläå¬}‰¥Ã¢Ž=Ñù%t)Ñ´‰5À„bÓR((Ácâ«9—4¤¹L.‰• –tF«0)ÁA+)aF5•aÂVcÛ7LDŠ`œ:L|?ÝäMpx™Y‘àw䙼lzƒz`­«¾]rF“µu½R mÀIª©°ê֓‹ãyU ¼ã|ÒlŠ:B„ÀƒË™,ejÊT9§",‚ƒ‚i'7ßݹn£B\©×“t9Yë¿gMdK¢,[Yg§Ï²“e%È:Ë“yçûðπ)Áñ¨Ž™Ùcpì>ÃR``gË]Þ1ÜTԍg$p—lHÚþ4DTV„’‚V“¦«ªl``°Rd/1Ó$l9’Á11'`A1煝ÏI•¢w哧ÊûÝ%Ȁ–66äðe Qؐ™$`¨2Ðl:½/¢œúBj&áÉ`3¶)JaI°„á(lᏝpófo…bHP­ûZ…ˆòè7*Bªà(ºU¬Zåµ:ĂlV󘔉Åé;ß° €G îfm?".³mÛc[œöyŒN=sÅc>ê¢Pæ"†üRþú1€«(B®Aää:,15FÌ< ™ÎçÆ37Y÷!öRïÆ5”Oˆë5ë½9DIS:’Ž’¤Šnà¸Ç¥ÀëÏ.­åk°þä#rãÄUä®Ãˆ)x'ƒ׆:"žñîd&#aD6颪F@jªÊªê´Z˜•UU•Ù­nöú™ ›‰I3k°5­œ¶²Ÿlæ3k°T ç¦)«$Nᓡ¹ÐÓCa×Mø‘5MŠ&3I¹N#f³ƒ³]L3ȈLëêvÿñøO3ð¿Ï2Mô¯VžªYoô2ó§'J(dA3NØzÄ;jì ñ–ÅtÞ<ÁÙ°luè~ô’£ö“‰£?¬‚PÅù6 ¿1ኟ…s«(Sº£<—‘ZãúT4I̸`¸,Æp:OCôe(”sì2¸Î /hì‘X™›]kd{ój6×+¯ëŠºZ\šw‡UÊ'ä ’þOºo²ŸT~2ûbQg0Ì"FHèËU–ž÷|ô‚ù)¾êb^C,RW=ŸØŸá€@v"ÓE\ˆ§êåœqrô´ÝEö 2èw¿°°ÿÜ{Ña܃í:¯Ÿ/‘—H!’/0Ã%ÄLùxSÁB6‰ÕíJ€Ÿ$ufš +‚åь\¿StÉÇtñA—cL«€®X3xFÜ#xŽ"ôTŒ¸k5â"šAáƒ'¾è‚± +’?w|%:²&9õ¹Yg«}A&¢%»  €=2ž«ù UñoÏÚù±…*!ÙmjçC0±¿ÿ#þéA™iOXq€ɦȟU¾ Æƒó+8C¢I¨TÀ3´ï6֐ï14ó!u?¤¸+d] +<ƒ/ƒw ’@_D 0íÓ +8+|M;EݟV aŠ,pz_nß/Kï*YԌŒÄÑw§¨å²<"9`Àc7u D¬Ûµþʖ‰*úy¯_¸a%S +°ìÀf%ì&öÀÙé¿ Å„Ëä#û°¥«_Ýûi¤6{üj+àÛ¡•„GªÆ11jÃ('Õ—<¢,|dˆƒníÜ8’4ùÛº›ÌárØA-÷/?öÒé[Ñh¹€æ¾ƒôfÏËHá‚r`ΘïG7 ñæ? Kÿ¡RöŠHzº G¬ L9öedï¾ýP‚Vq­òo¦ô.,¿ Å£v*$ç5 »&íÕ2=!Kô$Ӑ¹"ëùf‰Í?æ;&~ìꠀ„ ?íÕv‰,SŸ®AÐP⺞GBåO€½ŠÙYX¬ºa6}Ù¶dý+{DM÷( «o<ê:Qä!– +Û å,£6 ü˜vAÒä3:ϾvZ×Nì«#yɦ€šAá:,›˜¯‚…ž$ ·îFFˆžÀéôú”}ÚÕ mM­\ߐB IÖ'µ·^d-]F­ë{¤„Ar£Ž: ÷ÄLŸaæiÓùÀâƒ^5ô¹:`¨ )Yy(ëÑ-uCî`WCsœ$w\Ãkx°Ô¡‘¶RÃÊH²B1n'ƽþ'Ê© \fKÁ+¡Ÿ¦4[b焦'*àš‚5Fw˙óC‰2Ï4`ÖzBî‚Â;ãyJ§µkQ0Qª ‚oâé2>åºAi ýŠ ¨‘¬—3¼µ7±ÓþJ9”Ï1§rL¥¦xFK{Ë\˜.DÉ#¦6˵@àh¡lz#ŠOÅl.yªjHÊß©®,‡NÚ…¸»F¦”.ç§iÎdͺ]Ô +kÁh¯U<™Ä¦ø ž¹eÓ8[±LmNý– n¦7VC]11ڀ©ToææÕå2 £-¥(‡š)µRhU "­ÉÖpƒ4$K|aZØ¡FؐÒþ3Èá×ÉÙ~é.kÙadĈ Í{Œ-šx]ôV™*HC,¼hÛJ3,íeÐ|ÞfIë;¹Ä”ð‡OqòK|ÃO’\®$ži܈í²Z99œ̱2"ÎÄߟ.ÄÆċà™´ÆàŠ¼2m¤9ã,ÌÌB‘hW¸0ôȐ(Õæ ª•ÚFPá".½¬`|a—va.8”÷SR(G%S•ˆَJ ÁƒaðäxÈ2ÎV·"!÷—öžW¾à Ð*R¾ ècø-ˆ«*‰ÇæaYž¤Bˆ4´ÝS®i»Œ¤­ +¿@˪Y¤À•~ÈIO"È2NAO|ÏP‚ <Ùb$V“ÚDÕLRì¥îÃ1^Ebþb×X~P*¨&ð9Âjôv ëuuϓËîÓêMÍD‚v| +—à¨kcýY³Ø†8:÷ßâ]«Fî3ÑÿÀy8Ã=Æڙ|œ¼)‡ -xe¤ypƒ˜†ëî@xÀ Ôd£é ­J<ä5pA‹§\ðÉKKû²OÔRÒ©¨Sˆ%ÆØQ*¸¸­¿Œë;Äi ;¹6°Â{Í¡* &ø/mJpê9Á`0®¬‰ë¤ž›_°éÉPv¯áJØÚQÓÀ-IŒF²¾Ž™cÇ´Ø#ůlþHd\8Ù@r"_ªˆ¸r´Ù5gçäïԂ¶’rtI °›àOþïƱ¿³oÝÕK8Îâ#‘˜¯ïE„ åuÄ«¤!ɇ]'/zʄÞÏt ¶!¯¬È͚4Pz¤˜l¨g–dÊw+™Ø*Û"ÓgK摫Úßj6ïx’ò×+Dd¶ ZY©,éöF àS‰Êoˆ)~ay]3š¼g 3 }•k£0²,ÔSËHÐ\Ã䬊›_åèêIC´¦Sëñ¿’/Ý 1ç°÷̧†¼yïãR|î¡·m=PIãׄƒœâ†H¦°`xEEÍ'a%þ¹rúI8øÙšÇ~õÄv‰š%``ÃoD›Wk4†…$PuôÙÀ˜ºÌ~¹©XhI7˜´ \Jæ%Ð!a|X™XO‹ÜP»ý‰« 斳ÔRòÀÊ^ô]|LÂØȍ¯4HûÔ +â½Fá;í¯Žtüšågâ™öVÞÊô àm èc&®,ØÌ^ÿ®Ï+ÛT~.4€e [3ýU[L– +¯õ+¶`ÙW³Àa$üʂz—õ‡{e*aëmÚ +ÍvÝ2_ã¢ýàÒúݨ%²©Â¬-qýðŽåÙ ãöæ½Û;±ó²‚P³ŒE$ eô¾û¿ LË~2é>ë…êì&Oj[Cœâ–Ehþ®v5Ëü=62ÇäRº¦Ù…PßÍÅ[ýÄ;ʈI_²íèR÷KA7OI˜qKƒJØiéÉ\v®rÂT± ’jB9Êò»I;ކ¦8 ^²,Ò}<€ƒVÜMÝâÔZ1SÑÿß.•Ù›x#ð¸1Â2žÒ‹Êà½=¯‰Dõ*0ß/ŸÙ_< É?(¸³”vYä:{wùvð5Âç<ßÁÑãŦÍgžy$7³Lµ¥' 7»l*ŵì¤聟MÞe-æÜbrV¸•’±¼ì,Ü‘@£Hە±à Óښb!ŸÈ¶%ÇL›/˽el°Ú8áò§U È9D¦-ÀÊÂýeA›táx%lã¯ìúq€³4¡ùl'Í2ã´%hÜp¼[ôJÆɸ°E +ž>Ö×hä/L6N}šœVØ¡ñË ËZ‘}ä¬qNžIŽX²Y5ld¡uÏýY|Œê„iæ4öYo8¼辐5Þa‹QІÙDZÈÕf2xšx~!²‰À³Y6êÆ~(6‰VÈ)Oy‹bnÙ;t ‚’L]K½¿‡™æ á“ìôl&s¸’ó{–œß cFÇ­¿?Öô<Æ-c¦|Ó?šÇò÷²4ÆäÁGºw÷Kò`ÉyrÄ1Õ¬|HµgÌÖ§4³%[o ¢³s΅íÕ}îä˜íwkŒÚ¹~QY€Í'É‘㳜xxKðœjxÁ”ÃÓX|pÀºC2IÉá&°`Ì>éùj¹ì…C争¥ UoN¿…>,÷øeP–|b÷'KÁœ©a 1ƒnõ#?÷r ý®†ªuÅhÐ9|.æΙböZ“ +S·”‚ÐÈÓ÷ðML†F›£ž••mä=Gw5tÝ gΏ@ R>m}v_GóCH;†˜~¼O5pñ¤Dš½ªSÅZœ$À#‚T0º}°yUÑ->Ó`ºÌªçî _WŒÜ4¢Ù%Aö‹£ó4nöãêeû4¹€ˆDjÚL7檀æI_¤ñÙ¦b¨&úÉ8f1HAH¸m °#QÚö#ê£'‘!ì^ó×é)¹C´ Œ‹Èš—vwgC–£Œuò™4&CgT!ÁJÁ#]Gž¥f7qåЗ0}溭íB(µ¹$1Á-Ü?@ ÐkA’ÄZÌEßà’ÃV^ õ.jlI3›ÖPw®­jÒI6'ØÖºë#°±küé=m¡„ºhÖ£ù nê»5hFÛ_Nkš¶âþœ¢;}`Vj~F}2½6êzÖfù¼æ ¦:í!kbÓSÚ)º†osAs -¬ii·ØÚôF%¶Ö"ÐP:µ6¾ew+èN*­Ñƒ¯¬ý©~híÕÖÑÈâ&²vH 5L°@˜I6%TK¢ÔbçÚIÃNzï©°ÆçP©Mæb¤A×síé PÅÙ Õò­‘­_‹µ¬f2'xŠ?£oÈÆ7as¨™àÔš›¶Y ÕÞgBm¢ÔpOÑ\bíX'@íÖáçF“½§©‰¬ñ +0µé‰DXj¨ªªÜÚ¤Vƒþôj©mÂo16LûOrµ¦ &N’= Æ¶àf›&g ,⠖©œ–ø»…Òp)ç”ÓôP´¤ñé„ï¦=«Ð²Ìèf‡\`J¸±òË 6ã +bü* F 1Ú}dLGÔÜ]>3á¥S`@P‚ûÅ{¼lôL…S4š~~‰¤I#´P¼‰´U× &YÉRVèg×xÐѬB–p´W¶’°Ñ­™§úÿÐhT‘N51p诨*ZPM˜1§_²ÌòìtÂëB“I¶Ò>ÝD£'¹1íÑÐIó:Çźœ ¬8?ÞÿF +C[yhð3ž†µpÞøHh*É ¡qÁ„ï =Gn Cà’ÝgZ2y•ý³!V§¬¶Î(yxß$¥ü¯—¨˜ª³hˆ²L9ÁeÔ=~FÛM²±S‡öYZ ]}÷l Ýj\ ,>9Ç°Ä&p%ŒR<(õ¬´Û; g(ÅäV#9òlt`Ã:v²Ïèò»ÞǛ:F†Bä{êtؙ‘6+Mr( +ÒrN+>Aº¹ÄMÞEŽ’ö÷Œ#‹1kçõÊÍA!§ô?rf—Ó’qFu ”E³ö¢1ƒpöœá§`¹ox3o† @oïS*1¥$<hnq5ªôP"k‰X)p]Âã=~¼Œ]ÀÕÌÐg´Ë '«-3M +-Ùrâftÿ‘Ì>©BPÌƇR}RÖXÆÓf2vÁìç²xþõ²ÕQÆ|1vS¦Ë”" ÉX.ãèSÖ¹ehæ‚4v”…Dš­ôo‹9ÍÓ^ ̝¦•ÒEU>§˜&®Œ²Ô'Ùd­U\æf*v–S6ĈM¼&º³0ag£L…ž(SDÊ בŒŸ 8„?Hk +ûW€¸9‡“­A +±É¸#EdXj@2V¼pxº2’¦[¢ö¯’á'ŒiÛIÖÄ$úKˆtûEƒw# êqœKw³hX¦  ôðŽmÒ)mƒ*dïMdÿY™­%pU@ŽM4„:Ǩò‡ Œ&@šÎŠ¿*míäXÊ#ÍŽ {Ñ'žzÀQ°ñ2/iûH¶:óêv. ÓMúØO¶Z‚UuÁAþ#ßÖ[l˜ ©§Çpä% ¤(s×»ê4ÄεëvƒPÇh´wtLÀ0C™cã©Èj_°t@†õ·ï ScCê“ðԆÅ~Æÿjk°ïQDeŠjÙ49ÄؐȊb„h ŠBíÄóDBëc°®4$öyú‚#±È¸u‰=†‚7bvÏa‡NÒ-Ž00®;6çæÍ&‡ňΖ†ý5¼nfÕ±>ܗƒû§‚œ8„w.ìÊñêv‘Êeg(öbqÀIJwϸØÀgK +ûp¸lÑòÍË[Pö|JL-Ã3,`Uøû¤¥‘Ä|¡|t0òïÜz‹¯SÐ ¹åÿjœ Ð蕝0µ·úa¦?>ìÀGŽ…acx+Œ¤T{;LÞ…-3ÑÉaOHpÒþ»aâºdks»ž½[ÀxvQú ÞÉÃbJóþ‡âñ •E±Ý` “ ӞˆNìÛ +&MT˜pGz Pä3˜äšü‡Â¨ªuÒ0N˜ék‚M÷‘Àd‘MúE„áÍJsrÇ°Òžm/WX@r†dl!`«)HÔ2âå}B[ÀV#W€¾怕à4B8#1M[“†`Æ{Lx`8*¸”ãìÜbm˜'4¶¦! endstream endobj 132 0 obj <>stream +Yó•ffÀn+œ,Á/¾z< +„×9UÝñ‰€À¾²ìÍïªsWU,i=íí׬áòäªþ뒪;â¶jÙg=çɐeíŠLq$Åe•õU¾Q@ö"IKoڝyh¯ŠP}e·Ü./$ØgA-‹.ólš“*;†Tšú¥CG|)ÊCâ0¿ð]hâ 6Eý‚/×Ù¿Þl’ûÊh*íûÄu÷ôÄi/tÌiXáM¤/}É$–ÁRÔÎ×"ŽN(¨×˜Mì+_OÓ8q[ð³¡ÇR\·îõǑŠY½C«cãla³a(ŠnH썽-yómF‚JÿÚ?Ȭ…v³¶B*u«1¶+a%Ƥ2“Ä­/jÿʼ䙂“¦ +%HcáˆZÿu´õÍʐôÜÀ¥JÒ +•p'¡þhÂ”+ áwX˪ìjÁsX·‡Õ²ï¸@ÕB¹ÈèAE­œ$¼d¹d¬[_Ab €´ýܔºCŒ§•Ü÷ÿøžÓªH­:€¨Ô€ŒúØÐEÒ2^Ežj¤Eµçëז-ëÃÁÑÂN!²Œ~¬õÎN·ïÄi>Š'ƒ ¨Ã׳šTґ+ŒM¸·D”îd÷ï `%dz°‹ñ ë;‚pé.dê-¥ò¹óåõºF!…ÖÀÃ¶à˜ª3‰‚LÕ~Ä/£!$G¯pžŠ:ÆE¯EÈ#t®äÂ9ƒË:‘cœÓPN9"0qA!Ióš¡;ÒÕñ Ç†YÊaš7UàGg³!ˆ ÷·Ãam*ÙÜ{°v&ÓAüÃT°±gˆ­ ¢Š˜ 6ÀiõW˜¨íW EúAìA¿ÏR:»oL…ša˜C$ ßìnwƒ¢™{ÅÌ%Lâ ;dÈ Ÿ¡ÀäKk‡ l ×ñªýÏïöÆÌQŒæ<uÞ]¯±ªè¦ûaj}<øÄ'€ ÔÆ~ÔO†É»”ÁHΝfµ¸Í, ƒèÝ+À¡÷çÙʁ#kMÀäÞÖ¾?C.Ó¡w^8¡ _cµŠó:øYXâ>ª;vdbͯøhïoìsŒNÉ咴”P?NNa$Ý×Aƒ¤«‘¢8ÙZøÿ?û°£© +¹|´D¬óZM$x|¯ä8nüû7AGø]S/Ä +‹_Æ?`ӑÍÿ•m*ÅU y¿O»7îD.tã!šàWœ lù¾–X!ò«R‘5¿¯x- +mùAÞë&¹tHºô‘«_™>TS%Ž ñHW ¨¿¦AXèäœ‹ &ݸûÕÂj4/ðU1ãr%Î"{À_ÛK¦â¦ª ÐL€ý‘t¡œ°\á߶`>å©éO½ƒ +÷=¢ýšc„mïÿÍÙC/Žõp'уZÎW2͌À÷™H?…Ü}wM}ÃÃè-Pÿ\6#㩹@¢„DOêTõ˲æÄ÷‹8æz0y êéPD~Øäl6†Ü¿"!£‡L¹cÊIê/À2¬Æø›¹žÎu<+éýÛ¿â…ùQ¢¾^ß+PòÛsо2å\ñ&«õX·;H:¤ÉeE0Œ@0JJ‚½` +Í Š’Qür^ãçȲ|£Ù¼ù{LêðÆaíî !u$|C6ÿËýCºìª!K¥ÆC3àz²¹3%CºPMbC.éM÷Î/_ÊÈ*x~ú*Hç0dø̪óGcý:@á(=§Âî6ɸùӋ^Öy2wEê[=åa¿±M³sמ¤z-A¥§Å²pTÔîUV¯Æ¶ÇzÞÖSš ǃ§š ¸€¯…¶Ë¹%.„òy—i’krNp”Å«LmíáQÂ2-ÊuÀÄ5ϙûxfˆÆcQÆ$Å0sEÈæcƒŽ¨êv+G¢oú-/ [eJXnvøØO§«ˆQS”˜„ÿ]H-&Á!à Y-ʆú¤­­$ƒ²p +|5fQ±qž­ø,%Ëjk¬Ÿ!ý±þ±ûî¶>dÿP‘ùEJnc :ñÑ$ä\æ㤫;µm%uïÒd&MvžRÁzM¸LÓHSúŽ?I¢ÙvÏ,b^´¬½ï)gñŠ?œ!g¨9ö×!"k‹i®nºŽ0ĽúXµ®l Öêú¼—fxš±A窔0.„±÷؊–-’SúԋÚ?_;1{7êî‘ì_ô ¨@®‚$dgÏíÎágF„+Þû8¨³Ÿq¼Pnöá~‘€‰gëáÝ>GÇSl·“®îÈw)æÞTz2n)vgú™Ãj‘y»†à]+1Ɲ-§<$Ÿ!îãg]/Á‡|݈]~*·UP&ïÓñ€¼ëôæaùU–¶8yüÑBcðTaïN¹é‡Úy%€¨â΃*Ãæ´ KÁÌG.x¡g³–Fe³{ôÀ @d,K–®v¿à}&G¢Ûjn Ã9…xH„œ}<4føX`Ѧ^ˆŒÍTij¨£Pi™o„dX”„!C³jÔ«§‹h\£˜ÜVm«,L9Bšî†? ÓO»=Qg>l’Ë,†F:µo•±<ýMøŸØ +ÞAÖ Ä"í1¯áP‡ÆŽÁ·˜˜¸¤MõWT²VMüáLišš§hS‘KšVýi¥^ÓՏE=ÿ— ¨¥Q·lo6;¡TnÚ·^Û0 ÖO¦r–·Ûå=dñÂh• o±1Œ·¦¾^É,3p1üdÎ3P…*Tµr܈&Þæ₟ÜØ>Ñ Â#jù¸_ f¤|t‰Ã “`µÇµˆÎo´Ïñgƒ³XKâ ¼ø£Ê(yßrÂ`Îhb6"É#ecã‘^ØÅÐÓPÛÎo>'ò s% +áõ{þïƒYHƒ¢±ö„]`Ԓ>XÆ`9åªëAYÈc©Ä'Æ¡YQ}³˜ñwA¿Vx4¢+Šm1GïP,)j¬ BÏޟ`{{Ú¯r«ôÈ Ç?ž=Î)b,O—gáÇpZÏPK¯9å ±\žðu¬Äõi¢yøyX­;/iÉ!f›}5oôµäÑøëüJTÅ4dkZd:WÐþIÈ ž ºHå–ÿLT$E—ôÀ—tü&_£ÔµÁ[y p\\åӑ{RÎ0"!ßÏ#Æñ©äർ°*Böù–Žoæ2ÓDiB´†—¶äIŠNgýò„vðk;(Ûÿgı±Ïfº¯Ã£!%¬ úƒÓøðþ’Ú¥3쪍ɕC8œƒ±afbîo?¨ê)›[ý ‡ðÆ:3eÐÇOLCÑx­ªgLW'R½HXԍBŒ>P¡qQý@=¥Aç:Dˆq +\m‹ŒLñ·«=èŠ)¤©M–m¥BSLZ’r_…ÊÌ&c1^ ÐPNzŒ¬ŒøR‰Ñ“šÀ°µ=›3J]‚Š¹¾e3&  YîøÉ‘8dT„j·aÏ$%Š€Wä4IßÌloù çoO\=€ ¾FE¾¥I; MÎ}”A0*0D>›ŒS_äïC}å*•õÒk¥‹œQäEÜ@p¨¶àY°ž£³½öùåõT«<¢†.Շ§&€.¡>X+Ìuæ±ãY©éñRoï¯7£²RœnGq;êÈÑL*¯x8‹<\×ý »]æPþ4‚¸i-" #%êõ¢é·KêËì¯ â¡F@¸zÄqLÂ>’—z¤?Sý +&ä9LóLÀ ´~³‹†[ú­3҃Գ¶æ6q\>wÐ\bº¦ós<¢´Q\ ‡C•ßX·‡V›šBzÓjUGü£p(.¡ŒÚRç£M¢G¹-6úÀÏÝm“$8ðm¾Ÿ]±º ¨Lÿ eû'¬2±ÏQõýIPIÁ FxB¥¥‹»§'¶¤ôŒY &¥,äÐ¥0ô“bśÉY­Ä´ÌjÄT&‘äÙ@ô¿ëjüv!¤=Æ0ÈM®›Ñƒ `lob2+Œ™© 6„Sñ¯t]êôÁDôB~Åø^JŒ¡=³ÿ.C6hàÂÕgOê÷:ä‘*Kþ™ØfœA8„ª°ª¡~ršåÏÀ—ÁâU–Hô'xô±tïøÏà ÎOÆ@økãlq ÄÌÁ*іh$4ðóð<„íj[á}ä̊%­€ê`æ) N0X¼HSiXé OÔqþö/…Ù =ÏÎùê\áˆîP}f׫ËÛ ]`FÄ>62m‚DRjšè ‚âÀv/°^]^A\­µâ÷-—-eä–RdböÇÎ0u@°FÓÙhþ”SEfµÞ©‹ÝóÊ­µ9v²áí͊®£Lx˙™ž&SŽA„šS8Í×ú©+S¹+Éޗ’Ž¬÷}À1£úè¯ÉÙnÈLÀãçWº‘eê’j÷“26]nBM¬`œ‰-™¼-…2lýêmGÅàaD“2͎÷:ý1­ƒ‹uŽ%Ñì´ðÔ© +§G”÷¦öqè9\¸ +½'J Wøï·êr‡±.÷kÝVD­ßPB/x28‡*ꊹ¼»çÿàüÎ ˜8ù®J©ÊHÆ{[9ž¢ÄÕ .ᨿ(nX#fßåÖbŽuý÷¡•ðª ¨+MbNám™ÐÏù nþö˜;.Y›£òµ¾‚ôªý¸MEŀ­«9F͟î]œ¯ôó‘s¸ÇÙ$H+Ey'Ž`ËrÊm½æ…Tªë8;`îY"Ÿ{[¶g|«Q´,»Ȃèœ+؍#|‡tõ¡¬¢R¶Ip|®þå·êµDx·.ý2_ŒÒúÌ0«³ˆÖþ¸&„”aªùôξà!À˜tˆç0»ô®’1Ó#ÄÄ!‰kf±Inè¨ûý pˆ¸Tf‚  àÉQÈdXme”r㜐åã|ù†¾y„ÝìR·Xm²× +-3Ú´üÈÅùêA済fÁ‘,ì{Mó=׺„¹f0‡™­ÖŒç] +±æ›y­&Ê:)ïð<ªYMœRó&³&çϚ@׆šÃ÷Êmæ1íN³í’Öº&p€|YA°Då)´Ò>pI%>“¢‹î¯ã¯u&¨Tπ3Yû,ÉtÛÌ\ä™i3 òN2“•ÑŒ1ÌÄF„ë>Ãô_*¢Œ³é.£¬w™ûJzGÅ2C'\ò*“Iõ¡L:7€•4™ÅÓÑó¿B C.K/ÆáE B¨Z˜Äm®åO•A®Ž¦ äçQ˜Ä½ß2Ǝa’8ÒÇöDn0ïö8]küP‡E%\–E¢Ú ñ¥$4Š>€@¿qåú-Ž:ÛKTî<½äÏ xOå¥{Ùá¥ÓvyR¥ÊÊR!‚]ÆøEETzV& -#ùˆ\ǍÏVglé|8¬%9·¹Š§¦V¨¥§a©©˜%6²‡´Êr£Q +² ‹Ú%å)%P!–6^£¡ü):¯qQÀŠŒM,ÃzM)`*gôBÔW6$uSÎ+5kªüà¿€Gy_¼kA\™ƒ‹Um„åªÒç.5‚çƨR¾Ò}Me`£©Ld,MÏ  *õ¿ô¢4¥äó„*uæåöa$0åzŠÆØÔý&¹"CÆ䕤Œþ;…@nx“é«›¢D +»ÞD”Ÿ7”ªRƒ— 6´JSȸÿS7ÚYAÇqГÍöcãbõLs‚´ÏÄˏ=q6p>¿J4Ùìúf²É'ê82é‘ÑR‹èõèKÚí]€Åd+2–âÀe%‹TÒCl %¥c*> v/%Š€’^ЦbN’YäR!¸Vƒ’ô±Å¹€Í8LEµ‘œ×é’)‘¬Ò$$ՙúòc5}Uymú´OœIŸ±…{ÄXÛ0R¸Iäu‘²Z=‹Œ:½‚ŠÄrÈ!r,¤ø…("Ü’z&gе¦ˆä¿ïîD>Riè= À!߉† ÑÊ÷2~UkW ¹d?ˆ‹~Nä ®Š‡8‚Ãl;Dii $Œ·D‘B*Jϖ¸'7xHÇ9æðc;£l/mxð?‰ü¦è<›Áõl­¾sîn?;SNÍÐÒË-ï ¨q4|ÜÖÁ[ââ5ñkSŽlƒ4Nv-©E'{Nïx[+ÖWu­ w$qùœÚ1dÖVé«ßrc¿JdéèTJP…Ž6 T&l.SEëC‘zæÈWËi¬c/粗4wähAoý-RáGc§D¨Þ"ßè\Ç:ýhæ@¡em;¼ñ™Îëƀhœºcb}—ÈÙFü9§¶Ü·h#µß/GÏlØ8¾vo×H\h.Ìíõžº+nQ2SØQ£*œ˜Æñ¢Á$þ4õsÒ86§8V4²0ßiº~L:`µbÔöŒdðx³ã9pF>Šp!Š%C~яoäØâŽ3þ/[ þ¨/-£Çn™1ï†1s„õ†Ñ74Ð$Ú)ª­5 ÖÖ)ÀSÁ¨Ù6. Ý£#÷Ú{œãE[®ìvñ3[ ¦‹,Ä3 ¢ÏÂ&²’](|·×¾O[.*¯Å‰ßËM \ë¨m ––, +z$i¹ø…w)¯H•à‰t¤î‰VÄöˆOŽP oážß¦1Mù|Yg®QûWÇP¼ÌÇz  +ke¿Ænˆ‡=¶«ùY(Øë_·‚ða†ë¼ ûß ×RФ-LêñX$݈™ò,`kî¶(Ô‰­ àˆ(ô²]cúÕDŸm ×êH#9 &á6@Åjo*ÝP!„B{h!(öÉ gí±eX)˜Ž³pS?Ã]”ËíÕSV©É'QóÏiS£€Ã^#§Ã§°­°ð5b’›NÁ£ûæÂýRnÖÝ0)HWT˜n”(`»„¢štO -ìÌPÅɲŠÓîّA(´XÎa\B€%¶—=àºR–sÐÎt£mÖÏ'#Œ•Os­†¥£Ó!;)çRá:bøÏÚë +bκ:RšlQŽ+?í§ڌÒn€,õ]–]ÔÎ1fP{™¡öky§[1ê~:Æ´¤OD°ét=Т~¨¾å7Ý(֑Þ6Ìœ"È=_öÝ׈å_Œtº!Ӕ½oJØTÓ¥‡4Y‚ËOwÍ°rT˜²v§åíTnfRqòYÄ?‚!“àŽ'¥³`Š®pp¤À´ïЯEåÛ k›“Rå—Ó¿›ôÀÈvKÅ:l)Èç"šµþÉQ7YßjÙúý¼© y³Ì?ýdN#LŠêWº!×Lžð$ô´@<Žå›!:±%¤{,Ít“¢î‹¢"¸&ÈþrÎ Ù¤!MTÿïTÆ:ŸØÒ°©Þ˜“(™†â%¦Ô·1^HŒ1 Áæñíç˜{ÄUÕ¨ßÃY×+™ïPålDÞlý•¤:V ”ùä5þw#sµÉϚ“ݬ±"ÞÛt(¿¹­oƒá¢YcÁµœ¿(Ìe'¦’£Pžnã²Z£0¯ÛÐ\Þo–Õ‡ép¸éO‘»Äñ"‘n4Ë«­5žæh¡6^‘²áìn]‡Q²Ån¨¡¶r6‡y‚zûŽn :ÊSOø‰¾;ìgY’=RòRQ”<µ•ÜõáÑ0 A0Lwõ ¶Ü§DuÏ«LBñê¦vF7J¯¹§:*f°¶Ç9ZE´Ì߁Õá2Uè²óÚoO縟ª©Gñ]¶úRÒ¦|Ÿ€–ÿï‹É +¤¬w²;°ãõÃÅBµì©:ýn+ŒŽûìbXNO °%Æ›ñ®ƒt¶FJ–á('¬@Rgýù̙ôgd8¡â‡­CDÇâ(²Šûñ‚¢j³W:VSs:Á‹°YX7âÔ/?t~YëF4²¿Ÿð“&<2L%6‘Æ~έ㻓FB#$gÄý“†¡8™’^xž¨º¼ž"nîBÌm_ðèg¾¦.* ¶MäÃ/tKÎÜ¥“Š6zĸ{•‹4,€ÇÔ¯™]ÙRZ7„›¶Õ‰\Ûu[7´§ç’+¡«šï5« ökžFèUqWj`BñóX&1ÃßdWøDfߨ¬…îœ|¢j[®Ç;N…ö0WÂï"]¡ôŽôœj«N ŠÂJ¸EGÚǛb‘Û‘ªžhZŠÌ$êR/àlŠ£¸k“ƒƒ gŽ† f8ÊqºsjB‰´… ‰U½uQ¨‡—û${ìàøÃÁ§wìéü6p¯ÿéÙHŽíg¡ ­¨J&âB—RÀö€QYùç<+¾w¡é“ò—ÍŠ#’¨^( +R²,T ¨!8í¹ñ7ÜIª`& ÁÆ+™“W EÉn4U­ŽR²µ!¨MÎG_…‚ë6xòžJ8C –9dÑ$ «?œÎ⢜Q~Py ]Û¨ÁcÑ<¼Xˆr”~~x7³¦ì> ÂO±6»Q\´N1?wÆþªÑ xöÀO€)1FGT“"y~ù«Ñ8óÓV´ RFo^InÉ&‘®eTO¸—ò–8¥ÜÌJí°JáðáÔ싢8?ê®êRðG”ð¾GF_áŒâô(Ḡp‰b1jþ%Ånþ¬Â:ßÆùd—@¶y½z Ý`«Ò³Wâ’Ó‘!ҚQ$$,±ê£„ÝÂÑy3Ñn‹Ô”Áóì(ó÷ôöáxmw¤ a¿'#^,R¶Š­Ø6ÿ¶üƒºW ©¡²z<»q§O€t¾‡ð¶š`Gd)ì…ñUÒ ÌkH^kTyÏ* ðô‡»Œ¤¦š(p íF!Ò.õ`†o|Ô¯zm;´Í¥D¥4­Ï’‘嶦-IŠ7‡d›±äÑ,ÒûŸ:{x\!¸üN=,MküwEiŒŸ'Í]E|S/o¹E ƒ7]"\@%õ¢"×gmIßĂw°c’ÄÁå=¥©‚+¹ŒØ¯pJœ¸J è —pwïÈC EmÃ¥†g­VŠa 1-»Ð’bg˪+D„o72¦ºË¦°"ÕqWùbΔ$C؏ÆGÌ+×ݑbì_eؗ‡0h`)DÌ4ÃYñè$,+‘ÓÉËÈe£9¿¾ai”r›ZÌÜËۑǏ¨ÿ=J#!»Õãi®é§H‚Ç.ˈc@š 6N›ãâ³3‡ÉpS(V‰2ôèW ‚E=ZUÎ+ÍL·jTs#5ÓÍä­·º=`tª+ +Dˆž÷@Š¤ vÒ¸C·æ‡&ry(}}æ:wC‰œÂÀ¹M¯…]]…S]]»Bß7¯Õä¶Ê¢ñævî±Ã°ÆñÈTÍ͌â÷MefzøÎDèøš½@îŽZOßÞáòaAºç˜é4ó2>p.?ðœqÚÏKÉò·„‘@iüé_…cÖO,Mª½;º…O¨?䗜 +(6¼%ÔJg ŸÛ°ˆ™ÔöðϟYäÆ¿8Ú%q~òWÿ’÷Û]|]‚)¦æ—'w?áƒnerðIòÇK,/ ±ãÜð[%LW:«=*)3~­è\y`¢wh_M ¿øÎ9Yí<@»BùBR`í‹+M7¶6Ðhýþrù¾m£®÷çÂûÞO¨³û®0N÷]s-÷9rïP½o€\¸Ï‡|5Ý~ÓSn=w‘D­>O(øÍPe³Æ“—맯hýHŸyè ù8›ÕGsVÀ¥§‡d©›[ÇPŸaðšÛé‚H)ŸGôœÞdò×]ö2í ŸA¼óv.ßù.Ч97ÊúèéÔ<Ÿ“ß­•ð¾‰¸]\¢[W®ÃED,•Ï¢½õPþ@ÕsúªýÄcêG£§Dù|/µÙh|r;po`|:tQ‹§} Þc*TÉö §ÄStˆïÔUÒí6i‡ßµÑÎ;7bø[ïÕy^á™Ngxþx&¿Å¾ê(äÞ5’ †ïI™ö>ΰv淎Ð~‚S•÷”*3xïƒ]‹6 M¹© æd÷°'<ƒž£t:P÷¾×ŽJéöVÛó[kQ{®,ƒ§+ìÔW¿þð@{vG9tóìÑ«³Ç +ÉݹÄì9ö߶§.R àê_ì"Ù±$ê2AeÖ³nľýßáÆ;# [/Ѳþ´>ޝýe½LÃzWïÐ× r=p>‹a¦þ»t;e‘úí3³ÉHñ~ +x̊zߧZPï>Ù7¨ÇG«ÄôÜxç_X1zAHѯO”òʌE +ÐÖZêC‚Ò;™*QHz{.va ¾8eÉÓéC×K}ñïDô1TUHjú²Ÿ–ÐÿDÙ¡‚>œÚW“N0Ñ 7úTzþ+O!#q*K`çÍÁâõY‡Aç¹hWÙDu\ΏžÙp~Ü;×ͯ9dóÌ +"å„äw¼!/ucږ /Ì-Æû݀å—&¼•wª¡$Tj"Ûm÷t‰H£T]å‚Ä3á<ÿ²òµJš‚ìåEÕ𐺩öTBûâ-<Žž&{ñ6¤ðFJ.2(°þhT½_¬#ĹwÄM๐ødŸ(ËkCCüì^àMŒ¸IÄïq“ÑÏáö}ßÛA€ð-åÓå{ü<úí¾oš¤HÀm螽S¨AUÓ<þ‘ŸòÑûûxÀµ2’N»Û¯c7ì.(.ZwCꮣ"(>®ŒcãÛõø"ÜB¹‹ÍAÙúƕ‘»0Fb´»ÛµFÐ{CYœWÖ îI3œJ Yà®=\RßÞÞÙÅöúJQ=©ÎÛ·r7ü¿ì¡ÛE?‹s}p»˜}/þiHȟO†Øo– Lú!eˆû€AIûX"î&&ÖÓ)j̆;wzJ¯×:ú"5àº2µ³*nòm·n›þ%I»([Úi‚‚ZŸ—ú/ŠJÝY6ŠD뎉b-¤‹‹Ê{è]HäÐéÕÇCÿ¿ß™¥rE´;˜«Ë¿¥Õç_X}Hƛ=6WYua—G'l¤zHs¥`é2ä¼Sç·Ž1智ý–‘F üf“Jœ>â?»`vᴖýÕ_l~X£ñFyÕXà(|«¸§~6Ý~…½¦éâߞšà<2]Öc¶Î/¦÷™Äà/–@W¼K/L§9k¡ò°W0ïD¥»æ·!3Ö]5½Ó–í9Èí’~$ÝÈK`§»ªx»µµè†-°Ýʀ>ï?RÎÌ1pŸûStîkۊƒèä©å YŸ1w¬Î²HWåH!à H¬¶ À>^Íê֔֋IÐõÜ®V ŒÓ4·Gsý¶Ýã•È­ó`™¤ÙÓÍUõUrܬ ¾†@gÄÃ!ð m>ŒÁñLÿêÎ%CÝbH]_ꡳ©s?zÎ+Óø˜s9b-‘ó»ˆs0 ¨Pa#¾óô‡\/7láI€” ¥Eƒq8Á›8:V,'ðú"™_Cn^3^.….PQ^ðȟjj>u=h°|æö,2UhÄ.œDfË1gÈÁÅ?—„‘ž–=bÈħÁ‚¡W€“_è.*_¡ûj/b؆Xò‘`eM®$ñÀ@ÀûS4fnK§Zp¥0aö¨0›²í3”ãÛ'˜6Õ9 y¢@ɲÁ_[Q=‘Q$%Ü˜a¤äWðx2˜Ó}#ú‹î·UÊàf©xã] ¤zZ»zRw‘8€Ñq-4ŒTC·b4à8€P4!ÕåncäF9ÃÑjkIR1ŒYՖX[ |4ˆ[àcÌõQfv Dnå^° °‚Ñ:4 °ݘÒJx.  ¼¥‡s*&À%wƒSBÔ 0›˜úØ-Óè”Km¶RB®|ßàFUηM8v Õ?öŒÝ-§J´^þX—í“ödÉ31<Û3âVë1íA5Ñåëp±Tdk™Š¢[joÖt’͵ ùš×WŠ/ϸ§„:mš{Ìö‹–Ì3D¯·ÿå‰ÁV¤éÌEs»¬Òp¤24ôyÞç„9œÖ>ªfŠ\(ã+'¥ÓcÞ|Š€*ð¿þå[ €+dow?ï­qM6ýÃâüz{°ìP}U'>¶á€‘Ë- ‚íiO. –sõŽc™êœÉ¼®V\¶u‰’ +¹º +{¤ü†>蟈¥„È©§ïÛŸèþUwƒôYzËYXÙnæô.Æ{VÇi†ÆoPÈr=Ö/¶0÷$­Å^4Îû62ÛKÚà™Mça o2yäÃzt~Êhm™֍ añu7D5tKµ‚8â½Yðí±?*WPc¯_[½m~9V…ý@KK:Âë÷J${Ď3æc²Võn璢j‹¼Bâߘ~@Aj{]¢+¸ËCpÆ͉Ý=Ïîóº +¸•Èyw˜úàê•HïFzY=A¢þéMæÐvq‚‹æ]mÉ×ÃZ=‹ý »óúB{Cô¨Æ¤f(†ÉïAóK]U‚ô›„Ë+š»-„DzѿF¸Š¤T + +PϨvrpÅXÄ .¢‰8÷âlX˜ 2ë­\s/j–Ìџ#¨Kžskc.ñe +ÚSɘýXïç™lÛט׊ùv–Þ÷?}k|Ù¿‡Õv}ª¥rŒÐûÜËdpŽÕ$—Œ·(Ð䶫lÙµ¿€Y„1Úh˜×'¼¯[Ñg²g'Ag”àF_ðîG˜Œ‰ä徐¹/rÃÇaW¦5¦¾WA9ZçµppÈÒ}è@{fÄZü5"ïøqI·˜9<°hQè²Gúçòjç;ÊXJ³9·Í½w þÀþ˜uùîß=L+'Mn”*ý MlÇb/‡9i…–u° +s3\"XO’u”ÝÃQ¿=Ýi,WÈ沇Cý:Ê{5ünYÉ5³nN`‚JU‚ÃpÊ_҈MQ,Ç젍õË +FoiíT†3x8®y¤—^ +Éà×1¶bŠ•á< ù‡C¬¸ ‘5µ›RÍÉt¤Ý Þ=ëñga …WóŸóàlHˆ¢®¨É/`£—(hˆåö°µÕq}iaO¥Èˆ((i¤oHуA ‚€(Úh|†Åº¹ž¹g™4+ÿ¶"f†2×6~ü>‚6ՑÒ7Ÿ1UWDAs…™ôáð_ÛSÐáè ˆ/ÉPF‹ÿÜ( }ERËLÙ’¿=ÈÇvZ2Î? hêIi`îàʄàíÙLF*ˆâˆLÔÚÎÏOš½‘ùN¢h%µ6A 20cYRáN~—À_Úç®±ÌBþïá zà¿Z²h’˜3qʇ£¬N®t“rSǎ¿œá×~² +Ê8¢pTóRG*s‹“QÈÒ±¯I‹(NhGd3Vò1rO&ål"ÓòQ¨)¬Ö­*½=V”ÜÅaÀ7¹jx“, ò^Ô «½>'LK€ªí²løòEòèÒ°[~Ã3ñ±÷ላ6ö=éF¸´‡Yí™ìÿü +ÃFÙY6Eš$tЎ¤aÜE‚÷8 ŸÁ“1+ÖãѦ¡h¬ŠB纉ᝫÆÂ1 Ӈ}Æ{RÊLÌܱ‡x†•ò‘1\Ô‘é ¾˜¨»q Ž¨Ë#ÿδ¦7rÜríâÙu…ÚÆñâ ûT4Wæ}qhօBˆÄ-µé¼M°Ù™ÌI¥`Eñœë·ýtè קÊe!2ü…»x…žŸd…į–•Ä§Ì¿“¢Ð¨˜J'Šê0!ëR+òZ²ÊpxÓæsù#q舸®æ†sFÎæñø¯o–B}ÏåŒVÔª[p»¢ˆI%はÌR"ï5bߗáI®'dð-¤Ìú…ÔP[™Sd‚FLte ü¬Ó³w8~Kþ[t P‹b=° G-~Éî{=õ ή¦£Så谀ƒ#õ—U—Jò™Ý”zf„YâŒ;‹â B +Ù9f…P1Q†Xže)Í°Ã̝d¼˜¾©-<57Îø…2è†â~ÒÃ6DíZݐX¯n+k iEÇÒ~Þ0s1‰"ìpžq²hRFÕñÖÎQ&Ùx¯ï™‡Ö“;ñpHÜ1y¯X§x8*S9øàêè(ÒR¤mÿßçK¯V'±MNŽxÔá:ðì ~Ÿ¯Í +åþ¢ðš~Å¥F +8Åb$+ÂB™ßZ¤™3O‘zÕ­J6Cz2 T’8šR?o«Áɿ너2INFـ£FDil¶‹<²¤=ÄÇt¬?ïF÷á5I6é0zÌJð£Qbõf†cMYå—5†¿œòêŸÉghbNIêèÈ»" #ê¥N[÷¢Ý-?÷éDŽPÇw#m‰#’mRìï¡k7 +ñ‚0«G-ŽL™7âi·åFsÚRÑ~L-±QÇÈI؝É#È®•‘èhæ&`y\£ˆÎÁULâëÉØ÷D=Ó¿ƒcîQÐcÎFþ‰¤‘¼È&{Tv]ô ]hVÂEUt_¤h4©'Uh‘»0¹—I”b°—Ð(tVjSSQTcªÕ ­†j˜*V4P5`OQTL’ª"zݯªjŒ¿¶!P®ºËõ2×Ï¿» +«°ªŒUe,¬B HÖ–UYEYÙ i£<Ä%(Ðó_F„¨ò9 +4Ž3T=©ÏÎqþ꧎SSQœ™Á +œÁ©[>À) <Έ«¿J|ê|¡pݳ£û¡ i U€„Høם$—!&å"R3/SÃT«hڙ8>¦+B8t:¡ *uw?û݂ºª«ëÔÊ~¯ÛNxÆ_Óü›?öïwS¿QgƒwÅ»w—gwh‡nrüMU€èi8—ü ÌŸˆÈ@ÿñ2ä#·Lчà Í.†øƒÿuq߆ƒd <ûjÔÙ>;k!Î|Ì_A¯ÎqîÎØh<ž×¯Ýº¡ÚúC„˜ÿ¯â쳝M\¼„¨ú8úÂËK$žß¨Ô½ë“`² <ˆƒ‚ÁSž6 n&(:8P@F:›I„q¤†a(Œ1„Cc˜vø:`~ï¡;ÆkҋVYKFsÃJ?+¾Êqz_\CÜöå}6·%à2é_r.ö†h¸Þ՗KýEDüÍ; ‰èùÕú¯¥MhÔp¢ë^O®ÜW3Ó·µ‘#‰­èí•Ç@R3è+2šs¾¶¦ ûDÐ;aªzA.f‰WÎýÒ!]?ÅÁsåë³Â1Kýc¹ÈŒö±Ç_¦î€£|/"ޅð9—$€aѼףo8ŸA¶ë^KëööŽW(їvÎ#;Øk}D·Ê™æi£Žõ*‚ŒxV×N„—‚!½ÚG‰¦g^\Ú +A/7ê·8ž×1„aõÇyí¦Hèµ9ÍkÖù-v’¼1bóèb¶£¹³õìí‡âå쌵üQüǯ~‘ðjxÕsCËáõO|C@š<,EzMhz¬ZWÁùíú™ ïbÙ¬™­o÷%䕠»|‡SåÕ–Ÿ€ÿƒ OãŠ*°f—ßÔJvùŠÞv`Rî‹Ø¢F€³š_…É +Ó¹/¿Ý÷s uùöÂЇ+w¨f ¤«ªÜI=V“‹›ÌI.†š€®¾ِ +HF–Î%Pã\+›‹‰ÑËaÊh; ¸tsužï…Ûçðáz©ÜR$žÃUÓ/ˆF,0E|ð‘1®²  pxTž7t𥅑èÃ¥·ŒàKÁ´hÊ–²QIxBÅÉ,;Òz薟à“A%&_ތp=—\Á¢’§\Ô 4u†¾~V&ÇAeÏhü —ú +¶C/Ù™¬ +dt¶Oð£L‘#¹½w4 øò´áѧ³úõy¤ÚfùïT|…ÐA¹µÉN|†Þڜ\‹Ì2Ín]BEv‡«@·îþ£9Ìö Zö¾!ø; ¹Lܳˆ|’~×,' Æb²Íq XM` cTq»4#> |ûcj*ì +¯¨eE®‰r êÓúüŒnbéT¢´Ú=?ö1=ÛÒ²ÆÜôà>ÈZ2ãm˜VµÐS4ÈHPÕÚP,5úáåØ]7µÌ_‡ ؤ–_Ê¿ˆZ”¨S—£R,‹—E×èÈfÝd Í\í,×á÷ü³go¬0šµ´!°¤BƒB¥¬øbǽ X÷„‚*í.=âx#´¢•‡KAË2¶1 õ­&áý¬Åde +3Êg²õë™Á‚£irVãi²¬’²Ý,‡Ód¿[%ÍoÍ:`|hǺ}dùb–†ïð& ’`Ö[”âƒ8.0-݇”\–ÓÈØ©•uÞ·TÖt ‰¹2ØY"*ˆa¯Àù;h ©³V½Ã½©þeU·…Ó¥â{&œœ‘Õ¹ANfI¬þñ #pU•€]±dþ')é¥ÉXªŒÅ°7FsÊłˆm¯ª1¶+ŠUš:Åx$›B«Ë2€jë¥ó2ÝððƗŠ…U6hHÖ…e>YiÅ`CÂZVðœJñâBX[Ø×Áª„øJ r3‰ĈM``Ù³™l§œæ&.‘Ü•÷ԀÝ*Z"ÙõÔ:k@Œu”zµ¤"®ª¤îæ•-áÏ#Yè)«\®¥5µ­Öōâtÿ½¶bt¶XW ‚•G΍ïFÐiŸê«UÝE†PŒ;tucü°‰¦F/¤¯* 4®XÇÄ¿K\%³„«ôë\AæC“²LˆeúV›%ìmÀ͡ª‘#f0B‚§òLBYՊÛóû¥håÚ }J{Ü˱ó¬ju}•³²°äÔ½<¢Å®ªºUv!u°< ouU?–-ÁW­ +G¤8éD®£Up²lV9‘©È*¿:mƒÅÁ>ÕFx€o"f÷ªÖËü +DK­ÊRP¸§úÓê0y³:¤…µ= 2á0ª²D/e’ˆ©r<{ibL¥zaýù +Z?QìëTS0ÐÍQ–,ão`³,k´q9óæŠ4Gú•jÖþq™;5q ¯ µ6+‹©}͕/ñ:ÙÙ±ñ&GåK¤ 8ʯ¥@‹{¶µw®Uj@Q,Ýä=˜ÓEÆ¢Q@+1D™iX~≡,møAŒòG¼FyWÊ‹2žlo.Êõ¥[Ä|H‹š{«Q,j=²UÐ +¶¢–™Å§ËA Qbâ™ãI«63 ÏâôQ¡ÐÔBŽŒW©‚sEé¤ s¡VO€6fQlõõª*íƟÁMT{ªR{F‘1{€*HÉA’ù‹Þ€§;D ߔ1¼ÂÃã©U %–XÁ\à†¢'Ñ |Ìś!?#2…¥ujKdl©ÔòÃnI%¨öì$EB¾µ¡ 87›]rêÕ8€»aCzS‹ûHä¾jS m‹"b¤AÕÂA²>Kƒ»^¬+2‡h銷XI$AŠ‘VmÄLe]T •j‡*ªñÈ«Vý˜èۑ²Ê¦PÔ/âR— 3iç»).gC¡Þ€ +‚‘Õgm-éÚªlg­k§6™¿[CR.t›V5ñ´äÜ<¦I¸ø¨ÖšE *K«• ¨¸ ±^¨¾W€Å #÷ãjÊEµ3Õ<ÜSÀF¥É•4(3BmQsñPÉ2먔7‡ØL)îŽu-îï©·'˜r«1™ÿu¶j.k•¹ï\\3ŒPÀ…̃ì•Ù:£ÛWaèâ_«„5ÑÃ2҅µ`ákË*Íd–¦o¬=CUFAE-sæ¯Vz«Xî d]ÿ^Z—âŽ{u).kÄ°XEkÇË@_SjPXLCúg˜ÕÜÉ)¦SgmFÕøHx&ä ìÎýâ«2ðº™hͨ«ŒU ° R잓̈́¬ÐLw´Vn-pÛâëÚêbИڗU¡Ák€«å“~¶ HjÞNrº‹¯`HÜ»XCí ë¨çÀ8·†6VÀ‹©D‰o¬,âÅ2ÈäƋÍN°ãÅj-ú ™fí9®G.'GÙŪ7–Yýµ©¬jÝ\¯ž2ÏÓØeÝÿz ô¹8õb½øüéÜ®•}»ùOÀ0‘¹”õXyˆ‹vi¬­‹å ¯5 Bá\;Ž”µ¼a·š†/.u‘áÙ\6à¦åq/×7Â)0AJ°˜ …ëqqJ, ”ÃÅý2†½kâÐÈhp÷ûÔZ<Ó¬sëø†|û2ŒðӜmºü4\%&ŒÈ”ìÁ +áÛ]€=Ég#g\Oãì œë­±Ž7ý 1.‰Ã]‘¼Ê +u!!Ŷ9;Ôª4åŠûÍ©ú€à&p>e¢êôGÇ&)ðû+!äjIÐP‚ +Y>UÑ{dxû‚™³¾Ûu;’Õ"šêD‡º0^Ì-¹gÄs ¾Ä¶5ý +™zˆšEŒ.u°Q†Ûì/(Ü"–wSç@›Voî ÷niUBRe$ÈØ°(u3~¥†·r× ‹à€÷ìhFÃåha³a{ÝEÄ|7i<è<%4¾®ŒdzԛìŽ7»¿ËòCi 9…œ„|Ó[¥¦9Ôy/Ö G! £ƒÁeAز®lPƳ²šŒ3ƤVH‹¯dCI˜Y@Ë´Jtÿr_ÝË'Þ@{O/8Åÿèst}€kŠ„ÂI¬)ê9Ðáºðë'Ÿ$×ÇTè÷#ðôõ³å©¿b_pª¸®tÉÔ¢Rê2õ-~ÏÓ-a^ræhÚÃr»ƒ¦W>}+oãÃÙXrX5î¾#¥ÉJöt5ÚV^ŽäÝ´¥žÄ}%ŸPnN6§ tÈÔºet|ï‚!yóÀ„¡‘MG-ô8Á~»/š…P,KSÅj-ÞJ®ËýÀX*ðP¸ÏT¶Ø-™A‡Nù–('Á¶ŒFÕq–ˆm‚o½GrP9R¯qnŸ6ä ‰ªæIJÅƘ±§'בã‡óŸ‡<ÀÅFô{9!ôD"€ փŠQúzñì+›„¦_¤<Ÿd–ÆèNCìc8nÛï‰.FIc€¦g֋V‘íH>*]Q(JMKj‰…1h¸±Ïæéâ¬Pý]ÅBKÀ~Ô5¤ÀÏRCÇGelˆ°hԛ([8S —Y\M@¶+V¨½{ “~rQñXC¨Ö‚•{Øԛ>VÙó,>þ*N×5dÔʑáÛ0ó#HA/–Çcbz1R<l×­ӘڋËÏi6˜í¢¢„{qñR|ë‘NìÅÂqx ̽ä²iÊEx.Þå1œwñåû`{švq ™SUR sÑJ³]Mž¡2rVÁ m¶hlãͧƒ FÚl0Á‡y¸|{ ¤#š6džÇýrOt +ö`3)ê†,|+Ù§$½§àOÅéú„Ðö°€#TI”£Çç¡ì˜í@‚ Ù¶¨¢Ë= +òLðbÙÊ¢`shƒ´ѶUoX™z@úVùND39^ü.‘Ö7Žóml 6NjђŽ„Ó°‡ÍÆÚç0óífm6¼‘\Gµûü†3¶ˆ\§£èp +‡8~u¤[×u´L—?ÖZ|²Iî˜wÅ2ÍôßYáí Ó5ôے‹J”´,Ú’øìáôl),¸´lO“² +²oCß©PŒÚ¼xøœÆ à&½ˆA15S‘GÛÉÈíl餶+<ý,ú@'àlnˆ«Õfê´wd6ZmWŽØڐºÚ.Ä&\9¶4èb)8á“ÀÐIŸñ~æËÚðHZó5Øé˜l³Rœãµ6ò p¨ÄG§ViNxɖ‡/^ýjÊ)¥í@‡|é²!œ$aÜàÃ7C±O¥·Ø.¦x1®­OxÏRIÚE +.G„fA— +Rúâ';¿( kÖ +dx[Óg3¾OT ¯é #~É…sµ^ñ[f wy;‚r^:½‘ô"hsZ¬ny;Ê|Y¥5“Ÿj/dÑURê˜ix,›Ù‡¯—øŽ>Ä¿@<ŠäÄn±ßñ• +õŽÇŠÃ Gù¯ìï•14!·¸Hj{WÉ8¨m¿åm®‡r?%5èF j +èÅÒϊ—¡€*Ô¿ÐKv<6Dˆ]ֈn˜§NKä†ÿ0ˆQ¥v·Ò†uÆ^°Øk@æä-Ô?5Ft¢”éøX˜ õU¤’’,øDÌ}C҅ãS#lG † +ü¹R¹ÂŸ—4 §íu]ÚWX÷Ó8©ñS»]¢cüov©>xՋ…LÚ-½[’ù‚¹jЁÃ2!…Ðö%zd§[Ü"ÓeØÒjŽ;Àjऽ¥È®‹å¢•ëïøŠMIÙXC”BûG~HÁÍu2¤Âb‹EÑ®¹¸ä±>&Òçcܵj* ƒ$è$úÿ҇1–c¸Ü=m©Æ°éSþ2œ%+¡™Ô›?Ò —ðŒq9OXgæÚºp ±!ÅõxìLf‘‰ðqêO‡ù&xH Â^üM€Jºí'ƒÚý.\Îˋc ϗlD°—N¦¯çA´ú›¬ „ùíHî΂>½¾¢ ނ!¹àí +YßR‡·ýõµ÷¸ò…¾ a}öC‰áØ#Þ÷ŒvÈ +]“¡äÄÜoò–(|ª›Ð÷@: +?¶úÛâ0ǚ*–ÇËdªâ}¸΁«ùu0Ý–ÊF‡Éîc£ ňïcbº˜!Þéò¼÷±3û.—n/ØÝÛðcÍ\b@¬#?PÀ éER o@ñcÀ€Ø׃U™!ˆ‘‚Rá‚®vÈDiËÁÕõÃÊòãE¤óÁ@J®hÀ5*g‡ Ãm$Ø'ßæÁÚC`×àP[݀>b€D€#üÔòã˜>½Â ¦ˆ° Í=¦%|ºlnSD žY@T[k`~NÔȵdÉXŽ Žàz ·›#¶u8! ê/S>x¼ád•V´Aƒc?žÑˆô°ytQ<é©ãX ôÁ!¨_Š F¸«G8 +E¹²á†+øJ¹Br”1$Ëáì«Ä´˜ˆ ä}q+äXˆV÷JÊÕúa– –Ù¼?Þs ²pÓĐǑM!KS£g¾üÌÁþ҄Ós"†æ¶Œ ۄ$Lœ¸UÀ6®2™â<£ß7LÌAIyC›T\> ôÆn³„+Ž'Gv¡Xi­å‰84eœ w+:»Ÿ$ø/c" V­ öÛŁ²„ +!,øoÍåàõ¹8'–ŒM2ô;ÈY"±C$‡‚ƸÿdÈô[%ŠÏðg?ÃxeèÒÝ7@sƒã gv0¾Ál6"¦p]qó$d4(½iÌòAþ€VÉÐ +½ä­by‘yäG:†ï?Èë0ª˜1‘Y +êžxäg6†“—!g®Ë`„lÝ[͸Ž¹¸ÄÕI÷ ɽ®>°Ÿ,ƒ4-(8{ÿ4ö#†Ï£†cb)xæ‘9½'±ä K“8j౓@Ã×aåpIbÑù>]#µÂõ’;iDBpa™R°oynöîÔ®x›„Oóâp3"*ÉÆ$J^„–sG!è{­!ŒÃIöƒ¿Ý@b•´V[b3GÚ¨K_êÓÿĖ߹”PeDa~ó/´ó/}øA—øhH¹ºJ oòm³JiK‡ähOC!¸‘³/r De¹Ül +víÀ–/ÈäŠã•Îpª‡2çèÉnÇ/*=º¤AÖ:°q²a<Ά…óª¤ øFBÏþ˜Ÿñ9Sh*zýUïïŒñÛÄD œ2ŠâcXB ‹©4¹uN ³ˆ£±§..údÚ½«z†ä“£°Bbæ>²” Æ̞,(Ê¢Ép†/Ăòù|H¾ÐâB6W ˆÕQt¹F|#’“õ•Àˆ0ªf$dŽær¤ö‚7 ?± +èå68$fÎß½T̺Q‚ÅËPß!t`ÂÅ"9°XX Q— 1¤:S±¦±ˆýÿÁp°írá ÔޔˆÁL4­Ôïòíêy5#jm՝sÝ5³­[Ê8JFD¡Z²®Ü> ÑæÁrÆØ¢Áˆ{a@-éÁ,p7†ŒC +†€! c󐞞±9Ð ³¶8DRf€…î€ÐÕcŃďÐ.BÄSõPD,¦ "ˆƒ`k.h%œ8Ä-þlˆE¶½øÏŕGi¢2tc NGÛ¥q< +á>rÿ*ûˆ’/b¨ËŽ"‹ðp +BôÆûCÐÊå  ©~qH4é+&h;ƒ¸ü¶½Ò‚؁ƒyx³üL+] Êñ=°–âƒ%ÁÄ«ÆþCíÎÕd0B¤XÕÅ~øð J PÎCç‰ü`p¸ƒºì]ö£úPÖ¥ø“”ÕFÀ‡z»C4€ºh]\ˆ‰r‡Œ™{” Æ8Ûð¦+ç¡p»Äî€UñÖiŽíðÝ%‡±6âü6TÌe(í5t¡‹ܦäeð¬‡$Å2WpCÝ×"ê`ˆçõÖ@°—/wØf]6 $œh< +œšø†ü¤ÃbB>d¡ë¢º«ô +¸ó ¶Ü!¼|a‹n˜û \¢! –€ ‹.›ë8Œ§L`ȁóíG®Ä5jZ’,î ó\Á vTâ 'oÝxvÃÆË òË«i Ao˜·2¶a‹èU„ψ6Tß¡aàÈÉ=h(lõ‡x°a—¦H)£Ò@Ÿ 8…u^8œk kek ik ©Õ°QÕ x·eû Œi­·ršâ5æ ÉX)ìx–j ×8†‡Lxc0oŸkƒ‡Rh,\ HÊ6LáÛ 9wJ WJöeØmVe]M>S@’¡t¹ z  ÏÆÃcpªþCÕ +Á¡§Ç–0Þëñ¶POnpÌÿ·§•VáÿÐZZ—6ۅë߀9f†r¨:l Ó¯˜ ܱ‰çÐÕ,7rç\HH}{Aƒ´÷Ûô¨{R¹§Ú¥)Ld¿(]è?‡ý†xrá§Åƒ¸à˜WGpÁ÷Ñ[PævŸ:·0Së3mÁ˜é¯C¿1¶0 + ÂvÞ­—­…K Èýaï8€’¬°—“—ƒºf€éw‘ :‰óŒ *[ƒ!l¿S5%Ŏ‹b–ì…hä, ' ¬Ó¹>7´Ž°ÜT^ ~M3$ÄhÝ ÷]P!ȅj +¸'îŸÅ¦Û¥X +j 7#Nxc…pjqI¡Ä×Rn”£à§ 3,QBŸÜ°„&¸8N0€mª˜`>í&h’˜r×z¾eÚrI€Ý¾  É ·ƒº.œ`èéó7AJÔ³ óñœCÀBáa»rR×IQ!j|B bô?5 +™4“+ƒ4–à¹zã7ÿøÁå§Ø™„#SÂëá+bZÆQÖôÌÙރˆ„5M4&Ľ’&Âýí¯ ÁÌ@86+O{ž½Ke³Ýcpa#xùâ@~*É!¬Òÿ×®ñ¶e„€ÙPÂ1íE01L„"¡@â$ÂÓkb‹.ÌÃÖ%ˆP¿P7;Ð#˜A"º¯†ðq¯ï}ÀŠV˜)Œԍï̌íð/>ó…<8š5{B W”ç­DånÙQì‹å8þÄúO›¨iþÀ~’|¡¼rôƒ²Á1(‚‚Cfúú¤v´;—–3•fø Áh·þ&;h´tµ“ õXCOžMè! öMM@€ƒïxoðàÁâÇókö¡—t°¦é=‘ æz²ä‡/£C¬TäÁït*F¥ qPÚÜ»©ÄÁ«hjxƒoC7p +üqƒM¥¶AmÕ m`:)¬„‰ ‚ß0a@=e´ÞZA Á¼–qÈ|œsA0J»H(ˆŠc°»:ŒA­’1»ÅoÍ5Z<à“ `ä‘Ý$›J0 zZê0½O¬ 읍IÞmfu€¨FñøÜ+!Ò³N™„dŽ +_L…(†YàoÜ&0"$¡ øÇ(z{ñ +¦¹^° +°~Ŋ¬¹R—€î3Ъ£dÃú°Ž-¸ì@ +°|E½¡“ sœv†yåë'%#„ÃóN³@að¥6C(p½¨þN§@儁ë”Ã@®ë¬Ò@Á :(ð¿÷ýÓ=Q´ýß³ŸM€]3mÁÐm_¿›5™àŸ·Ü?*Y0]êKÀ½Ø~|¶Û0_%`Ì·V‰/».JÀ̑;‡nŽ ¤¤9Àº Œ ë·@j,»Øô"þ+ôŒ+JP3X?ÿ ‚à†« +Ù VÀæÌsˆdñ%•áÕ@Ö&ìAPxØ©6ïà–[:†{Ÿ ·)£D3æ_Ndॠ¼ü¼Y7¹ ŒuyD>k‘;$ß- «?,˜;µæ‚M(•A§T¡À·âY‡Áªˆ9.2H`îË64 Q,.°“YMˆg˜žKè–Ýgt}+¾ýÅQžÙîM²ã\Üø¸'Ç¿€t¿\t, ‚õ’‘$C¿©”@¨I'uŒ4B€p¨¿–”åôÿÕ¸ +`…ì÷k]N–¦[BÎֈÇçŸG`G¨(%{‹wºµ`¸³½å*s‡ºÆ<ŽfáKÈV¼ų‡x•i³n{‡˜VyuR0§ †%n/L÷ñ€lEhֆÙäÖ£¨ª“ùX0îȪ#Ž‚³Ûìa¤ÅBE?“q6F”úv#•¨¸!ŽíEÛ¢…A¡.'1YŸªÍkùDfõH ‰óÒ±1æ‹ÖÚiÅa¿~y±û&‰ERúݯ*;t`™¬ÿOxŠ‚¯&쾞Õū^HNô—!bŸÀþ^iŠï.Øà»P\c¯Â}féߢ4š=& ‘ÈÆ8^Òqñ²eÆëÎ=°ønŠH„ú;ǘ·*˜¡û¸v›]„3ÜDÅ»Äz•YgN՞ܤܱœJ ÖX`ú[3è3xŒÓw|%®ˆ@ÆûûCÉÿꝭ¥W5íLEú–Æ%Kø‘hm–„±Î#¨0‹†*¨O!ÇNÒ¸c§—ü 5ÌA•ù³R†»xE¤‚©À¶c³°››ù†l Eæ°4-YìÖöÖoljÁ虍 >[Ú +„1D›T×Q,f ó˜kƒ‡™…wôH~=Éñrx4îä ›»{b´6´ŒÕ,»õ 1-›n³üG֘í +‰d†ubx(ž&I‡5ó$©Šq‹G}QƒÔ?·8gb”4˜1à^/‘ìâ¨ø›ÿ¾è•î‡ìb_Ù0éæcâšÚõÌrÀUªF§îʃ—„ÜÁÇOÖ«±¢A #D¹X¼¬h¾v!Fˆ©*σ)©le¢O¢Abƒ-›úµ²3t©‡iY†U¸Mƒ£KEŸ™`Z7±EǶÆ|ÆJ£4ù±NN §Âž±Qxoìôeᾇ¸é ÐíÝ ’ƒSÞ1Ø5žµO<Øc5“ͪqÀæ0Ù@ Nïßd\® ä JD­KJ™Ÿë‹ãÌJ#Ú–%6ôA¦æ˜¦Êß:ҏ”ì4/hu˜G“þ“†Ì✆˜n\Ì  *fzS<±¦»õsˆGãEº¼é­¢ ÖØ]YZǵžg92$n%7ËÃB`þþóèd~¸;€’åI‹…:Oá1¶¦D(`…0°d7:.ü²§ÆýÊ\(Ó&‘ÈŽwbùRŽ 3 ¶¦´ICa£SRi–gôӀ§QvõP̘ýû Çlc¨ÚgÂÂ?¶øᵐÀ da¡AÉ;*_ì[Gø>,¹ÖøQëXcÇOW¦£ý” Eq½Õî3S#ªT€=.ßgyˆjÀ[Aæ@º™©@0ò±ìq¹Lw't.fÃm™ÁˆX˜¬;ɜ‹Ìš2.LT´¶‚cçPP˜ùÒÞáÈæ]"¾C—&~– +%Ç£¸ Û4)dMŠüdø’0³¥Iëu¦;h"Uêv©Tj4Yyf4Eъà­XÉðâëEÕTŽ@ÜUɂ +tD€Y%d?ÕÙhfbzÐÐdŸúMH`'Þt¢=îvÿÊL…’÷·| Õia5 SuÃÄ܏ âÑӘú M,,²JÄy»Ób•Í§1eH4…0Ö«’àÕÈ¢¬è!sÃ0_H‚þM¡O=’4›¶õ⁜ºVË|°P0çBÆæåÜ:E]:Œ•4 ‚Bg˚X‹'1üDaœ©:5#·. +¢8øy…å ÖÛ5üEá>¾<ʔÆ,ZXÁ©24%”ONp¶$²ªØï¬áÏÐIœ"8ó#ó”ŠÏ]ëbp͒åo)ª\†üJº£5؟æEæSôA-`aã10O»<ÒU¸£yTÛÕbކn#Ö½G‡åó6§- ÂcgÜQiqÖ}º~¡È3Ô/0¸À±Õñþ.û%ÆøÌ¥Gkps5‚̓Y©u7òèƒi=¡·ëfW3cp=y_pú +6Mž ¯Ü¹Òà^_d&\‹ŠÑÏl…o=qCg.hqÒ;ÍJ y“Ý~¹çRW{Î=¥†/Õ×"”A¡× ñeåå]ªºøR³ê?†&ë1Ðpx´Ì«\ä•8dñ½`4oäfÌõ+˜bp$–éH¨oà*™‰tWÝüK:ÒÇ3<“OµP{«°8ŒwZº@âxÄ1Gž%SMëª˜ðc Þ>a +ƒÕ§º×Z°¿›N¸óÔ¶á ‚~¥+1 üàhXL¾³ñ/¹È>u|›p©š‚bçE¿<¨¯áLWß%œCˆ °¼/]Ô¨‡ôçÊXqÝ´EÿäRUíҗ#„5q~ ÈÌ 'šO”Ý,¤1 +þþ5eÓ"È䔼•M ° ˜Dº-G"¡ˆë’øñfqö4Œåúï5u|†¢…Á%Å`]r:YfÉ Ó]âoÿ¨¦–•œǬž|Q °Pƒÿ÷˜6í#וQÁ“G‘‡0Q(U›«È¹&¢‚Ê\5xfúÃі£?P ЇÀ7ÍM*÷dä„hùh­W"}€•¬~dBñÔD4H˪&›à68rzp@´ÇwQ& +ÜÔ!ÔYS\Ω¤ µé6îÚWš´(|B';{Æ ˜ 2-Ú¤\Xå3³ú 84Hš`ˆ LÓk™/,Õù( ­¹µ®3‹{ÄÀŠÞ»¤Èkly î¡Žlâš8CK¼¶W$㘠+Wïcø ÿ$ã’ȳyz®ÆM< {Ÿ K3ø㼨^Ú š:Zc5 ›ôŸ9}@ì:åÌI/i‹”Ïžô ÉξOúøðH6–Žœfɵ•Ÿ—ÖêŒ14Ϋ‘°*КÁÝAéw«NY‘œe·eô£CÔs›ŠŠ¯NÞ±4º4›eñ_÷/MçNÑâ<D•ó·}>ºéu¬z†?JÏtDë Ý:å‘KЀÑ_u =–\`ç}ÉÇ©K?|{gcôžxNãkP‡!2ÿÌô&Tn½,æ¹Úþ2͵C¬qè¦8·«/Ö×NÅhüÕÏð,’#Ó߄3X€¦™žNgrãK"ƒšéY’LȞçNÐ1nœœNDtgé¾Iº=8Ó7áÿٙÈnç ½žV¹ +YúˆëD^¹B„%Ø@!¶ábǟê;m`[ô A'-ˆÞi ÓÇKHø5ýbí;Á'mó]s²¯Frók O*„^tÉ S¡M¿Ü'×÷}E|'Dì×Til—{ˆÊzuêç){µbñ”J¥ ‰dØëeÉÀ["6þ#œþ™³áµýäôžw(+ºæO"Ž¤!4\úc‡ô&Ԋ<÷Ix¸qV,ybEÖ](}˜¸HNÏ,๠¡çôïq¢ØIƒÎÌÙ}>ø‡ )¦ ç)¾ ãùÆS‰E%P®ÆNHËõô a“øfôð=M†ª¶]*žc³é÷ +`*ž#&/çy ”u7yÝyÔ©FèÃ>=*¬ D_êîӏ—oQ›Ã÷“'Š=ÅÿíHŠg¿¬6~z¬Ÿ…lïӟP¢âí5”‰&s_ÔÑþç‹}zXñÓ?ç™ø@?ý©)û­ôŒ§-’ê ìBOj…!¸LlŸ^Ø®1gr̓J–CÿéYº® òêY»€e¼Kîè“s«`àJå4'€Ï3IwMO‘Q$\>k›hdaq”Q†t}Âò<—ñ¾òŒ ¹øôãu†¾ +b.Ú¥•ž $ÃMZ÷NÏ:3D“.ÓiS`F©ŠèNm ëN¦TK,AÚ0PPîŽì$ Ëš¶&~¹)»^½ßѼM¼‡!¬~ùH‹ Ù¦ÕE ë¬H†³µ•ÆA¤þlÓ1só“‚xˆ®¿z8ùèŸCxb»* å1Ǝ¶É]“ÍÕY2Äût’@iÊlÆÎz>Þó‘âPö, -0¿»ç0lY "Ô£Ã"׶‰× ÞÞ0Æ#ìí'€ADy…>$Cñ]P“%/»Pø‰""³L\ih‰Ÿ¼žª‰£P’Éd3œPŒÒÝ\"Rø‰þÎt €P5dBÒƉB£ÁåöÎ> –f¿@±Žêߥ¯DÄÅ\c‰`@Â|ze˜\R'­ýA°|–%«Mªæ„v•ö’^·'4³I֓Úõr׿~wâh„¾Ô{o'U¢º’”Ñxv‚~áàfë£/‘ôŒYÆ3ÂU%Û~’ÔYâ>Ù0‘‹us‚ˆIAG©4Š‰ÕI©–ŒÅT%8ÐNN.F‰Ÿ +=N4¡D-­Ÿƒ0kKÑÂ"næLÆ&eobXrûj&îôÚä~é5™˜Ð¤ƒe‰€œUºcêÖ^ñV“b™¶NMü1`ÃÄs*âÁM¶ +'MN´ŸI•rBv&å,Ðø£@ò÷11)>¢néù´gIè㉠‘ KʑQ… ÈÎ{0±¤ÕxÛÁƒ”(Þ¸¯Úf’ÇÙ]BßuIω·5—°®¥H³cD)²ZK"W‘¤ò³DŒF &UsZºnälÌ±Ø '¶4êV%ŒZ-öTRQ¼›¸$®œª +37ßâA!JJªÜ¯+á¹BB½ —l±å%¿\È g5í©y¨UÛ(z’ -‚ñáÇÑâD~ÃIvãͤ˜´™ÊÉIÀ&È ÁbKØyĜ Ão¸IÎwjü-‰W%»’Ðáù8)‰uÓw!‰åF$XÜx(x&nê}dí@n#ùÊo +ÐÅ_ ¿¥>R£°žHJ+ÀMhå´å °µîL€RíÊö,¹$ѹ錛L]Ìx27r>c*5¸¹â¦#óH¥jŽGÜ-îp Â¶jFÜëeÆ:ÒùuÉ<¸>GËÖrD YGà§dŽ¸Ïåo„×yÑ»‘®[— +ÜêDû#đþ@­œ½hÍð¶ù½$Èc¤âp+Fì/Dƒ‚ ’?‡BÁÈþ—Ù/Rmp¤˜k¢o‘ÒÌÚ·^ j·/ћE®e|u÷Šp‰kE*£P«HgÊýó§øS¤Óªµñ gþ(âsÿ#‘O¢Ü'b¢I5Äә¶1!h›H‘•]d"¾4§Q×$ãŠXö¨ç*qÈÄ,SÄEŸ!¬¡cò …w!-Õ·Nâû¢‰ï!-û¨jLˆÇ;d{Ù¨Cj҅¦×bj£‹3à !£¬Øèjþ®!”¯Z$Fœ!‹Ä!¿\ c¼-žò°Ðyò!x—*Ľ¥[‡X~ƒÈ@,4…¥Qh=­-ˆ /"Ö!Tó1ÆÄÜOˆù +l~¶OÜu녆¹úlâ•päÝC<ËÀwâÚ Ä)%’K®àüPÞCEeøkÇ䢱qax®Gfé7Äb5·® cäν²‚ïh –*‡ΐíÊ´§ø½a”Ž<0óP¸Æ&ìâÈ„:5O½ ˆiâ5q¯É–€Xà bHà£ìù?Žu¢’ì?žîÛcÿ° *ß±}¹æÞ¹·#LäF™,¾¤)`ëßêMe^öû1!wˆ©„¿ý0Ÿ3[«¤>è¹1³rª‘–T;Èr“‰%^‘œ)<á@#„âXZ\4.×‡C HÛËôAº¢iBÂæ<èÒ5¬aT…sŸe„ِH>¤ ¿Ì=¥ ÿÁn c÷è5r–%%,N(B˜6òp¡¾bQ—¹ ;0º±‡{.Ð +†òzØT²u¼0«Ø[öfÍ ‡«ØÈ«Éç#óݒLM#AìíîX\ÁòŽ·ñò Ç~:S^¯„ø‘;våy🏇nêÖ¿xˆ ñx|yç֋óÁ€ÏîZdÔS¢tç@ë·j=WÖÑîôKÌ@w‘±TwtBOsâe(.ɬp:H;DƒÒ?wUzù…aé€ÔCaj~q…n3 ¹ö£žƒaÄ×Q 5ORß ÕƟÝk™&‡‰Œ3I-M‡@%à€`é¨Òz“Ðl ’ºëŒTJ `éCÓE½ìÀÇöÿ1t$y¹¬¶š)ƒĶ!Ž…zyGÍ + ôÁHt²½Þ†Œà„ÑQµ”Ž¥$£ŽHÂ!x”[9Œ¦_æ[8àGèéH ›æɸq”÷†ä2²?¦4&DÁõqÌ€G›ß#ÊG‰˜S7„C>°V÷•7Ž +ÚÁAr£r:òo0Gv{†ŽièiYí¯ÀYP|*8ÍnU‡¨%ünÔUÓÌ 3 BCØÀÚržÑ øôÂ^·Qq­.Y®Áb§ÉÚǵÁÚ¬6ªäŠ4mÔ!]Þžgˆ†¸”×BR£"x·TlˆrrÚ鶰Á?A§´àâ'·€%óŒN삶9\Û×T±_эPn/Ä9<ô™–™âZþòÍ詁Uêӈd½}§ádÂE‡áŸdêö»°°Å·gÈ~þéNù™Æ‰)Ü!¨½& +lR>«ó†Çš )5Q•òñM YÈ¢á([8P›h\ÐD.óÄ¿œ»ø6äʟ_@‘$½>ÃÁ‘&åÕº‰ÿžAòŒ‘Nsg4,Iäs¸ê –‚¡OÁ6g:g,“ϵÖUá¶-ˆJ S4j]±ÌpÍÂÇ ¿ÔôDð‚/:–$wȏá›N1À#qã^‡gn±ðË°E%Š©ÅŒ¢­£r`þX”‘ÊA=žõ<&õ…‚ê×dà uÉ°®¢õo’ñªžâ#<%ÆE†o±ޑš5UÐd\ÙâôÇør†Ö9çÒÃâëÁ0ìÆ"Ë £Øs Í©g]-U¿—u'_øglDI[Â×¢mÆø"Y[Ì ±Ä4qÊг²  ؊’t/8Ãô«[™KŠÈÙbsÀ±P†¢d.¡fĹªÿ?A5T´YW‡4-+ùàñ0…þÑ*ÉËäœ ½{Vؙٜ/dD×5vÌe`Àö”ÝiÄ=8*ȗÓë^Ç Z~Â顕JWE]¾1”M&ܓöî4$?iIã‰õ¾ç…1æEgEÃñä1”­ k:Gc¿eÍ ûñùÓ ºãìý½R…´3‚N  +OíÏãc¸iXO*N^œu²3[âÜÇ¢ ïTl–/t&‹„¹«X X~áUÁŽgßBa]ÇEAÁë˜Ë8âÆßÔÌP–›tíëä¿ 9iN’©„/ÌiF´7Öm±ÙµÎ (&/»à–—ä«6œþŒºù™Í=Y…ÀÓ²ØÛY¡QÄÏV´Œ¸=u3&ÊivÕµ"|E?5,6Ý"Àؤu¯î$úfFŒÎt>Êl±\y«þ u ]U)f4ò©<.L¢QT ÂpêäTbÈӕ(ÄÛOG6]Ö¶2ÀGJƒŽ)ÓdtfßÎN(Ê\˜®Ÿ¹Oa1ã£ùm©–kG˜ŠÞêL$T"¢è8¾3¢òiN¯CÂøS‡_úU“Z`ËÝž€çʅ%aGþ"»Ã zMÎÿ¢6ÿ'`…ŽÊb9ßϼgžáŽø=3Nzå×ch]ý‚Ê£ÈWl M—¾Ëè oéY!Óú ¡x*8e‚9‡«<¬a‘OË7÷e!³ Ûz\ö12àþh?Õ-5“Dǂfð÷2q™³SÝt9üÛâ{¸Ï™±óLt¡óLÚ ;§ 7’zh7k¼U •–šmQe ֘p WH_¬·¸@jéjÃQeIô@ïæí0Ä¢93M²›‹4 +üi¸Bf98¡‡ +5ŒÞÙÂ+C¶íçHªÌt$Ù]5<ï˜ò0êÉ$Ÿœúø†8[ÙvŽìÑéb­€¥è1È.GÆ$•HÇ«ÚpBÈ8諆ÍØC<Ð…ƒç³b6 ›„Gm½;&xÃU5Ê®¦B›ÞDˆûQè‘IbAsÔ¶·IÏ»ËÝ«¬V8Ý®ØF·†¯"m+Í3†À^šÂè˦Ǔrñþ„2$e: +Ž_F#XuÌ|ZUê¤8RM åEr%¢çUŠnÒUƒ@NϬò”ÝÖň4îußôh÷éÂ":·ë™Çé'I~\€K—?º—´ò‘†µè‘»>H½eù$kàF%²Î-,™Äî4ÐË߄aðqOŠF2 •V0à(Ó_¾ó¢xÑDe)Mdі ™Út•÷€´¥×ϘHMŒé(Xk›ã|Ö_xYëÂ{Çt…)1T‰=[€“ô—Y B(œar‚A‘­{lؔ×ýy–’HñI›2ºžÉ˜‰>!¹Ã 6.‚_s\<lðÖoóL俹vÒ[’t¡ °Á/ﲓ¸F4ÅÊà¸%‹ò$ýÊÜéԀ^$½bÃGy½-xùà:Ð&³’ÌBt³Þî†+ÃûTŸyÖÔb# BDu³þüI!)h Ó¬f=¯8j‘ºMWaÇã!…B.¨ÈðàŠûªv§Õ1\]<ƒ@T6ðîŽp,r$dN@‰06÷˜Ah—B]Y]¸tAJáÜJùsêèYã|Àû,—Á¸rä¤ÏÃmçeOAhv¤éKªO-Føž{ácóäc 飂€1†A„daŒ8^…TöC¥V $¸á%¿0¨Å&¢±¢óºË\‘·s«ÅÀ䒴ô©Ì7hwÁÊâ¢ûiP E„ÿď®c@‡}ÄDnêa’%¦ÿHÞà䬊²l¼“pXï!ìkk ÷ëk*kÀ' @¹ßd!³?”Dß!XÂ3j8²× dPI†âÉAN5õÿ^ÌOD¬®¬¸¢õf‚ ‰ˆÈE瀝Ÿ¥ZRƒÒ 6ÜÅ¡JB º¦õ •"øI˜®Š¼®Ð”¯¸ãAC%ÑjÀvT é d'¸AWuÀÃX¶].¥ãâ".ÕM²@!ÿ½GsõVGªÏH‡Î’)dܒB -YûöïmÃI¬™s×Í@·lޑÀzA :Bïq1»vÆ®¼8 –šŠoDâ r³#T.fôå„öa&i‘Ýo>ɯ<ì|x›«$¦œ%©5 ðO÷ôÞ@}*XC"n³UL,d }™ýWBÙ 8ë³.à ¢ V#±ggIBÌ,³lf (urÜ[ž¾`ØTÁµÎã.8w -TšmòXovU–‘J×=Þƌzg–É„„ ùÿš=7¥Íâ- Ã?!tcÁÕÊi$:àÐÔí\)ßêšÞ҇3³}AD×zÂMƒ¹Ór–›àlÍ3ìn_çCfº<ÊnÒÍéqŸRɛq+Ývn€}¢KG¢÷i°quOˆ¶YÛ1Ø!Ójìföâ$eœ¹P¬…™Ç£LHexv mª•ƒµ}c732©‚½,Öp³cÛÍø?†­ywu"›«,\zp‡ÔÖü³ÆQ4Ï$W^&µ©€J5›Q¥)òöåö^­@2ø™>œ ~^Ō4~g‰Xm}„nX uÏÿ&·:K!{ŽF‚yu„-ž0ÎOà]Š~y1]퇾G¿š´aތ;yªÀ®¾Î¼Ùè(0û7‘o ±á…ËÓS@GžÕt劶¦ºƒ6¢ãY08ç6È$“ [È2ƒñ3Q4âvÞ ÂT®<¡áÍ&`ÿ‚Tvº„ ™‚.WÙӎ—ãI«Ë1y3~e­73 (™1SšM`_\k7½YŽ!\—Õ¬Y@Fám‡5§zµEãi`ofкFÓµ]ٛýsál–ªÑL×:lÌa +ÍõU]Ÿº·`v¿Dö7;iÒ r ΎŠv:|¡unšUSXmî=ðµŠÆ¨È¾·ŠÏN6c«ØæR5°ÝØ+Uà÷MŸbôUǝ 쐁íÜàÜ` O3±l}Ì┋;j—]ý9‹K’›cP›0á¤ÏQ5i~®ÑÔÆKb™ä¦LžÒK¹S ­‚«ª‹Y)íÃmg„"¥B¸é!äVâl¾94\ØQ `Æþ•hÊL†a +Lº"ʐB9ٛS*örzËÑcfìþwN£ã%l Šs #šÞh7F'¯_®(”…§>³Efi°ÂWD}¢ñ¯¹xÌò¬7›Û£N…á†M~Y¨Nbjz=þœÖMNÝØ L× D³Iñ¯U¼î¢xwvFÀ‹7$3ØB])¸ÎqÿAÕN*fƒ¸¸‘´¾–g¨ …ÛP¦oTÜ{Äew'¹yS1!S]¬Z‰çlbu änåÕmKœˆ´¥ýšŸ5KƒÈqŠ_v>¦WCÀÂÃbÎÉ¢&[ZҊ šœùéi.p-Ò "³!mK+7X3€èKýÃÃøbª‡Ã;–g[âÄ£aœ +:!ñ¤äeA{k.†Ó3lÙR³vŸ¬´,ÓW¤T²Ñk†”p®g¬MÐ\i?)ØIG4ã"þÑô¤¢Mø¤üÐ." ٙ*±@ºL³v¸ Ù\u1äxÝæc9‹ûÂí)ŸW×؂·bd“þ…ËUÞä;‘žÕ‰8[Œ¡³ÈúªÔ§S •dVV€¨° I4Í;SÚ4¨ÿYo„ræHû²£‘ü¬— º÷™ ÌSŸUHù|æóŒÏøâkˆ'’ôQƒm¬Ù]¼éÍÎÍ$ #ZÊb/ݐéý/v͌B÷œÅÇ֜Lŗ³%Ò,ÍþºVäƒ*èqæ(ǹ¢ëo–Mò©U4qhÌ̼&ð»M°†”µÛ쑉)Þ EîÇ[Qø«"}³r‰±4«?3M‡ Í^>2¯ùm†Ko¯ÜÌZO®óâs_7•ó*3rcD zVo >®ß.#®B¹_6«ãÚÀ¯ Þ%aêñ/«è–zö² ++SÏåeýñW•ÕÜ+ÈÍe Aiâ¼NÿÑèÂE‰GÍ£µ¬ýCÊa>ËJ‰*½¬œîÇ2›æ¸Ÿ ;ÙÁ]YŸ9D{¤ZV ÉQBû+x[îÒQ²Úñã+m‰ÀDÇIæÁÀãÅýÉl#…Ó“½92œi/æsØ·ðl'»ð;GNö¥rQèÄ؋ÁOdÆ»õ%så›JzMܒÙGÖøJfɊR²_Œº¡o{ÅópœŒÒŠ 2íÈh˜«t#«OÕ,`Öá< ùSBß .$dÊ¡²˜^Ƙ¬ö@îËä*6æ"Ö|¬ÔtÔü¥{¬½$X‡ágC±€J~ +’ß´|LÇ<՞c~N™ÃÖÃKf2¾´Ý˜Ï>É«kÊ&fšðµ°£/™˜+Ոá-öàŸáU˜ðXú»Þ.̀,R‹Uøè©qÙKô’ªšVÝ\fyŠë€ˆE*êÉ9sâ!‹] ÉXN„‰MˆMÇX¹óÊi°s›¬æíu”ˆ·Øßg}k±ƒ> 2Øûø,8Ž"1?C ó¤1%Kí4ÕX¬R€V i”ë–Â6K:Òӊ©J)æicÝÂØÐKB19åó°NeüÅÎ&x•‰î“.†„°ÄtØó ˆ™Ä.ŽÅEª°ñzÄ ÕNÄp××}ˆí— }!ö´ž§ƒ½Ü•báæ’‚FàÁ°·ÉD¦¦¬°ˆ8È?Za\”=+À÷ëðœc@\BÇF ”Ìm'ø$œ_˜QúÜÁÜ4 cCoíÝ+NÒ:!‹»7”ՓÀÞ7ô¥"gȆ`°÷Ƭ ¦$‹æ ¼à$£Ã«†ÁxC×x"ƒ~[PvO؛¬bVôGØE g{v̱¯3(W;yC1`–³3;¢`› ìñgQý¯aH}¯8µõÔGM§~<[¡Îw|’É47 Û5X-lËHžã‹Ñ€eÔcÓ4°ß_Íγ٘‚A^¬‡X©h=­*°û¹ž·^‡`¬áQ w`ŶÐrã)Þ_`”`6³Sý¢«ø’kk¥Ny»Î,2]€´F"Чcâûêú=Õ|åþö_E~¹Œ¼œ4Ï_åa4?¨®2;R…!c׏+R^8÷:é6 +vP—ð«¥ëñ^ÎhU÷Õ>Û×ú‰°ìæn-4Yؽ—ª§ ·îŽVØ~"VÆtÁ +ê•ñ‹/ÒT;$6N/ Ñ ÁàË{â—ÿ2÷2•Â·2T¾—˜(õÚËT!š»þõøóð¿Çìåè“”¬ëg—Yðm”~´Œ:"DW}N\rLff N/[‘Üb¿r%z½ôòH}Æ£—Y‰Þ½±2³ÊÐËvk‡¨¨žBûÖ8!óêFà.¯òC²ª¼\]£h]o·U´µÝ^ N[OŸƒîð²Ü¨PM^Î&§KùªkDË£pK0Ž¤í»Fsï‚{9ï"ÅÞ]á © 5Áܵ¨ÓqW}¼B­æ +KpT†¦8DÅýĈ®*)»$äwü +‡€tȶ4œ_/2'ωî8uqÔYø¨Ë´fnò‹Wιýt»t9¶¹J1ª|tYÊìæcc•¥lð×Òs]M W£À-.ƒés®X×c­ÊÕ\6hE¹åú!œ˜MÁE±Cßü'W¹Öxi2 9ãZ9#  Å>ìô\T\ÞT×)L\—wËôÏeC'.ޘºU#5Z¸<’$\Ü/8q9cþÍrƟ‘I²mÑ5ÑqÔ½çÙÖ<1ÕvÔ;S%@&µº™‰äŽ|ߊFÜ ‚ 0$’w÷¦M±y¡š0ˆ‡†CÚ0FÊÁÏÆGq@_PeŠì/Š(Yb:>+®L +y·Š5‚v”üXæâ䑁?î(üýzÀÁ{Ñ ¦^ÓÀÔm0óÙL? Ü#3 ̄™æc.‘!""ï9ضn ö̯sãÂ÷Áí;³Å;'ñ æÀÈ&ýž Ã&ØvCMXL¬š!)"g†T;¤Ì ©%)“Õ~ßûÁԓøc·SRUáń'&|ÕÌh¾ú‚žðäb÷ªß„Ý…loŽÞÀÜ/€Þ &ÄBÕBÍ®*…ª°P³³ã »»;qv×p'â}J܇H2  gÅTD$@N +E$HE8éAÛΐ^­WW~äÆtpj7™  á7=ùwúÇÑPÚuÐȀDE<†’‹ú]¢UZ~‘š5´mûЛiåCjÓ°^M%Úå—ùÚAD:•ÿùfrÇØÞÌ¡³²Ž;òí7z°2¢÷=T¬;½BÉ©$&f\&öÌç}Yé(„Ž AätQd1R%6J¯{+¨ +dŒ +-Óí@†˜Å¹‘Z@ý?9³ +óÜçü… ájšD +_‚,aF¨&ÔÍåý;¬MË¡Æ)›lAmÄÇfæ·é&±Œ¹±gÙ.^c†CtׅyÍÙ>‹ Jævãk¬Î>œox˜=wºólÖ\ʦñ#³Ã~ ¤þ¨Äü>SPÀ²¨@ŠEòšM)6 +f40BRrP"Kæq¥bŒ1t$ØIH´D€!‰M“t‡óøÏ!‘ZâöQ+mœ8¢N}*½öô«Áü9ôg†–õWú[m®þj§åAÒêS¹@S(„™êëIHC{‰á·¡å)(”I«K`›éút.]AË*Mé\ë€ÐÉöäR])”‡÷8-‰€B‡ºrTwÖf4Uזä^W€Ö󶍀³XéݜÎü¼#]Ϧ8¯´%n‰¦>»ð ]1ÜudyZ¿,p“ +®Ñ÷êÿNc,N¿ë‘ͬØÔÀ¥yXêÂԄÙçD¥wŽü4/鵗cý¡Póºƒ=Îs-΄@gŽðÁpànå{CÌÏ µÄ9xÀ>£#Ëݱt 4Ozë*ÎÝY +WÍٝ¥E;.²‘h¾îb ¯»ç&w›i, «†Ý¡•Ä:ÒÁ[Ë&y|9pÏð³ƒ=ÈI‡Ç|ax#_ ”ÁO_$g!Ÿ¨XâP6Û7²±ÙQ¬º á$ÿ¹ÕS¯a3"ƒË›Ìbꗏç`.«ü:ÛEŒ…IJûhõwåÅ?\â?!\ÿòl¤…wrÀå$çïÄ,ã‘*âÛ(Öã÷gs 9݋pÊ Ã,é–竤Õ±ï=?cÃð÷tr’þcd"p"½¨štëQôºV>a(¨ˆ0&9‡Øo’eÈê 'Z@M–ô$ ¦J»bŽèÍ8Ÿ?_ÎùÔ ¶2hùò2Ë"ÎØÆ;äÏ!ìéP[ÊܗQû­4<– ‘~΀çc@ðMž@á„`=´=&›EAö°4Þ:'“i/žˆ;“õl= óŸ‚&ãÌ) +$F* ’Hóu£¤R!‹ÐnÆl­Ã46ûàL}ú˜xå«5Ž{8dàˆhŽH*”Œ1ä"ÿxM·¡¡a-`¾Èdz•­Jgš X°l³8Ðz¤p‹zâL?³&‘^“æLYæПåýB‚ã›cW’µkÒÓØרGóE_ûzÏBp1GdšÃER¦ ƒàYØð'1Ž]÷ÔâhŽ6ýՊÀ´Z­¯`c“äüþÁöí•¡°‰—:»©mü…¹#=òÿ‹,ˆ¥âfég‚©:M »°[¥DN”†똫_!ht¿ÍðDÇö÷‹*@_…ˆˆÙª/[:jlW¤A[ƒ^Ùɚ=ח…Á¥•JIhœ›ÏïMç~±v$±–ù ÷^ãųú´< mcx¿a"ûpƒñŠìýúXu‘÷Y9µþÄÐ ©@ƒÇžPT‰Àý!º@ySþu õìJP àŸL/1ø—ßD–Ü× }šl ¸Sô;H#ÇÐ!>ÊØ6ÃgîÖpD]­@¾ žF¨—Odp’ÅþµŒÅ9Óù7š:u֒Ïõ˜@6¦m:ɗgqüçÕH~Åtžh8ïí$O¡¯SS-©‚ú›½…‘Ë/ܟ0 ÈAæø³`(Ó*}J0W´öè´g¥¦–²>Öf‡6Ž]¨sjÞ¸¹„PVQ<"OҐº³ðs+´k†îm1‰$z“=T{²¥éH¢O°¥1…õqMy¨ép‚ÐÊv˜ ñV¸-3.ÇämÝòüÑ).¦ßUcVúFN|“mÀ«3ŽkŽš\ãÈ158æê +¹©¿â(–=crèˆØw¹B !u{ëp»nX3eoüIø,]tîFsW†„ɧµV÷˜¸ƒ™ªªHQðAâjã'­´}r¦‰6=]Ö®TC‘ìñ;BÞ¨ýò2ÏVßo›f‰ïs"|¼0µ<(\$Þô6QçÖ g C®´ŒqLÐyT{á2,Bž]Øãß`€–TQÿf¢ÉšÖŒ `¿_0÷4–t͈F´Á$›mè¹Üqìðà¨rû°ü~&Ü -h¤Lpe<|‰ +þ¢šzÙÀ=ƒ,ǍXq šDÐбTù‘:ˆÿœå©†íÌ]Õ}›a9B"hm%í#¶ó³¨[G–¹¦fs·Ø¼©ˆS$²I¹Bã8…tbXFOZ~kæãe¢•n>Ë`‰i§‡†´ÉÄ!t¼×J8¼2¨ï`u‰7nq-ŠE7 ’æWßq.¡¶ÎO—–­Ù؏Q„¡›–ýpF‚*Ç\Úë):· =ˆ®=”& ©æ¥“ÅbÚ Üv#ç¡l¤³ à¾8ÐȈºy®V§…¼F»4rZ¿ŠÎm³0P@H ¼"6Õ1hvf.9]2‚äâ&O_&Ñ<¥ä¦ @´ß_˜I;I—놞›´ÜÓX %ÚÉ ]ežvâ„6 ò0J8k6ÉÕö@<&}¨;ã÷÷üܸˆœ†d°Z>+G'¸Òñx•ì:Òí&‡Owm­Ÿû=‰¥òý…[P”ÂYãÓgõö?1›5}qè‡_¦o¿ ¨`¸!À@Tˆ\åyÑe<»÷¡-éÚ*¦ÉW\oZ¶ öy·Ýcæ%‡Œ•X@¬ãž’'ôOs-D›fIċ…¼ú?ƒàf-¢ÞGÁºÈh«}Ti ƒ|çTý‡Pé¢mùËupë?v‹÷‹-£ñìb BÌòæ7}¿‡ƒÛ<2ëøötÈ«~£×WʀPÒՊ1—šaJ@íK1:‚+^@Áô¼1lvšˆº4lOM6“L£KúG[č?Aûˆ:öҋ=šð“‡ybã`·'ƒÅfºƒjG9}‡Ôô)j”ârE­ ÿ_Í~œFEä]B*±_WI¯n¼oñ ¤Oâ(é ´s4¨tñ‰Ð|‰òŠX¼Mrƒè dŠã®nÔ=t.;Ý浪‡  î O÷9“‚ëîÔ±‚»òIÌÂ?šÑ’ƒ¹à¹Ñ‰7{)ÝÞĞnèä(æR‡Ð¸a3Ìze„]`\%ÄB¾40 7ËÏð©5¢-س(LÏLpßøëUðNÏçl™v óƒ‡µ&1³¥<º¼0Ý.L’Œ­Òýðò¾£*:?¼òNû˜Wó8äx G‡¶Ã°ãcX`­ ŠálxMXq¥)¢6I6×­‹ ^h‚X°æ0í~3’XâW—5Sر1üb.àEÙj¹Õ8V’£w¸Cž76úuÇ`Š9ÿ¬äÙրÛDr~ÈñuÏ(VTwT¢fôA ††M Ð!E^[K›t@ÃÅUÜ'mvPR2íå›hRñ|Þ³á{ÍÈà±âî‡Jô_ûx¾¸&ÄÅ'!Íûzx*¶¸t؆L +Ó_qvÆ1Ž+¶9>ã0Ë~Àǁk"Z4Y£ŸÜ] ×¹™]u)& +cÆí˜{¿‰dHr{§é){*çE­1÷2–tk=ž#ìQK ¬±…æê¸Fjå§õs£ ¸Û„ûîÙ8ŽS[è!4ø|HŠ[]<>û݌çhr 59Yà;y†?n·?•P<’õ’Qã†Rˆn—µß +„È5¼xòµ.ƒ 9£õ=š|ÀA)”ä؆þŒìPXZ45 +ÂUu¸¢ÀP„fž›ñµ¡Ž3Ûäkqùy´ŽÊ½‰ ;F\|['%ʧQµŽ1å?LHŽÎºÎÑݎ¨üm8jSù6I)™„¿@"Sٛ æ 2¶„‚IÚn—0åt¢ÒS:«IÓÐã3â9û:­ƒµ»3A¤·8æ܈_‹j¯×7`RYCºitÁH§ŠÈ¯kØy±vìW•ØŽVŦb'.Cje‹—!×ÿûí›%dìR¤ȃpBý—ù—d÷ñ—^Í÷3SQ#’¥„ü/qˆ‰Sї^¬ü^Jjb çŽsq„1$Q‰f‡Ý±æ“Ó-¸9}ˆç‘¤&ð×@ïô|>q89“–ÉÑ8µŸòfr˜/½éPaZ0d +ܔ”%ÎHP¨q—QB¼óGVL´›7M šBD lÜÞ¤t5Ô°Ü£nûlÕ9«Q0 ˜SZ¯(2Ù œ†=½s«Ü 9|P{tìQ¢º¹k#¿•QëOq¾vxÊE•¦A¾`†Ê-âÉ{ðspmË=ŽUÓµ¡Õ €ºö¢”8¨?¦FΠ }tXÈ ÀK·@» K7®à+¨4|qÑà® 5 ý>ÔCŒeXs}’†¦šÃsÓÕ,×G”’Çÿ'¶E¡/)84ÐBy)-H´¢±~¦mêóXÃ|yøÌ&eú½øÄ$úy¼bl«~¹$7ê)½š;3Z´¹ñA¥×}'ZgJR•½1éÉSãÙ£ïk¯¥M¥uRžiz}Žã—*ž’“ç>àø +J{J;%±^± ÀVߌ#âö+»°W™ÖÆW‡PÓÃE?OnìÔ%ݑ-,À2Ƌ EÑóþÈÆ̍:öžßr wÑ~'ÂG«·u”22GÖñƔrÄnÊĖ¡%3­×µv:l‹t®² ?vÛꑧƒ³ÀÒ$&ÊÇòÔi±ËS Ӌ_Áy( +ŽV…­‚ÑQaê>³JRþH¶k?Tù”qmÐèJ ‘]G7jÖB 1§NލXRüí ËÁ#ý–ïñâÌöp“7餱æ7kM`$„ qÇp®N’ ·Bԟ߮h@2ÐV~ „ù͈ê*lâ¹g# +°ï'¥µšÆKÀ½X^¹ž©§`Œ·ƒÑðG¶”deÂp݊ jˆ5:Š ¢ÌŸ­O+\^uΑðšíË'æìN~àg¿Oàô.öpœ@NC—ëU'°JPŒR‡]”8¡PR¢¥}ÏãLß`³²Ę̈ª÷ ÎkÄæOë¢sÏŽ£…Ëž!ڌ?´dÌ'4݉+.*Û1™+{<»IjÆIs՗Òj·L}¤¦[bÜ\{U9´5Š#Xâ4 â3ÓO˜.=8ÏÓ×ÐâËH.j@ßQ-À¸ý=©'ähŽ6ˆJar}$Ç7…FðB¿T °N~|ô¡³¾>·>qÏü  ,Háý 4%'d¯"‰ @!Óýï¨<‰€…Ý#ÂËvXò ¥cœ[‘žhGàB,³ç˜'Sê3å.ô'ɑnÙEu¤šiæÐrï\÷îÙ51ÿ‡ú³v™ß1Ëϝ¯­ç*  4¸w0éw +"3°èñÂz²8&;¢*ç7dº•šƒÇ2û`¯°ÙãX|úØX cÿøA=ýÁÙXÄÞç+›jÜ+ý‚ƒó ācé§g¢ …ÛRUZ8–trØ y,˜( ˆðD—,æ?‡åÑYÀ›š'؉—[HL@2lX +; +/ÀƓhÀýº6‘b©aCºH(R øå;RÙ­¾‚9҉iîBânÝ Ÿ¯%Lº^†…£™'®«êg9Â<+ÁË¿’‡³!¤0D¬¿©|Üh?¹ö&$dÓ;nLÙB]±Þ!&„ gh4’µæ8fQÇ6Pok!wæÀ5Ö2úæÁoP¾rƒUj ә r¯—‡ O¹·2”‡½¶‘Ó0<žÄ¦ÈÙ( xê•ZN槦«S­‹—qmuL´ãϘµár•h;vûÉÝF,³ü6*(%µ·ìŒySf°‰"ÅÐþŽØÄ_»±è1B‡a9ôFo6‘цt­Ã“†5ܱ›ýÍ’YR Èát<]Ò2"~Ô°I½.”P¤TÜ"“ß´N+Z¥§ª³.þ̂žýQ ,ÄǸ)B­ðe-K]›`§ @˜íšúØÏ˕‹¯ø¯O_˜ÉÉ;鎺9€ždº`>liæû?2‡ +‡)¬•Zƒef2gCøҗtâÐwlj8~œE„4§D©x– +@”D\…àìuÓaqÛRB©a%„~¹ü„Ô™z.%Ú >‘úF8Ą™ h6eï6µ’4µ“4yºdr‰[eA\†ˆˆ¥´¡27®NïÎÃ}CŽ·{øՓ·÷â´ùÅyœÙOpv[Í#b]È‘ÊO˜:û% €P)N÷Mã„F«Ú+uˆ¥¨7#04cuË@ïÒ,Šç†¹Øè Ê8ɲHö7}iÑR/ǜST"µáO¸µnÙ÷Ÿqš°¾§®T +™®é®Á$‹¢¼cv\q Óäâ\~e|¢ËÇFšÈ“3añ>?z3n&³ ¤­ç.°Iès¤æz0\nð&8ýõãdM‰BÖª5 Ú­¼èEìJ3H¶Ô"ëӢƷḩ7ç‘ó—Eó\Ñ×Õ%ý¡MT)\†‚Î'hf‘‰©&9¨7vÑü!ž~³Ìêà…x‚Hó©)-UÑQh6e$Š‚˜KôTbåY-¨\/JÊø<.VԊ?vA •;¥ëî"§/dzÓ|*'ê«J bc4âZ‹$jN¶£lˆÆxKf¢b.DéÃñú ‡äë¾¢3 ³lñNq¤`ŽgÄM¸`—{ñãªvÝkÀÁ«“И¿™^ƒ7Œ/u“Ðs†ô—”6†8<1’ã\ó˜1Y£\©vUàv÷^B2¨Á”ô-µ˜gö }\9ªÜ1º 1ÉhOÚÖF*=Êú²MŸ–'ñæ|±£rKgÊä³S‚BâX¤nÔÈ"+–’¡Ž•:e¤Ú ì[‹nÜÀ¢†â-@œÁ 8j|Ýhƒ¤Ú… +7Xç¹t{û“!€zÓ¿+Ée¹u ¢ùÀsß!lJ €Pí ”ö=—y,™¬£ ©©Ç“µ#ßë¾ô‹æé!yÊ:H“N ¯ÌÖäVa‚(ëaËÿ}¬ú<¤úGˆåw3oˆ7>È Ü| +%*"®§•þW!µ€ 1}¸„(+Ñ@f?b3tqëœä}ãV)Ôѳ/énUrm*v!õWqá_$•Ü0d}ñÀ„–*D'd㧠+“ú pAMSh+¡”;¢§†¥l>!øÏܦâh3ã¸'š};؉Ëi€LL™Öé+ää^šåÎ+TæD·©‘„2—썟L!C­ptÄÁ´½ A4ª¦}!Ÿ ˜¬ *çqXÔCŽwé«\¹[Ω«…„F MÑmƒ=i”p®qüg´Ëtùã¼ôX,Çé$'ò’6¦+”c“š©Š3™û0Ue¾ò‹!Qf*·=zAy{§ªÓË Ëÿ2Û~ÍJ³¹×Ə$Í@s°£J­:>GV½ñ<£æ%E-¬jô˜÷N?2äñákAÔ¼$ªŠþ:1¢µÑ ÞŸ•ÑPÖ÷(Fm(b˜Í§2Ø=˞ÄvS7ÿºW–ÒsþfÆ5žkžüpSbbK’€T¸Ò뉵f˜«†)Ù|ú[1 :@mhϘÍu5ˆ3nć¬xêÄâϳmðõHïR¥‰ûqWÿ…~^‰¯aegs3𦗅ÃÐÊúèûq5)CR;×AüBçpd¡'¹dGÔBÎk×(7¿^Qõð¤n†‰…‚Ó/%LŸ1$£D£o¶à‚¼¦Åü‡Mï ÄAÉK†ÀÓã¬ß)tÑ1Ä'.„ܺ*Œ^Sckߟ—bg[w˜S‰}r +wjÜnuùèæ, Èi*ƒ.ºhÆ¡d¤®#@18¦i=4Èl?ÊÞ”—Ï?V`Gy¡æeH;‡"w_C”¦ ªï"ýŒ4¢ñó[¼ÃÆ0ÄW6+lª O¨Óe5䂜?‚Ñ¡§ÂÊäVK:gú(<àÝ«JQ…ãhôBÙG©d +š²»„fqë!“=)°Sõûw|5³Oˆl„oÁ%òVXNÂõ.‰òc¼r)Nô¶bá9ætJ¯º×Aþ íYã]Ɵð™pí³?Á+&"þd’#@wÂË'óæt¶Nâ“UyØÀ]^fÝ©Õ’g¡áÁøðB"¿fIUbxkG€9­©¬Þ¨i…”߸¤¨“Ÿòb€' y!0Ü/KˆŽ`©iÉÈJ%7 ÍÓeàN„Óæ13"õ}U¼”Ñ8mYµ~Y͕Ξ‚˜$¤ò©xklü`˜„çÕ¡¥U\ÙÈ%x¶£’&"Ã’¢8æ=ìJ7êÿÆò¤*Hg(b$hpœ®Mjƒa’L ³ÚPš5ãû;ג×tꐕ»¶à%k³…O8ãC24ü4µMB¦QHS :­sVºzÆ>/©sڐ>ÀKQÝ°^3“4Ù×ew·®aR¼ʈ¹b£À’œŠµ‰¢aFmäo¾K?£_8©Çl[8> : +¶QùkŠd#Uúø‘Õ~,ʝ¨¸š Mß!›ô°R7֩ϙ"øg·f +e4b†Ð)FgFfÄgÞXk}²O7Ò J4V×.Ãô{†¶ØÓ"ÞÈîT‰°“N-£²6Gq)TO`_«7®©1NØS—×|Åéã Î//2¶Œ3zø:mˆùKæru’-oý÷º¤,7@C_Ý*8º¤ËEMEÕÿŠ²‚Ðæ†''_v¶¨-­,Zà.È&>—¨ಔM ÍÐ÷a,Ð?ùâŒáûÖ†¹i¿¶ÂÍ; +1ґ*$ÔËqWýU&ÞÎô0œâ’!áî½8Í}š;;çýòì…Rñ̹"ꛝƒð",2EíRú_& ˆ ™—þäöŒœ[ç*<ÑJw_¦£ ÆϼhÑÑNtCÒ°Ü#ðL¶X5*Ô=èÏ#wN' +š\»Mõ)î•/Uª,°5Mw9‘Þ÷¨AUο@CÝ䕀¬ ° –†Q ÇðE…Ñ'FC.2kÑ.ŒËv +ZxPžŽ­Ý’ÀGf,¬MÉf÷÷aðÆr•Ûh7ÑL؄Ä?ÂZP]cÄ¢Lʳá ïœ`*þf¤ÍCºd½O³`OI)x#9tBº¥ ŸGŽ+äÀ ¿—ƒ\Ô Mˆ;RäÏEz¨2Q¯Ë‹”K@?"¶ø®w/¡žˆ™$µðDsµ59Sü‡È<ÖPÉ´‘hke3#ÃSC¦H¢*øð„³Fّ˜ˆªò‰„£W™Êµ2V8Åõ7ÛæXç¥£5ø%%!²ˆÎÏ&òÄ<8d{0@a5cG¶²ìTV²“x4Iæ‹\«ÿ›B'ôt¼¦ Çd†Oj G­Ä“:{ȵ×Éßf_ïÅ;MñIÇp(‘-Qcn‰ Sx¯ŒÃæx°Xsl#a5I€A"±þŒíESHâ:ÜC¯¤ùï[‚’—Gý¾ô#+B,ÃIæŸ Bá)ÿ(Ûñ=F{¸ ð/¹å OŠEÃFËõ5*­âpánrò±hš88³Irµµœý[öPâ²?Å))ò0ªµÄäG)¯e«ƒyL6/D„6Gš§ùm<"àŸPÅó6Êå Ä ×¾O@.‚ÐdOIoµr®îô2šoY!ô#(í3³÷u0/Pv&ÊÍÒ¡Ù ³~ +L< ‡.Ö8—ŠWº$ö| oÁ< îk†G^?VKÒ$á +˜N9NÄhT'›,Yü°0üïI- ؉x̪B÷¨ýµMâë +Uui59ß+QêÁÌ_aé ÕĿ΀†}é˜H}÷•™’™š=ðoßABþ¹•îîr½šC<#n´‚Á²ô9P÷ÏÍ ø̐÷K‘¦úݜtCŽzÕ ldR!I­FpñäûMªÙú*³rÄ~ U| ¯"ËVp¡vúªõ©Rë/ÿLÓoН €UÀ]Œ¤/z˜ØÃLóý +Èåû\¸•ûaâ®èyQ=5,¨`1E”ËšUVc¹I85²ËÀlBß`aP g‰ä¸;Fµq… *P]‡¤\6WH™Ìc«Xrtšwy/Tu=mÒÎKfB'1ÕVXxÆÊÁÑ hók`®Š×SæO»ï¼ q-\:„Š*œŒhsÔ¥çN%r†a¡4'Màl‚±¶!³CëÓ»¦YˆaDÕYDÊç"DÒÚñÿYi3j +yê,4Y:.>žþfÊpÎó5_„çl¥èŠ98ŽBüê„Úô:PíY å3éN$Ö$Æqr¬°&.rþÙ¦%\ &XŒÝø7ï‘Û]T\,"úº—u8X×H%t +Gí¢‘xîq(—ŠV+Ä:66HNÊ`3;6¶Èg®±ú³0q¬5G³Ý^1÷… çØ  Ë*=u4Ç5÷‚hõH%¦õ/¸qº'|ù)•6­âRäåeÕ ÇÄpiF˜øëÊSš¦ÔħòØÞ„ù»mL½ ˜Œ|–Ùóy£Í<ØC’À[u“Ñœw ñà]é®1HïƒA΋š¦öӟnʳ¡‚ƒQ{_Ѥ¯¢›Ë+ÍþÑ;¡ìSi‚8#¾X ì+[b—g•ÜßXjzs5SH.[ê ¢IJ뻉þÅPŸÓrQFÓ§‹9äç÷.4!’æø=¥«JY’[³É¼‚¿<~ç:»URëVÎL¿£É0£ .É8ÔÜ;gɃ¿&¢€:0îҍÆ<ÒMŽúV(¬=mIöiWGX,½ˆ:®m,­YÁuBI%vLúÈ.ñ+n¯…]Â.¼gw¿c˜° 71ôàㆾª·ô14ƒ£FÜ ›$3i•B<¿4ýu9k‚pSéìI·íÆÁ¹˜¹(eR3’s6ž4"H&Ð À‹®¢2¿ÛyzÏ:F+º3ÞΟ¡µGŠ9ŽÖm‚†‰Fµï)×éBW;²¢/LDÑCä±î¹0X~èîp/äŸ Y¯…±'7Êó`kC¥ªä4vˆZÁ£…ü§t—"â:DùŠuáG°‚ÀdgÆ°’Qcà=%1с§Ó}—°e ¡»‰À´³ØÄd=¾`£ 3BP”0×Ö@·ðIÃ! ÁL°ï7CvT¾§€¶i)#ed)*–3Ô´8)m©æ/s?é À³Ö‚ðýèƒÁ´§R‘ê^oÌ ¶ðì¬ÞæÏ¥sÀØjCOý¦}ƽŽ¡#g‚î:û¦ˆw­éà×(ɇf®¾áT +½j§ôíʓ—˜âÜ¡6v£ bà°Ô,ÿçI·‰¸oqÎÇ°àžQÖðÑ*V±šï“Y$,/"ì^1b/êdD6뀩bÙ¦$~adêJYÛV…œüF{!ÌÄ&ϓ¨äs;xý}ètNK(Ã%ñ„Cќ/‘‰XªV*tmfE¿tŽ˜×Ô“Aÿ Ï:ýá³è:Ýú€‹ì‰VV‘Ö:Hnb–Ér¤°:e˜ "–¨·A$åλéÊ Ç#E‘Åa²…žïCK+qjtDTŸŠm¬Ú0ÚYD‡¾*êfyL {cÌËSªL{¬ø¥£ÏrÌú=¥~Ä(—ðJ¸d™OO\3Nð¤7Íi³ÌùC¢iÑ݁ ¦+)'‹°ŽUœü|¶iÑDúBž>/Éé„îú?f¨[Õ£ì­ +ÓÔ4”B^à£K³‰m¼רþŸY\`•‰¬&¤ŽqZžÊ›/l鰑ú­õ±,‡(Á“öµÖê^uy®ákVà“ýEÚúfȈó§äŽ#¤9ùMp F–šå‡ÇÃÒ%æìuΩÄÌÖ¬3+Sâü¤üÅåö ©‰4‹‚C_­àB ‹iDx¯@ABEÙè@ÅðhÇÀüëYC’‚TÊ4UKÙ÷€²„Ç(àŒÐ)ÿ¦•4Œ*:8pI¬µÌ„€Uý`¶¸-Û@¥ª<½ÀÉ#v䧠 geӒÛ-ÍʗD`õ?s5枸:í,®½zt5éj‹&ñIáð¬w}êRíÞY2€ +'à²É”rš0„ÄRI°Sǘ‘Ê£IƳ‚ë°q–¨deˆ{ã‘*QQa‘“¦ú"ñ ã®($¾hvñìÞxœoÅ;|Ç^,ƒx¦ÎhÅ4£\–Ñ©ç|Ðü;‚­$ü•¢¸qo„E +F¢y-fìÌæzú0!ÁK¾·²¨Ø*õs·Ý8ÖìZ†tÅ]óøvN˸j—›W— àdå±8Ù +(]ÿRÉÏw䆹|×Ë]k<‚Ù´}ˆ«(֎ûR&[Ù¦…2bjåÖØn寮HäLûòA‰Ô ãÄV¢R°·¸½ãéû]˜4\u´UrÇ:‚ôip§r@kÇòå· ܇J– +ã»BÊýŒÖUÿ–ãèIþÑ¡î=HF#‚Ðe94aŒ˜³rfv·uÊÕeùµ²P+ôÀ™“–¸…ióKÒÔº™Háq5ÕDgGd§ªÑê¨ÌOh ‡ø~ zH¦I®ó#|à_H§IȁŽÃ/! f'*(žßFñÁ!_ÅÞþè<þ„0H…½KÒ¬øLyh׎ äbPY܀#À+9Z•,ÉyÌ ›g{Ik¯¡“0>#†FU‰§rVGú4.ËË‚VðþÀNud’òhn´¯Èςtìæ8ûö*÷Z¥}Í75TÊ´– Ec®vr|ª +)p….mÝكIóÉ°ï© ‚òù€BBi·TŒ]o +ñ5£‰’|&šRÆpõˆ¾rçšââƖÆîâh…ú@¹FóZA_Ôh–$:G$SÑ%@µS9ž/ZFŸøX&A ‰Þ++ /BHµ{©Œ…K TJn•$û+ºÈöǛì_"FÕ£ŸÈc_Ä@\¢Ä"â5KÄ®Á’( +ë–èXÀ´ç^pgJEÜAZñ-”ðÏb¯LŒ qnLü±úl[áÂ橼^ÛðÛ%î ®[<„ˆÍ7ZË\­ÉZ–ákº‘ Å:Xí„×PMˆE¼Òy´ÁLòÓcžgƒCñç¢W„6üÜ­¾ú8<;ØbŸ ?ú.ýLŒ@¢Ã/‘” +߯ÚÕ¢ ÏLÁMp¼ïžX_:‰µ×´Ø»U¤mGä hª“yŒ¿D/(9‰ A>1Œ.6cý¡W#|+ëwxÜ#JkÊ@ÆÎWLPM<‘Áòm.é-ÐGØ-•m2ÚûLÈnim¬aeÔƉgÊHÀÔL{yçڝìÊ2[p1§.VúFS#‰zÿۉ} L,ø¨ßè6Úè0ÃH"ƒ„óA‘Ð:çTëoš×Ú*‘X˜¾tî—A_+’8ï„ r¥vDõHëyŠ„It¿P ‰Ÿí“ýl6oa(,;Ni`ê,¶¢ RTf%zdZéÞP#Ôí;Ç>û±þ#ÛT½}¤CàAÂBdíkßs0ËÖg‰É«A˜p_‘ßpð~»—?rb1.ŒE S¾£ê=*ð .[¤‚ð¦Ìîb>Ä ­8äáÛ(-ø¹hÇ +ž Éh7ôýÔá-ߕ)  y`L MȞ ¦B¾ñžØšV«”Ò6wÐå?\ƒ +|±,Ôg„ 4{›mP-ȼ8,ø}›¾Êž•™ä i/Ջ0A¿c¨zÁÃ_î± ý#É@"Xd>>–KÎÂI‘·D̵;˜ö-KCÚBÖD÷ µÜvt‚^ +[ûÐR›ìf×Q|µ÷qO{ Õ +,(jðp*çJ»Ã¦?±† +[&|b=™!lÈéKÜ @aÔ9rdšróÉl¬n Ø#k‡âYÈÇuMÜú"_Mé7RÀ&P“ „Ž¥K$á>›ÿN‚+5°í—ˆ!@ÃI-j¶ptœ¾Lj½× I˜yü2ÌÄiGývçd£[4¨I”’dÄ|ÊYð kn2³D©º%È•Ï†c"Šx¾ò‡€ò@J[z¬QŠ˜jYïU9ƄñCA“S̍%*tҏã ³çŽ ˆŒi±zäö™ií­Šž‚±åʔøÈèXª ´#_ëÀŽ .;ò¤ªÞˆ$8¢ ¥z¹ ™…Xó®¿^k†wÏ!‰¿3Z7U~c† QÒÞJw +[¹ëá.䄺 +fŠ_®cP7 [Þ÷B‰^¢A™W¸V,¨’,xw8J\Ö±X*›üWëݽ`F”"8/Aksÿ_wò#¥Ôzž,‰±tâ«Àh t‡ÏMX.¬þ¿[VAâcè(šòx[êR4ë#E³”\üµD)z:ÁÄ Ò-¦«`“ +ó pñD4;:ë ~aÆu½‹®ƒ×³˜¸¨m!šjçç„\¹FE>ƒ°%”åLËPENöhšâ óÍuùá4ê3áHaáÊ ÜïªGQf”Ø5åÓ¾°…óc¦Ùou7ï +ÇôÅ{*¯¶¾ruš‡¢ä[Õ̡ЏYð$¤x€S¥S–#¾÷˜™Czë"5£~³À¹@3?ÜÍð8âêÐIÌ¿26é +eSr>{Ü$¯‡Œü.¾8whúªYrV…7µ¥|e‡Š245:…&¶ #Y^ømú׌vYf îPâE–Ù,GÞöÿÿ YìΨ§œö-J²eÑåég¬-\¡u–òßÔöSd@çsB¢­]²:4V´±‰0­Ò¡xy­ - Ql/êßÆ~fx³™þꇏQgfÕÑ +©Y€êÌ¿G~óäÄéåqÒÎÔQvÖDeh©™c&ö¶Zf£|nJ&e ÍÆe3½Û䞉O;ËNFo¡Ò6Sê•HãHæL’›pK±S¥”ºœµë4猇EmGPò?fw΀ÐçzüB „úl^eÈþqÞêñx§X› y~ÛÊôôÌTé*ìOæÙ±”ÊIO­úFâ3ƒR]u ‹ÈV£caÄxcÁ²È´º™X¿hcÃyâø%c˜‘zõ¸m¸+&jȒ¾7™s²Í?†±è“oÃ3RÃdÉâ€á܊L®ß`ë¯Ît`ÿ"Ýnzÿ9¯Ä„3XuÌ@^kÐó®}v¬ù6Å!}¼èEË÷’i+Î=Fk©ÅE@ØÝH+ËÄÝX߈¥§x"ؕü+MRÖRLK’Þãk½jQ^ÑÇ0 ÇWF­I”xBi’&R¢È´|óÒW²±gŸÁ ¿{ÉOD @yŸ âfàåjº®UÑ›˜z?ZMÝ_ä㌃¦…£i/g0Ãì¥Ë x½0uԅžqX€øfâþ4FÙ÷=tÅà~ +kz²í²÷eù×1JÎ&  Œ9ýC›4ù¡çÔ3Dì«àùlDlÖ±i4”{-`Àö|úïËÙáH˜¢ŒÀÎâÏKûpÏÄ ‡ôµœÅ9%þ§I2{«y©Ôpjoɕb`MÆ£X–Ppÿñ6H¼ÞVÔÕB¨ùý)`¢ŠÅåîÊ? ƒÌÜ(MN©W]Zõ¦êW¿xA\‰:>Ão³¾c”²‹`5¯õ“¦Å’æ‘þb3SØ1I•w¡ãsΞBMAz ˆ„i•³3U*(õ$ã*˜3’l*ÇÉÃY$}øÌŽ´é5jâDpA~4åVw~{ZÆd~¸%;„Ñ€ûN¸Y鶪¯ à6•F@„<9ÅßYäÏṳ̀õ1ֆÓ=Œì=ê‚ÂM™$t£¬:ǔ«Ÿµ(ìÑîW?ì'Uw/ÉXÊrŸe_³ † .9œ=Rf¸ +-š +ûl’®ryÿ@ôªé¤kκNQñøŽ¤Hžô%#}³JP)yY´Í™ŒÛ|qýï+vñ Ã=–G¾!PjŸˆ—TùX~ô2_(|¬„Ì^‡EÀÉ1õÄY4ÝŊ⣪ZE˜–3LTÕH³À¬ A9’›éVMåAº›2 +AŒ•ªÔìÆU@ÕüDëÁaæTžj»ÖD ,`‚08ÁêïZW%%Ö΋rt•ß­m>Èç#½d½¬ž¡\x|nŠÏöK¡èR•7s³F~K?ZÏ9Ñÿ‚»û-Ô-kÆLýÖMÓÆÏ<"ËMoÖVZÅ;¿—õŸ¦Î7ĉ7¾?ê.§è‡ð. (·•#̃Õç؞’'9ь¥ 1ÙÔcÜ%¡ÄÖk(xs“8ѱww{ê—öïulk„Â{­åyhÍÀ&Zˆø3vÓØb¼G52EÉO™†Ê,kç½ ¾Èß1Ÿù¸R ·Ê™É;7RÝ-‰™ÈÂVžo&y˜šx‡xO‹26>ÃÖ«ë[ð®|YԖáþ€wìÀ#œÛ +ŒŒ +pP®ò.ô”v`5]P{vP/ÞâCŠtÞáüTțÕŠõCœ@"W&¼‰WF¬‹u$ð…ª;S7;Ï©V´(x‘O6îÒ&ÄO ^8G©\ø£sÐ_–-Ö [øÁ#0(N»Ž)fҖØˈ춗,¹YjJà#½ÕžçªE!øÍRÚJ ]ñ©¡ ‰^ÙaâÛãAˆk¯¢ðü­XUÄ(ïU^D8´(ӌE! ›lRâ×ÉÙj=Ró·ižè Þi&¨AÕ#§U)YÏ|kA&²€^=ŸÞDk"ñ¬zÜáÁPßÇó.‰Ó?º¤Òšqßd +öÄò><xQ½·2Âk-M‚øïh(¦å¢ +˜l€€j>?Ex$‹Øqç{nlŒ4‹ÀËÒ-Mh6žD:lŠ‘Åtֈ»u]#¾;VÌý¸1UšÄ x1¬ˆ¨èÈ¢"új–,ͶÅ9Ëcüãþ/TË"bH¾Êä¼L÷'× ã㹞ø#PӀjE-u "ì舔ÀüÏ-‚~\ÿ•e;H½®j1ü¦Hé1>Œå/# }!Bkƒÿ“Jø†îŠ•Oþðë´ÏÓ¶°véH¢Bٝ£UQ£WSMÚÐn‰¢Â8²îeã$Açâ-H‡, — "‡wr~ñŸäü9ÑY0„òì ÿ&pPÁâP^0ˆ ˜£9›À·¢j傗ã[Žº…vªê>y¤ÈöPõ-¬_x»,LÒ¬D›œHnx XÊR4!ò‚d¥ÚÍ­|Š@H0f‘z}ñ8ÿg +y¹€÷ÿfœD®3¥"ðø¼…wöhÊ +è±Î™Î/Èú¿Ùvƒ‚ CšGG<´$9˅] +†m,¨û1{mhæ°­áÿ²E¨êiC‹xXµá BryZ96”¯ N+n2.gÂÇ(pà Rtá sP&`±ÐÄ;î­ð[pFÔ0¨øהƒÄ¦ZÐJ +¯/B‹ì‰˜³’×Q•&ŸÑP‘Ä^2Ø]áMoçªÛèRˉ4²ŒÝó„#Fv=£2£Y¹Lê? ngÐ+†Ú™ýä†óY]•! òòó:’wâ†üýDâq”=Ë0kҐÀ»Zûy#Ͳ@¼3@€lOú³uQ8 :K@„I•Hñ–â§P&ÁW¿›Ô ²Îð§í8p†:Ċ¸xAj薑R»¡ …K ò±:*¢ÕH;ÍÛð¼R46ˆ’ËX 7$|pۈ?l¶"n¸‘æv)}á©Õ <®V´ ßaF†NÀJ£Ê+–-Ò[¥æÎn+\cA?ÚsÒl(f‡2üÜòMqnü•*“ž¯ïìc¨ZÐp$ ÃZ…¡® ÷äp@¬T2@²}5¯±d`¨ß²Ã,ÅÖ:QUdßǯ àX¯$Z[ãÅhx6f[;#ppf?y…эÑ$N{þößʗi²áæÒ±~±K4×­h½ƒ5ú F“ÔF*\b]d‹·-QPw"Zç)è 5’v„"r0Á@’DPc‰*E"?Up‰Öb+°îˆ´WY”UZ Äk3—Ћ…È´¨Ò„<ÆxÈd&SÍÊ[0ƚ·27‰æʟGàx&¨vìäÂzßeK×ʱ-TcVë#­”b°ÏGÀw Í͆°fýèe@Å8ÂÀ$œdxï©À5þÊ) õC«(IzAÃâNàØú\‡‘_ÖO †di ÒöwÄɃ=p^äù òº“·°‹"XáHèÖÿ„$&Ó¹2Gåä0y`Çð”azàEý2Ù=v|âčêGnXܧƤ3­¾«Cc͓Ðôû>í-ÓKj/Û5À‡™¤=fM…‚[[•]Ó›¹¯øl7S}"80†g ›á' HgRÉI¦Ïð3óç\¦cÔDÖºM!ŸðS0ÃO†<@Æ4 t‹2¯T?<¬žDvËÍꢝ 9ì ÊS\¥y'¸3‡Î€•Â6WY¼Û䜂tSòº¿‚–Ø)îÔQ¼¿07j%bá ;¾ |cu ²ã9È&u`J~ÂR¾]¦Ìýª(Íå»á/5L×ÊëhÚOº4!"_š„‚òEÏXIJ<Þð“¹F«¹Å!±qOw£Õï4öçNâ‹äCî€>—§Ç&ƒ ;(#a€ ”€¿Û7ÞBušMm¦Á€l»e|ÊÂEðÏ)–]¢x÷/ 7ý¹d>u·(;0ÆÔAڃ㢺7Ïñ b€›r8Ì>Hó*º-£ ¤šë!ä— Ò+(ðA(cËÌü ¼ðA:_äÀÿâÖhb°nyÄâ­¡Êôßü–Îg€:ÆF•šÔ‰t+2'¼¬¦ÃC8¹Xí7‚íá_AúàšEÔA‚4‚˜ó¡¯e>©ĂEêÓç&ꝭhv%؊yx&Ť†Ù„UÅ·WÕûK•±D¥æª¦Ðƒ)¢{cýt¾ćæþd4¬õÛ²tpxȌ%%W*³Ðô§ë;ÔÉSd¸dñíFÑ8¥8¨åôÚù2ëَԦÆâyK…Æ>”ãáÂGñ€ û/¥‰Å§MÅ3ôCÖ@X›yVåœ;ÛXñ‚U5„Ã7çkˑv>¨ÃhËV͊¿éѱçh«Æ#Ž;Ð(ΩÝêt‡0ҀRSp‰bpîÙ½Š}¢CALäÉÏg(ýÊ)t/´Êã¡b"A 7jÕpú°Q¡ ¹Ú…9‘qšo[é¡ï&—‡iϜ® Â“'bqď³j"ýt²ó! +³\u¡¶sc$X$˜Žì|¨mC<(8¬*¨–£AŐ-èÜÃá#WÍØçšÊ|Öbì5e´4.ä:2kcì>š=Ø"ÓFŽÈ& 쮥>—.lŠÉS¬òàIµ™ %ò)FF@Á’54Tã¾0¸¦æÈ;ßɽ™‹ëb ÅrrhÙpŠ,*"ØuscÇ팴8‘ó|֌Nð9´^«ýâ_l°*÷e„Òó6’T7ϗsA‚ÈGçù=C»´M{ÛÝÈ× {7ˆã–)iö À¦ø³ÐXz>ɵi‘ëǃžÓ¥¿™§Ylë(ôo}‘²v ãµd'¹W¡` „ƒ„å°hbàVIŠ‘…Å•1±®ÂS˜b<'0€0Ü^aM‘×ÎÓ9Ú ‡,«rõF9”äP/|AÊP>{LÊ"<Ó^%,Æ° €8³Ä`Iƒo@¢†õSÅ,0Ÿ0Cì®… Là:nù%ñ?ÔßQ5ZacOè€6Q3Ôñôå„ñ¼>FYÕZ/@ [r칬{aݜ,‚âV|saõÃß}ýò± +À‰õª.ÙìKA£ û]YEÝh¤¾2ª’‡ìCc,Æ[ ARœ¯M¼W§b¾» °4„}Êl¤mv…d€9š®oæËqÜBôR¬[Bè‚n"5Š–ÕÂ~_®QÆ*•˜ÐÁš[ÁÀ,C©±ü—ˆã”ú„‹íèKû«{ѵX®³R½,²_¶¯c L°dÕú¥÷ï‹2­ òÓ_<G€2Ò?öÕ) +ˆ‹¿K¡Ì#{íQù·ÐRªª6h£Å|5Œ·,k‘*_Ìw£(£ðuk6v¾.†‘hüóêíú^¯t1ã¼ä{Aéàû‘±—Qc÷$({õÙ®Ce(@†µ¥¿ðcR¨šî÷‘à~¾€#8§ÑRýá±6¨zK•UН҆贉vu³<I¬t®QUcŠa*í\ x‰HK@g€9ñ,h´ª¤ØQÞÃÚ7Änö¿;5-‰šjJßìÔgŸ2ˆHñÂ.j¼©úå!Ìÿ>ëu©ÈŒ;VÂ[9#ÊÜÏÑ7ãu¢ uowê’4ƙšr +­ŽˆýęÆÑ $¦LN¡ë…)etËn`ê Z_*üÒ±¥Z=Ïfæìõ¼6k*‹´r45E’ò‚Ç„®Á5qÛoP­^{+TèÒÅI!‰™’Ú“ €íâҒ2IœJ,4OqˆJQ—NZKôŒ‘ +lQl|¢L$¾¹?oQ®Š oOHé¶G¶‹­ßJ1Ü$OèÐr”ýŠ u‘íF={|òiah·ž(ny3ׄô®å§ àÔçP +ÒÚªòÓçEu§y4áyCº;f\Ôw9ۙõºf´%¤8Èl=@Q½G Ê·‚ 䌘…‡NÔ{œƒÆ¶}†e…% òîãœ"îè`j˾ФÊĵ½šÀ1Œ(ëoÉgû™º¢àË+nó¡ZU{Ï<”5¦CÍEp¨U!/A+fß%&Äùó™á˜4'够å—`“„s.Ëî‚&TiF»%¡Õú²e•ô €Pg–@uÓrÖ£Çb «ã×ñß +̐c”&kÍj'²K +U3¨@íj9”ð2fF @]¢F[ÿ鈶ïxù§VZèš)ý z»ÄŸ}’µÂj?q"ÅFŒ-ýJÚÎä§S‘̘iøi6qYvÅPÅ9$£Ù·¾#¼¸o1A 3‰&:…ïm1&PÀöi·kjd°`V4ÄqZ2'özáDß¨nQÉÈkW2<3]#·d,ÔõoÂq TèÚ®‚_q¦×Ýq €ÃhÆ>¡(ó4†ó'EJúó³à4ÎO"â2ª|6i4+#ƒˆØ-Bmë‡)£iûVK¾ò„IÑv +Õ#@N¼¬_.qÇ[JÊ¥22&•Ìâø<Ñx„$ž·…)sék1€¶¦KñŒÆáÀÈX! ¶;zT…FæÞX…£*ŒƒbyÂ,K^€‡1„Ž'HVøý‚hÖ© ¦†Å6†Ù‹C+ÏbñÉ ÂT<ÿÙèg§»„¼†ÄäfV¨BPVf`yoÑxzrìÓ,ý†Ód¥6MmÕ¢¾03ÏKa=5Ó®·˜›ªw3±äÀÔ_ÿOá4JcÃtgº¢9zȪm¦>’™t¦N }ÔtõºS›ÊQ>J"‚"Z2«à2Sê 3½íÒ’b•fåÏB_Y“GìbTîú¸ÚøSœ¦ƒ$=zñŸÎœ.jt]Ôrò6¯pªfcDÖ?–¿*WØ> +÷°k‚Ó£oͅ}NQ„‰QRGBÄ°ý®DU{¢SÅ:±K Zó¶~øòY!:¸\¢1w'O¿€àkeSº †^ŠÁï…"p‡G‰~ç½’LmB³Õó5kǟtWC¢1 ®Y ô¼à)w¨R"0YªÜÈ GÖÒÞl~Ûõù"b’|æUEɌEåßMsFs<“DÝù“›Ù¬8À ‹ŽÓJ¯Ö÷øÚÑá&6 ªŒ>õ Ýf³°{öQ±S¼Y|tqZ45©¨Tr*«ÀP/<« q¥“›úÙÇINŽîû1A6бh¡Ý¶jÊäÈüúî<0¢iʍb‡j>7±¿¤°Ì ÖmùïYúaücC »Â[ýãdzký^½í±L? +X·ä›7K¨$` Ç7<#Ûç­ 4¤DÚÒ¡Ö$çè3ˆ$ê#óðË`„VänB]¬ÖÃ=¨#>Ôê™Än1Üæ$Ʀ+³"ÜrÏߏ™å¡ŵà<ч[¨Ò¬~í¤Ôò\9¥N±‚„ò05JõzšF®ƒ–ƒœ(UîëÂðš*ª0®âK¸†¿„uË’êø¸ñ]É=ï#Ñò)÷êxo ÃÅI; …%¬ò·&q–†¸\œëÚà¸íAyÓzO#pƒôW̉¨@ÇU<7ñ€y–®œ¥"T¾Í%¸À ʀ2²=œ;ӕIݽ„Åøz†ì +E¡9ã¾Tx—4xó•I† ½n¢»pKåö¸Ÿ# !»iïÔîD0^’n¯9#H/ EYF"lpŧf/œ'äðâè‚Æ1 µ*?ªF‚~²è`§™`ÉbK¹Ý]ùŽmÁ—íÌò}æd–æj<SãgÅaª„ñguž-Á·û>ÿ‡Jœ©øð»—1 qßBdjm¦ˆÌ¶â¬â‚àYÇ#ÍúßãÃ^^\_$ü‰pKãΉaW‘qµ¤F¨ä0Aþ¿ÆԞ¦‚D³èwÂ}¡“¬Ÿ¹– ÝsšS½OwÊAÜ ÿ% %"µË÷¿zÆp°0´!jÿ³¼’õ±ðT /×åÐ%3*Ì¿º6Aƒòé×MÅÊ¢D¢P/ã´W;Ü5ïŒz½Å·Qx|T˜ò•™ð•…ד-u™ê "Ü ÆFÐ`` (î„ ÖÂ}¿}a½9Iö.±Ù›|gøTdI:$ˆZ±ä®el0Ào°".øax;¦²$0¬ $+¹ðóÑç2©¦•f;Ÿ-< Ô[‡iÃýQ¨dÚë”)¯ýÚ¥`™D7!˜& A¶îdüÌÐ ÛK]ª¤Þç õ£¥#™¬hÆÍ-š‚<#û~±“ò^,’p—7dùðþ“ËvÎ +¸¿Ó|ª(⒴2†~¶Çfæ+¯£;Cí{éA@sèjÍ1œ+]9¤Ž Qí{yà= ë1¯À½#*^RR”?¤&:±È^sƒð!ÜÀ/–-'.|³¤…¬THˆ_~XÙ恺EX>%·rÛm4‰§±+:.5pj¬+Dáu¯>ŒEë1FoÔ3‘Üõ7;$"²E+2+%+Â'¬!¨ê +ûmaòET(Õ¨g»‰ÅÅ{× Qôå¡N`ØGóÑȕ¬FsÉ%ùVø($—t\áËã„B»Â<0ÍžNr™}9v9õ›cOPíaÎ1~÷öÂE!®½ÔA‚R1ÀF{¿¹Äó +Ž–”Š{ +B./ˤʄ0÷ôôX­Qá&;CÛ¦àÞ 2ُ™MÕüëBjð¸^ŸîEj¨ùý +ø“ïå­0ä$E,𒁚ï])™DCÔÅl—ù¸].±wÁ½Ÿ…j2û eυ¡žetÈõd?»¿Œpå©„ïvü¬:ÌeðæJÖÖØÚOLFðí©ëò8‹†¬¬S»pI+C˜TF^øoÐiÌ=_¯˜Él¤¬&u–eq®m¯žaY& "_Ò$#k0E¾ƒùŽp“÷3$>t§Ó€Oó xpîó®|öâòÁ@x„w¨‘3=Y©’|ÈhžÜ;voÅ°œ6+Ê ö1eöÅðo؊áÃßI¹²ŽØ§=ƒÑLJÒÌ(E|+W­zaÑt¨|’Y.Öf «²_Ì¢õꑱ¶0Ü!”{þØÈñƒ2îæÂ&ä:©AÒAl +!–Á´wtdƒä7 ¿–¯< 4|…_ÂY‘ùíï)ãúZ ÃM¾[á [geOäCÇ_ÅXAؗ;WY,í#DÐ<â}÷kNx*N@Ćæ”AએŒ>käê£ËJšü«Keэ`. }Mͳ” +ˆzx¢•,ڃb> “Ë9!B­w<Ì}‘áÌ;Î/ûY¦åH°/Ɇ- pG@eä€>3T€4xa3kßqƒ°ü+œÍr¾Ê˜(ï^ý‰ã{\qBT‘YB•5­=>k µá BJ8¸R"Dí޷Ǘw] bPùr^ +ÔÞ`+o.éú?lrŒ\‚ô³6À* žÐªÓ@`,ž÷CšÇø/ŸGÉHàC4üSM6{‘=r‰—wNSüZÒðËÛiJBÁ  Ç¶f‹ÂΎÁU6Õ1‰Ú…žÎ@ÇBz©Xu!Snm&+ ö°™cÂóYxԋE÷±+DǏ +…ûÏ&«â©kÏ°F +#D´šScÓ;,úÀ¡õãôSIpÜ_Ì9ƒ$Z] Œíû6<¸óÅLÆÀ­dŸHób@çc1ÕcÒÅê<˜bÜ#Í.†aMP X,Înø#Ç“Úù3eÅÚÂs°àIc~ƒÍ |¾¢b`¡|Ƕñb/(ŒpòGâ™ÜúD ãÖL()Ƈ•#Jb³ííìï×Ö÷áEpœŒ㠚è ûJ™TL]à·wúݟU'Ăsñ­/Q|­ãÓ­Aa k²bµ bWsbÍ7ºƒßꄤ(é¦Øíºa+)6éRh.jßُ†=‡\蘿—3x¦sUvñ :ÊÁV›„PAá,-Œ ÅáéŒß¼Œ&õꆪcí¨°*pŠ5ˆ›(,ۄ~!œ +ÛЄ|-•0’¢ ¯%æâü#L}~«DºÇîÙ°~4E„¯à +ãLë"ú¨`°` ¿‰HfÑy‚²¼Š"ÃuTÁ4ŽE__K xO҈|¤–ç¾j•ÃMÎKÅ£"÷Àp­€yÖ3âÀº´¦Õáó•Ÿœ'–0I*še=á$'ÞǓ#â&'ú¦sÇá”dœ0ážÂ{%Ò7’u¤‰„%GŠ°e`@É=?5[/*b yê‰hqÔbç‡Ì*rúŸ¹ %¡}Zj$Ç¡5às”±¹X1Aqí°Èóè$’œ¦0ˆ”rò >Éà#Î3¦›¥0(\ä}äLq“Å?KØM+ý¯i1äŒPÚǑQn‚ Ùûƾ›5ÞÄ9ݛu8á!nÆ»­5mEl8LØ.é(Z]•`r.Wîè³ç$r„’¢þù9ä$¿Ocº !ǺSîŠ1äüÊÜ«ßBŽ‘/àÒGÒ„³î;[jœe#¼°üz&89µÌ€„÷‰ã¬-Âã  •A“ü(#'˜„Ë*–{#®]qNg$z " gեܬëŠpv=²Ã97¶ùÅåóC”(vÀGŠ¿<±S¢‹øqÞR!WÀ¾ ÄeijŸ«NZ¥± ˆ¶­ÌŽÔ Œ(‹)ó܇uÍãH˜^)@/fÅqä_Mãd÷,N쓢XEÓ¡Ùg87œýeÅ,®Žð +NZ¬f8£@¬¼µ«ª±V +ÄÌJÇ!§”(Ώ#ç8Œ PUãŒN8SŽC>“ÆÉÍN}F5Çaá84ï.£ÇÁ=4AáA¤I5‚>’Ôàf¬œÞ‡/Îm´`3`>Ê‘ˆ•‚ +Îâç·81þµ ‹ƒÜæù`ãÔ + ¨ .à2ÐN£$Æ¢ë õC˜qú¼½Wã袧˜+åŸÁ]œpED9u®.qqèïºóÇxŸëË™³8t!1 üØå }á²Ã",œØ¦á¥ü¦ý;ÒS•Iqoâ~ +0Ud!ØûÖÑe9L*N§Hé\ÓéÌYž9'~ÞíRªOœ|Â8œ+ýß3Ú÷‰3Mœ=§@Àp¸e+¤­9ß[ÏøGܱ¨8\êÕsƛ‡–)NBŠÞî=²¬´‡¾Ëd~[ÜFâн<ðÎ@GTzY%@Gà¹Ì¨?(ba4¶tâl|VÐ'ÎÈ|H‘R4Oœni°éÄ?Þ 3RÜtrþ"(âD&*qbíT†8á U“8Ž¨îùËáz[ïƒÅ)>˨6ˆS»¹põ½iž®š1ŒBDmkñ¶½ŠCœƒ«6;0‰K`nËA@Gr{ÇP³X„.ä^B–êp<¦Ëpü†ßÛȶÉ&‰ÿ^#À$O„\edò ågÀNŽ8«gwi$…Àtp¸pКñà8Z珞áSŽ•?$EÝÄÚq’1£{-/u<Ù7%;ÐÚÞÈQN=2pZ€OÓ¡š¡g‡CWW9>$­ç14Èi‚o)ÙÆ"i¶ÒTÜѼ†Ð +ÇŽá(C,ßÕøÊÚAVzVñº÷ÜTR̼!ót‹“O^íïJÆ5 ²ÌpñÍï +N© +r´Ð˅ÁÃ0Pl8Q$ߐZw€?5XÃñ`ΐ|9h8jÔ¶ÞN0ÌNÛt¦ '§šämSh ‡I¹"YÐpΙ0gG©š~€áˆm¿)²|áQ©t {V †ó²±pÅî ‰g4†zºa“„mÙք5Iò„“œ{£ò8á,Á«œÙÑÃ6™iü´ÍÀŽNA…IZshФ38rEÖ2BDÏ-3Ë݀ãëX ː㦎óÿ.Cˆ¹²¤‘ӍçÐÁÁ{§Zñ?ÏppØ93Œºµ +fôœìÅþ–!:H Ž¹IŽ÷J E 3öŠ§ÆDS¿q‘û*Âá¸LPõK3󂣡Åø›Ðú6× +ŽSÀ¿ñ ¦SÜ6¶—Ïԁc5ò}.$8‰žœ Ñ_ 9ƒC<¾©tLBpê…I8‹[Xò¡ÎmGŒ!Éþ ©Áœ¥[$É1Y@EwIêcŸ9Mcjj÷ÔtžÂN9ÐÊ4õÓÐÝê†J7¶³`s½±ObXäa „$ ¹AN·ŒTã›ðìeη¬)@ÀqšÇm_¨“¼Ž”ƒ]Ô9÷Âa{P‹ÝӃY²wŽé +Àik4_fW€ã•ˆ%AÁ‘”þm Àñœâù¹@´ó §³°¿),fYõ7ý‹ÁêÏ4}®A°4Ë¿±¾¿¯ÒŽy­('yßðB Ó~ÓNwIs,ñÓÐ )Š!³·Oóá– ÝDЧ›ÍÌ dfªÎoN +³òF]ÖÖÛZH¥ü¦î2=lÈo‚®[æ¤müFK·›øôdØåìs#}&h&'·m×öJ®ˆ|•œØWò)úQ¡!ûæüƒþ ä>b"u‰qŽë›P “©¾‘*x¿àÆ k ff;fšLíVøC×{pÓÅÊc¾¡I¥,CpéîfXfTºÉÖ¹¢¦®ßDÌXŒø…ËÞð9bÝ”ÊkW⫸b“þ½à›Ùla47R3ÅxHÏ':öOrF1f[·Ì¥Q’á‡ðüÚÌ»v“¾+dýDü“\]‹7€½!ôQ5ò6RŸØuÞl)$v®é,¨Š.â7g0DÏWq©7ý(XÍN8!'PoF¸@Û`T\3áÞÐ Fÿ%çm› ˜bX‚èÍÓ~wwÑ,ô†UðÞI[ÉDÝM€Þ8‰½Ù?bVgŸ7* +þDLrlÌ> xÞÄ—èœf! 8:ó†znk·Tð›¹V“<ð¬Â4oŽ`0Öî2oâ׎æO†ysä¶ã³‚d ýâòæGË ½Lÿõ’ùkx‡Í‹›ìgƒøá»øªÓ„î +ƛQft"å‰ãfì̹$Þ|üÑ(c Ž6¨é|æq¯Ïp".ƒ7¡Ó*ƒîtà0$CNíöo®@&‰GQjjYÚê®SÜk µ5»‰ÒyØÎ3Ê¡*•Ý蕮~5¦©X6÷=kwCƒS‚2sÝ$ÜÂ-üvkÇϱݬ;Mu pb·ç -±ª_j7w¡°»Û+I»‰–9÷bñ§VÙPµª¬Înžêc¶µ»œ“F:ʆM½»™{4­!ëP©Âž:}ٖ¬ê¯„a^6½½—n²ýšO¢Î¬à8RÐ[XÝpçšøH“4Ç4ܐz ©ã9©Îœ4ª}›>É37Ó5ò‰"èܜà]>ûÁ–X ª¹ªÌMIƒ=ô–obnPgó¹YBµ‘"Çtlà¢ýJŠ°fŸî{<7Nýìƒ]¾Šò€v0p ùèÞƤLX¹x–êT=ÑJù røU…HLZÍM›Ìæ†÷pÙÌ6—™G/!óA™ÎãÒd|#sSX­æ\O±0•âH'•—E£CÈH(È?Ž«[l„h +5wbÄ·²3*r®¾øѸ1rcR Xh¬z²þý)éRÈ !ô luœú¹aÖO·v§K²Èû%ÒÏÍ°’¦Ø¸I? ðui"U6Qиa#\|®¡Dƍn ³N¢‚ÄdÓ¯%Ž¨YšØ +NŠâ†¥ÞóNë+¿c)!>ÚN“u·MâfH–L×h£ÿgՕê|ƒÃ–nbÕ§"N%ô%ÜÝÂ¥€L5„®ÄK‡¼:¸N ö˜RËàf­ŠEÁ Es_a™.³²0 àç°=¾4Ÿ0·ô m¸Ùº*Œ,®Ýú·ñæbö·OÌÆ8’h-ú61îç6€§›¹+í:|Yî7!½R3´«iC´»oٟ»$ç—hK…>#G˜–iv9€EoxŸ0%i²úLÀÙ,LÐ\+Lt^ôsw¥m4”½Od]š4ðyÄm´9 ”·ZtX· !€Í6¸tR·mSt.Í0†¢móþa8 YÈ/ó|¦mò&w2FF&چ¦Þ£|ÌñìÙFÿ )’§ªˆ5"¹²?eq÷²Êæ…ü"E‹½ƒf(žÔ±Mѐ›š¹G$5L¡ÄáÀ1îÁŒíæLÂ!™žV›L3] ÐBÝvmê¡Xò9¶¨6<™Þ·¡¬êë<¼Ã­ Êÿ7gYuAEÀªúk/áuÈ7?Öú»%¾Ù„ÖYY”K°X‹MÖtìS6X›÷- õj3ğÄ݀}*8MÃ@6¥¦õ< ¦Q 7fm¤Òl4ÔpWE©jÃÒ1N ÚôFb3˜™ ‰ìº“;µ‘¼="Ú=ïáÉÄШ ràлpiÆýæê¾ P—M µ”À}Ú´—€.38)áiSÊl :m¤_õqÒµa9ykHÞýÈzOñ›Tcµü8 J‡p ]÷¨õÁ>“6¯ƒrÎÊJlþ +´YMYGH9Úe `Ž7œH£Í/%U¦ÙÔv…yú Èæ„.,#Ø¢­6̼Ӡh“ÖÄõ»!5ùsEÀËÀf΄½Ž¬2ц;·<‘D¼šöóâA^A#öü{6âR™k˜Uà7Â6C›kÚÌØÙ+´‰ÛJDnu҅[I¾¸mIÃ8é@.ŠZŸMÎ;Ÿ êUÁž ª ìQ±dҖâÚ \A(`?ÎÖöT®ugÓ»„õ±³YµñAŒ5š¥Úçêl + ´H…NÐèB älp: Ìwú)ÖlĈP&¹ªe´8+‘ÒÛqQÆF*àä&ÌWÂ!:?ÃóÐ … Cp¦Mç@­úäQnk¶08 ¥F"þÏ,@§-Ž˜ ï Ù0_¥UBÚ ³9å‚Ƈø ö´lŽ@OÄJË`ÄK^D¥g0¹,›£dÃÝW{Á²I™«¦K͕MŸƒ½Ôš³++ˆOCjq?£a1e£×Óc¥‘IÙô +b‹Œ\¥C)ʆþ ñÝ ”MÂU^À>Ûµ9Ú=òædšxŒ®üWœlÂlØÐó¢^¯@U©ÈF³›÷³™ŽÈۜ$ٌÅfJ |-›ÍµîÀ…ds4SãçŠìbG6þâ¸ÎLqÑ&²oB“ml\Ȕ™–ªÈ¦S€´£D6Þ½‹Ü±PmÈ毭×|²ùæx  ›ëuNٔOØ+*‰ÄÅæ|IˆOLà“l‡ßu豑 8k ÷²Óò ­!p xlDMpl/jÇ&F¹ èð2# ØS•c³Që!®#àØLŸ +j…Ga 'ÌßÂÅt.TÙØ …¨0Øh=fî®٘¾Ö¢FhÉr¦ô$§8QÍÅ¥Šeø¨¹°Ä7Ò[Í!¾®k¬ƒ›Á𹼪¹ -hƒ +U)¤Øœ­w ”"i59œØfŠÀ\ù)Œl6&0±¹¼%ËBÐ)$6Ìýk û¸I #•0*%b“2r]ñ0læt̔Y AM-6šö”I´+¼ù‚_\%¦-+yM„GmúFBçíࢾH"ßDõ·1Ãàг ‹i£Tã*®š±gK^Füà†&Np 'Yoe<[†Í•›„˜¸b…‰‚Mæò«1{ؤr¥xÐÿ;¡Ød40N6“H-ˆs6. +z.÷w}Zò«¯¡T“íÔPˀm~EšÍ~D¶ˆ€¢/|ýý·Ð¯Y¡[Û‡tÀòklŽÄ&{¡€_ói8²¦j~×HÕæÙÖ|Í8·ô0ñBø¸¾›äk^‡¼ß5ò&´ã=ï5$ÝRDaIo©Ì²Áe³£škN8KSÌi°×؉À¶˜oQiV6[øp<8.™z‰ñkD÷TÚÕ×K¯ÙQ,jÐkâ eIR{(&§÷»±“ÿJì^é‹:£eîևwMçƒâOÍZ{r™H®ºkXhRé!Ó¨=´]“ÌOýäd,vbeŠÉîøB%íf‡ïÑOPÈn„ƒ)Dò¹’æófÖÓ®júË"¤\'WUCŠ3ìo#]Ö®hª†moP TMÊ$Ýi¹ƒŠªqÊm%8 †ž3¼ÄzªÁÐE7s.Ç»¦¢1À·P[Ú=cŒj¢Œ„!±O•QT³5<,–GT4ÄofW] ÌêJçÌï¦tFÙË,‡è§Æ°êŠÌÛ¸_»LàmŠ´¯šKOMt¯Ìq_5Âêèé™ÇS“¬p6ÕQW؇Yìïð~2èÔÌ¡®€¾TÑ·›ÞrjÚnÔlQR¨¸ÏÔ1&WN iì¦~gR °ìÌTr‰_Ür)–A¹DN¡xàî|¨¥¦X:A„uÁˆõÙmGÍ£ “§ÉÇÍÒ45M3Brn@<éó´'AöôI³Æ¾’¾Pñº@aHj˜—.µNےÓTØ}©‰Ål ã-Š¥rÐMšé¯%JTW C´Qƒø°4œb%£†6qcÔY÷)0jFZ4öO¶Ê¢¶¢ +ÉÜzUX>Ö²ÄUê¡Æ‹GÍè~$„cæP3Em +)ùj(C'^Œ”-}%E3óCÁÈ09aºZ(ÔЎKT¹tšƒ#2`qhŽ4½'H¨Ù\ü‚vÞã “Þ̬iþ­"‰SÔæ/gÔÄÁ7nq%g{÷üid?ÁeL«ð›†ӗfü¹ý­óyñÓøRp½ô«‘}šX2‡mšâS.LK\"{š§JgNÎƝºiÚ×1GøCü"µù#¾( |MÓ¤¬ ÅÊ_¡h}f¹Ô< 4Z~¹}.µ))Œ8dàZ»‚uñÈ +::YK½N5„È4Ø ¨4áEä!Mó­áã1MÌ> ïEÊ.hÊtí2<ÈÌJxÐ\çÔ7O¨—S®Ò~ œ†=F3ùÍ©Þ4LE,!äBŒ4g0‰—‹ŽÃÜ»7¢ÙáŒç”jæÏeÓT…ÈðdfŽ™X€Ò5›»÷ԜÉLšx21ÒÆá¤Ø˜Æ/T4c³%Œ|÷{4HŠ-Ÿ u%®#0 ó%B◆Œ ˜ÆTÐà0ÞÎÛ'9C„6q!MXV÷XRrŠ–Žid‰Ô„s¡] JL’¬0¨6LCï&“ZÈ|L0MtڝÉñ™^š‰ 7P"y$x'XUŒ†—ÆܼD4îфV<“@»4ԃ1;˜4<‘´y4"5¾àĪ\šíæÙ!«–†‰©¨ŠÒ4rh9½£Î²¡°Yša,’úöÅ?J–F•/£êcnúB¦ ÄÒp ù͉äI…[—ÔJC‘ù,¦²`¡cÝ9ˆ*4³¶ )“FÝRhñ_¯ÛÞ®Í~¾”Ò„3`hú¼)MIC±/s¦êo”†¹1I÷/3»™(MÕj˜6å4³£àˆbomôxxE&_?›Ù¥áI^Q¹y7Ö£ÉQãò AÑo•4±’^;nb„ýùА]<¶¸bæ‚ˤ%y%¥Ü"IS6åÍT ÁúÑxi1*töÑ°]¥yw5KÄHƒFw3¦HCþã÷ãLV=EJ*nã#f6ÚeP3MûÜÃjUÏ_F#$kׄêH³‹¦QÃÐ{Â&ÿ f8y +›b}4\I÷Nϔ¿3µ‘ &HÚ©Js¨¼£€zÜÑh³üæ’HÎO&²EoÆÌÑø.Í^šÂÁû³¿æ09š2›w•ÝiTM݁þ“+ÁåÀÑLŒ0Þh&1ÉW}šðÉÜh Ô³-;ÌxÆ70êÿÜÀ_ +…“f“'Cø£ h+ƒ:tp_ìÇX™—Ë ̓¤ãÍ2¾F^QöJ>B¾ðóÕíÅF eº1PÎø'4[à%HFÉS(+š‰ÁÆì äÄo³¯+/€_WclS{Œ•È²mP4aIrÞ5dÚÀ vÿúñ0M4YK§^RÏûêq'BS—›‚ÙårŸš¿œGÑðDÕlP2™ A +‰[ŒFo>™òôáѬzz` ³in² +¦÷œ„öCtseLfgú§Ñòªøk<±ñi‹>RFVù)†ñ|Aô¦EeaƙҲ‡(J4í¦À(åLWjÐÀéNmˆô«³¨srhXâ8ƒ«'bÌ/ΰ;Cljh^ÀNŒÂ‹qDC3v"¾ºlnEƒ^½t¡P›¡ÑGEG«½ž ©°™¯¥$ŽÌ/¶Vê|{-4%æÆ,u+³ BR½È×tTÄ\Ôۍ‚tbÎÄmcÙ)ƒæÈPAÆ ÍnԋÑ¥Bs%czBnÖ~6Sì#8LÇêÚß²iO›ãt 4[=¨éL*%†ð;™ é$.‚†Ð8¥nš†p¤(tù»Yˆ­òšca&¨æ{¦Ì³f®X KC͇›@h:Brã®¨n6ìEdžý20µƒ†ÀVLò¬»·ÏŒõo rÑ ®œcÿ\ Ýä  à; Qû¤ @Ðð +mé7¬ ²eŠ8ðTпù«f<ѝk–Uª„>!¢¢k½}qê ÐD¤ÍÖ8$u@³áîc­¿™Ç€¦öÉä{ST) á™ä¦àhB}ÝLDÑZ¯±“é&CN€ï4BÕÙ5½H7zþ2Õ­E[ðJoé«´[`D<)ŠrY`ˆÁÂhþÿØ¢èuŒ´9Ϗ3ê›Ñ¿‘|hùÈ*|³„i™|{!Ñ¿Yٛ +T€]hA¥tó¶ú“=XŠ.÷ÜõŒ‘ÂFä½ z¹Éf•Á‡Ò.°³Ï­îڝUéæ¨|uØ_aá¹‹Ë3rXÒñ-é4ä–Ñéðz»Ø:Øm n³Ï“‰IGg&ZÅÜŌ’“²eQk–žÝÝIŠÄèQĸ‡sÔbÍäB½x¢Ðqýí¦.ÉÝn„{Þx endstream endobj 133 0 obj <>stream +J]VEl…:µe¦š6¶³Hl«¿æ}1ì^U[Q‰†£qP@ …™²ùPyïK­ŽH"osø9¢ÒÒ:ÎϏÐQÎ÷ŒW7a0͢ڝ³sðD ¼]î ¼bm¯˜XgéjºUê97¥)“!«w¤W&Í£– !¼Û_s öÁ}aUœ ‰YM`%›ƒäur(ügÅS¯i#¬ØÅaBAÕýä±gãñx$ɒàݡ‹G6ԋª÷GÞã@ˊ“Æ°¼àeŒ ®B(L’Ÿ=¦ÇjÝÍݹL¯â +ö +ÝøÔ+½!+5ßÍzèBVüŸýCë´ž™ÚÏ FwÎ;Ƭê9Ò_h>ò +ÏIO‘Ñd‰©$ä‡#ãŒ:ülÐTn]IWç®o(·7ì–õ5ßâ8‰¤ +©>É8"à§íüièœJAŽ$u‘ÀÁ‘õàà|ᛠ¹…÷6ÔÕ¹%Ⱦ,ª÷Ê@òÊ)äŸøFã1b=L‰é!bªÁ+¶D‘‚Òð8¹à¥W[.MzB"é !¢cѦ§ÐnEhN×eÁ40]¯ø8ºh…ꈺaÀõCžë26á°Å½]f +‡]P$)p¦öãv“s½½ C§º9–…ËÓ¥¬Æi¢LGüåˆi·œLØLÐW«Ul·½’p¿Œ4ÁUÉYFÑõ´r§F\F@?Çñîæoìéð6v†­ZY‡Ø&ª'óÑCI d5VÐSsªv¯<_ +ˆsã?V6øB Á£c•"õøýMÂ9.Ú +p\–ú¬O$íŸYÊ ËÉÁ©v֞Â<Ïovü¿¡Û,Õ³tˆMtS<<¡Ëqä2d9프ùa°ØO1Hhó0Âþe iö:0|Õ$TdÂ!z"St%1m‡‰µ3 ƒ=û›-: ¡©JÂõ`pNl™˜Òýg@Ìøºó d3å2ý‡•ëf„WÙ:æ¾ûú'dúÿ,Áˆ{³œÉÛLâ˜%¹vä8ãh¬ 1pt*»¶ ²®|¤Bà.eÙ~y7™¸CÙµŠbLîô†á†tHœ)¥óú^ò6õz´æ” VA…W¡í â[d݃''~VöpÇ ¡,c–B-O¡5ónê,‚ÐÂ¥D{‰­5K<$|¸7ñ"1Í%|B›0›x9 HÃËäòáK””à˜3pôŽÒjÂi†P‰zèÎÕ:gm{5¾Ñ›Š²Ì]ÆÓãÈÀǍЪбMÃbFãáð/¦䨧Iº„ ¯€ ±¾³âõŽÄ¥Ïq‘tdÍDyc$áJ¬&&LB‡Ä$‘$š©-R¸ þËeìÖ¨(ʄܢŒC‘ +ÒÈ.{I;€Ä§™~ýuq£(šÙðGåäƒ |N̹Ò×L FvÎE‹àf”ŸWÊÙcD˜C˜‡ ¾Ï·€]ÿ;4(ߔÅÍCLXgb¥8ätVˆyšÜº÷÷‘8²A¼NYûåó=:@Úz™+  ƒy({­(0¬¹Ån®RÎe;ŒšMq9Ûçiîe¬»Ï-mÕ`Ջšg9[]“nQ/´ƒ3ˆG>_ÛȪïˆ{Dk(\-ƒßÉ‘y’ÂÄÎäD{" j3–xŽ©ŸA@27‹–à +œ‚û8£Ðcp<#rĎ^Ù½àH»qæú—ÙvBx­G§èNt°U*ª¼ÿ°&mã+=é9[­NCriô/,sY‚΂ұÏÊð ®=U&&aœ\KD)Ïϝ£A‡ÎØDV©V*L$Hö¯§¼³T\¢ªæ¬°¦ÎvA,ÖF߀ýŠoeûûx€l+h +›}®ÌZ¾_?=“Ú4u,bcwՌ©¿š ûK¾ƒۋ7=‰œÏw|I’AÒWŒ‚|@‰÷ÄRÖã§ã-s•Á¬‘?î«K!åú‡ò„¡I£E õqÞ^aÁºNŒ)Icˆ“…>—Ã唚Ï[̴ϕÈnL€S—™ ͍U°°~ƒƒò£O2SDœ/Ù0vÙQ—Ñ^$lf¤™©v¿áa)eÖéé©(b™J4Ëkaøɨ ?U¡M¥¯e!‰Ž€Ñ¹â£F+@èÝKÊä…ÁŸŽr Þ#;ÂÄ-0¸\r]PsÓKÌ +󂍲\)±YžÀq0#;˜­»$”Åàn•æˆÇ~Îhž^¤ºçI¤köƒm¹6ð«›&¼}j•WÄ'™Bi€ì45äûònõªTœ¶qQÕÉÕ÷JSŠ!5=µp‹¨‹#T(å´»¿ÔZw3¹ù:E.Ú3u´S&ØÚIéaúVŠo/ )¨)ŠYÑÄþðÀñIr˜ÒÈÙv¨4X%Bz6¨Í‡;ZÔHòl¸—·•Î¦§Ð3Òíôœ’¹–ÛD¼u ϙN…Šš,¸€‰B–ð¤w©­8©þ¢EHö¤…Y<©!šêñ gâ¤IQéb–‘‹ÓlA6,^ðóíd©ÒË!  I>Á˜æ‚¢A!ø$ÑD`Ä8ßKî–’£ ÁR%3…!Íhu™ã©–‰ß˜À×ç¶F™™¿º¨¢Šs_6™%¸7Ü-xé,½9°7û¸nnL“"T…E¹}ªšV§òC»Š $ åJjÔpwò­$î\‡MïÜ'î]£eÈ6„)±£&‰󵣛r8 -NŽf%D‡S°.`UeqY!Qûwy?^SF%Ê÷’Ïîј±*91Ê©„Ã`ݖ ƒŽ À2ðQ‰9âuÃõÉx;ù'CÖÃ5—•<-ˆ¤(aC‹”[ü,D3:v âæßCn NÒkË­¤<ƒQ)5=–u§)Ïl†áDÉD)t úÆ+ÄÉõþã Äï Ów:-´XÂÛJ7wüê‹Ö™s´¯ÀG¨ÿ‹5ە¢€¹ØxIXœÁ•Ç ³GñNù1º :D<ÿLzÊ-ëõ#cÿL< ›>ÕÞ/†—ÛY"–‰!ß ™£Ä~MD‹¹Ì’ɍ64î œï`¸’Å€‘ËåŸB°¤Ñ?mocò¡0©ŸDÉ0êұŠ`0{4³…{'7æ?-5´ +¾ÝVÐç€C4Ÿé81ó“aGŠ +…Ĭo0¸Ò/<œBþîIC¬ 7¡9Q +ˆÜFš?Ցþ/Ždb®å!~ñCl)9ü/–jûÑebâ&ù"è¤ð„Ú?h²"‚@;ÃøÚ7ŒS¢ÑÍÆ÷]¾ã(rË΀ÍZúâñ¼¿Qè~K@=† °5µ#t€0߂{•âÃÈvŬßL™¨` +Õ6´™-ù!Ì3ç|gÃ3ªò‚ßP<Ú¡@G(ÐhF§‰ûC¡Ô@憥L§ EM¿el9™ß„ÐøùŒûon>toÚz#.¡$ü;Cª†…¥AÎÜYݐL ¡SَeµY°‰(™ML*dSµd‘ªø¥7¤Ð̋32á™æÈE\ùW½¨€BèÖR|ù©hŸtû™¶ %÷Z¹6©”Q"Èrñï`Ô¥œ•/o¢H`Ɖ}½†ªpƒêf!r9ícˆõÉc‰Añ¤VƒÔ2Æ©ŒÚT.¼cÚâ G€¢ @´•ñ– p'óóV„¬HÝ ŠJDãßIBÁ+ï=ó¶`Š.–,^*B +—xp;¬ä +yÙàHU:VeWlø\¼‹„ zäAù êž³Ì}û¢J—ÜW‚ŒARH#³ÚG3‹ èð0"pJX@kd©1èψj8ÑqôïA±‚F{yÿŽdIƒªí¥ÎÑÓ¬‡.*h£§"]Kœ¤ÄèùÖ[ª%I©è™µýæ\%zÞ )F󌞣½}j>z}Eùµ§ Ċ^<3ÇtéÎý­)1EÏy)—â¤/oNaJF|ìÅkFÅ£gjÜ4úåppTë¥í¶ø«¸¤ÀÆϾ!Ý42Á¸%ȑ³ŸbtfÅX]8'†ÚfC¹Š•`ã/zp°WͯR}Hå‚>WÉ­`÷Ž¥ºu»9>*¡ºÇª!fõ¦üdÔ£°ú‚Xêй"ÁóaN1ý†5jü`ƒL X»n #éöðd}P 3‡òoF8^ªšR¦¡h¶ÍÈ4Ëá žu¥~b<Âäˆóœ){c$ØΛÅ"´´§÷7%“ TÞÅOÍ֙Þ(S߶s4‰4ÁRÒb¶§ŠXRÞnZËêWs…ETY,ÈËߏÈïåâ"n¯½Ÿ:üÆÝpÝêûBÁ#zÚÙêƒWÇÛ´é¿ã¾0®aJ§c›%Q/&Î?Atrè—íæê€ @Õ|OÀÆ7kìèRõ|¾éÎÌ Z^ ÷ôæ9ب•†Æ°­}<àÒ@Iá6tqÊ +ú{@ ª>9Àg ¨¦S‡Í¬‚ÑŒ¸=N×üQwfÊ´!õ ‚í-e0LëÍX¡jhÙÒxQÕ9d1ÑÏM¬d”\1:uN 領„Ü}Z'ô)"wÑÂÓFÖiš¯âê; +åæ?¯4Ð9ç +ŠCsås|@‚»Sð=M#ÀMï²¾ö Û¥œ™ÑÔHDŒî"Uú3dtoF…ÊKYo¸HwÆ«ñâSgïcZb÷äï· øN…? Ú0tÊr G¡§†ª ßD̶КK=Q*h©]kèËÙ+ü5–·mDg—œõ2*Ž’v"çcoÆ#؉Èð¸»5¤û?]úˆÉ@âr0>~÷’®ö5 çHÇíon …N͒akË ®à¸ÓWáJžœâÜØUÅ=p¹-‰6çK?v…üŸPCÙ *ˆÊ@g —õÑíY ^Ò»uÅ8«[Ó{K5'Æ9öZGwK‘2Îd†œaä‡ké#hB€Õ)× é+>‰rñ횔àœï»Ûp2êð™QÐåX1cp @y$“À:2¬“}Êb†û]ÝðR¹éÁm)S3ЎÅ÷HUZª(véà0sª,RÀö‘˜²ÞFMTÇHà“Û}ª‹‡XtÛï¶iÁY¬K*…ÙûEjsà8={oûõx†À~ 0âÅ;1O/ éŽ^-î™Ô7¤©ñk ?x ØÜ9S¾‚.œL@½´èOœà58?“©Gß ¿¶ÿºøñp¸MG¾3h‘ =¿Éö§syŠYÆÅfÀÈXœA+]Œñùq½ÏqWÏí *‡Yæ¡/ž¼¬¢áç AŒ¢W œo*S°à—ûh?£ÅѾ‚Ò·y-ºzZg`Ž>–[½H’²¿:xŽ@)€¬ãçÏ°6£E®4ôÂcæýD3´Ý!™A‰žÜôVÉ8®l„i!ƒ€QHÔWB– 5¼ø­ž¼fèùñvÏÎ{’ GdnXϤŽ8œµQ-^)y™¾(È +îá##@ù©(®m3Êd`k3Hi­”î¤%`’Š(à½êõ²¢^—§Û—û;<‰à‰- pÊïˆ H +³ Å+bPE3v}êéôd•9o•.Ð++¶äì!UøYJ'“¥1¸ü°ÕJ4®Ð‹‘W¦¤%Úø ÚݶÐNyÙfšï[aÆݺpâð–‚HP±ö'¸] Þ÷hïÄˎh4{1¼‰ÍÈaOÂb!ynŸ6 +/³ÛƅjC  /:çnž…ÇTQ¿þîå qgâÖéQ“CÐàþoùäãCΙÁ›l¶,*è Î=£%tSC̒ΌzN€x²:fuXò/ èw4¿(¹@d]g^á>fÜR ÛçðLÀËKI @,†€Ws%a6TÑEíÑԕÍ`í_Â+ßHɈAkžSUP\ú„`¸0žWN' ¼Z|M-¬V\è!Kڊ>'6Ÿ=î¤>u{Ѳé +Ç^)^† šjÜ`U“¦ú\~ºü![ /Æ ¢#<ç¿ô7Îpڊ°Šl +x¥,!‡.ÂÍT)Z&âßÞY4ÖGI-…Ü<Ž ‹ džØ»:p,geK¨wWíN8œ³CÀkr<¨ÂÆ ,꯻wšô~ ó1EÙ ÓÝ çÿóýülúE©‚ÐMø‰GåX‘E¥ìC~ÁOu˜ñ^å»Zøz"$¨ù⣌°ãm\›kD¢‡šÎošÙòUGÒ1êe1ý"R,àÕsT,ùˆ*ƒ½J}[îpOwÂÚÁ]sr¤š€»*6g F0d·ž„BÀË®Í-Ââ½EyǃŽÁ1ôYÀ˼þ0¸€×%ߌÏs9mW§o-“$Æ̒9€¼6Q‹Ý‘Óâ)Žæka^—C_”åùÐAÇÙ΋ô%; ^íW‰®hÕð:'U…ˆË¹0NMñCi-ií Äk ËHf1-é*1IwЦ‹È“‚ L^¿ŽÈ07±âÒq@çóelÄ,Éiu 6é¹*Cm¢ÍâFàçßzg¢!Ør©}q%Â}õó´2TûP4Տ©½Èqª?Žü…Ü „‡î&€;¤Ä‰YÔ1†©µ]ºzVT{ qbO‹:`›fäAJ@ƒŒCԎ·.Žu?]­¾þ¢P+›~¦Ä€¸v€h“’†ô£µ×r™ÜV'ë©ä;)_y|õµ™HhÍ(dŽÇCÀ+ëú/¥r¹¥?7©r (‰,åQá_/>ýg'(Lèsd²úŸ0Wê"½äþØ֘è>•IÎsV†Ž\ ÍMçÞ¤ù›ƒâ<|M¶Î/…c/“7R;™9'Äo!™3Å4*Ôá\@n«¶T”ƒ\¡ªu˜dæòS¸€Æ‘ä;¿jKs€„^YN¿_rgòšk ÛæÂ}¹ë4„myKTX¬T·U[šo5æV9WµeµÄÓ¢z%ùp ¥é¬k’çÚ¶õS‰¶_A†«PKWX¬_´¼àÚܪ­J˜Cnù×?¢0g_žX‚w‘–ŸÃÍ +θ–|Ì£b®Å‰Mb´LK áäiݎiF„[èaéN +Fߟ+™¦66¬‚^Á­¿!;ߖ~6³å?D"Íã‡LqS¼=ÏÀ‡å„!^Qhò¬‡`①xǃ{!NFÄ {7(ò=d±:ÊÊsžöNM†ID†Q7fØBOh£pîTKþT•rõ³‰@‹'D¥PB ¦)~”D¼÷Eõo°Èŵf-+CÑïÃ~ü/ÞG%}›ßÁºÓÆ°pÂ!ïŠ$þ’£[îïx €âÒïy™¿2¡˜ðL,)„ÄŽ§pñ +Úñ£ƒÐ‡E—´ž±"ã¥UEÉYµu8{Ve±ãBòóˆ…ÆwÅ>°ÇZÞ"(üi¬\qc¨t A)ÜwçT +‡Ø'$ ú 9}ԟz:Ä#Vº^éúw¦¦^pº±/ù!ìñ|ó@ß¬xf jºš ³Kzàf4”HU"N.äÛ2}ôrˋÈŠ>‚ö_½FïÀ`ÑÕDHÌ#x +TȎ ê6´Ys9LEI<®L7¡˜!®ÞÑ°õˆä¿ëì`L¹Ü,=|”¯Q„61Qé2’‘cÂÓV žŠÁŋ…–Xòê½rjˆ]y ],Ûö…•¡ðè@¤HA;R“–CŠšƒ.5ý±±_Šš"`ànë'ŽÍ ø•¨‰!?4©Œ4]PWi™ú~åySDyò:ôBl4îVŒ‹^Å3Ñwê9‘Œéš¬&Œq Å©‰ï¾*1CâQÔûЄ{ð‹FP¦/Qù@ð°Rž}%{žBô%Œ®™¡·…ÿŽpÕÀ¥æ‡¬7!‡úõŒzУ»®w*{“BÄE6†nç ±§Šþ˜ù•%rèƒ-̧íwtŠ9Ž<*yȹËt&>aÇ+¬JÎe8 +*ÙË ä24 ×#þýö …ùÆÿ¦õ°\ø}o(çÀ¦æHvæ>úÃéóÈr¢H„·ˆ¦’ƒk䨄Ùêv/›DW ÕNV7™2MŒè¬|=*µwææ†9†SŽšžé1CÙ)¬ßû*ʱ+Ϧ˜ÃG߬ըî¦4ÝdŒ4G¹Ñ§\‹¨Í¹ W|~§Ä,½¢BÑ6Šâ”Îâìià ¼ÒE—¼«€^£ñ’x*ëè¢Ò} ¿<ÿƒFï1DØsÃن– EžÜêâ#Ú¦WħúOè^©Þ£F9dSŽISÊù‡~[ºn_„ì™’›É‰¾zä$ށÓö7o:¹ÿ\¼çK+•Tm?Q‘ÕÏõp#f]qÅÄ%EðïòYƒÏ3×1ÇÕ¨Ž+5 G +– éÿyR¸?=“m)ñÈ¥¶½Ž°&S(5 SapèÏ_`|EvàK઩LùöDÃ..„>@4­^ >=¯ÍåÝ +oE“…Y³ |¹r‡¥öÕ"m^Ý5ç¼æ¤y¬†èBR ›h¼,'Ãà"¾Jžµbv ¨GÀ%¤ò˜ßê„ D`ŠV%<¹¡•—’Vî# +µee5XèɳmK1p9:T¶ ãimb!ù×®Ÿˆlï«pcòÖ½³g€D^ê`\2±ñâe3ˆ^1ø›þ#͐(‡šØ3_úU¼³ëop@´ì›ÅðWcž 3#Ââèó8#X#‰¹ ÊTô>úüúN1•ì¾¶®ÊIì"žäjéf‹³#,!D4a¶Êaÿêm’?êX€T"ó‰ï™1KìÓ þ{|ØêƒÙvJVWP<ȒöɌb›j¾™–ªYh¼–6yc} ÐUAì}XPêS:ˆÑŒ ÂÕ%ùB 7ÑÛ|C Ë"72Y>aº³H†ÝrùkŽ,A¸¢-•ù o“„wæ +8žœÝOþ÷E¶"G;"û‡ùyI)J%¹Dá]“Ú¥Cíç¥Û®ÆÑ fát¨_kh÷_4K<ðHc±ûI‘g¹ [XÀýa%™÷Вq–]hÑTr<’j„—GÌ®ÝB-:áóæoÍqÅ8™Å¿õúÇ3ÇOµÒb:Mñcuî$UUR?˜R%„õou.¼´N7¤ÃHW‘˜^}¶b11æ|öꅋ†ã]õ\(ëuŽ„Ú´× nó—í¤†"Nþ|i)y¨ÄB÷!yÿ)+‡ƒTÖP qãâÏüËEuö–Àˆ»?†›§¸ÄŠTÞ£?WJԅœDE€èܐ7ªGpÉ#Éçý8í¥çmÌß­^]²¡išQ+“¾èÐȺ‘¨¨V+¼“ÓäÊ ŽÄ¡}g}EX;úŽŽ:–’¿ˆ zæðtï9ëÍêiJCä5ŸLDs_g‚×Æî9 òreü¯#Ó£íϳ²ñࠊ¨Ý©qÕ©Ž" ¤Ã<§8 ô(æ,qknv‡9ž\âIw=NÆ!‰ÉÄúDU>ÖëÊ4$‰Najܙ#°Çóƚ£ÖúÂ"bâLQëÛ~>§ÈvçbÒv‡ðî¸Î¼F…µcuÝ­ˆÔž¢øeøZuæ*ŽO`JL5±žèL¯·t¸Àx¸çX5‘ÄQþiÇF&2C£$,¯?bQñཤAœŸÒF|G]ô +)ՔvùC ¤ÀL“6uÉ.GÅV‡²+V„Ñ6¦ó­ô¾õé ãÉm-؝CݙƐ¿îw('iAxÒmP*.5B¥¡Ê¦ VM9l#DÑ$žp`¯þŽ´”mʲåL¹ú38R?ƒ˜ÃQ&²fº ßӔmå% ˜YO´&Z«Â¥p%1KÔܙýèÈՎ: Zu,̈́M? uD[*}OäØ7wE‡:bª`|nT2ƒß¨7*…àÈ`•“¨C ““qNªÎm´0' Zž¾_¹¬æ°|Ê·÷¿€y÷£2¤"é„ +8"L N¾Ó¿IN9IV–wðQìÃ8»ºEªÞËûKy#TÖ3ãýÔØ|ú9ÈÄ!ÎznW Äu·@n[Õ·¯Ç¹É/° ‡ý°a®T2ü–Ð0æl­6TØÃ¥GAD󽡏ЅŽ¬, àhq…÷ Ð·"ìõ™É±Q*f  ? $·Î¾¤·É¤‰® %LÞ +r«V²F’bãßÓ'm{àõÉBg¡‘Þ…€ Á¿\ëV´âg4ô€r7YL‘æP#xhz’õù^ëRI +“‚X{Í xpïà8ããá4ôŽ¨òxGöM0Zp~툐‡ôÄÁHú<­9˜Êw®nî–‘!Óž+³ìðœšÒº£§à~£ÄŠ¹£? +ïÌH݈[¿Ã@Y•÷”À é°|v.ø›3gnªÁÛÍ6W0›y³^¾§D¯Zʀ¬YؙŠ"éxH±I‹–ŽH4Àè¹ùˆæ’ ‰µEÜô¶9ó mƒüÞ¬”¤âRèÑϙP"ô.!Êzþ¥ië ˜Eù-YGº™tw>ϳ̔沸+˜”ã v6¿Ú…;øÃ|£·a'aEáR\ Š8YŠú“˜H, qòÿ.Ì¡(’‰®#¡þŸBxúí1lPcöäµ +WL>£”­ªµélÒ ¢š”M¼œ\.OGÎ!®žP‚í ÿק¹‰²Ñš¦UKf„yJbùÝfÝ_ !Zõ[îø‚Ðå¨ñS¿”'£ù[<ù叏EõõÏ ~­GF¢ÍÇp@ÒÙ½övARÄÕþ8¶Þ&2Ÿ=£®èʳĝ3ÑDèágç‚ÞGÛ“¿»2 ª³ê!R8Y™­ó¥ó¬…’öC.B}ä ‘´õŠ%r»¶ü‹§oæY[²ڀœ9”´Å;$õRö”HPFØö\Är۝ 2@ä\¢‰ØK ³[EÀc9ܕ€ +ܕ2~¶ ±C+û/ùr´ —ÉùđÏÄfØ°{è%ÌBo}Rê`ÚHò£|Áð#£#2p1&||+Æ/øc‘=²¼†8€¡E2ËMmXÐ¥ÙÒqJ(SLmeC'2$Z!³ÁQÔLO'›Ò‚ˆ^RŠ‚¹wwÄ!”Ú‹ WãáÏ,ßSÚYÄÏ{fÛhdöÒ%,k5Ê¡ÌD#Ëü²W\ò˜÷Pò~÷oz=ÏkùèR7.'."ÁFyM<ÈQ‚ÐiA»Ö31 ­¦.ë³¼G¥Ë"øÛg87á’óÈP¡D+$pDyÁj†I\\@¥å=¤³ètÑy˜Ï†-‡¸MQ¯Z­2fYà¼mÎîÇW^:­3´<,\ò±s…ْ%âj”wånÍ ›{2= BŸn Ú¹š•§ÒÔ{h˜Ip6~ÂÌ¢ 2˜ +-ûF¿­Z½®”ô.…luP'ÝÝÑÒpÅ90,9ÊñxÍÃédÐüEnžx§Èæ(Æî”…ÿ¡÷—™P>øËH »äÿ=LKàkfÔ«Ah'·õ”‘ †+¸xú‘,;Ô9FA½ÜW§³Á¯½}¾v$÷3fȉcƘlöÜiÂB ©°{,,’/xg º¹Fî2OÊý“}Ðk +p g‚ˆož“Hs¾WÈϘ!‘{_û>D"Ž˜Êğu¹Çøí†ÏØ<α,̏F·ØªúÏ´£¥ño‹É6S®Ma¨«ˆÂhŠž“ÚH ä➀ýªR¨±Ä&[A‘aÏueh°««/«)2¥þ˜Ä_Íæ,™K…Å9A}“þéǗ%â9+å„ú Žd>Œ»ÒNDµNX{ù9ÊÌÔ±ƒùdVdŒ¦sր m›ÉÛ촋²7žPCÁ‘C?öC;Ö%ÉÛäŬ+R¢Ð8¡·ÄPa6¿ÇWb z_Dvˆ¤¾Óºf3“*°4z„xäW‘,åX–¢ÑÚlý‚ÝÈbև¢†%’"«)ˆ5õ» %êi5Y¹ó~3¾O“ +B!¥¿ñ ²•­Q +¥ÀÉ2ä@Žþ³ôË·çÜFöl}‘Kl}sa)ºVÚZ_šÙždIÅÒጧì+´Ç—öDâFٚšjÿ=t$0¥Iþc¼1"NNoüm´Ög°Äj4µ¼B†Wn¢qžz¬\†úlLaZMCërkƒXír/ÄE˜3¥rÉx‘™3¢SQ„u;¿nï\¢|} ¸ò‡Öª”«qY÷¨—~`?y,´EŒ©VGõ£vJAn¢ººfƒ¨ôù‹Tu5(16&Ì$íÅig[Šd²¿ð£1‡øó’ùÕ¡Ãí!9ó®-.aQÇrœ±’ŸœAטKÃLRnŠ¨;QÍC¥&OHQˆaÉÐaÓ#&?r’¥Æ÷’ðü()¸)qy$‚NjW?q4%‡ƒÄqk»ÀÕDƒ€åG’¬‡{Z^ˆ¦ÂÔ[/y6¬iqŲî÷IÈcÐ+Á;Üå]7g#è=‚P÷Çâ›?Õ‹wŽê!¢×Ÿ¦qà¡@ÎÀE'6Žª¤€seأ΅ +˜Ñ:žŽÕ–²«LP,ÂRÚ99„Î/ê¨HݱH¬ÉÊyìA­hÛÃRÚéA®ýh¥v€œ¨N²|f¹š½@`ñ2?õ1“›ŠŸÊ¬$ž¦„Ò+~§Gt »ò a–°Ö4ðâÉL7`˜ÊŸǽŠ96ä cC«2ªÓÈ4͉˜*ŠF/„eǛw0IÉÌ„DޅGD5ä™x¥q‚7ÕESE«nϸ¼DA£K“k0P qdKÏΦ("jö…-e9‚¢ÓÿY$ªLáŠÏ+w9ûNò ¢3qHÔãscü2ŠÿÄV­Djúͅ°%^¡+ªYaȟ*¤ÞÍß¿â)³0i×ë;Ô1¡ ’Ln;Ì#@wßjgç{n2YZ þ¤¸MåJ,¨\>{G t[ §0Y¢ÌwÛY3ÁNR…-V™ͦÄAº3äFö7^™gËôçàRǂ|r{4J,YP$ç¡ ØhñH5é"¸²ðÒåã§lŽÅ%E²ZI‚ÎùÚ| ³¡E¢÷d ±W({%wâwœ®PãŸ+È"'×}¶Z “C÷#‘,wƒi8cÂÓÏVÙdê³Øƒ›¼þôìOúŽœlÑȜ“.Y9JÄ +Ø\0§Gg]ñXÜ7&št"pØ!ý€®êÏ;á$Æãø H],ó|³ŒÝFÃÂV!ï$@ &´¾i.oQúoX¸ÜKŸ78×ô».×µ®tÇät7q}ôŸöwJÈ9ðéÏ_‹ÎYœ'©Öóqj‡Õ5•®9Ĥɖ!ôŸ›™L,h)¢Jù!¯ËAˆ8p¤kP m¯‘'N±˜8žî\)K ù àeJÑBH+3µè¬+{8u‹±òN¹ Š9^4݆&K9Säý˜ƒì3n”‘2á$ ¿·bir<¨uhŸÍð:ô¡[²Îó•èKË ‚ÑmÃIî1é %!’Z¶i …+»!²ÒÇÿˆ†(»c'Qy7°°¶ƒÞõj™#c¨L”„®É¼ã\«<&”Œ§Z&dÎÚË +·àÌlÝTiú|CۂX`›VoÓG¨Óv¾RÎ!p£È'SÇ t¡L¬Âï:BÐ&ó¥=Sx—<šDLc§:’UŸJ#_ó›é™]Ñ<§C##¼*±’!Þ¹9Ô)')ŸFU‘Ü6zÞM*ôyºDAˆ\ŒÜ­N×EŸ¡(ïp}Ïò9pžÃ%³à9á +gvх„¸VŒ¾v!Àº²BŸÞô…ýCވ¬kŸ^ºò°b ö +qºìJÞFK†®kXÌ<ÕÇ»n6I`ñ ‹ÇÖåú.Ád1–éz‚,å@ +wÑ©sëÆßêQeE}  ·W#D`I˜Uç|gÚk߀‡ßP7'÷(&dõ±â†LµÓÔeyö¿%)¬lö鏦2áPi­uMÀÖÚ{¿Èª›PMPqÅõ/Æ菿z>6²ûDiN4è¢À$ÕÒï bs‚ûêðÄ#åI7†2L€] îôÕèëd=’µŽ}…Ýßiæ©#žF®Ú™o®®8†P÷ÃþkÞ¯™^É蚟Ò×Å¥*¸ä5$UN‰ÇlhEžmY.Ý<€@]¼õ~\ú  ×Àr±ˆ¨dÊ@̀ƒiÕ| D±Û‹Šš¨4 _rgf"ØàTÉ(FH‡„H°l%ÀgËÌq]-È©–¨%Qö½8yxMÃe~Y–:8¬ceÝ.ï,U«Øý]®jµzÎÀX3J9? ÁèÄì ¦|L\‡ŸÊŠÖˆ0S|ÜÕ\ì D¡ÖyÁ’V"ßRÅi.î¡!Þf¶ ×(¶ 1å§&N Á;µì¬HˆurSP.>6Ž9÷Œ€ÚI‡þØ*å©‘†‹¢—4˜–Á\•Æ_:K˜Æ3~o°æU &N¡T·í(êŠsCÕ&ªá `…/il…ü]ˆMð€¥‡v£x+„£]8%žÅêušžóP€ekè30‹èÎ4u™rZ–;T ,Óâ}tpQj:øðÛ«•7ç"5<ˆ«dZ~`Á›ÖˆVØû02WŠû€`K]Æ,²˜a–.®¯ÍsœZ}_´[‘é`R„ÌÏÏҎ-û\æ ¯r†Ó¥Á\½Ȁ ª;ÊŠF™B̒;vkûôò½õ`àtú +ÏŽ©xŒ¢¬„M¶{?؛Ÿ³‘vPa+ށÏ7ŠjbKôÜzÛu<¨d©c‰«>â³Ua&)!ŸžÀñ>ñ ¾§_<î{§áŠÄÆU†Wá$p:ájÖôý]ÿ·! +)U dp³…K_vÜ®ƒï½ÿ«U©ü‘YBýd»9DÃç QY¹ä`8éNã½HØøL²ãµê¿aAœr•}9±`b2Wd‘Q É Ë•Ö@íǂKcÑÙlÇV¿A(É¿r™¼·Xãpsr’cÍÊ!´…û¥&?Véw'ÖI—˜Ü+X®² ÅVbséãB›ï¥-}‚óõs$sKa”¨¢ß½œùó°qƒ/Ò‡H"; +Œ¡‹óY‡ú*áწR†nŽÌ« ¶J¾¶‹iGý¸H†l‘\]6DR$iz>øÍ)MŒÑ›ïÉ9úŠõýқ:”КÓƒRK ŠiH KwlÂðçêëäÄG¯æžhS¼gdWû;.‹­×DµªcZŽFëÂØa{òZRµýô®K+0ÿ¹åÆ-&¸ÿÁÜܧm‚‚ø5œðæx„Åkð¦J}`ELû#`åéôµÔË”~kqØ?Ǜ3•^ç¾9Ïéh´áZ Ë‘É„½Ûè±ÖBV1¬¹b›F íc4a-ÉKIg{ú)Mµr/ =V]P·}Ùë LìÅ=lÑ·'cÚ¾Âüðú_¼žNU-ZÙ<ôP3·ú·`³R¯Gwc(ÁuŽîžÚX#!ÎkÎɜ³‰³¨²¨5(½*“,bãLt$´­á=©¼°'LŽ¨‘v!†Eš©a™ïö~n)j% B š@yÁip™ñÈ?Œà,”H‘+Èæ4÷-e£ãÃq0þäNfµË2ï#]ð#p9_&úßí)Ê-´ÃI‰J!ŽÂ.ίÎ+¼ÒÎó’  ð„­QtiÛÇðG¶nQŸ(²W°5WPæ—ÌòxלøÌNæãLî›;" £ {DAõ ²ªxôx¢Éc{’ØžU +â`èâŪëù<¦#Õ¾é.ß¹Eá®´løákº ÓèÙÝu°P~s I.Õ7:ÌÝc٠ސj«)é£dž@¾ÕÓϙ®5$á-šO‹½BÃc&£ø|¨CLÈ(„ÙbšydØLœPo‡Ü¶Úä N,ǵ$ükÆû¿Þ“~6çÄ^eRÕz¯$©’ ö`âb˜‘3®da±ãç™N5"z&ë¢f7fÑÑÞÕZçU€.ú#S²´ÎäùLâi¬E öÛ§I;d·)ìC?®¬\ø¶š'Q)V¿2’cæ0è6¬;ɋhöNà]‹AJ… 1Ë‘4ÀF˜R}»sm­äƒÜHˆz³*öüYÆéX‹OVU5[“SR’ÄχÊQTQ¬õË|“,ÑXŽ§Ž5«4ÎA†)iD‰¯ÛåÀ#–¾¦©LÊ^ú”‘£‚È%Êü§‰–屬)kÏQœç¸M3Sa~a‡‡“®,¥ ¿L0³±bf˜Q7.Ž]xvãB©õU)RçÖ+” ¨jY<²v1R ²‹açÈ[bZæPF3Hˆ4ÑíðÒÏÑq&‹«ˆÌ“ºwÎёfé÷#ûgr9.¿¸+¾ž[ÓÖv·Ý;ÜïS{ÝkK½Bm¡™û«HüI6sw§Û_'Ûî¶ê¾à=‹þÝeäàûv¯Áîn)€¸[ÏûÐÎdx°¹r @ð¾ÇÛïj½k=D†ë¨ù€ó¬W ád†ó‡ìrü¹Åb±X,–ì²Ì@÷Âa… …õeÜçðÈðŽØâýŒ?l…p,è£Ê”HŠ:Ÿ{j¨¤§ sð¡xHˆ„B!qúô€$ +˜DLlh¤¨xBœH£Y„a +bÈ8g˜I–WTu±]…Е{’oKp¥!Jy#GÉ +–“F‰ãõ¹'må áÃxZí*ÿ'¿¹ºãR]½ª„b–€*ûú¦"Rr¾u®ëµƒTÞA´êRï¶ÌQé=ÙPyš¦9®ÔE{8ì Eümò=6îPʘÇq~Âù ,é)|ôêYùªÊðZhŽÈ?7âÛ2JB{±æ§O¿š)#°¾¢¢r4La֝Jèø¨©úyôö«zÿÊü%vÛ+zV©gAe^6 F3˜ì5AÔÖàV1¼´ÒƒíŽ ´>²/0² 5崟vTM:šeZø *^žÀ‹ßžŒà«º •ÅøÔM¾¨ÕXèŒQ1bv$‡C—ˆ²¦cnð,YåB4L©Ø¹ïY li% ¯ Çåýv`áæ§ÈOŽ¿{‰ÃC–Ýì Š_}æDßÞoǑ&ŒÄ/·÷…ýÜdŸåÝÝÄ+ÿŒÈ®Ÿ¾œ1¶™klLj’® ¶ yæþkžˆ€]AŠÿ’á1dþ6Xz’ú8©Ví)¤Îÿ„•C5P^·a#{øwlÿ3f¦º›¦$ÈL±~´º/• €ôñx“j{î`¨ÁÅ#yŸ|µf¿›?qvÁöª¸=ºì«O¾ÒÕ3xaږƒêøBòŸ´ðèV(¡ô@†Vmj‹ù7 ¯²£[¤!vÉ#¨bÊt©†u YÖe?¼ÃYj]‹Z%Y0šsŒK‚Ʊ‘Z%›+OÇeAmõà‘²wOsügmÕÚ8>G9æÒØDÞúS|;&︓FbP±²Ì떧Uœ:ª—4W€­1é'C&LüºÃKìѸçrJ¢ò'Z6Ma˜Ldg ªþ0z½Üi+²W->@èKÍc’aÑ&Z…xnUpƒ×®8é€(®O¬`šÌ=–D¥É’šìA¨F–}?#vt$p]~)ôëùèL”üsþx“öÀmOþHEq2ohC21,íp5V‚¤Z-“ñ‹)ùây2–×s4g óè ×…®Ÿ¹ØatʲÖùïJ^U4&"d9Ÿáƒ1Ú)€ñ~{ ̄¿ˆdôc=…ËD¢Úú7æÀ¹óQQ5G¯Xr‰ +©UE÷í—ÁO¨‚Q -]YþˆœæˆˆF8“¶Ð÷[k ÅDµ0,(£c‰ÊÛùõ(ûà3«£gÀ"m—L=’¶¦¬›âcß)yY&·,+pХʚÍx Qý”¹$7µHT\äD –¡ CÓÑ+.%*„I"Z‹é÷1Û¸Õâ—aыtø¤Kߵˌ¯±LΈ©_¡b +rc ª/«íÁ½f¹MME݊ÙužÅ§Ê·…¨Š°"3œûR؋@3Øãµ+~W¡·…ØMÐqužú¡ï, èN®²uS sû)åÌܯˆ÷ڇQûØ.9aK/c¨ô¢ìÑ8²ë%¸½ýþ³6P%•AR²©^•£ß‚<Ò¹%ó +¼ä£0’{H|*ù;Ï#•½1nÙNx²lfÔùS-úÖfÖQEZ+8Mnt)ŠbW¤Óž +êà‡Aº§³K¡€ý ߔ?…| 5"÷H1f%n"xÎéî  .Ó2Ԝe¡t÷·B!Ë¢ç˜R¨¿à[Ó$˜¹s@Xä¯?¸žË#7 ™?ðzòØvh°Dñš9ÿ¨¬í7ìžx¤¢ØP¹Ñ“¨¿8\ +²JíUþ£ý^”(Ù±À%¶#H÷v +Hû¥dÄÇwJZö8þ”¬ÄÆïôïéiéÙÙIHs&ʚµ•lÇö)zAb·¨:ùA‹ÍP¤ + ŸvXî_ÇD©êŽ¥£L[œéÎ͉©T²ÑÂú_ÖxM‚ðDú_dƒ‘  "#žS«äRǙ¡ÛüªœãÜW¯òB¼ûîï ” !ݜöŠXº‹YA¥÷‰e©`ç tiw±×½}zMςÌ$Á >~”Ù9î:(:—ˆ.̝ùt.­VÚqlÖÿ„¾–5/„¥×d@5µizÊòðv·Ÿð¤ÛéY Æ©ðÁ,BmL¥4ܑçA§z§ãè %8ç+ž]€©K‘‡WêXÆ·”púc.å ž@2Š^Ò~§ë¸RhÚAkâ4w§ô/R_|ú«c|¸ÞnМ„¥¢è‹µiJ;F‚ˆY~(Y+ž°H•d×úøíxëWF>þ¸è7M‰pYOÇcÔ ,·¤†­9f.ÈÊAÉ`Æí4!®s[H<;×~÷¡ó½XRٜXl¢-jH§ÿEϞ1/ÊTð!;¤y ãà¨ÐcB¿ñxÑKõ(m%üÖkz‹ûؾ8{$8•ëšu¯øðŽúJOJÂÚ! Ž½Øêïq­„AÏ´(”Əf÷šÏðe”@ƒ{z¿âJéx@*Ãnz³·OÍ$ Š2| TÂ1ԍM£xÐ:®e‘B6µÐd‹\¯†cÿ4Y‡é|ùo@aê_FUB“›…ÄŁBU©>×·DÂQFdéØ%Ú=©å3JXè×ÁÚÿ(œ=봙§ÝÏP–LfÔJ/E}×rïíØ=*RÈÔÑ)1tµdzàÇê„ñBå#' ŠhQq÷ž"ÄY°ËV\dÍâ¿ì¢DÇ½Ó[K˳—1dçr<ʘÑx ‹úˆ“”¦¶Á碟°WwtŠAes’Ñaê¦Käfü1-x"Œ‡=‰Ä’¡ÍWZ︋ãj·¹áKŠSz89 +¿L´*.ßÃý(‹)å¼)® »»—¤“„–b4˜ÌŒáÒÖ¡à®PoՓa´¹ùR|nX)ÑQX¼Sœ]b ´!_MqÍ#¨×l¾˜iå³aålþÏM‡M€— è’Îä¡ñҋ´ÏS[ìŽÕ¥AHx(‹Z¶5‡[nâûÙÇќ½tʈ$¯‚ÑžÀ+ ‚ý”¥êayk¢$3ÎT í+w´ÐìòøkÛn³ †åþ²¿æ0ü¯ö²¸6rü!]; öŽÔãXtH¼vmÔ÷,Ø|)¨ÑZ>š~À¦(“ƒ%(“¹¶`ÛF¡…Uݾ {jJáòÝNª>M?ZÍË£âË®È +ÎÜÖÆÈaXø·báôþÇiB2 Éiwî • +'Íc±TZÆç1¬•>G®êdÂüÊñšçWYȸçÈí¢­p2œ{‚ÙŸÆ,ˆ.ßp<2‰ºÝÇ£~ڃñÚׇÿ£g0¿KÔ6Ú³¯ìOGjzs;rŸÔàGƒò‡ê:êìØPZ¢…ì7 ('c¯˜¤ð"\oß=օ8Ä~L,CÕ0ÉQÒ@5`êã\#qì[z÷¿4v­×T?V¶QðgTˆLå…¢ ª³ DSþó}\\¤šgù”¹Ïdú!ÀßÍw§zÕÆbÈ‹ó¼&4ð>ÍÓðXՊӉOªXÊ¥=CʗŒQ³üšÇAþ¬lµ¾U«‘+b•Jß¾ƒ8<ü©Þˆ¶£T¸Á¥„/ڐMçri +!” ÛÙèY)†¥tv´$š¹me[î#› ÔŠí¹ÄòŒ™ӁPÅ&·wÇr [¤ñŠ£àðÔó\,| +º› NaäYˆÕ=9~) Ib=Ä=©Ü½<åÉ|-·ÃdFØ¢W5èÀ—1GÁŠ•¤¤¾?¾°ËiW ’Ìý:nj…J %ÂæÇxYaâA¦Òª”½¤HOå±ÌèÅ3Ç#Uqɜy 1ö4ë;{ ðªw° ìI?±2dÉõáÜÖ­­mºÉaIŒ§)$<¯¤É&ÎdÁIB”…Þ(›¾æd¦½*€ÍõxÍ­•$Q–Ð ¸®…)o‰£&‰$r¶J[†H¦äŸÐ!ºVa†\S\&)ÊFˆFõÞ í/¼H +7F VœÏŠ@1{dˆû”‡Ç }ZzÍèCy˜àƌs–º4«YyøÚÔ'Ò¤Q‹æ€jâŽK}0"r¨@âht*ŽŽè×È>üX­~»°,—¨ÑÄd¢ˆÐ“Ãm*€É‘´z»k ÄT\§°Q\kãÃGÅgÑÑ Ñ—NL¯‚Ì7»íûŸ‹6,Èz©C˜ÅÊˎþ³¯ +}r¤ÛqePìUÓÛF˜|¼"ÇJá&¡1רɧÍàœ£”QÈ] +ੑߪØÑÅW6IA {=°2¾÷ä9 ‚:ߝh§zy£P˜^ð¤áæ„® ÁX9ÈMwfˆRG]ZP"ßæ5&5r§Ìù•ý(½ªç âý¹qt>2tÑH<1`Øđ©ô=æFt +‹®I}1 Œ|BéÇ(ŸM¸Ã»[Õ1V>êÆãèòXÍÔöQÄcäèCPÔ=7S‚êZryGpÅgé@j"³%@È:8tÔf FÿÅêŽ^¢ÙÉø›èn/ñNnèiyWozø0 +ß,¹Tœœ&’+äômc-J%Ñ3: Û-~ Å¹ÓbiÛ°{™ˆ‘"„7 ’Tl)Êàìô5‚µ_¡è€xi¬ÿM‚ÉÞ¼‰zµ: Ӓ6¢Dã*.èwób‚Œ¢ +WpiÜ5¥ñM‡.ª(ÊÎ|{Éî/”!eiãöŸwE®Ú’‘¢{ `bÔÕAð¸éÀþDwŠ)_>Q¢H(:D‡ÙâلPD¬%@x…ƒ¢‘ÙTµXÛ¡gˆr1¯Üúk/Õ°Hå#"¾$1 p|s;DL™%ì:Q¹3Ø'["^ð"'H¨§^KäãÜzæÆr÷DÌyÅ= jë'FÁ‰¸‰9 ñDq¢CSq-é9 +‘³m½Û¬–wÖzóp—°M¤sb[b'҉,¼QxòW¨¶â"»È"ª½ˆÛ>Üìɂ'wNôîáE ôÀœ¨ñ.6˜…ègÑ5±¢fE‹ö—aš¨K3;‰¨ÐOø8EN_"ó8*ÿ"l À7{ü*›hH¢E•¢ÓFÅG‘&›Í¤c‰T*f‘1IB[ŠIÖDƛİðíÔEÒ +&‚a¢°Òt¤g·)¦ß”°Æô£JJºDV9\îí+ 3Ë{M¢TH^KÄL‘ˆìØ=¹O5¢ñIÒ3"Ü3¼FjÑ{ÙÐNtÎλB[ìA¥ hbÆK¤-Ê\Kµœ©Dý킀¡X*‘G¤6¢EÀd¨!’<JCh *—Hÿø‘SK$ÉÈ´MAدp‹,x„áíݪZ¢j=XФSÚ,‘|¥<îá†Ù^¡ZˆLª¼þ'©X9÷à^ëÈöÁƍý‚c/օT¢ʵ èt]¤2‘yÒfoû»G‘ ‰V s]|q=§Dí0p±ÆDå@)Qç7AÛ%J~¦ íÇÙ0àÎ …ŒŒJÚßGƒÐúÑs„Œæ`i@Ñ'ЖɃЅ]ŸÉG¢WCóê 6” ÀÜ’Á¦J$ º±wId“ê +ÈáH?ߝ#ôv„¿çóì +TµùA+¨œÒÚ[”DëÓ¥J“òýÁ‰E1²?u<¡ù(@-5à—†`2E`ÁPüdöT;ëuD8éò˜PðŒ-'¼-I~óF´ÄôxÑðdôë „…˜SÅ-7óvª6ï¥ôñ‘â0;3cjhW Ûx‘x0ˆ(ÁÛºÆ!:y­:Ԋn;Է͇Ã&@Qi7#,6:"E½4v Æ(¢–„Îkœ¸¶ÀÞ'G¤ªkÛôPB¦:¤CMµ› Ã5mÛ¡üm+>”i}©," AA¤«i¬>Ê҈ˆµÊ ìV’gD»Ž$5{×lO•r““Œæ¸x¸ÒM­ç“‚Ñ^ÿr#"‡ÂĂˆ×JeÁß0‰Cй¾ÅV  =byTmYwëºÝ¦ˆ†Ã{ð#Ò xÉ`ü¯1("Õvyú:ÚJx9µÃÂߚAá“XLDE/!ëpµ‡d¸×ÔíÐTþÎshˆìoœ5D4Û&”/‚ˆÔ÷°ƒÚ-¡ˆür¿#dñ!²ÑñMY=D*ÇMÖc·†nuBCúÃnˆ–Àõˆe<¥@ÖØã³R2nÂèÒ®êDÅÒg5H0D¸.»Å·Ì^ˆD@ãõ‡–#y5áKό´jÝA<J‹ $nJF£ü·“]ÃF5…TQ!B1)‘|ÛýÂ)›Þȓ[v— Q¡„è" «®±‚”ò,C$BT)þ<ˆ\@kÀûf „ÈŠÚìk|)…_äšZ.óÂx®mŸTe¸Ì<”lêM”ynÿ ˪ „@­‰ GºË%aó¼·ù—؁ "5@×Ïû‡2¨°=هðÑFÂy¨ ;[‡ª\Ø6ŒC ByDԑfƉ¢*½µ{7T¡  ®K¾æïRš ’“è ó·£-Ł°͇‚Ó<â{¿µšQäGøJ O£iO }ö`kð+S­¶7r,‡@߇tL MóM5¬a’Q4&y3Ìš‘þД±‡]‹\.ŒÐÇt©¼FÈqñC·)°3» ñ=´Q ÆD‰dŸ¬Ùâݨn‘‘,Ï »*» <4mþ\xÌÍ[î#e>4%‘636P?¬·¾C\l<ûćù8n¾ð +º)“MíÔTøP0¢vážÑ¾‡Bò-Ða%ï!¼òŠj BO÷€Ù(™†Ù¦Û—Bö”¶‡-ÁzȜ0ƒë%JS.[­C…JílQcǏuhÿÒ·ß"¬é×£kz‘´QSFLÖ[r(´åÒ#.OäP&™^_‡Ê9RDîbŸC‘dØíJÔ1µÅ°#‡ÐÒw)íeÖUbæµûÅw ÝÃýUÐl¨žš6­PE•…f·Š*˜zLr(û™ßs–ˆ$CtcJz‡Ð‡ãÐÖ§>sj¢UèMò{Xêi+ŒC.&¨±sòR—òK˜,³à5yi0D>»¡8"Í Á! o¿‡(÷6ê„øƒå">JF° µK»ø†h&Š,=ö†6‘ÞÐal³0¼6hC¥‡7b´ å vCŽ“ªS!8æG7â͑‚pņ¸à7W²ÌgrCH8X&MSôö㶆h1YC‹u+µ' ´c5ÔZˆ ¹Ì” Ñ(È˜1Ȇ—ãq l¨[#«¯¡Éæ+È̇Õ–ç5„÷dûŠµ®!{ÀÛ7¤ÄTq q­"0ße,Û0|/AEÕCˆ³mp‡zè6Uè—Ca³¡Q†8t¡Ñ±®Î¸¸9ƒ&ÎTÒ³ª¡:l!äœ¥Ñ †jèôæ s€“±uŒ­ž!ANJ½H¥¯c*Øg« 4"݁&g/PÒÐÛHð´¤Ì„?„ùQ4tDUÈ)/3”…¬ŽA¾‘ÆY"4Ô®½Îç‘(’j4Î@!¼ +@C¨‡ëä K-â +ÔmG…ò܈º´34Tß%“ÆP5à Âl"Q<v¸qú´Ä` Q{y5»Ž™] QTa¾TtlC /ò1þ%Ì}¢?80dwBhR‹8ûq:øªZÝÀºN¤N·Èؖ®¤c¡0DÕßh›à†2BS±Ÿ‚ƒ¡ãóN¨€e½¡4P‰ÖO ++ÛEqç+”é÷XoFÀÐîÖWWT õ̜w:æȉîxKc…}!kK …âi”ò`MpSaš, $l-yFµ…*ƒ B#b,Q@…ÎÖB?B=E<”š"ã‚̽l­ÕÀË>0})'\ˆ5´ü[ˆfËi™QÚ»…¼Žè/QíB™ùō)D½230×¾uŒói"–Ç‘v¸Pð6RÅ!k… HãAY§š1³vÏ¥—®¥Ô²hd"$ÈÄv:m!”«±G4fp"አjÔ¬² ‰«zʞaPº1/ß|¶µ­«3[ߛ"¼šÊ‘·2­3D¨ŽRØ®ÅÁÓÿu7ÿã= ¿r¿ +(´-mý ägÂ,ôÁ7PzÍÆ ´,Tm;²ëø9DhSPkFÊâ}à\YÆBô5%#‹©˜÷ æ¥Ò°@óðǖêƒVd´þš°ÐŽ£,TŒïT5ÅÀBÑÖÎð1¿B9ø©ê%_¡(ރÄ:À{ ²VZ`NI’è-Tip,¤ï]á²*䉡W¶»Ñ Bd(Yf†}ò`…ÖI¹bÛ°CïKQČí¡Ò°z"£lÑSò²Š‚e*!tܓB['GàșÄï¤Ð/|˜‰WÔ¼sÛ†Ôƒ4Á8âC€îg•h§h¬³)T%XëdÝ™BuY§Â°À€€ú"Æ(…¾¼6I6Ò¢ˆ?!¬gRh=ïOóFhï9>æ,Ý÷e*#E£P­öÞò½¢´>}:! ô¶"%tÂ!ÃќüE¶—39Þ,˜¨Ï*4Ȭå$zü„ì´Yç*¦Ö(0”¥lÖß\¼øŒ˜å¿Oòð m³ÜKðÁ,é Ñ¨–Ÿqç…/Ž¡ +ŽØF†q‚€PÌ$ì)Nf“h«Š­ºy‘ÿv“:Ñ !̈́,࠘þ…mSå ºÐ\¡,ŸË«“6`tY!¨ Ⴒ™ýûɋgBB„î˜d/•ÐF×ʄD +î”Pœ {±ƒ¢„´íq NS ê§/+F‡SâC“Ðq@çUK 9ª¸„8Bc2‹1ùm u{U±œ–Poӑឲ„jfà&ߒ ¥ƒU‰Å2 +Ha[“À)*!ÆLÎq5õ Il%!•òÅÝqbÕ6RBkVØï^b»ªÊ YD»4¦Iˆlxñ(o0 ©“ÂAè@ REQ“ dʤîÑ $Äj€wh¿¥™b”«¯Z¡H¨ò9;tJDž ¯rj„VB}B$)CB¿kÅà¶qAV°øÙÊM)ZPlè5ÀØÒN0 –sk⚘؃F‡§!8ŠV^= +Žv§!ÛóI몶—« 1ä°Y,nñY;¹2uÏ(àþŒ9=ÓÉ)Úú›²½L”A*¦úd5íÀª™×º ’dzXÒÊôHJ'bk·Ãçï&ð°OÞnÉÐfÎAÇ-HˆžŠˆ=οNe¯Ï‡“=ý¾ ™”rCÒъrPÎçør>ÒÿõŽ=nÞéØƃlpQóí¸èÐ +j*xžô¹üÄc¨Ëi7¨zꎈ=®‰âÑa@ˆHÆ\XÙrÅU0õp”òè±åžàë/%ˆÆ=¨ë5(É2=»(p Ç}ˆ‘³Î Êæ6£ç†‘$×8NÃÒnòíE›# +eœ{”v!¡4¨Èƒ;«T;4"Z QùPrZ?<”NÂBÚþ2\èÕ>ür·Ï;œgP©³âÒâÈ:ƒ,W…Ç” w‡ÿ›œ©‰Ð—>k_{ >%vWË2èáÙã°3¦Ì|9\ePÏ䓥Ú8”AÁRA „w3774q„ºRæ8rŠÈ ¹‘û úP€Á +˜]öäÄÆ^{€ƒÆÀX Hª5M ×å%z‚¨c bn©: ßj±¼XÆlæ; !„ü¨ Z€IS¼qAM¦Þêü‚СôE_®ƒ•%ä ¬ƒÅÄ`U+(Ô4W­ÐŠÚ^ÐEˆ&¼…X 5Ö#jt³ ’¤í4ôŽ«.h¸¢ðè‚X¯nb.¨ :=K-’ ž·gŠ(tp Z +f²T¯ ²f¼Ôäö q E[Є:LÂn«/ȯÄ#§7’6ŠpX)Wl£Ž¨‰mµýhl’Œ¡_…›8ºÒ¡&G:舋¹ÍÿR(ùç98g+(O+oç!é„ÈêIå6üDÊˀˆí3wŸ£”ÎDFˆDŠð¤t=1«*‰ÈÐxjUÐß;:¸•7¥´Õ=(B'MIé5•áR5p³U‹-]  K÷&ˆÉŽ±IU­`€¬õ;辤=ÖgËéí­· ¢ +Ngԃó&%ÂSŽ!ÀCi…;å'¸÷‰w”¦®ÿ¼ýH†œ bÐô"Ó±fD2dµn‚pE2Ý8õ]¼ž÷¨5Þpò&=PœRÔ÷hü4Á¦%hväÑ ™uÑÕE)ø¨©ÏŒ•78Zvø]©”òûä5n͒|åhÈ˵»O = uæ- ©øDopz·¦ˆšˆ ´ïÄR€DØ^œøÈˆn ëœâD0+o§¯¸% AÈõ Cÿ0L™èh +MA1‘àå;QIò¨LjL‰©^ús€DðÄ5™Pô áa¶98‡ Æ´D6mó±ob™n øƒ¯ HC H?m$»ý@@gäçŒU2f¶”½A›VñJmOi\šz8㽉Cú§©ÆB ¥dFWÙ0'4unK(ì³Áˆaj°iÌíö‚:Cð•r™žTcRŽxèÚÝg=T]‚<µn×ýió´]êq7¨ãåñ±@m´ìGÁKQ-iü4Hçoi¤œ7˜«(í@>Îþ±Ð‡›¦‘£pdŁPó4l̆4–î Q°®ëÚÝV'IU5p_!w[kËgâ¨Î6&æ@‡÷YŠÖ‰¼E9К> R]³p Ï—êǁ÷eß@(Ì{ó¢òã™3  4çÅÌ«Q6Ó +8Z“18yÝa=«»àåZ›ë4–TÌ=.'.%5 ”„¨lâx¤™Š[K‚¥9Òè—^ð=MWÖYüðX*DÊ@(±` Ž)­d ¿:ÐÇwSáÃdÚ¹†H*±V „БbK3¥¨»92—¹Sǁ_ ¢*{¨?(¢ØBüq´ÈehÅ͍Ĕ›.Pùö;åÝSÏ~‰mF›ž‰@ÕÈÞg]#8½g8 gÊ¢°·ÖÌfcöüzpV hhÐGMõMè4e +­F ”FªHt÷j)¨ûŒí´+„†»“D)žÆRjÑú&hœ@,³W@Ig@æ“&ÐZŠh躼.Æ’\çUy”<;÷VÑ ix­Þ$PŒå@MjE'‚"‘ó’€P8¹¢¤Äõ…ÃÐR?L"~½óI‹¦ø/ÚµæÊ2„›¤õ.ŸK×ç!I ÔÉ!Ud Éy;qÙ¥¡!j(¤¸ƒÐ:?3HŒ;ÿNJ#-ø°×5 åN£hÉс¤?臜~°ruó¡­N4Ì϶÷Êp#ʦ¶Ñ™Gõ´*¡|é ¸÷j +1°8¬IIêÓo H’ˆøÂPfg@dZv¯fÑóexcð_©ë²ÅÔ J™:ôsN@B©D‘Ô×Bã»4ôØ6¦@ðöLƸÚsvx^„‘F´´ȳ¼’‹Ð,³š&2“-* €¸)c(‘¬,x,@4cå/ù™wN@huI˜, +þÀ,80Õt€ ‚@&æWój"F¡p”[­€=%ÒDF@„b„…¢(æTÝȐwAùìÁðG…ÿ|€ÞZç)ÞRZ=@s»¶SVÃÆD2Æ'ÀyiL@9ºÆ¢j”l0¸¾q@Ædì «¶O¢DU9@E—¬å¿O«½IŒ»é/»l°U’³¡}Ä~tJš´Ýá«• Ó‚ †½ìýçóN€ÜQ@¸l(&@Îl$}äÎ|ÈÛÄRûk +Ý_2½]’5- q6aYfÚ²ö.ɈTÊHùÕÑÕb5­¶5™§è‡xd6>3ց…Î#Î+‡ðí†äÚ~c{¿íJÈp.ØM¦ÞÿpgÍšrA3Æ˃âþ˜/ég$¡ÒâX¹>âæ +€R.G€?ðLXiÝüiÓÏÞ,2_ß3Lv^>0¯#Vìï¾1Yüÿ`ß]RgÂ6íR´\Ú¾ZÝ?Ð/b˜ŠòRŽúní:w”ÆÆÒæçÃ%EU{Z?£Ö§ï"¬ëëSgþGÁÑ%»ˆâëʪ±(·&„;Ùþ±ï+èñ£Æþq²þ“ñ”òRÿÁÿ¾À(¢—þƒ ‘‡YÝm`$sæb„óŸ _S*·%ÅîÓ¤„ ˆ³ªV®;vvú=¿4øŸvNõÎÑÔ[Œ´êþQQß:ÃÂòã2gi ȯéú‡{ƒ÷z¦<»ÍúGÑKí[P÷n[éB`á;Lø‡dVîpΚ…ì3)¤ìçÔLç€ò¢¨Ø$„§AaªäÛYZ?ˆ¸*ŒÍ©rþÙ å@Ç"aR‚­ég ù(—ÁÏãæ+ØIß'xªéŒœ<¡ŸBz žñÄd{ԁ‡¾ˆ£?Œuز¥%*ý¤ûxBUcuØÒÙ!Š{¬ì192hø‡Øl¡‚Ö÷©‚ þY4käÞ([×ZXùþÈÀ.t>ŸýÀžZw[FŸñͤ?ÈR‚(µ?É$ۆWà”iÍþœ¬”!ÊôG#Øö#œ³Ã|Ѷ‚×àê£Ö_-îÿt3Dß1„ ðdõ\Öq©?“iV˜¬ÓŸXÌ·ûoSËLPê§ÞW3¸ià.ë%Ûo¹Ëçóًü¾tœ +ý}×(ã¨L€þttâ|(­,Ÿ??¦,! í>œàú÷UFÉ4´c A€âö§Tk\ÈüÁ¦2ÇQþSÝò!Z÷“xø úBº8R¤]þ`…ˆ^~¹v?(çr´Ršbùï<Þ,³_ۈx…/ТÙié¦5œgšøý,á:‘w)Ž?Zï!øŒp䢓ÇÀwYü¦©¸MJ6 þEÚÖÈmðÇl§l‘+“$øS¼òT—à ÑDÀ½Í´ç4tø™½ s¡wÂ8‘¸öSâp`ú=€ÄÞO¢S{0èš?hÝÄü‹›«õó_þ0§9Þ6~`*ü>’a˜Î¼ÀûI\0u?Hܳzi P¾ðÆè~”:ñ-ª.bîG‘Bçæ9¤[gíðÉý …#`?Ú)¤ˆ–U½¾£—iá§nð™ãýG“ ö¾=Õ|¬þ‚ðS”ÈN“”ÉúáahRúéàû™L +íŽH–Úh]Õ ]Ÿ8 pR­õ­O«xôyZ€Í¦¬M_žŸ4O¨˜"û)z Ûž2ag˜¹Æ~Ú*)ƒ±Ä~h?é™ùta?{«rÃ(±˜4ñš¯¡¢'i]?Ã6 åÁ€­$ˆƒ¸ 'ëo²)ÅtïYæɈú7*©™I??׈Ü=?·Ÿ~:âñü”G1ûQíw½´š·¸)á}µ[®Q>ÐÑO) —7$9¡¢Z^’Øö±e÷1:¥;&*Å¥äÑ> ŸæÈDáâօBoi|üdܬ% ÏO®±4iEïý„HȬ œý”~ÞñÎOõï‘'f(pó3r@yêʍÍÏÜ‘Ð/r5?˜SNÞîÿÙÆjù!í¦‰X~8œ7嘤QÚ¾ó[ë |¬¥üHþô‚OOÏK.1¡]@ď-{ˆ&Ÿe"?±~Òã%–´òÓ«§úƒÚ>~òÉC`TÆáñ㾌^ÙDæ:~zÓ요ø ÈŸsÜú¾32ÿé¸úó@wH,܇ÈJs„Pñ#8Ç‚ørþ›}– [´ c5ûTŠaü¨ª¯0#Qd§ŒÄÈï“ +ªÛ?ªvêòû4AÖ æGaáWaÐEô ‚JÊÀûäi¿¼OyˆðÃèÜ݇?Xü%{·çƒu÷1üfi»®\ û>úN À £îÓ£ý%(߇ù¦³G RSïÞGdã¤pñ ÷¡"<ê}„#iZ3÷I15r%cïKÞGk#ˆ÷h|¶žC7-ŸëN3N²,è[fÕ1°û”3œn@aÝÇÑJGÄöá Fהqì&– ûÜÛUÃæ£c5Ö?ÌêSaÆ¥…ϹOÄ]¯ŸeYŒûô~s1M•©÷AU¿·(܉= ÷yšƒýFÓ_OVŠãìä⏸qãN4D½¸Ìoô'·©ñµ>+J†åÜ7¸öáo¶ü—Ùž\ûš|¦€Šh…5áÈ;ƒ†j@Z”™ë3Jø›}°¿}Šº8ûԁ²f fØ-èö!>Sö‰‹¤6¹>y¡@G# cŸ°Uÿ=}cmã ç¨Gx³><\Ð%ÑJM¨ =Ÿ> É?ŸàqUw€ÛYJÆÎӇ73róùSŠôGèQºúÀ1«Òîù!8¼yñõq +[`ôüûró"z‰ÁÀ¡+Øôè%DwBéúÁöó´¶ÔgÄù¡.K«XŸ¤_ƒp#—#²Iš4ú”Ý|†fÌ¾>¹`>#ôÙmI¦Â_L•||ÛŸ=¹rE„YӉÞSÿô xMæÇfðÍS×YªÕb0õ)0ókEÀw9¿0G6g´ ™Šô¡'ͅú¬Â„]¾ìêÄG–(ók>Í* èáœ>ˆ 5ÑGǐLþ‹>ÄÛ>a|>I<@öX¶ÍÅ@ÓǹÙ`YðÕ=cäq…¥ÐD5Ó³Aé#`½åZQ`dŒOÖ¶q•“Ïž5°&,ýX„gºó|‘Þ>;7D¢’úaK_§˜£ÄïÃ_ úÔ6 5ցŽ¦çV OËŠu§ç€>w(î¿tÏ~N qþKòò·,Bʇ“é#ý ¨»£íΧf>¼é ;Ÿ¢—_²ôÃU>Eou.Ìñ1Pld#¢ó™•aðè.œOQÙL8 µšBvF]ęÏÕ'ã£.rƂ‰67Ÿý“€ CU¯f ñÕâ vzTK>žöžîŸpO©;5µöh¤¡á¼Ïd~ÉÀf&ä°Z'<¨µ”aêä¹2ŸâšÊK؄7‡È˜ì(' ¾!y\5|JjÓ±¾|˜5]Ť‡0ÒI才¨M‚[&¤ÌH +³åÃXÐX\[<¸°Eé뚋əÏÂV×DšuM½ìKp ãšbr˜…ÆÅÐS%@C0Ð"][Èl¼4ùÀŠ‡š|†¯eâÓÃÔg#K>ÎNOánE§»']F>,÷Õ±ñD‘Ûç«ŸNC§ÚËDG"ŸI·úFºqC>Tæ‡,„|N)nQ(Óÿdí(;>©þbÎÝUŽÏQl}­Ÿ;ƒ¸f)(ǔ;£t ñÉD#U3{·çê'B *RÒáßÁõ7ìtÏt¤ÙU`I»dø$¾læ‡OŇÙƞUO¿ŸÊã„Ç¿¡øØ]¿AÅ°bœ—³uÄ3ñÁlµÂˆþ\‰í%J™Üz«ú6h÷k@|hK¾|ø(?0øàæj*¶øüð~¹”‡ÏDÈãHL Âï«¢÷DaŸ™GÞsæ7¡A" +W9O¾ôòÛícQ~Z„W\ >8“>O[ðÉAvç¬gÅ°Ì"Á§†Â–?>ì;ðA†.>»fúTà“=sÀ‹¾ù8æDÐ1Å÷4§Do!¨Ý-#ôgÒDzý=1DŽ7{^eޅJ`iô{D~þAyߗð{r+ª,y±ïI‡Võ=àœúV5ô=x¨îô1¶üäuíOŸÇ£Àä{J#Ž¿Rr$ø(NfñBؼ†–R:Ë¥÷d +è=[e\юŽ³Ë å=Zh²Î}¥{†lÔ} +1º‡Ê³¦ÏbÍã` 9º+!=UÈfuŒƒeq´ÝLÈ=F‘ª÷ Wö$Xv“ã‘\÷¡?ÊøÅmÓ=ÔGôX,d„¹³/›¹ËöL*“=L+•–uE÷tÙ{ m%Ï1¸'ylà{û¬±œO6Ø¥=ÜMì;¤âò9IÞî“O»Å(ÕmÊ=CH{Ÿ}H€äžþ”›¦ ÅFƒÜƒß  °ÝqOÝ~!«.ÂpOe‡Ñ¿¥ßyˆѤríi¥ã_Ï"Z^‘çÈ³Ç 7Ê<„IÊj½ ¸÷·üö Y_T7pϞ´Äbe»=[‹=Î r{Ž œÇ‚n”n{¢1¡ŒEiÖC^¨†)êR·l{´=ñìa{JxOVšC©Ùfbí…÷d‹`™ÙšjOqPR:Ó¤PÞ¯´G—‰àPvŒ´§Ž#L*Fm´‡\аó Rˆöðì#TÚÜ Ú¡  §¯_}òÛ(á í©—^Oå¢Óêa¿T),g!¯„ËdÊê‘#déÕôàõq¡ cÕó çyÛw"{æèŒÔDB³YA–=ƒÁXì MF¸Qo”=bVR„èiÒZ¡{²|Ád-zfŠó ˆÓ³Ø“Æcs©Gæ{¼ºˆ%ö„hXê&Þ ±çgÈé°G»EQ"Î,Äo+à›9´â\2{­üÍ<{ö~Â3æ ÞtTOÆö×ÏÀÓÔdÛÙí鄍—Ã$zèÅצ?&Ò½‹ÙëAÁl==¨y½ÃwIVS/Êj³5=b.¥||—rP +%n=æ[º8˨?q¡±õ„;ü{Æ"<Ô¥œß†jÑaiª†ŽLå²£~4--'u—ž™™ùëûêQøñêA%ÕÕq 6‹žÓIÏ¥6à9©b¤\]–GÖ +'è· ‡ŠÄ@=^õÉPmüô ”=õø€K2k“¤’p;CZ\¯^œ³Kêz»#L'¤lPbàtËQO ñ¼žó—¢œ¢m)u%²géÙ )ÒÓ#,ŠNªD9„Oé¡d%G øråá ôœy“Rô +AJÆ (MÁa¸=X©gó‘˜è±3LÎóÄ)X4½ßk¦§Zžg „ÉôœÏŠÁò‰˜†¥Kù;ØZzÞJ'ÁZbKOü$‚굑¬xòHk¾PžÐÖÓ³®e—H•ž¦DÛYLB{]è¢g½ù…“À +¶ ö*éœâ\Á¢‰ž~L÷"ºR#=N="=Q’'¤GTS¤«ùH@zæϊ70+£öÑC +N÷Fâѳ¤jÐK7©sºœóûH¶ÌÁÙï*—°è±QÜVFPží“I—GZ͂ +PÜ)¶kï1C¶”yQ A¸>ëCF?µ3Úå¡©¬ƑÐsÝyÿéÎÍâ>ÀpëÉóP4LŠ ôÄ>Efk̛AKÐ*R ïëõÆã4OÌ«1VbIÁ¡“ODícêæÍí õ<݆ÆðàZež§5Ãp^ò>6 Å'Qmª›äOåñéuH,Xc¨å¼ù„B=xµ±8ñ¼Dy®Xxr‡CHí‹æ|ò켍žÜ}&‹y…Ž]· A.‰yÃP°ò`¾$­’ܸv=dò ÄAäIõòŒ‰k™Påi’fð;y¢ÒdwÉÓZ$ÀìèÄVʃèkÊ¡v•é;†Qžp0êÎ7™:æÁÃí¿’\ ˜KSíowÓVD?&0 +>›ä©#ò e®xöG>4¾ )a‚‡üÃ,ß¯ y@Èß鑇ÛÄchý"—“‡#êÃhÀÿ.ÐYlG‘„ Q¤³8·èáA‰õåqÜ5€ÈƒzÊÀ!ωçiÏOgÈÃ؂RS¢‡ØH‰L ]'rŽ'ÁFÈÃpÍÙb<@«n TF¹x¾/;<,€¨‘>–ú逓ï'sUÅ/ïôÃc·¡Ñ†É†+tg-å؈`.ÏCþ+!Jw<ÿ]G”1oæ ¦UҗODñÛWõ³Óü¢!UGûaÁÇ¼«u§Ä9iF@;8YtÛӈ 9ÏæÁƒ fäÆCYRüоA§â&¢`ãYîá¾0Ë<¼{¿#8$§}èHãA ©,Œºóú2w)ì¹­9ÆÃßb>ª@1 ž.ÝpO8"Æþj Dé˜|jñäé5ve]ñ|Œ+²cïŽ&˲ðƒŠQñÔ⋟(o˜ÑÓ J .>€nqâa“æCj⁕I-òŒŽùÔ,Õqx®*{S2N·guÄãuÛIPB9ԝIŒPç)0 +5 +i†x<(ÑVŸ5„x<åƒn-;aAm¹<¼L ½l‰“×ñ“ÒD‡g`¼D>VÃQ¦Äª©”ÓV¨;äúÔj†ÃCÂ8^¿c3v#£MrnxÈcQ¸osðæHDÚº¶ÕÑkB¾húÁ3rsÍ¥å`þè%$¥æ֐²£G2{0(]ÿ¤D +’cNvôÛ0/ßÿÙ 5™EÂC%ÞO€JwÁۄ"xø-t4Ûï#Èc<"ûÈãÁãB'ðÎ"¾ÐÁãÂÚ1ãFØ/jÁÁCÅiQÄÙi‹¶ÌCcý³Â õu¹Æ›¶ wšÂw÷ÓxˆCmÆ1ÿ›žúGÖ.æï¨ÄjgF³ÓPxSrgäî³em¯'¹a^ýZ.¬†Ïï"!O€)ڏϻ€é‡r +àÁÓã;$ôûÎó!2X«Tò¿·æ ô/#ž‰ÚúádØäWñ|bšL-è;ӎS‚¹òw‚{C  xê¬0îwËl>+ùÀ~gL rhF˜›ª¡ñLϝ˜žûNV÷N?½Þ®Ÿ|´wvj0èï8oÖÅ©ïR³ï‡¾ód¼cFl¿ƒ?‘À?IóŠ—6frñ Ú{ÈwÂÆ;mÔn¼&ŠeY¢ÈAø΍ãIIê\FuÞÐÌI8Ÿ¡gX•‚¦'І½3F2”Gy¼Ò¨/„ÊÈdV¬Ëí°£µxè=æ‹ÿÒ³Ó°ï¢w#K%'ô å‘`AôÕÛλ‡,¹ÃêþáH œwzÒ¸¸£ÝŠÙÝ¡†êt,§—˜EÈ©ÊAFǵY$\Ç;¶Y È;_Z1©ÀñNXet¾ T¼3Ÿ¸ó^Øè3ñNíÎ;Á‹™Âî@yãÙX:§ïx&ÛN'úhG?í¤š^wèYˌÖéߝ^y˜5œ»ñ÷‡xÝîD†MqJ?Jº“Péo¶<ü\Å; £è¬ØÃ%Ý2ª¸z.Ñ¥K¬`w×Óu odŒÏB$€ãêÝa¿’ ûwŞêN ª?å[ËPê5ʨ;b¹Òoáû̅>õ³-F€m²ÍÉmÙU†’®6Z8?¹ç‘ ýPÞQƒ™q€7j¿ËÜi¥é˜;U͓hªG#@(xLC]4Ì Â /| „YîÜ9O€(-Ü"•;uµNƒ:ä=ÜK9ñTaŸÏ_èår'åÉ]R+¬‘&TEî¡cÛ)ÇIL;¾W–ãŽ[’ÎMöÄï[käI*5Š¤¬ó-Ğb¡¨9­CVUJÜQÅaùIýl14¡¼Ã¼{•oƒÜ›3ÜA â—ð¿ZDO$`À=úÛ³2«£–ßé×Xø>¼“}O|; ñ²ìíˆ.1ã*/µ!Îî$ÎlG2be-ÒU(KhmÊST††5â‰{st;U^f…袦ó#oÄ1óßN…Züºa”¹í`Ü°þ4¿¥ŠvàE””sœQaŒÜ\r²v\!ÒvDš3±ãʌ_°‡ýI0ñ`g—|J0¯0Ixeá«×P-ší 6)Ô`ÒN{ô"g +×|B€v +ÈSú’:V;dº íÐ@ÕÎK9…:Nj‡–¨aJù%؟év÷ÝH”Þa QÄë'0í,§q¾U'ƒV\SeŸ•âÎò`'Sݚ7^|”vʾN4©cI×1¢{3P´Ó,~^cˆß‡< óL†„ÕD44Aÿ#³(É¥"™ EÇ¿Î×cα­ ít›ND‰Û:÷ºë@Á8ÎúuŒœáÁj†77ª}ƒú+jzáëH>ƒ{Bö:ʸi8ƒª×é:= \{½N(MÛÃE¤y§{!“׉öÄëˆÂ·ÙhŸÁëìÂ^2œÛ»Î(Õ;1G êó«¦Gz4®ð÷ûK$F$<Õ:µùŸÈuÎIñ21CíÒ¢ÌÛä—°‰)ŠÐg„á.§ ¡Ñ(ÁGœ!þ´TZþð=Þè=Ö¹êÁwP{é–å4¿ ︊s`X_¡Öñ"ERȧ¬3½£”-s,|>ŠŒ‹Öñ&ÙW'{È*õGœuàªtƒž’x‹9”™Ä'ôª[‹{aÈa“Ò\»Ø€P2¯Obâe8$õMÀM`g±ã¥RÕªÓú¼ðÕ¡€Ý©4! +Ži +æø6°«ãê™õçˆRuxÕPu˜®1¤…¼\æ4ÕA¼Í‰õLLs~2>exùøït©ã,æú_´3€X +½2`S'Ñ´=ù +ÁK.·û qŸPu¤cø`#ÕÑêR„šúmTgæÊtüõDujޔN¦Ë Õ±º¿óEJ˜ÝSaÆ6Cê–—S‰qì㠜ÑuÂrÓFô‘€AêÈCY„ÂÀ\Ü̃Y«¯ ù‘Ôñg5PÆ¡EÔ ¤¤°Ž2¤ãPG|1ÞçËP'ym-Ð%"_ßF¨Ãs„™—2¨ƒrðËÅxúCõ1™}$¹°ºã§:͝*Q +Ð¢´dE™Dý'y]=7ì+|:kÜLŽ?€v“ÚB +;\êÜz•h€ ÔËNçxb ê걔:µHցeœ¬(:²Ï"×æX‡rr‰°oÜjæ8QS-W­ÁØ©õܚŽ³õÍI8X]TÖÒioÿí$‚ÀM¹¨­\Hˆõ“‡ÍµP:]˜¹ZN„é ¿7Cø]Ҝ݇…¾ô89éÜ7zÀ省O‹5BҴ짹ûêÒQôyR‘ûÙå\:¤Ff~!µ¥ƒ®$¨OKK‡Î•¸§&` +9q‡žNš1̕ç0«F汄J«Y†E`¸ô9˜G“NfAg~øxÿäыRdYÒ °W~xïAC‚°Pß"•¨/àSh±¾·S3¬áY៸ÐW©éŒè|/=£~,ÈÜ$»ì=U:%+ùRé5¬zsøt’2\"¶Ò©(PÑãs¬ÖÉ2Jmøžªå£S}DZ¸ì 7!±åÐÉOáx¯SS:äˆvÞ »0ӐŠ.6àЮªëûÁÎÓÝÛ(|FO𸠈˜Q9„;€[ Î>uRMvò3J›ÑYÊ\;l!Íj‚/àsçOñC†Áè_1¯RÑQ¹|Ôd3™\33ÎWT0aoä© R¨¶”Þl¨bÂsPóDt¸FÅ :9ì Ã äCg9îFs.tàX°-˜ŽÈpÓèïŸtÏùù¤³¢dKtk“tÎk,ǙϱKOn°7±,èè%²s™ˆISÐAA«rDmI‰2­ÐzÊÀ ÙçxE$s¢g c˝¸¨·³½ÝÚG ã^f¸’Ú0 h!~«~O€UTô¬>¹Äó3:ó¨Ü ÙôîzNS̺éï+ª_™±Ïfø9:LÚÅG²Ï)Äwyõ9S¶ŽÁåXŸ›~Åq“áÉHwÉrˆÂ‘rÏG ©&'Éíóé±ç y=›„`Ú9³úèeyA¢CzÎìÄ7²•Àuß u%+ÒÁ /NIsHy)q˜\ÙDü~¡–›Ù>ãPQxÙ0s~ª9( 5Å@P$ßÆ.L´‰9ú ¯jq‘yÚ˜yÍۗsHÀ! E•"z׫Ž•ƒR aé!ª~x˜ nŽŽ»V´h,G¤ç åzwÎÁIá‰áéuæÔÀnc֓¸vU3 83AК#ï`͙ö™ÂÊ¥¯›a† °«4Í+Ú®cãÈVšãh£„OÙf¤9R95‹”T32g¸K˜Së¼xQw™hNõ‚Ä-4'rA_keEgÎ6T¼ÀºÙÒ?yŸsò—ÃÕÎYí>-¹omùÒ z9e'™¾þªü6ÍÔŒÇÙ$»áèæ SiY­Žf(ôÂÌh¾Êœ­ÈG™s”ƒÉääH2ÇAÿ["sædy/Q^d¬ s¾·µ™7Öt+|ËzQü À‹MA…¤JHJ™h¥ëð€³›˜œ·ÛKn·›H0“Ë‘Ý.lþR¯º[/¹r{I°Ûí—ÛÅd&°šÑÁn®^·‹ý>lfÍrۏB¥½ŽSuh[J*! ¶ÍbÕ¦ïÊnIÅs AùbZ¯B`‹|õ[?[£®@ªPB²ç¥¬ÞP­W*T‰U…:²È°‰ ¶nŖrÅÔ¸vYkÜV«U•À¸¬*(G±˜Â¶çöíS-d¿Á¶ýa±ƒð¿ÿígyI²¸•‰É ďÀçÛÿYð×÷ýûL\ìÜ{ÂÿýoÌ·E°á ]ëöÚi­ô¢ã ó°Å=J—-ÝÿLÃ|êÛ“nˆhI•ƒ +DB&f’;}#DÆ­Ÿ)»*ÍMå3é(¹fDÐñ²„Á"³÷Z»L¿ªÄÍZuiÙ-¡Ð Q؉P÷[ñ®®AÛÖvý-Èv&9( ܁Ïÿ¸/8û¾‚q WʽQî]ýÛ:±Ð›X•Ûßî=“U½6í;f ÔK8£;ôu,;?» Ô'fÃ+Éø‰P¤|"E™ó!À4s¿ðŸçaÔ/*ÉЃEŸ E"‘Ž"" 98Î×DC!ydp ÒÒiçJ•£Žþ†PDT@žOã0ˆ)CÆcŒQ†z˜ ”ŸyD +[üÛKé03‚ŸXÕL€±i»X©—C؂…A ol„‡ªM”NýK©ü½ÐÂ8æÓ)éýæ!2˜óUÔPÀò_G'-8<)ûŽÓÌ1pÐB'Arh1-(ފSDYS‡ÜÝ~¼q,œ’ªdO¼Ií‡ xæSÁMêýÙäüß&SÆý„jd€øǀ=Q¼˜–¥ÞÐ>„ºBg“¬ÏĨ³–ãç'㹧©-ä6Ò Æ ª`Ç õ‡Áª1’E +ˆt#u€CÐFÅG@qÏJ2~[&ègP\ +š¿{H-ϋEAQ+Ü‰¯ƒ½á§‚#‡ÜYÄNB‡.òl¸Ó¶ gMn3 ‘ïðù]³"›ì̼.÷>3úk Ž`ˆÿÿódüÖMûJ(féAŽ`!äŠÀ+þÙR,±\K 'ÔØqä{\„t*B0·,QÉÀr·êƒÎÉOŒ¨/fy{ɆÖÔ[ÙºjÇ3NMh­%žTã4EÁ]% 䈜;Áž&/”ÍAô›¬²šÆˆL8 †-QVò5ÞjÐÍ/Àí¯M¢ÐԲЄ½ö2F!¹òÄQƒ½ý'åER×ÎP¹fŜòEŽ±KÞJEzց¹âøAÏoŷǨ>LRÄ$ +"¡Ý³±¤O½Z•¸i[B§?RvL]ÉGš$,¦#²r& ÕX +–PÂSX™¢æB¿1ú9Aè¯í§€—5*Câ~FF…!¾ˆ¤GÈôÖ ƒHŸòڀ¶$ÇH€ýlé•Ì¼e°¯Á 2&iFýŸû«Ø)"þ†8_ÁšQ‹¥*¸.y!7«T9Øm¯‹ŠêÄ0àñ"Š8=-B„¸Yʩ㭆 ^5žäR—=ú;Œh¨[¨`ø‚òZ•(ýÀî¸ÐÙ 2k>QâÎÀç-©v‘4X›æ@†  ûœ^¬>ùKWAX–™)ç?:ÿE>e‰:×£ÈTt¾j€”Ÿp“wy`¿G¨lˆR&Õ¶Õ± K^²¿”Úðêpôþ' +ÉÞjr D´]Îh`-xïØ(ã…6ý~72[^Š @mÎ8™@ù² ¢ók‹x3뫉Ô[:ēݽӑešþ E¦…Rù10ŒÜú'š‚=U¢Þ<šH®jý?4ÌÐqX™ÈÑ))cg†[,åå‰e0Ñ$$¼ëí/iN( FÇXªN¶ #&Ù~lÖz¡øaÜp,ä0æL¬ï´fߓ„¨¹R.x2†@m¬S‡LRèñxl\T]g”šN,”{?ip‚g¸§ŠhWû³:CÒ +⸈Ÿçà›Sü>VY+ªòÓԁ6§é¬ÅŸ±E‹°ó·N“.F¬Í8F_àþnÌ{-XۃõÂ)ù‚~€'PUoFýÜtàþÙÀõòi“÷—UqçìîÐ9CöW6 Ÿùÿµ9ë÷¢rPÙ‚Ñ Vp‘¨,ó1vlù7…Ö&î‰Ê›Ëôn ,oa? +.`j¡ÝÕ£¥;%¡"Ñ­ÎÄnJÉà “ÊFE7ƒ„‹ùÉÏôá•\ÕbM#œkôõÜ˜Ä +c@,ʆÏcêøÁ64‹À:ÄwT~k#ÜÈØ)þ¤pˆ˜¶Ô`Jmæ„þq_Çb d´~æè…úÈæ[`æd\\ìÞLøŽ0ßb¤+4ß¼è¬8@y8.ÚO±k›Qv4@uòď>7¤w +OÒ ‰@|äKAL­„óŸYÓ#{•¢!Þ$&\µõ§æÓ £à,{ãЙÝ^d5B9MÚÔ=Ãû1ʃ(ú*óá¨Ö¡Oª–2N©PÑlä2OR~ݚ ý]^‡óTJ©Òàr _ç܃N±,¦ô]˜Ü›§ÂdaÈû;(1 ?\„-iuÌÉfXAz´yøâÔ{1庣 "…§Oð¾!ÜMAÀ> p‡Ÿ‘ùv_6àƒ§T‘–ÇÉðȉwG>Ï:cϖiuÆÏ«TöèÙ2DÅ©\\¾ýèØëVPÄK¶z"²ï>{°3qÊ_ÉTjyùoÍ +ªýÚjÉ̤ê£$ÚЮ|d¨¯­-#|A<Í£ß(D½Òc.Áq|lN°p4ÐÅ·åàƒ† š-?ÆsÍ¿hŽB÷ÄC¨p}Çâ®+~²YC¥ bˆù6r4Š£÷\ Sž[K‘À»EýúîÞ86VùÖÐ+B”íoáõò×ó*À¹®¯7{¤F½ÌÅFN¿©~{¢±ߏùo +HÕ¿Í&yüB4cBòÿÌä-Èü¼GИü4ٗo–èÿÿ¥Ñ³Sq]ÙBðé%WHK >¿ô¤=w´L"¼Þ 7&7DD¾Õ1qÎSPè5Z«¶–¸é…awbä,?o¡@Ëu`·D‡â_ñóP¹hõ«Ëƒ›:[gbu¥W(h†Ã$R‹9ãÉ(Z!&hDŒÏÿTvP+pÓíí r< wgýž:è±åF™µ;ø-y^z[Þ zÅÐî–rž6þ” äÃC‹ÈlcOöj}PgNgL-¹¬ GW .¡TXðÅû•1£•ÚöJ}¹W¨¯÷1یŠÚ[¸Vb÷]û¨ã`†ÈA@t%«֕'Û42­ÑôkeÿJïD”­gYôïo:LÈcÉËPµU•IÖD}@«¶áC[m* +ûhëŒóú*ÑãÆ1üï!‡ëku¼ ê !«Bc´½z0i|ÐMz¬9[ƒF i­.µ‰Þ/U[j ±OkM¦Ï d¬_õ¾"ԏÐ/¹l/˜{fãi\tÃq)V&)vÜÇa ʅΚÚ|Ó*AÂBòx‰w3üɇ`ç»QÙ$ayÓ#.` »6É}K¶WLoé‘Õ×°ãT×cßQç00Žp´Á“òŸbýí8¼sf·`ö15wL üùºþ&¢ał%ô ägN8T2†ôg~®‚Æ;pûۂÕG¾€ùÂ6혈º0}E§Ÿ_dmθÇk¬"’åÌfY©ZŠ +\$:ø©!|7]oT@ç{Sþ·Wë:xcõÛþØKÉÚњ&kÑ.=’½XÍ¥ô¤„xTØdy 5XõÎK@Ͼã®&ÖkBRÀ2½ Œy›WÆé®P°p—^¡1ïÿÊþô®ŠIà-%@ZÆçõSÇQvÚ o&K7aÁt-N‘e–®ö™2 +¶à»ƒAÂz[D¿é§ù)zäò҈*kÜnƒ”pÒÜ­¤`bÈÂ.¢€Òü«§zܝhÞLDaœW3©máa‘åpt=š0|ô˜VÍ5ÕS¢Vˆ‡ƒÖ³³Ì[‘ “É =ÁëQi¿˜Ñy/_wdfïñ +¬rMhÜP85FÖ÷DTÏàX¼¿®pÔàvpL*Ý%¯;«F×ÞáðwF mZ†š¶pf$,Ô·&Í\t€¦8ðWr­Æóû¹Jya8ññS?ŽÅº&Dbu`…EÚùð98dwÒ4ʧ–¥ݍ¿–3‰J HÆ;±OªÙÄ¡ŽnQ9¦@Òg®àJS‚3RæÒ¥4JúÐYkÖÙ¤G|¬7Y_NIj®ô‡*aGBx‘šT¥°aHޙSØ=|DþaÊr¨£DnÅ+Ÿ¿ïtƒrÃþz‹‰,kK°A^\c Á4ûš¯QõOND]3Äé¯?E’›­èVÖb)”Ä·’ZÏ,ÉʨH–0iÍp?:Êû—Žpi@>pY7Çh0iÇà}ßÌ0ÓP0¿’IT¡A{«ã«1cÖ`Õ[&²pùò!ž÷µÖ$™ÿrÍ­Š‡<1~¯“àŒhbʆ½Þ;_ÏB²€V”ÿÈ;À½¨0žÁ…)¤zŠTE)=˜ìƒÛ`X[y¾%(k>€ üRN6)ԏ0ˆ£ê ˆ µ nó«ßûE~Ï +lP'í˜Â—¨Í®@¶ŒN¬‘Ø„¦æ•‰Þ¶U‹y,žPApÊ9$ºdõAP'Ǚ¨)Z±q¥ ΀(ô€xHÁk{‘eAé‘@´«œ.B%˜dwXF X;£Be}ùIJKÙeÆé4cÇAËB7k–ÌN$˜Ršq0¿ÇËÊ=3ŠD5łc¸/Lnp»ûð Ù•"´ø’I’ÆÈ~Z5Ó&»Ï lˆœWš¡!;h™HÕb4änpÉÀ!z¹GáçÀëš&láî“wQV­ù…䞝 iŠž1@Œ¯SÕBÛÉy¨DjÃ!øC=oʾ‡-Uü¤=·—M¢ =Aüíö­£`:Œ.æïS€Ìfgj‹•:»,ˆœÃáà„D^}ÀŦ<6)ò‡x(ÞçžóÑÌÌ'´½©X@æ(ŸÓ'°†îЭú{e +J"¨EßÜ+¡‹AL¦‡tÆÂE°/蛜¶É€ß1‰Ê’¼¢¢ú4ILÅØ`ÿIÐã‡ß«\t›6!è?ô¢ +ûH&çªóÌ\µJzÉ»ÝÔ¹ª)U(î;ŸÇ©NÀ>f;ä +³X™õÈ«õ1¤2!äN!˜É ö‹ò±= ~և«FŸ!¾`b:*ö ‰IyÁ³º¦´%¯…õ¡?£`¥Q‰3@Ò c€˜j=€ý{ +vï \"l€»VÑ´´£Ñôr‘”­þÓ§ô ˆé”V¼w¤ÏŒ•ÍþÑ"Yöð‡˜8 +úÙ¹ä…,U6>Æ“¨9‡17¦h‘U È9¬ …´Ú®^Ÿ1iõƒE~܎c‘d¾ÄMN0&,Fé~Ç@j ú¢ùÁl=¬;×"…Ÿaø,KȀÐ;$w`•8;äBWÚeI÷€(ã0,ãLÏ;ðý%Í[dF¹âO÷;Àžiï닌ìdv¨R7¾)yiŒ—Û<ð,“ù*")HY6*x [ìrˆ˜À8w9èm-ýÀꃅ$’“Â2†â¿$EëÛîb'UÛ0&YšÂÜ?Gâ>, Ù`![‰òfäšYÈJF&:,.R¨pÐúig)š¶úUÎÝ;{×Z=–“‚ëÇ°ˆÕ³ +ˆòˆÏª;ÄtÁ—§Ã„bp[.«ñTÄ<¿mÖd*üMñüJ”õ7C£~1Fr¹ÛnP/n†”P܂S2lMéúÓUÑa-Â!¬‰H²×Â6g+ n Ä0i7‹ÍáþŒfg¨"~ÇþgEEàgµG1Œk +Ød´Ð[w˜w|Î ©'P!õ³é>^|Ù­EÇx/õ´2|{6ê䳊Ý]ª%}£QluS$ ¬©–2q5ù«wã'VYèӁ Ò!Ìo +øyÛ +ìžÔ24ÕÆizŸ 7³&â± +©¹l»äWÖMê”h”]œtø"Ӏ4ôð˂3ب–ÁªÂtYÄ÷‚Eœò°vuo`©vÜã± ‚çÍ\o÷ð¡$×݃dX¸Š3ª,øB£_FÁÄ$‘°®¶‹„‹­ôgFXlÎc)_£IC=š$æ6bë¥~Ðgƒ“a»¿¥gæºçµÕ ,¯Í6;÷×Ç~°Oa¥ ÎâçäÖÖ©´Hš¿§´…ÀYé^õ7¢‚_e!S—ƒ1¢9 åpÅ3Z]"sE¸ù0æm&¨Ÿ#ÄÊ  (•htÝè¨Â!#ó·J‡!NJaƒý$¸:eH„'º·È”[Y}] `!¼ŸXR’PúÂ:+Ë;K IËy…W³«!Ül‘£NA:Ӌ»•îˆÇø+n4äéҜÕrZ‰Á. zÔ­§ƒœnƒ„•¦ÊyޛÃk… »ÛÕ½;Œ Û´>nFr~’HŠ0Þ¹¨Ž56úyŽrÝM³O#ò5H +´„%a¤*% 6è;ûMœ¡C}ýHXŒ7ٝ_Ô´¹ïA²î#mtÛ%î%xà ³”<‘Ýr¡Ä”¢ÜÊÅÐ]ØRM€;. @˜Ëú,/½X’ànô‡øx–!@åV$@¢jE5¶b ÷„R?†>F Cû›­²ÿéñhu­)D1*TRB‡« np9»\ѩϜ j¬žz0|gT_u…½qŠM—6:ïQä3œ¢(‰üŸ{£æê,S ÖAX‡2Š’$Yê¨×]*Š 5Í<‘ûåFRýêù‰µr.NBÔ4)áºZXl¨wšRç:DNÀ=[­DLÈÜÙ1Ô#AéiÓÑєëÎöC˖qWb§àé7¯-é‰W䡼e㺲Üûþ¯ÕÞ«HߋO i:іÜJà 57žæ -í¨7†¥²Ç<éȆüc‹µ¡VТ3ám–0¡±˜¸—Š0·#â +þKO›xÏL cn)i2"ðëiçµßа ¨Ì†Â#ÍD›±£‡¸Ð¢Ë)ÑNgmÙéC@î/Uq¬˜ãœÃ¬ P¡#Hky1¦A#̶–†‘$Ä´)ð´( Ö?V¨ºA͸~8 àÏ\Ö«J½Â½€ËóO$x•ÐyV_ãÑaµ1ÚØÈkŠÕx•¬ã*r»²aKßü½âÕÛïünކÓ1 –'HqÅ8û!][ñ +¯|èøn…Î,àáÅÿàܼ^ýÃÂv“¡-¯€º äڗ蜎փªÌv™åÒõÑmÙ5Ý;‰;Án̽˭K@µKñž?¸ï1ö >¡¢ÀoÍÈ-Wˆ&dWS¢ÊÐÐjx’Y• ¿S)³¯*ƒŽG°0d=À/ -ʀ J]¬·Ç%ÕâÎU8|Ú2¼G;ž?Aßf@—]Òu,ž½\,)»ÍÌFޑ¥ó!YH7U±—?¶¼yäÓFCqÕî‹pÈeJ¾ ”Œ0½¹ ‡Øcç~Չ?¸^Sh䈍TGU0«áŠKߌÛ8£Ê…šêUµdß.Yo6¼Á+Ü/?í7€‡)b[7j\ì]ÑäV$Š5Dxš©³"aŠ^õ¥ð`û××èÔtÅ~¨õϒùtíñ‘r܆mðRµ'´_ + ”ߔà1°Áêa$¢^’°Ö̘\¯ÖTB³2è=©“8‹ÇV«´[ï´.'¥…ùg¨Í¼è b1z×|Ý P™I îl…@pf¬Á!aë´¼Uݾ:0~ú<%:¹æ¤'žÊ‡Ê‘ֻʢ—ÅdòT ò½?4eƒi±J¹]Ûç§÷¢¼“FÁ7‘¬$ù +r¶<Õ4T¥‘K⻐ÀœÍч™§^KÕχQ N££)ܣݪuÆ +€ØMõD/l‚2€òì„x3÷ô ƒ6Ãpž û‡øI[ˆc¾ †ÐG56I«0dbï/ž@” c¡íxÏZ×Cd‰`Ó>‡ßrÉSÆÂJºۚn`lˆ‹¼‘¥åŠÔ*OÜ"K¢û¼]s±@£ÄDà’eeM_Í#ÄIÆeQ%&tT›û •¥¼šúéÑvGÛæŠÙ-ŒChTØJ°º×L_1û„ÄqØVNwçß ª6Wfó¶¾EÍ>—꿨‰y²{+k?C÷˜¿¡) Dß j32+.õhSªAe‹ƒ×?mðŠÍoÕ÷–Fœ¢ZÄ% 4Ъ©› IŒ”“Rí<‡Ío'¡¾¤u| ½ J’D¦#èV³âXB°”±€ÄŽÖ[nn¢€œdþ`¯+2M\G'ôԔr¹É½0“W'[ƘCͶ #jX¶^LöéÃSzK9ùY}à>±ÄˆV–@‘è­ö."ڞq"ô/pî*Lþœ7ˆüGãðs¾erÅ(rnè.pdÙÇÚeBòY½¥Úfeœ$€'êfÌ#íºqh0ø´î¥¨³ºátÛ£µ9œ‘ôòÿ/B¥(ÈBݕ5 àú9Û†V:üÐđbæ²5ÓpËÍß²àՆÁ6o°1$ècÌdvÀ³”;”e§ÿsXw={7ûp5>ý£Ñ?Hϳ•_”ÃËYûÔʐ½s#»¿¼ ´p P¸àhs tæÉÑdù[?¤ +*)*ñêìÉçóúÎø­tü@ Wjߦt]»YN9°LüüÊ5jD Tð¤bC»… #Ò±ÿ3HQrÚb†š¨L"Â` þø¾è•$YŠ’¢\ì+¡r(Á\Ð%…„¯a™%g—Ž=BÈ®€HG öô'¯Lӓ^²Z†utÑZãŸû3œ®àÎ[Šéiœ‘ ÆYœåÊrp͖!ªa:%$_Èn°K›!½¡êVÒr$Ù4xÙ¥?ŵ¿*ÔÜGµ®“úÊgÅPÛÒ¤±"TŠiD‘dә&_,²µÆˆ|SÐ뫱´œk¤%„:ÜWúX¬§…¥²n#Z•àl «<Õ÷Aœ‘ÕNsOí=n”7â-"2æcø^d‹ ·œØˆtÄ@ 0>¤5JûáO˜¤ûØ-({ÔàÅ:T'ùÑq°=úÐHUü ffSàªôçTá«ã¡ÊóÞE#…È­/áŒ,PÍÈàtiý¨ ‘ pE:¡òièX=š Ddӄ¤[D3d玃)&¥8xí£ïv5à꧷(4ÐY§5õàjÑÿZBŘ4u›ÜEKJÿWÃôm=¤GaP6ú×Ë<;•L;•Bè‚íg¬Sè~µ2Z؟˯gÁbphÃp ÆG¥jø“c±ÝÌ(¿íí™Pä£8çƀ×â,$àü妭.iŒ €”ëë¼ +ùÆ[þMUw‹—¡E/°c +]Àìý;yƒý!O Ùvk–€9ƒÉ5kÚc[&*µ«0‡â%Ñà€k¨T®!pÜÀ ½^%Ýꕨaw¼éÞ•Ÿí$sŒmàð)ü1…ãGׄi³\~Lè°ùñ\î *bèZˆ¡“. ZM°¦ù$ àæ@/̂= < N àüs¥¢ŒëWzq¡výM°òzéªñVÑÚhªêúÅñöқPÆ"Váá—yå§Lfu¯Ö7G1‰2F ›‰@'Jí}ùâÐX³aPõÂ1ÐAfâΐ&I'koã^M¿y$‰È„xÏ Ÿ|öµTC¬éäÊHt(«œŒ<Àºæ‡½àïŒÁ–çå}­!5À;¤gÚª4!~Vö²È.úÌUE÷ä/ÎPCÒ mµDU:Å­Þ¯eùc‹sA›ÃÇC¯i>0q­+yGEçTû™utD)Å?8­úQdúlá’¯G(Ø<ŸÔÉðÊ&|L‘=Õ½d…¿ŠJõ©¾þ:ªƒÍ5S˜C‘’äq|H\pðÀkŒÙíYÐ s}FV i‘š}5z?Ø£·k=ÕáaGÞf•8†¤1œÄÝ ¶ÃJ?à{˜ Âþ‚ãD=X"óî¼Ù°°ºu`vÂ-Á~te ¸\n¯ŒÊ¥Ï½ÃtþQykÊT1V…cf"&ôPg„ºT2u›ÖV²™.|DZ³¹‚‘=h,’JføYìÑPùC%‘WÕ£2èþC´s€¯ÉEÝy?¶JÆ6e­“Çë0€äè3g ÀO–P¤Œ"ð&´Wa#ä ÆòNœ‚'mæ¼hn–v:^•¹5»éMÄ3=¯6É-¸†ŽÖI,ƒò…þ>«y¹Œ7I½ àr"mQ!åqÆN .$k…£cU’̃Gð°Š9"öÐSæÖÙ@*«ßK„gêêS¿úB¹ÂÿO?²‡LÐqí»üWÚ0ïà‚tZØêNG½è"ãzˆ¥P¤´BÁ)àd„2þµ•‘ÐÀgRŒiUæ0šÃvkØ®;ß­ë(0ÅÊe‰ê…öë¹<ý5˜È ෂ³9æÄ&Á³ž¡Ò 1"¯¼ uWwn\dBíšÖVì)%,ˆ™xÛy"®Äãَjš'HéyÝcú  ÖgXÕmËĜÉõšîdTŠ¸F*Ú֟MЬN¸föh¶[ƒT"[yPøïBDQA_ù^D¨˜Œ“ !RgoóÒ¾èãhøA`ï º\*֝è7^ÿXðSwò»Ûþ=0¿$с41aã@Òã&D,É_a@' PazRýYÀ·šœáJù^~n½)ä] ®ÌN/^ÌfŒ–æ~Ÿ"À_´o1E¤°6p{°¦_'÷àòé{=!Y†ßÃL‚&ˆ |Ë9,­.+BÏÂD?ÃÎ Ö{Ó¡O±<`³Ek“Ž¦š{ à·Lì’mŒ}i’ÐÄIA±H ;ÔΰÍäúsښ)í@^ð•Ç©|HAƒs…Ó‘sfÕü緀ú<5¤È$$Kœ—§Sí‚`>-è¦Âw§SðÃ‘aµ‹|t‘d\®F@U½\>ñÜлZ‰}œqHfܜx÷j›"ßfÊ NUE5Dˆ@·ψÐHw§kYN²eœÔ$3v)!椨¹ï·‰°… RûJ¦–é+‚µùoH# +¥Áå) ôìçUÏÁ¸=yP•xFô¼„BÙAd5b̯ 8úòOWˆ(Žì +óÈ!fý·$*¬©óŽLS†±Q Ý¥CŠŒv}Ëñ|G”ˆîxdFuO¿/‹³’<,ÕRÒÉKÅÐôJhß¿JÊ +n0SSºuQš’ÝóEK/Ör'ts퓓oB¼qé7™ˆƒÜ'cDÓ$¼Œ‚ª¡ÈÖ $P¢·yËf‡¨¢;µJ2#YêN æ½$<Çgø…ú"šüè 2ør6zç×y;ÜCå4ô£,ë’hS’™ìñ¦n&=]ÐCj—0Fª5ØP ÁîFî ŒËAk4V'–¸É9[§ÊóÈ9 ÃT*µ‡ 50“,ª$©‘DÖ¼íM@o`©=)ì=Æ[v13ìpJ6öفL›œ@ëƒä +¯Î +Ê÷=Äæ ü•ÙrQ¸îžyðû² Ì[Ö sZn„Óv8Ëìc¥#`ÛÜrGÃkG&ûåߗ42oé í¼îCúF-ª…ÝíÒÈD|Ûx‹ÆÚW€ê´âŸÏXЍ¸.¢—, +sÓ!B]¤Ûìêä·4téÁ´ç½bú©$D_³S&[3ˆrRëƒ_ã¡R  X?Ûó}.¯sw¤Bj¸OlÕ³áòI'7 ,6d©²u§à¿i&«˜i1̲É1Œ«:¤Ò ÂÀCû±åi!·ö_¯(SÿŸ¼@¡½°©š!ùSkIMlþàæ™û0ì\ýoØú·Ï¶&ЬJ¸L&ÓIR:¾ÿ¿¿ "ù*Ʊۂhný,4/+ú>,7t¸fõM½ Ë®RoYFo¤•èjUùô`Óx·ˆÉ£Œ1²!´¸Ç§z QTë˜t²­»—¶Å"YÉ-.¼¹oWkU¸¬À»Fájf¥ùD 9šˆ.˜éæ—@`©_ÿ %Þ6o± 芀gÙFÏÞ­Ê­‚§ka髼,µ!AAö\´ßß샛•Ñ• š‡œv¸%|Mʊ±ãVÃÃfÚ´ÿm‘uX*ÒtÓÆj÷Ùz£úÛ,ÑYñÀ+Y«°[ꉙo^Ä6˜!w·¬äë¤l,3_1ìVƒÆËÎ +üZÛ)Pè3¹°‚í'€@°¼Ú›…A½d|±-V#ÿ¥Þ7âÌà¯ø@+ i#tÔ^Ú¢“}pJÍíÖäƒiü삎á™æßÀ­Ýd=q…áÑ@µx(†-#§32z +.i5)0`Ô¶L´(.Ç cŽOqg­ý!LÿÖ¢,qóüÌåtº(RôØ +ì‰æÑ'‘ìÄa<~h»º[<âü3Wi7q€Ç½†¾8çd£ëXù’Ñ]vYï.,uÜ´¤ãÀÉWè¸4¡sYùf¤ÊqÞÌ7i‘Pd‡;q”å…ójdìñ(ƅ£?ÛcQÕfôÌsÐpéÝsq`Ù8ï»Ã˜­„5­>6¬Ñ:\Q–tHXâål„äåԗ&IMo7GWœÏ“«ñ$ûÍ‹’4úˆcƒ¥¢nwDJhó 5q}Òx›“ì7ÑNIÆ}R%dÌ ršOÕ5qiñ§Zm׍¼$’»©ƒiµßó±-]–”†D#õ0Œ§¦ýҟ_Ìü ¶pÔ&âvÌ=ýË¢Á‹+à/ë@[̽…Ôb³µ ZÁÙs]Á—$ueD%ìŽÈ…‹.–ë—"î½¢óÏؚBzys°4WŒé«¬­VéUŽ+"h®U½a8 +NlÁ9TEX*áébU¤¨èlÀbÕÅgj‰^(šfY ¸S”›Åâڛô‰sþ”—' +óä#Žsõ½m× 2”‰‹ì®ÁDBìéW»DúO ªÀ…MùH†ìœWúnÚ)…¯*9Ëù+«T#~7aBŒèͽ-âRöeQ$w| ^¯WmšC|ŒÓeˆË(ü” RUˆICÉ6Bô™_ÇáLxYÀF@8AdŽQ°qÄÿöõ!ˆVø¶uJ{øÛ#²¹¼&–‡¬Î) 7Û%SwصֳÃ}¶C=ÄT"†¢!Ixƒ†õ +CÖ„äŠCdƒH‡~ŽÈ.ŽxÞp9?3ÞÆ ¹öª e­Q~>œa 'ÇÌ1@ †$þ N5W»iG ÄP +Pòå‡Á¿ MXA?S³ÃáfØjØÄ+y—÷l噪»…‹/F»æäìøÄàÖé£Áþá³´]AWßY cø"n&\’/„òwOnebJkðjgæ˜þýuš>Wm_ÜDD.ÜyWü×#¹”F0ë §¾ u<[F¡–X·ÍãÅ©Ñ*(J;¥_µdÇüɲŠq¹‰`Ì;®Ü®¿™PdïïH~žÒòbríý%™\N½y•¡¥9}È_mɝbŠ‰ÂCáX%RÊ¢B1#\‰[­©¯¨H–l·ÁQvîb³/d¤Zâ}ÃâOqnÅQ‡0NQ“â#u~¯o$FØ­v«múÊurú(üŠtð DµÃô…ÆRÒH-ÐW¨fj3²¾KÂA}¿Áƒô½^«;Ë!Þ»P<†x³úªmyîƒYÈ ç68u}^£õŽ%>äT㓱oäâ»v¾KƒÌ¬'ÛJ€ÈŒ»;Ýl‘S/“úüÄeœƒ‹;wh†#Ü "†&R3êha[59÷¶!îªH¶Þäîh,0ȱ4jkj…7N“¬zó²›u/öÎBxá˜ñáå+nÖ$~­é}òI´µ8ÎA]Â\±šH-õ&Áaôx Šâ/«•¦À/˜»mÌ9zÿdw”Úü1Äb‰‹6o¼¯r*ò \KŒE+R +€9 b…—´ç¦ØÝEMãàAï‰ È¥2 U0¾µ® ´¦a±1‘äPÏ@ð硨ܐ[M9¼Dm?4€,EP]M³6èÝÄúÓyÅ&½Üü²6²À•\ ¥-áْôìã5*¾$dÓZB»î+Ã4nåø ^0rGEÑ~:Žû9N° +t0£æ!Ò6Éòƒ±€¥ÌwßqÌH(0­®‘]iFä]p8ª©S,˜UbQ¹RÏN!‘ª¥õeü™‘VyXú¨3ù’:Zå`3ê?ÕÆaŒ—*azÍà­;V˜îÏs’sÖ§”töևTÚÛ@ ¸‘‹¬R-R1Òd«:ŸÂ¬ž½ÞˆÔ½Ži’ÿjèFU,K!¡^¹a™lĚ@rnŽ¶,aŸ1¬( Š Í•æÊ:ã!IVê&¾ŽHN)žšL¡èz¨(tª•Ê“Q®ÌܒZ1Iˆ7Ì9€#{-zç·Ð[ôÔÀôkfLÆõ¥•Z£ÞÆV¬ÏgÎ#ƒ˜Å³*¡¨Î)Ž9héS£‡ÞÑ|ü‹G  ‘yI.ÌYPªŒ,õ¦Gá’¢èé j„ö¦7¾(xž³šgëñJèª6CÓI€÷Ât~‚y6qñ1Á]¯aH ÃÉ~¸ÄݏÅqÁ왡"¹ @~¡OkVWüҙ€P5›Ê¥‚)}·d`©|)±$è¼Ü´Á6—Ç… +‰Ôòf¢±ŠêSĶiU!> ³€"£Q7ê=àáFJ{(–c#• Ý«ÏºË MñE•zv,iÇÖ±fI`g“pg`Yºb‘.ù Œµ)•ÆîƒRÌýÇ]Ϟø@SBÓ<PžTì؛•¦Sz|#¢“ÐZÆ5Œ%"˜D/†‰]šGúKµilÕYáOö³#{ŽmzPxÌx’)&^è"*׏·Á,ÍÀx2£ñ4'‰Fþ‡²ÚÀŬ¶¨4”d¤MM°1ž +”2#;±bøS0*HôåbÑ2².VåxÿTrÅ¢x™Dv™Õ<è êæJÁJBRuD!òÂ%…N‰ïGaeývלKbîrYÕCÔõ¨‰¹0jºFÝCJԕ ^ÖEªàoVÄs# ¾¾؁fvMÛHm&iJšÔ}è7L• ™'.6X÷Ûm9M¹‡¡déŠÑìO0-9„]aìà.ï›Ý¹þƒ7‚egî䞫3¨ÉÞ JUg‹ß+xyE€g9h´k% ðÁS]¼ðÎ=' ³Äåœ?\w)jàþ{â!hë8|áxáø#渀Y¢?WŒ‹‘ú'ï„)¸?H!æ9>ð^`Z¬þȹýqï1Ì6Í>ʳîþ8Ïó§ùâY5 +!.D²ckÊјb¬[Ô¤uEëtÚ¨A°ïÍÅÓ_à6é2Ùn.Ë7îŒ÷•0¢µQs/†ŠPPS¡Â²®âH‰.i`ÔZ’KNßóê‚u‰¯ =¢5÷¢b×ð=º—•nQ½Ù-SGúë¥w)Ø3;e ™|E4;…ªú<«×›ë?bäò¾Å#h“YÏ@·Ü„h‘«s”Ndd¬πåqВoá5¤FÔ€ÇC|¸×Í9b ×é,^+.çþ$ƒÀ‰HOJ÷Ø¿¦é™0Ku “ˆ4‡0<€-š‚”¨‡d¤áû¨‡£±ªyn¦„§_ÛéÓ¾L£p˜C–õ :D +‰dXÌ|!t2@e•&–U•sqC†52+r¬™ÈšO(ýÄ +è© +@ +ÀA(8UÖqUaÕw륆âÀ)))×ÏȞň5ö¶*SëH¨)Ê&[ ¼ùHsùgSáÐ.’b{J#ÎûDPl7îQĔ{jŒ&‰wY¢÷>…%§¹ÕØ&€óÄ +ÎÉÕÞ“rM1ížAì²LVø?©5?/ù‚’¨¶Øp¶PBÌCx +ôîR‘TðiQ8L/h¹!ô„¡:µAáz„¸ÅlŽ«ë† ëã¾$²£d#%hÍÓ+Ý>ÓZE¡9]J6½p¢ƒ. +·³^óŸ«ÅÎ +FC2óë•ìk"• ï]PöKcd}wŽpÁPK[z?‡³hÈS (A¦ÕI\ ®mˆ€ë{öWbZõÜ›ë¬ÀN°/D֑«{"Iñ °µ'Ÿ>kW +õ¾r¥,”ar'§`yѦ]t èÊtݝA¬.ú“ÓI^¥t!ƒ¢#s[gNdü2Z+hX!óÙ<ñ‰|“Âää¥v齇‡ϔ’4ØNZðçÔmÃЭ,´G£8p„_gþ›Ÿ­?·=ò¨Ó¼«j}^ó§éÞQƒÇAmòj6ÍË¢ÔÖMéÀ)¸9AR‘a{$_šI¥8©CÜZŸâXPÔҗ 7§‚|Æ*¢òĺ Håҍ>2‘nâK£ÉÈ(´‚ÎSŠ[£¬M¨èّ2öàïÞìë~aÍuÈ\Þj_Ø*>æó„ü¦ +èÐNà+Ù©²[1»ÀA߸îÑj™/‘@Ð=ºüxF?)®o½êjʺªX! ø&9eåw¢ßAÚ饮¼ÿÇì˜`ÕÔx™É\¸IGe€Ï ’ÅÄD½¾ìíLHúNÙÑNúB9ãæÈ4a— r]RR¤ÂÉe(Ìá1×GO“5µå­áî«Ácz½rÉÜßËe¼}Ø +žçÿè„zz¥a]]uXåŒn‚#©"aR|Ž kÊN>k‰ßÁ_£·„F=‹‚+9É´6/´6Ú2F ¦ÚH¾8 `茅épQ uòӅò/O$Ë "Ài•Å9”q#è}°¤ûL`°ˆ²Ý 7}QΌP–žãa{ uC`â»öʖ%åYÑFŒ¯iú•Óم“QRtĉkÍÅ«ÅóÉ3JÅÆa@EÄ5ž³Ú¿eÚ*msŠ]Bç¾ßX~ûçïñ}Çsõmš$óm °Žo½E‡Kɲ˛be£MxK.>#ó»ÿ‹ÊG\ݽÛïí™Âか€V¶{&4²rˆ$qmüü¥âGw~Àóܔoâ‰ðâE7š›7®©ÊåNœ©˜M&`,„˜¶!ƈ¢·IV/ŠÝÞ ÖÍíh¼Bͨ·ÛÆ/µÊµ¦îàüg[’P¼ØîÕünðÚë¡Ý#w¥9¡£Ç}ºæàgëQ¦Šýú ¸Ûa+ʸÙ\=ëJ×|’ @Pâ’ó{P8z«fà‚×U¸ä3 MEWR\gxÁÆ@è‰2 +nìÉ!Hi§? i‰86ŸÔŸ­Ñz7OJ£÷ö5À@_N®DtFZ™ƒu L “¸×•s0¸¼îªˆ»f“-غöÄõÈ\#*we\çÁXé[ãAÓÖeüfÒ¶ÖÎr¡2,­ñÙôt Mªs¡gÿÄláÏÏêSy¦“®úž Vuɒ…#qªýÇYT{½­BÓW 5ÐÔþ4hðR;»‹ +BRcµŽZ +¡¤¢^œæÆTõ²qõ…ÊŠ¡J‡ïøîL+ÐpŠ˜Ïƒ+ûîD:%µ´âӕϓ®)—yKzDm·ô`ÄGØm1Ãnî„ÁMœœŸëbbnÁM‰±kç"ŒhÕƒ‘}h"ÛºvZCCÀ …~N£Ëà½ç}“èZórÜíŸß¯'ãy£/bCœëf$¨}Ýf¢|,wrõ‡B,ÐÚë™W7roÌ3³¡ÕÑ&žÙGÞÞy,ê†ÐÓÌ®5µó §E.~‡†„3sÖ­ÌDëÒ ™Šn¦ágz7ñÉ.Ka&#› +nÑ5Þü\ºNY^”µ~a!GDsú¾˜¹Ó3‡}Ʌfnà}ëe$È:™Uú&Ý1Ó`-UB’±¥!Ÿ5Ìx¬..DŠKûeü¹á<èåô=ÚeN¨J.×8¦‘[þTÕ²Î[ fY@LœU-Yàýƒ{K‹»xˆ-AX–“Ï#@ DËhPqº7ÏJçZ]n‚ÝO²d‚$ÍLqÓh ŒG}k4ŒÌQ—E^ Ï4͆‚O€K ±X»*tz4ZX¿cC½ %¹¨-¨€tYrp›Îî<œËæa6£–^V²@vƒR®·z‡¢a£¡Ð"øŽ™Ť ›"»1Ə­åm–M>ÏâMSÜð-úO™Êˆ¾"Ùx‰bؖkA"eº-[ëHÒ¦ÝfVá‘ë°Vè‹l Ç×uW­Oà‰Õ Ä"'¾bPàÚMeo’bÑXÆ($‚ä83õ©/˜ˆís&ÏAØá­S…RðjbËÀfåjq§6Â<¡íSLï ¹0¤ó, Çx¡ü€Þ@cþ]¸÷_‘;k(wk#r¦ 遲ä"BM×µœx-£*ÜË ¢çû;˕LêÖÛAµïôº®ü!šš…ýh`+¨Ù 0 jÿV:í6ZIŽàå¤Í =ð3bÒ%+ºy¹Ûð,BHUÕÎ4p¦ Cr¥²šÑPõÇ8dZ3=-‚jÿ [ !¬ Ñ©Ð* þG.«Ä÷tšGˆrÓRT‘é&†<쬐9슂bMV(9D?_8è°q 9ŸYËX6½Ü¯`Þ±˜ÆQ¥W´äÀN‹MÌÃù2TýæÕ¶þpA¦¹d´J°)ßzyçí÷C…±fözjJ¡Þú „j¨¼fˆfö‡M±T‹`hÉ –×çp…&FgGsê¸EŸÍõra´&EÄÌÂD +C7¯—,-þrÞäo旊tŒ²»y§¹’%ˆÞ!]’îù.Ò@þI˯DeêUoJ[˜^קöPf‚¿™¼ÌiR»D2®€aüŸ_ ßEØëF¿ln?Y!2`[¤Ò­&Ÿïƒ ¦äÝp Ð;ÞNù± ß <1€ó+CóØ\VQ8ºV JsL~B(‡4OvýŸ k¼ÁÑú:«ÍýYvp7i°ªë¦@3“ß~'$6n»úDÏ/J =ÏD)EþJl=3, ¦ X¯Vî1Žv¬¦YÁ<ÔÓ}¬2FI F­q ¤oû ‰Ö&µ÷yï¦IË'E¡Gᗽ‰Dþ 蝅Q +’lD$(qò|š ·Ë›ÉÝîP +ј l˜srõCõ9,ÒÁ|äºKˆº‹ñu0}Π÷‘ÚGXÙ"çi¼ójâærg¼ƒהöd7¼éG$š}9…r‘ÔªW‰Ë~^»GÐ ¹Ø”8Â=¾Ù 4e‘Ä0ØI$%‡¬ÃÑ¥Xñ 8‹ :?—4y} qÇb{µ*eø­RrԄPâdÜ2¦ƒÑær®+=“#üS6u%USå֍w¡Ó[@ž§»ÂEܹ{œÝ(Dý…ypc’«{ÎúŠÁâ(­ffÞ¡M-–íC”/¶~\=^ÿbïz‚¢B¬Ý˜ÖŠþ”“‰TÝ,åx .Æ1¶ÆÅC,äXÖ}"FYÌÜÎÛAú²¬(GÌ0 @ *|H¯iu°WRâ¬…6ðªö–qpŽ¨R“…g5‡­aWëúøä!©+44ڝ3ìRx®‰ÒtåOxJ]+DU·ï%âàY@Ô¶WAÎLY'.ó¢‚OÒKòó÷кÌ(§Z0¬yœX3SªÓøÎyß`­ ñ+!ÞLؼªÃ…åHæTCiü)>¤D(g&ÜK²!èNªjBƒ,cX\¤È‘TL à‹î·Ñˆ¨bhlyž®W¡Cµt1'¨Xa¨ô¢œ~j™U!0‰ +¼˜ÍQÛ¹6ÒnsITÃxæú˜³/—ˆÎ\¹¢ø'—hÆ;ri…ý¸¤¢Xþ’ÊôxÌûd‹Û«‹õ­]!©N«©šm-°,Y,bn„ZªqkßXá(ޖáìš? ¸µ-³g#\[»ˆåi‹÷l½gk.ÊG—­µê"ÆÖêsxÀ,\}”/Ù£Ô³ Q«žwxëXՒ[iE§ÖFŸŒZa5Xüiõ-ûP›Ö|ø—Öä‘ޢÇd5áË¿ŠC 'ÙÂVf—:þ¬y†^z;+¦É œµSl±Re]NÈÔ>ÐJDé)˓ž‘C£ÜP-÷d½«6¡d1 Äp3²v€6!Ë3÷îÿ±ö*OH`65î¿ Uo¬™t-ßK7dÜ0cY¬ýÇk½²i+Ö¯s›XNR_±Xô°ÆT–2%2V)üíOqÀ !ÊÿW@ޙîWܗNy+“öÕþ€9_: 'Ù½Ê䵀$EcÂDõ +nš…Ϋ×ÂéYIõNøã4¨J$JdXéïJ6¡»x«Wcâɺš ýB€tå DžU§+Ä9á°>WŒÃ¸rņq5<`¬¯¡îZYm¯hµZÚ^¦Óê7Z£•/‚‘fö¬l…ƒ*<µYíÉæ­U5–Õ¯ÍFf‘!YY•‹xz¬ø´®òb56!°a5ËØáCÓT‰òÿœ}–%+ìú€Dþ*û¶¦½ªU@T»ÊwsUµqÐ?…? ,6ß4ø•Úx¡ªW§T‚|ß,›ŽÅU(EM¨½Iܽº>#¤B?¨Þ1¥¹jP9Tg&‡z&§åP3u&÷›žV§Ã™³é#‹,æc&.¿Ìr±0u’%3͈g-¸hPÖ²bs×b]øa1„(™ˆ©ŠêÍ5 öøüed‰ÉíØ­$p³©Ý¼‚>Ä©ÉA'å–MoÎ\+¶›âT0&ËÚ:…3µ¥èl~QKlø…ÎRâgnú ÚdUBÄ`¢QAÀ)>v"€NÛi$“$Aû?0eèÇј CÀ…ÉL)¢»›Ô¸&”«R}‚ýÔGm§K¥¯@Ó0±î❰!팔×XB¡(ƒTËŒÄ8zhÁžƒÊ¥Ã +nÄf>›eà8Û±NÈï¿_½Àþ?a\uD­èðW%!Šà´Ø2¡,w-ѽøþ˜7tL¬~ ,ÇÌü®Ô¡#´‚›¤º÷¥‚UUüW|@µ–£|¿õrÏO°³ïö{Âj߃åj©1_0ÛKµ?–]ðÞ³æ!|(Oֆ[Š&~´^c¥¶$¯=ÒêF4`“Ðä‚Ü/ýXÉÞ'‡éàGtSÑäLC’oÊôp +ˆÂ4˦UwÍ_’2Œ¤lT2õ‰ËÈfùðKÌcʜZ¤— +­…7è[„)^ÆV˜N¢š&¶IR`@‹M »“@ã&äBøS͝_¼D®!äÚ9‡×=ÄZ×£HÍ26ª &aڄ¦µ3Ý'k)Ÿµ€¨ŒC¾kŠ AäDᅐÎ3rrÓåÖldf‰ÖÀÄrÉ$W±-(³m©S>`-u0¼§šáºPr•…‰ $987­ +%WXâþyú¥bí…㊇Ü{P†k(o’w/ýëXæ…¾j3ö:–³cs+€ 23ÚÀ?™§píZí[G>ˆ “xk˜&ÈÑXì$dòFy-1œ‡¨.uRä¹––IQ“öOÑ¿ë±>P d ¤±·™Qã^¢·??B˜êIJ%WŸnÈ£i›Å\ižÝo—I{Íó ¶Êa:¶âÌÀyÎpé§ýr4¦sG£BÙ_)'sVØÛ3¯lˆ^‰Ñ%Æy UaV+§/Vˆb૬ÁÖa…b( G1É,¨6ºœ`+«” !ƉÙ[ë!¶qõ‡‚¢ B9ó•ÌDŽö…v"BÔD•Ú`G½­´xFþ%QSòGU÷L„-¥Û%|n"xF€ëČ(r + *åð íΌM ÷Þ´±C²ì×Èý~ñ›ŒÓ–|©?‹Ks¿Þ’eö†)ïƒtºò× ãq¡Ðº¯Ãɾá?º5g¯8øÅTbÉ£±‡[u;åÉ=oÂtÕ¨âÔÝ\KGlOLx²áUeÐìó“{KÕ»Kù?P=²5÷£Ìà10(íN=Äî8›Sÿ²z±¿¯Ï*ÍÎ?­û<çq²¸ÿFcêær,ŠT=úÕpGKƒt;Ê3\’8y˟îÔ¿HI3ˆXIì­áFUïs°Ñà¿ËÄeƙ ÊLŽiFYpÈè(x1º´—£«“Gދ–›ùÏxûAhÑT‚,*¾ V4—ü$ÛpGʼnþ¾ú¢8Q®m½AD'ñ2E#7BÔlJæ-èÐÒx=åe<£ “ ݎ}òÌÚÐБr»žEþ2T%Š„¡=\hi¼ åÚÖkTèžÒå&Tm"D+ (±¨æ ¬¯ÜjîÙ5«5ÍÓРØ%ƒ>PCXÐÊ%Cû#­?„±­úä‚{ó9™Äù´`_A|v#÷àsÚ÷+Mh“fm² sr~$p\ƒ@KpOÓA +ړ¹{N#—õܺ“Õ‰ÙÁ@”@ž]Q±-Qêç™žˆg,ÚA¹` +O9ž—z¾ï¬í½…¼lmt'JIJ¡|ãi;íñY¶ðåû?eg1™¤ÁI€KÛyï:' ‘¬sàñlKuFp߶”Ásf77pÎØÚä£9¿êÌï처s&šÁn95Ù×yU´¤~ÊÉ8Ú×KÎ=¥BÎå1­\8Îßfl»ò +Æ9r¿·Wœ×Í6"V|âÕJ Ã)Ÿ`÷íMޅp¾÷‚³&WÀÙnjd8é7Wjkœz¹i 凛ÁÊâ–Xn“PMqW—¶ù=8a(hœWP›¡ó +hk{ž0›¸”’ß’Í"mO‚ØmW€Mûø„HLaýr G’µ•rm™JI5NVæRCwfí¾UšC+2Î@4»‘¡9…rš«Ûå +Ÿ¹{Ëgä¢-…È=Ìl9R¸Ìùí×T»èoðXSa¯÷I¤¨_e>·ž (“¹7™cµÒ=úKYvÌ&ÿÈ΂ÈĖÜ2ߚ[xÌj8ÇdRИ³µÌ s›«\‹i•Növ¥e1Sƒù»…üLW•˜E˜ÎS¿¬râéí%VÙÕ±‚žp«•©@/Ó;9‚¨[ÛÓf–ƒiš]^×¢§¨°Ë•vX]n[P'¤ŠgAR‘%¦ yê·ÝÙäG—n²²¹Ì2µ@.£—Ä%îör.¯tÌ©wU&2…Fä~¿ û žy¿Rý2 îU`šCuj”åVí×E[A–Ÿr63nAÂ:5•jêø3êçn,÷€K–#`ŸÀÁÙÔ´ªB@ €‘/U\±Œírïn!ÁB‚‚{vBŒ‰ÓùÆ®RÃÄ©¼œ¡œÚ'Ò@¤ ;lL'‰Qw3ãáè:4Žƒ±'°ú¡ñt†ãVu´&«U“ýê8˜)Æ3žñ̘…hX äV|à‹‚AQCÁ 09/|Ѐ }A‰íüF7O#3‚D$ˆ§`ùí¬LÐ -D£J!” ^œö⃠w»:pÍ +ñÓ&Åò¶¬âëÕôã|I)¡Ç ý+iÚµèhö{7}i’¹–MšœñW9Á§"ü§lNN8u&èpOk dØЕ…EoéèéaZf<h<Áxúj©4óM-¼ŸyCx 3QJB3MBÕ¼±0B˜ð<<ÞÆÆa ¶ÙÌmÆ}óæqµm› +’t¦Í›çÙÜLÒ§?/÷©¬k_v؏²mµÑ¶±‘tI²6”.§eYrp°H¶¥>´ i)iuzL‘ÄR¸a‚9M.=Òvp¨¬&ïTè¤; …6H„*4 + ‰›ŠŸ +ÑàΓ<@¤­”Ô "†xŸŸÓK˜ÿRÕÿ±*„†B„Røca{ˆBD A\ @dÅç¾9X9ù¶_qA²ó|¬êÍØ?N4"½XÖ`ô’®áDUÄCAx¿g1ónÛ¤ÆÕV¬©Zm¢¨ÄÜn#²€@ +EãQ™âd|€#* +Š\|¤œ ”F›Èà AÄBB!§ÀìKdU"¬Y ÙÓï; +ש›fÕ v…=‹·ªtãVÚØÇs¾~¢Ê'¾ÌXÆþUý-ú·«Þ‰ð‚±§oV²‹}泆Fq‘žhÈtš¨WÙ|Îd6ZóëC:W4ìSIëY±õ#3j®lßëÍ-G£Ï`{ýÆM^Ýj`öDŠ}ÃWjR=‰×ÃZ–Ï€áCœê{?wM ýY=ò×ï ‰|-·Þ¾ Ÿ¯þŠL€×ÏPüz¾È¹œúÈкN.ŽlËÉH<ÃoÏÁjÆOÃ{½z_‰¡’EDƒÓúU~?Zýx{}|çoö©ZfTë‰$v«wðÎé eù´î +·´ëñ°g`AO hŗV?í£pÍK¨u=üEdŠF}țއ4M@HŸÁŽ¹ï=Øàî2/ô _†%j?û%·Eڈž_ðÖ¿Ñ·“;opësà¡u—éÅ"‡h(wÊOT‰„}Ìx!$L1Ö[†ª Öó-ƒõêñ ÐÜt#»|™Œhý¥Ôn%°l¨ ´¾ۙ«ã„µg½ß?/`̵ɱv8ë‘;¼¤„°,õ>Ýè"€ØÝǙÖ·»ÎŸ~JùڂX_À…äì°>| áÄdM¿úqúô¬Y lÐæ«GJ„A@ ±üB«Þ4±{jO_zéÈ,dÇýÿüÕ)º…Û®Þ}$‡9ï¼<)ס€äÁ¨›ˆ¢¢¦Øe«7ÑBûžVà¨VŸ }άÑê³=@ü~¿Ñ V½¨‰áà•{¼YMŒ0Q²£oUo™¿ö_Ò+&G/ˆ©¯°fêfªçêÝ⼐ê­3À¸ TJõ¢÷†[û±õ»|§3À‘®jT¿€É.xoô¬ Xڎºj¢ú9²eƒ «'HÙF‹+Õì+JÆèSoîOÙ¿3¸ÛEö¤mÈSÿˆ"éMÞ¨³›ò†—ú"ËRÿw÷†X2h>ȵjÐŽ”ú՝¹ÔïM¨Ú™ºÿÓç…lž ¡Ñ´yÔ'/ö Rïe²MÅCê·8ê¿Ô½ž‰ôÜëêXӃaÍÓgÄôÊK‘˜h‘¹,L\ÁS{ӗÓKq8å@ƒúOü²¼î^D!¿tY`ê•^ÙO‰qõ$•K–€×hA3,Ñk ç'¡×§7‡weÀ¼và¢ü«Ó_$±½€lΒ·Ð$“Ó‹oÖ.¢ qzBŸ!l¦"} Å;„fh2ÝÉP¯ +p¬”¢àúþ•jRÓ³ äç3&Mï~¤Ï<ÍiñÍvM?æ®ÄR&G0EÌÅy_÷й%¦?L‘}E§£0ýðrAË LOQC@Yۗ~2‘„Ö({qàX^zø>únÀ÷•éÂV—žTeÝÞ?¡áÒS—ðö´Díæ¡(Ì›h(àÀ±åD½ZTzRB!Šg¬b‘^Súóô‹{LJ?Ֆ’æq6¦äHŽü’MNzI¿E#-3¡ M¥1égKÀ]ª¥%½wE”ô¶4Iz)•št”?T~¦r–#Ò"%Z£µ2¤'s%Ÿ2|ñf©é9þ D~¯'¼=T’ +Ò÷×ÊwÒWcÐQú®½Q(µ=º¤@GZËGÿ‡¢É!ŽõèÅ¡GPÖ3½!ôà~óPiGÏèÐ+j2]/€ÛóHÍáè™N†!ZAÝècP -”M6úYYÐõ°Sjç‡Ò)\D£§„Ãîf +ÒLÊ5£ÿуÇÉè¥5E±£ß¡¼Ädh0úî¹ ³·ƒ;{$ͪ93Ë*ò>ljþs {. b9’ ™è©à„÷ÐvMyé‰~º±­|SJg¼&Rþ˜Ðç4 £”žFþH!ú[üYŠÀk_^…¨¡oyèå:h¬Hj¼#Ã]¸°Ñ÷uóÖRם¡2©G;ðÄB¯ÒuH͇Ë9«T.ؤ ©±;$ÁæJzòøÊÐ!&‰ÐGWfS <6Œ•½Â¢i;Ó󮸜ƒ¾º¬›¨Og¸Ó¡ÕO)jîNƒ;YÄOîşnHû#ÐËûÈ Úâ´(ûËÀ~tjFìÝ5L¿_)ˆ@¤7H@NIÖûÏ#Ûbó‡RþùÑÛ§?ß?’7bõ2JôðçIÖ×òu«|€í硨±‚Iz@?ßæÃ× ²e¼ñ=–Ÿ[@ZÃôw†^ÓǬâ¸~Þ¬‡zTÉ}^Š«‚~ƊÙ磄fÿW¦ +~ä~‘ÁŲnñ‚[×í¼SSzzh³L)݅)+(‡`Aìy)יªk€…žÇù´6SO"áouèynƒž‰‰Ý„IZÙy—@Wš!ÐõÝlO^ؔç—Æ3-×ßr@ Ïó²(%ž— õí1F”%<Ÿ;ýIriÝeûÑ 7êÃÏR((”*P›Ãòη:”g*Ù `Àgúa@׃vÛ±•ê|ey—Œñ8-uٖyI€FZ²éü­Ý åIç-y‰,ªŠÎïb™&m}“†¯žûøæAò媩 l¢çs^rèp왛˓U\ŽWˆóÞy8ÉJP…“‹«÷z˜w;ÇyåìT•¢¾ù wL+šWZcœ·4w.غÓ!„"Î/µ0£S ḉ­BnLP‰C8_ñyIkníNp¾!„gÀ/ÖìÍn>*£›Ÿözfb Ä,7/vg³¥TªªdX¸¬Èm~ùg˜É]Î'ù™ã–*Rk®Ùæïy5ÄöV­6o»aíK‚6? úžŸM›ÍÉ­<²N6¿8 “&ŠÍo—·ǐc–š>!‰›‡ààÚ°ëy͇(>a ½åšg€ÕxϸjÍÿ©EmXó&e|›“Õ¼‘;eÕÃŒ(E&×5e#•Ì÷:ÚÌïùV)T¶§ æG·rHï”ÿ9`ù„Á½mœ˜ßò_K§aþÝè3ˆ€£Ž®—!&¿”Oø»_‚å’ÇS%2¿K0-â)Gâ$“à,ë1O¹l—ŽSŸK kº‘²c»}(<šò2-.ß»’èf¢c°ü’ØŸÀ¾ü0ö:•á§Ïêù¤Cǖ׎ù†Fv©fù_°܃åç.tyû/{°¤¹<áǹ¥ü)Éå›U|þ¥Åå±Nr +ÿÂ1³ò¾Â#±`FÒWyِ硲ÕÏ4<¯$ÿ—f헤ˏý6ãñN•DFí°-ÔÆ„(°æF²Rþe#V読üpJ]0(1/)ÿ»ÊÏ;£"!QžêßǪòû_]ʹ+B8QTúÖxQr<1ÐR²íØàisÊ´\,X«)¿QÞà ¦üö˞0+;;“Õˆ±VZÊ®iéþ‘$)¯s#@¿ªraSE$ŽòxŠEø,mr Ǖ†Gi~òߍ˓pPJ7Ì ôäÜÿç^l­p{dBÒ:õk2!0¸É ]—ú£|QÏJ5y)—ip|`õcGŽGò`_˜Vç%ÖÈ­bÈКÁ‹Ð ?Á%}Úëx4^¿R ÏÇ¡œðK.‡cÉOd%<~?í6æZJ7¹`5˜1s…¯¹Œ'KhN “<]Í4wÆ®Åé*Éÿۘ ²A›¼ùòLª@_éR´n;ƒŒÄüû3‘ª'E(qwߒ¿c–ÚÈßÑ Sògm &äCîÌ©uÝãö²¤MÉS5Lí:Häsú <ã%ßx³oœç;x ‚R°7­í…´Ñ8Þã· gƒWêêD +~Ⱦ³6Ôóø“a6B-rzüUpãòe…ä­t)/쒏™)–í31SÚvˆŸãýþ@ê÷øø£MóxW +Æ&ïÅ°4áÂByG|5àx”ôRO½d úqê1ŸÁÏlÃÀâ)õû…JïøëÍÁWB´ŽG‘·A–Áö+Æx•’¸ñí¥ãm‰ÃýžH„ŽïYD*ùxf(€„¼©4ç"¸Çòn–ˆÒ8Þz–CãGÆ£žØ…ãÿäP†ï…N‡M S#greãµÆ/t™ì?‹Óý…ߐ̻>Q($Çôc¥- +’TB#*†¶Ëjh¿×¾xЃ|”g|GYÀ|úœC±¶÷Aý—G}æ °Žñ5^Þ=/¯oÅxðžs¹ãÝðE’£6†ñüeA.íÜ;쾕î_çºVçå µ 1(÷œûÞêôŸÍ;½ø¹aðâ5QÖ.Þ©ÃÀŠ.Þ0»{Ê$’‹7 ÃÂÅ'†ÍÈɪíÄâ)ŠaBd˜?£DHü$Ázo8¹:KKhŒ=ñî ñÙwÃÀ¿KR¬?á‚çӆ¯ø0Zñ›Ò¬žH*~7¹OÌ8Tü a\§øYÈiÎsxxs—’Ú~ï!ވƒo_ A}ù価Äpm)d(o¥ºB.¦Îˆ‡{×Ù§Eü­é2K™ø¼x˜x'Uq‰_­`‰ÃÅì%^ +Ë$Þ-«€š‡G„?S¾_ï‡׀ø¦Ð.Fž[ñÂՒú(ƃƒÊvîMNO€n¯Iƒ0-6¯S?åðÉ$oÕ’tD£®¸Ý&';Ãè‚“ñŸˆNvUèm¹°Î­ä—¢RÇW/‚‹7òÄÿÞ³ Ø᧕Ë&¢7P‡ß'#Hû^ Ë@èèž5‡n9ö¾@/X}üÏ â\Q^¹¡(í‚ ˆkdÃ%n/4Èt…‰3¼¹Ró˜f2|FڐÆß:sùFV¹ö$gÏ'&BãDü:ø /7 +Ð:ò‹ ÖƒŸ=<}†--O¾Å%Oçƒ÷¯˜ñ܇€»Ìýñ. 7“gVã;.©È–0)Ì'JZlëµ3´i-€ÅŒ–„$|ïÎì’€“±¾‡am†±ei¼†8„µ÷Ì¯^®Þ9ÆãLÉß÷³-xž½÷®.xñãƒû6rß}¿A¹Ëċï'5«÷!n9øsëÍ+¼Êààǽ¿3©ÌP„Àúnã Ðóiµlð„Õà÷JMµßû=—ØïúÀfý®+l~œ©3"õûêd¹)Áj’~ÿpAn‘y *¨ùœŠ]@¯3Eg•ê4q` +¡xèFÝø]†÷!Á¤Ý1J¡‚òEĽë¢Gâ}z«´{Ç°B`¼Íy»Œ£1CJž6¨L1hÁðHõ›¼'B‚áû¿¬/g_Œææ m^³ù8d=Ñ;6¾ ï֊Eå1¹nA“c)þ×ÝMï@†¼'ć鰽ÏY:|§5é}¨…·Í®àóÌ%ÎüÖ<Þ Ÿ7 öÖa‰CzÝWXuއzòKwå{€TïÜëS|/œM¥Þ]Gµ‡éó`›Ú«Ò»Æ¨7—Á™8Æèý»#Q„Þ«Ê;,¼ÓxH$'Ý_´6b[×Õy©ÍœçÝ¡Ó(”ÔľÍûûÞ£J^{gš÷‡‚úh§eÞÿ4ëÖo>€ÿ¬Dމ< ½k S+l•nQ8Þ?ué¨#ŸîýZœØË{ìë°úÐ! ç ÞE€-Gîd¨âۍq™ÑTۛÀ{dã×C…çğEÔv—,2ヷsçÓþ5h›û•÷¶ Yh÷+ҕvÖo–sÖòUv‚ÀSݽˆ˜Ã#q_æÁ‰Ý•xºÄ=!wµ¸½ +&ž©=RύègíZa…&~ là¸SoH w1àrَ„Æîzd¸¡î38vҞ|{¸Az ó3þSÈÌ)‹ +b†N€Ö«én4X¥ÃMè‚ ƒlŒks€u7ÏRV`ÂÕÝeœôtÆL º¿ì<ñe÷ïÓßjêî3©;É s‰bQ÷W.MT îhe†&"ºkB¿ÅS=åo¶¤;®¦R0ՀÝ·#ŒݵªíDïÝN½÷ ‘Ô՝ÿâz¼1âñ®´þÙ ¤ç>þÔ½»¸ÛþNjܟ)ôc6÷ìÑë¯ÉYŠæ.o?}Ýx±)ü¾‘hÅ:ª;†•ûß LQlÆýªà”û¢‹{ ô#“û÷è‰{óPvŽK¨}Ð{J«öÂÑ?qïÉE÷mÃ+ü„î›3qÜÁ h㮩Bò7T¡»ä#ë(ãn·(Í! CO´o?›»nû6Ï¡fP{àƒ¸»Iè$Ôweüv‘«îcÿÉ¦g»ôˆÅ¢‹ÓžÚôÓvœ°NVõ€{UÁ=—‚;a›rlÒ¢¢óö–2zEó½¢?Üín‡$DÑJKaG5‰ úí×»]„ß~„÷ôƁ8Ç÷åe°L”ôíZ¤FzR£]hW˖"Ø8éºFN®l~ñö~}ðv)™ЧO­óùTÑÀ&F}1=†q°Û…¶n·š·vþ((r&°s»ÓË/ªíjQ ÈíÞ6¢2nÿ¦m,&n×f.áv­ÈMb÷o&)`3–m?/¿¸yµl{d/„fî¹rä¯PÅ}lGq@½µ“ÐeÓ¾~WÖv8•özÑnN¤j»UF€÷WPZ—ëž½vÆBSûÒã'—îâ×~ø»Æ#–»v…\B •väڏl‚lŸCC¨=ÇlB@(4ˆæ@úï {Ü-ÛÍɂ!WÁ²æ)ã9@ +ºK™$W»Þ§]CÛÏ>øY„ðғ±ö¢kkon!´WG¿°_û >Fù×Ó#3”æ…òxV®½ÂƒaÙ{R;3£ßÓ1µ‡¹©Ò4q¿ò(zµOQj¶À»û¸Ú5w˜”É’S´9íìçÔP“TûÓG†j7«e/Æ)BV/õ€LíëN Sj\Äü̟QÄ5ƒÚAŠdâFíΤ橍éYº’ّ!€Ý¯`pîʨŽ|¬˜ý³­×j­w(÷e_B›+²:/{,¨†[VuÙ]$œñË.­’=-ނbŽh¹¿´½ÌžAɖiš *tK–ýiѸÁ²nFlWöEÙTY¬ìÛÕØ]çu½ë)!ùÔ +?N"•ýÓHH&lÊ2Êâ1¤ìàƒÝ—(»Öó" ©98ù\yÙWR0(›T¢ É¿2ޕ¹ú¥îíÈ>¨©U`Ã6Ã2²ß¾IC„ †…‡µš •_Òªžk„©S{Q;±¯«QÔ¯8do6Ô Ù­¢åÔE!æv?vŸ>3‹7£zìcSSëZ¦UÙ°”’ØŽP'¯Æ!{_á oùÈؓïvECÀØA>‚ vuÏçù‚ˆC«Å^Ì ‹}Ì1܊ÝØKá«Éüã¾(‡s§r™ÉW‰k½ïAb‡ÿ4ÑÇñ”HšéÎî{(Ñ‹\~L'$b¯ÄH4Q !öq;2@ì@dZNìg°§šW^:ì>֍Šœ•…½ÿ]vD÷V©7ð› +»-º? + + ¥…ý{b¾œ¦Â9~«w‘¥6$8Ø;†~'ç_nR@I̺Ë5Ø16&ey±`ZÄR°ÄK;¼iìvêõ$ƒ>AžLº¯û¿¯³ã=Ð¥P +ìD8i࿆°Û ½t%“/xWv°þÄ] Ï36`—ò:aþ•õ3º×¿¯T&ìNåëöฮç Ì*Vȯ7 Ùt÷»h*‡_Vc+òûâÇÃ`Â߸Š§·b_ï:™lIP1#œtõu¤²ÿ3ƒ¾îßbæëûwZSt>ÇÖâëU ëýÑ~Öë³-±ŒšÚ9·#‰zý&ú0BÝ­"sØJvjÒë~œ€œ“ŒüsÈ3îv^³¼9NP^¯* Åúza˜MÆë¹8Sœ1/³ˆ×MBµqNªt8¾ ÎmZóÿ›3æÈIÿ¨J‘fü8'š3Y×g.ßRy6:.|„6rÖ¼ªë À\öƒŸî]ÔHo¸ÞÑÒ2AfÔ¸ôă Œ +WnÇs=¦rKWL@F9×ùc‰æúÔçd5êHÀ§ s½Dè$óø‡>é-â9ªøiFˆçQ®;ù¹^@Ë •­ëŽT¾dµhё‡BÑ +{„\w1 +f¨=ZÚВÓ×OçÐ3GŠh+7”;Ì·~‘iŒã«·.‹IÄñÖݦ>ÏHA< ÌèÖ-ÿ|È;íË#”#1*Á,Ûú_Ý¡#µõLóÎ m=ßàM–yK§ ü*ÁΰiøçsˆÖ¥Ç@h=ƒšZ÷;@ú¬ïÆ´èûW¥Îz>&’>Ð`ðÕsöbj[¬Ó€›lÖÑA³ží¤Àþ +§<Šw ÍÁ‘£tÒ&ûF!{“õÏ$ë·>¼ZuYEÖõ„pHXàµ ëîfŽ«m†ðµ›LmzD$lÈÑëEÁ‚€Vc=–Η-Œu)™‘ð˜o «h±î2¸Õ‘_ß|…ËT$h‚«?½˜zX‚LqBõîJÝPñèT0j‹©[iÊãûé7¼(` ñ™øêqãØPP®Y­kՉ²ßp/¥ébôêS<Ùæ*4=¸xf[Œæ§O­é÷oڐ+®>ÞÌÄ»HqPÉÄ´Hn$¸Õ͕Băxx֟ﯸˆË€»^¡Ž±ÕÍ¢ŽÊ‚\G(î³7N­®Î>J€t[°=Ö`®>æ†UŠy¯°úõuÊuˆüÀê» 8]†¯:ß®øX€ƒ)¦Îx5k¶Í-]¨ÃЪÓf®‡ÕINåí;hô¬ºá÷ë S¯n$Ó5ºæª>¯œm~„§Ùê »Ñ¦eé¬Ö@ãTÕÕÌú¤Ê%˜D÷¢ú¹ÞÀ|ƒ A0U¯áf#’ºª76XÑ)‰éóÕI°ç's n;áþ¾LRbbÉW»–úH_] ¥²ïÈRi2ƒŽêA¾Â.~R ¤œu˜é ôtaý ¬’6­HLú¥î8Š¢Õ­ƒ—ŒÁaÎ3ÿ¨kX‚×MDÔ)„§^\JBÃ~ºô@‡íeIkEÍxî¢6Y™½ÄMâ:FTHÚL½C`Ÿ¼Œ¼1“v!ËfãJá#bOslM¥>ÉD“J¹0LÝdR)õ:Yµ@Ŝ»ŒƒÖËʊóš&fmˆuW— êà[%òl—È•‹¤n·žNH^Æݯ>óÖ'ß­sŽÝíý$@òVB»<½³€ñíF-£ž8ñz\C0ê~ím™“.èŒpQÿãË}Ʊ¨»¤¦—ËèлäwÅèjÝn¶Óš¶Dè=ïŽytžÄ㹍…‘îЋõtaÄ#›>V9È!BŹ“z†A;ý R÷Uæ0e9Ô]¥9|BŠ.€Èó¬l5_/ ŠñQ©qƒ÷Øm¨Ï}¶h¿†äx\ Ïד…ÑO$8ÆeaXø}nœ§díx؅ $&âW¬ý˜É¦Ã¹øœS­6ï&†k¢º³qŸâ02Í1–è ™,DðÌxòôÒÚ."$ç©Ï×ݙ¾Z!ûAád&ËèDÿʅ& Sý#÷Q!‚¡s‘áŸ#4¶‰%Q{Áe>×MâålcÝÆà}çmVƒ¦œ9_f­£‡ƒ`x/Ìåì®,ÀÙ¼ãÓvûV(reSÖQÂóú™ò´°،Ì߉?æ ÇÄâŸàh ‡'>ž¨T%ׇ‘@ñÖcë“&GÂtkS³¾”{vŸúˆÚ+Õ¹C2ºBQå8|‰ ¬âNŽbJö횉Œ‚u\¡fX1gžLúqäZé¡`¢¿­Ÿ…rl'³INåùRïVbüf÷â MÐF†ÅI .ë˨…·þ ím2¢D`A0QmºÝÍg!õRôu!2Á¯râH1;Æ¿¼?§ôÇ ÅLe¼Ì ™ë*1Z‚- úÁe¨2CLSB[hN«FÊ8üH…¢„ý£Ú6ҔÅýõœ=¯Ú¶¸tîÈ>VŸsÑZL}N­¨‘÷k2abşÐ#R€2Öz#* >(Êè Š;§•Ãç“Û¬‚Î]#È ¢,¼Ë »—8ÞQÕ&ß<"£A:ivO£¸K@¬6ÿ`!õc•+ËkZû¶7%©è¥ýÍ´ù#~Õ+`µÈú?¶œó+,ÀµµóA`ÌH—¢!À<u¬äµÎ]©؍£[-{矈0$3§–Ãú~çæÉ2 Ç,#uonL;•2xý8슢m8·ß(Ñl¬s¸A-²e=ÂÞ2»>y$¡Vþ|®l‘ +)„ŽñÃŒK@ ,FdËOà²èÃ8?:ÃFk8øÈ&lÎàCLðAªw´¤DîƒW€ºà¶üKmúß=O<'T5ÚÞìô6¤zt:T98]`˜{YŠuõ÷n&Ð8žV׀€ù~6$&®å<¸€gŸý혻‚_å(#WP$¼2êsw * wTâàù áKZzÆouÌùÿ^zAPԛKLOnÕÃʱÀÁC$`Ò²^ÜÿÙ;¹!징>µÖR°¡Cx¦ñŸÚpL}Ah+f™oÇ×4Å|×|ÀýBgks½cë9}›`¿ZðŠ:¶<þñ–6EâüÀJP* ùÿ‰DÙ8æ¬ü†x´"ôû2¼ºÅԋ•î£ú]ÄjÖ-Ð~DÑ`&îÇŽ4iÁãʒÿ¤q̌8ëÛ©:» ¦W;|˜‹ÖC&@¦_£>cÉìæ0jví&jå!táÇ?5 V1ï@[uäC=ypÓ ¸:CdÎZÁ‚$ØÎ +°!°ÚÓ +¿•×阨&TJ¢¶ÍåýB–Ä=zG‰ `IÐÂÿÐÇÞ8NŠV|¯än]"²Õ +x¡\NZgb§Z/¾Ä +ÌÀkp•zk—zïdø Ìœ]©„ endstream endobj 98 0 obj <>stream +H‰ìWKŽ%¹ Ü×)ò•­õÛN0+Ã0¼ð +¶˜êÆ}ÀŒ*_¾ª¾ªOJ‰"ƒAêË_¿_þò5¿üúõxIÿ©¿¿|ùíïéø÷þXj>ëœG[í,óøÏ?_þõòå«Ï¿ý8òqüxûãÅʹò8l¦sör”rö1Ž×rÎjúàOß*6˜–ϹŽ×Ç~ÿ8þ¸Ž~úŸ¾/P>ÆòË̇µ3çՎ·ï\‰¿åÌÝ·I§ŸXÏÒæñšÏÖV€·?¿¥ _ë™ý´øH a‘†¾¶øÚøĬøOûòµ<+`Úߤ½ÏH“¦ÅзÒÆsˆa7¸_±@élû±'0©ñž¾[¯y3 ˆ7Å!{Vçï·ao†¿=ùvž¥Îߎ9íá[?+õÃϐ{ v-ºcŒ@îín¬G6ï±Ç²…ƒqtV˜D˲ïÏýº¶ò•ÙW^Ø?h G»ùØ fœßaÁR´Fç}M±]g¬¢¯W{̒ç҄¡)ó¸A¶Ï³–¦ˆPå€~!z`Íyͺ•[r¡‡€ +HLJ° kOž^{ †¹Cºp³Â} {t¿‡ùÍióŽB4¯Ã¼˜õ8,¢<ø}›s»îíåÛr8'R*õhÖϖïäpǔ5jsÃ,F.ɗ½é¦ +(rªBHø¿âì—|ß0ùðîŸ15ç@’Ÿkå@ù4çƒ3ÀU`ó\ÈàiÿÀuÛë€or.®SßF`ožìlÌÍç­F +8S‰Þqg÷ û¸â°µæ5NYª§ÑݝWhS¨Â Ã*WJÚxð‚Ímw5™0('‹ñv©_gà7óAÒ"ç¼ÁÛ¾Bà÷OAm.Ï˃ßl8ÁR¹«)4Þ䗎›e· ×àÔùfk¢VQvšòb +õ^°U ežÇaÏ:}“í/#¯Ý™·)Êê!·i³ sšOÁÈQ&S ‘%U +•ÝbO]}€iŒ çʙ”ÑxµšIÍ©‚Aaùz̋I9™V= VŽÇe`¢%ä7êؾ/‹qæQXeºùrøëG~‚ÚØÒLó1(¶u9k!Kp¸“AÄ[dégåGø}äãî㏕ ¹3ª³–ɾæ½ÊzÑñd÷éNÓ@/Ø †§¤[‹¥"o@¾JQ%HÞ>¯1ü‰e@™öØÀ_Õ°3bæ ]·8äÙûáà=VR¥WåîH­êLç&ücœF ùÙ3ÚÈê”Uü&çéWM2v®0 IïÂé™ã;ÏcZÙr ÑE/†n$åx# ˜„Q"Ù7w¿ÅHBPŽw—ÖABÏ^qÁk +:7¯‰¥phZeuô“´OW;Ð:‹Ck˜Ïä­¡FÏïÌ|ºB[f“òýþJ>÷È7gPvÓï6|Ãòbíy×wîõõª!ºýд¾†¢<6'âÞ:{ÏnÃâÓ»á¸ìïÓ¥4¡¸ydýY•Ê« R†²Aјä°)çB_ +iZ´ +­FŽ †"4F´«ŒÓ¬˜_×uåHÈ£@уúh¬nÐft$š¤8Ö&Àé–Û†N>µXÈÜKÏ › ¨†¹±h'é‚ š6ÙÁóZKŠ’$*ˆþ“ö²#Ñd•9{•Õn¢*•™û5Ï]à ²î5­oˆ°ª{ÌFF Óψ| +¹A±€«fW6v²ˆãû‹ZÃÂßdÎ1Fÿ¬$2ϱƚîË9”íÔÑt4â}íŸ)ê×ÙòoÀÄ,ÒÙ¡ûì§7Çè1üÆø§ˆþï7&Xóbâhux¿·n9ýŠ6º {ÈÎ¥}Ôù©†L_£×éW˲d¿}`¢-ﯼd:ƒýý©pç>X0ÔÑ$D¾ ÜʸþŽCø©ÙF%T£ øÖ +{ä.Nö4ÙGßäTY'èƾqO +¶h^Øy¿ã®eO´*;bUçµ,ü‚Š®eÎo§´>÷ù½/˜ŠŸâÄæ½í#}q‹lA•‰p¯®^ồ˜Œz1 >æòR‘ýy¹ìè&š›U]@š_öIλ5±Œo$;\j(>Ã֞Cëo0ýÎìö_š_éÏwè¹-¾»f¡² ty(k òB”ѐ2kz£Í:â.¾íhd«'ÑwÀÊ&ð‡ö/!ÁºÐ˜­ìZu›f¡~Ô**eÏ¡02$lÞ0Öc#èµƞ)ź°w7Ó]³·˜ñ㍫,É]rïä»kûËUe_¸³C}ß¿ðnjêËIŸÃêRÑ>„µ É.RÀp}ÝXàåvì)c©B#A{J¶]¤Ã”û&ï/®Æ`‚MuWÆÕ{:‰,ˆ‡®*v1;|9`1cJߢr£©%\9¼%½¼“ÕRO37%‹PƛŽ\ rkş¦ç(_ÜCT¿æôˆcï` ¥B>P¢ÝW¬Ðcn@g2К Ÿ9݊ÏüÔɚ7âxÎTï´Æ¸Å.a/œU¶Z«DŸ;éÙmI ³b<¥ Õƅ2ût.j^ÆnA£OØïO>Æòp¹)Kµúú ïå•mé3ò“†ÝÖ^'†Œß0 r”À¡è*¦­ mKù1—é (¥Y@ȝ™3Fo-ª¯0ïîžÞHf™°ÐP¯L +ôRÙ]_=ŒBv¨E[ÿe¿Ê‘#¹ ÏWðÜÀQ¸ÞÃP„Œ]Gÿ7T™Y@wiȐ!E¬ÃAGudeI$ô~ˆAˆö·ÞÎ,ÝûÕU¶(U¿6D4‹9UáPƒeHDl* Ã!6¼ MeRY€œdúAÅS‚‹¾5NaÌ_£hÇ\#yô6ú MH1Óëð Ï(ßB }UY1öÔÊjð€p¯¢ ºÁ¤J¥î¬^ð#H}Zª’¿ÒÏclDw˜Öv%+,‹Ï÷‡u¿ky¦wµ S«}½„„线z BtÑÚ¨1þ|s«ÍÈÜY(VyAä1«|¦Ù»èêç›l„f§Í‚u«ATd¶”³Ñ+HRKÅv °Ï-ÀDÈþ·²âBÄ鎠WçÜÈN³±úåá<%©kæBD?î9 +ƒ¯d¹T¦ßKÚ vµµabìûVŽ,‰e¿ëÖÿ¹n™G;úVëÓsõÖWzUõ"÷¡&™»Ð.5ª]7AÇx` ç\äÔ6˜%V6Bôõ2¯•`:¢±(ÄñŸoݓOí¬÷žÆ×ÈëS§íÎÌù lÜx ÐãjP‘ÁžnƁZ«˜!%}N5ûêd ‚ÅqáåõMPtL°| gª”¯¥Y½å>Èée–;l£î+dtlûrtqäá~Vº†¯U¯M—¡ >c –gÞY_*òƒ%§T¾¹vt# ®2?á!‚]ÒC´N½+Ä@žmžYßÒÎÏ)|yveWT¾LÊmR « ’ àÀÆ]} jBzT°ób™¨C–ÜÅVL5¬³+s‚¡y‡ZËʃÅ2h£ªö¥>wŒ¹þ(Vyëé@‰·z ¤/y8תúÃC@q ;Üö€%” æ¾.xÙw¨iÉ"îrNàêÛžYmÖúJå.þñBî],z¸ ñXŸïýÙä’ÂEƒ?w¸CÎ?\¦fv”.瀖û¤W¾tCÏF/6ãúG7úèlÞP‡ûòëŋÔÙÝ]¯ÜNü|ۏéëªÜü¼9{ë˜:Ê،WC“í @ !i@7ÀRð+аrAhuÅZ–ÌD=ÍT«£‚ö¹gDd8 ï±Ó+é= Mâ0ñ€ÝI +#W†‚5D?UœÀ§_pJ!ŠJ>ô†p0ª²ªõåo’FŒ¾(åáù;žoîÙI‹iUF¢÷h/öÊBX\­~Îïd¬XüÿµÍåo­¸&’Â3ðAmuLuP\x?{¦ñ¾f¨mÏyî/Û»Rè¥`í$…&†,¶öyÔ–HS§½)¸Îiš4§!'¥@í ¤YÏ À3…zsŠgZlá0‰bT¢Ø(UŽ™®› ‰%úÁñýØx.ö`[«äßióÓ&'Ä¿ aÔÚe6î >3ÕÚTÆ+ô"oY=ÐB9A3Ë¢‘a˜ègT”'Ú+]s¤ö‚ö'v1¼£tF¨m-f„t)s€&"׺á1b6v?Ù®VWõÕ&¯ÑªŽ‰§ÂäPõ¬STK[ª¬éu~ÛB¸ü½$Þ¸÷‡Â¿."G’žÎ\¯p°©;Nìß &¿~î^˜Ò7U–yˆ”ÖBÁ¶<ñs~·J×ýÍ~•äȑäÀ{¿¢>P‚ïË{„t.óÿÃÐÌȏ¬lŒú2ÀºT¥ÑÃ7:i4NvN£”›vÓnŒ?K”_mýÅÔÍdn_žº»»0ï스}hýïV釹CÀ´L”ÃT¥:œåp*Ç?ْHS7ç’E¶ÌÑv¼Qñ0$MÑ8썳¥É˜ŸcJ÷4gOú´ÉÝñBxI›ƒ>ã]ÉãóuÇAú÷§_YbtsÿxK ¤ÄÈ¢ŸÌ ¹ö!*2·ÎDjE~fF*X—5ËàÜ‘ÐÈÿÔ®8œÞ IRÕÉ•»Z× +¹ë"_AÍí5}'dL‹k|<²Ýòw˜–Úh^°?jøa°>õÓ¡Ñ ®‚tô‹wÿX£²ìž°ñC±<&ãdÇڀü<¶†á8f¿ü©']n|Rí«Ñæ3 I‡`"f÷ß`‚ÞŠ#«Rõ 1iÛ¼åt¾Øaš|ˆÁüƒØ‚r*Î!JýÆÃ㹄ìÖôŒÕo¯|‹1œ4¨žuÕìgt€í[nUfÔ(æ¬ÅÚ †¨©¤1UK¥žŸS  dõa˜U”­€Ð'êò(ü½Mª{ÿF›tû%'¼µÝ}Ð\»=Ù¡Ú þ ™Šè팞½oզȖËZ»[; mµ@Lµ­Žo($!S5QÏ÷MŽ}õ+ç«Â" íë¥r’wjµ³çƒ³lÊ\v›” £!}Ìޅ1.B«Þe  je„ž#‰í[²€)ŒéÅ5¸‹Î‘í.Bx¬Å¥ß"s=ÃiwEÜ–z7nÓºáçņ“ѱ•ÈIÅ¢)Y€x Št½ÒwÌòqºø5_rªU“qÑÆ~TnïŸ<ѧúÙ‚(í}›¢ÚŽš(=ÀcÍ{l–û÷Ò­½ðµ–çÐÌåš39§€o¡¨ãXó;‚Èi"¤çI!1­B_ôÞñ,MGz@ÕHÞW´[9?}Ànu­r²ßø_K½‘Žy®¯ß£¹ïäiêp-zVUåì"³œ/š“Œ2¯ˆ¥Z‹ßJ1ö€Á>6«•/0³B_Š>"ʎpŽ•fð`Í×X"ɂAÆMƒH¦Dƒy£Á(I3¥|†;,"'²N(• ‡¨Mƒ(X1ˁ§b¦k‡üB.Ë}ٛ٠1P{à“’7^yoJ4óa¥gî¹Öˆ"툇,R;Àdu´]ñµ½ÂÒèÎ¿¯Ü±]¦T·¬ÒRŽ†«Âf™§†·lìSIo9o™îQ¿ˆT÷yGm?Ëðr ,÷¬dšrx™â6?¸à˜"ñÚxKž§°„8ï‚D¬ÎÿÂhUÙ_²ŒiËTy;”D~¸oß&狚m¡ÅÛ£eqäÁŸJ9s³oªø £UZתƒ€ €Š±ç]ø7+ueBB]Œ"r#‰gˆdîrŭߟú˜)$¸ÄÑEÝÉqÆÏ됗4óQï&Z£‘êIîSW!iì<˜\áõ~ z9é#=¼ôéô`[jˆ~¢ÊÆ%û í¸ü=ÇðßV£›ÔXj±Ê f»p³„xò“\ƒƒÍéÏUqÉ%Ó¥NÆ:ú÷¿8^ffÅi6ù×Ã28¹BSMZZÓáw~¿ü{Ž>É=ýƍÙyZŠ=ϹŽxîQçâ‹8b¬p^W?xµ˜u®ö§ ýӂT‘¼ô;25§.Oêڄ<ÏJî”_ìœ8& Ì@Eôóã¯g»ù+°­¿È™”Üۗ§ûww>ñ Š7´ÿ%L“k6‡¹“e2_EÄSÕÕ±”YCÊ +˜Š'?¤)J&sFíUó⛨ÅcT‚S6Ζ¦ªÙP‹À1â,öP›!]öƒËUz°PÑ.uÇeÕò‡=ùë´ÌB_5¿ùâæŠi½ÁbîÇpkßê\ÈýZù¬È”’óÃbn°\m0$6ªC5îÙ퇵[}+ÇÝþÏc…ÀÚC3²!a®”Î÷…\§ˆ/îsk…ç=0cسöÇÍÂbaÓt®¾ÏÝ-ÛϛkW[üþ °Þ ¾7 Ký–§ŽÅÐ״ǽ€å !¾ˆ3ÆÏ[h‹‚-ê¶'žþbȸ°Ð›˜ ‚¶5¶E p¯Õ}³—,%¡âœ®Æk'¼ï|`Ûu÷ 'wÌѺ­Ô6}“æƒ8¼Þ‚ÙJš_`%‡Ú¾MHÁ˜Ñ*7%_±‹îôƒéQqk~ü4ÿp‹ž0 $ ÊJüÞü‹ßQë…à‚^Ñî¼xá4ç{ ­¿K§…‚”=¤…s)q6cçnù›½kœ¤‚W½ƒ÷:yZú§¬‘/Ëχ¥uZÚ6þ*o-Ö©ÌÉY±rX~p¥Y”X£,Ô¼Üít ò•™Gcé4·¥`—ûÞX,äfËnACðÆrϲç²þƂÝåÄÂˋ +Ú¬û’ð1å8@˜=€R³ð’îáï/¾šà±I°yʃíÃ6œŽS-çéþ6¸ëeïãߘ«ó¬2HþhùŽñ—¨=Èg¿@ÅaÓY”¼:¹$pˆÕ`4VlɨŸgGmHŸ&}çE';Ëɹác†Ýmž‘®¢oãWqVë>¾ºx2êL+©sŸÛÅ%ä$ï=êWX#:‘9è!€Z °QSYPLP<¼ óe1¼¢s„¿|E86Õò„} ˆö +ƒé¼<Çì²j÷o½Iu’ÔÝáè3ò2•»ƒÞ‘[JÅÁQµCÚã¾LéLÜlîÁðêãUÙ9¬ÿ0nw·ÿ†0n/aÜÞ¹Š£•¬ú |êBPø »@moV 4Þ«ÄøƒÜF *ªg”k<–ø”€Òœ¹± ߏÁžée£ëöÏߝH~‘e>Êãúk¦âÐjD²;0ý`‰K(»Óȉ3T5±b Ò>[Y$I¶‘›HŽd£,CÈØKbæ׬5öõ˜3xŒà/ÜÕ®•ÃÆf¨U³n\O ü©ÔmC6ò?n?ªÎ×{0ï×PRù4¶˜ˆO´èü\ôk–ûhg®ý@’‚Ò»¿ÏÁ ¯lÔ6È\»½æ Ÿð“ò|ð2yçÑ0©÷ ²¢ãô +¦‘‹9é`µƒ”;—ëW˜—Z,L'q‘ØšýZ ¼9/ƒ•J=ópl™r|R²Õ.áv‰¯`¾ç f£×~~ãó¡§úÆ}‘ªlsðz£¸'Éz“´ÄŒhȂR~Ä] h»4#{½[Œ]ù•ø~—ÝK”‡ü‹~mÉ"¥uÃӇY[aM•EÉ´„B¤K U½~-'ÍÇ,?ž.þh/ZÈâ´Q¼Á‡L!{¼Y‹*ï=`)b”B +ÌYÑÊwÓXɺW  +‰t³‹Æ~+ Ý©Ç(J¶¯ÐYsA'N9Žf’6P!Ìù@SÊç(¥9š¿€ç¸t¿*³½›ÕÍPÍs¾ð­ª@­–Œ#3q’œ“lTQÞgéšâŽ³0&­â[ž1!7uÕÄ«é7¦ˆKòÖ/³‘¹ÆEgžña.xÕö3‘ÅÈm—€4Î/EûW…7YŽ×ê²Y›(祡Ÿ«t.ž_¿Pscgqevßýˆó#¥ä$‹¬9†>2*2,«hdQ5QV§ú^JŠwgpjˆªù4).ø¼ˆž~éºc «¬Óa±úžMs‚d¯|ÿw]Œjþç©ù¸ÜpémÔ\"Òk´ Ê )¯Ý”®Yš˜g3Reûݚ «’ÞÊó,“XÀ£Å@<ÁÇàV¯û"Ž5·cYü¦²Ýb”Õý©È©Ä')Ø,n­{_ÑÊñ‡ôtݶ!2WO£“œ Ͷ^ýnôížÐŒBO½¬Q 92–C•bö‹ð¼¹„¸lS ³Ñ×¹ß]×Q]G±Ð^DÕ¶Ô_jíWSAš¦a¨ª3ÑH§÷0ÍŸ_è(v˜ë·`.£)úµó×$ý’<¾ùÈj>Ÿ³4ÎËl™¤{ {ºäâ ·&Õoî(ìW°3kɖY·;R‹+\i7Ý)péøèIŠzŽfŽ«ù ˜ô6AùëÏAÈ-Ý´[:g+†\’J(äüøAœ{¬;@[ªÄÜY6h]‡7òµ«‘\È# /˸îi¦¨ŸYF‚¢íüä'ësìOdmc6Я¨}5Ÿ…Ýf7÷m¸vv]mÏ{[#7ŒýÀ°Æ랆êø1Õ¹Éÿü40ZoW#¯ol˜”—rãõn‚d*úµÊàÞ±±X­TÛmÙ«>ݝ Kv÷*¹”n1EyXæµÖ(„ê…éï<ê¾ÐÃ&[_sÈ/‚½×$#“dÈ6Қ$åøóGíå +|£÷YºLô¼_Ä†çïÐ×?„–YÂ\ȦBg½YëŸÿø+—‰áÉ¡„@I#·jQ#pf>_fZ× Vl÷nfÂ93f¼ó™ù­R¢®Ú(p‹ÇJÁʱdM¥NoªVckÎL-]ûRœ½ŸAóÓrÌ´þnâ^3@âùofx¶˜[‘´àMË õ>Ì_Yöž_+ËВ½ £Èá9ºœ¦€êöwc%êZQ\Ó ]3Ÿ÷ ÎöîYõff£À+jp²[Àï3x›!7TêÙþnöö4Ÿ«¾ÏðÕ¡Ó=c_mÜ9k÷\ë©p\¾;!åg¬=f"ŽZCÔì·3ˆ§¥—j BðÕ»™³¿5W×Ò{N”ž6~幯â9—n¹{A¸ÜH +ϙÍBz6€ktÈuDàÛ÷x|„>;Üøœ3LjØà²ñõ/÷Bîüљµ]Ü°/ß +Ùsã—#{˜–×À«¯—kÛðöã ¼ð¾Ïˆ™ËŠØáùr +ð‡Ô¬|r§ÕSyýø‰}Ó +ˆèú†ÁSéÔû;ÜË|ùþ[nâsséP QÆ£¬þRÒ¿CÓDõf‡ܤÉyB•–H©_RòŸt‚®«¸êåîÒ²ýk®jUǒÐÈIz¿ ýë]%«ãÂR˜Éøx% ˜™µ1¹Ÿîòut̪WÝþ¼®wp”Žüjë…ûP´ìpæóùÏ´”aù—üpy+ÃÇ@¥[×Ìç=C.½œEß';MMÀ@Vôþ73=­/«<ðo+ŽKÑó™ÀG ՛ÛT3ÉD8rh~ó£“ìíڲێ“Ë2«Ö‰ç–Û¡œ÷nqD–àƉ]4†7”t ƒ2Å <‚/Èùú"»8aMAyӇ”ꂶÙeì‹Æ¡11šª +6Á_g S\y®Ußgð~¥ÄÌx;q¯a*”·3÷Ù÷Ëxæ÷+L²>Û ¸q*à0Âá÷ä˜çá§À¡€í_z=¶›1ø­ù¥œÛµ¹}i}Â+X•Tã;.ê4?¯½þõS”zí'8¯5ŸŒ|ym¨@ÂeÃЖQC$γ½dK)¹Gî"W$ÚÚ.¦ƒ• GÁ"€T´ä ª¢²ï%LZ²í÷{-qV´â—”åÊ]>Âë‹-Ú¬û6«ð’¨i[ ê €ªMasåCÒ=üÚ|vdH_[îP"m> B؆Ó3›ÜU%õ[›¤íËÜç7øtÍ³Ê ù£å;ÆÅ=Ãr÷Âý©Ñ¾"q:‹’7åÎæHõ«Ù]±wÙlµ¼w4Іô™aÒw^äq²³lœ>fØÝæEwµ¯_mÄYy¬ûøêbæ#‡.NûÜ..!:yïQ¿ÂщÌɓ¨/5ÅEü :_‚ëÖü‚ÎþòáØTËöÁ¦s$…ÁV»”ç8àj|Ïo½I›.Øî>ˆ@Ÿ­¤Þ(w½#·(”Šƒ£j‡´Ç|™Ò/˜¸ÙÜ%‚ዏ¡Ìg®ÿãÿ\J‘F¦>¥#é–\ìz•´i[?­áx¯ãpª¨žQ>®ñXâSl²˜»ðýŒ0¤—hŒ®Ûo<w"ùE–ù(ë¯™ŠC‹½€x7€ìK\BéýûUŽÞH¯sŸÂ˜ù¸/çq2}ÿôÕ¶¤¶ò?y‰ÄbsIUp›FNìi[Ãn ¦}Ò ‚$ÛÈM¤Ž`ë ÇŽÚ Â‚Rûï¬5Öu›ÓyŒp_8ë„mØØl£ål։‹ü )*tېüÇéGÕþ@úƒ +Já6ŸÆñ‰/?=Ä¢Ú9oD@;³Ã›IAáÝßÇàؔ¾S2×n¯1È'ü¦‚)Øj—4Ï0™e„–ÝsP=Òk?ßøÄ|è©Rˆ~_¤*d+!¼Þ(.[²Þ$-åz4dA)ŸqڑS äÛÇcïm3¿ßï²{ zÈ/°èkK&ˆ”ÖžRÍÚ +sª,JN»‘Pˆt”%××rÂ|Ìòù|Åw·˜°“ìÐòBv'<å >d +ÙãÅZ°X¼wÀµds)Ê(…)0gy+ßMmë^X<²‹Ú~+: Ý©Ç( +¶;tÔ\ЁSÎE×D;–Y‘@D˜óNA¢ÏÏ ÒõaÀ³]z4ïÊlzaW8Õ<çK¾ zy;#3p’.'Ù¨¢¸ÏnòjŠ‹ÒBŸ´ŠoyÚt@"BlꨉVyo Sò֗٘¹èÆE{žöÉ\vðªågbcF¸’Ñ6¤q¾­_åÞÌrŒ¸V—ÍÚD9/=ï¹Jçâùõ…š++WöÈî»q~¤”.É"kŽ¡AFE†e‘FVj &ÂâÕÀ /%ųÓ9ÕÄ +Õù4É/ø<ˆž~é¸c «¬ÓÉbõ}6] ©†å!Š˜•˜Fžª4qEI¢ZÖU¼"zž4ë°üN9:Œr¦},DOÁWÆoŒ· /ŽÖ?­ÛYŸ%P }•ðû)ˆ£|ƒqöbߦ±¿!jاñŽ«øþÊ*7Ø==. ?à?‘²Ôø&õ¢&*ÌÍz$ž«ÔväÎù7sÀùX0>6¢`ÀûulôÔ1±ås%R*օï ·\VW ötô:]5¨tÛð¼åxçw¹ݍpPS`»"ÇÅüÕòÕñýÜAƒœq6’r÷*£’Ù–|Ÿj•‡Â׶uâŠûùÀÀ +ëêù~éiª%6–*ý]Gg¾–=¸üTãrqñ0äç¥'Mzݸ¢ü¾£I{n^â|×1æ%l©õMÞ-í°rǸµ4»LÚyÓqfðF˜ž~w\›æ”$ÞõÓù:tý«y‘=óxVW!ð[Teuç24Dê6弘eÀ-exçðK¹­,VV £SÌ44É-Õ{Ëæ_Ž¼Ì"P^1îrfJVxl¢_¤#ùXë,åmŒ¼¿'«¾>úI,àMiXñ}}c>ý¹åâÌ;¯º|(ûYï—_‡´”SÆ'ç†ÂS±¬DþA1u‡`.g4ä¤Ñî5È:ƒË¾C$´:-íäÓ "u•âÁyí;Ì + Ö-¿¢0ñ°àJoô ˜)-{lÝõ×¥ùD9tÓ3D­—Š1ÅÇ#ã€w¯á7hcþ0mf‘Caö ‰køý€íÜ] ü”|q?Zíà$½¶…Ç/‚Ú%0Ydék~BG/`ÞE«3B0 ·Äw ´VÍÔ ˜ØÈ9+¬ N»¹I¨oOÏZïMÇ(ôjP'~ÓS΍ŽWÔ9‘%äfÊØ/>C}æꃗôŠþ¸ÀSóÔ|’¢èša†•¼×Tc¾0ƒÅ²BoÍ }cž#³^/´¦G +6‘NÌÃՖ|-j$‰¤-mŒ§=YI§n(96 5ë!{:…Àè×úF2¥æu}EXîyÍ t¬¾`rõ¥‰È +³?Ý‘Ì֦Ɨuœølê/¾1“âí6Ã3ŠYblëƒâR×sJVX—CD‘óÑ¥l[¢j…)—Ë=øv]vº¤ô\Ê&˪÷íuÐjðàÞ9•hòf±Š©ö}‡×ઠû ö^wg6ÍÛ >ËÐRåcШ{jˆ’FEéÌôªÉÈdËÚH‘qÇö¹Ì¥÷w¸—ù2þ‡.Ã5e“nøçÂð“2LWòã‘Ûuí]YJ^0›´M+Û÷*%Ä,u\ Yȱ4Š£&‡oÍUÁ¡ +¯’¶eŒþ(,¥´,S«œ`%yýtȒ½ÿDEÈÇÑ6Ë.2ú~µ3ûAf•¿=“žÒ÷ ú8ŸùH°òçcâuçPGÞÍÎçîø¾:°¢Ø÷̸c2Bã£MN÷¶£ëٟ¦¸ãßǀ½É96“Ö.Ì[.Ÿ€K´“%°â)eÕ·èC4³ߏã›i¦"ÑqµÑÅ*Ì €)Ïä°± Y¶?7¸òÂÞÅ«ƒ´ÆüÛf3C&n†Žóݒ ’D±srúÒg䤉 êdÚìà—ûærµ·wô¾êõ=åWI‚‰Ìó]Ǚ‚m½ë¸¶}<;^ipQ§HI€<ä͗.mb“d‡ftg¥†$×oèêlVŽˆ£ÚžèûãPN‘7*bÆoŒDQwì±Ê“L§x#g $ûæ ¯lsäì~)¦¼gá}Ê¿SG‚.jª#oØy멎|o…7ṍ>ÊUâǶ8m¯OÛÞqAå³L +±žñ¿ç?pµU,[³P%3ƒe@©–潉Õڌ žMòU²ÖÛ¾;rú¼õ„e]{BO™ÝÎñÒZ† O˵íXíÞFæì¼xÀ¬îêš7lªïÇðL;#ÙÝñ§²Ð“ÍsÙøû‚kŠZߒ}b”Fך¦¶óg±¸·W\­ÝŽvÇ˝ñÚïÆÿÄiFµ™K7à‹B5±¯Ÿ­eº<“5ø{cøô,B¦=”„‡–B›ô€|ôû OY±óƊJ…ÆXû¬J’ü!Lî›îîRôWbõy ¤›ß™¿ü†šÌqÇk­OŒ–tôËø'ÎHÆyñ÷ÀG€•¤w |äo•Ðj$r]’MœE¼Jö±€DçaÍîȕ€r¼Z¿Hýw3;‰¿²®z—·j†š8·|Ÿ,ª"½ç<1ˆÝꔡ(ìÞ--Íû$7@CÕ,}íÏŪx†(¡bÀ¢ü•b˜R°´ìša¹DàË®J°qÎ. h¯.T:i¥øP±õ~(«I%ò"K`Ù#LÁ9^£)݌îRg|Á:h8 C¯Ò%X´Ø|µ §S 7>ëӂÇË9Îo`î7Ë9 åGwôi9½Ÿoãæ5$ Ðÿ)ÏýùTžu‚/üXÙìfA’ÏŠ»Y¢TÝäñìv`\VKʃcDc•¨ç +vœqZªÜ¹êrŽù {{Ĺo­ð8‡û%_OvXx U^WDASøž'kÓÃ`þm^FŒ¿R«±À†‡ÏmhÊêszû;K½‹Ø¯nEÄhıÅXáqw¡¶‡á?F<زyXt™%Yh-‡Î7Éz%焲 jÎÎÓä;_m^ð€RÍþzªò^Hþ5 Uö*Ê3*NˆrþýSÔ¼ºÈù³+9GßÑ«$S—ý䉪R:–Ds‚4 SövÒûÍ sÄëÒÜ劎EUâ +B~‰zÙTþޘJ>U±”]ü5Üᄮ͡Ír.Ÿ0÷z|ƒqÚ£ÿü>o¬ãe@E`=‹@‡<ݝ`¯7Kaá”BåUÅƈ©>0·_F içs…Ý‡Ïp ä8cýX)ŽâuúpüõëÜűw¹W¸Ÿƒ3PJ¹l[¨Å‡¼öÔ<²ñ€§WÇî•rôf#Ë +Ÿ^·¿µü>W@–§r;±ß…ïbØ»Ü+ÜÏñuϾ1¸þu$,|f”BóäÓ?$À‰ÅžòZi!öð0èUƒsɟмµØƒo0…ŒLÇ¿ú¤¦ +“mř£ïªrJ«Ìô‚ó®ppá Ž†ãÙà<ñ¡›qþ6>1$HîqŠuB¶¤c)í…cG=a7UÀ !üÎÇA%lÓÊL䐋üÅv”¹^Çÿ²vÆþÓêO˜Õ“j0æ_J#”V«¬Ö½±è•„OÍaS‰H@ɛԂ‘Éë +ÿb^À²hí†èޯƋÙí>ϛ!zW[[ù ‹cyB—É6TªÝ ‚Þy‰³þ‰}¸ïÆæ'†×Y«¨?ñÿlWÖ¯Ž2A QpK¦QŽlÂ_ìI‚›môò°OñÝ*UEŠúš_õñw Ò(+|Ì|b…d÷.R­P­±…Ȏ‘¿Qîÿ6ÈpŠ +2¼Uáw|cëÆ¥4'ý1ÚêR—ƒbòÚS.Xáרiú+nRüôúf€»ÚPÝÓõÕÀ iJÇS¼Pӈ)tûf蝀"Ü[}7ÄhÝÇáp»§¼bë|üõb8ŽÏ€R”‚‚Âý"Ó÷×Yƒ û‚æ£!kcƒ©®ÊX’ÑB‘HÈéë %Uía6<É8‚ˍlÚt.ƒ°Äê$'À¯aÁ ¢LÈÕ9Ü3=´¼ý‚!›¯mþވŒæ::=,ÂÒr(Öò£É›ÀeRVÇY·A¸þŽx\Jµ²k@÷˜ QªQÜï4æœù ¸áûj¨L©åÕ°à ¾è6üã*&¡Ï,Z( •‡‹â„{i(äw©>N©.3oin˜â|žÃð* ôŠhógC„?:.^%ÆkuG•žc¹TçͲÞåÔM;gªìú‘da-›³mù D¦…gÑû­ü8r#Œ7mÝSMÇÛ8zÌÔv^fÒ¬›Ã\ñ±Ë<¾3¸©?-!Ÿ¤ÈR&KŒ Ë÷Å™]œd•W hªú¬se·üƒ­ÿ#¼óK¸Ïl¾ 4›æ8‚¸ÛÕª® –²G 2é§'/߃)•ð;ë³ÆÃWsŸ£×½³êa­ËGMÎä†VãÄx‹:§[MK HɧŸŸsµP"yÒå^ó WƊŸ|EJ™±Ótá˜ãýÌô|VBÆáJeßiÀ¨ȨP¦fx¹º„{¥°§%-'á¢g £²&ÅâÞÌp¢ê\—aô€VDLWtÿ0äæZ3É[ë¸Õ^·Np=´7AŸ¬é>d,¹pRç!ì‚ý˜îó°Lß6eТÛ댇…±JXfDãÃr™…ûÚÙðaÙ¾/Ï2#ÒyKÕc¨y«ìJqWµì·ä½’ð•î9³}›ˆ5gmE{‹­y|fáZ\IãAïFž}â¢Gn¬qì%öþ€QZQ³ŠgQeõ¦¦zü¨÷å$Í&çãøÞ¦ÆZ«p'Ñ™ògCÒÎTY-¸%l*49ˆf^¢™ „V$ F ʖ(p2£¡`æ`½$וÒ|"5¸Ãïr ŸToW4–ë嘠äã`#üe®N ¬óßÖG¦Ç¿#¨$ [<’ꎨn¼biè‚Êu…éø÷_†®«ÃÅÏ Ó öRštYüqB'.g{}ÍÊԘx"®*Ù'Œgàؘ‰ýX×U‡œ:Œíø¼ÛV)<Ú²ëÎ))dFΜ/ˆ´ó¡3x¹—=q£cçÁ5ž“š²â¸"î\NÆv|Þm«Ú);Ûê‚}™dàvJ?)b¦<üÊÎâ·h®6u®è@»ÎàþøF9fmaí0¼±õ½ë/[¶tHtàزÃì·è³\[nûl}îO.yó~Š$Ý;vÎ4)vqÝáׯxhd´z%Òò¾G¼[j¨øeOˆÄJ¡ñKOx v7†¨*èusôºÓ¥Ùj»'b)ǀUœéIttj?PBõ}lE²²DÏiHj}{³€»Ô¢ÈH1÷ìW;’+»Ëg³ŸÒÿ³ž©ºåÀ³ÿô ¥î¶û¤/:ɌA5%Š’@ðÓÒقÐR°–ÿbÉʽâH·–ñg–é«×Xo-Ó;^yµ[ËiXõק…É _ǭŔ’í¢÷{Ëò’~*Ð ÑôNêëñZ¿ÁƒXÃÖ¥ð$ +îY/&Òb¼Xp¾l¾JFrL’MŠÅ‚7ûÆ`.Xƨ§/p,'C6?¿^xâ¾xL¸ˆÇì†ùýZ}qDl3\w`+Ì0.{Z¤¯XLÑÊYE‘=o‰øGI˜9Ÿ¾Àe–RZ,|,º,·[X6—rÙ±…© Ö+Æ5Áut@w™•z×¾Àç³l ‘1²Kƒ°³¤šx-m7%Ʉ;}ì¢S?3Û.E Gõ] ›L?IƒÚÀYÙ4”|i|“Xóõe·ðŠ@<³5UïóOª7“_|¾oÐÔ:>J¡"Áø{À:¦õ…3µOŒœ’áŠ^ðÛtÒc¶þ–låÌC A´,MÍ"u%®‚®þ6&1ãÝ&Iµ-[ݟ&<œßë·¤™ù•Wt&ã`%0¹£bNè ©<õ ,’ÇQDô;ª"Ü +U#w‡¯rW›ÙdjZ½¢{^²$è!ˆFÎ>ËòT„Ɉ{•üžL¶Õ½ƒd.ÑúÅӎiy–3àTú'>y°]*w¼ªX»ÏªÀ–᩼Lï¶zNž»Ô’õ@¸èœ¦g£Þ†‹p,„câ X(jøE¥vªSŠGÔ „G:-gµSÒÒkôq„Åïó”ÖüiÍOjÝ´ÒëZO°—Ä<-í/ó:[ØN!.ì“}¬J·•œÑ)~Ú'§46˜ì÷zc>Μ‚òEI—ô—Ý +ù¹è5ðêí#’XÔ[¤‡ãgèþ›åqŒPYâ0ÂØ¿)íø•¡Ž« IÙ>$›z¶á_M-O„'_¤¯¥ßÑO'—œ¢DÓÝ9Ožfjòt$ÉFU¸x?¼Ø&kF”¦êU¿,¯‹¥XWÕæaâáëèö¼Ë‚‹‹cHÙ.nÁÿߋ%t»ïS¢ûÞRÄâ±[‹rgAîgÚõ[ .Ü\!ÆxgØ°ƒ˜[½µl§Š 0ï ÇÊy?¶wËځD®y®VÚ[ M¼ ªyçQÐS¡æ;‹â%Äóa,ëlX!ÝZp8–ä=ó²<5So&Àšõ3½°ý` a4 3'´aÑ–lì˱|cÀz®uaH¢ÉËá„Èc±´±Tk ‡_Ò¶.Z ΔáB°ÓÑ¥ˆC~” p梭¢´ï2EɄ­Z0<)¥aȌ +˜MqAIÃd3$MpTG¼IÄC–€!º!pzÜ¢yòÆÝA¨>9¾Æ+íi¯ŽÕ¨ÇìH:L–p#,òx@ۙۆÍ=¶[ܕΓÛ×bf3X²> Û¥“}ĝÁW=€ O¥E,2T¥l$‡Àë%û¡Y'ø•"±[EÜõßWí8ð)÷ÛSQÇ{³CÕ{AKì@Ýð:ìmÀ%×[C÷—±'íû©`ò)ü{),§%)yöPN»Ï½Þš¿ +*Õŧa» yä;ÃñFŽòˆ™J¡j1¢J¶³â–`¦˜yo?0øP¢¸æúj}E¦¾!M¨©Ê…†r¶-ø:`.dK©Ÿâ7dÚmá'uj5Å\ùØ© C[˜)ˆ!:s Vџ/ÇAŠÇ£š›Ô~Km“è}&©-'njk=ó[±œý9âîHã/=ä¶ãGÕ2]ŠŒ.´W1 ÁöÀ£ ›¿µ¿ +*ó¡DFqý>æ3è‹™Ó +ä叄Æq±P"›Ä!ù©ÕK+GAi‰ïŠ4jŠMžý¾Æ²XÖ½ØGüùØty\æ{ì m1Ça9M„A¾Ñ%dR¾¬þÎM·½£½CcyxƒÖ¾ö*†žj]ó¢IŽ‡k(Ç 5ríÐöL¿F ¨²mOCÁ.~âڎo÷¹L¸ç³Õ zDrZÑQi’=ŽFÍMPñ×õJÄ.xþƒ̈“}¥ZÀþ2ākJ-j?(š¦83«‹YÐQŖƒQ{Fî¨OX;þ|Aô~ £¤¤tø:ô¹õµŽ6~»³Ì5÷®Ÿ¾ô^ºï5îŸ/v,ÞØYb2؜H\ ¿6f1oÉ «Ú¿ :: XcúÛ0F´âŠ3ÌÁ¤ËLGrj»5¥cÿ²y¸³ã†ÎóÏßË»óyÏsê •ž4Ç1ŽØz6O±×K~Üð^†&¥u´Ã +Oj³o:*}°ÒÁŸ¸Î}$íÇŒRÚñùÔÝ}‰„\só­D^ðT†=Bã?>½™Ô½°$^N­Ñú´÷ΉaØÛLS¯º7©Ø`&5•€3Š¬øHÓÝøÝߪþCS„Þ£è~ŒnU®‹òTåI4G)ïÈv¢EõðkíËÑó®'´P/vÁy¹vþžÓï¿ÐùP€ÔÅR‘¢ÜñFão•wý&³R„BÂãtàó°AÍÔæÜ-Nç×QT—–Èâº\²&ž ˆ¸Âì 3‘=-¿…lN}ë˜zoyb¥ºfÕïŸ/_Ph…E—sˆ$DnYC "ý²štôUN bUÑêef–èõfS¿hä+|XªÌg›î±ßU1èe!œƒã²•:’[m Eb¶kƒ§@Óç¹yýg[n íä:Á¥^žxî¡gFÀô¶=䡘×%L´.Ò®¼}öëáo•/͎÷ ƒ)E¶y§ŸQczöAiÉAkçL'Þ0°Sº kŠ¢ó„8ÞgTÔrkq÷ì.ë÷:o¢h Ê1ÙóCHӧꮄùchèj¢WÏÕºî⹇Y=;¯n ä›×°TeÁ+÷¦¯b¡€™Ô‘¢MýÏè}Ì䍓Å=¢ú1N‘ÕÇ  `¹frˆ)6äHа/IÑ2Òaáµ8 )ùTl úŚ|Ž^۝…Þ´P!¢cþ‹%«ßàÚqÜPiRLˇ‡yc9Ö^™^YŒè ZUÕKMdDR$ %u®ûv_…Mn’Ä ãIÓHeªu¨¶rAÝ`Ãvœò²¸¨z¦ý´ eø¥…f·µzC\,ÔúzgaF%·×%èb¼.yx·Ø.Þë}LspiX9k9žòNzÌF)}bÄWòéû7VÙoCÝeSšÃúIqðèx¢é4Å;F«™½ªj–…Ÿä‘aªdfžøC¯°14¨u¬"؊˜4Noz¦Ó³VóR7ìu§DEŒÖKöhR¨ £g#ì ¦¦ÄÃÄì8ÂÞB[ ‘ ¨µßáZŠ1(èû÷ƅëõzÂVö˜KD²š…X§©«,‰ 2´úÅþ§Kþé’ºäÿ¯KNϱð½ëórÀŸi{mßâz‡IQ¸^0›¨x|þâV'´>‡õ†ŽSÓ3ŠÝȵӆ´š¡†^£ùèÛs£.Z§\ÔUÉ|܎y © Ôª>ê¹ç%^eÈó¿pùS›ux”(%¡îu )þÙ²F«Îqy::Åïا—'>ç)/uúõÒª>º#Ô¿K¼–êÛÚ3Õ& ˜½CbÒÓ°»Ì†×(.'«:ŽýÍÒŒ×-Á5;Pô)Å5†B—ÓvÛÈ'uìKÂ1îð®ÁÁÛÍú¥oisáGû³¾Víu6MşžöwðEÄæÅÎǒÕnwÛÈ'uÿGx•cG²Ã°Ü§˜ xžöå`Aße—¹Ü®,#“7Iš±Œ^;Ü/a+Ê´™Šã¤ ±§‰uì>fWÆ ]‹µ@øלyªLàô—\HmÜLuM:=òâŽíÔÒÆ_Ï&¬Ye(]ïŸÑ´ìjÁ:]·ø§ªy¸>Li“#–®9$SV'å_ßöO(«cùÙ(Š»‹Ú :Ø7"¥†¼ÿÄú¼n„M9µ«,Z.ýñ…¸dÜ» +QJòLaY£e§èJm§Ù„F©‘õ dÕhsÙ:AˆÆdôhþ¯un³ï•Ž¶áŽÓê¹ÒhKšÂߣHqø©Ânތem/S†Y–±MF ¨8I‡5ïÛò–BÁ5 Z²ºD1Š„×RL­L')í*5¬YR²d¬k÷áRy,do?]ª]`§Hq~"«qû*  )(Ès܉©ö&Y-]Fa–Ø…äæ +«;ˆq}AÅIèzòí5)¦×ç·¯„ «×Žöc¯»#(•®¦µô7ÔS?fž(1^ìê.„Ș˜É6·—âm,‚{"ªËð¦¬ñ%Y‚ì7¶?òŽ¹0©ñÃwÌh!¹¨±_ sàu>T¢mRÙCÖ+‹ºŒÌÞ ×È"½Ú#°â© +µ:ý(ƒë”A{eãÐÞì**YÙ2â1B«ÑËpîbê\+³~acU àÙ=Ã|ˆ6pïàØÏÀŠ52¨Mö_¬»Îpüõ±­Ø3–Ýk‡û=°bp&îšXmŽð×5`¯…Æãu­ùedZ]҈Õ?é‰MÖwK³…ÎDÍHNj9Öýï¿f˜7£vŸ/Æ{Óa ±wèÐæóæ`½Xù˜ÑU-±ÃÈÎ{Ôû‹ùÈëQë +†ÏÕv*^g©‹¹­R‡O#›Ñ½3­ó Âãšü€Ï2ù͚¤î´öóqµIUÝjS§U‹ô~R?3£™ f­Qê¼U6\µ 2„;Oµ_x~G*)j/€_ £jdú?o0ŠÂeô‚ßàxHëdIv7Õ¸™÷-,±iòW—ÊX'Ù¡|tNž‰K{™ûmm䗰ÌÇ·ÍHÄúý +²øºÂ½.Ti"ÆCxÄÈØふÅ^vù¸õø†Í dcŸþ€¿D„µQY–íB]5QEº5FDîôxQ­5œ‰Gô"YT«8Vy‡*³1ï:GHYÛ¯…è’×ؖâ‚oΧ¿#$)§"Ð躹ÊøMߝêOÆ)¹¦“N¯@\¸WøIA±V_ælÖL‰Ð;úÌ[’æK’R˕Ü)íúì +¦PË;F©›þ:ù j+úxK¯Y£K¯Á\E…ôê,Ó³RŪí‹i /ú_’4]¹³ÒÌ.§ ¯ÈM{÷ϙٓGþ§òêõT^}å;•×‰lj¾t¶ åÒ^.ºR#j¬ñOwöŒÚR¶Åýrfà½z—®(VÔßpº’¨=‘Íå+#]œÞ0rìÙw$æ¼Îyà ç¹´{n·ŸŒžnNH¾qõĐ‹°ËÂß0° ֗fÙó£A|  Š ½J‘­ˆ¾®ê€_[º’VЍ_ñ˜>ß[­;F€Í÷Rslj&^óŸ8óJ²ױÝf.ˆ‹ª¯)žDEˆ÷-l†…U¶ä7‡˜âƒ›ÇÅÍ ëžÚââô†3ésOÀ_«5#Û|ٓ\$OY›Oäc£²áêä¢ãi4©5ðí8‘ØĂò9Ý8ù–ŽÔÌÎýg^Dž7+YÆÍjÇFB‘>(Gz´ë!Vûßf ÷JGûaƒŽ…‘,ë» +8‰ÅõŸ¬ñU7S¿ÄYäêéP® Ù¼‚÷G³§oËúŠ¼Z¨ä VdvXÚKß44ÆäðSO¥5h»ÏýðR«dÂiŽ­9ŸKhÊ´€"[^Y½Ÿ€Ûç™I³­e íÇu¬Vk­ŒÔ”Ûg-­NrS´êfæׇ•ëf}ú:8/Ƚ' —ˆ<>ŋLüÀgÉÊÝlK½ØOº ³l¡?KiÛG…Š—˜ŽÌîž}Éú^þÂA˜‹Ä±í£'£™4}«îÚù‘å~T2âăžMÀU`ך5Áù°ªÞp"¥íéèBÞ´w"¹D{ýŸÏ¥Ý_„…d¤Rê;¶­[æn ‹s+½Î—j±y½Rÿ +ì)‘‡ÆTÅJ{‚D’Ŷ*eqAÐfN{ÙF¾©c?R —97c¿ãA€?¼n‹ ]Gk A¢}Ž°å+/ÖU±ezëÞÌ"¼ü¿Ä +§Eú¾6t¼kQ†NiËÃPÎSÅÍa¶ÔÚ¾.XÔçXÁjñ w´¨w|À=y$ø܉ePå>†>å¾_å^[^}ho8_-n"‘Üà/å¾²¼au­«Þç…QŸ*›‡JíôÔcwUÔ̈ÇwÆž’‰L—ê¢çs* ¿NÔ`Ü*äñSðš?ïÀíýíqÑ<#ZÐY–“9$?…¾ò¦PS¯Õ©¬ñëžÎoNÀô,«9fƒ'sò}`"NXÿíÜännÎæÏj'–2 5þÁòėv1ºâ#ã¦QU4ê×$ Чq"aÐòwÅ7KÁùÿ¯‚x ^ÆãÕ8êº`ëXÄPk¨j€îÑm‹Ìá4X“¶hÿ—Y‡Ëˆnû®H¨DUžüHç˶C76&/C§žCYS«kÊT#øã’Tˆm°ãØV& 2ó"s.({Æ<ÚåFšà6g/nPñ&H,o1vhŠÆbföþµ’)¾8™¿š…ß%ì(f7`Y2 (±FãG%þl¸­8`ýTeß%l”ˆx¢i©ÅEá@ã4ÌBµ÷5azŠ%·€pȌ©€¬÷„¾»h"'ŒS¢v—½h#FX¿Wá–n¬2aKfi¯ÉXÛ²«[z÷í¼¡ïd™Ù A6¯áQ'u™:.ÎÉ-J¼v‹®Y®¯B¯î‘{ßÆݵ‚±¯„¶t2âèSay;—“˜<΁YYj;NÍ@%mÆ7ÐÃæ=N.ÏQª=ä“Wß8%ÒҘcMûð€lØñ®Fg­]¢é'ú}¸ÛÓP*:w}ÃêÂdo IqåjxîØIÌ½Ö3E “Èý1n:××Ï×;þ,FlJk É»сW`õ¥DžaœåÎY–ô‚ªRóS`¾_a“À#^·˹•@™áäBÊZ)†ZŒïë+TW+¨’øŠ±á¾o›…HÁi“H–…a¨`‰¢±ÁDõó ž…ŽÜõ¦(àµ^z´ß [+±嬨6äAÅuן~7Þ 3™•šÑTÒsOnRÂÍËDàfϧ‡ÑuÛM›|q±%rqQγȷ/¦Lš9Ú âTE¾D ›Ä9—ßAë̂~×ä­„߆I¿N¦Æ=fíÆ&ÑޔM 3TáڝƒÿPb‚‹w‰M»ÍËÞH<#Ü EbÕ~šÙïј]•¶ÎûHi§Â~·­µ+X{Kƒëä½¢\ÐÓ%rõP®Ñ×ááÊ<à÷+á³ ’ô‹oü-¿6DqãrßT9i^ŽUäPYûåÏqø²O2ä x{ÌZœ´±0Dš6B§pàAò3 +3 CŒ©gØ÷ÿ›¤õ͆3åÑ*ÉáÒ{ŸmîË*~W-Ѧ½©¶£|@W©ƒÎñ×3¸ø‹7ípÿPkrOnv]5{·¦~ó!†Ÿý"dŠIŠÑ|k´ˆžê„ÛgËF)ô[ºVƒR´Ûgãrʾ–õå%]®áçßHãýç¿>ÝZÅn +z[!µ¬§]›YŽ›WúwN$ÆJöØñ—ÛùçËt• +†Å‚ðóCÑ©‡ÉJc)).pË_`ÕWzš>MEe„ iôZƒlދ,öD:ýëúÜÁ¼\¾âZ?_zÈšÚCL U¯&’55ùþ†ÈΏ¡7æäpzLÑ=,Ø>³»ýûǽôùzoÍ£_7Ït~\mCU3ªd,[ž^ r¼å@`LQD^+€üÎjã|ƒÌ¬qàÜ¤¸¯êMÕ4Î|äu¸ÕÀé 2 Q%Tal¸âÏ62: y„Î1¼<íAP…m?ˆõá2(2s©¨J̲éL@Idë’Mû˜•ÖÌôâμìAª,WV +Q‚Ù˕ypœ Oø<Ü\Î]‹lòÃÁ•D%‹Tµ×Ú¬ý®öR œ¦½.¥\¾Jç\Å'²ÇTì«gI PÏ6BÉv×Ö»¶Xçà4b¤'N¶ë;Éþö9Š€P¼¨È5x‰”ïð"Ðmír C!QtÆ Ú}Ê>©4ú¸mi!¥'*$qä‰|ARIh¿`GÇË$jÑÒt¢ðƒ­D­þø8›5U¶ÿõ·šý-ÜYÓa×h*Vþêâ};4mÓîñºžVëÁ<Üp¤f-è 9íµtYyž`uÖt™DôÄxô×þ±×¥ ¯‘ùn*]uÛ¤ض2ë U—r¸º”“*‚Yi˜$ŒW`0>³§×tK¨¦9° +ýÜ·=m-õà°ûûŽ3æÜßéùójF6Í14Œ^&3T^² ùa½Û+’ò”㛯&>¦ýe yÁIÀË4Ñ«©ÏÁ[#4°Ê[“M€DÒè–ËõË0‘<-~·ÑHÜTÙ×¼F"v­jòÀ—ÍŠ_è2î½ v¨\Õi—f]y<Ö ÒÞg½¿‚´-è±÷i{Պ.C#‹ÈâÌkdQZŽ yàËf¥žv#ª(xEI¾“.±ì~ .)|ó@áa’¬ÊÕNO”³4MÇMîx[3²½X°‰hDYÅiKõ €Œ0kÞÎ4çþ +ɃÇW¾£ø)Ο¾@,ãßòâ†7>婤0,GíÆ$ù_ +×Ôi·×a­öLl)U …’äã’[¶oëuÅxÃÖ¿ÃNÞR“ Ó0|^Qân1~—Y8·ŽM—áM‚SÈÕ S¿ñ}ØÝ*ÐàPɛ®~ØæcxH™~ýî Qá_q¨ Q'ƒ}n¿]ËJ°ê)jÄõ¾€£eª…nÖå×Òñö‹¯ +™ÿÖ¼¥ïÚr}æ+!r?¨Üjý¸¤è©]=w&+GF}íáo·GqkåÛ°¯¨ñuzþü ~X0CŸÄCk–5+UӊUÜݕûì)Ŧ”K·bµ4…œrxŽÁ~`M‰½Ê²£äìÉY–â¤=Ô®Ob»Å‚Úµ(zZ ÑÍ|]ŽiÌÔ²Ö(mj‘{0öAcQõà±}­˜tä¿ê™k¨çõÞ3°ò陹ÛsÊtLã/zÎêç)NÏ«p¶B/Ýý¢øA¹y€A>»’5š¸ëу +÷|‡G#ÓÕúÃO»Ši)HŸ·d~ÜpÕöÈ®w\9ÆlS‚—ÝސYfÒzqäÎáUÊkóâ•ÞEðu×ÑTMµgèì›æ®Ÿ¿Áo/bÈsqë³ßk¾ƉG,üŽáñ¦®âšÏøÏñ Æm2%²é慎rL1+‰ÕO¢šžÊ5¦»JPÓV…“ +«Ý4¤s¡Œ [Í#Sôq¡½¿©RZKŽLÆc/rCõ±ªM&v×fTêx|Cô¬zFøûUŽåJŽÄüŠ¾@×㾜§œ2T÷w@™Ì”zÞkœ±” È`p ^ׇ谙¶rêŸfÆ$þ ™Pjeá°™úbP3žâRtîê\ÍhÔ¹º)‹*.˜-ý¤9 +ó“uԛŸì7;yCûꙛ¼!ë¹Í䁌Eo^rÖÃK֐/9?9Ɏ«Ò)—qjíæ$³Ô“xblz»¿ÍŽ4©W÷tIS(§Øp]~É$4¶Ž_CH«&ÒãQ9<19tOýáwR±Þ)~À°«qÞvÇEÕóµ³]øG„V´½-F{í#kó‡‹ã¨Þ"ýhœ Ù£ uá×Â8°ÐìT«Žü±–xMýXT¦¯ÊçqŒ,JY˜z RÕêúN˜ãÃõH)÷Åt7á‡lç¬Nþí â­Ù–Ù±¿á.ƒ'Nxùo$ˆšwõb¼ìÏéN¸ïÖìªÜåE–´?avÀáÜ£d +sP9X}E•s„«ÑMH>–vJ€õ77¦ˆð'.• )ndêÞÒBÝ-¯«A»9¼5ê½|Û¦Â’æŸ-èÒmÔjùA +m¸ïïÑâ¢qŠäêJCûdõ¬&tEْ’‰Ê3›»¤n¢}³™°iôÀÙ‰´ð•±GE­.câ¬Ó–>e`í5Ÿ¢-#%zˆƒ™M>±\1f1yU< öVŸµ˜$˶³ˆÚ⿵ô!írŒz¶ ä”ÕÒcûØrJ •þ/->û>ÕÂç‡7Ί|ŸýºyûÿK|Î.·¤µÏgKè<ÄÒ $;›9Q©ÛÆ߈äV ñŒeG8ñ!^-X!~¯xnԉ{Ã<‘•Åê±²´Ïup¿ž•]-¼xIœµS§A7øZ±ÍR>z@tµ`Ã5çn€Ù£.ÞÃYúÓmYĶ–‚µ\)Z„ç"8Eûê.ýgÔy à²[´—eìwXr·2úԜhèþPys4ÂE{¤½`Ä2Œ)gÜøû¡ÉóhH–ëÄõJ‘ÎJ_Ü,¹|@Ԍ™½rÆqŒ[ÿÞµ:uɮԺÍjŸ/§šQO\eW_GÃâg*6äÌr/~†ƒIÚnú W-,†­Ÿ¾É›Eâ®`«Z:#Uɑ8¤æ[âf’Mr·—nÑfi€\$Žz+¡Öas8q¸"©ý£ØÆtÖ7¼ûcRÊðw\ˉ]¶€øª2mՄˆ¥jü òdT,)óĘ¯KBßeGi_è8¦Pl‚L†œ%ÉÒ)jHòöýMC0²#ˆóºFÃT¨~Ì¥éštJ¦ë±FÙ®ÔÖ÷7oH û?§û¥ÇYLõÎJzÄL¥{TûþþãôTlÔ-Íï?¶Î¨5q—¨ eߧŽZn߸v™Ûn÷t°#pçÚ3û¶…¥îЏÛÆ8Xáþ޻ߥc8*ú&_ÉqZ‰¥kƒ3ŸnIÓ +'gí¿•F)qaŠÊºF-°·×1u‚¶W¡‰,¡;("ënß+’!^Fvm’ì­F!^Î:¢àúà&ÏC£ÿ+‘Œ©Ïþ;÷6Z¾¹·ƞåî= WmœJžª{¨˜¿c1xÊ,¤E(Gš*Gª|Ôâëß +:{¤#‹ûýçÂch:¬¢¸×Ð÷Ÿ5«ÿ»3ÔÈ[¾:ʈc:ó®Ó* ¼€d“ÜŽyˆ”ÕÌúuÚXB#íyã]$…Ïæ:gºâRþšÕÿõŒ|ä-_å¢ +÷¬”Gd°¶ ËÓ(Vú7À=Éb¬3©Jã ¿‡²cL¶õxrþxŽDá£6ò˜Žmª'é©Üò¼ò¶Kõˑ±Ž…f0: +q£cÇ¡«/G+-+õ¢Šæ\VMŠfä‚1¾£½ÑꗦÜ$©tnÉê€Èaíy‡zÏ_ ²ªº )ópA£„TO¸úÚ,ŽìåÓŒÑõÜ)e1ý&¦'Å¿‰lÛ1 +U’³ƒVËëh¡ºޒcý؂¥d¹¯#²µÀ]BÞ6Eš_”¿Gː¯á¸ŽêX>¶Ø(ÎQ‹Myoá*S«>¡OûÐÂg×ÊjÿزGÁ=fzÔ·–kvîtI”×¾Kõ͂­¿M+ËpÁŒ5Opij…ç¤RÇÖEÁ¨Ã‡lÄÂà‚M•Žó1ÞðšÁX ‹ZþËpýI>ÓfX˜”ÂÕaå¼Æß׀ GsUÞ¬z*š³†¡ž£Ë2l“Šþv{°WÃçºV ª…\E`Þ­ÄÛˆm'˜Åî±óöup¼Z˜ºÐU “¤Wƒö’ÒNW1AD%ëߧÌ,[üIÐY¼ì³ ³)oš¸ Wú¦Ÿ¬äÄWgç"nðær–ÍàšÅ?ÊÃñ•Ì{˜¨¹Ê%™…p}þà¿Pª[–ß…È +™ÞË Ù„ª9P¥,1­ÿÊ¢` s¤"x‡3j|1ºdYA IFjFÃ;µi¬´ó¤U¨1YWÓqª˜—¡˜=µc†ž<QkSß#]‰ ¢ 1§¿™¦QXC¦Çƞ =:%T„ü¾çUª†×ܾ¨H±óxZx8ó âQÏf·z}þøHª°+àWns»#H•<ݵ>Á,åèw"”}ia£è ÅHwGï‚M•» QÛÄ_&}ÌÒR¯w½ÐžÇƒG«§Ûj£(À.B–f·¬ƒê ¾.XgÔÄ<ì'JPØ1Vk$OÓÑÍfH𬅭ei׶Ö( ¢Ø§‹ýoq`ý—*’ge©-¬hk"NÑ(*’ã + ÞÀÂȪd=Ï«¢§|D0¼æ°Éù¥À«­ªÜ¥í9þþ³²¸z¬¼W„û:8Ä9£Öš„ZL¢XËk·p»šÎaúÔ2qq$u +¹®?[‚­' ˎ¢šÙFϹž×ç*끓ÑÞUâÆ×z¬…» +‚Z¸é5—Û±ۖ•ÒŽ V€ËWA~ ò`׎YËëIv 7¸4S}-‚ÍO²ã+p²ã'jX®Ýimo—¸´«û¾Så1“JTçÍ]ôW…Ÿ]V«ãmüm’ž¦¹;Kîdz2™>‡ñYc6ó]ėË\Èh%lüZ8­ +‹‡ã?„WIŽ$I»×+òU°}yÇ6tj/؞a•kú ü6$†‘ÞÕjÌoøÛëh¥vÙrö’kÆdøŒ²½,|×Ô¼T®}EŽmTU¡›Y#$‡öø+°ÕŠÝôê‰1ü€Vv ï·w…H3ÃëMTø[Œµ^ßö›§™F%(TÐݦ>´i¾´ifÂåãÝÚÔXð&Nïèg¡t}BŽ) ¸…agoDGtë"ß0Z¿áŽZók;¾÷‘c™@ÄL¾ÿ҃3u3ÅÚOÅYu}˜Ã!sOª‘,@âéµWè±¥8ڞórtïórl¶»ÛyÝåØÚäòdµ•› s%֔í‹màÛã®a\V»J¹Qýõ¸ ·[Ù%GëûÞD‰—ò;6ïÌ,:sÙ}‡æQʪ˜ýŠÅª÷Ó8é)!óe5Y­O†Ô´è¾ÑöŠ­8/gAßEøoØÈôM +è +⢎¡)>+û•|’ŠMú +~h!œœôèh‘¦4µ½¼x`óWšþ-©„™üۑ5L™o²†Jxå-WžÑtÈÙ5¥ŠÀžûÈÓ&Î7Š“D‚·`HC^w#¬4mú-aûiîë¡È }p4«X!¦­Ð ©Ž+zq•½—i*Ÿ÷<èí ¶Å”!×t«$h7%.õeYœÕªdºJ=N‚†‰Y¶ëÁ>­­2ôX‘|$²|’bBåȹG£H«9uÆ÷'ÄCNg Þ\9–▜ºÄÌ_hµé›êûó‡Ÿ'è–hÕÝÈϺ¤U—A¡Û%¨î¢9›FÏç!óÿÂoX`zq‡»ô­K•éð§\¥5b»ŸÇñ“q†U´àfePÏÙæ-ɐè¨íøß´¡µáßcU€ð«Cua±Î$ùÙSßðëV*žTŒÏËÄÏ(:Œ:~Üù®öü†Ó¥!oŸ"E&="Úl +ܵJ€›/;ɂÁ6ÁÛ¬už½n0˜-Õ§ë;vB bê8°ÍH;ۏâT(}×ä%¨¦á´ìµï}À¹= +ïؤÂp.œe¿áÂ$=Ó_àÑñ£“fG#ºHþ:ØjƒÓQ®ù ÚÖÓ¥/w ÌýSVq²w ߪ¦"í–Ô^½PŠ:vpšTö™”*1…M¼ŠÅ•)?.:È·tìr]Øò0ôó.ÖûÍ«¶ØÐYº³)èPT´Î†ú¸ à QÃ|¬2W´HßwWäÚÎqZ¦< ýDª ќEîo”ºªÃ¯ öjhÀÚ~…'RÔ9¾À39| íl)^,ÉYæwÎÿ§Ìגeþ-·V¹—ùü¶Ì[á̤Tdzi&Vhc!ћ·¼ pïîÂÅQuDÞ©™Ò‘,ܝkÊäóò!Öï\ÎèW`Ó¾SûµåÉ4Z{…nðwþ5BZ& +ì=eÊ´‹:$=¬ÇbÎ46_`n}³J[q‹‘úì+øÍø²,ÔG˜þ¡¬a ÀDcg7yÑ4OZ¢Z”£þ…ÅyÚ5íAÿ±Eàde{;³u-ÿ<¶³wéæI£eˋ~s€'\Ë +nk/ŒDk¹éÓòAåŸñY õ·1°^ßÒ´øÂ؂ÍRÙf×A‹^ó(øó©IâÐ:ß°½ZÁêJ²¤™ÝQŠ!mB¡A³ÌÓ*ìTQ)Ó@_óf×Áo"°YòV„P‡"ïûBÛK<üÑ }É݁º¶´b¬ðŸ-`ä]›„„Ù·¡Ýo…%ÕÅ hŽHnÌ`½J*ëó«³xXÍuõF0äœâ?ŠçTˆg:©:ÂQñ¶çÂMÑéBmhCê!ú¨Ì€¸¡o8è¸&E,;X|g‡&Æ*Ë:®Ñ¢ö¹£ÐõÊ>êAí~"ÌCôX’µÕ´l6Ö¿‹b•«[½!s¹¿×’|X —Eãò†\„˜t€\¼…Ü(¸Œu{òŽâ—DØù‚qÛ²ÀóìB”wÀ*â3çJ· "‘ØŽtÕ¡\ž©ÂnÄî}/`âS¶ò½Èé–äy.m£¥›ç¬Øͽ³_¢µ?  2¯ €ÉK4Çrí€ÌÂk*ɚ2 O ŽÒ#Ið8Q<¨ìz9c”6»þáÒË$­ âÒ5­G¸Øéѕª_ðJ›"ŸÀ µiœŠi9$ ¥(¯"Ä¢É>êÙ •2q-h—ÈÎÄiÞJ̘hF$g$÷z¥cK¢LsçÙÓ Ð*øX¡‡J${³‘òKÑ~Ĭ5E²ˆ Š1çå4n1ëG$x") )ÄúÎ̬Ï))j ‘TÀ$I1E& Hµ:öwÒÑ8¿™#$åSU†û`pÊß¾ÅĀ-fS JfÞbÂ<>(Ï}/&«ÁÙ.h¨µ(j;¡%¨¾©ñ ©sž«_"!5qQ8ðS +y˜dØؼÒå*KÖ¢(€Ì²0ËÅÇûªwÛ¯ÅÎ.]ŸÒÜɝòÏËH¾Eí&”ÍÓ´ü²dÿýëPÔæ,´w< 7ŽÇ/–uä.#ñM_ìÞ¦$™ÈŹQ•ðK²›âr¢-ÈE3zlXÕt4”è)ÔWÁ~Ã~é‹ãíìW;–#1Ëûsé§ÿç<LྺA©Teo¼ÉF.Ð"EýH€…w`Ý8PúM|†j!$sÀ ËQU¤áS§²Œ\ß +©9ôE^S6•Ÿ—…ì|-=D³TH”ñ_,Ëkíç²ðˆŽ{; ®JŽ–KÉ÷֗ÜE÷öŽÈ¿¢ŸþñŒ1[ù«³¼á` `Õd®¸¸ÿ¿ f»Cvi­ÿSô™T Y}³çÿf17÷t¤°6Ö0oßåˆËâ+$ÒžùÝR5ÆÕn™„[Rã˜}SY6•¯ÝÿõF]žŽvæŽEåÝ·´_™ ‰Vµ¸°çc~·TUÃ¥ë +~~¿üê¹í¤3…’lÊRÅd§ïdŸSìšk1I˜ð(¸‚éÝ +hŦ%äÅ~ÙRÄ9Éyy$**5o„+’ý¸ ‘t¼¨•ú„È`]§œÓîÁZÍlùBÎXðcÞ «¯PZýx9»^ <Sª^ÍÝù‹ª6¼ß°È½aŠ85F©£%#Š×ØÖ»qRLþ]²Ú»áì!f° Nõ³¡–½±EÔ¬¿(‰¦=Ø̆]ÏÞ6Û&˞v9T"lóëh'Ž"¯û¦½$;häËÍG­ö’úб•aä$ss¤Õhg7ÓÊ邰£D–ÿ®ŽÒÔäÐ)wGÙÿ넰K%âÍàOZr1eÇX†×e@ÌÑ»YÜçƒe`gÍÀ£IŸ ÓhÛé³,ÿ¾J˜ê&¬ýÅÒY³cœ’‹úˆ£Ô¤~6x4ÄÕàFô©Õ#éø Y’Z~‰ É ¦¨ÑbÀ[ÛM®„á - ɔÐAzÔÒb4‡â¡,Å=JSš9t›ƒ\ؖ‘â…}¡šsY(ê^Jãƒ!šÏëðy·HMÉÒgûhÙ^Ø3îÕ'Ë5ùu4²Ü{%*ö=T;Ï2ëÑ+­ &{¦þ¹0ÞT-O¸ÚbØ_ÿø×öú’wE’XC¯ Kž"ןä 'r¯kaöÜ!%ÚÈÇqd‘ +ˆõæQå2ê} ÃÖ ª^ŽuJºÕ\~JUœ¹=!ßU½? ÖÓڅ¨ G)¾’2¯_Ób—ã<æ}bÔ·bUÄã-lU”ÿ(¢„bÑÜ·(=@– ò&õ2'%â_¾ëÁ¨2¾ë¯ƒE®|çd<],„2/·È1Æ$ôZH ¼Þ›L 뚡ÆV°ú£ÉàȒ)Br0çáɔ®€õÑ4—|B!çåå@µ–ŸW#¦ בƊçHä¨l–“§'".¤QbBCòu¶OHl¢Ôýoù–ˆþééñ ÂȒëÖùóرÄ~Æp¸÷Ä‹Ò2B’Ȭ¿'ªeB–ât²IÙZPûtæ|+åWJaâ_ ¢ÍI·‰‹pG{¨Ñ¤0~ŸC—C³£ü°D[b?ÄK„&Ø‘«©•iÆbmòáCÊêëåúOÛ½”±"’ÊàégӉx¿QŠ^µô9Ö8 +7ø³•[!eã®ÁÞµk´§o];·C¢µ³k¯ÿ¯®]ú7Ê(kqîã0 ½ÌÀW2ðê¼KbkKÅ jŠ£“Š ^|/¨.Yؙ’ºdfDdæÑ° âZ¥‡É Z¢T\c[-(&QM±A*•Bí©€1Ɂ÷œÓÇ-WwDL©ôU^3¢Md¼cíÃ2Õm?ÏO²â(=aðF>{vuú{¡&qƒç•Þ`6îoŒºqô[,ÛîK$öv‰QJt‰ÄÞ‘ØŠ \£Ñú¡s,§J¬•èŵ ‰Dm͉½]"‘QO•ØÓM%ž)ôzS‰'܃·J¼CÎz“‰}œ2q´C&ÎO"±wÜÏ(‰7[o"qñ½õ6žÕû½aÈ:k9>ü]&âªKt5Üîß/5W¡—#%cñÕÃÞ0hçºy3õwœWZzý†Áw{º-뎋éÎ×Îuá¼s=ØÃí=_Ûú^ߏ¨YÚ&/…ôvCYøµ0:mvEYóxÂ`P©÷ò„Þ¿/J-̬ºÊ‹&ìÓP´fþv%“óþ–nWBÚÕN†§ù†A€¦—Ëî„è†ÑœºÚ2 ̢ƍcðâ–Ïû\7¼/”=×úm¯©¡g+tnlSí—ו»YeÆ»®€PBejýÍ8g‡¢Ô"Ùú×ÿWëŸé{¶n–\Ì@b3—áustk“Ëçƒ]?›kÆÁ0L„M7ŸeùcëØßËÂ@(ŒSrI “+©¢"&|'…c:©\²ñð2 †,ÙBTLL .aSÔ¨8¹&²R0yêM*ºl¸Ÿâ&Ø^8À»²°ëDÒ”fÝæäq\šáƾP͹,%Û!hŽùd‰æõ:¼Þ-h‚%º¥ÏþÑryῑ>ZöìÇáȧWM˜w¶Ù/¶¹ÿ?®\×îqí¹\jŒ2zaÔna?˄½ŒõØOXˆÛ;ÂÆ>‡<–¥£(ìXqõšÃ1OijØ#®¼á¹ÎÁ5•m ™t´I«Ã˜ï ‹‚AçìÇ48¿ÿ3^pÏyYPûŸíßØÃîË"ÖFXn¹’¶Ï5p†f”ÁžX¶ãBnuaƋ½­Hÿ)©`O£6“¬·Ã§aã‡k…¨ÃNY4ž…Óu'úÄ?žÌ ¡9 +)ÂYßQ‘¬j¹èyÃhÑe•ÈÖÆÐn£oxWè<É‘oجú|yƒç„OÌò®^ìAF_­8UãÇ`։£` _4-Ûr‚@†7­;ÿCŽÖ9{X7)#6Q.=s¤š²Ö“«O±VÑH5ø–6ÿÔÂd§êØ#¿cÜ-Éœzƒ{´¯çë' £dDË.ˆÛê£TEÆ5ËúžŒŠcÍTŒ5”õO}Ö¿‚džÈM^læg%µ ?úþùR+‚‚ÌÙ‚‡a&8´lרá¨/Ƅ&ɽ/ª¥Ð~x9bÍ ‹5Êk}3àóÉljù`WBZ~¾|2AOCn·¾ä‡}OÉ6¨„ìHìDé›ô. °xȾwOAßZÁ ó‘ÏÍÑ^9”À™gãÜY",¯1‡Qí¾“ù>XôÓ—è¡ßB{sÇoq,s\Ôߏ‹€»k3 +*s:sDÝĒ¢Ý;}ñ1Ì¢ÇPó|ÃÁ«Dº}b’ìb 7òédÌÀUՙ|bœ O,Š4m…¯wPÄÁÂñ;ŠÏâ®Ëâ)Pžqk¾é²ÖãÝÃЋt¤äÁ# c]Áf¨Å.P "ùi#«u3´ý/ÄÜáéHq¾.È²@IÆb‹& Èƨ. ~ë0?jÈÏyq¶`¢ñ“·¯OŸ?÷ϖi¥×WÆ^üÁ²½"š]‹-ÿá»J’#ÉaØݯðºCûòŽy‚/Ž˜òÿ¯””™å˜‹-Tj¡(×éæjDµTæ“Z?]Zî–ë|7Ì–+6µ*ö4µ>~IàéqsÔچ¸\*Œjñºÿ¯<ëZ¡_:¥ÓÙ{#žÏ¶X–kƒû-° ¡e•Ù÷Ú¿LZ°Ãõb†¿è‰‰Òvf4˜Ù/;,|.¶~Ìгà0¸^Ì°\!+|ƶÒwxÜÃVT5]ˆé®CCUæúÁvŒ½:Ô3OÆr ‰•þÚ¡0¸mÉÈü!f=yrÈ{Vʔ…Ÿ}WÉÉgâsÄT/%Ýt<T„9Dé,lˆÎhQ ¢µô¡f`8Ãïu ÖîP:DY6bÇÂ@6L’Õ3ö…D™âÕ$FÖóÁSŠýmÕäxDÛÚÉÞʒ« _6Þ&QOl©\Ïôü5pçÉPhÓT„y(å…ÿ¨Ã2”ùxÝ}¼ám“µ)È)˜]ÙŦB2QìSkßHþŒqá×ÂH‰‘õæ™mí B'”m2äÑ´±¥±(d)ºAÔù¡×°û:z{ŒÞÑXf—âŒø«3.jÿ-¦åN%&ÍQ Wd†¤©*½†¦@gf²ôAG„^lÝ»”_pbaåݺDÇs7>/’¢+ŠÇ’Z’dHèFæQ4›Lx^”–¤cÊ ¼ÚÊJSZz»îY5&÷é3¹ÐRÒUJâA-¤æPîSó#ƖfLIOÏФZjGaٍÎ? è_$ÖèHŒ\T™3¨j?h ¬óHˆ7,!«Ÿ¿`ÌÏNXeæwèØ3ÿ‰qW±è>žP…Çb &Ù­! ò 5_b)úĨx¡‰“|áoR·SHQ °Ë[„ñ&ԕ,j\*ðÅjûãkc(Ïá/—tŸ8z¢Ð×ü¡ÓI¤ˆkž¸·r›Ç0¿­à qa>üUï2½•ö[°Ìz¨¸PÙÿSqÌéFÅ7œYE/T<ŸT¼¹ƒ£oÒ§åÄ1:ʟ…‘95é]¬ìjÜbïÔèàQý^#ïU¾¥ž.3ý͹¾Î$ßÔ 6ï_Ý8_y3•™œB½™Nìì#Ñm‰›Ó>Gˆ6e¯ö¢)ï…ûB‘­¯²ÂÞז´ÜÎóo2ÅWÝìäÌ­6·ÒŎ#u‡¯՝àx4-OäS0µ>¡(ôµŽYðw ]H—4waÆt%©È¾‰cF!Æ{L­ŽˆU‹  ’ ¿Øb Z2VV“ªºÀL0ÊÊÓWý,ˆJ®‡›CõÕ<ØÙ,÷_M담•/ØF¸îBÇi…B«¬´”´vtDU1Çù*CÖÊ«•_â8hƒÚY;Éx« ·!ޟ¥ØÅÊ«šX¿û'-¹3æ¼fˆ—ycãNNF7B—û”Žõu2fûO­§QRèën9r ÓDáM}dwÑ}ßÃÑÏ!CGˆïq/–\‹¾²èj4wHB²æž{Gﲇ …)ÍÈøYo+¹ÂU†Ä¡Eàadd¹ê@äî”@)Œ”‘˜¯â§Y>%$èâj3ð©“Ò\m‰éÁ ÐiÎMRfôìK6¤ÎY[fN¬±î¡3šqw޴ص|óÿ´+âÙÍÿÿ·û%ˆÍû>ò$V÷†b&W3bTscŒÍÇ r +cCðhξ ø6–½0)³&6úÃ0,‡³ÓzϾµƒ/S QµØ°Ü¬UkÜä"]|­‘\ô ¾>ü0A7CËn&~}hÒÎTBv„‰Ó¾˜E3E¿>°BªˆÒ~$¹&Q:̳7 4»[ö5p7Gûæ¶H\M³SǸzVr¢6³aH#¨]÷ƒwg½6yê @«mç:¶”ø\ Ug÷s0ï’A™ÂEW¿>Š¨֖EQuº,­âÒ.ÓmˆC²kÕÜL³g—øæ á£åK¸|ÒËL™Qó~ÓzÎ2¤NQ+4ޏl'Ø­êL~°³½O,Úiö%.@Ύh9h­myÑûKk-óÄ`Þéwžâꆃk;Óð¨õÁ‡o‰’ɪþÎðk㊶*Š‹RŠïWŒ®$¸ßÂߪ¥«Ù"×æ¼  Ýď%„#[ñ~K8Æ*¹$T/×>Võšc}‚A£ìEù–Žý@-\Æ\ ýZv'†ÓW†¼0ÐNLe£Ë)†aP– 20o»[Öõftd¤“ÊZ!põ±æõÉ ¹ZI1ÒºIÉ@›;å3Ñë ›±;¬ÜA‚x¢=u"øÓyZñpVWj3‰û¿u=­äV]¿BäĜ×Â~ƒ¿Vvoîâ’ÈðONF›ªÖuP²˜^¶ÝDʼnғEyª•£¼:QLÝXj±f{ 7üZr)yOYÊxBÓO«ÀÃèßšÍB,O!E/$8o“jÀŠn³ª”  <ë_‡O÷±êڐÐmK§’f¢ïãÀvJN÷öm¯à&]‘Ía¸'ÔÞi^Ú-è$õ¥ÿ`úšÖhSÙ#4п·í൉wÉ¡CHصöv›Èä:#À2 k“vµî&xXå”@½$aLô“õ­ÉänìÃ×cO0omÕÊz;äa¢qðŠ-Y¶ ŒYh<à²Í!̂@*l±\¢(8Ólmá˄8ŽrEÍ ÙY7’÷èòý•'ÑUbYU‰E6Š§"„8«#<‹ÊIÇF½ÙѸ¾Çú¦}AíØnB©«4Pẗ0*Þµ(ïÈàžˆÝ¥D½Y4Þ0øn}dCºfCüI®Šá“²x‘_‹á.äžûêk2Zýì—üĹRIàYÉÜø)$‘+òØÿüKŸGtµí°ý}àØ¿råÓVÁ܍ '® Ûx›|+×ú…¼?§Ÿ‚J}­îž·ý½¿O°g\GöÏ+ðÞ·À® ûÁåxËÐÝ#±®·k/(¨ltdGêL¡I˜{H\¦¼!Վޛ僽&ïÄýü0ÜÖ ÁX:ˆ©›ê~*ñ­·Âp £:&Íuɒܦ’ (8 >Ն7 +J‡ösg¯ãÏ,)Ÿà¹<§È3™CLÇ57=TK_Y¿¢êjXõ¹Œ²þÓ!)í/Ž“öIK›•&Ÿê‰rjÂ3»—zÈl«g;pµõÿõÚˆR8œ%èL`SŸ5¾A8©å;dçªp´²´7šŽ)m u;6*Š¾ÌÉÓ« Õ½…¶1 ÆW¸mHÛ¨gÇt’Þ<¦¥J’ez¥ü2ý(jëû¯ÛzXÿïôB˜dW§ÿô&dÈj$KÇù>ЮKÇ`ý銗\ûctš €pÕ¢dl$Ì£¢ÖfagGBŒêCà‚ s¬ ­j¤îAŽÖ¼Ž’ÚðèœshF%LÕ¡*KÁ õ-Â+{Ö“šV©!|²Rl¥ØÈDôè›Ú¦à”µ² Ç"c¼lJíFöªíÂ=ò÷Yà&â,Ö©³4JÍ{ã%Ÿ,}"Ò ÀùƒØ±þÛás‡A–—d-®U…`Á`Jc滺lï©mMöÇõ3ÓYxwU+F$˜½h%ÔE¯g_#µïvà:Ž×=Ž*>ÛÊýä‚UüždŒÉÓÔh¶ #3‹^ÏWJ‚³ÐàÜp-CdÇ»?ˆtn™4^§ñÂÇIŦJ6DõûiÊñðÈdÕº4.R#™A„è£3%61Emr¨ä|–æfÿ˜ &ĕB”¦ÅÜ(–ºb“%åÉ÷²bÄôüâF5¿AÜbVGS”xÀ3Á8â;d7=´+‚7Çr•Ÿf¢#J3<›Y ”KÑÄ¥'Rà+O~£¨9ԗêyÅxÊlû­—7èŸkö væÐIal÷~L²9ag™tRÀs*h‹'#ùb_\›ñ|1nF—ô.}›š‡¤ õ.d!7. +Û4tüͶ®mKo8’ò§‹ú¬—ÃO +È^¤yäëÈNwÑh½úˆºÞÆ~ÐuÔËxï)e÷ô”ëûî)%²ak JûàâS9#_·†@ÑÈZô6PTëJD€!§Þ1n¬‡? öÀߏ&èÈ8lèû6šq›ÜwVq“šÜíHù>µíénmYN¤ˆln8*·ìkIMQ¸¤.EBˆ#1ÏӘ`/ìöˆl,l%ÕâÐüþGWcî°ÏsAYý“…xöæ[àÝ/¼XßÇ}¤FmÑñ|駁†\—¯yý$·ÿ½œUð˜ÃûÈ1~=L}oÐ®pXkzÌÇ-óW‚…ëÖ¬.} `wÃpþýUÐå\P;,uï Žm¢¹#=1Êq[W»mü÷ÃòÕ bïÈê4"W^ê[FgM£è–$t×%Qa뺤ÿ’Z®rÜ;î(´&¿@ò˺ÝМٿɸY£êeÎð2‰f3ÊÍæ+F†L9A{m¤² †ƒS¤6]5 Aï›úY:fÙ?²šEý !ÙtYJ »Û2ŒJŽÝµÙ‚®ˆ>D¥œVÆ¿6ô¾Þ;Kž(óò<‰ÓÝ: µ–«`SGŒVs-/ æZÜßðˆqìU xÿ²ûvw.ùýØï÷ÙÐÆ{‘ÞîHßë[T¦¢º ÕHéìhdæùZD3÷J£°Z.6u.ኼ÷3ÐiÌpˆköÙDE"yª½¢P:¨6dCQûm!YeL'è̆_’¢7©Ñ¯=љÊ(©wÆ1â<¶ù¨§ñɨ¦"¢19ªû}BØ®Ų\ èBE¨ÌdЧÑö7ÔqJ¡ÝVx€w$‹ÁBQwä6°€‹Åbâßìsьœç;6Õ¡Ñ}ÇÞNn?B±¥‡NÌÑ:Ñb©Y”êF/«ÂëQÈl–gá«g•Ý±DbÔ·Ðã‰U‚¥å›FTµØª°–»FqÞ5âZjÞ4âžÉ[¾ÀZ±Ôy“ˆëY–Dœ?)Ä®üÍ¢šÓïq'ÎNW _å{z¾`¸'Íkú \±â’€ì¢ßÒFi㯃QÊBtÖeH”7Œ>•ã6ýóÒ3\öŠàº0—zb”È\üZ:éƹyÏbªä·V‡,îljIA§TgMm#gî(mÌ7w˜×öŠð¸e]9Õþ +ùÚeõÿîjbÝ:ª¸H²>Šâ6öƒa°€Ä±•èƒÔý¦^Ý/’ß`F¥X±1âìàïÉïÑ8û£LÖ|MyU£ËÖŸHA™›TK £h hÚpRëN}p®¬fF¾.¶DE™HùšÜö6ܛ·œjûç»\Ã&?ٙ£Fj©Au õŒ|ÝF˜…E#{ÕûH‘ô*)çp]{­Ø#1†×yì÷m„ Í{Ò)óâØ¥&“’PÉQ9b2 iËt*&‡å–=-~€–C\ą +¶ö¤6šÀp,¼&™s ŸËª6YY9S4Ë¢XQDÈ ½Ãìæ9;]Ø÷üü¸Ô¨-àþžè +Ž¯Ûš÷‘¡+}Ýü÷>rVÁc©ÖG¶ñÛÃh€YWq»ìX³RZÓ"w=s‚ûe_(ŽçH•ÏïqHÄð@¾ ®7Ú©4ÛÙàÂ6ñùq¨Q×ýO.ý2aHû {Âujoð¼M°HÕÛ½®3¯céíšü1iøi7´x›Ðu»½üÂÛä5ÒÕá¯èý˂Ðr†×á¼öõøܽ©âì”ú–Sb(g„F¥.ålÒ£;ܳ„"GfqÆF–óxÒGn™‚g¤A¿61ߍ?_wfU¯ðNB k1x¯ê¨1-º–Šê½âÓE“ßa(ù1û¯@­dÕ¿V[Éó¶Å+n(I»ÿš ÿõLGvÿMÆ©‰´N÷þæ{%S£aÎ]þ´hfËÔö –]d!5®ªÜÝÏ8×APŸ¦©}‘'X7B`¨6]8mÆÑÊDŒÅl§ÆE%xOÏrþ;,vÐÂI¶Ù$£8/9é4;mé‡ÎŸYèyË4ɕóRsù%×?К)Ô h‡ïA/¿HÇ?!ìÿŸ b#H˜Ù׊°öù/åՒËnÃæ^ÅÝ@ÞÑÿ³žžÜ½ÿi€TUu;ÉÉÄÔE‰¢(„+v'RhfȨñ¢ ¥ +$ÖDK·Ïø…É{F½ÇìBX“ß[†dœ–›1|U__¾¡ »"«‡›\¤­7÷0S"(  åÑë—ÜYwÒª›h/8.Tj4µ–ÆtÛ˜wç^_–åû +°D¶¹žÑ±1suoŒ€ê|V¾…BвÕ%ôHÚ¸±¢Ðr/"ù ‹»wÆ¡¦ 3O#¬W—kÅÙ>pzҍ-P+KAvéڊAþ“Ã?€ˆC»éF™µƒæí +9Æ<Ã*ŽD02ÑøŠ÷æõc#£‰6݃B “ÙFò’"—!ne+ËeCGÍüµe–yÜÚ²7¬ ?Ÿ¿A§l{T$ÍΌ90u^;9ҍ´õ@d<øµCó„a€®¬ ¸÷ˆºƒÂP÷YTèõ[ú¯á ïžrÑ´™ {@ƒÒÛ Gm^éA% ¹N Ëw@KõY±®÷aQð_MÌËÒÑY÷`îê–îÑÃ_æa’£'òIŸµÌG’£º{¾E ˆ>µ”ϯƒª5,89öêè–Î$çJf|WÿÕ=rˇ¿Wü uÐÏWSaëû’rÃÁ “ãdB¨E6†k5¢$ðB¥Ûùüf…®´cæè,êX;Ê.œy¸ª$Û¨h}¡™3w¬úv”¹%@ïýÚëWSkÄUæ;<k›€zú֗™>|ïÔRE´•Ù|š-FzÝUB¹i¥¼Ÿ™ïkfÁUvo¹¨ +ü2³½Á‹…cÂÉÜÈ~P}²­=3¨Ùl„L›g¿LÈ;YåÏýיŽC›£Qøm‚¬Ä©ìMý6s¬²í&ûe&vG˜M™يÇúl»ÎïÒÉ<ù°O +¯%§çLaÇÛò¤ÄN»Y‘- ôNØê™ÍìÕo_lë«úm…ÀÚ×̲|½Vh|×°/â‹Ëo­ð<‡Y0W»Ÿì̘Ÿ]~µ­“ 0ÜOüR,Æí“æ¥Þ|,f Æן³€½Dç׊DÛ×Ìå£/ðv +XØݵ΄ޓ˜Å&[œckf‡&°Äšƒ¹,vÁÌ®›_ô¡§µ™#˜)¥óҋ/ †Mç¸ð{ÖªÑOõ×ݬ¹;Õ5ÁNª¿R4 3ºFÖç,Ž(mžrŸÍBº†í7ìé¶q·Å*–öƒ´YÙ|ª™" îÚϯÞã¸áéx°*¹5: ã·°ì¼âXWˆbrԀÇ;Ø=\Eð±Õå9a—MTu¨ ý¾…÷i&•f?¿ZE*ÇPà8.è̀›-×u¢ßIRؽ‘áÃSVî6§* +7ºS®gI‡àHðfÕÎZ)3ëØò|H&ÓÕ:{È#½Î‚UkQu]ҝ<‡ƒT^bnôkÐ䊌b3Gͱ +­ýòZÙ*ƒŽ£ûUvý“Ò¯}ÿÒF¶j¯ofªVÍðdz'A!Ñ5BD2kç; ‘Ÿ®á_·4˜Úµ¢¹’Ý™›ï¡X¸ê’¦‰/ŸÈ„ÎÈürZ/u¡<$´,‡†Ý–7(ImuRy6Ô_¼Rxoo»#ø ,AF@‹A¢^«d‡ßŸÝ·µÉ´Â;ªlP·I2Ó­ºï/txœ(Î¥ÈÍѶŠ¤•Ã.Ý»,0V «aüŒjX åZ³t¤ +±Päþ˜±GdÕÙ¸˜¢üœ‹pãïÂæV3—ÖíãÇµ… ºKh³€å§U†ka„ñEø T·ð%__íu¶†°eÌq«ž@¯[3Å_Ý9·|¸Ê'AúÇuÇfۚʼWi!ù4úùÕ¸=çcéèì#l''ÊPÏßW .ð-ý7yãVWùå´¦ÏJÛÎâËÕºÃï &±Ñügˆ«žÐ?V&¾AKÀҕ—Ø(à{òõdå­¸L¬7¶ +Å ºå‘/˜Ð[µEêíƒ îÜŒKêT&Ø%;´¢ ¨–|Pm¹ÕO@1³ëÅž /ˆå€1¬%ÇoƄ‡Ï?=øn†'‘f¬éˆjÃj‘ò„/aywôõ%Ù`«%´+B¬2-ŠïFåFAœå† åƒ +×ÞUûj?ž 饟_íšs”¤+t,X@'ÜΨ(–Đ'][ÓæÅ¢²qñÈސÒÉG8†Žú™DÕJÞ^&;MdÙšýÉ`GÍ’|#_íñUâë'BÐúB=Ø âÁ|^â. O8³[ðbì}8¯4QGMí& [PºÓµ™6†:OlŸ³·—K »A²ÙÆÕYí窭:qÌÄdˋV“¨º¸%[ÞrË{ŠÖu]`ݹ´×¹êÐöu#>Íã¿ïr¢Y½žì`›h&äË\ +ˆ+´‹xÇ)Å>Z {¸{ºEòuðzOÎÎ åw`©à$gÈ{ æ¿ ²ÚÄ­2¾Æ1»Öä·ÄÒÚaišä¢r‹ñëË7,!>aõp“K"+ +5çOÀ̼2P¨­gò€hŒõK(Zuµ¾Ziÿ‘… Ÿ=}-é¶<þÀæáÜë ’â +°=äÎz!¨üD$4æê¸5ÇÈëVN(í [Ìԇ7³qcE¡å^DòAwï^_¦‚(#|„õjÔÙ>p +á¸îC ÔÊz÷Օ%ÚÜ´—Ã?€ˆC»éÆ\‚¶1öÍWÈWÖÅ ‚ U*|™Tï"Þj&»½Þ¦{ Ê`+2…ÒoÝ]jöVl©27d`tÁ]ÿRcòmÇ䄘tÓ½žþ~O;ØÚÉ“(¢$6lŽxÓÒ/‚¤$·³÷6) ¸¨)êßìWI®Ü°Üû¾À78çÈŒÒÞäþ‹Ô@RR÷G¶ÙdÓ­¢Äù½WU=—ó¶áïêy‡]p͹:z9÷¥jP©²mS™ù®ÇvšŸ +1Ò'FRåb1¤ñ6¾ÎGÖfù®}A”ëÐÚfÀö& dp÷Ӕ¹7a n¡ØZï üR9ÝšëËhg© Ýo­å¾N‘u›ª¡>—w²Ðk¡(¡ißUë;LÒlö)©¿Ãó±§Ùð#²#–S©Ç@4­¶ø_‰>•ù úÎÛG-¢¿£­ŽÂyú£›µB/½9¨çÔ]•ÖoQ]¢M›½k¯¯ÏÅõúùl@–¨?å*Óþy,øÚЗf‹Xû;LbÓ×^ð†ŸG 6oÈçŽtˆp·$JTÊ9°³^Údùù÷–ÇP™F[Ö³>àÓ×nR°ýx5=“ݳ“oö×A¼é‹ŒH8Hwˆ~û¥/:2·d]ü?Ð),Rέœßˆ ú×c¸ú«°À§Â(¢b={Wé²ò }žçQ«¶F„e„räKKQ}øoµ₯ WeÄjr]4Ëéêw©3÷smUÇD„˜)I9»ûåæPz>“ +9=òkY¨DìCª¬‘D )Æ2Ší? ³­gäF°ö0²š C\ ëÅ:ƒ8«Sç³Pb=ä½ñë(=Ò%qZžëçW-fÕyžp­N9/Í»Àm…¿¢S%C¤:t]›Ï¨æ9Rõèól[èˆÆ-¹²3Ûk–,þh­v”•ÿ’‘+â%,±zÜ8ìNŽqZ€Þ\¼üHQ¬ä—ÿió(Q†B‘ª%òAº‹Ÿy|¢àŸŒ~Κ:òMÔé,c?/½€Õï¬ì# ÊuÇVx¾aÔq?_ڒ¡h¢$x"\ËwÈ#¦Äэ”I¾ö“ÜÈÌíz7íZ ’Í‹™^’X÷ÓjWÀ…% ç–¸§:6Píi¢¿¯=aòÜr Âlqɂdý]´²šâJV·™Pð0r×»}…3Ì @©m}¨‹Ä¹E‡—GÉG²-¤(+uÞÞ¦¨“Ë9_¡–T¦y¦7ÄÕ§my Ì“æ‘2å³ÆmÐKëU0OÖ:]æö¢%ñ%n½ûš[ŒoèkWDÖý~‡qhÿQ$Xó—Kaž íY)U9øѹ<´~Þz—â—ùóq¾ä°®ø_?òè:´TgÛÈèôóßÿ¼Þ×"g42•ZP¼B}´à²àò@1ÆÝ©á¶ó¨8NÇQÖrùŬM4T"‚cLä[¶Oœ³Ó­eb¨~ì01(sÑTàž¥jV&N2µöÀŽëN!«NtxQŠˆ}ZjAJqÈ\š6’èjöV=©[ÀW­h,ˆUë›8ÀRÕRáÝò·-W¯}ˆ»…%þ–‡:(k°˜™Ç£açs*ÜxyOôÅÏ^G§›uŸS÷MÚ÷,ÙÁƒ/h®Ù¦&º +ѬûÂõØÆîx@¹n\íTVGê”x†5R^jRãµw|,•E”ªé¬|A +>[,åç6,k +£ÃMû-ŒXm»ãFgé ç_ýðnïvF,ºšÒp-†½ËTíSyÄ!È>ZDˆû­­‹ «Ž-…¹Ž‘¢ék±ŽÚ­ó‹£í뷁táq p]}«9ºéhh?#ß –¥’ákC»KÅNóžUuo¨Ž²ù(WûfÉì"×ïäCÁ‡Fu]•({o¹ð5ÀËÑ(þß1ól9.ÿA;ùóÀKÎæse‹p¶LÃå…ÿÌE£ËWÖҜµËñ”—} +È XCéÀ›ÇÅä•7 +·.˛ƒF+Ž[Š|†+íRS±”} +]qÛFôE5ê¨Ûl‡[´JrÚFފî8¸"´2¼q’ì~Ñ6&«+NüàˆU"'*/²æ­ÎepÄÈ>˜æ­Î©îOïҏo®ÊšFÿÀ(þa\Ÿ¿Á Ÿ±ÎAO8dvRmNõšÒðšåhæÛ´ïœ7U^×h«†–Àë5þÝ(FԖ ¼qFÉl@· Ú֓êÑܵmôió!ƍÚ@´‚³'ÙX¡cŽ¾6Ôô¯OŽÉȤ2­c(åÎ1ktÌXÅoË@öº€Ќû´Aݝü¼”†½ ˾¿ÿz öuFóL ‡Ý),ã›BÓÂüôe¥"”4Ò2Í O¤¹K¿Þ"xÂak¢`ÆÑ£¤ÿêÃ.ch }“ö«µõÙk3«  +NômW?pDQnШ ƒÌ·4‘‡,  oÃ׆›:£”ѝOi@°¢ŠzG™gGAåôÂxš'«˃EÈ+/ö+®^1ŠÔ[å~fXŒ:l½³Î[½ƒ#­©e’e¨‘Û±/AyƒþÖ)ÕÞÐv LG(¢7¸¿]œMîËËì-Ó+³GDÎÞï/ÎfðWïb¿·€ Q\‰¶I:C.dµb"*™'SèϚ٬t‘q—cÑ­hïR"×Û÷略ÍÛ|oø„Tç~qW(¸ÁFiQ‘ªàoœ¹aU)?RSAÉjË[ –þ*KT íR¬×ÿO$ŸFÈj€%iý´¼®ptЁìN àóQdø&DW¬ß¶à4T0O§ÝðMHҔ‹ý{ká•C `˜\,&zq‚û·&}ɑÖÔ±¸¥#¤9f£v¢„ÁXęò„Ò&­Vâ|Sd‰Ä„ ŠuC´&A‚CB´ÄÕ#ˆÏØ'oÑÃYûÞ Vsaïõ÷{K5µ†øm ‚¢Æ5{}¶€o›zSül9½p’q¦o[Îì·ûq 3°p\MOÕÙ/ÕyÞߢn@½z§¹ÔG x #×VþÃwµd;’êÀù]Eo ïáÿY'5píÚ¡™i¿7±  !„"65hÔèé…íŽ@ôʙ©·˜Ž†ƒµÇëç:cÌïhPñ8{x1ù9V¬Çni¸ŸÃö0>s9؞Э› z9\w¶;IÊYј\vÔl¼v<3֎˜MKªêÀÙCX~¨o%þ8€ôWãÔ÷]å¼gL_`‚Ð4#J¢n¯Œ!>ϔg"1¨CÈÖBe$Ÿ·¨Ñ±{ê¿T<3Ñ[lh¾³Aäí¹ò6à+]3o[;ù£Sîµþwžn•Å4ͬ}5|?K©xâ†DãŠZfI®1‰*Oçáè[´N‡"x²!ôŽä¯àK/,(å¹â\ƒÍÝ蜃)‘å%[ +Ίs®Î `”ç“sõ¾(5ŸVŸÌ$~'°À)H¬y(ÌNê Â"6¡öòK{B,NùÀø©Åb3ù)¾0®a=Xõr]Ûå‰;HhþFÄ£o!ߧpŸñcùz€cŽO,n|Ö?±¼yÝîÎ Š œÖ­¶!#iüæõÆÇ©È¿·†…Y +’úZ«>/´haá9 Ùe7=e¡—½¡®,ß³§8bŽ.“æ'Fp0æ-I« ݱò0×·øڂ¾úw&53K±Ö;¶²hH!Ž„"…_e¶“‹[F´ýÿ\Ú¼åâÞµzåâüš‹ ÞݖGוFěÍÆpíµUג57–‹áŽ#ïß"+¨=S÷É}„hR sE] sK:Úû{Ÿ%Á(–"­4Þ¶ôo²Æ¥n¦ê˜ìøæôì8csø>КšnÔî }1ˆˆQÃ;DTtOˆ]œ­«;5A˜…¡WÇì×y³ŒR®ÈÎÙWy’Ž4́õ]C—`éLüˈ¼]s ߂¼Þ]êï‚•×5¦‘ã5G¶±»ºú$“´$8Þ&Á뽘‹,ž)uŽÄ*f¼°PZí’W_^Uñ²zcátêX*Ãm¸ +4Ô¶™.—)¾ØU{`æIåX&>£XÉõÂo¬‘[΅öy«—²ZûʓH:3.¥¨€ã£b¬©uµ¿iÓRåõˆ)º'Ô§ÂNçcrî–Öö¤LK­gèxÔ}‹šqRìEÉGüš;òc_ƒšß¿ì3Pnjû½3„mOďŒì!99Œ5“Ûçà†k#qÛÓ÷/H†Ü®+]šU„ÑŠ;_ç7ðÁòù‘&ö=n£s G½5Ò5}Mk “•óÛڌ‡=6úý 1Ê8–ÝÒ¬m‰Òž>ð5ãÞ\C_aw€â”Ä>£l°ojÁ,7Êé+Á8×î6Ðãø;Ö5¯KçÚZW–%…œßŒÝņ³üäÞî¼¢„¦„zPZy(ý­´X1æüÄ(Â}q‚,ÒVôž¯ŸèèôèÊ=.‚­l¼½[\T¹@”Ý8Ð}þÞƒŠÃžÖÈ^+öó+4«Õȅμ7Õ¶¾‚­åßÏÝjÚd¹ÖzrJŽ6~\T.¢¥}b+¬×™oãë~E;ÒËÆ_Ý%±„HØèdá%\<7Ó>ˆeξË`‚kØBg҅ג¸·óج™Ú ŸèÁ°Ÿ–6|mU–í·Æ|‡Œ™i©3½Ãó1ÊýÀ(Ü59¦gè”ÿÎò©õË?ðVH‡åðG“ÒþÄ)‰™†d"¯µ~2Ñgÿt‘Óڊ¦ÁÊÎ6eYç–5;z*™¥º‚ºõ¸‘^?´ñkcӊ fŒïGŒÙÉ-oøy¡0…Š6EÀ£h ŠZ«7ÆÜKEN:ÛBQÚ#V[_¨lïn~þuŸékOåEöo{DÐ$o2#'ºIP_ OÅ;^2£G‹ôAg­ç¿ð¯Çtªï'TK(7ՂðfšQ™Ht¤>O›ä$ Þ)1èñõÈ˟l×båâe[ WÅÄn2)|„©åêžùÚi×&%,äPÅlA­bÉ©Ô>‹ +5=óky¨Lœ»-õp +Cj²Œ6‡‰2RݾÈ̈Õ-É ¡߸¶é¹x? %Æߍ_GI̕æy®6î¯tÓdVÈðÆ0AW•f’àŒ.àˑø ÿ GóDBV<,“«¥{dW°ëÐa+’ã‰x²Gæ)¹Uë¶b³7æËíúmöãö–Á²ûäÙì;]Üð#"ê˒˜’_mÃRÇ΍¹aPIéñçÜ(¨¦•¥xòÑî<ü¶†U<̹5ør">ã!«d’>šy#8—­sºM‘B®Ôۏ*j֙Þ讘\ b(QCß2¥m¡{˜:>6?Uz$û'kVz˜µ¸öûÜ¿áv“Š1·EX{hâ,ÔUè¹.¤zuXµI5™Žº0ØIg´§Ÿf¸À”ÏÃʟóT¥:6<ÇF?°Ë?`©äñº}á’3Õºe‰Þ”7Ò)¸Óýë¹×iz¹nù3::–c,OB ޢ·Ò֛MÝèåÔ¦2%á"¤K'iR'8§ùUÉ|È©°-p]Op灗—UI:ë­Úß+ âJ²eÿjÝm_¬ï(æ¹(̔àò|رãzªÔlœ£2f¬.ÿ8¾æµmUË*÷fvB%b›éçD¬˜;ó–B°„:…µÕp‹:@·µªÍ†gÚagô€šÆ¼`våà峐P…H4’éuï,šâq.(‚e^ËVÄKºàþ8\M×Ó°Nô¯_y@w`Lœ¼v•–©7o¿ÿýÏó{ +T˜ôŒƒ&ñ0QˆKyôtˆqDÒÀèq 57èiTJ–¯F*þÅ/ÆÌbçxXÎ1Ë0_ODpNkLæœHÎ:4g­žïȃ/*ƒa°F7ÍЛƒe¨ +§¡hGOì.£%­ÊÇîš5ÐuÖ¥¨“´rƒ>ªÝ=øHS°ë= †,{ðL+lž=÷Q×µº‡/u‹=#ÒþñÔÎòLsÚS>;ßva &_s•Ë`EûÀÖ2æ DäUü}A•VTÓ"_—æ +› ÌâežñvéxаcYxy«5O”ö¬j›¸¢àڋ=öɌ.\uo{AäF°îã5Ž=¿¼S:Ãó¨{ØFgÓ C9Q½x ²Û|[8~Â¥ìq¾:j¬¿f¥JüWÊðsê³ÊÖ¸DŠ&Ðiz"J’šŠ7+P Jæ‘3é«Ÿ³‚/127…j1¡-OIõÀ:[ýH#*jõªx²¬““õ7òiü¼&ä×uºý%‰÷]0qÕ¨ ‹ý»é‚q\"îäËVöà2èVÏëô€¢ÙM=õSò¢¢R/¹®ŽÐÜÓ±«&6ï‚-œ£I$I†ÀÊ>í& ðáq͚ %è h³RJC ¶—åÈ2Í!9NOš»¦ð¢xŒ;Ë<>zšŽ†IùŽ?õÌ?#íe<꽇¬2æTÏå•zn£p±Ö{®Õ÷¨{¤|¯•…wŸf´ +Ýޟ«Ê¿^=׾ߋTýSÏPI¿?ûîyò" +蝲}ò­òͲtÓ`:Ø´ÀwÑëåFéݗøÔ­¿øS­®óµ˜/øÚù%ÊF"†X>qRyÙ6&òN~Ñz&Š´V“VW2½Õ¾œi&¬ãvÒ(^‹¿«|ňÃå­Æô‘U-^Ÿ¿Aì`ì‹ð>q’nçUãµàÂת&…kÕw ž”þYÓmø—)lЊ$WÖ"úH¸FVÔ ;J,87»ƒÑ“KÞLb¬^֕Ǭ²•“H?E2XuÅ ².Ŭ‰ëiÁ׆ÚÁë“xò%†âR@³r#žµV ï/âY ¾÷ñ×o;³j*,ÔÒÙùº1ŒÉiÏ·¥PÝ0ì1a+-máãA³-Þ&ÍÇk:# ˆlÚÕ¯E·¿Æ-LE~–ÙÓ¦½(µ&4æi 싘窃Ɇæé€ùôވ{ÔÜZ¶ÙÅÝ<ŒBŗ_eþ aøÚœšìµÈdOt>õ Ý`€xð"ˆ2¯n#ê}É£&GÙ¢&t¦NuÊÒuB”G«ßÆa£f+¹R¸~óy֨ƒzBª£Æ¨Ÿ“×`„Á­¸f¥QÞ¡¿µŠ¢zBÈ7ù̕op¼¨¼F©¼qs~SL¾~^J‹¼]ÀtÙdR ~ï=ÈBØ"âMcKµú% ôÈ#CÛKáÉù©ÆrLömJ´Ì5²ú‰Û" þç +²˜Z&¿hbkÑ>Ÿ¡`d´ Èö'–ñ#qQlP®m±ðhÝ$r‡>é÷¯ÝCj­’•ûìWÏ1µðÿrý?+×­!˜ÚÔ Ç­\;ÇY!ïODóT’.óÞ¤˜M¾¸Û¶?@µÈr®Aé² 4¾U~ʟ؅AwÞ[ùĞN—Î+•øȜ»Cԇtˆ22,—E¬Ê»íNðk7‹8†-bI—cÝ1ií4gÕø:Ê6…tjYæg˜õêÝ"n÷±,âüáՒ%ɪÃ湊Þ@õáÿYONzwÿÓ'É"¢òœ7© +‘€1–¼zÂ4žpÍM*T¬El–<3®útZÄæ·±£:¤feª1Ë®-âåâüÝÝqâ’Ë xàÝß®‡wƒÞ&âØAéۋÚDj¼¾ðgc”鏫äßQŸnºÌ¯8†êókú©no'»A0¡=Àí­ájU-F·Ç=-ËDô(ÒE›×¦Æ³±Þh}áÏÂ09VÏ{ý&¡w9´/7^,{4˜”§3åª Ù.²ˆ4vC:nºí\§–»Ø_˜üáÙ1L +Ý1ZËeTFRýT‡~™ÿÄxqWsw¸³IÙÀkbeìlp4â¦ìàgåǹo¬î¡ñÔ®¢:$ nsZ‡±~·èLR:fÜ?GBMáߟ5'kŒz4_ómyå‹"Ò2Š”K®>š‡e¸Þµ&Ã=â§8:¦GȘPûaµÄ¶d‰G›ø×:A–Vñ>FX=µ¥"Ï59ٞx„„fir…Öæ¾_·å4÷äSù62QҖ[õ¡Zsêøų~¹¬šdìöud[ß«¾ŽˆkÎŽ9jPÉLGþ\®‹é}¹@”¥¾®«ÇúuQÎ÷k_#|¨‘®àPMçUh*O×Ï¡‰å)GmSC¹¸Ðäъˆ]YA€¢ë7b`ÊØ©/í6ï×™Öì2Þ±aøý:^¬Ë˵Ãý´ÊÈõr²3Úêæ—™ù¸M +Ò"ôi)ç÷&±µ¼ ž‘‰@—lf]Ks[XØÂP7>îÙúçÌYPO}v]BÜ⡍9\~#_¸G/ɺ‚:<,£ØK^É(•E"Ú4~FfÑjk¿ê5ÿo‰Ð_Q%€×u©ûÖ}ªÒJR<±‰§CµO í±ê¸æ?ð®Ü#« ç2–Ý\L©“jj¹lñÄ –¢ñ³vYXüܦ˜˜?ˆ ëÿWÊã’ib¼f¡¬Ë"}‡¶õî# 5”S˜¨âw’$©%áþ©ï²‹¹1¥+Ëé&i“­i©2‚”«ÑágCTóÙ¼UE6üÂkz^ýÂ=IR” ñ™ŠH?áJwÝVÿªóäÓq0(;d]“}`ÚH™ê•ú’3z'Âfeø÷ûQ +w×/ wà+|:â"škòê7l,Ýj}¨‘´sšþý¦2T%È©îEqGMÆŊÿµwÓÚÚÓÀûåæ î怍ëÕGí8*Gc‹®Z±ºçeMXÑ°omO"JRd¶Ä¾m·÷k¡ª•\ÁnÅ·Òç>½Ðv† nž½_`‹‘Olfå-XWk]0ðV¯f¹O̬Ëi­[hcã`¹¨•’£¾«¾y°jh;Æ57/Q%¡ˆ‹RϾ¸eöü¦Byâà¥ùtýDñÞ0d^N +J—\u!–JYM­ÅÊa±Ò”¼½/ ½}ó-9È +¶­ÈÀ[F´H±iíPTЩ_à›6Ò·3ÿM‰‡ÆVù?¨½j}öeVaO_vÃxðõҖÝ!Õr&?`XUSͪæ`ڬ밞§HDZÕ¼ŠæHuÿ +ñií—n4¬l:Æ¿hÖ¸õ1«P–z¯FËt|áÍ[Ûv(kæ¤Jç-.L_º‚†_c#÷ó²ÎJÜÁŸ³/‘ìtë­ü×ieV+7ò}7–Õ½RÝüÕ۞ý}Ç ë&)—Èqqìð’*çõk[ýV:ÚqrŒW½2ö«g_C +0úЯ¼ù{âÇYØ‘+ÍUâªêh—7Úqr$Æ}%ÔMØa2 › +5®ßüÑú²ý„}SÇnÒ.wnÎZž‘©‚"ßÿ²·ú8BS˜³1u N¿C Óçå…ó÷dYÀÞ~ ìyøà©aX'f$= Èoöža˜ÞI="JcÄ9Ø6ùÈçŒtle]cdɝßFÌ«<ž×È?í4“i¿ÿ»ŒÀ1k“D;Ò/#¶ŠÖ [FßGzLË>nàÛފV!ÓÚ÷‘½*âméßFÌ:CR@g‹IìÏkÿL),Î,Çʺ˜’Êu€ëQ+æIÅ0Þ( m :ÃH£"Ø3ÐF€ö š.X#Lªñçl€FÚû˜0ü~'Ö wqmp;æ'È/’â9ԁü›r +­ ÕãÅ¢ ’ òùYúY½à9ÒA+RèÑZß%[ŽÃóÀgl}‡ÇÌF þF¢š+X™mÐÈÕ0ž·è움[eˆ»X¡;Íö^ÒȊddG\«NÚÚÁÏÖªd(¸ÖªÜ„¾9/ñÂOPGKêxΞkk®½ÇI°X‡ä_ÿ ¸ƒu) Iü߂¨æLu¨qkZ­®Ã¨ðQ5­ù¨ÏBG¶«æ:nÑêj±ö¥îì[T&‹‚Ûµ/ÀvĪYŽÛQ›;¥i®*ÿ¤ß¿.®‘¸Y¿¡½u-[h;ídÐ\ý¸f¶=“gžÛ[\žhÑÍIidk¶b&’¨Iñ]b¶Mµyڌô¢Ö bnkKïÆHÆì&BΫ‰3™1$¢“R’ö›¸®wy6ensõiï—#ú—ŒtrÊOŽTñvè÷)’”/•ãC3û—ÖOéoÁ¨¨Cºžǽ¤¢·/ v>+¸Ûžh©úp>ÿù:Ⱦ2Î~Μ¶îŽ°2rO†?>ú”6÷Ì'bFsæÈõ‚’(¿þ օy‡Ø÷¦>=XÌPˆè ã0ÈOzK 3-[¯“¼)Ý𳠁†‘žPODL„„Ó‘MHDr!{šj²bhË·EF™¨F®¬sÈ8¸ Cò[¿ò+àý`l†ZwaåCQîÉȈTSü ¾5?Äz~ϊðY¾°à‚5ÂGWþœ p‹xiǂa3a.œæâÙáz® ‰ýø9ñ1Ëøœ„ŠÊýsÖü£$QÐu$ óM„Q@WLêÄ9a;*— (DNj¥xŽâ`þañLvŽZûe{܏œ!­p°˜Øh`:â8M,whÓF>OŽk Í܆N={˜ÍqAÅ0X‚«.¢z…â'§_°·3ý­¹r†–ب"Õ*méÿØkaW2UÆg»GÁK4`,ւ•]Ö«F¬âS¥©T¡DS•¯ÞJrHyáÏÂXã꾧ñ@˜:Ü +½]ð‡8­«´žbÎ澚2Ö~€¦>®˜÷«×cpڐ3•}‚¦<['è’WçЋF€~ÃËgÊýö Ìás‚4(&¾eCq\OdScŠ‡Ÿ?EÕLQªÆÙ7ŒëŸåLÀ¯Ù€lΖ Š&^þÈgñ^Dk±æ…1{»«;!xÓ›2(%I–Ò£ ˜é%/¤x–¾ñgaÔ×m«9ûâE·î“G|B0Cô„©ýØ’ú]ð´ þº‹Ž7ÞM‡§ û?â3nñ]|ŽR/âóŠàÉbkÿú÷2†£ÐÊQ*NéӋ —”c<êwÎæî¶ít¹Q\¯ ï.¹t¹º¥žûUo i$rŒé­1‰ªZaÒ. ‹ JÉô\íùç*íæÀrºð ™g^HO8„²ðgcÜF™uFO¥éåM ÿc¿Jr,KnØ>OQèBÌÃy> 4àìï¿°HJoL»WÞy“ü/…B¢¨ýƈQŸ?ëxãJ9ÎãÉ´Ã%Ô°M<†ð§µn)ÿ0{œ”ÂlJî\¶?èˎOf?;r*1l¬3 1Fì)€”äq‚nWÝläŽbhè¿ÚêYãe¼¡1·ßåWä\K4ÖnŸ¯@+'ûș}+ÛG£+cXs®–}¾Ÿõô­Ãjí¶ê¢œÞ{8B@¼›F`Dx-±.Ðጳßò•ù7y›»f±Ht†57+?_v¨u=þP*RL%©ÍvrhOסõyK´*‡UCdŸI^ÂWMû–mhn—»^c\cj´¢>¯ˆål*¾±ò@ °¹Ç?µtɨ„`"¾AÍñÌ"Bð?q¥„!æòÂGªéxH÷²èy˜HN\3 ¢bòÜY. †ðêÊ6;Zgœ,<ÜTH¸×åëVƅŽŽm<)—¸Ð͹ÙÊ©¹Ñʙ–ggʁ¿lú±ñéCß±%þò„û>½iFVlü]7•G…jpt\ıU”Á.§S%×røG€žL#>yTúª#F}OÇ~"ׅ17S¥OȽ0{šã¾XÀŽ!$ª¡,ÑՊð˜Œ#¼";[úàñPêWÆEÿk©/sÜJý ·«QêoðÇRoôœB£ÿ¬ÒÌréŠDV©“-ՕÝ.ôk*~kwºAÛ¨N%â}˜/w ÿ¼¶2S½Gì£?¡MžË}?Ößµ¸ìvï<–mo^¨BEVâ%Š4²Kc$(J¡Lù­>挭V©“6)@՞ç©*=’‹‰›ÀâÄ1ˆïŸWÙQ·Å· ™œš²»ò+VŒ=ŠêòªNtcæ6ý9ó9ý‘:Œ0çâ{ÞEr-·Àx†DmË&ºZ)'’±\[â@±g¥Ò¡„càV‰“THWæ]›Äæ¸,¦{@n«ž ½ÒÙ¾(Lú|/W±ÉFì°ñ•íOh¾®”ÞK¥õŠb*¢=Ÿ0ú!@:äu‚9ÑL¨¿[€Ôá$Ôzyáä‘J9‡¦¿¶Α^ÐÒj67l¼ é…(ºh/M/á¦ÈÐ^^ùd{í'”Ÿ8y¬r‘kô“>«ÃÞ1‹µ .OÒ2‘±´4¬èyNšåL¾oo‘¢ø&,JÞoZc‡'`PÛÇýãi U×]­ð缍æøùU­0æüƸ÷0ôþ9ûŽùȖÕ.ҊòoŽ€ß'œÉ¨µþÆƀŒðØ-ðŸT$îÚ©N¡ÆG`0@R¸Ú¥<¤• +eÕìª ]fµЦSEÖ@ ÙµcÀ¹áy—…%W3?§Õ³v‰Qg`-)¢Çõrꇌ£†Sðb¡­Kõ°z&W‚ý€( |‘À¹£c?Oë–«¡ŸWhM¨o þbIdºêYӚ?×Ø ú‰+[,Uìºß؄SñV%µùÆÉ4׸ÌbÓh«\Î{à#:óà-—…“–ÕZ®XìkæbЍ¢.g¹­¡5O±†-;·¨BP¢qŽ#¥¯øûÀö@çœøÅ:ý®¥H¶ö0'Óe§ë²¯gâ{2ò l¿­¨uˆVP`wXYIF‚þìŠ'$›:jcw*¬,ÎçmSل͊å¡°Õ¢‘ñÌÀÊÒ9Ú$¬û[fìCÔèÈ6¦¶ª”a’ÎáOÂgš22?¡ ×k˜Â6ÓÈHþ¥Œmm:à3—¹ã›ùtÍX%¼—ZSÍ?` n\sìçèóå‡9N±H2i0]©hh« ¸Ù–EêW; +pCø¬¸¶m´‹4–ºj2ˆÎuƒ®Oó„x•æKe +ÀˆXÖ½˜ Ù›gsÐÞ&~缺ØÒ樯X=:AF(‘©…€+èâØ蘽ÔW3-Û×| 8B3ï¬WËv+xfKbì çI ï©µŸßzsÝu06¿,N[‰Qž»‚^‘[JEÁQ¹C¹×,}XúYç.—féêãm·4qóÿ8þßÅq/ö~Fˆljþ¤Õª[¥Ä~ϬšÓØ'ä÷™UF㸠GՕjnŒÇ"¡²)ciEªàýFt " áuú çïD¿Ð2¥q¥zú¸ÍeÉÇÜ ²¢nSc9íL!³%!ïÖï[Ói}ÎPG„ºØ¤Y-Û:ò±³ûìâ|Öêûj ‹!ôý[¡D´í©Éö…ªBj¨ h×(Ri™O’)m%¢”_~ؑ٠ÉùöÖ»ùX•Ÿy¯gÙ½xyÈ7Xøµ%ˆ”Ö 1(¼—³z•¶í:ŸñyÌãk‰,W¿¢b€î»Ù› +uԅ6ðÉe6k^Åü½B?DP©Õ°“2ƒïÆ1su/GG7Cr)êz:eºC«˜|ŒÂ\{B%Í•7%]ìXªŠ,„Þ"&¼ˆåó——ÒÌWùDeãÒ9|)³Ñ-ý͊½ì¡K½Ñ-‹J/¼32'Ñ9IF¦}Ö®)Uü%ažø–1FbPt« fÒå—ü†QIÞü2ˆ a\xfŒƒ¸à•Û£É2ÆÙí䢭 +F|)Ü¿2¼ÿÍ~µäÈu$±½O¡ ¨‘ÿÏyŒ´hmæþ‹ ’ù^W•€‘m Œqoº“•ùòA2@rȸV—¶µr^|Üs¥ÏµçgOO<.©²;¹ïž…•â%ÉdÍ18H¨pc™š‘I ðD6y•`Áã¤pv'›6C&ÆžáÓ/wŒÜ•ü` +«? ӉK¶ÛzYÅPòßCòípCÊÛà¹Z¤G1ÂÌ óڍéŠçÿ͊‹½[m‚½_¥É)é­Ü׉9üoJŒ9ßJ®æ¨R†„Žë$ +6Õc™ÏŽ²Ý¼eBI‡&Tè¢4¶Àçp¥¡¡®[›ðÔåÛp%¥CÓfOƒý"BïE)¸ŠÂ§*nG¦ârP*f÷vìXÈÞ77‡Á¦SÅ­qÖ}º»UŸòµ³¶ùQTÅ/u3ex´%R§Ôx¯‰}Ί4ÐÍájË>¢õ5~žâøV<àùðY–2ÐNmÒÜ3WùÜÞ÷ë€^Ë \SôœÆý(.6¸[Ô¶°žw€!z„²íÔU'ïG¬ÉBì0Âï+ØæÞz«*™h ÀÀ¹å/ÑÞü;)îmÈ1 ußXøí®ˆ¯ý4¡LÊݜImØ¡L9“h ªRàDP5ÑHÖ#ò`\ïÌ + UÙ¿ÿe¬Ã8ÔÆ ¯ïüÂìŽã÷ƒ§‰/¹aWÆíó›*ü~M?|ã$ Î?1M㋠I—v±ß*ýý` ¿®5†1Æ~ñ‹ D!ŠŒw,ƒž~¸ƒ`¾üE+ëÚ®Xm6Ò´ÉÎ2Ì ~ô,¸ÀìB'T¼CûÊ nWIѱ/†=½%ë—iá!-(æiì.gghÁpŽ·éÉÖ-0ó—+óIçÂ"DãU¶h&–[ЫGivõk.¾ì‡”³ïèéÁ‹rËæ ç¯Îl×¥Åï‹Ú©álsZ ´!C.²Õâó8ȧï|¡I ä­p?¦ý¹ù~,²VL¤vì(z°x|¡vuç!”¨"ƒ¬-“ØX6îœÏž¼'FŸ9/p€B sià®ïB<Ž•Ë[¥^–µÀñ¯ª ä_¿¢Îªn`„ƒuè>µx‰A`'®—…µLèã2©P^ê@‹‚4ÂÂ*Ý + +è¶Ð ùé¤hÇÃÆzéj>_6™“ÙÙÖü ^šš,,öÖ#/)Óx5G„æ˜ç:—þÅÈcØn(–Ðȏ;ìc¹5fUFuõ"‰N8ÓŸ¾.k·X˜!ã8l%¾iî2U*­(„–¹ ÅEÚ#ù¡Ȭ™ûµQl¹Ù Yÿ_ïxü´­¢Õû`ÃRQYØÁÌsh=•I•ÕWY>ï E‡­ýý7!|LÞÀHkàëNg%ÇlþØJ ô;ž´ï˜†*· Y¸KÖU¨·¾ÓeG\EõnW°î;,;\Ú¶p¶UrwÀ Ø¡<Áúª-Åhº}r£×?…å®Ó‘.ìÂ؃¨ªëô!çÒT½¾„í)²s8úÁO Uléž:äqv;éÜ?‰YŽÁDŸ±,;%n…ô]êÐn­r´æ,gY$¨laÔ†¿]Aᑹ>´{y³ò¡8«=[(ë†jqú™Ñ‹ÅlçïhcÁ4¢§p~);ê—V—¶¥j&{…“¡Âµb¶ÍžNßÑ©Lhs—=; +Fá%‰k¦‹…PáƐ Å͓¢n×Îå+Ä ¥ï“p£f^¦Y*: dñ¸cà®D€eöïG‰ÝAm帣úSî¨þÜQýiwTÿ¼;*æØ÷¬tG½ßՇWŸœCòæ}#As §|¬ö´mÏ¿n>óҫ˽•rgnXæ‰ÌILÚÊÇ4ÆBè0ìr¯Á ©GŒGÊã†p©$­,žFSeù¶¸ðBßÏøGÜ-€3nñoאÛ3Vz?ëçˆCÈÜÁ‰µŠË¥Ýo àˆÉ½/-¨vë$¸¬t½*=êFñ©‚ÎJ»ú š‹y0XÉ,Qz£dØ ++ö]­_ $ ZxïÀ'PÁšc>G<Çл§øèhdM¡¦+¬ê»Âëñ8aËÃaò:°‰˜3=m}´å@ôŽ&XDõ›‹³{a ‹§øÈmá[ŸT{¦ïJ·QšÔ‘VQ +q“E…0å¿ö}F+ü€znõåæ{Gé +/Ȫ¬H’V¹¡1\µ‰­à’Vc]D v¤’ñêõƒ4û힑sN-?mêï7¬ûî* ÷ԅîqú—‡{E>iE_ҐUM@diu¥c°U™¬§%“ü +ŒCwwb®W»Rîû’©Ê%GD—]_äáµÅRùŠ¯žÝ¸à½O!ŸiÀ(´Ef¯”Ÿ¦ Bï¥ì +•îHÙCî¶\££+ÍÛ_5˜‚*¸dÖÜ÷Þöøõlòˆ†÷ö~·` [¿>ŽÝEvjŒ›îý†0D—¶(n VIaZÔ$£ºZ`²_жËö¤D müŒLÿMˆ«j¶×¢ ùFN§‡`ãô‰]†ÆúôÁ¿Ô”IùóŽåO¸Üù—‰ä¾‹ä¾DrŠä§H~Šä?L$§}™[Gµ°Bÿ"—n_¨Plö^¡­;,|'¯zkeyØ{z'õÍrµWZ^а̘b¢¥é™ìö/—óÕäW}Ì,:T±±·Çë¢c»%; +$˘«}i&È[A…½ÖW×î×ä0w&‰¤GySucu,Evå˜ùß·ä*M1 +?¤C4ìÚa$Re¯ÞŸ°‚LSd<&÷Ã>èHÆ*Ö½‡xÆk`ieVµõH¢¢UØë—%E®ñù)—-ûG*ÝöS•nûó•îÜvkkÿÀ'ÉPì&$3 ÂƒH„LI +8OP-r¥³hÔîàPìðÝÐؤ`¡Êdé½ÃÉ[Ó/±íææò^9ØæJ{<Îˈ,·€F9{…<ÙJÄ+ýƒ £”knîÓì£b +‡oëx'¤ÀåœRXľ!ÿòª×´g1…ý´¤¿Î’®…8´+LbÀ늩rIÂPEä¡Rƒ€K½"¿J}˙ἣͨšìÎEd¥0úŒïI›&—½E_µLZþ‘i`®gºn ÓuËN×Z´ÔÉ{›†TÛWe?ÁL= +ec®Jh²ÝÞ¤%hc‹È\‡•·Û5“É’¦ŽB«Y"çöcq‡ZÜÝ­VpþŒÕuÅ%L«»~Çêc¹t5¿=ƀ±nÂ=åd&¹ÏW1€¨Â«Ï7w¸7"ôj¾¹Ó›Ï^îi둆ÈäìÄÀIâcŠµ¸XaSê°ø8%j„hCÔH«´[™W—`[aÀ™Æ®•=°ˆ {äd¢–¨=[Á¶‡¬œ~ÚÕØwXhš–"C',H?yÒåHŠ +]]^Bë²{7Gs­;$ +Ÿ¼j %ìÂÔ`Cúm¿x€~ËIšæ= ™’bðO?øcc÷l‰£|ø邻}Üí—àþ1ÁÝ‚û¤ñS“f´Ùœß—±å¦bÇCÅ֛Š7[*v?Tl¿©ØzS±±–Š 5½ºn*v»n*vÝEìÑf±GÓYÏKÄ׈ý bë]ÅλŠÍÛ¾£b{6åȪÇ4þów»ÞßP¬ÉÄDʖõóƒ5_Ãù Šmà²:qMåàßø†ž7Ð(Ü6Öô@ü2ü‰®áõa= âŽ³ž|¾û^_‹sü¿••½˜¬ÜùŸ˜ýô迦ŏM‹þ˜ý›Ó¢lcîZþR;¯ukç2O;㔯vž;:³JÈ°ÿ|ýçðªyˆ÷ðjÂh6êÕK¦ãj|k¾ÿr Tpªqåßä¬zöQSûY[íû†Zß»Ä)Aã“ éû[^Ypô¬ü–‘ºÛ²ûº­l¯U6a³,˜cЮܽ>Š +bÖý€ì¬Ì +Eí Iù Ð81ù}\/I×òS²Ú°j[í‡ÁÁ‚†à@§RëH‹à\æŽk–T3@ÒMKéðˆ«ßïH™ã×Qgcp¾tÏ¢'±å;†{UÒï åÆ¡¨l) ç-þ“h‰ðBÐø›âª‚ˆ'#ºOÄЦ & {C+Ý üEV‰%»ú€ÕËÓø+ӟ6G3¹LçÑ> ¸óøÚŠWèÎ'rB¿Á>À4C °9'òH"c]ƒæ5°hA}t.Þ¶¤BsWÕ«t%›‹KMîäè*w7&ì&ÒÓ.7yËq·Þ›%ÿªãŸXÇ}= pEFaÞ +v¥ëKۄÅz[Ù<îYÕeÕðDqW± +ÜÑu×Yøf¹Åò¹õmú%±ñtÈm +^5Ԕ¬ËM2zùDu=Â5æîj׬­ R'åqÖT8™î­P¬f¶Q3|[ýp4ޏ1*‘éUZ×·™$²€G“”¡Í§{S)¾¦80Ù TéUš½“ÊÎËtü:®ˆ3Ç衃@zÂäï&-ÚÛ¬Õ÷Õ£Ú…,_öu&Ì[ñu¥|@ŒBߙ_\ÜxÎI²iƒ1â¿}½åâæ™`ª5H#vVZK b ÑBò³$ú¢.ö3@œ®S™þ Öæöš§4׃3p‚*g| t°«Dsu@fq„Bau í]ØIAÇ8b+ï\ÎU‹.50ÑLY¹‚Þr5l;#œ=ˆ´éÝDn¨•›-b;yš=‡ÚhC¿†Æ1Ë-€b e€úµ³£b£CÀ‰À辪žMÇHÈoªPđiˀ”{;êÝ|ÝfžSÝÑ8ËXx]N˜Ö_Õð)TQҘpþâGä1ÏÕM>fy¹gøsQ¬Ðÿ:¾|GǟkŽŸV/ÅFð^vÐ¥>ؖC RÙt‰ÉI +Šþvg-‘šR•AÔä@T8ËX£qüRÝðyC‹HBl^™ ¼…2.|g¬ƒ·Tà•ÛÏ[»]T´5҈+…ûW–78×êRX|&çŁ_ªæðªË=ƒíL¦ìÎí»‡›éÇ$IÎ1x“Pa`™##“ álóª€å‡oGqr™è›PR‰-†#À‡ðè?wŒŒJz0‰Õopé\&Þ¬ÔÿkÔÁ‚ô_·‰óì J±Ã +m ZgV÷xìd*ÛÝH/(×÷/æïn¯2ח÷}½•û»DºÄíae¼63o\_¢æáÍÔÐFÈTÍW–*`¡B•ª{ tôi/Ê'žRÝ +©†µÄ7©}›‚= ^qëóîPˆT–¢Pqõ4Ù-ȵý2»¯#b¡DSÏÆù¡R‡èsóޏ¹«bźnÛv)?‹ÀÎZ©[ˆ¼¹«’vyÁñ„•|9RgCW>YJ£‰Þ ªg÷u[Ýʅƒòª—´XÚ+wŸAUCG"²îlò…íÓ4 1€Ò1 ¾ª³Úl‰k£ÖOvXë?qXësXýá°냿zØ«þm{e³Ën°ì¬õÖ֜÷üZwö®¶Ñ xÀʉF­”Iú^iB¿—ée´(î<Ãâ†âºó‰09j¾Ã>¦e*B҆ 4NáÌb;׺ÆÊ¢(›Wæ֍Kôñ†XT·…•TTðgvØ{ 7ê&m—¿:¦j3/ØL¦ýªâŸSÅ“{eTqj類Ë&_WR—ã°O™îãUªúºæƒiµÐÞº `wb=–í*nÚÊÛ.8?”c¡ Í,5Tו·÷/R½úF‡wM_ÛLwiÔ¬!*Q÷Fõ¶.$u­©åíBC؞X’Î:£Q‡3È ”›Ø=ut$4ŸæW{›µúÆZ#dTåÌ>¯™Ê-¾®G¿ +¥‰ÖÀ'C“bN6oñ•1*__‘˜=ÐùkPFú +g£xpF d‘ ÏaÍ|Ñ¢I°vU{{׿.kßVóö‰V!׏„Æ”JćPRXÀRx]Ëܺ7£lWS§.7aƒ•ìruðäݨÆU .µx2E×KøG Lŏ­ÙG=ã“,«E¤“ØiUÞ)¨•¤žÚs8øí‹;9¿Vèo G1†0•V/S!`Q\BEÒI$± 깊ô5t/©9Rö YUkM}99=êÂïµq‹Q’Ö±(L˜³z%g%$<ñ# }ãj‰>3¿Üsü©,Ⱦחtá€/âÀQº¯û¡qüÄ®µ.X ]^-l¨`®ÙªëD&Ӎ\tZŽ€aw]î~€hšÔ7%ò\ÂXŠœƒ.MÕVåôñâ“4óP~‹Á/K×ò“(ÝzßÊdM;g”ÍoIfÁ·ƒ†217IAe +ü.ិè¶Ô°PÛª´c=’›\Jq™ºÌJ"Gî2ZŸö‘fCYj?¼8ÖøÅË"¯Ü}&ÐØÚ܄¿c÷¥WàXqeìFšCÛµêQÉ2d· \+Û¼²µI–Ýù rŠ™’К0²_–962ùatn^E°xáQSøv(—¶C§&‡H 3óTM!À¨¤‘SpYÍûë”:í¥cSÔÌÚç“S{§á«Û³•Ù fJ²JR1bZq,ƒÒfEyÊÿUE°C<`åô*:ÐIj·¯ `0MÞ¹å’9(ú¯~Ê´Ú7õ»ámJÜêYŒTÈ"§Ò.0úP9 .Š “ÌÛ«db›c|w˜Ø\Þ¯ Ãñ@6eq¬©ÓGBb¾Š>‘â Ö¯Q=Ÿ À-Iwfl|®!䳫âL²f€'²Mù{…Éž-õíÈ´H‡8¥ðîý×þ8T _5âª9 t…MX)eâASZ³Ÿm…ŽØôhôÜ=P¾žC!³ÿøBýP㤙 ֛@²  Ž?¥þò-£Ù(`Z àJàڱƤçëô\DòˆSo—f7Zdؽ2})æ æO<*ä"ã`dE«všò‰H±Wåvr„흯`'ȏ#˜$y¡@m‹^NÙ EÕgö%¸’lvxåÎçƏ㨮a® ¿lP/¾Äk"äÏßí²1]âˆ* )ÃýÛØÂx¿~6Ã)Ží‘´ÆW~Xæïצñÿ¸Ë²Ð·Ë¶Æ±l¹6fdÓ×_ö¿Ù¯’IŽ$ö•þ@|_Þ#  Cõeþ#iKfIP«»a:/UÎôw w3#™Ø¾? kvmÒì³Ú'?,úYýPFþä‡ó«i¨ÛÇ|[Ù¥áÙR ÍtuKäz3LCt#!ڇ{ÏF Ôí IZöÆ0D?3Ay !`ºhÚêƒ÷Õ:Þ§wìn]49Y œ`GÃór>ZÉMÛoÏZľtcœk²»¹Ð½Êœ…¤wÙMm6ÏBg3×Ì"ë ŽùĒ¶FÇÔãnÅWr E‘¹ã -=Ð +C2‘«‡d­ze_Hã)f°y¼¡quë%ë¥7¬ñÅRFDú==xB2lŠ]â̧M‰ÍÒ9|JËڌ­R^úg +è:` ÷KiýÊJ«%èññ/VZ7»j³};Áµå{À3ñkÕèse!€<¨d¦8WxÝþ–uz ÑR6m•“´k'c 1ŒNñ’kÄ÷ŽÒ¯¸¬¯'J‡QZÐ$®VQˆA9¨² öƒaߔ„@î·æróØai¡ i× +·¬«\ÐpkKhFl‰‘ mZo¼¤¶#yÉsÖ?Äzt9¿‘‹Nm?mí¯lÅý¦ò³{姿épÌ,­T›ld+z•Ê m-UÏ*z×1:ÕÁÞU{&)—¼}›ÀÝ%™³×VFô%u•K O ÅÆ9ÚL.g‚J ç˜C‰µŒL¡@ª[ųÇrôq ”ÕqSº"U4¡­Ñ(íJóñ›&½ +†`’òƒñ¤R‚y&i¶÷«Cwõãã³»HXÍC +ã¤{¿ <¢Ã=%’NéÍ¥C–ð’b]-0>²ŸÐÂå©£±µé6HŠ©Eʪ„ší"‘„òHŽIOÂf‹ô/÷}n/ÛÚéKÿ4EܛÜxïO;_“̦¡~;î+;î“÷‹_ìøbÇ_Ž³¸Í-ì„=ÏöÒíÎX›]Èáں‹êr*ð™Ig&@oáµÏ¹YÎñJ¼A÷ kª±$•»ýËåxkV“>fÚ Ù"Î1ùöøÜnŒn fi|e­k>ðU•i™´†J“’»¥}ç¬J*sOÖÒ(ªžßÁ.iË'í!¶I,!g6ÚÅí˗æ€i‚ºTÚkqê~Jsg‘äqz²ª«c)1•cÖßâª4££  Ê¦žÔ‡³JÁ.A]•³ºb¼B÷˜¦ºñP1rDÂf :ԁg\¶.¢µ¶Î|Dõh—®nœ„vÿr?Æç›öqùïÝömF·}¿ÑË8ÞvüT)IRì2$“5B…ˆ„ŒO +:0î¡Zú UgÑS»£‘"ÀCc#P†…”(™¥K–y»BѲ‘¥»¼9ÕWŽy¥íeÝ,·€Övö +Ž²{\¼úJaô(úZ s7‘ÛÆ··â UpH§ +Ç¢éÓSžÝ(iñÒ£?EÎù^ÁÔ;£ûõËù’â’H¡ª‰75q—fÕù*5iÎLãcfÓ d®.V*³Îz}/L&³ 1W­‚–¿dü—뱺~,×­2ŠjvÀ×t>GØìñbÁÚke?AK݈œš)*qŸQv{`ŒQ°+9’k ,&k$Q:Œ½¬~s{‚Úځ¶ve«õ½sÆÞ:_‡‰ä¥½¸co‡±Y:‡¿?&À–D֍¶}ʍ?ûGBáÆ­1oWøyÉi2ÞZƒý·K­×5•æ +ȜÁV˜8Im8oT@WΛÈçÐZçÀçfë61”Bâ#èd$cÃʝ±«½oN@$Æz‰L¢1~ l»ÎÊÕ§½QC3ówŒ±øUHÞ ²E[v[¸–ÇÕ£â;9«;B¯Ûʕ*a㹞¨NVõ1£ìّ}wáIa(HÒ#* ~@Æ ÁÅ©Ó´a¦þª:T/‡¶BUÉ%¦:L>„)µhÆÀ¨$]'Õûge[Õl‹Ä7ô×½oÕVg—ìŠU3ÜCN†Í¹âœFEÜó.=$µ?‡3‹Á&{ô¬â¯MÔBÖõÝ®>±¨,¡cZ;yâEâ‚e³#e?â؋a_a!م½­XÇ£‚ô)]Ž¤¨2¯*¤.kØïj²8'|ñªt^'¦Òoû‹ègV¨¸?š)IŒ_Ÿ~à§ÚÞËزΟ¯·ÛƒÞn/½ý×ôv»éíã ´'lSæŸê×r‘¯ã&_ëE¾Î‹|­7ùºoòµ_äk½È×K¾†–ƒP]ùºùº.òu]Õë¡Ì¤^1[ä;Oõ:ïêõ._ëU¾Î‹|ÍWýÚþX¾ödbÅjd‹{ndüßÿpº¬þeÛfÖ῞?X›7&æë#“Ï€c΀¿ññ¥Ç5ß-óöù¶C­ŽÇ†/·´;ÊïX]P«s÷sރ·/±ã{¯)eZbח–üEµdÏvÿcüäÐÈ¡¿ÈᯑC¿‘CÿCrÈËDšÅÿ=¥¼Ö¥”Ë„8%ö¾‡uÌ$q#˜e¥¤3e·J¤4Þµ]¿âreœ/ËaŽMn¢Âؚי•/‚Q[pd1ôPb7†‚ØP§@U˜¿Ñ»ô±GÛÀ¦†‚×ãÀs’kêò)SÎ=ø*€©êǒ•¢ž)Ն +‚Ï£ ãÓdÊÅ'ŒÇ©|eÝðíj3²uQl™èÉ~DzD5¿~m'ÍÍëק‰Ž +KåøÐðí4üõ۟£áYÂòëð3ÃáA·â²C·¦æ±È6%.ÅðÂsw=€Öi}ˆx4ލ¡}ÆV––EÇzA{‹Çi»ÊÌç#¶~ðÁ°Œýxðs^Á« ïÚÝ Ylmm¢yŽy^±ó ήüÅöË1íFÏ[é›Z—¼Â† ;w^ŒÒ$zì,®œIïL€ìRýÉR¡ Ý\‹5]¬ªjTуMmރ_yà%þøv¨†Ø¡¥¥YÀ”姘šM […¤#,‡ÊH7£þíïÿÀðwÁ×ß¿ÿû½;%ª†Ãn£?‚q4º‡fÈ!ø«E2µññHÉƄ¨EA1°€î&] +ûùš•pì߂U®eú˜v=›~G(SªœÙ?nH±Ž ¢šâîŸ`.?f;øŠ«D±p2ç+>ë#•@54Ö×a 6—?ø¼¡<øÏ?ïßq¢û™ªRÈ/ââÏ=bï{ƐÒ;g:ž÷ÙÌBH-ÍÜ;ÇÌo˜C—Ø9·QÌ»NƒuA”œ¡(@Ü{à‚øÇ.e؅tZ÷Ìû=ãüvjÙUæÿ˜icäW»~2}©âçì3ƒýÖ½F·/7»+¼O^äÝïrKŸÔs~+Eµ£Ð…SÎïtʒ &» ¥»m\?fö´kæýžÁ®ìXÞï¯>™ÁõB¦M*Àþٌ“È×ó«k†ŽCCćcÜó㞠%*xÛXDQ³¶ðÞáý²H(œ¡îFrϓK‹@«H8nÉ$Vðn®fq×*×3¬ÛÞÄl4t*J‡\79 ÿ‹ÅL¬péèwí!E‹o†»öØZ!yáxiª ö?(è +ٟά2ò˜óÕÇJz‰VÚp6q}-šèәsöq͙aЕ¤Ï=Ëë†*YèºÀ¢°L|Si—É£ýB|Âý•·s‚…á‰è`GuÂóÎK¬ˆògK.ŽYŒ^Çu¨µÅ|½•ÕÏe@óõ„Ží' +9”ìУý“¬$ÞX‹Î–å~ÔVã ±ÙaK–õ‡Œ#©6, Dè:€9uÜT/‚HA“óƦ¢J0T‚Q¶õ8€“¬›¯ñüŠ}PíªCSúålÇil¤Ì=®±-á¨æ×c«tɞëšâ‘'º”Ýý4tR@½÷SÊͲ‘Õ}-Š[öê!䪊ûö®ÎçD‡ÉÙÅÁ^1b1Hqùz,4)êU—t˜㨂ÝyýBñ€*#ÔéÊjWAU&`¡•'îËJš±†äÙ<‚½. d* f A÷ÑØ)ìw×¢ÖÃS’ îÔEŐ½˜¼MÙßŖXꅶRp0^3h4C4àÂRYdŸÓìZ u8x Ü4Õúá“«LÎl Va­ð&-8dm«ôJCçöÖŏ>6#XŒ Ñ'{Úý”ÕsÔð¥:™ÊÆp%é4e}¢·ø÷X]Æl›IÐd•aòÅÚŠÆéþ‘:Q S26ˆH­I4ŠØèÊâcðøÀ%¥…„°É´PP‘ñ²Œ„pÂþV¶(««ƒ…-©òÔG¼SÌÀá0û+ºÎ‰¥`Üñ‚°ÆØ!1Ù̐Ÿ¤DêÞq"F}\њί塇îkƒŒß~‘Ó/rú ’ԋÕÎè†,lh _£»÷ÌKöè[†C]Y=TÀ¥‚隆¸|‹·ÃúÃÖAXêáËüPK }ˆkp)¬Ðä¯ÄpcQ?¶€]YLgPcD‚s,ДCùñýÝuQë,r |‹qkó QÚìæUJ0#½ÖµkÁ¹¦3Krês˜÷"Ãj-1»u,æÂK&dŒXt¥½‘ÉJ˜¬ ¦Só¤ÞNµ?ˆ–÷f¡XäÐ.6‡¿W‹§£Âz‘]HŒ §µKa²‡‰h{&ýf6,Y“g,:‚É ÎóôCg ÊC¤`Y7ð2cáŠtÚò2þ²t¡öïЬT´x±Å#ɐ²þ@:$’i¼Ü¿"'a Õ•n-Åsà2D…qÍÂ¥„(PqÞ ŠXU;䈐,Ë)žÝį 24*Kq\àVî¼Ì4d«Jç8_ËîŒ!tï_D8õüÆ vnÂÀ§³uíôT3ŠeCÚ2báL‡\ž,žÑ,8 S¹ã"ϲ2ì+J85Æ N¤ã,€UrȈ uÂ& +4òÉñ8‰e¾Gb·Î’àʟ¶¦BIZÁdc½µÉpôE懻Ì?/¤V°âè8cGyµ?ä(m\F¶lˆMüì¦_›.ÙJð{È\z„jJ¢eJ}&΍ÖʵÂØoŠ±º©Õ­ëÖR XÒ\Û⊻½Dˆ6¢ »¥ ª¶¨ÆâÀoa§"ºê´åo_¢r’€À_T~Ô!Œq( 4GxZ¿!7ŒLï¶ãmHÿªÊv*îqэ: §JäéjSùÍ°íˆF¬îëGüs}XùPFOS83±¼hQ˜[×-ôXÕ,Y=˜Ð¼&-ۂnÝ)À|[¿PUJ‚~3[ÚKٍ¦“¶§~XÅÔ4Â-¥kªäcàøEÝS‚ò›øþ%«pþc"ÇYd»Íq+ °×PÌЪ8|J2¼:³­K¨Ð–ËÉTpBˆ†ÁÚK<<™h]’ª©l ÙÖr2.õHŒã1¬õ%\È`xGt|ȧs;|ÍL¸3ŸR넨æÐTJ.èézé«LË(X§5蔳€+ +5k~Hm©åXFòuT8I¨ò£û&«‘]åþºÈ]*¶Puκ Ú ÀÀÌ8!ÔÕÅÔûe\)Ýk”úŠ ¿1¶^lÖN8Qe°FE]”hû¿lWI–¹ Ü÷)êò#ŽçñóªËßaD˜?Kꍔ¨äg’b l!iËåNÆ)DÇç•`;Œ0¾À£ÉC .‹‚ˆ½´ÚyÞ;¶4 ¾¹ËLDGæ‹ Y¢«ËûJþ(ïž ‰l“˜ÙtëwÍe3dI1­œŒQ%ˆêpM>Â'ë @™‰;nÀ+OÞeóN¡‚‘~i.a8BõÂ×CMÀ…&&‹)Àc%˦²d0FÀW݇` ~3KÒM1jøJ»AÈe¢Iž—æj¥¹Hõ6;\€éýD%¥*nÇîÁáï” âÚµ;ZŸØ4m;$» ÎÖ*Àêæ¤4žmŸC5Íх)z)Î ::ØÑ$T{*5{áPgÀÝló ïÂÜ$5:c(G™_šÀLþl¤e-D0ø .D˜}ŽÐHB8œûåõ/Í^¡Ã ~8|¶k~_cyjûÏ; +4Êéÿ-Ž„}I›.!5iY¢QIÁ­ GCŒû3§•mêT)ÆÂL)üN’õ¹ÞŽç÷]îåÀhlõ²DB±Š7(`¹¥®ñÇÀÃ\‰L­ÃÕ\aRºg"ùÀRùɒmõ¥g›'í{Ñþ:ÔÞFÒO‘èûôOw %w‘ҘþRH€?4'ÄÈý×rLÿ~AF6gòpný˜êÍô@Fv§Ia ÁŒ*­iÛR&ÿà9þQ=™3j«žóvî\¥î¿€9jiî‡>ÑEÍ`t®¹rã‡öÏÿ}ïIŠ£JèÊ¥öê:[“ýážU®v#£jS„c¡*'8Nøú±¯•{‚Fhˆî³³5úV"å¸ *¢uk}‡èOT +SWú“ÂÇ6f¹Ðañ&ðü{þPÙXKcE(ÝRÀ1K~–ÔžMò»síéSb\(¹Y +“/Íèû¯‡>ŽÌ¤€x°4{,a6ª ï$Ëj‹}wxôÆWd¹Ntç‘ÑðcðkZƒgáç ŸòWǖ˜‰8à!ÚZO”9³ +yÑü]Ьñ C·mÝ+y'àµ8†= už+Ú©gÞÈîo0˜C<7¢¿Ñì’6üK‰ÏbsÒá°²ýɺm ÕBöÄ~(²Çà™m0:KmÒ©B3mçÅdO&F”³œ»ŸÏ«Z7ËJ‘‡ê|¸ÿ€Z¢f“Q6ß6Õ—Ä\ëÁ†À´\'€“¯šoI@ªîD3Ö‰iYUòýð»­'!lÑ 6¨¯74Anñ6ñ(P ðE&Ÿ$‚FF…lü›ÑÕÜç9„5ŠvŸ¼"Úú$q[ÉWsojÿÁVé H?ËÐì¬Qwÿ¼[!`pƒU.À$‰Pã—'G@`ä.Tè’< ²6çìL¥˜££%MÙ!Ujø0Çò·£ +FïfIyw(è'jîRÌõÃ5SS}nTßû¼5éE}}¿9I³æ—£Ö9â$ú'ØÚQaN¶3 @xŠµ±`xÔÜüHהÕ•…#¾õu› +3*2ʙü‰Áj!Aa‰ä€Ê±µÄï9&Àg@øÏ7ŽW˜»ꍻ ˜u×£f»N|YÀµ¼°FϚîÓ+Ä—pΘÐåüÄ3°äU‘È8B<¦aNAÌd¡G܀È0ãón õOçù”-1z8 }!E ütÓ¢Æÿ“¦N²Pnž†(‡5Oÿ¶"A²ÿÖc?  è© ùÄ'Qì,°IÂ(>Vcàƒ8ƒ$)ÀYÇ\ŸwGd¥™é@vR+ë:Ì»KÕÏ8G„zåH§ïóÍÎNq¶Á+ÎÙÞ ûþF@;•ŸéZƒnë&Ë;oBrÎ] _¯Ža~Έ 5±ž$ †ó#s~.k %KdGÄ_Å/L@-Û¼§ +:[ŠaHÛvDµÀr:œÿý'×¼ÜgK°óÜÄkrâ ¯;•)- j¥€¬ÚùXŒëŽ7'f= ž8¥Œvš ¨¸e€ïµ«¾¤K¼Sh.Á3<î×àôO¾Û‹ÖK’¦¡Q¡¼ßnd—(¡€–õVëúÁqÛä;_oȝ¥=¹k‘¯Ä7|#ovå¢ô)Îã,'~Ëiê’º)˜:—íTÁ?/k®%Ñ)7d'f’Œ9DbœðuïªÇuŠ¬5ÁU~YÖ(œýB:ß+2˜ý¥ÎúÒaè q/Rnt¯f`¸ìR²]'ñâ™Br[Eì{#/ðF›¿n]9†­‡«wÝÅXGRžÒ†J®­»ìÂq@~SþmUIèô$øôÆ»à !£®°éë<$mr)ó˜øTëæ7§,T›º,òÚx¶z‚ÑDÕNZƒi¸Ä`nj¹‚)°7¿b¥ /E ì,%i;çÉKº¨I­h÷1 0Ÿ·£÷ ø¯\CÔ°Y»Q晕\'–·êÉ8êÀɵÐÚ`,™ƒŠ"Ê0~CD@ÿ¢X%¶çh˜b™â^-~c?’8Ãut£àCWö«†„‘mó˜± (U«Býý.ZŠEƒc\?‰ÖêKsmE”£‹ª¥F•„½ ”SJÔb«žÑ5»Ý7Á)ÅOŽ&F¼?°®+âª<Œ‚Æ5|ÊS¡ÓA6MBÇ¢»—³óã”ÖÐez–ŸŠp¬wÝO–MS΁)©¿*—#Ì ñá—ìF—ý’`ÎY£NòÉó”iĂ6È÷ÑÎM”!Ì»BŽ~¥YR^½Z>Ý ?¦îÞªJ“DF$U'ᕚ¤é8˜û=ç퓻g+Ú +4 +*aPµÁ»È“¾vžvª§ðF™«;}SLí_•¶ß}Öì™þžåÉçÉ^˜»ïA¥t;¿¤Ô¢XB-HV" P:4  3Mm›žÅ5k>oŽ~bRÊ@øG> þcR 5CæCAvŽ–uNYêG¤ÕãUeèý~Þ!œX'Õ2ì\ü„Añß{Èè†&E}/ÂE¸iß_;s}]‘FÎ_WÀå!Ñ(}ð“¾5Ê3hMÎ( eåôl5ðˆ^ú¬cÀˆ3ÕK¬Pg#{MŒµ§a·O•³G…ïÐ &½ÝÈ¡¸rùÏF&ò%ÇaTË[CõüodúDá÷ ‘ñQH<íBcÝ°Éux 9æ†ùÊþoE¿ÔÈ ®Í*ÑB|ë킰 Ô«@2¢!P&'ZU”k³ OÜøûÆ™íµªؒ&RÛªŸ Èi<¥!ûQD:3×ú—Î-„zßè!Ù›$~<^ÜÍþÁà¢$ú²¹d»4\̚«R±S è¢óÓɗ®‰m›§¢oFq%_(/'¼ä$ªE%(šøìyØ­Ñäþ’ÄᑇÏ£j¨H—ã±[t,Ï}Ââ/sÞ±ž(SYP!/*–À§¸§nËƖœCª»•^ÇPA… +–õÌÙ}ƒCõG`à™&æ/³@'Ä^R¤ԼĮÖJMšß1uZ|>Š'»¦Œ×¦õòq-šzuH\¸ÒD¡ïá7 WœÏ«Z'ßÀTâZ¬óáþ)q§ÉuÚ$1¢Ôo… ô`CÐ#ÈAE.S鱫ì!4R]‘Hí§~ôß½¾¡÷?J-.RS.Þ¨Q dÙ¯@eÕºAŸa±¸“·ñ—Õ*SÌ ¢oJ\Â+5mߣ,ò‰zï¨ù5Ügo¬ú?ûՒd¹ Ãö9E_ §$Šú§+UYd6¹ÿ"@Ù~ݓdªWOx–e‰"AÖò•´Ã<Ú[ýº£‹EeÃiVÕ)(M›dê<:Þíqœ]ŸT>âqðƒ‚2‚Öì ó1bÑ ‡;žªï¸ ¢Ø×yü†ÅÀ”€¨õ._Mÿ€ì€-gØnð9‰õ†¯ý2£ïù²ÂÈç÷7&Ûѵ ÞæµÇOv‹ç?#tâ½@g¹?˜úçÞD)«5=gÀKÞÇÖ:è=C¸W(ùü|ãÄòìâDZ{|ÞÃÇk“ +ƒ*ˆKìP×OÛÕä¬!¬’ˆHv‚]$…XA‚ )O“¾›9*§‰kÐ¥vjÍÍÓD™QoȑŒ ‡¥’ÜVŽ?Òí'Ý`q75Êìx}“çP`xB»Q'‡Tè/LWÊK앥Šhjyäf{[<‡RŽ>‚‹d¤´}CË]=yÝä/ +‘ýË©P÷H†–æq‘+ÞòPºŸõb÷ÞSœö¹F!álcÉäªQ¬çu$MDd&܏9íËÐх¬o®PØIºîáI3 T•}·þïÖÿÛ·þ…ÄÚíW­ùê²oñrä`ðsë‚nõ ÛÞ$¨–Ê]içà Õx•‰¸~ÝnÏáˆ/äÚ8ùámÕÚt¡+®ÐHF'“eSËÁ? yfʐU0¹sIo!‘xñÓé«6 qvøªQÆ æÞ9±kgåýõ%ÄqG°«ßtòM'¿=¬È„ ¹õ-råzÁ¦TŠúžìÅ<ÔdJÚ` öÔ¼1Ïêpú‚($l!Àû˜÷³­cT1ÔÐï±â¢¸!ªÐtÔ·o~¬Ú8 .²:ç‚Œkë½ßÆa´؍;ªkúz­ñڕz¦·š6/ˆÊÐ5Îéªh®áû$^W°T/Lš™)Êä´õ°> Ý=JÒ+/4ríA^ÌhqQ…Ë• +³ÅË@}e6Ë8‡¸™ý²{U;šVÏ ‰¸ŸVÖãiØÓcÀð“¬ÖLs·„é´« ‘ÛdE›™ºY”ðæßsp.¸-òJÔZ’±¢ü7%~ÿ‘ÁIãÁ±bgaC‰]ô~aÛÒÿÝ´uOÜ°tdó¼u‘a°¸Öÿ­{FG¢y‹iä·ûªÜW…"òlèîL*åÍÛۓ}Ov9Ž°M±ŽÐª•×9#ËEPY~S=ƼÓ)ñ$ÎTï'Ób“Xq谓[í @É¢”$T^¬j-IÜÇ%¯UÀgƆªÅ²þüC·PXàBW&²Â©5ɖÑnt\¦Ë™S½\]uY†öU×Yy÷Cð+ÏØå2M ÞFæeʦʖ7ÏY5Ä­qÖ$¿ŸŽ)¸èUã¥H[á{ƒí:G$@<(ìµOëN¿Šq /ŒÜ§ì" ›ì¤Ÿ›,lбÆa¼„H@ƒcðdŒ‹gòV,Ý-K}á;®Ò0LT›bWdzí©ä6iQ ÚϙWkkÇ.ÂÌÁ§.6¦õvš”ÏývzT)®S¨’cJ](ÊEÖ/C‡E\ ÷–£|MS€2W΂6ã) ça©¦t½ýóg̹KtƜ¥¶©Š‹4nŒ¾êÊ‚{~†±õ²¼ÇýKÏÉ/P‚ß8£Ï`Vjˆõ‹­¬¶´Å¸] ìÂ4P®¿’R¹6^gò=¢A*[Šp¬Š˜ãz²õJe—®ÈÃÕR76¦h»{7Þm#½%ˆÎ¬iNÞdtOOÏáiâP¦¾Ÿ°7ì„@èœ|A´‰h³¥IÌâÍ.%¾:ž¨Rp.êR}Šîôtfv;ý¾ÐA‘­ ÐŠ‚ª¶a5¬ˆ2bìûW×, _µóØx²©GTiç¾ØZb«dEheÔMì`7µ± «ÿ¡oÍk<’>„VR¢µ¹PZ»+q¬í.RKw.jr¨ÑCR(sÌîg“dÖEð»cKš¬E»Ö>ö(vÐì€Øœú@kœH™"ô=´—ãâªêv{6˜¶ºXÝÕ`PKen}ö*]Í° ¼½«ýûëÚå÷=¹T|Ù´ètFú+Z!W]”ÎÈö,­(ùm zG«IÍþvÌ?z­-uZ²&é¼°_„Z˜ûU]eq5KµÐZ"Z t4q%©?Q¶Ê V¶´Ø[L¢‘gÝ3U‹ýßtËié5V+ޞšP>´2 Óø–׌qeD¤Ôúuµ"YÀÁ‹îí*ƒÑîgS\°ud<Ï,U»d5ZS&P$Ÿ­·+›fÁ^²¿˜ÑÞ}ê/¢©è/!ã$p\ßüùòώ-Høñ#¢¦ THDÖã –Üzn Ш=þàŽB_¾ÌhÕ ĎËëŒ~ïځQÐß¼1Ž Î?#Jë^ “†ïOtþê m¢GÚhMËà­ûÂ:ö~NÈ(œ÷3J÷NÏî(k‹¯÷ðñÚùm‚´í»}þ¯ÛgC³À‚5.ÄÚ£}rh àÝ[5²ø’Òo#/&½Î(:‘KÎ'Õ+M– Å#ô7Q;Â_ý“&¼·D -»iڎZyü±¯nUH›ïâmn¹ƒ—’âcQ¤Ó!î‘öïè¶y;ÖÝ]˜(´Ï ÅÅeN%äA‘|²`\S§-Œó»Îۛ®·2Hå ïÓep„°I<ñZuHfÆáZê¢-:½ÕJ¾ïtFLþR–X½•þ‚O#éÜsíD[–cÉáä=Ûó€!„^áÁLa¢4¨ŒÓMaLïG³ižÜ%C‰cñž7×ï7 ®à‹Vcy¤„”áê§(§,AK!°¶ØnÁR³žºWJåJ—|øø”룑–BíA2y¦úŒZd.&ýX©ö„µ‘ÅØn@¸kiÂÎZ˜ƒ_4o4|¼ÉúßK/R»+¿blݏfl’oPAÓ{K(®}ïœiÚ©pµ¡Pú6Ý5a©üÐì.˜æ&9y‹Åy*ì%@O½€Þ°²rËÀ·¤ÔÀ·1öLõŽiV¨eŒ‹W•ñõdMlc`fÒ¤cƒµV…7Òç«3üLSAr— ¡¯WçÌx^]#=AC'·½Ø7Ë»DŒCNWêÅ%÷˜J{t+<|xÔ6Oï "ʼnˆOcBPdöìh䶳 æ’2-L¸‚ Q4⊍Ñ,[¬Óì´Áº/‹„”몰JºŒ«vg Gç"½Lñؘxk¦eXy¶jª;—⮫¯ò%=\LãÅ “ñ‹8NæfÁlf`%»øÆDc+ˆ£Æ"£ªó¢ÉÆòÉ#ßÚÐÌj塲z¾§ˆ.»5žàL 7ÆTÑ$:WB@ìà@2£Ü J—4ѳÔRã;…ŸÚ‘ +´¥VðzgH0¥àKÓM/g­šmãÐg̉ 2BˆÃ–\ÑUñâÊÇÞQ˦Ž|îN·Âzñ¦€Áɀþ«¹;¤¬Uŀ '³ ±C`ãè)Í#O°‘Ð\\ø V‡i阪êçܝ¸Å0'o|*ƒWQÑ¡!BŸ…ÿÁ^0Æ* Ý;PÓ!UïЯ.œ‹(–J&&…ÿèn +˜'ì‡of†žeŒbIÕWjA¢¾[ðÕü÷;„ZXŒx!˜ªâàoE·á®õkKìIØ€$ÞKÜAƒ¨×¨¯ç —t Ã`#â¶;´pJ¨å µkwÕDƒ%ó&¾Ç,:³ˆâ\]w¢æ×-Tˆ=×ÍD^»›ÎÔBÚÜqµÂøÉíU‡>24`} U'äa=hüÞ FºgM×ñCå#_û»nŒË©CÉ_ði +®  ƒ?kÿè +<ŽIG +ÕÀÕ묞Q“©9Žžr¼c68%ëÜ¡;Ç —ò!"„‡Ìê#§„Ä03ú_DÉ¥ŒJgÙ"Ä âÙÀ3ðm»KéÂÇMžÅðØX­Ópz(J5jêýœÙÝÜö–‚Çľ·à,60&w—‹ÕÊ¤æpåóç_=?¤¢°žßƼ¿|¡]2ÿhãƒñGûõÍ_#,… ‚¢e˜SÅucJ¿—©õ´„x*²#4ÂìFצ³ˆ™GkN-s’Ùª7–¦` ¾·² ‹Y&Ð<¶ª2Í Hþ vpX†:Hæš:hΫ`sr›V\Î>ˤúž\#ç‚ ^v£eç ïmf5 ï~±6µkF9ÛúšÇüº·Ähª9aŒó&‚IÇ[2l¹@ã ¼óiæÜ¢JVl!Œ¸¡y&ÚZ¦_~hKÓ·äí$O<_Âñv%Œýtŗ‡®Fה@07`Aéä]±º·â£­*W‹—<ù'ÿ~($ "¬nÌytS½K7çU£ú‹ÔëÃ^¬AÉï<5!×lÝJJ …åÓP¦H,>x7-õØLê…õBŽÀcOCÍ»€dd_W)¦Ê_Ñ¢L 8âG‹¿u )G­êPÛ%þ)–ðý‰4ŒºtóёY‘Ès»éÝþº¸lËž¶”ö୑N|îªbF^ÙÏ®[šfÉBtÏω~äl߆ ”±ÇT]€Nð{p8­ë¿EƟá|+¡ú6@Ú fºpx‹—”†¹ßœTÊÔ[*5éø³H®üçlŠä®Š®4}›ˆVÓ1H&ƒ¤u¨ƒÒ³ô”eBšP}®™¹ ÑrvSïa Hv>F¼¦öƒŠ±…ÿ‰rŸËy–ža”¨Q8£jâ­ +ƒŠ  $IíbŒFœÆ9ç Ò _+“Xv¡e ËZTCÕÆ ó„þm'”qª~öµÔtwÄ"å :yÃ+¨:Õäƽ¿Þ[S0막B,ÍB ñ¹aý\_i£م*Ñ s¦EЫëŒû¼ó'‡„éyjݵMH¿÷Áý­0^ ß$±úc9ívõÍ䡳·Vâ6÷SJÏ/›Ÿúƒ 9Ø4ÎðçW8É¢ƒBìpf#Đm9 +MàçRØèŸ TÐ^³Á,­`mŸe[;ݳNsÖìSîª +VY[¬ qžª¢Å~ÆN«4Ö?ò†~q½½ÁŒ‰®±º¾¡Ñû®ÿ%§ä玾|Á°Å ×~z$#ڀÉ÷}ƒŸ¸ê‰Íh,-6€RP.$ùTí·‚Óy³ }Q ð"Ëñ¥]U&hC_ø˜;;ÏñƒÎcƚœõq¸VßÜëÜ}Mx8_w|ñé?4¶—¯FÂÎÍD›ŽŸ¦óQáÄ´]tRu\àÕl®:ŸÅ8!¼Â5úÄà£&Á§i€›,oTÎÝÝ#P8€Zîœ×QÃXÑó‘XÞ¦&~¢N¯„ŽìŸç5½ð?µ‰l’JýÜBâ÷yVÖYí›[+Jŏ-é“á—Ý_”ìMn&T˜˜Ó|rZ5_¸gûál´u±ð¾æ }ÝÈÄ HG­àÐj Uc.ÜYZ ë¼BÊø!Š"õ:=lbo‹p8‡Mƒþ2;hsàé8ßåô lávr0áúpÜ<ÙÁ&£ãMjÓ¸$ñðÝ&U‡ã¼c>§pD‰Y®B]‚‹ä½ÐH‡ÉQSwÀ¼ú™/&éꮉ0ôgÔC$*/¿S㐃{ž¶‘b†$Ì­®BÑÆ á 1Hᚐ‡Ûß÷Ç/cõÿT>Ճq³6š_"¹‹ÖÔ`Äý=ÌJBԜÿ-òÌè+]yÊsAèæ×oÓeV‚•EqÎ>öÆ7ŒFÏëff|~‹z aùÐi^5+êߎ7ÒÛD´&§äA\åŒ2{ª“Ôe:[gtÔ/?s­?ë2÷ð®mt,FÏaD´¡ævZ†Án®·.®§Iá++x띤Þ{Ú¯Uâ¤ds²Xä\+G²!ƒ8DäƒÀ%„í 3ù‰’ ;Öþ:ôÍz'‡ÑýšL|À÷y)ÚÏoqh¾N§F¶² ©¨€´ç2}¾Á<‚wد¢{Ÿ:×÷J1D,p\b²¦ +k!ï4—8ã%£³PÑñË +x>w½ijßk8’øú&¬Æû=ÌmÓR¨ç°ÙþÛH¹0Fµ=!lö>•z(ÓÎJ9[ß»Þ>‹áÀ(v£ ¼ƒ°h÷–´›übòÃèüeøʾ>-8í%‰#‰ƒ†™µ&@˜Çœ0Ñ@{óHˆN'y^óð’͉2Ûiªl6N©>Ûí:µ‰¸`땬ü+᯵… âyæ¡sq"IŸDŽ’UË\Îú5htic&™†ôè,æ”ÇAV[" ºšåCG±{ÐS»Ž\ôðœ> †P‹Ô®ÅÏovÅ4ý0åýŒ[BýmT8½tBlm¹ÉÉÖ֘ŽÂº /t«ÅwòÌb¯NÔßðG]A‡¥¥T“¦MŸß•NÝ9›«Ú|# ‚ìª úÖ9útÉQ߇Nx4œTÝÂe±’@jïz’ÏþýëÎ)¼›í’üå0j‰ˆª7’“mvI.ìî¹»åL§Mݼ·åfwÎÃFÿ#»Jr%ÙmàÞ§¨ ´!‰ÔÀó|0àçï¿0#‚ʬî¿éN¾ÊâCpŽLH `‰ÚüÆ¥Ùøœèfv½s_¬ú ª3*ց€F¢§î]4-ì3>G>ˆeZóÞ®l‘P#Üú9_ÑèQªB1fhõ¸"„c–½rî¬) +$4 ËÙ2h7ÞJ¤´¢XBŒ‹Öpæ±w«‡2¨ä;FPK¶5v¥À85C/ì!Œrc +¯x‹‚âJLÁµ+׫¸¥BwYŽ~úQ™¢?Î*ZL!)g´¨œb=ª™Ü"¡ot;[º~pܧ桻nt@£KP¡¥+k™Aï¿oD—³d' 5Ro†;v@C!‰´¶XCè7ÅW§Q© :-x!à& ï\’mElŽqw2P§èª,'7Ø£ÎÉÓ¨)µ¯#¯=È0Æ)O¤¡ÄP<¿Ö(9KÿOú&íÚ6Ř äyz‘X‹Z ‘_´â2Ÿà®YãOçÔVš”o­—¾è,Y æãõڊ*?|v»4ta³²A”}¹•×š¢£sŒ-¥ïëFZ½9¾~å²á ,³^ ³Åá:$Æ,6q»tѺÚûÑLNWŠêâÈE‰M\Ç^Ín, ŽCRlÆMÙ\Ãuj¥´¾þQ¯<ÆL6)4”‹“¬66]£<©IL4 ¬Ø¬ ±BZb;³¢’1cÆÆmhB„¤ñŽ‘¤Û“ m]¯+Fwÿúu-þjáÂJ&-¤ùQ!†FÍ$+Zh(É9®îYÂÃ-Š•  a)‹Ôû•2ƒUlRűŠz×Wôp@ÅP!T/Z½vØ5¼Á8+k­š)j7ÔºEM0¤5xxŠíQQ¯ÝëQ‰Õ‚Mj‡ƒëNhÀ8÷'ž!¾’º†b 1 ¹­M xìGnA²IFâtò”ô{ˆ‘£™0ÐL ŸG!…ßPõïÂ`"÷ý±ˆ,z¦ô(J· ó+ÒÆ‘\{)A¸@)®倶tšeÉL”Ø9½ãm°®Äx©ðˁ۾Êà¶Ù½&>Ïùþ´|_M ˆ_—4h<–Æm²áҐþÑ¿Lð°~C#·³ÿCØ)©‡–¤Wýðfuö#©ã£ñ¯X<Þ®ÒéE·r£…ÓÇQ¸QyIɲ­Ê•Ôƒ³äs¤ió;U2XƒÒdeh†øÙÕP(§"ÕY¨¯Gœõ µLŸV7oRì³²Uÿoû¿'SSCSÅÍÃStŽ˜®0Й“‰fÌ–Aß쀅ñ‘.}R*¿Û‘*–Š:i²\k–hcé –cp6¯N…Â!ÿØ +éªduÍy<~CK=Ô(Şæi÷ý¥Î¸Yƒú›"¦E2³OùÇç`TVç=5¥@¿%ùUË¡jUÔt/ïß!žGv¾<ï[ԏõ±Ù0ݽ¬‹s¬„q?(ôîʁûÂúGІC«Å"Ô}ν1 + –P—¨ôÌýº?œÜ ÓPæ*à=Â.‹Í/hpûç6pŸþ¹8ŸˆÀ K-Þ éÑùg7˜'-ñ»ßëÀì1ߖ?ÿö¤°ÿ|Aã<?—ƒ¹s?{&ý ÀVLÈyC‰Ý0ÏnqÙNS’{jðÆ:5«ÌM# 0ÈkPŒµ9¨“ËtÜy–g*ÝȤ¿{EÔ«‚N6ƒkÀ¿“d”ºß#o|ùqÜ;çz®O¢QÛ½ÙûNK +°Ð] 2À5TC+'·J×92uõ“©Sgb ?,¢"ä?ýF(^zà=KÍ45¤7¨Òñ·(H«kƒá„+sÈA!rZCžAômS°±†æ4¾Á©ÉƒøØØ fÖê‡@³)Ђ€ßàš´©ü¬ËúÎYÆgr=*`àF—*Ÿ7‚$ÉLÜI+É0T[“ªáK¸´áæc‚cÖF‚¿DœºvšGÎGF“Ž™þﵜt‚?ÿ£3Eú톫lî@; ~ni¿ë^º¦fü[Ç,Ãʘúè7Mi·-óˆÀ›ÍšÌC<3)(ä%%G¬ß€$Ú÷ “wÛãî”ô_DaڕÍÉî„èEòî4‹Àß]‘$1¾ŽIqBÄ®.“`xÛ§¯x><¡®X"̂Þ9™2S:L9_Ži¾†€§|Á ++ü%ûS‘m¿ï„Õbh.×åì·bki4N=…(‡@ÌpºO~à׆h÷ݨà^ȤUQþKÕݸ(A¨½>z¸ ¨’[Ÿ[¿¿þР˱‚P/…²Ï$ n[Ž«®”ödÓËàÂ'$tíâä`Ö¸„$&rÓ²[¯€@0Û~ÛÔ}0°^œ´©2%ƒt•†&­­bŒ7€2Ӎ€z$ë)×»tRÒnšy÷Wh™”–žá˜ë;ìùQ§”û%˜rÚ0ª¶ÈàŒ:Œm܈ÄAã`Ѳcdq¯@s´oˆE· {Ž¹ž~][ +\'¹6bÚæÿ£9½º¹<³OÜÉHÎ#þ$Ê5ó[gé֙»ýÙXErÛâ£kõiº¢Ÿ¡—Ý5ßoÜ(¦+nš”«´òš”Û A±ò­‹éEV±µ`Éc +u¹´”°ƒðRGú¤âŸKÍ1Ûç %9Kë)/4è4IÛ6E}Ðñ6êÌ.yt>ßçù?ûՒdɍÃö>…Oà(‰”ÎS1^Øß1@½_Õ :zÑ]‰—JýHà·úZ‹44"«Äç˅ÃüA (úý¸tÀțØiHvñµ?7z&«±qRßQ’3îВjN5öçü¸ãZûAÍ}ÌÌ?m ¯ DÅȟÇH{î¼ëIÁdÌÅ»“E<E=ÎP³à·Zd_¶\o7žz‘Ûú4l>LÆhÐy-~MÏvÖ,e»o°K§Ûsv‹F磾äœg ÑÈ!Û.èµêÂQ2OŽ<ø«]~ˆ™H Šçéáe䧌 Š5qF PŸØ•­û̀HŒô +¡˜¯ÿUº¤\ª¿C)uÓb§œ9ˆ´r¶ +!ò$ð(¾9J¶6q„Ÿº–ªîq£ž&Î-¥µVì_Óâ{®ŸTÒ9Ô´¶¥Ë¹€FÌÅTdÈHÐúLºHÇI{S²G…ð lGg7"~Ëìá7`j͌«ØÓ«&5¼ìA--t¢(Õ'G¿÷”êžÙžÑ±Òì{žðù‹gˆÇŸÀ~:±e‰ažjpñ—Èo#NÛ/3\¬5ôÅýed´É Fªu`å‘ïèÈ“C',p²ÄsSÂ_<·}G<Ú×;Ö¦ÞÔÅ7Fu^Ûà1_2ö ±Ù=“MÖ¹ ŤWSëO²h›¦áˆd­9ʅ٢b†,Ú¢ÌHFï÷Yl…2W£¿AÞÎØÇ:Ì [01aª6$țô0ȍ Ö MmNÎÃ= ù«ëYýUœ‚än8ˆn<¶Eul†\®0èÚ85&Ô3E’Þ7ð³P$^%÷–Ñ^‹3Z€‡ã—yð¼¸7¡Æ7ì\‚\Ë]46p}hfüÞ¢l2»ÇFVxSZñAé-ÎoÍû­y¿¼æíœ+öϚãÑzZ¹ÍDþ†ÐL´ÆÕ&Û:0ã}nj,9ÛJ†>¯ž÷\mJºÚã1 F!E–© :·R›ýçxcÏbZ(KÍÙO»‡È«¥œý.úßEÿ‹ýɟa*¾=>Cêå6yo¶^Ù¼ Fál*.sw;o§2m&¢fÌúiêJ7«3Ü.RbÍÇK+Ó۔¥Í‘V° _ &’oF`5^„'ˆv4ðaÔ31Ü?a³ùqÕ̇ސ‹Óh—“‘˜Óu¤½`»šó ¾˜È|N'©gkí¾QÀáó.–ãûÁPó"¹®Øat$t³þÞʁ>M~³ýÚO\vÌ¢ÑϾ_â‹ð‚†á‡Ó9ÃؔQc©´Ž“žlòBŒá cÀéë9/R鄽¼ÝñÎk,ªW¼¼ùónü3›)ç-VÐÅéƒÛRØbþ€‘€&q‹7¼DF§oáéã 9\×I+dӊ,ÄÂ÷ŒkkîÍÄ%Ùýh#³ÁËAìN˜aïU¶ºˆ­Weãù»2ˆW=6GšUqÁ]cáê*Tk¾ ÝCc‰1 +q)c7lÊóÒÉLW Æй¦/åÀ’i[Ý5¶I²=4¾ÕŸÉúûå7º¡p%ÝÐfÛfFuÅ\çQlÍ:¿•Æ.MÔE-ÐØyy<÷3ù²}ƒ,DfA-Þ·ù'˜R¦A®ddnÖÙýÒ6U,.@&¹Ú¦ +nVD;¡\E!y•u€—TiíýTĽFiÝÒá¯ØFg’×yx=lu*çÐ÷„EøâXöG!cárJ¦»š`.¤ w²ŒúR–JSã¦2ûŽÈŠ´ ¯QPä€/Øô61îŠÕɔÌ6ðÿÚ£žuÊß°› +—ª¢nòªn{¦3Û¹ÜÿË/EÔÉ`û¥̺ôðÝàµ?WîóèÐ#gþ€#Óí¦_²Á´ +K þ€R8…ªÿh'Ã(‡ëG[‡mÅ;ˆÀŽ™ŸSˆ-Ísóz¤u»5I1ä!KðºgвÁª(ð¥Ç»€Ý(³gb©µ¶’œ>nƒ+àOì ÀŽù/Ó?Þ +›Ó¾(d{ =€&´å¯°S¬—1ENÃÐPÙz6ÙcØõŸAUŸ¬ågS¡Fþ& ºˆ ‘ÕsÈ8Ï$÷\j£Jr#HÕ<|ìà_+ûŒfƲ'CãõÔ±Õé‚;i ‚d ß~ŒTÀö¥Éä¯^ϐžÉ2š’öÆʒ›0!È!.w°e¡)Ö¨’ô”Œ›àI}ÙóÝq”?•@bXEÈgG]ÇÞh4\²Cž¼ÜË¢çéjqXí¥€Yæ5svÿ^ª 0AUød˜Wˆ%Š—½´Ë —¤ +i›/oQ|Ûä«iڍ*! ëšN ¿ò§W3#ÏAÐû)@kïµ+áû šiÜÑÇǪ“Ó%±Ã}{¡_) ª”ѐºÞ .“Ùêxڪ̍ QÜÞ×ÕöºÚÈGû֟Þ ÓØáËÃü`J’FÍå!»è](˜eÖÏ,ÀžsBh &¹e0{@VÃLIÝW!$5"–„”ÉÿO¥ÆE% ¶s£Ÿº .I]ód3ø©E[ðïË/ν¦íKۉmubðæÅ_\¢gž#rÉ/3\¬5ôÅýe¤i“NŒ¶ØpÌÄý.ÁÞ*Í7›8]0mÐsOÂøàîúŽxž*ÿyî¯w…ÙËí$ºßJó+(͈½T¦ˆÑ·»“ÁìĦ29|îK]ùg>x _Œ'‘Dé¹»©M +Î`´* ;³kºcàTgM5]õL Ý÷Mg=˚ÃRKòÈcç¨[HÒ~x§hd ôZõjë"Þ±Ûm_šØjΆÒO¿­Â8M Ȑ^Q§>BùồL¾Ú&Ðé0n?C¾x­go¶ +Z mõ4ëvi\Ék‘¶oEóMmâ؆Ž¾*% îq£ š\Á*ö¯iñõ‘ì>@ àŽå°ó»V<ÈkR¢ï7xÔ¯’—öVÓFÆ:Ç*%ë½#=tÉ +j|˜×¸ "™“±ƒ•ÊêU‡4¨€¨ 4PEi“‘ôH&:EœcB$ëñ.A‚㤬8¾Û› Ï ˜»˜ u $—E™©†u£«ó[Æ Ö8?Ø [\¾šl>¶Žu)ÛHçë;n.%='ÿÞR}’Ug +G®øCü&¹¼x›d¶P°ª°žIŠöJ%›xä½ ’XIÎZdž‡N}EkËq ¹{èt0¼SßПŠ„3J ãºSfÈê,Fvµþ~î@£¥W*S²¾–NiN`mhà^x7lȊv€-Ï»ê™g™ðÇ«húˆES¶è%ƒ™~¹˜ ð`œÁâ_‡ +FŠÎ-Â]xÏL\™"‡Š=³ŒMŠÝ 9V©s5ìÀ<¸I¨h鞞‡Àn¨ˆ~“ûžþ˜ØBWß(U5ëÓ?FV7•œdüP4šŸ^f˜ÿ½¥ ø‡Ê¯Ögβ—c&"OdÍ}¼®3Ç.ÎÕz¾Z‹Ý1õÏ´^úâ)B=\”·”2µHÐ>ävLŽÅ'l®ùH©²vÇ À™ù£c&E?x—š #*¥ +Îí ZJ⨟\ã2aò­Ñ­Gz¨0U Á|Q!¸þ🩱Wú.®QÑÖñAŠÔ8l¿2¶Ï9)ù^Íp:OËbU_¢«p…Íó@-OW3ï)@±ÉœdL%€IrýÝí?»¿c<‹tƒ´ €‘꟏†·ÜR…ÜܜNà.ºÙÓºc7fnà¶dš)Š}_Ä¥.åÔom(Ú©Þh!Ú“GG:Ýs:9—†n7ÇC)È'ø ™#Wc€&e .ÏG££ÀoŒýI„¿–„Ø@y¸¾¡Lä>OÑòBW’äQÖP*¬•J†Ô3—neÂ50¥ˆæcVÁõx¨lFÛ_ ‚íýâþú¹’-Ú­Oܹv‘Ñ£Æ{D§ìhvíò'{¶S‘_¦Þ’@ZÌ~ÊÁÑj OÃø.×zeão—dÕ|ȶ¾"¿Ï2(VÕÂ8ÿßô;¯f™= p ÔÆè½è@~%ãç]ÀÔ?1I·4û´·Q+¢÷½GK‚µhµB% =óXØj6üψû\7ˆu5…ôB¦_…üœÙ›õÄjŸQ¯\MÁ™Ð`'‰åùeb7ǂ%p΄<Ï·n „arUWTŒýXfÁé\­N4ò|+åE¿HáUõ»úcÜñjzȑáÏ÷ „]``¡+X0AãÉŒ’Q¾£Hg2€ªfŠqc¥šU˜äÕ?|Mìj•zY½גß,KWÖíÈ´¬Õ8“ÏÎ3ÊR“?iJÍx3Ó/.¯|µj0S jƒÖU{á߄<â›ä8oé§sµcJ@íñ«ÁYµ'³Ò7iÝÀ^=âÌ;є €Ý ¦[ª±Fk”Ë­õöÌãë塨­³ýHÛ4Ñö˕Â~½œâ£~èS?5GRKEâ&âKnP§}tːl¸Â;— É)¡»Ú XJ$! +ëšû‘Y$ø1ŽÔß9G¾à +L¥¡7wÅD‹ÅÃ&AAù¡WÒ5ñôTG‡\Jâ˜Ú*ý=œçÅöÁˆGއ ég*oZ‡‡ Òb&¸YªÒ&’Ä ɘI²YGã’Âq$뽅‚)‰a·O¹}~½=Æ]ad 9Ý9·õ˜¹͈rÊ*~È4§ßj…ØxêgêèÐ5§”¨×¢6A®?K:Ó#Z{9ïtmܠꭁsbËþ{€\Aê¶ù»ÂVï×cIÉpû4E‹ãÄúµ•ØoIhֈbÿÉj+KqÕy‹Okz¾Ql¸øÐÙ.ñBù‘⌠‡ w y.gCø/ V%åÌLür“hÙB›Ú+]¤(ð™ëÖÆ1Ð3Š©­¥ÌŽIRÄ/ràùäëT$Øâ ¬ªÑHì…gYÞ±;Dûq™Ò=—è‰M²©…`Š€*k˜„ë³dB“¯ö&³âÏ ÎÉèáL”\‡àLjÿ º‹^h7¤ŠqÜýPbìÛ'Ü×)g¸ãòŽiPÑÞ:ël† ãRf1ó8ºw|Ç/ ‡Æé×;m0ýÓ¿/×# ñÏd² Ù9Éo4µ¥&’ØgÎ6Ÿ¨ÍÆCŒR¬jf( î˜hÔ”úç‡V/]€™œäû‘:YK‚¹»ó†h™çl©% Iqaò*”cßQyÝ U›,Dù&´Coþ}°h‚•ëE±.Lnüð¨sB +uv·j ~ ³&ö¥æ£Æ÷÷¨@&'GÀôŸV$³@©Ž8³ÊÝøù8ÅC5'o~TÐñ?Z“xr!$-4ǞrJªôQ´›Vˆ3.M±«Ø©2ÍÝcŸr/úEžÖúþåêªw¼¥Z3¥îŽºKßêêê­‘ÍÁŸÇf½Ïƒ/{ΐE’ñŕóö÷ǖiªR×-CŸ`¾þVãsê¯4 uÊР¸º+š0æÒç0W!ëG·>‡ÄùD*ö[Úܸ_ª»o6’l¡'5¹{ûO \~ÂEBK O‘ººÊ󑐨VŸWVL÷WÍáp×kh¹ñz¥mÂk$(ÍñºL‰úH“C·ÿû_ŸOýÐ,r0/¬›wÇ+îžÛt‹S¬ž.y½c¨Ë–Ñó-ã1ç¥ç[‘?ì…XPCa=^@óŠº(„±Õ¦„¹^Mp³/2— —ún5̕+ùín¨5–X™r¦2#1{™¯ÅÞ¾TÅ;£9 +,fÒ{‚{&fOpñ¤1IÓª•Lí3o®šº %5+V]×xS¥ îW€9ã2…{´AH¸‰ÓRœ²Úï´Ù |Uv’±?ñtÄ/¹XwpAâiñ7ŀôGz<ØuÎzêÈؐ¦§vPË@gSKÖ38ûA<ü íEÇã\ðÆÇÙMÇF+ +ua𾛵¶»Ûk¡ ¶ôIw@Ú ¾É™Ÿg^ãÿìW;ŽG Ì}ŠwÁMö?:Ò +V¬ûfU±çÍî³@Éîԛžþ°Éb•@#!9­*b±„6CmNwÖ4<vÄrÜÛL¥žcäĀN …"ë”ÎE·µ.ÊtÈì¸|œ¶Gv\MB@µ^y¨^NùÒ4eŠË% +/·×:%6nwóKe‹Ã6ÏI-‹S'[áÅI›wŠ`u»På±4Tx Ù6ª;™3±HªýXsó( L ѺŽYÃuiEˆ\˜ê¤Ê ö~tHÒE;bž½8òK³h&—=ðuv-Ý?M;£ósÅ­Æ[+g‡Häؖ;Set}‚d¢Ì.Þ3®ÚYÜÂruh3WþCQ·ØÒ[ípÞܓ† +ûÖÛ" 6©Cè<·:HPÕtçMŠT¢vLRЕ+ƒì¤-ÈUT)'š51ZRp¹6ÐëłO~|ѱF$.Rr6ìí&%±WJI5ìâ\µ +Œ\U<¦ÎÜ-E„–è±bŒ?ĄXP²´-QbŠ¾ô˜SsJK.S éÐDO—¸É +NI«#5Mw{z +êô'$24}YlD]cã@œŸyoêÝe"¤ÑØwaÉڑTȗ~Ä\ÒpaOEÖ 6uÕ/z‰¹ûJ áA&ïGj$ã’ðT^ Ëf[S¨6Eߒú[;œ’hZXº®S× ¥ +XrB²ß'sQW`”¯U¢Ü$;\°Tì4u$Ÿwþý@§Dca¸«h^Md4YkR(u‘Ÿ¼ Z]Éꌈ¬ÔТ1%5ºôFR}-H="áglcè ݱ,6]-ãM¶-TÄK-¡u +]¶„£a¸@ÙmÊ0‘²Û^’.û ßûË­>C Ÿï’iI™Ô[C—¨nºP²Pͨ»7½œ¢W­?’2úÐ"]ü皥1Õzj¶—£¦%Ÿ$°h±éåÛ:Q³dPOá]Mlلtj} $r귗î9-ÈIêyËA¥>·-×4%¦Ç©¦¸ùt2s±mÍB%ûýŒ w—FnSEýrS‘5¥éÈ +Ð;zÒ×½A õ!‘ÃzZ£²ÒŠ$±gY»« ²âs,j­n¸‡N֊d±ïc¢¤‘‹2>­pÿ&wfjÈ6§¸·$Nµz{ žREZOésš·fjÛʉ®b̔XE¡˜U²ƒªÎÇ¡9þ[ÒE©:.s¢6Ö ™z~â$÷øRM‚j2Q^””‹)Cš–V¥uJjù¶3+Éj,ÖB–~ 9Ád¨Y¾B¶Tµ ÒÀVO›zVòmBƒˆñõ!F†,I5͌(p¨‘ByûbcnÉ>“Û² bÚÊyó#|Ñ菦ÕV#'.îô6ïˆôµgC¨S†Ë ~ƒžž]¤ +;ÍFþ¶•×¬T¬Ê̂ö)ÎvàjíV´ (Y¯p¨®ù&‡¡0°Ö†’žG™à±(—»ÂHljq +i2jñA[àˆ¿),(ìGϔâëùò28pã íôÃÃ5¿{§W£Ù1®9²iCÙɳv>7ª¦lŅ.oė 8Fö9ÕfÀõĆº”T;,Ešo9·Í»^-E3ºÚ){ao7 rˆ`0©ÁKì*è™ÞTâä2¯ì™õÜ!É:ÓÎï¼Lg:®çdHÉRÏJ¨%Å´Kqýáx»ŸÍ£èÄþSíÍýyf<؉UL;¡JTrT§vÊߍWZ§â2ëÕ,;® +ÍüæÈ ÉH4`pwjÂu•AŽ“QGl©<$L%kIäpªhôõš‹#‚zFœ=þ EÌkãÈÓůK^oYH-UÃãtì¡s[28Ä:þ.×I``·éS©E!¹¶Ã4 ícçù… úŠ‚@;m"Éà/„ûc¾—hh_þû£º°‚ñýþùK,ú#>züøú÷‡9F ¾ãwwsp? “Z{餷֨ÄòNX£5ŸU3Q[ô_’Ïc18H¯ÊúB⏨õ,º&ŸÆ„jåÌ 2²³úU2ž! Rx +¹8Dûq¾HÒJ\£ž±Ið±PeCjlB>Ä ]h¥ZjHÌ7\gävÌ[PÍ=ZR¨ÐZs^=3Çæyeƒ/*ùϕ PšS– NRI¹;UûÖ´ëÊõ9`dÓ‰`|„#Ñ~eӌ“›Øa‘ó‚Ôúú…ZÅìɉÒrTDevð{Ò¾I|’ñ¡—c˝eï'0&GBeÁMdSJñí×ÛØ`9I¦}’ÕPð1êûAF™¹Ÿn8Çé¾JDäغ1ˆÉo͑@º»öóN7ÓËôr°‹Aõ—-úÂˆwR$bÐ!e‡ÀYHW¥%Rüã®iþÅÍ얆T[ëÎô/*¿ :߶`²ž¾†¯'³€œiÔߟTU‰$çƼÞ*Œd^ÜCüš°ƒÁ™mÆü%.çF°™…Ûjj°‡„}ÜáRƺ“Qœ6Ԙ°fùÌb¥0†æ° ŸuYHÂp ¼ g±}„*› ªt‚S,'¸|@Ecv (¹8xYê^óÜV}.Wžß^·"â!ˆñí/¾}õ¥‡ö0ðí.³öžo‹tXã*½SAF ºP:ùÎY 7ÙˆVüöôâæ6p{ß6¹@'ÇL9?}ÂÖüqÜí E2–:> §T…> endobj 100 0 obj <>stream +8;Z]"9le,o%#*AHQU>kmSqioXpIWZJFfKsd0H^[3RBbLoN$gEHq2la0<9FJUE)5W, ++qM+f&[-ouPU^C"P>#AdqR@t\$S]:8Y7\Pdi1iJRb/[$8LJpb$7lNhad#>n5c>X[. +Mn(\sG4lLJ5LQ)/hh?;O@m1b=*:4u'3B:oZ?\>nWg,h"/ij/tFIj=igBAL1"1b.?b +O1('G)9iN%T9a],N26GZNClZoO"=77S;<"Jb=TH4OgUa]/!Z"N$0.4R`R`qTq5g(` +9VbG7a!ISQY>6*0Gd!uNbii3_Fb]J7P".K'Wr&/Nn45SPV5!q._BXE5N+tO3V+(N8 +0=ZCo*5Nk.UcM-ckP9BL9IcG,LqJf.roM^)A[4SgrVYDPg.*>+CBbq,4o4KZNHH7g +2X=308`:BoXg:b5oEiegqi,&p>rQTONV/Fj\f$P&O\djt&ak5$H`Q4T4pq3b+*I6= +huBoIbokI$UOf?;+ endstream endobj 65 0 obj <>stream +H‰|Wˎ$7¼×WäTŽ$’z\=ö´X,|ð4l/°möü?àˆ ²ºzºw/Ý’Râ3H~ù××ãË?¿–ㇿ·/_*ÇË·£Ç·—?n_þø۷ۘótï‡y=k´ã^}£Û1;ð<þúåöëÍ­ž1âÿúóVŽXq¶yLœ›ë¸oˆíŸ?°]ðz9þ{ûSÿ‰¬ÚifõðÒÎáŎ—ßuð÷Û½œ¥¬ƒûAP;A5óxáA‚6±ù +î>k¥”§u}jç DÄ݂»ÑÑr!¯Î _êlç·UÆÁ¿•»}âlƒÒC‹œgùÕÁÚòY¥Å¹†Îͅ;, õÊ»¥æ’<¥ãsëg_~P¢p°vÁ1ÖÁ›ñ…ͳB, +W…Ìx1¥ÌÝ^üh©-јM÷¬ Ñì,>òØ­“’B„)o¤@¸áåÖ𪠻áÑÑz"I` zsIëKŠ-w*æ%ae4ÀJ\5‡?†ìÍG—¡ú yË>Hg¤O–Ìsû¤Y#6îÂ2]¨Ä’S甭ˎ‰sÒ¦Õå¾Q,äRk–"»œTƒÁFkðêÉßCޙˆ¿—ôÅÇ͎ + X`¥ A1ðÒm…GఆÅàÞDÀОXBØ@àv¶ 6€Ý,¸&ö ª# +vÓACªM¼\Kî!°5*B2 Ïä0bðµƒP¾b88yâӑý4ȍ†3rfJ¾ “ÿý.A¶¯ØêçZøâ-A±ˆ¿ø…#; ãŠx„ýaºÖ«)Þè¥6O˜e"žÈÛ1 +±W{@ȵj}Û7ÙÞï‚#,¡ ‰…iK t/àêyû´I_))—² ̎;(­Ò—`¨ Kôž—…ëxœÃòº2ŒûÁÛÛBtF,`SÜñvæ6]ÞøºRûd$ÊîS0æVuxÓB×®åeú æ·½QѼ’˜1íg£ÕðP5ë¤QšÃ8â$p‹h Ûv$¤ÑQæŒñÞÅ{]'á=Ä\¯`<…˜¨ëÀ]UÇ«tL6EþsS`‚!Mªä+JE¹Çc5 (c¹»ð@b~ j­O·ÃŒe|ÀËÛÏÿ|o+˜hT䊭Æ"2ŸmÛC¦Wy4ßã{c.6½ðîwí*S¯ ÖÚ㓅u®"»U¤yhOÇßÃò™"FÊBÉè {rÀsO烆n’DåV_Æfô2³©‹:ëH=“5fÖj·¤›™…ª'à°Êe@”©»g0º³øݯ°‚Êh ÇÅ*Ù#‰·¢¯DaœJâBñš¤]& ¦“X‰:‹(›ž…ª¸‰%1YyÁˆÅHwgÆÌìWEÿ„++ÉÀ£C Mn‡ìº•EŒ%[KEŠ¢0@cC Ö¤"ݸB$Ž]£œd9Ø ó?ôâjt‰FŠ- šý)‰çئ†’€ #P[WÜw2e¨* + OׄΏ}WYöpÔ n4㔁¢œ>Â×»ƒÎ.Ë(b¨\ˆ £'zöƒ°*»Ì¸înƒX½1EI8|K¾tºº%Ÿ‚‘‡'•ôD5Ï6ÙFX©6ûlvTì¶,# åÉQ3á¶béȏåJ*6Ú ÒükMAÑ%:Š•§±ÀžYÉ-ï±° nÙ`ŒJׇ˜O.»¹é !¦ÐdÌøUޞ 1c†h={(W—uIÌêÒ5:ݥɗ‰Âœ rjɐ^x•>ðCtM¦hxe¶²Ýdú¶¬00#Ç5ä 8Œ…xÃÕ0„õµÍŽ•ü¿J͖BÉ=¦e#Ï6•4ëC¼À|ï9Šó"Xc© RÐÃ\9~.9H˜M^n5öൠCM•ÏØUê3‹%=N".:ÖBÈhW¡gHßÐîì–â723 +îph3zy¨èCã:eDœóõ8”r‡“‚Úª£i/ ž¦wøz!õ™µiPsŽŠ +×I¦D’±7GÄ8GÌÝ|Sl'çj—Í4Pߍ=Ȉ}kދ<‰œòø*–Ø*ÅM_Šœp-·›grŠIœ’p‚cî3¬ã&Yå:^«2Ÿ‰Õ¦žæíÉcX`A(Ĩ´X œXAR ïÉØ{HŒY –Q—Á¶’J[N¸]õ©…úß`/Ã9U!+㲊â4÷±¹˜µYú> è8²nÞ³p~Ћ9.Ü\¤¸{ +höÉ%K:2Ú3\«åK9ƒ¦jlו@R­Q“³ÕÊsÄõÝäü­cÁ´wHsø$m19R ÚŽ<·t]Ƀœ_™ðý x›û  Dojýž~"Õ,VTø'X‚BÐ| k{ƒ¸Q’Œ¥¡„¥¤Uöø=ÖÕL^ª´Cä:íÄÚ57CY¿÷ü4Çbù€·XUÚt°è±^éBµ»Ðøz0›(º1I¶XgÉ-ž1Ôqè¯_pæÍåè␌­îÃÐç©_Ü!Ù9 A´µ­ ÒYÌYÁ× Ò¡eª©º^˜¹. +—q'øéjŸ+R÷Ø8¾Í|ZÀòJO3÷…g“¹B=ú3¥A#=&b…A¢® ¿^¸ªÏ’´Iú€%iNðž‚UÕò¢>„fÌ±Åcµj´”Ýúñ¬Ð÷™æŲ»…Õ{T—huDÚÆjŠÌ%OTûHµ£¶ IÇþ”‡Lg5©1ù“b¬ ¾ +Æu–:Ö뚒MêõˆK€K¬ËYµ²·QÈr§Š.Ìh&røÉPo2z–!c™)s*q=«qì=Q);Ç=z_Y¦«‚¢f•k—ø)è©ZÐò1¥v)±ç@–([\¬hfdÿ +3ˆ´7o>ç€IY/ àÛ¾_u;ÅÞáH†ð›-)"g”M¾ õä¸tN™»a9®ÎßrŠÇNÔ<Ք$#/˜ynZ¦ÛEØ ëÇT¤Î|9«oBö•ÉpÔä-'Ãè2‚.s¥‹KÞêè0È© ¥ÃC}ŠÏF*RbªªÆƒ‚9¯<õHá{])Ç EÑõÈ![d^ºÅFü„#¢¸>e¹œbæÅ2âíz´Élo"ÌçQõoê«%ǒãîuŠ¾ÀLæÿ< ,m|ÿ…ÌzUoFÆ@3íMwEe½ü‘Œ†È3ó ©ƒú:X¶Ù’Ó߃ òÇíM˜·"0Sà±Þ7üÉ5*u}kv¿Íp°ÖÐ/˝6Ù gŠÖM<®”Ñø¦oMi¹í>ÊmSŸ¿¼¶ýúâÝÝûÁ?Ÿ‚ƒ¶­Wy Ûqqwêƒ_0L™Lïu@a¾‰hLŽÞюF~Š*´qÖdH´F±ˆÄ`má9¢¶ÐtòY„ЮÜQ• ewƒVD´1'tÝóÿNWÕèJœJSÃ$Œäñ´Ʀ[Cb–E³3w.ï/ùªû&Šî+Ó(yë açGþ +%Ÿóñ‘‹J/§:hSáEêtªÜP ÉwàHNMjÜù•»r.u0˜’ä +‚ÂÄÜAÓ%qEãZnëR‹7 +‡ +TÿLüÆO¿õ¿,~þ??ÿKâwôŽâ7~TüÚ]üÚCüÚÏ¿öÄïïÔ>Ç¿º]œ´¢õhïÚgóô%sSt̳Mñr‡3™„7Ʉ»åsa÷E£;sºÊ¿=Ö`æw¼Øad&–ù€ U–Ýìhø–ºÉÉFɒ̀Τv=ýöÕM´ÈHífRîŸÈóÁþärÀü °Þ8`=8 >8 ¾q@{`àõf€÷Ÿr€?8 ítÀþ$ÿNð7ð7Xx²@ý,Pî4PžUι«µÚŠÈûìûÈn¿¹ºijÑtyŒ±ï¢_Ž–Ó¥ÕɟŒÊûò’ßò¥i‚¥Ý.Mž(/4QÑ,sV„R•VŽÊ:‰t(åÙ®d +ú½OdïmÑ€(JϧíZ¥“Õ&ÏÚ؏Ù<íeég¬P]xáÕI2=Ikô³•¡¢ð(Jøyº–¦GŶV!$Á‡¦P!ãÖ%;àèBˆ‰È’›þEÏ8ÕO Š8 լǏô(áb•AoÿúG|sש‡.qyìÇÇÞÆq¬xüÚôá ¤ö»$¦½ÃPT;"Yþ ·y}üt“AãÓ·,æa†¾±yÙ’wxÉsúnå>ì´Ë{(¹ã¬ãv\n†É„-®\Vò™Ÿ?ÏÈäHí²(A41÷ÎDٜ.5pOžx€Ò‡óÞA·G¨R,4zôÑFÂâ/3r'skc[ÉÔÏtz¬_Š¸ Ÿ/Ô$ 6WU†÷3†šÃÂ\Òe#îë(«mÄ}ÀpàbÐMáò¹à×q˜yU°c¹+*ZW£O’ ‚L6VºQµ´h2¬’îýz^E‚Ð.ÝAó 'Œß³Y–m"?GZQ‚Ù+y‰;¬Ô¢w2AŽuVsW·=ÌK¤6¦)Ëp•N‡ž‚Qi MR/qT0rP×="+þ8Z4h»Dè2l…Ñ컊Wd—ÙûÕôßU +$.Ù5ýe™çènéÜ¥j2û‘aØN՘Ü]kr(Ri¼É¿WWÄ2Ê;äÂþ+z3ÿ6½ñûãÿ£ÞøwëM³E´ 7=®-.ñÐ2‡ w-ًp½&TÆ`¹Û{) ÇצֵÆ}í³%]§åuþóv±c¬p1!ôb6{²Š—³!ÿˆd·äoé:›C¥1#)›$¿RÇт2嘘] ²‚l—ñ“T"ßÇPiK4:V)̛÷+øÕþ_üGöÅ{i^yÌQ;)E҅3ċ%c᜿ÔÁÆ-mU¿fÙÀ Ήë6ü¢.ê]òL 7‚O< ,ßÁvÅÝF'€y6³;ºÈe4fa§±…EkΠѣ…^mÂÖ*SrqU`¸ŠÎ0¶Óʚ`¹ÜÚè´qH¤Á‹ðìõáåi…ã +câ•| ¿‘uUÔ¢‹_Ç/f6€bޖ̡šòÐrÊ­1H¥³“‘ýÝԕÉèH,ã¼Á•8Al¬Ç›èÖ")&š¶M_âÇdŒ(Çòt–1…Ã@m4à¨(–ÔæÑÀՙõ e¹òÃMÔ½˜Æ"âU3šJGÂÁÊ-.±c5 €Ý`”$6¶@ºþAÙl±Ï’,òä½1¡’“ÍæÞ÷óK¼‹ÏH߈C¤²¸Dº 6eŒ+äɆy˜Éþ±"™Ò÷ÛS.›‹3•×‹€ 1„è+ y‹ñböãbp/4MYÑ=lZW!vñy¨‚NB/8;žx1«6‹6,`ÇìãMhȹ€Î¤Ãì(ì8ènŽÕYç1:Âޛ>ï+:Q¿ñbp´jBKè‚ìü4%0º…w.T*2u¡ËòvÌ rZ G¦G5V„)Û AÒü2b §ÏKP3!àFãæøy!„·•Fñc%·`´q¥Òæ?.%]xdaTv’r#ÚMžnàz‰ìa#tÃT,ñ†7pÍZ1´Œ³Ð3¡OˆÅ±x"Æ+X2â8ÑÝ ¾û7õUŽG’u¾-ïã=°1«ìÿ…õ#²»ª ŽÑ†TVÊ«²óˆŒp÷`VŽKb§˛­Ê6…41Ý,×G‚Ðm½½ãÒpfĝá3ð_„Û¸nJdü$£—¢S=ßnïo?¹Ow]é,ô¿ÖäÆÀãuüNFBHy…²v† žÏvØþé;Î*¡×¦Âó­Æ¯àLv¾y©Û6û{%‘‰LìE½*´`B–kªòØmÕïòµ…ŽÓLÑÌò€ŸÒ v[™þ1ëÅüÞYî¯/ÞQFe¸ÉÑHÐ|#’z¾°&¢§=í@•¦ƒ–->ø »‡“ó=³#Œ*Š;~l0=_»,Pê`€p •d]CÕÔí~êB;Šà¿ÖdÑ·ç<¤UŸÌÕ<ú/6:ÎÝ}ú+F=ÖËð;Ls|éðvƒR È°háêðڔu⿪›¨ºr4UCÒ<¢år›´,ÞM·ßw¤4¼Æΐ%ázoÖQ ‹a4yàL”T”¹)›CŠ…ã•N¥T&œH-ê8ØîÐu£AU¥kàXœ3Q$ÍÔw‰´ì! Å³l_% „Ü5ÀÄ¢S¬M¾ÇÞ 4+…²ˆˆ±Ç¨Y[a®ö€PCê”<·^€%Ý3Z· tfËó¤iÇÛ>´¢&·µ•,"Ž£oíª:H ²O £»£éìEŽÎ†?n¡¼4u<^ uŒ¸_0આ¼#ü:,µmW廜ážL ÜÄ°ADTi;û™½*°Ì2·b8[ì|kt™9v¾»/°e-Š ‚°}loZ,Ú¯ê̂daÜ ­™oÛÇÛLR® Afô÷^‚"N˜ŒíÑl]»,,~v‹åÖFŽ&óæ»8PñNáwm ah¢Å”i‘%ãaƒÌ”aÖa[ՔÁiŸSg†©wdƒÕDfHŒ-w°½± +Ä¿3ߧ¼Î8‹"Q +¯íj¥ý”·±ª ŠlÞP‚j p_ç€R3zíøLK%Ø)Ûe¨¶çª6ö´­$Ü6eìæäâ&Óhjþd§$6þÚæ"+j³.ØïUۆ’äUæ–/RÎ#\nF·r|LßçùEϝdf§Z´ÕCq|±v‘ˆ(¹‹øàÔØ*rw +VÜ /‡§iØÊßîÊHX¢QÝ$ÁÜ㌠o$µ†”k\¾¿©äÞ9˜©Í"Âe7J³>v”Öæýðw —*—ÍÛ¬œ<.¶Á5ákF•Ñ°{š‘‘ÃGqÍ4õ•h„ÛÑÌz^TJwßÇU šRÕxÕ/ÅN˜–Ÿ& #IÅÛI½C'X•"(±S ·U%Á|Ô¬øUÑN…Òa|‡‰ /(Î㻘¨‹R2·¤ØHJ½â;{³…›ÚÅJL…ê´s¶mS)‰Xï<ͅ/÷­JY…– +(†SH¿-°òøy>÷7Ëæ»uóînó‹ú¢%àŽ›R^2›&:YæùÈB*W¸wñšnN}DZyU’J·T”«²ùƒ” @zn·JË3‚SÝò&S3ÊcúÜÝXגdT9¨jl_Ž^ðA÷ÂOÁvÆòùL“Ÿ³7Ðθ­þì/q\z`ðÔ á“¶ 3Éblˆœë…¤Pœ3Õ¥²–*·5 êa֍RŠ"Æƶ ÎÊ΢äm…Ø/ÁÖ]Ad¾nãŸô¡Ë˜'5iFöºx£>’Fa{#qj^zíZµR‰PöÂåïPª7ÜM-’³˜#Ü­{´ €2ÓuZa]xD/Âêä¥ÔùøÒ=¨¨H¦Iryت.‹ÆTedŒ”©Žû´Ò`²MÃЪËjdMF0­¬/n°¶ï¸W)[ô’?dþÀMgj쏓%fãò@<ˆ‰„ë Õ“EÄûËo®҅ ³Õˆ?aïÅq»m)*ºrnÓ+¨‘³hQܞ[X×þuô'¸»8È[¡Gƒfaº!‘<è…üçò6Ž˜-qÅåqÆrÁZ£¿Œ× z¸¸çÑÞà–4ۘÂã1¾mèÛÖ¹G¾ìÈøãÛsÏgÄó”ìñ^Oýq—›Á¶,Ûa¤¨]yn!©ZòTn¯è‡zðA¦6&û¦Ùi6¨TÆYƒÙ!a•ZÓ5Òq °ØzêÙlÐ_£j/ª&‡‰9cNªzuÿ”»jò$Eì)K£ Dæ”0LW™˜Á¬ÌKöfîX¾<Å«Jê Iú–g9 GÔÒηø >æÓ£µZNB*SV }:—-ä†hêå©¢©Å‹;F•âğˍ §ìµå‰µƒæ iŤµJZ©x­(_RýŽò•P¾úÊ×Uùúϕoþ1åË7åË/ʗÿ•òµ«òü¿U¾þg•¯Ý•¯ýKåë?U¾ùSåCߛS-t£ýàUùÒvØßñDdˆÙ`˜ç 6öTQzSš¹æ8€ÛÞ:“¦ÇÓß?Dcƒk2ÅH‰¹_x ÿÌ”à}àæàõÂëÆõÆõ…ڍʍÖ ìŸò@¹ñ@Û¿IåN剠¼Ay!‚u#‚;ÔÃõ+&ÈW*Èw.°ýÌ+Œ?ÁýÆíJëí– ?6€n‡ÿ‚ øÃ,64«™yÀÒ¸RivÚQ®Ž­ä?ËÀ¾ôݒÌäXٙìĉ¼xتÖ/_§¤>9—ÌM©ÙĒä”×Ee…æY¥¢„tÍÛFšÔõ +‘c£\ajº:fçšJ÷¢+!‰¹Ù‚lן“ö½z<ûàj âS“ߦƒÚøeèPî-ɛ†«ØÊ 5Ïæ1Yí/(}Eq–¸ÓêÐOBwÌ+.§4\ŸÜ—+$'nɺá•l]LDsU]±9fš-±ó؁âóÄ׶=M+&@M³ç +¶Þâœlf]Cå!vz Þb¬0}{ÜÙ`ñ¾bæÐ2N6«íïÅÓ3°—yà” _Ņ;ÚlUBÜG¡ ~½~j7;í&}ýÚßk!Q^ê¬×Ç!*¯•²Jcú0£8¿œDZl+_ —WMŽÎÞ@¦‡'fwÁ_z:EbÔrf ¦¯e=îÿ=®`¬ÙäQג¥¬ú¡p²¿¿9¹YÙÈ0f\ZÚÆÞÎÚ8˜!ç›âS眏U¶/d؀ö}T·_ŒÝLîÒ»kš‚¨!ãñ5ŸF­NýdT…«ä«—©õ‡0òìë‚"ž²g™3« œ©Ò¯|D–Q‡^ K$`9’÷Á\øޖLY"÷xÚŋÈç(6I®ËÀ¥“ûù–%-:z-b˜Œ5ÓòpI”Nh>üùñ,ÛϾÚZÄžÃų[tÈÐY"€™Ü¹É¾ø™çöýú*ɱd)‚û>E] ›˜‡5Gà%Ý,ø÷—°Á#3ß«Þ 6°©J{™áჹ¹ÕSàðÓv²ó §4ļ}üë¯øæ)ÒeÁÇö”ç°V`Û8š•_5ŸÊܾyCf¼AôÓtZ’ü ² ­ûã7˜Ä65=}¥_1aÿñ¾s +ڑ“ç,O¸û”ÓÅÒÃü…»ŽSרȅ©„ÍMºÜí+dz>#}ž7Soj·@É|‘wdÊÖvÑ÷ԍ׸õ“? ¿“ìIÝ0#H¶€Ú˜Ë ±cæ1·mÜ|·Í Y®®8<3')‘…äx¼ÜVP=m¼gϵQ›¯Ç'Æ®í;Ï£´Ý|kÉÞSe1¤P[d,rÅò5E"–F®¡¶=¡¦}^Q;‰’”3”¿E9¯g åõæ»Ö4èÔD‹èíÇd©›8O‹0 EpxىÄ:Âöüe.–jÓ(A¼Áyĵ êŒñø…x¥ñ²ÃÁ]µùü ða+·p <4Q_+8 +ð¤9a 2Œ}•%֞fû‹ûZ¥}¼ßûóµYBjBˆþ/÷›ýß÷›ò|üì7å?è7ô’¯«Ãmpâ3 yëíšcÑyÍ(yIJibšéÜSw8£µgçשV•Ï6~ÒT~!ÈݦCK ¼äø÷ ‡M‹¹>û‚ۏ>ʈ¯“Zo \_¿cÒayœõ†“æ˜ï‹Ý‹{¯cñ¢Ÿá(Äo…¥>þúÃFjÃØã`ìÚÑñIך]Ã¤ÆüS ÞíeS }<ªÂ5؍—„ +–tî߆–ï¥/3…ZÓ§-ìœü¸&s)»1¢×XµŠdò緃9»R%ÐÔ-©2æ0®1ä¾`¯¿1xZÙ3»ï@­Žðø~œš¾êåÑ)¤òeP†¬—„áÄ Ò=e¼bŒbIö²A”/¸°ž®¯_Q¼ŠVaÿšA™Ã@{êB›»w+#Å&Õz½Eª Þg典¯¾žhõã¬ÄÓξFâoâXùb¯U4GˆËþÀH”ª¯S¤æÎ×9F²iï~½Ý|±2ÐuN`lQu;­#ξF²_§ÆÛ°(V¾ØûÉâ]MLµÚrid«V‹“[,^Tðm­£±³n1sËîÍBå±S¡ʖ yɦLá^­”±qk´«©êÀ¸¦þ{£|!¾¬§6Z}‡2ò¸QUƬóUµ·»')qþ{%,܌Ÿ·A}V‚&‰¬”G&&>zª¯/ SËýùDªÆÅëéﴜԏÂӁ ÌÖh¸ÇЭ¶ÕØi§Dc»9†GJ™°%ΏYCÓxxª;‚èÂvÖîåqp%¡U@[-bXMåiWÇ°¶i Ó¸šS/A?À·Ñ1„]Éõó\îÀ/@É` ò¡Þ@“ߦŽx‚ÁSÈ}7ºl&åÆM¸oäxÖ̦9vkL­gAÒüæŒ`5g¿¬ºt3s³Ø5¥‡”çÕ÷˜øê™…¼£,ãYÕ%µ°k€ŒM >¿Åy†—a\öb¥öäÔýeÀ©qÝ©ÃzÔÎ{TÍ#þÞÏÞèóÛAkr .ÀyRÄÜÉÏ×Õ Ã®xØôù­»;¯DÇÍú¼ˆiêí_¬×ƒC2ĺƒ.'¦û8 Q"W¬ô¬k•¨Ÿ.Š%/6~~C +RiÂZ?Ŏ–;Nú|¸!ç#Š®4)¯c¼  ð¶F6oöŠèÈÃÞãñº=“©}Á¦-¨™û<æ€\$™&ˆ#=E¹•þõ®‰κ -+,!0ãԔåi!åkG#µCg¦xÙÃÈOÞyìcq°içg…ªòø±½‘åúì×[LlõßìWIn-GÛÿSèrÎ#4à…þ¦ï¿è ‘Uõd£½°ø)ù²rŠÁ±0_ّÑo£Üà:£) zî*]Ä#ý2Zw»&«1ç»j{µ"Ü\á¨^Àºä¿Ec»zËüM=>¡ö½¯Ó%÷;}µ¨íð’AS”B9„I3³:Ânk ìêMž‡àW@u_њ½Àó1˜¼> ª3ŠŠ%y³'Kš¼ jú÷>¢ é¸sÝÔkúP¢ã?$ðÀó`Íù Zå`n¤køzLG]G6Ã[aºçY–í1*OW_i; XBÛçs&'Ùjp‘@Rv`øž?ÿ•uös¤¸ŸS¬IÚ +c‰V5´°šNbÐAÜ).ˆ¿Ü¯G0—VȀŸ2 Ç&?D`©7õ[IM)Þ§GX^gaÜêóÕ®A‹:jE1ÝÝgç¯É#©ì²TaÞhÖÔ2V¬q †Äù¢ÅRá>­íÑ +£L¾$¹ ¦”×çMö… /ú¨áE[ЎK™À}Ì—ÿÝD}ÒfEk{< -ΨœÝ¢ŒRî¨Ë쎻e´‚b’Q†’'¯ƒøD³±C=Ãì^b¬ғ&HÉ+}‰{çÅ[‘^ªhÚ ¬H®Ë¯¸nô]´HïÍzÑÚë†Úô +á8y”Ñ=ì  ä¬8&póc–¾Îä:Z*}xŸXNŽahß(në@øø:…ÖÒâsfœE-¯-ÑÞMFŒu i;ú:¨ŒMÚIù*Øn#]?ȃ½ø.ə1֙g¼› zoÝÃ4®6Ò¾æv gÓÄ2MÔüËNû©&'·¦PKaͽÉeä³öëû Ɛ¼øÅd8³9(áâÀ‚*©*L™6Vü3_Yú¤» Ê|ÖCÏjO_oÏÀ|åÓ¼££_úÅÑ)G[‡6PZÁÑÛÚڇƬÌü­ÜÅR¬-³Ý­LYÑ5^° YŒùV<ÝË°ãFD5öb´]X_¸é1F8ºÙë«]Bé5i©(¥ G˜çÎƺß]]9Í +š0«Œ;œlRtÈ\yñ¢„J_È4‹ßa‚f†¦›¯ÈÈ°-¾r á̳rNØ'÷˜5º6`’˜\FO/MKŠµ(ˆê£\^²cX‚ì¢ë éÀY4%ºéôì¬|þ( +|AÈK.2[Wµ\¬€°'Pd"k¾"ª[Ù¬­'¬ºHJ: o¤nQêIŒt‰4€ònì›Á–Å@Ãäù#rBÿï0ÙВ-Þêç #]°tíA„Ž>¬Ìâ³™L+jË¿uŒ8¼V¢•»öúüqê³~#®|ܼâaÙ «ä +¹Çƒ¸‘Û uqãfËþ¨²bätæ*­°è9°Ï«×o²ÝGR 1¤ßV½ªˆ*l=“v‚Þƒ!+E6þÐsC$ØH4Ø· KîS,TÆ ‰q·’ë“ýˆjÁoF*3àØʍ|)nê5>Ž+4£Šfâª*‘2Tqjs3¥z°¿ÍÖþöx÷k†oА¹Êê[[©?ë[‘RéðƖ­ hLÖu¦ÌŽƒõ9˅S¬ÿn¶DpF?žr.(‘¡¢€VÝì¥9¢/3…l¸µøGýNKQu:jxøˆ@ÛPWXd½©ã›Kû!ÛÕ*¶ãÌÙÆ ¿¦XTQN¢͌êáŸËÑÓRÿb™ær$=Þ+™Þ’/›}s™‘ò°«5|;ìæ²i{¶€ÅîÀîl—“aÀÏ+oãE«ïkfÇØâO:²nUËäÙ×)U9Ü׊M¯Ìtv.õLIøÞytOóÀüµI´‡G/ 6ÄR«þΔêb^'Ŭ.+ãvßL¼?RñX xiŸ,ê›HS&Ž&ýÑD(×¢‹…qfþY`dæOÎ>†8ŸâC™0¯öu`¶4…¾!4‘4 +eõÄ+^ äځæ;É"v(/.²Ò 2©ùÌYÕÏXQC²4 +¢©žŒ0ŽK×PŒÒÍƊÇÒ:^è±» +˝˜û„x49TÄÛ¸uåù´i‘Zä!8Җäœñ‚E‡pÖíùßߞV|e‰ÑÍú£ü.K€‘#‹v2#˜Tì:!4¹ù™© ]-ƒsDB#üS{âp~ƒ&I5v'KTžjm_*¹é"_ÁÍí5}'tLç3òÛ#×-{‡I©7ât”ðÛÓì†ÅæXÀe¡0E?±y÷Ï}~B[_«6úñöCÑç±ú±·ï'›/®[aÝË­ŸêpÒÚÆîÕ¾hïî IACÿO¤Âì> ôVY…*¨MG;¶À“ºÕf:;Â4éƒÁÔ½SE§žÆð9<%dNXӓUc¯z‹)“4©žT¢;:Àñ-·€*1hc‹šÅ€þBÀT2À˜ª»å¤P:̙RÉ>d÷R·#Vû–û­Ç¸™Ùôÿ`ýÅsÿjž[¯ïÌ&8ôÞMQ!tÖ¤ºJixFÿÈ«Ž'¬¤˜‘‘=QÊ f;°¤íâ³î4V™P×ÈöZÅ»&ț€Ê D¾ÝW­ÜE$É]²eÚ v~ê r3+ýã0I×ðµ¶ïÄ+ÿý!ß_B¾ÿ +ù?òýòýB~“3KD5ßi„Z<|F{A‚‚9Z›«8#—2Xé°€àTÚwéâÓet¨Ï8ÍJÞª/țêÿ°3ðP ¥NÖ̏+Co©¨ –§¢«ª6· íÃz¿Gû{|ÌUëŸëpÑ[ïžé(¯;Ñ; ‹¡èTÞNWÕQ6‘EW3Í4ùÕö˜Ý"okCøÏ)PPP‡Ú/¬+JWµnsª¹S¨9Žÿ¿9º,“¼mì…îgôP͇_ é€TEüvÆÏÞÈ­ylËhM¥Þ»O¿Új˜k[}ÞPPBœj¡ø­M¶¿?zÆ*&,˜Ð¶Rá()Õ ÕÎVBÌ*s_0–9 Qèsæ†ù¤œ¨·æŠ9Š _4il_rv7ªÛà1¸G¶ÇÁØjKc±¹|Ĉڝ>b_{‡¥^ýšÁ´.ø~øp2<¶r9©Z4å Amî³'ƒÇ,o¿æLNªj32Ú؏ÂÑÍäýpʽ«½Ap¥y¸)®+Ø}(4`Š±æ57Ë5^zvÍ +kR>Çþœ›¹œEÿc¿J²$ÙmؾOQèÿ4çÉg¿^To|ÿ… €R("³mÿ½7U  ŠÁžµõø +<Î-vþÄ1tDõ|RÒ*õI¾Þ¥È¢T™é½£YÒ¹ô«•¶ÌkȀoð¿{#zîbº-9 eE¬2¨Ø-¼, ޅܒ=é1XxÈ=BU[bŠt)Ø8~ÝÈè_ÿàlê‰å¦ØÖß·‘nq¿9x˜/!7~qÇ°8¿V$¾Éu… ÓóI~æ:á~Ã:Y ÙeßÚ{~¾ú Ôd£}ü¿ýýb”‘¸e²¥Æ]•u¥Ãžc)VÊ-vNœ“þ &Qϯ÷vó÷‘ Õ.{OÿÏê¤ ÒgDÒÂV¥!K;ŒZù,"ì Pʪ&ULòÄ€B_t ƒ2 bP ‹â5@kVb[&î ]•¬©?àŠ°4t˜m/ÉŸÒþ q•…Ý $]RUè‚×oü»yñMShCó?TtE@/y}p³°ÏoùŠªåü) Vûòú„V/»÷lðô4{¾ØôãVã×&× óÔJúr1hòÕÄr1+ι‰æªü@áSø| ¥’§ls—;ü§)WÐ,^'‚Cë¼ â؁ŁÉ‹N—ÝûÒT—ì`Žú²•caŠ òzgêÅÔÃï ŽÞÝ39ÂX®00²×5DP9½ãµ^n‹µü•ÁÁ¹‹ìóº5¡ƒUfÍüŸ0³L6¶ ådÌuŽØã1Çjn)™ô3¡B Ϲ¡Q^µÎãX±× ë +ì¸F&”ò>A¥c_±ëÔ¶ÁVó€ÇWèŠÑâù]{ЦȬ0¥ñ+‚öú.À³¶Îà:`ã}é±9¾®¬!Ÿ5ÈW— kÁ2Qû߀ Æ_|ÞiÏK‘`G”d¡'±xàD¨šB\s杙¯Â¹Ç=U¬4ƒØÚ—θñ‹ÁfƒÍêUIÆ }œ‘ik:'4û$Ô®’¦ñZ9†=-ÞÞz +@‹Ü‰—¦Z]ðõ£TcîkºY×æu¸­öŒÎÁþks†ëûl‡¶Úï^ónÙÚ|·œ‡w,»>e tf·Ý6ñΩ™fmק¾ðå3óP"ñÚ½à¾Î2¨ϤÝÊ#ŸHGñö5ﶭÝwÛQ¢jcßõ§—\Óû%+ +b¦½¦èL e£G à¤å>kקÉå6/Úò˜X"£UðÂêiëÿù£¡süóýkzßßÐ'V~Qh¶Xi|55"¸5°%¶8¼ž¬Þ¢©‘r¾±}Gš±¦ÑiÁ­Z +s»evÂv¨ÁçÂªÅ¹>.˜¸­Ýè9óðÆÄZÕt@ù´åÕ×[ÖÚY+Ì% é»x“°y’…Ëõ#n 5žŒ¶~Ўíº5ðë&Ò;›Û̯ ¹¥Ö6ä¨R«Ÿèmênµ¾a{µ’¯å¸ÄMØ¿~¹°ºW§ PTä¦,$j@*¯fÔƚ3Ët³X*ÒySZqX؃ÕÊvòlؾ g§v&;Wðû‚uûæT"ƒýÈâ4”ˆC½)\)rŠ)ƒ7lß?£¾¿@²>±ÌLÂhÀÞ°¤Éµþ‰Í[R`û¾–²BSè…lŠ–>.¡-l“½ëHù@qÉÞ!¡‹öiíT®­s…^¸gø `¶Úñ»ñZhŸ»1oõnÑÍÞ읁ÃàMڟ#E‡­I³ª‰#‘÷whi?´tWìRœËn™œÓ„°í›úÄً„[™yaüs é´Y¢Ü DiÕwÆB\½Ò­˜šYˆÚ m¯Gö‘†Bf“ÙCÙ^¢WÀlkÂ1흎ŽW¬òhÌ °Ö²È½+{_ïñ˜.Î/qޅxi qþ¼´6¢ï† «OÐkúr`Fhò”勸ZÌÁHD³GÙ_Q~÷ì:<©-ì‹ð-¥ÙÆYÙ_Ï¡©ƒBIÏÚð„…]à÷>kajüJKÚèÒøb>¸öw¬åÔì¹}ÀñÊåYò;^ëõ ³z©|—÷˜ÚerB ªðeã|°s‚jO6³¦%@“ì(–rÓ8Ґ‚k"ÌT»P°¿±¿UNÄ÷4߇6cÚÎ _?l ¯«lyl`Ž¾°?¸¢³ç5sMçÊ:lßØjc;=ÖGr©}Qéùó@NØbw浓)[¬b±â AӇ«j% +'ò(D©ßM7™r“ o"Urü ªŽöì÷–]Rª?èV-'Z 3=*ÏÓOˆÉdÁòF{:ÃÃ(õ֖Z+ê±k'㯝¹åŽÕ ­FáÒkñ˜J†”¡HYнP›A·HB˺»\|¹xp¾D†¿2Åh +þ¨Ê£¤TÚ¢ôÿHJkþ$¥Š+a瘃‚é2Br‹ µ.[°OdTb>üÂ0±‚{*¬æ˜gÇ®ƒgd“÷û‚èÚ:S­Ø+ŽÝ¶Ãý¦ƒ¡=™0q³+ ë.똷“¿t£Ë +&äË/:}€õìϖÈ×S›Ái®­X6û÷#P€mdÜ©ú¯.&äq’7¯²æ“¼+jG¶–¡fÕŽtI]dJõaú¸`hÕÅ~)›Æ6P6†;Û¸:[”³­ùãl-©®óþr+·‘€Ç‰ž1[©!¥‹­¨è/ ë<µËŠú_í²Ã¦Ã$4Bú;öt%Ôõ­Ã1%܊½Â­Ü;ÜÏA <äÌ·“­‘'èҚ›ß1´Ÿ“6­i^W$q™³ÃÂG«À®A\;НB¾ŒØîBVìnåÞá~Žß¹CfÌ¿óš?ïܙ׌¶@À2b!ùz›… iÚrvÞ¤%Õr°Øä… ÐÉ?LXóp€i±‰T| #€WÆÁ=’”6r­UkeD×íbÄ< Q¨òK™íåž5ڞ¼5â8¼“LÚ£C[÷•+øoÞà“±3j­H·¦ÇHˆ¾"¨?ÅÈôÉá+dF:Ðj*m÷[§oÀ®áóHKâ€<¬ç¦ß#KjÝ鹓ªÂ‹4,â­c¹0ÔCcTúØÍ«½â’WQªõõC±¡â-FeÿhDAwÍ· + -j$ ‡/*CE+pÖTòw`ÏT|+`ÖnØÛ¦HB¢gâ"¹-K÷o„FT9¢Ó¿¿’˜ÊqåBEÄ<ã^“öæoƒÓÊdŠ„ÔÈ,›|w¡‡uiôߐkßnˁøÌnÚs} µòçAYi +èR‰hØ8]Ø¢ÈuÇct-9®¹þÂx˜Ïò ƚ‘i»Èæ˜|ヽç»Dڝ«Ñ‘­Q×òC:]îFÜôõµ0$Š¶¡¿>ή†Ô´J¥Ïº9.y3V(ƒúj¼pQÝ!ç‹2 ÝÛÖcHæ÷±1þZî[ÒÑÅ~Ça–?KOZÚåVˆd“´úì¶0½Ø«³öªCŽ*ûE=A-¢¹)‹Ú©CÕ$žÀ\eÿˆŠéi÷_ƒv¢#‚¯æ"›û¯ov"e;yt&Ä9êr™Ãé]u#£ÃvM…AÙ¼)€}7€c¦±KÊñÏ!ì±ê2XRx®ä$æ_¨™™9IëSiYÓ)xe!…&UÝ+ýh" €ƒÕ0Vñ“:ñ”¾¾«_Ü-²#\ u¯¾ ñŽ-:EKöÖÓyËVíóË0“~®Í‹Òõ:ɨ"P//±ˆŽlmÅù +ö#“XÓ(RÌo.»áR¶†ˆÆž¢!—“OYª o»Löa÷ëV„À%úvêÎhùW" å7†£Žî‰+õ_˜¥1Ÿå艬‚:wBHt—Õ~_peæßÇXù¾¦_0±Àz…ù —o»c+CïmíÂ?jq³r|DUþ&Ÿò†·0˜A¢B¶«ëDH§4~/Œˆ.Ùö$WwD>ÞK×îŦjÁgÅ !D…ژxš!ŒÔœSà“-R§8_¨‡M<Uh>P$â³ß‘2KÚK´º;{±¯Î03Ã]:¯lCU?ا¤Ó»’*ú2'…û$K÷ۀ[*7¹k‚CžÌ_[[{x}¹>ƒn‰‰Ý¬:þ.?jäSmX5é( 8uÓ'³h®Ë-´ÍvŒ»ÆÃœÎUÐli4è¶Hêfæk‡¢^]…˜q±íe…¤+gÝÀgŒ~,}ÑL€‚J£×+ +•ˆW¡gy©„µ&wÙÆâ3í"ùäÐ9ëx˜Ub ÆY¾ [æxB[¼¡o„ÐjÜ5tùÂ謊=]ÁNL dú,LJ˜.ɏ\<&ì“)%yrãå=qVäïåÈ"-Ƽ¿”:R±GCòþ»ð®Ä$Rö¬à9Û·±²Q|¦²§q }ûnZ6ÄI"R¶ËðnB^û9’_9iÓ¬›å’7#íanF;F‰jE«Þ2´£Æ,ª±ïYf¾-g`+j"¥U-ßÇ·4 Ãk]Sfˆ ݬ47„²Ö4›K7ðvßɞÛŒO¸–‚TÕþ@x谈T,h®6Q/T·?“¥5½ÉÒä4cü]0Ú xðñÌF8êÂD4 2ã¾¾0PJÇ™åRO"Ÿþ`·‘l·€š XæóGëdÛm¾bžVóbÚÁb¦5^*röùÀ‚TmWŠÝœæ´Î%MÉøKR0pï?4E¦³~0‘}WkàçFtb€Uc;줷O¦óèØ.0ŠÊŸ†í‘Z>Ëp7l̈ìˆô²óî¸ÑÜ9.©RiÈÊUK{U oÁŠîuÃTE$V­‰ñM )õKe]-Ž›3̜‹±/‘°«í¢±é"h%æ‹"K}ìY«KÒÑÅøbG#ý³$}p_‰¯u­>k¹àÕXg*6½3>—²ð{ã ÃJ”½Ä îÕ(5öBOatm†EpYy³C—Çh©Â<²F2d$6Ëô–’]H«ÂÓ¸.ënSÔõÇ`¨Øõ·¸rmïiá÷ưے—[µð7¯¼=V3¯FÃ41ˀq¥xnnzý ´'JÞ,¼¾©Y•UÔ4WÿÓTŽëûlhД™Ì²ãfåk[ûÎÑn—MŒc¤ï<åά¹ m-†ƒQ"ŒVJmWVfDÿ4gÌ$,‚7Œ„ù–Ž]¡É-cn¦¾T$F!œÇ\ +oú€ðÆäÍU¬ý áò#ÛâŽHû]QÖdžIŒ,sZáHártx> …ì‹—Wº`1ž|ƒ‡e}šÏO|å9éÖ 55!ßÆ A®}aþ@Hýƒyý^ĊTÌ„íY:ÒJ8õõª…,¾—oä j»“Y߬É<Ÿ¥Ò;ZV1¸ã­ÓØ#Ąb)Jp +üw”=¿ +¨œ/k$¡ÖØH'Oð‘÷‰–ÀÞGêÃþ‡À:Ø=~èO  ULd6*é …øïÀ"BÐüj >¹ãˆ†™ý^ÒQË0“¦”`­Â¾X³vHb ण +‡d¬)…¢=ðf=kE#!f4IK¢DÖNbe}Ho)‰*‰·öˆÁì`‹C<ì,â˜i¸N € ìf§ëß7fd¸–d¹©ÓO0ä¾îš?¯›áImêà‡x¬N'ïøÖzøR5»G§¯ZÇØÓ4 +W4Ê׆^#£„rΚ]^Ã?ÕuT4b‘Õš#¥Û£7„Uöâ4’O˜ÃÖ±ñá¦$½Ó® Æe¨_O„&‰{Öbì3¹VÃޞ]«FpaÊ 02ÑH|q©ëÈé:¹Ž<˜×1Š¹kHÑÛÏKÚ+lfüvfµ~d|å¯ #½a¨¶¶Ã)éãs<Ë0,fB»P—à=ƌ¬Ù$|X†3ˆRêoŒ­›í¶°ýžÿÓ]-Y’¤0l_§¨ t?þŸóä¦U÷ߎ$‚ˆÌÙäKŒ1²œMQ4“šÕÄN¦(D&ö’ëX½¢Y"I’‰ËVHqAʜœ¶ÙF¾¨cßÒ —;7g_‡ó$a!e•7æ|t¯1ŸÎ¹·%ÌÂR/溋/Úö Oa$7²ÿׂŽ};3[®ÜÕÜ\ÉúÈ/úwR»ÃŸ k`ØËÅ'ÜÙRÀªý ÷䵑Á·ª^Õ­N{©¤+½#ÚK;vʔZ§ªRôÿ¨é•v¡«ª^zü¯ªàØVߐÍÙÄwÄÕ²}ÉcÃý<3쏋£NçÃKVƓ®$";¥]K§‡}2 T0ôš}‰}AÐk\&¼Ø±–{I—ÌÙםþ®8üY°xYJ&7pMvbÿ€ƒ:Ñf-ǂ^ûÒKôÃÚWuè*D¤óõýª¨:‘Æt項ò+*J·j9qǐ‹(KicPmðb3Æ&k[aaÛÃ,ÖhòûZDŒ(\{¦Åòb͸ü¶îç ÅÍçÛÉÖV/櫹 +Ϙ·“Û®ì¯UäZaák×52ÁHß×Ý`½ŒØBaN¬ËI_à~ +@7WÓ"©w«Ié­EsZM—¾Á­7ᚳǦGIA–6ºS劷_˜µ oüVùÚ@1Ÿvé +dSÃk²‚Õ*õ[T"Ãp«õ 翹äkú²S’hÞÿþ©ÉN6¿Žê|0ö¾hDòT~ä¹\ŒÖ«½ª)E@¶ôg…&„Í^5NHß»‹"®$•ÍpÁê-ʝ9 ¢ ¿KÀŒ‰;ÚÑ¡ÌWlôb¬K™¨ôC' ŽÕHâéjN"ž¯ý}Q%UG,–Ý-‚¯ÃK2 P$耻e) "P„ÎÓÔØð¿µ7¯/Cèà +I™¸t´ ¶–ý‘‘Ôè1`9º‰ƒµšCÛȌ́ӵחÙZ‡¨U¶$ ž\ë|Ç…©¡Á»žKÇ°sÚß?V®~$8RzÃÁr²¤xû{)ÎZo0+ÅòÔí Èõú?¢ÇŠ¯«›:d]}"î®ë˜á ÚBŒªÆüoÅv‰Y9ö²'~<¨*h~À¦hPüÎq-`;”7|f/¢¶ù=pQƒ +Ž›xݲƒ‰g4? DwýßWí2ñqKŠm ª§ D¼q26 ÀmÆg_è]}E•6DàuòïؘDÍÂL¾¾ö@U3%ûœâ§FfJ4cՏµt3é¹€¢éÉLzȟl[D!* +oEíŸ&ù%„^dûNýŠ°¦aqh +Ô½ÀôhwY©eʽºÀåU]ŒµG^Õ¤Ç7lOsOÀ•pgê±ÉÀsôêô«FÂÚ ¯^5èÝH嗬™&YhLå÷Öýu½«ÙÕxeêEPŸ°ïbH&§²ðÏÂԉ͖ +y¼Ã´žã¼÷öv:|J9¼G¬u´¬A±á=ò·dªz$‰ÿW"ýú—!õmú¯ÃÞxjeUä Ƶ•p"7Y߶…¡¿ZÒ³<“rIåàø!]ˏ!/àONdz=ìéwhÕ>? d5 ?×¢kàß×@´³?ÎLéu åx§Þ+Ÿh‚è:=Ï·òXrOFû4@]ݵøCzõj§eô> , °Â|؛NpAý4°¿?ЉTg–€< ý–GŽJC~Ãã’xŒç›FØÓÐj) ¹kIÜïê1EC׳¨ZæzéA羿‚cjߖqÝ××®RܤÕâ^אž´w®¯îÑVI‡¿.“æÍa°cc h½?ÕÚ>ßǐüïë뫕âeéèðß1okYRàÌ#.ÕèËwõ¯ÛÃ`wøk1¬"Ş«‰ð6ËÂÔ'C_s끲â´qšíÛ-nÙ\³yŸ$dô Œ™Ó6ÛÈuì[Â0n÷îÎ^Î3³è{…›Á»1k®‚àhï²q@}rCrÛ¸\'Ð!Ù@ø·²OÛl#_Ôq\·BC÷æôÔ +Œ”Ü(Jš¦ZjðgÁ¸šËÃDŽÚ[+è@úîɶтVD&dK(ißõXg‰&-ïÏP$Ù̧X¸©™=7TõY¤?H1³¶ïYQ놯¯ »’®ï e`\Ö Úꚾ&Ru[ƒ-‘{uƒ˜¾v÷²¾ûŽéüÐÎì¤Z‘;ešš¯cž‡!ÔviÆë{V+º­ÜÛ­„w|och:dðq–¡„Þ›û÷åšß=×ÚQkS ñLfYÜŒœëî4´Ú(V*kΊ1l ©TÒ@‘£Bêq9yëÍJÝФr(z2 %R|'ÓõÙ4èd„ÿcÕx`wV¬Hµ0Ç} W+j/DØK-ÎwÂ,UrŽZ¯À›pýÚÁ|àQ8–Gß«ü#x‘û =Ór­Âi䍹/80H‡½ÃËM@!°­AçñX]³×öþ}y·¬ïþ¿®¸¢UA½åAs쑟c:¢Y¬Ýèm`I#/>òrÜÂ2VÚ¤vÄ°;cB’„¦ý Ñm|dÀô"{6ióv] +W±:¾c¡nÏ.˝÷Òç)0žŒ±b³ô¿4y}_<#4yŒ®¥Æm‰ˆ:#‹‚…J‰¡*†?Ѧ£b$¦dÁ‰¬´ÉëÞ!ø¹fÍv#¢zà³V`ù÷Ævp”üi{Ú|ȸ`÷3‚î#!›±LíÔ0¥¤­1§ÚAmÓéTÖSÖëèkä.ÿ‰÷Kñý8¬ÊІ؞Õ×½æ_=÷®:i&d‰'F o^´ÊÂÿø<[VËÇâñK~cÛE* *Dc¨¦0Gþ°À[…iٚØÜÅI³ëëD‘‡I+Ú¢! +¬]FQU|â_åÉڇÁâJ¹XhãFàܽO/’UÅÁT_oØæ_Ø.Š'²£Ä¨Û,Q^–îYr#ñVWž %3iãSåCWã;ÆÚ9úÍòæ[ã5ýýžqˆnŸT^ +JÁ©;ÓU (JeÔõ ÇHq›mÄEu°(JX"ŸÆµª¡××ÚÒ¿º;nysöEgƒÕ¡í¼°g%ö*(¾!¹ßÇÆ+}v¾z2mÿ“U–e²ÄÛQ!’OÚÕ¿neyóWgíU‡¤Ðc¨?¼¾’×氘:TMzÝa óÄÿè®rìHv–ûsùOûr'Ú÷O?’ªêe» –HŠâŠ móO’4 ›M6%M[À}´øU=¶¹³f9w‚Ëþ5VàJ“«!Čãö="äªÍŒéðŒà ÜúÍ6™a¦}ƒ«îûæ'hn|ØÁR‡b­¬¿Ä¬µ“‰ˆ#{E¤®¾dö ¬GØ~þåboâ$ÉZ»Isd!k +‰S:A 몊ào0Xƒ€˜EðáL W”³—„Ý×+4Öü8Z ý|Y+õT)J’•EÚR“PÇ=rÐëÓ³õ+ZDç¤!O}Š øi!Ѐ%ËZÝ" +ëÐêËn0_¢""Ù.ôS¹ú}}ý,u# ègÒÜuL+™ŠH+5À÷Wµ  i#N eþ…Õ?¶»SuIöÍÇ¥CÉ6Ç«§fõZó(XenÅC½"/ß0LPã²x…°ªùÔXyÓW\T¸¨¬2_ þ)¯ÜЀ?_>äЗñ ÒÂÚ¨Ä.u»ì›Îìc8j +];àßr%¿þÚÛÛvƘ’]ïb@¹²¹r?u¬úþêVÂA+è#ÆL¾‚ÆÌ:ô5«2£È*Èiі_F­¾}8JíÃÔæ,¡—ù†Éõ®ÝÏÈBuê•&yW‰eøqÃ`=ÖÃIÑÞp§sÅoÅr†Ÿö'Ür{ºÖ3nb¹cmà–ëa}vgéÖiG±Y%Ù¸35Ìukêµv"¶ž6[ ÷ªgŸ–öÕ¦©´¦Ï*6øÍæ\Çq3=$¥LםY=15‚KWBlˆ‹Ü‚ËZϨùÄ>¤‚ØÍ3jµ^P,@¾o£XÀ*"š ]w¶Žµðj¸C.¡Ý w3ÓhT…ëšÿ ¼JÝY¼à÷ZHêþ <`]bÿƒÕ„À"t—Q`‰«˜:ö/øŠ œ· m®.i¤“€°CpŽªk ðÖë÷~~;ݬ¶î­¡þÁ»­VuŸŠÇö€v·ï¯ÛÂa¿ÝÞ~¾È@±€¨eúÔDn ?ÏýyA9@ k|ÀÕÙ +,NåãÂ@ôñ…q—9ö§…s$¬~[p­?O£ÌÞl,ÿe4½ùèPÚ;F÷KÕ©R)ïŽ3áû_°´›¥þ1äÕŸ›¦Ò¾‹xÅpPú’øçK¬Qóծݘî0Š[”U¼U, +k챨Ù{;¹ªjYLyJî*l“{½Ìái³±bNgüqzBΪÍ"'+†jéO ¬hCÇ0ž–šW’>?áÞ¼ÎU?aߥFžq¾°qºÃQlÓ0»\ðÊgsâ˜Ú›‡Ñº5§¢ à[ú—&­Ò.b±j8½©Ô ~çœý›=u åB9ÎÛO¤3Àý …gÙKCe’6wð†­Jð`cžÙ¾f‰sL¦ö:^YÍU'Iƒwˆ5ðýå* †e†žT˜–ÿ\XXn*¿¿.ì÷c¢¹Ä÷Í·C1o‹vûÊãZ!ÅWtê}š8Èٛ¤ú¼’H5̸nþÊãÌ×eb^àíWê·K)JdZ¾ûËV0L°W Lõýô&Äî±Ò®4r{£d±d×ÀÍýä2[±PÏ!U¦º +4ûÑèñ»xù–£ç«É©b× +’Ãcõcê¾—ÛŸ²†=è~›æ¡,–†33" Ð˼Ëxž²x¸Ž* Ó_!²¨!›NÛß5äRÃJz•ÒUÒ¹ƒœ‰:q§mgFÙÒÑ,êöº]ÓT6ˆÕãvïX1.ÔÞùT:Ü£Ù<ê¿_­Æ)t·ÑžV˜°¥6ͺ)PåÐyaWû6?ŤAk7 MOĊÅÃ%~‹_: óDX;Âʐð|Ó1z~ºY¬p,šÒºǞ+GëÉ&H]ý¾=U/_Zc²pÃKBG,Ô§›­ÞÛå¾#¬ Ï÷øæ;·î1Œjâ}Œ±TõÐg¨S#3É †y’–m,}Û@VrÙ3ßc#V<š—Ø÷æŠH òi!;+Ê a¹ÆÇÄA«÷Co è¯åYóûŠÝÀrâFÛDžRÍBÂWøöb‹`dEmë‹tijøH"Æ2²ˆ¾Ûõ)Ïonâh¿äCF|7ehþR7g¬5ErP'훻¶ÔΡKßy)æ„`pÉn0ɛn‚àïMí ´¹OPæúï¿_qÐюʾgÒYñ î¢á^:vÞ0lì -+ßv4Ìk7Oł§÷9îéœqLˆabHx¾Oté¾_+V<½¡UU׳ÿ(=õ¡“ÀÝ60Ëí|àKg¬xr‡ÏýÛµ¼:„ ±!,ŒóÏwø~øÁâ£ÎÄãäúð ¢r“qR}Šý?N*ÜGCã¯`‹ùœ{ksoí â…Ët=e¼c„,éP:_?’«™ ¥ìk|\°¥ærúÜð&]ÛSýŸï*Çr%‡aù?E_`úi_ÎãäÝ÷O)©ªì™È†J)Š ˜>ÀØ×îñÃs¥™@qž5´Tw@=œ×˜Œ5šdcÒ©uŸ]Ëäˆð¹Àyœ3b®Y~\gÕ&Q¹Œ¶dûúcsk›¼5ö±s²b±rÀJŽ[CSiFåŎ®G,AwÀ?yq ‡h"-6‘æ֗ù’ Ä®U˜P† „½«:± QÏ´О3Û`II €L‰_«<]5uéF2¼M$w‚ÒfZ ÍÞl\Ë#>!™ž!7? [—ÃÔho…#B{­†{û;¼"XÏNVùlZ_.]÷Î*Qƒ„Ï“Tidü%¥9yyJë/!YЦò@ì +uHªÍ=äµê^0æÕÎÊBgWÃÑòÕ·I]+¬C_–Cñ€ŽËÒºàÐ\ƒ×3ú„«(9Ž®áFØÇi8XÞñÚÿôZ£Ç;?JËÏ5ׂÓsqÁnOÕïŸ8+#ööÜnÝÿTÎRÑ{³ùÿ. fÕ +¼·"ƒæç²ã¸Š@ٗ*šæü8mFj šØ?–Ï~¤£×Ó¶>º].x³òEŸŽ›ÕŽ‘‘QıV…+‰ÎR“œ1[ñë+ؾ(IG[a@40Œê~ªÙN•þͬq©›©*‚ˆÏi†— ý,„m- ìz¦'\{Q°êx íQH–8@’‹Ûý+»ýÔvÈfO“ÊpDø#"“SÌIjWÿSÿú¼õOö‚¦…vÅ`i()Ð:¨õµP¿0g´i0Š`ÁBh ðÙz!°b ƒ'¡d§D`™æ¯˜$Î!¶ÛwPe R¹ÛíÂh_Q봇nyˆ…œý{`%˜$%ѽ÷¥áÒMß@÷’&A8R…‚gçøy¡©ßój¼ë§Ù¾Z Lái¶=@¼>Àà¬Ïç:ʏ=@Šéº@f\¾æ@ùµ¬œà_€³Ï q±¹]̅‚§¥‰lçc¦¼¬Lðÿ}®‡Ê·„‚e€?öJún¾¯Ä_÷Ù dHfPÀûÐàŠa÷r!Âï?z=ßÍuK|Ã¥o/0¾¶0RUõrB³Î´ÛÊ6NÒÛqxà [bƒû¥3B®{¾s4x|ž­ôԜ¥+ÝVR`•§DIV¬‚nz=úh¯Cãÿ‡TÄÈ^܆‡ÝuXÅ?–ä?dê"ZOŒ¶4g”–ß±qã!ŒÜ'¶àìâüRºé»á`d#bíÈ =6@†¶0ûçAä@qP²î:Åm9ô.I´ú*ò¬s A uÅØۖt´ÏÝXZ]Ò-ºÙ+:ƒ–ÙkdŽb@Z&Õ:¢ ¥ ÓútvÀ‰‰ÓNÔDA¢`ÖHdê›-QȾiWœ6kT¢¼0܂¦MvÚ,Ñ©°Y«.‹pmòJ'B&ÏyAÛ+=ø(*f²86û×òŠ!y…ý`}帖¶¤£Ë+VóhqåÏhÛ"÷®ÙûzcÕ1Žï>šåo‹$g{’ÃM‘ØÁ©9ÿž—áwCäŸWÐ+÷ D1,ÎZæ {vû¨k¢eCi6õö\íO2ê]¾KuåûˆÉæ¹àς zÄÁ ÛÄR³»è¬…ÿþÞ*KÚ`Er7–î/\û;¶í"ȹ}Àñ$ó,ù¯ýö"1¡@‘÷¢H§ÞV—CTˆe`BCÚY_ÎÌò³0¾9ÃA¤óæ–t´ÏÝXZ]Ò-ºÙ{µ¿ LˆU¤¾ HžšýŠ¶šiF ÿ¾L¬!¥Ä€î™çXßhՑr´ÏÜXMpYs3U{³TÖF^ òØþ8-¹Î%=!žÝh"è\O¸7/ET˜£Q‰sï¸Î½F Ö÷=øÆ2@]¬ÌäVn+ð J%1+¸¦'t,¨ñ1oŒv[¡&Ô³x¶zNØØt˜„­ x±£¯8ÞâV[‡ãןmÅÞ±¬ô÷ –¡t½ÙZs#µ¶âsõ¹™aÓZ{¹ìèê¶û„…Ö½Â¾\¾ö uC¾ÝŒØ|!+֎m·Ÿð¸ÇëÞj_ʦ°·|ë*ÈÂ%†òŽA¤b$³ »áˆfžÏöôQ#IWµcBÿ²JXþ¹`ëßklz⬙ÍU¿Áä$»«GO\z¼]ìŽQnZ²ý²vá¿L«’UÒÑq•Ü] 5q&5“ºÊ®×ÄDÿ,U†u>ÇÖ´úø³t=àÞlª|›ºc°M$gê +bŠÁÜÍ¿Es"{ôùg…Ìud>PÑäHÄw¿#–÷œöÖŒš~Ä:ì‡#UuÄK‰[SíSaêÆln!Pñœ¦¡[¡õÆã”ÔÍT‹Fr~ü—ï*Išçuû>E] :4çù6ñ²î¿}@ÊNgö¿²¡‘’H”á y¢W ìEí>vyÂÛX1¼#h£"ˆMº´2É´Mªÿ§´ŠþKZ™KŽš™™-ºî æÔæÎÙ:ƐȦF'YK5ނþX•e+õŽ«1‹5‘‰°f‚ö2ÜJUÙX´†”#:F˜³íÁ@FÙ¾½p c°t÷‰µ(„ÜT‹½V,¹û9nçԎj0Çc¤`Ɇ%¿¶ a¦²+ÿÑâ³Î F˟75d⪁Öê´àÊ6à)†\äüÁ=Ž{íØöõþ€.…29Óܧñ½/ŒkÄB;é ÖÉ;Ú8”„Öwõ^äïƺn eÍÙd|m-ðë`UPLbz‰7xFVV_p +Mé» ÿQYGV[k¨êK‰µéS!!éÜJÓ鼐щ·ä° æ]–ÌëÏI¨éúGD*ž³~lv‹ÕܪÀ°xß뗧;¦«eV\éÐÕT¾€ÝÜöôlPO„yJ;¨­ªkG_ÿ—]5Çÿµ  6Ӝ°ãÍʟcµÝwͺ]Ô9Ž×ë¦;#):»'‰&MÌʵZU@)ˆ‘}Ò.)$à’Ló%û†šƼ™úó+}XrŸño_û;;[ëO˜\yµqÿµ]Š5}å'4ߑGÙSôþ„Ê‚ƒsŸOh¿ªÏÕ>¡oTùó€éKíҗeTic¡§ÛÁ"3š‡`j“¨ID¿ÁKý¾$˜9}Áï 4X¡ü–lü€ûúÇä÷šd¬¿@ –ïÊz »tŠU³)æ ‰‰8Òüù‰fçÀ5ßþ~ºV‡ì~GfMÅùÄ¢ï(¬B\çŠÓ<`B5XòGbì½Ï»ëÙ +¥rgšwä¥ïüö{åNÔ(Ð]ÿ–cý hî5«h.õö‰-šŠn.¥õKd]=ö7\s¾l@#­á~:êúÄLädüÌ;¥Î̓š Mn³+CtO¦²RÉk%J¼ÞÈ©©’!"Áeø.%3¨‰õ }°RðžlpŸ°ÕrA–°¼´,Y…P§ѻL.)ëãÛ¤ù­ Ów¦„ä^ +g¾ëÛ¾i*og×Roؼ†Ñôû¸ÉNQفb­³PÌ®T×(5”µ§^·¦—<ºäÈDª7NY÷~d™-Q³œiy ¡uáa|Ú=(˜Šo0è9ÐúX°Q`ŠÊÃD]P]:¬)¢ßS  Ãp“¥ê0;é÷þ[ÌÊ3Ub|à3Þï&°^sM»㵁²u|ÔKэ6cþþ³l׉±xÊ[ƒ•#æ, ì× !s¬Ì*¨Œþü³pÔ«ÁŠ‘ÝÆ5; V·áÑ0íºú¯3{â2ÏâD?ÿœ½Õ†ùÔwÃ9z¯ö~5Lʃ%œÉ€mz6äIʘW¿¹O›×쀷“¨ÅOû³éMBÆâB´{{oæSß ·Ñ–É8۞ÖÂÑNbzäÀW@“•Ð¶%€/ g‚1u+ßÌ èÅgËhx¯ðö2ªz×½,ʞjEU¶?±=9Ó/¶Õl;î| ÀR?)¯å(5֚_7ÜkS,µ^>±ÈôXãzÉqŒ7jKuŽ~ñ”Åõ‡ªoØF±§áxU WÑÑ֘áÚ,raà¤êϖ‡›ÍaËæÛ²º÷tªEŸ!àË)1%ÈAыiˆTcIGÌÅsŸN·Ë'¾Y©ÊóÍjLj¹3ÕwÕPãÚFˆ&õ¼Nï0A‘ÏLGgaƒƒ³´“VÖí9údÏz3•±[+ʚ¼e8؎èȘI2f˜“•'Œ±( Ö‰0_±IÀ§¨ÌyYÊèÊo­SîEÐÎNö‹uà3<Š8m ¯ø‹ –Å%Q›­Do"KBY§`Î<†æü äÂõ›ýoiBԖ¼»bdà}ªR|Rs'Ü>ν°(a\©çXÒ]iæÓ)CbâÍȯ*+ž¿W%…¬o¿^(W¹á">5.Óò¸Q¤Ü¼ovñ =íÓÛÃ1û˜â´BHÒL˜f/ßW¬) ¨©ÑeÃýöH1ï/^¸%ÿÃYtÞ/.T†©U¸õûM~ÈŒͲöõd¼©Û¯½Ù¸#\È//ç¡j´î‰Þl ‰uÈßÀªÌðôŒazqõèöÂ@åª÷™-½Å,_RÎÖyȽ¯2·¨±×ÉÙÄEìuã|曩WítLwì>Tä.Uõï#$çiùôºñ™ŽÎ>¦j¶h¾FïוÐøF‘Å>Yã³ÞLýyºJ5å U¾ëîO‘‚Šé›&/´º¸á ›E5_Ãð¦S3uiéÒ©Êg€¯ ¶Õ]•¶þ‰méQB¥æ ÿÁ]7ɼ®w²:Öy1ùç²kc5uaæ"ÍLÔm¾¬€^)40k9ÓòEû–šæ¼ûs3~”ž8îȁ)œë-9}„-ü)0/I•„éCÏX¨è³0JÔ$ý_ :>Y¼I¨nåۛ¡[•pKSÓ}:|]°í¡t8F~Âã-–ê|Â386üàÁf³›„e†‚ÿßòmÕõ&ßÞpuÚ=òí ~•oö֋YAù—ï©œœxi¼ìVUCìí¸êÅ͸î¥ëžôÿº%’D ÜEˆ/_Kü +lJ˜ÕXݟ°¤©Ú)?¡[ü킁Ze0ÃÞè#ñ‚Ì—65Z…VmÔøGʆX‰ž•û™ÁŽÀòý@àQۈ浒 Ä&Ñwfpœøo\òëÿnƛíÉøª7ëf»„bò"ÔVýòª&$ +!Ë–û!Mx›ö”É¿L¹‡¯€Ny ¯Bý©²wv„JµÃ±Œ‡ãSAFBWضfzåX…âàì*øºŒÀÚÜٞÑ.Ԟ¬Šj“ÕODÈËÙ< SUX»×ùOYªôbiÍBk²ûÐl,%-©a•djþW*dǙhkziÄB:©G¡#8þtÈn>³mÞPšâ-îÚ¹./¸+…ÍTQ:.u]¿æÔ +AÀß)"s Á¸ÄRŽ~p•;—Ók:0µ˜)/¤åi\RO]›[0§çBŸ›L)ö8ôp =Œ“ttPà'r­÷!æñ(Sº±fºfp2~Ì”*Q›@ŠRìڍX<Õ¸xF€±•š#MX^‰ÿ™[QëäP¬/X?óôØ%«Èñ Miñ©ÃîJªKR2MUL +™?^Ý#î]ªëÜñSæt»ŒjŽÄ`ß÷`O,^͟*ëº셇'‘ .Ê®ùÿÙ¯’In$x×+úÙྼ§ @€Z—ùÿalqFFf%0sÑIºTÑ2"H§/æ榘¬<¤Ì]šK¤³¦?ùÑÑ?‰þª;3føkòÚzÀâ9û%ñ¤×.ªáªÚ™ö$žèúkžÇŒ2*šM¬ZŠZ‚X—­Ò7˜4qe¦IæÎRÛ,z6&ªë®„kYÙs §9¾ï±,jS¢t!˜‰Ñ$9º6‡¿â@!SNw7×%É1ºÀ#E:wW‹¯v€VH°ªÕÓ)J¦ý“üû@n‚Ú:Ÿ« 0uðŸßù¸’;#°·6 +“Ÿƒo;‡¡B4Ó¸àßÞ`Ãë9hgïçÇOÈÍñúó‡îíü5 å¹¹önûöð˜_ÞÍæUoÙ¾¨é{[Èmh©tc6-Jü,6ñZ™Ñj "1—ÕŸ8ª(G‹ßڝAuù’z –- ´ÊçûZ³)°!b“ééãÁ*ÃBFY‹éc”ÝoŒ•Uø5¯Óè rïµÚ8¶Kˆ³ œõX¾Ô*jej¾…>%×!¼†[0YÓqü¥ÚՕ'}_Ä K¤ÇuEҹ‰ ˜GWCGÑø.u¤×´’9`[ðeÙ̸ i›(7:aAõ7Q©gQÈÔ{M“ Ì3ò¨ +•ÛJ¬ad³‘Fi2GxeR3s’åF3Áð?n?ªŽw ²ÍûI™ƒî˜Ù1J‹Í.EbÍüŒó¸xu½^>çȂ‰Td˜CÊZ÷JTW¥Š) +PÞ%‘çokg-²,›`ü.¡\´o¸RÇrkųΩ:†yö˜sku5}ö„¬vZô% +.Ë»¯q¿±võÛÔÌþÞyçéZþvNEÙ7L1µv¡!Ÿ2¥KU4HpB(M×z>³ìJ}| ÀdÛ?ÿ߶ßÕÜÿmÿ–h•»z&`¦ÝÚa‘…ª_ášäìHY6·@“´U¦¹•râ7¯»ÞÐ9Âo¾"^¼–;ìcER=Ô³³$¯YÕ\d°KÖÐl¶MR®Y÷Òu®^Zë¼D¿ô0²Ç*³~Á$q¾?“Üb÷"¹ÑIÒwµÁ6–6eaW;.¹Ðø²•Ý-¸WҚú=|SŠÎÃä +'úFFþu°%„F™Óű½jx{û¤)ÏÐc†Ï¿FŽTæ3™=_N.Ã-*ªj¿aU`QÝ„ôûˆfQÜ$b¾3’1Šd9-„1x˜DTó¶¼ß4‘’A” +J¨(šQ/ +_ +ä¹Õ§èi8.2âōßÉ~ÞW(å´ïdÉKÎL3óeÁ¾Á姎Aõ4¦îD™æµÜ<e©¹=c4´ÞγŠDYñtF®×v:ÛuÜóÒTL»|OÐÊÿ?+û„£žÀꠁÀTZì¹í§3škZ¸­«²WU +… Õðœ…$ÊíôÑ|4~íŸÅé×ÙöoÀ¤2òÙÁç엁1z.ÿP¤ÿŸ·ThM웕êp¿RæÞUÔN·]’j‹5½œôV¢â艜™äæ/Ž,ÙnïbÚ9)×!Ϧ\«ÁõóIÆLé}zÉnÑ-܃B¢éâžY{oV‹Á×oˆ&r5 R¢W–Å„œE›(Y5"NÀ0†NØ kfW¥KEÆ[ÿ,Åz÷y€X»ž%ZD‡}bNÎ{”|˜ç¯³¿RçlfýÅvº{sù_äÀ1ÊyÖÐA÷ùʀÆòá)1>¡I­œý‰ŸxXàt>²åŠ,2.–T"˜-½0Ò>;˜ðÆ +ˆ„–LäG^{è㊜åÂçût9«cž‘î˓ÎSq¾<Ö}sñ†Š@.ôJªíN[ÚJöŠÈ¸ÑÑÖMöYÓºC¾Ný R{>ËÖ¬e+”=»nI^¿Ï†\–ªÕóav×͚øv.œùì 0Œñ@ž‘Tó=+ò˜þTUåÜ'‰¶—yýU=pù3*1”Ɉ·ÂëPØЃ#É1ÌeäÉ'ꔁY.ÞÏÔÉ*Œ[à™I9s¢l‰Ryp:6{·@¿Pyì~ bUêϕeޗ ÀŸâϜŸå-@Ï}pýNâ\”"¼ëyu³˜=ÉÎIòYš²Xc­H3}_É[Xe>×ÌQf(~‘°‹†ÜÜ›6xÛ¦[ qLO‰—àŽx·Œg÷&0B%¥'ØÉÙ¹ þxI»jƒ°+×}°»Ô¡«Í± ë'z1Ê¡/)Q)Á”é­ÅZɦŒ â,§ïG‰5Œl]o!ä‹o-)ΖHHú9«eùÀ‚¿¼ÝâjÝ^bƒ‚„A)Eœ&xÎCæ€ðßá9> ¿Bݞå|Ž·{¢úG;Çuœãÿ—tM +>²òǟ·T(‹}wB¯‚iý6@e)¨äxg^w¶⥽!4‹h°sR³æª¯²µ‘–¥e‹;âÜ9Я@É*!ÛŠ·Nӗ9ËwŽYÅ̈ ´Å±îIHÉ<&Q„ $zÓòR, Š×ï+÷ëu­õW¤‰!fˆ¸Ôûà‹Ù"FÏ®/>ð'„&x—‚ æ® ÝÌeH;#t­×o˜ž!¡ôv_âÚê:2úV‰}5:Úôѱֈ—Ë~‡ˆ]¦¤%­ñ«¦½œ×~‡¸]I:Ö7&"Ì5¿Ãô!Ê5[ò@m㿼WIŽ$9¼ç+ò•Ð¾¼'Ð@"/óÿÃÍ(ù–Õh4s‰É)Š’¸ëœÜ©®9PvæyI%ZýŒv]3ˆÛ9? µýØCXw!+–IJri¸žC{'ƒlܼÎԈ™ b„I0Lȃ~¶ö€°J +Ò£<1â+$n–åwˆ¿VIÞh肿?6õþÞÃ/òünL4åéW ±Ý¥9†â­Êûˆ÷h#sG+øˋÏEÀ®¬x7«¶Ô¶öeÛ&krSbœÄÆ•î +6æŸ"=ñ[ü Ä¢gQÓ"p¸ÉÁ%Ç÷MàÀô”ZS5™]*¢Åòë+*©”_—J‚E*HÕe¤uq‹<¿ªÈ[k— TÒ¶ˆE8ùžà1 ãƋÙsHŒÃCÁÂÚÁ¬Ü\b™èë¯GнÅó¡ö |}ʨ@:d^Ü.§2üâ5ÌÐ àØò¡aã½ëžAßZd–4ô¯4Ï疝²bI,+]ÃíÖræjkþÜìχáãÁÎONßûh½/u¢œ€2á?§ "JçIÃƛÂî§ï[ƒÓû½Çn¶K\ +.‡Ð5”ó±öŒ“wì©fÈÉýÞsÓ(¥.lÝNìã½éžqî¾8µß;lò¿mp‰m£+¸B[ä–ÎäŸ/y¨¬¡ä¿"1Œq&ÿ˜‰iœÉ¿]?ŸCtßî:¶ä?“ÿfœ»3i¡ñ±³n"=p©,8ùiú#§ˆ”ŒÜF~—Úòj §y‡u5HÓ¨"7ˆ‚”²„#ÈÇ {)ÆîÈMÊ7$ÊäÞà]Ôu4“ŽC¹z®àöÉ^¶M•)\­Ñ·óL`ŠÇÓ58ã¨?Π„–È´%ÞÿÝg¤ÙL´ý³¶¯±íž§k»Ø—¿èw Ŧ-ü>a$«ÔÝnò˜@ÓÒ4±÷¼MKÖ®Ïr)Î ®ÊOÊqoÞ[hùÇk&Îkî„ _÷]3·@è ÜD0k¿p´“à‹è•0dGæûYeBl&‹ÆR7Îeccìiî•BA\šÃ¯‘Ô‰J“€K¡Í=3èqѲŽMC Ÿ1îømÐV$r%kvca£§Ö&X×WÔW!¨§EÕP‡ˆüPÖåÎΚ¶ÌîÑüñ ‘’l·Ð|/Ý+»tøç B¸Eàʗ÷8ÝÒNNMç4¶*ø^°"¹fRY¸Ì áJf:DoP—ðæå Å< ½ÇIøu“ïgk2ÀWJ“_çœN~Kn;”š5Äuv%‚hÆƛïlÌ=/Ä÷ÍpÈ2śúCRk˜ØÅxƒÕ͛ºÚÂ\4֏ê_9`³¯pu$ŽbßZfòRéˆ>®àG·Ë^¬¤oçü²Ú1|0ÖOºœZÓvl#D“*Ýú +ö"¹ÒÑÞGÐZ[-Tév­¯ßÒ¿É_u1•nž±íȌ+¬¢Ã÷‚;x™ì naT1†ÖâÉC´|xÝ+1߶Ô:ÍáuPÔU7}ˆ°¥ëšÎzCp¥:—Sqô›_ýgæÊL,Q ¾D²šEzFhOœXiß[Û¿¡ +֋é•)ÅwG™¼ž³óu’©\òßT…r® +å¨ +åU!ÿÓªÐwUèçª0.E!ߊB>…|® y—„|®ù\ò¥"ŒSA观ÐÿEAH[æÿ¦ Œ;<„ñ/ B½¡ÿA(W”âfeéÆè{Ѓòé-öqís,€ö„6-¾‡ÄW ØcúùÄnßä!Îògª46¯´]„‚KË_Í]rVºðá—õzX…G.]•ÞŠ7nɑø›Vø˜6ÙÈ¢*$ŽCHŸЀ™Uå÷üÓö¾lÛõú°æ‚YÅf¹†ï!ÔÌ+á>#=à¶òÆO8±»Ù[ >Ô:´Ôc9šÅÉècö:ÉÓùÜcxHµ4$šõˆ˜iaØ¨U’¢Ä^62õá­H‰,dPšáCˆ†‰}Z @á3d©Wˆè¯<$èD¬>6¨Ù@þbŒÎ5Ì<½o’ÙVÍÒèþÔp<‰0da5ÙUÚ9+f”gy1…÷¯oØlßò Ÿ—\¬³ºdk/‰Þ®:'³Ûæ¹64jÊtö3bÝâ+"ƒÈ:\IÓÑwv`‚Q…ßö +*¹™Û­ͪKÃáäè~TñÍ]î8({èc¸Û^†£&•Àù>’¥ð1±uãd!þ(è2òÆÁ–›Àè›vè´£®†Þ~Bƪú~„ ¸rRŽ/êD4ÞÅպĕ¤Þ\ù&®n¸*Îôø‹¸‚Pí矀p}–kõDüé» tMY‘.uÖvt2x+¬§… KtQÀm ,N@lM5ps›*í" +¥àÌz–µ¼;äuëÎGÉÂÜz]E§¹å7 øÈÛFOR½J»¦ô®7ð‚œ7†^*Ó3Œ‡¹GFõåìcÆΠ ’x¸R’ېAP¶rÐ̏#¸q1]½ÖÆ7Ê%ƒþÔ÷ŽéËYbY âñ{aªàX‰ƒºoªá÷~œPÅï~ÿg÷ƒ›ËXÓa^“/f÷qQ`*š™+؆¯l,;3Ì1ø¬Æ5Øv_Çë^M°ÊLx7N PÛ»kÁíÊqR=c|·ãŽµ}Ý{áñeŽo[Ç+Ñ|âÅ8¦wu Á“-M-Л™ä%&m9{iS¶2×ìußa2bU3y ³~Sâ'¹¥&¥2ؙÃÀqi@Šn"#QÅÎql·ØŽ¬êےÇ{ñ Îe1gY<ý¬5Õ^3ËêG:^#oãÄZòÿljÁrÁ‰ï$(qrqâ;ü…­^}™ˆø úª + +܉¼FÂá»i,YRV÷_º¸ÇWô`©fôç8[¡°e¤¿TcKG’,Vyô£Ûå oVŠ×ÍjDZ¬èíŠÚ4®S É¢žçùu Zå³ÐÑ9Æ0 >_È8_±«Ðsþ“Ùâ‹n†Š¨kUnƒÒew›Ùá+ +€ ³>-ŸðLnê¹>`Uð¿â €Ï˜d»®æ%Mèª+æ°ÑtánCØõÙ?ÐSÔ«ÎÖULVwiîÔ½±fºä^iܾw‰U¢UI=VðžJ +ulI—ŨÈsøV6fT.õDÉg[¼þ֛°yM†*ež½z1mÒFqmZ§¯ð±õ'ÕúÜFÖâô¯ìûù hV7¡®§?Ùòþ¤ŠäG&kӁ¯€˜4²Äí\õc2KgZ¿á²ˆÏQ?tÔy²·8huüõ 8Pܕ‹"Nì`q–ºI!ùm’êˆÞsÀªH3㥎ÀP– ³%&W²þ†t Äßé–VיÍ&ÄÔiŒç6iGÄ÷bÄ£ì5•8óƽiã¢Ä³J¸”Ù}±”¢ñøÓä2¾%5C'ÈBûVs­5K7ÓíTýöKU)jJYƒ«no€í$[Ö7ÿefU®ä·ß{©œî?—¤Ë>¾üJD>Vð~#ÃånCÞkçl€Bk…T¶ôùˆ՟«ÅG“÷Þk»È¤dFp#OªÝ½ë;é[ +›Qg£\9¢}p"O8ù+~3·ÃÜ==œ™Ãw~ªjÕٖNVZoïC\{wëwGz@s¸¥Ýx@D˜²Ž“Ëþ„%âÜÕÖ'¬ª8šœ×þ„Y‘¬Éc=›ˆ«è7…?úb& kÚøÛGé7µeø:CÄ£U µ97ôuä–Á,› t©,DØ,´ÓUG醳dZLÓbʼnoú ³ñiIMPéþ\pÍ鞩í7Ìé*|Ýuý geàÕÓ}â˜on¦“iݒj8oWÿL0Ѣ»~ž(I VŽ !ÓY1{Í·/T“íÏ°„å¸À;c€ V;ø+šqљAîšo;¶3l…}A“;¯`nua˜+Š˜VÆ÷{pB¶÷ÛÍ⠜6Ì®F:npÐuªa;TzM@åÌõmƒÀסñI»÷Ÿ³ž ·· ›'̆˜6Æ÷[ØYG–§îUHcñAÎìCx@«p‹%Ž,¬¡îi;®(L?­Ñƒ°WÙmå âÈ5~+ØÞ2Dlõ°JýFkŒ K~ÉóXTëDIÔ7܂v²4Ï#cËÛôx’ÅOûÀ):®±´õÌaòô|ŸP.ZEŸýßðNK{þÇüì'ªZ²õÔà’dMÐR§Æ¾«s±¾mTot§HiOýº‹XˆŠì\Õ7ìÙ¬I ¡ø¯¦ö—Î)U™[óA ÝsNmQºDÂ:éÛü Û#ñFd(蜬—l¬—(KÓ#äÆâ ÊÕrevRæo¥¡Ÿ¸¨Í±w­ýÙ=]³ïÈߘ=•¼²ðãÏ®¶_IöÛ>ör”ÅùéX®…q[ë؊üܚ"J+N;vÕX-¡N´ŸÜ_u3õ›¦¦Þo¦ {ÄYHG5±C Èô¹òùÑ#焪ÇÑ1Ý1µo¬¤nŸ—G†Þ6Îô}Zx³VÝËÞ- zóö¤E:SSlyƒlD¿¶™¿2K íIŽšÈo"‹i +ýoê#’±ÿ¨Ê꘽oÒ¬è5P’ö45uZÛ³¸¶ò “$ô_&¼è[§dEN·Déå×à‡‰sX}«Qyþ>¨\æR*Rýâj&7 ¨›É 𶫠x_ªv¡Sºs:f«ýH%Ɣª<ÄP²ÉÉÅ.['†ïdEQ®|]ºPäWÇ|b˜P™µ`‰1VA%•ÀF~¥¢Ãê*ˆ£K»ÉЀÿÇx•#I²ë0NÑøZRÛyÚi£æþî@R¹TMÄóJq‘Äüý³y÷ßý©Éá|×R—_}kéÝnLí÷/Ý#¿‘‰,—›Iöèþ(xe‡å.¡›v±íÓÜ¢Tɼ!ôô’5֐ù¿¬`ü«˜)9AC=ÏåËû ®rJäü¿ ÜBóE#EâT×9ö@s áÛÑû&à©!}[ÑÑÀJrӏªnäbq”0bÕû}…ãfù¢ ÒfâJþ¼fÝ|c äкì˜xÕzÑØlP"VpeÖStãåN†þœ^Ďð24ÜÏa6˜ÙדŠ+"~™_ɉl›]OFü£»Xõºµv•‹†À§ÕXÁËæ—iße]OfØü4/bGxîçàÔ9eÚ¿æ€ów„ÑHÈÇ Wl žhæ¶þH8^¯—`$Hæ|ÙÑÅiN ƒÇž+ÆàO ÆðO1œ^Äó1ä¯'0ý­·3ŊÑwZýäÿ§ÅàÿÔÙúeº™¿®)|£ï[±ûÓBðÿӇØ>†‚û)ÌD]WþO#žã\ÐEÖ¶ùÿHC íäÿZióÂÿ%S6Ã—Æ B}èí_ôäW5½)šê“þãX'c~â"iól)ï\ã¸2î~RxV?·ËÏÿJâm¦8I¼°hã4.¶ðEê ÷R¾‚Ò£UͲù9Jýbì¸y‘»ÖD–÷êÆÄûÓ2ò5²xÖÕ<U»¤Ö9»®æhÇFYRv„­«ýiã&ã/³~¾¿ }bØí‚KÞ¯¢Ø¦nì¯éžDh䉜ŸŠæ‚7¸Ó •Ù¼— nÈÜäQý›»Z/f>Aº†ˆëÝú’㶻ÕިȾٸiÂP:ɐäùþɐ‘ëŒMUiÄÈ¡r§‚QõˆLf•rD½þ™%*‰,v~ñ›¤CfßÂ+’‰j£ÝHbÁ¨C$(~bþ³BæïóâkҘH–0[קé [}Ãɽ×OL)6f5wûë P> ZÂì¾¹¬'lš ”ž\ïhÅÃ:cJx@Ž^]tËwä."#ëYyÞØÊ°ê?û¼D+˜V"cϘîÿº kßHS F["®¶ãŠªêòëeèÅN+OD Ì6'R˂ Þ¥r(fÚPu¨y•/ŠÍœh¿R¤W†âdNô)ǏJZ܋V5’)7ó²¸÷ùýÓUH½$ÿ ¸+86íGÇýôò“ +Dœí cóÛ[¡õ,–PV–ãÞLƜ-píÓkº0Ûä—˜Klûڨö_¿[£*Ù°YœºÈVüfcX§KŽO¿ð‚žAÞnpïFwêëã‚ƺœ*°š£ÒßÕÄPhÖÆ@yêÒêq4ô&æ8ÙÌÛU`+-˜ZjaÅfþC ÖSl£Ö³w»zš„`>ݹ9ûsqž}—ÑmdbýËUj9ÑvÜpÒ-¹X²æ~üD;óEíÙ¥ œn;vƒ»-ί«“ÚÇÎÈÓqà‚'­u‡¯‚-9çèù ¡A¥€l©Ž'ܛÐÁ·œhh «ù`Vñ8׬àÔêY¡–ÒãÜ)Î £Tì +~Œ'ÔDIaAç„k º¢k.GƒÏ1ċšÞISc5Õþ´o=E±²— 2m³‡ÈÈ@—!I5ô9ÒóŽµn–"Á›‹z·ysÙ1î7§Q§~Z1$‡ù›ÿíJ…t´ÍtO…» fU9×j@®·¿Ìº9ª©UÌdeóûÙá+ b³f‹¿..rƒ{ó¡æñ€5*¸ +øpTrÚ$šF¿tL*N%쳈Ÿ™Îö@Æi<žÚ®bÕXöªL+”–#ÐËùßaZfêï˜ãËr+³œø÷E øI¬‡,ךáЌÚÈW*…R±§ƒoµ‚zSFˆÿã8[Cȁ3ú¬Z¦‚¬‚Ĭ¡Í‘ˆåè“I•El``•Wú"{âÙ3ËjØØê Ép=6æõ•µ% %‹7}" /—H.¡Ð€Ü£5ƒî‘„Â;%¹Þïï±»ÈF’´gRE: ‚—Tì†OLäú;Œ™+“a4ŒqTrPµã"†ˆ(ž+ <Éà+ tG9¨ ˆÍC/I§£Ö€‰k-ÝΙ@M ¾6ÍpŒM²È;ÊöÖ´KPê²i¼ÁiQ›oÐnòCr¼ÚH]É9ûx_¬|³×¾VN'yî­‡”›Ÿô…ŠÂÛç~l×i©Ê¾š´b(ùîsÒQ‹ ÿüæ°b£*ˆæ6ÓÕ±xã^¡ ×áþ-ŸøÅ9X¹£œÍæ.; Ý¢‡nÞŶ_¤ÓìÀœzÆ+‚+mø +ˆMQÉrXß`lfï¼ +Ÿ¸hÚ¦ >´L¶ Öî6AÛƒ /}¹k`Íåq’óÒ±S +¤ b»ÁÆ&Ö_&AGë¢"Þ,S]>7Áñ±làÍVqLºª‰8„@S©¾}Ʀÿm+OLŽÈ­häJJSwGI·K'> r¸? 6äQ­3¡û½d—‘ÅøT¢x&/Tüæýt+Xú3sÛú¶xÎvYýð©iG¯—^nÌÖ,˜BBJèqYœ †t.»òÂɎ£Ñþß +>£o±zV«¶‚KéƒÅdàæ´?~O¼ê@Xhþ"ÆA¦p< 0¢Æ’ó 1֙ ϕ‚ê\2&QfÉ:VÜG`Œ“ ÑU/ðvÜ +NL&`+HûW(èEÌi[pL÷aïCÁý”8p%ùv._› ÷G£•î“}_ÏElVK¿î@ Á{_¬Æ +jOi_[ünóv°7'â8â÷C0ŠÀÌpM/rôÔßàÞÝ0 O85±6·eȠ·ÜÿÝ¡âÿN²¾ÃÞ‰`֊>:û^ÁÛ#Œ 'Ü{­Õs A×Tò¸Ò›ò’2#µdPÙ=¤*_è´I ev´½ò:W˜z“íLJkÙ.ÕòǕ¢™–Re½Ç +c̒–µ>®Ø­¼EÝÁÉ+úOâÐs‰ºz”ˆ:}b–Æ¯5>\T7À°ÈàP°ìê‹¨¨Ù)í³y­˜ ìóWšñ¯«÷sÀè8±Ã× q(×Ô>àÃﶖ0Ø=?દ¯+ø?ãÕ®$InýþŠþãûáJ¡!s ßƝQ{Îú}e&ÀjVÍlÄÅS‰.¢@L$p£ïM¤OA}C"_ ÖÕð@VÒÛ×1%Wh™é‡Ü•íy>pÃÉÍ[á‘A¸Ù.Â1µ÷ë7ø/`£%²Ñò… ";Q÷¿d­v5ĽF›1Ui¬ëÒP³N¾¡SŠ¦F¢ŽÓ"©…5C½ø•5" ´6èÞ­d¢e+Ó-~zQ-ô¨­Üñ2w ̉ŽFR7e-:²½è+„ /¯4îÌÑ}XÌñVï”y‚ÏÏSH"‚?¡¡tMž3‘k§Ú~ÅÅÂvŸcŒþ¬ArVGÈzœ¾"¸j*”‰Ò› +§5CQÕMÅVµÙRäx.ðb+³-Ì\’VmÝBæSï:¦ž\+ñ¥º¼êBÓ>(´Ââ’=Ä×öˆ<—(¦…ð^Q:zñç¤úz,ÔɯZKHž.{~YK¿YªlÍ ÌÝ·3ñ]â* aŽŸUQ¾“+˜Õ0’(U>Ë;òŸgZ˜WÀ2Æu ÙuŒ~X”{­?†ñ>4æ·Ù"Çߍ$f~—/¯×å.YLþuمóÅMĘf*Ñá± |÷lLFuƒx¹+_#X „a=Å4D!±rV]2¨+Šjnç«7hI°¶4ëgÈÃØ^¾@Ëä×rà̘{ÎNQÝù]²,¡Pցâ÷I¢˜s. á1Îß +­­U‚º­ž¤Õì}¼®Ýҕ=³*ùCÁ߶ze¹äd\ᏸÛôX%ÜjꧯšL—”–A™æî+üY1ñ‰·Ej¯3ynàõž¸ýó¾ìŒëõ@Ùe©õVš©ÚpÂcA¼Ô¢´mù\/‹×Åoœñù)ƒv ¿ýó;Âø‰}þ|ýõh‘3ÇSä³rke¢fós4É1®Á‰8B×ø‹—ÂÓþþƒD Šÿ÷Üj§å=Œ øg¶Ú¹¹:ß/U—@”ƒÓÛß\‰µ2ƒN¦JVJ7ãl Áܘq„q_ “`ï–C–2qE¨Q”1?†0®}·l+r—r¼YY +†&Z"ê\Ì[G®*\G®iºÝb>²¼F vÄÁß•>::¿[åâb€‡Ž´ HÁ M†Ã$žˆ&÷¦tÒc£•bä‹Ån±(&´Åá(žAԚĢ2Œ»AiÚ*¢UB/†Ã hÅ]f’%®ÜpÑÜ¿ (n–C–É –¾.$ÍGf~Á»„}X=Å˰ЉµbtÃÃqÑ®bZÞøcȒfWÔ=ِZ²¥)Ævnâm±Dwѧgåñ ÙmLu¯\1PFُc·ð8þ„ÛÕ;ú<ÂÁŽ˜EeD¢E ØLp·Ø‘v® 6´0Ž@"n¼,ÀÙÊhú‘^ vEz´£Zp^PifùZ©–ؽ*v‹g£Ø•¨¼*ÊN²+b.֍™¹º‹ÝBõÁ%P¤h¢7Å@4é þúÐ6ÑO=Ü ‡ =Y(»‰ÇÈÂb¹F´¦J:AéÎ$WË!KcI ¨F +ž&r"ñ¢“™(ý¶aT6ÝÉ]Á́“G‡øÇïÏß¾ÿž?ÿ|þë÷çj v®y"#Øú¨¢¼L:ãéŒ*2Ï}`~ªÏ“`z ¿w Ë­lì6&VGð»‡û\0ý('¤WǞ¥ÍrÈ2RÝրŠ¿‘ —fQŠeúj9d©Œ]T”µ¦u{@8Pbè6ÝÅn¡ tÆ~.:6kx¢,YÔdöQÕÌÍrÈRŠm‚FˆSw:î<#õ’aq\-GêJ){#íÂxsTO‡­(ažéx[,E$¹Š—ØÞÈËG1Ÿ¹Ÿ)Ý,ôY›,‘„f :8´Tk/µ5›WKóö°[ȪH2’ËŠ™ÌŒ­Œ¢ŠkHW°’Y“ùô±[Xa`ænreˆÁÀÙ⒬‚–‡o°®¦nòÅpÈÐÙ&k"jÅ v"ɄùæÏ8çÒåáj9déÈ#-mÐÅP^‰GMW‰a'㓫åeâ‰Õ0ÕUcƄ!ܬFoóŠíU£¸pZ¢9ÔÚq¯Í÷²[çJk~#±®¡å,¿W÷3EÇiÝØÍb¼6z:-d”¬÷Õfòeçš±%9ôäÄöÆe°ùϜXӘ»ÐvÀ-ù×ÌÆ¡£éUô|)^·t»,ÝÉkØÑÕµåjò˱íq·X¡Æ[Kt=K×]žØ? +7Ëñ¶ YmÐ\N;ø󛎷(Übí\‘»åܙ»¼ïýeŒ<¯ÙXÞº!Žn•Å‹a7Ì-Ã{fa68pÆ÷šuËÛç‰ÏtÜ,ÇÛÉñÿôًªé}†÷S1‹Užbw˹7÷yßý­ò2+/!•¹Íˆ¾©ÊÛ°§3vÞ¹½õW•W îÔåóãmU{;6 Ÿ|<+ÝãSò•“E382uÜ,‡,!äݒQ–NrÁ4WÊÖ6>[Э§i;l5Ìù•ÑYŽ-ØRRSÿìšL{'¯q*–›åe*”Ó’Ñt{Î0iO_YÎ üy=¼¢ÃCݗ’Zõ³;¡ï¶Mv}T„ÈøõÑ!¢>.Gç–wD .¯QŸ”Y”¥BÚÆù•òL#gmTwí+:Ôh—5Ÿ,¢Ò¾û Ë/2V™1jçP';³R¶aÛrG,íoå,•,eyÊYà¢bÒPgԍ.>¿WµÖ›Åú{ŽÙf:ŸtÑÕ[ªIäQŒGž>yí“SÄZ¤Ø +¶Â‘…ä„Â$T9âJrq³f¡pQ2ˆZ¸FS.l›üD¥Ks’`º[,ŒÊ†NK‰¶†DBLýÔ`¥Û\>6‹ùHÜ\ÇeàÜ6š¦0âàxL£¿4ÜÅf ‡ÿ3^%I’ä8ì^¯¨”i_ÞS6f}ðºôÿCôpÊ'³§O™@¸(‰âZ0TUՉ·`HuaøÙp­ª 3ÉÄÉÀ†Éž ³N¾A Z+C¨’Éæ+š4©942xV;0yçèƒÂ-%l…†‘Ò9dÜØeF`PìóYƒAí`Øe+u\›š¶ù‹‘öÛEÊr¨UÍ{dâ1o¡œ]0EFâ3ô÷讹(ƒ›ÃŸÑFŠ[ˆŒN±MÆì-ÍZ8ZXSXŸ£³Ìïݛg Ô;^Ո\3W¬Ôž¡ØÅúpáw2NJ‚ LqxFt“J÷Bcàg‘äÑPðf.&_Yê)sgFFbÿµR„`³ãMFk. ­ˆXÌ*Ý_—\çfèv;èòõ‘‘”&Ȫ\!Ä$[áÍhG.zp?Xé1³ˆQô}JÁ12q+Íñv ‘Q’¶,сt°Z±uèèô <ßU]ªq2—˜,ýdWбKf kM)Ö1lmŒ˜Ëß"2x‹†ÎÜ ÒВ”¥ْY|»ÖT¶ßÈ\bhÃĉ¯™”ú„ËMŽáq1ikŸ$l’†ƒNM˜5h"ƸeË>hFƇUø€ÇÓ°ZQÆÍVÎ* >Á^ëօ‘Ñ9ÆVkjÃË 'û›„-Î?X6"#)Ï°¦YˆíRäØþ^Úrpª±‚9-9,25ÕÞÓ'ªŠáÂÉrݤÝÜDdd‚¥vTàÍ ±[ ï-¼ºöhS6N6,Qō¢ç¬ÖPÕÍŽñrÀ+w·ÍwÖnŸ²î2 ¦í‹=ºæ™I8óí@ÀBeG€­° +]èÞUUßXï¬áՔýI"ƒ')ÒKVÔÅN²*]øÊÔ15ÅÕA\$˜zf†Å˜¦uè­fFbÞó.ªÑ=TRB›- »g†Òa%$£=zW858U'Ó Õl³Î#Z)ÌÀW“‘æ€c™T°¶}u¼›p÷=Z¦s‘Y‘Ƭ­5cz*c†²¿hÄÀºd#2²a#G£©Ê£S‰/atæë*‘ÑUЦ⚜õŬýç»Â¼êÙd=Ëè¶ö6ÓëكY lìè +ûg,¼í7å̤dÂÌcñ›­[Y9³hcÔ!-±€!µ­ÈӆY6$Uы¹Ä śû°fu«M ‚î ÆR‡…‘{§ò%cEŽ³kóóê4ÈÞ§OâچŸ72²±uEt8%}Ðmô®ð§ãß?ÞÌEe(,~Š^ñD90Ürs‘‘‰•d´&­YM^Ì-ŒgÍn#2W`UFùWL盟Lƒ¢7ܗ¿è¨Ä>†ŒÐéOF6XîñžæUœåØÐ÷º¡Î½¢¼= ŠG ¦›w¤¾Òb!-à¿Ü›éEfÅZÍdÝ ³Æ6ÖTÛ·Ya‚°)¦šÝ߲˲Õbÿüû?çÆヹððÜøn©q¬5kv 5­‘}»±>ߤÆú˜çù¼[r¾}à™õE-H+£Li<3}‰Öåh-àѤ{{^c$Èn"2×ÁLÌ>°9ü=DVç0¡—¦î6"£›LäÍ ZþòîÞwÿàß?ÞÌõã/r‰­È‰“2çf´Q}>á¾CÁ ù`ND¿¼ˆ+öÀS>¯C>_­é¤ýÁ~ÒÀ\Ï9oâ¯3´rb­·©µØR¼Ô ‡ÆØÕkD­&¾jS¥*©—%Øúkm§³·¤ïX†*¾,2×Ád½ùޙWš6”qÏ¡âÓ6‡s‘é +^›?€v‘—&ÓƦ¬?Næ"3˜Ž8§Ã0T½JÙª1‹úÿÍÈDêª;˜pי?†®X±„.ºÚó½É0ÿ9£4¼ÒH÷„¾U÷dbÁyK‡ê[Ϝ]^t-a?D`ôdmKÆiQ%^{ÊBdÐ7ÍzrùÈ6b~ïr¤•·èÁapx‰¿:Ä×ÂßùÁ¿¼™‹ÌÌóX³Š|ÓÝæ¾¥‚ʓ‘=µfV¼É¤˜^í€[2èÅ\™–äÚv a÷}páx1:†®ÿ¬‘{›Ñ²‘{þ¼©% \ëe6 šÜ|~¾£ü|ފçeµ®ø¼Ôv}§®úSFËBâÛç5©´Tw„È4Ÿl½X]øçqcá–W#sÆä&ûñ´NÒB¿†^ÝG?™‹ŒDô½Æ$읙°Ô{ÊÑÜÌE¦Þ™MoÛ¸·¼Å7b XÈf7ˆ+–õšœhC»l>.öP¡˜÷±¼””ý9ÖÃÈÄ}“¹½±û­¡š¼³Ë»w#ïÜêó^s›Ätzð跇#s¦3~›ik8‡p<‡¥Ôšíùd¸ëÕ0¼—ÛǑ‘?ŠÏfàQ?FkòpÛÞoöýґ‘‰Y]Î×æLëÞÅgÑAZ}šü}“(8÷p ¦I¼îª@8¦Í»ë5u½V-àÌÞõn¨ɳS<þÿ®·Ó/W.äí6»èé¨äqÿ­NO%ÿÁ%ÿb®ƒÉz©íéC%o{Ÿ)]É¿˜‹ŒÍ#?o)op ËwþUû“Â0q2™¾Û±fno€(òøgPò' &±‹K{yÃeîŸ!o¸ùï.ä_Ìu0.äa¥ybYIÓ1„<Žq ìñ9X`t·y'6„<îêãE9¼áwu!ÿbd#°Ä +½ƒ:.o^ŽÒýJ‘Ñ+©ÕºŽ7<šO²màª@”Ž? 9£ïþ5á:þøŽ‡G§ë[”ª€uÿbtÕ½•ÄÔñ†Çxt¹ÁR{Hٓð‹®ñ,°è¬íçGȟYä®*Êa×ñp¯3TݶEJç–^ª\Ç¿]£åsMïã°9úþì*‘ñÈñHI±¡ìƒ'֊ô‰œÈÈÃ÷ ÌÌÁ +”ý +»œþx×´þÏJžõÄ&•ÿUMÖZ9FØÁ7|ÿ!’ǽ ¶FŒÔGi7Q< ~·”©«^ŒlLô§ÀX!_÷¶À¦Êè¸7Š_²/âû_Œ¯݊`oÄhPąpv°“p­ „EŽ»N‹çöqŸü= ½¤µÍ¶7ô{fN>(þÉzê?ŒÓ=mž‰þ‡Ûo˜Ýù:]Dz9õ·ÌÂòb®À@í®ÙH8ÃÓ!²‹¨L†ùI\$zւdaü_«%¹–؄νŠ»¸ô­!ËpeÖ$“l?ÀAÝH¾vê î㸅ßk|ÅKÖ·©|Ví .«Š¹ –6Ï.ð4ë"!òdψ<]GDTGµÉkˆNxÒÙÂn×4¹u¤fbt> >œÑkÝÎPq&))B['׏š‹T‡E)æÁL®¾æÕZ=jŽZú4p1âøy¢ïˆf¡g2~#sÔL¦Êw„-ÁͽxÉ(±ŒJ^Ë:ÕÖ1 »O¯ê¾vŸÑóÞ5 2&”ƹ?Ëzñ½!SËZ̆ìU}=̼ +*"܄b(gòT›Š+ñk^ù‘½žj¡I´#bü„×3#¾ÔàA‰.Jpz`èìíáNæQäT#t“‘æ-Ã҈¸ÏÛ~f9Péæéâ£_–äÄ5®¡[ÄÕEÔ«¼¦€pI­æúÇx–Dì}ÜÉj¬÷Õl ÿç_ÇÍYo¶/f™N ªºPIòÙWú(õכǰµ·ònd™t#ؖÄUCòÁÅO¤ZKS„>­·ü„ée?’­ŠÊìr<ò˜”·{"°ÿ’ÐY Š =–ùáZ¢¿6†iƒ†„íÑ–íòAæ*]O´Ò'ÙºB_h7Ry˜+»1ž¯¹ ‘5ë@ڀB É#‘I?‘;$ª¹Ó[D ú4b˜k#BØ·¶b}Ž™/{/s#3#©uÛïÃü\ŠÉ5·[þú8lŒÛv£Jtë^;¦¬<¾Ëîˆo£Â²†3ÖT5†6Y $tDä +Èã2ù_}4#SèZY/{õx&2¹v¤l›Øw*2AÇài¦NOjÒÖ-rïå–azD`zmc;“‡Ñ4”Ožž«þ½XXfÉÌî(ˆRYŠã‚¨ÒÌ X,꧗µÑôò9+ú¥²É%5wPD®€TI÷—)t±ç–+]Niº#—!­¢ÈR]T­¦V±´"mË2âKê(ÛjÐAÆã$[Å­<\GD cÚÖ²! 9F¹Èè'’gÃÍVí’):˜E#‚Œ›#°n&÷ñˆîjÊyZ59ÛìÖ;ؽ‘+ Ù6§åWÜ#ë€i‘ü0Y³\í(–íaYDð:ê3œ‘6`±Ú’E®:ÇDŠìÈeÈhÐ:3ÎÁcÆýƒ<<6;rä¤Ÿˆ×æêήB¨€Qá‚F±4Û=çV9ïÜJ-/wÜ:¼‹ ±š¸çâe‡‰PmšJÎ&ó b³”‚Šˆ\ )3 f䜑vã‘=ígt¦í ŠF煉l¢üÎUwq£×“§Ôœø Û´xä|«ˆÈµ!é@°¸î %ÅÕÙè†Äí}' Fs¨Ä·ì¾ Σñ?gR\µõA=wóÆ]¥äÏ«q»è]³¶2©‹ô³_ûöp>ä®l ô E#5¼æ†%«Ê:—üõq"—!ÜêvfZ틬"I#ϸ!ƒìÈeHN8Rgrk&W›ëÜ=wäÚÍg3cBžÖ´Ã'™ÁSÖóי坥3ú: +ñMÀáutuåðϟÑ[¾àv°ú™dOHs±ú%úuM·,”§tß¿¦²®Vã¦ß†PE‹U•e*9-1ª*kO~Ý×lj\†hƒÞ‘Úik˜BÙK{‹<¤ŠÎüDnªú ªj. ¨ª<'Ê.ªº#ÐÁùõ0U–næÉúˆnó–UŎ\†TšÛ™¾È1U‘½c.¦º#Ð1º7¸†3c‚uƒ©>òbª;räö˜¬§½Œ·ÈÍUoÄɪÈÍsÀȪ®¸N+¬t$9ÈêtμF•.·¼M·õ¨•çLZYÓ̘­gßVäWcOÿ„UCñuÄ «<Ño×JcÝé|‘8ʙɝ‘+ Õø‰ié«Ú™õJëGʌ-Óä2ÄKB9‰ŠRû¯›{Êo}è«j؀ˀQx;ÁKÖ1*¿s®Ý&»Šˆ¨á{g´x»?Œ×Äæ+&÷j*vä +ˆü‚UØ´`þ•;ò=DՆö¸Ê­ +^F góØë*Jo&7g>*CGD #ϺInÄnb_ñ Â#ƒUSX™(> ¥¬*ª>¥ê"? @ú°¶9½nu${º˜ïÕØ2{"©¢ÚŒZxé©>¥Èc«ØÁs9ÏpF©¹s\­Ø£ˆÜcû­¼àېéHvO\’'"_œóªìfQkNיÎUjâ®;¡""ž<Î&g&”Eƒ‡u 1ÙMïˌˆÀc­iÔ~9\²;ãlh„†Fs”"ýØÚ½›¤Y¼¡å4%:¿õ³1ðäÙlúˆP]¡ï}mo*'©Š>d¶ò-ʋw@Þ7dÜèíë% þ¥ñ–q§6ý¹Ò% $ oÂ?V@ VP+–ÝëÄz×Ò¸¿üËN´16_,DhúVä© ‹èLµF+TܬP¾ÐÜ{Nè(îAã’+väڐš :+­'*na4†Ûîuây)4î/?3Ž5ã¤WËtadÜ#“ifvL³ü:AÓ«ËÛE%·¬«å?\’«—¦þýóC¹Ä뿯¿0´ó«ýýrÉm¤9‚ð~NÁ P¨÷cë+ø¬ãû/üEd7I‰ÿ^ŽÜHŒîꪬ|DFž5É#>ÍUÈzõ׏Ü65T/ºÂÿO;÷úÏÃ5Ãٕ¡¡ä.Ú¬÷=ÌIڙ¿Cê9¡–õ·`Œ€r (P_W ¡$šR¨ÃŸÖ¡>îÔ3˜¹Jo5€J–£'A-ûaÌ2üú–ÇÍÿv¼¨kª;Óõ°f¯ÕWýC«ø¢;] ™=ý±ôеö£Byà[ð`mۓ —k–²GˆÐæÉ‹ ñ½hg¾¨ Æ—Bägó•°Ôu‰Û‚$Õu‹÷Ù]N“T™q Ï!É9m‹ðt*aPV;×6ÆAȱŒ@¶  +?Ö¶í‹môk)`Vf…JºÖvt™kæærP‘RTðÒ±ðŒ¶ínX<üVh…àÊ$£À £i+¨kÙ×iFNù°–|ª ò*ž×(W»£RK “›ƒ™»’­-罍ßÓÑYIS%÷U“àf—Ì ÔÀì¦Ò ¸¢ñ‡0:ÔZt|·?yDÚ ¹ºX•)»‰7ª³Ð÷‘XE2A ‡I¬H•PËdv¼Sûç&K@s 6Í;N$ÛuZÁ!Y£S`ë7+ÌW ÃPæo&š²¢$þø÷Qªù(û/UÿªØWž*ö·ªØw·×Ç%qqAvjjÈ%:È&2p’Á„bXÙ^3$”¢‚ÛruÆ)Ne!‹/‹ŒR*P¹ø8Kà–ÄB́ùþžQ«ïñpöЮäÁªÛ$½{ÄîKnQ–ÀíúãêãZ‰¹¢‰B9`"#ÄC#6ëÍ˙sjl—¦ßwí^6ùa˜”³ÀâÌÓîªn.º[Ñé.vދ“d;#† ¦Û>[‰{û}í4ÇÆ× ,M…•× òGe.Êu喢Áü¿˜Ú–s(Všoµ)¹5ÿ©j¼”’x±>C œEb Ù õu*)ÖÌÉ¢TH@/ V6Éh™Zä`¥”Uá˘9AÄØ¢f‡<\†'FpÆBPj*SMwÈY9KìZõJ:W' qý"ºœ¾²\ ™ ¯B—ÒÔ(8üL¹9zÒ+¿_ùý§æ÷ƒãÀÒÐ o ¦ó1ÃI<ÃÈG|¸,—ßÄ_?õT»ŽOòfæÕ¸xü`2}|þé“ÏÛ=žt†'µ´EÞ`Biqà«Z.¾Tìz»Á›çk’Î) O¯¸¬ëfþ¯صÈë×±þçfç»8*¾:̸Ù’¿hÙïâæ÷ïäè§dh¥„ŽË{Âãîääjì –T©ËšFðŠÉ[±ÜËõ?¬Ab ɹa~=PìÖóƒ+\UxzŸ{8x~B/(4¨h‘¾¶,՟i>€v}A½ÝXß"ÖòÃî͚ö+¾˜î?ß¿¶¶—¯~é+ùáã9»[g¨¼$¨x)Oï.#_g\¡¡ÐǾµŠØüÓïÌð uôÈџà~Û|üñÃé|Æ´ˆú°ü3Löïx‰_Ä£J@8‹tõ„u£TÍgʚɔ ’F–¶ì&¾r̍m¸ý ¶ü½yÅØ×j4uPØcá†RÈz „Ư-™›µÈo4/.Ȋ¤aÌnC…l \£‡¾É¥kÆZæMá¤^Ýr¨£´4{5é¡¡y¬Mç¸$$;I{†øÙ°$…ÕC(µ&²”}±o×˵C²M“æÐP?]0,•\䊸Z Ê›ÌD–Iû%_MPÒóЂV93ûaJ/ó´[QÞ*ßUŠs+Óëj—Try/£²Ï,つ—`Ghju”¿h¡6‰9-¦^ÉðP ®PâÛ‘Cyë¹t4’˜´¨ +Ãðê†KJ¤Ø»LáGp¶€RíÀ2óa÷2ìñvéÊÀ(ÇÚ2½·Ç¥·ü§­Ø¹FZ¡²”€dKj…ûyŒr rA–ó÷^†n“èö«y€²OfªIgñgÈø™öÞê±÷āàtŒCù£Ú1ZJ˜Vçõ¤¤Ý#¦‘¥,¬hÎß´O‹¥+À9FÌî=Ș¼Ø]½=ì8ƒ91ݕíÓãwœÅ®(E"wG©â©¢Ú-¡,pcÊV»E¸¥uøÓڅ”>_s‚Œyr¨vWö\ö.ž®þݤ£s3˜S‡ˆ4Ôô†¢Ïç"&¬ìåÓðÈèôEú½hêES/šzÑÔoCSOB +’@ +£Þg¥fÒgŠbPE1)æÞ>YIÃü,mób‘Q ÇËIŠъ'YU ±_ýq±.­Ø=…Ì< gUy¶ZxFVB¨èÈóf·3¸Gm$.ܸ÷*aB㒠7qZ#çšNïÝ¥AKšt~¨Œ²`/~×1Äъ>[U{fE³iÏݝ°K¢¤H˜$”3 ‘ f7Q®ßò 4¦ijÒ@ÛI­}©”ÎÅà!Š7@©{$i0¥¾49±­^Í\'Ì>2GŒ&G·ò–ª³‰\´â‚"q§l÷U»w9ååÞ<ÆÍ@ãÍTÔͨòXóÞM·{[¥F¢*1{ڌ•” 5ò.Òm•‹ó£ ·§"֗—¹Õ͒#£›IŽÚQëËÙ`åq‰Î÷딑Òý¡ó¾ú•ÐLB?qôV£J4RvõsJ/R.]>Οj +õnT€ÏšÜ7÷¸­¸+øŠ‰ì(· +Ûho¾fÍ3~{Y—¦:Þ¨wóIxcå­½}DPµ]Š…å¥.6s!ЦK”ÇŸ×4ÌhÖ˜ºŒÔDÀ\îmɔœÌÖ?tâd@áó{îSQ/mêÂ#w›À®¡¤×R)Òã‘êrǖ&"^’”Ök^˜|ØÈ +¢Ž"wœ÷~ åëtðŠë·ŽkòÍ¢ZËQÂ@j?òFPÄ`éÿõãqoIí¦äXœÛCÜùËHc£*´À¦9)kˆ4ˆˆ‰’ ?N¨¨b³qñõ`îVÂø2¢ÁDÚ§uŒ¶—Së·#RçíMϱª¸Ffl°bݪQM™šRȲåD]qr²X¬î?€©:TMôî͆ÝñM±ﮬ^­#ÚÝ}HŒgÂùÞYÿþÊûWÞÿ_yÿÌ÷C'–¿S¶Ùbõ¦üðÉ] +è&ÑBuâp¯QÖÖ-[ñy‰Úd4¤VûôIkq%ܖÝâ ËÐØØî ÝÎC‹w7aõC×}­æï§GÅÚÒv×¹ƒE|ƒbm°VëRK›߸æã“M ʹdR¹.ãý€úŒBÞWüýjI®#7‚{‚'P…ÿÖ¯>c&´Ðl|ÿ…+3 ¯»)¥aÌ GoCv>t…údeù™ÍN;gè‹ýK󊖕¸¶²ˆK)ñÈ¿X7¾‘ÂJó’¼YøùÓÍîÓû^…;\o^xëíÞB~ê&{º¶¢)w4 “§6ˆ‰5‘=ó ×­ ¼U´˜c+ÇÕ4$r'FÁÚI—©`:%ºåœêÔJ¼µN½îMgM=«9ÔÛÊ(¬T +û”1‚®¢2&K[‹Ô+¦Bø CU»^sƒ/ +}Ò4¼”½N²]ÇÛ!á Çͪvݸ†îÀïÝs4ÿNX}<ÅWàÿ؏›L¥£Ó(2&†²Ì8ϤޤŽ3fa ÕJ†Ú tìéÏt­X­KÛhxìŠö3”é⌙ÕB§\Òµ¾ ö믈\IßcdÒN}œ°ª³[ß8Õ žAýü*âf]ÍAR‚!÷£ÿëg¯Ý}ÄàOÁËJð!ktD!£æìByÅDU[t‘Uf†nÓMµ. VƒåÖ af’EEJ¤Ú ©xˆ.—¶£+z±¸k¨ªXµ©Èñà¡ð͘ê’ìiž2I²±èÁZ(A6(Öå2.M±ýã"³ÝËÅ×¼šg„WÊQUæ¦væ_<–ÏËó >ñ¯Ëß²ª[ãšú•+(l)Óf ;ÃPæÓß(9¢býƽeyº˜W(«0{=ù54Cäxækͅÿ^\)`ú­|ïÙ¿¸]Œ!kðÞ³ ÚŒ†÷! O·ÇHO'*4×}=`¶úŽ´d,Ù¸°¶T¡h +~àŠI­sŽÒ faM’ŽiÌ*wk{ D.):ˆþL¡áÒBô;f>8¦€©sø2'ýÐýVvw£ï°®vVh¯…#R™ÆÖEj'ug6twPBÉø­“Λﵟg6¾%´2›.ÞkƒMǽ‹A>=kçB4Záˆæiç™$¹“K ¶­Xkì;MêNøF°k®B%%< +óÌödÓ`YÒ¦Ã=Øx*.f.”Jh§Žë„öèì™Ñn«¨ÿuåç +)0Va3Íêy@²Qº#V—ZऱƣmÁ"œæŠ:[|«V œÒ/šÙÒ(ѳÍ6¼˜VÙ Qï0¸‚Í?GÜڔæJY°·3D¼(}ndÂg5taï§Å%9ÙÒRÕg©º(R)™do%¨¥`å(v@hݺ€qfâ¥3*.Íðï²B˜º&™ä\H•ì:Züb,àR³”ƒ”Ö#Óza­B§*7¼$ÒGŽµâ¾¿åo îAx“ ¿Íx>ŜJC \Yƒƒe8ïô;â´¿ÐóaÖ¼r>}uÏ(Á¡_þê.U–¦0øß'÷ڄÎ3/¢V½Üòɽ¹®ÏÃõÕìÜù+÷ø×þùäÿþ'Àÿ<)Á endstream endobj 66 0 obj <> endobj 97 0 obj <>stream +8;Z\74-lWq&1!M/0ps'pG;7e-AN5;9)E=2$&N?p=K"fP&7tB)sY@&V?Afml$QJIj\ +MGg-+^mi]fogSdJZnL0P"KQMXbZ.7E]Z;Hinp,Yf(:G&`ArWnjYS,'U*c^sgs*1A: +H68\-;^J&862=&s.5`Fojn"Y6;:p_*:*14l$*[96bUD/NC2:-<@C??!XO>1)XN?4? +p(`b[^SO(2#%_oe@r\SiZ`k@*&a_^,8!PMt&5Zh:jUC:qdTA3[RTULm!f^gX?+I>oK"\# +Fk1N6AQ\=:Faq#--Rfrr0tPXJKg$t\s$0$j+MD9,INL]Un-$MYe1deRQGBlMREqo='L\p**4djW('c\n71#j\k" +Zg:8YV>>$lim+=gI,XZF",I1^$e(NMKi endstream endobj 96 0 obj <> endobj 67 0 obj [/Separation/Black/DeviceCMYK<>] endobj 134 0 obj <> endobj 135 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +1.4578578 0 0 -1.4578578 574.2424927 394.8018799 cm +BX /Sh0 sh EX Q + endstream endobj 165 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 168 0 obj <> endobj 162 0 obj <> endobj 169 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 570.8743896 394.6946106 cm +BX /Sh0 sh EX Q + endstream endobj 170 0 obj <> endobj 161 0 obj <> endobj 171 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +31.4974937 0 0 -31.4974937 479.209259 384.9256897 cm +BX /Sh0 sh EX Q + endstream endobj 172 0 obj <> endobj 160 0 obj <> endobj 173 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +32.8737183 0 0 -32.8737183 484.9260864 384.6470642 cm +BX /Sh0 sh EX Q + endstream endobj 174 0 obj <> endobj 159 0 obj <> endobj 175 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +14.5059566 0 0 -14.5059566 548.8777466 384.4988098 cm +BX /Sh0 sh EX Q + endstream endobj 176 0 obj <> endobj 158 0 obj <> endobj 177 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +22.344265 0 0 -22.344265 523.3276978 384.4988098 cm +BX /Sh0 sh EX Q + endstream endobj 178 0 obj <> endobj 157 0 obj <> endobj 179 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +28.7369194 0 0 -28.7369194 491.5461731 384.3908386 cm +BX /Sh0 sh EX Q + endstream endobj 180 0 obj <> endobj 156 0 obj <> endobj 181 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.7787738 0 0 -3.7787738 566.690918 394.9187927 cm +BX /Sh0 sh EX Q + endstream endobj 182 0 obj <> endobj 155 0 obj <> endobj 183 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 580.8320923 384.210968 cm +BX /Sh0 sh EX Q + endstream endobj 184 0 obj <> endobj 154 0 obj <> endobj 185 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 577.7244873 384.2381287 cm +BX /Sh0 sh EX Q + endstream endobj 186 0 obj <> endobj 153 0 obj <> endobj 187 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.9013809 0 0 -0.9013809 576.2424316 384.8041687 cm +BX /Sh0 sh EX Q + endstream endobj 188 0 obj <> endobj 152 0 obj <> endobj 189 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8369412 0 0 -2.8369412 572.9363403 383.570282 cm +BX /Sh0 sh EX Q + endstream endobj 190 0 obj <> endobj 151 0 obj <> endobj 191 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 569.8287354 384.2381287 cm +BX /Sh0 sh EX Q + endstream endobj 192 0 obj <> endobj 150 0 obj <> endobj 193 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.2857869 0 0 -2.2857869 566.9191284 384.6765747 cm +BX /Sh0 sh EX Q + endstream endobj 194 0 obj <> endobj 149 0 obj <> endobj 195 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.8279291 0 0 -0.8279291 582.5550537 390.0325623 cm +BX /Sh0 sh EX Q + endstream endobj 196 0 obj <> endobj 148 0 obj <> endobj 197 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7065377 0 0 -2.7065377 579.3574829 389.4421387 cm +BX /Sh0 sh EX Q + endstream endobj 198 0 obj <> endobj 147 0 obj <> endobj 199 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +31.2286072 0 0 -31.2286072 487.5593262 384.1472473 cm +BX /Sh0 sh EX Q + endstream endobj 200 0 obj <> endobj 146 0 obj <> endobj 201 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +1.973617 0 0 -1.973617 577.3394165 389.4664917 cm +BX /Sh0 sh EX Q + endstream endobj 202 0 obj <> endobj 145 0 obj <> endobj 203 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 574.0306396 389.4108887 cm +BX /Sh0 sh EX Q + endstream endobj 204 0 obj <> endobj 144 0 obj <> endobj 205 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 570.8277588 389.4393616 cm +BX /Sh0 sh EX Q + endstream endobj 206 0 obj <> endobj 143 0 obj <> endobj 207 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.5208943 0 0 -3.5208943 566.9191284 389.9049377 cm +BX /Sh0 sh EX Q + endstream endobj 208 0 obj <> endobj 142 0 obj <> endobj 209 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 589.7988281 394.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 210 0 obj <> endobj 141 0 obj <> endobj 211 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.4350855 0 0 -2.4350855 587.3017578 394.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 212 0 obj <> endobj 140 0 obj <> endobj 213 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.9013809 0 0 -0.9013809 586.1159058 395.2606812 cm +BX /Sh0 sh EX Q + endstream endobj 214 0 obj <> endobj 139 0 obj <> endobj 215 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.1624177 0 0 -3.1624177 582.6931763 394.6661377 cm +BX /Sh0 sh EX Q + endstream endobj 216 0 obj <> endobj 138 0 obj <> endobj 217 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 579.8527832 394.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 218 0 obj <> endobj 137 0 obj <> endobj 219 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.2928212 0 0 -3.2928212 576.3486938 395.1330566 cm +BX /Sh0 sh EX Q + endstream endobj 220 0 obj <> endobj 136 0 obj <> endobj 221 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +32.4982376 0 0 -32.4982376 482.127594 386.0359802 cm +BX /Sh0 sh EX Q + endstream endobj 222 0 obj <> endobj 58 0 obj <>stream +H‰ìWˎÉ ¼÷WÔL)™É|]W|0 Ã؃? ±¶Ï,°«ƒß$³ºª%Æbwàƒ @“Ñ•& 2?üíãöá¯Óöß>n·´Ù¿=Õíß·þ1mÿúl?æ"{c«³îyl¿þtûç1™sÙĐl­Ê.­´M³bªèv³©o·É» _×ðe´]êÄé4~þöXö Çþý8¸]UÞáà~9¸'ÙÓÐúëÁ¹íIßåày=1NIç~°\íuŸ­þñǦýz°Î¾ÏÒރÓùrpÍy³¿Ã¹åz®ö}ÔþÌÒëÁ–þ!¾ÊVEˆ{ú.Iü—]·ÿlgJÝKÿºË»îcˆ[㯛ðÅÇÓʦüS>|„´ß?ãØíóýç›æ} +X6`\ËH×zß^ŠR]ëÁòÐþ¡Nn/RðíçoIãÄÎy”Më.‚úqÜ %eÛ@ÆóVàŒe¯øãà~Ãù5-øR îc-r8ɇ˜›17–àǒÆÚ/æÚYÓZ“Ö>Ý~}[Cl•mÇ1hD×ñ0ÀöË|ZKlÈ=m@“ªÝs¹õ<Fd7å!뫟¿.ÃîF¢³oìGpsÏ'¾”½ l ÷*¤ÀÞåi,Íh½'±»Š»­t;xfCJÛÒ£¹­"¶µsÚìÑ|¶ÚNÜ0fMζøKÛÀìó°%œEû}ô‚ ‰t®ûø +œ«x&¬á§'gU&WÎ8 –et''"òºƒ¢»Á ä ¤=€3™ßʞ¦®U‚AÒ{­n±„Ó¹ö ḏØ:NkQP±²ª{$}!)bÄm|cVƎHµÜK ø¬ÆrOà8Egçs°ô°Ì‘Ý‚‡¬¯~~,< {¦"œÚóDylHV™—4‡¤Tó®ÚSŠ)e;ÔßÜɱ*€‡Àœ°ÄÙvÚïå؇E$Šy×¥HÊ•ÇU@¸·Ê,EÕïع¢äÌÂÞèNyt¹k*\ۊÚ33âÇȖJáÀ¹ñkOv\•|BCÄçn»fûš˜~̳Bƒ&µËo!e¡¸CÛóÌÛùzØ¥Är¼-„Ó-¹ÅíôTçmuo);ÖÒCCrßbu,|þS¤úJø‰Ët-vëìº+ᯘp€0~J² Ö¢<,yu`c(ù8DüÅvn²Û,p`$èùø†xÓç&©0Óµ2¸øqô@¯ ‡µ˜üADÓ`Rjø%œI%ÆܶfË5ƒøÃZ ^D*C¤XHŤSP]1?É1ÖáBA„š]„§Œó½Ú®¼‘vñÃÍ]¬¸K3ÍÎ-ÆxËÒBÌn&®)ód+3è´î)Mèžgê~#ô“:4)2iիȨ1=úŒÐL„ÎÀÆU@’†ä6#´z_b=AØttdr-QXh}‡ÿI«ÈÉh«¢¼- ú»`fJFá-Ïõ.e2ªT]õž_‚Ï¡Uœiéâ5©qȚϊ_—ì[ÿÆ0ö⥙Œ‚ž¤ºú’ +¾y;64 9-qÕu {ª%†Þ™¸‰¬mø)õ³?AXGÅ#ìðá߈4³“º|ìàÀ•ñ€ËŸØfôíêÝgZHªì0ô›Ùù½™ýŸšY¹v³rjgõ·¶³zigõ©ÕßÞÎæß¹ßÛÙÿ·vV.ý¬|£¡=¬2²çjú$*s¸¨(›&v0ûUv.[Žøæ=¢ØŒ2´ˆTúD2õi‘ëBŒeÙ!Êúm/K’& ‹äê”[±ÆÇdÛt"8âî ÏôÒ;i´u¥ðV‹ÜŸe,üjZ0ò™ +^rÒ0öÎ\2ž·–Êàð˜sUtPÆ:‚èܽõc¥h–YÙm´¦)o±p5YßÂcðM)ÛÕÏ1ÔB/¡‰{'Ob³ö”©b‰Gå_ÀŽÄv2=†ŸžŽ©ð’ÀmªF¤ËçZêw{ê¸÷Ùö;0·]Ðô§¯EâÝÓ\§Š?i¸„Ù8Žý¹æôÓZs´(Y†?{|ˆ|ó,M“ÒÏ70^+àYDgù +wßÝÝ¥Ð&mÆÉ*¢x¹ã«¾.«žƒW» ¡¢°™³.%½Û‰´GÅë°ÌæÕ¤ R¡¼±&€Oâúî϶ê±] sBË ¦X²ªy7U)¸×[ ¼x¡½x]'æ&ºµØËù<0«“­}Ï[ uµž â}er‡æ3ªîõÀÕE“oë!¢6È8·¢eA¿F]=ùqA ¤V;¢U^ø…¥^ٟŽw"—¦/\¦KÌôr.~_ñö‹Åø´Ï(ՎSÌÂӚW6™®cÖ8føl1ÕÈÙ©£ DŠqˆ9NÛb>Ö9µÆˆ^1åãœÃ$b¸¹%%¶«ë.û5G¯Êö@§å +M@9áÿ•¯“šcȘˆ?«å™GoZND]Ƶ4ߦ÷$Ãê³9Ù]fNҘéò<ݹáOGš–?ç<œî¾aBÇ~kìmïXðõæÝO@Y +Gº©,:M-mX£8-à†Ð‚øÌC+YÇvå峒àUÐ*zäïúü{êsël.† ôDGqòk6V‹ý_l—b]™ï7§+‘¢‡ã¸À P 1žkxˆµÅ“tRkX\ЁÛnÙöÏu½á™p{{Ȏ"²§ßK|6ÑƐbö Åïíà~ u¨»cOFÓÑÜ]2ÌPƒžºlRÿ„t½ÞÐÁjFPBvÇ1œÚv¢dÓNÿH=€¥Œ›M˜,+óz`^£Ô‘] Z¡Òù˜|D ÇXýIæƒ+J¦ ™êQ¥\lª·—°!/u,¿Lï%…«ҥźV? +VFŒ‹¸Ût\¡÷§I¥:¢C<û¼h馣 xêµyòÙ/ÛýH!W—‚øëOüÈJ„FR­Ò?03†KIËNu¢Ùt¿ ±ò¼¾ŠIÕZy µL|à,67V¦G8I™jÖþþ1ß[nÝ<•IÙÕ^ªy‰H ›°?y½q¯[)2²š|™6RÕmû#V¶,V¼:„¾´ìIÓVÕÔw’©z}:̑dy=_ÝO]šr¼ööh…¤c¹˜Hi—GëX«m +¾#zí†pnPÞ!S8ý?o5ê<_æú ” ÌS¥3xV…òt8ϬiÏÓÃ\ݵ}[~:´:;òJ«jBœWñ•-ÃæՃɎœ Êtæœ&8¯Ãºsàµúž¹‘øï`²ã™Iæ<ëŠWÏ®þÕOä3/ç½ó꜈”žuÕqíX-6ƒÞË/®ÇÛà¨{f%DŸ•³áY=Ëâ-‘‹ÿþ åb+•i¾Áh¯»¡½ò*–ÇI1“¥ÐÙ.À9 +ýsñ`öü½lÎßïGÄãšPy¸ùÂSó_ñÔü¿xÊTŽ•œ´˜JèIUÅ3ë7²š¿“Uþ'®úwd•®\õ_PU™,Hx·<¸|ôópœÑX2ѝwÉù @T\þ¢ŽM«:­>!êq§º³6°,3&˜ÌŒ”vôr}8‹Ö(²où§ŒóµþþPæJ1ðKÑΨs¦ÌBŽˆ5ú¸qàT׋h×H½¨%Añ£òÄ&lÕû‰$güC=÷qÙï➽öÑTìPÀG¸êú̄qú ¿6FR¶¨h2AñÄ{Áº¦¼Vs$v_=Uv¹äb)XOëzA$î Pé.iû^OÈvÎecÆê¥u²úß¿F²xÏ&ÿrLkA;wôÙ¤u:+ ±€¤iÏ«bƾË´Eãë&ðPѾñÝÒ䷑ýÙØe!c{åãåLŽ/V Inȶ”tôY½aa¤¾…mG¾? hŠqª9oX³—SÓ%EœÁׂ»œ2râŽXBÓú€ò€xmÖw8V…Öà”ߣv@¢2÷Œ"Ú¼E-_³¯¬oþÓþT7ý—U ©£ê;6%q†?à&qßíÃâÙ6Œ;™Ê~fþ}‰áÂrŸ°'®È gX[eáï—;Ì·ÐÄ-¹Ö ŒÆÐäs̎I|ݲ)wã‰ÙíëL–­­Ø-[øNUϪÒW…ÝØ|˕r‘cãFˆó½O6¾+9)Ðm§'ÖøƒõL¬ö™<‹ö–µš×­P?ºÇ +ç#/J!?]k|Ñcø_^e8Õ·žÞ0t†? ¥Y¥ÔþY°Ô†¢·ˆ2¦OמȓžºÿgƒkŒÕ .|X§çLÏ?ÀlÚ¡(Äè©iåà0¥¨ @ðÿ¶âU¨O ז4\´YÅ><9_ïi ³½PŸNU$Èg>Få±î5,h‡ *¼O›¶rSÒ5•Ž]žŠíÓ9¸Ã1-o¤·µ¬ÿ¥ÜdÂ@# óPz×WÉ +Üíj4ÀÝ(ŽîŠwœ7Š¨EÀIžtøõ–v¤¶ 1`Ã÷ôƒµ>:ŋe"S÷¨vÙ@¬ø÷s^›}?¾–79½î³ ŒS( %Dãz!Â/Þôz¾Ëukú†k¿m@w;fƒhr¹Þ†PÇÓö²ìÓiúãôXúŒËç‰×$Ÿaŀ˜^zÏ~QLA!ÙpÍÉöcÈʒ[Î@pRëLÐ-×ãÄ~<°CÊ¡“k}6ÌÑiñ¢zÅ'&¯V/*ã7ŒÈT2iøzÙ@$ã×؍R‹à¯ ®âƒªnó‰“%òk¯·°HKz¬'­0%Ӎ# "&åœÕ‘Ç9}nÒ^pÄ*bj}¼Ã2ú eì˜ëØTÉi‹:ÚxªT¯p5Uãˆiܓª±šk³ô ÊÎ=µK Vçž0ʘ˨YˆBJ²²ä%³¨Óõp×;2‘9ć=˜òOSw‹±âùJc: / ]؝¶ì¾l'ØېµÖ×M[1"ÑB6KtË@ÎlÃk°¢Ñãžòf@ª§PÌÒàôø‹¥¶ò˜õ´°‡ª>«”§E«tø?F¼üά§ÅˆOJD֍Âw¢¥õnbÕaÙý [""3mÁ,¢­¨+Ä)‰ˆ‚5¶*ÉÀ-¯›…ÇÓ±ZùÍBb0l—C1Â5Oùê¬ëú²¨AX êê…h}ç“ÆqL¸óԍ2Âðja熽Syr'ãè…q–÷ 5Be謰°öÐ Yà×ò¹€ã3ݼ¶püõ±±G¬Cú÷[pº¡àMV‘`¨³.Ãë™-¹Åæ¼[°nì²ðO|ZŠßqhž¥0fÈæéâ/Ǻ}õ24µeÛ»dIöè{8¼çq{bù«´Ë€¢ÆFþ¼Þ¢æxó—,O‰ØT·ó’5˜ÚM>˜]1¨æŽ… +Ï܇ö Ô™ÝÛf„Ìl—H–q™ïPhüô|ƒÏÏtÐ1©|­/øõq°¬®îWà „EòjŒã¶e€G8ÇI8Db4JqXØô`ï…#$³d«´,´ð0¶fUD[ꕒŠ{Œéç0 5D̐ujôæ‰)əãX¾4\§\1ªNM2#nm_‚ÃQ~CѸˆ®Î­^\ã—à È͑öE_æÞµIÈÚ¤4)™‘æ˙¾«[غ½Ì2zûÅÂYW‹¸šWM¾˜ÐãDgíÅâ9³±íѪ9l®œ+ó‚ÏɎeã„‚,ßæ>Ð5æ—gÉüV g¾ÅäÌëZ)—$ãqY`á“ËBFPZh”qI+A…½Î°¬3®î·øºëMr[ö4Î-ßô&äDTwiâ1¨™ËPjÓâú„ «eMÿ'Á´WT¯ÖãZÍÑׇoå8¬9ÁÖaC?³5€;‚, +ƒÑÛÇDÁ0µ2»‚,ýf[Á»”§’|~žbχ?ÞgÚW쭋PS:²ê/S_œÃ)ó¸‹Àî—Û‚øOõZ;E^žl3“)P^h]E×Þ-h…6IgF«3]ܒ¬÷gÕnE+P”"-Þ-ê[ˆãôD$Ep|0­ d¹d²ÀˆÖ³ÂÆÚC3–ÅØs¯à̸÷þú8§X#ιm…Ç=8#3no7[ȌsJwö•]wÍâpœ‹<ºGg< ,xî冉A×ÒtpG*7×M{Ñs„5bÑWx\‚3Í®ÄJ/Š*Ë öl·7FzK̕Ž–2mËëbÉ èF˞õ“%Z_e>ýG‹ºƒ—|œãäYm·Yï–h¥üu dY¾ïôÔ؄¹zé“tѓ÷7ÁX¥-hÜÛÝß0(C-¬†? úÏW÷ßìºrηVµ…º0Z ¢„£;¢F-âÁÿ±_åV’ä:Po+Ɓ™Çû0cm(e„jÿՍ€LfVñk+Ô«  AG 5²Ô ð~µ}\Ô&VÜ@\c¨Bj¥µ€¯hpmgj˔›¡šÛƒrQÍõº,Ç׍¡«Œã¸±'&…dst­gø/ScB `^beDŸË÷3ø¾àqÝŸ0)ÄYØpO^ÔÎÁúÛ:§= +üÐ/0µ¸Z©õý¢Qì'©˜ìL³g‡Ò› ˜}Lô“Yia¼Ñ¦YÌ F–ê,ÖquCÇ£ìS3ÕÐ ÅÅõdä/™ª¡”KJk_ÑàÚ<¢oKìæÜÎ׺ÉßV˜ÞÜ£€Ng=&™K”í¬`%]–š3A¦®FßéÚg$¦²#‘ŸØ¨+»7ÖùÎN•}ú2þv ړã”ð ž¹'{rbDOÅopYM/§ØêÍ.?!l¤"á- }ûjš6tâ ¦ÔQ9}=Gz%îµFÝ,×¼©‡7£ãöIÌk:ù6›V!Ôcߣ폿õ ìM·ëUÎ +ms¯ÔÍpñÏC·'¥›•¯•ò’üPF—îèíˆl#Z·ŸpÏ)¯ý ³ +ì{m³ Óš^ÿ4ë9R·ˆB ÷?Vð|Ð+ê]gÛ%‰.ÁW‰[ò¾$ä]WúЭU4{›;pÚh <"®bGk”Œ6B E½ÆÝ° xCҌ°±%x"-Ö{ˆ•¨Ö8ek]Ù:Ú3·-yß$ø¹¥L™?IÛXX!ËàömR²j«×>OO‰½¯T¹¤ÁÏj™ +ßdK•„d:˜~/œ“ 9'ÉÐOj@€x#ÇûŒ?Ê8Og·úÄê@‰Ý¾L'–€­âxÍÈòíïýP½âü/ƒï$¥Ò1y­˜_Ê£ƒš1Zfcá¯!LL›ÓŽÍnÍÌÃAý‹G±ã¾?ÊkC˜'ù$ë<Õ.'r'@x«%|ÂÅrÃíOÖTóýbØòÍÛló¯Å{mÝZÔ+ÑÌn|Ø0–ÌÆSrY~œÅ$›`ºgcec°¥–¥eÀ—4_«:ä´ë§oº–µ¨#óµ\ö¨çš7S-’n¦;vJæ.Yùqícèâ> +ÿ¨—¦£½ato³ýÚ¼·Õz] Œç–>fÖ¸ÖÍÔ×ÃS±y[Ió?öûð°¦Q²rQjÊôä;¿­\¬qòƒÂ`ê½XVAMÖ¾¤©«¸( zSrŠ½¯%?C~Á€»÷Ÿ ˆ‰Y\oŒüƒfµ’•O"Oëqô‡ÀLÖþ1áÅ®ªÆx Fº¦£>=¡†ã+ÉÞ_+)Ÿˆ~œW)Ô×_Œ(¶H;¿è³ÛC’µ~`Àé½_ËЖRhÁã[Ww¸4%-ëEgW–ž5]MgLË¥ÅH‚öO-­…HS»ÆUZs´'^æÞÇt(Œ øØo»GASµ ¡]¥ìý0UÕÏ— ºãXʇøkyyòjr'¬lM µ+8Gž¿xšNß]£xáÍ¾¿fƒG±Áo´-¡þŒÓÜ°Žø‹úù‚¯¯É^®qðRÿ¥½ ­®éK ØÚUL¯nðõµw÷ñËXißmÇôÎÜ~œÅqŵN/Ýc~86#”muÖkõ8ôK{Á½Ùô?¥ê(¦Ý‘_ÊyQ„:Šíîãnš+ß Çä‚BªÈ.]¯ž‹xCžñ|EdžY&}÷C6ªûÑÄF—ãMzOò¬DA Օ<Ø4Öv¨| +ÐSÍsÛ-¸gŸ*¢b˜ÆäQOÚx±æãDD[%¶>á†Qar¼¦? ÓAXG]”o¿É-­ö[úÝ°¨ËÂìRê'ÆÒ-Öj ÿezàSÓ¢‘n4'õ–.œïÅå+å Ç¡)—R3è|YÆNâ‚tˆ¥¶‘/êØ·4ÅeÎÍØ×a<‹ç·ŽÛâ.¦SË|N&„ö>†‘`E˜¨‡¡ž.Ó[÷Ô[Ä 4†èµ¢’}_ :ޜ§šÆPC57W҉¨Ú[jíß,òG(·Ÿp{ ªAîO¸'¯Êví¾bdiÎ~y»‚Šãxo*#s¯JÐ9ôS"†Œ®#âhÁRGG3#O¹×CI–NfTomN†7‡à|qÄ=šï‘æÔØ¿ZŠ‰èvc5¨¶«Nk˜¢°Ç,i”Ô`{ĪLâI®¥©]Jµ<5Çý¨¶©IP +S’áë:–ä‘2^£L£8,,'cY¡½rîÍ*ªçˆFi­õÌ7øCûPå¢ýÚÑñµ-[À|lûÄ ^=,cøz†Õ ’m’oGeë3sì›40pˆЫ‹ú‰Ò§³ä¢œ9»õÙ#à=<ü èHü-B·ð0H –OŸ·h6/ÁŽð«}ûÖµòòí+ª»$ê:Q +l3*. 6Eÿ‘¦â,t6Ÿ| Òή `ß_FÅ ±åP1«'íõeH<Ê,cDÿ1·_b€=Ý¿×BmW²Í—I¯/0<Þ§šO ¤¡÷…·$Æ}>R²ª ‹ÄwGkæÚÁÐß/æ!ݺ>ve„†ö„Á*YIùüÜïMFÌ#µ¨øà…óãû" ¢Ñ’[Q=ìԕú•oY¾¦æÛ"ùX?§Ã&­äÆ~¸_F¦1ˆ„‚w*c??Y2‡•—ÆÓ§tM@Ü¡š´°¿œ¹Ë j(ž±‰¶O-Eï™ôõ©acÁ÷½‘Ibý0çrARzå x¤uBlthL)ŠÖ.ë Š'>çê8½¨€Ö® D˕.¼¼Fˏ}Fﮊªp [ÔEFƒ¥žf4'ÔjÇkS+7K=¨ýc.Ì—N¬p·–ÕÿÚ¼çky£Ç/¸ÖX³±ÚÎ×/²0xKÆO±!µ¢±=;=‘fÓýû´ðäÍ>áêq¹OjŸސ¬éõ/ùÍG +mZÛ;ú‚ï –°ZÊú.`7UÓ½<`ìÅg0Hivè ŸL¥xã9ëÿ~YÌӝy´¶h'Ò ¨Ìãu*÷ÃXK®ã›yf~Ò7ëðX¬õg½ážþ€ÌocWæ³p"Šê< +' ® ˜²¨(ú¬¿ÊÅ gÒ+Ï酳E‚|…³2K ,xpñ%®”¦Ã÷iÁ&ƒ 6´ádplP\p^\°v&MR› ƒ,Ò݀Ç:pƸhf¬è«ëŒ(JBq––Å¡“ªµ¡)ñ¡Ð€ ˆ[ˆƉÏÕ¶¢•c×„Ê U$‚úaTá8‡µ®Æ>ñôäUš!§åœQMRàå\rÌâ縠ŸÓö4 žIž mrý’¦¦–‡<þ’¥åWº|™Øp6•‘ŸßÅG¯wi¸ƒf[×YN ®­óņ;ˆC'¨±%µ.º¥.ª I±;JâÊM‚ ïâ‚z0èQkq»å©Ô'•Z’÷MB«ìle(w—˜ïýO¶Æ‡5u`ïAäg=4 +>€ÖŠF2J +n+§ __I,ã8+*øÖ^ÐV×t ç ÝKWˆ§Ù«Äôµ»/Û\ûnû‹¶¾ÈyüËv•cI®#1¿OQè~ܗó”óœû»ƒ‚%¥%kŒÀ•ÚÕ"AûÂáC¼¶sHëýÞû;‹ßž½àÞn5@”e–³ñ²çUäa¸ûê_¶ùì»í\½Yƒÿ¾‡ ’#ò-Íù+Mäë9úýã{­^7Ëgތ$a7£ƒÐEé=’¼Ð®m„hQ5!é½V¶ö<½ !ÒgE²_R€†×ººdˆOºYùK6’3Kf”ÑTZQœ“HL÷#VŸp…ªý ñÔôlßfÁ'D֜#¹ç–ƒEšàœ1ºlý£IT2i¼OëÔ¦sˆ¨è"I°ê™G0€ÂmÿÝ QO®&­C§àHéÔFbm9@€·—z_}~×$m…à_Ûyüø4s¤ךŽèH=îN—>ñ4ó÷ + b.$±†¨€Oçï Q¦zT{…!G‰4¤Æy˜U×j˜»·’¹ü•2p´O+ˆRmjGóðôu¬E3yua8ùâÔ±ƒôÅPð?;ŠŽûö¡ŽxLpwUÒO'úkÅÇ ”³„yىnñ‘ãº;;Ïð¼vŒbœ±c¿+啪ðԃŒ¢„ÉV·”‰Øô…?ãâÏV‘±æïñ•$õ…Á•£«M7GøuÙgVL¶q^6\bÒÅzµ4=cm†ä€Ù)´Mùļf9Ð û5|þçÈk5G¿|+ÇAS±+²‹èy*ýїsê{=!îlâfõªˆ5S(xðÛ/"›ags0%¦µ í³ÝÝ"NZÖ1B°t9°ž†M¹ 9h‹–Ú•d:²_‘6ó•“%ŽŒ#×%¨²qX t$JËBž·ŒÉ}UʕÏJ˜ˆ±ÊXf"z*‚&ᒚ@s? Âír¦ªÍˆ‰;Â}Ìt }@ÝST˜õ í1ŽÁ7¨k\^;@tʛ|ãæXÞ©œ›H¾S¬/Åx6t²¦ëŒ¬S³¶ŸQ¨`üý3ìyÚՏ§xM^P‹søj˜8Àž ~ێÕ1Ü7÷îËTN¾[ŽÑÆ"çy”ÕÕYhMn:KEm9Îb»AF^ýp§Ñ¯Ù îíVäžjϞx›ržeP;íݽÙæ³ï¶c¸.[ÝÔ¡…ÖÏdÛj°«ããsÕæ÷˜kNºŒ^ՐB…opBdÏ5ss­„›Õ¹á“O{Ïá~Óæ-ý±¸¯ô>^0‘¤¨:ˆœÝ±QöîÕE<âŽQ]Ò1ü#+ðµÛ{­AÎ$ÏVÜfûý¨T†‡äOle*kp•…I¢Z&q¡©Heñ“7Ölãë7fÇD”D EõvöÎDÒÜ +·h™yÐúDà{_½Ê_cnRÍò³¨#$̽Ofá,9)cÎÔÞXã/¬gú+kÄ*ò-Ú—î.rÖȪ{ ¼¸dxßé%æ8Î2bŒoŒµ³Ý*zê{øú;G’|»øY$ܯ ™b=Y¼Ë社º{íù̍lÝM÷lJ¡[q&\jîe X渧úÜŸv3–¼=Ôv3žØ½NŽmÕ0罋7¸zÝ}¶¿º3mã‡IÇãLx²t­_Jã ¯]½w[ē{Åâ½J"¯0ªHE-y…µ‘Š)›ہ™×ԂQÁIw¤¢¹ˆcMªÁÚÊê%‹«­’¸D^l/$.æ{Ž ¸®¨'©ÓƒYôåÁ«fº ‰¼5¹£*^Ì¿ß1Ðf¯˜íPv˜‘Š2’ÿZ<'ÎM®pÃØ6¥kø┣0ƒ­?’j!pËPô’O]T3ZõÔýΩgn¬!‚Ÿ úÝàaó˜©JŠ9À7R08c +×ó0Ù¬y­ë“9›šÃÝ_Äå(-H\#ÆÌkïӉ3¥d“±y› d~Ú°àÝkÚäÊM•µv̅-҉‚‚³)} +Kõ}ü éñ#Jø" +½ê*ÌÑÌ®«{À3΍2Œ"Ф%â½EÕ:¢ÌV/öu˜WM¯Ö¿Xuü‹ó +}Ôû k›qµ£×{]嵇0fl+|Äa7Wxœã—çh#=N¦<6Š™­Ù§Ø©U–sWòsÆvŒ@ANãZaãódjAý©ùçZ¡¢–•ÛíÖÉd…ØVú +sè¾gw.ªº%3òŒ÷gñBÒÀÑñ—RÜ-Ÿ£ªášõ­%²"óšSûÖâ,^-H„ïìk»­òné8Ä}ïÕrg œ‹&YBÏú®à*¥ +/5Ó¶Ä0‚%– B¨²ÜE¿1º±S ’ ®š)îÌXiáÏÂi )4Æ Æà±iF/øŸúõóSì2nµÙÊöÌù¬4¤,*X é*êðÜÎÁ3q*Y¤¢­…ü`¤ã8á¶Õ"Ô7ô#ÈâëæXq“žo ‡ºSÇ~QG±ùõÊ­ÇÎԂ{ø~ñ „Jԕ€ïÿWêÂ|c‘"{™.…)ö˜–â±zroi»¨´F½â>BºÎÚþ, ޑ†³w§ÛåoV²T›ÕŽáQ±­¸íÚFˆ&Õ8v¯”Üšéhï#ì¾¥‰°(õµª€Ü[zŸ¬ñY7SIZ¬ÊZŽ²¼ôèð³ Š‰ýüé÷`¤à:ž03:>k£] ýŸý*ɑ$¶÷~Å|`ڗ÷`øÐýÿ«”R™U¶Ï|ª +¦HQ—à¨>¹>'!ÎA뫏Ÿ6ŒL+Ä-é%nÉÏ%‰^…¶Ò»ÀœÃÁP¾ Ðþ9¸`ZÊ,pÿbm.öiœ8ŒÂiÁ$ipAl•&,7û” c0Ù}ӊñkèÁýۍ’ýKòs“6pc¶lŸ$ÖÌpŒ„!û6Ég.¾øyúÜ×[ØÜ`¢`Çk(A£á™£ µöþÍ^»"FÊ`û,̬Ü…4¥Xµ"ûA ¦EA³üü Q8UŒAÙ5`cL€¨æ]©a×w¹"',‚0\ ÿ\¸[Wnô˜? šõuÄűáC°U´å´2 8¬3¤O‚Áø¥déƒÀ†¥0O•7Aeý\/%xŸÿ*Æ<7Î0˸Ӆ>Oºp"”…‹.쿋½®æöŽ³ýíïÅ*Àp‘ŒÀÖC"Ç앵‘Eí‚Kz„PtôRc+ûkf‰YšŽdU\¸eÖlj]¨}Ûz}­]…—wÐ;=}}©lŽ;t>™'ùBÒhÇ„è ÏõCêܚ¹çŽM¥ˆ2«CLñŒ¡1hj­ï*ìIñ欤ë«u¦0·¦£mwcîêšîÑÍßÓÿ"zgE¥/ˆ—“¡ÙO´·™r"SxؘÆÚD@Cçë›@×r´mnÌ¥¸¼¹¹Êµ™[ֆZö¬q´ ?Á©ä²pæëÝ ={õa"²íßà^¼6šÇÔÙ@¨­I­ß2Þz¬Ud+£ûëð&ÛìôF‹P‚rª̤ê-;š5K!+¶è&()«‚ ÔS %ËBÔúr¶s »µ­¾áëË­©$¦ŽÂQͱp L?$¹öf°7íŸøìXnÕ$ý”ó'íÄØT ? +rr•Vû'åsLR<ö›`m»ïu  #0¼X ‡fÑs+ÝIt¨3E¼ôø³i$º~\ßéŒk -â°i3*>ظ½kÌÑfŽÃR +4”¬¹üьñ+€ÔH/¨„B·a±:`eI«Æeg¥jþ‡?@Ê̒÷WÛ\')£/¼Að襳@*óº0ÕͶ ý·|17Р83Yñ²$y¹ÿBë4:øÏÛä48YU¾`¨³ÿ·Ái¤ûàtbä^» N'ü08›ÐÕñùwAk^*ÐÅ¿Î÷®!¯’Ë‹í­ë¡W½ÑÔ4®¤ÉâŽØDO ¸¢´†‡ÉÚéVÆZWմܱá T¾WÊ]zTß]ÃnŠºÉÂ’j†BN é,Ü0‰¼ûɽ=ÅžIÖG?žÀü0*øˆü÷=Y|­|«`ÜâPå*29ô}¿ÍêHÁ"àv^æ *1ÏkÜñ×Je7g³n®Áð\€qf_WÙÓÒ[H6¹Ö18òÒ´ê²ÊÿˆZnH´Ü‚Êé¢Mè?š0Òf¡Î¼‚ˆjöëÒ:crøWW% dîï¾x1EhɅÓ9l[s>/—ÐÑX Èc|–ëœíH€Ù–ÚBûr[é(ýÏҌß!ôëÍp½mrW¤usóõUØ@}ú·©°åšž÷„¬jÎÇßÈoÌüÀkÉJÞlª(q}¥ ÎÁŒ*|ÏRÚ~£B*-'d~÷ì*ëÿzo l„µH3=ͥ馺{¤ã¬ÿŽkðËâL¶8Iâ¨î`óÓïÂf2³‰õLÂÒY°+‡vüÒú†(.KKÀMŠTrN.…š]-˨# eüêιæÍU w7קE¡ØO¬0¤´÷ÒL[âþjiZ/MG{aÐ Æ2£rg] Wó¼êckÝ\}=C%YHÎ2õ{‚k¡²:âP:%­¹¾áDV¹—? ‡€1áD~YâÉ#ü¹`aÛê‚Ä|b3ݒ0­-,Ú[ùŠÕîàYÙÔéA€ôÆñ@vm9*ƒ‡ÆDŽfP1Y½R\Ì5§­¶‘uì[Jq¹ssöu8 +úË㶸°1æèÌÅÕÑÞGØê[ûãzAƒÄr½‰¢«Áû·Ä!CJútìÛIm¹rsT%’\1&Gû®µ;ü¹`™M„½µø„;Zl¾Èý ÷ⵑà[LÖGWwŒÁjꞸF·‰ë†3ô˜¸nðÃą †Õ)¹G®¿WúŠ¨U•—Õæô T`ª6㺇®»3þóT‡Tá>B|yrIៅ­9.SÁ¶zƒè©Ì ŸtŸ?]ð@*²¦Ø¬…ÕCS ÓDì–h4nüåĔò’X÷rþç‚!ª‘8Saõ_yÙq€…Øa}Û4òp7;ö”»µß©ÍßÕ¢ÖdúÀÁßÁ§Dÿ‹ÐóR„É÷ÁŽ‹I+Oh½i•±–æVF:kà°{@5.Žc>ad ãâ6ސ»ˆ— ð鍋e$Š8g*ö WYHgLü/yøTQÓ?.´Î ‚ +0Òî¶ö”î‰Ô(Uá¸) –Q™qâF_涉kQ¨–Žî¡ÌùŽ±œ¥„ ùĖrq3Ù¯õo×VÍ@Jµ§×Zo×Ö{^×Ö9Mee£ev} •ÅäƒjfÔWë4e¡GV'g‘Ú;O›¾ÇHþç—ZnTAjl°ÜÙÆ3œ06¼Ag +R×Wy ¶ß5öXØE¸wJ +1V«Ë½Þ%ˆäIÉ°’=?JdÎB6b&Ñ­,³„–¶–+§fG<±= '–S’¬ü^ŠÍ{„Ãç§9¸~û{³¯éR?°o°%˅e`¹x?ÄëëÚ³Ñf4›NŸmK`³¸ÍRçÏ]—$ؓ^ÐaïçÖEŒcÆeáÂ×ÕE¿\z±-¸—sÈ«ÑÛ*&}­bk Ì®µß{ˆAñ#9æ(\Œé[#YŸAZºÞ:\øgc«º-ª¡#ÂÞð^_ífã;¶6ãEè6~^vµévÕˆÚ¸Ý:9)u+á{6¥EH8e¡£ø·ÌjïZ´áàW°ÿSs¬9"/ÂVŽƒT‚³feá¯ÿ]Ì\Zº OââιlŒ‚æÖ +ŠlþµO¾S‰i ØMÐ=¢ÒòŽN°H°ØoLäD …g‹ ¦¹É#^ŸÊÌ4ñmd´ZÿÅ~•\ǒð»£ø ŒŸö%_æÐÎÿ:H©JÕý3˜‹-Tk¡(.À cê’<Ì<¼cV:]‚í˜(BG/Gظg Zª¬4žÈ¨ UΝ4=#]uÉÀ&.øZA—³XXFFœˆê.]SÐ<`ÄrÖw8ò¼O> ¹qÅlƒÿpÏ<&JŠB€I‡ +ß#±ÖÏ,ƒÎGSÌ ›LlÓ´øaùÏÚêÀ³ón87!¯M ¿6†kZ£óׂ·Ø2v}@²ùûC2¨££E*=ԅ™nÎ1¨ÛfÝÖï -†ë؞qLŽžÿ알¢qw;áí³ï4«'[ªp3»"U~î«y¸«¼uÔ=æ×çr8«ÉK¸ˆjkì·áÒzHšÚ.5š:qE’ün4f¶ ñNhEÃ3¾AÛKÝãê'ª0©¨íö¨uބƒ5ݔT_Óðr]ՑbßüȳßÉw‹åªGú5ºžÒR‰G–"%`5–Bì ¢Hµ¶Õèåé>£óÞ ÍE§HéxƸ ¸‡Œæûp=y^Ľd*ûá;¹è ñ”§R­³î€Àݑæ|B©­ô§¦À…=n4Ž#:ªÙ¡Ú¬ŽqúŠ°»å¿_d?òqaç7dv¦E¶rÉÚx.`yö…Ù¿zZë²=5×1¥äZ‰“êÚUãŸ/?Ph™Å%w¡tEx%–"+5„yj“µWã*+ÛBÆÚ +| ÙÝecÑE þc®²5ØvÿlÇw#ñ1¹ wãxluòêέv¿€ì ½VœÎr¹@Ûç¹dð̶–-´ëØSÐWFuüýftoÛ?¹)¶ê0óç‹m¶*úlÄM›·G{Þ; —š¸ £~S¹%‡lÙÀÞ܌„l—.8‡%‘Þ³”¶ßˆc»Äúv÷ìKÖx½7BR!qŠ¤D^ “¦oµøñ™Ž“:lX×þ_þ¯?•ì9WlXÓV÷J-÷!2LQaÖB}B¶Ób%(µò„AkršOXW‹Cx–ñ„¦Œ†ù„L°b“å义ÈÑü@WSG%GYrO))ºUX|ƒ—ùs [œdš|ÒÙIB¸N ‹$ ¾ú÷ø¢Þ#úU›Ÿ?p ¿@kŽO’^„ð6½ÿåˈÉ!>|@¨„¾ÖèäO_Zc7 ¤¨ö¿|ñU ýRNyÿ²ß«>}ñ;$†^úøe¹‚¯t‹ë4¾ëhÖU#›Õ׫ .~yGÄb8·!&/×ë'\ú\S÷pÑ[ŸtB‹, zN`õw0[µrjyÇFRŸ$áh[©¯ï%Ãb]†ù¯©;õ±ì¨- ÷MüE+–5íönH="¤ëW4©÷JG{ߍ»qX­t‹{nöӟ¿_FÒ+Öñ¦Gûa8<-f͜ÚÆÐ=3X¹ÿ­ûª¸:³ï¹ñ´fυ˚ÃTS :²5‘?š¾Áׂ`±ÙÃU5Õœu$…|ƒ>ÙZðÙWc¹ª³.ÜYÀ‚[\rِÍ#ù¦Í8ց³ˆ÷žþ€Ûa ©cîɨ ñf}gtã59ÛØhâ(þ ê_Z+4ö݌Û[CeœÚ>QÈk?G +$žµ~u³|åa¤bF;Ž‹ÁW±ÝЮc É¢ûþµ¡ÿìuö!‚@M,™«¢¥€m¯ ¨uýd†ø¢ÃJ+" (t2/bèåˆ+Zën3>ហ¾Wûš˜y­c|‹¶‚”º‚­WRÏlا[/õ!Ò§uß²>ЇP*‹ÂP²N†²Ðˑ1<íAUù†¡)ò"­Üka–àn/ÌGêT6uz\°¢Ø†îD5ߛŠ“kO' ·–6³Fs">’èJ¸†’fdÚ,‰¹Ú)ÂÚ¡ç'gò¾`$ˆ×ÍاýÖR4¢ãd?OÕùLÝX—xÁs Y°Ê¥X8ل “cª@önê%–_$½¶(±rzb˜Éûõ­½Á¬`³GyÇW<Ìï€Ejìµ ]ð_./9YvùB“=£°2{Í6¦3«t²_àc¹’#ê…@½PM6&ìçïb€^+c!?ÜWm«¨¹’³ú…#Ý$Wòp ýMr•ÂÀÃkŽ„Vß!ӃrÙ¬‰*ÕÓÒB,·ŒÞøñ¡­U6ßg1ÊYØB8éYòuAšÅC^ΟrçgÕ¬Oþ~!£Ã†¯1©±*¡pŒü×d¾ó}ñ…Ó`ï£ >k@e¶ ñ9S¦àr cw…ámýýj wÄ\ÊKŒ¤|W ôæV }öC1œ8©°ÞÃm+¯·T«NqÅ#ÔgÀÿ¬~Ïn…ÌT@ÒsªŽ‰©(c¼Ûëv+&¨J“è¥9GmÚ{½H™ì;S?1÷8 +šªS͕²?ôÂÔUðƒÌËVâWr«÷©æâR‰áööœã»©< ¸¡£‰œéÉB¿&je Š®ÕŠP¶ªBhd—wKT¬m>§GßÊÆÌžb(\¥]ëۗ•s{ XIÐ[°öàf­þÐÆBôŠÉ®räiÏ!CµIvì½ÖVvŒ!;ß,«˜›ÎÖ:©Âɨöo¹¤·ÊØIÂèû>¾k¹;}oà k~ÃÁÛ<©Ð5´ˆ–æj¡>!¢vk°¥DëkršOhUA]ŽÄë‘âp˜¡=}¡›,'ŸÈMDç +ÊϪŠ×o\o<$]zǦOø‰×¯ß$Þ]á•Cá՛‹w‰/"¯"oK>y§Æë‡Æë·m©žîV;¾i¼xˆ¼òyãyñPywó ßtÞ¸ë¼rê¼xzý.ôX–SèÅSé=´]zÂCۍ'<¤^yH½Ñ¿™%½{ég‡êà2ƒ‰í?,Çúý ¢Nä>¿s¢xx?0<}€¨`ΐ „5°£H +NzšJч8há`î4ՆY÷Hðäû ù†:7ÄzT(ôk®OáŠR§þa°9DXÁÜ0ìüLÿµ> $tM¶ž¢ö?ò«ÜJ’\êmE;°ûxö”2BÿꏀLfVõ[¾TH‚ATDù&GÞᓠ'W™Ó¤XL®Rê'Á>Ö»|œ«Ì:…Îöß54½áÿ× +:âêƇI%MÿŸÅ`ö_„oÚ íŽèP ¯á iHµA»†&úI=7UÃшž/“r$#÷MIU¢8(ËG$ûÛphš£grþ„¹\õ¡†™§á0ú;^ëÍm1â{‹¿ÕýyW‚ð1Ú¼“b¼Ið6‰{¶d›ð¶‚{æÆ/h .0{׊Èy1];llg@ãLL„×>Î3 ¿¾.+֊ËnÛá~;C¹¹/¶ì˜Eg6<&­®cÜîElg–ÞŽ({Î>m‡…÷™[‚É®›U¶CF¡/·{›ïÌ +_±Œô XW¥´÷j¹m‰|Ywí䓇œ…kNr $Ý$)0ù¤ÂçP6³[oÆ¡cCãå1‘¥7µqĚ"m}½"-6ÜÝ¢"£?ŸäjJŒPÎVçú ñ<0M EåXÁKæc‡…í j,I’ç÷Þ¢öŽ©áVìËʵÃýv{Êy3—ÀN¦;OÍêþLõ¸™á—|1æ¹­¥ÕcÇÇ©KB’¿÷Œ$ƒófÄæ=Y±W,»×÷{¼ôÊп¿²½^9¡ZwkÝ¿ å‘ÓÏ@{‚f-Ÿ¦Ðt¸¸DŋƒYMšI`BnÎ>š°¾^&d”„aiIÚqJм8·eXaq¥¦ 8‡YÐåZ,Ì’’Õ¥ú +EðFâlÇ@‡ºU\Q[€ï5«&¡rò¡Ú5Ó2½+hM™ I‹¾ÂÒ:ÕS—{qϕ/#Ðîi‡šÞ­C[`i,¿Hšæ Ý֋һdi-.ɝØ`ÆDù­;¶Ê­Isœô&­¿àWÃú0*öýÃj•ŒÌøöi-¼–ò“Hºƒ‹¼aL5Éú¸ÿӔ45„ÆH!Cé þ\°èA¸Oý€‹R–Ëiì;ŒÆº°z|ÀpXiæ4²'$1w‚DCÝÀ<ÁtáÕÈÉ_rö¬¹Q¨šIKçJ’xãL$‘3ÍIw„1֒ß1ڝ®JZ‚|ÃF¨®õO ÖWëí¼ë$=šM²Žuu܍u¡Ï)*Ž4” Ùõµ¢y^Nۈûj~•œå{iV”Šk_C6¦º¿ºE®y³W3­Mºn¾A¤XÑësŠãÑàÍ×)D²(”º¿‚˜£t,MG‡õ¨å,’® ސO¯Ézê_Í W<ÕÊٔ–9d3>÷²ðρ[ËFkgϟ°¯GÎ7ž›ykvRۂӑ« ±VX_¯PÁº¬å‡\OÒ«¹SŒˆÃJÅXÙ­¶c%ë($"“¬ÿ‘vJ'Z[‹í;ú¼0 &£!‰:ֆ"`¤L”{˜~`FâI›ÀW£c ÁDšÆuÄ¢qFHVýÛL¶k¾¾NI/j[ؔUⓄ Ì$Ðò†ð”¬-.)d€$—Ý×>J®Ó÷˘@D² yí—þ¾¾^ÏÛ +CôhïKàݽUðxµ÷ÖÔbþÞ¬‚ý:«ùª¿cKŸÔÞKKg‡$Ö«½7dT®W{o(8uží’4ëÙÞ¡Ã!r·wl™jÙí}ÃÝÞ·d·elZfýEâ͜—mñÉÒr~îî…ȃ;ŸÝ-Ç :æŠ7AI½T¸ç‰w•°åèՍ.Ymµò¹q*L*ìÇ:~œ YåmiE]Î[q²êœA–½¥† +B½65ôúZGú×mÎ0sc_ìcã´Ý ›†Á®â^ây +‘L}c6Þж¦£ÃøbWês|/Mn—øZ?Õ¿šA®x«•3ª;t¤¼ŒÏƲºñÇd~ã¢h¸W£Q¤þ ‡1Øi†ÿ¨»ƒUœ—j$Îât†äžžezKÉҬϯ6ƒÒG_¢Ð†Í¬èàRí=¼Ë1ìŽÓ°¬Zø7¯ô¢–‹žpÚq ”’Â$¦ à¹év“»Z°Ç³= 3A§ ++$ô)'ÿ{mgЎrÎàVÜl|m›Ù:¢ù¶å¾0h\žÖôÔ íS ƒs“(˜b\4ƒ»Æ‹eTô¸¸HÆ@Wp-זŽý@Ó[ÆÜL}=¨-ÚÙ,ˆƒÜ濽Öz›;:ª½Ïü‹ˆkk¨äu+¬?z>sÑhÊB?ŽP§Sùa yÇäWó ú ÿ~—ƒÅñQŽ‹›àܽ¡Æ Ñ3[.‡Xƒ;ìÅ÷ÆêˆVÕú¿£}ˆØ¹tõKÔÿY¬Tçi°«g„+¿ãÁ +‰Lòvºè³êÀŒÉ7Œ £z6[]{ÇXßEÚÀÇô ܑàrŽøZù$|B +®;<Pí°á‰^¢‡Ñ®=µ˜l{üؼc}“Ÿè¦âç;ÎzxYÉë’!V쟚7|}ñ=àÔ›ö‚¾»–›ÙƒÆ´´ôÚÝáëk¾¾/cMûa;–÷ûhçe–Y¤PIqùã ʺ&†ehå|io¸/ãæhÖe¥ âqºŠP—Ñéë»ÛæÚÛ__2Â0F4o?ÁƒÇUÐ8t™¦Á"ß-AE¬$Æ +æQ? †Øß-lÑr†ô™h;†!{I¢”·ã°Õ¥™v%›2̧õÍIóҖ~]s§bC•Òãr\ ç„a¹àÏF’ˆÝ± äùŽ›ŽToHí7ŒŒïíXÿÄH™‘Žó8¬¶¶­Æ¢Õé<û¬ý¬”¨ØÃ&Ó$ZF¡ú„:úzíÆ1„«7îÔÔÑSÐO¼š#§=Ç?#тOªZ¿°ÍžwÅK„Í&¨'æXT‰õÙËÊ߯Ñ,1èÏ3AœŠ•ÂŒº6êN:Â×1Çë;èÌȗ²Cß˗€‘ü½”má¼6wøúò³×ç¶B–ª7£±tXHâVz"à>óÂ?³u´d‚•1G. ~Æ%(fnGVÎh4·¡î]®q¨»ÝÕ¿³ÓÆÕ7:<#<7ð˜K~í˜Y¿Ê5¬šû;LËæwª¦W1ãr<§¥ §‘V‹¿¦(…'&w–r©ÖO¸¦~[Þb ÷±,.ýwcä» IÅxU£0j^$¹ÕX/"É%M;¸f›Y‚ƆŒ‚Ϫ« osvŠÕß´¯ÑÙøhÝæË¬CªÏÖ¶)ÅŘTzÔÆ#[Ájm#»ŽŽF©Íª€®·ðŸGŒ16“wœÐO’ˆVÊ¬ˆñ¯onEÍøû gñ©½ü?ÐȪø¦v­Vî4Ðf ɦØi/£µyN+w¢Fýì¢x$ŽJ]¾Rá„[’ø¾Î1d,Ý„øgá$þýcóîx‡Il‰ƒÄ¸½œñè½[CŒ™3ÜAUåü†ò2ô~láþ‹ÉÊ +òñ†«JÖÊëŸ{Û¶½{„`ƒÊB]£¬ ­Ëßa¶ÛFÒ)Úr/Gä+š]Ó‘í«±ÊñÈ +¥l1ÇÜûR¢éTÿº-”æÍÞ§Ú.ó"%»ÖŽ¨®%§ÉúVËþŠFšêÖttX/œ- +]“Å\`þ}9O'ôÜ?}–d¨m^T0¸Œ¹Ô'¶£É-Öi ÿ0§VæÔ:²ê]›eaCqp5ž‹ìâ84¾ $*ø—+  "Ýâ‰\l#?Ô±_)Á¥ÎEÙ÷Iù™Ðh²Pƅ-mÇÌՂps´ï6Oo_.gK=ªȑK[k–P­ªHHãã@Ç~Ä–*EU*·0§6VvÁÏËlªï­Å;ÜÞbahiï÷æu‘à£e[iuþ/áZH¿#+Þ«´WÅÐ[ÿ=æœO|ê¸ÿŽ7yóûnø kՙŸ}u3…ukÙ^htùv8ðgcó±]tëŠ÷þjü?>±1cH᧵‡Y‰„±fk ÎÖ¶L5éM½"‰ÍÆâŠ|!@O mAp+F¥8Á‹ró/@[¦ ÆiŽX†p•ã ‘ÀCVÏùë#T,5­žãsêûï)¯Øêe›žtՐ ÿ‹‰ëŽÐ”\iWWbӃ5bª‹êSóºEvk««Sܱ^ÑD€±F_¥iUn7vÂÅI¹È°q#$õuOfÂ'¢£OèqÇÚ`=þH¿ÅíW]C´?dÀM-·u#ç`òWšT·j3íÑ\åÞ¯LÓ8,æmI Ü}d³_Ún»­½ÑI#wá¡ Í+©…¢äÞQ ìAcYðsÀ–Ü…rëO\Øë}^Š•;Ìldµ{”'^ü¯¨7½Aû0þ\Ñقὂè‡ÿú$ÕE@s!h cÖÖóèÃ|LSb„ìøØZϤÀw`) ùå.µµz¿ªr½èFÚURT+iEØהï^Ó@A®;²=<ëJ®«g‹˜ú››Îâù ÆŽô½ýwvÈb…`¢¿¡.¼\ß*£\ߑLã8µ¹``:öSô’kh'ç’8ŽÜ¸©/…ÜRæ¢*÷ÆÁéÞ¼3ðR üÙØ™Yl¥ÎþĦx?õ(7¨ÅÝ-¦¿°§¥ý&Wœ™­>[ۅ™@‘³,R{Îc:ü,hå-e½Z₺Æ؟Ð7ë¢m@žS^•DCSËQYûC'‘­ªd¡{ÛPSlOÎgÏ “:΍¤%Pðtì86—-p6ô{|¨© ëj|mÏ6’ÛäȞd¶ÃÙDÃêXk‰Š¸”ÀqäÆ]Í]ji+#ºªïׁ7u.‰»[¥—tQAçî!Ó•¿ý(Æ~ë´cŒÛÕýôöRF š>"×ý¼Ô7!©{ÇZð»£acô1rU›Õ‘ýrœ.6…þy!f™) +²‘~*­Ú™Kþr+ˆ¦Í¾0C0-¹…t&÷:‘Õ.(Ê, ýTŽß/¿h©‘³Šï—~Ñ°y! ¤v.1mGrçÚ«-Wå¡^P!a3!»¹4¦¢ÑBXð[¦’Ì:î{¾‹“Åä*œ•cÙÉùl\Â̪ ¶Dò0ËaŸç^D­™m‰-´ëØKQE˜ >Äó~3˜·í%WER5Q +³±¯@J€K½sf=ž†‘kÌzfɁ×åŒ2ÜԜl“.8 já{–Òöa¬Ÿ˜ŽLïž]d×{á"ìEà¨kJÈå¦Òô£VÕ»ÅcÖ·Z4£Wd™[f~K±†ñR0.Øê~ÊÇöô"l%iý6½’ƒ6¶äWå +ñ‰QºÆ©?¸ãÅ·°?þ‰ëæúµ+6¶½ö¹¾Â¤¥æ•D#FÛÂBlÈÔ!ÙOm!œG rß ~Šç +©qMq¯¢3L[r£±*±ß꒮ÑEß÷Öß|<’KXejsáoôÜÍàhß³1ò‚KšJiÝÂ1ÿ³¾g&Ç.ǏñŒÆ.L#íû$·t¹hʽø=«aiˆEÔÚ~Œ,ÞêâZ|ÂѽÇC÷ù€¾y¥^Á{¡ýivU®Ý¼ržbÙsÀ +qªJ°Y¡C‹,=¨Q +P}èáÑ{¹•ûÉ´aÞAšY“tÌ2î߃¬g“g‘…Ð’òOJŽOXÊ Frm<É~¾)ӛ_Rj³•¯„fñ—‚µ,üÙØ_v6ÐsÜñÞonû›ù»¢Ú6õë°­–7«qÅ/ÏÄ“6…¾eÔ ۔Ùyì‰nn5¿*:½W°è©æW–&´ž¦2…îuÓÆ×)½ NçvML۞¿¶ô´íã8]ðýÚ·ûúÒÍ¥¯ºÛönb¹½V²ÑßcÂؾ¥~ÛPÙ*R!lœíð²7,ÕãàD&}7ù9''à‚8ÎÜòǙç¤ÓÇÔý!N$c¬fp’H[Ý0­&ÖNCÆH±qˆþ¾7)-DìS{ÛºÛv^-[o`B#D^O¶ê¶ÛüfŽýsØr2Ï£ë<7”ét›O¨3ý=‘Ó„Y*þ7ú Ő Ò°²™§¥¬ukÅ`¼,ãNkî6Ü +~ÿñÚ«Yª`ØõìÍkbþK–++’ä$œùâo€|‘z`L(‡ð‚ÛÝÖD7–Bg§°ýÖ8EŠ }YwûúÒ̅¯š¿-r¬Ùϑ{g·W¾860) ·(eОÜڂ晳,)@vǑ^ˆû±=úQ£sÀ-BÁw—G9;ô’ɧ[ ÀέÖ$¯¶6d,D†š–”£°H/htd3ÓpûqÖ:J×é~ ,­ÌøæÌ I• X³—`ïӘ×Z¶nà—)³§Ê,©±¡Ac`k"{ÝÞÒNú}%LY™)©·K“5yXàC ‹`ÛKæŽÌ´&Ì+Ù×>ò1ÑÌûŒìŽæv›°@3Fþy5˺Œ¨ÇÄ4=ÓYä11ìßúùÚû„«®ªrøæ0}Ñ]@­‚†ö¨èV±§È«ÁáâPQK±>pp>Úyxì²÷LóƒLIç‘w#æ« óeríRۗµ7L&f‡vOjN|[yÂ"bÀb{E:è@f!/Êûò˜›ôzÃ\RðΖ†•½¢ŒSªÙï÷æ‘q²Þ«±:#p°ˆ„.ÓMæ¼CµF˜IEÈ΀;Úî.®ûùÛH”,ïÅÌzµ7ƒvhɱ1æ‚qn*ÄÐïqc)#±“–H#4è֙¨(Î eòBԗu¾UA^«V„fߒŽ–ÖÂÁ—`ïÞ¶¢ÚEÔxkÁ³ªt²"×Å 1LEÍÐdƒ8QLŠLÛ©{“Pƒòe£Ò q!JŽ¶KMIõ7–1¶ž"Ò-JQ%ó}kn (Ù{Â9£-Ì ªqRtY¹Á½ÙLÒVtAØ.²‡Ak€¢˜sVKÖ2õ5H¦UΔÂzóV[Y½B„ÛXC”²Q8R^+F‹Js UØ8ú×@=¸ûtŒŸ¢ó ‚oUU4G•OÍTYk. ~Ôó0W°%¹cÜÊÐó@?ËϼuâÏo&H3yä­%ÆøYÜ'dÔ‡Kø˜?[ë˜Öv<Œ‡Ùþc¿Ê‘+ב ß§è H}9œŽøšû»“Kä“dþ±¦ ùH *3‹€ë¾“ñþ슋¢«´D%€œ¼,͍G¹ïÐÜûFsš4’6<ýESÈס)¢n”S]Æcæo˜4”ï׿À ÁãüçRNŒÎK#çäzð]xâÐââá9l7²P»1ÖÍ¥·§(†]è[q®Ç:FÔ­jî&þ<¸HÀ\!Xê,iº÷+ˆx¦ä´ßg‰^‡Ê¶Y©d(\ÆýVH™Ê_ÆΪ©…ÿ¯¿~œqÏ;<)“,cÓ¹_øãWΠ0ùóó–®ó1͗²êþecîß÷û}õõX˜œ â+HOðeüL]Җ´dVI!óÎӎÌÜ4PÏtÃã—Ô½ ?7¼Ïc vŒyß¿0¨2î n!žp'õ÷õ5ÜWAâ]óö¡)‚ëaL𺟁‹ ¹Ë]˜ˆ&á<^݆øQš)ï;ïLùZ™ë®LIÿXãTbù†QÎt¿þ" ™ÜtþH²YH ŸD×M'({Ƕ“€ænš4óñv*-Rªáç YÂòž³þkm7„xV‰<ˆnØî¸Y¡G£.яš)ÚttsïÓ5ðõf昒÷ìÆ¢ÍlæÈUL1>Ž&%LôÉ]½ MGQ0©woo¸ys{yíƒñí(O”ÂdHL§C+ÚÁA_•6W°÷iò©=~2çü âË5ÃnÖþ cßÇ5ðõ/0fNÝvq7ËÞNþ¼0´¥¶9¿c’vLžìܾâ9›ß×z_±¯ÆÁõýÞ«¼¼o¬üMjTËIB*æ”ç´Í™ÜØ¿ÙÄÕì;˜¸i#ޒҽO”TwMF`­“ý#ü<0G1|¿ã} +ü¯öþ;Úû8ÜFO7(de°ë£€ìíI÷¼¬FÛʻՐŽk”v~_¹_¯klšEEŽ—o_¾P9bÀómÚÒõ…&a¸Icpêï¡7$s‚7ï ™˜×#rd}aV 5³"Œ.FîØü–i9X!8H¤xŠÿê„22ÀðóÀtlnæ£íݖ%Bêw:™²û5Þ¶Bí]ý×Ʋˆ½ê`)\«~ÞA¸Lþ(‡q¢ j²I¨-¡Ï__•‹í½®qÊÞ8ÒP‡A (Š&««¨ÇºPòÄS¤FЗ0 ¬~ƒãs¤FØÎäoê’Téâ^ׄ·ø{>v$ÍFIö6Ù3¾´N9T—spgJ,Ü¥÷0·îê#TV¹5DNèC<ËõÔb_: I¹Y»¡ÿ„ƒòd‹á°ÿHRûåFKYB£Œ¡HÞúÆ!|µ‰gnjŠ´†ô‘•še: £ØdêžD‹'’¦üŠÂçf T\،v48ýØ-Ɩ5¾Õ¼ó-•K֝ôÄM”âÄ» ®íéÍî*=§ØÙUØeè©Ï‘ç2wÎøãk^Ðý`5ûfóxåÅanS·Ò‹ñ2ÓY&»µ0Çdå!UlX¤U¾¤3æyò5"K>îFkãÌvÝìµõ€ÅsæK¢I]T)®«jv–”I<Ñõ;Ç\eä&µê²ŠT¬J_•¾É™ÊÆ4¡°Ñf½U 3¯cEÙs §¹ ©‡E +%J2™M’£krœñG,È"dÊiïæ:R(Ü—xK‘ÎaJ_ [@ ¨Z=0¢dÚßìϦßôÎçJÛFñ,(4xZÁf½óòáñÃF]ª¥¢›ÍD3 ~ðí­·ã9Xx}|CNŽ×ï:öy}M>¹'ÒÜZú<ŽHZ®|¾Ï#_ý +ÏHûåJ穃8_žè¾ñFî{z%×Ó ÝG¼e¯Ô¤áÂ^)74=`ݤŸ5m=tÖdËê R»ŸeÛVºP‚ìÂ%{½ù}JrY*W·ˆÙº›Õôí\8-ÚyfMþÙøŽ©GÓê–V—9+·ÃrgZ¿GhåL6[3ÖrC\£Ù¼Éÿ¬IS¢öiÌâ!io·l策%·ru©¸Å*îƒF«­&¥w©k/nQyÁ}]€i¸ç>ŽÐÎrr¥|‘ ù80@éËr†¾žÊ„ ªMÅV´Ê}*m2ââ°æ;ø™Ô@®y™º‡ÄMÔ\ï1-«õŸÑ¢mhx·ÄN­)f_5 “+ ~×1nUCóZwœº7N4Õ%RïæïõΔD0À +Éá¸Cç&^]ò ksœÇvtÊ2d¡=0ãÿ/ûU’cÉR÷}Š¾@bց#”¨f÷—°Á#3ß«’`ɂMUØË<<ÜÍÍijÖî#uïéá©uFxÔ ¡g9ã¤*jÄbƗ͈)\¡-=97/Ýò?n]-kªºÃL‹Jv»clbÙ+ÖԈ]ÍåíyÕU”fpäâû|×!4Öj¼`íó5Wò˜jÿ”UéÜ'y¶—yýU>pøgT¢(“/Þ +¯CaCŽ$OD7—'”¨Sš¹˜Ÿ)’U·À…3ƒr,ÆDÙ¥òàôÛìÝ}"óX2< bYêåŠ2ïËàOqbGLž1Å8o‘[è>1ØV·­b³²_¼a`9Wïoy Ðs߸~'¦àLFåSÒ«žEÿI‚N8ô•Å*k@¦éû‚ˆß„,ó3LtD`ùEÎ.jtsçó´Á 7]±c†J¼wÄÜ2~žÝ›8ÀI”¡ Ägç.øã!íª¹‚nl|‡]9îƒùØ¥p~z¢##ú’•,ŒšÞZŒo + +"¶sZ?JŒadëšE„W_œµ¤9["'é笪å þòv‹W¨u{ˆ ò‰æ¿T—°òŠ7U~™•çéßFh™¦‘–÷D>?ô{†ß¯s£7¸ªki—ò¼ e¹›Zè¤Wtf^·}A>âÌ|"^½—'¤r\‘l¦ü»öLH¦O@7–uLSTY‘¹IL¶†«dOªqITŠ¶#†J¶œ%×îò­‹sbWS¬¹ÐŠÍWÍÅÚ¡¶V6nÙ±AÌÒ ižOxøI;úä*zÕ[<Ÿ4èç÷Á—ëÊ¡\%·C¯v &r«!ÂeQqð|åusKÀÒÈëM8¬4kݝ-ÿŠ»TâOâl·•¡J¥I ›Î´X Îë›Yè—y”a¥=–ôôõ­î4NAŠ4ªëˆ_úJ¯Oª13{»¾…Ï"^<øõÞÿ;U—ÚSԅ”¯ÍÜ)¶ËyM·v>šî¨ŽÌïNñ +£ ]¼EÄÖº> )-™=±Õ¡ +lÉÃ_¶.€ùöãGÀ£Ú° +…éZ +\Ðj`þ±‹vmH(¨Ò N¨i†´˜\ûˆ¾J)"5ÁsBŒÿÏñ}üõÖíÎçs¼Ýé?Ú9>¸ãÿŸäëŸþü¤×¿ðþ?ÿõñ­"óËyÂì rCíg¬\?ÿùW¬JŠ„òÏ¿?â§,ø¡Õŗ}ÄO–òJŽ‘L͖Cô´7ÔÕW*¶‹HÚªÒÇÚÃôbÿ( \\Fç΁>%«‹4#z*…Îð]¿£‡°pâ­÷K&?‰)l ±œ–‡¢ф~_¹_Ó5ÖŽÈ-CtoYK쀳ŏ¾]+¾!Ýy“|Ô’Štùì7ö“[H#3R´šÒ8aÃ^–5¸ó\øxºÄ*_C9–lx¦nƞ7Añ˜ù :Ówø±¤Q;§mh*V±;²ßôÆä€zۀ™6 ‘êe.£¤M$líŽ `¯Õu2’´Û˜OÞŧâ<ëµÝ”é¬ßÕ¶¥¨ª,)Օ3 dK@> Ɍ +> Bmž™tD>{P‹Ï³¿Ú–¬szVÜ_ðKXBÀôRùÎpÝ¢äz¼³‚ã3F¬ïÅÉÓºŠÉ´bYK¾ªÑ©Å¶¬ª§ÌðõæÞB&íA–ÀVJ÷²{¥lZù1w·Rê‰à*S¶ÄLš|ˆʁI0ºk¨øå1¢ h÷yéÚw5¡ËaÜë¬nj@`üœpAæÍD–ÿ~ùe£OÐCgŸAØæ?´`hÁ=c!ž<-Ò¿ôX1âÈ +IwŸaìe¼L86ž ž· =ÜAƒˆÂÕQxZÝ(Ëö—Ù©cÔwh”ꅐjT¥Ë\W¸½¢3Ô±æ:Gxæ+’à/OØߘ·bVúÊàã°ØùƎ…Åo0žÇÍ:ž·Èê¾hIWR—F ++KŸœi]¥_0Yk}/{¡*Y]á–£;ûœ§ìM5[kIΚ Jî>Øe0ûâ[%QJ˜“C÷•[7,0ó÷ÁØ)ytƒ ›Rjiͼs@ëXŸïq¸]Ùd˜»ªQwÒï•RðGØø“¸›,Z +>Qò†ONóKgz¶â+MÞß҅ ,ê•áŽWߨo²cRSÌZ,lrO7‡e÷'D²ð0V‘Æ–Û"$^œøå!ó‚ÖbD#Ÿ¡|Çó!Í?ÂêW&¬Ë£êç;hú¢£ÜôÖ;NŠì{þ;i(ÅÎyo8‰óØN°ò£Â`م @ðÝùœ”Š «kâÏ [_w÷,ïøšßQ°ÊW ¿ûÍ.sŒß Z-P÷Ô}YØíUf…àäÂp˜¤À½â¨ç[•DHÇ÷ž$é ƲŪg·@ŠÌ`–Uì#Rý8ø÷K¡±3SB+ìOµr¨Apu»0KNÙ×J£ $‡¨Ö*k\ÕÏÈ<žfxç*—útÔ§D¾eËû›+ŠK+jpn‡ “’ôó$Íñy7ÙbÕx´ÞÙfTóOUÑoJb² +Ęú ö¨>†ŸbëY¶Lã7ˆÉS¾¢M^rßb§ e¨k¦¶~ˆ°«3uŽ7ìrO}ƒö8*!ù¿@>Çcò ´#/)Q™Ñfø=-ڋZ³d-ïoÃX&þ~ü2ÿQÖrQ%þòJs§ók…ùÛ_pn‘yZŇøöU¸§±¯?`ß$Þ©eCD}ÿˊ:ü7ýÖ¨Ÿ@žmèRäå|ýB¼Š*Ê®Ê4½¡7æÏ{Hv„þu‚á‡.3€÷˜3Û½Á…¯#¿Ð†kƒ0ñõÏKDÁomÐR¹~AÊb‡-¼ózàûÈó‹5×½C³F»o®²bÍ{BÍá†Øà·ãòåiqípŒ|¹Å›êkÅÂìÿÌúfýgÖgÔv8S­ WÌþ¢¾F©émc!i­< ؍æu}kê^b•ß2F҂žÏž¢ÇV32W9_RÌvÌ2\j‘MgøǮܑÝG–â<{Yâ‰G Ô°bƊË&Ž˜!]§Söµz_€f©Å1ŒãcÙe×ÇD]•Æ6eS _ðóÀ£é>ôÙ<“ÙI<߸Hñ]G¾?h±”¢ä¡–ûCNgõ78.±ïœÊ‹}!Td)%Ž„ÙLƒÒ问à˜ýéÇÈ †S•F­j¿2 0Vtµlpœ¡l ƣѤ"â1 Ðά Üxe«tß·ØìüÓ~ðS#ð*[¬ä”ÂÎHM‰DÛrYѦz̝úùðiÀ6e¥{øÕÉðÏÆ'9¹£˜¼=]ÀPäv±‡Œ§a¢S^©#ôt¹ß]àpè¨ÆnÑ;fáY¡MÞÍe‹•†Jßæ3ÞæŠD’‡ :â­ö¸¡<ž4˜Û½Ov@ "²œIԑÆûòåApzÑÜÞÊó¬5ðLN÷ð‹ã'û›5þgŸ~ºîýֈeʳá¶u6òøXt¾ðð³ÂcîsÌB¹ç;i²6çØËãcS|9³¯=ޝ¸·Ãb 6žNÌÊ¡_~~¤" ªh¸Js|Óª²k•AÔïn ÁRKÄióìÈü¾ÇÁé,Jg#V®dÀ!ör,ÕÌôß{ÝhÃðÆÖó‹<„íj*ÙR+Õ}™g$ xÒùj#ÎÊc}Œ0ƵÝ9ôª +7´=ë8:–§^l [Ôf™ wRây`l+QŠ–H¥Ù—Ç7ªI›=ï@ÈÚƘâ6³@o×ëFÏä¢,Í}ÿÍ~•äH’ãÀ{¾"? íË{}‹ºÌÿmfåKD÷TÁ]—] Eq1{ÓY”;óÈûKTP2íDÃX!£–ËkŒÒ²õƒ1Áñr¹¡‚W­ÊaôXŒØ5}£šIi”N„! ^uì1¯:jY(¯KP ãùbÕU‰6ê©-»Í¹ÆŠ¯é_‚ñDÚp¼Ï¤ÀÐ ÿ6t&ºx£!(+’kò2ˆ›2Q*ÊT\ÅJ¢Y³îQ0KßÁ†8,i É>°_oéû€G[¯Øø~œ$¯JF£‡Ú8ßJpP’4píöVÅr)ÁÅF}+ÁG•e,Ì·تتu§Öôv9ûUŸýv‡»¶èÞÔPÅ ÁŠÁóäÄÈ6ý[æÝe>X¯„m²]ô¿Jj`ôva ¤Á¡qѹ1s`üŽÓ Ä+üjop@ž` LK@€ÓÀ7Ž# s…+á3\Gßáz‹‡nQSºÝË$Y÷LŬ—ÃùTægÎí4̈||ïàø8õ»˜mõëÕvÄv1SÂgj‡üy¿…@²Lßn}ê^Ũ¹¼}êP1÷bdŒ‡ÖR g»×’ÀCºÚRJbŠï$\«$š%aM¡nL›ÂȵeN¤š²1:3JÖ]q¨ëŽ¹%Ô5šª¬Gº\\lF¾%‡ŽYèÅ¡AšèÒþyg„˜¬yóïY‚DÔifj‹ì„¬a¢UIÃFnjcB„F³llGpK`~¸âÞ¾RûéϏCŸá:® n·°#`¢ó½¶ÿ,ӑ“½ÉÐÛû©†íԚæi^¼Åc‡÷©[‚Xk¦—íPðvõt†a³]_q£[˵ÃívFæyª7µkô”%ážZCLW‰ÉÈðHY§¢„tãioÈ + Ɉ,žæ wDDÙØÜí ˆVU^6/tEQÍٞzƒfƒ§l3ë+äkœ&_ ҝ¶¢•h•ŽíͪHHãA½!¿·™gåé-é$~HM©%w‚‰*«Z™›¨û ÎMRO«Bù I5Á¡ìU€}ƒÒ8œí½ÄnÀ›Sæ5²qÇ\pñ¼%5W¹ó:(ÃŽÌ(=$p¬—ؐ !ï# ?tQNàxµ6p|qH¤ÃZï^ïð¸Ü*MñD,©Î &·`ê´ +ÉjpàãL—¬J¾w€óŽëµˆ²ÙÛ1£.CøŽÏ¦s[›¾ƒky½ÇãZÉJÃ}i–ArÍçܚwjÍ¿3ëOgÖzCÿ«Ìzö؉Nd®–Nýĉ|ÁƒBÑÛÈ⤡E <>ÐWŒäÉ#T_e€o¹FÈÌ4>çcºnË­lL§ä)†ÂšmîJoAÈQ'~ÏÌ ª…+*Ò÷ªrVòß´R_îkÅK'Žئ“õi¿uAªÅÿ×ñkÙÖ i~/ÖgÎ6|:tJ÷a¸Þ OÆQÉÈæ'¾}”Áûƒ6–’ÁÅ`°XŠùšŒ:zœ’ƒùYX †Ý˜1»B¤× dù¦ƒçû˜D—¶&BžGÀÙV½kküøpT«ìå ÀéÃ<¢¤û¸Ï¡Ã‰X¸¸®`.®ð$š 㚵oRÄñ‹y"qÄÏÕÅÈV|ÄĜ»Ý\hfù[bLrïΠO¥ê|lû‚TÖè=ŒU# g]Þ@è¼ÏŒºâäoRHfÉF¢Iä"©Bzê4zCë`ãìÕ(OlÃó¾1³ÅjCÞkÆhÏڔə2,nnŽï1›cZâR›RgX1Šñܖ‰» yLSZ—œÇût-vM)s°–ŽàÐ> pb´FËÇW¼UÝZ©Iµz²5=ù1_ÐKr„$•Ü¬ Ý0[Yâ€.kӒlôd&~…ãLͳ‚b(Ú=ð %Ïí}r8†/YYœàEÿ¯†ŸVªhÔÄ:8f¾‘]#ÿÂÃ}…¹«Å°˜K«$Oµ½lì:­/>{ïq7"s“ŒØÅÕNi­²ä4ô.‹e…ÄÀ +f‘ÜVÞ°±R[œ açB+sG§ª[¡î1Qk»G›Üwè3åq|‰È;Jm(ƒ]QŸ,•ÎWc´ä„WÎ冐lZ•†16BÀ+O†¦OQ©f*…U×0xÓ±ÇÊ£µ,„·J®„‘?cÕM‰6wè©/¦º Boö°³m›_2ñ¼ áX†È2­ûfy.C¶ÃXéJ_`SÀõ J‹@j•Å«ÑTR²µDµ³û~ ˜ÍqðEÁ7š?|˜Ìyð€Q^:Ç¡áT‰bvÖ{bóVÖ"/ªõ*²h46òÜê’<É¿š¾Òµ3·ÆòЭÙÌbR­{òÿÏ—ž¤µA±õ$˜|Šð¹ò"Gð²bޙU<Ïe5¢ÚE[£O„ñ8 û@”먐°RJô\È21ßç}ãÙ´áKþì•1”~»Ñ?íFgOÚ§þ7ןµq:Û86N¿`ãúw6n‡ÛÏÚ8þ¢ã/ظ]l܎PE,Ñ˜‡;c…—Aœ¶nƒ$Ê8Ž• TͺGÁ,}¯Ö]²Q‘ðåËÂUӁÝ[ùnmÂ"‡DÉñDIõ­Ä˜8%í;¥ôV‡P¹¡²·~'ÑuI˜ÞI`¬b«üR¯¬êírú«ÕiöÛ-îX£{»‹FRÌ ß÷js@ ú·YØ?ʀ´ß´nˆ»ìu• ,’ Ð ̧ͤÔçø`ž3H@õq›.ÚЙ?Õð2Oû~|ø WÐw¸^+@8ʸ\Ê%Y] ×än¦Ëá|ªaS³´tšQ"ý´ƒããÔCìb¶jE½ŽØ.fJøŒCmmp½…0VD +Ó½pfq÷Ÿ:4Ï!LÂÎCÙl g»×’À=ú$µ§„áþFÂUQn U‹mKòGÕºš• ÇÚ „µ [θ®o½{±\е»Úfá&¿¢3÷@N_¥î¼?ù`uŸ4ÓïY‚<Ôiå! +NLڜPhnüÀ®0¯âÓ$=ĝ¸Ãí ®p .…ð:v€³Ô~:ÃðããÐÂg¸–¶ÃývF˧‹mADÆ):s4{„¡§÷3 ۙ­ÖӌÇ{‡û™‡„¾lZÙp»TOg6ۍ6”l%mƒÛ%ì„2è|ó›]¯½Û)—È–Ù`ç†ðÍhx +ðHHªIXEŸö€|HØ3hËZOXÞäÐ\í`=2S—åUãB¾˜HŸ*Ø,çW„§S1AÁªVM¯¸¡6Ó]Æ#ˆz;Í¿cä>NçÝpPÀ©L&ú¨Ú9¬J‡¬ +àŸa¡As³¨×êø¹±Ñ\àúݑþ^ðž¶â+öÖïPÇðîöˆwŒ‹¯Ï„ð:Y{w·ê¿fϙ$±iÛ°þ¬E Ø$©âçZ€ñÙw[H´Éz¼?Ù¯’×n¸ïSôÜÐ<œ#G0dá¿ÉýaUQzƒ;Að“M€¬¬òÓ@Qd±´",µ¤sÝ÷æ™n(4 +]ïÚMˆçæ²ñ£0±×B!šçC çòék xÒÚP@*q8r{¸fÙ¶…i¦$£\DHT¶s3/ؖƾöJ‘¢µðºìo†b’Hæ&hì)Õ*±›dùû¾´­{VÔv{•TCX€Jµ 6²2›šnÉÊAøZ°²è²;ëí†"ûÀ=õåƒ}CAƒxÓä ”#WÐöd´QHŸ³—UŒŒ¿»P|h+!}3zÿÓ-;@LIÙõÍó+³NbM´m¿ùÇÎM´Ž«ò÷ÔéKÜÒ ¶= Jÿîَ+ã¯^UZi¼=XÝôdo›ÅæFØg82²óøÇ*•¯õÅz+ûa,PÇvÌHÔÇ GÿІµÁ2ñz‡çåV(°?¸E_‚`b¸÷˜qœðqèúGÅûØÁ¢v\/ü¤çFh§ÕdžvXøì;ý³¬X;,+¯÷x^KX¶ÚÒYEÿ6«¦¿`Õ|fÕ|°jþSVM—UÇfÕqfÕ>/´šn´š~‚VәVӅVí´ƒWljWÇOðjüK^ÿ +¯ö;<ñjÿñê9l§Ekõž‡­ÄIzY…·aŒÅ GS8 ¦M!C,4šBÀ/³pˆC?ޗm»žu™šO´mÁ6|-¸…|vƒk²uY|àD¹·ԃ–©Õ³‘OäcëŒ F3’ž(–¿œ^= ‹WÄVEíòè`u˜…ÚG‹ËÌDQ»b)ÆIׄ°-&ƝÄn0 +~2ñoÙ£§vž®ír\kHJj:ø+6L:פÇ>åŽÃlœšÙD®í®(ð`Dø&=’ù¯GYTgP̙ÕSG,ÆIÛô…!¼ÓÄhL :RÓ9VÀGš™¦`öo§fLŒªŠ¶µ‚›Ü̝8Ä\=Gk‘19Ó%_FæOŽ*¤Ô‘}üüЛ ›í²Æ¬\‘’À”@‰5‹×D-e„ؐEÑé;•Îã'Å.þ“a8ªùXòîé&[ 6Pš)#ࢠáÃH“ZŽÌ[i¼lye5‚¹ßÄRy‚ˆ#BúôT­lX¨L6HXûjüô˜2w ¬@AÓØl,²Q(t²uMä]Ü»wX*¤_»}Ë<Ÿ g¬ ƒº`‡¢ö:>rsôj¨¶=#c® Ú;5†PMÝn¹ÅK,ëÉ6¥|’©ÜF\ 28*:Pø¼¥mDYV‘¿gLû«V…Uì{DâĤZ%pTR#{Y˜ÙIð +DÄó$6ðPPË9{sðÄu*K>¿é…m{iˆ¬*ÕØã5§È7 £Á„F)R’¨ß¬`j†âHþ··žÅÇfm]ºø¬bµ ôÛÐS? AO~BïyE—iQ¨üqÑÄKÄÖ÷W¹^Çi'¿Æ\$W8ùÄy#ȇ,ÑÊ8ˆù€."SZ„b'EÄ+BGcä2(QjaIðöNþ2z ÉpõŒÝY>Sk;е]5·'*ëé1ÐÄ)߶J½Þ ’pC%¢©ÀÌHÍÔ3–¶>†‰SY™ùþ5+°›sÞ ë*„ë´Dåz‡ëp‡:xßÖ Y¨€ÊbDË÷…!Gĉ% +ÃDê]ä ÷õ±Ø팉æuð›dNE%Êù¬T@܎ÑÜQ2=nȪNvÖij®ÈÓïÔy'X£šSeXW-£@ÑÕCôÙ2Þ‚Õ3gÀ|ÚÝÈÝwƵèp§Š½sgê›;‘×wö9eëÚf/²sx ’ä¾!\|Ã&hñÍýÊ7ñÄ7uþc¾Iv^À ]ܮ‰ŒûIŠ@ãD +Öu=¿)›|•¯‡ +*’§-ñ6¶ÎµŸ#õ˜³-Ö¢àJ½¢øZ–G>¬#ÈH#Îc·-Žh$Ÿcj«\çž-"yHs<âY#–S-Gý XIÐÚj]3 MÝÞk$>A-®1âB¼%µ†°_¤Øñó|G)²Fˆ§ùqÂò7(ôáU;I "eÝpÁÖ¥¤@êXR’V.íå@’VŒ°E¡·Ê: ãC¢t7þV:CáIq”äW»PL y8phÞg¢Y]WîàªjP}¿6&¦'m¡bÏӋSŽ^A™.w 5yÝ[Ev‰ÞR£a2óGpQBTœ6>¶‘ ¬~úZå½Rø'ꥻsgê[/šûœ÷j=¡™<œ‚&éेsƒz"Gô ‹0.YhærÜYä1¶2ËnHHáªô±ŽmŠEB_È-‰û«G IÀR?¯ñùFÊÉ:Ž†b&†+[̀`Ap¬Ux:ÍYÁkT¬»@³Ë`q÷_z¬#øZ0ä؋|*ÁÁs&G + ì@ãY²N³ÀZ6dµq}ªàë0BÔòۇ'Nµ°šHX…”à ׶t’Þ0m;û«[²wŠTœÔS­XÙzk^>²øš+:õÍ@!!ûx¹TÈîÓ釤îϋ‡Ïe?Ñ7å"ÇUfq¾ñÕ©\T ‚ê2$ßü°ª® Äl•<ʙ‚T½+Ś’Oߖ,!XEQʏêÓµ?ù Ò±¬s™K³îûG©1~ûôÂó­¶ÈF·)ÿuÙOè²b[d߀Èϗ€‰l7¨/¨çŜ‰$P«³ë¤%Uõ +w0‡t2dN´¤³ò<Õ©N–IaÛ°j£^E•àå÷Y½ÄęªȍµdceሬAª%’ômˆ*›² +˜ +„ú*±°Ç•Tۈ¦4i ~U‚`Ʉe¡K›Pjø·ÄžíEŽ™mëWPv´j &9¢…I§TiúÍÛڋß_r W“RlaÔã%áÔI½>DA¨C˜Y}ÖP%Óop¹/쑞1^ëôf7¦²ïɈöÑ,NYðÐ/Ú}›]´ÈÔ(Ö9¿ðþµRÀ½*Œˆ–©•)M‡¯Vj7b¬ÝšËŒ8oLPGœ?ú—¿S‰Wd¥(»gêŒï¸Yª»jÅÞ°èü˜ǖv}œÎ»á°¼ ^ãG&É(]z/~þþëþ,N–ûÅÕÀ¯­k¼›‘˜ïxϯV‘â;NQ¯“9ÂoÞn&?rLdä„à¿t-uª›çC ÂU —©,ÍÌ<ÿ–©ô}‘MÂ&~úP±˜»9bâö¶ :–ݯÈÃ?|DšR¯$Y%èTøf%¨ra}-ŒºµPˆæùÐ2%րµÓÚP@ ÕpäöpͲMúÎ(ÁdPóê4©ÈZªS„;«i +)¾?ñhi⠑ý͐K–xbç, C†åš|LI–Ͼ´­{VÔv*¤ ´É®‚MÖ4©¿2+Šy©yCe×|-hQ—3ëo¶º"UÞ=õå8*ÛÄkœ&_ ¹‚6÷Äö¬ùûÕ²+×m÷úŠù+ñýX'ˆ7Ù90셔ÑÿéªjžÃ33W±å 0à,¤ËòMvwuuòÖŞ?S¸Yja¾dIälOýåü¥OÛ çfäbïñ◁Ì_ºšW¿€ìãúª¾þat}³¬}þÅ2m~4¬®¾þEwÀÝñ[6§áÞÓ´“Ý«MS¿óø¸Wä0’9mؼHÙ€¨;7hÔ'çÂwÞ§Ž¶­èÛû'ö#ÖˆµÁ²ñz‹ûå^µwÞ«[°?äÖ| KÑ '¶ÃĐe¿næÐ띀õ +ˆ˜cEGo3Î ¼N8~ëóeÞÕ~”ùX!ô?±æWóA«ùÿ¬ú‹Yµ> ÿ«îk–—ªðóª»,€B¡kÞH‘ÜÙ,¥MH†º¾€+}D¬õ¶œ—ÅV³ec|µ¢ÁbÜB¥ìÏS iÁPâk/©tópKŽ@LÝ¿ð1m¹a[h9÷ó À,üuèÇûg‡]÷t™‚¯DëÑ$~^p©9‹dë\‹—ƉZï8JÐýiÞúÉþýðáÓ?ÆÛO_mü·¿~ú˗pûó?¿55ÿéO?Ú5¾Z<ܾÞÿ±‡Gš–O}Ѥ¥ðÙµ˜%¯ù6Mf"êqúß|§A,{—ÀµOâ4æŗ>àû¿_>¹n·Ÿ´ŽwJ»%#F©ëNg;~³ŒÄo±K;< \ÓVUòÍ?µôˆ>ý½Øåúáë¬Í֜Žº˜qØ÷Ôš·v´Y&Z<¡´íh P‘;aí[ƒfM•}Ìôy,ˆp±DZS£¼™5ÕV<ýðMQ™zÁ/É­½üåc‰yûÁ,!@ސˆÐøfPÙ`³Ù™‡cuZ#n»±ø> çð™­Ì°º0L2ã­í± +)ô3]ZC{Âoɞ&ê„Ë86+;|¤úâӍÁ)¼!ûqµݖ_ax¦iKÃô"M÷ùìóçCL^Pxˆb¢hËK0©SÃô´Ã)2ì!¡N%PèxÐܜVÕ4N6&‚¯É‹9.À…U…Iss¹’MGDÁŽ³káäŽAbvÔï>Ú J¾°YjŸö¡ÅY®‚² ,òΘÑ۞:iIŸ$ò>17¸À¼‡q÷»”†BHƯh3¤½¡ÒU©®9$-žqN֓dÆÃØUÿyX‹ˆ¨tŸÑôÇ<ÙL˜lä+FÅši Î./K€»¬˜rq†¾Ýåå¨,JjϬ١ë¸eZ7„dü¼ \V¥‰mÃPcuaʁÑ9à%†ÉGLç6¨"#A֖®Îì‹J<Ÿ«Â'|á4!ФüJDÁ“+1ŽTÄ´0ötBû>U‡Ø:AŸô‰rŸsãSJZ@LØ·‘Ú”†·\oû%i¹„b€×'´Ã¼&Xìþ 9òɃw¦B±uݵ +§Nój“ÄÎ\[‡^¬D© ­üLXÖÚÀfÓ· z›u†úE7 ,íäŠxykUk—Ñ֊.ŒF”#qßÈ_WVœd¥ÇP[Q”´5Ä Až+kŠÒ`:=Р¨È 2ËÓf–ª¬êà›N°9a3áÍÒ(á&VA¶[©5Tåtö•§æ:OÀˆsêØB¾à:9_< “x!òɳæzñ~*5=K×Ѭjìì’:fº?sîç\ÕºÄäèY/[”FYéP®x†7Ñ¢¨·ï!ñQ"1³ÊG¶®Ì†ñ/©zäL : Êρž}Ì7ÝÂã9ø»=/8DŒƒzíMN"€éâœÇ‹D&$ô¼1ñMi–…™„OJхp“Âwô:ÌÔÆ| {Öuhⳝ&Œ½â“C¹­2I£jµ±k “k}–É*h÷ý—j¼ Ü*ak‘pžðÎÒ6o°œ›k±p4+d\&hU°Õå µ]ë“Õ2ü'G¡2O[ï[Ïy] +¬Ü/{¿“mŠ·ÊÃò`g<ȃ =ØÑcã…ê¢Юңê'Šni⁌:س#”½ù€9Vè=H ˨ž},(ÇLÏ 3–¯Qì§Â§w”ð4'ßJq‚T¦„aÜY¼$WRJ–Æ´T3}úéé¬T™u¼À90™»6ýïÐ^¨õ›…,÷ý8ä¡*L…ÁþVÌ Ëé.­â·Þ±¨£Öš¹5 qú*¡”YӘä`%lL Š•'ž…frՈ‡¬7ÜRn¿±ä¥o”¼|-yóZòê/-yõý’×ÿk%/^J^|(yñ»J^ÙKÞª¿÷’—ß/yõ%ïûj^¹Ö¼ò5¯¾Wóú{5/Ïl¥!ÿŒŒ$¹Ö¼ÐWÒ'‹Mpy:Ҏº³ £®7`˜e»rR¸€Ü03Ô·a6"™.}ëlz>NXfÎoJPؕ†2N•¢Ú‰ Êõ‘écÙ{Ñ}!ÝJ÷ñÙ2µMI"@n3ûp¶žä§(fzÙvT‹?±Ý{ºÓ’÷#ˆºp`u,‰Ož^8” N üÊ–$ì’<¤ØRÇŝõóxWq(ÎØ B¬ny–µIŒÎSM¢àO«ƒ†8='Ú)~JIL%”JÚP žZŽÑ_àKmÇÏ[N q×R¶É4ä6ž«® y… ²%-¨Še 6úùƒâYƒ- î<Í?ˆ$¿” öë¤Ò¨ RÁJSÎhlÃÀû^qëÆå=¨IÓÃM?TüƒҎٸú´¬³ZV¦G_Ë}B)‹¸÷}Cþ˜Žbç½G&ƒ¢”Å+® rȍÑ3Ù°xð¥¥}edêFóúFù¬óª\J{Ÿ‹,+´<'²Ku²jß ge:¤ +(2nø¼éKžäݜ’´Ò_ՔÆB®âyjÞú9ÆUXúR^a°èÉƦ ›E£RÌíåö¯¿Ûš½JYõ²Ü2ŸÙ É“Ì´¶+†ÏŠ£Ô§î^̵ÐÈ1¬ +g{?@¡q.~€*nî7Žžõe³L†Ú~6^WN:|ãÞÓ½"Œa%>'mNm¥µå‰‰….íS(˳š¹¬š‹Ö ‚Æ>©L°1§ÇÊäv^gçG;AIÃôwÇ­¶áQ]Syƒ ŒdÔßÆxBÛ1¢èS6NØ1Ï&Æl̞Ì +®Ö/ 84¨z„>(9R]sH;¼á©§Ž7„LU¨O……‡Éà³è>;´[àF8tõÙ³nՔ""I +IP˜q.ýß²„%EMõ˜¸JhƤÂNé›ØՎ˜”þ+·èByÙkf1g–T:˜¢#yQ.!Ÿs•É\UiP ýQ‘ôfïVj¢>÷r‘© ƒ—"(|¯ƒ’~`¨CŠëßÔW9r$7ôõ +~` +ç{²ÄuôCy==äJŠ•#‡œìFã(Tef™ÐíÕ²î²-Ÿ~´u2“¡´¥qT¶*y“¶ûífþ9ôIi"îюÓrºÄìëv›âͅ>zBëR ßW×;¦ÕI2¢Û5ä%«»³»-Û9í·ÆÈV”K»=_Yý ÛÈ~{¹ìŸZZ.xwže×µû2”;ê¬|5sÖŸZ®wî~)X lyl1JYLŸS,r/¢ºÜ ¦u^Ñ:‰“”3t¿E;rb”Ø‹ïjUŸOp$‚²¸6s…0@!Ø»ôB![,¤ØóI‘3%ø€I8aºá-A'pAe>3<±×ðçIùíÚ$p;Q>+„ß“;‰ËþžazîÉøã·ç®ýä~ÎÆ|9÷NjV¢¼QÂë?՛öËzÓïz³~]oÊýç¿Ð›òÿӛšÚ{oÜ´K¼ßg͎;Ü7%_Y5Ê}·l–æyûëniÜßôzôi(Êڌoí)ùLÃ5æs n  œmYØb"ppˆÛvÆ ãŠL1±'ï±ûœ¶·¬"ö–ò ¥tQšmìZNG;ôdÑñ¶öEMÁMü6n3u¢z pãU&–ˆÛ<~ ‹,~ i\ Ÿ\"Í-X[O kÝ%³vÅõM··Uo-M+Îļ{Q¡áêb7:/½%²ÒªçÖнÄx¾kÙ¥c}ÄékäÑÝ%ÍÚÕG°±ÃéÅSÑ9Éî!ÚN¡#ç%·Eeۓ‘õ¦%/и1@†;|éMA½åÇÇ7³…Ýö .V}É~c˜ëÛuñY~‡•†£8­å|©–iÿ—(]OïÃ_gº/rVÞ ÎšÇ]þ;"*† +­¨®Ínۚʪd§"úCÀN5ó—¼=Ïï×úùÜ×µÈ}õ³)4ípþq熶 ®bM$ï| mJZ-9¿2ó=™D’ìjʇZÔªvÙ.ñ6í•lZ¢=ÈÛ@(;›m¥åq¹"óˤ·©«Õ©ë·}63øÀ̯Þø/—©ÿ”¾Gi S›´RÑÞÓÞF"3OŠÔñutÞ-‹äûqí¬Ü…Ç`¼©<&4–UdDòæ-ÐX÷D¦oÑ{Ab̳µ ÃqI™Ü)ö0…*ý6w”9šµk ¥e7bYŠ¿9R>œ™©“­MkÉ0—‹‚‹Šû°œ2“†ÕeuÓx]†üp‘:Ø<‡H›"ϋëB©¹ª¦3<ÍÍNóbÌ[7{¸î·Ë6%ìVzUëКYHЂ‰ó&Š.î(WÙĆ'PP;0ˆlçtå4¶}w—õïØTÇ°97‘|ÑýPáJä„í.ü©„ôÈ_ÜR‡iœ‘n]å7[EÜ6à„‚½¡Ð)$A]_¹ž±=œŠ +qÞrl¿¡²»”›ÇƒIòǃ¢äENöÕ5l!–Ïâx5Û7aB:R54»ú<áé؍ª}* É„‰YX”vœµƒ.ÖJu©ã}Æî½zx›û¨ƒŒ]oÃo©·‚ÅP?Ýt3¥+ú³¢…rÐMúÚRѸE¬6™Ö@ä£qz¡.Úë‰ÛCÊyx2@H zRDNó0%±U üùRE7A1…!uSK( ÊöâÈ}Ô¶Q®B«š‚;Ã[:˜Ó )DíH.†zÊ!dÏ|5ÉlM”év«sôF +)ˆ9–…“ŒÆ¿)þ³ìn ïHj1è!Ó=»‘ôo\Ίx3½ üaö\3Åq’á‚_<ùäuºûJgù£î¨õ9e]ÁàÑ~‹XCòÀkƒçµ ¶?} b’xýg +<Ÿ¾Œÿ2ÙëR/Û¸ö÷-•MMkî¨îŠ°<©˜Ö‘"¢œqЩtՏ|{\ðS’Áf+Ó5d=ïuþõÁõÃn‘OÀ0ÒòïOÔ£<ÐW0W‹ý‰þà +‹†‘írñ•ù&Z¨Å"Go +ìC¤Ð Š³%KÎÉ`²àœ¡„߈òBÛÉg‘‚_#³Qü©ehnB}•J“êk{3†{ºÔ5ý sÐ+Ëâ'èz±3Ö𢵙;W·‡l5Š< H‚c µql¦BBXÀù–_¡äs>>rÑÖÎï ¤>¶hB‡ÓYFÇosâ¥I︜S“w¾%d¦ÜŸKý ¦dŃ¢01wà¢×Æß +³².Åxáäæü–üõŸ.ûgÈßøÉ_}’¿ú"õ‡äÏïòw´ð£ü­ï“¿~—¿þ$ý'Ê_û¶üõ¿¿TÿìoËߌka#ÛBƒ»žå¯`yS²~ì:­ê²;šI&ÜÎà¿BKGKnwž Sýö؂GvÚ`ÿ ‰ž!Xçt4TY~pPˆÙ8ûHæ t&-×Óï®#xw‡Qo«ÇJqã?d…Ûg\ ¤[þ—VØÏ»ÿ üÛVx(Øë… Ö/n…í{­pýŽp{æ‚öƒ^Ø?’Áz{ʏd>ÊFÿŒ ða¥†g;ZÉ šc%syî¨6@ÃùË1 èO¿H“‘êfŨ%Óâ²UÞo£“Z_$I‹îƚ‰WÊdŠ搜AŸ±¨,¾xúH’¶^a¤Ø°;,΀ÀiÅ~'ÓÝә¥Pyö1TRx,Ü8ì9ŸuðºCNÇ3ä šcd“¨«Ü›õ…|õ|?À(ù"à£pÑO¨|Êp;¸7¢ÜËÍì"†·"ôCå‰m™"dJ+«j,ŠK–d®ÆsSVTW@:”Ž“£¾58d(Î{®äêMª©âÑ¥‹m厺çDZwÆl t_1rh +¹ÕÄò÷d郋?ᕄÀ¯2^&[g +R IošY?¯oºÍ·Šç¨0ª·"kš£Ö$©Q…EÞ:ŠÖY2wՓe·ÈÉL–­‰“´…zÉÂJŒÞ_j:~>šÄYÝoƒ¶5®«Ž`¤¼íÞ¶Hš ýŽÌqV1ºäZ‘î)%ˆù&y´*§¤V¶‹Á ¤ŸrÛoD>‹4]Üv?ˆ7Ñ.GëéњÖMu^ó]ÎSÜm3íç åe&ª“ÌɎ#“”ÊUº‚Ú`òl6&™{6Rìޑ_}5šPÆÈ'ô>L6ö“G…ßPÕÄ=äX¥¨pçÍØNõ¤ªQð úUVƒuŠ + Ÿݱ·@Ñm–| iTŸø®†´:™Š\¦Æm>žq +Ÿµ“‡œÂÑQIu”±ŠGØýíÏßâ;}AWbZ\bÐУz,ö6Ž_ÅãG¿‡'›[‡÷ˆí 1-Gßbî Z—_ ¤-ǧÏÜe1Ñ'›×™K’/yN»Ã„5`k«¬'Ø+Î:N]G¡„W˜jƒœ¦¼ÉžM=óµ÷wFfÅ[­³ÂV…u¯;“esºÔ¿=yâ5Àmå‹óÞ2ãñx‰«±–o°tlbøHXícFîdníqcl+¡C»â™K˜.f -R2WU‡õ3†ºÃul‘ºMÄ&U¹ÎÅ .¦Ðj.ø1 =t)*®Íó¾îjŠîµÐ"Éÿ  +œQ÷qÿø­ÉÐQtë×óªÆ·„v5é:/x ß#'eÿœÏ£¦ %š½QÍق™ÄƒEº,UÙCT¯±ÎrîÒ¨aފ ÊÀ±b›édŒö<£Ñ–£òèL" åüÀÿ  DƒŽK”>Èn•Áì[ǟ}+5ïR–º‘¥ªtH›ŸçhrÿšüÄ:©{ö£°œª1ùºìR´¹&…/ÓâݪVš¦ÎI“ PH^AD™ÍÜ­¥uÊÑ1jÊ%CžÏö8H6rÜÑgPØ·*Þ¤–YPÿ4$ê×@ìþ»Þz¹Ê¦âr½+Û¥DÇ#“al¡®µ‘FîUä[ýiÙ;¼I‰9÷kܑ2{&bfoŒ¹³Ïi"îuŸ„F°u ¾Œ ºØ‘b_ŒÖ1¶ àaíÂïübß~ᒳÝf8Xk¼ÿëþ˘UoDF÷©†j*œ+¬¥q'ðÌïqM= ë íúñÆ9gÏîç~VK¬ÓC*þ‚3þ1Á©÷Ç_Qpê÷ -RC¼åïñ¬³Ës75NE!s¡:æñËb‰)ž—Ãö¦žF Îð#Pû@RV2¾ÄÇê™k¬ÇØ@?À¶Æ%è1ãìk QÃ>B—†{L±— 2ı]ҌËB:‰½—zC¥\”&#»·ÒQ½Ht´­ Ô"LâïðqÉÔêE€»!ls¥c/ ªÄgM'§J7µMèT.À°&Š’ÙYq#éöà¾ýÖÔtS&ÖlF‰¦ª íh“Ðié”H‡Y¯Zfg=¶!#Ìôr©Ð^• )Prç-ÜˆQuaç5™üWHìÀt›:Ɖ ËÓMÆ[€@ÀÁd¹Yhk“×™½Ð!4¤bÀtß"³5¶f3úØÓlšÄìdƦ« &ɱ±}¸îAã?bS#^[+yä™ùâhqO‘ácÂ~—ý©i2##‘:Hãé6ؖ!…"²N~À¶®Ð¯·(tÈHƒª]=ρ±½8ôጷȱ:ˆÞ’^>~øóU’$ÉmïzE iXà=c4ÓaxÑÿòY•UÓ#‰ÍÈKwy&K ÂÝc‘úñ A€¼ÂÅn"\“ ÄöáYŸŠ‡áC~›° ©š]]d÷tìÅÕ<µä脅YؔvœµƒnÖJ¸Ôñ¾â?÷>Ö9j²‚ñ`êm÷[ª­`3”ÂsJc¦t ;kZ¨v:‚EWÛÁ}[Äj‹i D>Ê«š¢½©‘¸=¤œ‡WASJБ"r^Eˆ€¥ˆ­:ʟ/Ut ÓR·´ä€Æ 'ŽÜGmÕÚa +ž o›`N{D¤¥£¸\ê%P=kç«EföQì°8÷`c„ˆ‚'qèLùwÍùur¯ô¤,÷ÜFZÐ||âªpRD›Émà¿²à’©Œç“ +ƒÐùåù>êþüå“×éî+]Ë_ҎJ_K¶üÝç…?ÉD,Š”}¼àcƒ×k›kú‰€IßõŸ ð|ú2þm²×¥^¶ñØß{€³ªNNÏ0@tË0‘ˆi)!ÊÐmÊTõȳ#f~—`,0c¥u¬z¿ VùûƒOT;E>¿HÉ|¢þäù€®‚™ÚägÙ +t}F1 ,kˆ »}“ë½fÉÅ;~l°<¾7X`8zì¨/0dAµÜ‚êt¿ëJG™?àÏÆZô +/¿ë”J}g¶Ö9¾x°ÑmÎÓ +0tïuØoÃ_aùâ s£Ê h¿Oò»Ò›§‹”Y›n‡RaßÖc÷M}]í®ÂÓd¹1ZÖêp7QdP?·ýHŒöŽ•F? +ñsz†SÛhjk;2šþ”Ô‰q´©CU@ÃÔö•øÃhæèñ£«aðã82K·Q»x0)˜€„¸º!ï_m—Õ¹Å!#¸‘71ìá4è2Çe¸7ÚS<9æ^ 3 é([Ö³õ%8ü–BÈ|#¬Ü„MËr.L ~ã1¡P¸|\ +½˜¯§Ãââq%÷&׎ Øtö€΍¦b{8ÛÕ!ËS}ꩊ¼‡LåÝ‘Ÿ0b–l=ý úÍi´˜4ÑóÜ|aæÊ+i(|ý P—}í¹MÚ¿RmŒ*¦¦1$ǖ؏¬ÞXjOˌÒÉ®ö€õEí¦ÑÛ«lR@›õadÆ*Üá §øM:Fw}^Ó³Rv©v*ï´í/2ªdÚHYyLZô.òuP.f¨1à;P¦š¯­-B° +¯×Wú|¡)p—L¬8(·ŒòžCÕ´må9ˆ®¬úe"Åh³U[–w/™Qo²ö¡Ø:ÈxˆüàÍؤuѺ³2 LS³bdépy, +½èŽ= =Mۚ‘ùLÀ u?Ÿ Úñ„Ú}“ ¼ýDÁõaX!õ7XwÁÖö„˜Q;É­K¢d€»Ø Â+åvîˉ,N*‡ðÁn6 ë])uü¼£ße7UF!–Æi`ٕ©d¦¦ ,Œ¿´âM"Aú. +"ëÂ}Vüׯr¿ôdõM&Wތ#;CñUb÷iӔí:à`™ +~¿ o´œ85‰ì…YãÂE “W£"ç\”%¿$I˜Ki]º§ ïÀÅÏÜhŠÖR´ÉŽÖ—ãÂ|“rAòXÚaÍö„Åä&È©ÁfU*îše(‡+ksX­ê+µñÙÇÇý?ÖÝ1҆¡Þd–{}Õ<éîi‹K(N‡kâÁîjsJh{4§Ô5v »±SûÃc¿ Æ5–‡¬×4ű¹ÖàâÚ·5ž­$ŽKß NÊ#tÙ.Ì f’³nÞ,_RVv‘·´T1ášÇ •ra¸ +öam¨:sŠ·uªf ÆpÑ0ôÃf¿èŐ/jnjìoñdò/Í+ ¦FÂôáKgBô¡U;…÷ʸƒpùû0à,ý­÷q²™ª;¿Ë8ö¤M‡ÅÙ^Ö1+ô'ÕËìsŸG3ünxœLÔÌîȆ˨»‚5[Š…cTÇ>-»†t•ìÉ0´ë¢*—ïr*b²¯§QÀÚòs`i…ï| Ñ#=~HþÙHjõ+qÁNF>™—íJ}@"îÝÂ]wªÈÍ­îúá:!Mx‡Ñã ~ž‹'âQB(ºvúO¬hÄcͦ°=w°î½jN´L˜ÅÑ S=ìšh\ ÕwSÓðÛ˓D¼PÄs26è‹nø›Öˆ·“úð˜á‰›ÌÎýIÅv¼Ë.ÈCaö*»Ê’5Øem§qoa Cúܕñ·<÷}¸ÎE'ï'ÿöª4JÃ恁ƒ÷Œú£U(*Ý찉'¨Ê7ÓB¥*ú¶(À1M +š˜ý°$;#:i±‚®’våÅ®S¿M +ñx“]Ú/-coñu*eRÎÛÞʄqÌëZvF9U†eé6½Ü™jxÉÙä>«·§lui>xì'$K̓†5_`°¡:åÇâÍ p‡z%垴<~ýó/L§ îîk`%DüÏã‚ü\¿ æW\°Þ¸`ýí¹ n\°n\â‚öŒ; sA=d0þ2X´ÿÊëã%?~ìa¤ +ú‚ øa•ˆŸ~´ª«yÀ\©…Í€6T» @ \® ê§U™¹ávÖA,'-¾*ÆímJì‹ÓpÉÞÐ\ˆWJ*Ś‡ª´™p;TŠ>}Õu½A¤ØlwȀÐ×mži¥Ò½éJó”BÕÙçtIñgÑÆéÏõÛ¯ëù*dy¦Ù ߬Ë%:”{‹Eê¦çj±Ÿ`–3ðÙ Ì>ÞPù’átƒúš¨÷r³»¼âÆa¸ûéú侚¯¨9¯ZukQÌXæ¡\]W¬Mf†?È ùT>ÏyÛÓD3ÿišëõ=Uërd{¹£'Â8÷>—6Y»ï˜I”ÆÅ~õ`;|Ñô…K¼àuA_ köuÍ7äÜbÖ7ÏìÇ맆sÐp² Z¬ W½•Y÷$µššÕØôí³x¡e{Wãðì6=µf¢îöIÑnh”SZ³½à—žNŸÏÞ.¤Y#n/Ûòµi]7ól±ÀPÑÊ¿©¯’ÜZr#¸÷)t}LŽçùhÀ‹öÆ÷_8†ä{%© xeÃéE‹C23"Ò"þÑ8Ñߙ:]uÌƇÉV¶f>¸fRʐó-٪ꤲ^µã˘"YÒ~ +îxPù*îѸÓûE:x3ïêm½mZx­®ôšc5Oéýò¶ò~=P3Q]ú`­ªbp–ÊÇÖ«¯$‡˜Êž£~%“¯Í”»ßL„_}‡l +Icæ/¶?Ê6ñÙÒQé¸ \6ˆC¾«Rí<š:ª‘d5 ¿a˪rhƒÐ\<ùùtŒ{œ¾Ýh EžÆeÌÀ÷¤µ‹«ÄfîÝÖû7"åkqÓàÒӚPɓ²ãdÄ"·Þ?þù†<ýêBIÒ0®…‚†ÞÅÓ°µy +þ4|üÕÖñÙ;®ö„˜–+p˜û¤í÷àoÐږ÷¦_?ɗ ˆõþbó>sIÒQŒ×jO˜Š°'}mµ÷${á¬ó–5ê^aÙút¹ò°?[þ­aWt߬ÊQ1T`»Ò»×“¹r4] +àY:ñžoÐÛ΁€÷ÍÄxÿ|©kS)? £úgÂÚÞ3j'ëx‡ïŽó^ ¿Õò©‚¥àîüÚæ…«GY;‹£ûŽeÇp“z[¼wºT§º›4X LÏj.øóB1ËÆâ±6¨a}¨©L‚<’ ‹ « ê¹öŸÏÂÆ@–b´ñú4×(£S›…]η©)‹9iû×õ{Öô¡¬Ë5Bb®¬Y:T¢»¥(÷ïwCÅ<¬4C®ûÜ ²è :ŒlVF“=O¹Ù’RDƒŸˆ´ó#û' M9.º½ZÕ]ŽãÓC-™[¡´£qTµ*y“fó|›Ì¿—>iCč +L0¦åt‰Ù×e—âͅ¾¬~‘BëR ß×Ô;æL‚"Ñíò’ÕÜÙݶtNùöÂXՊòÆiÏ×μÈ6r>^û§QŽ ލgËÚ ö§!C‰°£¿Á©¯^ΚàSËõîl—‚$ȎÇ£…Èbûœb‘gõãþ´œûŠÖIœ¤œ¡ûmڑ{%Rb¾ë]mN¼AJÄ ªHæ¼a:D¨uAo’ÅA†½4ùR|®ß ©a¿ø·&Ÿ'ZlÔç׉=½¿¸O檯íÄ3ŽqŽç“5‰{~Ͻ÷d¬/o_§úøËaH¸ËÑÿ3ÿkSŸ?ÿ5¦þç3q»0—ì Ÿ÷Y×°Ë÷JÅW֍ê\×!›–¹Ýžº‡Û÷4³_M:Š¦’å­7­Þi¸Æ~¯Á Œ»nk¾ˆŸm%bÐ~ Ä-;cqE¦˜Ì ȋ÷8®e.i¿m»È|”ú@¥¼hÌÖõ§£]y±Ðx[yQ[0É~к%;*–7ÞÛ}ÅmîôèlRdë[H×Zøäæp£ÄÞät­‰P2'+n&Å^#Öûݨ(íš+n/#_îÎh÷©ÞA€•ˆn/^šÎ!HFQu ÝÕ£¸jiIòš‹çÜ C¾sfÀ—ôøý=÷áöëF2Å>¬«þ%ù]? aí¯{¯²8ü«¤0\ÍY]Eeí¨î,”ϧÏá_gz.rWÎüfÉã*ÿ!rDP Y1ÝØ<¶µ•TÅæDì‡xÝbæ.ùx^½>ÐÏ÷¾^‹ ËÁ+ei|Æú•sê\‹Q.äïØ:uººÅ،=ñ,¤÷‘ˆ& ºÛÏyÎ`Ðp}y™MqÙki [¨—ܐY“-%î=”ÓˆÅ(ÖæÐæ²¢ÄÉäviè ëõ³xbe-EÊÅ_ràë6ä|›4Á69TÃIîg +•ábÚNì’"“ A +À¼©üÅåž~:·Üu›Ê¯nõ9»ª‡õY&qÞB©ÅÕ.„e5;.H«I£½`ýNJ,——sčv€›ü&àT·q6ÓG³ÇY£È„Ưš¤¶ß‚U6{–PxFrGWkÍWá@q+¶O‡=eò'651lïäï:è„q”ˆ0"õ.Љ\Bž,ä/î¹Ã4®È·©Œ9„›íânpC·>6²˜y@5M4y ±=œŠºpßr,߃ÆÙG +*Žx°IùxÀÛ%¡LϾÙuve°Y8>¼„.¨t>ä° K¤Vhvu8x°ÂÓ¹Ú6¶ƒä,Ì:ÀVvÎÎÚÆAÙ ªÔñ¾â?÷Þ=|ì<êb óÁñÙÂ侀‚ÍPÚîI‰™Ô½XÓR5¨[›~¶õÛS‚]Dl›‰ DJZPIچ9忦Fâþt^ÁMIA/ŠØ©MªâDÀRÄWàK•ÝG4Õ ¬j€aIŽLD%7w¡ÓÍ“näiwˆë¢h ƒ­íÊ'_í¢Yd™Ø%`qH7ªÄMB¨‘S™šó¯ÓÑÛg°B¨ç™ÞÈ úÏÃ7 7£f࿈²àž×R”ùI…7–Sþøý·/Ï¿|òuºçJwù«ê(ö½åXÁá1/þ$±.–œã…¯ Þ×öÕþôSýZÉÿ̀÷Ójvöøw²ûÎK}ÙÆk?"<É:l`H†d¦W„å•B½°Å +¥˜ƒTr‘¹D^°$ ÿ”f°ÇªtUÖ¯?|¢|ÚtkŠ‘šÿ|¢ÖäýÀ¶™ˆV–]@è3 +:˜`[¶ÀõXÀ؝› Kƒ¾ã×Ëûç÷Þ*6Hyvëеœg°ºšÜ?u¥£Ìø³±½Â—ßÒÅq ¡9~Àƒ&sf@oþ£ã1ü+,uˆÎ– Ñ+(Øõ¼p‚%¯æؗ¥ˆ«±»¥Ø·Éu˜­•Û¡m3Öu½ø¼»e·³ ],y°I€¤Ô.nKýYüRÀÀ‡É퐣á*q궄¡ Ӎ%»Z a„ýI±¤k˜ˆ‚˜ä2Asﬖm·*ò'<֑…E—¬¤ˆ{_J/ ¥†Q0öQµ&ç4B‚P‘ÔÑèؐ<¸R¡:‰rUÇaљãé˜ÚFS/MÝ#‹†ãhR‡òŸv¨›òÃèähðäO–V¨óÛN±>Ȝ`\‡Ü\€(·|wÕáÛtÏ6XÁ y@ºæà=L[ÁAI±ÒäèHñ@Ƙ;1\ݐf°­š߂Ão7Ï Èd#¬Üä„ãcÓeÓNÑj¿¨t&\=®¤Ú`âWÀÝâq% ƒPþ£»BxaÚè'Ž‡³Cr;Õ·§6ªÈvȼTÞüé #„À%­ Ò ´K‘!Ú̙žY"՝vÃJ*^$êÊárîž)-SÓ§ÎrÀc<4æÈœµ2§–Ì3t¨›j VS,=?t.) äÅ¡\b³†T€£'ü-ý¢±Î×´«äþSªí„j{ÙñyT2l_rñ‹¿Í‘]Òìêô69ÉaâQÇ¿} 4‡g‰gžú•yu§{d”òˆ•[Ï#zûÒàùåB~©Õ•AXƒâÐ%­"磦uChh<Ž#lÎBTî ˆ +oF=J¯ C‡K£`’ŽS;îðñôî7N› Òé\~|¨æ>:h)Xí¬"Ü4ðhz9p§Ý}#¯‡n\)cYy™ÁYé‹X#¸%¼­0}´æžg–ôÞ’ùùU’kɑÃö>Å¿€ +Å|ž^”7¾ÿ¢ER‘™ï×»Ê ¸Ñ›‡ä‹Ì˜$‘TÛìã xF4Òׇã$!ǼQ(]=VÐ2¬‚*¯ü’ìÓbhÂFš¸¶Ê.rù-º¾ÊdBOÑȚËîÖ ¬¤µ8¼G½ZÎøb–!j¥ÑU¾¡b$W4¸>8æœ,.y©KeÎòr¡€d¹(&´ÚÜÅÞóͶtöïfô?Æ áf,øÌhxd“ ãåSŸpo×Bê?u.8uÊ4OSäÌQºøHŸÏ|­Crdr¤öªóáKjIә^ܑ@¨÷yƒæçŀÜ:ˆÛŸQkµ –Ð÷´ŽMŒà Áâ7Œ¹“¹µÇ±mŒÒ$ÜÇ~,Lʲ‹¼m¸'ˆ×JÀpB¾s ¬‚;ÜPx ¨lj_4.6 +"èÌ>ÃåsAY¨täŽl-k…:¥xéÏßâ;âÍP@A%|ùÙ·[ARU ŒÝOæUñ@±BÁ~>ñ”õ‹ŠëÁ¨‹~°1[f9I<7ç‚Õ‰è!cim‚ª9›îX•äp^WGL"^2|z‚À¤ #þ|p¡ÍâvËôšXŽðWmLwd4"¸Ö®Ûx­v•<Ĩýíy …j +oÅzSö,´2órªZS-µloÇÔ±»0Ãbt§x©òݾtyÉ]ï~&lç]œ±œiL×sÖÀÚÙ¶Õï62N 5nš©wÔsbd3˜ mRÝá{‚\9SU)k±z-Jy ³CˆM±·x‚*Ê"Ó¶Ráaë* Ü—Û7tÚqc+&$‡ÿ ü¾ë&4æ“×~Ǽv®Z!À0ùEìwÉVÇê î›ã-sÓEE-ŠÆfËøеˆ£m¥a)8¤–ÙÏԍu½G#5¦xr5UTUe4d«™d1Yu÷Sò+g FW+Ö +³x)–ƒ7F ›­B¬­8wäyÍç.AºÒãËܱ±ˆï—"éó&aô+å‚@8‡¸ë©ê·uc§»¼©L@*ÍV["|‚¦ ÂIÚâ¥0ê°1š˜—Ñ®5·vï`=[ÕÐxˆò9F +¡^šÅ0ü²‡óq¼ü³à‰{n°|€ý†ï|A ïñ½×Ëçc}pþi¡„Úa!®‰ñ%ñõÅÒ pä smIXøãŸç™jÎð<õû«Ü„CÜ!. ló$>¸c¹”ÉÄÞÈiŠ +´Ñdç½h¤¦è B§ºc_Á`©5FŽ# + 'ŸE확¦“MH°ÒNG<ý™ŽªÑ’8ٓŽ†éÕèé9Œ /v†—Ê¢»™;W÷[»*•ôÀ1Z‚8öH»8ßò+{ÎÇG.*±Ì¶ÂÄ=NgU2ÙûLšÇÕ85yqç[Bî*µ¹Ô¿`JÖº-MÌ4+W4®å¶.©øPüъDPNøü;ÂW_…o¿ +_ÿ«Â׿-|ó¾ò"|åƒð•¾ö¾£‚ÿvá«ß¾þáû1åk¯Ê×~Pùú·”o~KùêZŽ‹uoŸÐe=…/žm ´$X(ö§.şh&•0çæûÙnā՞ +rÂÊD<Ö`‘î·ï‚"óa&,ó6ôTY|H Dl€}$ïRÂ5©]O¿q=ú[ÃeÌ8¼}d‚þïd‚ñ³LPÿ+Là“ ڃ Ö_c‚þd‚þÂýÿŒ üç‰`GÐæú +à»Býδ°•¹ \šÑáú¸ŸR•þ™ hJ• #3VQóȖYÑÛÉ°þzS#¶hm`,H+6™aÎv¡0kàÖ _¼Œ|$I]adØð'´ÆÀÁĆ'³Ýҙ•Pxø1TQx4n¶œÏ:9[‚j´;CdPFVMúÐ]îM)~ËÛ¾Á°|ðnFí}…àšÅm•8nôý2bìx-ŒÒPyb_¾ToÊ+/ ñ2–hh®Ês“SFÑTXóØ×yr´mM# +ôžy°¹ä"^]ºÙjOû/rŽsï Ú@í~ÄH¢)lòª‰åîÉÒ[{Á+_eÀ\Tr iïšY¯ošMƒÙt„ Ç™#¡ŸuV5I945T!¢ÿ©³h¡Õ% -½ø=¹‹§«L’ê%QW2^xªF·¦ãç£úAœµµÇ /…ëNו¤Àš¶E3‰XՃc¦ßQb£¬m0ÛlqêB*å©1ß$•e•ôÊ·¢܄Œèënpù4Ž6içšÙ¦¹h·å/?«ZhTÕy)z•“Xk‡µ™õóò*Í2ga)(G)\åˆ+¨¡mk•7±éØÞwäÁ§¶*MŠ±UÕÓv­Bƒcrð[ªšÒÏX¡¨pëÕI.º*¾A·Êjð(.ø|è†[Ý Ûê É…jª*Ƶwµ£¥‘ª¸žÚ¶y?ã(>¯' ;ÅsÜK»d›‰UP%ííÏß❧F‰¯(9/;:dà.žhÝÖ8~_ú=<ùÜ:|‹à~€!¦v.ðÚíëåP▁ãÓ×Üå(a*¿²yÙ’txÉàÊLEX¶¶ô+½ã¬#ÓÛ¢LÂ+LYŸFS^eÏò™¯õˆÑAÖÄ']î¤` ìL–ÍéRƒ©°§5oÐü¼0ïÊðx¼ÔÕYɾð þ™°”ƌMÄÜÚãÆ>¶:¼X<Ó屆©àra¾P“z TÞÏ +w¸Eê>q‡0©Êõ͍À`áb*è¬ä‚_tÒ|"ž»>™Üäè‘d€ Qö1ÿ(ŒZ`,E÷q=¯â|Kh—®;*ÑÕ L¤¤Ü_ãó(iCQ—³Wj90ч±Dµ×`õë,æ.¡€žŽ†pH{Â5[•î4çGi -•ö>%0RPÎܟ24h¸Dç²j…Qî[§Ÿ}+1'¯R†Zí–$a§¿èòKÖW®z3÷$öÄv¼ë’¥“Ð5m¬JÛm¶ƒx­ÝĂ2­ûOFV°³€¯vÇÓ4åèuJÞ.I²{¾ÇArã1¸›Kїj]-ç)HäbZ@«ý»\]œô@‹†we§TQhvä.¼‘'–ÎIÙ뮟FÒ@ùœ!¸&ÒóÆ×¹#%õLĤÞkN½Á‘\Ì<¤yäATò€¶Evª-îȯç?-Z\àŠ]Æå~çûñÖ,Ág†'Æï¿<ÿ±ZÞ®]zËÁQ´À‹_pª7f$0j8nâޕ°¾¨óõ +æÌž'‘ʨîHñªMÿiµOµÙ?¯6þ|üjãÿ{jÓ¬y!—‡´|´Ì.¿]Õ6™bքÊ8T^Äs«ÍÙ²{Ü[W{3Úѧ} i+¿N*U9Ó`u¯ ô³³-‰:ÌXÈ?õˆ†º4¸µÞ€š˜Ýâ€d?þÙҋË@6jA·ò@f­ÉÆî­|”y6‰Ž¶•‘Z„-Å "lmP/l¼ÑÄa›òëøpoz| +tY'§HWõLð˜”þ„Q4êRSZ¸ïöèhº+Kö¢D³¥òùP5)<–ÙàՋ–ÙÐZç=֋^¤˜YOgC“®6iµÁF‚`.€²´¸Užƒ_ÉÝV2ȉ©1òô'gÓüû +ˆë® +:Rà%?Þ¿ðZm\WڎÿPYI‚ ð+½  ªÁ{Ó±§ôÿk°+†F]f]}R?3((4Z|xA¿#TAӔ²Fã«(ƒÚÎê­Ûç›*H"wGÒ;5/Ê£“B̢֝-Vƒª6£„ä e6Ç" ‹_ÖqË?®RÑ3(z?×âÓ'Àµ;eè endstream endobj 59 0 obj <> endobj 64 0 obj <>stream +8;Z\799Zj60/5^%rg'3d^-OBMr +`$[kcgF!'P?je,.t3-_>j)es8Ca,:IClL_K-.i8 +NHE8'JuRfeWI)#jr$T;`U?SM8q3$kE3B7pN8P1-HC'00,@uOVUn/[Y +*&ZSX\3eSAgh7B21La>W&X,$$Z_7c%g/[;AT5fhL3^o#4XO3be9Km!Yd@=d$2+i7L +7+)uN3o1=@:o!4PJOUe'p<8fu-s;V(cq#T8m2;=q::RJ;b3@*QI3`<97HSs8dJ/N. +I3_mB<8KF,)b]?=Bts#U8*_ru)(\4jf?Xj5?h)OSY<+T7h:Ips^(9uL.PrVn!tL(n ++5OfAaM^"*'!=Y])R<=UAC_lE[*b"*!6="\7MS,8]**f^]GG&E'rQd;'cKekUpNa2 +Du9s6!TXKN)R@lga;r%:7o=@SimEP/Ok-9kpqAo/\Z\(Y:*1JuViT\ermQPaSlpW6 +*tV8$%(:$3,M)djdtZ=Ac1i4Xlrf;[~> endstream endobj 60 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 314.3819 398.0284 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.518 -0.635 -1.523 -0.945 -1.415 -1.212 c +-1.666 -1.447 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.483 2.877 -36.883 2.401 -36.618 c +2.089 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.945 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.059 -0.688 -1.808 c +-0.283 -1.884 0.143 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.806 c +6.404 3.94 14.394 5.401 21.671 2.964 c +21.715 2.674 21.885 2.406 22.161 2.251 c +22.636 1.986 23.237 2.157 23.502 2.632 c +23.767 3.107 23.597 3.708 23.122 3.973 c +22.743 4.184 22.287 4.116 21.982 3.84 c +14.442 6.371 6.166 4.88 0 0 c +f +Q + endstream endobj 61 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 316.0977 392.2853 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.929 c +14.603 -31.195 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.473 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.588 c +13.741 -29.6 13.738 -29.611 13.732 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.652 c +7.057 5.845 17.421 6.119 24.149 0.112 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.145 25.948 -0.669 c +26.213 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.06 0.828 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 62 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 340.6773 364.0192 cm +0 0 m +-0.475 0.265 -1.076 0.095 -1.341 -0.38 c +-1.463 -0.601 -1.489 -0.847 -1.438 -1.075 c +-9.093 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.081 6.445 -29.063 6.477 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.894 -29.725 7.93 -29.871 7.938 c +-30.878 10.299 -31.418 12.86 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.019 -12.412 34.929 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.385 -11.451 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.812 36.226 c +-17.982 35.97 -22.797 33.819 -26.45 30.107 c +-30.309 26.187 -32.411 20.998 -32.367 15.497 c +-32.345 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.763 7.476 -30.785 7.437 c +-31.05 6.962 -30.879 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.155 -27.733 2.471 -26.22 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.977 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.866 0.476 -0.265 0 0 c +f +Q + endstream endobj 63 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 320.856 356.1036 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.253 3.019 -9.758 5.485 c +-14.59 10.241 -17.281 16.595 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.736 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.189 11.741 50.056 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.704 42.033 c +-15.634 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.819 2.273 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.267 -1.254 -1.558 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.341 c +0.646 -0.866 0.475 -0.266 0 0 c +f +Q + endstream endobj 226 0 obj <> endobj 225 0 obj <> endobj 224 0 obj <> endobj 223 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 54 0 obj <>stream +H‰ìWˎÉ ¼ÏWÔt)_ÌÇueÀ'Ã0|ð4l ØÑký?`F³º[3WŸ¼0btf1™|™_þúõøò—¯éøåO_·tðߙìøõí˟ÿžŽÿà¥æ³Îyز³Ìã?ÿ|û×ۗ¯¾~ÿqäãøqÿí­•såq´™ÎÙËQÊÙÇ8n圵éƒß]U(˜-Ÿs·‡¾¿]Ç?ýw× ”±\s™õhvæ¼ì¸çNü-gî®&~b=‹Íã–O³àþæç[ÚðVÏì§ÅG ›$úÞâ{ãÿ±¦K_ ß˳¦ýMÚzý¾EWU¨qN1ړÔWZ tÚþ„"tR€IÆ{ú^¨^φñ¦8d¯êüýá6ìîaøۋoçYmÚÑêÙ-Õgßæ3uٚ‹3/œØÆ +àæsن8hX•ky1å•$ãcc›Ô5+ÿ«ãBô†]0ApR8ÂýÜÎ\'Üëž(Ž,OFß/pÏ>ÿ ‡HäµöŠb\Ïٔ4½êTä*àR°’ÿêq•™um@órÄÀ¸Gև`ù7JÊZ¡­–гëˆNáwi\(ŸE¶ úÅÉxÍÄ]sÈ4­Õ@ ^kçª[]á¨ûÛ·ŸÂï•’ßÈZǎö¿ë.{êmTQýP˜†ô‚½Èð”Tc‹ä¾òÌ×:7tÏv&oŸ— bPfƒZ‘ƒl)ˆ™ÿ-tÝâŠgëÃÁ[VQ¥W¥v”–³9yÂø;dœ‡Œò³3V, "H V§¬â7Ùyñý i’¡¹Â0}õü-ÐûFøF£«vcdÖ÷J;i†gñÛ>µâ‰ó0ASÝ£@.í1þƒý'`}f霏5M]Éú§þ|cüÑõ¯®?ÿoºþSx§\è˜þ$ðÛ>W!’ך +EwxnNRz¤L£[ Ú*C܊qâí×eŸÐ>B;_n^Ë3´>#«nlٙ$É(Ç*. È'³óm¶DR*ZµÒ…ÎVZ +½D»Ôcdõ XgvÁÄá|}NrI܇ køøyÚ@AO4Ñ؎K¶|¿,慩[±±ß»sJáþtu/êJÅ­ü¾±F¾evwõ¬â%õ‰ÏãN¼øª§¸¿èŽØ_ÞžÞÊB)®À5ƒök$$Ò' úJu 1T™‘¹‰D6»ŠdK,q‰~J¬D¶=†L¶œ%•îò­‰sBSS$¹pç‡âBå`SË+.^c9- P¤±§Üï×h‚«Ð©Ÿ^j¸÷¨œ}¾6> +¬1…r¥D\Š<ö½ï¢VA– ½ó5¦ÑE-‹Õ)™ü°B`Rº+Küõ¨À?³¬V:û' +Ͼt¤@Rpœ9‘лhQÅ=&Õô™««‹CŽzÕ¹¥/lEçƒihÌfg.lÁð°à¯>œ0zû3M—ì.éBÈWu’ìr^[Ñ͕·¢Ûš##Û2¼ú¥\¸(v yÏIëLuê~.”<±Õ$Ÿ,ŠÃwÝ.€èöóGÀ­Ù|•×¥W(!p ´ÀøX…»šç“kÒ6€J¨inè))9ז$ðJ)ä4Â}ž‡Žþ+ÜÇÔñÇ×v¥ó>^æ èÙßmÔ±ÿsñjPIÎöΕNÇ7™âgÕBïWuÎûKœ +º±T•¥]m<´6D+፨&çˁÖP[4²Ql÷d÷ŒXŒÊlšYÜÒÞ` ï?Qaù?Ð=Ä6D‹5„¾•=Íϒ7¼ëá\÷ø¿|MˆÑ+_ §:T[÷€÷žv§‹Ê·µ¡áH5GêhL+, äÔÜכ^á'±C-Âe,¶'¦~oÁ°ÉQ¥B…QÛ·\4„"H|wE!ã¨ÞhìáÝõ¾%†NìQV£Î*sÅ%à–èF6´ÔT^PºgAå$›‹¥ÚIù}R|Zc¿ÓX‡ ՉàEƁ‰åü»æ³ƒ¾Å äÁÌu0ì•\ènm6Þ¶?Alµí97Ѳ½J …nƒÔNNk"øbkïˆÌŠÃ§½(¨Ú½ +Í –ÖÐc­ÒŒµƒQg=7M–QANÇ“ ÅË Ô·¾ÛL×̈́Drýà8?ž‹ýb\Hnäê^}òôl®Luäā/©ÙlˆùœXö:£œ%Qs–çš °'uP­OÍÔ`)ڲэU_Xë—mÀKÍ üÒ~×dðEû/¤þ/!…ÖÒü]1¹ÕUàSK6 Ëîb’Z‹š¡kìj‚æñª3`P´~*í ¾‚÷½{i,i–›½}%å ¾NÁ¦©nèÁ›ùáœíª‹´û§Ãۂ¶¼é2Hï1Ma´„loFj òøbë~Ò¿²È-·¹yb{ ¿„vc æE³À¢Œìi¾C νH "»K”U-– vçÙ/#{Œ Ó^sdmÉS­aVëŠÌa³«StÁI§lš™=VȀŸ2 4º>„¢xÜj̵ssžY¾î[½FuÍ£Ó<êËêw³ºêUӊûXæy5¯´j² t›{M}Ôłs¨ÌÌê²g3yj¯<Èf|ax­Lå¾/ÐçëԘqåã¾xàÓ_˜ Y½&CO<B̍È5hôFç-f°€:+ >Ng®’Ï +«^ÿ¼·ë>ûÉ.7ëUB„Taë™d±aÛôX)k´ï׆‘…„fdö"WÞS¬RN¤ËÄw.|”üG¼ŠßmTN<";«¼å;Hû¦Qã7Àq…VTÅL\U¥RºÊMµÍÀõàx³ööx÷k†/+/n†Ü{·"3ÂkçlŒéÀ:ϔ›±³6g9pˆñÿÆŦØÍùïkÃSêó.T`5¬^,]éÓy½m¯ºé™”ú½¨}cªºázøÓЂþý*ɑ$7‚÷yE} ܗ÷4Ì¡ú¢ÿäfæŒÈ,A=€h€9%-Éà⋹¹Œ7u|sm?T~kÚqÍÙƙë‰*ÈIÄ –Ë%¨%ÿ=Â2ÍåH‚¼_8¬dbK<6{óXÕ2R°´œï›¶×ˆX{€O¦Ïvg»œ ~vÚTßVßgfÇØÂOB²±†$O½NÊá>ë7}2Ó°o©×”çP螔÷ßS¨M¢A¸(ô`!>=¤¹)+…^‡`÷baŒ//$ª;Dx¾Iž}E¡çTŸõù—·û>)to Žé/E¿uùÑ˜ä%†°y™`^àˆyäÚ" 8¤I]>D¥l{ ˆ¨Ä&>Îî ‡21Ëby‡¶xïéâK‘THÊ¢P©ëÒNBvQÂüæ«Õ éíœt†¼Ä¹=ÔԜ½ýÿš¨iœ›t­ '¡¿ +;ý7È©M{‘1MkèS,ßN답kÕ°·Øe:P›×œô³%àe|¹O4Áp´'¦û9r3]³)>ºÚ¥ +ŠS»TÉp«QA× +ÿniQÝpïh—RÌA™ÿHcõL¡CRcý©Î¼žŸ‚“bV—ˆ/ãvo&Þ¿§>åµo²¨oN M™8šdyÓ]®E ãÌô³ÀÈ̟œ} e>Å#†,2!¿l£c3¥‰ Ð ¡é£Q¨¨'ñ¥Ô.hn±ƒ,`‡Ò"á+Íà’š¯9«¢+hȕF-4³¬ Ç¥3Ÿt3±Â±´Žzèrçå>¡MöՅµ7»ê¥èJKÆ)[¤–IS¥*`mµõ´;뗁³Úrø0ñžŸòA7’ÍtcâÊVÄøP³BÐjÐ¥5†çü©zÛhHù¾I£öàGœäøsGC~dÙk˜[é›*Ë|›ˆ”Þ]ÁvÜñãsv·J×MvN£”C»i7Ɵ%ÊÏÀ¶ÿbêf2·oÏÝÝM˜wvEÒ>t¾ÆàÝ*ýâ0w˜–i€2p™ª¢T‡³nåø‹-‰4us.YdË m×5/CÂñٍÃÞ¸[šŒù9¦tOsötקMîWÁ“ö }†_ÉãóšuÃAú÷§_Ybt3¿åÁw,FJ -ʬ;aâ"³ëLäV$hf¨‚vY´ ΍tð¥öÆáüM’jìNš¨<Õ:¾T8rÛE‚›ÛkþNè˜Ïøx¤»%ð01µñJœ"~ûuŸC¤\ éè6ï¾X³sŽû§ýxû£XÞ>ÆÍn{ry?nÃ×/JÄI“ÅW[5Ú|¦aƒ!©âÐL$Äì>ôVY™*(PJ;¶À—Ó cw¶„iÒƒ 8z§”,N"ʍáx¸KÈü°¦§¬Æ^úƒ8iRM+Ewt€ã[nUgÕ(f¬Å↨©ä1U=vË¡J!w˜8Eû÷³ƒ©; «>H }SL§õƒÅôoÂûkÞ²ã:Š°eÔöö{_Ei†øYЊh}™¨[zX’Ù[UÉά¤š‘–=QÕ |;°Ìíê·ºZeV‘íµŠ÷OP:Ýóþ$^¨µ"yƞˆêäéÐLÃ@É u9@¡ˆdôqIgøZæwâ•ÿ÷Aß_‚¾ÿô¿ôýôýßý&fŠ:Í×7ORý—+ä'’, 1JϪ@+P B}E, x•ÞcºuIJ4N³þqÕä{°3òVõÆA† X3WÆÞRi,REWUo @æ‡õ¾cþ=~Ÿ«Ö_k£æ.÷6*àlìgKG‘…ò‰6jŒzµQ*rWƒÕQ<ÓB—Ë«Q>aÕVÐ6iþN·Têù9 +*öP€¯Š²òD]…¿·Iuï_h“Ž]r‚¯¼Ð͵ۓªyð 0pd*¢·3zö> ·æ‘-“µv5¶vA¿Új˜j[ßPHB¥êC¹ï3š[õ3ç«Â" íë%r’wjµ³çƒ³lÊÜv›’ £!}Îü¡Uﲆn€µ*BˑÄöQ,` +#zq Þ"€{d{‹Ý!¸4—ËE §Ý]hpï°ÔÓ¸LëÀϋ '£c+‘“jES²ñÔè>{¥ï˜åãnâ×|É©BUmÆEûQ5ºY¼_|òDŸêgoDiþmŠj»j¢òtKŒ5ÏÜ,g¼ôj¯d¬Ööœš¹\ßL~ÓÇ @_(ê8ÄüAä4ÒûE!-­:_äïpKӕP5R„÷Žv+÷¥Ø­®UCö{ƒÿ±ÒéÐr¿Är#ÜäYêp-VEÕìⲜ/–“ˆ2£ˆ¤Z‹±2Œ] `}ÕÊÌ,ЄOÑ%PBÙµî±Ò ¬ùšKäXÈ8,ˆ\úS,˜7ڋF4SÊ÷hÇ?â&’NUé†(Mœƒ&Xñ•ÏÄLÓ¯÷…T–û¾%ofÄ8íS|”¼íêH{Ó¡™Žu”:ŒQxæZ#j´#^²Hì“ÔÑtÅjóÂÒìÌ½¯Ün,b§L‰Y%¥ 7„ÍOí ^ÙØ¥’Ýr ¾2Yˆ4÷ýª:~–áÕ@XöîY¹4eð2Em~qÁ1Åáµñ•¼OaqÚ…Xþ…Ѩ²»dӑ©òu¨ˆ\¸o?&狙m£Å×÷\yDp¨”3SQ0û¡Š/jQ¤uí:(ÿ-PŒ Ë¥‰ãŸ—ü|šfmȬ5‹Ä28°fò¦͖«aÖÏl¦½‡å/02.]#³ªutJ(;³Y99JȔ^]A©(®M&ÚÝõߪQË¿@) ¯ÛLc‡Æ:ç¸âF ×ìW`pÓÕº«r/Ðoõ …vÛ~-Y0Íñ´¡E_Ø°©nïå6›ù £;«Ÿˆî ^ö“¢CÚÓ~häKÔYÙdL£›OŒ5Ý|MJ„äm‘¿IBŒD?FHæ“üþ +lÔZµáÊtKî'€ÄlZ‡†÷ ‚¯¥7àOüÆúL(µ†œOœ¿ç´Ä ùóŠ¡óÃí Ó\ME#µùŽ­üÌq–¿ÀÂÚrÎzÁ)<ší¿J–GéaxT45WV…UW³Š«|1âîSF$¶-û™õÑ]%9’í8lÿOñ/P ÏÃy Ô"rÓ÷_4IÉ~c#HÓ϶dY¥lô/èC¹u̅¿[ÿn½~š}²Ó‰Š^!ïhÛ³ “¹`®7ôâ䞛‘àA.~•›ú:»™ÅÎN».8)÷Y ÿe­RR3l¢Ø+m^oˆ49Ød!áþäÎ4rñ«0×[’{Ü1ܹ/G¢ ;†'…qõ¬ >»’QØ+†/Åq’wÃÛ·RSUc:ÓÃÄ°1@’oZ{S=ûVEÈOOA8E¹`˜VÉ«ÒEBÜ9’o)«þnLÂí)ÂxøZ½Óê4^°i½<±BßKjpBRɞI.éª,Iüµ$¼ ÑyØs(ü +[ǽõ÷„#/Z™vÚ+æú/O //¨«º/¶ xýëҖPûËDáÝ· þ^'š8 +ôx¸× ßR¬{Lb}Ëۄ«ŽFÓñ2±®ÿ÷җ5ùI~Di-<1¶Xòa¡IOŒ—,ù´þ†ÃJm(%4„œËmݨÈ%PyÄÃß³''²ð_†Þ°ni‰£ú®¸aåX)žs¥Y›Cjè[èè®XU±î\[­ #4£‡N4ÖÐ=Ÿõ¬ÅŠ>°¦:PœŽ5Õûl$Ç1S¶×Mæå\K±\ÂzÁ¾>»cÈÛ Â®™kÜ „ü»-–ÆŠ4‡:Bmî;(ÃY’hsÄ7LŒÈÄçIƜÀ¿"M|š(r”֐çûÛDÇsU›è¬JÏ ;”/‰©‰oôé®î´u˜»í‰6pC Ën”‘ƒ ¶ÓÄDX­Íˆ²ó­Ã~(-Î||Ç+Ìrì> Ÿî.Ü7/Í®šÎW)‰7W*Åa‰ù€gY6F¯µ6Ž:Î7!ÔÅC:}jûöîOvÒĒî»]µ‹âŸKé o=ŒîÂ2®0׀É Õә÷¢wˆ*©ã7ÂqmÌ®ªÍê_ß¹#ø9tRہlÓ£¤eѕ žN·†ÃílLþ\Ôøg”ø¯íKÕ¥ÛøÃü–KÁÀóm‹ƒušCd›L³jì%s±îÔFœ=1ç„|‡áš#}ˆ³Œ#A¤šPÕa&#Nºý¤¸½Q SÎƟ¬2d©Ð¶Øø°[“EGã¶IìÛ®n<ˆg…:úÏÈ)º s'‹Ðªj&¬¨X/5‡±œiVôÄEAõ ½T^›ªhcp¢L6 ëxB®ÜQk2ÖÅË×Öà}²ñ'ÂüS¼€•~G¶tCӍåäðü0¤‰þˆ»J,ü5Vc×"v§ðc–'¶å_S)>ppF?÷ª»Ù'*R×d†-z£mö(ÛÕå)ҚÓ8!‹²…éLÒ&Y)ï­Û^>Åú‚Ø2òÚâ`·!…Ù® ?=Âč`h)Ø­S *ƒä—YÞá|$4 V‡ÝI9KÛêõ¬'»[x=å,b¡,•™L­„Ä>]cy&ŠÑòã%áÖ{¶ʆÀ£Z¦{ži}‹~(7QoEO3wbÖ¤¿/Š_ %œbƊiÀ,ï2”Ÿ*ÏÎ?ÁZ^"½¹{ª­))¯} m÷Ø8šóðÐnŠ‰ÈÁ<î>ÆLé imÄù·±-{ôµå|*­ÌŸS¼úwñ ±!iZZm™qà )ìåX~ƒž£Ãüýg‘§ þåwaÜ3'#Œ|ú.Ys¶ñÇ:¤â_ôiíÐØOÓ²¡ì™®l‡„ŸçH‰‘²Ö×Íé¢1ޓ’d¥#X£1@c6KŒ!Ë­±ï¯àriï3°…5%gî‚6¨á~¤)^ëúdŠø¦‹–æñœ™ ˜a-;òŒLZ…@Gf¼Ã½–ýP¿C}«tA2Š,Ñr*s©½Æ’Ì%×v Çðᐹ Çòb, »Bò’ŒO‘5ßa’‘hÙ74K:/½ÀŠke‰aº½£ÿs…XÚOgƒ“Ì¢Fì¬:xÎø÷¿ÿ9>gؤ“gÅÂnô"£FÇxžAP”äX’êcsÂ~±@¦Ç`¼,Ò£×V Ϥ~:Á±Ë°kf‡÷ 0w!¿^2s‡k±WzÛ ×{póY½ÜÌg W*¦WQ±ˆïq¹±IM-žV0™åÓ ŽOR× Š>»¨uBf½.—› yåÖb¯Xz¯®÷0aµ<©w݌,5îÙS7FÆçÛ$ҳΨ6ƒ´À˜ãž4T¸f0͋î¾0ùVÝø#—‹ô£º¿ sÿN‡“»ùÇÃÛjVñÐݚ +¶§N¤.m€_(GÁj!kn{â»' °©äì=/3x¥™4 ”û2Óõ>œ'•ø6“ÙLôó®ç Nn5ݤیìÔHa»N9¯È´’Ë›7¦Î®[ $žßËLñ{¡L¦ú:ÓQw«Ïô2_gìdê¢hžÞQv~53BÝ3±ÁCÑ-XN„Æ¢€<ÍL˜bÀE±Ü"¤3æ^Q‡5®ë„vkƕXl¯·ø\îU’Ü)©ï ÂíV1ŸðEdrµ#©û:€ÑYÇåZÄfˆPóiËV>NØøl:Í,-Ö ®äõ,äGe*ƒÎ‰(Ô3æ Gïq.Ž®á­¡ ì +š—ÌTnˆ$§zQYÿøF^†º^º˜‚£‘¼¹µ<1‚Ü+Y ³¾ADr_«{b$ò8Ïj] ˜‚uÞܱ4U?#²Ï>§›§°E S”`XA°gë.UkÈpb_ŸŽöRma;bqDš +©Y¥[¢RZq®Ü)”üE}\ž¤%µ7ƒÌ™Æ¶ i!ò0A$Å.òÙwÁïy±'wAÎ y0J³î…Kÿ1& ž.kÞqþ‘­Ýèw˜VËé«oب=­9ÄQBP—•–cOr!ñ?\‚4ŚԏšG?{YˆOœcß= PÓu9D2} 7ÆяêåyÍWۛ_qBötu<1û[Îw¿C»óóP r`­7çÕwÃÝ;ABPógÏõ†î.ëóñ¡ÈÌEk}Äï4„:?‹;=ùŽá‰yº žµ°²â °ï@Ï +W•d°ÛÁ3™Â¢ºƒ³B–ô6ŕ§þ9}Ä#ƒàxŽäãےÒeéÄ Ùö¸ u8dÐf31–ؾñ¡"Û­¦"$ryë0+çL3ecTìÔ7u?ð¸|J¨ÏÉÇT’®lHϋè!0ƃQ))9‰”W²²e‘›" 5ċçìçژ'hgöÂí¼ÅÓ:ÓѻڨF¹9ÙÒ¤ãÿ¸¯r$Ir#¨óýÃ}¼gŒf+ô(ü¿@?™YÕM*K‰RÁQHœîü¥#½j Ü4ö†¤”Jq›Oãñ‰/?=Ěå~#î3×~ žjÈäô¢ˆx¯F'®` { síg1Oøe2 !neqéŒrÞ²¢# ÃƒŽÒ€UÛ'çjý&Qí\®±½ÔâCïRôÀÃgº‡@Áû˜™Û陇0qñÞˆ9àP|„¬Y÷Äl½öó_˜ïrj|ùxëÝ¢Ýö¬Qñ,»‡ ƒ Ÿ°Ôg›Òºá!}s«®qèòÓYH‡ ³8ÿ–“åc–ç ‹Š^–07i#ç´ÁwL¶Փ5o²Ås\þ·ŠVÊ%ÔÒmæ3žWíë,•€fgì~úìø$šW|„|ÎõšŽəEÈ>Ìm?=‡ ‚nõ¶ø +2þƒtBê\3T:n¦m´¹Å픬zÿ^×#¸€o0}Á³¢#·oð,Ћ#@ï²¢êZÝW™cuFZ»Wx–Kwó]y«™ úóE:@ڔŽ®—YFK’´ºˆÂ²›|æR—ÒjpWŒËÓf2qhFGML–*ßÈGcºoíë[H¦dњ§}HØÉZ5ýL$d’ÛÅ«ÛjF:1*š¿êRyp²G«ËÛÒ79/=H͔’Z¥›ãzÒqEû=„j÷ˆÇtIC|0ÇÐ £¢eé_ËѦaòj5ザcÕ·ÂDS3Ô)e*>ˆž~é¸c ]µz`:„\†5pÓTÅ 7‘a°Â~E0½¢¾- < ƒO“T)zV'##w­y IMátÅñÒuñ³WÅÊ_DXUµk¦ö¡»€7Å0IÞáÍ8‚‡qÚ(7ã,'÷Í8åÁ8}ÿ]Æً¢‹•aZ¼Ø#ä˜Åv“ï"‡cU3pÉR¯ÿŠò5¾ +‚ho;¶f¥ºúÜ %’GiDœÎG~q—Žðó¬?7bƐU’­q‚76IËXÖªö}6‹|Út|æc²Vn1WióbPOehL„·[:×â)áoý²ä¦@:eºÿƒ4ôåç_% Œ.æþóÀ¾ïîÂt»¶ËeF‰çŽS±5Rû)2rá¾¢¥­áŒ)2*€”©^2UŽ¾TCî;–± +Ê a"›äžËAj:ãpU»‡·¼â«Ë“/Ä^ݳŽb.vҁ'Èk!Q²ËUùtÝé±r7*b̹å–ÖÎíOVŠ(ñQv¨Ü{ü¼6yQVüÛ»~ZS'U3®Ocw™—gÄõóõþ@»DD%òð–>ƒ\Ò=IYŒyÈ~ÃüËù8¥ôlCfU9bA¨Ú¶“§0Š\F ¶þñ¡ï¬ [Ž›ë[†¦Ô§¡ÉŠOÖÌ´¤—sw•B¤r»ôÙZ-q_Ýf®#àׁI4§zäÃ9N²Ø;:bnàöîK+¡(k[~nÃĦª÷·»%¸–5üºwazùë‘9qµ™´Ž)Ã/fdûçÕvÉd„‡Ò… É4xVÂÏu!?Kq*zËâžrªÑ>×j„M]E=R´ìæïs¡ïš‘Ó„Øb¾j{£ +¾ÝˆPNäJK¦ Ðñ‹³ä«f¦Uòwìñ7.6^8ÉTu¸ì¤ïèÌ븪ŝ¢ÖI=.€õ'6'ߪwË6YëUlÌJß敽2Ÿ¸%cgýÛ¼ÀBòҍ쮋J½šQÛjs‰9ˆ”DäoãÑ®ï ~ãâŽìÞ¸šð/õ?D(¯çá*ŽÐõ¿ãµüÛþŽ]‚Ýãß1Þd®Çzo8¹¬IÁ7빅Œ…Fv24%.i¡‰À[µéðüW?¾è/ÎƖª¿Äñçg/ jt% +{ònÑC…>=_wf•Z^}ï˜rs쩪J~îéi½}å(ÃÀµÔm¶’ù¼:毄òÓôbÁ¡8åєÌ2–K† =”B²¶cé6O±æçœÛb“÷-öª`Dš"¢FV)¥†qN]ó¯äÓ5"+&8f†*N/Ъ+¦ÍÂèÂ:e¬CqÍ9÷j?öl\›{ÎWßzøxò=:+凞ÇWMáòSϽúý0ãʼGÞÍÁ4m?çf“]Óñ `W2sï)æäño8r§Áqˆ_‡ê–tš_NýdA‰)Þ1b±N“µf9ø¯K‚ê¯]¥…QO¶·vTS»d´aæuùŠQl̲0— kÛb»œÍ3kÖi]T nH’Þ‡4»f¡,w¢e„©™]{Ÿ?áÞB3ù@?àEyŒwŒõf`¼R·jø"Šc¿­9oü<7guz1¯0Xu u´ –¢ ˆ'ý2÷vy ¶sÎі‘Þ=0ïø"Å<Ü uP¢ˆèÿÛ]dZ«Âª²šÂû€ß ’ìßä9560 Õù+õ3«Ú¿ÿ +mñ“çA :"¤>-]¯ÛãhÕTGº˜ëŒ¹ƒ&6ë/Гj\—ÛÚhÎ%࿯rlÙq–ßUü ¼>š‡õTÒÁ}ûO?P²lWÐI•AM”D _´Æl éþìƒïT%%Nç°lÍå<Üêo1AÅHžå:NŸçn„ª™m [h®cS|…GϑÑ(«_w€ãm»É]Ѩ››ŸŸÂ¢ѧ¯?^·‚wt½' wÆñÏÈ6¾¢ÀcɪhsFo=.°tAR²?î/jݾµ‰Õ’©Ø5d}¯ûÂBÓZ@«6}¤>À±„éS-…çXŒÃMö•©iµ­vë‘ãl*‹R#"Û[? •9¹4LR:O0Q9Z;릐¨aHA=pê6ñAÎ3ìÌ075hMl¨EQ ³:[·È™•Š 2û`{dî·LÍ!S£ÛtÄ(¦C·…´1®&C7q‡³wº ÷¬Wƒ¹aü_B@™v&=*/k毸©pSçc =‰µ þ ¬FRóOÆ4¾Ñ)«ÒFn}—ÙK¨“,³å¥-›‹ì3¼×äò@ +Ž¸Öâ7Š*ð9œÜ_073óBå ·›ô¶2¢zä<@_Zw¼ ê”éR9õ7VdHj{ÍtÐ6G÷´Nq«=ðS< „Ýg|þWñÐæ]<³äd5iaš*.&ͼ*Ñ1HqÔ ãI„×¼̪æfWY–ÚÖ¦,U¡M5gï«U5çØU frÞ••îÊ^'3]A;2¿s¥'Vÿ 뚼Ìõ*%2ÿ“`Ÿ!Òú +‘f“YA¶õŠ <øÂжÑ/V¢ë†í^k¼º?`XZ®HË V;^ç£Òlªt}Äc*£îVc†tÜhL¿â"¥ä#-¢æž–àó³ÖT›»S–à:œeâµÝœ'ö S\ÛÊQ‘«Ñù>6^ѳÃÕci;ï8LÆGzÁ¹¥­¤ÌU½u{”ιÕ^¹ÉaúŽo¡j)¨:ՐP“›ªJÈ"þˆ¼ +okà,AaÔ]èO¨H†k+«UÚWI{±´€Èªق$‡æÍô·œ¥±Nh|¨—/ø ú%ò]T=—šöè^¦~O¹»u¥Ü6–'ŸI²}˕ÆÑÝÖEæD³#îJ( ~~:Tó՜ø@öà5¹õ¾ ÓÈj îöÞû5· õ^kËp¸ŠÁÏ99Šµk+Û`o¤Ð+ékµ«>¶Ryó6áls ¦÷è ×rÛ`‡ÛéŽFwÓåÜ ½ÓêÞ¾|Óè‡ï6û°`qýÑ!…:’Í܆}€A{ñ=3+Ÿ! M†PKa@nÒFvl˜Žî +b¹ž7T0 è ©Œ×.ò³ kãw)8YS*¹ÄyJÁŠVÁp"P‡=}ʌãÓ82»ʨ¼Þ¸ô¹ºîÏU¯x§;T´à!ï‡J•J0[¥…ZÞXUÓ>ªªÔTÌ­;‰Æ„§±¤0þY±ßP,žˆ¼k$â"í+Džéj5Zqt´çݸKHr¤{tó÷søóüû#•ê§¢¬3•¼íeˆíÀӒ·äÛyî3ϱڢò¡Š+;úœO%\ \ÞÜ\UIÉ%[£0°Ú©6‡¿ Fjøߕv_pÖ)÷‚ÞY -ø”wÓvÞjç#èªé&ïZa²å^­‚°œ²£¥R%²{*ÍGè; :ӗÅFüŸzÓø,šŸ x×ÀÁ&$f—ˆFä[\ä²à¬M]m¾0VåËå\Žþýq¥Œ}®Oãm(‹J +Î#o/ñÍb=!#˜>|„s³øú#³ºãðíL÷±ñ€´ˆC_އm¿>?УŒü +µf,'ì¦Xö¸Ñh÷ûà=naTÜr›8›'¥œé˜˜F-hmꛁ¼*•ùÍ`b‘Õ†àî¿fˆkLË_-y5ù âÄý´˜þ ²˜z›õ«EÀ­F“½‰Ñk­»z2—ǀb‹›6×[_†ßÃ`;ÉÕ-eƯ–fÊWGs-ü´\£ÖÚoËÊy<¿œ¾Z$4ÏÃy[ŒÚK¹z[¬Thã¶ú²ÜÓcŒÕŽ¤T_èF ¤K>²Æ ªÊT•'>¾c• Ä3×7†@;º? Ê—kµöªÑë$+Â\>ã“I·$‚„þÄÕBÀ+¯¶„ÿÝÒ +¤ÐT±¸²ç˜:Æ`91EU1¥æ]îÊÎ}rr9 :´± ½¯Vz2GñÀ=™$՞Y\Sö:ʾ &„™Ú«ÿ…uMؑ¶‚,‚|é%kGe˜¬*‰šµ©Ž­òñʬ]9ÅX("½ ¦˜‰è›Å6M 2h~µhf>z³!Æë}6®f^çº-1Ÿ +#)hC{ÜÖi™öì® ¬`2¾¿–þÐÙQÓÑ#»®.¼ÖXwbM°|¼ïâsۗچ´° 1ÎFÑ®b>ñ^r[¬6²“½&°Ò©ŽÛ¶€?<¹6òÑÃ.¾¤c†…Ï£“ŽØ3ÈÉû&>w†É Œ¨5v¶¢?Iàe¾$rbø…›Õ[Î/䉍RÆÙÿ‰-B»­wÃaq?z0¹ %½œÁ¿>âÆ®c¬†¿Q1£‹\l»H¢‚ÄwØòp*¨y½KQAbn› — +Qt*-u%<-SȨuøS)¾±ú_ØK¦CQ„…‚“ü01|T> xjôÈÚШï§ï|Šç +QœcmÕËêµ8¢V&9³îcF¶-0ìù;â‰Ì*Zf‡†Qƽ¬¤±ŽíÒö†ç†Ouó4·žL°ÛÙ +–…$Ӎd©³4T%Æö@ɛ|ãØ©ì^JyA•;ZGD}ÇÁ¢hU“=­Êδ‘Å=«ÆÑü½` ^6æú/©èìF½9ë=¾`;Y¦.¤ù‚•ù»]Ðè\9-+wšKv‰v–¾Û)Ó(5F²K„ïjd®—Ê¡bëUGv|j)˜^X¯Êǀòâïq¢Ü|ªåY)ÜòxAM溹Ûx!zŒÁEʄ®_„Ôð1%–*l3ÆkŒ÷¨’ÓK `ªeŽ5™ÀçGëx“ИÃ5¾#¨îËQ 1áU}®*Öäôa¶A;\Š£._w‹šÖ7~m€~`1o“>êð»ßØ‹Ê®Û 5 :ÜX¦T0³¾I59g–zν!‡8Ȓq ^igÙx†vÁŒÐ)¬Qê k•Ï7T¬ÆÏ^0{mºE ?šðw¹¼±‹¯ +µ*Q4g[âKâk·«<0ÝP!âTƒÕÙi¹æ€å÷°D²<,–4{ýjÉþZϙ÷û­ÆÆUo2­oç›TtUHšÉç gf¸Ž¹KWfI3KT“!¶Nm*pÀô±C&áØ +Gàj w¬á¡s“TêõÄV®Åé+ʂs`Z#£â»¥0]œ£ž+ÉRsKã«åU½ üfY«_£žíâ´XÆÄÁÚÁwÓìÀPáSUaM®ç>­Ó"0êÜgí¦ÇLƒíå²èª5*]|~°õ¶ ß,k”@°>þe"ôƒþè}*}~´ŠPðÞÁÇ£"ƒK^›['K=·[f»…Àé¦}”£ ‹O³óA6¬~͵¦Ò2BZ_–WŸŸº’_‡4´ôÅw¯ìµÛ2õü#™õ„Çá[ìöü<ü,&QB|â ºŸFŠ³J5KŽhniæÔÊ>Quþ?ûU’ãØn÷uŠ¾@78ç üEõÆ÷_8’zz’ °Ûø›*Ç|ÉÌÈÈ4ïЭžôð@~Þ u°Ç1ïUJýÞÏååW´Ld?vCáƒ>ƒ¨´•g&u\~L 닊Ê\O«œ“œïøÒC$}Ä ÔR%¬’X©ˆžKOKýVŽ”Ó*ÖäV—š‹« ¤Q×L•Ú^;ê–æ<βßÒ|édn£2 y¹Ð.Ù{rÙµ6¾X©"3^¬^8îF‡)Ç՞×ɤǙmx×xv.tî1lª©Ü¥[ש²W®9[³v½˜ú¸¨¡myéqÁï O9:1šòùžÅÐuÜá¥Ã²ê1tБ;Æy‚Áš6“þ5h#&÷žOjx±†1¬&žnʧiÊÃ#©P£šJ&ͶêôsÜ}äÛîHJGÜÑpè‡úSéÓÎ*éºåm€e»_¯}°éß·:Ò@J“rYy%2æRŽ')ÝbÒóNÂZß°¹ò,¿Á͂áüúc‘ER ú½©æZ—&¥I‚.a€ßZ[ÝLõ^…AJwbŠ™£à¡=s‡ú\ðû iÁŽûù<åmýWd$ìÉ ­CÊ}ÔOœ¤†„iOJ‘Ôpä>¾:´Ï@g³Ïî}¸–{y 9»!@ðØçtÃÇ×¹}Í/Ó¼ùÕpœMïË—œ$fï¼,3N‚ZËs—¡îJõ9ÝñBùì=p_vP¬P“÷fðhÈ×ïay)§ƒ]Þ{³ûñރ„½Þ£æ—¢œ‹R&X]ÝB7¹¿Ù'7ø^pP3°lÝn҂16àüòch”cˆv,Ùӌ²ÁhPúsº`<%ÌJƒŒ<ˆ‘•áãk€œçeì[Òsó†>[Ë=À Œ?În4Fa>O7||íË×ô2lí}1k†«¾+±.ך7þ>ni-y@ÞpdT›7*žÞ‚ ¢¾† ”ò;0ù;nk@~γãóîÑâ^œã¢X<»Ñ¬äyu=¡œSâxÎCܯ`‘‹íõÕ?¸“õDˆó(¥pæ Z +൴ÏÁ—ÔÁRë$YíAZ-ªšk‚#DëkЅtO®»Ä2S±®ú§åó;‰`­VˆÆh«Äçø¹ö@Þ¥cc ¶|õC‰T«z€Ôçµlü}p—ãÑÇ;>ëA!íæã3ƒQo¸ ؉¤§…eéx¯ŠÐ'•øUW邅}Ï ºøyø¢JßââÉìÞ¨)°ª§ñ§¬¤šè7„Ø]Ÿ՚]Qf½·-µÜþ†æ•j_Q¯Zˆ³®¿É“î+å†ɗDÅüm«@¥1ÞÐþ¿nGF»j +k䪊 ²ä|êfY¹®#E-K (8¬ï#z͸FfOŸFÖÉ´(FXGρâr$7ǀ3ó"½ÜӑbDT1P)¤ƒ_IÓ#%&ÝÓÀ÷g€G´æ# +0 ŽGËvù(4=ÍñwFªB”wçY®ðž,’û4²ïóõãµÓÈÔ*ÍÈ&ÙÒ½¢" åhWî&¿½raŒmähZÐÕ !Ÿ+—¹Ç‚mj.ººÔ ÂB ’ÝÍàΦþ%ä´ÀC¬ÚƂߺ¹e/U¸o6APŸe„oƒË6¢ÖäøxýÜ6 ·ÈÍyº³ùç¹^èÜNFkKWӀƒït“*ßPiëñuD×Ð@Kw5{«ë©jwç|‚XŠÉ¦ˆ}‡AkB™ZÇÈVãÉ÷,˜ ”µ1¸¼0Éõé«©íòŠúTÊE‚×JÇÂ+‘ŽÌUވü( é؉`2xðkèæ5‡|K|Ä;¿BZ¥ªê͗'Ý`ÙaúÂwú~‹툡,ľ—§·YÖï]b¸µº¦P@^aÊ|&ÊÆ.n#Ç»eYªþ•>7ÒGD7·šµéõž~\]üx‹‹æ„F‹5Ñ;>£BïdTÉ>«ØƲž{A–kÀK­\"Ў‰¼£n¥F A®„¶‚`ýöS=¾„ˆl.`Úó±XýڂAU"m?ç@;Fè0ÁsŒÒõúœÚôTŠY>Šßª<¯ ϟo锡R·ò 5Çk:! êÊÑ樸BÖ*¤!2²BY¨³¬Rÿ/C^Ñ^Éí7´¯ðÊW´Xìk“~°‡¦Ò-®‹ÓîÊí9W‹ü:ÔmêíM›’ä×)K–©PrPx œÌ³m@'§z TO#› îNn –Qåd¯þÊYaèš8sd%CÑåCj›,%úÐ\’¦X» ý ›º&’³jàI7§‰ËxÙÂaoZ<†žÜ"ùíŸÔ RÜLÔ$¿œ2A ‹¨Œ0h7ùwpHÚ .\ëiåÅ<#}ŠÖ®Y±wnëÞ}<~ÕñÿBé@ú÷@iØS¬HRƒÍ¯±™]Â;ÝP«+ź€jӔÐÕõ€ìrqj,(’8ìϜpi6Gñ Ve×\ÇËý³®He 7tñý§ „ì¶`¬ªaŽ±ÔŠtÒtK2[͐XE’OÀè + +ë9TgbVÈ©z9mB?³8¿ˆ6æ¤m¤=€Þ\Ú5‡•1š1EÉ & 4Rëµh!g»oÑìrÜ"¬7¾¥@v$ÕI;V<÷ËSš÷ø VIrd‹ ´8sëü«g±/²°ˆŸ“ +Wõ®×QØfE*ŒÎ!T)Ī8æoÆloY61ìãúmDIPaJŒÃ§ÓÛ($4!ô±aÆMbŠÌ†®«H„ôqÊÀ¤¢±½Kæj´7SÚ׀æJÉŠ鸏´^;$ä?iý?Hëu¢¦OËýÒæ =UézÁ+bʕq…ÌHDY 0€»Ìÿ9;›_Ìs==‹ÙE5ÔòôõXUÃĝΞ®=«ñêëìèfBs›>U+¸tüïÄTyÆTùoˆ©òS壋QòZ¯ÿœV ¨»h… »Å$%`TDzµ¥ñÖ +Ëk[ETö.a“Dã›úL§üP©ÏQ¡…î$Ý*òØÎ6‹ Ѫk3!ìé–2a<µ+ß¿¤ú@P† +ÄT~:†|KóWɬê+ûxÖ¶t§æ&¤|ƒ¬¾2eýøC1YY R\ú Uú‘åý'3‚Œ³™%~VT¤f{ü3«Xë +w½$ÒÀþoh™ÀKB2âíY~dd¹Tõ&!ƒ_éýߺʔû;ör[Ç;vØ —YÞñ^ÿö`£‚X2º¨ÉòV/lïé=ÛAþ £¦þÒzCã”B,ªE_Êòlô½âhŸ1–Ø}ÁÌʹ2¦»HE9֐ÓÅ7ÿõ/·/,°½@ç-!\ÚS¶k\… Y2/­ßñdé +2&ɳ2ÃÊ@Œ4ÛXð{Ã`/lòš­Ù -/ÄTÍc#IØ$í¿Ô¬m%@éÎò¥ùó\¿Ò#¤ƒRôIxãcʖñ+4ø÷O*»ø¥f¶ f}þYFÿ3e´‚wB賋mˌÛþ¨¦p›L)i!$Pj?LqæIiœ¼jV [³o 6銶$Bñû¸gÛOU`Œ‚:‡åjý^~y>þ>_Í6žGƒSbÙEcŠ¹:T—¡×Ìuª%±OÙ/ÑÎY¢9{ªy9ngÞ<vt¥%~քMŽ2 &fÎk0;w¸ÝSÕÕlo ¤ãž#G‘ô¥p©šV6õ–e÷–¿7>Ñ-R›ëøTP$²Á2„šâýþ½ÈVn7Œ•ev%û¼ ìfú·á`¤U [oÌ¿±_-+’$GðÞ_Q?P³áñŽ«„>@ìA{o„4½ÍÿƒÌÌ=2«²kAZzÜ*ãéánn¼–z-1oöÈȁ<ÏÒ8¾ºèò‰ƒPŸ#¸Dûñ #ÍNÝÂҝÇèÜ:kO +äôà»èk8ï¿Úíٍ_^>•313s&2¹ïaº<˜ä͔t"½¯×¬ðÌe:`íê*3ã°é%Z­C؋cåߦ,iæ´ºô……€¯É°åžÛÕÐ$¬Š–gi-ߦ"¤éwÚܐâ(ký¢¼Y²«A)ò²èș2¦s¿…»½o-麳„­S6 ”T›0¿…‰CöhℲ†î‘åX¡Û›W˜ø†¦†¯¸WXeb¥§Àݟ€¡Ý¦®Ûû:•—OB¯¹Þ)¾LäOã¿?Ó#ÿŸ=ÿ œï!fŒ'Ÿ½›coó]·Íó˜C­_øõl¥à8j w"+ÜÝEŽKªµM’µ)hK}Ieá©Fœ¹½•#\Œò¶ˆÙTâÆrܘ…Iµò½–S6eÓû¤›7 ¦Þ† Œæ És*Í<%Å;àqS> Ê&÷ÊÝð2hÿßрíԀí¿A¶' Ø^¹˜aµCB«}=)“çdFÑþŒ˜Xu>BcÄXõü)¢0oS”Ùþ`þmäӞiFÒIT i‰>}y}–9Cs¢±¶yÞêÛ.þ/Cj o+þƒmÅ\˜„ºð{Gûì—5pùDuMù!Õ0¥Ô,ÇlSûÊ1l)žc¤p¼À²p¨vD.^ È:Ø'÷¯XI¦k„¥¾‚²¸C,=¢òØá÷ÖÔböWôˆÎ<ìWh£ÆèùÃa(GØ\`C°·p@;ᇠ+£ÂÖx5©•›sÎ?þªÇ±ä%ì×*SeHVQNa?Oè(–ûéA6˜[Ûèó ž³?Ÿ~1zÇãÊ^ÿÀ9ßµ‰tÂ×_fґù –ù¿ðh>«¬üòüŸÆžõ÷ޅ¾~ã—=§«î¿úåÜyÏzõ˾AW£õâ—ÃL¡3Ì³’îX–BtgPou%[ê=½)c>C'rf°h±¶C“0Bknª2xÇÆߧµc¸l  Å©sHw‰SKŽup wØߎG×öÓ†ùǽýxÿõm0ìQኃ÷ŽvãÛB²X›xI;¢è­ä…„ÚR¦½ø—Û¯˜n{‹¹å¥­ï?ÄJ…ñd ³I—(ŸoøåöÓÏéöããö§_nÖÆéÖh}ÞfEÊSü;Œ ÓÍÿýýá!@’(’}òÍG¢-UE-*SB«¹ Š%F»uzS©%BˆM°+"€Œàâr¬k ~jÙL;#F8À<X¸ËÚ6bxMï4(…È~:™ÓF “ç›8¬ÂQŒÐƒc;(srjõD¤¨²‘ŠÎ€ºôB•ãqø0Z×mx·ç &A;Y\Š ËiIÕy .Äâ[¥.¹9å'¼Ì›£qиf€ù¤3á1·‘ÿ‰—rÄjÐ¥½‹²¿&‰Û6÷ge ˜$vÉõ¨IgÀ?„E‡îPk¦‡Çc~b%x¨þçâ%³SàŽVO`Ú; 3-T]WNkûD¤é&heûsüç'‹™W*ðscw¶Z"­’y³¬F«&y¾¸ŠGJ±UðÒ­V†ƒp0õ"ÅÖ]¡ŠÐ)•< ßÉ|+³;¨£vFTJAžµèÔsÖÒÇ=òXÃôçaãAË°â•öÙÖFå ´¾Nxú—¹J ´¼+8ÐÊ·?½Ïxöî׸ ÁSÔ:1€þ8ù¢y“ÉÆO=ÄhN5ŸÐsûx&n1Õ¸m‹&l#W¯dçIfYºaZÆÄô÷\‘À>eFÃâ‹AnV dPgmx‹s€,ùçßäí‰Õû!¾Æ8!¥09¥HV¸` älægŽ(o=¨†„!½ã FÓ]c7„†õ+Ú{ô½Ùñûá]S>7wb +©`Ç欛ŒíÒa]ëvé +g¹èäƓ$2=èøì-ÛQ/L/S՚Mý^£5óòQÕXÎÁQL{·±ÖÐ ìm ¨ñæüᑄ ô¬ T‚nEBŠìgRE}tœ2ñ´Ôg»1±™Àn³J˜œMÓ©•}-6{C»TzÑsØ Z™ku6MÃë&Ÿ¢îßÙõó]0¹Í®ƒƒLEk©zÌA¯Œ6¼@Ê óÍóº”wÁÑqoÝîl<¼”%–ˆ“¹óp x;ˆ‚ð ܶæëš0+;Tx¥Rƒº Ù5AµÿûÛæµ€¼­ã@Á‰G5âa²ïûälªŽoð… $ã;†~ã3Ò„±[’ù ˜×þ>£=¢î ©æo¸Õ$²>“Îø¹ô $BÇ“R1¿vÚÂ;Z±‰0{~"LA„ùX'aZ"CÐ¥ùÀ—}î/¸üÁpao‚ x°J­ýŠNŽ©'¿yNS½7<8&ÛÇT äþMŽ@4Æ’nU{î BÔI²)ÞüÐÁTÅÇùÍ7Y\‘ÐÜbÃv^<¬w?Äfž&ÄiOJ»Ù@8ßÅ Ÿ'R¯Aá‚Bæ›7Ð sZ½Md‘÷¡!ŽŠÊ¶òéݏÝX@\GÞ]ˆ5ËhºL Œ>7çC ²£+:¡²QÜåhåÛãõ¤¼2k Ñ\x bj¤Å&ÕU-“ÚM2•ä†ÃV¢uìYJ#¯cb$úŠ«ÁÀA\ ÏB’þÝ)‹¡f¾‹×ÂVt°äY6kÛ(Ô$M//X¹ª1âàABé{}û'ûՒcÉq÷:E_@ƒüÎ30 @=ßáø0«êÍkC’ ¯¬M7ãUU&“Iƒ®G«Dj¥Ê'­›é»Hžè3ø«W3u?]ƒK‰òuÌ­Ðö%ÁŠ&ðB±<-åÊT#%VËóñtvIÒfHCÿØ6ï +ˆwƒfpºˆ\`ýî[­^"m]UŸý(è@ßY×6ÅdýzÙèÙæJÕºÝö"S×`cÎÐ ‡½ÊѶäÉÆ;çi$ ¤ßž/Ùù3·Œšaq )¥ðàáJÕðá +±†¶íA‡þ!Ž‰:¤òÜÜ]ßL'Ÿ/Öðó—‹+ÈnT®…M± ¸]J9ПòãÁºó.R+‹Å +EâÎØÂàÚ×ðÚ׋koT脃îfÅ"¥ß†ŸÁÈF`õDñÚÇE¯ª7j`ƀ ÏZÝi€*“¿P™j¤¹؅´êúŒáë^Tg鋙Q–8¸¹…™‰Û:ÌáþLüE¯(”-©ëZÁ{/šª¼ÖÇ1Ÿˆ‘@²< $WN}†ô¥Ü2àùb„õ3IéÄÉÕå?—ù£¦êR_*‚¬êëL~1¼JR0R_iŠV1H濅Ø_b­br)š\ºþETl_u“jYÄSç + ÞáýÅ3K„bxkþÆf2·3[tHb|VD„¹±¸’ÕtNƒªÛo×ßØö€«F`ÄÕÁÛZ~Ói +s^Ո޿ë:øSZÀIyZARÿLK‰°K=H}®Ú[bÓ O¼÷ÒÊ„hèÅÙ˜é¸ +uÖb˔péºbQº€kš èg1ÆküÞ´tGjßÉQ8VÝ^6Å4s[]T¢%Þ¾ÿb×;+ƒ¤´¶{÷°-:M+ž|,Îà“Ñšt^šÅ@]\#Zeµ¡Åú±ÏöFè¼+3I£0¥Š·}moxíÏx•B±Þðg.¬}1*[ü°Ç%ÐPk•4"qnø)"`] gPÎjGKgw«§½Ìy¿:¤U´ênÔØÀâbœÈáŒMÛÐ¥|Ör=X:-”W Ù6è”ÉVC“|äÌq¿‹g³Ýð-<‰¾A$`8‹Æs3nÐÞ"¶Í©™ÍBS‚Z÷ ¡HGtÌK5gxYTÄu»ÕµªÕ›Êï¶ UHz\KMèÀ¬þÍ2mU£&ý)Øò Ëí‚ÚÍÒ{–²Í1VùÞ$Ýæ{¨˜º(R-íG¤¤"‹ŽpLœd«Ï½9×Û~Xg©Ým¾í>!gv™´ç“ª³‰,I*º‚AÍó*àz*pó6ªhzZ*„⯞XçÒ5µ ñÚc±âBî8oÒYg‰~YâÃΔ­nLy†­åú8I·ü‰M“Ý2x€¯Óҏk:)·9íÀùðxöÆ sá$ØñëXªúÿG , ¼õ÷PQäžPÑúõ¤=s<¿A·iâVÞ`Õôq½üߒ +\vY_À?>ÆFpà1ôP÷µh‘U²—J{…Í«º¶¬A h€ãhØñeÉ-l¶ÖŒ1BgY|BoÐtôuÚQK©ðµ–óueø¨s(H˜© ;›ÒB´Í¶éч¨J`“VØp3„*Փ:ü”ƒ™™°4Ñ%‹'ö&4#‰‚înÜ• m%j/>IiómIØ&m†zrÜ˯úræ+/8n6K³°Õg·ä¥¡A6úž/“>««º‘Ω†Y,ºëJBmL»L«Có)xK"„‰†zÿ¨¨r¸´e㶴duq£¢²JÌm} ?š|d#}úö[‹$ŠNBù#°Î„„ l7ðYˆ¤ðÏjqKeÀ ÙeÙ`-2ÛYRùEòm‹ö èGN-åsì6¼íÙwäƒS=ðnÓ,/°8ɲ!¥uC~ž!6'׆„T©‚Xz —YkÁ?ÿ¡ç7ÀR.¼—çdp~Ô# Bã¾ý¨ÊFN¯/oü‹ýjË­+ǁÿ½ +oÀ†D½×“Ÿ&Ùÿï°ª¨ó°“N<¾Æ3†[eIEV‘‚µ78!yýGŠïµÞu ÝËq‚ð·¿Nö§‰Úáv\ü’Ր‘𜹐’1EÑNîëQÓA.pNºØ ¯] ž³*éãolpV B.SôÇX1 +#Ô PªÁI¯ ¼Ö =,2 +§Ú™p%Q!ÒØà%Æ6DÌ©·éûÁ3;µ#H÷qé¾!’º°DâiƒZèF$(†¡—9ÒΘ»;#Ë܌ûÂŒ¡Ö%R%gU{»,ÞÕ󫳝ûð»6Kì¬1.jcÇÀW9ƉÕ1 ®Ä[KMý!¾ ö`9=æ†^¥f‚RQÒ®"Λ’>›‘2) Mµ–™$K¼ÃG€¹É˜Ôû•Ÿ×Lm üôÊdfdq¾û;M¾vg+0%µŽbjRè”nÀêX%Œáó1abhUìˆ|ŽÃ§½(¸Ü%yTõœ¢ª-¬Où<¦­°£7¬l]¿Ó"“¢SUÕ«Uuª]ÌâUømÌʈ½r[÷ÖÇËkØU(ŽæG_\ì½Eô¨È;B=·™AÐ*ëýJP +ò¬K(p“®Ӝ”@ã)â/R1KŸA4Êu;– .a÷ @5R Á9ºiõ_–á%öRŸR½{lŒ?“t†yÙpTÒº5ûý”¨Ú–—pÚž©AO€.¬Ä'2Å=U„«^+l)ÆP€šú€±Iµä Óþ°³§ ù(k½O>ly…Zœ¾¬E‰ø%Ÿ)^÷{†ú;÷º¾rýñ¹^*>¥¹<7oïÿ¤~T/°Ñè|ÅÔçÅTí®Ó \Nk/Ùµš›2ðXË-ìÓNÇøÑw±?Êï$y€ÑÁžÅž¬óí&úÖhˆv°mTŒ`Dt\θE'­¼½‘.ÎgáÉïà¤ûÐ1nägPŽ¥-w +™;Jãm±Pb;gìÆ= \ÜÕEÎ~œûÖwÓ³ÛÛM•×«Þ v¸±þ†xHÞÐc¶!Р×i,jª4Ï*.b>-µ¡]4Gå´³}àÁ^ü«yCó|g¾\ãÛúum0`3´4r[î».ÀY£%ĺ´=gÔMß¾Qùîͺ,ÀÀY‡QGE^X6I,ˆj¯$Œ—À]Ț©R{l­c·¶å3¼}iSf¦‘oИ¨5‰®“¨\13¹W¡E©ñO°/,ß³r#¼Ò¿¸øm± +©@äý Ùô-Y"› §$G1Yì$›•óA6ÆH*ª}1Öc1Œ7Dò½‚™ipÀÄDˆBÉÍf 7ƒR%EaaMªC,ö“Œð,ï"£>œ=U\­”n£ÛQÎðÍ~1>L ÀØìå˜ͽ*@¼i–˜/îЍI‘ÛÚû’n­§½(…bµAjðˆüq¢Ôà «_¾GY¶´^6&=Õ¨S©’ùYyã(ˆbæºãQ§P‹Iñ¦]Pú’°z"7>xÓË.·9oÉ|Ž‹x `ùézG±ŠŽ¾÷ –¿[¦­kÈá)† ºudÔîXRM+7ðçgqÀž›Ÿd¨óR™|›GlÜVœ!"g‚£áÕ[¶"8Tº¹ŸV n<‚«å(Š¼ÏÚs‰a“wÎV–\[zù^J·ØUT´.ȺĀ\ÇRÔ¤ñ³x‹é#8Ušj³‹Ï‡‘\ªòb¶µkyi^v¶,ç™Z¬¬úø@Ë"œ¢ÓÀK(ã¦õ@ôµJ—l'ts9TâÄv¬VÕC©îpUúT?…‡%»PXrLFVߤ=ÝÃó '7!{5n©(™îE¶êª:`dxÍXq·žïƜ‘W¡Œ<±€`ú%1ª<¼Òê*‘#*ªnÄjVúå öÕ"¼ò²€ +ОµJщ̍A£jÙ:¢¦¨Š)}ÊQ]*Ì|`•ã—Oc', +íR †á¬Ú(,Y°ZëÁÔU7pÎXèQ\Óêb£±{Ö<RÁ£S8žËâå›ß6ˆ¦º+§e«÷·2ÔíNÛÅPÚÇ'Û«61$ۍ%pªRÉêNN{ÑQ‹-”š"ÌÅz4©a*صæi!@DÞÛePRÃÔën˜º*°JG³¼Dºó„¾T³2b¯ÜÖ½m˜ü)›—.9u¿{w-^*žJc¾$Ú9óqsªÛbU}„ás$ÒšMeÖT ‰Wšmœö¢Ãǹ–íc ó®Ü:9|ÚÅBùX5 ýZ˜}jê0–)ÝþïÉåøìW®æMù8ˆ3feÄ^¹­“[ü8ç9ØEe)èÙS½”²½ qïëÄä—UÙ]Í"z„Sбº¸a“ i+€ŸÛü“¾çšEy¯Ўü0žB«’zí(ðmÛs²#V]mô=|V9M,’þæ9Xãþq€Huû%Ho{•Àq€ ýS¬qÍ)ý4¸±•‹³bNVpÍÕ¾×YÐJðrªÂkƒçÝHS¹ÞÔÀ&wÚÌ ^™{Œr=B»à-2Ë-k{œÙ#±7­èJ³‘¤Ì¢Rù­1«oö¹šÉ cõ–ƒ¾‰¶Šf,`e÷˜m/y 1õ÷/õªN\͑k#´hxЙ:ç`¦ê¼LâS[§²@c\u¶¨Ä%`…ÆÒ6\µ«L®"FáVc•/ǸÆ\{Ɲ7ÚÖµôæjexàqþuèWu˜V‡ùJú‡ÕaÞÕÁÞ©vS‡ùAuhÕóÍÖ;ÔÁ¬öpu°GªƒýWÔ¡ÝÄ¡ýJÊ]Æ$ ã" å×ÊÐ.ÂÐþ\ÚEÊ?ÈB¿ÊB¿ËBÿ¹,”»*´wªÂ°ôX”…>ÖE2»ØDšÄÈ)´Šz …?o!e;FfÁØ:=1®–É÷cå@ß%·çßeºIÔ¤sø÷ë Ši_ ùy 9ÊÄ#¾O…>»Gù¸Ç#}üÑeÔöÒæü¡/ú¡ô¤Ÿ]Ò Lã.5-o7ì&Gu¶#ŒÜa|&7ö5ês@›P@¿˜ÿnÞù ›7†ê>åè{ IP‰ó4ë´uˆQ[?£²š$÷nF·ƒx¸2åj ìÖØs”H€‰e}Oy×ÊÕ"H> }åbä¹Eœ†½˜p8G0Å÷‘¿~¡ªôåÈ7¢W†tm`3nf¹ôÙa‘ÆÊ^ŒÀ}‰¾Â÷¾=$~[VBþã¤=KöÂ0í5=–åô¸üÀß8v^[oŽ=Ž«gÇéÙqñìá¾ØíæÚù!×ÖGº¶~ȵ59™VðbîÎÀëêڗZŒ)yÓNRäwI«øu"8=9+Lß³¾Xñ|¾ÉÙÈyçJKÒ¼õ“¶Wm{Ê^jùåc˜óÐU=£âä]îÈúçLrN‚Á™=•&5k5^Ì·#ï•6yã̇-¢ã•ž—‹‡ñOÏáiÅÙâþju £G1Eº4Þ$7’gO+®@‚;ÇÆ2×õ§«}Œ/[|K›]QF ^=*"˜ªZ#Uº¦Ê­.^zÓLýKáµäº6úF_ú—ƒÏàE K8Õf-Ìw è/<ñ]J3ÆÉÙuªšš¬húbâ¦JWò½Í=ý|â6ÈéY—@ι€ÒòÊBb(ò ß< ‡ßâ¦p¹w)¥lÏ qsáO_6ÛÓÝÛoÇ©hôÕ¿8éñœ”'îÝËIæ}©ýVB¾´ù½Uœu‡çÐC« çˆÒ¾’ëáɅ»ý›ýjÇnb}N‘ ďäpø©÷¥Ì)Ül¡û× `H=çûRx;7ÖÀ’¨!‰ŽÅ·Ùx^Ü,-‘>ž™^¿¥× eÂõ)#i–G›ÔÛ3óÀî­®ø +•žg_~ðŽ7™?½¦Çj¤ÂÇ*º=»{m’é’ J9VĔìäN »4ãû-#Í^•&‘áCizW‚t³ð <tîÒ3ŽuÎeœ8`°:µs¨ée¡c!žØ¥n?áW~ q(‹‹ïËb’×ij“ÝQ¶b¹ ¹ÎAö¼Ó­Ð ˜Ï¡(xDæ¢@äw“sq\šä +tHUÞ,!oHìٔÂôlÏ1ùØî–ó/Mnˆ¡š5%>¸à±!V1ð&ܽœùˆ3¨ÍG¡rüí`Ê }#î!ºýÁêÿ | Ý ¹+«sÉUÔLhGç ÈxøÞmD~1›bÕò µ£³—w + n>ºµ ‡ÐnàVU‡Nؽ@ÇBI­ÓÖ÷"Z.póÖ¿Óm° MEi©~0“Ó5 憚ÉY¤|¹ÉÞ|ßÃòý‰Ì8fmmW±dû°ñµ„ïOnP°ÎòÆJ~ÞXÊ·jð‹ÜC½aiæ¢â1mÕߙ†çëÿP‘`M“~•Ù—´Mo6ù+Uó/áßrèSÆ×Ýse1gµODÆk¦z-3,c”MÝBúª—/3Êô{Ù(o§“oªç‚Õ®².§Ñ%ˆ¦‰ãº2æÆ"]¿ ÀĀ\”Ÿ;ÎC»ÿªß¼¾ýyÆåŸ*Xã! endstream endobj 55 0 obj <> endobj 57 0 obj <>stream +8;Z\799OoM'QhN5Ees'1=*g1rb.GUFR(LEhL[dFsp^R^`6(XcZ(#;-6I8"8B[-R4cVmqd--,%h&-0"Zo!Lfl5qUdp2"C;A:&jKD9#Ed-)`Tg*=` +ild:"63;J0Mlh6b@]?0#ABbp)G`E]W8(Od>N+=]hn/\&L,<)=J.>_3G]Ku84p(Z^& +La>RPpW-(M\!)9GJjQXrHJ_nmJrGu?mnq7!W15*.;"C3OUa,g/-tQaedLf+8o.n1W +m(P(U@UFoc$ajX9%A,aa`jr=Ac-$N_JE&ae__d;mYjL2*oV;Yb11K738i=tA!0%bU +C\=3N1Ts=2[mjqkSn?#?f=,"["!S^V5>3SIC*hi;;d)REY=JFFXg/"f$MX/XW)\:c +NgOjo84VQ&/#?QfH&e&7Zp!5ub]Qi6U[lp8q[U.lJ04XuJ(T2SFk8',?U/C=m8<7J +^8'C,NS:/]U\tJdJ3nT-^2%bl7e48GF9[;7$>fl.m-2nXYbt"S5hV+!E$pN_plPT$ +=Yl0ED%pL+UKlRcs)i?YH^'M^!<<9gCCg~> endstream endobj 56 0 obj <> endobj 227 0 obj <> endobj 228 0 obj <> endobj 20 0 obj <>stream +H‰ìWKŽ%·Ü÷)ê]Ã$™ül=¼0 ÃÐÂx-@Ý$-|}GD’õêæ6˜Îxd%“ù‰L~ùû×ãËß¾¦ãOþz¼¥CÿÎäÇÏo_þòC:þý»~ÌÅÎ2ÆáÓÏ<Žß~|û×µy}Kgöã?Ç[Å>ïí(ÕNó|¼[goå Xþðöå+?~?ì8~üòVó9­u@UËGÎgëýxÏç(5Núg­“y¼? ùçñËeJ‡Ù¿B/‘}Bsù¨~šõy<>µ“ÿçÓÔ¤'–ãO€ÇÎ÷´á{9 §­$n +{3ö®OðcIcë[{uւi“¶ž®_?·U¡x ÑëxH }¹.”NߟH¤N 4ÉuOì¥êy7ŒH7å!{5ÎßnÃÃ?^|[ϒS9½Üf¹ù¿ÃŠjÇä^yxÊó°3wYR넭9_àñ7ò‚ ƒvHMˆ°W{¦BÐp-D¥óÿÒøK–W(?Þììy#¤l§lƒêfÇÖ©PÀ5ú½LÙ8êÑÎÚ:@E„Ç7ÈÏéDP‡ÏžÈd«C#Q +ñ¢£QÎË%ó +ÞÆBÑêˈq͌Mè4”ÑY“ü2ÃgunÀ›ZÞŽÓ'ÕwF½F LóÚN·~‹µtî9‡UêY.›\§!ñu1sšá©’ô郟K[ðcÃñ'æ¨qiŒ®Ì˜Ó‚ÃÜÇé—<=îETÏî >SÑí pðãiuëd;›9ÖkaQÁ›iRè^;gáasŽKNVe g´\˜=b*ôA¯±i¡z»îGD°ÿ·T—¼=·éü­B1¬+“)jf<ö æ^cêH܉òòÚÏÔïÜFª.áUÁ*ҍӣ}Î'°êA„ÌŸ"Z«DeԍÄ:3òN«IQ__..˪‚¤”ùÜž"ûA·ê*hgÏ]嘔%%˜ÊT#Œc3Y!!q)&ZË`y¹˜2SúÞC@24’ ©8üNŸ$Ö]ÍQ=– ŒV ܨQ;©-dãIÜDÀ/=.u{Ð*Zˆ´» …¬káVü¦È Dw#úÜHw`’îÕp"½ÞóñâáoKÝá‹bQéL/g² ‡Ò2&Íeý¥6(Ÿ¶²µŒ áצÔí†Lor‘)ƒz«T¶ˆ ÷ÕKgë£{¶%•V°J£±,,ð¥HÂõ;ež—Ú^ÁÙƕ&yfÓQVéúéãIbÔ\h+žì͒öQ–,+Ýb’sEžjʇޢ +ö +V †l.åðñcÈ"dÂéîAt‰9ÕJQKH%:dÑETRCFµ¶¬ªeôK²Ø¸Ñ½GÛrçº)k±«¢=gÎIX.¨wÓÈðyÿar´Ãç [ä1|ß.øàî©Ýk¤3çóã'Œéäöƒ‡º¹ÎbO¾´”ö:ïËÛ²õñÝrÞö–ïƒC[Û@‚c6x!Â(eð6›'t7׈×²ɽ+-ؔr¹È)«-ASjÊ¡¦3ÌY4kÊ8zaËjÍ¥-„0ˆò’HŸr g”XÝkQÔXò²pž^Í7ÌAÞÑHgâ‡â1A1ׂñi¦Ò…ŸÔ¡YZ7bf‡üˆ±'@ûXûîèÐXd£ŠPÆh¯„2ýF(‹¡ØSL©¹Ú}“7à•FmÂl%4À–Ua¢“16t'©†]Â4b•˜ú\üPéñ·0.Î +™“¬éâD˜²ZU7G +!ƒΔó’i%È#;j' ÎnµY9‰8¼~°”‘UÌAæb6*™&s Ÿáz¤ë–9ÎG½J]c¬klRRvZÚVþ6e. üC@_7’ 'P“ !3:añˆg Þ˲"1º=£D)ì^=Ïó÷sdÀDl÷Z9ÜÜkP-•#LQ€lŠ¾8¦b¾×ÿµnY\×àÌT5´”55˜Z)íkQ¤m5V¬5PNÕ1E#} RŠ¹Ñ„\±u§cÙS‘Qbà"v¾"Þ¼Øz+«ÞS<²l ÈÁ˜%¨H+>šÈþ÷xÓ¨h£Ú*tõÑ\I#yõJS·mՙ_0…6û®‡ÓØM“†×oŸ\¼›š¸Ä]½8›/ ÇËTfx4a/¬ˆÙ՝Çl»~ŒK1Ï>7ŽAA/™ÝÇ¡>×ô.ã3/`<3âüëɑJt¿ÍõÈ1ù9· i‘«PO$b½¢<¦NBï«]äh¦Ò\HÆ(˜y7á]ÃU¤Õ»]E¥¥,QF*8¨¢èL5gÂM Å«5ÑêòÛʉ/þ!lèÞÖ¤ŒÛÜø’U–"7ƒš[‡«øG¬æÃN¼Æèÿ>·¬é­o– +wf¤iæšXÜåu¯äÉXaаr©sÄi«sÜóªæå>Áº|–ç õ8ˆÌ¢â‚w8•Ø–iጀ%¯êÖ֌ èqÁ}’Èê`œ½@œ}Eœ0ˆõyx8xÁ¤2Z‡/ه¿Y!"Êzi`Œ‰q0ø½“=ç,ÑL:Oh„V•ê4-Î +ÙÑ,¢ ˆº:>;S?0›ñIãh ‡”þìØ:Œcñ” +놗¦Ù +YZí¸8M5ioÊè Q½Ù÷xG³¹mËÉb\'‚B­Ö™à`SֆSyö°qëZÔée‹d.QÑHåNW°±’¨vp(ª?ä ‘ÉÕFÊ} rçxê¸CƒŽváÝû‘ˉ‰2ÄvŸ7\ùxešfÁÖ.»áƒ»ÕkÓå|~ý„IO›ë‡ŽúhÇõuW‹¹´”ö8ýZOåþñÍpÞõ™ÿÎó3/Í<£¥÷®fA]„å¾6ÛÑ%4Zi <¦øë«tíEà"û¶Þ»­l}ïûE§þÛ7Nû£ˆGè¿US +F‚’ºZÌ®Ô@V¦ ª•Ùm/ªŠ5Ôj'a¤eÎËò!*E÷ë¤ý(Þ'béh¯pÓÓš®w”ÍÔ]4H—LåÂëM¬—+b':@žHäÏÖ8X1t‰m;GcM¨¸/ãç©æ +›®ð`áŸu§|G¦ÐÆlú?;¿U¡Üc°ç,̐Å9¦ÈzxÝ¢Ôr^ ÅŽj–ÂTɆ546Ék-%õŠˆqU°xºûB AUÉk²-7´¦#½Âºzw[~O‹¬\&"½bP©«yÆ`Bù՞«ø3K 1rÚø/ûUŽ$7Œ}½B˜âÞ3±24ÎþßØ< + »g =`­F6I PGV֕¶ï>-è$[Èí@¥ê)Ëy#¿¢wËýv~VÓ¤Ü@Ö\ilÌ[®r GÎߑ;^7ôpOºDÎÙ(¡q +3­l CO#‡ø5KßåVg0P¡¦ÕödÑCn «ÊËs‚J(ÐÏ\EŠhJyxŞA¥(АX&­«o€ˆHÔ4£³µI˾A7˜ÝcÂéȝÉ~µ<Á°ù¥«oÈ6­ã§„ :Ta¶>y4铽üó>Íárì¥T%˜èÚë4GÕ ë‹² žž‹&(V9¢Ð$$&WR×]³{%‘ª­övžâiwí²-ÖdÌ׆¸6ç¨TZ9F՝©~@ îÏm~V³Cß@T$¡4‹ßµ +|ԃ—ºy¦I“¬¦¢£~5ûv¼†MH}r`vÞÑA}îzw¬HÕÌÁ”^à}¼²åÀ3ˆf²t˜ï°„*Ý(zJ:OíAz|þ~ñî{~ Õ5ȼwJPæÊ%Ü78K²Ñ™wŸ« "GqÉÕw´ßD(5‹¼"±ß|"RhËO¸RÞÃ.B3˜1s® TAµo詉įRVyZg.{Ö­A¿D±×Å@ ã0Η±”&öàH+´×ÈÕ÷ /ò] Kf{õ0eó}ß'âÐzߖBŒj)Mº:›Y.}ÍH¦7B$q(„¦}ûV/’ê@û,p‚þŠ¢lÄUóê€" ÍoíYï&/—Ä +U¸6 Ûz-Êo‡~rۄg)iÿ…àÙu o˜˜ÚbP¹nŽf.ÇÙ •9±¯iSªâ~MDEZýÊömölFۙ Kþl-kÊУ–{Œ[Ø— ŠVU±6¢ºeÆ¿SøÈJ*û#ªûEXww“Ñ”ïË©ÒJ˄±UÍ·fLʹT…?¤Ã5t öˆ¯©*>n`#øª´;Û¤ʵ’¼øÏ÷Zœœ†¹rjêÎNê§Èxl…P¥YÿJß¹sO[W’útÓq­2eó v-™žÔ>S²(/KÆij²²I7µP喃æSçٰ¿‚r[=ÏÂgÁ,/|Ï슜(šÚ1:%åŽ!ÝY•ÙØdzÅr‘A¡„ØY\1hšFÏNÔÜ6dQ²b÷›J 3À" ±?9AQžÎZqÈ»-È6È¡2“÷ͬ¹mǀmÀD²ÌûMÖ]X0Ñ ëmÁBN›À’WÒrÁdØàڐyñ ѹPØaꨦQ–BUˆªT‚õèQL9UjMÉ'įXÄçÅㄶ`÷‰íé¢ÌÞ¼´‡-ïeÚ"‰t¬ô—)ӞeZ‚¤<ó° ¨#€t Xo?£n¯û+ƒkK~5±Ò=S•`”µ÷ ¤jh–3Ä×þ(ÔWƒ"®2.– ˆrœ©â X4igďO´¼Ì|2¦^¬i¾‹Ýæu[fä çLJǰoÚ•ÇYr )ÕÚ³€š;uün]†áØKÜØÜt¡kÅÚ!ρ8‹hHԓ½Ó¬ú(¼rS[¼ÜÃ]£Z¹ñ ¡&m³__eC¨¹¤çä,5—$Ç*žA‘ýÑbõƒº¯¼_íT÷àùGΑù¦Ù­V²w¿bœ {êō¦ˆ-QÛª»^š\ Ñ‹y?±]M܅'ªßFÇ6P䲅ãºá÷H,D⪊D{¨-Pýê1Äi{]gI]•j…ÃjáZ½>÷kRÒ¼F ¶Ö_0 +×EOþùEýàQ'S*„"­Y4¾æ¶Û€ÖŸG¢Òó|´‘wíEòA’OûÞÔ@]®Ô aüìÅJíYB‡~€ÐëÜ»‹öìŠ D켖 ¿ïµ7"o‘YüÎ[+vòú\Ý0 .*g+(ÈÕo¯lª{¼ž5ñ–Û¾X;?¢ÖýÝFÇ !zÊÑÈ–bS­u­¼Ÿ„!úäÅFI°¡œÓBû)å«4ë;Þ̐^–(¹ªª‡{ç̴ׇ¦º´ÁöS@P\¶ê®Çé^ó+•@èL¬}âõíu"Ê#5ìEÕ0ؓtðî=EF» +S½Ô(@b7|yºÜñßÿüJeb B¸á\¤U1( e>¯Œ³µƒã/ê•ûÜ­¨GpP­?þã¯ðO7”þöOaD+n¼ +pÍ$k´æ÷ÁC¡ù´­úbD°îp·¤“ëuäÿ¸ù§KiܸÁ€q]ÇÔO92µE% 7¢‰OV̤2žÚ/ôÒ`U¤†\*>çÊãå4{l’ÃH?Áœ ›_«+igSëI8³A–ñ؂²ÕÊÆ·âÀ' $NìÉÖÁàYª–oÔ“VÖ©sTüœ:£I˜¤Š«$¿1WÒ©ø6µ“&ÜS.BâÎ~C_ÔgÆÒÚÜqê¢ßþ˜èŠnJ¹úÓ?û£‡Cûî3.3гKîvgOóa>¼¢vI¥¨ƒäzg´ÞàåžÖaácy^BÄüù€æ xìp†×gìEÛ­õ I4 ¹e©T7ç`_×Ë'{2¥áß »B%b"§¼Aäñ!ajÛì3Äæ³¢ñô:V}ëܳQˆ9r¥·ç Å¡­[#§þ†èǪó±<—g +¶oجe音û²‡®.m6–¦ŽI<ٜg¸ôýÙÓâjH_²üɀŽHg;#5Bfvø³‡…TÙzÍærœð¸³Ï÷öF²c҂xÚÁÞ}¸QX‘¨NÂ!Wk}íjô¹',ô½U”wÇÌ3+~¸ï|ÑuœXB²zíÝcJ›ÊGdbÕCEO3 +æ†$÷̹#.•Xš5%ëxë͜%„øù² +(Ô|c‘ìéö•þݺP3Åoëïð¼ kfyE紡ç•Í2_C²¡~Ëÿ +Ñ÷?ö«$7¶î} +_à4çI` ìMÝQAJz/3ÿªzÑ ôÆ~‘š(Š Ù½ èõÜâ%üÿ°,çªßÖ¬ÓAÍy†ìºêiÀÞµ*•EÙUèùy=†™Iâ2ÔÉLg³i@:i”qצ.C‹ Ë ~þŠûAŠþ¥±÷sdß kM°}(/†qª}"®º3»Qí´ ä_íW“#ºËV˜æÀ¨5u3ªOî`ñ®Q;Û×-›Ï^íŒY”!TY„ðÅ©`æ.§JÓÙN9Nòi( *ÆZãÀ&5åCî +–&¥Ìµ#¹ ¥ƒ/ ~ÿn‚ ×úqĒÎózB,(û=•¾µo¬øoçñÚBµËúdkkôpa«Æ3²F§FJó‚êp7Wå3wêbØÖ­IéŠ!/hרR× ê¡DÅ*uó8ŽCV‰\±Ñ|maìkÎÓJùL¶ÈîÍÊaŒä¨t?×q¸ÆXÓËU{²â‡,Xüas™Ëàɤçh%.äùÅÏÈô)7F/´Èv‡¨8ñ± Á©×æžìêz±¢’¨…¾7JR=pt¼€L¦›ƒNÖ4í“/£B¬*Çd*„ho\£t™ÖÂ0A”äÎÄf®]þ8Å„$ˊ:ž\LŒÁ[*7áà,Ùúij¿?(æú Š(Š„ƒY'ÆäҌ¦ÅºrÆÌ& &#WÝ_©#%x¸[Å1*?°tÜÌëë[ŒGŠ2ª©z؞7x|$‹zƒÔ•ZDÊÙӪŸÔà: òª?# [ƒR¢˜ÍU[´á¦x¾=¬±ä3ÐÂbÒ,óÚÕiw,НuÏè…éßr°°0¬Á}w<—N¡Ù„fÛèñ1¢ªËâªµr£"}~pŠõ•,Åg_¢ÇÇ9ÕGÝ"­¼ÙË ž˜¸a \EAn³Ýc‚áú-V)@ÕØq*í ø–Œ“ÃËâ´¤ªçÓ³ŒøUFõ¨™~e—+°y )‡ø·.‚ÌR4¶ëςžƁELÃ]Ë"Iv6¤: + +tÝҚ/üÈbB©¥7ÀЎVàâ„e©Wøx\’­f†hœÿ¹TŸ€Qp^Ð/†U,WÞó{’„Àg¨mxït¯mI~Uɝ+cý[o—Ç‚ÏHÒ¯©ãѬaäÆdùYxWº®”+ùBþâP*őÞQ‡¯ ÙóQ(*4ªÜ”Mÿè™ê +£PbõƒÉ^¯[!2¤šUༀÕڶǰ·b¯HlyMf‡4Ó¥0(m1mÒßC,ÊeŽLŒ×—« ¶âA渗g-3 +åýõÑ:¶j+Önà—%ÏA°ƙgèÙ§óF£Î32×7âÏTdQ žyr¬bV/áó'×ö°¾¹kÊkÀï•?g‡óǟdk°ùó`² —ƜR‡?Çì{tàyú^¹‘ñÜÁdÁ³’ yö5þ<§ú¨[ä+/öÞùsN„®h7½êIÅb°7R“‘„úA%¯ +Eù‡Ãâ§%¤}³Z–9[‰”çV©>B؞VmL¯“ç80¨bnm’»®ELîGH9„Å$¬Å‚y¥ðå´p>¿ž"w†ºC8ÿ·3•ŽQ•Yµ¹ÊàÿYý ® +z7äúç_—WLŸ6•'µryFëFƒœ_PÅÅè*£ÈÞZ©cöB(fև˜«Z€ÈZù]$Øáêùʛ½¦^òҁ‘öG RlÁ.’$1õ a–Õ®1§Œˆ›2\„ÔÈÏó‹£à¢ra²‹…Nhµƒä×^ô4#æµvc^¦Ë ï b»Uñõ=Ês@wHö)èTG…šÞaÎçDv?Éa¤¡§'”Dû"O '‚ð/RÐP(&š×þ(¥Ø D˓‰12Áe,a¬áÇD”£â&Ú'ºáÖã f?ÔÎô'T´ÜN}}ÑÛ3XÐa#Wå.#ÈRžSůˆ?ø£+ؚ½¹EGñŠºÄÌ7:AoÒüÀõÝcòo¼¥ÎÇB͜^Tî_àìÖà3â> a7cT#ʙ¤x²eD™Q…*­Æ”õŧJ¯ëèŒKi357Ï0—½™mÕu—WʵW ½.Ÿ>ùíá4CO‰?ò!ŒªÙW(z\QgŠtì‡%gD(ýÁ/ÔÈôue§sýD‹¼Ï‰:¦ 'c¾ýÂLÿÌŠæò˜hüD)Bs6?á™$Sr!Yå ‘À5 <Ê=ªG£¢/S‡Ú«T÷:vmÿò}ûeªN|ݺ©œ;CÀ"`Ü®ßÈ "i–]2|ˆuöI©¥QK[« ë‘ø…_?m:fãýl'û~x%0l²é±­Ò~ö'n$q¨æ(©³àVöM›jŽ¬ÐÛ +ÿ–E.:Èæ‹ûǺž‡÷”ýx_¶íz| vTqceë³Ð,Ԃ^џ *…F¡O]\ìšÜb~[óæ#·ñŠ‹KÊòI9óYë\cæþ/C£*æ+ŒÖY!¬pß1¦™Î½ƒ5Ó¤G.È;µ£¿É°=¾3 _½ß2lÿbFÍ'Á(”<;ÁHâ1^ Kb»$vLå’`À¹ÞŒ o vùåm‚U´-ö ‡Î-p:¹pº¹UlBºˆa¤Ÿp¿…T¨lB +%æJç£tå¼ðсTî7> +I>n|”{ƅÒÙéÂG¡TÝäÊG/Ýdf X‡æ‘w¶V¬6[É+oøP­¬hh—OPÌeU‘}´'7Eý=÷ú„ˆ¹‹IÄï¹t1‹ Vó€ðLÎZœ=ˆÛµªÅ}¾!7‘Yü@ÇÉ0&"¤)3^ gt®&Mavî¿xi[Y ½Ð<›J¹ +JÖËì–ýŸ$3–IÆ·¿øC ciu+ԒugkX¸JkwãÐg–7Û÷¨§äu‘ dYS¥1飠áîݧâ§äܺß%˜,ˆ—‘„w¬B÷2Ï¥Z?JÐó¸nz¨'½n/(É#Ö$‹‘o9ü%H+ªò¨ÕàÛlaàÇâ¥$µH569Ð"~2îþøŽ:³ÄiŽlJ=à¡š_ÐŽ)«ìËâߺ…ÙTpù8LÈԒ Æ¿U ZûÌ8ÿüžœ7´;RŽó4AMGní Ë°cË®¿„{²8?9ëÄBMcz¢Ï'ûÿ‡ÙšÍ ¢|ÐkÐ"RØ­¿Å?3éÔ&Y¾t_qt—þó€X<ÌS´ ]Aó_Njº%‡'ÁW@$I1fkÓÍÁ#+ŸKP>x™oPaÞà,ëºøåÈ(EgÈbÊCŒ;…+·Y@#æáŵZLqtp*ñÙƃ‹,kùâ†6nûË}®šµh¿fÏ`62¶Rõ­7FY×?͞Ìwøq¶Ð02]c)·ñõÚ:ґEøXûO·Ë7Þ¬´Øœ7«#Sûc!Çø²Üt-BfQKcÿ þ"ûl££­FÍ7&›’üTyü%[|ÓÍP‹ò‚úþµ"§’Ð+ÐN´‘•Ÿ0Ö¢¡ ÞžûÈ>*AIÀ·€Kà$ÉXhû>bô:}ŽQbúä'¶ÇP؈\"ÂI‘}i ÞauÃäçèåjù@7þŽQʼ |ÿÁþ¡·Q¦V©öîrÅ _Vãeÿóm \º@ÙM ü¿üÇ= =СdRëì$¬­…GçDYôóZ+f +0Ø&HºïàSúŠ}ÏõXn—åQúfDR‹Ðá«« øȪ„"­™A­rGËcŸÕ,TñÂ=;"[¾Ã¿Í&~13*Ë—ã:Ï/H@³øëÐÕû¶m×ϧ «¿½2Z9mø +ˆE¯‰èa®>`,fÇdB¾ãšÏê¼zù0ؙ¦’#J¿R=×ýÏLmï°oåB²DâX«å;ò½ZpaRCQ Æ;äañ@¶Ö5M$á5Ñ9z¡©Ìõ'nÆí­Ô¤ú«žëøˆ=¦hVÍÞò‰Y•÷(4ºõ5tÒ@Öú‰ƒBùNG:W­C8ñ9}'bŒ%ÎÚSKü»-´7{­µ¤9/ö;f(ÛÞ: •Y/zˆÌ¦Òûþ1ØêÞéhëqœ‘qv×"‡¤#ïs…Ì~ÓêÿºE¾óf¯eãZF­¦‘ü¡N~dóS]ö Ç2û­ÌÔïTœ!îhS}µ÷ôŽ±¾® PÂÓì:†N£C‘Û'2¿Žêt§ÄÞ˜—U]æ·hÅâ-1'R½%–?lod÷W†¹Æf˜‹ä"E_¶ æŠh+yÀwþ‰š5XÅ¿gˆs±'»j:ÖcìçØeT‡ìâ:vÝ0žeösù~»žßɪé­?Å +4,…áÅ&s¦€?†ÅCƒ‰ï·XJJ×-V¹Õ“ï#u×ßÈ¿“¹÷ç+P—×I’>@v,k¹¾!žˆÆjªJåÊ,·©(}D_YËíÆÔ3‹–6•|r$Ûh )UK÷³fßF—iÞ$u¸zÙ䗙´xùìw‡Ïü?p1üüš “6‘ÕŠ§•=À“[ÎÿQ§¤¿_uM”0 Mh·W;+–®…çΆ3Þ¬¸ÂÚôäpþ³ðÞepbÓÀ !À +ZpÐçíÔ >µMä4Q<î ër§áÞ.‹’õWV«q*ü1¬Ù·„8§µ8±+<x¢%‹t\[ƒ ,” ±À-Ôþûxþ@½Â¹Ùc¯MŸ¤Ú¶Äœhƒ–tð@ÈQ&ˆgK¦’)Iˬ…¶Ç‚•eØS'³:0´®´±*bKłÿ=ƒ¥ùùÿ@)jæ~x§H3ˆ g‹Ä‘‚Ô‚2þ3˜é¶]ÃLM`*u}”h%LÛòQ‚DµMý˜> b®81àx̋¡ÏnÉKêdwD¡ËŠÈÂ4:˜tÐ[ê–`ĕ1ž†Ç¸0ž#ÁÙ£_V,<༜ØThChÅyÀ@ޕ‹ +aî#bÅiµN¸ÝâÇnQ×ýVîâԗ]ªrV?ÖM#±läP 2ŠÕº°q(܂¦ÌŒýxåœo^#֕dB¬p cÿõ²'·¾ò÷"!Ù±™‡6p¦ü a*Øà©ñYp´ì{Zi%œY“ojí³f¤˜öÍ9?J +B´Ä®Úÿ"ñ;ÀQ­Õù‚P•2ÿ"é‡n!¾úY¢]L™³y£¶ FXeT³ë0Ÿt¶OK5§¡ˆÍØøÕ7a¬=v püð/Hÿh9VÛàɓôýó%%B‡>YCƜ1¬‚”€¯vM!$ZóÄ¢±n‘?`1Š¤ÕbìwœaU6eÆd°+…¡ÿùÚÃØïþw´p,°–\–;Aß6‚‚Ë +‰Îk‡›/}´˜àZn oÆÃÐmTâÐÕû¶mR.&­ÔǓ±øÉö8c)Ç&‹ÓžRt¸sª›ìÿƒ±´RÜž{&w»û*Íûo4>¥ü>‚i·‚u¢ =U qYsmíáPÝépýUBBú‡c.aÁDC¥}®á†B-í²cʜ祁B¢ +w€bbvªþù:ˆacœp¿…tÔu¿WHö˔çnj×õ^ÄRڝj^sÍ󀀧ΐ UY¥ДÖõ^ÂrŒˆacœp¿Å;våžôwâ»ÿ?ÃíÔü$q œ·ò¨œN^‹x+ýÆ|Y£Ó…ù2äœ6è„ÀÁK·À™ï>À™ïVÔ÷4ÂWl#ý„û-¸¡(×÷µ¶ÀÉ/tjpò»uû¥ÎÜOöK՟ØNØ8tn³×}€“Û­bÓßmD¬#ã„Û-¤âXWL%5_0}YOþ‹f.WþKI/WþË-öâ·vdo'.dXú{it-“f«DsáÈ{£c›xqê­-¿áƒŸhÍhȗτÛۈŠÈ>Þ Šó Ý,Áý "æf,Îë QzKWš(ßoç¬Å Ùó€¸]«ZŒ+<‘›*Rèpn€*ß[eÆ@ÕMöàè…ÌÎý7X¯ÛÁ´†èT*å&AFDÚø.ù“í´, ‚žK©ýˆi‹­ύv·ÖÖîæ›_`L *Éë"AÑÊÍ%Óô]Šoýªú)9w…öw –2|SFû$P¹“d¬ùQ’ƒ!î]ï° L——”ä‘}â…=)Vk7ö‡Z¶þE|•$I’ÛÀ{½¢>02îË{ê҇ìÿ_åîb˜6iLfºdÒ$‚X +…IòÆfF&ó1ð#¿5¾!^sMl‡ô¿oß@¶¸jHsôóe'9L¶#(`KË´ÒHq ªa§âú!͐έíÀ`"3¶Ñ€´ó¡²oÁŽ\Bž)g¤ÐõѦРKÀÀ€Sþ&ädLþE¾Ä±‘ݨp¾¬ï?ŒÛ²_«f‹F>DÑSBHEÝF¾1OgŽÄ±ÙTߨ¯_!:ÒÌ¥{@,žÓ(A7z7™jévM’Xƒ¯€mFíx¡;‚EÔøøÒ4¼däš7¸ê¾.¾A3d$¥‹ÓÎIâm%®ÖtqZ§»Éól“[Nð`žx`ÒÏv.@ãÂ/ƒ~}©;æ}…gF­&žî4Õd€ÙØÞ¾t½™ï0àâ´PÏnãó!E»HGòq }t½|ãMK9çBOsjíN˜û·|Nâӏ1$•:Ì_ÁeLAíttœc˜¥¹}ûFhd!H©~¾üHÿfÚø®›ªrôŠèQv„U6ô +tÄ8ç.OkI*×áÁÕËù!ß|nÁÔVŠ@ü'›µÃç hZùô!bvL—ÙˆÄ"Ê»D¶‘J™ +0Å%ˆwø +ˆ<µ›IYi¼cr£å§PZà_0-Îå îµf‡£V>.¹ÑR¥Òÿ›jPÿP Úµ´³´¿­õ?­ó¨óR Ö­ÔG1¨×bP/µ ¥ ^+A½V‚z«ëRæ¥ÌPÊ ÁþŸ‚õ„—B°þa!èô(›mÕXNÈú~Pú™Z¼'ÒÌfšØ{øù‚·¯°áÍzì2À·ôòÏõX®ÛR”é’<ÅPòÕæ¬ô–Z-QøÍêr° Y]¾Š'ÅYÛô>–N14 –ã&Ï/H@µºy½þìxßvè…VKÝ^b4º+œ+ð‹Ÿ3“/¾ÁX̲™Ö'\–jeðù £.¸=’=Z¿õhꚒ¢Ž§ÔYêVç¾É·  ·*A•%1õ³ÂÐÖD`•…PºÞU‘ÇñÏW ÞeV—¸éb˜3†cLŽÎÉðN…ûؘ àOšKÛ«äE¿˜!‹g—–:õˆêzqഛ í*+Ñòî úÒºÎkú¤²Aú9¸lÝÞPš¼ÐκãæoQLVEɁzÖõéa¬¡K--­n<ŠãÓ®D0>©ˆ'>|cjË݆¼ØÎÙë‘h}ÝÕçáhrfnæm!¿ÝJ;À¤0N*s‘—9æAÃò³¾PƒØ¡±Å¯éeN6ŠHdx\ÈCâÛ±ã“Æ©mz'8¢äšœ&ϳc+íwµ%ʏ™ÑúĖ¿Ïõœ‚YÌeü°g*ÄET'Z"v¨·R©†õóŽL®Õ;ÃÙH¤v"“æ}È5t4\ñõÐP;oúªæ›þŽ“|«Û4§a?Î!’Ntîø +'íýØéè8Ç1¼ßîZÍ ŒëkHúëTÿêùΛ¾Êý{«'Øh÷ԝL£©ÈNmëҖþ$l@¹:µ(lËÈÀ`žb¬oûÂûšÕ4’ÔihÉ®³m£eÕ÷w™Í•’d|¨&–·ŒÝ7é-ÊgÃöžêïyðâ­L\ÄþŽŠò×q|gÍI™Ô™ÐYí¾ÆtŒv±å´íâ<ÛEÑ3&«k»xÃx•5Îåø±]ìx}ó9²4ZÅÙ¡)'¿R5©b쒰üý“l0Ù-v½¥“¥gÇxŠœrœ™…”¹ ³º»7¸gW‘ay"Ê iúUò›æð\ÕÉ9åNªn|¡¹ì³Åž×e2;mÈ«uxŒYŽès˜v´ %&ëi`î­-½éõÕrÒ0œDÙAÝúý´ã‘aÀ´œ)ïê°µ•pX q—ewÎãAÓäo\ä% +ÖÞ`Q×{Øý ãEsŽÑ/Éí¼kBüóÑYá¾NØR‹^ó†ë”îMeùóŒÕë†ÛŠÕY%}Bã¯P4 Ë")—!•º,û1V7JI]ª…çÏ¡j-ïªW\uì5T¯ðoBuY¿ÇÚ$‡h©f%˜ÊˆÃKáÔÃ61ž(ÆpdñrܧȔu)å§)SéC?Ê}~Nj,՗ò„ˆ+;‹×ê«ÚR’÷$+#Bbjwà7 b>öÂ™àŽ­èќ\­ÄÛñûSœŒUë÷e~+Çõ ùiÌSÞə¦|Ÿ1ÉԈs¼™¾‘s×i]á3ý Ù14¹àŽÇ`f9gÐ9î ¨«‰þgævŸù²‚¬9_$>ψ™Ð"$„–÷{ü\n†¢[·n†Q>g»ÛM[Ï|ž3°Y¿O HsÈ¢ç†d½¹ËeÅ@j. ¯Ö³™Ð"$„–÷{Ÿ±=Sf;°%°¬½n„Øš«$ªj¿¼{íg·â,r·Øe€ÜG¨¸Ñëdil¢l¬Æ£,GÉW'ß?PÏ©’œ˜"â’ÀNåTk'6V 50å ³†’C1/š2x:O ½8æ yŒ!;ß6„V?_ÝỜʓõߪÈò=±Â`ªiµv©ãW#•#âü†“ç³Þ®Cd¾Ý-uŒôÙVO·ã ¢]Y±¸ì'´#Ê°ÚzB$±Rl1éìâv½ÙbYùŽ\E¤™ú@éÈz£•Â7¬…½wp9å[wÇ5xO1ÞóÄE®{®àEá¨bӘ_»C¥g²ëˆŒb­¢w5 ôæ/f8oûVñÉ}šŸ¨‘¤»P É­yY÷±›•-5ZH锫ß6¬£ØÕ[‰¢jO~aL¿[;ª&‰æVőÝEg£žVÀNÅÞ±n¬å£‚ǁmêzÇù,üsöOØÏsÛ6o˜òöRýêÖ|òyøڋQw~7ùý{`IW՜iiys¬cM ,Ò ƒK̲Q÷¦ðY×L³™!·Ðže3~+™»ÆÊë©UŒd¼BŸÇÌë2â7jHíã̀KäØUëǙ ½·f–¸Ë§xO*šaÚÏgÌ.fóKüՅ'œ¦^­7®þ‰ÎrïÜn¸Š¯]èà ~¤ƒÙ¦¶¤ÍbÁGŒ.¤šx¶[Sñ×a É̾€è•Ø ± Ó²e•b(F¹‡™jÈs¤@™ûøèJùƛŠb¡ë¦²cä:0¿ØBŠfŽóCR¨çy|%»ÉÇFGÇ1†á)¾1«…q©¤zïñÉtñM7EÕòÕªz¸Mí†'zB:³ n¨Zzƒ±–ùg>ÞZþæ‡|K÷n-z’D_.áœ5CQ#úµþ@ªÇîIÃéèŸ6Zön©z92æ"+w ‚oÍË +üëË<-[v§ûuήxÇèýFÀÝ¶Üsò‰öÉi è)éþ ¹7×ØäÀs:†,·ß¾mÕ C"#š#`²ÆÁàˆti¥‘ʾyŠ¢ –yH3¤sUÆü+ŒWvl4ÌÉ4DäÕ JØa-år<Ì ë£M¡›")›Ô~„Ç’²®¤T42ÑîŠ{ƒ¬ï–v=½—†­NEf…±né ià*ÙTß-;|„è`U캐EX¦¢NˆKYo1'ÃJÝ®™@¨ ¾¢¢«þÁ‰ðBw”Ec¥h6PÀ¦Ýßáªûºø͐‚²O¾‚µ:kôý ®3µxP¤™MCpSçu|Cã™Fì2`¬_#äŸë±|vecú%O1”|u +vßj±TáCÄ6%þ›ð*ǒ$U‚zŸ¢/Ðõؗó”2BõýÕo ™9ó•LŒÀÁq|1go Z–úÙ«Ê_ñÄ--TXã–ÄK'Ž…«˜ùTw ¾`ò! ®ã—ØыCÊJÁ¤yÁ¹Â?bQãsÂ}h³¸³bޅ/œ³à9ÊðõAÓ`‰ ?TT÷™šÔ8ýhÄÂßÀÓ³VÐBö“(† +6’Å$ŸªJiTÆlP,®ò\ìšLpî6M馶 6„@­Ré>܋þœS^q˜®(Þ½œíž(ȺTâSû‘JÛ(´TC@ãf|:ý,Ne¨rÒ†jJSÙóC†ôríÌQj²óêãº+épat]°'m mò¢îlx!ü7²ØP^º¥°3Ea¬¾âªÌìî¨|ÀÎe×úvíÃL©¤U·ÇtZ=…àOr·„˜Ji#9F»ðfAKr!ïk'2¦·nId÷yåB§æì¯GCI>ôýÞ-ì¥ÿˆfõb¥ëaò(·cˆ¤Rní|å­u .pNYžê›f›#†t¶5’öōœ¾.}–äC[eÁ9EŒYJEÑ»‹qH²R™z„0¥>é P̋â +7¤øᲨ–ñc}™›ɀqH¯Ð»‘{Ó ¹E-Ó,¥lك°Åt^œ'˜TyÅkHæ֐ +}PUôNg?$q’Ä]V{O7›ñºÈ üԍÀFÙ´àâyøúFôrĬ¦–m‚hüwßD~pï›8«5¹õMø±oªð9F ¤â¹r²Xh +Íi¶Ä¾&ér‰>Þ¢£>2Ÿ ç¤G>ù +±­÷¸Ç¸ÆxÂ]!„šíN–óÎ^ŽSyCÜg£ ÇðXqÅ\³È”eGÔç.IªËU‹× +HkÆXÍm™SDí꼄 Ü/Œ]¨¦Ú·Äò†·O×Ó¯o(}øû+ÂÀÈb°\­â{œÓ;‚¸Sä|g¦ä9!<áñt˜™Ó}¦!WÁdÄ!O¾]ùCÜœ&‘WõÛ +֊Û†ë¯×Ä@|ÆßG„oÆkÃï_Gý}k¼ÅŸ7 9¥o‰˜â•ðèŒ]Oü\¨¯¦:GæÃÌDéö Ä×I·ðê’Á<ˆS±î5ÕÇ]jÚ¶*u^+âT¦'jñ†Ïmö ÌY g\&—ÛsÚ\ £ó]w–ôXP¯V¾¬åӑ[4fxiõëŽH.uK|¹—ø4tã»çþ˜‡¿Ü`%e¶Øú*¤ãºcJõ§Í²IX$]b¦_[~+L²k,›¤·0YßȤW˜Ö¤nê¦Ël4vUa²¿‹Ð zPÆó„,÷P£Ö:› † Ëõž9¼ià +cÚ¿x?êìGår?•tx}zÙÖ$™üWü×æâÿñ€¿\ûâ‘u÷:äeU¶^È×Ñ1ÂNFzùŠ=>à$RÃõ-½c8r(Æ%w|փÜ÷ú ¯ó–y7¶+ Ó€%Ç"&qg܋˜ìïWÆÅ(({ ·NM5Ž=‘#'+熂\Ò`ÌèL²„ŒÉ™j^1&#O2Ó3ì¸e +ÉIøvdSidÑl}Oü\d¦¥ì-©Æ‡DªS#¥Êç$¹,¥Ú˜Ÿf;¤ô–3~œ‘MÞJw諸݌¥¡ÌüŸ|™žÝÀí{~äË;üØ À¸El·`éߍa§ìí™èºb¯æâ±B}†¿8‹-‰•Ò¼Ý÷-ÅE°£%Fo yo¹‚¤ÏóqéµZ*[‡Ö ãÁ¢¢»*i„vb$jìçkSق cŒ¹Ô‚äD}ïj Õqâúd]–ÐCQåñ ú&–$µËÊÏÎ[Dp–ì¬Î´óD{%3OAxìV–Ǿeù5‚©d®íII´Uäù«­ž‡!÷@ÿR}•üf®nËF? 1¶‹÷`Ëù†I‹O­Jþò½Ê= +&XYËb¯ï­éÌ,›fô yñVÈÐŹÇë|¢Ù”tgÈ è)éë[Vý_B ¬|ŗåmò$HŒ²w[H¹· ƒ%‚öp×'­4§¡-‹yNãlf¤cUÄÖWØ.o1ƒ=Œ#„]Þµä:îÍ ¤X -U$³ÕR…@¿š­ngE¦s±…Eúÿt%ŽŽ[L¥å3Ïeh úNWLf1ó‹j¹0B£hø³!vÞ¬ã=^à*½®ÿˆÈ¹ùœ'­%à–†?¢Žgw9Ôé‰`ÍN‚ís‡6B•íÍyÜ? íø! gCŽKM•'–Þ÷ e?'¾OÚYLÓõ=BÚ°àÉê–2àS®rÏõX®Ûr+é‘<Å(¬ÕöU: Œ¤$±†ˆjFP-”¨©Ÿ½ª2bV'g„®.÷%±Æ҉#FFa¶*æ;Þo]€jUóvýùø%vôúþ§ËJ¾äwÁ¹Â?’Øñ­á>#¿Á½˜å’ùŽ“º±s”áëƒ$ÖP£I`ò»¬‡VcøÒãV. +2{p4³2/… ¾¡}%6Äû†)wò8ŠÐËŠjKbmh‰õ‚oèøðø—ÍLë ùcŸ¢ˆP½ åktl4 FŸ ‚¸¼ Ssš2Œ~^)­ŒÁOT3©3Šê¾9G£zgÌ»’)åu *á1^"6]•H‘Å›‘9ÓÂrs®±Ê‡3Á}¶õ¯#pƒ‰Ñ’šc ü§{É­Ÿ/ºHæ ñ¢Edœ-}9ÝêËj6#1ⵦ[‹Êl”M<0fî|°Q㕬=ƒöû²›˜…BùÑ5T£qՕãWuvÂÕ/\øgú ¦ •™¦ò_4º¿/8d·‹>ß0ªá(YÂY’úË¡,sÈ<^j|+Z)¸ÓšjXm’ÙہàDr³6Ðw+ã}!¨B5ö-Uquˆ‡ß¤Ÿ"5 í]Ýzä–nu gÄ;ò’lôÛÔ;!»7$±Hb_ÿ¾´4úeÑ»[÷DY¢VmŽèæcæÅl"K†Èñ©D]ÆTÕÛItɚ™ÔóšúË;Óo¸ØYñBæ¦ÑÅn¤²ðLdZ~lRt£[ {C” Þ àéÍrÊõ<…@É.í‡+¬¤l'KRί„éì +¢íÚ9ë%;.BøØF¬2`-­Føª2®gÚj°hÊÆ_¿lCÉg'ïT³ Ågàg ø}ÁQ¼Ü1©?0œ¨S}ÙãÂ-ëi¬}â"1Éͤ÷^Ðï; ø÷×iXþáŸå±BáâW !ï’o$`z—“}¤ktáM]ds]ýø›°&uô}}ÙqämHæ<«¹ÿ—µÆ«y0›•ØË{19ʎ”KâÿSÍ{­è-§úFû°‚ÖÒüøÕ t͏ Üvè1öš È, +ðٟš¬(íöþRÄkYaà=n:Ö>·P¹M¿Íè"ÓË…·n÷ú‚„Yœápð‚ü={8þúu¼83ÂË°ð<‡íÑöódþ~nˆ&î:U(7Èåy2bÛu¸T²xνnßv/¨õxÛca°9ُ“u±ÝñâÌ¿ÃÂó_%H¬Éÿ- ãÿ[ ÁcÝðÑO·/Ru |Qò¥úÉþ¡ ïþ¦ W-7 vÑv¾¸. ¡ c# 1ãxé^çà +’ô¾Ÿ,¾„4lÅE´KÃÛÉLr×2.mÈ]š¿³,¾v=_\ۅ…~·“¹8 /Όð;,<Ïa{¤}—‡Ü¥•›<ä}¶KÂkæMò˨wuÈ%|W29ú…±ižÿ-;^t[Ÿ'{ž—8œ¦pZ/X­*”Qo÷aVxKªôAÒÓb°áÜ1lû‚ `(7ŠÊ ⺋KD¾ù "{w!±>»íX_(ý$ÈÞ¬°Š¯;—†Æ4©ûÄó)tT“6F¤$fE ÉÎän J=ãq‘—ó…|bU‘y–æA¶/x£Q‰•·Á!T.I•Ö¦Lu9Šˆ'ë‘(Í)¹ªi=’²ün•§Eçª6ú蓴º2‚pa‘^Y-wc +;$§W—¦êŸØ¦SЍQ> 6)×ùÞ0&<ÖXfmÖ̦‘íI^ß>½Ë®·oCæ€÷?{¿¡E 5õ©üßAejúÌRö;›˜˜9ЗG\ü =;ëYxWhªpSä ‘.¦ydՐ”´ö4lÞز»Ÿ’H}ÜÝD¥rS7eä;’35¯óoC0̳ÒÑqüàTu,­d©ì·û ú +}èøøDžg¿~EƒÇXûmÍÌoëÇx›E(um[¬;,³˜ç=éʲ âÐx¼rhš!5X²¼߬ã¤ÚÅjkÉ$¿*)ÚëA­Ú6÷vFªõ…²+ç ÆÜíÁu›Z£ iY½dÞ: #—ôZ³îd4/$™“²Ý*$™íäˆ$ó2~·!CO‰Gk|®¦†­×ô4=ÍLŠÑß_ÞZÐsLý8™Ïê뉎ò·6Ÿ÷° ›JŽܜ& +û#Ÿgœ–34éÈòjŸ?Ý/_øðò‹q¶¼™0¯g»ÿªgùMÙsmcH.u‹{ý;wù¬ttö1œ,Óma÷¹UÌØÒÿ3o|ÕÃU%a­¬9à9®&⏠+#DyµJ?vy¡˜IQº^¨*)¾c‹€·H`à|Ê£ÚÇ­„ÒдÂëC°ïn³¿óoŠÁ_}GIÆmìڍi¿"Õw3++O\$Þ¾µÀd÷Ù"v „Z³Í!Ô_‡Ü(ÝÉõ]Ü*²Ö:ÆÉ@ßC³Su`Å`$Ñå‹ؤe|fÌ8TÑ÷ja͑U0ي$I²!å'EɒIæ:裬c̐~;˜wWc™ÆÉbŒ# XŸŸ%+ܘ#ùåÈ]њpK‰–eÐ=ÂuS—$]ÌȪÜÝ +Rb°6ubÌô]Oì2;¸¬NU…Šh -ëi±_IÈï Édð;`§86›c½a“zgeHýÔOñJ–Úrø‚¬JUȧ'…ì|M}A»%kÚý®ºî“Ðîñ‡”Ü ¨% ¥§ªU¼ÌÔâ9³ä.}¯_Ðay•€ OÖc•>¥T™m>¦ë´4ecF$w1”|¶ÅªA5šð!Òzx¡…+óØê"E<ñ(Ž zêô>–O13`¦SÍɞЪ¸mâз÷eÇ/êêRÅÅâ´kI~ĤÁ·Fø¬òc2KfZ?ᲦßÊàûAzÖ²ù ì!ºô։êµ+aº*b^Ձ$U#þC`ñfU^!Ç$ù‡ú¦£•ÅaFLu°†Ðbjìõf œþç[ÐPÂÖyèu3øʲ›¢ŠMkX˜Xä%ÙØÿ+RsàÁiš²ÐÿdJeÊBÄÞpT«qæeÞäd.Ë!˧ +ìÞ>vÆ:VÚ:x1´†¥†qÜ.Hüñ/Äèëß՜{HHª´Þbyêük-_Ñ-<9­RØ«_Ù§Ä Íb& {ì?á@=l]N×·¦ó#d@îgºÆ–°¹ÇMØl×p¢÷‰ú﬐‘—»!éŠÌø³É"w6š¸úb”¦V퍻„üw¼ú6¾æ¿p +!1—‰A5±‹”M4 ¸Õa‚¿”@zÌqáÐy¾Ò‘Ùµúæ¡cŠq˜ŒŸÖ¶ YU-ûü{<Ôʇ¿ªùá¿cœú²6V»mS—'5EVü›-·maŽD÷]ÑE,”ð9f É{mêÿº?¾òá­¢|oÉÿŠ5"Ó4o*º¥¶õiË}eYS+%}"<gËjÿ ­¿1æ·»ÈkVÂÐøÍiHmฐnu¶"ÌÖ¨VµYÏ¢¬O¦~º‚â#%ÑlU¶L캲”Â]ïyDð¦üÉ!ēw„(Ûù:Ç þÔr!~֑>—ˆÅ¿*vŒ‰`C…Qo¸I’æp^Í¡ Õôl¸ªù:Ó_ðÇæ°#†^V¨Ñá)<çµáÖ¥'¨ì ¿ÒO§˜Ô´€†£”ŸüI9öŽñ”å˜$[}vñ&å>àžÖcEވv%E†³ój‘}«ú¶jÝIVÙQLÛ%•)–å. +MVÀ­‹HÙ²µO3#‰>½SâÐbZºT ¥ êŸ_ ¦?¿ÿ Ù¸©·yc¡f¯è`Jcpø?‘Ç“KÎÿ"ë…Uc¢WlE×½ry}I`d¶·°ê}/ɅÀ_¿øe£ò_3ð;æÍ…¹WÄ\ÒòXäØyíá˜+܋3#¼ ÏsØ{ŽÇÉü ü\ÍüâM+­×~œÌH„»¦”o3 ½A]—Ç·]ã xpîÿ 𻡕¹ŸŒØü”gFøžçà +¼nmjWYÿÉÏ<òù¢ûœÓ02w,ÄØ0)æå‡a'ƾH‚þŸî*Ir$Æa÷zE} ;´/Ϙ7øÒãúÿu€R*Ó5‡ÖBQ\€Î¤»C<0Ò»m¬"y¤ífÒ‡ía$Öƒôãí#ôÚ^Ä¢gü€¢ºoi ÿ±ÏE΅æÚÍ18­6FѱücVˆ„…EÅA2™uŠºO6LÖÕ¤–µéÊl±±ð{cëâًúRY7,Ú§ù%}ààüŝâC'Ûï}Յÿ}‰oFþ³(¾kÅ +ä»Ú¹Ö'Üs­ç×ò 딑D[¨‡ õÚÀÌ1ΤBkŒJ÷úZ¨e¿îœ“‘öýØåBØ_ãD)àdÑjÑm¾«ÊÝüvZh¹Àb·þ½ŠÝDUªEÍë‹JÌß&aÿq±¼°.jdF}ê,CÓÊ-Z·}1-q¦qRV;¬kƒêi„T˜ÍƒUŸ›ZN®/ïã‹Ìz?’«‡Šæ¢òXÌÇ'ýÈ+¤|ȶÄöEp"ðœœôØ3þ§ºò:€™¥ @ûlŸØúðNÙîK©c-+´ÉÞݬ&8|_°„Õ–ëøÄź¦:sÈñûbvÎ +oØØGñË;ó;¡¹´T¿|½ {®QÄÕ̤J¯æ¶ÈJÕ›¬Õ<µuDQÜÁ9ûÿwÆRŒ|fJº dåÉcærþúתsªœ_wŸ”•i0úmD)ˏxèÈ ›åùq <¦ZŸµ¨oœÙ½Õ¿l…ÕH#.× °ÿ|ìpaœë‹Ñ«¾CC¡×Ž__ۊ=cY¹v¸ßCgTO§u3ÿRÑOíMM<Çû̀ujsÃÁVÆ|í°ðuêþbUeíРæífÀò­Ø3–Ýk‡û=^I=Iuþ?²¶ÿ?â¨Ûnñ 4ç”kPF‡Ú¦b¦>) /²ÖS`Éß3 #1öݸ¾ˆj휊í36YÛVìËJßáqœaiWëy³õÅ©N-®n@ÅΛ‰¬áÔ4Ž FUâÅÕ6¾Ý_Ä´ÖNÄÎ{‰ªm֌mµo𸅎Xdx®ZÖ^܍άm35laDê jüÒçAÖ¸¦ôMƸå8`W;ù?\­ç€£µcìhJ[b‘­4ÖvT¾üÃÅŽ¡‘qŒjê¯>¡…¾ +³y§•'´þ9ÖdSChu9w'WvÇÌäoœŒ'@ó[ubÖÆriä +ށÿssšu•ÞTc±þ²fm4@‹ÒçV'àŽˆ¸á9±•^ð Ȕï¯jYÙÈ'fv˜Àî éÜb44ü½þíµSł Ûn]„”›ó0ËI¶6±ËXx|£"Ó쒡y[âµ2Ù6l³_§ëd5ÿ¾¬·£‚§Ql › Y^Ï¥~bMík-}ÀàDC×{Â5ùã­J3Ìɼ í$L<2ŠÚ^éDäÞÎdŽ!R@ñÚî@BÒ za5üg£$>j{Mó8U ½<Ø֟™t`-Ü+8•¸‚ûB˔”ö®B¯¯u¦°¬Ñ²ÓN#¨ÃlB‹ Fcq€4jmŸ Dc2tÿk´kŽ½ÒÑ6|ã –¥¨j¯‡?€h9OÞöaáÍØœ_(ÿ@“¤ ½Çd|ÍD,îáÍȈM=Éò¤ØM–|£t¨¤¦¤Q_(!ilE*½J²gi5™7Yæ)‚T7pS.©TE¹Î'\síî|Â;’LrHõ(F>aÚ?upI+[,ùa„#Ïæì/žz"ҙÁ«s¡ »¸¾í&^|Ãö¢=_Ó0ð>H¢5¢2H…‰TlêÏÂâØè ¬š³Æû=ôñ¥´pì›qÚHû÷vå ös¤œšûO7ÊÞL|!ÆÆÍdÇQ·tÅ@²®S„hP}ÿÛ¬CŽÐÑ>F8(ɵ0²äù®Šãºþ’-¾èf(Ó/³ Ç)³KBï…@7ÔÞMÛ>КYØEî(3Þëˆ?b ÔhLR¢\[ºi×ÞóÒ®ZÉmmÉ¿ò²Öàß!óf®Gáz­Â—¦KÂÚ'¶lÏóŒ £¨w=0ʖQŸRt²kÀã‚ÝÞ!­Ʀ’åýÑk,Y¥;h6¦’µVfþgå-æµÈ&aÞòí l<­ÓûnŽTûۂA+÷°€CVqDþ¤8QÙ0Þ»vR/Ãwi®…A!Æ¡åÓKP†âÚO@å½O‡n-ۘg Rö†­®x #Þi‘ »ªÄn¡úB¢Ï¼ƒÙ1?]„#ƒ‚fø!:£÷¦iDIð½`%Vëö(XHÚÑ@«X%obÁˆ©à{A£a™dòÌ!3^SP.`¶†Y?áÈãœ|ƒòã/9ÙíÍz,äGw.Ë ´õ÷Œdyætu€—ѯ8öެ­UxJ±)k¾MïÕ·Òa‰S„‚ÏVÀ’ $ +Zf76YDAM}ïUYí‰[rd„'w_ácڄÒ£ `N4í}AupâЏ÷eÛ.°ih{‰f%÷Ç(k +¾´I o*˜?àšŒvy.¾p2ÀԃÎÿO[¦Ùl„«0 ñlíãjíìr}ÄÕÊÓ¶\Níšþ€¿ä Åß? Z(Æ.ŠÄ’œò‰‡õ•÷H.užÁ¹ˆÀäUµYÜX‡ )7¥+dð<^M4vV²qâU]íµG%/½h“qß?ʸE§ÍÞ¼‘îÂS)Ï{]mÁg~U«9ÕÒ¿3y´£%˜%µð |d:`­†¨EuvŸÆÌ`±MaÉü ’†ÓŠàû€éA8~;'þq)‡öåÓÌŠR$ªZ³/ gö´Ö-¤=9×ñˆœË•vR]»r éȉ–YXršøúÒïp˜°Íc/ÐØH*@D¿Xa_Âr—Æ44Æä銯Ù@Û9ÔI¾J&œÆáX§v˹„Ö‘ ¼+aVf¹ÜÀíóÜ"¤ ‚d Ñv®c8¾Òr9ŒëÍàÞ¶ÿʋÚrðÃLT=´"DŸF[ÁZ¶éyOÔ>J*ç0ò?æ¾,ÉJߜѿ¨ ¶KœÎÎid)m¿ƺÄtdv“bɯ÷ÂA˜‹Ä‘ÐA¶é[É|¥cƒÍ֗s·'Ç2l‹‚3Áግ¶ný*Ï¿£¢{“a‰ãïÆ¢Šf‹ØŸëƒ…JEO­X8~û %ï¯VX„Ž&1#ªr|pZmÙМ1P-Âù°ÙRí׳wP@p~ûPXÚ÷;Ԍ: E†¡Äe±„cǃdú1u† ¢ÿ¥ŸÖŸÅB«#'š ʤKYû9? @÷ïn&×F¿7ó§qç#˹}@ËÎØ ¢ÒæW«l˜,øm·^´[0’l°ÄNƒ#K¼}ˆÁÿ·ªÐ†e#­­›¢*ܼ!` Ã2üø>ã/63\,’l«¦ ×ɂºÒ‡Ì×|c»RōT°KôýúÁW,_­ðÿÕVF†:I4©„{kG¤ykgçCÊj<é»èJ$k{xͲ›æR†%#+¿SWäßA»í†–T6@Û~­‰v’È…©ÞV>aMÕh¦ÒF‚ÓxÉ3KIØ&>»öuÊzâR-šRlý9N2vUÃAaÄH*tOÇÌùƒ«LiÖÑ›:oÐÕ%Én 16’lÌûO£m=ï… ˜„ElWë¤xÖ¦[ù‘Â2FË+©$k;l&²Rgrl1eÓL­îý…$'a®ÿ[L=ô½ÒѲzÐy%.4ÒØËá  -oë°ð4•‘VàúT—©°Õ‚UÁ™‰(hM¹]¥í5ÅF£!y]ùمB›ßžY£c_ŸÉ“µ¶Ì*"Ì÷­y#é #ø?ö«G¶Ý泊ÞÀõ_ÏÀÀ fï?0«Š:¿¾ö³'ÏxQ«ZÒE‘ÅâR è®*å 3Äe¤X[Ox,v˜½Ã¦Å‚ð]¦úȋQ†¢ + "©Þ©:Ÿy²\Côzƒùè;[ÇįQb%µ‘©²Ž3;‰¼A¬=vhmceÛX °Ú{Rê;³mL{&Åjµ¡F+Š‡}„à÷†z RF±ñŽq0Ó;”-ѯ߶¤w*c™å°c ÆÈSiÌØcµ¤Êö)'N" Ç°#ÕӞ霏†Ôˆ :ñBÏ^©9(ªŸÇ“zÍt¿Oə1ü¤÷¡Œî˿ݙ%èWDGã˜ótã³q—@Ò¢©Ço“l‚-hxÓØß $*êÇlڛôÄȧÏ ¡gZåC¡ßðÝ!w`Fڗ=<ÏrÇVúR_ôªC_û¤Àïâ%›KžÕ¡XóBsËàTT’¥5²»\ÀÏ/ÆçŒDäÏ7X»)ž1ÑMêÏÆêYEðR¬}&ÔäÁ¼²ÐP¡’O~Ó"Š ˜x‹…ÉêXXBAu&³L +LMK…•é\eR@ö!âzو¶pbÑ%²X”<ƒ!?xLÌóˆ>/Bïø©¦ös¿*´€NiÁrJ—¸øð% b§Öß²()1²BwöÜ·äA›ÈºHÑÌHïÖÁܜBJ#b¥IÖðÆF7>®’ÍC]H& ÿðÝÎØ ôGÛpÎ,û¯[Â{c~¨u­¡tùcxÇýUÍÑtÒÌæÍY·ûuüŸ2n Zk—œ¸²J]ÿ1-ˆý(ó×€¿>®&hÅa¡µ×ã_wJ2vrj=WGä]³±E»•ŠJ´F1Á»@ƺƒèySXŒ Eé'20–‡WC‰ƒØ• öïgòç˜3òVã(Sò,&YÔJ àôšÛ†¨6L>ÄKäh¶ŠÊÏMš¹jÙúÛ¿!Î0}_¼cEÕa֍XüÁéw5µt(çõëýÉYiR’r­Cì\XO á3¡½V§N>jè×¼'šY°ß¡„OˆJ6o•%<€§mSK҂֊¿Ô¼Œü[Ó&aív¼c|z‡(ÉfÒhƒ0ú†|ÑLÏD?ê®ny£”d´~’Îá[©¯.sf¶¿‚þOôuyAgèÑ_F¾=XÕ"~z} IÍ Héá!è5„ªücCÐ*=¼ØÎA~†®ÞjtŸV<—ÊE÷À–`ålŒ»Y¢{ç6Œ:P2»µ¡‚Áèe=r Ædý´þë·êÉní?ë¤Æ²k'µá¨ìa¬¡$BýìNª÷rtRªpGÕP8Qïš(¡°j)f«Tã£*ú1 µ«À.S¦º=C^:´Rf*üq¯tuŒËO"4Bdy#è‚ïãÌ4Eì6ÜcžChOEµüE/Fk›ÀÍ4l֍˜g+Û1+™;õ|Ÿ»Ëñe?E¶*<ŒÐÀRß(!Õª•Æ®/»ÉžK™6@ŠÌ1çÏb X1[‰>«Ëä§×zŽ¶(W˜4 +§yQ n#C²ßF(…Vî«ÆXL®'b8AÆ ºÐå^¡µnS0Í~d8+¨L•¢*U€x êô˜=’·{]}ü–0ếQû¼UŒæ.o›ÜˆÐÕÕ‚'4#×MõÓ…¤ëpŽsnØ9žºurVË%œَ=ƒ{Zð-wœÛ¼ü;†€D½Õ’r2z—{ÓsKC'¹úUÅvïhU».½ÁæU­ðdùýa‘¯Ã©¥!ý1ÃႆÛpN:ÕЬ°<–óÁp¸Ê äAÕºÇJ/véÒòù®joÐ}}½¦íÄ( l8ÓØÈ¢ ˜È® ~ò²è¿á?¯ ÞðÔWõ^®¯¹®aîö$%!é&—¶óH€\ÒË1-°ö®‘‚‘tQç$–Ûºdmf÷Ãm§½)E¯Õï.?3_5P" ۟™´l#i9À¤s´Z{µ¿×Ôl—¼YšËõB~ʐ¸á‘E*PQCX=ãDÿ¸¥W]½,›5!Þ2³qIíëUt<´ÁÏ—P¢Yi$)šmˆÔboà>²ø»T^´ÅO>(#ˆÃÔ]¨Š„^¬è•“êؑK7n+ŽQŒ’•ýC“hÙ6Š àP)çÞ¢PŽCbM×HôdÌ%OÞy[ýϚ¿X¥¾„š¸ëljŒ’pPÕVÒ3ê‰ÆŸZÌ$ܬ ®„9¶±v|¢,f£‰¨•R8É}j&$ŠƒSH»Ö.hm¥œ´H/}Aø‘š¢Ÿ(1„qÉvB7—cÆ^ž«„Xª;h•DÕO• ä…Â’c2°úGÚ뤪+­û òæâ׍þñwL¾XkjG«tùcx÷‰íΨ€Ó‹iž…úúp\¢TÅtkåÜ|B|œË÷Æé½9­qù6Ð×ÇåhNŸ†Y{=ìÆ]/T:¡³ÚÿE²S€ìZ€zÇq‹ÈÚjwž¤÷ë@Ie¹P2Ñ?-ø°Ð,Ña7qͯ{Wù³±ªÛ]ìUÎ^p5¥8ŽH ¡Ãõ™B˜̍‚7ó=¬caQ—ƒ€cué'`Re[Ìv(’/92‡œUÑÊrìsÆ1+U‰-ä°4Tººx‹sÆø XFWÈú4¶ mÖVh›oL§p6¼–U¸o>|ÊÇÑþ–GAZnwÓŸÃwÚE·?qs¯Gí@/õ†uƸ¬àÄ°òE`۟ ME«ò‹'SU+Å»L'Ïïr'¶ÅgŃ=äK~íRàñY‚¯}¦æ¶qY:à´Ô¶-ÂòÀÇÜX‡š€Y/GItHîs6ïÆbÙŽSŽ +Óº¢AžÈkñY!šÎCc6쉝7kÕÊz úڕتª 9ƒú³èÿ´h¾ÎåBów×^L×R ž'öõl©|@å…re°$q(®æ:ç@ôêðMþ (9í= î2Ò`R䚮ßHêOŠš`D¯ ¨æ„t„6r0þbèk‘s#?[ ¸Ä%JÒoŠn~yUpƒqN“µÆ¬Wл… "É»¥j˝.$ +F«a¢†pAêÂP†Oìo2û¹üg¨»z%ºeÔ¦…uà uË稑¡Ý!ƒÑàã÷KtD¨ñ=+…P¸6_{¨¾ãLöûúبËç•rü z…VÝÍß¾³z=™~©—¾e?ßH³6¦ù"ý|»´ãR瓲²T +ÐӋIŒ¤mÚê…?ÝÓâ[k•oº»{,¦Œ2ì‡ÌÉ÷{VsÚì<F»¬ñ7Á–=fè"ÖòÔèÔ)–/Øý^=¯rÂi™á¾œ2ròSÓ:°«€ä,ØÆeš »|!°NІýÇ*ãu| „ÔqÄ!¬#⟋ÍøÀý +XîÕižWÚØ 2÷5΃pa£g¸\©±IÄyÙgÿã”r~`Ã}ށÑÇx»¡HK¹ÝX NJ0xàj¿ßË㇇Wã… )úñ= œ%°¿÷BLŠ¢þÉwµcG²ë°Ü«˜ Ü9¢þZ“ ìý§)UU·ý¢nPE‘’øGrIN¬€RÑ+uå«®8õƒq¦dy4Ck݃kŒ[p)´öê -K¸¯ä‘Pz~H&ª8OŠ§ëÙýBŸ2#´ƒá¹e¶rû‚$¯\;ì6\C’ÂœšÎ ¦ý¶øóãx±¿Ø^î^ÎALüûÁ¶`€tÙl«øý±œœs9v›-çë‹4ÑÚµÃÁÇæ–À«Y󟳃ou?±ß„¼8_¸“{ƒç!Hâ,³FþúÂ{õzaà ”†¼®ÄSîsöˆeLè­T@Qþœ–EؽQ”0ä¨ ËÈ¿º«— ø®›gKjó.Á·¥ÚpŽ.ÙìHÓ¯cS· Äƒ d£° Pç"ì)F‹=IW‰«éî,+¥!HˋHÂàpÈE?hbNf +ÝœQÐAÀb¢<%¡b‘¶µÙØÉ2Ç–<©u Ò©=ÀÞjùEÒs“ûG=z—l­}«[òï1ÞZa!ñ’˜J]OŽQìpŒ"N1´Åf/¸ü-5_Ÿ¿À$n£{OäôQÄ"VÌo«"ßdš"¤ôí2;kŠ^‹GÍÕ'¥à[=‰«Aã…à—˜dÁè)œ§k’¿;üº` Öó$/V;wŒHsÅcŠI¬‚¼ B^ª³×^Þ BgÅÕL’µWŒ¾3úíûWŒ‹ÊùaíÏè„æ Ûf~½!°Ø†“ŽœoÈf DӇÄV´¿4q½è {_G">3.¿i’(֏f ³ïÁ²šáÑÃ_Í+I¼rsÿ‹iTÛ4uÌ.”Sÿ|]þÓ Ç>s„7Èê,-2àñ3gÛH..?å1P V٘?áDç-îa5¿ O“ÞBÓªí „£KÒÀµ8t.F-·³TT2Ùì÷Å8ÒÅبgÁëÏQnèöÍ/5ùُۧGqÁîïû„d ünM/Kèë1#qfK×ø&.+žÍ¼F¯²ôÀÑXàueÎçâ—aÎÁm*‚ã?gÈIÊ%þpÓOóÚԁø@œ+ªÏ„þ~1°8â<ñ‚8Fg×N‹´7yÒ§z”CÜbíñÀm¼cÿü‹—ÏJ÷†M“ÒyqfxÅû{ëà ~öúÕJú§4 +&òÃ;R!µoNñÕ¡ØI†³à¡Õé%kFoåëQǪó´Á†+œŽ¯,Iʞ›ÖR¹€_©_<þ¦'÷#AË<· +›ÓD ã!~””l¡µJùI™Àlk‰¼KŽñ¸àÀ/=µOöRû­k¤µk5{Ø+.{ôDI«ã£~ؼ}ÿ‚£öÇÇH”ï›ò0å†y-kEŦ’Ÿ(ô(€#{A,Åkç(ž]¹0<¦g“õΆ…®Õukì~üÐ`°“ã´ ÿŸ}L½ØÅ>÷4û}< +Ò<ìÃy:T9»5/j#ÙÆ,‹ˆðÝȲhD"ÕÕ2•º´­Kê&F¢¾Yu—Ìg”ÆË‘8HIgõkcTêe~glH/0¼ÚWbR‘]du³²$œÕ ÷p²:Õ%«áÎ,?µñajuø.@XdǝCÆö-éWE&‘)ê-ÅFöب­=¼Âï á«|¤Kðu :SsÁ`ayÌ¿M5÷fôEpT¶Ù)É,ª#ÇÆ7ANª¨ôÙà:X†o{¼ P@íav žU£ñb³d‘å^5ÃÀjÌ['Ìb"F“¼þ™Ò\ÁQúŠ7¿ÿÅÙÚþj´7ì•-³nFòˆt¢>ÂqH™Â $Ғ¬žU¶f ßUßîÅÛ«9ójãìëHd!8ñöŽzwO??b¸(ö˜ô2È´¼Ê±àèÓyç<«Øa®£yPxØgŸ­‰í Mû:’ç²êøL+T|8ë=µ×)Ý KNÙ»®›¬êB‡þ '/i¡ºe>”º‘|×È«Uíuk:û,«¡éݝ½û^Wõ"›Ç†âò^ G»¡cd¹ eêÛÌGµ<· ^Œ×ÜkôéÒ +töûOün 'z1é6ûX4FÙcÿ’ñ÷˜’Ú Úõ5ÿö4Å饴[%ú:Å7¯ê»LzŸ8kš:“ÙÁ,ÞCÅ!&¢Z·ª'1x—I +‹wn±|kGÈoc(þÍóiY%}Nc¯ñœÐ +à‰qAՈ*ÿ)b;^ãG˜¶FÒ.IìUsÌ¥`¶¿6t‚ËëcÁ}EfÓr¡ç¼@äqÊÞkeÅÑ¿Íµ¿wFÂøl[§JPîõœÂ‘¬2«6S?šŽ’—=ýÅcªÒQ‡*eoè@×BkÃ#)mï>9°"®©¦÷Îb¿µ€xDùþÖÛOdrýµäÄê©8cÀjb+Ùî|:á¶g5Ç̉móÀϏI’Ô®uNv)o¨½õõÆ ¥ç(/Pß~míX¾•òÃo|ÜÑ4Öí£4ÔB[%ÊS›ã~BÙ°{­s*—ö†ÛØÆ(¨¸Å£¼@ÜÊý „:·õíZh?<Ç×'Æ)¼ßô­X=^›¾÷J õaÎW[‰›Í9±œHÁ+ÀBp»V/˜ÿ¦¶üT\e½yq "†Ð^<1´P˜š?{éù.ÀÑ0­Nóf‘‘ø‹#ÖAŸ‹y’¯e8"¾ÊúæúÜà×cþ9Ú“ÜÏæŽ>?ŽíXޞ…òÓs|ΧZ÷£l¦7Ô*XcÕmáF¶5G²ÖÆ%XhGµ^Êk[€)»mÄ æ×ë(D:¸ÛŽåíY(?=ÿÄ+¢Ù£ÁýöŒgõzGôŠæ-¿ŽEc!¦>û^]x&ò(pÚ¿-ûKZVw3d=úLnވÌ\ùWöêq5 +.y¢¥6tp°+K  +ÆYP 3ôð6ƒòðؔx@ ‹6iéDÀ¡qË1}˄x#®-æ¹Ì|¥„¡§/p–p§Å#4!å,¡Jè*xƒRè +]} œ£JŽ´¬}ÈÈN‰Nì@äIݨK–ÊǗv­+ÿ"é™DB§bó.ÙZû·äIƒŒ¯Ó{Æ´|ãÈ-gAús ’§Y>0È©xq:ÿþQqªáÒYÿÅTˆ€õðBc_ìkx[°©Õ5\7ü$Jíßs‚©±“z&Û-v +ù^A<À"™ï`,û?Ñô¬Šè&Æéñˍșÿ=3¨kîq¹MÖI„\gštpí-Ÿ2zúìâåîʁ¨¬éÆK{AûË/썵 ú`-púFïø<>á`h2{ǘŠ9n¥½a¼J»¾~¢ä$  ‰?—ڃ‹ï'&˜=½w gG³Uäf¾4⾟C¥Š'KÄ|m4Aʦ¯…;¡öpVSajýá¼0yêkq^¼j©ÇŠ#9?æÁøéeÍ@7çó¡¶&^´ŽÛ¥É'YÕã¡4þꨣ鐜F¿÷¬ÊÇ«>\Uܹt(e 4—û?<”Þ¶¤]È"À-K•?4…ï:‡†½úų.üg©ËË@وÌuÄU¦v[{†w/0iä;;å’ÿüî*7“¤×aþD± ì|º0^ íŒ1›¿û‚’ªªû·º¡’Hê }­ ªÉî£&W'ÿûŠ™öÿ"–õõKFþÍ|áõ3"™Aä£ÄxÛÙ‘ê ×6Ê%ÇëR-´Úb¾ÌÀ%Žv±°ðñºF$>Ži“ëÎ$^NkƊrY¸ïãu§¨Qے”AoPÃÏ:×½6…òŽñš‡ãšúFè)Ÿéè•ÄÎw†ŸÄb¿º=áß Î#*Q +îé ƒÊâX®ß µjñ4 óf»nìŽÅR¿;څ¬eÍFH.$»z‹Œa‰‰Vbºõ‘Èû”æ¿ #í‹Ç3B}B$o¤Þr_¸'ËՂoŒVQ[Vo–x¸û¦™ä(-ÁG0ÂÏÃÇù´Ë'OÍ*Ј¦ÎìÞïÈjOÜSi†KýûáÖn¼—Î3ÛÐøñ éÝÊ.²ÈÁ)òþ‘ܾ–m@“V⛽הòŸÃ µµeSàõåþ=-»Eiêêxø· RƒÐC†Š¯C:±úG\âhkÝB;lÇȉ>· @ˆ9³ `ÜæRЃѲ[ ¯¶O#k¦ÆŽ˜,ª×Ì3˜&)£á¨LêÄóÁS «œ!¡|ùL“Sz®„µ&µ5=1MZ— +àjfqÁ4j¶çX ÜP“7tCÈ.¶ßz)Ü4'Ír—¬h8µéƒd;Y­•¡¬Ð_V•Ô„[Oo8[òïéÈâiÝÿXí ºæ%õ$¡A¼¹ZqKdä¢ÿÒl£úˆ× +7g GKU_Ƴ y™td/KºÎ>z\¾ð¥îåµc¨@V:ˆ%åHhǍ…TãØ_›Ô§¯t´ý6S‚\ˆˆpnUÀb¯öJ훢ñU·Põ±µkFEÎ2/ø» ÞPöÒܨFîpO† +«ã qå!»ì²~LеUCKšÆi«õõh«V¾[ߝìe­.éµU\—ôHƒŸØbŽ¶_Ž”PM {t\#=çÀòÛLÐÓdàf™Ì†˜¬·ÃH¬šÀCnj$¸>@uĆªP§y°zɁ4}B0À’5R˜–°˜ªäÝð„µOùÔÈÄï0¸³úi¤¥j#جmÿÓÈZå'¸~nj¨L6@8UD>ˆ¡:ïMß GkNÓ÷À(-Ÿé¸Û>ÖLöUÁ;'Ç!H©«ßcÕÁk5:¥µ]“Èy/\€VÅ"G03¶ ·EåF…ŒªšHûºÃ +çì˔Ú5vAé8ö5ÝT\‰W/Dª(}c璵ÒÑ%ø¢-õ©lïgÒ>"‹Þ¼úWä ¯Áºr°ªÕQ²-xª(Ç¿g8"1ÝÄ îÙ #Éá'®ŽÝ™AÓÀdHžë°£cêXG;$6sÒyZrIЪá9VÃgG™¢©ä„ŠN¿Å…¬÷žþÝaÇ)la-üC㕇·Dœ”&QHNù-ÂÉY—çÐ)×±Õùã6í¿Å”Çô/õÛ>ˆÚtinK0®gÄ%+ˆ[ˆ¯2;GmË}aõ,ÁÀ\^h»LZM½ºU1ÉCû&Ý–ÒhnÒ±;ÔºÌ-Ô×C©T”¤€+/—ÍãÇڄ‚Wê®»J»þ…õcàÖŸOg$oÀj}ÂbÒÂ&Çڟï}dMCw„:”Ò†½K – ˆ<ÎËÞ KŠg`(ÝP‘Š¾Á­Àþn V­ZBŒš X¨eß*EãœÆø ¹Ñ%Ð_0)rGˆÜ”*b©åT†lfLo¨—i3G¿Tã0©î;B<Ö¶©ˆÞъ‹yhíG7Е³%Ä-Xðx]°ìÃõJ¥­Â∂¹²*v (Ç~¹~{ˆ’æÓ¯0 :Óz2% ×»}Ž  Ø‡Ì#ðÖaÃRØ2ø ØBÃåM>HN§^ ¬ò‘«‡‡`|C*ã&_èh×¢bM·ÞãP5`H9Ç%;! Ppûó¾G˜oº¾6Lçc&—ñÚÑU(Bn%ËÒ®à ñ〺læª 6½£ÞŽÀÐtZ Õž:Õ&6TM ` tÝ/˜ +®z‘5øŽBYÉp¢m +/˜N§v0[ÕVk;â +B”/ @vNf&Õâû€–\@ …›³—¡ç‰ÍÅâê5O 㻦žíû̈óQ¿Û]Z^aÂÆÓEY>0N_Š¦?`XƒäŠ‰x9&pÔXF5° BþªŒ<1L7§³¶°)ƒRû+î”A›ea +¥!e fH…ÕØÓqhö•+Iû&hVÀxŸ²Æ¿1çÓ^¶‘uì.]y8·`_—àgêÒ&”„Á¡1çK—jhûF­nK`áeÔ +½uߤѯ¾¡ØŽä‹ôÿtìî´l…r Ôæf6eß±˜jŋ®ÝáïE}H±îð÷kA9Ëý ÷äåHðÉϵ䙐.O;¢£ã¦c§i6Š$˜äÿ“}}}-Ä.‘–ÿk¯F^¹Õ7¤y¨ÕñÑúBòËr5<Ȥc€ÿj„k¢)‰““]HĖY™¹¢ ì“gç´ Ù[؇h3}/u,c/“söuŸÿ°Ž ëðwÁbÌLhªñ×d+Ýù‘7õ êš"‹±Õ`°¸Bcýó„Áš}¾/˜ó»W¯œñŠqPxš1`s]8Á™‘†ãÜø“8üÖ.3Ò.Ͳ°°yЂ50ù^*ëíB˜+V¹ÄL÷-p:žÁ<[ژÍO6|¸F.r—-ËåÁƒ\Æ6°¡ûÛ¸Û[;«A9ßöC¬Pk†¸ \ã‡ýñ=‹tEêÕ6ìß±”jI(€\ߌ}Ðräu"=j$Ö [b—@‚ºçX7ž”:=ù Z•ÂJä2xqW¿jŒ‚HÉz$ø6µÊ>­Ö7 µTҙþ€¤GÖûߏuÙëÊ?G(©)¯dâZ„¢Èó`AËUõ»&#ª9§—EÏ!œ/´jéßӟÝ6±"ØÊdښð÷Àj×³DÆØQ#óPÿ6ÁXûx¨Îípìô¸IÝh$ @T‘º½'«î¸-ý¡@6Td!Ñ¢V·Ã[Ò +Üm7gÙ$C`ÿl;ÍúþgWÂÇ(¹XH\€[`Ä¢³"̼.S€dÏ'"ÙuÌðeè4 DªK±2²—g÷¡± Ñ­rFY,†;ÁٓÅð¹Îj,7"[ëUR*㛵 ï# Ö’Yü0 » 'æ굶X¤¯ì|ƒbƒp»GÃHŸ˜™¨yc”_ŽD”=–Ôâ!žCT Òi“’Öpµ¾G¬]r£~«XO3 +Übž·6DZÕCü85³µþyÀ]ãIºjx ~ÓpM§TY`¥QYbç\u"-—wÊ)œ_ä4RóÜ(§ŒM9*åcU‡¦j~ÃÌØx¦? ?Å˛dƒ1ìÍ2¡ÿYËÂ$Žÿó]åè‘ô:,ŸSø¿?íËyœLоúR©ª{^b7(‘¢T\À`#›´Z{³µT›‡ºÚ“vËﻸí?†PúZçRÛÉ©.üZؘâË:ß|‡i%ê ñ Ýç%©pðkYM+²{C+ù†f˜É”-Ù0öS‰]ÍäCܶë·6ðÒ8µ²:uP96;¸‘'¬µ­!#* •…;[ e¶2Vz´°4.·[a¨L¾)}J¼0” ‚?Jð±‚$Ûò’ 4T¼Ø´.Y¥á {X +½ÿCB-ÚN*sŸ$¬yq{4?JöÎå£ç]ÒqfñÛ§Ô?J.-¤`ý$ØgÿÆGɺÃ#};j3–žÃI‰ÂÕð­'÷ž<'£Šb a"=bƒfíƒ#µ‰fWó{¤Cß¡ìÛvǓ×Ùڝ”ü°o˜ +îÀÚp9lnÀþŽð3\7Ú„ž’G§uôەˆíÈT˱£‰>\ޗZ`øÙû±ÿÃz‰.v×I¿ â6Ñ"éI%.)/$.Ò.LŠbÄ;Ÿ2³Úë8V±{ÚfDÍt¦­-ç¤uzjÄ|œž;fioêJ@¶ˆë"cQ­ïU„o­KÑÁ>Åq2ríŠà¯!o³†ŒUö±Wݟ´hùáí¿ÁĐŐ ÉèGÁDHz 2õþaÊý”µs1f) fÒXyH 9o<1ö—3@‡M½šDíBÆ¢‹hþˆìyCÞ¥û 34Øõ«˜ÔßGlÀ„°ú"‚p¦ïì;}ñ/V-0Isï(ñ«û%žèSj#p†\Mtîÿfß(ñaX¹(ò—‹¨Å]´Ÿ|‚àlëñ “µkû~¬AUœ‡ú<œ|›FErà8+8^NR+ñûí¨¯Èf»D‹ý,!è!@2ÿØώo¿ññ”o 5{s¼kúIxXY7žˆv‚5ýU½aBñê1[æ¤fŸ4€&uMÀ¨¬ã=ùŋ²–ŒŠ(Z–î¡MI\»ûf*)t½'^z*8Iùá“ݝƒ‰-%PyFÍ2¹üÏV½–w«žä:ÍI䉳æ9pMc6œRÙüù39–´-ˆ牪™ú…‹óñCÀ9dëW)Û~õ1fŸï뗷Ҿ9oÖG½.³q¶0 Ï\0ƒã66ÁÀÞèõZ7n¾Ô7ôÓ6®š=¶rÕhr\Åg—}ºI¶s¦~÷֛ȑh‹ ¹n_Χ–Å5µPÒMbS 5J2ZË´'â¼>7üy°ðW47ó¯’N5~Æ#sNÄà̪Ç/l‰ÓªHùf;ò­ûç*1”õú†ƒ—Iã8QígñŸÚ´¿[wKE4f´´šOˆe¯’š­éȬj¯ã–UA¥‰\v ©.èTÃË;Ꝟ²^#Ëq‡£©䩞–fÞ'’7™õÄW½ÿ¹æFî¹c¨]^šIÍzÙ5$ÏuªawÈoΚYŸ:2PIƒòtÈ¿MÏҍ!9ŠÃùS4ÆÒl¯ƒõ²jH¾‡t­rʙ[ÓѶ»q7†Òvètöô½¨†’§õùÕÌÌ´F5‡LsAtKŠ,ûcaÀxˆ…¯Ñ§y4¡mschŠË››«Ú›udE¡Q̵9|]и5"YîD/«ÁÇ®½ë¡'ŠqzYh¼O}ý1Ǐ7œW³DÍù£"¥bxÎ7ˆçìíØýĈÛ8ŽÓ8,²’ª¥gˆöùC› “ ۈ4šâ§jӃ—¼³E{¶l1B¯\Ô “U[–s¦¼gLÛÈáÐ^r “¸$AtZ@s(u1M´¨"Ü +˜’ÄŽIü6ÒaO…¤À)ÚL©Ëf¡Š Ã@¶¦Õs’ 0"1ìՍ qÛa\̝A \b¶íOå7’t”GÚlÑza=ÝÔÎÜsn”Ï‚ž²$—ÎS„Ž’¬|—\Zx³þ!ñÏO3ŒCò•’±‘ZžÄFŸs=,‚Å:Œ£c—nÔ<æèÏF,{?ˆ¥Ô×êæ• Çß5e;q曄„þ+fPºÞåå€jÌY½‰Þ: ~Ì$•FBÒÍrùžNŠf7sŒ‹nâ#‹É(l¦–¶äu“Эדæ’ s;pV=ëK++¡1’yÎm3üü¡ñ¼ *@iKË@Àÿé—m'áÊnÉ~ÿø´g(Øæ m¾;_Üÿüf­.¬ß˜Kݎý¦CíÄB²m÷_r†¿Xgø¬Ú죝ß̀øÉXÈv­íÑÏ”ŠlMv~/8 M±úø€ð TÑE¼÷¬b(ÜÜbù›•Ï –ø†ñÔj(ù{¶ö÷,ŒO>ñr4Ú5ß`\ì3Z»¹cÒ`bo¸v{±­èéŸÉµV¯äªüåL®-±äªè†óH®Ò’gnAÐúS†ëÚðšGvAbm¦w¥A4¯ ˆª¥Ð×ZÖQ®åÀ6ñ'³ÎšUþ{qsŒ™÷æ0, Ë2¼?ú. +RIF +r/_ Zùb¤’&?QTœÒT°Dž©ó®S ýõ‰)ýOª1#Zë–|­ì[҅E}µcùëU’$IŽÃîõŠü@•i—ü=qÉCÖÿ¯€¤|‰h›³¹D8´R ‚>ÓP2±ªOs^›“­lAF0k9t‹4)¬ÃËÇáS.Ê$+‘é©êÀ#wj©‡RÔ8Í©5ý+j-õÿE­¥þwjݔSd›cʼSNyPNyPN½SN½SN ŠYí[­u¥Êt£Ê:nTiðû_%½ØN +cüIaŒKR(õL +'ãñ~è/y;Ì&Ç% y÷˜F7) !dâæî0ÕÅ~Ní ÂÎ6½°rêÌ=üwe¦8µn«2üsÁõ˜&£ÛQß1øx5å •{­‚õ7øû`w ÿJÃÆËÚÀß,Hð¼ÛÅ»ým<<Š +ž’ô¬ \¤>ÜbFóÐËfԒ´¥zFË|Áº”ÕÓ¢÷e ®U·Ü°( +‹Ô£2&±m—Ê:¸F® ”6yššŸ0Æ"RyCtÀ éS÷ßFÙ>‹ë\º…íûòlÜõ4ô:¦?U¸´&ÅóáÔu"WfrÜnXÐNã«ãð>ÈÒ(ÜÊWJ„CuúÉl¨…ïØ!hÇTCǝ`¹Úâr‰ó«Œ&›šZ¸ã,™bÓ-¼»‰bƒF—À캃ïGŽ*’ê®»Æ%G9ßÒ¿èÒوÀéòDÓÄxCL—³3³($C`e„Í)X¸-•¹d²¿Ž²¼'©ò«Úš>Hß%$(ÇÌb³Ä¼@Åóû‰WÖXÍÄN=VÕ7 ¿jž‘¥šsL¹šHÝÈ#fIr^¯ÛIë,1oßV Q«šúå ´¤¸.û–¡9‡zèæs6°åæ(68ËL¸'‰Tëõr»yo’õ”Ð~ Z¾»“Yæ1-о\ÇH”&Ÿ4 9­óÍx½cwÕHƜu3“¼Ÿ$^ùµe‘%ëLwÊñϬ>E‘YBTJÆ1s€}¥½îj2’oÄo;ÄávÏêSâ;ޛ([qªÀÁò™o?øFéð¥¦Óä=W–Ê$Ë”Ìÿ s~ƒ!µ] <1˜ªæsøžŠ±HLe¨)Æ9þœ°­îú°õwŒ¥‡³œV ¬ŒÐºÞ¢ƒÞ¤è†y1ƒo©7[e‘G-Æ©ŽÓP/gâ +Êúòe ˆ¹KH7Q¯iù¢Ž}K›æ܌}]Œ'ýýÕqô‰¡ö²{55µ£½aD«2ç¡k–Ót‚W¹÷%&›dß炎}»dÊÍP5žÊMér(ùü9a;º§Û‘Ÿp{ „BO¸ÇF͵¤»¥`cªðš_<7©G£›*eѼµD#ÒZµ_À™q½°5á­¡/‹\!ô;á@óÖJMxiH`†=Þ ›öê¶?ÓÔ. üݸüép F™EáԙE7ÄnÑSÏ~ʙzN¸‹Ü È&fC®Vç«;|ýòÍ£Û ó¹7³_çE²r:ìf%®½ág7HmgkД·l‘$=p]9ß°ëp›LªGÛÀ>@ÔØ{­zöÔ#›<›¼^5Y³q¹³ÎëåÚõ¤rööÙì-RÿÚ¶ã-æºÞ5˜ SƒåÀ¬%-ÉЁ—Ø»%³É  ®¦Ej×ø[þ:P/ù“M¬pt=PQö¥Û}d’.Æ/al ”Xáº ¼KO_ºšŽ“Ý\IðÀA›],(çd±¤:ê7uçÆHÂø6müyTǼ@;™v³˜Qèû¨ÑÀ Dïé7 +°äýíÞó­xÓ££Ò½4$™™þ§9IAÍ@|\0dZ‚€õ2—rY!°mÁÑbO¿WÀI’ßÞÃ1g¸Þ²´‡°f9.ÇÚ-tö9dU¢·z,œçŠ`Á¢G=–Ôöü€{Ë݀`ÓÄlÌع‰ØLLé:"L¶žGxñqs6‡%3±µê}÷ä®VunØåaˆÕ¨ý尅Ð ˜ÑŽ‹Gì÷ ŸsÕ÷†Æ¢Þà>ÃÝ÷ÑB‡/M-H£}jY,óm÷–Zã¶û{‹Âbáz`Ħ˜r°²Ì©‡¤NPôkeT_T;SuCšÙ +¬IéŸT`v~ªH^…1«FO>¢>ˆïæKšªë*˜D1¥QT(-e‘éØ{é›yœ% .n/¥W֎U%lMm—¡ÈmP7ùŸ¨!z/Ž°$.A´[<´t„~> ·æ•J×îÀ+¯s…wèî'‡X!È!ö8É!¬Ø#ÂJ_áq)ãz²h zÀ®bÛ ‡}² ®ÚÊuÄü3Ïù†Î{lÇ܈ý˙œbÿ±-ö'xÝݽ€}ʱ짻CEVÌO&(õ .fÄD \«ºªº†¹æ\Ú[{ÔgZ†{”ñŽá­\'í¯o­)1ŸÆ¡¸kü9aK.•kÿ€‘ïEI†¾Ã<›^0.«ùá!éžKë~ø~ÂoDaa[uFšdõ"qu¯8sKT$&{2éâ|™³8Œ*ô.**óÁåu]«Ì„]7·¿¬æÄuò¼ˆ(,Bº"oÀP–JKeEæ 蛕øÒ€…Ú´j²Y5Ynj›äcVgM‰7æssŠ›+-ìsXñf/Z­”›G¶â­c{û°º–Ϥ…Ç¡…ÊÜ{vßÅà!i̅W~Âìîíƒ7¸†—ZóöP\DO¸·i¢Ö78õS/Z!ÙuiÇ¡´MüÊÙWρžîË3yC qéÁí1­O•?òÜÒè÷v ƒ$^›œr)yÃ`_ŸÌk¼ïn8[Ðú0M»¤XôeÑ°ä=+‹\ÊËxÏÌ÷~Ç=û}öôÃõóa8™ÞqŒ»¶Þ)£ºW©ß®´ÇÏßTÒÃ𰐾᪠ØÃW0"ÞFPZib»6‹ 1Ë ±ÍD5ß2¿Vû~ñNŠ)ÁhY%fèÛWÓ0BD#Ðæü¶pöõ½~ù^Ñëfừ‘/Þèºí™å´]$A‘Û@ V¼Bôx֞g`o")å³á+–4 Ã{.3Ä'ݬTô“GŠÄ•ŒnÓя#$¨š +†Ø î± «>Ÿ5lõLm¾yÛ`ÑWL!µvә_tÙlî²Ö¼ÁL¦†ç öã‚$WýÚ°ÛC/IK(©øcpîY2ÛèÝ&zX¶#ƒx7y³ä˜d`›a¤°ô^¢4õÉíÑÓ €°LUL³!-?Z_·õ~f9‡Ó„:ŽÂÀ¹PËBU˜4t³XŒ,¹-*ŠÀK˜ßa†xi6áUj ˆ²ŠÁˆâÎ[³ÀB þÇ®ò¡ÃԷڑƒ™Ú›…p+þ9XÞ`mZ°Ñ ÚV _ÐÏFkZÀeVcÉPö ·dÔÍ*yücAûþւ¥2 6¾ž ã `°>_€&žõ)×Tð¸8~)Ê͉FȌíâ ƾd~z’jîu8A—¤å)nxivˆÝny}¿ü¤ôÍm잞õëŽñ›0MÀ˜âª¢ñ‡0HSqæë{eåز·©…‘¸Â%l)ŠÎ|œÃ O]®¯s'ÊÞ¼¦ê¼0"Í3£ÎkÁîlE8b⽪ØÔì·`S ¿3H) â„÷7mÖ4„µ96忸„1ˆZ=Tá“øg)ýc¼œÔꎲÍvl¥å7hd'9ë°vùÄ¢þ×þ'Î,a§µâ½è}7ÇèÃbh [³To´Bw!)ÔJ'g]Ž¼.©R´ô +‰Š„º¿V¨o[ÒÑÖ»1­º¤{tó—¬s.ÏTåŽ2¸l¤†|`4¢èZŸ]þ›A›k4À+ 7Æ9 3ù1ې‹$u!º8uÊ©¹‘>óÂöãN4’²,KtúKúÕªKÆB\/¦›qPã1í‹éÁOº2[‡Ï¼˜pͱ—ýÕf³´%Yu©AoFÛùËß÷awXÁôêÔb»ÏºÙ"ç✍4v)þN`Á;ç -]Àé’9Xé.¢Ý8ötC²i½×ܞý)})ÌKe¶÷!k5eٟÏ!’^Ⱥçáì-KÓÂßÿ³žBOÚ°6á—Xš¿oíïXÛI†sû€­ìUçÎ%¿ãµ_ï1;‚*±.[õó^f!1­—MÄ­wàÌɽÐðòãÿô(Š TChëUÔ¨{ôi¼"r!런Vk Eê*{hܘvF1‚žLÍTNry"˜ò!³´¾µc;â1Ömæ‹E;:˜ÔYg£÷ÐÙhl/ÐWԑ?âž,vÇGË}]o [¤ñÆÞ±l þaWRÔkå{–À0ˆx]=™îp’!~’M*×@‰¤ÃåhCá:@l%èvØ°?±ÂUoÓc¥TsÿâÇD@ò…Ñë§éeFÀxrömœÛŸµÉÓ;\hÉ2g¬¤½òs­à†f¨¾bU÷Ó +f¦×iú¹rI­»ù´‚¬7qÞ+"„ZÑLò¶ÒD#©+ 4ñf}¯ÜéF <®…“j"s‚ÉcXñw¤Y—Åñú‡-Ñi† °Õߺÿ¢Z×µKæ†E&P*ËjD¿Ž¬‹Ô݆Ņ}߂Õ{UˆeÍ(cK:’VîuܲÊjTí}ëb“ðÖhxygr§§/»­žNÇ’4ओ ͼ-½6Ýð¯Ð0æ–ÜÈ=w ‘â † ?՘©WˆžÓª°;$Á›³ò ó©#ùj©·I15õë¦Ú]ŸB{)hüZü/—…è{H×W ²anIG[ïÆ´ê’rètöô½Ì"Ɛú‚¤pT3{=Ð62åBܛìQcˆO™A¥ü›ùtI9Ú:7¦E .on®ro¦ÉŠ)㗔uHðç‚"ìÖ½ÒáÁkŒ ¨¸ö.+3íV“¹MskïÇÜÊʺ¾î±5FԛžX]rK·,Ñ:"„³ºU‚%ÃóÀ/H` Må؁oäCòa¾b%«ã|Kƒ ©ðoÛplîÅÞá^n ÷sÈ›êu0_èhI6g™V÷¹„_¼‰1ÏQ[=4,|Ùôx5ì—¼Ë°îŽ^ìrr+¸âu¯üü¶èzC¡;'ËàÕÙâ7”w Ñá¸*­nØâ$_ÛЧCŒåÍrø×Ê҈uáŸç1è‰3Ç07ýћ¢BUãΗo»cTR‘åíÂߜf3kxÌ(sgÚ§F’ÄîQW¥Âñ˜Â®\? ÛüáþØ$ú€*‰?ËÖîÍ2µàsŠŠ‰eûÉàír¯1*]·ýÅùH"ÃñOµ\åc>Pá$hÈÞýŽ¬¢ç¸·> E¬ô¯6îÄJ.×zä¸ã0FlØemW)ä€sÊBWuõ^ãL%K¶&¢”Øq)–4J§w º'»yù²Ã^~D 5,m’Zxð> máúˆGmÉ-´ÝvŒœèt˜’6Z¦ë.Já IAwFb7G_;yÎ_ƒ–Ûã\-Â,ší¦‰ÏèW8ª%u +ìˆ%°9‘žh-%±ÚKnT«7§Òت<1'‹ÙÀÓ¨ÿ "“sñ©ÍòµyCW„ìâ¼¢H±CãrØ«ß²¢ ¸æ¢êb8ˆ¯%qÊ +ýµª’šp]ºáÌäßÛЊ'Ýÿ°v¤¢GêÖ\[‚H9ý"ßè$JhÊ£úˆ—„€«ãFâ(&1»VSéHœwîî— ޼ԻܼvŒž*þU•#¡]f„èRcµâ·¤£mGЂO‚QKZãâ_2éßäKÝ\U(BµkFyne^ðgAÄPöÒÜfz½¹pHx@¬ÁV¤Ñ —h0„z„Ïy^[h£’| IˆŽ XùMƒz‰“=™­ñ°`·\ƗÑSÀpÁÍ zÐ ¦-ÔîÛDŠûU,/¡±f©æÃÂ~NÙÔ +R§r¤…ÖÞË+-qÈÅiÿZX2ëF×Ê÷ 5+/v:cCÖÐlh ¤l)Olŧ:çÈõ 떯íèl(²h"|J¨^ƒ„C`]«ˆ6/;6âŐzZÛEÉZEނ ˜VµÂ¨¦iÞ Æ£\©»Mú×íΐ;‡³œ(Çé» ˆœ4®Äӊ!•”¾±7“%éèp¾èH]³%}q_‰!P½î¯rÈOg:°lYLÑy£QŽ6ÖìÄ.¦—¸Á½;q¨ú€ƒÓc7Fø­aŽ´rŒªY/N¤Cl3'!݇u@ –œ´ªYvx%ʼÊI“c*ºýb5î=-ü³1܎s͘ýÂߦ¼Îq±)-lB|Ê_7Ç Ï1 ƒÔäðªæsè?}Êcú—úÅêmz4×%W™Èrâæâk»ŒËÎQwÛr_U=‹1X./´Í1& FÒW×* D~Èo".a1À!’æ*»AÉ-gn®¾žT5i–¡á²Úìø±8µ¯RêμJ;ÿ&2tן±3’`µ>a!¹àæXû"àGÖæ>Ê;tC(D)=aø4½ +Ö¡¾Uâ<Î^,óL¤x +†Ò‰Šxô nöo“°Êr‰«%%X¨e?ªÑÆ78ÙóA¿G ÔüaöÉÈevAúRË©qgLo¨—ɝ£ßÊ»˜x÷Ánª¢w´ü²ÄŽ´Îó|4ñTQYr [¨@GôAP„æŽ|ºâ¥æiSÅ+tßÿ[¿ "º“¬PË;FN%Ý^ÐhrƒjwÚÝæ'œc¼¼@Ô­ª-wüåUŽ$Ûq$uœ¢/"÷EÆØPåÏ Z …)àþfãKä«WU !üßå/·ÈÈXÜO¨•«ægyUd3O±‚fí¶«ÒtO53>P9:¯7•ÕÄZŽŠžÊÇñ®ÛÌ6z‹‚iÜ]´-·Øœ«[á8lkt4â‡Þ_;ïWÚzè¶7¸fÜ?Õõc²ûð ¼Âä6Þa«å¥då·ln•íÜÜb,/ïꮚA6‹ð¢$¼WLä´œÕzÚW\EÔ¼uÖ+FàÔ}›ÿ‚Ó‘x,´,s¹a +ãOQ§m]}&?aQŸÉ#8É\êá=…>éýâfØ¢2FšÊ2ãÏûæÙü´{ˆ5“ƒ9Ĩ¤°°aӟqhÀJb5EíXÞґÓS9À·Ñ)˯£ö÷þ FÞöâwŸ=¿ãk~8ç`?'89_·BIÀ>©¦3È^$nƒÌ~`6z$žãö‚:'T !îØ©.ôùp¦^ŠÑ%!q–^Ð[cöùrü,¦#o{~þtí—a^ýbø' §Bxº‰?À­Øn͵7҂Çq†²n·þGý.ãZ}ÁÛeü u­^H¸ÛŒO÷‡Ë6¯~±]Ó³¶ƒ¼¸ Éï¾>|=>@V6F½ÁüîÃY‚ñüþÑPÊçØëóޛàÒä¡4{³¿0ª±Ž@Ûï|y×êFãPé/0Þ/‰Ó”µ–Lküuý1k½¼c”‘ §ýVýQï'Pz°Švø.²è×Ú¨¦¾¹–€_¸rw)s½Ãæ +~ Ë}œX‡åšÝ(M[dWt•P²]“¾oÕ$5QVFDSV}˜µÛÆ>ËáÒ22­vqkz½F©šuh«–[Í®,—<žúŒ¢ƒ«.E}.´©¸.Fƒ•ˆ‹~t:Ð"›).YcÝJ ŠÖVWš¸ô„©p‹*Ã҇ —ëÜp´s·Áú‰x7tØsËfYåì–õ!\p¯æ²”p½ÛY„Ÿ<<å|}øz|˜hgÃ<¾û°á!Ú¤úüƒcñm&ÊK-ß}@q•6À±­öï>Ø ¯É»ÀCwZZ2ؕ¼|°þätãO¾`Æ¡TŸ0²Ä çé/ðR —h a R‚üíà¤+qsIØ9Nªê·:mY-FPöËY¡ß±›²7[võLõìH˜gÑ0+V>iéùdôÈ YÌÄSp§ñ8ÆHõ<¯Ññ·R®u×!‚@C̜«²ÔOli`ŠÛϐ ‰EOV*Qke9Í;ht›¾¡ Õìü;¿Âk.HPŸ¯õ1ď9ð•IÖÔАùYüì•}I>`f=Åï58Væ> I ™æ v?óJ1‘t:B™¯U¿t˜Ò ¿·™ …¥ÜWæ+yw:ULùfU›ö´ÏXP]x5rè~UC¶dÇ%–ááû:[8cê* + 8ÒY‚Ð/!×Rüâ5|Õ÷ʉ¹s(¥Ók0Xz ¥½A¿—œtû‰÷wýñ‚aRÕÄë=:¯]_Ë¶§â@2[0¶ã£×vbé›W'i*g¬IšÆ*ƒØÒaÖuŽÒ¶ø£7 ä0«í ãb哩±t™8§8TPMutŽ‘#§åk48G¬ tcœLO¼9ÞûÃ%2¾‰OiÌÖĪ'S?_%³.·Û]Wy#¥‡Eæ7ˆàL!¬ºË†E5?¦¿À%Í¢ h¢¤ncÙýòÀ¶zÐÖßq9´1v;øŸôu3£ë«ºsŽH⥗‰7Ϋ]n«Å=#p¦²î.MÏRÝ]ðJù@€Y˵ìB±ià8Ò 9OÆ~ތ߅4×ù`qäzë‹B×9ƉÔ-Öah–‡écÆ%›š¡Æ +J,òïdž¯öÝÜÌeʓ¡š[;57%ˆsŸ¿°íîV8F~…W´ 3Ôù +¯Éç ÷*XØÙØ:Ùð½ +~KÚV]O¤í ×(ºi{‚ߐ6¼ô’Ô]^€“üÖ#ŠO’;»ËK³,a°íì9B0âéà©ø¯Ûô¨¨÷L÷*"½|u'þ:¸¨5i+* 7XÒtígö~ç\Ò)fdëÀ·Â!·3Ž6î©:‹g´¦.=Ôô’îL×oMà/¶øÁ)œý³ë»÷ À‰<áŒ]+´ ­9Y\4’:´m¸´~,¤G—:úi°Ì: á!3>2nÛYüž&mO:Çýé¤sܟNúå×éã×póǏ_ÿ÷æõ²Hôèv[{ã†/fa›û{5è¿ÒÖ__ˆ·…ˆª}áek\µýÁÊý‡¶þå…ÇÖÿt!ÿÿ闿ÿÈÿø¿ÿï~ùïßÒÇýûÏƳÇõLŸ¿ó™~ÿü×͐{ðJÔÄ:xl¹Â&e¶-ž‡){ªq³žúï!ͨ¢~™ŽdíÀސŸUsã)òB)ÈÎÖTÖö,CÕ»ðí`¢°þ–6?vðmZB +ACœ4lТÇ¢Ðü&ЧêIL‘ǁxUrJ@”´—%žžQƒ+©#µ\øg¢"fó÷e+ȍ1sã¡ºMnSZ¥¡ C™d‚\o£ž¢$YÏ®B¸ê(lgKpšÖrlWÔÇ`Tª!qÆùJn7Æ5S•Ÿ‹œ‚=‡æj`¸g­&‡“ÑPÍ Ô;šz¦ ²ÃaKm±åLwÖI|­…oË.žYªŠÇÑópÄTv²ÖÃRçñME¯ ly ¶„xëý¹]fx 遲~Î]†¡ðÎå‹Qç*îüõ#ï‹°LÄlیùŽhªÑ峪äèReWÙ¾«ÅÈ&µÛŠá/µñ¥îÖ4­B&”a¶AÚ«TI\ힾ喾å›ô¾×¸f7œ„Ó²­\4·\T2÷žÔÈúhT݈šóįÀAAÍ×%)wfz¿…ÿfMÅ}Zb][íéó$Oaq–ˆE°tT¡óPTæü.©öƛ%&ÕB],ϑSD{Š‰»ô[6l…Ìi·â{[á®H>ì#îm‡ï Ä?›Ÿ'û®R®RD¥V+Qã9s QqáIñËxÁ‰]`gióWøBËZœS®L]Á”–£¥ZÎx¨åòÞÕj5ÑXfBÝøýäHʌc>¹œw–8ÅôÞlJD¬>÷M÷yí¬dà†üFR^^T43Í¥{ç*T{ÐÏå€j~!ìf²é„öÛ֟9eá ®:U³†§˜Ý²és_ŸÞ«/–y›T–Äo“¨Êâ½æ”s%¦0×éԇ"?²á2Ù5"¼2‹[ढ़SÅÔ:4æfQgŠƒ‡½˜6• ä‹dW!LÚbíŎ0ËïJ7Á$qAËKŸÒ–¼ÑÈÒ R›;u5ª6›·ÞOõ>ÆíóKÝ4I6qÚð‹­”æe:ÌS¤AI’H½Êdí"ÛþŸüjɕ#7‚{â]@3L2I&÷†gã}ƒYŒ7/|ÀYýºûµi `lx!½b‹Ÿüħ±?6¥GΣ Š,’ƒÃzÞÆмèª÷À:›kê·ÅÈe¨dÍ&ÁØô…‰3¸¡Í¸Sä °D-¯¯LÙ’@ÅG˜I¹¢|žþ½0>~ +`Ä7ýRžl>jÊj‰\m…(Ózö§ãuf¿€tTý͐¬qAì5Á)Jò¨(ö뻬LQ—ž ™/‡¨S¯{68‡¨·«üǁ Õ°Sj¯² åU†Ö I äúš½ë&JÈ!ÍGˆm|K­„ƒ(–pr\ÐgÝ +ËcºQŠy>/5Uày·:*¾y†q’æüjê½ð¨œ¼ŽA¯ûA·H>gwgH³¦3?)\öowC¸Ú¤æ˜TAT?ƒG“ˆ†ú–.šT8 +ßãW«"'Í»°7p¢AõbˆWð.¤ÉÚ ³fvˆ™Ðë!¢ufxϚ‹éÚ/,1ÕAÉ¿{¡ÊýíF´‹f§KW9ý„µ +CœØºÐ5d•Fq®]A¿ÓH€¡>ç.Žë„&¡ú.¡.^a¨BH¿©'GØåtqyÏzéô¢æÕõ®¬ÐÒø{]´Î:q¹KT&Åe?"'+$0Eå4ÊúvD÷JÞÕy+¨˜]É,!‡¡KspÕîçªFƤ.µYïèÏÖKù—V2ÖÊ)ô#êåm$\éhqå”Yb mÂÑÐGk‹JbφÞV>úB{vq){~xUÌd¯JGô~õ?Š/l¨ÚæÈ'ÐKÌ¡`m.HÖ¾Í ͗SæW u +¬{¶<£sYÔú'tòïŸÊÒ éNt¡88ߜ]눤±)ÍÀEdÎÄóºÄÚÉ{ Ò=¸™J=À‹(a.Øè«ՖÒOÇ°¸ æ¤6w«y¿ËGë‰IVJÚø_Å÷Qœÿ}:êÿåt=I5αøCz¥ß›/$Iß1eTdVU«Ë z³›½ËeT†ðjo¹ ì","¶iNßDU»QúºÐªM¡É€DŒ„GWK‚Àâ"~—QܧܓÕH'çِ†‚þú&ÍÔü>ÔM앚[–*\0&Èt7Éÿ£ÍŠ&‚ ×eD'¹ÙE(FȜì6@Jè-ÒçrPÔ!æúÕç”|4ž ø:Mg0M[JY4+g±]6«P¬ëzS\Վ¼—+àéúdo¿¨–H94-dévˆä–Ð|6D^<ږöÁE8Ξ!2%°ç×ÎEÎDq› +mA¢÷Ó¯D Ý3®ðp8XéMù é{a(åàqËSëhM̼áÐo:AYE9k+žÌ.9g#ÖÐuƒõptF8¯#FUª4ZcÒpžL4;ÓOÉ¥PgâtÑxˆ‰ [‘>×´%ÈÂMúٖRº¯báü-ÿýòéç_þno¿ý;Ÿÿñ·Ÿÿú»¿ýå__{?ëý-WYæyଦ„_ Ýåʳ! ?§°Î3M +äX§àÌ Ô8òOžUßtgó¶ëá×O¿?|ò´Þý^× +‹Þ†P-¶Ø5þlà‡ÌXV#;OÃ÷#^ïóÿ¼€¾Í?€v=üúéá÷‡Ož|Üïá,·C>7EzXxVtGšOÐw{ÂövEG 7‹™ÜšA2U°¥‡©aBÎ!}ØL¢\6Oøl;KÔ²FHzõKú ¿ût€OÑDƒÒ†ƒ“ȲfÔF´Ò˜ºd±¥¯Åþ<¾¯½?>Sç\ êɝ‰=9þ.T3¡˜˜kЩçÃøs_¾ÃŸ³3‰~Y±k¯?؝*ÄÒç6ÕûOãö~™ÿ°_-9–ÜFp¯Sô,ñŸäÞ°6ÞÉ7hÒ¢䅯d=Vÿ4’`¼˜žŠÇ*þ23"ò,Àràx§@Ïq{S c¹§ôË0ø²“LǪ\5 ´vµ’Vèm$¤F÷µÒ 9í0¶IíÍŒ6©9§@½ì1­¯4ÙÁӅV7l'͓”ÞÑwµÚи/öؼLÃñ(‹Ï¤šù­`S0>J9׿&Zû½•‡%iÁ‹³ô8ŒÿêíAQ¯`}„ºÆªgލæ[Ñbd¶«ƒò–b·Éð^…áÀµ´üòÉ|Jˆnh!=ˆF…Ídܾü/?ú+GÄ ¥âºË—ûÙ$ˆ°ô³fZóÆY¨€@-fÉ_6Äå˜ 'Å0p¢GL*Bs{Ù¿ZÂ~ „M“žº© ëPS´ ðqí²‚½e2\&¹¶¢OOelü²±Ãy¼hñ/Øê +ˆe2ô²ROAž-áý:Q+ô<ÂÌýé<Î~¶ÒY¼õµÀà§ao¼œ“‚Ÿ¤ËqÀ’û6ëKÞ$÷aÖeÝ'Ç`€±Ã6ۆ/„y¿‹CŽ= þ>–HÛ(c}ìj<ÔÑ×óÎÓó”{†# +ŒT®DYY7èllD§˜äòZV'$³Ê‰PÂ*y™!sžÕ—díxÒ¯†êÂ{wæIÔ¶l]‘£í`ÂÂ>-"7ù\h3%÷OR&ø`õ:£l€¼Ö‹{ æÞÖ<2hM9íòùD#¬†ªÊû5²F!òê—ðN¡[ö—µÃ2Ëc¬É\·¡nD6™4ꇔÆáÂhƒÁ=á¸RžºBÉdrL6³;Aß_ˆ«J +pÖGmp¨0… +쪂ˌ·i?qÁã}yA\ä›Ø—m„@ˆE®Š f­àõ’dv?Ž/‡„oªA2.9ó/N2bf^Fïת`üc ôI—èö þ¶8Š²~í;ÉbûJ峛òÍO•/ÿ·•ï¾-u¿Eøú)|ý¾~¾þ©ðÙï>ûDøê)|ó¾ö‘ðÕß'|ùP¾úµÊ7?T¾áiGc5'³êÌz(ÆՏ€¦GJpÜa%Ãϊzs"œóªHR0f\íöØ}—=¼ïx d°P,o €–ì?RÑZ0fÐàž3]O?¿¹ŒéžÙ¦®ŒÛZ¿Éý¶O9àFåNåNyßöëÞ÷s÷Õ}Hv£»Q@}E7è'”;ÌÓûÚé}íFvQÀ8`ܝ¯Î7ŸÎ·ÝœoYwØøk¼¯ý›½/]áÅå›ßþ(Àü.ïQ@"?áÆxu™½ä y¼f%kZTXå}Cx“•v9 ˆ0ü”ôM—ºr(jäVÞCÛG'§n„Þ«Ð8´*ÕçØÌ4Ô8°@¦⋀—{÷äð^A·ÓåD°‹H§I¥‘ +¦BžžqžÕicO0•¼:¸å@§9‰±jd~a,¬•,¬Cñ$³±T3Ӛü.€ü¬zðáý{-¯PzØ¬¹ïƒ‹\>²ùŠ1BLOä‘S x€ÅV•Ýt‚™â‹uráM«†Sgå¬åY6Ò¹Z;F[ևAu¬ÓÒ·1¡4žÚ +‹v؉֌k%vKlŠË+ˆ$ +͟±µáç9IBP҅‡øªk“º–„£Ô z«Š­ü´}d.m vÝ\Îåñïv«±2–.¾?Ùq‘ÛoN%ßÌ3 ÖÌڍ~©L-®,ðÒ즻'- o6бÆ:‹œ^*ü>·àùZjڙGâØ=š|`æüü2uèÿ1Ý$)F)öä)È«w‡¨L%A‚a)ZÛJ[‹x\qZ¢ãþb!ɛL!G}9µ þWõ_ߌѵNÕ¹)^˜`\HîWï +DŽM\k!—¨Žb!°9QØe ùH-µT-Sðž‘â"<àxRkI‰…Û­r uâ™µc³B" ƒ˜3-r*ÚN\ª”ÔØÍõ¾‹¬lÀ¥(ÌÅŠ +Ë^¨…[3hˏ1ÙÊÔÏçaÏ:×·ÍTÞ"x‘öKpÃÎîBZŸ~ùÑß9MÚðÝ$ÈX~žzå %ÐÙð§7.ϧ§y‘Y¯P¥R&ÎöºT§ñxùÏìØéé=9ÁÕïl]'NA@þXE!Ø7K!&»b¾Žûç…;ýº+ƒŠJÇsÎʂTHd)¯1PšT䑰Ò,‘ÝT˜l!÷´.€°‡!¼;©YÐ +î·nÎ^ê'Lx¹Ï±Ù ’žY­xq–(ւƒ­"Š2yÉVðÄ+ÈOÓ­hD12Å[ü|¤å†×*’W‚DÆųØßj*l«>½.àˆIEÁ" Ǟ9´„(œš* PXú6âµD„‚{¹,P3TÖäs]Þ@Ö²fÄ«tÚSÃH•˜&Ô¢V{ŒÁv¬¾Ÿò^§;7i^§é“…«Fƒ¿BݗÑ\ŠŸ,_ú‡™˜…~£_6‚µÂsÍ Ùï¦îf€fÕP&v‹pÎâXpX Ñ¿ÚÍ5Ùg©Z—¯ná)ÃAFrA¬ÔhÛ-KdVxü²mýº±"çitáMÎdæhæ¨Ԧfn–.ã"P¡"Û£–(¶s#…¡—cÔÔ@ý¸zÉàö\d4#`$ì¸÷¹’i—?áT«—Á 5÷m¼à7é›U2CxÔkÑnKYØw²¢´bõ·ýv'=qºÚ#£{ fô„qͼ.¥ÇF[ðîÜT¹%A⒀® _ç`¿óåöËðzÄ IÐf&ÄUmüÌ%Ð@œo lä˜`c,¡/ö/“Ç&»Ó­¾è։'[þ’ 1§8`ØSbï3»ÖÜö~aŸÊ—Èõéõ¹ŸïâhÝo½¼+ŽÿW˜ÿ9…~ÅÉÒ؆œ±Ì¼vÑ!ˆž›8!·ÂHUE¶©íƒôÓÄ&³ÔP¥¶!)+z´A²Sۃið÷±Öo{ý½+I@RáÄàsÏÕ !0n ¾9¢n…ômcûõ%²ÏÁѕ•ÕtlÊDTëP‡úÊU‰†iX§ïŽ0AãD¢)µÒ¾¶‰gøkÐ0eœ½Oô‰üèË +´Q6ð²^ Ø£ýìéÛ2µ1UݛôPÕW%d5ªçÀ­$»ÚÎB©ñó–µ£2ëc¬áÞ ¸Éf–gàÕ¨ÄZŒŸ,ÉižºBäëbn ©dˆ©Âˆ)`ýà>Ç£ È*^–ü[f<¿1ÉWâ%¸º3ƒgܙö=G{¹è”{‹¶b» ?˯;Û VYœåñÛãÕÛÇä{ÁÈhTuïÚÉ´±œ˜Èl?ïÝá¼Oñ 6¸FœaiGÇïÇ·™Ž%Î¥÷Žâ}‡?ù¿ï¿ùîûòÓOÿðç¿ýõ»¿|™OþûgãKãùéŸOG$Æ44¶ C|Ô+ý[Dæ_ÜWKŽ9Ûû¾@ +ýuŽ>‚Ñ@/¼šû/&H†2•ÏåژA÷¦*™Ê§O(‚dø)–Gˆ]hHÀÿ’턬ú¦ýêõ [^6ÓëÁõî|ÿøÉc¶s½¸nå/ßS.¬tßØðËë¿ùLhdm¸‰mÜÜ£[¿ýò­z@q0þÿüá|ËïW| æÚCZ豉kwØê\9Õ¡!,NÎÎAwA%¢EN“•ã! ùæºPe;­\ªæ¹áEi J½N3óëo†²¤øX·¿ûÆI"/@uÐf/6•ÈYÁî†$å£Ë¦Ð.É5»2õ¯ðµÁt>&ºÁ—Õ +7î*º@°½œ!óKLŸö¿evãägëŸ`==eѽÂåZßÃ(!x¯¸—ÇçO˜^ra>ŠÐÒ;UúøÀô’àY©£UóRP*týä̙ç¶}“Z5ØU^ä †í³n8_rœÙ% ’¹ÇÈrž¢¶èÎMÏ568Vß4ŒØŠžlqÆT9¶œÐüsy1h–>tvo¢ñº=óØ0@§Ø?\05¬ÕkÈ' ìó“ÊgnËƱƒb×n“ —>i㤪ȖÀÎê“rÛc.z a—C°}óØl¸±´hw­RŠK}Bü¹à™#£5šñ²œ\_}/Ñù§ÞüüqÞ}CX|{^}‚T4º +”ŸaȪç@W6FÀ/â^SD b~c?ŸÜ p’¨Ý H‚c6Ê~hF<`â•Å¯Pò1¹h)û=ú$)фŽ¦“tî-’ÿì+êd‘W|%”³Êm°jŒ¤ÓYóà(ÌÌ-Tñká»Äw9ÍC5^X`€ª}KÛo—Áõ;d°ÿkdpaŸóÁñml§ ¶‡ ¶È`ù,?-ƒó”Áÿ¥æß ƒÍ×}—Ù=àž § ¦¾v£2(•è[ò‰F° +74:h0Ññø™U*‚œ°0ݏDzm¯ÏÓÖ Á-œ‘ ¬ðÈQ‚°R¸´±öŒ6$&MÇÓÑÐA)(\gì9=Ê¥þ’9?à +U4`OslÁ +õG¬0‚ê÷ÌqÿVÈVÈ/¬ ‚Qsے(¥±Y!ÿˆʃDy­¤ÐÁ—')ØOzc{!{ñÆãozãúkÞ¸>9¡ŸœÀvN±¿9¡üú:Íqý+ôﱂÛ*ó~‡ðS£ªG}¯ò‚¹R®+ãY¸'+ª‚¤"¶a4–ÏœJeå͍"ÇÚ1:Œ²/ušô;¹dL¢™ Øy>÷Nç170Ö +?„9nص‘Å_ Q˜*¯$/œiæ{‹¹…Ñ>ö% ¯;qãðë|ÖÁmÞClº\B©˜%|E–Z¬/¨˜/'Iè)¨poÞ'CSó@¯½ÂÙaU·¯~}^»Ü}ѸçŒÏÜ@uU)v'ñLY镍×<“˜K.eLÝ3·:d!“êkl.È:UŒÖ¥iD%]·½FÄa,2Ž‰`§Â[҉ZPûé¥ù#”ð+F& áÔǁåúIקúÀ3ˆ‰kË]Ô¡{R‚!õ³fÖëùÚQ‡ —0>õ r?ª­hÛ|ÕMXÑÕi´Ôl<‹Õ(°%žBŠ²!G} É<Üx¨RÕ>Ê\õ’7⬵ƒyêâ¸îÐíÍPܤíÀò&éYÑC¦a‰|Dš³ªÑ!뒴q-µºq6AÌ:Ȭ¦ì’|å¥[étb¥]¾¼Ô>G«â·j݈çÏ"bŽâY´#àŸX|ËyR½3 +`(bÈÇÆ`K¢[¼lۅ£`Jg-¶.‘†¹‡ü1`Ÿê,*eçO+kZŸ$ë'& ²¶ÇŒ:í£óUÒp=á7hhY¹‘bTcøyWkYtÉ%$5õUmlgÙ±Z%w‘ÝÔۍûG¡ªCA|y¦Åæ­Ñ«/µU‰[ó5«?׏ÿùÓ?9 ÷ï>r"w}]öömkñøž-,"Qý¦_ ‹­_¸ÔÏ©ïEøúøJøâ÷Ó7L¨giyï:x +Jbܽ“=a¨ÆìðÀ&‡ +nó÷%ï!tG1Ô4U:ø"7ôÌϚ_Û†¯J“‡1ø|[‘?‹Ó…F®ÁsÏ~´]úÐaDB$ïÇK€3ëû€©a½ö€–oè3r'CíÔ"‹·Qºx¦dYSäå"òĵ&iK3€ +&·=†RD8–$*Ü>œ¬ÒŸ‹uØ0¦€ê,üÖµ6” .-äêP\˜ÛD3%e)±TlíVNN‚Ž²åv=OËüJhY–È´…&{ ?e+Ÿ»…e%ò¬£â³k³$Vï¤â#^à×Xc7‰3b#Ø¥Ó­bÅ2Âód:ù­”4)Ô*mŒ]Rëñ ±êtg¢ûNâ3Þw[EŒ#[ÍV±„O/ä/“di—¢ú Y˜äýÜøo´­Âi;Ý)(A¬K’!^J²ù@ŒmË^+"u@dµï€mèæ¢?Êa¯btCÜÕæÍ^©Ä9bVC{?ѓPù—ê^]jŽ=€tGãG)*íÈÜ°äL$I¬üñŒÖª€ÑɅäBÎP‹[H&g-Õ¥f6­þŠÔĜOδQÊ숙½0V+{"$Ç0m.íhÓ)(ÈôÒQŒk;§É2«§y¶Ýo<’0l/&Ll‘„?s‰’æã‹Úæ1ÃÆZC¿Øo`&¯MV¿zÁâ¤M|ý ¾ðƒA÷ S=¶$üùýéýÅ}Ìö„ÚÑ_Oí~«eÍÿ‡õojP;5hþ} ²óñŸ¨Aö«ԋç–›Å+4q\«.Ÿ^Ôp%Ý\²>¶»Vó3¦¤%w¨^hÓÑ­¹á—аøòe{¬1ï5°º7€mÂ€îԗBã4¢OBû!Œèyv;ªbûäô† %‰°y ó4ǏZ²¡Ž‚ètk)/嶓8\‹žv֐8Ðrð÷©¯’;’#vï¯x? MîËÝð\|³ÿ á$°ÿ˜ Y•UÝÚFm>¨U|Y•[DŒÀÊÆȆèz°ÍîõŞ a6È5ç 4›«z·:OÀø:Šô,½æ$¼pek‚jRJzKЋï?5?­ì²IڏZez@sîçXÕ{Ô¶&ÝCçCK¯®j”ƶƒ tQWßCâ)Áø™ì2ãu j£’{XiD9hª0×Lwá€wº¥ÇóË(ÓÔÛjoZR ðžÿª$Üa,#ð‘.™‚=1¾” þ?¥Š´¿~i_D_l)Žò·s~"Q¢XÛtÞu,°ml0¯Bÿ +©ÂÒñ,ºýßðñÜٱȾúÚÔq§¶Íßí߯O¿üú÷üøý?öü¿ýò×OƎù×ý…¸¿¿öBñŽ°å`÷,™Æ°˜÷·*홝rҎZSØÒúk×£‡Xxrÿ$NK7|éÏO—ß/Ÿ\§ÛWZË+x–Ù"Afêæ-ÛÂïl¢l‰»1D9à±Á5Lù÷Oߙ6W\?˜ªÛïuA~2ük¾5¦Õô™ïäØâóÓo×Kný…Í5‡0êçhPȀrëÕlÎɓ‰Íè@-æB{»(ŠÀæ9àï?¼‹Ù®’bMIaZ_ùÅH!m?€!Á$‰´Â/ü,˜WãݪI§- ,µ&¹­Ùí"C †óñÃý²Fə‡†Fcïæ,3r—;0³eäwÇïR ë +—çØÞÃÅZºFö +W8ÍXT'{ððW»Ííõ+ ç!öºK{ÝÕW +óòB{Q˜–*10ìF¼ê×}bÜ}bÝ}býªOìŸõ‰m÷‰óÇ}bÚ–O,Ê'¶W}"7½yá•#[ª0øYds‚¼²—¬Iúm y V-É.‚/ÓY™oÁ¬Ü>Ê#ZÜ( +Vï?.HkօSl¶£ÉrSËF‹mí¹<ä•>9b1Б ­aº²æ,Ão¤Êž¸7šô A60Ù=8z~¢™ \Øn¯ùîaŸU®«³ÍºVÙ\6ÕZ®ý¯Î½®w¿æÜëîÜO[cÖeÌÆÍ·‹oÏߞo¾]ž¶Ä‹o—å cùöø5ߞ^óíe÷íËÄË·¯!ls|Í·§‡´róíõâÛÅe3Ý|{ú¢oÿŒqϟ7îõ Æý{{£s/Wç^¾Ñ¹+Ì¡ºqgyñ¶ß>—ôx™ûÃ2ÔýRel#–k ۝œœ €çЈrå9"ëqb£3>T&à ]@a!á“Rt¤ð£ŽöBó.ìZ×¢‰·vnaìÚ[ÌP”|äáR¨·hKT]¦F@ °ÿ2-U€Ñ ¥ˆ;Ì2vøÌ%rºŒƒ6ŽÏˆùõºÿ€iƒ™¸8†ÎÇi$þ’¬ŸŽ¾Á”Ú¹!Áç§sÇë…óDÙôýÌÏW¹1sft7xe½ZÔvâƒ[2‡d¦80z¨Í VÁ;#šËL&vÀE½ïÙeNßB!ú0¹Ét葲?/:X#=3Û:{%lÒvėz‡¨gf@+…†$‘;ég˜|–4 <‘Lšt0 /ÅAŸÓ§¯­gn‘± 9p +äÀÝ¢s}GR»á+Tzô õÌe¥•É(Ã6Å:«º;&éh!ŒP¿3q KÆ¡;K&’o«= ^ŠNÍ%2;qˆÅ­ücµm!)_×¾öæÚ7ÞBûêIûÒEûÒMûҏk_»h_Þ´¯›ö•]ûÊEûÊj_ùsÚ÷3¥OÞñG´ÏŽý~Lä¾}Xvé£%¦+퓚²7*)î°;¡Ðçv²á,þlnCV·ût™i¾=f#’éö· Ñ<c¿À‚žªªáœ®¾6ád¸f ÇӇWa +l;) ¸éíx }´7à~ã~átátãüÜ¿ÙçïôÀßÅñy Þx ~‘ÞÔ' Ô· r¡š†âƅ{ҝxÛ´ŸŠ–B"–õ°è‡'qªÚøéçœS-ŒKóuri”|J¯ÒT8j ø±·n\ÞG ¯ƒñ%àÁ“ˆ·ø_Že-Ô2ËܚZ½ÊIB91Ò¾oL©7…cç']-P“v²…KqùìDmÚڈQ³i Þ3’ÁŠ”·–ˆÍŸfÒ:•Œ&çPؒ¨tb]c‘Ò¢&2LuÂj-+K"U@ÑqÃçM·LgՖ +9;$'D +ª*7/÷ Š]q9unì0õŒ“PýԄ C•Ð)ŠRíÅV)÷úø÷?íÝ£ek÷`+ͬYÛ¹÷jÉö֖aÅãKˇ§Ô§Î^ì7hŠj $3š»ÁH¥=^¾AɛǍO/ f·Äϯí]GÎ;¼cÐå]Fƒ½ŽõHp;jóGd~¡3î±Ð“K¾¢?óµZÆ1Ò9’«ŠÇ枞*“Ó¹ÎΏv‚’¼+ôk‡8l‡¼&Öòz+ÍaL'´¹“î^lblʞB¾˜X2 .#–â$ (ÕFªk e‡;œÒ¡ÔvØT¥úDØL. +—Ï_ÆsXâZ™! ³îl.Ïè’$HB;çòÿlÔ"Š¤ÑUÔTçßš1IÛê5©Gè,eú­Ò‘ž-º%ê5SÐᏇè#Äì@O2ð±ÊjÆ)@WWCØ$Õ%ž%9¥&t¿¾Lgä–á%–ÆCGív@‹=—(]n-2Îuêø]f™_v÷­ŽKª0ÝcTñ¹Æ¦37;Uþ׫s»ckð¼¼dëŠóº“¦¤XΈ×ZӂǂH)2ÂÈ +"@ììdm“']ÁrE9t±|ò++Îð­mƒSê\ÃT¹«a\5™Ù†„z4såz‚ÇÙÊEv4½Áðv ¥†ŽG#e2…zÖL +Ù+¨Lu§=¬ iyáDƒ¤¤îŽ˜Ôc€ž–„4º+?Ä¢‘ô®ÛúßÏ®A®á÷¾!_YñJ€ý½ýL«éµØɱÅǪ÷¸B†ø¶çl-HkòÙÐÈⶥa°fއTY¬\Kɬ«†çn¾ýáS./Ðüâ²ÇùÎ/~Ùíòhånä"°xåkÉíxsQT]}aI/k½’ñ±ÁtÅÑ}—_Çä*ï*éMB¿«²Sù̬6ÿà#þdèµ(s÷qî/0¡^®™VÿeÂÄàÛ#nÍËô;Lç!®÷ή÷n½s1¯,½¹˜›ða˜uð±é³»éËWÓ×®¦¯ý¿š¾ò•¦¯þ&Ó×?0}õ‹¦¯Mÿ‹© àŸ“ó9Þî\]~›îòûŸL·t¾ç²q;¨÷,×çi£¬(Wcü¼!íÖ¶Ü/Ø÷%L¥š#þn"Kô?¿â] Ñ˜Z»ÀH}s÷´ôª^áwO—¬­¶Ñë-ÆÚøóƼ»‡±; ¼S H_f¨/µ¥Ea•+aSåjŠê ëyž7ä<L°ç5-Ôþ£oÿ†ïšñõ®ßÁŒÏ3>of¼ÜÌxy0ãõ3>Ìøú¢·ßӌÛWšq{0ãö¡¿»ñ²Ýxyύç«Ïw?žiȿՑ÷ïáÈÛ͑׫!ŸÏ·úxSý 6´÷÷dÆwâÅvаÅUeC 콤NTO’y%¶ºò³. +(C!¨¼‹@x¥VG© DbÞÝo!ÉBšÎEq;·0¯êëlóâ§Ø'y1ÔlçÚ¶SË …ê'¼þâZû \½,#ê“x\ð+×H·¾&tõø‰±†ÞØ¿ QÚå ®3¢ŒRÚo¤¦Ö3w±j¶~ٕðëÓ¹ïsÆ>W“~8ùë]w–ëNíÆÀæ¹» \C’I$C嵁ÓDëA ´ iˆçÙÂTY˄£½ŒúÇ留x +J°ÄX´P'£Ð ¸š”a–ji ˆ{aôÊq3r(} KÐKÄ'²±E_Ó1)O:Û±bm¹ÅB½¯béÆg¢~螃óJ;©½:”ԘËJ4ù¤°×\b +.d ݈ h%œ&p rÅ,!d‡¼8™¼ÓyéÓd˜¨Tuj.™ø“ûŠC4Y`€yǗ4°w œÿËh7 ´ ´ß¤[ö¨ý¢õËX?ÐÀ?˜ŽþÒ»͒g}z +®˜°Œ êXԞT¢e±+Â1@t¼_£Pð3÷)Û;ö Ký2,N&+¼p['M´¨ArÇ +¬¦ë8(žsŒ °`,ÀýÕtŒ~yéåím¢¥êY÷s}?2èß@ý;Áx ƒq#»‘=AùÀ¯6Äå÷4Äù+É ?Aþ ¾™ >òÃßÈí{pA½qAYW2Ï·òxÛ ¢0`'ޒ^”ŠÇµÌdõ%Û*£Y¸¥\Tÿô©‡2 IE3¯ÃœYuÌS§( ö³,±vy:2u^e8éqà/H,i°ÄŒ ”Y6}Í 2=%'®Þ«¤ÌG˜Ùÿ\`ªÌŠs»1§#.BæÑÃò1ى۞-Æ:w^ç£JËÓÅ¥â‚Ïm­ŠïÈ!yÁvY]'è)hðlzi(½Ço³ùñ`Áß:é‘bdØ0ͽ’ÂËäô£œ˜ +Ë23<“K44¦R,»!Øt±Æ&Ӂâi]œ;Å!]y^#N6Ù)‹G§B[R¹ Vc.1SÎ:.ï#N,€ÏÒ´qÁòødéS½á”ÀrŒ™¨Ü”¢.=DA?Ï/Î Ã9‘7ôËëâz͊ézlš%%ÑÿÐYºâ"{Ǿ•;ܖ™xºˆàÉ*œxèŠ.}Ž?õbñ«AóñÔ¦Òυ‡)&Ñ<$í§¡±Š ‹þò$’ÀµvÂC½¥Éo®¥F&Ž%ˆï ’i–~Ʊl)¨5üܒÛ.l>ŸVƃ &àÉMÔ[ã>+Z©^tïo5•IõôǨûqAÐ>Í΃¯ uB]êÉNÎò¶ÛFíÚÚÌÏ"–Ó–¼WTÃK x"÷-Ó:ô9IÞ¡²3ÐÝÉm?˝ÐÈ1-(«'Xit®¼ÖEȯwE™Þªo•J ˆ: ëÂfªÉ„‚¤AX\Ž4¹ØhjŒ“Pÿd?P›£\÷!¿’mÅ©ž÷öü¿ù”«Ik^\0«£ù¼vlæ[ëÛ´bøÖóaVû,‰©ÐEÐëG"ç4÷3¥ö˜ü¥o‘6ŽÞs˜ž‡úÞæuæÄÃ//0davxÛ܎÷³ö(p´Iîóž+¹,ǘӚ§h?|RšLô‘r †'ijÆیS€"°K‡[¥µ”æÔf´è¾Bo˜ä—á&¶æCH=: F®K”.¿–™ç¶tü!»œC)_­žKD²Âd4ñ¹ž­`n2¶5þ-¸=°·xq½dìjðz¦´XÞˆam¶á± J*@¢Œ0³‚m(iÑóX8§xº!’Šrc¯$x‹Õ`øÞ/—ä¹¥¥ë®–qßÉÂF$µ£ƒ*·¬<Ïf.³¯8l©à* é‘É°BªPÛZÈ!×+T—Ô´V ˜'2Ò¶ÃF‹¤ªXÕ Ï<Ÿ£4l}(¾±²is „ÈÄ‚Í <dåuù¡ú_@7€>$\'|å÷á1Î …I9ß?1ÐûÜÿs‡ËÓ2‰Í…ÆÞ +u͊NWêU®Þ«­0¯2՟W®ËnÜT‰ÑÈ4S)Fª"ÝýžõÐ7­²ˆsd•éªJJǓ¦I2ãÒ5ô.ôäjŒfílÆD7§NÆ#zÅÖB¦N…É‚v$5BvÎ)NZ aW ƒÞÐKmü‹ýjY’ã6‚÷ýŠýR(¼ +¸*ÖÅ7ù²x ÃòÁ¿ïªÌBzf–S!{©9pÙ9 +õÈÊzw#—«]ÆIð|«-óY=î?²bÐ3ˆ¬‘‹P3bë_d4Èÿ£¿îËÏ;퇬“#¹½à-ŽAæBw&hŽRcÌÝ(¤‡Iðžy å~Üö»G)>àãŨqœ±Ÿ½L +wš‰¿Ú¿Ÿž~øégyþõ_öü÷¿ýð׏–­ùç'äXp¤uG™MÎIÅÇÎ# ²Ê.1¡ mx³þ€íî|Š‹Å'2-üËx°æ·ÿ~úä¼Ý~Ò:~E%óèFMö…ßØFÅè\e¿àaàzMRä§o, ›» Þ=~Ç'3> °ö[ïxÚɒÃD†Ižÿýü=ýþ•ùúýÓϧ”Öl¤Fçè®../šÇW$ÅÔ·¢ëº76îU +Y)tU‘ I„Dë?¨ÅoÜþðFL!vè1âÂþÎ/F­yûÁ›Œ“Kó{Ϭø,ÙÔӌ±éWSv1…úÃÚ½¢û]ãÃÀty¼–"g}ÂY ’ô&¿jµáF]­w_ûî2ËX¥­Ö)û ~“ÍAv~–þÖ§#«rÁz†œ(1Üy׸™O·åg˜îÅý5^⏽Çå½Ç•;Mð´ ^7A“«–#“Îâ‰ýé+Ÿ,Ù¬¶Xí³Vÿ²k|û€%ûã·Xå ¬ú_ Xýî€%°ê‹–iÒsË}Äõ•Çu/xm #ENƒ„m»r¬µ¥¿ýòôãøÎ +k1w^ÈÍ"Ú`”sš`ðõàa@pÀˆ©ü° W%ÎÒ7l÷ã@ꚨ,يNÅIòc ðF¶Á³‹¤…{Öniœßbrt?Zо<ëBïž0¬…?,l.ìa½X^S(á1áêô¹Í'KÔÂ51,ŠÊ;ôҞ÷û\wÿ?^ÿûýF’t« d:§i2?ìD'ær8¨FP\ÑÜG$]yó&™å ›±‡/*ôÃÀÚ^66®qø°­µ~MYÛ$zhá´e€›Õ.ӝ]XݗÍjFÍ ;›4x¾Bý™¦#iÁ¯…L5þ«ÁjŒY ”"ǀͰ9ÉÓö1“Í +€•W³óÝ ðIJ-€î6¹™îÚý¯³¹!»–:…7Ϟ¥áÔÒæ€ïYøg´¢žÊ ·É;FzfR´àN…ï”mÇÎît £“ ‚­ƒ‰_²µ—¢—wë2*EËò,¸¬°8ª×p‚ŠF‡2é{M×46¯®àliAÀª ‘ù®b˜PÁ›–Ëí2èÞ.Œ¹gÀ)=niç•'ÿûGú?Òÿ+Òÿ–ý›%™yøŽÌ5[,ßh^™‘èÈ­/©•†»šÒtc§<³V¼iÒ µÔ@þI­¼“_¦Â omm ÔãÌ Ç],/̧ßÁNêµ3¬¬ë<ǔÁoL½jW²x»¯vËí‡iEàмx6 ÀáR+ð; Û/ŽK‘mƒ öøÅúÅð0Q(­€},¯õ…„Q¹ V¤Ø!ç¾YEüîé0û² ¾/=?_]ډýá§/ñ“çÔV+jôV2Ç\m–ä{ô‘54QMæ‚Œf[ВRæŸk¿Áî·ZB«"íÙDô>öÚùƔ|fShÇ-CÕ¥q¼;YtŠ9° bzÅsËè¡>}²V«^3[Mžvù"±º´gq6ŸabÁ°éÐ[މ–ìÒ]¢ç«s@ò‚ÞÕ}„À†|Ʊ¥oŠ“qŸì¼]¨v˜®ê›èð¿£:§L´Ç«ˆ<Â~iúNç§ P©òÖeÀ$üf“Õ¡®øò‘¸QêÁv_ +·ß] +ÏßC +÷ïc\¯Ü̱ a}Y·]·“nŸÂå+„pùb!>ÒÿNÿöovp³;ädqÖÌö™)ù9î=ëäÓJ*„Öp6¤ÑU‹¤Ýe@šu»tG +bÂtß‹5ÔÉÝj›è­ØìEOÐÚ¥YΒÔæêd¨.àvD×v¸vMÇÓÍ ù'÷Ç>î^)Îd¦µRµj°Ûi²MvÒd=Óä8Ód]k?G“u§ÉvҝU W$©'’Ì'’ÌW$I©ùD’ü$é"Éü9’,÷H²í$ÙO$Y6’ԍ$û=’ðbÝI²žH²’åŠ$e‘d½G’÷9²¾Ì‘õ̑ºsäWRdE–3E–/¤H™äÈzâÈ2w’ÔçSzÜh„מüïéÿHÿ¯Hÿ[öW3Û"|§'ú§p£; ByÀ\1¹Vø³À()¬â.H=$cŸô£ $Æ`*Ïé‚"ÇÚöV¥bê…_ÇôÓsÉl¯I‘cî’î Ï±€íŒû´þmYôo&^A&Ü`ªˆIž~§¡È÷ì=ü­F-HuËzgMùc‚á£Å3/.ãòªâg†RýÅ(#ò »Í‰úrQkÇÕy=Õ8\ÆÛföÿ¥»²çâï,Ä/(¹î§ª ™u5ò:íqξìmNDìÖeF&“B² Ì#±9q,ÕÁ8ÃTUöAR¨.ºÏ¼U¼­“Ûp¢ìŒöÔ¸žN4aÏtoIeC­ÆZ`»=§<ó‘Óô5NHƒ”ðºa;”g·¾pª'<‚üá‘[fÛΌS‹(—ž¹3¶Œ^ øü¯Cp[Þíš![ÅYŸÜ ¯pYª€ + QoQ%5( ¤ÇMÊg ¿i¡ ‘DÔH V’åäv”‚%/„]kÝ^æÁÀá\ÍtÊäÂDsšNŠÒZ +r !˜+´Xµüò|KԞs$S܊Ð÷SHa^QæÉxØ ë9ÑÆR¸m“Nšð¶"L³Ö¸w¦Î©ñŸ„‹Û +.Å&©Ö%“÷º!š\I,ŠOTå LTHE)!g½RJ§eC B…ÙÔC^¾óTx[G!÷xš™Ç˜ŸÍ0*õª9KGÚz'r¼`v5Z4Žžü›*Q¹ßY]þy§“k™ޒ‚ú•¥ìžoàï–Þ8ÐZ ž§ÎãÙ¯±™Ëʃ;ràÏX«a>jäQ#wjä”KXi·>—l¦mvhµ4hÏ¿ýòôãIc{˜­³[F˜ó/5•ÍҎô‹Çòvö wîOY']Q-ÚWÐF>K'êsSWP0 +‹¯ ¥y„O·óÁë±ýáۊ×X¹w-…Ú@Ò¸HÚ`hòayo“D‹ŠmrŠMVùÙj9"VNv ¤Oå3–5˹õFÅW•0ìV¶÷ŒäŸØ.&©¸÷èPóˆ…ÃûÃGËã1ÞdÓSs#zí%_ íKtröšþ’Ì©ÇŸ5è¤vŒP 7ÎÃÚ(½° Xí¹­wN$îŽIõ™Õ£?RÚÅa]|‚1Ççi‰oSòÐWЗê´9y„u¶]zxs-˜ŽJL;^þUÄôï½Ý+âdÞ³¯jfëz’±ŠhJ¯;bÇõïpjŸØٟ»pçdY‡éÌ[Î`ŸKè%#/5bíæx×Ðuü|º‰±‰°s¦jÕO,ÚéQ7/çpbi~ƒÚ)µc¨‘c(2ïpáÔý:!=:š° ÚmòúڙŸ +W¢ÿOX!T/3ÆFÝÁw!P”EnøO[hÀio›âò_kèèîԍZ‚[[^ð8г&€«½ÂÈ6eÐÚ ÜJBØÛ=X¡|ýÖ+”H—Ր"½o/g¥ÊI“EŸ)é¢2ÿÃ~µãºÃÀ>§ð JÔoë å;…/÷oÃR»2Œ8H‘g`+{vµ"EÅ!”*T¤«‚BY¤õ ­R!‹\í©â¯’¢¿É±²eå…1ü¤¼IÖB*¼=PG[ ;kJÉjÁ…q×YÝ‘ÕÞY>ƒžïѳà^-¸ûYrgÉý}É-¤Ù‡:¬ãOí2çïè67ôÚ¯ÕTIŒkàÚú¤”~îâ¸ZubC‘¾ãM¨ éuE©cÙáÀ°á_Ì'bõ±;¹Y–¡šF½Ç>°¸rê3ÜûîRÀۏéóþޏÄýùùã¡ovSqz%NàÔr£7ã¾nã(ãö¥2®«2ÿ®ŒÓú÷•qz}Ô9úÞ ýbÔijNGZ‡¥GӊÊØÑD1 ž¹â(µ)jçÎ~VQ®­³ O©6&ü åk!ÚÒÜ6Æa”éÜ:ä!ã‡%¡Z\贚TŒØÕT\âHހ['¸åy#z;UI é³»{ü7WXîP—.îV¨AXª§ ;d‹ð/¶Dp=¾4ŠÅ­]\öb¼ÊÊ}$C[h¥U­Û˜Ý@‰š˜…×ByL\%3,5;!q ª–à[n¡ùÜrHEhìäF¶âIѾ¿©¾ˆz®¹Ö× uáY PØ֛®ÉãÞ%ó„ÆÛ¢,¢Lô”p3Šôžø¦Š¨žãª”ÓЅ·§ í͙?¹rÿUî?ÝûÅd 9Ÿ¥Ûȋ½ò{AŽYOySŠFì°g&·±gª€“ž¶@ëòǝV#þÅ~³£çY"SX\2¸eDŸ`qkRâsiauvMüÅåyºÎõüwxµ›XmO—žî’ïÍû÷Ž§óó×Çϋýü`Y‹µ# endstream endobj 21 0 obj <> endobj 53 0 obj <>stream +8;Z\699Q>0$tLgE@s3TlmUEBX/t(60-97-jo.8'%q%JM,,8;q&;m'(\!_I*:[rVf5 +mN*nE2r_PtrC-oI%&6j;DtkS:^NP+07*n8EI(`f1XZnYEh&e1ec-c?lVU5<`U_%M> +LDG\ejO`41HF_lo7q1kW,H-b$G_hC:0h7f'JX3',hdHGa2V#4+'ci.EY1iJ,;2ssZ +??;r>p:I:(:"J5YQ4W2Tlptc1<#m&gROm_>434.!+gJ?*5/.iK/W$S-N3!@c&aLS$ +DJGt'NC"nNiB@DN.O?!A!)B=V]obb%<)`d2Ds#,B3V[5ja[D-NNb4a4&Bjtkm-6TGS4D?HU+6n> +$N)eCd1LBhd!7B:Y!u4eoOJ+=&lH=[bB'K%gSIC*Sj>ZMJ(!4TZ^P@nq7_.`/migO +*:)pN^u*US_]6(Dbq%Xa,9$GTK3`PFgsLC(Wh!>Jf;YXN"6o.&kG\#f..#LdFpD"u +PQlIk3jdFS\s8oI8kFbB&D +7?)W^d^$o"ro4bef])5^S^OjPIq)j[FB:U4Q`iJ8/migO>]]Oeq!cQdXPKN8ET?FJ +W1ghJ]jm'rl1NnlCQ endstream endobj 28 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 312.3725 392.8279 cm +0 0 m +-0.01 0.003 -0.019 0.008 -0.028 0.011 c +-0.556 0.144 -1.092 -0.176 -1.226 -0.704 c +-1.302 -1.005 -1.227 -1.307 -1.053 -1.537 c +-1.235 -1.828 -1.414 -2.122 -1.584 -2.423 c +-7.953 -13.647 -4.001 -27.961 7.224 -34.329 c +8.301 -34.939 9.426 -35.463 10.579 -35.896 c +10.65 -36.259 10.92 -36.566 11.302 -36.663 c +11.83 -36.797 12.366 -36.477 12.5 -35.949 c +12.633 -35.422 12.313 -34.886 11.785 -34.752 c +11.439 -34.665 11.091 -34.774 10.854 -35.008 c +9.764 -34.597 8.701 -34.1 7.682 -33.521 c +-3.098 -27.405 -6.893 -13.66 -0.777 -2.881 c +-0.592 -2.556 -0.397 -2.237 -0.198 -1.924 c +0.214 -1.894 0.579 -1.608 0.686 -1.187 c +0.731 -1.005 0.721 -0.822 0.669 -0.655 c +5.168 5.462 12.509 8.938 20.168 8.466 c +20.286 8.196 20.519 7.981 20.826 7.903 c +21.354 7.771 21.89 8.09 22.023 8.618 c +22.156 9.146 21.837 9.682 21.309 9.814 c +20.888 9.921 20.466 9.737 20.243 9.392 c +12.305 9.888 4.695 6.309 0 0 c +f +Q + endstream endobj 29 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 315.5146 387.7234 cm +0 0 m +-4.89 -8.618 -1.856 -19.608 6.763 -24.498 c +10.9 -26.845 15.723 -27.446 20.261 -26.232 c +20.569 -26.149 20.877 -26.058 21.183 -25.959 c +21.305 -26.084 21.46 -26.18 21.643 -26.227 c +22.17 -26.359 22.707 -26.04 22.84 -25.512 c +22.973 -24.984 22.653 -24.448 22.125 -24.314 c +21.598 -24.182 21.062 -24.501 20.928 -25.029 c +20.925 -25.041 20.926 -25.054 20.923 -25.066 c +16.363 -26.557 11.419 -26.071 7.221 -23.69 c +-0.952 -19.054 -3.829 -8.632 0.808 -0.458 c +5.306 7.471 15.248 10.414 23.3 6.351 c +23.277 5.891 23.579 5.464 24.042 5.347 c +24.57 5.213 25.106 5.533 25.24 6.061 c +25.373 6.589 25.053 7.124 24.525 7.258 c +24.261 7.324 23.995 7.277 23.778 7.147 c +15.276 11.478 4.755 8.38 0 0 c +f +Q + endstream endobj 30 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 698.6083 367.031 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.381 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.008 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.894 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.859 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.31 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.476 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.155 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +h +S +Q + endstream endobj 31 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 678.7866 359.115 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.252 3.02 -9.758 5.485 c +-14.59 10.242 -17.28 16.596 -17.334 23.375 c +-17.388 30.155 -14.798 36.551 -10.042 41.383 c +-4.466 47.047 3.468 49.755 11.33 48.736 c +11.409 48.526 11.556 48.34 11.768 48.222 c +12.243 47.956 12.844 48.127 13.109 48.603 c +13.374 49.077 13.204 49.678 12.729 49.943 c +12.287 50.189 11.741 50.057 11.453 49.656 c +3.3 50.713 -4.923 47.906 -10.703 42.034 c +-15.633 37.025 -18.318 30.396 -18.263 23.368 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.818 2.273 -4.809 0.338 -1.46 -0.956 c +-1.43 -1.267 -1.253 -1.558 -0.96 -1.721 c +-0.485 -1.986 0.115 -1.815 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +h +S +Q + endstream endobj 32 0 obj <>/XObject<>>>/Subtype/Form>>stream +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0.25 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm0 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0.25 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm1 Do +Q +0 0 0 1 k +/GS1 gs +q 1 0 0 1 333.2021 185.7029 cm +0 0 m +-5.257 0 -9.519 4.262 -9.519 9.519 c +-9.519 14.775 -5.257 19.037 0 19.037 c +5.257 19.037 9.519 14.775 9.519 9.519 c +9.519 4.262 5.257 0 0 0 c +0 23.887 m +-7.936 23.887 -14.369 17.454 -14.369 9.519 c +-14.369 1.583 -7.936 -4.85 0 -4.85 c +7.936 -4.85 14.369 1.583 14.369 9.519 c +14.369 17.454 7.936 23.887 0 23.887 c +f +Q +q 1 0 0 1 368.1533 196.0017 cm +0 0 m +0 -1.355 0.086 -3.67 0.258 -6.943 c +0.137 -6.943 l +-10.802 11.921 l +-17.538 11.921 l +-17.538 -13.266 l +-12.766 -13.266 l +-12.766 -1.413 l +-12.766 0.022 -12.875 2.423 -13.093 5.788 c +-12.938 5.788 l +-1.981 -13.266 l +4.806 -13.266 l +4.806 11.921 l +0 11.921 l +h +f +Q +q 1 0 0 1 390.6714 203.5476 cm +0 0 m +0 4.375 l +-14.506 4.375 l +-14.506 -20.812 l +0 -20.812 l +0 -16.401 l +-9.165 -16.401 l +-9.165 -9.906 l +-0.638 -9.906 l +-0.638 -5.53 l +-9.165 -5.53 l +-9.165 0 l +h +f +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +0.25 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm2 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +0.25 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm3 Do +Q +q 1 0 0 1 400.9633 203.9792 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.992 -0.867 2.156 -0.945 2.266 c +-1.022 2.375 -1.146 2.43 -1.316 2.43 c +-1.548 2.43 -1.716 2.353 -1.819 2.197 c +-1.922 2.043 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.802 0 l +-2.802 3.035 l +-2.169 3.035 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.055 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.997 -0.274 2.806 c +-0.091 2.615 0 2.339 0 1.979 c +h +f +Q +401.53 205.971 1.458 -0.679 re +f +q 1 0 0 1 406.0547 205.9802 cm +0 0 m +0 0.853 -0.376 1.278 -1.129 1.278 c +-1.577 1.278 l +-1.577 -1.306 l +-1.216 -1.306 l +-0.405 -1.306 0 -0.871 0 0 c +0.875 0.021 m +0.875 -0.632 0.688 -1.132 0.316 -1.479 c +-0.056 -1.827 -0.593 -2.001 -1.295 -2.001 c +-2.418 -2.001 l +-2.418 1.968 l +-1.172 1.968 l +-0.525 1.968 -0.021 1.797 0.337 1.455 c +0.695 1.113 0.875 0.635 0.875 0.021 c +f +Q +q 1 0 0 1 408.582 206.4821 cm +0 0 m +-0.176 0 -0.313 -0.056 -0.413 -0.167 c +-0.512 -0.278 -0.569 -0.437 -0.584 -0.641 c +0.578 -0.641 l +0.574 -0.437 0.521 -0.278 0.418 -0.167 c +0.314 -0.056 0.175 0 0 0 c +0.116 -2.558 m +-0.372 -2.558 -0.754 -2.422 -1.029 -2.152 c +-1.304 -1.883 -1.442 -1.501 -1.442 -1.007 c +-1.442 -0.499 -1.314 -0.105 -1.06 0.173 c +-0.806 0.45 -0.455 0.589 -0.006 0.589 c +0.423 0.589 0.757 0.467 0.996 0.223 c +1.235 -0.021 1.354 -0.359 1.354 -0.79 c +1.354 -1.191 l +-0.603 -1.191 l +-0.594 -1.427 -0.524 -1.61 -0.394 -1.743 c +-0.264 -1.875 -0.081 -1.941 0.154 -1.941 c +0.337 -1.941 0.51 -1.922 0.673 -1.884 c +0.836 -1.846 1.006 -1.785 1.183 -1.702 c +1.183 -2.343 l +1.039 -2.415 0.884 -2.469 0.719 -2.504 c +0.555 -2.54 0.354 -2.558 0.116 -2.558 c +f +Q +q 1 0 0 1 411.1372 203.9792 cm +0 0 m +-1.157 3.035 l +-0.291 3.035 l +0.296 1.306 l +0.355 1.117 0.395 0.91 0.413 0.685 c +0.434 0.685 l +0.445 0.889 0.486 1.096 0.556 1.306 c +1.14 3.035 l +2.006 3.035 l +0.85 0 l +h +f +Q +414.267 203.979 -0.828 3.035 re +413.403 207.799 m +413.403 208.068 413.554 208.203 413.854 208.203 c +414.154 208.203 414.305 208.068 414.305 207.799 c +414.305 207.671 414.267 207.57 414.192 207.499 c +414.117 207.427 414.004 207.391 413.854 207.391 c +413.554 207.391 413.403 207.527 413.403 207.799 c +f +q 1 0 0 1 416.0063 203.9245 cm +0 0 m +-0.945 0 -1.417 0.519 -1.417 1.556 c +-1.417 2.071 -1.289 2.466 -1.031 2.738 c +-0.775 3.011 -0.406 3.146 0.073 3.146 c +0.424 3.146 0.739 3.078 1.018 2.94 c +0.773 2.3 l +0.644 2.353 0.522 2.396 0.41 2.429 c +0.298 2.462 0.186 2.479 0.073 2.479 c +-0.357 2.479 -0.573 2.173 -0.573 1.562 c +-0.573 0.968 -0.357 0.671 0.073 0.671 c +0.232 0.671 0.38 0.692 0.516 0.734 c +0.651 0.777 0.787 0.844 0.923 0.935 c +0.923 0.226 l +0.789 0.141 0.654 0.082 0.517 0.05 c +0.38 0.017 0.208 0 0 0 c +f +Q +q 1 0 0 1 418.5278 206.4821 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.167 c +-0.512 -0.278 -0.569 -0.437 -0.583 -0.641 c +0.579 -0.641 l +0.575 -0.437 0.521 -0.278 0.418 -0.167 c +0.315 -0.056 0.175 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.422 -1.029 -2.152 c +-1.304 -1.883 -1.441 -1.501 -1.441 -1.007 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.173 c +-0.806 0.45 -0.454 0.589 -0.005 0.589 c +0.423 0.589 0.757 0.467 0.996 0.223 c +1.235 -0.021 1.354 -0.359 1.354 -0.79 c +1.354 -1.191 l +-0.603 -1.191 l +-0.594 -1.427 -0.524 -1.61 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.337 -1.941 0.511 -1.922 0.673 -1.884 c +0.836 -1.846 1.006 -1.785 1.184 -1.702 c +1.184 -2.343 l +1.039 -2.415 0.884 -2.469 0.719 -2.504 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 397.7275 198.7507 cm +0 0 m +-1.07 0 l +-2.796 3.003 l +-2.82 3.003 l +-2.786 2.473 -2.769 2.095 -2.769 1.868 c +-2.769 0 l +-3.521 0 l +-3.521 3.97 l +-2.459 3.97 l +-0.736 0.997 l +-0.717 0.997 l +-0.744 1.513 -0.757 1.877 -0.757 2.091 c +-0.757 3.97 l +0 3.97 l +h +f +Q +q 1 0 0 1 399.5566 201.2546 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.168 c +-0.512 -0.279 -0.569 -0.437 -0.583 -0.642 c +0.579 -0.642 l +0.575 -0.437 0.521 -0.279 0.418 -0.168 c +0.315 -0.056 0.176 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.423 -1.029 -2.153 c +-1.304 -1.884 -1.441 -1.502 -1.441 -1.008 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.172 c +-0.806 0.449 -0.454 0.589 -0.005 0.589 c +0.424 0.589 0.758 0.466 0.997 0.222 c +1.235 -0.022 1.355 -0.359 1.355 -0.791 c +1.355 -1.192 l +-0.603 -1.192 l +-0.594 -1.428 -0.524 -1.611 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.338 -1.941 0.511 -1.923 0.673 -1.885 c +0.836 -1.847 1.006 -1.786 1.184 -1.703 c +1.184 -2.343 l +1.039 -2.416 0.884 -2.47 0.72 -2.505 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 403.4843 198.7507 cm +0 0 m +-0.111 0.389 l +-0.155 0.389 l +-0.244 0.247 -0.369 0.139 -0.532 0.062 c +-0.695 -0.016 -0.88 -0.054 -1.089 -0.054 c +-1.445 -0.054 -1.714 0.042 -1.895 0.232 c +-2.076 0.424 -2.167 0.698 -2.167 1.057 c +-2.167 3.035 l +-1.338 3.035 l +-1.338 1.263 l +-1.338 1.044 -1.299 0.88 -1.222 0.771 c +-1.144 0.66 -1.02 0.605 -0.85 0.605 c +-0.618 0.605 -0.451 0.683 -0.348 0.838 c +-0.244 0.992 -0.193 1.249 -0.193 1.607 c +-0.193 3.035 l +0.635 3.035 l +0.635 0 l +h +f +Q +q 1 0 0 1 406.3208 201.8435 cm +0 0 m +0.112 0 0.206 -0.009 0.28 -0.024 c +0.217 -0.801 l +0.15 -0.783 0.069 -0.774 -0.027 -0.774 c +-0.292 -0.774 -0.497 -0.842 -0.645 -0.978 c +-0.792 -1.113 -0.866 -1.304 -0.866 -1.548 c +-0.866 -3.093 l +-1.694 -3.093 l +-1.694 -0.058 l +-1.067 -0.058 l +-0.945 -0.567 l +-0.904 -0.567 l +-0.81 -0.397 -0.683 -0.261 -0.522 -0.156 c +-0.362 -0.053 -0.188 0 0 0 c +f +Q +q 1 0 0 1 408.5288 200.157 cm +0 0 m +-0.32 -0.011 l +-0.561 -0.018 -0.74 -0.061 -0.857 -0.141 c +-0.975 -0.221 -1.034 -0.342 -1.034 -0.505 c +-1.034 -0.738 -0.9 -0.854 -0.632 -0.854 c +-0.44 -0.854 -0.287 -0.8 -0.172 -0.689 c +-0.058 -0.579 0 -0.433 0 -0.249 c +h +0.245 -1.406 m +0.084 -0.993 l +0.062 -0.993 l +-0.077 -1.169 -0.22 -1.29 -0.368 -1.358 c +-0.515 -1.427 -0.708 -1.46 -0.944 -1.46 c +-1.236 -1.46 -1.465 -1.377 -1.633 -1.21 c +-1.8 -1.044 -1.884 -0.807 -1.884 -0.499 c +-1.884 -0.177 -1.771 0.061 -1.546 0.214 c +-1.32 0.366 -0.981 0.451 -0.526 0.467 c +0 0.483 l +0 0.616 l +0 0.924 -0.157 1.078 -0.472 1.078 c +-0.715 1.078 -1 1.005 -1.327 0.858 c +-1.602 1.417 l +-1.252 1.601 -0.865 1.691 -0.439 1.691 c +-0.032 1.691 0.28 1.603 0.497 1.426 c +0.714 1.248 0.823 0.979 0.823 0.616 c +0.823 -1.406 l +h +f +Q +410.67 198.751 -0.828 4.225 re +f +q 1 0 0 1 396.4922 193.5232 cm +0 0 m +-2.286 0 l +-2.286 3.969 l +0 3.969 l +0 3.279 l +-1.444 3.279 l +-1.444 2.407 l +-0.101 2.407 l +-0.101 1.718 l +-1.444 1.718 l +-1.444 0.694 l +0 0.694 l +h +f +Q +q 1 0 0 1 399.9179 193.5232 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.991 -0.867 2.155 -0.945 2.265 c +-1.022 2.375 -1.146 2.429 -1.317 2.429 c +-1.548 2.429 -1.716 2.352 -1.819 2.197 c +-1.922 2.042 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.802 0 l +-2.802 3.034 l +-2.169 3.034 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.054 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.996 -0.274 2.805 c +-0.092 2.614 0 2.339 0 1.979 c +h +f +Q +q 1 0 0 1 401.6655 194.1169 cm +0 0 m +0.222 0 0.382 0.064 0.478 0.191 c +0.573 0.319 0.622 0.526 0.622 0.812 c +0.622 0.912 l +0.622 1.236 0.571 1.47 0.471 1.611 c +0.37 1.754 0.209 1.825 -0.014 1.825 c +-0.403 1.825 -0.597 1.519 -0.597 0.907 c +-0.597 0.603 -0.549 0.376 -0.452 0.226 c +-0.355 0.075 -0.205 0 0 0 c +1.395 -0.6 m +1.395 -1.035 1.268 -1.366 1.014 -1.592 c +0.759 -1.817 0.381 -1.93 -0.122 -1.93 c +-0.565 -1.93 -0.944 -1.87 -1.257 -1.75 c +-1.257 -1.088 l +-0.89 -1.244 -0.495 -1.321 -0.074 -1.321 c +0.352 -1.321 0.564 -1.092 0.564 -0.632 c +0.564 -0.572 l +0.589 -0.2 l +0.564 -0.2 l +0.371 -0.499 0.084 -0.648 -0.296 -0.648 c +-0.66 -0.648 -0.942 -0.508 -1.142 -0.228 c +-1.342 0.053 -1.442 0.435 -1.442 0.918 c +-1.442 1.416 -1.338 1.804 -1.131 2.081 c +-0.924 2.358 -0.638 2.498 -0.274 2.498 c +0.098 2.498 0.392 2.35 0.605 2.053 c +0.627 2.053 l +0.695 2.44 l +1.395 2.44 l +h +f +Q +404.393 193.523 -0.828 3.034 re +403.53 197.342 m +403.53 197.612 403.68 197.747 403.981 197.747 c +404.281 197.747 404.431 197.612 404.431 197.342 c +404.431 197.214 404.394 197.114 404.319 197.043 c +404.244 196.97 404.131 196.935 403.981 196.935 c +403.68 196.935 403.53 197.071 403.53 197.342 c +f +q 1 0 0 1 407.8134 193.5232 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.991 -0.867 2.155 -0.945 2.265 c +-1.022 2.375 -1.146 2.429 -1.316 2.429 c +-1.548 2.429 -1.716 2.352 -1.819 2.197 c +-1.922 2.042 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.801 0 l +-2.801 3.034 l +-2.169 3.034 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.054 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.996 -0.274 2.805 c +-0.091 2.614 0 2.339 0 1.979 c +h +f +Q +q 1 0 0 1 409.561 196.0261 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.168 c +-0.512 -0.278 -0.569 -0.437 -0.583 -0.642 c +0.579 -0.642 l +0.575 -0.437 0.521 -0.278 0.418 -0.168 c +0.315 -0.056 0.176 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.423 -1.029 -2.153 c +-1.304 -1.884 -1.441 -1.502 -1.441 -1.008 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.172 c +-0.806 0.449 -0.454 0.589 -0.005 0.589 c +0.424 0.589 0.758 0.467 0.996 0.222 c +1.235 -0.022 1.355 -0.359 1.355 -0.79 c +1.355 -1.192 l +-0.603 -1.192 l +-0.594 -1.428 -0.524 -1.611 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.337 -1.941 0.511 -1.922 0.673 -1.885 c +0.836 -1.847 1.006 -1.786 1.184 -1.702 c +1.184 -2.343 l +1.039 -2.415 0.884 -2.469 0.72 -2.505 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 395.8676 204.6355 cm +0 0 m +-0.615 0 -1.114 0.499 -1.114 1.114 c +-1.114 1.729 -0.615 2.228 0 2.228 c +0.615 2.228 1.114 1.729 1.114 1.114 c +1.114 0.499 0.615 0 0 0 c +0 3.003 m +-1.043 3.003 -1.889 2.157 -1.889 1.114 c +-1.889 0.07 -1.043 -0.775 0 -0.775 c +1.043 -0.775 1.89 0.07 1.89 1.114 c +1.89 2.157 1.043 3.003 0 3.003 c +f +Q + endstream endobj 33 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 315.4511 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.914 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.076 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.356 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.716 2.674 21.885 2.405 22.162 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.443 6.371 6.167 4.88 0 0 c +f +Q + endstream endobj 34 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 317.167 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.089 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.742 -29.6 13.739 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.853 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.15 0.111 c +24.009 -0.326 24.19 -0.817 24.608 -1.05 c +25.083 -1.315 25.684 -1.146 25.949 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 35 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 341.747 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.438 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.007 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.081 6.445 -29.063 6.478 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.895 -29.725 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.976 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +f +Q + endstream endobj 36 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 321.9253 174.4812 cm +0 0 m +-0.363 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.757 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.797 36.55 -10.041 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.41 48.525 11.557 48.339 11.768 48.221 c +12.244 47.956 12.844 48.126 13.109 48.602 c +13.375 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.742 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.262 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.429 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.116 -1.816 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 37 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 487.2256 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.914 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.356 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.716 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.443 6.371 6.167 4.88 0 0 c +f +Q + endstream endobj 38 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 488.9414 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.089 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.742 -29.6 13.739 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.853 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.684 -1.146 25.949 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 39 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.5214 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.438 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.007 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.081 6.445 -29.063 6.478 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.895 -29.725 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.936 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.976 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.811 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +f +Q + endstream endobj 40 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 346.5654 366.7712 cm +0 0 m +-0.528 0.134 -1.063 -0.187 -1.197 -0.714 c +-1.259 -0.958 -1.22 -1.202 -1.112 -1.409 c +-7.281 -7.971 -17.194 -9.521 -25.125 -5.021 c +-26.88 -4.025 -28.444 -2.787 -29.787 -1.356 c +-29.774 -1.322 -29.759 -1.291 -29.75 -1.255 c +-29.617 -0.728 -29.936 -0.191 -30.464 -0.058 c +-30.615 -0.02 -30.765 -0.022 -30.907 -0.053 c +-32.491 1.968 -33.674 4.302 -34.378 6.852 c +-35.776 11.915 -35.118 17.22 -32.526 21.789 c +-30.075 26.11 -26.17 29.281 -21.471 30.795 c +-21.35 30.674 -21.198 30.579 -21.019 30.534 c +-20.491 30.401 -19.955 30.721 -19.822 31.248 c +-19.688 31.776 -20.008 32.313 -20.536 32.445 c +-21.063 32.579 -21.6 32.259 -21.733 31.731 c +-21.737 31.716 -21.737 31.699 -21.74 31.684 c +-26.668 30.1 -30.764 26.777 -33.334 22.247 c +-36.048 17.463 -36.737 11.907 -35.273 6.604 c +-34.533 3.923 -33.286 1.471 -31.617 -0.651 c +-31.633 -0.691 -31.65 -0.729 -31.661 -0.772 c +-31.794 -1.3 -31.475 -1.836 -30.947 -1.969 c +-30.789 -2.009 -30.632 -2.004 -30.484 -1.97 c +-29.074 -3.478 -27.43 -4.781 -25.583 -5.829 c +-20.726 -8.584 -15.16 -9.174 -10.081 -7.815 c +-6.428 -6.838 -3.029 -4.849 -0.33 -1.934 c +0.145 -1.977 0.594 -1.674 0.714 -1.196 c +0.848 -0.669 0.528 -0.133 0 0 c +f +Q + endstream endobj 41 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 493.6997 174.4812 cm +0 0 m +-0.363 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.757 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.041 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.41 48.525 11.557 48.339 11.768 48.221 c +12.244 47.956 12.844 48.126 13.109 48.602 c +13.375 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.742 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.262 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.429 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 42 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 672.3124 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 672.3124 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +h +S +Q + endstream endobj 43 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 674.0283 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 674.0283 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +h +S +Q + endstream endobj 44 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 698.6083 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.008 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.895 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 698.6083 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.008 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.895 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +h +S +Q + endstream endobj 45 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 678.7866 174.4812 cm +0 0 m +-0.364 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.758 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.741 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 678.7866 174.4812 cm +0 0 m +-0.364 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.758 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.741 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +h +S +Q + endstream endobj 46 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 329.4638 354.0017 cm +0 0 m +-0.404 0.102 -0.811 -0.062 -1.04 -0.381 c +-4.492 -0.013 -7.787 1.042 -10.844 2.776 c +-16.742 6.122 -20.983 11.563 -22.787 18.1 c +-24.592 24.636 -23.743 31.482 -20.397 37.38 c +-16.475 44.293 -9.511 48.96 -1.653 50.008 c +-1.522 49.825 -1.332 49.684 -1.097 49.624 c +-0.569 49.49 -0.033 49.811 0.101 50.338 c +0.234 50.866 -0.086 51.402 -0.614 51.535 c +-1.104 51.659 -1.597 51.39 -1.772 50.929 c +-9.92 49.842 -17.139 45.005 -21.205 37.838 c +-24.673 31.725 -25.553 24.627 -23.682 17.853 c +-21.812 11.077 -17.416 5.437 -11.302 1.969 c +-8.141 0.175 -4.733 -0.917 -1.164 -1.302 c +-1.054 -1.594 -0.809 -1.829 -0.483 -1.911 c +0.045 -2.045 0.581 -1.726 0.714 -1.197 c +0.847 -0.67 0.527 -0.134 0 0 c +f +Q + endstream endobj 47 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 500.5219 407.0984 cm +0 0 m +-0.007 0.006 -0.013 0.016 -0.021 0.021 c +-0.419 0.362 -0.921 0.144 -1.144 -0.467 c +-1.271 -0.815 -1.275 -1.214 -1.184 -1.558 c +-1.395 -1.857 -1.603 -2.163 -1.806 -2.479 c +-9.388 -14.288 -9.29 -33.352 -1.587 -44.975 c +-0.848 -46.09 -0.051 -47.112 0.788 -48.031 c +0.767 -48.505 0.919 -48.978 1.207 -49.224 c +1.605 -49.564 2.108 -49.346 2.33 -48.735 c +2.552 -48.125 2.41 -47.354 2.012 -47.014 c +1.75 -46.79 1.445 -46.812 1.203 -47.022 c +0.411 -46.149 -0.342 -45.18 -1.042 -44.125 c +-8.439 -32.963 -8.533 -14.656 -1.252 -3.316 c +-1.032 -2.974 -0.805 -2.645 -0.576 -2.321 c +-0.237 -2.42 0.121 -2.188 0.298 -1.7 c +0.375 -1.489 0.405 -1.26 0.399 -1.035 c +5.364 5.059 12.056 6.935 18.15 3.806 c +18.187 3.433 18.329 3.089 18.561 2.891 c +18.958 2.55 19.461 2.769 19.684 3.379 c +19.906 3.989 19.763 4.76 19.365 5.101 c +19.048 5.372 18.666 5.283 18.411 4.93 c +12.096 8.18 5.165 6.266 0 0 c +f +Q + endstream endobj 48 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 501.959 399.7243 cm +0 0 m +-5.821 -9.066 -5.746 -23.704 0.168 -32.629 c +3.007 -36.912 6.779 -39.259 10.713 -39.259 c +10.981 -39.259 11.249 -39.247 11.519 -39.226 c +11.59 -39.422 11.695 -39.593 11.832 -39.71 c +12.23 -40.051 12.733 -39.832 12.956 -39.222 c +13.178 -38.611 13.035 -37.841 12.637 -37.5 c +12.239 -37.159 11.736 -37.378 11.514 -37.988 c +11.509 -38.003 11.506 -38.018 11.501 -38.032 c +7.489 -38.368 3.595 -36.126 0.714 -31.778 c +-4.895 -23.315 -4.966 -9.435 0.555 -0.837 c +5.911 7.504 14.591 7.855 20.226 0.144 c +20.107 -0.419 20.26 -1.049 20.609 -1.349 c +21.007 -1.688 21.51 -1.47 21.732 -0.859 c +21.955 -0.249 21.811 0.521 21.414 0.862 c +21.214 1.032 20.988 1.062 20.785 0.974 c +14.844 9.166 5.661 8.815 0 0 c +f +Q + endstream endobj 49 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 522.5449 363.4333 cm +0 0 m +-0.398 0.341 -0.901 0.122 -1.123 -0.488 c +-1.226 -0.771 -1.248 -1.087 -1.205 -1.379 c +-7.616 -7.47 -15.972 -6.102 -21.414 2.11 c +-22.619 3.929 -23.616 5.982 -24.392 8.203 c +-24.375 8.24 -24.355 8.275 -24.341 8.316 c +-24.119 8.927 -24.261 9.697 -24.659 10.038 c +-24.773 10.135 -24.895 10.182 -25.017 10.191 c +-25.86 13.224 -26.312 16.511 -26.33 19.906 c +-26.365 26.65 -24.684 33.012 -21.598 37.818 c +-18.68 42.363 -14.834 45.001 -10.705 45.319 c +-10.633 45.128 -10.53 44.961 -10.395 44.846 c +-9.997 44.505 -9.494 44.724 -9.272 45.334 c +-9.05 45.944 -9.192 46.716 -9.591 47.056 c +-9.989 47.396 -10.492 47.178 -10.714 46.567 c +-10.72 46.549 -10.724 46.529 -10.729 46.511 c +-15.06 46.183 -19.093 43.42 -22.152 38.655 c +-25.384 33.621 -27.144 26.96 -27.108 19.896 c +-27.089 16.326 -26.612 12.87 -25.721 9.685 c +-25.742 9.641 -25.765 9.599 -25.782 9.55 c +-26.004 8.939 -25.862 8.168 -25.464 7.828 c +-25.345 7.726 -25.217 7.68 -25.089 7.674 c +-24.275 5.336 -23.227 3.174 -21.96 1.261 c +-18.626 -3.769 -14.251 -6.348 -9.848 -6.348 c +-6.681 -6.348 -3.5 -5.008 -0.685 -2.289 c +-0.311 -2.5 0.118 -2.272 0.319 -1.722 c +0.541 -1.111 0.398 -0.341 0 0 c +f +Q + endstream endobj 50 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 505.9443 353.2702 cm +0 0 m +-0.305 0.261 -0.669 0.192 -0.924 -0.127 c +-3.637 1.476 -6.074 3.877 -8.172 7.043 c +-12.219 13.149 -14.473 21.307 -14.518 30.012 c +-14.563 38.716 -12.393 46.927 -8.41 53.131 c +-3.74 60.403 2.904 63.88 9.489 62.572 c +9.555 62.302 9.679 62.063 9.856 61.911 c +10.254 61.571 10.757 61.79 10.979 62.4 c +11.201 63.011 11.058 63.781 10.66 64.122 c +10.29 64.438 9.833 64.268 9.592 63.753 c +2.764 65.11 -4.123 61.506 -8.964 53.967 c +-13.093 47.536 -15.342 39.025 -15.295 30.002 c +-15.249 20.979 -12.913 12.523 -8.718 6.193 c +-6.548 2.919 -4.027 0.434 -1.223 -1.228 c +-1.197 -1.626 -1.05 -2 -0.804 -2.21 c +-0.406 -2.551 0.097 -2.332 0.319 -1.722 c +0.541 -1.111 0.398 -0.34 0 0 c +f +Q + endstream endobj 51 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 672.3124 401.0407 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.447 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.34 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.444 1.726 -36.461 1.436 -36.625 c +0.49 -35.945 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.707 23.122 3.973 c +22.743 4.184 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +h +S +Q + endstream endobj 52 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 674.0283 395.2976 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.553 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.195 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.885 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.652 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.051 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +h +S +Q + endstream endobj 257 0 obj <> endobj 256 0 obj <> endobj 255 0 obj <> endobj 254 0 obj <> endobj 253 0 obj <> endobj 252 0 obj <> endobj 251 0 obj <> endobj 250 0 obj <> endobj 249 0 obj <> endobj 248 0 obj <> endobj 247 0 obj <> endobj 246 0 obj <> endobj 245 0 obj <> endobj 244 0 obj <> endobj 243 0 obj <> endobj 242 0 obj <> endobj 241 0 obj <> endobj 240 0 obj <> endobj 239 0 obj <> endobj 238 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 318.2861 213.571 cm +0 0 m +-0.009 0.005 -0.016 0.013 -0.025 0.018 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.518 -0.635 -1.522 -0.945 -1.415 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.977 -1.896 -35.029 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.41 c +0.916 -37.779 1.097 -38.146 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.483 2.877 -36.883 2.401 -36.617 c +2.09 -36.443 1.726 -36.46 1.436 -36.624 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.367 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.315 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.323 c +0.447 -1.159 0.483 -0.98 0.477 -0.806 c +6.404 3.94 14.394 5.401 21.671 2.965 c +21.715 2.674 21.885 2.406 22.161 2.252 c +22.636 1.986 23.237 2.157 23.502 2.632 c +23.767 3.107 23.597 3.708 23.122 3.974 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.166 4.881 0 0 c +f +Q + endstream endobj 235 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 320.0019 207.8279 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.413 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.704 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.073 15.564 -29.473 15.088 -29.208 c +14.613 -28.942 14.013 -29.113 13.748 -29.588 c +13.741 -29.6 13.738 -29.611 13.732 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.421 6.118 24.149 0.112 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.145 25.948 -0.67 c +26.213 -0.194 26.043 0.406 25.568 0.672 c +25.33 0.805 25.06 0.828 24.817 0.759 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 236 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 344.5815 179.5622 cm +0 0 m +-0.475 0.265 -1.076 0.095 -1.341 -0.381 c +-1.463 -0.601 -1.489 -0.847 -1.438 -1.075 c +-9.093 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.081 6.444 -29.063 6.477 c +-28.798 6.952 -28.968 7.553 -29.444 7.817 c +-29.579 7.894 -29.725 7.93 -29.871 7.937 c +-30.878 10.299 -31.418 12.859 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.788 29.455 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.019 -12.412 34.929 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.385 -11.451 36.65 c +-11.927 36.916 -12.527 36.745 -12.792 36.27 c +-12.8 36.256 -12.804 36.24 -12.812 36.226 c +-17.981 35.97 -22.797 33.818 -26.45 30.107 c +-30.309 26.187 -32.411 20.998 -32.367 15.496 c +-32.345 12.716 -31.775 10.023 -30.711 7.543 c +-30.736 7.509 -30.763 7.476 -30.785 7.437 c +-31.05 6.962 -30.879 6.361 -30.404 6.097 c +-30.262 6.017 -30.109 5.981 -29.957 5.977 c +-28.985 4.155 -27.733 2.471 -26.22 0.981 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.977 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.948 0.141 -1.771 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 237 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 324.7602 171.6462 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.253 3.02 -9.758 5.485 c +-14.59 10.241 -17.281 16.595 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.755 11.33 48.736 c +11.409 48.525 11.556 48.339 11.768 48.222 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.678 12.729 49.942 c +12.287 50.189 11.741 50.056 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.634 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.819 2.273 -4.809 0.337 -1.46 -0.956 c +-1.43 -1.267 -1.253 -1.558 -0.96 -1.722 c +-0.485 -1.986 0.115 -1.816 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +f +Q + endstream endobj 261 0 obj <> endobj 260 0 obj <> endobj 259 0 obj <> endobj 258 0 obj <> endobj 232 0 obj <> endobj 231 0 obj <> endobj 230 0 obj <> endobj 229 0 obj <> endobj 27 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 264 0 R/TrimBox[0.0 0.0 842.0 596.0]/Type/Page>> endobj 6 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 267 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 282 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 310 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 325 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 311 0 obj <>stream +H‰ìWێ·}Ÿ¯è˜YE²È×ÈH^Aä¶õ°r`ëÿÔ9Eötï® C@ Òðl²®§Šþüqûð§iûÝw·ÛÏ·´ÕQwé[/yïc»OøË÷·¿o?ù†økÚ~üâÿöÇ¿ÿœ¶ïþqûËÛùó>úìã˖·íËã'lÊØô³O$ÿ˛vÙK2ÙrÍ{Z¶Çç–>ßîm¯†}÷ QúVw•v þØö¸}/Í%ŽÏDwÍ¿žƒÇí2ýæõ‘— —ø{¸l2ö^;ûÈcá{¶Ýÿ4ÛB'!ïÃ\ÄøÐ%MM ` ·Ë<¿Èó“ ÏÛ.‚>n?À5‡­‹øÁ'7õ¯ÛÉÖ0òÞFÙҞ“K_öÚ́Šn÷¾7—ÀUß³;jÂWI÷šü´²”1áÒ ygâžÝ†]øMݍõvf·ÖNiO“Ë¥Rße»h¥Ue +Œ ÷bv:Ý?Ný >LÏá§×ƪe—¢î2Ó]GÏgcU¿†¢ö=«¼†wØ9ž§RºKmoq–]Ã(ɃÔޙhîh9òz"=UñDÆÉ)-e¥ë;k:מ&hæÑÐM0ôl÷Vr‹'ÞÌ¡ì’í ˀOSW·Q²!{W¡ëv±îp4n,ªp²#±´ ¸qè‚îà\pº‡„Åpºî‘ˆÃZ¹æÒC(?v°^çF‡”="ø4;”ˆ$Ëù «aUӘ0×3Ô1–! ñÚ4cœ´ã‰puåñYÏ ø–£®E€Ü=R[k‰䇸Uh¥jê±1gÜ&nÅ»øÝø-†s"àG°D¶¶qwîI™öî>rbÿáìswµÿ˱YÇ%ìݝ"X³ŽpœÇ_€ð•å _„¦AºW9AW,ÙÂ)Â¥Ože5 ˜ßYàá肷¸¹‚¢AŸvK'wAí…N¨)¤Èc¡žD~YÁ‘CÖâÊ0í­.x±àhd¨ÜspdG=q©`•PÁ<úÏê¼áe7uÓf3—ßNi–v¡e\ê¹Ý2ý i„Ö­äN­3÷ÖÂà1Z¢SiGrÀÀÜ×VhxœâS#qî×u¿Oæñ,ˆž‘.ŒîÙA‘ ‚60ÙÕ¶¥§®!D´4:@‘±nÁÄàèÖNHêÜJì2B~0Å!ݺµ¥Rª[S‚[j +4hcJab‚WALü_{qW ­zBÖ¸ + + F”2ž`tVä€6}LƵž¸PX‹Ðlµ’<}q`0G¶éР--\̉QìõõyèÐÁw¬5'›ÉƒÈËt*¼OԐJ.$ºg3Ó"Kè;ápøâP¼‚ÿ24Ή®M·u€ûY)µwd°]ª—øxúÞª›÷JLa˜ ì6iz@Gt‡Û  ”¤c:º .©Â·È´Öðw‘‰ðM­èDz³¼ O«(>oÌVLcH=îÒÕBy6o«Þ–î+nÿ©É6 alw–-Þ鶊bÚ=ëÔ5|ΌÝí +ØÁ¬ÅÓ +Y!ðƒWTô©§ÖÛó€ã†ø`ÍT§Þ1d(ÏÀÍãXu¬+jæŒx— S9Éøq{J½v<ÕT»âêRnzE]V·dÿ£_`Y0£“J_À K)‘ì€î™>‚áQ(Sê`I™µ±7&ª'ÜDJ2njÍÇÊ`!§vÎØÕ,"i°¹è¡Ø[F\«¨!ƒd_³°o‰oÔØá‚L”+£÷cL9 û@29jŽÛãǯ96?ϯ\]Æ×ÊÈÇJaröVhMŒGŽ]=cnÐ΃$˜*ò WŒs †òْb³Û˜bÙøvžŒ™xÑàN"ÁÉ ©Y6^ñ@÷nHâ÷J « k`þÕx)ù\e|c Ôk ,ßZå¿£ÚWk`ùÖ¨ß^eüæ"(_-‚ò+E°ÿö"8þ…E°ùa ´ìzIàá ªo•2XOªÎ÷Š\ 3-‰× Kõó¤<€j‰®¿ì2,Îk«u/š3&ûhgȂÛGD:ˆQK{‚–;\g¦côé5ª»+¡$Çÿ¹à?Ïí“ ìßφ*éâ¾Ãi6µÞ4…ó(g¨ PgC€,÷Ë#HdHÖ˜=’5]Vš™ÄîJہf˜µcÕMRØ1ÕxYDìÓCށÊ,á>K²n²€œçFcïeƒ´åQbúzŒy—t‚Ð @В¤ÁV¯ +t°Ë@TA°.Ü'4¹Uæ »t‚èšL×r_ՈaåéÅfÄ%@QšJÐûö¼€êâÀ¥@b·Eé=’C»›ð1¿£9snFxp[<ÒÜÚp¤’»RD–—&gåÎ}ÃàDâ=T~P +¥Z9­6a¦*A´— 3ÍLžõ==hFÆ =8±²±|‹sž+Fæðªª^0}ø&‰õS–àª6ÝŽ»G¿=S!ÚçÀ)·ÛW:NkîO ð({®j…xQ¦4½ÍWÁ”ǤD¬óWY…?Ý"°A»]Œ¶€ˆbS²þ„8oPÍ2C?Ôjá Â¥¶^.èߟ|Þ;·öЊDÕYŒÕe˄¼’ +÷Vò(H™{(6Ø;¬”ƁÈ%¶N,Q„š2ǓN"2k;¢%´e±¨m¢>+ß±·ÄWXâuÁC¨FÔ¡vÌ6±Äqpì(k Յ%&ÌÅ}p%Nàúy2”v¦Ž¤ì ™Õ°Ö9—µD^À|Ð 8Êz<»:›20ŒÇ-øWDç8a ”¾Baq”;w¾ÎúC‡â[Ýõcûå{ßsnÕ@þñgç ÏÒÙ¶Æðm߇ÑTڙð +P]g‰“×E¨?·¾‚QÜÂ]1z¯¿ônÏÞ;tM“uh[4Q'XþCÓv„¶0„#©ýDo7EqKjÑ£µ ¸qh]kP§£§ô+ §[¢h^¼¼V®•†–ZT€ÇëÜ؎—BEÃó* fø«aUƒiæz†ê5@W/&(là.D­²†¯lîT¥gFS£{‹¬u-DMIm­yTE‰·‚RÓ,TˆnõlE_Ö«ð·X!‰½ö¨yÏÙ³ ¦|®¥ðb¡àwgWRvöÿHG¤…±ë·9F婱‹(OŽ oËÈó®Ñ--:X6¢ nÌ#“v#Ò£¬XŒƒ×“+p9R'u&½±·¨níf±èaØë÷YµK!çÅ딳ʟJ4ÏN‡ŸB 7Õ ëèÔ$:Á5b’ti|­” ÿ\e¡1Ù±Š´ A+ς«å}v•5:¹õOö«%ǒÜîûujëG}Ö>‚P00ÀÔxá¹?`F™™¯« ØÃÞT)^fJ”DFk%çY°y="J*Y9-Ou$‚S³Xé&o, Ë÷êwšÅ –8ä #!ˆN êûJ Zo÷C{ÉGuid#j;ªb2Š +a³±Ñ ÖÝÊA¸³…joêq”Î3%¨¥ú¯ ‰0¨¬*O¢ê©MgT[ӄOº’‰g3Rz@8pe§±ÿŒÜH”²+8ƒ4wʂ˜Äe}K'©šó\ó {þk +lðÔs’²·Sg⮁Œ½ß¨Lç{†c }‘¿ ¯E©5;T¸tb)?×(‡¿Ô¥5ੈU宅?¾Ýqßoä¾0÷;ÿx•Èå¿®ºÿ=µÿ µ™¿¨6ý¿Ymö¯ªMUûuµYËÍDÒuçHdÕ£q@Íq#òšì¬Šn²eœCÜ•¬ö†–L¥f,h¬]¼Uw¾ZhacÿID %°þÈõ {’”´—ÍYõjV¯ƒóƙ ¶rá Û&áÏËìrÝ#Y ÿD\š›ÔÈ©j‡$CF½[a²«},TÏ©c˜”bñµž rk'â”âÂÔ6J2gZª4¤ëŒlœœ½ø"¡WÍ>Ñæé^x¨+Ù£9òÈÒºâFU"] +[ Óz€¡' ~µÇ³Ù)’ƒÚ°GÍÃ¥7êw$ÉÆ[‡Åw‹Îµ›öð´Cîn°°ÌØ1µÌýÂöúÂEw¥·ïpáðöª$xɐ/^ à›¯kø¡Izdÿbá‚O“žÐ_Þ6½n_4’J‰ÿÌúë×çë¯3=ɕ#ÅQçf¢Ø^F@&mØ<+Á– ây‹¯)ڏ\RÞà0¾>[|¡qN&¤uô‰ȸt¦ŠÖ¿··ß=Ðí)aon}<çÒÇq‚óûqEa³óúË_ÿæûûÓ¯áíϏ|óGDžgl(‹/Øè8Ðpõ¡råKÜw¸²Å_®hõ<$©ð¤Oš°®¼ƒ1KÀ£²r=ëLÃøJWC¤lavâ“wq}ÌH|X/\ò£’Á”2¿4ô¹4óއ„þˆppÕp÷‚àˆø†Cq Ê‰aèeL~ö#6 nËäSE_fh?ֈ;3¯'ؑá,óö<ß¹7ûS•¨ß?•È؞LHÔ>bŠ’€dT!eàF®#´€¹ˆ(u7ãP‹Á‰©ØÙ +ð q6DòÆ+ï×ô?@—*¼7¨D1Õ ($¡1ü@æÉ훶1]÷ã`œ©@ˆè~*ÊyÄH•ˆÊjHW°šaËèœJü—=ö:üL¨(t|8¤Å³8§rö4J?» ¯:ÇAl´ÌSa³b·±Â2‚Ÿw˜›+£!5îšD†Dqᔪ›Ø3,vξÆj#…Üñ0 ¦ÑÀ!’#‡¸0PÑċ´EK¹P-#Æy¤B¾…߆|,vX|ä½Tƒ°¸S²±`7Î3Û}­=t.ðØ®(”¸2ü¾ï!ü(³·©4±£œÔé:<£Ý<²M| +‹>òË`¸OîÝH ˜}u`ÇjcÎ-*)*GÕÅ +unÖ¨Íj_y'|掀—²Lê]™š-Ü4ìL‡[ép˖A/hàâà±Z4Šì{À3b\¹­„v~¢‰-«¾@M<Ê,û†4ž×Òf:Øb´ÑtBÜò4Ÿêq=ÏøG4? w¬õã6íN ÷k0?½OF†ìB¸Hpø=œýÁUÙ© ˜®}'a1wç¾Æ“f^¨2…Ñ8 Ñ òÊüoãÉ>@íä|2š«¦JÜVçì‹4½IÆß1ÆzH(!44x‚»‚#FߊŠßTò$²ÜÞ;CÍ«oª´³3J«”åþ½ÅЃœR !ñ—xQ9“Ó9kAÔàbxQ]¡b/Ið^"›ÕYÈ]ã@0*ÙkÀ’5ÙkVrÀ&›C3ÿñüáxYâkg[OUGË»¸„xûðíxî¤sÎýñ å?˜ïóútrONĹÇy<Ì°âËgØØé#×7 „m£Y¯¨:>°„ÈüJ6ј©1z Ú2¦.¾5&iÓ[Çp«*_ЁñŽ‘t·´;žŸk Q€ ù%ñ@=Ëa„ÊŽ‡dFö1VÕzêÒêö"³Î¶¯3ÑðlÆÉdÁ†˜c/51˜_t|‡,"`ó€ÅÊO|ÕD™íAJÙ{ŽJ9ö ” ¨ÊÊïadâ€Zìk™ÐcßôótZÏ­MmšûMñm8S ”Gµg¿ú0Ýã'‹—[^8ûFrØd=ŒaUâ@Ã+Ì(èžHžGx·´cD‰‚Gv_ék"C&¼×˜*ß~€*ýš_‹—ÿ w€{6ŒLï1±Æ¹yxB~f¾½ádÙb û¬ …ÊBŽ`Ëà6dæÍÍ!†Áßýì\^94A7{ž›3ÑOùí(â­N£nˆ]m¼‰½ê}KÊcKx©žµŸçÈöýusïÝözV"U.†ÖÙ;EÞú_vú;FŽÉv3€l“Z8U#⛪Tzhyäé¬Ó¹ 2‘ϱhæö$2Š>D¡RNÿzF‘ƒ=|9ߙßÈ»êmxf}¯¼ÓÌ8Zü–«º„œG¢˜îgD£Î3EJ³ *¤?› ˜¦{ßÏd»ŠÍŸ^À‚ìÿ_õSõ÷ÿŒê?RÀ¥ò°v;ŸjØ"ËD{xNQz”Ê G ÖjKÔ +?ñŠòÍk³”KèÍW„÷ö„6wdÕ;%»²?ÒÅØEE" ”¨R‘T²’ÒeN)meÞB.Ջœ™€Uf,ôæçç·‘ÄVé6lÔùê6 #´Årܪ`ûr˜& ¶Z£Þûá´Æ½sõSԖšGùGbY¶2©â>=«øhúÂ.OPm†Ö¿ZŽÒ•è+˜ü;¶µ¦(šTÔ)¿U`¶Q&ú}±h‰èï„ ¯²¥„àÞE¢Êªwñ6°#‡0!y;^D¹0„¬ñŽðR õ­Z…Oãà"%^ŽñËMBÏm†U.ö¤KYQjŠ™g8 ñn=ÕtucT'Ø4éàV"')g£›;+AñÁ°‘Ϻ'ʎÜgÔ~Mg~Q9ù>/O@ċ÷åý?ñY;_ Ô ä†Sk š;¾+£1F„GN°3{Y¶áPt s-O¢:¾@-@Kã¯ù+YýZ[ç°°Œ´vÐG®ýÒòøÝÃߘ%®ÿ÷G* çy¬uA{µß– oîç}yÒâUèöJðñͽ_Ükw]jk1÷è"{AWêI¼áJÖb?rº”da…YÅg/:d„¦µ46W +•ТÜC–Ö›345Æì»rl~œË_ÝL¦}0önJÑMw.“uï9ᬺ|ãµröYLsjHa¶|à´Cãsֺƥ†ñ5ßCÏZýÎ| ¦b&o¦ñßwݕŸ2_Q«r#'ƕ­ÆÇ7¡(v£ª‚§òr0¤<´!P@䔍þly ÎÜûœîÇ1W¾åMÇøÏ¿ãqA¢l'»á rc Í+ґ›áìO¢¼Š+ͧ°•çúòF˜×_ΖWÆz»¾]~·ýžZskåëyéϏ1c›wê›/1°Žƒå|êYUõ¯pƪÚ3Hh©øÌ ŒWϯpª1$s“åg4»³ç|ïÙÉQyWâ’éz ý>Û¨¬MBå&8›`ʳbnFY.H«wÿÅ~µ$Y’Û°«ÔÊ¡õ;O‡#f1½ñý&J©÷ª{ºmÏқªÄS¦> žKFÂ`™PÀž‘¥ÄÎ'9tUžo€ïU·BÕð]âîÿØýº>½bÏÚÀ¯B§…ƒZʓ]ͬԾݑè Г8Bã¼}«ªtG{-ç®lo(ʆ\5_!¨TÏøæ‚hÏ|7Ó¹$Š¨8pm€°u«2npB? +ÛôȎõ{®{1¼`Fj“Aº9š¸Ü×ÆU‰ãýî-oêÏF½Ó_)¶E¶ {G‚,ƳµBƒÁ!<ÑE´Á%‚ô]Ù ·ºeÆïSøž•†¨˜Õñ*¬»ºÉhÌ÷¥Ti5€dÂØCNz9ÝÔÅK6Þ C§ÎCö}c¿)#7g#UmO¶P-Ô´‚¼ðÖ×3+8+‹Á0ue'ôSd‡Gl…PŶÿI}§,=o] êãIGZ¸•5Θïkqë™í3g‰òº¸™««ˆts U.9(>Už )ü”ÛìŒÊY^"øžÙæ 8½h¬»uÊýâ\„³2³}y‹¥„ƒºQ\áhC±;²^”¨X^EÉf·_í…­/øÓX¤ÀkòO:C§¡€î= Ï7}îw絉‚è” óõÚÂÜzO[˜ž.óy³{eƦ·H{¶°<'ÎΓI{X¾çOþÅ +È—q{“°ÑÉ"A +½(™•-zÔ`œEµÆ¦*ˆïÚýª•üLRdl&Ïeâ€XÝé¤={y¯Ò¶ü"=x֝ýŠ·É—*­CìA +’6Pµ8çí1¨ö¶?H[ð«/t >!Ÿ¬=_ ÖBë¦ýMH¯ærظµxtv¨' ‘&šPƒV'„úŽOø˜D{܋%°ÞõÙ$N¸/iÿ¾a,_]}Qý^sɸ 1O¥nwé´®œRoDC]K0¢šhö*͸ŸÇÉñ¨»®àBøR†’ìTRP<ì¤Òc¥±&õæU\,ù°=€:ن.ã2ÁœhsQk¬*óIèiM!ž~ ë §³YŸ^z(oŠÖŒm­§"MãÚÕk_€Ù—GÞcN<ÈÒ¥ãu¡D*†í̈™7¥Õ8ŠNÌÞ<ÒÒaØ éèá¿Ã¨6_aH(¬âwÛ0çI“سôM+”þk§ñJN8…ªÞ&¿!Û$`k·–D!U—FVr ~ÆÛ1‡ ãÅP 7<­o$ÃÔêÕAyýã% +_$úðÕ¼Ô~œóWÊ£åõ'å7ôüHyz¥<äÉÎy^ÞÈ*rVn7¬iº{‡Ölߙíòx.;³-?| ”¡”†ûÞàب7ŽÜö ½"OÀqAq¯ºŽ‡Ìc0œÌóßÐ(ä²½ó˜ÒǏÔýÒYa¢Ú€±š×sîïh¯Pk{äÖYϳ4•gñÂRèt–ç^ü”·ÿÝò^•'@u[߽ĆÙè°?EM@Òu´ äÅ ˆz‘=„Ü@uF¸ÒAªÝ“™%l-þÙS»yöm̾o,Š@à +Z²=As!€;ëkJŠ®)QÈ-*'þ^HëA[•ŽGbœµ +|¨Ñ]¢#²…ƒ`Þ +ûy妧û´¯ÕK ­D"×c¡€úö°¦!+´rÃ`…"½¾YAð ïX$‡¬~X΄j‘’ÊTÝkpß9Ám@OÃþßï äTq*£°Ã3æŠ +Ê6=ÂÍ+ßòäG¬&•e’Âù‚QôÝûKæ(íóWú˜ºò`ø3ÊâÚæ³®ËáÖxÞN×ó—såî9žυÆx« ÉöO‰® W“U ¥Ü?|™´L¯w§`sMå>lÞ¼RXJ"lЛږÅ3óvŒ3¤“Ç7A¡´Sªqt¥¦  n~ÆÒþ$XF‡ +Uð—4sºÄ¦sÑ|zþå)$ŽóOÊÇvWßÂg}òרe獚÷¾¤N|=½Ÿm½—f®Ò|üº_ÿni¶Ÿ•fùIiŽ»4Ëz­ÍrצýEmÖÿ½6s… <4õq¿ý¯r¸aÿ}pîï×/^(ˆåô¬×p~`_¿.¯š~½áÊ£õg‚ µ‚>Ø¿wϝzíYB_ìMì7ž]k†×S !®t°)jª³¼ì®³ÓbmÂ?ÕÊ»ÊuöÂñŒ)5â«jë‘2³©ï¨ýTÛÓ °ÐL=©"wã šº¤çúðfôýÈ2ö~¯n¶– ¸¿’V@ÒPoy¿evJ«²ÅRÍ{k7^QG‰Ëµ\/4Õêw( 5Ñ 4 úy ÅœÞ×:k»°ä,íRxŒ†ú^Yuy "m¤µÍ|‚­Ñl—š/ë|øþ¯JOö£Ðô¶J™R‚ˆ"^ñfÀ)ïòÇ«Q¼—¤öi/„‚oñè·/ÝÚ]·úß'§˜£œ1ñŒtÔFEÁ[”²ÍIèÏ@îZ%i!#„­ù–Š¼0¥Ï1û‚¤?¨Y ¼RNš +1­,k4Ĭ)ñS´fWöÇ»þóà¼}å AÅKëR£ ÁÔ|ò£~‚uŒG2t;#‘‹®ÏJþ8‰Z—ÄäétÖó3A ÷Oe«Ã@ÜɂuŒQ%œÞÉ&f¦ºK¶å + ÿ”G}æëâÑó‹hÐáíaÉæÑ÷[¿x´ùUÎy½fµÎ½~! ž ‚%χGÏ&âkלáío<Úª'Ìø¶*>8muøùÝV¯æ™Óìúy3l¤}›Ýõž‰yÑGÍ¿•ô­,¯:jÉßÍñTU¹1Mæpß©Ï\3ÎlŽCÄ8°¸â©Ì¨`Þ»ôH¶¬uf=úLîôù㛯t2,»P^þæèÿ"G›b·J^ÀÑ9¥‡¤(Ô)v3 ãƒÕ±£ñ‡ÉãR5#T¨4ÅÀÀ;(¦K°E▤îskw+Ü¿ô³Ù¬Û”tÚZBLÊ%UbIéd,{xk7gYÁÙÄwhôS©2³ì$döB807^Q*QÖ2¶ù6]q‰HÙCY·":l]ú̙ͧfZ–ˆ¡ç#MK4hæ߉ús½Qe†#Mé¾0ëfŒIxà(‘M'ùÍz_?Ð\²¥t^¡J3Ššã¤ÊN鉨ä7a[OXeJu˜nð0<^Þ¬QêIŒtÉ4€ònÜ}¶ RѺšSÉÇä´#ÿü“Í 4%ÙXë/ ZÄÒM´þ9úx[™Å%fÑêͳò ¶ü[ÇÅk%º€k_ ·ëTŸu‹¸òa/.x…IJš|oV‘ÙºÝCB̍àm†º¨q3‰õxJñq:s•„fаϫ³ Éî]­Ö˜,f« +B êZcŠ „¿=ȱRÑhÓπž…|f¼ÒX"{ @‚Ü9¦X¢Œ>H–‰—ܸK²q](}óO9 ðì¢î6Na§W÷8¬Ðª¾)‹í„æ#ùր~-4»„Ÿ©½Á?f”µ¶ÒKU+ôjÇìÈVóáê:SæÁÁšLõZ¦¸þÌZâ5$ÊgàSã&ÓÍ3SÉߪW$k̈́øŠ<<Þ3©‰Ȓ>ô) )ŠÏ£FÜÙÐvJÙMqˆh*¼5€Jì8s¶sæ÷¬^Š“A3ƒ<sÊÑђý]™þr$Þ?™ÊÊ’×¾¼™Ññ˜ ÉW4ýõfÓ6h§|Cfµ™'×À±.@›ªÛêûšÙ1¶ð“†l¬ÉÓ®S r¸¯ï7ÖÎcìZjL¸o.æÜÓ¼?ÿ„9m2·y1ç…ÁX:fpㆢ˜s^ûš]ö>×ʃÄpÿ]+Á×¾bÎëTŸu‹|åÍÞ'sîm±aoºî])ƒ1é‰ÁËßkpñ¬L}vÔå"‡¨‘;")q‰U!8R:>f=,_¡}¼÷ùÀGTˆÉ¢@©ëè&!³Ta’ +Þ«ÕKèí¤t ½ºÝÕ´\Ïÿ÷ìDA#z’UÁOB‚úø)ñÑ,»üãö„µÙyÛ|Õ ô×~¼áÏi†–(rõ+î”à¿aKnß`ÓºsÞ¾Á‰1e¿z·2Â>¶©IÑcõƒ¥¢ƅÙÞֳґö巎s—à _ú>öM®öãTŸ=råÃ^û¶3€.û»žniLºv;§J ™©0ÜgÁý¬ttÎql‚Lw­rHNåì+Dû›ZJκE¾òa¯¤“½;eH†ý™jȶ@ÿ‚Ý|†´[4J†²…º²x0ޘûŠíûÆÀhvQº0/ڕÔ|Ò n¢ñ úu6>ÍÊ5ÖŒËLäÍHB€™ÒÔñd*ëÀyÕÂܖ÷|kdñœVE’NÀ¥ Ex"ô>ùºÈ D¾‘2}ð˒{.†byã½µ¦I«š/&ön½(´þ°ÇËwÝÚÜD áöoŠ™¿`hñq}þùÓíäè¼½“‚Î6B¿‡]V¢¥fx-Ý~µø3LÆڂ¯·0 TÞ¸ýÎ'¦‡Ÿ㙋íÍ@C^7¿–oàžâ͘ëaŸ@¶ÿbLeú[•>ŇBÞ,с~­Zô¬B±\ý”eHÕ:<żÄÍ!Ûº×~v»¿ÞP)ï‹5Zxûâ·7¯ùœu4öïóFÐùA϶e&ÓFÓs–— +ÛõÚ(ôLmóE™ÔsÌ3g¯ÉºÏUÞq-/ "(ª‡Â0ðýyI;³)yëfƒ+*§*åèR¬‚Ž­¢)QeáÞ^#{Š9{¦=|‘Ɖ‘­[¢F|5S4OˆW!ñû¬Œˆ•aÝ«Zoû=Á?Íäº æzØÊË1˜$œF[‚²%àZŒ’b9’WE9#2söñÇ[!S YL$ÆRk16W²Qthh Ô²ô+´„¸€ÒÈxz¨²$dèÀ„_Íg΢Yš°#-Oɞž|„qXº†"Ô^A]ÆҘx.2,=È—Wût2« ßÞÈL÷L¦îBRilqʔ²‚£pµ¯;KQòÿ ›e{ +þèrB/Ð-ݲX‡_¶"}nV9*¬í êKÃë| ó*ï¸ôò H ð'9þ*‘kt×À;Üs7UòK›H’Mv‡póÍê+½òåfår2ë²aYòØö_ÌÛLMQĕ]þË; mâðC”©ª!t˜©›èÏ?xLÝCë&Ä©ÿúf~6g‘E‘FæÍ!Ò²x4‰j|¡å R5‚„Çø\a +©$ïCå?(ôŠÐj9¢…E§tgŒ-½%†¾ùð•F7ߏü-?€‹ʎ*^¦2R‹,d~‰tkƒÔ&qÞ&³rÍÙÌú¢OíŽÃ™ Å8Õ؝!élÒ'Žà»~%«Sù3w'Î×øñHuKÞam¯¥qk8‘tûa!a¹=àê@àFGؼûǚsܗl¬K·ŠE÷mq2ʸíX$nG㇛aXýbøǃ†&]nGUûjØõ9È„ZÛ¢£…®Ð4Ð[qdJºcƒ® rv:Wì–Ø1ùFGM««8(4ƻ㵄ì,Q•®{Í[Œá´ siÕì&:Àñ-·€%¤0âÄ|µ˜lšJŠazšÑ-+Çpu8ùQ| 3H~‚¬ö €ôM Øø›ëþÚ\· +:ÜÊd£Ï;×I!xÖd˜Ò õâ=eOXÉ2#!${*ÑW:°¤íñٝË*3êÙ^«,B +œ€þìú–’hEšlÖý€|ÐLÇ@¾̞*G†A×!é¾V÷ ú‡€øŸ‡| ùþwÈÿ!ß!ßÿ,ä·X¢’Ò¯W,äøß®ŠŸHR0(ý;å½#P€Å^á +F¥7[7ÈM—Ñ¡>ã´j‰T_· +Ôÿ;? šÖU½UßÖÌÑ +¸ô016dÙðð1 ?íï ÿ_ìW;’,¹ ôûs™àÿsžE,xâJ܂¼Jÿ´ZMô½+ãª"J& »)Ûb$ͪ¢ÿŸúزHpт»ÈÛjäsK3ŸõF¢4ý$÷©¡0v" .ðj=Ð\j9è#=½ô™T?q¤¦ˆÌO&4„yÉzA˜kÿ<ú"]¤ÇBYA«$*8E\rKö¤‡aÁ&õ㤪.1Es©³ñǍ‘þý/›OK–œÒØ0#Ìi;À}Ä£l-/ø´ï‡oóɞäZ~aÀ×HÂóœ0úy±ŽX&¬/–‰k‡ó¼úA­ £¦ý¿"ý£Š”™ºeXEJ-”».êJgkäY–bu ì2U'Èlv‰[ùüyÜ[͟…±ÿ0Ê4É­B¤qVåIϐ(C‡oQ\¯9ŒÕtp´Ifu?¹ %U“ª"6î¬Óҟ²ÊØØH3ºÊU‹¦ï¬ÿé{Vb“KŒÔBW-k"2›K ¦¡Ù,ZÁêKºä'«,ÔE@I§Ø¬{-ª’ß|èyŸ;’ +I†ßÔ¤ዎÆ`XÞ¯ùR¾rÌûœíQ™%)ÆÛü€rDÜJ³€˜¬ ¼3ËƈÂ\QÛÒñEÅo?vXXghÅ™y|\;(•¯36}l+Ö—ÝÚá~®hx×z»ÙAÜ°åÅ©u*Ôë·›ëÔ<ãñE² +xí°ðuêÉ_±Ë.íÀ¶¦ÜnF,_T—ÿúbY¹v¸ßCg0-À] Àæoƌ[#æO®!&=cÉ¤®–$624’»([Ã7Aß5Ã4Ë+-ߧκñÓ¸ã`ŽÒ¿ª"«‘¿/ÚøìˆÔt´¯¸â:.^byƒQöz?¾ÁÁx £ªÝ,÷? &©¦b;^¥²¤¼óÀÆ,µÊô¥·Tî¹­ +qsý?ÖJ5‚¾­çc©¹e\”½,ŇuiV·Ü1’É¢Š},y± ’êU×i³qõ·3m°OÙ§6±<Ù-ø¶Bfºê³n¯¼YkDHÎ÷3$Z ´ˆ®§)€¦ù?L3?e›‹ú 7ˆ#`ä8kÝ+Æ÷Åâ¡HúS/%Zzߒ¿Bhod^íX„-ØJh톼K7 +eé&·ëúÕ¸æWM¬|°æDAÁ¾ƒÛž²[ú_ø¬:Ë÷ø‚¨®kÜQ°®èÛú>ýûƒÊÑ%"Ík&÷4 .±±á¨Ò‹QS˜8õ²‘\å6ê/½š0»“WŒgíúü¾³ޞÁ<ɪ˜¬?ʦU`),ÏHÓdER³€Àÿ7·,ººE‹ã¤ëXª?Ö_ª#ýVqŸ…š¼^¬'ügW"qGÜg!¶‰åRSú/·Õ{Zð'+í©=óÑ`¹˜-›CT¦ª AŠY"3Í6-a¹§C£q-¤{zkNq6«¸æ’5?¯.ì öU£z­õ¬=ï`Å_²@s×Ôôö™=‘ìøÂ¥,ôí´7=ᆠÞf3u&óÂî&´L“¿‰ö2ÈÂTÍߗ¸ákUJʦ4Ss%ã9ÌOk MêÊ.bIDÅÔ$bI ûðmÙuälóÁª*Û˜ˆlÇJÀí(rØ<.¹a}Î}|ŸÕmDëÖj@6Ç]ÔAøᎷ©Züb96ïUÍr[ͶŸ3ïxN7ëÖ:´¤þPJր.0cW@¿ÚMö¯NÎsøÚ3tFfˆæ‰¿#ZÀ7ÑrâÿA´dÖ`ø¥óE…رÚYsP¯yóÐ[u`²BXúXöû*mø|8¤È¦›¹Œòaê{:2%Ì×lvq` +íÃp³9X3’¢Ôl1É[ß'I±gQ ÷:þ?ŒF»á?|djŒ—zt3x–Ï™¾è°ïiU{Àá¥ü—ª½&7kt|¥,Ï-¥ +b +ÈH¡‡ˆ…Òienø|ôѯy¤‘—/^P{ãsÈTaóc­&%@Ý­Ý>~øš–akíÍlÛº8=ø=Ö@·Þgµ•ôƺ‰ ÕŽiH'W¶xÁ}šÀ˜Q҇/& %;îAh^²³×¼[¶ß-çž ãcó#lXô†ˆó"úʕªp°qab Öüf;æ04`K~€ì&YfP!—7~,z “ç 5RÃÏ9P*%×@•ªå݈*ù@ïãÝ@u¾Á9Õ㠚Ótð6΃¦´%Bè²Äµá󁁼¾ŽÔk€Úh$Ýmö·8ç¨=7زwßrê°©–=€˸än”§Ûٜ§gý +ï䶺:Ÿeæú`³…Ž+æü FˆeÌg9DàLØV‰›’™NæמÛø6úí ÅáÞã$B82oÖ=ð½àŸn-vWH¾ÈÅX盶 sʤêûøNJ;–$£b@ý|G‡òêš¾Ü +ÿ̛[Q*ûáVæÃåVTL~倄¦;ÑåX–Ýy9ö:KŽÅ@¬§cÿÃ~•cɵ밼Wá ØGó°žJTï?ýHéNÕç…?qR%H—"%q׾GnWCûaÆo²+G>'öMR&µöÌ]æ!sÅçË=˜š›Åš“ê¦h<‘è‚÷ þÉ©«- ÍWÄ^,óè,Ññú´âÑ®…VÛPGjO ‚šDHÖH„dª‡Æ tÜXáû€E´‹ûÔ©B96ÈÐ'Œ½ø×ã©*~ø<>[ª¾ðïWTÁÇ4ÏH“*I@Fî…O“ÄXÿÌfÄ°¢3¢I4XXèöXÙû£HBÅ¡5\NÁ½Ú¤¿/3QmnŒ]Ëüa†Ro©Q|LXâæDù“œ»?ghš •ôa‚n1@™4~˜!ýæ :™Ø˜YRºË§™“r—ú8³Î€Bèíì}f]Å-~0ŸKíރ‚Jïø |u¼–»®ˆtU•5\†ìM¦ÑñÜë'\ú\Ÿîáâêë«2qA?n¡ZÌÈ盇D€Œ¼=<†á’wh[y<æ¼C™ƒ%l.¼¨4\ù‚b!ƒ[Ù iU’éSq¢} ½dW:VA&¬o¨Æã…ö¾K«KºE{_'ûy£Ê|f)!o%¨!™¦ÔÑV3ëex­ ¼™–:gžc­± 8¤í=7–F\Ö\LÕ·Y*[+´ü¤6‡ï‘‹c³‡«ˆ¿œæ,ÈJq<¡lŠü«luŠƒŒ‹˜Ù[TDñ´¨=µK‹zÁ8£%ÛÕ¢^ .­­µ-ÿKE¥¢ B|/ŒÊ˜õiÅC_s¶±Z½4Š¯ ¯¦%¡±ï¦Ï†žL~j2|¢×~Ž¬Ýs¯ºY.y1R1.F;Žêø6êJC;Ô’E5ö½Ú1·œ­DîàR¤9cmi@†×º–̺X)ϐCä ªËh¼ˆ¡·#¦,¡&–tƒûÛ'ïwˆ§ÙË,Ô,øð¶o­ËÛz…égÖÒQpˆøQÙPá¿¡•(Ãý=•ø™-U†²ÐÛâ|:¡=18KÛ¾×ÂÌÂÝ™i Wíà|ÈNÊâµgâ$ûÜNGÔ7¬B@–Àp”Ú’ž5¿˜ùgudùÇ$‚ïóM¡Ü«KYÖ½>]9ÕÁÆ(]“.iˆ4‘OLªêºm ïAúKŽÄ£‹8X»94E&$ý'»^_‹ž~ûè·ç¦õPîPa¥÷4ÄVyXj ¨îÉ6âëPã¨e“e„ˆž¡Ò“ñšH mºm6~áÒ*üÚÊ¥î†"6>n­é>G£†ÄpÈuø¹a[éڊ(| +ƒ:¶ÕYXê礐ƕВ҈%Î9Ñt^â´È +­¡ÛÍKµcP“å›.¢ZœTJÔ*Ϟr4¯Þށ9¹Š aÊ_Š )†·Æ¢ðt;b¯VòÆÌOlŸ¿Í¨øÀÁMý<Ü_=n¾!t»n±ÙA-N´Ož7,å‘àßq°êZüU}Eâe0yÕ "?ïØÊ"ëŒæ“È_!¼0wóù'¿Aø]Êö1ہŒ +}Üƹ‰QtCݵcs¦%D§_¸òïþ'qyCز8?Æ®8‰6ßß°óۂ 5zíތ*‹TjJQc÷ ·>®Xxá­8i7‚&f¨äí«xC[AЦ"K]'¼d’Ê|·Âœßƒöj1ï)f,›²ÖbËê%-V%QåâÙ«¶)¹[øΜ×qô´¾¿XE1΂·m#»$Ó3ÄT[[…ÙÈÑÛ÷ïSñŒE{'/½ïã"ÿ×îùÇ…Hн뭓UP¡m‡ã­×oữ• n‹ûB‡^† üBGÇAG‡1ĸègz`8Èb§Isè(.2 ¹ü½ ˆCÔ0ýQ¶‹Û×`ü±®SZ }8CϪAÍh YÆoRˆ±ú/$ëEÌfԅŒ¤·nÝ: º¦ç!±‘Â-¹ ÷ž— ßüx…d vdg‘Â_v´ïPùHpÏ¡qÀž3ñìç#tžÃ(ŒhÉTB©*F¬(®LÒ^XŒÂ­ÇéÁ÷a•`÷² +ß·#\ãPµ;Í¥h㹀J˜}a^fOKn!ÛSß:fX’ÐT×®¿¾\¡Ð2‹"g__vD\ô"]u¡¬¬`•ÑÆ(nuŠ?êú¥fº.ëŠÉ!‰8T7ÊdÀ¶s¸k0¥Ì„³qTëíȺ\Á,¾’˜Ÿèå³×@ íó܋ Ù–ØBûr#ó]}¶"Â8ތ@üh/åՏõ'3Åá‹ÎS=Ä`Ï{†ŸùbԚñEY’-|3D½—5°¯tÁé-¥Œ,¥í7**<Ät”ŶLd×{Q‘ +µXCŽ´múVýTI@F f‘Q?ê+,Aϱ–¹,ÓUc–͇ëç dRXܲQŽˆ¬æ¯Æ?µcyªc>âUa"6û€·Þ؀)#$ü7pÛ;Mž°!cŬõ8Ư4ÒÒØ +$m>]ªN0Û<&|ѧ ú48S7û ÚÙ¤Î&ÐFbã÷qØ5ÁKìØ´YÙ2cpÔå +¸A®’ßã‚lýþê0¦ïóDêl¼Ò§ Ôìà¶éšøË]؟ñ,W÷}ž®Û&¶Ÿ'Šœ»ƒ×¶úi‚Ü’üĉéÍíâUÜ1î+ˆow–¥þabKTëûîøЈì8槉e4ßä¨2O]zY¯šTÜâ•Ñv‡I%F¸æúÀ¢„ûë+rN‰LSEä:Ü÷û„SÛMÈâ9yñ"ÕÒbôq鋵oɍºÂbaç˜.‰›mǾ†D"¤ÕWÝ¢²[ÛÃ^¥§çÅ~aPæì;Œ÷†Ð¶CF ãØ«Ö#.IG'ûûö’ÄuÏyº—ºl’V_Ýêïb¯Ýa5…÷ú&ajV[ˆYr‡åç66²Þòõu`¯C”„Sö¸¨·YŸR\kÈ{9m±|SÇ®‚q›w5ö0>ißoʖ6K‹VËÚo-‡¦þr,.ý0½(Áý¶’âk¨úV†$¶‘oêX +Ml™r1ôeä[tLõÖÔÚ¾D˜Ìi±µx‡Iý û î 2hmâãôc=óÕ]βH¯JImߞè +žpÌh¢¶_càqƆ¯¯Fb´=1ñì!né m÷××ibbŸ-DÜN»|}mí¾~+é«íÚ½…y:̞À— ¬P7J’±ÕótB©cÛë ºÒ .u{b"£È“†ÚÓauU¦Ý&¶m&}³]»'©7{™>ëžÀv&ˆvuÒ ¬DVù+&¬Tc=°ÒHÀØÁ„ ïVæ:ęóÜðu«"1$Rºa®Ã.#t¯î4~öÀHaՋC³ütÅèRqrI>{ÇAáøþŽ ún؋ŠD«Ö²Ek<óì ³—*jö’hÓõðVÞÆå˜áyåñUwš +ozé1dÉõù÷z‡…­){o»¾·‰1 õÚþõ‰ÿúÄ}âÿ«O<ÅcDxeo‹B åƨ+å¨ræiÌ8å¨]Ö`Á³µ%e è’5Âì/ûÜ"Óv²1ã—JŽ˜­Mr!K8½ëZ, ¾ÈPO’¡ûaBf.AÃj™ïaUiþõ(OŒkIÊòHhùò½ ]ð¯üE‹w¹†é$áiíl¬‡lÍHXúÜGºFŽ˜aÌ©´'ŗÞ$ºSKƒ#WìRÛ¢×i®ŠMlªQ…ÖÁ+A«| Ô\içæ0©!â“Ñ¢ÆÚ½†^0ø¢Ñ.-E&än]Q“{ÿî*Çv%×aù[Åß@¿£yXÏM:ðÝú €”«ÊîÄ.H¢HIÀÁ“"¾é³óÂÊ!¥úŸTiDn‘uÉqÛæ‰ñ»óÐ8Àô¡šü9C·Õü ±ø@ÛȓùZ®Â쮥ƒ y«"¿Š%ÓSJû€frãJµJf+ß°o¦}`šÂåkähJ²ð…ÊÖZ3›¢Ør/§Øð„3{(v®‰ìÔ.õ}1Y̵«e±Fª6P8ª¹QžˆsL¯ÖÈÍVEc$u'wö¨¶_)Ú/ ÌeÿëÍo ÊÁùŽy㦶5ēùN.óïޓ +Ð}@ÂÈfõd-]#à¥Øsìâg¸@RJ5²-Œ•@Mmÿ12Ê𓭽ÿcÄ¥ÎõÅȃ«6k!3¹÷´/ ÚC<©ö0Ú«qÍà’3`£ª³½—? »ÿþñL§0Vó8‘Œcóš5™QQWùÍÐ-L擬’aK ~ûn\¦4+eCÆÐL5ösČ]1ëf¹äÍH%€›ÑŽXBÙeBB +5Bb·yžÙ 9£„ÐÐ`҂”Ycnë[ +ÐðÞcJ†¸ÐÍÊæ·Êª¾³'˜éèåÈ\G b˜/æ'°eö Xþ€_xŸõš¬é˜þ h1“3èS ë)N—:OÅbPÓ¨¿ñß*›Ñ7+ÒHÀëÚÎjpÁ$¬}˜Ì´m°„wT±¯™é†KÜy^<£ÂóýR=Hgñò¯7pz„£Ô#ôÁ×j)ŸžÈ2§5 O֝ée-i·û鶉¥E Ö@‹¯÷@ö>ôˆ| € q Ò‡¿ ¹‰<Ð9í«È—Ö÷]DÿþéHËæ kñü oœn—ÐÖٖ`~€£Â£104P&ü µp ÁvMû§aêö?ÐßË{þõè Ú°ÏñmÀÞh7Iýû@ïM"{ÕoÆ_XËaXßtÏNm˜s÷º°äU׀%óyÅ'TÃÞ¿÷lÚÊ{ù"Nç‰Ø­Y[ï[Z"Å* ºT˜IU†ú¬â¬Àp/M´`+ ”H™J,½#C4e$ :Mí_ÿþñŽN$à÷ Å[›(ý¯š# –N²x»Øcz!T,…å‘bcĞlÓ +xZMˆÝ¬çìo ¿ͅH¬Iz-‡¥òV@S¼©á¤=ß!è˜íl™SÒL¬å}äõë̹1»úsâçd6\dn±SçÁpèâÞíYô41o™¦aR½1NrFçÎŽ5½vÀދûë@G´=$I‰—+€=(® Å0‹4lÙë µø@ß(“æ€`Æ¡írŠš™{<¬e‡JÎãrn7ß<ŽÜj3#=}àʨ?Ë𠏳Üôd–¿#>œ$Òî íµêûé5B3–JHðÛwã²Å~ qê2¸˜Tc?Gt+èŠY7Ë%oFêUnF;¶6!wU$V€ñV#D‹zžg9ïÈ %„†àv’2kʊ-hxï1%C\èf¥|°’ûï,£Ù^½™ëTÏÅcç' œÑ[«Üçš¿¯ªÅÓÂìº"ËC显ô%F½¬’°™éÁ‡7¿7‡¾p{m6Qå<<ëŸC´:¦1Nÿ@£úiÁ ?àf}7†½æYÖg{›H;îå¨É Ù;R&âÊ\>Ðl›+×¼K@¬c¢Öwdö°7S½£° ¡(Îóñe›ï²À[øU[óðÀq/ŽW¨öå]¸°I=Ë0E’L…A’큘¢E~³XvÀ¶<—µÖ?±:§×Ù-0s[ëÌ^ݜ•¹ ̓c¤ú¥Ü¦"B$¿`ü;]sI$.¦7l+ zž"áª7K¢²Ž|SÇ®Ò3º›s3öçbü¶BÃ,ÇT/lY ‹Ñ;›&:z„ÍÕF”›B!ÓÇôC2hÎ|…½EñýÞÐñ!ýM-M¹ʵê!óÿ™¯vdWn˜ŸUx×Åÿg=*W9ÐMÞþƒ×9œ‘\NI!AħQ¬ï6Pöîð}Á"&UŒX>àŽ–‚ïO¸¯ƒ?‚;ƒæ\DvCÿ2ê K¦«ñÝ0:]ç¨wƒ_F=¼ôPϪæ…""$Ì&’ØŸÕ·’m-ë¡(gs¨UmÆ>g·øÏSÝ.Yµs„ÔßRYø½p²Î¥‚Œ£>`‹A¸·÷›s„i½+6øਠºÒdܱY¡öuý}¡”µT–| œÖrûo ø±——p5g¨œ\.ä ëÛÞaJ斎órÖÜÕèæ£Ðu¬àpRûÀÈÓ4p â,Rw­ఊQ7‡ö’ݞ>g{Sjd–5‹Å’òB.̧myït$µ¶Öq¬V ›[O[­«/v¦¾-ãl×i©­8NË£©¨ hÆÍ*¢~‘"¹õý•ÁT×FûÇiѧ,OĐ·Z!•FöÕíñ7km„™âõlO–ú]5|5‹iþÓÌgGeÊÅù-qûs4Ÿ l°zb¬·þÍÔÂC󗸾®y!µ‚btqÄr‘|AÞESNñ º>/øúÌŊ#-t3ƒ?_…ŽOé…NI(šÁÊډßݯñD‹~†ýïïq?kSóRûú¿¿ž66”š†ã0cý·bÚ½ŸÏ2Ú­Ÿð›¥,fAå8—­ÔBÚK¯iÒ¨"‹ÿ_n1»E·hqœeäÏ›êÿúÛcòÿxÀ®‚%Ô¢7»œ¾ÀÙ­™Xíx"êYÚTHU Ù}Q³²'5²æúÐ3Guje3ËÜ-›CT¦æê)f‰Ì84Û´%ù| WO ÐÄv†§Oº;\æŸ0Mv>z0v¦ ¼†oÍ£Íé;lÇúŒÚ CCÌS%4P¤x“€Î€7†ü¬ðZÏV~a‡üy­Ào‰‡†…u†v,ÉDÞ_Ð<Úy†ðëç²b­¸ì–†û=¸£m½]Ìh*HžY‡§ò·{ëÌÜë±BA}iXø:sIàñ.«¤¡ƒä”Û½†¾ËŠµÂ\ +n—Ð )h–K½ù{U[#‰ùÒ!¸ 5LkÇ(jÖËMÒ%I6(ٖ’Œap 4•föÂ8´ÏU¯dE˟¨žy’fŸó% 'yQ´¿«dx^è—èɆñOKë"–ÛN:ëºrn¬‰ÁæÒ$&d…|6g*V˜H,ؤ lG+‘TB÷·Ò’gRm`lä1¿&’Íó¨ÂC ÛìPÃM€~·aÍÖüY¹ÑEZa«4Ž‚.Ašœ¨°ˆÙب+IçÏã,Blus ޗ®)®O|_F_¹¥ýƒ Mí˜ÁOÌ8£û+ÎüM '¼QÓ¯ƒßÓµ—"][F½¤‰¨·NÚ-ÐÞë/)R¢ªI“Û ûeRhçßkƱü„AcEIñö×oÂîÒú ÙPa"{IM~‡ø!ŽJMÓG—ÿ€E^Më¥ê€FÞ¶Ñ4{ÝüÿpñD'Ȍ·£ãB4…Gƒ>;oŒ+ë÷ßÓ9s~ààŒ‚Ž.:!>*rÝ£qUÞ{Fßè¥nDêyoÜht­4¨zâû¼ð¸R!+bv¤°ŒÑ¶ÃJò™RÛa³!äFØSéx«[¿™’I7ü+Hñì{§£eõ†U×F¶‚rø‚È̶C…·uÜxšjÑVƒþÿméPšñCq—™ íIÑû@”í5bñ_cT´ZIÎßlavËg»s;U´·ˆ>…([¥#€âÇ Çˀ˜ó"ijò4«ó ÷b¸ ¥OXµX¾‹MÍÊ¢,‹+¦láÑZþ2z &蜖'=yæ 6>ÂñdØ6ÇØÿ׏W†0Ñý¶CÿVø?£XZÅyºýgò¡à«ƒíG¬*¬øš¿8•ß ê…¬jäÔ?1¶üóB¯P³²ë-àUø½%o;ùŸ÷åyB`µÃÿÛ}‹Ò}I«ù ì¶ãx¯ª·!\1o»¶Uh¿ŠK¤9ÄY¤IÖÇX§3‹ëQçà 4¬g†\Ç}TË»ÁXdõ ÍjýÀÙ(Ü^þ€új„M“…ê‡1KLCxÔdµ*(ÕÈ5q¥¤ŽéK9)+¥Õ¬BU|Yݨժ@·ÒWXŠtÛIo¾/XÖÁ¶xy鑜yQ[_7óšSxHFæ{bk$iprE< BŒa©·|¬HƁ. ëîX„6ëҀ‰‡“å>C˜;–’l#¥àq ÐÓ<®uIXâºYmà@ZŽ3…_tÄÌ×ÀÊÞ¿á:r Њ:{wE֧ەˆe¢ X+–Rð¼ÂëÆþbDø¤0ÿËô/&›ä¤ÈÃnùYúÎÏ¢.šW>öø³5µ½ü™•;=•ðªjOS^)Ê2â_$½]05Õ¤Ùk_?–ªjÚ±¨ñIê?rUø9B–£¹¶…ß £¦!UÍêÛ ª kñø@ud-%å}@¤…ÓÎYîÀoºëBjÈ1 EQe˜uõ5w« ©+Q7F´Œ9$¥Ò1Á1Ÿ˜sØX¸û¤õ¸VZCÙd㘌¶f'‘ðÍ-‰‰Ó®‡þ8 –=Ð)™ɼ < äÎ>Bøe‡Æَd´ýÐpáuƒ¸KÁ²ñ~‹×í^Èßߦa–- ŒC݊/páóÈèfGxøR€ «ãv-b9"¤~¬@Ə~hXøt$ˊ¥Á¼]‚E'f8]èì(ðXgJ[ä¬ïì)`$¸x&!õŠŸÓM‚‚œŠ2ªøe³sî›ÓÎiÝäZ1Pë¥acÁK¾óÇ¥ôƒ¼k!Œ Û_±”‚Ç-¸ÙÇ⃛"k›`ÖºïK_µ–\b{>%|. §¾ø”ßÇ04®nµ/³º%Án¿V 蔆ÑxºK’¢þ³T2äۓË_#] 2y^d0¥Ž[ #Ýü%‰jÑÑ +Š| zÄQ´®[ ò©8Óê6<݊uC´Á/ՇœÐy×Ðâ›7!ÃüŜ¯Ö¦’w76HÔ`А QÚþ'ã\Ö A¾Trü„\»¡¦c¸Ãõ“·4?úeý“à ÛV÷yŽµÔñ{ã öP„GŸx¯GÞ·/˜A`Ã@mb«ùŠ«Å'wt¯YOI6Bî{ÊøÉ:YDé›7èÍ%³8#'¥€–Öµ¢¢'˜Ÿ³|Òld,4-º®÷Ý\ñ>®­£ø´V:«qM˜Ã qíu}\‘…²ï;y]TÙ¥Ø!ûÁëû2Ë7ßÍÆòÿÓ]åhŽô:,ŸSüèþ´/çéd‚žû§IU¹ì—Ø‚J”¨…ˆP]ó¾ï€g¬|„÷·$4Î>–+,WÖí;9(_֯墣¨ì k8KUrÛ ¡v®Õã{8ëÖ¯¾ÿ¼Èý§áW¶úMm€¸p«V<Ù%¿a²€ñoB,?aQN¹F?p²’\Š7Æ¿ERdY¹¦®ª.7ž»W½_ä%É` Ð{NÙuó±D9‹àm2Ò:†Lþ@è9þ=8ñ iª<ûÌNñ_ÆmoØR¾Æ÷üC—‰•büÛ®ƒ'VgÇPûjH,¶ø|‚m¡šî½ä|ïÕA8Žef±·ÁmÓ²–søóg,ÄU¿¾¯ï9.cG6·;Þ`ûcjÙåLm£ciÿ~y*ëWÇ1YÏcÙw–“±\“Ÿšò¶B-–YäÄ÷®?¶ÏbÑÁBcýw¬«œºm…Po××ðËm_ýÖ܉s3Mòf¯½žžÛX'ïÞ +ž°« aǶŽ"™&Ë# Î&¢tˆÕö:ðçQZðj¶÷:äïUYðh–Bқ_TÙðs=12N×ð<Ú÷H_<íÆúQŸÿLß)OEjͦ×ó¬úuŠ䍡:$MÅ"ë&UÙ œåòP±3‹š2yzŒ§,ŽR‘Ôá¹Êé×°€§ZåP¨ºƒ¹ß/–sÊ ¼†‰R=Èö¢U‹’Óol-à³À@´&¦¾Îɲå\<é–½’~Cæ’öÇ©€µšŠ¾Áv–†^JêH»;Jf‘|>»·‘¢;ß| ©_ZPÏÄqY[Ž²Þ1Èb05·9À¦sh+¹•¹pwŽËöZï‡+XEä%½òÝ®c ÐôuŸ =Â,Ð9\ÇHÈMG/KÄrZםðxÇù䮘Ջ›ÐˆÛîÕ-[Q«2Úìzï0½²·7³¾)ö͓já[Yc8Gp/w““­sGlÛ&¶#ø=«›D;î›(*p0}¶x¤oÛ§š®8^ÃqcùL(¦œ^õU#o.½å ßp¥àâÔñÙðÔ­ $±Zß,'5ÜÓf²6׋\!ۇä‡ÔLÓÌ©k ,ƒ¿eۍ°RyÃÌ9L%(æÀ¾O¯šËººÚ;Æ©§¢Åê*oƒÌäŽü«ç¿xó›ÔÐøF +nÖNÀÚºÇ15I7÷–Ž±Y½±ìMEBQxéN²¿i­àÈv«ã$ów1Á–y>à‚b\Å"Æ> ”u^ß žåAõ*„ww=˜&Kãâa¾<ïͤPPðô\Þ°=Yäö$¬…8,îš^ýÆ°f|¹êzƒ6™S3s1²_6f6$Á Ö߸%sˆ²h¹(øõlðßÉjϐè¼-?lZàêöŠÙ üü±…ü“yàF7çDµ–ÖÃU"$n× OºŒkö­b^l¹¡o”;¬ \Þíww=QýÎkóò#)]雹áV7µ­¬ Òk·âfW’tOrxX^HÐÞVqR«h>EÊÝ¡ É}-]ê¥é\EmfZHoˆŒN+Ç“Ê·eJEHõ;ú²Ãçƒ-c‚ö°eS¢{(F, hÎ÷Sä4Á¾ÝÄì¦ö½ÏÁžß[T¶Ôò?RÚüØ ܘZî3[Ï_ŒJ&…–5ÙúXÅË(#MiÓʞp¯YZ=)—³§Ô®¹ƒËtæšÅŒ‚§ž$§á<š,("‹­áŽµf¹a -Q“U-³ß1µÎö%­ïkk†¡šåcGkE=—ͳ9²tï™õSDZÉ̅íÿôøÒÇæ›÷·Ž¬øÈv>/•Žd§3zy+GrF¬j• êƒ{7óBVɼK>´æmÒE5:5M c¨%NµáݳOdmÒ—0”.–ýXÃÅ[Ìے“# ‹»SAãc’@+aå(…æcÔfE¡’ )5üb›ä2†l}3¯Èa"`¤N !‡5&‰Š,$ó6o,VðPI4,ûDž}=újùÃ^÷'K͋o"în…K°¤Hk^Žö„( ÖðÁe?!Rc&G˜ýIÕ絟/³7¬c~Eî"Þw} OR1W¤$1Þ+RÆM+ºÚH¾¥&˜ʼn\øq/ç$Ë_ Ë\”1í"Ãÿ ŒJ·ÚX[yŸ´ÒÅs“éJ~éH€a¡¶Ï¦aË^ª©GÚM¾âåôÂÉ֊¯î–[¾8)jY/N;ÆYg‰ ç¥q-cHõ<Ïׁk=vÎ"‚@C4J+xSVLi@Ž÷ŸÌ7zñòǐ"{gsZ“è×RÍcç'`¤=QLÔ¡OãßOBŠÇ6¸é^Îáí(^ô;¶d˜…†¢?M# +¨¬G'Á|šRö6­,Š/Y ¤yÚͧ24%ìêV2Â̕»·Å>ZžÈŠÕk©—„†.î/. e­Xõr«t£KµŽÓîëH(—jó;K¨Å×K¨u(@*âEýÝ^z(½àXÇ65(¸VÊm‹lÈCy†=‘#’ªÚP%I0òL1gi–<.ˆX"Žï»6Ÿ£çuz~_zè™ÝwîޘîÔkÊêYCœJµÜþÊä¾<ð€¥­ç÷¥§‰hU)V>ô`³)zlæèù«™ì8©ž†¯=Ie^î ÎúÿzZµiû؃׵Kx”?u4WhçdÞ:L¦„à€ÒYócO SÄ:®…ñÆúØþ¿Š½mm*žr¼Ý“1¢iïô19×ÈBÑÂË(pVý„ë˜1ô4#²uêåã†TšåT”4’ +ß>4þ•ñÖ(Ä.)·ó$Ù×±td³…ÕJˬ5wŸg^CJÆÎÂÄáݨWÛæ4òº9îp —ž[¼¾ëYÁ¼©yž¯Mº),rÏSUš¸4Ž¦Fy‹ë×XÕ°;d†/ΚÕبᎺòwèX&EôA$$ ¯U‡•¡%ù˜Õ|gfŠ¯`´¥£3ïÁZÕ-Í¡»³wߛR'Ɩ·fÓìÙoè,²Í҉&“'6i +å‚L¹W|£O—•£3çÁZÑ Ã›W5¶jÉ>Hxµ‡¿Txó%·ò@”Ó.™s^Occ¡'_#zZ€«Lã÷:Œ•\é74Þp½i‰¾ê;†(.ªùÐTÏ5ú‰ñnóº­öÀ–.5ÝÂ3e»þ4v`–FiX0éý Ccûã¥þí°ÈvlªØ0cÑ ©KЖa¡Ëe I]ÿœâ +àlíïØô›Æ—9Þ1hÿª¨*Z¯±Ol[Ž+Ì  ƒá8$-’t|æµK„ô…œÐD%ç[Çؒ  —Äòn,$ÂA¸Y¾:üù3'W;à4&Ÿ°è³cøÕ±ÁÃa=¡MÆ5»ÃŸ?±z|¿œ¥õÃw;Һm&:à5`2_ûZ÷½þp다ß^H?ÆÏj§I`j¸¬'«’vß˒ÌòÅWÍøá9&Ÿßcй©[Ö½ì]ONÎv¸úƒ' öÊ܎Žö?«eIŽÞýûv Þ|Ï\|èùÿë*3ÕU=Þ Gx:)@¤Tªh 'D8ìä>Ü+OjeøõЃA4u1ë,<Ž f9)WªõøåÏÅèrß ¬…¹Èf­X<'û¢äîé¢ùöVa#Ö$þûúÕJ~^ *w*‹²häŽ5´’ÓüÄÎó¥Ýh*zØèššo6zßP»ÐŽxä:@âè/Š +ÉG”I暞ƒØ÷µ‰ôaÄÍ/Û棆Ê7ˆÂíú“ä].|A ïÐþ_+Ý*µw„RbQÖú€½ÌÉ­à¨%ìXýĞʤÿtýds›Y8WGìû—&ê~Üé:Þèþû̃ÄkŸøÌ-ì>ð™5ᣠ¼.7Ÿ÷?=]†·Ž`„è»î'Îkÿ mJÜ[ûÀpgú¦£¶÷¯¿Q>^ ‰<{r9ºÊé.&FAå¸åª¨Zz¨žXÃR•´n󒕵2ç×ÔJ\à낍±ô¼5]Wyå獞ïd+ÕOœÙu*;¥ûnØxÎ3ý„Hƒú—Á ›Ö6~½aï¶ôøu•Oìe[ýäè͓Uͦ²ýÄuØí`w ]՞ÞnüWÁJf°B.*ƒ¯–{E¥ß±.)ý½_#ðyÏåþÌԞPóÚ¶ðL–© ŸmÉ£5› +kNå=.M?ý|e2’¯_j6nf끼—•ï~G Íbgêªâbÿý ¼câî>Œå- ¡f¹¬ CMìè°Š-Y’ÿÑ,©¦ `K ±bÎl ¹ÌS¤÷½§;Ë47 O´ìæ%jJ»,|oèÔ™ðó귁hó®Œüè8û^·Ñq;°çÄ Ã\é.–|ÝE¥ò“‚጖Ýý:ÙÈs’‘ÇãÒaˆfÜÁÂò žC IMö’Ô÷‚P™-f¨e e6z¥±ÑjQ®jg/‰™@sõ üiÔ  z&—*nî5ùÀØȳ«cWE +í—Ãfò#+ š‡Í«ƒY½W§Ú]ĺ#G“ÔE¼7\˜ügú‚o”É©{CØ>p +õå½âÛO7¤®ÌY~ÚzìÌmXkOX)08ÙÚxBøY4yÌú ÐQÎO˜~ê`ÊDQéªÙ½_‘zXS#SDUbúû}”X#_º&¥.ب—8+´ã\,ü®Áçx 'ý {‰ŠäŽüÒ)XݗVHDę–?Ш‹3ç¸ç–1‰ï;rؽ‰Fïhû…̶Úç áÒúªC-NÉ#éP"ÕJˆÀ©ó+VBûP!a[ŠPG|ó‚}ËŠM‡É…áÎÍÙ¯7çWJT‹Â␔ úæÉ4s,ÒïkÃÀaN˶+7G9·4ĪUJwϟ6¾.XWD2Õ<Ñâ9\ÆžÉېàGpîaOæô›†ÝØ/;Sûá'p >ãe<°‹åa×ô<2樼tˆàÆ[ðK²º1’4é­×bÄõd,¿%ÏÈ@#ÔáÔuÆ Uš)ÄiGH9·_gŠ_Iº²>aNA°+Ù†Ï?]°Ë ª¥uçÎ7öðÚ7LPƒ.ø*Ü~¹$êì=8>=¤ötþæüòøËSº:0°ö €‰°°¿Üîö¼<<ýP6ÄS>Ó7Ô<.™Î÷ì¡WÁÝ%?pÎNñµq¤è àåõRx™ØÕüÝ~é×¢Ç:‘ÆU§ŸF΢ɳý8°-_k>Gr¿ø+Îè +)ï zcWô +Ù(Á¾h&a 1"±Ã  ã=ºrŽÙìI –‚…ÚrÜÚÜ3œ-ÉHJ¸w'€6’ +ÚñÓ\ Ùàk¹RëK#®Í»{’ãͥ𰞷Ö9‚ÔÒá\ó‘´ôÀæa§‡acògà1}¤öÏ[s>#Ü£Ý ß8¶Ø¯Â~ƒ=r×w-(»‰ •SÞNÚÀ“ÁOú/ÈÆhR=¡’9?P Ì•º¿ÁãµW5Šú¤²Éãä& +¯¼Wok«Æ2tV`”ùÏìQ5¾Šèº‚,nHSômst2Óa žÃ6<Ì âû×ñÂFˆ‚¹Ê'Öô—\zÂ8ɾý<“ž¼çLç4Á_Àÿÿ»°Œ™w!±ì˜û{a¹A?v[»²ð×ß]JŒz*‹ ÔmÞ.õ•zԏq=ޞìߊj’”l^dYè^â$Z6‰„&LŒÖppc\fWýGK« +4L·7£ŠŒiªn 3K¬–ƒtÉrPŒÏ8X =‚ë*6¯ª «`sû/ûÕ²#GnïóýZñý8ÛðÖ7ù† ¬Ö¬Ãþ¾#"I«zVFéd@:LOE“Læ3RÕ|~?ª9¦µ:ªjýé „Ye8%Î +‚,+œ*7ŒÌäàö‚œ#;,lgPb¾A€§øX;°(Ãf댁!1µ˜+––c‡Ë=쌾ßk`ۙˆ3/uÆ4´_Ê÷q6¿cûXã!¾ð:n½‰j'k¶Ë²™m`SP*¬¦à?©ÿ<¶¬ ±Z˜{Ý*;k t1ñÛ32×qÀ›¨“¤ÍÅ Èrç Œe F(À½'²S1à%¯ÕP9S3§4S"§È -ê½ãáÞȬá[òÙ¢ZLØÙÁöFVü$QÜ*ëyh:ªy.‹û'Ñ(Ö¦€}ĦõñRº*‡Ü^¬cÜc/]uÖ‘Øp”oVƒÑþvƒ’»²?«’<{ÅÎXi +ûÓ-ÙEa(œUN¢¦JVŠºByÀH2j'—w kº†JJ] mµÁ@Bn`)@H·çÎô¯®ƒd¬¦†wNìÇ)V´Îˆ¤ß•úýq³LïWè¤"NE«j‡Bm*å~th͚°¹ÿúˆ®TÁ…Zµ•‚¨ÇE“‘‹«ŽM =ß摆MÛ´$i—I—ÎBÈ%&“ÿ`„kîoHªDÓüjzJ4µ^#Î F0–-ˆ¤¶5¼´£à®ªB-YöΚûa$³Æ BÎdG>m¤ûhÇÞl0^‚ÜÇ}ÈXG^‰p…¶ÔTêD娫&/÷æX&rê‡:Å`W颥b¼B$Lã+«Æ®ÅQCä $áZ¦c»ªÜÁKÑýdϑ%N9 +ñøõ”1¨c˜ ÞCؑå~ãCҔèÈÜÑUhŗX\QÎM¤4öA<4›A®ô'3lP"9Y‰DÖd9†ºÂÒàç ­èŽ4]sь¯WìzÑRæR\۝Õ0%Ü»¥CI…‘½l>á\Zj´Û±¸kÐҀ]ÕÕùͨá2àlѤŒEÙBŽ ä"´†,iz™ØM!77ê¥Xc±Ç`áb–Ç+ææԐ@’êÄæ% !{vV8ŠvIl”ëg†/¾M$ xÒüjJLÉ©ÝóÅƍm‘6F¶z¿#Æ¡$Ç@ ™Œèˆ‹6 ¹ÀÖ=Ó ‘MS÷ù¬V_' +Æ©!"BÐ-^jfÍ@2Æ·¨iʄ&é·í2Œ¬AðƒtÏh1k• +F.±=_ RöVÍÁý-¶ÑÏgê×C™pŒ( lά„šœg!d|~vôv4|êÜÙy¶Yw@¶ê0ÎA2ÏpæŽÇ— kù§î@èÿ‡÷ü‘ûíë=ÿ‡Ýÿé+þ¯›ÿãîÿÒ·[„s„o €ø ÐÎÐÎO/ð€ôM෈çˆ_ €£/ý‚µðÛï=(0¯ ù‚¦ @Éå½ì~h*$(ۈ˜Fùò‚!óiâÑú°‡€fX#ù  j*_ß× #NµÙÏ¥¬7y½‰d·±`žÈbžX$DÃØþ&:cîÚý½Ñ%v¡Ë‹šõ¦¢ öwß,¡†Ï￘'2¯oxƒý IïX—M6H BܵÇ*ìC֝œM‘µõ±Gë&ãjÕž“"ÇÐâe·–½ÎH–x“s¶H9Z¾y\£å»²áºÈÎÒÔw”‘*a,à É7©K×Lُ݁c츓®Þü…7à|{ºÃÕ|áz2EZÜ0ÐÚÂO¹3{;4»>ø_Z/´l{àá]â±Åô7ò+Ÿ½0ß0‰Žt‰ 7 àš0û6ÿpœÊ +‚;A$®7 !¥«Ù×1™ø˜æ7T:N&•‘SÞÆºÊ + +bÈ´«‘S 5íaÓ䨲% bâÉS4~ÆB|F¶tA?)\‹“ýñ°³ŸÁt,èºÏjC _³‘îÖã+¶åŸM¥+tCQBÆãZtm]14’cÅ!–^æÎÁïƘzv©b“H-ü¬oÀÁ†C¹©H7GڜOœlÀëM™ß&ÂoÔ\TÅùšØZ’¯ 4¥qâߒZá20uH«KâCŠ£Tösˁäâê×GSd +nJª1àæhaѼFÄà+FÕ÷G§ÉH6ST.Œ8¶Ãœm߬‘eß7½ˆt‡ì×GvØÑ°êDó²†Ðûºú3¤Ps›;ÐE[\ß°ÜEZÒníXÈ¥ÜSóSÐ$éÆu߉ ‚&ÍÔwâyÓ´Zm²J®½bì_¢Ù'‡úŠ2¦û™sÏضcýc™ ÛyÌñ¯ëRع0Qx™8uç£ÜˆÚÕ§ëÉgàhåD»LüO¥r6æ¶.ÆJv‚žMOTEba¹gqj~^Ш£°¯ñ# ¯³Îx­§Müâʚ˜¤ÅjpًsyV{d”û6B™Ìû‚™#¸²?«`©Ð_°–uU.UN„6„º#mÀzÃÝ²Ç Î Ó¦åÈ*)Rêm« ãêKÖéÆ´J¾¸aGµ O¨!Åkµí6„tAJ Ý7Ëô~…N + ­ܪJ•$Êìr£$XVñŽëci<jÕV +¢ß•i­ûµ©¡çÛ<Ò°)cb›–Ï9-…ŒÎÆtS~ÉkCR%"˜æW֊¶$šZ/è¢.(Á`-{قHjëPÃK; +îª*Ԓ`‡ýÕÌF@jþ€1­$9“ 6®„L÷ìÄÈáU'M•|–5òÊÊ|[j*u¢‰¦®ÝtrAÑ!ÞtrAÕñnìTÂM'WÇ*êo:¹žÕnÚÐ*6út‚ߪÈâ”ZÅÛ}E +1uË=©ˆx,­çžb¿tïoJ!ÏJ#¿%…œFßÌ7¥P?@ûëM)Ôª’o> *–”ÃM©ÆIãëgáÃ?ð÷óÛǟ?áñ žÿö׏ù-=þüï¯}ÏöýãŸðöù§>¾<ÿuªãža ƃøŒÅ%ÀÃɯ–$Én¶¯Sä*Cõ=O…^”7sÿÅ ô>YÕc;Ü/f•Â“R¢DG{0NÚ¬òO÷q õóñ¶?äÑIéÿóŽÈçÖ2ç6qÿ×릷#K¢ßI(u–MFÖg…ª\Þ±›¡À¸Èÿ€§©{å•7‰?¿OȽɋƧß&nzÝò~âݜÃÐ×­¶Ä¢›‘=dñ- ¬ldQSïtOE~7tŒêñý€Ÿ¸ZJˆùìð!»ÙwzÓ¾ùðžësÖøOyNTŸï¾ ¼~`ƒZµÐXŸ½˜e¸™NàÓÖ'kûúÀ#¡¨ÛeŸVùY¡£±²Â†6÷3Œé>­¼”x ò@Ž\¨Uh%#+¢˜pÅVÞd½üÉÿ26'¡Ô íòõUUd艂{V-Of ÐòKÁÎÁ8YQž³ð–Å&©ÓÃãþ`¥T¤=ÆY¥iYÓ܃‹YEodÈB7匔Å˨.¶*ñ[#d[“§ äFr™,ʞòòI;§(¤E¼Ÿ[Wˆl;êî³ia™¼›ìp7]A°¬"Gez°`ÎuÐÀpnRR't‰gåf*ð~áû[`|‰ú¢ ß$ëà]¼tɆ@]|SUÃUWnƒ‡÷®L#+Cð>ÃÑuþe(-»ëÙ*«‚EÿØó-²Ÿ¥‘ëHƒ~)³­2òvmTÐöƒ][t7xß/_†xÂýĎÒȖ¶æyàaÖÏÀÅìÜáÀqFücñ+˜Ī3ܑG4:.Ö3ÂùU‹&°_"D¾ ~¼&¯ù󎬒¯wþ¸×˜Š@-ˆeÊ«I¯]ÕÄ(’ÆȕÎ\LAݨ&%Tµ +râ‘©G.Á0 סÌNc±Ê¥%АQälÃ]c¬ø€³!¶‘Ϩ»YÉ2éÈ.ºà^…²eNA®S$‹8iAcπÈË*¦ë ¡Cu›Æu¯¡R¾ÍˆD¡­rµ pëÐ@ñ@S¥€bªçµ]Œyf©õ˜é +mzgßZ Vȝߪ¶Ôtã¿FâŒkˆ°_1ݸeµþ—;)ÒꔋxRšñ–]åƒÜ‘Ä»P¼@E„ôÿß²gÿjÙÛSÿ@Ù }÷³ëžÿ{uÏfÙcÖñd^'ƒ/ßÊ^š~4"Õgô°Ú¼ÂRExp;±ýIsl€aԎMñpvÃÁÁ/TF¸¿6=¤"OÅeÏçFaajǬ©ð«jD©¡ªó•%>[^™Õ‹L(ʤ©8Ô¡KX)IՏcÒNÉz€¨žrn@ÑÆÑá8ÄÒçžÜ0IÄ«Œ(R¢"f®:#êqڞã£çšQ#]Ñ\ÊR¤MgÉW³Æ&ÒÖ7žíèÛò3r§™‚!ë‚l‘¢ÑÞ±âˆ!,Lߌx¦O>M_ˆ=ÿ冂·HO*¤s_ˆ¡ z¯jkº`ÕGÄÑ2Qe]!h­ŠÃ 0i¥ßo_¨¦ˆ[va¶›ÍÙÂ؁?Þø¥ÏyYAÝåçœÔݝ_Ü°VØnÕt)ƒ¸ší3˜•øâ=VÔ´p²‹U?ÞN»×Šã^ÿe¿Zrìȍà^§è HÃäŸ{óñξAÃð,$°ï8#"ùŠõº%̌Û0 x¡ãU™ésúÕ>Ÿüõ®ŽÅ¥ÎÜÜ”ĬÿœÄØÿ5æSA"hZ…½· ¥VìnEÝÍà6ˆ›7’š’&»oê‰Â_Y¥íÌ ¼»mH¦Êw!O{ÿŎ%°~ßëcWåAýè)ýÍæ{¨Úó¸0îÌkÝ5Šú£’}d“ÁYðÕMÔECt72 +VP™‰E»’‘›Í‰HšUJܯÜkÝ$aÓ-¯À֑BТÆý œ/ÚSO+œ´ú¢‘öØ«zMö»”¬ZCÜpÏGÿ’2KÀš©¥~…È6cÂö®f°±Ù‹7¯ät×£µ$˜ôßEMIŸ«^4#¿ºÔráŸ~ OÃYIÖÉ÷ŽØÑôFnâzª«ÆK&M~…y»Šˆþ-5^ŸóÞ*âåy? p,åļϰ$i&íE‡K1c¨·ë—¢r+¡Aû·ãÕsŠcê½\$4ÊÚýö‰]aˆëc§Ñ/ +ìÝy¨"ÉUqÍP÷1À‚Çïç·¹ÎUÎå÷®â}—ó?úéç?ûðŸ>þ˟~úã·ùò‡¿ÿèùŠçWàl¢Ú|éÔOúiÎ<Âò=ƒÑ3RX@ýìX•3Ó'¶›W«…u¨TDgv”ºM3j5”QòÝYH,eåÁ$ ',/d'Dü0\æÛ>[ñ{dÓkÎ;àŠw~qÖÉÇh!¥ê;œûrágpCýÄ+ßG “ܨö1»ßcêoðcƒé>«áHÓ%ÞW6g…ÚÒÙq¡œiR¨ù3þœ![™+ÜÆÖ¿€Ð\±KGë|<†|(`ŠH—ҁÝi¦@R°+Úqš÷‹ÐiìÕó+Ù9ô+MÐú:ajX«»Å4» Ïè…)‰=.ìcÉyôÂvw…wëPÔÔá¸(§Ùïί²/m?s Ðp‡4¯^–wˆTæ‹iq#†$ð‹ÁÁ,ÖSF ç;´­6`þ ¡µQÒ»¿ä½Íé燳‡÷S/OŸíH|ø3n§p–<¦ZÏàáy¿nˆx*•ýõûÉÔ¿Ó`Îñ0t¨|ð€aq"–ìQŸZš hÊ:ÂöÆåÎhmýNJò›«nDù†•üucX“¹ÍS¾ Ï•kÀÏÚB=ÂñáZ›ì*Æíoyه€ñ9ôLÎnm`°|Âál|š¸œ"÷TK5¼xۯɊn¯Á^É<M¾ÛéíêÀ¯„m¿‹Cڞ&é~öIÆLÀ¶Úa¿ÍÔµ´-ÃÈ#›ÕºÕ®“Eö—Ñg¥ÌÉB¨•¡jŠX ”ÂSûÆÖOTõœ i[QA“°êh >°ñJRjcÛ졬}ÐÅvúÆ"WÚñÒ¸dióC´D«³,x;•n¢‡™™Å}‘ç¼Ñ¼B’5Ìoª…ƒôÈ ±û„Wš+¿yèâ(ÁŽc0”"~ÃKË/BcÑA{<Ñ”³DŸ±Š8cP€³·ÈƒNKSZ&wÒÏ0«Ñ·N~’LÇK6émƊÕó%]…:~˜ tÀÝ-¸~`¦ÕÇK|…Šù8䢥ìß *£³(šñpEuÛ¹ot@‰6:1}jò⊷„rVµ ±šÈ« §¤Fó ; ”$K\,§ùPŠ'(Hfæä¿#|åÂW(|õ× +_ý¾ðõ¾|¾ü$|ùw _;„¯ÿo _ýXá+wá+¿Søêw…¯WøÌù5ùÖ¬wÔк _Â:ò£cQrRŽ%Ÿh‘0ßF÷%ù[cçE—;ö„…I~ ‹sÈ +ëÛÖA-ÒAÐÆ ¢d·ã”Ì9ÆØG°®£=izŒ~ysÃEÄͼ·\æ±>ÐþŽß`ÇØßùÄóÆåÆå7°À|bucv°@þ. ̓ææ¯$‚|Áú("¸3Ayb‚vc;©Àî\`ÿ5Ün.¸ž\0_néñÖ#r>Á;\€ò¨1˜©Õ¹ÊpGV”ÿçO=’-égÉ1RC ¬‰t¡È°v<”ù¤&lÒØäb¢•D×À¤ölîcl`¬¾øpòž$e>CÏ°žO˜*#“åûÌö îr¯¢}Z¥éª( 7_αΞ ÑòwqA©Èò¹íaælk±ºl!Ísè)^¼š€^ÚJïñ[.~wàd緁úz„ÎxÍMRWubÃY1ÉÊÛl ðLâ+±Ð˜…fM¹Ä¤ºÛ  gºžÖ¥iD!]q^cU/2‰V§.¶¤µ—@ìç^³ŽÒ}ÆÈ¡!œdTËړ¤7Nw<ƒøU,ËÏeEH©…¤ÏšY?ÏïÍ £é%i}úvüÎÏ*+šÄ6Kɚ$ÓÝê,ZhŠÐmە5¸-¤&{1c¶ÈáÂCº4ƒÐKވ³ÖjÇÓ¬ +ÕÂCÁ›!°Iûf&‰XÑ cª_>)³Q֞^H·$C¼­º»UÛF<{õò©í­h±^Tëïrž¤ ¦¶;5y ¸Ï@6øl 6‘¨/ÛKâ(¡ZlL”ü-oÁ{E2|©3Ó¨€7zŒVÖ*´½I&§zA ¨t¬ígFeፗÌvª_õA¿Ê’ȍ´¢êÂç]—Lc…±Â[J@X’E"BÙ£”Ý*R«ä+2…oѾhŒ£Pýԃ 6E<ù™¤Gôé»®øúò¿ú;§I«~»žŠÖ±r?[µì9Ú·gÅð­çÃ'ø*©ÏÐ5m‘sž{‚F¥}¼ü¥o8ŽÞs˜þàÍëÌ)˜'#Ìcä.…~:“z"Áý¬½GmûåºaLZ«4æE-Æ|­¹¦ì'ƒOJ“E1Øw[‘,‹Ó…®ÁÏ~šÃƽO¨à5|(lf5œ‘ÿ{@Ëô¹“±´Ç…gK Ý Ætz¬aª¸lBžh’„¤1¨:rÛÏPw¸C˜KšlÄFUÉÎÅ:..Ÿ ¾ èòÌ5tPý©’ +ךè“d‚X1¬[» E“9`•´Üã yø´Ñ²,u§ùÍì‹Ú@NÊVŽ»…%Æ,± $餤ã"R¹ž5–sS·IŒ[ìbØä4Ã]fZô-…ÿb¾Zr¬†àžS̐ükֈ%§xKàþ[ºªÚ‰Ò 63©Øyî¤?UEm˜´VÒíN¼õ½ÁÀF²K3½#„ˆ"]UcEj™Î¯†ü®ì„¬Q²jŒ)Ó<ÕÕB¸³2Œÿ†m"N3|攴“ hK¼ ’ORï@ü²V6¼NL«nÈ#L® *{'ÛSB=Åê†È)å¢ÆÞ´?¾Y ¦íýX\"hKKý.ëY¢5*HR¼ U»ÁÊckm–QÖ[SøÎpL3¦G2£TÎ +ùÖÊ!"u¤jK5­ò‰#‰\‘êzb]/¬µF«ƒâ°)-¸çæfMg,ç„64O" +ì¼cþfÀH:p´¾¸žë…ø~üÆ8Üwà«®Í XF%÷æiêû„Â0“€# a2wDÂz Øs‡^©qàþüÒ¯'QóvYý_rMûk®±“kæ;\SO®©O®©7Áäóò¸&ÿ/\“ŸkÊð~H¨«™‚éx$4.Å]園rքr[,kF ÍxéëVÙöÏ&§¹á·àªØ šÊûgpƼÏ@m€°n€Éô Š—ù Ã!Œ¯æ¾ÈQÓTO>ƐH z@óY5Á¸ÉR>PJ×@ӗ_Kõ(éœ4«VXÓI؂ÈÈ©šÓ‰ FƒãK¥B˜[­'fUD~)ãтqZM&ÌÖ ˜×@™*€-×cØnl«ŽÆŠJ1‡%-^M–ÓÑÁœïYǬÈg­ã^3í“2ÁÁÇP Ë#ÍÖi"Ƅ7Èúö#¾!F{åÌN• $™¢Ò*iN:ÀÐ@©}”sTÀ£<^¿­ +íƒ`ø†ê¤~?¼Eâ'D'í¼gJüeQŽÂôvÎ(PeŠÿd$Î' sûó—ÎCôÄUßèyÇkÝlRUیë#(VT’ilÕÁŽ‰ wÜG’â]ÞAÍëŒóì’>§Ek¾}ýÐJÙ·¯Nù˜Í|ìù!íAßumr㒠6›Âœ9·{ÍÛ±I¿°Ü[¹FàÏ=uÙ{{>ùôæQþ`@¬·u endstream endobj 312 0 obj <> endobj 325 0 obj <>stream +8;Z\76'?jC&G2q$a:31sIrS6R0B>:aHhbkrW"B5cK4:#"ZIu3W+@=g>N*_@DFCF$C#C*@U\Jn9==louQGYQmiZ_&1J$=RS8)KAl6KNXFaBB@/.)Fsh +N'SC9c.AXY6LS:\Z]C[ildK:q0nr\5?mdI7r!MbI3p'tUf.J&K8CZQ>N]QM$@#U]m'>.=`Y?:5W-Q.?fR8$^VsKZQ7_03j=:r#(s&50%0"fJ!W+^2lui<^#K*HW`_^E\``W'@ZOM;hWf]]: +4b!n%>ao_CN7d;*;5aZi6m_/7m71&!%Qm4jic+=1;0uP!T9Mg8SAFrU@FTh5Wi0&L +_!A@gZ5KW]c&F:Hb\#[$S@m-k#bXdj'kL@4'O(6.4sLLGEp<\rI)OHhlt"3%#&S+Q +gWG:\FaP:u4=7Km@_hq*?R)inZkJ,?de4PJkP*B5j1X>?*,r4S<*mYsBZ_[M +"3k!--c,Q)4&qMaQ$p5:%kejr4rUdbkNKge,;[.lrLPtD(aR@OJf[Z66/23!)YBK@s"A"Eo=B@[@.%L!plc;)[").d +c endstream endobj 313 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 363.7622 185.9284 cm +0 0 m +-0.011 0.007 -0.02 0.016 -0.031 0.021 c +-0.625 0.354 -1.375 0.141 -1.708 -0.454 c +-1.896 -0.793 -1.903 -1.182 -1.768 -1.516 c +-2.082 -1.809 -2.393 -2.105 -2.696 -2.414 c +-14.013 -13.91 -13.866 -32.471 -2.37 -43.787 c +-1.266 -44.873 -0.076 -45.868 1.176 -46.763 c +1.145 -47.224 1.371 -47.684 1.801 -47.924 c +2.396 -48.255 3.146 -48.042 3.478 -47.448 c +3.809 -46.854 3.596 -46.104 3.002 -45.771 c +2.612 -45.555 2.157 -45.575 1.795 -45.78 c +0.612 -44.931 -0.511 -43.987 -1.555 -42.96 c +-12.596 -32.092 -12.736 -14.269 -1.869 -3.229 c +-1.541 -2.895 -1.203 -2.574 -0.86 -2.26 c +-0.354 -2.355 0.179 -2.13 0.444 -1.654 c +0.559 -1.449 0.604 -1.227 0.596 -1.008 c +8.005 4.926 17.993 6.752 27.089 3.706 c +27.145 3.343 27.356 3.007 27.702 2.814 c +28.296 2.483 29.046 2.696 29.378 3.29 c +29.709 3.885 29.497 4.635 28.902 4.967 c +28.429 5.23 27.859 5.145 27.479 4.8 c +18.053 7.964 7.708 6.101 0 0 c +f +Q + endstream endobj 314 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 365.9072 178.7496 cm +0 0 m +-8.689 -8.828 -8.577 -23.078 0.25 -31.768 c +4.488 -35.938 10.117 -38.223 15.989 -38.223 c +16.389 -38.223 16.79 -38.212 17.191 -38.19 c +17.298 -38.381 17.455 -38.548 17.66 -38.662 c +18.254 -38.993 19.004 -38.78 19.336 -38.187 c +19.667 -37.592 19.455 -36.842 18.86 -36.51 c +18.266 -36.179 17.516 -36.392 17.184 -36.985 c +17.176 -37 17.173 -37.015 17.166 -37.028 c +11.178 -37.355 5.365 -35.172 1.065 -30.939 c +-7.306 -22.7 -7.413 -9.186 0.827 -0.814 c +8.821 7.306 21.777 7.648 30.187 0.14 c +30.01 -0.408 30.238 -1.021 30.759 -1.312 c +31.354 -1.645 32.104 -1.432 32.436 -0.837 c +32.767 -0.243 32.554 0.508 31.96 0.839 c +31.662 1.005 31.325 1.034 31.021 0.948 c +22.155 8.924 8.449 8.582 0 0 c +f +Q + endstream endobj 315 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 662.1581 147.4655 cm +0 0 m +-0.476 0.265 -1.076 0.095 -1.341 -0.381 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.952 -28.969 7.553 -29.444 7.818 c +-29.58 7.894 -29.726 7.931 -29.871 7.938 c +-30.878 10.299 -31.418 12.859 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.386 -11.452 36.65 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.24 -12.812 36.226 c +-17.982 35.97 -22.797 33.818 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.476 -30.785 7.437 c +-31.05 6.962 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.155 -27.734 2.472 -26.221 0.981 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +f +Q + endstream endobj 316 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 642.3364 139.5495 cm +0 0 m +-0.363 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.252 3.02 -9.758 5.485 c +-14.59 10.242 -17.28 16.596 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.041 41.382 c +-4.466 47.047 3.468 49.755 11.33 48.736 c +11.409 48.525 11.556 48.34 11.768 48.222 c +12.244 47.956 12.844 48.127 13.109 48.603 c +13.375 49.077 13.204 49.678 12.729 49.943 c +12.287 50.189 11.742 50.057 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.703 42.034 c +-15.633 37.025 -18.318 30.396 -18.263 23.368 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.818 2.273 -4.809 0.338 -1.46 -0.956 c +-1.429 -1.267 -1.253 -1.558 -0.96 -1.721 c +-0.485 -1.986 0.115 -1.816 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +f +Q + endstream endobj 317 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 396.6318 143.4166 cm +0 0 m +-0.594 0.332 -1.345 0.119 -1.676 -0.476 c +-1.83 -0.751 -1.862 -1.058 -1.798 -1.343 c +-11.367 -7.272 -23.838 -5.94 -31.961 2.055 c +-33.759 3.824 -35.248 5.824 -36.406 7.986 c +-36.38 8.022 -36.352 8.057 -36.329 8.097 c +-35.998 8.69 -36.21 9.441 -36.805 9.772 c +-36.975 9.867 -37.157 9.913 -37.338 9.923 c +-38.598 12.874 -39.272 16.075 -39.299 19.381 c +-39.351 25.947 -36.842 32.141 -32.235 36.82 c +-27.88 41.245 -22.141 43.813 -15.977 44.123 c +-15.87 43.937 -15.716 43.774 -15.515 43.662 c +-14.921 43.33 -14.17 43.543 -13.839 44.138 c +-13.507 44.731 -13.72 45.482 -14.314 45.813 c +-14.909 46.146 -15.659 45.933 -15.991 45.338 c +-16 45.32 -16.005 45.301 -16.015 45.283 c +-22.477 44.963 -28.496 42.273 -33.063 37.635 c +-37.887 32.733 -40.514 26.248 -40.459 19.371 c +-40.432 15.895 -39.719 12.53 -38.389 9.429 c +-38.421 9.386 -38.454 9.345 -38.481 9.297 c +-38.813 8.703 -38.6 7.952 -38.005 7.621 c +-37.828 7.521 -37.637 7.477 -37.447 7.471 c +-36.231 5.194 -34.667 3.09 -32.776 1.228 c +-27.801 -3.669 -21.27 -6.18 -14.699 -6.18 c +-9.972 -6.18 -5.225 -4.876 -1.023 -2.229 c +-0.464 -2.434 0.176 -2.213 0.476 -1.676 c +0.807 -1.082 0.594 -0.331 0 0 c +f +Q + endstream endobj 318 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 371.8549 133.5221 cm +0 0 m +-0.455 0.254 -0.999 0.187 -1.379 -0.124 c +-5.428 1.437 -9.066 3.774 -12.197 6.856 c +-18.237 12.802 -21.601 20.744 -21.667 29.219 c +-21.735 37.693 -18.498 45.688 -12.552 51.728 c +-5.583 58.808 4.334 62.193 14.163 60.92 c +14.262 60.657 14.445 60.425 14.71 60.276 c +15.304 59.945 16.055 60.158 16.386 60.752 c +16.718 61.347 16.505 62.097 15.911 62.429 c +15.359 62.736 14.677 62.57 14.316 62.07 c +4.125 63.392 -6.154 59.882 -13.379 52.542 c +-19.542 46.281 -22.898 37.994 -22.828 29.21 c +-22.759 20.425 -19.272 12.192 -13.012 6.029 c +-9.773 2.842 -6.011 0.422 -1.825 -1.195 c +-1.787 -1.584 -1.567 -1.947 -1.201 -2.151 c +-0.606 -2.483 0.144 -2.271 0.476 -1.676 c +0.807 -1.082 0.594 -0.331 0 0 c +f +Q + endstream endobj 319 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 462.5444 388.8503 cm +0 0 m +-0.018 0.011 -0.031 0.024 -0.049 0.034 c +-0.979 0.553 -2.153 0.22 -2.672 -0.71 c +-2.969 -1.241 -2.979 -1.849 -2.767 -2.372 c +-3.259 -2.83 -3.746 -3.296 -4.22 -3.778 c +-21.933 -21.772 -21.704 -50.824 -3.709 -68.537 c +-1.982 -70.236 -0.119 -71.794 1.841 -73.195 c +1.792 -73.917 2.146 -74.637 2.82 -75.013 c +3.75 -75.531 4.924 -75.198 5.443 -74.268 c +5.962 -73.338 5.629 -72.163 4.699 -71.645 c +4.089 -71.304 3.376 -71.336 2.81 -71.657 c +0.958 -70.327 -0.801 -68.85 -2.434 -67.242 c +-19.715 -50.231 -19.936 -22.334 -2.925 -5.053 c +-2.411 -4.53 -1.882 -4.028 -1.347 -3.536 c +-0.553 -3.687 0.281 -3.333 0.696 -2.59 c +0.875 -2.269 0.946 -1.919 0.933 -1.577 c +12.53 7.71 28.164 10.569 42.401 5.801 c +42.488 5.232 42.819 4.708 43.36 4.406 c +44.29 3.887 45.464 4.22 45.983 5.15 c +46.502 6.08 46.169 7.255 45.239 7.774 c +44.498 8.188 43.607 8.053 43.011 7.514 c +28.258 12.466 12.064 9.549 0 0 c +f +Q + endstream endobj 320 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 465.9013 377.6139 cm +0 0 m +-13.6 -13.817 -13.424 -36.123 0.393 -49.724 c +7.025 -56.251 15.837 -59.828 25.027 -59.828 c +25.653 -59.828 26.28 -59.811 26.909 -59.776 c +27.077 -60.075 27.321 -60.336 27.643 -60.516 c +28.573 -61.034 29.747 -60.701 30.266 -59.771 c +30.785 -58.841 30.452 -57.666 29.522 -57.147 c +28.592 -56.628 27.417 -56.962 26.898 -57.892 c +26.886 -57.913 26.88 -57.937 26.869 -57.959 c +17.496 -58.47 8.397 -55.053 1.667 -48.428 c +-11.436 -35.531 -11.602 -14.378 1.295 -1.275 c +13.808 11.436 34.087 11.972 47.25 0.219 c +46.974 -0.639 47.33 -1.599 48.146 -2.055 c +49.076 -2.573 50.251 -2.24 50.77 -1.311 c +51.289 -0.38 50.956 0.795 50.025 1.313 c +49.56 1.573 49.032 1.619 48.557 1.483 c +34.678 13.968 13.225 13.434 0 0 c +f +Q + endstream endobj 321 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.9936 322.3092 cm +0 0 m +-0.93 0.52 -2.105 0.186 -2.624 -0.744 c +-2.864 -1.175 -2.915 -1.656 -2.815 -2.103 c +-17.792 -11.383 -37.313 -9.299 -50.027 3.217 c +-52.842 5.986 -55.171 9.116 -56.985 12.501 c +-56.944 12.558 -56.899 12.61 -56.864 12.673 c +-56.345 13.604 -56.679 14.778 -57.609 15.297 c +-57.874 15.445 -58.16 15.517 -58.444 15.531 c +-60.415 20.151 -61.471 25.161 -61.512 30.335 c +-61.593 40.613 -57.667 50.308 -50.457 57.633 c +-43.639 64.559 -34.656 68.578 -25.008 69.063 c +-24.84 68.772 -24.6 68.518 -24.285 68.342 c +-23.355 67.822 -22.18 68.156 -21.661 69.086 c +-21.143 70.016 -21.476 71.19 -22.406 71.71 c +-23.336 72.229 -24.51 71.896 -25.029 70.965 c +-25.045 70.938 -25.053 70.907 -25.067 70.879 c +-35.183 70.378 -44.604 66.169 -51.752 58.907 c +-59.302 51.236 -63.414 41.084 -63.329 30.32 c +-63.286 24.88 -62.17 19.613 -60.089 14.759 c +-60.139 14.691 -60.191 14.627 -60.232 14.553 c +-60.751 13.622 -60.418 12.447 -59.488 11.929 c +-59.21 11.773 -58.911 11.703 -58.613 11.693 c +-56.711 8.131 -54.263 4.836 -51.302 1.922 c +-43.516 -5.743 -33.293 -9.674 -23.007 -9.674 c +-15.608 -9.674 -8.178 -7.632 -1.602 -3.488 c +-0.727 -3.81 0.275 -3.464 0.744 -2.624 c +1.263 -1.693 0.93 -0.519 0 0 c +f +Q + endstream endobj 322 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 475.2114 306.8219 cm +0 0 m +-0.711 0.396 -1.563 0.292 -2.158 -0.193 c +-8.496 2.248 -14.19 5.907 -19.091 10.732 c +-28.546 20.038 -33.811 32.469 -33.915 45.734 c +-34.02 59 -28.953 71.513 -19.646 80.967 c +-8.738 92.049 6.785 97.348 22.168 95.354 c +22.323 94.943 22.61 94.579 23.025 94.348 c +23.955 93.829 25.129 94.162 25.648 95.093 c +26.167 96.022 25.834 97.197 24.904 97.716 c +24.041 98.198 22.973 97.938 22.408 97.154 c +6.457 99.223 -9.632 93.73 -20.941 82.241 c +-30.588 72.441 -35.84 59.471 -35.732 45.72 c +-35.623 31.969 -30.167 19.084 -20.366 9.437 c +-15.297 4.448 -9.409 0.66 -2.857 -1.871 c +-2.797 -2.479 -2.453 -3.048 -1.879 -3.368 c +-0.949 -3.887 0.226 -3.554 0.745 -2.624 c +1.263 -1.693 0.93 -0.519 0 0 c +f +Q + endstream endobj 323 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 635.8622 181.4743 cm +0 0 m +-0.009 0.006 -0.016 0.013 -0.025 0.018 c +-0.5 0.283 -1.101 0.112 -1.366 -0.362 c +-1.517 -0.634 -1.522 -0.945 -1.414 -1.212 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.976 -1.896 -35.029 c +-1.013 -35.897 -0.061 -36.694 0.941 -37.41 c +0.916 -37.778 1.097 -38.146 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.482 2.877 -36.883 2.402 -36.617 c +2.09 -36.443 1.726 -36.46 1.436 -36.624 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.367 c +-10.077 -25.673 -10.189 -11.414 -1.495 -2.582 c +-1.232 -2.315 -0.962 -2.059 -0.688 -1.807 c +-0.283 -1.884 0.144 -1.703 0.355 -1.323 c +0.447 -1.159 0.483 -0.98 0.477 -0.806 c +6.404 3.94 14.395 5.402 21.671 2.965 c +21.716 2.675 21.885 2.406 22.161 2.252 c +22.637 1.986 23.237 2.157 23.502 2.633 c +23.768 3.107 23.597 3.708 23.122 3.974 c +22.743 4.185 22.288 4.116 21.983 3.84 c +14.443 6.371 6.167 4.881 0 0 c +f +Q + endstream endobj 324 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 637.5781 175.7311 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.413 c +3.59 -28.75 8.094 -30.577 12.792 -30.577 c +13.111 -30.577 13.432 -30.568 13.753 -30.552 c +13.839 -30.704 13.964 -30.837 14.128 -30.929 c +14.604 -31.194 15.204 -31.023 15.469 -30.549 c +15.734 -30.073 15.564 -29.473 15.088 -29.207 c +14.613 -28.942 14.013 -29.112 13.748 -29.588 c +13.741 -29.599 13.738 -29.611 13.733 -29.622 c +8.942 -29.884 4.292 -28.137 0.852 -24.751 c +-5.845 -18.159 -5.93 -7.348 0.662 -0.651 c +7.057 5.845 17.422 6.119 24.149 0.112 c +24.008 -0.326 24.19 -0.816 24.607 -1.05 c +25.083 -1.314 25.683 -1.145 25.949 -0.669 c +26.214 -0.193 26.043 0.406 25.568 0.672 c +25.33 0.805 25.061 0.828 24.817 0.759 c +17.724 7.14 6.759 6.866 0 0 c +f +Q + endstream endobj 337 0 obj <> endobj 336 0 obj <> endobj 335 0 obj <> endobj 334 0 obj <> endobj 333 0 obj <> endobj 332 0 obj <> endobj 331 0 obj <> endobj 330 0 obj <> endobj 329 0 obj <> endobj 328 0 obj <> endobj 327 0 obj <> endobj 326 0 obj <> endobj 283 0 obj <>stream +H‰ìWKŽ%·Ü÷)ꯆ¿ägë1à…a†>Àƒlê ÍÂ×wDd²^µ47°1ÀF“E&3##“_þþõøò·¯éøӟ¿oéп3Ùñóۗ¿üŽÓKÍgó°eg™Ço?¾ýëZ<¿¾¥³ØñŸã­a~ԖÏlåxä¶ÎÑë1;°>üáíËWlüüväãøöü孕såq´‰­z9J9ûÇ£œ³šŸô+Ί“'6žëx¼ ùçñËeʀٿb_¢|Œ…Ë,G³3çUŽç‡Vò·œ¹c›tâÄ +ã1†åøÏÁó ç[ÚðQόÓâ#‰‹|ˆµkãü±¦¹÷ „µ:+`Úߤ½ÏÐ_?ö[í8'm¾ $Ð~¥J§íO4äžÐ$Ó=±–[¯»aDº)Ù³~þþpöDþñÉ·í¬ž zµäzóíY+¬¨ëxÇxO= P–%KK‹áó .±*ÀË X1ΠâÒ"¢r¦:ÿ,YœoØÉÇÏ7G>ÿŽoRÛ«ëÙçØãÇ íLd§U°†Î£ãÌAáMŒ{×ζVÌÀ&ÌØ9Ê8SŽËr¹@_ÝïÎ/2¾‡]‰ckûV­ëôj3fAKVÞcØ8¹¯#X¯ûtý–F¸WÖäí/TýöC+øÛÎÖy£„0ûxûÕ鑱§‰¶4‘4Ϻw®¦³9Úæìg> ÅRÇp‘Óòì/>` : +GÎܸOŒÀ‡ÔtQQÐ) §¥JÑÑÿ (­èß7LþÄ,Ȝšp¹·V§)U–]ãeA FnâƒÌ¥*/ä\\§:|Á½ur>{6̷ʴɽF±nȈ[b«Sö‹Õ³É½TÆNNHu)rU«%ßxè‚6”E“åÔb¼]ê×âv~0!—R+oðÜWÌK}ªA‘Xlmœ‰Ü”õ ¹_”§vQÓÌT®anæCHþˆOçtÔQ¾U ÛBö,„!µýeÈ%ܑu›B×;‚£|³Is S4r”©ÄLbIuçÎ J~õ5z9ÄÍ!a”aºå‹;¢:”¡,t¢°¨< ä GÒ``Ýñ¼ŒÂh9z•vµgÅUÍo¾©$iäOÐ7ni8Ló9(ò×ðË.°öÁ|7þ×ÆÚH· O÷¬û‘~ù¸ûø÷ÉnpF%÷™ìëžì¬3TÅZ]I/ÚK†§ä9¶+[yñµÎ áÙ.òJÌ|Lr™ILÉa–r°qgÆ ¿E®[š`òìýxð{R¥WÕîd6ÄU:aú;Ç<Œr„³U”,v&$P«.»þMΔ]҄RZ+ cÒSV wž5ƲÒr §9¾·ÂÈîÕđ ˜ £‹d7m^»ŽçLBRNww­£„ž½U™$Â8Mž§9Y «ZÝ0í¤$í_Šo]Ìó* «P hÆ0-bXVáù¸ÿUŠŸ#òe˜8Ò¸à“Ë—–Ç™l,{ܧ_j•3àBŸRoX-èªÙ½ S9=ŽïÊ_]yÐ÷Eú0%|³g.ѲÜ[7u ªÆµ©”ÓJrÀx®àL2.`æ\žSÞÙBšäƒò£N±ÖØØÇ4¹Œ>Ãõв·cö‡n¤£4È^™òFf*]o.2Ý[×^u¼s¨uéë%›î¹DÇîQš,x¹(säW”œÇ¶áUù¬|Ÿ#&2¡8sÞQ…•LQ|øÜK¢-~ùZ‹ßÖöXz×xçĖ½DóàÉHóº'jŸ^]1‡wÀª:†¹öêçf2Õ}–…¬ŠZô BI…ËôÝg߈ßxûê«Ù6û÷N;ßY¦<¯SQDÖÍW˜ +u¹”Œæ£ƒ`Ê Ö7KýýåsÞy%ëßõÿ`åOÿ¯üWåŸÿ3•ÿFÔÊÕô* ÑnÅ°È@¥‰ßà„1Éɑ²LnE« WV6ŸÑ^y]õ†ö¾ò3â½k¹Cë38õPÅÎz"ù˜ÉX]‰\Ü#³ëu¶\¢Ó¢’½Y1Îzg<ßE®›**ej‡C‡Ò$ʸŠF½¿wŒm9BUáïA¸ +/ØøۏœÖC¡N‰ÝÇý Í?¯¸'!<„=<¹v±0Ç$ˆ×‡JzÐl<㸾ˆm½öu¤ýÔkÚmº>¾ÛÌ{¾¨o<¾úäØü]=˞ý#cÏÚÕx}P?¥9˜b¯¯Э1”rKå{ëÒÉÚª-CÁü=×#¡Ãä‰J+çlº2…Á¥y¢Â¯fr(ÚÉ'=KôîÃO £´D0L3]rdw奘ٷã5 hB3_f—ó8Hϓî~*25C0瘢¬€V¡\ðâf,_Äw‘„Ý(JJ¾fíAz|ý|ñî{ÍqKÔͪþ +\¹Ä÷®šmtáÝ×î׳:ãÚ;:_â)sþ‚|Äùò‰È ½<áÎE]®eØdĬµPµq »%ò¾2mZt”e‰¹íYWûR6tëât…üêPÄMÆÅQ/§D¨xG&MAØ1Åc‰†ÉÌ'cZbNó[ì¶Òm™‘€qá8?^†}ÑþÈ<ö2Ðc)ÄÍ#º+…+üš.]†áؤŽnì. ºPÚ1ö“—@ìEÔ +d +Ê1æU,û¨¼JWYL.‹á®Ù,ÝH‹=žZ7¯ê:BÎe}¸º¶4Ç®îAýQbôºo¼_IÝÂ#äL|"·ÖHÞ#w$ïÙF½Pæ™Ï\Q°ÃÁ¹EÀ$Ejõ:ûµ] à²jÓ,K²jaoW"ÑÔk´M!h¢gÇÚq²bXLôíÀ¸â&©xO +^˜S ÿu` Ü£^‡MN~¼w³­£=aI:ºn ìð2d$¹¹ÝÒài‹`jQÞ¬6rßÔïYß2^âÅ_”úÄaÈðïc>?‚ž•oÜA N´ë#è˾‚ž*å=|—êTŒ,Ӌ=otx¢ëöôfû' sj,R|ÙýÚkãî'2)hZ·_UNÕúàˆlŠ6ÞÂo> xEñÇöÖ^à“Õ"‡µ \‚kÔåWQ30NC:çñŽÎÙ}6üæçæˆPg³GV¬y`qÏéïäöáÿšÜ»êÌíV¨[žõ¤M÷espu%ôëìý9Eu!d®Œi ç¼uk*æ5rÞöuÍbIŸvç­D˜µÝ߃Ítœdq-,îQ?LpY°°éºv ?|8!õ?jÛ(‡µ q*™µ¨ ܅”ÜÔc²(ŠHlá +A«ºîb7!À¶±¥‘OÂÛÖâqŠ'8!•iNè/08¡X´N0”{rÖáy[¸Ú-)"ð*‚7>ÍÊ»Wÿ¾³ځ‘p­ÿW§WrBxLD5öT$ßnq¹º²¿Ýôw¬Õb«[çŒÄêŸ8;©hÀauúÞz÷Ù§I ×¾ïc!Œ{¿áõuzŒ¿\«4(YԖ6þûñÚ~×<Ð$³ÙØ*%Z__0¬¯åþü ‚ª +Ý5B[8¢ý `û{`vÌvÉ䧓²îŸ‘Ÿn %^‹¤úÇÅÀ£ˆkéÈñ@79%ugpTr2 œö’’_ì è(f6.´Ä+™²VÅ5©i<¯¦ýÌjµpü¾ŒŽ!ì Èey·¿>ÄÆC¤¦‡èÁ{=¸~èà4‚ÅK(«¬îFŠæŒ e}%Æd¥•f $qá|†”Èw¿P@¸Ï)äۀ°ƒ¼µªZW䟹ÔãÏK¡Òë¬9Àû‰wÏ*õ u$ÔkO¹Ú¼Ìâ²µg ú׌ÞöÙ$„0±'<ÖÞ{r›á%{/2‡Ñšì@¸¢iÆ{µø*Ž1 [– ¨^[A@Z‚Ù­Ñf^gõ»õv‚ï֯ɏÈv¯;èòC`ȞzIä1¡] t±rͅ-Zõb¦tØTÜi[þQ¶HzÁ‡òËyה-ððdDF¥1ïN0© ‚çL÷u2Uzx#^`çª1 +3E{|»œˆêH{S5,>[ÉRÁ§òTYë$Ì RI +ƒÜÁ·|H–¸üó¿ÿù‘ëúµX—®¶6åh“ÿ™åœoŒ¨+m€áûŒû\ªªBVPPkßþãUø§êxû§²:¢wF p+¤jüÞxJ‡ÚV­ð?ÿànYÅ¢MðFùöŸ m7_þi¡>ݸÃÈ«6ð¢û²õSžÌ}SH¨¡Ó:…±€ˆC ÐU烱ÁrUGUDôü§©×ʝÏHG™ÒØ<í¡çȓOžû€L©h ŠšlAÙja‹èëý¼µ¤ó6ÀnjýÜ¢¨‰äM‡Rbíw@º¯¥3zъ†«d±T¸¦å~Å ÷”‹¶”ú¢>3þêø¸åÒM¿þ³P5ô0¸+ëwÿ\«>õ?|œG¥™(ÛìåRꪻä“—ÙCö9;Ý ©ý 'W¶±Ûsx…L@¾c3~“ ƒÈÄî:úQY,6¥R‘ðLÉÔReƒ?‡h(Sú±ÄR¸}&‡_ Bv—ߥ¶'ܓaÌÈ7˜íœÚí†ôÍìVúC7 YÓ_o P2Ëþ£°°nðÿ­4纵uu<¨ªOØ­AݍXû!Ï*«{ÑÂóÅþ’eQ. ô/ü&Ӈu€Io‰ •q×f݆-Ê ~þŠûAŠýKcïçHß kMÐ>CĪODVw +$p1p߯&Gt—Vȁ/90ZqÓDÖ«ˆ¤¦òÝC,Ž½pYõzúµ3hQ‘Pps¸±عۑ¦ì¢ZœÌ­¡,ÈT`ÑšÄÏ_°~J‰RÊÞΑy¡¥ƒ/ î‚.õ…‹};byçy½"”ý¤–Áµol)ÐÎû[tªÝ|–´¶®«±mãÙF§XÛMGUnw\‘Ò +ŠnÛzWO´‘]1äujÊàzA{IÈRã•:D>Žã0«Œ^²)9:X‘œ‡›¾pž*é3i‘îu£!NrTºëqÇÁ£Ìž§5å¿Þ¬¬c.~ÌÐl&t–§ð eÏ1~bŽâ67†¯SháìË@ñ18‡‹øÜܒ^/*,)LG_¥6vB¼€L¶›L×ßƃ5ù'ŸÄE!· uÂ^o\Ãt™ÖÂ8T˜ZÚ òG»ebÀɖ1ö¨‡jOŸ÷À|r Do«ìçþÏÑÿQŽF‡Ö¬µdS„.è¦0³å ÿfÛ)V†[כ‚0Âã€`¢ õÏäéV¬ #'# +ÄVllRÛ-Ùþ©®o†¥nO¥ôjÌ´”RÌËsgcd÷ή‚œf¡Í²ÅO.RepWf¨A¥/å›Åw(y(ëú Ë°;R‹3œíĘ\ Ñ?±n`Y#³ ƒôäð0º¿RGR 6ðp'£œWÂ1V‚`踃`tàÀX4%º©ö²=oðúH +|Á$ #_u® +H­ƒ ²ú™¼•ÏʸÃ,CŠP8h3ÿ<"÷„¦Cÿ׳“ɧ§4¯ü$ô¿BPÿ>?{3¤öç?./˜ê<ã¿ø§Õ˪ Ðü‚.ŠõÊ¡IÑ[cØ+PÌ,1Wý‘µ-ò»˜D‡ïP°…¾iéÐ._ô¹dëù|†`‚äi£T»@õÖ":y4N%Ë«¶ ^jéݲGL\+ì[T-RãDN§)9ùN8‘‡¬±½â͞fCðA°Õ˜·¤ùÕi ‹üŽ«õ>_|üX~Àè1z¿Ìà`į]ªº£j|oŒŒDþ³%LJ®Ö¬]Ii!‹ºv0%wË{¥#íksǪO梮-½>Ö©>º-´•7{1v³ß±w1Åô±Q\¹œC$Úim’Ÿë^éhŸã)¢»f9$†´÷2ûíTu‹|åÍ^ V„¼é¾Hû£iPlÁ–1íÂ,«AbN‰Žˆ›%¸ñQ#E<1æ Œ‚‹š ã0»XÖ M¢vùÕþˆy­Ý˜—éf·€–ÉÆÔ÷(Ï !»°‚ÞtÔØN˜ó9g·XôOR˜‚4ôô@Éèa_äñŒ¦šÖÇRаPL4¯ý.¥håabÄûL.,_‘Ô´MD%*n¢>é„Ð…[o˜]P;Ó0X½r;íë½=ƒ‚!¸*wÁ,…á9UüŠøƒ?ºÅ²nÑQ¸¢]b杠i~àúî1ù7Þ¯G#.¡&§Ã­é8»zŸ|"î³v£Š(g2‘“•=©{a¶:ŪºËŠO*ËC DejnžabˆÚ›l«®³¼2À×ÓÚ©„2À§O~{8ÍÇÐFâß·ùþ] ÛJ1‘â Uˆí°â ƒ§'mNÄtuE_o¿€hÙm&œCq +œà¤œ@½n á‡_&ˆãÌ@Q²îÖ\±~i¦äΧ²s†0W,+֌eåÚá~1­ˆž›­_àæ&»b–ÎT&çTá—ùböx™Á—)—>§®_ðVSvi¶Får†°ì”kƲríp¿VÄi~-èÆêìv3*“¸1–f¸¾H1UHÛþåëö -“2»ÐRîl¡¦¹Çx“9¸#3U³ø’çC¬ °AJ--ˆRXÚZ%Ôñ ¿~j:f‡ì;éûåõ@(h²TÙÖjßû72‰ØÙ-$k-¸•¾iS­Ã‘ʽVø·YäÒc0lºU€±®'ðò>Ò¡ï˶]¯Õ݈¤ýÞh*B¯ë‚D颏‹Ý&·˜€lTŒ’sï¸XSIq>)jϕfî?àeh´ºù£•E*>•ï;Æ4 ©Ý;X3%@àHÚö÷)¶ÇwŠá«÷[Ší_<ÅH£ùdՂeÏÎ0ryŒ× ÒØ.†-S¹dp®· #KÆ[†]~ù1Ã*:Ÿ0¦È0Ýä ¢ÅÏ+¸ê`ªÒÒD)—£´#eédŒsr-ù Âý©¥ð†‘!iupöõÇö­¬Ï¡ “) âðëÀŠïSÇ;ÆÓ$‰Ó’ÉUâ:«(/Øú=!"«Tw@=І¤_äÕ`R5Ïq‰Z¹Ù»·˜Vø!U†Í9ã;ümR4¤ÖurLGݳkŨT[°¶ š[²=ÃóX ~æ¶1ªö­õÛ/à-mՒ±&7Ԙ\7Ft6Šøˤ@.— Ö\°~áåϽA£H½œ üú86¬ËƱ_åH²ì6ПS¼Lwò<ã|£çþ®2ké~ +yŠPÈêJ6 € –D¸ßÂTLåÔy¯XAECèËù(÷{Å㲃¹^$>µÆ +² pJ@†CשðÙiVĎ°2$ÜïñC¦0x&ÊØ;5ÝŸa´@ínÔt¯xÉžýBMã§^©é ïé²É<Æ)aãM®öŠË-Á‰çÖ±©é¶Âwl+]Â㦣Í5Ý+N,¡u¦qÏ­uSSHíéBMû„ËË)aã­u¯8±Üœxn›šn+bGXé÷0ÖH65…¹Ó™)Ý9/Ìt §û™b%7fÊ3ãÂLéðta¦Pj]åÊL/]efÍS¬Gs1In´­¨F«ô•7|Xͬ¸ýå\s©š6]âA’Ð[Õè3_âx36“’ß! +séF1&èÍÂ39Ûæ4×âv­Úæ>ߐ›ÈT~ ã¤!Ò,=*dtî&_aŽî¿›†¼îJè‰òl*õº€XÒ­ËDIèýã + “Æ·?ø›PGÍÀiIC¯Ú.ÒÚÝ´ò­°›í{ÔÀ¯ ªÉfFú¸Ð”ί›ÒçÊy(ô¾¯`Hé(K<ᕺ—¼–jý¸‚6˜×õÐÛÛR¿iŽ•G¬I&cž]mÜæe5÷A.µºX¾ ÅJHz‘jr`›øɘûã8ïÌÒiT=àa'lˆAc8¦Y¥/žú…l*ðr3$µd„ño5mç È8ÿüž:ìN¤ò Ø5¹5:–afp|›~ 9ûd#þäI¬ EŸ© šžôÿ35/*šAG9ObÅt)¬ÆA3)Ô&³|1ì_!: +Ë@x> 6yŠ6Uµ\|óõá¤f·äeðiRÄn5âÜ<²ò¹õÍ/ùÕå β®›oÐeè YŒzˆq§qå6؜yxa­ŠÉa<´Ê8í ãÁ0ÛöÄ 5sûK¬>WiE¢ý>P”M<ƒihnl¥Ú·½1JºýÓôd~€‹ÓFadºÍ¦<Æ×ch›HGŠð±öŸn—¼Y©Øœ7«#Y9rŒ/å¦k1$‹Zû_ð³Om5†ÑÔü`Ò¤äR üXÇ_f‹ºª(/¥ 4ҊœJ†^v⠅¬ü„±Í eðŽðÜGöq J¾\Iâ¡íû†®(˜O üDÂö Û‘GD8YdŸƒÚR«däz9B…Z>ÔÍ£¿c”…2/C_àp~XŠkÜy©ÕTûw¹b†/«8Ùÿ|(—.Pv(ÿïÿqhô_è™´: Ëú>Žω³èçµVÌ`¯9 fLt?e€Oé_("ô=÷c».KQö͈¤C‡ï¶Xe°ÀGªþùÍA‰Qy¢å±e5…*^¸gGdkÃOø·lâ3£²\q;.aòü‚4‹¿]½Ûvý|q’Pýí•ÑʉhÃW@lê|MDsõc3;&òçɸU|{Ï~ÀÅ£©þTYûAq3yM.« a$8²#@K¡Š±¦3m³ 7ùY)5G&•Cx+%3½˜¬ž°$;T®ÑêÈz˜ p!r±WiROÍ¿i@/ÉQùÖñ5“}ÂHÐ +>p¶;°…eÍR|kDžšÃ1ÍÄÆ IGõDÂwfR)´ôMI-9x€ÑyNu—ýùîe8h-›Í*GÁ[•çô™RɎ%Žß ©žëþg¦¶OèÛr!)‘8ÒÚöù^­ ¸1YC±@Œò°x [ë6Mxàšè ½ÐTæú7q{•šT?`+…çþ>¢Ei4«foùĬÊ{”]} 4ÚA?qP(?éÈäZë0œøœ~±Ær í©%þÝêäÍ^µ–4çÅ~Ç e­C¨ÌzÑC$›Jïû_Ä`«û¤£­ÇqFÆé®Å’Ž¼å’ýÒêÿºE~òf¯²q-Q녆)’?¬“Y~ªKÏp,Ù¯2S¿Sq†,ÜÑ$¦õÕÞÓ;Æþº‚Bž²ë&EnŸH~ÕéN‰³+0/3ª ºÌaÜ¢u‹·ÄœHõ–Xþp¼¡ÜÜæ›a.’‹}YÌ!ÐV:/ò€ïü4k°ŠÏçb N»jz»Æ9v‰ê]\Ç®ƳÌ~nÀcWÃóˑ¬Ú™ÞúST a) /(6™3ü1íXn±0””n·XåVO¾Ô]c|=~'¹÷ç+P7¯“$}€ìXj¹¾!Ê ÄF£šj¥re–ÛT,}Œ¾²–ëÆ´g6ZÚ¬ä“#é @²T-ÝSL;n¦y“8¬3ÀÕK“_fÒâå³ß>óÿÀÅðó+¶£h"«õe4›òwòÄù7Ê4þ÷«®‰ +f3S+é¶ÂÎ +ªµž; grÊWX‚žÎöÞ»l'6<+Daæ)¡#Ðû©Â Õ¶ÁVNMÀó¦b]¯µàánF%µØ¢ˆÝ* þÈ ‹ª|…8§µœ8Tž+x¦eF™ø¿ÕS…A³Ñlˆ n¢\ +ŠL©H!T˜_ù%Õ¶WäH¥ úÒÁ§À:jñµÒÊ´•–9ŸêŒ#«[I¦Ì ­+mle±¥¢ x ´¤T?ÿ(G]þ‡wŠ)fe¨‰C[©â2þ7˜ù¶}FYÛ¸J]WìW˜¸åã +Rµ&ݗ^LWâ”ÝpbÈñ¸¯ê ³+IŸtG»lAY†bl¯`ÜF‡@š áÊ8OÃãÜ0ž#ÁÙ£_v,<à¼Hl:ìD¬,RÙ-a ûêE‡až+bÇi·I¸ßãG÷¨ëq1wtºV=Ì_=Ý4ö0‘“©ÿQ°Öyxím¯4KÍ8ŽwÎåæ4b»én]œ¿YoöäÖ÷Kþ^VÈxغd«Ý‡¦¡Å5>/­ú™VÚǮٵöy%kzyɾ9çǕ‚­qªö¿¬øà©ÖêÇóWÀWÊüËJ?ìFZ?¯Ø)æÌÙÁ[&[ˆ¨*)Ý&ø¤³‡j6µa µÀ(-f°¾!XcíqÊgÿÂêێݚ>)ɾ¾L‰¡Ã6>©+cØ*¥ˆÕðuÂn£ÙÖ|Ç0¡Øl·È‰°ˆ'Ùn£íwœaU–2ÑÙ¬¢æ¯04à?_{"ûݟ ÇuÉýÌ ö­9kÈ8½ðoùÒ狉^gÛEóf<ŒºJºz?¶íBÊŸ•úxÒÿ/éŒÓ–2 6)N{ÊÑNàÎiídÿ¼¥•‚ìöÜë &wÝ} «Íûo4¾Út D/óDzj@ãZjXýá°ºÓû¸­”æ?ÄsZ‡(8C¥}®á†B5í²³Êœ MOÄ +kw„ëuÑaøçë´"v„•!á~ÓQ×ýf±‚¸G¯§Öáî(÷›¥»Öî¬Ðvà=×¼H|j´#pÞSÚÖO†Í{fEì+CÂý?ìڕgÒ_ ðþû $ôS9x3Žâü•¢r:ù-B®ôf™N̨sê`ozºWœo ΀·Ž À§¾c[é÷à‰b Þl¯8 †Vœo­Á‚©5÷“SKõg–„·Ö½â,vKp’»ul¼­ˆaeH¸ßÃtëJ„©¥æ ¦?ëɃ!bæråÁ\éåʃyDOb’?læ<ö9sßgD±8³ÔÙ?ÎX³™¹×Ǚ,ñØõ>¦ g¹¾¢Í<b,¼®Äîóƙœ“Žý LLöcà[>3j|C¬æ›Ø"é{?|#I¥Isôýe'9L¶#h`KË´ÒH1 ºa4§ÂÔ!͐έíÀ "4¶Ñ€´ó¡2oÁŽ\Bž)gčÐõѦРKÀÂÒüa¼ò7!w ã`ò'9ÓÃFacÂý²¾3fÙ? Âä XÚ;)ŸB*:äš*?g~ıÙTß-;|„èH1Nú€X<§Ñ:‚no2÷ÔÒíš$²_;Z"–[ñBw‹ìr.}@³ÁK¶Ažyƒ«îëâ4CFBº8íœ$ßVàj-§uʛ<Ç6¹åT f‰&mçò4>üR0Øèח:„aÞWx¦aTÐjâéNSȑí‘‘ÝíKכù.N …‘﬙á6>Ò³‹t$·ÐG×Ë7Þ´”s.ô5§ÖŽá„L¡ô9u7ŠO?ƐTê0w|—1µÓÑqŽa–åöÃ7B# AJ5ðýåGú7ÓÆwÝT•£WlDŸ²#¬²¡W #v@:wyÂXKZ¹®~Î øæs ¦¶Bî?ANŸk*fÉeN6·Uõ2û‘T„Cy§ÈVR)s«lÂù_‘§T’­ŽwL^´üJ ü ¦Åy£T¾ÖìpTÊÇ%7úªTúS ê_Tƒv­í¬íO«Aý§Õ`Õ`^ªÁºƒú(õZ ê¥Ô£Ôk%¨×JPo•`] +Á¼‚ù/ +AùËB°ÿ'…`=ᥬYúý +Áf[5VP²ò ó3µxO¤™Í4±÷ +ðýo_%`ÛõØe€oé#äŸë±\·¥(Ó%yŠ¡ä«ÍYé-µZ¢ðál<r°^æ!«ËWñÄ£8"k›¾ÃÇ҉#†DØr\Âäù ¨V7¯×ŸïÛ½Ðf©³ÀKŒFw…s¥¾bÑàsfòÅ7‹Y6Óú„ËŽ£ >tÔw G²?ëð÷óAÕ1%E=N©!52²Ô­Îý CÞ6ü†ÞªhU>–ÄÕcÌ +C[ TVn@uèzWEÇß_z—=Z]ঋaÎŽ19:'jâåEm ®ñ¤¹¸êoaE¿˜!‹g—–:õˆêxqഛ í*+Ñòî úÒºÎkú¤²Aú9¸lÝÞPš¼ÐκãæoQLVEɁzÖõéa¬¡Kí,­n<ŠãÓ®D0>©ˆ'>|cjË݆¼ØÎÙë‘h}ÝÕçáhrfnæíì­4±ÿK +ã¤2y™c4,?ë 5ˆ[üš^æd£x€D†wÀ…<$¾;>iܑڦ÷‚cí~KNŽçÙ±•öŽ»ÚåÇÌh}bËßçúNÁ,æ2~؊3â"ª- ;TŒ[)TÃƉƒúùNG&×êál$R;‘Ió>ä:®øzh¨7}UóMÇI¾ŠÕmšÓ°ŽçI':w|…“ö~ìttœãÞow­fÆuÈ5$ýuªu|çM_åþ½Õl´{êN¦ÑTd§¶õ iK6 \Ú ¶ed`0Ï?1Ö·}á}ÍjIê4´‰Æ‰d×ٶѲê{È»ÌfŒJI2>ÔË[Æî›ôå³a{Ïã΋÷`¸­XUÒ'4îñ +Eê±,’rR©Ë²cu£”Ôe¡J¿ù›Pµ–÷ Õ+®:öªWø'¡º¬ßcm’C´Ô³LeÄá¥pêa›O”Fc8²‚x9îSdʺ”òӔ©tŽ¡oe>¿'µ–êKyBĕ„Åë õUm)Éû’•!1µ;ð›1{áLpÇFk”ñn´oÇïsLq²ŒËÿ¾ÌÀoÕoŽú†Òñi¦ª·²™¦|Ÿ1ÉԈsZÐ7r:­+œbf $;"·w<_éœAçkžPWSýqža˜;Ø}æË +²æ|‘ø<#fB‹ZÞïñ}¹Š®™ƒ|L0*v·{2xN|ž3/$íS’œö<Áð·l7w¹¬HÌå"!ðÕv6Z„Wòv Òá3®gÊl¶Ä•o\Øú+"*ê¼¼qíg£âr·Øe€ìÛG(¶Ñæd©k¢l¬ž£,GÉW'ß?PÊ©’œ“"ؒÀNåTk'6V õ.å`²†’ÕA1/†2x:O ½¶Ü̎1dçۆÐêû«[qSyžã[O¾çTøL5-˜Ö®ãaüj|Òòò'Oe½]‡Hz»[Öé ²ù«žiÇD§²bqÙOh¹Elaµõ„È_¥Øb2ÙÄíz³Å²ò¹ŠÈ0õÒ‘ð.F+…ÕmX÷¶‘>ïÝ[NùÖ½Ýq ÎSŒóöbԝŸå"x"˜Kº +æL[3Hšc3èÿ`fEp–’7…÷¤i4Ólfd*£=Ëf*Ú(ÉÜÕp£ÌóTbÊÀ#ôy̼.3à|£…ÔÑ>Î xD]µ~œ™àìY3K´åÓLS>xÉ.eå3f3ù%þê NS¯Ö¿mÚf¹7m7\EÕ.Lð?2ADlSGÒf±Ø#FRM<;­©ðë°†Æ +ˆ‚df_ÀñJlÐ؅iÙ²J1¢ÜC‡L5ä9RœÌ}|t¥|ãMEÐuSÙ1r˜áOvb˜ã<Őêy_Ilò±ÑÑqŒa@xŠoÌê^\ª©Þ{|2]|ÓMQu{µªnS»áɄ^Í¬·‚ª–Þ`¬eú™„·NÅ[˜Zø–îÝZì$M…KOHÖê=!‡ˆ¨­Z Õc÷¤aŽt´N[™mo —#c.’±ÒxÇàöÖ׸¬À¿¾ÌÓ²õ_wJð¸_×ìŠ7pŒ>oŒÉMî9ùDûä4ô”t ÿ†Ô›klrà)=«GP-‘'aǪ†¤:úe'9L¶Ã8\©UZi¤²ož¢(¨eÒ é\U1ÿ +ã• $s2 y5ˆvX·Gy¤3èúhSè¦HcÊ&«ᱤ¬+)LF´»âž¼ 뻥‡]Oïe€°W«S‘Yá@,[zàB¸˜ö¨únÙá+ D«bÃõ€¬Á2uj*^3'ÃJÝ®™@¨ ¾¢ «üÁ‰ðBw”Ec¥h6PÀ¦Ýßáªûºø?|WI–#¹Û×)úOópžÜô"óþÛ€¤"Âö¯-(4P ‚hù!(ûä+X³Æ,/Âu¦ +šÙ¼è½wjê¼Î7ԜiÄ,¦úՏðò9Ãg÷¥¬M¿ä.†’N¡î[-FÞü¢ÄN*+¡ÊÊdëY‡©íö‚v_­óÚìåPÏK'®ë²"·`¬pÒnϋËëÖ«³ë©œà‘sGÿš90YmUDmyœ°÷ˆ*¥Ÿ±[0Šø$¦ÞÃåˆBžR`V @1Ž<ßxÃ)9išM“Ê,2x +®ó]¡Bªx T嵓ÒÇd4ª¬Ö©’#T.¤@æT[6Û»¶Ôµ Þµ[OA2âkUË.x!®8j?ø[{P6EÏÏÕ3ÈYÖÃU?u¥DŸ3æÿééVCt|졖é>«+ìßz`_?=q†èYçÔì‘yÕòUÇ;螚åØyÒðÍ;w³ùcäò’ß֕ßä:®ÏoŒtnՃ ¢YOo#ô%StVéñ{tH2=õ$M(}Jç‘ìZs›B£Nò.IÃ)ÙTHSâˆÏÁ« Q,K;iÕ| oK¯›Eœ|J«Ö­±¨K©Iw ä¡%ÅLY€)-ä;4 ÃKRd|õWÐåo0äŒÁ7õDÇïÃ˃Ý_ʃb¾½¢i+çýŽ ³Â5ü ½0ÀÛ´Ñø{0b8™ó¨l=o³ɦ˜©_€{óŠ¤ÛSä. ¦à\ýaA[·ªH¥ö¯zØ14±Ø_³¿±‹ U„þjŸ.#{Ô9f]W!!ìÈN£]„‹ô𝦽ã2³9ßåÏS3ÜêzÇg<´ý쟰ïç·Ø<….r™4™9—Úd‰ ãû!\4’¸̺ÕAѸ¢£ÆMã&ìWî2S,/ÙÓMY¬-öáœm=cr xS*†aì}Ob®ˆóôü\=§í¬JK>ô TK‹YísXaŸ5ÖþԃàYߜµvþØ£kyKßs"N-C)ÿïŒYžÁWeù;cÞáÆÄõ6éÝ6‹1®©+»(à{½6k+ +R–}1óNi¶Ü÷â(|Ý1ÕXґ¢dîóÑíò‰+ÅÖëaµc¼W–ï"4®] É¢žçù:D"1ÑÑÙÆ0 ä¦O¤(Z±ª™Žý“ÙⓆŠÇ+Ød’ìnNÐ٘‹Þba:D=/ð &ÿÌWˆOÕ¹|ãú¦ZÉ4eeis׌”[®ÙY6Ášý}¬1™gä=»v+ [ GŒòf«°¢}ÃTÈ'g• ÿ‡ù³ËM)¶µKG¾œrWæOS÷g¾§4Tt[œ:ùX{ˆ?7nˀ•.âߪ”€OràԞ%•UäS˜±j¬æHjyŽ€Éf$­a5 ¬R ŸVUÙdT-ó¬fHû*ŸùW\_=ó’y[ÁyB»ÄjdZ[ŽÜÍ Ãp)Ñ»6ÞÞý¤g‰®” Û²rNtáf² +¿ë匓Eš +Ð +`îÊ!¼Xxœì–þÄÚÁf¬ð™‰u_4 +ñ¹CÝÁ…TÙýK×["­«¦J2ê‰p%byúí¶i÷w¸ÌƒcðÚM~Ì=Àxe( 嶞*,‰ù8rF~6ÝiÙC Øðh=fàcz lÂÛçx ‡oÚRÖ¦WrCÉG›¿Ò]Àõ" o"¶E½qF/ó¬Õå­Uu!Ôxuú oË&¶¬ÕLþØz~À.-e›8ôí}Ú±ëûÜ®Šä©ö~ÿÀ¹Ò?©óè•pÆë ŒÁLi}ÂEÙýleðõA6õlú$m<ýõ PA¼µZ–<Îù(éړ4yÍ 2ð ë{Þñ~Á•¬%ïå M™¦0IŒÂÌ16ã”ñaío–´_('‹Ôu’b,Î6–¾¸q–¥ˆÑÇH¯ >‘ u^eZó ¼RqÎà'šYT'eÕb`ÏE'\§Í³R8ª~am¼D:*Ñ ´Y¦ó:nnooË£÷8Œ_ëXîÖ¯ïa·ip´Ãȓ?+÷3\m3$+.ËàŽ>ä €€³ù„ùuÌødîDT÷S½ÁߞÕ[ +âjô«WÌRÊ©‹Nó†­È¹Æ¿ài.pVÃ96šg.*BÓ]+%ò˸pˆ3ŸéÈÖµ\d8w%üYβ–ÿʎoNjÁm +ÔÕn›É*¢ø +Þ[Ltpvq 'VíɆlŠWË’ñÚÔ¿º=>óa­yo;«¦É‚TtEmKs¥-óEXí+×fJBÅÝX–£xð c|;ŠÌð’àOÓVãu¢œ»nu¶#ž|îÌÃÌfU†#Ϋ:á÷;‘.pUÏ]eª¤õ”¬{ɺ)Tr÷d«¢èŽÊ×¼ã‰>ÉYxÏj!Pþ.8ÛÚ̵VüÍû}”ró*唺÷Rgþ? +ïŽ÷×MQ<®ëŸ*¾…¥°¼– ÷*éÄ*&8ÅF©ƒ¢UÅAaª¼¥¬”‡UÑœl㧱–¡a·nzë îi9¡•ö†¸N &D±iñ¨âÙsµð ]guW™ËžÙ$.êI-iÒ4†*ˆÅbL™•l³)E)ê?$©²UOF-ž¾ØÙqeþ +1õ«ì©þï*É®\×aó¬¢6P9ê›õdRƒdÿÓO¤ìë›÷G,‘¢$6 êd·®wª4£§ð‚È™GŠ^&Ôöú×CE¨?ÉÈ_ÛÛ^»ÐŸÀœ{²ÿû@#:ILêZ€s×£àŽ±$â8ԟ£` ­^;84f&øŸËDÊ?Ï  öýPñÃL\F¡ó֙&ngRրʽÆù\ò> +>[^À•þfr«ã~&@™HÎ7™â@ý´Ñ"…CñÃKÉ­Ÿ?¼ED °Qžž,Î,O”¾<ÍòÏjZA÷¢LWs +NCÙé•psÒ¤ñׇ6JZœ¼3`µ2þmçç«çðû‚Cì\ÝË6êb/¶Çxƒf•úØÃf_q!‡Äf¤y¨¸ûCþû8MÊÏ~.÷«•uûhŒ»Ä ‰éb½xN¹—…©;óñGPoºúÖ.vl²ôÝGóQÉ}*3-{%¯Ó´fF6ê»WòÆ>"1•¼Wk|íÐ,"€3+€Œeq}L[9°bùsÛ¡‹º›Ï¢D}¶5_v@n1U°hJ*K»­ÇŸbŽ¼– +ë@Q²]ÇÚÛ-TlÓo+:Óé¥áÂØñÇ"|"4 ðák Á¯cĊ‰!þzmÐöë±ü¹íþ°ådÜ–Zæ˱€µép–¤ö˜{Ý48¾í¬Ô—öçh¨Ò/Çêqq´!æÃè=ėy‘•ÉÿÍcþò!³–W{ˆÓíÉ\³TQòEöÒü lvíùF ¯Zn.ìlíü Ac‹Ã±â)S@ *þ¯sş`„­8qvFx;—(!6-㢄إù SCàk×óGœ.㻝Ë9aqV„Ù®àõÚ!í;+Ä&­ÜX!.³]¤ÐT RÞH!þŒz'…Ás8é£ÊÑ/l›æùߜ°ÛkŽ"ykñÖ'\"6­—7ÌÞÔ‘½âmh‹ôe&½AËÌ`êJÇlvîá‹Ë~BK¼uªò,³ôíº‹3C¼øZøöæôa½!7Ñ(c} ô-@ÒFe¥w5Ë÷çÒ¬M¨LÙbÇ2¯$Rcs”„üHt3ùŠ;ªÆLqÓÝ¢r>P¬¬¬.OÔèBÚÛÒF³ìjkÁXR¡3Ùݓ¹T疣0ëd>S͐Õ"ÇC:¦å­â|£ðd•„&£6æMaãÃ\½¢Hn˒?‘Ì«s±ùW¬åàqc”7ˆÖ9ÜÆâ·×ësÖ¦6ôÒö˜PÖ­7žèŽ`]΢ٷ!÷öÆgï7,‡ÝUZ`ŠÊÌdô۞$bæ@_îs1i3 “Àu@_Á +ëýï2õë#š:{½ âóW=Ì_õa¸ÌB”$SÔ–™e;´zƒFµE4&3ÈKæ9-á¬s|¶‰U²HÈ~•ïkÅ=Ö´ ¨›rR­O˜½•û›éQx×è ^a×âHËl#óæyj®tÞó=PægW‘°è +ÙòR–×þW†ðÀ³=0øk»–? ©4¢Éÿ>¼­€á ÃqbqûˎÎܘiÜJãó$šéîßE®º”Í Ž =4øÎç%§Â*)´ö™t»\ðÅÊ/¸Úò.BV;6—Ètô Á{®m„hR—÷sv˜ëå#éèì#ŒÒÞþ¸`fús­ògÛÒçdK½˜ÊP¬e‰›–³} üh®^³ +þØå ÏbÓõ„5r»6 +øæu ™Ì¢D©öÙo^טã’ë´¡¥á1\g ÈÃéŒþqfѶ­`&6Jæð; EýnÒ³ÒxDžDîûh Œ4â‹GƒcE­ùîFØçÜVœ“½RW½—! ßͨpù=XvªTF@$¾ÜBȁ-%7eÊÁê¾W mŽTFÀ$‰D‰"©$ú˪¬rFUåRjRhãúê‘#Hò7Œ, Yr pÒÒN”ö—#7†2aƒ.%¢m¯ïž»ÁRtdò® +•àµ˜W²Øõrb„ +äêd•¨æHÓ XpGÔK”mJð;`]VF›èj^a#ŸG©Hýs¡2tÌԖÃï€FÐj¥c¨WdW²Ëµôu Ü´û;\òàXüu“¿„涴cô‰Ì)·ÕÍÁLzP>=bxø2b–W ØìÑzH à1}ÄR­õ¶|W¥1¼»%_-%K¨J>´à¬¼èe]ÞZI}„ŒÕé>¦M!:L…–ƒÜQŸfuù=?ÚÞŎ]àÙ¥2‹Œ5çJ~´E^‰Þ±¼ÁXŒò™Öo¸°Q:[ >tX[AØQîgBE:˘é,yU$Z}Œ˜3ÏÂÕLÏÛÛhS•R"‚º©Òóé7>ôªE¢¡\”ì§Z>/ž_š…©©‘%@+‘”}®ßY2œ"šö'q?+Xò=â¨Qð`eÞh$Ê© ªi&±ÒØÓæà±ÒæÁ‹ÐŠœqÛRי5zº˜úoHäŽK‘-•' 4&¬_ËÁWôO‚'¨U«_Ù;á͚nj|` íc¼ºC™Ñ×ÙéNþ$¡ÅS×ø¿r?Ë9VÄæ7¡ÕNèO]ÀBï9w$¨äan‡ËYY(Ãîeæù’Ž¦]½çC6oOÜIí¿ãÕß02ö¼­à|b.qC“ù9XÕ#Ú»UqÅVJ >æ¸pÐ>—t$½*qî:"C¤~–£–@eµì˜;æQìÅXÖ¿üb¼có6Š6µ§uµÛ&@´T+f³[‚9¢Üwq\˜+BܧµB4¾©µå¬Ûã’/ÖÒÅàn©¨%™b©ðŠÚæ«¥MóbÕÛ/âaA¶Tú’úÛúv'zMÌúÀ9…ØŽ ñVgÛAÃ${`´¶è(ò©ðpÀ_âÑú®Šæ ˜õ_ë• +ïy¨ðýÉÝK8“ä•Ïy;Æ+ú&›ó¬´çÿÓØ1¦åŒ5Õ$n\ïK“8¯&‘!}o_põ:åËðWBßíùé҈9W‡0?³Ô,¯ ØlìF&CÒÆ律 Ð`MG)éžJ>SžêKc8IE1μޯ@C·Þ¸ïܓM.óÇAO Ó&‚[š‚ +›æÊ$qØb™ 2—Þ +¹3y&•îÏ)+Vk÷ S†@sEóz"ƹq©$ šÞøül5íìÞ|ΣÅÕ¯q,«ÖöP¥wˑÊÝæ7ӂxAäÌ#M/ÓúÅVxÙ+×ǟd¼Ò"Ê6—SuëÇ\ä ¿>ðg[É¿VØw̛† cHÄTø?GÁ@nýûU’kÉ Ãöÿ}xŽ‘3¼My¹ÿ6")»\õ:@6YȪÌò$ÛE[8Æ7bXFú÷Sh¼êy.ÿcV“@Àh h£‹ó\¢lB| @‰«•k}Â=Ö2}-Ÿ»à1T–-„’Ð|³AŒ£©~V›µÇöŸ§€¢}¢9éPÛPë°¶ÚˆV­*fÜI¹ÍÁ7%Ǎ.-Hp«sÜDÎT„ÅÙnÌE,¨¬`ý­Ðy‹y¹åMÛ?ÓÛAè/Ó¹Úþ4^™yy|æh¬0ãA™¶Ò¢x(αªõ¬?ïãìz?¢ª‡Š¼"R,¡ä›àÈ˝¼i¹¨+gQïŸÊ&'=ôŒ¿€ƒC½Ð:€Ù%ï/Ìt˜²ÖÃÕö›•¥©Ð&óu3rø¾` +×ñ‰‹eY¥ãã/`ìK˹¼aSÅïZï„v§¥úáë™g%‚pF˜Ty«J´ðº«gÖÁ|ëng¢vpÌî_Ž×c4µ™YÀÍ,": +UpǯnãåÔ8¡îÜM9M}d?úm8jŸœ€—Žt»YÆã\xLå<ìŽM»ç¸Fç6ýd»Ìc„ÿµÂ…±f¬?&ªÌ÷ + õÚBðõµmXýËÄ5ý~mP=šÖ±üOE:,ܲ7¥îlbï<°6m.Z8"Ø̘¯¾vÝŒsÀ'k3»ŽÛ±êº8Ú°ú—Ñkúý/s¢ž0åïÅÙî¿\¨Ûbñ1çŸÀÛ3ÊmK¯'ËÀKœõHô{„a„Ä^áÀ’×j«½€K¯½Ågۈ=b©§ÀnµžçZ\ZaÓ╠¤×y.‰3lšÆ1âäÒf_›î?”Vk¾ ¯óT’fۄ5b­ù3hƒ•9$Í°G¹´o²¶­Ì°„ §CšñOŸ‡8ãœÒ·øâ’ã€]Yäo´YÏf]÷(²U2«±dßå.up4MžLRhµ:¯>afBTØÊZÚTiƒ­îy@cãÜ]N™¥˜©Ø8þ€voµhpÈM4}‘(xâýývi–Kz)Æbd¿/͒g`ˆ;7~ÀuD¸ ÛHÔ`Ÿ…zUÚӈAcফÅd 523µéf(ƒ0£.%]ÓîÒ£Ã÷‚QYÞJÛ'܃ “ÉæÅèÚhÁ‡£FšG¹öz«]{Ï«vEÓ¸·µUþ=Т߰[?Boڈ‹‚Þ_‹Óô¢p„ö‰-ðó<ŠÆ…Áî]jÑdP)¾µ—Ç»=HÄõš´Jyä3ñXÔNºiÇSÍÆ|0Cr tÐòê˔>Ɂ¡ óÃ'X{Ž¼Vs¤DÐ š¸†¹†UA¼HcМtˆ(tŠð€Äûec\_š{¦P»±i1È'ÀœÍHXP@„ߧC·ˆ“–uŒ9H+{G{wÝ qŸ-2W%§/F¿ˆbæˋ3«s£.’¡IKföbDªôP™&›ß Vˆd±Y7bxÀB4ê\ ÅÜ(53˜T|/h²,gú¦©Ê²+™éú€ºFn˜õyñ|ƒºÉ_Äf/Ȑ…‚)–Q%菣Ô9qÓS©àez,ŽÝWìÑښ%€Çô³´ÆÛpžK© ×Ä.BÁGËi)’Ûßͳ®U•©ïµ*=6Sõ™ÊÝgx›6¡…) ®"ZK¾³°‰CßÞ§m» ®QØK´5ç +¾´A ^ 6Ìp Fê<'_8±<Ú[ êAƒ?çÇÓ#¢nEX)ö =Õ»®#‹‘à*µIS§î@”ÔwŸQOk–À¢¤Ì¨ƒ1)°<ôµž#'¥ÝÖ¤°¸tá9AÌ1$?rF¹4ç¸,à‚5¬>{ŠÙ|’ÚNw“'•Z°*9„<·yB"¹|õ–EyCêXÖ½ÑS&ĦùUA γڰTR˜Ø‚²‡9t‚²eÁ1HÃ)!§ƒ`­Ô‰Œ³½R¬ó@&Oe¥¬v¤…ß'OpM¥T/é¢xÙ@%CR˜ÑE–x}9… šãW¦nÑaz› +ÛáÚ,\M¹hÍЀpÆĨeª d8fÓëV-ƒwqæacä÷­êœá‡¤ºílâWíä‘/TX=h´©{È*ÿÒmið½ ª9OqÕJÂèbb8Bœ‚Q…ìö"‰~5¯ýìVyƕ[áð*K^k'ǟ¼Ü +c×Õ,)Þb7ä­팕’RÀÅ']ˆ}fšŠåÀ–äÉÔâÁ„œo6iq`[tÕL²\=)áêþ<@‘v`sµ‘nr’;ÆÊ$yøÔ(ã&¯%KûÈ$ÇLgU\œE¤Éb¦£Söі&nd/\K41:¡ÓÛ;·ñ¾ÄRZœÔ~넪ô}¯7ýÞt^1fÙUçíŸüÐLÆg#ù_ñ¸(ЭxQv ±ªz ÈD^œ”FIS¤ KgT²tD4#|hZeL žy­N‚Ü¶òú“Sc®W°:•ßc·Û3–Êcì +E#,tÛ´ûN։ݻíøэŽ0ٞp˜?vQã‚/,^}¸÷÷ÞÎÙ bu_?’†¯ÙvÃçꀾvǏÃ6Ì~ØþºñPçÛVÙFµ2ïAX;cõbd€© ¨%9² •¤vÀ× A۝,fM‰ì}­"©¡(ÔÆÃ㹄ì%F÷xUۓޠ‡Åƒ„=±Lt€íK, *ÃÀ«#TZŒ6Ô:ðšLŽa|&JãoÉ$[bxå”àmê9°Ÿ`Pջʐ‡£­ýOvÿm²¶]™Á„ç<¸Nz ¾Ã’IH¨Z` „Q°Ýa&Ï´¬RYہÅl-tÏê\–PWËÖiRà,è¯nž‹K´$MÖU‹Íä{J†C¾ôHTŽô‚Ú®MÂÕ|f÷ ú‡€ø×=¾><¾þïñÿÀãë_ìWIr$7 ¼ëú€ܗ÷t8bÒÅÿ?™ ²XݚûîSw7‰[Ä×ßEü ¢>äžãùŠ‰ÿåªøŽ$‚¥»< ·` +°Ø+\A¨ôïdë¹é2z©ÏuZ¶DÊOÈ[êÿo°2êFöVA~[0GNF+àÒÃÄؐeÍÀÿ“ïÃü™ïgCǛþ]×Ôg:»¦{aûš* ++äÎêšZË»kReÛýTEÅDQL|Ô@̈́YS[$ò+ß$SÀ÷.PI›Ú.¬JJS@H5ua\}Q¦ùS_tù%º“·õô~úø9abÈSƒQڼՋj.¯›Mî4hºõ€`I{ᢰ6Sít…F&åýëéú?tk§rfË%ê1í5kjë ð-w[¬üCÄÐ-ÓçxÕЪðIÏ-õäê'¨â(¶{E³¤sê V«i™Çú^àk|ŒÐuþ;škeœ4·àtlJ¨Û(e›ÌbÜ4'é.d^K•²þ+ÅØû.ö±U%½@K¥ èE“´“@‰#ôÀ‚9î±@Š´‹‘Iÿ‰ãDO‘©z0awÄ:¾(É9l\•L$”–÷äÀX«xF:¶y©Od²X瑺‘½£´.Ö¢à­VEқ|VGL RHªÜ®(…hd’Î&§#PÖl{°¡Ñ&…35ËÁ!vJ—¾á‘Y*ÊQs]CX,íTpËÂÆÔ¹Ío®Q¿ˆÄöyG•ð}àìb4*—¤Fcêb6_ë¸õ(υ­þ7ï/}˜ÿ…[ô&“…L¯TäP9uá:ý˜75ÛFƒ¨1-äAÁ¿Ê9󵲪«ºF '},0xâJÜbxUþÉR ôµ +ã*"JԅÂ¶£QTôÿC“™E‚‹ԗð";l+ ÈÇVf>ê}D)üHù$÷©Ÿ.v" ®ïj=Ð\b9h’^úH*Ÿv¤†€è'ê a\²^ÐÌåþ[.’c¡¬ U;E\‚rKö ‡a±Mêû=HU\bŠt)Ø8¾ßøèï¿8š,(QoJC`Ÿ_ºñ&כó€‡ù¸µ¼ñƒ+†¯ÐŒÄ7¹v¸pa†ž_’ï¹v°Šq;#0¤N+֌eåÚá¼î~pk²¯}ÔÿKÒ+I¹[KR‚Ä¿éò > t´Fžf)VJ/:¨:CfÚ%‚lIìóëíÞj~/lûr&%·*‘ZÄY•d`="q†ߢ4¸^s+up䃤†‰YÝOnCYÕ$«€Ižu2ÿ¡«HÇdÍè*We,Rß±ÿé{TbKÈj¡«˜51Ç„Í"+V_ÂÐ%?x\u¡.J:…£îµ¨R~ó¡'~î–T–dö뛛+ºõƒ™¿†KùÌ} ósæ›"IRŒ·/æ+GÀ­4ÆÃDeÈÆ;³llA˜«Õ¶t̨öۏÖZ±¾L(˜½ƒ2ù:c³Ç¶b͸ìÖ÷{`E³g­·›­/6èxíÔ:éÕý¼°NÍ33+àµÃÂשëKþŒ]vit5åv3`ù¢ºú׌eåÚá~¬0ê²GnþfH¸õ…þÄ`£@ì1‘Ó†+s„_†¾¤€&Škð&ÖvÍ Ë+,ßØNuã©ã ŽÒ?«GVˆ'k|t ÔttÏ¸Úu\¼Äò¶²×û1ÿ Ҙ}UíF¹ÿ^0I5îx•Ê’òBN£Ô*їÞR¹Ç¶*ÄÍõs|_+Õú¶·u¦Æ–qQBô²Ô&Ö¥YÝrǖL\hEì}ɋ}T¯šNŽÆÕÞδÁ>eKœÚD>òDD·àÛ +Ñtê£n¯¼YKåÙÜiíË7ÎéÖ"ºž†šô˜4?eŽE†þÂÍÄ?ù×r¥îÛüÂx(’þÐK –„Þ·ä¯&´7¢W»-²-ÐJh톸K'ƒ¢rƒÚu}\ðñZ+¬9Qd›ºƒ›Oفþ×|Vä{|B +×5î(°+úbߧ¿¬pt‰ÈóåžFËŸllvTé…Ôf<Ê6jhqõ^MÝÉ3¶gíšþ²Ô¼==‰¢˜ØeJ³Ô,ϖ¦‰Rc@Øÿn1Psu‹-Œ͆î•ú}ý…8ÒÿȂûx[¨Éë…=á œ]mˆÄaŸ…Ð&–K\LÉ¿ÜVïÉàO¬ì©=óÑØr5032›CT¦ª ±c"#i›– Úá‘\‹©…OÏæÔÎF×Xb3ð­ºßÎcÿmÝ_ÃWÝï‰w=ªãþâUÛpýªê=SÈu¿#tó1£Œc‡…wå:¾°jJï3vÝßV¬—ÝÚá~¬¨&ßÚífë‹Wm;µÙÚ]Տ›yÝ·]KNÇ ô&åØaáëÔõÅ«öÞÁ«úq3¯ûۊ5cY¹v¸ßCg¤UÕU÷;kºê¾íÉ5«îÛÓèð¨û !ͳîã ð&«ÎÃã°|ck2r{ªûešKªŒý+ànkЃ¢Í®„N¢¤i!œÏÃX ñðÁ¯É¢w">çoÅȼ]ÃÆ'–R{ñ‚ÚÜfû‡Œì²_-Δ©ï½Úl?{»ekñÝrnÞ1íºÊúЩJì´9ae\ª×U¸ùLÇ8ºÂx­^pç̜a„±Vgôù¼Ìî(ž¾Æݶµún;Z†ŠpøÝ;®ÁýŽíI¦µ¥´âãÌ3[P›>ûµíV˜OÒÕx˜°¹’%Ö¶õGÜê—]nÄß|Њí½õá.ßÁ_-˜]8ä–îú!Ç­2õB¯ÃõB­/8³™Ûӟ` ôtýÐTîÐËf*čP¶.ä+¬ ”ŠI’ÈËh³`¢òEسŽâí¡è +l5»,ª\ž[i-ÅZ y.øuÁº}s +“a{ÔºcñÞÜDoEÌÝO½Ÿ.^Z~*Óý2 Âž±doÇügœ™çi7¼Û¢xûÌb7Xˆ9¦ˆ–°¥ŠÃ›âÈÒµV*ÍÖ¾B4Ã=_Ù%äØöJG{ߍyª¯t‹nö²G˜ŸA—´?Gê|~6ÙQŒF”B{w%Nûq Z–ØÕO¸5VÇ°fr0¶cԅhâÔ-ggû`Åxæ…ñãF4ŠÙ, K”'”#­úÊXâê.Ж6SÐAڎ!¶Š«Æ+dŠ¹òvŒ{Ù£¹zŽ| ã!«œôöa´m‘;Xö¾v?*²8µ€¿Ï懝˭‰q1ë x™¡ö +* 0£ ò=eù"JZÇÁX ë`‹éÞÀÅÙÿ`Ӈ¼Tv˜x´ E힞ϡ !T†'„îÀ¥8wZ˜Z¼ÒÑï͉¥ùûÖþŠ5ý ¾˽àÈFˆÙ<Ñ +<ã5_ï1«WÉm?ëQ"§QGSÑËL—iÛUlñ<-šäF å}‰g@ +­‰ +*šLfëkQÕDtO´¤-hÆ´œ>ÞìC.^SÉUöaŽ¾?`ý?„W;v,¹˽ŠÙÀÜ£ÿgo NôÝúR©ªÛg»!‰"¥A0¸’Ã×E¸¥˜ÿ,i¹PkrûX? ð5ò=áD¥ç8‹ '[®ùa….Åd&VÙß–Ó}­kà^;‘—›÷ö±>„¹X™¥ê‰ójA^¥¿c0EÇúv–÷Åü<¥—qJƒh¬U³h…â ÿZsªëɨ/gcɞ-šž}·ç;ª¼7–&<ÖR̶ä¾ðkc‹ã½ŽÆˆª^›ËŒ9ÛȌ‘âMfÜ0nj´SfÜ égl™1ìšpÔ.–l±ƒõ&汋V’^pÖ‡RŽºo]±jdÑm2yÁƒ—"‰öìka6oÑnÅç=ªu‰(aP¢Y7Wp>Ʉ¿z4°§3oXmo„bÆ#–ÇHQqŠU+§#°ºíñ2(~>ŒØÎ"Ɉæ"X¯MD${)Ng€H¢< Ø'î×5€T¡ùHÉíãú³Ò5r9~Ž\Vër>„h‡Bëšú9bYýÒÒéû3ÌÓêÃz‰xó¾G„’X›ªj–£ Ñ3±ü¿#¦©WËëW (1ü?ñäçOdM]«z}ÃÆ;¨e)“¿Ž(+êÖ%ÈJË"¾VG/!–=kýòtd»j­ã–­ÎFS`µï} I5¸V"^ÑÑîŒôûË[‚+p‡R‘8é”"L3o†¾·þôYì0æ¶ÜÈ#wl в›RÓ¾†¹¼Þ- oÁZYŸÚ8 ”ìºÉ¤»‰ Ê« m(Œîܺ+ZCËBŠ]}—Ï¢t„¹-í}7–W·´€Î`ÏØË,FÀ©/(Mo,Ù끶“i!䡵‰5¦±|0¢žcÍ1¦ËÊÑÞscy4ÃÍ-T­ÍrYًå‚Êàë‚VÛñ’õáN„¾ +á ×Úåe.™æϸђ~€{z«À֘a20RÕ¸u`ÄÚò‚13Šr(A”vHAîQÇØZ0‚¼F[ýáºQ˜â¡9’ç¡i·±Fˆ{™[2ð2Ê!¯‘%½¸)“ûÃÈҀ<]=Eâ9`"ž3ŽõadË@Y•þqdûÞWý‹4,$Ùf›ôŠÇv¶OJÕÛ'þdgм›ª´è7ì_?«ëb—“ëÁ¿D¯ÍÍiÛe„öŽ“º®ÝÁmLnï"nïœJ)îoî¡ê*Ò t{ +•òè(W˜²òÑ»ò#Z¾Íè@¤B_sYÉ­Ø")+Nˆ­hò¯òÄ·3`5€KòÚ%Hðe'o`¡‹ ¾4yÌû#!?J·%íDMz@¶ Éj±¼úQmÎvú…Fԝ”!ŠJ­ìSҁEC> ÙÚ¶4Œõ_SLHšäµ¡] ½ôˆd´¢ûfg‹_4ÓOR΢MàAJXŠ“*R»å_9iM_œTqì3+JÖ +{–׎Ý-®‘‰w¼w@Údåöá˜Å^qÅm;ÜÏa>FÍ·“ù‰މð†’ zžŒø[w1ú8V >}•¬[P2¹ÜŽElAW·¶b½v¸‚lãæ꿺šÇÅ޼̚/ö®Ý´9pÍI{`¤ÛH +$%ٔêEb*Òņáu¤¿Å§± ԍá¯mÏMmÍ^­%UtÞŸá92í¸à†Ï˜­ÒPÈÅVTîFì ٝڱ¢þi£;,l>ÌB#í¼ÓµŸ’dûpL b¯ð(÷÷sÐßqæÛÉÖHÇèòš›ß0Šÿu2Ãæ•=íµUM%jí°ðåÕG×(ùŸ½_SÈ·“Û](Š½Â£Ü;ÜÏñͯÜa3æo_yÍ^_¹S›z I?!PÏeàÓ!ÒhÀ~Ã[³¤òùÖþÔT­ªº ùš=B@øÓ23´s€zo2îä²! ¥TgB×MaÄÞ20«…Í~‹ Ž=k´=ygÄԯꓲ»Ã[÷•+øßÞ.³>vf씏֔Ý ÑWXfbdzö¨&î±2oh'5Ÿ6€ë• ‘—Ø~iI +§åù?Ž,«u©k䮩 +Û*~ƈoó¡6P MPéÇÕ²ÚW|bJb ¥ý뇆C¥;³=±ÿè?Q íu +ZTH$+ž£nÒʁ¤Cx·õ않ï¤êËÂMš–@H`2öÉBû¬ßHŒ¨‡áˆþõ… +Gz"®\¨H•g\+ŸthüÛð!å“< +6j”•­3ÊqZߑF‡\ûòPî’gsžë­•?¡È"S¨Ô#Zö!‡Nä×±V +ï!ÆwŒŽ%GÃ5×7ŒR¯ÕwL.ƒd»äò˜”ËζŸ$e2–õ¹™ÌuÏV%æ²Üˆû~- “"Å-KHü¹·P«*Ÿ6çá¸Ù-XµŸÌè3xᢒC­Gñ\¥]–C +¾ñ¯å¾-Á;Ó¢º†Vúq)DŠI^}vG(Ë[¼:j¯:$ÛÞ¿”·µH»×bmJ–ŒS‡"#…1-~ä9Ö2Ú´KGC‘š‹â ҇ÿ²û(köų !ÎQKò ä…(»_Qaf×¹º!D÷€h,f¼ vJ9ýs õ¨~ª&}š\¼üï Õ2“¯ÁWïEeM¦à5…Ò™5v¯ð{ IxÖÁX¥KêÄw~5 +ý[d¸lê^t’ËrJŒì§«•íØçWXfü[{—ҏsì*™oxà%‰í­¸JÁ~µvÍ£:‘ØÜxÃåm é‹m=%?Ž³˜>YÎ ïÈÌøù÷­ú@Cô©½ÆŸÞx1ëÎ;¡¼c¼ÔḦþ†YóµüÅ*ÊFg&„D_-¡áׁóˆ–ïà ãq,×o0a“â)æ'\z¼쎭½v´ ÿ¨¯Í¢÷˜•/,œÞå"HQ9ÛÕl"§Sš ¿FJgPVÝaêx-_¸›«ŸÅª[Ê¥ŠÙߘ¹ ®"ðÓz"ªˆëª >;«Ï| ˆ—^„øÅïHŒ÷Ò¤’®Wì×gÈÈx)]ç‚ªzˆOlӻȍ˜ƒ‹º}’{™mÀ-EÜM/5¥üÏÅøµµµ§ï/÷gÐ#1³[”’L—‡¿ â !Ù š†Uá.W¹ôI|¾Ñ–ÝB;lÇȆ>wqGˆ9]wQÔ¥ºKƒŒ™ÝýÞy¨sª3)vĬöŽyS:1úŽÊtN¼Í,î Hxf=lÄ5ö€¶xCßyÕ¸«½šÌ8víºòa€çg¢ÅÀ¨¯¤ÀɊ'…ý$HÝûÝ=qVÖïåHÖÔ;÷"T쓁¶ÿ.¼ pŠÛ¤CÎö۔Ø(>SÙƸ…~ûnZ6’p+mx1!¯ýéYÑךõ°Üò¤}•[ЎQ]¢šÏªÌ írcHÕØ÷,9oÛØNš”]Uñ}K +¼Ö5e¸Ñ-J{ƒ°iÍhA—îèåO';·Ÿp¯…¤ªý ñ©Cv 7 Úc›¨­ü"”ÖäJ“¡©ã߁Ñeà”Š3›Üh¨ Ñ4;ïÔN12ùy&× ¦ß±ÝH¶]@Á,Ó^T²Nö­>A9V”u€ÞÙRµ{k$ äìó½ Rµ‚6 Û¹ÈÃ[\@'“«db&©åæÚëÃ@Sžñp:í‡3Ù·µ~n2'„5¤Z¡s"îå¡sê¼÷j7¥ú¯^íA-_Ëpwk$E¶CÁÇ!˜Àž›Wð,U/ YÍjiÏþŸíjɖdó»ŠÞ@¿“þu=5éAÝýO_Dæ§j”(ˆŠ ”­€V­LÎCf¤ÖtáaԐ²³ÞO£Ûiî\œ}‰„]}7híÈA«éº +‘% †¾Z±MGç«m ŒôOhºpIUŪ>j¹âÕY§*ÝIYΓ 9~o\°À´*e7qƒ{6ª1Ý'>œøúb‚¢·,<ש£³çBl<²dCv¬pìd³×üބ׌>MG›“p: U;ýž)᎑¿7†Ûi–[ÿÑxãá‹a§kYÚ žó%¿!œÜÊæ(1 ‚t*ƒOËÙ°©ùTTצâAV¼ìÒܖÁaT¬<ɉ›‹¯í2»$;Û^F`¤ïbŒ€o9Ð^ÆðaŒÈ“è©[5`…FüOcFLŽ`xÓH˜›tì š^8ssõõ ")áË®=é×Üԑßë>œX±ž¿XÇZ-”Йž¡3³÷V¨¢È`ôÎ*µñ„ˆ÷YlòÀ3û€¾ò¢à/mIJ¬œªDˆá|\6¸¤’ýñôê¬Æ”opÓ¬¿›g5%LNÕþ@½ønI ?àRyÁžãõÕÝbwÄrTÍ<Ù;²L¤™) Q—fÎqH@M푘õÁµf–Gï(üâÓNû±KHµR”àä'`ç'{t””¶H’ì¤±¼· 1uHç‹ß){Ço‚QÖCÇ$h3yêy.MθHx±€sÿ™¨p´:“áÒXC(iÕ"'÷–‰Ù²Åb+²AöLÃ/ñ‘5å£ÊFUf匴¸*Z i4ˆ©=å"K¢e8j161·5´*tóc°gË|s֘õ„ب¸ï€ Íân竀÷› +R\7ϊu‰dŸ  ȼß?ï· ’úÒ]¡¶âÂ܅NóKÍüæNª”+âKÃ([É_ŸUæP +Žzîøèvx_.7zÓÆZbÕ¢¤»øÎàŒ£:‹DŽMåP" æÅQïw›1ùä¨Óg³+Â.h³U#ŸÙW5¼íÙW•q,…$˹ùCâZWÉçŸÚ…Ž¢˜Ç1«E¬VyÐÑÊvæ°é«€L>R~¿³Ñ+ĺò Èèã­}±éx+9²ªހq"k6“uµëtòPkûÄ0ݽªÈZ`‘ ==B<ŠLôU“[M#Æڄ,«à:f{äšd +â4k@TLÈÇìí„ÚFnÔ±/éÊݹ9ûº8¿„D+Ä­ £ì¦R.Ý«Ð^Ç0r{N†!2¯p½ߤ*¶áÌìJötì˙Z¸rsTsKcÊGtÑo<’6¾OX­u±Fîw´T$Õñ„{r,dð£¤WÄtoöÒKÆyìàNè-¹í4h¼µ¥’”ý?kôõ('+”ùñßFS¹+½} ›‡L“>­²u™Ä¦ûn„´|`ý¦-¦•­Šg]I¦b®H?¸šÅS(Htš ‰’fº¯u†±—HÉZ#nôz¬Éß«W¤lTóc²çô/øèô¼[³ÐË~GpÅË~ԅ¡ÄDÃg]hx=ÍShJ7ÉÀ~Q'jÉ°:¹pÈ Š(Hyc$Ù6áĺ̘;M›…À¶†i„òÏi)‡p®a˜áEÌ8ý6 ÷}Pc!Á—ÛÎBëx7\•u\%ËugMm We«xÎhz§…Àçª!Y¼õç´°þ›¥ÞvFlga^Čð2,Ü÷A pæf<$®u±¼è<—ÕóŒs¦>ºpSî¡d$“dqVéLkTXˆuâò‡²· !u®8[ pñŒ5b ÃëhbÈæ›ý«\!e]ÑÙPÅþÏSë:ÏÙ¹B:»6}ãÖËÒÑñ%8ðÔú 9>*³Û¼<֌i[µß¿%®XízàÃb±ætûÝ<³µ+*Š®²tZÙê[€™ªaᅉ²š>QÍÅ.dÐ ] Q+²ÁaéÙË_ö>©ŽÐqôGQŠòKÇ­àôQÖ0ÌòHZå÷‚kãªÈlëhßE‡Á ZßÉ=ÿ÷Óq§ðwT³.Šé Ï8Øâá—è)!Òß$ú! Á<ÐøTԔ͋¼ÆP?›~ée‚î>]ìb š(關¾ 21C¢[6ý*hu˜Ê(ã›TfdS¤ ߶,Î!é>U-Ÿë°­5ä`zQl¼/à`ó´sè:©{a˜—m<£Ýë +œŽº‚_¼‰ ôíqîéè1w >ö¨ûªJâݼª˜ÕáÐËiŒ`2jÍ-V/Fï‡jßçT¾\CW!UÌ*ª±Ž!Ֆ’kàw`£ˆo+oóæx‘ëÜßÏÄ3àóTÐáIv¼ÉK« +>>Ô¹,>ËÊF ab¿*?¹†|ŠtÛtýkÿðTs¯l6ßmÉnÇ'r…Û2BoX¤GyaÊe6GšGÄàésðȗ·?ñSòåá^öøX*¹Ò§tHFCðïgâ¬Y ҅Õô"8F7+)Õïª@B—Ó73YvOfÿ& ŸsÏÒ'áR£„½f¥ +w=µ'Þ .äöMNßçBÊˆPîû@Ï2ÃÔþ„8ÀZ¼&á$Ÿ8{y±Ùwd5”5ܹãZ–g¤ò…!³«ªJ>UC/=ä2ö(2K£¡î/°Ó×D²ê§]CzôÉ^·FÝ£ºùÈ鯳£uó_YÅh‚àañãè{Cò€œÇ¨ÕàÐttñß±›—f¶¤µÏ¥…OZÕG·‡úÜüµ3lJ†£4#Ý}ÕÀä%S£¥Ï=Æ×ωóÒî¨yà’Ó7k@Þg!O–¼Õ6r£Ž}I(¦íÞÝÙÓù,»¿Ô­}F¾MÅòüþß«lÌrïzžÓÂõ*fë ƒeÑóPÛȍ:ւ¦®Üµ²" +7+óû—6¾â™ìn¦§'DŒÚK«h;ÆîɶP@+ ô€$’gAÄêòd6Þ£ "Ȩ¿?«ü·”|»z׋džû_U´ƒÙe ¬†¢Ø6|ý,èÕ|Žwdÿqj4ëš‚…HÝڃ¬ú´nÓcu?•öÝwLHýº™ ÒP±\]Óh Šùe3„Z.¯tŽƒ=ärjÜ˅Nj~nkƒË•zÝ ¡ön«ûxøæÚwße=©ð“‘Í.ÆYÚžSî ÖýY 7,Óù`©¡B›b됻Uî:d—Ò64Ž‡¨AùIMSᄗÂpRq?ÇO“N&ø?×¥ o÷Å0Mä :‡«d4«i ×-ìU¶·uÃE{»J€Ór'"ý\ÃÜàn(+^Jiå÷"Á›J b·Ò çY6æºÈƒù2Iò¢ïðtÓè?@¶6Súº˜7Ìùá@ÌÃÀ} ¯ótÑ©$m a¤Kð¾’ +ÞûTù/Ò饇 „çÕ<Ÿ;ùzP†mçe^&dÑgÀµýÏz•$ۍãÀ½OQ(çá<ãÅ÷ý·È)JzèBÉA ‰ ^÷X#ÐÅZε=Z·—0,S ökDuEhÎ_ûxš>OKi@é2Ɗãҟ²å5½ÒeŒàã1:›ºÀÑ$ÆhÅA¶êö†±04‡ÍÛFbJ2N´š`{òzw3W4îª'I d†STRΔ`$ÀÛag ðOÉÁä‚Þg¾F¬Éµ± žØ.:¥d̕ÚÇuQ:=¡õ”)b]}Ü©gL %Cj#:çÑ"LAx‚jšý¢”µ&Hjy"\¦ÎÕöU½Í ²»Ijƒë•…¾Y>.’2Œƒ=1Œš½èRÖ¿°¿“ßcSHÛì¡ìh8Ž?‹Ž›Ò*©áÖ ýÝù,8AŽõÂƜ¼’ÇòCÑޏõ–):¹_Iø½ L(Re¼4æ’òBd*íÂF`D˳Ø>‘Är­ãXÙp' •¶X7ž©¹¥wšŠ¶SsÇpL±xUœ<Êq„!q¬Ö÷,RY­k£ƒ}Šã$êí!o±Bâœ}ìY×'-Ò~hûeo0‘ÍçBRsÐÓ0½C¢Ê¤ýäú)s.’ +,Œ”Ô,^[7òĖöOµpWÑ»Ð4Ô.$Ž]ØŒèޞ7´»tïpû]ß.øå òpî‚@ŠÃ)RÆÒ[Ͼ#¿°Y•k ¾£ô³ïk<ѧè†ë *›L½ÿ€Å㎠x¢Ü^:"©×Q¿f…à-nëñ…Jµkù~ÌC ,–lÁˆºrJzÍ3Â6ç¨÷øߢ"hBÑ-Z„_iO`-J¶~;jþñ€Œ¹…š¬˦p²š+w<‘ÉYÒøeα ²»Ç¬èIMΟآ+ä3GFž]ÔÞ¼0rgd4‡¨HÝmÙüºiK +…©'4Õ§Oº»•cM¡¦!¤~ӂ±Y¦ücý^³»|×NW‡p¨c1ì-€õ3±¢aªãhxbxê«Š º§x ØxùsÄږK‚ºšëŒÕöl%ւKk ¸ßBGX?îµGԼء£]½Íy15?&µÕr¬@6r²) ïS÷ˆZ˜K‚:œóbj.-|ÅÖÒ%<î¡3ÊèGd§Œx5F4gš»Š-:YZGj:Z!í¹šÊ¤æ ƒ%Öù膎píࡨ¬³Œ³ê£ÌxD։Ìy3SÈñ‡%ìƒð“Gþ„­dùÒý»rõúÂÁ©ˆPd‰Z$©6®ïª€©ëŒ–b +±ìÙÌw\;I*×:n™)–;-:ú–+ļÁS…—v¶ïÔÔòYyXŠ;4籛NÖ½4ó>AˆÚdË7>ë5Òwnäš;6öÍËsgbA_r…¨9Ov…´ñ¦¬4È|êhÌÔ¨RžíÛh–.å(çXQ¬¦i-7"{D¾¥ +Q÷®YÄl˜{§£-wã.ÒVèTöÔ½0Ç—ë Ú«IÌT%›C¦T %ãF+ c! îòás¦Ó<ˆі¹1OÔÆ¥ÍMU®Í<²¶!2™ksø}Añox2îDxðZ#hÄ®µë¢aês唜QÇ£ˆa±wü¼p^Õutä7n ˜Ex΄={;V?±5›ã8íÃ¢3©*>CÔû‡66º¬Fj4:PjÓ½×x6XX‹²[Ye7AUNSìÖ¼9k›iáïÃzƒÄÆî…-ÓW­OêØîLӟ0ä'Ê ×kíëÊëÁ2™y&M*›[ē’{ ›†w`ä÷5yØ ç1I7Ëä>ƒÙÓ¾bَ,(ÿ0akG ÌrŽ ³Ô +XQ öl†Ç@ô`â¡ùážÌÜdžǀEnҀŒõØ[tŸüÔ㆞Í̂‡Î³Â/™=Üï#T&;šZ4PõQºè9ȋ…Ÿ™%©uniÓkr6g– QÈÃf=ÐÊᔊî±&ê7@A*j²²5o_?ª%ûÂyKÎß?ª±0 ̞mk…âŒeö^y\"³ª}|Ÿ¦Ð÷ƒÁ€¤·î‰Ê’¦å86aFã­g³ÃÁ׫åá`¥­]ÁñR4êš/¯Œª#wl—«<ÿ€kµ²h‡ì9ÿSkrÇTg•½BjaETC2íyGT눗vDr=# +r¨;¢ºQŽº# +°ÌvDT³ffu |Š¨‘,ÏeΆ„sD”º]#¿®ÅiАx¥Ð×\fþ÷]´È~-ÒT±lËß´Š‹ÏVš¶Õw(²pQh‡rW’*|îÅá÷‚èe;û ’Þ'ŠôMÓöx@ÄËè:Eè—÷?Ad>1¯ŒH›X²€keßBˆ&ÕóÙ"úá;…‚¨'å°Ú•¡$P@Ie ‡®7-íÐ,Âoó_‹a‘$æfî© PÐjÄèÎûⵇ¨lÿQ6Mùÿ•MSþßÙtg™„‡ü}¥•ÔïY&=²Lzd™|Ï2ùžeÊÊ*£¼±§3;†[vÌí–ý£:ÀÛu µQZ;ê@Êÿ²\IÎìcî·¿ì|8B9L ¶Œì¤üì¥Ç‡Çdgî1”„¢¥;±WsvÑ]ã^þ€›æ‡Î¥Ê² )áïçÙʼnËÌoŒL¼;”ô‚‰ÍW³ý|ã"¶¾/vDžtö{k»ð/ãÿ­Ë¸ÃŒû·ò pKì^RໆÎv—s°bnJ}òi#:CÓ%{‹ö„Æܸͤ5pFi.ÌII¡:ÓBÊ$:†p°GƒoÄü@‘ ‘ÝLËñ ×Z„BH/d¸¡yd§ýKKÛiaÎA+T´J_^Ñã WÊïnœÙÂn…9.ÀXbÑ-Zuظ#’{ õç˜ÞÉ ¸¢ÝÍE3ƒÅР¨*|NöXÜR9PAÝM`/ªÓŠ—i+U•"¬”c¸r‡„¸±a; îØZ|ó’Ã[šá‡Ä<k,¬{~ý8G&%lCˆ½ØMk‹lRHNÎÑ%hËGÌ à¼ùk £‘‹¾eŽþq¤Á%%Ö:ùqäÚåÚ¿üè;s‰nžfÞÔëÌEˆ¥Z”Üçï1dymH鍣³Éµþ=¡ –”Fã†õûm¿ð±yŠxb¤‡Ü ”²ð/Ë$ÃR< +î·òóTb¸d±ß¡Üee©ÉAT+³ŠW¬2ßu[ëÙÏÈÝЌEŠí=Kž¹º¨±9¥Ô²‘µ©Yç«f+ÃÔþ ×R”ûȟ°¯Ç¡¢wIõ/,cö%’oµdJüz­`–ݏÆQ´½ÂÓÿÀ èãê¨06¦¾ýßjm¡Bš¾(ŒÉ1U@P©¯¥¶ßŽ,ì­pçLÇÊ¥Pð\€„/ _9¶²ÖÓÚ·PòŠá¹–;qR]RùoÝ_–kDÒ踶œ*‘´+Frt3Ù[H\;’Ýë_]’±¡Î¯íÀHXæÒ?ÈZ‚|éâ{68‡qu¶K*œÊ‘4å|·Ê}iQ˧v3 ø<÷¤•ÙÖ¶…¶q£rŠPq'*tכ0ó¶=•Wu¶]75ÊåÿÐ]åXrì0,÷)æöÓ¾œ§“ŒïŸ~$UUÝãd¦!•HŠâ¢$ÑYþ:<ɺ÷LϚã?³ö”Ff ‹£¥’DŽ™—ôA¬ÉH¦T¼Û%¶#Ø=«‰ßñÞDYd¦*q >óíß(m5½N¾åc%õÛK…~cöø‰ÌùývzðŽQ¬Ô8üó7x‘È"~•Ñ†E"çø}Á¶ºSÆÖ?1D/t’XM¡u½FG…ÉgÄL¿¥ÝlÓF¶28j±²ê8 íò$\P֗‹5 â]r@Vr#ú:v uì*í`˜ó0öu3žð¯®kuŸ0{\“f;:z #_ÕÌx[³\¦¼¢–û^Qo²CöûèØ՝– S†ê[«T¹©cõƒßl»{ÇùžhW¨óžC‘A§§ Q™ŒÌ­Ø ÖP¢&JÝA}2•Å¨k×ÝxW(Ìbsu!ÏÛÛ +dY栚ËÄ©yÇU>¼¯$Õ#Îeé8:Ìö¬\'(Á%åïm„Œ¸VvTŒVxÀ…û`ê{®/ÀF¿I|Y+E^XÞöM‡áׯˊø"¬ Ï{¼n>ð¨;]ܾ¯’òQ|Eg>W 'MM д÷x[™Í­mf[™ã ×m΁ûÏqÿ¢ãåš$ d.xw˜­4Œ õëÀ„_G!6‡N5ç )‚Gb{=× ïÞ‡ÙŠ|n¢5=Ü¿¼)1ڗE»o;/‡›§×)15=W—ìï óVYºíä[¶áo‡Œä„)Xél[ôOÖ¼Ô¬²ÉÇôdÒs|…ÂNÜ]G•äÑ´y"/ê@I™¦S)ފ˜85¬¤7iœŠ,Âp+é$ýöY³lé¨Ëò -í‚vQSj+0¶T‰ˆ«ÇŠ|ÚþPq/!æT¹4v/—ö$þ¢ËúX)26÷¬IT×m!^½ Û:.Üúí tóÔo›žˆ‹‡K +>BáÒa˜'Šø"¬ Ï{˜Ž·÷›Å +£)­Kqì©r´žd‚TqÛóEeº$¾´Æ +²©Õ¯KB·ìºÝl¥ðÞòl²/Âʐð¼Ç‹¯<Š1B#Bt3SÕCŸ̱¸ü@sô$-ۘúV;\˜üÈVœØˆ¥ïKìç +“e5­`:óP~_Aø¶;bœö‡•ƒëãÔç +:m™íŸ+v ˊkèøs³/d=ǤÃÁÈ'ŠþÚLÖ‰ÓÔ’f¶imrŽHšÖF»~j°H>ÒÕuíäÃFün.ÊÐԐX7¢Q%º£©kùW6>)ΡK¿ÉÆ8oÁàâö’ÅeiD #ÿMí µ(÷ Îí_E"vo°PÐï™ žàcƒ]ù?¡î‚0nfv׬Îù:ðI£³âé}$xú‡ŠSÂßýøó”_ÔfnW:+žÚÐh×S?4žÚ5ß>€²ß#àà£ô¬xf žù×¥¼4⃰ѼÝâõ õÅÒSB ù~„:Èh…7“ñRýDëcþDÜÇêñt1ÿ—>í­½X'1ÔQÆ'F¤RN:¿þ“LÍ ”ƒ99Ö ø}Á–œq³‰~`öï¡Ïiè'$ݱ¯×±ùå1ľCTÏÖýòý‚ »H¥¬QÌF³}È©çèÚ6Ç@‚G*zøõ0׈³*Jûª·Yõ “£¬û¬ú€ (9îü²ÉÞäu‘ÂJŒ;9p-Í¥ñ…/¦ž±Ùüñ»˜ÿQ€Ú´™´ÙLZÇ Gò-·MkVZRÛ6Ω²´8¯A϶дÚh9w¶°ãw;_sîâ$xl *ó èì®ÅàžÝ6æÏÌÝþñd×>°Í7t>…#Òx‡GñÃ8õa^6Žv9mo±hNrè­\_úV·Æ +𧆾}ÏhÎ]žÑú‰¯·¥½¡ß'. "v ½&@V«¶…9æõÉÂBwwÃÙRÖ?Óa´«B_– KѳfҀ¬‹zΌyëܳ»³§0"_ã+p²0|âøþÝkƒ'Û\¨\9?Ó­ ÿxºñ'.8U,ä³|ઔ8Ÿ¿Ax`D¶¨g¥ÙlƒÓÛՄoƐñµÙï=ÂËv8Ñä8aÀÅéCad3Ўý¶tv‘Ž^¿L[lº]~ðaå‹]«#!³b¶w1Hò›PSœû0Yó:»¡•ÏIGGa@)?È$_!Հl§Jß3küÔÃTU€ŠƒEÜJ–“lüˆ.U³„±Ë;<£dõõñä©z»€¢€ïAÇ^N&Rх[{ðÌ/n¶¨Yk>`æIâùNƒ{Åm¨¢dU¹€¤§<%jéŠA* ™¢cø©¿ÙrTáå–meÜÀ+ +”ï5˜jŠnF‹`,K/¦º†7êùëj DŠ¨™Ï¦Yïf¾¼$¡»Â¹£@U}¢ºsûéY¦–X.X¬#ÙM:ÊnYnVu¿iO;özÄf÷Tº_Õ`aùýòcxù¾B¤˜[E±QDYÝÚH½ÿâ5ìªA‹qysþ@Ícs5gæ“Ãœ +›±ØÀI¼ˆƒåÜbÝэ®ðõkräÊ×þú“H¹ãpÀìÜò,qê8VÄ8é_¿\yl»a~öa¶D7•ç¾ÓØ# kc™TûÜd9‡¼qÛF\òâ°ÃK[,±h? Cɱo÷0ºc?LõÃOËÉÀ×D…ýç úæyAÈÑ8 +c›²®"A  +͝Ÿû.ûýf/ÉaoFjÏl@è# Ä37ÙÝ¿´ÇæѾ٠†nƒ7 š†J‹ùl‚JPÛ@Ř1¶Á,V€‹ …¨gëŁcÈŽBÅÄ%D`Ûæ¬\Èo6ÇWß=Á$U§].!v0v¹fýƒYƒ…Z}_„“•ØB¥ÕxéÆ ›IU±g-b>^óÏ CŸ—ãmZ°#Ç[±ÀΩ°ÙÜü(Á Äîõ]Ï^ ä|_ 7†OJ¯eåÜsˆ{íãb.ä”<-íø…M>†ÊÛÊÆpàv(|GA(|ÿ²W§Ÿæ›xå}Üç,"5”ð<4¸£>ß.Døâý×ì×>]7ÏñCßY@&LÙc§‘B¨ª·Ûšy¦ÞVŽuvüÍzˆxb+De*CPk? ôž#üÏ ^¯Vzz-҇•i+Åb'Z±b….By³_úæ>ÐF€‹UäÌN<æ  «øÍ$ÿ&SÕz¢ÊaO­²ú÷aë|Ç6 \ß¿ãú'•òÐöÀɨ0æä\ìœifã´>ÉÒw!ÖV·˜-gÞ8‰ßE%אђÔÏ.F¦<ÎIGGîÁÒê'Ý¢‡½â ;i™MFö׬±CË$8âk•$Óæžf?rÒ±‘† A֐àÌÖfåԋ¾¹z ™¸í–ÛFŽ*TóŸ1DЪYزsaQ±ÑýdnÂ}È1“Ê‘Çä4ÇÌ䓨LKUÅÌ 9&]ƒEžíìrZ+礣ÛCvsj²·Ok‹ÜÁfïëƒRç¼þÌå½z°ï]ƒn +œœ—ó§b€wÀèÝûg× ’4]Ã–9CnāÕc¢ód3ñ™wVÿA¡/‹óÖÅYù@¢°VýýŽ?ÕPbü=nPº]E’ÿ÷ z»,˜þ„ÛðîóÛçbƬ]xv'Ò­~âøÞ#B¦©B³z‹cPlµ¸2‘y֕Þo+K̙ª:;ª5 ôïj¤e4æ0W +Ë4V4šéëÂk÷**%§RcÅö@[d¬Ê›¢¼DéÃ\bì!_ +ʲt´×ݘ^ÝRƒ=Ç^f‘ H}AJ<.3{=¡íd*<¾/B ¤±|p—RË¿YL‡•£½æÆô(ÃÍ%TÎÍtY›q— GèEÁ÷%è‘ɼ¸3…×*‰u‡kîòBäJ "”0¼×§f—¬º¾î^7–Á"vɐRçœ +ØÄðˆÞ.!c±Ÿ0Jl…“PÀ&}÷ +ˇ,4ʲ2¾V°Ž[Ú>¿þí(öŒ¥¯pۇù0òI睭Ä9z§×V¼ÑCq>v&,¯µ—ӌλWXøðºG¬篽‚5·!_v6Â: F±fì¸}…Û>^Wöo`¼dš +Ó{³³:µŸÁ)ڒ8”'†|Ž«ÞÖGTð|L¿Ao!чtrœ=ä_ã¦ëÂï–¶Y½Ògöjîú“+Ì®ê‰î¸ôxÙ؃fZÒ|F»ð[ÞL"G¡å³î|û©Q(±„ÔEWØ^ƒüÜôõ^ØzÇÚÕ/¾—¯ܓåjÁG«Õ,ːÈÖMîV+P·ýÅþ(’Â韂2o¨°]4d÷~EFëüœzƒ ¦ õ×?k‰b¥˜kÒrÁÙÔÒR—PP·b€´9塋b½ Åx[’¼­®)%–]š%µ¬ZS€Õ;Œ=™]¢|Ùf¿ "‘š5ŸÖm­j¼x1ÆjáøˆKmÙ-´ÃvŒ7Ñ0-­ýLÇY°¸éRЃ‘Ù%Ð×~Üç¯A{;â\-Ã,›í ¦™ÏèG8ª=êXK`…*R>ÑêJJEÅ4S Õêª4Ö+˜Áˆb̶®FEP/9ïlQ1oP“7ô…𺚭ªL±MãpX°¯Â¿Ø$˜ƒ…}¼ +l Ï%ˆ쯱JjÂMšé‚3ÿž~ƒFžLtÿCîHE—ÔM:¶¢Å·EG§Z‚Õ¿€ R\¾'G)1™ÙÙHµÚ’Ž$|çþèq¹á%JÝË%jÇè½$ªÞHh‡!†TãØ_üâ¶t´ýZòÉ0JhiÕ¸D˜\ú7EãV—P•Š0´ž1*r£yÁ÷‚È¡ìÔÜfºÃ=¹°S¸A“GYÐ-èÚ +ªiB£ÿ¡­Ö×C[!%[Ž,Íx\ç$5öñ¡5 ’fe %áØ)0’-»‘æ#“¯)xŠÄŽ×Ö´Rdk_À%eµ‹|¿qˆB9£Ú ¤ÛTӐQ¿5ÑEkdB[ºú„Péå±k¤´I')VßÈ r£r©ä;A[³ØšG_a¤¶KŒ¸Õ>Â5òsÑCWeTÓpx_[w9´ÚR֔;6ö©.:r}`xnù˜~ƒ.‡"Yùczö÷„C ±U¤›óŽ5:q.¤¢Ö6+Y­ÈÛp[Uu„p.ÓÔuÚý¯E…XèÒ¿îp†Â9˾rœc”’³f£SǕxöbHœÒ7öj²,‚/ÚRWEKÜGR˜HË«U@nxÖµy«÷¢àMG9~o¬ŠeL7q{vbkõ×ÇîŒðG-uåUŸ½қ9 é<¬µä¢ Uu´Ã©(ó(S¤NŽA¨èô[\ˆtÜ{Zø½1ŽsušýÀ?¶xã9p>ðÀ[© ò[ ÂÉͤ@ 2IÍw :ŸCÿSÓ¿Ôo~PqÓ¥ùZ‚q¥‘™¬ .!¾vÈ8ìu¶-÷…AëY’ÁÞòBۍpd’a¤~õUTƒ(ùMÊ%, 8¤Ò|IÇîPv+˜K¨¯›V© ÕWBÿ®cüÁMí»”úÀÁ•Wiç¿ð£Ž ÕuÄ;DêŒä-X­wX(.89Ö~‡È÷‘5¹ò„î<”Ò†ÝK(¨¨è?Áèá´÷bÏLŠ¿ÀP:Q‘Ž¾À­ÁþÛ"¬’-!G) jÙ·j²ñ'k>ä÷è7Êæ/PŒ\ΜZ±ÔrC¢!Όéz™œ9ú€}*›'êî+B µŽ"“^Û§Çý!CCMæH‹ãIÚ=! ƒÞžýµëLM¸õôÀx2z}š~ƒ»kØMƒ ¶¢[†õïÂH&õ¶ÝÒ¬7=Û¢ÿ¬´iTÿR©ÝBÀ—SINªŒê;ÍÌÞ@ÈkIG,Â}^¢Tëy‰Ú1"Þ´=êªn„Rcm’néhûùŸýjIŽìƁ{¢.ÐÕüÖ=¶73ÞÈ7PÄØ µ½è…¯?™øŠd•TÒDôŒá…JÌÇH"„bÀ"òœ½”@¶ªչُ>µÆf-¦ +wcdQ㻉i†;…Ï"6E¯A¡ô°Ãc0Ôê¤ 2hZÁÜ¥÷ i#GIp‰´\Ê î-à7©/ÐóÐ%h\+ì öjEJHßMñ ÌҚ—ҁÖnÄO_ŠÍú:  cqhw…,1È„ëÓBÅ&%óE3# o MžŒÓèRô]Ӑ¸TõG§Z2&Îf>Y]“”r&²9D +©i4c¹Ø©ŽXéê¼T͓UÙNš]}y8g6.ÍGUÈL­Î‰ixú܃ +”:qtq\¤Ü·‚nÎZ<†õ† …‚€–‡¼‚€˜%]€ ÒÔ÷’Kššx¯2—"†IQ Þh=Vݐ8,Ïâ±JE„b-ÊøèÂbqÍhü&P¢º0ú’©6K-©n–刽_ŠÜ ãˆ6Väꎣ׌³™‹©—ºé0Ý°¹OPWAhT$û(RÏIþè5)b3 û(vªZt"8žóåJÄø$2KúÔ›µ˜ú´;J„|(’®¡UcÏWZuˆKáœÎj¬¬aaÁ°(úËð NJՋ2 E•ªf4¯™sÀÔ²éҔ¯qjÒVø7ÞuR¡—q’C‹‘¸ÉËØû–„k‹A‡aW¤·¨ÂÕ“äY¢¦¼’ ÆpL;-jضԉÜÅاÉøµ÷UŽ[üÀ"ã”û(ùEpžSU2L/Õ™R}`‚¡NÒöeAÃGO*VŔÅP5å&!ôt®Ÿ/0õ¬É°¿ÃÃ[bÝá1xl¤ð* +&0¦[ÍéÝoÊ·Û"ß-èòm7ä^ºI‚(Yn—¤É¤XðqúÖ^RÔ*¢[&ˆíÈãR)¤¦×]Åÿ%• -É=²"yùòÀÏIM²”‹ýW•AÝùšÍ·.˜ ,T*ð·Âl}‰TâL]dš„h4N”Š}g¹7†K[°Å<_8Dty]Çr‡Ñw̐EhnñŽÚý]8AõÃ蛳TNµ5ñèWÁQ–“Ïð+ÿ ±Ý«ƒÆv¯úüåѝ¾<âžO_~ž®=4ª=<ªY; Ämg,3?X*N½÷½KlçBuòމ‡­zÔ¹„z£­ïž8l}ëDtþŠ¿Ÿ>ÿôèO¿~Cû—~þñ«;ýã×ú½öË3=}ã3}{ú}²ƒwU2|S*ÒÖæðƒ(gµ ³~GDd.wBzüG­J ¦ö~òL/‰c{âmÂ˅üüè‹d•'I˜˜…" 3X&-i¬g‹?= í£ü,B%5†¶mXÍ4¼$,+£eau+¯g†]„+ ڂS"*% ^ì4›͇…ò[5j¶˜%£©ø +!-‹`hâÏ cc—DAhRÓ1¯6Í6¡éùwà‘NŸÚ¹‰ØÃû6Ñ2ÌWª"XU)?€ÛÙe‘-Ù´ß¿w»á·çþx‡ûéN¶þãb!Ö嘱Â÷=îiŽþãx–† ùì +øPQÄ aD®.R‘sàôMr5ž–ï˔m½y¯a€’«a¼C•Ö1̇ix°8àaâø€`$Š4«¦#ºÑxzX¾Ë”lS ¬û-¶Fî„Ï '£Ë#nœ÷²—e²s•Šƒ¥‚Sý]ÏÅu•Œ( +ŧH&Æ3%2|7#^^}ÿ&fÊ­¨Ý& +Ì +µ™Vmx5DC赤ŸÁ<V*"q,Mþ•+|ç.͝år-{˜{DBìe¾§t®*®%õ+L‚7×d‡¥¬À€ ¯ù[pÂl…]fÀ»úÀ(ë§v÷™]î0»Þan»Óߵߟþ<͚£#mU¼b¬H´=,ôî( ÜI¼‰ÉÖ1Ó(à¯äL…x°V…ݜ╣n4Èîéû2e]nÞil¯äþô† Ð‚’9Ì̀Ž0€p[è0Ð:µÑy03³” •”š'¬k-ûȳà0v®š®¤‘?$­QÍöÙ¡²˜ptæ-)'’díìÙ¡¨,ôIò¢ïš‚¡OJ¾þ ò+þßnªÓ'Á…Žˆ<Æ<ɍ¥a~ºÎ§bXè-%ÞXœÚ5^áÃ>77•ۍAë¢`A ìȉ)÷•ãÞ5Kâ¼ÌBÌ͒gÝÖÎR{Jl,.Ýø‰æ¼1šÑbÇy\°ß°Ûôý-y¾ ð÷ôû-° ˆWYÜ(W°Ê·¾ÕA·xîgž×çaáy<+ϕÚeLQ0–S¤;­<ËëÌòúËÓ`yZXž^`y]Y^_bùžº;rsÂåvˆ>&æãá{r<]q<í/ïàxÞ8ž7Ž§ãéUŽ_eðF邢1¸|î.Ç÷³»Mìn»ëÎ{åöû˜}'wû[²zïQöVú_ԝÓGêþsºÎœ® §ëçtxAýÕoøêèÿ~Ç/ª£¿#çÝÈù÷]ý×JòC暏~Œ·‰á[Uë2 ß§ᖜžg¸'§CØ3kLîS®ù¸ÿ1¢þêαFÜi/ß7Ž•ëß9ŽÕïócO¬BãþµâÒ“Ó?üëË ÿþ#À¯Bi| endstream endobj 284 0 obj <> endobj 310 0 obj <>stream +8;Z\699Q>0%*[/6a6XdH\r47R]4B3NS4D1VQ@HstLbfPiAr:a\;q&h?NK@kmKCHh2 +9)M.@=3#64X+p>HX0abN+qGW^hj;726J_Rl]gbVB.>lAgb]*7&q6?Q+f(+'"pDTpmU3(-D"[a3(4!Eprg'&BGWU9OO]lMHgiEZ(jcP +F/2;KV!IBS&:jP!=/FYiapn:[_Qup5=XCd42q\V'J9Z[i$[GK69FSJM+U'ViY6@?J +Y/nm&K+G[mj9.5,A!WT5.OnCs8c*-7p.k@pLVUuBMG2+_\Sl5YMAcLqa2Z>J72[1_ +'K@&.U?*H='MY+FMi-^Y_j!m9Y4%LMS_KG#\\ns`_`7*UKj8.nY%Si"s7X\&pk?R( +OA!@c(VO2_*M,QSlMPbMVff#nat00ca5HN2kJsjAmKia()Kk[LgXpo5NB5HHIi@[B +g[gW6q5q2Ua+^7g_rt6TY7&"% +:'S=F'\rdaQH=&YpO/B[Dm6hGQSj6PPO!boI6#M2KidT[N%@O2l: +J)]dK`l$;.q(8LXBX"%`]q$f%/(XAjP9okr])&50D!g,mY?O+hO2C#EcB$0#SKCoT +r?&bTF*4b`SLko^pib1a[kRO>,@,W/ST4>MO7@,g`@(_U~> endstream endobj 285 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 320.7549 392.0108 cm +0 0 m +-0.009 0.002 -0.018 0.007 -0.027 0.008 c +-0.519 0.108 -0.999 -0.209 -1.099 -0.701 c +-1.156 -0.982 -1.074 -1.257 -0.904 -1.461 c +-1.06 -1.737 -1.211 -2.017 -1.356 -2.301 c +-6.741 -12.916 -2.485 -25.934 8.131 -31.319 c +9.149 -31.836 10.209 -32.269 11.29 -32.618 c +11.371 -32.949 11.633 -33.222 11.989 -33.295 c +12.481 -33.395 12.961 -33.077 13.062 -32.585 c +13.162 -32.093 12.844 -31.613 12.352 -31.513 c +12.029 -31.447 11.714 -31.563 11.505 -31.789 c +10.483 -31.456 9.482 -31.044 8.518 -30.555 c +-1.676 -25.384 -5.763 -12.883 -0.592 -2.688 c +-0.436 -2.38 -0.27 -2.079 -0.1 -1.781 c +0.278 -1.735 0.603 -1.457 0.683 -1.063 c +0.717 -0.895 0.699 -0.727 0.644 -0.575 c +4.527 5.255 11.141 8.773 18.218 8.667 c +18.338 8.424 18.562 8.235 18.849 8.177 c +19.34 8.077 19.82 8.395 19.921 8.887 c +20.021 9.379 19.703 9.858 19.211 9.959 c +18.819 10.038 18.438 9.851 18.248 9.523 c +10.912 9.639 4.055 6.014 0 0 c +f +Q + endstream endobj 286 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 323.8691 387.4424 cm +0 0 m +-4.134 -8.15 -0.867 -18.146 7.284 -22.28 c +11.196 -24.265 15.666 -24.612 19.795 -23.298 c +20.076 -23.209 20.355 -23.111 20.633 -23.007 c +20.751 -23.116 20.898 -23.198 21.068 -23.233 c +21.56 -23.333 22.04 -23.016 22.14 -22.523 c +22.24 -22.032 21.923 -21.552 21.431 -21.451 c +20.938 -21.352 20.458 -21.669 20.358 -22.161 c +20.356 -22.173 20.357 -22.184 20.355 -22.195 c +16.217 -23.765 11.642 -23.53 7.671 -21.517 c +-0.058 -17.596 -3.157 -8.117 0.764 -0.387 c +4.568 7.111 13.602 10.251 21.194 6.853 c +21.193 6.428 21.49 6.048 21.922 5.96 c +22.414 5.859 22.894 6.177 22.994 6.669 c +23.094 7.161 22.777 7.642 22.285 7.741 c +22.039 7.792 21.795 7.736 21.601 7.607 c +13.582 11.232 4.021 7.926 0 0 c +f +Q + endstream endobj 287 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 706.1591 370.0264 cm +0 0 m +-0.446 0.249 -1.01 0.09 -1.259 -0.356 c +-1.374 -0.563 -1.398 -0.794 -1.351 -1.009 c +-8.538 -5.462 -17.905 -4.462 -24.006 1.544 c +-25.356 2.873 -26.474 4.375 -27.344 5.999 c +-27.325 6.026 -27.303 6.052 -27.287 6.082 c +-27.038 6.528 -27.197 7.092 -27.644 7.341 c +-27.771 7.412 -27.908 7.446 -28.044 7.453 c +-28.99 9.67 -29.497 12.074 -29.517 14.557 c +-29.556 19.489 -27.671 24.141 -24.212 27.655 c +-20.94 30.979 -16.629 32.908 -12 33.141 c +-11.919 33.001 -11.804 32.879 -11.653 32.795 c +-11.207 32.546 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.162 -10.751 34.411 c +-11.197 34.66 -11.761 34.5 -12.01 34.054 c +-12.018 34.04 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.752 -24.833 28.268 c +-28.457 24.586 -30.429 19.715 -30.389 14.55 c +-30.368 11.939 -29.832 9.412 -28.833 7.082 c +-28.857 7.05 -28.883 7.02 -28.903 6.983 c +-29.152 6.537 -28.992 5.974 -28.545 5.725 c +-28.412 5.65 -28.269 5.616 -28.125 5.611 c +-27.213 3.902 -26.038 2.321 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.642 -11.04 -4.642 c +-7.489 -4.642 -3.924 -3.662 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +h +S +Q + endstream endobj 288 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 687.5497 362.5948 cm +0 0 m +-0.341 0.19 -0.75 0.141 -1.036 -0.093 c +-4.077 1.079 -6.81 2.835 -9.161 5.15 c +-13.698 9.616 -16.224 15.581 -16.274 21.946 c +-16.325 28.312 -13.894 34.315 -9.428 38.853 c +-4.193 44.171 3.255 46.713 10.637 45.757 c +10.711 45.56 10.85 45.385 11.048 45.273 c +11.495 45.024 12.059 45.185 12.308 45.631 c +12.556 46.077 12.396 46.641 11.95 46.89 c +11.536 47.121 11.023 46.996 10.752 46.62 c +3.098 47.613 -4.622 44.978 -10.049 39.464 c +-14.678 34.762 -17.198 28.538 -17.146 21.939 c +-17.094 15.341 -14.476 9.157 -9.773 4.528 c +-7.341 2.135 -4.515 0.317 -1.371 -0.897 c +-1.342 -1.189 -1.177 -1.462 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.705 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +h +S +Q + endstream endobj 289 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 492.2558 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.43 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.447 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 290 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 493.8667 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.672 14.166 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.898 -27.802 12.893 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.626 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.103 -0.986 c +23.55 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.781 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 291 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 516.9438 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.489 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 292 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 498.3344 175.9551 cm +0 0 m +-0.342 0.19 -0.75 0.14 -1.036 -0.094 c +-4.077 1.078 -6.81 2.834 -9.162 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.894 34.315 -9.428 38.852 c +-4.193 44.17 3.255 46.713 10.637 45.756 c +10.711 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.058 45.184 12.307 45.63 c +12.556 46.076 12.396 46.641 11.95 46.89 c +11.536 47.12 11.023 46.996 10.752 46.62 c +3.098 47.612 -4.623 44.977 -10.049 39.464 c +-14.678 34.761 -17.199 28.537 -17.146 21.938 c +-17.094 15.34 -14.476 9.157 -9.773 4.528 c +-7.341 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.446 -0.249 0 0 c +f +Q + endstream endobj 293 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 681.4711 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.448 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 294 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 683.082 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.672 14.167 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.899 -27.802 12.894 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.626 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.104 -0.986 c +23.55 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.782 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 295 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 706.1591 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.197 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.489 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 296 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 687.5497 175.9551 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.094 c +-4.077 1.078 -6.81 2.834 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.894 34.315 -9.428 38.852 c +-4.193 44.17 3.255 46.713 10.637 45.756 c +10.711 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.059 45.184 12.308 45.63 c +12.556 46.076 12.396 46.641 11.95 46.89 c +11.536 47.12 11.023 46.996 10.752 46.62 c +3.098 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.938 c +-17.094 15.34 -14.476 9.157 -9.773 4.528 c +-7.341 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.446 -0.249 0 0 c +f +Q + endstream endobj 297 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 353.3784 369.4727 cm +0 0 m +-0.492 0.101 -0.972 -0.217 -1.072 -0.709 c +-1.118 -0.937 -1.072 -1.16 -0.964 -1.347 c +-6.365 -7.656 -15.433 -9.511 -22.933 -5.706 c +-24.593 -4.863 -26.087 -3.791 -27.386 -2.529 c +-27.375 -2.498 -27.363 -2.468 -27.356 -2.435 c +-27.256 -1.943 -27.574 -1.463 -28.065 -1.362 c +-28.206 -1.334 -28.344 -1.343 -28.474 -1.377 c +-30.02 0.417 -31.211 2.517 -31.969 4.835 c +-33.475 9.44 -33.096 14.356 -30.904 18.678 c +-28.832 22.764 -25.371 25.854 -21.106 27.45 c +-20.989 27.344 -20.845 27.264 -20.678 27.229 c +-20.186 27.13 -19.706 27.447 -19.606 27.939 c +-19.506 28.432 -19.823 28.911 -20.315 29.012 c +-20.807 29.111 -21.287 28.794 -21.388 28.302 c +-21.391 28.287 -21.39 28.272 -21.392 28.258 c +-25.865 26.587 -29.495 23.35 -31.668 19.065 c +-33.964 14.54 -34.359 9.392 -32.783 4.568 c +-31.986 2.131 -30.731 -0.075 -29.103 -1.959 c +-29.115 -1.996 -29.13 -2.032 -29.138 -2.072 c +-29.238 -2.564 -28.92 -3.044 -28.428 -3.145 c +-28.281 -3.174 -28.137 -3.163 -28.002 -3.125 c +-26.638 -4.453 -25.067 -5.584 -23.321 -6.47 c +-18.727 -8.8 -13.573 -9.104 -8.952 -7.634 c +-5.628 -6.576 -2.583 -4.598 -0.22 -1.796 c +0.219 -1.815 0.619 -1.517 0.709 -1.072 c +0.81 -0.58 0.492 -0.1 0 0 c +f +Q + endstream endobj 298 0 obj <>/XObject<>>>/Subtype/Form>>stream +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 2 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm0 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 2 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm1 Do +Q +0 0 0 1 k +/GS1 gs +q 1 0 0 1 343.1801 186.3174 cm +0 0 m +-4.936 0 -8.937 4.001 -8.937 8.937 c +-8.937 13.872 -4.936 17.873 0 17.873 c +4.936 17.873 8.937 13.872 8.937 8.937 c +8.937 4.001 4.936 0 0 0 c +0 22.427 m +-7.45 22.427 -13.49 16.387 -13.49 8.937 c +-13.49 1.486 -7.45 -4.554 0 -4.554 c +7.45 -4.554 13.49 1.486 13.49 8.937 c +13.49 16.387 7.45 22.427 0 22.427 c +f +Q +q 1 0 0 1 375.9946 195.9863 cm +0 0 m +0 -1.272 0.081 -3.445 0.242 -6.519 c +0.129 -6.519 l +-10.142 11.192 l +-16.466 11.192 l +-16.466 -12.454 l +-11.986 -12.454 l +-11.986 -1.326 l +-11.986 0.021 -12.088 2.275 -12.292 5.435 c +-12.147 5.435 l +-1.86 -12.454 l +4.512 -12.454 l +4.512 11.192 l +0 11.192 l +h +f +Q +q 1 0 0 1 397.1357 203.0713 cm +0 0 m +0 4.107 l +-13.619 4.107 l +-13.619 -19.539 l +0 -19.539 l +0 -15.398 l +-8.604 -15.398 l +-8.604 -9.301 l +-0.598 -9.301 l +-0.598 -5.192 l +-8.604 -5.192 l +-8.604 0 l +h +f +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +2 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm2 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +2 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm3 Do +Q + endstream endobj 299 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 326.3413 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.425 -0.596 -1.43 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.447 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.154 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 300 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 327.9521 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.599 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.612 -27.672 14.166 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.898 -27.802 12.893 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.625 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.103 -0.986 c +23.549 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.781 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 301 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 351.0293 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.618 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.49 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 302 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 332.4194 175.9551 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.094 c +-4.076 1.078 -6.809 2.834 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.893 34.315 -9.427 38.852 c +-4.193 44.17 3.256 46.713 10.638 45.756 c +10.712 45.559 10.85 45.384 11.049 45.273 c +11.495 45.024 12.059 45.184 12.308 45.63 c +12.557 46.076 12.397 46.641 11.951 46.89 c +11.536 47.12 11.024 46.996 10.753 46.62 c +3.099 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.938 c +-17.094 15.34 -14.475 9.157 -9.772 4.528 c +-7.34 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.901 -1.616 c +-0.455 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.447 -0.249 0 0 c +f +Q + endstream endobj 303 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 338.1704 356.9717 cm +0 0 m +-0.376 0.077 -0.744 -0.092 -0.941 -0.396 c +-4.138 -0.204 -7.219 0.626 -10.11 2.093 c +-15.688 4.922 -19.83 9.753 -21.772 15.697 c +-23.716 21.642 -23.229 27.987 -20.399 33.564 c +-17.083 40.103 -10.867 44.701 -3.672 46.005 c +-3.543 45.842 -3.362 45.72 -3.143 45.675 c +-2.651 45.575 -2.171 45.893 -2.071 46.385 c +-1.971 46.877 -2.288 47.356 -2.78 47.457 c +-3.237 47.55 -3.679 47.28 -3.821 46.848 c +-11.282 45.497 -17.725 40.729 -21.163 33.952 c +-24.096 28.17 -24.601 21.593 -22.587 15.432 c +-20.572 9.27 -16.279 4.261 -10.498 1.328 c +-7.508 -0.188 -4.321 -1.048 -1.016 -1.249 c +-0.902 -1.513 -0.666 -1.72 -0.363 -1.781 c +0.129 -1.882 0.609 -1.563 0.709 -1.072 c +0.81 -0.58 0.492 -0.1 0 0 c +f +Q + endstream endobj 304 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 506.6396 404.7549 cm +0 0 m +-0.007 0.006 -0.013 0.014 -0.021 0.02 c +-0.414 0.31 -0.911 0.123 -1.13 -0.397 c +-1.255 -0.695 -1.26 -1.036 -1.17 -1.329 c +-1.378 -1.585 -1.584 -1.846 -1.784 -2.116 c +-9.273 -12.195 -9.176 -28.468 -1.568 -38.39 c +-0.838 -39.342 -0.05 -40.214 0.778 -40.999 c +0.757 -41.403 0.907 -41.807 1.192 -42.017 c +1.585 -42.308 2.082 -42.121 2.301 -41.6 c +2.521 -41.079 2.38 -40.421 1.986 -40.13 c +1.729 -39.939 1.427 -39.958 1.187 -40.138 c +0.405 -39.393 -0.338 -38.565 -1.029 -37.664 c +-8.335 -28.137 -8.429 -12.51 -1.237 -2.83 c +-1.02 -2.538 -0.796 -2.257 -0.569 -1.98 c +-0.234 -2.064 0.119 -1.867 0.294 -1.45 c +0.37 -1.271 0.4 -1.075 0.394 -0.883 c +5.297 4.318 11.907 5.92 17.926 3.249 c +17.963 2.931 18.103 2.637 18.332 2.468 c +18.725 2.177 19.221 2.364 19.44 2.885 c +19.66 3.406 19.519 4.063 19.126 4.354 c +18.812 4.586 18.436 4.511 18.184 4.208 c +11.947 6.982 5.101 5.349 0 0 c +f +Q + endstream endobj 305 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 508.0586 398.461 cm +0 0 m +-5.75 -7.739 -5.675 -20.233 0.166 -27.852 c +2.97 -31.508 6.696 -33.512 10.581 -33.512 c +10.846 -33.512 11.111 -33.502 11.376 -33.482 c +11.448 -33.65 11.551 -33.796 11.686 -33.896 c +12.08 -34.188 12.577 -34 12.796 -33.479 c +13.016 -32.959 12.874 -32.301 12.481 -32.01 c +12.088 -31.719 11.591 -31.906 11.372 -32.427 c +11.367 -32.439 11.364 -32.452 11.36 -32.465 c +7.397 -32.751 3.55 -30.837 0.705 -27.126 c +-4.834 -19.902 -4.905 -8.054 0.548 -0.714 c +5.838 6.405 14.411 6.706 19.977 0.123 c +19.86 -0.357 20.01 -0.896 20.355 -1.15 c +20.749 -1.441 21.245 -1.255 21.464 -0.733 c +21.684 -0.213 21.543 0.445 21.15 0.736 c +20.953 0.882 20.73 0.907 20.529 0.831 c +14.661 7.824 5.591 7.525 0 0 c +f +Q + endstream endobj 306 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 528.3911 367.4834 cm +0 0 m +-0.394 0.29 -0.89 0.104 -1.109 -0.417 c +-1.211 -0.658 -1.232 -0.928 -1.19 -1.178 c +-7.522 -6.376 -15.775 -5.209 -21.15 1.802 c +-22.34 3.353 -23.325 5.106 -24.092 7.002 c +-24.075 7.033 -24.056 7.063 -24.041 7.099 c +-23.822 7.619 -23.962 8.277 -24.355 8.568 c +-24.468 8.651 -24.588 8.69 -24.708 8.699 c +-25.542 11.287 -25.989 14.093 -26.006 16.991 c +-26.04 22.748 -24.38 28.179 -21.332 32.281 c +-18.45 36.161 -14.651 38.412 -10.573 38.685 c +-10.502 38.521 -10.4 38.379 -10.267 38.28 c +-9.874 37.989 -9.377 38.176 -9.158 38.697 c +-8.938 39.218 -9.08 39.876 -9.473 40.167 c +-9.866 40.457 -10.362 40.271 -10.582 39.75 c +-10.588 39.734 -10.592 39.717 -10.598 39.701 c +-14.875 39.421 -18.857 37.063 -21.879 32.995 c +-25.072 28.699 -26.81 23.013 -26.774 16.983 c +-26.756 13.936 -26.284 10.985 -25.404 8.267 c +-25.425 8.229 -25.447 8.193 -25.465 8.151 c +-25.685 7.63 -25.543 6.972 -25.15 6.682 c +-25.033 6.595 -24.906 6.555 -24.78 6.55 c +-23.976 4.554 -22.941 2.708 -21.689 1.076 c +-18.397 -3.217 -14.076 -5.419 -9.727 -5.419 c +-6.599 -5.419 -3.458 -4.275 -0.677 -1.954 c +-0.307 -2.135 0.117 -1.94 0.314 -1.47 c +0.534 -0.949 0.393 -0.291 0 0 c +f +Q + endstream endobj 307 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 511.9946 358.8086 cm +0 0 m +-0.3 0.222 -0.661 0.163 -0.912 -0.109 c +-3.591 1.259 -5.999 3.309 -8.071 6.011 c +-12.068 11.224 -14.294 18.187 -14.338 25.617 c +-14.383 33.048 -12.24 40.056 -8.306 45.352 c +-3.694 51.56 2.869 54.527 9.373 53.411 c +9.438 53.181 9.56 52.977 9.734 52.847 c +10.128 52.557 10.624 52.743 10.844 53.264 c +11.063 53.785 10.922 54.442 10.529 54.733 c +10.164 55.004 9.712 54.857 9.474 54.419 c +2.73 55.577 -4.072 52.501 -8.854 46.065 c +-12.932 40.576 -15.152 33.312 -15.106 25.609 c +-15.061 17.906 -12.753 10.688 -8.61 5.285 c +-6.467 2.491 -3.978 0.369 -1.208 -1.049 c +-1.182 -1.389 -1.037 -1.708 -0.794 -1.887 c +-0.401 -2.178 0.096 -1.991 0.315 -1.47 c +0.534 -0.949 0.394 -0.291 0 0 c +f +Q + endstream endobj 308 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 681.4711 401.9571 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.358 -1.797 -1.582 -2.025 -1.813 c +-10.525 -10.448 -10.415 -24.389 -1.78 -32.889 c +-0.951 -33.704 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.815 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.231 1.348 -34.386 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.934 -0.646 -1.697 c +-0.266 -1.77 0.135 -1.6 0.334 -1.243 c +0.42 -1.089 0.454 -0.921 0.448 -0.757 c +6.013 3.699 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.024 22.065 2.471 c +22.314 2.917 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +h +S +Q + endstream endobj 309 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 683.082 396.5645 cm +0 0 m +-6.526 -6.63 -6.441 -17.333 0.188 -23.859 c +3.371 -26.992 7.6 -28.708 12.01 -28.708 c +12.31 -28.708 12.611 -28.7 12.912 -28.684 c +12.993 -28.827 13.11 -28.952 13.265 -29.038 c +13.711 -29.287 14.274 -29.127 14.523 -28.681 c +14.772 -28.234 14.613 -27.671 14.167 -27.422 c +13.72 -27.173 13.156 -27.333 12.907 -27.779 c +12.901 -27.789 12.899 -27.801 12.894 -27.812 c +8.396 -28.057 4.03 -26.417 0.8 -23.238 c +-5.487 -17.049 -5.567 -6.898 0.622 -0.611 c +6.626 5.488 16.357 5.745 22.673 0.105 c +22.541 -0.306 22.711 -0.767 23.104 -0.985 c +23.55 -1.234 24.113 -1.074 24.362 -0.628 c +24.611 -0.182 24.451 0.382 24.005 0.631 c +23.782 0.756 23.528 0.777 23.3 0.713 c +16.641 6.703 6.346 6.447 0 0 c +h +S +Q + endstream endobj 366 0 obj <> endobj 365 0 obj <> endobj 364 0 obj <> endobj 363 0 obj <> endobj 362 0 obj <> endobj 361 0 obj <> endobj 360 0 obj <> endobj 359 0 obj <> endobj 358 0 obj <> endobj 357 0 obj <> endobj 356 0 obj <> endobj 351 0 obj <> endobj 352 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 329.1758 212.4824 cm +0 0 m +-0.008 0.005 -0.015 0.011 -0.023 0.016 c +-0.47 0.265 -1.033 0.104 -1.282 -0.342 c +-1.424 -0.597 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.358 -1.797 -1.582 -2.025 -1.813 c +-10.524 -10.448 -10.415 -24.389 -1.78 -32.889 c +-0.951 -33.704 -0.057 -34.451 0.884 -35.124 c +0.86 -35.47 1.03 -35.815 1.353 -35.996 c +1.799 -36.245 2.363 -36.085 2.612 -35.639 c +2.861 -35.192 2.701 -34.629 2.255 -34.38 c +1.962 -34.216 1.62 -34.231 1.348 -34.386 c +0.46 -33.748 -0.384 -33.039 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.718 -1.403 -2.425 c +-1.157 -2.175 -0.903 -1.934 -0.646 -1.697 c +-0.265 -1.77 0.135 -1.601 0.334 -1.243 c +0.42 -1.089 0.454 -0.922 0.448 -0.757 c +6.013 3.699 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.113 c +21.253 1.864 21.816 2.024 22.065 2.471 c +22.314 2.917 22.155 3.48 21.708 3.729 c +21.353 3.928 20.925 3.863 20.639 3.604 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 353 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 330.7866 207.0899 cm +0 0 m +-6.526 -6.63 -6.441 -17.334 0.188 -23.86 c +3.371 -26.992 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.913 -28.685 c +12.993 -28.827 13.11 -28.952 13.265 -29.038 c +13.711 -29.287 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.671 14.167 -27.422 c +13.72 -27.173 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.899 -27.801 12.894 -27.812 c +8.396 -28.057 4.03 -26.417 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.611 c +6.626 5.487 16.357 5.744 22.673 0.105 c +22.541 -0.307 22.711 -0.768 23.104 -0.985 c +23.55 -1.234 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.452 0.382 24.005 0.631 c +23.782 0.755 23.529 0.777 23.3 0.712 c +16.641 6.703 6.346 6.446 0 0 c +f +Q + endstream endobj 354 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 353.8642 180.5518 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.375 -0.563 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.462 -17.905 -4.462 -24.006 1.544 c +-25.356 2.873 -26.475 4.375 -27.345 5.998 c +-27.325 6.025 -27.304 6.051 -27.287 6.081 c +-27.038 6.527 -27.198 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.045 7.453 c +-28.991 9.67 -29.498 12.073 -29.517 14.557 c +-29.556 19.488 -27.672 24.141 -24.212 27.655 c +-20.94 30.979 -16.63 32.907 -12 33.141 c +-11.92 33.001 -11.805 32.879 -11.653 32.794 c +-11.207 32.545 -10.644 32.705 -10.395 33.151 c +-10.146 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.762 34.499 -12.011 34.053 c +-12.018 34.04 -12.022 34.025 -12.028 34.012 c +-16.883 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.43 19.715 -30.389 14.55 c +-30.368 11.938 -29.833 9.411 -28.834 7.082 c +-28.858 7.05 -28.883 7.019 -28.903 6.983 c +-29.152 6.537 -28.992 5.973 -28.546 5.724 c +-28.413 5.649 -28.269 5.616 -28.126 5.611 c +-27.213 3.901 -26.039 2.32 -24.618 0.922 c +-20.881 -2.756 -15.976 -4.642 -11.04 -4.642 c +-7.49 -4.642 -3.924 -3.662 -0.769 -1.674 c +-0.349 -1.828 0.132 -1.662 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 355 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 335.2544 173.1201 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.093 c +-4.077 1.079 -6.81 2.835 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.946 c +-16.325 28.312 -13.893 34.315 -9.428 38.853 c +-4.193 44.17 3.256 46.713 10.637 45.757 c +10.712 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.059 45.185 12.308 45.631 c +12.557 46.077 12.396 46.641 11.95 46.89 c +11.536 47.121 11.023 46.996 10.752 46.62 c +3.099 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.939 c +-17.094 15.341 -14.476 9.157 -9.773 4.528 c +-7.341 2.135 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.705 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 370 0 obj <> endobj 369 0 obj <> endobj 368 0 obj <> endobj 367 0 obj <> endobj 350 0 obj <> endobj 349 0 obj <> endobj 348 0 obj <> endobj 347 0 obj <> endobj 346 0 obj <> endobj 345 0 obj <> endobj 344 0 obj <> endobj 343 0 obj <> endobj 342 0 obj <> endobj 341 0 obj <> endobj 340 0 obj <> endobj 339 0 obj <> endobj 338 0 obj <> endobj 268 0 obj <>stream +H‰ìWK®ÇÜ¿Sô^³~YŸ­(À+Ã0¼ð²èQ€ÄûŠˆÌêé!yø2¦ª«ò™õ韏OÿœŽŸ~þ|¼¥CÿÎdÇooŸþö¯tü÷«~,5ŸuÎ֝eþòöŸ·OŸ±þøzäãøúøý­•såq´™ÎÙËQÊÙÇ8ÞË9«ùà¨8`¶|Îu¼?Ïû÷ñûuýÀíà\¢|Œ…“Ë,G³3g(ñø¢ü¿œ¹ã˜tâÆzƒœOÏ7ÜoiÃ÷zfÜ9HÜä"öìOðcMsŸ{uWÀ´¿Iûœ¡_¿lG8'•m>$Ðy¥J§íO$òL TÉd'öòèuWŒH–ò’½ê÷ï·b„áŸ/¾mg[ ¾ECnçj§9²sZÇޅàôÓz?ò¹p­Ë7äNÙÑí3r#µáÛnÝý*RÇ­.=ó¨ÜŽ”ä )¯ywÁ}Ž>æÝ¥Œ¡a§†Ž g¥k'œ Ýè d+ݜ]?—+G•h2>o™±}‚ÒµSÝKúõ#g•¶óó¼9vAYìãÎm!A™Ô¤‘ëCƒ‹Rü…Ëðsí?6LÒúd.Í9X(çZ9P>› bÙ%/›º‘¨ÃÂ;нšÆÌppÝêðã©ÏÖÍa3¬·Ê:@XÓtôA›D¡ò²µæ%§ì†!brF/•™%'¤J'ŒVµ+Pòƒ‡ 4莊œT(§òv©#˜3ø[ÃÉ ÛRŒsÞà±Mü}P ·r·!û:?y2y²¹_:-ËЋ$atê|Š¹™-!njUÜ5õ^‰xT UÈBö*J$µýeðÜá[èzGp”6©Ža‰JŽ2E.IYR\rg¥$7}ÁIäSL´†2TP†É4ÖIkÝB(j„y‘?’ƒAq×íx《0ZŽ`Qçñ}µ³®â®æ–/@’DùúÁ-(„‰wA +EþnìBÖB¥D‡#ÆÚHV0O÷ªû‘~ù¸ûø[658£f¯õ5ë--ÀÛâ;g eÕe‚“ðèûÅPÙÊ(]ëÜ°{2F[¦;¹Í—)\H¢È›Æ“²L"¥ç–X;û<^¼e¯©ѪÎÓø¢"Ñuˆ~§Ìû˜PŽpwæ +cÅN¿™VZétl˜Ì,É<¹R1Ö|Eúžë,³ÙD)s"©î”²ìF)AQY•_óܝ*ЮÙú†Ð}²Òضܧ5‹Z™šo¡OI6ìtÕìނɚǯLô}9L±e ^âD fjèH$ä÷¦RB¦–ÌGœ´1ŸâNfHç|׺—o]D¹Ññ Ê¿‰;È=œG­q°ËT¹@=GðÌà ×JȜÂ]IGi0Gh2¹™9Hs½9Ãð/¬ïU×{uÒÍìëəîÙ5žþZɓÍ.EbŽüŒç±mxu=+?Α ±ÝgŽ{%ª«rŠ) +P^´”y‹ÿùö‰ÿ[۲خð± ʯ“ƒW#õë^©}zk͜ÖÓªº† ¹Îæf25}6…¬vZô?2J õ}òíñŸ]}7gfÿÞóÎO¦kùÛ¾-dÝTpŠ©ðQ—O™Ò¥*Is}³¾ÒÔÇ{_󱋍`°íÿ¿ëï®?ÿgºþ-Ð*—jpÐÚ~ï†E*ªL܆u’§GÊRºd­2œZ9O¼¢½ó2ö†ö¾óÑòZîÐúŒ¬zWËÎz¹Ìb¬NENîv¢¬ŽLà%ë­4G™«•–Æ2/Ñ.ý-²úª2»`Òl¾~Ìq“IlYӆµÜ_§ ¶¶´!Mí¸d  çËR^˜·`«¤5õ{8§]ˆ—+¼è&hùec!ô”Ù]Ç«Š—ŸôÊsèÏ ¿ÿzr¤ê‰0“ÉOšÁ»ºS´¨¨ªý†VõŒ2@H¿ïÑ,Š7‰xß9’2 +eÙ-„Axwõ¬zwޖû›^¤ä%¤¢ƒ"*ʅæȊbÄMüÝê·h5)ñâÆï"É~n=Fådwºd‘%OMgæ“‹ø§¯z ª¿Æԝ8¦¹¬ nl’rMskÄCÐù YÛk‰2ã#̹^ǵ3ØyÍTœx¹OÐgÿ~VÖwŽzŸ(LµÅžÛNÏhÊÔpù¤@X•½*ۘP˜šD¹}ýê~5~ŸÅê×Ýî߀Ieäw}ì»_ž<ˆÑSüU "ü¿ÝR¡çI²VIå^Ԉ¯o‘îû3xދGÒ0Ǐ7Ì~×ÄÙ±Uï¶2¹ÇITôÖhšJ‘Ä“SÉz¬êdð†žÏ7,MÈTÍïrÙÐ)¼œˆ†Ú=ÛÒ80˜ñQc¨`Y²Á[§’i.ÊxM¹v“KWÝ#'Àª†SÕ¬Ó{2?ÓE5fÛ   >kŒKN9_ãà»4³fÄ &4Óxx1אauõü¬jó™•ìÓÈ +9ë©ñxsÅnêªä©Šj¥9H$rµzò's¼s*ÜÑÇޅGtüó.'&ÊÙ5$Èc¯t$ÜfôýÚèÁ­ é^åX¹®/Ÿˆçbóþa 2Æq};Ûú<Ú¡Îö›¯õTïßt¦™ÏÔ7\Ïf`•)ƑóÞϲWÿˆÉØ«võÞ4Ri ¦Ðë+ôjˆbn±|Çn¯û¼÷ý’Sç§ý‘‡‡­ç€ØZVm +zn’³ºÏ¬<ہ´LTË·½È¥&ÂP™œ€‘‘¥„æSºªìä{¯Û'bÕh¯pÇõD„ë³d«‘_ÉÈT/ft=®^LÄNP^Èá/7¬1°aØÏ4*›…ªY(ï¸,uU(ØevÂC…¦rGYŸÙîÕUƒßšP +ÙÊÍï <õå‘Y‘5÷zö*+%@ò 4µhڍDØÊÜ á@SÕxk)Tñ˜M/ŸûÌ,ÐG ¬AÛ'ÚzC1éõ5Ô´ûÜò{ +ž +*"½|BiÑ5}"!òüêÏUüYÕ§9m¦¼}÷ðQNó +i¨6­²œ7ò-ÚXîw7áÏ2@¶ äÓVÓÊU/ȧæ¹ã²¡yû —Ès6Jh\…™×F® C«‘‡CÜûš¥ßÎYÁ@…:£ö¿Ø¯r$»b–Ï)|»´/çéāûþé©·|W0I¡ŸŠ"AðÎ0vÄp5C(©?` +9º^@½V¥ZÔ¡\@"t ,‘VìEØ»9™£ª5œú‚ª-ª¼¸Ó-vJÕV瀺—Óˆ +Íã ‹‡ÉÁ"Ù}«%”&1üýîâìr(£$Vû³‹ƒ` ‘†ö<£Tö8@§èå€\Ž€˜”Iƒw-*“@̶6úùj—ȱ.EÚV6iÙÌw@»Ýl.ž©°rÎÆ;Cø%¨4O«ð«‰FfP;„Ò3Uï‚2>ÎKC<Ó)GvgÒA:5ëv¸†LÈc:Ò˜Ù%^Çò3ò]oªF æü€ÉëŠñJ0ʁ?Å ìÆòa¾ÃÌt!¯)ù|•áñõãáÝwÍqiÔ=ñ²WH@áÒ%z¸¸j–Ñw_»Ÿ ZΪ”ko3í)sþ@:"fÞ(´—;ܹ°Í• ›ˆ˜µvfPÕ.ø™jSª£,IÌ-ϪÔØ£'RlJxH'a5`ǔÃêa÷šå&ønaÁÅfÉOC1_÷½#t«×m!Ä –ò¢¡{ ˜•:°;½Z»BèÜw„z¡J7gwåöBž6äªõ„< R=cÍ ¢X-”2+•1©J»·üq™ºý,Ù©4A—ù”kÁŸkSuìª6”ÐÂß˃þ"ð®×~~„Èo‰à ÜHÞQÀÈÙF½8`æ™ã›QêÛ1ŽK%*Rqõìg/GŒ¾%ÕƯ¨É,†`ÐÓ,ömyhîÓ£eív”dXÄô(ˆú¦ËuJ7{ ¥Ó …‡ý•þ[äĄÕ囤lÕe–DIU·´FVt þôÙ¾‡IäÍjP ^mRëÔëùª‹úK<¼ð!Ö§fÙö?ců_1Дó=æË>1¡1oÞˁ젢k¡ïõ&Ä°Z­Ýö3L©ÁÚP@O¾Ù¶»GePДt?À*+v`m+ðÙõEÀ*?æ1sÁ4JϾP/Ônéó‰Ýh؛3ÁĶý4Kç<Þ(Îv¨³ÍqûœgAšÊu¸åōÍò9üd·ÿ×ìÞHÅÙ™Ý ÒéQPÚØjΐÆrªR±Ì¹9yv"aÔ)By =Ýa©Ròöu¾Ú’~~Nòæ5¢Gû,Ž€ë +ÊÂ=ýˆ*üSìYŸA)Æ6ã1üú'ÿoåmdW#” +â*9+¥vAOÚØi¢.’"’7r UZ½¬§@ Û£8ÒI¤r í}JU!/$=ü€Î EÚ=xAðòïT¡Î[úõì  *x`øSÕêéÝ7+XK0ÒÜÿ¯„w§äTq­E‘='‚äò +27]Β¿]ôïÈ®Xkh-Êâ|ƒž÷Ã*Œ„¨¨Å|8uïq‡hÕ¨k_×±¦Œ{¿à™nãkåa!ž&¯e•ññØe6^맔WF‡S” ì +Î?>v-Š³JL¥q“ –«?ÑÆ=xå]‘±{àa@4H¡®æPµ•(܄÷#´p•ª{îõB1s[*䊬•uµ¥º] YkUg‘˜líd`Á9h Ø?Zf0Úd¨ýxDNC£SôOV¡R‹EvÁ4cÃ/s¥,wÆùhwݝ¶§‘? 5GkќÚú4:j“¾œ-ÀØJÞ|C™!Þéý›ßüùÇüiLQóÓVæÒ¾§5„r¯í"ˆÖg îJÕ +Åô…-_:5ÖmBK{>Q¢ÁÈÆ%ÁfyÁF&¯ØÎèRf}¬M•/`£òÍë\°jS/œ±w@{·Ñg¬¸¶t¬ó´,LyÊ©[OÙזC5¤¯,dj¿ùê-Â#v |9ĸv°(یÐö©züupŒÎ$-³y)‡éô[é9¾½X ú"kGÇ:NË’‡™ïê–;:ÌՃFÃòäÞÏSß4RCëÁâ#;oŸQÛ©u¦ÖmdὪªd/äÒDíÃß2¦hìÍü÷ÁªY!žœE\ô ±ê³éõ¯V8r?+i_z›ØR½ñ¹Ò|¹o½DÙ7Á¦onŽ/{«¶ \Éê/á6«C4*ì HSÀ\ë- Á.´kLG F1öøBftñ—Þ3V¨Ê+?Ik܆»}¨ÿàýãj‡6ٛ7Ù³_þ Ð%ێoVBëðEŽ;[nN’-׉n®v• +º%Z÷°òøø§ÊÔ7‘äQl‰»r{EÀh³C:"¶»ík9àk”Ÿ¬”3]¹FÀwˆƒ¸&lxHÕ͒¿%æ­£ëÝៀݒ%՜j]ÉB¦ZÔÕ:SyJ wű‚Ó·©Þfú­Î{½ù¥¤Ç¯9e’íÌ8ôW/8Ù¶8þrLGgf§X çgCU;sÇdOÃg&œ€3Z@äCš±H yžH.TE%ÃÉÖ¬³Ÿ#&íœS¬9ýUøP†bh!6·)²;…øËý콊‹øá+ä½/yqÊKÚDPÐZ7«€xƒ$ί:<†UoÒîÓê—Mh&'é­Ë¯ÆL“G –•\y;P”¶€P mÅš„!hnªâ>­íÑ £L¾$¹ &ùª®Å°šÔO‹"¯ê—4`fFŸ{  å­¯}ª•ÓÚW›‰xUµ4I-wÔåvǝm.všä¯1Myô¥zP׀ßc¬ ò%›ŠÂè¤úƒó"YåƟéŽW$×妮Ð%0¯gÝ7«à-IaGmnë8y”ñyÆàÿºÞ¬Å1›³4ÛM¶1 +Às C›£¸­À×)´–vÏ ÿfÎAá¹±%I›c…=mG*ƒzìWÊ7Pa‚É.ü…±<ò!Þ$«Ht5‰g–I ºîƍ´¯o» +dՔã2:©ùLJ…¾å\÷§PKáϽÓåd´ïcƐ^½F93óÙ¯–;r¸÷)ênH¢¾ç)4``ìÍÜ1ÁJ™ù^y00z9›*ÅSJ¢(2ÜçáA•TC2{˜2mБe5H}2יŒÈC9nóã—¯TґY® ÿOÐÿ$Aw( óâ +¢XPÄ7¿Fuæ_ã.ȯ:cü‰FӟZ²¡ûؒ×ñÒý%”kØQ]‹Íi«œƒ¡.C}·ÂýKÛc¥n+÷ .g ]´(<=˜äAÅŸIž|~ Ž¬ÐtŒ:?¹n¡6ò¤¡„J]i|“+Hõ4w&¬“wœS¡Ís™÷On0ed¶Ã$U9#Œž¯4­¤ Déí•p ëO¢ž(‘ 6"ë9K‰lwØŸß`@›Â/‹îƱkW@w©£}ÖxEþ.Yn«ó BOk6: ßٝ)û¤z:€<ºR¯¯›Ï&âÏX{¤ØÅÕú¿ÿöÉ +ë $++ý…=c|é"Zˆ_ Õúü63ËóžÍ¤ª½ò ÊL¼pÉü6V¦2oû:úüv³aW>ìõ ^!1qļE=©=#BÔí±Ë>Aìè„P“ÿë¢ätæ(ìچ‹|nQ¿ ;°ÔYŒºôیZ +»g•Eþ¯mš4ÊmýkÃH1a%ÛøÎuRåºæ•ˆ$Ñ,ޖ”Ÿð£—WüpTʂù n%H¾ƒdakÔù ü¼B_F:q•I¨t«áª$O›ü¸¤ ­}ùZóþ‹ßàþ‹3»ßq0jÝÞHø® ÿgìþÉsAÌ{x·COz`^*q‡Žòû͖yFm%üÖZÓÙ>Üó^ +¸CrÏW +žÁ(úq,E^#Ú'ßkÀ‚®_Mmžú€eÇ \3±úþ2Œ¿¸¾—éxiÿ!­*;¦Ý0ü?çÁŸ|͖uf%Qa ˆ.07)¨—%Œõû­Q‰Úx¼Àþåǃ®ÑxAÐ%9¼/»ˆÈ‹Yó‚ZéžoÕÉnM‚¾œ"\&3Ë3Ό9ï÷"°ßÌR« 4ï¿[õVå{¥Åek&Éô±ô+šS¦©Cïz|•ã‰ôéÞɪ¸X‰œ£ríOÇfÄDc] ++ò D…‹—½c}þS&½Â \nÃóÑ+û[Cq\åDà ý¯ìµÐW³w¸ 6CDZ3¤N¥£l)r`óçÀ*JûB +œ#ïê€ûõ‹~mXø’NŽ87›äÏÊÇvðé/ç”sœPö*c† kùüˆe0!#¦bÏ@bãœÏ¬lÙ+ï†:ßWÜêí¯@¬]÷6ċw9nM» "yð¬4o3Ӓ&æ»Ú¾CËg²!¨y!ªÐ¹­`¡ŠÔ2°¢J‹o)À›N;søRaž$çqZçý—F?ُúm¿£Žcˆ~–öMW¹ÇmDϕæ;ÆþJ/ÿãW¤Í ÿÁsoØKí¼}ÿŠñY²Ûy/8Q ù¥°sŸ<`˜mÛ}ÈW}­²[ÇúŽ°‰R¸ËÆ?Žúp•§Œ]]ME·?Å`,vê#0ÔÜð灉]&qõç­<ÎaO|¾Ó6~{ˁ|I£‹‡û<¡7ÇhèQžg3Há'ù£¤Çðú +®*ë óÓÎþèjH« ™—”[9Ô+ëË1 Î)=|Úë;t®äƒ×ß¡¶ºÁb§Ï:¨üXgބ‘ožø.£NÅ{Â'çªÝó˜z"ÏÒ¬D¼ož‘â½ÃD(•]MR•@Dŝš/?^C bgÒ í,„ÙÉí˜ilðù-d ¢¹-µ¸îèÎ +“Ԑ +îãÒ5Ÿ6óöp,•‰×UØà7Áå×6‚ËlâÛvó«nš>$¶2sJãžÒ]åõF‹¯+QŠÿ œ ç þÜ0Ԅޠ!ßrHòè'‡U +K;c¯óÁ«¼ãÔÛG;ÛúŸû¤ÀïÝÐóƒîêþ÷ìM¦Fqx lr8Ä7÷ð‰9˜f|¹Ñ¶pI¬ríK2yòkcì?‡T¡?Sl/²láÁ¼rÀ͜l+7W&Ìÿa¿Jr#[rØÞ§ðlÄ<œÇh ®MßÑ")½!3íô_| Vù˜1)EuÐW–Á"=Ѻ1a*À.EڜJeÚ8ědZ®Þo|Ñ%®Øìb&C~õ.³™Ù_>íƒÍ?œ-ôPk9¢…E§t§ÝŽÞáæÆG’R?¿$ Rbdy©J•?£‰1¿ÎDjE~fF*X· &&ûA$4+Œ¦u*ÜÃî§vqdg ‰çÊÞ+q)}ù +jné;í[k¼ß²ÝòwìO\®5œ`ºü1•°ÜÞк£)‚tô…Í»OÖèœãº4`cqºüQ,/‹aÙeo@N£ñÇÅ0¬~0üëÆD“.·£ªÍvý[² ayW/)1¡o0AoźKJMuUð–Óùbw01˜€£cŸºŠsˆ2@ßxx<—½Ãšž²úöÊ·ÔÍjpª]­Ùmt€ã[nK¨aŠ9k±¶@ã!j¼)œ*»ee.!C´oØAdÑ ¤µt.4aãáýã o4º•5п]OÊ ñ³ ­L³ï°Æ«xk™ÇVRÍH˞J´—,s{cŒv'´Ê¬:¿l¯U6!…N@y ÿì]@-Rg“âäù ™Ž#˜ +‰.¿Ö¦0èã<$ŸU~£@HüíQߢ¾ÿ‰úŸE}¿E}ÿoQ¿Å…(•Ì~>d!Õ»@¾#©Â@Тôï¬ +´À `ÑWÄ‚Wéß=¦ëPWÔ!Dã´j¹T÷ lv¾A5£«zß ¿¬™“+Co©´ ©"Ó«”])™Î{Åü{|Nlý£.jîrí¢ÎÆv¶tY(Ÿè¢Æ¨G¥"wôWÅ3-4¹4ò ³¶b¶Iòw>K¥œŸS  bµaXU”¬€'jò¨û½Kª{ÿ K:ý’ÞºO¶As݃¨°ü ƒDEðvFÏÞ'È­y`Ëe­}­覭ˆ™¶Õð …$Tªêù>¢Ç±Y¿yº* ,’н"'y£V;[>¨1K¦Ìm·)9BÐÇì]ãâ³êM֐ÈO«"ô9lŸŠDaD/ªÁ]`G¶»á!°;—¾Ååz"†ÓîŠ.ô·WXêÙ·Lë„NFÇV"'Պ¦dâ%¨Ñ}ôHß1ËûÕŏù’S…ªZŒ‹ó/qÑÍãýà“;úP;{àI{ߦ¨6S•§xb¬yŽÍr~/ÝÚ Y³µ=‡f.ǚÉ5}Ì| Eǂ—_DN!½^( +iiÕù¢÷Žgi2éU"ExÏh·rzƒÝÊZå1d¿'ø?+½‘Žy®ïŸÑ܈wò4u¸=«"jvYÎÍIÅ ™WÄR­Å·RŒm `°­jå fèâQÑ&PC™Ù v¬4€k>ÆI 2ND2ý%ÌýE¥FƒK¸›ANNd*Ò Q›8M°b•OÅLׯ÷…\–û¾dof#Ä@íS,JÞwuä½ Ñ̇u”:œQxæZ#Š´#Y$v€Éꕘm¯°4:$sÄï+· Ø)S"‡GVI)GÃÅ a³ÌS?ˆ[6¶©¤·ˆ·Lç¨_D¢ûzG?Ëðr ,÷¬dšrx™â67\pL‘xm¼%í),!Îû «ó¿0:U¶—,c:2UÞ%‘S÷íÇä|P³m´xûžK ~*åÌUÌ~¨â €ŽZTi]»ê cϳðoVêʄ +„ºEäDÒÎ7ÈÜå‚[ßšÌ\âè¢æäbãÇaä!Í|ԛ‰Öø'Փܧ¦BÊØy0¹Âëý‚vÈå¤IzxéÃéÁŽÔýD•!ŒKöš¹üžcø·Õè&5–ZD¬2¨Ù)<,!ޅܒcÐc°Ù&ýý¡*.¹dºÔÉøýFGÿþNjE)*Nˆëë?ӈ“;˜û€W'£üâüåó9^ø$çòã,8ÿ)ö<× `âõ„Ĉºš3ÂÄØáz \ý«Åþfڟ‚ô REò¶Å‚TFjw]žÔ´ 7xž•Ü(¿Ø9qL*˜:Šèç×Û½ÛüØö_äLJîíÛÓý»;øÅ:ÿ¦É5›ÃÜÉ2™¯"â©j€êXʬ!eLÅ€Ò%“9£öªŽyñMÔâ1*Á‰%¶¥©j6Ô"p …8KG§=TÁfˆC—ýàrՆ,Tt +GÝqYµüæFOþ:-³,Óì×77WLë s?†[û¬s!÷kå³"SJηÌ –+À£ †ÄFu¨Æ=»Øâ°v«oå2£Ûï¼ìXghEü³!aŽ”Îç…VČÓníp¿V {Ö~»YücaÓdWß +önÙ~½°N­;_fVÁs‡Àç©ñOýÌSvit6ív3`ù¢{ aeìp¿‡Î@^Ù#3ä\üCb 0(ÚöØHkÝ9–þ) ×àM¬õÚI–wX~`;u÷‘=.ÜÑægWd»’ý˜¨åÒA>ân×q“Û l¥oÎËüœÈdö¯ê7Jþï€èLÄ}eGF.5ÓÀQn•è\éHÛªÐù=V&5¸¾¯Ð×[œê£a_–=µ™=t«ïØòI+­š½‡Ì8N’ôUóÉÑm.W::Î9´N×M«ÔCNåØWˆÖóTu‹|åÍ^’!xÏæn›ûç̲BUC ¨ mÚ_*Ç,°Öñ°€$l‰Ž’÷ˆm~cP45N´+Íyÿn‚û@ôël|4Z{@Üe’FQÃÁïº~gP<•ÆŽ'ÎPîG„ó1'ÃÐ?ÍgݙÞ*ðA2äó¥ˆ5Ú?~Yõ˜R“æ ê>Ÿ?˜8ì¤6é)훉à+7QŸpBò†lÌü„íU¢_Ãô˜ØŝüúgïDG¢0Zluì‚MÍR3¼ZªšË;ü1ÝhäÅ-ê®n12$ð)ÞÐEðòñ9sñïÌ¢ûõhÈ鍍á„(ù~ qGØ'zÅv +Œ-XòÍØ/¬îe.½r.GbËÕÈ0aš2UÂ2Œ‰Œ¦“¶iII‹Íä[äGo|yv¨zy+Ö4ó̃ §‘{ʪS³›Ëo±:ë«ö)kúzŽÆÈ>ËôÚô$-з#£½íÙ¶\öÞ0Zªk&f¬S5S™?‡ºÕ–l¾ne™w‡Åô™yš}M ÖÌ2úûüJïۖ‰«X ˆ{/þ°óòÆýÙá´K~½µ ϵ2, &oAŠ,á5Îg2Fi`»iJ~\_)Q&¯qöÙ,ô£—/{|†\¦,¾#£E*| üÛ7«æcÚ´ôÌÛ÷Ö¢Pe¥'T¦@ˊ ônù cÓâz:ïGè{1š;šŒ”QÕȯ­„ê Ž[¬A½ë“õb¯-ô¨„ÚâZáQnڇÿl>·öõ€Â °€d}ƒ9™öH5Rhæ$À.‹ï¹_”£o㐪øþU˜'ø“ +Óni7­Õ1ƒ[é¯zŠ5y¨–btæòLº;þ(›íÀÀ ›·D·0¬S± üz3þÏ­Ÿã ¤p,ò½9Ù1º€Xjéˆ&!¶vh³ýè?-åê»á6}æ±®7ñ?ÌÈ;Nd€Þàr5vª×1ÞÍoã\ëð<,þȔý±Ú™årµ :;FÃP_{·›{'ž=½a°Ýk¯Çðï5Ù.Øú‰n ºü±õ‡š. É¡ÀnèiÚihh>6 + ™‘/TÊ:Uʺ(7¨’ò„o²d=—*Ådn%EM¼¨C4ªÔD›Yî=ÚJÉÞchPû"møõæ%¿R(»þÞ;vtäLVŽQY ¯frjº[ ø«˕†å}ŠþOûr'¸ïŸRªÅÕ3‘ ”)Q×ŒÆ`‹úhl}ŸbÈ8°1w­6ßCÓÐÉv¨×w=TxøbÃólÅ,q•³•/ՎѽcVñ££x°t¬Å]:橪ÀÈ-Ÿ0Ózüx^BdÆ`õÞèõ5È.Ò±Œi¶ÅCwAÛwA&ýš–6+2Å7w„ÛÑkÕÌZª£µsoó|‹%èš[C‰–èäë†^¼óì§e”å’å÷i.€1¿K›…÷9î14Ô­³×²[¶”¯–ó'ÞÍ)J ê`qC¡^p¢ósEF ÿv¦"“LôC@Ò¦ ¤ò)˜˜*Ym&¬íåAàÇ2¯ah™MÆ +ñs”Ê’19-Ô'Â0ù¶1Ï'Aõ²ƒs’‡ÙøÛ2Ké6nˆéIÅH Žˆ¡mˆ˜¨[u Þ[€iƒ‚É󈳘¶ s>°e×är:Ô°)–- ÅfÂ@öaÿ^Íâ9›Wk”0tʇ´µž¿–™¸CNè›7ˆóµ½—-˜|9‡ˆœ8eY¨1SÓô ! aå7¹]²ÿ °ötá‹ÄZ·à½pS×\Ë kh¿Hri¦Tû| òڜ®“ZûE’EOJ79ãí.žðüûúvr ÈޚN^Æ3k–Y’à¾zö3Â,—³Ÿ!W?ã«o?kÇz8ú|¦y:Ωíäê-9yÕªý&1×R‹¬ëArò-ìNí‰9÷¬u—œý}Ñçjî« – ÑΜ:œ.kÉih´-¸â¡‹›lXÓ`—͈²R> ú1Ø´“Ú'FqJâ.ëKÜeªiTi˜Œ +Ñ|°ˆ¢qŸú€÷ü(c?aìe üKoäùÉ¥ºê9D&# ‘Wcˆeúò˜1bʸvVÛ« èpVæH51)2°§­Hê5;ùHLËÝãÜ´.l1MŠêP‚Ú>Ÿ%VÜ)Áôê4ÿS2br­>ŒôЗΘ¿HZS6ÀŠÞû/’¥~9ë“ät¸k=JÖÐGz”,_Ür(ge6[p‰ˆöBS£rëŠÈkÕ|Ãå“cÌ4âž{}Â¥Ïõ×ýéìúÓŸmƒ¸…j £€ož¡–OœDÊÃà@wh[y2j°¼Eé ÌsaÑmãú‹† Ç(»–&ÚvUŠi_C/ٕŽÕbüÝ5Ëbó¾ïÆ:Õ5Ý¢‹½¯“ýô§JŸYJH¯îÙãh3 ²š"̛Ûxºgžc­qH8´í=7։¦¸¬¹˜ªÿfÙ™êL®Íá{AãØìájIŸpj dIŠãúŸí ÿQ©:%AIl·FUÿ{”í©]FÙ Æ{9²è±ևâ/•.ÚퟅAF²m>ñÝðUOқMƒ äÏVÀjS\|;ýQ8ÚØhj|¤×–Žl œ{Ñírŋ•Šˆq±ÚqÔ\ÁDZ×í8ƐLªqìՆ"nMGûÀˆ WŒ–¶k<ҀGƕµC>”ÖÅTE=£ùƒr'Ë zšÁ÷‚,\‚ „%ÝáþsA°;ē‡ä½-øu ñ¥+èzÇ=³—Ví셟ˆÏ¶HE½¡‡ÚM~æ¢zÊBoGHöé„`„ö‰1æYåö½f)î*b + ÅMppº`…ñ­6k>×Ø7änºŸ>8y©M£Ñ×}PV£èƒòTп_¬þ³: +ž×Ô¾ÏK<…°uZ–׈Çd­ÿFûš¬\†È Ô0Ne{Ù7¢E09QŒ®â`íæÐ2%3àlÚëkñÔÿÚÍ1Å$¼BE„5àÓ'öZM6F£6âñÌQË'Û‘@ÃNă¢0´éÆÙ÷ ~«ˆkCh›òUìûð[“GGãJR.ee¯ãJ×^Dá)ZͶ9TžòÌ®’º§¤4¶º8‡@›æÅiÉ• Z+¸ÝRªŠÞàU§‹­óJZÜSÁV[_€÷ÉVè3÷ôêpGö× ±±˜‘“T ìè—RHÇ"^£ñ·"öjoÌò‰íïo3)~àà&`x8}î}¸½ƒôçê4¹çr¦~Š»aDòŽƒõØâOêŸQ<^“]Ý +ôÜ!ÊÎXÙ¹AÄ`îñ!~ƒˆº”ìÏqÌ;ŒJý¹ä&fäÐ =Æê€Zä|“ä}\øòwÿ¬¼!lYœ%¨Ý1ºŸÿÃfÌ·e~jôÞ%¼yU°¾¨Ò”¢F·»§¼r¥x̨ùVÜ´M?TéÀöUl‰­`²©ÛèðIJÍa¾[gњk,i¯MˆÞiٔµ–Y얲7§¶5ªq]<{Õ6%wKޙ󺎞Ö÷¯¶q28¶‘9ÉÎâ«Î+½£Ý±ýÿ}ꞱÈöª‘㱯‹úWXu(bóìñ@½ë­Sèm;ïsýñ¾ÇZ™œØ0nƎ‰“éÿRoRzÆY>>“Ò3|d%2¡¹ü³`f²g•Öz^Š´ÝÒªhèÎĝc6£‚¤ßäcMa(Ջ˜Í(‡Œ¤·nÝæ †f³H_-ìъÛðx`2’ç[¤9-dwÑ)„Ì/{lÞÌÑý *Ÿ¾Dœ7z¿¯}þ…és…-™",Uh4ÑT–h}/ +c>Ó5‚ïÃÁ f5½Gp"®›,›pגµñ\@ô$̾0]ÙÓÒ[Èöԏ¨7‘&NªkW}¿¾ü@¡eUÎ&¾¾ìŠpsƹêBY5Áú¢}£µÕ)î`¨qÜJþCvwÙ·q®˜~›«LgÛî{;Þ:0µÌ„³q<¶æ|v® •äÄêômäf»ÁyÞjîE&ÀlKm¡í\Ǩ»6|H -ôãÍDö’›bZ3Å‹ÎS=“Ã`Ï{†Ï\1j͸¢Ü’-y3T£ZŽƒíÒ§ÕÌ¢÷,¥í7*j¼Ät”Å´Le}¯÷&âAjÓâ 9z6¤é[õS÷m¤è¸‘äòß͆`äX«‰4–×X"@nãÀÝúY€2Š£Z6¾Q2Âüӊb‚050¬ÏÂãXè*b³ÐëÓ—*BÂoKª1ÜS«NðÛ<ÖKü£OS ñi¤ovZÁFv7fŒâ<û²K@vìY‹Œl™)8êŠx«¤öð/“úç«Ã–~ÞgAyꜻғ ;¸À6]‚¸ Ç3^¥Às?gAèŒÜ6±ÝxÅv©mõI@ÿ'·$âÄêævÑw ‘íΞÔ[£ÚÐwÇlj(Žc> –Ñ|“£É ¼tée½jþàᖮL¶;Lê0Â{Ç6dî¿ß SJ”š*×ç0ná8µ=“,š“Í!R+-Ƨq¾XûÖ܈ûŠÁEg{F˜¤ ߶c_Câ:ÕWÝ¢²çÚÃ^Õ§çÅ~a0æò;Œö†P÷9†ŒƱWm@\šŽNö;öí¥ ‡ÏyòK^3uª¯n õs±×|X?e΂dÇÖ\ˆÙs‡è66²ÑÒÆ^Ãވ¨‰°ìi1o²>¥¸ÖPùrÚjù¦ŽýH(ÆmÞÕØÃx‹¬ê–6I‹ÖÌäGûœCÓAMë/Ûø¢ným]Åג˜íRÛÈ7u×»Pq™s1öeü[œL$öÔÚ¾DªÌi<±µx‡I#‚ «û î?/.dкڿìW9–c»Ëkµ®£yX“\ûO?Pº“;þÉKì I”(q§-Nÿ*j>¹kÚ°TÒ+3Dbã·úOåÛà˜QU¢¶ï1Ì>cÃ××°Vb´=0Íò!né µûëë40ÍW·´eãvÚ]ðõµO÷ùCYJ_uçî-ÌÓeö€­,Ǎ’¨lµ +zº CÛóÍht?¤\ÇíiI…êHÚN1R{º ŸJ§k`ë&é›îܽ89H½É2}Ö=`ÛIÀ 5¬N :Yé°6 z]Ùf¾¿( †0ÕTסÝ9Ï _·RC­rÊuª%r/QADÒgö£ê•¢®Øz äk§½ã@–p¬¿cÂã¼özdu¢U5mQ­gž}at“ƒÙí^"÷CÆýLÝö8µ{ï©T¾JOcšOÊöñ@ÊïV¤ÿ,;,ŒŽ" sýÂ÷V1Ë`½¶ÿzÅÿzÅÿzÅÿW¯xŠÇhᕽ7 +1Ì­®:Æýyrېò8=µ ‹Ì&)ÀG旍~k¹’ƒvÒ7â‡-”¶*J8½ÓN-–ßDH“d»é› +¹ÄšVe¾ Ìô­å‰íÙCâay¤D¾„“¸¢ þ¥XÑÂ[®O+zdop“dÆÕ蛦l͑±°>\À¿ù”øB–¡Ï8wO¶ŸÛE¯fŽüp—ÚZ½¾ÀvYpbc*ÐÐ<Ó¨•OCxõ›Ó¤fQŸDê÷vx€U£.E$å®æ¨ÑÅ+ôÊGK£-)q€ j#†›Kaċ›sÆðhÌEm;¯OU8Áֲ·äø„X¼¡mä } ?Âôi~8ÊòU-!þn¸ûE£ƒåMå*ÔÚêh•Í’>aßLz`ªÂå£Å´C³¶ð…ÊÖ_;ëβljfÃöì¦Ù1R"л`Ö;‹LæÜÙ2Y!]kFb6#Š±ŽéQ +ùÙȈ4Œ„êÏ ¦¤ ƒ1Á˜æ¨oL00xç+捠Úސæ<1õŸ9;O@ cœÙWº@¦U ©Âžm&¿Ä ê–:T#Óò,© ŽÉå#-5¿Ú˜ó#.µßoÜk±V2’€wËÒqœ.2Y |Zdõ´el|µ—cù zÅ ëãïÓ!¨µù]8‘có”Ö™VQ\ùÍØMÌèÔ’qK ~ûn\¦N4*oCÆPyíçˆ)g­YWË%/J*\”vl,À2/3RÐ:FH7ö=k©.m9}¡¡Æ¬)Ó&õµ¥¯uMIºhùb‚Ë,í3z†éŽÞŽÌu”!šùb¼Ã½Ö˜íwh¦fáòc|p‚ÒAÍ##¡ ù”ÀØBŒò–1úF0¦"ÔÉ=_€ 8÷¬²3ʋù³*Ž +ÓÆ-ô» ýfZ­ÇEžDø|`>§Vȅ¶Þ&áäñíbð¤OTˆž$ +ÇI¯•.xV“57Á#þá‹\>¯Œ‹.š™tɧ7F½ÆìˆW¨aîY¥MR¯¾Ð¾­ 5“¥rjZ}SM^S‰<ÖÞR×æþRÏ.ê_¸Š®ûÁ‰*)D¥ÕYO) ËìõØÌ5ÿ²«"«Q½‹Ú –j¸Yðu©8ü#k½ƒµ•Cœá2Ái¥å Õò9'û•¤Zž™~‘NBb-Wqã‰Íªïf–A^Lƒ&KÐÂÞb“†•Ú×J˗Mãƒÿ£ ,£;²…lï°\ßdzU8bÇϸŽ·ßؖnpSÂ¥úÃp J ÎÒ@? gV¯•¥Æ¿Œ>³|ýÌÄ0P£H£ŽV¼Ñ7Îm³:2]ât‰àû ð-D⹉Œ|“6Ô9ÓýsÉG·À&2̾0(\OKn¡ÝDnÌàrI;©­i¬|NH´Ô‚ÈYE˜&ÊKÃàåºP&ƒ³çèÕ¿ŽM¨ËË+Jr yw1ø¥bLÿè©$³·“ûá;XHI…³rì.r9?nÕýМ¡Õ\Ù`?·Ï3ŸòOšm‰-´×±yPáÓSÒÒYè‡ÍÔÜ.äªHê¢&:žœ*½O_§\dÞ3 ŠÅÂ@ߟʧŒÊÀgAfƒ·dö#J¹ûIôì\hÏÂöE6·.±fLïž]d}/{á Ú¶}d{‚g Ó·’ú÷x,ÆtË4ê*xh¿Q¿qP¿!6–ÕKl©}1A,¿ÁÔÏúM–uLÿ.h1éèU ë)NÚwÕl"Qj²¶›(WšŒ¾ÞXÑ% YyŸQM.Ȅµ™¶#£56„ðŽ,Ö#ÈÀÕî+kb1ª<írZHwq +à6x¯›9’ j£­Jˆ»+²kwuë‹öô°¦´ÙëTÛÒ"€  I[ïc¯4 ‘Ç2=øãz‘‹Èm­Ó<‹|(u^E4ð÷«")›÷¬E…¬ xmT{«mm êØ2üM©Ã› ¢lW´°æ‹ÇÍ _8¿¦cþ} TÐ mX{û4`6šÅEBýž¢fÿZØⳤcù "Jǎױz5’¶Z§:µ@‚"Z~Bbþ%Qij´TäH5•ŸQH"aª£¬ù¡(§VŒ8çꁦÃ÷kýD.ºÝpŽAOë-skñg]\;”'NG¯ê¤.XÍÇ^~ƒJ­– B'Atj$ôuÂïÎ#*¡”™ŸØ®Ç:úE¸šý‰K—‹]±™ŠÙ`i»0íˤkU>³î殚lœÊr ëÊ¿ËŽ·uē¸ÿõÅßë¬܋uԂCOf¤Ìc@%=Š´}ÚͲ|øøRSõþa¸¢ò{!‚ůl—)ҙƪÕ|³…Õ×ß/ïéD~(ÖZDè»XUo LÀIV Û u/ƒª‚)±8R̂£µµ§›Ç0ÜÍ&Ä.Z‚qÖã„ßͅC]ã é8€ªxKÃI3ßhKn¡­¶cpe*LIS1§ã-ÈêǞse$vQôµã÷d6ä®±çÆâ^'Ľ׳è!ebÞ2' ͤjaœÄˆ¾}+z®€µ&÷׆~hzH’ƒŽY0ӈà +Z ³HC—9îP‹7ô"Iè庴=NR+s‡1ìRÁY\Œ·²PúÁâ˜nûâe$§7œõ{ù ~`qV‚‹LfùûwaÅ)"õnxК³¾_H¨š±Ô–¿}7.춧.ƒ‡ yíçˆn…³Ö¬«å’%e•‹ÒŽ­IˆU‰ ÇQ£ûžEÎÛrûBC–>]Ê´I}m)@Åk]SRą.ZÊ3™ÿŒRºtGoGæ:Ùsq›ñ÷Úb)»ß¡™:$A³ œmšgµ+_µ¸0êƒÊ°'­vÄ߄šH!ÉÂ1ßÓ|î"tV¦ýMÁØñÈ4tÌ^ #š@+bpÉxšm7’¶ FK ®&&2Zm Ÿ·æ­ÝéÞ¨ßc’Óa÷֐l gŸ a&ªóS㇝§+¿®Æ³ˆ»‰ Æ`wnöa 1Òp;^÷ÀDös­+ ŒvÑ2È$Ñ£ÔÑñrã*·ˆLäúÀê öòtš™ÑՄæ9Æ9`` չӊy%Ë¥JVK{–r .€]__ŽÀm(f~6óÞTˆÉŸGúìVgH“²/r°³î‚uÑ×ÜÉÏJ<Ÿ¤œÏ÷YՊ%éè¤|ѕþÇ|•$I’ã°{½"?Piڗ÷„Y¢.ýÿC%—{äØ̱Ok¡(!H¿ÖJÜ.ñ¹~ª•A¾ð4֕UîދŒÏ¥,üÞY$Á˜¿õ7¸g£Øˆqž8,½è§ ›¾e ¤g‘ELARÇKHæ$$ ›Íô–’Òªá9œr²ù6EÀlڈŠÜßâBF¸½§…ßÃî8…ͪ…ÿâæ•Þ[*‡±´<×K1mÏM·“о #p“)ÚSÀŒÊVØì[ý¶O*_z7ßNPGiɲâfãkÛ oç(߶ÜçiÁœÁ9 íS„ƒ$‘z¨]TiLÚ7)“°$ސ +ó-ûZ·Œ¹™úzh‘ñAìZqߟ¨©ÝË—U,×_’¼}¨#>!Gᄇ@ }@Òµ÷U±ö'D¸¬ÉYöý ЂàÃMIŒ¬›V†`z ++#êß\¤t]é‹tò n‘õ{«¬j| ¹9)Wjւü–,ü€œûþy=úô­·E£—Ʊق„½#‘ÍD@?Q¯6qôÛ°U0©ê;‚5™)+½£eÓ:>кÍǤ‰°µÒŽÄË`»ÿ¿0ªs¹ +ã'ëO÷ô ‹C²üˆ©ŠŸ¥{ ß,Ãy¬”ú‰“uï½ÛÂÆk¥sU„ªñûÇäù!^;£ÂSß1•š¯$e/ßV@Ê<.H²U[¤bù¦ŽýHgs7çfìë0~¢ÊÁÍ ƒ¢Ä¼ iCûaZ[åŸX–é­;{}èbÅڊØÖÿkCÇ[ï©ÿ)u~jsÕ>ÆbE·A­w‡ï –ÙT×()pGKAˆ÷'ܓ×A‚Á!s.’¹¡×ÿÑåLzÎnñŸ§ +]²"iç©´¥²ð{ádEKtŒ£>` +]4ïÀíýɹƒ­Á´²z†ƒ9Ð t ¤É¸c©óuý}ÊZ*k| œÖtûoø±—§p6Û§œ|œÈÖ·½Â6y˜[:ÎËY-WCÑ9‰®[Sd„Ã&í#OÓTÀ1ˆ?°ôÜ5ÿÃ"£ní%+ º=}–ìãŽÌ²f*¸¤¼z€ ói[Þ+i[›ë8VãÂ&µÖ]A_ÈÆNõ¯Ë>[xk¼Çi¼cÔ­,jq³¤¸ŸB¤hn}õð•Žö9ŽÓ’O¶LÒÞWHü¨&Á¾ºE¾òf¯51Sʞ5Êò¿‹ÈWؖXašý)Û7R¨.qûÍ»k­žóËt¥>„‡:0i}3ZóBªÅfÄr©|AÞE}N—ð º~µ øHȊ'£-r3ÇCHÚc:Ûé/U…â3·Q6WÇ1>à'ÓIþÁXë \šòãßÿyšØ@73 #ä0o&þHÈ¡Ý ùÄx•Ñn„|Â`2Üí¬sQ2çú`j¶rn +K/ž¬ô‡x¶Bzþp‹BWt‹g>¨ä;Ħ˯¿=&ÿ÷ë"-¡&§³ üN„â'â> a7‘©H’¬˜•<*Ç`E+©½rTå©F¡Œ4M™š«g˜%rí^›µ$…a…«§Ågb§Š—Oûáýš¢I @ÆΌ×ðM“;’w؂õô ;ÿ` ™£ ™¡’âmŠ!GLu€ŸNëÙaáVÈ× ü–xì°°ÎЊ5=üuí€úÑÎ3„_¿.+֌Ëníp¿W ±­·‹ùêJ‘Uux"£¶Ÿ÷"֙¹×c†búÚaáëÌ5wY¥:tN¹Ý‹Xžk†¹6¸]B'¤ f.!^ô^ÕæhÄ|ér†;L«È 4+ç6Ò5Âvð­,ÉDû@ÛÒÌ^˜Á47-^¹Šª?ÁyRi#ÑOJÌ8É)Ñþ:±yVà·ôɆñÛrºHfŶ3.³‹ó„«e°¶4I +‰ÏêRÅ؀Y”UCKÑ#‹ü¼²¨6(¶¯<æOIägóªð´6ú:p÷ä*݆5[Ù#$g£~ Ä+¡É¹_èH`9ô™x¨d˜%{%íÆöó8‹Ë¡ÜÆÜïkŽ±V`ð1€Ø2õÊ%í¿ 4+KX2? 0ÊlSvœù§¹áýˆ™Æhüžþ¥u¹Ú2Ȓ"Wîe´[ ½×_Ê£8¤U“Z·öË$$Çñ÷š…~,?aP_QR¼ýÕEXYZ?k "¬Z¿HTߘqHùâ ÔÔ|THùXTäU¯P[0å-Q·1{~¾øw¢dF;[8ñè¢mwTæ±äƸ2~ÿ=3çû`Âst©©PiêM¡ònX3úF/µoû#è§ç½p£Ñ5Ó ©Ä¤tțr|S!£/;RXÆhÙa%eŒytÛlYA-®†Œ"¼Õ½¿™’©2ü+¤ðì{¥£eõ†A²Øº,Þ¾¨‹uíPámž¦Z¤ÅߜäD&B±Øh’,3 +Z“b¹Øšê;˜z"í¯þ)ORé7ë@˜W¦íYæÜN%¾Ö©¦’í}«J@ñ–CpŠ2ªµ"MÀ*Åê|Â=.Hé֚.HßŦ2eQ–%S¶ðh-ÿÐp &眖%Dzd 6ld¯!½(¬­{±ÿ¯_ÞRB×E÷Û +ý˜áÿLZiö±ï¢ý Ÿl1U15S…=ì‡Ê‚ïõ=b¢”¿ +n1(§âL«Øðt#ë†hƒ_jô–²/宎Å!nB4}ù›9Ï+«‰À4ÖGp°ugȆ( mÿ“I.«†Æ0RÅpŽŸðº«½™†õ9ŁäÓ¾œÇM +¿û·)ÍâIc Q¢$. çnh­ î¾>iKó­_*ŸìdX¶º7sÌ¥Žßg‡bx0æîxÏGÜ·L'P3PÛ÷†(–†ÐU>RR8Õg&Å©òl#–3<$aíîòû½ë/|$5µqŒÿ…ZNÆI¼öV¸Ä“@o©\T‹h̓ä\kAaÒËQٻ‡²Uœ:ÑifÀÛƊiUÈrHÚ4I‰ÉMa÷´$\#´éEe˜ +.I‘÷5Z{”À¾9$§yÄUÞIîë.Ébã®SÆ’µ³Ñ¤' NЛKfq:xƆ³µòÞº/qÓ½Ñ +J¯®÷]ZñÞ«­£x«V:sqT&‹]‚÷`¹Ö Sá9³b)²ý!h¡\4 ÿ~!e·×íð;\Œ(ʽK€%ظ +âɑb;À¦—†€Í +I‘ +ô[èg\.›>]æ´á‹û§pÞ[0Hқ-8ø|Ot!¦ÒR}ø,NkÝ?¿ ‚Ôßf}ÜoSâtq\•õ›[€lƒÝkå×¹则|‚¯/8fLÇg4]GÑûÀ…áYHú®Éã"Ç®…b²o¼¾/³\ùj6¦#TG?ŸÃ°Œm/ƒ°òý†hÆ>Çp‚íÒ8}gŠ‡¶Ãc»%Hêy—6Œ¨ä§ÃêäÚ}}_ƺöÕöׅl´ÌìïO6°È.v([xUkì‘?0«€Ußvw‡I9å˜}ÃÁÒ¢ áß wdS96&«iê-'ÜÝ{^ ^Dr€A/PÜcˆ¶qËê=é,«™Eð)iCF~@ó¿7ô!-{ý€Ñ ü·Õ¶l)_ók|À`eªJkþÛ©WAì؝í›BíiÖ`¬¯;Ö Tѳ§ÏTºQþµZf¡7‘zVe#çðõÕªßÇOo‡²#[[“O\ùVµä²—6ˆÙkkÿ~X*í«á˜Ž¤ç¡ì'YKÉØ®ÈÎ +By:¡6‹ìpÖ÷ªߺ î͖€]Æü·µ³Œ:…P/Ç×e—ë^íÖځk3uÖ&¬žkÞÞ[;íCŸô°ª¡`š€Dô­7j–F‚lͪ“±Û¾n}/ Gó‡Pq¨£­àÕ E¤¿ó +VÆ\úÀH8©ÓopßÍ{áمͣ>ÿ·`ø 8 5G#ë +ùŠ¾ë{w2HMMH0*ϦI­AC2ÃB 7@®ÜÔé´ÀŽ&uÞÃ)ªD©Cª°\=¯ô»Y¼“¬r*ÈMìühü“ûMy*y ”5,rZÈ΢]“‘ ?™£{oX Ì7ôÍÎÌ¿ŸvTˉ>ByCÚí¼½ZÔï5Ž£4Ç/Ðð6«£ &aÁס+ÀEu»©ŸÂ%ª™Ëv£Ësá¹À‹É:̾0¯²§¥·­©¹ŽI£—¦ª‚¯ªñëË7ZfQål"دŽˆkC”ëB˜WøµW#?³v}-Ôa¬iÌd¿.ËP¶:¿íªLg[î{_¼j™ gã¸mÍù|¹‚Èî¥Ñ¬Ír\–Ïsd̶Ôڗëé¸èꥉHýx3^o۟ÜÓº˜ ҈¨­ÞØr´ÚTƚ=ï†kéöaÔ7E~еd Þ̦Èʵ}¥ ш*zÏRÚ~#ŽíÓìîÙUÖx½7Q´J¨ÀÁòÑ£&M_ª;ݸ†ãÄö3K ¤ÙgòC +ÆTև|yjՐòܜ$Þa±W3-Aw¬Ñ{IM§Ge_ÉÆ _nb(Øä m„P1BÓÕT Ï* ¾ØÒ´a›ò™s˜JÐÉ¡öÞa–3ØìQ>1n=$m–Gú€E½ç{ºà¯Ü¹RÕŇȻÌK…^’ð¶v6ÖK¶æ¨ˆ¹™‚u•Å5VšîõÆßeedí± +™mîZÛ*pæŸdŒ-òŽP ’U+v1ö µ ðÖ¯>C!AÈކðý§)Òäu06®ë‘C²,ž‡Aá ª1}`s[ä÷ ˜-Ú° ¯9ôüŒiÅ*æÈãÚb^œ™‘£ÕfCb¼¨û¯2¢Æ–l†’8ӈ€¾±"üÛ,Yã¾8:_+YÞILòuŽµ˜×—íãŸÌÓ9™¦RÛ-½»¡DH<¬œ:µcñ©^6L¡o¤si8lM:í¬z~*‘ýöãè²#(a雙áZ' u*z:7ëmff™®A7Ë ÁCÚÇêMrV¡ïɞ3Äúï(¶™a4†ž´«"©ñ»âÌz–lf•VUF³Ê†]4B¤ÿ{×=.ø^&ol)u'6":g[½ˆ%DÌþ¾›‘:Êo5.;é´ç5(yŸ$lpÄv"Ü<ìI +\3ç•Mò‹YÁ˜0b2Û»xWƒÑ3¥uëxeÀ5GQõ ªNIÊU3"s¶©L4#¨Š¡qŽ"]””šl7¬K öÌÁš–{L²3}K“À½¦VhjY\ú}ѹKŠ“ôü$Ø:‘‰°ü!ñ­·Î›õ'A”€Þ¢ÝτrÁìvZMÝHŒ€‘­1›=æ[ñeMÅoR&¯•AKY€õ"[ Ü]€Ub«©®Ú|N¾”Y.¸‹¡pTaé·Ñœ qļ-Jق€Ur7k•ò6IKKËQX¼qˆJ3ÇZk)ÛƐío +Ë*Ö0aäN\4kX©§"æß2òÑGKpUÖöŠ`PåvùÙ2ˆù÷KÅû"Îj{°$O+Þ ¶r‡è Æšœæ"7fg$yƒ()Ùä8æÂ7k±Éºå+rááù†žØbÌHJªLðX$q\šÈ†SdòQ’×q±àÆ»ì3¿@gÞa ~¿ÄË,ñödµ$©|¤l0¦2?ëJUñèÍJIµä—Š¸44öÕ4m˜£¤Py­çÈ*õ˜û«›åš#U\ÆÅhǸkãH‹¬LíØƐ,ª±ï¯ Ϻõ ìMšê(µ`MêkI2¼ÖõÉ q¥‹•/#@ +ÆÍh¼ˆ¡·#8RŽmÆ;ÜsAj¿CYý7ßw;˜iâG¦)ÓR_ÁÖ"¥Î ‚uR_Egd:7]±`…$¶¥3„mTr_%ø³9Å%¨±UÞL‡ñeô7kù¿z¡ƒ*¢ö{2?9®¸[ŽÐ²Ð1±¥ˆ^ Öêxk·-"SSCC•(9ßôÕ U&Y—קæÃn¸¬‹uüúÑ5]ζhi³³}u~=Xš7böP‰Ò¯Õ¿~Äîñþ2Öf¶cõ™æíc⁚cRH1ÑV™óþ-†_öéÓjw¼Ÿê ²'îÝöÍÖ`ö°æ¤Ý¿eBmùæÎÛTN>,×ÅÇïÞ͸Kƽ¬U÷=9~™â”ŸÝ’NJµ¯Z僒̙l‚bGú³sŗ:šh¿)1àD“³ä&%ԍ«ÒÄÜ Úý—^¼ƒ¤¶eHöj­Úʜ±ðhš£%xŽwˆ¥mŸ“ðï뇉W¤è¥žõhbw2ˆ +³È“9YÅZ‰kª¯òÈReÀ(ÅOž +¬+Y֕¨çjú0Kù×úŠfÊTÍ9¼xfccÚ·Mtû•c{/¤´Í40L?s¼ªæ±lh£öm§D—s+$¹ðäÖz!ÏKÁ¡À]r{³2rº~¢Ã-Pv«›çëaÞ3þlî0Ünèù{3'oÞc+Z‚ïñ^ÞlÕäs™Iå…Ú@åÆÑ·on#?>ìÉ&j¼ÔÃÚà?tVä…\‘‰êÀ­•Þ¬Î‡¯SMÇm8ïÛÑXf8ŠV9‘éå{¸s«Àó¢sRo-™eµ$õÛ+.Aç?õû*=ùúÅ~ÃÂ-çu64£ìޟd)³–=ô@«·lRã—åÌÌÝGFqsÌV±Ô>T…ÁFvôÔ°Åõ¿÷K,b[%‚Y±ô…˜Vv·ÛÐ^¦˜£/³i+­¢ÈµÃw :RGÀÏ«]Œ ¼[,QñR/qö˜´Ív֘03ÕÄZ®³hо%эᴇ¡_;ñÈ‰Ûâ*P jX–MwÁ 1$ÔÈ^ÔùZ¢%g«d––ÑéUA§%^®ZG/偙,QÌ%z5«ùÉjô¨ +ÞÚ¹9x£/¤ÑÕmUzŠ}´ºÉWTdS<hZ¬o{T[Q¾rï:ïƒ+‚?0Šyü@î(—¤³¿ƒ ¶8ìFg!µñ7ZSš|£ ¢ä˜Aðå0œª>ÍÎ&ÕXÒ ž5Ö~évùć•¼—‡ÕÎ*šXå…1’úµ &Ižû­%¿¼g:í}Ȋm MT‹ÊˆU °]ख़5hâ 1ëa*]±6”ÆLË-Í?Öxj¶–òÀ=¸A¨WƐÒë4ÝiÑêÞÎ[Oh•b¿Ý-aÎ]‹à@iNû‰¦ð©þ¬a†7Ö]˜:PÿU'&çan#Fg‡1¡®l5¼#)]›®™ì{³ºMfë˜ÀöDێ$6¢á(l…4mWUf¹cÞ‘ õI®ÇæÈà“Övé9û—\èŸÊMùD£ÌRÿñ¤#ísgžÿx³âXãɳËÊeiâYì0G–—"r]ó ™~¨:ª¼Xmêõ~ ë!W³ õûÆ)¡  aâ±V,¯ Vµ¾ÓµfL °U¿~lœ Ë`šj›U÷¢$Ôléo·93õŸOc¿ Öî¶%tnr-ßw1bR›½œÄL§›ñŸ4r fúÃ}$>Öwõ·4È'ލuñ€Ä54kÃøÚZðgsý³÷¯¼‰îÑÄÌF'§–¾BØʤ¬ÆÔ7¤¦ ~e*ÎZH»¦÷Rx ]Àkz2ª8K“{ú''Rãñ÷„„ÇAšó'uËy:ÔªÚ"í æ!ŒT>iÎñø­ÉŒºûIjMµˆe}RXeQŠ¯qÍ"êu=4‹–úÐ,ñöÒ,¢œgë/Óþäs=ÑÙArʉ ag¬5ó?ž TÐkY[ȶ´ùd / Ú)ž˜Ð×ó±Uò¤?©é¶D†ˆžmÀl‚P[E|ãŒ%†úŽÖs[rTˆ˜¬¦Wß"Cpړ4(®LLå6UJQYrVá…VÅö20cÀQ!Dç´:)òwµþÊÖ\ÚWlöOå®|b¹ÔlnÿǓ6«úã_Ĝ8Ôxr(§®S—ú«Ë¸òh¦Bã\biI~ˆ¥«G±qø¼swS3*hH =ªkOçkc QoŸ¬qP3™¯Gþc‰{ÀÒ®_ÿÍÆi<£†•Ü,@úbËfV¦ÕY&åÇ ’„ZÕ¬9ÑúÒrô¬¨7ÒљµêùÔ|LÙ*h;uÄւìš*·1d;Å̟ˈ©¾šßèƒUBœ¤ÛHÙôË®*L‹òF +e! +ù+‰›Ú—ÌYU³õÿ¯­ËïÅÖjß҃KW¸ËS8H*p‹bH¼Ñ?¶éRuôd]º2V †4j‚«’éþÑW 6©8)n”pìPΩCeÚLS=ó§/K€ì±Ôáï´\™2òi›|QgßÒ¡›ó0öëf¼Ý$4”"Y'W¼5ÚûÕ){(L}e:2Lïà ßi0Íâ“øûZÐÙ·ã´0åa(ÆV1_µˆøFüÈpü\ØP;L3÷|âöá:N܃c#â˹GW·‡6Óô›†<²_ÑLíÙÏ~šü­“ŒÃ8X•rô 6üÀ-b¶†±›vý+pm=¤Ü‚-HïZ „yleC†rñ‹âÌ3µáäqøuAZ ³±‰ê¸Hð'¸@÷RÐÕõƒ<Á®”Ot›ÿvÀ*;,±XµÌ]Ê={híp&ӂê.ößÿد‚KnxŸ¯x?0o%J¢¤sûàÜ6ð8€× =ä÷SEJÝêžÙÙ鍃^fž¨EJ"‹E#à>@‰Ô›o©¹Üƶ€#ğ(—¨·-9ÉØg\H óÛ¦a›Ð]mYîÕq ++Qø«qP¦ù]B/%´áíÑCJÄçb3y›!ÏІJ„tÀ«Ê‹Œ¸PbÂ:“㈻vãë3ª6±+&؄›ÁMƒk¿6³)UPQy}bZÞu^ΈgpÆÌ3‚uµbw‘„ܵ³sÑàúav¬—ÁbÒ÷èÙuȝ(  2Ӝçk½šÌðññÀF»yUß!“Ño¹à%mz;ØPlö^ŠìM>SÌÕÒ|¢ìkkè šÉ5ús5ö³œ`n¹ç +Ï8z6»=-"î6•M~Øcõ-¬½¡ ö˜° ›è/kâØ`¾5Ëz=¼Àœ9²;Є/Px·Ã[0ê†T@¤?óý¬)j&°ŽŒ°È¥2¿¢ÒT*Æèƒ×,ò ›ãw敢¥)V1zd÷B4‚དྷƒÅÄ= ªs=K¾t±Mµül–å40á#hüýi˜¿>m^Ä:Aëé¥ìË?¹Kg1 ðTËp[tƼˆyÚ ˆýoVÍQDâ Ù'º•ƒøJQñ"⟷šª÷±HÕ34 +L-³~ûñá øKòrä$VºQåªFo4LD6Ò£5šMŒ³(2™ó.ÕK?»Y/>5ÚGo`­8E/lFóš8OM2%?‹3raéñºä'’¿AÉª¥yN Æç×Æk@k—:TúaªÈ¥™Üù]½{ØVDø[–6ÙmPcÎ ºµsCc4`ÓƔ¡1¼ØWL/ǧs¸ Õ¼žl›a"fµ'÷I¸,ÚسiÙ¿7à@ÛÕ7y3¹Í$+œs^wжËe¿:º°­Ø\;œñ8`[@\Ü¥Òën,LŽØ,@ +óa‹±ƒÇӔ:YÚ\¼$pŠ‘у0–NB6^ä’[E‡— ioˆõB˜ B¬M"›h &=òc éãž˜|V I›‘;Sò¶r¢ ÷JêEDz.ãþÙhT*ݍĦy‚¯Ùsø½ª® ßHé_–Ýx©ØÅiÿAƒ’‡Ãp_•íaÏrpVšem­eQ]¤Ä ˆ1@NÖU²–mB·ê=ÄD`vÔ)š_ŠÄuk*G]ZEßj…„<Œò6ðRio°€òù‚+Iˆó¦*ùÀ‰£íÇÌöÄ«DÒ->Ãåfz?‹Á@ÈYƒÚª•D¤d×8ªt3TöÊ0nÜûˆÊÄxŠ›Ôª¯4 ¬Ö…´ùØÔ¥ÇÓ4é²;ãj‹—$ív¥›Ï&!•‚L&WCG±í’èîø +ŠÕë¦9¤éõ&²Å™Šâ$c» Jæ¶uy󎊫«jÙ°wïóÌ6^¦˜\G¢UÕQHÙô{‰jN‹t÷¤ó@A­cb钶ùi¹“\7÷âµÞÞ·$R°ªhf\ì]¼ª”Î"2¦Œþ•°q·ÅɺÈ"Y×&òîÈ?Àºº7±Ñg#jlÐÓ$X’€HÜ~9P*vh¢ !Š€ëÙñqH'Ö”™9Æj«Ò.] £I5p{% ^êãë\q Ø$±qìÆó€ÕŠz$À¿A=7q6(u»ÂH˜WºŠî¤Œ±›4„D&„[ô!|¬¬&ˆ±1¼±~–‹j š{hԚEÂ)á¿Ý<¸|̝ÊüðÉFXk/|ø’·²"Á«(¼¶òÖ`„…•Êö²Ø£ƒ¨ i ^¡Í1\âÄ# ­7eŽ£Å}¥„ÈÖUµ+`ÿ°uŒyîÔö/<½xQ«=¨ È` ³^ĵò-bMv dö(”Ghm“ð†Vtíq£Œ§J«¹Ów¯ë­—1æ9[ÉC?“邏ãHW—xi™!Z $Ó¼4‡íjU[ëpsUý›½Ñãüb‘ Ä(zd5û‹%Pàñi£Ùßΰj›Ã½dŠLìe8åccuJâ*ɯÆú1o!+%Ïoɪ†+Í.Ä·+w ëè©Ò§ç9FÔ§b«LD(ªó2,<‰^ä6‘¥%2·’¹‘9Å9¦‡]tŠ£ÁA8ÛÃVÛ/T?‰‰ÓšX.ŸÅi|ˆn܃qX˜?­û ѱ­ãüšwëCœæÂ>|‘³±>õkàLåKà_¯…€¬!ßº„@ZC@û²Ä€c@¾9Ò7Ä@;Æ@;>z~!®1¿)âééØ åOìW€‹ÿ¾-ÞN'æ`û +æ·çvïJxÃ7Ôé“Șùxˆ²ÌÖ.Â8* +À.Å·*CüRe/VY*ƒ*ƒ,•AÞUÒ^Ê•!¾»2Ôµ2ñŸ¥nîÅ¡¼«8Ä¥8ÄCqˆkq˜%àíâPÞ*9Ò7P“˜¼¥ÇwbCyÚw‡ é ºbC>bCû °a Ámœðbü×á¿Šðÿ-ßDR«8,Ž#ûI­ßÞ_¦õßx¿“Ùÿà:6jìÅ@ð_ïb÷»•v!¦"l|%þhï~_íݤö¡Ü~yʁöoQ 0gÓv/­ƒÖæýëoÐÈ!ß .&üò”þ-绖îKRnÖ#DÁíÕe vmý´Í\£bYºšš®ë:/ˆ®£¦Ž +Ðnö«0³,ášèu BݏVmŽMJÊe¦ošñФLås7’4ß íšRíÄçtQ«ÃTÁµ_ÒʶT/z˜qí¡â©¯iáî«Ô5­[úš–vÖèrQ«ebÁÅGζ䢃…¡šâÅG.S9\|ä‚ôŠùjì–[¤Y×´*li»øȀ $n­×´(›^|d°ÕËU[X,áª)€†Ä|ñ‘UI~ÓÅGV †¤«± 6{—,¹¢h¼øÈUh«]¼CGl Œw«`ÓÚÀ;¼¡…»zM …Zàø×´ûºö­ïRBši?¹¦ÅŠYQ¤®i>TÁˆ®iEVçtñ⨨¹\¼ +®ä--|ø?>}øñc¼ýüã¿þåÿ†ÛŸÿùÖ÷èß?üé#š˜Ï°zûüøÇÇÑ^Õ–XÞȓ6'"˜[ÄiãÅß{Ê)ŒŸÇӜv盧C-Õ; ÚcþuøpÔ:oºZÜüðN, Ð¡ñkæbÓ9ñŒÍ"{Aä{«!îžÎïH:HW~îw¦u˜?|8(·'h\U—ýû=“zžäÍÅ°Ïm+«P½ 5§õ²H¶“9Û¬³:ËH$k˜œÅ/ã$¨½v{è݌M¿œöæä3¤Æ/e¶oí qž ûyÖ •%Cå• ^¿§¯dxþÊ÷2¾/… }è +¢TÒZ&{åfO x¡4ÿ·öAõ.É5{‘hå¿lY·ïÒºü¸ÓjÄ5öBŽnXxX5d$[™†Ô)lŽ¹ˆ7¸ %x—í8öKƒûì¾ø¸Ëjà`zóéœÎU°aETƒ9¢)íÎ™R,‹[LöÈmŒ“%5³90Ó]DèxWoÌ‹5x88‰ÏŠRmYª÷œ_‘hCÚeØ`·«°¬ÓÊ”èvïbŒo-Ä6ÜöOߣ8 +Û蜻5!Äò˜¯›A(ÀWé H¿Y›.{ÿëtPÓ‘„&]é‹,”ä›Aî™ðg5…Xl5[ò°rS¦äeÇz¼OÆn™Æδ8Ï ­çú, ¾Òif¼ÁÖWó °¡6v@¦ÎsÔ`5HN[n¢c$oÀbXÌ‹Û`q °è‚eSՔвtâ4°R‚•A°®+?+_°Ò«X“ƒÕîп«X+­Cr±`?%¿Þ˃—Ž— +\ endstream endobj 269 0 obj <> endobj 282 0 obj <>stream +8;Z\7;7;'!&G;7\nc$n-fF.<&?>)L1*k'Mtg&iT?5g.ICg12'-QcgC=XZqJ95;Mbe +(ph79_Q"b"Q7?_\lpP8uIU=0t$f8F(GE"T^j!H\!Z%pdua%&mum4po:\&16SP +;!sib7,EtKL&/V>:kIYo)+O&kMFJ9_N,Z`Z#Q2A"?>Nml9$IpkrY=$(]7@1:]i-?< +ULH^8XZ=Ei',_DJ\o@AZWPf!?Bi]!$5pKrC#]Tqpo+=Qh:k:-)VLq(!l"V*TJ:.3M +ViL2?`bhHA&HVn2ko,7c2N-K.&YoB`^;K/^4ut_gqgA#B*)E?bZdYDP601E+d8V48 +3h#BjDh,"<6/?[A0@5,(C&huQ'Ximt*@09PLX^FGML6+OjJm&0UVU!m endstream endobj 270 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 462.2114 388.7379 cm +0 0 m +-0.017 0.01 -0.031 0.024 -0.049 0.034 c +-0.981 0.554 -2.159 0.22 -2.679 -0.712 c +-2.976 -1.245 -2.986 -1.854 -2.774 -2.378 c +-3.268 -2.837 -3.755 -3.305 -4.231 -3.788 c +-21.99 -21.83 -21.76 -50.956 -3.718 -68.715 c +-1.987 -70.419 -0.119 -71.981 1.846 -73.386 c +1.796 -74.109 2.152 -74.831 2.827 -75.208 c +3.76 -75.728 4.937 -75.394 5.458 -74.461 c +5.978 -73.528 5.644 -72.351 4.711 -71.831 c +4.1 -71.489 3.385 -71.521 2.817 -71.844 c +0.961 -70.51 -0.802 -69.029 -2.44 -67.417 c +-19.767 -50.362 -19.987 -22.392 -2.933 -5.066 c +-2.417 -4.542 -1.887 -4.039 -1.35 -3.545 c +-0.555 -3.696 0.282 -3.342 0.698 -2.597 c +0.877 -2.275 0.948 -1.924 0.935 -1.581 c +12.563 7.73 28.237 10.596 42.511 5.815 c +42.598 5.246 42.93 4.72 43.473 4.417 c +44.405 3.896 45.583 4.231 46.103 5.163 c +46.623 6.096 46.289 7.273 45.356 7.794 c +44.614 8.208 43.72 8.073 43.123 7.533 c +28.332 12.498 12.096 9.574 0 0 c +f +Q + endstream endobj 271 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 465.5771 377.4718 cm +0 0 m +-13.635 -13.853 -13.458 -36.216 0.394 -49.852 c +7.043 -56.397 15.878 -59.983 25.092 -59.983 c +25.719 -59.983 26.349 -59.965 26.979 -59.932 c +27.147 -60.231 27.392 -60.492 27.714 -60.672 c +28.647 -61.192 29.825 -60.858 30.345 -59.926 c +30.865 -58.993 30.531 -57.815 29.599 -57.295 c +28.666 -56.775 27.488 -57.109 26.968 -58.042 c +26.956 -58.063 26.95 -58.087 26.939 -58.109 c +17.542 -58.622 8.419 -55.196 1.672 -48.554 c +-11.465 -35.623 -11.632 -14.415 1.299 -1.278 c +13.844 11.465 34.175 12.002 47.373 0.22 c +47.096 -0.64 47.453 -1.603 48.271 -2.06 c +49.204 -2.58 50.381 -2.246 50.902 -1.313 c +51.422 -0.381 51.088 0.797 50.155 1.317 c +49.688 1.578 49.16 1.624 48.683 1.488 c +34.769 14.004 13.259 13.469 0 0 c +f +Q + endstream endobj 272 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 367.4321 144.0831 cm +0 0 m +-0.24 0.134 -0.543 0.048 -0.678 -0.192 c +-0.74 -0.303 -0.752 -0.427 -0.727 -0.542 c +-4.594 -2.938 -9.634 -2.4 -12.916 0.831 c +-13.643 1.546 -14.244 2.354 -14.712 3.228 c +-14.702 3.242 -14.69 3.256 -14.681 3.272 c +-14.547 3.512 -14.633 3.815 -14.874 3.95 c +-14.942 3.988 -15.016 4.006 -15.089 4.01 c +-15.598 5.203 -15.871 6.496 -15.881 7.832 c +-15.902 10.485 -14.888 12.988 -13.027 14.879 c +-11.267 16.668 -8.947 17.706 -6.457 17.831 c +-6.413 17.755 -6.351 17.69 -6.27 17.645 c +-6.03 17.51 -5.727 17.597 -5.593 17.836 c +-5.458 18.077 -5.544 18.38 -5.785 18.514 c +-6.025 18.648 -6.328 18.562 -6.462 18.322 c +-6.466 18.314 -6.468 18.307 -6.472 18.299 c +-9.083 18.17 -11.516 17.083 -13.361 15.208 c +-15.311 13.228 -16.372 10.607 -16.35 7.828 c +-16.339 6.423 -16.051 5.064 -15.514 3.811 c +-15.526 3.793 -15.54 3.776 -15.551 3.757 c +-15.685 3.517 -15.599 3.214 -15.358 3.08 c +-15.287 3.04 -15.209 3.021 -15.133 3.019 c +-14.642 2.1 -14.01 1.249 -13.245 0.496 c +-11.235 -1.482 -8.596 -2.497 -5.94 -2.497 c +-4.03 -2.497 -2.112 -1.97 -0.414 -0.9 c +-0.187 -0.983 0.071 -0.894 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 273 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 357.4194 140.0851 cm +0 0 m +-0.184 0.102 -0.404 0.075 -0.557 -0.05 c +-2.193 0.58 -3.664 1.525 -4.929 2.771 c +-7.37 5.173 -8.729 8.382 -8.756 11.807 c +-8.783 15.232 -7.475 18.462 -5.072 20.903 c +-2.256 23.765 1.751 25.133 5.723 24.618 c +5.763 24.512 5.837 24.418 5.944 24.358 c +6.185 24.224 6.488 24.31 6.622 24.55 c +6.756 24.791 6.669 25.094 6.43 25.228 c +6.207 25.352 5.931 25.285 5.785 25.083 c +1.667 25.617 -2.487 24.199 -5.407 21.232 c +-7.897 18.702 -9.253 15.354 -9.225 11.804 c +-9.197 8.253 -7.789 4.927 -5.258 2.436 c +-3.95 1.148 -2.429 0.17 -0.738 -0.483 c +-0.722 -0.64 -0.633 -0.787 -0.485 -0.87 c +-0.245 -1.004 0.058 -0.917 0.192 -0.678 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 274 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.7944 322.024 cm +0 0 m +-0.933 0.52 -2.11 0.186 -2.631 -0.747 c +-2.872 -1.178 -2.922 -1.661 -2.822 -2.108 c +-17.838 -11.413 -37.41 -9.323 -50.157 3.225 c +-52.979 6.002 -55.315 9.14 -57.133 12.533 c +-57.092 12.59 -57.047 12.643 -57.012 12.706 c +-56.492 13.638 -56.826 14.816 -57.758 15.336 c +-58.024 15.485 -58.311 15.556 -58.596 15.572 c +-60.572 20.204 -61.631 25.226 -61.672 30.414 c +-61.753 40.718 -57.817 50.438 -50.588 57.782 c +-43.752 64.727 -34.746 68.756 -25.073 69.243 c +-24.905 68.95 -24.664 68.695 -24.348 68.519 c +-23.415 67.999 -22.238 68.333 -21.717 69.265 c +-21.197 70.198 -21.531 71.375 -22.464 71.896 c +-23.396 72.416 -24.574 72.082 -25.094 71.149 c +-25.11 71.121 -25.118 71.091 -25.132 71.063 c +-35.274 70.561 -44.72 66.34 -51.886 59.06 c +-59.457 51.369 -63.579 41.191 -63.494 30.399 c +-63.45 24.944 -62.331 19.664 -60.245 14.796 c +-60.294 14.729 -60.347 14.665 -60.389 14.59 c +-60.909 13.658 -60.575 12.48 -59.643 11.959 c +-59.364 11.804 -59.064 11.733 -58.766 11.724 c +-56.858 8.152 -54.404 4.848 -51.436 1.926 c +-43.628 -5.758 -33.379 -9.699 -23.067 -9.699 c +-15.649 -9.699 -8.2 -7.652 -1.605 -3.498 c +-0.728 -3.82 0.276 -3.473 0.746 -2.63 c +1.267 -1.698 0.932 -0.521 0 0 c +f +Q + endstream endobj 275 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 474.9116 306.4962 cm +0 0 m +-0.713 0.398 -1.568 0.293 -2.164 -0.194 c +-8.518 2.254 -14.227 5.923 -19.141 10.76 c +-28.62 20.09 -33.898 32.554 -34.003 45.853 c +-34.108 59.153 -29.028 71.698 -19.697 81.177 c +-8.761 92.288 6.802 97.601 22.226 95.603 c +22.381 95.19 22.669 94.825 23.084 94.593 c +24.017 94.073 25.195 94.407 25.715 95.339 c +26.235 96.272 25.901 97.45 24.969 97.97 c +24.103 98.453 23.032 98.192 22.466 97.407 c +6.474 99.48 -9.657 93.974 -20.996 82.455 c +-30.667 72.629 -35.934 59.625 -35.825 45.839 c +-35.716 32.052 -30.245 19.133 -20.419 9.461 c +-15.337 4.459 -9.434 0.662 -2.864 -1.876 c +-2.804 -2.485 -2.459 -3.056 -1.884 -3.377 c +-0.952 -3.897 0.226 -3.563 0.746 -2.63 c +1.267 -1.698 0.933 -0.52 0 0 c +f +Q + endstream endobj 276 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 697.2822 167.9313 cm +0 0 m +-0.004 0.002 -0.008 0.006 -0.013 0.008 c +-0.252 0.143 -0.556 0.057 -0.69 -0.184 c +-0.767 -0.321 -0.769 -0.478 -0.714 -0.613 c +-0.841 -0.731 -0.967 -0.851 -1.089 -0.976 c +-5.663 -5.622 -5.604 -13.122 -0.958 -17.695 c +-0.512 -18.134 -0.031 -18.536 0.475 -18.897 c +0.462 -19.084 0.554 -19.27 0.728 -19.367 c +0.968 -19.5 1.271 -19.415 1.405 -19.174 c +1.54 -18.935 1.453 -18.631 1.213 -18.497 c +1.056 -18.409 0.872 -18.417 0.726 -18.5 c +0.248 -18.157 -0.207 -17.776 -0.628 -17.36 c +-5.09 -12.969 -5.147 -5.766 -0.755 -1.305 c +-0.623 -1.17 -0.486 -1.041 -0.348 -0.913 c +-0.143 -0.952 0.072 -0.861 0.18 -0.669 c +0.226 -0.586 0.244 -0.496 0.241 -0.407 c +3.235 1.99 7.271 2.729 10.947 1.498 c +10.969 1.351 11.055 1.215 11.194 1.137 c +11.435 1.003 11.738 1.089 11.872 1.33 c +12.006 1.569 11.92 1.873 11.68 2.007 c +11.488 2.113 11.258 2.079 11.104 1.939 c +7.295 3.218 3.115 2.465 0 0 c +f +Q + endstream endobj 277 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 698.1489 165.0299 cm +0 0 m +-3.511 -3.567 -3.466 -9.326 0.102 -12.837 c +1.813 -14.522 4.089 -15.446 6.461 -15.446 c +6.623 -15.446 6.785 -15.441 6.947 -15.433 c +6.991 -15.51 7.054 -15.577 7.137 -15.624 c +7.377 -15.757 7.68 -15.671 7.814 -15.431 c +7.948 -15.191 7.862 -14.888 7.622 -14.754 c +7.382 -14.62 7.079 -14.706 6.944 -14.946 c +6.941 -14.952 6.94 -14.958 6.937 -14.963 c +4.517 -15.095 2.168 -14.213 0.431 -12.503 c +-2.952 -9.173 -2.996 -3.712 0.334 -0.329 c +3.565 2.953 8.8 3.091 12.199 0.057 c +12.127 -0.165 12.219 -0.413 12.43 -0.53 c +12.67 -0.664 12.974 -0.578 13.107 -0.338 c +13.242 -0.098 13.155 0.205 12.916 0.339 c +12.795 0.406 12.659 0.418 12.536 0.383 c +8.953 3.606 3.415 3.468 0 0 c +f +Q + endstream endobj 278 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 710.5649 150.7516 cm +0 0 m +-0.24 0.134 -0.543 0.048 -0.677 -0.192 c +-0.739 -0.303 -0.752 -0.428 -0.727 -0.542 c +-4.593 -2.939 -9.633 -2.4 -12.916 0.831 c +-13.642 1.546 -14.244 2.354 -14.712 3.228 c +-14.701 3.242 -14.69 3.256 -14.681 3.272 c +-14.547 3.512 -14.633 3.815 -14.873 3.949 c +-14.941 3.988 -15.015 4.006 -15.088 4.01 c +-15.598 5.203 -15.87 6.496 -15.881 7.832 c +-15.902 10.485 -14.888 12.988 -13.026 14.879 c +-11.266 16.667 -8.947 17.705 -6.456 17.831 c +-6.413 17.755 -6.351 17.689 -6.27 17.644 c +-6.029 17.51 -5.726 17.596 -5.592 17.836 c +-5.458 18.077 -5.544 18.38 -5.784 18.514 c +-6.024 18.648 -6.328 18.562 -6.462 18.322 c +-6.466 18.314 -6.468 18.307 -6.471 18.299 c +-9.083 18.17 -11.516 17.083 -13.361 15.208 c +-15.31 13.228 -16.372 10.607 -16.35 7.828 c +-16.339 6.423 -16.05 5.064 -15.513 3.811 c +-15.526 3.793 -15.54 3.776 -15.55 3.757 c +-15.684 3.517 -15.598 3.214 -15.358 3.08 c +-15.287 3.04 -15.209 3.021 -15.132 3.019 c +-14.641 2.099 -14.009 1.249 -13.245 0.496 c +-11.234 -1.482 -8.595 -2.498 -5.939 -2.498 c +-4.029 -2.498 -2.111 -1.97 -0.413 -0.9 c +-0.187 -0.983 0.071 -0.894 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 279 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 700.5527 146.7531 cm +0 0 m +-0.184 0.103 -0.404 0.076 -0.557 -0.05 c +-2.193 0.581 -3.664 1.525 -4.929 2.771 c +-7.37 5.173 -8.729 8.383 -8.756 11.808 c +-8.783 15.232 -7.475 18.463 -5.072 20.904 c +-2.256 23.765 1.751 25.133 5.723 24.619 c +5.763 24.512 5.837 24.418 5.944 24.358 c +6.185 24.225 6.488 24.311 6.622 24.551 c +6.756 24.791 6.669 25.094 6.43 25.228 c +6.207 25.353 5.931 25.285 5.785 25.083 c +1.667 25.617 -2.487 24.199 -5.407 21.233 c +-7.897 18.703 -9.253 15.354 -9.225 11.804 c +-9.197 8.254 -7.789 4.927 -5.258 2.437 c +-3.95 1.148 -2.429 0.17 -0.738 -0.483 c +-0.722 -0.64 -0.633 -0.787 -0.485 -0.87 c +-0.245 -1.003 0.058 -0.917 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 280 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 354.1489 161.2628 cm +0 0 m +-0.004 0.002 -0.008 0.006 -0.013 0.009 c +-0.252 0.143 -0.556 0.057 -0.69 -0.184 c +-0.767 -0.321 -0.769 -0.478 -0.714 -0.613 c +-0.841 -0.731 -0.967 -0.851 -1.089 -0.976 c +-5.663 -5.622 -5.604 -13.122 -0.958 -17.695 c +-0.512 -18.134 -0.031 -18.536 0.476 -18.897 c +0.463 -19.084 0.554 -19.27 0.728 -19.367 c +0.968 -19.5 1.271 -19.415 1.405 -19.174 c +1.54 -18.934 1.454 -18.631 1.213 -18.497 c +1.056 -18.409 0.872 -18.417 0.726 -18.5 c +0.248 -18.157 -0.207 -17.775 -0.628 -17.36 c +-5.09 -12.969 -5.147 -5.766 -0.755 -1.305 c +-0.623 -1.17 -0.486 -1.04 -0.348 -0.913 c +-0.143 -0.952 0.073 -0.861 0.18 -0.669 c +0.226 -0.586 0.244 -0.496 0.241 -0.407 c +3.235 1.99 7.271 2.729 10.947 1.498 c +10.969 1.351 11.055 1.215 11.194 1.137 c +11.435 1.003 11.738 1.089 11.872 1.33 c +12.006 1.57 11.92 1.873 11.68 2.007 c +11.488 2.114 11.258 2.079 11.104 1.939 c +7.295 3.218 3.115 2.465 0 0 c +f +Q + endstream endobj 281 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 355.0156 158.3615 cm +0 0 m +-3.511 -3.567 -3.466 -9.326 0.102 -12.837 c +1.813 -14.522 4.089 -15.446 6.461 -15.446 c +6.623 -15.446 6.785 -15.441 6.947 -15.433 c +6.991 -15.51 7.054 -15.577 7.137 -15.624 c +7.377 -15.757 7.68 -15.671 7.814 -15.431 c +7.948 -15.191 7.862 -14.888 7.622 -14.754 c +7.382 -14.62 7.079 -14.706 6.944 -14.946 c +6.941 -14.952 6.94 -14.958 6.937 -14.963 c +4.517 -15.095 2.168 -14.213 0.431 -12.503 c +-2.952 -9.173 -2.996 -3.712 0.334 -0.329 c +3.565 2.953 8.8 3.091 12.199 0.057 c +12.127 -0.165 12.219 -0.413 12.43 -0.53 c +12.67 -0.664 12.974 -0.578 13.107 -0.338 c +13.242 -0.098 13.156 0.206 12.916 0.339 c +12.795 0.407 12.659 0.418 12.536 0.383 c +8.953 3.606 3.415 3.469 0 0 c +f +Q + endstream endobj 382 0 obj <> endobj 381 0 obj <> endobj 380 0 obj <> endobj 379 0 obj <> endobj 378 0 obj <> endobj 377 0 obj <> endobj 376 0 obj <> endobj 375 0 obj <> endobj 374 0 obj <> endobj 373 0 obj <> endobj 372 0 obj <> endobj 371 0 obj <> endobj 265 0 obj <>stream +H‰ìWÛjm¹|÷W¬ð>ºµ.¯sæ)„0ù“d`|&çÿ!UÕ­µ×¶ý@†0»ËZ’Z­îêҗ?=¾üék:~øñëñôûS:lÙ­Ìc¶|›ëxøÏ¿=ýõø Ãú¹ãק/?ýœŽ|úýÈúo>Æ*·UÆ:šÝr^óxù¦ü]n¹c¹tëyõVlÏùf¶ÁËÓs¹Y:Çê-cۘå ñ#7ñmÁ·1ÿ¬üãë·¾Yà´'¥½ÐHS΅‰µ|å9éÅh ´`©¦›í92¹¨ :e:*?æâk^|#Òa¹ÍuöÌíÚËÓߟþòßv[=åw³z¶{|ó­Ó¥ã5,ã=¥[}ú­æ.°@Èø½`Û =:íûå Ó¢×@ÜÚÕÂY-sÑÓúåë —0G;ÌàzCŠÜSãF˜ä­gƒ;UKçÚ>€³,ßj›o÷2,Ô +þ¶y+ÍÆ5 ó-ÍáiÈÃΪ´imÐÍ0…cŒ×4ö,i_ßàÔ4=‡š5ïõEöÓžt¦a¶Ó&f—Ê% ,ìKqEZ×æЃæ“v(_v(y³vÄ÷ô²žÞ è úÒÇ܃=m»ö6 ­!UÆT|×Ìù_PCjÚQ^媃'ë°#2´žc(ð<÷¬îM†nÉ¡î®g[{½@ÿˆ8íIiW$rGAV~»£døñÛwŠ9u•ädéuãWâjg:°˜§öB4–å¾÷¡]çZ´eå‚úð/Û-OOžÑm™-øH§L÷Ñ8HÃÿN 3jÑáÛ¬ý킫‰a²|]C(ù8bfÀ®3û¦SZüÁUóŸyžŌc9w;&-™V}ËäU–Wì²±­Ø&ûy=!Œ"”"#dâĦs±TôÑÎ/ŠaŒ±¤ÌAB›×Š¹®¥ÔX}z=Q +vLéŠJoLÒEšÈ¿•ö³¬¢s(1É«>9Käù‰ä£fWâí Ÿ¾%sÔ+5yiw³ â'Ü{9{”Xâ]¨ø‘âTgÛøU½ë„pW63Çí +ßX¾Ž`ïŽÚŸýÃFÌ$—„˜.\ªZ9gµ›Ò䤬@Ú¿AXñH=+S6ÆÛ¹È º÷ +Å[WëlãÈ©VÞApªà„žö~RÖ'ÀRRPŠ½ðÃÞ7”@Éûöä/Ύ=J2Áœê¢r¯Gà÷JQ/wØÒØ>Ô³(¸çºÍºþ-á28òËÚ¸¥¾Öcêswu"ñɔ÷®ýæÝÌÍ¢ ‚ñܯé¨;ÄAú&‚TÉQœ/:x=µ2ËŸ}Û÷Ŧ2˜lK/Gq*LÊñêB8Ãe´CÏæ…få@ÜfRŒµ8fN4š%ÄFÃ;®šF^TâÉë¸ã*ª—žŸÆÉ8MÝÖ¹|_-쬭tE~ôå2ԕ /Ì ß½á„ÏÞ ðgøa×ÖFU•t¤A¿,³ ª^—i,Í7—rÖ,;Ì5э™Æì+¡yÆTZÝk}ì«j÷ÍÒÝ|WMèÌÀjêV×ãktēˆ«=¢¤V½Ûyfa ¿Öˆà*Ðõè&„Å_}.'Î æ÷Š¯RÚwÃfÖ7(B¬¸­üMÑÙ4ÆIX]ET]é } •2£W—Zè6<ó4¦>”BŠóþz9{ƒ–É©V¡)Òì|²o±Cä@ò¶†ß©¶°_ž 倂…בÞù âë¢Z«è•”¥žÑt‰k² —éeA=ê@‚¼÷²ÇZpàð³9íá#7õΚGL¡G®7¥o9'͵qړ‚Ž@“¥¸üwlG}‰ÃOƸ§µWtàï ‘!òoä˜ä¶ËÿáeXF°£¼´i§{Žt^î´G݉=s{÷Á ËHF <°¿>(f½¼ã§æ¨–ñ¹"i@R¥Ê%£eëp‹ ¥‚"@Zxï⊨†×aGeL‰üÆ]ß@do_wˆ–ÓÚÎ/îdŸ]©nð"Yß7±7oKobÃQœ=÷~én¾}àԘ–ìdô{ZR€t÷÷p¿&X‘¬f§ÅœY\sTo{‹ö—dãüùûË+"ÕZ¹Â%.\ߢƒ!™sm pµ¾aٍ¢*®£H1e[„Óãñgɛ%þàwW÷—=Lµ´œ©~Ê(þ0ªÔ¦Ê‡*•ßý¶‡ÉÅ%7–Õª„4öxrÐ q>“›öû…¥¿¼)´a,[Ç'ÕªÞm\¾÷*ۚV@vig«a+è9ÚVñþÆÞ®Òõ¾L-îªfe'!ºø•8{ÔJßf¶?èt¤À)iœcԖr=+½sÖ3ä^ŒQ~J dÒ"ˆ½Ê­á-À‹jL  `Z;Ç"f‘ |w‡{ÕòI-ÿµÌŽ›í“Zþ8j™èx†bµ²çëJ-* +Q‹½>IӀqâéV\XÍ ^ðV³uBÔm!%”q·&*+‹?S÷Iݎ= ZÔgêþ—R÷Ëןa~Ghï/¿]#m•˜¤í~5{„¸}¼©÷ÅÞ-€<èeCF}'&9ˆÑTȏ˜A);÷jJY¡ßG˜âZQ–U¡ÝøÁb{ùôˁ‡p#¤ÿ¤W³l;IàÐúùUŽ,ÇrÄ|žâ]`µ/ö÷¿Ã#¼P#ÄçÈÑõ•2«»94([Ö¦»kÉB"‘/ý­×mêuÑ·Æryÿ,võ«:XodSXÑiöЇºd»5²<”«æÞÀœûr ¾€úF•.®‰,Û½lKÁÆ,³+ø)€%L f¿¼«`âÅðÇE¿¾ƒßÿúÛv`ëüçã~¤6ÍE™ èÒPn)i¶žnë|·¹’ò¯ÇçËÞSö¶¾Ëèvs|€‰½!-ßD¡~qTe Y-5T,KH+û1oL4\´IB–5 ”)•~s 3;&h{Sƍ[˕áNi¢E„³¥Zñq#·iÿ2ø• ´/›ƒEcZ‘Js“s;2ÆÌLÏ‘¥‚§¦“¬¿ºÜ_3®5׈z§¹Œy1æŽ[<±ÕŒÛìõŒ¥¼B%ò<9É!üb‹ÕËu”4*£¯Ê"[gϕ; +¢Ãò-n3×,s´žüj¤z³ƒ££½3ÿšªÇ|ÁQ*ÿþ'Ÿ/ûÂúºá¯Ç?Ýâ@kƒxšG¶Óüü†?¨p·¶Õµû±„¾Ð?ö›ô†f°ßU®%õö/Äc‚ç)pö»^XN#©{2YêõÑr&:st¸­Fc[.ð‰îS|æ3›a"f9c 5†/Ÿ-ó^ H‰éQ†›:Hà%/NCÊk´ú:È6Ž–k-é¾5¯¡mkÅ4ÂñÏoì:Æ~Ta ·³*•áU.kâÎ#UkÓ ÀªuDü=ôªc6‹0g›¼Û&8EË6h3XÏ4úÇýtT~d‰=+©©Â£Þbí¹ ª)3V®D íì·HlTåÍÛÙÚ÷ÄÖ +ùBÅAh»ïœ¸¡Ö™ˆU½S¢Ú³Þ LégñçՍhB&¹Ãò&älÀÐޚœÊlÑæE­I£Š«çì%¾ØPâpqžêýtd!ß*g½\ /¹Y³&¶¤)VHyñ~b3àE¢&¿¨ÝYgq^Íu=ë²[CAÀ*þ'_ݍ‘œéä¢<ÚAFµÚnébÁ=—_—&,¥’›qBŸp0p­’ØŠ°ƒUdï Mº+Îßp $—gºnٟ: ­€ôÃ0ç蛨g(<.¯·²;¦jö ýLUp¶ Úa[‘ ­Îþ2¼`j̎F €¡JÉ[Z`_nU;BÉ; +NZë ÚE] *ËJTÙ T6*à# 2ÁÀâN—ÂYYjµ….(†oýÇØveyÒ¯˜#yt 6 5 ék29Õ±ÈÕM2µÏî¸PtaNPÅÕªøŽè Hê´Ð—§ã€/°œ°°|¼Ä );6Ð=Sw'•¦ûpŒ]RnžG(Ïþ ÓÀb:ëÛ¤E(®xkM©M…?jò–H:‘§˜õ#˜žx'Bº%„ÆPéuÝN¦Úƒ‡YÙ0IÊFj‚­_bØ6Ï ‰Ð"ì:™#)óîç©Â‡ §üñˆí[.Mì%ÃX ÷ìÏ®tfíc–ý ª,ÜsEˆÑdñ|†r6W ;üś…wûD¾‚^|×Ð픔LiÜg€ü™m\Ïö$1m®ts«NvLEqk¬àƑ­ÈWg5–‚(û"f_3J;ôz¯“¸ô|Ù³A‹¹m×RÆéüÚå®ó‚‹LÊÐyˆmè¼%ϼ*@¯z;Ñ☙̧‚Ê%xX·w$%¤¢­q˜•þ°m—ŒË”ü2¾º¶›Î¤<}µ¤¢¡0Ã× ¼y8]PóX(‚øQŠ¼¨…¸„ßVEãüW`©õ‘y$§QJw ºѬËÈÈ·[|³N*djƒ'‰  ¼æ Ǝš6ò1znWäN’¹›âNxç@¬8=·ÛÓ,7“iڊh|”©”èæáV‹—(⻈¿Hraöý¡‡¬H’|ãu[–1>ÌÛÇ鮲•²(™J¾› »Në:¯¶Â*Õ1B¤† ƒüÄÙ!>Cwë¯UÍáœÕüЄ +ÃÊ´&ëmÔØXž-Ø^íªýóÎæÄ'¶öÒ{°?˵…n•´]oŽ¼®9¦$maX.i ù9ò‡Xse˜€U@f]œ½EaǨ+:$ë²²h–º|Ýñ]í·WK¾MYôÜ5nËÛ5ä|ËÓ¾Àj× Y²wžv+±ZÁZ¹•ÊxËÁé˜J´˜½®øJÀ}†HÃ=n=—ç&æ{Er¾ŽczÆGǀ­Å½i”¯ÎŽÅ$•kœNÚh¼­Õ?Ò8©H*Óú¡•î¼®Íñ´ôÐþ4ê?ô­ý® ¨e"¾VŠ°ò- +›Böi¥ÝëƒӀì©`åU(R)µƒ¡Xvïíz²×©0-W}ð¶®ÌMrlyÉï*\'o:YùV€O&zhRÙîÂ̽gŠãgåØ©kønô§ÍfwÝPAé…ï¦nç)õ7ò¯~…>ŽàÕ´¶â™òÃn}ՙ´€x= Û²oXjþ²ŒÖñ6¬Gø)!{>÷W@3ê¤V7Z ²R+ VƒYº xJgbÛ*°òEÁ4[jœa‡Ýã:\y¢—{ÜÞÏð8)Æ0©ƒ;¸EZ«(UR=»©Ü5ÐÉïxªóyKú8ü;ï·bËú?âýìãÎû€n“Ê@Y¯¥v_L¥a Œ5{»±lV?Ô(§SAÀlÍàß=יËÄ>²‹s ¶ƒLæ£ +µ»­ñ+‚ï])eú?´#KE/[ZÕ*ÒzjûRN¶¯ôë6„b;m}‡±®C- .Æjjúbeݞ…j´Xùäuø¡?ÎkKç •A^›³Èϊ2S–MÂ+YBj$¶p_@ÂãÐÅVi®Ó3æ0f@Ì׬3¯”£ý +™Š|M°¼<_µæ%§6ïW’$”f‘~Ûû´<‘Å”•LŸ&ÀµWYñL®®«ðÈjoy”ge¸ìâ@gÚV ·egᘂ‘²?ÑMØ|t‰[,×M{ÕåIžÐU gW…üÄÝU¡-ÙÈ}û™å ‰í˜ç©¢ˆ/sþx„øM:¯ý‡ªðU Íe×eÍÚP£D» µº"c~3å+2!Õ¤qK2šy\'ÀêÐ<ƒ~O/"vcpbQXñjÏû¾æ¢¿vï¦køv¢M'ÚÙ@Œn©uN„TKƒGŠ!-œ¡õõ+Ò²Þrhd~¶ToAcø¾;n2ogcl™÷ˆ¦•Ï*®}¥‡CLY0ƕ£- j´É®p— cu1àÁ3ú[eضʱšx ~Aª“Í"Ò-…yI`_*;?ã`ÿš+3YäŠ)tù—6°ÈÃô…˜nùDTn„ZJ<ƒžà^ó&ÈSÑúc魝ûË¡ÍNê'ö¾“ °øÕ¹†î7‰mþ/ÝUŽIŒ+ý9….Ðý¸/çѯåüû ˜™U¥ïHŒ,A,”YµÖE9Íòu§v°Â=Íò¼ð¿ 3‡=ù±ÿ]®Ör§Ó}a¶4j®5U ³©]ö(?à˜­–ÑÕ-‡Ü„ göǏö +C_/|Ï·™9̀첅4ªx¶»Þ²füYˆ··')=ø#02ÛÑb籧¥xআ‹ºÆ‘‡B#½&)QÔdgêÀ;"Wúwí|"dXÍîeʔ':;ݙޑO8;_QZ°ÅM î› „¿ãµÿõ«²1üE_ëT»(1·%Õm8=†‘S6³èÁ)§ZRsÁç“æ©Ô,‹oÁ9ä ¡‹Î"ØȳÞ`Ñt*§¶ú ,·WßP÷0ÁÛþÄV‰£ëžÝS0¶²ÔþÓîOª§ OMG©óÇln˥3‰Ž}ÃØ946>Vlº—ÚW “Akë„ÒêLJèµM+v}÷ŽÑIÔå/Ó$«EÞ '£âŠì¬Y&ßÙÕæI+ó‰Í2B.ù‘¬ÔµŸß¡âº’2¸Uöy;¦¼úý0œ±üsÝ̘ °ªVÍ~£Ç1ÄüR¿BÐRh5ЇhSŽª6ë‘2¸UŽ-wŒy1õ£Öɨ¯š20r¼„^‘û\æ±æ~¢íZ‚©—g0ößpÇN/Ë·³é:ü’çÑg„«y(YMµ>/F¤§âðt~…‚tK’V…Š`Gh¹l½P_wL©½éPã°Ç‚OSÕk{~.Ôñϑ—Ú × DŽ±:®_“æÜfO–cꞒªb½·3ˆdµN4c,ø´ó%À#1÷ŠŽ¯¿YѶË| Rk ¼ÙCž9‚á[%­F¶<¯ë׎Èj—d Kï…ujHÚ §±OÛ'†½UO|¿'‹ñAS„/oPñXú]WtÏeÆTú¥-Ä=\’›,xÌy1V©Lêò4TXdJÀfñ&1’½Ö;,*‚Ä⠯Í98ªáGOÚPÆId†díµ.”åè%ӈòÄG«wéjûú­jn ©ó¬Ùe2 tÕjîùf˜¶ç·t$ÒÑҐˆÉ$™Ërˆ(ÇMºÌ#¸hrHbÈ!äurÚ6½dõTÇýÔ¿êÃ8"]všpê×81$u…wƒImЧ6Š7κ\‚Ã'™_ð<¬]#Ö üíA¨ëa*».S¡—äÄӈ’H˜š†º’ Ö­†;tö¿ÃT³áÑhSÑF>PÉÑ枱öˆ–U:Õk¬o#‰*gÛ/6 ƪ›_ï,9© hŠñ4ÙüD +ÓöLxÖTŁÉè_ ?¾Çé!Z¾òè¸rGAnc¡¯ôÛϤRx¢ädàùÎ#<]g_02¨÷{ûdÛÊ—ÊkêLºì1ÎPւc™Žª‚°š«„«H›ùhËùk¼¶,]Ž“ +g©žE,éqž±zØB¡™˜oÎl…­Y·=—EéE&i B»Ñ!"ƾ‰Î¨UóK»žú|…ÐÙx€ÉljôÙÌ/½Âãg³íÚ*9óÛrÕŒˆªak† #'¨%ÈjKš1:Lû´!”~Ì*§0×S+oEpBÌr0þiZµÔAV©‚-\õlG?úQk ï€0ÄB/F2i}Ë +¦G­tPÕ«ÀŽuÖ,šMÙA„DKºWRpjoígí{íÿØs– pÔý9þæI!ežÆ}cÒK­Üî èá᜶ŒÛ.ÀA«íYª ¹ƒ®æ¼}ˆ3I2‹^ïF@/$÷"Â0Æb/†Òî ˜d2WåDÔ˜Î(3ŸKٙ©ö¤¯ºŒ´{v<|ê·hI>­Îߥ_´E,| #˜=rˆx}´á Ægwcï\²f@a +U@éÊÉ1ºØa ù2Y¦§®óÿÕÏjùchøAŠ7Ôþ>‘Œx +V҆týyù’'IDúLù¾P +_&<2þú¥gž¼QÆׅ¹ÿ‰wâýï/ìqMçÀzÔ÷ß¿´ÖâœÎñÛk~ýRþ¦m8Q'Û ßrî˜QÇ;‘„©ø2H&hÛwñûdpÈuAF­l\¨’¨^c¢ËI¨ßuO`š~¶ä”ò1õaV{qh¦¢H& €ÆFŠ•坘 T–‹mŽÙ”âÚ1x7’! ©P}¾lÑEøeV™;ëTÆ_—LÑ)È©U|‘<Ø7õ©úOÎmËÉ'Ö¯_XŠüe*O~ûrKه×>Í£-¼GBí£m}<[Ûã^Îo/£R ×Ý?°¶:ƒË{zâXX[éìñ²¼'ÞTˆÝ‘:ԑƒ¦¶|€ùó÷.ØsŽ!a×O8W¶ÖԁTuÁë0e@Ùaéwpœßš=ymÚMÏ= cæ98âÜxEb$Û\î±¼}AÞú]ÙH#ûáj?’zš M¼ES'²@¢X#•ë×ö× K‚VªIÕpo1}‰uÑò£ÔH½MG_ÆQðÅR͵> ¯ÖÃ\åÈ#%3ÏÇDžpÙ`âWpÁ´.Á@˗g§º<ÄVÙ¼F½ôyÎj†9–{1U7ÕN9ß)y·üºåA,FO“ë§_.Ûvt.“ª<ÅcwՑÉW«u‚}3t9ü¹FXì69­&ÛchŸ%bmÂÒ³“oÍý {‰c|Â،×Îo(©£ô‡­Hf÷m¢R”<½‹› ¢I¼€h×^%_-qLÍf5a 4t¶}ýæô )ƒd/pIïvL×µ¼Cl^ñòéü–ŽD:Z<Ãþœ%Þ§êù§FTͻǼÖb¤$!ÉSºj‰urô³Æ•ðØOý«>Œ#ÒeyÒù5N ÉcÝ÷‡ƒùnf˜l˳Ø{VäX£ò3<‘-³=†/à‚6ÐÀk;ý$뉶ֻyâ%â£SÃ&C'Y@…Ž•ø=9úò¤³ê„L›dp}ŽX7$R•R"æ7•R‚™OÝèâìþEj[Žï¨@H‰®&Ÿôèh>É%§`PD“l¾ú¤ÈèNöÅ|ÛVK0}oý€T†=]÷*ªê¶bb‹ÙD0§*ã…2‹;EÔÕ~ö¤“v±N:–Š‰â}8.5‚Ë#;{Ü{ˆK'†'N¿Çh „ÁÑ'ìØÏ6…°2çç8ªÉnƒE*DÁf{º†¬J1Xöà£5ô”) Å8ÀÆÖ¢Ñ$tՔЯWNîi¢eÞRájš¦‚Ǜîq“÷ôÛ|,· x1w$ïyÝ:æ(· ãï¨6aÀÿ[«µ¬Ö•9ˆ:;UìÖ¬‚³7O>$$£Æ -ÑMV-F“6ǁ”«ý±µä‡’äšÏè\5®s|vå=ðƒôM"N;bGMÿ.²ž’pæ=È[ˬ\w£úÑ½Ž”A”G.ƒ…[ÖÜG_ •E8]¤ê(Zë”ÙœÔNI‰%·§rÛGભòAèm!¯ÓÍ1ðyÈÝÜÏF0ÇÃ8"ݖ'_eà Ó>ÒhÀeÒ¿u¦¼ÔØ`Æ0¡(k×.†­<¡Ú7¾ffUÎäL¤ +ȪվmÀ»·ûuú´yõÌ ÕÉ5:b’¸¬Â„™IºŠÎÉâòƒÁ·½ƒ¶*N¯¬ž²=kŽú>Wi¢4â§gùyš¹ðÖ­ÃÍTõÒÞwM¢ +AÍùÀ—瞨vJànßÖùÍùQÌS ²z¡b¨¨$Ó»ÿ‘_-9’ì6p?§è Ô@ÿÏyfѽñýfDÊ¬ª~ð3à•½J…”úQd082¯¹ò¾ù5\ÊóŒê(ü”Ë!Qqjí€èBØÝÜbÐ+[Í$€y‘¥ÇhI’χœbG”1-{ä.o5ŠÝ/|å=2›”0ÞäAëز!²ð·kåƒJW‡ãªûÁ_Zýxºü»ßoKH(OÿŽß#ûÝü>àœ-T—µÔãݗ§Ã¥Gq`^#½ ï†ðËQÞ0ÿÊX­AØhŽ¹ç:kÙ§@fbù\cv'Èô|dÂpmˆåW$ H!ÓëDŠž¶’ÄeCªuTU@•@ñ”~½†Pìc·­ï0öu¨á‹±›Y/¯³sq UkþØbç×Úú?ˆëi,ø¶3<%”™X#ˆ‡²xÔ|là9öÞï8t®A56yö•è”3•@ ׬+/¹ÿðp­ù +×DþÊËÃ5©j*Õ*h::‰AqíTгéy&‚¸K€£®àÞ«¬Su¦×*¼²í”<žà´ª½E!Ywa›|!q‰Ç°õzñ¶Ùrݨ×츂ž¡“€ª4-yÇÝI¡q{äŽëC½&$®óŒÊŠ˜™óǓ‰ßHa¡äÛ“þ¯’áj–â,ŸAmï”û“Ú¦D?–QÕr,LM7nI:3 áØ4ƒ1Ð÷ôb/!y¿vÖ gÏEyí0þMWóíF›Béݔò6ò>7B¨¥Á+EÓDÞäZ_¯HÛzÅ¡–ÉÙR•Oóýv݄ +Ì*SòûnÒ´òÙƹ¯ôPˆò£Af´ñæ(KÂ7Ú4Žø=wq¾0·nòŒ¥*-òî¶Ì±šHRÝ2R˜iœæäŒ +vp¸lËUÎښ#˜Æ¤“ÿWXpº ïæË"] ?ǖªäÚkC•!ãʓsP,âEÒÄü;cYâBêÇ +ro3ªEAƒÜ «˜œF¤¼e[¸uSâ å†C„¨Ç31Rï!f¥Xd7¬Ì‘IðB¶`Bš‘j³à‘ÿàÍD¯¨"¿ù„= ¼Í¬œ«+¬uCmÅǂC$«{›½Ú£MozFÒÓT2wȨ¸Jç[€­OÚÞô1è]x‹½yKH!JbèLJÏW\ìà×h™ÉyTՁ-¥—´]$bú‚M·„"r·SB-%ÆÀ(x×¼ òTeô‡YŒk÷þvh«“©zÁ½°ÅâLu.‡ÁüMt›»kf²­h9Íòq€bÛeážRyüu0‚X¥2àÉqµ–@*O÷Á8Øb=ÈÂVbڪ痈YƎÍpÑ™/à!o ÂИý6(›3ÔùñdÀ׀›匩]$‘ UO"ã‚4Ɖôé‡ëäÀoŽ‘7T5䜹n…ƒ²j&Á}Sw@c#*|¬YØí˜%@]¦æÃ4å¡èðõñ°™ã“R,´‡r [žá«—[uÌë|õ<(#PÉE“"å|FÊ9jÿ?*ëu8 Þ;Å(ÏýhoVù½üh¢ñßÐD³4K:9Ìññôÿ?ÿÁñ²èâÉâûÞQìèœ_Õ<x”rð''¬TžþØ5±BàD®½z,֏kaí·-„5A‡¸þàÏüÛàwؐ«‘ˆwK÷ F…¦BDD\' +ä#ÀBdóu8¦b³z?À F‰ee†Ý&ýÕu–sÄø©N1'ydÐñpÎJuXX¹(ôò › C:â)Q÷8þeŸ¿ÍÑK 2“ô"Ü-ÚS¥ã‚£@<ÿ +0É ÔëÝ>$Ò ¹+¤ÚªQ¿‚©_¡·ë)o4ržSًØv:‰.ŒDˆQJ¤[•LêÞ3‹…Çà›0¤ìÓôB³ßP9W6•¦â²«k‹?q;{ž–¯< œ†ï£'†z|HèÀæäÁ¦Qw(‰Úi¶Ë½øpÈq>_@uŸkb„Õ ‰èë 2<–È#!È7¹ÔwoÑ_T¥˜Æ|^•ªAl—¯]^uFéEY\T¥æHä…Úíá4fF•o¬Ñ2Ç sÜ¥ 8ó¼ +CIˆîÒsŒûõ|†¡ÙŽ òöN¡æè®4FF‚:5Úr"\…#Ç]c]ž© 3«­i¯ü—ý½®.ìLzzĄgçɳÅaÒsˆø#é <ßâ…K«ùu3·"¯ßrkÀU”\½–úœA•Z±M 1嵍ƒÌ„qOÏÎ DI¹.¨djZ°‡žµ­[ó62oUF¥»uÚ¶û•xuÆ—xofkØstn³¾”39A(H¨»Rõ’$€„A¨Ø^^®Ä؜©bçÚÏhbI2BDUƸì'f;WÖ(ðpdd*>® ²C(qæ‰Ú°/†~îÅ÷ÆKû˜Åø†H,’å ““/#IKvçTÕ©™Dg"Ïˆ»°­,“}$JL(bµ‹§¶ãŠ`C™ý&>tíY<Š%ï¸'o6nqw}f9HL¢ê&‰…’ +¤™óǓ‰ßÔj³ûÊ1ʲmnž1P{œxzF]å‹.¯² °Ó—¦è}ßÆv»€‹KäüH=n½Ùµð¤âÑýg4܇ +D€ÅÙ:CŒ˜ªæåÆÛ8¼ú§«ow¶‡S¼×É*ÔPF +ÈÒûŒÙ'˜%à^&bJB SÐyU¥UÁî[ ¦˜qb£µ©êGÍÅ+"B]çx\ ÕgRDh’Úž€×i† þ^o‡kŠ!í£¾£ÏŒÓ½؊UlÁ[úz1°Ó0â…ÇRujµÔys“Þ¼Å@È,éºxkÛʪcºE´±uöãvÐ6)ÐhTQ,ð¿é¨%àWÀ‚Š£ÄŠ«òißiyXS6?çz3d ý÷+šFîe7aÈ ®¦mûõû Tvübš֟_&;RG„(úøO ðÍSrjÝl®®œS«Š4ƒ!—TÏê hfÚnëA‰V +¦u” +ֶϰt#-gDÿ0ё$˸ɴ°aúqë{l‰ù§ÿ–Œ,­:È!ïˆìȬDt-GïO°Xjಝä<€ò ì¯V¦vªù)gôáÙó&bBm„تӑL3Ä +³ÎSS&m ™Ï!.‡VýÆKÁÄ”wf ìêÝgҒGۃ[d*δ0=–€Þ9À¢IO‡ i"Õ­¨òQTѨ Òk”H@•%ˆf˜oòßÚ£­{í€YNsÄr°7k'ÍÒî‡ûüÕÌCËe^‡VÌÕì©NËÒÇ- EF~h9Ÿèf`b/SŽ>K3_ï+$å@?Œ¦=çÞ­ÐՂ‡OqO©o0yýµç½‰\¾÷„­:)óì:Ülª·`5"ÁlI’EЎKÙ±Gö)jÇjBÒ´öž ‘N}ÔøHɗjõƊct‹³F&Z`•9±$ª%+n0̜]7ãÔ"\•Û4ŠÁø„Ú«Œã¹À÷÷žÎÐ5Ï¢¦ø¹³¬gBÉ̗žnÞjÉþqáIrÁJ&úüuïé¹r;¼‰˜Ÿ{àÇÚf™dø¹+ß{lkË.¶£Ù¡¹ó¸ŒðIێ¹Íé&-ëd6ö<[–óáf elZ®ÃÇ°jïwliL8¦ñ0LT:'v†q¥¦AOú#MÑæÀQ¬§g¬ÑYMá9»1?p†SáäK4š?$lñMhvKÅ&€[–yg@«lþ!ÏÊ£bŠÔÒcçÞo˜÷Ԟê¨Tú_\s×õ=-©g2F~î‰YnÁèøûՎcIŽý>E] ¢þ:Oc€1º½¿±Œ2_f½`×Xo*ÅSJ¢(2üûÑÕÎí¯Qœ÷pÛSnU…ñH<Ä0HšÍWÌO•<·áë+¯†s¿a~º~ڜaPk€Ònú˲ß…Ù-¤ï¯fªÞvÚ;\l…@Œãˆ­.x€F•Ô–þ +uó]™?\gê”é<󐤕§(1žˆZä¤@¼†/_œ>¾B‘ÄìH•ö'at£ž·‹5ÆP0@å-ÅÕ,õší?U«¸P@›þúqÁs(Ò¹Ì3kÌkS!–5)|‡…KÙ´v7¼i“ò•ôZ¶nGÑn0xκ +,ûZèfùVÛÓ6Ý•.f»öR‹Ô†9Z÷0•·XIњ1y·øõЃž^ŒžN×/½œÉv/ZÒS¶¨`Oã‘EW žU‚ýBèëysìH–6鈣r¬D…†ÈCZ°SòíuÞᨑsÎwûkÛTXÌ¡72š=Ž4JeòŒAYâéâÙ»yug¡E‘l½=…m®:ÖÆÛ_Ý'0tº1§ôUÑÖb­n,ÁûÖ²ÄQ‚%W”ÜEí矪ύ–5ZÕ4@Úní€%©‹](ÆEÑŽ‰WßcÿÝnÆñ²8)gãÄX™Öýzs°G>ê*×1hÃËÁÞbÀ”ÚÉ2?e€ 6ˆ0T÷J^ÊýXM¨Š§4† • +ª,¦‘« +ãëôcè{¼½§Ÿ²Ð?¯%‚dÌî³°LŠ½ßÐú~µ¯høöJàûMœj›3•FµC©º0A¶/«iómiÜi°“Á1ö+*AâvWº!O\କ°°jâߌÐúR;ºk–â¹Ó‹Wç +!|O k=Ò·Ô©![Ÿºº‡=ïŸ{Mnx‹iF³ë¼­ÑgýhpÝB¯„éáŒñLs÷@~‹ \½Ä¸0@؄¶#³s¦¢snY.3GÛ Ý‹¦¬,°´7±E—²ßª‰¨ý¿¶Eòæóáª{«|Ks£¾2Úÿ_;'}]\6Ý}m”ˆˆô…Gß$óÎÆoå#¬f*+J,(úf«ÿ‰ ¬p´WËÝ‘-pRà’‹.úAgô£&gVÌ…º ¸_­3 ?Ck4û`„'«$p|ë²Nˆ7™õš” ¹0m{w¯«iˆ˜^\³£ößÜ A¹iç bR=`C¶x¬o¥ˆ_À›—s^s½¨zƶ?D·‰²lKdPé¹2Á…ÑW64{xªªüpŽEéüCLy¯>ûHýOBjz¯P}—n†Ö®Þ뙷}TÃhêD¸§ +®þ‚î›Ѽ²ÔŒ×²™cº¶Ö53 bb-S1p·Z- /™, ‚¤*‹¨> ¡Ê@@·§Ó¼Cv5¾æêA©Fy¸wt9|ë8–¯Yc2Õúq/¿téAE1¢ý 'ÃÐOŶ_[VÀ½¢²â‘m_Ã]·*N¡„,(µaÏU£Ö8Ÿ£ÛÈ¥nM…¹³±€4Cí´^cÜ]« é"C-7&‡”ò=©ŸÎˆ±Êô ÔX†Ë΍ê×}Xºn쭋ê]?(:𢒂}­½öÅ8ßGÈ^CÙjlC÷2ž;xkŠÀºV<¼ož&ÐSåv¦«Ý¢AX9F„ªDQŒµÈ ·M3­% ™­0r]âÿ[fZÓ©ÃßÈK­?ÐyÄRIM{QÉûZC¯hoHôº`c¿pÜHiV=”îèÒف?NÑSK[òþ‹M¿6H wÙ±±ÆŒvë×Li`Ž¾û5Fpð&R»T¡ƒrúÑÃÅè¹n3VX€í*õ#ºZµÙԂè]À.†ê¹¿‚ž„Å,ÐzBFUˆïC`ø³ 磲}á#?èæ ^î‰ÜSͺ¬üV¨t:C=ÕÒ½ÛC•Ÿ!;ÓºrÇj#€KdÀιʺĊž÷7ôRç¥`㟀¦Šéñ;1¨Lؽö¸D¡£ðªÆìÞ1ߛÒ,`=Ìb%9˟aK?îÊþþñ’Y”q~c÷Tæ$0´v›4É4LùFå{ŠŒé£ ã‹ù§+”¸ôÜ-µq ×ö¸f屪º»ïýý¤õ?SxËì®ð%>EWÆSÇẩðœ‚Љœ>uwO}Åò6•c£Ó+©lÎ\ã:ìk·éó¹÷tóxÁálÀí8•ß¦Nqý ºó_@±>œÑhÔ8Ô6² 沬EÂyÜ òRˆ0«T#_¡Î²cÊ¿ØÿÒ²:Û£m_sY­pö¥euö¡eûöÃAÍÇí@‘½"€ +„oŒÒà‘tº +6Øß·Tåröõñ‘pòÿ?iD”L",‚–¿>ÜN›ÚÁ#-‚6‡{Q ©ΰÛèsº=’Óéò+¬Ñd”L¾Þ +>r ŠÞX»âCA¬3ëÙ Ð\„¥ËÝ"ÈÜMøh[Y¯­ÔíÜá¹=´v˜@¦§¿.V^÷Wë¥Ï³ÈcâÑøBl¢Ê„\î‹|³f')Ÿ .ýðóbŸ*¡» ÃÕ:IU0gK¶ž +•huËaªzÀýIhT8`½ÖCÁÃRž_(fk5£<›yl.<Z-æ$")BqbÑcð>{²Gš;¨zÎÐ/Aµ.l$Æú¾·hºXÌøKTPS!E7–•²ek{ÑÂx¢×FȉbO< +·:‡’}ý[õB¼“)fåÅ`݇‹Åész˜Aº‡´úSúä_q¾8ƒ"ÍA”¿,÷wð́·³'p¿Ð/~?Öy̯aõ‰q‚Vä/͟ý¾ƒù¥^'¯|· çÓÂ\¿n~ˉé[Ü0¹À9åÆdHHÕ²x¾5”šÑR$Ü*µ•2£t5%ƒŠ¬•ÕT  ­š «ùhGA_!Ra¿`áZwè`˜eyï1¦,'P+ûÙgä{Û%knÏ@Ã7*™ÛÅy§íã^}€dD[c¯PÙ'jŒ+¼Q÷`þl6$íà£Wkl5tÑ=QäÖbGÂÄDšåÆãžu¾òoà5öj1.wŠŸùõ§\i}ð@_‚^cŒTˆ6Öm4±Ý­T’%«A¥Rã4:Ë_/|›²ÿÙ'aùÆýV)¯åWvzj{ûQc?»-LvM…b|­@MmÀ97ˆ W ób!|Äø› uŒý>SÇaK.º($(öޔèGÚ³à…G©/û¸Ýl' ¿Mk±Hãx±FJÇ÷áï—q@¼-NÊÙ$k. ÓÞý{<" Âö¿Ù¯šä\n¶ŸSøžõ¯ó¼Í[Ø÷߆(u·?OU¦’,Rå-|ênI €núæ¼;Yw…ÝÆ©þ'z…ß`VÒÉ«3ß¼5ÉФ·u›[õ¨Þw”½EÓQ-s®&Ž¦6tÓýÙÙ7Àkò%œb}·õ?ú[¸:ûI©(¥<“j¯öç’x” {“1dßk֏ ÀÈoEq«ý)5}${¦Dê· ?ǒ'OÒ*ÿ(Œ×1Z-Æa»;¿µ/ÆG†Ò¯m̀xý?šá}‚k §'4cÂ×?5C"ځ®+€¬Í:s…ÝD¼% Ã.“ +¯àǹ?' DI{.í7NÚÕ:vÞa+A#:ز᧳=~¯Œjñ’Æ‘x•ujŒçñ}yÖØ\•iÕJ{6VŒ7÷ÞX^ÑÉ5¥íòžŸ¥2ï°¬ôT?Q{ @£¼Jßs°¿ñV_˜…©s}«&WÉÊi‰Ñ˜úWz݈QisCwJuGY¾·Ðf·$UABʙƒf]þ¤`lÌË æ`jq%.•Ü¨Jfw(èݼ¦•†ÜĺTۜQҞÛÆ¡|o²É<5+3Кâ¦Äå+獌͌’¬uvŒ"ŽíÌÌÝ!Ü+‚¥Æ Š¤MÔav¨üûëÕ Õùß՝<É|àí΍†Ä„› »7ƒ‹& ½Ñ+üe{xö/þÙʏ¦ü½šâ-Ìjž¢e4×l¤ÏßD`¡5æíØçPa“á9çÇ ˆL$¶…!DÈÑ5•Ûçs‚:ËÆi¿“"/¯jW¡Ï – É]ÜÝI€40BÜeÄø¸çuž6š (½Z.¿Žª³í¨áÔ1kÅØ}yÓSj¥hÙ©oåƒŠCµ(&0S=³q¯º^ßǓÞT¶kæ±ý<ØWïډ\29¡Š’¸1°çƒÛ‚ܙ%Ëþ¯ê†F»¡|ŽRÉàcr–£:ù—3R +ŸÝ8õXGWœ*—[Yù#šŠ„àÐك+ä„ôê£^éÀ‹KyCæÆ&x©59…åt/ôqPæ–<3rÛÈY.±Q%˱Ä\_«ÍŸ¨í©Ìѕ«@WVYf‘)3[TÊ`\H1æu”oSnLÝ +´'2.0Í~óÜ +KI((Ü6Æùši?„’|Ì3^Ì!OWÜy=!ùusÅãXI„£pæ$ãoÏÌ|e”Nú!숰—07óˆïh¯øV'­qÔ÷‰œxF¾”Ùw’ßâ¾=Ú-̽ƿþ#_&5㠍õ-<´×qEÛpGéŒPüXNáûµ&:ƒ47Jû…o͍æð‚\îì W»©ÝI$ŽDæ )m6êؽLS‹è߬ì…|7{즇K¨Kc‘ú×h¿FU÷” +♴“ŒsfÖ Ær•H¡Aþqd6¬–³?;±.ünwP_^ã•¡ÖÝ¥&œÁ7 ·¿ª×¿+‚rÆhpÊm^c£å8 ñ‹è:|‡ A2ZfOÝ6Ùï¡CÉcD=hìãÍ +á" +¢1¢!Sèòڀ±³3ç2®ÆB^ù›<˜0ã€@{Œd3Rˆ_b¿Q¥BƒZ»$áÇÔ^œŠKƒê$òúHy#’?"²g}¿ÙN»¹%±Á57áŸzîTq}aûPàrèˆðÄ\2]æÒ­{Áb-àڊv“@—…<ʬ*ùæfçMô©8 °Ð÷Q®;$U6αŠÅŒG>#ÓRË1Îa‹„Þ¥¤(´Ôž0rú؟¼ã:P¹|Zëöo䃤B}œYE‘ ¢½=BüšÞStï³ýq¶?ÎöÇÙþug»P¼^W`”4žŒâ!œãb”e¤HŽÀI©˜ó„s°8‰?ô›æ–B“=fŸyɑ±Hçº?.ÀpáB}lØD-cH‹Âô.ÿv€Ñ›ˆW3ÍIì(ðÇÁ°;r³ºÀ f؂@rÜë`llÊc.VLÒI`‘°³¡L¨‘Ò’ÇVdÆi¬Ò6P*Ý&3Ϻ2Þüz‡cy¦ ûÊè¾Üòu‡0œ2 òjú&N, ÌYg&¹ï·Bù1Ä!%x?^$QØsi¿qüC­c7'æg¸ýt¶W븲 Þ$•é%ƒ*˪´uhž Ü6Wå3´Òžãͽ»×Oœ²»Üw¥[€ãCIùÄ¡³keqW9Œ23IZ4 )(å¸Bé[då/ÈW'O׋‰Ú»Øì{3Ù·ôÝ·'AñÂÚ@¯‰ÆÌѺÊIö3G9Ì´Ô¼°—Bh@ñxÉß®·ÞÞ6ÝzRø*{Íê\p\.¥Ôy(5dÎ¤Mô‡!È)Ì#’=_s&VI½|ŸÝ¿•½‘+y°_zÐ;ZHÔ b(9ĉ8fâÁykÆOž˜ð=eöOA[€ïâfÚ +SNÚÍù¢ÉÄ#©n$=\'®ow®È¬uªÁ-¼.,:*7}@¯ýáR²ÜœG¸á›¼jš+¹zX 9aÔâËòã)zdcãm‘]ê:™<€bfg.Ö?öŽnKÛ¶Líü8Øíå(A'è¿6~)­î½@N(­é4Òó³X2֕ɔmÇV@¬’æžËüw^§‰á®êV=c?­Is^1Îì¤ØõÙ +äD’‘E™¾f¨¥4“r„ ƒp¸Tíx°Ï¶Ç±õ‚êú…"®`Ù]e÷”b2d1i’j#çrºFì&Ì‚FóI]’zÖ̏¬vR(<Ü6g1¿e‰à¾—ÒþYçD’sŸéNÎá_v}2tî¼®rÜ6öœÉhø±Ò¸!ø>J,G.fÔcOœyQçù¯Ø“N7€,þ‚γ¶¯Ø‚ì÷ógíÀ¾×pÆ%ù=P£í›+~8u:# È~×@èù°lÊ-ÆbdR¨ZMP‹Kz°ajÃ,%õs‚ŒPݕíGÙMlœ,jqµ3«ðaÃÉÞ±}-ÆÉ(Òɜ¾%xÆ7›`XÛ  ‘û0†-€’Þû|Âx¬°"0¥Ú° Z%ÌQ}à<ÿm‘n»-ÿ4{ʝ†i¯”yñý÷ÿóç˟UÉÕPÇÒ@¿eí¾Ãò_ôÐ|…äã_úŽ½Iý ©‰¶…{FçKJý‚¼ýùò}X„=@*@ܽ›JQª±üTê5Ó­“@tiúŽß­n·©\Ÿ2̶)F¦4oпšL˜D'ÊúUaÌ fØÑ.kZ †OLMÙñ6’„nWôô¶¸‹îk®Š¸Æ*ƒHVZLt%tsÁ +Ùv'i:s鬸R¾µyržC -V‘ªÇnó6@ûÕ¹2™r,ò8’¾eë3‰iFozƵ€'Ù81Vë^ý ·®í´OéÑÁŒ™*ëâßU?»%åèàÞڙƒsŠ8Þ<ã¤|´£]>Je7¿Q\ NJk5¢eä3‡ƒ{5iš·¯sVå.H×oÝ|ëÊÝ"¨.>½‹”™‘|¾íµi9—È}Y/«#±ÕæϚªÃ6¬*¸js±Mý óÍ{ŽžVû€‡û ©¸XF®ê-Û>ü‚Žz<†âÈýŽ Ô¾¹OóC¡Ò…¢îù‰F½fqÝåVPäÆj}×:£òUmt¤ Õ)Ö+½CÁÑ·ZC qBÙ͘]á'®(<ýþüt§aI<£½Au¥NdTøï?Ì~y…¬0U!%aI™QC‹4kKÓð°l9°Ôµ:ö“‡‡º{G#Ö)kK{6·×„àø˜à zÀ®C&D¸l] ¦LçHã¾Á•hˆ€o¢3*›ÕbˆkúMðM&éȼáI³lJ"Z¡êfÓ®ÚW”ݬK䐃,3‚–2œÈµÅ+ȨJr0Tu>–ŶŠ+§›†©–+¼nUÇ,§f9˜ TÆYu·T¾ W=ÛY‰dýlk@òp0ċžŒ<}Þ]Œ>Zé ªWëŒYï›øJJÒ½¤‡¾­ýŒ}¯}à‡=ç5ÎvÇß<)VلGã>ߐ‘­Üî ˆ”¬9¨Òtܞ pï`15þˆŽíu=88úyPÇ ;iæûݒjyiÆxٓ¡´{&™¼Í‹È ò ¾ÀdÚCÁð0D­eȒ˜™PÇ=»Ž|ê·hI>%û=(ýz$ŽÏ%ŒXñr,ñøìfäB‰÷TŠtY3¬ ´U³rNŽÑ‘3¨cÈȊ\/œÜ’蟿š[V]HG¤xs«CáüD22 QJ™ÇßO¿dy‘õgäò~á*ü2ÙDç_zæÉ17n¸J}Â;3‚î_\û¾l=ZËï¿4‘|®ZèË¿ý❟aQ¼1lƒ„ÓÉãö‚{Θ` ` µOhÆK`Nõkù.æq2#Ž¾ëŒ2n[”é×ðiÞҌ]^Ósòí6Èrjù˜úe6»KRÕ6î(q2\‰sé6=WíÑ\M ;>`!Ú !PÆD³¥lí”U[ HÔüËB#ᡌ¿®5ÐïÜr¯â{”õ€}Qê_ÐŒ Ç9uýú zËô/ÓyòË/÷ªpáùOó¨wðä´ ‘ñЊØ©óœõi_•Z¸îþ‚õ©3èax+ÇzÁút‚"Ž§aÔ02¹ ™<µ1ß³&SÿÏ· öœÝÃó®¯p®ì]Sÿr« ^ÇÀ€90’mŸÁq~köo›()ñܳ²ï=jž¢SœÏHŒÄŠòqxûb·þº²YWû>tÚi¶ÃåUÏëA¢X#•k¶ýqÃÒBoúùvÁ½E6µÌ5älj¤Þ¦#/ã¸ðÉRQàZ ¯Þ'oÝÔlæùp‘ìf?³ö³0Ѓå˲¯.¹E+ÉÎ뵯‘%b;0Ìñº'SqV”¦JÆ-Ýò`Ãó1zš\?ýrÙ¶£s™Tå)»«ŽL¾‚X­쓡›r;ç(ǶÉi5™`šÂæ>J2ÄÚ$„¥g'ߚûö90Æx…ñ1^;ÿ@Ií ê¥,³û6Q)JžÞÅM¿h>u[&Üù”(©øjðJÕí¹_Û¤‰Ú¾æœ¾±ÊàHͤ×NÝÓu-¯³_>¹tV\‚µI½~Ÿ!Þ§êù'¸ºÌ#0Á›+`:¥«–§[•ðøžû¯ú`‘.˓Îlœ+uŸ/^àMc«-Ê·Co2Gñp‰L.nPw  3³¢ Îâ5°Ëæx„©Ó•S~-fÛÑɤ­zČpW]ë{‡ƒ“ +4/‚ý¿,RsRxJ¦½Tk8¶æ°cK­'­å0¼ÒwF©n×æShµunHÆ6×Câ0©_ߟ,ud”}ù¾0Íeef™>»:Ëò–w¸×l÷ÔDÞ¶7§U\‹!.7¢>ÑA5³AM3}¿Á§Yz˜"öögõWd6=£U†\‘äC‚%ݐ{‰ñ§ª H‹>éM5ªK‡v×<;(`c ú„­:Ý/s]OÙOBˑ`¿k¾?»ùgœ.»Ú{Ïýπ€ºÂÁ–ùæ³î½GŒ¤­Jjᕞʅ +=;ÅUzF¬á×ÛÀl¼¬é‹ GÜ®vÉӟTØcˆ€8’Ò¢+£ð|°º)3Ž0¸Î5¼Îõæ:Á? |ëI­†_oäQ¡›-~H å1âzñŒƒr¥y!®)M±+‘„ƒp_XsŸÁ‡EŒc)㍘FŠÀ]MŸ ÏpÉVø<·ü ›Ë.¨=£’ˆ?”0¿¡\Óô°âl¤ ÃQ× ˜ù:ŒðÁ .—Ýcº +ÓZ)âg×l2yð¿«+ô¦ÝØ忆US§MÚ´ÇV0‘fh×T佪³Š½hªÐ5Ôˏ<ý;kð”¨u Fú”›±¢’Ç)ïà¬Rº 㺩Æ*¿W¦ä¥0:'A¢Æõue=:QìsQÔæ9L2€¼ÜÝhSÖ¯k½Èºàq(¾_ûýÙ½/9ý2‚—9Ÿv~ µJÊD(‹yFJKYÙïf¼VŒ¯I²Ã*¢Ló¨~å8[g•*ÂC̈r³³E\Xx‹Ÿ®ãJ£]x_deQ´Ì4÷rijšŠß0/ΗÂñÐ/ç؞|~öÃ/ ŽÊ‡‡(nƒÒ¹ÃN ™î bS˜jë6c ËÔ§ª5¯Už@žÊîù^”É(˜ÑÓ²¶QÕáÇþj¾‚Åôƒaå÷Ó/µxâuzÁâÙÇXÿf¿Ê±ëƁ`®SèöÃÖXây} +%øþñԐü’Nà7‰„ú$Ñ@/Õժ҃?ÞøË,ñxc©dïnܒ¿8¿Pàæ÷{Êßñ°aüñvŸâ¼qNyvx½oÿÈøÁ*Cψ w´XŸär(5™¸4F0ë/×ÊgscÔÛT(ƒ·”$¡éÇÙã0£¦’{Ìrõ´U´Ki{͜¢»ŒuÑ>¼Læ“k0aø®‚ºÓjž°ç 6Ë ª2Uµ¬´OPî›!nãñi-³ƒPð„4ÀšÞà´Ý -ðk<²ìé遫w뉖iõæ&ƒ…Ÿ¼æß 4Yd¸y©R‰l€‹¨ñu¯í:Þh0bS‚|II¤). W&iÆìOÛçx#ÖÅ[#FC\Ó¸FŒŽDeŒW?KWkG&y­¸ãÀFpolÝؐßæ®wæ¤8¡ü¥×k=éºÔç(%¸¯×̍7¢BÇ2ZœeJÝ·"6)/¦!XfðJЫšIjáæMÚ&¤yíœ@ƒ¥ó[Ô½vÿež±}À{8½gvê|€o^ÏÐ<¬~G¬ï“c¢sr®Ìi³ägr±ŸUI’也îð¬ðš¶kÔ«dF¢s¨¢Ý…ÑüSyDžMݵ!¸Énp0q’…a ¯«¢˜K/”‘O +Á·’e«»¥´‚orˆ"ÖV|!xä³3に“øñ¶O¡®ƒwïF×âÊ9v‡ È•G¦'¦©ÆÚó¬xöIc|‚…´ÎÌÆÿ{ÿßÞûŸQÇ*å$µÌ×ö7ÊriØÎ Äð:+2 ^œì,EÛÛU+–»¯è¼ 'Ôø„Ž ¿ùŠÒµ"$q_²Æ× I®ÚàcS׳¹ä Õ§¸]CÂJn$Tûl[Ãcçƒy8@eú¥rÖL¶àŒ#”h¦ÎïÝ;š'‡6Hv˜àÙnÿU³P¼MíûY“bí{Ze}íg§ÀxrÎ%iÉ"†V1‡ª¢¡U n]TÞ=3˜© t‹Ô7òü×<—;üFÜÜÌJïI¬Ô$q‘úž:Úìktª¡c§yT“Á™ÒWöa©%w¦É¶'}ǒáiØÛ¡7X•L7£˜Ú´ ?¬ xŒt!Žü<µÇ˜&åýÅ}_#ˆa Ù:¹ÜÄýËNËVÅ­Tª‚#žd¶ÇRçnì¼±öšµ]ÚØu΀“³ÙRÏÇçìÀ݌èXFø›z^×nó'‹Ùh‚c´ÛgÐ¨ElhÑÿç J9÷/°léº!fTškòr:B5€$WsÜPz‡:³SK P‹\£c¬:Ÿ`¹ds·Ô íz´+÷G\W»m[]ÏRëÇøpŽõ—y™t/ÿU +üúýÏ;þý'ÀèK¨ endstream endobj 266 0 obj <> endobj 267 0 obj <>stream +8;Z]"9b)k"%#!;S%sP\tp[OJQ8#X-,L'0H+7a-75`":s>3rDOoK_-P/k$'RcKm"uC +3)c!5bt)K?'9Z'^[h(#kIHQ0^3]?Z!&P?oIUP2t.<%QLi,.3-+3U$Odhj';sEr_Gj +1bU497l@,l!0l,c*MG9($2o7F9';JepMejN9[C/6i&9nUKOjauV!$-BY?Ti1pCPsV +3Y*CClj$&-F`^REoHo5&63n`fXM]e*_sF?c6Z8ME4hj?j_(bokT?pO~> endstream endobj 262 0 obj <>stream +H‰ìWKŽd¹ Üç)Þ2[ԇ·n^†á…P°=€«÷ýGõ²2sjvcÀ‹F•âӏ"ƒdðË_¾_þüµøã×ãòåëßÊñöý°ãøþöóå˟ þëû¥åX½#üøÏ?.ÿ¼ü‚Oøñº¿þýøY ù÷ïË/8ƒ#;z½E”ÊßѬoß´ìÛ¥ÞºÇQoVãh·Þþ{]{ÜoÑçñvIiÜ֘Xk~î‡ÝbÄ¿]ìÖê)•Ût mN [Ç^<éZn¥a¢”y¼_ÊmTn<Êú1oE7‹=æÝ÷¥Ô±™w×zŽ¡¡/¬J zâ…ž‹º•ÀåaüoÅRÔ¦gÓÐùzÛCÔp„÷-@ç†gBݏáOpÀ_ ñK,7I,_LF«Qž°[Z®]NIÂ9a´ªh Ýà·#Ó t˜p7ÓúdÎ"‘ðÂuò:ÖåN€BŠJ fê^{•Q5-ƒŒlaéåm*ctf|‹™n«¬M–j–ãÂ% ò]lPY Ìs5¸½7eó¨’Ìåmªð¸Lzmf‹?«£µAŽuµP1•dÒáªTá WyQcô²A§B⾖O ¯Š Õá9`(1ÃZY>ç&ÉýÂ!À¿éHœ¬„ûdm ¦>¡íAa“ÁŽ…Sä +>Çã Sñ‰]µSˆîybò–`ŠÛÆ*Ì5èfäâꯅ¬„Þøi€MÀVöiji8jªô5¾¦=P§«á`&2#%‚? O¢¹±L1B;g ¥„ò0ßuàE‡‡ &ÖPPz}‹Ð’Qý˜'Ž{ŠìŠpÙE’¹ >ˆÄáCG­5E‡ðä:rùRÖ@ÀÙètv­ »Fx¿åÑLåÕI–µp,™ËÙRìj»xzz(-Ûò˜¯ø…n¨¡mÒ½óíüÒ½ë8žÒ$º§(?[žÊ]0 3`¯ÉZ3 ™xl˜]͒4Â%Ì$™à0Gžg“Û?ZL7"·í- ¸…ۍé †ò¡hªBå:ɎƒšBjKaéÀ.'VV¢îl?]1×ƺ‹B"X³¯"®©Ú fÒìP HEŒˆÁ3èvV¡Ö[žé”®æù¢ã>Ô²x£†Ò\CHÀŸxW8€Î8'H[ýëÈ]fxP]A®Xg#üZ ·Nžýʖô#Ž±?cÐ⹯Á`ðO9°öÓÄó®×CŸ®¼k’O(Ì +éƒJ‚þ¶ïWfªÆڊ0»ø¡ê9ѹù +†øFpûÓÄÓ¦×#Ÿo|Vç®è«Ù;HÐûùDëUȍUÝTk„•"ÿ2ݐd‹'Íq—ÑŠTb±ƒ]½ PØн~¸"±ŒfڃÄùä ò×xøP’Lٙ9Ç®l“i·³@ ‚"¾Š]Á u°ž`½bΠz¦°xõäÍsGBÃ*|`¡hˆ2âF‘\·»4_«ðÀ­&t¢³“_w¶éwR´I J”LzÄ´8H®K=φñgK^ U +4ˆ=¶æ¨¬Ø=ºmÍ€âËå¬8“T6—;4§8t:Ì )Ѕ4|là×ÁLH&u±¢&KÅÈá |oÌÕN;(„‚}DòdR‘Zœ%ÛèAòË«7¶–µˆ°ˆö°2à=ët?%?XÎb¯Ë<%­9¶÷M8dãDä¸@M×;YnP´h[푠W?¥÷Ó\xr˜Àó,»Ÿy°p5òîåAY Eo²H'fe´•ìº« jHiŠKÆ]7ø”ßTë&8çÉ{Y–)l.Ò?ܳ#˜=;¹êª&;“ SÈN(l¸jˆÈLu›L?l'Úopc$l¤Ñäó)w±ñ$±$ߺ±µ=àÆÇÎOäšûb;WÙ=YWò ÔUÆ#ÒmÌDd°ƒÛÅa¢íAÌԐœÖõ[zò„'á!5³¡l¬›z­‚œœ¶GdÃÖ“ÃË`ï°e0!¢ÜWr­ )¥Øá2ȶS E+؃¥ÁèfDÓ*:`×و\‡£0[ ò{¼$Ø­öäûH$I($òÿ²_åHrÜ@Ðç+øQ…û= EÈ ýßP@OïÌR·)gµèF…¬Ì,l¡å€ ðºÖ–û`sp'wŒø,³Á0ó.XhÚ~YuÕpN,‘.¸€}°§©N0ë‚&ÞEV ÄÀhàM®™ì‹Žå¾†Øg†ÝÃâ•.tþª•,Ë[Kîh'ψn³oÄ–Ø=û]ê=1ÁE¦Þ3ëÉ?­Tý$¡9gaiEVC«$S$5ÉFÌ»\ʲãd +ì–ð(`ÈÎDvµf~PÄ«¬XË´æ³Ò¦±ûÄð¹’ës/½Õk†-dVeâ?m~uφkB8ϻեû.‘¸å‡DÝø-Z‘n½„Y[}F{.B¾¹ò@_‹²ág Jóê3! ´ºT¢, xÌ#Üø™ÀŠ`M_$o¬s"1 Å2_\éGâåFAåÓW˜ûÜáw†eiA¤ ¡[›—ð:bzm­Zޛ“°Œ›‚Dþö3º]4X¿÷¡!†K½YIÜøBN5ŠjóÁk›M­–Ã* õi ò܉‚]Ûە=ä~q ´bM~þ×/ULû¨ò¨UÀ g?ƒPçƒöÓ!Ð7]OÚV)ÌÚ VU‘ü°dµV¸€úÕ÷¶EMãoJé,;ü~Š½1¦é­ÏzµN°T=™ß¾æ­¤@5©‚]y/£Ž{I¾¹§P-Q·yþ`,‰¸“ªQ÷X{J§,(^e—‰ÌT}nU)ÈFñLâ™P]’J®hÓ+Bö +< +IÜtÌñ·‚RkæVèÓuÏB¥²“1nÁtW–Í#ïðxÈB:©Ìõ_ùÚ͆x¿j5³ÉÃþ&©Az?ÁùìÊ¿zŸŸš¸Ÿ9(}ìRtgOF ìƒV¡V1 %5©‘#Rö~–ɦK¢ +Šh¾n¶Yj'ÙqEѕ@©ø¸üô°µ(ü–µ¶v(0ð’’Ë —jٝ¦[ì.o‡Å·ó‹ž4-ÑAb§ÁVJWÆfvG<ïÑû;1ãÒͨK©»Ë%²\IKl^¬ɭj–º“µKÓÂSô¨|5MU•üœâ·:7Ýñ ¡ao&ºë™b¾ÊÒìùďíñ©ˆ+ÂñÑ'É~ó˜¨È.؂~cÊí=1‘b©!âß\‹œ9˜Zt¤)©+£Ö‰ÅuS.”Äö²lÏÌXÃ/ØPž•Îeó`Z_ß±·Nÿ1Mt-¿îzOØ%œ¿Ð]Lx]jšSVÙÚ*ÀåÖ÷X@hkG¤ªÊÇòaa¼‡›‚Ÿj—Eî;µÏ˜õ¤»RüäðUÐ£U8­Ó–le__9ú®˜'!Õª+˜Eµu†ª¬ÑNˆ ‰)ó‰C&ûÌì ;ÑzÉiq‹B Ö­‹ÚV;î,‰É\Lo˜2ØòÞ¼ú9<¥ÇZW'PUeêÚà†Æ äBR?!ÐXånk—áó‡’1ô°&»¼E‰#ÌD*ìœB۝¦H†‡áïmى`.´¹7ËÆõè¬(2WmÜâŠSé« eGEÎxÕ]Y•÷îïò±åe¼E܇øYE_höi¯1Ì·ŽqbîHvt(¡‹ÙhÎ]›‚ÙÝyi,çÒé9|O—d‹(oÓ~ìgÛýìø«~¶ü¹ŸÍ/~6>ó³§Ýý×~¶¾ûÙòÑϖÏüìøS?+VoùØÙ.;»^ìlØÎÎÿíìegãïÚٌ»Üu~ù¾ó)qó‡Ìvk·Ø:ÌmùiŠqVÊÊj>B&àóI÷ÐÒ8f•;žÎÈÉ×yI•oÙV½d?9õ¢j¡¨6ø3Ë-jæ!ÇÉäÁní6䤽óŽ]ˆ*ÑÕ2E¤æ&ÝøF"ë„9ˆÍ{ ruÒXpw¤o'žhÏò%•ô ~-n‚¶{¨sœÈpžqb$vÈ#GS×4ÕLe0˦ªÛRÑeäàˆábd½jb_À¼_Ñ»• 6bP¹\H[åwr‡ +Ñæ/Æ-˜iCW1¥J·;bÁ¥g%ïׁ á´59óšÌMÓ"­]+§Þ¿¾|ö¾¥³Ï'ß4Èɬqôpk§Üü‹t68øÌoþ@Ê¿W ùQú‹]Þ‚3ßãÿL€âE€úÐüËô;éՎAÃúœ"GÌÇÔy)s“ÍýÛXæm’*/ՌfÆÈÒüހêŸÐoø܀Æsjÿn@ öú¯xPÂóÇù6ÚµJ1mˆÃý¿È_‚0Àԕö®’^ŽÎ¬QF‚ýþ²öÔXS»‘™}怲š:^yu@û•ý7x~ry êjŒ:úeÓC̖„r±,é n¢Št;b·òð–­‹™ISªÑÃzÒ®¼cf×p£yÉW:×uaS‰;nl~ù.~C–„Âœm¦Æ #èÌq`ìµAûµ.:ƒæèºnr&ÈÛÏwŸŒ_UüƒÉ Ùeûš °âRFBÚ4Ä ¡2WýŠÀjå-ÚLNQÆR®Ø/4.Øu± ã¶_X˜Æؼ±h »®-7³3½wUC×@Ësëág]‡ŠóCPÃn£ܺ–ƒ„áh"ª½=,Æƞݹ +ZÎ弈3,!‡zI”ñk2 Ì YpÝKÜÞψƒ•0Jc±ÿ†ãIñĽD^0 + „öIæ +§Šlyþ;Ñ]ÚÁšçŒ;K¸KSzß?Þ^ãñ%ÀcŽ²y endstream endobj 263 0 obj <> endobj 264 0 obj <>stream +8;Z]"9+$2'$jG89jo-(^F[QdX6Pn-t8E:5ikb^`Z'rVZ%j@UF/k=):,$ESLOfH=NT"G[2 +cI((Od%e<hf`GQg6bbpG3Zc%^e.Wo8BCoGWXe0i"%]@OR%k/\o*$5- +:uqZ%J,.tA**8Gi~> endstream endobj 15 0 obj [14 0 R] endobj 383 0 obj <> endobj xref +0 384 +0000000000 65535 f +0000000016 00000 n +0000000147 00000 n +0000054979 00000 n +0000000000 00000 f +0001893029 00000 n +0001893426 00000 n +0001893843 00000 n +0001894431 00000 n +0001895199 00000 n +0000055229 00000 n +0000055970 00000 n +0000056399 00000 n +0000056883 00000 n +0000059489 00000 n +0002099533 00000 n +0000055039 00000 n +0000055128 00000 n +0000057650 00000 n +0000058057 00000 n +0001782405 00000 n +0001843685 00000 n +0000060089 00000 n +0000059793 00000 n +0000059680 00000 n +0001751833 00000 n +0001751946 00000 n +0001892915 00000 n +0001844783 00000 n +0001845950 00000 n +0001846912 00000 n +0001848360 00000 n +0001849341 00000 n +0001860363 00000 n +0001861523 00000 n +0001862488 00000 n +0001863908 00000 n +0001864864 00000 n +0001866025 00000 n +0001866992 00000 n +0001868413 00000 n +0001869853 00000 n +0001870810 00000 n +0001872938 00000 n +0001874679 00000 n +0001877329 00000 n +0001879048 00000 n +0001880010 00000 n +0001881163 00000 n +0001882132 00000 n +0001883547 00000 n +0001884489 00000 n +0001885676 00000 n +0001843751 00000 n +0001752069 00000 n +0001781251 00000 n +0001782089 00000 n +0001781317 00000 n +0001694362 00000 n +0001746163 00000 n +0001747064 00000 n +0001748228 00000 n +0001749196 00000 n +0001750621 00000 n +0001746229 00000 n +0001620775 00000 n +0001677361 00000 n +0001678497 00000 n +0001678832 00000 n +0001678948 00000 n +0001679064 00000 n +0001679180 00000 n +0001679296 00000 n +0001679412 00000 n +0001679528 00000 n +0001679644 00000 n +0001679760 00000 n +0001679876 00000 n +0001679992 00000 n +0001680108 00000 n +0001680224 00000 n +0001680340 00000 n +0001680456 00000 n +0001680572 00000 n +0001680688 00000 n +0001680804 00000 n +0001680920 00000 n +0001681036 00000 n +0001681152 00000 n +0001681268 00000 n +0001681384 00000 n +0001681500 00000 n +0001681616 00000 n +0001681732 00000 n +0001681848 00000 n +0001681964 00000 n +0001678353 00000 n +0001677427 00000 n +0001531623 00000 n +0001619971 00000 n +0001620037 00000 n +0000058465 00000 n +0000058607 00000 n +0000058674 00000 n +0000058925 00000 n +0000058975 00000 n +0000059562 00000 n +0000059594 00000 n +0000059970 00000 n +0000060164 00000 n +0000060909 00000 n +0000063115 00000 n +0000128704 00000 n +0000194293 00000 n +0000259882 00000 n +0000325471 00000 n +0000391060 00000 n +0000456649 00000 n +0000522238 00000 n +0000587827 00000 n +0000653416 00000 n +0000719005 00000 n +0000784594 00000 n +0000850183 00000 n +0000915772 00000 n +0000981361 00000 n +0001046950 00000 n +0001072500 00000 n +0001138089 00000 n +0001203678 00000 n +0001269267 00000 n +0001334856 00000 n +0001400445 00000 n +0001466034 00000 n +0001678660 00000 n +0001678757 00000 n +0001693934 00000 n +0001693507 00000 n +0001693080 00000 n +0001692653 00000 n +0001692226 00000 n +0001691799 00000 n +0001691372 00000 n +0001690945 00000 n +0001690518 00000 n +0001690091 00000 n +0001689666 00000 n +0001689237 00000 n +0001688810 00000 n +0001688383 00000 n +0001687956 00000 n +0001687529 00000 n +0001687103 00000 n +0001686676 00000 n +0001686249 00000 n +0001685823 00000 n +0001685397 00000 n +0001684968 00000 n +0001684541 00000 n +0001684112 00000 n +0001683683 00000 n +0001683255 00000 n +0001682828 00000 n +0001682080 00000 n +0001682135 00000 n +0001682429 00000 n +0001682507 00000 n +0001682656 00000 n +0001682753 00000 n +0001682883 00000 n +0001683177 00000 n +0001683310 00000 n +0001683605 00000 n +0001683738 00000 n +0001684034 00000 n +0001684167 00000 n +0001684463 00000 n +0001684596 00000 n +0001684890 00000 n +0001685023 00000 n +0001685319 00000 n +0001685452 00000 n +0001685745 00000 n +0001685878 00000 n +0001686171 00000 n +0001686304 00000 n +0001686598 00000 n +0001686731 00000 n +0001687025 00000 n +0001687158 00000 n +0001687451 00000 n +0001687584 00000 n +0001687878 00000 n +0001688011 00000 n +0001688305 00000 n +0001688438 00000 n +0001688732 00000 n +0001688865 00000 n +0001689159 00000 n +0001689292 00000 n +0001689588 00000 n +0001689721 00000 n +0001690013 00000 n +0001690146 00000 n +0001690440 00000 n +0001690573 00000 n +0001690867 00000 n +0001691000 00000 n +0001691294 00000 n +0001691427 00000 n +0001691721 00000 n +0001691854 00000 n +0001692148 00000 n +0001692281 00000 n +0001692575 00000 n +0001692708 00000 n +0001693002 00000 n +0001693135 00000 n +0001693429 00000 n +0001693562 00000 n +0001693856 00000 n +0001693989 00000 n +0001694284 00000 n +0001751769 00000 n +0001751705 00000 n +0001751641 00000 n +0001751577 00000 n +0001782233 00000 n +0001782330 00000 n +0001892851 00000 n +0001892787 00000 n +0001892723 00000 n +0001892659 00000 n +0001887950 00000 n +0001888014 00000 n +0001889146 00000 n +0001890082 00000 n +0001891478 00000 n +0001887886 00000 n +0001887822 00000 n +0001887758 00000 n +0001887694 00000 n +0001887630 00000 n +0001887566 00000 n +0001887502 00000 n +0001887438 00000 n +0001887374 00000 n +0001887310 00000 n +0001887246 00000 n +0001887182 00000 n +0001887118 00000 n +0001887054 00000 n +0001886990 00000 n +0001886926 00000 n +0001886862 00000 n +0001886798 00000 n +0001886734 00000 n +0001886670 00000 n +0001892595 00000 n +0001892531 00000 n +0001892467 00000 n +0001892403 00000 n +0002093053 00000 n +0002099103 00000 n +0002099170 00000 n +0002071508 00000 n +0002092588 00000 n +0002092655 00000 n +0002027586 00000 n +0002056444 00000 n +0002057346 00000 n +0002058508 00000 n +0002059495 00000 n +0002060883 00000 n +0002061812 00000 n +0002063257 00000 n +0002064221 00000 n +0002065373 00000 n +0002066319 00000 n +0002067712 00000 n +0002068643 00000 n +0002069793 00000 n +0002056511 00000 n +0001949152 00000 n +0001991773 00000 n +0001992823 00000 n +0001993997 00000 n +0001994966 00000 n +0001996412 00000 n +0001997395 00000 n +0001998550 00000 n +0001999511 00000 n +0002000930 00000 n +0002001882 00000 n +0002003038 00000 n +0002003998 00000 n +0002005416 00000 n +0002006368 00000 n +0002007810 00000 n +0002009256 00000 n +0002010411 00000 n +0002011375 00000 n +0002012792 00000 n +0002013745 00000 n +0002014707 00000 n +0002015856 00000 n +0002016818 00000 n +0002018231 00000 n +0002019184 00000 n +0002020368 00000 n +0001991840 00000 n +0001895787 00000 n +0001933837 00000 n +0001934801 00000 n +0001935964 00000 n +0001936929 00000 n +0001938354 00000 n +0001939311 00000 n +0001940730 00000 n +0001941696 00000 n +0001942858 00000 n +0001943839 00000 n +0001945287 00000 n +0001946249 00000 n +0001947412 00000 n +0001933904 00000 n +0001949088 00000 n +0001949024 00000 n +0001948960 00000 n +0001948896 00000 n +0001948832 00000 n +0001948768 00000 n +0001948704 00000 n +0001948640 00000 n +0001948576 00000 n +0001948512 00000 n +0001948448 00000 n +0001948384 00000 n +0002027522 00000 n +0002027458 00000 n +0002027394 00000 n +0002027330 00000 n +0002027266 00000 n +0002027202 00000 n +0002027138 00000 n +0002027074 00000 n +0002027010 00000 n +0002026946 00000 n +0002026882 00000 n +0002026818 00000 n +0002026754 00000 n +0002022061 00000 n +0002022125 00000 n +0002023253 00000 n +0002024183 00000 n +0002025573 00000 n +0002021997 00000 n +0002021933 00000 n +0002021869 00000 n +0002021805 00000 n +0002021741 00000 n +0002021677 00000 n +0002021613 00000 n +0002021549 00000 n +0002021485 00000 n +0002021421 00000 n +0002021357 00000 n +0002026690 00000 n +0002026626 00000 n +0002026562 00000 n +0002026498 00000 n +0002071444 00000 n +0002071380 00000 n +0002071316 00000 n +0002071252 00000 n +0002071188 00000 n +0002071124 00000 n +0002071060 00000 n +0002070996 00000 n +0002070932 00000 n +0002070868 00000 n +0002070804 00000 n +0002070740 00000 n +0002099558 00000 n +trailer <<96DE4D4299E949DF99E050CE9C41EB9F>]>> startxref 2099756 %%EOF \ No newline at end of file diff --git a/logo/images/logo_abbreviation_black.png b/logo/images/logo_abbreviation_black.png new file mode 100644 index 0000000000000000000000000000000000000000..42ee3101a1093f30af60ab89b8e116a975d34235 GIT binary patch literal 71289 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

PVAPHC~fC6;Q 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 L!PVT$wvYcWV`A6d literal 0 HcmV?d00001 diff --git a/logo/images/logo_abbreviation_black.svg b/logo/images/logo_abbreviation_black.svg new file mode 100644 index 0000000..13ad1bc --- /dev/null +++ b/logo/images/logo_abbreviation_black.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logo/images/logo_abbreviation_samsungblue.png b/logo/images/logo_abbreviation_samsungblue.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4071401a48429d1c867362edb1f9d15a33fc10 GIT binary patch literal 71888 zcmeEuX*iVa8}|@Gh{(Q#vQ&22mq=tAB1E>xR#6yB_C#c@RF*M_nCxWVmoUn1Y>g$6 zW$dzMeXo0ZI{x3@5AWBvIgaOe=6L45&ilO1<#+zh^SV4Q^x+!Rl&q967>ru;hMEBk zMj;RWQ6MJ+|3zx6$^!h0;_(ercNk2V7y5_DJ5$*c20I7SR8zU-oxFrop@W^HY7}j3 znCl{|)4sepDlc&oEFyd+z4W;Meot#$BKiCMd;;q4*C3J-`oG^_T6+@z{eGqs{`c$E z;BORvzuyp*C;I!H!k+){*KHg#zr~VBz0j;lEh;e;h1a z_Vs$nQ1MO3dbcCL^D~E&qo?&JVlVroP>zH^()T8`pNL7ZCs6nsiP=x&cS zX?^BTL^`6eE#V#F!(8?Pam^Y1!27rp6LMh6c#gFAe+_={$p74<^1rP8aPEI#Zb19L z8ZQ|BKkCQO^1qIN(&m4S;y>{)SkOP?fS~^uIlu@v{-xDF%pp{Of1m)F;U6gc0|i1l z{39Ze8UBF+WQG5qK*6CwU-|D{fPXpgf6al=N8^0pfj#}fuDgOWMH~4m(u*@?pFtA? zgH2Y||K45C_zW&TOb%WjL$JqsrS9%YXTIq$_^Ne4xHZv;CbTQwMn>c8Zw=tuf~!_* z9)((h4#=%v{T75P5!Ufg0~BO(bFfQ=?c!U50H4spVRbzWcw%Dw&lB2EThys;Bpr#G z!@383M)LEf=#p^hg8_nG+i8d0PS-uqTZQGpDc$6Tb z=mOMD8Q>`5Q}+D0?iw)G5Dm`QrZ%XbJNq6x!`ZW^jNEc7Ll;s*`?|^l^-|Wia;jyQ zbWCvY+c+|v<<#$$w!W^ziJWEBX$7{y1IzYxW2nnpVUOVfzX6i)%ba;}3bWTt?12+I-I|IRX8YAQlJO!JwX; z1$#De4i8S_Zm|#v?4J&Cw&Nby#-xbR_!60}2HzDi)$fmnIvz+vS7cz;0Xo1UL5VmD zBx7qS-!B=#%;ah-=oi=qFZ2t`$A#H6dPxdodp9e%S_58^cm{N#jU+}MC2Ufr*D-Hu zJ){Y?oy8+#xs}&)G)5ER zCxHuUgQLt_bR)YzYso<`fmy$UdRkF&R2hQrk9ZgY3L$Hfoa%4Sbum+X-tT-dgxC^Q z{_c0M+vj`|7L?*)jOD;!R>z*z)!=@U#mfh}OeZd4gl$SJSB@%t&#sT!#%Kwiln-p! z|6b45@pKhyUw2?%-9rPtGKdhPY5a6W?3n3j_v8Dc-gqg_<2}C;%ZZgA`&o21$M2f2 z8m2l#Ww=N!&h(KN5KJGGVrmPv;cEcmmfuCZ4*z?F=k@~J3G=Pu<(R(F|1TOop`i4fB1c_ z25Rpz$X^;JG=$4VqRvoI?rPD=pl<8!h?t;W;$thFN-UGwCFqRC^Rxt4PkKw4fGA#% zI{vdQicf9ei)C64a>b`w_9T2%P8IjH5>4oOCOAD}`T&r^a_E9_N)7VngQ% z>cXH{IN*4gtTwr6-|XNvXnM^{@Zr>zC0XzL*U;E5pDMQ!$XhTdzeMiJ`<3+*s(5!gaWB@#HDOma>eJeT4T11rnaU1fEr!98d~K9&vA2Y|+h<>Z{rPEhmy$ z8yLEJ_@0^$AX=ULAC2DuEDAFHxM1IBYFH6#bmv;-w--n??kLrRTGU&EiMmN2oKd6$ z-z$P2*O(!l6I*67k%t_SO{9D@_?kWb_1q} zX%yT~st%L7|LI*!cK9y7XanI=S3nTBdj|3`A2&|~HauCpFuMjv1_z1cLo!UTJWQ1J zdo}RaJ>$VHPu+2}@xAD8o>#`D9)C*uW5P)aXnp?+LHKApUbh+j*ig$fae|O6ur)g< zu|5Ew@)!>uCM*>wBC@0{68`=w4y{zr&p|#j`06S+bNL$sIt)IB5DQ);Xa>8X2VB`G z(3(??y=}B(@wx`V^c4Hm=TFiG4f8|0yLF}@hhFB-^P6gf=WltqpLvBHCGk?5{G)~_ z!OzdK0l1XptaP=nwp?SArbs5(2=*L8o-{AuFHauys=D7vPMctCt9@N9a}z)p=+l`5 zIcP%dC&F0kiSjSQW7?W1k)FcVxc)9Jx&~=9aXvhm zQ|>7i1nfzI#2`Ir)!G8^jBsXhjEvhJ5ZOvzK>Fub2MF}m?t@=nXu=<fgyu*XEjX6wn=4Uz*|K-K~V&?l^Lbf|S6#ZSknixCw&4aifvHZjJl9AHYYq9+aY?&pPSYt_xLo@P47p75Cjr@ki5hiU z8Bzvs@VxzQ`#Nsq?mf@utWYQ2rEi1XBm%1hn1CHTgCyGn$q}0HRrR&bz*tQo&-W5_H_!Y_fG+yDSxpxx#Aj&yj1+eH6)g>AcTs zx+!b5v8e>LXRm{eik>hUPX>(XWJ>=AZLv{J!OFy9L11xp5u0=(uH}}w#}r!I>koEU zL$c`^T|4eizEI>rKSfMswcZ$FRJA%X^RF-!5lJQ_X(OSG@_o!fehyE5PGznJSBxw} zfO@*i6!+)7e31V{xk2`|R9B~-^fTr`r>G5hjwMdq6XHC?)N!Pjpfw6}bG zEKqn|j4?L4c`!v}sy(Ej$-<+V-|&wb>gqs^m$!|i9ZnSH(aSEY=-_ei$DqD?Ab2xJ zy&smTXnQ5~9FFkBhfmOW9r^VAJ~*eEEp&HmareOjsOz=6NrfZ7tCW1Ej>cLZxb7e7 zBoKVy9RhrI?tP96qga>IN7^iE4Y;o26OQ7P0yde%r40oyI-zlm^9G)(Sr3}ptyY=r z_`~HQlq+H@PFPy1j!h8uQi@2}PNToR93XjN!IewSFyZLzc_R-j8GNpgR^*6vwZ?LT zAZ+O@h`y_wM&qSem2R@6J$I&thgMI%)SBnPuY#Y$ewx#8%AlMlg1kk$Jlui9VHXWyWGg{?CA+JPWO$FUTi@(oXL zVw1Eum6XMs^~U4G$LoIV_q%3$Iky>t%B;M&y$RNug+sw$19XW?4&a=p40JLPr7)-; z>ogg#c#$*`;iNxGp|8QG;(w(HfC^x2zR(NlAWD-ZOD#q*e@$=(0hor5vmao7aC-(B zXY>^d&vd>*7NtvBD2`=?Svk^$3%Ig$4IWiUfOP?6O5QW{PvIw%W)bwSu$jXx8%7@P zV~JCegD#@D_b}Zb%5GHsK#j~(2j|yWxDV=Z`^EbdgfXc zXEhwn{}yo2^)2RHhKb7K))a-xL5I~m1h4y zGaXksP`1Af54=DoM6WHR|dkXoX^=Ra+t1?NEEWaR(j82t)a*Mb)vE zF#rUfq%$=XoR}_P6xJpW=pC?4D2aMAa$LH#1eJIEW{rpZo7J*p#yzI^3~MGSK#qH5 zDQ$5iuYf{!&~`{5>a$SE?tKP$I@`V*A9laHtUe9%}mm)dj;acdF{}cHw zJf>xC2l$|t{qO4_=qPdk(W0U&--oXO4b||rubJu2BY?z^4QvQzJlAM!M|HD_z+Zre5`?B0Xb04XsHzCHHa{3gn)~Z6QR9yt%$T*RxF~ zhv*6T*h9#=_7%XkNan%7bXB=)=L^xo$6Q{*t)w3nYB<-rzZ%j^5(9ErP2Xm!S5@QebGvVpB%9 zT@tO_b0`WDolXPpwT_cvlF_}R=C$nG#FH|=J?$YlqoicneK_aYj7#14PUh!Ra@q=d zZP4%HHX7I@X->71EiwyTBGH9kZO7-m`4vDCzmX6|e%cth)nEGdMdaXHjFsr%9G|g; z*|lx{SC0nDew9q`nD!q8h{am$!DCYf{UN|AV|LjVt=dd$7$ z7ZmBq`=$;|g>R1+e>mN?B4j0jicV6{eJ{nDPi#L{mj-3UGfs|2-~lf>RsFH7g$bR^ z3rhQomdIhnyaLG|PCPc0laGA;q*MXZ26(p(C3P(5vMZ@Ae9SaAJ3#s(NBzTJ{*>hO z&kxv34kI7y)^SbGL2j3=+3KBirEkI>E}d4Y0%5?k`2DW$NN z%1NADbKB|)rZ?Na+gWFGGpH+PoS`tbZu{0$)3-`)HE?obegXRz&4+ zZ@sd=2!h~(-8iVdbkx-tLLDYN9tQ3r7rV5FP@3Fij$1?(xub# z->dvZWVj|h_Gp_>csTv~+tnvt>qiKs9d|+!%tPe);P)wf203bC<+lPZ;RnKnUd|>T zdtdDpc9o9KJa*E|+iu)d!6J}oSDD?Vw)tRp*8^X{_kdg4yg_V;j4@qtiH zpcVMULJ&~G)DU91RRmw=%aZNlD|!*0htm4x0wR@m_|vB>;X-(O>7h5ndjF4bo9aSW zz=2Nh?98y>y3ZGHdyE|+d*K_^TYnm#wI=|?t%pF^^M5=T`^<8HD-ciW@X6V=3-B#p z)p#uHg=+ueQ}im*x zL!33}q@7Rj(ZnE;6tq#1c5!=iXQpr>a8usu9ToYdVX!cz+0X}no@(29}Sy5p5j z?fZl=8*GgU0EVb3ot(us?fuK33;#{k?Kc0`13ZY&`!K3Bq4Vp-tQg+$4B-X!&q1aq ze8_RZWlJ*o#z=AEMDHy;ScKTU6Z~4f5WQ^Or|@CiNBr$ENv$}m&_7IF1RDJD@f+t` zEXj6Pz36rNM1R``*OT++mrI&3%qjf)1joY2Shz!o8MsHeb4ATN+OB-L#HR{A(x)N1t_81>dvk? zr;YRY7K0T)*V4Fqxb}JUQ{f-+ZS!_0A{Iwpb*e$`S#E){d9Pb&c6g%B3bN zy^O5t^Bq;AuX>YAT5hXFUv(t;%Ko&MoH)8sl=zy6?{hkasI;`i{2tlhy`f_1g3G4L zSChkK=++e;6q^rMTogYNKZCFR?XpXD7sSc{&(f=4_#-)mm>P09UGZ>3ktBxKvTPr_ z@I2~6CLxtg5^%4u23AFwwo#yP7VG_vG)rHRfA5Jr|QkV8}3qXOKBq6+=8$c;+RuZyKB^ zmmP0yuU<^C@?zk*>V8Jq|77o8d9*0joYxvwvN38%>@&$}~;h7v5Jj9hPJN(G{c5;}YUeG5BVDIaA?sky5ku+wGlPF;W89P-K^fO2Ig-Z`NXr1B1 ziglK*Jm%$5sr6>1Zr%?cRZIRizGIe$7Li+=1e1`#FSiO1rIe^G=E_75q#@)~l?OT* z3oAB~<5k;y1O=_Npj|b2up{7(EJBc+mQcQo(Wp9&iH1!?Bc!i-26lYq5`uv zCcK7RPEohVc9AnDM=oW0zC@-+aI(y#am6n(=udcy-hp!ToE(*$v+X8s{u%s4RQ~>( zW+m|2iWJL2a$X8qivNa#B_@z%ug%NMBW@X7x*3(K{XR1T73gnaH2CN{uE(cu32m*d zXS-;C#D1}_t6uq07D21>iNVc`k=@NF+;>u^@ejC9o<81K4LlyrhQWL!!qN;SNjU(d z_-4!%r037|@a6dQv1>%?aoH{kr&By&bcWNpnYHP0&Fxf`%M+o$MV}#%6xc2&WOix8 z({h86_TSP49ocvnU!P9&T7FO%k4qNz_0H#M*^(8K{J9z5`zLu|ffoQz-L(0tf@U`I zn!vVKvAY;-3`F6Q;XFTY;VP@cDj#)6Xa5=6dM7o=>cOrK1H+78m+yP2f@b*e`^m@Q zz^8*CaXRV;iO;gTRYwG2ADWdB+zNApQcG^owHNQ$?wS6I6h(IW`BtW-Bu4B^(TA6D zjDOq`L2Zhr&#eZk=O5_)9~k<+~#5wEON#TZ}?~^5#8+Q>Gp=6Zzq3hU`|Fw*B=# z!C=PhUB#W>YVISSUiN;|B}wKRPrKqE#sUz;qM?6)n#Ta(!G*SImMeB9rCLUsL6YS7_N24NkdIAFbI zBsZ%a=`ZrlGr%K8A{(@RAnjD<1d-&$A6{ZdpL*G`?Yl~~ZYThCzr_w^V)U^$4@w5I z%FZaHAR9tR7Oxw&`uo?=Klh*5wqz*!NkOC6zvE60 z+3=BOgN))WBM*hvo43TytUsI#ihOB^@l@~OSPnskBz@gs4z3QMQek;PU=>$Wq1a-2 zk=E>S@<#~6l&pa0{F|7at?Rp?z!v9G zf+e{CBUtFF10=&?QFOjES{*&b_$9-6ewf&E2As*E7>c+|LA0I^hF^=$)83gdXcvt2 zZdiJbBtg#N?a`zcNz+#50#pfGaa?`W%?(>4wuoZBBsG64K{M19*nkUzkm(g>HW@Yu z;fnPP*1cw-{nedWc{Nvg@Zbd0L$M>rPM%&5Q=a zo?2SA<3pQ%ZD9Z21pozx!-LlEUiJ3WobDE;uGF7Oi9(q`Al7cRjS#`~j75?F-s{dv zNF}MGefr+4MPiSm6_e?CySq=aJ8$1?$Kykg^RL$aK;m}@CKNR59N{@RdsWX$wm=qC zbAC4Z$kcThM1;CmV_F!%ytZ}cMQakgbq0!)rm)PO! zw98^+Z;pQF4EWm(tr*M;2J4yqnX%e0JQ7xbtqIW~7Sf+M-BLk6R(w2ycWWFDctzfq zOpTZ@5VetgH(ONS>MIX`AS%oDyd|b5%%|_6SFm1&uN0vOuem{hZ*pCKruNypcrh~6 z>-Wf~>SbwM&hYpXr6h_imDOSswkUvXnx)dzvajiIK4-bVR)C_3tj19&vv?6gP4q5g zSSuruq){4HD`BYejdbt9KM(3p*QvWt@SOJoz5=wwhfT=9p_%6RrbyB>iq3-=-q~cN zP$&{z_-EV#VfbVu@a#m>yqF3)et(~taXF(4?-!)sWfYZ1|8RFT2)o|6vpkY{Gd%U= z+=~3eC-QsE4f2nv?^H!P^jFcIhYZ{(31L?tc*(%m4epJ^DqNlk##Vkblmw*&3gt{t z;jslo+pf3ctLKJ=V(2`+zfEdznQlPT(Axm8*~vUP%cH;Rs2q?(e*KVExr*&~R`W-B zNOTYdEr9hS5Q+x3r{+2xE|40;w3Szm^;LNnO!ZiVJnZ(Rx&2`hYMSI0*RMnZzI{k8 zgCdtX{MNk5?B`1*Hr{<@0h{yln{I-= z?)q+69q_8@TiA^bOEo0c{KREtHD9dTb800oG1V1Mhvcz`pLLvpN&6IG?985Yk8uf#LZ$}FwhaTz@8GuMFX zj*Ke&5vV%_%g>VvFrt<&_ifB4Z0QI3bX4{6Ebffadc+8V%+NDHCg-zD!-;onNKlpq z^HO=_YuffLKJEHf`zJvm(9=pef& z7P3LhjW#XKYN@MODi*pV{e#c)veGkydAxT^m)@vjt-Sj&p~`G(fL_{OK=tx);x)$X zrg=vlA*Nusm2~4swO+QM-GY!HFPBk8^jur!WBRIPNo9^$NtpN9_x!vogiXrvK_&zI zlEK(JZoS=*+{UUGuLm^}pE8`igxlCsb|mfZ1HuKBy z9owN>-zA8<5BFgwP5AtFn@{VEt~)iBf7m44vB^xU4Xa_HMWze#|U zmrns<=v2E*``w=NW8x)`&3&S=^B0Xx`36SH}%m?tgYD_WlDaHH$o zb_^O{;8}032`ZlI;oZEa^9PMi0W@l)8i?c*%B%14{@`U~#1Wl|O8-2Yelyl~ak73l z2`Qr&cV~o4rQNB9{&BUibzqvid=uJEFGJR9fk#m}B!%Fx6v*Fv1+b#J?gHYwzgm%N&geT#WcC%+kx#j6Fcbt zv^pke1&v9x_8i(Ww763bi=(jFOkH4eTyj(a{wqAJH`JBg1iQb92UK(J?A(&3dwj+- zh;yk_@$EMIjrZt9;%x$Tvet*}%}qB@*`*LMhbayLtj~SoCVh`%cT)y=orR~uJ0}C% zci=ys5xRXLgst555Rmnz$5T~BOWcxsw@lW@w#*5Zve$+j|G`o+J`uB;2NLufbGLq& z3fjx|)W!g47lOqto_qE?W=;!6N2zNndUicoM$oZz2D6#B_UC@a z>xaboFgPXZ|mLPNPu5&p{VxYPSQA*i`KdFD5{0IAQG*OEWaF zJ>YZ(9N^RE;dyh=<7ad^%|C9w9zwrza^iGaCi!>@<1celR&ap~d~{GC7NWpo29Kxx z+cI`B%*22mRj*h_^?nS7(|O9TdNYh#kf0(?H~Q;FrD)CJA5U7)xdp$7=*5cL?(SZQ zDknfIpB^xh`en2G0bjgH2#~lbafT>$l*UXFA~%||&YoG%j0;7oBGRyqNL3%!)g7Tx z$2d7`B{3F6RfeMvtGM|S`uFI*=eG!zycrjRbhXonE0z|0b9Wp)#^^63=v$N-+ zc^C$i8QhO;`Lj=-Z4hZ_Q^+<&ojv2TH_t-AF`Z~=W4G!Y3nYZovh>@UnAIN)M)HN4 zOxRB>0U;LAYrc{TVmIi*WDqyy%0u06-a zU`V5_Ob<;zUhgDI%SWi^YABMTV%p^P1k~kIyu1VI=Xio`RN;+*FM6@2m}tN6;(Ns( z2m$#PQbsSt;waG-qYN089iE>MQ24n{WL>0nj{swUFQ6I=eoGNjXa;at)+-EJDLgZ- zFX(RT+&BDHUa1N??~6*4ggMLF6(~`}x6-S+MkvK1j5BD6EsdhKWSMXFW=9qc7xYP; zX{{p6EH8E=U(&B#CRL~@RUm9C<2=9+-q%l}Mx~mSu7^p2p2Es#(0R6X@@Dk?MecdY z2+zWv*1A`?WSW!SzmblFiRIH5;l|Z=2b&x|{l5stjd~632O1y&hJR&xqJA{bWbOi& z|7Bt;hlihXNKi-VyZe*cAXC{@(Dk2*PWSyh&knmspXw#pd*B&Vk~2e?WH1w=_~~sD z-5<$yI=;TZ!f-9+Up{>wu6{vwA~|#`(bH*$l>QvC`H2D(r{*}un7+q#4};qja?8Ix zp0cnM6~j9SMMsqNc+r5UQ6Sl#N)9ma=8riu)n6zlLi0@3aXg|N453?`-Co9`;EtD#y*bJ?+}4JEtQ+IpN6%N zlpFUdJzTQ+p-37%v2)NbE%wQUf%o)NJU~0~ltBNOCBN`@=$oWAkg0=yL!2o1di%7} zG|wESf7A(>L*Ho7V>Z-61+6@GJp=oQ!&$kel1o@Z3aQw7EhIV0otTWN;Z(Ab(N_7K zzu=J@^=XDnj0nSCyhocqyKW<}5cWEWcN=K!qxp1uME1o( zDccY!K~KW7FeRO-uf9uEOI?MwX1xcA(NEN6Ywt=s-qP@4#R?3Zh*UyeQVl2*vWbC4=02C6LitE+TNn!H;tX z&#nI6Se_^wV?B_+ADA@t#OK{_iLEsvWAst(4@tI#E=eEG?Vuah4mKeut5eZLXkg3wjC=KH7ZGB&&}3^KNzNYPnSkx$fVGLzL3HEbyMw;Dja(50>@p!qe8B^m^{*6K)b+MMGT& z$U4na&0&e#>6_~w+27{oqL8%!>rS#%#E*|XgBLfZ5W76`@ve%@$$7_my=|`Kv0=d+ zx7~;mS!zh?bEeg@4o>2bQE~-~m>;!}hhWn@z~d*rvL6Zh`&q2?>Y3db7pZN{iG1Zh z7#nmlg;B49nn$M# zn*L0gBQzl3vg{J?{J#c?-L%cIrXUpy z(U=b(pAkrax-O`6WCo!7&smeg<{oGKygmg$*f?y5McUNQ5c0YMJL0Qi!P)~Qm!VuN zr)3xu80H+oD>Z%T^@>OL5Kiaqc6=UA)Yaxwx(JErg{GpLd6tqLIXOu>g=U*F6=1)uou74(Y}Y2y zx$DlEv4RKO>UtjIKW!gcaC@o`2$3c;H`=b@&DX>VIWf38sN(r^aY52VsX;mJ&FIwC zkOuqsIItKmJ7Dy-UKDq?H+yqhDO}9Zg3MC#DZ{xGEBL>(XY2mFl$ zMqV2Z=_9ZaUeXXR_m!Vm^tiL~3)DuxcJ(!FUAOcS-E*K)K?}$DnyhD>LJO$Fanc#LnqD%kJ8opaP$ zrmGz0F7L^=$fK$kEH1*3>JcBRz*LZ4*RchKa}W!ZyquunyTT}$Xo*J~F#Q&zKRi-;{HI2J2ZH9E|HDP-~>jc34?28 zt^n6^Jl;G(e%qu)T$G!?a>4aD#h!|<`Sy6rjZ$rsH9V;Lw7llp6bcky3Bo!-b9*(+ zMq!{qysjClS8u)Rz*!(`Lco{GFI?IjwnI%H>vMjF;vARc7G>sdZB{l5hA&o1=Frs7 zb0?)Jgrx|i2nw!kR=>13L%6gU!~zaZf@lEr36XHxdxt{vQT?g1uL@ZrzbgTw0^81w z!Cj7UE?&4RCSUfJpp^^$uj8()9MH7ef)|?+Y|K63I})JU=sqE@TXxXR?(z7W_$Knz@5*2uZ1T z2JGVd$$+Tucb>o7@FE0G+Ep--y=qU#SQTp@UJfpPE#$R40K=YAt5pf-72qfi2b{5S zpXHYJY!~Abi+yrAP^Djw)~NG0GdXaCtOto`KkdRAe6G5tz3gUWWMNO~SF!FjOt58^ zHu&G>{;cR^K==rN)4w-j^S73Et8bTfjnle{0g@`Og7!0LcXBXCrO|KlUr`*-YHRRz z`NYe5>a>kH{$<3&Rs!n(>IE)gx!&=$LEL#A6ip8c+}4ZM@zJP!Y634wEPt!3@go(A zNXfPLhu8H~_-#YQ!yP)aZ+hs5I7{ZDSh{|H2f@~yuY9`ll%S}~(xil1V@>-@#U3{> zl@B>gc;m>R^w{W*Z0b}hW{gc#=)#dd3rxSfp-Kt%a?mL&+TtxUf)dU044$e*B^SEU z`6G3}?dI6W`j}^MLGs58x?H8S!%m6CvNVn&bxg`1cI<$sR8hxv^Pv%Sn_~>BzV9|= z-DT1bXF6yWue+PBrSeW*pixLQLoP@()qz4TVGqui?w!dPcPqx-QkO#xhkCb;z6G^|X^p*PoiN)>(qJs+zhbCIO|U5g-bGe${8Q4`i`5Gp}m zAXM>lBlUuc*1l??cK1-kRI~D6py~tN*)Gm_#yvc62LJqkWi^wbH_wU&H@|?@eZ_+^ zOUYq6nv{})wsa-TSRv8ImRxW@6nt^e!3K-kRXz>>z4C!aw!@LLlG9T&=rfoHYA}JF z+jU-<9Jy(R-vA#?Z9XF?`O5X)`QFsc{YGW5SI(Y0&wq?bIG|G?ByD^HVG3szu@*YC zoMYL6J>LXG1i9SI!`>=DF=a=K%oYXbZ;dG`kl}G^AJ?oBo8uab`W;7osV_CcEYBY7 zO93fYA3#uV08U!ONi{g77L8uz!^P@_O~^kEtb3pnPw;txFg`!M?N-HrxTvR~(cfNu z+FhARR19BI0$8VW=~d#*nYvfd47c&tVb@#IpdmN^2h}asI+S*bprF5x~|{XN^aWtRghu5?9Q;WPewJF*YaHx zB4s$JnG#ZC>#%(8?rrEuJ|7mvyH|c81{-c$+gbZa>9Y#MZ>6< zRjUHtWKpBwIBBeHuK&DRZhu!0CjAT9(WqOqt{bErRA(AHE=xo!)d;wDYK7c$yTXZj zCsi-pd|&nszd_of%=ETd zjhd{AfIyfxGIAg4WVB zINa;5tTVPz`{Hp@NYx}5u9wk8;pn6#r00Lkxt9H*=bpez(Q`nECC~}hzAN0 zX`Nv@$o<ik~OjL<`Vg)zD>dcH8$d!|O(wLODZ`v*x`{%%D-bv3$wMs4jJS{RB#zdz>#C!~WnZ zcUzk0S#O_%yy{iQebFn0TI^S#JAZ5J(8du}W+*s6&{e(0!X9VLC`K$W=ZKU{U-fCc zwkHA_4a~OGhCL}N<(zsGqVFT=T9qW{hEnsF4Em>NufFCt9Y%h}XRk;xsZV}R(6|S2 z3201C|MQ^-IIXKvz5Y#Y@n%8a9ez^w{<&_6n8F%BQDvVQ=Btg&UYqT5Aw|^-DbgEs zXc-wPJJeRd>iHEP1w_AGoNrmZdQy;i-0i!e_AKBIb_kAIbJsvVD1p79gIDjQhxzbK z)GE2#46ZOXGy2sF(jVs2iw5NLGT3r6?P;tW^9zCbO%B(IM;Ugc*5ui5XMCb;m-|;K zz?7xT@NhG@&(n*}4JRU|K*Q@UGn6F*BnLHg9Z|s=y>#jZ1#Mq0zJE5Udx=i#%Qqi{ zfmXt$m5#;EeAPSCLG?mOr2)cExSoEKi7NKQT!=RI&l#E9bblSg&6?WZGe=Y~x?3eI zq)$!%^5~&WG6#?>DhC`7 zW_|CBbrZR7%M7j9YVsPVUQ)8s-ir#Y8quE4lU_8sX>}V21UF@Dmtd3oSz`-t9^Bo` zDmvFYy<0t;D7Etvuhb64cylbV%Y8Nd1$PC(5s%P33B%>+vKsd3+w#_r(J7EhjU$k! zq+8l^>Zs;Ewiu%`qJBij>5P8iakn*cGuL`xw72bl@;x#(^!Yj&Q^s2tdGdIopWA$- z61E|i8V&0%Ix}2>#Oy#~DrU$9b?XN4(4l%yX}-Bz%4%$8lxJj+S=^HnCR` zbNZ!5Gn^9fZKoLrzZwNge!ZYhI{WbCiFs{G$D=b(b%W6TD-a!tdJa;>Z(RIym0;PR z;II&6r*JQiURgF{?YXv! zF?*$9*fk$E+hvlJAhgT|p|5U(X0`Q~HEuZFam+O=fEmZk=02Q4&R4Y!kH0zdGvcvX z_q+ED2sw}`J1iBlKCUT+5)}?aZ_bg*tn&6!tO@yM9>$yo`m9}mq9^e-RVQ7NVE&eX zL#`p^2@CrXIO96?rg_sRo3`QBx`cftvv>WsjUoUmhE4Va!y7~DBA$aImJ(t+v$oq- z(7tRSEVr83mD(sTEixntc3U=dn*I%!h%IER-E!n_d@B*OQQTWz+|&}@cv?cy&)Two z?n@7`UZYp-MOOxBoYN=_l5d3WyG^&4_|n4?%R}RlD!?kcp<}g0s?jeX@-zSf^^{ft zrLIHsz~#(E`yUrSh?+uE?^tpY=4YwA^Au}W9!+~agmmJ8bPDX~^VGkeYZ%j(lhgRf zXHIVTLUf__@Pcle?u1?KQ3lg$*rLw#MWQwVQkL%NC**4vTBCnLwayzF9dp~Bn|Eu@ z2lS75eOo|Pr3x3T#bV|4Qda++syT*qBJNrEhA*<}$|>t8gOc&GM*6k0h0%3TxM)G- z>DV<{koMNCjhk(>!{r}rBd5QXDSKUrDvY$1>p^fS$q5UlNqqn}t<=$Vzf(wqj(?d= zQtUpL=z+!*X=;#bxMYJRm`KUA-OA)pXNPDI@5C5xeXSVk5tpXP2d4zU2+>3EUO|VK zRMwQ7C-hDh@U119kj4~2JAguMA@*F0YgT!D)96!AI~R|Ovm>BEW0>}G+XcOnOPFH1 z@@kVg=8gH=USp$R=B8hOLkAUtMyr0-AKXSnLFt@!9#SNX{b?HVjH*QH7f=+$P=a>Mun*2OaJPR$p0=#N363iFI(tYhFFQ<69 zoZ_1STF_|NwcUKg9~x5GEm2P6d`hlBg+h)<0SPR4A*?SC8WZS~fTiv923k+k7Mr{6 z%8k)fqwPGz=2hEsIUx_g9UZLB-5QM!VzxFP{&|u$8}Qb6M=z*QM1VPCW8QV|S((qW z32wQDny1*%iNxlkXWD98Reyznp_ags54CD9MOqoAF^-REvd=PP6Dj~?V9eAwhPp@I z^I@{n?(UpxL_XYUY;s=*DKF&cXCVyu<^46-a4!i8_DQor!CJP6a4|`-e*WHkOG^0?#6l#$>0gSsjW!6YUjzd9j zQ~{|WstpeA3v(89pWBLDym#h(EW5MOg)+Grxh!Xje7LKNJGrB^^CHHo`#bgcnN8BT`yLUDAI!hAE05=yG}z&WB3pK=!6@yC!loFtCRpqR zJd=UlwIBqO7YL?KqnIMYo6~F{6cx&h(T+ksZ|}+rHeQ+ES^y^z(5x2e>YKqcPa?|v zls_#(*{ieqE;MFij)5!{C&*ALlzHf=5!3p--wfp@l=eo{-Zs(IZyfw>+(p4RL%FxD znGnRx-L{iX->(Fj?oY~swJ<7`5sDz$uXKKb7v~wK`)DK{=6ry4nPwTIk?%3o>N0cJ zvbvm4Q9PpN>9%v4<|UdH@K?8DwIwYvxit!1c@#YjX|CnBu?q|)yezWi9%2>YlpC?Q zDTSTYA}5}5VX`KQ$oOf+&D1>rQ z5ga5~!`(`!-VB*Nel4hD*y4Kq+%l-c1_I9W#^`Asj6v&ewP_4_MAl35Il7eTf}EUv za&bknB!idJ<+&xyw$crfJ{!o@V{cDmd6kd6cLm6P)mutdxN}rdO6*)@)g|QwHVx{A zBKcHb&>LGxGp9%|Sw?zco2PXopwql|5*5%c!}z#+dhuQ2M8%p=&HJo@uL!GNiFHi? zowmpUE3-^!T;+W8Bwa90`poN?Lw0Jt5-NOiXJ+H{w-F@`=mqOw++;267UffO5iha= zI@{MyO+LNWy&0g*@FJDex-9XW!d|vscx5#!$l|UUr>ClJg*^BBFA;n>qvM_*$?qvW zPvtyLeDIU+{2boBu7gi9?e?6!?lWK`7z#i%kS%%ctxR)4{%e43swU53y1_*0zV7dr zPVOb_R!q8*RY}DO6*c5iiqDafx(9SYd(LyU2f`^98uH4xR7c*>IbrOEU(8dBgsRVy z-KI6r?d9GJAkz3m7#~|zD0Dk(2Hxem`;uMg#&r@c0Knr6y#uc=F;sBKRbB~kOs*Od z|9ncZBKC8c^8<) zu{*zM^j-qvyF=kSEtOEAw)O#iO~SKjD$MQ98~NlRI92AS7!rr(&t&hYkKCk%{%0KRaF8&X zky)s^cNlMz5v%^xdye%_z^ow?(7nC3o!)%94yqm8O1VAME+u^LUaoxdE|OfDB~qej zS4XGmZ3zmtQanljy;p5A`;EG0ns4FMj$fAxWCPFR#W%#Ft^oKb<5)W4iwE&G?N`l8 zlYdeQ_(zew{T9BTmWUPGxMu?RN^Z`=aX<5A74)wU_W2Ac03z`l+s8RMW|=S7#(GX! zAy`u58~tjdzi$A^uuouw&^RzdE`PS9k~5N27WYhx;_=L0mREu2N2$W^<<6I$2#A^w zXW!msw7xq$y+7GMk92+UDmXS;FP6KP{r?d4m0?kJ-`fMyh)Tl%qF|5$ibIE_g0yr9 zBHcBBq@*GtN+{h!Gsw^lN=nzz4bmVfq3=FC|KIic&0)?uJ67E5UTg2M3wqvKKqSgU zFF{=93^!GQoX$5$f4>11%=GPH1{%MbaXyVDlAWf-C7hd~W@L?R@uYk?iN@dbd?fo8 z-tCAy5rGwJ_(FA3i*omgsCeh_QhQZ>q-0X57B6$?noC+5`2-N!ghyve*c78wG_n@@ zJUu}@A<(&;FSdU@rnTp)yle807J>a(y(IDN@H|S_gfu#r_<(dj5Nb3uH7Bc6KY#UN zz!5YS?_KD72u)fSz;xbcd+}=ydN(JfP3Au{k_JLd4x$yQ_f@q35U4qybh*#lq}+?; zxY|~8^7ElM><74HxYgt9Yo7JGCF+wJr&m2_O$1ifR-xMI5idhY#ukKdZ;=8^$gx&0 zQoh}e`-B}JZW@sgd$%q(afxg66YKh1j`7YsgC+d=+o<8+rb#{C*^c@cvF!dK36}G= za|7!)Z*~9NcnOgLFsR7mpVtL^u=#D^iLB21jJkVl6^UrSx0pxLWTxvU$I%x*qwcv^ zM*R2tp+uC!$s=a=r33fO^%DbY)o^lm31YFHUZZD?HaPV+kPycE2HC&!!$>rP_ta!0 z*co*is`#$~4+6`De~86x9Ihf-IJuqc9~evgYPavOLTs6dz9eau{k7I!5S3o{~iIc=K!lv(x z7J^ByjFeiGYKIagqJAgm0zVZ2YKDuA1pL>xL3Olrr*(&59TDApgE+*LS z*2QL$ubIp_$`)&(hUgz_(LH|5Eug7+0bqQbo;KT)Q*Xe3td;#n9njBbJa03pw{*rl z!Ce*!m$-B+qEHi@#-~M|t_XBD*MyI=K_WXwIJ;@oKrealvER$4;(jA*R(-(nvu2vJ zsfCXS=H{vh~)O0T%{Z;>42)8U+PqMrklGFzZ!%Z)q7mcuY z?@>|Abdm20F|X@9tQ77sn?DkjZi+C;_Mev+e8$a`Y9C;W^(B*2=_~e zS0Hs04Ta_u&C2L%*kApni>Nm9qynigUD35M(Nm8}9#s$B|XWEO}y!>^^L`n@RZWW1~TWC^I1xN}}55&c(KubckL_`>i zX_9zPj{F+AXrC*WWy#*g%*td}V!Nb2}aDDQ)`-yL651kkg zOYi5goipId6_L*B7lfX{)N{XaDN@Vh=MFF6eG80V3gmxfdIRbZe*?v zB`KGX+{(}FkI&h^jKTQn!0_r2MvhfMA zID<{Q;HH)L+wonIdqBjlCIB$uTHce#Zrv9=c_V9gS`i9@DU9vW0aC~G75lbezMcG^ z?5-6lv)g*;fCcw)2feD-a6~=g=xmNn@o?Ew+i1UpN@rf0X$fSeKb_B)-Jg;E)1dE+ z&vY{BaByD5{;SOkRmf;ol~DR~LMosc@cj zA?daPnlM}7Jlk(Oa5xUuv=3onbGyXkoYD0cEdr_SfPFQ^n{8D!DQb`r+-Z%8a>5-H zEC$iD3-`9DG>K@ozcC4ku)~j`2Soema5*(-i6tN*3Ik31`O6Ko1M5^1A+`!uAnHxP zU++D{6?J%IYkh5=g7l}^WE)mE^W|JH3)@NWAI=15QM7%JArCGNrO`U&c5e9!#3HgC zIa|Ll%~5yTIx%Ev(}2x6dtQ5BAf%T^z|cGvPXurH`kOCu3N&5Xullm26?vrmqr#Eu z%G$$UnYRn?h7A1#>e@6Nsd)11K}0_L64nKCJNCv@7ay+u$23*0m=)|lA@7YTfsO9F zzwo{SJKiADAr*~%29`PWzh%A;tX%GX0DGo`)Wm@BCjS9ZZPh)yN#77#*{%VF^5jz% zaEe0tVcqesHq-vRm>c(>%i$44E%?ZJ@;5YzGPdnxfKkApy&41|HTz?~Nq3Kd*+ep; zZALlPG-!G`Ch(q9NeT^`^L!*YjnY+dF3$u0()gxwL@~4;5UnhiZ-+M5@Bf0z3rBa8 z)4*S+e*=Wp*NL#4n|KOi9wq)4bB%^zaVVeM|7BFyhnLdjN|(9{w%6>`1%e8^&^erN zwaFia8v&7?2PP;Gi7kjo#jesxcJp0Z1O?k^3#@YV0>c4KT-Ux=zt#4AoYOnIFZj2V zd9Qb$>|e?-g=8q4|3FS6zp}_-gDaYg3UJ|u&Uh8Qk8BsmS-$ThT61z5niBL1jHuDf z=b>qoR{{LhDcO)+tR@;dR;YrG1w)|4);XMwJ!3o%oL8jBy>l0@(wU3v8U?Zovy&H_ zpH+b_WHCPRl?vs@4^ZaieT#afbjia-{ne zqtA?)<2emz>-j3K0A*F8wsO>x&44X=BF7K&S&B6RV--_NNX03dp6t7U`3ho3dL(OiL%Y=R3tip^(DMp&d4hS~>Pxpy`ntCh0mFE+*~DdLw7Fk>O}IdpY~PvW{zolkJ9d)c|oMet{J2d;4t~Mhx~h2 zg^#w>>Mg_3XRWHNn}ZF^6;nSEZE??IwNUffY2QoJD8p6on4N>HtyVR2XcSI9^(6+y zNks+<|2(kZ0>X^%0B}I}p#o55d!;evsL^(H$+Dp@SM>Fg8=e$s@I{i)X%g42tBbQCH%*SEL--t} zBhZTJ)%9_S)rrhu!8{?!uY$~; zMSOGF?-GR0f?b{tZ%eZ)&`?*Pgf^HhP1EwH35svW3$>uXJ3$oUvU=XiFZmeo=2(&5j~!q~$XZM?36*@#3scvU*7_1DKt zJ`34z?aqRI-wWE|{!$MSQ0$J~-Hap>{qZNST7oIX*_6HlQM^vjPB&BGN`0nlk7wuQ zALg@kJ4JBgwF*Vv!s9i85WwFegT>~PBv#ap54~w#kDY30+oic;Aaf-s(cd;DH$gpL zJPElr8UBZEA|$y2q+$82o5~OI_B_5uk^95UjX_eD9U?vU=7s}{$2Fnz-6A^~{Y+%K zN%D^`=3p4c0brBa^m3wEHHbxGc_T~gjDOj`BS?H6@j}Di?RU?yNmg_ujg*P+;G^Sa zH|8LV2lekAGmlRljjUV&i11$n@juNKZ1Qz{yr7#AZx~@REv$Em^^2Gmb<7Jj>XTr}Hk5J( zpxaj@pFje%Ft^Le@?t31EYD~+-SII^byj~Gnb-A}EVG3B&=C~6yIZq>)D%vhd~)Sw ztkeyC6iVBRJSfBnilX`X;=pzi)^~mbd6(z%V+yy3YV*?uOzm2g14Akv`Y-_e_uCTw zYiv}A5GngncQ?l`<;TI+3$&9e`x4s{XhsRn`y5gSYeqvVN?CJGzwi1A{ats zMQ?J9KVUs@)Uf0kH?R%cMbX*h9cI6DSU7&R59DOfl}H-8lfdJfUpcNyFm z1|vtwH1Qb~Cr95WzHQqDLfrJYPu)P{LAWYT!@b~JHUe#u=n-&Pnr>N z67T>`uE2yZ@MB#x>$ok0- z(Z&6V9;q*d76XM7_ez0cHNA#jonK*s0yjR_@GM~`Dp(@KHZe@OOziScyNN_56c#sf z;0afLKk6-hDSq8*QP*@6$(4Nggo#8L@;)cPMpX0TAKVn>$QS`pQ3zK+nz>siF>m65 zv9epxv|30TXNtMa6H1S3i<@tb@3kGaDAxVz1>#aM6T;LR>6eC#qMlowI z#_Q6E7e81eC(ZL`^z9yQxw9Xu+S3f2x#+33GV)UJt*o~ku1ECAhB(rsTZWY0|9B0o zz#@o}l6e!6rJUK(s4b^(pCH4>{d`MwN_^D=rsTMfDl(ZNX2tdzA&KiNcA^15NWY=w zwr@eS>WzNLu}kCyGI(!**cL|Vw|1Vt?5lKllmCbuDg9WZe0m40O@aZIJwVxRR$nyY zhs)d#79ywht49mvO;>n^t*=f1RaKd{yzj?bB5DE6rw*Er+N6JfMbLm+sbj^M^CMFS zB;5MnWCg8~TTrqV%GVo&*KE88Z==JIf=}N0T4Lw#PW=6v?Yu*_Z3l8#{&8qy#UNiS z0|3kIE0lb{H{H5>4sOEpp%{LY!5)cLoUawY-|QN;D+m2b#8L;+bYGqT3puF$9a|>B zW*Q0&CFsAQd{kvG619t3yf@@q_af3k=(-bkTg|Lt*~iJKAvy_saMb_ygQU*hEm<9S z2s#|i-}*F@D}ot-Q2%Iv^wVTCtdQ0WHT0)~6Gow-Z`+6~$PTAsc?n9d&^Xl`-!MhN zoQ0`_eg)HT6OcE$pI(^gSPWQ0_r!(=LDm7ROC=jmvu#Fo1X1{S_%CzC`K(Iu2)i7% zoatG|F>wseI2gX%6_&n{BlljzHL<^QBv)5rn^++UPzEmxj!tfnzlO?C<|v~0I_v7M z=~1Sx>FJEeDw>+{^c8Aw(yHm&_f8rxL&2f#;cD%}j6KiJTd(l8^U5T0ukTqv-3Z2b z&|)Y}HX1juFL_K<2-}4+W`lxS#o0?Ts?jd;xWre+vWu$6T&lRq?{5W-MsE{~@O=TX z#i&2kY-Qbh`#ul?Ym)-jHi#h;Q8Ejf?k`fdla`)*3$K{iKGw{+U<)Bf)>rkf!K)$WAox`RUyJN2B zxITMzYoi6vx8i=vY@gk28KT`zePRXG_x#BL0!`xwd5!{c0Y)scR6yjg;osMWV7nlu zJ~zIlj%UV37?H!4)q8z=(u5YA!SKrB7UQFJSyNj!@NO!I86Mm$pGs|(4$k>m^uJyJ z!o!R|w_BaA(f}0uPdX^1P54d8BPZ?%^hR79b(%wp$n@a5jx-h-pB0X)>-@e^P-a2` zl3GbVXa0SvLG<98q#sS~(Wd{}>5vawB3B33@eY)0HCB(pzh%NKW>y2=+;xPWF@u!( zj-7ntG?g=#9c@R5cw|L-dhPSGJ%dp0f5$D#qVY&-W408D=`KEayyvg13k#?kt{JOl z-TH>}1Of)jP#C-eynHr)A?8AHFI_$_!v3ENCP0aQ^L1&3h+eXPv!(m`ROk1oC~slX zR$vU>0S!O-v@ffFY0$yLn5?Z=PuQCSE7FTfLz6>@$jYZzfqlbI>ny;L%SF28Cjyv! znDjp5dM_aET?esO`m(02bV3g^$bCUhbDUS8Y+k7O)! z?E<54V;dUOm+_Zq(MB_h)Z8{WpaJtinanLyUm1)6mw$sYy>DbPue z9tnonTUyql-9KANq;PE~^Hr$1-5U~`@7^Z3b_aJ;m@?p3ct5Yo!089vS-`jbmGE-^ z{QB{y9MY46@)Y@A{;O~BpOoCn{c5htdCM6;NJ|opi_h6%jF11Q2d<@x4hTt?BjfC_ z>2m(|l;SDTKi8?{H#f^LlWskNPm5ds>}&5Fi(lxYlDgmR6o8>gG6K!Ejy_x5OH}A( z72taDhF@#j4g0DyuYBDJJ`|?ayG^C9$ymZ zvb9Dpika*0L1VZJ>^m1+pfXU-zrPfctRNtgZ1(pLMUQfI;x#1zhHbwWwlZBvx~*7w zOj-VIW`J6+CPZ#02#1hNQf4d!|K}U9%}02vvhR7 ze09+ahlOj)XEJygxGi#U9TQ2LCx)LUoVT}}%t_gY<@hUQ&$)j6E6U{0)akG+`?|2t z4hYXM5=h}`s@;3XZb)^I&BV-PO}*mO+~)JM0okEf2bN=`%L3i=H25j5y|+b)&3*FiCcg8Qlwu&diwoi`t8ygf48S5EiRc0lPAa-Kv_+o~G~}ERm3hL8IW5DcMczIF?-gVL%NDkN$|sPvSNw^y z>d+kZIY~lPrBzM7MK=7?S5$gATEku%?)N%~39Y;4Gp96uZUd>~W zol#ul%QbTVofh}nO)Y*13%08#U(4kFms|g%N!MPoAnv09l?lq@2ktxAlQ{H{^apwi zVp;+0)o1!~NYq)e6(4F1PG?1kS#lbSiZWEQUvp@;2WOy;q(Of^7!AMmxTA3QpVr{U zlU1WYistkwkhLQ?f|Fm>L-UekL_gZ+w?u}mUc~X_t$0R@H;U%XsUB@QeebXXW15=; zZpNP*Awn#25#2MUgNrN48IB3N+td_4Ji7bFN03qcg(IUEvi=yFfqyv^F(y_LlWTl` zGUXlJ`=x4c^I`1P@fRCrbFsCF z^_R}5@EK5_K|LaoWqa>fx+}+dVE6rojh{9d4(&L@JnDW#HECa8C0wfr25Ul6r3oO~>-anUN0 zHg&~62DiVj=3h-g-5a8%X6#BaBz_8I2*O~oZq3F`<~a*&DulOph^>su#aJQ3?oz=p za;An{CilhN_4dNJdZd^+1S9M9>ARN=-(h%#p(7aq9rEO_Jh0%I(?X>}#jsaMTH_$^A6V zB77f33gjyd^|=AI@^8JhzTW87%WbuUz(fqgaIV?n_MO%1D6)6z71(08xIe4<6T9W} za78+pWh}2nQemHuYKthDKxpfH><=D=TIduC9^}@urqbj{$;6mR{$12E+|>~@pi#oI z_lA1HgOdHVh(+*$?YUp&jTrB6k*d|uMHx!eKq%^l3}}ITh-Yg{q>>&7DEHpq?vWtu9z1Uv&ec712hsU3!`hsNvAF!rS5>O(3`lvv9sulq`ioaw8}i`fAyrMT(*} zI=8HtndiUY@DVCUfBJ?9Te0GeH1i8DRSa(=0u5UH;JPG^fi7%D8Bl${Z+U%Y`~0F3 zjMqvy1Y^W%uUSrjZS$YLTzMKq*!Jtce?Gk}nqnTCC14_qxhF`x8SH3r<2F7#Z91=z z@-m3pL$@9LhJZwu-7^kyWS8Mi9KzG3g!$jSD#FcRvwgu7kMz+cQ^i3%X$V^2u8&qdMg+ z6$k>Qs?f)DYj~S-ri%uOkCfw7mS<#CC$bB4hponvi)9L`$_IN^dN^>kqDh3jr3W-P5-wfh-7)%KYsYHPL=d!#yBxHF}~P?Xwl883#_X} z2CCRv?Ru^6FdPIk*es;K>WF`=_CUMl69<(Ae9vpmDDTAFV1!l9yHIi02s2(|HW<&q zfNQQm*EyuVF{y>3@}ugxKN?d76O#Sw2R8A%2SmwsH0ItrL)L730lxa5N3XwOJ+CsD za}x&pcWR5_C#^4|ku`L`_;p!yy}UM-&7%AE2W|Yny+u)E;ji~uL-@FxZW8|^urki# zbJAnr^Hyu-+Z=y*Z{K<60~jxC7AkFOmG`%)+m@AXw2Nf_wU@$Fq-%wd`5C+OPc(BV z>*ePjLZfj5?hYiM=G)k%B4dt`a~!sh?ByvNN_B;-OW32@xXf5|7cpxszJ$v&a}uVpj2BLi}cf zH3hBnyUm&p{_{lM&^)2P^6`H zA6^0eJQoGj1cv2I7lYlB>FyEP=dTlGyv74rsMqjeCQ=)G=PCF~8ev8NHU~U1j1Bd=;Q2-(A8U;Q+QOQQ>fM%cV7_0FsBg-HPoIF#vD{#IFr-xq zbi=SeGeD-@V5wVbs1MN_?Oq~6+NtAUOed7kw_vb2d9E#G=0Y7cZ4n`r%a8s-t{wb4 zvCq3b^k1;4!|sFShoN7Bfx|WjBjxdU^#8oFJa3`IhI#6KB$HRws-4xriY z{0c={D66bn;DgODFdHxT3ty>4)%qUz0Mqg}1S}8i zXl_`Oz<-wBlS&#({8zSC!*k5*B_#I<_$k=YTKNXx+LjVf^UL#&9_F_{)XW|(*8d0e zL?Dm19K(2ff5r{S3xMXvWv+IacVo%G^w`>oKz-h_wOAj@zBp|)rhszAi@b!g93;q? zVE*+ri(OY>LAou_~0^9|xQtcI9YAKxzpb(Dom)H!`)PTZgetS$B z>-OnVLnVj6wzDnQ$IfCX+({elEiasPNny^G7ceb=ZT7)Fbgk1I=5DmdNfkAmfp_lS zhvN4Fp<xIXy*e|PjkR3Wm!=6Sum^7p$7E|$|&)D-I<%JT&z zYAFXlC#c+J4i^LeTY?BMIO76qy2e+5q%drThBleb_~7TY#EZ~&mc!V^A2I!Wa|akx0r3&kCOIS7gf>0h&rrSsdbXqwgKG%2TB~0E&rcH=~=G@u1e1zXs$A{wn~eK}&V6WRJ}Y83=``CLFik0ybv9 zAY*J8KU$glxph8m8YtO+U-e4w43HRb#NGUergY^0zi3(L0Xf{d%0;Mjn)U=*rNNfu z-L`zSuvH_*#J^25M4q_qIn#M{+?68q^q^zCDHQ^U3ftG?eq15h=eHGe{GAhEdP45I zqzw1i9$D(0p@m_YZuik8SkH-MM@Oj?X+s8UWV_cCaTNsRIYqE{Aa>{x_mcj*(49}m zU2JsrTcWX^R}|&B^w=@L&G?{yLvDs`7rarD5sH+t>*X2i$) zj;>(3vnOojG)Z*qfHIQg1mA>Jbh6dbZQBzbtqfCN-~0B~#Xl2hv7T{b6^Pj+^}u$} zo|h9nK0KCvS|zFa@9_jXGdm3!I#<+|X2uT$}PQ1~y9UFK0wU$AI4FV7d3V3?;1HagSOy3>nEjIFdpx+T^8fZ3YNC|65*2 zjIAbTGj(F5YDx~JF^{c%J2^67a%lTS3KDV?h%E_2aTvB}DkqB~uJo-%<%Jh`nzElm zi!`y&Y1_IB7uoW3Oi=%v5noeBJj(szv|73WNE9O9-3dh}o9L7fxcQ?iEqky(qA>WPC~1d)xq%Jgf1gLPzfB$5Oui1U%C- z(|q>T^kblWunOo(uHQ=p%3%>?M0AZTx7259>v<%p5=EP?c_d%4&YI2>y#zM4P=oy4 z^8V+ay{;i{`aK6JV)^0dHdTA0>?Pz}LMY*O0zA=(q8-i5-7jWl-aI)6z8DJ;6$)Ks z*8Gn?6{Z!Mrxi0ti7D{99~hP1D*|cH4{}_X-m2S!UK)8E=^hY?-KP&tZDwP^*et(* zS1yfj($(HMKB=TZ3Loti1N&(FRmP`T-O{`$G`;Qy9F@>yad zr}zbL>SEz0y=}KBS+#_7Dx%_!??DtR9*n=f>an=o{^IL)8%j;=aY+TY>nEO{z$V!buK zb=b=Yj)silBaiz~!Rsa#f!y*RAUVh7Mi?$8WvRj>6#-*H@i64jkm*|J_0j6wjbdgS zdImqDlWUN*n?g~5dqaM+%h!K83Cu0<;oSrl=cwxP)o`>%At872Re!XGpvirmaZxgd z2z5@txAa=ii$Gx=(o#t)eS6tc%Z=5K41yv@I#p9jZF+6Ya;0lpo9e`jwN3Xi{+wbtY9;ay}lOoxQKt|<4oIC!&dO^C=C9U&$I#E@V; zI{icQ9a32PLzULEu7u#Db?AR!)DU)ND+)G8P3fJ4VvTbfk)|dEn`%P3f zKE7q}KvF4&y@k97a{5NP`x(6&j!=r04-r&W`VO*TmT=IJ9y8fRmK0k>pnuh}i2WG; zTfPNHlG9eT{kJb^JL-Sd@&clv2NBFj1@Wcx`C?|p3K2U#!5ER6BG*JM{=|~fpez18 zimBYa2A!&M?Jd#S(LH^IUTP@dDwBZ@szTR!DcG2VPv4#s1xmp$VwVb7knRv=n?7=5 zKRkg&Vp?f>?P`Jek6Yh1+FuF4voCKJKL@}T_G&4_K>_er?Yqf@OzlyYckj^tSh1=5 zFse+1WnvXFtxrVVKHk6SNNQz!QeMuv{vBc<(xAI0W8xSF*~l?}KJ_3(vU>u#@V9^W z818)jHbGjxSA2BmHEb-{4Q3{*?3<3dp!*Wi#M4(!Sk2 z${z&2`u)w7c!OG1+GZo&Qugi!U?lsWA?{S17RqDBBE3#=EbYIX=>?Q?z+X?N>vv9P zC)yzuoT1%$tA_M@O^HZB!_b;WjSKa*TS3M)0N3~mG8$Do$|k#CSWZDK+7HMW0;l+_ zABVF}zS8-nQO)21o<{l;;P&3pTfF=IJp2|a%d$m+u>URn=eE$ z4^^bM39!%l)2FoTbvBINn)dq4@ITJ51rQVEfr{mC$2lh|Qr?^4=YK{KPOW zt%q@CN|dUU3OHMv z4}c>i>ln0YAV~bSQDwQ8<)7nmNxSDJjy3!)j&wEsFKuXqYFsqc5(YF5hQyY+!c_KA zQvoIyKiPrE#|;t-)J_yLS_mM)w}zv-{U@KS{h^tfm$f zd0}`1?7Po@qhNSeevYmg@7E%^wro!kQ*}+>HcL-wBF1NEP)Jke3oJMGsM?L_Mk_(q z4qrlWSMB&2lteg+LYv1TfL2$;vb$>(9(XPpg;Mkg=!>qDk0%+nOS>0dDF>yE=0Wk* zmco`ZcH8fwWMeoHB}+moJI{asv@q}w)_danf}mq+{8X@EN~xZrJ=N=Hx5u~CfXHkb zgvD6qG;wZ(7V6MLBG_&Z{HEOobySlL$oOEF3kX2u(qBhU_0Bw7(2G#Lc->>05pL`L zjU1iQP0;GpB$r)L?K0*-?J#JmW6U~u9H3pSt=1iJ=Q0!c@AbcLuj&92`KHc$B0K7v zpJPQRieD%WCIagF1=cDhBJC*_(27<9jAt!B)I44SVt=vK>b2dHdo$CU_d>o3#`eJOj)d!7twkRy1l!|pVs2Yu!h4?o zUxHSPay6@pLgm$E1a7S0->FsQ53K(D>V+0oyhCtU%!-?(7;`||60VuSas|QXEfcby zZm=j$uOiDduGp>_^8+Tli{&h^TwiO-?+6nw&_PSA3q--(~6ll;; z9&NqPvF~9`Zx%1|aQ;{3ocL!iCIv=6^ho_KPgC?k{x&DDkdv#V#P(}K{ErzfgE60c!V!Q(+H8H|P zeP{Rh@01ftfEN1NYr?Riaxjx~a6hU41fT$|i3@--#(15Bb=b>9&<+X*Y_@U!{e--4 z?3PC@E!|l&BNMJkknh5MM`P+DZLg1feD>%3g)V@Ehf(j0c;)<*R z5bb^jQqzoVm;C-bfmRfe|v63wCF~yH8&gKFl)K6nCmmG)e8zZNHQrfo{Oh6<=)z~ z!XUQXg6J7dVmOof8@ws`YKfe9@hCyuWw!tI0`x=#DfXpuhhRp{_mMs*_!WO@t5%&< za%8`F>PVMMAXpLDZOAtd6#O*Jzq=VD(p3x`#La)6{Z8k(Qy;ZldceJ{8@ixOTGKt; zfP3TKW3jk5D$|s2A6gn%&mMlQDl}udMB3?BrEB5oGA@+ia8i+tZ{xWlloTVrz zSy@r*yl-e%*qAj<2Dsd^Z$FTzRRl6}!6f}7b3cIg@zIJF#art}^d^L7AO9ASM#rr} zgwIEagoT3|RX&#LxhaKn>^1x4l-2=hW~ zH-MqcRIfmR9=q-i0sBaBHG%)SOi&PqwN@wDw5?Cf^nYuzD86yJ*SmM!%MIZYwa8Uo z3R|jDUgXnF<>lRcS|cR&1yi^2NvREpu!Vk6s=SMgc!c7`xWS`Aiwd~t2Q0?co=TU5 zqUOVeV6p8CtTJ{+gjugC(<3h6dQ&9e0H*MEyB_nbgS4;e3AC#EP`{3r!=tEzgOkcA zXZhc;)^evkAo+t?Uk-2F^!029JN{ta=YJXo&@X+Hz@Me)R`X%K5&YR_?->K~Z zG5pYU^q|6>)pDm;RQ7bbt0U(z;j(&q`czN%Sp;GqD=Cq3MjbJXhXCNVU>MnaI@2=* zAhbxV{YQ_LQ(89`R}jgY?4TVgnDXz@C0i{Y0makTFF#17r@yQ9O|)?b5x6LtN#4yg ziD|c9z3ERWz6kuu{W*@gGq~r?n#<`hL$0KV1s-kvr%OTc30TX$V zGaqA8q^rr~dLD}~{VhibY#U4D%LAYIR{{P~TlUeia-G6$LgQ7Cj*^^gKTF9bJ86M~ z;J8~4>AtT0)7&^v{CqSBbk#i|a=D^nLOFJF8&l}>`R)C!+wvA*I+|@`)blkWQkWD)v6|?X*Bu_ZC9+(KkZ-w zL=0S{rB{QcZpw}O$inA8GrU@CPr?(s|29H#=RLwTYDbpD>56wJM1*xwxuvu;y<9v6 zvw(7~LuYBJ@}Ojd5W)5%eI~PG;amOt=y}9VhOKt@lr}A#vx>UEDce5eB)biS-Xnn7 zEN|4D*Do2VZiLE%{ZMhjI-UV7R5E`)7`0N(ttmShykdoQmi~l9m6UzeXj^QoGG(&V z8H-YM>F^ml`89*@lY#?BsDR7$hZdBl8G)3hN@zW5H)|1qR?+ViS|O;kCX%b`IN#64 zl_uxDRuuV7Kft38BB1c?H3P&T1}*I6 zc^XpZ$z(lZ5hf17`1+`CwL~7_>sh>CdXgRj#t8HN%2{b0ZF0?wtN{uk?Y}d!WbrS; z^CXzTw=NFy?0{mqw*;IRooPG*>wM*|tb86QCLcKp)^&P+QD415&SvG=+G?5VeADg1 z@(~$4J|JSX*oBXr)$T3Rvss^%nw1|uf5jen4U2*KOhPAFXh7J5cyWzR&y^HKvcxR% zvBh6Fn6$J}UHnWuZ4kV={nh-YX50$;xaTU?To7kpJi8cNXExszDSu^pNo#zkGw0ph^rTX^LMrI3Qy?Zr)}=`rjPNXO6p7&Gl2`(a3n zNapuA)OE}O&Ej4btS#}UX%RRrpwhYlfW(7+6KlbEptD}g!`s8Z&D+b7D2{WMUA##^ zxlo`ze+^QjMu>@G-;z_dLT5;Udce9i%GY*J*%T5egkX_&8bY zrgsW2d|s=;q#QRU{`P(@xZL4lL0$7n0VO)jRYNk50Rcq#Ls*sjJrh_&zAcw%kLy=DdY`^9^m+j1El9)_NupjZla{R_v^*o zBIPE&{~9`_ph+aWBP&#IPLO!oBUOF-6TJ5>3q~`4dd;)xv0&b^P&o@Xy&Jhl0HlVR z(nO5d_Xj@P?>C@IVLN1`Ia#H8B@d&jbBq;aI0uu{Osiva)sXms4CGtNN}+E-1RL0X zk$e|iB$|;Uj3s-5vKCWpzT$6MbM52-#Lb>V6leuo<@8!%hFnZf1&hzUV^M_)R#{M= zja(3+v7~!q_r;Q^I_dW^|4{2UpIODUUGzuZxdTN6#|@Pmft0oPTKCgph67I9fcJy>FG9x& zT>@~WxFf!a6d1=$cl+~Mtm5~vvJ|>C1U9{|9o+yIig2FY`6c5cp2epQyZa{zG6Q+& zK(p3zg^1?BW(=L#v4bpvSY3y6!G3deGTDf*+?d>fSoGo%{zHFBFnVHP%`J|IXk4~? zKB>Dx5G@)BXiZ{S0L>uj74NcNrYAMcG(L>S>RmPyi*kmZ)J)6=S;Yz+}+ry zP0dI$TY-m|$$=5>k{L=o*b)2pJY94B=uW-Gl^6FT+K(<5TMODO^X!4U%nzex*=jxX z9rD7eD7|>LlpkZ>?~TQ+E=p*8ymAr%R;5(BQ72K!gO(pjV+=BLFcM?v$f&L1He2l( zb+RAWCy%CkkN?(ndw&@!X8wRzsjeaOJsIm|>8>}r4!Sg3j{jtDw7*k}=nr3ZtJ!E@ zF8j`^?e^$_#^*bd<%1DIjl1PA$FJ1W)=LGYC0 z)>PY`=;rC3+gfzIYT$uybr7P@@MDihwA2Vp-;usw22#VzD!Tqy*RRT`OTO$KddM?R zQm%&bOsPqF%gpx6p5>%75^#fK6bC^RHNFOjw0~a%@@!i}lf&QP!=vrZ`H)c6SqpL} zIoZq~U8LEIf|J8iRp1VBlj?44b$Rrqe5L$$vKSdn?%-CIVuAKDJkh@chnZx8$h#3m z`ZG52+P*HugR7+eJ^cZoLR1$Q zyX_k=#e0^f3(n&P*FBOZ4C#hSpG6Jo)WX|dw&V|bT~NeTJ7f#20tnjjwMok=8+cxS zW3UmJIkP6A;o)s6a*F(P;HxBce%-NCkPv6Q*2s7*^q*35xGDZS7QL^^N9gA0fH!U9 zc0&(Gx6R-i_(}@g=KoA>r_DY609ot9^9Eef2|zK_J&bTj2^qslPq1!LUTfc-3P}Pd z!ii<^D#hL7+OF3diX?$IwPQQRF?V4PbMBRk@kf_ZD%y-wd@|JgX|Uh(=9Bmaj_p@f zAu##N1}o~mM}3Q!Z+yztt1jx#{B0u8L-Ne6^d;Ii9Z*0LokgYHvBpPqPK8KStQp=q zD7ILTbbeFnKB;+kY~r7xZn^)p0LX&z0Uu{6E0dd(L(Z<0)CUR&QM;LczrDYBQ-n@H zqL@DyS4XVb>9=_P>;L^-%V%)q04qBsy13yVXHdfq33vsxtUt&VWqb6iQg8HCN=Q5o zPU3znLsY|90;rR7&xglzR=5}viniHLBm;MW=q)Bbj^cYj!D8iN9k%BtsR5{E<^!ls z2}ABkfT9_U-;Dm^h<7o_m%&VXpl!lgJnA9y;y2eOb7FhY7O+CZ(8qj5#eGmtDl2hV z%k|TrF95pKJ=>Bm(w`7CA}pjg^I@c|4tm0a{5@qB2=IQqQGtqK<2|~Ug#1>Xb|7PI zIip73rd=yT6k4Yc^gV*jg+h}6J=sII@%gQ-_^PiFiHNcJh|Av$bo-P-m@e^=Yd&w- zeqXVv)o{y%tB)d#*x*r@2grkgO!HjwKuFql>H=R&A;Xt+ata3s2&I2l!&E!{KZNXe_`xaau8$xHK@ z&C#ptt2L}q@omKWaO6aRCfq#-KUb;SveplI z;i0knID|>J#Z9r}LBwA^g-kJK+rL-5qV>E}YvzDFM-gC2{MpTFNJZ5p-6rYS2~n=< zIGc-UHJsviwQ7W z7OflG_fIKZc;b)?e-sDFI*onh3KgEG0zmNK4#RR4oxl(Ub$~%}lPWP^}SO??yuj@s}+Ris%1w^}Gj>^6kJs zaA#_f0OAPeFZcA+@9&?0%%)>#H_ZTo8?pV4k6&fY&{tV;Y$NVF5#s?ra2)f3@5Q#! z5YKK+UfkUrJY1Zl^5t77HnDm!{jkf?bNbwj*mK)Q3294QW0W<=3HyiKG6zy&C*qLj z=E@+>t1#}5n@9#%sC!al*qv%BcY#wAcx%E}vB4kwQarM%c0;ei)T&5duWm56rhV;A znL|ALE=kjUb)w-ONYXA7X%fRyAC0P}n2H+Yp~vytjLWRpjL7;NM3N z>?9RAKk~UBD&nB-rX2~F3yKXce7Bg%^5=xju9Q;%p?@KbF7mqR=vyA~?E{gcm_aR{ z8SurySGai8HwH^(#8i6YjoZniYO7q6w~0mfsE>!f)c&LN&hMthRaTVTvfbHep{-Xe z*@vA6ABb@*5I`)ZC3KUplA_YnYSwScHNM`e-NM<-jjVeAuf4DEigJ4w9yo9WR0IJr z2tfe{L_|Vj2nkVYlx`3d1f-O12`K@UQer@A=W_szz*HX!I;U^|IA ziP4gC`XReB(L*R&Cbu73Gx^{vX7JzlDO;iOk;+G75mHko-WT+)Y(Sxq;dbI6xL=&x zL=~(CArF%&>bI|tlC0OeZjjOl>ob17H_w?nUMSdZ2n<9&wPRwX@>wMHoLjM0Zg?Oy+5D8MvZN^iZQi%*S;sHu>^BF%9)xRi~XJ{JNR_skU`qn8WeRWQ;+vc&b;Y4aRE) zb1a@(=qz{awA(&kDNS*QvG4c@f6R0B0lc$5=9G^z%r1Jx{GJIkyO?wdSdhhs!0?iP z*BdMfit)sETjhwP_V)iyiC4km9I7suO|Hqk9AlV?uVWXW0U^yCW#Zf7(eVdKNU4{^ z$jFx;bVlli`=e2b0X%O%wx50HdHMMszJADa+)q!zd9PHRgv=?b6>*v$M4AO|A;t!K4Mk}=w+cLlhneaz1V)!r3RNw#0+_;W+V zFg*2fj|EWyA9b9qdg(%HXv;aGa}FiU5;3MZn^);o@pPk;S%JFS(J2d1Tc# zbWYiE1&>U6phBVjFK3ZZT=h8V(JnjCRN#`#;k-U3eC~1EdWC%; zmw$Qk{Q_>Hyt#YfrNYq4+Vl3rH?D=YhgE!s;sHUZgk5W49jQ-YCwnk|m=ryjv?=Y` z|M5-6V=v+8xo-hUZ6YgscI7F);^YX~Tn^Zz8F}ooOFXCK*;^izz(W}IKz1?>DhGKo zh(m`~G<*Xkk!yuEi9tFu&o;5O1u0ejw7o&@-ETqqBQ`>=b{|WQosUk!)NbybmSn*> zRJ@6UGKC~Eka=w1Odik7GED#hf?Vi)cE&h7tME6KeOEC_c(LwS|I1wY2R$yYIlQ;P zb+T$tQE#68+z}lD)e~>RZJ#}?%YI^9;}>sG6Rjew-|+8~GKPoe7K+Q|X# zRgwacdmP>(OO6E6?}G{A2J5ueq`)@`BO?h0g2T(S!s$fc9HET(W2j(Wz=2&S1r$gtv zt80RCSn{j!VC5lU621TmG#7O!;$=vl>sUFt>S@2@vPf9byyJPBv%%p3OJ1DLNQFGL zGcg(HCKnLlHdgqCKnm$C2Eq{UkI{)C6w>U}x#|H)(HT^YCYOUx`D$D=bJCEuR5u6Q z{XvodE1T^zgC>QyK|KX_L`Tta_ym7lsN{ncIF6Jwm=q9IDk_`1VSYALFVlbFAy)d< zPAm-L?Hmz=WJ7idZsBxe}O|=>WmFM{9 zr=od1oP3!U20@}EAJ_TVGjpm&Ug0&my3z7D` z5N1&3ZLajsXu|T4y)~{T+4F0C*5^vj1Wa*5fS!-ufM37--t|@5$~qXgGv_=>FKs>! zJe(gocJjfV{)Nnq8(9zGD*fjsN)vR|X!_cxY%9oJbM#^w&&q^bT*=q!IPWZfWe*^6 zyuN`rD^R9FY^#vTyPdfOHlGCDakDB1HorkJnvmRjNzK6;%*Ik4upHOCdGyHQs!rI9 zG`8tK62nc3LM?hQdXMi53s4aEqO!3oP(^|;?1h)Xel5QoXP>O|$zt?kEk%`S04>EH ze7?|{+rNS}PB8jc)|^1RE;p!5q3%ko04Vx8g7wF`;0|Pc+`qw>uRu2u5L(X%+ReWv z!QsS}{*toSOUh`0P+0|upLg$e-?EaD3)2-91BU_rVYb=myL=3WyBfl7PGQ~PYNsWe z0JAA;;84L5ns|eGIWp3EW~?cXWSC?n6X8;T?PI14pucy{seYmD)V=U1OLDtfa`&3z zJZ1qGcUFJc3ORyEw4f$&jLx2TIO-2ZP`}lkU4YcwX|F5-%WFw}>z{wP?nVLiOBB4p z>MPW_QB-EBsWyVIr(wAHPeyxj|NQ2JI?-@=!;05`(WYo2$sx0F9R7QGqBHi39w6~q zy%n}^U~Z_eDD|rHCgTqir4%yDcf_zAAGuS+{a7%FN)JS>diE8h(Or;^@jPh!6xb^r zx}^Mg&QV48qa_&JZ4iy=u{4*IH`zn|E3tSdc-4B<#CqgBi54-D!fm4!OCtU!=A;KM zs5h5=hhPj3_m1W^pwSB@2wr~32t$tDQ?33=?k9O}_rmGeUe@M=2?mftUqbj8lV{iF zaKF{`r9FdpTg6Lyo4Cfb4$8irB{h1fc&P`l3ieRup4xt%M;WlzNoSj_pf8*Wb4+z_Cd})3yhAByUljpg@#`@6ZMzV zccfu>p`yyxI9q@oRs&LwQC1%WN7PXPgM-t`o#iD~tlgJXQ&h&gj+dV5BvpOvExy?5 zq8_MXjxketWJHdr&G_8_t6Rn)&hGT>lfn*el^&9>10nB)?n=kMffBn?QGJc!VXKVfz})WUqN%S!d)@;YrjKpa?5 zVn3#^au!^zhcji$O#?7qK>d^h|LD<#4;j=}3j5y^lG-S!5#7rr>Dwv&6V$bj*9xNF zdkDzqlRAYS!#LM(k|r2b-vCFoPR5v_^xWA3}(NRcw&N$m_?ag?*=WU}N<{5JQWt3#zdP+|1N zCkT`J49Q0hCSO!OE@<~Q=?@9!@i@ni_w^D)J598BC70GYi?c!_4jjXoYfNY`<@c^P ze!&R)(WgYy3WbXW;4B9?8K&YZwXmd2{rVF|-b<*S47~5b;ZUpV!Iu(TZEGwKw}z9Z z^O)()E3zB>V|)}OT0hp006q(_!1IW1s6`tFt^kL5Dt0a@+hBxz$-*s9+owrB`dKBB zmAQMvO5;r9x#|+FT3Y8l%S^GwdSBxAutXifKwyfoFmc`A5gbN&a&x!pP|UU;(|T z*i)~6Jb%Fd^@j|*=X0Q;Kq97*dg}GeV)WHV>PlBS15=;|68;G(s!sK?W%8{3c7j}g~Sc9$*rG&&^CMrrL=}~6fc}~zDVv^=pOU4b7URPgDQ2R4-;4O`TO8- z&U=;|V7n|w-_||2GW(tc+^w3#^-`}X1x&h=h#N%H&R21)s%cob=%DDmoXQcajN)a&1A9MU-j4dG z!uY_fz4rh}5gWKu2crYGQ*=fXqO08!NyNsQF8A<;E`*%4WJ zRP@~FNyL9@ zTTKbPMpvZ{g;u}rGH(#%&Tj{)z)p!U(Ie_9UBF>M$YHO`9A0!+*WLI&H91qByu9q8 zW^&sU^(L+Hw=7nAVr7q)^ZEr=tJHiuMPg+6JAlqm*s^@^kR7$zy8a(imMrLp;yl~koJ zoFA_t?Kg8t+#N-nJ*VQv3hSTmGgAeiEFe(3$@hEpHAa>6qZi}1{Bhe8v<(wzKm6-$k+yPw#?(X9Nf>lI?=_3NalEQ$g~mQ^+NlmU&@?~e5MNAJCge(&If*}nmMA+@># z`5LmF#AsTW)J=(hCC)e}1pom?W0kC;ueKhOFk;SEWb&@sk8jP~(OC5Cl}4q#%C%0_ zr-&D$@SF$j!|*(2FXhjio(Cg0kGEGG4xQf{Xe#Hjyy%NdD|{S5b7kFNSa5VSlv%=k zxoGJZInD+rITKhw18rr`7^RLm0xJtZT1nwz@7^34SnQus_l=r$(dELuG8(%|Qpq0l|crfC7<$QRKdcb%lnM zTa6#91+0_vZg($()3!BdTyq|Qf?;E7aYLJX1Tk`e)JuaBq3$-J8wC=|#vUX#zgC{8 z`?n9FX906F0&mzO0S7tRpZE7aw6MukrpS?D8dairG%#;Kfs)nsfvf*pt-)lzGwK48 z2D7xb$pp5mLdd2&m)GWi8M9tlAd*|<^naE8VjkEmpx)4h;#zWQRP#>&v~G}y-}{^= zeRJ5;6UU}mujbfd}Z^iw1rBRGB{Bf(DdYtNFJMz14k)*z&TIh3Z@Ag za3~xqo})~0{jg}-PJO?|`ksZqF0sR$o8f8vJ%#FVFk5894Y?YaqzAC2MzWceb9N1r zkKD-SpBW`h5A-EdZ)#0}dR9Vfq3qs1=uvQqO_u(H>`{rJ<$CxT9YW{h+WTSFW4rPl z6f?sl55WO$ZwLKTp)R67z6(`v^j}cVW)oV!g&(#Cy%yb>-SolCd1}u@oz`85T4=iC zFn!%tn>5KEUTLkd8D81FKC_ce5wthzz>7~Hh#85dfcVG$A74i=;Ii(7^4Ux^cMR z@QY3|pTo6+p`PJFP1TA}+GbnxIo&-=)V1}IXy1I*wZ@mM#-g8W&$30{Lf);uA;16< zd*IF%asct3#Vc*zl(=gpF<{d5q{G3HN5NqHF6H>_nT7Fn%Q{YnG+jk~kyyL4I$;?T z^q%4Q@|2yepGAwN!=kFg)g8P-)g7duE(Xjy_!BU{r_D#ik=eTrK4xx#IPfN-Iww9w z#9r>thY~b(`J>h*Y5MInsP%;-msa%d$C*l%9-~~=645XLr&o3L1%BbYEx0~&f)eBe z0Mm2fJayx^3|B**$z_H2v1L6ppC%OTt>+0^db4Vl)viAp>^W{;r|ua}=S8`Hb$O$!gu`-qxHOzv zSYOA5V9N?5nw4P%1?fv0dzJOb&72iLRPHUY7b8bE(>C}0&h6^9(|EG3R*hh=<{g>O z5?@`hT*^u3l*DYG+C8KaFDzL2c!R^1AhN@%#^AkHuY)+I4pi1hPyl3UZS4FMlX1d$ zmrVHG${>?6D*+PZ?%qVt0sk(O5Zu9krtZ8rZ}CDdxw5ewVLM_RASP%0=sf$wLmpRv zb#N5+srY0&^7woH-L5N#{Zxo9f$`skPVh9o2>p(0?#8Sd{RAVkdL2mP;@4)&`iU@U zCyn23KT13(nU6lMvPgh`Bc^7Qtb2UXzJavADD|yPI#dfI>bCX$657^Yl}M7v)h=I) z{Fcb5NlcI+n7AC^ktqLKaQQK}d+n%;Jg&>{oVGnSD&0`CBKHjzE_Z8ps~)wR$z=Qm zv-_>5iNv^ThTZ+nR?vbH_PP$iv|}qFx=I(WFZ2ZEVI3K&np7rx0uA%nDH%L31uR>9 zX^R^ZKZP_$eO-Db-Wth)G2*1AX$ULxG+5sMwD@`y?}qKzWQS-1tBV05=$K=^k4Tu` z3Cc^}bZ`t7&RJJWY_gkQW_PX8CPN)n_N}cx7)dy@`1ze8~=bsN;KB|ckhzIM2m%} zstIQqodlzfn`Y>OoL$7^Jpv4Nh(W~sR*CgrkN0IXRW?Pc`Fm1RrhS|J z^6Dm!(&*d{u1gB3xw%3t!S0C`j7X%MPE_)aoiH`VBoq*2)>|J4y(G)D!hSXRkb6{J zw{=*lsn?Z&<(Gh}@mQRpal+KDl;zSoNi2;jYFo~|j^TxpcSpTb{`R3>-SiW#=T#v+ znbm-D!F3h{w6?)jLz zYKugRl?#ynHsX5YN_|{&j%#hX+&H~DFiyOsBpper$4mg}9tDBqTN9~vn(0l5K49u8 z=vx%@K_}N&&?62NnmOocCN>OTF{`3-rl#xpt?Gl4RB~Dsbf2gN-_B|la4DzePRsSi zsUEyK&qomP0(PKYHx%7}c=A0V*-*eek;81?r8z}1G}Fr{HZwVz`NzbIvSuu%MBEU_WAVcHDrH zsEtNqF<)tvo>>%dl4hX@ysa9K;9lS~E}Cx9{)xrSNDak$-97r6eeFMT0P}}fSgFi@ z#^@!U&q0wtQ>%1H>7Zam!E4<76Bfsw&Q8Y@U^CM@yR%sSse1;VKl8TRLg*R+cW)2V zP(~Q-i)p|m2H_hXY1)`=dg1QaRTgIBsL?LJaN&?onj`A3D6iNt(Nn+RX3H-V4Z?$) z48X_xOCY#x!WM|x{Pci~ri&Qm_~Z6`A&oqJC58$$YS*-9K4^w@z3$cFV&FpZpSTyV zVt%Q+qGx)?xesaxAi(gCfFtZt9en6VZLs;{mf)*6=V>}qVTP*UcUjN*@=H4BRsnA~ z(h{4>?B>_S_7xQMb%F;RPZpD&2OFOuqD{VJx{CqvY{fFf z**JIXiK3p4d{~pG&B#%n`Too}>SQsj{jw-50|1ZVwKAnB7fy$J}RTjy5Ce^ie1`|3VhtQ}AH2)R98hI@%TPsd83eeB5sEJY0rNa{m zA0M~_hdPcR0zaz=%uq*jWFq4A+^meIrzoZV+Iw(2lqL;wwcU~^+~U*ok_JDt8m2kB zjn$xf_u$bV~VHy5FIXU}FJW%T!JLLHX<3jf6v_u&aq?htRfxy2=;S3kC z8H}2p1mfA}jotI#2|*sL;VrP~k219qw)XurkIS_pG)vN#kn0pxLHWF=kO4qMqK@|N zg7|>9E1yqX*5I_$d9KYYntRw5KbqdUsCk0%f*Jh_^f*HcQrNGf#UOw& zT$%mG($l78si{P^tu@9s$CrQX7Pemz782WYLN6n8uv4wqWI{mPVrXh(13p^YtM1{x z6?E97#FA@XDa>24_=Uv*qd2`1$`d5C_@XU)N#!7Kb{?nqXWOd|5Qrc${iFER0kz_8 ztJbgRR;+oRx#lPnt8-QSn(zf`E?AFK&4~4kbWTMz7gh&W$LTY}5YB{-q(tGX=fr(} z9_;j`_1q=M4Fv@5J=m{#oxR8XU^$cf>-%A^e031y8D2kIAo(E ze`ZJO7EXj+Or1G`Xo1#i?pIIO&?KHX-^9agE&C-zDDRg+Ac1%WT-rex4|Dy`B_Vq= zfp`@~oQp)0v?e_w%_~9f=+5rYr$lxnOw^#MB<$m(m*Q(HJ>eDM3zY@alsE3VD;p?M zVSdfyO17giAT%4S0k@2v8Otjjt*_4d)_0>+Me7!DrmOtd9b;7It_1 zZ*AXIU4U@#o`WKnVA&))zBT^Da=@Q~mlhDrxdFhoCEDOi*9zLie+oTUB2u3Et{Ti& zuc!L_-^EtNV~OS%wbDD#*aorSYHVe8?q&*zxOkVlzO;D&C-J`gA_N3~9spT+maeDzP-JS5DM4iHeFuby<+E_8pg}MC?6dsNz~V53OGn1_C%t!1LDr!tIQ0f5d*1+qwfz7x8gkr# z0E~k#eSFY8aV&54;}LX=FBqye0Qz=xvdD*c5_e_H_AcMlY#!xvhN^n!R}cX29uRpo zFa=S~SWlCsWPRn(*ckgpo7~TYn6;EJywTULiVCy*bY?r3GX$mLhZH8M$#^Elb~~Ig zzhD$U3Zj4sV+afu4&l$IG|CLTg7{kYvPEn^rsVL6ALA>T8|rchJHeRKN}JAsrHL%-8T&=-8T;l#_Ne3Kxg_`PTqUJNb@5LTt!HGH5zEPGV;&S)vSMchd z3<1l|TLI9FJj|UQVo@dtgTAdV_~jq55GPt_7?GpuUZmexezku1N`!K}MXINqk5_-` z>GWiM+QDQ$`e1J4pHiI`Gu^NYHZ^kY*;2;n1-tn$M|T29$`>_Z!iizQLTGUN8oQ$jz3gFS4*x& zHYJ2yVshgZ)v}DK9WRIT^Dde5RhqRI8+_Sf_w4XmZtD1wiO(@5=NmVh{0%wL38>|B zA|=>F;0Y~5CluW;+q8Wa&BpneQKE__HK-7^fdX0z%FI>aaDL6x;%3wuLQ6P!9E|gL zY-wiyK!DHVzKvSBXQa!bkri%E?bwM8f_a-6V7lrBV7_k54nn3@@!X^*LuG|DprEkb z9WFj3EH-PR_;sY(Tv8WY)a;ho^C zHZ5 zbOd*;v6YSHs8xuY1C3bit+|fijRHEU@fM^j?SnL}xN?jeFi;H12X(8M*sS7HtdGRF zZojKx4p>g|CfHmU1v|JP3pb|UEy_S?S=(@ZL_r4GKt_Q2L-vzp4kaP)Kw=B(rWiX#qaW6jhJWh zxB*4v8Wq=%TV}2YvP-rd7->b9^=B?r;%kg~ZJ*t&lVnMaWtUv05{a0B_}s#t)H}Wa zZ|lti!VkG?^~&z@19{eQI7FEPa0xwle8|XDBziOum4{keSq{xz#oai%Y2{Bhi(jbA zf1~G%Pmmb@KDSz~)g`Y9QP0Q|7&B}(R6Kbi)e~ShuWW%hB=tdC^!$R0#;-@}w>97V z-bxc&Hc6Q%ua$UTIEN-%53?=&QY8DTh28+?e+OcGr#T9Xn*`#CiJAC@rxorKHo!!N zFefa_QnrrI4lCKBTe$ zitt!QxwJWWg;i?Hg%Byb(?DADf;vmDiwdDGdhh9LERMwo-FYd|#7@*8|GMkmeQHtb zHe_0U%XC{%0_Wo=KkXUcW7LVjY!vvYJ%Csi0c`2~YTFs~HgE*=0(DpT?i-Clbr!*y z8J=6ju_26}_q>=5D>Pjum-+_5q2gE1*D;(y2^92+pLbXM4V~=M;%qnZmoR(lb5>!F zJcInXR1oyxvk-D!rtzlNo%f2)!P79MO4owDmyH83J~Bv&`R_l`O^mtlr#i-HDLN|Q zH1v^pFu5vR{FF*gUDxqpC>)v{fi*-z+Upb~@bvHuTJsg~8a`-Y>F`m6tO-L^HMCJX z$KB5TyP`E`zGGyj58V-m?Z2z50uv}yAN;gu&Q{M&B8aCWRGD)xPha9O-Rmpe#^PT7 z8hCMT?b*ic+nz!iUX}&-fb69Y^X5#{77W(1kBBphJT3+-Kb<`HnZ#d4`B+c8yv!jB zLP#+fU1htYt6UTz-fC(_~~s_r?d{Uhz+;)AYLd-=}S3;m8}V5*wJG zJgMOzRrs{);+Xtyz|p+8_2FiT=-#*d&Hu~-=td+75=By3FhRja-kN_DNIg=>5Fz-S z;y;j~`o>2;EN+8!uu{i}O?O~!Qvk#TaxXStw#9sq_U_cOGh0`>$9mzRE_FY9n7mJh zP0{b34}CJUZYp2J_EuRoqtXsa}6$;2ka-@OsR+K!l_Z zY(rg3-0>GcZUy#acJ(JOc`56@@83Sw|Kd@Wx^Fj6*-;tq5WK%C#4fxfg8h~^vl6DR zOh%yOpe$giqQx)x{nAs&-OeTV!+bN(tWgBp(=J1uHtk<wOVYt-m(-_M{A;@#fu?HG5L8gCdImz!2XkHDkQ-En zM)@LjLAKcBB)Vri)KB!a{%N5#ZuznAPq_i*7!wt^mdOw_DQWDv!r+Y>Z%aaog@-CS zMi+e0Ji51y@E2848jKUosR_kC$>;zr-H#?d)x>!L!2(uZg_74JIKD6jZKl&DZgKc~ z2+lU(#@q;@Nk3#%zugDO@Fn(?A*|-{Yq2??^hy%LK+fp-D+FH?%YAHRPgt!Q;-H|kpjiOUHwV3 zOr05#Han=MG{wU18z1BOnfgP*1tEPlS$A9W5t>O(pV*L~WgHaHyU^544$`6{zD#$} zs?M&@ZT-gt-M$216_7PzhPvGEt5$~%I17Lhqp+)MpzZ8fKOM@_$8AKUm|1O=7JdCC z!DtOC1CrbXByj-Z*s4?AmmH5)D?Q3uorkx$pxT-_xLWX873lDpxp}UgEr*=K8d_nG zM7+EBZkRxl0<|!KH*WVJAW(V=g*B!1Db%-r-k4G+irElQCq-t40a!m17}E4E*mA3} zYGg4Ysz#8Y0N{MC9_eoIf*756x>oT$A`L*kWvK$}COnE3Ab4$%qG1jsz-%7!peFsw3+Lm!S-kRIlxB z_I1~eWs~WcRdQ3R#PYbr4-%(k2+gtv11Q`O<#Sq%oQaAZ%=S>uNw2!;?5`3`E(295 z=xn(sxtH4+tZHu_sH|M`siqZg+{wOSE5Eig;{TOUr5JXCgaHkZwpNvwvm`^QFj_7R z@;_d<&Mp?k@X_ico@6qqr~xkf(_X_(k&tWNrh^#u$_G8i<({jLTDC8UE>=DkSxNc0 zxtZnN=|VY0gE*hfxnVZOYAV zvHKuUq=^40x{a7y-F6EmaH2Fgb3(mIwQ#~0Rf6z_fI09l8tqEWj3p*m$bVTX1 z<&s8m$1hsv0wPDI7|x2g)2L$*AwzpZz)iT z@J{BYLd-tA(q{QlM(xq!W_>!*Arzueiw%e`;R?G(s^dN$J*A_cyy+=XHj_TWao4J| z{u;fd&L@IkJfeWuTSJDrW%gFqdV_wc^wgEKX62dQ!)HT7kCH!bM|yecPjv!*CMtSO z*EfU9rseD~dejSfV{NqP)2i`=9sRlnykZuWVWeS~(C!R~VX`>R3s}`J9M3I3VW^@P zt$UN)QX8Lw#zZL!rcH|TO62bN+^VB(U}sNtfsl1`~vxn<#-)$3o-rMWwMu?vAo%d9?o zYWtC;r9t}}ErY4)zEMbaw_pJW0#2l$!~s*+x%zt-O24ekFrb0;>Oh@jb!OTF zF=1Ds;e!yH!?1e?2R)L?_$1RCX)J{a$;~ilW*6}2_8=*vUlxU6dEbGUW&ts+cRHht zPF7U!nVJ81v+;)??C!3$S@b(IOoD5e6bX!wy=GK>S$j*Z{l##%&H0`tv3T}vHe!P5 z@%DjCPZn@Lu`0jK+|TYRtjxsLty+WDWvXkvFZxLK=^f@Nj8kR!fU`MQpzA@8Q>pSb z%aNn2>^y0?4;A4@#a&*vp1Lxe#-gvslA9btE=u~O$zAgw`!^^&K@Sbs>usYDUV>{_mW<&s0)e0qZ&x0&- zYb1KQ2}L^eL)%dE9bRm>83}qsh+(&LYdcaXtUbJgpqCktdTT|cFP)oKSQ6H(m~Fob z?8JDKrz5Z!P@KR!GqdqeY?)UfojBvCy=GL!IEk{9B7qlMpzZ?8rg_~q@U0P~IL=i! z4-ZT!P+2aA2cv_a@USuRz2N*g>Pmwa*Q#l0HG(YE5uTR|$kY7U(9F{V%AdIo&%~AW z*mbtZM0n&~vp-L(c56ALD?G}n-?%u|n&$4f^BiIAHq@}zDg_~X;O73f{56wii9~sc zPN8s2WFK;JO`;wNPtevaH<;$2V6!F|FYGZSE(3Aqp`#|kBqDjU3V5N28MB-_qd5Up zB}LZ9h~PxZdcF_7Hc=8tn`R}#V-QeiwdfB>G83{PY!b@wZ^EG9?v3tWvduSld#bxY zPyR)S+pH~@=iUz@-q#C(an`KX>y?B^yTJ^StlIA-hxZiWv7)_rs_&|6mP=SUeyii@ z#|M#K1|n*8SVyiGRiIPa@r0mitK5(mH3$-#nZC3z>e+9VQ_A<*uXbGq=3qqJKXG1= z@T=RxkPnIhsV5R%`)RjyuGEnO=zUe^uoEzAGK7CH!H5qC77S={w9>BEdnB+Gr8Q3 z+El=>wFnJarx7!BbePFE4 zv2L-729{1xIjSyE_#opWSyUNoh7#?wJN>UJ>5ZZ>`+#uIXjhx`I zWfxWvy1*i-T{bvp9htAW?)~&2pbGOohSb{m4WO&4JpJk1(oRs71bNE(#Gl3W zKyYBFO!Iwu-YMLWfA^xkJnma0!CZmbEL8YwxN9+T#GlsBV{g4vIN1H4@3v78N}|m= z)t!-jo&McD|IZgKI@KYOeGC5Gz5n$^EVSYjFn=FZM3C^ql3wlDbpkJd7(!JS#jArO zvv8yYk3A|Kae{vVR4a$k1eH3P!PD-ZMrFd0Cx|aXnQlWfphy@TsX*A5GT7Iq0fE}E z0#o4ky)Qvkr$$URY0r*HP8r|qNxR5f9eUU|P+6=QT;3t=!LtmGB)A!#JW%Tj1os<& z3z9<#9_PWK!ja|H{nLb}Hs}DohF$0_ISfJA!P7QPr#3w4BTzYICq1wvSLmUnV1u-( zD1%%0k{wVm>^sRSV3J+XPELowk;2ZdwX3Rg1CSz(yY!qqH{(4Zj*%R+pLrbGKObu) zj~lZfI3FBNZZIV zm;l0r8J7O%kv3345UTyxKY)W4-43zAu9ZPCsAb9isTRQ`rwFT|&IiNgv`7PbTjCvF z+7}^=(Lia$KKi=tN-}zCpV~ z=zjjLS~N{bSZE{xu>o&NDu;Aw8JG1#P6{jm^iv}Hp2*``XpXnk<#DZh2*Pi@#~~S7 z9j6FG6@>$|JeLeXTU{v4{)39^;n{Ex^AChn1lCXlJ?5a`OA5M2*)15Zyj$_==SH5(F_PiP~_8WC_N!kPB28i z7MV@^^WQO@bcqKb5e*>KJ5kz(EQk`rLFr3(zhip1JWf^F&3B)!I3bhw0JQZ2RiGhh zk=-it`5N2GKOG!T&GdS3f`%>OqcP=G6AHcZ0x%SeePD6<@U(MWu6&-sQ64A1P=qE1 zV8Niu8KPwqBmFrhs$O&lB+#_BC)?(lH!}!}`d+(Hf?_WT!4@4fuEmX_=gYNk%~ikIpIo zbp6r7M`cpNR}JUx`~YO(1W}+cr9LIL#aKssgQ(E7O=#2Yu$>>oE+f*$tCtQ1TGN^2Wpqo^)JiUWPvS)reIp8hP?A z?QHzs6lO3}S$(2HMk0`kX@LA2DH<#Yg7@RyTQ{&clb_xxE3VLFc8GZ0R{QEw>cg3svQ%Tr)YPw zTS9621R(5@|MA*McnSSM021XtAN9ZgPoTtKI-Cf^UpoAy!(SQr|3U^1j~7RXAa~-O zbeum*Jx}=`qwY-#{Kub<*1JD`7yRt+pHGPLmnJ84_$v^9l>~G;|EF4r=Gw7d80;b| zbT7bP \ No newline at end of file diff --git a/logo/images/logo_abbreviation_white.png b/logo/images/logo_abbreviation_white.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ad3ba10ad86c1146b69df53bab079da8ea80b6 GIT binary patch literal 66732 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

5G?Zng1tjpo}M@oV=HPcknkm6HKV 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 literal 0 HcmV?d00001 diff --git a/logo/images/logo_original_white.svg b/logo/images/logo_original_white.svg new file mode 100644 index 0000000..5f96124 --- /dev/null +++ b/logo/images/logo_original_white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/nnpackage/schema/circle_schema.fbs b/nnpackage/schema/circle_schema.fbs index 42bce84..89e458c 100644 --- a/nnpackage/schema/circle_schema.fbs +++ b/nnpackage/schema/circle_schema.fbs @@ -26,6 +26,7 @@ // Version 0.1: Based on TF v2.2-rc2 + more (from TensorFlow `56d281c`) // `BATCH_MATMUL` operator, `FLOAT64` tensor type, // `asymmetric_quantize_inputs` for several operator options +// Version 0.2: BCQ_GATHER and BCQ_FULLY_CONNECTED are added. namespace circle; @@ -358,6 +359,8 @@ enum BuiltinOperator : ubyte { DENSIFY = 124, SEGMENT_SUM = 125, BATCH_MATMUL = 126, + BCQ_GATHER = 252, + BCQ_FULLY_CONNECTED = 253, INSTANCE_NORM = 254, } @@ -464,6 +467,8 @@ union BuiltinOptions { DensifyOptions, SegmentSumOptions, BatchMatMulOptions, + BCQGatherOptions = 252, + BCQFullyConnectedOptions = 253, InstanceNormOptions = 254, } @@ -983,6 +988,16 @@ table BatchMatMulOptions { adjoint_rhs:bool; } +table BCQGatherOptions { + input_hidden_size: int; + axis: int; +} + +table BCQFullyConnectedOptions { + weights_hidden_size: int; + fused_activation_function:ActivationFunctionType; +} + table InstanceNormOptions { epsilon:float; fused_activation_function:ActivationFunctionType; diff --git a/packaging/eigen.tar.gz b/packaging/eigen.tar.gz index 65337b4d2c467389fd511029007557babb478d8c..396d12fa764dc1c7fa321293b2d14b2fa965a4e8 100644 GIT binary patch literal 2664733 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 $IyHUa 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 L+A3Hj%i#Y7r~&21 literal 0 HcmV?d00001 diff --git a/logo/images/logo_abbreviation_white.svg b/logo/images/logo_abbreviation_white.svg new file mode 100644 index 0000000..a72137f --- /dev/null +++ b/logo/images/logo_abbreviation_white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logo/images/logo_original_black.png b/logo/images/logo_original_black.png new file mode 100644 index 0000000000000000000000000000000000000000..e67308b1cacf28ff217679bc1170a1863095a048 GIT binary patch literal 72968 zcmeEuXH=6}w001rsDOY1B1J?&lrA+i0Rd@2L5lQZp(Bvcn}8H)I#fw$A_PKLdKZK! z2n0ftUZjTJA(Z3?hCeJ+wLhd(LQDCj0OCR&wfpkAY-g8UA~IZ{dFKzi0YikpCVZ z1pTJ^@A;9CG|7L@R4;k{d%W@OukinL@mDQ>(ef`A{yNd$*zzwF{)XJY$>Luq{LP_% zON)P@@VDanTZsM(g}){A-_GJ+DEw`>{`R5&Lg8xad&|eVz1;Jks{H-H_g8u(r6J)+tJNWM|K;YkM`)?oe7X+ZcAo%|Uf_3-^ zaARm4Tt2WfC+|>bDkVo`ACgra3#IHppg^8JBW-owSK0AfI_*fNu7!$tS78|=d)h8~ z;(P8&1nO=*#0WR2)1IW$9%e3?j@D_f92houMY!(-0*&whyg?w>Zl6(wPPP%(ja2qb-MZ@Tly zR){(|Ctcp_Rnu4Jz3lkfpJJoikC)`-{Oxb`cW*2)A*EzrC2y87$`EfaHSH2u3X5-t z@tN3YTMg@9qP{0t_`OfKlUCtS7UUyY2bD+0G^r{saYI>4iUc_UGZNCe4 zcL-nnes=P@u0mjDV$@^d13BWQJT3Uu_9;?=sHPEuVkB**xru@UTQ~s~PiBO}iT?_s zNdicpK%4RbtWNv0Soq0niOMDK(Dc%~*}lmeVk;w^boKhgH;2FkWjwJfWx#Vwg# zaN8#m*U+`>M1SA0DAAf**8gzgn*Xr*Lwn-3*5w+d;dmysPBI%DB1d^7+sVYHCz#CP2ZzS5+NpOUtJZ%^7TK-a^ccR|nMZ+q2(d-d zwR`{;i;xpsz7^WE*z65HlTC1*K(2m+erjEWzd45LC|UEhw_(%H*|#M(h+pg2%Pzjb zUIzP_{J6&?NmLkU{VwsV$M&-P*}nYQhy)!uzR9b`Pl)IRH3>2R>Srx6!qsTI9M%OI zc$upoaKApgkvUmNSTRMeDx~EWQrpKL7V8&;RkmN5yFq)VvB2L1&!u@(xKpR?I_&Xh zJBtF6L;-6$Thwv_p!-SC_7B_SKie*`#V<{CB_2X(#|_TDc7Ow4-xxY~6KSb6CRD!& z7lZvfE`{&~2KZtG&~@(>0Lp~V+)Y3`lwSgWEY|Y=dzWK5lJI6z8W$1|yxDvO=?kQd zKgx)B9sTQqcK!0F@l*C3<6e|4_{G(a#ng0Tb3V&{H1#taC+=N7pyjC=NG^@mor?+3K`;t07N_BVQ*IG;^_!3u*Ze z7Ab2oR)Si!w_mAVl>U`F;BBNXl^UWsv$e=RcrE8zRxVtPd1wBs?F-`2_sRfBN^X=7 z=$T)W08};h<4ys{M${iSv{z|y?3kn<~;9waDB^v2-+m>zj_InKaBM=qOfxyq> z61U@qUi22BT2cX>CoYSaM3bKt!osZtUeZ`K?5ROKR`>ARdQfc1PZqG5tL#S*?8W&r zzo?4^tYpDW@NlWl>MqSc+cej8;RE_TrRVo#{cA*y&q9%ZD&aM>x6u89d^|qt6~C)@ zuz&GDTv(pg^6<giU48DJ(3E`DI}-~?*&?O19%$xB*$wLj*#ny7TrXq1D*?+ z&e@65t*~Hn;+euGFc6h9IYfYY#q+rY*i9r;pOHa!yj%XF*^2iJ2MspZ%qV>~@yA@5 zeA?IX{i6t8b}+73rezoo|e`O!Yx^Y{l(iCSy=hahG=PxTzr{kPYY;y1I)cXh&D zp@$C(UA(csKWIC%45UTVjf(0V?4ctz)PXb=D#;`Ji}yNRKT_6oTxWE*Q8}rYiWC3Q z-*0y9*JVR9%5=h3KtmD)lV9IydP#ZyM6TtU8DI~^;G*g?7a0yMzNyW+My_}iE1aeePgH->MUa732x>YY=nCjdtPpJ|7aD!&XgRR z)}$!pB}-Ngr=gcnr@hZ1-bU=>1+mb_Vc=^^4aK#!3&mTTsn~9Ie27#)5^+(<1ba?0 zZ9kf}3dPKoszN4Wj!#%$PeP?5Qk=Xo&%xLP6F&H$N z5KtwUY@330j77w_4r>>}C?9s=xg7O|cAi^d6DET<14#Oq6$)c5&X2?F9qR*e#Pv>6 z60DjggcU_v-fSNn7_PLgrSQ`lW0uU;Z1zHEI@El57c;mNpq)d~#|a5I)UaQ9Niukb z*3Iu`D$-6=aNsxp~R3Ipo9&m|W^{C*Q1(z#*TGwVO z{seaFfBkh3(tH(HxB)e2!n%}8&Q|f_V*TKLyVx^Ix-3$RW zeaeoH$vQ^Ha({w_AQ*o?r^l~CZ*n39Rr(bCc(X^?(e6&Q-BKLjheQQ$uSokagA7se zI<{Pg7;KBN16(%*(ca)AyO}ep%w<3&>Br_}OxeQ-)zRyJawG#~LuEd&BOPAznvFn8rnLf?uM}T}PS57-r~Q{4N@?6^YpTn1L<(9IvmZcU(O8 zs3l2H&kw@u7d?2JD}1*)R(4`5JL4<{DD?orpHC&$8prs1PV@~o5?{#3qYy#$PCtV_ z#Hat;Ks|O-G)6L}lI{U+7_68Pd3}*+swPnaIKMLSY-)s0YthEeatA>osb(~9{Mo*J z4ib6&eAO*Bid1p3G?jmJ!0%?fFjI{28Q4;8apE>YZvnIZGD0*pF6EW}K_a&7c)QT&QXCh-of=Wa(m0na+MB*;%IW%*JL9;NI{|Bt&RT`Q zQX2rMYw|ZUPl)-+HPhboTSr;Rj=w5s6ujw7(-*?AFpL(Z7 z-7}g{R~r9$e=X0WhkUl2m`|G)LQ+9MLAaqYC`)$V$?6s$$u2uyy=l>Ra=qPebUvZy zc}v7#3wKr7ad%51S9|EDZr8IG?8AqTT=CUUQ{e5mg8>{1L7{=Xbc985WuM|Z0O)jyz@;VCMvtBx6K*Jd1q@vPGQ<7`klicK3b_Iwk4XkDWhH?vLKOHt7 z_oz$7*|^oDZQZ}o_Bf%W2S>72A!?c0?Kh#N7LpQE(X8oa`^xV2JmO^?z-R)WCd!7d zSdzfJcctpLe{AK;%pv;I$dQ}#^?!Te!V{_c}ETRn@ssh0+~T z=D#*5(RUjAA4Dri^!yPWp$qT}w|@PpI!|KnqMr$II}c(BD0tE;S%Qm!yQ+sz-i5NL^DHx-7dfARrek)VSf`Z=kJ zXFokBo*l9DqT2(;!HIlUVFt6!uV4IbQ}b=*cJ-Vi({x5&JB6?>xcY|sboRyddZA+4m3K)3Lde@U%xH7Ux8lPHv{G+d~66& zPbfEDhw6#%>bjhUanHtR5Cdt2lwTfdiEsW07A9ZITpA!TmD8}dab?u`d}6ycRk@=X zLnTbfi4ch4#c~(GXU5X91(ZOJRl+P5g*=;M{Bte0b5TGMGAMoYyLE`=N#%EPWG$u0 zm=gv3(EH@N*x3R!KLD9RC_KIwg+lGIjT_kVfm5-D6>o-t;Om+)_NX!EX1rTPMj*CR zKY6jH`vKMsOd~_}?~H|nxL2>in=siqLbLYDJu?CrC#R6h&bHCrc@j6@|Ef`LeuVE{y-@y@*RJHrTlwzc3er%#=W z6=*!O>2gOLrDQqPc+`|-$)dYcW*M`Rm)U(2_iH3|&!SV#`s*AGK%ooDv|J+t!WFA_ z0;+u3P*!|K@myv-^D_yoFie6rNGp;G|4`%E0WW&CKls##Ew;7}QXGOHE+Mdpu$9!v z4D1eCQyIv-fm@mATEp!hHHD1GuQchZe$Sj0wPw?$=5Z0ug2bUs4u10( z5|HT<=K|C~QP9mcJc994Bs(eCgOGF|XsIs>sbp)_w=QxIM;0Z?$z3LnvQQ^Ly=(gl z6r85v^MvS=da<0Tu~PF}X-+;*g;@&ABeRw_ zYe7edvv*Bo?@cH;$vxk+)n7XLJ+>plaoig_dW8h39CPtZLCMz%Ixd%`1+yvN$%!q2 zP>mwy5eBlOyEfc1C@1VV)KZk~Y(Kd)kwIx30zlwQ8EQF4zX|( zU;UJTv$O4dMjQarAY?Gn0RVWWT?bZ6s-NdeVUhN3@80WDmDHy-&0R4U=UO5=Q#5E! z8L*ViEtLA~P@oam33^vcg$K}j z9>-hCHQ&{#9H#!cEBM7a?Bce&!+Y!tvc4jf(X%)J^5zCMzx;eo0ZFg#E&ttbWkF75k9xqS zKa45_v3fIHUlGz6TSiQBAkd{B%+jFAXKvJBSlyT@FZIJ$ZZz|sfl_P3F6uqj+g@|5 zpvCG;seL?vTwh)Eo6K4p(Zk_AvvdngUI-L2FY}UL5t99Lafi~Qxb>6HT;oJ3;5qqx^)Obonb(^>%cn%f3{)^D*}j|Kfb^KwX%_3Kb&*bo+90~ z>lMTAM5CL_`or<#G`@qls)@*I^6zJBSx{}48Yu@gHGYm40AHxS#0I@fl1l$xih25^ z!II4p^40##R~@tH9)fq`Yj&I`tvIEWTDf6V5mTY4 zh400Pmf#exrU6rrFO0i#5S?&+yDpl+{G1qWa=3 zMMpu3Au~>7V~ZBrSYBz_=Ws&^1mh?^#Zk&rZ4<{fJs^zLR_^HTZw`VeRTgT>OtcO#nY_iP#r6@SYGNu1S^IgaE2iz-t7FC z6#wyAgkVk?g|2$AU)4`3Waesqj166Ue zi2+Qw{4u___2ssXM%+cP-WYjx+ScuPUy-KcK9R?8te>cq*6RKqP-T9qkDwWIKA*me zqCWHTni~MXeQpt*Yo3OE<7qI&G-lqX>+|ln2aXUN3Z*~$YSFs-=49EyqR*upc>DUR zzBQXN#EApvfjrcd7QWsl$R;z~f!JE?+ck<}s%5^j08Mw3W1aMOC(Qn$Op4!~EGZBR zQNQ;DKHrq-Ucf^occyw8g6e4>US6mP2BG7Dxn&wmkA>cD==MB^^}E5brh0m>G}tQ3 zkt9f0O^HsE5%i8buF*h=eJj3qW8jpp8<$mh>Q}cj5k`3*@@DcZ^T;RwQJYcVoUpkx zrK|5xsdP<8=jhAO!+1Bj>kAEOS2$B6**W&WDF}Vpu@jqVDYpttAU4NqajJU_2*p$m z<~-BP4dFStVe%UGF-B zF2qHaszU4AD$Gyvxl(q#6WG1hl4s=y9dOiZ?C*2ULO2`CVX~B>B*vF^_V+Hq>aK=> zjUH63$eEoQXt491#mEUl@p~~5C`fNy(S;OoP=TZ6n+4go^kOYjTcZm!cvDq=EOwFs zeP?Zf1<|~= zpiIOR^l zdn{o1F6$6Dqm#-MvZM6+64A&R8icLh;LXO-sCb&rA+(WY24Hqm4`j=7QCKd$GFY}752WdRI=**cD16)yp;_Q_+4@VC4)X8O`|a>#Y|K{Xa*8 zE*Wzozor=#Ee(?)qL5kTg)SbtRC0wgvNpH3&+NxakP)SP=TA*A!<;-M@8DHz5F|{P zyb#ya0&aU+2yPfN)8hM6MkQ%mpDD3{kWYQIuC_pgdEm3lfD2vI;5CI}D7UfkioyW% zAmG-8WE+Ld>!_pYpiAIBHzsS`%llT2ikv*ukf@i6(b|e8APmwGx5M1pg*iQZ~PjPIH2+E!#2*M`c<_I)-Dau>wWk!W6 z7o^6}e&#kPOQ&hsKcb33)@8B@gWXsgeMvwx5OI-0{yJ9 zna68gU21RwcTprzGIGrKR?x4A=6_IRNuqlV$i6DW1N0Ezkix@h>I;i~xHJ8h5^V#> z%0hSZSMC$&n!B+zEu~HbNspWL&{`^AuNgDNp4Mdv8ME!t2^rhESmjlyD5k|+zQtGQ z`buivSX+qb2t?xNKHbWL#`4i&wevyXOW?6Th*;^WR7mTOif*=vWxlq7?06ckKcdjB zUs`37*UDSXBKF`|x}dj7bl&uL&k%Q+plQ;cahH)V)iXsX)Jz`Y{i+b9Xdb%!gU(%r zbXq_Vu*_%Z%HP$V%dglfpUI+g!OYIz$G}E?FNO7q0Y1pFewsAIcSOlL_ zh+~#0qfkH=vE+-lZ%B7anZrEcsX&;FZ)ypgDH|{bT$5)1vE^pPa6g3n68kvXCjrAr z+*mzOP6bBb?l5o9JPi_Ii=N5PVTQgVFUpTWKN?f^w4hfgM?cJ+wrbjVhNILgjOq$< zj@--s`etOH;k%7A=R=|pFrofsVEmSWOXSJrxqn!Yh1S)QTzJYpl27Bjt3j5^eSKlk z)?`9=wK4?}g2)J^Q`A-&A%YKc5hwwYOX7PSJJx>@0>g#ak`|%IQg8f4v)kTNx|l*) zp(&b=R)m4j>G?~E$bW1hwpu}Z=OdY--^`QN`>%bP{b?h8wvY{uS~^e;Z+4m8wKU$$ zj5sRUsv@ApV7LT^{RY-EQ=3Pgs&2!d{ZwV=82sSzwA^lMW(ETkS(nz1L)A4*!v>I> zz4 ztN62_^o|g}*d~#a3*;i}p0%*3ImGuhZsOAB)PSta%?**6sBq}~_=~a(;1LRZ7bbJK z8OBkER41cA@wOM^RD2&O^E?ZReH!xR6(NA*jQR)OzAm}FeOpo6Y@R5oj}S;17`U3p z%Z5<3h^?M0?0Wz5M5BGRywSqAbr(m?-R}WFY~bjkpp^H$yT^3|nt6xO_3CU~^HM51 zyQYE(2O@~(qq6hIy;hO!KWDNKTZ5$>dSP7S{_Rr5U|?h3lwd;8SM`?EW+~}h6j6j^ z$-jEj*y_{dMZxtbJ!|&N&x{CufAf>pjD5#z%q^DpU~j(uzMuy{kHg(>Sl-hT-hdu` z_+zmKjRzU2^RlTfv(6&zGw}Zq;=Yj$)z|Cq=CAl8 z*ESd}N1lr)ShZO00g5QJ?lt>9B}|@7#R#BchMsX(LUn}(%DXnbZ!*f4^Nt!0F*Br9 zv57pEkBCZUzYQpvOM{n9Uk^4S@_h67O7nfTw?XR63$HU3kgoKn&w~_@dU|?mK6R0T zw{LuKI~ktw1Cd5d7&FPnRuDQ+4^1M#Js$yfR{?4nC$DBtdY%wnbya}e9@u=z-S6G! zg0a7mzWU?Le7Wj4ZzCsPkkO7NSr|va;>9l;IcDiNSR}>2&BSNGOfje2{wq zD)Avh_nKp$a>ndaj4kuVev!{5uwPWqyC6u(W2t$O!_7NpYkqguv@7XQ#Lo0R2KjATo=?)uVf2(d1mL&`asX(7jb#;Y1?LfICo;D>{zQ-Q~|s%S1!Z6=St<0 zOW7C@ls>i)%Zfk%G*P#*pRx##msRblg#-iP`TBTe-AAARwpE4qsiPH;KV^zgr=_sl zz8-Q3O)M)w(>z0N_Ry`n?a5JPbPJ7YazbesZ3}#))8h7nJyn~>)nX3u8*7!! z_Gfv3Fbk*3=27o-k+W+TTKcHk47M(bVs7;)Ye~O8y}>870A(q>=SOzg=~KNr$ddfi z817Dx`iQ)sH>>?nlGcMIbNRH`nTWaO$TXw0fen8*v7}?7K^{~R;A%l9x)0vlfc4Nr z$3$e@IAULH(>Y(H1;ct8c9=7RsUim#EXm;F(VBkI%y3k#XJdVIda(*04RSt_$9jbb zk==M;k(c-Y0$O0aqH54XYCcjp)|jlK$he{@KI7NMl^_ZYfINUA(l&1gL9!_N_wAQQ zdj`5kSyDpXE3XC~&Y<0@IbStWZXfA$^pBg|HGDGc@(?QL z@-V8#K6f}-2b0%vHSLk8w_7Yb}*!bXXd72Q3+qKCSe2@T!Szikl&xLYMFm zHhQDyi!P+C!ND{3_H$QB_h4mJ{zq}l@_jBhZ0M&7QTQB`qeRb~=n`eC9|PylnZiI_ z4z6#Wqgr*U@$1-fzdlHrjOos0%)LgA?wn2bON5<2Xe0^-3SgU!%+~s2QFk~*bt(gn z*m4Pj_x}h2`j|2&**WX3gSxPh**Bg}X%DONVtdR*d5-$t(D-x6y`WbxBC7C^;AN!Y z>&?#mtG0JZGDi}lSznA|ddPJ(4(E3xlut@$zIVU>OnYqB!xSvc7oT+b)-3lvrID z-T?N!@Ps03B1dSqu#>XkZu5P#b*v)J=90NsW(L+vPmcrK@XQ(qzML7YOAV2+Vtd1$ zwaVTzV_2&udXX3?Fw_JYYGmyG_AWRMx2}0>_H>|`*VB`)tcp;JqFX8aI8 zm8OCte_8MK(}cYy<8Swg7Fi_JLF`bB`i2s~nfL+PNW%iPMO zfW#%D|75}`!Pkrpl*%Mim4D=|xLvGpY#S{Maq_hI@)s^pm}#`YIRpF;upgad2BtcNBm%$i#9HCG+oSx>9V?+Gp@ zY!!5*1(*j6oGJ2HnoHER66%O#bXM>a1qrG785)T^fK8^#JsRD7naB)v{o+qS=L%lC z!AId&6Gi9Y!(_5-TQD!6a(YbUDVx#>%i`kAcBS7QWUSmJn4@5(=i9EfCE0|Uo?avL zwXXaeq8MD2sxs|j0%eBQMD@UeAll*cr(TgIH>0MwQ_@uMW5S^}oP28^oXH#T1a94S znGnZv1qDj@a2A5>N3%FTV{?$j_`j1C^S3n;$`dr0kuAFTy7Y}cJ%(OjAIhq5J!ADe z8Cp3H&o}~EO6qvBOes}*8PDRqWcA$E^mJ@cI0%sZ%b?)YO!h0eySZNfPdRZlQX%I(@fpG#Zr%<~6BlDH^R&7gfD06D3E^az5)0%vf{(g*n&3>P1#wKOKq zL&^4c6+=QMsE-WA0EQDJq&g^F@Frnr3dhVz3yRADiW8%E8J&ZS3UFXO`K2*RqBoBR zrn%d%%Byn47S}FWAbN&Yj7)*rG;kIA3pD)H*40XTSr4mQ7f=LdJw8C3-eX!a7!mm8eyvkolMfY3lhxIG z=eZ@>TQk4|wXMa&9%^Wh#EtCH(XiYu0gl~%njBM1iy5WOJM)xV3PsU-9|HCAH7#v( zrn-qR)(MZgZc8KzMN>W#J(qiAhUHVCHS;t*ZDEDe#j+|5{k~Xx!QHiFr*^h@0_X)` zM@4*`NB7dTUS+NNOg!%V3Bn8oEQ3KdvvsXWjqne_ijKxYtFB$v6`X8s&Fa^2lob4c z(=yGFolmu@dmeJ&bUt-5cChKR-TtOZu|UsMV65#Ae2^oBwfK{Bpa;I(ehj#0=DO-k zJ@ix{p*uiOw7JtP?x=XhIyTT&wxK9%#byZ=oF4^2U!d5z3{)bic6L@1{?S6|_j)Fs zIjn@eBe;G5EV+5geP(Rf{w3f>y0vt8c~9>h-xasJAfa2<%b<*Eam!3?>lg-g-qdoL zXLy%iD)a-u!G!o%9@-kOt`dy`-sszu%6{~`&>Ko^Lb)Q9@ur^Y3wK*`8vD7kq zLb(7QicVANUHa08ZYKEJg%`*3`P{Z?8(@~V@~zA}_2$TwL8*3dw&0qfA&HIH3 zTc6Iktj3&p0j}-moZcR|YKJ?KJ2k$HSM|w2OYg)I;wZ&s2V)LnVa4&i;DP(?Z>nhB@m6806m^0ZcQqA8x|KjpX?N^-vpJ=+pALNTk5~g~ zwLM5GkCG7nr_nd8N~j`=CqB}?XvXRZ_YLk#bt5hsa?$;vv>+HzSUu3mF*{*ya~q#ZmRezyU)C+j}baG(R(N<7Lh>FVP>PD zO;-|5WgtmspRXqSr`@L12D-ReyQNSdc&xn;!Nd9xzCLcAD{)n7e$#(_;!Dx~kMl|| zI=3}|)cFVD*A22@B!sO7am(z|dx0ZmpwUnovoYmzE)4gL2d*NRqT8JBP~)!50~?ucdUBy)U*!T77b_ite$-CGC4r| zvd&!eL4?#fRj*0x$}T`zSNJ)Ai(MtpXODN?Uta80(pxSD6z|!k5XD0d+E+5UA*z3I zGt4HkfAhPN!F?w>auByVkVTek-4cdvt~Qlo`sPj=qhK$(_3!CiH&ug5MoXt|)1X|t!{7n*9RlHY0C_xlDcJ9*$rcR`wv-MiLKY6=-gV!e0=MEd@q_^)ig~t_=;vHE?(!L&ieaJ z&~j$P`P2&FLQ_KbVwTw9L#)>`rhBJ+c-z|Y-My+Rly6&Or_@ADd8*rG{JiKutpJPJ zWg`_fGw4D6-IVayX-Na))6t4*&<;4JykeZhku9s!etpWm^xfdpoY#{W?4Vpj0NSUy z#qoEAm-)VI+C6Ktx=T&>)!DNB$UxoU`8{$HquMV*hJPC3C9|O;pG4|+ii+OpRr51 zC^5LWd@pt%HmNF46b;@=EXNy-EgrlIp|BnX0M1qDrlFT9>E} z@2S&#)Y3eoy=w9FT9UP2>CA4Q;~gJtzuTRP;#F(5?49xu)XkFpMo-!DXA?fx3J)6N zbC8nywD4s2--#1e#wlc}sATZERK?V&4`~yW(Ei=ODb%;!ftfWl2ySI67Pm~-wifgF zuC^_19=bO3E>*!%jJ_PUH`F}#Pis&=j8B{dYtTk(qV4jbn6GXg(ShH1K_RiHhKaZ) zg`0YK6C`A6z;-@$HLLp1OmMp3#%VbWqqIKF!T$$1njD$BbL1*r2@AT4=RT*6>< zmU@z}Ti_xGpx;|`yZL$Bx`jb>PuNLGm&VN%BeFmP`t^|P{;+SDnQF;mqttwh$SNwT zzNR+u(pl_Yeiz+z01sf}G3?i`*bUMnXo23inE*TG!~ z21quRHAf#gW6hx_M3a!WfD3ig{Oe^mOaL?BbADWDP{)v3& zJ|tj#M|*nrkagC;Y40cKQh=eDC!}ul_QQ(u@c|edt2?gJw30U?yML!Plxvy%qO{}N z$WWs}pUqN7M-8|w3Cx$#^Bgnb5Zl)nt`a6}oH{(Z*NM?XUuTOdzBeM*=5G#LSFYi^ zl)9>cv9)(F9bpu-U>Vnj6`1bKQ>8>!iO43j<=FTRM=kDi8Xa}ZrV2fJc6ce zun_+1$oU>>X2i_0B1Q$Na6PY$9(_141U5vd#g>oUiPq}bFS~|yDQt~+>-FLr8z_-i zK)^;MEw4bA4OXhJ*UUeA^NlN<`s8qgW+c^&hB;)hCc(}&C1j=X+H}P3Wa&Wkc$@cx z^^zGYR(x6XC!IT6#pvM1Z0TOfP+}yV@r=PZ2dIq`NSWI9ZsosCj8g?vFO8NRi}-_~ zO?;4r)6s8Qsmo6=d3?P`16DG(gdE|e?nS<#E`?FXB!S9yn^Ls}J5ctJm=OnhPZqb% z0&2@mp6}i!V{KVH=%H3`rZ<&#J-%7#go4nbZ zt*2XL;^!A8x@W}%9Z0gIk~bnA0yj)xq!J!}WU1oQ6}Xr(>1+Ew&D=jQi6z*|e$x@~ ze%n@tn(k97$$B7qow^b#hZ&pu8p3ULt8SA$-PqDOV~L0TWn+1(6SYyLLG|xoTM~W~ z-K03?tOMFoxshAU2IH0fQ7*fx8@{~V=+nsgCu8g5xV%aeQa-{ZH5sR(LWmY4sd!h| zzT(kiAP%pF(b%?H{nDc_5c2a~jy&v*KTgo8S+N-95E7gf3*cWT%kpwYoCEQxnoQ~= zZ+ne>qbxK<3^+WLTJWlE2lr?Lr0Jf*`^*rt2InCay}Iq+OYjuY#MAsSUY2h-v&&xB zNRW}}0dec71D6oPB~QC$tFfKIobJ6ElG;oGGRK--({UcTgh9(X@zcYI!MR#bKe=81 z%|d--&B$W`8CkF8=HJX%FS_o|nzgF};v~$;gl$|lx0)YXf(~1W4*7LeYduCq3$zVV zv-KL4JA6V-SAW?T{6_b(cEuuqWb3IJ-h8GW#GK}G0aU^YGgi`9DtOYGqB$0cIlLg9 z@LG{dLiTXTt*f#}MNeY;OJ?<~tyVK6HVKS58&owk9!tHd^gh%0)RXG^OI_N$fW^@Sxsih3C=GntVqr2C zsjwtINZpe|@qlmw%1>QP`J1`0pSNLDj5>bwlFMwjQfcuBSs8$tq}ERz-TcmT{v1VQ zQIA^$*`f|f6Eo|Wd?CDfu&^mxk8^<^BO^zb3h*-EuKZW9W<3hF%EoaCN;y%gU@B?Z z%&bT{9J#GNb^1K4A*sRpQ$pVAtK}NbWrbprANn{EQx7Gl|{Au<%3+) z2YRn2E=ZGHA`tf{d0H(!cdRF;FM7aN*m2*tP%kdO#B9Jy(?>#^+nJ7x3`9DgsORzR z`tp!1M1MAZou? zXp*M%>5H$h_q3eSa@QPs5Yu(v&nsJJtj0S&`Rk4Y?w3FXWL#5g2WrP|0prVwKMCOM~#8Gz)s=|Qw`+j*MXF*sP~ zTV9KRgnYK*j)cr+CZX`){iA-*5HgSuDwV~uIhpC%*nlBZ?pAWcY)-4kJ6wuo!aTy= z*Qb?Mo6IpW#|djNBBaJ-8DC?G{K^)r1{?6kU%DdubdT9|Z{M$RwW7?=ye_Y27&_Fm zbusW2aYZSip-yc!suvuMQsttd2|u58gnrIM4<-n9%L4})0Poit6H5m@$KrkU4N|#s z{98!8et9IFeC0V%3-i`jSSl>1sBP%L;p-(>I<25lj9n4-()L1nwD?y+F@g8KJ0>{o z0;Pdx67?*vQ_Gy}pQRUf)^sPu4OMDgv!oJIAQVaSOh2)VB#2B@&}rt2e606pePm0b zK@~OFU2xZBBtL64arD#Wi{}UV6+N2#eaidSZ>^IZOFIi~l7Nzv{Olq986qU5bAu{l zImLrwDei|*y|2_Ke?GS1YwW|7iZll6f0TBw?ZeWYYh(D9n{};eNfrQp5@(^ITeLcbc><=K4bmD!I}O z!D4PLm$6ZPoZb6o$YeISf3Mq*Q9jSbc#px^ab>Ig_se?5z_)-qTdcMI?9VYc7cG)f z5Uh`MHdW}01b)oZajz(p-Q2@ytGxit=PnwT!GIBd!^7O=<(o(bO0=D5<6kk3>wii; zwk&!ZW;A6k+aJ_#5i(|htJP|d_q8|S06_`Ynugzo4#!B^+W}Z|YzUnAgP<50EM363 zf1AX;+)3YxkF*&QHIE2+-W8@exUpSxamPr* zSG)cm7bBo~&cYQaOor@T^whB*$Ff2~Uk)!p$G@0)E-*|m@dwKQCp*e%52Hc_0P))C z=hHGgIMQl9v4WC6gK^r9M&%UNrA@#bWR)7 z_>FWO^uW5D<#ih~EgMcACIH3$D7)-p`EsnhESv2VjQf7d@?sFs(#?@SBpEb7TfA$E zWynjiHj%}C=?7?c8I=dPI%UZmhb=Gk$kt~=!+p%=OGuLE3%w8;Ic*Ewz++ATR^D+s zD4+9kAfcF=Z|{YNb8!CdgX&*dwFC}p&4%Q1Yv&GMr}uju7pNM}^nWLB`r|wQ9#m3n z#cF`?m)57VZf_Ds=L69b9^~pRI-hzvG3q7~d zOCX`3-riK5yVhUKRy@~uW`nBVjMU>o#S({>`&0v8(PWlz<2)Sq`ey_2bHDKsg9}Nn z3g2QXy$&t>sv#B*>uc!Q9is;Lpm4JfrqY*ny&;kD4{0(VVe8MZ`J+xMChu)oPOjzm z=V{$3_?5=7++i72JOb-k7Y2+dT!dKGBO7>XO=?Z=8FUg)$MWJ==?8a^kl&!#06&e@ znEm^U6YcX6DNI)cL@r&%8Twp>hF|=%6jNd>|7Fg@c+0(r+whIU`GJA{Mj9D(O-AK5DG00YA-mLaIX!d6?co@Vhe?lLH4bxRjc#-z z#r$dDP}yH@jrOElt(i-gU$&J-)nv&Q@__i_fRY7|vVH$D>f^$7Em93@ zM>jbB$gs#^>9uhh*8LPgT~}Yv06oW@Q^#a#oDpKi8budH0a}U(R7$;}>>~Ui_W(6F z{LN^{_L`1*eklK9Y+*~kBPeCbqXpc((rKN%O+!t+(lj312{Z5u<RFF&Nh@OD*e4nd=D-She~k_M--!+s$}X^DVzsY?BnY zuGz%?PH;v`iPhRK(}AVSh?dRW&d|JJ#Wz>ESTb+W-PaUreP7MxXvr*rO6bZPo`vpD z%_E?a$NA)0pVjaDLE$VO0l!@k-_K{c{YpT9^=NeciH!GAmT+f@z>>n?nrRfcpLkvp@hX#ga<6@=JUOcrjA6w9$l zdfG!fo@n%F8Px)+%^o@ko4~&cvZ}Xd7V`eRE3NXZMT^(Z@78kzkAS+xEZe)|*O~f{ zXoZ+2q;!A_xjE)Ct7yuK?@3GC2JKgwxXQs|YyrD3a{X8%y&W5DCInx2hGzB``k_x=B6g+!!~nToP0`xr&YE+l)MGP2h(4?uMyaFIvUBbl)2pP2MWa;hPY#R<$J1%@;S4_2wS}+xwWSx0 zSl$W+3p&lEn5$5a%0vw$#Jz_^A7@YUWN-7d;3eGYxnJ&q9*0@kH>6nmtWA7oOsKF_ zQy>1l-fuEjt*e&bmt<%1?gtncgX! zLZu~~c5`u(Rlh*Mb<8uyM}}$U2n>~dYfPG*V;M&p?!k1!6?LattN&N=Ah2!l%;pN* zPrbXJ0Q#kj67Dih)OnJHI$_SP%0}>_cRsrP1)tRZRcv|D<@LbV1_U8Vj70Y6r z(KFc*lM72PxKsW3p1v9DHR8_I({={g@@28lc`)>ftTmE&! zo8kCS?xnUhiw^@!b&M5$nGJS5#T#cn$NBWROOtMEQQ0t?A|@Vy$=-7AHxJwUm}oVy zL5aMo&(S}8YH}^MANL2wNT{wB;-pW#2cAgXujB1n`be7`dFaLfzcHLNv^VlC=4hC_ z0?t^+?^v!VRrBU)e>60^q!_~i9bIdZ)*g0jNqRFT4td>Gf@vm$;Omj~H$A)2O`7FF zy_Nx$8=VHTC-~TJU-xtK^0)xTpgv{mapys-#vYG|_{UbJ*bPBW&nmO^NCLADBjLee z>DxWYbT-uvsNu)Y!!Gymw>k4pZ)uw@Onn2RI&USSxJ6LQn#|nUJAM6YQxYc*q{*Oi z?{|9Vr8bF`714%8JNBmydl5Z^8PyolY3rPrdvi(G^Q#-69 zKOmR=2=qEJ&i&V?sdzT36Q79hq|3(TgDOAF)AMyVs>}ct208Pi@HQ z9^swXMs^;EvPOl&Sov>J*l=;4R}gB+kN?0Z&>bE23Pn#6@-wOd-}7raMT0QYJzrhx z$;fQY;Uh1p7^<(>S^il@DOkG_iHb7ukt`2+Y&L=r&t?dKw!uVP2(sHNd{leDvfHQ6 z_U1@8ynm=nmiFqk7mTF1g~hjJB|mQ`?P>Z72H4-tSZyr~iTgPnBTuDpV%0ZVP%9Bc zBfG`jv`-Xsp?Lk4Ewy)RwiD>#zn)bK{wx0mZd8)$ zDwCrS=b!w1UCVW@?p?Q3#VheU5|jFtp`Jdkcs-*4aV zT-<8f9CbB+U4AuN@!{5^s%ylu_>W$@c?XV0^clkUy)k~EMX*2Q`ZGT!=RqWU@@7o{ zbD=iQ1@CS4Yqw~w8*jOUkRPLjboV=BNUYkxv}yY}P=HU&(iX)y==XLv5rhs%e`WZ-*^7jj=wYAL&&X4C$ZOyxj$EN<+I(*We zTpQKuKiaBd``j5IkDq$N>i?{iUvV@_hI=wa>uSe#$i}p(B*QN;4=3)VO#9ZQc&#h= zGAz+Wv&blBhmon%!>-4UvrJ zb0uAc$rFZ;mG~`R9UNU*x}~;Jrw@8ek&>;Gj^s=JxP6f(qez$&ex?6*vtnqlum<@j zrVgMz=6I-^rBEkQi0Lb(v-gX^dlJ9igeAgv-_q$WIUuxEh zrcTxi!UWV8x|S|=e;$70_$mG4jOQx`2}snEL62Y2&XhZRh4Ca=>~S*VVcd(ImzW3k z>TV7;Q%Ja8EAP;!I{!N8PZ|hyqyE~2kDfey`c;B~Iz_M1C6o#Cb0$}Kmy{i9-Tn%f8LCd2NdsiYmefyr0MuDtRNTD` z(e#VUi5sq`FA!?JfLi(=Nv@msE(;lJw=lc>sXMt*)O|VQb51e~+D&l2jGgBJV`gvA zYxtjSv!4Msxan9^4&V z%tA^I+tWb;|Ni|Re09k`sVqz^sI{52HhT9z{3**T;s^F!mosQ77>xl=twPqEPDb@+ zi?{?wPZ_I?Y3APr=jQr4i--C8ehRgp8*uoYM1%Aw*b<2Kk;b^=Z#F*9GC=o-_(JoU7k!D?_~7?{2tq zQtF>-b{lcCGTB;}{ed-jU!T)Y&xPg`uI4`pwpie=)RZNQ#B_O#l0Ajjj1_-+M!E;S z9_P5{Y1ec5AJ!RUe8juPVA*8l49cl&kyo$ZD+9w#&SI?2U+EtwN5t@y1+cV=LwKJ5Of#x=NmE};5ypR#V)w~TJKKGX)O2> zCZuhOc8RdBau{6nDh)BbHNDjGnAI;xkXHUiZ7>!R8!9>$-hbSVzin~;#XU#Y@+>0O zPV^>G;BtT+oPc8hewa4QcqwJeO2|M+ZH4yA^%wpl`BiEEBSLt}MSiJ5c=2 z7hg+ZGgjl$XxBd&rO#A;D%29GXE`{ow#z2In^)u0Q7Z(d6e@nIM8IMdEE{BRKz|~L zvdr-1BQNa(o_J4KQ;rR@dp&=#uoWl#AMrgy%-!jwbKXx)eyIA_TgAp>0eVxm zsnBA&`S$(jOV7l6>5@#dhRX? z#sZ?;^hlR=73ypd(D7WIpce5yol&_>CRnJeYICF%Pr1cCX8O{WE>M!VbXHWv0H93) zg=OkOaYSeZYm9YI>ZTB^BDTKV+ zLKmX)+TGEWRW5Pok1Bx{aY@p)SBfL8?}!SQcw={VY|%@vR4LgORS3UCq>V{+Dlk8@ zz{LMvvY4k%!r8ks0G>Hie6M@*csVl0rKrl8IlHH#*qH>f8U&u$=xt7voF}WbkJS40 zM|j?3+{-3zJE5d#+u_B_+{I(f&kR1!$Vfg?zABerbJqGM>`BxHdf68ARW=VJTQuy~ zeLEXHpikd7YbTWP+FE?b6|oUZyW!t<6hK@cRx$AQ+4e*0cYO&CsyCLCT;?9#Psy<^ zFs_vSIUOYPa>eKyK;h}%r_9Nb1Ksvg&~s%^vEUH2>f=Lc!&o7$0e;~uK#@5})HJ>% zNmw+4|K~u_eAK!FA*qbh24?DHDKQu43I-Y^pSo@qY#yJ0+1%iHrOv8wjbPNA;E69+ zCfQ3{i=6ml1&R=dORJQS)h_t#Pqorl2eTGt+q*l2?y_1BNWYWlR&cJq?K2L4aztNt za~l(``ui7JY-lXK!nY_feXX{3fbE9z7xdji21wL+Z90@6( zH4>LDLA*=eW<~(PSb76!`XzA(TosqE;7HDAJ36q~5pVo2PM0~MlbnriXM6Q$biBow zpO-BmpOH!NREU`qANBvNm*gyPO)DJ8n$|~}{QvtR+rpo|pFw;|E7P?4RpqPg>lHcY z{k?uq`JP0ePIDUpjEK*k3Rk>r)PH-LOyn}#ZCG3o*EhM56cj-Q9rBD^gc<}vnk4F@ zy;M=G<~!m^Wh)`i;4SmWKFeXL?=MPO$c~n+(Rb*1xRRASd8)trHLvr9Xd18-pv zAW;}lmp|s2Sb#n4w#6_-t1HK1lbx;!u#zN21ljt1kZswOp!MC5zJH5J7d(D#TK=m2 zY<8D8*cZx{PEtrzig*JcM;+GTqyFjZM);859Stu_gwc-Pi}C4< z0m|S8L+Et$MWrxsxvRd0_COKPShw-P8R!pzy`{-noYv@qj7#x?Mq`5VqVf#Ex^dJVmoCn zR&`ceKwn2shMEG3+m_AtO7i3^cwPgzq2i2g z$OXBa2-UF_=I2#MM{ySqS^S|VNs)DoXLepKWzWPknZ>rrC|1=O2+!JY?Nz$WN!Q&% z%k9X>0JPgYVrbP!Q$D6^wAEW7xK*rfT()IE*oY+LIZ**Slfu#cWR$P-WW*o+YYmXvDLzZedd66}S3_UMArBe*L%0nT;nmBR8-r@i%+TLn-^P(nj%RML_>aPF6& zL*(yP-X>AI4SgT^rE5dY?Ok2q&-Rw(RDK)-$4*9dnq}1Epf9UnuDEjo zLg343D~Q2VSA|*WoLd`Pwvod}i61w%cwLS(+2P~Ukk$RuX)97uHHLG3gI4&~eLYy@ zxxAcVLcq0r75aSEuikkVP0-cc^W@wXG#_`>Zq=xjzKx3%-{Q~iD=TM&2%`h%m|xa9 z^%Tj!rb-QtPS;^}PR^!X^we08Y=Rx*GaVz`*@N=0*7z?Y=-MfG+_e;a=)L^4syZw+ z--#$a0mO=+@gw>)j&@EiL%kI5Ke6GcJ&cKDI5@8FKDA7J!&0 zv#PZ*XC|3Z$dh^_N;VrUFKT(@l^0|o&xu`;qS@}mvRqG>&F4t$3d-53_rqV{Bc!SO zx8DjE>Kx?*V9Xo~B8(*EhhsRRtYrmLuXFhG6XRs#EM4F%NywNpNYc%y48TCo(-MR? z+smvv%nR}r5d_;5OZ^$o`SJ!Z7)lI~J^$WZHfWMj4t|rWO!frN zSfT6$$2;TFrrCoEbO2A82QN;9w?k54Hauqb|uwKQYEo!A=+*9{`H}(H}Lmt5l`j>wQ<(1_Ojc|9(8G<1+EM!~jKzwIeV_ zWHqc{@Cy`+SbPU`*RNb&u1AN&zjRBCA+QvaW*uf_n zx#|z|G?{4!3ah_uem=W+izB>`%e?q%$!P8-nhu%;$oLSMBo#ug%IMy^VVN1R0Bz>J zx<6%uYV+yn*phqamT$KhA3qB&&lq*6KVEw9FmTpQ#TT~A1#SPk|8BbA{==idg2$E& zuY>Rt#fcMt0IWHvAa5~p-;de4xH|T%!R}PCW>vCEWy;oXmLfx)7TJU5 z+nlwFupr84Z;8W8HClWJ@^sM2{?e8vsyIV(TUoTZdYB;YFW(mlTgPq=GI;5m^HuS_+SyopJzf#%Cr>*?YE&n#0dt^zGr2F zEH{=}%XwAss%umKoZ^r&Kd4UbD{uaPEC4QNdZ+)c^PWsJ#e+rMz*~yK1ndlYlV2Yxh!d3|#-H2lzf0cFkSuTa)~=Gt zb?|+TDAZ}pFupr;zCLb_sV2lVYM|R8>^L6b|S@P8;iw?t09U z%XBM8lX&o(M+Ru7YiS2*6=SSyMnfO<%0v>Twg0n+TY&?;BjQ#YF#S{du5;`s0U|1nCnS0iEQrK^;W=fTo`qcVB~7I`&U@NK)R>8d}yXi!3TEHBm*&d7wpM9;-28`t-o~sHRt#Y^gB)^&wCsW7$~qy$QldX z6c*=MkDMDc*59U1PU3F#z24hAS?}n&wIP$WO1N;E+xA8Sz>#^aPre9?=Ho2>+N1fE z09iJg+~(9UDXvb0yYx+kGftEa+9gi>dE##_i?=*{&r5S{=}VI=!);mn^{0_k@RbfK z+;@`=z^wS(WtD;^U5dxv&2F!M_jkfrI4}I}{;;FA1Js?%96M@6j$E{uf5fUCNyR&0 zuJ7o{ZGiR`PTM;(P*~#BJq~R)TzLdF$Pvvn8^Z;M-u=5?`T9>vT>{{Xg*t!lz0AlN zmTXPrTA}Dj(c1of|5L56Gy1%v`1SC%SqX7mNi}1s2A{mY4HNWr#gqiSbuR6w%LZAb zTi&E2q%7rq>M|Z1Alzv;R6qv_qKF^VyL~?Ietifgepa-}<-_oI-5bkOH!bj10}4m> zk7*CD6pLB^IUGB0FE}oIYwx#otUY(uXR=A60Ed??1+6O1Z{d^zQ;YBq6rKqb+F}$3 z##Jxwe%xvPc6#`uOFgRJ7qU{V^Ta}*-W!Lbb69T9%F)JT61eHVc{v*YOh->U{U}qKIitAsR5m)!d}|nn)PMp z<5Ykv&0ig|ym|{AK!|BIYQDOT(=pTXXHToYI9)Z#0ztum9I+uqoSI=Y*6l-98={EP zDgUzvi({H9!9nn=-O6t{mK1lyj-Tt?#j~{9BgLZOhjf7}+66;LdVdyQ~ z`h7$V<$PpI+NE{i!dU$#kGjk6(wHNCmdHAxZ-Ps`qP^{a$;$9&OE_VGr zAeQFja!xaIk*>1Nnk3{7h?BQ7#FzX0Ym9qj*~)lFO*~lgvvLk|CM(!f6h2S8l#kY~ zIBRhiXxFWOF?aT%R4N>KD;6X{_id;O;)cW@U+N8t8z#7Vd&flhh0|Niy$9r-KZy&j zqW*ABv#y~}Po3bf%{qTe@Xm6)u19?LVwsC2xuDfm8`Ru^e47jE+jRY=^ux6@4@y!v zBw8CtSD2OCMi{J!39tyHD~a7ns%nD|terXf6#aOAKhKWl{n8v0Z^y5Qe+cIr%5 zD}Er=>nT|AfsJ3o!qU>CVL|1Ec1LSJ)X)N~dv{nb{o^IYz>k~+<9~=hw_a!{8F9g! zP8bkFXlIIcuS7M9b)-V;_b$hbPWPYla1dU+l9FMMpl`9q4@xcf!87|x-=?j|F2}Pq z>^ggEIO~W2TD6cP;s)GbcoT)xeb>iN&6v&LUf5sNC)#hQN=S&Pu9&ZkSfjDJcu<>b z{#;5;b;%IxwoCg}|Vr-F;w79;+w% zGu=n$fi89B){bs5bMyu2&W+=`N_wp$rC9pND;-1iG_h-Shi1MOz1p`RED2FC)Bj!U zOXSYr9=8rMTF(?BgSAp9;%#7w;pjSXD(mQu`J_>^@9>L>LiK8|Xc0H&s}-Jrv5H_- z_Z$gYDCu@p+vKzGS1SQU1(jPuDy?w`Bh&dCAMt&4t!~+ctF=;AfY}X1&FNr(dST>= z|73oftTI*hQnENILBv2v{-z;tJ7}aBC(R)}yynlEacciGdRA^F9dYz;ugh+@itv&N zbc)AN+$+eggA{Mc+1>AMwWM1(Pdqi`MD%A-hVC!1-h|xkm@kG)W{Y2?Z!CXbGRtT5 zQXyDL)sgwWj(Xy)qeQhzpbUA_ak+P_vSZF_mJL%x6J%QqZww6T+nA&vPd02GwtJSrm54sto=UkCqrK0o5Tm3?jd>)d4}s$yj-E+wjQTwCVtBB#G8CyrFI0!Jv07A<*Tdg+!cIItZpplw zyQc59(7cz#zg41R(*C${%_sxe^@?+4X!i3N4&-T&73{xv_zB$c=ekE6HME@?%8;d_kr!4{_VL~`X)>tr}vtriSCR0hsfuX z=nu)v#hdoklrteFhq&#Fz>yFVxt3iarlNl~diee{b4LtU_cJtZjASPyHyKlLr>T=- zbq#-k3<>MHHR)$|zV5vD=DVno^?yxTpTlZS*fpVsaJ`2xiq{d=zIZnn#xOIO`FP|$ zo!|+(5{n1@!s>pR9iuo;HvGhrCV1Cgr9*pMe<*avk@MC*Uz#p5@vPR3ofaC-9;6P* zHa+zH{>3d?x!GIT8=1Y-yIdwL1=hnAtjA_vn8ckhmg%R{%Xzh8{Fk7l@AiHpX{MsV zS0}&3Y)V%T2kVnZ0gTa~zimflSrm@HzT}jh>1>WaZ4Cu9OwK^@1PwXWA8)ET;%za# zk9oyfR3g!=1;tq#^O_1`y{|^{W`4Beg%fL}t?b6y#~GC9gJ$l_h#L9#L@HA2kTv}9 zc!+aIwn2%Vpf_9qD|TAG$+0YR#^3Rnm|_yE8RDjX%a-CD<)>aLI}XD=g9W8naqK0G zsN02)R*z6UYi?`$!-s^JOnVLlzp-6ABICoOo~&W)l#KzH?A45F#TRX& zzucSK3@|SJjSsxF{*`5#(i!?2c#h;AoAxj|qMlT@UdZokw*F0y!t5D4T+XzSP=lxD zf>EF?W?THHDM+k{4$kOX?}l4pGh-yMNjJ+Fm5g4%3>^r$$+j4|h?1N36+9if??~f% z`*zEk>6IMbB|A$GyffsfZDltF{nOd=4s-9i&V&zq`COCJc>VWdE9dYY?=ZvDEj6cn z75LF~ymM6iv?FB12OLqNQ||P@sbiychN-5xWlyz>uAx`c?F0-GC05}iO~#uzj&C8C z>+m6q{k_KhrBT*S#*Gfra!h=OKyC1kvmaFStOZxP20Wu997|tl{`kKCUFzI0%XE8y zlrLh`#LEsAUCxDy!2#2ti`tOmiaYtBiiB37<0+FcCD3@#52x2O@Nsq5S zuv?&2;bDH#s-V6tb>MRJp(nT&{loqKk-O#Q=%KK>DltTR`8;d0n%Qlv_#S6tl~*YOB* z2#Udg@Gob5yE7=z>1=dlSXH+!ruR%Se7$z=pbsG@P{Yj(eInxfH7nZH-yHedBa+0m zymZ?RnPi$=BCeU1u+PgbKCit??-lB;$!s}BXuT+_#cYGx_{ZmvrA9Tm4P$Qd9eU-) z4LK&n@-Vy0eNOhX{aD#Hqb#H#LzQrfLLZe&@T%8a%Fo9>(=o^#0U8;=|vVocpGcB$1!3pfy-M5HT0=)c>MOLg{ZGHS2IQj<+(+&vXe%~UeqhSl>(d0ucdG*B zuu&%@{OLnljNNDv@g$HCH6jwnfXBx=*x|s8KPiq0fb{5DVEp@^d7X`J@cYG>aziA; zZai5VUzMHjjtWrY)`Ym?sHq2JXt?9Y{(FrErT@FfpS?S*`F~|KD<)g1`!_7P!+Uwd zU0PC~gilmVAW<7j{Zgb(_k)UQq!fyt+@(iHiKSN3Z5RJ}3DyWOIvj$861+(?Wg(fE z%9q55%w3I&$-evXy|ASKR`{*uZRtiz0@K<->p_tfmukshKOPj3i3KZ6G`3IFZ|8s@ z;ilHMU#Pd-?Dq+~9J(u4B#eKs1e}LCEcvEPkU2d>_1wm_Qd?k4k1dkQke*~1~89>YpyrP!iJaXHmLMZ9_{-3g;Ovcz)06LX*zLyG?Wz>c2Lu>jY$>jMtbEy7nF)M>;(Knhj=VVHN_+9>hx9QfD!B$pBum8P zkGiv#`&5&D%{>*U;%(pZhcBuwaMx@F<#{kDeZN!}(GhS}NqYQH)u=?X6|h=iX^G$V zSj3r<2R>zDZpKI4-XR(ZeVq^3H<{;5mth#bGG?Svh+QB8|QJAx48VPrJvNa1`MV-*9j9K3c z!hn-C=5jAJca~}=JfM*9N>mcUp5qR;J0Q&ddyk2WxjG(BKlYPFcf|{`5<-=bS-sIv z`%!M-@p36=65OAp{8>HXZj5rtR4C08Z#s~~%7bHYLY9x;q~pzR zafj2e(LzQv0B}*DauMX;{h!w6`Nh0%XFoHSmmn2#_nNo_L|yq*kT64j+`qq?{t&ex z8@@g)dO>kG^k-);MSVm^J|y~vNa)5yxau!AqjV8eDqo zaH4kjA(&;CKg;! zf}}$X@A!My%cf|?>6;`WF$pPA9;KWR_B;^K0+pqf*F2TFSI}jjzBN@(UDwm?&}q^c zzvM-_+Pk`4I7oK)vgr?%jQ^zKTS)e{mKBjoC;cwC_K|JdjX@3J6ycrg#=6#5eOi#3 zSd#CW(59)Qb7__koUq6qN$;c#hWQ659Cv-L{_lx`zkjzrER+5G=n{zJWxmB`oX9>O z?jxs@HE|SZ(rGYPVC1A%>b~$Wfd%gGiY&X5pAtzgUI<9l`3~6H$DczD{6t&B)Um3u zIHB~*gf*i2YTLKXcNVlhG^A$Ie=qe=!7hQx&LawsAXE zg-qeh^=}OJNY6{Oz7G$bf}gh^cf1H26R7+?UFh{iApG5G{~3~`ec^Aucq-xNJt!Td zLiyG#Ma$BVl>kw>!p!rMTFY9P(sD)S3*>*~3@(^9y=YMG-Rod8opmLzy{e7cxI>vL z{xt#D_x)VM?~#2r4k)CY$WbV%;2H?~h|&ktny&KE+~h+WgLHUJYmB1PoJ}O3C=E!x1qVO>4S5N8gkkWddRA>6;GdTDiHn*or@rsqlFPCMo|Kj~mj{ z-R#O?!}dxKwTpH6yrS3HN6#4+6MKBT#m*XB+ggV^8SL^4FkfBw44?smQJjl(IsYA3SEg9J$$A2~f9?_y z5EAo~v6{^4yM68IVF}T6>`?1 z$vVy9y}ihar_q-UG-G8hG%E@W>t5Vi+8pP*oEBydHE015OOG}bV$!@Y7B30w5h)ac zoEkG?-96%7iaB}5w0?hh9+F$EpDXb&n#I5Fi0AvX*~Q+#_aT-{VWr!vtli|4ihD#} za!Ka4r<+tk!r7j#43&7q@XC%=Kwr_OMg{4-NWsL&v4qFY{u#GYg0Z zrfYNUE_kRHnxhoW@o7F{XRC)3<6JrV#5G%2>>tMF*==w%TjtfYlIkhKJ zvy`zRDDa~wk5BS|%%5p5C}d+)5{6`vG4LAiIx3TxP5)!?axRX2!q^6Oq+l`kZs_li zqt!j6+UY2@m3CDTPKP`dN|z@_dA4t1-&5P>^@`1TFp+U-`+~ ziG|Yc8|R_wy=PXuQZlDbQX;)Y_se?|v0crgfi+vj+o~kffM@4Dmy>~=Bm<92T4;|k^j(s5Q3@>vh-ED4CiU(&{EPd4(a>0#iS zTu;>7*;H}KwV#a9eQ-)iqpFJ&8UJztw6HeC2+5C13h>_w?*u$3g0n zPH{;oOD6EyRyIJp8!oBE?1-Q1pa4h3ePakIe8`L~^7kup2!BS!ZC-HjpV16f{rZDt zwB+JFT|ImU*NwtG=ggiWse?T;1@UvR@O9b9cbZBg#ayy$@oMR{!e*}Lcg#imkRyA`r&Yh0g-JpjvL+tASg-QEEqM3XPs=kQY%Yz)aNVf=?@|-giDQ|L zifrn3IB_TxYuSbc=dnchNBKC^XE|^DsKfn{qDvGHQzT$No1%4g0}BRp0p-MR#~@rQ zoNM+TCnQRQL_(0sl7ksvfp(N+gaquD&k`9leUvhcs5{zII(5|`<%xZjsL3fnf!6Uk zxaetRi#e;%U&B`r;NuBSQLQc1Yq+(snf@H~PnNE|3-%yAX!rp%9%6|TLo^8cvpzka z|3PHAru1okO&cvK)bJf~z8zG=EtuH{*yT5ag9|nm#H5bSrF-7^%NpD4vP&y61MmG{ zTNJs>mcmbawzlPYRF?{c$b%b0qP*aJjq0{&QI9_lNoBr(LipEwI0O(~PgX?exNB~+ zSnth$s$DaJx6eMAtRU?9F7BV6aZ`44(O~8OdD68d5a!Ae_S<5R7Emi_cOupRvLYQ% zDU0Nrp^;;j^hlVd4~6ZLSjlDIpAs{HbFszl#%JuzPGd`0qZ2c>zk9?WD+l(gaUSW8 zX~?IW)ua%DcyPzjh8lo2jYf&(7`_zQeRgF9&^fjQ@Pd%mJS7`*NcOLU9zfy9X4fowjIR(*Y>7+x$x{A|*#vWOCuL?-zjbxW<0F_so$0>^@c@VHmf$lvj& zg68!=DI*j8@8m*b2dOG`h+ul~lLrz52YLJ#8 zvJsfz!Ly%q5!MeobTH^5u8DN5KgUNTA)k+9X)i*L zW}-SMq2#h0hCg;yJ1;$$D>$Ib$uK!D@vSugI3pgRCa8)ksl2)-s%11u2X#L{ZRBHh z%BSg-iZhqlyGTW)R$c>qF!3yu-OLI+*Hm-PKKa%1xf;33bOJn?<@DQ;n%6Uk$W4`uA>VJ{I4S1EklkpHkXkemF78Dc$Xj5udy?XtH);b%^6}WGJ7H~D z-E3xJP+=|}U#EGtC0MC^g&0`1{wdysQ^}FsBO^+qcGCOcn)TW#rG{<)YWhM_8UTPjf*b|lTkw@5cGCMEsVXXVv*;OUq_hF(K z3Mt=jVV4chbDLdeFV1lrZtrUW>Qc49M>$|I8(h2sc;O{vcrD*I_2+O zdCaHNqj688MdiBO4cRlc)iO_o_BmWCj+zNdB+hR4&s0wgY9V_xwt9A{?m)VqWuMWY z1jmKansn-iD}K^>I);?+LRd36c@0I1?Yr2gx&kJD=r&oZpTdqS0fOr|78rZ&vTCg9 zB}9`XSMoKo^~*0G&OhQ@*%++L_h3?5ze)wsB#_>17Nz3#;g7u#gxdjy0#m^1(!g5d zbj+^NBqaP|nJ>Is#fleb?Y2;{&jcUo`@Mg0o84h|19E@gcR_)Q1c)tqu1yHtQ+Pj; zap01mO9$-}4`fQriJbVg*d)YA8KqJAu|caorm~JC5+3`*F|WbIHIeW$%E;f3RPiqQ1DP2lUFT+bfwGO zPi^y}Zi@nozLO};**b0wy_@kg7P%#Dc$N|-ttHs6C9*dKqUJq>v{I9>vyP% ze6-AAb%=yuwAhmdsj|;<^LWw$^4Q<4$*#^{_*=Qdv(4u(gWL&bgG%$5SZIGZJY$a9 z*fo2@_Jj4cn8oatzEHAytA8y7jc%@oDQ+rg|!-`o+&)AUd|XtmCQX>y*dY4f<4*DlX5D ztJX{OOS_Hf#zs8CjBdz$J(C^xjcb~{#dtD%`D^trcp6E_Ibh|Cl0L+p6t+$Zo)pa` zhtlZkTL#vR-6OoIXS9bnr%ESHbt3TS%iW;Hg2k`xT9h=ivzSgjgc+4OGG`dS^rD-Z zZc1yZb1a}e(_!*zZ~RwE-{ed<@@n03N%Q=^=`rQDMJRrStbD%W>9}dqnRddpDYm?H zy!Kqh_snz5@acj(1%c%MqTzC%$yfBL5{J!ucny;XRLN2@?()k>U|9v;4^eO4mRw1k z84ITuek%EvHRR1qM7oMpe7OZ2wNcQx_PrC(PmJttPrXl;QTS)|JZ^1|W%_F{yqu7@ z7i5XAXV|J5JgZYsrs~=X3fw@miPX<}7Flk+Rt6^~0G;pd{Lt#JJzBP5J;U6T@^3$p zCapo4oVz~TJTx`iFhg;}vQ#p{ z*a7cR`guSExJ>6|Slw>s2>`$on+yFJJ1iAEY4%1o?T;2dRdTZ8T&nJE3*9gd!3FXL zYTmu(=+3=wz9J_j4?#bcS_(0FPfBR)LiLtu_*VCns^d z{L&6RD>j3h?m~DU1M{g4;BFDHQ|PNCnJL_c92oB7w2Lc zclZ*0)6Y-i?FS{oG(iTy*i8`IOz68xE-2HPFZV2Oi;_@UtsAf3W)?PL z>v*su>>o@DVM!zT!sURI_gG&5$*#%JTTUhE_SRF%fYW*0NIEstAg@Tc1_^e1-_Q2E znE5SHq0Vj*tKZi4IaM_su-s@hkgxuXeY(8CZ3vq@ z9S}TS^Vte_!UPxJWrZdfS_q&lRw$CeL?P9ZvZMGicfimql$YXpi{MB5b5vz^aJqoM)*P?7x9;kKLX;I|Cu4KPsyeQ2SqTMc4auOeFsWH^Hw~_Wv zUv}*Z{IbhAi143R`rG^~3f#B-UjN6?w9m3e2A2>TH@f{3LSzOz2#QP+0z@~ z*rFCf&^w>P`2pRZ1nH2idOe|#QWl7|EOXqDXDd)d;;u&`9rFnD^{-}*5 zE^+!S@87lL$3ho1GncCeKi-qMv7DN?Mju(o5K`bXctlKfAeJzq&oAGHB?_$Oxk$Ja z&nvy4vR>RtC^Oz>de=kPkY<*(WBOeJ3Yv182yW+p5x-Wh`Dw;4KbGd zJC%(7_Q6}yfiKTK)x?J25Od9xmiaBG4~r7LZ|Ifww1K!7m6eoTMM(j!wA0xuk9asV zspE;+Rx(jru6v7KU+wQz`<8$@Z#>0<`+|9l@YAA+WkiH}<3~2d#~GYP4@56WnT}H> zfMB3-$cEVbVj=?Wc#h1l75%qPG?k1g84ISxq8wA-iWMm=$0v|?R80M#kTt>_k1^Q? zj?A%44`d6|nfzLN>B)xEI1HG|mvM zv@k#)HmSGO$uAbr{-RjHpoRS0?}<4JfrdF0%n(>4g}~`Aj7x&6A#Gy&@flACm}^bb zMY%6nV|w4a>r3et2F07B#LTm0!A^t}5|^;V<66#xrS%8ugazy*2Z85hGSiZ&8I>cc zuv2halqZ&MZg<)Tv<;etQKyB7L}d)|`;&>juoo$8WVyt6lFck)O5u~p$|^AELMbmn zG6N1Nq%r#a0sUQ?64^dUV8m^xTkgi+Gd?%PzODUm@~BL<5u}zM0eEix)KvO*-ow2cH&dR}5xu zhr11J91>+1L7dO*O^A8D#J%h#-YCnd-<#pp4H%HCixTgbh<*Qcf*eAp-!(xacxy;- zTc7pTt_Ld+rM4gu>~>Ut&)3oqSpDipBQMY@OO9BM=x@`)D>~iGg*vzm4gi^%{y08l z@q~_DpZG9GaDdXii*=U^{$G1<`4H6?^^cB-lyU*bB-23MK0r&nquM{}zto_-m_F8N2T@+}BN|_RU zBzs?7=yp{8($4p#*ryCe&k7K9 zIep4a;fu5_p-9n+%XBg0m2cGCgb{fMKZ{I3f(rI556t}hy@$o>Rn#Nk7)d)IyN?Id zMo@~}c&^SHtVSh#pI!(JCq5fe9FZvl2ko_qFl1u4pgX~}p?!NEk7;@qn3nnZYi6pP zLWldnX-k-Xz2e@<)V&Th@veXq5<$&f(e>5QB*AGek zhDm4+u~@0D`FQxPb{Wnl?KMK5-#ig&i@}Axs~xnVkMVXDRNUc0XkdRdK8?;mUaw70&+si;6C!xsP26(kfZpOqIkJK5()mNv1@x_prJ z^kfrq_kurWLdT+Yj0OWVh<8T=Xciz&T0r3Nh3eM5R1x&D*PZ>((J8t2!@rIw4#FKb zJY8RjTCcs)Xj{8~?%SA!^P7$IFCA1P#cdA>Qk<7K!RrmrAsFvNlFYXAXkf^JZiKm6 zrIIpdmU+NFFs;Ksao5zd@vi=?3#rRYF`@i_rpIxuLr)ZBp<9s(X&{kEb&}IxD(qE@ zkNm?D_+Am6S*mShK`8$!ZCR2s{KaTC#Y?fVLwP@ucceYoWezc8b0d>bWb1{73!B>C zKjCZqnU1{zXlX;&f>b@W?=FPo^X(HC1)^aT=nv+lq8D^)WS`wj>dZYEG~^)y%hwK9 z;f$))sbKILYy|iaX;sBxySRWvlTggNnZY=Iu@{f%UuX@34%v|)!l@&X!uDr^F=)(6 zJC;)E#>DY@M_HZ&sE`i1GDzdBr?xmG5NbVfPU6j595yPJ{rbhTPdwKi`P`1sUIe`d zIU&xTp8X>}0pr(=v}V1DB`@>}bI|?xWi-zJ(i*x!A{HvEO2BEzsAT3}APgd1P}DQ1 zrVu&KH>}7N75O2XW~9AKSHOmIi#1>DW8zSwL3BT;4g(iz1wr_{n<-T+dNjc)=jKyj z0ffsw7pgO~sNLPP`$^1h$kN~gP8gerdH*rDAslp0ho@vC(Z2?KSs=X*g-WNkvvv=H zGul-s+aGdr3nOfQK9s$GV0!}0;-$oJVMnc#KjE?j=CzzO9-k&m0T8M=>!nXB}tX*8eSd!s7X$NNWqD-@?I8ykhAEfsBXobt7x0C0=`g`zw-CB zJV(#!AQ%V#C%rz&;c<;{hASVi@gxwLYfuzDj=(b}rVR+P*F;_>aqJiuZpCS6}q$;=ubLa3LGZ2p_k{O<6&zT znB<&1H;~W8b$%9hyqM}N)t>o;5zMAry&Hi1^+R?>%kKmTx|#V`d~JL1kzP}a z-cu2KgR2Nb4x?*@2t)6eqz!L@q9*2uw*{Se2ZPSu#!zUo)3WIUNmm(UeOI>K0cS8; z9KrW8a!mdiY0H`nE|x{;p3)uB0i|m7$_uaAZbwU6k=WFkNLCwPS6K7FaC zkcvVa66;y)=e)hFOwib(;wIx0acoJeQAy_V=0z~CAxZOk{FvI@jnj6gt_??slpxSz zKSRoQK_CtvNsOkuSyehHfTn)bEOjZYeCoDCd{hW_$0vEJme}BX`)f(_MT6N+>t{M0 z7h53(8i4$fp)+qAml45<{(2fnA7IJvEYMO~C3qnWTy*vwYs0@*+kLd9(8@#Kli}X< zoPLWAw*(z(DVz3rAIl&PI3VX5V-jlMpZJwwK$qsWC7BC*?H8{;)4}`Iy)V^bXWllD zAHySdDV%5m0jP!4rlR48CXCScaoIMBBkjW78L!52D7(+Epw&h%o-ulue-TeuiPQ6F%)V<1| z-8>3T_58*($y35nHszESy@ZIVlel+z- zRh^;2&@C*XcC#*lcoF=KN@Uj}9{rDY2*vf>B1j}?_P@MUsvu*=3Rq1AKVmA9=gL1y+@BlL9xsuh*W%hRTf z5e#6{iBe&DDxp8Oj~BHw~{oV6w4+k!7jld5I{pzW2 z@#W=aNK++KPRZOnzyG@R>@9(h$*vYTloNZN1dSEaRsYF6pj!1U$FOb*`tF|R_%PA= zYUL52;`axFqZX{Nnl|hd@>=7-(gCz)BPSI+ufK2|eHkB}zxHLT`jGpIk<{{UWrC@% z7-_nZPlh?5I%rw0`dhw%LUTbz9lF9&`V>sBc8DQOWB~A)-t1RDfGd~fc+vb->!wo? z$c&oQkH1rpEbaYT~jhd5p2MkO8@ zVOd8&WS~WPkK4r&$OnqFi7uIBJ#%#3HPI+d32Pc!v@M3OU2*)!1t%e0yukNprkIG2 z<_vI3QCdk5FqK%RvJ;cPBV{EKpCi;jvW!*PxVEW;J^QSGrR9W7rt41w^DJh%e$y(_ z!hNFoFma?6@Bur4IxCbVDI{Y6F9Ld23|kxd>#ceQx4CK`_j^{WTe?(gH>j0OVn~}b zuv5aK(X9i>wNRs#R@U*~kM9^0FtrZoPf*DUm?(;~(?bc?V1W-sk;<&bUw-WoU{X5ZL4L%{V{e@Pup`R2X5;SRpo* zfn`#}9A?{hrJ6k*^@i_nuaP#rbnV7o3+F5sORRo?8MSAyLg|D&nVVce9n+*G(ki1QLok{4d|*4m-G7muVoh@f$9%K{&v@q>!v(Rn$?u&*38H!a7cd3DKq z=@md52sO*gk{uVenPoHNTrm4VY2f1lRVKTeTn3dJMF{=m(Peckag@$5nI`kp14# z`|}HLKca0CcY8hVtVGSR(669`N{R18teY#ORiip4>A)k;(M>>=rD!A+LS`zS{Brij z(Zhm;30VRR`sN423l_hOJ(Q_+$_bJ^Uu|8;_!yBEdJ(z-2SJrAT^hYwtqC9zhsH>JGGPz)DlJ zZM9zskmGJp5%DP4aiQiregfc^?6rDkjiOB9&Ttmm=64pOB?m|EH7Pe27gBU2YIkl=uW~5U>6Gzl0P-4B#CH5l>918ap5LI^9ccZN zxb~N9E5#*i{s~pe{Vx{p&3~fz8I$K8yiO?~=I84(X=P zxj!`+W;5E76#bf5wJwRSc;D%ue*7Toe|iDF)E*xg--IsGZfJt443-Ds%X{xS?ZN!2 zQl?=tv|lZKl){jUo3#hk&-6{+o!0&Bq`5JiTFbAvf#ql5jHu|{<&Ugcd8N>QlCVeQ zy>I=CgXerQWJq9y(BV4Q5M^SuNfsjr!N)Z;)fZU<3vAI|zt*U|e?10vBGV@a?B^5k zS8`ZibDlZ*0ggB*kuV4#{e5UX9NLG7Dc`XPiG1RG@-W#Mbx=(5WspEQ1tJ})1ndfD z1^ZPux(+h-?<}o~7vNYHZu3lnkd>uJ#9GQzH74;4xi1sOc0!pX7m=9hAHbk0F(rtr zwePom1kul|P24z}@2pK;OO_Fe+y@04Njr z^dpOtfr3VAX#Vt`(4>oew(!@ni0o<{bWOq%qKyC;mqwMwl7Ns$oK{XVabb8mZ1=77 zYV;b^s9VR-C~BFCD@+N<4Cax&wVuq*8k-)$_ZIPUHf)n644@-ay@c+3AOAaO?Zv|k z^jwgsd5*Ly8-8G_~`*@@HV+I=I2!-MftGd;$ATPxVi%7!VhT=JT%I~3mPxR^`&cA~ngARlbU@usm{x`*!tiG2{ zj6({BN5Lrzbu zuQFYAm3eHmR#GtLlcA5bk5BvA*oQr^eRc#bs6{B=IulukS!{omwp9;L~xfp8Ka*$I#XvX|al2tEvNnJWq0DX)bT3_6sshtzvbC>oU|f#{FhZ z=QO+Iq_dKB@m?H+n4#*smrI^Rg%#aNHe=Hk0^QW0xOr;IcE0e|!JB#IMs*eAGz_0j zc1TmQScj>ge2nU!(+Okh@v!~Dz{-0$QNt6Z*&#~@wHrUrN6RFKbDZ7_p1@1=6Pa~s zE*FH(3TzMusxz3H(}WerjMXBIQO0fEo(s&Xp}Z1*P9L_@i0p3{@hG`0-2qYZXq4og z^1J=|>7s2b*K){AYp6vU@Oh$KdC}45bo`FE*dsh4wYd!)xNty#E znl*Jw!G+w{AsZ)B2~I|w+DclQwp4!GMYkd=K;@$*z0?w9<^Htpfkw3|w_fR!(oeE@ z$kzgXaPMnQ=cAb;dhVQ5L(||V13Z?shJ|O>tnx#Whb%MfO>FI$1dLuUabNBj9KCN$ z9WcSpFkNU*tHFWd8b3!EDH*BRpK&So4Y=P9ybqnmGnfrp?`^LnAL)nvC-6G1ayU`3 ze8Zj~WzI#ifX>{t$E`NI`VU%_*Cp|2M(*afBM@-%0rs02t4pQDPUgZERKTW6Kfp{QtUI( z3vnO%vprObwkAwb2j0`8Y`LGMpis3gd zH>-(P63~XNj`@fl0-JZ;#w^?OKwnkZWzlm6*O|ao7C?f+p|6$DeS_Ct@XU8X#R&+# za&5EZI;Jb9qm3OYwru^N-%*mtc55AvpLrh7$-@7G6!b}GL%QGQ?=M<>__~%&vW_KU zNLY9E`@jkUCUIK(hpO*+leF+XKtp4NWntfMfJ-p=Xf4zP4y-1$Y@rSad2hq>vn4cq zB+>SY@9q}|sVFytqH(4OQES0B1-HNunZXeEuUh#D-+Wx3ZU5 z@J!x6Efb?Jze+sTHZ!G&5icROn6o*q+cfSWsH0-xw0NR+n+fg4zK-|QgUZwkoWzye zLcrt;4Lk|dVPL)nANI8?I6FjbT;pEgP4HY50JfRQe_%;6@9ImW^k{!*!N(t$#m`X! zWgzt{t;`e;fCfH^yAm!Y&IN^Wv~DFEPK+xML+_`2eiwf4{niu)v~b_|6K2NVUUW#CeD>_~e9S|RgVb>;_Gaq_4`gQm3jN zY_kQ^^8uYeL@7{z#0+fAx6{t_{ev`dPph)$dh8GpsWU=nWck}OXU zNI%=4z9pX*ttNa2G!Dd{vmUP=o!@p|qCF2b;vHyt$l_q#gM>pOii#y1OY%QYh}yay z>JD`|b$i?#Q{&^ieklt}G*auX&2i}$y5iBP3EE~t-&V*i zYYJAi<3kPlcxtaU5IbBLPk_3ZK;;zDmV6lwoaW5Is_Y|M2Wkb&h@bgF>fi_2yaqD}3s=Z+bcjdiW{fSk z<(FdZT}n--@?{7*<#l^hHZPvWu;^C|>rYzjb9~uLy_owfu}*3wGgVd30_b5;C&gnio_tyyzGf|1m#{ znlRqF@Asa;*k}FfKL|n0Bmukq>=MUIS9YRtx?chvTw-}wiE6Jf^_A#R{$MJOVG-|R z1)^$XT<#mnbB&Z*!7}%Vw_fNRb;Oxdgc|!BRQ?SXk~UE{Cf3e%JzjaY zV}#ZAH9S&f5r29`+@NFU@U!}GK-N7o;AhKrM~#hrewr>x4)Vfg+JrQO2Ox|GA(>y! zEE|Ih-Dzh=yFD5D(CbAvnpd;C7e(SIprCyl?Ixl&xo}%Z+=gqN|G1LA*Av@1dgnrk z)MNJ_} zoAq)22Ea)W;MDK;q3P`!RUzH{(2+Pe$9q={_6N~?5^e>JvJRwrU~LIn{A~$fdDT%m zw$-u>R;Konj$-{wZGy=Z6jfIsZ>%i#!?-x+yz0!u5q@;6A-NRI$$8I5Yo8f=J#Sxf zKNmY;Ed-TFVcTH$G3?50m!k3owDpRLPWyet+s~~-2G|Dmux1L1IExc--qQnR0$wy$ zexy;Q$8*-kqjUBe8SEM}y=1f1g2M(D#jp@x8*Bzv|J90WLMw%J}aG|qjo)R#n z2c#PjGBSmcc<^E#mU)rQsoRRM+ec!gM&9|6%3L9&*OL5Yol*=Yt$FlZ74iqwEVqJN zSObmMFDAA|$c6)>VFs?yefqs!-slSBRG~wH{>rfW_w0=R+XA}nV>h>}OpYcFCHxm2RhZj<0k-FLJxu0$l_5+KFA7D z9_CHEGS1mMIOd&N5sUX%{Yqo}?LlmMDXBzk?4u!8WP7`pU`lwtC1!MYm)Um!G96%3 zEwr(LC6f-d%Y_!!qg7=vx*I z2|#UE9r9y+bh5WSf_Wt|+uzzo1w|yNoN$DmwL=C7&t2}Z^5AcijuUY75KX|8cZ)2Y z27X=k+_kjfFONMKz@hi71mg5_Fw7m6!)TTH;3!guv)4hU?t&jk3#h%ER&Nom0EPDA zcS#_S-ZLfkX*Ws7^4xh|0u97gEy%Lt$yKW%3 zvb_ht(k9W==B}lF*bi|Z|44bd`chy%a@kdQl7FzpGh-p8eQk%=L`I-+gYNZXJTw^r zGtc`5($`FH-Vx*neR;LBn7E^#OY&`j59RsWJ^OZL%{U*{)NK1wy~o5+a9}paWH@c& zfNQ*QlX_VFpU~Jq?x2UN&Q}H^;7E?WV3q#8->R%4kQsy(=6nO~%L5Dk&f1-2&l1Oq zZ($mcsu(-^UiXYc=O4l^Io;wm#Th)39Syf71mB1z<|5SAPU>0nQU1{#rXJ(>ytK|H zTIDO67)BE!{rki}ZMX1BKEAA!lJKuoj)NZ5lJG-#t&Lq~a!gXvC&&DP)2b;ZD`{tn zdz2G(r=2Wc#NzfV{nnfr$(D7LNT9G2=9kC@r0@D{f>rMJX0SqC&Qfr+7ncZDwEuTR zaNvQKl8&xY+Jj6q{v|yJ&LvxBH{I`8M)qx|D zU)c=z7N@8r8TNOYp4>@#Pl_Wt`4d3K6B%68Wj%yYis<}iE8u* z7f~a9gBdaQL(k5u5+&_MCul}V8mJOkb%lP71Oovq8O_pc^% zUN6N-XG0LgQyRXyn+L(WMbX-Fa^miva_QHmG@Z#Y#ZK#e?322#jE%i7noU>J-6V5@ zRh!t<@KmVCgmu)RvH%RGdJ`c2c`m_9cylwjpy%h!6gcL?bjkqVPEm)JQNN%Y@vrd+QAaBuh$N z_(&yJ@LofydXS`e00vL{!BJ8fUi*1nQ7TG}E80s_1WRLnEV;o`k5E&gP3(yTjL>aY zHKtS%B&m&9>6+(_g*tS2l1b33BqX3W^O^0cZX-uMpwmh~T+LWS4zre4ny5_T`GJfP zuv1UVTWn>R{>({~q^q3gF<-9MwsE!f);HI0_l{!^`|7K;nRG6o9+7w9UVr8Yuq$LD zVr6kAO8_EQvSZT3w8}E7>vj0B;~=&BusrDv>LiFKBbV+t!6Qszz`;gd$y-$Wh)jyp zic-ixe)PG=+0gFDK||}ik+0*$t|mu~AvcZVn*I`-;V8m8uDbwt8x9HP>| z(lSut3R_Zw9S6=4I`Ng(Qe_>9{aYF0&Rnc*c>|MqZ!&8+lkl9Wc-2pQ4yo5p^wyr> zfE^?TlA$gA?b2z|dYf~0hvB8A<&6BfNA{coSF3E@ELD4iuK>9=Cc#Agd0)w87PoEM z*862ZCbPejJpkm6>0Xag>}@1Q4wz*0r)NaedYv6D<984QxMLE*Mk0DfE*JbsK{!-w zZ~YX(IPQB-8&`ey?-O=gWS!NuSg$*xQBNv+>cy2*U@+Ebp6^7d&b;18RG2%rC0;_-17`moS}miHbdg_CCKtm zf*rm<`p}y3CzXy$G+zNL!|xh|L*G1t^)r*3=pvJn-e>nbgZBbHJ8|5M8xuHWVGU`= z%{E}`+qaTrS8|mv0m9~q;!SDV3PLSQ364}n>f-Tl38FHxI~Vp0^Eth%>LPd_TD2Xm zS@}GGpL}$b3@L=lu;5|k19zW@b^(jcjYRY!3(}|f)42w=kh|nb*~yRKwRo1NWEeNH z*FAKWJT5)Wo>21+u&YI2V!vD<8W_?zeQzNb(k8+<0GB84OhNNrlF(O;V{=T*;NjH+;&?3gfz({Lp z%p}i%sL;pKEs>-)sNaRER$LGFIt*>{l^o`D6RXcQUXx%aKc;jwn^*NM{GJf+)PiYR zZ`|_$=T`>c+j81F2eokrNJ|RW;SpRPF=$!h1`6(UGh<9&RX=7|T}ey#DIQ-8Z@c;X z@i!<E+VSp&~zWSYKKWPLKIMG!NxyAz=ZdHFp(Ise=FNRX|dRsV>a*x6|EjIzPCBb@E)$} zNiJK{>UMo9W*!%k!TjpU#Lh_vGN*qQox>`3925rTggpLj@K&~V#p3XZw+iphe9e^c zgxvgA%@l8Z&{E!7RU?+O zt^JzphsvBVTteR!V71o`)*JG7|4f0$n>E`pk+I^;Q4aDT&bu2S$mT_zG zWpfX3d6&tFUYZ}reFCShk=Zou;=Q^JvrDJ(dl(%v5K;bQjs}J(_U4d$C z#@t$oj*^P-+E;d&NpDfb!RnQgs6XdV-TdM5z~r&vUE%Co;4;@7Z5*V@#jlN6do*z- zS$fjIZ@m2>f_XWM2{u2;M>zESjC$p{j*v7kO|;w2*f4&jrl`Q8#G@PEw(0UZ#wf2s zjBo5Bx@UbYa1j`;S*T?dI8#BOYgcb$y}F;Nb*Ul|A%^*q8K)%##va5;x_^3n<|H-w z69pw#?*MnaN`mP2(S238pY*cCbGiORTT2nX6SIFQ zEZ@<9=)#|%C_mXuV@)`6JcLnQQHwCq@r3R;PVI1_iur4P$NL3~hVv%gWBMuT@9P-@ zv`=u_*)Z`L!rzMj@`5;Xn(b@?H?8u~f=iS7p;IEroR+wdt0x8Mb`ShWM@5m4T`-J= zU5Mw~dWv#BohiokLGUmD;H|;A@Xl|eUP{HNb$C?L^6Fr}c4wE5zeT+bvdqZ6dHl&p z5#FrKvv9{lv59RkG#0&w4KU2lso%q)?nY;|3{Ll?lkehdIU-Q1BE9$Hp3?2O?2#xJ zxMn31u}f>PBwIfK*Ac=aGmJ`TCODc{o8F+-=bkSZVJ7B*J6OH-2i}S+vJF_ZO|=XiQq^yoF^SrYT2T zVt-9kgA?mDZ1v#Mh2iH;OOAvPe>^uJ_Cn--Z7zM|s0xmHHI}<*S<}O{Q&)BSO>Xb! zfnftABAodHtx65m;!(|b8l$M#>5*IVfU|2%+PJB@C4gAcTzD5PN8uvgD`7dcdhfVTSz7p0!j`ep zQC4zrZRz*C08d7(J#GCmdZ2>P;}rr@3S~;ox97zN0-a3*CKrJ3Pe)nlQ(^Qv*V>i1 z?ZG_en~VODpG_b!>FMqJ{>pa8$EekFa28eIHjP)16SU7oC1Mc=j3h*FofAS(hV06y zp!VBcJ@{M&N{nB2z0aU;=dn_mNW4X!!A^dDJFWNTV=Tw2B-WPGr|Q~**MA$sL;mLb zOw5vzCHNpRhe%E80UisHCPc%@MEUvE&acF1#8+BGODZ+X#_r$vO4+E4XR`CTZgJA7 zuGR9ecZUoAaZ%j5H*hX{TT}DuKV6=rY2-%qkF{w+)L?bW5PG@B!t3hrxm1*xfb9BH zmdLl`sK(iZCEegjr7AKOEBM=G~ z96G3oGF~hzuJeE6j|E=hGe)BS@vIxIR#po|O7l6)sKfxff0g%oq=#qHhGAVIuM=-A zN}ZNKsQ!08;;Yc+2~L6rHK5r!NA&iKEh>FBp_3*+YOkm*?f> zNmuzd^BFMo+T|nb`09vKH;yH;zSc{pBW*i~PTyR1PwH5@cDfaf(^2%^TIMxfoxQG3 zB%(O4G7AC%CI&4F#8RiW5eAo&dT!TWjWG8VbQHE@v~OA{%f}0WnNmuY#!<*Kc07VB zB(;2#?&$5h=_*)!E|{5ma-Y;O2kPXC-*n5Humy-{1%WQK88f7 zlzB6^4Sz$~7&@0*{V~^*ttI=m_`UaYeKLb-kOmS*!s|0cLJ1FKRVx;4S-vD}J)HT$ z#0Vm`y%dNHGIm`167xe@8?I^(9LC^EDY zUkK-YSg7LQG4um|8JDn!mH9(#J?*Ic^WUNJ+nfpHq(!DtbgNuyFWTy)ZdQC?WJPHk zAvrcv8RR)igTIXa6;2EwPoxO!N$*30B}M=%XDat+ojlCKTbV65~H& zn;g4^WezG44g>3M#l!0~SzFq#$|IlLQz{mLR&YDA%lv8KET~=s?Q)zQFMI?IY{sDj z6Q*hJObfg3=P)EJzTlGDkNt)~(WKXoHT)cFmCNciNKW6p;WIq(*ba>iPBbgr9doEj zsaTU*A~4m!`W%ZJ9Zf8`dMEO@7A;Lc*?6#>LJ^V!E}tjfl@}U&4VBz1?GrhKiUw?B zjWQLy)Me9SXx&7*doOHAjv9p|3vSTu%PseHo&VUYk()Y_rGe`TgdHaWw6srp4y(HR zK7#-u+8ER3ji-tsiV&#=SI+uBh!3KWQ#C3QJh4!P3FO#fY{H+v{=UGaX=-TQX@Hx% zXIFryS!WE>s&%Fn2gx4Y&K2jG=09qRA~s&XbnchfeNyu%PKnXKuWFuA>}BA^fI&&G z=)4xv!Av}=4as`0KpUEn?aKTRHz)?M)P$Xunl`G3d5sH7F1st;xV}iWMQdnNuC~@6 zJil-Rmel*(;>?*R`{t2f7_h!_d=uQvsL1Q*y9Ss~7{xBy1esbh#_pUSIXuxtZa#Qt<9EoK@x)Z=bK%Z6uwG9Yb?a zJz=;IorsPOE<$S%0_MlB-h%Gj4ug1Uf?25pV|^i`?F&sgzE)a8jVO~(j}o_?DjPAQ zaNZPi?tFJjd5L3e3DUkVVq7nRyti3J@K~}UVt(WK+k!I({{;v}gZYZ~`qK*^L?6!H zpOGc09N;>klt{F7%YO9!2NxSlfXT?6)CMdO_lCz#WzgR6N~nEemP!Qa!~q*^(sH!? zpQN)1xDL$DWQfZhx9rCI67^bPBofQI)!SOL4pj{$$wzKu#cFLU0Y>peA(ZdyJJ+*! zyi3^94{8V`BCf^GMw`TqeC#}ng(n^XiSp{_x~RI)yEE{E^%X7SZiv+iGwX1Oh6%?` z%xSqq-k9#o(*8DgIn{v=Hbo%v9U14ZX*#SFqZZ&#Q1?m#BuArjbI~Ztt!})D#r2;Yi z{Vl8ew{TJs34yOL)HrD&C6hMrq+yIaVyM3j^)3zde7JY_eUytixryvj_rN#TA$xz7 zctedCxikM;0(2P0U<2GZmQ0+psA|Qru7da#oKL0E<4$i<*<-KW@EL5;8s`(`pd(ib zDeh~cM4dQO?xzE?0)A^f!fqbG&@7x>23}00Ze{YRX4RFJBG@S1USkD7ok1dxc2Ts&ruN zd2Z?a!pp`T7r04CND!xsq@QthOI%ey1?pCP^4~F7Lk7+56Ftb`F{kQSa`sixTw9J& zvlSDLsSgIttb_`xa7_z?*yCow;I-7|AVSamP#vu^sYOGhU>oV4TyR(7)^SkoYXj!) z%iFE})bLak2yq+@wrPSJV{$L5C?w*=Ftg#%zQzPVW3`|Y@28%7=1=*6Y$L&?aA37n zt!=IeyRK|szu5UxMP-4NRnj1KU#>v(YC?8SEQ0lKVw(&I>}cU;jtLC zB<}5D)obKdDkhfgJ-tN(V+E{|NCcNc&?>bNxWP!0@KR!~m%b~*$H@K&9P3U{DwMxh z*sUt!vZ}1oaIp52b&8#NkcLY#dC}k#CC^39%?G^gW|Wej59P?MmKKOb;~mNzs3y!& zZ_cc$2MZW{TpW;Ax?8isep4o|`_-ZFS@1Zn{XUOo8Y(6+$%IInOG}D%Y+ajdhu%rN z)?$u*K!o_z`z&|53t69b5U8Xl?GZ(YJ^j@yyzdd}ibO;b)s5#e(};x!t4icmc+T4j z?EGjG8^~)>&Pi6j^kKrZv}&Vo`z~%E@;3k*W&jO-rLIWFeC&bCTkcAYqFzNjmK+OJ ziB@I~Avn@1GTEi`nSHOKcYV@8*Tc-SIe!32nzb2066F7DrHZs$caQLm95_r-&LY^8 z*zLZf5|p#6)kg2m?Ir4iGB>G#OpE%hQYVtnXZhrYb%;PNAdtUUlAOf$5m?;g^;SS4 zQ@~ff#WNfKMFGC}N&hy=>RcZ+v$gK2yU65=zO{Bf^#mO6gZPjLxR4R*3nqMbByUuY zv1&3w_Mh6W-#RS~QP%}aJu9nK`OmpqA~~={7n>`H8!wut9jh4xR)}Z>^G5GaI+-Dv zaim6|SjYO?Rj|%$b?UO3g`n6mxxnpgr08Dv8nZAw99P}k*o=xgD!u%eai-XjL-+IQ zy}pw2-OjXJg<~44zr_*{h$B^~eSWac(0qfr06JDsd`YOBY} z?;X;Ba|M2hU{wkew9S}YkWKvEtNy*{^@2)@l`ItX@ zrznKOL2W^;pv{6KF$3r+`~bIEkjq%RWrq{LXV_a1Z|Mn+22y)fQ}9u_^}ZI-f}pB= z^D9=C`-MV>h$N((nX?!3u==%a}7&|jK%$SQt^I*`E_`t`ESxE?Q>Ui zN`02+XcVY8E@_b`8?GFlJhK-V77uC23b8v&!FVtO?yto-=99aO3rT_lCE%z;eWRtx z1*}?|PMYb4bZ)g+5Uj0A?6(Wm1W8O$YDbA6ZgTgbz@h6ML6Qoss`MeL)ylPqOU!On zvDBS?SsIrzYOPhEymN|@>Q1WhGElb@i%PuEQTO6={yFe|ZT}{sS=qN5|%s3w9 zAsj|~cjWg=s8W<_S0l(Cj$TPXlXp7$a{72wF6}+PG@9F#afm8)!hM?uN;-DsB{&i# z845|()3DNMUuw;mO#ouIh??uWE4akfl(AFs!xbkIFzXM%=+EnRROWklPVCby#bwDZ zA+;6p9($57XPPrS(8^!*FDBqGRO3XUtk@a`DG8&H)a)3sb?H~k&vfrA!BaDy zYn)kiYp9sQlK`YqV$UUD>kj~JnZB`1NAF_{!?(xqf!}$0cR%R9d&E(`5y|jPi7_wk z%>9l*tJDC5qhu&tH4o!9_6@x8RWpvQexoh9muAc&nE1tE1JWRRD1?o?urW) zh|TWmze)Y!Vl**q@H!H)gy^{^_t4QTQLU<7gwaFm3?gYyRsez+{7t&(+`^C&#+Nc@ z#kRKjjL|Pdkzk;SPZcXcY;zyM9~c8J`%c&jc7@K-2TutUBe-b7=S<8XH)36W)243fP$-H zkO&&_+V~Bh8Ws51?}Ugk$FtAu`#?O37pA~fg?Q%{dQSen*vbn)nS4#8?4Hfk&j=#S zgsmj=vsYjf5RwgAVA0s?4XzbLI85uD{iY!Xgpn`?Cak_}dO6=jPPMj;>(tpY2-Yxx z`yD((JTU`d*x}Wg5AN+lA|7@A9mt&VD&Achr7tbmP;VxkOk`%?Kr;W zcJ_rya)26Wkz|G-?Z;o8s6Nz1A|jH&;rP%~tpp~Y=N^b$Qc;X%brE|TqN!|WzjBEN z()=tnVQUM~^H6c29e;Jsz&lT^?KAd_frfmLtcUS`avYCXc*HGar+WXd7%bBP1(P-v z!KMWzCD}}lzfU?NIC%YZJ@XuF`2G4zZshg|zU>ML9JvQ-a0y$l70zr-gCHbY&*Z`4 zO3R=n9rdX5j88us$i5Ex0eJq4j1^3gS2Z6PIg^<}Wncthw4WS(lGH@Qlg(*8hN@$? zZ+e_*$1^t|l72)#Mb=snC=9LFi|#WI0c(cT?aocC7io9zPokuIVM&(jPP&Q*^Fugo zhw=Oe2GP*u&=DvAa@8k=jeM067;z3zk|jAC4bORKlx(0PLv}-AWc_+#>wB^PA#MN> z2c@86aikNSRD5_+KC?&F_FovjC_pR`=iOI*MI~HaO(OxqM@2Ye?OCt~n|}vj{{qmf zC5SNOwu|0_Ba5qaJKu|)ebxiAdejX~-Re6j0U&!#xJGsMi)hH_Q9roUt!`lNN;B1~ zr8U~ZUe^rtOff5I@8_k~tlm^EQ-krHV-#*l3Tv2$fV;4G!y~(c#iL69G=@xszO}Ph zfnh1zu(R3p4BiG&2!{sI;G{odEAR~AL~n)J?Z*Z&uG@K8XGKuhGAr~a*XD0}SR&Et zftr6OW*zbuAQ`&-6w^wt9GlWet{LVB&?i`WS;~_ zFJykcp-(u|GZ@aVEC(fQv3q#%4pN>LBOFE=-Ot`EEcAuMz8VxvH5G?c z;U}?bhdf>Plbyh&Hn_*B;W@ybKFV=C1hk7x_ZEk*HF?A5+%IAOj^Vm`0JaKPcn@BZK*pbF6~eU8iZwSbvl2L!f}r;|GZP6@*Z_UgBL@C=bt& z_$%I~&@727DtU?;#_yIqEKmCHj1~|gSe;(tZplmsm3>f=|l7^1-KTegbWMypXs%qGh{S* zbU>j$Kf%h0ZAlJwA>}VSB#{4+<`cm-Bh(T%x0i!kk3Xo1vLn5=pPupS_8m+bEDny; zPe<$mA7(;1W(xA?K6j9GSNWku9}fRy;GYcqlYxIS@c&C0_!D6ub_0sANViX& z#m7DQYcdYR5$7ee5e+DMU$bupmj86BV+`Xs&XN>sYD9_~kpZ=fW z@Xz@D#o?bo{1b?Op}=1m_!l1i4-o(SD9!%+@fj%pFge5FpFsRm z5*X~CHvH3uf4 \ No newline at end of file diff --git a/logo/images/logo_original_samsungblue.png b/logo/images/logo_original_samsungblue.png new file mode 100644 index 0000000000000000000000000000000000000000..78d01e3611febd7c98d725cd0c33a9a39d8573db GIT binary patch literal 73671 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 literal 0 HcmV?d00001 diff --git a/logo/images/logo_original_samsungblue.svg b/logo/images/logo_original_samsungblue.svg new file mode 100644 index 0000000..3efa33f --- /dev/null +++ b/logo/images/logo_original_samsungblue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logo/images/logo_original_white.png b/logo/images/logo_original_white.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1e839668931460cecac4eacbd702bdb1cf6e35 GIT binary patch literal 68194 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 &&W^6yL2$!aCKn+>cNfxhshaG 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

5Ö D +xã»Áyj)X<+aN E‚‡þб*I«eäH1€A;€gK( àå’êNÏý©# 0ЃÂ; +9ñ®0¡5 +¯3-Žž¼ÝPÌÃc'5‹Óz3\à1\&XÌ¥ãçVþ ¶QƒN&ðàxÊöS|Ïòwò®• ëx'Eà!€)†&hª‡GÒÿß±‡¦YŸ-ìuZaäúƒ(Â%àÑoäR…*3Ä­ð‘ݏxôÔ¤êŠä=[ ØÏ·%虁£Š€:bí,[)ü¥A²?1/àz'µ!òä&À}þï d‹ÿì¢Ã¬Y¿#ÂlDíh>vh'˜ãy‚&Ò¾#ÉWÒHWAœµ^ã‘^{„äQƒ3ù;:Ë&pUMü¤ûP4bw6ÿjŸ\ÝòL^=m¶õ;–ßNFýÎT{ y0Ö½¥ß™š鈼„~÷ÊP;3Ô¬†jMÒÙÂÊïÌ&ò;ÉNQèj¿Äï`D)A +‚cݾ ¿S ÈqR(àwòú¡˜íwÖíz¹";´#ĕE÷€Õ,ê*߉±óÕþ©M×QØw"öŠ\„æèŠõµ[d\š(ü¨‰ªïÌùŸp4;»ãY›òp6zþ/ÑwÄÀDþŠp5p¨£Àƒó¡U5ß‚‹¼ÖóÓ½ã9F8+ J¾cÌcuÚñ¨ÑS°>Š;,𫾳Úêïqì­Þ!¢oýÞQíÎÉZE‘r ó¥çqPÊ<+ďͫðÏÒàO´Ñ¶{¡üpéÞ¹Fâ§bSǦɽÃ3¡`‰$ÄF6ÊYLÆ: ¿³|vpÆ` •÷‡ ™©8p½£UUµÞA‡×ÒyçbÜÊBSHýñÞ©^›éªx”ÞYºH`Üv‹dñڕÑþÞ±vAƒÛTéáÂåÈDg$Ûù~½ÃÍeâùo½0R™ìï õ:)åQûËzdÂ(wÉØ)풐ª>9$óùÔöJ+¦Ù=ªqH%Ì;%fÏ×`Æ:_¤KtXp8ÏCÄòŽ%¾*â,•w‚ÞK×FPݨôNY^1Úå_:œk½Sš¼cñG#þÏHÞr‚üÁuárÚé]КEÞîK“ EÈ;zÀ;©0ÒÐ ™Ë`ïŒö7Y†Áë¹ïjæ¥þÝÑÙ „]ßù75ÞQøPSÍ-.Ò”úAÖ҂ãdŠNèÔÉ<²Ðµ¸ ïê[™Öƒ::Ž\!\™gó0D]@îòŠ¶Èðd/¤rȳàà#Kb*}w↉ï>Žqg{w؏ޝu`» +|ÄT"Nyw´+AGüþww2¼fï1ŽlM^uçÄe_ª"ˆüݪ»#@”xãæ°;ə îÆQH,G6..Z0È9ìíÒÚ­UKí Ã–®ïjJ`…v§´žÎî@öµ"+óü†Odv‡a½¦³ÔxSÙ,[Â1vê=›œ W¸îàž­;@€ÖÎ0Ⱥ3™Ñ'À⃠Öõ°þJڑîõ2¬Üíù€¬äuÖґ¬P;ޗó×dòÑ»Þ.{!´”m°~g:\ÈŠyÑ·fc£áÝiéháêÄb\*ôZ'eý©õsg'(=/w&cänž‹J„ßâ…GËrîˆÎçNԓ†ÐÜ©†Œ25ۇ?Ú•¸³ +¶ô' mƒÌíˆÁ2R\gõ»û,–øYʌìQbDÿ@¹3ÕŒcÑ{£Å¢xŠÑCXNì&†urGß% O 8 +^É4@a“~K$wš´¨ÖýFª°™­QBŽ¢2¼Deð_G¿‚í4ÏaŽ²gaÜ vDŽ7‰̯‹;1ûnaX;v‹Ö¾²£/à©i«XÄ@³Ž´WR‡í.œ‡;Ìo_ÍV8Üè:¦ynÍ×ù:2¹äûGa¸ã&f„V};½½Ž Ò0gQA^YØ9±z +w﯒ÂösÖé7‚Û¼e‘ÝÈzÚôÄéÎMˆV}ë énftD ôOwþ¹@öøø~ÿvÆ7z¹Î¬X¿š ²_9C4U­};¢÷¤o'óàÒj–Àæci%õ[)!àۉÇ_þÕ®îñDØÛPÕ9ÿ.­äBÎh%nÑ;–mÐ5ÞíX³  é7Üáo ¿D¶üL¿è-‡ßx–v;˜8‚A#fGí/+v; Üœ_,Z)ÎiË +a»²À¶„QB ÿI+â%™n¨_·r;ËS!·#a÷ª9.ž¢‰¸wÚ~ù¶‘€½ÍêÙ|U'keÌÆ +uw╶ˆ»žó}d;v"½–² ;ÎÌk‚âXÛ1jóŔ‰Z­÷²Gmçf ¦ízH™˜J‹Å¤í<Ûãsù4(¶ó¾òÊ] ùvZßy-„äu@µ¸c°Ý Ò¾¨vfö@ÛqMK߅ð)8g)0À·¦v°¤½˜*¶;Tl'æe•;pÊAÝnl‡M8ƒ÷K!Ãl§š€ý‚£ÁÔà v™KþP1–N +7ÌÄ;ít& "þì &ê@´ò]¤7KåwÀ Ÿ”ysؘÚà5…(íÕÚAªpå*º7ƒSjú)%r­ôñ@J8ºÜ¦À™&b"Ý» fVJiÛái‚ár˜Ü)¥¼•»ÙQš%ˆìÑmncÍ´,x« +~„Ú»Îڔä/’ãz—›æìԎÍm +ñd0?0µ#žZÊ÷¥¼¯L>%ˆSö]¥ +yÚp§VW&¨ÓN6÷ô[å´/Ž/τÁ4(dD‘‰¡ÑKµÚy³ß 0ô;íA‰cÞÛCt€$ò«¶œ0ÒFàªãƝ(_«k'%ÙÙї’Ø/RK@Euv"y‡‰+™%M`vD’'ºÎ¾¢„ë睨ˌ6;r\oFwüFØì8?É ‹ie®˜®¤%';MyìþÚDâ#§fGJ†Tƒ’s¤­ìH"ÚJ4Á ¾Õ%¸ N™ÉQa۝>k`FÕAºñ5V¹Ü °Ï™S½+vrý"d¯ æär*À.ªH•saÙ ú‹´Zm(7፠ªQ‰–ˆ!+;؟0&wñ#Zça\˧B‡y²sºôFcüÑ%n”ïûÜINvLq»ß$ÒdÇ ž—áŸ0Ùi£&•îp L·dG[<…xyºÉŽ<=ácbU±;ÁA`w|±O’)”Hdà:¸sñ6g¨dFŽì”.YYIÎlEô_Ä3`dgc•ÝúøvÀiEvØ2ÏMÕo)«˜é#á8ÍVŠèW&V‹J£‘5å(§Í\?ÐìØÙàBW‹ ìܪ%|ÄRvúNâ»æ}aGäq“Ï #‡FažÊä‰aG·éaǤЋ&¡‘%!/˟kñ¨²ò´«fìÜ܋^øt>¼üîñBWA’°ÆŠW.b5öÿ}'ŠZáŠÑÈñ3~ÙJìx c÷‹™¹Db‡!94da;Ç÷†«';ß'¦ÃÍpP'BìS*ÇÑÜùßp)†Š‰\¢ÙC¨W„ÙÊ-l;Ë-Ã@H6‚¨þø +й ;å‚0Gùϸ +Â`Ø¥Ž)¨°Óý%ïØÎÙ`sQØá!¡ßS²ÛÂnAU±1 ÂÎÖ<ßb=¿ìú&èOѸE*¸ô@Æȶ¥¬:(nñL )n žykâk‰Å-¸p þŒOŒ&“íHJ†[²Uòv‘Ä‹-‚%Z•¡•‰A[S߸ÌÎìm9Øõ¶¼™ —gÃ_G;oKº8ŽƒþGNž¶_n·† „?²Ücà6W~ˆ=čˊñ×Ú I‹U»â³høÑÁ·X>¨FJ9ùç1½×ñ½QKîuž$šå€>íuòÄ{@Ÿ&ºÑȱo½NA+ +ï3˜’z$\–Õg…HeŸ’º-e?øyжõnÒël¿O±B­)s^'F£Íðßr?{|8e¿Šd^§üWª¢~øQû‰Öüat–ÿɑŠUI*#ëuÍ©)Œ,ȃ¡ZGæéŒ4› À—ëêâºZ«ûψ{šÀºŽÉgØÝU×)„ø÷qK0…„Êä\Ço/À¤šRÖ¶æ:CSŸ²|­ú"kõQYëì²>½T%7£å:ÕK0;¯¨‘òe•¦öVú̵DŠ)×ÑUÄTÉuª?¨Nɘ/ѧnÒÇužÅu¹ªP Æub3Ÿ›—¯)R&­¸ܬ©Ñ¸òD\g'Ó2w’Ç|Ž‚+£u¨ŠŽ($ú¿’„ëˆ[>Vú$»ô«ÖÜæl¹ ù0INZ19˜m Re®‹Õ_Á­£6NÀ!].ªÎºN]¸"Ý֙>Ð"±¨3ø즏Ð:^‡WpË[‡ ­˜è5¾K¹^ëtN+–x«"©òk­£š;G‡&­Ð(Ö±loÒ¡ÓBSKµÎ|´b ÝI¬Žu9Pë°ò§Âg*êþÀ'ˆ;ÁˆPD<ôIŠ_Zp€ACfðsŠ;Ӆ$íÒ@>Q”^ʱ¿MñÕÁ„ +KôSŸ:ßýŸOEz#¬Õ1{dRÕʶº:‚¤½I5šâÿê™Ãèê ÿCyÏc®ŽâQMFHÆÈÕ ‡õõ†Ég^¦¸:•d!è\ju°¦:ó,£œ²»ˆ¶:l–èZ«c~¶ƒ¦P«ƒLZŒ}-ÄÏÕà8«Úï’ìê,3â>‡!—)þ/ºmÞêLÆ%" ŠsçB+ÓxiXòªsn’©ðñâÈ)®:µgÏi]§0lÕQrþ€DáO~iiX™;¥:ËÜâ!/§]•¬:՘ú&Žt+®ê°ò¯Öpñ«:“Ödf‚‘Ÿ¨Îrü0äî#Ž^iªÓ¾³˜êpøŔó §ãr +9ªƒžóՁë Û#ª³¿j†ê$þ èÄwŽ?{ÍZªnO?u%º‰%äs6Öh§ò«c ×rSyàG}å ÃƧÁ–lêÈO-V–Ö@ã¨ê”%¢àªú*Æìê4 Ù;1#“PG´DÒ·´›B¨s8@ˆCK/‰ ûBµå«ZpPgÛH¸OÛéؾŸaI´3wË Îó±5.­ó…0­Îáéd^FtiAW­ˆ÷±eGf+VdÕåO§»|O- +ÜóˆðÓYéÈKGÖ¶(ó7È»½öé ƒ=;¾ÏAʪ÷=E„áÁ{¿z ƒ:J¢¦èT>ãØkÒ¾õ‘Æ,®Að@ùÊ؍y§3s,Øý,<0îtà†ÕN‡ÐúÕDgª»8è Tï°MÕ&–vX8’ÇÁ×9—3\Xí‚xöÆPºIætv21úU/!§ƒð`wŽÕ,˜Žcr)FQ8¼2ö4„ãÉþÆtßt¶7HÏðÖé‡É‰7õ±é¦CáK;æCi 8Ïszñlm +rìîΝ’ãô°-‰np]5Òì.1 ¹•tAMgªd— ÞQQQ%MGêuǸéà… šãŒ'șNz5Ó¹†ÝéÈ;wYÛ\Sé6¥yʏ„8,¦<¬ðî+U<\éùÞ¢äwáni¦w}™V‘-”ÅA\VÂtF¸*~ ¹¥éwIÆP™×µø]´£ÍÆ©L,ï2t©A5Ó I§êD±hZæ—N™²&ÒàK‡·ßEà¡£÷Ûß%`>S‹›‡—âHl—•´lÐ¥“¯J‡ßÓV‘+—ûB@Qßxù]N™tä… Fî® _Ònéhv¡¡ï»`Ë-5¦WßI!KéqÝ;7øԃ¢²òâJ'F¨±H8dìVp¶JÍþŒ'ïJÃ×¹o\ÔóÿårJGaë§töMÓèü˄lUe˔β•næøš^)Í†ó_o[œ›_%VÙÉKÈò¤ã‰…Š +šàå)N:˜(0>¿-vY„ºàeÒ!cE†õ-`ÒÝpIGNÝK6!ÎL4væÈϒŽø¦¾ãÃèN%bÒf£Æ[ܐ§ÅÍú P0wÚ‹t*…HÁT—"« «e\oy§éuÓ!’a«¢l÷Èꐳ©A!Ì<Qå¢Øâ¤#j¶ ÓR'\¯«2—;Ì\ÇW=~öèØÕ(ztÖϹ„oÏ)¦†Ž:6' »’)´oÆÌс=Œ)cX.zäè°U·i[ 8 +CñLa¶(;%¨î¤×uщs=ªAL©_ Lj¢›RIJ­Œ¹ð˜öT€Ô±F'lgŠ÷ô*©Ðå}E¯ë: `ÔèäîM(.ìZ2Àóíù-ÊGJ6ª˜ßݐ‹¶ª«¬Cäò8·ÔZ£ ’Èyw òE» +F#,æEÇýꪁÕ#‚†¢õèێ.R9‡!sʝ&e²èèMüi§ŸÛ$/]Ñ 2j·m–Íc²Ú‹¦èý£ïXÑqj•Id¿ãòû÷ƒùγÈÇBE‡~UÆEr$ñò6¦èDª vˆÎ!ÖH®m,¼:’¢ÃŠã6§ž'ºœÙ&Ĉ~(øõDeØázÈ~?=–¢D§¶ßäà@hôœÊÀ'_S¶=A¢ƒªÊ‚w›Þ:áO¿O™ 5Gjõ)ÓDlCG; ði_ôz1 ^ßÍ)ڄÓ¸õÐi>@ý"·"ùEÅ :‹5«@g‡"ΰ=:b§‚y9¡Í„“:ãÆÀ™îà­*[ +èW ·ó˾ûnè(LfÓáùŽ)ª¡3ΞSJ £® n´5›T:²˜©„¥9 G|Jz,?ÿ­y éë£Bg„ñjJ`1SÔJ¡3n°³à§û;¡‹ *á‘ʱbàñ½):ûˆÞ7'Ÿ:¯ËÚD¦J蘄ÎÁ§XĘ1BGº-wÀù×ü¡0Ι¬Ï,ʃ tè~¡Ä =‚ØF-Žàµp„±¦>l`ÐA´3ĔԜøö]\W¨&èØM¥’£32¯Þ@ºð©0±#ÝGpñs40Òs † ‚Áì?úÏñÆ NRg#@â°nÖœ*:™ë!NG„è@‘8¸Ô,-Ô)hޖØ8¬|ž1= ڗðc¸ˆ·ÅqJ"tvƒÀÏ1%µU6ÐI Ñî¤KJ°_Ó²ñ_œIxGÓ :çDx‹Aiœº ?Gzž/ð$(ýýݲÙ4E¡º´O`InNí¿–Óvp í¼_(ú°àFtŸ3ñsôJCÓPˆŒbRKý`/½Y +º éþøKù-"ÀIï›4™ó—{C1Ä„7p G0¸Ê¶|åÝ""RJ#(Ñ°!kfh쨿 ßú[jßfúV{Ó-çÅæÙkß¾¯ß· eœ†©É£Suä5F ’/D¶mR¡ÓLÍeì¼C9‘u†rÄ5.—^CŒâ&æI18²NCdXuFFÎÐ Ó@Xq`Ãr¥ºçžÍµjǕÝIÄ. 7Z8”CqQÞò;ÜÐ= ¥Î.øÚù†(ø'ÿ½- ¼úkU½Sé÷~«ØÖÔlzu{;äP¤'Jþ’ï²"BfTFœ«½ˆß·¥JkoÑÛ¾5áù0¼Zp7ôðhÉy»XjÚ¼w½²–‹Ìår¾¬Òƙ@mƚaÖ.æÔèNù¬Hèúú +ÜeºˆØÃÖj7Œ{Âò¸®],Ò¥lס͖Œ "…HŒ(Æ:Â‹Åb~éNaÜØòa›ÑÑ&µªUU­É’*wZˆåªj˜¸,îàå0O›;83³³³>Ñ\ù°ù܁3Lwð¹€…S~¯ëÏ4Ï$wñ‚'w‰YÉ›r„Bw P º…î@*@@ìºå´+ž#¨D}¶3P‘P@ŠÅ3™–¤æ€! šdlœx|ˆ„.—Š¢$A Ã@ +)C€!ƒ¬cB’½ê‰ìe`Ȗ‘(ðë-g+OÖ¯†^wÝdÂj¯ ´™ö…H +FR<тÒpa; @JìÀK“ËdæÖa1ê¹U… +ªÁ¹ž>IÙHџáOYgmÿ›(HµãT6\´¬Ppy÷/2ómÄ°!)eꈚ²Œl‰?Å*/›TQd‚ŠÆ9jzǍ 2mî5Ÿü#íBosߤ§0%A 8ybÅò€ëބä°L唃³Žx7^7œiZVÚÌí¿McËS +VÕx˜t©Ü¼TdϨ:öLKœnÊ Š‡ö>1_Š¢;2¡«!Éë) ²Š9ÁP ã‹ùý^þ2(A7¿ÚFƒË줞aŽé® +é îBÆ åúI¢iŒ“Y½b÷„»…{eÁh,Kh6ð¡‡cBD¨™º$2ȨQå›Tˆn¤åNJÞz"—T6E-Øõ§'Xå0äG¬‹e)6ª+ˆÏ&Ú¢-¬¦Heè’;êùý1èI^ñÕy\R"@@‘÷bÊ.)´±js£†uܞY;)—ž29Ôܘé™–àU?4?°åØ$‚Wì^WŠªªô˜JEÆ|H”[D@—Ý–Nî ¢(ƤȯÆìžn—û-Ÿˆø ɯïiL[£‚[¶ä¥UˆGë>ê éó'F›HKì #”b~‚W§#–òˆr2÷)>~³©1&2D*÷Pl*^qÙbÖä[qŠû’“Mc8Àê^ÄÂYÌ£¢A¾2òÓ +!Êuń°ð½ãŠÉˆ˜1œ(‰9c¸~?ù\ ¹ +ˆB¿ LµCAÜ®.ª2­±Q_üCw™bò½…_̾²[Õ '±ei’î_ŒÃ\Üùã€ð¤Þ€L¤¹Ú ÞðvÜPþ‡7ã̈VÍ[ö>¢‘¾™ƒ–U,1›/!bdVù% |#_7·LÔDÆ)þñ‚`‹¨‘ð?P¤sG¼zùÃ5ê™õï3é㠌yÄA„£0ë‚Zvr¾mʁdÔ{1¥ý²4DSö’Ž’p?/7ºü²Š‡ƒuñÄ!äñ +ÖUEhÖÙB*áµ½4"gÛ}˜5dhX$Œ y –S4|jáÿ#>€wWÀàGÞÁ›™Jæ~†ò8bi‰MÿlNW‘°¾CÎ1Ïb—¸¹[#ö˜Í¼#4hòðèïÓXÎ4WÉ´ñ¥ x…È¥‹\"åY9#ª õF:Úqe(5Ô Äd’VSDÖY%¯4¼=ˆÂl‹pù©´ˆŽU¶í@ìùzºSõ˸ endstream endobj 125 0 obj <>stream +ë„p.­¿ÄԈà›<àÀ„Äö‘xzËê½8L@í(¿ Ý´gúJ_P@£õ '~{¬ëLöœ-QUr»PâŠÿJ>œ¾)ª„Ú*™Ú¡«àœÍM.O|Ô.býLœX +{¤‰,¿‹­ˆNb +€¡«¨!„xNûœ‰«‹Ö”ë-`JàçO„©»ƒŠá±“1*3l‡˜mG ­7Ií4OìûI#Âq+åÈx]) +èÅl¹íw00CaÕÛ®Í€…‰ ã)oó3øª +M.©½ðªiÆ +;< }üËH” çâ±½LbBr@Q>WÀ° +k’µõV­j)Ž`ÀÓPtGn¿Z]NGÂø-£8ã—§„‹åi÷W”–Ì@YxxŠœ},å/ìy«¯?`,¶†]A˜)Rg¶Ñ¤ §@9^ð=°¶;¯-Ė¹|îL늮§Ë±P§ÃµËÑCü­n¶%h.ŠZn“ßA{\,Ï­ +„Ìq^ìÂÆÞ/’Ûò¨¼Q#›†rÔ¼ð­càcŒ# +¥òmŠ‘T¹“ˆc;7‹¾ë¦ˆ¸ãoë!× 2£Ð°Pxøòº‚>6ŒÛ X.k^^£o»©‰]2‰#{!Ûèe´êAùlQ7Péå\è¼èå¼xàkøVE:ξz=›DTŠ\œQAӓé1u) í=C7†GnC“¯+'fŠ¤5´ åÈÒHNo±X«“GzVŸáïÒ7۾ñÁ"¤&¶‚vóÓ^ßQ"—·áùE~Àw/WâSE&—R°"Â;ۆ#$:ëÙÄ|¸ §wÊösî(q¥ ª­šèææ ”²€%K nîâӐóW³öü„ªNÞØopÒÌ¡*›Ë„?¦rb΂¨ÕÏâ@Œå“ÚEÏDß+1h%…?"¸‡ð«©&ð9‘ 1/O{"d·}JЉkþ@P›È,Ö>™A¥ nÛè\åLXz2Õ÷’.¼®Gu¦Yþˍ—j¬2Üá768›£¸;õ•‰ ­N= Õ—µñ£Ð1ô˜“û“(ÙaÙÌÑ*D1ÌRõöø6=*ìƒ\” (´åD;3"׉­A\»÷¢Ú©Ë[dme àÉ6B‚k¬¬ð)î-q¸I¼z¤ ܕŽÇ¼k+nQ…Á|×\}_¸ ÐË?ø…©DÜ¢L¶Ænjî³c’“â¹ïš@_+ž5@{PsSþÐàÂ"Êá®ÜX4|)·½;·•3²6Ññl¥å*ÒîóˆF{‰lK¥Byì"ú”0Œˆ?Jcí¿O ¨ow·è-~5Ë,“ýar×p¿!‚ÞZÚèÝQ^a’ žöÒDhýOÍóŸË)Ýے|ÑȬÆʔðŠ¨9|Z|ZȘ"2JĄëJ”@&A }C¿¡P¡kJÍð +:ê,蓂Râ<)FTH:éü]Ãã¤áJ±Œf“äÍPi5M +_tÈPùɤH¯Iæ –BiEiEKÂxu´È ð•„åHtÄÌ5Fbá‹‘n.ò  ¨wLºù3úÆ©déieH'Ï\J!qί˜êl"¤b2d®¤%/pä Y¿A‚öI¹„@*G`é!Õk ª¢e΀"V=ã*nF¢ôɐGמ\ñƒ­îhe]á;b€ûi¼vuÔåo+O%¡£‘<¿lWh™¡tÖ¨ît?2”ÈT#Š¡}Û¥ ]’·UOD×âí×ô×ç…àØx¶Â…`AÌj!p˜å2:ü8âåg…\^MLÃ[bqÄC™áAäj/>ö6B)í¤ù ®þ²lò"„x[êߣ¥PBÿˆÐõA©Kùâ#ˆjñ q ±Ö„ºðÔAá[A•ûó¶A^ >yñó¹°TFs² ²®nlÜù_û,_¢jÍ" hɐEPbÏ|$¥5û˜A`v­ò@¤ÿ8rj6… 5òïì|NkiüCG‰šw2HFž"û®n +H%Ú÷#4q@]‘¶Ókh0T3ÓE8¾`€Vâ#ÇBW(ú¢+щ küÏt0͆¬Ì‹§âýä÷€¸ÿœïlBq䥔þEè_ó(}’ ½¨|ìl?yXà5Câç}Ç­?Ï‚ģǦ)Íç}Æî]Ã}rBQÑ ¥«‘ЬuÀ£ì’>ºÇw+õªœÉÂ(ñ‡ÈTab2ç£F\lÈ|€nTMg(´/íÔÛq3sҎ‘“pÌùü3[ã=´™\Õ=Ÿi!pO=¼†Ùs&´=Ô4hPÍ*Ñp!Lwjtïõö’@½zdO.Ý +{ÔD‘ñr=P@ˆËc=='Ð@H‚'KÊX.§Ï^ԊÑLêpd)ÁÅ¡Ç3HRIM4+ƒ]ù>CLɏòóbJS´D›Ä¬*âíu½Š Dª#ÈbŒTWŠÎ5Iº #é •˜D=²‡6§&fšàØ Ò;l&¡6ZFŠ5ŽU¦œ¨µ¿«4T–/£Ì]I»•Uʕ3ª3¿•ÉòF»/B'èO@¬ =¡NôêNAí ùb#fF€2fæÞzŠ€VCi4+R%ւ¢|¹íšÎ àÌK«¬4ÀQ¢ÑQ+/黤囆°ÿ‰Oô¢ÞÕ쇪 +™ÍGµŠL×ZqB¥í¸%mk&»ÜŒ¡P¤ýî¶ÂÑP“ôö´\¼TÝ ¼l¬Üj|AOb¿ÕØJœlþË]Üؒ¼QV‹ï7ϕÍF„h û[ß®P±øû¨œ¾ðÎ/-X–6a,îð +Ui<Æ:qëºBÁJᐊ=®¨Ÿ{B£YõÍfÉ3¢Q­DK(©²•¯Uà؟cA‡½{w¹C(õ\ Ú1¤] Öìp<€FàáŐ–ŠË¤¯K¹ø¤½Ìq€µ ¨Œ¾Âä’L±NÄsvv­('ÍCà$ñȧXÍ$Ó¯ÓP[[ó™Éª&Åxƒ+ˆ¹¬È‚'©I«R=öýÐ41`•JÊ@KI+'¼ÍáqtŠÚÒµ*ÖÛäĬцáØ Êù|¤RiƒÛ$Fhïg<†`•´w;·¨îzɏ- =¤x@–°{ªyyaW‰ë‡7@`»ïb ÐŒ1å㿧»"žU1‹œ?M¢Aô²v¤ïccµPÁÔó¥±m£€BT`e_·õžőÏuÕ°¾n?AOÿ}€†Rû¹FgÙøՃMwŽð…ݐŒ€õáSî+h²ÅLJ:jõ©{CÄÀKurAƒŠß:‚Séä2Ê¢ŽÏ@ +.XŽ/Œp!Ïå=¯šëÏ·)[Ì«•sŽÐ½I&CZ®¤ˆ»Zۗ"ä·ÍU˜êÄ?!>ö+âz•>0j˨ð]¿/k® }?^‡ +t`?Œ$*³t^£V2%þ*‡"bÀŸ(áóºŠ#ï›ò‰O¯Naƒ²œŠâ¡"é­ OÍn[±îpCSW1ÄìÀEéJþ£ Å"(U7®Çµ¨aH= ԟ“ëÕñÜ8sÒy ´ãl”kDÅ‚¹?L ú—©ZоŒÀ»¹ðóº”ÿñ{dâV<¶°œKËu Ó2,.l3ʅºPgårÔõ£ÒAº. UCŽ»˜ˆ3ÌøT×ZÆùœPƀá¿i\iQDMqŒJ3A#cÜxVªbü!æ˜ò‚| ã†ãs„Q·:‘D F˜O¬~“hˆÖfâŒ,£ ,êå¥ÌÛä‹8¯êE&¼ø|Aìâ–4CÞuFª¤ô1ԘŸ 8²x&u?±XsQ!ʋ›ÀVÀš‘­"ýt¤Œ1U<½öÒ + •Š›ªJ +¿(K§xü#•"S¬ˆŠÉv*Å=ü‚öH1(1 0¢šAə&ëÄå"Ãî„s§&½'ÉöÚěNÎÒD»ˆÿ5˜çveâ«}å:Æ&†o$Ý ã›c÷£J$BßØÅo’1‰oºûØüx‰$â¥h&É}ÓL¨SRH˜¡˜#þS&C¿±oRmÚÇ‘h#SãiÑSËìÊ3D–c´B ÷Ï#DtâcO‘¦&4ˆ]4Š F:¸ˆ§˜  Ò¦¨Èï™ø™÷‡D£à‡¹#Y}ø‹NŒ-zçÖð!zÄ µ‡…ŽÞ§‡Uè™à`g£Î[Zsøùš.9¼„@IqøÚjº™–àÒΡ(ސîˆå†5؁͘å|©é°aTs°Óô…‹]˜cX™Ážè&5d¢ç¤¡_;ˆÐpäÌ9­Î Ûø֘a-ÚJÞ¸?­ +µâoÊd$™Ž7 +ԓíȗ8ëÂïÍfŅüT[máÜl™ÒiÙ¦,üÉÂj°p>eà +‰p©*+ü²ç̪G¼uhxç[Š"þŸ œ PÔ–¦ðãYÚIáæ1aQaQ8–R³ P’³¹ô„˜ËnB‹ÛJËà_BÂ-oõp„Ï€ddõL0Âôý©”´YE˜‘UIá6¶K›¹píþB=ï)ÏZ^:f‰ƒÈÂ(–‡úúÁâO •ÝU•vdh2‘ËYç}«“Qhjð1?) ÁíKÔ¬bp~a›`ð ½U½ ù½ç†\Ô¦`AM ©£=9ú$žÖ°N„ÂôLðý„Ùa¤:!=¬@#%¬uHŽGx'o͛IÐRëÚ@Ó¿×M1 +Ց[鹎è^ ãbÎRXš(ÔNvWx»Í–y …kuà_s:ÔgìL0L£IÇFÁ€x‡Ø\»–?vĪ T,|`„F¡~ÊÀªÝ\:Q= µ +(þêL‡dE¨Û+UEp:A`àÛ¢ú¤;‹vç¤TÉpnàèek—æÐ-G–âüÒa øw1=ÓaÚÌ*gÀCTiŠ“)zXB嚐.h@7/ Sžu95+ù7)aÿ·Õ:`Le›üÇÁr_5§¥^’yÌþ#b×|=«ýр¢Ì=…/œ_mš©‡YÌ6Âûí³2r¿ñç +íçøöˆØ°Ÿî9Öï1)Rˆ$õK$!XlhA5ú(Aå÷Ч3Ž"?vÊv_ÚÁVâwNFwá7ÛúáA³Äk¼ð+ë÷Ö¥º˜d†ãа[Á£ÀBlœá}uí´íϊ|€9‡Þ<~ÛÜH‰.„ú=ZèþUUÑÿxX•:V<–>U"*¸År˜\xúÊÛ¼¡§Âí­ƒ}=l£ft?—·jŽÜ3–hÃ{F€*åsÆ!î¬ å{؛*Úègø‡¹N™<4ÝYÂÚ¸º$× fÛ¤z{:Ä}ҕ¾È«c“rŽ/G©å½™Ø®’!”½œIˆ†Üo6'ôኛLùR½P˜w>øþ䉌]e…~4EH„ +Q³©J…+x¤þÿÖa5zNJû8Qæ%Ù]}ÏiwŸAðË&L)ü >RÊé ª¡ÔÞà‹ì·èG·`2zOÊ &Ðj‚5&µ3÷ˆ 2"ß]ßlìñ ++?çsR¬¦¼sÊa`Ù°G¬¥çÑtë¼ÆÓ#:ÓgË|È/ÂøW;µ¡%©ö]I&í½Át¾I’Fr­ Íî®údá~ùfÊ+^•ÑBh¯Ú\^€N|ÿý1fôhpŠÛKÎ6£Îã:¬iµÊY]DӕkV9}Ð4>z`°Þ LöÊ5z(ÊQ`Æ᧒s~„YÊnHAæðd·çÐÓôDûI +ò!’[ÉM]™ÅÍ«Ýqjm /¸M NlE±ãg;Eò&v“Û¡H|Èg,Œ˜“µ‘“'ü{¡_…#I˶ê]¸P3Ãç› Ua%ÎÛÄ?Ý:Dåæùi,.ûÓìÆ<=µ1÷ë/…ÒV~L)ø2 坻ŒÜhÄí +ᤈ5D».ÆWð*Àuˆ[çL ¡Á;LÕDVV~âÄë³CTá.b¤Rã5^9 Î.˜Šzî7Åȏ_¿ 8büÕ¢Wm8. »¹2|ð™>9 +…K 7Îü†*Œ;KCÙN(l$›£‰Oó=º’G‚CþsøNUÈÙèB:²>¨nÓdXDEˆl ãÖD +ÁÁçWáÊ䠐½`ùQf€³ãÔòPhÔO­…¶(œ†S±@!R +Òf·¬ ªˆ9Ú4îH¢‹èÑköm÷ƒØÓÐƽ+Ÿ®G)û …'æ™(åuŸÁ­3 +ùo6*ꡐ¹(хC ›¥BÁ˄ɂ»hi<(.D¸—ˆ¾¬üpsÜ7±A!ö¨Þr{JçFÉË +Ùh —QÈ ûÙÙeœâ÷ã°C!>Ðg¦!˂]d~ÄÄIF6îŒáî4ÍÇ«T•‰Ê! +}ûp$Ð]…þHV!Ž¯…|°’}ËBƒz«Äþ¾´ô^b{ŒhyíR Û#aðîzZ˜ûÁŒµ¡½BdDšöñoVC-h$(váúÂêi•ó@7dV8ŽXŠŠÝ®-ÒâwҐ*'&‡.÷±­ætZÌÕKÑ©+‘ 7ó¹N¯:8 ¯…Ó‹ˆMÒ@çVXۘ­û>èÕ%Î&…Øò |FÞ®+$R ƒÔL…¿š»a•­’vsý‡ -^Äç\ Xm-Q„ t7ÓïÕ{¤O㘤Ž+4èŸÌÝ¢«ˆšJˆéЧi¸ä%«‚†ƒNÍö"1–ž˜°Þ ¥°í>Ÿ!F0dŽ‰ԓ'›ÑŠpð£Ëñæä<…²Í@Åq(Á½Á‘6-±¹Q¤ R¸º%ÆÞôÒ)ë5ñ¼›Ù mÑžUZ²KK§…ÊÎ&„Cé]Š ¶Ù눪ª¼PK@Åäƒx9ÈĂá„1/ ±wNÑ(îÂÒÿ5ϙ"ð «JNÎ?ŽË¾Ts“ÄíõæÂD‰éûh"Αnã ¿¼î‹ÙEß!ÆM¨D(O}FȆ7žHD" ÕÔáŽ2ŠCôݏóZøìØÚê ëNI˜]è:…5%prí¥Ó9½©3À³Ÿ)ñX(,à{½Ã*^öÖÎçÚën³ŽªÄ&·e*d½§d¹w«óìG Ú»O˜œˆÐÌNœ\ Œ'rú rhr·&Ž +^&ažwµF{E›°åЌ#2mc+zìkȇÆø4õ ëRÁ=¯]|[îôòõT„1ÈíÞè&»K(¥bÝ«¡o«½¸êY^ÞIh¬w°"„J¼zV9¶ñB‡{nµbŸèá‰)àæYºˆ`ʾ…±8ª?‘£n†tOŠº¢5¬p:]t6þêó¿NP5OÔdɅKákW%mπ¯0i2æcÖw$¾æŽ{UzÞU> +W¤FÖá [*9v¥ à·¶ÊVªNìƒTçd\5¥ ß°²+qˁÈO€l™ô̶‰\µ¡µU£Q\tác%Œ2„6 *© Q»¿CGæ5 ko0âˆIå7¸¢÷hcenò»ì¤–¶æ»‚%j3:Ü$ÉPÒÈx]C¿£ÑÀM¾c¡Îa2§öˆ&I5pÌ!¯XaHA$ØS¤}×H8 bó?Þ-$¶âƒÓP ÿt‹ÃAe4 ²ò-DŒEÂüÀ™¶MKT6Ù80û1…WOQØM33o\‘tcRtûÊ䚏ýێƒc»4Êf·S9¤Pfð‹¥åÌJmK©A¨xu_ÙÅ䨡›6ﺝÉõJØsP¶ÿÇeåÏXÉ>6Òd²,@!S=n›Ì®äÐCl׀I/ün3•Ç̆•Ù$’ò„4j©û Ôúe8T Ãë!#§dù"žJD@LMu•Ÿ¢¿z»—24™èlÐbmÔ™]'/Üg1Ý3`—ÜZ]QÀ+Ïgԙmݳ“h³å¦ú¬¼1 TgSÒð‡‘/‡\òZ´Mb,6寋ò"^WÕ~÷Lâˆ)Á 1¡d#aõz +§¹zEȅI‘ÊPqsp1P17½ù¡Ë¸váŠFêÑ'ÛÐÙ~‹%ù4þK†£24u¶+ŸèdcÂYÝhà4ÝÕ±××¢žàã”y,h»|UÔc8¹=,·ÒªÑ&{<0dž|Ìú"!R VðŽA1IŸÉ?ei¢+L¥eꮯ±¿ "Ïðr•l –Ú—Ô±FG…?GÕ Wç؀9£êPÒXyj¸DæS!zà¥ ‘ä+ÊönˆÊá±ð$p ½ï\® Ó7yß yÑèÆ\?½[À„‚äb&?Ù;ÕPkϧøªƒBÏÝP€{c•EU.ˆ5ðw®…p¾3]xh¨]°ˆ“Ëþ pŸè;I„qÈ¢^ѧ6A¨Þh„ŠjÃ=Ö¼)jðè¡?ú#íYõ¥ÅJJqD ÅÛÉ9w +*¶݂ߴšÐœŒªQÆO,ª¥'¬ž]a̤J·HSÑl®ËÅpѯp—•q:øÑkÃ]¿«&ÀÅ%¢ld:º€v<§`¶ÖØè‘}B\‰3!#i‘ ÝÅæY(ÃWÈÚ;©³‰&ŸÔm„òÌf!kšÌØBÄê{O£zBTF—H[f¡T¢ÆÍÀꘌr f¡T·pY(SÕa.7(¨Aˆé:ðùˆq·-âX(ÉåxãHŒ¦× +™Åpèæû+…²tÿf(äÚyÜ[,ôìH”Ê¥<%!Þ Ì°aÿˆ_„ÖREĔH—҃Âs[ì Iâˆ2•P(¯òëåÍC•Åë%D>&rÎ$@æJÊ~NT´á+¤ô!ðÝø,ƒ{@ +äIu +áDþ䏁"áÎy…r-b™Îäý ’Üy‹1ÑϘ±*æçê +qfò>7&¯¿FÅd¼úîun…Þgèj Hn%¶Bªfe­Põ8ӏÊz@YbJ$£š:M{Ê ­øù8ڍoj˜¯$súº;ÚWæ¾é  “¯B.§6N[H>  › +É‚«ÔžþtÒyß݄¶×fBÝ$4³`$—æR<1!ìvUhàøúOD,ô¬ +œÈ™H€2U°‘Ú¢Pæ<Í e„(ª¡£ €µôA©¨ Õ¤ù\ñÒǼ6¤ÊòÓ£š +Q:~V$S!ÿâj©PΛà€ÂY Å©P^ÿÿº +ÿBô 3âg¢BDáxDÓ)¡B”š¹âçK£ P¡õ_±YëÙØO¡õ÷Ž´ƒH6q)µp +Q ºØ1D“›BñÎ[Äü^) +ÝBarñG6U¨)¤ôx¼;Œª¤oa°Ùc’xi}3SèÜþô]èYzÚûC‚.%ô "!Ðä÷h1…4a¤”åqs(SÈ;‘ৰÒypë¡HI^ÊEbin!3àRHÒût·˜Ï\ùj¨cU-…ì9ÆRh@-J6QÈdŒP”Íù ËåUƂœ÷ۊ ŠTg¤P(<éRJœ£D +9áâÒÃZäå¸W!…:æIøÓÊÂG¡h:…¶)]ŸÓВ©ÚxÕVH£§^æ%Àèa]5|¤êߓQˆ(…BU,…ÔåÍ0ÜPö +M(ʎðŽÐ¥ëè#5$ŠB¾ÑWÐI2@†”`D!ßÆDy"OtDRòV¨i¡Ù8È@2씹AÇC!ÀAÕ@”ª‡ +-¥Ö/½&A(t8FŽðîÎ]­ŠÙÀäG–í É`9!4ÊR +bˆU1-® úL+Ê M‡P+÷[Ô83èÝõÝ r#҂[ˆ$*>ü4è€@!Å@L½3Θ[ÏÂù¹»‚†µå稪µ@ +CEwÎ +H)žP0Ÿ%¤kŠãoæ@Bv€¦”Iû)ˆâÝ"‹iá„æ;£k þ»oý„h€Šê ±‘ŸPnL†TèóôÀq?×jC™?.à ÕWBŸÛ,”Jي¤ŒÝ½µì®ûÞ0'Øâ× œ¸K¾Fì„Ôi’~ÛÝ6š )Û±6…¹CÂÖV‘½ŸFƒp*«OKk +Ìð‚…’„ˆ\»æ½¦À Q¤ µ5¹u3Y܀BWî³oBÄi輄\sÕZäDzB܄ @j=¤§„mBÚPQÆÍtF&¤™ª;ÁaŠõæº#yº²Ñ&%’ÛIÉ=Ý †û^µò`‹F噐 +ԜcxBd)z¨åm õuY YUäËó[¦¸îùÇåä‰Ð jÎ#¸\u&JÛ/ÁdBËŠâZ*‘hÐjæ§Ä9Îç„èUx§‘Fá[Jh(ÝI´Ñáïí6+&uhNãq¾É?¨ª²ÔÝÂóº…F&cMYPAÜÔðKè²0‹IœEÆÁ•FÞm–EZ÷–$š-!÷F­n”ÃÏ¡ëO*%$çf®úa)!ïýÑâÿb„àÛ¶Yë㡽`³³éÂT+¡‘NN¨êàËDõ4ò„c%D¸7!ÕdëÛŅ€V ù¥‘*¡¿?ÑÙ œz2 •¨i„ºHö»”bM|”ÊeíD(ed'óZ%ô؆„Ò5þ£â> Å¢—T§âÈ Æ aMâÜŒ\Jïé*Ÿ¤T±$g.ϛØmàæ,«$t¸©ý' oEIHVÈd6 !ÃÐ'9³tsåãõó _\«FB®hiTj“~öxÀHhÚ¡H«Rx‘§HHrcd±ÖŽ½jIaF¿†¿zç<¦wHHvÉ{Fþç•U•BB®MsþO–Ò—ð’£ ÅqK«ð\umA”:?C„ɈïzWKÎO€ `ßtìjeñâÏ„׎²¿›¶z•Ž)PëÓÇuC_-)0¦¿¬ ¡Ü_A–VÊ +ÞT„ˆYE„$¡#”…ø¡àLâFHþ‹c –÷#¿®02ÿª|±Š„d3ºmêÚ.w‰©Ò_î‡!TW„hã¬æ¬»î3f„¸”FŸºRÑíY!À1WÈ‘€¬w‡ýJ)ïÂ1t»Ã ‰iÏ°•Ï,”’¡" ‰dºÿÃar´ô«Ù‹É ¡fï÷Rˆ ®ý~Dä(ñr¡pí‚_å m¾„)BØ¿×'ŽÒ”Eñ`oÐu !Nõõæ÷`÷¬\¢È†]ê¡ûÌá~ú”Ež•Úÿ+„Z qÏ6{üÊJà´²2k"$†6ˆÓoÅ֐DhL¾ÆB4ډ¼!´’ùsëDÜýޖÕ!M !ölÅ*FÛvFÀ†ÐmÀeC.+"DÁoª¯þTÇ#"dÆŠ€˜!BÂA—L ÙôS Á;[&DHÒ)E($Dè3—wÁµ‚ }‹ªT*ƒÎy!äŠĚՈ o뫁¥‡ðvx­~’:B$íâÿÅ¡BnbXnޛؙ4%B‡_,‡P•Íq{Uà²CP0é©LŒÂY>6„üԊBæ!VVâB8ŸÌŠsÍM6ÞyZµ¾µèԁ‹vI,„¸Ø® gßzÃè÷ãkIá˜NÈWˆþè‚mэ$B×|UBˆB³°"¥‘LÁr²T°Êðuq‰€ª_Ù{^n׏B%~Ì84\¯&B¹&ïƒP³£¯#UAý_7ZÔzÅw4e†*MߚVÏß?R5c&¤VAÈqtà¯g(¿¨‘%@ˆd‚ЉFkÞh„h:±‹ e„<ÝÃ=ƒ¸B”ApfØҚáô@¨cØ)œ!='µómUやW|f¼¡3 DÏç0)Ñ0„Jj"OW¶ì•ŠŠãî{®4 *šOMå;åb}”ÄË­òùS ž¤òÅOYRßÇ +?þA“¡É:ÂÛ.+< ’qdDÓÔÙXí |f²xTàԍ薘,-÷ƒÆ7iTQ¨d6ø@“WF?ˆÈLS‘A¾tÐAÈ;a¹7?ˆK9 rúTå\ƒÈ #!õA²)?or®ãÇ 4ænÍ>Sú ³HŒ˜ÂOՒpP®1Ê7ö"›ü,ÞR’§¼Öœ†‰ñA±BL;¥(§)œ>ÈŒ‹fŒ`Mà>ˆ§}Ê¢ /i¾ç¿SEË{Û@ +¾4Ds䒒EmO°§qæôÖ0Ž(Æ7/Ìqº OÙCQ7k«óò¢³îÉ#8c9ÓäIlOûBôEÞÝëâEz7ÝûŸvX–@=ÈÏÛon,rV?œ¦©V-¼)„&°Ä‹–ØDfX zl)f œÃ&уtïäHH¼x–½`ž ï/^…QygAíM(Ï+†uè†F1dËEñ ¿”J§[¾Æª¨¸O“ƒÞŽÞ?ÊÀŐñ v•,§ßAÖ¢Ó \É Lå.|ÜòŠ# ±&ݜƒàXnZ.Ú+Lë•õ›MÓ#Hà_7u¼ƒÀ ÂËlEh"eχ…4]'àdٍ²!ÇI´ƒ¨Ñcª×!mvÉìÆ"E+¤Ç䐻µña; -Œy 0Éêx1Ó¢Øá1øDäPÅ:¨ü§|ªàÇ. ïM ӎ‰“rçn¬ÎîTRÕ¦¿@a ÑNa-5€²†õ¡X¡ÓA*¨ÔŽ S:ȈːúGžÆ­h”žy`t¬:"œ´?•è 8IšŠ žm} ñÀsSAè[]ã±áãdØ@‚%HsÍMWa§†°X½MD…9HqåÏsëÏp—ƒ”þ_8 qºæa‰çpj bÒ,d<‘"󔫼oPˆ®i©J™AØprйHE7‘2Øégn6óhZx“@ hä—fÃå]\·PÓÑ”ýçÙâšÞࠋÆ:’@ÁÀœ‚ƒ;aDêðãÕ ]ß Ë~Dà¬.+¨ãT”{e¶™3 &ÓT°è% ,jjyƒ ëÕá—srEÚbfcÚ6¤»Ap¼0êè"U٠쁷Ƀpq×€†÷kœqaËÔ "¸«Óè,ÉÝÐ$-«|H6¾¶AæævFªÇ·CÛ ¼±Pz:–»“Ò)þc¯Ë¹©Ÿ½Û‚쥨²sŽþÔùTŽ÷)” šñb;Š°g±ìëX’zts® Ù 2/ó<ŸHEàLe1cƒªoÎ}ýέ|†›n ›ÖÎqc’f­(”ˆ¤NŒÇŒ%r1(¥¢¹ÉP=J%ºÅ=B"sà”­xà°l B/l§Ñƒo=u®§XV¹Ö u}+€SƒÒã];1? ntÒ_U8H6ÙëyÝá¬wí>Š$N½¦q;Ô "'±éÍ:íë8 A‘*ë 4Ë,cÝÚ¤ Ó¾Un·Ù~‚m:Sô·xÞ%a·ÌéÃ0öÌ=âiGƒNg¾3LŠÑ8î ¢nø#ˆZ ¯wBˆ[‚›iÁ¹/[Í x²\²EÜíCƒÀ/Ö-µœ‚¾nz\nèû¾ñz` ž¬‹´úçÁbªÊ¤?Nì áІ4œAz¯2'n~'µ[8Ê©A/‰1šAñƒÒ:~H[ª(±f±NŠ +šr±žÌ üÃXAwA0ƒìÅU/ƒ”ÞùæQ)ƒ"SÌøhfâPÑõ˜wZ'ƒ‚o@å3–ÍL|fþû,® +tºªdZ/’AEäQp8HuŸlÂ5kÊ[EäcPˆUV¥B¿…«ÉEûÊӘ½0›“³ŽAÖ3.MAA7pG}¿¤1(Ëo!yÿ–,‰AY{1¨ŽëQKâ5©µ» bJ¨ÜGÓ< ÔŘUædbÔID«“LÕ¸w7&LÿYE.ke ú\ ¶ х?¿h`dÌAl`cA¼nå µ-hEU òZ¨©Þ|O%F+&2-È ï2Ƹ|è3YÞT×j“ÄÒY?6Ùȵï»hAœ«µ[Ðt}㠄¦Œ¿J% z‚"7ºC;!ÿiȂ‚Ng¹$‘¾¶‚’=ÅP‘²ýȊŒÕ ‘±Œö™ïU¡ôë’tŒ‚GN>põ+H”[ùÐv´4-®¢wzÏÿÞ, ¬ ^AÇ1[˜½H|¤+Ž¬à3Ró‡!Rr+Hž!½­ï&çS8ÇcðÕ[A4ZM%¢"èÿò¡c[0WA;Ð!F« /ZB›‹ÆC¬‚äœk%$Hn)¸é±ƒÏ)y–;¼ýx:þçÑ{¯ßg*ˆ(£Õ—JiJ!J¹HÉ«9‹Ã‹Üþ®QAyª:qõ›T@©êÜc\d.i¡‚Ú€Hñ ¨ ÓGAì˜^ÿ~g+JŸ‚ áIz»%7s«%›SyÅbsÖ],‡,Â¥ ‹Òå˜(š@‘­JA—-:Ä ¢ô¦êE|QG“‚œg¿ÝéÔ¾é,`gC¤ ͸E¬d+ÅÕ£ É¡šQžìá‹M£ ëÂ{¾Î°hµŸNb‹‚xºt) +¢ü÷$Úë.QoFþÂ#¤,‡‚2™è_s]Ø71oŒåüƒ« Z¡ q©ò‹Ew„‚ò*•ïFœÍf4ce$êeÐ.­RÎL·ÁNc~\,,d¡¸Šž ½ww8+‘b†0€þà} {(tîûÊð Wœ39Ðæ`à™ þ‹«(„x”t¾H©Úz½›LS +}þŒÌ@” È¡~áD+ØùÓ>Èr_˜ ! +Aõ@ƒôäö‘«>äð4¯Öl$·Õ-&Š0oPB—AüR]†&HT6g‚êÚx£*‡ÊtÌJL¸˜å1î4(䝶*š&%„áƒÉ™FtHE]XÍë“)ÎI…'b±.›ŽœJšzdÞ7ŽaÝ %èhW‚n‘»TíÁ?Éd RoC3Ì¡xN½Ê°d]ò­Hu§\ "•%Œ£²»å?#(a’ºæ’@#4騊N®B?Bñ$4$*§àܦ‡c‚W“Õ’ /Â+YÿWNÇKI÷9}sJ‚µnȋ;}>ðÕÜbV`o¶÷7×fH+ZÞx?‘æÅÿ§¥ü¿ŸHPshÕ Ü lØù‚!àz-3~˜4y-,²¯­Žh#&WŎ êV÷ŽaCžì(™6kxLvŸtÁ΍ps\ÊÔû«#ƒzFó ˆú)’"ULFÐJö€4Ž©˜æby™ù?™å +Œ 쇠v·³ +Jyä³oÍɹŠepN,£Uv-‚Œ=¤³º0¶s§Þ]’‹ »y!fE¬é§îΏ±‰¨ҕ”ä…®)¦d)‚*ÏLrèÜ E·$ŠÐq"H°´ú'!)ÿ½L…š ø™ªA\Z—5þãÛÚ±ªBÙqÌpÁ9ÀB‚\„KßpйÎÛCCPï‰/”KµÁlà ç­5þ†ˆ… !oaþ*9AV¾XSÞßOˆQ"²œÊæӉBPˆ҆èªné¡ AWÿf+1œÊÙ7·A¥Œ°^¤Qô + ’½ôg’¢¹±Käzô­vÜÏoҁ x”c»Ö©ÙÉ Á{oY°üRAãHnŸö ̺QŽ2»ŸùR‚P¼÷ÄÁœ #à /G÷ «ïI4;PºXÚ5E˺ÚqC÷Ë , œ¡äJWýOvÐ~ &£Bœ¿—òã @Ù×ÌÑL^<ÐêÔ#àXí:ÉÊޞ‘ÊÆX¦7¡•dÆÈ{BΉ}’®lðàŒ;ɲ¼7îvÀ"ÑúØ#"gzPJ;Qõ‘v=P$Û;)›!¦ÃçÌØ<†Kì Fº{ +Ðs…Nvž›ÍǤ~í$ÊÙiïxý‚@£ÖÞig@L_¬÷t ëŒõ:Há½'$<lÇÖ(^‡£¯!’£s>Uj8f: +_;²ñ­î¶èؼD„4+¯Ãh·ǀ±?Ã\€¹’EmGî3${ö pٛ©é"é3):Б)Ñ3€ažÀþ¨|5`r‡©%Up(Øe8*J?9fRÜA ÃÖþG0ñW j~S9(‚$UwRÙq y90$Oï;]ƁºË3ú7Łñ¬º&R”TòÎMT)¢+‡xVöl `}G±2WRﶁ*]\¸ÃU72"÷bq µß@@e\û€†[Åâ*¡èî=Ê6Ú+ +WJX«†è–ϝm ø² 'ü„v Cm 00½chÇ¿‚G!%ô†Ç¹M^Užbp·G¨:¶¡QȎÑD^|q1›ï4Œ˜u9D¸†×1ÛEÓüß=+aHFÝ»­¯À üÛ®î¾qì,–Ÿø@¢Ë†…Ÿ~ÌÜ Í· ‹Ô*”èÃïÁ"DÁßî¨FqéèJïÖ÷ÚÄE Wû ¨TÒÝXJ 1Öï‹)é±w3f89×EžLLú½·Áâ‚Б³# tº¼ò;Ø_N¢=ÄÔ¤ÃO•¯@,Âï°ÙïaÎ ðÛbΩlçªy¹ûu]@,ºE[äý3L1î—ã€6 )?°o> ;Ú`4©1 +”ˆùȒtˆhi A´%Ãõm؆ÏDÚd–óqYù¹£W‰LIösÉÃO è#X’wUSì”iìž鋞°)£ÉUu^X +8h½'–Ñ ½&5+™Æh_Ûµ‰Àƒ@ʝ޿¡ˆ·3ÓûPGåÓ TîR1àžr•OÞñ +A€O ÷MÌ·Ïûø>—Mñ”ã”ñæC4…óFlJ%žÖö•Jª4o˜‚ öÑ2»¼cÝj&ÐÊÛ°s`¥6±šSxzc‹ t~€±š}¨Pß À„L!VåÃ4Þª £Wâ³¾&rGp ¤Lñæ0Ä +¯Ýâç*)M«YįS;R 1„+wÔfBG¨JªŽ×º¼ç}á¿Ào,Z(ðÞ ’¼ÓÜ^Úta÷š +¿û ¤ß)æžÍ{†?u¸p~êZÁ»ª†H³éÎ/mDì&F•ϑPÄ(˜±º‰@.èîý—¬Z·vdƃP‡ˆ@'äîi²¬ëD+P +=p·Ñ¸/·}°¦àq»ÿÆÁ'Ðu ¸„iÍt¿ÒMߦšAþŽæ82.¢çhú—lÒ¾²RÍ}5 ©q3ÄL +©žîvû®X9_3<ïú"(àž¯{8qU“"ÊV ûtÝ„ ×]=*F5ÔÊ­hÝéH­($”1Ñl ÔŠÕ­9{ÜÊ#£N²8hèC™me“ø[[Qš©@Çe1B~> ±PuP µtL¬,Á i‡[IÐt¬‘cô/F™ +K÷x"´¦uæz؂ÊV%Ý›cŽf©éÜ*ødÝêðHdÉ»– 䄡®c+Ñô×9’[ÉL§æJï3 [º¿Oa+èN)c@7ÆÍ$†SsUâ75­ À'Ù9sq ?úÜέ@× +ƒ©3€w)[+A7kS ƒâ燅G¡Úã¼ Àã$6·*I=p¨¹Ñ BéàkžyÓ{éKñÁaÈù©©°E”ZsǧVaçÜúþAÃ冻ƒ‚Í­y bCüPIcÄ˜½…½|߀&I¹;&NRB¹©7š€7 y›;,µ§äŸ±-Á„À z‰\qX€gÏn@¼òŒžu{Ú6 ]jbÒ&Ðdʉ= ¿˜4g—8­³þ¿ß­ÀŠ­3þqô94–êîxØ+P‘×㺒8Š¾=ÎxðÓ èވ¨,|‡xŠìª ¯z}¶ (¼nìÍúss +æã&µ +ø·‰Ñ4im’ $7!@΍Ý܆à8ລ‚çÉð5ƀØèÆÛdJ7ï"PÝ+$Z7! +’MĀd_>4Qéæ0S7ÏHIž—Ço£Ô÷1a@Lò°('Šà·8Á¹nŽ +0@jæé¬ÏäAË  û:iŸ«7ҁoòÄ¥¦°MßæúúáOóޛlÙXjE m;ßn©+T€Ô»eÔâæ¬(Œ §Ãù<ˆ!͌](@ãsƒO€ŽÀó2 „ŽŠG üxþ ğ=0´öž‘­Q«MƒûV|ŠŒ"@YåZïÜX…CH&†Q± +òÒՒ©|埝§£Šá{*<`e#†Çy>iÚø*•1ƒå»Ÿï¥PÌPB§`ø¶ÕRE  4–ÂjC î—è2ÁSè¬÷5E*ñTP2O õÚ(Ê«U)ÿ† ‚ÆOózDF莦þƒMœQa?cèÕh ÷X)ÇíqµSàêƒÑ(MêŒU [¶ßÿx¤JÂò‰£VŸ!1ÔÜYè¢Qð¥Žúhê–“@î‚`ô¡QN+€Fëщѷ¤ÁwJÄ(žƒô bxQ«ø|öùO»–qiT+›—E¡Ð!PAÿ 0Tm%€¤6…㯈D )$€Ä%{/ÚÜ$†ˆœ)PÄ9¯|ÉPÇ­?>’¶1“*µq-TO&IÔBc㺙ÇÜbçU€„/ϖxÞ+‚¼¹D±å‘+S8ÿG¡bºðZ)DËE^ …VÄÛËݐ£† á„Éà ³µ!¢„)ÌòðÛ°@¯]Î3؇QzÝ€¤Ú¨A+^ Ïzø£H¸4¤Lö«ý×´`ö笝‘Ž@$ellԏÕÊʦJhÞ\6˜©7Åmúc—üÿ€ÍN`  {œ¤?Üÿä1ºúˉ¹ÿ³KŸ› +©;Šï‘ýb@m0ñ2WmÁF¿_ÿ‘~“¤ gœàýŸØUø¢Ú&zViµ1ƒýÇÀÕ&~ÙՍäÿˆKÙþÔ Gëh“ÁxÁÿ‘«ý´BaÏé࡛R~Ľÿìvìj¬šÿ0mt´±F!2í¼šhùÛ`þ“ÍF[öS„2ü Xÿs}£Y¦Š¹¸¿“ÔÿÀÜ×fþŽ:kWºyR)jÔæn˜ì‰&•)N¼C‚ÄÿÄMX©OØÂ+Sj£ m: ÁEŒxÞhóï–=ó§Q\ëóK¼ÅÐö[1W$Åw=í?pÛ¨’$å$q Ý@3WÃOBËõ'RÑ%ú9Á¬éå<}@_q5é©ç?¾À%%¿Çx³œÿ(ËYÞ«ùÏ¥²ã,y1ÿ¡óv³Éš I·; qº|ÿÈÆ̶Á¿)ÿáâô†1Ô ÈKþC.÷a0"1þó¸-¬a´¡À»¥à?²"ÖæØ îÄcTü(û‡-ìZT0ÒÉï/«…d¢©0Õ¯jZ,ü>¹Ä¢@öáþ‘‡ã4·çK*Ò+ÛûörO_µOF´­ @SÖ¨ýS…š É×h§o´Ù?LjèTt*„ì+ÀÅû‡™‚ü 3Ukäyýs˜+ÐÌSã™@?NÙY`O›QQØRŠi`úGwæûÓü¥‡CéËC©9¤æd©V' ŽÝ²A˜7’ cԊ:0?—b&C¢Ú˜Zdúäda„¦D +8’ ô#B®ßŽW'À8Ä&¦C¿aqþæTVJfóÚ?OI˜£ùǛcb&™dK*hšïÐe´–÷þ…Âü±ã§Ã˜âWφž0X9«f_5X—Ÿp²fsŸÏç3ñùP~\l/OÁúÿ3ðƒ;ï#~q†÷?]ˆQLœ.Îp1È ÎUð,Da`¦èîwqåD´UâEƒA®wµüQűé”Z­±Ò±3»-֞õV†³™¶í`k­Û¶}Û¶´é†¡‡•Ìà–[2—¡ü|f4°¾o–¨ íßwLÝ`Ô®F"հю z½2ü*È]ÇýtŽgNʐaÄ@‘$ÉÂB”F‚¥($j!L áR"•E'¨ DlTŠHQ¨ %¢žNÔQ¦Š|1 žÅ0X úòëõz½¦^#¨ê«^W÷«¹âÕU«ººººº*»*†ÎC11ÎcÙ˜1ز1†±1£ 5°A£ +ˆF´aA;ÌafVâŽg'*®„wc(a ·’ë ‹ã¨1 @qHˆ‚F”ÃB…D·ëuªÿs‹¢2ʋ.ê&e(ó˜ØÄvü4hnòB% -ƒ5àoºuŸw¨dü]ppâpDŒ…£ …ëä€&F h(8>JRLV˜LÄ HA„cBÆ̹!\@ÄÒªÅ?,W 9G ä"“ŽZ¼°”öj"³r‹3—®"®”‰*ù?« 1]gxï&„E)M«t~t +•úÙ¥RÿÇ¡Xx/ doÆjfRð g!qèaJ¯ÁÌÖ+/ɞƒ+œë”÷QF@Õpô''&lÔL |¾÷Í!KzI×î‚9Fñ(R@ÓêÄð5uÄ[ӅuTöF×@7‹ÄW~®ãî&DL;CPšm£YLqù™Ì#Äþ<>™Ê¸Ä/;‚$¤Âi ç‰m&0hŠù£l‹¼9ÌTl\Gؐ@Âã_ÈäöUÂs¥T‘ ,¤fŽ·Û7‰Ÿ×í$ù!Yð#¦8C¾„ é—Ê`W€F*äáT:1ÒüP5÷q¯×œ÷"æ(—¦é1”hbN$¼Ðrì®H9Š2ÔfvA–¥Ý} ®1ÒX]£´M)[mï,'[åõrѧ¥23ó(~S«Ãé(â,ØÐó[" ¬,’±².(iéí‘LÙhMÍMŽchýœŽ [ˆEš –ÆÑ%/ϗkð¬7’FeÐØÿ +¥¥t'Œ!ãÎ+4p•¾ w _þ«Ë5¹}ìW©!GCC0íía6ǁ¨Åž?TÛ©ý.ÂÕÙÍc}íeŒhäñsT,ªÈ3«‹à^lÙ8ºÊø  7—ó ±ÒYÖ.ùSØáÏj¡¼I¢;[§Ëq´ˆè ±' +8ŠEÉràê»ÁgÓèI ߝ\DÑim¹wwköƒh§ „õ#< šë Œšnⷁ\|؍§Š›ŒÄÇ¥]‘åP^N¢hUè§=Ûn—^µ˜š4¨…‰›‹»ÀÛîŕGº™–=X¯H(ì783ò¤ã? Nç¾Øiò[Œ£ ¶®ùÎ*Ä`¨§X!K@XÒ"»°»!.™ƒál³žæØ?*F%9ý_m¡lÐ8iT/°l%¨» Eµ¼6'B­´lŽ`+׃†àÿäCÆ= Èf¤s ÿÙÊOõyJíiX–sî…Ÿ{È[$Ä\¦uæé!p×´ï{ó€&n&F:ÈÚDÖCSèÛ™÷H—dø<­ÉMQÛ½ÔèGþ‹ëÄÌI”RßÝßËiðHÈ º ·d¹o>èh1¬cÓ*8Afö;äÂC2häY6^¶1õ-Ë% »d¹M9ñ?]éâ-ÄB”ÁÿLãÜÀag•¸ô ‘%…´âBqRë  .Sþyòárœ2‚túo‘e,„W¹FF]H‡#=¹Ç ó#*’É¡éùk¥ðLžZËM®½}ê"¥¹ îÀ*quo!@@±Ô©K.=4”?g›Q3SÉvØ}‚è3rª?ؓoÀM•ÇŠÐb5~ÖØ+0ÞÕ¸MRƒû>Ýa)Õ¤,Éه"nœœ5‘Ï ×°hi0`þñsjÿߞ•>ª=!™w8XF°ï<Õ´ž(rÁóGï‘!<ÌbXLj¸†oAjÊ?îÄ4¬UûéYˆ FÜÑR2‰- Àç)ˆâŸ?Ï;†xûD·º€bñ.[á…k®ê£u>WPÇæê=O.‰ÙPîrú}•Ëý&ä.f‹ž¥®\ »Ðåí·òžé^‹ù²;šäÏb¤› “ºŠiz6[dppéŸ8”àE†eLـœb¢f˜mÕè `èR±£co“Am9A ‰ë»G ¤êcÖWñ«<7ÊTªÓ7ᚓ˜æúŽ E.Eb¶•xÄèzJ»:ã¸MÃüŠ¨1©˜‡5a«†¸ýϼ«P2ˆ Y6Ü8³.Æ,›þÃlsC°Ë#9áºS¬çnNt“Œôîóbꞇ)¿S\çi-Ê\b8-´ÈŠ„±{Ę#úìù„y[†Á GB¯)¸Â< ‹ÁÉ?VŒô©§Æø³>ìÀˆÂ)è8…Ñ_añs´îbàMªËõ1¢·¬q Õ1قÙÑÅ®f¥á3Šr¶E˜ÌÇسZî¾!Ìßñy„PýHx.QËGH„äšuluÆú?3Ӊ-$`“·+–„Êþñ¸^Ê'Žq¸éó–Ý-?áÂ5".¬õŦ÷KRhs{±íڏk1#ëÂ{ÓàÑÑcÊrµ¨¯Âã—9õò<$šO‘+KÏc¤caù¨v6ÿjђîÑf=.4/ÿ\rgÔÕ;0ϗÊIäÔ ‘!_¤©%“ªk²]À¨Åy00M—u€!ÍA +0ñxÓnª3§Ÿ»0q¶÷Éÿ%®¦‡žJ”k_´B­ä_>܏€î/~H‡+Rf/°á{Žá!ýB¢ü²Ï/É)ËòË×°÷ãzICÂ/å+¾/ºAì^ Îä©.À×€}_Ó§KY}‘ï˜!F_ +ß.ŽoHŸ/¶ª¡ß|‘/hpa¸–/dS%¤y¸¸êÜ{é}Æ Q49 ¡ÐÂÝK!½3÷2›#ðáׇ¸ß@þåE7×¢sjYä¹þV{·(Ò+nëEñœõîþ:ºA@‡É–C~Q½R/å)×>½€Ó~Èâ ÃÄ©ô +/ɟiÖÁ(–{!,’XW^þðë`7…á‹«“øåˍ¼<*t›Ä f‘d=/P«<"Ó /±$lðb?òË£+G€D2/d/¿ÊýwÉL³)-³ïbü¸4«¬½KR§XxÀœHü#¨ÉȞy[±êcRšïBHtôºfijvvÑæâ­ei‘Ëáe3!…ZØÇ.¤ØøœÁ‚қAu¥AÙ&õªo]º„­S–y—f]®&Þ|u©y@]Àû©º$³ã`.ÚuOÒp±F]Èۉ¡R~aÞ>º¼ ·"©F°èbOQ¹5™:tiZCôqÙJ™bîèÏå +º=—j È#w;—¯$¡œsiëÄu­j¾¹ >zÒՅ#.àñ_`Š¹ŽátyîåB~Í ZŒó¯[.ñÛEÌ ·W.}6˜lڐra, ғK¬ÚeU—\rÁ «ÌYÊØèz¹< dD¹Å|\L€j ÌÄcäSÚ PÆìHƒ —£{[¸ˆ2Y¢º[9eòÖäIhÐùç¸\p©;\ ã¡/ãÇEîw›Þ~Ëñœ ýص¾µHuÒ ÉÐ_œî9qÝBxö¥[´h–Í—µ8ñÎ-𣪖[Ji6c€8ã–ގϏBŽì¶¥î«A³-ýùêµ%ª ºÚÒ®º´ 7ÁAÈіú¦{øl?áfK¶lÑ gA3ÙBãlAìØÂÿÚ”)РXžXlaOqúݺ‰©–uóÍ7w‘øúô,ùºÆZÖ:€Ê‘ùj!î újóý¯ZjiäA©W†Kµ¬¼5"ZŽ[^(µ$¾cÔ"”EÛç>&†1OZq°~Î*õKâÑғc¸¿‰œ +Ï7Z‚-)â c*L¥ÈòŒXf²¥çtœ +-Ò! [ÚT‡`½¸Ô9h¡apXî¼{ÿczŒ Ž‚ª ,1ÂkîYí¾þÜó0'lp¡HVڈât•©¢7jêÌ Z„YH¥¢'¹ˆØ°ؼ+¯™†}šë.‹†~Æ[Ž8(²¬¤â¦*Ûnô~ëD´)Ûj„„6ZK7Y¦~G¤BãU¦ã’¥pÑâ-;Š“,ͱ ØG–zÑâ Z΋,iˆŸl&‹†,úÅVYŒ’õÇbìЋ Ù +Y…|®¶yÇr¦m-.ŽgŽåî„ÚK%Ô×X<ðú +Õ¹r‘,à&TFd·„6bÑE%¹‰Êqù+3¿Zÿ!´Db܅„D‰ +Kí¾â0á8îA÷P”ªÒ”±¸–pFWÒQëÃÇÊ +<úaÑÞ():b·u#m‘Ü”*Фò}È㱸¿R+»éQ!¦oÞ¯¤ŽÝj:ã×غßûJ:×WFÁM“/Ê Óv|巐÷ +‚çd˜C;vá`zÞºÝwÅÆÎê鮐Ǡϐ£K³"€:.«B(Þ1Ùؾ!ܶ"€çÉÝÓ=µ,»l%Z÷\_vˆÐm®ì*ÎÁWn0»ÃZ+­ ¥Jú¿É¢\X(…UM†Öl½2ãy–ô(mˆ˜Áõn…´Z·OÖØÖ s+_¨–µóa–»­À-½ 8¹™¿nb¯a5p*Øül®kwE˜­TŸ(W̱•„'¢× +±²µ"ãìώNRÝŒ'1nf¸ÛèŽ[4ÇÕ ™¸HÑÍJûÝt0°*ß +ãEÅ3d/+ûG]®2:PHPI_j,À†7 ÕJ°%uf±b¶…PP7¦ÿ+â Råw8•,@x3&ƒÍ)z6¼P~…™ +¶ +EÌpˆ“¦úøÝ8‚’z„ɑȺî* p¶ÀÖºJj¹ãæ*_¤BWù ‡Â!l‘ÆÞ*@‰ÝVés`žÕ "‹I«œ¯2Ÿw¹@$ŸUzM4‘u5c#qÁÌúBU…s¯*D˜‰3n˜qÆ«*wSͬм§*''\U©-XB]çSå<éOg…Ÿ“ÑÉ_/ §¨ÿÀa‡*í+$Ð(,*SIH²D"+î©| áÖ6v²áœÊÛ¹¨©D'Áõ6S‰ê2*k´z(Êcô<¦.щ÷½,ùLÏZ¬kfƒìý)¡VPêí¨@àSÑÅ/§²Ü6*¿Ò +Ïؘò1—¦dC˜ÑÿNÖÀ‰JR9à"*%«‡J½2ªцdä… +ê—*ZÆ`Z?E~ﲪðç©{rðÆ掶ö)þ'Rgê—Óª¦0d]‚¦eõ”Þõ™Dª‰§ŒÑ]MVÚ»ŸÅ´Sd;~gò“ÎeÒtJ‹ØÜzN“ Qp!‰\Ù¶Ñ^&!Ð:ÛÎÙM ™<ùÑxӔmã>AnC"c”0öÝt!>‰¨Ú3E +¸Ï"ˆ³WnšdٗB!—³bÊ\äjÔkɂ)U ˆ2摛_ʕ,Ù,i²ãž ´šh8ƒr 5¯” Ššë‰ê¬4ì­RD'8²R;8EX*…Z"ë9ÅXIp Å=§ôÌRŠ”}Rà…¨ÿ´öl¤òIÁ#r;)¢cÄÞ¤¼é‰~ÿ&4R»Æe.RªÚySP¼%Ǧ°ó>‹n @ÕD^ 4¨V¹W+†ÁÓ ù$Ÿ+KÎ'{@nRg”HŸ¯4A¤ß€ùÉ"(w ·!òRiíaJù1WHr«Ž<óû¤'ªr¯ë^ûäÞ<0y´äúäן>ɋÅ/!•¼Ùm„y0<¿'9°®¥{r½µ@G¢²xùv‚þèíד5ÕY‚ ÔóôDŒ9¡H8Òa^'û=¹ôjl§Ü_Œ£CN›'*å\º<¹‹]—/MJžÔ hWOÒÎ䱆×óe¾Ü dØiOŠ¦·“©;²þG¢\;yir çˆ×ìdK½eÄNÀ¢ÚãyÅë>y!qþã=v§“óñøJ'ƒ„lt£ÊÐIïMí±NùsræùT ݐn9’坨,û¾œ<Ó=#¥p@QœÈä2r"ö ªºŽopàDŒÍVKJÒiÿ&IªÛÐ9!Õ1?%jÿn=®›™Ì¹ d‘ƒhq“Rz›|5³mR7è‡ð‰¢Llj1;äÊ|˜6A+B¿x£ŽMîl’~NgÙäô¼FÑõ³cÙ$@çhïB£iüd&[À›š¤±û¨IÀO“Ô@&E2?CqÅ©–É\²gÿø73ir4ÝѤJi÷Š&r ‡C“ ÚîÐ`þL"`=ý>(º3-GZè'2—™ÜÈÊZ‹Rgm’É‹+â'u¦L@¨ÏóÑÉĎñ[Îs?`<[C&¨Ä*BÅ­tL0À“ó'¡¡îqŽ—TTLªÃÍÄDk(F­Ñà)`ðcc5DHÝÕ7(~H& 8Xø‰ùóXû%¢Œ*ƒB¯®[ñXl%‘™àÆŒqë%§ ÌKª¨âÞ)å˜ -¶æªñÙXT5ü?äĀBn·KX4kíE býœd I—˜Æ®æ¨»¶%í©õ͖ˆ´¨Pd™°£•°·;"Ö{JÃï¦ù3Ó¡…b…(š%£èí²ä‹‰Ù’%§9<–¨˜VKžP2,é÷¥8Gqqê''ÛNÓÜÔ`Ʌˆþ~%Õ}˜ÖæQÍÙÎÓülRP÷©D†# Ñý +^•´û%U’Øšø8l‡îNY²Ñ§Tã>8®õÂP‰yylŸ’ÑA'ñWŒ`§D4…ð^ï‰Ò:Ýq˜`V²„I”"?vZûˆ;N”<#åº/ýïJÎÐ0v®ƒ’¨úd•$×@ `s†»<²Å$хUaÿ“a´¼ð'zOÙžD»H¤m:\ÝIò«¬Nò"BÍI²Ñ‰Œ“<‘*U¡é›¤7ìÛ&їr­I¾HoL“ˆP¡Hä³ñ Î4?À2‰ j†@Y6û“@g†0‰ŒQº-)ÏÙÝ ‘äíCEU{µ}ê*Jb(”v ªSBoäGæfäN‚3A +!©äA@HGÒÖ&Iœ A É’„ûÓ`Øb…²U¦ˆõ²i‚q}6´$ÄÍ×f&o$™¦ °F¢C ’y댤Kq´“Øn:‘Š#i¶÷¾H†$¶E&¾+’Ž˜Ä“s)¹ ÞîºzäÑÙÖþ/ x¨mµNáP Oøz Àâ‡Û}>4[Ûԗ[Dq‡ø umuSìm¤îíæ{¯ƒ´\ûu™쎕¼ahÞ*½G†q+d MañBHÑÜØ0š5 …ÜÑ  ¼Ž*Ü&ê‚ ß?¨ +¯ˆƒ[þ¥)jë¾ †€œM×%ÜçσÍú8ºðºŠXÒPHUžÃ¯lY‹ò7À«£çüA‘`â‰wGèÿև¬*Ö<þilBñKüi½fté7R-1cƒ_p™ù…º; YwVË£ ’³ãBW4Ü9†@8¿rêý5Ån¶—*U¹[d’Šb®:Èà¢p[1º¯[»&öêß¡Q(^a?Dœ²#…ó¾#IÛf–’”«K…K(š½½¼!Ý5-N†ÙÀ‹ ¾¤“¨4æª}ÉGNÌ8‡ö†LHUڒƒlÙvLC"òj"ìé t›…¦éŠ'ȘåË¿×Å!{çÒ@ƒŒ¸ +G]§6ß(8öéy‰Q–È^q+,„†hËWt!gŒ‡“ªŽûl Z!ÈÿፀS5§±PHžp ¡âböž ±µ#};öõ«!Ä ÐÛꉹÄM7|ʉ±’õm Ê Œ…3TAŽ„†wýAôŠJP8dY`ŸÇ_‹§GÄAóïë’XŽÿêEaÐÂ(žn5ï" ‚ØxÔ g¢â4væöœ"8“h¥WÁÿ†aȝ0èãäLò W AøÓÊiÒ¥˜£zwJf™Sùòµ‡ÙLíÜkJ0R.XWlÈpÉæ—ÅV³7EÎáô>°ƒº¾Y—Ð "ÏyE~š !EPæ„a!æ)À@–'4kJ܎,›]{W¬1ŒÒ^3Øû“„¯Ùd€8Ìw—ú§i.Èð3l få²@€9R+ý+iqËO0ˆšBpã.)·´éò“Ú^Œ>&»Î0ÒT1µ3IÓÖ ¼rƒ¬Q%”V›‹DA™-Áîr5|ånƒvP¸†šQÁ'©C­ð6…4íú¬H“ÛE±U¼„Fó‡PçŽÑžýž¡‚>éÀyÿqiæ°Û›ó’#VîFOúµì`ðfuÿ”žÂ” ~X¨¸gÐ)GI‘eaNHèùƒAïkhÔÍ21ð6zh§ˆfš‚%*R .†c îº@½É +b÷@nñÎ.W +IòÇnÇÚsw¢\nYæý^¿Äî°*ùx­=I7)éßÔ_Çóö”„gpò–ÎñôUŸ!èý9ë&ºô¥/Äõö˜Cæñ…~072ųƒ“‘`kc컡ì–H¿ã3þúãؗö—¬#ß·õQ$ E‰’7DgœG±CD­ÿžµA¸Šøæ{oac¡`sFÞA¥ ¥÷We>¾/\‡ð¹ð&1ÖõS*úŽ›ÈïæÄ«¶´„xKAGA\˜Ïô(Ø[v{_VþæÁ€8óH”âZ89“³WDòÏ» í·ùÒBÇÏÔ.y+eUò>&Ã!‘Š1>'Ê)FšºÅ=NìLå…ÇaÔ Éȼ¨,•˜à%bŸ`¸½XúØ!±ƒä„>åű„Ûª%äþ€Ø ‘,´Þ§…‘Ï~½x«¥ç¾Ïd6qïW%$ˆ¾ZÒsÀo·:ø”;Dƒ­öÒxqÏ µ֒:y ®W7${8'£>ŽQKˆlŒ"‘³@$ͨ‰MEþ#µ©è0“„¸ˆ&¡ÅÔbÅ·DòÄ]ÍA¹‚ìýãç~S‡HÉ+ö<:ß}öC·  VÌuv,"NÏúÔ.*6ÀÐÄks¦!ßá Îë÷P’óì¼rh>5æümt²>ªád* 2ZŽu”ÅCqDmùòèÔWÝk×0䎩BŽûv“oƙ¤ Óée¨»b‰˜—i-[ÿ(LãD¤G¯Êš•SÈ Š^BŸ” P‡ñ‹­JpEâ†1Öáxù\ªÄå¥ò›cvЁ³³ˆ§¿PóT]Ûÿ(éAfL‰ZE‡ãÀKJn߬c˜‘bùUÆ !¢è¥‚}‰çpÕí}ÊîZÙ2ßu$V„‰ÙÒæ#d$èWüÑþ”ÈKC2†§2µKØ]ŠÄBœŒ’ý¿ +çµ9U–SÎ$^ÔÐÓèìteÅ?¹ÃƗˊ3Ҝó9«) ¸{9WîóHe!´vdaoW>Ù±P—±q¯EuR­¢Ï$˜r=1¥0Oð̓Å& 7PrŸb¬)>»ó]Qp«R&˜‡¨ zvŒRÄ4 ¨æ°¥Ñ|ę3†lߖÞaVNÿ JŠwïaõ— „ Iƒ š–3¬¬Mú/¹ÒI° +,¢áXqTk½µÐïd8’`éZ° +¥ Ô)É9®]ʾͦ#9fe2Ap±¦´æ(á»cf9ø€K˜R +È *òÜÎ{¦`]{—Ë'9ïGg¢&ᡈKØ&AH +? +¤KôÀÐðØÊ/bTÎ}¸ËëGE˜Ä,0‚Ðó6µ}¡P£™ƒ¨½ \QÅÓÚáf²p§îÔó:É(…ímċPž}uí™ kb„-ŽÁ2Õ`øâ‘üÇ ’ç{pïÉöÏ÷ÞZ-„þ°yûcxµÌ¢ivœX¦#i*¨M¹Û8rܼ Ì{¾å,±P­ܨG7Ì¢X“ ò8"' Ãýôo"†p.5ÈU‚Þ?ËÉÍ/ð4º†$Åu,´!jToÄ®Q ζT4‹Q¿³e%µêS¾Aê:ÓԔx$å¢P(<˜Ê>„ì’ÀÀõq&ïJ‘H"WñP  .õìn‹=ƒ?9°V.DÁÅ\ñ@Ò  q¬‰Q­$ ‘°˜CàùC9=i‘N¢—úïþŒ†¤uZÍx^`7Qcµ9úSãlÜ µ'ñÃьæÉOFÔBl©Š‘kõ2lÊæbüJJœqåd´‹¡ä˜d•Fi¯\A«7nGq[ê«Zû¦1“€Kˆÿ´ÑÕ2y#†eóï‡B$XC‡Rá“À˜:·»ÄÂ=![ïq%ù=y€Qfa¶ÓcØ/ã@CÖÝFâÖIc¿Oh—{îý|„ÿ Ž oˆ!Ö©ŽÀúu¯“/ö+ÞD ˜*µ]à[2ÿû÷ƒáÎÝR^@ ¥rRR·Ž"šôó¨twîÙf™C¥T¦ËRe6[ŒÕ(ýqˆÜiIø±$ ƖtŒa]Ý}Á„3I´¡IgA*ˆôÒ¿ö ³©Mâe”ÙAÂ1ÜbTŠø"ӎdÅ4&qÁC•Ê­›†n›,ݯ¸û ƒ®íPM¨®0Êû­VÌb××t£.âÓªÇTAm{Áiˆü­”z0Kڲܤà~û”ÖÛr¿mbz‡¤‹xJ]RÃY¿Õ’>úíŸ@++ÐT1øÈ}VKTàMoeaÎZLa+—¿_䗈÷í $k´;N3bgÅèmmß®R;›AÓð™ú·Ä}Tp“Í3¿ ù¸ n»5ad)%ògÄzoSB†­½Õ,36ìó˸ÙÛïh6 +ò©‘ r&tm2¹$°L`ëâȆֻò¡2ŽBN'G¶'ÝÞv®Dþ8Zæ=B—7°Ë¾Ûeït|äNÄðn#„gá-ïŸ$ªù\ôQeV} Kœ8i·xý«êõ&ñäZ~!XžZsˆ°¨ÌÖ¯µˆ5ø#Å©q42ú)z0~~2fâù½ |°f÷‹±Ë‰14o_3Ò8’ÅÖÀa<"2š#N˜ÁàÅ'ºÄݾÕ=4 °Œõ‰Y9ÅÒÆÐÿ¡¼` ³ ò†³Â(uÚô© ë9Rýc`þ‘¤èD:\NÅÈÌÙ"îaIøt{xÙt•‡¤7_Ýë>ÚDº<·"¨\âþ§´z¢¼TC¼!9Ù¯ÏÅVUÃ̎"KyƁÓó›Hó!žBÎà +$— MG.‹äXßÈxŒ‰^´„Õ¹°’ËX¼Ž8=øb£mQKîí 70€nB„qÔ "âÐ`<Ò£ö£-Á|4õµ‚¢- #fáÊÌýÈO!•¶’a¡Î³wf”zÙÛyåFÊÎv–ìá¸k‹… dòOmˆ +2±üûØÕ·’î .ޔ(³4ñK ٍ{.¨’I"€eòõØ[jpAª §¨3oÝ;Éd+ ­2¦w¯‘ïõïªgù@ß\× ³-ÊwÄJÄþ‡IÃfz‰ñ'$#`¦³¶Þùðë'M”¥ÊVì#³ºlf›±—Ð`ñ1jˆo Ø#B—‰ŒÞ¸ XJnFă‹3U¥«*ä¦ÖžGh܆²ŒäÄÜ5{㝨ò{ҝ8CDþjO&œëcká¶çof—˜àµë1sŠï ¯z‹Èp&+áàœÇڄÄåªr%>åÜëþ#v ó¾JòÃV<·Ã> £ °2ËöO ^b?¶5uùqj­T¤„o֞‘c¼øG‚¡,W æ`Ót#&ë’o4’ûµÍ°DüZࡓ¡8Dö/öTâo{K÷|šàsDیÁ¹`'LÍLðF9èÞ2uD“¼ÄAûbZÞµ’3šÑå]¹%€ù4ʉ5™¶Mǁ¦L@7â”,8}ÅäD”°ê÷‰2߬5D:·Q˜ÞéßɳW7…ååýEXÒ©&þ;•3yˆ’ÿ  ì¿ xöÏÀ%<ŒP®ïÇ +Š>gÒ«‡ª~•áÃ9¨¥Bm »+[»)Ô>ÅAÇÀüSwê6ë_…Zaݚ票§V;»Ó֝Ý憻AE4Áö֣ㅎØã¤ñ +ΦÞ.gAKã啒F…Âñš#í’ cWFÇ0ÿÔ\1Woa{ßV7”0o|÷2ê7A½oá«ÍÉ0oØS%ü].ÊA >mYœVe—½!¯Šú‚Ãü´0B[P<#:¦¼ñjJä2ü +ŸVq)*‰{e†â†uœÝÍhsHò´¿ãi³Ñmõ·‘¼?¬´áY³’âÉN›‚±^¯ÔÕi§Ý^%30£N+’v…c©!'ÞeÓÝisï½?Ìˆx"3]™|ͧÍW‡óž GgÿÏÙ$=ÁJ õ ž·à‰DÜ´Lr\3/ÏÈÞ?~5œ" َ†õ+nñár~Z¿Äl<]Åd'nöT¯…_êÆ1Ž¦UC +ƒ8‘—V2ÁÿsR^&²€–§W#óÝLΣSÛïØSJ‡ Åû*òï>•¯ª¬o7ë©Ôú4“'×&j*ç\l’A(>ÈÂ0ülä¿M¤V4äLɛsKà5²¡–d£Ç×'(Ëà3#oz‡äûX;}^ñ¥wZèZAþò˜ø¢wËqWK……1h!õyلbÄYHvO$ʆ1“vTA™/¢bϟÍݖ èÒà'#–Ñ»oEM8ÌBM4¸rcMNoi‹†tq3EFk<|öaÔ9*Â#3{ǯ£CìEd_Úu rk %F¤‘óŠ†U KÕã$®ˆìòNÌÔj#Þ +R7Kše÷ýì\pãÏb¾Šæ6“ ǏL9ÀªO+¶õ¹¯ÑÔM±×Ó¤Nbœ×«¼4#ÀT»ÅvÈ~¶)‰nÆû2OXâŸö’ÚéÛf7JX®Ø¿l¶­ÇO‹â ç.ŽÆï³ÖN&Ú>;)2Ì-ðÿ¦XC!ìÞTýy¦?ž!½£êÀöeÙòÐ +Œód'À €H@÷‚Ý@:xF!õ¬‚ÉœWtmé³d€!Ät>˧™ûž·8æÿï’6Œd"U©&ó‰PÛ-2Ce=œ6T±ú+퍎C³$¢.<Â^C2iªBÐY™êC·¶IÍ|ÿH‰ç>a¨ƒq½„Wg²yçËRyi)d{o!ŠnîÞPòrª‹L„øKw²…ùwíV5П°U3 Wo)¢í–?Síè3Aqää6nú•þ7½‚Ѧù$ ۛv 9‚"ìò±lI‡Ì¢ÄŒ¸ôñ9HgOí”ÓîE¸E×éP%©wsEmù›Ê³˜INŒÕ›šð1« rŠG&Ù)€ÔÓÈC‹ûPPJBÓªè:J¾½¦¼Œ`·N{Lörª¼ §ðö^Ò {D/%¤ }û©ñS¾óà7”×ʪva”Q¢IZŒl'±x¢O0a‘Á©‚I§-m­ÊO’/U¬q¬#\>†¡…Ðܟ|όŠ+Í´..Éù±ií¿ùÏ—QÓ©4T‚Åsn ˆ81mیà8ÓezE†)ӄØ&¡ù±ŠXÄæ8pJ}[ÛÏuÓ°LÄÿ"Þ'á¸ø8‰Y‰/6°ä°´Ù.䜰ÅZ^ö±ŸGEmÁɦ¿žx («7¹Üߕ*Óovè©e^OFÉn“›M:e6« Älà=à Äùžlâ÷¢SæM‡} ‰È“ë•dÒf6ÇƼ£i×+¨X¾,¸‹mA¥u›”†yËy*” ±t6CÕlµzy +Fz¸çºï  %vp­†­ùZêJöQ&©ñà†ñ 8sà„°ád ƒCáÿ˜¨ÅÁ™.o  1›ât(Šp Û‚60Éaƒû’hBDpݐN‘y«¬’G.‘,& ٌ=ÛúîÈäӈÂȕø‚R1«ù”î|ˆ /"‚kü>mE¦ÈˆÑ@Fќ#f©-‡ŽŒ¿q‡åùtn·ƒdÒ"GlÌûÃñíE„ðëïÉRL°Î”'—×WøŽfQ]ÇÛ® ×qHZ­ƒvZwÚÃswmËü”ÐU½›ÏeÛXf.}YĨúï3` Ø1ûöý—håûɗ"•¥Ð¸0Lê/µÈ69n:EE-PÝ<–rä€•Õé"ïN¬nE àòXÄÃ=iRŒ}’ôB`ĔÐ>•ó-vXچ0ÉñɌýZþ€)1µ(rš©Oµ•!%¹gÕJbº Rò+b¦1úO¨ ÖHiø°ô± P›&Øk7QÊڒí5ûf6¨°«Ï°äzhÔäDÈäĄõjBü[(pŠI%bŸ?½»¯Ýt␩ßSب¢b=ªî<ðŒøhLjkœÏDÈÆq¹Ð߇Ð …&‚ßÎU°h‡c‘®W o*¹ý¾Ô‚4âտ¯JéŠ^°øØã<¹Z^°DµR¯™K–ÒÓ7dUµèšÝŠ)u©ÿ¤.iãÀ™¡l}—(Põ°(¹} b—ãêtoê0ÚÀj¦YšŒRñ 'LÒ3ga¤;9id¡‹hô×ìÙmÓM? nhiRïùšxWÌ¿ÿp2–‚5óÕT£Ñ´t (ŒWí°r<àÄüyݐÐJÿî¤L›vûÕ<ó%¤tˆ0µõ.i[ë4Y鹛T‘S‡C‰ùÓÏý!å¯so +áâW@æ:²ºÀ؁ äJ#´cÎa ø}o²iÀE¯B´²¼F°J÷Gb©Í—ÿx¡Ê¡0);HZƒô¬[w¤s›¬V¨8„Žl9‚M¤­èZoÊp²fËëˆÓž‡à$ ~IÅØqу¯„þwræÄd™H~Ý%}¼ð÷Èâ1,,X£yD××0ÿIb³X7­Y=;»†õÈw ÉÙõÐÓÝ4Ɇ{íeäÍåÉ ëáûԁüКƒè§ ûÝ/nzíî¹7#âն΋•”Õ±¦}¾]Øùùh×ÎÍOˆõµ= -}1v¤ +¤¥÷Ïõž¸”¾rÑ_oq®k&u“Ӎ>;÷’H`.nSä ƒÒ´¤CRm~RÑ*Lân‡Â+.¸Žï-Z&â²±¢R^Œÿ‡nq‚a›ÖÓ!øÄáޅ½â:½¾cEǯë)Yn70©,ÜŸy¡p^OüXŠ¬œ, +ÓW¦uf }w[´ +5vª"&Þnꡯ¾bÈà \ÍÑ÷¸7¼˜´2  +uÿ–ØŠªN¯(°Çé†zۃ—ºÝì]%-ù67Ӯα÷SÇ£î큅ÚJñ=žÞ®@o+Õ±™Æ¾ªÈùí¶;š°›SO—ÝE”B}»gÀÊMÀ£dÒ-iúNÌ­ýÃäï3Ӂÿ±…þyHµ½’ò ÚNÔÖL em‡R<}·äKžq[OïÁ:öâ0qKTޑʯj² +Ì]ËV™¦mÕ¬aÙVc}Ûj±®°y™Ö³¶å0Ybn÷Fã‡ÚÞ#©pÓ¶W 1%üLëÜ:GÚ, §áN"\a ,ðl{›åRê Ëñ#:H+ƒë$ɱ-åÙ¢2¶ë9RVl«Z]Äv!/7“†íŽ „íîFT¨C¯r½ýZb­±_k;_Ûª¨ŽK’ôèµÄàƒŠ×¢~³íUg e×ꋸеU2¬Ò äÚ` ƒ ׶ê°&Ýz˜vk;1Ž­·},‰¯ZÛ؇ÖV£R~ZRÐ:&8ô–×j· £2ž™8"¬¶Žê5[µ•Iìgª¶Œ{¢‘Õ&ÕZÔ7¨öë)ÒÔ¦Ùpsj/§@عcÌԚYÔ_…ž©®Jmè鈎5©mFÔFmו8‰ÚyúÄT+ µÜ&öÉDÔҚ\‹Þ\æ x•SgÈÓ¦_ÊåҚ‰ŠÊ eUZãۉ¤Ü|k‘ö;^ mEí¨Úã¦Wº[àhŸ*|Ža7ÚD÷à‰z°e~ýݜ +íá¬4i€D¡Ut€nÀW`á›ÚWP ´42l +b½G/ö$5àgs»ájTÈ*JšiD;’E#vևæuSgÛé öQâêL7™]ý¯ì}¼ѱôŒ3gÕö„—ül½[ŸïJl6°^“‹·'Î1ôûßÞ% P®Hw±ŒÖOÌ}Øìüæ“ [Cõ]ð•ˆN²øìmi+\G@‚©D]È,”Ð ΃UØ -Xe̶&˜µt}˜ŒfŸrÀx§Ü̲Ú*öì˂ü±è±š©¦“—¸¬È«q ƒ*;â9u¸ŽˆîAUç,Ì²zAu|qƚ ‡:½PØö¸JÊRƒ}ÒWY*³RÄ~D“ ýŒ™à~•qñïÚ#,&©?±Æ e± …¢à`q}¬%ÛæûAZ[ԗ`ZŸņU^6€ˆÃÖ[B*²m• ! }† +²×‰I@ön™õc/¦7ùØ ¤{éùô§#âcÇÚ}SDÇ6²o.üwáLJ•X-מðD:›Œ²t:A© hŠ±Gx¸ Œ½ˋí&~,ú¨£Eƒ‹­Ž¨[¯Z%ìW6R,•)Å2ãڞ&@­Mñ††bgï Û”X4a@b ¤RT–RÝ“;%ÌBˆýïî>¨ +±Tâcõa1ƑuJDOàחôìymìÂä''_©Ö¤H¶a_ñ8}5¸Bañ§G2~Ž*Fìõ¡–¯í~‰° ®„å[›,÷*ï"¦Å¾5XÙGBlÑHYì4•‹Æ +,\+ô «½~™¬4slÀ>+àñuëNá?`1H)¸Â¶ÿú¾D5¯;{©¿þzFÃøë„ Ç~=}éÛ®©q®Q°Ð†å•¸oiZ&Ƽ±WAþlͦc_º¬¶P8Í._ƒ›ßõ0^ ÜÅw¸Ã"=îu÷Mú¾´W­A­8!ò“^ý` ÙFqý+`–«¬ˆQ119¯s¯ñJj½WóÚ?" ÷•V2²Tp#»¦-ގÓ^@j(ß:“š '¢¸஼¨¼:ÃE¾mÛµÈYÓ$@FÅê~~²k_•°ë¨X×µPˆuµÆ@uµè¢®¶”K7LV¯ÇjÖ\Ó=šY™ƒ¹BxäÁr-rÉ)×dµ9Ÿ2…¶³=¤òèª`ßf%„f•c¥Ì*Ĭ0«p:Ã*ä„òv|bQeÕÙFE83`sÁȬËr9q{¸:r™ksùK|5Öúœa¬sE[Í@[JÖÐbÉ8r&š£Y|1@ +q0U«—…áTªâ$±ò,ÿñé>¹+!êxW®Ã +úF/!Ó·ÖEÓ@U VXyí `³Y~óì c—sùE™ˆôB_í &S|%l _mÆØyΘBn A¯‚b‘1Ž]#Ì[  BY£ÚÔU*o¦$¢U@:™ +ßPQön×æp;ЊŸ,g 3õ°\­ oUÑu6ËܱL·ú¹ÃµU`ab«¥·q¬¸*ÝZu—S«Ä@‘ËXu;""«Ó˜’‚°š›R¬:éºÕWÝî6ý¥M.M¼êÜê¸U·rG«â‚ûNV-À«bƒUç^ÅUýº{cU«“}º¸ös1 $$4Ɠª€i"ª^Å ê¶ëˆ§zúêEâ`ŋã¨â¡£jžz Þ5¶ÞCAu;t@õ …¾¨ýtÉð©Ó×KOý+@_Ð¥ú‡6éÔoœ‘S™cñ©¡žrך“:ö J”p^”ÞG(‚Ó¼Tm×½©È–南ªV$ ï°TœY©¦°H¥‚M)ÕPªEsmãÔށҮ랰 Úgíã…_7ÍG üÑ5Ln’ÛU©Â:êݑøpÔV¥Œ´QéVÓâ5Õ´$sP &"˜¼µï6Ò?Ô=,ÕG\Ï¢I#®.ÛÖʔÝCDԛÙ4ˆú®‡#jaBgñ˜9¾=ʍƒP“—rPSg—AM›Ôt“ÑR;¤ÊÎ TRNN“w<‘j:"œ€:åᮨß0}Θ]˜¥ù–Ç?Ìé§vê*ñÓ&ÑfyÇÌð–§ zÊ評Þw~ ÿÍÓ«ø~bûîÍ O›6 b$wúê”vJKr}S2.ì-vú†y¬Ó÷ßtNÖêúœu¹ËŠ®_‚{Òá…Nß{6Ék:§íÆĜ6EãÀià”¨¾piWÒYØ°&AÍ\[Ê(ú·â¦­ŸŒµMÉa‘Ѧ&ŸAȬ˦-ÀcXA~”y®)ùøXS°K‰ä½h4ÕtÙ ¥ gÓ´!T iJìG¥ÓIFª(è32Lzû]_«[Ê¿Ép%™Þ¬½ùd 2¥R²bKƒ¾ âK*œzïQÿÍé/Ò·èìP\ÂÚÜlÄG†…˜Vgæª8ùÂàGk¦ýÙ0}(Wã—½þˆ¯l#—vº×Ké~䇬Ê.m- ºôYBŽT.]b$tpi³ƒ¸¥ÌB¶ÔÌ}Åd°‚KCóä|¬"E\§e£ž^•¯^pE+ZPÒÌkøHw'Ž–ĸX‘ Šv£ gê75;Š•>_ fàÁ«ºÓS2Ã|3†Tž¥r‘¤u“l  ^É*ÓW`¥íø¤/QpkWd~Èș‚ïɂ*'|]Àa_@‰Ë JÃ5ƒ¢O&ŠâW`uú”Uõ]tu¬#‚â!߉Hptf´î…Äcò±(dÜL©EmJ4ô¢êæÌäÿ+bÀÅx´Œ4HB°Œ–t +ýc¼苪õbH‡Þu*sòߤ@v/·Ý¹À A„÷a1¶UÁ†x_¨îâŒ$øօ°êT×1ýÖ"˜Ìà׫%z|÷ÞéΚª+üìùv¶Ö­*7ñçC£Nz°PBk%¨F`p‹1Û¨ëŒoäÖqW~»;»²,îBfŒS¼5í‹_H–°sf0‡Á©»gÜý;æçâô]ÔuJT¼×­ö÷Øš¥ô¥Òi*}ȯÅ!µøA‰í±k,HçCœÌ):ŐšÒ¯¼¢“4gƒ$=ŽÂû54N32ìîr¶°d+b$A«‡à(SÀïíiHn}΃†ñ´3øÒ¾;×}MÁ©@r¯Ë‚‘»|{vo\“mˆm”3E +ëPÝè…ÆþsÓ®j{Ç9…æ5.ˆ¹Jé“#· õüb'Õí° “ʬ²Õ®>C*»®í<Ä"~JE5Ëèfu[ë*dº÷m~WQ÷Øô*æ Íèª(0·sÅñ†SÉ貇Ågâ2k”*“ðZáõH^WáÌFæñì ¨Žçgí÷ó­‹))åN! 1ñÖ±æúr{•‹£ý]7àyçì8öEÖÁFNIñunýˆ¢“*É Ý&iGì^}˜[«Ÿ³RfNð—HËñ}4&vé´C‡}¹ÄQÒbž_áF§Á)Š(À¢ÑSÔKÈzžG €Ô_1Ð^#3Lõš»b”š/ s*µ‹¾úGZ{MT tàECÖ¯f Cu‰Ø ô¢nŽwTÓ)<$äGý·/‰H¸Üɉ—ö‰<%óNˆ' Hm5Lõi`„¦ç« _Û´Ú"£÷¼),Ô»=3 ð|8¯uxîÔn𷅹¡X©t‡I%Ž(‘” JB™¦¨ZmÄ ”ךjWLԑû½„ÒÒoŠù—So /¨à·s|¤—Z EÞI`šÃZË* þN_×ã±oxâlFژEžÑÓìMªL¡²C™ÐÛÄ|½µÉDb\S*3)M§µË®÷ÖÛ"ÎjŠ€Ž!Ðuhu´u÷R ¬'ªÜN‚³§»Kp5¥îÁCÖ$söÕEa­$–%râ%ºíjMƒ‘=¯MÐÛnA¡ýï½/MÀ}ÏfÛ'I ¥~Ë(Ä„¹ƒßÀ=z¿->^aºÓ—q2äÖ«ö°<8L²`覶KXI4ô34‘ð§ Vëá34Ï ]Çü ²$oMB_mþžH´OD«œCSC ˜E¹ãÂï (Æ~SAÚ¹·{­ÈUVmÖ!Q[Œ¸U!WÅcX‰£k('ËfU?RDžgØ;%rõvfº08Å +› ”*MiŸ³v¡æ篶°»Œ"²Sls^-#˜K6e Õï =$¢w¤»zŸb¾W‰2َÀïHùßRÈÓў{ÚÄ&10Ï1Š‰²ê +9ük6è„dÕqzž5•Æ£û eۘ§=³wwŒ ǂÝ҉döæÂwCĝ< UC v[æ_û•òìí½¦— *[+k‹ƒXÈqsúM3©«V(¾Vò¶W9«é­Y¬F·ìÖ½½ˆ`"!,’p邮)ƂnL º 'yµpô]^œ] Š¶!-_>4ÌõüÉBÒQƒ ?…ÿrQ’jè‘S»rÃa%¾\f\ÙxC%a냞lI£í™™À2íœU¼L~“ýnËÄ¢Ý\·•>6I’µ¶S] *úKOq•Ü"W•6øa¬äÜ_Ú³;Ó¤¢ +ä¥ËíÁ:äÞ0ùC5[OËW:/îì±íÉç礓B§ûÁ³‚0DǾÍ*iŒLw‚XëÆ­*ªòùƒ‘,Oi6CÜëùˆQ8Ä Ä89Ȕ¦MHe"]-»Ø8ƒMŠÿpK0qÁHa(1ÀI™mmêהÀ§’<‰x8ÅʾÛ¾œ´oý"ÖìgÄ¢ÄNŸè¹ŠS8Y:#bøQù|åç±h.þ¯ ©êTtò9 ý:pö4H +…ŽeÒ£br39-ƒ…F†SØ¼Ò +U—× tOã\þy' & ߼Ŷ@GÌ¿N d ñ]ÀW]Éyépsö ‡á߂K¯a/6”´» â%4Ð +áMˆè¬øíbEå›Î¥zû 2 ˜ßø~Z¶–ž“ 4És¢(“Q¡?,]Ç°“LŸ +B”—€ 7ñØÀ$ÃvÒvrg¡a숂ê9«zÏnnæln®æææfv†n®èvÐ坑M&1#Û¦%A¦"ZªZQV%V•…E™d˜™Y03£ 3‰ÍÌÌƶÇ;¶Il’ad£mozØ9éĹÎgvܑìm‰F£k)@“ m'b’i¨LOz*'étÚhßNÓmš"rє}jÈ¡ˆ$™‰)+Á¦¤(àÈSRv„ù…èV +nÊqì¦Y˜oʁÀ@"Pö¤K4ë 'rÄP«C˜†Ædùº¨\›™,2, €Ôx›dNˆw{Á>ϋ8œhE£>bæH‹ ¶™¶çd‹a·mo©-ì¡öžmDµzWÕ§V[?eýBéä/¿X@<)ñç'ÿ‚/ùë3ù%OAóBNžv§¤dÞfŠzŠՋ‹MAc+) ÍÐÌØ°ÑDb֘CP¸@t±‹H]Â\rÕÒ£Oq „¢21©& +1¥Æ4E~#+yÑ5eBæxÊ/mÉ&ÛÖ0¶w¨Ü•Pðp% Ɯ$Óß4§È¸#Àß°:+Û nU®Íª:VUUiiYٗè6jÓÖh+ðbۋ]Ø 1U uR1éeIÕâÚò¿ødcßÁ­bÛF§oÛ*èïVw½ÓkHqÝ ÜaÀÛõx'܏ËñTˆøç…¼Ü §ª}0)ùŸBŸˆ—Äcpº ‹¨ô\ÖACpàÁ`@ Eƒ1i5WÞ€$2 +j68Hg1›áô7JÖH@ž’X•nt“q²‚ O¹„ ǼÎïÅo’Jä E*ë;„ xC¡å°Jp]š,@Ä)|kŒO4Ä(áV32·&‰ƒn\}‚i™ˆqâ"g±°ádËdž @šRš¾{!úCµ‘Å.4å&‚3eúc²QþÕxN¼IãR…“(.§}é{c…veŠÐŸ¶´M½)E;V¡Œ)Qgl4‘Ñu$•x¤ž™û»´¼Ž2¥¨k††€>”Éa)åýÉÀ•âO ´œübâß YʨççñÎúçÞÀŸ®î9–(¥j|‹ä¸[”sÒäûä΄X”áIá3R(°‰V™œ~¸¦ïê8¬¦¼¦7ZÛ÷å,)î÷ÐC.#e°Õ )¬Cá +Û8RHQf‡Ù2Ëz(LHI94…rB?1¤ ÙHñYÏåL0b=?Ê{%f£ÀC•éN„8N'_Ä»QpËvuY…GÊÙ¬ØÜÑlgÊãטÐdŠªQhÈ&8Ð(Á •ÁRë>s3Ê%igµ^«Dp›-rQÒ +·åëÙɶ/¯W+JŽ1CEù]*oã MWP‚;èçd¢ôÒém"±’K‰ríªðZ! + A¢¸ŽLôë•ãÎþÚÓBÕ8_^m(S h(¢Y†òÉR¶ìɕµê“„“â«X>É 4Ý#(”þ%Y#“Fx­xtié:‰³½RÒ"”p8,~‚P<¥ß@AyþOïJ@â%(@W8EëÓá¼…œ¦1Š¯Ÿ>­’HMÔI'cù ……&Èe‹±”È‚X:‰2xöJxswÈôמdä~A)œˆˆ6&”1“)y‡º«îk¾.SÁ"I|õ ZŠ§IH&O2dG'²Ü›­5uø(Ú|R£6.…uíZê nv%1垼&AC„jD²BtÕ  fA””×"î„F=LN†?Ë:ž°©õä6AP‘a°tI*J`;ßüÜO`æ¢QmSÖwC.<¡Mj‡UxYç¤væØßxªÔ.`íZAŽÚõl| ÌÏy'ÚFρZÒdæ€Ñ†}Ý éSA!Š (yvŸ1çÏ kRډî÷ñ§Vo®,‚O”‚“N¤¦£¼è¤ò-KŠB2¦tzŒ='ï³²ýŠÄ4üTËI)yÎ>ér¹»‘ÄѬ¶îКHBő¸B’/)ìÉ$1ŽÔ°…ÅøHz‚„¥X£è^/N°tǑÔ&\'ßæœ8‰NøruûKø`È͹H´Á*Ã~{H~äÁ¤8S€Ç¿ȎWJŒ/Í}Ž«øð0$Q’QGM!‘isáȻͧæˆ.$LYèhÉ05ÑÍÚì¼UðM©©ߔ$O $Qz3"Y˜TãÏKÿTü„þ•E6 É‘l LaU+A1r‰Cˆãðæ!AAx +0—{D_Uqd摬¡ÝÕÍÁáÐÃÁÆ—ä‘ šk™ê¨È2ñÈA”ÄÁ# +r¿|1ZXöŽðžiÏü |{S;Ž#˜A£'’“bG´'#ŽP¥èå»Ç:b‡"f9ïÙï¡Õ}üJÐâ1UdD·)– ÅÝnÒ_ÕjóÁDÙ¿_8BPÇFŠ*lEùGOpq,cÛ%§[+cFž¨n_!§‘úDPn$+Ëeà(/dÀ¼vﶚùŽIMÚÈxYeò_ Eæ·v®åÕ3ô¯tƒè`Ù —|‹± +õ©gàoÅ^÷*gä\jFÆR3ò,yd¨jñßwá±¹”-JF‚Qý@Fðe?Ê/ÂÚFƈî­²Ò¯ì8#FtOý€¦ÇÉ_O2Œè+`×Ð!âdŒUfõÚR€‘gãૌ,ï +¸ÔpwõòE~‚øáIª£ˆõ"‹®"‹»ýQh(ÁËq +ŒäMÖ8ˆX`,QÉ¢EH"ŒosH€^£¶Y‹«$‹´³ Qoòrª¥è‚íh7Lt¤ÑœøRh)ÿ§؅Š”‡°‰S¤ÏýLWèml–uÏêJg#!³`@‰²¶·EÛÛq¬©Þ…è쵎4áÇuk\ɚ8‘_Ø&²©˜QBD8Ýe"BÚÞG~‹š˜^ú”%ÒvñJ¨J¤äNûJE¾Í~éD¶…э‚5‰[¥b“8èðX3”)–¶nº§h8¥µÍ:  |Éü¥,ôïƒ [›bl U­Èé´Hfƒ‰ /: ]ՖOÍI–pm™¦Œ/dý@k” +†{åjñ£I¼nB·IeŽD G?pœI8ÅlÚMîñX.kh`™=T„éØ$®D8GùÖº•Æv¸Ó`›1‹¢x½²JöĪÕU ¤“ãY,IÊwÁZÆ Í3íÿ€Úç*ú4”2X4 j#`ƒˆ7ç«x±Š=m.F/)nom/¤‡’ºIrlHÞ-è 6:‚³&‡zՎǣï#—AÙÚÛ¡Lͨœ¿ß>¡҂À À­ØQÅÌ#ËI&e--"àdzÈE\¼+Óß´„œî\:\é àœ§øC9kÅ wRœ ¹Xfâs|*>7÷ã˜ñ1äF”È:]©BPt…º€!áAhCÌ®8%º 8ÊÏðéâ¸îk«‡̵ä¼ÞzïšÁ#wññ?râ9ÆØ6ŠñŸ]¬pÚ{¶‡r±’]ß,q¾Ù‚í˄pÅ@! p´XÑþH…³Ü5êï—H܅^æÄwóPÍÁ¡¦UPŠ—í+˜Åç%T"[©‘"ûN+íY±LU$2~‚ •­¯sp>7æ á)AóñKÃò«Þ­ÓƂ¼žN,Jÿæ‹ëR&M˜AÀ®#Hàd>Ë §âšA¬ˆ0ANïhºh”ÍmÊè{Òhøz¾¯º6©ó›pªG7ÄÚN@âȍLb¶KØ0ÊISW0²±D'APm˂UÎÉ ¾K +5û®IG ÊÃW§”ìYý&Åø©U6xÍÌQ˜;~¸Ø6…U_Eø¥"‘jŽYˆIÇ fûHŽãþg$zp õ4z(;7' ¡ðv…;Ñ#LB¼îuŋ ßÑ7¬°òéi¿éu,ߛ£«F›v8_ +‡Ø±=á=px_ï2@¬vj6侺×ÀÖ¾à•8ÂìÃd&Å‹Ÿ’^” v<:âyX ‡0óÂAK+VöTúG[^qRèåø«uw_Wюïn9 ) ØNÜüíÙª²àè +”e/Hh÷rž¡ çt¡/ªbu,&ºTەSÚ*l)é4L(ë‹'A +–gŒIá- ðì°¶U4Õ²¶-0“3„•ø•€ƒø•IÖu/–FšB 5RÔ§£Ïüº•Ÿ'XéçŒ^àëùX¤µlC`äLeyW#xÏL?áltùp9ö¨{ÐÆ 3gV¯ÈÎ@æ~Eçò ¤ÑJôæ¨ú‘؁=ª!x8èÙ@–†. +Èïj^ñ,QCØŸ`h˜{Áx6¿é™+z&O$Ññ×RouűP¶ù(õcmG€ÃFŽ*]5þ’ö.ǖ +CŒþóxÃU˜²ÒëÆaWßA]ºÒù&ÐU.Š¤09ӋVÄÓYåH´öüË>W`3±Á¶¬”Œ–ŸµsGÞÚíá¡ÊyxŽÕsÉ#Ÿë;Ñ[âòŽ3â){ö9¶3sSº[ŠïJ[Êd’:t:2Aû@'•yQü™!^›F¹p‰¢V£#|õÉêz B7Z›b_I֔Õ#ÔÅà;‘™f"óádܺX\>JyhcØ»åÐ(Ñâfç{BSEJizÏö`)Ô¦o\.±¦ÉÛØN Ĥ÷ +öÊ֒`è[zºJ§èÎþ†÷ŸÐþÆÚç÷Úe«cF äô;R´|z×ÙZa~¦QǖOsMí¨p`“Õ§@{“*"IÞ²>€ùzò ½ž ËóI|\I^_SÌW‘{Tƒ- ­ž”Î F&`6¯yæхºžÔᤰpû€- k¢k¡ÆÞh®¨øcæyÇ „­EZƒâ4÷UšüÎzFAMМe=K/~"Âz^Ël{Ê¥Öó"Í؊1|¯ž +â=lqÎw +hsà-Ž§˜¥Ççmc=ã¾ÈÊ •õ´´®ŠV&$Ïmí-!’Œ\3?믟1oÔá>éöO,Ð/éÄ‰ÔùTO}ŸŠýT;›ê©ÊÌf‘9Içmƒ¸TÝ'€é„¿?Çëú#òýL®€Ô˜“™‚>«jʇzîvÕÍüûP·E€z~Ç2º°_úŸž7¡lîŸÿë‚,øA>Ô<Ö¤õiÞ {™“ææsþl§ªs¸Ê[«à{ÙDÝNz„¾)Y˜›x!|i÷\‡ýÝâ‰Ö#¶­ƒZãoõ—¾C€«të?[é>㞈 WO…8ëâYk¬ÕdöÏ*!xtøz¦oi³ë¬S|ÎÏ|=Õ ˜O’~4„¦Ði4ã<)…t› K2ûÄ3üqNô$ôè$®æ?SàÑëÿ_ÈØB÷ö›ŠyO‘ ¹š€º†öÀ_ ,ÂpÁ¼ü@ž,1é}æä)4!·¢é^Ï9íR×;èÎÅCóŽ3×üþ\§€´Œvè/5ïªÏ‘óÙ€ Ï?u茇Nú5 ÛÖîL‡a•<žƒzùYÑz +Hc\[h½Ä+ƒ Q’ëêJôí«u—ò#>?LßÆódgÉ +Àƒ·?»z¬ù2ýCãÉwÒÇ·“î¸Lpï»[± gÞ6Õ~vÉvšÎ6˜ŠWˆè>[ÊÝ°EåÞÎ^¨ÙlôáL­êÚxðԜš y¹E¶Áó*Ûü’xðìŸÉ?„缕lK8d¦jj]E’Ö½ÆϊK*^Àò>‹,a¾?;Q3oùItûWûplv[D¾¡ý™ïƒ\ÂE15¦)8t,Çûº¥ÑQs™£ƒdÖÚáOzÐ¿Áw>¹sàIÐêÏ\r™9/ç矑ó{­ön¬þÙº²Wál¥“؉äŸïZÀ9ºW:Í`+¯_4ÖÅR:i‚ÆB°Ï\ð,¥¨dÿôy9&§Èà aiÈ©ïï¤úŸ8ÇBzPñߞjÐügë= yF9Ag7–'î¾óDF¼zVÁË䔁ÿLÙ^|§Œ-‡kï¬íð¨w2ìDÄöƂÒ̵øÁ <[ˆJ,e{¡Eû;@Šw²£³å ‚=œË>#T$‚.¾qz¡%êSêàXA s\8É+ªSæì\ƯŠGMÁ:ΗÏç ng…ôBµ70墕#„ö¢cºsÁ»Wv«¨ŒO•hñFpìDô圕锋;?«AÀíí:rÇ¡-oW°/@eÌÆ]3ƉÏ\ÝVsçÊ8zñ,º_"û™.01ò¹So†í¹óÙ@Ø ùšm‘ »]RUçr'òÏt;ñŒˆ³¾ '}2Âސ;‡°ë~£AŸ.ú`= ‘×õ]4(aÏ%>>ÈiþöÞºpܙ™aœYÞƝDò$w†Ø9/fšª)<¾®͝ÔFé–×87ñú³F +©ß‰†};ýª£ä©¤!?0S¹• ‚'âbÂß5{LBClFùO¨rY+â ýÊ7´e2ÂÇp–›¹1pÌ2Ë܎0J(¼:†GZºG`M°¿|SK£8EU€¡Ëë<ý¬þ8á ¨-¢WD¿¯dÔ³BK?ëìÅ$ºÑtàeŸ?xÊø|‹3lrFǛ –ƒM?‰ÑHX¨¦‰•dkxñì3–/{z+Ü®vº¯ý­}6L€¹¡Gý 4þ¼ÔN¼îã¶Ïø5?S•SL;«ŒH;©ÓLm7Ä¡ƒC“>·G„­ÞgÉVL‰ðÌى/<&ke}4,'[v—„QG%_v‚à–f§Aºã¥YÜ?~|f°ÝS¾Ï¸œÁN¡—´FúB'ð3¶ŠFËIÉøýuwn<ÍîZeçŸôÚ '!;»¸¤¤š"¤öä(UüR܊eªÖ¦\dß +¬LG8<‚;e`£“™O-øÙ(wÑSÈGB%xZìŒSÄ²¦”Éøfž  ׳t”O;X¢mâϙ…69³¾gXNm úŒ {e¢Œ )ŸÏ–"¨nÁ?]?€x;êÏgZùq·Ö{œe`)dÒ×I +Þ\;hjƒÅ4rŒ¦ ûéáT+'jä—ôÊý !&Õ<†Sùê ;ë¨aŠ´=óÑS`®ÉUüfH·#„\\|ÔHؤú:‹}ȧníMkR~¯SÅcfû¡ ”Z¸— Ô1,Ȟ±× +ò:z,:Ÿ¡ÕÆìH“x©½NDI¢jÞؘ*3­·¾pƜ ˜ºÎ +8b3b½gÕãÎ2 n‰‹ìa„ú ú,‰çc˜áõ0WAEü²ÄsÐVÅ»Ëfn¢Ï|î\ªGŸáEc ãív„­tÉ›ç ŸµÎÆÍáôµ,9?Ïcek9rŸ™UÐ:#d8”¾Í ³›i_†Æ ¶£à9Öy\,6ÉîrEüÃ#õ¼¡ëÔ`E^„·Z QÚ]ƒa×±ëL¹ôÞ²óûžã˜`%Ï«³   té3Æù,Iê^¦VýOҟ žÏ”PR);ÞP-:FnG`!yð]@áùžºÚ˜Qô3`!MĤ:W`âBùljØù ø}Tç]ìW‹CãVSw(é$ýV„ê|Ê)E-4ëõ|çk˜ hM>#ßì „®¡:gÇöÅýæ8BTgï\Õ4T§r@)éá0@؇ߖ„^wêTÂizIï©SRÔ.7ä‰\Àd)´(C·µ¸|v¹åúExOç¦ y5œ¸ú»c“9Օwë0u‚”ìª^‹Rä'Г9š=²Ç“$GëêÉÐelʜ®„¾i¤>O±Ôgç<ô¥â¯ôëCQ:)e»kŸ,L ü,#a§\$½ìsQ¹ô„¾ÄTÚðÙhˆ÷¦%˜=;.˜H†Ó.±cᙢaL2¢>€0dÓ?íw¨óùmÒ\?ùBR¨+ª,PP§gç5J‚&Â@©b]ÅÆÔD3q9š€é3º–c'B ßÂÈ<Î „uf(û>f|žH·ùüçtVHðO®ZÓé\C—úǑ™¹ó}|¢Åvš–΀»±P㔇›úyÔ§õ`}é ½žô‘å%FÏKç ÅØYƒã—ʬêʇîkó,]¶jMäÆ5QO} +…)<ƒ~€h½ï—¨2Úuҋ*B`KÉg'žIԟ!-È㫝GƒñÙÕ%&–S;¤“†Ñ߁8=rC†­T­•3æôÀáú79:[x®¸U +ÍT_ ì>§öªL9mŽÎ'6“N²~6†tnck?¾~@\£1àíÊg;³KÃ{¾§9 ܏·;ð™z²ë-æ˜)›Å2:“,ÿ_G*ŸµnÔݘHéÎJѹ[EÙ/×ৠÕÃ÷@Š6l©Y1ï óQۙ@JÙÒTöˆl•lè|“*Ígëa*<ÝBç„:…ÎH|4Aw[»î¢Ïtš­eÔnU s`¬N|ÓýР`ðbÎ :ëØ:W±¢‰ÏÚ0^ñÙL!ÿœiÎÿŒ1è<¦­È¸%Á¯ûºâ3¢@g~Ïò™½®1ßA÷̏ÊÖþáÿ$e8ͦ¸®$±`RºÍg&45Ÿí¥–ðNWhŸ3Ït¼@I Ð Y×ù¬¤,az=K@ÉX´í sžS3T›«“@…;Utï”Ä[:òÙää³PÙj¨^æyùÌ!‘TÏÕÎÐ ¶ºLˆˆß 0Ä2û…ŒM×,`açd˜uÎÓ-F^ٚÏtJlÒáh 3žrÎoO`«Æãœ÷>îÕç(Î9×µ*H™k£uÂ.Ì#8ç]Ya_C7*IÖ£ ¥‰ÏÖ{ ¥WÄì+\2ˆ'Œ¦wyyÎ×)ҊÏÖé®å‚óºØ†2&ØӐOi}‡UàgSÐWqF.Ø""CÜÏçšsQ¯ßú%\ÒT°ç|Q>ƒ(ÜêÑéŠ;ŒÄ,A2K6Ð=ÛU2?Œ˜Î†‹‘™òÙ ªWîŸ((ù,Ît\)Yy6yaÕ]@|¦™ë|ƹK¦P‚ zæ5¥øl4v̙NÉÁ"ðu£»ÚyìÚ.Ÿ9–g>KÞCO–òŽ´œ7¥Cv9Á÷+ >ÃD‡=­ÊgË®i‰‡:ÉavU¤9}N 9ÙóUÄÊ‚ç×HÄ/ç}ʋ—3ØSs(äÓé`"?kòrÆÏ`Þ XX -ŸÉË×sSq Ì†wÁâþú;«*"i ­†8AÊÌü†ËY¦i·œr t Fwn9{òÏ +„`<ðI½)gŠÐ%GÜ无|åÔ*FƒÂG)Õ o–äÅÁ¼rÒ‚<õlåxeNŠŽˆÏ§œA¸fðõX–‚•ä±e–±ª”s«ÜÏ¿2G9Õê¼ùw|¦ ljð9Ü~rÆÏ܅kç]¥sžøì q¤693!%C—Žà~RØV¢e­=#š§Øä Móîäd9u˜‘³³ÈòÙé!ÝÀ8"TÙº%€ŠÕ#ı›ÃÖäå<±œ'k _áNð|Ðì¼ú3vS"¼qÁ$}V’2ŸÒgñãÞ~OOœiÔã†}uG—Äiç3Ç·¤?”~+÷ + %çbžZz;’œËxñ…ýFŠ“ñ³P¡ð€/ÚLe`9OFésÔñ¦ÌþžX‹œkWŒûOÜDz–ö-äLÆê3äŒÆJd \%O>q »æè/öÿüM61žÉ?òñ’hгÍKՍòˆÏ˜H¾â3Or€‹-¦,ù“Á”¶†ê'NMšÅg~6:/ UÆú8¡qcCßÃÿ|œéà˜fŸèñqæ1 gNЧxmh dâ39J>A§l_8ê(ÊsÏF9{">#>4c.I‚’Œ‚%(cQ>s_¦[0—EâŠBäGCT2ÎvÉ^âæní<;›iœ œÝ‘ãuæ.F[ߢm=g„ÿ-9D#{ç@z'sÍ]8‹l´YÊøP8z¯É'¨÷àÙÑtՙ7*ŒÂËÔÿå*ç?ÞÍrš?vê+ Ûµë1NSøeÌ-ŒüFñ‘0S +’€–aâ󘫹4ä¾A‹¶ÖÙR’ÙS,<@TÈg+'×́E_F(XÇñI̽+½ú¢‰{¥Ô àD£BÂoBRôŽ¶Ù€]°ìóÏà¦Ç¾ޟé8 f´ÜÀŠcМ ïr½ÛnÊ|–ÒˆPµ›qcÚ͊”²Òå{PU½r½Àï&CxMsŒ¥¢ÿ´›„”X?KÒù/ÀÍYÀb%_7^Ú5y¹Y§¡$¢4!“xÕÑy¾(õìÒÑSËeß&Põc—-›–=ÖÖÒ1½7ÑßK3¶é®dSא\#›§×^zY\C(™—JļþU~lúä­ß3ŸÏ‘Ŭ»Þ/"â¼@ëí¨_á0±±N'sÚàP¨±á:zt ó‹ Ùõؘš¥Ðʗ?ž¹(VUmXú×8™_aj¿†]›€YQ֔ÚՔ̛ù)œ¯¹KQ¸šqÇ+¾×ÐÅ6ûäû5õ 4áø^bX 寮֮1Z民ùp]£!¾Èoš\£ >¤kl2TOfÜì¬G™úŒêÉ¥…¹#‚dkäºëP¡ô¹Vã¡ Ok,òš [/,(*çýYcU¢@Wœ)mÖøRÓa$ů9T ¢„S™T$è,i©°XcBÏòÇٍô¢ê|f€RÃ~l9«9+“ƐTAUdÒØbÎo´Ë;OND£Ä¡ÞFÄú„c¾`-¿QŒ,yièåID³µXŸd$h°B)[É<·A&'qE +ñìÅH(°<²‚4bSDjü7dý¨ñ'ǦùF gŒL’2IŒ*tøÛ4fÓfø#ð۟fM/wàø2¢Ö§ùë{ÔÕ¤GüeO£ŠžÒò4 œë; µ)ê4¬dNó‚3?NÓ왲6†4À™ø- +ä:•ãKZkšZ¤NÓ4Q¼LҙÆ}¢YíÞ¢‰”.D3,gWD®ºŸ¹qÞlh26màaR#›¼#µˆM©CÙ³ ¹[4扊ô¥ª&h"ҁf¤Øãä¨#³ S­˜Y€Ɖ›¥h­ÌÀšfD†üLw&ƒ•ñ0ùØóê3ê²~X! +ñÓЗQX·ÊÐJ ûš!/¬¿gRz-\½ê-ޔU&$/šŒ +Òp†4™÷;!À<3rƒ<Ú?b™ÿôMùçO!ÍhëÏÁzµÌê3*;#Ú[%&εû‡Á@ƓÏñ¨ø(,@DžDms2 ÝŽ6gÒÂm9Ó}¾$†Ìí2ð2cª3|D´HHԄyzW?8 kl6¢jæ¹Í ÇDàZ›á“V£mcnÙ{—€XŒì‚–)̂ã—ËåÌR3oÔÈF&xšù 2〤ÌÒÌ/(vñE²’J£™wb†f¦åÔÐP÷™AIYù{¨3ƒqÿC¿› ÅÒKÚ"A±rH—ÞðæÏíéÞÍÎi „‘˜ù,2lÓÛͽW®Yf4~&j”!¼ùhÿ´Éfð8ÇQóŒAê=œÐ¾uҗ¬Ò—ÁNÜö2òd,Ù1åeÖ¿2¬H+•AÐàÜe {]& šÚv9ó\Æü/¤«D\5ñ@¹LËXù $†f ³Œ;ˆÙkeF#슱,ãÙPoÐù± ax@€Ü‡eÊ)AŒôx‡ ð+ãbHOtj »2ïG°x½·2„ko%ge¤Z-àLË©—Õ±­h2HJ ¢Hš^YÚ®•A¥fÒSÆC—›ŒÈ†Páÿ!“Io]nqy×VÀr˜”á—â@è(£Ø°Bƒ²ªÁ†FXÆÁêåœÜU­¥eï¡ ‹rbŒ·ˆ¹ O$c%àŸ‘ÿYµ]БSÈÃJ'  +_2¨.(>ÒRª%cf ±¤J¦Ðç˜ÃLúl¶ô<|òø<SʽŽ‘Âÿ¹yÏTϑL®˜š9é# 8™£á>£ÜRK¹ç`LêóüjÈü'd!ÃÄâü±&düY e.ó s,šÁÍ}¾ˆ.6ã#ýÙzµ…Ýak­OÞÇ8·Z«õ(ŒÖ›E_ÒUŸ |Öc>ReÇ)ø9ÃÂxŒû³Ð(ä«|G +üãW Vœv Ý8EƘýÖ16œ`Fn|­pKÇ0Í­Ë9f„…Ú¶¢¡†¼dVp™”ZÁ»ENc¤05 +NšEcš±°:RN¹q_Px»åY{Jg3æÝa‘½3Yo&¾rvÄTv”©áZªfþŠ±ÛùYɗcãéÐÅROôç”÷PÆâ§9 ³Ié/^jÒ«ö•b‘d£±™¾ń\Å(ð# E'š5|@L2a\‘~ô[#E1)²äm­ÁMÄÔ¤-|;Åcåà¹E3xø6av@EW ÃxéXÆ3zu”øÃ(÷—C˜áñ*`Ʀ5se1Ñ ã§xÑ 0RØ£ Øpº{«ÜóÞ0dH,R®/y•mzåÐÍ#^Ã<*Íi}ÄÈDg%¢Á¬ Ãx7¥„ÃXÙæÐB†a”µF­e]ø¥©/ Š¯RŸÛk†ÊBV·-Œ™³0¸B(ê +s'ºTaF@Gwr/‡¡æ ­¾ûjkuAqæß^̆ãAZ-î³pÌ_ÙÒ†ZF.HEøQéŽÿ²½õ{±œv¬`T&0¤‚õ‡+L~?{!Éq£ì¬á·D¦©½•å³QÁX®ªó¥L× >w(…Ý€xij^UùÀ(5@j†ô(F¸5Õï!ï¡sÂY{p®20£ÃéæûsW”€!Æ&;…ŠÀ´£]aŸ¼";énP`F«˜8bBY}‘ŸdM_ðð@—э1þ䙥+ÞèXF¶nmÅRÀÿä‚vìâÞxáëL@ý=—I¤ +Žõ4/>ÙçÅOÍDîþÞÅ÷£¸ !°·‘ƒì°o€,4v¾×‹P_»õr ?"% ­S„?²ÄK°_€ír$Ì¥ÃßZ¼%ÝýJ²–ÅyS4»p‡¢§—Oq ló"Z²2/א\^:.På¥6ï#SƒÄU'/Ê/^Úµç-~³ÈKxi÷/W‘’ÆËKLk/2¦¥Å²ÞMO¼ miéö ÙîÕɗŒ·(y ³À#„æ]„ï±TŽPzw)3ñäÒ¤îBˆÔzç.gˆ< (î"dL›HáíRifÒ\Î.®Vâe—¿ŒÔ‚1(­»0e‰‡]æ +‚ìÜ×åޒË÷^3øÙºøˆçe±×Ï÷h¼ªä ¬ºDßÔå +Wþ)0©£èÎdJ(ÏQœéð† ÆÒízûÏÅKÃ\Äô¨ž ™Ñ¼ýŽê*˜ö§‘2ÓèºÕ\ú> ™KÍ*»ƒp›× æg®—Ëó ”Š[. 6R]¹³}CC[2ó)Ž”r\LÖÓ.äÁ§& ±Šˆ\mñp>ÉCFªl¾qIΠðâBd9=&"<"}ema fñՇ‹ÿ  4\ü—° ?¸ø1#,rd¾y° ÅI7~³ ©Ø`y,ÃR.Ö̔^k|v€eƌ – Î#à—3 ¢bú¿âܛ€çk<ö+—&ñ2¿ÒÆ ƒÜ?‰v¥švu]«á(ÌÊF[m¾Â—ÊŠ¯¸=|¯¥Åckêd÷ÉTq8&ãl{…˜Ä ñ|§õJ¿.Ȥ¬ô +äó/Òvå9Ë0U¾å‹ÿ”¾Ù•º£œ{•sÊ­„w³ûÐíP¥¶Ò>a豉H­c3e“u—ša£•£©6´Ò-­ÿí\ÄϊŒg|—½â\YáO‰L Ï재ôr¬.²â3V$ÆÙOuòšTûX™%‚L„Ò$.V~ÀÄJ»?9¬Tœêˆ%‚ÏZñFó,š xLDñýs•7œ G!p‰-q¹ÖE=1ÿ]kö蚮ý£cM‚`ÕµÊó—³Ò*êeȳÊÑT—UZÞΟÔZ&M9Íl;\‚´hÙÔ"MUÈ* BÜFDU÷v©…§ÊïNš*2Ù-§À:W¶TYÝB#©RóÃ=FqR1§=ôÎ0)¿”â‚6 ~¬h}J/@O&‡æúyÌþҕ±Î $—’ÝT\3**“)Ú²’$+ÙNqKºÓìòJ*í‘Ê=‹ ©ôýÕGE¸ÈǬ´ Ä#?×ɜէü3*c6M˹¨|«¢â4\½0ÜDåÓP~¸8B£4"} ã?5TZÜa‰ ­I8 ¶êÁý¯±Ø¬®§+î>…¶ƒðÁƒ^Øáئx°õg{ñ”鮼S”n¹¾Ï"ÅRÈ.¬Sü•|–Nñš~ +¢Ä' %Š³rÊÏ(´Ӊêâ8å÷ §DfŽö’ãB—&øü½H`_z +©Ë3ÜP¹W/Øf +Ñ¡t-SžzŠÜ9ØZ§°5Č×X@1åۋ5ÃQcH +¦`‡ƒ}uÁ@üènó’¡UO$¾TƒJEùd/Õ8’]¹‹qK,[¥œ ȸ[`Æä§óؖRN8¤#”F)þw  ГŒw±J·  2eyJR°¡  +7)µ‰`&åÁ˜¸.)ªéª’’ºÜ²IÊhMg 3FªßhÑÑä"eÈ\­¥ÉI÷ÅMG@|Hyã·q¸€‰¥­…”\sâ e§q¯|‚¦u™æÙª£xïD~ 0<ÓÍQš^|æ}žÙÓ/!=¨•â(OeÖûF‹hIL`Òætrt:}ö͜Ì0 +toÇ¥QŒ›.÷Eyä$-¸tQÈ/"2@[”Ï×-‹2·LGÒº¢øú„¼*JM>Àíz昢ôý¾†º¥ØŒ¢üCܕy_ùæ‰"KFMüÒßy֘%Š¥Å]“,×'0’Ê­à™…¤È(ã’#ŠÛ€²±4 )O`•XDÁüÍ_ŸUmˆb¬î¡ˆÞÃ(}¾¢åü×2õô  +$g¢ %X/ªƒОëDRº˜‡Ã¤1)úé#;ÎЊNÀ–}!ˆÕ ç·E(Ôµ„ZužHæžô3ÂU0²„JàÃ|㫆¦vi«X¾™G15‡¿ÔóØ!œÌ4‡BZ–l«@hEϏǓéäƒØã]²³F ².€ ) Å²}-à… +ï4ëèûëÎ?Ã6JÐÈ_¤žì|øÞXõK„Xu·”:¡aPÛôôNœvôÁŠAÒ8Ò=³ÞM•×—žÔÝkRc\äAZüÅdAy£ê…²p +K½R(Tue¨ÐCHž×¹)ﻯf¤«šÉ·£úÄÊF8©¼¥ËbÆ$Ëϱú²ã?ä'ß@2NéÝœˆ‚M꣦"s0_éM#£´­Pj^n.Üxn:\/#HÍå"©ÕK!„è…<ŠHi`bÔ·Ú<3”n¢øCž(Òþ[¡ß&¾HïçBMõ‚Ôb((ý7ÉÉé*熬“i¨Ÿ¢ˆršÉŒ/o¨(ÿ}Gi¶«(ß\‚ñ·ñî\Êd^ $tÀ‚¢ø5æ|2⣗‹‡Pæ5S˜”ÈÖw AFK^þøfpI?Üf-ž> +-ôØ"uà$¿Ú:ÅÐМ¨9ׁ9Á_%ÒœYw"( nä< G%f~Œ~ÃÑ5sš»mÒƉn¸„€\pŠ÷ªf”C˜ýõ[£Ð(0sÆlÙ:lë¬&Ð:§Ñ·œÎ<Šâóîm@ŠÒLü˜ *„SŒDº+Âl‘(‚L““Fr]h£h0* +ü#7V ¨>[ ùD"“mÍÊiÕÚj 0Îa79 +ryH(¾ÀÆ6)·…Ê€`#AGi +˜ÐBíÍ£~2«(â +™{}B÷Û"ÂQZâ÷k¡â0nQ‘ר çë(ã„pïP=ñzGˆO^䨎bÑk§^”/ƒYzôÌÕwmõªwRj”s°²¦dþNÛc Šz~Ú×™X„šÊ”:ª°és)-‰ Á_G)V躟)’ù?J)m]if‘u¶¥ËþºudÛêS«`"µþ¤dçxx‘¾õùñgŒò…|ú£R +Ĕ.ÌG…jç:4 AȟO·“ô’74ºsIhD©mÐ:€n•RVÍÿ¾:ŒD'2eºl@OzH§°mÀV«Þ*E,…ó…@ú‘DFˆYÊ èá;$]t®D/ÿÁ#—¢SPÌ¥Xä¥{X[M3º”ÖÄt¨ª$ÙY]ŠmÉ¡ï -OϙG–< Cr^Š¦¢ûûðåSõ´ˆ6Î +/µ¸T!åù/see«Î»qÒÂæº+/ò#!dPAˆÀþé¸mrÇ” ÞŠ‘Ù~x*³<Àµ*WÞÌ» "ejX€Îg2‡!×0e"JÌãƒGfŸI8ÌXH$XÎ  SÖNæX³31ArR’ 50eDvÙ}æːNbY踰þ݈ù!¶ñ([SnDùô|]ŠD7JT þ²92r)’ðà¢]‰F¡L.ô€ª°“)VI™¡áH2e䞙`ÄÍ$>D¾y›wQàœÜí„ÍЖ+ Lh!¿ûjËۈ%¬1T(â~€3†r*gŠf l¦Øç9çS¹·Óš¨œŽðiO%©SCš%k¸‰Ò@¬§*虂D8‰Ni¯™Ò¾6ʄ4„'Rz†ûÊö÷(´©§ªÁÃüNzwlˆ·ÖýqGS ÝíZ¶Ò0ÃB|.á‘©¦ˆYüñ_îgD‹t­Þ^Êh—h¡ì¢¸ fÄ$6EÔlxÑyÁΩ9v%b]•‚·Oã¯ÉKÌ:½µÚÎ_ÎVö.˜a?Hø¸)|°²[>s¡›rÖö&f@²è9±RŸ¬ }Qf¥¬ +×pÊýNžŸÝyË×/ét¢ÿ‡†„çڀ5kGjÈ1”2|f:hïdû Œf“„š\›§ìƒåáA?ìÀ$•5LEŸãp{|î%|ÕY2E¦Ø´Åà슿2°UÆÊ5ÚF¡ý·^[š‹c*9²m 2j@ØÝ0Òÿ؛ì,SÆbaÖ!8é]°ùmÝ؄ošŒ–S…ÛçÙ²Í2æÒÙã²Vú‹"X̚j)¾¯ Âµ¦mÕ J^*–9ޅ@w¤Æ§øc™»uÀôWÓxÛN9!}âö7æ°i‡MðØp‚¦RžWó%x.À›Å‘œ¸ïMô%¾|)†7ɽu}4']¢øé~hÝ ØYƓ?énu+\;‘ºóâ¨ÊßùÃÒÒõRþË]@‡¨!ÛâU!¼zO™U°.JùÃrVý>EHéöÁur„4˜˜-VÛ§œöÒ¶àhÝQ$涜CŠ¥­A¬V80†©r§‰yvW]šônÐOiƒ¶$>iæß>ÑY1ìe‡uÙb‰@å|¸y’Ÿ0ò*3lwÇË`ƒ$eÝl’„ÐâN1±Æ9F!ŽRdõ%‘Ú_E¿_Û|´j|¸':%ƒ€fõ{‘˜Âåa +kf¡¢²Ï¤íEÀ»hò°!ŒGxõ49X|ߏEiG6±øqbÒ[`멓Ÿ¨~Q'#þG¼~^PG `d(WE'"T¤,-ÖçŸgÙE΁þà·3=-dzmSÑѝ¢P yv&¹ãľèõ26BãÚ%á.h±„®‹•úR8]k n¼Æ”Âm=É2CSð>¬‡Ü#ˆ“–¶–¸\mD[›jP‹BæF¾±:í¥õ-ÊøŽê´ÖâÕñŸðp^®êÏÌs5OŸa¢bˆEQ/JJ¥ÙoÖàÞ>M ±–_/6ñR»f +¢ÞŠð9xâ,ʃ½Óãië1‚‹&é¦ú1ž«KãB ãüÒÌa¶_ trV—R5yG÷ç”Ø< !ŒÂgoéŠõϤþ¸«Ä/Näœ@I™0×L®ÙÅß« €¹þ\á<9'¼ßh°ËÁ6}}Š‹-^¿?–Ú$²¶8~·aÐVrŸ0m¥½ ¦Ðל(õö{:Áîë™ û2Þ)¾¼ÅÈnÊD]ÓÛç¼H÷^5 °$ xé¿Ë$ž¹×ìˆ= :™¤r|Øÿ‡JùŽ”ÝŽúÀFª‡¼Ëx–±?O T U ñœRâÆ&JÙ-´Åˆã(‘€²il|*…ìrqÿ-P7À†þýYQ.M'³DFü”Ïå?¾,à끫›L²"-sÙG Öt N MDNi E­Db`=«bºèo׫öÙ?¾âwXêKóɂg83ôQ¤hNÚ1TÉ]ÿŽ]0Eì²½V¨˜ÏM¬ÏnN Åð§+]Þ¬@a¶¡œÒ"¨&‡-oßÙ²$,ÊàÞ {åwœû\[Em°µˆ«´îù‘¼Ùh¿2|rAøB’ýÙl“«À]”ÿ‚PŠ£N¯äâ 0}¤&DÈ"kaº4'ÅílV„¶—PNQªJŸ‰ÍÐéö>Ò7]<ÕÔª5¢DŸŽƒ‘•DîŠØá1 i²„ +[}ÆcG…ø ¤pè!îBÇ5lU‹ß +AÈÿàHê:s†ÿ< Cãðp½ó¥7„½ŸÍϪÇ2ŒDÛ!F¾U ë)1›ãÕfܝ縔Ž„¹2?X§–±ÉR>Ï/9Ðö K~¯ky½{¶œ¤ ÀÀåÑ%¾´]_Pê£.·g…ߏõ¤ÀÖf9Æ,©óą=tZbÁ1fQP(&êã%)&y¾DG&G2IùÀÞiÖH/üAt.XËñ† AV썆AÖëñÖUœÈ¼¾ŸÌð/Žy«G +eÿ®€6pâ9$µŸœ„‚µñÀÇ]¬í¼g^òi½,ò51‡Ú–Ø+X·+C˜Žcù×>̕Z‡ð Iøõ]´Ó¦™'I,¡#8sd¯ŠÞžt(eMGÒq`{ bYKê+rÎ +Ö#à=¬ÀL^EUÎ3ÑGÅP"š%$¾¬@œDþbÌ>M¨ÆT÷²kñÁ¾»Õ~½¡Âû2ûÀmf3ÿRzÖÛ¥¨Eü)Þ¼wVpó$ˆÚ‰Å}ÀЕ&pVtãÆ[>WRüÊø3î•ËX°,| F…éÀ*gå) +ØÓPÛ䨢¡8L,>›k¶t/ƒiêĈ¯¿Š}BèÙØÜ&VT8.A¬.¸ß©H-]lÆL­¬[銢;Ëú¾5uY´r·“ÃZžá}aŒa‡Fd ߖV4©ªÆ¨&ßá' ¾ž¨1K+9ÃÂ@và{K“Œ—Iõõ°¨‘ƒ–Ûp¿FéØÛx ÊЗI{S^ªÏ +æ›K¤f5±"\¿»@ÜdšH­$&sœ$€P+â|Û=.ÛrU¹€ޔ×1ù¡XWûÐ 4ÄbA9é[ÉI­´vGšìHØN»˜¤Z%¢Lƒih¢Zi¥y#3äõ +$$8²Ip¯uëvœ+iKâA«;íZ‡ÃX+°“K ÚüEŒ€ÑݒRWÒóx1"5Q„Ÿiȱ8_Ë¥ãÊkªù1~?¤ FJ¶íêˆ6ת?¤Vvû*6í |Í'WìGeR2Û²i¸gfd(O×ZÊ€øbâÉullð jä©çg V[æ!­†×ϕ‚Š.?OçMM37놠u"£î$ـ]‚aT2` êKƒƒK +  ×DDç; Aœƒ‡âPÒÁ£”ZJXyûRAöÑ@[ ®œ\Òõzµyz²,‚—l<¨`r'mX'&-v ¶ÌëÊùõˆ‰ÛºòI,¯?¾§t¶®(ÌõŇ¿ãù…QZt]É¢ÚȑŒxýáéו¡¨_Ø7§BÓx†l]‰¿±f°¢qÈÉØc,αÃlîŠ5ÐfÕÜÆæ¦è0;3R©Çu(+œiVࢪ™äÐièëËÿZ2jÔRïÊ NѼ"D?ÚUž?‡¬fêwe.ȌrñZM„W’·›Ø·J™˜ÙÊd­¨^', ²èÏÈÁºW ¢`ãå¤HÏŸ™ë̛rû”Ìù ‡¦²h |"¦&™2íJÉ%¡a da`cfj63›Œ¬LNpŒ sV†9Í7s¸Ù<‚v@ŒÙDfu µÏæ`F)³šƒƒ;ªnRTä¦òœ6üSû]ƒ4éN¸Ò,33«Ù °CÀÝð­:÷hü„h°Š„¶îåN˜&”D¶mBK¦ÿy{ÉEnòsxUÕ ÉðV¬¥ˆ3Ex"¿´§˜êìêìs< g9úŒ)<8Ó79Tv¹ªŽŒ¨l")—}ÊÞY•.Sú +çIƒ† «F(Æ®xw75é»Ë#™XLŽb§ÿ-$*ä<—‡Œ•Øk4/5=Uÿ"!ò’Ëhv\öø½‡½Zp!ÿ^þ~ê¹öˆò%—Ë+ýÛ÷A‚4ÐRßzß·=F_ÄÿîVUù©©:Ö°¡*+43#³1f­8ñýS8ôz@l/gR2¡“˜ˆ´¢NŽ~sM)"¢„ÍŒÍC4ԙQ"0´10ùzˆyú1wƺá3±+ÚÝá º»V“w#)Ÿ7¨„½¾‘óP`’p<Œ‡Âr} Áv.(”Tpœ˜|@Kã HA`2†BÔ +ˆÈx\lí‘ÕQHŠ¦ØÝØ5‹ÞÐ'Þ,®ùÊ+ç8·ål$†øˆÓ²çQåüŽjl=.d|y9É_Ÿ°ÄS2d¤“AŒÝ)8NþÉ»tð5U¤.pè˜`câ¤R:‘\Ò5æ\™P!-J2R¥ý?™j.ñŸ2ˆO~rNÝyˆôU:­á¯ï÷«K§g4 œr9¯¬³q#É)cx(§qsÆ)‹œW‡[:­ÅWNë ç ës-®Ú: ,“¦NØftú&ücªž“׉4ÀÃN°p‡Óa§UèéÁX‰â],w@Z̑ügîG¢›d8´Ÿ[°·Ó‚«ðµ0‹ëvj©ÓÉ $»ª„-…ãîñ ”,úÉä1q £€~}û+JOÒº/¬'ÉüÑÓÎÓ?S°ý+0Æ0¨ôð<ò/EŠlkC ±2e$…ÓÞÿ¼”4’€·„[z¢Ñ·GéÓäoyµ¨4B¦Å·þ©HO5àþ £Öá…aß4¨½¾O¬ +;v;£à‹²ãKÊ*yk̦ÿÜvD7OBùCçñý?•¦z§”¸‹Î3 „JxßkÆK82ÃÞ¤sݪMÎ΋Ò/dnÊß#M«ÿ́4è£éýn‰¨Oð=±•$?#4€ŽÑl´ù6!¼ï ÇÒká…¨‹¹jÂÇ O¹"§“^Û4ŽÜJDËéJjh‹•pj Á´Îõ8¸ÊVTD´d½‘Ícæ ª I‹Q°!{CÔ°Ƙ,dGV<1Pœè¡« h6«C ÚkNŏ*[þß--)ì¼MOèÙÝ.³˜é“ÎdwWJBˆ,ÞuBYmvÂˆí¸™d4û<‚©®÷ž—G¿=ëXëO1iâ×W +¤Öï•îNÀýIàR×RQUf#9„Øj–¤Î*PÕ1ýñÀiÆ[©æÎuŽ=z·JÚÖejÞ 5ù4ÉnÒ¤¿JˤíÑþc ï4[?hX7–›>Yñ+Äþˆ¨jwŸâÌÓªìÊ@¼£dc‚ƒâH'9…i´ò ý1ú¨›àZPÛ‡VVÄE¶ILi«¤¤ßÐ;TÖté©Æ}¬ùû5#45Jd±¶‰t”ƒõ /)cö@š4RÞݒBÐÙ«‹ûç³wØv=#—¥%,äààÁÀ¬Ó}ù݄ÈþÜpzJÃxåÀ:.Ö }®\˜cz:^—Y_"wJ՟«q¨S-„uíu %/(8—:ÕV‰°uM‘³.ºÀæbw4þîúGÌZ¤Cô¥ +neâ7¡j=R…”ý]Cu“ÍŃô\‚:{¾n¦38o ¨ àuyvv‚ çѪ,ÊÁmlùö6U2GYjŸ/ÐÈIÚ!Þqù¹d²*YÔH÷e'¢è{‚±ê™ùÝÖÇéq¿çÑHì“T߃[Eýøfj˜=ÆdÉ¢/nE߯Ë.y¾Ÿj6ÜÏY¾š/©ã¶L¾ï]èDdz^ÃÞ·6 +ÌyMÀ¾Ÿ‹6J£Aê7«Vq@Øs!Ìm-¥¾/¨Ñahú<™u2r“­ïÓløbÂaù½äÒ †zÒ÷ †¨6O_ÀºÇ1OÙø\XlàåŸ5±ø¨ïe•Ó8- ~àæÕ/c†fÉŠüð†Š^C3ªA,ÙMÓ}š„Mú‰€¤åe}»”Ƽ@/KŠÁ¹¬Öè·»DTE +M +Fí +bµx¸”öÂbf¹´q¾¾žÛk02Šš^|3¯PZƒçÓD P=kB*"„’Àcè0&’io·(c˜# ¦œ­ ©%_‹j¸ò°òÚl)H#Ö½H\ÓÎÄåa•›*¥è‰‰uý`1BÇc¯ó¯GAròéÀKÑÜÒÛ+…âw[#T J¯¿,Þûš•9¡AÇ(N ݟ ü08a÷ÀÝU”o³Ù€nÀñeŒ+ÁP„û|&£6‹/™î ßjŠ¾P}²æSLºÛ×£[—0ãŠ{ Ô1[â›Æ3zI*H[x;؂¨Û +8™ÙáÎüo­&sdÖ%P ص¶DÏ|ÖVªë’Ôy¾waSìâ¨ó`ræo2 áÔès<—D þÍ8`¼ônË3Vì#§ «Ú½xk+ynª±ñeΧÑy éá²îæv$çpo~FM$MßÁ†£ŸöU%–Ò—ñEà&$µ†ËÈë©xÍEáÝ™ß &Ô̘ê”ÆP®8ÔdaŒâÒp,Ûvòð©P£Û„Ϲ.dR ³šFÓÊÏtÃè#ùçR°›EÃmhIá¢P4S]/,¾cb¡|W­WýöÎ˲Ը^ „a*T@ TÈ«[]#+†T‡âIÐ$-S +; I»vU;<  ܝ.j‹Ø2JìÏDw^ÐBa‚/¹2PNBx%”¶‰ø>7¬„²ƒƒJ$¬ö†ÐC¢Ïˆ„À(¡WÈÄj_‰é¯KºØ#1â§3´t ;Ñä¦YÌ/À;ULޒÙó!„SH’šÉ‹ªÈO\»š( K;»câ<¸}+:8XÞ?8üë’ã‚Ÿ‡3ÐùåÌJ>*7ùâ\­ÞxyuK<8ôíoçΏ"wø<æ,t.°¡;QU]àóMT”ÔHG',B÷€CˆÝ  QÚA¾ˆ)N®ãÈ͞¼ã· _5PY ÿÞmT“ªÛ€Swž”F±Ó‡Ž¶³m:T/… ~O9·àŒ@ӉI§ß6Βf8D”ÎÒs:ìx$Z.‰ÔTŸl5Kp`Á‡Ò^–¼ t< œή2"^D<Ø#h×èU*åÂO—N§› +ÎÒ¶j¹£à8˜Ø† efà D·­ÇR®#©‰ ÍN¥ñ媸[uÀ ¨âVPÍ6[TMYüØLOŸÄƲÐDŽ?âw…ðKʺNcmSÀ±”~óæH–ýÝò`§Éîeu»œåDyr}Ž;zø _•¹9 3F˜;õ¦ýó¿ŠÌ·[<µèÕn`NlO/4`'µ3BA¢˜øÝ—2eƏ–aò¾¶ƒØK$SU…z]ÝvxmlºÅ‹¾‚X.ß´YÄ՞B¾ÎhbŽIÚsNz·3QÍȖ?$™-E¢É5*Y~õ½ ¤Ê «¼G…3Úvb ª"çÑJâHd2–±fŠ0jp¨ÿËΙ5†rªÕ@ƒÿ“BNÖcUûè~à(dds•Œ8Ó!;âGˆɼp&gí'‹LÀ25ç‚só)¦K$$f/5ÏRˆ);´¬Ax®ŸŸÈ¿³ì0±J¼†¹â`…é¦Lê‘k¡À¬š¡’m÷¤0Þ[ +0%šI©JŠ²¥C1TÝx}9¦w ÞöÒøçu÷*ÌT^ªD¶¯ÃK=ÆðîÝåVªÛHŽ‘%{;ÿ“µÙ{´óø¥·ÜkÏˋ=¦-éþùÁ–nŽå/–?Ãhh)^£ÓÎr dÜÒ̲]ÁÊE²”ãTöþL”Ȩðö•úíx%çéÊ*Èå¤ÜBoß;Øà¡ª¢–¿üõ0Y K³+÷ðßÿr•xýwرÊP6U ÍèùÙ$5]2•SR¿þ"5ù¦<1埕 i)1¼Ç)å£A’Ò]—•½É&i*¥¦|šQâ3å*P”K x¶"Êxat†òªÕßƓ•PÆ촀z)(×Pi +(=… ð“EÓÿ¸Ýè|¢Î69rk“&ÞÞ'½|’êlàÊQÄxbL`““4¶“š$›Èü‹edQ¡ñSÑTG … +1Ÿ#í6H÷ìµì%yG†luÌ5‹† ‡àˆYih5ó§É«BɅ$ÆJ”툺)`I±¨ö§<§3CNÀ?øù"ۑdô'–#9ÃÎ. ’6²_%¯öþíÈÝø‘ udöG!eù¿ endstream endobj 126 0 obj <>stream +¦YGb´Î82b`·‘Çœ÷N#Õ)ciK8#ßPzvÄN]hJ2F—ËDâ©É¤Æ<‰Ü5³"Òãˆ@úåø½‰ ó죍CJÝ:vë˜Ìª¡à=z_Cn¨Kæ`HÀ.)“®…4lk–BZ|,‡4¹žq½Í-rÍ åìºP¶:ú5b)µ#e©j•ñÒ'Ÿ{Tg{?£²« C_—Ñ?{Í7ãQˆµÚ µ1ܗ÷ˆÓ†íÙã­„oN/ŠêZÅ>h×3B4$6Aés¥‚ÇË°F8yÇÎtlܱ\ =¡«-}å]óäRRƐY®`”d“„Õ«aÁœÈ(Õ|Æq}ýŒl\Òu#‰5ÃR‡Ñ±hÅmˆ÷ƒIÊÌÖóšØ§S—òù@®!_¸1>%Ÿ0HsÙÂ]Ùkè0«ÈPŸoégÛÁ$-´?^™ihüzøýZá +1Ž›—ÂÔ÷Ì,õÁj*ÑáB­™µD܏lDˆ.³2õ}a!b:Áø-±]£ÄÀ&qꃳ?+½Ígz°&9ÉbH Ñãzò8½s6íµüÓ "´þjy"!Åý%ù[ú à¿d½§Î@hžáP»aÐ#±,5|pÖ}6Fj¦ºŠ5 ÎmÖ2™øÀˆ‰ÃA”ß/AzÐG‹aÄDm šô€þÅõϼTwâa—À¢¨,©/À8þý™üÇQ󥉓j÷SNþü½ çWÏ¡˜ ó½|KC‚;'$˜Ó|-Øh§wç =$*å{bD­óçKæ2ÐìeR?ä—€PÎwq½ù||JÊ\3´Ÿ;ц¡A +ÉÝë$g'lÈçÚUÈW(¾Êá5YòAK˜Žô<©á©nˆÖ^n»5Ž3™g.eáz?zF3G— ꀾ0þ«¡àÿ\$b“¼P—ÄÃiŠ”\Ì΍-L?®aÒ³‹p·$â1o7%+VÄáÔÕÔ| Ñué)ËôÂa¸¢§pmb™»sä¨ðpykÁ_6n ܌•Ùíâb5«ÝŠoi]@ž¡ƒ!ºd>ÐF'k +Ê2³@[]øþ&Ô"€»co¶2LJöäó˜¦vXË,@q©Pè];ýÚ{@o„÷0ýÃãƒæ—Ãí‰ï@4üÞÊÓdŒãd’Æcù@7 äDAxocù€gü8çt2ö•T&†ô7ò#0Í|¢@8$—Şšh¾òÁEH3Å¿kDï‘ÁÍÚö@ÅBØvãk´ZöÚêy;]–ß™0í•Í7(7˜àXúDüZ>8ã8zÄåÂ)¦GµvL¾"& òîJù §Ž–ÉI\t\­S)ˆÐ*[ƒ˜4Ácμÿ‘*“C[ƒóG>èÍ}à +L 1š¸øé7µ¾X¨ûòIœÏØôùµQf¶M³í¨ƒ9mÌ.4Ë…ŠLì†!µRWQâ’ +Žd<5¬ Bq{ðÈN·JO捕ȗ0©ý³Œ \&ÔsïhŽÆXI‡±!2Ž9‰S–ÃZë¹ò’ ¡ðÓ()Ð`>CÂDÜïÌ_6¾áÔ]ÝÊrA^ùl +£hªÞX'Ü<+Ë(ôŠð6Ï((æç\ZR3P{èCM,äðAçÀ3JÖ¿n!¯{¯åéV ™p–Ò*dÌb(pŸÎ²«r$®·’ÏփøÌ¢ôœ¾-ŽJ­Ú ,¢S—v?ªՒÛT »ÎvwÍ©XÛ³âáé]L<>±Gd Ê8À äÊX·5#Tië« å”r6l(§K2^z½#e &ùҗ@˙ÑÒ@R {À0SuÀ¤—5u@Ž…: ¶W¤2^ò¤Ùd˜Å;_3O ~ت +Q·€-»øm«z•Äðzì}g…ºHóÅ mÒz{D;„Ìb÷ÅMÕ>Œ˜E!ÛH…>ÎÐúè[øLƒ€P–P³¨: +ð ¢<ÄåЮ½§ƒ.†AÈe`U‘9 VPïkm~aø¸À KËZv´˜ŒåÁñx|@ Šc®rÓ³¤»‚qeW²F¸û>pÒ*xÊß42¬òjxì•êáµ,u!Â!ÿË5rŠ*®‚€©l%ë)± a™„B(G†HOî²ñº@šij‡i€5. +Kç❓ ùhÃÓÔάH]´荏ž%Mê¬=HRÂ<Ÿ(ê…Ã@#Ûüh[‘O¨áå…^U"ýˆ’s;P(÷ÆR˜0u#h|adiu#§íÌõ³rq»û¼¬ ”˜>J!”H&Ð9ìulà÷¼ûÀ‡<™ɘ±R–WË<Ð÷®_qýYM»x);¾]ٟ­QØg2«V²"¹Œ¤çö —‘ûŸ½ ­ïA·$Þ´dÃéÙéîØQ{•ÒXì¦"å Ñì®3×ÄÈVƒòˆÁÖ±T;ؘ@eŠ™‘sCåéé=h9‘Ó¸á]‚¸qhZÈRÎbå$¹Åä͸¾qv'þ‘d`ª®¥Ý¼àãˆÆ§Ÿ¥1ƒO؋d J»zÈ/’k©G›ÉPý\F0Ön,ÖeùG)B‰®›%ÈhðAP‚Aµ“mÚÍBSG¼-¨—àA*£é«MÃHëRf´T«ÉR“'zŽ¾Ð=ÖùåKp̸Ý\|E|C7K … +˜¸y.A‰S2ò;%S±ÎÆ­ÖKyŽLXwÖ*yr°^=¥º«„ª—@£¨(€$P—©ÏtŒð›t?2@+1"‚PkŽY %²®´Ûƒx\"õúÌY*y€íFºa# Ãæö ëÙÀQ³#Q€Ô‰uI‡ փìÛÄkÙ +¶=ÐNbñ[“7ݿ▭“+’€f|àå@րî´à-"4æ.*±QSi +5y[´ ˆ­hD[ò@À§HQ ªñÆ(”¸áP{ð°ÃU塶›#”ö ²Ÿ*‘CP?ˆÛ„ÏñäšÍ.RØc(!/¢áÄáÒ@Y&çÇ!<>Ã7wˆ¦GÒÖSòŸŸžͲñ¡Èžñ³µpø ?Ú™õ-F¢=Aªэ’¯ñ”Ÿ3Tptö‹©B:tžKð”ô9m2 †=»§S02ðóïqŸj–.%`dÆ?ô[¸G=}”×ãkÖ ´-Eʇ&OzÂ&ܓͺ= áäPڟ= ‘~hámîô¬HT*뤌ù\sr'3:s·‘ˆ vÔÒÒcA›Å¥7{P) UVÖú«ƒ$ ‚i¾B ô3‚ÔE›fÿ€yòçŒÁü¬iS€ÇÁVZºFjô[| EC‰Z{9\çÍøZ´Çè´GËT¬4¯I +€xYkäbmÓg¾ß&bm.¿ôσ8v)ű  µÞ¦ÓÕ¸ÖsܨZa›Eb;¿Øƒ'×cՑbx²' ü±&µ†aÒº&¡8®Ï•¥Ü©’§ãê\]‚Óæ×V]mˆU#!fþ[éËň†De䀎>ÓQ¿¼p“ *W9ԗžíJ‡Öd87“¢nQñæ`ô+*¿È§Â–kݱ@êãN¢©ÔyÂTçYÞÞڀ +7Âo—Óï "£¡Âê¼AéÄzÀ¶‰H"ˆÚ71=ýk.êC"ØÙØ'j “/Îøù:B1îÜ +¸+©„¥³\³Žô9 Ó50Юá|8h\¦}‚22$~ÔVö§]&5 BGŽßfeTÙC. BÂHAÀ™ ãª: ÂrÝ°y¶#¯6äf.±l’ ÁTˆiØZ4žê‰Üq Zµˆµ#C¥l¼3\–ˆ?À]7¢ÍöƒéNƒšŠÆŽ3ý p¼šŒ +CÓòn¡àcSéîfYàì&êaáqiŠ›¿Âx=Œþ<1"6¡5t^2 ;—,€iÇ-@ PpO §>Ò¶¿Ø +2 ¸Z²^7ð®QsËw©||QZ¤á$“G ö ƒ¤ïè<¨¡˜²Ð7ʃEÞZ.¼6 ³Çàƃ*ÝQbMóÀ³àÆ,}ø`Âu&m„öz‚þàDý+7DPò{”&_%fPeļ]vpG—C­ú’,_Ì©61F1(f1$8÷`ôâ7ZO@yW'“@ Ô%îÀ2fpr) ëÝ·$v›ª<:í¹”Ó ÂSr@t¾Ap¨†ùýX5gp¾5óI:¿OÎ†8ˆáՅ_!t1‹÷‚ƒº²{ÀjA—áå°a Ä HWwÚÁǬþC¹á§yÁñRÒ^›Úmð;•Bd[¶Aܺ @²"îø€ApÊÆÊK6 žµgÅ7ÁÁ­9†`g´íõOÃÉÒŒ^gÀÀÿ† )®Ö€Šn•‹1Nh²!<jþ¢¾œ´µ0”ik z208kAYidAhf4`s™ÁC#=¢mPBƒ« 0P2ÐàBDðÀdK˜1Ì–/r׺…ÊBœAQbµDÛ›fàÂ>7•”Ðf°ƒ.6ÈXí2 „ƒš¥žž*YBSB …k&}ë¨W}µæ#³?e‘Ú\É- ÔbjRƒžar~5¡® ˂ëkzŒvÌÿ=qÃà°I©¢EK¥8…(m" Näê—Á ¶ ´¯ê/@\)éÊ¡U&¬<ë!{7ai.d•y²ø|ÝÆ¿/@\-” 9 J$.˜F>SÚ ÄÖ–v{Y›ä$ZwhBGPÁOÎ80HÈ c´å;Ž8ÇïbùÑ?-p ¨…wyn>sÌ}Ü@iÚj÷:· P!ځE)³á«C`+hµð +ßÆý¾¨ ¡ˆ0†±ÃKƒÅá‰/æ@åÚ`@wN°ˆŸÁ’;&c’f˜{… `”/D»)ð€c’"›tº(c ©¥tL<&Š€8ýÔvR87_€Çhž¦ÒÒ dG/€ÖNIÁv\¼•7Ltè‘ýz öŸ(ý/djTP#+"j•]ºx´bÐ7 ¶_T9UÍp£ÒŒzN4÷÷<H•›,¸+ʽ %`€×õH>ú›‰&[j–£,V: +Yð¹÷ôñÒ$ ¢Q á|¢°pïzÿàU +|%ë؇•drôÛô]HŠi8ï$jÅ +Ä*œ0d¯$×éÿ á6‡Lv¼ieUψ>s{ðÐú¿hŒüՃiD,…‘IàwÙ[¢a‚¢³ßÊ.–G@‚U¦@;°w††Øï*¾*Ô³F+)ñ*‹PývJ £Ó§.qf ý³)8Վí@BÏpo>û—µ¯úÌPnc|ùý&+UÄù¡”RvÁïYò~†¸.à‚Z*³êÉ/‚ø’ÒʐÄ/†û×I"7ºVQ`æf¸O”Ò½¬õóñº È1fXä-}Œü˜¦¦<:àݲüË<‚ô<ìÃLq‹ c^þ™'æ‚hÑÕ¬•”¤´ùŸéŒÍ}. Ð=vZ»Â€h@È1¤Î€WÝ#°¡ñôéô<ÇÊ ÈCº:zxåä ú³cޝz|åÑü‚I ðR¡ü-¸.Î-$-à—C) ÀQVQa>á̓Zú]è‰ìõ¶À–W²–€ÿ‘ùšÐœÉCâ @ ‘,' Ó©î!]%?.ÀWµCWÀÉ¢-C‰3˜€Ÿéz™fÁàÞÃ7 +ÅvÅ¢D2Yï,© Ö¾‚`¡bZþ™ªâ+A@y²p‘ªÍ`ýÊ/kù£‡šošnU€`'¢Díöî¸zàSê5sfýx·Bëd傍÷4´ ÿÍ¡L0'œ 8CË @=Å*²Ù·%Àæ_©}C|''Z~¨…rœ€T€ríÔ9KڂÁM +0ûªÏ0Æû#œIJý7º"*=Øi¿dÚOElgßU^C €SY¹µx>€+ÕyUYu8ÞMð{=H·Tôôù'Ö“_úØÊÖ »J¸˜3^SàUŠ‘À*8´4X£îI ´?i™€Ìâ/÷½­·ìÁÞ¸U|äNvE$ÿþy€õÀ?2-i£ÀL6lP¹Dg@ÐûúViyԞ«€ÑxK6' *¾ó¨4aL° +*€FPŠÞÿ÷†Ã4ŠVãó¼h>Œ¢x¸³ƒ’ÙõìýaUMǓýg:v€€ø¬ê‚úŸÄÐäƒëù«Œ³|ì,ì>Û9ÂWQeþSÍÄBODæý·éëñvl•…F½:Às—”›i›hÿ{ÏüyÄåG)]ô˜À4؏ÐWIÒtÏÖ?+¡%ºV῁iÈ 96wƒðø×­ƒ ðOÌ«L#!LʛȦõ_Úr[÷—Öû½$Tv~âВ>½HVÉ¡¼îÏÌÿ38¾KšêAÛ_Ê¿Ï-¢Œÿ9ò³Í·`Dýÿ-œØÓ_Ώå#é?f2 +[eTôÿì*ì‹Ìº úOf‡åù—‘%•;H%;!©û;Dò„ ‰òŸ7¶lðšX,ùG_d!c±!ùt4³»¶8\ŸŒ›t†âoMž‰;,3‰»1+´yêýÍÃåzHñþ$§AÈ¦û;AènüƒÌܨ&Tí/7\ 'piû¸ƒ$ÚÿÚ‚rÖY KÐtP°W !ö“8NÔèßՊI™zýF†™¸3×Za^’7½iýÌæìğ`ý»{ÿ•K¹%M¥cõëUºTÿ‡ uÑ.xrF#Án fý$¼a¢¿y¤ÿå…Ðoä49èßoF¿>ÿ*,<ÿ +൴t5Ñ0~qÑä•o6¿©íHô`ÊA¯MM“kG¯i¯C½Ïé¨EùÙ6¶gZ_“?I<ð{E-×"þ9'p&ìtýçýjã¾ÅiR*Ço döÿÝæKgÒ0~¹ºT‹Ÿ}¤g-&ä8$¿’Í@q´iüœç›[Q,͞?]-‹oðe!Kþ ÇÊ~wº÷ó_ LânÈÆïÓý C•é®ïßÖ!ñ½/¢Ìß(ÿhÞ2y?Ñü»Ãû£z:³ÝýwîÉ>,EcÂx­î“¿L—Iì󔆂¸¥&¤w{ûqãÞëËTÆí¿Æô©'¤~…ëG¯B¯LSÛLJµÏ¾—I=PûæÇ;:îçûÍñågHû#†£øÈ}ÐþFçÎK?¨xQ}5cM]Z0û¨¡ÃRöþ!Ú¥È>únÖøYßÓ[fìSs±ßDÖh4¹·V-î§á«쳬§Fݕ¾~­ çCýöÿ1Rä#ŠH×oEã«sãyè1Æ\M7µôaú-m`J¨z~fþz—ôiA[KÔÒ'¯|³XW×áéèóÀ.)ì3ú¦×`Ïy·ìôYÑ㗷^¢aà§=ߣ*!<ÿ6vþ›aCƒÇÏ % ãú[Š6&Փ{¡ÿ•öºÖL<RÜÒ&æÏyZŠßÌüÀ¥ÁJæc—Äü9 ȯ +Ëag[È¿¹‹dDžˆâˆ,¿Å<ÕOþý󟱛²Ï°‚a/ ? -sLÝ  ÀL¥WÁû£'=ÎÁ*Yýj¶+ô°P2߆?¯#±üÔ iñ¿\_‡‚–’¸\n¸^<³SSä!%¤¬v]ͬôÄ@–L ,0Kª¦Ï쥭ºXœî´Øzqj‰˜æ„ýB WåMÊE' ÓÒÉԋ£3©E6CÜqþ»óûóA>A‰@ø÷®!Z­} 8Ám„jXI6¥ÌÑ4IìQ†ŸJæ K›âbG(GŠ†Ð] 7•à¼ üëP£-ßnFùîãõWû0Å¥osœE<ÏM7+-xNDÔ±~&œþ]@ŽÿD> ðµ‘ìé+^³&ê%qƍøÝp©“S<®l™ž å.=4ÚѷՅŸÓÑ?¹¥ÃÚíÍäÉD¢ +Çb®@ôw'íâB?÷:¡Äú†n/ÅÆÄN§‚úí¥­‡Ã)®^éΦh‘’£RJd rJâ!J½"¦CwÃZ !ÖÝYē²¸Iĺ‰¼—+ùk Wå7±¦9‡¶ùE`œÇIobF¡‚y_G3é–i½|B]ÁÖH¾çˆÓ×Î\X­E +š>Q #!¹mº—Lèà “ÀKٍíuˇåȥɝŸy’­û›êì8íå,ꇳPËÉABf¼g]nn¡™‚Ýÿö`FXî(ª Ê}òJ%£{1ý)™-eN48òðàˆ@D*N žYì:¢+nÅ,FÌ©7¤n pŠ¸E‚_¡Eâ.æ%‹¡(Y³X“äPàË` €²½“GáçD¸ðêhÓ¾uÄ© +FsŠ,pwÏ*6AÍ®ì‰#èäł÷ d“úÅҍkV˜a[‚âU†™«cí&·¦ lOÃm•i¨ÃJìmU-þžGO + Rô}¢sT¬/ uš +̊¬SA.÷­ÁQ†IüØ‚´Yß "`¼î“®¸(!âi„<üN‡öõ=5y]hŽvl^ê¿1@Öè¤ä ÆyõJ]íð+9tFSlõÊÐÁ@Ö S|¼}õÇAphìúu=UÝ^û“;BäÛ ‰K–àf0{.JP®M)@”czZÀ÷ÄÙGô“yªˆWe,A˜]õzQ°Ñ’0@6¨ûbYM©TR ã{ö/,¶F²fóÅ +ø‘îb9Á³@k-Ÿ6j‘gâZ'ÎðyŽ„à}½Ã1±4R|lXŸ†߄ŠÎö®åcÂœ§Do\m{QZ*|&„L²c¯°*ªAPôxà¿ê»˜RqfËp"jWu,u<  +}Ñ6*ÐnÅæʕ-_Z7Ý>Šƒá¨Ì%#[ƒ]yp>,qž+ÉJgÙ¥#+䃐z` x)´ßˆ) Qp|–¢ëÓ*°Vy“ÜóŽ1vsP3Fš5æ@šƒFaÿïސ¡OD-ëÕðy41ÇwÏ3 â|*8îìønϱyLݙ(†¹ÅləÕ4YVî~‹Ž20´ã!ã‡׫o?›¬‡†"Úí|0Ð~קrsÌ- fuêÕÓ8#à/dªþ$|j¬Òk› +NqÍîÇà‘ˆäۨȫø#-ì†èýþ„ѦÞÁm`(Öùësá8róKp¦ƒèÑל§¿Âôpssˆ…¿´ӏÀªy +Ø❼hü!ûÏW2[«¥Ö?E³e‹©l‘Ç<„ˆ;èIòÂMU1…¿z˜ªt1©ð—QÞèÏ ‘ÕÈ"Ô¦aЈK°Oö¤¾THMQ†zɽæ9‡KèÝWb¨Ìì 4²Â`ŽC.°^]À!ézOµèÏ\± +­Ç­Bp¡$+ވ1eª$Ò 9AD6íMsۆåØ8èÕgžÎD ٘‘7b4 ÆeˆîËÚçgV²Š;M† BŽcåW²Ë¤Fô7½wK~[àÓ`¦5ñ´_ Ǭ®×rûÈ/ §Ï®çU â+bmL)úïLTuû¹`JŸÅÙ<©"Éûb˜¶…tö^½ ‹üæÔ R$1$742É`Ì µª¼:†rsÍTÔûÓTµ-ðæ9l›·~\Šby™§2Í{6-,šENb´ Næ#WÎËIëH ԅa‘= VØ“Q(7çÅ̗—ä"¿›²ÞÁ èšÉHóÌ·ÃkÌŒ;֐‰A-àçÖ#K*êö!G{±#ôßO£×Æ~Ëg~õú0üÝWŠ„#~Óg˜A^m Ìn€ÊŸŸ©7f'?ø®7‚cèÈ<ã¨æ¥ègDãS¬#Ãï[\pgàÎ"ÙP¡o(w}Á.K. +!„/å25îÑ÷ïBKŽ”Ù‚!ܖÕýŒrvq{KüoÿqƒÅCÒó 2ʒE㺗q¨N1ñ«1S\Çåï`¼ðÅî|k!‡²G6;åÅÌb$©f£±Ðã‰Éˆù󩩗ŠNeËU€­úÒ§³ƒ<¦ÜÛ4‚£#‹æ„Z.å•mS‹¿«<ZTX…£¼Pyˆ[âȆè‘#¼Xƒ¯ٛ oØ֎/‚¼.Ž/üY’íùõmÆÿqù¦ ¡t€4¤“ +4ɾiÀv)ªÔBÖÈ0Cý%ÈEIaÕéˆG‚| +D8Â8È£ÓşûH¬'iqë9ò2Z•›Uð>×H´1B¾hA¶_¨¬0£¼Þ“Œ +gTt«£PgR™Ãƒ#´ ÞHW‡utέ!§h†ÌYD ¹­óf괒¸TÜcY2ÚAá9HY¥=wqÌü/ÙîSÝɗ¥# +72."ˊ(å$ì·óEt3uþÉ +=4fX@˜ˆ‰(ºhtXØ0•«Crõmb"v‰%F¾µÏÿÕÕ©wŠ›FLÕÞ ý>°Š´)ð-®8eŠIÄ¢Vb’ó„îj³%=Hù!è³¢¬­º1$ØЫ!+¸D;¨#ènôc,¦ëÍlá´Kœ„ÕXûêxq”hK|P)EôÈy¸Qt ÀXLp+ÀV¤;í—ҐÜù0¬c,õ( Ir T|n% +žüí7¨Ùèð¶I¬ÛÒ{g>ýŠËtŒv䩈Áh-6„ dnãÓJ’ÚÅ¢•ý¾¢|‚Ï»#¨/q97®_m¶¿†„ƒ¯¬ã-0äEïØ‚[žä½Â²¶Úl:"͏!'úÀb) ’´€/gµ*ì‰Ô™A +Á=LõÛ,¨õœQN„¨¼´=ïß, îUey´óM£ÈWV*mòZ“uÛSc“¦¦!Wìl"ô'[þØ"Ù¹5‡rƒ«ç>ßöŠŸƒHÄsÞjN^ÙeAAÅôá¥:ëx\0#DhŸH)'¬i9aþ“\éÛªÔmïuŠ aH3É9 í2™H{Kß·«FaM!µý8Ø –™zê ·›é,hß6w#Ó²xu^Ä£ ³Äï3_Õ+OÓ¿q±X ±]L +ªÊ, ;ö$Æx@_*›Bé™MAztêÙÄÖ&̈V9“jìnp´zÁ@ÚþÉ!–:ñ¿À°¥MÁZ،I$ŒXà $ô©ÊcwÌ ! dZDåüKåئoæÌxÓI³èákËò3NÌ)ï ÏÅä€Àb·º×#³xš:EÉCݚ)@Ó6\XÃ*#žæž1âùyl€iQ¿ôâ4ìOcž©ÐîOøg¹î/tÄ¡nv¤u“ k B\VÊ¸¢¼®-5±R gã/Ì[ ŸU…~Æ1ÀAõbu%JÀ#&ÿLy¨ƒåûFS†\˜¨?ê ë‰o½KXÕxË.I¥E©9Tð|W[ÛbÁ‚0 ô ü•}WbRùlWm£½˜CšŒƒ5"H«Eêö¥c¦ ©A\A˜¤b7–O ù/NjàʄDNòËð6Ç=O*'3ü¯%b$Þ OÀ w—êÀ+ÿB¢ÅŽ¢<–=ÐF"‹ct6ìIÐ!PÁ¿iÙf  +ª³G‰ª€)֏oR i¤þ(ø¤”TÄ?Ґµb$¿°;ü3ÉgZ#-Ô·ðªêµ*†\_%úP­æÌÌ,Š.HZÕà'™Ÿœ ÐýÈMÎ=—¢4¬ùhÿÄMÛW[EçàŠ°’B»¦Dàð"M5èÀgÂ0@‰ ¸Ìé½fUsSH%NåØÛ]£,b#8Cuz⎬…¡ŒR© 8Ìv§X€âQÁg?ŒJ¹áËjRžÌ’NÞ3J#2 +ñPd^‹Lg°’›ŸJœ‰Äß A×»ýZå'ꍈԫ$a)Ù1"a[xþlÀQÍ¿‚~îðôµ%˜ +xÖMãàØÇÄN )á‘WÚ $àM\ä€î(mœ• ÙT0¸¥µ*½É ¡©#ʛ&FŽ¹¨I'‡1W¡õè<:ñ[¡ó~dÎ~ ˆK8?q†ø‚ö[þùfĀ糘½Î{qiñȂ–É߈בhÑa— +óp¢§1˟„AÊw ;B܅aêû«|¦ˆhè# ݸÑæÇKóÉa®©¸Ýh¾L¶|2 r5¢H÷®öòc¸É«¢"Tu­½Û¿Ú’ô+qÜéÀ +Ȃ¬~ƒ•áKJu$_„Ä8a*0 +²vÒ·YˆÚënÀªÈÄ׿¤½}`̓¼¸Iˍ*Ÿ¡;‘R«h{*QmOÙ46Jˆ¤¤1én€‚KÀ&DóQd& =é(kö7ât.GDû’D…yE:øÕ2ÙC@¤úœ88ƒºàtó#î¡ÿYZÜ/Ë çǖ·’`ð©?æ“üы¢£>ìґ@=ha +Ý¢žŠ×¶Œ®…$OÀ–8£ƒp@(XÈÇЋœ,Ra™5O™‚µ-É~Ò ú âI² +ãöªZŒû9'fý(ÒÖk‹I•F„†áø¹¹—#"ɏP%ü.– …)cNÈ]uAÂ6KAß–iØ7°´Jè/žÃM¶Lôœ§0¾é×#ÒVK±Âb¡Éc}5Ë;cø¾Ñõp- jZ8yeÆï^‚Š›V+ã1½þBÌ7ñ{n+ÝB¶Ï¬ÀUœÅ Ä·ŒÌ®Àõ¤O‡F:úöHTúF©"à/qa1Àÿ í'B±Ôä¡xP³U̬²N—Xgr«VGr‰ŠºKŒ‹qŒB«YŒ×p! Îü gÛ߅hÙ|^8ÄùÁ¸p‚zŽt#^ )ÂeiU´B­Mu8éï,åîrûe6®p¥þtxÅHI!±Xtã!xð në:`Rb[ íÆZ™$ Y”ˆIˆ•›1ê,3pˆ6¿âÀ,-0µs™1zð핈Üë1Ï"+àY˜ƒ‡“O4/¥YÑBM¿ä2|ò@©Üj,O.ØU²±Î +Pl¯öË +×,©þ¡^´ Ø ij1ÔÙ¸Ÿö7ºÊ°'êê°®«<‚´÷Òô×°ÞiÆ¡(¹¼ÌäúAXð +½žê~&Ü65ƒ[í"C†B×Øã Á'ÉÃÞ?é|]àƾ‡qÚ%oâ2®|æùOZ«nŽ5µ|DâxUŠ±Ü=JÆh˜¨†Ñ©I|B”Å«‰«b6A®<ŸQÎÕYeŠNê.Ïã5*ŽçéÜØÚ1óžÔÅFäÓ?ñŒvóé÷ð™–0¡”¨©«È[8¼¼O>cá›d1[W ôb»‡9اK ÏT´iü›nB¯¸\Óâ—,pÇG°îÇq­Ù5x"µ9žC€š´V¯;× ep§N!LÙ*GÓ¯ ¨ªÑe\2D©cޔ4jÝ·ÜVþ«GiC8è ¸C3sµ®M…BŽðj ^C@%sq³z3—ñê¡ +L 6 ë_ߕ¦yˆ{Ÿ!PovMöp"`Še«ï©»k‚ÊØ)HS‰5Ð曩jn̟ÞGëXî²·Œ"(>K9]å<wŽ0qfÁý1$bŸö/©O? Ô¦Ã&½èe²Ó?/ +ÃP©0 oµ7_¡­ÞЇ'—›ZéI ÕïÂÂîê9;Yy5…¨¡™Q©_jÔƙCHVp'q JaY=ʽM:ê•&㊚%|M?dR±~Àé1X㍓ëG< ”ÙN‰æx՗5ªÏTT¢—ÖEÇ]&Œ.U·*åʓ†S±+‘(‹sdP“6¹…ci Ð8r`°ËS•FÄÃuÓ`R˜c±TòÖOÜ®t?]þt9´È;%D1¡ù¾tiˆ)EÏ¥›Ãô4ä Fv‹†(æ TÌIG´ûwfFœj*"ýˆE©&ί÷–>áHS8YëI4#Ž:(Z ²¨ýÔ1ÕÖ´ÿai@P¶ü°¯‹I™ðWhš¢k½P†8ìB<åN«çPAѼŽÃçCPÿŒ¦©wkXo$Q$îH9 ¼‡ókãIÓqª¸ 6¡ŁiÙ4áÿ ýÏM–ô—½˜¨pUXå“%ï`¡‰]žÕ3E](֏/5l²Ù«H¿¡ªÅc¯Ë¶@’bQ¤ðEj˜Á¡ž.BÍ,¬3ÞMr9ÐƼjy&ì•ø¤œ*&ÁDBíÅ2€wøxN¹·-„ßßËä w싁ÐXHR²‚,¥b4bnÕ>wrBÃÖ¬¶ÈÉxž×z!锸ßAm™úÉue9p_zžó"¯¤ttrcTÁñZa4Ìr¿zW OGšR(QîÇZûi !—ü≣§ÇËÑ,"1ðˆS ‘:E€!=c&!Y/þã惸QLbéD‹ÆQˆí{3h“Ñ0Á‹1$‹¢ºäoMñ—0ñnÿÁ?‚Ó(K¥5€ÉÆÊ˽ÖÒ½låȬµV°ª Æx‰¨Ebs™‹KCòŠ¸X©Èð¶òë-d–-hXh 5Ñ ÎàþpÐ>š¶T„¾³ð0Ûq(õ/mNpc]Y½A¥ù0‰Ë'²Û×þ™Ûøò,)L¯TàòÍbbºþ[ÝV§OUsý°ƒxÊð³AŸY™Ø·´Ø[%ž0Uï#ž$ )qžf·YÏ R“cgcòЋå]J6ÀéðÈÿÈ\PÈT­¸Á@ E)溊éüanÛ+åt´z,ÆQ4,}’´æör"R½LHȂ« ÈLà€ÞD›ëïʍü…E Ê¥Ÿƒӈ®³áˆµp6 v- Ôw=³ÊØP™y¬êŠ1¸°þ>&äþ-î°9¤5$ќL¦–-/7ý©+ø±ÑÑ)Â2lXû£¿?’´É–Üǒ/®÷Ò‘xØyŽZu #X–©‹¿ÃËH¾NQçih,@YµLœ ¤b팓æĖUmëÄ̐µÒàLÿ‹QK×|¢Ú¡)Ò´‹¶Æ1빯€ç}ôlõɐ¨ÂŽ0ÄÌ1)bvtÁ$Ðñr"I´ÿµ^AM…$Gk”ð=Ô[­5ìAþjû}…8«…¢) Hœ k*ðŠÇÔmS±[k|f„Yµ nC‡ØB!6 bT÷bSn0q*ªc&Ú¡YèÇfY|´ŽAÓ¤4‹[7¶nË}gÌû8ÓDf¡ùӌIט,•%Ã_ÎÍÇ« …>Œ¼Ì”EÀä{Œˆq_”hv‰dW-2"†äHøh9uÖ~®W “Ë@>:Ö©ó‘š.BÜ9¤[ +_C°#ò}Ff•c{ߐú0ÐC¾xIÃóv„‘œèÿ ᣦß{ø“q.Ífàø›D{!ð5Wä£b1›]Ý¡g\Ç7–/" ɀ\ò5\Ž• sTotç ¸Õ%Ÿçmƒfà8IÿùéåìQ ºäOýcÝSœé‰iȹ”¿‰.Ò©AºÉF >FÜݒߋÈ=¾ˆ û9¿É_~E\ò3‚:û`ïžÎÔúÅ ŒËú{ïð—C狷vj~š¦Ö7ý¯–e O9ýÓ3 ¢%+3µ~ñü°H|_ª€h鿹+h€Öo‘F5ëŽ:`\sã2t¢Lw¡©›Õ’»ÀO/a ï€Q¸Ë)òâÖ²Ù jÑì¼®ƒkênP²EŒ]ÌÛ²[–q ı ÆT€]Z|¹JA¶^åÙÌ;(®‹Y·Ø+ÓNë"»-9L¬Ëkââù¯'FU#³$¥­.¶OJ=ÚÇ(‡šËÅ»p;#5é²ò§£Ëþˆ.Ë((tA»è‚Ú^4éSÆU* îã\†ät› ¢aÊÿI„´nyíÊűj”p!8>h:+‘‹÷_H¤²UTVär-»\V«ô 7<.|gZá¸×o¹¤#o,õIK=$†¨„ ãI½zä!+qù‰³ܶðlD*ìÌ.Ÿ¶aU‹U+ƒò[ÈFY÷rå¿×ži‚ÞB_·d ±Š/ÍÅpÓxlæsw CJC /vK×]ã“õEÝâ|˜"†h9KúWwü¦i÷¶ G.¨_ˆµ¹-BGÛâTêεì3ؖ»g!fÕÃڒµ(Ú×CC ¤e2¡’šoKç˜bS[ä«%¯¤-<¶rÉ)s[>ˀ4Ѷ,V9)»¡.š‹[è(è~_‹Ô‹Wsë›Æ®"ய Zӂ©ªk—­œ §( /­Å:·xUNÖBc‹a-¢vc´Å†0¦Ž¡„Õ¢½„¨è÷SÕb~dǧµÀnâ”ز]!ô­š +jqS5ØÓbA$œ™±ÓR5ÓêhZœŠÑÚ¥˜ä­Î´´˜"3™ÒB0 Ê$-Ü7C3¥¸54Ô´YZèιVSF„%yÐ-pûŽh)åXùã¾eh¹¡×çüÐ2%t˜‚œÊ…7–ÐB:Àï{yZúY”B-úä'|–"Aï="„AjY–ª&ãÁ›'â6âù$Éâ¤søF%íÀÎÐ,äJ’;UĞÖG3‹é¹ÖÖǐ内óg¡¥IµÂ½,H\ù=—åvºµ4^/áGË97„I„°,/žbeÁi•…ÇAk$‹ÈŽ‘7²x&NI=‚S^B“8é@êô@u I™(g¹*G *Y‹ì²{Ë-ƯˆÔ2”«¡dàĚ+^ÆNÂXN‡ +EÛ!úë’d³ˆú² –NJ¨U¹êa¡Ê®„i +ªéé8,~ßië(H!€ ¡cXÄÿY^bUòx ÆÂB\ÓB¤°u‚¡8£2¿²se²}å-vÑWHþŠ‚”0Ƙ|Eè/>œºZ~ ­<­Džb%Fžc"ˆz%® ’ +šÕM›.zåõƒ“‘NÜ2B^Aä®?±È¯uèöÞJ ™¿Y‰«¥úÁƒJ±y¹wåªÿqîŠÖì³v¥&nŒkw @ÙºÂ#ØQWL™!y3)®ÈÿQxM«q +ÜÄò N³¨L¸Bø§ °hJ:CàŠ÷ÀÊé}à8`4¬ûVj›” +Õh;JÜmg®`i+p—ƒl¥ßfóÈîhFʺVøF²VL0 aK´¾R^†Zy™UþÄ·ø†,B•N0­xÒ»[ÓMÈÞ5²†‘W´"Phb¿Њà†#ªž•C“`WIJ )„ ¼BVn\ƱҺ?¤+ÈÌš+!¢œùæ|C•‚áш•î2VÈcCÖÊ +]B¬¸×ÄRóVlu 'J>ô«C¹7ñU®Ä©Wô<2ÏCÇ« Wv¯]åS9?+‰ZPc³º +tëä*•¿Îé† Ðáë—rNÈ*´Â¥w.“'™Íœ¡°bO}2…µ`âÀa^U°¬¨&qÜØ«ò™åv®Êï•ÃkUÌ£ºïĪ†At'XU¬+ú¶‹ÓR©|ùN"a ª˜šnY^ÛWªâ,Ù6¨ +]ØçT‘ñGìXÆT }Õ_HؓREþò®øŽý ©"‚ŒæãO*ý'‹Ee-ùiFN°©ÌÌi*ôw¤,.ÎL­Mbé1Î]Èc§T.ð©”9:¬B½¼Ñ"xNÙâ@J‰y»€ TRtRJàá÷¢¬ý0©d£òø9Kê?Qr– ¹°'¡Ö±©1ä) ]|¼wh¡,N&âÖD…@5‰Šœw?ä"ÁÉ ·„$›OÄ ˜šžD‚ˆ„ˆò4èˆüd—o»FË\üÿÿÿÿGXäâ^Ä~©©ªVUUU™mfö{|q6“‘r)'¶È{¥“ÄôÉ®°È5¡ÅÉ÷íß d%¢7ä##‚R„˜‘"¨íÛjÛªµíSä0QB šÀŒ˜333356|>56D‚•HˆˆèDD„Øh<Ä6: Û¶-!„¨!B!„LŒŸ™™™™OåÌ?96-A—χà©~£Aä#Ûhb!á_6¢åÿÿ1•õñg_uáûOµ^üZÐåHÁBWuò¹ÓIïÿ‡üÿ$‡äGþöÿþúOØþ§gžþpôêë7۞ô ‚t!‘6¥ÕfY‹b„À¢D !„(1ž™éÌÌ ÙÌØ6#‚B¤01D „B1cæƒ5"À! +ðHDBÑkYl##""‹Û6RɏÃl±þùÅÆk±êîÔTU«ª¦ªªê­Q¢ª¤ Ï3£²›œàŒ:©ªªWÙëŽê'L]å;šHíBxe¯à· +B‰]UµJZUeÖ¢*ka‘ª®¡®ÈUÆNVÃm`qeœ"´¯ˆ´ .Šï i´mß·Ö632ž›q="ŽˆèÞ#šJeÚä‰;<9ßa@dË;KÝ=oÿÿ3ûoü +kT•˜™ùfeuaµŽ™朜øÄ­r"t2)V"&""=‘ûÝݝIfÂÎî%tîîîÊB‰®Cv³à†¨ÅÝYÝGpˆˆŒ˜”½ª,lÛ¶-6¶m­9Þ´¶m±V¬B¨U¨„Ün3p‚X4H¥bEJú€1(V"(JZxhH¨®‚Ê@@w=9îÄ¿‘\¸Û‚ô÷'°"Üނ:ER¶ÔÁ®)t®„uV¦o X¶-™.Ïئž²2@1ËÄ«z$hJЀ#"Îí-ÒO£cJâ.3…Òý…3øR‚2£Œ‘¡WÆ'ÿ)æîÑlcË ¦G? 5 üüïÀ=@™„‡¥Œo˜:·´¤fGÛ$“ Åæò"¹†Çz +;Ð"áø׫×&ÎQ|š`\©îÏ YW󮩒ÙÁ¨^U ìËF¤Æëw„› +p#%GÐsÎMˆn„Ãëx7Â~ó\# VøNƒ€¦Êp:¼1 ˆª¡í½Ñ §ªIš“9å“ìM¼äáëýôBº ¦U¿ãæJÂ¯×’à‹¯<×: +¸ñãw7²QñPkƒ°¡àE÷¦·;ìËÚâ¨DŠSž±ü ĄX'՝¾Û3 ?JÎLG»×øPP»6T KæD£¥?2ƒ˜°ËRÔ)Ô÷Ù%ÆJ 7xÈÔ-bŒf˜Åâb³=ÀȌ}Þ_E–)õÃøÑLkPñ bã”Ìj²¨Ð¿Hÿ´‚=r⪹ "¸p²}ŽøÎçoðe–ÿܦ›¹ì›5ÚÇQŠpï÷ ²¼¢ eP{¢*!q©-炄ɐâú‹À]@cf +"¯!'éùEõ–<ÌÊ5¶¡6BYp–vt€ì2¤ÇT”à"µ?”<'ïpƒ¿³¾iCcH1€WLè¢F8¤7h6„×¢RHôA^æklã[6öвD£²Ì:%Цþ¹1¾]n…æ·O1Túu[ðR;ê ¾B‘÷¹”¬hŒ‚_Ö¼å 024M +¸ÄÉߍæîóžÝ›}¥Èî*¦ÆÛµötqþ³œÐbª î=¸,hC̛Üù:$¾B)´‹'dÀˆC*‚‚°&” š:PÂnqP¨¤›3€ƒ3ý±  H¹¬Ù†Hp(®¢¦ +9hE ñ>^cº ©Û.ŒêÃO yꃻzXP¯öÂ@éÔïۑ”p^ôÇù]ˆ¥òÖ\ªžZ#[í"¾‰¸íâ/D»=vƯQC¦L^aôá†ýáÇëy¯×¨z3?×F}s'\f,xuµrƒà±#’Ô€+ש§‹‹„Vz£·öCç~,]-gÌ ÿ°žå4ÚˉÏ€“):{ȧ|ƒÜÒ"º¿å7º^µûãà€ ‚!Â!\þ͵~Á@2“™Ä +æ'Ï;N€©Á'¸}hô!Lëgz›Up+}]áü›´À<„ß¹—:ZlsN`í?SCÀ­Gil†”j\áäHM 9`.Xfÿñ8'Ѽý„7y†ê$acêˆÑœ† ø@ÔÞu¡5hNÚ¯U[l¬¸$Æ W4dȓṕY]2a{¤öíòòiqÕ"aÎÉuhÊn˜N&ù[-3êŒî¢m8n*Š…Gä=ôF_Ì×]Hdg!Î̯„y¤…Í’7ˆÑÒ³×5j–LIͲ(—·GÑÙÏQv " +ÞÖñŒ*ñfP Çôðû~Ì{‘ʻγ’TvðKáNZDÇj”Þ|tŽá+؉7í¨qÐOëFíû¹º-OÒïö\%ql);ܔOþëù¬Ð3¸Œn›€gy{`S5_ŒUQI0›Ò; +¼g­ ¬E­F3%^*ºõêé/ŘøK}ÜÙnÊW*st?äu¬b@©€§¼Ò‹µÄ ôŽBÇFɹ1¸.¦†eï5:²¡Ÿßjyƒrà ¼#XÂf P…½(’‚¹Uý §CùhædފH!;‘cŸh€vU)éá¦O׬êӔ3„F½ ·ÎRÞ>勞çH.©g`gøfq†fªÈhú‘dl´êäz>IÍí7°ûe>M7÷”4)¢ü•³ÿ%>ÜùÐÖ^|ñºy‘*ß¼¢e­#)6a’àÓ {Õ¶äD†‹ùÖœIô¦ü¥âž䈊qÂ|´€"Ò¸ÕÒÔ ’°Ë=Ñ Zš@´%aSUGŒçè5‡èÑXZ§S†^CÇ3žH@¶4ý~GËÝIÐ7â2uC2CTä·€S<ÕKŒ^“ôúØÚ´À«#¾Y,¿cÀhÿ¸$éË7‚Óa›!'ä˜cåCF?]ž9È.[Ø8Å~,¥nàü·Œéí9Ì0¡±ðèÅ5½)<Ê ú’ 0‡Ä"±³ŽºœÃ–îý©?F‹Pf‹›ÏÃYµË_»ŽŠrE¬ÒÚ횄l6Óí– âÓÒLßÝq'ÆK\Ì7©ÿ²Ýú' –t¬£^òZ¿þ|(¤´ÃéhX¬2uÅîWÜÓù#:1ã(:1™hFD(‡âY"<7:9ÝjÖg͗Ps+Ûø¡cž@”ó«µiÆ¡‰Žât sl„ÖÊÃGC_ùʆ¶B%È3˜%À"-ú¨PÈö4Ưôµ:}=ïˆ"rºàô'‰àڐÂWçEo«>C¶ÐlÆødSg¿ûːQ»ÝÊ·*›£=Ø¡§‚w£LÈ+7Áe×Oá +“´qQÔš5ù¤¡)øHŽ’ò¦á<æj}wÁÒl}&Ϻ0ïoQ$ëÆeþƒ»ð%€‚”ðÔ¬Ÿ~ü³Q]¹¶\áõ‰`°nŽ9AÅ°5ÿ”{âáût!í¡»…¬ŠØ"€ÛĐì©O `"¹5]"q¥…·8ŽèEræè(®ú1X“°Êƃ@¯ ÕÆ^ÿ#á”ÔtÀ)l0—PÑ>möã3L<•,E +’Ñ‚ˆN1Ö¤­qÇ?Óh-oëÌt°Á&‘œ­,ºÎ¯AÀZ) Aʖæ\t Š×„!,·°>½:å[8˜HÐъÀ›YHФ ÂÜ=6(p‰þÖ²¥xÂ><ÐÅÎÅí.œg`¦pxµY n'PC°Æš§½âZÄfDkm)¨z7]sÐví[xõ-òÄ£~Íal×ùIQ•üËø)ð` +Z↑½@ššt—?©›Ñ*‡_ù†¡(…,¯xòqè×Fu™¬|.f[Ο $à*YûƒÜW`‹(à¯69@“Ç‚ø0šC"ƒ&NG$hóUx4å䵸¢ÃùÌÀ´§ æqVù1Vlº…£Å#EàbXÿ?/Á]ø­ÊGƒ+þ˚¯ÿ¶ûû‹-ÿ$ډi|'B ù“ù`´4˃HøD¿9J A:§Ô`#@I87TK2uC¯®„¥ [+~ÐËj‘Úq;9‹ÍI`$”í­i¡ ýìjZævnҊ©¹)ø“Ñêv×î@QDïÀ½³¼ÁY̳œš[æ6IÓ@Y"ÙG2ùd‘ÑÇÏ)xÕ¾‹€’V,KŒûá5 öï¦ë¡š¶ 3ì\¸£ó«×:Àק²3n[7œ$p\A§V¿¸ ¥ß@Â'&­§·xÔ:ûîӛ!´n¡WLś܎G$[ðâ‘`C !9}"ΕÉf +‚Ü¥áiz¹¥ŸOɐP¯Éåô#'YŒVÈR*D›rœØÇ­8_·ôFø«OÅmrZƒO`‚âæòòïÓ;C‰ÖÓYø%¾ tÉ¢‚6€JL„!ÿj½M‚ lbU·îõR³à¤÷ƅ|%=à±é¶f¤êæÏúX¼xŠõ‡ƒ'´½‚õ©é68õ²ÓŽ!ªåüâ1ÅòˆÝ&œ’i¤°‚pd¹Øj5K€$ÎÃA“]ª©œÑƒöqOóPº¿ÐIn°+ÀHü ÙØ~ÀÞì A“ö¤˜bœ*Ø^:«<™ŽaOq´-ÐÈ»byrœÊoÖ´”ö\É©gÄþÌR=Ñâ +abõq7ÿÜjÃ,–¬Ì"h½‚Ì܎ñóT5J3ÇKm֘Ör—k‰ŽÀ²}]›¹ zŽž?´»[O˜h 1Zæ¶.¤(8ŠûJ:¢q0Ê­5– w2íQ`:(6ØQŒp±V©Ù¸¬ü ‘a|¤z) :¸E`!?1ˆBþë¶E6ФB$ƒ*@;E/Èøî:ß=έyË$t¦3j H©)˜›ç}©Z>šª@+1@ÒFÉæ Ï3{$º*û9pá¨Ó÷õEPIpq\£‘æî·Q³FÔ,ÃrK’À<Øt¯™’]8ÿ6}\lє¨&µþ 5¦ÄÐàà±b·¡}"$ÇÓ}¦Þô )óÜÊ ¨ŠíL_º’CNº¥ÈÔBCl“f!gHp‰u„w1NŒ0¬ w‚ìåMh.Ž}Œ,q9%bESöür…A™äcì©¿ ¢î³oߐ‘5c†^` ÃNců¦Ÿm ­¿YáGŠ¢¶Ø·)XêDâc8 „o‡TŒ\¼:ÒąKDbG¾Þ0¤!ܞ -8Ä,Ñþ­ÐÆ7­ÔŸ^ŸÕ"HùA²nÔßÙòAìP8¾.B¿nßÊ0¨]7îx•Ñ»Á]K‹ä1'3¸nɽà&¢ûŠÃ«­·Em»v›šçpPÛíñr034ÿ–PøÇ^ì©Ý(sfŠ(í¶nv=fâ¸M(¢n¬Í—ùa f¶|ËnÅ`MEåT×í*²Q8IJß>á5løÛlgJŠ¤]Ý¢N]cغ1)«› +Lݾ)€ EB¿Í ?ìúû+µ-rjcnIa%(¨å+õ+²ü6À˞5ª¨›‡©+t•„‘@Ë/á'ËX)ÐüV—~Ðκ5ÑuF!߆{ˆß¦‚Ö!ø¦¦úÓ;8Qšøf óÍÕn‹]±›Lš¦ì¼°Q«‹H4F«µV¯òðԉ&j MÀ0O“ˆúËgÁ€1oÍIDq+Z2„> ƒ”ŸüŒ6–gý<}‹Npo,Aågod¬ë;ÀW3ǔôŠýr<áõµDoè“@a[7ϸ'±®~Œ €%ÏDÍX@¦lîÄKLüºó`ðÔm-gD‘ñÅ6ˆñ`ð‘ÝìË¿ø4[X¯É—ÍT€ áx¸ñ"C¨Ùo½ŒeÌlƒ"žÃe˜y¢ÑSL%OÍܕ¼÷ÖÆ°Ë-H¸Ìcc@íËPL†£ô3Ü1Rhà&RWùQ¦ªhã&Y/“ k°ÑHAt%‚ 5Îp¦Ë–p­xcHV»¯kxÑ `Tcç<ã); -̀éVTTÓd _¬£þkØJÕ`J· ³:ÿžCö_B‘ê6+<û—ó2‡ &yt/¡FYþå~ȬÁ°)¢–ÇùË;ö­•!¯jø +°“l +öÐëiȐYaè8è[*ãä·$­¼äû.€Œ4Ã(ú2ä¤N>ÿµ,uˈå­[lßµÂ;î\‹€ÓKÛ؃‹†/j†c4Ÿýä~žØm’ C6¹^CðVƒ8ä—c›;@^ô¼2!Ëø†™+µ²$Ée8ÌgŒÈ!W)F¦Ž +â¤l º‰} ½þ´ +ŸÒ£>¤Aê–é3؅P‡Ü{­ì>tõà¯&ØÛLғéx¤D”·Àâ²M«&Rœ8éæ¶ÁܤžÒY­w­¨C{…›´íbïÉ0ÙC†CR°—QæhtôN$Ë#ñ“Q"! ” †@upéUw,à +Õdà\âÕʒƒ4ùf$"HŸJ2þ”÷a<Äôà]~•dÂW¥È£U® Y>)ÄÞ`¨¿yVBUx‘'UJ gª89ò tm%XÎ;1™Þ·ÇÃÒ+ ê酪üåx /úL ° /ä@ +*SŸsH>Ù-+k$xó‹8£Ö¤ Bš[%)ÔÆe ±ŽÊ¨Zݧ3 ý2÷¿×p… ²µ"¿ÍþJ/ì LöOö!g i,éígXÑA5ìv,(xûŒtðΒ7E]N{®l%ºê3xßeªdܝĭ¡%o½­{`ŗÇTóCUꡞÂðï<'ùe»Í̅ +û+ô1éÜ9OfÄê 4¢I¥QZ ¡#Ž£lŽ7˜È]½ìKäÀ$Ú-hdhÂÁ•±x€éì.MWȔQdLY—z¬ò¥¬ÓT,9q +fæ`RsÈ­Vy +:<‰¿Æð,0mnâ7%œ\í_åÊi<غ„Ñ©£Æô~¤Ȉ·ãÉÜÀ2QÂÐìuú.uèá ×JñMñA'ÃÊ->"õ ‘ÌRŠ#àò°Š.G fCŠÉ–ÆÛöˆà̦dºm.›£O‚ã^£‡†ÎX Þ¢ŽiF°yâÁ‡üo•3(§KCË=Ì®4ÙmK@"aé/ÎäðE¡uHB¸ý:Æ ÓÛÂÒ¹ÚOn+eÃh·ÍVݶ¿¡ªÁÛb“X“X1%åÁ绶ìL±' +GÏ´ apX[‰CUۖøŸ¶Ìܟ}©b~w%H›[Jw¾›åÔâu‚”@‹Ê~> ±†Œ/)€ZÖ Š9§æ­ZŠàJο9A¯¶½mß÷¿ÅaŽ›ƒüэA•ا[«¦(.áåƞö#)Ç.nVÝ«XËÙ°AR0sĢ̕Z(„©yQ>FÙjó×ÛZÛ݂vŽAÁG7Öè«°Z=D%á% ++ëáŠÿ®èœFWðH:Q²LÒ lOì$ëÛXÜØ +Ù¢°¨ä°ZP· ‰…Ðvè¸ýœ["Àæ ÈI³®m’Úä Ùs ¯(ª¹åç •çì†æ˜s<"%È—$QÆ ÖÇö9ÞòƒOô§ÂêéçhʕϡLX +?dQ‰Æsˆâ“Ø6µ=B¢¬ž¤0êk~V¿ú5@ œ >q˜Žã§ØS\iŸ?>ž#dÞwÎ(9êòÒߘ”¾™_aÈ —Ú$Óf\6ƒç¨ãŽªùí¾Çði*V°Ð_ œ 4}õU/ô £¹º¥è¢Ü{$*´A™ƒ*5î˨s† +À†¶½÷Ç×}u‘M/Ñî®oCÕmË8SŽ]Äû«ÊۚÿNG‹¼†Ù¡ˆ*Ž¡Ð©“P°\ô~œÏé-ª^¿&@HnÔQï +ËGÑ ”†gUSž˜ººÑ¼!W£¤›ô› ›ñ²=ñ.£Å»S|LŠï6‰Ì¨”)a +)ØÉ0Ꭿ#zãšÝÛðûùÊ +?¤ÞԌ٩ϚÄË úÊܲ'}2·Ùî²RïԞÁ(EHWÕ¢‡­“7£ì¯¶kKщcû¬,Ž —:r1Yß™(F·ušt‚íD™´2Ož«‚„:I‚>.-Š2¦_Ïöü§¯Ì9³ªR£pƒˆ©¯“iÙÞðÇÞ:“6 +gG&À2ÅÄô†5è|ìBºCõÑ6µËxn± ¿ŠÜŽ›JòÑ~óe‘Â+Ÿeúõ"ֈµj¦xZ”÷^éZĉ^·95%Φ€.¿'MÐç#›b)ÑíDóK£}Â_Ó°ÜãÒë#j€¢ƒ›lRU®Ù*¾#¢ØÈFü%…±Ž«O"jB=2:?̄RáȎjð4Òò;iM'9åãy†löžÎIæËè[ºÏŒti¢…€>rà!ÜI؄CèqX‹I|¯ÿ*ì1§¢$:!øò‘Is&ŽP!ãüa–ÏÑK0Éb‡ðÜ©C¸ûØõ·ł© +˜m…]¥ S6Iáoè’p œksš7T%µ€]’>•"bþêݐXÓ䚗þƯòTã‹ÉŸûq'˜-€M“n›$ó«ÖpÂ8f"ÃP×!W¦©9<ÖÁ£úޗarô„Kê4+SIߤAr2ÂÒ*ì´Å„Þ¹‡*´µm`D儔 €My¹£MókÊ7¥»KÀȟ¡éí±ðs{bþ]ò)®P5+5ÚUvø$ÚmÝZڐÅÇaFΎÙUIô)¯û"ñf|x%(%Ãg©s)Fñ=Y_, Äâ=ËÖºº{,É ò·ws Àxä靸XõX¶I’™>ÃÆÎ Æ–ËcÛHԀý_“®»ÑŽ{!íõ`ÿÁ9˜ßâ yMóOxå0Fè„"‡‡zYª‘ ûÒ¶h¤ÙUrå€q¶_àb´÷hÿJ*|²µH—2On#ƒˆt)Œ[J=ž'{t7¾€vÕ(ýÖîN#:–ì«qÛ^»vÀL;5•»ÒMèjûýEiT±vÎl³T +€„M:¬]¹NщF‹0¾‡CŒ¡ýr5—Î×ûüB„,[;~­Hl>W¬¤ò5_Ÿy„Äø5x£ “Fìù±Šq2øÚ@àzˆ8<æ̵ƒ .s:Âg$5¤”+ ^÷-!0žR øZ9ˆ·¶ îŸÇò°°<À’L×£€±öu7þÅÉ)g7˜Ÿ_o¾¿†|:Snˆ(ŽC·nk£6Šé:#a$âò‡Ãk +xG҅ûàIĵs—x6ȯÌÿH$½ 1,â&UÄöŸ2š†¡&xa»|´º:lgԁâ²B¤Å€;Ž”À®b‰Ê ¥X#ç!íÌߥ[Ø0ý¬³¾áVµÃÙþ%5pÒÌË^Ñ0c¡¨vþLë¦ñ´s\3­ò  XC¸ß!ð é<N¬²pªvÄ0=4åZ³ +³•‡rñ“ߺæ°`±œÑގ¬3o蟟z¢vJr$í(ƒ +íHÒ;rgWdd©õ¸æN£p}:Î*»q¢„‘¸Bº,ö¹~"f3v +êÜѐ¥jbÇd5 +é@a-¡#8~Rºš€ÃÎ[„†ò³vqoíÒaÐNÄ҆­Ävc ó " ôŒe:D×°Rã…Jû4{Ÿ7—Ü?]fœœÄø:GÕ'NV+f¾N’öx´7PŠÙòuGÜbÝ!Wäɵsm¾e_'jã ÌÚ߄CR`Ƕ?Ëv°»Ö6ÿn)âp%vmº™ÕÑÄNŒÝ¥{ĬŮ¡` »mÉèUbƒjܯT9ØÓ¡04žÔ£gb¦^‘ËŒ’@<èÇáÀ>F‹E¦W^GkG¿ë>_2Bw2”vïQ½6HrHÖ¢ùjEÀXWgìë0û„ò×!=”Ñÿ¥AsŽåQþ•…ñÓ(ÐtÛ«s «½§u‰ž_ä‰÷i(~Ýz^JÜø¡]‘ý/èkÑ +ÆAÊ<},Ò 7"nÔF)Û¯ÓU ÅmÍœÇ @۝ù DÏh[ w2£¯û¿ðtÎÐ{{ÜÜ@_Ã[5ÓëÃ9à™jvÄ°B[ZàkøE¹§¼ÔÖM¾> +MAj0Il'´Åg!^‰_0¸Zª˜À  ¡[- +83ĝ17ðC†¤Ûž•N]6œL A7Ïñfé&bÝèÞÞh{Dä´ÉSÛ-ƒž”CÓÀ«c%Cð ¬|áÞ®b–-Êc8@Ž.Pˆª»E-S`† %@À^h±t}R?l”þæ ½‹…·o{•Ð— +S¥wäAYiFÍ%/Q‚&ΫC˜:¢±k ™8„&9¼£#È¡.©4‹ êýìÞ½ùÕYÛ'jÐ{JÌ §pÐmGšk×R®$,ïD„˜vi7“™ùÙ@^ú”pNv.&Š!”^ß‹gÒ‘ß²hâGæ^£ŠLğ\ð’ÄSqþTQ—% ×#‘hI†ðIq$K‡î+{> ö¨ ¿Ó¡ÆY„mŠç¯NôиÃ*&ñ&;CKBJŸYâXóÞ^IGH &nþ—Ç{’7À…’I´‰QcÜc52HY~ío¡SÂö µU߈øT2D“žÐ¥´á­v/6âm%N­üšÝ¼n~R³ª¾?Ú|¹Ý±J°º×'ÆÖ&ž¢Õ`B‘xE" ·ÐC5¤´±u ½Ž«Ñ3%ޟ²ÄöàÜùxÛ¸«æќçþâ³X§ÀB°î€ T#p«ì—5›7«Fm K#LYMpðÕDšzñû¢8™V/ñä2ó >Ÿª+©Öu•XH`ÆÐ Õ,-ç¡u"ŸK‡W›]Àʍ3'¢Ôp…´36© á҂Cn4×!^¢ââ×N˜7XÓ¯‡õ8¨¡ÂŸh"³¡dõ£üs£‡¿µË¨ÓR¯I kø¦I D`|ŽÒ]ý3 +ÝŒ1ín`»ßA궍±=ÁAY±XOà6‡H³d ‚‚\aƒ!Å@~9¬ÌKÝ5uëÉÉDvPùRDd=J“‹÷sXÚþ0¥eä3UÂpi—½’··ˆH •äûBÛÁ‘~68=vh­ÌVŽˆ7Ύ,’d{äX²Ë›Ž¿Ìd¸­Û¾ž=Àqï<ÑÔøÑ7<¾ì)&Xw¿ç‰ïš#ŠÅڎ˜˜=ÆÈNðbö{¤Æþ⯭¶³‚1IøéÀÅ'n ¥@yC]«Ô×&wÏ2±b=p®œfJ€£ÈðÍ.‹ýìÌC?ýԍ0k ŃÚoÄI·(q¸E¸H= óKQYŠÖÕdC¹ÐÂæ ™ƒ#–&ò¬µÀM7¥˜˜ÿ +á|G=A+#è +QçT0¾Rè¸/ò¿ûV–ÄÜ­ï³ï e8¤3 ¡¿ Ø °xYé ‚Æ*æµ¼a£-á>:ù~È{h¾eüè±"1„™¬t"ۙ4³ƒÊԛ Y˜¿*‘ñ¯nP!4ÚêÁ~’qCaJ4K"å Æ¿>p+‡„uôi::8m'OÑ[™/Ô? ÖÆS¶‰PˆˆF–°:ÙÜÆVÚ@‚ãðÉþˆʈ€Ý—=ù,06d÷Þ´bw]7çEŸò‰qÀþ„P-6æ‹!ٙoß[f’˜òȱH¥–`wÆäqTA+€Ú0P~«AzˆŒg&²O­Ðfˎƻ_9€\o·óûжÛx*aîÎíEÚF¿Ô^_ßaÙ̔í«]±LðMãó-Îݳd![è±b¨úo‘TZ¼ÜK„Y3uX 1Oåý#tÃ;œfӈí¿‘Ú»Íd!Ó£êw+dcMSë¬hùE)Y\Ûå!ãÞþ}2H ¿Y v füj+e_›tÓÂ#ÏpFe–ÂJ©ªñBžÙžÖ¶Ãë¾Êd„÷Û/*ä]ÛA/AAw±<ê»J_v^IHÍåë§Pµ°ÖC–¿Æ‡?|0PFÈVÌΧ›ÅŠ"Í6ù⽟A<ªÌè$WfÝjM'dþËKÖN¥"RÂÎ|«¹PëIssñºõWÔÕE|¾™YGú­àÔM^ÖS’jCÏ ²~ÜÜ#d.°|r3^uOÂ[£€û ‡Û¸%ù +7²n á泂g#æÈë7ú]¬“%v׊–ñdÉyr¶ ÄøPll„Qr´ 2-³M'Ҁx°-ãC +¦ÎEˆrÃ<V®/ÿÚ·R¡;Hêv§â Û©1š@B÷Eb¢Â&ðwZRõ.èg34mÈÏùܹ¿ ã$ãþnÑDÍÝ KòñÁnëjK$׆oؼ9f?Ѥ¬oˆm;^ŽÁ±aùƒÑ/±ÖÝW…šTåÄ ¶$ÊÃâ¨6˜<^ ¦-†›1½(±pSiÔ`üíd+â¾ÂÁ ÛZ4<™^"­òúIð^'eŒ¤oø¶+ûþ¼ÂŽv` +{<¯g·N<À¡†aÞPòn’=‘üÄRo*‡Ð3ûj÷|ý‹ È݌"¸EÝ\VÕ[È㢣ƒM“¦Pf*b¼;!ÔÒ¤»=LÝÚºº¾qǸ‚díIlÊ>zŠtê6¦ÿ8×v‚<ïG·_«…>ߜ²×-l­Y9'å=Eª¢‹£bÃf+™¹¾²‘ˆ;M õä`XŒG&¯g6·Ü¡åª5b§@EË +‘éã¬ÆI{ÿȚV©¸-S³ßpÆy~^«J(yäúÀg8nàÎl±4“ô]¢ƒÖÿâ3Bºæ¶k3 HŠìªHêg¤ Œò– Í=NÈ Ä£(¦#$¿»ƒéçWÝz&ª-x>µ:^©›ih$-Æ…äl„öî1G˜üGdn0,½{´L•wmŽ(¸h•ÚÈ}$µŠ‘ÅÏà)™<ÛÖ`®Lf)E¦XDOð˜Àè÷TJU¢kuZrÜTŒßˆ<¯¡hÜO‹x•uuÚà—•r›=¼KX^Ëî‘ÞÅZ&X„¾ýX +(‚E×kΧ=>sUÚm,—,@MÞøY?]ñf)0S|2P¥iݧ%9[8ƒ¸¬™“2´J¬Ì+žAO„Å–(,†¬Xf录5û.ÛÊ~ztü›…ZF­ ¡ÑÌLOà mô¶ÿŠÍ›áá‹Ñ,"Cô¨ý™àਠ0 6~5¡P&fÓÿ,X•·dÍr½[P6JO df…²Xe÷¼ü™tW•”GZwò”Ïü Hê6Ý¡EtŸúX+䤉gäõQ±£à˜áwúëÎ~Ã~::š.£jÖ³¢í–7z¨rutŸ†¹"hPR4…ôƒåÞè̑0`xO/1Ô29ì ×X|È™F·“«h9㏂ýû^fÜ¡ü‡0_ŽüI ™Å°´ðQ”C)®óµÀÐÕ Ë¥ÈlH*ÙMKƒ‰sÞ‰ë2gˆà@RV)3# #Ø ÑÃtxàÕM©è,IÙJýc˜ “í녍ðRYÂ/O{ZQ|üÝDLgM©º ӀmTa²Ýb)+23žþ²tJ,¸MjòŠpñ/DÎA| ô‚–Š¤*ɂÞ(ôŽ„ׅMŒX¿µH†óҝºµw½ù_‘_$wÇ?#‰ w#™þâuáÇZ@`ç#¦ù<½9_x2 x¬É!‘ +Ýn!§!°ÛÙj›{£ñD’}ŒkתíÊÏ–r`D0@V†‰ 2Žæ[‚»²ôü‰TÂûÝÏŽ6ëT®_P]yÔ ÂyߨÞ4ۉ’åûxwå¼"ò9±Êf—ÝÕ´'ˆáJîè›:÷šI§ÖÚ^åjHä…!†.AÃBÚ¡a-ƒÐh½ÝíW²paÄ&Ó,ò€û—"à6;Õj–8,1Š +·Aɖ€qäZcì¹r/…¸B=(™ƒeDSÿFs·yàŠ­Ae”µ`èO‡å2?s2@£ÌqÖË÷P:ÄvfNÇñÓ§‰8xVMEøšVŠp•9ns{@ƒ/sÐCU dŽ°\Àú£Â]aâ¨4y|‡Îø¾>”A­2K$u±ÌÚÆ}8ÂÅeV^=·ÓKg©x¹CÅÜáiÑí0D¹(¸:0âPê@@ÇÆÝáV‰]ÑÓú¸ƒÂ€éOÑe+ÃÈlðÑ(¾°þâ@Êz¯}$±gqbCsŒÔ1'F.X§=vØÙzïß|¢>0xËŅ6Pò¸ÊÚî³öŽ[<9jœ%5ÇH7‡Û>0©yƒ©Ï;[Ém(Û- c…óG0³Ex«É¶Daω!}¹ÁΑí¨ô†êÇY+"T(lÑVå ’€LÔ”jêÎQp@–U[x “Á(h‰ÄÎë0“‚Ñѐµß½è3ï¸>Œ™*¾qºs„O” ’#Âԇò(–kœŽ®-HÊ/ƒjAesÅ$À†vçàå]6^„‡zÒæ–hV]¶€˜ NŒ<ë°2ë$Í™+žœ'%ñ¡7 R_¿ê¼ ð|˜ép´aG2…©-©ì²¼êF*X¶‹†ÊÆƞÛ_*á?{$J ‰§š?W¬‡, +]bvb ¹yŠˆÙ¬º·¼ùƒ®± +àMUSdQš?0«¡£Þ0x‡3Ɉ.­v€º•‚ à qð)(J‘©Œ¯•aXÔÌõ:1‰B~•–+ªCÇ´ð3#¨Xý¼7¶¼5-3Q)ÑÉ^p’Öb$”áԥªñGyÙ0ý|ÍZò¾%𳯠+JÀl¿(ýryy|,t{·¿Óê–~ý¸cÆG»™ß.ul›‘'ƒx\dÖN‡ÌÌ6nÌ%~Á*hm4rÃÙèÈcœõ?ñ+Î|¥'…l½™ºäLÅ©q·E+9èdÒK&=]0qÇhâû!'*`ÖÀ6‚:p:K~Õè7ï$Ÿ jM ¿í6‰*ì›ñž”yFìØpDßdÛéë¬ešéjg:òmÄÇ[zxKKZGf€ˆÊ$CP2±–wµŽÄp1„±Iô©úœdwêÃØ1òЃ}AåvNòõ楜_±œÉzXÆIÏÚÓbYPG÷Î0âð: 2E¶n}˜ ²`AeRwWO-£¹€{R¤›Šôsñ,ÿà6ÉQ² fFh¤3° L–;њÅƒfßÆ]ÃK¢¥ÉDN.âH¥xT°p øÀVóÌ@cŽa.o!@͐¦ÝoÅ7D@@ú!ðbm…ZɂÿHd M`ð4¾eŠÚLÌÚ³°y>Èí²zÄß Ø‹™F¹ÂžEJÌnó©ˆ(•Tzý-3y·'"N¢¬²¸&£È‰“a‘6ÒÀ‚3ÌU|Eå;Ôõÿtu®êÁT‚uè+X6ýÙ:«6Ü'5½[,þ6‹‚¥†ÅÀςþ׶‘uÃ1È ‰ÅÎÆægÆqØßBߓ… -l6ž÷Û[9,ªh<#Ý,3PápÅ>Ò y€¿z• ÿá¹3ðh¹PаÂFߎuγÖB†§Às ´Ξ⧺`‚÷‘MR"SžÝ=¹¤eÈ¥t7šÎa>ßޑñù±†(ӍLK!Šo?¹â¡'…,–ŠôÅùëW—V¼ÍÌdXêB’h!EFîðD¨aü"Š)‘P`CHÙ)¤±–GóW»] ÌQ¹·ˆ9(D:R~%_>Nº˜×¾YÃù[‹s¸!ÝÁž$˜©•ë¿+Çau¾³ŽŸð¸»üdÀÓ %(š´Ç¯í?ÿ]‡"ô7П‚tÒ.Ð÷²S´ÿU•„è´­¶oÜòÛ¨ÓLlˀ-îQ ŒÒtKi.>“O¢¤ю^Œj‹T£–°^õ52—’킧k;'µ2EâôQ³ÒU…Š—iN=>±æ(7²Ôìc.³eö¸x®|z¦›­`ç½×[¤Ýážš£0[íDŽª@°TžÅ‹fƒµX =)Eb›èêHü­7qOiÒ0Ê ën´ ‡|ÏO7Z4¤¦%7¹Y`ÖÆ{ú!çËðÖ>ê=Îdîå3eÁdðŸ”ÑvwVÇYL¯ Sú”Ï}clr¥•…WoĹºžØ¼kûÐA’i˜Ôé͎’5ƒtÄE6œÓ!NH¬ YBL«J`õ2ÊfQéïó!±Ít£Pq]☱Ú*݉’¬"ùâ^R×õ‡Ó%c3º12¢a•J¤eîÈ2#ƒM¸3—g?@@šôi®^åJ6S£ !?2ão4{ŀwuFÆ‹Žðf(¦´ ÃÊõðúÁÚÐcn ¹~ÆËò¤DžIDÊ~5ö%Ù"HN‰§Ì^`z€8qØú3ÄHš-)փÕêãA˹2«u”õ3Œ²„cºàIV}–ØàöQŸ¨"”û ÂòŸ>?ÇpiXMÎjºy’JòP‚Yî-"o´iêsîbøg'½f +<ÞK(9ÈÁ5fŒquò“e¡êÆÇø{ӎh'š”¼:¦„™üK5Cz?hß N¯G¦˕ÐA!ôęk>ƒ[¼×¥1ùè½¹Cƒ¢¤ü!¸‹™"A7Rê¨uš¬:(‚9߂^(4:HÛéD‘ 70å€zÛRÇZÚÞes´O +;ҜØ͓ÈÝ3³$åHÄröS-ãá’bT1> +ÏJáE5H· Õd‘hÊ áÖ:´6HfQûošÌoðڀÑÜ*°¶>m~“këõ¹>¬4~;Ibþcbލ@h4MɊCÏêä&¼+ƒq€df¨MÝً*8,2þžÆ?)= +ßÃ}€µŽµáàÇ6=knï‡ !€<é;z˜†Q²sõ…w†¯®ÃâWÎ+Ï]êˆRóhÁ½Ïì̾H÷÷ãÞÂL ŊÛÌìvòóK5­ÅçMs~ýž'ÇBòJ¸JúF7øü»¥ÃŸ¦™ÕŠ?„%ÐD¸T¼¸”ª•FB–Ç«`Ž¤DfœVˆ9DC+Ä ù4Ï6ºEÂ(Ÿ¬j 8XŸFˆ) +ºó¢‡ç3Ôv*ÿ´$̵²U=»Pù@·QK=jœ%ñȯÚ·¦KxÐöD{öXó ³Å9yüÍ m†úéÁp‰¢+›È¢š2éS¹X8K€¼ÎŠUæn¡%€ýŒ³È#ÃQ÷k©Ûåà˜ˆõ‘0d$î[ÀD¬ÑÓûÖôáˆÚüƒ5uĤ ¹GÓbפ޾|ô8 §íƒ"¸s4­2¤—‘÷<ëÓêïÐd*<ò*ãøï_²HW»8#þ¼lƲG0KžÇAÌÌðJ4Œ† c ÃôQN¹kM`/†ˆ9TͯXýºoÔ÷`¶U _aò*ò2Êmr+ØÁ"Ä3¼-'iže’~'aƓŒÁd÷ÛL2ç¹OÐlÀÄ<ÐLnšuy!D‘L²l'*Ðr„€_֝Ðþ¾D÷8>èÊ/×|Øqÿ²™‡%A´Ï–y“€9… %B„YØ¥K0zäß/ksþAH¸êBÁ̌›®"Ìý‰³M •ï€ãÛÄ 9ÒÍC)øqF$̼Ü-̹Á2̜B wèò9@Wߖ3EÕc«ƒ 1ªIQJ¦%aÁ„Y¤ĽaF³Ý.ˆY!Ñn‚lp#hZј¿õJ„HTÎ$TÌÀp¾áYJMHTpÅÜfcBd2{kô´XúsG¼Åߙ¼PgÒ¼2qøÅ 'îïPDáÔ@à†ªý'§2yKT\JùÀ1¿ÀgåSèÜbb%]…xÃÈJ&fãâ Dƒ˜•”ߵסÁ|ÿÁ°d–µÐmnæPzg×_(WƒûŽó†ðï^*,+_~8bO÷,Ä „ú¥xäÿêáÞdJÓ/GÃ$Qò¨öô%ê~“e·ê—$Á ˜2ƒX¾Ãì—`¢³³ôOBœÓ¿föàΧ ¡''i9†æõ¸\=Ø ç´fE´.3«WÝ) nmv­Â€„2·“LÊʃ Æi0Œv¼´nÉ;¥ÿ7}ÞÀ]¤¦sœ¡S… ¼ÁÙonÇ.®ca“&ë”Né ‡ª“2?Luñs±°\î SÉQh´s¤‚V᠎ s’f}®A~”%~opÆ2Ec15p)2à¹Â¸Æ÷¥(‹L9 co?‚ Ð]“'lp«TcÊ! §£„¨`A³«S¬Þ/P1ᶠ€dŸ)F×ê˜ð¯*Ç ê`L2Ø¿T~”£ 1MtêUt=ÄM€TZøÔ=Þù8&6™iÙv•òe'C$¼ÌX¬ÀÂ'쀅Q^‡;Aå0õ5åRlTŽá]0ûƒjË­¿-«kÜÈSŽñT’\ÈWuńÛ7P¼§õ?³eŠ–6å°ڎsÄ?Ü í<\IÄ/c(TžŽfeNZ³?ËÆè y\u¾¬‘D¨ž#[¥Ò/øo|»ïm×ûF“¦ž’($lQ9JA<P<ü(rœÑ$pLMošÓj9Üv¹š3,â–ò6R'–‹EÄ;Š{•÷Bù"íZ‚À²Sä®qñ)}ߨk"ᒱUD>Òj$ ›…x iɛOTJ¡ÝÜǓÖSŽÑ˜ÈõE'˜zû†õ&׊bùÌ#%ï‡äÏü‚~Þ25»Ï8¸Kmg]‡—K"o¯éøt4óŒ£2ðQü}çpJ0ɁʱOS:¢f׌àÊç®Äɑ?~ƒ§ÜN©ZqÏÜ›¯¡¨ó9 +ûx·>o˜7 ;ŽIáqy+,1añ• ìãð\Íá}r¤Âԉ½~4x|qèj%5VkIRUéÍ)¦ŒrY +¤€:^³0ؕሻBFe¶ P¥¦„_ú“ï[Ñ!”ÛñÎKB0øÓÄ®:2+Iß84WZüÌ_ݑx UJi(:M5Ÿ µ>ßBV¦UØrÓ¢çTö‚GR9¼Æe–ž&kÎmµzâů÷Ÿr èQØÎ9qçã€ø×í¸0óḃnåŸµÔåc5”ãèWÇÑ^ØQmWË'y[ +0å(å!“"«!‚–ãP,ÂÿĚÊå Ž ,‡8ü6WË?[(‚iŒøNTÌ벐+®2h» ßçÐICŠ%ŒXËvº3z%€4c‘®<Ž ^yӉ=¬!ǵÊ!˜‘N i¹!¢Ùõ0Ae 9­´?³Æp”õó]¾_Ì0è!ÚM{1VDF/Ò'e‚/&“$Ä_Â÷è4’Åpê.L°æ»ªÑ);Gæµ€³"õK4áï þEj}–›LƒVR~ö®é–¾ëÒð§!;Öô“Ù_ó}`WѺ$뚕"µá ؑL¯Å»)ùëzJ"½'÷þ˜)fìÄHúá¾%öÑw€ üŠh’Ϧ~m +}°z.€fwÉ0àxì${$oC„ ‰Ô24>‚^7D<8ëP¨Mªz˜ºe`P +ѕC¢´©L‰mìÂ8Åh„p/#Jk~?Þ^i|¡&Ã"êç'Xé–ÐL +Ù +4½7‹XW>¢c˜så@è]¹=ƒRçLpUÌP1E0ä49Ÿ5=š¡\"è> +M€OŸÈ»F?¨¾ÌvB7v1p#CÑèË;Lܔè>¡Æ»/S¼gT ¨‹øÁ¹…Ç[gQP’]`# š4 Û¶%,½òb˝3<’Àuì˛'+_¹2öÖë2VÿmlI%Þ(ºcó'ê¥(á5䲓ΎMƒ…fC,/èæAxL;!¶û<#æ¨ØÓ|ê‰BŠŠ+ç[%ðóñ|‹~„ÉæåNˆ’›9IpýŽ¹Ž%®Fààé—ÙĸDó«7%¾qXßÞ[ðú\Ì&Á”bKOLjçb½p׉ÔÅ!ŒÌ·š±<Ür(>{Y¼ú² ò +íhë'’±X!»/‹{?qŒbõthàñ> ‰öžyäEcHÒ <¼xZº  +¾\Ö¡G§£°Òc +ô嗐92ÀtÀˆƒÎ/8<}:‡s +5S՝ñúÅö&ùêÌÆðͺ +ü]C„Ç-àé=# +¹¢8|bƒ¯Œ‡gŠ…¾$ŽôαHÒ Ê©äçdBšÖQŒ,ªØ?èR™ ê)XŠ:Šw#ÉÐý¸ €c*]þ ²Ä³ƒ8ìªçÂ;Ìu¨¬ð~")¶¬ ODVd“óÜeãÀaG¤I•gguH,¼S7|ÆüüÉ»T}‹zw¢¦¹Üì.?-%:ʳP•>þ}¥=Pà®+=•ííù™€ÑѾr 0êwðBè‘®à³Ú0zÓlÙQ\‰øž6 +íKv \aejp·÷¾ ›ŸYù”ly"sxфEI4ŁN¹ )¬’nhÞ”Áj‡Ý°Û•»gž ïHÇcø£ Ía~« ãkÂ@§bÀËùI[Ö'ML)DX À¸>ȝf—bT©_"„áÆ.ˆî¹³+¬Ìï·îxj¡•„9Žø0Õ~ +Ô1W=––Y‰xY÷«Ô‰šyUÒUUy:-¯E¨KäO%mPƒAf©1Ú¨ÞöF¼¯*A>åY—Àþ‹NUkÈ ªÒŠ|q¾/ÐTת++§ +*9 £%AÂϓª¬ÿ©U…#H§)¸¦1ѧN×󄢮ß|3Î +ÙÞٕãÀ‹Þ£¢Á<âSፑ4S1ÓOMxÄóGnõD‹r*ۀ‡ËçØ~h%•­ÿÃ¨‘I¾¬»Oý½ÈšlP›H—¬›âµƒØ”^$*f \Vå÷5¢àK›£íÈ +×ÚÑi©íâÏô€²ñøÏ,¡[Q'€¦ýd6Ó|n@Êû€vù¯u&…gr +ÇT¿d¼Âkk¶F‚æÈWV›T{þB4¾¨LíþEe‚6“s§’‡BŒƒ|{ù¡GŒ9*âhÜ…Þo|Ìü¥¶È՚‹å9˜·*AÆÒ eÒˆ Ð±ƒ£5e·8‘ l…~ÜsŽ™Ç:&8”§Úikµ’ž\"Trƒô¿D¼*G§SB@ȓuµ bõË̐ãHxé·ÙÆsµ EÆàܱkùUBÕUŸS áÐ5T_›wÆ5ñÓð•çQÙÞ`ÆUk´Š„Z:; Ïç“šà'GR’Ø%93½4) #tA ã_DՌ m;îZ±»p~o­/%’jö²çWhV§ öAÛÿzÆáùÓQtú‘¹°ÿˆ¯N­oóÜÛ¨Ú»d|¦Ÿ¿¨·2 ƒ¥Øjÿ2e½ài$ Sikô¶LG°Xԁ +®Ê%ÅÀ•«Ò,X #f@¦Í0ö+ ûâR³ö&’ȾÜK¤æ +Ž²ÝôÍvÓÀAÄW¢ŽÈDôß  k>ðN Û|ꋌ â}Ú±‡%X€˜qe~ „ßœÐVã•è7VJêF6´®hf8”ÎêaN‘„2æ%bä­þ·‚™g=({SÀí]`áÎæ‡*® M¸~ê˃Fája€ÍZÕ44Òj·ÆX_£ EHlrAŸ:é}ª­+dœbèE[ÄÇ!mZ¶¡»YžÓÑU[¤Š«›d'[D9%#ŒƒÉ°& ²ƒ®VšüÆë!Kªaº‰iœ”Ô«FõÅg¿AáàcN7ÑHúπ]ÊþT˜ƒ_,òâïÊÅtï¶ò'œ*ú¡&È%r×¾x#3G¡*eRQ\Ý@6b\¨"Ekv“M"žP™Ã) +¥(Ö/ aûøßVuƓ¡¡• ¦ÐñfÃÛÂsP(CâaH¡vß.N“žŠÀ؄Ì~í/¨Ó8LÚ¨€PD!s€¥÷wfm >wJ±i ­ÛgU°Wè\ò ¶¸Ü ÙÑo%Ž[cÅê:8hžÙ¬âÌKÀiqÿu¶¨B/=šÍ‚ªÀ Ãē‡F<$g„ç[ØX媴äð²Và#”c¶— z•f}•¾¾›ŠP *}Wtú<ç°ñD‡#‹p<Ž-÷њ ún”,D(ªp¾rœ—sСd]}ÚéAY(3ÅÊveLq~FíŠÄ)2Cˆ¤ +]è ¦åæîÈ&"‚g>t’B—o#Í0V\åòÑæRT'#ïJÈQdµø’$â3#á°1¡ÇtöŠÃSÿ®žðéQea÷ 4œëÂ#° “! +#žŠcˆ]C÷Ë$¤òRˆOM„߉à·nýUä\Œ *w Áeøª’MĘ%p€[ÓB4úúÁLkPïàøò‘Nü‘)·Ži´(ª¶"Itùpä ¸,=jO/ á—ãM7ّ"¬kÓÈìN6€i 1|üŒ±AW©ŽIR¿m¦F㩈 †#bŽ©Au·Öœ>7d ³ôò6ø‹4PÃäèÝlˆjwȤk`Åò券á,&½~fpLÒÚ8Œ¶åcbðA,¾ù2€ÂèìcKï¹BOâڋl&-Ð?&©7‚1œöϸ‹õžtç(e#¹iÐÉN|è¦é‚'=^úˆH›V ©Fýìí*'’YO=ï¥;ž ¨OÁ{ü%Wò¢2=ÿšH¤àSäûïÀ¯K‡Ëj®ø¡Çgîhf6}Ê!ô½ú 6®xdŠûA9ð/ÜšŸüoÕM¬‰:NN<ÓUé$2›ãɕÏø*êáÒriŸD¾X×A6ÑîàÞ?sþ5CC +ÓP)ù$D3±L0tÿºo¦$äëo_¸¡1’7±tªLyߗaÖ»\´`´9û.:˜Ój˜76)c&[1´‹ÐýÒó<Çþoš¬0¡Ñ +ëDG ƒË¸G— ë3ì)ñç×ï³p(%+ŽøR\'Û{ˆ¿®/iŸ±hgä[D&æa›£µêea7°!ƒ3튰•¼:ygE½¼ù*Ž­°»®|¬mØå ½>CL†¤¸æëw´BçP¢Š€[9I^øªàtgNBoÒE릐lÖÐgõH?J­ Ï¨=­ Qi∉7”q2ìèøHÆj0¿^Ý{Üä ðåïb&Z© ] +ÃCc“Käæ1åÆH:#I$#–IzÜïCXõ”ôX¬Ÿ&IOT§Àà‰l¡P!³×¤,öð ,ÅEGy2ZkN~ï~!b&ý*WŠW×BÇåÐm¦âpû6Ί|èÅèø…{,“5`°ô‡¿Ã戰êùd3۝pp>./š6iÿïǃ ŽÉÐàmqH‚hºx·v &_ܦ(Šø´5Û¡ôqRV(¡·j–§aà×÷CšM‹k]ß᪱%Bֈ|ó‰cY‰H™Æő  W´‚Þp4T½·´7¯SlW½L4I:{À–Œt$âêÙâdΉ·ÎŠúª(¥äÚI,€¥"Ìîåª ñ6òSç÷sc„æB‡€Iîâ¦LºrÝOCÚ:¡Fÿ*‚Aô tJ£È²1FªónK??étkÛ%‹tÑørlƒºpbœ÷w%vcèvE[©Q%>üu‰ÕÀâ3[& Sò/¹å,iÃ1ªTXgþ™U>¥“¤ÙZþ·A+WŠ¥BV9Ƶ •m°÷ø¸ã0ç­píbR?t75¸&šÇõ:¢bóQn^§#+DF„ޚaÌ3זû®¨ c¸”åÙÔ|\_;̤\}äIÂ&¼òøT@’| oßQ Q' ¤~oEšèǓpÃ3Ǩƒ 4‰ –Í ñ©‘¦êõ„·¤~€NŒBœ‹`Tö$¾^$óeáz=F¯ 4 .LP|Wêt¨8NþmoË qˆàPR¹WX*_õLVeÒGÍÑQ“9?YüŽƒâ¤kA £¡ó†¿ôJK§Ió,£™L|_봄¸mùò‡,-|¤|;ìqýnx%ÌB¿ÙØL*³·ñ+Ðg´‘{ڂ'R¾½uJÅí 6s¡\›½Z¯ÆDˆŽÅ-CuF{v¼•MÀza`ÙûWlÉ +³,«U”pŽÇKaEÐhЈ­uÌù xLÄ÷ùNٝŽ%ü|O€‘)>úàÀÐ!â Nä|q|bÌ͇ æe7Oš¶ß᱀™h˜A7jåá0Ø0Wü¸7št&óؚ½#–¾sx6ìɆÀkröBK¶“ÈÀŸñ[Œ…OôØ÷cÌ-øÎ̆Rªs¬&£Â¤\Z}an¡¾’&i;i1˜(¥,ˆÕÉiZUâáL JÉöË¢Øã7¾¤‚ßÞ§ÐJkJQ¿³ÿȃ,ÝÆA DŠ®¢‰w ‡©ZÆBöSþŠ÷-g访Íõ)&³ +¤ï„ vW$¥aw³ø8=™5‚wÝdR°(NÔ2Q¼pâuôÐòhõ[ÂdkÙ3%+ žŒ*çcIÁTJ‚½£Cl¿GaÞ×ܺËKÿCì¢)8bא-Ãac˜OÅiÉu§ˆZPà7Oþe… ¤ 'P„[(´-Hªo+ü3„zª7°Xîô}îФkøƒI ¾åvƒRj!ÆͶ(ê±ÃŌùýOÇB)?´ÝÜ6œžÊ+{ã›^œ#‡à6Ý_Lf¼75h٠Р)å{†´Ùó vNK§•ZDZ}Á6Ìÿhe=Ìðø)iÅ7–;õ3·dîÂ횢±Ã-=@>ö\W$v·…乊&¹%D|­¶4Û ð +̦e碚×ù‰ÎÎù$ˆ Ò606F2³ŠÔ5aôtÓàüÔ¹ê`St +[²í1Ìjtè=ÿI$ʱÀô#ÃÁqÑϗa—þ[²)d>ª(ȱÓã`‰FxD–6Ž)ˆpýô†d7(1×bÝ>ã½³`•aN÷sljù/uȤڍžÃ±#¦X%‚)˜Øg¿! #ë-™°›¦²PB'ƒj˜ChÅЗÓëqÛçÒöæ§(kGT#ƒl.ºeY¾¶™Þ"çiޒÚÁÈÁ>³BZfUfÿ“„Õ´Gk^ÖIŒÌA +‹·qëþ ¼Ûéûžõ\E—(lÁʸkE"è.ۗiÖ¥œÏ‰%Ãf`=UÖðÙ ÐIkº )T7"‰M£ÍW„ñDlz +¸&¢°köŽ%!%UòÉ[7Ù݈ȏGEÓ6zp¶½H‘sÌ/¸n¹ÏÏCæ.ûÿöè #ìýKžÚþWtw`zÔý6zäþ;D↠쵿šÐ@A¹æíÇ~k£ „ƒ%rS÷c!wD<@Ŋ$Sô`œá½ªÚ݅LÊ¡&”1‰ á'žm±Y³â¸.‹—*гF0lO†ñ +ýÑAÏ7„ÒŒŒ˜[ à.ŒpgF*¸ó¼03ˆ1Cj”&BIT3#maÜ>›dÔÛ¯€ÖPO¯Å瘑³F|ƒž1^—ùÂw1çoÛۓЍvýR[+bzÅՂØUµÖ:¤5ÿd¬Ž“j'¸‚‘ځ¥Fñ“ÅŒt¹ÝhÃ`Àp–üW-`ÀðÃU Í<sj þ3Ѧˆ#÷¼@C!‹²ù2 ¦Vyó²¸Ìrñ¹±ŠÄÏ»øÁðRÌh·1ŠrҋI¾¾ R˜‘€Gnää"Šéi V¶&¨"îàÕÜ(jC©³¸#ú6Ñs£ïÙÇD ˜ü*áÞsG×4Q÷½!ía{nïOlFË!9ï¦Q÷RMà!R²Vi‹ž‘RÌ;îÀՑ§¯6#¨TÀ®r‡ä³“Ø1šƒï….l‚됬êT<þ$K”Nchãÿݒ£Ò$"XF•Í,Í4vÌoЦ˜¼ò_0Ç®æpàB~Ru7ÐÔH5J$ÊÁ‘PgwúÜÚ³Ý3ôÐjp›-ž ìê¢|û!CّŠj…6ä­=sª¥Î&Ёf—ŒtþÍÅp¥7P4žÿ`¶IA7ïð#Ÿïv£i§XºUúX1¥Ëј|A%rl(i11 ¾$#:급0¹#+Z|ùJvъHс—­Î$–tÌÙã=#&gÝ‹Œ  pÆ´¸Gx¼2ÑâÛd£kp ÙBÉ­KQdd Íö±ÝûSÐ&O–ÝøI0çÌi1òÞ\ ‹Ùú\(Ý?#‚(’IWuW|ð½µr³]XLsƒ@Õ&½Ü ìÓNÔ‰mòá.㪖´¸È! +0ÚÙ~Z ñGñÛ=-V>æ¦ÐVOá54Ól-âÒZ_PÔÉõ]Æ ù‰0ØÞŠ"D‚¹·7t·otW°m‘vÎXJ15 · +?ƒ+ûü‰¸µ(™3,°RanÁtLÆW“ ï¥>QЍ;ÃëÀÔ¬ûÉüÒM4:xÝSõæŸ÷ì‘ÙŠïÚ |n‹¸½ûQÄùhkRQíÊA‹8ÎD²Z4:PwQ +Z"—þýƊ:ñVºä¤¥‚³QId”ã¢È“í©Ì:â.xö£^LE–›`‘äu3z½Ò·«™Q>AÐ5RŽ='lgf„’äÛHXjÆßM (Ê“9Ùb„6“|ÚÉ|ØÁåm‘§ôWY ]p·x‘×mäæosMÎ)a:$ê5ª;#®ÝÿØÛÏ$g}Æíä2?8Ækå ꅌÃÇú£yÉp¹ê!Ú:£VHìršq.Wo–ú] WeÜÇý2ïhà9Bí[ZûHƒÞmh4Qã9f +ˆPïwhÔ'€×¢¡‘‘!–þ5‘s%ˆõÞ¾c¥JÃü]³H!5 X Ûš!£øT:(W-Ç Ðñ@%Õ¯Ñû ‰Tá@>6tˆwªš*!¥,„“õ¡ÞÅDŒl”†e ÁS4(öíVa‡4E¬Á‰'Å:¯Ó©W™ý…h-Ü=£î.dEÉP²’$5ÄÑÑíSÈ%&fżR³‚äƒ3Ê ¬Ä¸sXZäÑ%„+ ô‹À )qv]!œÑZâQ”ëMÓ./G ÑA6+/ ïüày¬àº44vK0‹[x%¾´ß!ÌH+ñ¿oÉu²Ì5±üÜ2¢?n’ÀÕ"¢¦Ìc$¸¼*h¢†!Oßäi”8f%á“ï€çÉtL`¡¼à àÂh NC2π°º‚"YP"·ô¥ª7¾§‡2ŒgÞ0xÜÚ§¤c:‡w åÑmÚõ`ÁËR!½Þ­I0ìÎø­Ø—ßpzI3ʺ` +&su<7Èä¦h›‹×:gX>ðùÜm^ C~&Uù ¬ùðRӌ²¦žº ºLÈN0í}ÿ}Æ}£ ٘.0r;ŽvÉI¹CZaÆê^_vI‰Û¤‰•‹h'š˜¬ì;C‚䛊Êty@½œø»÷Ðxëýµà癀É4Z{G1ú9àeK¹•pa†Æb€^¤_<4¢SjN³ †íJB¦k*'ˆpLN¨ÞÎøÓÚpCã†7©ÉÙ~± +º VKPÕ§ÑÔ|ïsiÂì~±x[#î]¦x´ÿ¸J;,룡£.ì î-¢q.·¬|’ÄØÆÄ ŸÈ+¯£ ©upíæv¿¾6"ëÁS¼ð Aø„+p2¨’ìgá‰5’{FñGÜû«·è‰"Í4Zd$}EÜK?ðD¥‚±ÈÞ&xŠc³+rE¸’€³ÖxRÐÀ sù÷ Ç?%ˆ93…âfa:îޑü‘{;áR +3C÷Ù&œdh‰J<²[%ț«¢N+`ùÞ ‰+ X!9%¨Îšä‘í—û.ZR#º£@ËsWéËÀª•‰½ÈM›1´ CDâ(®Ó½©Ë$aÔL.Dâz*|ahâ÷Î$IډA xÍ`¼àєÊF/šó¢« 2¢QÏv•å—"z+½ ¾PäM[.5…¿-"0áEHMp>Z€+ò {ø9"´™iÏ«ŸbHžŽ¡r…9aÞyˆø*èÖ°7“Ýæþâ=Å=’—ÿn´RÁö;Õ¯’<9êä* ¡Ó>³”¦pü7£’yý >™Ož ¨'ôU1hqCfÜëDnT¬.P(Ð9«Qljäd;ô`%º&•¢(~F¶ aôë“P`dùÁlB + +ð ¯Zò'ÌIÝq_ÔùŠ©6 -Œ€DàG|nM@I—ÞÃ{Ýi7¹Ø¯‚TÎ@c!o¬P¨ì*~ƒD誊¥'”“W*Û oe¡x†GàU‹D&ñZÊH°ê1•—ñ3Bù¦í˜ÄÚxÈ ,BNÑÖÊÂo8öŒ*"Ø tô-´59GSÅQ)à­>o²• ‡[³Íœ¡øÍô;xa¥T +=>ÇnT çñ0éÐßÄýÜ Æ;[vûb>ô+¼çVÒüÁœ@öB1œäûxRóOÉK'˜æ&î?ğÉñîrµ¢yn!!ì@?¾¹tÉ +ŠNK‹{ 55˜#X¾'Õõù¬¯,i™ÞÍ°Gd¢õ’è÷.Æ*Ð^÷S؋¨@8§±+ R½„&?RÈx—Á¤òm©é÷Ou->ØÍ)‡- +€É¸ìá,§(®Ð; .5´#½æµ,$KXÛoÅhá4j, ðâ0‹‹ÄðMè4?>¼0êÃnb¶ðu +¼R*#¯`ÁÓ±zT"g·î¿JÍϏ–<•äü'SjíFj&/€\dö¬ԁ¬ ;aŠƒô"ÓÀùÚ2­Š»²F§&ÀAT¤ÆT#ë1ûa,bcÀy|Uk%œÚWÁ˜Ä¦e…åŠJÒߗG+ƒëÕÈ;”›„hê•a¢×˚  úïñüék4ŠðCþ],þ<¡ÿWd×NAð‡³¢åþý… 4oªnnÆ'„ \`t%‰Õ¦ÕR @ZsrH´AkZC’M‚3a¢@³õ9Töh3ÿmp_¥òƱ²<áœP |€Ñ(•BL³áC¨â ”9\R£ ý)l)s[_ÿÃj°bç;þî³ÊR*µÛr¸3˳›ªç)“-̞b¢ROnH=“åXÖRÛHeÑÀÄK£Ý Íç‘nk·sŒ›òàE‡žã’Rx"=ÅЂ9ⓞYZÙÜ׊ ÕÓð9TuŽê´)õ›¹OAϏ= +CÕ²t¼2íÌCz’^YáYen#æR^äÚèƒU­E±ÔüMZ•š{ðÒ+—yÇ´·)š× \POÍ!TRê}eFóŠ”lqezf6µ/ii¤˜üP9ù +9œ©k8'ŠÇÇd (ÏSވŒTò¢® ù{qÝÏ ž{íl’šøZ¢©&œEE "6k'™ÞÄæt›Ç⌕ @&Y9ñ‡ *ਠãŒfÆâÿtú®{yƒåÎ'Ù¦ç‰^:¹ÁL·d ò»m^¶|ñzlú@ðzFŒ°ëªM’’+w¦¤ç¿Õ„ƒ37DD CD!> NDAø‚DÏ_I0¯º:ÖÎÀŸ¿ÀÍ~»2“™…ÏaüÍ.&Çcù#þŽ+žä‘ž"祮ʛð¿ãW€ó€affœ!O(<ÉáŠ9qâ!B$‘2Ȩ´îhÛ¶mۖڶmPjKmÛZ«{0—ÈLj&fö›o72ëån?²''u»NjDC»2D³#‘ËåÒ œd‚ðËårK0á•Ë?‚dH’$I2$IòÎaODļ8”xx^ˆŸ·x ák £­kZ­hµwí5 mہmÛ¶mÛÃ"p^5Ÿ«±›¢š6%¿ºSökhÚ¶?…5°Ö,°V°’‘™YÙPƒ’,ï'HA[6Ôâ¢5jÒ¾Jd@2$I +9d„'Eª™Šˆܺm©Ô¶Ó¶mKÚ¶um»\¾mÛtYdlÏ̘™©¹DCbˆˆ¤ªªJ†jQ5~é姿þÿÿúÿ g»Cž‡U}|ʆ-%—…«“Í„í|.ߝïŸÆ÷‘´oû£Î>Í +a‡ÜØe»˜9@Ø™¹q!9ÄÒᓒ¹HÛ¶­µ­hÅ¶í²ƒç×ýƒ­çP[œ™™ ̄™™©™™š¹¡DC43$D47aNDDD$ˆ¦ÔS‰ªŠNFT¡‹¥ë¨Ä7ƒP°‚P0È$º ˆÚ, Z&(HVfjN&Ž)3`De¨¬£GYˆ¹¨è•Ù”»Oj˜0¼ŽžzAÏG΅êÚC=uBßnôëUl}A\P$åÿbܐՌyxðÀ†Þ®F/û?~EfDÄ¢ç¡ š kԌä÷]F‚_<ß{dÁóX˜ódôYíÑrê2ü+Û,=X¸E$óÈ݅À‰­E_j A˜Ñ繑h|ÝÊ|ê…,¦SÑSÿU,Ñ<‰B+E¿ú¹Óê0íFÑg? ^šñ˜Žï=ÒìÞ?8ÙZé¶@¡ÀÃ?Pp¡Õ¢À¢[ýd}ßq¶íGfQ@ðÐ9^_¶Ðe¨pSَâqP)ÕzÑO"zjøwû NÛ¨ª¾EÕ7w…†žãº¶š,R {’ +ÑK$ÍR)À¢§|YŽ’|˜åВwú {΢ÿ˨y‡žh¿ 8ý4-†ìïxâÒËÄ©nFŽ‚Zú±uB#&¶YS…†/ώù;¦„ZNµ{™Êž¡§»ê…Þð2çxÜeè %Yþ' +磍 ý–”Ê¥€ù¦‰M¡¿Jý8HpÓ6õsü;…^êQÉÏÎ÷8¹ì1I¤í͕°ÇW-™"ôk®:¾8ÅFg³½ÌÉ¡§’ԙ£Ž¦üA¯L ød2n&e(¡5ßÞÐzZQL†Gú5C hpùϨ†^/4éÄ90éô@ÏðÏò\ºS¤_°ü·²Ã€w WíìX¸ÔÀ †]õg'Ù19¶Ö§åèÝ*VL½ô¤Tþ)«Fž}ôúì¥|ªÄIl=M¾ ô¤ËÈ49]ÁF ÷~šW¾_5 §Ž­R^÷´@H¹‘òù[8el“©šC +=qRåïA9äM€c™ @õe͇äVþE7¬?´Þ‚ÍöñãŽ=^(O·,øâ‰ã úêyÊKA‰jxZC_O–Í畂_~]îÿ$aJ?OGȁŽ]ß3C*þƒ¡ àùy(T•oPZøi3a—ß~>K(WœoMÜêó_ˆô¼K™fúü>ùH˜™Çãù,ã5²œŽ©<)ƒŸÏ£/y“C¥sÉæó¸ê¥ÑÅ8æ|›Ù®5Æ+ÕñcáLGü`¼Æ +ˆrúéXÇçóËþëkt\fºÓýÄÅçϑ/³©ÁY)$tè/-êo<¯T^“#‘:M‰‡Áçý—×M‚=ó8•ÏOu^©T5bTªmïyì=/¹ïƒ} ‹Üó³Ó‹Øå&25ÔÅHXˆç)ÛRJ΋O[ü<O„¸šÇÎ&vÆ^ç‰{:ΧÉ_nóòq|hTù£»Y{òÂ=ß[“«ÃKÆ\(ÓîóÎ_›‚»óµ÷q²@xd3hK@ ~xL^{sr›qˆ À„°Ü,MF^ǝ•.ìŽ20¸¾)z¾|«ªX.¿±ë¼y£luyܗ1Ä–Ñ“D¿ñƒÃU]Á6ê¼Ù‹FOçñ6ÁRr7÷µ8/wµUÉ»~Áîè;çÿ‹—ê9÷á¼È§åœWöÐeSc1’Íè¦;5ƒú³Ó‰ð«!¶".&4È_œ¸Q…6à$Œô¯G$†]‘çÐ ¼ çÈ0Zl·îþê½vÓäNÞs'“¼ó˜XXÁ€)ç-‡ÅlºÌ…ØèÅßü˜cs»« f‰mœ×~–¿hš?اävq~5³rëNï?htç];Œ9UÖ¢ž½tqt7sfþDdíÿòTüÀvÎ[ÚkÁùú–µR¨ÓÛ|¶3ÆݎT–PIaD˜ WξczãRú‘§¡M¥¼ÿÓ8u˜¤ëæµô0­ºAòÕ®eÆ=ҙCX†0‡M7O'Ñ $LZI†œptÔü4aGk¤‡!†›¿÷Ìû¹£ZæíoóÔíºd©H‡ÒX`Œ×N Lcúµi¤ŒD¶ùñîWUÍDþ•ÏL4>/ ûؼVs°IÄ1ô +’Åæ¥ê nfØä¢òE¼_Œ°@7ƒ7ÕöõJ|ùµ]õ'žk^ºÈôCÄ8¾Zó¯×¤WE¤Y(ºCž5߮߄<‹ìÕ|’,=)>N •ObT7D<èÍc–æ¨y†˜Uó¤ýÑáõ¾ãsïÁþ–'^§yÙt$\‰„sBâGGµ»§èu­Þ¦aIÉõ¥ù½Zbq׀xïB’£Ò|ßM˼ÜÙlÌ%<¡G¡†¾ª¦ ‘¥@Ow*ªT$Ó£ÐüZÅe#ÌÀ¥ÂÇo9Mãö™Oô¼cQ´Â%_àÙi„Oƒ"•'|3çÆ.c7&HHÏétY^Q¯™?Âê6´ˆÊzšyO†_(ö½dV!QZB=š<Å6—›ƒ‘Ö Ô~4m"~žTô–ynzê»AhÞ¡Jµ{9ŸÀ]e~w2BB©£x“Oe, cã8Z>ý?™§Cú…îiɏ¦dÞµKº2µr sœÎùj¶xAžW(Ÿ7¢À!ý²ûäE<ïsô<'I!¶«ƒ³[0»cžD“÷1n`*ªš?ïr$'D¹P0å(C #Œ\îw°“!6Ao`? ¦óԏÌ;l¨#óòw%ÏQgqX4Sb~WY…’¦©—õ*c¶-hþ€j=.ƒ:êó¨Æ”óCrJ=ŒÓ?Ìݝ­Ád`V;ÌýQŽ¸’ÆaºÁDo˜'–2&~é꿾m»¡óUZÖÖßiq:{&—ËK  ûŸ&ý«*F¯UX®¬§6^8à¾ËÓ¿—Xtì¤1tœê-Ÿd´øà–ûl—¿Ý§‰b&׶0]IÉð²Ë—h€÷˜åWxkÓê, ×åù«Á&“c7Òð>hOÀõ=Ó凾ôÜiÄ Æ —htù¤bˆ‡c<—Jë•åäDXm.¯”¿[þÍ=ú­ÏBËZޟpð]¾‡‚B…äòN@ƒÏ8ú‹®û †ÆՉ`ÈG„'Þëk»ý”òŠ]PX±È9#ÃѵåÈ[èO$ä/9Þô¬‹ü¤r© +¯JowþN"¾8‚)à~~þˆgž„ìõ/§¨ì2æâp?--Ÿl¹”Ù@ŽóÌ`y‚Zù{h½qowí`J +-Owĕ=v4ŒÏ3jt€—ýòõI?TD„tŠº\ùî`nãûm‚¦Œ,ÿ:8nªfFnÊçY,Ê`ï·nöoXf(_èÎØÙ[ë>ƒ"x±¼ÿ ?™ÁI,s¸9Ø^ùm 2Ú*Q}¬.äæx +ŠËôö4wåsbæÈÕ%½æP]Y™e¶Òy]ù"ìju&ÝɦÑܳC‰+o¶|lŽŠ6±·ùVžwo«zÞVþPªÙ´‡äª\+ŸTô†—V¾‰©ÛBâ†ÏÊÃA–vH-¯´':†ÑÞrYy¢AÄêXyPbøeÐ̟*è|JÌó…àòßìÃ[&ñŒõô仜öYC  Jzš[Œ‡³€zm¯g/ C!œÏ}ÿçŠÒM] +dÔT-Ztðogæ†R ¬å ÒäÑLâ ¾€Î·æœžõ²´«é;öeLÆg^&WxIßhÖÕak‘[>4S‚(p=¦7Ô0ƒÜ°Æ÷M͖5§Þ)„§Ð ’qwW]©»¥sYÈ®®ÕSÊçîVœ™uz¬ßýÿƒBƒ'¢ WWcXdX6Lxur¥‚RøY­ò–ø&ÿO”j'qúQ·=õß[ôjN¿džõðûȉü«c"ɀ]ȃèy2õŠ*!ó[þA䦸CrþŠ%ýL,%hì-‚HóÓè  Oøwã%„¯=•éƒ!*5ÅA[?¥#¹ÝҍÇÆ\ÄÂ2JcÜýÝ*¹vsa»}¬Ó¼ãÈYgCÐ ¬ç¤wƒÈöò^F&©þ\&×fÿk±þø±8ŽI*"8gr”Ö…$=ȸ)Ã×`øÞ8û¾®Œ€N +Ñõ!—oºÄ9þj~öÀѧiÊÃ-¿#£ØæÍ—dŅÕg¼f®ŒãûÔDàC0ç#Q¤€Jøó™õmg$ü +dJyv|@–ƒZäðw|Èý\é€g+v Ç/?öL j4 7ñË7׿¢ÆèŠÅõGªÔã\yŒ V…È fî^Öð‘áețੳ£/øyI›ÅnzLðaÂÁÞ¦î ÷ Qö3‡+^aàm©Ö)7¦<”¶ÔñdÌ2˜CeŸX°~u‚¢v`l»xЈ÷_ nŽ.ƒ°¾ëòA~*j8QU(_')eI §§6AÃ…I©è»¾þ¶£©ºòfò$ʸ:¢,2­¬gâ@cµ0ÛÑÑq¢`è ùÍÄF¸µé5“Ѽ%hm׉Vnû"¶/«3òÝAÌ#¶½0èTTºÐ&ðö:N¡XÊrÂáAT¹ïjôøbÊfK«…â†R¦ˆí·ˆÜåÆ`'œ}6#‘“'áD;’Õ¶6˜fÎÜɂ¡2#íµ†ñ—b]¼_ÂR“iœ¼NÅ(iR¾+2|Úb³ØW™D×c8•¶ $±uIâs9Ìe IËNJíÔô[ø~×E°Ê1ºØ™—Fp-cú‰Â™ÏIîÉB}E¯`J3d{ĘCøݒ#‰c°Q±`LkHEa/\K¨Rríô¬³€íQxô±ÃJZ=º×Ð,f’èAëÃKnk ,R7jˆ“9›=qöR§ÑN0¨áxšk]GJ@é‹;Vš¹AV\Ï\Ðf‚fÙp‰¼azF$S{mÈd÷d/ªœó~5={ï(lÐ|÷‰/z_ÊA£ÖèÔg¡sPI°73?· \v½¾aùMø›s@·%µííþ÷ê ‘ö?"Tøk50ö§ãÕôç‘éDC˧ë=OÕmÄ7Cq®`iüõ±²[õKÌÐÓܐ­á)´ûª¾¿¥Œu£Í¶BpeÊÔGb¤‚k`(ï¤áZ‰/p)WÀúCº%ÓV¡Îێ4ï +ž‹£.}’m0:Lo<î{4R3ó²&ì ½bž.! ŒZán\w¼íé‹1RÖ«†¬Äi< Þ|HbÔ0‹J£îÚR»!¾bñðʦ¹Z{ÿ¥Ty[©û*'ö·ý²4bÔ>(„¾´¶*ªCՂ!¼Ç̞ٗjÁÒ.q¥ùpоÇNxvŸ&ÙÄğíVöA²Oj¹·ëN+p¦ðqh€Àc¿Hr¸þók†‰À€Œ}öÿþttðQBÆ¥o¿<`Ë õ8°Nò²J|þX$^ºÇl¾ûȌÒ|¦6l­»Yö‚p|ü^¬¾G.ù†» +¢Ü h²†4œJ4ËВì99LØ%×/w}‘yÞ ûk·˜a$kb%1{Å¡5Ƃ\¥l%²F»%a‚Þý½ Œ"¯¥ÐEB˜Ð¹‹uÒí³Æ tªþY³E¥J d´÷½ÐNѯi¦U˜ ˜Ü;û$ñêæd·õ@ X(ÆB½m¦eä“bþj<'SˆýÕäí\ïWóJ7†€¿„öŠ8½š µOâìP}b#çK…Xà Wì°^:MÐ +cŸ\¯W³ýá\{°bŽi€¯æ-z¦DՃ3Ù͜#…ø„˜3 +É ‰1Œ[†‘¡¢Pµ(ÇÉ됊ñX3Ût?ö9fªsáM½>¯‹Áð"œt2,è*¥f»êWs»¼U9¿ŠÅÐsۅïΓ?"͓j¶‚‰9£¤µ• +ïõå™éblnu„Ð]˃Ž‘ä„Ù‰@!¤8óŽdj¶$•]"Ž\Œ´‰<ŽÑYK8ñ>æáå¥ÃÌ Û~ ­!BôŽ¡ËeEöªØõÛüc_jªz ¨r´6G§ŒÙ;·4+ÑL/­°Z¸@8{¶KWe\úT瑺`+H·!`”íÀ¾”!ðSƒÞýW¾ÿłå“’“ …m9ݵ¯ì^=ГOg•G¢d/›ãWiÒ*|N˜F‚r0 „Ÿ ¯^>CÙÛÕ¯]©1é~[cg™pï“u/5bè± ¼úÇã„Û¤XƒZÉT¤<ùqÄÕ¦mÏVü\¸qéKôÔJV„:>$¼6éJ¾j=s‚— ã£,ò&'šJ6ƽ£wÇ~¤þ¼«˜Ä÷2ý„o"›aÝe2µ1ÂBÁ‹qIhx¸#AátÈ»ð#Æ°¾Õ‰8Åæ bh^~f¨³b‹ôl¶÷ZEn4 ÊCÔzÈßëÀêõŽ^Ñ9ԑÄ)XÏ9ç6©…•™ÔË ëÓâÃà½/†ùx4K1T‘ Ÿ¾ú!Þë?"%O.ÓFñ.Áä8§Ãñq…n« ¬?˜þÁÊd/T¥ÑØ Ìïé`¡r¨Ø§ö^…[êlë«5D®E˦žmctg@ٍºy¦ÅÌÈıÀrl¶AB£¿«:’ÇolžD(Æåņ.Dùqš¢^81ª$Ê={ˆFG:ª³hBM©Hópiû)=žžì‚ä ß Hùׅ4?Ƨ¤¤(ábJñ âÒN ê.N½Ì×ZÉÔ{ހö-Y}ø[U]€Y¼&—Ì~ÊåhA¯³¡ˆÛŸ”xbmŒC_™íFuE‹n’ 6ŽÖٟ$€8Ù +©Qى`Šc(¡Š¥Ÿ³Ý— +óBÆúZ˜t6ÀL¿ à\]DûƒP‡¤.>mç$<²QR”h‘Ó³ºU?G‰ªöR'µÑZ kqÓNÙؙ‚„4xR‘Òh5$OÌ>ëÝh2RHX`f˜²8•ÌÆ_Xá]¤ 0C[¦î›–xC6 Ý[ÖPT!VÜ¡*ü+Û>¨Hzö¼™R€—öj²ðQi&áÔúÍСq44çҐcç·oi¥Ø\¿Ã™ª‹¨MB놠‘Òª€ñ†ÞþH¬M†Ÿ|ªŒ–r¥%ª ^¹Ð»Wÿ,ž]ä};~OPfgÅ´ÿ@¹Ñÿò§ju†cO3¹$PèOKüU$UZHè]µ[/‚ç..µ?S66^õ¡6`C%ÕOãXJûOSIMÆN‹ÑÉìiCÑ姽H²iQZqÀÊ1Æz«Ú°šrܗ‡+·NîÐy¨TKÊþÍf©~ØÏZO‰¬¡S“­a9;Kqʪ™(Çh…ªhõOäY”‰Lœ¤ +§Ds³,×fl|@=þ÷H*ۜߤe©àpÚ<òœfL"G;IE”Üýà4fȸ)ÑXG,‹$t§;r”$ÖoFYì_ÏE(Y¾˜ ¤Þu9æPNxÉìr äñãvÃ)F…`µ‚•çY¶Ñ¯*,h™´Ý´C²ÆÐ--«ºæ÷Í$9Â2j™çââö,E£Ò,mÿD˜ã°¢ź,…(¥r2óýi–ðpp–jQFKs?4s˜–D§Þ—Úñÿ‘Œn‰;úÚ½P¬Jêòˆê¹ï0ùD§ q™†Îº´ïWåe¼2ì÷MÑ&äg˜ŒobÔíe'­”nÍpnq©&«,Ýoéï¤/çï£HJQµTÝ;* +Ó +AÎý»ó~ÛF‘‹èD•ø+;ÙÚÉía2FDÅFª=ὔPÈT¬ìÁ:‚lފþ‹&YŒ¹§­ä² (<5׏èiŸ’ŠKÑшâË~Ñ°ÆÕᦡŠØä—]1íqÕÈä,¤ó8%¡0bښàåøäàÅ®³Å½=¢ÖÞ£s% ât Òú‹¾@í b¿·(¼?bÛÜgðôÌ/p·%Q˜3KNÅßóeJ)Ž?q,øúìN$!MS"Ó¤œŸ˜äÌÙiì¦û±EÀöëÅXSdXi_7½…_ @†}74AuÊ$7| :Ð @dÈ͇É<æÞ0_c¬4ë7©PN8'V݁Z’*ns]ÐÛC¤í°u:*—!`]Ca©€šŽ”(£qºþg"zP‹8®! kÎތÝåÈ®É5BH^82^b`fÆ4Yäà™¬f0¤½aÚÓ!(ù}ƒ_¿ør؉<\ +rÒ¡~=ý0äɨý5JñÌ›¥³ÒHŒ(Äûh « +&^¦‘ݨ”ߨ̸§á ¤k­çoG±S‘VcýöLA:Ș9B‘Ï ü +éщÎDy,D%ÈhJV=‡eõmÃÁ BHj<ôû×P•}'@§®½ÒSƊC«ÝBÜidÌO.Í–5¥Ìè/.›CŒuÓ³å…-f9:7Ou׀÷Ušcøþ셹w`çMlaøïà­Yx”ä¯j‰³¢,Uôªµ†k.*ì…{dÑ\¶xã”'g.WùuC­€Ý·Øؘxж¾ØC†X"ÊQ˜Qï”ëà3ŒÉ¾¦&\‰0Ɵæ؍õu¸pr‡ž€|`€‘O|"îPðîWzZá¶ý^,D+XfX:YÓbœ+»{Y¡wÿáU––#4å7Tî èrUTgÅÞí®óPÁ (à µôÿk„¿L„Fˆ°»UÑ,³¾¬n-P£eEpS +Æ (­p7ºÞ -@A¶( ‚û”7¦×˄µ‹¡­õÀ+À +`2QsõvAVñZ÷ªŠ±r­Ú릣@‘Nôų8aÒ)q™]›A}½¹¶ÉróTË_¬œÌ4ˆï‘=‚&ú+0ú¢­áµ££dêݱû(íbûR‰ËQ—õß4؉ѡ‡{•­îÀvÑ a¡¨Ýká}FU[/øR¢ƒ± +TA¥.ëA¬>}!!Þ’íYüIù¾kˆýÞ¼ów4e@²U2 :>tB³Û†Hœ6}6йi⓼Ù܇¥ô8Õzi[ö¼-À„²ø RZe¹máI·11±‰Ä¨V¹&#†}ÚUûWà‹’’úZ"‹¿ø#± ðƒ£F!ȓHoí¹MC6><ŒQôÎqáÅ~Ð AãA 0zZŒ¤\ð¾RÐfÔ°b5b$r—WFŒfc2·¢C¤/&Âþø{ÒVōìB7[èÂJÖ¸ +°ïÀxÞ_|FüÙ+€»·ô€­žÅ*Éí-¨f|2sî ±‰ÁlÓÔ¡¨[ ~j,¾k@îڍHcWæ7öpìS*YÓ½T!Z#Po­õnwoyåtÖv®q Å-m½ÛÉrPvZÁ- æW‘¾-.ÂB*‚«õË´¼js{1x„g8xÙp”i_ØÖW˜XŽJyÁ6‘g, TÂ3è#wcD?·pŠŸÓ0 Ì°#Æ E ÏÇçåºBóÐ4nò]/‰80*‰A¬šùâË#÷)*j’ZO°Xúf1ân  Íûj'o/KS”° ÒÀ¯š÷“p8i+N®AN["Uè¡=Ž¡$uKüÑ2z{¯ê’eHúØGîˆ8vÈ« ÷ÏH+ã梕³0- Z;Ԁآÿ/›H]g[Í»õµH’`¶.‡¡e¬×OL\”$Ág‚€w1i…‚ v¡Õ¬ƒþ¿êõ*Q/¦nú©de/™„a‡%´+vUJhJÎÀ(Κ1Ù¯XÕ]/4RJØ䟗Òåö–}ÏaI¿•äÂx?l¹Î @/änº.¢£Iµl_doù€ ãëŽëÚç¾ÛÁ aN±í1“EÐPÂQ.Ïì)}É·I©‰ƒÕ]õ.ŠóµÑY3®vѪäÚk Í­«Æ¤ +O§YxB$-q¦Ë¤Aݬ,erE®+¼Î9‘L7ɂD9â%Á ȅ Xó~±r.†Ÿè;` —UCíþÚdþ¶ ¬s“Òð­†û6áÛèx£9 /íÞGÛªæ%‘I8 +øZþzA+5¢ÒÄÝÿÛ͏¶¸üK­ë`}ZÜ(‹¨·(ýBÎ!¨þHÚ8*47Ô|!pD‰ÅRi£Þ„ ‹“´ +fr”bŠ7UwÏV;»<ôD_à¸yo’ 5»?;ŸQØÏUCðs¾—£«Û[JJkj½«͋øYLCE`ºª žß"êU9׶F$¸ê‰\È^=ø–ÂX®1I ì0©5V–%Óï&ìÕK;>m¼¾âDX°0e!¨.sÇMbz4£U«pÃuP½;‰œc¾8àYdBJQu’¡Jj#Ðìέ^§ÈG'ûÜÙ§[RNWóŸ"<w)}™êÈþÌ¦Tr²äRÇ÷²5-D<0¦d4 ‘HÔ0ðv”<ÊÄ ª,fÊ¢òº}‹±žì˜­Ðqq¢îf²PӚnb¶×°Óò`λÈçI-0òíÅŒOá؋Of©„¾K ,ÂÁ÷i.u”' YÕÊãóZl†Ñ¡Ëd—åìË=¦Ô +jLhòèö衾ƒmãünð€fË8¢Žµ# ]+â\W‹‡Kô^ÓpòIuÌx±Kª3,Ë o–¾±‘ïÈЭ˚[ãò;±iddÿ6A00g§%Ó,¼LxG™)6“Ï4àCƎâ: ñR¯Žh¤—Ö[Ç”Ô5BÇùyõ°œ¶¤ÙBW\ç¿ýʦo-[µÚ“‰ïO' ’@œþ4ªËG¿&‡º SA¤û@“‰Ëë›'òFDq›¹Ö:»Q3kË¢&Wm6œ{‰K¼c­ŸÂ¥p9tc@ÄÈÛ²z5ϤT,<ÔQóýý—‚_⒈šíÇÑÒ$aã|Êß=.ö§Y+#'P*©rJ$ÔˆÖ‹Ð&CË GçYɐßFfq*z3¾‚2ߣÌ7Ü(F¨ô@Ë@ÏK€ y +VxywŒÓФP¤ˆ@hãåèÂEàêóX?œ’ƒËK‹lBÄ“ÉÑg7ëz$G0\o9ÈaѾ–z(¾Q“•ß¤âfâ6÷g\dQí Æ'EuÕ =Ûb#©2*†Â̾xMW‹+ ²åïÏzyJ3ý÷#¬ÀÓûÇÁ%r0‹pëfþ(çš͙Ï9N%£ˆÖÇd¸÷•u„¤E—fµøp¿œƒç£å9‰ôGšDüw½Û,>•0vöªŒ ÛÎD84±&}½çnÀ¨ÕøQWÉ1ÏÑÕbÔ±¿Û†,kµy?øÅW–\º œåKh j­÷øLG$ºµ¹4¾;m+€üwIXE—0ÔAˆŸéo:Í.¶Îˆ©*š‡Ìª²¯ä’g£ÀcÛ0ʟ +Ÿú à{À~ˆÞo’±ÿ Œ‰\2t‘×9”™Q„Á* —_…ìxc‹épè؂9G ·K ‹jð-éuœâ¬™Vã:ßÝFpóí:Ñ}j¸È5^u܅£‚ vU!ª´hv´m›“,¤3þ Ü°Ÿ·'.]]„ª7á{4!€¦©Ð‡öÞ)£dZ ˆ¾…èŽù°r]xÓEjÚfˆ[Ñ 5ˤ‡-DÉ=çfÊÈiȂ>ê›þ0÷Ui_ÿsćž2Aá¿êÈüd³"¡î¡ÔËl7–¡j- >µßŸÔ?fÀ4‹¶³S&FÈL!Vz÷°£ŽREÒLzˆFìšñÌI )½Ð~!L=;‚À[ý®b[䤚Ë4×´ÁAe,ˆZ*é KÄ& ì3Ë{úhÊC`‰AËJPmJã³B&1žgjÉ laFÛp¢=Ž¥`b#ŸäZ ?A„ñê?ÃD¦Î³¬}oÔ±j$ý²Æ†o“ÂŽ}Aýd#È'>™ŠW¬]9ŽŒÈ—…ÔL‚÷ñ Áæ«Æ±™ꂃ!²uݧÛw™ü%X¬Go$‚ìèÙÑW¤àn"ÊLSqí®¥ÿlzrýèÕ$,õNBWÇ¥,my¸>É!­Âœ¿y£*úATÞ}†a푊hސlÖ¤%vXKRl^0–}ð<“¦»ˆ0—í¥p_ÄáôMZZv†KD—JäШ<¶sãƒQ2hÄ5E¿ªÒßíl»”¬¨ÇEÛä…ZW8 +p>бÉʲ¸#ï<Äm)‰©Äà< €ýb–Ô áq/ö¢e1L_hÄÃs;ŒÐÈ ‰N€G”8Q,@v¡|F5ó±•Gr#Êހe¹Oe*NKÊ9T´1Ê° +Ø ŠOÝ]#췅f†î²B.“Yf| ŒE.”³?#wTË=±yÚ–ÖB=\ê\ÕYH*Šg}^càT!úl]ŒÃÈN-70 Ü«”óé™Ôm³Ü>¯—ÁPâºMßcL³?ýE³knjö<™&O¨Cµ`[àßKCòjɝ¡ ÖÓ?Äã–wyüJà…ŽÁä”j +© àµÖOþêÉLÐ)Ëf²ËPÀÍŠí» ’ +¹y¿ÎÑ'd>7‡·—Eס SãX˜d2us +Xê79ùŽŽZh(*õzKci©QLŸƒÉoþ:´Õ< Æçd_¡Êb¡›zŸÌ›rñ–œz™GÉZ§†ç¶0¤{-†Õ?ʇˤ N®¹qYSêqè}-£­ÍΣ–ðÂg vx¥„¦Ëqî†"r¸îF0”u‚|T/˜lýr_«–ÖžÞÈž )ËìGP4)OD^焐Œºm}Àc> üño“Bœ%„%y™F,‹ìÕHò£ÑÀ=Å´HŽÐ%ìOª¶4†iü'ÿ6ÿX֏©â=\PöY³ý‹ßi´{RÜ=l2¥ÌÎ+4û!y’Ësõ†úÿhÓ=ûm¦ ÉÇ@?É_úù>müà½|M¿wn¯c°æü–Û}6E7Šõ¬1 çγc5rpŽªu9vtˆFwß´Èe(’¹¯x§È¥dN… +ŸH–Ûñ?P²dÍî Ô»DY[˜Ê !¸f#%a¸Œ3©¢‰9ÛÚtãß -7Q¿†j\~{ù`¼lIz£@7Ÿûú°ŠPòK×øš5Mï½Ð—Ëxi]Òêc‹0Yëó×Ó"aå'œ€:'öa¥\ƒcê ø +'¼ÿçy¬ÝJ©ûËÞÕJ.EÂ¥%¢èe@¾…dx&Ãî ŒüÂDq(Rˆo!R§ß÷EŸ9óxF¶0Âç_µ"¶0…óÖV¦·1ždÃ5<ÌÂÍ€ ÀÆÖ¤þË:ó½PB[¼¦p‰ÀF`ãG‚×qP^§è”, +1ûôèý·æ&·_­êäõώ/  Ø£h?Aۓrkhê ¢èÙ)üD+âï“4<ÔBþ€ßÅח©$¨ŠÁ/ØÏbAòiýŸôVá+KD˜÷_B%iu„:\¿?š´V/,1ê"mÔ/;$ VxE1A?¶& ì±Èé…KÆÙÅÊZâXöJVK¼Äå §·ÝÈe¼Úgk±)H:1K—¡Ÿ qâ(äî&ÏedΪ“6¿U½¾£FÖÅ`¬þ[ÑÞ+2<NŸ"~ñçi³¸ÇŠÌã°Ð`'Ó«¾PÊÓl¥ÏÊ,éBéë#k¿Ø^°]Ґj=œ%ÀðÀmW£z OIFK„ÀsôæQyý’˜w Øa üÚè-Ì{cæ z÷V)Š‹ú©|WÉé;¿HùF kömýL¬þ +‚ù/ZC6I?–’_ؚJn‹ê%LOœÍ+ó_ªt®@x#ápYK.Ú8ð Õ<þD”æÐÞ¿Èj~YS™5Ü_æ U«ûë¼€<²Åöù³h—Pßó€¶L±ð:5E¨ÿ0ð=Õ^ò&í+äSÜÁ^Ò_ FvuœéG¢=tÖ¢ y^^ûôÂTW°ÔS\‹" & ˆÊSBð̗ó?Y(æ6Hf›¯Cö±zW›⟤ƒG/ŶÔz£ÚîãáIÌ Ê୞€U«‹bÛºþõpªT˚Ĝ–ý58›0¹¼nðÏ c^\‹$?åՍZãyr…ƒÃè*Ueæ$Ԃv-ÒÖ9FÖÎnÀ¸…êáV:QÇ*å&4gTtrLÜ,´’ +æxËÐíÛÞBþmÀ„€k*ÌLû#«™úñ•Í델`g}»% ÌÀUÇ{€z‘x™ñþÈ,F¥Ó«–lZJ74’¼£îlòáô’±:cˆ;“¦}› ZL^“æ%›Æ/khR ;Ê¥;CãÕ«{ V½$•|“3͍­$z_;:PVîc„Rž¶×גPøû Ižs‹½¬òä[(× Â(cGƒ”'ñæ-SfœLtÉ=Ùò~–z¡¼ðÆwü&teàèˆò8žïËHZ‚²ó=¿¥þW–±t‘þNŸâ% IJ9ûÏÕN~É'a¡:6oOqçhGßl° +‘Úû‡ç>ºY`!R‹Z{éô¶é‚M•BÈsŠ7oøPø|Èè¿;¡pbq…–*ÿ0Qô,¦Î £Âˆ{7Zj²}¤Ï[Rõþ¹{ŒæT)*` òAO“úb9ÝYÛV1Ï«3Lói6d2žßö–hq¦¦&×¢{X1ûŒnAò‹Ç7o¥›z«_´w0ÙIV¤‡ô”ä"Ãá8I­G×MðË LcqñŽ2Á‰Ÿ9ØÛK€zîôŽ¡àUЀÛÿ|ƒ·‘˜/hŽL—P'ºE.~и˖E' (*÷§ÌnTQ„u[/ÑÒeÉóö£–{®>w­®?Üð Êq·0”šsæ~âg¬{Å. 8JÝj’“Ê:JØ8›Æß;‚ÍÉÞþžàþâèLï1«0/B³ÿ6ÅLdå·@óEa©<˜¥cK ©ákaUàñ“áÆ4+r„ô(¤a%¥»üs;aHÿT,:ý ē“ «¿›tEd•¥«ô§oÍ`²sjgR0 òrï·F£?‹֟¹#œJ +«±~¤«éÿl$Þ%‰–ŽÇ°XÇ4™†Ã^²‚Áá’Á$'è kFn×ôíT1Ɂ)Ú¨Þí fNNþTŒ5/y1‘xš¢Al’Næûx9bNäI0ÏØj +qÿªÁI <•9Ukœ ¯‹ŽÊ˜’m;À è7T¹%<áþ@—zîÏÕ ÍOü8ˆ(=»M·õk¨¿]jµQRUP­ÈÏþݱÙ ß奖Ô6‡´/1yù„¯„ ÜrdÉA!)Óñ +»#n•yˆˆNÁI-EƆÜV*.NúæÁQ‰™Q¤”¦uòÛeä;sȐÎàdœt=óz¡ª©ÛvÚÌÁ축û+èBúS¿þX Ö°ÐÁ Ÿ<ÿµÃð‰Ý d¢)ˆ@ðÿ#…_#ìG?",cVs_ˆ6o_š0ˆµÊOåÀsµÍîmxvN/è_Òå-#1îøòc_#Ž¦¨êçìmz¹Îÿ=}Žpx|Kåñ½1ʟ÷cC͟Æû:o@=ñõÞñãC *rC³øúºFŠÂÚîcM ”›pðDb§Æ6~%p²¸õ-T_ã/¾sVu˜K[½ž€~-=¡Kìœ_֌ÓÙm~è»@¬§,žh‘ŸßT~15?Éy&‘n#í ßß1‡GÌËÝ÷ßÂ(WkcçȎ4âøò©Í’º¬K±›6 Ð7à‡²ZïPÐÑÕgb«>0~È øT¯ 4 U¾#r5T‹C–(‰ ßIJLMè0cÌ(¾ÑD%• wJmsΝiʬ78øÀ/K_i½=ÚÒ÷c‰Hš ˜Ê_zo¢A½­Îb4r[ãnK‰tIãj–’ ­“‚Kñ­l6غ%>áª,øSªpdh?úaå¥ @¹â;$(…ŽðtSaR¢ðmôúÉH)ŒÑq†dÅèé0"kMðºþ}Ìʄb‘ëJÒ @작‘üó•Û (2 +"7@ò¥_p+„|Wz¥bDsĪI‘pz¦êhF¦‡nɀðÊ4†M)‘ý;ù˜éý•HÁJBý=½w8ìß¹$’"|Py"ÛQ÷|·3Ñ=‡éìž'rє’;Û؟Gè +Êðbhñp‰%»ÄÏJhïÀjQ=0E(‹àæä£ð¨iÑ<ŽfZã¡1â%Þ ŠqªJ©XڋB( uM©u@í8^Y’[k®%ŸŽº$Ò@6扯ÈäÓÙ& ä&*” Vpþ¡^A„1kF‘Q¹‹×Ž .³ÄÞc4m È8$¼¦Û_«;.áùᕻ…\&†êàpD/‘¤Œ|…³Ð>ÄZõQ ¡˜Çn•û8Ÿ»t·Ó]ÜæšGßý" HŸ¿ã«7o½MKUQ ,gK¿)£w]¶V«Î[¹gòÂi¼Mþ> ƒ7­ÂXö2Oy†¿ÄsÐp-É­_&ï¢ô%Û1Ð.>>°·Ò2ÇÖàÑWãΰ Žðs‚%†•ûc¸±‰.ú,ÀXÒ³‘)ýÿ;÷®ó9܂¢¶ÖMfG?üöbʚ˜J횒ÝòÃ&(ago'‡J¡_Ží<½ùÝß±±"ÈÄ£2XÿÇ3袹àßS!;ÐvAbÌúìîenª¶gW_PM¢L}ç€Ièˆÿ¶àþu—PÞ$%¨¨N–OÞß)Y'©g<{œ}#µMp,”«¢v (×Õ[Æ&&BFʼnÌ8ŽÈö[³§îÇxçÅg”Q)6”ÌNÕ׍!G)× Cör`•Jëc â'pL۝êgŠR2OÛ +ӟVÁ|ˆÞV¯ø÷à@@À7Fó ½OPÎÕ«t„n¤éDj8Æɉƒú¢ô<©âˆ°ùɒíŽãP¿ÀŽ}Ô/î#lÁJ»=ç¾î͋ +–úïŠÀ%Ħ¬bj Ä]ô¸" L«ÎF„ÍL*ÝrȀ–4S:T†Ø­H¶Yü³ÊH}Ú zÖÛ´ ßAÏM¨†CF¸å$}¶æÊþü= îõiUD è0Ö°c•Gí—ëa±†p|‘ˆÙIkÝW#ÔlñҜðøaµ‘!űժjÇ/à +ÀAYŽ8 ¸àIþ(`™mÊù”º˜Vi›m Umla|œ;_™ÈQ$ZÍ*¨wŽ¹²öjg–"p— Óօ£6žˆBµ ‡ñ†^ü¢duœ+‰£RmG´ïE ~#âsy@<é\¾Ùk#dõ™qU:'©ñÍ žpù~äõô‹xgÁoŠŽè+¬íË  0…©}êuÉY[Ӛ¾Ý ùÆaނ.Në«î:íý´’‘!Dq!3d4mLˆà‡û¸#ÿÎ ù…عN?x!á=œ t„éV´Ogƒ4Ï7¬l’·µÎPvD¡‡‰u¿_g¢4f[ã»$ rIËfù¨#,ÿ|%n\wk ñÄâ<žW ¸X L¦$$ü9wã_£xœÔë芄Û5†ÃµI%¼­0Gj#BošÞ¨»è+œ¸^‘­¶÷æ&g]÷o»€b€oEºM´;iùfÂhûra··ÜŸs´‹ú³WvŒªI‘êžP¢Wø°AGŒ›;)•Zf >{Ó´‡¬O"ͬœð:{¡™|À³‡ÙSè1mœ½X¢BT,)oÒföžþMçrþs*²kuϳ¼«N—<ò£†®˜‡ÙôZÙ#3 W<ôßjôˆ¿`©ÙóYM•…Ћy8oI€S‡xrJ}‰*ÖÑ  =üG"ǙU{""›ÚˍïZŸZkLï~ø’g|•Ã…µ±ô nÕ^éÐ^{1ñ—BcÖû—:>«"³Äñw>0ÒF<ÛÞ/^Ògû‰¶÷ÅU éÛÞ +ƒÀ#Û»¤J6Ç–KöÿV¿H®S_Dㇹ `Å߁¹‘ÉcrMZ&J ¥0x!Œ1¡PÕ¥EZ7ͲÕyeŸ´À:¶]qQi¸q“âJqos¥2Þ0H¿>ôÞZõ/œ9¯ñ×}’Fz‹q ÷iÍ´¾“ºÎ^ª×xøZQ͓äà¸Ãür|ð㐐*Óú3#ûÃ:Iã¡ù¦ @+GÂF³™Fks•×ÚÅ6GKyJx¨¨p ƒP1>×ôÅW\tÈ›‚b¡ÚšfNB ¬ÈÐpçï7üæºë¦Ï· ¾Û‰€ Ã1Äu7Á†j² ‰ldiľh¶ˆVû{*Pۅ[IJ´ø@aÞuV +‹TX“,NÈ,Q°B-–Šýë[u³þÿãŸÛ7¶ƒçÑéÚÙ5º +¸q†˜¤ÿ|ē0ýÔÔHgº|jÊ!}SVÉ4ðýôp MCw: ŒY§‰•ëP/±Ü§Ñ䷃ìùaŠ°†‹,D d¦4œ{t "£òàöŠ¤8PhzFrÜ®I6‰)!—‡ÿÇ|Uõ/‚&ÌXÔí*WÆÖäéÉbsÓ +æZ¹+rÀ8ñ¬‹' Sžtفúl8~@ãfEîݔŠ¼­À„Oì—ËÁžÎ§"ó„<|¡êCq0¥mR¢"óaÍ5»›0J2ÄBQïQ¿‹Ôy4¤çÖ¦Cì}D¤ÉW-ä 9¢õ2H誰²}ýíµ‡í(!Xÿ}º-—ÒÉ¢¡¡9Å 1ÀZ²¿ÀËjãS#"7cÙê¤Y&´ê1G41M’Ãäe·2ª1·ýâ(poiÁÖv 2¥ð_jq Chˆûš‚òrD,Â/¯F-Q†N1i»bâô·P›a8&ˆ’½ +3URÁê$SUO5àE 1%qŽq-ÍüÍáF>/Òó'Bç;:«]ŁèlobTûÅ +.]£¼,–!w‹é…Iîö/CÿÀ}>§ç“ VƒGdÜņ5牛 +˗ĽUäÁŽáK¢öÇæŸf™®¶?Qí *ì~¯\0¦8òÑ×Èq„çÙôIÕ?'ÑNY8YA¾M"9YB‚’“–ö `xYËÆ°2­ð‡S‰’â~0æ*uçMµ{)ß$·z¬Ñ;ÈBø\X-c‘Ñ ÷יvl¦œ§¼Í”X@¶Ù·Ý3?zH:,ºÓïaÚÒàíád%Ë-–ÌrJ~|5Ì×é îЩöÈKŠ*V ×ãcgˆÛ×ÊOuªÀ—NøíÃøàÖÄM“,À)Ã08¡"æÀDI AK¤¤GË8gË:èÑP2•8AÙò..Tý9¸1ŠŽEX’‚ÑnZ0yVÅ\X +„¦ÅEõ`O±›¶ÌÊøeùG=P<$&â+رl˜$¥ßqã!ã~|ó·e8Ã*VN“Ù½ÿùZöÈÅB@žo>H¼^AðV€wèÄv`1=kkæxŠxñÿ¸.¢‘%#×÷*îàê ´kZÜw„aÇÃÅIÌɖٔµ6ö|QaÔG9ÙdÈGŠÛ£r}̸Z`£†Sñ¯¤§LúÈpõŽB°½Ø7Çú@Õ#‹§lDÈòy<Õ T5ûÀ%³†;²Å·ÁOiª€šüåœ,°1ÀŒ“;þʬ¯ßc6>Ȉ(@s@¯"q÷À(~Þ]*s=jO%\}¤¸n,å8ø¾Nto-†üÀ%HJ€¸CdÂàìoS r}w4 À7æHVE™1¡{hÎ3ڗÆCØ}ҟ ·*˜^œ€ËÉT[A4†éSº½Ž,'„‡#J½O2¯ÒûN?j0*œßKw^'ʼn÷HyýÏcàÉzà¹X +ðjÞH  :l´Ñ0ÙΐL +ü-¤_lÇÀšo1dæhkCăsŚ¸hùµùoì8РA‹—­‘…Å*ÑƳ»è/ŠÙ·ôbYe³ógÔÏЩ„%=^G Þ¹”6±š$fÄ_i# „}|»7H\êÚ.–$ÂQ€êÛéŸZo³¤e¹nLïxӆœ¢†Ÿ"´ŠRÔÔìÂàŠÉØ-Þ A¤hŠÎ$ŒŠ¡ —ç24Bà­(-ìlÏ>«ïYâ_‘cø6ÛP…L“Sȵ¤¸#YlÜIwuhL;…ìk|$Ü»_%Y'àOaø€gú¢¹ò\߶tÌòbTž +¦)eìñ÷¸™󀴲}Ê(P#upq3ÝlÎ}#ÛªVù„IØÉï[y!39(õ¡’ “ÌÖìñ''ìé–kefWlZˆÔNaÕ)Ï9Dt;'ƒÃZ…‚펊DÑ­].O³Õ4ÇÄÉ-Ð"ÆÐÕ]ͯA'÷/¼œkB/•upÄrôì7•ßt$¼Ì9Ò7åä&  oÉŐ|²E™Íß3…<öånˆEî £XBàw{ˆˆ+vǖҭ}·Ÿdk¬S»'\) ïnèî‚*ÂN´¹L`ÖÂõý¦¡õì,†ArìðFVÌHíĀLy +Á¥š! wæk&€T4~¾¾çyDÆ ƒ$K¹ÆÅ å4m»þGÛÀêêj sBÇ7H/Ó ’7rO6å'"£)èòЬYrW:¾¸è‘bw‰ ºð»À?*Äç2ÊfLFèÑÙßánÜ2`âMUš_ÿdüí³˜ª#oÉ X—©v6_7§Å„Ž³bš4Âa±ªR?¡ÑfÏÔ¢L ÷9þ»¡', +q/U­wúåóoÕoý¶—˜ŒMœý†=Dy)uŠ?ø¥*³éÉMà(*ÑásœºÒ¦D˜µh€,Ñáþ>8ÈrrŽªŠ¦ {ü‚ÌOøÆ …ºã¿”#Ð']Ñ™â|ªjX‚³Æ "Ò@6*Í/ïL»$c~Ã=Îě87{$`‘Îì$>éQ+h"A¤åúô©ï~•7ýNü¶Á4Sˆ~,Z+@î}Ë9ä »ê T´3L ¹lnÒ+ý‹‚'Òïd‚ôÍ,/ËD§Aw•Ê®½âÐÇ&LÓz¦Âf¯ÒN /w!æP%ŒòÝÁàÑø hä aLž°5Øs[AÎí@÷Qqfa‡ zÜa '†©»·b0pÆ°«§MD«¼´Ä®ðŒ¿e@Ìhû]ƒØa‘:öòáó)ÿE5»QJ ¼]’f댄ü èz|Ö\{1p’‡€³dZŸÉŽ¼ êpu·6˜× N1ì 0¼³ö½^nEíÕ ­Ø±ù<ée8ˆÝóèÅžñ˜·ã›íyR>—’ª}í•&'õB¿¸B*C¢x ®í騗»Øa}$0;qõòI~¨°8AÆ4+;‰õ—œœ [G,¦úÍ_qš®dÖB8ºÓ£,–}`$,;XkBÎÝ9Üvègkòê æ’ð0BNäW!óXKÆ 3à º^å +÷k5ÞÓF³æÃê;½]lûg‘r78¤2"‚ +O5ÛC$²ƒ»õÐ!ÞÖ m±$Ä—‘Æ” Ãf˜ßèÔ´½`ŸíTêû«£Ü8¹·šlxVÜrƒ˜’jèÿˆdÖËh5€·%ûÛu Q­ð­ îTAï¾aÂÆ_„º¡ƒà‡áÿK×ÞÝúÄìY‰¾CÏ>JsNŠ1¨œEt¢H„‘š¤5Ea»¡ö—?ðÚ{  +þÌúx­)na…ʸ¿ÏS{Îa˜—JºRÐqÖHƒÑ­ŠpÂ1GD£ÚRÒë'àٟá{ á;P²vG† yö˜_% Èë[Ò .Qÿh¤¤Ù`{²Ä¼l­8³NçªNB¡‹îçÒ^VgÜ—É÷íÁh<§^ÉÄu¬07 §c±ÅÔL¦o]±XHò8cÁ\'fÇßi[ÛõE‘€—^',ØÁ&!Ҍ…x@ƒM8"éÝRJàÚÑd›Íô¤×n£ ÖÔ ¢å”¥ÌóãKÔïÍÉoDä`k‡¦ä%ôµ®ümÍoÞ§`ÆæJ—6<ÛlçÑ +þè*‹š~IR¼&«wPbv83˜5i!§œƒsŠÒ#Ùv¥Q„Z…þyú…ºZˆ¸%š|ƒQ@ +ß<©°t¦¶c¡û±O8I~SÆ£½ŸØÓOÐ;ѦXŽÐûõ‰g~¥îċ٭?3'›¼ZíR3ÖRFÍÀïQ×K#ù½î˜›V‘oG+8&ÝÎc46lkˆ to +тÝ,§ó +¢r½rãœx0S…c¼ò"ÝÀË/²öú-˜ ÁÔ\‹xN2­?ÉÐÛ3daÆ*¢· £â¤r‹׆=ËdËèA¬ÕtvٔiÆL¿òSԐ:is«-„Àg¤øL>HàTséØñ/ÿM`C´Éœ\‹D#Z ‚±$N0¹šß›¸ZïE”+‹a‚›»„ NÀ” tFÓÞ¨p¹ÑVçՋȰ ùï ôv Ÿ£ #2Ï µC @ &Pæ®ÌÉzχŠ%ê fdZZ‹+þÞqQÖ»übF²Ø¾.”¶pñ¤`ÄßdI®-áìp¤àš¢ÁM¾‹,GëGE+~¶5ø)H>øߪµ’Eð¤ƒÈEĵÈú7ùù'×¥ÖÊv#Íӄ€e9´4§ 7Ë ÔÌýŸçÚÂ`uf…ùhü3Z['\Bù¦µgR¼ÁY íu +#õο±7ͤãð…æøä½ÏЈ· q„nm7°«µàäR\t)p>åŠÚTpÏ0“©_E’vX¦ø/ æï!—?>ánˆÙN-ªsÜ.°ÁMØ’¯ËÒ%ª}xóFð ýüm¿ß ToÒ%L#4OԛÚäu™ØÃ{Õ»S—H¦r\ ÁTr_p1Þþ< Þ`hþ:r¶¨‚0_åÎÞGž¾^·þU8/Xgø­>Y9£^ÐúD«d+ºóvÚ·|6!ëæNIrÕq2¿#âl¶§×ìÇ+ +¤4™˜¢û¦þôåVèÞß$–Ï_h›š~zn£ƒÄnó¢0 +ðŽØ¾Ô1>šÖã%þ—QÖÎuC€2–¦JM†¥ž(7XནD´ä‡÷|vS‚mƒ‰{²7åj·7¤yö¼sað(^Óé$OÊ4¼šê”GŠ"~úf¯67Öa/µ9iÁp?ÜzKÃ_¥om½6ƒQõD|W­@Ž»¥0‘9š¸¦ù.§J;ª`¡6‘)…Qa2ƒ!‡œÇý4”°©=pÐ"FÊÉRŒ_m· N’ÃÒZ‰äó̜ Aõسù• Ò²B¸ÑDp@Œûÿ• oD×ܐÚhÅü%Úô‚\Á?R›÷‡±|2ÃÞµ\{­„ü1FññÑ­^`1L¹ÿØÅ ~lû3&c3ÜŠ[r“¨¸BAÓ;{˜ $0‡Oßô«€>Um'fèD#<à L;T|7ÔtKóíѴ 3SÝ2žc·FTø¿"þ~P„á^tPôèÜ2˗çgÂT_úüõη^tQˆ¼|!t~¦¾Næ3êñÐ^Ÿ ]ôC –œS“æ /JÉuCwLFb<ñpкh7’­›±Ît 6úñŸ¬=ž¨à’ß3#¸;CŽeáA ÜòÜï‡Öä<ûÕ€Dø"äæ ñõȏ¡å5BDì.\Ⱌ·oŒŠ©ôÆôôŽfZa"–â%þ,¢q•:…Ò›)„¢ÙAmoÖÇ) D.¡`@§¡­Ó,Sj×w±ÀKP€EDÅ5CF².? ZíŽ-óq\YÅB&±p©F’Ÿ^­ ¯@ +5ƒj ‘ºÂÑD¢ÈÕØ{Î` uð‰aŽòÆô”ä‚A_ T;8x J“‹¤ƒˆ5Mk?Ü"³y4ñv|%¿†c°Ç'éZ„){Œ,”f5€SÂÒÉ\_Âaò’Åj8Wee>íêN¢sœX ^}I&XÒ½úú„!EyM !U2Rvyq?"S­´‡½âv×äƌ™;-ºÿݔ­Àþ`«¶(QÉ`©»ùs諄ŠhM„2»¥ËXñªÞâo…èþ—[óè~wŸh¼*bBÇ™“+ !H³ªŸöêpÄÒ澜«óš‘ÉÏv‘xºªÍþÁ(Haú›”u“m‚?1$™RÅ!¥ÝÐýŽ£eMKfà w›VF+;ÑF°zRø@½JÕ҂õ¿¯ð… l½Üù šË»J§u0Í + x + xRI( +v¥€xÌÁ ñ-’(‰ +üfeóAùŒ3-¼<"TbȚծýXÉÞfÀó «ÿž ¬ŽëÓUÈñˆ)¥·‘5<„n“Ž~Si}8®7¹¾Ï‹[û7uTž$Ó(3—¢õX­a®‘ Ú¥þ—ã88Ø`1>\SžŒ¸s ûÛ]†|#=nuëá å"ºª+É<ÞØg¼vžàN YÑ1ÎU‚‰Gš¢a[ è÷Î)D3 +#„l­I}/‚ÖÚ!ƒŽÄ{›“vÌÎk>6kdE]áo"cp®mqŒ•…Zœ=ò–±A¨'p fÒfüPh–\žNy]\ ]ª&µô×ãӄ¿O@±Ý[“(‘ÅЎ¢cd5S–c0M—™ñþ /¹mVKþtOþ¯ ŸŸGŠÉVYTÁŠÏ]J¨ËÏÓ£v%@!kë ’¤06zºŽaÚ2‰t÷᳈ºí÷³úš1Óüs "i´'h°"0z—4ìûwÔ4”jw[3#}p¦ÞµAA&VÌ«E¿ òëKY=¼AYë«úcÊä‘ÑWÜçb/câÉÌ1`ù¿@ÎsD˜J¸ìäŒÄ¯–ٝ§(ˆè¹ìí<L’ÂïŒh†^@ècofû¬Ï‘Î.ƅí0ôXVÊhÓ£jb?ˆ}ޏ%‡M_ ý}3ÒãëC†Ìð¼×N=^Îx}1F°ª×ëh^`¯ý±xԑ>¤ù`·À:X–¦ú ‘­£v| ¤ÁO˪5³ªj7ÂEVz[|mgÍF¾ àû*–ZÞ>« +l<æ/E–#oÉ/ýö'˜/Øj±Ì3ñגßfmÝ/x +eí»@cÖ¢ w¡Å^™ÜŒ‰ÇµÙ4ïô!‚ç¸Sú—éµ ‚Ð)}¤Ñ:ؐ…sÖz0 @’sp‰/Ðùl_‹dþ}Ó[œ‰¶|—ÿøӌ,a_ºÅ؞äTM¶¾"¯‚áÌgš@Õ[©RH47M¥‚šÃZ†^ÁÉY%ŒˆJ-æåŽñMèɘOþÆÂâb&B¹³ul\Ö՜¾Þsˆè&îyÿEhñê!B€´ZÂħã,؏¨~ªR>ÀzrÀ8àitœ}3jT7؎GL©ÀÒ^ýî[RåQòE¼À{jɏÅÑ[Þ\†æ63ÿ™h£~ZCaÁÑ¥l¼àl¼g)Öwˆ¤Ðƒ +ဃµà×FK̙Bï`;‘-…hÝºüyÕ¹KÎtݸý¨|òÖEÊ »ËS*ÕŒ'œy Bjò7í="ýJ’½§Ÿo3ð^§†CÎh/ô”+'NP"÷P–1Xû^1«0kÐD¶è~à)@¯  +šoqöÒ‡vÇüü›9RÛ…:]>´Ó㜘¬_*N¨0—5°÷Q4†ü«‘BÝ¥ŽË;g­&!E«§î'jMa¾.w@ó‹i=`E\“ìÉc§~¡J‚Š#EûW]!eM/tÈg†Ÿ:6+Ž8Âê0&e|˜€:Š%RâÄhà€Ðãå ®#Š0êó +ÇK +×eUä…‡±¦+uÄEjJãFnO[7èÚ­Ž¶¦^ç–0‹jÖ6Áõ ¿ÐeÐOP ‚Ìw›Ÿ˜òà‘p[$.¸‰1Pqµ?[5/t Trƒ6E]yò¯D¾ùý°q+°B`,ÊÎÆ×2EƒHA˜Dè1‹Xê†!CwÞÌH°P.ñóm¬M±‚xéI]ÃU!‹‡úš¬Z00íï°Þ¿žD©à/”û s¿ë¤ˆ¨Û¿1ò(‚P ÑO¡3ðHÆ?/üÙ ß>ׂ7Îø_Íþ4¬Lá#Óóó=ñ¡—‰ i~ÀÊ,:ž¾oeÈ-¤ºI40Ox ܼÁ»ð«.ƒ‚ÁÈ6É}Ÿûâ0V‘æËgÕ©Â yd&ҋ‡ª@Ž…@Ÿ<Mù‹­5äKeŸ~®6¼ƒËLöE6AvƒÔ' )¥4§¬åð"\\ŸðÐÁf +@üßéxÝk (/B9ô ÂËΈ~‡'r¾‰/VvàÕVm'2ukj¦!dà³n¬=Te; x/}Bt˜¹n@E÷ò€Þʘ|jó&nJ­bÍŨT׶̃Å3ÚYR¯‘˜wq­™;Álµ›|mÀ ÔP¹Ó­@ endstream endobj 127 0 obj <>stream +߈ŒÒ1†C +[Ò>C–Åw·ž¤ÌÀ%˜å¢ÒŽñüe¬¯z¯1c»AmÞ«ß÷DFGߚÅtj¢‰á +쌇Ç'Ù q¥± Àj=Ä0zN‹:F­–ȨêPõ5ö¨Ÿ‡¼¦F¿# + ࣗaì‘;1E™5uAäÁÝ´ï$‹Gu:s æäb¸ô8 ú*R·­…åӐ¤¾ƒö† Ì7ÙMQ£àP½Û"QSÇ6!/s"¾‹ ;oÓPe±ê©‚„Ž¨ïèì{flx²Å"ÓUª(ã†~@ +ÇZc¥ìê ®êuiN=-¹ÿta¬q¥íÚÕÛ ˆd‡ýÔ2K$.Kö)78Ï­Lë5w©§Yó>«ÅþÂhrF•H´ ¸!3EWç"Ššæ0ÂuÑýA•v”x§¼&Ƃ⠊€r“CëÕ‘ÖŽ¥Š¶¤­ï›µ\@Œ Xë™F9M÷&ÃNXŠÿ8BÞ +Í¡¬¡= Ç•Ï­c·Õ]>i‹AÛ͔uË:|¼Ù÷l›®®jŠ…þÇêúâµ_6šVÌ@•½´,¸Ù{dÎQåöp_õ»ñ(¢Ò7B ¤Yx^wj"?9Æ!ºè°ívЂ˜£)›¥9îRÞà0ŸpðKƒÿpœ*……É4š‡¬iñvƒÔþÜ êPÉK˜³B2î;©2G܅íVPR]ÃßWp!À´¨ë®!TÓÓEFW¦Î>²8üW™f´!~UJV+HøÚßLÀ²øXÆ©G˜¨y~ õ8¥säÓ¼î"XòƒÞ7« iPelOUDû| X9”\'óOv-ÈռΨD4,ï>„ ɒ§êlÈÍÚ͊"AdŒcl)gL“(*ª ô¢”³jü>Ä®·1>Ì&%R⪪–©B5¨j³“á„ÁÁ™+—¨#â0”mÛò]ŠbkÄåÊ«¤6kaÔ<)¢¹™šî°%¦›2¨ôÞs`¡PD Æã1y ý€ –@@dˆ”„¨.&)ˆaÂ(Œ20²rÙþ㥃Š"`±eµìŽ%Ð÷âéPwuÚ¿Ý Ì¹û£Eón»_ {†&ð]q'’îM"ܔ´¸w˜$IÅñ³ÁþñzŠ%ä›åëûõëQq‹2י_ÿ5—Vƒ3]ssáý"þA…BÒ¿vÃ3ÝÛµ°Ö¥¥rà÷bÒ³¬‘²O¼1DÁ¢œÝ[‚¨œô>ê",Ìfí¾Ø}wCÎ÷•G1Úa|èð­½UV@©ÿågŠjÌ~ÅÜ¡þaƒ˜à80r>d r˧M°W:¼ëOÿ*óÑVh0¸Ó¿FI±CùÁgÂÌL†ð.Ȗó ²åý÷&jívkYa$ý‹åª UíÓ®ξ<¸½Õڇ­:‡H[òp‡T•AÅÂ|?q ýŸcÜ_ýkп÷ ¿J¼KüžE•Ú©Žêih¿yþÿà*Sg5ßù+*L×ù?.™kÎ@sã –+N?ÚoþµZ5Ø1"jÏ¨¥íû`Þ&¹jƒ;>Êü›t+>ò¢gùf=Ò~åßóM¯½5È`À·Ê?Áj®ä[øWãKº=ÍQfÊÿjö¢8(@f¬FùÇ/,-ÿÕM“D¢‰åà_²êq”l¨É¿mÓh ˜pX=ñ–ËŒxxɐÈö]¬Z(3ò\,45ToØ\O"s‹6Ëñ‡oû?npÛ}í k›éºùùúZx[ó·&^¢¬AÒ$n>ƒ‘˜`rÅ¿ÝOKNfä ÃSü ³ª½U¬ý×ü6 ¶ûM…‚ÅÎQ¡§•AFù«aÐà@Ü v¼:ü)†ƒ BáÁ¯Â¿øöNDÓÒ_➠aöÓÓýÁ±ï®%–Lá¿úÎòòÄaxôZbïqæ€$rˆÖ:ߑ+ !Q؁<è;û±+rJ©‘Ùáð~¾G•OKŒþáyÇwÚ¼—V¡œÿþ¤‰Fô(üCì «,ÎÃEæ{·îhÁ(—ìIf¾?éîýé;P ‘÷»H9KAŽïÿŠíï:9Ý^¦+ˆò½‚‚TÛ$p{ÿuüÞÿEFÎ[ò7½?Á”í›@NjA 1 ÷þYa !Û¦†¢Á-ï ]’Ã}…ŠptàfÎN±"Ý% vBîóùv]Ú1kŽ|ió@h§ªÝ?áø ]\ëGóRkð]uã;H艠Y¦ûo­çíÍþg‹ö\Í¥åtÉBáÒ~ݬÌñ½³^7¶ã;¹Ÿž_ò›û/I^20 2`à.ùûÁ8ó„ûim»¡ÀþáÿëÿȀúÿÌȜgJã——Oƒ¸eü§7rõ­ÍþV%–?GfÿŽÆÀ¿èŸÀj9cÿߏÇþ§˜¥ÿçbSûƒŒALø—±ðnö¿Þəýß)¹ìP˜+ûã…üÉþºÊRX€¤r†³z¤0lpÃܟÅ¡Ÿ…{5ۋ*r¯?¬À‹çõïé`ÖþWŒ:¹‚€À¥ÞËÝÀ6~úŸ[2úþùŸ¿;¸e×°ßIb¸ û‹ÿ0ª²‘êϔæÐ u‹V–b)ÙùbÎÁ„Rúw¯Ñr¹ÛÏy%ýufÈ2(È6¬ªßHÿ «ØbŒb *£ýoVE†ËpøùDÿ’¾h„6F·¢¿…Lô?£hû̃³ý¿¥vKô¼NÐO;AàåËÿÞ+(Aß×Ï?x­/üjÌ}þdTnU>ÿ< _¶²ð¥èl‰Óüa BšŒ­ëªû#¸à_ÁÌߦ• ýë¯|8æß±£dˆØåÆùc!Ô´Í`(ÓpþX $ ü_Ã7ÿvaøV&RýÂ|I40L¨$¨ +É×P)2ýÌpw "Š…þààGª‘ÿ¡ÉÜÏ&L—ù#“’ùæ…+ ˜ÿ*-uª½}­Bå/˱áÿÃݧ“?eé „/x¾a“¸â!égÊϤ\èCý¿äŽ.¼²ÙÆ^#¿á*ÿÚÔ"ãK匙ü”?åùí䑌”òWávNGûø3ž‡ìŠ®IÊÿ,‚ éáÚƒ•ŸüßcÝÙ‰î{¡žxÆw8Áx6°àœ„øêM^˜@·¼ÂóØIØTK¿÷ßë?°Í  UEærBÝ=ˆ.S‹@­…"y·þ›3©$þ)G<)Ÿz +Þ˕ȳe>Zó aÿúªß‘Ðo8’k,I[à^«˜Œ8lÃOz°–ÿÙ¶óßõ+oøǒŸÂcíä@=Ç¿Ãߣ;¼~—öë8A“o +¼pÍ{žüy¯ÏßyN²ò<ƟWï,ÖOnNÔ0þ™ÍÂo£nv€±™ÛûÍï.ˆn~ÿq€.þJxg2ûwgAŽ–ïÂ5sÄN%{þ ª ü—lŠ$ç-|"ÜIȘ1Hê•ølÊá¿â±ït~Üxˆßo0á-£ÆœýRèåùsB'”¸Õÿ²ÈI5‡ˆI“€D"Ո[§+kkø+"͚±Z|ÕG ˜ÉF¦CJêYþ}ʽƒIÞüÆ"ðéT|x­úKB¸Œƒš©þ ’eV‘pH׫Os†ð¿½÷»htvÖ¯ÊøÛtð§aՓÝkǟd› +Fôÿò;•@Ùô=ШÌæ,:tVÊlI£eÄøÿ^G˜Þ®Fødç§çÓúë þfdg ¨£cøy1F9 ˜àOýžµîBú#WÁñ“Ý\¸.,¿ Æ'ºƒ09srŸ"™ü)Z9 ª"eqϋŠ=15x‰ÜôâÅf«dǧ¤¬˜Z›XPüÚßÿÝ9 +©Íy,Ri8O7+ŒW½ßxތ(Š*û “n†ª07‰2¾¾_Ë /]ˆþóýŒ›¢?Çå¼zü±ô`Ѷ¶•íêýø07+=8ÊÊïôþ²Þ2é‰ <¡7zÿõr^î##1f +©`½=Î\ˆ.ÞÏ6g·ßØå äVÏáý”.·œ³SÙ¶xME[55ŠCÖôî×K­ÈŸ£¿ 1Áåéí_<í…37#Ím•#+š~ïÒ9ü[´s.÷!ޝKBwv?­©øW&—"°$»ß)·ŒíþÓ)hÈíuóç`øº?ÙË}oðßl/÷Ÿ¿`IúæTéb<>÷mApœ¼H˼ôÏ3-ùRö± +«¥Ï™ûÍ¢¤ß"ˬ£©Ü/ÇÚAõdÍs=rÿhKù·ƒ,|Ÿ’ ÷oÏÉVø(ÐWUž‹èÉr#œ–QÔèÁu·>ß+©œ·¼ƒ/%1Ó²…8?I\Æ^;{Ÿ·Ðá ŒBð’]τtbÁ^·ÿ&$l ÚSèñ¹ý›8¡þ­ëjxG(nL­’¡Ï›Ý#¾±¢/5 UN ’OæºòQ;2Uú94ˆ÷ú©‚‡øíèÙæ…˜zý?»t͆¡yý?£Åð`=¯5Y$†yןõ¼Ó®ÿ³Ø­^¿4ØM„ÝøŸü¤È‘ùu™Œ€=<#Kˆ"¤ÁÊ{gë =€éjý¸4‡í~c~Šÿ÷·,¦õg-«ˆšÈ®>²ä§q.¶ºÄÚS",:Ï1ZÚržf¥—¼FPdYŸÙvÁú»¶ÃwdDZ¿úutžýR—ó@ èpêמ‚C¿“cZØ¿«a å±X2xb¾™nõ Ó2›sEðZ›ÎþØ[lÑ.gQÀ@‚× +OÑ4Èu ~ö†LJ͜epCVÖ´`Y?õ·­È ²­+›–7õ£Mú¯ò.òR¿éj¥04J_·¬Ôÿók ^ íÚòìcþ¦­#õ•È^cVü¢þ°œô?ç[ùþHՋúmS{%+Ñ_C±‰úMP‘ò»¢MTêÿ½Ô‚dáñw§P¿Õ,¹Ïª¿÷ ªê×zøŠa¿›K-z<5Æ $N¿^ç?SºÿŽ™0„׫"ðM¿ã¨õ’hÁFlӟXFú˔(²Ñ«Z¿•wÌÔWÂö—~¨Éîó + u‚’V±c 6¼Yú£ _éǏ«ô«þ”þE ÙKõbf|ÒŸæ¼ Ø\€¯›ô-vIÿÑÃ<ârg³ÛLJtùÝ+sÜK‘y%õò«ï7úíu¾\0'՝Ž!I¼&MŸHgô››Mœ¼}5I\Œ~îRƈ IõKªþ2<]Vô_¥mŠþ“—<ór¬D¿NYX9ă¨ýHCÁØC„èÿß3ct')ô …?Q‰«|`„³Œýoن~³|£“dû]ß B“)ùãf$è_u7#Šzafä%@ú:ËýD49åD±«ô%[;)s¬Õ<€S¯Bj `?? +c÷O0£Ô‘Å;» Àr×}~}Ö¬ e…®xëóÓc2úšb)y5ìÕt°¾‹Ï2ò–KE°)+96ÕDð6ö?ˆóÑY»€Cì4¸Ÿ£Fñz»(h¼Øó@ö©³FâÁ­Êdîíü`,䚈ƒ 2;?z­:¼Îÿ²…Aü×3¬çwfóßip/æ¾/ލŒr‹ ú¹S1ð™Ԝ¿5-þïÅÇ_V”ÍŸ/ÀLÁ‹Á“óãÉ#Ðb·ç?҈XõŸòˆÒà±Yæú>ÆÙìÝüõ(U}ýušµeœ›?ûŠgüQ³Æ ‰$‰Ø­sùK֑¶`- —4MqyÍߘöõ4OðhIþïhtËïìŽLÇg¡¼×ü9²ÆG6HϨÖü¤Ý‘òXnÅy|5¿NjV|°¿‡Qj~„ÂNó¿ +83û%ÞÆÑü­ê(t5SY3˜“ ¶³ÙŽl-æ»Àé÷ïÉ$4ƒ2¤]~æO´€§"•Ú¦ìPÜÌÌEœ°Ó=3¿Ý«™îNyqâÓ^e~W`ú„pG]©†»zÜð)X¢yƏ.-íZ þ2~ "ÊF‡{‘ &ãGµÆ KÔÌ,ß\q:JåuÐâŒÅøûÑ: 1ú|#ç¡lS’X؁`üˆëÈg°pz}ÏÆ~ƒc¯$D9_J YŽMòVük{g.^§F°ŠáY ð™rNW¸s€RË-…ô)þ¶ƒ„2ãn¨¸?Ò¥þìjÖ:£•Ô§ÏÃñƒL¨àŸÆ'~š„§8ÙÈ,p?âŸCÒFüãñ"þu.´¹ñÕVRJ$>þCèȆaBîŸÛKӇ?_#¾ÿI†xÉÛ¼E뤴–‹.Ñ Ôx“"È)ÉïðÃ&­ çN&útsú±¾züü|pæ£N߇3 OÆóòw¢¢Ž6üÖ4!lrÛû[Ãokþ|dæ"Ÿ³€”/Ù)Ô¹(C§”WT]4¹)âïÍRƚÜÖ5‹"¨¹ +?{‡Á§lò맆}Ä~åŸú}Ž4vXòñ$üÅ©!“¯ÝŒ¤®?…`Ö^‚Hs‡ðÿTËn„&X×c‚­ß´åæBWF-0î"ûô ’_lHݸ+'€“]ø‹Žèáö’~¥¦Øµ&G;øŸ&>•ùÑ·Bص†ô–úç 2 +„z +M²sˆaèÃFnþŸÜDX€X-êòɥ᠀i`>ð+àBÑ5kØ¿¦Jð[BEƝ7µŸ%¢Xv] —²[2èìþî\£W>3ðß´†…ÅRÝþÀ挮Í`³Ð7¸÷½NàO†ãW)ƒ„„Úuª™†Ïsp5Æöþ, hÂ`Þµà~bFhÜTé¸6ÒoW$CÇg]I>¾ïr g$P×9ø!44?°4Ìh&¡á°MEg¨¾÷¹d†¼Ú ¶ÿ¾jº¸ŸpûÑeÿþ–êò4>?+îï㠆túotÅäQýå"þ>.£)áòo8–»ÑËNûý¾h’ƒöûÅçY¿?/Ïôû5¼ðq^&éü>#ôy÷• `˜ñûöa("EË£»ãç~!î©éôýôŠ5âàù^yéèû©¼ȬïBQ£ ÷Áö¦ zµdÕyBû ILÄû«4äBùù×6øþ›t»Å–L55ýÞØÞTÂqÇD»÷“̽_!€¾½¿C ö~ñ½ðaØB{Ù¥ÜMó=£E³@„Ÿã×ûåÂÜz_/Fã7á9YÑÏä̏]è7ú3LS¨¢_.â3¼A„ÒŒÕ&ˆáº\äÜS¿‘RåZ2™öP{i™÷W¿ºîòþÍÝ1ÏÓÊûÔ¬ˆ½n s51Q +àHÕ&2@ÈÕíid¼px_UF`\mBöÖ!ÓÞO÷š<Bœ¾@T[ºt{·÷5âj Dò¤ßõP¯Æ²Æn€î×0Ú±‰<žú@}÷YotØ£/F;®_ FЦPˆ‰ª +†‡y÷í³ž¥ã‰úŸÚɖÕݗƒ¬^R üšëwóf sÿD¹/^ÎîÓ TOV%¨ÜUrgYñt/»ŸI(¡~Ö%…ìØý$Ÿù7TËkv_[,ü—Á­}œ¥¿îg÷e‚ypcÇÜf–ûñݼÎCålÝ'•hù¸¿y³î‡Í9xÁ4£Ý5³n܏a3 +&=QZuŸŒs?sÜL!ÖG«¦îgó#t{/>œ9ê>Âܽ§ûŠÅí#ð•ò™ ð(50NÐàT®Ùwî=°-˜Ð¶¯#ŠAÅ®&à'ß Óöy{. A#s?œµíÖCmü¢Ô\â~ô@“fʧ7ç¬å¾™iµ¤×N]ÿ¨A϶ªPh¶jÊÀk&Ûäӌû†žžÂÔ¼á½>î£Û¤’„êf›-ÚþÜ!Ì 7ÉG46gûû‡dtGTÂsÃ}{d¢¼¢L±pÿLÕ&Nk)¨E:Î!ÊÊÑ8ìý8_ê°\ü—ÈŠ0ƒ˜½í[å2xd݄ðÞ~Žâ‰DOfìº0æ)UÕ$»·o9Á0Cž3i¡öFÖöÅÛÇÚLÞSÜ»ý¦"Š‘?Pq×£QüM"¢Ü>tQõÎíqû–_ŒÈ®{<ܘ_ö& ˆÈ·}µCâœyù@[?2¼lûný|]>ò˜©–{4SFå§Ê¸‰‚¯¬¨ۏ庱|7ùŒa/¶_éÉÉ_à/yÁ˜¾Ï~ŒVa—è³:FÞhÚ¯Gì†ù.gk×~— FÜì}t\ríÜt¢—iTkßÀˆ²´ÐãØ8ê"ª÷ˆz’GÌѾ‹v¼æí3iÚ¤ÂÿYò´:æ†N‹ÜMÆ÷ßÔ!Ÿôñ~𾺯^Z¨ÐPԙœ‰lRVÕÒq}¾­ìËdÔ"3’ À“ö…g&Žø~ҙtö¿‹¡Ç/´‚FzHÑa´Oh½ÉÀ'Ɓ0ûZ+a»Á֟ý…|‘š×½û‹öµm·DRzñ“÷فã²ßŠ`ã  ìهÀ§u;v¯ë‡øÁåeîìŸs0–¦QÌ×ÙçôËà7vÃ<Äᔐ·§ì[{ˆßM}°-̅8ûñQŠs!B•0q;ÄvÇ:¢$Î'û"âfÖ|A´Ùïé +{Y³ÿAèTÇoHãBP³h8ø=ZÌ$Á,ûà%h±FL;PöÊþŽßãªlÃ*û07#ÍI"$÷Xl$8úÛÔ ˆºdß wZÞb²Óށ‹O´ÙA™²Ù§ceÄžœ>}‘}ñ±°sc]i}çxùî•wƒìà Ą²XCõ¨Jýçp†Û}4¹ýs±™þõ[Èß¿‘¦xŒ±™:ð†ŒÏë²cü)Tæ\€”´yã/ìT2ƒc„C[°ÂWN?öрFPÀë‚ õû9¶ñrF¥î«q)öI vœØ÷k?Ë9Ý·³Cޙ×LßëˆÈ~د-éÌÜG&«é°/lv£¨§þP6P5 nØ7@Ë4‹£vH†}žÉPœif†Š ´"؈ÇöuÛôÂSwõôÏäz½Aڑ è»Âӂý‹°ïžvĐ;ÏÄ~‚}šûõ¨¯D#s ºÞÄ>›Øg÷?—b !ü ‚íÈXõÖ4`Ÿ‡×ÕZŒj´„“ŽúÀ0»ÿŒ$Íqs¼¾©ÿóMSÄQâ¿>"`8DÁýõ—ƒÁÐüXó7¢­s×G’DÀwyTò뛨:õmû-Âþ¦V +µÐYå:óõÓÐ<˜£eÓø{—'‹¯Ÿü†‚õ¹¨¤ñ^ß(ÓKFµf¤'Dyv×ëï×½¥N¦×ØÌ!o‚$"wpåõ-y‰À;šÿþ)@w 9}vO`Äœ3ùãÛn=|º~˜ðñî(u—ä"F[©¥9úrrAl¬î÷øyMâ%Âq(g£Ö”‹ù3iFú&)†,ƒopuWGZ_ œÐ +ÞçáúˆU¡tªË©#d½õ¡þ5.aþT—[ÿ4‚"n—`X~[Ÿ”›·Ì%pÍubšÎÖ_>@y?Ù ÆÎ8¶~\‘8Óé‚8´q~­OO$FÐ9¡äÇúVI8­'Ó© +<~Öƒõ$ô·Ú*¯~¼óÚ1y¥p>ù™€ãŠfÖ_ØMl1hªÂš ²ê÷p÷kõ]Bd}nË/23ôÛî±þ7ßyùµ?:o±ðó«ÕãMø/J_¹²äoÖ:8ªúÑMç¸a} ™ÖOvþ&ìrŠþ÷Á`}ÄÍmB×õƒëb‚ߟ1ŽaO …FÉaã ¦~¤1xSÃ7ȝ>5¯~x¤ÖÀƒÙ¨n¸ÓÆ,ÓÑ}gõ§Þ꽆—C<6 ¾¨/Έ‘¨“c&¿-]’–÷â­ ‹×U}TI•kúÛ^/ÿ¦@«ê·¼tªþÞEs‰úQÂż1õ•}#™×îñä úR¹R-bª÷ Ÿú¶Œs=õß6qù˜·g3©ßIsÄKë¯ûw¦þ-h³>±Öº¦_êã’>6X›¾›£›ø“¢Ý[êŸ&l¼£õd¹4¥~Z!©à|Œ÷ïC€”ÿ>—I¶÷ScÜT/©ÅG~´þØtyjÓ$”^6†º!aY!ɏQTÊfú¹ÝSËôª «¹À1‘þšR©]¤Èӝ„œÄƒ4$ÉD©Ø~üÒVÎB‡ö$à½ôÁ¡‘ j0Õ£ŸI©ô,¹8ç;¹ôIà¹%}êJRèL5B¾ ߑd’Zù~Z*hy•~3Ât©¼­>•þN”’杏¸…¨|õŒÿ)}ì#‹^yWß«èS[¶jŽ£ôޅûQÔEBUˆÑ/°TtsíX_?é³¢<”æÀTŠ¡&Þ2/šï¤o_*…wK9ÿÜTè0úæ7%¶Û,deÒ·Œ§hŽ©{|XÊÐÓyÁ$ýeâìMuä¾ØÄÒ47þàþA] (â!¾Š¨}ݓr©Þ#[Ývür彋ô×:]ܱ¾¬ÊDúŽÐqdŒv™Ñ\!ýœN›#Å }Õ¨ÒÔ§Qâ!F«:Ö§DRI©­öXÒ'úö­*ù*&î\¦£[ýå†7úñÙ¿‘%“Î9##?¡¯Ö_Ìã\›€’s[ú—ÞCÐÆUõ¯2úÌ{nilÑ?¹Ïqzº™ßm÷ Ý.7æF)Íb?t;ãõª|EmcoE±’Ø#{‰þÙс°ååÚ¢„>ºÅ}ãøû ¿h?ô×&[núüý\ì—ãËÏÁrž²¿já«P0^IäÙ+ôCKg5Ä$ákÏA(BBë3ÜA‘®{B_ž1úQç—Zã¼=-M¢ïs ýÊèñúM’ìØoÅmib¬î,Ë·å4Ý ¶ŽCDZN¦øò‰aHöÀ VÎì>«9Œi}ÖúßÓkA-“q^ U‡.7X~1ñZ +€ªlœ¥§H¿þù«Þ§‘$5TyL8Ôþ|![†“¡òg«Ž¸ŸŸ2À¨¦Q™U„‰‘¯jœ÷t•îóJþøùz©††H­’¬öùé Z øՃØKêâ®Ïï;iúü; f¤$üb¬á,÷ùkÄ鵡ŸÏ.Žù¤UZ¨z~çý>[è±YÔ4=¿ûø¾A†ãðvŸþzoôèùÛ¼^©²h<ÏÿÎ%xm ¸d;“Mm®Ù;âöÇg¤fñӆŠç{ –yz[AÎtÙ"2DzÆ·óá?QÀiGÕ²I¯¿Xƒ¦êãð'v~ %݅ÝXÐ:‡°üzê¤H¸Ê›:_Ý ÓùOþYùE2¥ +›¯œ èßù³{´ øfÁ0ѝu"{Éãü× Èmœңˍ\•_Ì.D<Šä¨é}“¼ßJz8¿ºá¿ùòõÍE®$ýÒè”öæËE +õžew7ÿ'ßØaǔÎíIsiæ_ íá0hx–ïÎÍofzµ†¿T§’ñ½[Û!X»# å3P°®i!š$´Š5¨ie+@æs¬oÖìæ1[#ÒqcÎ%<]×üø`»š´›·‡Ãì“:&sê»fWó)ß +U¨ÚLiã5ÿ%Me=Íïkæ;T׎Øù‡æ„¥mƹròªƒhöLIúîX½‘4ŸµO¤ ¬†¿HEóφ¨ÉxÖe9}@±¹5óçã[Õ Õr’Œ jf¾ (2èN(ù‘¢tÊüí„}2(Ւù%ñÈü]HCæ£( 5S¤2e´h*hPOwuÌódV¼†ôD=0Ýt§VV¼+Ù>ó *ZãDüÐe@Þ’W0ÌÖD ³2Š[烃ÂÚʃ ós½:Ó÷¾yš;̧N4†I©j#y*ïÄm:°:-»ùDZ9-סX ˜OÊùü/_X¶žq*+ACûò­8ˆGWÖó®Ì—Ïd£7õ{‰B[nÏ+´*©^Ç=9+%渘Đ/Çðé‹~ÿôq`ùFª?œtùß3Ó¢ÅR©lsá2*؏˧_/.Xõ·üˆ J1K÷3Öj[~tap̌~ÃEgË·“BKÝSÚÖ‰žh›,Âòvçâ¸aP(r¶9´«ó\<1N¹£Ç1^ËEÃ-Ý]كå£Ag žgXë< TÆÙ¡²_ߕA–%=ä3ÎxŠ[ù´œúJ„|c2W+_ÙH¼ÄwÏÊ'`.‡¿M}õnÍà¿"ˆdg¡òõ‚ÝÂJ¾`êOùTúOÍ[ø~ G§|: &ô¥Ø‹¹TºK:!syãIùU©n˜¹d6QÝn%_u“¹Gù–r©/=ÆHå3æzàêÝÜ¥¹%ÊÇÀ/;äÞ{íØ& Ç,¸Õ5’Õeß …òQýCޘkð±ëNË÷9·‚_«fÿT9g=*nœü¥ÉU[ßäìDʌÛäïñ—½½šFd×ä'ƒ ¼µÜèôøPŸ›Í‹¿ä±¼Nú`¬wÉÇCö~—ˆíÜy=¬6î·ÜØ7”ŸÉ‚›¸e*³ßmOX2lOìŒrÜ¿=ÈvN4ðEò{v¸P + ð‹,£Â¹q(,±<\ÏÈGJ,pÙ R{oŒ|î# XؐÎrWBímøb8“Ž†¬µõV´c×QxèñITØ ‚èùGÈõK$ÕB$ÿfCEµýùJZN…ÈŸP—H÷žr=ðÉ37a„|q¤¨}¿GIXåø (ù‡{þ¶ ò§ÃøäƒðõáÜ±úáXlÀ|ÊIþ)Ǭæçáþãç~ñ £Çr\Â÷ÇoíÆçïËQh<ˆ+_ÄûñŽhZÇ&}'á%qt**[O_ëLî- +¾õøùBÞ©÷š¦Ç‡(ø™ä<ðS-€‡0“2e0µd)!ùø³ƒ³Þ¢ô§’ÙėÝfCp*>2¼²˜ è:><È'U¥Ø@¦ãsÉZ êÕç E}ò=@"às|ò^É!­›nC#{Æ(ÄSäizš½ñe‚±£Ošñœž÷Å'…‹ßŒm\õ0åÆïnò’Od‡>í6¾„8çÓ>óö[Æ9-Ø7Ek|VH=pukjßw¬Æ·qn¼4±ÇIoóUùSr*Œ‘Ò‹…‚ŸNƚ<_Æïvn `€ òÊøÈ ¼QýR“ñcʼ,\â §Ã_ÕÅˑ f!ªJŒO1ø4ŠƒÙq…ñ ß䵍GØ-wìå‰x0¾ ™Ž‰k°òÏÈJ + ¨8JßHá +g0ðV•ç<˜Ž +¶Ò£ ƒµ—ŽÈ2Ú*Rµrþ1ä÷âwImû–ýƒKç}zäÓ½¯“„€†Ž."£ ø™£ÆhjáI‹¯û©ÔúàIü:H%ºð•ÅG,¡³V~H›¿'/GGðµ%9‡Q‘°! Ԃ¶âÓ$ê4þ2ˆI*ÂÐ=l j}'~Á¡fTû¹QæUü ³GðWӛŽë—óŽ2E¡ã³­‚@TH¬¡¢Þ?ƨåV±¾ŒŠr?éˆ/ØúGñI—tzOþÙêuø ´âێH=AØDÚD¯c'¦ÑDQ›ZéaPŸÒIs ɨ’òÎQÉï ÷© >\Im6 ֈÔÿУFÜg/µÛ +hiëãtÂڙ>¥Jyñ»4¬uevkM ÷ávjbuséü·Â¿Z«'…ìÝÐjâ[\;ӝgN—1ñÝπf×¼xp-‘ÅO àü–Qê)§6Ÿd#I_DJÂ.—Ÿ Qq¥-ê§=tÀE¼lSâSjv*ªôøu¨T9üD+н–Ä·™¡‘øcDŽ’ãš#ëS30c‘éÆ©lg"Ñ°ûx ÷˜]mV#äï0“ž[Z¤!c†¹¢BÂ'êˆ`Ž°ÝCüÜÊÁ ¨èÚÊòûMµÂ—Áá=€º’©ÍÉ e{X0¯€ø´¤ÄÀ…*ºkD"ӈX *{1E£§*ìø›—ËŒýí)# ߎ‚´(ìôyü\R^Ï3!€õêá÷¯Ì!•~Øùæá» 1nãá Üú×?BfÓïðí_¬–õLm;|¶¤,¦æzZ›4bº8z™ßã<Ã邱u,—0¤ š ¿Û­œåÅ{ _±e„ãϬ٠cúIø‹g¼9]ùâÏðO'ÊL÷¬§\Ø Ÿkðcr9xþšN+SjJ*m±×;9Q„Y ß>\ß¾'›ÉnuFÑ0Q† ¿ÆeçÁð£(`Áôa·Ç}-¾?ðÿ3Å{/ >êÆko"ÿO|ÁŠêàú¯{””ž/V½h?½9ð¯UþûvÇÁ‡ßåûø6—ÔfŽq nÉ'M1â%H9#‡ôl•”8ú‚O~*“+¬>þÖŸçøíPÑÑEî[ð©ÇŒ”€÷ ª¶ÊJEÔ ¬µ!'†òõÆ`FQ”äÇ;ëBfÌÕ¢à3b}øè BÆü¨jw·|¥@ÊÀ¯L±­÷\7Á·!û§)½æUäŠI6ç2"tÛn•o³1ªÅg`TF~ù, àî>%äŠÐáø¢ëãØ`¥ˆJܨ¤Žôô죲ìÀόÃèiÀ/o­_ßń J ¥Ro0èz_öÇÈä7˜:“ð÷ 2¹ýZ¤€`­Owè|Ž'h/ßS%ð;l¡Fyî‘FѯžÖÉ%TMEЯ@Ä;CˆwÉ¡aÿ€ÁbÔÎãµñüJ A’æüï/Që~.`^1‰sc5/QeÀ71â(Aí2(@EõŒœŒ[o!©²k*[ö9\éªcqëùIaN!àcö³ãï©îhéw`LŠà›ýÄð'Ùv9€oyٕ.ÅLd=ÍzÞïm½ºúïý{r*õ›‡€dv„Ô¿ï_‰^1í|É;*C°áþçß £Ì>…Â,©ò ^ºL ‡ôÄT°f'~ܽfuߣуتF•ÐáQ!vîΛ–þ ¸ 2B¤e›Ôš¸ l¥ª$"æêõ~ö@žä{ÇEò‰î÷äôÂcI=•q’2q’ +Ö¾-QJsñtßêíµ;–Ž¼pnü¿Yo»9~ñûÈ%kØ *òÆÍz͈Ýÿ|ø=‹D²Æ-ýj ~&7ëe—h×±öïL˜âځ£²Y·ïs0ÜC8ÆDó§h–µ¸‰2ûÞ^ÃDò£H–9ö½ñ¡-× ‹¨º¤½QpgØú%¾«6†'±±~BMdäÆ÷˟T– aÚÅCê{=†{ó™çô½W[šËrp‹Æq©gˆž_¦hŒ•ï±Í€núëÃäûÎõ‡€º+’©Ù«þÕª­¼vXKB4YG§÷¦…»zÞ]zˆß7a(=äàf¨Â~ðÔbØ¢ŽC£%ŒõIFwßeƚ=ÜZ#µl÷59õmŗ¹¼€ipî½¥~32efxÜûUÞÞÉvŠô[˜°ýHˆh£\~mïÑ{ìÒï-lÎRɈÍ!žVø[üER•³è½£_}$§ûÂ~†bÇËRÑõ>2jbaç㒔¥­¼åÀö½­<Ä^Rƒ=XÇIG"âñŽÞÓ!Qô¾Zu<@’´:dˆ,§?òãx“aÅ5ÑÚ EDV†c8÷ÎòÕo 5ï—Ÿ}H÷auò$&÷öÃ8]ì–÷ë&³íÊ{*âUEoÀ{[ÿ¯)ÃýßÖî¯b,Dɪ(}ƒFÌd¼§p È|à +}Á¯ï~B‘6Ý«”B°·R'/ ÷ë| éüHŸ”wÏ5M%"bá}ûP£øíÕì~_ á=昹ÿæËÙâÖzJe¨ßJ¶‡sʚÖÜ#Ø¢ŽëËÏOÛ»‚iëOFã8f⌟³[>m1L‰µÃ<ŠwOk28žÔË)ß݃Î6¿¢ŠRÝûBkÞØý°´c÷ %4dé'$•­«r÷W)¥º¡‰“qîØÀ¤§1ŠœÔn*¨­ÁÍ.Y\uêŠ=Ž'pÈ-›ì¶„3nqL×Õ3@$l©!‡Âm ¼ ñ?âû׃¡$÷!eŒ{_O{½²Z›­Ò“«0he*_žÀNv97‹Rü“½îYO ŠRR´“sþY@ÒNµjpóó“âô¨sÝ·D#ûÈ,눒$¨Àõ§K7¡¢ûV€“LîWX–X£îCßê6H¤Õ èNFâXÈ é ÞtÏju\‚€ åž{÷IqàU\ +O ª øK¾—îQM낪7OûÚng C™èþk0;tÿWR¡{lUt1¾@÷ +â¢[@T0)bìgï"ütûÅ4gßÞ3g@€˜ƒO(aç^µÊF`›û oÁÉ}cÑZou2¡>GÑv[îëÀé¹õ0r¯•f¹ßÁZAÝôä¾r/}z±Î0ñîŽq_Ó|¦XrM2›«Šò•ª•Ñ2’ÜÓ]‚³Ô2èȽnlT‰~8¤‡Ü¯,¤Òˊe¾ZÜ_k•‚@é ¡ëμÉÙzÜÓÇCfö„Å~µd™ã~-ﰓto܇žgS ¼Ñ´8Ö¸w„¿ºÏúÃ`nZ_½R 7"`ø// ÚOtOœ!p3˜ûè(ô +¥+# (;Ôœ‡üp/ùÂd™Ý¥© …c%§H½ _r/˜ß··ä ;ݤ‚Í NÿQá~T¬d2}Õ4!)¹j) ¾Ïí‘Á\–Ò8)enoŸA rì!éÎè÷^d[Oö1ÁýäÃãïr¿ôhÁðkE¼Ìj<Ö÷ÑÄѝƒ¶õûîkÆX:‚-AÜëáóÁÄôP@†r¢>°S=ÃÍS ,3T'ÂÔÛ·Ü>ËÞþôI19³³Ú‰¦%Žëí3nùHLŽ ظWÙw™Rç혾´ og[Þ¾)ÐFGø}îv¼½b‚{²˜ö›î÷wûXAãÔKˆ_“—®bx˜|a•Œ;Meû¼ô•Áæö1ãÉ«H¶Åü" í;á”=Ýð« %`h¯¶ŽukH{âØ»%çòÝÔö°Ÿ?Lé[« GÀýŠ ü¢ÞöÜíÇ`d;‹È±ÿ§) ˆV¶)ÆÉ°¬H ÇujsÛ7ù‡óˆõ+xV¶ >zUçºÚQm ¯¦¶?$“Éðr‘֍¥©ÙÓöVe +,%i±y‹K{.wv£ Ö wU‹¤lï”FÙNl— +Ýùl/IÛon—CçX”4à7lÌaPs¥b²½¡&C†ï)ÍÔÖÞµËÓÔ¾0]žzm8ô‹Û«Ìç~>õ,½ŸS–ùk×óؘEdÙ¾ö2­IÒ´YÄà‡KÏÕÞÜʬ4ޜ×>rÓvO—kÞµWï°uíQï´ÔS©@e–¸öðª|ýÛ?º~kÏr”¼´ ÈJ¥µ™Ú³™´áZ@­g"ðµö¾$í% vEjO+d›Æ€É½“gí+:Z:Ä1ÄñÜXû~:E:Ö$x„²?¨_&(J0ˆ çsw£ÚÃYL»-•;oüÔ%ŐA&Ñìڃö¾0@òÍy +12q‰&ì?m§ÐžÁ€80ÉÜSQ{Sø\N ¶(Û}”â%—cS…@öýiï( ROûÕŤ¹õ£¼ô`€õ@ õ}€.îÙioÎNKû¬Žù©ÏŒ•°èJ{rðˆø§ DÞJ²ÈdšÊ´Tó~E +ƒO·£=f3¹ÄÑpy=(ÔKR£iå,”í9¼fkãX̘Xš=©ô’“ÏÛíX4ŒBI:>…O+†\Cû¤7ø‡G®™MMiÀ¶–¥¦Ù+½Ðž4؄öKCAlÀ2¯þ¹ÎcƒÁ'3}¬ÿIL ¹ˆJ³Ÿ*üRŠ—ðýJøìZIô<û‚~q5¡@ëü= ÿ·³‡ |$üž– CÙç¿©*3ÇÆH§™‡ŒG@¡ ÔÎìŠþ¡ò’=âDÅȸ¥e“Ù¦ͨxOŸÀ5ÑÚ`ɾ3!¯tÖd ˜¢ª' äuV<Ï«Á¹ê!{‹þ áƌÁ±«u/dFT·z¿ƒ 4ԓ䬠ðсe“ÔЂìY•ã÷‰cO¡ oy|c +Ep ‰2»!+{É!)ìUúœÆþ¬Ïؿ=Hv«Á1ö™Y8pz÷ÈŠý`èb?KJ·µéìû›tN£'ò¥MìIµß”B½$ ¼Ä~)Á^‚| °ôœ—iAíˆÑ©\‚KÞÍSz>Ոã½ïõ°Ï;xº¢]¿s4tH¿Rt‡ÍïÂåUqEú†ýº£Ô©ÿÂӋÁÌ<Ì\+ü:½ ìÃ' ç°Zñ†öÉ—i”±/¥óä[W`/¼ZØ33¿zFY-QÄIX3w\a†ù= `àØF/cBú‹åwž¬ ß w6 +…×|§Ñ;ϕ=Kʑõ‡¥îœqß?‡ÎƒÚ +öcU®ñdÞÔP|ý{nʌkZ[P¬=°§nS¨‘̷ߝ¼ÀžG[‡Êë« €Âµhå©Øã–\Sðá£4[ഝ&ì…À—C¤P9±%¥~Õ¥'銚F.ü¤ꊔÌÛ®áŠÖǯ'¾¹:ŠPüô*nUÈèõT¡þ« ”$ø³h¯ìC2À)Ô!ýÿ0õÀ<¸³ d&b­þ å‘'˜Lƒ +‘Â^ð~æ ¥ ®ðþ®?O€”®ï ¦l½ÊÖJµô«nºëCþsƒ¿¤§Æ<¥ ŽÍ)‚Lq™†j­[=]<³‰Ø +&²?­·T¢ î³í]×âßJ±b”ßõÏ×È +aü’“WǺ=ŽhÔaã·>ÜpTþ|àÝõ$Ô;„04¡AêMĦ*¿Þ¼u=¡mj|+š³æˆW×C½Ç«Áö†mŸ‚1À‡Ü±ö6²£@7õ4§ëÅ*½l"­{+]o<©Úà8?¤=¸DŽ5 ®W¼ñú•u©8#K9ojsIÌóú0­\·áÈD¹­ÈÁñ¡q}iÙœ6dSÅ\Å@nã‹O~$"ÿ?í㩞kýŒw»Ï8êÝÖñ@©ÀÏ[¿êw‚©8Bm·ÿó šeéuë´Ûu„ø¶+'|‘7&0·Þ+¡¯ŒÈù»Íӕçèؚgy„Æ;øã`‚Žvš-ó!ȧæ_D48YžoÇÀ†4!¾µÞ)ۄˆ"4Ÿh-ÄëõèÍbÚ Ûþ‡Wëc³M¬Ž(Œüœ]XòC˜7“$­2¢®Ý#|‘Î%ƒÞ©3˜ÑÛ³X ½lB`£—Þ? HÊ]0’[j˜£œÚg¦ßrj,FÃ÷ú}h‚ÌæYalÚ?sô3²^2H”÷PxhHæ8_Ôï3SXîRsoÖ38¤1Ä}lIq“kПPÒif½êvÎù¼›(L"Ä䤹d°ëª-'00fíAӋ½!<çÓ·‡˜3 â• )ëW—¤ÝÎÉõÿHÉYod¼`?M®ÌþäëµN$<ÈÔ ¤‘õÍr%MöLd6 ë×ï%:oá9큾@ZX¿to‚â / 9M5Õ·­Ò™Ï]o2s âƒõh¸m`Õü¬·Ï¯%ÖWmۅ”\4Ù¶ |Å}Hù¯žaÛ~@åŒoñ_1ÄUJg<‡+*ãÑ®ôlÛdF/{×&z²M +nõU·íShÁ Ž|õǶmë¿P=Ûø~•c$¶ M¬2?b­¾Ò øŒŠeÂ~ëÕû;¢åóêsÎ'æ˜ož»DIÕ|!%˜©2»KoTD0dGWì‡> Ö;WlB÷žO¬ FI„Ÿ6ÈІÐ䀚ªÕe.> Ð†<,®…‹îÂK«·mÄÚB‡š=F«çטKþL¤œ‘$B +/=5;±C ,ÿjդЙ¾zX–»¿ê¿ áK&ö ò[QGå bØ«~gœlݚ/Ў¾ï®ú:!Ž,i!åoÓ3¦ù´I+SýÆW €˜YîÜìÓæåö÷›>¹än@Òª>j¸ÚoÃ9%rF Üw £ô°aúe2¼ÐèâiÅ&à}˜Aø~^A„¯™ÑæO…[ãú{éž3DØb¤H^ïÿË„Ïéû³ûùȗ ¬Bû>á$–¤G,¤ý…±âÀ—œ¬*ó´*› ªå@—31õµí6«Ù^JuMé~O=¸‚â=ÖÔõN}\5‚²¥š~¯SŸ=—µÛ¬hqÅ­ô ¬ªp¾f}qêɛËØá‚ÑÒ»¨/>>³SzÉušš¶©ú8ž‘ø×àÁñuÍüR/‚!g8’ù‘Ÿ.õÙçÛ¾ÕÝëÞRöÙ¬´R)òYêi|6Åçƒþ1ö•za;ãÿ« µ·J½“~¾ÏVȊƒQ]”úà0˜Væ¥ÑÙü¤ÞÊg¿xäÙ¡ ¡³· õÕp¶ÏNRïk vIýùÊУ³]€Xzìêl¥¦œÚký,J†#õ!Í•b⎂ûŠó#øL/Â/¨+³êàF&ì=½A™ÇL5¨ šäc_»F=±DWÜñ,öõ….’?UQîØõæ'™C?È}Q 14ø‚‡èOKšSÔßØ|ÖõJå·DýYXÕ&!žñƓêý‹ÄAÈ,Ëžg$Ê ²ê  øa3Âm êï|B'c­j ½š(ñ‚z:vhd`ôEA,Ê*A•õ‡¬|÷ìOÿÅQ;G¹™&`ž±d=ž*䧇¹¥Z‹PñàÑ8c ò´Š/›þ/dX:¨Rǧ_N/úMõ\”±°lmONz8Þ#Ú´–øk|ê¬òÂzú°œù£ + 'TL_%r´©•leÓÓ_¶UC±ÆhMüÈgÖ|˜ùÂn§‰ÐymPnòÕ*Ùéixw¥ÜÊ~ÅÕ¡u´gõ:ä]§—&lluúåÁJ3½x—ëtz}Ñ^8:} d™ÈôÙå5ú®Áe_ØSàÏé+›†ôšÓ¯úô?¶@^N{˜uY§™©Õ†ùRÛ´Ïüßy0Ë™ÒtVˆk8AÉù̂òƆŒD%nÓwîo+p™¾¿?Kƒš|üÔ#ªØz¾zm­¢ç23–{?-d“‚>^Âc6‰kÄ:ƒ‡"څ ë²ð4}pvLäk¯ÿ* ié{ ¾–úΦ÷húðÏñ‹ô +ºÄÝÚ» ™Y·¼K¯‰ Ä ¸³öœL/±ÕÍ:ëyzCW =¦¿ÝœkLƒqa‹¹’•Ör«*Dí¿iƒ›öá8¶Gú ;°†jFuyùKòÖñópEA¥òÒ§2ÛîÒ¿Åí´Ð$¢yíA¨ù(ÓÒ× +lgéw!•¥¯•ÇÒ/Æ–¾\ìÈA8•x9ÑÙ9+}Ù»}6å!3ƒòTúwð ¤Å¶£Ò¿Á}.5úbÀT֜$[?GEÙ1ÿVn³–{´Ý_íKR=Ì=µ]îèi˜“>¹>=¶®Ö›ô°õ?zS˜4[¿hMzÓBõ^d‚Y×{~u"´Ë"4»á4M½Ä¸PirÂÑqO¿ÑH ”ô(.W$Òü¿˜tô&(Ö çKÒãÐÛN%(*Ç:lŀô¿:íïeÄt¤üÃÈQÂ,9>e8yDzì?¤?¥\ŽÍK^0È1zt«|-ºñ25îÒ!£ßÄS9érǹì)H—ÜKì®ìH’$ ý;z©ƒ¿E|­ö£?ãBBu R‘ ê#§¶¥©­ûVSä1±(u]ºýyúªŸ—X,uÆ»€p-ÀX5w +ƒÇ+=>Ýû’¤Eê‹PvivuƒSp^ªÓv íµ/Gý-sóãŒ;jnSX·ô\¼©Ç**$óIÃ}®×7=œ0PõÞšÓ+LâÑIïȽâ‹I?=¦éÝä,0´Ao4*oÞÂ"Xސnœ­hô§?Zz;˜`$½9>„²fQÕó÷êO/å¢-…"TMˆÈ LãÞ<)'(é ±lMá†ÊWɨ5¦d ÑJZÔ¿ +‡çTxµ£ +—1¡1½&&M{ RUz€F~¼b4A£Ouê9‹»¹U=B»F,Ꙟ-‡’8Ä~™qrâ¤s‚: +23‰Ü‰Þð­&=Q®·—9÷‘<ã÷)CÝe¹×ʐ¤M|ië4íªäЛ§ÙQs‚"õÉtá¸U°‹|ÓÔn*µà~‹¨¹K™„ØÐnõ£8¬%Á~wv3<°d +,4¡û&ñµ#0CO ÉCû—2ɞB¸l«6‰nŸâE,XŎ_0=î˜4ùìZ ¤Â1Y<Ž4{âQgKª¯ »–dJ-ػД@R/W/Y¿m!%œô’‰ÍÔ[츖áL€'ÀÌ3|Š*•Ê%dÁ5áÄ[†ê¾1égÁ—2’r¦Üñg!`€N'èX&ñ=^™3ØËe+.J–PF1i‹„ rJˆ1žzöŠ*ßüB,ó§Á80*¬ûî\zÂßÓ!Ñõ¹MÐdšà¢Fâ‰GÀ¤éwM”ÈHT´|¾ÆTòRB^óIVï:¶bbh”i%ŸD,ê̕„4pþÔò‚ˆN +´©î}ahËÍ•tà_rTïÂ-Otæf¨F„%èõ¡a˜y6†bÑ6 ÂeøFj¤O r2~êÇ¥$?‚á¦É+ËɠߑS•ÎÁ“Þ]XúÆcé¸$_`í‚\&L±Ü¨f8l墸d—RçjàìÉ@¸kœ±DÚ%58œšC »ÜÈp¬{³(ˆÄWù´ù—¨zf2ärpÞÜ^ñ/Œä…%É5Ï@dãݝšã~SK8!æÅ<‚ŠõØ,ÆqƒÁy’4n”Ž(µV6¡\Q* B;‰PIõdÖã±5"î #€3ǁó9ƒ‰K6߂³ÞÎÂò7eþÿJ:NŸÝñƒ +°©bpN·ˆÖäˆ+èõÒM™2-ÏCFügÊÉα8ýƒ÷À²Jôƒ‰ÐÐÄNíO.¸i¢¿¾m­ž‚€ ÞÚ^N‡a5uÀÿ-^¤lò%lþ.Ê+e÷'üBãt[P²8R(°K=9;/Jª°½(´6”YlCU‘‘P”‡DDϚ" R>êWÊøJî\¬òˆ8blÐ`â…aNáÀ½7%~‡1®£Հ8†n ágñwJ‹Ñç]YX»ºÌyW úÍÒE(¹H,˜Æ=՟ Œ› A6pE:Âï)G]ÀZˆh ª›ÿ +UkJ½ìñ>D‰ÂñÞa›"tukC½²?Ö~Ûv/ÒGkšlÓ 9–Kþƒ¼[Kmº¨ °:ç§ñÕºŽ64, +#ï¢*oM'ÃMÐë²÷|hDI¶}7 +‰/ÿqÅu~Ha˜$T)f‘²ìýs3ëºgÏÇ´ÇèA҉ãyAѓpǗ0„–ÏNç[ƒ_€9Ë!‰)aÅ1µ¦Ô£›4ÌÕÊ +n‰n /ø)æÙæjM?Ë VˆÜ\Tçõøz¶4÷É0c,ÑڬɄɚÙý„‰Á:UÉf +µ.glKòö'0Z_qÛ­Cø¨7¿k]síBªm?ðÍ5‰¤ý z÷ â÷Aðépÿ§Î†s¯Cî›sðµµ±ù±Ú(îW›—Éx°»oý!û ¢Ñj-°³u”ÕÚ»3ᚠž)e +Ï W5bÆBü2az‘ +=úåRK)/–ÏLx%N;.ºFB%P®±¡`lúÄ#ê>a0ÅôEvf 66M½ZO¡˜±Œ œ§ÅP¬HIèK ± šÒº³#oPwû)†—X`×2œÖâ0Ú+ÞKlêÓ!4#G¤-ê(\ҁó»áë•ááÏø‰DÝ‹Ô +ÞTýoò²$ˆÀB³¿ÐÚ,W×Ö¦y^èÉÛ +3E³£©%Kdþיc°ï®X“Î`«‰m‡7‘ô| Î/šßÃhV2q¶b˜¨1Ã*O2!Ѫû‹,g5ƒÀ)¡ëHËÊÒ=À˜ º‹0úDZ8@Á긂BZnVØKònŃÀ¡%ðÇÆuö†á’ô›ñ3@I–1X–I)< "¹Î§À (Š3‘þ䖖 çª#g ©Ö²4N²­3´¦[ œOè,Kûá™=æÁsÿ_ƒðFU9=Šâ삃m—>bâkñˆ4[ü{æ E8(¶#ÅïD¦q‡HDdÇá f +±çïb$5¬˜šøZk$ðSçKû‘ÈMdMLÜ@h¡ÍŒð/h?­&ý1c°¬Ë2äÏ_tó Á½ËØ" bH;°Ö ©­ôOˆõã¶+( éš$ZPƒx¥2ÄÈ 7Ê»R\„Õ}ÐV²œqO^k +Ö3 +˜‰qÇ\YD0igCôܔ ½¾È!“)y›Æ¢,¸V„ÑҞ!䕈Åؽj@9ý¬¦+™Îhë{«c½9†§ °–sW÷ùßÝvZ»·Ê=©Ú +hN¶x¶f»æºa`Ñ x®©œB腩ó¡“ei O|Ðunâ¶ÂÊÄ,ÎSú ™Úû‹4Û!OÞáçµÖ2©ø?­·¢J/*Xé +à"=bA–…iò$8*ý†dFôƸ"Â4þ…FèŸRº¡û.Œ,‡fQŽdm^í7“šD E_Üfl†?Êj‰ÔÎNÆ'4$s­zÒ¹B |c¹Vè6Šúðz z<Ɇ{oc1=ÆÓä‚ú‘zj0š‚}QՊJRzÎ=‚›§°A¢­‡Á¸!úû¸1Kûiëè.NŸéZd`F…vêâLñx+*&oœ3–'XIJÊNrOµ¸&*u7!m%*cÂdŠg9©¬0þ†Gäá!yX& +B‚A!öÇsÝD"Üö7yùä*±îìÔ Ö| +d +^°®„TS öæÂCEÊ©»¨œl6*úV4²–#`Ÿ/¸Êáñ8wµÚ»A“-ä5Gp4ʑˆÁ{/d'ù‘»`¹°!ä rŒ®“R+Iá¬ÁɗNJøÃLG¾ñÞ#€œÎ,þÒp$á,Ç$ Êlx>ókoy½öyhÏL{¤ð9¥ZG@ýØ´)8YÛØ +.Ø«:À%Èn»I­êdVG€È©7ñlŽ¤~ qúâs#çµ*ِ‹ó +’tú=uÿüØA´é¸Gèw'W×æ¿ÈE­ì>4·P +äº6‚H+PmWҔ£Ñ¶ØW§Ds §€ÐÆÁ+¢iÞãt^#ÌX?@ &C!÷¬ôçt( À…–#[#¨ÿ•™FP}¾{§V“œ¨Ô²w-Š\]&b:%[ˆ5SʶV¡.¥¶ žjzŒàIèÛíF¾.Ô-æ1^° ·ä8~¹pº}n ÞŠf ]5¼á–д[ÓÑe܄:Ë@vŸý7¹B)IzH¶X)ûC`_ï¯ÏtÓ/F0¼§.ëPÌ`b:Ybýú¸›§9BÌ|z3\€Fà¾þ*VŸºb„I×(æURP ÷¶ó®Xڕøq9[B|HMð“Ëî·6 e«»–Ú~›„Ž—4’}Æ© ´E°(Dµ‚Ë#‹¾k4&9†NÚ¥Eà~]K"L'èš~ Øüä¾[ý¥ ÚBCu >¡ž/)ôð擲ïÀåc)(*ÙS¬F(͍kâº(ìIS¡å}øDȂÂLÏ8M¨ËSÁ‹.E@o€0AÒÑI(MpÇ|½ŸŠ+À(?ûAÓÀRÍ#o˜8¤Éè€ÎºÑÒf\}?ÇjZl¡µ˜s"…u?E$"Pab±á‹/=“DÓÞõó/€jû a¨ +®„¬o‘=õ(¤ìN¨}ZœðÉÛ°<µØOf[A¬ Ê›åú¿à°25‘Ø’È—m5šlïãf_îL§yÇ ŽÜf÷É68’g“4(NnD¢3hÏ¥3"hæ ŸŠZHJT^4fû'Ÿž…¨{ñBYþ™¬u"!yÇòö¬<ˆ@âH¸Ÿ‘¯ÞPsŸ—x„Tôm˜!NNjô\UFüTÿœäÁ§¼ò~Ôí±hxo€³o¸¿b ˆ`råÙr¨ÃAl`¾MÅ÷CP6¸üö"yÀ'o-uF¶Xñåïr|ÄË mÀ{HeØüñÎt!B€.»  3ü½ 4¡ûåT è.uƒ[ÀO¨–:‡`o—é׿U?D¨ðݵЫ7Ÿ÷a՘ë ¦TÞâ_ *wA¥Eôág[€‡$à8”xRåœÙ37PEŒ;ØW7(vš0p(ݛ°«…À™ Ĩ©®âÏn£¹TãzÙ'=0jô/k6PP7õéîžþžÎ»H·COS­ßåƒEz²S«@@¡CÐ(y¦ö\?ð¨JŽeé!GÛ® 21 _û€ZbÇ4ÿ™M¾]ÛÒÄBv‡<â(¤§¿Bæ›†QÓrJë‰×¢;áÍÙ +ÁtS›¶ ½ÇU”›‘àچK#î†z°A­õ‹ö©1æ?À)Z©'3`‚Ì;j(?ù Nô‘xU瓆‹ŒsÞJÌï$sð,u™H.Â×ï6‘ãa°õÈ>Bþ,xI<°JՑÇ;Ðm;Ãb!ö½êº3‹Nî1A¸!Ÿ–Lô,¢ÌŽpô²Fhªì @ }3Áµ¨t³ÁXÊl”w݌Ö_yü[«0úºDgÓ ƒ“彸ªZÑlü$„®C‚ÈB'õAOù*ë"T¿2iÈ;FÀJ¢Újiƒâ´ë„¸ ݦ‹Õ*uâRpäw¬j–T‰ Oâå q6A (Á€-pοbaƒÀ2㔛Ûëvp,‚ ú›-…²(bʸçí6]Á[Î@@?Šr‹×3F@J˜U@PçÐö+¹/l@@·&5ÙÿÚô#ÆSB mˆO÷4T˜Ùbúxû.Èc‘16­8Ý!à"(?`?…h8@gÓÖǸý$ˆ`í𮋿Óh)8Ð<J‘ðµTy̤R‚ô%V_ +?ƒ¦ œ%B—d&O}M€`¯!@9“?¾MÞ·í ),]ü»XjøJŸc¬£öÿv˲YÇ¢ýŒ&´TI¾eP ÄWÐÌ0\Léøʞá…^Àœ?À*S()Þx²¦láˆ!Õ©‘çŽ?”°b)S¡˜6ù{ ygä¬ÛqWÈõß¼¨Çç”Až¨¹úý  +ñê°ÒjÕ]‰~ ÇU¥¿·é¦ñè)º‚•X~ .2kë,uwšOÇ@oO½øò´í~ XþÀ NÞÁ žÙàü؀϶Ù<Ú1ûïÂÓ´×%Jsh±¬ËvF·Œ-á¬<<¾#ØgÑ¿õ:ìC£J>Pp}oçÛˆi² hGɼê½¶é¡ ÷Ðyˆ6Î_?×åa{.w¢*j ]Þd­$EÚ¡ÁÂ>À´7ù€d‘L"¬À³:;7°)G¹ggâí²¸.Û:Ôö• z lð¥|®¨¼¾ýbš³2·© _®Ńˆ $úлËþf Úë¦Âè?ªÖ)Ô Eéø²Áé5†Ñ¥Áþ@%š‘<ìÜ ¡Jì¦PøòÀ +SH©üÔ¯=@îeUåeE͔Uœwé~hÀð +}¢ª°%c–;hLÚ½3€ýõÀ-šiu°h%ÚÎÈ >Ø9jØÜ9V”×ÖpN‹ŒË‰ŸDÖmd"¢®òy±­<Ðֆ&ÄþÄPܼaT“p‘Ü;Í7Foû4=À¦ÀñC ¹`\`1äÄ®;È÷<@oû;ôRÜ$ÚLz‹;q³•3ðëý§(”ØØP:äN¸%" +»•8äI\ò@¢á(›0‰üÒÖiZDJÛö¡ú +y º‹•1öúüx *«xÖ*1;X3Û½€°¹ÃB™Û#¥*—ñÀ^Š˜ý-V µiãß0_ ÄÀ"i½å0“ ;AæZ\èà×*²Œ.·Ì²¯|X—©¥N.ÿ͹ÂHîYý7žÖ–PRŠÚ'â8ƽ<œñ`4÷-FÉ%‹›|Ãõ+’-Ä?.< ÜTÀ²K5€™Ã8/wØ51tçóv⪗·žðùï˜Wa 4߁èaœy5¶ï懶ã3…«Q†ìÕ “°~—?J #jÊï½b´;ЗÏI—ì +ÛܴڃžPgí}¡Y {SÈKÒ+˯âTŸ¨çǚKþßÅØä.wñJ›åÇÌ-H®‡‡èŠxÅp;ñDÃ0ºn¶-ç¤Køہڈ§;tfÿ¿^º¥¾ämžŸ‘fl^…l…"JQÉwÙ ë· +j^{¯O¸¡s’\v@#, %8°zJ'€ÿ2-'u ·ã$Iõ¦¬ºÛÍ#ö×QŠ›*d|t²i$儣Û4»,l?±!Ò¾s¨Neàj§òÝâ´7Âa¤ÖªLuo¾ˆ°â-§ <˜Ó$¡K¹§UÎ=Ë£Û©¿Ý*uèÀ 牜9p!I‰m'ЇîÔÊ!ãf8¢(Tœ2/âT*ŽäÔGèÀzÌïéÀìÛPöñt”žVY•›Z²æ>¯ñé.Zã! Äïê>Žüé_½Ï ’ÇP?T0º8éԛ¸&¦–‡Œ¾<ϣҁ’ö]²atJàô©Üõ–ب„ãè{Þ_ű"™E“ÊhÊX'èeÄözù‰Y +uñÜŠ/:0ÆiZIJði$GšÒ(WèßӉ½+ÏÓRCŽX+Ei+¸÷´ËDÕ¤=»s€üLHt.øáêXç@xAÍô«÷á͜&0C™‰^+՟høæÚI ¼⦉•ŒL(±Jõþ=X%—9°Àm‡@R¨ómæ€K“ÎïrÜæ/à©¢ •¼‹9Ösχ¦†z{–•«/¸@¹WÄHI»¼ÇàűLwþl{j6õ¬Ê!¢.?Äsÿ»™L.èÍJ§€ëTp×îR€qßb•]×în”cÙ¤‹È~>twÏYŒ¿U‚ ]ù§<ýàzØx©FPY [Ÿ¢*±z[¬ðli{ŒøÒ,b¾¾æc@PP‹63„.%~d^Ò rº¤‰0ƒI2‹qÀyèÍ/ +h¹ÖÌ%½åz6ÉI“Ç Aì8ì ÜgjÈÉEW…Ÿ8 KAæ® +¦ø¾KPoMû8Í>ÇG€›gˆ6Š«ŠÆ0Ðv +‰« U‘­r̎ T±@DHùu¡LÀ)« +*¨Á-äaÛõ* ª­®W&ˆ‘x¨•ÃÃËçIÝüÁf‘•ùÆҏo·_®(½ö=áKâþ4P¼aâðAZë©|0·h”#RÙFÞ³šàÐÁà2z QN0Þ^ØÈÖåèl#€&Xg-ç4þ¾ Ȥ×4ì(²5%CÀÀ·Ô~‰ªM­—3@ֲɈ«ÆÀµFˆsôšÍg¡¿£*8áq,bŒwxe6À«a5PP·˜qVðVv°›_ë*pßt×eãH6’D¾ìMú>Šø™át~ÑÏ^©KJ‚Øøí¢ï{.¨Ô^ +C2•¯4½ì‹°^àހЊpð”ƒú3c¤Dªè£+·#™1â¤Ì@m*2ôSi¼ä8òˆbÀ‘Xr àqú”†%ÕuÆ6@ +?3X‚ÌÎDÒÀÙÛÅMˆ ù)\Œh Qáç•vA +~Å!©Ôh:ím£µ€*&riÿž>Sy*Ý8þÊÂQóqU½h€/àOMÙ¡$•+p•’‚ø»Ý}‡ॠ¹­>YDDMÈñ¼Å­WÝÂéˌr@‡ÖÐ ´‹È©g$ +X®åS!:¨ªæˆ˜©«ì/a7äÅoÍ@ƒû½KDÑûё‹”ìxJ•ïn±yŠVErW' ä_žÚyóÄô;Ô×ÕÎÝwj s;ݴӁ~P~'ó»Cu˜ŠL£«º'8Ø+\®êܓ\ >2Õ; j¨™P˜›bÑf„Ú18bZÉa‹È ¿fà6hú… +Ô*( 9,7òülšÞŸ‰ËUžê¼Q„MÍ@¸ÆžmëqÍ5Š˜ÐÀ_fÔ9yªgæòìU2‰ # ¸óãÀ¼Ûæ3¡ɏ*dõ1´í($£¬t ¯âìc²Þž*öåbRÏ<áj¤ý6ôÓù*j$‘I*sMe`ùº’;°õß&àë„uÊ ãGWf!”å*#d}“X/`¸©:/f —]=DåÌJ´ºÙïC“ÔpcË׎«D¾z8™T÷#Ë+o™MTs#ƒ^^Ç¥‘æ•L?ÑóY%DP­gÎb‰Ó@ª4c\Tñpƒ QÊú F}?‹(} Pr‰Û%ôÖl€ƒi´}i0 dœ¥$ò»€vœÿùÅð¨¾\4c‚HlnÀmí5bX ¥V¯—m È×û¿`,1pŒÅÀUd+’™˜ºR0 O[@/u¼>c8°ÎócÏÎvx+Ôd¡C›}0`•ý€póCi›qAòêŽÿÌXY¼¥ŒLpÊ^õ¤À»¨àó¹ƒkÐ Ëø>ßWêS8¾¬qþ£1Ór‘ ÐP¼(þ¿]QO0'' F´í`àÿ0¬Wô]€ü}pr‚²÷²÷è‘ÞºÔ¡ +€¢%¦½9£7Ío(w"IŽT–NÒù +”Ó‰Ûâhç"`“Œ:QõQÄ|d_Nà´ëÀòÓ–U–þïÒc’4Z½»nÉÙ×IƒMIöeäùö¦•5ׇvÃXÓõD»R|îU(yi¾9¶Žì‹D«ø‚Oì é/HŸ ìöñûútó—Þ ´ØGø¯œYàé3›ÞX]àžùeëÁ¦ W€zÿ¸ž^"© Hg­îo°¢¤x ÜG¿e".p̽‚U×Bû·ö*£W츀(;Ʉ.Ùyqõq¤¾9sâDÀž¹€®ë’‹î¡rJ·ûô1¨Dœ²6ÞÎ[dˆ7oÈi3jmá`mLh\`ÕÕ3¸<ÂBZ]C7»÷‰#æ HÉÛŸ¾ŒÂÝæhêœAô; þÅ{ +¾Á)Ñ+.æ… ˆ«]µ„厑 BQ¢ÑID;$ Éká²0í¿Î¸¨™´wÑ©¤çmäð޵ēêjä/uÌ(«Î…¶’Ö…2SˆÈ~+Aû…(î‹hú^ê0R ~WƒÊF^rFB“µ÷í + XöI„ÌeÇzw¶Än¸Òpï æ  ~ôƒÅ‚ÃýÖrü‘!…gϤK2á3°‘‹b±mÇWEæýî(zµ€8~½i¼Úµ\Á‡ÅÈÔÅb{y6úûš.ÚRÿÈØ°‰]b + y+ÄË €€Ø°Æœ–(9SÊ@,Œ–ZgwˆX¯ý+e4q¶K|–O.lĝÙI¼w¡¨,Ýeºfú+†‹¶šþû3³€ +ÛL^¶àºTÉph0Ú¨ÎP!à2ñÍñ&éDÜ)5ÑgÄéŽhÛ%ysûa¾!±Û +øQÁ„rûWäS +x¶Z3N㝠Ì6‡%¼ã7ÀüÓ?RBI/ ,ß%7,Ð+Ò¼€üQ<+‚–£š^µ.{”ˆ‡_ÀT_ÿTGë\•J,P˜æ,öt¤(˜¯@ 4­ó\“{öp°è[3@ü(´” x±…fb×*³²Í’ +JЯ¶ÁASAû†OÌïdÖ¸‰a”% +d"ºßì@tyRŽ~K⬽ŒVSÌÌC[D€&+Ž¯PÄ®/ô”¡—Ûœð–2’ñ³»MŸrDr Í + ãO0Ÿä&*РÎ ø–PCÉ +œu”Ž8âÓ°1MƒoÑ׆S¥+púÆ-:Mlƒò›9°Á +ÌÁÅ­H7mú«À~°ED¯f;/äØ]h5ÌüKg¸:› +ôäÀE՟bèÞñt¼U\ë3ŠÄ©Þo8«MÂJ ü¬>eíPí ÙÂÁCðÕzñìl Q:Ò°æ¥û½‡8[ +èI„—k‚ÆÌ{r— +bH¼ÁMv¿{ RÒ$Ú"Øí|^Œ°þ+ù=*pã€t¶ÚüÕ\ýWÞµRx€P`VÐy˝Ò8ˆ} +„v•ÖÁcô¢H¬¢Æï)0AÎ×z!îÔ·v¤„÷aß8݁m +ôí‘*" ëò¾tk +ˆ@ZTBÕ<…>͒ˆW&®—aH±yq'Q`uˆ„è‡E$L»—¯ ÛéBíC˜C¯ÿR ¡"“A¦¶ô“4Â{‰ ñؑþPkKnöBïþð®ûÃÊR% X`rÀ”eù¶ã€³6·pµ—iNžxáXÂ|Á8)@DõJ\ڑG1¤@™™ê¸øá +örØ+/vo ? +@½™Àˆ²^Häûy¼©% +æM˜ÍO­t«˜–¢@4ùNpÀâ®ùÂÝ´êÉ´¼™àº'â”?,©' +,a‹ñ`?°KÛlú怘…òÛ>ÆÏ­à‡éKÀG”j{3]“Ç¿öeU¥ÔÑ(íÊ[1'öÎCuˆtÁj¢÷U`cݟŒÎÖÜM,«ut À‰Ñ‘^„&pP"Ã0Zú`gÓoH ÜvþšÅ÷Sö ôîØ6b–¿q½Át'O³”Ï7÷GìSê7w^>_KÑÀo¼tu7è²\!`C4hì„%Uî9.ulՓ¿p`TA@ gI#®Ù/ŸWHpÿ[ÛJ@&…ÝYy& ø¬xÝ9OÛ¢ÆU] Ú¸ÌÓÁ"—©tׂ¤5`EtƒqÖ }Ɖ“¡XI ªó’v.¡á‹¥‡»—ÃKÁè÷Òø=°`q.„Ú“Íä:Ïï›Ø"'˜8ƒ ¾¡ ü^>ƒÖTI@ÚJs_V,€÷ P«Í´-‹ z ȪaÖÀÐùr#™9¹°œ'»:ˆyÌòsݞ +f$Оç"yHúä$Æ4T˜Â) xå@ °&A2KÙxcK'Š;ô߈B»mŸ>úÄ ˜°"#€Ì™Nñ ¤CîÓČêTèÙ¦¢¦.#hvAüþ¨ê¿ýö§yRз25l:ê£&o™,ÂÑìí0cQ{Fr§`ÉÖ#P´šv0­6èêè`Øy|×M-º €®— NØçKQšD5ý@Õ¡X!„#°Ô¸õDµ2ÏiãE`;›×Êsx5³XŠÙJۊòìn%4XEà–^}€¹dßmATl‘ú'#@ïžÚþÒrõ¦83Á(]¤ºÈoW˝“¸ é=n„„½OoÞßdûö-¹ú'M<$oäu˼'þìE@!H Í«˜+q"ñµ£8gŸí¬ ê¼6(²[(·@*ÑZ†RfÓùO€|”X–5!ɘ€_¡B–ž›ñ·öóÖ&Vdù¤#ߤâøôèãNcñcš 鹄= ~ü[˜*eÍ»ŸÃõò¾#Í2ó¦é¶7@»Ñééê`oEb¥*@G­Š\ÂWhàôÛàñi»F¹YZQÈ;ËM²ÛÏ‚Œ[êF˜M|ª…ªà®ˆ=÷<øÁ6ŽÆÅ9_gɍ»ð;¥Š6…À¹©ڕD¿íÕ:”«·ðœuv÷…ùq¤‘a­=7Ä*OÆÔ.R[Ý{ýÏ Ä]Kp6 vº©Aê6<ôÖíęæ²ÛµÁEè•]Ò³»N!²‚ÐåVÚA=Ç )Ž*Р üÄõÎcã™= DþÿRNq7‰Çäƒéë½i³ à?'h\èd ÓOÔYUT´!ÌB1Yo¾ø«ŸÛØöHԔâMŠ@`wËÌ¿v}Œ^ÌT%-¤Ï"à€ºKɵ^‡ „;°G½¤1‚F¸áÅá}Œ +˾ÒÛPTÝï 4¤(ݵ€æ³#©°’‚PˆgIԈ8w³„‹x³ÎïïþÜ@iˆoâÉ¢oýNõÔMß¹=è1ùýÆ&֌Йáó˜ëÒa2Ñï9ª& iÏú}µ8ïáA¿ݲëÁ}{±Háë@‹OX`vƒHºì:W^QÊ@`€Úè…{<$ÑW‰€·Xo±1*GhPÂÒR¼\Nû­Ë Û×,F7ÊRšV}€Ã¥øðlÝœ7†ûôZ`x‘nô$ê2]w;ÉûpK ±{)Vu¹÷†XfåQ +w©ƒÌàümr°@@bðþP_ËÞ&=A˜K +X½s¼yQ[`tß÷çâž}jfê¾åàµ;بû'äö€Jƒ/C˟í1[Ã,U H”%Æ‚Ì× Bw»Yƒ ”=þývø +O[ˆúɆmñ‡Âž"Ëo…M•Xàüõ€xh£ãð8›’Å49ô«…ð^NIí × RÑÂOuºÇ…¶¸ï“£bN,Ý¥R~pz€Kü"ó8|eä.öH©N‘Üo™ +ù……Ðñ ß6aTûÿ+ÑîÉ¢ ÅGl-wþ×¼KΚx@pw½ÈTϕ[‘šPx@y¤GH3!;x@ úÎy­Ÿ$@Z […”ŠsÅ)üàL‚0ký;€¬wå Qß›ÀñHy 0½øÈ¡šdE¾yH®Uþ“ +bøEq=%¥^„X²É¶/Ò_1µh§¾¼”ktMíž`z´ØÕ;Æ3ægxQºÛ«1ÚÛÿ‰»ìÂ¸£õ©Ïà:`` Ș#Üx}¡$.Ȓoòé€âµÝZ™š¿‹`‹Ýt¨y§p-గ'àîÆG”}Oæ§Üô((:`ÿ갟“„€GŸ¡I‘óæ ©Àm5†J/ +ô7cJ°øfèúµvÈ +È7ôl•!AúºOäå€.Ú´2Í;Àö`¼(%zõ8œÂDþÔr‚¸˜1ÙùÿçÂ:õ끞y’rû ´{0ÑìÑxi$‰êB—¹[Ž†âŽœ8ô%ô‡‹¨ÑɤµMRuCÃÇl@aBõ`u1ôGÀï‘5Ì´ÎGÀY™÷„îÉ­–|\A’©RÐåB‰ ëeÔ ÿ‡ÉÚi4øíº‰{.¿ÙÁzý€Z"ùhÈà‹WŒî|×IO|äòæÜó$½>½—‰µ ­òQý¨®¨éá5ó ¾N¿~d“¤ï ðø¶úzú½ ÚEÛە¬Âr,á_‹4lÏd<×pDÌ6h›dY1Âtí1 oÒ&ä@tôp¼¸”ñ'“Ý{Š õ±%%žÀÁp¡!oVÀ“ò‚¯Ÿ…j3R®uT­"ãˆ5~s°ÖyVðâüT€š ()[‚¢_éG¨ª”õ½äãdoËnô×[‰êZ 좌ÖꮲÐ>ì)^!\0ÝÃVÿ+þ7Ov.•ï¿p‚ (hvñôyóWýk€*æħ½ºjH б+ÛáþÉÒbóçr±(ÙãT[q|ŸKÙªÔ¡3dªun8 ×e 6ì§AÀŸÓ.¦~j@<"öP/ó÷®cdÍE\æq5:7$5ÉhžT»ó§Žç¨r¨DGØˁ…3‘i€q€ ôÖØdBI'.E 5ÏJ¬IlÇŒ ¸ˆŽø¸2O +×òw2“¨ißAÓÜÑ䇃²lp¢4‘Lw¯“5«”ÌÃ>ø”ݏ/púÔ°gÀñª/Ùão¦NÑ 0ä A¯+1ñ=;nLe¸ŒÏˆ`ºoÜ?ºÐ°tÃð)Ìñ\îz“ÓkøæKÆ«®dš„HÉ̋ü;ÀÿÙÆse‡¿„º¬": YtBŽüw¼ä-Ÿ3™ôBòkµûÜ1\/Ét/ˆð /å0ªªñ%ê½ ÝèéY÷ÑQ¯Þ…SŽª¸ò&±¦ÌÅ´n\öâÚd?¡ŒV@5Ìäí«6ùùBH3'úôº–:õA$Ÿ‹6÷ÀUœ=0uª©-¥„• ­Nu_Í áÔ¦w ¨+eŒ™uØÖ/3ÞpÚ8]‹ø­¾²µ Ñ`êÿº½L l9c€nÍI›|0@·²qGTw4cüŒ àG䍻,²äF ¸œ®@ïzX軀Ž÷)JíŠe«,UH@YŒäÜØ*F·#¬ô†7 ˆh1f”.¥èÉ fo¦pZaÀegˀð©|WÒdÄ &ÀG‡ü”‘/ÎoO]Àᜠ¹°›ÓœpƒG—Œ*‘娄#‡ ˆöócAÆ8Tqš´Zy¨¤9 +òƒê½¶/÷€p¡›Ð ,Ãpï Ì"ÐDÒ´:©Û ˜²Y†!ê¦VDŒÝ%T…VôÑ(¹óŽ²`¥Ù:Û – fB«|ª¾Ç ØýAƒÜD¾¸Ë$ü­™€ +žW=Ås‰j¨—6Ý<Ó ñzÀq©ñ³„`Ͻ>MÓÚ® Zv¡ta;O¦¹¦Þ3L!¬¬á†ªHWÂ8àÑN.ÀÕF6¡Ëu÷<-8v CNfƒ¾È{°€iÄ·6²NÉýPS]n¯¦eèô{ àM+%’  Å•˜c ŒÍÏ_¨e6ÀÔZî„ȇ*ŋ_÷¥K8³J‹…H­ l³I °/Ç@R^!¬´|®ï¨ß_…)´DþØ¾È:m(çdÚàD Ÿ´î£HÆ"i½ÖB{Đè<,k†>Y@ö’¬¤¼Yý¾Žþ2U E‚Po…͉8àï8äÝÉqV@ϖò8J\(DÈD‚ Zȼ`w§£nã\^-(`”l㤫Yå]ýq»ÚÖ¦`õê +p[q … +,’ê¡ +¸ Å­­€Gt0¸ÿl­è£Ö +È+0·s ½pÄr*8ößg¦_§r Ë‹±Ñ»ò4ÇÝÐb+O”" Ø$* JX¶+ 𳴘&¬òmj°Ó‰ U0«Js.ôÁˆ•¦‘o +˜±ûË›*Sš­‚fUJ€-ÞHmÔPýU€[WCõãþè¡ëE™îS[Éå¶BìãÕzⓠp5»Y›.ÕP¡-/gÛOÓRU×]pŤœV=* P)럔¶Çõ½Ì” 7’ë(òX¢µ›¢)!ÉSÎmI9À柺õ<èà‘qÀñj¤ï)ÀzVPÜ3b?{Í) ÐńÕ=zS@èáI¿fF„-{p™™ŒÞ‘ñ•û_äÞucæ¿n­*¨-­Æþ¸Â>cI,“B4¤€ø ý(@Aâ‡* +¿–; +(Hã%ú1%íñU]§o%v’ùO ř<ÄâÆ<ÆrqÂ|jÔO¿ObÃR¬‘I= YÌÇr¬Š5® Õ˜€†EýQ@|;Fˆïàâœ8?Ã6*Åa,ˆpUþ&°ÁüÀó&`09ø¨ .x'À¾LÖ'@Ú°,¬Í1^Ší´Gu€9ºs9À\¢R۟…ÕM@ƒÏ=ë÷½9€At½š· H©7’õÕ{/6äŸAyr€¯Ì_E‰¸Z—ݍUºè§Tï)r„jâØ’LHJì°Õ€íʱ¡¡¯ž€Öѹ0Z»Þ£º//<\^ôN3䈚}*—Í,4Ä°)1Ô³°L€Ðaÿ!àQg|cÁ¤‚mÖºSž&â $Î˜ˆDIÀ%¢²™Œõƒ¦XÑF-®RHèTPE,ìhG-M êF[‡rË}NK>2Gvkol­²} à +ƒ ô« ­%Ò{Ã6€ ÊT˜:JZÿìc¥Pñ˜G0cF¬ +šŸ>yÉÍ$¶6&‘¨YI€vӌıC=<ªPÄú€9ì.$ÕA´r (Wáß YK ±¥¦øGÀ9ÉUаl3_æÊLˆløÐPۇ1ˆ—½(œG€ÆÐîPŠ¢ê -»ï.Õ]þŠƒ¿êµñ~€°šÔoXÈÂàæˆÄϘèã‹}@´ãDM]8œ,äX³ªN:v°áß" °K=–‹.gIʊªC”–ª˜| «14°â‘nŒ<÷½d J”†P–$ÙªVŠ‰A”&>zÑÑöpðªÈÞ±× b0ÿ.¶#ÌÒl Dç B×`@kAbʼnÇùæ |ñÝvÑ.¶–×0uC÷™GD;¤³c>Õ&n.òŸý$^Á‚ªpÂV°2>,ƒ‘Õßðå·ÓA¸€î'ˆs·nij·ÝO¢À @gæ¿°[ROéà‚€&Ï/qÐÃKquE_å?A@ß³ŽWq¶‡Ÿ5aâ­s ›‡ÆË\@€Þò¼ñO¦60ÿùB  ycWp*ۄÂý¸T‚Óú”¤w€À÷ 7Ÿ ´þ<%¸?:5¸´ËîZ*@ Wl ‡Ìo›õÙú‰¡õÝ^ÂOqAQü@ÆÌ&&üµAHS÷¬ró9Ÿ®]i®Åp³c†º¸^Û¿`ÇÑ(B¤&”> +f ²S‰a«&—=ÀPNåg}™!×Ô0ÿx ¤¼¯á% à"Ìû¢(ïZ瀕Sà€ +š +uÀ{ôEá²P2Žà8†ì.9hv5ü P0ZËþ¡¿Ûth(¶(6¤º‘€h">^3@‹Ý5ú8¬NÍ39ˆ—üGà7)u¼QpõQ•Âÿ"çŒ$²ùˆr–®Ð°ÊM*¼_ÆÜ1À™HP\ÃÞ Î©³µýø8’J|sH SÇÐù~F¨-½.Ž‰x!Naò±MŠÇ¶´òԊû›¬ÞYö³”³0€À×àç³b®J€ì:Æ~ èhøQ Ò‹[ÌJÀ5â3Ÿù;rGôˆ1ocÃC϶âÛÿ«Ž9b À¥ñÜÕuQ¾HKhí7rö¤oˆï½ WãkZ€RÙÄÆù²?ÐM•W’Õ• àC󏓣r^õl¿ Jh;.@nŠÊð ‹nÏb~-€ºªÐHɞ@ïŽ@û„ÀÅ"˜¥‰–›À,`ç@_V2ßØ>°e”+„Ü(ºFv& Àz@ JhUBV‚TAç:M‚,ùó¬ E2%:áH̾0‚¿€!Ü † 5Îb œÚ“P¯\ªÆÁže(¬ØÌÖàT€f50| â§@Š¡ã +|¬3¨¤Ý@¹?‰ÔH`K4J͆[@ :W + °¼ËE&°nþýÔS¢}¤¦(ԋS5ùŒ.:Åކ÷E)¬|¼²¾“ø“¸£ž°· ˜°ÌyÚÁÖà·NЋQd ªÏ?º²×HÀ)†¹’îä*…OÉtr+ßÔ¯û&ÀÝÞpc} @®W†>R‚ˆIЌÀ‰‘=ܤyL•É"3áÔ:'Ë¦âÕhÚI#T°°®(w^Jàý¡c"g# 6¨>zrZÌò%0ïþ°K¨•pAäî?ïG€†ü’ÿ)íÀ§ý­µ‘µÆa¬œk68ۀ?6vØl¬+Ž¨Ž=ƈ“½DÖ|!è^0'÷Ÿéûß }XÀõikVBÝèò?€^‚AE)ðf‡¼¨înÉO Ås«ÕϓR¸Ö<tɗ避L ¨ ~Ñ +´Óz&Ü¿íÆ ™p&ÑïT yW¼EVc¸/·35¬ýš8^ vÑÄà¨ÀìQN¹6üU³ãEFŽ‹P{ÕUåøÄ^€i|EóÑPËÌ(”ÏñL½ø’VxU’êžÜ}­ÇV‘¹!¤€éë?²BrˆY°½žže‚ö€äq &˜x.³•» §ð:¾°(áÄ8ëL1¾±Úåñìqöúï?Ç;†/—t{ÙǺä-:òÔ8Z;=Þ±8E&}PéŸsáH"s;êîajîhúÒ/PÎ ®sŸ^ù;8XB¹‘=K\× ‚ÁØrEòÕLFóò5dätßè9¾t ³èF®åyÛjÙè¢ Ê ¤ð2ý³†¸Åál`€ +ìQ„Î>‘ƒy† yýL«9„øÂ;‹¿ÐµOLàJQº|µýi]ÙpzÑÄý÷ï» ¯zÑ{zß_ïwâE‹œ´ iø~8·ŽWîp»ì¢ÓÅaÜkºèª ¦X¤é¢¹èâ(¨…ˆæ€çpµài±#P +Ê^ـê&ME½z¬Ÿ—ÁôæJx“ЍŽ°õˆlŒàÀ!"Ëþeªrâ=0€¨5õðzÕT³Púg¹…"¤üÐ] ©3¾™L䨶á„Ð ‰ƒ“‹œÞÀ‰кZx\„ê²f@~…³ÀÀ¡Í¸UñÍ—Nځ.ltàԁ[Ù œ¹ãŠ…Þ + Im/̳gf4^Î’5Ýg!)à‹`e‰>ӋË”Ë<1û†^̇ʹ‡¡ôÿd¬ÉÂ-™†>.yœÀí¨(x¦²ÉËOي8VšÑ +ƒâ¥Jnr3ϟŎ­(77 +AÒ2M«dÃg’¢Y²*o=㏎ñ¯‘«Ìý~£°Í‘¥»Ld¯o +`áyŽ]Ö<4ÝïÃÉ)ڡ֝¡î›¶ö%»#ž,zíe6dÀîœR°¥º6‹BFáðD‘›ŽÖ². +`{Çî%?’M•þ8:1Ùçaâr%CñÇêmt‹`q'¹º¨+1¬Ő,’h’âB’w6ß3Ê,ühVÿ¯Ñ`j7 †µ€+™¾Ú`["Œ €e8@ä3úA‹‹±Vcá,Ì òL4”…ÎùÏZþŸ9àê …”{Rbnì+†bø½Vâ|ÎckaäÆ@ɘ&½HtPˆæ@Ý«Œ˜#½àR¼õ @àB,tYG¯ÖvdE—§Ä¬‰¢F“žp¢CJšô¬_LJQÓèˆ1û›ÎÝÛRÊÓ, ç`®ÎÐüûØYNÞIXµàiØîç»7L3Ÿ<º*…»Ä¯^û·ÿim4p‹cžU}Š²¦H,B@ǎ•Eù£kù^£I;Àì2 {ðÍ>Ž <÷¦¸ø–鄬˜þãòÅDä2¤ôÚZ2#– Ÿ¾Ãj"HõÎˤGй3…w« @Ÿ¢ýi9€¡`8à{‚þNk Vè#ºdFµÂB‹¦É§ˆ-ìð*`.1 Þµ¤‰@z?&“\?ÅVœ²g4‹-hȗÿ3ëސ!‚Iˆu&'ᵃÎr„ æ ¾ÛIÀNŸ°oqŌ!!¨³öÔÁ™ù±Åá³y˜Ùꏢ¢Ç¶á`-Ãï7°6:±4¹<)- H&u„SòÚ!zs…ô'äúNx +{ƒCZ›19SÅýƒX>$>YzÀ½Èú±÷Jÿ²qžÏÈ\dZq  ¨a³H»“ͽjfÏDg¨L³c‡BÁ +è×cŽ÷3qÁޛɫ Ýzð‡@jn£(úŠ7¼ý Š×јý Œ] QÂ7Àù$¬Ú‚Ø€Q6dÞ¶pÙa[/¡ÔË1ä!¤•@í?ÒfìtÌSz*q €yöý‡É 'º•Sµê@"Åi>±¹#¤¯:ɶñÀU¸€èø7|—Ú;«(lŽƒ`€ËÀÒ4¸‰ü 삃5>¤ý7(Ø«6ó ž¾Šæî)¦*ÈæAÉy"g +ÞÀš;=£§ð.Øó×W<‘çü!–C.™DQ¿„ÑûB‰——Û6¶˜#´)'nþ0XM„/ÇÀ!“–°•…%Æ~͎ôÓ§ˆ¦Ò*”¢8mke¯jʼ ÈþÕ’¯¢@Ú- Hüˆ+€0«Ã¢C@µ¦ õ0…pgÜçlÄsjÝÃÇéC†‰ãLYþÕȂ^@¿‡Áþs€ˆ\’3˜ŸìŸG,>™Û¿BÀäñÿÕ“ y»&<ô©q±ë]yZÀÇFÇð•ÿÛ jgí†3¥SX³þ:1ž¶…}èjåÿå[‰1ыÄ"Ö`ñ%Ò ÿ/Zõ¤Â%>Ýý¿h'!P +œ.¾ÿ«'C2Æl>S?WÏÿÅÞJØ…3‚ZNß>#çØRêè;%¡kŽ\K)Ñ¥ÿ Á,¾ÚçüBfÿÿ†ëH¦9ä^‹Õu}Æ4x¤ aG”vXZ!¯ ÿo=Ö+ò¸nþßxAoÞÿ1—œ(õŒÁîÔèOÕé1…ÌNZç@¼%*òlªÃ9Ü’ÿóÝÛÒÿFgüýø4ýYO£EqáÿsR!„" lBë!D}ˆßýŸã‹ªüo·4žQý—rN¿Ç)†ööŸ%|6¥°ªtÎ;QÎÿûoÑùbKÔåÃGõýAGÌÉVÄêa؉QÌJ¡" +üs6¬™ªÈeæýg2#c“ìæËÔÝÿb,_ÆÆø™ïCï=±'Š-ž½ƒ¦úÁõ_Â|b ïÙ-UCnKˆþök ‘¥I yN š„® +¶'Â/ Á×¼%4gÇZ;HÝoʐòÈjH†šÿ‡žÿý³)Å7D¨¦9÷‹”€§ÐϘ} &‘¸èÊ7mþ÷T­©ÿÎl&£»¸L9´DýWÞÿisÅ‘A–L™3~ú?¢¡pòsé¦ÿ£ãî=°ç[û?îç÷6è˜KúOêÖö_ÑÑÓ4 Vú翊¤Ê=ÈNþÚêS–´Úóy•Þã¢EIÑ-µ`=„Ù”Æwü¿ ¢-Û+’m&¨üP¹ùOÉu¶gèدæöú¥:!C4óÿAÀçÑ%CÄü¿Õžúԍ_þ?*²åÿ5Í$Ÿþï*>±“ÿñ°µµ&ûciÉÿÒ[A~ä¿uh”M ¿ÿ_µ¢ò™Š+€®¾ÀMG;þGxïbº<ѐ¥F² Ugüѽn‰젂+ÞýXUõ›b"ÿ÷«t •~7ß rV€!‹Æn鴔Åwþœ¿dŽÕõxT«¢úžä– Îmǹ Ú¾-و£àì(qA½ã(!Óý%½|rèêì|DÐJ­ÀÖKy9±'ö·E¹xp}2³ãþÍdß’3Ö )öýUJW—íðô·ÿCšp-6¡ÕZŽ–%2ÅÞíö/LÑ2ãb(À®×ÿyæ‹GýwwNB‚†Œ7Û¿*tТ~V‹)<ž:‡ˆÀÍ ,eR)¤ïG VÿÏçGL8!!QW‡¯Ã¾Ä #"“ ~‡=6ˆ<1,bZ 6 BlÊôf2 F`ŒLöBëÉY?r6'g#i83Ø'T7Éó’ùQ ÐPۜÌù->]]^‹Yn¢?õK$½r +~¨í‘e.Çsɓäs76댛‚ÏW{ÕS©§ 4ÿÜü°óûasúA,ÂÞw˜é`Žx‡ˆ—ˆ•E +®\^óFp Îk¸1›‹@ ›[< nJóàD^C@`;AçóÂÍ¥3 û™À<#788ÁÁÉÁj©Å†Š¢bk `Y]ÄbÃõŠ W,¶¢£D%ìÛ +6.m”ma“(’Z£5s›ÍÌåÂìX£‚«¬X3²‘a…Æ ‹gÁÙÌ°ÁfCÐèXó cIÃÚÓа#clÉØ0·ÜbÛ&÷-P.Óhl`I?÷MóͅÐ%=Çl甁gÚs™¹Ø ÅÇ?¤ÿÒÇ¡€ÀtÛLK/ñø@>·À‰ç-%™P*v‘bçEåãò|@P³¹Á΂¥""2º™ÑŨ¨ˆÞP)úM·Ÿ ¿H﫪¬n±WªnUV·X½LªÞª7TUÅꮋëՑ«z]•Ùj5¬ÍÙ+h(¶[pbö› 1‚³ûæúÿKšB~ÃH}nߕ»Óöm9ŸÏ¶oS‘¥?É|ó§GÒÂ÷ædþ†—îæA¿°Ûþ“¿Þ¾„»ßKò¿÷ ÍýtHÜï½HÌÝï to(¡£Ô½^uïˆÝ ßp×ÇáQŠ/¡¢o'|á-©äð8x †¨4û•ØSpð¡pHGc™N€86 `".BVPRJ å$GC1B°s,ÆBàÌ"W]oÉčk’Т×oEiРû.=º®@„é×ÒQÝôÓ)¨$óxŒß°A#ÏþÀlfn ‹ å™xGÀgº"„±ðÅ+¡¹Ø³›– `ҁl#šXpÜÄСÉ/Aœ0‚5ÐT–áwQDà¸ø°+š‹‹µÌ§Ñ€ŠÖhm~½‡gk¦h†Ôm[€ +/†&’‰džj˜R8ƒ3ë*†ïìŒ +³ÒÜjL´ú¬îFí½à"ð­p€zZÓý™¢±È€M.…i¡Ør—ZY0LâA5_ é¸Ét¤7)ýÄvœ‡á¯ý.@™Þ¥SEԆlMÕ¼y =®ylC.dë$D7“Ö€ +‡QQXD¡äëÐ:!L5 +Ë1Q‡ùó__Фù˜¬*#rî˜|/ØlII\îUCŸ¨ª3Òy\1fâP!1¸›"Õ1o9撴TPü¸atnpA6ÉEðßeèUñ yOG·Y„N0b_FkÖ­·! ³3* ”䙔ϱ‘Ép-dQþÇß½XX€Wò#q€61îGRáßð‰B°©š³P ¸ÆD.„•Âå©"‡V¦´Xu|T`¯->u8ÙÜ%­z›Ÿ.-u0’œ1”¨É¥Ün,ž:Ð>ím»íA@« B4SUþ +ÛUzýÓ¡æ±+ÊS\BÍVÜ)²÷ìUößRªâ&—d½/Ž7æ<¼ù ^´E.+mK5ò%€"²W£†K)>¼8'ÉȕW¤¯e"•PœT©3RîÒ ´ev «zWpnk¦î ƒä}¾A‰D\9„¯Þ¼Çg'¢]*Hd)=¬Çí#?ÐK@ÂSpVKÛVY§¼¢¶–†Þ1 #¸r0ÆxȚëÝ´\çå~N2åÏâ–²®„ð/ “sÊsøs%NÞ}·« +µ¹É„©\q…YvŒfWZW]™©p"?æêb‹9eM^>­ayó™È§Ï^'w’³ÍG){šVðëÖ<ÍHb¿z‹˜Ft]L~Î琼ŸŒê?Lþ¯pËŚ5¯Z^1L æ;åh]Ò @ÑÏމ•¼«hýÿö(I€—1@ž¥FA¦x +Uð†Ô(”ê +ŽZ‰$¦<ÆËI„µ-êü§-mö%)ãoÜÐWBfÕú•&'G°¯ó3û  H ©§œƒ©åïÃ锥ë}\šºÖCèϾññë‰ûjµ‘˜À}lÑo_cò•,ƒ:/=•dˆþ…"Eì µp\‘a'!)‘¿>$7Ŝ÷×?}Áµ¿¼¾µåKj¥Ëw1ÛÎÃm¬øzŸ½J‰¬¦%GK% "™—zQ5Å¿‚£-})ÃûwòûhÜd©)åòÀQH5¥µ±¶S ÒM©ËU¡·„ÓB@¤¸Tì‚áî½_Þ, +œñZDh0ÓóšïÀ•«Kƒ¹kStª¬º%…ʯ›ð]ç½=32ƒýq†” ¼ïr¥4tATl(±Mä½ Å+Š¤ñà‘F¶ïïàS²³ÞjYÒÒÀ{ Ô1 +®ß‹³ókóúïØ'eëL~¯ÛŠ>QT¦ä¼_— [ǕŠrv%!Ít…bcÁ.”†ô´:é9µµÛ»×â!ʁ…ͦ:$\š‡À‡ +g5¯+KTÖøÓ?{+4_¤‡´mêŠ{òz¬4iK.QLkޏu‰HÕdˆÚKˆ*!ÂC6~˜¢ÈtY§N‰žà}ÖRDbà ¤ðc RíóŒ§1‹¯ï‘oÆh4>á"Áêޘ1zè$¶ŠI4$”ÙüÆxûH ´ŒãbúsÒEá0p—žՈðØ~+Q@‹ iŧü7ºªK"XZH‚&Z´m Y#؏Ø!³:g/ã,¥ÖRÂ&QO½/þŠiX¹žJ‰¡s|YÆi•¹OÑB&’W¡Ø~¤Ê£g•ã¤Œ¯C¤Ê­¯ì4D1aÔ àÛ¨ë)&Ÿ!’01N})ê™Ç¾xíH<¡Ú#O7ѽݵPíì%3þigêúñ©—Øwz§€D'‚œ¼%¸Í^oD)‚k$BP÷[ÁnAüL—w»`ˆàµÍ€û1ÇÿŠú2þ¢¨^¦ +k p8iÃôç6 2ÁŸš 5%”Ì镕‚ƒtÇ⦳Òñ†}هÊEfg3)…uK]E¥ä;àÊÓæ‚ åžD18#û¥P|¿Ñ/v «D<È~- Œ“,Š= +°‘v›¬<‘‡e‘¥)n@ÁÒÁGçØ 6¡sK2Ï—ŠQkVEzâ|ðÛ§ùγÎ$ÜrîYã,;w‘*nÖ`è”á(Kð‹ øÔ­²Ö×Û+Û!z#ôžàt¬Q£ŽÓèÀò xYÁÌï•Â9ýÊÃ狫en1˜ª»µõ_ۖ +¹ŒžB‘ê«“ø¬D%ÈáMߓîÊÄîsŽ™j·tÞéz÷ä¥Q?AÙì¹…Û¦oAQ¨@‹IEŽãì1†(WfW_aŒdiqáXÞ{«îŒí¸Ã8–Ë´Žúß!nºD·Fýä°ò¯¯ÆF–ßšþÉ¥öÄ 6Ðø÷Åod ÖÞå­ÝÓþ¹èxæ^Ï9E%’ß3{Bnº»0‡S^bë $Â)’_a)}à’‡W'Ih‰e* Myj^sJé¢Ä:âÂ¥'J£LðÙ÷—À³ ^ÌþÈNá­EiϼRmó‘òŒp‚ö7˜žŒ¤ù4P?2È3ƒç³<Ö)VË q2® x® ü(-/l|.Ç Ì™/å6Šw! ‚é"Ȏ µÕ”q ^‘Ö]LÆ©"¼Qìµ(Ž Ã&cÂxÀOÂà¼Õq/%1`[õd×Pk}*ÐQ ŸÉ7ÁŸ°Òeöá»$Ô?8©;0Zpav‡­ÇÊ,lÑ9—†&H$ì‚[D«8ƒ Ùn@62•N-qk(wjü_Ø]Z¤SHß 7æcs¥¼Fù“‰¥é/™xŽeû0b%2䕍dß:ˆ‰ÝFBe3FÖúbY:ø,‹`–†…µ±vЯ'ç?Œ]é!Ñ|„p¾8ˆ‚ ª>·h[.X«£@PöƒŠÇ£Yâ÷ÿ*KÌy õ%ѳ ¶&BCE$¸Ó6øâfìʤ ­ò »…¬Bð¨T×F` |oý¢›zÓkã)µi;$Ð/½—;xAŽ¦e2+ìG눜RשèãºLwЄ³¬À)?HŸ½øS&‹Ÿ/I!æyò> W³À{l|:ð4|SR\ï/øCÇ€b@€’áÙtꎅ¨d+þu-!XQ¯xS©Ù;—©‹x†Ë´W‰ž•žÄyå.Ä –Í>-“N©o<­j]-ì¿¡ì!ð™ 9›¦žjÚÀãâ:‹¹S)|EXLMð&üÚ ¾NØl¯ëã¬4È㯐p["W$H›÷l¹»èp²¿]$•`éïҒ ' "µöB–ojx™¨ÙKˆãþà]Îr¢SnÂÜÒº#<­¢J4µæ¿Øój=™¹!|6 W©&%š™ímô,‡k˜ ðþ,)%ãèÛ¿óÙfå2§k*ë ð~Jºmæ^/dB€¹UÙх·uæbSe-x5p°2Øa l¬6 ¦Sak5hiȹ€Ïº\F-Ú'U℁"ÅÅÒ!ÛéEªr ۋP^ì ©@h’ “Â=È4TTç"UQ Gõßòó„D•O:ù¬²‰9’µ¢û^ ³=(&̞bˆOB—© +FÁí”A•5êÉ~Üò‡¤ÅZù6ÛI±¬¡4åõà€:Ø!äíh9ŒØIYAxÀÙä\ZZ¥â(i%©•X?õ ö5Í>Ã,§–CÏœ/I¿– TNOÌð7AùWd“Pn“íÖúgK«ÏW–Jàë›Õ [Ë&')‡¢C\‹žl/F1E‡ñ`ñõšÅ'ýÁ”Ú‡¹€ÊUdϲeÂ"õ¶ò.IÂGº½"ëdÇbýc Få§Â† + y]xÈDG¶À´lQ‹Zö³¨šuSx!T_·ò—T¾V¸˜ñ¤<Øø½Ú*að‘½%ù—Gxh…‡^±LÖ ² +IÉ.J¢ˆê•Óžbċ氃âz¸L«û¼2¨y©‚Ð’õòûʇqøgŀÂo‰•±K$Û_×Ð7àâ^ÇϤcq©¼Éo˜ø¼PÈ`\¹ý‘:¬QÈaÒûàf» -@N+MÒA ßÃR1d¼úv=:\¿š%ƒ~GÀ]zä3eaVþ‘):E‡J¶o{‹¤¯òü¢öŽž@œZ~XlèDÄOÓ RA# ÂҲ΁-Ât“¯Ð äR¬(ïHD/ELYýY3ñ£LٚÊ` ¢·0©^¿Ô¨t°î ’ô‡orà‡ð'J™G ҋ _šì +Ք¢å_/àG/+àzGû’`PŸ4õ7’2"¿¨_¢€Ñ„-[·W +JÜ(T¯Š *àM3²¥J!´.â1Á3¸¶oXkŸ„tF©ž_VœhBmPÐS®þÖÊ ¬Æ›v$œù1í£´ƒ¬kÚ0Á¼ºd?^Æé„ÜÖ¼:•‡9ÍNé·ê¿ÂÑ;לa/†y~:ÙO«ÐÛgÄLö]pl §pc +y¶¶R?Á}@AX:‡)äٚ^Ÿ>Gv©.¾A Šg-(þÃÙÕÖ\ ‰äf}Kkîu.´ñ"çµi‰nuࢌ}액Ç;‘'T—-ã Ë×$2zÐAJ$.ß싞G2¦öîVâ†l¢eÜh¼^wøP¿Va,;p5IbçunÙßtc5&RéöáIÐÉûڋ’sÀj¿<»3ˆ3²µÇ eä7[*ðrJ°¿ìölê˲0¼†nþ‚8iÓÂègøJôÆÿùŽk3m:s® í¤KžÇ\±ÀÀÂEAÓßÇvõ ¦î9?üPö]N‘Ë€ºY<&Ðî0ç¯ ´<‡ÖOㅀ£]î6TQ¿4Չ”mP&’ + ’!xr£uÀ)6U’q¿‰ë%MGOf‰¶­’,¹#¨²˜ËêH 2ßÖ§lQš×z &þZ b“±º>‰k+nŸ™+`nÂ3¿É #•fAPM†ñÞ9ÛÌ´ÍÇ©±†K&š‹1)Ûa1·hщᆥkŒ€É¤€IIax‡÷-Q‰h¹*}&ÔcW ‚ĝ«GýÄ|–Ja˜]ñ[x@ËèãÈ4°Â q‰Ŕš=§àüÇ–¢ÉŒf9Ö~ö;b!«·,æ RÏJÓK²šÌÿ=>Nç#P°¤Ç öԐR§¥ù˜Q“ï[>¤½õ½#)Á3À<ÐWâ< -È^J¥žé5XÃËÿ8Ž“(Dy¾CÅë`ÔB"æÁêÑK$Ç;;uÊI»Þ\(*»Í^k1œ5QI/o²H±N`.ñšJeQÓ=aV¸¨l'GiìcõSŸL¼‹}o@ÑQfy,ªàM¸{]Ž`Ùì¿_ù«ï42‚~$[(ˆâ«XÏe¼ÍjF©ñ¸q¹¢ÉU*âv†qàŸ +qâ㿇Ù~VefŽƒ ÿ/¦9&á-æï0ýÒÍß‹×a:i£?ŽËìo¾Eqш°”Mœa^dŽ£ÿG횸 cŸ†þsèÃصt†) í}aÊWœÓۅÙdÆ ·…1•’¾ðòfa¦‘ÝèCŒR©ò½—0Co›Â0w„ªàôãX=a¤Œ í7lnêš0"³-a|aðӌIe1g, +ԃ1Ƨmâ*L¸Ûv0âºfóLLs0â:zƒñgbåÊX­Á´’ÉŸÁ<Æ'„ý‚Ë´iPRÅY,m +„{(áïxJý7¶QšSzò»&30XwÆÒÌ+ßüý)s~¤Œ[ÆÀ÷JIô€™:hù’ŠÁd/šrm²¼sÙÿNÌë•0!Zž_WÏ.ø÷‡ÞO2BÍ®çÍ1ìä_&ÿ«WÍâûËþÏàõÁ«OŸ0ę¿¼²‹¿ +¹ß/,dNí—Ú·¬_‚[”²âoòçãö£4ÙVurª!ìw}qgb¦Å$,ú(S—/&Œq|^F}Q5´>N¾Ø”jl­ ©Ìàø¢5>ÍýØ$'×ßG^]Ìã(ChíQÝÀ‹}e¾ßßÈzô^”¶R¤„Á­4¶Ü‹Úª]ƒ œöeho/ÔTX{ =)µI$ÆzOɋe<‡Ø À„Þ‡%¼(ÏBoþ}^l‹H …—F"pwšdAâÎÁ5*Lãøy9Tu%¨+f½óR:‡›—œŽA;ÄR–•3/äô‡k†c./³w4Š²¡ÅL^†KŠuéQÅb¢vó?Dmáe›ì¢3ÚM2.Ôd¼¼˜Žâ“Ã&k¡9ðâjuj¿K¤‘@ð‹ “±ï²E¸wñ|÷ì ë¢;ûœ¬»{ºŸñÄ]â^_}2o\ûSùÊÀYë¼9É\»¨ð(¥]üårtI9Ž“”]„›"wG ÉbåÇÐ$0ò* «v†Ð™ºÅ¡­ÄrYTÌðå᪇ƒQ†kÒåmqÅ&œ6ìƒ|‘åAG`M#²l è2µ8¨ÍVùK’+m¼Ü¹K?jj.¨íáuF6¬™ËH5”sI²gÒâœÁ—‹ž‰('³‡™-—Œ8 ‹yÇ1H\-֘r©]à>ºóq™ÝÌ\—r`¥®dãsnØ²EÍt=!fþ,™¸¤*ÔêqÅÞ¼ßAy»á‚AIÃξ‘GF=ÿ–¨3ɯ¹ƒZÅû–å`Ǭ¦Ó8ߢ_Êg?…î-;ê©·„R“Ç®ü}¥˜ë\ÁIÍáíºŠ,„ҦܯԊXó+¬+Ðóáúï®Ê@‰§t¡€!ùÊo%ç•0N,¯ðyY ¢ø•ƒ0 C]Eµ»ÒÇR°ùVÜ"ÚZ¨ºDa¹]éüø{¿DgW,l¯ä½®X?:«+,,³n&“étסµ¤_]\ÁisV]øp¦?\I†:J‹«í\y53Þ¼\ä–oD…½•¬º p¬­<åÖØÙJtçL‘ ~p–çÏvÅéßìôè[+)lN¿<‹Ð)©ê´ +|Óø…mëOÆrZٝ°Ë‚çt¥•X‹]­(t¦âÐJ35v„JPñ³B ãôŸÄ?Îëñ‘Ä@:þ‹u )ÆNž+€{À…³Ns+ L¬Ë(‚Iþ64¢-óÃ3²ç˜ÑˆX1ðU‰æB¡?ßy="öý¿Š’g̳à±ÑWùê®#cP³bˆ´Â¡C.ńå®ru¯-q)±VAý$ùæÍ!ˆLƒÓ´Jþ{ä£>«TœðV•+«˜M—ıʿ½c\#TFX%ú£‚ˆó â´J1~U´âvUü ÀAÉÃÙª°QÙ;}8†¬Êz¡Cã¶t"Áæ¡rä+—*F[ÉN&U,zé£ÊpYV·¨²)™“€ÒÈC•ÔˆÄ¼)XUÌkÎ{¸ŸŠY*åTÇUõT¶.Îô39¢9+ïÚ0Rw*â<~q±æT"Ã\bŠao*[Op_S1ÎåþFÞۙ +ÖÅkËh%b*u_”¤ùË6Kæ<–$^b«ý)]چš€ +0¦ôT Wԟy6<*F¢¨ÆΞç¢5¥!®¤ì+# ¯FÚA¨@SvÓL IÁ`@îºn@ÒB +($%AüҔ“¨DËæ/oT‚Ç2ԚÀ]0g.ƒ´»Ÿò€tPÀV .EÃàzxs>ØæS^¬¹™›|¨r/£],Ó¡ùC×ÃÈVøßfþî†qµt¦4SÈ,a)ñ#7YÑÕHèü$c_ƒŸì']‰Ès´Ï)aĪI££–Mq¿bIkL„×äR2Dd›b…jŠ5À^åÓ¦)¶ÊàFSêFi֗)†sJKÀÈV†$Sv󖻖…MœÆS¼Þúᙴ‹)?Šr"`Çj}]ÖÏ~;/ôƒ)ý>Ú%èË `É׏Ù'í–Ò|ÿâüÉÎj)»;£ëY +7fȒBoG‰ÔWʇ¥áXÛij—‚±}9ޙi¥ 'P´ž±Ji6šAà&™J±ßSO=ûS +T°KÕ¸ê"LZJy7W¥;s7Ä“§"d}RRpî¿c*D ÉáCX„¤—è¼IYŽ îœLJ#p)N©KŠéÔ¼Ó–Ž•”Î? \p0ÁV')a‚80’².ó©1oì­#ފj®In–î‚A£h¦Æˆç]3âé? +¸õÝ¢|P¼sQ*õì©4Ý£$|ž™©W”zé„Œ£œ-Çä7ŠNݐˆLg,:Q† ;O” š`OqRoÃÄ1šìœà&³}­} f¼MûÊÍcdˆ—+±ÕÅ¢ñü$+çñVF6N®t«LEÙ +ÉÕ*Jö¿t‘¿¿( +°§C}#I QÂt+Ô8ÌQ#gÌ­{(9 ‚¾“Ã{á¶CÁŽ‰¨•,(ê` +†bª¥_(áGèû¼©ùT'C^¡ìIá$¤1Ž–ÔS(–?M¢X|JÚJð8Pö¢ÙnÛ&’Þÿ‰~2>wC•/݈yOù“ßjgMiû$Üy’ËïAeU­]Ÿd¶¦‘ŠíÒ'þ¹(A=ŸàMaº|²ÓJMÚ4>yçs‚Á4Ð[€rä§{²£ Ђ¤?iGÒh'º‰x¹‘xõdéh¥cUÉCôäYÍÝ%ÔKcˆf9DUóíµX Ž’òþN¶Œ7Ú-7 ‚ٝìa"ÿ5j,ªÃ·Jj'Ͳ£½Ãì>ÇN4uÊXÏÛÿÆ\ÕøŸ¹Ñ¬?NbxÎàÈâÑ+—Í҉Ú/†F'"tZEO!õ סÉÉ+–`ûšTvï&„iáy  kÒã$¸AÅir#Yô aä^Ô(á"´èIñš’m19 ï¤qË$¢ ý­—ߟŽ<ànF¡œð(J;<“”mÿœžõMv{š°w‚è}„óçAÃËD‡áYIzÑbë. +é®x™6I…Nðì膇´È%Ç g“Âðµ©Rg»Á±„±Éœaù†MBä1i=ñ™,vMe|Nzk‚pLÔFM$‹ö1¿ç4œ<¤¸ܑš{ˆ»v§A–4qý¾€ô+Q&;5T&³³bÍù§/›·í‘Ä&½E³á¯"GZ—€íLx ›l0 £›mò6nÑU¾ÖOóٔ¯*&…{ô’†aÙJlvUàßå-™2ı`iIDý¿šP|w#7G¬ûBå´F’ æ׊z=O+¡dÒe(õ~AD…ùùŽàÈdMdC +TÈdc‚!› +л3‹´*+ø˜ ¿†L¥Ýì¡8¾÷»b"Ù]åq‰~¤#稄‰û¢?˜x§š?ÿ àÉ)¿°äVéôîï| Ls--›§_L4ºÂñP±:­'òÝ-Y˜ñÈxæì̹÷’·&­— ZZ弤 a ÔÂ7€$-édDÇÒ³0_ÇdÀUIF–ä$ƒÞrB‰Í—¤J:¡ôpÉ6!Bø–ØQ+þ;Ã&á»n‰‹aۖ<›tv¶dÎöMí)罖°ƒ¾®¬TKÚʨ4-ùyV™—èÉûÂ@XɺxMÖ݃P’Ã’=‘Á’P4ÿ•X8e¯d°ÔF)k>I>ð­Äzk% L9+ Uõ¼8-Ÿ+‰&žW‰²ÔïµJ •8Y•¡›3íz+#Ê«ÅeËmJöT`†šlo¦Ä  Œq@Â칔¸`_§Î~”Ĉ2íFÉTò—È\”>%%Ÿœ(Zu‡’šùX8¾ž²_‹\†óAÉ¿DKžQ8Pòh’Õ?É(€à’|бSÚ4€õ›D©¾–â·—µ×$•S›&TkK!Ëê¯C­Ë)±Lò]ÛÊuI̔&y÷dŽ_’]ø;ÏmàtIϊöëV”‹}4ž…¦\IFЗm¥scè†ýOuè"¡Áw$Áï“rI.gé\‡$üHÌ]‰ÎA’ÍÅ,µ +$¦ÞV>Hbª¶r³÷§Líò1¤dpV7‡Û°F¢"_;:æ3’¸’sÆHF¤¤Ž2c‘»ˆlBC®!‚²‡K‘Ì‘oM ¥ÉÆÙ ‡ƒêÉ¥„²‹?½#$ó=bÖgAG°¡*’Íϑ ˜IÀœõ-˜˜Y½±>öƒÿ ¹Ê§'ör02ÁÍR²žY%G(Ѐjh®¤ ‘þÿF'±ÄQ—;ɏ±¯Ð|M:ûK#ÀÛ „I(î¸[~ÖêEÀsâìžúJŠ­?˜3¯q®¡Þå›0æ!Q§4`èum(Où 3õC¯ÑÊ°Ì +/\<Rʦ>s$0OºÀqÍ@¦¤<½ÜA ª\Xqsª÷wÉK +’vŽô¤.h‡(ÜCð|Ñ3%J݅ºŒk™- ›™=Yw”÷ܛýKMÐ +b1„û`_éJi~ÐÚe±wÓ©Ðp¿õgþ7^8yeM–©ÆU§.½Z…D.sî«|*ÃMU%«7}¯dáØäw>G ý˜_¶Ëž=÷î~NTU¼/˜èh‚ x*Ží‰iã}±é—ŸVçôz ­ï1Ñ + Q¿°Å(lʖíÌ"8‹V\»{$¶©È×ͧ©eC4ß=Áë;Ø]Ú:˱³j0{‹âð3ÚÍÜоëƒêfLˆ¶·0çâ +èÏûê҉LÚáo:Zj„À61«6Àò@dÞá±Þ¼ÉíðG@—éìvc£{€”ˆ¦ÊšíB]õèzÆáv×°´ö\K@ìZW4Â:h[‚£Rƒë`"ÈÅÞDGøqûg«nÞ>yÜmü~lºÌ¹_ËDiâïçœ-'Ó¿pùCµj‘¿¦ à ûèWƒj`1؋3zT·¨ÐðA¤.ÿ kÓp´è¹þ!„¤ÒbLN$¦=i_T8 SÚ¢%¶Qk(Ç"ÿ³Q þi݄Y3NÐÀõæˆ:ìyÐ'8!øƒÂݒyZŒ[qúìŸânv“¬€ž’T¨µÐlnì—褄 ҙzé[tú`—N“Æài‰ˆJ¨”èPÔîÀ´¼[š*&ý;…Ö$]’ +«­+hzÀØ uëMnøxhô¯SzXP=¦ŒHóîȄ¹¼‘•Œ!<çaZ’Ñcܲñ)Q>çñ˜r Ú0¥ŒŠ¾ËCy†ôyKIá²ú‰çœ1AÅÁ¥òOŸ„DâÀf&šõMa_<ò(քÉfÑ0q_QR3¿Õ¢¦“ON®øÁ—Ÿ¡—Çñ™q8TËd/Ì͘¹76†ï^N6eì§êýšsN; Æ<¹4&ו,œT("”´ß7W€€f~ނHï|•I†ˆWáìó‚ö ÄQH­¼l€æ)ð®†Ø VLÅ “%ÎÀǺCVPG™Èyºú—>ÁÝ"’Mé)ÔA¬#Y)«=až»]¼ïHëšÕsþ8cüsE‰dÞ +’"ìOƒl¾|r¬>³sÏÈG´¥‘?n²»…DRéL%éɗÏeS‘+dá'—ªZj{_/­<óÄdsr)ÚáG@ù=晘€hËLèü¥a‚3ð#6Åij#åFYª˜*ŠôoaGäd„7€ ÌÈ%Ù¬C¢Å·yŒµ‘ï­'zÜ“ëÜf( + {¯~ ïi â`©W: ’ ‘_VŒMIWãW y<¾TAöîò£1Õ¦7ÓªÄ@žGˆ$TœâÖ *…=•x'JÃ7z¼9+ù ®±ß:téöëy‰™ot™µ¥h(ó¶ˆÃ=õÓ{áò¥&¯ÿžâ¥dq~h¼8¨$ôR4ŠH;Ò Ç#1!K¾lê°h +=m,*}nœìdäÙπʎ|>ªH¼IiÈYÖM MÖòf˜Æ0˜âHøêJ`(uä|ø:¼™%0PþK ‹~S¦tI›Ý‡bùêæ¾ÖÁ&W7 ß…Ô +™n!|‰3IÃZ‘?#Ã[€‰3Uò*Ã"Ó¹èªø@.Wߤœ zªÓGþ‡H-œxKË[À§€—#½7ÿ“’üŽ¢+JÅÈ(BäHh *ؘM—NЂœéY g7ŽŠMƒâ‡¿%–€¸YšZɦ9Ñ0gpõçýZwÿIš˜D) Q].ŽÛ@Â9º5D€üCYU£ÈI  Cé” ](‚m¹rÁ’Æ2P{(NnÔÎÎ8¯{‘)߆‘Â'ü½©á@8”z#Oõ0Iډ°ãÙù°¼8äË7ˆÍ®+Ü Ò’ÿBÉ‹‰áeô´nx!¥¤ï—B%k Ï ñI¥Âc¿ r¼¹b3Bðww§ƒ¹ôàvþózN斋òåS* (òkDB +î‚n rªrÍً4ƒ 록'(‘´ár··hï¥\ŠÝ–zÅõ}ŸIBwc$D€9ØÀÚpHpqÃq‘X³¡e§¼*êÅù£¿BÎh”kÁ7[z‡GÃ¥ŠÙX iö j*/s­©FÎVÜGØô±Ç‡µƒ<Ïõ ›ß N?+¸Û`@3ØyǓY Cë&ôZ^Ã(Ã=P³Œ[èúød:ó8Ü<xØ.„Z[¾Të *^S8‡ÅË=õG4{Øc +‹åJú<Êìy¥ÆÙk?¨Þ>–^ÏÒÇ_E´:kÙYPY§8ë͝ ¾ÖÄÌÒçœ2³$„É$ÐÄڇ£ +Ê +µCs)ŒL1 p\¢IÒel£ÚІWdôY¢T¬ëƒÉwû*v:}ŒÔ¯€…îŠJŒ¨q‘´k¿Í`Âz<ì¸"kL8 +"UBi8¯3€‡%‡däËrú¬ ±* X»ñÞCõ˜ K£Z[8U> –aÛ+xñäË[¹FDә#ÄÉÒmÙ¼¯‡ÛE‚  šæžØʇÁüð;“Œ›¥5«´Á(4r??—±þBv÷PjU‰ €›*CډxBTc‰t4ZÁûH@Üç¾^ÚÈêýd弨¢ÚŃf;5Èõ¤@ìý¤¼²E춘\}xÙÙ¥ëvQ‚jĵ]½Ö'欑7¯ìíƒn( å¼ãìéøçA?õ¡ÙL‘0úƒ²‡²Ø^X[Å+®T!,ÒPùø¨ ™—̯ª†Ôm8ÇdÌéò¯=³q}Z¨ŸL} ™@´x¶3ÂÄÇ4‚H2©GA´’KwÃ¸ý ÜþM¹§í”9üP¥áœ²ÂyRDi!zÀÉÑ«à{ Àó â€ë0ó ºWé‹-uK`í*æ}}j¡0°®h}ȝ»_ý7³Rì9ì7Ž#aì;1;N"„•%I1 ¬„Š— ®¿³âiS֣ǛfÍJiX®ë2Á“ø.ÕÀ Oo]g<‚™‰-ÑP„MO"¶‰{S†î D*©¨’Aú( ҆±‡æÂ-¿úÑdoÎÿ‹óàÛ%סÀ”Lß_ÞZWÚà•aèÀ‹ÛódþNð @éOIˆ“+¶—ÀH\¨îhäÜ´BXoB ¯WßO;~VP™e‘–í¾ñ1vw?„I˜ÆvnXº¬‚õXöᒠm +U–‡Hþ”Ö}Ñþdu ºt!ô¦Å늾 ›9A‘–7úgÏØzˆØêKé9'LnzŠ?q&IE%CÈ®§©Üû="Êòž,îõ¦h`2PƒauìÒZ'7Ž´cÑ?òúyÌzƒ òÊyW½-_Ëê‰#·PòVš‘1Õt¨ûӍº[¸Sb¨çìLvQÐKàŠ+vžZ!ÁìaÜ· ý£à²Ëç´Ø¸)‚ìž·ÊÐ;a™ -r¬Ú¤ +ºä?ÿ„)=·t`­q¨™Jða6LìŒT§¼¼˜ZHbÀ@ Hˆ^eVúÒ~€'àv}OŒlÁn7œðóþ5hù6{ÅõŠˆžW¶-—$!Ê⃪(0¤M†(j`—ɦÉ7Ü"ýdp «(ÓÑUÿ™Ïi7¾bYôj© aÍ©Q,ÌØ=në!Öhßçf‘L˜‚ý¾ˆ¥!ë7x²%EˆJâ G_(¸BÔ|Çw½ªdo®±ëñÜUÛ(SmoùÙCF3§äºa¾ï°7Ëˆìgâ:ïaE¨E.ØÄZ#<°wËð\#·웹KÎ_Œp5W€ŽZO„f'dë¶r :®Æ+F oG¬°mèw•ñm˜Ûó¹kŸ|«´¤œŠQÜeâ9 z0’++é¯ÃXVܲ@z +xg +k[ -"ø„‚« FCÓ à˜?oºìøàDÁl"dæ˜Äُ]˜¢½€›,Ù Ž§^ø=ÌJƒÞB¼“³d˜Û„Ž[æLøW܆tà ™lÌ81Å×ùÍ×±®¨,PjLø‡B[>ÈŸý°Yñmb2˼Ä1¢N}æ: 3à†\ƒ‰zG-í2 +˜¥ëȲL;k5[TÂΤƒ:‘šèŠ)XOQ¾‘+áÕ©Bq#rty5J,±_5¸«žˆUJb~ %¤\Uى”Ó âoZq/ÿ|¢¶Àî$n/1¬E[2B¼úÉ'– +Î`li_7ÚD†8[dM~„ñy×o̊ñ0÷¿Ùýâd+&øy¬)v‰Ò„6ÿá÷ ü¼T”Ó'‚È‘{I;Ù¢én= +wP½ý*2JíeÒO6j¸_7 à†lõi¡=ՕF’Þ¤2„D|È MH—ˆÇD–MÚ2 ÑG­ç,I~]Ã;±Æ6E[Ä RÑæ +z@oÈïo¦FŠ +îk«x)Î6˜J}ÎøÇ‚ÉÔ¡ö_0b˜ÞÔÁ éý Øð>Š‰ü[vì—æIrœ” e$P|q^Q¡avŸL×±l!Júœuú+H(#a=ú–‰×ò¦Dëîfw÷îR¸ Āí0»¬—Ò+7gGÿ!zWà»JŒ1€|íLAµ§v¤ˆ"G¹Lš ‰ZÈCÕ<ú]Òp=ãjÁʳ€åshVñ×"TH‡LBU ³1'vçdª}[ÀÚR+!‹ws,D$`s” "fpZÂX&šàÌÓý»¨$f¤_}¢pø_4¦€‹lAê´Ù!-4g§jAbå¹²$'O Îææ¶h'þè0(¬"ÏV>¾s¢S8pº:)smwøÖ¹Œz¸1¤ ¢ïÊ<GnÛß)¤´‘øèOÚDGË!?å\K`³³@þþR !UÖ4.¯„°&–óÌA›§£6âäíÔÃÏÒÛ!jˆµ¸¶1í7²h+rµ©C>²·Á°³öÀ†?×#þNš…ó— f‚g¾ˆ.ÙH$.ÿ,öDfÔ7ó¶ímR¸le,ß7/àÿÇnŸØav‚ÀéfbÜHo"Fdk™qð>Vi%—é(e íчl§.àUـÒHá°!ð´;ÑðMµ±“iÚ}ìáyÙÉø‰KÍFx™sã]«"¤¶ [ýÝã‡!c¨] Á¬<€‡ï +£ãRÇ«ûïk-x.y*/ Kr„Øԃ<Ç£GVöåV¸ÈÕ×l•xJ߇œkÊ!rýxq'šW ´[(¥'*—ëJ•Í¨‚_ÖîÓµµ±cC‹9´Ü›½ÿžnŒ)ÙûuÝCÙù߶™ü+ê´Ùô¦ì .Èʘ©Øû†¾O`{ů›W5%Bº Aýâá­B±r6q|™ž:ÑY§ÿh6Ó½áÙB•LÇçˆË«GA¥Û ” ܬ3Zq~¯Ÿ ÄÓø2ÍFDÒÊn9‘¯Q;Ýnçòg۝û5÷ …†"w{K„’¨ÏÓ«Wż$øä€åX¡Ÿ ƒÆ³@D‹s8l…ˆÕk­ö6#”oUv +Ž›©láu,›ûX Ç4]ÎûB foQِSH5k<ütÔ&64±©7i±°=˝„Þü×>C¨¾~ã Ã¸\ mS—?A}橾Ó,"âH¼ ð‘–ÄQèc +(­‰øiûìhOùÅ RM~ð·ß°€—Ý¢ Š†§¸Î+òz·Û+•è@’aDð”ÀæèkbœJw"­È?î)™é ða"…ë0Ÿ²)I­ZÂ]ç!Á`rāìK-4ç{ðuèÁf×4֎¦í½ÜKuøºDNHìÉiLi þӂ§°›°“Óè`ªÅmb–;omh#gŒ9žd¤Œ%©ÊA»ÎšxM'«1‡éœ—Ÿú®ûª6kĶÁ, †íyÍÀJ€HL†·ì±<{¯ž¼¿ +-vUýÑ ÷(ã;¨Wª£Ö¾@E‰O`©Ðz7'æÔ1•ª4EÁ!Ó>0â ‚””Ô‚ŠÞG; ™:¼ø’Boi˜QÝ@Ō •ºŠû4£1ÈN2y áÃa4Êl¾竼ÁxÀ'‘N¡´B)1(Ò V(H{t”þ 4à[ù¢t³|“IÀŸe<󥊐»b´JÂÃÀ¾ŽèH®þŸž!C?’œÕ?у÷Fÿ‰S°ŒÀO8afû,-WªÆ1t|X“èQí/RÑ´¶ˆ¶ÑŽïÈéãÑ|¨/ؖJ8y5â¶ÙÀž[*œÎY~Õ+ûΎî¹ô3z¼’”Ë=MvG"A™)¢‰Žƒ.ž,:%È£2½¿xÀq¢`wDW‹ˆÙh +ïWºãLm‡/ï ˆ–“‘%Aü_Ä*šˆfÖC²OT‡÷*e;"l„'ڜðß"Æ ̇y‡8 3ÛªUs¨ÜmPɋRœ¾áH•~†+üK€ãؼ‚7)옫±*Ú·qlV> ½< ’]_Å$UµÉà©Ôà’¨eÖ2®]1e~ûŠˆÔ­Kª + »“P`®¸ÄªÌ”Z !¦ð"ß ÷"n„¾œôr?àI!~V©ëÎνjó4avӇ¸¬R’'dˆ»ŠR`§¥ÎÜ}$0¡mèܽå`+uÅÿ»‰õò½‹7^fÞk¨åßÌ&á[ÂæHÛsí*ñyI¼¶Œ¼hŽ„˜?™$oFMDõÁdà¿Y¯Å;„¤¥Ô*q2ÙðhŪØÿµT†˜.i€×ËÉqë/fåÔ¶Β wJÓe*áp¡£(Ñ)Ô@›fº™´ìà‚±ñË!|ngÎñ#–mO3ä£6_™^M¯¹"ù@Yjˆ0Q%ÆPNN™m× ¥mÅC¥Rt¥lpÇ!º;ïvÉF 14{À'®SŒÁŠíæAQ½0ÂuRC×.Ë»RFíjº4t´XÜ9ó¬Î“@ofq‹M¡H°çD J£ü ›Ø#~èÍò%œ«¢žâ5#J¯ [ð9݆¤$E» ç J•¼ 3ä•K"´¹b ¯¸ÕžNdäq,!¼t{ 9è¹\#§h÷g%žö2È$žðDio>Û(È|֗N¦å&í¼'è Šà€‚R’Ó\ïüí.¹”Ù=lH)¯ÄÔ9F¿H8²Û}ìN™6àxg£¿Ëýû3s¿Û¸þӑ\ø¸ƒFíëãm_œjq%fÉˑìù×ñ>Êø®Æ5è¯e!«ñUCè³Ã ѽCô ?Êå.…,žšñ oj, ¹œE +–ÝØ,×Qc¦2å¢êòŸÁCíÅ?–­œÒA­ÈœþÓxšÛÓjRlwÚ KNãþÊJ–Ýí”fTþIó.$yn’4ÜpN(iu£öAXñHó3¦ˆo´Ž(3ÑÒén/š±ßU4‰|†cÊDkOéD´ûå +]õCÛÒ4ø mãºï™±Ð*¦GRJ1‹¶å]s†þ#¿Ñãx?ësðû,‹®$Ÿ™³5H +÷Ì3³’“kµ»ž¡5Ïz«$- fÆP¼2K?8êǜÎ;LëºÐ?ÏÙâ8ûEOçæ8#?J‡pfçôo¶æ+üìfuÁI +Y-»F4+K=üà¡îiƟÙE[ lxšY7û’¾Ì8²]=™q÷æÇ,M¹ ;©˜Ù7 3«'$\)ML̤lwó/«HcF{Yˆpƃ–ª»Œu+á¹Îem‡Mrˎ›èÖãzÙ¦€PŸÊ´ô槌†»=J¹”¹®ˆ¯²yÓhwBÙÓûàJ²ºáФNÖ!íÎL–Þê%KÿÐæFø€òI&&±€Í‘l¯I8`ñȏÔÈ°Œp‘Á&{Ym)ÿcÔÀ¾½E”£{¬Z ·yLnøXïØFá2QÇ®wd¦¾"ökj¬!ŽY|•olOÜÀ¶±<»æc&tÙô'¥±ԃF~ÆÊ|«pó[ à0V,VŠ­MkŗñÆPe-OP#F±Ê‡: +qL;gnbG¥2~‰ý ˜Ä²w’Ç~Ä~–_ÄðæüAÑĪUŠ©ê‡…9§ëa߈LìýQl6Øi!ÇìЩkScàPxŽ"nÐ|ç‘.Ëq-Ê4‹Å ‹³²Qn!…³_]ûLÙàL':X~ÈÁl²WBWo°?°áÀ3Xuð€Bv@èÁ§Ôrف ìt|ñ˜pé‚ÇûޞÀÑ10— ZÀ¨†Ðáo…Æ^`™¤Eü_Å_öY¨ÇÉü¿Šá“~tÏÂjøRªб!µ°R—„Þ+Ôc}©—•:$|âÖ"ã÷ás¼Xˆ?˜D±Uc@=ǘôr„Sòq³®©ÏcӐrâÝë‰UªÛ ‡6§Š™ÿ’™~PAöZÞyÔZ0y"÷õ½¦•¦ëd´ì*c Äñ• óՓ×*¸>^éÊM*^ǯŠ>1¼Þb6ÿ›ÐƐéàµ'_èYùßõ·~Þ½‹r»»’]Ô¿Í](§2{»P̶¨Õ©]‰%ÐÖÉ{7¶Q6Î-./¼@¿ŠÜ»YÑ.Óýnt +f%ë(ýýߝ¿‹«DÔ }M3M+ˆJTåƒÎ¦0v-©ÔàtvÂ^^N:²éXäu è‘L"ª²K‡§Á•’ƒrᕠpU˜œ-.?‹·š¸©N'£”u§ùþ° ÜÕ4Ý}Ñ‚s}›c_Ê\²>ÄÅ\ˈ¾ÝÂs÷8jlcg‹wD^ u®LÄú;ZJ‘håûf{‰Õ…a‘ÄRœQÙõeùØÝvrœHA¯›Phƒš¸WV¬ cCqÈP$#{si;°á„ý¾‰9 Ó)¨ +J{+0_•Ç},k…à {y*hM¬ ¨á­<Ý׍=S>á''—è_C¿û´Õ¹hLëÃSS"‚’ïj¤B&Í=d–­aŠñWg5ë +ò©<ìÚm CT` +ŸäR×î î©ÃîÈU¤+•DÄ)# g(=öíh† Ü`A¦þʑ¹M&3lƒUXMÅ1rzØ5†_.’,5ŽêÊ/@*G?qñÞ\®SØ»‚ö,ß&„ÿ.šu#&M§7Äè³óÖÖ8Æý«{ªw²³Ü1®jää„Òù WÓ(Oï§S+2ò²õoäŠ%…óÌ.ôi¹4 bǼʺã§êuÉ : K“–I$9°¼ü¥6¿ÚxeƒÿKUɪƒGûà3öJ i£ÓY¨N–lT„>ÿ-y£~¡aÁЮÚ% žùqÐó˜Ñt\ìE·±jàÑòÀ’í®BS´ @îÑ: +÷ò +XzV-ž¦wS•‘ÆU¾Fõì,Ðv¸>ݸéÝý±ˆÎ Ÿ‰ìjAÍ s}j³ƒÏ]i5ƒ¤ÙåxE´áêKˆœ=ŽõxÔ°ge€ÐTå´pߢŽo-\ wâ…}ª¤83‘nŠZªS#weŒ»©*¯Y”àœôô~O®åy]¬bÎyâŽ`10< ÔÛcÜ¡±pÔÃü–#ÆÙ~óI¯é"PfR$'XÁb¢dâz,lÉÐڃ§QÊ.˜.R!ºi-ÙMm>8ó}³~Ž}]GZ$E=‡ÈîáÚµòJåû³1¿ÅЭ.XÄLRv![µ_/=;%"[´êjUDT¢º*ÊýkMBj²Óâ·gÊwÐÕlÛïabùf)¿J-ŠZöT¥wTž%L¹å@.:>o,¾$Bk›‡~ûº)Õô¿ÌJÕ¾å;%2¦ÏXV…Vh P-‹‡ã©—5$¿)è:­¢`éôÂWÁ^ð1&Ëñ¬-&Çú«6îGHÅk&u 6‡kþ¢îp&UŠ6¸3h‘ÆÁmÖ+’ ²<"öŠ;R„Gq0®NÞÂ.~áN'¿0ËÀGl~C€P°â\„Ó‹ÕÊ°"ðn|èÁ˜×6γÛƹ°à€Ù7Ü9ÁUNÊë‹j%ÿG%ÐFí|xâ¡Q6LÎ8;Í(Nèì²x"ü4K„x©w61VâÑI©Cr˜hdq©ƒ×_8³ò{t5äEBJB҈ß5ށaO§L8‰QöšeyÉ¿qìóÃFØÖòg²=RNIç1œžd ¡<«%ß¿ÃÛÞÈïV*_Ljž•¢-Šk´7¤'VœÃ”ïraEÅél¨i@'O¢ü<]ÏÉqaiWŐÉq.)O+ l·pÒ[yrYÈǂ’CXl¶ðÓ6Í@‹#ÔÏÿŐSR‘.À<#&È3ݹñÔuåžW< Š™–)½ytŒ8 E2m´Hþtteò‚4È/5*øGI4+z]ç^0bA˜€<W åÿÃüÛEµzwC €dd¾MŽAŽ8{€Akôõô¥EHµ׆š’i«­Më-4·¶B0û]Ø{åLH²óþ¡½OjD'ëëXOBq9OÙH#ói›>"IûBx³pNmIQÑNb´íJa/Dá9t5áÂ"Ào€wqÖ l·»~æ±(‚ƹ“4SIS¨(e+ °òɎOÅPò)9¡2»Í_T +³{׿A­a½4SQ`3¨Ã?§ ´ÀêÛÕBMôN®¡™ڍN\ Jٜ{†M€Y»“:»t¨¼ú‚â9N½ÔÕ&†2©—Þî&ížrólã"Tä¯\×µ‰‘Š +ú1K͗*]‘bg ¹͙êJþA±hpRp9H>C{_BáÖjœ“HÒÐєZM=âóˆw b¯õŒãѸ~ð­ËŒTþ"z¨×Ӎ®6·½ÓÅB8­þÁaá‚)ä TÜOH®ègî_$ÍÐn–:* GN·ÁB>®3OÕÛ_®qY¦9ÚJ>.ngAOÀ‚_D™Åċì`ƒå3ʹ”®–ç¾e{¶‡:£s_T&ÉUħÙ4ý'ji™¢¶)¿ÙÑÔI7· ¹±C%5©nô€‘ КßºŠhFAq›ÂÌ©A1W1Ò ”žh¼5ÊÝ鄨 kÉk¨¦‘̇84†À‚F¨Vf’º”¼Pýf´jɪŒÚ?ò)cîڞ&àÁ ››¤ŽM:#\çÏQ—_õøҺܗ9¼ éãk;³z¢æ_!ñKÊot3ç|_Šð>µ&€˜í-Õó 9Ðañȵ0[†äD&$ˆ4úÒ8^»Ë5’ÁF—º‚Ú3–i¹WΒBÔ·À:u%óP¤Ð’@qÿÂÛ;›ÍÙ5ßÜpñ¢õe (Döýþ· †,¢…Aœ¸\"Çæ8cÁݳW¢»%õ_ììÖ%”$~í\“Gv†& +¶„¸ùA8¿çw½^]EçgPC¼È £d&7.tWô¹²«0u|\äÏZûJ…ÕgL9šc‰ËG#sçG¡U—Ç +s'µä'4Í_Z­Ý ûBÔî݄^4LƆŠIa<ìÂƃ•µÃåýã‘Âߞ®„2Ty¶Î_'¡a¶l#á>%ÉFëõK y‘R¸»c™*!vóþm7Ìñ{u-{Pv‡^Ld‚)~ãî`¿Ä×ÁÜS„^° +Uqk°ŠŒ±§­[ã= Ö<݋âΠ#"ƒeðZvÇ ºà×kd->:ŸòÒý¿} œ‰;=ÑÓ©ºàö®Þ‚kúA¨Õ GŸ  xÜ êGۗ`ÎFݛÍwA>åäG0N£B­ºÆöaxEúý‡IûbýèüïÀ'¿ªø÷èρžÏuÐý˜o±à2Z6¹Q/뫵&)!Òh% áJ#ð7D †–¥èïéÖÀ*hù€Õ¹Ÿ$?…¦Í¸ZD1 —DÐn@{Ü=H­l̜ïzjîpr.Ã)T¨U§BIô“G¸9y’±ªÏ-Há°ù‘jëä"MvZ^O~™wQ¯mB–_«ÁhB-YÅïŠvÏi§Bm—Á/IÞEu ­ð÷5#;K¯{ýHH^U„ Ârü°s»û ‰ß’HšÇÜ·›#œ%îöÙWŒ&¿öõ&rö¥õ[ R±¯4ǑçSWú¢¬s‹£¯–<[â˜ÐÐw);ëmêóåÓj ;ŸÝM oÁåæ““pæm»|.…üçOXYù +Á¬tòÍ'ù®”tb+I ŽŽÖ˜²´a 3fi ֌ݱ ñŒgÆF|Ê>qÃ̈é#%D¿®ë«¯n¨ÝP2•¨È—Ê´m²ÑEn 2üà%%£àFôa•Ît¶P@vÁ¹áwGpxa¼AەɳÏð¹è¢ÑtÑh4¡ ]<º¡s(‡v-•vÙRÛNû©+m9vu=TeSÖª²*++••Õª¬sYYµ Ë,k(3«™™Ù03Qff%Ìfâ2+³²€™™v3»™ÙÍnæÀ†f –f“6Ûmr›Íl6Ûl6´Ùìsk ÛM|Ü|ßn·û7ù7ÃÛosvÖp·[ÞnuÐYƒo ÏÎL˜ÔR¡áÑ>аhh5`¥Ý,7jVŽÀìQÁŒ '€ÞÌ̳ÖÐìffnZZÀ,Í EÔ&›­¡l&[ÙÌ>§í³í@Ú睦þÿӞ¿ã·"±ÿÿƒÿóüàߞљљõx÷»;<;»3;Ë3B£Õh…†ÑаÐìh‡h‰&ð1)ÍF‰çØK«˜qï2w<îŒS` äu™(‡#·§EËk0ÍéEY¯mû¾ÅܖJDT%F`D†§Sàt%GEIS ¸ªÊUEUÂUe5^Kî²ðªD]åÕ˜ 2ÃÀghx6ëñåžf˲(Ú>Ÿ‡Æ€åz¹<_/ôsíy•ºgûå•È£€¸ ˆÀE@Ü剑\Þ J‘WyƒQ<ˆŠ¦?hž¨Ý]spðÁx@ŒFÑâ>6 +l&¸b.H&ûŠÇ >q¼¶™åž…¸#ï,¥üiŸLHOï‘à „Žh£ü|ÇyN(.¤:v…ÒÁ—8("ib“×"6Òy,*fr…’`™ºÅ.#=~ëžP”[mY‚¦°‘<ÖûªpˆÇx"OïX£h|•¹S÷Ž)«ÄßHÙp¥”RõØBHoÄNéã!ðñø>=v ¬€1Y3Ú2,(|€Áæ뉈Rä +äˎ×S "ŠÚŠh U|ÙÅÀ%{r~„ñŒ œD§/lcýFíbçIˆp ÌÕ nzÙÔ}“øõ fòÙDÜZUšEîébãË܁üZ1;ÝÏû >2;N½=µø < b¨ˆÚ¢s]èËА–0d§aê­øÈY]Yœ©ŠJíÛÐF‰{þÉ85ù%lܖ¬V,©ªÙùW<”oÂKkIõ.V°BÀ~Ž¶¾(íÔŽc d=>kÇ%|‘¡ +8Á^¹Ûœ¥Î…?ÑJ=í)Næc#°ÊÕ¨$vk3Î"*Bûågaä²ßdŸ~¦Kì ZJQ$6Dˆ5NZ¢ñ…ª7ñu¸×0¹]âæ¸Bø³6.€(HÉõTXÊ{fj VXãÛnv¸ÀÚÀâ36/£Fb +#)8"¨þ‘C©­õĽßqÇ°9ô0ÈÓ/9€UïXÀÀ˜&Ã^†(ÞôM=ƒŠ¸eÃ^Á$Ï!BèI²²å±0‹¹Óˆ§ðüBqُÈ—È„œ;´T7Ír«—…Ûp_™ÍÊVÑB-ÊZnj£»¨Þt(*šno³”Ÿƒ)³Â\ÍzYÉ!™hžH ƒ3Iÿ ŠÞ`ŒÇ„È:KªÒâ]žûæ²Ôö·QœC¼øV&šmÕiËÁÒª²8†eÁD¿É¢Šµ@kœéânrɇ£ú5¹Du»ùÌN·~„¯]úe€óDPMvØù¦·r3 J¶|ë.\hf±WcD1«d~±nÀcI5Snn²t²v‚ß<"*’›°?¤DH“¤sÞªÔ+˜ºÇcä¿ø…°”ÇÖì§ù¢®[Íç’u Áˆ füŸ]¿„[à#”˜åÏÏ \J‚L‘Z P|Ò¾ŒFKÈΤ¦‘^°'¤‘0ŽÝ?ySí‹bù¹?Ùz‘·—Uf„qՅãÆþd›Gë¢B—Ƨ;lýÝ A\•nˆQpWM|ãiBûF™Îÿ3² +¶_Ú*aûŠŒ‘ځ7$T0³õD&QH2AH±KLmtm¢âœÑÇ!'•fw¦Ùº­a<‹äB#¿Á`ÆklÕ|/ù üEö5`baæÓFxðOÖóÉ@-pã×$‡ÑÇe)Qb ++À«˜£GÏ»SX"  ß ²n䪌$k¿ï,{â…2ý ÛR»|‰‘§+w½¤¦üµù 5ü.šÄì´ü O[e¡øw¯ÍŽ(Z}”ú©p®6\ññ­a kg½4£}-‹ÕW °°ÊC{H•Ö¥–Î7Ü~?õ +ô:a~¯Ä‚,Éö˜Ü‡é:R’ÚÎU7˜ƒö #ÇÈË«€F²9„ƒœø›@ÀƖׂïûjŽôæQyŒÅ°ˆ¸«¾<›€·N½Îˆl¨ßHm‚¡i4+¾…´øÿ•âÒ !6îb붜%•x)j?Ì萜×z-`àƒÓª™ úsÜî¿W5[®ú|šäµ¶ƒüONQÛ¥|éi/Jeh+™è- Z=lÇ Ö Øú4kM "n É„…ú|çM¦³ã0DÍØ)u6sçßQ2v.W½ºßX…ÃT„²#4Ç|·›Ö+t`]ÆA¼Ú`bùŒ5a"=ĕ¨^g“£¤@ñ™0Jó7.RíKõÒ´3&¹ ®êUž/ YSøޛë4ÑinæQ^õê‘>¸ù=ExméS{Ró÷´§¥Îõìø{ºÄ† To€f†òAztR‰òY+ŠÃW¯½ŽdI«€oJ÷}Cµ•iˆ¶ò÷Ö+‰(‹$BŸÀ A§ +1œ’àÔ;Ÿb{Ñ85’Aø4#z¦wÇC@øtÍ`lÞkçþ7ÍôG© 3a¶© ،A}¹:¹Á‡I‚¥gÍEt ‹†6ÑE(ºi˜Ff +‹[òéBR%ùnÉæÔÂ<ŽÇœ¾Ôúz‰#w–ë:{*¥,}ãa6|F†Zaw(; «ÿÞðT¡ØKF%b~¸‘û—Š®“@»-TU&­ªðöH𱤝f/€óµ;3«ìŽüPiØ¿R=ÛÈ}2ÏRˆ4™‰MB|ábBG»šÙô02¡2|Lõ®Œ³ºóÀÑ¡Š“±p¾õ•BàEqÛÞ +W• b¤&6Hm”ŒÀÔù™“Œ´}MÃÖ É0ƒUŠ¥JÖå™?A2Òý´N†t×ZQ#Ãs›€*GÞQ#£&ØÝä’/‹ uøD‰}ä£÷àÒ%2ûýûå0ä$Dæ0‡’h²™Èj`ÈhZA ´EæÆ0–vñDBƒ*ᏩiŒé–¢ åssÁ6ü˜ˆ¹±“Ù8¬_{3Èn v>&\Dg¼%Å®ÈSY†pCŒÈI›Ü0éžßËz„Š‹’çB·B8q \ƒ!™önQƒ‚n u1N!Ö$-Þº™p ಞúþtŒ7Ò»bŽE‹Î.£å v’ؾ<1ÜÄ B“ìÇy'†K-kOæ/§kb¤_©7Ò5>teK i©ª‚”¥ò­ +¦\î RŽŒb+%‘$- Š ªÀFT LCÌ:²üKöö§Hâ‚óÄ·¢„Þbù0û‹·. óK©‡éó®†ÂÃü51ŽBsµKÅgÌ/}™B撌NU)ì8 È0p:SnxQ¼Áj‹a’6ÕL›è-Z²)½0qáp§ik§ZDžiºT••ØXä$,ŒÍìÞ +£#ûNº3aa§)múG 3rp–í?+0çlLvoEȳ ¸ÄL]Â![Àf@Z" a‰œóCÌ*„ñimdGJ +F¨µGråƒa€ÂæË3¿&L°1n±:ùkˆ²#tªÈ}:3´Ù¿µÊ.˜$º÷ªÑ¤þ’‹!SEvm¦TÌEÃósTJWòg$pxþB/N‘u¹œü:;±Ž¡TÀb2ç›ȀÉNÖ2˜Ç™l‚oÈ1¾0!Ö²uvò€ Ì©_\*뚸&8á_¦MDŽ¶¿H¾B|ÞdUäÉ_DdtkVü½ +)o˜;VY<¢1Ž\ó‹®$&¿TV©c‹äLñ  I ~ *CÞ*²*± T˜@ªk”^®ØúB]X” ,é ɟ«Õœ4 /Ȍõ´á óWérŒô\B1aË÷Â^=˜ŒSê'“Î{W>²ÒÁKºI™âá^¨P·Ú^C«i¸µè½0$ˆÖö¢…<¶SJDDϗ47 "h†^€ÎHV«½äya©L‰ hI.Ä^ÎK͸ Ešë†á>ËDa ‹ †w¹Z¤}&Òõ¢ú~ÑÌ- ÌfÚ;^ú}„Ãf³ŸõÍ/ S>#^x»:ð–xqjHaeU”±Ëáz¼?"£lAð d¯­j²S8æwù0Ñ–p͋•ïB7xz–FéI¥‘¬Užuµ =¹@“å˜)Ú凅ô †ÙE½Êå, xd—CÁ€gÛ¶ìt™·2.WÊ2h3NuiL%Õç‘!ôì3« Óߧõ/ó‘yá!£¹ É3Žï°P”(ïFŒ<\º/¤‰tQqllñی.‘Êr–è’\©œXø†N¡SJ:O 0‚E’¹Ôù"í$Àî!/ÌåOR!ìIärAëúd2¹Ðž…ñS.?¨öÓW’\²ÿ#xꭍMlƒžŸ9S‚\:Ý÷yM4e®¬pÉäÏÃ(R‘Ö¾ãfUNEãR6ÆHøøHž5yñ‹‹½[ ¬(êz†¡°¬­'ãõ(øž]HHÝ/kôK 2ÕÖ>+æQJ—=ÝHzf„á^×BRl#%zhߒ#Â!BkqÙ© ®zé)UÑÞbφ߅ 1CyKlzˆé?tÚíni£iš3û_ n¹‰M£3¹-{˜{i[Ârà‘R[x4O\Ú›&ÜÑ"". ƒ-£%lÝÓ­…ý§„9[ÚÿìË¬â  +Bf˘*b`Z}-tÁ·$Ÿ–Ý O=m"½¯¦Ï²Ù½þI›U¥W?YœL¡ÅµP)^'€èî½Ñ֒£ôŽGòg—QYJ§Ã$±Z” øÞÇKKª–b p}MŠ~Aßèag¸¦ýTy‰‚¦¡fòÔý0>„8A|@E¸».×nšQS1§%@¥lÄìKÓ"ẠeWq–Nc_G)Í÷¦d&fR óñc¡Eç½¼­­pãJÐ"PâºKÙ"¾Ž%ø"~–NB}‚¬gaÇ.Ö𤛁J<Ë1ãdMë«ã”kr Ò¥€¼ÛZÃÃY´’^ãfQ†ßbøg§V |4œHDÂf‘6MIeÐ *LÍž{4KÔèƒ8ÂÆj@2‹u5„ÐayAÒ$’—MkŸ±kõNk/° ,e-i³ ™ÆÄw…íÉ&Õb)6<Í`Qž%æ +È<'ÞÏ\ìL½T‘4WЇCرpSÈl²žä1(à™ ¼ <7}¸Å +ÔӕL/@!ƹÅÝA:Ž‰Þæ”ز(ôÅQû0R\ æoò=‡Ì©9r±àÅ÷‹×~ùúVe ¼¼}paґ…b endstream endobj 128 0 obj <>stream +!ú‰]&…}äÄ$±ÈG¦"¦";&Q Äç}þŒó!5ãaéP&˜"êâX±ºdÀlf%ͅ°h¿Å)³6Yx’;XŒÇæ_½òv^A½^ùª­—x­`ÙiàÛkaÎfµ*Š"X„Êp i|Å#ÉÈ*ó–Äû±rÈõÕ, IxÁæ\56Àþ•*¡Nz¢.…Ïÿ +0Hi£©Eõ+ìÆƯ B½ ´Ê˜<ØW˜‹ÃÓWp8&­ÃWXѼ´ºñ¤q…äÌnÏvX‘ ºrµ+ Óq ;‡ƒ•%ÄâÌ 7zʺ֕ʩŠŒ4¢¦®Ð£Q4²W}šleó¡Ø,ø'UÛG<›-ì”.\ñ@¥¹HšÇ:à +Ž,N\k2™÷]Ý,VKiò ‡Y†Bî¾MOö8m…ù`îB‘=k_‚S*äìˆÀèՆ1¿ë$Éc¥úðö­¢iŒ3¦BÄÔ8×J _Avû©j(›@.VÆdpîY™ì@]‡³ÂP³˜‚WPª¿A³¢ä%áW¾Å¬EߥŠ6fªµ‘JPJÄ +YÙOüm|0óêY¦–µþ+äàԎ;<†±b9>(ñIúðŒ”'dqM5Mñ .ŸLw<©i“ùÚË +VCet +_ˆ|üBƀT±;&M…©@»ðduÂß¡â?T1ñ-ª.Úç­L9"H5Ñá{+DK¹Ì¼À•ÅcýÏìo,íûHï‡E(€‘ âE•F%#‰^š‡‰žŒù¥¦(ÀC¶û„ÁäOE½æ>Äÿ™&·@%Ÿè)P P‘]O· #uóë$.è0©Ó èÔ|¿ßPð¥Ì×˜ÌÍ܉¤§àÈ+yŠ‹s…§à'§Ru§`Đç) ù™ÝW§|óö…ŠÖӃF§è2™9eáñ¹ +?W É>¡f£²¦l1…D™!i +¥¼±+'pz"B.ò‘±&6¥Çª€¦T µAår&‡¢Z¤@0T¾N:Þ~ÈÚ3SSHw51å+†ØG¤+7% t)IÝôB¬ž…,…ùÄËä +ô Â'u€¥,Ëð°jz]) +>eBXY)¬ÈÕW¥à€o¿5VTJ܃}i.ŒÏ ¥À8%‰Ç]Šý¬¶œ%UkR6Ÿ›\,)êíòFða§~32^‹{Ðe6ý­;wl$¤Ì|meA +2‘íŸ`«aÉü(šç”ŠÇìõ(D:Ôê¯ôÄEV‚~Uýþ"Â] ˆT‰mŠâ°”ß*öÅ9j²˜"½™Eˆ”4b+žvX”AabZQˆ'ûó©˜Ð£^¶ÃÏ…q¡^z¸ß¬RLVsÈÑ Üü) …­CÄ©H¿f'4¢$x6qØÕJeŽ<Pô{܆'Í¢dh6ü-Yºôv­ÚƒÂ¤‚ +Ûôž+#_ºP5u!H‰òÒ[}w¡ÀÓ(.ù¯C'",–øɬ¨QR/¶6“Ñ(/*qžG$ +Xx†¿i;ÂGM(™°)ꯘ$óèy|<䙨@(•cΖª@’å _Ÿ¾”â, ’—Ä0Œƒ{I° ±rAb°.ÅÙؙ XɓZ BâšO¥…;uŸm ®çj™÷næ%¹7_Å?A¢£Ê–#ÒBhÌí ™Àëî$4ñ<4ÁÀ#è{ÓûKtÿ>ÄlÒà“¨FlúZ˜[“<'DüæWd„1ͼ;²‚e¶×ðƒ5ÑLˆL'+ô gšÞµûË÷AÔ +RËô왴¢šÝ,,òI(_ O½ƒqðɂϨmD6׎,Xè¦pΓ¨!mœˆ!¼‡'ê5æ é¬øÏ[Ö ´/qR«Vh3kt’Xà3–ÐÊgB0ó‹æ~˜„1l>w®ýê;±3¼DÛóϽöþɱ¾^,¦‡–µÊ,Ì WÃÑÝ$^:Ô§<†v"cŸ‹6j΋D–kȒ#<”„¿7’Ên@Ùø¥w¾¼ˆæC ƒ2x¦DE0ꤊ¡U²@LM'üƒ +’tR}ÖH‰ªž—E$Z>StÑÙx “Ø×ønXNpqÏÉÈÚòåœ ´›dájNB̕‹!čý}$7|‚‹|·.žCœ]wµ nh¨ù:¼–I8¡RÚ/ÃÉ]D&œÀ 4žœ„”)G­ÌöÎ$7¿ çd•!™Þ„ÑâM†y´¸PRÝDyF7†Y¹z¹IÅÊj ›{þ~½^™`Žüs÷šÄáGßDˆeI·z&y§ñî\ª‰¬2S¥&YŽ'%Â^Û®¤ÍÊô)&é¦ßÊ4ÑûÓÐB]ÈÌeâ!MÈ°£Š³¾,‹ªÑ$¤|M4ôã$º ˆ¼›J| +_ÁTÆTPù*ŒaHâ0¡ó8t™ëZÚ"ò*5ž0Ø(ç'Lˆ^[H˜Âj3™205ɤF˜zz1°ÎŽ ic7>=¾‡ìõr”IGˆæ‘÷wQKˆ‰ +‹ùt˜¬Ó2ëŠ0‘â™ÂDgž .‡‚0 Ç¢ùbáL’4 ¬lÔérQºÔï2’%)&úÀªùii`ÈÍ/ÉJ9} )•5¸¬ó|‰\e2ÙKˆM!*}B¤—PÍîֈò®Ç8ð‚Hés—ÔS#2ÁߌâÈ.©=ò«º¨S%¢Tc£9B—¤Í¿æ’»N'3¦ƒ|\â#©¡elÉâ ÎÖZ™1\LJšjJ-©QɀÒ0‡-k‹lOU~ðO‹l½_=“ˆ`aþXbÛ!³ÄH®+,Y³ +X”òߝk˜ 6C”W26R…³¬ú¢Oy®®:iPÀ•P°šÂd¥ãQ·­‘Ì”4­dž pGˆ¬„]ìÁJw ֗ å*ßlPY%ñÍpxªJгIÉÀ.’­(D£JøÛcƒ¼¨<1•¤ÛLù@m£Ú >PDYY!ÈDL¼¤Œ¦‚ ª@ëǤip3U|•%S ݽ=Ù¹`ƒàaòfhLpe(b_ù°×^ï÷¡_ª(…qª±œZA{ÆàäqòšSxŒ#˜t$W Xÿñ}d.Ì%~Փz®*b$€qi3;KÆM~Ø\}z5áRø wsø…Eß*Î̌۹¹ÀVøìvAbD‘~•u¼8ŒðÕ¨”„"ª*À|¿Ñòà­ L$ÉzÙwý–)ˆ;1â\Þ¢*š‰$u®€1ót)DÒV6VÄ?G¢͗&ëê"èOÿ-Œæô$aEI§%®SŠ#RÍ7¥*:Yš,s<àF¸ .EeïÔ½2§…b¯Î²B¿ý"ˆM™öF øíÈÇßJs~„™Ö ٘ö,Æ$LT _Q [´)ùdGœt6÷k%1ÊívK ÔåŠâÅ8å¶^±<5§0Eváôä€Ô +_1‡ƒEzH®ZÄeaÁ>wag÷gßo;@¢OT¡óûÅ6lòêܘƒ;18[ý®‹ö„@㠙»Óxttø«§v==:º@\òW—©û…á„Q$6{DdGDsf òâÿ¦Û[üÁõhúÃXí³Ž¼—pÈ6ïõp»êŸ¥£1Ûhf¸~´yÞZ¬ÏaâÔÁ8lŒ ï;™YDÒµ2¤Ë¸Ý_ò¼$4¾0ãPö’ûÅû ì]°;%ÚÄAçÈë^\q¹€¢K’¸“õªíЩ…Ï%BÚâí~¢›˜Ù@xKm¡46Ð%`4?Š^À3#¸ -è¹.$yrÚв…h¿ô˜„€áåOãN|¡Å”&.ä1…‰²q{º/ãh»…vÕÚÐ0h¡w6ûd¡,¥ƒ„“Ö؇Vóxº>æF¼óx8%!"Yj0"®pÆéÐ"•Ý ðÔrhQvÙèñÁ Ø;€Þ„qËۃk—2ZÂæ ŽæG$eȜ®ùŠð¾ï–¼†$'´¨+nˆí".3™ƒ˜.ž¶ :²D<ͤ¿ˆü݂“?(RàéA¬üž¹×3rî¨ìNѝ§+þJœ¿Uñay©l4l ”Ëø€ 3$ÎZ«egn攀#†ÿšRŸŠª|Ê¢¥‘ê +SI&j¾!|¡¸lUQÐuAšå²X©¥mQ¥ñÉ`­²ø®]ZyáKo1TÀ~EAU"*å(óAô•WÖìÊX!\|,‹ò¿.ÄÁ¯ñIèÌж˜y*&Õ™nÆïQW`¹˜L€Ñ÷Žˆö¦¾¬Äˆ ȓ„ÂHLÿ†A8ĝ¾Ð­ã1ã eÝPe-±=6ˆÓôè¹(5•àsQ:‘•Æڍ Æc“Ór%Ă oÙ¦‹ú²Þ£)joçŽu¡ÉtŠ^ ;ÁgÄcD:¯QO( agJ_³7ßFsªÈFÎ8©&v̈£P¼Þ·a*4fÈÞZª±HT,€~Ã-CMâ(†t÷ ¨8½ZcPÂ7’ú¼xB⬥¤‡˜÷% §s°û‘…ÌýålŒÌï]ªa—åÊ%Î(p·Ð݁æ ©m•~¨bN¦¼k^’Y¿´¹yÒ»©ù\³”tzVƒ ؽ®:ñY£‘‰¯µ3J0ú¤Qj'3®qÆÖ/S#]Æ茭ÿ•O¦O¦ëäÀð‡‚Ð%dêMžŠñ£µ¶=Þ<çÍ͍Hê!ë½ ø»ÛfÃÍ<ˁ7—ZǼXã‹!¡cÖŠ§aŠ³§ËŽ1&ß8eú‰<¸tšµ˜Ÿø†ã‡íjéqþ€ÅòÀÉ\Ä_—¦ÄOÂ(ô幏Y¿ç´rݹ +‹ +S22°º1ê‚üŒ°æ=kÇd§(î~•ßÎ_Déz1žXxŠ¢'ŽòE´Be»àaX^¡S‹ºl5>º"Œ9LÝÁñ7Íu…ñ­Çl´L>e?0þóæÇc¹<3`OG®° nc´¬ˆ„=ôÜÀ|&ÌÌPýÙh›uŒ[`eó×úìÌSì"Œ¸Å>w3Hà žÞ¤JÝíÀ4nÈR’ w¸áMÓ¥ H6K?!#v½I-HijûfWœ„¦ÆåCzuB{2fŒèöâÖ¾LÝ`&[BÛÓü\EîØPóµðŸª©+Å´c¹Ã"–º‹3H½zj“E¿åãâe-F›.ÄZ·š‹Ìé}/‡õsWðøîdi†% Y—tډ~,]âöÝñ˜@±XB͓âQGøÅ| +¶nÕ«È$OÀ±Z,?¶Dçº +ãõJ.˜;P~õX½l,˪®«aâÓûKž#8ÉaƒQ] YÕ*5úuê-rù‘cÄ.5@Ú–°cD—}Àp¨l„n´Bܯ±ÿ®›={{ˆ< ¨Š³ùw)<í1¾Ã:@F(£€‰:é.Ãìȁ2h_°YûW)<¡©GÔØã¼D•&XIkþ*§nMFغƒ IŠX¯i—[¦5C/Ħ+ãƒÈÏ=tKnuUý ¯™ Ko|¡R ½qÖ8 DGòÂèk®£ÉeÔIV(õÚH‚ÐR¿È7#ˆˆ3‚:›Æ0”oös‰ìßc6!ó ٌâ¤z×5âv¸­·”¦/Îø–ß1<㽎Յr„Ó1|E>l÷eà2G éº +ðYœä$ +ê´ú¶<#šÝ,JA)œQÒMüÑ÷ã½u"ú’6°=ª¼‚F°E?æTŠ4ùfÊø¬€>ψږ—Da‰eé¦àH6aÆycìð_§3B‘öBú9c÷BgÄ`¸Õô¿¯Z–CˆÐºþT `ßãßÈDä»x'á4ŸmµÃ‘m1¬²''eyG/­š‡çŜœ_®,Üö‹íÅÈpÑ%¨|QL0þqËFcº *)mF¨j3£ÅÅin¿é›ÑMâœY[,n;.w=~¢Tª}Ä܈áôãz€V„ƒ]‚ÌœéoàÈüR¬8jõè3ºuZ  +•çҍ) ðýz¸MÉÎÓ–BÆÄÄŠ¶Ëžª¶w‘^ÜDŽə¨„Ü žËd2è†Éí()ßAþ¼¿ô6ðýqS°LA‘HÈ°…¡ð·)Ô#Q-ìTú #q5[]÷$-ƒa¿ÍážâìNùÜéˆì%ØgÈÈô¨çQôl‡Ï#&€ºL¢-1ڗϚݟ?r¿ÌžaË°˜d¯N>·ˆ%—@ LÐëéY&)K5õ#]m~×܇Kã(&*ú¨±DãÃì÷% ”# +“ûІˆ¿~½0¯”w_´n5Ñ&ÿ[aÇÕ¿EÓM*0,Ž&,© +¸yD0n±H|­VÀÙÇÅDäÂSCšÀ:NuéÚ!Óp3t$~YÜÁOžÁ æè'Ó7Trû¡K®Er„1m[ìcfÿí;…ˆ•¯A”`"Ô–¼ÂG. Ð bpÒ»`k1;ç­UU þ(؁đGpm¿û,qoˆ©}3Mã7¢äÞY÷BÌO“ Ë£ŒúĖì=|\:ÈBžP¡"æŒW@Ty àˆ5Kç3&°Åà7£T`m {1c +˜ŒTZfQÒ|=ùÕF¥'cpi>hz¢MBW\di”Áýˆ/w~®êù/ŽÛ‡Ó¦L“-y¾àLþÕøô|àרéæ¸C؃Ði]Ù +U¬f1º–äbÞcbZ¿ÖC ¤NSÚÞp¨w‘yØ-Ühƒý‹îÕ¢Tk‡!³á#l\«/µ WâòÛM2&ޏ/þδfÅ ôŠà#$M”EîÙá3¹7^|hfùͯ /ˆ@ÊDð덤%9DB'ÂaGã7`?WäÝ’3PvD<Ö qz‘ç\ßêݓ\JB…í΢1BÈÇíHz}pBØ3×Ê·cÕëÔ¢MêcÚ#¿Ã\VÃÿÆDVž„‡hbžÎ£‚¥¾DèòˆYúěGn ECö(~eCH²›óXZ˄ýLKם lm+¾*¥;„q¨öF~ãší¿:(9Ë\iȔGkÑ«dON`L豒Êî""/Á'üõÆçB­¹ë¶Oö\bñFYeuc¢m¾¯ðš7dkã"(%(PB?l÷kLÌ·3’¡Dm‡Ÿ‡¾U” ǎŠØ¬g …W?¥ƒæf€ƒ“ôïsÛ (†~;s½â3˜™¸ºp5ˆV½x™¶Hy[ÊУ1û«‹$îŸF!uïÿDÞ{]O Ji‹_I\ß>ýú0&Úçîf“Äa6!èºøD®£r}˜&ËÙÁ4w$ž…Þ;øàf-#‹€‘môôÈüovH&ÊøÔKç¨¦ñ¶ÂaY2A16ÚØGÉyÌ}Vüš ‚̐ßø¡ã*8M^ãøژցäøí¼x£,1¬öšH7$·pÊñ5ÆLÂãW’qâ*¹‚|lÏ''‚bà¦çñŨڨ‡ÉD_‰»lÅŸFð2? “QY½sÏ}6|1‡j R+ï9/öpÙ×>8 ¨+ Tc^à 1ˆI7‘ÑÎ`1Ú“*ÜímÈ>ÝR#%ã%Ý}„J_$øDÝ@{•ùÑ~0>vêšÝ-Yù¥ºé±N¦÷XqFZ¥¨Fn 4Žqƒ$T†çʆàêi†SRüÀÖŸÑ|KA>°?…Q#Q7Pä”A¢×ü¨¯uWòY¶{¢|A½íY1¾õáÂ…X4pCEø,“丈 HõSqÖIOà\œ/¥0V¥Š/S Ó»n¯{ßć:ìP7S=g +_P‘ѵAÝIK‰µSIx¢üñiâ‹C2Ñ2R9¤r”øR2¤\# ‡EFkÄN‹ä4÷14œ~WÂw¡ýF@ixéhüàP`öKéêù¨¼R©‚â3mbÎ*ìâ£~©™B¢Âïã8­Ã†ªTUÖÈô ù8íLR P았GUº©)T±ùù¨m5 ÓßO#̏‡=t8Èא±ƒIšZ>šÒè&ú¦¼Vœµ‘xÒ}4H²sãó“4Á»­‰=¬ _Ââ"LLù‡ØWà"H,yRâÔ÷˜oÄ7o+¡#?aèë:%®ên‰%éäu1p k®ãÕ¼ÊJR ÔWˆÐ.öQGnôDd@O'µßþÿólEjw¡&5)5G÷‡ÃwPÎd7‹33Õ?@¹ZHqp©# ¸;Žò¦j#ÉX«@¯ ‡,ú´¢ŒÔA&ƒD‘µøиÅÓãVQWÓbÞÇGôˆ„˜ï«I$G–@Thä±ù[¤‡œC$6X!–˜JyåAÈL¯ z¥â;LÌ­KØù=¹4ÂÓßxì‘_'¤QFDñÆw‚)yôbx}÷a¨±é14L诚øÔl߶?m¸“”€ê’æmǼ,ðŽžîk¹Y;½öùòžcôå[Nxç›Â^´¥ü…t0Ã×bâʐ„›ÞP>ËÈߋ><{΄—b. »£qB> ê«mäK¸].íÞ5+ʗ3eZþîŽÞ=«ª¯ŽW±²A†ì²zg9Z+=Ç,¸3˜oãûunNrtXQa0º²òÇ¢_ ‘]•I·2ò:®±QVB´Q*M—<èÑV +ûzRìh¸…ÙvK®Ðswԅ£›d‘£1ðϘH}+ú€Ã8,9ØicŽSOÀ¶BPwL…Þ”}"X{ZTS8H<Ý.£)l OhBuP ~’¢gg°­¨ê† \hÄúýkõH1nEêæ`ÙB â¶(siw¯é‚ƒ££XcUد°JH<-g•¢Guú™í¤“ÜÜÅ`˜ã½O'ÊnbtFϳ Ga9À÷£¨Q( £°ñLτ…4n(|¹½¨¹Šš@Ȓ]Ð)òТ荋^ôÕvTn8ñ±FD‹”ÿ搙$ülÅ/’Ôn=£ùb•%–.÷mãÍð"_3\}SÎ?` ð“@¾K>„5üQî‚ƾUtºÆc.âõ•Tr‚m>ú¦ðîÅ_DèQ„  -¿õ¡l(gsÜ)Bô`Ɣx_½ ÂHåòu·«;‰xáÉ´•_‚)¨e¿Ñ!´$2â‘W<”ây× Õòò™ŒŒh<¡YH§ƒNÇÓÉßa“æ³ s'ý…iªŒæ‡6ÍoEáì eë؄£ÙÎÞ +·›[ëø<^ÃåþÀ IìE “Ý«Ea†ìì%:YÚށ;ç†T å%¡ñ„Æòr¯sp 12@§¾ +Ë#öÏs¡"ÙA܊$3Ÿˆkr>”˜ÄÎ%üÑ “·’µßì taÿ&uP‘‰è#½à2ÄÌTÑ4fØm°E¯ïÈa>¼„¿±á«8ýEµ0Ð҂9Òy#ëÅn½K4êÇJîsAïñÕ%Îpèqì@xkëÓÌì‡qVƒæ£ŸÂïÖñiª ÞV³ö°‚ÞHŠËË7ÒmqbhÇËcFÈQ×Õªæøð¬ÅÍyW¢¼ñbÔßB##LÞD6 F–<µš“ÄÌ¿ +‹žÇ—ñ ‹öâ W^­­‡øØ¢AÝ×S/¡7uøÁöB¥ÔË×ދBù´|)7!^1ž‡ÁÞPëÆЗêÐp{þšØðY'Píêl0Ґˆ…Ê¥nÿöoÏÒ¸2v4£!bäëÙƒ£cZÖAo™V1°LYJ)° ƒix ¼2oJvœó¾fU¨„?4£Ä'Lóõ1Ó%püí§’œ`öÚzä~Á£Æ0s¼·å‡»8}‡µ¿ùЄãñX‚tqJ’,è£ù_¶~§NÊðyÙ ·œ^°î+×jbýOÄÒÑ¥Fö¢¤¢|”uD&ž”ݧoÔ(4@NÛƘ=Å燠ÖdÉDŀ¢òO&XJaÀÙrÑQd&VeȸiÜF‚¨Z @³“­þíÅ$&CiO‰`Áhé%²XMªóɾéºv_àã3°íÄ1!4HCUp­Û &À¶‹†,é…&µ…ØqËÕÄuIs¨­Câ»l¡cpßF4eÎñ­‚àÉmpø‘axÒ|”ëtÀÐh!‘„½›`]Öì¼z8\ºXæëR6€ gzëfq#dW.ˆMf'@ô¢oŤ«Ö#¨är~þjÄ-ENĔÑåçI™I®¯`˜©£ò_r“Â3€¸òÔQS‡VæÃ3Ô8Ã÷ö,°IÂ2¬ —¥zbMž .a$ä±ïô˜ Ï ¥Ž¨CP1ö¢qƦå·ã2Àºvy ƒÅß×БsxÂdMJ).Ö^˜Ä¨+U„+Fƒõ›Í9ÚìÝ%¶žÇÅCÜȈ,+2Ò©—÷™ï󇋷ëú]E&ÑVê¤ð͹ü‚õ1…•w76!]K0ƒ»d—a>×°ñP…_+ÂÔËIùVۃ ì~9çƇ/'M7Cy֌-œD4ÿ0°¢1s=®¥þ‘R; {K ÍykˆŒX€O-1JfTÈoAb½BF$ÉaMŠ}ù¸t’Jdž;[®Áü4LÇ^] MH}ij ÝDÓúî(rþtO!@c²¦’cR¢%Ö_™Aƒõ¾PðüÖŽ¢5ýªHã[Ó6¼›f¿ׄµŒ¡ž®I&ºéoŒùmb!ªTDI@Áhªû´ÛMrú_ÓÏ´WHß8PÁkœ$C$Ñ%"}Uu·°é9†Ø[cÓ a-±¨ò>j)ˆºø²<§¼Hä«s/qiEód"?5²)ŠŽýцIûHXfW(T¬)›ø„u¸6Ø©{•Óó²éã‰:™Ê˜«n˜j]Ÿ¹¸î•„ œV² dù… ,dۘÏB›¾AhñªÂãØ=ؘ¸‹WŒß%Š¤S«Ðr„m ™×6È­¿â ¤+iq)%Ž˜rxö +¹tš˜¡ª¤m:‰×ȉ°gY¹Ÿ¿Å­˜¨2X-Ò±“•%J™Û€2G»Roþ­<¯%^ýۖ )ŽAœèÿwïu˜¨ôÏû+óÈÁ<‰ k›‚Ä'SÐ]w)êuW›=@J5ÊQq'·EjÙP ­ÐˍäA¤x~:´%]M.™2ݔ¸Ì­úQOàA¨§ã\v³!eu2xŸ´¦‰ë¨êm*ßÔ x|Àƒ]ÜfÃ(§¼Ý”´Œð8ã]E.þã•q¨(—½Û“ïÿK—H„_©(6„än ÔFÇ}á+c‘#gd߈2æùˆ¤-V„p´§ß╣*Jún0 á0Ò?F\`–üõôZ§<âjùéx"j†ÕÀÀ¡°ìCÔ¸+ŽFå·|uyDîؚ°G¿áj@v¦ç“ÔÔhŽ…-+¥EDܜ5cBW¡ë Ã2v.ƒËTG83ðãèZ ”.–Þfü)åViþUITòz¥ž×´ƒd¼D0° „“ÚBo5Qª}g?ŠjåÌ@ŠSô áËiÏ´æ©Þçßü%´Y$:ÐÓðt5ÑÒº,›{/|¥1Ìwnñ|è-<g¼,HÐ[®¾î¹5ÒB±¾)éyö8“ÛÕ¯$Îp†á„! åEÃÅIuW°‹ËÆö÷¼–$Ã/Ð$oÃ]=Llú_´#S O9F ÃXà¬sh³³ë­l 8 (±ûƒqã{)A,äbÖóË;œçéõ0<*š$ùŒ”F2éùg¸ú¥ãïÙò@_KÚõFþB¦„N9àãY¾ËÂ:\þÕh÷ýõd|³½œ·”ëÑMûtÊG_C]ÝmåJíL ßli>'  £™¼–Õ8Ÿ…ï¹â_æ븏êØÆüéŠñ^Òq óŠgù3`3[J$üwƒ¢{\ «|Ó֚Šuÿœò_—{eõ"ßÄ°ÍÞ|îN“¬'s¿ ù ÎU[i¯]=é ßüÊô?>¨&»¤…:hÎ+áïÇM4©ÿÆ~ìeÉMC45lj|zÁ0ˆGQ4Õ%Ê>©”¶8ª ñÍ;“Upۓ @¥´øw) h%e]'Ÿ\èÜ †×ò”«?薤 ‘Í­é‰úVóÉåiÙ_O„NLFäå8†9=þñ$n½1‚ÎðÁ'uß"¯F#µËÒc>Qä…oZ·Wø=*Ó8åãU'üÄ;•Ÿ{5ê´Î„8‘³ÿND„þ½s ‚ï}@|µà·*3s‚_Sû{àÛ².ðíÇ#æ€ß?‚9© “ã}ŽBÙ&÷Œÿ2Úòß7¡³þ¾2ç›ß8­Î"Ë&ZZ°¶÷ÊOrÀzO¹0P« ‘eËÑ:î±T„e«¬ç½©è_{™Öü9 „Båì¡xÕ ¦ŸëîuÒ`§†×ƒd103eŸh,ۊXÊwøk¦ú 3 ¯{P6”Šå:¥/ñ²ˆ†f$!äb År<÷«KŠÃ©w­êâã¾Dñâ>Ôé³ 1Üc*Á9A`pbŸ¿½VéíË)5»ý½f®Ü±UŒ`æÿGI&yj?+8í•}&;·ü¤xÝÙ«îê7û—!³OMᲯžÁ+{#Ìt]Wƒì›ùÇ>=±5ö}Bg[ ¤ž—XEïq0[Ù³«DÐ×ÃÃËM«ÕÏëíªð®/QDuE?ÑP.=ŸQ‰“=8S„¾õ·(&·õ†d'úŠÌzc­wdI5»ÎÂv'“ ÙeýÚWñʈ ]V8âܾêù¼7rqUo‡Cɧz¸!ªÞ[ciùo•¸CãsèaÄÖċäLêÏc¹`Áދþ#=yñÆ!… øq͋õa™èzz`W$i6”r„b>Æ»‡…îyH)x¥_dê5žô'=µU KzëDßîyz ¹yƒ?XH¥hvô z£ç!œÿð0Éõ¢?«èoš^?Ñ7· kƒ<•˜ïb;á=3¯üóœU’“UG•ÀòG€^©Ë!VMc÷½,w²<܍çB¨äʽ ¯!ð=?1ªJü@A´v`ôõi#|Çy '²ô5Îá<î*¨à›¿¶¡›/½gÁÍg>IX6¯ï;Ë$æõþ™ï‚³"BNåœW.ó5JFOæ[û¤Çi Å<îˆViŠ*˜¿ä àÁ˜¤úËãBUw/#´æ&ãqJ—3Ðyç|²êwé÷«<¨„îúÓãÊ=ÐhÞ½J=•Ç“¥ŸA~…õ@IþäýRœÞÉ÷-‘ýH¢ÇMX€2y­Ñ’^òÃ2¢AMf Ę;ÉÃæ#•|òFPÍQ2—‹ ÕZòúLŠa?ñÞ´ðÀЁ6 ;²dlÞwN•Èûo÷xˆ^~mZóxEñ¢÷¯ íÊó@ƒ–X˜9Þ"Fò©»sÒãø¥Ó‰}ãÕÈåm, ´!<8ÇéðPlj·û²#;À騫(¿›}•¤B¢í´Ýçèð Û¸³ì8jÙ>ä¨SšÅÃí³Ñì¿ö"j•„ˆ’šœÉt€ñû¶)çjÚÅړji'yÖm䮡…% i—z‚F2¥€Îñ@ÝÞΑC%Åêô~ ªš¾¬û‘;;.a:g¯=º§ ²髈§f·†K.”ªßºþIAˆ49L᚞/;:é¤eKƒöÊÎþ^HÙG“ +'»úÿ(P’ߣ^ÈxöŎRŽþö1Û¶‹Wìi”¸Ù‹µ—Ú‰½«ÂÓ#önQ!4Â!²Æiå3Áº`O:×=¦‡ççÀMö±Øê¥R¿ÞÇ-¨;ˆ£è|ýdOœà#xžüíŸçõ<ãu“_CIÅöpUûï®Ü‹§ä1ß:ŒŠ–w먯 Ø‡dT{©™Æ ÕpÎ]B ¬t€ƒlþ}ÖÕIoð³ÝÁÉOí%ÆþUÞ9‡û¢h©XډFBCu…Jì>ªc·öÛ ¤ +a"±q‹jB[xQÿՑÎ}¯n»b +vuç•8D“ +¼WJ°@›lÈ@]#ób©bыY—vÂíS¿+UBZ…Rÿý,H+Á(i.†êæԀÿ©/.¨:;ue<Ȕ’ 6õJæfêÆg€Wó¸’WlC¬ã“Ìn;=ÞÌà—jÕÍÈê”ҟj7þB}¹EiÔ%’Ò"ŸßÃf—È[®åïé!rÉÓ+tq³—m((|bì˓•ZzŒ/ +!JÃZ§£é9½#HݎÓI݉ÁÇ9Y¤@:Ã…ÕIŠ\“SMbD˜{ÚÅZe”鐏dÈ-3sª˜Æš‰}BÆLÐ~芇 7z¸ –ITMGHý/]™Ý-³U]úªáÁGGDLöDPŒdléZvâ3%ë?'€,Ýø1?õ“Ö ¼Ò½GèNÂDČËI«ô2Êâ%Á Òِ5ðIï”Æm“¾¶®ÍñIùÀJêúUÒÃ!8­ÇOlî;ˆËÌ9ÒW¨¥hš.!¯HG5l†ô¾ËʤO¤eaEÐÀ’Úâçv^Uañ¢³½EWÄéWôß0òx2ûÅs^`%:O¤èÚn¢?éû} ¬ÃзK³:ÆYäç†~¼â5C·â0þVMovIUŸ /²:î8ÃëÏ÷~ÑêLg´Ÿä t¨Ï'¾Mî|íÞûy›z’Ÿ3¯˜ý}Þ}¢Áú¼ÔdJ:Ÿn¨ŸsŸ˜£7Sç}Ï»A4kÏ[‹NDPN ­¿-q o8žÛp»s¢ ^ê6а³óö,îp7߃/å¬V6§ÉÏ[l®Ë ˜Ïµ¥­ýœ/MNdsßr&Æâ©å|Øh fåLv…ßTš“S»\œ¯É1¤ +5ª‹¬®öÆ$ԗl‡çz5ø®z6G›¯Ái[ézÍ»,r%ܐŒA"‰Öš_W˜*«¹0þÔüî³Ns÷˜Sšß[*Óh~ÞúµI\*4ïö ÍÏ|FKwæA6sÐ(²àPÉo¦ÿ2_‡Ù}ó5Lܬ̇Õìd>߄ûpµN͈ÌmP9¤l‹RjÐ¥ï¥sHþè<‘2” ±Š¸r¨-ýåKƶØ÷’"-ÒçHDá5Y\9 |Ø=Î@{¹ltÉætW췌Ã:¬>ÿ-·ÛJœßÂe& ÅöЃÔ7±îBYÞº» åösÂ%Ãrü 4µ:¾rüÓ9°Hd]Œ¼éÊR½•·›*+¯ÂVÀ«¼4¢[ÇÝùzD¹Y[ׁÖLòÏ@žfÙíH<8÷i‰ò<+㢔Ȉü‡j‚÷™P8eê8_ +B‘ˆÜÇí<«¨pFÀG…“K·‘¾â/8*®©ö´W'…<§z˜R—ƒË?ãyû-·øÜ3 0XIŽk'Y)„–º‹™n¤ +¸o G·-íÆö§¡Tc!x ]D¹Y&WÇ®™ªLç+ý‹>Dù¢Â¥ó¬“_ Ìÿ(7¤Ll[…›s¡e$¦½af9ªšb=§ºô× Q·¤Åq?„ºžºÐÁÃi%]…ùžšªAá”b6-c¶<·çùT(oO…-”U£eà1VKç$ £O^…]ØxÓ+V9_íš1‚s¤¤* ávkïҁjʉí$è¬*¦Á¡_x€[• qÒtk9ËÑ1Õ#V4QK#íܱҶÚ=f}dé¼V”qR–ã0'ÄJg +â‹*”KçÕÉ°ë’J•¬÷×X9È +ä¨"3Y1c(2Ve¥´u¸bŸ Í[V†‚«ªÏ8c7±ŸËû—'³Òål¡ˆðÚ4'°#|gGfª¤˜ƒ©Î‚J‚q:’E lÚü_b*9­$!€Ä1«à4«bsö¾à¬◇´@óþyé„ávVJÚ*ħЮ8Ú¨ƒ¿þ7ðŠ© +ƒð¨<ƒ #|½-µ¡Ø_†¯ž‹¿5pÐø™›5óö±OTc +‚ó E¹›hË«3¶<“`aTF&³gÅe Žè8ð‡µ¶àY=JÊ6ÂÒɪss 1ºQÈ7£y¾+›O÷£ajŠ0‚»c}Ó·úÎZé Üh58]DÔÃéIž\‘ qgå; µš1PÒ ÐxOëZ­\æK»<‰rL”Þy~4·´Ìp.Nà§%•@'®„‚,)|èà +…·\ÐFˆl_\.€ºÕöf¿m…Jwò5‚æ¢Ç²¼á …(Ý<ÐQÒ¥ ­(EdÆm3C(ˆ¡ƒøtvR“BÞD‚,ØÈìÞa.—À°‹§×lo¬Átì+JÝ~ÉÍuk«³.@HÉs°a5CG8Od*òrHPá›ùhê…òu¬dҔhV€48¤gʳD{YÿÍ0Œ~þÙà:ó˜íe ¯£…>²gOðKÚ~!üƒ©U„³7Î[Ò8çÊþÑ#ÖϽD-÷Eh:dШ≹[q<÷+â:µ÷E¦SûrŸPûf«N2ª¥$وË+¥j7$°ÙJõ€sæÈZ4°‚yu2">¢- íÆ_öíp“ï)˜ +2#£œw5ȱ€י¹‘Ù¹œ¾Ã}Z0kú¨Pöææ×ÈAyrÛ=ïðh@¿)arkŸžŒ*x£ zãÉHìÙ\2ÈîùÏçâ128©ÕÐÂÜ* ÃV^1æd”˜´êˆcŸCR®ҋ-á&#‘²C¥|MþZÉás½ì* âäG!ó¼â#yE$üÿÉÈ_Ճ]äWy|àÞëÿ£¢§,ҟ Ap%õ®Z:¸"9Fô.sX +¸ ÊÚѼh9_ϧ–VlX ó9†—ü„øêæLã PÍrÔ,·4ƒàƔþ…l ð p¯¥ïW‚EñFc_?†L)¥$¥r°ÙTU]3I +%  ŸÅˆ“‡ 3ØE„–"ßep0¢FÑ>¾QTMÌJ¾ ™/­Fj|ö`ݓ þڄU6¬4,ƒzuà!mƒCèà!dO½ªæà•øBJHN´OôÁ„SBÚK3š¹3¨JFNé,H iaÓºTOä ÄR£¡?l†ßTTå6…·©Ù)³X‘iJhjäõàWRUiC"EdÈÉåÖÊÄOˆª<ñ•ŒÕ™p®1)´ ¿uÌD‘|Ï$UŠ…L-¥¡Pù!#}8á­(ÔÁ{&ÕµA5Y\l¨OD]¸Í»S{2—í`&iíd—'\²I +úH˜¡’UÅHKC! =»è¥ràR„†Ê®ÜOý,‘2GZÒ*„¸/Ô\hŠ™ÂHõVÑÁˆ‰¢Caˆ¯­’bYîȃí"LÃ!ñ(võ]¨È;qÓ +uÁÖ&J +]Ï1‚ÌRgĘb)l2N♺.ÑùÕcîÞ½½ùaÅ"¨A Ö<ö©Ø‡f(¥ƒÎI⺄͐„éuH¼êҒª'¡E³(â™ùH¼Þe¦êª¬:ó½¸ ‰·p:˜*‘Q‡R…-֔BIy¬îVŒí «TVŠéK¡-•hjÔC2ҍWD¨9ØiÆ@\GÈØ>Žá7QU…ÔIªÄkÐt‰£Ï7Ô’øà¯Y…Ñø¤‘8Ë2RÍÔ#êøAEuᑻêÁm:´ucñCVYM-ª+•h‡(h”à„OM¦J‰‹¬æ ±|zÚ旚9ԁĜ6ÑI 1æÕXQê€X¯ÄN㾡j8™ñ´¤ÔA-•­¦Õ~ž(9 ù¬dc¢íQ=™™æDílJrÆbKj„ôq28 í|WR¿7|EÌ(8ÆXbDÊÉFDÒ¸æ`4%? ¤ð/ÇRaDd¶2ckP$J¥»˜­rL<¹^c،¾tãØ5¼ág¾FظŠ8ÉidJ!ýHÃíÅÍ]ƦàWªxŠ™ç— ÉÊîµ}‚ç s‡”h çÖT”ëÉ?œ&†5Ñ#´@2¯ Ù¢<ø¿é§“®¯(*{)Ä$$‰:”øì^O¢ò@Ç<Ô!™š$ÃÆh¦?¸ÐhJƒUÄæ&i5åí`L¬h°¸]jÊâ9F:¼­39”T†XS‘¢“/di‘R^e›:MÄ"|GÙ 7”ˆ /#TGWt̬¨SöRjý kpN“’š×eEŠ«ÈŸ:ƒ|Dgö‰§ƒQb[À èÀ>¢#h.:Ñ6j\сÌyVc*Ä[©ÍT¤êB–š¨àÐÁÈ'õÙ¨e^º£%—)»ñ`› ©V(C3’èT•;b:`…3WÐŒ¸Z_iõšd¦Õ´:(¾öÎ¥{×oîý CЁKLÑRµs:x…paL}`*ÓjJ#§˜—nìÅÖÄ7“¨kbEŒâƒ(Tœú b™™ è°x/zl¦¢Ÿ;“쐊Ôƒh¤ÌA#Xœ2åC3±“xJ•*7ÈAgïxÃmFF®öûE÷¼¡‡Åè4ŠÂ/ ck98Ñ,“á(3“y¬$q=¼WÕ\˜ƒ‘…ÿ…ê{Jh.äE(dªz&$qPÇ*%Q´ŽŠ0v°|G‘˜T§¨9ðRa(bd¦,è5¾–2äáØ1ÄÁª¦D*(DDCš‘)þ#‹0zЌ£†8¨‘xm…SsáDå aóñ†ÑÈTœÁ8 zì—qqLLuX"ä` K=ŒV©!Ù©F¦¥¥D¤[£ •K~¾B O¢³Q¯ä}Ôh4Fඒ“ì¬ ³qPÓïDÊÁ©ž¨”ËÁ‡jj]w-þ© BB5’ð(ÀŒÐ| ³‘YIØÆ¥èãŸaé·´Õ ÃŽm2ŔˆÔqT"È>Þ¨›Ô‚ì@Ü*§Ž½2÷ÄÁørþÁúlº½îÚd!vðƄТ2ã :å«"›:ž5†F5¡è@&Śš˜k–>bU™–ž-:˜!ÊÅô:Kqhä`Ý ½†D'ÄúÏ=$= ¤µÎћ7AvPŠ»_Y2V¬â ¢è'*þkt(tâaS=)òd2ˉ¤BQ‚"ªD/¢Ê:÷F(j©’a™"£íÌ6¯C[©§šU[ݽ¿zžúÞÒAå±àælEIRuOQ¼÷±ÖÌü!™zàȌAu9þ½U$…ëÑ(g„2õ—ø¤—U›£E¼쉭:ê­Uݔ‚ -|’ð2³ç§¢ 7>¢LÜÖAÑH75j¸§^*v#õ!\;k‡§¦6Å¢â`F螯tP|h³Yˆz……£/x%ÃˉHjYÜBBuE¾ ˆ,?t3:ý˜ïH Šöàbéš T„4,“A‹—P„ñ>T2AC!¡Êà ÁrÍEEÊx!28ð\ÆÛ<.zX–ÁÁ9#“:…µŒGâÀ”{ˆÌÿǂ”‚L$‹~š=a:bͤ”•)Å9ȚªŒ¸ ;±¶¨Þ:”’mæ/ål¥Z¨â㯈æškžÅÜ2C: ùˆGŠ!Íôp¥ù{5#¶”,1zƒ~º¬2:¹ý¶VOdVLê˜dÖܔ,˜8³éHXg0TĉÈћ­˜1Ú¸ÈO5Æ»¡’G«ÈTSˆWë֌̔l¦êüŸsÂëŒCÄ ¤ˆÏ/úZŠô1#¾70½¦kÆ§Yè"*ƒƒ;ềà&àTðxàhÀ +LÀp@0ÀRÀTà.Aƒ¬`/ APP  8¢” '@€ˆ #ø@69™"`F€‘ }åÒý•Ê@å3 ‚°àø; ŸBL*Á‚p@à@ &PŒ€#8Xpà€dBp‚xà-@Âø@ +b`œ`*`A>àt`'¸@à”€.8°€`-8@|à*@ `€” 'à :ð +À#à€JÀP Q€ 8ˆ +8pŒ€ÁX `Bnrû‚§ ˆêâQTÅšÏ:UҐB#aƒ9ˆƒ(ࠟ@ €$ €ƒ7ƒˁåœÃÌATE£EÙ"ÄQIGGBœV + i„â@ à@ÚLÔ ˜ÌdTԁHÈ Ü&„ÐÒ’´d0’ì€ ªürƒ—®68-î€P¦…¬Ô,Zþ¨©î@]w ¤– ¨kKÔí`KµŒPµ Æ´mÉÀtƒÚµë¾mK·m7ˆ¯\ºïùï[2 oÊT– HÊQ.O9D6A¹ìˆ*‡DD•%¢!1[\8ì á +‹Zþ:Íø™¢B"¢168SˆgãJ¦cšŠÉ¸ú\щÏ!òoi:‹’G<ôc·°šuŸùîI”Ñ#ý5fÉ¥<3#Iæ5Ã**¤©¡é¦%Æa;œ…‚èž¾dU*VòíN×.‹rÌW–¨0jzÂt¹ŒXL™Œµ/Ì SIÔ2í†l×åãC¸oøÄQŠìˆùrsb$ m(F2ͺ·˜ŸU„­â$‹Ýò[':ÅYc§ì­Cèê.Duǖ‰ˆ®†/¡ô¿Â5OɐAâI “L™Šv9®˜XòÈJHi韷¦Ò…ŠIA TRs ‰D×r¯3°$$4VLíB1É>ÜÚgŠŠ4Á_I‰«£´Êâ‡ÞhTEŸRNŒ£æŒežy¶Ú˜”(El^"²ƒV.CycsÅÈ1ô”1VL°P­Nœ‘Ñ‘yi³.u…»åùìð“T«7œ£Í—áäƒ+¾EaøbxÓÔ¨%“¹|kR'Rê,+JÔ°ˆƒªE¢ª}EÓٌ2år#¢ª©>1{AìoGT…qŠ­G¨.jA.’O±àeޗù9BB„ÂäÞT"3'cHZš‰)"o¯ )è ¹4Š“.&Í覘Mĉ8í¸!ՙ*3ٍ¨xE>ž™2ihò¸LAZԅ­ KÔ'‚%ÙI¡*äa‰7•¨uèQR¦­è-I«DRA%•F+¢Oͳéä)"OQŠªJÖ­&.ÉÁrÞ +›!#fʑ œ‰1”êË1¾q†ˆ^Þ´­Üå Ýòt&Êä6«ð_[Y—!§âÖFʨîßiȱéBHR ëÀæûKâª!æàEE!L“dúÄTLžŽQ£Eiÿ{Xºúôà*Èŵʬùt@w>­œ=U5t’öSN¦b\]H_ 9 ÉH¥cƒÄ )zS-r¡žOUÈì|¤1‰K!¯‰™ù?{cŠ5$܄á~†^‘ً¨ èÅ4“c~Xúˆ©lÂEö¦„Va¬\Ÿ+5»Š‚TâY©‚wæ«pP|'bJ4.´ôÄ4(æå5ü·ÚT£¾Ñ„Z[»¯ÖCõMÒö™¦h¢É£¡FS"r‡š/3Á¢V¨Åë][&Îñ4â¤W$/óH•ƒP§¼°}Ê>»3-²CÐȤÈ—Rjµ4É"ÆóòÃå·á[®-jn¥hÄ7uJڏØ>¹ü•¯2¡B:ž©,ÞÔÇT«MMb CÇ\;&ÂšÓÏÎ>Ô9)—“™3f3õdSm c¯\s÷ˆ4hQŠ•)Lþ%u e-·Œæº6JÑq)"N ­ŠÓ*‡7ÁˆFëTˆ›S¸¯’iûKxµpA¬P™ˆ +‘MX%YbÂù³6°¥:¤[A®i©XÂOZ¦Ïxèö&J0UßêÇPô$™ŠZõ#!Ï6œ&˜‘V08XNý¡Hœ¨ˆSJv⠒ÆPŒ¨2*:ìÉf4ÎםEሹM¢Ÿ¨óû2/â|*TݳXC­9mo“ØžØ|‚•QÉefJ†ºFÏ^\…x%ý…w!ܤ¨èÃu5TAµ0YB1tƒâîSœ¨Œó,²~¢B‹œôòФӢ3BqXí…ÆTÑ ݪ"™ÎH¦´¡u!eLËïYªŽ5ûؼ|$oÍWÐXáÆW5õw"&âª0ÓU7;ˆ÷ªQ!! Ÿwç__1USDµUýX1™»ìŒ9‡¢åh}óöÓ 2UXÈ 3')"‰¤ò¹4Z–V:‰÷\mR¸V’"Ý2¢“•»R*%4•>}ÐËgh—’Åk¡;aÕ4z†˜”eŠ‘O‹H´ù4§îà÷D¸hýˉ˜‹sªæš«ü›„è¯h8ꋐÄuqa;p»ªÊCÔº-ä?¦‚yRg„z9Q È,kj½¢'Šò©?UA9 ÙÊ;õYUVØ C󒢸HØÈÓþÁN™"ýpa°j4¤b57Äz*Š14)©”ì ï"n²TÔÃ᫜’)•è†Ì»F¤âÛ©¨©!NixPAœª™–„<*”iuz|Zý‘Ó}ˆ%ì’0¿¡a†:[,)Ö! Q¼/E*–v–ÌbVÏþÅƐjÛ՟E‘‹ŒÇûú¨h%ß(Ê ªuŠE=#Lqª&²v^h5¢ÐkÆ"E9&g1‹\‘×’„(JU­­AÊê%+žèŠé:Vm¦!ó˜Q=&V-JOŠˆþ+™bî|E6#µ:ÈëÙÂ^þS{5‰³aï˜D±¦>EÕðWN }¹‡4,‹Ld% ÄnìX$AlQj¡P‰m¥Äâ-"ʎ\£q½å’©Å}ͶÈ(6I·†DJ=üÉuŠi W89"Ò²[Í(SA‰–µiEÑ"û‡ášmUütÆôÝÑ£ºrV«²¼RÑôDY)rǞp¶:S{GM£H®†¢^#~ …Üè Ey÷BÝz+k=uG³5¯ÎâµÓ뢠I(ˆ„á¹|¨tu-ª·Sç ‘ÎŸ¤:®ÛóP—d·;¬G +Õv–ªè:žáç!336¹E”ñ§UÉÖ[i:ɦþŽÅW98ÔMŒIê5ŎɄbé)CFä òd¢¯rcdJêŊX8¢“J–ÎFزIËê§P—o'‚÷T¦è÷{nåwY>V1Ð]Í4hÅ mXG9.æÑ#OÝ?KÄS¥»NÄ£ÿe.^o¢UÅj*öŒ©h‚-I´\ÝEїì‹z†-G:ŒO…ÍÌREl!¯TÊ,©ñu$¨ø% ªxÔäeU”ª^äj‹á©:*֐©¶^RթԑPUՔëžO.²%3Sýž=Zçjä¦Ò+2A \éýºŽ…sMיªÉ׳^¢D躖còz¯·¬BW©Õ®‰Œüؔؗ|ß˚ѽUMcb¾V‘$šdƒŠv—ŒìÛ …FƳ†%OU½CÙñë«ÕYô—±Ç¤±u9+ü%\¡ì|rI0+bV(äÝp2 få¯Õ¹á•ú{ÇëœL•Aux™ש™[FpŽ±Ÿë/Æaç[­*ěê?4EVË]Ò5ZóNx\‡ÍPë¥NŬ +–lª|E¶5!µdálH„t®Ç¢ASmËúÊtÛ·„ܹ8%Í uây¸$"ÐK#A’F…ÈÙÚB3ÜǬf²®rJȾýA‡p».]¥ +ÕNK¥áÝú“z®ޝeÂB!ÒQiÑyjîЫC·­ò8V {ÝòÅW˜+ôŒÂÜ*N…_^˜;"ô*“L±~käÖ^žˆ¨“ +äöãî+ª¨Oe×ëõ™ši*€pL’LðE½à€8 @×R%L‰Š4«b²©ÊTò\r†C¥ÅŠª5úȈK¦úC¼"’…Ôy‹3Šñ¥FE¢'où¹gZ4j[2 ™x©**\Náðθ —•á i@ ÃO~ŒLI'rsŠ"¹ej7DkJ©)%£ÇT«ÊYYk|³­eAæ ê§7Ÿ{4Ē)šxH;ÓyÍKp }j¢.*•ôTïzýÑ^bšqòkøµô2¹ P‘l‚ª ›«Û×tú9ãUSTõ‰;4Î6º™6¤¡“o]±ÃNk†BÉÁÈ‹FÔ}U×ðD&S×ÚªÞD«1YÂå€|£3¯Ê§;¨ubdK»lEMPÙÓÁféDä% @Rj‚c""‘)À«1¹DîÆ&¦Ê×í:ÿåñr‚ç$ÓUHÆ"ÁÙ¹¨Í•OFÕ(‘)’øêB V¼x³¶ÉŸp9¨KÒ'Íe-­A­]¾?—m¼H‰,~<¦»Âo¡“gå·m()–-­21DÐHYîùbÉd”0TGí&q(cŠüQW0©6Z#V"Ô蝝*΄DÞ9†Ò@ìåõaiªR뢓ÂWË"ésŠÎ¥V– ï£DïáOe’“RxãÒØUSA­x8÷]ò ݦÐ!ú½Âdö.“¨H@€ + ÓüaA`M(FlD®¨å{Ó¡`­¦†e'÷¨‘Hw’ó +6¨F" ÒBB»4bª‚$¤ +¡‰âGÐ.ù,2óÐÛ(ÎÆJ…)F©yNýzϼ· +ŠÔæC ¯R“(ucшÛz¾acWªj‡ˤ– ‰Åß;W;ś„;t*š×ý^úpU¬”šµ×|ˆìÅ[·Mœ!“TÆ3«9©F¦¤ó1µ-~(Á1É@F‚1 ~ŠIœÇÆ¡•1ÂŽ­ÜÐŋb’AHÈfÒƒ # šP7Ud.ÄƒF–x*¬!5~î6WU¨¤Žb.½Ù/aE"qe¤&Æöš*FG¥S˜#AÊsÚAÚY+f1F§›‰Y‘ÙjT8ò›¸Š~bÓM~XœÙ+Ä9K­„žpJÁ¹ÔR";Q"•!²qvûýú$1ŽÓÅQ¤rª~¤öiÐ"ÒGSÙØ!Göªx(Cš|´‘1)ÞÅo±!E]\jþLXªVÝï‰I =¬IãžFèæhtn"&6ÑZ&‰;ì,ùMO›»ÈÛ:rŒ?BϾFâä>&ðÜ0(8‹MTªjè-z^zÞ•D {ƒò'vЦFØÇJå·6!o8ô­Ðsd-z²CòE•ÇD¿ªŠ”<Ô² +b]јš¢©z9åþ¡Nх販1¾Ñ¢—•¨$s•‚ÆÅ©¥F¤sR•ãÍ<'e§Žêª¢ý +ØxJ%5v#,%úáP!‡DûkflY¼Žh:5I]R¿QKñ‹)ªZpfP°º7Bqãp"U¥|.QñXÑYJ±‚6UŽ½”ª¶u)—¬jœu,Q¡¢™*žìYyrŠú£$ÑùMöÔr8ó±( iij™7UÂ2ߋŠ†±‰¹#¤ÆÌÓk¦HJÕ,$PяEñ‹×ä0UÓ²tùs‘{Aâ0¥T“ó‘ •')XÂ-z$aë‘Ñœ 7”Hk*ë§aNnF4âˆq/ñQlñO<ûÊ°›úGD*CBR +¨™l‰ᩙ#Ìɑ6îœR”6;ʍÇ +égc„TñÓ)ÚGÌðܵ ‘¡+ED!–ùÌêaŽØ”þŒv¥û˜µ •?½´U¯R"”j¼(,•>8RÙ²wè>™1–u• ¹奜h£ÎºÐøâO*¾OÈ =¹–ªHžeNV™Æ±©TOE¹†£ñV0¦U¢«f2Ã΅§ÚnÆD;MŠbèAu¾Cm„Ÿ%TKO4ágmElp¤†ŸE¡‡ŸJŒDg5ÔIüBh,¬!j¨›6µðó2~ÆMªWÞê±R¼¬*A ×þŽƒ?¥4ø.Å]r°g$!3eWúè—a¼3£Ôæ#Gº´¬4/ƒ.$ïÞZ½Ê?>:M1"ŠDÎiÄ«ÒÈa¿æ‘:Ȍ¡±”¨îÒeJ¦Ä-’É¥JaÉE/¢áÙ¼]"û{ÍE“Š-í”ÂE“d.ʘ1ïä#®‰J]ڍӪ‰RÕ©ô6u’—¨.Qª¬z.´8¹ß'Él^Ý¢ÏɌ ’"É Ý`È,SU+`rG2òŠ<3–×?Ù3±bX2ƞ-âRŠh›Ã"þ° béX*u #‚V·$æYVy„Hz³"Ln!­¢ “ÒòíšY~ÕE¤z'öÚ c™ZrKr[±z 5‰¡ sÅ¢XÔ²U©1ˆäX4…vqêN¹È6¹$‡%Ì9-]cïIY"V’ò7®Ó©-C¸@ÇÅ$Oo˜I±X‚cK£ˆ¡0scóÁÒHa–jÃdþBj즦ó#% 5‹ã‚ä! uí$—*Í› èåY“ *¡“3Ý7‰>jy6ÕôdEÐlºeš¸¬Ê©ãU@½lÈQ™Ò`õ ŠišÌ¢q½B܆rq¨n2A8Šµg†6kãž9‚h椕/’ÛCR&:#Œ"!¡Ä©ºˆ*R.՝,©ä¤×|DrŒ8Õ×àk9)ßÇM_ +Ç%<"qʯÙô¤J-ÂÊpZ‡ÔE¸ÙJRgú}øy Ōé4¯B¼ù·EA¹ÅUåPTÙş4¤5æ!!ã!a I#E‰…9qkïHç3 ž3C\Iñ탍3Ì@ӄ²›ñ>A¢¨$Ӆ™<¦qh€ S P0ŒF…âq)·©\J‰F"ÉD.‘µ0†Œ"#"@‰ (ê`ðR´U$²¹’”Aã>Èp –0(¤Œ™E—WV1=öç +y=` Èû¸ õ ÕXx¿è gt+½1\PÁ ½1hžcdVðõÔh„œN¾D`êf‰ÀEiP øCáƒ+¢4üKoT˜È¾s¿X§dM8½1Jð3î±M3KâYë6ÌÙs Œé ÓT@ېizc.¥ÿbòâòlS}1ö §R–"àl­àõљѺ…è"û²!ZÜèO§{3óÝnW½MÐ:J_ÿØÔ؊ç`¼ÑÔø"h¼âÒÀCg_±Úý㺑þÿ<R_OQôâ|ê#·W#Þº$ÄÁ…¡÷Ô¸¤”k9ïÑ)Oàj£É˜âtØ|j¤ ói»$³Qé7%‘*%–XÏ,P¦\BLrD%Õà`W¢–«7`fý™GðҨƭƯÞ+«(ªÑ”pP“æä¾õré;º».8ӄ¼‚^婨†•P´¥ÕóøGsÿ­b|ñ +y½¯ÕÈÓh֓ŒjÀlA,_õQ„Q#ûÁEªA'Ž¨”Tõ6ªÑlÃp€ÕßwûWÆP cåãT#õª„È5' 0)|#ÖèÚ4ŽhC|£é_«+èâIÐGµÆ¤,ªQîògÞ=ðýÇbR ^qBÜ/ª–X6ã9H5Ì]áÍÁ`þjÄH;’§÷“ˆ¬–oŒ¸P¹É©É*'’PT<—o|)-H“nS ÿ‹ëɨøÓ£™j0¾ùãÔ*÷6oޅ;ÕÀ +KÑì‡ÂF?ãÖL§©´ ²¬)%7Õpà¦ð]—ƒ ×|# +¨1yƒ¡jœr-:ÿ "ò¥lU£jXžs¢©:õ &ë©{Šy$sÏlÎÎBT±Oz#¾¡ƒ¸è¹~«]¤Ù4ÿAU ƒW}¯…\U5®ŽÅ «Vb¶Å¨ñ*W5j˜€$ý‘ä‹„2¹å¿U .$î…ÏÑU N™|U5¶ãã?ѯªÑߞԘšª†I¾¯Ét%ɶT5Òm,åoèÉ7ŠŒÈ{EƒG%ô¯ˆ/ß¥‰ qLãôºm +ŸgûPÕðå4u‰Q5ì¿:%S5@Nª9ÇåÇP:§j؜ÌÔ1ªFZ.¨ªF…ÅŸjxãEùFšíâZÿˆFêW#K¨ñÕ¨ ÔƋ};8Ì¥ñãA ¼·½ÀH+C0p`Áj~ýi5jÕUóä5V"<¢_Ò=,$Þ ‚X£~ bH5Zg×Ùô€56‚ܶËkàˆèl8Ê*"°Fê(5þÛHÖ(\IåC°D¶ŒÜÀ‘¨VM`k„oWiùÅgEÖ C¥-À–f‹atÔÀq!™v;#8øܼr ­Öð)àЮÎ0ֈ +ó"¬Á îàæ‹ðOpVÚt'X b…Ÿ¡­(*)uëÀÑڇñÎ*‰ò©”X£¼¦Mܐµ·:‰5´¶É”kðªòÖà€âiõ¸!¸°Laš3ø¿°ÆÖҁ_LœÂäk#“ 4¬Aƒc•’HÙaiÉŸ°Æâ„r%a "¼ÄÃ-%]Âqª– •Xæ°FՏdúþ´Íd44ì™*;pL l7«CÆfæÀ ÀàðEk،©ÏO¬ˆ}sšZ52+·;pŒ:£Æb²óXÃWB1¹G¾ +YC4] +×­uxà€+Jˍ^†ÈvmӔ“lA”m²Æ5Óï,²ªÈb:ÇÛ5R>GD/ ÐËQ¯§É/¸²†"ȓ˜TY#ptõÀù–5&Tۗ¤¬E®`Aæèė5¬¨M +츬Fñ'”5¸êž®¤@pœp‡iv1ApÀt@¹=j 8nºˆ ÛÈxUé€àÜ0%ؔzÈòeÀºb %˜b”0ŒŠb Z쐩|¨ ±Fø¸©=Àu 8 ÷bО:!Üb +EäkhL2þr>ُÀ$ÖXŒô5"ècütáGæÛX£pöà×Xxgb?­Oü Që +2´Ê%g‡øBzìZÔÀjŽøã–ùkÔ¨#Äa͏- +ÌküømàЀ4Ïց£o]æÔV\öú“£YµüNÉhÇÿÃ"¡5"ÿ§WÊì÷)Vz7€XåÑ´;⁅a$q\ÖüÉ;c@ì0–݆ €‰cgƒ¥¡DÝ5*9VkŠ-ñÍ +É Äaۜƒ•`ci7IA⌮š%Ej¥#ÆÅÖðŠÔ &æ‘8pv RáNÕW*©‚ º@gŽ8hí„ Á Q³eӐi<9ØA'҄‰G—]¡e%šÖGL”6·_ó9?Çވ§¢{ +re×ÃzŽ·vwD³"{Õ­_"òÚî(uTê_=‡³©¼å€—)ÌŽOŠ¸ô5ƒU tu¤à(sØø!Za§&t¨Hü̍”>£¸gk†7Ä bü‰ŠÆ[ý3ٔøÞm!Ä Ô²ßó{ñþáÜ5ÿƒŽÐš|`C„G…¿A‡a2sÅ~ ‡¡Ã¡G@t¼„=ó7„Ž”™HÒàÒe¨a¶41œúÏ{7t˜CÈ®D§Ê4:&*&_ õì읅Žì5.:®¢':ü&Ê%H':àqÑàÁ<Áð›Àr^ %Ïå¼¹‰±¬Ó.÷ÐÀÜ»1Z¶îˆM¾‹¹;E‰EVê,PCn *‹ÄÂP„MåSUëþƹ†¼ó× \wúQAj(9Ò)t˜Rc \¡Ã¼‰êÝېÐÁÄÒ¡#Þć𓇽‘ÃØÿy1ÄzUù€ñòÑ áhkmèi/NH‚›"‘CêhèÇèO ¢IhÚOMYê»’jp“ÃŽyá&Î2n8;Q2@G¢zͺ‰‘@րÌ@#ãH¸„´T‚þHø?¹´¬Â‡Îâ»aØ~)“ +º^24"ðéT{A æ´a–ÄáÂjŠ¦B € ^ cƒ®v²¶«w¾"q>ƒã8x Ø àaˆ‘ AÇE¸`fKâžþò€±¬mЁJë´ÞÉÔs­™í”ŠLåp¤tFâ*Qõщ! +Qd,/‹Ú:ŒžèuYª®q¢XšjMsÿz{âó +ej·tà4C¸ÕLRH1èȲ¸Ê¡ÀiÓóbt £5ƒ\Ð!ïHú€1ÐÑ在ñfŒ‘‘Ÿ,7úaO÷û óÐõJŽƒó“«+’@JôVnŒ#¶!ÿV†6^€ŽER)š¸¡Ë²·ô:j0ÍRñ7eâT¹Þ”8ôc,@dE =@G)~zúü.ýi¿Î`Ë!B9^Ìîrèæð¿/†:ÞõÞ¯‹ŽU½úY© ´Oè0‚MA4g3lÔH+Ž6ˆAŽ—5ez€_y˜ŒÂ-€ŽÎXfˆº +ÇVšNî]'VÐtpd‘3Î"äÁÒQö¾‚Óë +ÈKðŠ Ü¾Y­I€µ[:qAþÌÄGXyHs^Ӑÿ3úDaõ.>äô±Å먂ª {÷Ïq›¥èL÷썄Àðd0ðùs,ÇÝçϑ’è²|µ?ÇK¾ )Ü)ӟG3Ax±î—ŠtDzß4ºÄt€¸JPÖtÙoÊEÒhRm9*; ìs–·„(C@‡8|W‚QÄ1©)yjš’!¬øè8Ž9S3×~tÄ®’ð¸tˆ€ü^@‡êΈåÍ!@4W8÷¸}Sôsîr¤A èw +è`°fãM\SúºD@õûY«è8LÍ°ö§ðn$(@ÇNÔþú” „GÛ5 méb èðWh‚Pc}ù4ɒú‚±þUZȗ Å2Ük)¤M1ŒéôoÁ%Îp³ ž”Æ=“õ}ióòXϛ5éb} jTÖ{@y¢«§ƒogt,´‰¿ñ’£œ.Lµ§w!íZ‡>!UC ]Š:<)j“ŸöB»XŸÌ_%Áèx¢ÙŽv³˜”»]og]¤Áì ØÉëõƹôV Ðá,ž£ô~<ÖS¿ê=%–Û±0 ôgRêëGD¹VÕ Äî‹npÑÔö+XhA @‡e4+KfdÂý]á Èè$ü^)5€ð-G‰Xo.´Ür YDŠ,mË!³qtÒ]Cš½¬Ù6wDp/Q=LœNP%àÛ-‡í‡Èç`»T™ôÌÈÆ-â0ÏÑ7G̅œÆ¿·g)è0  ± cid.Þ'qãvÉ¢ú¡G2“E· —WôöQ¹b‚Ž4`#/ùŸR)èp±Õt ò— €#t8À¹^ øG+:(Ԇg–ìžÐñ + 1º"a¡C9ê˜gZNzmˆ½À8t*÷í1Òn¢C”ßš÷›$å”kãÙÁÀ2ÈL݀ŠÙuÙþõ§Gä$×>~ þ:dö~eõ{5¦‡QW¹WÕù0¾,þÐ!lB’µ¿7€‰Eû `‹‘9>®“G»:ª š’µCèöz@t„_/‰Í"GmŠèÈù‹Î¢tÄCt´òt§gÎÑA +>ŇWš»óc€XâÝçeºT$: +„P„a:¦÷b~•ÓÑÊ¡Ã]:?…pÃÕ^§{·¡:V"ñ +)þd³ÖqŸÆ™=mKGÔ.'ضD‡›'ÁƈéAˆŽVØ‚è(Ãî(XDæ>õKöBBfñ’Ÿè ¥} +v²êœËšIä§ÀZÎSJÐqQ\̇I-ûö>ˆ‡Ž‰¶1ü¡):t[Lb”‡>~²FuûC‡8+”—Çû +« {ÿ¯"²=%x£Ç§Í+Ht¤‘(&§™è¨(Ó¤0ó•R}i':¨ð>C%:¸¢a e‹dŽ7 {âll¤™#A"»¦…>ˆŽÏ6Ìm.ìd@9íòDA}1–DtüÆ}ºª¢ƒ[i/ìDëÐÊʤq%ùí<öˆ@‘¬³VT¡ÑµS÷¨¥õ6ª¡C¸E¡#wkkd|!_Y𛔫g0Gèð_ÖDœ!t$ÝËñ Õ¯[è€þxؑF‡= $É¥Ö.CGa‰aè”Q6tÈ}+óª”4·f11tȨ’°q@JŸLOÔ‡X¡#¸¹²„ÀL­zøAGZøâ±´%zЁÐKd€?Õ :œC1¸&(ªX=̹’¯³D¸t±rr,l»‡ç°¡~¹ùô +:Æ6›mA3%ÿ¥҂Ž9Ëw‡€Ð¡Kkù¦ B¼BÇ,µ‡ž\×{¾Ôِ6RÖÖJ§/îšWÀgÕ@Ƌš<ªä¨úâÓc{½Œ[¼kÂ~-èèsìÖ"͒Úc*Ó¨iÜå É*–‰*è°^¬:dy‘³A¢õ Ã”DlSÉMɊt´ñ3*MHÚLö¿fÍì\ ±ÖÊÒHGª"$t<öÁðêà C|1þƒŽ–=÷:å :0G®Üi,`ê#ŽAG!{¤"ˆäCtØÍÒ=ý‘=蘎(’·¤ù€Ä ÃSÓÿ⠨AÇÜÖ*‚ Ú¿ä~]©7/<ÈÅ´÷m‘Ñ<¿ÿbµÄøÉ$¡ãµÉ$CBøtÞÍ RÌÓ t\ÙohÑË¿5‰ÅÜw…Xþ6DŽQ»p¾ø‘Ò ð1Pù¬;ÎEèà~B€Ò"² []d8ägªŽ¹=,Ú°y×,QBš[½mÀ PHIAC‡‰€&· +OêDé.tO/’.åBÇ +¤aâl×ð BǛ"«äïBÇÄúŽ¥:D3áB׸]©Eǯ²ñOH@Õ£—±¿_}èî)%÷”p’ äR¡^֘èâPÿot(´¡Zt ^pùßEG+A#Y¡ãÕoàmÄ~HâÌQÏnªª¸â¿Ž·iàÇò©×YÑS†Çåãrƒl{ +¡Â3ÀŒÉâ&™‡ÑD,€ÔÕ}ÐÎ8="½ctÌ’9!¹ÇÌï‡PI¤q}›47°Î–˜n&¨1J›cša6¡cD·2›öù>'+MÀ®XDAmْw¯tNBàQ `¿ƒ@$Ü$ho¤¿?½š f¡ŽNH(u©Jª&"ºàË#’J“ª‰tLç©*0hŒ-“ó|¸î“q£*>Ì¡àòÌC-jþ‡-~vtÔáǪ™ž&tæÿXmÊ8Óä2\±}OH“¸ÆËZTš/§ Yj€¶4IÙòNZ¥É¡Z³÷h‚ØÑ AÑd(I8ÜLiÀüÞ–—):-ÐdñÞ=E"úeŒ£ÉËì1etÖ?|`ªdã·Ö¨BEÇ˝8ÀI“Ù¬„Ïl¼Ñۇ͉31ÌçûMŸ˜:È][;kªÝ)ÏÄn¬Õüh¦& ƒ ‚•°¯èŸKho!Å´<3`UÄ{&¯–),ž‰Õôà+I–⨥‹&yVRΞl’àÙÔÄp04ù;x”áDE·ü À«4:(å转ÿ0©49¦õüK4ÁóÌ)ÊO ,¢øvî…ýb¥;šb׋ÃÒy†lë.‰gÖt.ˆþBtœ²Ó˜ ¢Ãµ–1¢#bÇÖQ±éБ}Ö:äî ãùò;訄¤‡CtÄ ƒ½ÚšüЏƒŽ}61eW–·¸rUüú—Ù¬Üc¸à‡%D$¶O["Ž/Íýt  .Áftӓn>SÛq[„XL¢˜BG{! h”¤j¬ºPèؒ©x·y¢™BGLnY¡®þ¹k% + `´O2‚ F*t¬+µšäJ Ðq™1¥‚–ùéñÖ7SZ¿‚F@ Û»ÀS‹ŒÒ( L,¶(TÖÉ®Õp±Ð!¤(í dfB´s‡: +ýO& ϖ“k;@ ° ¦µÐ¡C5ȍQŠ©“å‚bŠ6‰u.]Åω397œüZÖb,Ûq¨@òU0d#¡#¢æ㚠ºiCPU:<ƒ?´AGóÕAG·ú:è˜t«‚fÕe:«øMtAè3‹€}w²a¹ #f‚NÏì÷©#=ôø¸…ZÎäq0ùþÅ°o!Otmõ¡Ü,ʔ¢ n oú'|8[*âð• ʪWlK~ìÑØ\3Î_@_~\ÎÊ胎ž³ÄNKƒŽQ ]˜  ;;¸Rh¹äÉöɽY ”Åô;ELEíÁAÇmõ‰N‰éý@]§‚;Mƒ-ý&>¸-©<ûðÓΟ À¿@\uŠcº¶ïnœ#¶"Ž®Ú ¨¬_`õ究z«rr †¤GáÍ GlŽ +ÏuÙ°zÜY8ÂR}=­Û¿;–{7ið­y55AÇ#kpêWŸ1’gÅ\O'H¹š%·DÆ$½ãHV®p=…_xl¡˜Itå¾K«tt1bw>b:sÚòª S\îe»Ìòè‚Ž ¹åß) ¢AÇg˜Py·ãƒŽ8$ikætŠ.‚*Âcÿ4uüî¯EÍÅß#yq:ÿ ãÀ‹´äåN:Rï’4ÃÒIá Ì +åowê¾ÞQrAlØ}p¼â-hÔß0:Úÿ]Üb9ú~éyOÌ[v"„Žx>àñ†A´§F”ãFÓ*NÃÐYY‹¹´µÍ"®`°nŸˆ˜ŠèH°›×W‹‡è˜X; Lùè|‡ãkyóü8æXRè®OÇ¡5;GA°ÃyN˜wÓ`’ „,L>¢ÃO^Œ"zèà´g#:|ìT±z:<òÅÜ7{sш·¹Tõ C:ëk>,¶ éR‡ŽÚY„çdïVwyè°żËQÁLÃP@’ž ÍçL“-|uÁCGSÂ!؟†Ag3æ ` §(6n€Ý£t¶±§ò‰Òál©Igô}OéÈ µDéH©lŒ¥!ürÕ¢tÐç8¼¾Ps¥ÃÃø(+@@?ßÓhKG0¢¢¥CË­Ï»[r‹*œëÑ)D˜×(¼|ã@ J‡i“ÙîEé0c¡ïoŠF)ϵ|o+×Ïf•ßT2V:lGÀŽ¶üN¥#ÊæwÙ=T:^層‹×Qd••A¯$¤ÒñžŒÍ•Ž”|RéÀfh®t´ô´®Ka/¯tx¢ðÐéŽÇ[éàèQ!ô¶Ò‚ ÈÔ+yv¯'€ŽÉUéà¾<ýÌ«t¤gáºf*L-–-¸ÒñšXIÖfA¼ÒÁ%/HJ™- uκ®“ŽéƦvô¤£Hµˆ6îŽtDÌ+:"VtÞdo!éè`‘§Ù“j¤Ã¶3å o%Iéà2Üan™ºD:ØnA3‘2ž_:#@R_Ė# +åö=â҂lõÇH‡P¿éx‚S,"ҁõû֛}Í]é@£œ¢t@îÞ¼H×]"qˆÓtð"Üf®¼4ÞÁááL¶LVȬ6ÒA/§¾a‰t@öËÅkH:xPqRe%® +€–$ƒYډ¤#+—rOÒñ–„¤£! +E*kÈ%ó™¢þÎH:x–©¤ÃÞ$óV 0"ÿ’>¢ÌÄüÄÀ3ˆ­E: +¾C‹ÏH.pºå D:†@Ï:²¢H‡m˜ÌJ‘§dƒWëxI‘Ž)PØÙëûP€HG×MR‚_$D:[<%¸ÖÞ¬‘8rÒd#«†væõ°¹é˜Ù¿;­Þ +HGƒ#EØÛé¹ ´ÛF:Á¨ëà +éP8‚1ҁ‘úñÕAÎ+ÒQ­þœX»‘K: ˋ¡}3nHÒáýC/éYó ȗ1„ÆA%†nÉð©Öžt\Fqà®7ž8¥#'£h5#)6iâoÕ¦t(D-ÞÄVé¨ÓÝT0-ŠRúJ‡‘dQèJ‡IHV¹ÒÁ˃º»ºAW:F|(þÙ}^¥þU?m¥ûþªtð£NÐ"Ï­tŒ‘~ʆ‹Ê¨Ò‘ýûI¯t4»'͗‡÷.­ÙŠðy˜¼]ïÓ±¿¬Žïù1²¹¹t|"ì”OV_:X߃ˆa9".…=š6fšKÇò‰4'-K÷ffx¸–¥#ƒx¯m2̀³t@ßÉ+géL˖ŽuSµ«¥£Ù ÔM,u<;‘}Mxt8ÜGr¨g¶Š7RGªÐçÁ·_€Ž.‘À­Ë­“™C=:V1Û©DÃù:„Ù îаéì ðjƒøϔ:ÀHÂ[hË6Ӆ+ˆ@Cô±KÒ$®ã}Ė¤)eG’û°ôÅM‚8š´ÔQ~½¦ã;0íÉHRrĬOï¾85FĉÇx*À¨½Ù!ILŸ+hX&B«¤oGàϑžùþ“:ŒjäÐÜëê’vNŸÔŸ×qŒ¤Žc`VLŒ¶E¾©ú’Z øòì´Œ-½°P…:Ò;³òpüi˜ÊÂg9¾ˆDQ8Ê¿X*œi4l,WÌ:ôÁò2²r¨#ì½Ï/OåVês¾6ξ†:„AkH%ÄfCÓ|2ÂÒw< +ÉbKrt¨C+D."Œ›ägÅñÆQÒÇ:Ýxdikï|ŽÔû‚&kdÖ?¸: ®bÔ}yðï®NÖ!Í®ŽØÉWGÀ®«Ãj˜Žöÿ<êñêH{_Àÿê@f^ßbµÅ_x]ëÚ8Ë1+U[ãoäóðê`¾e$ËvÐ=ÂWGä́U؁¦ÄáÕ¡†OûM^šØÄ,ß«¡¾Îïd‹±W‡qª‰a‰0†u°\CK5XG‰ó:{áց̬­Â:Z<ã0Ô ë8DØ0‡¿‚†uÄ©c3Y€F¿ šCXGag¨Ö±)rLõU³ªë¨üýVXG斃Á: QØó¬ÃêÓvÏCÖ±M;=0ò@a!.>šÃÌB ƒuÄÇÿ&,¬ãJ¨BǎágèQ¦uÖáuxepÏ:s°Ž×U_ÿ ëøOwiä;þ¨ù{ª¦ŸÈ^Í=íÀ$…*s|tь½::ÄÚÝWG¼œ$nXGôþ{Îèzë `xÂâÜIé¼:s,Ô£¡?^¼'ùƒ¯CE¦óê@üõ‰´D§ ýñêЉ<†(zuoâ"ļ:ôùÇBÒWGÐtõÚÇאw¯ÝÕ™ÒWGôÜäÆ~ít•1æÀÕA•ÁI»:ÔDŽÒ €7WǯÓݯh]GØՁ~u4É>˜Õ°½:"Ã_þ>Q»1¼:F*$¾Æ·«c…<Ûf@×7WÇ&G?Ð5L€®]uupiZÊhvu¸+‰A]×àÐҔÈՁw7åñ¹:l$ äê0UïÑßW›«ãce*S¹:ž4”Ÿ: >'êñ_úÉ'W‡‘­ò I¹:‚ŠÓ%Êëêo7,3» ÂÕÕqÄÌBÜavut!G°Æ«ãO\DtmëàZ‚GãXÇ£8®"ãø)"B¿:l$«xe{_=øâ¡[4}u”,؈& ];ƒ”ʝru?$4sŚrW¾Oâêxy ÿk\Lf_É].ãŒnuu<^-áòûBWGà¶:ȧm5IZýü(Žl<˜{Ûꈌdm¦v«ƒ#!$ M‚–©Õµ:€V‡G¸?èÖá|k7Ì­Ž3ž€{n«ÍW 9#ºD Ö:/¡HsRu`òÙÌó5qÈÖºpbõ‡!Á¡…Ñfº”pEbV>²¤KµW`qõ™áõÒ°pkm–ÅaBH”Ê:5,Ò¦[D$d–˜ŒziºEq0ÆøÐlÒàS^éBØĊu‰– ]wF¬´ =e];,é”܁“Në‚ýG'3ÕÚoml\”"ö;Ã/ox¨š‘é„:øÂX_M´rEZFWrðùõšñ`0ÿ¸²Žõ×Â׈.JA¤â…§OèЌD'’&0WcèŸÚÌí›×;‡qÅ£¢[¸ÍL%€#ö§µ®”ðçjx +?Ws¾‹INE—\]m²cnôc-Îþ aeîÌ3mµÐvÂ-àôâ&2:A Žár¥œ—lx¦ÔA›1ϯòÕ͵åv5o²î¦#]íd¯kä 98úãóqã×3¥ˆÑ[ÿ š8Ñq¨¹Š¸–Ó2¯rGBˆ÷’›Õéâ²ÃEq‚§©;%JãgÅ87±>Ì9?3ÀdñC*çä‡Í/á䑛—|ö•á2PüB¸–lYzQë´êFñ²\²¸Gži…—«FyÖí&÷qø”pð=Ì?­øRM±±Ø&»SïSÐNsYïë +X•”ԐŠh DÏVS•íŠnƦØ>*ËüCôk>Nž`"+—è¥ä0ú߃å(R°CzÎÞÑLzÇ-kpxìÁ„IñH³AáÀ>¤_1a.j^ƒ, +‰)[‚GÀÚ.kˆ`^´ÉQô Á !é§[š"ÈI&k@ºK¼Éx -•!Kˈ„WÕǐjàíÛ}™ŠÁ{ÔE-Lª?^übȉ峨¤£>wm´k€,nj-‡p>ƒCh ”€vÁõ"Žäe-p<1T¢„ÑE؄ ¹!3Õ&¸;´Ý s1Àäßúˆñ@¢“̍Îö°Èiv¾ sڐö3>y2Ÿp9ÕTÝÈÒp(@£¢‹AEÒj{È¥OJŽ¸o6ԋ„{,-DM4SEÂŒ3¡¼_ ó3•˜íNÖ&>‚ìÐCKÖ¬ŒÙŽ¡ $0Z‡éˆ“? \ ~8ŸÀ‚]á'}T^{@"rŒF™CÎ8ÛABuˆ›Ä/„|rV¼„P°T b9Ѩ’ +(HƋâԁò6Ó÷€^‹ Âo ›¡è¸sXÈÓþB÷=č‰cºIB{¸Ò õ{ÒزÍIƒ¾edñÝǨÒÔûÜ„5𦨪¹°œ ¨#„ 1‹±˜<›ÊYˆ$"Ã2±ßq£ZZ–j16¶ å»ÓfÚ,¢¾Ã ÜNŒáUrߘ¸¡—eŠ PÂPûjo±Wß,u•{(H!" ¬løž‰LøÓ¥z0N”̬¨B­p߄ 4zb ¦ÔhÂlŒÅ§=YêÀ4(ËHz«…âm)6ØÀdWÏe¤æ‹ð/ï´/ÁûM#ÿtpòöÜ¿V–Ml¡S¼ Õ®›å5©M žå“Í*cÚ¥‹’31²£·æ ù¨ÉÉ©.RgÕS èè0š{·üIÁ¦Lûœé¶€î!\܅”<_҅h>üwDïB\ýjÎU¿Èú_iЗ%·~gópúÑ]Ð †¾Ò…rۍŠæµ¢H\Ž:êÁN/›~ø-["*HÂ}ST-‡lny6}Ó9Ö<&Èÿœºoº+êo×ÖaN²Ø®ûQ±!֋Ԉ8&¬·Tce,¯zàÐè«t>©GmVµ‚<Ñói0žº<ð6VŽyjlŽ¢56ܑ›ü¡Ó’¡¶*¥@WÓDõ6Í­©ƒØ볐¹Q“ño–³‰™³®N5±Ä¡lg¹ÔÞڕ.è¡æµ5P¤½¹ìYû¦nFyš{ߖSó§o³¸¡{–ù’…q~zz.R¿+[? +nåÛèQlÎøå½Ó©3puØàjqnÜ÷œºä‚"T‡wÎùÚ3bÚ'k¤3ªØÍ)Œ"#] ýmïô°vNÄÔELB–ÚNh)Ò¯‡Ç槦uaµvM|­Š“$F>2ô‘ŽÙи±¡Žñ—žçVêW“ng¾N~ )ƒŽ›¯QCÂ×:4n$ê`–qxèô³¢¸kÜäÁj,Ο©éwì+}-ÛmFœeæà¦i-†|öYŠ®†‚Å +{‹…:#†ºgòls4™+…Vj㐆gdo—4AaÒD(Ÿ3‹òÊÞk¼­pYSÏ|ŽÀ +Ìqr/@Áaæûó»ÚÌ1‰fØ¬Uó½—5S&0Aè-¨‡ˆ²ÀÁ6>ß(–Š¸¿½wŒ¹ù~"á¯èrw!áT^·[FèU_—lÚ>¶$Ÿ{öƒ(Jó-Fºh‘dˇµzx?ÓF*ÚýØë"4dr?¼ µ(rD§O¥ÿï?Pduø`Ñó¡Ý(ß]Üqômq¬Ô*Ä@³4Ìû ×5#ƁEÚE†Þ¢uÜC"×{@ÝlbQhÚÀ`ij†¯ÆH9±Óüq‹³õù†Rù…&=ÃLKÀÔö…±y9J¯µ“åJ*º¶²ë?@Ï£’hqF:Œ[2â;ôƒqðg0oyPѦHÛ¥\Ež ‰n±Àr”)d€ÃÇÇ*^lûYÎ&i +`üÆÈRu­˜¦Ú³92çƜ•e.ҋƒ6lúÚ.3åCx˶˜|ҝ_¥Œó‚ûŽ0BÛíAÍüñÄG]L@f°y©.‚ð=%{ó˜šÝ·PûÜTpWiV®? +Ýü¿T5úñ8]€+Q´ÇL©ÉÕ5ÒÂú3çÅÌUI‚ó9Wõ×F€6²Gµ›M²g^ÇÓ£nïFZ©9­I&Y™2ä + +y+*G1Ôz҃šÐ°*d+zâgpr¸¢áÓ7Û¼¶f•ùÑ +¹/b¼¶ +eÕhNl8P×Wõ•,Ÿñ-Ókr“1C{¬µÅò0ŽŒœÏ&/2î‘ìԕY–Šwþ&?áfOÍÈÁÕÔÁÖϙ–]×y®z¨MâœW’]E¤Ê~»3rzÅCs‘„èN-]ò +ÊQ·BJq‰w6-æ£Þ¼.élaF Ó ½xÕ2S]¤E úÃøáj+Vö'd{«ÑS¢®ZÙ²íÝ +Ôµ"Êòw†\ld³þ4 ú8I&ˆ£Ý¹j"fÁŽÞãEÛ+»—öÆb§zˆ\Ÿ*5QI¡ z“ó.Läåni’Míkš7±ò™?Ñ(©Ã8`4˜I•SÌí–L@®¢ä÷íU–ʈ•Ú ‡‡S‰±¨•Ñ­¨Òq·¨Ñ¨4&›²'‹büLVíða©Ñ›2Í*äìùá=‰)w³¦ÑƒœˆœF“§L•[lW_ R<;Ì&™x!l*ŒÑñÁEQÄÜdÉ5ŒüX².£C¤•Ó@î öwhA;|H2Ï)TY³Ð³œt?2€•ï Ðø¤t͓“`j»隹áÙ1Á«:ƒ©!VÚGK!F{‰Ϟ›ñÄvƒgèqƒo\cœ¬C$,Oý ÃjèvsR”ìÈC Û> lŒJ?d1uqÑƃþ»Œ[ê†Eh›³åš¶]äö !hÿµ¤ÎN/­£c!æ哏Ln´*¥“ÉKƒïœÄ£û-Ô:##O¡ñ ²¼ä£Ö”K·ÜFø}ñãÊ»š a`2n"e…¸Æ{ɇC9ê%¬4S^Jq(½äç•3ý¬ÆÊDbh2>0+Ç"ˆ4h:غäÔ-Wkpº™pÄ.F=fÉZ>¡ºDØLoÝ%u> nÔÍ]òçqÔîC $‡zIÜ]ϡ᜗Ü[{5u¾—(Wéd:ؼÄoIÏK²ÈŠ›«Ê鍹± |ºR{—è|ZE^¢"I4jl&/\I–L õ:ª™}vð.ê˜{ɇüaŽ' -K ÿ]ûÿBo˜õèÓzžßü^ҒïIÔò°O^²l–»p8Æ#Ù¼¤HgpÕ¾„X]v/Q.ÆÌOë%î$ˆñð’½&ß/]‰b±Ù±…‰xÇÊâçÃĸ17&¼ì¿1 Ÿ[ºn|ҟä+¸ER«&(ÉÝTÃÐ3v†“äiwÒ<ÖíˆóöuGk‡½Y3w÷ŠÐdpÀ|ð(“]#™È‡™¬Š#ª?o˜RrÄ$Ÿ ÖU©Ú¢†iӒ«)O·’!êÂx²~8Ø>4›¨qûpdŽ3fï‚ñ{g_†[ 1}V  Ä\àÑð,ÓäɘR9að¯óáWä¬QéÐt»P!à—xÍC ;Á„D2T² GFª·¿%aà «ù#Á8æaÂ6n¿¤7“9eH¬5U•´B²íB1(`¬„/Æ¶V Ùöå&ÊG"ÅPŸr6Z×xë%JO)I3GäÇ<Éòæ{^_ ªš¾áéLzäі&q! YÄÈ/Ì_4éç ¡¶ÉÿhÕ2¸ÉMU}uœKænPôˈ‘saPuaŒ³Ö™L_¦‚÷QZàXHG-y«o¶´æ4¢Y°õ¯ÕÈî#šÿ[õˆÐÏÄíñOáMâøcºðõ> 3|Åß>'«*¡ˆÊ-…NÚrZ­€„ÓuX2ùê!/îM‘¬|x§ñ¹¾m8Å>eJoYü—ÓªÊð9ÀX 2xÐÖÉÎã8ù Þ«s0Ñiüe36ö<4ô<„? X©ŒZŠ¡àM?IFТ"ÝlÆ*¥û8ϩĕЩï¸X´jE÷“Ä- >iS­ÃyMEye–„F涧SrÕø¡­)’/“-݄¸³ Àˆ°ÆÁ±כ‰ =;jC²bŠíñ»|Ár¨YšÌ‘Mž(ÂDúMk¨}i-ãît„‘ƒB©)†Œ.££w{Îʔlã:¹ÕSØA´Ì­ë/iç÷x˜›¨›]ø¬‡ +†Ü¹÷1•H­³fä*%>r‚Îõܨ¿d°Öh…ŒNV-ÃL‘äï®Og]‘V”ÈN¬zyv@ômv_ßÍDt„ý²ÐAÁߨ6¼°XN*¦èâ÷òAMÌê|XbŠÄì槁ÄiÕZíiæÔ8ª'yƒ`³é}KÌÀÁJkšà:Þ¨ÌjIX¼íÓX– C$ ØÖAx.9 +*Ê5îk@¼o¤Ì}H4=b‘cBd³Ò÷›ˆ–îÙPélq©Æ0K7Þl ¡¾m.õF˜|Ö¥› 4eI÷ÌÈkjÄ:B²e[Û>ç^Å`‰½ÐÊc¤)p¶|œß;»¼/Nÿo9šQ2*›7q–‹æ­˜È嬘è qã@(9)Ü°°÷w4ÒÔ$£ìA=·öŠ‰hYýœfÎuÝÖÂR2Ï@Y 6¦/ö‚¸HXŠUŠCµ—$û=]ëgµh¡f­µ*ôä˜ú´…@ßhúÝ%K†ýâPÂsJp³y³¡/ý¿¦ ·šAûu*>;]¼^ã ɦƒ‚›. vú“±i CÕl_­\ðˆS’–)xx«¤¨HÁÙk”$kgWµöeÓ׆Uxúש¬O#PÞ)õH ºí»"‰dnh }8?wÃ1²aô뜿h·ua÷êÊb'\j»›$CÉóBÉÁRašôKô FÛõ\(åKÑG§ D“'Q1øùÈ ÿ;š1CàsÝ·@[Kä@®]mBaët»àʐóVŸäÐçEo㖍 Ãô²+‡ âèrêØ]mpœcï,”ÿ„F±63!R@žf%Þb쩬÷£ñ\å]Iœ]{|Þu ÑÌu!íZæký\Ì/‡»/àh"ç­±»,Ñ÷žÒ)Œ“C¶[[gØÏÜOœ ÍêyÒ¶T¢#·rú»Iklí Â(íœç¸³ÞD…¢1ûL}ôWÃïÏØZ9Ý3ªÍZdÞ ýÌÐG³×ÕEÿŠf[*CŸë¥1ÑÍùw«¨;؝4.È4Õ,€6}‡› öV/ŠiÖ×¥²¾ªû&P’5©tQ]ÉìY¯ýöÒÂDk5/´c•gxљìsW`´>³üìO󔳅Äù M<‘M„b‰Jˆ‹x;Œûnóš­ÛÖÑôuÅ cÔ õç4…Iî/<½C­ÐJGÁœñùÝÉEr×Oôý‰0”µ°®/›À_·¯À[x¾wˆc@w§¢RQàåä‹bMÀAý•þ‰|#c÷¢%ÆyIR`Èéi¬Ggk¦PÚÆ3éÆéP£J˜ÅÌÁY+}q\/÷)Aô†8„:êƒjTœ€²¿€ó¸+¡—"quÿ%jÊ«úŸ/bøÍzhóû(•;rrÄîÈÂiºÐw ƒ*ÞN±".Õ¬K¸Ie6`Ѻ™vyI~1+ìZ×oj”R¹TÙ,u64Lþ†» Òzqý´Åa>½»Ê0ßÄÄÃr,«aÜ0¼É›è6"òǾ,ázä,ç”͸¢q÷y¸r5ÜÖ¸5Š°r r7Q&™æÜÌh³` ^p鵜\”'¤U­&Ÿ‚6'I¢q`†ýïDc×oE!å¡ä¤å)éA¤FïÈÜÜj˜z^tƒ„©´UÍ¢Ê-mꅬ΅H°[ñ‡ÃŔÙg'è–|è +<Þ+*Óò­,rh;WNJA&)ù/ 4’cB¸ 9÷M ?ªzqçüÜ PÌ)¡wº¼Þ_o÷uh;}·ÄLÈ\cb +PŠ¢ç·`p³ Ó£#IIãhN×íJ‡á‚ZŽ8·nË®–7ir¤Ñ.uî‡'+X‡úø‚ÜC96h…ÿžÒWÀ‘’Ò"Aï²6G&©cQ£g£³fÙ ¿‹ì|OsUZ9@Üè35Wb^®ÀÜHKVì5ÖÌP+’Êá¶æ"ß +Ð<™²”;¿É®5UtÜä³Ãñ$Ñ+`Ž·ƒƒ ý(Ù(Í­ŸÑGà äΙG#ìœîò xh/°›'cÊ6$œéâ•™È:ÏnÀ·gñ0GEs×סöû.–§´Q”9tåèЫ&6œî¿|i¤éñ);ÛM†dRøPËìîK0š¬’3ª_R|µµ¥÷W»>÷“zÙøžî2Kïæj/f5zÚ\´‡'‡Eè´îhµ ÅþWBͳ” ‡­šÈS(N“$Šª“é§iWÏôC ÁC ’‹r— +Ê_*PYžMÌð{Ñb÷R®®¶gMÌφōêי<} ìÑþâ-ñ¿ÏH¨káª;]‚*6ñzžþ¶HX…fR iÆuX¤Z¶°R¬ ýÿBMҞjȬªP‡ Yìîÿӌùº½r‡ÿ„ Í:§¨‰KåAÃ\5]ó®¯e۔Ž1JŽGcM/·@шcP®Þ¢{1}EM‘­¸»XF½ ²ŽZÝ[ö ׺6¡¸¸°®ª´Œ“RQä¤_ŽAvzˆ‚z[ÇR6FÁŽè¨„ë sI{Œ½`þã<Ë8CR1ƒÁǔ­×%@—#€H6ñžêû£×Êm¾ª‰‰eÓeuöð“ŠGôÂkÕ¤¸F?oƒ+B ùÿóñ@qM·›Z×l)e!nÂMfç½\'ŠóÕ¬2ÎþÓ½Ô,QYû¨“ ìÌ^‡ÈmÙtê)ò‰Móœ'ÍK#ÐÚÑÍ.†—Ä–B>$Ší†ˆ>æŽÁb:¡¯©B¦’ÇGI {?QñËå@Ϲ §t"3݇ {Èçàc¹af㽌ªÊºÉ1kÁº¾“¿ÀãnK{ eÓ9û7úˆ§ò6cñ]m±åd˓Aа&‹®ŸËj.xèâºñiÃܧfÿÙ§3oæäýý„Ú/ó£[锇ØՒz×cÕŦÚ<\Ó:ӛgi£!Õë÷uÈ¡¶„¬øÚ]úȹ=QlN +Ą,ˆ°]£º•ÍSêÜQTˆ• +¨)dI¨k3ÆVɨ¨ùɌÖÁâ¡ìD!ì×Ç¡zXB¶DØG NÊV6 ·Q«›»¬Á#1±l+Èì¤vDºaÑ£W–¿>(×쫬=­j½›ø’+·±¶Lók û€ŽíÆC­§ˆÂ˜våK³VŒ¡k£¬’"ÖèÔæ—ü×"h—©Ÿùœý>±Î6&¹ë~"—`ÎÝÕ/_ÔįاýË_˜ßÒupǗ°ší•% ˆ¶ÈªPaâ`ˆòàc–õl1“’ +²½oñ(6âãõg1¿c(¢3åXÊÖÅ|7¯}›@–ýQelÿÿU‚!1` âSÖ®½I?ªø$Fó]òüü$ԓ¢g3ûœmñ— O­¥±Wå9ðË6«Ö_^Q +ÑË~țR^¶Hd¸4(”ÈÊzskPœ|lŒ€Ýåíª3u 1YüаËþT¿ØuÞ[.JñªŠ[>Î ™™0è¾WŸÚò§ÜA]‚˜°ås»ä6Ê؆ æâcãšꀂ–Ñl{ç,3MAI‘ÄÌò⤿¼í«²ü_­Ö©¼IU¼^FÆ2©„84^~·Ľà â¯õñ©+¯?ß¾qå§<*ÿDæÖVÞ °CC+÷.쬾€ r§Eg“”÷F­ð7è0•¼¢`åҐʿ©ž«Lô³Á*ûמªü]6:e3Œí3•û»x ©¼]Z(**›Žœçí°Aeƒ€²“õÉ­—UWZ]\0§Œ4³‚§žÛԔù¢û¿ƒ•[ù€Ìi)/R‚¥×—Ýd$"NyO _Dû•ñÜ5§Ü+¦ B‹F‰ùȍ‹“ïë_<$sgóÂÕãÔLh{U\_$ùè1Aõú&…Ø`ùp÷KÑHíäÓeÆF'%)¾Q"èõ@3L™m¹æãB '›‹º¤ ^††FSDl–29!+“ /ÀÜz>[JL^Ôô”,e à%—£‚ñûµÈÙ±ä.ƒ/Í +9Ÿ–Œ¨ã õŽñ¬T: ™’S"B*˜›ßÛÜr£™ +èjŠ?ýB²á›d)N!ÐO#dD–Éxä£Õ%]‡|Eþ8ܵ‘]£®¢‘9öfÙ^nÄb2²$CÕ/™‚ãí"÷xÙþñS$AE¦u”敳…¡7yÃuMdŠWi(ù^ù'h^€Ré›ø p(zʚ°ç¨†$d߉(»ö1AÈÀ¥Y´âˆl^—î‹%¹;3 Ew«6¾È&nФicäÿVÂɓq™˜³N4“SÔ0w-¶€ËÇíF 9½ +%Í-‡>f;;Ýã·bÎñ–¨˜=†GáU*n^ê19í]:‡²è¨Î!yºõ*D¨àXÅ㏤›(ïx³²””c¸cê‹Òv»Œ7#é‰øh¨cÆíw—]¿²ß|ðv…gF;Ló\¨ú®z6¡Ts˜õëTq-3p›´v±ÍÍñc\ •cLۘ–ˆq£ñŽL–ûC tãÔ¾¼͘{QÍìÉäYÂ3~‰(†(,þÅ» ̘… €£Ù”þc>Óó c„+ÅfÔQÁ|;ÈÃÅd `2F\ãT“1öZ,±6F€6=Êe(_ÜK“¦zF!¼È +QMœè‚ô¬$‚àÃÚÅw“ _Ö@µØ¬pšjq¸L2Z ׺ kž@áY¬ìOŠÅ–°2NÎVº’+zś!\ܦ”«{h€ì†°âGoyJmbå­X«ø”Éúrz¶»ô`î'üǁt­ Q,Ž<¨ÙrÐï3B1Çó@YìïßêbsÓ5Õ m½†»Z}<´êL\VØ&ýJ™çÿaÏå蒉 ɚÉÉ@&6*LÌ×Dµòâ{*9K<šIÜp9SãuˆR TX‡¸t88#¹Šê…%#ŒOœLp“‡ÖÇEhkLõ¢Ss FlW43x…`RÛ–ð¾Éå °±† ”ˆ©¹à±±œù×¼1pˆªa1ĪG5bZʇ‹5›/Ӄb3¢6ˆ¿WL%ˆµ†br’ýþzÇ<ÙÒbvdì£`³Ù“‡9¥1(An ¶ÝŽûrƒ‡;+ÑÎ!+"ÝáFÐ3v’|ÙaÙÔážëŠ8ԚžÜJsxœ?ÏÖ«oL.rqxq­Çc7ð•%IHpxtÉ ‰Í IP“Cœ6Z©M)@–h}ºr‡}:g‡r­ãÌ0¢ ² Ê0¨4ßÂBp‹ SG„µ…Q`RÇÃtšR]6šÐ®²Q‰Â—–Ò“¢§R¶ý†I—¾òm`xXÿXéÌúŒ kì;k€¼°£¡ôH™,׺©ÇHI"y'œ1Ê|K=i¤i5\X( KcJ2°OºV5aù×Áþiaª¦G®ft6-<ēŠ¼Gô¡’O'%ÓýÆv‚h“Ï…{&UdÐ]O¸M ˆˆn‡`p›&­a$éÙö-ñ2C†GxèY¢„÷.ƒA™†’0{ÿ?\ð«e3 Ü+Òbþ6¡Ž©/À9õ²‡bÚÞ7˜žÉΌÍ +¢Då…ßù`Ž½™0¹ÄŸD=ØùUN&e¾@C[Ãy—G|+@ 7m]ö‚Ìꜚ̉ýN{Š & õ‘+'‡[ 6íϵñx²©aÎ ¶æÏofìúg¥°·2›’ ÞGÍ$‹ÁþŸËØÞ^»PP8-+y0‡#¸€k”Ó8£'x‹‹2Áԋ÷ŠÉ A͜ï %0Þ ÄÎéUIˆ{Ùg>‰Bp{ÍZ"žTG¹R‘žypŽ+ëh,ØlŒÉéWzð ,ðÏtPˆº—ÁÆɅa¦Þó•1û?EOM¬ÿ¹,,¨ŒéNñù!9ààOAáà÷kBýS.¹Ábw_‹âŠûºsâÞè½½z0Vjä¢ë;(zõ<´žèpšÝ ³œ‡,é=_‚4+‡ bv…sä|Ùí† Yú “æknÖ°qõL—‰àML óu7½)äáê[ãWUcì±v6:§|{þŠYç±-5úÊV“}öØq-©âË(çIQÄRZ„ñeóx‹ ,6‹9€ðÝViO{&v²!_‚P¦55iô›~¸Y£Xzï:ÆÚH<|OcXá½£dÁo+5›–n/½¸U©ãB=‡D1ÛÄ°@×ÿŠF‘½‡š‘u¸[ìLŠ½_…‘O¯² É +##‘1˜>Ç(¯—\÷ø¥ ¬¹^¹^d†±ЇÐz÷?>t›/3ëFxZ½ìÉæÈà{EKŠe–À¨0~½ÖiŽD/ØÈÍSè%§¾'¢ûÀèÅØTÏþm7°$Ž!$’+¢Ý.ÜÖuð†F;8‹f8¯AÓ¼ÞXc¶ÿÏÀì]pš&.Töc•Ü2Ì;N€¡©t¨âÚÎ 9 N ÷´±Üwb%(Õðx%Fþ€ïèŒãµ,Ì¥›Wã}~ ,Ö2ð'9Œ×6ógû×i¼:tx%šör[F°åW†÷¡D Ã!‹ÑÇE§ew³… ݀nìÕ¸¢ïl/æ¼ÈŒ…Ç÷.¬L €(!‚ÓHÝ©Mnø]*Ž©Ôwmnëø Ñæ\ +¤/Mᨻp!!ØGÌݍYLÆ*/v7yHî®ÃÚ¢ÐI³Îéö.Ÿ@¦âÔ…IÂw%daƒºUCw¡ªù“Ún#æIW ”,• ¨uKÌ*®£HDÖÕñÑPÑtáK»ôï­&i÷ÓÌ1zk„Ý»5Åíý¼¬\\U ìÎ:S&LØ$Hün|U +Qæ)¥´­ñ%œÆ}bTEëÒG³¥ ú}á$õL°nG%…GO2wvuíeiëóèâŽüޘŒª;y/`l;woÝ(Çb&PŠµ•¤PÝéd*1·©k.Eù{¦nlÓ×¢€Õ¼X?õ)”#ú‹š¦¹.óH£Ÿ¤kô—k`;΍.‰ÿŸ&” °æž©ÎèîÙ¶‰ÙóAûȈ®ãY·<0£&Ùv+jè¾£ ¡Ë:g~!\ÙIßÎû¬è°VÖÚæm¡÷«GK[ ‡%†Ø$ EZ$¿Ëäæî×iOlnW¤:é©A‡Žc }¶^6cQÊÈk¬ÿ¸«l¸æåVhl7=\ÒÌՇñúÑٍÅ\6Ó¤À;ÁJ/÷ËîÜ( —»VUþXr,šÊeH1Âí*‰åbýÓ0Ø~ç›Î¦ruæҕŽ"¿îÝ +å.*´2ò®$4Þ4+´òÿÌ1’`r·²± A¤Ì¦YØÛ爳7ÍArµUîD‚Ú- ÄfÖ;Òq‘Û\'ðÛó ‘rœä’îR2Lˆ‘¥ÂuËð­oíÿ¨Ä ’^WIiÜq6Š–OU´ì=B¿´(ôábRÂ>7’êz\ Hû â =;H‚‡KŠ»¥‹žÅá.M4j¸†Æ’n$<~WEÁבö²ýnצô‰MçGúåÒÓúB·øÄãÜÍBlÊÑ'pýç‰tÖH%ŒÅÅî]Åfv9”Jˆ£¤jÆä6ÑçÀ¦}öúK¸Rüó½9/–éºËõy­à9øÄWÐf®Ìv¤JlԜij…éV?™£–kSÂÉ(äšK ›kGG´Õ|·[HÎñÍ 5ˎç|™¸Ìïøt((Ú#ì9¯%âŠpàÒ1î´;„Ÿ.œfâß¼›n’¡S¡Û ­¯ÃU˜*™ÀOÁI’ReéO¸Œ—ÎÕA3ê\ôWçè&f˜ë)!ªŒ Øæ×Âfû23i‡Ë’7pù¹FâÕQÍÚÖ]p€"\ô#XÈoŠK*dËËIƒÂ¬ÇªVytÐR¤%XußÖûݚÆC0JCÉdaдó½AGÒû0ƒ±ÒC*Ù®´øDD'ÙId`Õ%íðàB—!z͛MÎmŒ#5!£°>ɵÌÜÑ¢öÚäà$v½^TD!׌€WaÎ5鑃©k¥€âü£8È$d؜¿ ­^úü0w¼Í¬ûâ_æ䆉};WÎ+aó1e D„Ùge¦ÚÁL€¹Ë™“]³.È¢HJw=ïÏ3é fySuÀÐB†ƒ<ñ¾° (âü$| ¹¤ž¾ãò æm¿¬ Z÷X¦b•{"¥3†\¢ªû4dz蔆¾ÖªT^!i%$25Ѥ)²µ!øº{@PÌ‚«„9´0ºÿä?•=fçTpՕH¶oˆÿPôô$õ(ç@ž2¦š€Fb1ÄåIBÚp4;eçOƒ¨g–Ré»þ¢4M®¾SûÂ-À=SȞ›sÿoCó%`5 Éփ„O¤¤r¸ßd|M…1Ù·¿ãpV|Ù(mô5}˜*è/ÑÌû¥~çᐂæ‡DÜ6Ûô +”(.ŒæÿO4\X[ìæ°ÍRÁ$àgšvÌOA@©prç ®.Jƙ¼6·ÓŸ‡D~'õëbl¬v¦0^LŽvnM6֏•oŠr†ƒEO­ T„”™Çé ø¼Ö™RFsêENHÿ4ZlKtȸ´ZOªgJ aŽ-œ"pP Eàa%)Ã;T ð!;â'ÅfRmŠŽ2ò¡©K²¶m„@V<%§Ð k~â3ã<ã ·Ðó%…c5ŒjÑVGHýs]|µL¬ìˆÒcÁ+ŸaãŽv‹¬>c£Ym«âž§ø v»Aˆ²7«DåhŽÖ²Qχ46¤#ª±QÅAF6 ¸hâ.ƒb…ô¡)¥sRƒfRGž¯¶$º€t,‰ÎÕGåN¹±°üŽ +Ê7<_Ë7y¾^×õ5Ĕ8W/Â9U¦HO);GK vÚÿüZP^àÉu²X¹Élˆڔ# ’"/iÊvˆŸÍgĝaÑaI ái1R%ZYœÉH¨”êŠ -å„zôÔxŒ­”ÆN$÷_@“A×RŠ •Bx觚ýpñ­³K=ûòs„]ŽDň p RápòY‚ÄŸ‰–¥Ë”RJR’CÂðý¡/=u n  "J5:|§! +‰k¨b/e핊‰.3VI•Azr%d¥‹Ÿo³ïí$GÙA §ÉAõ@D ÄðŒ<zÿˆö–ªÐcB+sr§jtÉ$¸Ñ¡ ªO,„ÆuÉñL6ÓÂk™^Ûöè”÷(¡/HI¹áÐYʵv+±ˆ§df1\ ‘ºcіB±fy‰΃«™šOü:5øó¢pZØXYb iúàM Ï=Xê3l-"u7fʯ«ŽˆwÕ؏R¨ˆÒ’?µÔhDf¤²N𵈍i5}«È_ß5A!v™µ”P7㈵X¬PúÂG\‰Q-Õðyc½T Šeڊæþ©­Ê;y0„Œâ¬×FÕ؍Lʗ*Z™Hä—XÓPÕ§"QßO7eeá"fd¨v¨=!±Ñ +ER@&Çê{Íð ÛhliÂTæ¡…l_ T)º”ÄDœX"Ò¨ñ'hGé-ô Ê:J…PÅ0.­ÇÐ.!4~ ÔlS4‹¢TP+ŸŠën8‹2ɸü’Ijü {hU¿ƒWÕ©„žH Itú×B'u‡H¾øÃÝI¦4SÓÂ'F–—k®‘ƒY¹aŸ{ £"Uˆ˜\´øÕD…O&çÜLJXOPÕü¶–UR@Ƽ‰ %&ãµFa-–K¶KƒÙË´Jóy² Y¤t¦—$äu›ê¤ ¡ «‰Çð75íW™Œ§ÍÊ©h„Ì;ÁBRő”.É·Ç©VXŠÂ)¤5bEԃ‰(†FWI +Š¥ëtŠ") ¿&hHj“°Ih>AæçA"dŠF™¤Ã""¶hͨ#¯„”T5´4¡û åѱè†R¾–ôª¦Tjë‘7RŒ O44êĂŒ‚ò½áVMî +äò=!–fÔ;´‡wÆOi‹É-™Tp×ÐÃAnƒ«‰ÒMD©É%½…x‰m£(Q S‘‚Rg"äQE' ÄKSÕ¤`(¥™7kLÈØ2ÁcRFï(õ’Ÿ˜(s"ëônßò ‘²R®¯A®mšÞøê¡m’lÐÔ¬\¢q©•¡Ü™Î6ÔjD#lx¯‘Msx§¦Z\x͇H̪L“PÔ _GŠIAÝ£uÑ#*Œ´,ˆ¤€ Cý¬ãYï!áyO˜¨yŒ¦UQ¹UVâ÷#Š¸:¥CDfj£Wƒáê”)QáØÿ(¯PHW$ÁøL,ödˆˆ‚Ì_ UPQ‘½_•paø1¬ˆ0TæE›ÌANjá2Ž –…Yº¢Pƒ¶@£@6{Pá·M,ˆê˜K‘Kæ¹åRX‚]¬R×ļÍüUãÚ­¡ÔXvb.¢Ý•6õ* kØð~˺ñÆ÷°4¡þ£ÄxTÔ +ÙØ¢Ó0±™Op\8Š¨Qé|JUKҖñ¥¶‚,ˆj¥äšf=·(ÕÜl„ƽ¡á˜»?yÁq‘ÏÓƉ­íà‰éÒÆBê—8U¦"§UTsQvÆ|z¡Ati¡u7¢Á0*H §b#§ ëvc¦ÎO„ŠÕf2 tÈ6¥µ†¢2S‡f¤èÃ0uf6}³ø¸ÖO¾E"Yltú”îÖZ•"{LK_ÕH +Ã΃Š0+Ú>3d¾X¦—…¯‘¿02™G&ØâiïH½33%²I,(X2švæ&¾tD*ÂBôf¨ê +)‹ÔDF§Ì55ûP¥¢ˆŠrS)­á˜»úuŏGRä̈́¦ ”ÉHZßþâ¹£(¤Èho ×­5Œ@‰²"ó ¡çT®xˆ¶ S6†ÊøëL š’uV°J,;Ón?d)Ëì¦òü~#D£eJR`D҇'ÆTm•ã3w™©˜»µDIཱིsGU#³Y(&“Jd$Ud;4F¤’¥ÃИO +•‘З%TçHiNB Ç<´Ê½¨ÔzóÕúǂ6 +Ž±Š¦§ ¹²s¦cłF´s¯„l¹U ñÈ©"ÝHEÐ}18¤h‰êçCúgöÿ‘g*ZÔXm”U'<‹ 5hvÊ^UãðX!dR·eô¿šx©Dd«‘­#óÈÙòлυ-MÕN9¿íAÔ²ðªj:¼éäR»Œ”SE¬p#¢&Õ@ äy 4²-Ê+qŒó˱ä1•í;þñIdQ³Kôx\„H']¥tá¼$æå£B¡ÚÈTmIEA~ˆI!éèú8wÙT3Åyõ*šê)V²Ú„õxÈIVží’V˜l¯²Cæ"žL k#œlT²Ñè–XSŸ9C:Y •Ù¤,t%OÛ(JFÇ+ªÇrÅ%¨ÂpÙ¦BjáB›¶‹¨^¶‰ÃšÝ™ªÕŠÄ6K 7„dq CVǤ1 nŽY‚Dzl($ø hX~™"¿BˆÈ¥«4¼‹â´ Í,’Û¥ìò{(¢ÄµÀ¢š"* +*¢)²D˜$ŒN«*ê°ª¨ÿ(°¨º K†1?EI¶ÓG"µdÞ+’²ÂwœÂÕ?R2!Õiý)GÕÖJ…m„EŠ]‚OÔ"²ƒ[R ò‡wÑ&."ÆéÔÖ|EBQŽf'^¨.Ñ£*tJ3.jQ«tÒl„èáEÏætúìUt°M”Èu\ªhA…*"i]‚Â!2âñr‡€Yf9IA7ª"Ú®«.‚¯,6žË¤@üzU£‰½DQW“iCf5šab¥˜ÄO˜¸YØJFu|ÄmëáÉ& +ÑóˆTb±‡ý{§ØGµÄ«þ*k„fôÏ"Âb Zl(({Ld*,$…Æ£ÆhbF[`Œ¢8¾“ÙhAA†eaáNôÊA±Å#ÿ¸Šù„ÆÊÉŲ¡êc+Rxñ&Š¦8¥Å[…˼5¢1¤JT4œír½—(©S‰‰ é:d֌®&—ãŽÔÂklFÔNÃ%­nU#aºãÿá÷!Q+²óŠM6¢ÏØÝDZÓI¼Sëfã~L§ôï؃JÔ¢‘i©¶7‚|„T…ÏJŒéŠ;â­ª)qjîxb>+¤hD«mªéœE›0·ª¨¼¾!U»ÌÔý+jdjAUzF‰Ç šÉYÖC§ÃÉïëOØ#K}&Ħä¦ó5´Ç‚ãPD¯2732BÄC×3B4¡ÍdOó 9˜¹ÄˆÙ}Qe½J²ªjQ#ŸQ…Q‰ªZDŠÑeABf1“×ôz6zD&Ul!›Ç‚¶líÄLî˜ N›&ÅMÞ¶å5â!¤%SAáGAԒjh +mDèPì4-‰ÚŒõ +VW’¼($û‰­iX~¾á„OF§¥¬Qjÿû’cC¢¢ +¶"Ø°üՓñP׫Ÿ/¨Lq +t‘F¢RüOŠ”ÙJòL5H·*±XR¹y"PO²#'¨B¤‰®óWȍE׆°¨t¯b|ÊˎzÄ%LiÊtp55ò’ «,ªàIŨDEæj1}ð(Èa­•ƒ7q H‰Ê5%¢¦H÷pj„Á“™‡üœ ÝJ‚BÞp¤Ye’õÿñZãUËmq°£ã,ÁuP„ZÉD|^ï-¡&ÃØHÔXšc¢UrjAߓ8ÑjE´U'ô‡ó‰Ï”|‚R54Þô¤DWD%˜æ$SñïA páRzÚG(\‰p? *‡³1)š -äy±WøÈ ™ÑUjÿ…ÁB÷ºO8 ÷H¼¾²(h6‚Ϫ‰ö„TÕ Eü¢L¹‹T¢xjQ/¯Pð$GòŒÄÒ]V.wŠ5¨–Ê,UeÐa¸z£cŠ¦¡ségx“©}¥H$îGõ¯ÀZ¨‹s2ÿvBGÍðŠ ˾Ÿ¡Ú­Q~XÅõ ñÄÐ-…Û´‰‰Eê M…°”ãS¿«Hö_Æ  +’8|'ɪ >(͉E,ÎvÉËbs—Pækõ‘šè»å +Ãõ.&©=3$ªH¨_¨úr°^'—Ô£X¡z ȹ1Jȸ%{D„É&$¼\Ûå$ú#_É :`<œÑ"i­èËÙ=eŠ{Ñ«ggHôv†¤ $©O ãA~5ú¼æú#°‚†2²¿[a#ւÐÿ0›æ=&åˆNŽ~WlÄ¥}P`\¯ƒÓ’ëtªšˆWŒ‡¢Dq¾ ',5õ± yFVã ÕB!AÙ§4ïgg4ʼ„åѐ¦|ˋV%9O‡æ¤†\Ô!{\E.ql„ÈÖ¢Ž8NaÁ1ˆïÂRTcÝÐW•(ŠÍoJÉljø¢]©É”:ÿNµÿ© Z*5nq@æsWHFE ¢¶üŒfTEçæ7q*†ZZñ’u­Š­6!)Vœ:†J2Š0JÇdáL N(×öS±ab{ *3 õr>íõèÛFÕ؆Jh¦4Ì¿GSSa«u$^<.ª$fE+¤¬ˆ9YL¡MŒt• ¥ìÎe2º³Wœ.›ÅI-UñuEb橵ªBVèJ—ªÚŒ+ÂA"ŠLµ¸pèNDtDÚEÿ”Šd‰iÅÄb|•¤Î™ãÔÑV쁨³–r¨¶¢ÈªäÌÔª’/"U’)°™&‚}_³˜Þ1Ë[/Ê +41Ñp¼u<1 U©š*\*nrÁŽ‰%òz+~R,AU%?hLêk¢ÔløWWÌÈ$w§”G±ÉDSn¥Že¤CÕÿEùW/£G4ìՌÌW…x´Ó|b,‹Q 7Њ.õrÂ{±”,BƧ …G™ˆdº +ETtšaçö•°ü…dŸB¬I¡ÐØ5q-‡ˆà=«f+nHúb]ÑBnjVnڐoRÐÛ7Eݱh ï“ñh8óÎÕ?ôµ„Š¶pE˜-òÚö9n¡\&a1Arñ F*]LQï䨏.6×¼ªB­ª&ê‘οJ+[œÌ•Þ³Ô"j^j¨Uì˜ùB­ҝ0Ô¾©!HCK\üQBpBR1¦æIF‰Ð‹Z}û½’^S5WX"ØaWAw(É(ŽC¤á8­ \m„R,_‹Fkê!£„Š¯‹6dF býџJŠN”*¢‰H.Bl.d‰Ìì!§Xy•RDõ1(ìÉþ´­•Ô+nŠòãÆÃiF¢"ø‡…-œF9ØÎìBROåEaÎà,â 'aðoIú®(h&fE#¥ 6ªÿhÄzÕ²l±9b×j ÃEúM—¢yEÆyImü¢I i ?­ Æåå>Â+©ˆ¡2+ëpÕòŸÑpæÅWFc`rWR"µ@úQz(=UR†PdÁ6ßjቤ`z5)G]…é(…§íÁDï0½ ±r÷Õ*D6|D58¶ ç÷`Ɂž11Ê#hQÅׁ9Cn…¢à ÕÈCaŠ§\!¦¦ÎðŠ¹üj-5DÑLÆÕ.A+ĈÚÖiêEý3±‹g†6ò)ïéÔ1SrtÌy+**´>H#½ÈƒB,Æs± Ó6£ç‚<Â5©=ԌÃAZê$ Ŋ ÉK#E^ϒޭ©=¼ ·b"–Š¯"iA}”ã… "G¦B4è&W0gås‚¤‘žärªW(’FÑYàs8Bì Á +þ{ԜµY*fF&j†.r,ŠE¤î2a‡Ø73bv¨>}Î-LêY©Äq€«EO² +óӒER5Q²ê>³üc +¡'L#Ce…RÌÆ# lªóÿ´Ö!¡C¬Å¯Q5±X±í®+#†žëÑTªpª—|KW¬_§ +' [ÂË,‘a‘ÂGG,äŒ ±*݌fĉqâ‰ÄY“„IL®á&-™+â "<¦õä¨Å£¸ÿÂ9b®ÇA%‹šò˜1ԕ—²N¬k%45'¢rH¨’f‚Š%U‡S˜„ÃÞED>íÔk^*"ëHëè"‘°’׬>Ï£L–¡@ˈ¸¶ $ÑÄßÚë%wꌈ¥`.sq`«–pàgÌX‚BìŠ +!$®žÊUZ”µÄv=ä×j!žWéuØZzÌ.©*ÍØ"Ce51"šh 1Ë']†ü))ˆ}VE^1Ȑ§ó™MK*Äæ²as ý"^m B¿LІc2Wä_RِÐI«S…$=‰w ©³ÁäÌÅt0Šä˜ˆ…²UÙóââñk㕬҂ìøý)’˜EÂR’¶X%¯7Š% -ö0¸a#Ìw5ÊçÅð,À©“#QÎí™è]wØ̙Ò±zM¿Í’cïÑae¥B‚YHÃJ1B÷mêÁ å¥ŒMC.OQ?)“¿qFIÂ+ÚC"—oêÎæ¨([¼‹F<(‹’‰–k`„]·‡èú7"gEP É¢li§$’ѧs½…½µÇ„}›»zhîüã@§Mr¨üî b´ ©Jä2¡˜8BO;Õ\YY›EØÇbRJ„u44dbÔø¾³ö‰‡0†Šœšú`M\tã/š®]D¬d֓yY…'X5G>m1n¢ÄG†ä-’ +®‡¶îðjTÔCNK‰ŒD±†T9i^–¡þ•H™&S›ˆ'V9~áLèe!ûDþåþYóÔÚF#$ÍLHˆ„.S[c­SdBgâmXHZ{ºIÍÈ<åM„ÃÉî#z– ÿN#Ž6ˆ•ÔøUÌ ºf§”=›x…~pÞ3ã5XZ.u0~aÝûü:¡ IQÌ:‰ÄQ(öÓ¡­n±•šq­Ã¥¡ +j[%ùp„Æw¤’Ã|/šÐDBÛ÷coqˈ +•aJ%,³q¨È&‰çÕ,a¬‹ +äQdµøxß}OÍÔ6¾'Ѕ^އ!Rryï"NÃnš9Åw¡ "ʆ” ÍTSóÎüCT[>Äw;¥ŽTt5¾ˆHj_ìsaøQa|°6"pãÅÅñùÍ2L9Õ>¨Åi~hùsF3h¥ZfUÉÁV‰æ Ó#íò2 G¥P^Q•Kˆ|Èϐ4Œkr½‡ñøÆ#ñ¨ ä®c§„yžì-±È‰<–¢ÙéŽ@–‡]²-£ +óM4“¶“¨ˆ\õ<ç îœ •?…qÕT«RPL:šª(Mè)݆[‡è#„%æ?•Rg<T JÍý +ÑZQŽf!†‹$Dc>Z ½+jz`IB©Óxˆ¤–xýÉÇ4‰ÜДL£®ˆ  WÚ‹¯=ÿ´È4e³J„Þb7Á•d2™‰&f`À`#]b¸ܲ³ˆVí8^ÁæÂ#áŽi¼‰”Š!ËÀÚŽ«ÄXYžrfÆÑdÝS?ó*©jC¦(X[F찂3­k9¹‰BœÑº¨:#ôv.„«Î•êhÔBԙ!jì0?À¨‡8 LF”0DÂéÒÉh†H蒅èC>Xô¼ì6MyEKħìP”hêÖ(•„ª«„œ +Ñ$̇eUqª{F7•aNWH§Æù<ÿgR/{¨BôÆSœ-±3SM,DÊ#Žz©I•\āhò/©ì2Š+dŠ2Fp N«U³ C±CsN‡¬—u5ÌlZæèè"5TD©ûB ñL=D®U5m8Œ¸Ø)Z—e\¦Q%¶4CAÔG ü© $‰ò?‘Y­(a…èÌ$Ô{*á’ÔA$¤P*‡[H— ‰ÒÿƒêeFÍY|Hè¢èÕÌn0$zê„l<‹ …‰›ÀOˆÎÄӍï;l(¿%sAJÖØ=4Ñ…Q ¦¤R +r©>££Äø‡.#K¡ U‡Ë&d_"qqՖdŠZ½ÃÉõkj.+ª6B\Ð&Ä@î\^[óWUð'ÕžSeD,ô0AG¬—¢Çl(Ò<°gõ©uº7 $ˆþ3ø²Ji‚Šä¦¶j„V…Œ…)†ˆ +©?4ª,V4¦ÜmVG҇Hö  oÿ1ÉÄÀ*MçÞIV]•\Õ@E›S.¥½¦9öêy!©¯,B†—±ãÑñXÔûd³˜u§Õ¢›puåŸ +ӜJQ´ž<¬ˆLúªo¬g¢ÂF \¥ÄzÑ –$•`à06"A$# +"/!¼òUŠ Ýz±Bµ†.óIŪÜk2{wáeN¬ˆª…®;iR,¶³sËbÖpRM„M)a ‰ê9_1£Æ¶¥Ñ0–¤«±dUÝ\u“f™âÔÆô;>IÞ*_¨Šó«Ïh 9]Š7¤Bߑ…F.yòþOE54%úH¬"þ¢Â­xד¡³¿òOz„«PÉ­NHp6FêŽVÍ«ýl)ü¬¢T8·ÒÜó)MĒ¨ÞD"è-˜Ìë~X¥S—ƒ¥<´ ´ä©Q íO (±Ò0?Í +Ê3¯…! 0 4`PÀ À€ °€BàºÍ&AiÒz±_D!ýª‰©ihdKøZ®îÓÌÄÒ®W£v¼1G1ˆÓ‚VgÅé1ŸÍ©^wkÇ´Õ4&¾·³ø¥LGŠ èbÉEÖi£­ $•ËˆÈOÜŸ5¥´Ÿf†¢’>ÛJX…Ã\šD‰QHˆé–_CõsBÑÚT˜»$.s¦hdœk=f:^B&´v'º‡¥¡zÀÂØ2>Õ†Ss˜,™æ‚–=”“ív×Î}"³IB¡6ÆdAÓ©Ró¼RDŒá”jÅ@¬U-Ÿ™Æ]rDù2‰…ˆú¢ +tÖ¥2­º‰ê2¡Ö„‚¤»<æé +™¹1O< aª„”C!,C,yd‹)a„hdvk׃JÆÄp_îǩDŽ0Ĕˆ”Ò¬.r˖VÃð"žÙdöÎ+„Âa,u‰HüE¢%Ë$f‡OÜÁ„˜"Ü +²òÁ{ø]z‘#µ9Xˆ¨Da•Á å›(B°bo!8¥„ põœtˆGZ¦mª3a£Qñ;×VÑV,D?&vFÒ¨!‘ +Ã÷JÈÔ'H‰¯]pvÜÀkN=±E pFÕ&†Ùi[±±”…ÄEŽºR8•ålét‚ì1º+šÌ…ÅD ¶Q D›^™””XB5¢Z…qpdbMh•Ã8¿*5cŠMRŒ¨aôpBy ,D_ÕË`‘¸I¿¸1ТƸ÷UUR WzêR©LHáà–é'Jȃ)Añ%¶ËÁŒ“ðRì}ðLÁÝàS?âzPgS…x9Dȋä^¼È„/ ­á¬z™ºp =§â%b(uò 2›¥hU4òXÒÜT4B+ZÔ «"Y„gÉŤÖß*š²«ÆˆTI9ѲcåzL k†.*þ›DêhHE­AŸ|É;ÁD¦‰«v‰û6ɉ(–¤%ÒÄâÅ'"ˆ‹âÞ"zV/ÕD‰ß§\$ÏPç%“Óý>’ +ŠypÐò0ô~@QÄ*¯1² ’‰õ‚U«+Lå, +qHEߥ•âF$RqÆñp)VMïô4ä9+(FLFƇÉÔÚ_¡«:ü¯Ë*YC§–è½ +Œ‘å.[ÅY*¹HDD+ÝJ®i8b_J«`‡æîøªÀˆæ•Œ†Ñ½%¶&½ßª<ò…… QHDCw"I¡£~ªë‹R¯‚<…ÉHé+ÒaëªZaÉÃø“Ì;±¸ÛÓ§RršVó4:q]!þÙ‹P3¢i*jS±‘ã}ìUöªC/iv?1!$§Õ‘y‰† ¬äŠjFHâd=µHLAF«…„b¿ÔQªaÊR©ÌEëLÜdwJšUŽX(¡™Ïð‡â%:šíƒÞàYù(åï5¥†½šp—‰¾”CUO()S‹è¯âŒ‚üh&ÌôbÑ>äK%P\ԉQQ9݅ª&¸„j¨„ +ÓÐ?ª‘0'’ÅHÁ£™WODQC\ÔlB¹"ì.™‘ßívf&¥‰nù”j9‰¥9¥_(§h"y=35ºåúóHDº¬<9ýʘâ|“Ÿ f”U¾`ÞAó­ÌxÆN'z8V(†ÁT›¡¢JI‹LòY´îYéÝüÝd啟‰­ãD Éè™"Âé24´KèËp:Q˜µy#«ZSÐÂé÷^¦p¢JmÂԊW}2¯ˆÝ§.ÊêÖœaôܑ0)»Œd†$ÅEªb>©Š?ö¿šEɧJ2\S$'–‰T 2dÄÆÓ*T¸b…ö¥m/Y¥§‰Ð?RŽ"4ï_!/xÐ1a4)…±š>ÑС[¢ª¦óùU÷¼¨Áy¹"R…æºB±&> +ÖÊÿ+òrE=¿Ð@à Z>X¹¼0Öô¯á²œXe…{mdõ +aiFѶȖ¨@%72>ô´‚ïjÜÏ +%UiŸ +ŸgÈ]ž)R$Jt›KA½:>±¦ãÂQ…)PMøÂéä)¢›Š-ò̏6ñ u*„FÂrœE•yœ1Þ]yñ@Ö_÷Šw5óbîcÏÝûLãÈŠ&$ãiÕõf•^áçnô£}ª:|‰J´‚þç^´îñäW Þ̤¦\M/1Žˆ˜Ñüü EQϪÆ̧¿0zMù@Vˆ¥2}qPTi†‚üIÔoÎþ—‰¡Š!ŒOê¦AŠÚ’ {MDœó {Ñ*þ•„q£~xŠ‘cèäGïO…nKe~GéÃóÏÊO݈PŸdÈñ õe¾ÏúPÿCñ!{Tš’»*ØS4î֘»ô“*G‰¦Â~QÂۃñNˆ±Êì»&²0Ÿ+mD ™^D^@`ƔM"-ßIˆ£¡@¼Î@ъÍcT/¦€€H›êÑüì{^6df*FJâÂoÖ[.t +E/ (F0ˆÓÓK¸ÈD’r¥ú»SvTÕÞ)v†|˜0,‚µsŠïI(b÷LI€AÑßiï +…2AÜ¢ƒ l.EæfÊw/÷÷µ$¹ E[zÙ†.ò¯Ä¿2…§HÊS±y“®¾I¬¾’ Oœ0hºr+ ÒvDÃaÈYAĝVŒt ;ßáÑ#H&È·+–aUëÚ .Mj—'%$2Âż0Ò:ƒ¬¹c|CBª(%ŒšJ¿¢02§sj…<Ï^»¬bøõ­9¾dB_ŸÐO¡¶Dð+z¹Ä|ú¢Õ3ßǏÐd‹À:,´Jy ÿaÇ#þF©×¥í<$]|š>å"U /A{§ÁYŠ•¹g»èYńª^^¨%¦¢œ^â!ïÂ*Ïuˆ¼CJˆjM~*GM¢†ê ÏÐxªÑ‰i‘#ºb4 ô(SþJ•ªÊ‘¯Ý~æÁ Žq–†:ëR”©[W¨ûìÔT g‚úHɳP%ÇÂs;TCXSñ3„KEÞC&'{–¬ÏÄ+&Š›ˆ0&rüUÏU<ÜËcAi•T8.›V‘0¦îP_CaEI‘D¦~oM‚ôꝒƒ¦"U+¼ 8ï#Ü]UpèèL´>5Ó¾’b&›ñC¨aöyÒ"êkB5„”P+µ + +¾Á×(†:®Ê÷Ö¡*µ“$VK«Á +•VÄ(‚ˆQ¡¨Tt´£a‡LÎ8T;ó$PÍÅ]ËDëÎòé  ñš Ç(›$Æ%³äA(„[RS E“Ð*ÕnqÑAç¦G1±×¨äð‰õ±¦g©+’ÃL £A‘\@5z€‹&-! C8 äSh€AÉD)€Õ6B¶`«™—ê%躏ˆz¼$mŸΞÿ¾Œ´ †üjÈß=@UÅÈgÿJ® Míí¶x6Š7ýãY·ÓeoFñä1ˆoÁq¯ºìˆ6?`‘kwÚ¼¥]"ïçÎH ÊP‘lL_g®x%–T¬èmü”«/÷L'ßAk5žsû,õ$¸réÔi; P൷EõÖ6ÅAr˜€RÁÖîys@)°A» +Mãè ín"ùÜfÇ °'ø¦ÙØöÔ¿j 4»û£â¬{z+7ÊqۍfŠ +ˆÓ¹’,²VWÒÀÖÊä8 ‡¾XYä)FB¶ÈœÞ­í¡‡Å`\NžÁÚԅəÈÜ®IõHž’–y¢Vˆ”µ\sÜúIäé–èùŠö-á³Ðšç« ù®pA€C4(±Ò:ABkA<íÿ›Óv.ŽZq 7*,IÍîÿlÀðC*O.ƒ<]G%i噶¶H†£çRf}—V9 ƒâRãVäüóÒ©W@¾uRÃM)>¦ âùªóŠJQYçüH§ú¥Fj»y&[} ad€ìÎÜšòM#ò6Mã¨}ÍȺÂý{I#q5ĺää®xÀO‰Ê«x`Â1®z6kf^îY}§Gá"l{ñ!õçq[R×ÙÛ8 ]†¡)vžGÈ?¡ÐµÛP7è!RˆÛ9‘‰_Æ'IƯPîßRÏN0Éù|VÅf$¿/Ä'3h´Ÿ)¥G›ŠÚzSݘì5]`k±äP뎗9×g`úµù½h0ðï-Á%;ÚQz'šc³”7Û;òÍÆ]ÙMp½â²Û-Vo&ë¦6̵胚l>Y÷£è’ÖbŸg-1øä,]€áùX¦ û±˜â­`  B £²­Ê7V â|Cõ“þÍï^Š+=õs Ã™<Ø·D!“OÆÛB,CÅJø \þŸ‚¢ˆg ËiÜx©ÑÚÃo¥1ûZ²›A^¶„Ë$ÛÇ­Šó†„OAªXŠ%2×OŸ^8‡1Ðp–sÚ`“{˜I´RŽk°FÙßCŠºàÌQµ:Ê\× +O•"["öĤÀãg4µ„FWu +q5<Ük]ÀÃÞ2–ª-€1¤ÕÁ%óŸÇ £ßUʺ»¸åu¾¼ŸæFVÓ¿wd…ý-˜ñOÔÀ™:þڕì àë»â$I«èã¸×œ"ÌØ:¤ºŸ\v’þ‚ÕœMŒIWÆe_ …RǦØx‚ƒ­Su@£Bp±¸F€ؒ—’Ÿ’«läóŠÃg"÷-#8GL•©‘ãâj#!½bú-¶ ³i úèGâք„}‹¨»àr£öžØ븞pédïKQÖ&$„K‰šœcö„Q —sÞ%åQ¢3\´¼õ½(/Q•¸U ž$ä€K©íÏüû\Ú\p°¢š,¸dš'U­a+K‚‹¨ýíUa±>°ƒ­_ÀÅCa¥:HÅéàâ_’hJ¸0Z +Ê@ûé ?Ådë¨ÍÀßR­¨N0 Kè|K ŠâÑâo™ÎpŠw¦þû[èõ«Í.æ‘õoÁ9aúI,ÆÑüÁåÜä¢)¡Bàb" =Í¡"pR—:SO„…›SÁxʉƒ×.öÍ2%ò{þ¤\¸[ÛÒµ%àòîp^1ü, Ì}p!i[Ñýÿà’9Ż̗'pI£ƒÁ-˜­uº×±__fÜÐBP#«5ÖV‘­AÉÿ›V#ø BRLk–$ÙKD{™"<wΠ^°"QDã–P jkON¼1±`EÅ8ˆW$Fr}ÎVR¼d´Nƒ·4…™}8H…X´iÌA4-=˜LVm"ƒµ­JŠn +¨Æ¼y‡,ó¨ÙHւçm£‚Š…çý±DƒIλ]Hlr\å'ÂþØ¢Z0‰ÉtI¤ƒ.}ˆxÎx,”û¦± üb5ò’l|©µäÁL(¯;^ÈȒßqp&ú]ªþ\©Ï}æ@ý¦ljJ‰AÀ}¦"8ËãHi€ Ôº ø T#‹¿Ü¯H´Ú +…O0­p  õVˇv0¡6ÚI`Iˆîø–¯#-mÊ·s°G?t.É«$°º¸V€fêvcÜB«áŒfóˆÀ°-FÒۆóøƬͲ_$U¿8|Åøº›mLçsZÕvµ;ÒêHÅߣܶƒ:ö†l{Ø1{*(›Hå֌f P#ü«©[ò;]'‘çÉ0‰ BBY\éÓÑ¡rn¦oc΃øѼ!N$lô²Ð9±ÊRW»†a¡µ}$ôXVÉÓ' ûC”¬m”Ö1£hiÃúG%e¹$9>S(Þ¤”µ“®äÖkvŠ·á[3ì {ðôYÌ0½\¸÷›T •‹ïò€”Kj}35iŽ â;µ±-Çz*„ÁŒë˜ðÞ´B[ÕH5ÝpXŠ FCփ6'iD"ùë ÒñmHA¥À&j¡¹ZÕð÷U+@è¨Ñ[|ÒOCßàn¤‡žÏÖ¾Œâ}T#£ ¹Ì›X¡EÚ´é1Õ^ÓÍôS)6aҒïA¾8ªÙ#\”M²I°xžÈÚy +^+ ‚ð0”tJÎM|Îõ3cr¹)õÀoÔÃwb÷:Âù®C2/`)Ø"â(ß/ªã¼óÄhãPù¬¯_6SÛɨ‹œ¥?ÆBúØÜ"ℰDL¿˜Tzþ£rS]øöï°I9Îzv³¼\q( Ý»1ÚEeQ£¤bûyk¤ˆ08E´N ÊY,ûƒXì –ùÈ?iœÇE2 €Ó(å,òÚÿîiÌpe§—O $¶‰2J¹o˜×zøî¼àý‰, X¯KåâŸ?”j©ûPîdOÙÜ¢¥;ûXa‚™=pj[„f„Ø£•¤£øÜ, }ú™opõfõyç”o³¦Õ!Út=lÚ€ù_ Ž·]J`U(zŒ +we˜@ +±˜†ê¹0éãó*ìÜû9+&T8ˆyÎ«‚¸¤1‡0h›Í5¼³ Þ¬ð`ôӆ©Ø”!Tïçª/ Ñ$ƒËÉx©?huFR›{ £R’5Xn8Ü''Y2Vh½ÍRÀX2Èm:j§¤ð·¿¾@M‘æpå­¶xZâts[Öz¢®ÿÖơħü ðKžæŽWü1ú–À0¿\Õ³é¿ 8egŔò%q†æÉóò¤eÌ^¬;Åïªí7ÔËJz*k2@$ãcoç‡ 1§ w6™ÿÕÖüdmëKÓFÞ6-ÈòÚ°½W6´#3¦I:]Nzut ¾, eSC„ ²p›ïœÂ„1a+<ŠËef–Ûr Ӄ7éJé R*ÃûŒ¢â–kJ, ¬>a£nÂ9¶gZ‰%á¼ù>!78S CùÈF<ÑÕ‚¬£DQ¤…¯8Ž6þï'{Cv9‹ÍTwAcûYj§ß8  b¤„&2qðû8N‘8Í)íâN „áâû® hhY„E|ÒёHu%eՋ•ì¦œº +åLt²©áGÚ@ůT³ëšÝ?ì6‹PŠ¹CR ôþ¢I°~ç×ø2(5Œ‰–êfƒ#³X¹ÒÜAvu‰„Jò´ÄØ u;ldÀåÿ) +ãl-'y|à9ç‹ßÈ´AÀ}%ý{§âÿÞAèLßBÉ¢¾¶ß`¡×Þl¾gՆñßuMú^ ¨c‰Z]'ûyBÑÞ Ÿ|õ:Þ+¥nÎS²Œ–ØÎØ>°£ï¡yǞ¬Ûvø׋rè 9s¿‘ºÒ2ÃÐs”ßýˆà¨kîû`5Ì*-s§8).«~&¢{6E—3žÃåù{¬7«g™¼fL1]Ìq’êýڕþ֑ôàÔi´°2‰—†™Eæ‚å•‹E>p>:w½<èÿ(‰‰i¶]FaZtú®!çÀV +qòKH"Ûý¶fQ ©6S +êµDEeµêXäÖ·f_wžÄî»åmÃ,ÔU aI­¾ÂE‘!‰-n%‡BZڟP u°Øë\ +yé·k 1ÿúöº)9Ë$Ìøôò“†xF㠐áàdZƒØØ¡R@wx­ ½(Ò1ûŒðnÝð#ՎË{´Å‘ŽùqàÂH؉,NÕÞÔ`‡¤{‚zx8Ç?ßMZñ„ÝËOu´ +î¤÷Ò5%,ÈaTö9 ŸhE@f¹ÈË94>ÑBœ°2Y•äÜ!º!uÊ̓© —ÐÎ(RP*ñÞ +IêãÉ2©&„Ú¦xŽj¶†w_jƒK_¡CÊ+óå Ûò±(x|â¨ô ΢º¥£Íaøóbiçñ­‡§ã[;§4Jߖ$V¸Àd¥cŒêz€Hm¼øÂÈÄ%S~% Ü(°mèÍiïªXí‘ãÑûˆír‰¬g„§`½þ,¶­œ ßCÉzÃ{ˆÏ#‡@Ø®´ÎJ¦¿M$¢QÅWgá«¥-@|ûT«–.a½¯T¤nÛvq<ô‚³tíÙÚREE¸Î†P9%~xpº~È+›5WíüÝÕªtlåFdTÏq0ҙœiú©‚ØæXö½soq²{ã¿*»à7>e0ŗxHsa÷ø» ²¨æM–Çž y,z å4Ÿƒ‘cáuATy•à‰±ß©N3…òò×lL€"ŒU•.ûá!Åm!öñÙbޙ¾]µÊ»M¯Z’¾íVlIŠcÁ¤äA%}]—~&A¢˜»bÛ h ö ´^s ?T}]Ÿ‚ڝ@ÀIÍ«Z ® +u÷T-ˆkH¼Ò¬´é‹>u‰:í¶K‚êÒÉ&œwœú²‚&:xS¾Sçx‘tÅéՙ,@’xǯⵯح?è¬ç0³¸¢’>ˆké8#=¹«NU4KJ,ãEP.€rã§}X±ŽóQŠ¾äFâv?¸8)að0´aƒÃǞߊSáL]»¨-}* JlÑÄ<%TÑcŸ;̵D• &àz“pê„ä›z€„ÿÈì²FÎ7c{˶ËqÝ£½ü¢ºW”iU…ȃ'¡ë—ÍE¹,Õ:aš‰o[UŸ.lcw:öÝ4ªŠõœÑý'³°Rڗ Òd)2™$€–®s…ʲ`‹F¸‹T®Ï>ñšŸț0KX†U/¤¡œ•å(¨ÇøýpÙ=Œ°±Øãéíª´‘¨¤Š{ÄL9²Ñøa¶·0Ûe«ðÀ=¾ •½Ù» ÊƀØ(È z¼×Ôy!ï”Ð%©ɼ$5 !ÓK» =´,oä³½¬ÖÔC¨0²{ž”€ §¦—I‚ž:¥d, ðTAe‰llt6-Xð‹»W:CÈPÆ1M œ¹ô)FhQ~)Ç' ·¶” o¾QÉsý +vœ?ŤuåU5‘ˆ\ƒú®¯;R!(|u·r"änÚ9m7Q·! ÚQ,b| O¨Mø}+%Ha@«µ.lqãí2xšùÌxS|Տ +@a‰Y©á+ÁŽ‡‘cV¨!Ü!Ë<¿~x%¶à^ƨh%éz»_cô Sª¼šÔì:W_5å[J-"ôuÎÓ¬q¦†D˜¨Ê¯¨êÚÔÌ2ç߈¾úÉMhl§2Ÿ$•©‘û›“ÀWɨz Gґ”Òb#ŒK¥¤9M7ٜþ¢JºÖ=Qè+N2ê֛kV‘ÒRr0hY:‰S·†’šê};¦éÓ6˜™JI™–8ý–_…Q-I휇Ñã2KÕD ùh²‚Š¤^×Ôn?â1/(VŽ0!ê«4‰qšRAåf2 +½ÜëÅIð*þ­*‘ß·Fï£p.â`´D“ k€>ÿ‚*É6u;‹aÕåŸï)åϳ á&‘ÃҞgYVí +ü¦BÀDªÄ2> ³£ýiî¨cRŸIùeq½öWÉ—$‡½CZU•³æ>e„3Ð;A¤±öC"„€± ¡1Û¾§éØaƒãJeS<’š™ìNlWBoò7tu²$„Åè:‰ý} û„[ºfæ²pV­è ZZVìœ ”ó2þ':Í©„f¡žPq=‹Ô~%£4%†F‘¼lI‹Üñh¶ì‡ãÂzy—àãÈ¢"™”‰’|zD¨"8ŽÀñ¤58™t‚÷±ý–¢î4t²î×öïíd [[åيfùjH8»°©‘(h«£~ZzbêÉ\§üç*5‘ ””’¨ì$u3Ôha5§“^ 22`f$WÎ t°€‘åM7´õB€iƒ„,"š+œÈòѶæ;øÓ-Šº´%µ¤I²hQßIæ>‚¼ébƐdÍ¥VBý!ò0탖Øã—ŔØ`¢ŸÏð#hLßÐO뎎d¶„á*µ_ýŽ+ô—¸nÀoKŸ(ð¡]ÕÝ3SŠ‘è“`öM2Qô˜=$jà•"ßIð:®§a˜W‰ÆÕ«{Ã_çøã­!; E š¯V¼ ðŸ¥íäeÃ1$^>v,îÍ+ãU.£adÁEŠeà(Þ¹‹ÿa†s±,-D·à«ÇOalwa{ƒwÑVñóî´Ü·c?‘›$B®ÿÍÚ4™oP¤SH3“ÑDçæøG =DVŽþ]¿÷ÒÜL{‚Ói@éœ;ž›)«.ÏÿèÔ4Îjãåbï6Æ¥°3Ÿ¯µ!Ôo¹Ð*í&ªDÆKҐÄÍöH;NîÁž¤¶ölž‚_ð?00æ?’·²fU¨îWy‚0¦%Ó|4+c""Zç¡M¨Ûâ24gÔÆr~¢pš‹wAárΩ¸&úÍ1'a¶ôæר[éζТ·ù¶•\Î+,0,‘µ‰µŽtÅ +7³¹Û©3 +Î ä[HøùÙ×÷ô=©@y#ÚRºÇY%ÄX\ãCºBgZ*Óag´\±0W"¶„Lõ±i’öŒ‚t^ù˜ÞîÞp¨“¹Ǐ‘_’íªa-ȁ˜Ç¡f:)QE”#qÍàATÓ@óÜ*ÝÉ#­'—€LÒ>¶•-& /}¢2×ã°õe. Îøn½L³Õºê§<¿iu#Hinü›ûÊåáJƒØ‡X²)ú{¢uÊ¹(½óÕn·Jöýr $›‚bÈ~Ç¢¢Z Ù™Ãú€ü +8ÍåÓ<‹>ي 7aS \MaÜÌ50!ÎϓLóŽˆtL +5{x~è‡q[#X3m3 ŠÌ9ŽÖÖbm€Ø½ Pbòšf8añé©Ö?Y//øýÜÏ}NˆÒE„•Eg¥0ny,,”c  GD!®YíY5ÕÂv²ñÃïÓß.xcN,Úî2þÎàñö—ô,íè%¿–$T“t)_5°ùȒ,¡&B¦„EÌ舡DŽçŽO¦aÎ/ˆëòëTÍrñs‘Ïà•Œ”¿¢¶V^–·4$óܸòçS(D||ó£[©Ø>¨h7· +»¶žy¦¼’ÐÁ±¢êÞs5ØçÚHã‚ÏÉhP>Kšrý¨t!NüYB÷Xôѱùó½ç¡éÉKÊ©doK»?›!‹æk)N¾‘RqKˆ iS/™¤¥Ki«Ð=°^šÂRÞç‰gZ„ÇصO + ý•páÎu±¤¶%+@™EŽ€+Œ‰²àÊÎÌ ¯wk û(TŒñ¾®Kè=â=*òδ5 FÂ(ãÚ )ôì !Ó¨ôÔc{{ŽïHïzé!yžMÀ®x,_¤=_ëÀ ”ÛÉBdŽÐ¹Õ~öÄB:BV읲6›3÷‰bšK{T7[)z'.ҔÒáÞ»Ëü<±S:áà‘1ZæšÒ$¸”F²b.d“Œæ™AóªU³€:ÝÍ"øƜC/”O×Dþ#0ƒ~qP/7žGб \ÒN¯m€Ì‹ +è䔖©òÈ4df1þ=þ®t€(Ž Ž6pk“IÝëá˜b{“53Kâ#dksU†;ªT s ,“Ýl×Çç9ïm‰í.NvWU‡I ˜Sà$ô ÷ Ä_†_ŠeÒODÉäÝçŽIˆÊ‰ÜEÈj ›ËƒEÛLÍài?ÞZfŸ*wãëàflÙª¡"WÂÇAØ!?—ñ”«Êò2sû!iE„s{¤J>èØÚo+óÏ6ò¤E?µ§Ã\‹Å·mДì£ÏQ¨ˆSNNë¶j~ÈC ´rèÝÉÞP¤ø«¡Ó5Ŋ«½Ë1’Y>x ­†—T+7Tß¹ó' ùñ¾ 2ç}êa¨fƒš€©“HŒ¹}©Ô' xøs»âiÔxªSó ¢Y³6îþ`±:¤ û‡´ZØãÄŽæ]9úùüÀ ’ð9D& ¯¼X«3](ûVÝȽõWcdJHVêtgºë.š¹D,†^7T)Œî(‘ é-õ’º~àð|qñ)w5øõ”e :œIôl”Y©3 þf²@Ã¥X ÄӒêG‡µƒÅ%¹yWäz2ˆ$½2áZq_0à…YF½QL(>?Në@/ž2„K¹ìP)çê”ÐŒ>»T:§Ù,=-!>#àãkCoŒRE3·¬äáœæYÈlAì©°²ÒyÈý˜íqÓÒô”²Iï¸øÎìSÐPëîfŒº˜~‚H/„üC 2¿úÍøÃS4ÇÙ^¨ Ô©˜µþÌ!¨ëÝøU&OÎÝõé5™! b xb†@Ïݧ©™Ë-Oübvij®“-m…(£Ï0H.Oß&/O51#`@ïX¥‡¼‰Èä§\Ptw`SךúlƒØ*M؛©.SX9šÆøkéˆÉ8é¼#„ 4£'ò•}*ÅKîÈr¿ä•€Ü$L™ÎF91ÿÉ«Ë%ߎr$¼«~¢¶ï†#uF=Ù3F“›xùízü Hî38š/ÿ.*Y@¨¨âÔ~gk7ƒÿÒLrª‡aDTÚ맂ð°q¨)”Pý:j ‹a׶§ùÞ&î¢)„À_ö`ìÕv#`.Æ7²ksÑÒK}†øË¶Ç®êN +$XuWßѐ•y€ö2Ԑ Ð!¢±@†”GÙÊ´T¦³-=²2}š„Ù)~.lfšÀ÷P}ýµ4iTߎ%öa? +8êò4<ÁMC +zã舲w¹G¨4bcméьÚBä›$4ûÄöà­PðÄyunû“Ÿsü²4Á&}_Öà«!‚A‰‚ø”óê •h‰q@))6^]­^Z%Ïñ Q‹ó± 5 Tø²O€GM›#çŒQ®ÞKUžE<•Ì0•k½@”νx›$=y©Y›t’ëz½,c¨Û+wpøšÌ%mÓ¬&.uúА îÀµ!iΕ£YÌùsã0áÊ_þyA2×­C 8i̟ yç}x@”N/lŽº ]¬Òþ‘Òš¿ÌE%\ƒ¦ËÛ½hÙ:x!"ùl¡;tíúû<üP~ægÙ¢HÂÛÙoã’úM"IÑƈ†XØê9=l/T9f–x-´eÝ©gq¯…ØáÒ22ÓZ—bÛrrù\~ÐÛ¥DXÒ(»ðYvC¤Œ\q­ãÜ¢”ZÁ.ì§\‹ôh~¨ ‘#×"Þµ~ :®¢|ZµEiÕa\«yRfá[í@¬8»vŒ««© )gÒð½!e±C­´teÅÓ[gæt…͉ò­UÅkW_[Ž®–m …¢0OHþ«eÉÚÒ«€®ÖU¨«9{xœH%m $òo’ŒˆtŽ€$9wà„T¢I-˝X«FÄ0mZOÖ°–çâç,šuUa­ß7"°ÀÊÑ]ó9ãc­òR<®ô҄0p`7Nw »:¾ZßÐ#%‹:áúÂQÞ8^Ä ¿9ÒÔ]+ۈ3$çGpôe™úô‚þ6 +²7 “bÐoöqè3(2ì5;G™¨ÑÉ.3Mó8:bjª€tƔßPvÞp0O+kÙØÝ*˜&¸Ùqxª‘·åìô6†…¦Wˆ U҅ì@†yJ¢ÅÜ ÅÅ>k‘+1Î(XQ@.´ endstream endobj 129 0 obj <>stream +Ó1à1FèҔiN&áä„ë~¥vU‘_rC‚„"ȗ5‰ÐåÑà£GOrSí÷ )´¤Ž¼G)º†d›Žl*W=˜ðÜ²ì¨ +@B’ -ºfV+ày —ÒÕ´j}›-’C)×XSË ª ô‹Cz}ÖÔw¶†cCˉì³'l6K GÜ!QÙ;;‡Ò¡„A՛¤ÀoÛ2”ûñ¹%ÈÖÍRɾ)ƒª‹r¾ôŒ ‰;c’Wµ·é†ÊntMŒj‹@̚óþFkg<#iþMɚ‰Ä £ƒ±­Y4²Å÷t”¹éêVm†kV¢…#nødB©>¨ÛŽ ‘=Ù¾x9CäÏÒê'DÉÈæ*R:Tõ­’½ö Ý Ï–ÆYǂD?ԓȠ’7½,jÌÜ6{é>Em|ã ÃÝш¬Å/%ÂhÙ»æ€éÒZª‘æËúW“`ÿo +猫¦)GQøs‰û9daÐ_ppÃh=JyÝéùL„¼VïÌPþ,ç_ùtcK.«_º½žpa& yu¥•À—>0»«T¡1Ž‘BZÑý,&= +àrlÙÞÜ{áÄ®„¢Bú*aRÅ $¼£íم t„©‡¬ýɁ(Ùá‚jϒþ DO uÚKNz]ªo +ZQo?(cXͳj+£jƒsYʵºÑ6{ +Ž=Å+²ÂýÐJœ+ùL“yA—v/ì>ÂÈO´ÕY˜= 9ÊÏç®x£ÀàdzAéiâ™vw…¤{ö†L30eK¦üQu‘ÇHNÜsÈǙ‚†˜!?dÂ%³L›êº59Ñ +XF*2Âw¾yÔ,¡rmÍ¥+ð\M䧀UòšF‡£J•Gk´|±óàÿ0• +ɆÞ¾”Í;ÛgÏÌv;ht¯õ T¦ç3Æ.:­•.òæ¿"ÍÖ e­q–„à2pރCEª-1˜«i¿ƒ/OvÎÊ`Š&¯©™*³Ôº^ §ÀˆúˆrÀ›&‰ûô4Ga툖2Ãr^ëFÈ:Âî»5ï&Ò??Œ ‡ÓC‰€í÷GíԍHڝó[•#¯cý‹Úh0rô ÿ»”8ˆ©µ€Ó ,çáoöj/<Eä]xZ1döØ¡»‘± ˜Í¿îuˆà–¡¯Ñßý­ÀÐîf¢§Ã¬×ÀðÓÃ$ÅOKy¨-܏¤nIöëќ\q©¤¬ª ,ƒ2TÆOHǞ @¡[\CŸUr‹N6C®—+Ù;#:KÃú&úÀ?RnØ{9Jà"»j§&°ºFŽ=™­^ÿ,èfÊÄrÑ'äƒ^Šƒ+bïðŒ‰vâš•aY×r¬àǺ2¢µ©8'íz¸5]éꞄY¼ªXÿžY^ùÜâSž ñVéª'/·Ûm†aþžg|õØJJ~*Gñc[ž© øž¢HRX%„lŽ~^WRDM@ß&rg@¬PÀ Ìõöê@(X}#‚€SR8ÎB• gTw<ÍK¢þ…ø‹¤¢!”D¥©·˜ /ÚCRLSøÛò\ ,ü–7)ÞÉP s²âX\uï*óÕ*X–¡­!8€ÊžPE³œ¤mÍÕЕfä`“ß5<6%1u¦”|¢ÒZÌ ;6¤ÓpÍÐIæ~¥rN¬~ýü$4+3úJR×y]œ‚ÙGâr-Im¨ñgã&J£›E]/ i¯’´#°åηg›yuM¼;k ²tñ°搡"1N¬W’¾öµäóp˜qT›Ä%‰J„áM‹Ø腶ÑE£QTk̹PD¦ÑfdäʬZHe¹GùΤt„ +'SócŠ™¬|¬i¼æIô¡£K5†#z¤%¼æmâ 5f<“R-ê'²î³ŠOk9©Rd“q=ãŠ&Àeڜ;AüÛ,irDkzÔ3-@ŒK€…ì6e^֗Òu"q¹َËþ]þ&f&%„»Õš’8ËÇ5RtCh’¸sôwðÌO +T ý_üĵyöǜˆ[µ+“ˆÌõzD½^L:?cí±±»Ÿ(Åô½”*´hIÅhÕ ËO“{رJPkêËÉÅhµ ´)&}ݏ4'\ @üØëå£U1n:†ïd[Sk¸v“ Þ r*­‚$N aqihΟ–i8™cCvReÅyîÅ8'I$ó‰5ž„Š3'ÉD“Lý*Ig9/Û¦"t!“êGþ^W֖Äñ\!¢:ý€#䛆tº™_Õ&ô&óTN…c‘1ÖMBäω¥ËU½;×þTÛÙzcºw­ºZGÃTfMàÇ:%û” ãLzYàsRtêäçãûMYÕ£ö²S®k§gtÙ`LŒJ¦)ÊU¿`5¤¾¸±##̗!‡¡š #`[=9½óÅL%ÂËÕT)ÆÕñ m:V[ZÐk&¨©Õº„„×òF\–{hj¨ÜHšHÈS+ÓÞ!oÁ1’à1¬â8æd¯”Ž.ä"o‡lÝl{Iª„¢ªâÃmª¬Þ_ÐíÈ$Ž­¥Kit*pô“vžèÄBTDL¦'è¬E +XB¡+¡Œ©) +¤¾9¦Nî,ª~íRÄ)M±|Ï^¶¬yȲÄ5«]²­›?\=@ýÖáQ-Õ5D ÐL:ú¤ö¡ú,7/Ú¢€ ŠàNïAzè\´5¬®#†úO8âIÂßrö¸È)UÄõ.†SÚ~ÂsJã¹ÂÉáÎ +¬FcPå[ìíÎâ4LvŠì¨tõöR¾?DuY¤­ºL”ìXëvFâd'Ô$¾³{ˆB¶ËîÇé_¬|·<½Ñ ¨_Xª˜óÑs…|Nîn‘j¬(ëÌBšèµ>ºK Å÷H™*®‹œ(.ŸüKFè`3zK0ø'ÝíùZc!sSTÍçÓ?Ù£ñZ¨‰ë;Ôè%3•«äTT㫜#º4p¸®>u~úÐtÁ‰Ò³‡ÿ + áQÜëà»Êå’xw#NŽÉÎÂòwý»‡ûì–û›Í>ܕud>ˆ–fQîzdÛåGpÎç6jTO&s mvêÔó"DܨL(û¸o²ç†© {çX™Hõw» +Ë?k„Î@''ðtˆJê2Ōúƒ®ˆLlX*¯$DíJ•ñF¾sa›âËç^pkÒ~„jz´™'÷œÍe +¦/ˆÌóë´jÿ–èâÏ‘°O³ÚÀ‘F€,©‡m2½ëX2ð`Ÿ7Ô \j¸ã‰ª»„ T@y™•êo÷Ø-J4ˆprÞìÓ.QœSéËvn³‚èÀ©áè¥ÔáôLñ¢ÑÐ@znjRÊ£Ó­Âj +€5N¾Y”ó·qOxÈÕ»­·>Î4l!JëÞÿx`ãÐ]Qa*cx1ª;Պáà’ØÊ7¢h7Âq¼“^›CÉn)¾8;ØЗÖËRşÑñ-‘6»|‡(dk±ïëEš@1¶M#VXÇ´NhãE¸–íÔoe ¢–pðOoÐPÏ#üCJ:à5pe 0—ÐØ`d>#âX¯'‹¸âNl©ÚdPÈUf7éyÀ9םÿ”ÂEýç¤ÛàñvÒ{Ñ÷€äÙv‰f Í`úì«,ÀÞųÏJ…ZCÜÉãH–¶FŽ Zèc”%DB'eIHº œÌKۍ[G*'yN…A·æ8X^ y>SöÒÛ@l/fÎìæ:ŒÓQ6gú7©!´Ç³­xp/RÌúP¿å|<*°ú«†ö”Äüš^x(õÝÏQ£T>úÁ…P’|…s‘{/ÚÐT+dED)ÙD[¤Ð¿)¬1û²ûÌAÑ¥dôÈB»l›ªwºaåú¿áb;Ÿ:ᲕnD†a:=óèí×þÙJÀÍk:(kó¥ÛãôHKJj¤>cͱP=¥tëÔð‡M 0#÷ëKÖ }¬z:çª;ü ò èË´•z‰I¤ +±Ü++‹ï18ñ¡”+®—áhëðDœvÈü*0u\ ~€ûzô™X·¤m²2‹ ùºë£F0þ\¯áfÇ._%ɯ0¸[kùsOêx$/{†h=KŸÐŇ?ŽeÓDà¢#-ŒÅÌpÛ¶–­ToâÖíåœæ@%x¿‚õFxâñgr#õÕ¼´Žã|­ü„#];OŠþþm܎³[Dº2`Šo*…íØŒAB@”@¼¿¥Í7r‡Ó+F¬Ùñ̲°Îj¸rL x'ً´ÿ@ìk2uÛZé0Q(ÛØН¡“m¿Éñ€C&zé56pQŠ!wyÍ¥Xºæ¥'ê–&ùðMŸMX¯*F*3Àg¥W´V[ílë%S¦ÒȈG «>Z JñAú¡îŽOr—W¶ã‡:¢¨ZvÀ;É‚Ë\›•_&ûCboD+‘¦ÒÊ ¶äâ¯}WtI)ªûXHÁ§ý¡áEd82ñuüaH}or:èKñ‡žOô5EŽ›ÅK©ÚÉûÂXôu"™ò.F¶tBŸö!”Ç· ôwgsú0 +r™Ñ<µB¾?ZlÜBðµ)¶:™Ã÷aˆNnSGÕ öVõ\ôábQX)±[ϟàèÃ54ó¥ui„Qß·ºŒ£3£6˜õ–ë`i0Ì@Ì»È4HÍ×À %‘~Ð'5ܕs@qa~P27mÚÕÌ»ª7æ%ó–ô©÷¸ÚÞT\7„u´ Ç҉Ó1T&T@Ũ5žz ÃÏ}„J¡±PrX +‚z@ŽƒÙ':'B÷²/»bÅQ‘x×¢…¤Œ¦-0+љߛo«KC§I0™MÑ¥TýB#n´Áœ³žéF4»ÈÈïmé€EÖäöª–*P“=UíÁXäéœl‚W}Æj¤ÊÕá±ThV«0i6”]³¸Ù„£›vs]ðXºLžpz“‚’1Ñ«¢€ºRÒ±PjŠæ£Ò={;¶µa1ݝƒË~ÅÌD6gµ+åÊÝXá@ˆÛ¥+³ñËÜâ8¯-‡;³¼“ŒÑnG$^½woPCÁtþŸh1‰z9XSÖïù„éBÛ$íŠ3qÚ4D¿ÙO•?KRþ‚Æ,.Q3§ntWDràÒ|ޱڝ³ðZ@ ü­”f̱‰üÎ)V1ø®-³.Òè9Ï5÷bþhDˆ¶°{‹ª%Ð넲õ“°ø!)z9ØüèíZ¿ä9Έ#Ÿª¦ ªçՈi˜ñ„àÐ?û½P(êUҕ׌½UϹÉç 9âmiå"‚°¦p¯Ó4òÍpx}{dB}œÒ— ×Ïh1¬¿!R+d4È_¶-2‘ßÿáeì~â¼ ¢[}A¦Qr„õ¬mO»Hϱ'èÀQûãws–^JÀuòpWfïþȼïw‡È^-pŽdЖè+Éz¹É(#³XÏD‘óö¯T´ŽþO-\’ˆ‚}ðÆSWQ¤ÞÞp)¡-]xú93JÊsšè÷Ur·‰ÀÂÀíŽrò Òs—׳rK73Ï÷:N ÝO©‘²…CýƤ@WÚ\jH˒€Y×Gc„PHôÞªÖ¶X+yƒSæG™úBë$~ìǛ5~ÿ ;ƒ“ß@Üâï͈¿‡5*4O[û?l$÷‡bf‰ÝZM˜¢ãBr‹–FÙͧÿ8N:ÎG¯`dKÐD~ ªÚ¿”y Qiò25}v˜ÅQ&÷|—\s)„<œ]1Q‘6¾0‹_Ž¤0­#9qEŠÉÆÔ’©¹*cêZ£§$á Oã•D͑0›8®ü½Ã”… {Csà+´?‚ï=ízLonP< D +RuÄû3¾P@rq `î Áº*9oDqo~¡Ñ;–Á_ ’ß™æ ÅÐ<ÊàBqJ‚V$³-!Þc )L €Ä9«Êóåÿ%<0/¥5˜!žI5%Ýi‰Ý$¦ýã‹e 4R×ì@\1ëmŽ%u¨˜ü)Ë ®7WfÃNɘ)éùÖהzÄ$º¾¬Ír¹ìøŠ@úZÞë­#ù“g_L³¬˜9P-ƒÚñ„< ¼|ð¯â¼„‘Ö÷Ú6‹|Ih€z¬b2Åpiü±\Ãó‡V/¹á¾ó‘ í1aS @€h¶À¢*l †Û6ˆÌ2&ƒ‰rçâíÓdE°Øp$£ØºÝ;»F!”~\) ­Ž.ÇêÊK= ®¯5\ì\çèØ(“Y1~bá)ÉÄãF•dL”8C&¹-mnüÞYˆDo|V8ÐÉtO¿9Á½¢C¤(CÁ’ÇQüˆ$4Å)ƒKcôÇ|ª¦¿ºÛu¤1öJl¨  U‡%6sÓ§œ°ýBÐq3ˆ4¹$èÏav8õmÕZO¬‰«.üȊQH0jIÜÙºN‚¤íæ*P±ñGL=¿ž±¤ÿJúP®Œ¹¥ÕŒÐÈÓ_ëTw¼ ˜BCÃT€9Š7ȗ¶ŸÉA֯ǓAZ²‹6ÚIé4Ï.ð?yx4Íz‚sb4 0š‘`o­f éϑºûW‚éüz~Ù"9² $û¥»â˜îViMºXüojðy¦ë×tO ”ÿLµ:‰±’=šîîññáÞÀÔ|Ï"ÉCܽ"Ò£Ôa?]‘äFvIÅ} µ$\S²˜ÖnªzãLÎѸ<´ p/Á( J±‹Ê•ìOÙZJ|†vì&HaÚ<”¦APy!%ËPkþї'¢?j6ŠÙ#ðͤhéô°qDeë&Žñ Î#á”]T°g‹Èá*-E ++§Zæù»‰’¡Q5uû¥„te0¶I±QÎ +%Ž£oýg9/{0k$î{û¥Óñ=ÅNû¯½þôï`ûS™j/*Jñ +Tÿ Š1UÖ{ÿ:}H¼‘«©–ìáe9(Ї}‚ŠL¦=F¡€¾úH­¼Œ‘#‡ñqÀF-rãHCHkUô7J!¿yw=8b¦Çó·4^©1ub8†ª5÷à ô¦–¿ôAҘ5—ôDð;Ó×D)3Û-T“ÈHfu•qðˆù#ö™¨¯jêDíéépÁþ!«ÎH¹fdÂ]U„o9Oß|‚oX|™POÔE 1YU\Yöáñvy²…u52ö¾”ú# +iV!+‰bXäÌê‘Ñ‚XS1©°ÐR@¶&҄ÛƦ†cyŸ¨Y +h„àa + ‹Ëì„ùÎDájEš;t;Å+WskY(º-‰ä‡ŠØ¡|ÎÔ>$W³µ¤Å5SNf·JÔï:¨Ÿý/žc\Ê8o£û¤.¸ÿÁ…pÌÙA¾™B‘ W=›½>8Æð]ïWüfVwÍ5µõÒt°ƒïƒ#à^yŽR¶Pg…Ëúü9؋Öë¯j^iP4¦$¨³Ágæý҅mbd‰ ±ÊǾŸ™ }BÌ£D˜FÌ Âù°û.lÿ8‘b÷JGÑߖc#Út Škë§|s >Rø9bØ^r¾(9ô@øµ äñW‰–1IÛ¥ ‚™» +G,˜² õ`­‘hÓâ!Á•Á…Gq7t‚,ÑÐ'ÓÆšëï²5“/¬I$Yý9 +|`k;WӉR…}ª¿¶!ɝë5áߤ• +`Ïã´Idhl8¥Â’g›=¨e„º)°7[¦íÒD‡ eÌ´PBNž:Ü~¬¤ß7š2*n¿Òµý0É`Å؋q®\ˆõž`8ŠøŽ\i<@õAµžÜmÈ)ê:ÿ$AÎґ²hI½‡O1QŠã$ÖàØ*:Á³/Òú¾ 5ëãýQ8ÖM¦^ ±Kùÿ„J7O—5F,¸\á鐞]Ô8\á +'ñ¤ÓÑ"â2¥HÏÒôEÚþoݪ€¡úð\´kâဎnWgòíÑj. c¼ÔƒÁ²y …€Ãd|Y ¬8] açÏãu~÷u&ÒÛäã¦!Þ+7ÄPÍø<9e Y@ø\è+¼?Ú§2náGžû¢‚2²—u¶šܒó®$­=J!E + ã° AS,Ë®-ˆôÍñ~(2çöžÚ⟁.}–ß%0je„·É ےYՐ×à(Ö¿EÏu¬˜âBsTC³x|P]Wp°ŒVjxOÇT{2é+Ó´A_O©¼’-9Ut+ýù¬”"05ز½§G…±.VƒqòèBæýV»Ž‰°ˆpÅì'DòúϽeóxõܛ̒EI+ÈÚU—ˆ,À˜.†µ6œÐãÊ感µˆ'ÛÎ×` +%’ž– o èQ<®Zªm]U,ÝØ¢ks¾’«œt”Ä +û Mﲸy·!Þtì¶DÞÝt•‚#:˜B»-lN4Ÿºí‚NzÅ£|]±j_‡Ý¦öÙî‚Ã-.Ê°!h˜›òD葩PñO ¨Q?íiöŸ*ôÜãWíNx´?uÉhð•ºÈô +°Ž°÷!E”J'”&ñFAŠyÖԟMõ.\*¥S±ZÇRÏ.;­‹ {ì+Û÷»cFuý€Éâ]#ÄtˆtE£AŒ;ãÉlšh0¾J4¤ˆnìßhú0`OÓýVƒ!¶ ,];9éKL0º 3+5‹ +‡¬\ulέMõM\}Z†‰Ž—(¶ÄJ=Ê^Ûvcþ÷´v™'¢Äƒ²T‡X!p,]φ=H¬Òª¹ª€‹?œ’•¤Ó(Flt²£ªÁµ’ÝœCüÑ*”ëºœwJd¶6ƒà Z¹v‘A²hG[nûxc敆´³¶ØÄ(ÝyWã Ë ,=#VrCb‚¸;ÇU „š4ø²‘ˆ±a“äDr‘Æð­K¢=ŠSPH!rÞóÁõ1A¨ñÒ^­ô§5K"JÉÔÏn¤ýçÊ Ä,õâ©Br ÎB©gëbÞ³ˆÀEÑR;bäVH«6•@§¡—¾‚-a@1ué1<œ&¢@±ƒ¶;T5¡Æç¨GGÐÃ(L\#æÿ”3äm«ä:®Â 耋?ÛAkj+c/]ě½Ö–ïVmØWï?@•€•f?0«jýÙYméœl/«îÿH·jۗéV³iÀק4 ¡ÑҖÔô²*tŁCUÙH±^˜É¡s„!‚³·A*äñ™Ç#ÂSʐ‰2°-Æež_öú=³‚}Eœ7ð(‚2ÀÃ-Øn… œâ=²vÛRë¦&.IÍ`Ì#Ë?ùL”ªuàɛHoÓcзF}ÅRMwŠÆ²:fEýñ~|'ì¡ Ëâh=€i:OäàYöVþÄó”^ɦÔ¸Ö6äP&œ€V°¨Ià¥Åš_–ö&ú&p³”ÏÙ-&Ÿ +Çʗ"Á½Øàšr Šî%‚=ôÏÙgüu6î –[¥—œ!&O½¥.m6ºŽó땉/ÚSºø܆-Ó\Z. ÛxÖ·H¤Œ–´¼µ¸^7ƒõÞ¨’通Q )Dšñ³‰Qrj13—(Àt›—H‡Î Dï\§ûªjå๨áG²#EÇp óufô5'U_¦8²âH¥‰ô¨+N +jœSƃ) ´ß\Þr¹’jô'òÆ +öô©£ÌŸ„g̔‡H(¼í©Äá>s· ò†°Á>ÿ#¸¯¯Ç)…v•?‡U)'ƒ¦ …àþÌΔ*E‚~œâÉ£“#Ûd»4]Ž+WDå28º¡ë¿§F"8ˎø~eªrr•„EÑ>eƒW^GL}6SU>ÌdLlš†Ñ…@ªrÖÁݕ†¤…a3>á +ž! ׀5Yb*žq\}ŸÏQæ7ãÜØ}š­°lפ+dVqM]¦©òJ³Ž tc6R¿Ã✹q4l'ëÇÓdGæ¤fodXá ­6úYøÑ'zRO#cj€tߎ.Rf8uʇµ=SŽ¡Á•WܚUc@Î0°¶Þ×úO"Õ,ý÷JK£–g5©1= mfÏx-#g—$éG«gì¤UÛ¼lì-ÈIn>ôwª Áaj£ZCíu˜1vwÞiôfLŸÁˆ"†Ýç‰ ÷þG$¾‡æ&<¡G£ÔÅ`cbN'Wð{_óá&ü‹¦ªÒ®¼Ø¾nzÍ?°‡é `mkÞÊ»LaéÄÆB†Ú(w0 9©i! ˜V>Á@žè÷²Ê,ȋDšô•N;.®Y·ä*CløO”CV1ð%˜n-:Á½Ã|ÚØ¢0ä\l·—¯›ä,Ê3ZŒJ8GY\ïò| +iL jS9rÛ؃ Ç“/)ª/ÄUS%'¡gÜxp®‡Ê?á‘ːÐÝ?gdñT6eŒ®$' ]4ÕJ »Å ¡Ÿá âþ(\¹«­Lñèâ΢aqÕÇ×£sëw$F›Ozᘷ•Ü1à Ó#6P/Øíà¥(õvõFÐ Ú.H³ˆ?åQêþכd^Ú‡èGx 1ðhÔ 1³º¹›ÅV`: + +wÕ¾DB¡ëÄ+c¨ê;Þíù¤w5Ûuàì¦ÓaÁ&Þtò@'hRúØ,ãj +D®¥‚ˆI7ÿ ƒ¢çàù §’.=ڀ`扉äª"–/}®’Çó—¾ÓV@ çÇ‘PnÝD„O ÈWÿ®÷ ͓±Â$ +Ç-K Z£¬§v§u“õåuÄooêµLÃç’9IþàHÔ7H¯ Àò,㙣Û_yÏ }¶týnIÔð½Ù× +%î +×°Ú}–1÷•T„S\Šâ¤ p~\ÜàoÁ:šNNuúòÿÈ£?ÈɎFºöDÐþܞ”’oTø‡i“˜0“ÿ +GêH&ã‰ÇÃÍ +ÀÚ«ðvNJ QpM¼#±mD¤òwëûݑN#ò¸µÿªczÁÛu:ÛÏâϝÉÓÍ×±b3¯ôh—ìúgŸPÚô Ð'5ÿôÖ\o‡)ø‰­f[fx]{šŽ„U0o KÓ¶ôr -r¡Ò÷±§Ú™ª ‰{6èN‰¡¾m-R¾‚U1¾ü¿#—œÔ\ +a½Î§4த +~%Ã찧ȣ<ðõVU’R½÷ÿÍȏ×;J4°ߣ&Bý÷ҝšc*¾ È©¹}û,qý|ü4u ÿÔðƙ7<zc¯¢Î? 1˜‚)8ýF¼õ Âæ¦ Ôó'©°ÉbÆ~î†(Q’[fÄH|`Æ!Ò­[äԄÕY¬÷~‹(N¨#çWi¼ fQ®x÷Ê;þ£T#þp>#­ðë‚&•‡^ˆ“åˆmc¿Þ. gíµØV$µy2[dÎ[”A^r} VhÀË؇‡Š6ƒÐýֈü²s©êתݚãXwdzMÓ38<ƒ\à³GiuÄ^Ü ÷-ڔÍRJ8“èÝnØVƒèSŽ†ÍքI³5÷IùÎ ] „äw$¤é´#Ò¸°ƒyX†‰¢i¸ƒä^…‰ ãCÛ,¯/ùZ&C‡J$?Ùè ‰¯ÃœÁqÏ£,w€HW_²q¬¿ê×㐿Pxô…Áÿpʎû¸‹¬M^Ϭ„‚”@ú@R>À€‘z1ÚH(ÐåæBìšoþ D!¬uõ¸Û½Ge0ÔéeO3Ã.æ +L÷<½}bpçYmLž½³`ب3ö,Ž"ý<-,†÷ÖþΘ‰ÿmû§»¸B«\õ&ŒpW©™^§7š-Š¬¾˜á-Юb‚R#ݪ”2ê4GÎÔ‡¦E¤P– ⤠\@J)Eï %”{—ðÌe#Á“EP"¬?ý¥S Á ÷Nb{¥\íöûÂÂÑNYÕ¡Ó¹nâ“1âٟX¯yÂz`¨nµU•†^»<­k»ø¨õj¦ß(Pm[ÛC’”OìÃO0 öPÓÒ§-È÷Ówá!f.À]*ý\Ï)mñ 2,’À=ý®æH"x,)ÎOÔx A å Ý[¦5¹µ¿hÄi6¤mRÃƒÅ4JÐ趨Ö90óS K~d@æßŽ¿ÐCF¨¸ö6B`7/«tÄúåԋx¾öŀ¸ª<.Æé3¿h£¯ ­äüéäjÔ³,Uü–*…£ê~·ø Ìn#|‹°•nƒf¨0¦Æ°YBJ£¹l]=5Š˜üá 'ºc)æ-Ï'>ˆ=·.[hÓ­FáÒ©+Ã>\B°gބ¬à°=ÿ ‹~x{Øþ²Ö;˜ÔÆT}OÂaÁV8ZÐKúh —UÏ0vùòDºLCà¬#¸ˆ\©_³íCªW™ââo[mîʛTá:räò9úp€ƒ´KDCЕ4Äã(N7gâÜAaHŠ\±‡ÑÀB»Ÿ©ÈM +=&KÎ{ˆW/?}5ʐã[ºÄɪ‰ôÌ_ûQr “1>©[pX(Ü´†lk‘ãrvzÒë?Ӑ6áÑfAÕ\Ɵ%°YgL¯Mçá7÷u·®Y~dùs€ù ø+LW#Žĵ’•rxCÎL:È}.…áƒÎ€ðbDʜ§¼7d]÷ÝqˆÏj؛á ùý„àöì6³¹ÙHȪ:óðA=ÊI4ü´‚ +C¿Ö{ãáw¨.Í[í–g\™üóºþ ~Å-„æJðpœÒð\êâÆþPŠÛD©ñêŸivû÷ +󼡲ýlµbµÜå킍kSÖJ Se}Ž}w&4‰ëSŸ1D°V›²vŽQJFá0ø]i_›ßû:e1/þj6×QVç²¢o°EûO¹?õ_Ve2πDT(š™µØÁ\ÓN“¹ i~ûDŽ³ätÈälÆ'ýÿâ•CXó…5£¯ š‹b¿5ÎÖ öËcÕy÷ðînÏ݋Ú ãK{a‘²ŠDàHF`{« K/Ïx®å[+!þcbs»NdÈþ\Š¥æ( ڃiÆH¢qTocö¤c›ë3õúÙuŽñ‘Ûl¨ÆqÚ‚ÆY.Ò̝«›t9ÈÚxª–iÉ?1äíÀ£c„¢×¸ýÔäŽñ£Éç¶7§«GqŒ¿qŽaTÈ ªUƒá²†¢dÂ#iñ´‡LcIõ!ݹ˜ÿaZ+ßµqgvZº¶âævnã%Å̈́•¨mQ÷]Ù¨^®1N ³8M‘¬Æ’î +á肽JhŒÔGªÓiPYÞÁÀB®ÒXh˜ EãP:Ô¾ª©Æ”"Ìjäd¡í8F×¹oúq/¦ …cOqû¡çÇpÆJPáÀeÀõ–?µ;QrñÒb"¯zD¢T®t„=AÂ\qDO3){‹ “sïo̤TTp^Zµ[ü{‚õÉáe{> †ÆµÈ¹¡k†ñV@ÈÏÊ¥mÂl>SkÕiïç.½‘IâûdM…ç7óêÄ®›LCÙÕÉ"ë`þVðE4`“c>ZÿíiáªÊŽŠe 9Ãeñ=á0þ(=–§ùF¹)ô@!Ñ4—¢e‡Ò,úMæ +¬÷‹ + èìxvêÄ)Hڝ64¶2MÚRK-ä¾G[Ú8ñ«1„†òÖqÛd""ßߘ™ÛÙs-±©¹ñ›‘P?õ};k€ÚcD>6"½ëÁHQ39õ«gÍQÚ2@˜âÏÀYFœZk°¸aŸ¶²½Õ–Fó‹‚ðúCsMëîeóÚuÏ+}a¶o ]‘D«ñeššsã1äNŽ!$|]hûS¦*/³”rpMÏ>þç6€Zo3È~Bˆ½Òu¾Í÷\øè7Í%¢hH óx@Óº·ÐÊ1m^$õ$)µålãÍD–e¾9¿@öÀVXüÎ_KRËKT² ` ³‘€þ–5X0qZ¾ Èöhµ‡ØÑ 9…%SƒP·$æ³´nvÍ=ˆ”9BÃÑpœ²14ºîàZcڇ-3Ñp9O(º×0 Ý¿ë«®y¼¢*¦GN“£0q/ ³×(=k‰ï—Õ\1™>ŸP}¥y‘ÇÀ«†Öº]!Xiú0ñL|â0¯Ç)d„ ŸÃEC¬¥«>ÃÃX¬j§4K3à¤ùüÚßGǧŽ4oJ±î¾´9ߧñûêf͂àSêPÔá;@åɃê±9ÙÄt蜇â°ÚAt—„1_jÏN [Éáüÿ‹?¼SԈû=˜½Òôe €sÎ:Œ" +IŸRº",B#4ý¤Wup‚\u>x1Œ¾÷´ŽØ½}¾#p&)0¢ ©Jš”û¼¯íë¾µ.¡S–æØ¿‹¾*†X×UX@Mý™h)@Vé¼ø]]’vÃ~·H¢íÔ°Û`ÔØió +lô#L—n\’AÜ"Ç¢ÇHðñbö>,\7u‹6»0Ïá¸1›\€Y¥¼¹ñG²2ÈO“*I))Û˹`ÙÅ"xùÐ<B¿àr–EÈ=9žÍ\㛽ʡ„9ýPñ‘FÚç 7¢ë2;“E¶ °§bð7âd<=’X鯆 RKä~h‘ö*¶F¢í"ú{)\ïÄlA‡„|ÞØ ßœ³Ûu`â{¿Ú\* +dÆt‰$aÐUj¿éø¦lý/õ;zYoeË,x™ +K-»AJÐîàÿ|ºÓÑJ§ˆü„Tñ>‚ò;ä}å/ÞÉI8¤P¯aÓó€GäÈþŸ2ø^nÌäJaÝm*•ñeD긫FîZqÆtÊW /Qó¿JW¯®ð,6ªýôüÚ+,ÓEJ ‚ÅÛÆj‰NëiÒ¾Ù.uT”âÚvRÇ5£¹¦¡S!¨# 4ÍǽédV¤;”W-EŸ –6foÜ(mœpì l°›áL'„æ·‹NÛ·çVé xÅ7·÷6M*†ÿóL“?âVö3Š¸ZVdƒCòµñ Mj |׿µ†µp¸ýÁ‚R4-Œ„q3Û_€ç=ח¡±®·q“/uXx«d×ÎäV‹ÔF‹ï1Ka´;škY#´õCNùm¶@f4'É­–¬âRXE›)øî—_‰0‚íá«Ë"ÊxX÷í'Ÿ‘ŽóAЊd¯GéT{Þ«÷É:_æÑÉöâ¼ßv+ÍV¨G& x2ȃ>µ\åK1òÁNŠÑè:Kµ6 uRfS=HI¶W_yÄ_AFâZل„Fv؀Ðy÷§i”`_‚ú‡`ê5e˜Ui>£Ã=èc²óЯuµ"ðd¡Ë¾C›g›AÛß$P…œÂ#)žbUÐ<Ó¤ãhÅìŠN܄M´u5È£\³Õ\Uì å IΑÞÓZ÷˜³= +*ø¡¸±Ç«?Oã,knéfèÏ +è Yôê$õØC–-i!Å¡ÙfëâWðŠñð†ڂJ…¯K†$ØÌ`ÄN}ʪì Ä1O9(i¢C»ÑŒAÞyó)3Œ "æOý3,ý ¸ìõ$Vl >KÊmã֎ӶÓ6©ðizŒ°%â +-N~åðŒsp̾w‰™ûqUDNçêaôé­b„ˆ::ýó‰¨3ö¡Ÿ ר £pâXÓØÂhJc£¼ó²çåÈ¥Ê_?\%¼ê:ˆÌ,4»Bßrs˜­ûªWW££ˆ&”ÍáFڟ¯y+Ü΃\Âǧ(¬rüïíÚ*Øk­ +rKûP¹w¤rº‡‰Ñ+÷±VE2°4º€n!3™_ÑÜÈV‹‘z–—@§T"øš²…š*˜/LÓ³_æo‘€÷Dë ñnÙ€slðÀ[Ù|p1ãsOÖ.iþ¢$¦÷ãqZKú‰>m0>Ôí*Ò7l×ÖjoÈ ìe‹í8i)q:ˆ¢–¥%­Ü€ãI–G»/(¼ZÝFòÑüɏ€àIòR… ŸgôÁeö›ÿ´fÓ¼Š)Ž‰8rá„Ý:0…0/ßßRc),€d1iÁ–×øÀHDuðqJ78ËG+ î24Ç/'¦™ìJ°ôסó'EB€Ѩ0É°¢Nv¥…Õ ›Z¢÷¬Ý/¼ìF™ôrÚHæpíބ\œøöšüÀC±yUâ1퐫êJ¢s®n¸¨õ1ʺd½Ð(=åїFÒ°çÀ#ß.U…üpHp·5õ¶˜J*Õõ½.å©QPI#P\QRÓÇ)ÿ¶½ÎxՓR¦§Di«dÏL+:ƒæ“ev%ЙB„"-•ê}ˆ"S¤±î‘ë¿…ØD«aºfxD—§E°{ß`E55—èõ$ìqƒ…x_¹Ñù>Ýe#õ ×à«|7=€þg:÷¿{ñʾPƒ‘ö:£µ¾éѦoI³gjô:«Ï¼#˜¤’ÍtâGû]œ¨ Dƒ2uÄD]:Öq~sŽjg K#%…<挵*µföÙ÷x‡›,ÎÖ +H›J£ˆžäßI8ÓضIBχ2Y ît }1M”&/.äzðÞ%äDýö»–]X8¨âl¥øØú¬4OfuËUϟ!o6stHŒ8~ÄfE(:$—?Xòu¤M÷=vÜLD?]»#+|—'ý¬›U@ 2ÎGêµ ¾ÐyÒï±A¬é.ÉZ"Ðsî›6v7ÑJƒfŠ‚xJò-ô“§¨ï–vé}©èÁGÛPLÛ0IÊEã(’ Iq”ÊѝJP$<˜…V‘Ñß4¦wҏŒÄKµ>ójÃQnG``w²±¢:By¡ëXCM†sª±:ÚÑ"Q°TH侸ð$g*­˜™YÜ¥êAI]§_Á`ÒÈ9z¯ž¶»Âçìya њez'Ho Oî¾KŽ­Ì|™}pØLJ.Æe’.Ñr—²³¹)¢Ñ#ôâëå& —9¸º¥`Šh o°;(±(9úHYÁò¹ Î+’aÏ5e•²¦ 3NôAx›)Lzû·]³avú¾ÍI÷ùÕIÒPÔAmfQ!¿…Ÿ(³b9‡çÎ4ò†À¼¥š“ žµÚފæ1 mÖeo$x³Y! •¤ô#‡Í ñÝH”"…Ɛi ŠÉ;§Ubõ +]…{:>ő%ž'©’ÍÙQœáK³ÏQ Ù¹¸‹T8Ëjè W%îP‘òCt†I‰fRí•ÿ<»Ä¤¡6¡IʽRÜg2ÅÅÇzˆw³¡¤ÑqEïѧ‘Tâ²'Oá8lÓ¡dŽŠcL3*ëe¢¡7*ž z’WøjS:Ë¡BkDJ;¢¸t$ĖnýÕ)wņ8ݒÑÝ Žš8èÉi¬ +’ÌGÿ¤t:Ós觫Âî(„²É‡\9='/Ñx/uTt–è÷¤2£f’ʝR?=Ú!ÏÍ7&Gµ±W4ªÙ[²Øšá€¯ºx‘Ä{Ì'ð"lÙw†}üQ)½ŒÑÊç#ºvsg=­¡Ð\ªD²œb¢h3;ª9u™Vhå€ÿVޜЇ‰¬.wç …}Q–˜Õåô6³;%Å ϸõà Ùý¿FWSُëÛ #ÆluYl™dPÀ™fßOfFù–NÁ·ÊìlÅS—ÔK?-V7«Ëa³°· gŠªH  Ø~œEñós\ê‚IFN˜›cþU—Xéƈ¿§.ƱÏx–Ów½¥.A…ª2þ43’ΑM!¾ + s|%_7üŸo—ŒÅ\17ÖB©êbñAÀ{Hƃ½ª.5’_ÀÒzJ=”‚©‹ Sfêr·‘Û´M Û¨ õ‡s\Í9…dk¨ÎÀÕ¥¹\î㇃¥Õ%> ¨µy¬R—c{³Y]b‚ê‘Fr§?·°;D¤‡4„zs§¶ÅäõäS]4#L›JÝÔåæž$Ù)+=šËµÑÄ/MÎ`'i¨KNŒDÁ¦y¥;uUNþ½FÞgaÕT—Èo²1OWØ¿bZ®±#OKÿ÷Ie0ì8ؖÚoû€[ÈM˜œÕt7´û/é·€¢¸'›ÀHŠ òÒ°›ÚŒZuŒÎ3'„l5ÕêÝpá¹êò@4¡-'~ÉEF3bÍgãæéyžc‚לCxã;is•’c#ìC 6¤.+íߏ,}ÒèJÀ1o&äŒj*@@ÕÊÕX˳c’ü˜y°—ÿ="RèrªÒ¿µŸ¯jDíˆøôQRæ2ÎÑ¢p4§>=øi=ºBA-ïâ*¯©_6¸P×?Eô•«Ã(ʯ ‰^ãڒ¢4Â×z¬¨×O?]GB-'°J[üþ_”i\wÒ +H³ȸ {A3¹oJÈe¨ ìY‰Rb&™OB?cd®՚T̓êg¨DXý ãÁm"Qý|ŠøÊÕý iNÒíò×¥¢! +p3ˆôýbý÷÷›ã%ˆ + Uããaì 2‘FåɗO8,‘7S*Ê-mOñjEB3³9wMP9¡jÜT£ªPFËÂZÍ1²œëO» [ð¥z¸¨Ã>Äù)z“œŒ©H\¢ÌMb8»äÞÌҞìpKXœ$_wzPѪ98'ÙähÞº†{Ü‹dOá9}qd;ðð*e%A$¢0Ö6iÞ`ñ«R¹)pž”±×øAeiÐ&½ +Àöšq”¶»ºhdŸÁL’¹r«²­Í®ö¢¤U][¤ˆé^†ßœV–yr‡ÜïÕÏ«r=cH©Âåw„„ü9%õào)¾¶¯Ù¸ª{ž2…öÖ:Ú£tójçю5:QjðØwFV¤ «N¸.Õù“]‰w)u¥b^Yå›5ÃÉÌ{/©îQ¤’üè§áÙá?4fw»„˜èÆå¹ìð2µ‰rgQ۔(ȶvŠ–/Õ …,» ¬‹%/=TíÀƒ˜ 3üÛ¾\´ZsÒP©ŽŽµÍÌ&äÎXe½k <™Tì¡e·ŒË_¼ôKÉúcü$!×(E:-žÎ‹Šy{Þ«×Ô©‚Ì(÷–/|ìQÔã€ÑâØZ¯ônŠæùšq¨?VbP o0*“êëo=ä(s GIA{³%Ö¹1 ~¼ð±L·|ÇìSx1`ãdŒhEY,ïñæÕ@pꠉq¼‡%ñɌE1^ŠÕõ™¡ÏhÒDµÂr´è¦? ©ç5<-qìÐ;<ÑâDZT§/Ãχâ p˜šm‚Â^çx&"Bº%΂šçh7®.÷õûÝҞ^1Ð3†cè#¥˜åN/]ßԖ¿«Ô€u-¨§3àÿ¤#ê΃¤S*(H ‹‚ùϲSÜ6m¨ Þ aCÕVcŸráÂ*ܹⓌ­H¨Í#£FH˜¼û㮆üÖXŽ"ªú”î”6ZGŽ³³™XÜ7¢ +ëº ‘§×Î>jMÃíl7â¥=_ü\1Áâ+’ñ¼‹'Nsá&Œ.hÔÉåÐåÅÁàTzzH´ÞâéŸÊbÝÑý½:Ù́§Qte’5ö9ýí4e«¶A™¹3½³:Xr ä—. ÷s6>„€ãÒwǐ@«vvŠžüf®‹ða£I‹÷íºi¶Ø˜£ï,Ÿ`>ßÚòÍØx? + Ã™Ý9 Q…Å P#òQÏ +5kŸó¦FÈй™³gk¥¨ºz\e<3^—°å³K)PKª‹¦¤«•/Ñùļ» +¿ß½²‡ˆÅ»Ô{­5ÇWJ°œµ‹”O¢}ø‡//؍<&¼2"“gQ&šFއPí¸ÂÜó&8ÅVÝËÉ_‹ÄÃ]9WâÌR‹¬þw̋‘muS./䩅àç£@ÖÇËkšßחL¼éG;Nj&l©ïkÈ}”kí宏ʳt Ôjv8­}0{qRïً ‚OÙÎÕŏÃS†w6¹ÿÕÖÜdmCkrWÔ1ºWÍCv£Á©ŒUýûpҘ%ÚöøBýÑEQJA<Œo˜!ÿSäßGRð¨ËŒu…yôUu¤ÿ▧HIóJªÖ8ü¥«*-n©{½Aõ2Â{vi´>=…ÞÆ6ó°4Øgè%.Îº;ˆç-üP½P8™MÀ,ËE.¹\UhϘ áayë© çàÏ8Š@¥Q}° [ž¾(|¡¨TÖ¿ +B#úA(úè”h’'Á\|D™LYÎ$Ä +t·ý8ê…g×{‰>26 /-mWÿiÆzÁ™ {~pa3à˜Š}jqøY³€ÉjB)WÅÑgÙLï 8òå\ ¸Ù¥ýµ~½iº|±ƒ49觮6{Ž‹Îx“3å…Kaˆî­ÁÃvDÿ¸Fb’ŸÎKӟT‰6e,‰Iy¾çÍAòf¯3 BFY¸½R[gܹێ¸Ì$fŒ«;ÚëLOК€„ÎŒMÁ¡~ÖU/rKü՟ +tºš¨”(<4Ëè0£Ú©Güúeνåï[–ÇРh-Ìõ¾ ÞÕYÒè΍61CXþzŽTVd)³GLtÙÊC>Þrƒ!Ÿæ¯@V®=ƒÃ¬¦˜ÑÞgTdù¦oö‡#ööC¼©C'l™RêP{º/€ýXï87eJ(òÌuÓMæƒüùۅÌ[-îӔã#»…l{v;G#FT¬+G e„¼cyØ"=`.¯Ž¾¸ŠlTaXæõÍêÁjêSuþWB͐¿üUäAxàcÀÚ\rD€U´è1 ‡¤„¨ ËëèŠí>š:â>î²ÕÞ³™–PGþ|ýµ•žo`oÃÛ§™¡ã×Ë™yÅëdrT]yÚëmŸ,’ä8#øg …FD5°kÒ0ŽQükLoø))ûô)iðߨ‹Ûßk¼ý؈ÔøýÊ6k…*›"Ò#ߝÉú›\D(®T’Ò*áňTRÉÎÄ,ü¹*b¯N'Õ;‘Û:OÌ[§_ù_ ’™u¦ã݅¸‘íºøcM&|¶¹]wãk?¤£Òt[ „Èi>ÕmÖ©éAvâë»Cÿâ àT÷B‰¹r¡µ¤yBØ!î›K»]‹6i‚ñ7ÞpMƒÑÍuIÖh¨ò#r‡Ø"”5¡$áâ•÷Y ¥\.†0yŠÎ¢œô¦w>Ñ O%š’°ýF…¬ñÜ=®Ú}:ᮍ—B¨ŝÝÿ&®cåyãî.X-B÷&÷å½ÓÓ©¨pG¾ùCðâµý[ágñ†0̤@2¢…ì 9¸u:!e©]¢žp h˜¥\ËôÑãn¬ò1~•íbèV³|r¹–Í n_{”‹ò„Ÿ7i'ÿ[±¤IKÜ|þ7¬ö‹:h]¼¾ rÿ(&,ÿÑ(=pÆ@ ^Dz!ïd%(,õ•ÈçãÀRH{™–Ø~ç‰Èë”`-OT[Î/ç-Pņp¢‰Ú}o>‚›h–RŸ:• ‹Qhª@†‹ld?:JÀæ`cÆ^©Æ&k¬¡U©1ø¾Ç¾ó +˝¶AÁ¨ÅèÀ³Û/Oڞ-ۊî~#¹”öÆÐÁw1C¯ç¸C¼%Æí +0WZ:d’{ÌÑ žãùß  [ö…ž»`À‚ÄöŠÉž-àênÎ0ۉ’T +C“™yÌýøÄùÎnÖ> (‘Ò]Ñ'L+æ¢\¶gï)ó³Ôˆ(PÄm„/)•‡äÂÄfû+"0%%ª¸©+ês·›ÿ@p>Ä¢¸ø˜}Í¥¢Ñ´I4æíöÔíi¢‘Ÿ½ªàÆSjB[B­B¬™’®š¶ {–ÿ/¹ +fÙf¶Ú$\#+Ô ± 3¡JÈÉ7­Ù¦R331K«bséQC^;«bЫRþeX^öaêõqU¦êqm”G“^xŠÖ¦×;Õ”±‹÷H'ãJ*õ²áì -­À0&LìÁ¡‚MÅJ$Ӓpyãó7•œì ¬((Éõ­4Ntà.¯¡H¦Ql°T' M¡±†¢¨¹ô­F›|ïSë–~BÆÀY~ŠöÌ·öVØ{óŠ–§E·òx§H–ü ‘ˆk¥—³°]%·DM;âÄà 3ÀQÑ© ¦Õ5uú×¥5õ3_¡œ¨ÔòÏ1¶© z– §YV,=ÌMÎ2Y 7ÿÙFi@ö?é… Í‡aÞ$PHŒe¶F6õP[aú“È1s22rуn̏HËÜÿ€†³¦"Җj3—Dþ~Jo[‰± ýÀpˆA¢ÑÔ»Ár‘Š¦®r†Çrö€ }åR`Mÿ{]“UñtÕÒæ11ä;6BX&¯|ʉË7±Å¦.UbŽ¯Ò`%k[³wLRvzËχ>à{¾©+§„¾<‚п3à;¤ì»ŸZš£%íU—dxîp2ÍÛ<[X&ïSDúp[<ÏÁFp·ÕŠµŽ©l9œwȖÙø˜z Ó¦½•Ù*ïì¦Ç®tS‘ms0!̭Ñ·>l¢Žˆ§ŠÇttgepZMûӝluS“÷þFg*DM:ÞU¡qË.%f­º™hnÝåˆY×D ÄñO°·‹³«žâ‰M ¶·j «½û™ P É¡I«÷%öéNdÿ/m)6â¾c-™+€¼ªJrøZíˆ1LÌßj„±Î›†iÌýækþæ2mŒ¶Â0q%¥È  õÓhô`9ÎI¨Š{ñìÓI³wï ÷‘UŒÖÄKœ!½h'ôySÞ?¥bžÚí[»‰ Oý¶Ù4û֐ôê¥r`:}&bq/xjf؂ é¨×žv0å·Cyŵôq<’Cm––Ñ•”OYÊÓƝÛÉ{`sd„K³URšra•\¶}œ_·i A瀵ÄK ¥cû…Øiáó¹1z’EëÌ ˜…Êêb-XÎ]xp-¶½NX矀+Œ÷æ~â.\ +Šh.ïüÛå†ZÖ܍š\Cbåp¦âÃR$8(¸îß¿]•†]'øh~KÕª”Û~B“C8åa(LÖÀrê£Yñ!§Šë~a}Y{ØþçK/a 닆  °3§’¶± +`˜ Ú|)°­ž9â5zvž…Tµe³.ºö‹þ+‚ÁÅvÌôjÌx2CA ‘Sª¶½Žñêý¡KL£$ð‡ã+ÉlÔ;NIŠrÚ. ¬C¨Oya (ÙI]Éë¢wôÄçó_ú¶b‹•CŒƒ4–VÊjl8¿þ”jIN¡ŸÁÂõ€+ÁÒ£hÉXTªìºi_–«WÂÚÚÁ¥\+-õ/Cˆ 7(›úP:Ô[àéP–î—zwY¡ø6³ÒZñ;Wè>ÖwK‡¸±<üÀ^eCq"e;Ù7+åÊaଗE4sMa%º“é…Ìz‘%Nžx +¹žÐÉ€½™çÝ]^[Ԉ—yÚhZ¨a¡"ÂÓz+âÿ¶ ÄI‡»9NJ†û g‚¥\³TJ•VQ$ö^]‰Amï«kÚ RÕ ¬?®¶ BÈ Oº„,rNôãÐàÙ9}rGé€Úï%~V缘҃ÑíȽxI[‹?×ó}g`ƒó¨@ê÷@`¬“YËî¨àÁBÑw«F¾#jipA«ßÉv6Të)Cõº"66ŽYùá§~÷ 9U!@³ˆœþPuzŸ§°° ÷t U¦Ÿ31¢°-$ÞX¸Ã°`\ÿ—c酙ÏÙâ •úû°'§‡#'ëãÓkљOtLٜp»½£žíí.ä¬Ê¨Õ>硸£ì䖑†½ñ¥‚e>äם¼©_ѱ¿Â ™LåT‹«.—”_ h EL +CpD†BIšxh•W +‚g²ÕW«&yÛB(®i&d|]©ñõ,RJ©<k+?v雂Jî†ö+D{›H|ª2£§¡Ò©ä»Áª’á!ÿ§±p-ýIɧ±×=öïÆÎ*ÈÂà¡Oª\UÈËLô‡kPm¯ØDêNѭйÑ7ò6€É\o ÞQ¶ xý™íÓè$-@`lçžFî ÜÅü=oe(Ç‘§¡í-C˜òØ(z3Cð/ñ¤† sðÆyLAðÆ.äHw²òi<36Âõ«ÍvùdN­ãáÊÅËà}‰¤í~¹rÁ÷Rʎ§XF¹`eÑ]/xfõr/ñ¥ ò\ Ñòú\p‰O££KóŽ²OãñšÅ­¢§T>æT*û»‘60mx¤ˆÅ¬]æ–?›xaPºÚ½DY eˆ ƒ‘$¿ ×§ÁÅÒPR¦&±Û)ºß±%INH_ž1¶å½Bh¥êàMnÝÆêy2´è u4‚½r¸´ÚÈ,Æ#ŠÇÈÙ +¥Þ¾ˆÙ8(/+²]Ä×l¯ g|Ò4gx=Â7zs-U³!¸%’{c»<ëk#°<û¯Ã°ÙÔaÑ^<9F¤ùF%ü2“ݧaä­Ð¦ˆ‘Á§ yÚè*f”8µP˜ބd"®àñÖŒ&' ËL¥þßÝf¥ÆÃÓð„•uy’:âÁ¥.OÁ&¤S^ÛUtL’(‚è›Çð鲶™;P‡RbÄ/g >< ã<Ñ.¾~=Ec™Z :ºx-„K-Ñg2mö0Ô³ê!‚Aë‹b+ MŠÏ¨n=t :)tjó»¡RØAo¡bÒ6¿á&ôš<²Îf”ïVbµ»Ì£™/SFoM¦œp§-yÛѐbÇÈÌg©$’eåF ‚G¯,¶ÈKö1´ædïˆáÅÞ qª IðÝMÛ oÚw#×a¶óoê¸9ûn¯Áì,%ˆjF‘´¡ä»ÜmLõb 8|q‰y—Ÿ”§Ä¾‘á.õÉ芵۰ÞpFb:fPcE”KPcòBi½ñÐÏ+¨A*èyæ„#jÎ=%ˆù#¨áL›M•FÐzš /¨ao;¬ƒ|7À¬)#•ž‚Ψ7Bþn©ú{‡ÒÂ¥H\j#—Qî@pê\yÕô—’t×aàü« €œè¨þrfr~ÕÓn÷œmD¹àB®Ò=;Ù霹:U‘+:ñF-ÿü3 +ƒH¤1WZ‚ʶ"AÜ!5bŸiÄï´x£ÄXœ´@lç˜FYô8dRƒ±Âà¯Ð(äyyà1‘؊3zD ¡…QL‹Ô(ƒ©ÎL÷Ԑ+±Ð4Ù@Cj Áw@#„7¸ï,ç²¾¤&R#½Å‡Zb‘FH°§æ» ømnâ.˜½áênÊÒ=QÅ7 +/|,…/äŒÇRƒˆ&8ðAÞ¨F5kÅoODWáC>…”ov‘ÛlE—Êt¯»ï7®$eëµ>û"Aþ¨í0ÚÚNÇámÄ!²õU…¸OYâµÿxãá¯CÒ²Zá¡m`èv +ŒQgÄdI¥7¼1sLô™G$øÁ€w")B`”<²k?ó‘Ë®€Þ15ƒ½¼AmUAF?F¸ÕÔà}«3`E¾y΀è3nNM5fÌ(jciBd. ¥Á5˜Ñ‹·ƒ´T·4Göf¥ÁV‰šäi±í¹I#+Ek¦EoÀ&©à#…Žh©QÖÒÒ-5lJä,+ÑRÎá#`2£;h¹ “ˆ)ô9Oo쐕z§€% ÒUtV¶:—”½Ñ4LU­#Z}S¦¤”æètÛM÷µâµÈ[R7]A*.TM ¿pöÕü¸Goäcîÿ(R"¡ý‹ËúÈΟ4ÀÃèxǏ¦†P ÕóFãPÏ[75v‡•rá^“Ô‚E§ïlvX¡ÞXmµSãÜ_Ñ_€ÎäMT¶"Dm‚÷@®bïÿ%†©µ8â¶móž7R.¢÷ó)Lá§ñôJª“©1O¨RPv3)SñÜ.´¸Ä-úë@xwS0˜B7 u:ßÁ¼aèé&P5¦†…¦2`ÞÐ ú  ]4úÈÓ}FXiIÌ9qÊU’KÅ=´ÒŸ©!¶2)ébj‚Õ\\·#]ވß“P?ÔZºè)ËAiRƒg‰SÜŒ7½ 0nÚȳÚ$×0 í`¡ÿ ÔËÖD+»yD?TÒ0³Õ@î~ o™tð¨ÂQ¸¤†™äHÎPö¼haG7,Øi2u 7CÕßgt@ג ;RcØácXŸ­ˆCRÐM«zåLzðø,…C£µ‡ Î_4ˆ¼¥­?HÔ'RÃOé„2"©á4óôkNH+öBFä sPJˆjýc*dïH Ç´áÏBj`fm 7̼Øp$º†h!o`†i¤ÎTGjlÈ[êŠÈ¦‘ Ã§l昺]°¡KSÞiø$’‰ýšéy‘7ôk"}äöyÃß½D„W´il騁¹¸‚PîˆòÕF‰Ù}ãLri9jbB¼S$UuÔðxj¯ÒQ#!‹:k¶*È«ý!ëÒDU©'ÚjéG ÓZ3߀DªÒ WÁ4ԗ0,jX]ZeÞ𹨁0ˆ9%Æ`§›³tã*òFí§¨£F”¥yˆÔP– {´¼Á6 pt¿Å˜-oÔënœ ?íöPC?Dûãî ž ·/AIµ¡ÞYfbòôÉxc¢£áGV™\E s…°QÀÇño++ÌQcä9}Ó›)U“åü+—4Ñíòªzãë@î6Ñkð€PðÐz:ŸNßSÿ¨‘ÀAé#›?j”à7 ƒÞx1³ö +S¡Ø©¡¡a‚¯G1àí³æ÷û9ՅóvÙ/ø:ÞdŸß‚ÔÏúØ<]âÆ®³ÇÓ@Ƅ|i,µ¸4L)à¨acr{/ÃyÅÆÄÆcBÓxe þ’ãí>o”«-pæ€×ÿÁ; $r,22é™ÌÁǶô¹X© DË?ÒK ÄfO²uõ“FŠÝ¡%jIâLžCÔc?†±h¶ò«Q™DåX2¦½S&Ÿ¿NÑ#ʤ‡ZW4ð/—-“`<ËÆLÂ13t^Z·™ˆfݞk;B55ŠËb¦ &n NÇL~„YÀnfòšª[xn{¨}ÜÛ«È39mð%R}^h&pRߏ.Ìû<̈́/暉À) ƒ¸Ðÿ£FօڌƒfÒIüÍD{ÃC­Kwm&ßùJÛ:¼M{Ã`jÏ+Xøî4k9¨Æ›*qÑDVŦ3}Âׅ2±§/†™—Æ%ß©Õ¬Ÿ»–Ê(“^úu"Á‡ग़®”Éy`– 4*\¸û©iÚð)ßÊd["„†ÅxøšÆ,%IʤèÆCS9p¬0ˆSŒ/ŒQƒ•=Ÿ˜QT% +šDu©7ÌЉ`™©7愆C-/õF#°l O ¿ÃÑlñp07j08Ÿovлϰë[D3¼ÞØM~áàTö©ÑH&&éhCÝT$ñ3Kڏ/{æ0#Lô?‚äSäy£Z¨Oã^ÿ袓婁ö=÷žL4K£}¼°Íø+oèJ|ßÎ1)R]SC•Å8Zëq’Ì|o¨ƴ¸%³–7`]B +öiÙ#±ô¼!S'Ùu]ñG‰á ƒe„ ªAO¤ÖÁT£3¼Gua…<5NHÞÔیêz^ *‘Ü2ßdöýX ó Q¬a„Ì—EéŽ\,ØîœZ$u Ò «+ŒPÍÖá]ÊÉ=v}!åÞ¯–™7 y´ ˜Õhou\£Îú'½±¨ÿ¤Ýf¢Ÿ%iÿ!%å°]Ÿì!sô:Û(S1q÷c²ŽÂæ‚ÃX痋Û(ãÔ]g)(I–q£ô’‘lBãª'k—jüô›2!ØðÌÎ"iÛuÜ I|RÇ¢±¼bB7«‘Í$d¨Fš*ÒçãgcðÈPÅ2çOYåeSY'ÌbTúb\­Œ¢†i]¦õØõU%Çñ”Eb~¾›‰´…C6Å_êÄ8µI¢‰ÅF–« Ý ñ"Fe 2ÀNvÓâ©íQ"¥3Å°†W»yÅô´ä¦„†ª6 êÜ<ˆ¿Ni¶v‰¥V®º&,ª«ØÜnj(c:[õä¤ûhlƒ*u¡¹Ü™<ȶ¡×•P@R#㨑JËEdK™Ýë&Xœò=G6՚֞¹*«1ÚÊâ3éI‘¬eRù3f•+Íyn׏.Ù]Ñ_s/ mÈΦäô˜„x%i%O|¹_5·©ŽëkÉ]ݝŒKjnÎÃ2«–s©/DCWv60±¤¬ØûF,> 1<žWÛò·FKÜ'{çT\'ÁÚ°V™ÂÊ/¿^±Àz‰Ôü‰b!…ñbá? yøªabùÂó¦€8vQœ±$>¸zÀ\˄îa‡n„®~5c@€L 3±I+¸M½Œ‹ÆLÝ ÐÉðg¶‡qŸc­( 3eÍÔŠb>½Eç:íLœ}`RÁpR! ª`ªPD2Õr:Ý`S+\K*rQ…€ dq¢ +Á'Þn’3°×üѺí‚YOž‘ÜèX„€àt#@ä´ +ˆÉ î'0àâý@ ³æ÷Ý'a›>›yõ7ª°ÓÏö;ÚQØÈÕ.™a­ê^«¨ K§) ¤h½¸ +-®G#ô’ãúFL~ÅËM,%ñÕdÎì 'L99Ô[Ë:ÚXsޘˆqø_¯2=zï̲’^]IOueŒq}mS¯"ϕÙû³¾âoU6¬Vfì¸NödS×»R5úou¿Éí,Œ\³kÏQèW_Ò_]ˆMŒo+Þ¤·’bŜCEÛ&OŝŽ„´D&È3d1ÿÖRéÍmêÐ]ëÄD,jdܙúæê¢\$©EÙ:4e¢ ÑC½"Éä4 åä¦;³#º)ÉKªg­œŒD¥koÚÓ[a(*Qm¢è$‰Dú‹ŠZTô ۇÐczŠùi©‘Ôè-™(ܞNF-…‘ŽÚ–Ô/­¼­º8:ºáZ=òétÔ#Ó¹% +£QO=Ù5ÑMq­H §ª‰££#"O`я&îèFFF׆¢ŠqÉ s@”Yf™¦y2Ê4I!ˆd4…êàÛL>3…€à¦ sÒÈß3Ô[Çí<{ž(Dy +ÁÏÅhc$k0’B@0FR~£dF!00 +ù+(ú8Õ1NóG$ã¢GŠH‰ˆˆ€Ç£iÇ/‹E(ÁA$(ÁJÃbùÉIœ 3322•“š˜œÈÈ̘œœ„ŒLÌÐÐHÍê*ZŸ°Á'~QFEEåP"•ˆˆˆ¨TRKD$R‰L&ªÕXOVVda´¢!î~$Nâhx1e!%qTahfªÂE¢²!Z¬¬^­¡V®Suˆ«ÆUͪի– aËÆTê¤l«2ÜdIvLb‹X‹W­Š—N;¤ßv·qUeÛ(Û +!| é ŽñW2& +«« +⍕â‰ãr£Ü q…—Õê½X `ÄʘÏLÑ@÷ +s!b"·Š1DŒ¾Ôÿ¸ŠÕK"éy‰5+þ{Uó +S,P&(þçQ4†ŽJÓ +¶º5·F³·lL3ëƼ½­o; m@Íf[[«3×já^Î|ff7qofãpʵYÌff³™‡2—×.I’eY–,KA¬%…R b™\®ò0hÚ ÆÎ3qäœ2¤ÓYi”já|=‹ù؞çíôɞCù‹Ð2Ð? "ǙŠ‘bÌq ³Y}áÁQ°‘º'îc5ÜQ&¬FLH^R¡FVúÄù""ýñ“ÑU‘Ñ µ(ªü’d¢‡Éc"¢F‰¢%"XEŊŠ*"IÔ¡™Pëÿéntñÿ¿‘݌®Ÿ¦[Éñ“HF}‡jddÖ°#"“dgED2‘H$S…Ú6ý'33#©ºÐPŚj«ã‡]§¸íW-ÈzUKG"#Ù]$º}ÃTnõ.;ÿ4T• ªþ‹«Y¤\R¯°£² £ìrÕÄIq;|іÃ6H$*’H úˆH¬[°µðô bkˆ3:'qpoͦǺ>"=™‰©*/xÄ +¯«¨´ø·µ£Ó@Y“Ѫ¦ÚŠ.>:LlH JE9+• (£Å§Æ Ì9d +&%öó_\ÞÀ°öށ'$ep2ñÉö/ U„l5“„ÅÏåaqçls°ŸM;¤ +žç¬c[}uíuè.Ewd$eÜv‡éR¨=žÍ#vÄhºEÿò:——·Ÿj3™¯æ¸4aUÄ/!¥–ÁDÊÿ†^‡Õ¯0XªgçÃi *å¢6‹93ɦ…­!á؈áDm1ˆ6ƒØ¬Îaa½1ͦÍ–«­m*ºB  ¬Œónò?b ß/«YÄ`¾Ð=rG 7õ>‡uÿ‰yøhÕr¡­OYÜ'Þ4[æ Ö «GM°óέ²E.ã,YÅl(tYzÅïš_IöÎƺ½€’·CmpŎŒ>cÖkû3êE +cŠ»‚Ée˜~´œàÇ„Q·½W*#j¡GHÐaqÉâ’øC‚*øRßâE¿Ù$é=F/ïǞ]5¨PÈê$/» X ï­Ê‡3^륉0OOƒs‚ýyÿ<ªgaÔàã"´Ë¸b„T.Ü4íèN±aÚŠôÁž0ö =›'Følˆ%ˆÁŽE·(uTbLÀÄC(¨^‹Á ÅsSös?\è"ŽY gÜeËC™õzr ¾Tqûòƒ_ ù¢‚è +ÍäTø'ˆE™¶ñ€<|¡ðZ +o$`Í‹õÑðÈóÓ݁>°NoîoF lUžbÎÃâ?‰âh¯³BLö%:ªG…i؉¥ÁvRmþ!¥M@àxtºr™¤ö4¹&ܽ°ú²ˆ@2æ7ÒÐ[øµGVª‘i!YÌO÷{¬>Ã[ÄÒd¥Ô§é SÖ12~²Š´@ÞâKVý9~vM–Ûvp¥k$ëMÂ`;ùYÔ§ŠèÞ/¯[w/ÒÄTd—Ôß +Ørq.;çÀ±ˆì·"]sÇ¡C §<!#I¼>ƒV&…XtU!ñÇ" •BØY…? N–%+7%„Î ¯ˆÁšLô]2‡žÊ!a%›"ñ¶¸‰&D,™øœ€Ê¹óҍ“`ßooŸÃ°J«ïßƚ"âK0€_,<œ¸Õ¡R±œ0òúQWb‰wó,*w:×úFõ#¬š5 í1ššk$ïá¡fÌb†Ñ*%ëÝ² ’·Rº=Óf_¡„ˆå¨F!ãU^ÚÖÂU0Ýá5(+ ~ð—%á¹ÛeHEÉÿöÚÄA¥G(¬è<$ÜDÕRéŠú{ ›®”ÎK£”–ÝbYp-@dY²Ü1Y0@!eÌ,¸»•×ÊþFkú×3 œjc—ÿï˜!¸ø¿‚Õ¡÷<’‚Íñ ½à3ä< ðÊãÜX2R ™mWl2÷nvS`¹Óc+»¹Òôiðçó{ïÑ †ãF²ÌŸ„“Ž@"[TyrÓ­ÜãŸ:/'Ô©6œ·šêXO'¿Äœma™KË5« +9O3“*¢â)ûÅb+ð”øaµ¡öi­ë­ŒÞq5°ÑÏú”ÃüïDb‚>ôz + Í‹k¥Ð™x +PšñroÏ&Á%¥Ú[‰=·áqp=”{„ÎÔꞪ6b¸&chæK +-iX%‡)Äê®h +*VÝßéØڝ*¶´XöÿÆoäeyãL½ÑeÖr;,î €UcÙÇ~ñ½-^ýP×õ3DÏÏmhÔ•lŽhÖ§A¦ø1Æ_x¸„Øk¡ï å}3vn~Û{XäSÈú=dÓùÞziØ0$Xc®cƒ^ ÕT‰‡“ócä¼äÚ÷¹ ýóëTãñ(Ñ°´ý³qþßs ¸\”øG€T˜ò4G<§°ŠìQ­X傝qö  ?fò Q þ6vo® xBÚ²SIæPÙˁ>dÐJ‚÷ "6H¡P(ߟ‹ø@·¥»§Cö¨G-–‡hÒç'ÆGéºÜ@§ÒPÚÂ×¢,lÄ$ČxYàGX¯O¦LŸ\ˆ¦¡%&Ém$/B‘¡Mž>¬‹…5KÊãpì¦h¬\Äô!ÞÑ%ï™eÃäÞio“Â{2~%Î,ʅàe‰˜G7íǃxf,÷;®„¥úÝÍÀ:îƒî7œZ¨±ÛÞ·º_øÙ!=Sû<5–ö­Û^„¥ˆã+îJÊƔñøIÌwš‹Â=¸ò'y£"1Q[,Á›XQ_ÍÇ"o&i@u_ů_ðXEÚÔFk9ºs7k"‹LÆåV?e_̀›)³vªe¤|„TAlGùÜ©2&KâÇ èMRKˆ5OâÞm{t`O/Z‡YÒ3¢/ó÷ȸÜ3õúôËXK {ö~®‡WMløLþ"v,/“Æ€ešh½a]|Æ-‹÷ï½°F)Î@%ÄgG Û²¥íÀÚÔÀ˜oë *îrÊ?éIê^Œç·Zè}Û#"Ëؾ]³‚›µšG:1çÞ¬8 õš̛DžS‚òþjŽgwj*‰¹¦Ê$üØ(r…¿´'ûmçëuEz#3ÜO0ŒxS­Öož¶k5.<0zß]Ë3#È6Õ=°þœ›CmÍ8မÌî3ÆEòˆ˜ýƒˆÜ½Y·=®Nωÿ3 ¶NÏ&‚‚>öÚHQ,Œn¡8¶˜bÂ?)Æ:R—Õ,×±‚a@ÊL0ÅÁ>)¬ï7ƒŽ$ªs§}œë‡ [ ƒ[`R¹;ò5öd(̤gÖ Àø ?¬D#z¬]è÷ªMÌ#¯  +Á…1(o³1‘ÿ¡íTiUµ0µ8Û2« Ìç× Cr‡Ú´pÄÁN„²äh¹l RVP@¾k@äc6E?úÄyC Ló¨Êä|UA€¸MÃo”ö_óÂfÖÝP™¾ë +xÝÖ¯Ãèš´ü'èV'æŽÀJs&Th¢œMR­ÙØä +Äń›eý(`íx…½~ÄÕß +þ;×#ZÀ»I8é[1ª0Þ¤÷Š7bi¥uày=§ké6IÁþ‹®¹7Vz~ß ½ð¥{‘Ù’0æJ E6€lZ„ؾç0e”οÄ+©‡I‘S|í$DÙ/þ|kF¡0qÖæ“ò´lO5Š†¿KwnÂ}žÜ7ôÌ¿‚±E€ák¹p¾ÖÇ[¦b‰Ïâ²úF-^JŽÄû.ԉÚf!ÀL‹”ÿÙ†Ëq¡ ÜWo4Ñ\ûa†Fg³Ty@p¹2Ñwï]^’s`šd,ÔIoF*bT&ûqåૺì1PüôÂobÃ{¦»‘šÔ9™ÏYû u˜f'²ùµr¤O Ø&’1;û58‘SnCÚ´"`iSaHR¦š“oŸ(@-K‰l³Ü¶+*˜*rSYJ‚NÜ¥ë~P\JêJ’".øŽp'x””X')›Å°¸”€†t¼RŠqøp 2%&ý%S¬ÈyHhɪ õýßÎ aømC”̉¬cU©’g¾5¦âHÄÀ%Éě×G%³-13âˊր8˜¬ޜÒ&Ž L¶0qªÚ¤HñèÝßï(@üú§´Ò—NHÇüc7/0ÝkBÂ"±ïPR?͓øÀãûÀ ÿ]É.X±‘FÉȶŸº˜~JÛˆ˜ÿ”môgcÚ­M±™ +Ėå£V‡¡¿ACÿ“ }úEL~´t˜ ¹¬¼ÀÇ´‡+(¾d*ó̈Æô_n2|UìjWJä"4%?ó⪎Rá—¿#sì.™Åà`ƒ:^»Àlºõ2Ø/åFÓb +…Ô¤Rǂ§ÏX*#~l+ÿ?[hŸ­"ŸS w€¡mâ‰q‹9Ëq¶’$VŽlü‚2媁_•§žªyW! +¼¨dZß+l¿Ðǃ¼1³‰2 ­¢êI_ÿiä(‘%ÁÅ{p'va_3àç>Ñ[h^?.•GèëÓ oÒDñJ ðŠ4•ÇLGE(ÜA\šbLjæÆ,=yÞ"ù<µÆÞ~lÈ' êÍÄׇŒ,ÝH^Úì-Qû,,ѹΠø?:Á+ˆyå˅¡ ݀0k¥·åŽ<‘f‡n‡W`é;uBÕ î¢H`23/júÿº 7ˆ9eÿ’~ÜIJÐqþJr@fµC{;Dhh¢:à¨oÙ/ÁfeD²²àCõ‰†å˜Jýéô¸L²½¤{^Ú¹ëTRn(Rp0¸ vúMpÉ8·?Pó I«>ç<_ +ÊÏñ:ΘIq‰lk$Ã--í&³sác¸7οPL¸‘­¨(8nD, +žþÕ0Š.ò‰Ò*GÁÇMQ³ˆJÏtæjUä‰ Å#^%z#c2_à%‚_r´ŠAðÉü+½)B ‹ðɎ,9øéhÊ÷æb»²b0«šÛ48†‘spnCY!Ô`·çÃsxZ5áúX•‚ú"ö|AäóäŒöÁ¢––UpãhÀM›%´R¯[Ÿ´¦z>ª’/K0Œ‡e¨Ï9êÓÃñ‘߸ Ö92´'¹–yE À…Ÿ×ÄnµŠªðºÔíídíÊ+:Í\"DљA.ø<%JÄÙDŽ™Þj Þb±ÿ·»UL à¢Ë +¡ÐMX00õÏ +“N’^Ê´ÿ«Hç½9K˜øÂx>–Â: TšÊËY–Ræœ ›¯Œ%­'-¥6{ã¬CH…#­ê+á~£–Aµæ‚܅7µ½h˜ûý€‚~ µÂèc™XóTÉkd69 Ólãïªÿ‚=©Ã‹÷›H.bȌ¨7—Bî Ã@Gˆ¡ÒÞK^NRË'-–Þyu*¼GÝ̯…¨‰ Þ %» Ä^ª´ø5ˆ¼œkøš,ز±ŒÄ\flÒ8.þãƒÙÑã÷”j$cTåq¦’©Éš³­Rª`ün|„•yè}I†ÚUú`ûMzèÃÈ÷°´ÿÍ  Ð)ƒÄ+ xŸns¦­iç æ2ù·Ì–¸0+ÜÚ|¬Uî׊@áýZé`ð«³s˜¶›ì£"ÕÚ§HU™@ÄùÒ¤ž€bù_ç“cóÖq.4',*²UŒ…k(ñ-w}”Eë•ôÂI±³Š¬D;0Ù32|˕wÕË⺌Ý.#ºùžó̎ö‡ ˆGICä7’Ã•>,2 öl_8±Âi©Ø£-¹V1㢛NO—¿1üŸ €Ú—Ÿ?T’úM’óAÄ% ÉÓ%%¥ùܪሤæì!È35ü&k[ëIöqÇÇ} KSbH`¹@ZŠÝ\Ÿ >Ä{šÏÆ!ºêðà%ö»öÌ/v˜sjäVó?ëBÌIŒl“2àÌ7{<ùð‹´Ì ÆUAuÆ¿¤‡g¨ÖMõAœÑ@Õ¹ýéD;JgÜø!+ÇöÂ@;Ãh3U|Òj $’þ†o.-“6¨|·z~°ëKõiTŠÛÁ0=JŒAy¦4ð#|jVvCöõì£ÚZÉh…¸} +gX€Å6+ Œe.2Ó¯‚Æd•bfž) +ÑH@Š‹OŒ•”%Ç\:Š~;À¼Œ}_íi¾ ´ÂlŠ”¹™?…’Ž¯f¿:WoÑå8Z¢qísGÅÍʬ ÐÌ®*nfó +Y†J³çDP¢˜Yâ:4!?U­*v"^‰ÛÅ)òȕFxónÀIÈ^¾¹û ™°.¿¸:¿žE8_«UȁÁ©ÚÀ€íèœ×/ˆð ”“æyÞwÚÿ~0%²þœi¶W€;,w1N cèöWºD|^UªÎAè‡À`PP^ÃÈä\Ö dLáýkáG7ß ;)X‘DUK&Í^ôl¤_4Õ¡[2ߘ$'o¾¿°Ë£ògGVÝs#]=*Æ9OS„3fœˆÒÀIú>@È0ÅÐU1u/9‰jøaZ^ʬ2/þaÑ´‹'?%ó*z=ëéx†Ößy”A$¾n¯ +Š°EB +^‚GU¯]Þr-,¼%Sâ`Ÿn_’ôý‘ aB ƒAæÓu=úc1ǧ˜ô7̈Á3cÛ½}ÉGLR‘ÀÀÄ£€ˆ5o2ž¦¤BÂrz g¯€ßOµ¸ÿ–èêë[>„B'À…/‹*¼.l?fA>x5cX8</KLívoq *Ù©¨"X4ƒ (ð{=ö ,ͬ–F1í&3.Ñ3ÏNoYä'/…TkÝhºi¡%ÉOŒ™Œ? -Mt€="Ôñ!XÓ¦æÚ·xµê£ø +u4?3*±xé›ñQµ|²ð»©ª[-OOúqã4ºkåV|Ëא¤•>ÆKaÙ"¶'‡!™X©|9éwþË9 ʺ)nOMEè¹>B œsÜ$îäè¥ê1û¡ùdöj6ž8Š7àú#ê}H妑ڍ7°•¹ÎÝFä°ã§ˆÁT®g¿²‹´à!»XmÛ¼ÏåÙXßm ôîy\Ç´ÐàÕ¦=#r(-AE!",-EG;(ðb&ÑçwŠÁwȝK5ÐûVÕý«œý~úŠ.ÓΘRQÁЋ2¢hvò»8# dâˆ-0¨-Ú=ŒøÏ«hjS i¿:è3­¹8¥2Ü-*ª—éü=¡¼Z·Ôª’ õÌ [>˜DY³yðZ®uðéÇY2¼ûSŸ r)Öò9 >S“ePõúa© öªºº 5£ z-áÎÝ`ÞC?¿!ˆàÍ̈́è¡ó@‹Ü46År®äÇtc ïDS¶@µšMÑ´5,JgÒr!ðvŽ±;à[¶Œ¬Ñµ Y%¯Ò¥äeyd:û¢ ñëS-|¯ù÷9Ì>oÿ[õ£¢YÓèÇ2±f›yŸÓJ€ÎUßû¶dñ$èÃâŠ͙Œ ~‰ŒÎû¨£–]s_ÜCu]è¯ö= î¥ÐGTúØÉÉЫ,…>%ɚt¾ës5Ì|Os5PùŽŠšUÈGu3-×ø¸f|â3©büÂGK“Q>ºj»+¾ô@„Zkàè#‰7Y:ŹŒ=×#%mV²^t5«zÓí³Ô-‰/͵Á©ÃÀ²¡¼ëQ ˜QQÎ#¾q¤š ™—þÆ<ÕQ·\˓}Úl§<ù¨¦äìÿ:³Î=Õ¤ª6ZÆëˆr OÄs@<3lpó¤'‡ê'<0¶àÅ®6Ûžòq5íwQ# FúÿyD£&Úz5[sñN•š·»(µ5Ow2RM¹;œSCÓHx¬¾¹ÝöÔÏ\÷c¯èRô>¡ÊB—ßjãv™†ËÙ=?óE8„³VÌùßȅB(è4@9Rß#CßˉÚWÐÈ_[•”ˆô%RO~ædŸ!ø‚?E}«™“Uxˆ1G‰7̾ +ú_º(¤ÃØs®ù‰ \g MùÚÎ!O.ÅM$n™&ߪq9Ëu6Šès`Òpa„? ³K2Μ¡lÞ¬*+X¦t(lC´™3î®YØ ô¯ÂÓïI¥SõïÏ­h´ä`à߄ðæD…Š³Ô·‹¢S/‘Z/`z‰½tíón҅ƒ øEp”Tû">Æ«í0í ÊDüØà´9ãaÏÚdâY1›h4üü#;×è)7aÛßè±uXCA¢À½µÃù©¢ƒ‹S³‘y(Û¾ wÿ8‰ýúJ¡ª‹Añ÷vO=Žþꇼ]…šªP4WCfDÎpœèkÇ߸ )\H3ÔUª¿Š;bø Òû5’ëÓ)øP M—Ï™=3•pEÇDô„Ð6ý¡£€eÑ[ò1bíì:Ržˆò, +üÝÇv5í €Ì—ˆÇ#Äþy†ªdsϐ°`Ô¦ó(I¤\)° ¾’jQJò†Í‚$‹h³,h&ð`*¼<è/¾{$(‰¡jëMð¶£tFAÝdÎþî`‡Ì1ÓJďòôÃ>3H哭kX…)Õ±ÉѪ¾ºGd|2AACl€æÅ:- C˜qó£2qï©”ÎÙè°Ý²Æþôê&u@¹$ühgĔ¬1«ºþT½n’) ¢þ"[»rÞ©)½wŒØ)RY7Â@Í2á+„bôK܀*ãé3tà]¬pV#8ßã1½û¯T÷O9ö‘en·ÔN«[$Ø0Ö왎‹û=I ~ ÊîI“(&Ûè²LM¤§XÇHnü~ÒΦÅýè,‘z4®¡`K(¾J¸B™cÅÑa àƒÏ¨c:Á +2±Éù&ëo”lFJÎ0Nœ”+¨Q‚zcÊZ$œ°æqÍp‡] Ò›öVN¼îD&ˆKV£,¼J KÆ❞˜‚¯°nôõKÀÂ0O™ìAùaØÀPs°Qb}‘1Ґ›“î#ž—–e¢±¶Z-зäìèõ+ +g+×Å#K: º^ 1ý ïÒÿ¹¶øÏ\ +¯åëCùq'7Õ>±¸9àš—ìà (ïuÞʍ—£“&Ÿ“ Ùlª(sœ0š¡ gþB'/TŸwÒé'E–É1æ£.RЁ+~¿*Yˆ=½ÌóÍ£O)‰(?õ:×a$ã§ãoÄ%HeŽ{´ꢅ b©šç{("8U^™×6ŵ”Y?ŽŒèçìúYûNäDXû ¾ÉæÜ|ÂMºÒ&·è‡ò$Ÿ¥2¬]V«4¹Ñ˜5¿ŒMJçjlœËq¥~þ9,v±ùä +´-©ÿ3.µ°·­Ö +øùJF÷Ýxq adr*m¼¶î‡”0%ÕU…CTg>hF§uc6ÂP ú )2ÇÇÓd.&®LÛätù' ’Û1è!>/KgÚÑà´º¨•â9Gav÷àk$[ÐØэ5OŽa&!¾YÅÀUÀð%NŠä‰,óšÅó2oºÈOŒ Ü4B;aNï”5Š6k´sóÞY£E2× æ‹7Ì^\`8€q”¶³:+ÿï&äþL ü—¶³dÛƚ)c™-ʐ%0âó‡ eþ;°-€R\á³Wó:«;qþ + ®ñv€ù8%G‹5RŸ‚aÝêZz`2…ܧ£FP©¨- c^¦qBéRçK+õc²!ôý>5)Ã;>Jÿy1Ûq¬uA&z ¶D†/þÖw¸m#Œæqst ûåÏvØAmøöêtÄå0B9`CŸ!ä«:=åÖÓIk÷X­ÏvâtדzG·4ý„ÅVs?Èï\y¤ÏS#š¿°¹1Ä`j“‘µfÖB†Òëvñ?®ÎƒPÙðö°7ú±\y–÷ªaäÛPÑ5>E×È;‚ÿ,‘ª6#kbj #”«%ßw¨pUF ˜üN¸Ôş£zÀ0·dܹ¹Ð +œÿ.ÿú”à RvÏÁWC¶]Š~j¯?n|,„Á£ë×ÆÊeôʨäY®}èoZŽh†ÌQÆ8fŒŸ'„þ +9ÞþCËÅN¡ûTáx*ê‘æ[‰†Iƒï q¾ûò'#ߣt¬x4җwaÒ)(?¬ýi”²¡ØüåÜď®ænбT‰ß۞kd}Y—Bã2¥c¾—û`üÈN «¸ÅulµæX¸œkH˜—(Z´ +|Ü^5–ñØQ±oS¢RI¯vhHRƒ‹çFf É#ÀY‚VÒp.i#hµ¨³÷ìå™`¥dâïl¯®üÔ*Ò¿…É!£eûxŽžé_F¹GùÁè8_@»†Jk’ê%vc‹Bb•ð4a·ñ´<Èn"(|LQí¢?/ ÷. p[¸® „´©7ÇžÕÍ°Imî‹0'¢Ê¥¹ÞÐqNþ 1 Ç7dz~lÖ R¢£5¼~ +*€]í°åǧDž×(ŠðDa‡Kî, ûz¿Áú]§£Ö¯¥ÐKú À(Ê0\D~³JŠ DbÜýg"æ¶ðà4†ŒÉ3eþ6iF¿ËfCýu†tÆô-U;*.ÁyÇÉÞ¤9‡G·¶7… 2ÄJ5|àŒX`ý`‚J-#.:#ÇîZ9Zʪì!Žå,­~Òþ!HCOÙß"Aˆ÷3DÏ~¹ÎiuLœªû¬I¡á†Ž×Ëu ï;RíOOaÕ øýÿE‰è¯€¤ï´ +ÜDvPšaPÞNjÚ ¸â›= ‡­¯*ÌÔB(6®š²‹UƒåíxøÊ'‡:ásR/ýX¹Ì: :}Å!èC„ ñðqõsË+xBœ[côàÅû¿cýßB¥Nù ë@·`"Q°©ø/ ÞÎLº~¿;kÎadZ²«ÚQF(piÓ¶éš ÐcuèJjcQˆa‡_ó ý%±Œ}~j¨“Ë8!dËã$B©r‚ðFûiÃñÊ¥ýPݤZœCØ:7E=©ñ u†¿è—mcвÎ>jq\éF—Ìþú}É6© ֟`%sXÿs ´Cýl/½ ÿ°åÓ¢ð ·X݌àu©ò­œIg!ÎfÈNƒZ.RB¸¤~a:ØÇúwˆÏpÁŠß!([nUèä3Odƒ¥­ù|(ü®$šš\ãS5£ùyB½±[r×'îò_іp1ÃcÃjiÕ¡í¥¶&PÖüGô^³ü7Œ!@RQk:¼ÿŠ1ùˆqd‹œ¡\ú϶’ȽŽ4Œ¨)…2 BŽâoù·Û?zŠõê­²}Š#¿«Ñÿ¿Ëíâñ 1Þ@Ç$ ôωm2"Ý/Ntáà^n-— +JށYdÞ¡ÈªÛ܏ëŠN¥™–Èô.+¼ÏàãVfBX.ÛSÅÖÆ Ì1 ÐÃZ…^IöÆÖîÓN73TXTWÿ›â)kü +ó.#æ¸>ù#ܤ€l¼O‚ue?ñNêög;›Òh¡KF©|wˆÕŠ +[o§k‘G¦!áݕ4¡-fóÌÍ.’€ìà²æ`/÷ÙB ]Ê^êa>L4JpÜó ¦©¼ŽËɵ3^ôP]ðT”2šäo‡¥)ÙÀD­Ï+©ÚÄYW°®rŽÂ“\±„”ûÇ^FÐ_ŸPh’ãú#Yö%v^ ,ÐÄr2Ö`2FS ˜ÁNt<‡2ò¨…­EŠwËzH`ü=>‡¾êAˆ RD»å’³¤sèf­1^G‹12GÊ"$ë]B…0jpÇ©×ûéœbRù\#L‰ð«F©ÐG”šØn¥c uuöê¨ÚGd*C›´¶Ðpþɾ’ľîÏ :‹ð½ö†’ ÇnõJÿãó®s‡rя†“6›­CÇX„|pP¯ËØõ-ôÄx¤ܙ¼º‡5™œŸ1ùÀÃËfE_!Jü>w‘æËV`²Í®&öd֟"½ +é R]‹s.¡‰RWËV<~ÌÔa×&z•D';æx%zÜk ø¡FF–LÌ`/7uhh@8XSjQ±œ:*½ºâ†¦ýò`4Øϟ²ô("3 >ìvĤµÐ ™„éU¸N|­¿µÓXzc×ùTÈöèå£Dêæ¼A˜‡sUPm•`Ô$넛æ'ôõ­ÜÓ9ðÂ^4½'d5n ¸ˆ²x#j……¡UNJò±#¼öÀ¾F4ÃÏ%·hÑå ½\ÞñVê‰rj('»rmTœ@v)1éê‘ÂZÏ +C#Úhýb0´ÉÑE»9 E÷ÀZ`+wþ›êò>J˜ï»"’“÷<gÝåÈM +öí%Ê Ò˜E“*»AdcVH' äUAÖ·d +°/*g†Ê\.»dÍ3H'ÕQëy#—1‡£Q“˜tšÇ:¹‚«'¿ŠâßÌVT·ÏȐ³©VÏâ´)£Q |…òõ÷J’Ê„hK䳯ŽL ñÈHzÿ§ÁY{>5ÚBªÜ¨Mߢ<#í` Ò®{"k"<É"‰q¼H-ˆÏžæJÜ»“}Z&:´Bnaí_:ú9O’}qøxÌ3Øq.{ãÛ +z_ö‡6ík- Jú ΂-œ] +÷Æ\ßdŒ%š¨<û¸¬{"¦Û%Š((ÜEuŒ“›™6×%àq.ÙpvBí»ƒ‰KÁò•€F~õCWÚ ÇEoš_Aâd®£”°Ñ«%õÁ©ÿWò¼tˈ8Î5=( KI|ü‡™ÅؒØcˆkC™Mì@¡Ë2vú<9<–[,^­aùÄç€:Á×~ƒw·ò*!!,>§¯ ÊlÞ¨9ŒÌ¯!ùdíªÂÜ\á^­C&k…Ðljr\š£í5 +P0íçP7Š½2Rƒ¯"â|™Ûh˜™›ÝÊ i½=EaÚÕzø"GÞpávér,@öšû†ªíŠÀí‚j;öUžº»[üTŸø}#4ƒ _µ(#X&3ŸüFf`Ñ|x[óuòkƂ-YµÏ5CÛÐÂ90±÷½…Xܲiƒ{Gò´]BœSXyy U!ú”–ñåuˆÜ ˜ÿ¸\ çPL‚âÃÍ)Ðfà„yZ ÓW¶ép¨¾ +ÈãÃ(“ZÔ©ú¦4þµG­}*f“†~8ê“êo„X"€–4^Fkѧ(bÀæÈ*8on¬]‡/ '!H¾óP~P-g¢Èã ýŒXá/ÕÈ!³ Eßvœ±Æ÷uOu÷Ø~ïzŒ|áGF¿¸8s×ÖÖJ0}>Õj¼ ©Iʒ2 Ésõ Ò⧀Äî2OËBÔðTO¤±*nþQ¼k“ÊYmµÐ»: +–ÈäáÓö+õojÌêÆ60V“š ܆~e” +¦‘NᑘsbO•(b'm‹F‚op_2‚žÔÞ¼°7×8æ+… g#·ö™¨}7¯ÄkòæŽ9Œc µ¦ÿKCóÞ Ü5¼®O+ÁUxvÿÖc˜ÍtYt9¡àæ=œ—á–l[èv©!`)O˜À'ÔN´ ±ÄSWgy˜¯|é‰6è?Öð ¢áÿc´*.#µ–Ù­†Šõ|é)2êã ×ù=)¼¥v™y`ÊSK…—»ØÅo0`¤ùôîJ™ +8Ù Ea.÷,뮯ڡ—/µð¢ÆÚЩ ·„Z?Sªv0#^KÕ8÷DãhmJÅÑ +eÝl|2±š?Pîäó@¿:d°¹jfË!ƒë²áS$$ëR ™é‡ÜǤÀµCgT÷îË*HÒòy¨µ^¦³tôMÓâÓ2xóƒ(„ɳyÏAJs§Úx,ôŠÃ² aqRDür7DBBSóD~=ȏ!|zÿ’Ïpà 3#³A¨sEh»WÎJ3TduG¾OsE¿^BØ4ÿqo­Ãã>A÷—Ëö™¼%læ\P¨“Óâ`l&ÞBl44[ù!™áIõ‹Ë¹½Êý*§ØÚ)gà!œ FA´Ú‘°æJ%.c)t*WI"ÝÔ#ç`ñœ3<‘G´ŽZàzFB&pâÆÊ 7•Âë©Äuð ?ÊÆàZ‘¼°mÏ´íûÜDŽO°üvòpú”îZido´§Ü±¼ öžšØºÕ𯙇)0N¿s +sãtj'óÏ͆ØàÐ:–U¸¢Å¶i?¼ÖÕ/ž%¾¬Þñ>Ûæ.ôˆ&瓗é“ã2àï1`EÉqü¹•KYrïԇ䄒v9ö dQ¨+a2•CO¡¥4Ù̺*N ÅçõâÂÕÑ.t^´$.™ÑÜFóV”\î̧{¨Ê ZÛ¶’³Vol»®ú§åj +eˆ4àªoC¼.ˇ¾iœAÌX…Õ`žÿÊr¤SV´ÕÒô—™:醉.¼ÑL}ù=V.A©Ô!ϗӂ‡»t‰ñŽ!(jœ½‚F¥öUÆZ£'cú²×§O@Aº§Ÿè5D·¦kĤܭöÞg´”ø™=<ß_õÿós XÑ86žÀ\UsÚ!pµh¹*G^—©C·j+"g‘±°_:ãÚÍÓŬ‘ÝÎ"å…J—ÝubឃS rUåÁ²¬¸.7>Òôo3v5Üؑt‘ñC±]ÒÛÄ!?J¾:¹–È£¬2mUPs$įðιC1lä:܂2â¶ë:²«Çj:\ÿC5ÿ|;׫Ñ[ó†¶ÆpKÐë ã›tqöÇC¨‹`žþòŚ¼)42Pã¦ß—¹F@XØ 4Šeщ¦`b8®¢)¼ Wˆý¿Ø#—#rx-\ÿn™„)ÊñàgÕo„F°ïʶôTð•]eä|ø¶u=p+ã3ÜQèËXNƒobkzêÉÈk2‹ùñŠuؔ€¡ñrî[:’"RK¹…Å?¹¬âF0Ö6ÀÖö)˜ÌÐÅDxeWÐ;TÀXØ%û^Oê†ßÕ |ÚadÞ(l>c՝*×Ò# J`øàø>dB¤uðßJÑpÉK+õº¨Düó·Ie-‡àŸmÔW–ÿ°®Ï¿ÇØÈ͕e€ö +º“ÒO,øl‰ÚœÚÚ»‹{]ˆ}º j¡h+R;©V LûoýH[¢,© :IƵ¸˜ü hØI"àK8qk#j8'ôù¤4%Ò¶¥µ:^‰”qْÇ ¤r½d…†©Y¦ÿíðò]¯Î,èÛÒ°ˆoG³Óêƒ= ºÓ8Gf*°ë¥Y—(ƒTE‡Í:˜%”@SÐh‚7旧pÔ߇/ò±Ö·üñ«.‹Œ”i‚ËdÚ̉σg@wÅAQ¶ýzBŒp­¥òƒ¥í—å‘›·«6?7J"NԙaÉF]^@°UψÎO„âf‹T;•ÂÁÒ@“o)¯Ùç6œea¿5¢p¦—ÀghL0 ={ +T»Ñt …Sç4ÎUBL¬Â¯¨V0ø+ÐàŽ”½Yx—À?C¹sä@ªÒ;c¨“¾W˜°®ÜáÀÆwüî6?(ÔFâ©Ýt熶—EÞFŸãÀXñerº7’av|`õ˸ž¬üåœ1ñz×) ƇVà³ I‡~h#º˜Œj¬’m„ƒxÀÊз 8¬#'¡1®E´œÔµ"íBn'$Zð< ²åƏ\øèk3˜]QÿMÆ ™É½l éþ>ƒPªð;ëÅYxhí¯8ñêÍgy0fØ'î¯ç ì& ”~,±&±C„þÀp|奫7~â‹ÛLŠƒ¬]`g;”¢“Yø¿¬$Ø%  ´å&Ø8I”Š¼Ž‹RÀF–6Ð3áQøŠ¤/-„c•q.çÚ#ºªQ@Š–àØÐð ªá¡,ërö²h3êm ’ ùa )45 „¶0X ‰:è¬vU±¨®£æ*]”,ÖUqƒé}­n"·>ö ½PÍâïÚ·ŽÎ‰E¾i~F»- Þ[{‡!1}ii7o)¡0O|£ÏÄa&.à!ë‰.2½ —÷™Ã.`˛ÉáÝe4N"•>úS¨śԵÇ.Ä [ ª»›ûå=WQ๿GcpìBæúž¸âa²³ìæ,l +Q“‹Â3¢-ò÷ŠIã5¹[2õÆš¶„ÉÅäÜgtÔÍãÑç´P¿baù÷â¡ù~+,uË&lnMÜP +·û¥ÁŒ<•å6ÌãöH¤‹â€±úÝZ¤7– À`TzÏåäóœýˆYâZ¹5ƒÙ.Ö,[Úó$Mt½Gv …ŠÈ÷H!c«efĘ­@X,Ô¶‡M•5‘øώ)˜¨ŒÎrÄ@Ò¯Û0Lb²R1ªä᫗Þ\–DT°„o¸DBo(!¥EƔ7¸žñÄÀNJ®êreÑ[¼i@…ïHŠlWo:Eíz,IÙu9%–Ö›¸}0{ƒßN¦Z¢§ÒPãaqF¤ª>ü1íìUåÖd뛜2¨ò¹}÷uQÂC)œ÷#¯wDléÆ_qL3ÎÛÒZåÑëfÓ«{8 8;DVgnpزð6 Ïúv®§ËåË<Õu_.sèÅÂÀ´1ä\êÜ10²waó,õ½û=Á­Y]ô=t0U–Vþí ‘„1Þ©‹t6À¥AbdPPòï¢ðcƒÖ†þN‘ë¸ð4R oaš>^j’ñ%tØE¦o³b#òÌÝi +WEâÔ]ÑñL2ðÎøU†×öws§ù8.ã\xI)sè–5®„Í"î³ Éà”9…çm&É¢EI&;¡akt͖» +/Ðàè“þ0¾w×cåß(å +on0àqZnDDʉ³^DfÒ¯(\…Æ'3É·EsÈ$‡¥Ñ‹ØðëZ%£´+ýÆ P³ìÁB›(  5‡¹R‚·3ƒ³Ü 0XQË¡½úë!t;Œ€Y‰«k /cv*œP1c÷±uÓè,¿CtEòOø@ì#Ó3ñÇ á‹nsGˆ÷raÛW:~_|ð·ÞèאÂ×­'u.A ï¿D˜N*α”„Ôò•Ð}°†W¹Õƒ1MGÊ4•ÐSK„“~ã^§Kr°Ô@rz°h•òOP?±Ë@=¸8‰ò¥í«¶fúíĝ=Þ«ºÄÆÖxǾÿN LÁ.ó½ÐáÍîm·k©^A=–íšÞ+‡`ˆM¤Eü£øNêo ù¹Š£L• µ ‰pÕ¹ü¶‚¦1·åvÿС=Êön•Äþ<¿Öœî)°$­PFÜÃR5Ÿ·¤‘l…Žð/åòý„¯®XMBIŠu­È¹p¤:ì| ý>û¶\܃qÁrõ/¦0åVÝ a–Çôr—øÀš‘ø6jk%³ÓÔôxzt GêÉ ‰yÔ5ýü4Éi¤Ç½`]ȇ °uM¿œ¾ó¢êÚÃòz1¯` ²Im`AâbÞÕ5¾ëìx"ýò¬`õÅú¸VïdÍ-ϋêZs¡ˆB~}b¸qy°JT„^EÆ-abàj—æPè™ÁÑ"°P¦ŠÜ¯®±+I¡sÈЧflՅcj5ÞàÓé 68ßrV£>.adä§ÒÚ5á)Ͻ_Ôíq¹¡ÀéŽÚµ†‚wþĬÎFŠÛµ¶˜r%°‘sV»6fʈ%â|ÉV…fLpÆ®¥´¿î™ôX ¿)؅©ëûIt¡ýÅ¿@I®2IíCРΆ/ÏF䣗VÔôXÂñP´80€ªãžæ³g>,à+š+Ž~#A½¡ãJàÔÀ´Ã6ëwë;¡Ç µv_Ì{4C€­0›ý»ƒÏ ¡@Qñã5™Â<)·p½w»%RƒX.°šË”m<…bð9nö _/hEÑûf#û> ü”Ð%³o9DÜ»—0!:P05ûiç‰Éš°1WÍ&XWK(94›"1ÓÎŵ ×±­˜Ýã«*¢»:<,I°–6$Ɍ±J|oòJr,ßÈáœÜ§U»Ÿi¤ÿ™½`m{2Ž“+þ–\"“rw&ÏwŠþüQóMCq晸 3cto!ÎÑ{÷ù(ž‹Ã pñô6$áVŸË%’AxwXԃ|PäÃ=:ümqCwт"ƒ›Säp,BÝ$̱Vx{$i°äÔT§‹yòVëEbìNÞT—ÌX‡Ô'Œ t9ï_Uzòº¯)bÆnÃñ®ÀÀ'öEÕÝØ jDí›[K‡¡”î‚ÏCY +u +9â mÈüˆk¤Ãè"X‰Vô¶"S‘x76NG#±fÓhV\PqRÚî1­ m5ß1{é=s˜ˆm’ÿjÿWâÔoèô¤%B° êP¼—ˆO„©Y=‡#¡˜8°‘‰Ã:VNYÓLtדöŸ‰S#‹G,ÿÌ9ìDá£Û]µ;Täd]”Ä­o°Ô„ãÄAô†Í‰v…H¸´;â(¶Dx"”iÓ¼¶`Me€©‘|ThrçlqŠNödEs6†6 °{ëŸaE¤€šYõgC±!00,Šº¼…b„Çdõ|U"ÑbiKJ̘ð Ð~ƒ+EEôÔ—b®ÕSì,ÂüuS¾õ›â¹Xê°6"šd¢Ÿ5ü Vg¥ý“Nñ'6é˜ ø±"¿¹m®r%.G=ì$pÁ¶®PgŒy¥ô¾«ãÈÃç*ÂDgV®ÿ«èq‰‚Íã`Åý虵wë,A¥­8xm&MìÞ·egÝ1Â鯔ÙQ¼÷‚E”’°AgŸtvUª%G25 ‘G3.èñPïÇu.‹­žÞ΢Sû"1ÅÞ¨ÓM$^Í¡ª¤eãàWÕÛxiî’'§+`cìœ;U3×i¤ô³€µ9Ì$ÛÃ׶¥œ–. IŸ©ÌtB#Ÿ+`Cð·[Z‡éT÷›ŒÏHV&ž´_钀Ï}õL—ëW•eN±izÁË{‡±LOQÖ@«ìî…3ÀÅÃîÉPá-ኦ ×ët/ô§¡–´>ÝI kO§­háüW*Œ8O¼P#QWÎõ¡8b—mÂEHwüŸ÷¨'ƒ"°ƒúØ.2ö *Cݺ¹·+ÔÍ¿$H½t'¼%bM#«WZ%:CHXÆKþDh{P&ÚËàµå}{ÉM7>œ4í¤zoýìÿ-ԒŸ¿O +ټӟeÒKPÓý(›Ò +"SM̃N\ð&øǂÇÕ QŠû/ÎO(œ‚):ê" y‰õÿPˆã¥ Á@É&ÝÐ! +’5TÈ\P¸¼É³`ûuƒ3!™PìÜÏ°oa¡X×DVG ¹”W‘&NXG¢H·Jv|•‰b¬ÐŠ(à. +d™œñ]cWùF矣LrR"9­J4&ÅÁ£è@’l)M)ޅÁ~ïJ]«Ðƒ±\°öŠÑ‹2ÅwXŽh4Å]TÙyp³kkØ湝ÂOBNâ;v=EÔÝ *n–¦û|©ÁÄlm¼¡3 ;óv±;$}•_ŽŠE¢ô¤Â¾’§xû!«Tœgßør*Êr–@!ª˜ÆÄðxü­/QŽÍã:ªÂ+-'Ï&U…WJè8³*Šv×¢“ß««Ù°qìºLkõBèA½@ÐÌ¢O8Z? ôZ®]E{TLȲ"¶y͞ŽR½2µBà‰’+ÀLQ‘Ž„¢Û[ÃjMx+¯(/}3æ^ñ'[Ž?_Q®¤÷[ÃRý¾xè*âû+ª¤"é#PÊmh‡w`Qe‚òüw@ `é +Ã<ð9Ó­½T™m˜õ]”Q±p°õtÖ÷ÂX`MÝ¥À^GcÑ4Ö ‚æX<"Q¥ú¶\…Ž‹<©…a(fÂÇ­µY·AmŒ0‹ûœ›ñŸ¡›üą.ªó8êcÑáíÄ+ 3ðÞ6+i+Ø,4 ²+Óá~dx쾂z˜qÒ1[¥ c(pÆxÑ* ¾ ÁÇé$gç +¹2htdeÖ°¥³Ð|d׀KàHfñ8’)$SI$ÿm¥ $Å,K²5ä—I’ŽIæR¬è e°žœPÂy=ƒäö˜J ŽŸŒÁ(É‘‚"õ59UáüªM(ÂMZHß +ù†Œ„lÑƇ„‚ߐÜØi@iÔ±€È'²ü#ZJJ¼°| –.Úzåæ…ÎSØ í…z²Ü _õ ¯:Hžd3§ ÒêX ¿™¤Êæ 0œ3íÌ †êMðE`@-ƒÛÈ^ÜOžNÔï>ºhlb0܉ðÈEèÊXèB +^´íHë³ZS›NbˆÂS¶RDví5†€(j¡¿ch%Ï*C™Žúc^œˆ×¡ƒ8Q䆊ùºî:’Û¬a5lÕ*€v»HC.Ȕ!&£—vP[(˜ÁbWÃòãBÿzkƒLv>ü·È;…¥ipz-A*78ÀHÀž×çáz㠃¸áQ öûB–œf +“)"ýk„ÝAQ×ÍbÅÞàú[w˜CAÜxš¼=¢¬ ;a%­M8‡*v™âÊé5¬Eq¶ýÙ/m‡ö½`£Ãj¥¬/~Äb* tMÆí³QߋʨfŠ "¾IõÐÁø;Ò°\S¸K½Ö9Ö%_-Ηdr >àDÙ¹aã*_ÈϏJòŠÆb0¾[ƒ=߁“Ô×p‰šÐ0l6eÆ*Ø݂փóíÔ|Gž«9 v™ç’œ£4£¾jøÒNP.ºFé©±§ ½QóD|R$Šk®jXا‹ivê(]cTd|H¢|¾â²ËÐ[ƒ<¦*<Ö4’K[ƒ+Ô÷¤Ï툯É^¾¥iÍ ð VȾÌå¨&‚è6ÞÐyŸd@H5±?5w×|­êîÖ=£ˆ;øèå*ǤCƜ췡fîn¦–>¶"qxò$>aVNØÞßï‹u‘ÂNg!OMÓ[‡‰‡Çu¦7RÆÊY=¿b|ã2J Ññi9åP¡Œñn Aƃ69Wj+bk\ùê7¥B¹b,¥´ŸßtÝQƹväõ“Þ“P ­’_V6«C„” sá!+ý0Ƚ"ƒ‰%·éi +ì”ûºVH‹¥'â˜êÖÓCI֍'>7&2 -€kÎY³0š=¹ú~Z@ž+’¬Æ{ ÅÉ&vÌĆg«…?øNÄ­f‹×ËHØ@ÂCiȄ&4$;¹ÐeHêšQPÙMö@È= ª ”MwEî±l2EI´"5›å ¬¨"qÃ:BM§QŸâ¦ +þÏÒ|TéH?̦[ñ™è èþTÞч +ÿùdCa´‰ßݙÏýOÜ* •YÏ€Qç#±„†1×P ỡ,O5Ãß<œà%—Šn>2ûCðn¨òç¬1§åp[ÇíÑ?5¨bKëÍ¢>Ò²’vó#-øë®E©’·Sæ†ÇÄ¥²üHûÁO$›Ð´KÁGü/0ÔK‘§éµì¨·To€v½ˆ|] œh¸j"+|ÙÐcÒñc@DCÅ:^Påèhž\]¬í±ñc9a må¹N±ŠH$£ÃoCŽIúÄíE\¿¢!¨ïxö·eæxê‚Zõ¾"Ió (Ô|âÌ‘›†ÝîG9Èhḭ,rõ> ÒC^ªî¢àˆK|ýjÕ± l¤´¨HªY3ÙëT±“1F!0‚ þ˜¢)A—dÁ“@Îkʆ||x‘ÍÈ]—ã¢80E]ÅéT óÖ£ýBi°<ä ‘8!ĸ¿Îat@܏ZõéüÔ9èäÞ)Á³ÈöjñCÎ0ȲM\ æ÷âðy²|¯E2«G–P©:ÐëU»Ÿ,‰ÿ€š””Là𖭫»g§›1'‡}±Ž]ï»@GŸÿ¯ÉlŽùzáÇ?`²²·>è+|°I:œ2é_—’šWœÔïtӵϰÐmg¿±Õ¹6¥•S¡@&¨ùˆ¥¬ ¨P}Ŭ¯H2B)@AÉìDTb¯zõ—°°˜NŽ6™d”£DTH-Ež»Q(ZÇ®c\%Ñ#ÈÈÒÉåcÄ›:™¦Ùlv“y1;êòÞ]d¡@2ë-þ¢Ë[\AU²IàÑH9Rëö¬óCÊ *}}0ÕxàIìâØÁv‹­ùà ÁÁ]$¢S#Ã}xù5óWñe¥w ̼;>&ßTé ŠÄŠߺîÂP¾âÏ|„ ähÛJ@ïádé*hE‹0Ý- ’LëÚZf¤×ju¿þTû.5ŽÖò„ééoAV{£ö¯$Û%fdÚæF:o؛8ð²HÝÎçëø‹zÑk„•±øƒšZvÚþP0ÆÇ"VFjmAJ«E‘ß.#ßO6‹;¤æê}ê¤å–C ? 9û+†±']cž}EDv†ea¬Ž¢9fŸ¼†[ÿŸ3ëj(L4€pL]I =u¡2Oî×7ãÁACÅPNô“ E2G÷ë—fséFQúfùLJ˜|þÖn2Ä-QØÎV Ène\v‹ŒºQ”ê‹€c|°6½7Z%{`e€ð`Л0¤?i:% ëËÚ©côú( +1ßç5×ãb,ù,r ç0$ÁHÆPã f¸ï¡@Ω¤!ý¤âÅL¶y|cÕɟ²;l( d;K¾“X!ò8Ë÷oQÄ ‹CN}£<Œ ”i¿*ç0öɅ‰É‹·Ñ• Ð(–'ÀÒ òxèÙ¤Tçý,zÑÀAg¸á$% ¢åD¿M)I&¯.s½ñ׆£7ÿï–Àg’u÷Z™ŒéÚ^¾dÅ ùߍЃT„¸¢V­1_{U4E€–‘ +®aXˆ/_P3Uőæd>:Æ-J‰B‰¸ôO fÄ۞1Á;šâ²Î®¾j;=”Åþ-. ‚]¸œÇöÅFäZGŽ´!Ò"Š˜¤ ƒèÁ—±áÇ8z³ï9uðàØp¡lª¨×°¯w¶r­YÒ£Ò6RA€‘æ"¤7MÝ"0Ž¢šI$Ï;ôêZ4FvO§7åÓ ‘ؘ +Sâl+®œ˜ žŠ i´I¸™VBp,'É(*=ñ6ÒO£Ñ„‚(u†ÙPäñ@ªsíÎI‚«O…tZS ÀÜDÖÍqž18àÙꧡO¼iS8•ï®d~Jã>¾PÃùãeIlÜ·)_#§øÚÚË8fºû!LJ†ȉ† È3í †È•Ž¥5_u¥5Š”]º—eÁ’ŽË,‹gõ,Ðh¥°DöÐH…ÈÈ=¢»ƒ}gtYQ®JžeíCd°ëyÊÍÓfçÙ«:Ü¥Û{ã'òø ªqbù̅gèbF^ Ü2´$aÿbxÔ¤©eªóc€…¯nÆSpø"RÊ£õ3|iðUøìÀÍ—ãõºN€ëo$Ž8°Â/$ÊÀ-…êc*2øµñY8•ÊžOµÿ'd¾ðÜ6r©´£Y×1@I;I‡øC/o UêM0¸]…Ë‹‰>âäÞ "ºÛ6;‹#ÁqT@ÚÔÀ;ڰ؅€‹EÁ(¡lšÿ»Ëog* ±6ZsöyîI”ØÁ*ª/i–º“Jiªu\GèsÄ­ó8|ü0;Ѫå<ò£S¡á?ÃÞ5ˆs-:nû_2º}Ò´¹ þuæ<Ç3R.ɦ‹Ðudא^FÆq]1rg.xG‚\o|ÉA¡Ý':×QPxä£F ¢É?ž36~!GttzõlÅñ°HÂ[vŽ[zWúüYCóhC’‘ hòk…—«´Ïs•õ!Äo‡+~VðSM?Mm'í¨€e0Á ˆ ÕÑ +‰ +‚†Dg„ÜƁ5tMÌL÷ AŸ*Ê´ôªåáqÚF@äÉ¢ˆÂáü¢,}ô´(b7œÝ`s<µ…!Á1-×ö':BÈâ—€³™k_¦â“æèSÂO}Nú¡u¢ºžÉznè¨z 1¹…d`›b܈0ݪ-ÍUÛ¸±uÿµ ‚Y$P/'ƒ&euÏÜtiÎì ˆ؊‘V|÷ÿ âÝäއrݹur:ú @?,¡M÷lóÜ>= H #oÎø´ÊÀ8Êì}¡›lÍEä +AŒ@¬U@è÷Ρ¸_hvLQøf \ÿªBŸ ¬Š§‡1¸`³IcÑé¥{ûNž¤;7Nšt¨þ5#O!)(ˆ2Ѐó;ÄÐ+ÐqZ¸+#.†ÿسÃ\L:#[¨2g14’¾éÒ#ǓÉX+\ŸüÚ1à)µyóEã9&ž\€?}4Ùy§y]µ)T-Ÿ[©ÂБ3‘VûÊûŽÝE‚¿kz [Ææët¨VÌF9Øÿ÷ÇgSws|ôHkpO:EËÎBXíN„=‹½t/–BÇ&uƒÔ[EE†DÛiyP>‚v‚—’,Al"qA󣲿Æ|Ât”­á(úÁE4l}¨G*Ó&gO0‰Ô$,s{è¦vð*ÆÖ~ܾg᳟Õ]°ü™IšD.ę]&uáN4’]0D$§5‰„ôøªZ5Ñðé+{‹'‚˜;3¢""ÉÜ°H¹\ë]50â­ZÇ/©”.*V +­ü™Ѷ‚iw_äÞœóQ®¤ #ñ_f YN3=Kïø LuruÉRaÑÿAV£+YÙIéýPaZ=*› +aŒ|r?ž;àGþ†ÔX­ô}pâ¨MǓg:íÂSnàŠZ7/U-N{¾á#q0QIøI|×p1CH^ù7]ÍR䃸 ­©±x¿AO9uú;;ޏ&àQ ø³|èSês®2ùÙD:Ì¿Ç88Ÿ§ÙÙÒ$äþià­­ áH*I#g„U|eª3J‘fšËp™< ¥¡àl–ÚM[ ŽAN­ ÷Oᱡø¡²“GYÌ,»òõ¼^y7£û 'ΙsDßpÿè‚ÆÝc‡®Å$ p’( $ ´¬&mb\Mô„ä®þÞ¥†ˆã)î×&‡Üaì +ÍíãüŒAì+!xÅN°eÝ\•Ê7‚ +0åüË_º½oD80§Gù0b÷òÁÂm `e8wÁ˜óºZ:#|2’kTPÛT$Y‹ö¯\Âq4ä嫏H[jÊ xù"[­\q÷Qð„ƒœ)‹'€í÷ófÿwǁUÔUoFÖ0"½ª@/OØÉ,—€p‰ê¹ö×(Þè¦×8å¯J; +¯?YêÌÿÓõ0'‡Ùù”øxÑdK"‹Ðq¨ž™C-Nôµè/ÁL‹3ღQ Ü[ŽDMkbñÞg }#·‹äÜVO f¡,šâ(et•O•xÊ (’æŠ'Q(сO˜&¬·^=xÏõäEh–ÓsÄT—‚*áýJÖCô ì1†¡ÊõpAMÎBg¤kwÒ=!\Dõ`År¸ç_’$ò´Ÿíq…¦æpƪÈ÷Aç¦2>† Izà«ÔÃâ0"ܦS÷€l% è» + Åw$u@p?'˜òfRw.T”Òƒ'ÿ|:)tˆWˆ}YÆ@~Âڙ:`Fß>ßÃãÁ¾%:Rgðàk¨¼d‡©'4¢Œ† ˆ¤^Sh+䧁@ûœ1W‚«ŒI ݃n¬tŽd1çPµ֗"æýDQ±ñ;ä‚ÿè“öÆì_4,nÙ$uD ©¡‹bB÷^§Ôåw‰h WÍÅ$ðXè—59Ž¸­(ôå#AYÿÅ╊HjIg…GJD.¤IH$£…q>ÂHFt”ûó›Þ‹ bj©Éƒí§aohè˜É¼~ísÉÚR›ŽÏ”“±ð(SŸ17Ä@ˆYd/绘¤¼‰ç«‚]/þSÚv ÛÔøÖh`‘…æCØMÎë´`Ì Còãz² ºi÷å$©ÚL°ÄûÕðÇ +-ì;u I$Á¾%t4ü‘ˆÞ dOd”½ Z»>kGOO¬°Kêêźc”­Î#Ø ÊþqñÿR:8 –,%D﷈ñ節Lp5KȌ¥ÃA'?@dŠ© Ö®†.pp$n˜¨/$5v†‰°]~¿F*5©ó}Ö¬ÅyÆ­É(O¥‰Ö1è:S+p+(¬gßûT7+û 4nj´ÃØãMbHvœ&ˆ›¯xnwlU—f!*˜ÜÒ7U1rHxu[^)Øû˜õ¼%çv‘¡ÐëgÔ½Waæ,úü¡XÜᖠ+\ÁÐôŸeaÔ…%À¾ãq$LɁæ-ŸUÚ¦ŒâèLoG\/ ‡© ­ªØ¢¥:õ]K€MFюÆANKÔ aŸBÈ*ÚG˜y~LT û Ã6Mñ‰v>£æ"변â’1icŒ4Ë(—:µ 2/×xG1øs=©êq{§ jŸ¦¨£ 'd†OÏ*gêéNÑãÉX§ÝøÃDÆ\æÿ¦†Q2ç9u ;ÍNfa=™¯ê/H藡>QEÀgÌx¹î͆¢Å?Ì´3û¬ŽÓ_¢>/:o|d¸±"od)MAL8ä1Ié(á¿êSsEv8†iä’ä‚uvfð2ë$;rÁßTòN4ìümã”Ër=Xï2d~F=Š±l÷{ìÃçØ öŒÌKrÃ#g ŒÉs#P;4Ðvnºa]7®¤ÖˆŠùò,ª£m –5h0À)\Å k±v óÇ ðn8™ |#gÙBK¤,ÒJð¬túnHª”¼‰^å$4 $Síò6x}Ç ÀQk¯’}OH7È£Ðì.bl äý€d‚Ÿ‡­Mx?´CŠF5(ã‘õ¬%G‰–å€`2¬>,›E7þRÀ…Ÿ–ôÀC: H¶ò*Ï^êӀ פã,§_ +h¸tÒÍdÒŝ•{5†Ðôá ˆÇ| ðcª-¢ôČÞc¸…nµv] +éõÒû)%÷çBWÆ0A]Þ€®О`ÏÒ@µ" ŽL®À(ۖbŸ LGð-þ’DŽNiyGr/‡NëmøÀó8k ڎ`ƒo,Q©Û×ÞNEy爱‚@ c]tã­ú3^ã(‹TȳÒvN:ÄtñŒõMt ¯\|uç߬m‹û«n¡P@&ýY§eûÒ/Ð99•yjZõŽ5{•ÛµL| h-xG17´ˆ +vq˜ÿuÞöº°å–ËÏÏ#ÈÚ¨ X+‰ïW¬UöWtð>H:yØj4ÈÀÕ¯éÔ»µÀm3¾ ‚œšhjRs$àƍ¬ↆb#eŸ´SZ±­~»ÿ[¥Ì<؅›©Kr̾ø2¹lÎÓ«9ÄxuôÇsŠFŽE ®zEÏóB͆–ì?©™!죭”Ã8")â¾Â=KÙ8N„Ô+¬ÅSÓ:A­tæ‹ÏÃÑ BÈ=ê¹ÿߞ@F\ÚýFNG¢V‹[ É|zz|ÞrD(ˆ)|ÙËݔꁹ»ÓYW™·ƒ¸$¿„šÕÓñPj µ€  ™ŽsàÀjüÕzÖ§¹h7[­Ò2 Ȥ@مIHŠ±ò­&Sí‘7±œàpKÀ„×Mð› QùðÜZÌDD=—¦»  ບAw(ÿCÆýx)pd.¡M€ƒ­;hË"À¿ðeFWVnBnnóÕAJ¥ÁÉÃá·ŽDPi„³¨Â0æ²³` TuÍþ=jé„ÈR5#ÏË ¢{G"™Z¢mb:Ï£°©£r0¸âvR2ÿmö ¸½¦ACÇ@l( ~\aˆí9ðÅ1PŒ Q§ Lµ¥H"¶n6R!­\e®ï¤? ÌaO.x_ý‚ªYùˆUε%›û$‚~_ës r/€lé?5ÝÁÀ¡o% Î}ó r-¢r%]&p™½ÑÉ©’0I@Ý^†ÿ‰/º|›#>5NjÎ֘l,îä'Rºµù·–Ð*Õ +Eê¡t’°TšÝÍŽÜ ÷í˜É‘øK³à¢Ø$3|kD2~neiTvÈXþÄø÷Ȕ¸´ó­üú±Núן¬ÿü+Žså˽n!ºàVB¼¦™…`¢”_Œ‰¹›%I ¡8ù¤œ­eËàÜ'؄`öjò‚Ú-Ë?˜¾ÔÅ-1£æKål%y‹O@‹°a±[çi3€šH ÒÔ;6áöj—£U¯N¦Í§”VårüZ*è“ùØÂ^Vm¦ä>¢ÖB{`lJ+:@Î9ðÑZGæ¸lQÁ¬å+¥yÿÖXnaöà ѯÌŽ*êO°uÀ,XìÇlÚY! `Úh¶=+…ç³Ðk–eÀ­îqð{œÄ­¤ßWÁ·´°Q8-¿x¿Áž…µhßS´Ä†óVþ¡5•À¬µs§²}ΑpZ"?Š¡i’‰ßP÷kt±¾ôN½ûÊØ°æzNÊÖúööµj@®¹a-/NFDEMX4ýçãe k~R÷ï´°ÐêÎNüaN,Xèá¬ÃªÅŽˆU²tþQF™ÉýÓ_…yï×Äv|<#;åO²"ê,se+‰yê±Îán®"1O…äöÇ(Ǽ—S™h íõMZoÖý +{[ ¶nŒÏã“ó;‘A9À¶h9÷i¤»P±qÐèW‰s Bǝ`ö%nó%Ќ/– k¤?Ý#æjêÕ ûÇ4¶êÒ9>Žc ûk¹ˆ‚Eø^øÊx„áÙ?FÙqh™'ž•Æ + •Ãà]¯Í_Âòê©P:f³¸Nú„ +>B¿ã–ëáBÄ/ÅôÆ;­|o‹×³Û‹ÀƒÝL,G݉*©v¥)»PǒÔë,c铙Ac5¦„|=@›Ç-¦¶¹šk«Ñ!@Cy¾x=çûÇ[4‰žgq_`÷F©s¶º>«]:Nw!ØÑ lá2ö…øËcv _ÃKD}Z†¦ðo텇p!Œt)ۀ&à|^ù“-­¦CwµF(œ•ÌO4_‰Âñ`ÿ!xZa*zuÐÏL© +.-$¨Q¸¦”ÎÈ´tœæÅ%Œµ +ZH/r±œuÅŒ2©ìéƒFŠ½{80Åû²XT²] M:ñÆ1ÙÐÿÝÑWÙ`¤5h£ 4ﶂ6?ÀR8óO¹itÿ¹U I™|Y“üzèÃ7ÙËZ•Aà+æ’Ö¾ŒÌE”§Mg(ÁQ®ê)0êç¬-lÌW-O¨“n~!Ê)¢„EKÙqõc0tÇè{,àÌ"gv֏±¬t)ä£}ëě ·„׃(,]Šq9…#Cðú—“V¾·SÜÿgF—€-1OûõÑêÝ=LýÂYì4`òáâð0AJ’žî0?ì;BÑø£Ø©p šu.3‹&n´{-ô8¹øDEHmgßq^+ÚÒ`җ €CsäÜNy‘”Øv¼©×66:¨X|f,öOX–æ9nãYeFñÀ™v‹êüM80%sà³ÐŽNὤ,ý…¦ îoÈÖÐ~Ï'åX²7 Î¥W¥eBO-ex+êrÒÈÔ%šCýÂFÍiÍõ{¨–whQY߄ú…P´íªk ú)Âr˜QÏ+]+”í£«E5R~q-‚ëŠ äJöé@!ÐhIPÝ¥_BöeÛqZ¹EÊlJË¿ S$ÒC+-A~¸ñ³.µÔld,x4t; +œ_þ4{lÑ6aQS¡·¦"›JÔ}J_š[†{»²fåÉçqy”ùëàNà>™Opš?ß *í²O%9ug¸¨}¬‡óJÛ«f<¾û$ÁJC=º†÷IØòWá¿Kÿ~Gcӓ«½X 0„”RÎ9“çQàŽ}âpŠ>søE_»ñ9.ÁA.úgUC’¶i> VÞ Þ´X×s–ii튊5ñ_#wæþ©%º,f“‘–h +0 1ÿØ*›;ƒï*gÅ, rId×J‰P¼¢¸ÈƒQ®ÔÑ«dQRkÌ8ú²ÕŒˆ ‚C¯Ïa}SØ6\J\áÚeֆlJÖÄ+>AsŠŽ‘ýík:ý{‘³pLJî'„q¢œ–‚÷Raè Øt(&² HR+ÞVõ9t¡$J°NKzš«žƒÞÀ;ábY<±ºeà¹á4°^°ö³—ïi¨‰êÇQÉÅø™š–Œ ÷ƒª9ƒvZ_ª˜©î"ÜèÍ»‰|´‚ÒbtŒkËyu_ÎLºqyë9ÍY›#N·Æ7ßc2â'O¿HÛ¿/C™ü‡6-Æ/œP¾U cËÑÎ@™ O%e€8S!ãb-¨#9Ÿa²¾˜pi¤J*C•›Ï¬²‚à¥Êc;ÕB Ö_}œʸl³mô´q9ìDA©[ä~ýSMNé—=F–‡Ý¤\µIHP °6Ô +ž-–Êm0È4SŽCÁÒ]^¤iöâ§3úbµŒ¯Ä³ ˜ú¸F‚˜f9¼ÜÈoQ?nÅ£¶ÚÂ=áÒ&C‡[ŠÆ°ñ/X~7T¹*íæÌíbPÃä° û…¼¥1Æ/Br¡ØeFSÅ/L¯RÛôëS Ã_´Ú@—ÚãÈ?Ør å凁…Ì{ÚX\0ŒÊR0w±¨Â¢r6M q ƒ¾x;¦Q¯Ä— × y`܍ªƒÁfÄgêY‰û%Hñ@ubnX…aåŽa†ów𼀗۝~ÏîH(Ž:‚Ž£¤(³W9†ë[ö©9ðöôÂq4ðÃN’;ÓH™ùÁÈmoé¨ÕÌ Ÿ‚ùR 0§ï;éµ:¬ÔÞ»øà‡ „H'ûV”u­}iþxAFøÈ<@‘iä‹<9úTt»”ÒÏ>¿+6‰ƒÝÄǯeTÞ±¬4n€œrÉ`ゼmÕ;XùâýIw)Y®¢‡™^yYÿ©*Ó„Y»¨?p»àxÊà~]H¿>’Öâër`J…]¯ö +[¶W™ (Eêù*ý‰L²•.—g£9Šx¸ò˜líÁ¼iq>¨¦m™y H3’/h¤kȟÓ>뜚s„‘Guxd¤H'‘œÝßahbü ͳ\Ãj7˜~Kps$ß®êI@, +•ŸQÀßl ­éÁ#‘1¨Ã…Êgx¼$b^>x:Yá’ÀùügUÁĘïlI²&ˆÇÓþá+è¦oÉgŒ‰*Ðm¡–T3F˘"d@×u´Ñcþ—ÈkÜÞ´×Ç¥@«™öÊݱb±ÇÔÆeâÈi^ ¥^À°ïÀQLª¹jˆÜ Ø ¦˜wø²¹_!‡J_ }U‡vǬʬüÓ¤$¹ƒchÌJRJK”Ý% r•ÇOÉRSüÃkºÔÔB™üAߥC`"¦R/¼P¥ ãÂùƕ]CUCWú–-õlò‹ý`|*¶~S0„å’)I>³âvß3œ:g9–¢&zT=ð~wRe°Ïþ?¨°˜@W¹¼êz^ËÏÙß*°G°Žáõ4 ⁿ0ú}k–±ágÎ T{ŽÍ„Äüµ¡j¨`§Ö%2‡ÃãFP+ÆH–Sa‰ðHª—AØÿ ۀ”\±RÀ‚Qè&`e<7§…Û|xì<*Q›ÆåÎò}–0I‘O†¹£àÚtÕ²s㩐gËÏ-¾ŽyÅsÇw#jk“ Û½|I%ö«cM2˜r´Ø dÆìøq0uzqà$xILo9MüèÕ<\H¢¼÷€¼GÏÖí³ìˆåÁâD~$?šÊkN5W8j u*“àî@ñžeTš÷[îÕâ¾B¿-çü},æÜi‡î£KSBK~‘MxJ¢š³è´~]XšÖOep“ÖŽÚ¹|¶Ç:'û‰uõ=œÚNX:°‚C‡÷7wT¨½gN_4GÀíA™6 ­Œ *ÓoÛ?ÏxŞĝú‘÷ŽIû¼òQE~H1áøtu‰'|&ÿÖÖ]×Æxjûù€o¸Ûpþ¢¥Qb÷¥O}E3øŸÒ¶)™ }žì3È }°]Åsäé]mØOéÑ#cn]K–»‰ÛâMHâ¹a‡B#+*#Dw‚ û6q•Àë M™¤â¯éGoOOiþ¬šMæìðRcžô´É¹ž_¿«i´:LÿEŽœ[ÈÕý%øфA¥YÞñÏn\ók‰¼H*}t´•VB3ï,ˆVYÜosß„Ëôìß#†!lS@à£ïƉže™Á’‹¡,åáÜ3´°²žþØ$ÅF'u€÷\º"]µä ðSåÀ"„'ÕOf%e÷§±"N!ޝPԞra§´%•v)êú¯Ø+v#ÄÿÖ$¢J­ë+Àƺó/"øÄbĄj$®z äžÅ?=øJ|"zåí Kc ì²_jê-#\Oý'P—7 OÞfǤÏB©ag+!~àÇ#UÉÁº¸¸Ž¾!ϳ©$±w¨Í¬ƒ½ fã¢Q:CþµýŸž%t>³»C²„³•0EÐB^–ç1î‹÷C,À'}ñkª©¿¯¢fä¦cÖbUd@üõEŸ‡wL°€¨…ÎĔäó‹¥Æ­%ÜÅËNA~æƒÄÊRÖ4ŽúFâò¢”Gí I¯EâÁI\Wkýx³ Ìƒ‚ñåڕîT×HËeŽ§³ß„†l%4’= ֘DäTÒ(W !ó4R£Y0™qÞô³Í7J%jÊOŒÍøÿS˜wŸ™V0&.*ƒI×H…óÔÅ#ÎX¯Ûÿ·šJFKg}®Ìó5¼]ö{õ6;·Þó +ՙ¬SF>ÞÁ01€d™•…\;±ðd0ӘQ䡶ñ¥{’ì9± †7HÄh´H/ï“NÀýøêєÄP#,´,"z“\øNl¾9<ޖkŽì‚c ²>Q”Š?“.ú!á^ šÝ QêåC§€ñ'‘d­¶Ñ=ºùšæ*êõü{@Œ(}¦tkŠwún“q1„“ÎoWï'ºÉ[Š%ÉÑÀ"`õ·bîõï”Rw¥É™<x¨ g8k©umoÆñ8 Ðáñ›SD8o’Ó*bï›o¡ú»Ø +¤J BԶŬrI?:"‘£¯-d  ‹¢T6×B3œU7x`3äRm÷tg?ßJ=!‰ +ЭQ°©QÏÑ+Ž…8:4d{ζÃÁey5äO!µÎ{i-`Cžàác(µ»Nˆñi~± ÷‰d ÿÙèkr|r§a›ý֌-œ_w€9‚˜‰jæÂ`0ªùU> !½uh›F]æëO°Ùµð)¢Êe²™‰âã5Ð:Í#B¦fš£ÿ€ºo(ëPuäY$/É߸Êìw†|õ×¹øcìß7¿9*kõäën6,ۅÀÛܕ®±+ìÌE GœZÐX<ÈÊ0stû¢m„µTùP”$sYѢû$ +%;µ\Sš¬FîcÖ©sAFéü—š£÷eÌ¿¥Pˆj3YÊ'19+±B‹# m$,®S™S4ûÖN#rŒOðt£¼·l$1ú&‹–sqa¤>íš ÀpÅ÷NOîA½ô» ù*$÷%sNÖëôböŠßW4ø^Eem;i¾KÍΛk4_–øù6JC§u`°ë‘ͼ烴Q\•Ç±ÍÆG—  ÙI‘F$šqjÌPsh¿Ùù'´>“40N¨Ý®ío ­ûࢹösÉ藥Ïö6/Öׄ9–™Þ½Õqä´(FX[¤d¡ÉÚGúù,­ÞçÒ3W¢œ]F”ù%eõ´^¨˜RàC´=âãX ¡ £+;³RL"l_gcðå„]"Ið–.fvÃ^œ,ž$ðΛꢛI8À‹ ˜Övº /P ÎËr%«ÍšÄÖXIc;™¦ÐEwTÖà’ž¯G+ëe(Ù*ÈåµÖy’ºâ¼°cª-…æº¡7Z$¡Á6š¸u’áeÏC°~¯ÖÝ´Ýòh +ôŸ³B6TvµGSãðF»-:ñF Ù¬‰¸˜ºËž³ÔAîD•ù×èqë"2 +ÚÇÿ›íU€úÖÜâ5j|,ÉRsd)_åLÒ3ÏÀ­© Î ŽµN©RÈÅ?¹ÑÈb(F©>VùÐA“x/–Oh„)t²ô¬;zÛCBj|ø‚éZ¤€_õ(T =²Ý•§m®Ž¸üoÍÄ?PyÂ|Fç«¢§ä9.¤|gÁŒz,¬0×®‘öL³J[ˆ Àµ•Xqñ52EöÎ$ƒƒÅ Ï঳´"Ž¥¯Ã_ÊþE×ÙÈJ–YiÐL¬2 +" +"ª¡ñîîè㠓>›¤Í,Ì4Óª\Urñ7}?yÙϺÔ5k”¢™Ñ& o$9hy•ÔU…Ù5£3Ÿ¹L'¨TF‚z­M®E]Õâ¬íÙõëßäÖ k¸¿¯GÂ6SU©dfÒæDe*SQí’‰²•™ù¦öѸßÐ ÿ)“[JéK¸Y¿ðØ3>s¨ý ‰Kì›c>&®É~E®7‚¹Ü¯èv¯1gv'Ü׫ªúêk^}½H¯—Ýogv—šAÿ¬fýL,#û™üê?ñŸÌôï/ዝŒ} ?û½N¿×í#¾OqÌؾwF^XüŠŒ®ïŽÊ3F‘Ø(ž`@ † ”ðøW4 PEÀÀ Ä¿ãÑ÷GXØöüv¹nFξÉýûH)þ÷”pí\ô7µy$î5LN*(ø ·•¾þÆÇ¡eF'þóq9ÒʃCK-ÛéLÅ°R¡¥VLCTC~Çe©‡¤I[áHR¤*V]ŽLFDRá$ý½K*´¨*”Še¨šKZãBƤÒ;›Ôl5é°;)ÕjH…žT08©p¡‚ 5Áø}©?7HŒ¥þŒ?°¥€Áî#\€6ƒ2öWý ê0 Kƒ¨êT?ë`UY••­lf"'ÂHãjTÒv8D °Ügûλ»eŒàŽþXrJ(sDÁÌþaÈN˜udÅ CµÓª–ĉÒØÞ,¾ùl…Ï„¡÷ Õ:B|`øÅEUâªÀË`(£S¥ôø_à¦ßæ{…¾¼Ù~a]ºü˜&ÿ™¨H¯/Ì §…eãÆܹ€„8ä{a4I×^·¹“6® “=~hÑê‘û¶Q—Ãío!†gVâ÷Êΐ]H{Ú øƒÖš¯.:å;]`Dì]%Û<°Œn.Œ-ÄÑ ô5V‰Äidz uðÂha¿éÝBÆjD›[Ðlo ߤ€>c„–ȉäÃól-äUëÖjôYjá„Úœ&|ʼ^ö,-d¿(ȼ 5éÐB¤Ô›ŸÞájga5ýöÍR‰­™…ÊñËBfñS3|F¤ˆ]J€gE‰…ì-ÊåÈòß'åÁB¦“‡ +, ¼ÀF¤À,¹ +šâzŽåÄ»WpЛ4¯€œE0s ŒPáî +í*×n$UKø:ð^ +—Ñ*¸‚C²z+D‹«­©Þ}­ô{ð´} ÂZ¬¤5¡BדžæÇ +´×Wà +͗ÐÁ’ S…vÌÂNœqKi#‰*Э ªeüå°FŸ +…Nðl*_…•!±— +°áøT >|›j^€¶û)tí?ì©ÜžÚõàÂÞc¢9D,ÌÖ1§Š:S˜^á—Â9 +1·³é° ûÁåHN‰B¾ŸÊß6 +ÐÍOwFIýЋÉ)´¦{ÁA˜Ð3ï®f*ôD¡m à5%{$ÁGXJ;q|,p?h´Ø…^D¿Å’A«Cº(pjé- Dq4Á>!­]Rhv‡êY‚ªÅÃaˆ£`—¢î{BÊÚzB¡à€t1倯ö70ôÉÿ‡K­ë„‡Ã|g`(MušNh/ê9-½àWÏzÈ6!€¿ü’øqŒ ’>ãºÆ¿Ô¾kýgĒ`ª à²æÿ¬‘m9ÎàÐ]¡J–ôÁŠ´H®ÔÅ3EJ`Ç°ÑbEÏyB ožB£ˆÎþøÔÉôV¬ÔlÙzVn\L˜œg†  j·2½v8ðóK o‚c/b¹]Â]$Ê%LÏ··¸iäÖ2rg ¸âÅèá‘ZÔS(@InvãˆV“ñ1 ý;Hæ~'#ZÕÒ ¡y”ÓžÕ1þcѽ>µ\+(ݤ \¯ˆž·."TÍ 9›ÍÜnÝ*׬´‘#´{eÁñ9Œi„wÝý.M9¡?µºT ði•y­E[D^“s_pmބ“”ç“ä9Z*Çø_ZÚlV"Þñm…¦Š”¿ùúÚ]̚q7Ó- +ÄëgëÊ ¶ñ’Œ™ë; ;u@ “2Jâ–+XK üÔ$û;rw%1/òì¨îm6÷Éð6$!D–Õ"g€g5fá ÈA¾j”1&< +˜Þì²%—iw¸öÑʄæSŠÍU-k‘ЫAIA“ã#Xƒ!Œ uµf¼‘À)jø¨¼—©aׇCŽ²%M=ì¦â“)Xi‚Ï1Iì0¼Yâ:÷®½9J ÆqÚÓÏýqi1»+½ˆ‚çOKma-?^IùªìÂÀØ5ñN{0­Êãdb£VFôâÄÓÓòMnnûÊ ¿Ò¨äÕàê¾JÎ9Ì1ÞZƒÕ€È–kÇdèæ8›ƒru)“SE\¯’µ-$÷) %å´D³Å"%zð?º#&h`ÆÃÄ¢B(?,oQF¬ +d³ß\“Yè@¹’ÉÕìŸòs‘Úðm]¥k›!Œ#8¥3ñú¢Ä$·ö‹ÌYs.ÌäàȌ,”pÀv‘}Yª.8j%ûMS?”ÎþÞìªZGؐÇ)A`ùÚQ.Ù?aÇÈ[ׄIW³œb|&üþ¾œ6k,¿©º'˜‹Šô’0…>NÑÔ²Ám|ýޞPÇ +ÖßÎ+ÐÐИì¢Ð€|UÒ錃«9u‚öÝøbÑ7Û1NˆtL»tq ’ÉAµ€—,ÞåÑXŠmæP!ғ5Eÿ±càÙí>@0a‘ä!MŠpZQB2Y„ˆÎ“(}ýúÑ­iº€Ñƒd9¶È@¡½Ë·AÆTt#ƤÒÎÏ£“¢wìOvG1T!”E¼,>Åp) Ñ,ÕF™m_š)³–\ÀÓ .¸n2¡Z‡Þ™ümuLž<2ýÙ2õ°;øº dÄ!b†uÀ\y„X^ÛÐHÈp‚Xnb֓”4ž\’ï$›l¦X3_U`)Œ7œßcᒈMºM°N‡od=ìó£Ùܲ¥Ž/ ,ûCý$å÷SòóZøÔ}ƒaϚ&^TC²Éôµ/"Žki´nwˆÎw6Lõ}b´—Žo7Lìù„Hþ…%4Ó&s“­ÿ‘2Ö ŠÿGàÜÍ´àè½#8aÀ >­É%¹epXuž.¨)’Ø/ƒ¾…íÃT¼o!ÖÞ"Gp†€‡^¹pÁÏ5ÆÀÙøÉ}êÂ=B6Ø´¡ìô('d¥%å"å d®I× pfŒk#±PÀ‰#ý— ±±4Fj®nDˆ¦-ùØÍ0daÊòg#_û%Ø«Žz h‰àH~29;²c:+þäÿèe „ëE=“ý@¾W íu°A.Üôô ™DF.°ÈIÿ}»L–¨•e†z>Í^5Õ,]uwÆvPA®®Ûåéà5Ê|gXbM‰ôpì»m·>ü_î5”Ó'’ "†r_Ó9Œ.ã"­¥&‹¾­‹ ˆp’!ÖNÂwpËêdŸÅuTÓ÷D›«’ÄIý‚”$«ÉÏ`cf!™®€äèގdÖ¡!ÞHVu:Îè¤Ò¹È†7• ö9U,樅CyÓÈq˜@™ +XàP6²+À#’béñMÛ$ИͩheXZ(žà`z ¸¨Õ×ÉØqZHA.}Àì﮽ˆœ©ñ6ŸËi2-7ò@–Nqv¦D; ?„º_ÀÜ:gݲÃÑP\7Cc¶æh^)w€PÃ@ʸ–Ô’¢î`a(fv È9ù(wýúhzšÈ­ófKg#…ó¯$љÖà±¹ã¦_ÓçÄ#ÀJp¬ò7FZ‘ò»ÁÚ‘!üÈ"Žø´Yʝ‹“S.È»¹8ë¨ô%ëÉ­äŠÿ +A¦µØâm^^Zðw¤ë +zwcÇ1¬Úïë h‰ŸÑÝ “€0YÈùûI³µ`eŽø¼~ÿ}Ä/_ŽJàùÍ•)ü(†¿w5ªHÉˏQì2FÌǂõ㥆®(wRtL»%n¤h̚­#@$…SvvŽ~1#Ú2,m$÷—âçD‹Œýì˜Ý_“zù d4;Î\¦Ræ6ŠO™5L°néWCð¸—ã¼·'Iù —Œ–}²<¦(™=̞zM¯¯iWn»Œ¾CM>Ê·ò£%‘¸YS”¢&ý(€A[SFe°™å4k½’Ja ÁKØ©“¶„˜%yæ(ÕêO:¾HÊ÷>„UpHu- + ú[ì"ñ_1ó¬ºëK~äJӈ'Gºw «²D„8‡¸F‰xnð›ÓàV#ÐVÏq­£)Ìz·© š3òȝ#”ê­ß@8vè_AOèuxYw÷?eÄc^42×îW ¨šôí Z!Ü3ÜfÒ´]-$h…€'sÂ\=Äß,¬¢á˦v¥!ÃÁ´ØÃjPäâ΍©‡_H.E+çd¯Ì¿k‹s·•—­| oª_mË_´ÚîTÑ4­Y¯HýðR5^¼§¢uDҍ+ð-W*pbF&½Yf +Hà’ú’ +åN8Ū¹Òe2¤Õ±ÕÆt-Ð:ÓÍˎÀՆP_-Mgz®±—.›fkl;ðGjü:_T$øÂoWƒ²dá³S7¹uªÂÄýǂéDKVpáñˆÃ˜ŸiàUe<0ç\8qò>p… §ØžoDB'k,ß ÃÝI +KAI|ÆæÆ^Ï&À½»û¼Õ“HÁ©Ó¸1I£Ã^ìÞ{µ0ÖÙH0ŸÌ!{\½Nã'OE ¬ŠUÅ–Þ ý/„B(ë À‘ aÙ Ù[êTŽüÜh€fÂQ˜’ÿQM8eV!]ˆ#É-D¾Õ°ß L盤c™tý¸Ûp‚·4:Ž2y„(v ¡„-ñµnh‘½6<Z™“6yS<_(ïÊ'×Kë­VÃӈ(|* ÅO37¦çâ•ð˛x)2þ¾R§n†f½hö ¹äMœáõ¹9°;Eî­뷣°‘wk»‚laˆQF+jbj[]Ú佞[2;j+ËEŒC±Ò +FF^«În©1]ˆ %^yBˆÈj3OhEì.Iò19RrΓ#!¨PÐÜ.ñÑéà?Ž÷4⪏ð¡ŸLPÛuËëñ`§ÌtËÍ'¹uڊXwá ÀSËAÇ!<áHá¤öÄôZbNϞ¯U:vêCžõº6  f{¶ ¶5ö쥠’֜Ԉ"KYuƒX¥RD Û$u厱 ²üzDzÅ}ôà +Gb«Hð9˜Þ·ÓO>E—W á/°›î™rl€1‚‰§@#ä–CÊ” ßÆ(hv¬4.%jSû‘Ùê$½T“ —kß5X撼ªô)´Þ¿”y"–R’QNÉó*UÓx×ÊìŒãF/É,ø(ë1ÁÛåA»Íèw§bG㹸º !¹„°ê% +*õêÕ<®s_—<êËtîroƒ-UBNQ…gHïbF>"„gø¯´ðÍDƒ0½s“Ò#iY_P—ÀÒúÞ'ìxÎI!¾™ ©ùjµ¹‘ +O¤­Šµ.@,dèäî¤XËþ;h±ŒwU¤”BôˆüÞ0w‰WE-ífk§†4€M9AIº$¢~ ëqÉöۏSƒ9;£^÷dVeßó™—ÿOÉtq‡œB˜4½¦á +1VÒíG@¦#.•\ÙÈ[L$HيäW;™>¥‚ü–DaÓ¡:\œÓ@¥5º@Ÿw9‘%eñëè³Á¿ZìM?µ õh Ø÷úô_¸%« y&5—Àf3ƒ:»0Ó3ä5 ]Aø.ªÍF¾wB{ 0Ø\ ˜àY±€yºƒêàÃeD7MÓ¿]$Ób´Q¶”œŽ)UÚ/‘'« wZ,ä^yèþ.zò&‚Ú# 3ìøÆþ£hX ;•ù2Œ(gQ`­M—wmpc¯ß_HK@Wêñ5/º'jGBäb¾'@5Aü‘C´ço²¦k\TtT` r¬0?Z@ZÁ +ñ4C˜ X½4ÌuÝÂñ²~ð+‚žÙX7ŒAgm‹‹61z„ˆ3$áv¬´Í”‘—¨H¤e‰Ù¢¶ûM–ƒ95Қmel³ˆ»&^µ–ÇyÀUû@ž^‡€Îë¦â¥²ÆÚ ‚v/½ZºåÜHyÔ*S’ì!;lö\^C²f)™¾.NB™ËîANyj3‰ëë„hù¦»Íƒ1N–=S@‘3èEW„º¥Ñœa›K|›'=L6GÝjŠ»°×Oe€]{=[B±¢fêkۏq +€ü– YŽ™ü®ÖøV&Ÿö r囟)É Ñ‘£æî×·cˆËz˜&\ž'cQÿ'ó_Zl$u­>EèÝãËü/=2yOÆÇÊ¿À¡Òãh`³êˆb(ŠüÃrÃÈkyciñãPYF¸JÊJT¾Ê=ö{|?ïj (ël3/òa> ×§³­ÁËhËöÑ­D-Émd2Tˆa"†VÕÒpS³têxµª½4'²».ê¡u¼-¼­J-Üû?š]¯!{»u®wËå/_ø1èàÂ"©¸–"ãÔ긞ûä\‚›²p1ô7kÐmÝ&*HÅà¦BC\í¹Îo«§m¥vezÆ®›™=YŠxêèëóh±B vt]hbâ›)öneH endstream endobj 130 0 obj <>stream +<M`‚qÀ„tjP÷ú êÞͯK¹tWÃÄþÚ\u°áµ‹\Dš®IÉM쥙ykڄßçô¹ˆÎ/ Ô›œÀwÞú@©ÍdDÕgwÛÚ;ÌbKë\9÷œÀƒÉEÙÈcœ‚2èÎa'¾Ì ®úçÉ£Uš@ 7Ûà^œkªpš§¬qژYÀtæže ÷åËõz¦¬«äÊ:óáœQ¾#L©£<°À ˜JÒjqP¹iE¡$õ8=„Sþª¦Â€=äZxzÐØR¯y|=4Ôm-­=˜=š J¹ã1×í6]Dˆ µÈÃÊzË5s<ðOP$òà©z9 “[QÆéîÀ%úž ƒÞȉ|LßZœ‡~—Ÿ¤èk€ºˆÎ÷Lá¤hÛö0ŠÐ?™×òÍP4Noכá´açiùÄKl0¹RïÆV•Sb¦Þ.Å-«õI(µÉ‰ª–96ÕéCñKjõ³©Ùó³¸8Ù¹ ‹ פE’Ô§*𓭺ã) Ærփ›`S“+sèüÿebµÊ¯F|˜¨•+0Q¤®‡Úf0÷ ìúÊG +\ùÈ Óp:zÅ4X2ՖÍû{‡§Àxµo5G„JãR½¾¦ÉDDþ¦ÍGúQ­j­;w»Øё¾ik%xý2ã}i«µl$à¤zsfa „;âHzWͤq€¤ =/Â0iäY²“dþ:¨¸Ä%®ULx/˜L$øuô<ë-Ûi2!~â.™?ÊK“oÓÚB¯Ûv%‘º ½S»­à‹8VwHƒ?‘g~VÐØuÄ[ûoGè?GpÄÚ7 ±.Yš[*ð2~Ùª²_aaà—^Bë,"ND_05ÊPDðe÷cÀÖ¯ò|ƒsÇÂèw}7Vá+µgŠùçZsùÉjRM¦´Ù¦TÓõgÜ£«ãÌ|Òè䅁FúGlÙGÄ.Æ1Ûa/9@—À~þ— &&kۜg¦ìûSž{·å]K¨Ù±;=^Akõ¢ŠÔóÒ,dß4]Ï1~P¸P™t¶ —á¸Þû‚&„{¡önÜÈS¯~°"°æÄ%¬Ü Û4ᏨàÇ0ªéIYÍ3ýµq-³Øp#WLãYsÆÂÆàt­¥bGY³ˆ÷Ýx¹+üH×âFƒ&nÉYÛp<…Íï¤y‘D‘ÇéB m5Êp•’IâBiÊíL’ü?܊<02­Áz2Î8+UUc‰“±³o6dÿ­U5·UEɝÿU<6Ç*.KŒ,ʲ¾h-#êâWd\„¤ÈT¯pÆÿ걆oÁµMGÕå$(³1œŽ!J¾?f„x½Äñၐ‡nŸ ƒ 6֓ØÛDˆ;ʅS\á ø´ð¸.[—i‹°zKŠm|?ˆ^__«†GºB1"—Ïòƒ )€ˆ¢ '€c¸Õ*•æÀºe¨Ú➮=˜¤M„½r<¯2 Ì)¯”³ °‘•lY°mÖð†WÖÊ5ƒ¦^ Ÿh=>½ü±á«Ï")䛂¯É˜Å1Hz†ùç·†þÁ1²Yýãü‹/MË®ØÆ#î¨Ï5‡Ï\™³¦¶}D$$Ñt…±z¬ð@d¥©Od†U¼ þˆÝ1’°é粪33O,/–Ð{@ϸ”Z_wl_ö¤×l£U‘ÿZ+¯±”Á)”€#|õÑ»å¶?+i–éxU}b À*¼9·E0XÑb2ÈÀ€èsÂþ#órxÆ$ôpÒ`v–ˆÔdQ!ÌÑ +z.B o[<À0±í¾N¨[-$ìÄÄA؃áev3% ËÐB—ý±0ôä ¾Wœz)ñ( ¢­.(1?§Èð_l® ‹P;^zù¿ž»iÑB³KQZOW§™¥tt\RG¶9ÂT'DiRø•uAØg\‡“Ž×6ùþuGøØò€WtȺ³Ê·.jÃwOêhœ©GÓ0|§ )ãóMÂ>& Ü5Jõ7î…@e)Oš´3@Uã~¿ø%˜=JÏóa$¹CY‰\q«x­÷œ*®ÚºâÚô¼[½æ|ÄIÅÞMWßX ”f7²Œ"%L£ì‘ZŠá7üodþ:ÇøD'Œ³Ú@Îöþå(N–¹r\°;éê$#ê²ÅLäsCÿ£Gc ¾Ó½WOÝDrÀ2 ¶LJè_:fŽD3{‘&H­jb_†AÇ·H4‚ÛO7…>þúl(Zž‡°eŽåÖ,ÿw˃pð#‘&û‹cÆð ‘ÇÕÕD¯}È7µðÒϏ)<BE¶ùž‰U‰3â°¢j±0ôG´/>|™ñ!fîXyÏ2ðì™_ú%‹ª:؞Zc&-4™0©.í«=E@ÕNèf-p×çe݉{P6F®”‰‚…ö´èÅ>_rCh µÀ3ò±Ҏß&)©˜oûk†QÊòhleà(ˆÊéßðUWÍûn N!žšbÛ`ŠàÛGZޟén¢’`ÍDãÄ÷Ñ¡%p·¹9Š|S:f°…ƒÃ2Äû 0(láJ€ áGÙ!&¼?ƒfÿX–`ÓS°‘8÷ ]‡í\Gj²‘bÐ¬Š‡¨J +Kú@9qÿLHòÈ}-ŲD<¹ +#]†…cna’êÇ2pp)Ø!vþ]ð\á¢ïµÃ”G†u#«‰“,¡)fŒ÷ž9k!Þî Ilêƀ;³ô÷3yö1b6~P!¾ii4½ÿ}¦–u-öüô#T7Ï/gë!“îd,‡'jØ­†©†ÐÍÃ^@Rýâ=7ö‚+"£ˆã+!ñw†/´UWO_³¸}W̸…C_4ÞÊäŠÊÅð5™<ͦ2— ö¢ù µ¯Ýq^¾_ž™ á.¬bòQêX$Ë(7ۍ‚-L6ôÀÖÈ‡ß m¸7ÞrõfcX±Õyg(V]þBÑQ§Äý +ÃO3-Úk‘0Å]Cë°µ›4,†ÇTƒ•qIüuNøJübë)-ïyVdÈJ^/úÚKøæ2§Ä+[,ógc֗ä²hb +)Oì50“,ŸFŸÞbu5‹€žÁ½0]±2ˆë +¶Ê'nîE™Z^Ì´™»j%¯ +› §ÈG7 ҜŠûsòÊc@Òã M þðKÆcü' Ì¿ãÁÌé²qÎ<ê­ðšجڥNm,‹yP´é˜ò%yö> +%’9‹›ÆAØNçs¡S•Jp*¨Zv^ì½ù[”Ùû­’ûύüjÞT¨Œi´xD ò^K缆‚ºòNsú€h©òíÂfƎtgӌ L"{@UÚµ®{(I¼Ë␘Ü5ž$%FXèPëìýÍ>¾â0‰Ä¤±YD6s~1Ö{݊?[a¼ãwkr ¯¥,î²ÙÞu$ÙGdˆüžÒ]uAIìÒӌԂõß"í^Âñu¥n舷ãÔ2úƒ’Š¤_Œ·vG?Ÿ ëÅó)ÇTT(ú|¤¥ë鈶&šB9•¦l¦º`È©èt3 N 9Û +_hI½o®#ߨ¼z1ٗƒÚliÙ@‰Ó­@ +Ò\.¨QÇҕÛÑ ð™M‚Õìýͱ|c£BÇûP´›©JÃJ(„ÆàmFª롪7à!ól<¶˜`Š +æDUI7 +;.Ù÷,v‰´0 +{‹MKå …°±¸Bx Õ.‰¥(UŒ»zc‹¤æË V¼€•ˆö¦B¬Z%l)òæ•øÕQ4§%Ißªñ%kö´Aƒ{}-úx»SÀ’šÿ› ¹GЈ¡xG€8vsß¿ÀÝ<\Ñhr8\ĵ7ûb0@n•/–ÔÍnEħF\]½þ|‚“: W–qžb<ñzŒzÀ$‡BVœ¼™gLÚSz]Kú»W?m árÞ,RS†dÁˆØÃ()9缅ሳb"ßá’!¥w_Î Á€ÎSâ¶ùúÌ0=¥œˆ‡\æ }µ­£³ƒ σŠ/ߢԐ¥9¦7d?؊éAFÈĸÞQl„Ûၻf+"‰Š«âô›Â.¦î Ð1þô ÉȞYޑ0.…œré•°ˆC˜ќB½ ®€AâdHŒÅ\†îìńž”t}ÆQ>?‹zØ>¿u +×(u›>iFvÔqfϜIv•³½Ò¿¡¬Ì¸‰”Í‹ÀTR€í'(CՊn8 ++ö¹Ðúð]à‰þÎíÐ5‰iã6ª¹I] ù¿•ÁàA2ÆVTMÉ ññ,7õr\s”¶Êþ;j®ÿ»ãâ?»-Ô¬g+ÉG‡1Ëà¾&‚òL½ÒƂV=Dð¿‹Äáð%‡ ì!ãRÔ4¦•èYîÎ/¡È$$Aa²… ±Å(šEٚ ;kS&«×9èš[/÷ªxÅ2ϬžPÏ'A¹)b§ÆË`›.áZ…›ï3ÄIÕ«ZC¦a“¦"˳Ê2ç³sk¢’ʧ»ÕQþ™Š­õîHðOù'¨îOº`x„YögšÜ9Û´qõgÔns‚þL»u㠚?)éo#61i“àe¨Tö[Ô&©¯ö“ŒKêN#¢ØOG0ÖÏ`)bÃQ?ÓÐ/“~F @?¹}¨Ùt~Võý¡´+³ÌÏhÓd/©[ùIFm80K"G~õ½Ńc㧲ôvâg¸~Û'´šûª +?cIO""W¡ÓBŸ´D`Ò÷I=±—›(Ýb~yŸž/1pF‘õIp>ŽÇÎÀpQÖg2äÛ¨>Q¾‡úܱÉÇ#©4}ærAølxIú4Ü«ÿhÓEŸ€Y´üô93[Ž¿¯­ç3§†NL%ZQΧ*pб;`ÍgÚ0Í[~\Ì'>šYö2dùĦ¶ºåSl^¾’H>sn´Dnë\)Åé° š Ÿ%Pæ‚øÜçpô«!¨áÓ"Ñá“V&‚Ï ¤M4Àgú ¶Çú=ï"*onŒïÙGû¾2Ô{îÓ'˜GÍâ=©…Y1¡ÒØ=ÝZäB>IºçÔ£¹gj@•­#÷÷ ,;íöÌùÜv—!;¶§@khNÎVí Ý?°l1RásÌÕøÀ”Ù“mÛ—÷&{úËJéèžØ3#ïì‰ëÈëF+Ÿ5 †ëY¬Î­gƒs³ïΨ,ÖÓ=òX ñÈêɂÌYTϐ¯:𠢍I=s#Fé_QhɝPÏ,hNÏ8º›…–.ÌôÔ6ï’,&q“JO¬2f¾’é +ÄóI»=ù‚Jh½ÛÛxþ&ÅÑ>DYB7¢6Ï´GZÍx‘Ò<ÕI@þ£–2O{+¢‚ÏÈÀ<ñÅP©•AM¬¬—'ì½ÉòÔ6É¢P*OŠYåyb4Ζ±mò„úNòŒ²uÍ?y&ÕG‰\ƒ<‹{èÀãÉíR¾ÄñêŒÆó0ôŽã©Ô®ÏEZ< pê€ÍâÉêTVœÃƒO¸ªöÕ2<‰ûËóžÅȝbO@M`[^¥Á““³xœà$x¦4.æO¬D x²ñÉömÚmdÈú;#À;j%I’߁u©ïŒEPlꮄï$Æ.µpeïLú¢ÎxƄޙoP¾Äކ''_³d‚LP{¯îŒuÎJPJè|èÎ0ÀÜõfît7R¬úøåäNfÀ)ø;å–ˆ;iα3¹Üù¿±r‘ÉÛùÝCJÜNþX]ÙÓ ¶³›#ï"lgþÓoRkí|ååSÔθ%Œ¥©¡ Qßw +íd‹¹|HOvv6Cõ$³“úØIÙ,¶ٙ-c@cç5²s€ÚˆÂ7T:ôù¡ATb\ag¾ÜžÈ„E 촟K¢1‘¯3ÍeL¯3_-Ø´?]gÓª]ÞÂuâ×jc¾w¶uæa‚l¤u"Þâ¾Ë¤åÁˆ¬“føDn{ó ëÌÖ’““«“=‰hHz(Àµduj;Ô¬g+x":Ś øÍ]‡í2æ¶gçx(F2]Hk:‡×ZLç)KgÁÖ©ïR:ñZ(•˜¨H:ÎèúõÎ%E :ÿa*EV—EÛ@'Úrû„4õsrJŠ?=dãsö;£CÔ@§žÓ’Ó2S<'P^ÆÙ(;',ôËØŽx†tN:æ q ¢)ç„4 +e{bÎI𛟤-»9WùrÆƲ91Gûí×,՜·u` Ae¡9uÿGfNnɬ֕LÖL5 +.„k6›(ÿ2Xó;¤'§êÕČ«á†\Ítü]­&=„ÊŒ§É«©¢»Uó[ZàW'‡˜T3<ýð­U¨&kX95·!S“Îί‚öJ©9ædb¬!ØF'¼K.m‘g„f/˜gåDóŽ²èV£&óìtf/Ù5ÔôMfÔjFBvjKÒ§™çªEÒ퇧)e†_f¾ë[¯eÙpš˜¢ƒ³TÏ6ÍU¤PâÃ0Ó4ÃBì;B»-V¦IFîœÑ'„iÆLƒ»4É¡cÝUÌÒDFLÕ!qH@ŒŽUi2aÎîÅ +J“¾ ¾)ÒK§Å?I3"áX¤6ñFãiÎhßOѕy4÷¢¨”xÏÑ Ù¥¤’_ñÄ MÅÌ4ô֙I5ªÓô„­C;•îj~šŽðG š˜Õ'7d˜4q•h_œfšzLtxthÍè˜Rø3é| zªNù™Ãÿ¬„Ûõ™P=ïË-:™ëüZVv¸nŸ^½Õž™?t5zfdÔ¯<“´ŽîÝ©Ï—`®ugjO—–FNv&$ÚIu&™‰Ñ/Œ?tf4È´Í™±Hÿh–äÌP®E˜fpâÌ6ïà#r8“+(fo&PÜL\ˆ”¸«u£2”Š‰yÛKK€C3Sk RfþÑzdf?\gÌ Ê—ÄL¼iÂL<ócïÜ¥=0SÿWÒOÒ4ؗ٤f˜%•—u´¶À†ßj!V—‰Î˜ë’ŠË¤çqÖüÂKm™16“GnóäÈ]Zf¼¿Ž/BÉ240e¢û̺ó!Og`ˆA™/)Yí–r<{2YA´¤íςs2£gjGë"y+»Ã5"…™ ¡¥¼2¢Bv^“‰¯ãon*9B»’@þÌjŽL¡Î12ƒŽµÇUæ’$™\™Ž2c$ ™ñÆÚ¹ú°Æƒ‚Lâ~öôŒÍO’¢ž™Ûƒ›¨ncL6¸Y|L‰“z̼«ý:ÏÓs”ŠÇ¤FìhǤ”ÏÞÝàaŽŽ‹‚¨Ê1Y +ŽyëfùƒÎU”ü"31Չ1#&ƒ1££ ½N=CâeõbF¢]q1Iêûd:•Dê-fÞ½ª`1£Å+&Åd9Ð"9)fEnqµß™g'f‚è㘘¡ç;JLUÝCb²¬.u˜ÌHAÎ>»‡Å6L˜L–§éúbvFd¨ñ&-\^R ”« ¨Üá©,÷ÀT_óäL˜Ä\®ÌRV}§/&¾’u`›wlD˜Hð @˜Ø¡N‚­L¿¹õQeçVV¦ ψë ÁÔhÞ߁bžÍÀ¤;ü¥À¤œËµw`Ù…¬Q&°ÌÔb<`G ˜Åb¬oT€É­û-‰1„!¡êîõNëÁË!ý’ºUur¬.y2á—øqÜ—ØÚjøªéŒFö%.Û-ºþ¼úɱv؂¾ pÚ|™Ï…éÎã-d€1˜.\ºCŠÊàËòÑHõ^âå r/‘ñníåœÄ:ö2P‘+ŒÞzi7æ(ã©—€“ÒË+Þèž"¢s]*m@'"Û/Y3ï +/£%/cd}—yâ<;¤L#O* —× 5Ié.%SÜeÛ6óDôírŽ”ýFRça†]b$ºv]†,ìn†¦gŒX—!¼*‘ñ +!¨ê’”‚ÿ—ѧ™l ¨Ð@âñ÷ˆy#ã?F³Ãµ„»°'t îÑÒÜ2œY”ã’*œkËHfÅ%Sælùrg¸ìEú~žYӄ⫠£à²Ü)µ‡ø± +<ٝ®ÏÒ¤Ÿyðд,,Ûrí!R`„Fc†ôUø qçZÖÒ¢•âºªµtk‰(?oµÄÌ ™2–jÙ A¤–qABƒñ4ÞÕ ñL´Â‚R£ éÙe؅ Ñ9¾QhIâВ¨ÙÃg "›’g™úŒGgï¹.Jœ%Ê1ûŽØB®YüðÍ2yMf½Lª0Ë ô^.Ë éN–%ɇ3WYGpà ð3#ÊòVôªÉûj %÷…~ï!› „2…Ï1[°R Ò”Q…diÏ,ò$eº#‚’N¤<‚›e DÚúF Œ©H'¨ð@zɚ‚ÎóãèÉÐɔÛû ÅßÁîÐÍ,¸ÄÖ['.•"áÇÐkñ¡'Ëö)7îÚLNœy’^ɓïA ¾3!–DŠÑQæI$tܶ@EjÃÇø‡VÈÀH'§b:t›:'×0'C»úätÊÉnbkW1Ï!'cAŒ“±<­zSTáähŒ;@VŒä‘â•MRêåä{´nÏ’†M²' +ûøÁÞiQ@²uœá͚ä×KC}lÀÎV¬šì-<ì Æ¢&«©gê&Sð·<“\˜ër¡š˜?¡…ü¢˜[Í$ù5ý+mVÌä’|§eéÄYÊdMÃ0š•ÙäNr7 úCKFÄx¼’ÌDú–O“b­dëüd¬$ª«U1­¤ŸˆÉcìˆÀ6ÛÐ+ÿöÃR’ÐŽ7‰’`¾A’QT‘Fö·j×Ç„Cò±q +C2Éû$˜$wå~3[5½Ã..I¢›±$#ÎÅ Ÿ¢RòàH+/8l’=inM›E’¯k8 ÆϤ]ñêy$±ò]9’È6i$Ã͇ÍèZdˆInr!Z#MŠdéB(Guo>¾\Ií¬b‚¤[±)¿ÇA$\)D_’Ñ…4,d‹«Žù‘5&ê#yxÈ Êc"‹"`>zUá‘ÿ$œ¸Ü‘=#ÐÆÞJ‘ٝ£Ž«Ž õúJ€ ¬Šä +æΧɍÙIwɑ>2¤Ÿ:k}".Š#y F –©®à0kqµ^hQ¹Š˜ávЄù”°‹Tã¯/áµ'ªäƒQæâûË®µ™¥C–•¾·|)ú¤6¬£ÕQ 7×íï7}$¤„Žžj¦ü6²8ìäËÚ&ƒ6¦¥ÿ!¾•šÅýЏ¦·°TÀ²ÅÏ°±f—D¹BàrÏÐ`ÅU§®n0/¯«IvÁÛ>æåTóz tUc(~†ñÀáÆì¢(X3_V‹´¶æ$ýÔ9|#7åêû?úyMánâ´H£êCir(Öá‘K°ˆx£‹%®›xH#ýüýáÉÊ$€´ "%ܸES MÑ> o¢³ºóuWîuç䧩3Ôáù›C:ÉáþzöÕÿ8æGk” šn‹l„V <Û*$ùô†©ûŒG1Ã@…W„w<tn¿"UFŒ‡T2р ï^¬±B@ýáµQgëó´ný.ÇlÖӅS¹wˆ«÷¶b´·Ô*:tŠ ê IJYE¦F±b¶Z«ß%m ‘@çbó^{'>X`¯3ˆ3ˆ=¯¼‚}}£¹)hµÜ‚óëŒ{· +˜dÁ¡Ê-ï0¼“…÷À¼@·1PV°Ó_yÿÀ¤ÍîïûöµK k,íL仨RÞýPþTº'=þk@ãeOZÂ0Zû9öŸð8¾?ŽCëfœo¹ÉQx4&¼Ï³P(ªýºŒ¾ºvÊXW5‚Ç®ùz~ËÁe¼Ïü:ê·åözrÒÀ£ëŽêsô0˜V%aûƒ+ڒª üÄ¢52§dK¨ØqyᤦhÐ+ž¶Mö~ûôqb˜€"®ü¤ªEÇŽÃÆW¾Ë ´B4i÷Èil»»à[ϱ¹zäáŨæߥVceòÕ°DO³^u……-ñíz5æÓ.9x!X„£Èj«]ځHµNÓ¾ã­Cƒ){(pÀ'·€YYpg%ÏðñћQê{Œ€ünŽ#ºÐÕfò3„•¹™§€r!ÿ‡”Zë}Œ»………V¬_í‡wþ±„Y|ð1X¨­¿>h†ÊƒøUÜRàL!#n­óÇåOa¡ÊËdV‡¢îE&ÄH¤¸PØ)rÔ¦ÃFÊô$„XMé)‘~Ãd·¾lá„¶+hÒ»dêHÏƬ$y͑Ötã#ZšÓo0®ö.Ÿ%ÙTŽoíÐtݙя*ë”[zöwŸºf–žƒ–bÜؾûxAŠ|H<“6Z—èx•µÙN®Ï®LH6¸szÆ÷>¶šXpvD¨ECÔ{¨ÿÌF ¯¶ßTƒ÷Ò}…O»­4ô V4Êí*+/À>»ëÀC8<§9òÀ᯻uX«b &‡¶~]õž`ËUÚÀ¹"w܃¢,C9îÙµIÛ>_D÷>}!ÍdÁðieÄ¢?Ö+í&,†3.ÎÑwó­\h¥Á.VŒ¢­¿ * ‚tßuå„Kª8R\ö²Ú< +ìÀÕŠXMH¢šY\‚䜬Ãòµ2®ò™MÀÀ†{ý`4 þ‚Ô®yß1ð#Øàiž:@o2Âßk b©þÛ5A.DVƒóÜwbJGñí&'+MXã´° Ó!ƒ³Ç-l¥..™Á8eø( ± e,-1ã#7҅ÛÇAXkÆѡнpÊ’Ì ½ìêIcÝä°ÿ,6”Í™h¡Ë:TDtÎMô²@F~€=0 7$”f.ê1ôc¦›‡ÇõÇYŒy !9èþ(†ÓêOC7Uñïä=`ׁŒÄÆeÎ߈­6ì(ñ~Á!d©•äÚ» ”´§£4Cñ¦ï¡€ð‘!k!Ò§OŽå4Âù2ĺø`Á’áV[R:oÜ;a©Çòøµ>¾ðKFŽS˚Ôiª‘@ãeÎÓýˆ©3<´qβÇúƒYIÓ?_þ +ÛEv»4CûC>0°®Â*9W0òttÿ¶^‡%J ÁÞՃù ãpYž`Ôã=½Ãw£¨§áƒC¹mqHiPŸ£_h“·Á‡¯Ë;R œZH·à®MÛl +÷[áãlêa56øEðØ­>+͋À# ϾÝç, æ@$ù¤ó]ªÓ’l’_)máQWÀu=Ä Yyà7“›C +çžÈEª Çê$?äŠސƒóm M:ëäõµíH +5†e†gõ<B’à)(iDº–XùXْ8s7ò6°«òpÛ«I\Àq6±7}š#èÄ 0ÏÏ“-ý†‡LcXӋ6—§ú×m†ÏæÇÂÅíqº€‹h«íÈ5¨±ûšŽüÞg‡úPJÍZzÒ' t¯|nƒMÀyõ[±µc[¯5îo€M£Æ jta‡T-:õâ–.Îï[!Ó£h†$ڒÆ XFø„ÐÄàÏ­àå‰ÃÏ<࿇ev”nÆôœâMmã@㶡î3œ +ÎóaR‘ +¿«™-¿5æ_hŠg­'ùS °ü+5mÈ]°Ï©Tƒ@Œ“]n¤Ì+µàœ"jÔ3²¸hœÎâ…}Y‚w°Þ-i^•¼Ñ4íŽ&QFÏâ^¥Ý‡Ò¢·?UÕÞ,4yDPÔ® ±Ü6(10’Mõß!ëEp8‚—’€×eöã =_ïà1•ï÷„aŒƒ¯/v´0оõlý[é˜"xKÕ@§s8K] æW@»'³ޚk® ±SÑ ¯þœ©-©Ϝôžóîzˆ¯e¶GØÀ¡˜Ô¦¦£«Ö¾GW5óE ²ó°”ÜH_Ŷ FJ‘¯[—„q9,}Z»>LYàî9iîLYÿ†Ä[ÆÈҋÃaӈڐmcvԄ¡y”׈=PòîJð—]|7Û姯[9k…;§E¡w”톏ox’7h•=ØÅ«‚cHˆZzŨšIgÀÔ!‚{Ql7†WȚv±µ„"ZÙæ҆ñ“±g0J8¢òt hà3³Éq­{fx©n§0ß +,BI Ì xv×Ý°ûîªÞ¬øÃòmÔùÍr\͹¨m/êNʙÞxóÉåÇ^D  :õѤ ø…lì”$R’o߈A7}Øp8W´8H¼ YŠóс´*Ÿa—Œf!SÆ;évj¤’æPÈ£I˜î®{ps¿­‡Õ!_=l´ø‹=€®€Ú‹§BQ“³0qñ5VˆŒ}`À’ƒÕµèGÞ¾If½!5F‡¥)õ|×Ä7!=YÔåš'Žtúî|m¦…á~'Â¥ ]ºuv,Ð%~¤à-š1‘ „Y^U±u#aG²¯}6¾¬PÆAŸRìCÀTä+‚Æ2ªä ¸]û dPõ[ ³šQ¹¦^÷7å) ÏÑ$lpnï{¥ìôüÕ+•Ân¼®‹̔wgò.…Õª½Ù -Þ°á5|¦–}(£" •ˆèVâü£n(,–"3(S*ßÑyÈÌ m!òބ|t`€m‡õy|(e¬^2^Nˆn~Ü`»Rš¨Ž/>Í=:Ík^Î߂ѹw¦€S›Ç²dãpÖ5G @Pm€÷î°Ð”Rö}l·©¨ýðàӋcÒW²K³ qÖ ÷WC?·øu‘J‹öþ€‘vOhèur ÙDA»åäë˜6ôJþI%’ý˜ÀÈû‚„ê,"g` ªèâݨ†£ÕgT}È¥uK.ƒqœýlkº6‚b×/sæp’„U>hÙ_bˆ+㝣ݺƭR¢ÇYø£-Õ²¢N° ¾*…=”Ùï ÈÕx-€‘“®h½üd°8ªi|xr‰ŸŒ:b]Ž¨ßÍü _%æ}3‹ã’Tªp.ï@8pTù˜Š]çq¬Ä·£«@g@^žãˆŽxE‡0)1Àv~Áa¨HNÝÍm CDﶩжï)Zþ%¢Ã„õþ6S‘‹!¤BpÌb­ûÛKƒØ‘—Å©¸`›*á]£oÁèù´¯L„ɹ›ñ ¨ÙŸ9Çc› OëÖ8ž&È%jpKy:ËêÕ[–«µ‚õÊFiá~˃çý؄F˜ðoqxÏç£u')!HÖÄúýhnÅ¢Œ¿ +Çø;?æIÚk3c{,všF Ãh™@U´¨‘A:˝͉t Ñ8„˜\PÖh3Î ³zW~,2æ‹ `¡´i`lZ4œgêvn4絪àä3’ÑW FГåõxz–Åѹ¡Á®¬ú®Åìi„(αäJu® ÝëC+PÜ3„5ø‡¨(˜ÀO~ûUcp$ܕVî/2›Z³î %×å«1m^;C»ibz?Çü“vÄÐ=éyúŽ½D~ÛKûÜ£¶´»žU¯#‡ŸóaƤ áQݙŒ>r_UüVpØÜ°S°Ö'üäïۑe'ÑÔeÓ(Ó(9ují&¾¬ 䃼™ŠBÃò C©,¯± Ãnn)ŠYOxè3Áüya|ùF«·*Õ,!±%ì̝Tvë&`À0ϯ%×è[`xí´$h(@tŽÅµÖ”c_ëÙ%Çк½%/5#A¦2dâþ¤N@ãÏKyW„b,öåñZx;aöыá“0n…MÁk×3imo]±øƒX¦ ug%ʵIab ÈÁŸ&>(ÅÜó1u!]™§.²O†™å9Oº“¿ñn\Â쁥!€D’æx, à,£ÌƒîÍòà–H°;†áaŽ\ï e:àºé+mÙ œÜ‘ÐÖû"kˆø¦YÞºŽìq?|c åü wöºϧ/ü³ï? ^I†Ñ  ;²ÕZ½\Ô´“»k@²¤â¡¶ÀFp‰/ür¶\#¿w„p´؄5}?³GþQx4æ‚atS‚·]äD,E7›ÀveÓ2¿ ö÷åM0oi”å„ôh5 /Ý™$̸CÐ@Ü +’Ï2hZñ«3jÚ "ò|Ø8œh +JĦ}ô,˜»¹QŠ ÖjË ‚£Íî˜úaº„ÜþìAXA%FWñƒJ + Þ9UÉ5¾ÍÞóæDʳ7SîžhÁÊb^ônÅðæ:ó²•T‡…Œ `#î;Á„Ÿç= oúV„›Âí£§íî`Èy¢fö ¸ÉŽ§üÃzð3å¢8Ǜ×ÛЖþôA”x Ü[±w!Ö5`AßPN·¾û®0ŒLÁŸ­ 7G,9žÀ5ÙJ‚/'vo܊Öj3éò7>["ì4P XÁ[ÂBiñ¡ ¼€VTŒb§ö‰á5²†rgº³ßep ~%Là@ˆA (Á¸(93¨­¹Åßµd$4½2ÜÈZџS4ãÅf^$uéåìÀ€Jɨ6Æwò€‚ Fpfo| §âCf’ Ùw  JÞuÝtðiñã5ùc€Á‰î¹£Ï_îó€gY–£hã–hÓ÷Ğ(nùxX âû# Å>Rی¿¸VøõÈ +¿L`˜˜NÀ?ò=L“ÛgóP²Óÿ}sÌ"ͪ_¤hš¬6%ãuRš2HS=C*"š6¢î |å¢Ë̘!¨yQÙ%¸œò VËk»Ñml™MÃpþàÑÒ`NªePXL¤:||`‹Å•3ÍÃ&|T“À×Ûz&¹Jÿ& +ŒrhErÑÁ¤¬¹Ã4 š…×pë©4w7í T&°5GO5|{òéðÉ ?Y–yDª.£›Bù•~›#VUF®c﯋‰\“%«ä]ÜM2Ù~öO¦Ên¾Êڊ Sü¥ù +–À,ƈ*Wô..ƒ‡ Ç4úI‡Á™@§Wô¤êìS&ôéúã=|q-°Å&êÀ¢êƒ‘žlþçZFs±ÇÍ`Þ?„‚xKN¿½êME°*½¸ yA\(f¸kƒëŠ!yv N=¬ /·¤`Ú'¡¥Ïý"LσÙכ6Ñá¾ÜŒ‹I5ɸ|Áà^¤ønþõCsÂì[e¡T;,ƒIïK¦¹4­“$ƒ—…¤/A.¸@ò²lü±/Vu ª,HLÙ;I†Ÿø…W üÛ^4HàXsšÃ9 ·_Ü]ï’Ï»˜€Î¼Ò(5#cæË5•ØBTTe]d£‚ùÕx¼Uš>'P wà.¸^-'lx² ý€t°·Y<ûÄÞ¡«HjfScuWÓíÄ ñ›°+†ÁÇp˜nèñCêaó"͸$dé BÔl>V…8î:\™:¨±‰{°•< + E’‚Æ×PãŠy/^˜pk©Ë’Gˆn›­Ž?­„eQm¾*TZý{8—±ÊVÄÕÀ(B?¬F½[ÛQŒ®~å`ùAâñ@ 4Èúgˆ ̪½u DYú"°™¤ ëïB7ÃW€cÉ +\91*{’.QòB=™§%u8Ìu}?“5 óÄh´-œ–?Êã´Jià@3â +"¬Œíë£Ú6»ÉË£÷ᭋá̹ÝyÝãŒÐV’Ùύ\$f°ƒõÀS+&#•dÐHĹRü`[I¦½‚A¹±éԎˆðcy튂  Gò9)…w°9Aò)ќÿbϊط̪;š~$¾ƒGt=ž²r{ÖæT>?D%< ñýŸD ªó3 +∡»]ŒPP•gíºÈ¿k•:©ÁÉü©Bɺ̳’úÄÉ &œÕš‰îü•Ê… ¦} )G`'å²à1Ú-¥ÛT` +Î ÑLh +GD @jÇ' ;®$ï씒”2‘a‘stݒŠ¾}ßÃöMA²œ0ÎH + +þH¡ ‡8L`˜±*<…?Ÿß 3†~Šs>c""" Q‰ŽŽÈNA§É4,:‘"ç)Ú;ù)|Ly¢1NÖ?¬Š*⹪Sp¤þó§ö*"¼jÈdr"©b§Ž‚Ô‰0öÁOì +Ì(@P PPÀªR2˜J3ªHÆS)ŒqŸLU݀¬á>urH~}¸>(>ŒŠF}Hˆ64FÈ\ggffffff6¨Ù€,†Ù ›)~vŸ13ÅÍLAç»ó¼:SÐÀÈ×ó•3Çõ(lÍ!ƒ™¡š3®¦øx±½¶CKQÆÈø`†I «Lð‘ºØ¾ÍÓ=÷gØç`þ»˜ö{<0|(J ¸8ÜD¢B$Y+‹Š"5«—ä@€ô¡&ÙðB£E:éæRŸíº6±=ºïÛtÓ}û¾}“õÛ­{û÷ùµ{¸\Êa>®ƒ43"š™Þ=Ag”áfn:c$Ð ¡ ½xh±"Wfƒª"F7ŒþH¢3"‘N4ƒ”×â@ E™Î¸qãÜ#wdŒ£ L©ÔzcC<žÁ3CdÔBCQ)LåDA%qÈ!‡l-;ÏZß3¶Ç²e[š¥ …¬ªªªXŪ*«)¡J1¨ªWµª¬"YÇZBÖRPÔÌjÖ³R˜ÙmX…º¯tëpj^âzíýJÚ¶-Å ˆBµÃHÛÐJJ(ž(¨¤ÜU4cðÁ`DŒFÃAÍ;€3D +\$>>N@>åi–à c”B PEN¨†2:zAsqE³¶Åà RŠ#˜ymŸ !QL“mÈ҃‰Y:mËÃX~㐲¶™’â "›$ ¾„¼UN‚9mnœÁM‘ùSèº"Éʬ…=Z)Åwïȫƹt%ôñð$ƒäjÒ^¾q$~°`¯ÕÏ]‰TõlE†:í˜*d¶=:* ä#lœªªn"'+`BC Á§]KÄݖ<ÀY3A°ÒUWÑsžT!´$=” 8H «íš°X×cÇ ‹S|¼ÕFZ£Yñqa¸5ё&f$83ª`¢ÃâÓ»G‡þÚh3_TÅ·«r¥:h"/X KqÛ®j°+zžJ-k”Aäj¹A%M³+!¬IyóÅ]ˆ÷©HëÉîH +‘„€´.v…sࣘ„ìêý„mûB‘ñŽÒÿp%ºƒ^ÍOÿ˜­ök˜›#ËÓ!튋 I=jù1ºÈÒ2ˆs›ّÅdo\ˆ‚^ÿ™„Žü"Ö+äÁœÿAÂ?̹]‘Ä.oW + +ž g Š\…'虋8Fù—p¸Aâ®zRå¢Ò‘ói=DµÑ$Õ~ƒ‰ˆ»"ì‰ +ÍÓTÄÅ íÄ)“”}Vã4\a¹ïj䯗À2°Ðî´{ð@Çrú>¯ª»‚˜¬ðŒ›xÎÞ1yN§ÜA4†J0m³´ƒåÔ!r±ì `ùöt ‡úq¼¸^ÝcË£¡F˽f˜¢I5—Y3¯ôÃïÝmã¡WiógéãÄt®ž€Lå_ãK„Ä-†ÛŸ?Á÷Ó¦©ÕôùD Á÷` ç:(·í$F +ÝÊëŽï^™¼Ét’–VÓõÂÑRxÙÁϬY œ:¼Pi£FÓó̑ËÞ½{ ðX¯IaJäd§dðBÀRE¬0ÎÐHNô± âÜxƒYŠŒ½ZØ!Ã4ú6¹¼u…fú !püÐWRˆèž.I¬æ +åUØ?˜n;P&ùãî¸9aÞö›vŠæ^>~Ke„-çSoqœ.c×àyÞZ‚ZiËÒè`›€Ç^ñŸÈpx8€þé…Ï&½æ~Rm!8 ÂùŸ²Àâ8J…Ba½=µ›f…¤c½vÜùjÐgÊ% èÃP&d¶GmjiäÁ_CÎ`‰“¸#€çÕP€Goê‹ýÝßÄe‡ÌéC!¦Ý¥¦4­GUÍgaî"ÆT<_äµÅ¢RÈ°ÐÍ,j&‚©$3¼ yª i,Tdø0ǔ´Ám@[£Œ hA‚sžZ¬ƒX‰ýÓa›Lo2xŸÄɑWËµ%~raÁ3臈, ‘s÷¿ŠyMÔæ0]¨YK£ÓÇIdU)toþϖØ~Ä`(Ø  -e÷t«Ôeƒø‰Öz!dÆ§Ö‹Ñg¡þ—Ù,Ñ…ø_7Hk~ +ȶtnœh¿fvP†ˆjËP¢VÎ×@òK,2/0Äçl7CQ©ÅÒ`Çøû Þn“}±´+æO³,‚ÉSM±8¿™"¹Q šÏL@,5Ó+±Â팬žQOþyi&ˆ9„sC;ä\Û"Éً|ŠÕ¶…È}Ž’ omù°L1p€ÀCçŒÛša˜ì òó„X|øè®ZQ©Šã¯?M»!œ©¼Dw:èÁXnXºéEÐK®‡v*°ø÷‰Ìˆžáñ ëag0´ù.8PùL. qu÷°áJsŽ·¤e¥AuP\Ýꌻ”zSŸZø «RMM&K’Í‘LeX?U\œ +[jeRð?¿,®¤È`w´Á&8$´1½L`u©2×Dµ€7®³JØÊkÒæó•Õc²A. FŽF_^ýUˆ…U䜩˜j²a¦Åªn¨üüœ?LMnhÁ^aRJä¼ÞsF fJ´'%IIÒ‚Óâ^÷EÆNHŽ²Fß"ºšÃÑ܈ +‚›ŽÔ=ÔuRLˆ0‘S +à'U³ wŪŠ\2ÑëHYîHÀÚÏÈkàb\ãÏ=Û9Ok†À+èŽr„ŽöPSì›ÒöhëJÝrºç-ٙӸYÚÒUxR!;þö™†Â2Ea½?ñÎ m&Š‹äL¾3U¡9ÄhœeÑøÄÝE÷%«tC‹@/PìTüX~+¨-1x)C=MˆBt³C­iøŸL•ì´ïb¢nµ8²ð ˜X[=Ô<~ºáZÁc™)¢¬°Xš¿Ñ+Öf†ôw͞c„A=3WfÊ¡bxv!$ò;$VõYbü„ÿT×ÿª©´¥šÀhL3öÐ#õ ö"B,±‹Á9œGÙÞ..ð˶ž AK7*g{¨r|r†›%1!vÉæ‚Þ˜k͔¨Há"Hé/’C +¸¶Š5ß2UBJZÐá@ÂN)µç.Ž“ð]÷¤[Ä<Õ=¦E÷+"N÷ ±òûa/u†Q+´Ñ·xs"–âõOýb§·uR$-é!­#}rC@òÿ#;II<é8ߍO ×ÆÒ} Aڙ1¡{‚EÔ7`…ÿ<êZpªÏ‹ÆÆñOςèrÜ#²÷ »Q‘—P~ŒXÚÔÂbė²yFilȼ:S<9‚^`átÿ†“ÚSCÇkH *É|4ú4‹*â$¡âoÀ˜‰Ö¦!‚^¼*¤²†hTÃbEuºÎ9HέêåhGö-Ü~È6K°‚ÂÓD%ýO0,F‰Ã42>{la’fà‡ë¡uTôi€~ ®ÕÏtªi `™Õ»O`ù8Çc\߆#W°†™eꐠ¹Kw]ÒPî­òpó6ÑtY×ÁˆYÎ)$k=3nŒ<ùàÙÐ-Ö-rQ™°³;%& \ÔL-Êq¡ ýg¢P nÕ#ǎ(óí_˜3o±Çùµ¸±ªêVÆɲÿìãe!òt‚y[àôOB‡˜¦çsÔR0meH¹ˆÑ;Ž¼>D”7í9ÚÑ6ů̅Dè&¸€›ƒ€Æ~Úª8¦½—´¤µIrKJ^(éàñZÚLyÆÖCþŠc£Vy„³e˜”¤jæ… l%R=G-y@IáË\#­yKáÝ~´³lMà ;V<ÙH8Ëx9€%Q“%¸d1µ¬š³°çz‹eϹ•¸J´º?õÊ¡CQÚ+–Ú]ÂÆ\’,×@iÒ3àQ@í¢ÛrQŒÛÜ´rßÓÞú&TB0á綳u“à\ù*žŒm·ÀÕâŸ1d‘‡†öøòS£·2™×8*õ—Ì‘?çs\~tsH„²ç”ÂŽd‡Òèu9 ºN¿´*Ö­âÄ¥Ò¦S›Bú:]#DE“×$„GC ­CÚ +Ž¡DÂj®$w(’ƒ{v>§}1‘1—â–$Yyu™Að…æéW6×rovžo‡ž ¤é .*¯ŒY(`9 +|©›FÄËäé(y&½P¿@­«­Ù_cà|W24+ÐÂäMŠÖÀˆ"­ƒŽVȳZäRÒ2GÒrÒ=wŒ·mn!z5íZ.#Fyó1€L–Ô‚õ×4ˆOG(?hÑ ŽU1ï O[ º‡ùKn)ŠÅÎ~ø"a€ÀHW" Sh 5€»' ¤ ó7`¶Zt¤†rë‡0>ÌK?˜œ^¹,/)ñ ý„ò†t°R¢l*-€o[Ût&Âè£×“RQ-Á$S,¬&O7~ÎR³ÍGPqŸꆎ¥h„ÊôR¡ý’¤9ú›?˜˜XPwËj£.WìŽvüŒv!P0]ÓN[P!ÌÁÞFM<dãÞ`î•ã¦—ÁZ‡ºAc_8c0Ðì««knÃ`ˆü«¾ µ SÒ×-ØþMì°Etb JC[ãܕrÑÞ ã"àŒÙ +MJîðùš>ƒ`C6ö²}%×$ȓ²«öq ÊÞ÷Øv…¯5°AnÈQ¡Æ±O¾R]WŒË£çt¶ŠõOXA‚ Q6îç!X òPó`>`é ++ޕÙR¯ó ¡L>Œ=ì¨+êWÀÎ/WÑtAÎôŸµFׄè~äÆòäXì9ß`I¦˜pµÞúÿ5I˜ë!^ÄÇ-âí¿’²ÆH4ƍқ`o¼ò»à+â_qײ*§.춿€éýú녀“þBWðùKÜ(á­1#ѓ×هð„ÅQP’}.ÒF~¿ªEugô¶0Åèï~‘â1Ž¤æNb‹ÊÛÛ®KÖdHH-2¤«ë¶¿ˆ“ïœü¢]'×Ëñ«ÃÐkàì#Nñë‹Ã/ u¢Ý4c]JØ¿b•=¿/=Ï֑1éÈݗU2ÃNZÈ:“C&­¯È6€÷Ä-˜†ÕW—úÏ=F" >}©›X¶ô5¾É=úÆìµCèäñ{]þ¨ß,ߤKä¾|-£Æó“#Zc“/¤e|ôñU•ÊÒÁ¦k>î%¥T.9ïÐæ+fº¿×ω2é¯q4éûy/á“ý~z…–¨BRšEÖùç¸Àèqòþʘ<̓ž jO£éÛ ¯å(‘µáP5]±wÛkjk* ‹—{w«ãþW™íÚ®Wd=‘^$kYá¾õ"9r4fn&Y¯·D²‚Úê«`:à…|€W½Ê¡ÙV;[9ŠÔk-½ P]¬RÖÇÄ éÅEtˋ“kÖþsÑ<„—]M/¥zœWÚE/²å%¾1ôŠ’GySúÆb àÈ ìU<"F6Š%%qÎëå€wóg)—Eë$o,Šs2áä…œÀ•¼dÙ×=ò—ÑÔðÃûž˜ +yÕùµµ.|ÎÁããŶnAÇkBªKFGŽ#÷o¼\[•à§”÷ `Õ3âð½JdÀLÒጚFâ BU¼ÅóÝ6WVâ.®žPð‚Èãg\Ð +ßA¼ú¿FÀëë|&"Ê¥ÔÖÓ.°I| Î A…ûÕ®tç#¨´I©èlŸw±&i¸ƒ´Á=Þ`in`x‘yí®•´îzӀ‘î²>Ï]¿ôÜE(¢A]å®olpæ‰ÿ㮔[#܅øvá¹3Ëº$Ý.Û´ú9;áÙeð5¡Ð¼ÙEI¡]ìË.Þª« §²o£”K$»È7-Œ^Õ¦žci½…Zõ“s¼ÙÜßë";Ž¼¿ë25€Ø–VÓ¢isëšÄp¨u¡ßQ0 ͈8ºÜÎÁê)±3[›)éز_(*ÿ¡àª+ìM‡TW>ÍE K(SÉIDK€òñÏJþÒżÞA¥k6Qß3i+ðæj´ßXþE½jcƒ¬=ӑ‰®ÆÀf‘,ªÅ‡®'¦…®Ötƒ· 'Ë`]aë¼-qtÁ&Y ‹4Wœ0Œ“üs¡¥(Ö± N1fŒú\f5®ÀZ¡Ëÿ¡>‚ÜsÅ Éðot« ù¦vXk.°P¦¹ÐY¿æ€pýe.ªv«Çàø+ ãÎúUï×w¹`ŸÚ}ËE¥Ó,®ä=\¹è*G®®ªrYiI~§\ô ©kÀs”« —6×Òu>ěärç´&mMñ#¹©®E.öé‡ YvRa*ãA.k$ðã:NË6 ­Î)‡Ý‘Ú6ÇE:ópã‚vÛ W¤Ä1¹>@d¦¸;Æ5¿fè7 ®¾<Á·¸:æe~Æsi:`Ë^ï).âÍՒN\§`ˆöΣJ.ûٌ¾G\9H®5¥{̧ô¼õÒv’%|o-Á8ãÂ÷ƒ Äè\X²S³G¤é-NÆ»û:$‘ËžTÓåêï¸FÎóL¸ºÅÐRtÀ¥@Ê@àGÒk ¹$öèo]7$î·¬³ä4v(,NnoqÕuù¸Þ2 Î3b/6a"½µÛ$HÔ  u,ÉØ0=1†´ìnyÖ¶[9f¯¿ Åd^*¯R²½nҞ²ÌtKØÆTt &ÌǕ¡13! hŸ[¨Ú.,7·Ð6‹±Ü¢-èwLåF+ ËöÉ­0v=Ž[A¹ü›©JŸ³jP©¨Tò‚áq´Ý­qÍy/}»¬R6Áyg[pMômá®5ì™ü•„Æ–ÍTk œu샰¤ã˜Ú;¯ó´µ½ÍÐ¥-ù}èöQ¤ ¯K”£¶zVnäÜuüU$•µË=É堂óÕ`ë05ÝbixÌ"v`ë͑'ˆ «¢4ܾ¨nSdȋ1<×BãôV\‹Ää­·ã„ý[«÷¤ÕNL>@ÝÖ¼jÀZ‹Éš¦{Ti-ŠøxIÊȐžµ`Áª®r&e-ú°Oè‹ÂÆZî^°·ØykÝÿKúÕlëéƉØ՚ÞÑzõµ¨ÔPùÔNnV!°ZÍê*Õ÷´u¨ŒßirñˆœT ë))› ¼UF¹,°èÒK& ¶eåÊ´j5ùmRZ(؞tó5)ΩiÿY§T iÁ\Büh"­§}( ¹Ÿ~2Z¼- ª"ˆ}AËå™ »ÒŸö*×ãCkk†Êù¿Ý+ÂìRFs_®þÌÀ~S Ÿ…q;™T…®}V։€¥š¼ƒÍg±7rŒïYkœ¯g¡¢ežõÝm=Õv¥2ÿûúzgÉDÅÔS¡ý¹ÞÙgcMÝoV<}:èf•¬X¯¶k l³èy6kt$*Ü¢1\9®ËÄg¿nõf<óÐ1æmf±ØjlÙYȺ­í€7™“Éẑø—Óä~ÜaÖðHÔÍ΀Ø>Ì\Æ:wþ‹óç—uâEtô²`£¥Þe]¸ËB¦’ü-k2ù&Zvª¢;œ£<‘í!‹‚ˆ”™5½ˆRPʂ¯lB1ʂKä,CòcÍ@º̊Œ‡;l²ö««NÕ¼Ô2Yp{J#X¦Þ̱—VìĚÙNH _§ɂe&ô‘u±Úù,¨Y>Ó¹y"•-f–‚3*ì˜Í‘âù·ðÅ¿¬\È2²î2Ȃ&Ç=/xµŽÅùWÎs,twxôŽŠU2Z4­X°Ó°pó/ÏcQDK¹b"ÊÆ+¢½ÆB› ÆXÙMIÆZŒ… VÎñÙiµ{ý„PF…-Ðe¾ ó¸©+˜”¹<§XÒ¹2÷ñ£X?Wìb¹ñísjܛ+»én‘)!DaO—­Ú‡ä°–†ç°(bçŒÔ£%}ß°Ì_Ãz9ý Ë6cXïA^XFš-,CÐýjÊà\šøaÝÁâ®öM?¬ë¸^éʘTÇê¢zU÷BÑп_‘-b'¹ªZ%…/X©4“.]üŠG͈{B_˜ý3VâJ|G¤D<5¢¯Øن«áb¹ÔXã^5lQr­XTýŒËÎ"ô ð<ïWV,lo剻òίöÝÐAOŸãWïÙy_š¶È!˜ÛW[ªlzØõeZˆÒW>„(/&S/_Ù¸N€ñ4’¾š~!ß+t›îh³1Ù(WÂÛìU£¯WÌMø“ ×>½]„éÕtꌤ–Dzè•HCØçn­J'É-¯|>ïvW¾³yëw»<–>`µöß  =à{W`rw` ñ¢Ë)/"PDÈs‚÷dvË3{\½zöNµ®ÈM NʉüpçߐØ>z€KWX +Äè +˜u¨g+6Ch÷äªÆ5ǹB„œ‘ABZe¾ÁL°‚\Àþ+¬–ÖŽ•Zîñ©Ì©®@Öü¸Áé1½í²•4ã¨"ÄYÁ”)áJï4µúV¨Z¹†\ž§ÄkTž°QÏ‚BÖVt"mõúFu•Sù’Q¸Ÿæ;ýÝ>6XC§m­©ãïZ\…ÈÞÿ‘SJÈZU+Åo6d©²¸ZQ-ˇ.U«ïÜØ#N¦Vð–Ia÷¤Zr«˜òb£V‹)ÅÓ +LðPàu*U‡šx R…<Û´ŸU¼®n,Š·B#+…žýøÞ'lŸ$ÕH-gueå Þ#–FLz„@߬ –•N $­Y5Qð AïÊj9¡Ò`Å4õ¬ìo%•(YE2‰âÑ›‘ÕÕ@Ô<=dõWåþPFñª†u¬”÷ÝX­Ÿ;0øÛÈ[§\¬ +zÔÀâÛ}USòtAWÁŒ‰ÆîBê !«Ì*‰¨¬4².^°baȸ«*U’Ŧ´rp'`&"Ì&ä«®Ñ7iW¿ÞÊê”8Ýt‹˜˜V6Ⲫµ^.§’ÀÌ«ÐìOÆì­RW0ßDb_®"ëÖûãª9ý®zíÀÄL$†}”jåôv}¾ÔF‹nq:Ä4ûÛª!j¬lՁSŠépúQµŠû{„$õƓU°Ð@™Nl´c)Ç*®T¤¶µ|ŸA± +¬§^ àaUs.O¶ðDN-ÙAøBWTËC‚UÈ°¹ßòùU‘Rñ 4Ղ]šõ²tD3àOøœñ® +4rUE•¾_á½UA!¾Võšó³ª+ÔÂƪ ÷^™Þ¿ª@0äõµ„ <¢+¼Ä£ª(á°©ÂñR•¼ž¦vÙ8‰TýwâQe(Ñ[W¸K%6ª ëñXT=ù‰ÂŒÌR‡DááÕé$”ÿ£OQր_¨¢^,åƒg T,çî¢z[ÎÕç»CA-ªñ^òBݶÓGm^¡eU6ý@ æ£Mõ k*;œ!å-E &ªûø“ Xxªq%¦I¿Ž!LµÓù¥Bªh£  +¢`&]äãO<¿[ñdy32µÄ›T”kÄȒ*ºIŸÀVYØ%-Iõçõ™ÄåHÓk•¡Ä¸ߋT`І ýŠ¤õÊ*üQïÁ/'ëQÉ8‘‘á"›š)_B%£‘, íåæ- h¸C%}= ¢·bTršüEõ¹0tÓºF72òŒ*ÄÅÿԊ'‡p|qŽ _2TC+#ôî2S§øôò¥j»þ|„jÚ#Txd+)¼ +Ñ6r¿¹À‰wfÓ¶p{©ÕJ³eÞ_÷šä581°*Í}jÒ|°Š vAŒE}êð|°Pgó6˜OáÑ …¬§þíIO!Ñ8â¼InÏS&Z•@yŠ¶dÞñògÕ*%! +…§6{$òB¼+Ä®2@wŠi;<Û©9íÊ3a\2ÃØtOÏ5ßr©Xª=8 ãÊ,Â;c p$‰ãÔè5F§ VÏ/CMT=÷ +Èï `ª˜LZx*ÆÚþ½©#Ö즀FÓß¾öÌØnS++Jw¦fÛéÙL¡k5– ¨^¦²Øò,HñÑdŠŒi‘)6p•Ž!M(=¦@ËÀژ‚?yu1° šÏÉÓ3 S´2¨ÁúbSC$O þ—%!.?qo/õ3‚ƒµ0zK½y«-Eßš9ÌQNÆËëk)d“WÒR ²Yg$ P±OuúÓç¦ÖӉVlïʘKŸO¤i¿ïl’{JT¥èª#ÃéWàè¢ÿ©“?¥Èm€o‰ê Á6¥Ð–Q–RO‘’B­ÆԂ)’J\QêϟÞ@hԎ6 DæÞ)4˜FÀ]t+B1½þ#GYóm¢!´|1…Åïü!ø a +Ìk„NJÜw¬-oJºbT҃™Xø“Fu`¡ø”ÕVªFX&ßëý„,óçXî'° tȂK3<ÅJ2¬ìɪ+âÊi©|ˆÇË{¦‡Ó§â+tj(%©i?\$ט]—çtÛmã€×ú¨Z¢ìeÁ“™ºàÁ˜ ^9Ü÷‚TrT¢N9¾CbÜS>ÅƙÜÊß½ªÎˆ«~AÊfB0c +O…M¯R(Òê¯G?'£ÖM À§U:eıP–(%[W0'Ì+íXéS—h,˜~ 2çyÜxqk6ˊÂLVÂÆfÂ&ØîU®cðòSÐkµì1?âG@<¼•c ˜Ó 2³êÊü Ïš²(ՆûG­—1¢·N˨ÍՏ9ÕèŠðöGhsdìùôSY\5ï"‡m ¤â×݁’Ý×õ!+ËN~“TŸÈYJ$£>Súf=dÿóÚóƒ0sŒ.J0ùŒÝoÃÒ 9§ÚŒÛ×zÏ\Ôí¿žƒ}P%WtÆïь·윹hµ+ÐQ–À£ ä‰³Û ÒPn€ŒâÞim€v*È8á=õ?%vò®QהÜÁ !98ÞAN3¼1À9]pº½EßȇZbéãÁîbÆhæÇSÆf:=“r(¿b«6ãBÓf,n@€ÏÇîC µ=¨D°’ƒPHä²þ±qàJ‹¿Z)qE7°¥?÷"öüÑqE‹P“ÀŸ#§ä7šyuÇë šâ7Zœ'©Wí#TÁ^3By>Í+‚L +?næ¿Â¦#ìªñ‹ÝO»*¼IoËf ±ø/rTƓ¨Aóĕ‡ÈWÿX Ô/W] Fz<8NÎ:”IDE,×ðí‹M=Þ(Ó§4OÇ'¢f•á“׋ÏÆ öS¤¹M-Ò4T‘$é Q“|/_þ ”¯a×-çͷΛJèSªmÝT&¸e—)ޚTüïœ-09­}HÆøðëÕ`¾©âAN sjÁsü˜)UÀÑ¿©™ý%§æÞÚ´¢fæüAUíÓ¿'¨‡šñhøùßÊ©ÝRvIÒ0¼N “SÙØØÿ÷„8C²ÑϏÑLÒEéðT]Ðøº¾!bC¹?âS×ãmÿh85ž¯i*¾¨š•.#á³ýÒ¥£J€÷ŒÝصfç.÷‚5Èçin-È5 ºxl¦}—:ЌU +©~8»m•ëiÒL9,øz¨!\e+B¼[ÆÓG²!y›n­|îax¬œpNí¶Q{zG´0VA8ÙP{  P»:³•*ú£Lº7 ¦ Uí6@®Z‚¥žÀdĘÄ÷B$Ñ.?-pth{îSD`:+]ÿ›«çµV¡&{$ñM$ÐT¹Õœ*»Ð‘}Ó]LS6›U³/úRԇV’’øMúŏlÝ;„×/øûðuƒs¨[ïöÎTí¸»×IJl¸ß8ô‹ÐÕer)üE1ËÖ¦XÐNrôþ/¡&+&ù,EùÓáNééþåÀ††)]‰×(Y®†§Öˆâ>pÔ¥ž-¾í‘jù¢‘l©c|¢a‡8ͽZ¢ç;ÁJ'zyŸ­=`£z@ú#7#Œ³ô3 Rä%÷×!†@ÿª×Rཁ K,j“‹ãÁ{G&ÙõØù펢;X~N×j%¶‹®nÀÎþ©ܲ+(ÂÑW¯×“bÁ™v·ÀéÑ$¨¬ÛòчÚ+ä)‰Ñ1ªzŸ3žH㞣´­Äi§‰û çÈm©RÓÜ($eÈÌ**žfwôiÀL¥Ç·ô‚y>/ü¸ÌôålÿȂ~òŒJ/”EH!å‹ÀGÛS=6ÿù@#Îõ«”Ç7Ðè.ðՄ^œl±¼¾‡7*¢bXØZœ¥çdLâx»›*ªhßÿ•'[‹AË=‡0{ áN¢V•’"%™8¢Ý¨ b‹HaϦۡ×ÁâÂgÀ•{Ûh¤¿»ÕYz€$‘áÜS§sv#À˜5À6)X<ŠËW†.ÃjŽ®}¹y0ω»>4ÚlÆ{ÿÿ¦4)8 +4‘Ot)—ãæ8Ap­—k«8½±12xd"<(IïC™åR½Á‡™©)2ÆÖ³æþíºQBY=ä Ï¿AMSo'´ ¯CEõÿTq»‘Bjz¡qkC±Úg´h<´¶™8 5&–ae/¹£$ ƒó»XÖ „! ü©¡el#”±Š»jðšûn2is5õ%adð3I‘´·W j5z¢p’@QŽ£@+Åaêõ-ê†ï#Ì°-š®†¯N©Jw€öYniÝ,ñû»ý0ЎÇEyU%ì,<.CˆšÁ¼m—@(÷ ªØûIˆ ÙýПáÞB\?sÚÎïM‚¼\?’ubÏ=›a²åNg¢“W·zÄÜðXîH·¥£%ÚŽÉAš¼¿à:®läÝf?gDÄ(IÚ&<–³«öË=`ÛÅ®*B£Z²b‰GÌ4° + ¯£ ¹\RþÇYҙžrnïÖ¼×ír"ŒÞœžã3íœÍ‘2E˜c[lÎÜ7ÖËr†þG—jy)Ÿ_5NäÁ`àÍQüî¿ÙÀ$ÔrÇî"¸‚xæз*ªû7fÅÿ8 xW€{ƒ°ßÅVh¬T{Öî°;ùKżª¢`°>5õ˜Ô0®ÐñXSaÅH1‡ôÛÈíКµÌH bOªn(‰åòì"I¬GYh;d%h׺ˆˆØjwÓ'X—…¼Zݑˆ¯@±‘.•z±rHý{#‚\¢µ5±èæ½dH¸Î2é­—Ÿ *ð†1á-Õ¦@˜£—{[âôh±Ò ¨5”ò@?F_£Ÿ[‘÷ͶZ€'AãûcôĆíE„=Èà³-`ªCTjqD‚½saÂr[|û«3¼9÷SË©W ò{¬¶jQKû¢´`에|Ëès§ž=’`¿à ÊZ¡®úCvNú¿Î ¡¨ÒGeY%Åä=sFj6a`ÜèäL‰¢­Ý( -‰xƵ9hÕæÁ,º¯¡ƒ4œ³A¸ýbžÌ^r;çúûCÉ 6€´°"ÇtBWö‘ÏGfž¸Ø©æh›rIÌø +Vºs„\¶4‚Êà5PÖY€´g\A77ÂŹ :fƒ”8]I¶L!'1zž_šB^"f"bzT”Ô ücBµ·Q‚Ù¨r1ƒ+'…ÐǓ‘‡ õƒ‰]¾7_~å¦Î’¿ÌñF~®£?F„l³ȐÌj_só±…­ärtÿöåå”á)6¤C†§Å¿E–W +O¼q•…×d¤´Â ¯rìÏ;m2΍ҵ¡(Ø[ê® ÷¦\W›ŠR àÁur`Õ Uü%  ¯¡×.™ùў¬j­B5*u=¡e­gf´˞0ö=$˜y¨mD 5ÖT¸ú'µ€ÌÒÕ. MÈÊð;†”Ä8ƒÉ>rR‹0“ KÓDìðSÞ0ɛ`ï%[”´î"åìŒm)ê÷·’:;Åá£ÁN,¤í¿»ªBF‚/Eõj”!0°8&š ÆŸôŠ±Âð].UcVeff¡«®rTJŗ*„æ}J@Ùp ÈÂÈbŸf®Hu%,Í·90DµefÛ+‹á9*×M}H*Ýu{u&cþ)îÿ @~›ää&ågò• ù™a"¤aÏìnè§ÑM™!_l•|ãP%ªºbU½Dê\x(Êm0ØLi ÍÔ4ܘóˋú~tÜËÀôÊExdýk‘ è,\1#m©»©Ä>¯Qžr‡)ö)€ëù[¡>¹1r^ἀâô,\(@™< lN ùiՃӮ<®çG7<̓ùæ•*fq 0<§{‡¸?iu#]™É‡m3ŠnÏb• þlÂõ!uFâ]qñi‘»ÀuDŸY r;ˆFm…ƒG™ +œËBH^+ÁÖõI72ìÔ"Ó±2çNÍ¢*¯ûazäDçRM܊ÃË&¡"J¬<\éWæÛg(HŠyÕ¼¹m웶yÃt´S퉱ü•p+bÒÏ ¿`Æ?@4ÍÇÑþãax*˜;²ÔR€ó]Ê¯5ŒbÕ½¦B#ż.ú×M‘Äl,dkºz:Kûëe%;ê¹z(Õ`÷Laåi<'L0^¨ü±õd¢í‚ÄÕDX§ø¬ ÃXÌYBçuæ!Z‚W04±Nš¨+—ː˜Ýç½z9…Ù:fª†ÈC¸®ÕBe \ac¥ÕNõ|æ”2XÅ#qÎ+ãÂ(ëLcTúžÁ`%%ãv-Nï[!ô›G„Ó@XêdÞcnh±,¦ñ8.8Qqª‚ U×䙦ƒÏ%ŒK’X"ˆJª!²£"44VºA[Iú{^A­šÈT¢*£ë~=TÐcEÝÚOF‹èóVhfv--^Ë`ŒÖ #m̖nßUsËG–…²™¥“÷稡nv`òu¬õ?%éÒ +L­xãèôÎ]|F¶öu>µÅš˜( ŒiÐ+cO)O³XK/¹&ŒÂÅHôaëæ-³î\AáoªÀžó IT7I5çú¨uZu &V´c¨¶˜œX ~’ ^7ü”mØØ/µñÇ`¨—$REJ¼r¤*ŽšlJÌæ'?™¨°z¾@P>ÍLÀ« fèFHÌC˜—2ßïbî'9`e®#Jƒ *„Ôù|o´\r­–\šQWCD!G Q¿ ñJÕai†²£…NÚÞ«áØ|²Ÿ  Ö Æù¿À ©“:¯Ï¸ð éY„€c:w>²Ì #°Œh©W¸ç‡\Ûݮʼ6„´+¾„Lé‹R¿šy{jÕe¶K6Žóï?Ø(ù†}¾¾ˆVãܚ7Ošö×öU@£ä5IgLíÚ7À¯o:Ql.=}ꎘ/` …ZðL½sòÜU| dé uóDõ«ø6Ó À^ÿ®s„…=#6 V4ôê÷[0<œËxÎFe£Î»ü“EhÛ6AûoF´kA7c²6‰""Û b·ÊGë§ÔÍr=dïDZ8ž2¸)úøv0”ìH'‡¨ªoGÕ°$äSI®½³y0,ؙëòêr^p¬GÌ G¢¢‘3vìÌ(ž^Y‚H$†`7 &k+* /,â¤qð6Í(f±á¹;Ïð†OΙ|x.+B9ú$ñ¦¦xZp"3Êßéc( +#¡—Ti‚²ƒ3¹fè?1žE’ߘ¶à‰º¨H®r)¶H„Nû{ÇOÊÜÛ´ŒMÂ× +8þ¯DGÖöò©!Åúf£%YÉϏÄ)K£¬âh—¼$Ôõn ®s “ Žçær8ß=?Kc•Ï¶±Ž×¤\K/nju5º¦¹$FÅó9ýJ¥Ð4Èù€ZÆ,r‚1iœ“þ9æçÄ»ß+ÔÜ0ðtGÉ:̱A¡œP!O°^|[òëvÑ*ßÅÿ^pXq8?¬žV½@É؋0 &öÍå8<-`áæ,%Ò`lkž´fääЅUöÀ*I'¶™¶§=¬aÜd‚aùß(x9²‹"¾) +"JoªøËõ~˜yw*ÂÞa—õ¬FcŎ*-Z)¨Ža¦Æ¬ªa®‰D™ (´± #Z…:î«ìÞQ «Ò[j-À¤\MLŠ¹¶]!mµ÷°Î3híŸÃb°Î@ã5ÖtìÓ¿¼¿ˆûsëæ¯EŸÒó¬`ÖÚÜ®æ Jmn)"‡P$pǦ+K¤…X/ÕÁöQĖ¡/°¦²Gž`j5¦øzÌd[oÅ-þ¥š_«N.E¸±cÔ2WÐ?5·žÎÊU¦ÎËß2ãQi(œ#±†uðÕY˜‰l )«j+]¯€©·<öYuÔÜÎs:@dïv¬ `ÙÂ䈒5 ”x ±Ò¹!ŽOƒrF+ÿ±“hî5k™™¡^J\Ï2凘^n„;Üó柷ŒRõs— ôAã5³ò·5(ÌÿÙßÂðúoÙ$ó!ĝ·6ӉµÊ¡C:„ùò:>íØø«-ôº{x—$¡èî&ØçoaF’2ÁLÒQºÉ*´Ëv«"͈”·Ýì„çRöáîʐüÊoŽ•¿”3×Á—ÌüÐJ $6,(ÛÂÑY¹ÔÃà}Ôz‡|<G'‰"è +딚'l ‘¤pFÆ:K ƒÈª™ŒÙ¹e£Á9íM]*ÇØþxï½äUŸ‡~£ˆÆ+™ !¥t-P”ˆO¸˜L¹jŽ€·ýOve\xÏÆzcÇ\¶=ScÛËam»:â©Aþ0›';F+ÂöBÓQäòGn²€D³Á0\¨Ç0<ñµ2Ë ²¤!ºÔçÀU•.þJŠR}X‘$ ÏZKï݊xžq`]‡á3(AÁ wUõ8z9BZȑÞt§* .X‹D¦b‹ÈhÙº“v=zØ¿ÐçT§ˆ¼­èçƈÝÂ$¢âI¢rBDÓ?‹™šºÇJ8ÅÌ:ã»ʋºÛÿ“6 +`?ˆr0`ƒ;À6Ý.Ô¿þÁÃõ½Û8ʚñRó/Ës·Õ¥Ww\²TÕ„¸tj~˜{[€á¹ì’Ž„ +Èm·ÜìH'㎠+‘æm7X!¥ˆDtôgxŒ¤¹ÍÎô`ç::Õ».çr\]Ԃ!†Çӏ<íÉøJäëI$¾E×d6s°žøR‡YœŠÖg¡ôvË|™—öÀ×5hÑòfˆŠGë‹þájbW‰ÁÚÊ<ÂãSR]+¯Å)՜ ì«'´Ø; +µ‚H$æQÏ ç™.‘>1fYå¡7¥Xí€IžRK¢+UO¡˜' 2JncWžþ+ÓXZŒÍ²Wyº AêDœµƒ8‚ºZ—©49U¬„ûY!™ú©•_–½k­šâES+²™qÔj,t•Âåö€­3G䄐åù|dfδôKмñ¢¤àì#ª"üÐËBúÖ0‰\†G[üUؘ%&ºÞ>aT)š÷Š\šŸö ¼m`‚ÒúR»ØsîÕHăyVN/Þ’’b¡xÀ'Ãe¤E_©Á‡D8éņFS†#º@ jüÒ<'£»E±ë>…Ìx•1õ„€Ó+wKé¯n  lŠî|¶zãC„lHj:Cµ…RßUè܅Äm{ÃÏ!bhHÍÀn†¾² YäØGÚøSrÙ½‰Ms¹@ÔÆ(4-:㥎Pî{Ž\§?Q§D”ƒ†›ßCÈDw Èy\©DŽ0˜ìr”Æb@<‚fÅo†šæٌ¿¨¬”*T¬%D¥Ûñ5úʁG˜w íT2ÿ‹è3~¢ŠH¶#ûF+ŠâùPhŸ*-†ãN›[ib,k€ðÝÙ~è?—WPH=€’alÇñ]bʊӉ6Yp¾È’PqJˊóïuQ"‹®=!+£= ×e€À–DÕfˆ’O¬©è8„6Ä+bÜmd¦5R,UùmHI£ù‰ZÐ7ъ‡ºgÖ‘­‚%¡ÄÉÑQ´¸M¸FЩÙ@‚Ü!VÚ<ÄJ–ØØ2 Ì¢íE»©“â:‹÷Ñ e‚GPN EX;fN¥Šñö#‹ÀóqQN`QešðÎñ +Åpšm½K;lË0‰Ä劍CK7jK1pJŒâ»j‚Õ˜ùt{ +-/SE’fZpêïÅÚüBúip?š¢cP_¶ +¦T¤O÷iÂøÝMQEnq4W©‚eC*ÚÓf“ÅîúEƒs—5,v]VˆTRî&`‡õۗnFlDCxƉIt6·T:h[ÊI;£ǦFџDPÑiZÀYY?œá!@p+=á^“)þDdº*>¨ê¯ +ȌM:h¦Åúî/{.Zh硝ö[zS%SÄU@k²Žy“€)ѵⱠ+|}úî©5ÆÏÏr\!¦ß?1vÂÁzX/D›Å¡ n ÿºÊö’ÅΦÿl‚äšÔ̺™BÆ«T” +•©YbsRv„ ;UÇh£–b–oN´-, 1îÀRèу÷GFnr‡ŠE9‰`ªÿډ*ÌS#ÀÐÃ՞³·±Ï3ÎÌñ Í«ÝôŠÒ ÓÖӛCX úšØ£®š;™¥2h¶eqFÚæѼjþu#‚ú‡àñæ*ë`»Â)±?Ю'»åâö*uäìÀ[1¬ž ¶a¸ÝΩՉúÈÃQ(Z³¨œù7$è‚ûNÓHAó.Ғh4@sþ繞/">ù%zJ¯¹ó­ +M2ÌèB¢œƒN8â‹jAlu_Ø{e6|ÖéÛ§—RÕÄÃõ°BŒ&DFÂjöœÿdOʛ֕9­ à€æ£¥3?äZ¡r¿ò¶á‚åÑlAÕtz2c™“Ã$𫒠~2µÏ‰#ÿ†[!h§Qb/X”•}=Y_vÈ¢Cm>wƒß½ï@bL‘¾J‚æ"î$;©ªE?‚YVÔ7#‘Hùh…~€thÉÅ×` v3Œp^´T[t5â–©Œ=Y/v'pÁ⻗%ÿßøÞ º¸Û^Š·Õy¯³qL”î± £Ip®;¦ ýÐ"j¾k½BQÔ^0® .O'×ñ^f\Ûö'Ùd…°fà„yÆ-Ól“Cêi;¡+ÝØTaºñ¢èlaœ,‘™›{ݠ󋵡~Ìÿ¦'†Tꤸ¦Ïx#^æ‹|q¼e'èJ6¼-qHc«’ý€]0ß#Bk{§yOØàxK ׶‹ÈÛ ÈÊ,¼ì +ÀU'ä}ù Ƙ”ÐòºÍRúéRCéHŸPÉ•(;$ÿ ÷å “Êsq˜'oDéfJpP&¯»@ñJs;¼²LJ‘:žãŽnÿ/Å«éٌ2"ò™dC9{ÃObeS¶"ÚÌölbéF?‘š¥tzÇÑn“a«%:¬tø›pôTN?Њ?ûfÞÈÛ÷“d«Qƃ#P +i( Eôk—¼ ÅRbHŸ MšêOTs]¡üãv4^ê’ +"•ªøJ˜*Žˆ²J›á,$Ûêö´ç4àÚ=@–vÑ0W¶ˆ®(ŠÜ…“‡oÅ*éw/‹¿Õmü/Ï>ªÌ TY54D¯A—0šeÀÕI"I苬Êg§Èüh…ØL —©{zŽþ€­ëæͽÇÓ;ÍvHÜbøêgW2^˦>Ÿ\ØBN›8aœ$ŽÞÌ>îbÑcË[jþC¤ZÚ;ò.Í¿/ÑÜæ¦d•0‘7ð²Ë2ÝDo„bÌiïc…¦g™K ‹6jjI™â“¥Yœ¥È®À¸ý³Ï Ëì•sÎØ(¿åĨú, ˆÌgŽ>$m€u3$@ç„Â’|Ðø>8Œ,cBî¤Ë2Äõl’¯ƒò4µË¦Â 0ûÓ©.5l×d®ˆÄ5P7žYêHðþ#Ði|úÌ ˆÒž»¹u) +ƒ(O ŸHÑըǨÊò³T„5Ò2¹f‹™ ¨“ä™\4‘ +ƒÎ® +Š¢4qf°ª^ ôŸ°ö·é8­Îö~óÇ*Ýô ¼vLc»z#†f=»øItH¸¯ÊH㻚5±¥â+ãÿ†*Т’’O~!@MÅQj„^œ-náÃ8Cx©"k[Ø>;8–ÌH–éÈÑ@(dŠg +Öìi´’‘T¶¢Îw\0a~X¢ÎWA{û–-mb€ +b‘7Ÿóâ_;+6£G„§çŸfºAºƒÚEl¶ +£ª¬L,žÙ9ÍÒÉST–ˆ—(*š×‚КÓ¨Œ”Ø ok*/4oŠ–mõ²@¥ôžûc"גËiiøc†|JkÇãZµ*PÄI‰]öQ1±‰ÐÊè{«SŒ#«°ÀC3ê$à¾5¢®(„è4^Ã;‘ 5îF÷ù¯¨âLm*0h¦ç͛-Հ\IŒ1YÎØì6 ENß±p’>Àþ5è5c/7©–”>—‚ݰhkP”^ɖ9Ђs"µï›b4í5 >¸ë!}t­)%²¶ÐwJâ7ÿŸ²úìî1¸›ý9t3³Ù™%µ{¢N^!à'!(àpgÙk^°ÝF§5£÷¯qQúð4ä…-" ÎúéQŸ‚­ÌŸø0ß_úš2‘jQ+1ÀNcÁ· O‰‘úQ¦O.ËêA'Ÿ¦%jdË£k^?—pX±¾P›ûŠJÒE÷’=ùzÌ8Y¯·×ɋª lSŠÙª$cMËåi{b*#ÁÌùJ„\&¹;ß.ÙH”ä›À>MQð_¢Ùê0Þ¯´¤;£ÐÇjFW`¬´©1ži͙u"݅nïpÕ(qI':2TF¿¤.©ê$ó*ë¢nå'„ÆÈ`Šˆ2èÀ#~ªœÂ…üf½ùkÚ¨‰ª^.Žaæ–òþÝAâ7ó,Îý3XG4xÝ"PpäNá°_ýEþ‹Ê®.õ¨!”e!v Fþþñís«ê–ƒ¥[’ ¨¸~ñïC%+0‰¥[kàž,"ƒ«‚!X,n<~ýÜ®=TòþÔB3Uyp¡.Û^E„‡¨nWáGØÒǂÌU<ۊ?¸n=ǛñªHfƒ‰VEÐäèôìªךÎB +»TE.E§ŠQ9ºTñHÍõQÅYjí¡ +ØòŠ|*ö4‡dûáÒaw b‡‹®©^ˆTŸ`àQä†»aiTLZxz5‡»¨8¯~?Q~~éCÅ©KM‰Á -* ËèTÀr¡s Wôm +|†÷)€ª|O±bØ<ŇÛhúïd®Uë þÙ~¥Bš¢P‚ÇôºvRÐy'ç-Á)jÉR˜“ ˜|è£„šzÐ×á‰<—ܚàŸÈ‚žDZ£˜kR*…ÛÌ C(x¥<¬SÄa«¨EqðYïQ¶¢Èˆ’ !ÿ¥*R%õžn((—´mO(Y +Þ#7R3kúBÁn\Ÿ T,I2Á±R{… +±Nê£q⎆$Ë¢zžU(âª.€¨9Ž£’2¬U„öàrŸIÏz `Ӏ +NP·/1š:ï€æÈ#0"ېELS”úp7U›úñ!láMÃςº ¥zì¤æ@@9> ï‰woëÕÛ0'CÖ³ôŠY™*üŸ'Æ Pžë4õà2¬ã‰‰ÿ‡Iƒ1<ч;6À˜ì2r.@±T’£ˆB•ÌáHš”FDøª~ÛhN$%–0$¨ƒwi.]}CŒ½Ô;ëjj×Èمújܖ90ÈñþÏ (ÅÌ‚ vT2ôCZZ'ô¡"¦µ,>„p雄½O&ŠÈ•{ñ‡Y+Ì~r¿a„ Y.þcޟDѳ3Ñ>ÉÛo&2“Ø¿Œ^~Jg—™ÈFè{™Ðvº]lõ«"ˆ™˜à·¡ÆOQuï-‹ð9L¸}ՓJaBU+¦Z§=˜˜yÑ 4Poù Œ3‚’8‰sÍA(ã¼ÄL³TšÍAEKÌè‹òq(½ 5Éþ'.ñl®6àZ#V´%–Ü«Ck‰´á§8¥%>p…2OÍòÌ"M‚‚Ž³>·O‰Vë…o5%Hî:ˆäà5•89LÐ¥`ä ¢Ï>>œHÞ$%ò‚;Çšl+†Ž”?7æå$ZØ/HÝ$›šÄ—ÂÍMÁx&õ÷˜„ãP²êÑn—fðNJ¼$\nd}’`)MyI"7K¸×–c$%ðÑØ9â¤I´÷|¯_*؄$¿‡P9ã#5Nµ FK'îbxK@Ü{ÑEbÈxEâõð‰„á6ÓB餹D«ÌY0Îéõá¨ãFÜïtƒl!Ùm¾G¸¡T71ßq¤ȄI=—Çžt½°Œžæ†°!¢ª>‘•l#(RÌ;璍€. $"d𙫑†äi„1‚ñhÄiQÏÑX€á,è‚+n™LÁ#qžlpp½z»ˆ$=ÌE@¡_{(çùâ¢<‡@Dn ‚m $,¥ØÎÖCÛ=Œsz›EL§ÈÀ*¢uRî3¿è½8BNj÷:è¶eš½›w‘Hgõ0Dî6o…¦Š¯ë\ŠðOImEäñQÃF¥îÖ0‚Ðte£ ¦ž}N]ˆŒDteš3&8ŵˆ3Ò q˜røEoî*mÛM,3C$%"î1)Íąìî4{—¶}8VúàTˆàʬ"àƒÁ(¡ 'õTÓfAA§¸Ëf+Sú†à« ´!ÂþHÏ†8˜…23TíÍ'„ N?†¨€Bùt0OÞvþ#âpX<ü©6#ú¤˜˜@ԝ„ô]‹º“ÊQà#b`EÎ^ý9*"ׅ Ÿ43&õ_YoFÏ@y7åˆz©O&V N.wÿ" û¡ñüƒÜ›þþ(‘[é9Ò]'…>@¿ÉâX0³ÊᇥËäj„õ÷\óÉ>|øŸn<ÅB‰ºøㇹ/~øú­|K@l<¸{‹¥}˜œS>2 Ùæ&#/à‡$ùÀvV0ªÌq 9@TA‰êð”®WðÁ7{oËqðeFÿðBí<Œî§¨ˆÞîh¶¼Üª¤ÐjsîÞ®Ÿ‹C°.^zÉØÇv E‡¸•²/[dDõÿ僻ºÈ§‡yé]zØF÷aƒ&™ÜѸêXoRGy€?îò°„E•‡qŸJ1¨r®J“‡\l ÜT äZ+ƒükZ€O.=LAŠ¸Dÿw¦·ãò ¬1EÞA|3‡P +Su¿è㦅|u‡6ûñës‡TŠÁó±ô¥¼él¹6ã²C:¯õ†±Cúµ’#þ°ÃB×»¸WFzZ’GS ]‡ó!Ö +¬…£3n)ˆºò”3Æ´O…¢’œ.… óé@:…öD ÚÖË9 I2öP¡òY´ š +V‚éÓÈ)ˆ½9Ô¤ÇĺÞ;ìmU?s`™1s€þªig/`Jy‡N¥´)*reN.ܤØtö»Ï ñÏsö¢äW$Í$bBiï?LÓ! v¨¤¢Ã¶aíåBb  ‹I[¸áµ"ηáØãIû„ómum¶ +­Vplõµ¡ØÕ8²¯ËéVJ”Û´Ao֔8F GÿR)…ú‰[£xRu÷¯!ÃE{ ,ŽAp©N¦q½k8×!ëV’2×Pîc( ¡n `?{>Ý' Ö0Y,$ÄÖÎAxý-¥õÕÐþ‡y¹ÕJ²šA|ÕL¥¸¤ôSCÔXj*êéRø\¡p§AZܓïð©Mr.8Óï2÷† ãm¹ýa ˜I&R¥!Â3¸Á¼ÐzXKˆÔ3:iÀŽEqÀÝEG*?Ò@.c}Û-˜ŠC~4„æ¡œ“ú6àùG'¹¼~!Y¦EÃsiw²M3<ŽŽç½¿ ä÷Š_hàççè=hÈ¿¯w –|y´6I´'?{ãIí3@CVÞpQ»g ú ©qžav„ó;Cºø‚Zæ ^Èk¶¹!w•ÁɁÃÐù3C|”b½Ìp¯Ë(x:®9f€¤tm¸ˆÏ ÁÔΝ,² [°GÏQ“8® {‹#ósJ•!¨h#S†8 ë5åfe¨Sby2ä¦f»É¾~õ’audȬ£_ƒhˆÊ3ˆ djhiäáí¶åôLO³ÕËÃ¥€Ùc !ç*y1´Ñdd<õt‘<`g>|s}}•ˆQÉ@T""ɒ$Y +²HSǶ,ÉNU¨¢b«ª¥-­ÌH«ÕÖàÕV«e­XYiÖ3k͌c׺a\ç:íµmékk¯îQ´ïÕñ7:z£²Ïf*»|ç;Û<ßñÿoPضíóï÷#ý)înüÈÿ9+Óq÷»3ŠiÛv…Q´W£°i_—®ÙÆecÂ6ӑÝn$’”ûÍnfý˜ ão6)½…Ø¡X‰ÅâÕ Ì4PKUÒ`NF’q4ŽÆ£w5êÅãÆÝçq绛™©™!…ŽÍL;¤P| b &86JHHH Å$1 1)„1¬&á’ìAK˜ž°Ž4£°ƒÜ®-)ö+fv†9YF‡·HÑN jös$…¬U_ÕðäâƏ¯ìuܸtµLâ‰`åùšÍvýƒÓ°.囸ˍ ì†\±òG¹%/ wÈ­Rì:Ã\&>ä:M¼¼çB¹±å_¦t×)îhYÖه\ã:±]DnÒ¼"Fu9@«´înª4V¹±2“»¹"v6EþÇ¥Xϧ»§‹Ü˜TQTR7†Gµvvò‰œPüT7v¥òk‰\ã a¹ÒMþŽò¹%–!.¼YXà†(2Z˜¤Ù9/NñÆsbº Ôw]›ÅQ´R«K¶nŒ1sRF´…nâÌ>Ë +jäöÞÒÿÝØÏf3¸QåDN*úܔÕUsVpd‚8‹m·ÉPZ2K·€Ó›tòïÙÄ[át‘¾¸±‹çT¬-‚H7¡ˆõ¬\87 >jüƒ0uËÁK-å}#07Í-f%¯äÐ"nÍÆ,ʓVi‰‚¼ÉÓ¤ŸÔ$ô)‰^BXڑ5$±Aƒ¼ªùhÑ&ý žÝ»‹7ét{eȺÑu>· 4Ü2XÛÅ݄MÔ's°2_#?/÷ÿTÚeý]DžiùdB B³P3~¿Ûâáҁ/F;g­ÆªÊQšFëbκD5å´+çüòc—ÆC‚5ðJÁ:’þ®2<Ò¦OڐçLÐړ» iiU1Hÿ?dP=›Äœ@:út¤ÿè|Q²ûèÆπ¢ÅTDÕ=úS™<šèß õ{iªZùïèD +X\G;ЊuvñâhOÃ"l„VgÚ…‰¹¸ó0ÚDòJñE ƒ#Tþ±E+"B[lP|E·TZmÒ ºã€BY/Š~mñ+±f€›hwÈ ‘åaÐý›ÇJïÐZ.¤sè îlßeš0TSÍ;È蛝LÕchçòN·D¢æ¹l èç|t+/ìï³ e«ü•Õ¹E¼-4óÔ›<‡•]¬`½{ŠxÙZ{qpi~tÒÓÜ:"Ò³ úÙ*dÐDYrú‚ö„®‚É$”_8U\ÆïyCSoxCâ<ë ‰äþúÇ&¥*ó>Š_}aùéŸʸûó皲çÏԟ)es?6­~nAÍò7p#™Æü܀r6% Þç¦v»Ûgã è®ÏÈÉ%HŸmMXÙJÐà •žÏ6h&\>ÿ&j sî®gÓàÕókÌ"H§çpŸ®.Fôì+>Ä,ô9ϳ¸œ~#_»%¼xg‘|xŽ±nÏnáü;gÕ£NWõÎ7¼°lîl‹ûzìyNÎC±‡QÖDÇΪ؆ľ“@–ùۈ1žó„ÎE%ևgº'T8:çï;ôæ<^dòÓ'5GÌÞ®çüR]N΍õ5r6²Hý"EóFR£ÆÙé~qnêh²™†OXæ%›’L$Q‡©i…)!¨Ú—{ÖÝl®q[ÎáQ*O?7»m›kâMâf¿s(ó:v„q>ˑXQg +É}®Òæÿ3kžÍ„Ð4¸É&qÊæG4ÃÇf’E)ƓOåS3š`¦éší_¶æ oÈÞ`‹hp5c§}ùZ‚@ n§fãd¡Þ]·©ìûg³¡ùU2;{eƒ]yƒfTÙ!SF2”"þ3ûer}?îøYB#Agfá­\™#ó¿Ìþ!Š—*=­Ì¿T…LMƦZâÉ\>.‹È¢êqÀªUKf÷œä~W#³µ¥ãÍñúÙ%}õ³–FÇÌM'Q§;,àÁ¯‹![æ™»EøâGtÒ*'ÌQ«è`î²Ø_µ(his ýæéø"<ˆôg!8hZr#Ó}ù©–!á0LaV±øâº\äø4ìC –‰=]¾m™Ïê¹ìÏrQ.Ç[nènc”öÇn!e¶,Ï ¯å?aªà=EaùðÓ²eçhyƑ ÄÓ,îˆê'>Ê·*»XV屜É)‹År¯à¢O÷Š:ùlƒ‘¨†½•c£.9Åx×ÊNÜ0+?×åR+¿56¾e¼ÊìHY¸ +’|x¡ŸVù~Ï\ŠK\pUŽPù„©r–¾üM_Û3óë©ü·6KåÛ(wTöeÓBe¢ ¹ú”]HçNن§‰¶íôSšgäÚ¢`Ž–5Âe¼†ÒE0ò}(ÿ˜àÈÊ$®”’gÓC9‰í N[1#þ^k凇ä-Âd§bu¹AÚvä'ÔÝ-Ïã2 7é" û‹Ñö“MٌþØmž½ŠâIg´€Ìn•Èa†ƒwíSi +ãQ‚Ƙ3'҉¾¿Œ7¥à»±'Âe¨Xáý>ÚâݱcFã%4,l¼˜ñ°ß +óã;ŸWÇè¥Ó=Ûªm>:Î~*õ·`&³æÞÈ-\ÀÉÆNšcWy–ãÈ¢²É±¾Ÿ­Ï¹5Û®·ޟvÕa‘j™jÇýƆ)HEGF·±_5àTŸ³/¡Ó@R¡³±Ãxcã ª†°[4{[ö¤ý4ƈÅJãèÑüqtGQ'¢ÐøÓ²AXXÿŒC59ÒüNä!iÔåZ1_Æ‘+¿º©•±c–NDÑV-çÉøata"¤1¶ ‡@/˜´Ìäjâ)†t0ËæùÓà;lÐ5âÿâ“tI6qn ؾ˜‹Š©¿"¶ +6×ږ•“ Ŭ[Sþ»Øg€èŸ\}ò¸@I²>ÛäÏs[( ãb/ÄMNð: `å<ÄPž0º?²4æÉî¿b³®U™Ñ܆H•u£+±ÇUã~VÀ>ފ=H˜Ù¥ã×öí…( ¨úêù’/^rµŠ¿ÒmŠ 9E® Ÿ¡È½#16õ}kŸbÖÐÓÆ Iɝ˜øNøRÁWd½‰ºØŸ3× 3qèd½nLUy½—8FÙÿj:lb¯Äÿ¢õ”؇ý·“X– ª<¹ýŸm5(ñ¸2 +&í¢ôuÐGb—C_rÂkK„Ä“µ™Ž¯¡‰á;âÝ'ƒnÄæîŸW1ÇûŒxÇÊ¢/bÿ^ۂ8;ß9/SvNç<5Z;6çû ¼¹²b£ð琏¯¿!—À¤ºc‚Äq\¦çŒça_òñp6q¿ÃKxÞ;Êcf’û”tØST2ãYäÆâÀ| £z+éËÊðúâÁTã9Џ¿· T~k…Å’d^˜ˆ†ÝÂý §' §s1cÊK†]ï1<¿ìÅpY—a8WáV,¬%-`/üYj-i ”‚ºžw?¦-)lé+œ9X“Ïn+üýF¬ì€ò*|¯]úŽÍÒSa)ÌSØ£ ¬KŽG#²PØB´/¢cW'ò ÖÞ—a? ,[Œ‰ÜW¿Å°ÃMp‹ìj«‚ OÊ*'Áí³˜}õ¤Ôz{ÍÔBçG•˜¿‚Ÿ¬Ó‰ÖrÑã«;'ål~Z1²8©IQ{/‡2¤¼u̹ãðà ܎“寣Z‹…Øt-÷8‡Þf…ŽJ¯ŠE½Ï’ؤƒ3 5ΑjõÜ8°@ð °¼jtU1#I۔Û¨ð|#Ÿá¤RíÈÚ*àq¾XˆÕ˜[;ö° úF`u"ÄXؕž'ÙDI¦ÃJÔVj/ä¯'¤Xu)ÿu¥ï_+²Ùêß´åükA‚°øíðý=AûëkïDcõw³‘PÓ_—¨{ûÈNx;I‡Œ¡ü5®ŒQNŽOws;4 ƒRúÀ5~ŽþÈé՟~#ǹˆ~=öŽÃ)ÿêi»ýüæѨ¨„¸íæ7î‘&ÌÅBú›8s/Ç©¯¶ƒ¿/à†k¸÷µäaÃì¾YYæ¾!EóÛ×ï^å‹íµoäTTœ}:¤±/<úI¥a_ßûu¢ºõ k.æp)cõ%O{õ`À27—Ô·Á†œOß&gז¾/kª}YP…¾šëy*¾;7þÃÕ×ÂKW«‚Ós£§ý¸[EBOšÂâðÿZt,A¢Â?$šÍy#S„úUù#B ­íR"Vêkhl81Ÿtp¥ŸÃOcB +Ì)¤‚<-ÑįŠ—jÎÁK(»ÒŠ?!B {ùš±ÌøçžÎ3V‰¦ò¨…6T [’jK¶CóË]X£b­ÂOÍnÅï¦ß<§\_Œh@¥"h±Aƒ¶¡Ð™9n˜ZY¯éœÙuGôc $GIsËYú%-‹` ý‹¦Ö3•œp14{(Qá`5C‡ pùšÒTª¡IIÁÐìK‘Üé, ¡o‹Ó?ô(Ó6Ü|µ::$Ç  ¶Yœ{íŒ$¨û[wS±”Y ïq›Nƒ²J1Š€t|ÙÇZpŒ]ÂOâWø ¥QÅþ‰=§»;Ò!RNtÒÆȺ9sYne°jŒdvxGÁVÑæ‰Gn4{B@½s~sHê_)âT†´¾‹Óï 7‘ˆAV‡ý§=nµš¦,­‘Å•µ³ ñcLʏ†å1рИÙä('bnÉú1F8{Œ‡.yƒœry9"3ˆD;©œ—ûöÐGÉià?.+7¿á"¢éEÇÎvn-?gX¢¼Œ6„$ë×B&Ae6.įAÛp°b lt¹$Rä¢ö†²½æ¡ä”~N¾L¼$>øÜè¬ Vè‘oç˜Ë÷¤“ë¼úzB÷¢d>•T1D­ûúA6«òŠ®Àph¼L +¥2&B4òDH‰iRi/ûŽ^}ž8Xê߃N¤m*ðf„Ãä)#¦ŒüG¨Åío9`µU†˜H¾µd…u$K– "Äؼ}2þ¢lPˆ×D #rŒeU†êØ-M2’ߟ›ÝDš’^D¥ýâ™ÇZþÓUE&ø€)³/ŽŽ„4\¬ÖÀîu\/M³Þy>öcJý†È«ágA´E§²‡MÑ/à5¤)ý‡yŽ°çxÜýÃÍAéðF$åâr¸ÒÞp\ ?ÙB7Á.ÏÐKv&ö"›äMF8—Ÿy;¡¼P‹)òíö•Â@%H–vOEŒÝEяPo‹ýú €¡}#‰Ì€êà·Ô@ÁvÌ^ÜXbMè÷‘4­Ðƹ|ÊÌèH Ú3&¾(@3ñ´r„k=¡§Ét¸Åš4‚a;o“eeÛÓ¼¯µ!éíu`C«š§õÓ.iÁùð¬Aþ4¿tÒ"ȹœQ XÙ»5}ÑRmwÐâúçö¡Š’EéKsnBÆlºêëÚ<ò"Ÿ²·Ÿ»Æ4{«ˆy]ò3.„8-XᱧÊÙÂߙå\Wè¼X«"P½U™@;Nÿ0¥­?/Û¸ Ž3ßð‰F:³@™!h÷Á™½»°kœœÔI۝1"^¶+.…°{÷Ü+íæ}ý™¿¸Ã ‡ÌßÅÆRLw×EN¤Œ*L©Ð µ$iC²D ”êLeéRzŒÝ ߂Cêó6$ŽùˆvÈ÷9Í¡ˆ³€‰† =ˆÃq°) [ýÞ$'–˕$pÀcéyםë<ƒ¨$ˆ¾M58£Þ2*º^kö¿Uˆ©Ù ‹w(#tùøú’æìš_ïDKÜPꇏ ìêàuï±!b 1W¬xÑ&j!%gѽ´Þ6˜–Ö‹0þè• áÙö¦Wà÷RjZ•fµ®Š½Ð@¬Å9‚KÑÅE›pÙ]‚ƒûA¢ù8CyÃy\›Ë ² ]éUæìT ÿüPÓ#Ôw4ÕX†eBBÓôਥ0lyí¿ŽPþøÎêË°Sÿm>-pÉ^+%ó§¥ßØÈàKzôjV6m7Y š?Oš Ô|¿D«šbK6@#S±jdõaKXâ5{đšm»Þtkµ/½—Væ›cÔ M!š†2|…å/H´keGG_l²|Z\óy±a.Øm†–i‚7 ‰LH‘Ð#•õÙæj^†1۟ÝÊ(\dì:µG2<Î>į›û‚ÓWÍ÷j•q™É’å`/‘ÚBOy-Ù=Ä50×\‘žXF9J1¥Í®˜ê;NW‹w @F,¾Açô ¾9,]ᇡÛn"C¨úŠÝi4öà'T¤pôB!äü±Aèø•¨×&L¦ßÑÙTòú™ñßë\>笗¬©EŒ³N–àyƒ3¼åFb±×Ï2¥døòñm¨ gÖúgEÜ(^ýC¬ 凴JNOòY?ÊC‰,žU ÃÑ2뗰Oµۖ—àzh:’ðràÁÈÊwy‚tOËPþ’D1­@xãa0Hò¨ìúþ¯;û‘ŽSUÀêNô¡Cg &®™}èàûÚ2SId@¸>:ÒIÔ x’™âëÖA;ÌW§ Iµ/žµ#²¶ ²B¸ ¨®I›ÔªDmî:ØÌû«©ƒ#á¨ÇÁ¡“7 :‹  aÝNùäÔê¿Qn6bd€t 5F։¯,bù2‹q-q¦N”ÖÓûÿ’¹îMñ‘ÑIQíàԃh ƒÂÅ7±A«ç:OFç‚6"«‚Î)¼‘àƒ'çˆqW‰,h˜õƒÃ[ê½6=Þ½ì„ù¨mغ5Ž¡M¡s)l ŽÊmØ#–šÉà J5½‚®“_•U3‚(’ê‰07"`6¥Èè¿Úȑ°íþ«üDzŽC-.Œ¶ï_íŸÀ^ƞ÷ÁHj :åѦcžv{ +¯¬ +ÏJDL©PKQ®×4à«è®/9)ÔØ>;‹!‹˜Յh< Á/ÇP·§g’Æ)ùf˜_™ ™ùLñvÞ ˜[@ s*¯!dåu†Ð&‰Q/øL;po‹|Z({5zeύÝX1U×ÑCÚÈ + 趋ÎYöŒ†;ƒNA!Ô|󪭇æS«Cp)Á˜ÍÔ5€à-h·7O„§fà0ÞãéãԉÂÀ¹LŒÖVA»Ò³œ¹e•$țÎ8`ƒ° 72b ²ºB8 Â~PéÉY9ÑD PRpâ‹),ÒáÀã¯#ÒQ¬Áxó~¯ýOd“ÙÀxýo˜Ä³ð9òˀ‰®7 guÄÇú‹1Õ CŒ©½›aɵöB,9ËÉæÐx¶L„Ó rj1š·?R厠æ^”žOz•>I8“E‡ÛÍêìÃ3¨ÞˆùÍ=^ìÏg8Ï'IåË#Ð%Oè ^—²‚9“­Á;\êm(2¶Œ¬=ôàESp ¨Ûûòà”è# +°ü¤æëËxz;Ž1 ó@¡4š;7sd^XŒ¾ësáÚD–ˆ„#3—¤4݆€ðPە–ªjB'”†4kB«€p'&ëÚç mYÈÌ[Â&Fya\P €ãWßËGOÛlC$m +~ÔlÊ6b^ 5¥Œà°{hK‚•qr|UŸG£’Ÿ1| ÿë«Û-Z h‰S‰6»¤Ð <žÃlD†’ޤ̘Í4cX°½|…ýÀt”4ì¡¡ÎûÅ+qh*ž@cÂi{Ûiđ1ÕbÖ8æp2¯˜å¢öÍ@Wæ¾íʺô¬bpÉÓé·¹ÖH[3ا¾žQÿÚ{ àC’¢¨À3â°ñ’•¦!;’œŠï+ ‰d%¨Ñ7S9Âä¨Õãb(´ÎXúçlþ̋ÞI·Q”ÁAÙmàc'“ÐEč=A|+³‚á<‹ì†…Cˆ Zµdp³$;¹þÌñ!Ž[&œ'à ûðωDóÊM8=¸|ª½™Gî%ùôàÂ…´}Ñkø†¦O´¹òïb\²œr6¨õ©¦ø&é¿îUå׈ø@«ºH‹£†È¢1pLÈè֙ò…94cá×Iz?!…Ó9òš® ς‹¢½»Ú^˜wRX© +[¾úɇDCöÓÑð—C¿>Áì͹â”{™×MÀ0*;a# !û§i-yòC&OÌÆ2)Ÿ3™I6.”ÿB·=™hY‘õ³íŁ¾ð?©ØA@¶Ï™†ùUHѳt`ÕìF]é£W¥:žˆ3V-;}1 x»ÿi t“*r«ë¨ŒÇyÝ!g±lÞSiǶ›KΎ;Kd[“ß"?nÄyâ°Xf]ûÃd’W2 U!Æ‚.5ÅL€ðò`2¦—}M-ÖdRåâ„×ÒÅøœ „.ûéæ0‡¤›Cþ…v´aA­DVÞ7jˆãkosï”nŠVs#‡hH9YR2ŽS‘)&}¥ËeãA•‘Ñžã·í‘ý'hzÛ'Z¨;m£Ê¹qÉ7Vi÷Ì­("¨=Q{h¬‡Òž%Ð\ØÙ j~$<Æp +©õ¿èìdåð—*w($lQ¢ êv„µç +ÆâˆÙY€V-ÚBºE)¯Öb¶yÇ­‹œÁJõÕݓb¿Ã¼&3‰Óµ?õ¾›Z®,Aê(ý'ìÌ&7Áy[W´pL\Ù›Õçd`à¢ÚHø°µDLΝ¶%ÀSï̒O\êóÖ>5>2´X+øëZ"ÈÜ qµLêZÙ§ˆ2@G([H{!0g$Kú&h«rÁúêO%îtÛÙá@G‘MGñc¬Óá’eíð™pè -µ>„‚ËâÚ¹šêeB÷§¢ï¬ò +ƒ£ÛîI¦¸àØ o‘vÆéñBÆ\¾$v¦)áq'Xžp‘(8ŏ$…$Ò1}¢@°½tÈD6¿b±AUe§ ­þ}4?û<G¿ð0cehT„š_à]ÀV*®×ºÐãeI ìH{@ù& rÐ×tJ‡–¾®Á´·/ {sì`ë$·ðË $º2JOæàXLœPÖÚ£vßÝD’XÛ`Ue¦†ÉG¨8›uí§õc5þòH€2®Iƒâ>ѽ™HÏÊNdü ¾iôëCeiIŒßÙùl|&f¯]2É;Å~ô1= -ô|2%íÂr „Ëh…ÅøMž­R’ŽJWÿ˜ì!¬9MDŽ·ŒZágI˜¹bq' #¬·\‹Ãï*!ÊƳԶÓãÉ<ñ^NÊöFhºéހ¡ñt!bd…:#Ü\ðDTõÚj)“¬¸d¥˜m°D>tˆ„(:c MTœô!8Z‹§L’L¬Å1kwº ²™‘øBúHa|Ù EY3†¼¡r‚·Zÿˆ‡•ÖÆ|NQ$9ÞT,Eաɨf)ñ ìI¡¸ŠCºâaû”#`ÌÚðÙtÑP Èj2¿¹o‹êû՗êx¼áéG.ñSÏ/T2¸l½C€¬Øqü1<F‚˜1™h#^ù)è¯ç‘6Ñ|¨T»“dªú'ÑK1>>¥w'— 7nÍˏ€¯äKøJY“Å?Z ‘IBJ &æ®ñ%‘ÅA[Òr&ÐÅ©ö<×]–„ÜÌ ±¸÷;€?êÛéØ{ìÑcu€lQ¹qŒº™¨DÎ$*|¿Ëvþ½2 †r±‡€®+4ûUŠZ.ø`ãWÚÃaò×­w{O¬ ɞT^¿?™ú +ßí`‹7kd煥Jë²LëWPŒcãßËDñôfœÈÍDwⅪƒé3á÷®šêXɑ’;q%2+{Žf±§þµqãÁ<áé*jguà ݂-[¨€°7‡LjҶ8<ÏV”°Ëa† ¹ÞŸ»m fÛcHŠr™ÉxNü(}øxß[‹Ö¶ŽØÿ´¬Ø¤ +)°ä'QrâL­UÙ²5¶¼ªRªÈ]’ªšÅð U7 +‰“DGL<Œ*²Wª¨ª@û×ïè6ªo†*cX¿À¥3ꀘO}FpÿP½}ùßÀjµMj0Q©ýùë=áiòXk$ªÀޚ¹½ÑÍ»‹¨JsQOãT~Bì¯*ÜñdÓ=4TnÚ†*¶ ÌÓZL:È:J!T¾¿õžgùpÍ@å•,ÖÏL¤¢p*ª +*ﱘ6Ma‡fQö•ÜJ´+£ŒŸ2/‚Þ3ÁAnMGÉvÙ§J20Ó§…·&LV˜Æ𩊾éÿ9E-z”SØÀ•¾ÜV«§pµ-7©I—1]óUšÉSڅ¯%ÅSñ՚AªÓXÔº7…ý‚ÚcIl†Ãô»¦è¥_Ñ óÖõ朚۬À†¹½Ð€9eèµQ1>lPNm9%ø³\ºt3N1Z‘ä’WN%SoyMDjwß$ßݵá¿ÄW¼4üHρÈyvWG!?lj”ÿ6Iß"½kjäw,àeM‘ùÜSxÍ ,ÌX5ÕÛBCMI¸hT Š0U?SŸ_ +2$†å¨þ0¬êüøó.ŒbD­™Ò ‚0SfZÄ7žq—!š5aG’L1JMÅb=Åã–°ºy×Ý3>…€Þ,WjD“¿ÔÑ«Vgnk”±^†®g÷¶ËÁ ${jlØ¥jÛç ¨8…U¡.)·Hm8“JC.%BÕ&ÆP»3[ý4ÑÞë)ÿ„+_ĥȁÔb‡G(åežÓI +…¥ûË×®®’T§eåJuQkŸÑÞç ­«þôóµ¬Ôit¹DP)ßn…Wî2à”B’K‰ˆ^ϔºQëBÊ«X' ý!§³J©_['p²Hb-Rª)íÀ­f¢„IwEŽ”ˆµã©!g0OJT)›ÀdŽ9üÔCyFKÕÍ«"¥³EIíd)˜0웤zj”Psùç4Nû_”¦-’ê[Ô6Ëa=ÓAR?¸‹2'·½¢TX”ÍÍbJ¯4R„»*t’&“øé˜B!…˺ÞKðÈrè ¤ÌWÖjÏTò)?Ö}´ £eÐ}ó{躜¬£ú(»KÆG‰;Ƶí`ǀ2š!³;Š‘išØQWP— á¤SGMøýhI ÑQü!>¤æÉGóÌQøÖUd;bcW%ÈQä²»‰.Y¸‡ Yª”—e¡¨QØOŽºJ$²yš¤QôÃÍ +Ð¹{‚F¡Û¢Ìª ŽùD/;£îcdFIbá|2e\>y £÷0ê˜/eò­ÃÈ8Ö.@‚UŒ<%SöÈÓ\„Ä2·#›Æ“-j+¦+gØŽ,‹Ú„»5ÇXÉa*x„ŠëŠòœ–›L„LU¬‚åM*¢ŒfŽÚ“I´Q÷dD°ø Q‰¯D‚ƒ + QJnƒs‚ +Žu­ Š¼þŸiO1ªí6ài• +œI *Ulq—˜ÃHnL %ˆÞöF{Hˆöï“ëLÖ Ôß1J3ÝPü(ç쨂¦¨ uh+õB5T=ùé¨â´5bq|ÓÐX­a1ÔµvU5+™Ê †B(¢I/”0ï‚ê ‡ %Õiâ•àÌDX==xŒ€ YZ¨_ìeÁ Õ©ð$O7;2ébú¤x8¡Ò˜”IfB±'¢~GâSB‰WxP +ð{fŒP¼O±»x¦]“ ¶'ê´ÈJûr9!Ô܁ÿ˜¯¼k „‚ƒ~RBl‡¥@ÕÅþ?]óyÙâ`hTi _˜é Ø1ïà œ¥“mƒa™Â‹2ä>‡À±4ÈôSY^n R喩„›ãðþ„;e'ÚtA]Ó͂j—"TÌK²ò6jÊFAÁP1ðÓ¼…,">s©6±Ýí¡!xVÔe0ƒº#CëQ @$¹D¨ÙÃZ½0¬HT‰úÊ'¨K_àŸäEµ"Ÿh‰ñ‘Cä4õc(°€0÷Ä TÅE‚µoK›•¿—ø#€‚nî]Åû­t›Ã#ÿ§û²„Lë|z1âúùL9A&󉵈kn0ÿQ¤Ü)>Âóí½Â6ڇ¬yêèÃìOnD®ù㿞‚Ý—)vMÞHA´Õ¤7[¨íi8µG#åIX¥eE·’{âµzî~Ö OO¿ $Ú)^7تŸ¾d=MZÒÍ·DæFeª'Sµ©¬H ]dž}®dYZ¯žJØï;%;¤˜§aïÛQ‹ˆúTPXž¦ÁåHÎñµU¤(O¯VÀà3IaÉS܄‘Bž& 4“Ê cS€ÉñôSŠ˜ñôCŠEeQ¾9»@ñT8zøÞ¸Qgxâ:jܧŒîh¦D2Ç炧¡áüU·; :¿¬´C©Q$¥iÜÅMwúž:P©Iär'n—­ôÕ(îÞr2(O4°|ï“îvjc)’ÛICˆU)¢U;¡íûÕÀrà*ùRÉùêÐ%êÐNèïýÀÕLۅ`v‚£ÚÊ\ +G²Ó†zbN—~±Ó¬â©¥Ý;¤å >ÉfVÔ{Ö[µA2”Ï®D@ÆòÂéäd Y$K„níýäq¾Ü§ÛäE£ÿ/trM¶ +âLødfGŒ«r‡u“ík\i\âVŽS/Ë5 ,M(6¢¿vòc=&—ˆÜ.ýB’*Ê0q26ހÎ:…¾pHk-¡)™\”“N~¬./09Qïę¿‚âób‘SÁ'ÈɈÇÉmYãD‰„5†öz€%0Æiã91*J0˜+ÛBLGq*³q AsâÁË#L¥xåcoSOw +œø"§7VLД4NõeÃá鋐›Éošˆbc}Ó9Ñ ¾ö"Ã¥¡õF)€£t)z ·–$º‘زŠÌT¸ä¦¹mXÜôõaiu’µ ß7Éç#J!4KrÝb- ×ÅJ:ꤋ7š’#+@,mò[± j……(œMõßb6 %²Si†Ý…l꬚š›n—,…sE8B ±‰›Ø…MrÚfºÕ‹­À&õ†¯éºc¥ÂMÐp³‘EóP}¶È,Ù£V‡Æhš%¯Ót< óªjÂۑÌAø§ŽjғãÆðçù/Ú{Ô1“p-âX+AÏè# ¦Ne)R=Bv94àiݧŒãueÒ£\¾,Y“F–&qÇóˆï»$1)M"Uñ.iÒS\zHӉ}e¢)MT7:§8&Xa€h*®o4ŠJŒÖ–z¦áÎ$Ït븷CeŠ}ˆÚ[™œÞ>,;¡æ Êҙ| #˜ÉŸ(V9Sö<ù¨˜TK/bG3ÁÓofª{7·Ò,„V}´›®æˆ£È´µg:¥¤ +ÌäLK…šr™¶}êvDeàqüUile7§?iÊJžÊt«B‰h¼,þ£@L¥á÷äc§>•qKÈ4t€S7ª’àa@ºŠæN÷™–uLPªÏÆ1݉*A{Wít©K–YyfS±7ñQMM®‚$»&Ÿ›(öɔäx ·z%ʋ;¿“V}~‰»iao|¾·/½©ÏL_‚ÃþÊé/+/±ð%×(ohØKâ°®|H²pô’tãÜ| ªsºùÉKS„¨+^rrƤÿé#Sòz—쀻T€$1¤¬'1 I½«=¨;»´#@:iú16F%Ô¥À7ÚB<{fg ë7ŽÂ_g¹6ˆKÍE˜xy)Óë# Â¥ßÚà—Äæ?ø’ª:‹G·äz¼ñõ8ËI²ñ„ƒqdKàå ÖXªÅ£MºìHÕRÏæQK‚]ñgZº‘ºj)‡zÔ¬`–€$l´®fõ—±­|ËR]tl»äÁ6.@YºNûµd©‰â¸#yâ")¼•þg™L#–N¦Û_ÍxdR7Š ®ò´Sª>ɈåÍCQ‰Óóé $2Õ؂%ítûG¬9Ìe""WºzéàJ311j§‰n¥# Š–Óñgl2ÿÓÀVº XâãÞ¼ÃÒGG^ºÑV‹•¸S!iƑ²W(åŠlÑ"ôU½J÷& ¥‚E±e“J§èä*‰ÛŸ Rz’<êÿg¼p ’ +0•*Z`­†ªÛˆ¯çúݍJ‡çÅ* Rleð)IQ Aûfî+Oi—ªcë”dŸ#÷Ò&G ƒ÷Q[gnš¥tÝÄNÆ<äé€Õ, •RõÆq<;Q—³IiêÁŒéõ5í´€¤túÁøîaãW ¨/1~ÒôÂL†ô0J8r›ôiQšŽ§(+L"²=êo½÷T¥lAšë¹]amXEUxÒؤ=Ì®ð¨ÍO²Ú7Ž&X,‘\ŸTwYÞK(ð5ãP% ëj;Îë!pà L%þsÊ]؅„ì$Ÿ©¨“l±¶Á$V\ni„Q‚Ó6YÉ¢šÉ⤪«'U('ƒXÁ‡boRÍ&æ&•:9V›$¾•Ø$)é^õ EÍõ.á&™¡„'Œz›j;Å–Ü œËQ!1\Je[…Ž˜ÄÎdÂ$ïûùgA( }Iwh¥å%5Þ¡Pãç|ÂR(ˆKÚñHՖt¿°W"²=Ô3Ì^©´œR’ÅCƒ(Pª¢¤ãì×ØÙÑz“ÔÅyKÒfòP’¤Á-I"úkH’ó<”.'#‰Ö…óT)b.üù(9¦éŠ$tU^:UqyBº ‹E$݊šdÊ uûaÉ?ú½Eu¯p±ÊóÎ% #uƒ9ÒÓ Ç¦4ëð¥zÒò£u®FjX² +®$A8×ÐH;ʛ‘’ƒxVJäqm²‚hŒ ’+fPðBQ‘|mDàe­˜é ‘ШG‘x©3¥c(ëDòÕñ.ϐ:ÖL¤¹™_cÊyH$EÏç„Êõ²þE˜Ö=ž€ÒUMJڑà ÞIQ‰‡´ŒÀ'°YÂ!Ñï6$jÄ Š ïÂ#ܬ¼¥‰ì¶$$#€);@H¿VjÖS­Ëíy8¾ëÑJ4 ÂQÆ +eÁ‚¤‹ø¸ØuO¤ yP&Qý“&†R2&ÉM;¼éØ2bÜ ¼G¿TküGG‹Ø×LrÚÉZJ^IùGÜpŽƒŸégō=Â(>îfùQqUÉáGZÖ1§BXî‘'î£%Ì>’G­³úèN;‡» +äfH8Â<ò´’Ã|DÏò‚½þ¶aÿÒ¯.ÉG—ø‰Ø,tSɐuñ˪ÎyÌæyàQ™f]´ (åGþ·èÁ<’.™ÈG+=½ÃœáUòHn÷ã|Ô%0ñHˆ¨JÂ#….±ÃîPTà‘cۅ=î#‹ +è\s]gŽ"ªåëŽ.Ǜð²™o\GcÑà*ëÈû‹p0U PGØ3DHµñØt$ÂÉŽ†ÊÓ 4Zñi0îáÅôÀo¸èÈcׅàbŽ¸ŒÊ÷ ߧ@ί÷Ú‰š£Eù½I¥‘R‰Ä±m¤”#5”RSn%Gjó8ä(åp›Ô€›j†ÃJƑÊHDn“@鎊#é£ãqôE …>Ii8LŽ½—|„·xTä·Õ؍¤æ4:½f—nTwjÉ2í" º˜9MLlíÏAÛËI9R¢%°áFN\X¦Ô«ðªÈW äØøè_::“É™ÑÌt½*e×H'…çZ#¯Q˜å‚:$š8g±FD}5Š­FVTO5Z&¨¥F£(Œ5ºžDr­Ís¹!GK(¢3œK3—Š2fÿT_¸Ñ×;Œ¦U¤-â@WÌ®è¨„…ypUˆÄÒÆÉô0%jT Ó H]X ÏMlÇfí +$=l…ÍÂiŠH›ÉAÏÆ +Tƒ^CdË sv?›ásªærŒ ᱀ mM(¡‹ã}¼qB¶²Ã¾ÿ¡WØ]pÔ©`8Bn›9õ4݀@@Þü`Y–ƒWL¤Ç[/½ L‘b†ì¦G¥r„Sýt–cîލ˜DΌÌJfIns„3ÌfM™º+ NH|:-¢S—T=<•ÄךáT[Ò§ €o+û *֒¶‚Ø I°(!% <„ÿáڟª$ÀPu4™C êȬ"²AeÖóøuõ†Û€=Àmƒ +‹sÐC ŽïH÷Hþ 0¥l4¾…œ°…ýèno÷*œÌÿ´Õc¢±¨¸CV C+XÃí øâ!< š5üh`³B=š3`Õ£{L|ä,ÏHR#+‹E°~Vµ)I ÁRJ0©)ÈÆkà[¨{´ۓ,½›Ø%¾ Çä; óß½p¤'“(\>ÛÉ%v­O^¬ÛËYJ͇2ÆFËKŠhv¶x­àQç—ÓÇ \Tã80e?kATP'„ѼBÔ?_æMgþ9 A•î ©‰ÁdApÚçÅ´îV1ƒS™vÁ™=&&çºÜMiÎGôˆï-ROÂG@•z1Œ5ˆ‘×V§ݝæ_^“YíÝ8b@„Àb4y_?w¾T&­DÅ&–š·Î+ïK˜ÝP\ƒ"qW-TŸÜ¥¢.qO—8C—3ôh¨íá”Ò,ƒ£<•Eš{ӈrꂶ4=L÷qh*„ÅgFÔ[Öõ£Ž?È%æS²| Ol¢˜( k²uú7 ÕÕ ɘíjc¡VÜ{Ǹ¤p×¹¡F«ËћlSR®1‘'3ojÌCÓ§ 7ИŽk…¨<ý<Ÿ*–±ä½U¡}"ÂÁRI­ÐH—cßJ£T•$ÛхïdqIJ9Œš_Y†‘øâöÄ#ÏìY¨uÈ¢‰¯€ˆÃ¢PK÷K$ò‚q+PSá¡)¡žÓç|Kìy‡ôŽ 7ªÛßZZ~úìj*7 +²c‹Ä<˜}ç:¿|CÞâ¿­fš)[®n{½K™Dª… €SkG¯q&ŽYõ>„kɎ¾óÙA¿AoÐ!ۚt­ïx­Åp8cj<2žž:†ój Þ$H°AÃr©„-t5¾Fªï«¥b$U}Æì‹Alá³T¯þÓàÌ†0aM Ç?; c§µ“Ä?<酣óŽÍ4It>33ö2‹ ͳMÕćðQÇ«HENÐóÍ0™GeòÑBR éSÀÊɆ˜:F!\Ô×.ëbHMn% ö%r¾Z˜B¶Í't#G% ÍÂ,!HÃÎèeUP„©‰G¡„Õj ÎAä +[çõ„òJ@3M·Lâg?Vԛ¬D¢ö!盡‘§›°Ôÿ0•N'҄°J„H*iAk–3`;b*³ÿ—Ó‘üûÍ +NcM©(º†±F•yU©Ð~EjÝÖ®X +t%ZÿÐ7y(æ>N|\aâÛv†6­è´hÎ+¤ªTÒ¹³ŠÌÅb˨ïëv #Z ç&ƒBU`\M ‰³3•¯•\¶Ò6Â[Ïj̚ÜvªU¸mb¡d ž/^ 'ÒÂõ<–j¨dYb%_{Ž“Ë¥»‰°Â“aMÅ@œjyäT¸Í*ÏõYj(~¡âÁ>«VÌKUT˜_NáµEÎðÃ(›è“;’C"|JͱƒUÓa;¢âøsBv%º +ƒJªô¯éÑ⤠ò®.<#֍ˆ¦)T8Ø üÞ:‚¯w{K5Y–ÿXèk˜±F£—@ܽ[HJ{ÚjŸ¥ÒT@Ü£åÛc›0b± á !çþ¨jT.‹#È]ºì<—ˆåïÅÚ>qeT-R£]1ŠI–ԝÒmU¦Ù¦ÄáƒÎíÈuVŠ—¿R“jF̱´”j‚(¨™Á5å IWK–>hz½Tܛ´$´Y¶£Æ]À¤U’ã"s¯nhþŒS ¸*5±L8ŠX‰—×!¯åP†È°à›Rø>^ê§PÛ +Gƒ2­¶Tm÷sÕ©ãqû $~- +¢””jØTéÞsOº äÌÙë´íQ¥ŠŽ/V]ƕI ŽÐ|B¦½p]ùOSãu‰«`ï±RÐô,RK½|DãRM‚—MžÑÔ-³©ñ‡(sÞ0Kïi­ÏbNùT{à­o±öƒkHЇP. A”Ãyƒ[5r`#5…y?ªÏ‚LÇr“­˜œl štŽ„#Õ(*`¿ˆC.э#@ý¿àXN|8TiÈ[q2÷šhMwœXCQ5Ò wø¬Õ­k‰`ôo I9Sh8“µ+‚ô{<`f¦+®'ŸéЧÊiõ3D~LXZÃج/ @*0E Q¢4í#]¥y½\>àjKΔ §“Tøê.:\ö¥ R0$ÒºG“î²Øϣ݃‚D–`ðšÀ621t.sA¿ªæz*OW<¬)wz;‰Òþn«ø©@ž†øn5Õ»t³£j°,ßþÓzƙëT'I]“z'o3AÀ&|ǬmûY šPÕý›Ø›TlÞSës³EÀM=62ÔH&êY.GòÂèßŗK jÈIÃ<Ç  :žŠPUû0ŒÚ¼?.!@É2ͬ ¯M«Ùÿ UUÊMýù*tµuUQ¼ÿ؎7ô +('4{zt¼o4ÝÀ¥%§¨™¬~ØÉå)‹eíÌâ½ËìV²ÑªÌáiðʽo4€_Ðx«Š[WB_W”Wõà´áqƒÆ„Fý̋w9/Vé‰&! Ihƒíl”OŒZ^–„¥¿é¥ÈP¯œwBgq6ºAu!67V×cU; !ǶÆÃe±qUý3´ÐYVÕÒ~Æ0™®hW…¿   Ô¿ápvžUÊXxv‰@«ŽòŒ7[dtÏ,gQ"anÛ<ëj†TúN?[²3,xYˊpS¾gã‚ö¹ˆøYk‹±3é†oh• .‰_»ó.™DB%´±0x ØHNc+#˜æ?Ëmú7Ùªî‚t¶JbÝ߄Ì&˜ÔäÉ! c熶œ¨A7‚9y¦¢Á(yè5 È­:T!ïP‘oÑÎM\u6§\:惇 ãªu.¼DìÆý-èDbåÇ;Ó©’cüw r…&æª.dÃBg°h¶ù%çµÃÐä*7A "<žQɪÏšBÆ ‰Cw°Ý:E-Göå›ÑYt¬%Ø /ÏŽ| H{'Ö¹j°lVn—«@–[ýÿyJ^lðu՝‰žÚ6ØU|–Ïìªìâk÷]’ЮêÏՈd{úü•øDóÚªÁj¥J_Ýu¸#^Ué¤Ñp¼·;‹á8’ÅᐑÖs¼ªþÒt$å4í<ˆÕñç±zŽÛùqf¯bÆó5‰a 3¥˜9ˆ/÷_¿™½¾JŒÒ.­‰¢où*EªŠÏþÔCI˄ŽŽ¦ù¯\Àq¯X‘D‰ÚÉÎÕêË얳ϰj¼§&ok“ªÂº“\ +VïöâUÍzښ8œD Àn(c£"ˆµÆ4À»0©ÞL!Ó:ÔXhfQØ>]’¤¶.(´ORè¯Ñ.¿=Ê#<¨³C—ãJ1o¶ÖY‘µÃ­dRó8++&ŠDŒÏìœ^¡Ó8qÁ Ú3ç@+\DrЊ=|Yš¤ŒÔً ¡Õ&ëK©fhuæ%}]phuÓ£­ãƒ2ъkŠàÖWmÕp+Cd±Þ¨þ(F/n%%¿åãF+ÙL fì­dxEKñâV·õþmcY’ç c}ÀŸ5ÆÃ÷þ©Æ‰þ_ŠJJå`PáñÙnánh‡•€¥ LRð5 RLgç ­^È¿•âЊèmKŒœèvÌ ­l°{ùÀ£!¶ÁY”bp¨t#S>¸Ñ‘ £ h¶ÅêÎVRß|˜‹sgIa읅´AsЊ ãêDšcB+]:½‘b3™®½M¾ÅéێZ4S”, xðZHuSÈ +Lºˆ|JTÇäüà؈¡£×ÊI1É;*"'„*G$§‡žã³Í³«¯OËs|TÛ>põÃ7¤(ÖcVŒ„]†Kzó§Ðä܏×`D`Ø0σÔjˆÀ/E¨(‡°U”©f§¹£‹lú΅ãHØ%ä¤FŸh:áf eÈdyªð‚Sû‡mýõ’&F1]É3òû¸©kdµ‹ÃöQ’Å ç,›î7™˜0+!ýs­k•Å¢®#¡”)È }{µªGáaƒÎ6pÚÔæý¶¬ÑÑ¿/ÍT ö—à«7c+>º¯2c…‡ÅͱÅ+ŽÒ=hb 0ûá¸5z%J˜ÐüÜù}S`mß(ñ‡4îè):™×TÕ͉O¿³‘š¤lõpñ µ$h¢Þ.g0I9N¨* )bõ•4.¬À’¸z7jN×KÂé603¢HŒË}H®“0£:&Y´øshÅ*pæŒEÒ#,gÛ̀%·‡=Ô©Õ¢¼¤örHT ¼_ÒЗÚX/d¯êLÀ]RL´ “¼|¯†=(ŒÊ¬%š,„e}ï5¬PÂ&yv@õ“*ãOØvҝA ´Ë¡"ü$¿LÐ*yÉuy‘R8l“bÂ/:FÏ´ñµ&Mœ3ì·#Åå’H “§P”é„’^ jº³@áóü„‘F;Æס˜הW@Wg–•p·!aã íÕê+ËLî2£–7-ªRÁ¼=µLÏ16(ŠÙ°S!ôc»» KWêû­þ‚,lW\5ŠO*d«[RÌàx1)êႩ¯‡è²áÁ—Ïèb­®H`Iè/ Fû6DŠ¸1Ý ᐱ‚Œ›;äÂ|Ôø‰««ð5uEaÌ® A§¿…Zя»}àÁTJ_gÓÕf½Zâ]ÆҗKªj§Ì`œFt¼Eu{Ý­‰1ìÎ>!jÔ~B¨ÙMè¬5"‡c¡à­OÕQé­ª¢Ò-Æczý`åx…>a<`ÑÁ)•Õä–ÌZ¬k³Nxîuÿ%ñ݋×àEgU¹5βÊî£2…ü˜%û÷•óS—p’҉Փòaxñ«Ò¤­ Ž‹«{`å*Æ­ã`֌L0!EA´‘É…a‚ýŏq•6~©"îv¿Rlhêœ*•ÂêNšV¡øAè:\.‰®†à;6þ$Ò>ð¯ÄeÿÓºçóG$½p +ïõŠöqz„ÚõŽPª¡CÕ)wHÚZ +*C÷'$V8›3†ÊiшÅ'Ç+¤zAN¥ aÁØ_Ñë¦B3Ÿçrt|¬XÌNé.ŒmÄ/όöŸóËHS£..¼®9å*†°è؄ +ð§ýmÛAÝk0ä¦â1n¹¾0QKÊ1åZ$‡0³i{KXp#íl1ì”qŸ.vLØÝØîc±mÍÙf¼¸&(kŽRá :Ø;¨2¯Š‚Ünæ³g°`ߝÀAø”)²wÇtÜ^f`&¬Ö›•:­QÛº¥hkÖ¼v„š!UmßµmÛ6yüâ¹åž[Ü¿Ýûö﹏’àªÍ¬`"QWu'zá à°P¦­bBÒ +EŒšfgX$éÓ.Å ¶/ž€­èÌ Ä +-#§Õ@8TsƒÒwN†P‰¥ä"ADDäD|©X<­"Ñ é à é 0iÃIÞiÒ0a>Όg ƒ O "Š yDt$ˆÎhœŠLÄ@ÄPU.—«ÊUe+³%«µÓ¶V«¶¶µ h_ÛxÔVÛ¶Ùl6Ûæÿ?³ÞþÙÙ ƚ1N°PâK]‘áE¯æ)é5¨|\~‹£ÒÙÛ®‡¶õ)@º† #ˆæ==›ðqÝNZ¸† >*¬ƒ Bºycp-j5Uîv\‹:ߦ¹|žR½. +š8@À゠~[´³ðCÁ9ª^€Ë¿C  ênh»/t æoª\Ès&’Šë·=‰¿ur6¡Ýõ&A=£§[´b”ì ‰Ÿ‘q냚€ôjp4!où.ú)L~äo‰žaÓÇ!³5b ÕÈï3”vkÒå<‹É?o2 +Ø­vºÏ·€ç6«Ö…mÑD*Ù¼pã›SºÕrÜLò[±Á)/C˧^en+p&e喖¿‘[êH׸õéf:Œi"nݨò½pëÉ"ƒ­¯EE£ma_9ȶ䢞QhË ù¤áY¹žÄØ·V4ëogek+=“ì [Q /)«¶ÅŠwüb¾t®îo ÚòE•¡:¹¥Ò¹ ÎÖrâ?ì,Å*í(Í.H|ϲ5\ªzd†$[—ˆ ©­ ïA¶ÐÊJ%¶&ŽÕ±ÎPDæ$+ÙLß»¿ Œ­÷7ÒýO…×D½Ö¾{k¢W³pÃðZÀw¶ÐęOVºV:Æוk}cÆH<¢èSäècR¥Ì”l­ÅÌ$·G?VÐy×ݨú¢t/oj¨à|tªZ­3‰6=ƒ8Á2,zŒÖÖI)³÷, +V­‰ ÙzcZKs™"œAš>%åÏZTó”¥V­½zQP ¶¬Nìá¿aqÐYž2«ôßF-ëëÌãøwu¬yZƒ™—eí¢ àØ´ø‰™È92-ôÆ4ŠÙœ”CŒÿ¤„šþ|—VÚÄ# P9¨±´Pt§ÅÛgR(­v&­[L“´n˜ªHëoւrÏTŠIÖhƒªAæ$ԓÆÑ:ÊÔùš7¦ÑJî©“¨5œE+™òÊNÀ…\í´}Pæ@m«D똔Ñ2wªe½C+×JØZÎ6¢¯/`ß 9ÃÖïޟ•t`æ#çªág!}Y6ú‡¡Ð¾AÐ¬Ï:Y2{Oëy˜+£êÞ5=«ŽÉ~(R‰uR&s8QvÖ^Û«â謭Ý`ÎzLÅÌä¬qœ-Eª­kâ,ÿïýœNíï¼1áf¯ÑÚf4Äj™ªü¶ÒfÔ+š­‡\A¤j‰B ´=s€Yð3²|;Ã8 ó™Y˜!?Š IÎJˬaKaiéZÎfe܃‚›¤¦¿¿/ÐGY¾8×ÖT×q^Vêë¼V\Ë$Tg…Ê#‚ÆEve9'•‡ËðŒX˜´'ÎÊúut¢›J7…¢Í×TiTVÿ‰¿™²Ðˊ¶£’²ÆêijÅzláÎ,×·fʞ¬ì%uÉÍî›PXnå†#èhw½#"O¢s #kæ1°Écï +¼üŒ¬#Y,Ru7¥W€>Kh\_ю +'H]‚!i©¾œÊ°ðºÙƒ£ªíˆœX¡©Æ”ž%Öº +xŠÎVCh®GëÚ8VbÅØ–{*ûŒ²µqÏ1Ÿˆ+›Þi‹îÁÐÌÚ°¦º€P•›é}4¬+-€7ƒNà§l2³É`XŸÊð ßÛ¦Í.¬ÂØÆ-"Rß™m@“IðI¾¾©% +«³mžª¶j½nDØ«à˜ò×,ÿAüœ‚¥¶UiÅ2%ÒGV…•Õ±@r…eôÉÀöÝN ³›‹B` Œ.x;4Üu0béB¶%$"`aVú¦àdhí»X"ªb‚Â"NáÿÕÌcÎ0»”ùWÂæZãî¶.O›Î©Më¯LÕÓ2ÓHéÁ«“¨ʾ/ð_ÕW·ò8[ÃÝñRX>Ñ+ó,wã7ç ÈWßh0I›}3$E«bëùU°W} #e¬W ;v‘{S¯P¯\3Š×•Ÿ(ߚ/ZQ¡Ãš¾™©õÛyWå"×]UÕÉaîÜ9îJGñ(GË‚´«gY·Þ%£8¶D »’ý¹I)]W)²îq¯XžûÉ×sì+ԕˆeÌ䣤ߓ'¶\¬ÞzJìV÷·–iWb‚—QÓ86ÉU–˜j0bQR† äÙYº ÜwæRëÕ æ[¬EqÀêƒOø)7‚)ÓÊÁ„Vë¥j5…˲êî.ÜUÌ ƒÎØCWë •ÃηTOý²G0窛nå råVjÜñÄÀBU Ém…€ºÍVՐ­ž:c+·^ÀŒæ;Ù6Éc¶SĜF@ñ›\©µ¡©8 8^ËagšŒG(TæV4çÊÕÇÑ°&p‡³ïý™u‹Ž’C-(–ò(‚¬‰ã!:«XX䞀hõ„Vç*)4k¾ªš6}x͵oۉ.ÃYõѶYÁðH†é7*ÀôÙ¡ð„RÒÿ$hEÙÛļç÷غ»úu“x!².p{­w|#ÜøXØòp³Çj ö3D2ïŽÕ;nN;!p@QkeŠ˜bõëCúpuÕóngxt½Û™GJ;ÌÒ£t¶¹–fß|Åý¤ÁJÈÐõcs­jÍ©Uÿ\Ò«ÎAòªwÀ^uÎÇTºÛèTµj˜Q}DWùX;3ÕÜRÅ«ÿß‘ä—wÖh2ñ «ì†$<qηJ8Df¾ÿƐUœòÞYµ5ùíôCD~”üïu̪Û1„Å-²Ð7†¸ë¾g@áM»Âª¸‰ ¬úæ~yÞpÂ/©/Ylët«ÓK9úzS5®”Æô”J"fÛÞäírࡤ +h„THσƒ*NÖó uÆ댋á"?Œ7§Ì{uÌ´Oz*Ólj-ÌÆÊXó=_+aÀ¥áìT§%öùÝ¥S¥|ÈÔièÎr£6öQÜ}Máfœª,fSaׄ1ʕ|hªp +¢ê…ŒÕ<9•L¥@˜ê1åÀà!‹—ê,‘f§ž)ÉåN‚™ ÊÄ6w_¢Jè®K|HÙ&w&pSaþp´² ®S”;M‡cJ©nç(u%LÏÎ q,s‡Vµ¯TE£«—Hµzo–³£sŽ&á(¤:‹¢4Tàg¤'GÐKyOtæÔ}phØ¥m2ª $Y*[£ÚŠç«Ø‡´“Pº¨⛎Eu`ì²É@,G’ª€ÐTAԑI@¢’]ÊhÇ2âì‰C3@åb'ªQi¨…Lò–ª³ì0À€È*ÀÅî)ÌDa˄8£Ÿ¢Ä⁇É$;¥~ U9ô€'—,T©Gb¸ÃDJf]ÞÝÒ*¾üñ—dj#‚ä>Œç_'ÔAaO­{æZ‚ÆC%ÖõïޒH܉iÎg‹ò#7WI§•/(ÞA:ÜÎì8‰¯Ccpkb8úyž‚Ê5Ó¼¡MŸBYÇbð#+‡„ÇÑã1° c§éø=YÌC<c%Ó/çD§dì 6öGH…›@oì”ö\9q‰È+)å¦ÔÐÈí؉C@ôgÌ8» &¤Áƒá×Ñ·PçlWq + Vá I”>xƒì|è“xŠ®Q4\©6%P0…„­ N¾§Bvœð¤kvrdgƒ)ý0#NE²y‡Äàˆd…¤€uÜøä“ P 4Ã<3ºåñ§?`)D„ZҖžŸú@çP:ú??µgh);UÝw†ÜÿÓÎG’m¬j†½²SR(‰ !·¦9AO6H§jme†ô +a_YàÊÎ`ø‡´6‰xºÌÈ-¦•4¥h”€ A•Á$E…RìµX˜™—÷ABÙýÃaþJ{ò;ŸÇÓFD'öô÷ª=$rtP‡–ÍŽ§nðýƒùÔEËϤŸvq…>9 +kŸìCÊù ª¸gô—Bæsn„:P›”KÈ!prtD|v³äØK'"}æäfgÔpvÚƍ‰)©íºÃÚ͒²#tvÊfŸð©,tÐ$íÄ1O¶h… è“xvn½~|–>;£û+$¶Âþìƒ <‹“íô°ê0»D‰@ü/ƒv²b‚tC»O$¥ê„ O +ÙY¸Žš¼•$ÌQ|</G,“ÕgJšóÚL#*R&£}|éñl,TÄêAâh T$å"§Š¼Ž®`´%dV¤ˆ£ XÕQŠW^‘X“Ü>Ž_©©e+G*îr7r¸ÅÑûhç½\|>dµ¨eÉZ›ß%ŽÕ(8Úàñ7¡Ù"…ñºŸûVYUf‰E¨Û¸wN±”DÇ@ £ûEB6Ilfò²3}1GÅ(@v&¨P8š#“Ò! +¨TÄ´"Fz4Ìo}1ò‘‘Ú)”LFõÛX¼ÀŸ1Âb¥Úù4ßmŠÕN;ÓLÄ 0I£·±í±Ç팴N5Á¬€å iâ̚î[;Håm´Ò5’¼)!iú–ir‚ŠÇ†òãÖÎn=hÁvÅæüµK¥Nw<Âvº?ç*§ù9éÐèž:ú37n‰Äí;ÉӀóH•3ýđbZ…ŒÁ©Ôùà„ÛÁp÷r¤H©–¨§|´3÷'Õ+¥#! S°¹tÙNch!k“|-oÀ–<ït‘’P¢‘öÛrÌ{¤`ąqUۉ‹—íÖÞ¡Da¨â"wPX9IQémX~ø‘bg&ág YSË~¤¢ C‹Æ>»þH:RgH ò?©$ „$£HCš®Ò ÆYU•7¼r#ß ÿ„S=SÛÎgîY©ªÜ·6aŸ…³^aû”t@ù„…!Q§ŒGš@³mÛ¹ÚrYÓ¸Ÿ!$ +†56̋Ûi ä4Ф¯YŸ“p;ë£òÞÓ·S`x¬kcZ'’dê…h)¥Ëж%óêue Êé⛍ÄzñÂÌYÃ_º/‚؉c%þ%‚X‚P‹¤}Y‘<ÅQ€ª¨|V¼w㇐D=®Lÿ‹ð‡Eóžœo þ 9¡H’(ú£íóà$–Ën䄱$©G“^ñÚéKeµº‚dã!ßKo_œ!Åmow³/IM¦i}pgštÏÍ:¸³ Z`[q8vƒJÇUæþg_È w†‹Îó_ÃؗŊ}/¾X¸±ô3nŒÏÆDÀg'Hþ5¶Ó­W±¨×áN€sºþ*—ÅÈá£wädÞá‘Q®<à_}˜AIþ&œç>êhÚao°y¡¤t©+í1x׏À©¶¹³$SÜZooIHPTäb4VkpTÀù)ÕøIê¯þ5& «/ ª. Åá|:šØ:Wˆ ŽHû'Nrî #‚PqÁóÎÿ uŸAwà=š¾$@@›ªø» Å#“¦;=ÕTXãîéN°{Æ+•ßt'&Ê@¿¦;cCXVtÄR^xR- '\„r†Œã÷,ÌԝÞG¢£Q:¸˜uçÃ:½ŒKøsNºÓ.ͺ3åq{|Á2*×lsaw®…b–÷ä,“ðD«ìNò÷O€˜Ýù ¾G«T—™$ÕU®ÀJ’Ð_=ZD»s”dç`ŽÍ—¤*ºnFl‹`qDÍ`º™tpT.x{„– ¤f£ R¼œ ò4v¦¢ +Ý^÷áLiØì2@/¡“S[:MêŠEdó5~ÉcPG˜&²ÛBX èë¤R•ýÇTMòQ°†i +4©Œ¨‰ùHÊHÓT¾ÜSŸ"zK‹}ø‘FwgéÖñüW³A/§QUõ–>~*ȨÞž¨´çNU½Z/pß^fø¡›T ¸J]¹ðît¶¢FOÕþQ²ÈҚ©<øù?B³Úyw>y0b ªQJj$ +çS+ñÒæît¶dgEð.ÃW:kÂSs'÷P‚=Ã)d0ØÏ8îÎQë&ä6âTêŒë ß5”ÄŒe,/Ø@¡fß¹s&ƒf§æÃ̌Ýbw§³ è×è6‰ ¬SÚ»;'6æ;6ÛHš +Qê¼ýsüMz4¾A³"äæ)ĦÔÍ°MBt/IµxwÎMQ± +5#¨Z.@áݹOÖC {wú܀ò@ïÃÙBÜI_†´ »ÞšY16µÔª¸Y%ãÜ©€žÆ­*ÅḺж@VÇü}<à«ËMÈ°û¹óÈbõq ¦Ò†P_(”ߝÛì½þ)¤üݹðé@ÚîO´Œ°„¡C~€wò)ËÈϓþÐZY2_ïtÅ}Âl ÑZ¼üOÏ[°Üì2_8¼sQã&id QÙùҍ ùää×LóA‚'eÌ =£×Q8éç¹áÕñ;€1Õñ΂ilÈ;ušÑBÑ–Ä +È߂Î5fÉ;£ˆ¦ TîIŠ†`tďÝÏ>2~ßùUp0u§Lϐ?/˅³(»‘O +(È£ÓýGÃÍ;'+žÕ×ÈEàɚUÀ©Ùí0¸ri³äü¤Êå}J‘`9.Ú«;!•šY8À4c¹ŸÔËÏû„¿+â+\àA)äý:\ôOÃÿ +UñÌóNÓÎßEØ֝ïã³ $Di«ùKރ¾Iq“¤mZ™ÜóÎm¡÷͌ŽoÅéÇ|!ÎƐ˜ ¥ K +”6ðË©jŽ|­Q1ÞÂIÛ I®SˆZz®½ N”h ‚T’tÌ Çt+YˆAwÆnõÎ(†á¬@Ë'áS(áßâÈa / ÔÙ ¥ 0‹öc¡nÙ¾T +#"öNP]H–¾@';cïDð¶ïŽ/Ø;ÉñæIvÝȨa@áG\Ø;UK +FöÎDïá¢ìÌÜY9¢©nf9ݵÝÌv ÝIW$ò€D) øøÄØ8#·wö©Ö™OT×¾Î=\zGÔfÅ÷Î)<2Æá#\ßû–Ð! 8‰l»NQšQ‘Ã0=¬Ë6ñN`Õ5ŠºæŸ“lÆw¢²)Äe|gãt@¹Àî1¤3‡Àx»èøNç6~XÄw’ ‹#á]|'_°-Zܤ3?®I_”ÌLK߉ÙO&R‰P³ß\™æ7Ö5 “<48J$’fà% O–ÈQJ®|›ñ}\JC¬ôƒ"CtY"€Æt'{{ `N§^„Á-U¾“NOמ)#8 Ué……'µaŽJ ֋†’ûpO §¸ÊöÎY€Ò0ßi5y[uRPíËA¶‰ÞÍ7¦•±/ÒHÉðrH!ø-cYp«ï4¼~i¡,¤„‚Ó֕ñÖ¾µc¹LÜp°H°Uw†é )Úõ訒WÊ[÷L©e^Àï;õu\‡ÏYá|€YÞ©2hk=ñ'Ÿ™ÎS¸´ 8­IJ?… 5Gm^.UÕk·È`nèH'G¸^³¤´µ÷òMZ#;ÿE%ÚeÇØ ž½±™ßiY0çô;×æñ —Kx+‚Bú ß?myž!=1*QÃ¥DËëÑD  Ø©¤)Ð3åõ~¡ T-m¿sf}O>B +æÁL)q„€F‡–ˆpɇ<±ó*×ô.Ÿy(S‰!¬„„AZ£VÖÃ5ݺpQËGÎb© ‡1L²*Íò ¾*gé¯ÏX…ïü» ˜!Æøc>•—ê?M5пÚZ%£®8Bz—˜šÏ,†3þü6‡¦®€)²Ø‚p"p²THÀk3®B—_J˜jê\)×´Pu°ØùæC;WþŽ /Áp»8À·è Eh!í]6ÖM`w–dïf¿÷}íväúù)«„zþ˜÷>Mí|µ®Üµ™>5Ð_ÿÍ"³9 :ÌL:Mã;˜Š—ï}x(ÛÈ{€ÊÄ;;"û–|¬5á¿K *mE³Ñٝw93l¶×r§¤•á4©‰-žgj>§]téR1F_ô@ñj°þ ±=dj z‹°¨WŒËX¥CO®‘ôɦ,ì×L”W¯¦KbՖ7~O'N&Äd²ü,c¥r:Ô~6û7YãÍoF׬/<0ɋØ9àŒHázÌIXí hÕo.0z51iÄ¹É‡6ß)¥(ř8IEɺШ Ï0C{ŽMjÅf#ÛVþ_Uÿg…™Wݧ–o8()¼º/Èløyªú} xEü2üéRLIÍ/²°0(â µ°fø4"-Öz.æk×b5–44°®Ònp¨r¶4 B# é׆ûÐI‹¡&ê<5Œ •e¦~ïÇO2׉ #YEÅ;l)x¾,¹Êü}€“ͽkM¨0úE4Kƒ‚e ˜¤…¾K¶b?2Ÿ¢ÍqÏRmÑ,à/âßY`åu÷,£ “P]€3O¼XR-¡³êT:0µDc±mej#ùÉ_Ôàž +Ñ{ÃjZ‘{?=òêÃK}ò„xc+ºŒT’Œ0°0ÝΈú¨T¥ÙW8ŽB‡Ÿ>_LóÛҁõ 1nuî_¡°iÃeäx}…ÏÔÈ@u×Z.xÍ 5䥓A& :UÝl9ߏ½1  ¡¨·bzԍ>ɯ¥þšÒIú$ 4ä™ÉPѪCÕJ…ú‚¶LÓ¬»‰ÿê1t(Ô7Йrk³ÿ§µû"540“ü͙wQì¤ÞD°*)Ó¡K_‘€ìþìâ™w/¡ u«”„ÑïÖÄv6 +8ËJ¢i_D^uÍଃU†ÔE˜=±†ûáŸÅrîáÀ.2‹ÜÄy#bdUæú¸È ³G1ËÆw¶@*Õ#ë î4·¯0ìaâ"ß9È_ƒ_txhª\lŠà©×„O™†5PVõŠ%ÕS®VÎpÙ¢P ' ^’ ¨zÛàŽ€‡1› ]ž*2ËÚ;›kTСG5&nq.OJAmû.†>OÅýy8AýR?ùáÊ(%Á:÷1ÕôrHÒ`a’rDw‘Ñ: LMyðÉÐ<€ºÁW!,®÷_ä²oWL›8&ÿÎ-Éa’€uDó®ƒn ³hêcÌxÂí5é +SÍ`pìÎhÀ]PˆË 4wáâJ=Î9ýâ‡ðlI¹vŃï/hYalæçÛg.ëwŠã\fŽÿ9ˆ¸Q̼3€r¬ì«(á_AFà€0Õèqa†ëÒ·h”y7æÐjl1GÄú³3ԎË,}J˜ ÀîÀµ‚ÇO!ïÏԏ)zvÙÝ.}K%°ñ &D-ZkÍ)™å‰cƒօ°ÔaH—-táÖ>s<ÍXêdµa¢Y*Ô'Ü·PÙ²p­9YQ!ÀB,‰¦{D0@.ãÊ?mTiŽ¢ÚÔÖPi¬“õO ÊKˆsNSו(6ø®uKŒ6Õ{¶´ÏÝýMµåŠœK¦¥[Ö~Èå30+;z¸$Nïò a-¡ÎûY+º¢p˜˜âݍ¦´$hoõ@Ê/ E³6i  çßØk‰·â•ZùŒ'Âô“ÐÇôA¤5ÆX0<#t¢´æÀö§îî±WzìúrK2$7™‚…Š>üœ‘(0Ÿú늊bZeIÆÏtÏGÑk-Ê*J°*°±ÇX¤e7x|‘^ üjáúìµE­Zo  &Šq[îß +gBn¯L2Èی©H.%‰qQXß&Kß'ÈZ…ü'{Óñ"]šC^“4 ´Š/RØÄÈτªÜs®U$ôýÅÒÏ¢ );ŒfPå^‹â˜€\Gh +3÷mûxÐÈTMpS¬F£s)-pvkF|¥©þ©žLџsÑBAqA‘Îá—‘’è#_¢Î¬tå“o|'Ï­îúÎŽŠ[).P 鱓å圆ø˜›ª_å0)øúãÏÅÛ"Ž1w"ße¿õ÷'JËê¯ùaM½IìÛÓ¥9ËëQœ²/Vëø8™Íæøšqrl¢Ø_u`µ£å"}ë •Ü` !¾ÒòRPs)ŠIV®YZ>5Pˆ‡~õ‹M0ˆ±¿÷´ZMáC•ª۔9†ãéŽþ)a|ŽãÜ´~hz $ûVwðcòR/7ÈXLüðËS"Z-Þ¯1ôü¤¤Lpµ-¦‚*ÔyOTÉÒÃÆfkýŠ”Ø_•*ŋ_™iº­¡Ùê]ޖÍǘ‰Ï}ôvv‚uÈÔå£ôϔx…DDbiF¾ùéD†7†¢ˆaÑbÜ×®`‘BÌtªcP3\{áÄl£X,8RüµzaŽ";ç¨2Ê̋œ£Î@¥Y¿½ï×T]êL~J¸MOd8 ÉKÚ:L¸ ¸ØúG¤e(‚O«ÔÑ¿f 2#Њuè Χ¥\­ ææÔ/`òzvH\rË+r ’iŽj¯ûnST•Q@b§¥I¬æ’kcÂûtÑt£ ŽÒ°e?ž tJtâØþŒÛMðè*ôc9â;̙ç(’±Ž:`&ñœÝoî,ç\ÔÂh9‰ÙV%|$G֞/¤œ“,y^¤e½`+¹¼æ€$ Š€QDô£×KК-ŽÂ[}ÌÁ1_%£Q2cõUù\`ÞõÌ÷!P©E¸g+”'ÌӗÇö™¸§^cü¡b%DV0“ %‡´úc?g é& mþ ±Á æq“þ¼G̐ d°…`ڕf3fi zúŒÌ o¹? [$7 ž:‘R!“_æ UB–±1Á6P64ª?Ÿºýœ—uDPAd“Êx­öÊ3ô§zu(¤¡×:m–AŒs¼ì'lgdôb¢Ú¤M\±úr闉@r¬6î»qF3$÷ôX¼–5M¦Ñ0yÍ&[âß5°~’â!«)ÎÍ ‰žÎ „šG •˜þê´±3Jµ{¾õ‰l *ÐýȬ°º”M#LPtd?¾[%;ú/Ì1§˜5ƒ¥Hqˆ†`e·X8¥ûþåL5ß/™`œ }ÊËåÐ —ÕÝáeRÓg3ahö5ó£8x4åÞóÕ¾åÿ|À! À”òùF¹dó„=v› Ú!³1RÙ](ïÊý¦¾€3å6ïl«úWG£¶a™Œ«{R<ÖÅÙBe)$Y!1ZS÷Ëߓ^oÓLŸ@ª$kª4“VvC®p›ˆý$pK;$çGÖ`ÿÓõ»ÿH$’f(jçÿªûHÖ, —¥^Û,á³T‡h7YÒ¬%Æ Â˜‹_ÐV’U2eG“šT3ÀÀ`Ò$Â=ca:‘ãË?jÅE1™lUÆh5óŸ@’†CÓS Q¦)c‡ ý‘ +˜$clÑ4®ÕäÇlÁð»J pÄŁ¤ Y :¶jÄXÊÔÎ%£%n T–³Fw¦­k˜™ iÐ#4}݊ÅâÿI³»‡á@iŠ¤“­(MHçBì(͑_Õ2ÜÈr”û)ÍÊBL–Õ$OI èÐIà . q22pË/–fð‘À•³g¨, !;užÒĶ êŠ6^hÈA +x‡ø¼p¢‚tN3ùÈÈԈ*ñ$(ÊÄzb&‡½5ÈR„¤@™ø©Œ'’¨$3Í ‘§½±¶³ÿ"‰’Œ‘%Ý´Ab€Ðùþ‰þ2ûÁJÓ,HQ‚OÑAíyöƒ7Wšò‘Z R¼¥h²‹NZí9 )³¸Ô + „CyOwe0$ŒïÌÚ `ijSl5 1$²[-˜¥¹ãNàl;ôúe±–&ªk¦Ó%ÄåÁÛ’J!³V(—iHÜÙæþR¹miNöjfÈ`ǂÉ'Zƒ"P(Ók‹Ûä8C'RÁó‡×\oi&ž^_?˜8½YN©:_»CZwÈCҞÎGùp´‡´M°Aµâ™#ñŠ·o!)²E̗Õâ&`šÃàç¦b­Ó Ötvþ!Im Ù½3=c2±œ‚H}å"Ñ",Þ¤‰H¸ t‚LZŽÓô•4°RÜ^N7֟@H˜æ䏀“˜&(ä)c3˜ër>e"ø'"Ó  #Y«#;óù‚^ŠÉ’giyi"1¢†n‚¬¹Ž-à®°o3CéFÓµ~^IZâ±lÚ2`iç& ™æDŠ´¢87dõPóè˜&ªë Å<)€z4…Ï\.¦IJ*ðAÎOŸHˆÎ²xÓ,y‹"´øŽ¯c`h\UÈ;Ò,ü·ü±Ë‰(ÓdWùǓ3ú¥‘_$Ï=‚¸•æDËê˜cE@³NÂ*?oåB`‘د;*Hý‰™O$ªýDæè0œúCKâÓGC½Mž¸¶˜%i$žˆŽþœü$hídÿ½˜ò,è®IyzeG¯ÃÚVÈ”ÿGƒBK +×kWx¯\Èü :ßð¹HYà^)a µ™ç +#PïO¤¼ƒ#t™l˜‡ɧfl4·_ü0/Exµ»}/û¤Éè嬇iޒÀ¼$©2Šp + G¶-$Ì嚟Áš ™fpœã”ždnñ…V»ª/öUº¿@•ÙžDÌd÷ób60ÿË?™b©^Ÿc^N)ØÙ¤@G¨øv“JŸf¤,IJGP…×›6O‚ŽFGâPk=qN4Nžt¡Ã„Gkš“¦ ÷vjèäƵ4Hd›.éàÐ1 8ug´I9Ê_ƒ3ƒ»ÐÁs‰ÿ+[!x£W¸­ +êûÀQ·ç¡àzá€ÐùÅ8ûø©Ôû+~öRÔõˆƒ{é°  0ÜD8ø5‚ƒ÷ÈpàŸ¾w¿„Ì{ŒoðT^Îkð§§^Ð*0“ê)¢RÔTmðš(ž¥µ¶› ¼oXÙۀˆƒ®ò²ì5áÀßј„AäkïC‹Ÿ{ Ð:”â\ݎw-;“¬Á˜HVÑY?•äQw i`oìuc¢A÷×9®x a Ð`,ä8õ@µèÒú™`â‚2Ó +ÚÁ 0a•@ &£1Ë@ÿ ? 2À—îàkú8rAâ/ endstream endobj 131 0 obj <>stream +Ê0÷Údp‘:‚“ –3zýE§²?²³•²¯÷WYB=Ï96°ˆ¢–+)t%ç܏*ZTFpˆbí„0 –x{4ÃP+а`´˜°°.aÁ 0 0ø.ˆ#$ý»¸ŒÕc€žJÈõ‡®ˆ¾´Šó{´{ö‚Ó5O/šòѸÆnM» ÎRbÜÇQþØ¥PoÁ Èà<Èwz&©äÖà±týØŸ# ó}"¿G $B!šš„qmH|@eÁýÈ3¡€Ý„IE·žXðXyó©÷o +"eb“Fˆ¼‚Û§®+0OQ›¸¬Ÿ˜¤4h"HP•cm¨þ߈u\é4ËL§»ùiRÁøÒ?Š +ΒŖL~ D ‚‘§ëë)¸—ðúr +þ+ß'y0&ƒB¹b›Æ ã jŸ¥VaJº»³Þ̳&†¹c¥n +-h r + +8ƒ‚ÔÆ#¡Q1 €ã‘e¨†¡@VxÄì´O?6 g4—îMŒUN€ŠÊ8À ŽïÎ/ýÚEX  $ &?ÊbÚ39Haƒ dç%@ +,¹sÄ×üðéo¤•Ž%¸Zܨ›^©$ÔJ°N•@&"KJðçu”àcôwœ¡"ÊLP´™’àÍ*¶‘ãÄJ#Á±šˆ·FÓB‚c NHà×⬥婟3 $mFGðz"‚#X˜ë8ÁõÅͧõL xÝDpÊuÁ3K%Wà˜@ê°«†à—vÀ\åo!x)u +Á½°—¼«Ü`ñE•ÁhTâéý¤zú’3R•DRApJ2ä +.`üJ{‚Yž¢býÀHÐzg_Ù>ptª3}äA-Gj LðÙ…W,hš=Z»Ùê›`¤úí!Y+ô@Ôo”;Œ•Í'm/ìÂB&R<#O!æû' —™1¶^b)ƒd g£ î7hTö¡ÞA(ç€çšµ´mN!eZç*^̔ǪƁj ÍIwxõaþGuÌW}/s¶ñ Ç2°á{˜¢‹|Eg}Ö²v©ïDš ¢N~ŒöK•#ÃM2b‹Z=Àq)'“ÀZçÐ @D [Ký¤&£žÿLˆ(»ë¡û©¯µÜ¼Àœ –më‹#q=ÝÈ.gʀ ÏÙ̒ ˆ1[t@qÉÉçÚ¾®ÁíÁüªOʍH걒~~èJY ÀÐ +0ðòAŒ"ª÷  z`Þð5_`˜÷‰6­€âiäTÉuU€6B¸0“©¯4TeÝ£nAÎüc…æê8FDD ü%!§üù1À…~=Á7jx Tç£œ1c“ ³TD»Ÿ¨ºæ雙r :×åöd lÞÖ}F¨ŠA´®B)x5ÚëšG {@p¨x l-á ŒjŠR•pGcÀ5 +rßò«eÕI¡šB9–Ø3 &e +$… +Aa_õò¬'ÿ©–{6d9¬®1|@ p†ôÉ4%„-À)&”o¹ÙöÑå4§z/&äˆ9dÖwªÐ2ž¶8#Û®ÄNÿçûžlƒ€4²ì#iBlX¹j7 ´¸ñɚ_©Oҁè.ºá“P@'Q>•ÒN>à øê‹Ê¯[‘òÇ ú)ânîi[ ìi«2lm*´†I¡à€–ÇÛàò8n€} +…1ç€ì—d@³€ÍáqÛ>ë½âÔð=»ÌÙ½'ĘՂэ¬“‹ù|½^¸/^võÞ¯p‡TŠ. ^¥€ÀVI¸Ü%Ž¶€o&…©äµ¢˜êF€.«ËCv~Sûlÿ¤RrS¤é™ˆ‚Tˆ]b­‹UÉSóIû/D€DÍG +”¯Š^¬pۃÀØ1¥…8[¦ 8mÙ§Œ1ÕÔ ÎÒzôhK@• +ŒòÚyR7¢©ž s¨MɁ!†L¥áÄ?8 B¾$Us$ûF@ ³&œmœù¿ š’çZ~ٗ°S‰en¶tE…™.CÂDU¼Ô p ƒ“T©±àhLgû-_¸ö&R¸1ŽÎÉ=T“ª}÷öb€\Ç½Û½-´¢SPΧL´ç—$wÊÒ¤µ6Õ: øÌÖ'Q©lì͌"<ŒïCʲ#è˜HÌÖ!¢LbaË §ƒà.äá3 ¬‘{$€ +©×&Ú0¸טK{¦i…„…«U»Ž‡²/2 Àhnß͐m0Àêɸ‡* 3sæÿxô¤çw›û„“:€~ÖZªÉÂÜuÚÌÖ>Oê딍jÄ; +@4Gž2(" ڃY ˆq¨ C*.%PDafïh֙¿ÜJÁó“Uõ£"ÌŒ÷¿dåáÎoGû’¼-á¿b>1¼FV€G¬ú'h¬|éeþ”›@€`ÀÀEl;:F}¶? +ƌ–8rnQXi»ëtuppÿWDðÿʺ×ÿÉP‰ÿ¿©¦SV—†êÞ7`ËÿÃü0Í»ÿl¯õ&%÷ÉRÜ}¸ñ'ÅÕÇãzÕ"pÁåýqŒù¯fY.Ä vr& òÊ2°Õ4>%⿉JböM®£¬tÄ¿XåÙoÞæ7êÑvl7è}!cç‰f$®ŽÀJ=åë‚ê–̏ϙâ5˜|— )@£?è_$ˆŽÿ‘áà¤YyòoÂ%¸'½¸àøU÷ý³øǞtÞ•I°Gb¾&vàJsþ‡{ù‚®¨~šÜß$uè)/]J| ÖSÓÅ þܚ%ӟ_,ž~·ôdp’þ-ž»è2<ÌA¢Ä6´¾§,ÇÛ[þC¾zB¤Ç¶¯dm!¢îïï2« »ÿ ù—™ ÿÓ2_uü§œCkJ¤øÿû¤ ±ß—מì>þ ˜ùðÍ¿Ã]ð_—ßóTTzrEå¹þò—CºŽ3¬^,÷3`EÔÃ`_#Âý? ļ‘¼dˆÛŸ'1çbmÚÈb±õbÇI%ö[E{o‚ÖE¹Þô¸ý¹> +Å')¾}›ÊI³l?ŒXdð8 +³–v‹ðˆâqì.Ôeì!?ÚÀpÄk„@£ +(6¿pt§Ñ”,ìÏ3HèúÓ¡3!¸~‹£ÃõfB6lýé•Ú•Öçþ¡@‘ª±±N>kÌóÃúóC±9;0ÞÕO¦ ÕoÏê_ôŠ7ˆ½!Tý|ÑÈOZRΞç¾êaâPâŸ#_å7ʋ©ŠŒ,}jˆ‚Åj1j((ýŠlM×âü/X.!}fí;ӓ5(1¡Â$۞ëÔã(öÃzðr è¯Ì ýýà¢Ï+%óâë”/#ô·^ó|‘{Ï,’ªp°hçߨ ؋B9ÿL¶Nç{3=”øÜÙ³@ áâŠôIÿæ âHm4›°Îg`/ ÂÉ ËsšÉ€|®¦Øä`~5ÑŽmŠ¥>,¶ÈÎãÿ›ùSŸûKEK¬NàO±2õÌômáYXdã;@(Ø;g0šðУ°&¾`S,È%ñIö±š}ÔWbþ ÿEŽCY† +âƒKcÅ7³øA45;ixøPDÊÕzç÷á5Ð\÷ Ԏ]sEØŨ€Ør½×êŠK¶0OqÈ{;ä% Xø6°"­$…j£üЈicMMþ}‰%]”å§KºyӓMahÅÇZϵժÐci1L‚ÄQ†ކ!ƒbxø‘ÐF¹í'A\¢óIP ÷ø¨WH…i8$…cï𝾻|ÛæDzqÎHc€€ž¿™¶ÊˆÒÆ¢ñ®;h9n‰À¬‡aÃd†Ð3M'\³ Ÿ›†TÕï²çóA¹ÙµÊ¯deqä!K%0¸˜^‚´1¤tŠË˜bƒê¶hèßô¥U¡»Ç‰…ŸðšvãD$ p䥿 îºßÄct8©0SHw扵a{dÙpgø@°˜æ‰Ù¦üËóZ`!òG@n÷¡ô>‘ÔöȆ£¨º:˜˜d IÁ$µ†AWÁc °SŒ=þ˜yØk“Ny%æ}ØKßù„(j¸® ^ÎÆb‘HÅ,ËFTèŒÿ÷ õ¿KVqMê,ùî±(°¿ŒD¦•‡”‰úJlôÕJNÅD8Û<^ßY¥¸R)£f¨iŽë2ó +lçòÞÄÅi’‹9žU’’‘B·Ø5«ïTÐè:_ÚDZqÿrEà7iU©1äî0åc¢y›IŠ†X—üÕ9,Ó7_M†¨,¨¼Îe†"mÓ9ûsÀ^¥Ã¼P]e£f—»?³ºÿ±R\Á.⥒ÚQm +¤þ¹gÄcÑӑê¬:q;æ|k~ˆ7:Š0? …hÓh›#°):Š.´óJÈþ~‚©,Ÿü;ïwZ¤b€{Ò³Àsƒv×[B^咶ž@ïÐòÈAhóM{½©ûñ5çm!Â5h³0ÿ±£ž_풱†oÙÀ—]o³~ßqbL7—n†j(j|v´ýKÖ°Q¥;b©¿) ƒJ‚Ã羜ÊtåuHéŽoôÿ2§žF}3äꝀ’‹tþ'!ÁÎ/jTöÑ:êŒzÈrE´2' AvíÇ:-i ½«•@ø¢]ûÝn؈B¯ÕЧ ½â#zEVòzـsn±xº;J¬Äd"¿wD¡Œ3!^k²žOšà‚3nÄp×v%øWˆì7;ò#PæÂÚç.‡dBq×û䝎x–¼å™‡‚äù&­œì¶77m•”¿.l”ø9JZ¯P3O µžƒ·!t†ùi•ÈŽ— ·Iu~PF•CœŽÔÄ:# žœž #3³ÙÐÌ©bàã5(Sð ürwx ÿÛðçc¡aQè2%xM“œKYKúw#ñÏœèRǟóX&@ÍxÅ×v@ÊÎÒ +Í2jtTð r2øÆk7"¥=8p*+$¯x9+Yvc9܁ aŸ‹3w¿ûÑw‰Þ=[>:I0GCâ„- +ŸÖIê–QD`,]ÙãŸbÁÃüO4(A® £:ú3<Ë4ºê™q +¬ Î)EDœ´Ö^I™9´ãýBd̀zDMÊÏÿ&Ÿ¯–ÀÈæè¶ ¨s¨ë—r«ÌHŸöz¼¡©¡8`Î*ؘ­)2üM?ân±vŽ€ŒCI']°JÓ;̈Àjh;°SgH‰Z¤ÞTÑæø‹à\E6-œš~MÎê[®ºø.ñÓ[Oó´y1ˆ.¶O‰›‡Ä’¿½ˆ'[αW(0ÇҟŠ;<:…™ŽCÛ:.±„oYðsèQκƒ^•uxו/]A±Àz4Šª ƒËtïh:ÙÙÍ$nësB›k[Â\QyxÜ·Xå͸°°ã&He£)_z“¨ŠD÷—ò8M€C‹ ¾_PLÙæïö¤®®V)˜ÆÐݍ·Á”Á¥B†az²VdP–ó¹£+&Žµ…Œ!Á¸ÚÔЧÉN½Ì¦ß“ø¡b¼Kµ¶c¶ +ò&ÓEr؄§_¯iQ(þÀž~ks¶¥´PÑ\;º„éöC§”>2Ñ¡jñ¹³¤éÿ~üA½zéÒ<#É ¶ü Qaœ¹¬2Ń“Æ¡êœº¸Æ¾„ߘ؛Uø±Ôtæ/Â'â&þ£öK·Úîœpg¢£Ýd£Ëñ{iŠ/‚ÿIMmyYÖ7A¨”Ї‘¡• Dû !ƒF@#{Ül¬áäÓÙ1BiæbOÐ#ž6œ¯ˆeh¶!§F㗏ޑj’æÙñ [ÇÐH4לŒ0žóUŠ¾ê¸Ô+§‘FIJŽ.êª]m’—=z<Ûť܄)×™ë_ ö„b‹žÕ[M’ý-²{³Ž°Ë$/«‰ºÍ y~ג¾À]Ó]uC§fkè«a7{X/‹N- ­äæL”¾ûþÍôä]]÷£ªEni™OŠi‹pjÿUà>%Ÿ°æB +”ç~ê’è‹Üù„T¤dvþ1ÎM­ÍmԝÍå‘^½†idœ;›²ýZ +`¯fA„V4àu³ uE“ÊàáŒäÂyMŤÏI¢ßH ʘ¥lä[òœ],tÌ¥V·0Ø°7^¨ðÇÂ`͚8˜~ÅÁCééTˆ•’5#¤ÐÍV¿™lªýbi#ÈK¢bÒÎÀ“R^($Ғ wHÅïûpŠè-æõúYÜ Êk/͖“Ïlö>b±¥b¸Ú¿cÎ;úPÝ®N‚Á»mxR†À‹uФϺ u|=FªtÞR¥ÖÃ:†Ôa:}5#šõª>œm?¥_ wå.€¾ÄçÄí¯“tùOzȯF8„Vb¦ãH¹W^òκf™“ÉG¢¿¢À†KŠ—KÁ5&Ñp;øÑy×%¨•lp³âˆA¸ó¤m™rÓW›óýŽÖ¾kð^ú6ÈVJ„‚^Ø£æMÄÖV\TÊW2CqMە*/DG®ºƒáX…Ohô͈9‰}k«K ÊåÁ’¢Ä­Îx•; +Ïðt—c(:pQ XØO_èW8‡ûü¢<ÞåÇK}Ÿ-LJ¯¼”ŠÙp’—Ä‘úơ얅žƒ! ü„Õÿbkä°'+1žfF¹NL.R§,ؚP;©ÖŽÁ§¼8tFWȞíoPµÕMÕR2,B¦ Üx#†{Õkî ‰nYȔûÐfyüÿjÙ¼1ÂVè®=–ˆü¹“Ĩ™¥7£#ºÍé>¢CË •W>‡gQ©gӀÁA=™–‚«$&ï3…çrÚ¢ù¹ê(%y•a’+¯\Õ¨d PÍÃ:C9ñD2ÆHh'„°r%´ŒRêî>Nªr̓Ñå€Uf›ì s•* Þt×q)•<ÿ[ÎÊ´‰ðqïäšb¶g¿+1´ò©{'2â6+=†C5ؕ»Öwê<À2 ¥Øœ { `(P 4¹oF—¯õÀÅedL«¶ˆ˜çŠÓ› ú'ÅÞ+¡‹êí}Ü0”2>]Ó-¨+G2ò¸”¨a~áÄ4_®¬CÖ˜`×9U^Ä ɼ¬¼ƒxñQÉ.Doª*•;…M{šµTmdÕÔe§!ß5A oýÿùÉ”I&#咆´Ty’®êpT$,ŒÑù)¢x°;KaÌG۟‚…Ùr§‹\(q0AAÀ¹¶Þf(¹†*•âòם(!ë_/îºcÀú«ae·äØ4(ˆÝFam P*b{ñ}ÑÖ<À|H•=}Nèè%ãu®ÕÇ$Nóÿ·ÑPÖ¡´nŠk-¦( +^i,Ÿc‡XVZ#7“{È🢠s:¯xI¼fÓâ ¸04•Ç©ŒS¾9"{X("è‡Ú雇à„oë/3š01‘@Ç%¬ZÕ}eЦÏÐâ¼fqÊ)Óí4+X€˜®!ª’T¥Ö?Ñð1(tÝj?È¿>p ü#)&IXîÒÚ»VØ7±ÀcƒßŒ¾ûâä$0×HАÀ’5Hª‡ìôÅáÓ­„Ç¡åõ1ñlé64óŸ9Ár¶ì›q€ã-¹¶LM2œ÷zÙ©ýÔ ²ƒ““e¨¼pԙ!R ϬЙ'³s´Ê§r ÄIã󘜬"¬â'>ðãoJي¼¾älnlÀb‰-Årg·ð“Xv2 ډ…Æ !óþ&äŒäEù»èL-ø±Ï5ÛµŒ'FÓýÕø× ýñÈU‰éi0JXFEľ‡9CàÙ @E5$„Å´O„o=7‹&@Š¢[êŽ4‰5¾kÌ\ⶠ‘jcŽ +Å4A®Æâä+5§F,hèåw桝ß3ùÐnµ£åX¬•0uqÚ*ý$¢Ïdí: ¼d­‰i¼‹.ô ‰!?ÌᮧÙð*":`(±o ñ—\*Á:ðÁä?9ÑÓE>÷‰è?ÎTc¾žzŠì + 5mŠ +Edöƒð®ñòÊ ›ª>snE + ½|þx&×Ûïç~sÓMÚÜÌóMÒûÊéÙO³K@J&#íþלٗå1 +íj™5ƒq­ð”P0JZÌN›£lE dMî<©ƒ@́&¯´ô íYZÏ ÇÐå¤è‹{†zèRërUoY¾uØêønmÆb›”i7„¾“yÓt®TH;E۝³ hoÊÃ8ªK.Ìÿå­nãQ jû\º1‘ވÌî®õÑv¦È±ÍŒàïáéÓ:U ‰çÞÙ/§YÚ ©yÝEO눱,fBeêF¾¾þ5‘˜JøŒÉTœôۏ)<üå¢O܆\¿çž‘\ñGÖ©îúæœpúøT^–hÖH9/§|¼ª]þÉ9K—ZDØBÃ(ÜX sÇTiÀO\ú‘¶BTÝm€ÛFÄA`™ˆ}¸qV¾/ÁÚsé ¼þÍw.2…©ûmrž«‘%¢Ž^ˆŸ-®BÔW¡#ºkÉë\¹Š:Í­òÞ ê•@ÚR\]SPý#‹¤`„JÄDȹw×ZjF‘"dyN{¥iš^5ieÐ7ˆ\ ·1E™ñé cä>\âxŸÆd*ŵˆ½Y>m<z {R Ú+èb5³'/°ÓÈÿØÆÍW‘%Ã$ëM$Çõ\T”ãª"±Gk÷jܵZ´2ÊB„·Fšø̺ôŽ¨^&›èhvÓï4DòÈ-uœ ~ó¸1T³3´ƒÐÔøژkH-½ãúxø‚ÏìÀ̜3¨Œ‘ŒcwÁIÙeÅ6éuy—Áã€âTM 1á3ƒÉИèôe»cSd2ۘ~RæÎã.8)'…„¶±W¸,Òã"„«Œ¤ì+©³~tªÉûĂۘ n%1ìqø´Cßßf#Y ÜÆrh>e c‚!+̤õ\ÝIÔ¿KAƉLtÿ`XhŽãÎSpBÕXVޗ)œÅÇÙðã;Ììtcã8¹³Œó7dÿ+p´( r »ºC礂‹y•%ë7Z"FÝÆÆk--^øãšce¨ž¾üãŒËøm²ÌŒPïqdQ䶔7gÒ e}ÎÆ@µ’;[|Δ¬X»e궽w³IÁѹUÂ46rUF`dOÙb¥¥ +*ÃuEnŽ0_"®ÿìsGp`_]^¤˜›™!©"E^.ŀ$É*žEN–HMÍÔTqjj¦¦¦¦8¨¦lf†„„tƒˆ¨DD$AUUTTu£ªªêªª\eUUef5Ñ«;QFU6®*TP·Ë\;Æ ÎŸ¢éFSVfU*T•°²«Ø˜òYIËW­Vµ¬íµ¨mÕmµFܦëLæ +î’z½^A½^õ¢×  ï<È&2UÙçQßDö}:= ÓÉNtú‰( ¢(ƒÕUÉ•H¤ÿÿ‚!8S"kÄì˜*D“n I™lB5Ï*‹Åªb±LÀ§(Yüqƒägf çfhf>a:ú|nL Õ{•Ñ0*U‘(¢ª¤UUUUUUUERˆCÎ G@¦3ÁÌ " …!Ҍ‰„H£Œ‚@DTP½ª*ÔÕ(3²ad7«™ÙÌÌ섙™ˆ‰ªL?µÑú½ +¸B֒¸<‘³XL|©€‘ˆ™DÈ:#¡„艟>¨”Ýn³°¡P8 ÇÃ!‘)y=,v<@T”¬¸´Œ>©QJBˆ1ÆC ¼=dýDeT°’ÎUçãó y¼Ý§æ.º6è¡MXç%öK@ý‰»ÊÃV<eéTŒÓþ,›ˆûzÎz³&Ú–ïpÖ;N3¤ä*,ñá4Ùd¸gïy$‰±¦ñå²ü8½.Y¯œ²„lÞ_ œ´ÛÝJSn£Î͍Ót@ EÄ©QРHœ8[Ù@—ÓcºJŠ›ƉWçÈ jƒ>Φ]¹bIJ=9ƨz2ðî®éiõX¾6‡Sgý˜(€±i¡QÓBH)gWà‹8ŒEo4êµs Ø°S­ÊJ@e£ ¨H FÌ°? "R œuÑQgÚYº‡'*ÊM‡9LEN +^µ¦ÒaÅSîýK:7ï[õÛ²gNq˜¾#EñeĊ#ڒB* +›ؑ¬¥ÄƒHؐ+™wRŠdåٍBKä€)ʖžt(.Ù±kS.2K¬O\NÌ)kô6÷‰6¡\à p¡/7"ˆÆö²d0ý´ ¿ºW{4X¤£Ü°ƒùmׁ0ݔÄþϟˆ«öH[1K#ÍÞÀaŸ¨<¿Å”;"ªI­¯ F}¸?RqœúgúU˜C%“ûSƒéǂÁjZM.8×NS¨ØÀ{7I’ÃÃébQó@“¨ÔO'üëäÓT„pø©kË˯Rž±Á9DTú:­îh²Ýð xsÀf5/ìS“\q굩 $”>nüȬƳ>iy×è›J-ã¾1¬OMK’V\횹Þ6Ž¯sCä Dî¢tÝ0 B‰c G¢Ñ'¨˜ü!IŸHÖè„3±P‡¢à3¢§Vœ÷Ú0mBØóP\ȁ¶ Pîà…Û[Q ýÌÄ'Ç¡F ¸@#š¥„ [„šŸ#¥J(žH^<ᣱî*Ì\¨p÷HµzAƒýö_€F$ý9Ç0=<8ýø#”è©0l„ÆõHûӀ­^I脚û£l-u¬ҎÎuƒX‡°˜¸»»£¸<1Ök-eÚÎ$1ï0G: b¨zñÇm×rÐAkvh˘Üò ­óF¸^ù@z¹œuMõýB¯±åQ5v0=ØC˜©C/ñÄï€vÐm `!p|Æ0+ÕòD)Ø ó¤8þÎbºà€ê‰’Ýì>ºvHƒMíq…Bç†/K‚F×Òù6 +Üxp fòA å|o¥Û+ÓÛÙ=Ù¾«w1Žëlè:ð?v s_-0Á Zv±qMæÓ=w~ÐÍi¡À.,#ÀÖ¦[à$‰0Sz–oWXòÌ|:-ëE¦¶[úBˋŸAèy?‚œ2-«geæÔ8SA÷dÃlã’Gô2—œfÐ* Ûoó!'\¡t;è@"8°AHÙFè×Öö3êêNŠA”QÁ@ÔÅY„pœD¬4~®™¯Š]7¾q‚ôQ°CaæŸÅÎpgMÑjÊMۊ™&*g·‚<2à.Àø©N˜ !4i¶!o6Y‡Ó©RÓd¯&ÅÂNZùþܫ錽ÞŊ?ï úçܳ‹ÏØQ”äƒb¹MÇz›|¹Ð +$`’p@’-@+lD× Á ÊÆ*Ö ;É"€fJXÛµØjx“í0ü¯ðŸo±ÜR®ŽáŠÏ¦Àí´úmVÅcèÙºVsq3*D¾h9âoˆ'z'T@R ¦~õ¶§µ*öM?šµ‚w‘åÔQwځ*~>c`ÔÝÞRžp{aÆÅÖ %‹K’ n‡E,ñ¤Œ"i{Õ*©þH‰¦¿gã ASAçƒñIpö¹È!˜)»,L;5´Ÿ»îÛsªö|µÔ…t:&´¡%<–7­R —¼Cq«Ñ“«KZ€ûyÂTG:pµÑúÝÔL„Ï/Õʒ] +†Áa¨‚=Ù<ûAÌiE™jʔ:ÈReU˜ÃÛt’….ÿ{ÅCÊ ·pçAAro€‹5¶\¾·£Í…7”¯â ×k97ŸÃbEh¦ƒ*î9/—•|ÅéáVà¤åŸšÈ¤w€#÷ºfû OûÀ~TIìŽóH–Ûž wA@íäT0–P’* ÇI"û·ª±ÍäI©(ي>(Í£:œÜ²¶îHXxÏ|AtŔ„\ÐéƒÚ +ÕSß>î-›—R÷Ҝpzò-Dür+ Êódâ˜t¤BóÑˆÌ ÖCî—uJ£Ø Fqð$ `0®±ƒIÒlX#ÈÐdŽÂÆÆ –%eAš +¥ V3êxTv|ˆ fGÝÈ`Ê[¢möñÙEúÒi|ˆeˆf”GC&1©qÒÇptŠ–ʟS +mŠ¬¡—.´fbP)E"ðhPâÜÆ?ÂVü Š#à”Òê 'Ð!–<Å÷¯-çp³Ë2†Ó3œ:0üå6}€7¶Á¥Û¾¢ +ÀæjrÙ6Ý7š¼åã"§¢Û³;òžùËBZàb^óm&C#ÇáÿIX"}«Æ8‚h釟vĆ䇶¢N…ÈÊcôëh¹Ò­S[PÐ +‚¿á©xW;_˜¼íŸLÝ?t“¤)AXndF¦×³->|¡Fü£aæò/@€›Ì[c5É]Ú?ڋÿŽDšõÂ×ÒSĒžý&0%»K¨Dz^þ‹˜ 1¬ ¤ˆiÜtùz>ÅTcy ãÀ/‰kO±”Ÿ5+ªWfu'™†ààg#ʂº7+wvb!“<ŸW¼â¡Y„¥•“‡ép½}ßnb.íÝ»û¦ðÉÔRµNrÓ{°0ã‹ ªâl|hÿurPƒÖo¸†ßM8 ’‘Rr}7Yà;/øRÆÎ)p(©…Rð¬¬ÂE˜€<”ù@=!¤t3•ßê±[IÂxž˜i8óë;±ˆ€×¤ù¿î<&ò‡¶*™â@_q£Ühª»Ï©FIì×%á,€§Ý.”–^YE„:˜KLu†C93V/˜Z2 ®CØÏ`°X‚öx .blòO#Kù"!Ž ߗæÛëªÉzãêÿ´S1Wö4¨ºLï# •$QÍQð»áÊQƒtÈ¢XõÓ +XöÈö*՝ Ñ?¥ETX~+"]‰n3©Ú¤Xc׍„"CÞ| +±*ÆX° /ŠâCþŸmzV?Äz|&ŎԸQ.<Ãpø.zƒ.tðÜß&;&×QS}’Àø$[Â)Åè.ÂÀÅ]]½Ô[£È¸V–á~€ýGsvÄí¯è.f3µŒd}ŒÃ~;¤±oÞQ ”Öã°gçÚH[~ûB±Rj+„?µÚ¬ô&”S)Ä20\g£êo9Óæ%½“M‹bð-`::=˜k³ñ¿½¯:ÿY-"¯ÊL³ÄON¤ÕK“ƒ³+y÷é~ˆE+“OÞ¡Ê#+4ß}”9,™Ÿ] ü]²9­<˜%YÚµÁ—èGõ.Á’æþFK O4_9怭œûu_Ϝƒj6ÀÊ¥XLŒš¹DIéV§8’(ýµÌÁ1€H’+ÊÜ.¤X„ñ½9‡þ7™Þ1×H|s÷€Y¾îæ›UBnÄ’Èsø|k˜ó3Â-ƒ þòy™×ˁ£‡JTYH7n¼®ÊøžiN‡Îé û@—«ßÜqzÄÏSdËeÉåh`:ÜQ…ó¹ƒË¡ÎRî„ÌŸšjÔ°n£y¤&Aq~@Ìaô1=Ø!çÝüÅ9v# ¼ãrš«y÷ü’°“²"”-ª;åNuÊêæ›ÄrðrÈTG… C7M)G§6¤¢L‘4T%9–Î1Ñ2‘3? ‡trì kb³`¼Wä0Ϧè)ä0l8_‹WI铞êXö¢É%5Ëø=tGKŽ–å&‡ò›/s]rêNÊ1–щ9š»çh4(¹½¸÷ “œ69O:Û-Ó +ÅȝvØ9º÷8EîQ§LôÉ>ú +"‡A“Q¤ŽU9üÉâltÍGä d¥Hv‘/08 ri$ªm8ìÞzr©!#%öϊ¦d0«^ ly^:µbôqp@ +œ6jú&Ä>Æ$[jÃÚ0)hĹàhNs9h„*VuÈãØcõ?Œ|%ÂãØmµyG#!9#?Åq,Y8䊭7îtîƬÜ8·Œ«0¢ë“š<WsÖ¸ÐK ,œ£•õâ¤q\Dµ¨Vœq nôů0.‰?ÆÕ;¸†±pˆFA/î™M¹}}‰Ãtqsº;µ×†‹C5âÇŒç4è¾GÜ3 €ã/u-p/µb‚dÅ¥ˆoUqÏqdOTaʵqAàÚ«x¨¬å’÷Ðf±]£:j`S€$SLûdëÓOG\¼¯>8".¿ŠB àÓ2á Õ`Á0j‘m²ôÄâׄ8ð"* â€dë?qQsæ >Ïr¸Ê¦ÿÁá0oÔKT7\ÄI­þgñtd<ñÄìÔj8xXjh¸*ƒ¥p †KrïßE2DöÂuØ~ƅóG®«®…Sš w#æx@ÉÐÍe˜ +7¬)éqãŽ1VÒe*Þc?À„+â¤E[×Ü·úÛ^°èkï*/š" ÷H£†3‰ƒ£g­#$onƒƒÏIƒ›”2¸Óº3apv³\ +\"¡¢)‚¢ºUp{,Áñc}]³ODÇR/£à"Ž¼?•¼‚åûo(7ãËÁÀÁ´=OÅî1V ˆçaÒáo+s×Ì/§Ó3Ôêî6Ô"ÍK¶ñè7: àøvF@”NpöՍ÷ë·n !P–¸ëD&f÷×½QT~-Ÿ*Ó Úøo=¨•Ä£¶Ó¬óÐÁ;Å¿åCØT¶¿•Æ‹þ湺 œ0€Ÿ´"×¦T”ü–2¯tÇLꕊßX)7€þ¥¢Ë mÀo…à›Ò\žX«TÉr{ß`¤GK@Ã)y©©àdÊÕXl¡k÷rUÒ7-M[è[IÍ qËüÅގEøKüvÌ©·Ý]•Jå$Gpò#Ö| +aC£Yøöž08rŠ=¾)µ`ý †ïm°ïÍ&0³Câ½QgºuÐõF Ë“õÆ< ‡UoPŸë@z+LÕ,Ao>à†G§¥w ðš7(}Q-™ØÙ0o2ÃA"µ0vkÜ:Ë¥¼ÇÞû%oÅ)dCTÓí3òURãù<$țŠ5À”F.¯Þ¤+É.ð–øH¾Á~´k3ëwCušõ÷f«tK¾¹H¢åBO½[ë&µÃÜU2—»™DCZ6Ñ +wË!%K˜A5#©Û 6°†“±Øn\¤õbbËéÒ­Ya‚?Ú ‹”ü"­R5?N­µA¯ÛPRLqÝøZ(Š3çq­¼ÙeºñŒÞb÷Õ(D¤©Ý™á%э{ÈZݺb¡Û|œÚ]¡»à?@@f9Ÿ֓#oZ“yž¼)ún¤oÀ4ñPǹýd€03/b%¢òŽ†QŒ mNšD 4®?u6èQ’[’¬ó +Œ:¦IäVcž”ÀLá#nۦעÈnñ?Kµ-9ôFuSe-bKŒz&œ€X)¥á±*qC‡„!‘–øÀx €Ç¸¡wœn9ÞYÔÃÀMÐøµv* =u¬¿ôPÙÉÔú@õšýïëÖlض°ƒë€ €+o“ãsƒú¨ u£ÊàmE(ŽŠœÛ‘K,ÝêðÁm;‚M©Ûhšý)³Z[0~àÈ6e¯œeI<ؚõ²;mÉÈm@ïÙÒÁáÄm€Ê‘ fʂÛÐøC#çÈi)°·ízQg¥ÿmnù&qÛõƒì‰œålTtéÎÈÄ芡êƖX +J«€j;jaŒU8•ÿñ(Dc–2FN\n³ýSD9’l_ÒQqú®û¦­/Šrڎ†ÿ÷àóo󄼶 °ùØMñ¤k«ðg TQ"¾ŸÚÖðØØõ¾VUÝ>™H ÈC²ZÃ0y‚ubìÅXsYûœ‡Ä¤vS³5ÌÇ=АÚðfö . r¢¶È‡ÕÚÁdQP[Z¤¥-hO[a˖õ,Fôç£Web,YN[IÌñ rèì-þqºðÀaÚèî¡¥í=@†<¹ÙWk‘¡{Bm™ät¯xe‹Á7†¶.¶Í Ö‹Ð »¢ëg{¹lÝ=„¹@$û9\I,ãñÙðtÚ»˜B=[©"/%a厠9<Ûݵy £ílÅ®^A®ÓÙNÖÉoÄ1\íb#\Zsç“&x-álU|t®Ã4¹ÙŠIƘLäH×.ÉÍϸ3XÇ1LGûõðrýéô5¦ÚM)ÛÜ$ÕP¶ê¶X}ã¹Å9‚Ùð‚¾7âp˜3±L¶Søq‰Â[I XŽ‰C@N™ç,müw‹;à±=™†m¢cóqu;6èmcã(lKT¢0“±0Œ N¶èb#>‚Å6QÅîР3@–Ll¨óÃQTšÉˆaŽ1Ë À„ Wÿ@¢¯¦¸öܖ°Á+C_nÞ {‚°11àÛeLë¼,l¨?ÇVj?æ£Í̛l¿¡vdîxB¶È&6vŽ¾·ªig<ãFD_ëdÿO¾Æ!¼PFŒâßZèÉ>0^ƒ‡ukÅIN¥ºnS³¢0®Âi·&ßiÏp•S¦çë­ö儢„ä@NØZ£LS5î(³F×ÚamòAb ¥ŠTlZm§µ¸õiº¦MkT«¢NZcÚ JÑŒØÀ®RoàôZ{§Bh èsÖ° üTPƒÂÎŬv{ã~Ñ÷µÂOŠ5îZÛÿs€¥¸3b­VDÂD3V£ä@ù²ZÂéÒO€RsrÂÚ\‚´­ìzFqÍuÂÆT'œ… O:ÚÑ®öK(­ˆCWkHct7¤a ®ÆT …äo¶Ú¢H)½‘ßJVvCNb³ÚÏ­Žñ{aÿò,Yí^“¨3m`B՗Õ'ö,’¬Èމ·¥ßòæ+á4Mt¨ +Hjt·áÙœjØü£*!wôþ—.¹0‹úÞF©FûB…H5˜dù=Éo + òE¢P)”P-7s†v¿ì‰Çø´£¹h.j'MÓÓ ç^ ü\yšÊ¹MÁĂ#ȝööZvÚHº“Œêœ-ccè&F§Qsdeзè®X4·Ç1Ââ4ôö …"ýÉo{!€š†GZit"†ºÊyÞq؅¦i¥¡F‘&j˘,* Jäñ)Um!„Ìk’aÚ¤ò1”AŽ/ ¾mT~?ž†X]ðHpÿqižNÂjg-íutƒÂâՒt˲p€÷ZÆÆûÊ;f>€) W ¹õ’™voR†qÒ#E;Ah…û1ŠÒ¨å(:çÍb–†K@G>uCÚÓ¬¬nîŽ]dû0¿-iglÔîѕW7²ÁóaŒª)€k¾ª¯ ?cIš¦D23[ºà»«p´æ Â+‘“„4"qc· àø± ~¥,Jg¥ ¤¸i†n0ªÈC A©°ZÃ?׏6¡“p¤ÙÓIš|4(4Ö£••$°¡£Ãx´ùà´£…ó'3P˒d¡NG†Ô6X:Èr´Û¨à¡½UÔ1”œÂŽ‡FYÙ^vE7;&¼2ʌ°a£Ù%’O¸ÁLcj´­?g¡ÑëF› ­Hüè)ÍUÌ¿´hH­—¹áó";t…X4ÚÖëpch݊֬Å‚ŠG!ª +»ßÊÐT:ԁ§A@&t¥hÝnI8òŽ~Í4gEÌä?q¢áUȚÃ2=°•‰Væšjp—Ÿ}£D# #Ä œ:?ð# Ñd-/™µÄ½ÙˆF—T ‚‘(MÛ4RéB4’hâ"ooš×nèù‡¡ùÖžºÐZ²Çn—=°2m| Ð&¯È V +â"UåÓ®†À±Uhþ`šlUý$*'¡qIÍ©"<Þe½â3¢¼ä¾ +øôöÇ‘¿nƬg`XªâõD“ê²öŸzF5zvW9; wÁS—}¶Zjl„D$)Z´v`ŽÂxfi0ê‹éΠwÈßídoÑ%î¬þüükÑlg´yÍþ¥£hgÜ6™ßݶrß.;ƒC!öŸiƒv…ag8ªˆØu¶*ëŒv6P(¶uª3{5°€‚ u6Âbþ&tï=?s²Nu°¥¹,P.-/`ŜU=åI€u;µÕ‘o7&9žd.ã,} 2pK0‹,Gq†³™èêzóO—fgÀĈM1ع0œ¹¯+-Ój{¬m=ú-8›Í šâ¦Ÿ|M\‘¾#¡È¹YH&ù-·áG‡›]ûb˜ý‘ú7$sª,a›¡•ÆB +˜ÀÄA›ÝD efsۚÕ´Á&j6MÙì`¢ %Ķ0—OXŒSØu”šå¸Ï‡•MäÙ9¶P3#L[Ô 40ӌªé2>sV¿¼ò•f8³•l)Øç³?’$‹z̈́M°i‡þÕéäk¥ƒ ›}u²NºÕe2ã¤3cn`éՌLrÍŒÆõLG¦-`p|G\sr2çWT*2܊̚äÈìp–Ëzl×—H;ìŠï—äÇs ^𥘡Ù.1{ç“#Àåò‘~Êý`›Ì9ؕe"¨›þ€ÀXÕá˜lVÐ>9–wØÖJN"ƒÙÇù"ë°€ŽýXÒ©e—Ù¦—Á#äeËM /»  !ÈA'9•ÙU—(RtÙ{­›Ë0zø¤Tän¡Hå€Ëh¿ Nñœ •ü^K($qÀ4 ÿÁF|7ü8 œDñ eÙòìþ^oŠ$+¤Ðb†Ì²î„±[œ ”Íѵõ>Ÿ«ôwG(…ˆE–]MÓŒeW ÿÄn2©4Öµ6QðḨ¹zß2ÕC ,—¡½ûtuêc…±o +¡ñV +¤6/’ÐޓÁ„™œí);x!kÉ'¯’QÆ héÀVØÀú9Q +oTY#àdÔIɬ¢Õ¸Ü@x®–ªÂd|òj€ý‚Ï™í²èÒ Œ~¡ýpn)‚ýˆÄɪŽÐ“½ë<&D\x²¡~–ŠòG¿+¥J($ÎWn2€ ¼¤n2Ù“¡:})מð=? ¿´aA„£ÉÄe ¼‡=ÚíٟþàGÏç/˜$“}>[­¦ñƒÌ@vÊî$N}¨ñ ÉLJ É.o€oLìڋää핇²$—$yIÚÙO^Gž&À§¥ a»Yd’AÛMƒ¡* ƒpW’ý[ôiïäfÅ €sÄP2Dæ]™5º›f.Ôiɤãc Ðïä@*’àލ©ƒðUd +¾Ð®O˜¦s1‘Ñ@5sÍ»›É j…y ‚¯ M"²™[ÂMÁ¾áÄXE÷‘õ .šŠ?ªŸÅ¡†,¯ÚÁÞ ƒ, ™Üêª4A!¼&+sr.6ט…‚þ©¢_³˜Øjã„ A+äÛfgbU »jNÍààˆBØÜàåp)†ÑZIÊVÀHj “éQŽ~L¢Ãö¿“{!±„0p©­¦¦ÄÙ9¿¥%–y73?Á¶¢ƒXÃÊà(ä[;¦ù +Þ| „粊ön î1 c,}¤Ú²@¬×"!>ëÅn#þš$K¶5U2,o‘š¥w ÐÌðÏ V2 +cӎ%v¬•DÉ&ø¶*Þªoa€ðÆT䌉™cPúª«RýÊ1¶6^A}Ut[ ÂÁ9&¡RÓƱâ#Õ¾jÄ1P P8ö4ÿ 8F6 3›n*Íðqށ¾Ùfp¿æH0™ȽÿA‹-BšÌl>˜'†ø©q°|Q#zòVî1½Ù{˛9dÇè¼Å&+rPuC°aŠ§ÉdXf…ó2¼k>ĈÄ\ͬµ…vå1×ìÛæì_Þç1¤„Åò„“„¼ž„Í–Cd.÷>8&)üP5Œ=/ÚÙ|NH—ˆv‡¿¼Ò³ùE±?o·œœ'жÌpRÚÛçSÈ]zìSM2‰7ÑÉÆ\X2*,†'V§ ƒ«É$œf™Ó±ÎJÙGǀÄc…;²'« Æcqá¿úô(Ûå0š¤ gwÕr˜“¸óü¶x —8•OÿT¿}s—y6r + ójË>Ñ´[Uˆ;_kKi{WêBšÀ‘{»+púBì„uê"ó@†€ìdîOÕìÑ5ÑHŒÅlK6ŸSùu5<Å ¸9+1÷H›îȨÓwÙºümöTÔ2´Çuً"ªžìE¹¬­¬ ¾le§@¯¢‹;`Þª;©Hf]™†ÇŠ_df&mìÎGëS™ìm!øL&Ið²U0®ær!ßGO~I¤'ÔÖÑazÀYwaähC ]xI!Åa‚peB×îéàôˆ‰PÅf®0C–ÏÑV×jy”)P¤(à ¸8©ö\ªÃ·þh@ˆKÿásIÃx9–Ùá6úÚŠŽî’ñ^2hՙ¬r„úÍLq#šÓb42… 0ò#kÆ8Ô,“ ‰Èuˆªúó@"«ë.$ g"§£§¢«}­ ôÉ҉àÀ£ÌÌQ¼ãžþ2’t6¸ëG2ƒØ°¥àr@Ó^Ÿñ¥F±æ»?Îñ“:`ÏȆ(˜‘ºYeäD½ÀójÄw&]ƒŒVon‡¬9«LÔÉ|kF#‘_FI/ê¼ñcø2hì+Ã÷öI ©ðkh6~g9ËÉé”Åڗ>Ú7©Ì‰"u䛳þ6èxè¯Ûãë×áK+èۘoxF° ü1ZxÅçØZJøþtÔÂÒe£G_õr„쟾vïXuéu‡†–ßú–Ñ°ä^©rN ]¾.Š(~ v¸X ⤴Ȧ £n˜Žé1Ftþ1@¨›¬¤e~½ œÊ¶”žNø{ÍvÂ#;eMå$±˜Ä‘Ka|ÄTñso4Nìæ¨àR´\*vR/¿ØÓ+~ùø+äÁŒrvÍô½Ó€æ…‚Ùæ2[ÊÀ€Tm5« ÷Åà’Vg¦ðµò+Z$S*\={ïÕ\2Ï\­ÍÆ@X¸ÁUáe…Ö·Ì[ˆzÄT–}àLãåÏK/©øX~ɵSfËÏ^RÄutâË[O{äbs5)¶­cK ‡„cçm‘±¯GbÂ[pè{‡|W4G¦dYF–8fYæÄ5ç@Ÿa$Z/ӈ)µî”iP:J=@hR¢c¦NÊçÓ~}È¿e¬D>6Wþn"ÀÔC{²Àl +,ÈD= Ӑùj̀¥†"F^®€ê|+a‡-tð < &ßE¨u + f:Ú'q'TI&EÚ…v"›eüË(}¡Ì¾G +@ ùõ¹ö¤ZÁE½‘ÿÞ®"—Ðހ3b‘Ê,›ž PeÆV™½€uj¨õŸÌþU÷ûÛ¼hø>û¯‘QgfƹȨf6iT ­£DL´keáW[ÃM®. õ99‘h|MhTµ{ŠhS›kuÓKIôÄÌÄßAåRw>q±¾&ÁÜv÷AÔ9ý)m쥝öž²àsËêOÏL}®Q‘Œ³ðsêŒSy¥ôY(a¹¨ˆ~Ëò‡ÞƒË ÇQ7vÏìx ýÔ®ã¬ð‹z M’3-öX ]¸Lø©2B|k@ùàX~Þ héý`_ƒQQ—9ǞU´l5ýPà\p +҅ʻnú*IÂÙànŠnb!%÷5ÞÑ Åzïo¦ð@•Ç²™„Ð¥—« | +õ’.ÞMˆl¦UµVLJLOË͹&JU¢þŒ!,E`ñ¢qh<Ðì‹Ìø„KC¾c/u¶Œ·˜÷¹sœl:o©ÿËÌ1>±<)R¢f',g^>í‘Ú§(Ãô Çj(ÃíÃ9“ ^©>D4áˆô‰Z@à%CR¹«C4xY7Ša[—Ña7>-)ýå 9aö/¬U+ÎƼèè>IҊ‰þCõö™ð9}s6BA3Ñ_“6ýÅ1!1m¦³ÿÏƊ æ³ÇîJCWŸUÿÊÚÍVþ(•&©‚c‹¦ ôY{ƒ¥ËEÍWK@¤§×ñúÅÖ©7ŸÁs&«nw©™¤í-@b#õƸzÍÎÖå’7¶Vò´Bڝ°J¹Åý™ó#ey˜„f2±?gÃALòHWð3TF¢ßñÑ O(ˆêCVD°ÿ£G?/°"±ì’Xˆð>ƒ’` 2Ս}¿ìšŒ„ü¬6þû™"ÙÃ|™È +Þ|\y Ï㌍P?3g×F÷Ö(ßñT™*ö꿧ʙ3ZZ¶ÁÏF©ò—>`1ÉK^ÓÐýiÝœØ˜ôîØ°e¦réÂ~Æ© MCÄ|ãa«NXdbg¸5˜^Ձ¬Ÿ‘Ð÷u4º¹4’¤92pe{_g4Â:Nãùo4Âd¦ÙЮñãû:2†nÇ~¼Ì¹‰9P 7.©¤ð^2níir¸½ö…”õ/H hڈuc‘>Êo+üì”4IAnt{$¹±‰¼ü˜èÅ g`-À±¯²™¾ncx‰í„Ïa éEL ­upûõ(ÂÛ+ºÛƾÙn,–ÜÆ8¸:öúŽhˆ·;ˆ£l£v³1"åøE‹T…¢ø5€'|9§, J~ +êDœœÅ껧¶æÕA=Äùª@7‹-(بM¾ePY§A +êºÉõ¸kÇ£—Gæ+gÒh6|«»Çó7_hí½òÀ›/CË ×_)©£6©slnæ¦$`xÉ+¡nFiÎÞʖÉä Ÿ¸Ôð×Y|:¶õcbŸ£%äýT~Až:(MÖp(ÀÑ*Žñù?Î1ƖäfóÙ1Ü=°dqûLžóCÊV¸‹Ì³Ïc6BQÞwc~bŠ·ª•(÷„{Máçþ'—FýÛ²¥Ý³Ú°L<4ÜöÉ bJ9r“+ÜÌþ·½N£~ô¿A²!/¦*~Wð˜âsŠ½­Üà ·ê@,¾§oz©cýÑ\2ã1—¸ÏkgÐ3™té9ÝY·ñ‰+̪éÕ°€OZ‘Yšô£’¶pl-M#!u'sê}Cî" ¼/,ӈ€Ä+5!oõ‹q’ +%òP"ŒBš×ÉDõ2vJ3 ,øïq3ù;Ïã­)IðiI3UO +?9FÝbQ#DýߚK–CC©L´p¹Aio¸Ô5ºkµö%•ÂoöšçÀIE7ÐÅ»`öüåÖxI^q¥•òn¡Ä6.ÊFIƒ¶Wi¤ÃÉ »$¤žÄžnIÍHԗ6"ÂyùS=x:¡3UÞ²rPtúcB™§mµõqsȱýp¬¯êèü¹Mz\5j§T<‘^Æp;3ÙâœxŠ® Ú/rÄæٖifÒÚFÍ +¦!™bYÏ: ½­ìžœ½Ö3´kÈîÛ' +Ó|îë5ìmÄ´Hö3ÑÚ!‚s„V$¡z¦ÓôÚ6Øf¢Íyá¤;(ßÚDžb^¢©üà:½|¿NcDuYxÍäàdçƒnÝÈó{|@@YÈc†zpôjKEgy%0M‰¦e ê}c<‹¬äÍÒ(3|7õ&Í6Æ2øöÆN­œËÿ[&¥ó¿åÀtPꍕVՍê­Ä¦Z(’8·—)!ŠáìÞxc|àâé\Ó&Ñݍ=ÔȾè…Ô%î–råIÔ´¬cׄxà7‚¾îj}€¡¦ŸÓ#`ó¨nY¾“)~tcH6e‰ÕX»¿Ùµtc¥KØveòœ­ãzX©!õö±ëÆh§k"Ĩp"{ (Tˆ"é˜óҾݡ(]7æ°,štöu7æšè$֊àËð îçªh¥¯[_íŸTHGŽ¨‡ÐZÞ:îó.ñ:˜Ïáù ¦ÁñgXdv¬Î–#ÞíÈlQø@!Õƒ ðì#úÍèng¯øô lªy?Þø¹îÜq¦\ý&/ßʛ«òN†Ñ ‹šýDا@§,XáÃxF˜ùœO•ïC”ZÃè_çÕ^Ì%¾É+è- Ò?” &êó0ÖWh +ämªâý‰™²±?tŽãÔJú|ñ|þŽÅ%wŸÒ”rz"B- +WêlFÔIl4iHÒ`"t,xì “ÙÌCˆúµ »ÛÔ[.~e õòzÜK«Î“c /#§ÊæÑÅ|"&>º÷ }"š¤ɳ¾êµs w3OV@€Ñ!ê0çî†(„Â4¬Kâ  ·ª(q)@<ýóŽh3w¨®]Í1‚&Ä‚Á?T´-ëh¶ô¹ý¿l9ásÂ&A$¦ÈOĸìTȼÎÜ¥/…SJ´±ŽåŠ*]!½r§ˆf“ŠÒAç Næ*Qz4D1ˆßkÎÀ@xÈ“# }l ‘F@<äES<ÜjMÍ> +…'~ì ùND€b* +…Ä­þâóç¯ d÷ü +(uøÿX_2^MTK¬ m›víWrøovÐÓs ?Šw¸jàß®÷KÔ_üŸ¸B1Ws˜±¥‘–§€V«#îX*dÐCP¸+½ðè>óù¼ŒG.’fkøpk¸ƒ:F?MC!HÈ£%xö)Ç0Gµ`SÙ(E횖¿5n2ðh÷PÑEp~j©ª³à ‡MB1ó‘õ^´°°wzM´/<Í\D†ðcqŸ<‚€AٖÁ ÁW€œÅ%w¦”ñ­- å²4N—l˨ëvýäñ©Oô8ÕG‘­…ü|×Ëz6ÒXñgÀ"ªZËÝ3#­qC¬ÒNçÀBoWËòy ƒ•Xf˜c˜€½EÒ4،ڊ4X [Éc‚éJ=|’`ÁÃÒ쎅¿|Âådà6ü7‚ ±õo·ËÄ°>3Û(˜S1@ÙјQyµÌú8Æ¡‘°üðÝTߚÛ}.ö Œš¶­††Î€LÉ)RæD’ á1OzÃئõ—‹zƒ“¬FÖ1W ð0ó|,å6pÀnìµ7þµÄl8ØÁŸßËܾ3¥ï JdÃXpq'gÎ#›²] ]$R,Ù2´´wU.ŽB$ud*ñ–9ÌRdé/ÇãH¡ÂœÒ™_˜—”¥Åwø’U°i·²-XXoÐӔ-dA+¦,Ông™©mÛWêB3^CñóLÈ$QçkâÔÚFVóìÇÇäý!Dä5ðôBdŠ£½¿ò샕A4Ç={ +"üMB\®ºmM[º2òˆØlÅ{6”PÅ~ÙûFU#’5uèKò » +†ÉŒÅѸ(y¼cl•E¿ó%“%aؾ›á1ßÔ¢=";'¼¯ŒŒ~Q¸È±ÚèÇ@ÙÞðÎ~£#Ôh‘Á†d ½ùw “l/¹Õ*xed[Æ-ÑRM  k I¤ùŒdŽ¥ß1Q!óå +Åë£*ÅméÙE(DG­E…“€p¥ûh^CC@¡‰2'oH¥ʙ}’ò%¯)Ò¬O LÓïé±eŠ_NÝVÓóØÀ. Mß¡þ¢ÙŸ=©N 9þU™Y½··G4£bS­½çÈb^ÊVsà⌽ÙVç}É# 7îÂï’ÂèT¤¡;™C³ ¥»cký<žó5šaÛ±€£XÒPÍðSHôÒBlŽ¹Ñˉ)SŽt°ÒR‰m¢5DuÂRQ03}g‡ŒOŒG¹ŽQ¬ÙíPØø$3ý¹&úIRäöÁ*p+~ÊøòrL¦ ¡· ITó#;3ç°k„(7ü4axM¤2mËEÚ*%˜²_gVŽ¹OmÉ­“Ʀ¶ è¸vìo[Lònì·Õí:ù4ËIÜ{‰u0¶º&°Î³x•íÞì ƒÂ‘3?¼î­«;×ÇÔÈé-ìÖ…Ò–0ýí¾¢…Ç&%¥I• +–ؐ¶™"¤°&˜,ß¿ÕØéж$¬@¨4ÒÁ‰Õólf\¥ê¸®ûÿ$KƒJ~›Gª±IŠ×G@e~–ñ>èU@ÃF¦®9¨öJ`2|ò‚AõÕÍp h&O l$eõ Ùc<%hGðÑЇ€’ýލ0_©H=SMãeÿ”+f>R'•ý¦\t‹ƒMÍkM@½• +ìøáôŒá‚¨ý˜ØP=Óÿ)?Ïz²]c>’]¡!ýèÿQÃÓû†gyS=C>€ÁòLùpõT ñ<²T’u;Øqƒ4F=4$_˺ȷ¨¯™ÈSΰyǧœb•vv"‘9Ùªæ¥Ð?²M]£,K¥[Tæ,SÈÎÑ>J2¸\èérº­|ú#å‘XWAds‘ëSÌ鸍“èþ VœÞ«“3ò }CáI¤¿\â¬EÂR² €g˜Ç£mƒx2ñ¨•0V1¸û¢Ì¦¶®ÎÐ\&N9¹ÌÅq•¬Ô‘TŽ©Ë´ +ÜTôO)k>¤\º‰™Oâæý|’‡Œ‚ª)ñG'ž?³ß…™‰ˆvU°ŠÞuâhgI܉k²­Ñ +$‹˜nfˆ‚<¼9qDêoµbŽ îäÏ©ŸÓØgÄú•“þ¹q•úúKüٚ]¼µ—‘“¶Ïîȏ±à+¦.ô€ÅÐÑ9L!gT÷ÎPH§/yèn-ÐÓ(.$Bs¼Âb€ÓŽÈa1 Ş<-´Dš2 6ˆ¿Ä^WF ͚2_‰ò®‡ýޓŠÊ¡ä“ê*µªðj=x!MíOlly +ü¬Þ©@‚<Ïÿ‘⯘ÐÂAGé,Õ=>i0fiî}oO¥šÜJSˆag)Å©QÇ양©AܞÇôS)p‰™ÐÌf âd¥' ²}-}¿y\x K…Pëüu© ÿ.†FjÕPkF&ÌäÊà˜—SEùMs»¤õðýdW åö Ù)±@fÞ¬c3PeÏ_ÝÕœJíF®¾¾t— ?¡P*°¦ÃÁTVN&ÊÏ*䦷± +Èn½ÍúgtcTõi°Qb„Y) ³ýG™w÷Ž ðÈÿZ‰kI½1†lÁ€³HiÅÿ?õq_ê†Üxc†Ô +«ŸD|ÎnØMˆ7U¦ù Rt²R <ã±!^%p€™4hÒS$15ó¿ïÅø÷Z†…áé2-€f†wL¸ÛLh^RÜc'ÕÍl)Cý9 +¬ÐQÏFèq&CÌZe¹­–ÝX¥¾ÜÀÀÍò3érVûì­Ì¢–‘¸“”f‹3¸¶[ê…ø‡TÁ7â [L%ž%…&Õa ò[÷«‚\¬¬—Â…6šîÏ+ÑÕNÆëåÀi{ˆ°¥Æ«€²xˆD–.£½ëF}Ö"³×Bððp Âqwir]ª-†)“ p=šˆ’˜ê¾Ã€ªŸ¤iՄª|ýuâ4ìÑø!P2TèÖÒI¥d…œI Ί¿VA#nÂÙT§â÷óØç3¼ÂÚ* â fŸ<씤¸w– 8‰Øenpü(tÆ¥—GxM”òMžj?ä€È“âö éSŒ%>“î; ê&NohV"Ïð‚:ÅÀ…ÏâV`¦cb¹³N™Ÿ€—c'ÌekŒŸ\šªÇ$Bfžb§™t9Ëkï5@d¯k<E©’†Ècp·‹Áω? +8æó>Oœ±À*¡0a/6˜3\Ÿu̺èP&ÉՔÖÿ«·,o̒UëÅ 5Fï ?7SNŒ&‡ùœÐB§Xz‰– ¥[|*”•TN>ž<©‘£™Ú2óåfO4¢Á°`|jnœ94/Ô蠒*‚¸ƒ C`%ªQ„¹£à)­08-¬«¸+K4´ iÈihTv1 ­¬>|ìÊì†öt‚ +«:`¾Ðﲖqh)ùæÐl‡ÈÎÌ0F?+…u×?qde´%:Xõ*†­¬¨ÆZ‚; Ó6(Õ]rfvБ[üÙšûÒ\pÂ7»šÙ²Q¹Täáüe‰¡:Y¢Ý«1D11\¨ ± í¯H¦¦á€®Ìˆ&ÁÊEê8Ñî%:¢5|ŸG̐hGœõƒW©›IIÿÔ#ÕEº~9Dƒ˜AÞA{DðwÐQœWÁƒ>©m¢Õ*CÖǃº7ƒ®”‹®ªø¯/[(`GØ^j"§Þ½'áMëý̓xtÔ,[M:%.„lý˜ž%¥M¯ÄñcÆö´t +3'¨=™j…6E1›êÏ +xó΃b¢,L¾‰•ÏK´ÖwòæìX/&¨‰ æNıÅ*d4’Å¢>Ã6 +”¥Á´kIæ? Ђ“ÃÃþšå&ÙÅ=¨FõV•w/m6Ù?1îAß±*RD¯ø@—a4è©Ô’Ãeúi´Ãåv5÷KJ#é~ÅO}Ð$BdžcÚU¨F2²ˆõAoK¤¯P-áF±곐ÕAKe2߸™ATb(OŽŒLvíû šþ2l †Vd„kòçdŸe9™ò~œºšdÕyBQ›¨¬èhó%:æ‘%œÊ³¥ªBÀïyãk$ÉjÝh1@’âa”"Ñw°úOèBÄ4õGº^Ýdzù3JÎÌO»£g©¨Zl¤,í£RҌ „ e¡Dt=¥Nv) T¶È¤>}Ö!൅æÆ5Æï_ÂuFãê&„üÊ2¡2]¾kSšH7 +;ÌK”òÐñè5#\H;îè«†´‹I XMùP‚ë;-$E>}h”>0Y&Õ$œ×ØL,fPX$›ziÃh®š‚#TÎÊ"j2ÀTIŠ+ԒÐã6 ì¯c0 ê7U-b( Ù}i +^ üÀ¬Ð%ȍ Éù>VV¸”…ûÃÃx.ê!iÁ´ÌR®–!„HÇ]ô–o² …@‹gÿ: ¸^C¾7ào@Bݚùà± ©Ò|¬¤Õ3Br8$ٔ¤Ãš‚ê†ÕˆiŒÏXÔ1za”m^Ù‡dõ?°…, XXJrRÐubôf6@¾9\NIþ¯³È³¬3(~óÄy°ºkl/ª˜lÉÆg9œ=ðkÑØ$hîc|≳[°†Px«ÈHŠ·¨’¸f¹(¶X((Ì|¢ÛŸaÊK¾`;Raüy"—`ÂÁÏä`Ã,à\ð>vØ:"¿˜×š:æîÙ#PÐûÔñ?'ÂsÛº¸}öä N<׆¡ÀÊb­…todÏ5Ï»bŒˆÀm㝔£¥È2 +šsò ‰idÚ7CÏvñÂVÚFÚÒj¨3BcDäÓdMœ\~LÎà~XA¢C} Ð!;Y%á ²H¨ü­R ß«˜3ªãdˆèÃâu뤑žoÌ'–x Ê­ƒÝÓӚÙAÌ6¶]ˆ;yvŽa]:æØ MåØݔPÞ·ùfžH8¸$Û*q¬5ZÖ%NdCØ…¯6ÇqµŠ°Žm?bl¸a8YB¹¼>쓺1æèiÅÚ$”p³ØÚÆ \Ò4mlü®|9U6FpiÏ{`cT•»kïÒÐ@Ää#cög±Fãí,,›MWÁ$ÐÖ| vPÿã;}:ú/fE¬DåpÆØ°=O¢ã6·G/æbƘÕÝà$W{ƒ|!Ç$}ˆQ4Әa ›ŒgòûÐÊÆnG”’z±Úˆñ^,Þ ©Þîv1†Û…ÌÌJº~°¦._‚‹ý¥ÚÇQè³®–YôòöŒž9ú±by§e°Øð8¡¹Ò+æn@»HÁ?ý#p¥›‹@U‰ãÖ«ŸBH)%˜ O¨E(»Ü¼àPOÐØúÀ8畘•]ùï çPìš¾«RcsÃ}bßã +eºTo-ÿ‚— )³Ô>—‰åkUHޅ£åØóÞ*ÐÎ/£ê¸Ä´*&i£¯‡E{GsÅÒ^XõI 5•$1¨i8æÞívçä4^2z]º‰{~i¯È؛ŘÒ(T—{#œÙQJOŒýXßbȵ¢8?¿‚##VíO,ä1[Õ;V­5wÖyá),‹ 1Æ.=àW 7"ÄþG«mCڟ܎¹L—[/ãuu·Sº~þÙ1Ev Ï* +Œf{þ°2Se]ê‹Në<ÙBGÇýJ2¨œØaåsò¡G‘pJu„dè0îçк-…%lÍaå‰Ø?Ó¿w¨¦Äì”ä0üQ 8 †Å§õŠ„Ç؀ˆÜ°cVNA'6l;Á“Õ"b Lրh† ˆ+ ƒGá[Y}ÿª}öJäÜòòóÒö1'™Õ[”ÏÑ1œº°Œ»I¸¤BçãNôbÏãìDÐf‘1éòaalÊ+YJyh•*p/VŒGr™¼ z;g\RE¦¬°Éîúè¼,ñ?ö֍Ä䄩>y_ÊiÂ,ʘ0BíÐö}*tɍ–ÇDÍ)aËë3µ·¯ST,d‹Š°tU¡œ$fTm0n€caqú¢ƒo±%ÿ£‘@k0æ­§;ÇÓJ… ꄂ0Ô4ÃÆù +ƒ4c삡 àçք Î!Y<6s¦Æ';—º̳fƒÆd’Ð0Šp¸ÀQB +*¿ +”<›ÆjFg^Zƒud 3Ÿ³.¦ ¾ ­ gŸä‚¡_ÉÂjÁ<á›Vphdê‰ ÔÊÀ¨MØÀW”)Î^/OL¤EÎoµf¸0‰""X'`¥±Ð°…'Ùm¸LB‰,•m£?éåã…%¨¢ý—å¼ñ£˜ø—9oJ›ë·e´¿í7°Â-wÒ"%ÒÂÔÀ&‰@tNª $!YïFFõuÓ.0¾Êp×w2˜±…v7}ÊÖRI5ö™ +%Öní‡ Í™ÀÚk'I¼(›G[:ô·i‹ÊBø©4˜j·ÝÉÇîe!&=`¨îF9·£ÎBùê@³:¬°‰¤"8À²?×)WÏnäñxe€]4NÇcá¬Û©_F™LÕ Á°ñø `tP¾’äN«£K6Áÿú€£®I!t)èÜÄ ú/`û¿Á…áþ);ý‹4hÖ¢—è_DHca?ÀòÂ+@€z!k¤ OÇþÂò¹ˆ/PïU©k ÅdM]188b3ôðÃÎúyh˜b~öënwaýR—pš+õËù’Ð×µv¢éœïŸÌþ¨ô«.pjðÚ¾Ê/…+™ …À™ï²I˜‰üz/½Ç.¤žUpm'=ý)ñ lñQVŠßõzC ))üZL4ð‹tˆ ÆH@ßvàéäYà}U£Â‚龜òČªWcé,Ð4n„«¼ª¾h#è…úzh3±¦{>–x¬,®c¯#ÍM;­H_°I›Ýìeصþn̋FÇÓ°d†¢2¹’j§à|QÓ¬‚Šõ*öm>IóÅÒ{® % xaþøT˜/ªÂ™[¾°£Ë?Jo’p/@‡Bòµ7غˆì…êėú>åÄ5§.ϳþ*zé?]ãT«AªÉèðÈëË^> JXÉ ÝLˆ½>Ì¿A;¾ÊõU^a˜‚ü^ˆvµÛEFù^MLœïËiWL9Ñj½×ÕçÕZO¼×`÷úkSk…¤(@UF>ºZ÷ªNYŸp s#ÓøÌnn/¿Q8kÁl¯*r¦@M텯™ˆí5ԃ›½F\N>¬ +±—ô|¡u­ËI•"ÚR"ˆe±øé(åÔTfiÜÖB, °»å59¹2¾&wnû'äã‰ÄôB‚Ue¡nù ^ì*„àmöÊʘžÿ®YÀ—o$Œ‹¹B/û8^á6ú¼@CÃ*—mda‹SS¾ïbى´ž—. UšÊK½ÈqLàÚCyÈwQÊð‹5ñGš¼*ùvP$‹~"™×ë®ì՚­–¸¶¿M5ÔõoPp aWœ–Rò ŒûëØéµx9ýZÃŋ³½@ºÁI€4&Xaìÿ|†MSdß½–*±áE®åã:6a-þ„¡o'ÀE2j?6ZfðJAü¨»±’x¾—^ø÷»X6b¹ÛÞEA‡› v!+ïú ÌJŸRçV¯M›FbxŸ(½*Â?fsvl«'ÛrDó^q',Èbœ€ÄŠÚc\ò‡ÑEbÿ+Kî:މ»@ð!û¸e#‰¡÷8I¦Ò®}à­<ÅsP €vý'ÜlûÉ °0svqï…ÔóZ02»*Fа²k~kÜvAvi¸¨þhŽþ…nâu\#»jœ³b×Ó¥ï‰³°‹c(¦¼Çô¿U°Ë_NEµ¡ÅǕç*'1îåMÖTé·°®zßU´[8ÖÕu´¹<0+± )Ǭ®úÝNïUn÷ÀX-D@uº$ׇ­ SWڊ‹ˆH]Õ$C“œaÉðÕI鄢.þ©Åð³4¨++¼ ,Oéé‚Rۜ.©£åÐÞ¨¦«œ Ó%¦2´8ý=ãT8ßd‰WP¹Í³=¢ë`?¤ªúïɧ¿ ×ÁŽéÕp1A«£^Zø ÙûFÒ}ðÑJ­ÃÐs½ÒN](<¥»LÍ%Ä<ãªÑT5ŸÉª&tع@µT։ž<Ë» Ek5I©Æ|ØúžéMc²By1×¼PÁ\—ªý$ÝËE•ÏåÊR,¢åzŠ\Ëå0ÊmŽNœÚ¾™i²Ð“ £Å5ø5ž€ýeq(Ù0 0ýáü;aÈ Á»·3S36V3DDCC#D¢¡"""""¢+b‰J%jU©)VU«ªªªŠ¬ÄH{YY(¹UÍꌪ­ +ØÚÑvú¶m¹Ìd@ÃfډÛ]%UÅÓ%ÅóÛ .HÝõq³:…q›…);«…9+³†1iZ˜`ÒÐ0´îB˜k¸Õ¼„ ã0C²`a&@‚0¾-B’$¢9µœ \fzaHd͈PDD8">*rbb&Cç;E+^±: +ýå?aÿ$P“¨¡ÿYªÀ¸ªZ.œS³»P(r8½öL3!3NÇF &Œ¨ ) Ôkª«Ö(k¯¥G‚% :U™ªªª"UÙUU­ªW•ý˜XËêlØ(X°›™™µ4¨mkU·eÇí­Ò +™™ jqK¶m›Ýn`£¼×¶'jÑ;õ¿Æv˜·íŒ©ÞDÄFhF*))¹ C†¤d0H’b5<ŠÒؙ¡™ ÷¸GœÿCLn~L¤Põ¼S@*¢2ª>ò­"Œ„ØÀ•—èB:3CÆ'2B »°KP™ÙŠDðޖ·õMm¶õdÌão°Äú4©3¢é¥n¬1U1ìa­(™ºúü·-”ü¦}óÄ94Y°¼‡oGù+1^þ!˜SLmëHc0qܘIÎÃóÞ6K¬‹©ÃcLôYÑGs&:É·+±K+¸),1Æ݅wS +1§Ê/‘±¸,¦Ä”ØZÜB8»ŠMUÚÁ#=çò;²cTЩõ#ñFÐÅp뾜^ Í¡“%›]gos±ÄtuÖÛÕ °LB49¦ù-‡"G))B½=A¬h/ +>Kì>¤%F^Ô ü‚ 2iá¾qœ9( ›põ›˜›ÍPWøW±ÁܧcÀÄ©%ÜÝ-vƒuÄhîbÔÚ…áXð1Ðѧڷ%ñm’ßIµv¡-ÆÀ p †°! ÌJ$£‚+{I‹&à4ly[ˆše莪6~ÄÄH#=\â¨ê¥D!˜"‘®-©5¢NÙïáNK"M¥¤†/iÌ;¾(8^Y¥$Sa–RéFJ¼’R×rÆ­§_ žaß±í \¦Îü½˜C€÷ó:¨Ô`t‘gʕAN{¢’BÖP`%³ðNg7¬ú1~XÓãÈ&™ HäG2`±Ÿ'#\‘÷™ 8a¾Š•æMgà(ø4˜pvɎTvÍó×È7é: +Ú Yô‹v1˘èˆ£êÖ旕ÁÁÈøÂ,§ù,ᛀ h%ݟ9H£¤Ázy:+D„Ö#)~Üzn4eI·±5zÚ3"f·þzkÎY=8)QÐkw;Û#àä6Åq*]:é¬Á05Xˆ]Qà‡Ù­p˜ð‘WJùԝŽT¸o’¢+Þ&0ŸÁ!¦M͚¡ 1’ÇOKøzõú6ðS1p„µk3sué4ÐyÝM{!FÙQsÑŠù3[ +z­ÑV#€Ì~f˽¨̴ҒêÅ[Œ+ ã<ö(çœ+Ž6K]ÕPF1XNÌ~´£PK$ « •à=*6L´5>¤Ê†G~ßV?’AoÄY {R^ÿ–àÄ 0轀ÂFgãb­›S#ªCŒúa©#*«;rèÙù›ý£™Ÿàyˆ}>NzÊó¸}‚Y*¥Ë¡Àe sސF2nÛiÑ ÿ‰ €ážz†ô¾Ý¿?ÁtJ±OPX!z¹k ¢ÆÛйtÕ;!}»¬ýF?þçj +õîy~£íNä?¦]¡á¾“L’=ž–.¹ßҀÂî3b<—¬ÆÉÐåû„~Ë|±Uíðö×áy6Áà°r×Ã5O|SŠ„Ÿ÷¸j°`^pû8qâ{¿uØœäŠpĉ _®Ýw›6˜v½ 4ÈíåYZvz¹Õ`TJ¬–yP늡VpšÒÂ÷ʦ¡vZ,GU}ÛËÜjÅszŒ&àúüw-w Üðô¸$¬à,Û]U|Ùþ‹¢´¦¢¯®rOÊXÇ"Çc±8‡öo ÚúàA±rº{ÉRyìŠ?ܓÕ耓I3ä„s÷d3ßÂÛ–ÆGbO™¬>Äo´ä«©¡ÄÃlFNjچ_¬XA¤ñ¼=6°CÜÂÂÏNq650tXxœÿ:UEd!„µ`Åa—v­ž4UÜ ß„•½ã¤e³`tîgk¬çÊÌg¾ÌIá}ºÜ}F…š5Śi6ÃIxmv¥ +›ÿó°fìÈè«ÍÄC73JoÖîÆBÃàGU8†„^/ã¯|›ÿfQ›ñ÷.FTžbÚ6SB‰å2{,§Äé3kTû¢`1Mlˆg%Þö_±þL‡2ÎBÚÍâć› JÞ6g WÖf ¨¨o3E'] Ÿ6kõ.<ÜìáˀZ­,-V›YìŒðä¶ìFŠ4$ôKšS¼¢d1ëݖË6‹qhš¨²YSÝ%ÒЁøV§Ö îOSÝtÇKv»ëëÒöÇɹÆ9‹pSuù¸‘†ªoÞBxý®à9љ1€,¼@ƒBŠ÷Žä²RiôÍ<ú¦´5ž%È4­°@³'{=jŽ +ˆ‰üäæ Ã®¿0Qi@6pâyՁ©•úCZîzÎñg1D¾´ÉÑÑ';ù?p#@Z‘K@ì|mLlŽÉ?_í9Éœ"P«=:‡>BPÔYäh$¹FބGS™.:GcŒÓà¶Õ­„î5˜ë63¦Qɐ Á@”‰hËcZ ˆ v¨#oL:1!†/ÖA•“FP´uPCnSĬñ£hÃEÕ6²"/QÒÛàÙa2¬_.2\L'(f +’ -Ïô$Ó»GÌ,“H +ZLHvxDÅo[R,ÄÙBɘ¿…V1Ú¡ó'…ÁÃgOkѽ¨ŒV7KÎÿX´/¢ŒÞ*dî ÔÇ@V¨FN’•(á(ÔWN5û +g#fõ€Þ{ù\б*u—%¡ý Akeì СåÇÁ_Ælž.^T¢7çà̄ÒÜùh¥®89 „省¤ÐË b\30wñóåè0ókv‘©Rýcá@è¨Ñ1•…üçìºǑƒ mSÍ¢ƒ;²ʽ컩ìæRÁÄ÷<ÍùšÒ¬R„Bu6 áœB…š„^f€<‹#\õZÌu=v‡Å#'˜L‚¡sNò‘¬õ´G\5]§X4Òp«aùºÖØ2èx^á +""‰¹ø’Á„L"…% &y_€$zÚ=c¦©@I3œ®0”¿†F* ­Øßr~ÎÁ¼Wú¶Büºß7"'QT”Ÿ¬ZÂeèI+pдyÓéïH©Ø +ä ͞·#% %û|¢d«CvQń¾ƒ³'• +0hC–ê°#Ž(z’–J¯¤ˆ_̈Nô©¹Ï‰…Pè•RZq(É®ô¨ +uÌ ›[Ó3àh6X'R³÷~ÂÅÕ¤¸íDŸÅî'lÐâw´–ß>ÞÀ˜J½›Ü©“=š,,¤ü¸æd.ñ}ËßQ¨ò_èƒ'ÍÊÐð©H‚ÑørjDZ¯*ºD#‡Û~<-݅ñFxèß[Z®p›'üŽG‘ÇÁ²I÷F̲ƒ¿!ù)úzÂc%ÿgUä/æÐx3Ö§!ýôÆ<¨ç ÚòZÊë1Ï9…Å9°‰hÖžSQ°5²Œ8!/=›1dZÐ@8Š,!ÐqTîl©]&$½V!±ÁF&é«RÜì»R”A†™»ÇÅO™ó”Mâã:K·!]C¨a=Ólž©çwŽæ6~~ÂêÀ7¡IßZ,ÀXx+£ìøy5ˆë¾ô¹ÄÄ;¿íövU–”éïŽ8™ž^ßê¨ÜMé±8só­qáñm(IoqW©¼^)hŽ“\²ã–£“ÈDpBWH!zGÕÏ;»òùµ×Ôߓ›Cד”Ë9I’.>½¢xàöËó +¦N^UëєNÊ*Z#µÿ«ã—C¨ÈC5’E)TSo™÷Å­ôÙ§6ïÀMÕZúß#n±†bÝ%û€µ*ڃÉÕõXñ! þ«¸~#Yô3om8÷>j‡ØŽþrG¡á"™ z}ãñÍH>{òN~fÈ9Å"¥ +ŽìHÝ3ÜPŸ‚ËCî%—qhV]Ù]C*Â:¨|Ë¥/o\®=©O¡çÏpz“d³¢f…îpõù½Õ´ïÜyŠ€t +e9"žÔ–= Ù²E† ˏÔT4äSÑ«|I¶ù§Q̺ϯ¤yÑí©ïÞ5çlD˜.f$é<"G³²(ð¿TȕšW[’wö£YÖùÅo¬” +³Àz3á½tÆÅEiÛ¥þâ“Ø[á~„§—Å9!ôÃì,š*b¤ísŒ}:è&ÎzÊö¬O ÷wÁÔ÷T“ÁÃ(Ý¿6jÐÇOš+."d¾"ôk®@û¸ kÁގ2ªKß Ê‚SƒŸÎïÄ´m|{HüA’†ßO–6H¥ ùˆ½´e1ò$6Vqa B%Š°éf>,Òß NwD3᠌:¬âD€„-¬¬>Ú1xÈp«muq +ÒNÖ:¯Øä•®…Ê/-†^w‚͐&kD.—bÃê[â¹Ó5:¬R+ç¬*`8›µSÇ5Ç&5Œº•Ìw^@%ÕÞêBÔ~Ð$yíVš,¤Æ¿ŽãkªQ:EZF&4—¥WþÕÃþ]@êJ§r܋nìT+¿ W4Hrù¿K¹z +.Ú2¾W˜ÐãW\æÇjAí¤+TÚÝ=Ëôz\ÏI4/½&Z¿ŒÝ~ÜFdÆXãS‰¢¹_À·Ç;Ô[«íû°nÌx®F˜‰Áó1Öâo– *° ^µ}„x©P%Œ*Âû‡cBo€Ê4}ànV n¯‚^LŒCœ>-úžY"ç«ÙŽÚYȹ×b›l%†ð®É)&tªôÆ¦ ¤kÎM¾™_7íz(ƒNŒ‡LÄð b‹«'™Ë9úåjN3ú(~x ‘1€þ%¿“.{ñÌ3 +ô0†µUugD†?Òüþ’`R‚68Xü,»3ÞQU¥ß¹è­:É|r›˜ñ§ÇL±æ%wŽØ²²ö®úTi -a„¹•ñÄ^DÐ2ãœU%Öt€œ“j.$E2͏ҝ.¦ôqŒ˜ò—’.ÖÜ /Qšoª‘z^ ¯ßª(uz>¡ g›Åçç°Þ¬íƒ”åÁ®‹‚*¥§ÕÅû|xùrv +庇‚@†½¨þ‰µöL0ÿ€hðê$­5¹õl.aœøPZØöª$úä™:sÜÌòTkR4µ:uàÃaoo©›æÛáՊYÌ7Ý`b¼A:n›°Žb×.ŽÞM*ùÓzñU¤µ ¦ ý­ÊèÂ/+Ódõfeã¡ nk«Ý(S°ü©5à³D¥ÍÒ}Þ«¬GdE%x¼†€¶á’…•VÐÉE™ý.¢2†ŠD§®Š\ŒŽßÌ7—vŒ˜Ù’žÈ‚/¢áۯىÈE€?µ:?*5”Rˆ&~´÷§ +àèaMüÒKµ‚HaYpâ½ÿ?|êïð©XµO}ù v$‰·’ËJ… ìW¸¤ùЌm×­c›[$Iœàl©ó„š–Äð£è•†˜¦`§³»]‡ÅYmÀsjŒ“ÕËÌuȉ¾+i¿IÂû¶qƛ…P_ôÜr^YhQ¹?FÂHô~f²±v°Vñ £þ¯$¼µEN¯£\Ï8G^´QåˆÞ²í÷®Æ·Û;Å'U,Ϟï`¶VŠœOË&*K°©“ó¼ÝûÐ^ÉNƒ+Ë"î/.ÅJ˜ŸÍÄçë–˜Rg!<þÙ;Ÿõ‚‘À·B!pý ‡…—3ʀo.æ–\ÅWÊi°Ç’ƒ¥½W§¥œý¾V@,åQ¢Mˆ™= +&jV<¡Ç$_z!îB¿#£?®µÌ”z±Z³–"®šH3쎕šÇñpcÉ½RJÔ§}ß[,}Ê÷´lՀýgíž_šÛ8ŒB0ÞCµ…`«æ 9daÂì% /dæÙ&ÉäÓç>þ„/X‚Ô©ÇN¾ü4XšPu?wÀÿ°.òÔáp/ÊQÚoÝ*îlߌÏe>³Õ‘ ’8Ÿ‰djB1êvçÀ‡ye‹¦ðÞ7®Pîl[ý̈́Ð~†E>àZ±ò±êæù…ãII?f{Žç$¯p‰€³môÌÃã2‚æç#‘žiýùOèƒjKóJ¨4‡›z¸lù@LÕ7—C%&µÀ{c:Ã#f +Ugü¬ÁÏTæ!‚%Œ¸KV=œ›ˆ™­²ÚÈÓLERc¢ú¦ç° x–iòkÈ]ò äAè Å1€sI%#©D ÌÊàÜÇ ÿzã«%&3«@ÿL2‚†Î‚Ê7ÅëNàmµ½ÖÀire¢Á­ˆ}÷‰vd"±”P­t­vƒ©Á¥@ IÍõî³ö ZPèt¡"Xq6Àî ö/F |^Ì&ç¯ØÖŒ°¬Ô ‡4TռЄþL2£n!”±yaUZMõ…;j7DLƒµkjÑd(P±fK9gíöJ;[LR¢°ÀÉðKô̳ ÞS M‘ÂŒæÔðôgçÌÑqj†©i´•3èfY?nJÖ+H ÂÔÌP3rÂ^ '/ú†ŸD‰Ú¹LÍò3m”r„¤gŒVóV _ªÿD1ئ§6Öguñ´›o[™cªlýÙªÑ% +¸ `ˆ·?cŽWŸÑŒ6Ëèù™4ÓÀžqùpy ó¹å}2ù#“Þ|îI“‰!Ìî…BKå·|>¨:mvU¤ £ä»ž ùBõJ#H(‰d·ÚÕF™[ð7%Rã.è/s“î. –ã›úðßTò Š*ø8&ZÑ6ûig›Q.Sê“r¿ÿ¿F8qRü œo#¥ˆúY¬ÆóµåÍ£ï7ÜRÓí ¢¨v0Ž´*P¦Ýfû_Ž;›ç®c}×ŵKÉcþ¬ÿRÔ÷ÆÑÂo·˜2…å©5âïÉpœôéI°¡ä)VþcýMnFßAèª =ÝèƒHLAÞüc)Y/žÅVéä¯»(÷õݞd ʑGÑYu{3vöm ïX¨é}¾ûwjZUk#‘FÎ}(tG“vŒígQì1K fì»|ÝÇGY¿I’zžßá:½QÙ|Bý®ß/ˆ\9ߜ¾ÇüMÉ0í}N<`#­¦Õ Ÿ»èÌ)JÚ÷('ÌÚg§•Ð»É}…ðÍfô˜³žN=µdïDùFëªî5ËävqYvÙáóú{‘˜”{1Û(5"J,Y¯ÿ@ù˙Ô=) +Ë¢øUåaÁÛD`܃VùŽÆ÷‘CukÀ)Yù®rñ³B¨ª«·q•ïʝq¬Ü–»'Ÿ3r]fg.Qî·¸p4Ì}¡¨ï ó +¬|K…^ÞCyÊz˜¯ZÉi/(¨X™`s}g¾Ë»†ÅÔa¨,Š²}eÖǹää|xéù¶§}ç^Í7D£/ I­ºÝ±n3óåH¾ùV@wõŒax»m”éÿ]í£b-BŽûgfl2“5ÃdÆzÎW½·ï°=Ÿ(s7˜Ðú1'HßöKŽž#²fìš ,­a–“šõA£"'õÌ";uvVJöjC*¹á³lÿø°1³Õfҁ?ÉT}ÐI¶\9g.È0ôV›¾cFÛwýæä >.š.j‰XOM_I‚¤€N_ ý ) ž½6›¬€Fó•% ^PÓÃ8äŸÛ±Æ'=«ïµb}UäõÅ~w‘û²ï~•®ÎÙÇ1€[8Jó½0ËXý#þ#]éºG]åÛRÕ4’ƒÏ6ì/$Ȩ‚Ú¦nåÆ}ƒKÒë„HÆU)½%Äáv*>c,mÒ-¤‡·Ud;Í£ÑHzɄ·VZa‚85á:øî¤8ý~@w0ƒUÝ° _“Ù`ð›8td^©ÇIðaâ,AIffº%²æœWºŸ²ØwqnÌ™ ip+ÏD#lĈ´M…¡gIé®U¥•þTP/ÓÒ<ýRÃkd?½/èê:š}±K}ŒpɇNÈÛ¥jWpK ÄdM·9y¾ÝnlSÄDô綔î3©*V^ÍÐÝP‹p¬¼cI‘Óêˆ2œk|¢„ÎÆÂåB,à–c8'ÿià}]¥. 󏈧갱Ø[Ûø±8þF”Å +÷Ͳ§z QÍP.d¡ŸÏVAN~ÑYŽbÀ,5gA+€z˜QÅÌB98ˆCácÍK»•DÂ~87LŒ’ñÝl˜Â²?p²¾UsY,n^ƒw¥L(AGdA¡lujÞËÈ¢‘V$6F +ÌÉs|Ý™†Mî×ÏF$tF'>R«†Jt‰é0e—ÏTÛp’},d™2Ë(Ȉà +TpÜ;‘¾Éú±ÃW–hhKêÁÏp£€Úz0‹ r4ûRòÍ°‘ÑTq«8iHM¼MTv~i'XÃ"yßﶸÖ·l ŒµrÐvU؛e¥'>ñ¡§n‘ü¬DÕ À(€3õ¤ØÆE–üýIËÈ­³V±`ÊþJ뜁¡"âdɃlÁå5 ä{~z æ(FúŒ›¶ÑÎ ¬ DnÚÖ±æ4,¼zRfƒ²@+ÅO£KFÏɸ)Têö@¥‚0ÿëTé¡J ¦(Tó^ƒÇüÛ´•Í8Iæâ’q¦šJñ1 <øà„æÃB&±]¸X[¬F3àSqÒ~¼Æ1¸–qCÀ³gV£•¨ï-”¡ùB‰8ÃçFÄ0 +ÿ²¥õí$nR4Õaw!nĪ{?Õ^úîGR{uhnIÓw8½ÉªÍѦÃÐRú‰CÊ|ÝaƒÊp€£aˆ­bå³u¡mëÖUJW!îNKndv 6Eø¯.ªÞì¾t /P¹¢¨sÙBÌ~^GxñšœI¹ ˆKîeódåª?8Mw²ÿð ‡#؂±¬ägÓÔ`,ÔDCÀª*rb1ԓ‚Óc!V ì¢#«Ú׺Ÿ-ü¯'¸Sp± ù´wÉbu·Úw¸ŠcïäÉU&ëZ˜º*,‘ÝU¬ÀÁ‘·È\i$ÉÛ5"× <ó„ÑékÀ«ö]C=S)Ê=*#~©³p,ϳŠj*Ôá§U¢¬Õü€°u ûŸžðÒ@ދ^Déªhk k|"ùªUt Zõ½âð35…˜ª(ú4.eO7†W쇆‚7*ÁVHß> ”yÙ¯Ã[wuÃnÊɤ«)ë¥ ê:£Gõ/Y¥åÙ¡cðñ™ƒ¬–¹‚õVY´DIP pé¡NùW7¾ƒÑ .9V½½K’í)KW‘b87y?¥ sÎì÷'p ƎÁæÞ_¼0“3<ù“ ŒžXá}¦°üÐzpڕ:r<£ =è8Õ©?Ҍ†N0|HºáLËdÆl©i*Î_ØäóáÅÎg“@E¨Hº5!“§_˯¸‘x~´CKú»ë/~öD €M\âØ¡Àϯ»ñSÁsÑeng4K¶3S…5JKêfݾâloÄ:8ûYÀéoçôZè°–ãªïQ?ÒùЇììQV8Þ­fú£_‰*Y—?“F˜ˆ5¿`ód˜MWXÑ +“u"ü9»#á¹*ؓc—X“¿ÄKµŽózºùNUŸ®TÐfcCd×Ò°ˆ4 ßh@–ÑÀ•y9ª¸~†QùȆJ›&!ÄoÜÓ3±”¿¹€QÁe…ÄgÿÌæÚðÆ' D_I§ì²³xCS¾NǽʇˆyõàÈmQºG'Jdþc§éÐYð5\Hë[6œ0Ô3h>M~a“[ƒã^J DjÑÆP$ßòäNQ†mà“Æ®A;ŽiÁ±m¡ã'†,ó'—.ÖòN¾•³/8KØK®¨T‚Ìx–f¾§hŒd`ÕsyéV[2n-±Ækú>Gº9K¤—ÂGÆ=7îÀÓë +TÈ3t½ À¹Ñˆ;›ZW&g òkjc¢Xх” Q1½F&Ûÿ‘•k[˜ÙEäH Žü†#¨ñ¹Å)£ÍñؽL`Žï«q“yeiï͈c¦íøØـY!æ=»‚oQ]ܦ¥Hq×ÃóhDnMÒKFSì1e0…¬¢9«Ž‹‹ñO¶H+‰,t§lÀ'ò‹;zBûŠƊĭÔòlÒ·ù*t\‘Ñì b¦jÙL ?šD Eߊÿ©†¦K14'1Îo<(¯‰7ÜtCFqyÇeRÎô¼H"B¢ðMÍ"­g}ñqqcƅÎ|ÓéARv¹Ôt‰d€&ëÈ1Q·%e¡ 9§jh)Éó㠅†Ž™õ Ê/퓛ßùkÒe7A›ƒ=äՕÛ.rRé•/9²D|÷¦– 9ÃÀƒQ]) úŽa `d +7ý +Žá…hc JH*–þ¥ Iá4fƒ…@°ÁÌ/ÚaJZ®`‹ V V“FX'øžŽ„‘k1z3]þ‡— +ÿ0 8ë‹XZïÁ’{¤¹}•ß“Ð`bBº¤Çå>,l&Q„Œ- ”ú¬B 6ÂSHµQv}p‘ 5*Ý ã¾Ê°µ–Üfvю€rú͉à[Yš÷‹ivœy»Î£jÕøÌüf˜µ8Ñ0ÙÐêÅm(s÷ª‚4K ÝWqtŸ€¸OŒ®÷æåJšÏÀÆ8O¿ÌjgêšN[…´FÀʒ3]•"'¡Rø÷îrúÒtOÏ8„—¾ókÊÀílDz¡¼ˆ;Ñí‡BÑõÿz©È0ß«Ìã cQÆÐCÝê °øA½Úl:õÛ&cŸå³'bùå…ËV[YöÊ< ,ÿh£lÈMŠ:Ì$ç7„"õ\ qªƒÌ:R“­µU¨ñ(#TZøIï3Nx¿¡AÈse¬ßÒàù’À´ü@,Ôe&".fã°¹}Šx¨$ÝjþêT±L*f‹–}âe 7lùƒ†æ„Q‰|5(­8£¾@˜º91îúPä8Õ£xñS®ª*=:Èӆu±$ÔCJ/nìGÚ´¥e'J¡{ªñOsüX.Ϛ‚öìäBh õ¡%8R‡KTd\ôBop»Hãx†tÉ*}“p~›±ƒÇòãÌÚ½¥lý>ÑÖþ!%%BZ?±{K?‡³Ö¶ ;wВ<Ñ Ëà +½!ÔÓn…\¨%ÃÔ`Ч†¶Å)+ðd«‰ú„ÿRpðÔœ¥ºŸÕ£ý›ä` ¯{´ÿ<'SsU½‚ù0Þôƒj¾Nß«M¾˜Æ·l¨C⋚aâ"L)Ó"Jx%ïg€D ÿ ÝÒü§· @²wЧÍ•¤2?8 •Î©äum,3úÍÐ]gRˆdfºµX ‡±M™c®3¼Ñ*M ë×;¹.XÝP ÃP¬æc °Ï,à!…bþc÷:gŒøÄ7’,P¥Ð\w5?Jk³!hRÙrbŽ[ýæ† ñF58UKÒ$<)Õ£€Ákäà’œ²4Úی½2rÄ5Ðxá¥É4’"N䁲ú¥/ø\"›ñ]‰/Œ\*;MËq"’ÉU½#Țý‡Ï· Kvâ%È!­ÈZs úG¿±´5Œªƒ +Ÿà_XXӍ¬†EÌeú¸Õö“6pݖÜGûv'W2Ü0L$±bì³3 Ÿ-ÌF[º¾*n;å³~Sc¸£ä­DʤŽ´Ò]$û5ƒrR.ò?G–«ë©G¤ŽYä<`kaÚÜÁ1’½$§1|ïþ“y?EΑý)hSq­’ëi,]žxNâ*¡ P½BŸ½ vª¨–-µIؓ§7!ÞM[öë^ÀÈ®ÊSÏâÎÀ_JœÑk?hÚa +dÇÈô<ªƒân!Ztð™ƒ;Wt¶¶Iì˜!ðm–’gOi ¶^"N-5Ú¢Ùh=.0cMh¸QÿaJI|БëQ…€yü]_ŒYÐ6ú•þl#`ÔÈ°ˆI  ¨ õO\üôjAvî2Z&¾‰bÀŸ4HØ׍|DdYË79’2ðô*}ò ÅŽ›’EêRŽ^U cɲ+h%Õá ·JÏIñÀ Yä$);¡x +›Ð'Gžð ŒüF@»+H‘7±\þbçoâíÃÀW(€,ê[çñû¤ßÐþŠ¸ý½y3q„ِqÌåè™>$ú0äø½3YZ+Àà²kŠ[= ˆê @SX ㈫‰í¿Ë3Öb¿”…Y·V`—m÷ì§òeãçáz¹d€xd‡ÂKd'Çä¬ßKz>äý9†SFƒÄ™ÚÌ2àgÛºƒ™‘m^Jäi0Ä1 ýD¿9Ûl …#©låò§m¤Üݚ 6<.zÚKÌõZÂìç(™ÔâLA¿VH՞ ¢‰im[$Ûôq•ýŒÇY©ÙKQX̓©_yosÌëËY¶3ôˆ Mù:®…”¾œÍxN©¦^Hâ½ògO=²ûc•‘³‰‚‡B0`¢hrÍ^­½/)í¤½¡òµ< ©ÆUD7.’v+_(FÒãÊ­^¿gµ(_³O3#F¢w?PI#|Ù´S„91xˆê#ROUxaiõ&È¡ÀK;e¹J¯$Ú䛈6×ÿrƒÙ„0…VíP±™¸Õð´D,û¯ûF¨ïÛk›¥4‘bŽŸ¬EpˆVò¡|K'í†ÇÊöfC#ÛOÞJ`äEf"ìk3šåLøÅ:“7´[eºÈ\¿Óó€ZJÌ<¹KE­d•ƒ šÖ/§Mêkåŀ€}q§À,n7ìéû)R:¾#í¨ï€q¯H„ÅúïHé&—Ôš‰ \ðp ã¨ƒU:ýXt:wÝ:KtxÒç–®Ff ehX: ;OŠd‚‹éà H[ µEa$º³ÈÜ ÊÖ¤Ä"¤_|TËpSá‹î>u3ó"6#”Ôd²š̶֢w&»ð-#!bŠ®°C³;¬àWó¨)Ý¡Þ!S`šÜjûqþÉMÒdۂÈãáŸiä'ÚRdÄØ⹌‡Åjî^Räh=£w_“o™Yè3÷k·+'©VŠŸ‚¾O«]ê«W„C0»#ç æI×\ì‚>û+ÜùPÆr£z$r+¯ž±,±£¹M(I‚‡¤?z£v…KˆÓëi¤‘Ö{lR8¯Õ঴ÏwÔ½'©ÿLf-»c9ؒ‚Cƒ¯e2+„ÈnJ¸Ìò2ê ƸM­úùߑëâ?#'©Rqìýri¨j×äÁ֋}ʘ‹ ^`DzR<–~_z› ‚‹À‘#åN;0Y@ç+a¤.ìGb1UâóÍh[ú /çë{£ï×S¤&¿¦BzµÊ €%(ߝšËý.ª»¢d’eSbh"Ãcû€•ŠÛ'ÕÏÐs¶ñħJ§æhïg{ï 1δB¨/?D©m‹+Àîë(«˜Q¤øýð*µr=ážåSïÐH“AË$ÙòøÏ yR®eÊbisߦ©ÓÐVB—ÓöQ¾|rC’œ*ZÄÑPÃV!5´!ù…` —Ò·ëÃG…5¢g@Q™#“¬¤¿Ë¢Þ–Q$¯'Êg{Ÿ„³M“/•È°y¡?€3Öâ¥ÊWy/Û0¨" ‰ (¤ Cj':¦Dövås`ÆJ8 iHJ¸E5OR‹ó‚9`Ù¤e¾£™UŸôúĤ¢Å9 +6҅bº™h9Td¸3r6žN‘m8_H%rˆ]Z°&A纊t„’óKA°¸ôpXvü8ª¼Ž¡R”…7ŒqÍ;è£jpWŠÙH n°º‡*Ä:Øë>†s´p)™iñZ4 ˓EI m)kß”2ùmŠ£¦àÿ“ +çÈA^JÙÏtéN¯Äœ °_óŠ½àINe ßú?‚ÂRÂM¢D±èëyµd†Ìºj¼„V)´ÃxÿôbY€«½Gñ ²sétX„MuÄȂó7ªU@Ø;/˜œ$ʒôH›ó$ËH%&ð¦—Å5mÊ6„C^ÆMÁ ë‚JAåøRN +d˜ZU%(7?Å+ŸH=P~åø«ìª"©@Àي”m{Ÿ*u†Â‚•yË Üzû‹r¢e28’¶Rêe2׀/4h3rf©5ø‚:æ¿vêu…±çf¼•)£!]ô- +wWñ¼°IzÝÞ/ʾ"y¬ªð»¯éþ{Ÿœ¯"ç°Cv¥s +I$†­ógf@–‘hŠ!ç‰ÃX%ÎJÉ&# pî˜(º ¨àŽ×’V§ÀŒp +.´‰|C/-lŸYÆ¿g ›±¿wƒ]1éz͜Óÿá¾z›”Y±Øvs0W(׶î¯Äñ=ŒÞ!Å{£„WoúñHÔûîßJ#…4–Wðë$ 蝆N÷m¢›Ü6kú5þŸà;xٟ4lf›}ÑG‚B*’ч +V¥x HÄB‚x¡N5n±˜$®^gˆ.ŸB—5f»G©ÿ6Sh†O°©½ßqq|ùb=½ØP Šùl–#I¦3"€YF컢"ì_"˜Bd¯rë. P]º~-ÜøÕmª¬ØýÑÒÜ)0ÜZEœSLˆÐ›øUÀ7ôؗ>÷8BˆbK4#½Š çhaE×è—àSË&‚3´¶Öñ ˜A@qbïe:_MÔ¹d¸N¸á D¬­k—¼ÉýÍ(1ø ?ÁÈoX_ŸßÕÒ Biɱ |"éY¨,ó¿÷ùÃ~ñí€& ŒÎnNn•CÎA|éÙ’S„Æù>L”|Zˆ.b餐)ÕùL€ ¥ÂP³%"35öˆ){¡:"µVÛúvdNOmõÞ¸ÖÚY Ÿ¨ D·ÉdDò‰JT„—F£-cÖÆrk€^¿yŸý™Ñtá¤ò9¤U#Þ) +)F/–d|2f筋ÿú~×Ht¼õÃm#d*øL»˜Mqª¾º^& ·àþ»‰½LmheëàWõÁ6Xíö벶ÆÄV ®-3›šm…ü¯V~G‡»9}ü®äGÆÉ«(%ØòíšãvM…n'¢l!*T±”?¹±i„ð–LÑ[©nS‡7q±Š:$rwÈ2–ÿ‡žPùы•€{ipÈüšãñ•æu3®v1íú2›‚>#l$Ê||Rµnùr)֜Nh‹a—¬ÈQ«Ãt^ûnÏöŸ íõ+- uÀp<†”!GÜÂõ-ˆ´wÙRR±oLøhÓüœLyZ*}`ÎJ´Ù.¡++ØH[æѝÖæýU‰O&õLyÖ ez™ëk F7I=ùðb¬T{ì{Øt±7 rÿÖg]y‚un¡Ü$T„Xu²k€7¨ ƒåÎh͐B†An¨|B÷ñj—óJ³ä€éì¯ÚÚz›µ$Aoa¦€‹TwQz•…2¶¬—êÁТ7ÿGqUBòŠ êæ?zÞ[¤ºÉ”Lääы+ sµLθozº%+&Dàqÿ™ßÉÅÂAö&p|K·—³‰†xþÃîÁ¼xSÄ zYEç¾!vIؔÍB—p Íò¼U²ýô…¿˜b[ºO†ò'5˜0š´ÎsìŠ(<£B`Æë† rÔtÕòì93‰WÅá³øÎLb]âbÿŽMhtåÁ0ˆrw¨²Žò WÅ_Æ ûU |ò2æ^.ÅiÊ"Àò›1ÍÉçcÇ$ïӁ…Ä3!ý¹ÈÞîÚCä2¦{*`³KO&3ý8"«“å%ÀZ #(š ¤¬‡ÛÙ¦:L¦k´½Á’F¯³ärdŸ–øuÈŶK«nùLœ+ⶇ#<ƒKª_ÏËö ˆð ¦XGùà|Ábû꤭ڦšz +±VÓr¶ŒºÇ×úÑÛÕÚHÎHLÈ +¢;â« ú‹BScßCÕ⟨òL!frms`wÐÛ䃡)w\¯ÂKxëd‘sª"îÙ*t‚Ô³žl‘b4.v #‡ h–X0àœ$ é†7râ4GZ‘q÷zËܛM„üm„@–Ô@í +*· ßrËô÷gÿ${=¨bñdjlâPC‚uqÔm‘Ó› -/ÙÉAb§fiŽ¨(”¬ÓUšVöQç§ ™òDÐ1Aª)+Lš¼¦‹y'U&U{ÍöІêsçT?НF'Öè¢.D¹›Lp^,LcÂÄ&Ô¤¿´{ oŠ‡ +S¦ñ„;Mÿòü «†ë% ªŒdjæ,±S®:¦4 ъëèö½¢ÁûCú =U¯4>¡@eÕ~÷3>ìÓ¡Ÿâ—såVüR³ñ¤yZ:Ócˆ ò°¸s0_Þ »Þ#î#̗¸IÛBð¢&–ëSâ;ÍN8ržR›KŸg/ÖE9áQ+uAÁñHÁ\‚,¡ÂIŠ€ŠÙ }¬t‚1†¹^ £Äóy]6Ä Å÷(0A‘µwÁýé ™(4ÖËⅪÚN§ÖTúB•¢ñ»;¹µè6âûl&ç‡ó¥¨‚›M1nÁVÅ?ÉÝñÀu/ŠAVŸ»/´w‰Þ Z TœúïÅÐ)Zpq]OBïöõ/Q3–•’ ôÄ*]„A=ÌD±]bZüæd/°n s|ˆÒr%vçKJ»¼)eŸzS)Ëb¹£xËhRz( ­Y#B͆‹†‹ãLøH öOÅ%ÍUˆb($/ڎ(FÏێTáö@!×A)õÆlYqÑ{Qx«iT,£WºnHá„Í–c”áÃ2" Mÿ³ù“ákäeÁòë|҅¦FHӅ!*´Ë`…_î ´oüa'£=è–óyØl€ +o"ºÂ·Ú8`O 8ä%¶FzM?m-?îg +ïè¡ÿX2màÏ÷öESñýÀcÑXõà½^Þf[Iõ”‘i…Àd(„1„ü[A-CšÄ&.…úPè¸И¼|Ù3”ýöµÊìçY˜¹UèÕ擣R˜Ì¢òr{ØÏîñ¦@FEy"¦Ì›MØÒîeiŒÞíþÌ=îܯԘî„RUæB~¶¢E’íÂQùʍ»!(@Áµñ:_¬Ïo|Ó¨vÁj-¶¸tíõpB6sº·ž”½¨¤„ŸGÜýÎ@g™´X|ÀXåßEU^d¾Ã`¸Ì/Ü jCϼSb¿x–ƒWJ<ó'[©Ø¾Ô ±Ô&츁|‰ÞŒ‹"xd^pLÿ—²:'G³èH[6›yoڜÑÊ躺ás9ŠÜ Yà6 Å Nªd^iôhãŠy”ÂÝFÆA5Êü±@Ñã1c¸åóE†EXBPÐԘG싾ԇ÷þO·a®à0&ï(à^(£s÷Ì,Ē*¦¤…›“¦%jÀy±/O·6c[*B Z8ÈSò´‹ü Î65ûð¨½ÕOdRUá +±³: ¤(Ÿ=oô²—V#]ad‰ÔàXt÷_= •_’Ì¢Zs.!‰¶RfªNR7­’PIüÖ ƒì$ÖâìIɱž®N±•¡Û¯Tò‘ïŒhÈ<Þ8S6¯‰#9ôçìŽàgŽÈ–äÓP;¿­…1æã.”OV™ŽC°N–LŽ{úaüÌ ¼èR[ÐÇÖ ¤Dðs_XAš¦ÑÂéÛ Ä”#%،[†L³WEÑ;i¼~‘òâ€p#ïóÙ·ÂDo¹,„õÁ¡Õ:“¸„ `h築®Qh¬Ò…ºiUm0½1 ÷fRÂÍ +Xb™Pè»4C -cMX¿]´Vk8e€qíù¶D·† O¸ò€Â¢zò Þfp}„딜î%k¼º bp)¸ØÝ«͸)”ŠF§úü5‘¿ xpÁ’1"Sæv¾¡‹Xؐ­.kÉ ‰Þ¥Žx8éQ?¹u8$ö$¼¸‘¨+¯Sžå¨è7doà9†VuP¶´¼5ññ†[³ˆúÉõ\µJ«¥úÐ B­5ºlåɋï°BŽj$v©“mt•ß^«ß%}E¬ˆ£eÖèÑÞÂê´×–™x[÷Ào™× S*Fºr9ÑþqˤúžR¬#¢báH9F3¡¬µl›YS<ªyÍ6dsGçúÉÔ º£qÙú¨êÄ`(÷JÕ¹ÔSG¬È}_—G.ª‘Ûý¯äB6‚c¥$2 ßs¹à#«üѦs´ý%Pã1Š³7ôŒçb3³‡80 _/FÍ*§¸×|w`oñ4¢&y‘Šç ö£DkÿÐåÏâ[êiL›DwÑÿ¡TÜê}f4Ë'” +WüõâG>¼Â²8±,úhq@:¹ +ã/4y£-Í(Ú?çÁ|d(<‘–pZ€uµ>#6ߊ"_èÔÓÆ‚`Z*mÕàE¶ŸFL3îDGP0mJëïæpCÚ@€Tµ‚|9G“‘ÇÝclô_Gõw™To°PQµ*lt ;«ŠÍÄ>³QcÔwœ¦£9×9á[~%rõdyoÇd7‰ÛA{¦,qÁ… ñÜl>ío¢ VøËvœË©?ªÂþ°ámþ&P0£Buú›€n%jŠn¼ù¡G%TÒ ¶É%D(\u2ÙOe¥,¶Ztys”a_hù𸌇Î+{ˆ‡ +W9¾¡±ÄÕTÆ »À [^–Л˜O!y‚>û¿é©õ=~?BR‰(ôÉ&¥Ëh†Yï.åùJTøá¹·@vÖ±‘ÞØâ^dîk³!°<"ÿ¼$Ö+Q¨Á»#?™^섢•!ŽR©†ÏŒå` ô½åä=°<U„²6Üͧ轴(ʵ땎y^Õ/ƒ|©é:w 2ÝÚ¯Bn†ÏˮΆƒÕ4V m”0þ)tÐz}8v‡noè Ò¢µ£rçv§§ýi½®ò2 ?Æ1 ×`KäSê„ÅKâgxl·- ?`єáBÔ5Š¶8™y &§À= Ò57'@&\;WX²$+°4¡~OcÁ=¹L¥Æ FÅ{qäÐìNðü¹ÁÄÙ]®~sÑ&,C&Ÿ^¹¦Â>ÂÁÖ —4ÆÌùߒAÏiXiÍÕü—¿Ø¨À€R£qìÚÁæ÷(ãlï²ÚžKDv¥)üWdSpñèø,ÏÆNXðIXø°=jLb¥8‡¶þ"N°l+æ ÑkUs$jÜcb` +߈9ñ‹ã/ö&tuËÆtÖÓHHÈÛ ¿@uÜtÏ}™Ô…,]±&^úú€M€XËÌgz€a…Áo;A”gÓ&”€Ó²¤ì¾(kilÔ¬„IAaÉé™oƒb…\€¿`Øf±¼$ey„™d6jéa‰:‡)ѱ™õ˜„ƒ‘--É3…Ôóâ +ü!7&ßgô—Œ !zí‹s¬ÞòFˆ²…­h!¾‰xÀb‰41J¾_0íy&Þ™ÍòR§½g¿UCÖ;À9†V4JÝNÁ)ƒ´‹µ¨ ½ `É"@ŽÍ×b!À<™´atl¿œ´’‡ÑÞp ]Ôøý y5Ì%F7Œ%º˜jfŠéd¿kKCQ"îíeH2²³«yƉ{Ô»„NË“päy Ö‘¾#ñ"_ù)ˌ¥Í‹DQ&àçÓC xŽê…»ëR{ÖÖ§­wô2p©¥+ªŒŽáѲ,_b¢c iª?CûMÁ…˜ÐÅâåßB>yÖ¯Tp̆îŠm<½5I4U’åDœ*˜þüßÁƒt?3¦zÙw§Ö„Ÿ«BGŒëùòcý¤ — o3(7Í!7:ÿ’k7eóö9nü5‚äö•ÊÂUãW`US…=Å +nÍFO’Ti FV´ƒÛ˜`¼+¼”×ÔòºPñÒÆ'6(.!$՝çÃ×VÖ`v!ž}ÑÁ³Ö©õ9¸X”÷àܒÑßGg¼ufî9 Må,¶õ:<Á¦bȁo>ª¶ƒ&¬ã?V¶S™®{ÖàM‰p\º/Gê˓:Æ\'è¦})sÕL*TdO#€Éj ïA“Ø’lÉÇ ä5îãǗ» ÚÕl¥‹¨=üîç…÷®¬0ØàÚYO®aßË"ÀµéIõdýIGŠìæ©Zˆíj°… yóéSAáÀE@ OK`ðd§öÐ ©7 Qd°æ&Š“9Œä”¸”ëÏt·|“§Ix€„#!Ä¿ó^Fèˆþë鋝š!"j8™!Ž.7°¢ƒ½P4x¶6´€ñ;oÏ%¾FjÏ Ùœþћj®ÂöRÞ)Ž ¿\Юõ ½Õ— Ј>ðz±¦"µÀµ”5ânûs ˜=@ÃdñhxèrfЊȭ¾Â©ÌÆü @ °Aa¡åQž³©0ÙFf@;©A©^„>®9Aš§ù ʨXñe³<b\óñçöì?ÑYÕϕo_m°$hB1aIo†PKFß•¼ïO>·¢èA/}èk:EŒ>[¯/†\{íuÜv‚£› ŽPcDNk˜lØâuLë4åS }=Jê·× |ŽË\X*ß\}Â#xÀºK +ÍQ”‚ÔÈŸ|áçf %ÁØçÃ~8Cú¨ÏÐòQ£ÅZ1?Û«â­úÊ°³iÁ*¹àjß{!i0µlü®XÿsÂ?P]}ì¸*f*œ:H¡%¡’dê3fA̒«Vµ·d2Uê×üû¦-ÂÓF§ åIÉ_¢y†"M‚4“O×D„l&ë áLMBۙDÁÏ1Q!V͔ȗ7t‹<Ô§<Âû¯ø»³Gg¢—Ì8¸šI|\Á©s»2Û¹/Ç`˜Âs<)ŒŸÜ÷ÖÝ~P!(ü‹:adAŽh¸¡ ¹7Z& Ç·HÜär´õoËô°¸øI6-óÀ—ÎÒ]A‡ùÊVüÓs™Î†7¶©2ò›% Á~2O.‹VnãÈcðs«.Ž§ÀÐndÙ²Ìç^Zä 6õJløWŠœ)×—ÏÍ#«Êš833ç¿e>ÇÃىl™Müç©ÞœeÆ|:‰§Ó4[/²pmë©el™•O_¨ µø†³<ý +ø,WaLDþ¡HÅf̀ï%ô[æÓ*Š”ý\)æӭΠwifS+=´ge%Ú¢‰Œd ~Jïú?^çõ6½¼ævÜA.´^ü§¤RG™sà YE(BŠ<òƒêBÚö‰¿'Æ>;zÔAæü”A¯tA w3 4Øx½@ù„XRÔ0‘¨G﵏ÚñÉøE¼ÈF´LÝ°„‚£"!óÌf^œä03X*.=î&±Ì1…€ÌÒùq”¬t絛ê̇è"VŽ!} $äÂȉJ:¤„e²† +RŠÏÚ1„:£ô?þ™¢Óò«4´a}ôyJº­#ñÂáڒ¶f¥ ŒI¥Ëçà‘•’ÚAܚÑHD=$“\$Jœ«XdEª¿Yã8@`%Àù8Á&HöÀ ʟÿ†~´ R€©d.«üñV¦*r6ãkýVÉgu@+úÑJ›VÁ @¸(PÏjH̲z!M)ƺJžA²ìY££ b"§ Ø)âá“&„˜ÑÑ“ØØàÒ<Ã5âIȉ0V¿LP½“òÌo” ¿l1¥D¶}òæ!¿ŒG +@éG~3 “ñ·­ÄÇ]=¨Ð™bmZaµwȓK%V4•´ …Lí³›xQ8Tæ¦|ìÝ"ђ–Uö°Ñ7۩Īø†÷jn(€W7ý p,2¬+Xûƒ€7…÷&ú˜òðɪөŒgª²F‰ -Ô,ä7ÔâN—ÆöJaÈÚoaÖ“çñM…³û8hj†#5Ô¹–Ê#våñº¦.®HЗ©£p ͕iD倉†¡p2Èî#kˆ=íü‚¸ÊT Œ± Áåñ,ÖiA2U ÌcJæø¸ 7ÌÎœÝSf E‹ òDþ‚Ú™!Ñ1ÝÙù`¡rʵñ.î•ð™p|„(¬"¹þM;8^†Ð…&¾ +܌ã]¨À2¡€íŽñbE#7Ó¥ÎïêbÃò€ÒY¼àµP d“ÅT³°;Æ»‡Ÿr:ÿgä·¤8¾=³Òooþ(ZÄ^Õ-·ÿOUZ¼¦Ûÿ?xgH“|y¶>!AÄýØD¹‡;X©òŠ¦¨Í°þzTžñÑõlÞ^#J2zá6¥e[¬ÒØi«ÂtTªã!©¬ß"`ˆ«²«v›—Ä`l§®õ7¼³#ÙJ[ßÓG–Áiܹ¯÷Ÿ˜¬,z¡:’!w ÉöHJ‹2úà[ÚZ4âHú™Ýž@8Qoˆv!Hy2w6²± ­ñËXQ2^­?Æ#©keM3™ ø|µ¹&¨J <ö<žîÉVík9¾Áf–73Z #ÉŒˆpɓƒù„´r¬ÿ†vâ=kžwƒ«ž,]tÀ@¤®‹2hòsÉYšª6V^tщ5‹½mæ² +†Å¸Í1Œ˃œ’°T>6¦Â'g +,¦RÕ¥<«#‚¹Ðv¤Š÷®g(—Àtß°ºx³F}`ÈÌ€ù9îòˆåøJ×qƒ&ç‡ü™Á·uA ÕaD?†»ì‰HcA¾|ŠŠ¿ñ +lÈb%ʚU ÍQL©s†fÆ0cJ4@C³J[Ç=4Jŀm½+'<({ ,íJ§!Mq¹0ëÀņ4X9–ÄŒ£¹°:þŸåÕ5à𚡔=ÔZA6(€#’Ù_òîâ]µáÔªè@Š–µ"ì[Yt5™ü¡ÑÕzÈaaç‡äZ ‘f¸o ÛæÈ´Çk;XŽwnƒƒ„1Þc` +fGÛW|‘Ÿþ¹âµ‚wLãT¤Šü"¤–›£á*üf™PÓUµ')íàJ{Þt¨'ÑQ‘üÖ ÖUTÄé6ƒ—<Ò 8 Qj @»…Þ6¨ßBñ6ó݆ b§‚£rA¤¼‰o0÷Ø|œü¶èÕ,dgþŸ’Ÿ %Ñõ"apÚ#ÍW\¥•ª3ZŸ™!™±(O C³.†ÌۘòüOXªd*ÝRa«^ùÇ'N!áå,vÔKäÿù‚¾å Y}¸ á" +D¬3ô_çѨÄhŸ± +7è zӍ¸¡ß?-mº§qA:þÅ\W«2ÿü$KùêRÃý肢öBª — ·Æ9Âöޝ\+¾)û;¸—ùÊG¡Ð’EÑ=C½¦8'j¶lØÅ|`ÒpV`Ú¶U +Xf–³ȦÃ|¤*§jƒ8”•@Èóý±‰6RSœÈª‘· NŽ?“pÿ·-F¿€ïkéFá3 ˆ ‹H øìëqŠ©ºRQ\¬)›ܶ¦{÷¾´NT›ÎʛP¦‹¦áÇÖ¹NmÍQ)/Àÿoc¼;ÒL7ˆXDÔÔ<4&±­‘DöáEEAI@¸Ø<X–®ƒ­EõÎӋ‘pT |ì² ò‚’…#È ÏÐbAïH6¬ê*N0  0]^vJ’œ#5Á”ŽŒýÿ^^L89,_…ܪÂ.DN,ËFBcQE8c¨aa2 + öU*$b""R"L¤DHD„/Ëɉüò÷àþ„CøúAIIÁ@Y–d€‚G^(¯ãÞµ¢jЙ™™™9¡¹¡™3333#33Dw'ž>²£`îîD¨Q‰ÁÕUÕ «quuUu¸«Í'hP+¨F«¨ªªF°`5³`gf&!Á˜—Âüù6'ê{Kà_F?ù§œ<ïÿª·Ã"„?  +ò%I(+”¶=)í҆vˆz¥'·ý¶me&жcffĐþü â?±O‹¯ @ðDDÔªª@–š«þ¤©ªê›™˜™•™™™™™ 333!3;Xtüy$‡“ªŠèHªjªª¢jUUUUÕ¨‰„33;ã…CàÝU @önYD$ˆ8šˆ‰ +”ˆ…¹Œÿ¿‚Ç“$I2`<Ú¶mÛ¶mÛ¶mÛ¶ípfffffff‚AÁ " +OôEÝ4UlMµªªêªª*¸Õõ˜F¾q«`FšÙf?¹ø@ò@òÃýù TË-5yÏ Áˆ™¡QMM¨S[LäZDD~<ýÿ×ö­$I’dI’$I’¬µ½m«c‚fĔ#Ú>fڙ3›½D¢RƒˆªXUU£¡Õ¶·jíFý²Ú´cÂÎÐÞކŠÎÎÞû÷Û§÷éÔ§Ô'0M²î(æƒNÀ‚G°$º¡¥=¨dü>sP‚P4ˆdrE->,, +N&"6HllR'QµC@`F€€!ãû¾¦#©£‰pó}—š,šÑ™T×}?Ý&љŠ9Žê\YýR!ŠÔn' &±çß7d°˜€tb¬ïOubîPƒáUß³+•Xõ…-V™¾×)×»0Â:ÌósÑ÷~”ÛXJñ+>È>Å9ßLJRäÃÞýʓ1@ó½ÌM`yß+âÈ H{µ»+¿bãÚ7‡øÞ)–ãkã‰î™Ü²uñ4iÃ÷s1AҒòxû¾?kNÖÄC{—Ë9—U*cqªFWoÓ{O¥k©ƒ§¥9Æ.~pÈõjàm÷~ÇØfõ[„žëO÷^úkºA}1pT¸÷¯=L]mµ {Öí½6¶÷7 \úUHbèÎQ:=ö$œ1‰Oë±ë½ ›Øɲ ÿŒ‡Ö{EìÀ9²yï÷ÀbÙæ¡Ênõþèx×? +S_¡ù0ìÏ\%õþIdL€uKÈ´ßE¢©¶0 Ò0Àn‘ÞWE%8{¿m5zŸM„Êã[Èáþ¢SèýðWA…ÃR0Ÿ÷紇ÊLd/ós}{tšã8ï[ŸoêÌ,ÕԈ5®a%^)‡Í{žæ/Æ^Âìá›°"‘á½Cñ—ÁMò^ëʼ†Ò´RNƒáïSS‹¼ýcž²T`Èû»ß‡¸YŒ÷¯?dÀ[¼ß>Žÿ˜/)Ø¡Äû§‡#î Ð_ÇxŽ1Ä{×ø’Np؛wa¬)†&ž‡ÉðÞ_ȭʵ*³Tá=ß«¥¹pM1Ç,Dxß_ãÄl[µ{-¬¿#§ÑìØöîyÄD +äÓ»ÇCh N~À}cɊVw/‹î»¥'“ø|'wO}éÛü2£õJo‹f‚¦wÿà)Däüê,GŽòvOªà5¤HàEàßõðußæ—-¥’ íþ¦éèÒ^ñëuE:«ÒaK./`Qv¯ÊJH¿vç»orN\’íõEk»ÝU±ÄÚ^飐ú¹ľŠHµK¯éÞfr‡6ÝkM~´7͕Éq]÷M´­“¡vÂãØM ÖÍ_¤l£êÁÖ=HÏT\5@Dzî¥?^3u¯V“ºOΕØW¹§È4cYŒƒºÏ£ˆÂ?÷Íñ (×þ„`.µ=à69Ýó´åÚ ÷EOhÚ¿dqL÷D5b0Ÿi„B8û˜HèA[º×³¤l¨/ùrî3ã{‰røÄœGKºWJ_VÏ°5 ”r”f°q]KMjÑ%0@KÏbÄ»ø±±£{èE_’ÿßOʱ¢{àö%?ÁÆ\’2,‚[îñ`7Üwa܅ìýó­Ñµ«ipsˆ3cº5+rRq¿Í8=ý[±Ì§¶?›ŠÉZûçš9B<ä[Øîìµ?AkÿÙ|ªŠ <Ôµ™ÄId+÷mV8•{]Õä ßQSF +î7áêå1rFdrÏ&…*¹—ÒY +àAr_bŒÜ‹‘ûð¯ízmÜÞL·´‡ŠlCAp/Äð²í0EdÜËã %bNLAé&ñ­9~ cwô/ uq¿ºH˜ò&ê¬éúRpÓÎH71GâþéÏ`½ºÇö‰„àÿ¢ ¦Ž«Ÿ îי¸§Ìçmïxƅõz¸ÔµëØ~ÕbÆGËpzïhx1+Éi°¦MÎ~wýÔøN•yºµ½IP!À§öD(Á³›3E@¿°)RîB'’ *ÃÄÅðzۅîöW,¶K»(鐗rSزÓ>¬ZøK À'¯å™sz>.N¿=t ½§p‰`²âU]Šá#NP³·¯>] ö|úŽ;zûè+óö~صèèÓ®¡J—&~u€T'†+Ô +Pûàµ9l&^»=NêJeÂpqÔª † «Îõ“9ÎÝ¥ÛûÝ6+lõ‹ˆp×Ïèؔ\’åò¸ÛØN ® ¬äHÞDð°¼í%Îƌ$`g2é¾o~1_ZñÐm_“KœÎµ}Kßcc%ômÛ8ÚëáªpÙöj„»‹»öŠFÏ n{Šþç«Â¶w 5åÿ˜ÇFÅI~û<šx:²¶Çô®ÀÐ,ë·q$µ=eÒʹ©[˜í%j~Ëöñ ºÂ‘/eÏX²ÒŒí¥£à*¶Ç^ vÛþ¤ð5lÿÈÓ_»Ý*èI + Ö£òÅ1 Û÷‰dÖ©k_±ápl¯JìîÚ«vâpùµv|흾„G:.»*Œ rY̎œ6Áùì™_Ú{²ì½•¤P^ °µçÀµv!(ßõî–.ï¡û µê&»®Vðisóvux³ö¬m»'éÜ 2x±®²H¯ïˆÓA†˜ì…ˆ­¯F:¡JVí%»”Ü<†ñG~Žo˃Î*p™+Ë°;Ã¹bá´k„9¬!Ôr°^bsxöì Ñ4Pû¿1@íÖãò‰îìwŸìa â=™BÍËÉ­€í2´g˜¤kBk¸BŠ¡¸LÖQ‹6DÆþ1z;æí©5û%p89òi¦á½(Sà•|òä5Ϧš+ +¡pÃX¾ù/ Ž'Ï¾åzv~' Õu—@ىíÙWK¨íæE'¶I.zöÌGæ,Ϟz§µkeOåýáÍ⃴{߆g*qi~:ùšGtgO×ÓLrS°ÜR„¦×¢™”"·Š[ìÑМÔT¬àf¿é“¸kNÊ·éîË<ñn0C›ýOâ¦Îê=À÷`³g•2ã7LxʹЂWiI çÈ:³¿.>¦X«ð¨A™½žäd¥bÁ!³ß›înb:’çÄ%± "âs@böB,‰ ì¸öÔڙ§O¸JšñzRÚç"ûÕsVª ¯n÷0{šÄÝû×ëSº`¾8ÙqÈ( µT–= ÉëpÏãØ$XöµÀ¢)wXÿ ¬’Q2æØnMQïtÌõ&ŽìÝõ¸5L€•=ó#±o1ŵó³`oÎDH)"‡ž¼côÖ;9†'䩯†Êžê‘Ø/Ÿ†—#ŽÄ4uEo&Ȥì%8pa©.büŠ¨eʑ8 =O²ZY“*Ãpz#~ìmgÄÐœÝ —<Ùof$.¡OH„%ãây݃œ€“½JÕøh¿‹ÇîDDAkõ©ÂuL¢5‰ïþ|ÝÞdoÏKµb#ˆã<.Öa›p‡°±ã0Zø–°_e&õ†âh2Yõ»– ¦j·]Ž'Òäÿ '4‡DCQûê6}Œ,d5Çïi}«Ý‚¹d4ï/öìpÍ{Â<"ÖÔ– ïP3ju0ƒísG­²z1IX +}¢ÝK”¦w·²ZՇ¨%"dØ+?ñT (±Q¯z¹Á¯˜³õ´;=%fÐáØãÆÑO~¢®sùiÞ ê^Ð)°¦óæy1ö7£î†¤ÁØó‘b£Ó\«âlÖ%¿2Øë‹?’eÐ;jÏÅ~>9]öfn˜âN;@=-koÒB¢¥`ÖäÞ(,õ´=øÙ׶Á‚älmíÈJq'/ӆb½ä ¼G;ڈýF(I€DìÖ/{lG[ˆ=ë§Aöw÷px Æû7ےuÑà}Øÿ0rG‘›ó°ÇQH`SHë°ß`jz·ç8ìyô.Á*™WÝ߆=ϊ.’ÈcDþ06PdY¨®·:ïèmo¡ÊÕSf3ækAm¢Ïe†L`Þ O¿®ÚÿM6œîþqé!ƒÊ‚ÿ‡6çÅJy5ÐIE&œÞE 4Ÿq²lp|£ªÐiVñSº¶VúwmÈÛºmS>\½u²Ý]¾ü˜Üpör<éR*åCæJ~™Àêêî–k*;Ì +û¯kà¾ÏUgL©3Ý*‰Kº^ŒÌùöò,·úèÙ#Þ$.½Q¿zì1wÁÛ_!‡BDišølÿ~³cýܾÈw·É ‚ '¿ ÔôîÙˉ·×)e¹CÜj óÒç7ö"ÿ¸Vbå èvc_/FôƒC {»í¹ü]µc¨Hw5øܓ(‰ Û pø#4uƒ–;’Ž§ºÝtl–²Ëá®__…51·©~ámÃcJeH?0|2ý;ÚjÖ‡–ÑSô¶ñƌ}ø–ž‹ñ³b}Àçéï]©4}öCPíµ`ôÍýÈr¬#&Ĥç~]Ù±‹:Ôy'ñÆ¢´’D +Ø,éDæ`îuãáÂÉv©kåЬDGø“Ô¶#¢ :DÛµ[û>OnG]-0Àrƒ•Ù$Ì-ûä) Œ[tãŸO•ÜÜÀʙÜÀ’\q[ñªfÈZ>?ð{s£‹€6¡RrÛK#y8êgbՑÉLs¡-âäFYŠRÇl®Ê\žœUïv¬Áa'øNÀ +ô‡ô&‘ÎÂ2Ö<ë㨠\‹WTÂQ´rè[ÛOú¢’$§Ô`ŸB6엸H,¢HÙ*¡/Q‹ìfž´N:A¸¡-SYžzlêÐU5ŽRIZjÖ|~Ë9ÕåùÛðiä?\ +U&Ёی¸<>4xüáò3( Í'‹E\6Û¼øÊ¹Eåj­³Ëü/b÷òÛ3?j# ]¡ •î6™{~SºÑŠ"YÈÌJJg+&VÎH&I~rúS>,SÜåƒ6ãȈ:A2aе&ò+ÊZ9d^ÕrWÅ[vÖ%”d?^w"ã_uˆðs‰¦½­‹zɕ÷: Ÿ÷’ùפ¬ÎÏ¢ –¬•U3²µª§¦™Õ¦K¤aõ~Ó'/\®õª‰ +‘©ÑôJŸ=æG:,cpjf–•gã +írܾԫÛ@A–iV>A5.a´W)\GAI ÃC¨‰t<Æ"ØÁcŸè©!ÉÑ0BRÝ\_)-D—©ù×’"îŠT|ÆUÐÒ¬®´•ÙÙ:ÓÂMò?‡Ð,ÛJr6ïÀÑ[gìŠC–Tž¬g€2ÿó:ðôÇ È,zòåÞ¾wêç±p®@Žcæk¬úÜ<€z³Co‘w²½”f¹( +åYÃ'{ÂX”ÉA‡æ‰0È +”Še …¼i×&Üt 1SD—ŸÂ€rrÛĦþ$qÅ{MjÏø¡×ú¤Õô‰X«{pŒ‘¬‰`ƤŒ¤WS2aªWÎr!ÑBãÔð'y=!Jº÷AàÎܹ ¤Ò¤•×<„Äò2’äýò€ö×,Ë(oiºÞƒØ ÜêþIšrâé$uüæq< 0NÍáSÛÈ +ºøk(ëÏ >þ q=V*•¾wÐ[9 —¡ª–Å`f5‹LÝÉS®sâBÞ XØõáï°7¹z™¤°ÃÞ'œ,«oŒÇoEàðÝ¢<ýÁÍ/^æÒeÊAÖpà•¨HØMXC ü%!§a ‚êv?|ìçÐó…#6öž[}À½­ƒ-Dò +`#3¸QžNÙ¦A˶µ*b7˜Œ-Âgc£Ÿä j“¿áÚφ‰.b>:ߤ,Ê6‰°àœy+±.Ãû ’†ùÇÇYö`@]`̽r´§T®K*ø°—cu¶Å³„Ô…W\Á +%h!“ÔZÎŒ\Ȳh&{4DdF²ý¯ï+@ÀüzUnÀymNÇk¢¿}7ò –'TGU /—ó8tõÓð°ã‚PlxÕ5IóÊՊ§ôÈ©†mgx8›úFê[F2~:…ÏÀ#+qR²L6‘àwQÉìL™ALëdlT½ ©Þé ,˜»þâ %NA ýY¶å) þ˜•æ’èìŸÑcz2¦Â;Êd)Gš¬ +]£êrË5§FÃd—^ߐ ïkIß6­g¨•G„Ø¡TC +õ ?oG•9â`/­Itî.ܯµD-L¿$kceé ¼L|6V™žyãMð99ˆyvoT¬[Ú0‹Ž3ѳÂxÏ2T€Ñ¾EˆôÑýСh~ÓÁâ¥sÈÁÔç¨Ï¶ š/«ö%%Ħ¹ÛÆO©ìY +P¼R¤Ñ“赈B cZ‹" g`‰ýVNúõ›ß'·>KUàȅŕ 6¤"ûLQ±ÁÈ£lÿÁ¨†8ìü ét¿·Õô¶õ³CÕø#%£Å5«¡¾îÔ.”Þ_h"Ós!g'òß7'‹åƒå÷˜¾k°%æ·¹z.Ü)ßÅ¡©•T©C3ã)éG­ˆ ½Ã¬˜*žŒ…hÂå…+|ŒƒÁþºnøëï-Ã¹‰VŸÌ2Œ®ïãË)ï£NÍzn t´ëô+Ð_h jvÀÚB^lt®üœæ±¸ëêÀ¢ ÏXTË6VÉÎHÆ0´ïŽt¹Ëä×>"6K»Ëßû#šø¼…ì€÷!™Ö¸æ®#§î~ѹ_è›j`À?_ò`”Gj7(«·ÜÑ)…G‰ gñ°Ýà)ÓÕ÷ÿ»ñ3ŸHIžb¿“eµ%+C;‚êÌ Û¯ªÁ¯ÿðǎqWÞØtqá+™…‘¡¬+íȲ6| ú ]·|K®z¤1 Ä=TfÎ;0vζ‚æãr› +›I!yˆcõˆkÖväþt„ÎxÛk€ò¹àÃ,ÿ”ÍÁ0nGug9À(-{å*Ý„lf(µQÈbúý¤nu_éÅ¡„:£zÔ$íλbTߦb­ƒÇ¬ÏÃíð¢:*¢Ð,¢LÑrjÔȽÇK¨u¯¢]£˜þí¯©òs0º>_µêáՇ²ˆ«ÅeMÞ6² + ¬J¹(9uÒa°S¼ÆA•ôÄ =|å2ÀÿDÔyȇ@ö÷Mg Œ’%¬äqT™ÿ?V¶=QFk7$‚2Ôhˆ–!þÑúÃàõìýHÒñ=Îé“šøâ?°wÉ¡¤Õ Ä'Þ~5ˆšbœ )ùË(QsM5öG%AC £÷˜c`øðSø?BÌAë`À}1xÑÀ­ô-Ùn¦feC&g ϖG[=&ÃÐe'à1fÓ7¤,_¡ìݎüA·Ôôs| +ª†gÒ[9)´ +-˃/Y„TMi`¶j?ó@ñà(TXXm^vú²‡iÞÔ:(býœsÿÓzåXÀ-`› +Ö ï†’m/eâËeƒL_ºë4ȃ‡× +»ðF\®¶¯ãh‚Ò´†¬VxèH㔼$--*N, ‡„1.Üb jÀ”óLÒ QiRÒ×÷GbXé ™ HDgí%ü'êG<”r2ߚ‹cH©½8Îò™~ƒÈ”%\8Ö2·(Î/— nIÚq·ŸgþiCÑ g¶_]¨_.M÷38ÕÕt’ð"Gªù Œ_cQ¾'¦=Ê)Î «VB˜vE¿øP>©¤UDu RêKå¤Iå$í’Æã|kIíàAP㬽g%ފK"ÓðÃ:À)zð Å2R˜ ³¥í¯J>!ÖwÜ)„’¤0·2éï„’Þæ–^.iõh+ã’G=X9v¹¤éúŒی½¹€$£â.RÅbI’G"ñØÏÔ\Ò.ÑqÚ¨Gtcc™Ùp™[3ĸO».¢HrÆÇÔG³sI³N5ItÁ¡×“Åp +&0zT73«×7h94pRÖVD“Ù^7­km©±ÇuÝïÂðàåÝÅÔjþ— +ô¿’ŽÌ<@l üêE G%›ŸÏ’ê»ß1Ϋ:Þê(f²ə:Íe•!eS8ƒZgZ/J xߎš˜Ôdñ€Sµô«Äø\EˆDò1²ÐWÒC¾×uX÷2ÎçäË`tË܂ä0Ë=½Ä¢— aÌ ŽKT/©z–Bý~Ê`¯žÖTeØ×H&Î*YYѨ/ËÃø. NÂeL±Ö❠,^ÒeH¯R©ùŒ´¿¡¨,!똨»¤†›ƒc=×¾½ôÔX J¸(`PSY?{G•$¼Dþú:‡L•øóȀ ÃÃH^ägl×EüŸ$ìx 4":a2ι,(¹S9ÉB­-¿#P`¢ Ð ”èOç¢ +$ M’ù:œˆ¡–‡M XOäÅs4,ì qöe•,86ÖUÂQt¹Ú5¤~ŠVpYð…+°a8j.„%CIXT<;íª}žwÅOÀ¥cMNls…>³údÒp®€ÆJ\¬ óø-L$¿U7Þ¾-éEjÏ=n¬y`³ú×쮫 +Ë{q5í­Y¦§¯4½†®ÿÏ?M£hƒác#‰Îõ¤ +üȜþ.»ˆ¹5Å–{T›9ÄÚ´ß>8×1 Ò:R(]ⶊ'üƒ´Vn~ë#”l9^õ®¥ñ«Bë‚`,ØYv(eú’V<„nŽƒž»(»k7â!ÅÝ.”:ᑠ+«eRO£7j«m±,ÔGV§ 5³ÏÍ0UP¹Ð¾9.•‹X Ãö´IœýFkâòA—ÇŃ Ð ؃I6t_Áý¾Bñ§íH˜DGûq½­Ô†\)PG;/Œ"qBûQàÍI<1S:ÎôpœK,/h{QG¹¼“Ëüóï bB[2œAû#Úï{ÑI¢±tÙä-z%s_‚—g°)Ξ&†Â®H¯“}+!ˆßŒ¾—ðE­o–-ÂN× ¸kn"Óe=eèøóV¸ÙdpœWa°æ>J¨£›B&G¶¡A[éx•¹xI€æŒzË«èðà$فb™DyÐSø<Qçk¸m؁afô!œ¸áÁâ qT2ƒ•CÂý·xtB S®©#€3í¡[5£ûéâÅ+ÃÄxq0S82iåSïn"µ˜Ó™!¤0é"Kðew_‘KÓ è»%>ƒ@d_|9ý]Žzp‰—údÉ{âݸÕü?ˆ>Â;ã;{mA}ç'nÀÙ¯ l¡¿:ƅlÇ~ÞgÖw‘€ðQ…4¹ +Þëh0°@?fL6(“èéý]ÜY«÷dÊ5rkq3•ñ²õ +J8:Qvå$êŽé±ï!gUÖ ¨ \òWÖö4dLQ͓}œ.õejº>¿òAQh×3"–XÔÏ×z&±%¾(¥è « |Ӌòe£.ê žNPÇßÊPn6A¡ÒüÀð¼”uèjŠž+ x +ƒÞ)­¶?¯Ä9dãÿ´Zø5îµJeSωzñ€ÓŸEP½ÂIŽÁvŒ.§9 Þ{’e>ÁDiöÕ¢±1·8ÛÓfGñ0çHr ;~ "5S²ÔwãÆ®‹ãê¶ÿ…ž8®Ågjãz²âRp`÷¢K¸Ž€H‰¾î¹ì“ «ŠJ!ÍÔ¨TUêŶÞ@N£"º’"DõU$Àc™Ÿ/VåYE›²/̧¤Óú»×TÝ豕q<Αþ"¹Ó%òLJë0¶)0t´ƒW0éd"u†!¥X¬‚‰D’—‘ªÈ®§yRgٖ¡¤=©!ú+Üt¡ë…˜æßâ]yϸXAúÐ~Ž˜Tžv†u›vò"¤IùÚµýao99¬q…¸Ø0…ë`ð¶âþÓCÛ*É9«ëÒ°-IXõ!ìmˌAmQI~Ì9•$aÙnÕ=dL­*Ý)\sþ¼ìÔ·ç@sÛÞ]¤C¤nÙÌüG¦å3Ów›HŽ*ÂÄ*õ" Y­nL½1îOx})» F™•Ã¸pšˆ/ƨ6‡zg;,ý5†;2y|:§Ƽý.pä­Z¼‘yb=“®‰%¶#þá⎀#‹ÊWN¿B8œÒ¡xn´A‡³g’l‡ÈÓh¦mÇn~pÄdtق}‹¥ŸÔGâwQ/áUR¡®Yz!È\ØÖ`3PŠé%]7%ŸzC=Ø&ª½¹ŸvqÌÞ0"=̏p› >Ýç!!tÓ+h>‹CÄëµPé¹küU(2öºUÃ3LE ¤˜Žœ+Ðó;ÜH>ƿϽhRÐoÈb¯i°t¹kZd½Áu…Ÿ#lË!٘ » hDÄ͍€–þúÚÔd Š€ø¸Ë»LÂ\†tPä÷š¨®l¡âônó7"O72n˜ðhŠ$¢Í W¤»¸ûs5­ßŠcú»vʾ@I“(‹'œ>ïPô§ Â§ì¶ >¶É»ô¾@ߙ!“ßiÛח] f Âd¼Éu}Ô†ÓÇ(ýèù®s”‘;CáxÐ^nïÁOȧG2z,ɝOҟ»\AXƒg¾/‰‹`óOë ‘ B¸~֕Àò숴È!<ê3~RPÏ(¦‰r0KR¥?Â$ó¢²ÈÁ,%~l|‡3¥13*­¶p£«â Û·’ÙÅE•%Y‘úVu‰ Ê+‹Ì9ŽÑ)÷¡Àw– +P›ˇC|ă!Çâ' }¶)éœdHª¿ôhµº+Ô°$‡âùážÐHOQö?Ö)O€®¨¶w…0¤Ãœ’ƒjIn71þS¯# +Æ,Ã^{Â!Ñ[Oœ¯~ãڐ,‡ ©Ì7¯IiA .®Ãc+òõOM**†Ox~`¤¶ äR•D>A0Š½5¯M‚Þz¾fq¡.EÊÓ°‡Œ"’Nµ…GlïdÖOP‰þXøÄgÚfïšO&_TXÐa8JUÆL´ PK‰ã¼è0'âT»¬ .ӓú€—¼»-Lb´n[^6€îu<ý³W]¡ož+™q]Ãl£ÓïÒ×¹J‚ÅîW IŠ¢R‘Åš +E¿¤FQPÂ%è¾÷„|x+t:ðà³½…´ú,®§ t™MÛRFNe”ù[‰Ö\¡€J£˜ÿŠÔý‚+OˆÓ2{h(®£‡ è0±`VŽu 2ŽðÓª uÿõ¢ñ<Y£°–O¸¹G!Q–Ûåp [¬°,ã³ÏÇ`"øîi³¼",$8ɇQƒçþó`0(oÈ2ì|”É<›Õ@zJQQãµË’,ÜåJÊ9¬Ð@|ƒJ|ÄR­”ŒÀ£Ø!ô¿Q kP2Z?$\ˆÄ[K\ŠNuö­ÑÏE÷I<åæ4 +®_»•ÌÑá¬ø m0QÀ iºÐñ–(,CŠÎK?¨³Ô$Ž9Eµ@Ip³¼ï?…SZAR®p‘õ[xÙ"$ã]ìîWù­²èH .ƒ–BÍ‹}F>yî´¶qT[ëñÉ"¥ÁAm¬½\L¾´³1)‹¶êÖTüPÜ®f+&QȖ.3:&x5šÞýÐkE¥’Å>r«LôL‚Ý‘5­0–z¢ òè”ÄIŸá|Ë5€ cÑ3BŒ+VÝe'£é‰O¯f)èK{Ö-`2XUöô´3'.à3âèâ|#SåÓᘕ\ód”m£FH lQø¯Ž¼;q†á‘£tàlð1Y¸×ot£\çQ s@Öø¶glóaZÑåñíæa܇¥—bì‘Z”,×T“±©‰ˆÐŒ{1#<—" ூEÒ܅Y3ÃYÂpãUd7Ïðå2GgÞ±KÝHo‡o¢•e™ÏQA·ëàúï +ºü,Ú”ϱÚ)FKÓ=›„²ª(ÆPŠ ’îŽ,ñˆ9>Q/€Êw¸º0¡Î/€íh¹ãK).à—¢Å”‘yú@$™[ yLÍfF·‘4æò"¦§-3¹ӆø+Ù®ÕNª6Ҏ°¹b‰¥K_J¢õã“M^K"}Ìwè92ëî˜J%RI&;þä_žâd‚aø4±8㬑tsQ)T„ßg¬Dm˜z ´¢<\½Ç¦6W؝äUÍ͕ gIûÅR™ŒØòȵÇŒP=Ÿ”KÖS­-aö0p.fvXjܲq½ÏXø¥÷øYæ›ÃĂÔZl«:ŒÛU]˜'r©C:~¥Ï/P”.û@ñº6’Y·ú½R ~sÞjGÙiÇ#õ5ÂyT3>Q)àÌ$¶xíµÚ¥¯ß»û!#M „—c²ÃãkoÓ B*Û3,Îç¨/ìRýVoâWœF^Ž`3± ÁRYÊi|4Ð-dـ¼xP9ŒŒ¤ÆŒd±xÀS•HNsÐôÛ/ Vðiå½ êŽ“!FRÅ5ÞMòV£JŽ,¬kAHŠ­#ySݹ–v>¾xÐJ*3'Í«y¶õü“µÁÝvAüº± €å 9AŽŠ¯§ +7Շçɋð›t˜ÄÉÜ}ì³vê pù( I\øét³´Â(i$¥ggÝ R†”­y1;‡#ðú‘× ØÒ½^©fŒ;JV›Yä0ÿKf„)ø‘¹—­±ò(Éé?/)ûÇ,Bó²˜l5Ì$Kxà?¡E0©ë̐Ž¡xýy×Wýò££%p‹ ÙÂ4hyjªÝIÎ˾º¸ æIæýKz>¹‡: sª#§Åß^‘æ¼$œdcK)Ìþµ_OsnÓ'A +Y•¤íZғ'ÞƂmtÀîQW¸Aҝpـ¦ñ$ËaƒÕÂû’Ç~}‚’ˆ€¦Ç endstream endobj 132 0 obj <>stream +-hãÃr ‰l°]iliüy¥ÙÝDKKUkó‰éÇÀ)†©‘æô@ +’{½#«­FêR'û9ŸQHœÑ˜ò÷•ãvt@|82C›¥˜ƒá€W­1U¢—Ì ·KqŒäwC¢Ä¼¢À'ä¯]ÒÀû4ÇK¹X}Bj}A/o¨õu2.0ˆ«ÚH3æœXD‹ÁxI¸\HŒ[hÊd')šN{€r4ΑKˆŠõý ÍÛ÷ÎUeqëòå¬qü.`½ÖhÉØ¥bY£#íêäçØKx)©¥ø…ÕD§qŽc¾¯Êüês£rŸ VñýðBó‰-^x;™ä~À»Ø/2L8V¦$Íò ÑÚrðø#âé_ÏAHxa õ–Ö:?œIvÜ+RR÷ᑠržH 7²òv^Ç×üqì;žQ+8i}2—ýŒ03]3PJÓÂÂ-Uˆ}– GZW×jˆbmÒ¼Å3e4$há`46¤£oYñ`Áj(΁¬ž\"|~®A Eú†¸¼¤*œL¡w)Cø]¾PèÛ§kpºÛzBA3)NS¦;è£P©O\Á‹€€±RJ1N}xž¶0¯ÐqøZ ö¬LÂÜêBžOà¤,št8xàeN¿À·/§ œ,‚*8‹ÃŒ.A§¶nÓý=Ùqæ'AN¶ÂPà| ð.àøÑ ÙbžuÌväB9³ÍA†*1¥¨Ž’>½p]Oq%3¾Þt¿?™aa¼²Ä"PΒýKa©V{¶Kt²bª:IԞ2e,ÂÈòÆÄ-£a€‚ÆGR rD‘ fY»jZkcÐU0'¢òÎþ ±êû*ýÙ»¹¸1Î~yïÂH ÂÒµZ ÔUëãDñ2»®µŠGœ8fÌ{s™‡I’ÃP4›tXg3_”€Xç·´¸E•1°P· <¼W’DCô…‘¤Í\=¬r4-J¶š9£xG"Ù» ֍K.„u¶ä:äYªKw¬žM2 a’ô °KY"·‘ëD¦ÌfæcfQ¼@$øjt¥‰›ÐÖOdö„_…˜.ŸU £Vw,ˆ0Œ ¡eØðm©çÆ´B y°…@“üßBym"àÙÄb_ó‰ã•ìŸ[h5z Œ]~ùˆáéòT7(%_“¡†#ç#V_ @Àd| ÈÈ·Y‰$ª­0߁HÙ±ìï/ß ‚ÅhUœŽýka›ÏdŠThøAW÷œ¬+úµ¨~©™SúfEߔIÝJ†+­¨½cy\° …D¤f­ŽÈd{h ö‚—¨ðú1ì5ù¶  C¿¸%?CâJóò@|/§9TY˜údkgæ­~íhà›9C”$":r§ÿ¿Ã‹éÀQAÑ XãÊæ­ÈU'®Vɖá­=’·³õûnpîµÞþmàï ŠÝ—ÍŒTHìBù8Šâá8Ú"=Fñº™¼H…¶´m¤ÆJ&Iý ôšàè Ô ¤Ba®þÉüF„LÒ.<„ì/œÑ.BÀ„GžÓŽò“£mÊæsr6£ÐÖGàA+~ʇfKçÏEÊôpݨ‡ Ù¤ó‡z'/ùÚ;)œK•`í¿Ô­t¦T·´;H/MUžvÃtìٗî4j›µtº=RT¸´­Ãô«°[û¤äE¦ç·ÓR‘Ø౞¾»ž=WW°vø1‹{÷4öC¹ 3Y*?á.2ÁiKS Üá°Íëjot§c!âƺÏYɱ¾öÿ2b…#DžöL–šÆ.L–è⊤ª0z¥±|ÛÚs *—‚;é“ i4eÀFG7iö%£ÚF;jL$=Sc0g+Œ~Öỹ-ÜÞ¢OTrOE»BÙænTŽ„ o €®`lKÍÕ7,—<;”‚:ì ÁZ+éF¢ NMw#‰MÃú¡í~ríˆÝü]"Þ³À +¢Ր’Œ¤Á"®Û^NJ0ݳTyx’¬3E^ÆüâÜ|µÀÑö¤f‰‹ŒDCµ“[çoˆåÝò϶»˜þ–Udi8ê2=®{ î¿ ¯ƒ'ÁK‘T\÷‹qÍ7×.ì ›…÷àxßÕân{½¼VɸMmÀ{[@øJˆ)Ôc…O«Ò žOK¤- [™a]Ýo}f UCJ +múӍY‹!É=d· pŽ#·Q±t’&_ª²Ž‰Ÿ+IWñ_p䝸*·ñ¾C™lɜ¬ÓúŠ+_}¥éÌi·¶ÎO[‰Ëí( MíÚ^Pâµ4ù·[i?ÓÚ9bKt0®@5ª+7úÎVþ6$¦ï\œÎZÚÁ<)E]:K¾èÕKž ¶ecì÷Êæ–‰|XT†— fx+ÜîÙ|HØ%L>ßX¡7¦h7¶6³A¡cS¾UFÏ9‚|ÐHøZ¢ë*‹pd”ÕCĘï–a˜{¹_š‘Ïä ó § ÎV+ÔÄmd÷ ïˆÉ໯×ÖjØõUeÚdƒbVâ:Ö™öξÃÃ)†5!ÙÅ OjÇà${{²Iy=¸)oÞÄ90§Àq†Žôv#Sd3:4(g‹0Ë.ҾܵËi`ëάÝ._3 ¡v pÀÌ.͋gì"ól'½m49rÄi‡Ù€ÏmÊ">ó{îHDÆÄ ³z vMځ9ƒº4à¾y°ou¹bÇᏟŽ Z$îåŽý—9¦Ï9_'ª+÷Ît‘ö@28ˆý\´]b¼â-ߥÑK]F0â.„í—ßï²;øoð.(¼Ä„#y·*¾…%ñï?ÝxZà®ÝÇ/ë3äÒ=ÌÆÂn^ÒóÈŠóòB÷Ýúb…fr:_|†j£ÌÔªÓ„̯qø¾"†5ԂܦþhªÉ ;DC~Æ,àxÀ:9ùILÕÄ;à ·²•M@Qø;:e=a–V¹þLV…¤üú¸é§r·Œêþ"A¸X™N­8G÷v^²åçºìOϏü~ƃyÕ"Ã(¥?kàb*ê2ÐF>êŒ ÑÕ4µ^‘®?Âî°Á·kX½©‹f©3? ýPϕàRâ`S7Ƭjîê~¢­¥0W“˜+”"aüº(™h¸Ëëñ8¢‹<nՐPÔm˜­@TkdeáHš¥ 4#3X.Î.J%5•Pœ‚xßòrtÂ®ÈÄÐ"X^އEÖ$hÕI“`òAOÓúß·;š—cǂàl"ÎYK…Ò®9ul@§ØëMrkö;Š1“µz{4Q|Ä$öPÍ4ÑõæÕóK°¤ÅË©X”G$&27T¥6) NTm¶.©Ø\<͖éV4!FÀÂÎ •/T`°°Ãe›S>^&µ÷‡ z6 +LdÖ +cÑL~¥ív‰Ú>f ü÷Z ͤÍAì¿êX8H¤G¶„sZ±ãX؈²jJ¦,näNõbÛS‹«¥d…p È ì©ËVs)— ‚ |‚þ›ýײB§MJ…EäfA™e•+0²pñwjÉM®×iþ?2íO²†„ê¥3¶ww¾¤bCTgi&C™²£1Ú1ØániöSzœÊ{ C6çÀy÷ FéR»›&¡ìÙ¬ Æà;‰¢9ö²ã-µÚmÃ’P2*ق²Àž—VÅ<•'Ñ0LšRU6ö›5þœ{z…üÍ—udÓE¼xKâd5%NT¿!Ÿ|›?pÂE»p “:ÀÒü;{k: ÒðzòàjN1+ùYÛý DÚº”„”ÇJ +!‡diA*-–®Ê¶JJw¯±WnU©Óþ‡ç}‹ÇÃ~†ÐÄI7!ækËKk˜æoU¹ÑÙ¬²Ä×~g°j’«ìè±0S·cNÿÿveýæGÇȇrå,·ZÌ̹?ӕ‚ª|¨y$SË  Ųn´X ¶z¨‚"]Ë)—mžq¼ÅM\»¼ÒÞë`h¨’OžQÅoä%ÔôêµÀKõ0˜¥S'ñÆú1ëC‡àk4ùŒ¸òߛƒrqU¹àöƒeu [JÐ(®õÿ˪O@‰žPTiïN_6ð°ìÑôiqûú`å©pº§s¥¸€æª1ÏQ#Œ&rË5>+šýÉҞ/Ãù áV^rGÙõ¯¬¢–9[Ç-J¹ÉhŽ!mG­xþ…tßYÐíTŽ¸´]àYo·¸îpù€¾µITËQü—‡R³­sZn?Lbø .eTp¬Yé ¸í! ®S™yW]5FáÀ·Ú—/ÞͨZξ‰ù‚†ƒ¤Öü'ñ®’èu«7¹-£~ü«køU+Î ‰y“­Á{T ˝y1`Idµ0Jß!•{ÃÇþÓ‚`ß:bFI«Ë~’`Ù[ +w€ƒª¹õÝ4ÉPmü÷PÇ@žuU¢€ÆD­þ‚«Ò`•§ßõ¼àNŠb¨/ËÒ4•„κæÁIî 4ƒZcöS_Ä·Ø­¨ÅÏõ¥­½bqò.kV8k¥¯+bcU7?eäÄ |œl>ɁÞý[‚/Ù HÎø-'5-VRUõ6Þk³˜?Ø2ü^] ¥EPN}më1L’Ʀ +Î3³úàÚfʖTé ±†ŒîUêÁ +Kb‘`0#û…¢ûÜ#Êt4—ð¾JÙüûøÔ ÑFÝ%9{lYQ-Ès,¾.ˆ+‹¢Ñ>¸l<‚lƒ•in»€Rzdð*2¬G#م|ísúc¾ DöuÂ*÷¨SÙ ¬ö_ %]‘7¶G)6^û…¨ðœéA™eˆîÀ¤«2¾¬xeéõYÔØ]ԉÞ~#'8Õbšð¬8^˜¡Q¨$ôG½™H­!µHž\Ð/Áx¿ã¨ÄWæH=£7 ˆ˜®)S$z®¥¢OÂÒ¾ò`‡ö'’_·nKѳxF=‡‚¬kÑ}¨]¿âÜë½$Ŷ™Œ»ÉäŸ*©xhàn‰˜AŽ¿²à(*GAâ^zÙZ®NI[Š‘ˆ]3œ@d¡A T|lÖn “}BÜûÍù¾UçðÁ9ž-^Mñ3ȸ¢ )j# ^¿â_ÝöEˆÙŒC ›•HxšÂhý¾Äï—(@€?,±˜@û„•í맋”FƒÍôxYDLwb ~ bn(·ÖÚޓ†Üà1­ºqê9wA ³Nl06Õý0S£gõ¢É #ÒXΨÓ³‘l§;NÉOÛ^L,Iá€ÓŸÒ]i£Ípkhtá­k²í]@‘î"|õwû-ߏÊX{?§J•o„¿*?ˆ-²vM‹éŸiïë­n;_ eؗ§ë ømg}R¿W¹s~áû‘߆âúº»Ë:ð¶¦ÇPŒÆï@PA<[éõÕÔ^ˆRÏ]2t :Á&M°• °ž×¦¦‰âÛê‰Å@w–ÁaÁBs…G^Æ[D:!ú…Á€ïÌzXu± Ï»C/ƒ_ƒCñI6·£m~Õ¼¹j.úŽtDA&\#Fy ³5ñLá[ߦsG ’¸MöÚ³Šq?6”ïħö8ÉñÇ¥Ä~͛cKÂ<[þ'ËÙIŸ; z€ðg@b1ü ·K]v*xÚºçÚ÷føÁ»\U1boïߌÈo?›í³eóÿ€Rb@7¥xE2lžå.SÀvµOšVÄq';ÛÉAó k8e½Á¶ôØã ÆÀêóðÇ»äóH5Ѧ_ çؖÿEۖ’\P‰F‚÷8xœ/®ÌNiT†c¡lz ~£gþç;'ÄÄ+Ã~.Ü­—… •¹tQc ]ºGdmTRüK{ÿŽ»šþa<‡]rçNm‚šIûÀä¸õÅо öw¿ #Þt1&T5 Û0ç%Ö@Òg©i»Xñ7<‰A7õ•)8‘®{6Æì+Ü‚à4ƒšöûö;°Äpz¼2¨' “,ª3±Ăª>nŸ‚›mþî£ú‰ è‹ Êb Lj’÷¨7ÛHëC±F‡à¢~K#³7\H½²#ÜU͖ƒ‘è³üÞû;ô’ÀQ ðúM·]à=~f“À(¨ŒÐxúšcƒè@a‡óßˎvŠÈˆÚž%Âì éI$Ÿ–Î׬b <ˆš;Tþ¸nnžÀ–ì`ñÅ®ÄԌšŽgÛ÷al+aôùº’b h¡‘Ê ÏÜ×SˆÈß:fYê£  +E:²ˆ‰¼Œ²]®ƒêQÜNÁ¢~’àD‰ýÅa'å.`‚‰2‚Ž›¡mµnmBº|¨¹éGy9Ԟó‰½e$ݚàßûѪda֋8 î +Ÿ™¸ê+n2/x‚w…ŸT9‚}°é_jqïÚ+|¥‘ïÔÚ|݉%U^p‰¯û)‡1Ó¾i•³c•&%;Œ1°·ðܖlâĀE?pa>óÍ&’ݦÖ b/¡Ä2.Õ폱LbñHTò0?X_‚QzÿXƔݽL(D‹ӐêE3xK!0,Òo´qÀÒ·L]_‡Äáú±¬€·iæï&2“¬5×& +Ý|ho”î`=/pÇþéÙxþ@ys|#9@AހZð͈{,Y¹=t®‘G:ޚ@«Ôˆú·; éîòU±–PWbN²d±hl ¦âJAË«T§À YØžÜìðÄ͜ŠnŒ–ô™g¼Ò;æp‰{É¥ H\@È¢°ëàmҖïX2 욤F<OXgCc½ºWõݱ“WüUd·*"…Ëô•B“Ì¢ ÛäŒՓÏÈaºÉeGMù嚗uïq®ÍÏÛîâÇo‘•îxT“Ä«aÙ>Ëü¥âãÝ>힧}­ îá55òJwËޖ¯ÙE©'ï„ñ&ù™Óɬ¾àˆ_wøێÞ?̚žÉŒIÞ%M»’{Vݵd:èÁ\Șœ øZ¯Kú™›—»±ËÚ¦T®n_ZúZSÈBÓ÷‚̺ïI,HLm0™“Ào«Îý¢I ¦^¬l›ÓĪƒ´Pl°ØÆ8Ï¡˜ê®‰•£S)œËSf´{ºøî]$É"ŽÇì±Ð—ÉßW‚¦s¸¨š¯Œ«êûEÎ[¸÷a +B÷c§ÐD€üS)v‡mšià=õ§A¿\4w$i—ŒL¼gµ8"æ ¹CÆ·N@¢ØªªM$ð²á‰4‘¦ã”u1Ó %»E³¤Á=6õ,OÆÜbûbæ‡+Šü˶M”>ËDñ +0iv§|w„d±°ð +1Û;˜Œ’àn‚‘Ž ª´Ïã"úÅÖ­‘‡¬Z§Ló{Øf´÷ĵþf\àCßW¦#ÊCTü0ð 燮¤Çw0¥zûNeAð§¢éH°ïËϒ0 Ös0rúÓMæ¢aq5Ùj+Ú¯Ñí²Çj¥-—æ™BüN©HŽ‘RÔ¨œÊd’üÊ-‚­•"̵ø?ãU7*TÎP|³¶XøÉ¡cۄo Žö¦DÀô×óњâF:5Öì@¿“Ýø7O¾ õV.ü…-y)hd“£±3]¥n¶gÈ4&ÖÖðõ;íˆbhŽžñ®“±qW@fmÈFÃÞ¼jë™ÉiÓü7µq¾ìjÒCçƒâ(¾H«ùP¿Bžú´–@'¡ö'¥IÆE§Y"Êl“DªÄ‰²õ¬ˆöüŸBX†Àå\Ö!šç×ǘjmíœý”U¾f’õ9še7™ExŸëYxۛp§á”™Ôì Èá븊a[ꥆñõ?˜Ô=•Ö_ðNæÂæ~TB§ÆÔX¤¬Å”Ö)!a6€§8K¬&ß«å/~Üá»zÐe#ƒQbVÜç8x‰Öé Ң֖da'FŸl3,þD}ç%õ³. +ÝAûçâ‰ÇÚJ'`Û삊“? YæÔÊ)å9B®¤ªœV¼žÊ”Ù¹t̾S‚ÕèèÐ'a½W‹ëšq:¸Öë}ȍ9vùÆãˆ7`YrG×\O/ZŸe43”¼Ì~Ï.A¸j°É¢h›t}§Ì}4w‡ÀcÛåàCãd·…è"ïV* ž«³RÌÜ3èZ¹~ÒÞåÿ’&/#F€,oî`/xGrE©RÁÿ|Á v¤ÈÌDmJÀPbù¡Ñ´‚y«1­Ct­±Q>ÁÒCUO<$ŒÅôû2¡…QoӇµî®hÎÍ^²¾0LùÁÑÀ 꽐Iªšyƒ ¸`¿½˜5¹‚qéšZ.'®¯ži—8‰!õƒ!ª"¨`(Ï»ñƒÝ՟ÁK㹎+ƒµÀVx7[SÁ¾ó¢š"•áÐ:”¤-+V„=ïå.®ö< ðßkk„×ådŠD‡Mٗ;œÈŽÑ–]x¦t|vZwñÎN@¢}SÂ[iñk–¸‹»’R9TæÞQÃz7—]}ùnÔ´M}ˆœ™0î®–C-G +Kâ>ì"¨ÉÓ±«O®m–¤-¶!j’Ï4Tyn @ìaϗBÊúƶ‹|`ÚWj’á€Ä1ä]È 2,*XW`óDÔTÕÁWÜ¿3"ÒPÄ1Y!O„>ä :i‹X‡‹Cô^<=GöÎQ‹ p/=Ëď²”è¿ô›¿ŠÑO-B¥ùFž*Ú=™6ÐÌ®ÑHF%Møbø)Q&ô.f](Š0ªb­¥}<%þò8y0¾÷ ±¹!Vóý´u ñ9`n¡’بg÷S%5®P.ØjÊ}BIdþ•°)Òâ_ñÔì8Ü‹wØ k€Ôg`¶Xؐ#°&_È&Žšxú’­jD긞œ>Ùu´IŽ4½›e¥gJcÔ0/_–µ¹1êJÍþ‹ùÉ`£ì¢o›éå¡c7 m„ú´ë>g®á}´ŠvS8æ‰&õSBðÕ¯·ì4ÂàÙí L±O÷H£ÂIäõKµbeÒ¤_'HIãäáÌÄ£ˆàS¡n†£ŠËHAÑ4%U´¶u$9ª¸ªxõBX–x0þ҈äã‚2²d0¿j¥Üp•ó"#žA +üÏÃWH£E>5¡’®ñ¥¿`ÕÎT 7G*Ÿ3bÒ§§ße¢€¦ƒL6´¥hƒòµBù‚{i¢Ì-(„@ÄÚǘ®˜ÅåãQt£ðóµÅîªH!-%®3d`O¸u…@˜é:1èxò(„bT™&g³v½âS¨ÄA¤Jp:þVíʲ˜dõo¾3¦cê þŠ{l± A.¦ñÅӡ°Y¨ì³Äð¤Ö¤øíá_O'¢ÊÚ³O‘”†òi¢Q¹¢û/ÒÑôò/óõÈÙ°¨]º¶"OååWt:ˆnɯÈM‰!£¯Øû¤^ì =Ke&í›TrۖX{!œlᇐxÀSXvêQh¦bT¨%3ôäý» ë’%n0¿"áOëTIï+‰L<„¡]šYHót2ps+ùq´7üÿ°ÿ‹¥ëh1`¸å0m*yð±Ód™ÿ”8jˆ°ÆüÁZ¿Ò.j@l£+L\0m/úp!Ϝ‚cR(ž€…AªÐ /\³ à±Ììlôvøͦ¶ `¿p‰‹3q „&¡ÈÂñ~^Äïáâ$+Ÿ #Ð ‘m$ށ• 0;¶´ ÊX¡AdøÀ»(0¹}‘øjôï|YýJ¢MM`œžŠý4É ¤íãW=½…Wáцtñp(UÄãp’ 3ŸŸÔÛSmŸó:½óq =½u2óI‚ˆDêF¸ð¤À!öê2pöÉÂvw"bôA㺠9eÃÙlð†‹(W"{Î>våNÈÙmš·³ìù‰tv|eæÃá؏¯ŠNª΋¢`IŒëÕoDi j‘TqÅj(“fBb\QÉç4֟dMæçê"…; +ëD®è€/)Ä6 + ï 7´úºüY1t“†ä1äÜpË(¯‡œ‹¦Å¬X´]“ÐY·9]ù(˜À”L£ÀA€<ËLO·#ü)ÅŽÚ#‡€R[B®æê\Ù¨À"kö/§ÆzÚýڈ8Õítò—d„š×TU nVõ†Ž²\¼ŠzfÈJI`i8ËÜâ+B‡Ø5¬ºQ£?¶y¡!Œmý Zh'¢ßA,uy£´ÒñÚËq'€ +B/†ÝÛoØ=2s‚'mV 5!¼Íë\‚¦Cðh*Âr²¬ëîñZ©×%ÒPƒbÊðÊéLákÌøðÀ¬šñ+i-‹¡ªÔœ7±Ds§©rµgbúdž$fÒ`eD@Ê,Yˆ¢=a“”|˜ïT[9¡÷Š}=†tqãˆ2– ‹$}ÂØxÀ(ðÈavWJ ó)Ý1ÊÆë…?˜ç•ŠCÿþò‚TiAׅ=þdI?jé­ü`p=+2p,>xs€èƒu$s$@šÆálû -N¸Dà 1Ûø,Í¢»ÄûI¼qèŒ+@‘ŹJ®H÷ßÊ/“V_yüSßxW›x)$>"Yÿh:!LMo(FôÙlˆ®uâ·ÇÇ/3`ցC èIS0#1:«‹Ê%c&¿…õ¼©.F†Ÿ7‘ÔŽ˜Ä›©T•ƒÞMGŠEd´d’šüâ&Ý]@—òR©"ØTmÊM’˜ÖM52W±ê¢v4äQS@ATB5Z+ÓkåMS{ÖA‰vÀ‚’鐆Â@©KÉ,‹®ühì[cBz,о2½Þ‡ä²¼Î­Í`A:X EÙ ã)¼·¼ ¦¢™žÍß{AúÎo„TÓZ$'’á§ð¶¡ +~ ÒÕÓE +Éú´¶È™ðÑÇi‹Ö÷•‡àú"ۘÞvßÅï?6G‘ýA¸ ¢–¡¡×“çùˆŠ¾"³”V*L¾r' ¾…~–˱ô²ÿuº0­Ö7,QÐ0Iò÷p€²Ò’Dd{°€`0ñdM9DÏç[X¥ÞÍd¾‹B.ùA¾S2óbU˜MTŒõ³3@• zòó¹pž(€ùòBIR¤ö€äˆ[%®Âa“ˏAc•«üíeõ¹”tŠ¦£>l³ÊZ‘£¾<*bsYG®'ß^ž~?CG±kgk§D¢6Dæ³ÉL±ÜýîÍAŽ„œ›ÿí âᇪý…¯+²Jsã:r^6Ë»»/’Šé i egkû©ÂË +ya‰M–Åéw3}›½aN´Icç˜.PUòùúN|V:™s ‡™[ž6†´+¨Û„÷Jh¦%~ã\”J|rmÀ'3PsZ–Lèy©pØyqï¨ìŸ  +öj4D>fËvN7ÌMì¥Q®âs¨ïZ^ô1ƒb^ 4àÕ¨¼rZܸ٠+ mE̕S}›7ôÉ® .±r'±Þ1(Säâ¬aA•¾êÆùÄ6øgœÑñ„BmÀŸìªÀËU7m‚ÕÀs£m³÷ ·|6·ÍGö¤¡øˆ®š{ èXf4M¦ÍÜ`!5Œ lq#mÒ +6±6=ogH›+V0?‹1Ú¢¤d?¥kÐ1r¾¡qQmÄ#h:o~-d¦Ç_c£Afwµ€éDÚÜéù–¢ |šFó6H È7ºA°ˆ£,ìތ¹UŠƒñÛE 8s,*}çƒ@wÀ-`ùÈÅO¤,?ü`oÒÒÔfwg¶k‚'˜æñïÁõui"@š)bvèH…Ë_- ÇÓFE—–!ð ,5@(êm~ÐO]˜ÉZ ÿÛÀ\ß·}@„®nÞÍèZ½ÓuêêøZYbÇ ¹SK¥A/¦x@Yni&&TØf¹¤ø –ŠBÀÃß$ÃÙIþ«Qró ó +½®´ûTãýÖ­E1åb:_yÈäÉdžg–ŸS5;†édIŽrØ>2¡ûr  ÁxÓÖsòqþ`JðÙ¦~k2„‹þFc,öiØÆê#)še‚8:g¶Y*2+Œ5ˆ¬·ëG| ,{•£S£Ð£k; Û{¸KU¨!¤dX„0 +IÂr—`ûF×y‰õDD? ÂàÆL$|98¾qÖtA@™…®ˆ©-IŠ/YRrˆyf}p–žŠNmÇEE!Îlº’A‡Ï!„rü7 QáyåÒY9Ý$Ur)«2Zëˆãåæö{¸¿ÄO5¡ úR"I¨Eí5§è©8ü +@öÑGê:<Ëh‡]¡ÙâCEoF»˜~¾%F@£èåîÛÒËÄßÞH‘*Ÿ\÷éóÔkÄr¾Šã1rÁ&þq·dà› b¶¼)æ""Pt¿éNPa#†ýûÖqKù +{4 ÊOb—4ÑI"l…G 2Ž;Àa0 Þ“öo.tÑùÀÈPÂBŠ‰lI9ÒìÄ£OϗF~¤ïµ“ý[[&š‘nµÑ¥J9ú{ðãb# ô|[ט4~9r‹.$]Kœuó‘` RVéá*™ü¼]y…º àwD¶Nä*½ãÌOÚ Gé£q¼~¸‹Û•ƒg×õp0|Éì‚ã'OæÐ,L`" +ƒÕTÒÐäRNÈ)lGŸ-JŸØ‘0}{¤Òb'žóŠ¹YÜï&+<ðµ]zôèÐ1'b+t$*ƙYѼʤUö˜Ã"Å…ý<õy,1"9@äÏq¢ø€p¶Á¯|dȾ¿ç|Õý4_ëC›Ã‰ÎÈ"ñ6Xä­%Û*Œ¦Q%Xvœ+¯7FAΏXM}£0 +¯guèSWؽâ[LöêDq +­tŽv¥  iÃøÊVLò!ßgò†A™ÔéøãæÔEǤ£dVÉ©ÚÕdGI9ýqMÑû÷ùÈ0ntkÅ?Ô`k·-Ý1õZ&õBòå䊌¡¬Nd6 ÒRϠƵÜ8؂°‹6ßë/Þé k®ÏF˜ ˆb`Øx0÷BöÂO8ؤ$5éI‰B}O~Í•]S_EŠ`\?Á¾8¡õØ ™¡ö¼ìµ0k„²ü1X¥ç>ЧrÑïü”Æ9©89î3.fશX&ä“âScŠ†…΄^$ÂGÆÇ âÔ;&¥Ðëj׌LÝá˜â3¸#8KK&Hê»øÊKGi¼Ë•Z˜«ë tì)q™±--Æ0CêŠn™°ò«÷°@E×vîÈ'jâ«OêÎfM=Ì<.èû˜‡>IZιJ…5|:PKP\†Q‰Ü™uW^Íø2ô +žs 6ƒž²£ÀTVèÊ÷Ûé½h¡žeÇù"Á±Ôiö¯fDZНbÎþMr@?,ÈVfíMÔbä¼ÇÑÝÒ"âihëZý}ª"îçÉSߥ Q E×^ ³Õ³µ¢:²-˜7›Ñ-±úß[A{ƒõ€”¹¥üoÁi7~¦^7ã„ñ˜ Ìï%‹dV8u‰;áxûµ§¤ÍÌČHŽ\]7ëFíÊúí¦Ö±Ý‘HE3sÝ: ë¶H…¹è-Ù?0F5TÌ^2q0š–—ùŸÀ'Ê Œ­çƒçŸ{ž7O“Âf’a‰ðˆ"q3†GJ/•`Âä‹È5Ú«’²Ò[¼ +L-“&$'%RDNþÇ<¨jÚÙši¨5žÀ†ÍAŒfJ«˜µW¥%ªLj¹¢Š‘¬†cæªDÙtf(Ìe±Ê¨¬¬ªv`<£,  AkŒrÈ°B1‘—·¥Êaí353DS³2ž‰ lX«‘ S1AoîȈÔ„þœÃЪ™á)QÃT]W¶Yƒ…!E…^=‚² ,šœ¨¤Þ@¡PD +ÆãA¸  ¨Hpb#ᄠ £U—äÇO€êd‘'Zãÿ‹î\!)²íÔi ¾J×⠔,1àÁªŒA¯Þâ"/ÚÐÒà¦j×+êrÔpHÊÁö °V‹M!Eô|¦.Þ _؇l¦ÞøS¤,»û¯MFš×.:©ÒE$àÀªàZŸ„'S›n÷Nð#õ%ZJ}õÁ]®FŠË„Y÷9ٓH ·›â|ôʍ­WÌÇ«ë·…[Û³ ¨ÞuöËv+¾üRZDxªì!HF\ÖnbÞ­ë TO_hŠ\83Ӆ¬-Å>"œpl'Áùr㊌}b$˜j÷þ +“F«TÀ^j7G+!½r{”dä4ç(2~¢=‚CíށûdwiX0*àqÚM"Ib&¼´»ÜþqË ¡âÒG‡§+“¸\ò”ßJ »`D\éP3,LLˤ[Fe|ƒ? Kuë[^¨Øª@‡ýÐ)|-¥€DÞ?(¢„A?"aß\æsÚàZ4<\û?,ÝÀ g¶³j¸6£êÆMÂU0K0ä x‘SiP_1AeðTÈP@ÉLêýV}®ª¯P@A ëCP+‹zߔˤ )ۄÙÙà€rõѵö¿X¡Å3å%ÀÙ§ü^kè°ó„Ž¬l0uÑr«SX®D¢C^ê*|Ž¥:´àÛQIË ¤€°\•º9²RÿœdH`»q!¾_/d‰¡O3Žêª*ùßm,X–à&`šbXïÇÉU›MÀš(¶³õ½ÞŒƒ­ È¥ôm¨6¹¸¨ ˆ$$ésAÅ¥ ˜¸VÖŒjbMÀ¶8eäüHÎýdçÂ]yê òš¼>€l'8/å_-ä ”j®/Ùs’š\ôc1 w@ÂÒS/ÜgÅ(/FÃ%€ïõ`¿4Š-þµâàa+3t (¬rM°Àp[K‰PA¼M 0¤u•óv”-œfÀÂ%àíVœ>lъíEÀìç#€´Ð)Ý¿a“¯rx™khþjZ^¢ +,£˜ª§šØY%j™꾧ëófÖ]kEt¹]ßóøËV<h€ò¾¥‡¼Íy£ÆÅ÷ ‹8a:*£Á{@ +€n'÷«˜º~L€Ü"'//E!Ðß ýϺ‘œö¢8َ€Yüf&ÍÚßlgšŽJ&C@ñW«M Xº/°É ë‡Ê®ø\§“MY’ŒºL,F@du=2OÍc³MPNÜÐWڋ€pJpàÚ\é” üR‘M™ ߧòò ‹úóvËÿyïh‘£Rúùُy’tlDmjç¶x÷æ[Dʨ?m‡®‹X +ö?jM—v$7¬q;e«Ù-€ùíµ&@À%¸S.½ø­¬}ÈS> +üòå7æ•Ă"DëÔ1¸0üU6ªö1ZA›‘ÁàŠC€‡é&<ÏÛí^òCŽè‡ð€ÛP}~€}mWâ­ù› +ÓPÇíÞ!¨m‡«(‡#þÖXõg þ¸0¼ùѬûBJtÔÐ6,#ÒdP‘W>j„½nÙQ4Žpmúàÿ ¡{Uw{¯Aì|ê³Zp¡2ÉneR0ðí9G³Ä.©(CoúŠÌ¾-ÚêHža xwÀ­‚VkÏú*¤Ó,ÆÁi[¿æyè̈㋇„ÛÚ‹V2´`ž<*øX@@ô‹|{]éåá¿,סnð`:òX±%- _‹éä q.°ìSÕQ˜¼T¹gö*X$üÞݚ¸‚&æ lè@Àl\hò_ Éw–‹€bÒòÎɱإ6•ÔِK½jŸ8±º„—õh›N²,â•<4µ‹Ú²ñS°e„ô† 'ž;½ +’·U®G´¥Ó“ hÚrø€”òÔ°–á1.â Zc¥iSàXïtfs¼dºIôËÍþ(Q’&›Ì º¸ºø;<è2õ¿1² .ækdŒþŒQ õÉH˜X‹§ âó–`m‡ ŒŠ@2ÝðXÍÖ'²·‰©>² :azÐe/d¾ç÷î˜<^..4È9ÞÎÍÆL=ŸRH­@{^)™—Ü*Åɒå1ÿ%S>Z*Ê Zä4U€¾Tƒdù3<•°úGßg¨VQPN +Ýñ£é-êÔúÔÔsˆÌe}€‘ƒöo8B¡žp€jM÷•} }p«j El$drÕÉØc”o€bÓ}ÖMÑdýåñ½­'ƒÓçÈnÔ E´«áñ móÝÞ>´ûÐîR±r´v’ ps +t—JiÏkÀ¬ÐþÙ7ˆzä3”‰R|v°W›Ñíjè˜RkҊlÃ)£ú# - EãN:ÂR3Ê)B Ai€Ì_vŸ¹. iÞ?aŽ‰¦DJpØ¥u%@àL´Ô4²Ç”^óØm•¯1Æ־«Hg˜¨Ü«:*tÈFQ)áôfzòo™´<ئ÷ù¨Áf¡f z™ô,wß6h0èF¥mÒ¦fûåá›6 îÈs,ïùFU/º¬4%€S%7LaòáNuÄïw +àúà•ÖD 3£è Cˆ—| g ±ÿM£ôCÈâø)°°­|É0b‰ XÑÔÅÂà\†˜0R¬à*(¿ZŒëS“’p—ð˜¿Ê,Ö¸ÃzhbÊL৾w«G1ëäÔ¬Ú `lñNL((DŽGÑ P?TƱ×BZþ»Ãå…Ô¾ånÓéî‚“T1ö‰3–34Î\ÊëáÛ3ÙüGà(œS/àœzSDªiyPñJgáÌò}*Ž; † Ëj,ý²ÌT—Ë…ŒÑR“ˆ¨*¢%6€²¨§=¢ìš3ÌT¶Š²,µNRˆ(ž{ºzTÚÊ«ÃQ¼x¬… ÖÎ1n‚‡ µõ£¥ê„l°2%VÞ¯€ðçÈѶ›Ý£Uuà +P1½ðƒ.°š"U€‹ÿ]=ò„ªg¾ò®œÈU™†ýÌ åT +pœôŸÓ$%Gb ©ÁË`ͽõ§§çNo©½]Õ*ð8Æ÷Õ@Û6åYR€'´8‘†ñӕÄ©£†áéàâ! + ¢×sim] + !4Ñ I(@ý©cšÓ4ŸØÄÌa×2a# ¦ïÌ ^x€à›Ø +˜))æ –BÕIr`nßµñÊ6Á·ÒXéVÎM°ô»UShŒÕꖓM€‹ !¥µÂ¾ œ„ŒP ˜@`m&hXðËB€j;yz à)Ï'´}¬´iBtD‡%µ‚u7DÜ|éJFW 8! ڀò?—\uŒØx/cíFk‰ Fœ ”ym}òòÔúÜýFœ§4£A$À"#´ÃþÆ|l!¬hàêü]„Š7:þÌÏ^šÐC‘Šjà>‘%Y)"‚¬únÌ¿ép”£xZ¹øWÞØîY2h.âõ8Øl)xÊ-³ùªîiH×lœF€ ˜÷»“óOpå{÷B/D3*@ 0ÈXÕÞ¥wº kC<ÀÔ_¬À"YþI‚È!@³>÷Ì#H{å!.zYx ¥¦òe’)p«3É–èf!àhŽ5øSá €vÒ²ËO‡XŠ« €î ¹Hë?cA€PÙÃ4'ý9Àû/r¼¤ÄQ©€Ô7ÿþH …784(b}„©x€àªçGÕÒ~ÏJ©wÃ#à?Ê +}‹þ5ßûŸPš(%ùz Ó¬>€ wø@ÜÈ?á­paª]%2Œ…·Ì0’0ÚKj•µz\^òq‚»ä$3Mñ@ {äºUPÎcÌþÿ¸(pЇ)F%\á5€}öiåê·KPÖo F!nq€šRw@c¾M´ª©ûµ=sˆÓo›^ÊWŽ Qg ¾ ÖMŠD„6'ÄU` •Î0h(Vm[$|‰éâ°µ:mŠÊËåö C ᡝ&Ë[\7u´l–¬÷5ú +žñJÑEÜ­|IŠÈ—˅ÙN“·¢5Ñs[9?-é!“§þ¿>½²˜bð“Q¸ N:%ßf[C±²@^ ä\1cçvP$+7ÑëMˆñzy¾~[VÐ,ÚVuÅʯ‚(ü÷Ôa£'׀` +`VŽÊªGq K¾á³¦3‘À'VëÃ(Ùá†$j@ø|-bð ˆ(²özG>•­økÿŸG'ÎÝ®Mˆó.OÝà€$¦Oÿ@‚Žú`Ȇ•GZÛ®Ý$#8ӆ©Œh³8@ÀõéCUc$š`°6•Nžn ò¶ä@)”r˜‚ÆËlí¥Ÿ’`­š¡7#,×\³n u=¸¯`ñšh9 ÿ°&‰Fòvü»vè Üš£¯0>8‡ZX‡J§h‰\‚ñ_KC_’Ë¥CD‘Ó\  £·e ”ë e5kY{ü§æEº¶“4ˆGÙ ¡âPß$. ·~ž¿ñ6 K,=þ_µRrmÏÆ<H<ÔEE'Joo£Ýyѳ¶q85}±#:c~±:6 +I‘?èм)Gõs&¡å©Xš )kƒúUÐ-æØî«_OÐ4¨õ-CÆL!Ë +“k49¥M¼AC€åžT4V-uG @0ú&{憖€í‡‚-Ep +M„ e›yÙþŸyÞ7ȦG pAà2ÎÃy P“iwú˜è£™ ~£Sr?%èëS€ÒTT×`Ú;Öu&E+ª‰/¶ÊHë|ʖ”,U9a¤ê¿qé-½LN~)`:-Z‘…ðËÇ$V T€ŒY8rÅÿ±$ÙÜ+ƒ€¦M œÃ`G½”s\B‡¤?ð/±Æ +@Í°Ö¨ØfaíçtcNÎÅ(=¾C‰|Šµóїõ²¨è´nR<òµñمëõ6k„e +€´Mš•jLa·õFxMvÒ ˆo¤‰ G" 8"`·-ÆNý2p»µHîEþ.S¦T™L‚ÿòè-),P±ÉZ6:Ïÿæms1SÀUI¦Îåt(J@%äÁÊ<àõ€Ý9pÁ&yê©ÀGõK>I녁]Žg¸Ôþˆ '*‘ª¨€ûB–ŽÇIÛ$2 +2Q{6ïTuå±Æé@4»¸’V„Ž ‘¼‰ïTµwÓlðp7Ê3¸ž©ôé>‹•ë)¥Õ`nþMðF3èöGËÀ¢•Õ4|ß´Yƒ£Gºy(£@ ·´€ç5¦VW R‹zøa¼²‹bB=“{í•`)nú±0Ìþ3ûäE.‚‹qaü)d´N_?ì •0`þ%Í|ìDÛåa ìjwG‹]€zúÕ ± BÄ= |Ðk$Ô1cElT}aŸ7I`’  Ãðؾ§v­ìãl¬ÀG²¤æ¡ÕKß–U.‡$šn•+É¢`@ ÑI˜@V™”Û’—m>¶‡” ™xùD€PºÒlˆl8*Ø|è3 —ÿLÞK¢.!È##w¶¶žgÉ@D5c„72ë/*@p¤µ†€À­x8„á“¿`㞁¤æl‚ƒç©`/‡, Kšj.Ó/"(þÿm~Šá0]€”Wº%Àøÿ=ªÿÐ^φœýÿ> _‘‰þ¿Ù#¢@"дÂÿ÷ð¨™ÏFL%ÿ×RzŠè½þ¯«Ð4 +±ÿ·|ýO#,pÍˆú$‰™É6´Ilƒi¡ÒüÇæb¼E’VÖÿAæw‡ +f£þ…§Y1)^úÿ¶:“|5RËóD9ìN üÃN ÿGmïrße Jÿ ÚrÕÇêráÿ€¦H5ÜdĆ¾ÿs§hª£ÒDœæžGäÛ=¤ õ‹ÙÎç”éÑýsÄ(ð†g²ºü¶YjªËyä©o•ú°h à‹_3ý?h©¯sY.+¿f.& Òÿ˜ ¨i;öû¢á¸Àïý$¡W"ôóë_+ýOh">k‡ÔÀžÿ™V¸‰IBñÔiôÛ<0vkÌÕü_½<´7?š[A‹åCÓa fE"þÿnçkH×°F ƒáÿl¥Å'×à¬!ÅNø? +‚öð +pa00ä?t“»Û@GŒ(„÷þ ìþSw-ú$nœñ¿W'$-­l‡¢a,DWÞõøm–ð’ºVþC>f·Ëï÷ô µÿ»äq®NHVõ XðG£ïÇeŒÿé@ýïöðôô+Ð`0œþÓ)ã?—û®2ýÿY'ÑsŒ:Ÿ ûͼ8¢R¡ÿ!KZ«¦Š(›ßi™¶©Ÿÿxm>ˆÆ +ÕZÈEžÿcKGkÒöú,Iz8ÿÕγPˆ®5Ý꿸æ­*•!‚t4¿H[¿€®ÐüG!7‚|äâ²ÒyÓè$HÝüñ”&­4/A¶ób)ž+òߤéŸsQ\:´þ/Ԍ^bhã€*xü‡–Ç5Põ’|ÑþO£^"Mxà%mî­Kä öïÉ<Å(µç6js‘RM —ÿŸgtÚûÏ×ãÞ!„|î!þË8Sªú¼bᘩãwMfø/ç&:³O،®uÛ!zO= {¾#ëetµ¡C šLðŸwfôQøOq½øàp² Jè,üýGŸ-eÊíÚ…­ïï$ß?ëŸiïŸËÁôþ9&cdW`çÐä)m +TÏ¿ ë²lÅ7Œ‹Y]¦P"wl£ÎRb°r Ðî±k°ó/ý´Áž€Êÿe˜,_Õöj»K¾ÜüsSï&³óÞ²Ñ[€w’ŽË˜vj—Ä`þ¬Ë#J?Óé¾QGñ_[uºz<Öa.ÿ««ã=©ÙÇ»–ÿrö ®ŸÝ`±ü!7ýK—”Mf[5*ÿw­gZï«Gƒé\/åŸðun§çîã­9”3(C(àNþ…1:µE¬ÐoQ‹…CvàŸÎÊâOÒÓúãI!‡ÑØb DÀwT +ÀÿMp8žýŸ-úxÐý´$ó҂_=îìt²ˆö,I{Ã÷ŽàâÞ¿dŽ»(ìý‘m\ ¬=® Þÿ.oM`VÁšì'´½ ‰°&޿ǎë;]…± ‰mèöw^DÄíþÏCÈ ‚ŠÜeUñ&«/ö“pŒß@¹¶ú»kýN”V!šW€O.ö?¼¹áü_Àvñõ ,WŽGS‰r@žL´©…ônûG•+Åßï‚Ù¿}¢ r)Hòç¿í6o€]B:¦ ùÏx@âñ•yÌ7åÛÿÁ(-ן;"fÕ!¥ƒJ'È5jUõgò/œ©BcšÀvDÕiýžù¤‡ªÙ~ýáª9R˜88Dóõçüª7ýä«8AéÒ#%Qbµú/C2(ðú£µê•D¤TŠè#˛{Xíú3۔¡:ÙçÿO¢zR„=‹ ¸™ÍʇB©vRðiÔäÎt×ÿbªšÅ˜zÝúG¦êߪJ£æ²õ‡ÆíGX.^­¿9ÈÁÏ& ZÿWššåEÍúŸÄð‰8Š*ðÇ>pFZ%ýJô¬ëoh»3…bš¤¯¹ªÐ‹¥ú÷*ðëJñP©ï0Tÿûðzqý xú°né?y/#+ötAˆ/Ž”—UºZ‹„á&”'QCЫÇ捊^4;ƒ¯¾ԟțšZek•¹O(õb¢E–è=“šK€R§?ëò–y1/NTƒ‡Ó? ›•3ƒÃÏÁ¦ÿXóJ‹{°*12ý-¥ +¿h €W¤9ñV±ù´‰HúËgø'­ÿ»ÓOÑA úåôª¤p£é9ÉÁxN쎏bæG4ï?i)Ýbô?i‹þœ¨§n—ûOêš?÷§ .><àѐèÉáŽÈÞ£0BEŽ1¼s ú«Ë’W +ä•7>˜rPÊh +¿ÂEÕn؏wO’UZ™ÚäâÜûÒ.1œî¸cƒ ô?Äÿ,HAV—7ÞýMîϟ{ªùùó`¶ÅŒbL(³¸–??`¼ãx×^âógz¤=I!õ­Rn§ç/+OyþIӋïªhþÚé!;¥:ÅúšöçÕ¥¿IG篱žæü5ዜ¿^QP‡±açߒÅàä_’šs‰KP;ÅxbÕ¯1“ÊrÁ›?;1èÂy°ö#²¢ë'ïÌ;ßÇáOÌfæ?‰×î¥F©¡Ü’²W@K¨üØæ€õ®^B™?ê¯(b`çvž?våýÚQà°XIÕT:ðž]^þ{•¸f–MfG_'1mù“ˆÂJXßÅÔ¦#RÞÜÝÙۋ(RÅsFª•&,•üïê[ÿœ#ÜçMûä¤5+×ÔÂR/¯à†2ªòõ¦‰®¾–ØÌÈ¡Ê_iÍ}ž08ÿi!Gåïšæ>—ùÔaÙ.Óò?–ƒ‹5Wj§´Á35Ñx,ˆ‚¤œAäGÉßêŒØ“hŸ—äo‚šä‚™‘²mŒ#ãfl”:þù)ò‡<‘ó(‡^¯÷s™>»}Ì"ò×>ÕìG² +Ũ»ë‚>îšEüÿ’05¤c‡ýø_]H2Ol6,ÅÇ ÉÄÎø‡f•cEaôzü“žü‘¹§WênGF´všmíŠò“ÔB•}_˜àV*T ),§ÄWÓG0þžÑ¯¼´î÷Ÿ À™µu‹qˆ'Ⱦƒfq ’(þ0s^ tk¹KC7äHù‡ÂPmàohjΘi'\&þZD"jT϶(ñïï ÝûÏßKtø#©ÃO å 1þòìÒØ ¤†iö£Â‡0–ê´Ù¥˜GÃó¨}¾«øOV¦'o;2«XøÛ¦Qµ¬ãs0ÝyÙ]KÍ…?‰«ã( Ô$ )0῍É?™ª¼"¯’ïÜ !u_áŸgÇÞª¡u®|Wm,ªj‰o$ùÎýß¼ +i½p.Ò{ðŸ çøះHûm¿¿¿a!*`¼–{?•Ãöý!gàJ©£˜5™CºÌ—é¶(ã¢DÂzß/Ç4ÅoC@à¿l–NI<¯ÿðÈpþøöjÁhuMþõ{?–òoàûãm@Nc‚—¦ÿþ)H㠌F‰òC,à{º¿1ì\ÒXLšEM\¹·‹H©N{Å%ôý ó2Ã"fÝ}‡ R¨Ý<ܯŸ`•a¶ÈUv–6ÁÿK#¤½ÜòmÎ/+g Q¼hW;ó™TÅ I5iëýÓOzw®ÒÕx=ÏP­®i÷SnX¼x% )ù µ6X ߉•š³ ñ~[~nsþ[¶¦û±µ[èÔb²h7€÷Ç*„Ÿ¡•ÁflèÑoZ¥±Á”å5ùÂڜ3°„‡saê²í~‹£ó`/ZÂß -ëÝþ‡…5IWwìþc_ó@éÒñ/ of®ûé&«ã¸,a˜Í†ž»iÜüZ–ýNº­b¸j¥V>¢û±5Âۆ;~êµÌ6€v t¿m5­ýÚuÂsymBÂÍí)“ƒs¿nJ9d^ôŠžHf[¤„¿7ß(á_Õ~¹(ap + +Ӂ˜ûÃé³ë²ê"ŒìØ´'ÆjEr.MÂB‹îT3§ýŠƒuõÁ»„OÉýLQË÷Äk¾7ÐB7sÕ0î—L9¦´šR „+ô«R`\ã¿$ a›¸ß`n6mÄڕŒéÎös“„+ސäñÛs:Œcô‡‘p¿BIõ\á®@î=¿Ûœœ—Sc•ï·_Œ´à ZH˜>NìftZ Ù`ù <î7%ùï¿æwÏ£àXmÛ$õq/]Ç íÚsôì#ÿz·þ8ݞÊ9ñ#"1Ó¢$ðÜѨ¨a³‹Ú6È3k?û À•ÍAÆlŠG¼öÏb„/‰²Áâ_G²álm (vŒw¿‘þÀVûwড2=l2?p¨Ü-p‚¬;F€\¢ýÛ@è) +€öêòá•.›yö× ½G­ñ ¥Ì-Öc³ŸÚL³¿€[qbð‰s~÷œËxÒ¼µd™ÚÞòÕ˜7 <ã.A²¯íIÑÍHdÿóg¹ž&Ùß°`FÙAl•{ýWé¼ûskŠ‚5Aß­é[J,BÓ òƒŽžÌà 9%ûß41ºëV™¾Áþ•ÍØÛf­°wM°ŸSÁ?é(¨ñAF2¢ºþMN²’éʪQNðø)ø]8«½þð~Z_OeL@VPIì£×ßÀ?Tëmß\eáõKwæ5„X ú¯ê7pm€P€µ©UW×O¥Zᣈ¢ÜŠÀ_sýá6o\vƒÒq&r]×Oùj%¦/Zš•,ÍûÛ­tar`0š œfYꌥ8ÀY¿´ß·µì—“/2ë:âЦ:wD$CÅDÖßìôýaû¥„ýcýÙr›·¢l5F#ÖƒÙ䆐“[úXÿNȨß' ˜¥¹0}eÊêÿKGé喀`õ > +ïíäp£×Uÿ1j"1`Ü@®ª~H‡BUȉúÓ¤±~iƒ ªŸà§tG@èÔvª?|MqR2Aaré/V +W@'‹Âÿýˆ!h¯%µÛŸ;ˆ7¨#êǟ`k!lCýШ4Æâ¶ïËÒpwçӏNI §ßõN<ýåák§ŸÂEp½ït76@§_µJń{à Kpú1~ÎúVn󈘻¢Ÿ7(ëì¼2+›~¦šô}&…ÛíÞ'ÙÞ Û{ðj¤8”çÒßî[…ˆ¨1°ôÃÊ.UŒäٖ=‡ÑÿFÜlµµ”~ÚÃ8ù.Bé_²]îIw˜ôw~VhÖçOƒÒHú.qœDd3ÞIª–HŸì¶g-A!ýH²7”Co™%d”~ø¿@ºþË sÑ/1þ,ú“‘”CéÏê]((p±Ã"úª€èç]ØC?—`9ôóਭô=¥jAC¿jÓÑ{Šx娜w¿}»úƒ8ŸÈ:tNu”>Ÿ?0é¸NóBmJúµAºß¹~fLã¾i¤HûÛzDõ'o2ÊrÅôƒ³•È è7Lüo’ôC†.—ù笀þg¹„¬ ª‚áÿíSٛ?*Cñ}:"_ÆÏoŠÍ– Ä>uÎ͙.MŸ¿|/ôÊò–B†|~µ†/ÎóQûO-iì+—<ÿwžïžxþ•}n¤PZŽ ßÅ-¦°›ÿ…Óð¹ó‹^ŸÚÇÎ_Îb 4-¡7A¿Æ%ˆ$>øsLéüë‡=¿Ô~(Z‚4yo<© + ª[yz‰Ã²¥Ò_…¾(Ûó'Y€e¾ýæ#7¿" +?œ´7îhóß´@ƒÖãó¥È /±Z½†Íä/RmÂ)q͟2!2Í=ðé¶ý· —šj~ 4(û:\°xÞÔÌß7\ƒô|HÈËã™?'þsfþÕáògúT‰vYæû-¾±}ÿq¸œÛîb~ul›  N©i˜_ü %JH¸Š)О„´ÓÂÇóó —œGpµï„_*—½'L"¡9¸¼Êiî—éo…ú=Åل;ڇ?.,²>½Ôš~¸v‚Ž‘2*ƒZþ ­Ï9-ÿ1“-q\,’6fùE%ù9"Ôi#føYSü«ÉòsåéžzìÈÂXùaHÅ“[‡Ó•’ «ü†‰Þ¸Ï)íuD¨òV£œñÇ#üù‹ç Ëäòžç„ÏiàÄïáç€8&–_ØغKú.IØøóÔlæ½ÛŒ9AGT×ëéé6ڑ³`Éw +þ¹sUò““¨i±*ÆÉøâøsœ/¼I²u¾ñC»{º4ßúø$¿öêEýS9ªGþKÕââ8häp«ÙßV^ÌÜ.ÔfàPѵê÷@SˆÊÔa µ‘ñ¿¸N´Ð;'žRÁùü7"Î0ñ¦Þ‘xø¡ ¿™u ‘÷á71ï;b äW­‚+!;¾$HÃW=—Å%jÆu.›û_u + ÃA‡Ÿx–¤`_ªöjy¨›/ Ç¯ÅÿõãºÜð¿%ùæýº/¤WÞ ÃE©Èñof Nsc'è:a¸yB%µ™t4¼ Ǐ"JZª$õlIIOè?ÎFÎ¥óŽ„Jîä$é†ÌØøõ1¢ü½ÈÛKHSª@¿Áše“ß ²Ìøõ‚T6D«„ÿüÿT!þI[R'§UKÿ»$ñ7`>2j–Ö²ÖòÜ3̳Ð#p’HFèÏy?o˃ŸoÈÈ¥{Ÿç·U [L +,20÷ñèïOq°N<;ãü@UÌHò×™WÚ¥)þl3ÕÔ¤ ”Ï&ş•_ä?µ-@¡¾¼ß´X…þ»¸?ŠO8›Ä26?•ƒÄµÇO·Ž(ù¤Ü¸#LõÙÿšÂ²­{öñkUJñLkì`HÀ²WÍ~…ÝíŒÔáTO +âW‰÷¡Âöj‰WýðË#ÐÁÝòêTj¥¼—ÉWçÿ6Í]çړ¶u<ü¾}e‹›Ø̀.} è‘~ÎÊ}:̦ۗ[èð¯ä+{îó°¾ksÖVøäD†¿½>×ñBìOhPÅð—ÿEý¾ï c*¡a`øÁùU1ìZ”W1{á×2Gð’à>t'ùn…ߌ€A…’šõdøY›Òæùp¶¾¸µ;þy–§t7Þüš€×ØlËÍñaŸðPøÅ õ>›.æH'¬ ¢Ï„ãê>ˆ'”­gá-\ˆæó ¨]Au4Ùٚ]ÈÊHXÙnV¬™Ñ²ýՆÅ@øQŸËX RVGñÁ_?GÁ¿O™Vã[0w΃ÿ;²ï+ÒÁož^•8x:ìnàà¯èés_ Qüøu¬"ÒÏ4ø·#¤|ªÇ–ÁOhü\éî²SÒ ðï:aðwgûD¼¿lžò³È©ãê«àÏ?ã(ø™¥ÞòþMð×&´Q’DÁz¯ +syEð—]÷ù×ø‚ýd˜ÿ~(ÚÂÿ¾i‘)KêY­ÅN‚Uk®ô ~÷åÆÚ þkˆµ`—©ø½½?£ªG ­iË3àÇá{/9ç•ÿmøAN˜¨Mqð( ‘Ž€Ÿo_¨^À:áà‡Â½Y~ío2·¢…ü÷ƒ«Ù›Üñg‡Tÿ>¡ÇfC-šk?úûIÆw/0†ÎÙö]` m/s£SJE"Ä[á~,î0vYZÇd)”G§W£uõû"ק+©×Otl&cy9úý½[ïq\µÝšßWÒÅÙ<ôÙ¨¹/¼w\XuÂ¥¦Ö÷Ü¤Ìð÷Eð7¿œ¢d…é¿%LOÌûÏ^mR¿BKÖƛ?FÊ .©oŠ‰j­Ûù¾‘¸-É“Àõ F'ãûª 'z›ÞŽ¢¿ûxRAVëüãÐ÷¾ì‚“L·Œ‚èxïwZ¶@v¤÷¤(ûFªØÒUÝû‡¦³qïO*ÚQ¬àãþcMbry  +ö~ú±ú-Øû»x¡E:û¥¹}&ùœä¹ñÞG( RE<’aÆ™ó¾š + Îò~fݾ#Gò¨d§iIEžEðBîÂܺsBÉûÅA®Í"E¯è@,OÇÈî'íÛLɒ6߄ýÔÚ$_!xÿïG„˜}j‹<`͑Œ}…ÄDïþ£ÙÆNÅ»¿iÔl>Iwÿ^[TtcŸÓ6·ÄÍ]]K¸ûbaí|›̹£v_%ï© ^xý2?öós‹C…™CT" j_òÈÜç×2ï–ôrƒ 5Õ}\ÍññR,×kP÷ &vÑ֖]æ¹?RŠÓý.2…߁ÁT±Jªtÿ Óé>­îôŸ[W—B?vÏhó#äï⠔â•Ê°¹Oú”ž“ +]ør7:¥­¢HÕPÓ»ýA÷Çñ^µÌÍ?nѝXÂÜ_×&î%0ƈPN1[òFV=<ûœ«É}äW­§÷¤‰‹Öƒ¨Œ¿:©år¹O/ކ9|,ËqßÉ¢Ffþ"ü%á7®ieûÔ¿ö›–¨°R¥¯‘r5"ò÷Õ!ëÌg¬-¬-Å}…~ôfˆ !V÷•B§JOŠÀ#<¿€b€<gÐoÅðF”3‡ýÑyhÛß]ðù60UÙâ]*Jß¾¸=Sfù¹½±}͜%I™Î™=/û!pôöA¤¤\ »;ˆ¼}mºY®Üi–3þ‡ŽÁ¸Û/z â­>*ùl±yùN!«JA9HÐÜtûk½IÆ2:2·¿ÐäïÂRz§}¾ !Atšïpþpù·hr…Ö”ÛÓ[‘/¸ýgžövé¿ò(-Šry…uÁ‡²9ÂÆgû¿ü'Åïáß_¨Z2/Љ£fû›ÈÈ)ˆäÂQ¶ÿr'h9û(‰þ+M™Mÿ´¿'£¦$mã´#3wHêb}Ð|hš[½@ 6­’$ƵÿÊƲŠD¯ÌwOP ¤¡ø%nºömצ0‘æí²e¸öai¾fk¿` +ˆtA“ð_ˆxygÈ,­…9YígŽjw Tí¾€£­KIm„mTûâ.…Gè+¨*È9’¶G| •íl,Ž®¦6JûóÔæ̝`1.õ§¤}ü¥ÔÄòzè刕ÿ´¶YÏ íâhŸ9m¾uÏ4ÁùxPçx ]£ý½seDÑ> ‹? íw6Æ}õ˜$_~©ÑÚ-ÖF$ÉoMNMŠ¦³¯ÍYÆR•žË¡™-g_†` òþ!´õ£“–ÿ·úZɎù†V^‚ÆWDú0vטDqk:¦ø1æ(/ 2 ’Ì~ßɘ²1a¼Lÿ?l&®ØÏ(3]á[™L0û¢UéøôE ZEMŒÞc_ #/aÅoÛìé«b-(Yw‰4ÕÍÿ H™É>V³»‘àâØÜðfaz$û&T¶ñ±Ù/qIè–5toNfÛMÛvb’ r>öIôœ¯ožzmú1à¸=ÆK qz]öIÂûC»râØ'ºYæ‡êûÉø¤ÅÓ͙jñIŒ}ûÍd ïBÿ¬<ÅԴο1ueïP6R³Ø?‹è§~“ñè¿Ûézx¿cÉÎ:€Õ ãñg¶Ê&f-@Sµ^`ò1†ýÂÈ°qj ûÚí£¼–•³Ö…d&Y‘ZH>]NÑ[Eœd¥½x¥'^áa`íjë”d +öñƒË¶Ed¬t}×ûv“û:*~§Ì¿ÌTC†-‡àfõ³öC…*ÚOXßüõµ¸êקŽÛµ€¼–.§Ÿìõ¡õ¼F÷  Cq´D,1Ð +¢ +Ûiýç¦ÎÞyiV›×“Y±ÌYFJwăëƒØSà®}Zð6áÆiÇ Ï'´‚… ' "ŽZq}^³>œ…Š—­ûì¡OÍ7æ0%‚CÝøySÿ”èë V5I¥‘¸ðfý2–ü!I$1´p}CíXÜPåÿ/×OŒo;3âI1›”Æq*–8ïao|E†{f}^ù¢;v„¾É÷ʆo[_-y<À[«oÐd§lýô­»8؁€ä]ëëžT„]m¼ÏhiHÕªÍÖ®&šò¬oõ—P‡Gð³pà®úb¤×òÐvM5ë“^ b'8ê-è+,K`çŽç%s¦¿:u¬¿ÜÄBˆƒ.›@q©¬T6u|7ûB˜^Åúí­FøØ&O¬Ù Â!<Ò0¡ÕæF:Ì:¬Š_RšҎ «ßtÙG d ÙŽÐ›äfA9ElõÏ΀>»9¯V_î_ñ˜ÅpJ¿Ániôwõ*ü…¾Y_YØçã>ôÝO©Ë'Çpw]k8ù±ê™+£Õ~t*Tõ[v¿¬ì¶ªh‘ª¯p4•¹|¼í|›˜]N•hM©>”âXé8 +$œ’‘Q€05¢úÊ; öä³à(ˆ« èFý«™â€Õ/@ØM{È¿ªÇ*BO)M +ùæÊ1΋5FÆ6Q•úpÃ}Òg-‹RÿÜ0I®ã4„çÓg•²ÒÐm<7ýC­Õ¦¯Í앉Ôè²cÓ_b •å +)Hdm?e « + Vù{eŽM;¤M?4;\~xL|¹þóõ„ógˆÍ7ŠùóÏ_zeÄf"¥ºí®ü¶Œ;ÃÏ/± ÃÊìÃr] è-Õ2*¦“eð[uÑ;bð®0BŸ/¥òÐI…s }L§Øct¾ìiu#ѧ©ÅçŸrŒôvO‰|~Ÿ½ç?éá*hhO9xþÛëÜ{.÷|^» ôºÂ.7@{þb—Iþ@±ˆð…l^dÙ3?ïÔǝÿÕÌ-Á(¸ná6ž;ûïïÊOL˜x>ÉËêo–Bfž$6TX®ëoêx>t·mDë¦ÕÎ:‰SÚw}`ßùwSŸ´D74‡xçç&ñ› ‡~x½Ï–hßH{x¶ó}ŠyÝIO½ôìñ [ÈÌÒ¸I¦u¾¸xÉ­&¶¯ªÀòIç«o·ì^ùn :ßÍ^f5ù2>‡g"UVr†xfE4,Õ!Ï·¾‡|÷¢f´‹œ“œ¢Ž1‰¦éP·6pœ¯ä¾Tš Ucµ7ø'èóÀûÉ7ÿÉW¡«Üi«½Ö›櫆ŽWîî `eƒ f>œÞ«|=``ÛÍ×ØWÙ´Çûò$õÓV‚"ӉÕ&Í>«[´Ë$£ÍeÏÊN€ ¢kø¹ÍðǪͶá+6±y§„Î|(^Õèÿh×JFîNó!±æ§.kÿÙñªÜj°š¿€Z­Âðë<¸=&Œ„5Ïa¾ÛpŸÜ<šaD`ðÔcÂ~wØøù ­%Up´½ç ‚ùfxpP/ëë¯öoøm¾D5SáçÒ +®1ì/_†Q½Jš=0Gž_¾q ~ÉJ¹@˜o«/?ÉÖ;ãå÷h'} +]jö«å#€bj‘åUò1"œ hœ@œ¹|G“6†Õ³™Œ„5i³Â„Sƒ.)¹üC‘ç—x e.iÃòľò‘+ؽz~ÍAÇ°»¼òƒsH„…›ýêGµåuÇ·¤äzåuw$D‘ö÷…Ó²ÔoRËYG¾•Iï†KU’¹EÍ!(ýguÑkaù悝‰HÊ ‘–¯\Ãý/Ž~køÊWp¶†¥c(*à•¯ÆZ•³ç)óhü9ŒE5ïèfåꔕ¿Úu~h2¾4^Ô> p“¯V¸F·wŒ”îB»ÊwöÈÙ)¶:‡ž×©é bì½ =÷»´—³!ü› bp7b9°?"ù¹Æ䅧£LßTd2bPNm@Êï[}k¬O1oaï*qÓ8d$ÂAþ‹Ä?8Çß%dü´tö}pXµ‡ø¨«Ö,"«‰’p{cÅ À'?É ý•;àƒŽÑ +è<äxòeÏCþøï_b'ÿ‘ 1‘ÍtG6ªä£d”ü~ž1¸ÈB_®^h©æ$Ž3Ì䷿ʈ“sÔ¬‹¹ËŒ¾¿@ˆÖo?ï¿ TÛ7b6y §c6Ôk$æh>™ÆC)¢ŸÐ t§ ä ùYè€ #*ò›¾ièÄÀΊ|eþ +:”+86£¸miî9å(–ÝC åWü‚[c®4…î£3ùú]衃=øžmq·Ý=ìÐÝíÀØëš\óbÈ_ß¿,œÒÇ{&Œó¾á$ +q£îCÒe)ì§Tä/N3’ˆ[œ^À!=§ºµòñ&'#ßÖ©F}m—çï2uFÊó(¶¦ÌÒ´Ñ["T†ü‚àÖ¼Mx”®ŠºQãú hÑiy¨¤ì Œäùøà9¤:½‹Upîñ1³OTý ùBù*†Þý͇T ¨O”|rÊÞ¡éڐ9+e™DÈ͔¹ã׌½¿Ô (Ï=e±·ð¤/¦nüGÒ×Rd‚`ÇöF¸ΓÀd¤˜9l±ŒO{{gÝð”}ÔñÁÞ0ptgT_ï õf;ìÌ²Û ñšP=ÞÔWƒíÁc…áüÌaão{½3=BÑD|HT†â/NUãëᥓ<|Nåø+^ïš$S’ Mhú,wþ…w0þjyš^Cª¡Òý2Žïïz'ª§;P#Žÿè¼»ÞöO»h#T%Uй„V»9ÎóȆO¼<[Ä +(³eb’™¿y"Š SŒ¼j§NPw=%z#WD·Ï €Œ¿þ"}"µŒŠ ¬Š Ë -°Õä—Û|¼;‡Œñ]–Ýçö“ÈHbü§¹ +a¹?ˆñéÔ·>XæTä»4Lž°³o“e xüâY½‘ZŽ“%º¬4Ì-ÞR.ƒmävŽŠ®„Ëò÷·j|9±×Í ÿsƒnèRnñe©h¢•‚$¾#®!Y~­g‹ïPQ.â;¶…ÈÓj²ÏvÏ¥ò&] ٔš#upÁØÆSûµâÇÕ ¬øpë܋_˜Ó;µm öõÑ÷’eᵂĐÄ>ÏV`_ÏtÒWÔ-áb2ÅW@¶Š§áºF=SºŠfÔAHñ7—΁Ïw‰ÙÇFñ1Ï(U1ç§ÂŠW0QF€Fõš^´‚Õ4[(~*-¹%o})¬@ñÛ% ‰O|ԋ³ °“{®‰,X¢¶„‰¶KÅtV-IGñü.ªºÙ .ñUGœ·#¤¿ÂÕgÚW:¡'4 \_¢HQÄÑáÓðVÁÓ ãŠoNi¨JA?é- ¸³5‘ø%ñû±R¡q$¾LPÀ*°¾v§Aø KÔ¾Õ#þ¾«¤pÄoáPŸ‡/œÚ¬‚A#~ë Ž.×Ü#IlŠøÅœ«'Çâ+¿ uOæÍ4ˆ´ǝh÷µÛ„y¨ =ÓJ¼@ü7ò<þlˆÿ"óô>å°ÿ3å­Ä‡_+¨=|ƒ6ˆƒ^Qƺ”,ü’’S ”’²,÷ï[4Û,ÿ§àð;”ãt2.”ßË>ýSWcU +²‘AÝmÚbœà†/eí"Q{½QjáÕÕL¸;-ú +?ÿ½4ke]x ÔþŽ5Úb†ßébÕ'Œ2Iö#ï¶þè#+(UÿSR5¿¾®LXGBÙi5³0|%8¼[Z#¶/üùw~>‘6YTTÏ _Þ3âºð‰‡¬]rP“Ðjojx~ë9°Â7y2‘À/¯×´Tრ¿¹±UÀœ9©·Êë5ªŠJ¦ðß½êӛ3%± 5ãx)üׅr¿ŽJ# âb…áâF©(|ä®Ï +¿P˜–kð{ÂïÀUø9á_W|†&ü4½3Ç®˜J$íºù°T2dœ?ц>‘ +7ÆH@í†_n„M8÷•u†ðQÌܚ~ù +$ʞ®‰]eë¥>V~ ‘øÀœèÐ[¢á„L|¤™m±Ô”Q)>ø¬ƒT"›Ê|º8eîÏ`Z…“ke3ÿ^KFQØ÷™Ý½”²çU^¼<ߙ/ñ¸`í#¥%ƒ*pMGVµƒôù^ðmø­”ìê+-eSâÕÂÂGUVðI±Hhž'97’¬zvbv.QøqðKnT†2%ø`Rí9“©EàÁÆY„#È×$µæÑÇ((È.w’Åǁ/ž÷Ýò•…>¥-tÌî3E]v2ðõõšÝâNXþÏÆrS½Uù5RñÛ¦¾Ÿ“z’úhï Q½A$Eàúû² ²yÀ³5wÃB`+º𵣧6µîd(%éÞ&¿H~”•#QJùm±Sõ»Ÿ#?.¿}°8~ß´é}ð=Já[ð‹¤*#>P!.¤Ÿ{¥“e[ê&ö ‰£‰ì…Z¦ký÷ªËÄAfýþ‚÷=–¢º÷W·DYäk¯w·¿îþ£¬B””,],ý{…IJç±”ßF(T11¢Êž†ƒø{º& ¯Ÿjs»ƒ¿¿ž2!Oðìi~ 1ßëÅEè€ÿ­;öûZµ@±~oÀ;€¡Ž“gÔ¡vP‚ŠÑUú½^ñwµ¯ºq*†oßô3l®º^ÍÚö‘4 PkÚDºŒ4„‚.¼‹;Y) —¨w*&%'¹k‹ÌÌ?}„®ªí(L%Ùúf–‡yîNû؇ÉŠrwk'w3³ßL”W‡77wOÁç=Þ¢R»kW¼ÿ±eߟûÃÃ[4¼‚ÙNO :`„ª¿ÿÿ¡¯ª*œ +RÏZU9ÖÅóÍØVaè_uJõˆÁÂc•$‡F‚±–Æñ–±’Ä°éÑ`0b5$G‚,kA!-+IÆ ‰Ä²B`,–¨ä¾Óÿc@H< †ÃayêœL0Ht˜ˆ|Œˆ6HRDA Ã@1ʌA¹ˆðPOÇA›釹J( w„œ†€!£`IðoºÂ‚`dSR$Ç ^†1H/+BQJ ̪ëøÏ £ø…}"/¿ #Ԁ«+v[`Å Ô M`Z0íOƒˆ8'Sup¼®bT L”93)™»JÑ‚îtÂ?³_ ¡õaä/Jƒ²×ìþÜ ñœD',1 ÚC‰Á¹(4´a°ŽlÁÍõÇË°ÒSÜNE JÈ1쀿òhãåٗ +ð:"q +› =Q@í~‡ñÌ_†ŸLݚÍò7ªsÆÜÀA: ¸Ú®—™v\ℼqúû¢‡o<O¨p Ð0pí Ò°ÁñQÅ!Ã@]Í[ù,~Ê7ú³ÇJ¸?–yñ?‹›d¢[A%O/ ڑ_ØY$~ˆ3À‘2,ü¾ìBq@m:¿ýpldˆ‡ Ð{IJ6êâ×óaÐæ=V‡ÎºoŒ€H”›ÀUµ@ÛÙ¾>¸½Ø91½ƒ‰0¸HLzoÌCVƒ +-›[¡TáMœŽ˜pÌË}àƒÁˆ­A„ÓSZ/§î2=ÝaPAÕ&\ÁŽÏkÅ 8 ) 7/&€?ÆX»¨–€®î2,¿HuŸï¶À +"„}:Ø+I@¤Æ2JÇä'Ôw0´kÐà;dªt‚ƒf™-V§)Wì‰Z¿Žƒá¥l !©XX„r-lÄq¨[éԃaÔ¾¢P¹ÄO€Aÿjü‚Ú’Ë¢¼}-¢T Ãޗ¨$ŒÏú +óÝã_phöÑ$»å³¿À¢Ê" ]<²\‹4=¦ +AþÀª$aŸ®ÙŠ_P>*‘æu0Ûà”¾å}AUŸÎ}A²ê·"zÉAû‚S´‚=`Ôé"ìý…šúí¾wã[_ðµ$õUýK_ûÁlí·ú‚RŠqÛ~‰;ëû¼•Ê¼S\.2½ØÌrÅ`²˜,i¹¾ÀÊ¡ LíÔRî{¤þN\ً÷‚i *Ô\°­MF^÷‚Æaíj߃ÀÕÂo¦}†xl¤¥=t@°½ ?ʆCš÷žõf–5X Î g{…ìH ¹[Búœ…“>>h {®P¡o—›\3…g¼?Ùäá@ÖÝ"%Ófx}<{$Xì)=Y–vày‚¦·ÉE¹ã¼ v”ò#<øÏÔ¼@àï§á+%9Ô¨&Ú8þaø~k°õ„/8ó<µÅ‘¹Úà N¦ ¢@òqr)Áå¸)^ ôx³áŒ 2°@¥)q‚SMÓPÓFxPÐÃô[\UHMÈ@v 2yÖN9žÿèÐ]À»l¥¶x¾‚9üÉ>=u™º¢Ú•kÆJè$Ÿ˜]à  Ájš¥´#»‹~Äþ@¢ØÙLR3}*€´¾q¶× vÁt€8jœzñN„ºŒo×uD‹êç‚\/³Žk¨DhQi÷P7â-ý¯V¾>ÿ"±Q°ã•P:Êl2]ÀvgµÁ·5(]Àš¯äú_Ž-ž£ Ê2;劤¹'1‡„èFÀ9x3]Î@+øÁm“¤sA—2å^rÝ€s;-¤¤üeRqAŸâwۘþՏ§¹€›µcºª32øëmê&qy²ý( çÆ´Z˜§®rA¹æ þUh‚öÊjlMrÁ®Þd(gçj”­Ü(ïáb—C£Å;¸,®Ílj(.pÝÇ4Y²H\P»ðD PôšÑ_ܦ÷M8 qún•7M«íéÍ^³[à‡3&QÒ]‘ +úåm×ÈH À„ì•Ó'w?øøêåÖŒ9ø8òö„oAÜ +6ÑlÊ×@cOL>6ZŠ‘7ÌM[£³ò5º¤vÉH˜™b þ0e >§jü(ˆ“ïžÜ^F€TÄ[Ó Ä4H¡lþfÔÀ(Gtšù4W$y&¶.R°î[ ü‡IÉ,*Ô'”ÔO´2ÃûB ¾ÐÏäeÁ–”R$E’¢ô&½Vz°p>öËÄmì¹Ä³Àú½b©Ÿ «7B>!xî2ÕêÖq‘•.àfæEÓMÊ2£Yð*wöJ†™^k&O_h泘¤Œ‡º+e¼‚Ãå!Vª 쿧b<¾:Ig@š>ȂŽ' ßéD‡SI +¤=‚P˂äH§N´$樂ü¾‰D­ÌIyý¾7ãÿwô7# l©¶®"–áPSîíØ`.|,02ÏYø™¤ä±àº°H-§ƒjÍ’Onø¨ß_é—ÿ4ÍÜ„Ä‚‚Žeèp‚¿I +uâáòà +1À ¬·1pA»+$c6ã‰fÄÝM DŠb’Ž©:xí@(,¨p1Ý0K! ÆWp& ®€•ZÉ +LFùäâmœ`AÀ?8¨àPž‰JAµQ-!/B—­ƒŽõqzË/¤ÝK¼ñž0Hþ +þ\•õòKU^@Kƒäl†~OiôDóp`+ ƒë¿¯$6H™[ñlû×"M "]lxÔLø + Ú<=6°X÷ +ÚÕùVݯáõmoɸj Ðòm¿s¦t œ~ÒukþñP,Ρ0Ö©X»‚œ¸»–Q°® >WSWÔҐÐTßز¶ ÓÃ0Áü; yDy?sºöñƒËÄ*WpÔß̼kŠ\†×¼d§"qñ8âÓQ +ùÆ”¬ZYß ˆ+0_7ÒÉ®€ö%àN ®à¨$迲y†.ì¹Ü©:ˆšÙ°8úæ!¤q­àL«@äG +$Éȅ@xS¥Œ¹Ï|¨^ù3M€Ðdw„=™ü5¼hî„CcˆB‘Þ:ŽgÖX¢ªë’·ŠÓ€)8U+®ç¬Àã<.ȟοdًYßÏ·¬ ¿/e{ȅæ(I$% ]76„¶o#† Ë ¬ç|X/`Å#ö';U V ñߍ!»Å‰¬àiöÒ½@ïm ³©VËx _ZYaU@NJì*~6]5©rÒÝO"ËUРß5ýRº; õóÌùð°ÄUÁ1Ν„V” +ò$÷IêT,ûÁ¸ž•Ë`^¶!ê]2%OÉofMUÕz@?âo[äþ_òSv¶$HŒ _©‚Ív±ÚlàR8q‘*Ð}+#h‰Ã¨‚ú>® øÙр ¶ˆÅ¦¶P†åWôQƪ ü`îz²ç(ʌ%$Ifž +ªp¶V)Ô ˜)4– +äg~µ`P¼U*`6çm¼[¥.. @9Ã' éòŒtÛ0ödm0ó¯QÁ‹}‚”¼–š¬ ¦CŠ +li“¨ )çCTÀÿ“p¨ vÁЗf m´BÆوg¦Î„ùBýrâ€k +3¨|hË!…tÓÇT@ÎLÏRôÁ‚¿8ªzþ˜ì…ºhZ%¦¬¢ ÈSð«Ó‰Å‘žåUÔ´ƒd+÷ÏðpÅh¸Ô õx_갌ííH±ì0Ð)ؑaˆðyu"šæ8ñi‰€y¤ZsRpA¿dº7Zž¿8{•bË(Ó.sCŽyÁMÁŠ…~+ˆ€OÓ´6§oØ”žcШ7>ˆpSø2\ú#”¦@v3jl¯éÝúÎ œÞՈÆUYV˜‹¶¨jQcûRÐâ6©€OÌ! c*ӔµKùŒLÛdÒnGÁ›ÐYmú ßGG|TVxº¿G¨`œ§&D8 +ÙKöČBíPv£à÷3Åô¨QY¦øãíó¸yÅȲžS}@QÀ'³ O‰‘mŸŸ=¨V¯d¿/ãmDÁhl³•rçÀ£@DÁ‘a6—·Áb‘e(炸ë'ÙqBڛº¬èP°ßlwý®0ÒI"@ÆÐÙ·¦n +:'ïöõ³JÚÍ §¡àë K_‹zåã@¡ f[­(°&ñ±Â`ŒÙ6ŽõT‰—u-+ež{Éþñµ`𠠖†¨\ÒKÏè#å ]MF„m?ÁØÔNs¯ÉMY + +Üëkèæ5%M +JI–ªå<­jÌ”'hŸoçgŽVßèìËj˜>Þé7à2ƒ—(Ð^³[&ÏÔË°ÌwSPv<ˆb­†Íõ˜ç“¦žñ,—qVªöj ÷'@«²iæ Øá>Huµ[<%ìø6+©¡pâñû(ýÈœ ..ãçUIú\aå»"ý4`â€Ê6È'X2ì0öUÄá<±z¨/0êvßµ'0ð3§{¤ô Ò2\mê-.ë 8yݤ´eÌÀÙ °éÃyîD0|ښììL™ LT»T d!NIw f¦&0r&&È Ÿ 1J`lsFA‚ŽúH˜j™(”3k$¨”W¡ 4×jx ¸­ ”jz¤ûጁ SRû +`·»ÅÕF 7ý„³CB .Ù&8®)Æ4iB~žàâ ÖSb:?éür®iûÑ&ˆí\ÔYÎÙÃ_’(‹È0e] [y& BÉÜҝùëBÃÞ¹_$ׄÒ_…°øú â—YP´•š§8¡YÕ`ÃÏåFÒvÐñ#ÿðRM@}3rÿŒ=» &(ö/¶™®Ô-ÙÉ$ “Hldš¶¯jc’¨Qš@+Š?{YÊ!y£ ì#–ëéæ;وŽ…3A±ÕÇhAœNž Z§ÙL€•A˜J²ÓLàO‚6+#kÇ𧥧â2AÖoC‘'ý’ ±»ðH\jÈ__á÷X·Ã!Âþ†'ªùÒd” íAøë̘:»ßæ˜Àƒ Q$Ù;Ö‚:X TsáW¡ô™¸º +/[&à=à–KP[A¨KÀô3¸šÖL T¤œé€‚ 8±Ém*uÆP1ÑçZ_‚3 ÅÊMv$ÇüwDÏ-GSD{íÜ'_y{ ¾§g‘*-×Tó#XØU©J·'ç²Sµ¸úîÒáÜ-ÔT. +]Èe +W¿’Yr•§:ÛRIäê/eLãJà€$åJ°»bðýõb~­%h¹M-AaU¥%ÈÊZ’ŸÎT˜-;¤¼Ï™Û†6ñ 窚ËÌUç+Á€õ* p« ÜÈ•è-äpfáéÍ°;ˆWÿˆu%Àp/¥Ur[€>¬ZJ@ÚÍ`-%I軹2!Þ\%;F¦,á…]%˜¯áOB‰°2Œ«I aqíÌcú1ªJ…‘÷Ø‘Ed BTü¨Ù§zŸ¢CSÁŠu`©7_"uÈÁò¡Aƒ±Œ XU‹ü¯¥‹îY±×Üþ „ j "]Í(Á[\`ψO.&Ø=Š"5!&P‚.;àݦ@” äßGEAïÇò€™B- Ñbz¸>l< " +·“`KáÓIphä$1 +蔱€MŠU‹ßáMláçZx¤§Ý%%“@8•˜»‘ B$r/Ÿ 6’P,ÓÖЬ†÷™ß™$°œz-– +ø0¯$V/¼[2çv@’uªÇîÙ¸¼´æØÕ¦loKˆ +?8Å2Âњ +±Ç +ëHPû¼'1•àG‚cJƒ4˜¶ÐHÐæ n"wëýA¯÷ÎGR•àoZUë]$ø„XôiÍ/Ã<Ç,ì5¬"Áuā´é”É(€"A¹Û3:-T&@½&øð—$ÌŒŸ©/v€“íÀ1Qý‰ŒÃ43lŸžB‚A»átß#È \ׁîÞÿøHTbŒb!AĜrt.Š °tÆF䞝½¦ H ´Lý¨5zœl Á¡Çzô1&䈟±J KÿàO#âMKE–yÕß G͸ù ØՏ W 0[B¬ñâl8dÝîüBoC4:$…Åô´žÎÇÅoðlCËÀåO)·+Ï¥HÂݍ`@ÁʉFm8‡ÀkÀ¥ìsŸëbª.v*ææ…ñmA^Å5ØÞ”TÔœ1qBI*&sÔÊAGÐ~DØ 0tšæóðÍÀ´Þ8,ß´kOžçm؀ηo£ø5øÿÚbïì/‚HæíîÛfrÝ(Qêõ…1‰¥†£ô h° Ù»F ”¢±†NGáPÒDu U-âCŸD@Rµj»[‘¼“{I’Ķ´"êµR@°"t ¡š°†?Ÿf$JXQ?%ñ@Ão:¤¨¡t]Û§ä¢kÞ=ÔP­5÷6C§»ä:¯7ÃåZûOdo_‚&YõWõ%õÁ!ˆ ¼×û˜·hæßêíÀ{&ÐTGäÏź7Á@:á`ÁE0L]& œ¸EðDØýI:`Š™6{SÍA5fHA-‚ùaã8ó³h, ûâšoA՜A©ƒ +YÿîKó¥±*c‚싧:}A)ëôlѨAâËê^¬]P G6¸"襏$Íݐ @kЊ ºPcE°Í c7:À U…àÝ(rªÞÁÓ¢Ë*ÊVÞÝI( E Àb6êݙýŒ¹?!“R)§7¬Ó+¤Ê`ʼn ¶ÚD°Ë™&‚&՘dˆ‚¼` )a"°ª?ÚfLÜr#“/P#r%e,.. ÕKt@ºŸ®<"`{”{¸%Ą̊†q ÀÇÔçSŠY'ðLfÜý€€AìŽæÂºÊ ”’o%'µU²éȼaãå¥5Õí›3óN—ø “!‚Z#¦4àUh!DP’xÁ¥Ù}‚Þç¯õ£× á„'÷fŠ±@›Â,LªþþªPÝ$aûCP·­=óó@:Mô‚»œò]§Njº „>ÁžF›B̆õï”mX _ Ó|fÙ¤C† íxÑz·ªÇÈo‚JtØ1;45É ‘êC¤!à‚Þëo9€¨ú¢h‚C€dÒà‰½‚'xC $V¸Íì+_µ0ª ´¶(œßw OÅ_` âÜâ=kE( ŸK_52ÛlÎß1OA(ö•™+v°LBŸàtW3ˁËd?š ôFt׆¬Ê0 ¦4G‹Õø„ŠhÛÖ3F·¤å€À¿"ؚiˆýE’Àþ00 ^?“0׏ZzÌc($–]u Ó´Íáb¨9å3 ‚n Î÷e)5ːµ~”p¦iR’[*ÿÑ4}W9Ç@ Š9æ¶Ð‚Q‹k…†©%Ȉd‹¦…c؛ô= 8S4íƂ3EàÍAW¯ø3á&UOØ Ô M»ÎÇtï4pU*ßøàýec,±ntzYIàŽ FÝ$O¬€ î!¦ܦlkS¥t4ôT¬U÷bE ”ëNkã~ Õ¶¯Z—ji—™€ø ¯öЏZÿäùËóN]Ž´Itû(ȗ1îVǟ!@þ™1¤¦ý«…kâCâ®zœ‰¼$¤DÅ(·T•Ö9 ÒÙ 2Á ?@N‡¢ØÂPö~`Շ¬ç•±¦ûâ@„ðRpR'î+@2ö?ÂE’~à Þ Ä1¯XVYèÐŽ†XÛEAvÀšwš@p*ËjV}À1?´AÙ¼ç&G4Å?£óþÓõ@‰ÛN¶ìˆ¥œÁüѶ±õYƒÑ#G£†$7­¨T`±=ðhú•Tí«òê…Tà¬-È6ÅRhԁ%ë¤cȇ⠀Ñô2BÓs>à"JU;+•óÒ<A‡Û[îa©)~K9à¶ËbT!‰ ÎIŽt3øŸýƒUòyGæ³ ªÑòà6;æ {“ñÃ[A"£ hÇ;hØ;‚¯Ò@ +P§Íýؐ)7pø 77£æcZw_nÉlð鉯pÀ«Û>ªô^ÔjŒž7EfNcc÷TÕærÐ¢Æ …„È/bUkyíh{1ØÑ ˜^EÀæód¨_ÉC +z`gà9õÝJ¯øp¬ÕéëÙô¦¾P1*Y©Ü°lUrÈÒ·6½ÂôÀŸª·IÔTýä2m4€éë ¡ëÒ’…¥E”¦Ú̕› r³u9j’§1ËGou½ÜÏ嶬—ž´ N0ÎeÀÁŠõÆ2À@:ø8¨¿DfÁ»5Uƒßþ&¶!P(ÚŒsÂðv”èÞÆñ*%’< x¢qd=ÝJä6y*ײÙm@J6¬“¶¬ñÿ&KɁÒxভHŸî#[1¶…¬âO²¦ÄÅF!Ì3T‰f—Ã=šE͙à=¶ýD)‰wÚ/þ|¸ÿRË(ô7›•ù`x9Çy ó Q"æ®d®×/ÉÀw ;\â´×ց©E'Õñëô(ã< ã.¬¼$”Š +LÁÀ; ­h1º;àçŽÌ„æ ‹̯Tœ±Ü³eU§ò¨;ÀF3Ö7:ÔmûìkGwÀ„Žµ¹ìLíÁß{O<‰;@cµ±ÉyKºÉõ=µ¢$ }wÀf<¡¢ +Ãa¤œx΃„±F0¼Tû™Iš0v€üéœ0WI–øHˆm—`:ð}k!°JWy;ÂÄ5;¶Ç p-:ìòFA»evÀà.Üš¥È:À+>V¼!XðôLA;¹:°Í耪 À)\ޕYgu€ˆ!ÿ{=!ÍâÆi<Ľ+g¹2¯³:`ìrèK}@Jîƒ=àŒ¼ Ìö8³dø¹£ã“§AñÕ7wzX©„éʕIqTM¼‹Ø|;=çkªN³”Àw¶Úс‘ùV.¾>¾Û{Ft~A–ëH˜Žs*ÎvÎ!°bŠgæs ¼ÌªDùŒ[ßIÏ;ÔCD"ÝƁ—VVSþ,–(®Ñ΁ÐDæ+«Ê™É–£¹/-ŠûE^Ž} ,W­œÖ +³€Iæ3â„hP2$(ÿö¼Žß¼s@Oï×O¾Uã›ÿãfx§ÇááÝ1–VtÅ2ËË\zÊbn‘ÌðNq¹;QŽÿ?B1ƒ>è·À¬áÀÙíÉÔ[ž®&@ˁÊ&¸4À+°Î†š!,ÌA³r`«9š<ĵdP9P<ºc’òŽJãîBCu¿VYª‡r€#ßAUâÿÎg!(x¦’ÿ7·Î609`"þ¯¹°a”8*9¹!q—ÀY²ŠÖ²þŸ¼â8ð¼–C†ÔhA#l¸½–ZvÒ£e4ðà;iá`"‡ÄmIÐ¬Ç +4¸Ñ¾½,¨8À¸±âáš2·ÏÓ9Sž «º4q ²ñ3¡UÊHà¹bSE¯Â›‚, +&¬7ÜrY+³‰ó©ƒ8 ­ÝÒ!óÔA½ÃàëÃ9àrÀ±.8:†,ðu¡"“´Ößß±žP0º—Áîä͍wŽ ¹¨€À‘U¤Á @ªdyÄ +K½Èû/Ì 5¾c±ª|ès˜¾ÖÿÕDLÙFÓ¿]”˜’$øJ—3ó֘Ô3$[•ÅþËÆþ&ný´þg‚BŠC®Œðõñfoà0sªê [¡è œ¢rÄa¢;7«oÊDò‡c<ݨ= vDÄ1@Ç–Ö ÜóŁ?±œ+§nà¶ÓBÊVT5éôã;t܋ùU>瀚x"„òÌ ´B“ƒH@´0L4d”7Ï Ë*© ʍ.„ʧ wÅ£‚  bÛ@žÊiD ÎÐùr fÜ¥¬—0 ¡a¾µ¡Ó(R3‹'Rk@<ˆÑ.5æÅÚ?z ª ¨ÛÀ»Ë±†^ &k 5ï‘Æ ä½/ÚÀ(›ƒ6ÐÐ*«ž ”xBŽ=JêÜ]ή3âøžtÑ1Ù€½É+bÇoOJÙ@îMGÅ4M µ6 oa¶–À<é0E“ð6ÀÑAf4Q /Ør‹B¨¸N¹ì_D®b™Èih؆c[+³UÕÕ¯¸€s@×C»„U‹PO*׀‚H•AŠ®Rˆ½F@³=i½ú‚¬ÖÀ=¥óòÔ¬ŒJ‹Ö@aª|]ϔ3*ÈÉXØ¥~ù'ÌÖY-ÖÀ•×øúÖ Ö¥xºUX¬%OgÒʃûф ”T·SÖ¨„¬´óÍqŽ\;þgt}£¯R76®ž\©&áý^¤t>ËßB0 ™ÊŒ°¥¨¤Íå†ZT÷-M ÔèÛL­> ð$­JˆhÝ6ŽÓiàڀ¾6BLÃFqPß¿¥ÆÚ4 72ðÿö MaV¶‚„¤ï12™ÈkpÛÏž12<.  ‚qD!õƆíѯVF7ÍÉ l›,u)5ù<‘ôJ]2qȚh¥®ƒÆíÞU +@4°NÛ¡¦Ÿ ä•Û óa KÔ®ùF—‘ÙsG¸Bs×xÑ'A0p2 ¸on#ÄM±‘ú890ǀŒ!­Y3€+ 53¼"ÊNzJöT\X0š3ôOÐÏÞ¼xòÏHO”c™”;[MÌÀuD«”¶þ–a6@âÝã1ã3•@N +$ë'ºtóÖ9¾/v¬ú*/øÊ#ñ‡¡óŠˆŒþsÇá€äãa¼{2‹1aÆe Ö³¢Õ¤³d¥:~™NeZfËn¤bFÉ%ì|üø=L:…å%)ÉÀ" »N;~_–1ª2``閈×°:ä_Ÿ—Œé¶Ù•·þ2æÔló„ý¿Ò­Y›ù¥ “ Vó†B6žÐd@ÞU{“§Ê@ÍZ|‰2°pPóe® `|î–cf<ƒŽ± Ód> ·320 n#êvAdàòÖ¼;¸kKÝ-r›U-\Úùç2pe‚<£© Uá(Âè Ž†š' ‡‘Qo>!~ºsÑ&ðc€I4̝ €8F˘ÀÌrd @L§‹r%íªTބvíÕ Ê(iê»?Ec€=mú0zÊ( ‚MeÏP¸þƒŽ~Œ4Tˆqz½0ż×Nõ0\ h»Ü;E½t<¯MÆƀ˷ÍAÚã´b :è|C‚\ß!è@ɨ™‡¹”"o$ü¶ÌÒ|$_%•ÙÀà϶Ì]u"ÄÁZš¤wßï"þ·¡É5ë0@Jф#äØ0@%i Ðø““ø¥ÚŠ^ŠÉg¼ ›®º]\1%QÕRºs•ònGK …Aô=à*3 +%&j0° „h?ûÿüuIäÀ\£ 1ÐYÄ÷E ¦lŠpVŠŠäNVø:å àk‚™C30à/¯­d÷é`tÇÕŹ(–/Q² ÿêÙT°ÇqþP˜•ÅñHÿ3—’-ò9ã?ùªQ…FÅ  0pR4z“±<ˆ²;Üvâ<ÀÎ¥*½5”}w@›]`F<Õ°œT,¹b8¤ñóC¢Ån©^à=#%Ä4¢¸“/NJ!¿Ó“»VÀ>@/ü6$Ž¦­Qå¾j;_3•!p§l¡áf²/ þƒg¢ª¾ÀÚÜxàчßÑH6}ª Uϔ½7òw÷›Vs¼qk®Ä¸t¢K’û97“Ç™8r%Nï7ø8Þú»{/ îUthe®Z{^?uÐyì~  +x+Ă!'±U)©®“z•¹=8ç0§¥Ü°û³DNy”ku…7^ (/;U›•$>ýÏû„¼Ü¹@t÷¼©­\“p{c¢Üï¾ ¨N ÐFNâÜßS<«Rw\íÆ,IŽ‡hIÒº’Ô×A@±ò´Á€¶ÓÉ{bÀOÓúã±¥žY‹3ðcMg5*˜˜`jae³7ñGV¥ +äU +̎uFB¥)¡Û* J(=MvU—ÐõÂùjñ•ou˜ÞÔaÞFÙ{ Þ# ¥¿ËF¿šØ-Ð%$½€nã„b4 e«h£›…üÑÈ>äò}Ò·€E»Çª°Û:Z[/œRTÏ@¬84°- <‚¿þÂaː(K7ÝÚÏæ™o°pÄáÔÍZŒÛk².>k:ÕçÕú"74¬ E}Ö+!ôéÈè¯,—wŠ¯Ò²Q#b’"?–> œ +¡q#G-Œ¯…i"¡Ïá +›âž4ö]~dGZ >ŠSM½%¸/K´@=Ø6æ/åæA³Í¡k¡ªzdH qM!d–và4ÉS,zØÀ+‹½ZïӍ&”Êñ|F Ù +M#Yà@ª" Lófû)‹º p—> +*9ǹ^c®%1(15AÕÿúnøÕ^sÅÜ`×,Nƀh®³àÿ °@II÷W ø ô7…-ÁüºÀú +<׶ýmNUÛ«¶W` ˆþX9¦Ïü¤ÜŽ7µ9±|_„øÕÙ++D¨¹7´ŽIgE9$…ÂÙ#+à|wþaVñçÞ¼zÞ?Am +ž"ýw6ÞM9Ü5HO¸ +è@"×ÞnB((ڏ´¼­­r¡#jV"8‚ÐÝÅî*^$áïЬŽÑj#YI³›°j&;±&..ÈIbõ„ +Æò§8!”G˜RÆçDž.›ÐK‚ +t‹B?$X„PbF‡En³Î©€±I{±›3k*0úæN?ŽÌ¸å/ÅWT€d;WMK™&—1ÙÎbp =àì@TÀ;N±% äØnWi£0¯IöS`*ò«‘³ËêŸwm^;s‹O˚sם’–aïO’ Û¡.š†j;6ќß?Ïd™aô‰Î±Æ¢i §Àšó›së‡ÈZ±†á#ðj_'Ö3¥ÁPæm }ÔDUÇýÐMkóÝl?lÏf›ÒÀk8$‹ê˜  †kðtl•BÙ(àÿ+úøO\•ê6–XŽðð æ†g‘éÆT +¬¨‹Â¼[e²ç@Jüo>‰ ½mFޔ2@òäéem‰„÷ÔCŠJ¤Gg¡B˜ü[}@bFÆy Øk– Äë(; 12Gòւ“k𤀗I£€ÅמhØñ^fLBæ~„ì'BŽ 4^"p"ÉEÍ$ÄÐ$c, +”x<\6Íw:¢SA¥Ó÷ÁMPH1Ñié=‰£ûßIQ€n®i¥¬`©Ãu3²:]"j%È!4wJÌAv`©ƒ%óÝ>/‚\ÜUP FÉµ¹©‰¦à™d¿“œ& 'ó'ÀDꟓu ô¿"µØÛ#À²ú£†9’$ÁOÀۅFkÑï"Úo%Æó²êöäؘÃ(`žc%A³ì]Péelb7UA¨ª±ÏbÈó8ÍX¯Bž€6h:xe¢…'_;³xŽþ›:^ÞðÀÓúÌÝÛq*D“3éÃñÕùיrépé([´i/†NàÀ hJï*vN@w¯£éðÐÕDkº‹ÆHy9}XMpœÄbû·ò&@à ª·Aóvb?2¹fK] ž"’!b ܺDÖC'‰’¡ lB"Úv/¥¥„·¡)0 ñ,þV½€q‹jáÞrS‚w‹i®q{Ã@ŒÂÖ´(?& Šq©­Î—@*; +j8°ßzÝÛº6×Là’q)xOà*H`&ð"H½ÖS9ÓÀL·0_âZÓ§† 4@aç꧳/&À ?NŒY9˜!çi ™i'cShžd‰Bë¹ùoψ¤”OµÖðàæèÛÄQ½¤0ÜTàÌ°y£K |UÊ[y)È%°Ê +¯m :Îã6"¶½›&FÅn ”‘@Š*4ãýfé[x-jqú qü”j (æ(Ø@鞾ð@D$&¨i«yvvl‡çá@gªV lN¢ÂcR·M¾HUÈÓ³ûO ê0> \"øí}j ­BèžEíJBú‹8€ &–F!ð„ßóõ5óo½$E,òüª“bnL'XÏܱ8 F1äHê@÷à˜=V“Ñ$0^l¿" ¿Ëª÷œÈ,d¥Ø¡¿›JIè>ñÐþo¾ŒíaQ=I ÀßÍ⾜ d">koC#©•|÷‡›Ec1AÊ áþ±§H`‚0Ã\·4Í(OÉV„nà]‚¨_«lÊ T;"D1–7µæ ÈðK/ ́ B($eáà ð‰áñÈCµ×”]ÅT¥Fö3#{棪4`› Éçd'™˜‹"tdŠU7?ðS‰ Gà1´òq X +\ ‚#Òjm…ã™{#ð6ï#@Y‚瀲 ¬ê²yy_º›pÈÀëPpp:²–ub™PîxQ«]«-V¶Ó»27l´§_&L3LïÈ°HþO°"Ž§vý/ú,¥¦6F€‰93þ[HµÙ D#€xdÍnA{û"0Ç;6^¸&v‹€1ˆBçxt½+ÜÏܵ´ì=+ÕÙ£fB½€¼dd“§Ea ~³ŒôDàb1œ$³‘­y°¬&9LâQ’tΑ²Ð³#Í+ àô¢œÚÎ$`§%®à:!Ø%؁Ž›‘C>Ÿú +òÁî±]‘ÔX©®qÝLŒ?xåmrçC€ìÔP¼œÀé!°KØÍè™`÷“ÀÎÓ €Á¯Õ6ԋÒ[v„ {wWÁn]^;)ƒ¿V‰¿µMLäØ4ìÜê\-¶žn¡<éÀ þ‹5&íðÙ(”PÕHøhº… + ¤Œ†ôm:(†˜öql-Ձã<¼ä,A!€"ºxæÀ¹¢&åGþÔÉWNr(_ "– _ ò!|Ÿ„–”ÑC U‚Ä +Ô¶P.¾HI㈦Y€4Že¢^ F‘ÙOTÃÜG( ÍɎƒ%,ŒHëÔ#M,åP–±@ƒ¬‚€P¤ó¼Žb‘ Ʀ^qäƒêEh ¶Ä™OBÊ1ùAàlJú¶ÎNJsÖ˜­XÀ +£’X1Àß߁½oŽ w¡‰M€é@,ÑÏiìTӄC Ð*ß\kœ3;³0  €ÏÞàÛ)'/ÿq´LkúE•ç + +¯bw-Šxá㠐˜*û´?¤‰xÊîÔí˜ý€óù®É¢-"J”.¸öŠ~€šÌ0NÇTkóêðf°zîIj)Ÿ‘s:—N*~@2œ’×xY!í2˜»ÎRJ#œMÝëØZ Þü‘sBrðgÆ£í¦ÓÌ°µRMEHôÅL oî¼òl…ÄôP’ÍäôeÌÞn½žôŒØë7BÑш°4Eq¹8ǹtðý|ñЦßZ=¢Z í¸D/ªtVƒµ©Ûfd?ë’m³×o%¹Á«Uã}CXÑn [ ÀV44O ­#=À7h4d"jÆڎLÇ/â5pÅÕ!Øâ¢Ïz–ó´u썠¹\Sý¯r‰òÕØRL£¡D ÄVuHEUªé±´€t<` á›1 Ö8tÆ¢ýÁ‘àå)óÃàš;âg˜gëÊáÐV°á‘´´FpaJbpâ7Åt„&Xî€ ²·€pKv PÍāÕ4RîAØÊcºÙ‡j‘ë)¬Ø]ىì(›Æì*Rԟ°§)49Œún7O¹¨!¡^ã1qXgzD2aÍ8 áŠÃ5Vȗ§°x`BDт§ýi¼â'^‡ ‡`d¬(¼¤ƒe$( °o†àcb|ÙBÔñyVO8YQ*4¢®,i•Cܟä¹|I?°Š@ô"$ì€ï~í,yðû¹Îá’OÚ:>Õâ —µÍÛý$T„ +ù암œ|7"i|·”1 á\±Ì/v|jŒÛ”ÛmX­^õ¬àæøÜ6©BD=Ü5ýéð’‹=…䀾Ÿ=Hï9àý,hP݀Ž£MµÏȾ©Ë)ÎóÃ<´.=43Q'@Mà«ÿªÁ0óHàà_#·˜‚Äò7 ™%ÍþµùŠ1/̼†oDeü)¦7 €é‚ò‹=Ã~@h>\xŠÛ,,›ÆOU;Ü `‹2×è“/s×[£ïö¨ïèx„xm²^-™¿ý_#Á܀áPÑ{X'( ÈhÆjØÔom€˜ÈØÊNÔûŽ ÉZ%!¥ @e^ÈÍëB Á·Òf}‹Í» DY°Uf#Ðñ ©/ E‡Cي À؀á2%Œt¸z[ëÌNlÀxYR“dV؀"†‹š!DB˜É ЛàÏsœAªÅà^ƒ¾à%ýÝzîžibÀ<½òëûRÂ,I ¸Má:â㓙e@σž¶¢¥±= 8õ(PÜë~n×ô}%vQA…kô÷$‡0`?xÿ#=5S€¿±Â$ãÁψÂüóäöÝÿIµ7•qÊéýi‘$ Õú©ñê‚ü¥teýæøLè4›çxö~G¨$ýøË´&öóø  øWmÚÑAÞ\€Ía‰™X‘"…’×ÂŽ+^€Ô…ìÐcŸxz[4_ïÈI!°iVø§ctÃâýŠ´w—iÇÖ²‰\èÜpåØÇ퓡7¤Ôísl˜}~S]@ ËðûÚ´N98€ðÜbÃ:¥ +`T83Q¤•ž6êŽ]XÏïl• HÛæ›"¶ú¸ˆÈ4d¥nÚâ“gÂZX@»øÿâÜT‚o\€û Jû 1‰HÙ${·Í! DÔÏÅø3כìn¸6;åð•ÊpÐÈܛþ9lo΄-à™¶­È%ö1ñ‹;k.2ëmÉ@¤+Õ¸ÝJá7þƒ', úCË.ÌjP®åĦÁ4-`÷YH4+`ÿé{V\ûQîŠ ug= q–ëãOiOræö ú)<žŸñ?b” ‡aÿ9³M¿×> Ö®§;ò•OÞ6±5û¿`€•É¥ò¬ÝÌ endstream endobj 133 0 obj <>stream +jv4ñprÙ=ùˆÉ( x’W(ØO¹[ 3„Ñ2êXAÙ , ëÕ !T!$‘é²¢ûòò!¯+·ãõÎ(+³+ÊÊ~HýÕKò3:£íÈ  +Ä+è ÃÊGKÍh¥õœº‹m™-;f=¨„® l: + ê¯Ì’Ù•‘ÓI è 'Õúea¿¤~âf„ ·,×ø„ +28™ h<Æá 0Ke<Á†'¸P åžpBˆÊ+#4Øдt6> ÁƒÊx`³ÁÝdLTˆiõkÛ"6~Ë÷çø=¦i&IJ,ß²ýÒø}ß/lßö-¿3×ø {qúÆoX¶o +·„—­áí»¾c]mÛ"+/>¡Žñ;·o +nŽoü†Msšžíù†áW¾ñÏmܖP£rbßõ‹Ûwlßµ}ßèצ©ñ{BžÛpü"³ëÆï݄ú…%ˆ˜Óo‰ú¾ñû­áû¦ aÄzÂÎ5!žbB,AÄ{B-ßù|¿ð\‚ ™YÁí;–ï ÷OÀɐL¨‘q€ÁA`@‰• ° Ëy×µmÛo~çóÓq-çw~Ó¹œ×4Ã3Ïv×0žÃ3Ž¿ðœã/-çxþÒòÇx|ǹ}ßö}ßtL×/ŽÇvϯã"ölãwüÚö×2^Çòl¿¶-Ë"õkË"1{®ó›®gú­ã¸ŽÕsÓqÇr³sø¦ë7Ïgy~sžkَíŽqÚ~e9Îqú¥åx~i·ë:Ÿi¿kœ>¡@‚J‚û–qZ¾ß:®çX ÇñL¿v<Ïô+Ó7»ñ:žå—7Lˆ_¼®óºžk<¯oûÍsؖsû–sûí\¶í܆åùÍi›¶gùÍé·¶aܶqø–ßچm›Žk;ŸomÛ¶_Û~mÛÎéøµíضmû®a;ÇkûÅm|Æm 4~Çó‹çö›Ûynß¹Ïà;Ïó;Ïï;ï†ïø–ñ÷Æg +o.߶-"ã·<ßô‹ÏwŒÓvÇu,ã/}ãw,¿øã9ßómßô×7}Ç÷Kß8^ßùŒ¿5nßx}¿ömß÷}Ûï-¿ø]çï}ßø=ßôÏï}çx~ßù}ßùÏ1^çxŒÇyŒÇ8NãòŒÏuNã6~Çqüæ6žÏê®å·ß§søÅñ[–ïxÆñÇñÎéy®_˜†q8Çg +r\¿òœç9Nçô<Ût.Ϲß9LÇ´¿4Ëoã8Žç9>S¸ñ—ïüµqø~m<m<Çñ—žqÎiüñz~eœÆíZ–߯a8~c|®ñú®ó<ÎošÆñ×¾íûŽç›Æç~ëú®åø¦ç—¦ëÛ®_ú¾EjøÆg +´|Ûon×øL¡¶í×Îí8·éû½oŸ)ܯmã3…Ú~iÚ®q»–íØÆóº®a»†mÇßڮ嚮뺮纮iz®åY®cúkÚ¶ß8®ó®íZŽk¸¶sZ\×8}ß/.Ãømß´MËò ÏomÓøL¡¶éš®kø­ë·¶g§áw–éZžezÎåW¦e™–åü~i˜¦ë—®óú­íù~k»Îñ¸®çø­çºžóÚÆ_z–ç·¦g<¯qxžçzžç—çyŽg:žã~ãÜÆg9ç8Ÿsü†g¦åx–á9¦é8¦áَßï[¦é—~헞c¸–í¹žñx–ixžãùåٞå7–kY–_Z¦ïøÆá{Î_Û¦gۖeX¤¦é¸~k˜®iéùÆiû†5ÀòKË1MÓ1ãñýÎvßøËqþÆq\ã1|Ë5ýʱ×ó[Ëï×s=ßtþÒsÏ0 Û/Ã4×pýÞ2 ÛõkÛ"vŒÏnŽí׶s˜~m;¶cœ~kš†ñ™BÃsþÖxüÞq^Çò›ÇvÛxŒÏÞ;~ó9¶é;·o:†ßa|¦`Ƕ,ß³üÊóýβ¿³|Û÷]çï=Ãö\¿´,ã3ZžåúÆk9†ß<¯eܖmùÆqûµe|¦ðâ÷kËö\Ë·<Ïï-߸|Ër^Ï4Çò›Ëö]ç2þÞ²,Ço.ã3…÷žó7—ï~áÆã¼¾cچé7žë7–åY¦åù®_YÆoZžãúžç‡íŸñ™‚ËùÓ/>Ï3.Ët,ã³\ßö‹×3]Ïô{Û÷<ÇðŒÏî¸ÆaûÅçŸ)ÜøœÏxÃo>Ûx>ã3ù…mc˜†_˜ŽãùÅc˜®ã¾åûµá:–á÷Î圖cܶߙŸs¾ßyÎñ÷ží\Îå<Æk<ÎmœŽé;†í™žá™¶_{†s—ßZ~gÚ¶ñ·žë™¶i¸~í~gú¾ß»žñ÷Îá¯i|¦ðÖ4ÓõMÇ8mÃ2>SÀkœÆg +ožÛoNÓ/ ×5ýæuþâpýÂ1\Ã5 çqãó×wžÇoãpNÇñ+×øŒ¿x-¿òÓômÏñ ßøüÆ7ŒÇµÓoŽ¿rNÓ¯<ç3^‹à¸ýÎñ‹Ï8]¿x}ß0n¿ø,ã8]×/^ãyþæòk×t=¿y ߯]ï ç¯]ÛsÏî;Ï_¼–ëi\ž%ä(PI‰s8qŸßz–íÇáÙ~ñû¥ëÙ¾_z¶gÏ闾ãû¾éü½oú¦ñY¾ç¹žé:§_šŽg¿g:¿aX–á<†gŽe¦é8¦c:Çe»–e;·ëw®ãYžëwŽ5ĹýÒqLcçuÏð[çñ}Û6üæx ßïãðýÎñ ˲ç1 Ëñ Ïó Ëô Ë5 ÛõKÓtÇ2lÓò›Ç1,Ûù›Ëv ¿²ýÒ4N¿¸M×ôüÎ4M׸Œ¿¶M߯MÛ5^Ûï<Ëðã÷ýÂs=ã´ ×o^×õ[×o]¿y Óo]‹ÈyÛyýÎx\Ï/Ó¶]×¹]Ãö­!Çï:§åú~ëz®qø¥_›¶é9§g¹– ’ !Ÿq§ßŽc8Îé×ÆeÎg9–á8Îã—ešÎc¾q;¾_<ŽéŽa8ÎíÜÆa8®m:‡o\¾_–aœ®m®c\–ßܾk\‚J‚H-Ï0>¿s~¿sË÷›ÃµM×T4Àùkßò ¿q,òÚtüÆñœ×oÓ6MßwlÛ³}Ûv\Ë÷mço~Ïñm¿p ÓsœKPIÐ@ÃuËr¿7lçù}ÇõÇóM¿w ¿·\ç÷‹ß2 ¿¸œç/Ë_<§ïšÎçº~oX¶mZžó:Î鹶_8ÎåÇqŽm;ž_8Æeٖcø½á÷–a»Îs¹~o[®o<ŸqÇgY¾g8·sëz¦ë®çŽñ·¦Éïú¥qø¦a|¦pׯ}ç5 ¿t=Ã5^ÇôkÃ3ÏsÇ/ß6üÚyüÚ9œÇ/=Û¯Mßö<¿ø=Ïò‹Ë´üâù,Óó‹ß³ãv,Çv|¿w<¿3ÓõŒ¿²†[†ß›¶ã÷Žëš¾kxÎc;Ï_YÎoy†kù¦ßzÆí;žçü¥ï†ß:Æß¹–cºží·Žï;ëX®q¾ïÎoÇóøç§ëܞk¾í–å—s8‡çw~ç[Žk|~çwŽåøçY~e˜žk\–ñøa\Ž©$h°é[¦å¸®éx¶íw®áWÖp׸üÊ6l¿2ŒO°szžmùÆíÆéû®ï¸¦ß:¶ï7ëxÆå†q¾á7†ñ™‚J‚ˆ Óo^Ç÷‹ç÷LA‚J‚† yÏ/}Ϲ<ËtÏ´† uNßïÓ°<áži:†é óK Y&Ï"v~Ï$Ä&Ô/üÞ9>S`BeLKØ0ÎIØ©L€%`˜K˜À– ³Ùàp2$¬[Ζ¿í8žé™žsüžï:®qøŽé\ža¦¡sY–çG>QÕgpK¬݉Ä'CÅRz¡Üw¾)wGxÔ}QDêªrέ̍©›]QjFÖáÐé{€âùßzÊ>wzY%­¼às +¥\!°:EÛM¹µ”g©)£^¼¥uHƒ¦(tê.µ§v¦«þ9¿#ìzGSº^UjæÆÔAÈ|‚¸ì€~´ÈynyÂ¥vö[bsˆPþfíA(Fÿ“™v…¦ÜªvLþTî.·dÖµsê9DhÏ3<š +«ÝYÏÙËvҟ¬N¥(R»BaÔ§ý˜;Œ×܇Béςˆ4uÛUZ•»"‹ò.3)OÛQ¹7Ã(w'Lî2Ÿrç¡=‹©O£SfgrKë¬÷Üò§~‹›(¯ƒ…“÷…Ó‡í ¾K͉méœý [r{B;^7¸|–D¼ˆžFbF+K ¹Eqóœ‚õ’Ü T< :¸~šj¿&÷Dí¨ŸÌŒôؐ¶~Ññ4‹B@´„¢Và8{›Q·  +r‚©-µDa”«BCj]hO^…{ò; ”[>¹< ó¿@æFÙ%‡ïù«tL¿ÌHŸY„²œe;€òcµ@3„µþ‹nH_©·®ÞÒ7© évL+DÀHÂÉ !VEY/¹uñ”=íR#ˆ-ƒˆÌ®HÇ°ò±VÀ’£i#4|X¨²܌ö]‘ñ0;"íÌ®H‹s£ìwA¥/ô4¿Üø·ì2â•ÔapIžtJÉ܎}†uöKölv4Å.5€„ˆù4‘Ü~„¼ô‚œ^à kΎ‘žrûÉjXý<ÅvOßÅKò`>LVCKVEN)4å¶\îÃ¥Î*u–ï¨% +§}0(åc=§>“Kfg¤pZ™$­4V(µ·_sÇFÿžÑ^G r2¡ÃáCƒËg©eͲ¸¡ú9xªR-n ]|ÐÁa»ÌhºvÌ­Ì×Üu¾é¿ëýE ÷FHí¶(R¹7Ŧë1·B`•ü!uchÔ¾¦Vý‹À$)rŽº1t¨?ŒhÏûEûYòêûEùEêÿâ=yVî韘5÷•Î¹‰ÎÞEŽÓí˜»…¢' 5EN¬‡ÔVPéè1ò::ÉvQßç«þŽ@ÐÒ9yÕî¨ÛðûŠwÔi¿$Ûù +Vnô°ægÉÌH["Cò%fF¥F¤ÃԈ°%²!lˆ˜“/¨ÜÂ؈®ñ "¨”Ôwå¤ÝÏé·tKžG” Š‚¹)wœÚáJöj”>ä_»m)¬Ea°²²xJ~ņÜÊä’ú«·ì3´zš<°ŽÚ +2CXúåÇ»ìpÊ@Õó43ê\D:K-é×14€4 Ä +æìb#HŠ­ˆ'‘ñ\<¢D¼| 6°v0•  Y_vB×_ñØ{på`Âgz€ˆpYYfMe£‚€eæüI^H=CÍе*6”ZjË-ì’¶sò0ÁAHìDèÁÂëqŠéý`IĂ²j~œTº&ŸJ œðà)+ +2“c^a;hßbÊzhùà’c‰$vÔWjI?ÆƔš]hÁ ͱž'²œ"`gÉ̐¼€Z  $0¥öÕKî9á‘_8ˆ¢ÈM1ßr7#ÒÆ,=O1 ‘•” § +T~šä–>^;'BöÃôö#„ç›Jihá`¢à„i…Սd;˜FdBV1¢kKÎ¨í€ + fTZ¥è„~¤ØŒNÈø0A ÄGaÃ1G,Iì˜=QSê.µæ®RKfQÜ4÷X®èºRrJ¡³-5¤¾CŒJ½zIlÌm‰§¿7Ó?ø“ò47dÖDVt-‘!·(3å¶ösö5:¥~ PӈWòj"cfYfM-íy?©¯3¤rw†T®Ž°ÊÝ *Mí£<:R_¤ú?’?V^ïèwݎþÛ© ü!ý@ Õÿý¨þ'ýKĒוš2ëâ5÷YR‹"cê$±¤ÖD¦ÌºvN…ÆÔShK|rg0¬‚¬ZBV ¬ '."(’XRŸ©I¥hjÑ!øÀ“œ@ Š*Ì9Å/=Ljˆ¢:سÀ=Y0ãÓâUd}íž=Éë˜í`Sti·9MχVµC+èzõ›«ˆ˜OTLHË=¡Ô«8qÁ¤ð‚Ò-ÓÃd"Sê&dÆëɬ‹Á*‡Ï©Ç䈲€¡á£%hô¨[Œ× 5Hí‡Urk2Kn_¼%_¢ÔD‚ö#䥋r3"#©‚–U° +º ë œqk23jIȆ°´LI¬d8e€?>6¸z€H`¢ãÇLàøaKѵÖô]nI—ÜMfÉ­ n©M¡“ÜR€$†³„+yþŽB€3ŒŽ€Slú2ºc”Ø̊€bÚw åkpÏ-‹¬©áJf9°Š¬TEØZr?a[ò(2å–×›ö¬TWá zŽÚ]A¤JµvLí .yÍõ¨¾‹a!4x¤ÿ‹œh¿Â=µ;ޏÓ%ù+1ªþºýğ’Ô 0©Û¢Xå¾À™þ2´£`nÈ«èÔ;´ŒQ%±å똵@¦ÈZ2CjW»¤$2¹*pœÝ֎¹ÃvÍÆÖäMdJ-+åiº£¿çCêª R¹;TL}:O_çÆéÓzϞ•ƒò¸õ×ñº8ޑT˜4$<’â£þ¬÷Üo†Q}gXõk¼©ÓQ}t["¦´’€)¯)³e–'lò(nž»‹è¾sãÔ}Áè_ëEÿœ³O™5{ *£¬ #Ÿ²Ò'’: iˆ—4DÅMtÈȌS›!&–Øô§©U»·Òt—¹1yÕn¹ß›ûŒÊþDM¹¯Ìš»Í Ú³nÔßÆ&íÚܤ]˜›RG©¯2¸¥žóI»-ÝÓ‰¡4¬ˆš:¬Š¢L¼”= Wó‡¹)ûÞP)ÅÁµ‰q‹X¡F‡Ò*L(ù@‰&@Pº€‰ ¥ø…SÉ옵½PZ,Ðᆇü‚£G6CY h„¬ÔA©Ì–¼M*ÅÊE¥jnÑ) ªK,5"!/7¥¡«ýBt}Wˆ°oÊÐÕ䶄ëÙ«pPÿÅÆÜÒxOŸ„ì'JG`±ÑvÙ!$ƒš kˆPVõÚÖ{´ð »! +bttÌ *צ Z;–DÀŒ¬XÆ(;ƒcöÅâsJF7¤gBPÊ ¨éD¦ÜG`FX¬ãõCË[B#º®vË=æ[î/6&/R¬Ÿ*òjÂäTÁFúè)ƒM‘Ö„fܾ~Ǩ`NTÊ h‰CkÈéDM©§Ì˜~ ˜Ò¯#dÝÀ2^GbFט‘UÈó¥bˆôÛzЮ XÒ·  +‚¢ÀE„h‹Mi݇êÏ@ÝS¥½QÊ»(V»/ÝÓÏ@Åc >±c©fAê%^Ì~Ƌú¾_ô·íªR¿_uŠNôßÛÑ–Ž¤’X2JU£rK^MݶÔ7¨ŽXÙÑãF©[ Vý^ïèo1T’šÁ5µ.5gÆ{êªÝRûÚ9{Zïù‰Ì=G4ZQfFQ9Ÿ”ëBkúj’zÊlÉÇxM®Œ·ôcrI݄ ‰­É-u‘—ÑS‹ú²\µKËQ»5U*¦svC¸Š®6¹f? JrŽ¤`:iãUÿ^IjøC’²ñ¨ÿ +m™­Á=÷!õ/§üÎ7ås½*¿b˜ô×xR^æÖÔKdJmK­©³zÉ-¬·Ü¶ØYÙRËë! ùýŽ†ÜzR© f|¢æ—?ltJ>«h‹‘Ÿ§ `šû›(—Ä«Ùm±)¹-“;“[ò+5åÖ&çäejOדþBa´Û>ý›¯ù³ÜŽÚšs_©!± ^COÌ=qà$ +ŒˆÐ!'ÊMQ„JÍ슮^A@rÀ¦oû%ý”‘v#L€!ő(2zˆÜpX5Änñ ãu«j‰cnA± é6 Ž§ +NØ`²`¦ç ,èú!ÖóDBûqJÁ E¥ÔŽXÛry!µVFØ +2EV6Jm̬:EëE¥räû)÷˜éÛ|ϿŶäOdL¾l©[¨1Z[hÏÝ|þ77I¿Ã«†øEª +-¹51+Ênpõ@]°ÒᤡåE2 Âbx‰°dá%#ÉBK `y­ ²‘”>õ™ÛR'yeQdÈ}$V´5± iIÔ| hrÊ=ƒ–Ž \?K-6%6÷{þ½`³«Còj†¬$^H«ËÍ(+û%÷[ÏL¤ úàsSê3ºdÿ¢3î+7cæSnoAæ>$:ûÐé³Ô–| Íù›À–ÿ +ù_Xõ<Õ4"ø¡éh +jý9¬@ø¡‘  `|„Œx%­&/¦–%¶ÔŽ´Œ¢`jM­Õ7ȑú«œ2[³CZcpË„Ê)µ"sr_pImʌ¹}Ùz„€×CANñ٫܂‚¸ÜŠœB´ŒM!TÍíª&íijSn ×Ói=÷×®‰-ŸÛ;Ô_FR·•‹î2”§¿L.¹…©1·)²#–¥fdµÑ)³<7PÿN.ËlË”@p"«–Ó±rò'dQÿŶÔWºæn2C^Y8é_áÅø4¯Ÿ.È(µÄ(õ +1EWْŸñžþŠéŸbˆÄmATêê‘~B¤ŸgHýI^CNXBA`:éŽóIýaÕßùE`•Ÿñ¢;‹·ÜÂ~Ê-‹·ÔÂ~Ií ¸ÜªtË-ýs‚J!ðý¨S²”[!(J«(ªx£ôWj?Z8¥Ê ô¡ŠJ™ÀžS/^s„šÙ…Á%w—ÛR+ Ný7ÕnîåirË-ŠŒ¹ïzT)0Ú +¥]Ür+#zj©-u­%&鋴”~™(›eƏ jx0Ñä”YÉß-L/Pâ違Ž( ¢ƒh)9˜<´„ô Z6 ,¸l4a€áXbÑý@­€:°@AáL@æ2¼ˆÂ.;˜XnF»Êg¤¯ð|žhxFÖÝP¹ËàÚVs‹sò"XLå–À”{ .¹••ºØìypœ~ì§ÔgtIíŒ.©›ÌúË ê‹¨!ÒÒ+8š2T$ÿ›b²g±zÀ§•¥C>YPãSe™)ŸjtÉ'\OÚI#èü’¦j»"í ¶*`/Æ +Ly±5}ÖR/ñbê)´¥VƒÊh¡zú4œRp½h—ž©!ý£<1åÂvK>…V„íÀjªÁ5·«\“ïý¤ÝÝïè¿x8&ðƒÇ • beì;¨Š¶2·&_û5}¢³ç).yŸÐ¨­á%µ¸ÝÑTŠëɽ &èjAÄÂE•"Cê&`?Y4Q0<¡+nHdå@…‘öÃ˧iƒÊØ4âBF¹Ü”ØßoÊó~Kí.xÄÆ|É­Ž¹ß|ÐE&UÏÜø!s[ê7C¨”:În +¢²_ݎº‰×1kBvÔú‚OŸ÷cöøŒ“UÒêóQ{C¥)¡ï¨ÛëUÿZÚ¿vO'ˆ$U ™¹=yt¯É5õ0úëzUîŽI*¤rq¾h Fy¢Pºã©\Ø®ÉÓ*BM½^µ÷§Ú}qCõ‡ÁiÏÁ R—öĦ°¢Û™šT¿í¨üM°Ê×Ø9ògèu[ºçvÊ臌©yA]@³ÃÇÉKÚ¯¼¨ Ê«Àž;Å ÐR¥flϾ×C’¢í¨}LÕqhw8tò5T8õàp™]é˜×"ðh +Ç;šz¡=÷²ç¾[ê*œ“oõ’[^É¿vMvùqª#•"Sno¼hwÆ[ú#\< >´|žvA¦C…’·ñA‘ÈŒL?ßў¢(åc;'¿‹r5È8w™Ðu¦÷ƒ…ÙYW<åN;bAØ(±'bÒ>–«NµpÔ©˜YuÈ ­:õRƒú1·¤5‘ê«rJmˆW‘u…f”¥¹1wÞ/Ê]á;‡˜ž¦ÙQ;³!„GôÔAUd­`GýÒót"Sê¯]óGqí³IŽ' Jäpªõ ½Î'åj¨)ÊÖ0>O°Ýóo‘÷÷¤ˆÀ Þ0=M-žr‹“ƒÔ7F=†Áqdòb> T.îõG`Hl4CPZCM'5#TpèôC§oëiºcl(±tÍ>V´Íà…Ç“@Øðၓ ( `’Û³æC|N±|BXچÆÊÌØt#œþ35åÖ™ %»ºM/Ê]Q¤r}@hŸBSbmº¤ÿçKê摤r¾h/‚…´²Èž[˜NÚã©þ‘úû~S׋ò¯Ô·±ƒ4C§*ÅC¤öà$qAÈAê¾(D=NTÓíMwô}U?ÅðÈ'ŸÛϹué¢ÛWî …3|î%fBLV8l:ªÓ%MézHR´• 'iêF8ýg½'O"IÕܤºHíWºàT¹!èT¹,ŠU‡HõkðLýåQhÅ´¿ RùšîhßNõ¬!!Ì-¸ŽÙ“X“?Acê1·æö&HõYà@û/ÚËÜ |ËìهP=³¼^UÏN³¹ß +Æ{^]ÜL·Át‹A QSŠl™]åœýI,©·Ì–ülçôi=§ßÒ9ý`0êç~Hì2jDÕÜ[dÓ©–UJĪ¹›¼œ¾ê&• +þŽ¤4(ý,ŠS>±ê·ÀòBâS{û9y”™Qö¥ÆômrÍ®‹çü9Øqò?,±/v˜X¦•O´§õž¼Š¬©=9÷ 6FZWsë1y]pÉ¿zK¾„̘…Á%·«Ýr_åž| lÉ[#tå 2f];åÖW4ÒÚøˆ®®òºÎtß ™Z›2Ë“ú&¯&ï¢ ÂÒô€²'7Q1;c6|î7©#œþ¸ßóg¡-ù6Ê톦~B&õw„Õߝ)ßÚ!±,¶¤6(„rY7(÷äÕìq˜¨ ˆÐ@*ñB^mD¢-qgh;sCê&1#E¶äinO¥vÜ?pBGTBàx¢ÀP–FgÔÆàŒY1£-I̸% +¥S-4¢m͒cÉ)8‚p`YM̄˜Tp?L7!r'!Z¢Á5¯Eá”û F¥bjÏߦ•båžþjÇÜê‚˽Lê3;£lŠÍÈúr;n'P™D"!(y€!#VÎ?%•r±-}׎ٿ솮#µž¥Vy¥“Ú‘ѓ› %˜S¯ñ¢R²“Ï—Zp©×ì’YáQôù2Õ_á < «™­¡Qû]©«#¬ru†ÓÿfHår€SíâŸ\™îéÛzQÞEÉÿAñC +RWD+)„øCê{=iÿA…„Záž[Ú.ÚÛvÔ'˜$Õâ†ÚßPáÔwCc.˜|‚‘#ý]dLÞäų(ý,ŠG\7U®‹›j—dV$ä'T>½Ðqê¶sËBù¢”_q#åYÜDœb“¿ýœZØ.š]1Dâ}X<µ+ÜÒ +ÂUäÄRCjY9h7¶“þµž”§<헴¾xÏmLGýu>*·‚JǑMŽií¥ÛÅCœîäT{œ!TW隺¬çìE\AQ8Á!ÄC R¯±M»-\U*¦£v…B(¿££Ì‰Í-O1ú«Èû%COlšúLmÚ]ݦR'hMÝÕa;¨)ïBÇ©åÉa^sÂ$öµsú#^C× ,K#f?NB¡S»ÁÎS‡±Õe¤pfc¤`narǨᔻó9§*(Ñ  +«ðøâ5ôd¢ô$û%w—©ÍÁQne¿#–…ÖÔ²tN?ÄËH»auÌb@CäDƒkjqŠN¾F ¤v†EW”ÜOZoyÅBy ªM `1¨€™¡$¿ìXŠÉ±1T0õ.’ºŒÊ=XTò3” »Q¥V4¤©XIê”þ¹ R ó!·?br_qÓìñ–A`•&–³‹AÌqKÂ¥ÔMȈ²&3¢lØä +‹L.îçô];'oó5ÿ“ÙÐNÇÜxŠ?$XQµ€†Ç’Ë ¹ó€Ð©™¹£Ø†°.8#Þ‹” ‘µ¤&ôô‚#²o”ýoØôk¿æ®>ýYÏÙëxG#àzÐLÔ~¬^7”PpBP'pEØ5¡¨Û«‚ºÎ5!ü°À&r;b52Šâëi"™ E­zHݦg”å •Úœ™…õ˜ZÕ.©¯ÜŠ´X: >à‚‰$VÄ´ê%¯­Ÿ‘g8Õu„H?ЇԽù)MåxÔææÜÊà˜Z™œûFû"µ #‡*¥.y–™Óú’† }Q¾ucbU7¨þgÚ°#ÝQ¥Û`pªÝgºó|ÑßçìMÀ’Y,)/>µ8V8³ÉQݝçÞÁf(ˆ ̨‰†Šf_6ûOúËxÎ>Æ{ò:Ã#?†Nµ‡¡å@éJ¶=Lt<”^>eÖƛr@iŸ3œòÂߔçÁijQ¥<‘ØÔOìzšîH$dDP17&VÆ{f‹Ã§öOµ¡3åwB¥öB+GÕFwŒÊÀÚÑC&…vdJ©—f<§6(„úàL¥Z9'¿2[n‹Äf%÷ódåóƒˈɥƒnaèHyt Ût¤~m'åºÌ¢½«§ÔgvFÛ´¢«‹ÉßvU©aUJ‡8õmA¥•L,ŽÏ­ j·%) +È ›‘a%ÂÎõg:é/csê48§îÒA{ÜrÛâF*ãm0˸è0ÃIækò±³¥Ý/™½“×Øïxåýœz«W”½³áÃåfÌò|S©àÑT0õetEÖ Z4d?ãS Ožì‰BÀ&j²K c̎û’ÊÂè~®µaQ74ҢԆ¬ \DNì<ý^h‹A  #.䓬ÇìetH­Í.©‰M÷Cn3Ø5Í̪þH ÙÝJ%#6FwԮ܌°,µå¥v¼ŠÈ†šbtF(^±ˆGÀ‡®?V<¤.£+ÊÒ~Jþõ;jiAäD^S«Ý3Ÿ' ¬hà¼ezz¸Ø–×XϹuýÙ_QT®©­é’þ›`’Ô +"Ò‰ZSKÎÕê)µ< ”WA¤þÁ Ôïý¦Üsâ5tU™-w- ¦šÑ +ôQ¹0rª\ 1ù$# +ùàáÐHÁ´Ž¨f á/!µÐœ=«–4dE‘úËؙúàPÿ8Î-Œ×tâ@ŠÍ)m;¡—£„5ôäûQ»@R·Dâê©= +"Õ× xÄÝ!Fû“,ߐ¢´_‘9·+tŸí¨þ‰Ø”÷£<Œ(ïÁÔÉ EQ8ၓµSnƒÀªÔÊ¡¼ï÷Ü]º¦–DfôD“C>Ý|Ik×Ϗ˜Zò)כê?_Ò_"u]ºeÖµcò27'OãEœ䟁LFUDÖÓCÆkfuÁ¦ÎGÊë‚Íl/Õu‚HÝ8Õî +I^,Ú²zG}Ä¥ÜfƒÄÆТ~Xí²¸™ú2v¤ý ž©/ +jw¥6dqíøÁâY_nK¬ååÝi9¤®N°Ç*ˆT)Ä©”̇ì3´høèÖßÐÕDmȺÒ1w™O™Ý)6µìR÷&xÄý@‡Ú‹°ƒô¿¸9úsˆÑ¾TbQä(³-t˜ú‰l™}å¢ü ©»ã%Iݧݢ“ß)>{ߐÉÏ삞j@äÎÒ=}OêÇä–Yܓ_ݦþ MºƒR¾ÖcZ]nȧvžúå_8¤Ÿ…£ö%bǨSwå¨ÿÍýqD£ö‚Léjg\òZ›žÔÎ t'ŸºN1Ê€“$ÅCœruB¤þ·6!’7Sj9Ð(±.\ÔW1Dr#¤ru¿çÎûE{"µ» :{à©ÿ†Lý„vŒ:yAõœÎǼ!µR—…“ö®\´¯É5ù×ï¨uÁ‚({iirÉmK÷ä}@)¿â&ªÃ؁ò¤hò«Қs£¼ºÐiö"XCMq‹ORÊL©Á1÷YÏÉç;°xÌÖð„°¸ª†R ÂÆG+ , áÀyâvÜÊ~Ê?dvB§Ï‘.BAÈb<æzÌk uJõËOUÊÏxRî®W•þ†ÈxÎ_ÆCH­÷ì=¬„¢f@LhǬÍ÷üÀéo:Eã%ÿ ,Q^d(•Ì„¢>p1Ê $°ãv¥[v]nÉCÍöU©±„“J'³"« ÍHπÉI0¡¡äbKö58§ÔŠŒùX aKbF-‰™v¦ñ@éCŒ‡¼F‡›Æ†]Q/ØÜB§ó=}]p¹çŠCz›zœ -µf~ž4P¢†—›’Ç™?Pèäî‚ÌþÅ[î/: «ˆíF ‰5Aºvp =¹xÍ]8tú5Ÿ“wíœ{îçôwÁ¦b7ôdAÝà(õ—œñª>uœºÛzOþ'|ú$l:Žtp”L8`Q‡ÖOØŠçƒnq°`Z68:åÐiE¡s¼ºä~„ÌvG+QåŽÌ‚œ^tF,íÇäuˆÓ¿ϴ끎”ËCœrUfJ=ÃLœQN‰ýùŽ¸-ˆJSÜ$¶¨¸¡ìY§ ±N´h,½5]“ä­yD³`ô Y(Ñ.Ž<è@è±ÁÃGVr–8Ñ"úÎ„ðƒ®¹Ñ”«p@’FEf¹xžìrqáýDÕ,GÀh@µÀ¦˜”&xAÉ1 ô¸ Uãi‚ ª0¡s´ehôØðꁚÙ·X=O5MŽ¦ ¬ž'2!¨ÜÒ¿õ¤! A㑵Y ü #i-Tg„à67˜8ÀxØhɳÁôÒÄè1׈ Ă+¬‚¡tÁµÃiDŒèêbSêZBלâó?±ãÑ4‚ÖԍÔÜB5Ãô8á4>N \ÆìZ“ ¯g©õ²~¸ÍPÚ Wa©…×V/©M¹mc¼g×ç;k×ô5Àv8ÕèŽ= +-{ËÆÑÙ ªÈ ÈIąÔ3صZÆ,L Êe™=¹¶L hÁIj¨Åèa ¥™ÕÁ/>FĈœNfJ,Mº³pSEÖÜc:©” +!Ò65$ƒŸ!ZFQ*4¦ƒCncâuä/¨ùÁÒ1=Q6L6ƒ¢- ØqÑ{±Ohá ÊA–c©ÌçivԂhaCÀˆ¬õ Ž÷  #¯¤â5¤µmj©`æƒ# Z`Tá‚d`E‘ˆm7Àz b›>6¼v,™Ø†¬¸D"Rã…á¥cIÃkGŠK"v̢̒»Ðõ®™‘û¡NàŒ²Z@V°Ä’Ó¸ÈPºÐÂ!¤ädÍÀò±Ö65€x€ù@Õ+~p@ÆEôBËJK[[î5·¨ÔïWâ¥ýí÷Ô²pP^ƒ +ª¦±Ñƒž¹áƒŽÙ±TBft]ñ”z‹Çì{@)7ÎQם)Ï¢Xå[«?î¸·Ø’?‰W’ÁJê\AV›Ó¿ù¢ÝaÊ%¹ñ£3^_¼æþáåã4ò*ºÆܜûK7õ_ºhoÛÜøRjÂ!6µ<9J-Y—œ‘‰µKF±Ô”WÜ.i„®Êuåªÿ +"•ç Gªë~ϬÎPºß©½Ë-¹]‘9ùسw™Ey ‰Kü%IÍtRçƒî*ŠÑ-ÊLùT"KFµÐžzŠì©åùª¿Š"•«¢8õyŠÒŸ|ú½ß´ûÂQ»TÊë› 'r_ݨCNÌ¢ÝÖmÊ]ឺË-yUíqÁe¯Ò1}Ût™Ò/¡eitKžÆ‹v}?$î(ýi='oãI»3¶hw¥¦ä_nÌ•‹N‘À–z —“ñBbIj@K°ÓÊÒ9÷¶d?âe”½@Æ…sî+Ýs·ýž{(ýktIíj—Ìò€Ï¾ƒ J„ËH»2sö56j—vKA‰KÈ +‚¥£Iƒk‡ÓˇÜê£>‹"U*–«¡]Š´f‚®%±£üQGÀíªS8ôç›} ˆìMÔ~²`™Ñƒ~áєBSö17§” Íh+" Š’É!·¹µ›Û! å¨S&2%Ÿ +Ȋª'Šƒ ȺRKò)4äÛ=¹C¡tHì—äŠÐ|žHdEQ&°å^!F*ƒÊxe±uoéÇèZ×ï˜ÝàⱤ¢ ÑÁ2 ¨‰Dìˆ-‘%±ZÆk–1[AµCˆ‡Ø &nANV?NZ@P\BÖv$V”Ýàúy*© aatF-.ÈÜm@¥Vå+º¢Ü„°2¸¥¯RKî$dFÚ0£¬ŽÙ·Ü’; mé“p)} ¤Äð1A òŒ X?PV@×/!ìÈL{«dø¸àº$·Á!ž¡ñã +êÄ,ú»rRnlåy?éÄuqóÜ]<#'ŠEÖÔYfOÞDÆԪ̚ºLmÚÕñªR/ˆ=º:t€pƒR(Ií£ÜÙN*¥ªM»66ªÍÍéË̚}M͹ÏvН'Lj[ÜHÿ7Õ®p¸Ô9Ёö½ß´¿õ¨ù˜ÛrKÂrò&^O¿Ä+¹5;f_jM}‡õi¤€ö3R<¹'pDÚ¬ ¨RG™)wôO™%õ‘ÑU§Ü‰?%J#€å¤S&dȝdfԒ A‰˜ù4•È’Z +·C’bˆáÐ)Åúam@äU%¶CˆD¸8Öܜ½OȔâR)3£æ¦ÌŽÄŠ¢ð>4´j$µ‚AP b@L%2£(’X‘•ä•Ü9´€œ>Èr AãñíÈI§ÔšÌŒ× -!¨”2K“[ò.žÒŸ“¾ÌÇÔ]=å•Å[b];'¯ëMÕàœ|J ™M©³ªœ³w鞽Î7íæ|R) ®O´r4‰˜õ@ÉèûXPԆ–еD,¹Ëä’ÛV/©5©]=Ä| FdCÖÕMê»rS®Œ÷äÀi¯A1©k’Ïû=­26§UÅ°úëxÔ?%ÕOÌ |LMڕí¢\Ä#.Œ"’„î4”»óQ‡¨*…€<r‚¶Ü~°1Z7Ô£\hÏíŠ)¯S|no†P†NTOvÀ´â £zHí}?*W¶“ö7@%n0‰»‚xäó¡ÖäΫ3Æ1ªõóò®ð@¢áª= +aõ—íœ[D*¿CEtÛêu‘ÍæŸÛ p¦qõuA§ž#Dâ(€I\;Ôþ¦Ø¼Ú~Ol œ(Stö$dEN5ÞTú’þCS.ˆJRE`Õg1Dú[ {tW{ü*„IR3]ô_Ý ÿ-×cî‚>¥)!R†“ö/´hOÓU}E¤H ¢"™ÏÈx²ÜŽWØÊÝñ”¤r‚HŽ°êßxR~G8ýyn Ü]°ÙÓ|NÞ$Ö¼‚`-³(±gŸB3²šÌ„šV8èNc‹î87L-+íÂ̤R1ݔÛ=÷߯Êméœ: + Õâ5³ì8÷)¢?QåzP)µ%­'AµcÉ›BJfDY™ÜQËÒ1µµ^”'ZÄ©oƒsòXÇ+ˆUòjÓU¥P §\8PŸÇùÇ|È­ñé…P.‹M©ÛzRnî÷ì¦ÐŒv™Qo™%õ­ã–Ä ©»Ü–ý«·ì]vDO#6>ZlË,ìÖ5µj·«Ná~Ю/ý}Ãå–eæÓD¯ˆpDN§xAäo2+ÂÎ.=>:Ø(ŸblMÝF—ÜâˆDW¢Nѕ„ÄÄÒ­7à’o©1};&‡8††Ò«?`¼æV‡åÚ|Mþ„v´â|Ï]g(íæ€M©™Ñ>“cn];§ö÷«ö:A%)á/©‹ëMû›/Ê×~ͽփú.ݓ_åž;KçäQjFW1K í5 r?3ºÂؘ½mڅñ »Ì×ÔÎè”ZQ¶öSê4x¢~NIJ¬úC`ÕW1Dêî€ÑìÍ÷Äî ¥:Rƒ¨#GÚ³tÐ>כvahЃêÇé‚MÏ‰×њ2[jelÑnmG!ñ<ÄéÔ–P“ÌL*u"6•¢¹E{OéÔê…°(Jµ9P íÇÏ+OªeQœöÓQ}/IŠøS"Ã!ui9¥)WnÊç ¥Ý:fR7ÔÏù¢ÜŸ©»NÕaGÊÇСþ:Åfo£CnWjHmQõ‡Áèb3bIԂžDÄ|€1Å؞Œ/î!bÖ~/—þ´{vW\ÇA…-Äƀ)&ŸEÕNR.¡3øJÍ`¶L ÁhñFŽ®c¼» + _ñÁï&Œ èÛIJx3bñQá +¢Zèâ#ÄäЫ#´™!ÌLé\ fúÍjƽ>'Ì +:M¨$¸IRÑ¡ïú-|õhÆm'Eê†)Só‰SD/\Øx¹Cö[@~Œn¯àIÀ:*b…zû.÷êÑbþelKä´³Mþח¾ãFŽk¼.b-L`êíö_à ,]Aë?Y £´.j wHjð.åcТþ:¤G”X?M"‡Zބbp/-я‰ÿʤøzB¬NA|›Öïù`úlbŠ‘e¬™…VÑSŸ2pqÄ°Ìғ¢eÙ èd†­'¶©£“æ—X [hÒ1Õ¤×Ôç'£gŒpÑ5HfL€æ•O {d +›'bëÖª]¨†+«ÝÁwqô5i¼¥Õ +į`à˜ƒãî;‡¡Ö†g†XˆíYØmúƒ9î§'VnpõõÛÊp©œVÆÓUK8Û•ý…èN¥+OƒtF1G6>°@(¸ª¥°˜˜~µá,î~ÛãZ¢Oª›ÇØ Wÿ–²‹ý†û®o–ÝzĶ{û-6¬—bN^žԱñû™¹ƒQ —7›„ ò  tj¥"(oØÐv# ŠùAìA°jqýòÓ³ìÕ¢¨Éù[Ù_5âß³6ôüÒò¼Î?iâm ‚aÎ.ü©Ý¿¹² I•‚‹€=ÄIÝc¡‹À1n‡Ê +op†+*ö~t–EHC³eOüéÿ(D3 ¾rðTl95¤UÄä­GÓ£HZš¯•g[؈GuzùÀLÐ ÷b{?î»{^·å'ðM¿Bƒ·…ëLÍ%í8ð¿Iø‰ä!|ð ¸{'RÀµÜ°l=Á +þñ~]âæxZƒôk!”+1$ÿáFñÑ  ‘… …BM(U„oª0Ø1·¾Çí;Qú[g*hwcÛ5à#H›hùBg±$­µ\· ‡ºßî{Ln |IH‚V¥rƸçqôîªÞeSÆ(f‰Ë2grEð< /J¦d‚܇3Àõ#KxþiÆö¤±a;‰ì.®Þ{¦e5´e®)¯«†y¨Ê›‹Å2/€](çÔUÑb¸Úñò¿ñµ]aÿ-4èÊÑý§ú[’GyÚcÂŒ1›sW:žÎ´x“™ûg æÁÜ¡¢ŽFš¹ˆIǘ0¶ø†k"µ¡se1PñŠ'Ï +ÁO¥)ñŽc: j.”¾«ÖÛdO6ãì/Š®ÀêÆa´hi֒¥X\&œ©l¤'™ÜÇ}‹žð,wö³¬ãvBáÇAøÐî¦/ðУCàõ½8ˆÊ`\¹kî*œÌ‘!4OÍ¢AXÓ ‚SŠI6—q„AêŽþQa6qýS0íî=MJwtÁ%S™î — ìk¨T-VG'#ŒV…ˆÛsn  +䭅¤8¡ÎOéq‘¾Ž¹$%‡š, ³lÓ!Ë\\2ÄÎaÔ4¦­–éQ´— ÂâëºÔ,›@ù‘Àßñ0ÑøÀöÂÄ’\®ýˆ d„/ö9Jd8ã‡ô€ӟ–¥¬7ÿñÛõÀØ̙X $,¢3ª—‹ò›ã”dèsÕÝTèËC)ådÅ7q?ñòo¼&ѵæ\‡HJëW[Ċœ:,„ÿù¥ýTÅ©‡94·ÑP¬ÑsƒÔiÌjí +wçG8ý¢“;"¡Xç5C'VWšÓê 7#Q­‹0`õ”ÞŽdK‹÷F«¢êV +•Ñ”dz¤èšPùï ý . ‹Ý.û¶²8úÕ»uNò„Mz°šÿ詓!“›)Âoðf"ôø, Àۏ5a„eñ[Hû:‹ÛX¶Õâ:Qòr1ídÚk ¹“î $COœÏ#ŒdÙÒG´ÜËçà¨~*N&h†=Äë®Ð&³ W'Ý v Ërøa±0­ø‹Áu2M&-JT ˆ jíø¢ì•Fh¶È†Qv8ó E縲u¢.OÑL~“…Pyú90Èaôíup) +ÝùA VE7À…Â98tá눱Òur"yóMåÿÇ׉ÞsohëéÃ¥&àB…b÷aØW=ñ»¬–àÆÞV'·Î!ãèÕÇm-jËÖ>·._UFúx)c@wò¤ã¼À1»=gßÓ Ã¦9"Β (] ³8±aì¥B“çf„¼Òžfð#u”ò¯KN-ˆowƒ«Liˆ] SǦg1ÝÇxãQ©w£ƒí~ÜÆÂHÔÄ4)îúq¥ –©9F €hMˆ[Eˆ– ƒÓ%ÚäÉ%ú…h²%°¿mrb­Oòž>èògBcH9».íÄ ?9Æ6FýÄȼØ5¦æHñ߸`<,á7ìñðìÀ€ 3*6ޓ±ë¡+·‰¦`xz©´Îèü2K<4û€Ø„OW™¹Ì?´#z,Ý<ˆÝ¢¥Ðے·ÉgÔ¹Ì 5KWÓ¥³'ÕÍ2vŸ=€šíÄ·—ÂŒnN+Ó…Ÿ!ú!ƒ§³Ÿ\½)FÏÆ3&Œ Ønýji›éÚøGVE,éPÍßæ‘ýY-tKøØÁ»yoñX9!ü^¶S,a¥µVz”asôaÈzËË=  ¤>…X—£ÿãBüî(ୂšÍÚä* pm0"$‘~…~–V# Q0î â½C‹i΀ÀpœóÃDµå·¿9³fŸÐÂæ4Zð„< +žåŠÐ‹ +ŠqR¡ãÊ;ÄöÖ×6 b’lØpM¶un³$f,ƒõ Ÿûö Êx„#ÝP4s¾¤4l<7Ü@!ŠCý%Àœ…’-„lÁÕ&$Ax¢‘x‘”{Úå‰d¢Vw ÆúuÙ=Û™›© ɵ*N1ÉD²Ëzñ,¢}ºÏ¶„n‰ÓK^|Èo~TóOä€ïÆø~¹]‰òôÐT~†ÜŠ4€¹Á5šïˆ)Ç]7ޔý¼:pöéû`*BŸS·#– 9$ɵ€²:„\“C¸­³-2"4Žs½J> !°è“ûåòñØæn Š nØðö¯©BX¿Ä °¾÷aõ»½b¡dDna¸r&Pœ‡Êq¸±Zû™•^§n…јóˑ8g e˜øGãuª¥qق‚ËÌ ¹r30Çø¿Jø)+ú8ÄÆ~ DI¥0!-J2–án¨4(ÁÆJíãeIÓp XŒ7á«Ãxƒ Í&Ão5<*Ò×- ӎþ‡|Y_c“|OX7*«DÚ*(=,ïÙ´`6i÷º’¢¨~$ˆP¯Á˜bØauÜû`~‰:ì÷&يµhà/ømãI¹A&Õ_¡Òõói }ÿìøøø ¥p¬ ]x‚&[¨w!Nyfh{©v‹ÑxØ÷¾ú/²ÚËeaÑÄ0g)Y½ã.Å ­p½áwÙ´Ò5ýxt®ëüº:DßÁó栕TÛ®þü¥°ÌD¯Xà$¨ ‰#Çü£Q,>(Ah/M]­yìêM¸û¢!®±c¡pî€?]¥^X h7ýÛH”Kk'—¿:¶ê0ô\1‚Á©)pò§,%Û4Tc^ÃÆÂM(J#(L,‰~1Å¡¤¬w=få¿­ü˜,Žx ìލ÷yæá€×Ãâ¸VÂ5´ùü6ØÓDóQñý£L¼è·Õà­Óô7°wxÑôp®ÊÄĽ '’…ŒÐ‘bǐÿ rB”§Þæ!úî«dÆ-èðªx÷Ÿ{Ê~ðƒ z¾(SÜžbÛX·#†e]¦DͯÒp¤ã"a3År] MÈ侚Ոä:—Å+š_¢¬âᡌ4y¿ÒËÚÔö¶FvyÎH®‡¾´åþ(Þ£#˜Äy›ôaÈ»ž×yŽhÒâF9¾ã”n_G!ž$N¡­½-ê=nöX\%RñJ +èij];À«™ó¨»â²E¸ Fõ'ç_RùŸz_r¨Ì\œð“e ¤èíZǒrŅþ6ìØáüáürš^™’…. ‚ÊAH©™baÅ÷v±è÷s£íÀò[ɝ`.¸|ië¸ú¤˜ô{èL‚,C∾™ØYsKßþŽÏ!åQO ׈·]¨¸dâéÂ{wM]JtŒè~~ hÎÿ÷/ºâÖ œ =$a4ÞÞäÊs 6ÒóAcHGƒÑStÏ@1±;sÂÊ~ªia`î? Q™`¹È­¿€A¸•4frÄ*€¶§?0¤uª§E~QA\"ê×Ñoˆ?šù˂U‡ÌšKPŸ«.ÐLlÜO{L+}ºõZ=qëƒzì7­O + N14Bïx7Gö‘m{¤_z{W¸%'q7Lá–&c4Ǘ¼»-Ç0œµồêċ$ÓÒ±¦÷ +Å®½‘ hҞDƒÊ/ +ك8Ôtá`\wYŽìGY|çÈuGcŽØ]Ù¸bø›Q(.bEGA‘…™ÄIH q߃£†gWÞ4(·Œÿš  g╀!§@5“rö Õ½1Ohé­þcHž(Î&¦È1ÜK÷q±#èVŒDv «]ŒØ2Ǔ*=-l3šwÌ×Љ& Jª6L÷ ºW£!ªø,†8|]BÈ9çq¬܈›äŽc¨ Yßζ,-2š|Aùf4»€é}ÂRø H)Iªðç¡`ŠÖÃr¡Õ¿! x©óÊx%§ 2×¥¦Øl܈À`á>õx>LÀÅ nÈu!Ê跑%æ-ö0†ËhöØÈ!Ù#Û:½t0;Ýì‡{¿“î“žY^êéÎ ¶ø šØ÷mä©Z Ã [i®Š»Ðž¾ *¹Ÿ1«è ‚VÅ-Ç/½ýC8°–ŠYcŠ*:ÊNƒéÏ¿#¹håX&yøÇy õËÏD…"kvÊ.ð„B›?ƒÓ±ç݋¥Cœ"ç0›áyA‡²nX)Žš{Œd_:j›HhÁ.½ê-ÃPv䚎fó} jªá+ ³ç·o qòh?\¦Z>Ñ«eo™È,/¢eoý@ŽëÛI2âb’ö՝ñ¶³cñ­š¿¤óƒòÐ +.ËӎùמÖmÝB lLÆßq¹Âå+->zˆà”„»QsÓk(“˜&̌«ørö¢C¹¨\÷Ua2~TMׂ¬q„N^OS̙u‰é¡ÈÚ~£ ûØXü¼ùê#åÅÍË +ڎ{ý¼ütyÇÔ&ç +ß× Ô¬ÄR!ÅÀšj{ƒ"8_Z:“iIbÉóžÂ}®"óí¡‡v¸œÇÉ[;4åˆ8<ïßED®âÀë>ö™`9¢–¤\!bƒâ³‘»Ar9e,Â'3€–ÕÌcm&ÜÍ:a¹z@¼iKä¬Ó»}gÆ}"q͵g€:Œ§b]°3ó2ëzðº\“|5Cf½ŠñSbÀMCIŒÃ®°tcû ÁÿÈ¥Á‚’û-<"žÑ ÙíÜ`ýÂîŒå÷Ê$ؤ1ýò;Kü¥¥È_ˆ w*@‡…øSH…j5ßD2A6Cn25Ö9ž0QIï5;B >r±99j6m¥ò;Ž»àÎ.Yõ߁[@`ÏIۅµí€J"îEÜl[o“ „ëõùEMñ½^*º9æo£êVA›,‰iïfy3Q®<_«vÚ ôÛ86Ü #D)è;êÜXö4¼̈Y}/¦5dÒ€ø‡„µ&!D)UTö§£:Àq•wEl±°· ™À=ö×úâ!¼ROe|”ªfø²BT¹ƒu›cILڎñ{ü°Lœb¥)À•qM:4Š†Þã—4IXâµb„s¶ëör¿‡è…Ǐ„¢ ”…ù¸¤F‡ ÿ¬DZ¨l“ÄÊ­Š æÇJ[ ¼„ùÓ âs†|H‘¶µ2‚¥P·a ,p.hLjáùñë)¹KÁFá¢<,l˜—Ãæo4Ƃ¿&l»^³œÓ ¥ô¼Œb¸Ö8&~P³]ñmÛ¶ÌxÜ-J]{à?j}íO€ÕÛ¢·\[ÕÎMEžEf(&ÏQ‡÷éÓñg³t™q†f µNÈԂtÜZä'è0ˆm½ð\3„‹5Ÿ£rú·:HTèÓÌ¿“舗%ƒå¹žËxÆçÚÎïFĪb”(PÃÄ×öâšæZx%jâ ö§}BïfÑN7[ð¬ +ÄX±Mìh‡dUŸd%õ%&N×Òe]Ó|Ä©çòë68¥œñò±šÁ„%-ûÔéü+‘ôÊ Q¯çÿ²9Ç+WÅyé`Q]*ƒÕ¸öoZ&˜‘˜cäYä÷`éz€_™ÞMZö–0jHº¿…{ÝpրÚ×<µæŸýQ¡oQ….CŸ°u˜ìcqóL>ÿÕBݞ†ïfílõŠ€^Ã8Ê\dѹˆJm7sBìä‹5ÜAªŒ3ú° +E”÷gÔ؁+Ÿõ£%R™/™íL ö›AßBœ –xŒ;1#ÀÜÊèÓ®¡ýÊ=ÂÜ8Á‡‚¸…†±) È ”r½mƒŠN}ªbpSHìȱŽã¾N½`ñ<¯¿?,œù¤ 9Ë̚¹Ä°§f'ЅKˆžC9xÑÉÎÌdÀÜNãJ÷ø`ÞNØp…CI2.žú"ŠœÎžCžëªÆÞðV!¶Â­óŽÈèàXž-qÇñÀ¼ƒRã{m(h’®Àj:›Ø’„ ¤éD•òrß\ (éqàù£ÌZ÷Z|¾Ï£Ah£“E,Ѧ¦ÿ;hCïCQcSû‚ž€Ë.O=ìylÊJIõV> ú£€ÝD¢)sT0Oøsè„ÿs˜xf~ m/š¦‹†ùÇG¥à¾œOv‡sÒ~î|G­<]ELf±ŽJ¦ŽöU5Ù|këõ•=wÒl1þ)ÇyÚ8 +Ñn3dzÌf ÷ø§YmaûGFxÎê–g%av²Ò39åøʊíÔ¨ïÇMðè¢%z³ÝCGÐ-Ånþ6`5û"\‚l:rҍ…˜= ÜÅH³²aá±µ8üìK¾¢è*é‘|ËÀú?“ž¯@à!ñ¹¨òŠôdá(pMDßvŒ ƒG-yuìºÑ ©Ä#k†¥ü´ÑýRnðj£l•ÕB¥`HˆÅ$墄e‘Oó32ƒóžxDð˜rïѺ‡êL»yÎ ,Ñ°ÓZñLü(ðОæFçµíÞåjï  Þáö®©iœ¾m%4Ú3fjüÁúj疡 +Ôkó<$?BˆG•Óm ‰Ëm¤îiQŸRXŒ5¨hþ»6ó£µó{ú4ìHÐ`BD”q´aÕð—Åžá"õ'SÃü©Ã7I&»¿kŸTs@@J§tD”g²Ÿ䏴à Ü0f´ôâHìêdØ_Ø(SÒâëF!Nɯ¢„=žg^4¿1µ°ø°­ $…ŒÕA®[Csù5 ÂRiÔ]6²'ìƒÕ½ ®T㘆õ|¯á™ 8D@Ö\ÃcI +Þ¥8B7Â-«Úè.^2Ô¾Ã`‚.hF&ƒ.æO‹Ûi¦=ï䠞aiìšÑ[!’w&s„œºF(±¥Sóë_Ii'&?5[±°±dá /Ö¿Î2¤T‘2SÂZv{ž¸×ʟS¨vHýX¶cë)@d}=¾Ï…ñY·vúԙ.&AÜå¶îoPª1M‹Æ4üU8&åoÈBå‡ß…0pÚ¢¨øÂÖàìðÙç>Q1‘Gr`ìQ,™ôM/ðˆÃšq]êÂ%‚?Šæœ]$È«æckŸ(™&Õ16U5Ó^›Á_ ã,ðKQ„H_‘LñÏf ¨Î¢5Ʊe|NÄùÎàF0sÄû»†ö§9– ⥓–d*Ï«Œžä‡GG„/Þ¬Ǔ¦ß€Û<š„.薈𛛢“±K>™OÍاUç¬G"TÖ¡ úo¸¢CÒ^JèÎMj~Ä9ڃMЍeÞ¡QÍ]Öm +Ú.¼‹¾ Jšñלlß©&Câu&Ó5y¨ÎbÃì¨C‘¡½ñIP2S#¦Í;µTæE1Z6ᄠ$ÕT"S|³Û•ôFû#_o|ÏJ'¿ ³í¢+«¡Í!ĒjÐr±˜~œ=p«•6ÖæM#muLÓm· °Kj¬)ÖmžÒ’;¶b;ÐU=¥?<ö<˽ÆˇTŽ]øÆG´ +mLºjªÎþg³…²‘äÍ1{g7 +ÃÔæ_^G&š{ò ќ×ÓŽÞe½³VßLýL׬õü!¶IÁq`ýjÞd¿²Ï›[‰í5äàžŸ*ïPªÝ/ímØN$Ä7Â2zqþÏ¡D6%ÕS÷2îúŸ´øXJ.!# ,_@*/͜vŒ£³\Ü"œþLawd‹M¸ˆ¼X¹N×ñ‚—†ÆÒÜÚM"©X‹%ïÞâ0/Á%(>p£ Äwì([ñT4,5¨kf§Д!΃¬Ë§µc“ q*˜ fp组¹\è; ̔¸(vgù¸u„ß|ßtBá5¯"MÒíxE·,ÏDÈv[…xî¶\¡Å…¥Øá]r[öÓ[njJ§¨ÍGŒnj=v)úà‰$d»ºå=wû¤þ$ŽBÔ>›°Þ˜v] ̍‘c Öއ“.öö/,÷vÖË+Ðÿè$Š¤ODñq-†ì^×Ë9ŽíRŸtYÍ5!gÇØLPûâ6@wÚâk!QQs8º)¹c:TãroC–±Qõ!VòÌŠwÎý{±ȧEs"¯meŸ°XIÃbȯˆ±Ñ!§«S¦WFk`ùi£àÁ®YÊ۟xö0Žâz¡:^¦K%θ®[ñ«üÔ] Rlж÷o¸Šæ»Áôô}Ã×oÒ'!FùœRÝ/­Ûý¢ÛJBoÃ6ê`µk¦á}Œ¶=‚í¼\³›œ~҃WØLHG‰·K#Ã]ÖëDFêšÙUtÃïڐƒè*wÞ-Fˆª»>ÐM¼úÆ XÙû‹V%ûÊÆ ±±`òÅlV‡®Ðñ¼LTlÅ|Æd|Εpt`x³Õâ$íNåC¿ÁakêˆCáwõ•#Ãb;À|lo"˜ Dâ²CØ–CÑ7AŽÂ= 3ÑÌ5ÎȂ<kۛ¯`*ÄßW=h¯,ž¢[Àèz҉\l]ú. £¤…c®>_poµ+‘’Ž¾3¢Cl³h¸×ÑZ†Ó0,áxßü]­5ë=–ðŒ3J2­9Êv™Ái5[™â'ïºúæ’ã„màè»,‹cþ*µOBÓ¥4‚ïõ ¶ýÞÄ +ȕ[xÚP¸%-qÁKÞA#YçPÖ ªª×²ñã—+ȁÖæà nVû}£ÑM7Ž‰83>œ²^ ÔV»ù¤°yª"(p¤o3v“N’|W¶ÿ`Ãè(–ðù;ä™ÔÆn(Oª?¯B'Ԃ+í\°&‡Ûª?ÅÅÞ¸‚°oûiøLƒOâÙ@EéCªEO"뙵¢…`•íÐ-¡,@³ÉdÖ¢U7?vÈE-y&8†€Ú6뎇*Æóû]rǧ’ëó;ºUԓ$¾HÏók@bFžÉ!‡¢Çǎ!T¼ïƆ¥X¸}VÓŎ)‘Ðœ:Ðpü(á$,.QeNô=ûg,)ÈÈau ƒ¬ÚÝ©èT"ðÐÖÍC’97[ÐÞÓÑ!_XŽÒä2Ôw—íà:ˆæRAlþšCÿ¿Dêö(øB©§„ÙË#U‹‘BÀ=.qãS À¥}ÄbšdÔ/ÖTDãm`Y +£DÚª‰›n“¶ +•†.š’´)¸QÛùôÝ9¾#1DÉoÏo´ç`ꅭ׋É!°ƒ‰=Þ‡eFGÈ.³ÑWçœÚŠ™eáK;üÃÑßÚ,Þq+¿Œ[)‚`ˆ³*kÌ›(=ŒdI^(hX À€„=ù?~>«Q­·ñöòA§`7¾'-GÐsLix ꮳй@?Õ_JíØ"@½Žï¿òXOìörȆáñ-ï±ñð/Ê ^»TU¯û5Çû¶¨`'lEÊÝÀ)' 7ü6ҚŒÝ­tÒà×Ö4Œ}SußàÛêôגÛÒ»U )ã’flŠbžÊ@‹ŒÀÁ ‰Y÷Ãú!Ò7C÷ѼÍRT +¹n*•TϯÅ(¤V|욐{\ɌòÇ$Qu±:å)£ä“XQˆÜG^¦×G(Ò-„C9AÂhܾ»ÃŸ©˜òCìsڝJdv5Ձœþ4èAEʏ[>C)v(Ï'Ô¡zµˆKïsU|¤ï¶z7£xbÌE8[fMœ>*éA{¨Ô¬Z,¦Ia#MévŒÕ ++ªÙ—Vɂ­…ôæ:¾ÏEg³Á,ârþM&çmÒx£Õ¢ 8äÇBò¥$1°vîZ~Ó©*üéà5‘NâfÒÉðFߔ‚N3.ãà8œ0Ž’Žýs™C÷ Ì&O…€â“;‚ßjyyàšvP{<GÜJzdÂ`‚nøK“þÈ¡ÎEÛ\’‘A\Ô揞 v»ú:5IG¹{™'v§Vo:™Ç/ïNŠrcåiuǵhààš/Ù…àç»­m×ÙrYQÑ ªás oŽ— mXEùûç|õü¸Ʊ5¡n¯µÂµ‹7~6Ú>Ww2RCžX&NKtÜþyÝ-¯âf±6ÓIÿ¡鸮͒YȞçuû×=œD•„&W(nwBvëÆP…MÓû¡N/k°˜éäȟ†p‚––P¥Žs +홣î`ʺGv0iD†P“/äi6¶þzóÎýôœ»UGª÷Ì{ÄrJ–H6øQok!Q„Q$Ž×Dnd4‘óKo]Šs¹4CqRYcn¢ëåx¨ôÚ?©-D:<šk…ïÅ9´,!ñ9b¯J pV£vc7ˆ²;P& ª$L¬mìþ«žcpÓdáόžrÚÛ wÄÂu‘g.&æ·;YÑXì‡\-2LJ¾ì9ÂjPAâìk]·µÙ¡9Y˜ÃSJDuÊh•2Ó(÷˜ËÏèÆþÃIËë©êÃùâ!ûðzvm0X%©'`4Úá–1(,£B¥Xt$ósk$³K–í¨^¸\±CCÃêÆs‘3Fb…æx+ÕW(¼¡[ ´ï°0 F>PvnE‘XJº‰ëd1gC]Ì.Òá\]DbtHɑý£@*M6Å«^#¦„ÇñÁ5Š•Á_p·æˆ5[ÚS«Ä=¨åч_üYô:™ÉW³]h¯!°õqÀ.Xj&x‰3ŽTv•ºW–¤1ùuºüHËmi¸}°²S1þ§/_#§MȱlÉû¯å×åJ>ln—úFnNH;Šton”¡ã;pâ¦âý0À\S€Èõx5ôAhc³´÷Q{òÃVJ´ù÷ïdLë =ßZª”š"’Î0 ]à6 ã‚BÄ)Iï»:,ØåëIÓ]ʉßW•’6¤k|Íõ|ùçÂj8»¾³ÐtïA,gÝp3Œn(™î6nó8C‡A,O´Õ$'çŽÑuëG;½>«ÎWÚ¸ÑÞ´‰›óù阞hib¶³SBø mÐ_úaãÛõõUeruŽ¦Øƒ¦%­‚Û²Ö2B“ƒ)âiÚӖʕ/ÑX–{¡7 ãÁñ+a„s§ïlEÉhš¡“õºµÆpS:ГðR¶(…´«XÌtsà °˜ØíÇmë7Ô‘w+g¾Ð%ð€âüñf­Ì¨ëá +¼'ôoŽÛŽÚ,’\#}q-”à\c•vÍi‚€AW½yšnûÍC+@µé3íH؇'#5ƝFï²iÐ/;] +A€½Á\Êå&EƒQÄ£%×NNá®ØÅ8ðí$we@Hklãòєd‘•¬x2@‹á.Sj‰£[+” 8GMhÆR<3R=³SøÀ1:k¦¹óv†Í Qd`ççCô,zÜ$~s1ˎr“·PX:ˆRÔm +#£ôp9ZeqF©„$SsËg'öe)Ñoé»Çé‚{Eh]¼C…H6YàßóKº…š‹gfüãZ£E¦sÑȱhÞ +y«AdJ£®}F! +Ñù¥ÂÚdíá¶6ŠÖ¸0þ›È†û2üG¦G5®‡ãì¡ÆÛ¸^ +Å͇`»×dvüiûڇþ÷_ºIƒ|/¥CŽÚéõ·Ó¤CÖE ã7ªÌX#=À­å+«L ‘cf+÷ŒŽ)£©À×RÔ6 ßg½öšåà>ØÌâ›-9<ònÊÆMŒØԈÙ‚—'~.Í7\ËVdšY%ãÀva7ñ°QJ\½a§} +É9.²I¶&2‡æ0ÿ%ÌG º1î6À~‚Fap–FU?Ós¡tü\BÄãYs¬·X5© + ø_CQÃéb7†h–¢ûã«æÆBoc0…â?ÉËHڞIF’‹¿§À–UUí–f¨s'";‘²ÄÊ˦~ ¿Zº. $¦û]VîØ0ÇZÒbº4gTC]„cà:Þü5Gǜw½†sÆ]DIœõð¶Ž{`aþZÄW.ËÕíþõr1}´ŒÃq0¢‰9]%ª.GZ=†."‡Ýì|ðÇò²„±‰tx—ïěˆVB ÌfCæï—Û÷¸àn 0x,@L2º”dc!Ë.h¥ë&Òh¤}—.ʾ×t ²}ÔaBæ(B/ø2ÀiŒ©l nZYº™\85öŒÉB–qÖªáðG\OCR>v|Û8ô¨c_:ÆÖp–7uøãëª3‹ ›…ArΜ‚¬gžï"=ô,cüËéñ%žš¿£{‰´tTT…’öÅYjé¢Q»#íú½€§F-C°M‡Y¥‘D™ñ^-#ÿRŸÑÅdÎÅqÙ:§óßt@.q³ÒsçÀäb™ê€§X |YܤÚ{ÆA€õ4æ³ælpíýÓbŠ›ù‘§ˆ^«0‡ÉÍh?»âF_ÙI0ÿ¢ ƒÀ?ö#VÁ诌³PŠA0‚c¤ø•†ävݨQ—8"蛣H‡×xXÒv›ÿ$ÐÀά„KÏ+éú’ÀÿŸCèî´ºTj94[ÏïÙ¶ýKÝZ>·nÏMÿÑn¦6Ðb7•\\@· +£Ÿmâ:Y’¿gåü¡ ׇfÉÃßG“ÿ=¤å(æە!é.ˆ‘w]yâ6 +‹~¾¹-.÷É%…†xå?¯ú7Ê2NǼFåÓyeø¡—Æ¢¡áæùÅ`,,«^¢}P~‰›Þ¹ä‡?~±PÔôj é?¢—}%øw^ m™Wë4Ôí¼Z3ÞÅ¿mllÕyÉ cq äï¼»^Ú 7–2/%ÆgÊ+ÇVyÙáÊKC±¼¢ wÑ8®æå¡¡yÅÛ3ó +S +ˆKÐu—0ŒÅ5 _”Œ_Ž*Œ…!/›¯D„¼d òJIBˆDÀÇ]~ÅXàMÏeÆX^:OàHñ˜ÜE8ËË:ɋ69^Iít3¥x!DÔñÚçúÀ™Ç+@¿¯§†Þ»ÀS¼*d,èNUäîxU#…|Œ!®ŸßñŠJñr/gDŠ×¾ãul‹­ªŸùŽ—äf,zo×~yMö†ó*5ÎXôõ:aŠ.¸=J í¼tåà%xT1<ñDRæcEù†ÈE™­w^U Du‚½ÌÇk,BÚy ÈX<Ñ`ÐØ?ÞÅåXðQÙXo컌‹cž8ǸA;VǂǒÇ"¢=FN»pkJ G™2±5d ìÈ‚²È$Z#S‡,‡dDÉ^/K涘 nMÖéd` µôÉÂÊd6Ç¢-¬fE8¨²™´aÊ$9}¨,Ûýª2Ç"ñ7‰§Ê"s  ÑIJ2mveB³1Ž…A&+›÷kW6š©ð³”3[ah’#±LDVröhXIJ*ïÊlÊÊԐÒDþáXÐËÊ ×„¢TÙ·\pPÙësrc×.e<8ˆXx¥…¶”%UE‹ZcѲýéRF¨ ¢±±pxAõ)›ËbÆS¶Z¥Œ¦Œ2…iEÖ¹EPæ}g& "tÖBÙgú­AʁÞm,R[›¢üD)Lß·©²T¦o”-ô°i)s#°ïß'ÐåS&\­a³åÆYɆm,$5ýåÒ¿±gðe’†ƒ‚T¡»±è;_¦Úo,\„ TÛXHÐSæ™ 0ucá{Ùèÿ²Ž·“0“ßX4³Àû/ ¹½ìéƪëR7Bd3ßX@íƂÆl½±`Ìí²oÝs—‰Áº±çÉ÷.{g.{ØX8Þ ,«¬\vwYÀvYÒp—™×XÈÎRc!°——1½~”Ó.[ž±ºË`s™•©[v沙ªlsÝ8—-¼ìKWã0·0z%ÑfÂ!º0#. 3¹ëO”ȱìÂìUf4fƌ…Žº0ƒË“0 Xb¶‘–u³B˜ìOÀ]¤˜qϊy¹Dž3 +s†™؟ Õ®84Ï2ÃLÌ3‰ùŒÅÑOέÇÌ{Of _fÝÌ®h¦Û¤™EøóR³l‹º5‹ÙL*u嶙­¾› à †ÆB#9r´OôHÎZÓXÐ^âöoÎ65GIcáO:ûÒ:KØv¦¿³­È3ï£gb̞UðøŒì³EMõ³¹ùÏä4ýh}™7‚ƪÍM#4e±ÐdkhäC“$Z´(š±¦Es7FË£6šÆ·£=ëþÑlƒHknIsŠ&Mƒ§æN5ÊXi\cÁUKK°/MbcÑúwsÎ6  iÂgÓN3áNëړÎ-´O‹[AMøjæ/jU78Bm,V –PL­N­ÆÆÓP­ÌþsÜTÕÙ«ö¬V[c ®Vx5Çk‹ÒŠ5C²Æª²ßÆó¬Îó´f_ÙX`šÃÖº–k,8·f›‹ANÝZ\Û¨±è‚tÑ04‘¼Úµ’ñš{…d¯™úZÿZüljAØèc‚šˆM›+6ø2¶ˆØ±ÁÔXˆ@d §ÉfV+[ã_6Šh¶\‹³Yl,D?=T×tpª¦o+Ž¥m¼Æ¢Ñ§m¨¶„bm +Òµ­æ°MݚmbYÛJl,мmË‹âÔÜ6¯w[Àø¶«7mR¸™5q+ÌqÓؒ۔.7“ }s«¥±@Ðml?é†ÞËRcá è¶òs«È禈G·íg;EÏèfŠÆbù閥dé™ÆBÀýª­‰ºERG©[¼Q7;­[ ¼±ÛfÚnín’g,Úü»A…xS‚Æ¢UòÖ+Úæí,Åé-Ì[o"5Õöfc1ú{«‰±B¾5}ƒ0û¶‚øÍ4ë7Ùô· ì¿ÁÂXˆàšÀ /Æ¢¼,ÿ'1)‚+3k¥9 ÁÑc,œà‚&cÑ°KAp⒏ôãë(¸¬4ž‚;PÆb3n;«38‡Œ…4*¸6,ی…ÓY‰Ü(g,p"´ëO»Ï\fAÜJ.a(p–@cáŠg,€Ò œ@)à(® ĸ]ÏX’ )pçÀ +ÍAcácÏ8‡u5[spæ5ƒž`·QÅ$'H½Í#À4‹ý[˜ò7 ˆÜ}ÆÂK¿ývÇBþ&á*?Rž~‹°€üí.ñ·M͌…âüÎüMÜûÍc YÀàoÍÖ.Ž8 +Ð÷Úþ›·I#p/ÛQÆŸïÚ'¹®Ò¯ôÎXð1c!c<àäÊXԋ.ƒZD…f˜±¬±ŒÅÍå×ÔP•ð¤EÞ± Üë`!×HQÆâTëbÆ@g,¦ñÅÀQT4μÀ- +WÂ_¿Ô ׳œä€sP* ¥È­Ÿ@E£À•~.q†/¸a9àÀñ CJ8ï´Qf“·g(\ÁÏ•Ã)c '+®Å|8Æ +q­:â,i,ÔK\bPœ‹‰Šû]ÑXÈ +‹+‰àó\œí ãP›@3ç앱•¸r2B帲2¸¿™¡„©ª²Âáãvä,S!§à‰œ@Æ¢Í_q‹P/bÆšÑ%—ý–œy–Àb¤”€j%w¯#N%wŸ±Ø˜t˜±8܂—r—±`Ù¸ +scÚÏ4¹øätAéx9…ŒERR]’s°0!åàö/)»¨’8)—Át¸:&å°×;ͧr@9y„»lŒ…0ÿ©Ê‰Câ#ŠÇ†UÎz¥ nWz®œì[9+ÆX@o©U…±h¤ô—GTWîA)L*M)rB¾X4Rå  ^½[£SfUXÈõcÆ¢Ž-ÄX`¤1àÂ[>où^Ø՞ðÖªx^œüºš«œ– =ÆBFî²æ2`m.cQwÆXÜé›ÛÚo΁‰*%ۜTᒱXf67W6g–±Pœ›+œ[8g#9Gé+cѦΥӝ#bž³Ð÷œùø¹’Œ +ª‚Π:QŒEçÐ9ÕMt¶^tâptfl®@%†SºléŒ!Ó©mӕÃX ª®äO§!¢lŽÔÐÔ1ЫêZ ®î¿ÁB6 ÃXœ–û‹ÓµºXx +Mér~™`½êž,dØb±µXä)4®n¥d±ðPùs«Ûi¯¸º +nuRp£ÅÂ;°.È@Üdv9“ÖÁ$,€Âb‘œ€G¬³b±:Gýgæ½ÏÖ©ÝÖ +‹Å['–A7˜Žh¯$"Ñ})+֕OŸSÅBI3o§bqóûU,Ȟ?ë¾\Yˆ‹­»v­SG:û+ÜdÅW,H{¸9‹…\w[¹Ï3ÿZWäÁÖIW,šƒë *ÐsX,´o]@·Î‚èÌKÄW,‹Ey¹uRJ¬]·Ÿíu Øe³XtŒ°Ë ¼ˆF4vš¼¬«]7Çb†Ïnè䣝\nÔnö¬]kŠíجí„ʉqnW@>zŽ,`áNÅbÑÇ]h‹EC²ôܖ‹ø~ª;f4»C¼°ØÐÔÅ¢¦[ób!„¸k}±ûõN6 yà;éµ¢êìÏò»+¹¿#FÀÓvOÆ¢. žQŒÅf¸6(<'Œ…Lp^¶d\"ü/ c1ñ*€‰'¶Š×Á€S*ûàÁ~ã5ڌ§•ûÆëÁñ$01—Ú‹Ü“èôxÆY}Lrc{<·þy¹¤©r<Û=ž¯>9^¹dˆ¸˜Ö¼„Ž7rUôl÷틅nÔ®+oðo¨ñLîŒJ‡ñRÂfx°5ÞÝt¼‚ëã}]ÈsIàü±xÔ ¼"ÂX ©TÞÞÚ²¼§Õ]^I‰y>L›yIÕ<™{ó|wóbp9çÁ‰±…獱ÐÉ|^mzðí¢×€c1¼*ïQ˜J¹å‡ø¦¨øœÝŒO6¯ó7ùÌ°QÚlò)ÁÊgà—Ïš¯^Îçƒ=_jBŸ9Œ…®Ñ× ¥c¡|úš1TŸÌX_µ¿X€<5µS¢à<Ù9(Í Uf_½ÏÙ'ÓBûòéî9ŽÒ>°< ¾mX8À ‹<1½0i +*Õkââ ðcñ‹)ÆÀ¢}/‚.²}á5qX¨ºËüÑ— ¾9¹aQݛsy‚WGÚgz½iÕ|hl&8,,nXঔ`ürP8,txLJ£ö‘QˆEsXˆ MÏeƦ}:GÀgû?–Kjßüøñi_͟¿HbÒ¾çOh_éAÄhÕ•tŠòÁE€³¥­ +Bˆ^ˆWxX¤I $Ú7¬ D× @ãgÙ)/"¨¨Í¾Sïgß;íëÞnÍTçÂõè’b?„üþb!‹¶œà ±¨$\é‘u8 eˆrùö¥]Û9jßÁMR–TWF®öÙKíS’«pñ´6§‹Ëm'V5±:µlÚgnö–´oôx0óS_ ô´O.¢´Ï_’ˆhLC,ˆ}ê„5ù ’çIhmòÚu"éìjõ‡ÿ…OxJùR´Ï ÔÐ>)¨þàn¨¡)Â2$³Ev }4ϾTö±êˆ…Ž3”³O¦E( }.I,´g_Ë5o 5ûÞ2ûÌás.^‰…Úué%mcÙ·2b±ØVö.b¡tňÅ`‡Ü‹ ŽÄâmtˆ€Ò9r±qv'fŸ‰EɲOÑZw!lVoöÁ“XôÈì3¢^ö=Tö‘ì+Xà0+¥-dߏ8bá0ŸÇØÌþ#±ï¥ôŠ}¥$­ÿ¬ ÓØ|Ä@"öEïI,¾óΰ¯ ËF,ð\þÇ è&ÄCb¡z›ðÚû®9uނYz¨€ö%P ÍÙb[ƒk÷ÆúŽX¼$Ç%3È[[Ä"ûûœ¢¦Ö‘µœÔ‰XÂŒð ±˜"öEö½¢uØ'¨baõv‘Ø3õIÑ% © ­î%±°«ý“ŸxºXûæ± 7ÙeeI!)c_áMóÄ8dí±øµÐVUHYD+5ŠÇ¾©ˆy)óÁøúPÉ·ÖW/ …SL|ñòh©›ç™B@Ì/5D;!Hb¬]ë[’=ëTNyëƒ1±ˆð†Ù¸¾Æ—\†o}l}µºõ™ +!\ßaÄ"óºõA<¸±Ëw¶>Ú¿õ¥ºŒÀ~²õÅ[듋X´Œ¨± TãX¿Âoë‹VjG,Til$^±@¸j}6´¾š òT@¦D¯Õ‹X8°Hi#müOg}ª°¢õŽ;bAúˆéçv±ˆjòåèAÈ>#i#^5¬ïÌFåRµœ×úÆÒD9bñ”¬wl}›GÝÌl #΍Üú®l}dÝ 9Àø¬-#¹Ög)b¡¢›Ö§Óڈ…“*bÁl}&"ô”{æH‹X8¤Ö7ê6„m}øF,H-¿}E d1$Í8o}Ý}„i"ä‰ O±`ØúÀïF,Œ¾²RŠX š©õ ±È¦ÝW0ç)½­­ÿßú¬b1ÃeZ×WU’æËyëӃX ·Å!Àˆ¨ÅÎÖçӛ¢±èMˆ…†:)µ_„Ný¸^ë{ôaA‚Œ[¡±õý´o}:9=,ÔÄõùk·>˜Ç.32ÂÖ§‡ÒÁўl}%w [Ð0›Ô',Äàí@­o÷¯¨ú°Èâ9ë“æeVÖGúY_º—Öçy­Ïÿ—±€Kë“;,IQ2Œ€ÿ°PcN±„  +bqÿjUÛ³>1£Ä–¢é)‹|óÌ 7E=#2ôÄK ӒK닞×JÑA,JôšƒKÓAˆ…‰ž ±ÈŸˆXÈ;Îú„8if5ƒ– °Zß/E,ˆ’±¸¨óö ÔOSÀ[ëk„X@NëCñ88ĂÍeï”/ˆXôôŽ°2ÄbõW­O­„XˆÎ l±Ð _…X¬Ø՞´Æš hiA,†²êçR£ä‹˜&…XP¼À€Òno`"/ãÂԃJë>Ä·Ö7RˆE°?ÃM&=^#ˆ…Úø ¶7Pü¡‘­odz‚XX®õiÍÖ× ®ºõ)8baª?,š8Öüba`—ÌIÙp}›6×gpX({d÷aa~XÓވëӀX´kü Ü·¾` j}ŸkëRSdñAºZ&¼5_¹ÞÕg™ŸYëk“ü°5‰F¶I\‡…›ºÃ‚âÖÇ©Åõ) Á ¶¾ÙGq™äaQþòÑ·ÈÑ+fæÖúêù°“ÜUâ¸sëÃ\ßµk€ï M®¯âÃBáúRÞiM®ïèañ bóaòÛ}áúŠ”\ßÿÃÂ~8~\_‹+nC‡ü·>B,‚Ÿ€±È¹—7!øbÑêí />,œ9q}Jaao}+;öúnIÃÖçT·¾ªÍ/qR®/¶óF¸ [ðas}÷ý·¾ª)õxX°§‡…ßÊ߸>`ÐË.nC»õUèÔ$Ž£P"@N@1í€}Øw€}8WJ)¥´3Yƒªª,¨ªªªk@3333333›¢ÎDÿþþþþˆŸù°Ä,1KŒZ«@ñ?Q@bø:Lh°lÓ €× r´ÔˆÀf4šU´Ýˆž$3Aª4*Yÿ£–÷@Qó~Ä&'‚§ªL†1ëìIfÿ‰N©%0ÃÁK6Œ¡s†&ù‰aU›Œd–\ÊS+®å©U§ÐÃM§X©Îv¶^r!x’èv–ÈN¡Ð`¤_rÎoZä5Ócbßv6Rt~äžã~Ûv.†]oB-¶ä×ËÞ·güó›ÖKÍó4´,¹ As$Qst5óDã_µäFô4¡­NÁµ(VÅy¯ê)€Nh+‚UkV‚Ú$vªÔP”伍TíonÝuñÚö_¿ñ»¬8ïûzÝAaù¦šNÄHΏ$Ã÷ãønrTç¡Y2<$¡2=¬nçDDϳ22Û뉞ó!xªÊFøX¥»ê À*µãõ¬*jó‰¾s¼ .¸’áV}¤Øµ‡STÆÁׄ6CÉåæSEρƒætGBp?õ›Þó\Éû7Hr1AéÁ,·Ç/;JSì²ÜBÓ¡–å²]²¼'7^Ç¢äRSœ‚'¯m½Õ ¯kVÑî€O2:¤XœojÖÿPÕt,ʱ¹$Ví'BÝw#d°ÖJähÁ©øyáKèP½‘ðI­™4»ÜžÞ5„(—*j¢#tŠÈ)„Yn*Í0^F’ .dù—3-ç±`6^“ÛÖÛ¡¦ý2”XgEîØd%ûCèD­EBԞ2¥6ÂfKî…OœwI¶ý\.Z §™ß!†H-"ìR Šç*°<Í7ÌXÍŽÉ©Ã܊ÖrýÙ-ó'tÄp b„ÄN7˦ú%gÂË[ÀA*«€3Ÿ@F›n0Ã]SàùºS¦Wr0M*9 +ZälM™Ø-~Md#h†Ò'I06šg{ÿâ<Ïý¨l}UÑY^ òŠíƒLçŽ"z×xzÑuF®ø.Ԇå|Ô°8Å'´ç÷LÌ NÑ”oځJЙDšŠ–‰_TÛ–l'ýʛ0·ìËnÚîÆ:¦_ŽÝ¬i}O5m7ýºë„Ô}'¨2ކû¯‰r™ÑDÇr'~Sg"Ư8 ¨»îYEÛÛfÑòŒÎvžŠß]¹s¼¡ 8wûî‡Ø‰š£ÒbK1²ùBé¼jhmŠ-,÷ Ñû/Ê°œ `}‡ªž›fÓjü8Éò`ð”ë3~Îö—%{ï{Êé²Ú´¼$0šžôŒaÄJˑŽñ*È®: +§µã”ˆœ"ùŠ&ù 4,çS‹£‰†½½<Çà¬Üw¿‰hn竎ë3Rr¦‰Æ¯l~ÓÙÝXÚÞMÓÊ,‚hÏ4ÌlÊu÷IŠZp+Ê09):_´ºý9Ts^Å)6w#ïWšaürÌ>£8Vo1ƒ“1$ÛKŠl~*¯ÓvËöœ†Înh­]p4$ÇóUÑs5L²œÌ²|OfÙvKnÚ¯ýÊï„Ø2~heï‘Ö¶¿Hè­'³ë3`Ѳ_¯Ú^ á:L´l/¢ÓE!ÉéÀCoº+ø}'¼šù*N¯z‹s CçƒUôþæYžû¡ª÷SîÜ.ˆ]ã{¦c8æµ\wbÇê/Í'¹LtÜ&ã,DZ^¥¡(Åw¢~ÕÒ÷´`9÷KÇ+ZÝvÁ*:®“q产jʼn(Ãê>VtƯ +­EÕvaz±mèaz0ÁàRšäû T½¯q¢õ@S4t÷ÒL÷‰ØôýjÉ͇nÑý?«µ=\l%Å4_Ù¶SI®ý/M´þGeó³ÜyޑzÖK³o:àX=„ÍUZ‰Q<竪ýG­šßäšç€×0 ˁ$<#F(µÍt ߸eŸfhf(n§H~Açˆ"¸d¶"õ¯$³ìdôtA–Mm 1Dk"Ù±@\k1NöþWuó»^2<-#µ.Â-µ ,_­ž'¹í ž[Àâ'+.ÄNوž-´>[k2Ž[o>Ö1ÞGýÒO`â¥A 4 +䨵F3ӗ,¿ò"€¤ÜXœa|iØ̚ëÀDë½¥ÓY‹¡“ûéEÏy¿æ‚Ö¶Ëö·k>QQ{Of¢ûµà¶þÊ}÷¥„Òl=çx1I÷ÞåøÖÃð…ÝŽV7QÙ^™ mÇX%§ $J”¶é°Ü²=nM/º•û‹Øv¨ºÆ;³q>’j¦÷ýÆ鰒èuL_7 ‚Óy^t:§oé~j[·÷/ΰý£&WbDï—Õ9Ë‹ÍÁ +–áÅhRܺ©nÊ*½ÍMסG*͏”™Nt|¿B"³{2zã·å¶­ßvÍò†¼i5¶Ü2= T­ïC”îpÓc~Éöœè–[ƒ(؄¤·È1\i¦÷K.›î +^×Åõ’Û5ÝHìM +§‚ˆUÖbøŦÄÓ=}Û*x +b³@ŠHí†QZ3Ò09aöüæDtÆobçt*€¨È<Œ[j6Ð4~‡ŠÖ3¯r:/"¸]Gi§Ø¸@·\¢aõŸ«y£¨å6ã$ë—\uÿKä®[*’çQ!Åñxªcö%—Û 5·Ìº÷%Gq}®¯ë¼s۞K*Šóµ”èv$?Dh#  v,M v÷cœä=ɱŒ?1–çZé<Ô½O*’ÓAÍñz”YjH’HJ­2˜fãDïq¤é½1Ûî#½ýÖ 3þ£)%÷YÍwã2 nF1|÷¦é\–í¼՝gTô¦"bç­^¸ëÓ ½íjªãz sÌí*–£‘’ï×.Üî*i®·ÅÇc:Š×éTËvdVÍnÇ|®Ø\ÉSk­dùµ6#‹bÇö:P­¶œj9?£VÇpCµ†â§%—Ò ÃÏPÇòͬ¸’æ~†î»LÁò9X,¸ Ø+Îdé—Ó<÷qžlº'[ïâ,×_šeûÑ*÷uÓh ­m}S ÷­rj¾ê1€Êø˜d›îÆéÎ{vÛ{T!4ÞNõ‹ßàÅÍ×NÐÖ LîPT…¤² +5Nl v¸æfÅ})×½g¤¦q¡äx%dydĚëIÞ58×`½ª]¥ª]@µªÝð©žïFî.Ki¾?™Ù«ì=°êæ'}ÙöČÔô¤†æuÑ-ܟ·ýZ°ÛNå)‡ÄÊñx¦é}S íÉm珂ÈꪊÐð–‚ÒꪊÎê˜â|#!xÿgÚîC·óº¨ùNb{IŠµ…0±ÈfµÔ@Šcr3Êy³jFÃ'5ç]¢^oQïš?¤ºï8œ©@åº0C•fÓtß ©ó¼*wžgý¶ùÔoºŽ•Dï/ ‘Ù©ñ:—æÓLßiši{˱l—y†í¿¬8BG–ðbåҁºý4KwÌ’í^ÙtS¯û®Ù]ÛI½o;¥¶g¢ÛÕLÅÚ|ײ\7 :5»ŠÊéD‚ãúŠ1¸!u­'/™ùÓKjv3Ës¥H– úšÑ¨vçw5Ñp}G:žRßv>RøÑJßsjãx+N°úˆ¦x  ­6˜¥Úîúuß9Åó‚Ôvγ͟¢ñK훎ë%Ëkažç€Ó7]Ö;ÏS"’×1·h{—H=&j灶b¸åVßJ"ÓSfËzA+5!5Ž÷•çõ<åw\.ڞ’PÙÝ×û¶«qŠÕEø(•°ç6à•Ýižó$J±O5ÿÁžñQ°º?t´®{BZ׍§ÌRA¹kžëü‰°¸;VkÅ0ûŒT™Uﯔàwä§x’ÐOÇIžÃ©éˆÞ0¾¥šµöµ5ÄސE`jݦ1·nÓØ[ÊT+ä™å–å²ÓHÇðÙ¡õ>[D–SzÇmJ/Z +>ï¿Gâ¹&¥5ˆEßaœæ8àôM·u×ý²g~‘šÿ-Z÷ÁBñ< æ—ÛMsl …ÖæìJ³™šã’[µÜYTRünì)^†z÷‘Ýôž¸Mߍˆä~¤vÍÇ¡šçt¦g¼ÉR,…®Ç@Çâ¦Ý5É%û%&­"•W bp4Òò}*„–2b穒âþr¼?vôFãùçâXe¦ô’åªà¶¾#™UòÜ¢ŸD½Ê\ªadM&±öv + MLÊ:‹hŸÈ.GNc• (1Ð•¹(&+vÍlÓo;¿CEÏ­q¾Üi-ïË¥Ûµðu¹9PJ£ ¹Ú ßôÜВYÎÊvöC„¥V Š +ûžªÆN_^î-Öü‹,‚éօ›"3 tŒ-EÊÅÃY%ÇɎ•Q‰ÎoS"²Ü÷ˍäÙ¥V¢sCRÙuC]º 0™ -ø½_ +Ñl¼[ì!(1RŠê,bù­‘Êò¸6‰c²[î‘i•:h´õ.ª +#*Қ‹p™Ð&]§ò +öª­"ý:Û±¢áŒY7>ë•÷“†ä|.¤3º°%3?‘œ•DæG_­í`§0´m“Qw‰D·û$#Èh F×ûIJDTEa8Ì>0s£LÁ.mP£Ê%ˆNåç˜ZŒt,÷«¾é¬Û²<©£¹‹é='¥ôÆ3ÁóCBò}ÐÊÆË8Ë÷o—IË,$ë¤NñÕV¥H eÅHÒFUXF“pœ Âpžž¼L„˜ºbh•´d¶]lg8Dù…&åºýaIf5hžaöFª4ëÜOk¶'½g;µÈ¼&TÒ— a©àz¯`’˜Â5HMé Mê nø ‰œâ”4fÓeæa¢:ËI¡†¶ÌŒCbo>Û®5“è]溕¦Zó³à7“ ÷7¹ëþ×ÍOZ:ó‹–ÎùçR×Ú̐Ð8éÄÀ'4aµR…$¹0%…I¯®Î߬.6“•˜„e–d¥æ’µB{‘Ý°Dç7&¸Ü†””®ƒU•õEIbýP¾÷XÏsX¡¶~èh]gäšëTªYoä,´ãÒVY— +Lmë+-hJ쬅;õ.ÉJµJ\dÌ"±™±{N3vÍkNpZN¸-Ã%¹ëúR‘†Šç¹DëüŽ[‚Ëõ,Ñ_5ߧL^nÛ©­6ãSچ” +„ñûÅÂéä>±^•9‘ÄÒªIâ6-’ù­© ÞÂóJ-»ì’ãŽAZô*wkÐYÄ@ŒN²3^8&p@@ (´œðpœˆèp 0AB‹& +àä,!¡F W(²µè¼6dÔ®?¿ê9©:ÿåšÙ%‘ÝÍR•Qpã%»@*©Y8·U’Ço`– \V\è°à0¢Ã +Ž P0àA2AKÍQ’›XÀ`a eF)á×4réF•£Fⴕª•üÒɍƒsnËu¨ù~5 +ߍÝ-µiÒ¸°he`fÆG $˜Ìh)à#† +Ç &$@¼P F 21B jj” pn¢€|] Og©¶J‹…6j±Ú´ÓPљ˜’YÝö ïãPËv"ölÇu¡­t¥R~1JXBd8L\Á 8@ƒ„0PÌ(àdF /';‚@L Éj’ŠiÑËW*ÍL⚃À؈ݱ½Ø×}\17WÌ I©l·aÍ¸zÅ\\µV"˜Bª„!ΐ) hÀ1"Ñ$*FŒÀ‚H66?šO0ËRÒð¨‹Í5Rˁ‰Üü£¡¸]˜]‡Üšõ¾­¸NJçA¢Qe'ŽÛ. Àáv_2#3x´ ) Å‰Zp<`P $<´8€eÆ J êk´hDvÕâ +#±äŽ5°âë:ˆ9õp·èÉ ±Ü2ˆ\÷َÁ¡T©ÊhÀJmM$…)3T¸pL˜àG8DøÀabÄ lF| ä´už¤ÇmÉ‘Ô +ÑQ˜…ã˜cPi«-]ú"{‰©Y‰ÎpW¡t„Éå†Bh•ÆòÜR£Á"©U “Sbb¬´¼4%°¡q> “âkTVpêTEp™K–E£ +G#Šk¶êµhËã%ÃÕ:/…ÌiCGk;‘Ñ;?4Ï?…ÈpØ%1·©”ÕœxeDVIÂj5êLü`’è”E ŒIf°‰>h¡S¤Ë(Ú¨Õ،ŕ̄Ôè+FËå®p³ÔžAœ¢¨11 ¹™бâ…C8(XÁ1B  À‘p`¸`‚CÅ %R aBÅ–ã:¿/‡¤×+ §©ã¢Bä¶é×=§¼ÆûEß³½¥–[,F+\|E|Œøp\  ‚ƒƒ2¤à€À 0 Ç:p0`€ÃpL AŽ XpH P‚£C‰H^Œ€S¨(•›„Z5G‘Z™¡ñà¦19nV (Òú +L3Ž DpL€€ã„ ˆÀ8(p ƒ‚ (à€£pHP‚£„‰Ž+fñA‹R8“Ê„Hf¨XÛËÖ;·ñ¾ÖKæÇzåtAëYoGû%A >ˆ ᐠ @0‡ˆ +8"P‚£&p p*à@q…C…Š0ŒôHàa`^«4(³[2¢PòŽeTYHs‹Í¤ùå¦C%ϑ0£Ì(hé: Š”^¨@á¨pTxЁ#"à` (à8a‚…ãÂ"N|Òò#¹,j=òZÁ^­y¶cj4Ò²½ÄTٌäZ]÷ÁšëŒß2*7U'L8$P Cƒ +8¸À18*@ðÀáaƒ Pp4˜`Ç 8N  A Æ† 9ôÀÏpˆ¡P…£µêEµ(LŒ%Éf©­P±ÔB”Hp:C&ZDˆ2Èà`ð@€€c‚ *p<  ƒ"8XàÇ8>txÁAB„‡ 3ØÙIBp.‹"K†X*ì’ÚEõH}¢i„–ᤂ³HµÎBøhÅ*Ä(¥&y „ %R¤p@ˆ@‚C&àÐàÁGˆ"0¤à €áGŒ4 ¨ @i9°b㜠¸,ŠÑ=êÊ9ªB‡¾è¿®˜Z’ËÎ÷PÕúG)3gYC©ÄàF¦y@G  >p@pÃp4€NˆaÀKŠï€š%>ži>G¯!Õ©ÃRHk蛕Év‘!˜æ!$BŽ'\8X` X€c‚ 84páx ‚ "„ àĊLR” r~G$ŒÖ­Äíׇ¢‘9äi%Çт¡í`ÃjDà3;!nÛ e5^'c˜ÅÆa稽Á'–À “"„#8@à +dàhÀDÀá€84h˜ÁQÁB ŽHpˆaB@ˆIñ'šâP…ŸV DQéLŠ´ÐD#&•F8‰À\®Yo¦÷SEç/ä0ÅSmµ Ùö$Ù …IÊ—C…‡ 4p`@H8$L0ÁA¢ ‡ +;+TØp¤@ÁBŒ<ÄØT%"—$ ™OŽK'Ô!±n”:I¦ÆbÝRs±”2»à»† €1‚äPÇXà@@p(ðÀ*¬à¸ A„#B„0ÐÀ±a ,`8>>pˆ16ðóÁ^ˆJ¥bh‘Ì'Ù¨2I¡õ ­Øƒ0‰Éwà„‡ˆ€2z8(€ á@`8,€`ÁÁ¡ +GDp`ðàÁÁâ…Ç0<„ph!BÈÉë4@Þt”J$¢B]&^(³K–+î±ì’ÿªp=´mw'ˆÍ`fèD€ +Ž "B8 ˆÀG 4Àр (Á!ƒ  $xàb„£äÄ瀟ê;Æ  ~S¨Ê!¯íØÙxG\52Ê,5 5Ü2.V1 (>àPÄؑ@ŠÒ!Nf°\€A#E£²OʵÆs ƒ+jÑx *»ÏÒ4ϵDÁØ _t](HޟZËîH°8µUÜdÙ,×{pvÍÆҗLäÇ+–€ ;8ØÀ±À8p ‡H0àƒ‰“Td¨ Àè|Øø‚H0›RÜŸ6ƒÆ.–QðéU™Š#ÜÄøÅö¢gŠì™µÆ³ {«­óP¯ZïÕz[`E§(‚ä%TÌ@aCÈ0F ”¼Løhq"ÐQ‚Dà$JÀ‹?V¼èyàeG¨£9äf¡,z[ðù¦M§Èr¦ê<” ¯KjÕ{hM5,Nêmû•Ûõ~hU÷sŽWj9Ü°/L©"-Ô,tá`ðàG… 0 +!„ÀŠŸƒ’𛦕bVŒõ;~15j{Hæ>혜ÉÓË-†1ì$~cqŽÝ®]ø^y]ë—Ut%‰D–@‰s)P`Œ ø@"“ä"2×X‚M(ŒÛô ä·Mâø]g(fÉ„Ú±škWšw¨íJÃÞBìU¥â¾é¹~¤ÊùÌ*™_ªeë?ŽIl >Õ.Hb¬`è0Â!Aƒ PQÀ‹ 6@K~XŠJ­LèÁ¥VŸÒ +ƒÒúÒ-ZãAÑ;¢N凞Üø»]‹ÈsEp˜ý+•Á¦(EÀˆ=<„pHÐàÁáá )VÜЁò\`DÆ{IŠ–€/~ +!AseÈW¸„ÒpŒZ™ˆ‘]¸TôšíÖۇ“J­äY¥öÎÙ_¬Yn&Šàó„£’…›!SD¤plXQbÀŒ™§3T¦ ¤Èl˜±1" …eK€ˆŠÔ”d6¾  ‚K© KlW£Wbi4Ne"¯XN©s¦éºu{¶gݖÕHYjÁUàђhÑò$ÀÁ @Pã€$à€B bp¨8AC   (K^xÀð0¡¥V.¤EæíZÈ2k͉%³SI¦ïh¬Ì8 <ÑQ„b|Ó\ÏjɽW¥¯áÍzrÇw¥!²»o— O%Yžã%瀓¤6)†µ9¯fvSEgvá&zľ±Ènša¹-£4f¥µ½!n™‹©²6Kñ=OtI&ùˆ3i(«´U›@¥ÔFžZm"Ë.¸æ\Ktj Åñ©l¦ +ç 2ㅎÔ~E+5!Ù± "Agâ¹¼®ý¾ê™¯Â»«0¹ê"~†ÜÀ,Õ³(¬"­ªƒ8ØA_yð¹î‹%W¢émW B=Pù!­0µÚPü°ÖDôDÁøáz ŠïÌlüΙm÷¿ßwÝÎԌ^Íy°P¼ÎÉhn'e4¿ëQŠÝ[ø¦Ô\±Þ àqÔW]ItˆÞ ÆhՀ Ñ È³·è»•§¿DPÊ-dÉõ&ԖùOïúÎÙ]÷ƒÚóݦJ~Û¹’Ù ßu֙˥ÛÉ(Éù 9A헫•œ’È‹UòâˀÖb\ä=ß­¹žkØoÓü҃µî&~Up|’ÌLÊ†[ôþEfWñ{¢Ÿði‚K½íýY™µê¦³aª÷*€°Ø:ŠXmApWÞ$ê¥G³2£^Ò$ºËv +näʔãuJë¢z©2¥åQ©1™´Öj¼Qjd¼h?Md=Õ²K„ÞwA©÷Qo™O3ËÃ8nÅñl¹î<_(»ˆåÔmºŸç:ਸáÖ~¦ûr=:‹AMJ3á zÏt§Òn®`û>Qo`‚àz–äÍ/ºnÇê%׃íjKBBëEœOóH%tðæö4 +ã›h~Ñ6­fiÒ&[U·éVÕM<¿ï nŽYˆè|S<‡Ü$X'µ’«[GÔéÌãI…ÖbÕR~ÃÞ Be<·(]W# ×W ³Î<Ž]k.ŒPf.×*¹+‘Z„_RL ) +x†U"ŽÑ1Om[„SÛ®P”’/³èʧ²îWÜ´h<×=B÷]š`u–¥ùÂg*N¤¶÷Z.YžÏ³ŒÇYŠë*Ä°‹1¬þbˆå¦#-Ë=¡ÑÕøÂ"€¹*Í/5®wnGô=Ó«jãþªYî +N˵ïQFdvLBí;dš*Ɩ’·™°‰Š«À’ü¸ÖRž_r3U¬¸ê–˜ 냂ä{)N0»ž«µ)Þt&O1Â(5ê˜ÝdÆgÊú)Xœ 3<狾óV„ãüˆ¥x•í¸A +v,ÁŠW­è +èZöûdÅú¬yíºýOmºo“›“!Ī[À³_§Òh¦\pGDp<=Mðéx$×ûM×t1p¢èbŒÔ&z¢È\ »àX”á;8H~74·»¡ŽÙ3Ð ¥QŽWfDlz_í²íršXq*€˜Ô6ø •‘"É©Þ4] 2ë­c¸å‚“^Ûu@Tó%ÉçQÌb›‘ŠÉ»æº“»NuD¦'Zßû–æÙ¾Â,ÛYœa;Q›ö#·h¿4«­è$G©Va‰Òu5ͱý„”£¸&³>¯¹ /ý‹¢Ö}¸5û‹\³¾G+¾û²ä9¤–­/NÙzãXî„Ï*íÅ/¬î »Ï0Ë|mЛƒ#%?ÜæœdØDb;¦`e*æà„™EŒu|çˎ¹b¡q•Èv+Uš&:3]¬ºódšá¹’bW + .8@`ø‘¢¹4D¿±Ód2“Å—‚¨ýby͵™ÌZôxÓj¬ã +R° 4Hsdœò[柚:Ó`u¦ÂÇêí$)†Ç‚Û{Ǭ˜>e)…vÂ7„ÖðS´^‰n-ƒÄu”&›‡\ej¥ö³ý²çX»ò,Ѭ¹ͨ6@AlV”O5Ù¯¸hW=„é%'ó,çy¬æYo'Dzß%懹äf¨âû +ç£ Ëw>Zo'~°àVôP©¡,ÃêÆíYÿô¢÷2ˆVe>ªy.™]÷K’aû)ݱ†¢u‰žª5“äxÓ,ïg–awåVÜ +¡“Ù õËî çoª_p)O/·;Nfh”èC¬7ªØÜ/JÞ?`ْ1È¥u¤eý”¬?ñãDfÁ¦¨gIžBxõ6Ğ÷]Mï=”\o’sbÑyì×]7Ô¢ý)Ï°zK4¬®BØ4àrÄn‰ŠÙY±þ„éU)nŽ ^¹¥,ÃýeÏD\Œ¡ʲJMç +G B÷§_v_Åx¾³ðÁQÏ~bV}÷»¢ë^ž_s+ɬ8 ++Ù0„h” +aTüAÈ5 È) +P°b ,×ð&Q1 8Bnª×[vhÍrÇz§ø.¬Êõ^’ë: 2Uh"z¬ÒT’cý”×ë©h;=`µ'Ä¥Ê#ñL”Ší¥•2”TT²b < ^^šÈJ’a÷¡öìÿðã7ir±ÙLÉýD-¹=RmdŽâ¤`Ç ¼pÅ%‚MsmØ}g›'!ƩՅÉÔaœŠÃNY˜ñ®Aø Ø^±ê.ŽUn)ŽMñ¯×›‹µË Ç:¶#³o»›h™ÿ’\ו¸á‚ ¡•ÖB¸uWÌrˉžïECsv¬þbÈõ¦â×ç#eßåPÇ}Ÿ6l¯òò³Ñ)y:±8Åm(ͱûG²«îÃ7»k;¢¡xž“‘‰,·2¬cŒpÓ`’Ê<ø@±UÁh<™_PÙÁGP(™5VÑv%x Ð6ÄhÇNì©=Ø8•)0BË cÔ6bÕt2ŽZn Ç­7–eØ}æIî{ÃèF”^y kYo-çIüp±¯èþò*Öc{Èé–w²aziל a—݉®+Ñ£åfÁf >¢ÌbSvÃyÃ(6>Nn”|ÝdŠàh‚ÒB+´nû.)iíwfáuÙ-]ÚE×ád»âHœTi|†ÚÄdÏV¾ë>Md+O°»¦² Z´dš)W}Çêµ/1lRcq”zca|Rë0FÅHÇâ²Aî=’Y^Ò +ÇsQ’ó«ÚÏSEûyªç> "W܄°;B)b `$™ØÊî×܊_R|Y•Öcó‹¯æ"ÔxÝl¼k 4^õ¥7Ð6¬ãܺK¨I2óSåÆ¢§K®…OËmƱK®¤ù5wâ些•=ÐÂÔ2ñs4N‰n©±V¥ði"{A̒ېƒT恉¬ò)-FsÉl„*e† +ׯà÷ŒcW=F°¼ÿøYÓ©ðyÝeÇø%Ê°¹¦Ý¥éb<§ÊT bq;Ô´™ïÅ(jÙ)ÌÉ7à(™±nÍ­0»êEîyŸ¢“›qô‚;nÑuÌn¹î' †oy~ÕEÔl½ñ4ÝtÓ횮„‹RŠ8ZhYOBG)îà¤Ù•ÀŒb„–o{ÄO”…£²á—}øìZs ÏƎQšˆ+.ÊvLÁŒWý`Æ»ž&H݂¸%G¢Ë­j»áÛ#T0Á±;M“}÷{ªíX†d~ˆ°ëÞTg&Ρ%f£kñ‰r§ø‰’›ø*ó ³Do!첋ðU¹±f¹ ³h~•œß¡žù<ʬ·6Ú±Œ\wà[É/ ŽƒN !ÕZ4MGÂJ­а4Pht®äJøpÍyµä€´av%’‚‰LR©#h•Ö ÄË~$èíêìPOóL×Í@Éþf˜> TL(Ê,L%>JoT´PððAbÀR[¸)Šgø1’«@:ÑQ¢]qTNTšM\´ãXèI "ýڐ¥–!ÇÉ,R+ÎgÎ;¿gºŽ Ô‹”YŠ ‡¦3>NgE-¹Ž V݁J a¦{nad’ÏH³ÞàðíÀ">Iš÷0ˆ`{/V³(Ë-\ž_~Kd*ŒTf?Øò¾æ9ދèÑJ{YŽñ4Uq&Z®ìtã LžclèR„àxÛ/P±½(—"Zšd¾äÇ*·Å«8@Pi!€šÈd «Øl®^õì^ÁkþPC…æ¢tïµ(Ùz(J³DùuYnÅÍ@ÃæB”Zr+†Vj#r˜Êx1ÌR 2KE1 ΅qK®„PŠÍ…qŠ%Úeÿ܊ÀÂ|’€²M`â7u@’+‚•mCŽÓ™  ,8A,¸&—ÊòË^A%ŠõAf«µa¦jÁ©Pð1 ²Ì²P#ÿ€#ôÆ`”&ArŅÀÙ® 1ƒG‚M¶+BMWÀÈ+˜*™B΄Ϫ Æ0Œ¯zã7R€ß8 @ŒÈøqUüX¹I { d:–à oåŠF€ä9Æ@K¦‘Šå ¸ð‚È@‰ =Eæ?%5N aH²ådlÉ Ìؒ]§Î‚Z²Ÿ…KuL@…Žœ <Þ.É'´A&4¿$2C!·‡3©ì„Ðé,Åo‹-š¦ƒð24à"·€S4çÀó„fâ§õ²ìŠómÅì;×±ž +nßE¹g¼?Kfpˆè x¦à.à@¹¥øáºã8Ýx(~šè"l¼c›cՙˆpË>b' +°ê ůJÎÅOkEy¦+bÛyËîÙOÂç-£à!J£N©ièiJ“@£¤FaÆI-’mºëÙÍÜVkvƒHž‡r×Øñ‚óøтƒ`F3ŒÁJõüà… 6ÁŠցŒ>V¥=…Âì$~’àÀHNy€ARÏ$Ýw1„á¼ßә…œ":ƒ–욁gk¸DÙ%GÂ'iŽ@ –(žï:…*-ƒÏýÎ]¨4‡±¤bÛðC4ojÁ‘*‚wÐÙ¢[§ÜBŒd»À'¶ 1‘Yè!z“:••4¹äVüTµy¿ì1Š^õ 7DmA§3C)¶À¥3Ç©7C&2—èþÅYÞû¢m> +Q,n‚!·…¬85Yö:Rk(~´ê"x¬àPaÉáDÑy\²cRØl„L»"8±Š3ð,QÀAš?˜!‚oð)‘ÑPÁîÃl¹/¡$ê%!ÅÖ »g˜Y2£0cŸ V3€¹Ž؀×zÈNœ_u’ãV•'×'F© :Þ3†#¸_ÓÙŸ’Š!Us+.F3êÌ +…!FÈ-¡¥èÝ'J­PŠàV\‡ÑË.Âü²£D»ì&ŠOh,Ò¬úNö+¯a†©,‚m¹ÅoJmÅ0J­²ª%ê•ga¼zƒÌŠë*ëð³–;NjlÀp +8Cò?MlzœÚJü°ê2Žay,¹Ÿ•r›‘‚‹(§Ô €éÄH‚9`ɦMYÙ%Е5°Ò«°“¯D½êˆM]xiZY¸á¢@yŠ%p¹šȀÙd„ÞlŽä,’Qf4Ô1=Š.»€ $Æ-^± G¯Nžá n¸j`¦áZ¤c°dË|¨ÐHŒZöVèI0ƒ¨dáFÈÝ`¥»†À‚$—“4'ñså’³;µs7H°}„J(¨úÎCÕۃ—&58]÷9^r¨tÉ"ë´­7NcƍҙXà¤Ø9bË<Ív(~ªÞ.Ü(•iØyR;A„RƒÑŒJsjÛþæ¶m'-÷“Ù7f[/¤X¦kñÓu¢éLŠk» 4Nh „hÓ+rÂî#;VlB–€ŸHiŠ%`âkÈ9’ÓHÃìCCíº˜h˜ÜǒªlúÛ}Óp]„p{„•¥35`yŸ(7¿+7ç~ÇJö‡¯Ü6ÔXÇ +” ¥&ä±ÐhÕ d¶i +9JôA,8hxßÃ'³ì;h¹ÿ %;ΠƒDŸÔfpÒM¯v͙(Ét%Jñ~¥Iîwøa*arÁÍPR¥A©~5‚Ìj %ÉÕ@ TlAgh>’û8Ït*€¦Ô  §8ô(‘9hé¶)ÜÉ%ì|ß fºê>/8d»®y5ÛCbá{¬yŽ¸EëK”`v +bÀíÃ.û†(5¬zŒ#ל d—¾Å®9jÝGü ÔX±ä^¹ì)„Xq~šÔN¯ÚL’cs@VuÝTK¯‘b4÷7ÐL­M`)‚WQš‹ð™R3áËzs!»¿ zÕ=Šcùc؜Œs¬§@…;®3ĶsDFAçˆÌƒOj­äÉ%§Ãõ²#ƒÂz’§–Û ìÓKx9šS°i:;¼zë(vɁ$Áì,аÞWû[4Þ .Ävï°£dÁÆÛæàk*#”ghËn(KZ‰Ôêícˆ4—³%è©j{Sdö@fÈl‚¡21Fe#~Vl4Ô±9.‘Ú®Èó5ð,½(jͱZÍm¸yzë SeÏà£tÖIµæÁÌz“™Žõ[¤]~3Øt"Í­Á)6 7Bï 8GsÃ-¹Ž$ÖÛL5Œ×±Šù5Ò0¿Åω-‚&Ø*Ù² ¥²Æ©· ?Ig€”Ì>”Zr/ŠQl^–Y°P¹(Q|J ÆÓëËQCMU‰Ÿ-ûÌó܏jÉhØ<É}‹˜ÞÄ×}¥)æ·8Åò&L/9Å.¹ 6Ql$ƱHQ\wâ'«®BÈ%¢ì’Ë™žù¬ºî¦*VfÍü?ZrRšÎ4ÔdÙ9ðL±ÅHnÅÍPrÅ¥4Ãûe¸ï1Ԓ;uÖ F[n°ò-бJKԊY‚á]¢cú:ØñÚË4 ­¹…÷ƒÙô=è÷é{KÓ,G¬ºûFBs<ë÷Íïنـ¼chCîÎÆfS¡fÝX¹Òx²a; #™ ¥“[ÆQŠLKó*‚”"7U±‘hšKµëgövä4¶û|µØR(Ü0˜Uo  ‡¼¾õ5Q²[ +ó í#©•&ÂgéýÜ¢ëÜo\ Cû±ªïFíš¼ªýNíœFª¦c~Ëxä—|W1œŠóHÕz£W\¥7Ë2 w¼Æ÷Òl™^3K×ˑªó@Öô>¤™…öü’á°`uÿŒRƒjÙ’£3€Qh°hÃ%ùÈ3ëìtÞÇ<Ëû–å9ï3e×½8Ã{š©XÏ%RÌpÃ"/²#¦³vˆÜcå"ËɎ­A·m>vKÏcfãxDlÛî‡=Ó¥øA™‘ZZ·á¸@¦3R”Wf´a8IóÃ*6ê؝Ø-ã`ò]DJEÿqÅpÅnÙÎòËùHã5`šk:èY²üŠó0fµ¥ ¹ÜJÈL·F¨(Ÿ„Ðô܇š­6ždÊw¸¨nAy Ìd–7¥’íP¸KÀè™iÑò´X· :€ä9¦:Ÿ¼¶û^p<Hh¾×ÃõB€ŒØ P¤4H!óô‘ºóF¾g8Ô )P"øôÁ¦ªOVܝ+¸Âðþfx…v@…-fÜ8[œ^i¬L»>ô4¹U’äºÍ’ͯfÍòž†Ôô¢†ÐjĈùŽ'8aS]ÁC•dúE€ˆí2†SV„Ò$È+6嗬GjÛý/×04Ì®¸é~™ÀI2#`D Q#f¾x0«DŠ`q?«ÚÎhmç9±ð=RÀd0ÁBB©Sä± ác$J×A‰ÌOÜv‹Vcê4ï=´Èé°‚äg²uzzɈ ™è“]`3LÁ 8¾AÆh~’üš“ âCâhPE1ÅìÖ<ů‰,‚“¥Ö!B(@WdŒÚt¬Ö>„cüO4,'gHD’JwŸÂÖ|ªc¼Œ!— +!Öß}+ HmÓ¥Øá–¬ —@ Qåk’X-$†ÓÁŠ±™<±ÊP—ä R”\ ¸ˆájȹfmøj?àiry(rË"ˆEqͤ³’g“Ù äPú„r +¶¡8õ +kÁZÁi²Yg-˜LçëTÙ¼årÃn¿lØ®Jë©à²]ç:æ&D÷G½ì¾NՌinµ¡ >‘ÅPZ¥¹DÃq=S·Ÿ Žï­4»ä^ «Ð†[ô}‡zΧÊj«0ÓD–Áæ‰þqÏå\ÇêÞ$²=«Õ&Afˆã8•†µrcq„bÃÐóeÇPB‘¹LµÔn²_u 9Ac˜eù f©žcQ¦ïÎ,ÜnL·³Bšû«”âý¬ÐÒ´‚“4·äEBñ=¼Þ±i=Š2L.ÂËÐ:‚ÌQüÌPÛŰʬTÆÏxF¡½€2µY®Yi Ì«· +7Men˜è|Pe*R.8 /X}K„æ÷`¹Ü`°Xq!UŽ£¨åæâhŖ‚¥6â÷”æbHµæ£¦íŽÀh}ÍhðHÓy¨ 6OAjzÝîٝÖK†ô=Û#ú¦Õâ–ÑðnçyÖ­Ü'jÆ£,Çö¨ ·B_zž”›îïDÇø$× +á’ü…Š §®©ñº?/·‘ ×›ˆ‘ËMGÊæ›(ÉzÄ8Æï fÅÁ8Åò#\¦_|ñ¡@⃅™n©9ò;àÄÏéGª 1`ö ߒ™ÕL'´¾íf~MíP˜ühª[e6Í,6 +N´f +^–Ì^·àZ¢`rÞoïèK§ñadu@”eÈQŠ3“ q¤ž€Íj„i¥È4,('n¸XªZ|ì€(aVð1©&0±r FIT%OXœ@ ˜Ár-@Ä!ÇÊe"•¢wà9R-@£Ñ_}PŸÒ n°`T¢Z,€Qg&‚Nf|Gî&×Ì÷@*ÅQÒ!Ñ)ù uê,' v×¹†ñ)Ë/{Š“*ƒï{Ñc¬Xk-’Il’©“'Šægøbw0£Ìbª`ö•(Xý†zÞÿ¨o<,—¬FQPÙÞ÷;¯ëvãþœ)û£Ü¸]÷KÇëzåtĨ¹®¬Âé|U4~gj¶K³ô:§ 6Áj»ßâ ßO’á{‰1LîÃhufƒënÓö˜X9݌喚 U\§©~¥ÍPÅÒVœáz `W\#÷  *·h—\R+Öÿ®gÈK ÷­ë¹â\ÐúÞ[½rþКƏ¹ÞŒ¾ó;6Z1 &Ä'èÕ5­O‰vÁÍhV©D±ÚLž\o1U-6 .WÛ´(\/‚Áê<^­7fXÝzåÖâë J±mh©Š'‘z±,¿îF¬™Ï’äjÀsÄ~YŽÉQ·d{?©Y%ÓûEçvDêÏç9¶Û@¥âO¯zÿá³j‹q#•¦b<ïUˆo;0Sj <¬á +'Û1ˆq«Ž2\‚¿<•Ü.W+¶\ü–&°xÉ#A-7©x#)ÕÖñ“Dò³B›)b™±ÈZéXÅê)xšÈ|`Å!vªÞf¢dþMUìμªýHêšÆR\ •ë¥ù¥VR»/€B‰…À¢>¦^b’â!|ªÚDø,•øQ2+€‰±0\ù€AEǃ-Rà$ðâ;¡¦éeG*æðCÔ^|:“ FJ´€ &F0ðp¯8ô±`!œB@Å0ÊΓŠŸœŸ«5 s,ÿ€Œ,3ÐƤóô)-Æi>B¼v°bKP’¤Š`¥*FÂçDØdÖ@„§+âW4†‘œ¢›4Ÿæ zÀfFŒP´BBÀc™…@Œ S†­XƒLRŠ”›ì=O©2T® +8Cé?Kd'Ï+¶ìX};®gƒÞû(¤x?hޗvß{›©ÙÎä¶õÚ 7_Hˆ^g$D†w’äZû0‚±ýPÙ{å–MçâHÕ6¡I®a§‰nÕj+¹F-IáE¡(½;˜Tò“h×Ú !UZ¢7„nyÃOHM˜ÄöñfÑ7ä4•øi"ëɊÅù¶bq/V/6nP|_íÊï¶ßùTQٞ’Ù<÷c»ð|˜Q[N5,SsnËoÅj®»-³ã*ZËËzÓ{¿Ñ0Vãúm—Ì.è;Ç»‘ŠïÉîº?ÇÉ(r¥­ Ó÷™§:Ÿò{Ó¡šç:ˆUò&Wٔ ·{iŠõ!~¤ÐÔhÉ Zœ[p¾éàõìwvÕsYp¼ÕÎé’Õx]TKV÷äº÷?Ôt¾ÅÐJ ¦ŽûEÍö)V=7DäÖ;»ì|µŒÿeÉú-˜ÜGÒ*m‚“§V+˜‹d™Êµ +íX´åf]ƒûَÉA½g½ÐPûX=ó;Œ[l#Ï,6jXŽT .G:Gܦñ>Tv>找W·s;¢nÚ^ó§»qžñÅ,Osc‹nátE`3=â6}iží,Ãò\ŠOØ=EŽ›$÷Šßöëci¤qR¥Q€¡rµ4«Ì’\ô¾&ŠÎÁÞ<~XmA.8éY_ÄÆ#¹â;ÉQ,Ø|ßÍ0~ÝQšböã•ÚŒ¢˜ÌR½×‘®éx¨i>6¨M7¤¶ïfðxÅ­É™$¿äDŸÎ¨XÅÀèAbDɁ3Y5]ñž"7,Z® xô9`nMP3ë šG˜‘Ž°4Á ÄPÉ T‚O Bh |ŠÌt¤ÌXð`ÁÕ$Ã}¤µ­—´Îk«rÃdxÀ„9N¨h 9`â;@P”$„R HÀì +.^6 &4Ÿ4Ãç‰M)Í 9]²%–)p‚ij]ˆ!rƒ˜IšGp r›ð9¥y›Ò ¨HQrLÑñÈJåàÆf ÄH…€‰# N ]-ŠRg7×±:w¨ÿ±÷3R0¶žk˜méM߃„äþ'Ø\çɆÛ`žco)Î19*or´BË@“õ’¡¬¢¿4Åî/†Yq#‚Ne~Ir;Ó0 0Á(RˆU|†Î2šVh"ˆJr =Þó9Û²œ.:ÏH úZKáӅ÷–ù@ëÚß2ÅJ«dåê~™µVÅCì`±z½áHÓûë¶ìîŠh-/ \æ7À‚Ç +œ¬Õì¾W µÕ’®õ9Ô²Ü +“\Ží:Í5)È,¯ÇŽ›3DŽç²Ý¹sÍoá“*ktŠwàA‚C8éžَÑ0Ís:ì3 T¼4ðpYÆpRÉK’cs+„\r.†]q0Œ^n-M5^i%»3‚« ÅHEVÂ'4ŽãšÜ4~™Û5«r<Ÿ“íOY–ïØ­Ù^“ʾC‚\bàIûµæ#}ӝËû;Jt.Ð/D€S¬4»>[iTJí>ŽiÝB84Ä ·é`Ãä\¤^n¾«Xœï*¶ÿXÕú«Wn‡ut¦îª÷+‚Pq=Hh9Cg›hXÜõ ÷‘á ußt.Í/6ã—ü†“ë*Æ(úˆ_Ó{‚ rJ‚0PXÈT=ø¾eìÙ.¤T¾»ãzҊNÕÒé„S·†k-à R»…Úå†Ü²ûI`5WBoœ$ÇêÉ+3ëܓ ïûHÙ{F­4fXŽۇ›¥ø5HÝOr¿à"¼4¡D‹Î"Ç*¶ŽTÛ/üä £8  Ù'Á(É&¸È«-’<ÂÌW „:ƀGrK&ם$øÏw+.' &WC Ã-¹íþQ›î¯8Ås%J1þã(f)ŽùC¬ûI’*ŽÅ–ásBó(fÙU”eºœ§ÜIpì®Â ÒYŠŸ¬º +“|ç2õÒû¶`þÁ¥´ :DðJ©8¥–Ý8å–"§) ŽÐ\C8NAŒ4 )5£ÙtÖææ€ +Ô ‚M·]A§H>ÂÔzjÇù)8­Ÿyr­e°éz «ÖDnº~õÂùЯY§ú•F’{VÛvSïúNägôv †qIDÏS:†‹M‚M-Ž *JfL¹P1œ2`ƒ‹U=D)ŠLh p¦b¤@a.€2$š€F +6L–ì l.yf¡‰ ÇòT¼g2ഌc›Œìíg=×_å8㓎—¬’íÙ<ÝtÔìYžÑ7ínŠ=³û¨aB[©ä8®¢5?'Y +Q­'VÙ{¬¶ì.‹HMïÌt–g…Dǃn×}A1¸•eyÎ$(fPr3@ ‚åÔœ#ö‹¨2“!WÛïªÖ‹ø8½(±²t µeêÅf¨J-„o*M$ÉÇâô’㡪÷ë»ÿõÒõ<Э=ÌlÁ˜Ùó=I¨L¤hÆg¨±R#ÁÓ‡¤Îñ¾k6 T¶  ¯:b‚ÚqœOº¦ã0³„V $FØ|%øx~m˜9Š §ì>X­×ðñâtƒfy3sÛÀòU?Pùª1à8•©rÁµ4Ïü¡^ö¢ÕpÁrÕ¢ EÎshEË ½í Ü¶ )³&Aæ !\ò)Bg«XÎÆx„~à„ ÐB Ԉ‡J΋À‚?HQf…èùžOšUi$K+¶£–δ|Ç"RÓ£ivµ}ð)J£FÑ}Ò7]Oô]GœÎïÕy]÷±k=ˆ1*ž˜dÆ¡šãfž`o6Ññ½d)†'ajÉÁ]õ–éSكéO6 MøÍz›Ñ|JëðƒTöÀ‹ŸS)v†$ ir…øQ"ÓÙzÉ¡(µ'èhÇX [k#ɱ9 +6EðVªb X¼æB(3뷍?vÅuË,´šh_¼ºñ\šâ9¤9ïb<Óù@Õx)Ë1=4|¿­ë‚Xu¿…¹Þ{üxÝOÌPµ™Ø鲟رj‹´bSa‚ÝC\pD혨ë9Ƚt\Å.€|ÏdŒâd¾ë4×2ˆ`wí¢(? F”â‰â]ĐélÄÉgâôªãTÇsW!v? +Fë}Ù²]§Š¶G™åu%•á }éw3I´?ÅÍ܈š¢vš µ‰«µG­7+Ñ.Vø|€@¥JðH¡a°AJcЂe3x†I Áñ,Ȭ\Ôd!ÌX¹ +X¡ó]`dYu!g(}# ېDÃœØQJ ã75a†»¾Šñ¿è؎"Ä"FÓú'š/R$ç{ óº(öŒîÛ=³{BËS7¡íqÕü>¬4íõíÓ×­FÒw o)h®ïzÏqÌk›ÏBË©èñj›Q–ñD”Qp>0ÃGR”šßLÃp>Öò\Ê«­„OÑ»B̝À ž¤/Ô°•(VˆŸQz¤‰u&äŠç` Xp3O°:LTl7Yr½Q°j—$³Ö´_x]ÑêöŸâbsñë‚KA–õYn™žÑW­w[VÃ%HUöÁ34vfËù?Ko 1`5(Q¯7Eé’aÜHÒË^óߑֳ~D ´ŠEV«æ‰Ö_HéªIØ Í?ˆ^õ¨ÚíÂõ¶Ý²=¢¯Z,Tºc\ìL‘Y´]i%ã]ø¨Ò È0rO€BêÕ †v¼¡¦ ç|–Sf@x¶*x‚¸\’å½/–\d@y.P¢fË@%KÆ £tâ'ªÍŶ+yãþ0Ï*dÜXSü”Ø=QøK2~ׂœãÕ0éxÍëٞ3KÏk±3Dv ¥X„ä¦ã„ˆÞuȬûn†1l.†°Š­…IþÁg¨M(ªŒh»p 2=Pù }$£Ú'D©³9Bk;Fï¾'23ر +4\òÑzGûåci¥6B¨4„>”ôŽ‘¼b“±‚Åi‡ÖþªwíשŠÉQ½ì:i×­‚Ôrã0#UöaÆ îÅOŒWaŠõQoÛ¿bÓµé<òêÆG¹lºæ×ýÏY®˜‚!41lÿQÝtW¡µ^¨=Ï­$ÃÞ^_p8бþãØ5§ÁÜn ’¼r`FŽ$@§N†P'~ܱ‰b‘\D0IŽsÃÛPÇüßUMg»ëˆ†äxÚ/üNº×9™åy½dx^/h–Ú Ô ®†*¾ÛHÉs'˱8¦n˜]ã¡Aè| +têÌÂΐZB÷ìgh݁̎ åfbx4×ñbÕA Kj#Ï©µhÙîØ=ÛýhÉ|à֜‚×Y•éQ¡Õè~étLm<ÍÒûÛìÙ^µ§Á“ Ó»(V¹q°* Ñu"'ª Æ֙”œ— #ô6´Tfb¤zcá˺G’M/pÒ£€ãm‡<§Úl²_rD°Øñ;ÆKƒÒ|ª ¸ všm:?Yl-‚`r)JsþË]«!Ft@sÚ¦{bt‚9†ã˜T2=ât^7ÝÒõÚ ÷=Úm㡈ÎêÌJkx$E.3=Pè$v‡å’ñ¡×²º*ö쎚-Ã뙚çn˜å¹™¥²´B˱ŽÉQ@Ã-ƒ¸B×,¹ÚŒØ3ÓYƒÓ1t’±£Ô€‰ÑÊCM5+F±É}A‰]b'«-º¾Kbå{AÝ4Q-™ÞÔÛ¦ƒzÕ{vìýªí6Qr}&z¾ç@ÕúŸ)¼n +· JåvÈ)¼.à 7 +iˆ' dԙ2’Xdâ2~¸àd’ê;`VÜðŠMß­ÅêJ° ?Ðd±V»Öj–í=”КêVîŸnå|§V^çížÑP†ëNÀb”¡Wš²›Ö±h½ÉR¬¾bhÅfbè¤V‚¸dö±”BcjÝt¼ØBJp†O“¹zæ_€rWˆ)‚k¸iB;dÅÖs-Ïm‹Ì{,'µÝ²kÖw¹i7°X¶ €žô;šf¼/£|÷Wü¶Ðdœã:T}ÏÉçGì$¹Cì4ÁI’^p9O¸ϔ}75ó¤h>J2¬Ç`S±sôNQrÝ PCôÀÇ©ƒŒF‘N±y4¡ÌZ(›ÊR¤TmE.XB tk‚ ³)„ðè\bøD6¹ãëi iÿÎtmç ŠëQÑk¬ì½Œ(ŸŠY5?…V0Gi@Ue;OvÝr‹î¹éÄHm7BœTÅáQòãÅ +IzÁðM•5H™^Q°‚í"Ác…f’4ã{¨j=1›ÞW(!.M òã¶H¹ÔH–Zv 8AeÜ`Õ"†Le-Tm|Ni@,¹èɤ6aå)¤Iä5%2ËUÁë|Õ ï+¯dvÀé¼ïýÒõi'3º)¶ëþgš5¥ŠÃ@ÃÞX’â;ŒÓ¼WiŽõ,Ïð>äˆ%AËu캵æ»zÍMp² K ¤ÅÀ ŠAÌ4LÄp©,EÊõæãŽÙo²brÁ®¸ÞòÔN9~¹½z¹Å$Õzfõ Ïy¥÷Ào7Š¼g4˜R,3%U­Ã•öR<ەˆè}nP[.ˆMÇ ¯k9®wžB×qÎè:nüž#QVÉ=ô,µa±Êl¤g|ôœ§QžñA*Üïä²ñF-Ú~óÇ ©ì¼êUbÓ\‚ D¸t!…oˆB‹ ’Ä( Rœ^.ŽNd(R¬4§—õljÏ÷›ê8‰}ë·[4;c–­ç±žï[ð[¿ý²ñ¾êX›ìÖC±é9êÙîAǕÊRëàÃ$_De&Ó$ãw¬c¼ §ÓœOù§ªöçLÍþC+61Bo +H¨c?-¸í¶¬ÆPš¿ÅBAj¡qÕö²Y2;`•mféy ”îŠÎíŽS:´JǛfËðJšamK¬4ªäžý)Î,73S®2U.fX\ £4,VÍ3ËLyµ&aÅ{þ€óT6cfρ®éW7Ðwne4Çr×y»ô½‘"ùΒTç‘T³¼cÕLO8¥ß%£t¼åT~g’ìzë&¿¯Î|®äü +_XÜ +±½D×[ +¡ÔÙò+Î$ùUÿ¡–ý@PjTØdˆ‰Z¥&‘aHInIÃgˆÈÒÊAÊu!F¨=ø„ò¤Rûpƒõ¢0²Lrq†µ¹Áê0~Xm;Rµ]S×kJ»à‰•Û˜i–ù9P5]‡pLnEYž›nãzÌë[/X›ZÏûa~7ƒ˜G«k²Kdx„Ì)€[g#G0¸#–ÚÊÒKŽEUš + «4D/8 +5FpÂ%ú uKp›¦t%“8"Å],ŸÌR¦Yq'ή9ëÙSd"{²ÓUºª¹Ž±±ë¼•K·úšáe)ÑëÊSí¼«Í.¡)p¥¨‚ÄbOƒØü£–}7#ΗøÁj…6Á ×LAFè|²üŠ3#Ý:ÄÈ/–*1鍡'‰,DÐi +n%êU×ÁŽÝ±Cj~+^š0„Rð)úþ£ÂóM¬Y_huߧ۲»)"µí§²»$/YQ솔®ñ?m˜ µ‹~Ô®å˜Úuë•ç‹¾hþ§!3º¡¡6^Rjþ &~Ab•}Áñ:e–Ýù “‹á#–Žáfšã8-X^wí’ٝà… aÄH•gTŽRíG!Ž÷x¦ÚñÃÄ ä' CÏ5Œ+–ÖZße(Ö&Mª÷Ð\?6ó/·n=5}÷±¦ëËm[DôÞ©ñ/r¾`+€Hb¨¹Ó»,¯Öh¨á8fÈÒ +íãIe6óüb«9n©X‰Re Ùzá0Åø–¡V½Äè5×Ãç¯Þ³éש߳ýª(M˖«ÄÍQ8繖 FÍê”Õ2LÒmÇ3=÷¥H^y›ì’YƒâQ‹a\UڅªW„Ñ®X,±"¬­5àX¡a°‘:[a‚Í¥âÀp™BBã 1,Bg°©†}Øђ[¡ÔL–buiOÓÄR“™j¥4µÌ¸`9Ýѯäæ%¡ë\Ré:”[ÿƒ–õF¤Q=Q±´¥÷ÌgŠåGðpÁ™ø¹jŒBñSšÏ@r¹¥0Áêfô q<bá§;u¡|n€âMgØqJTÅցԒC‚Ù“Û3_Y?¯ë3†Nn¿¢qOv¼¶ò C;jÝ|$¢¹]¸‰Þw?™Ñ¹£è}´SY]õ‹Íçnk"2³;"š÷‡ŠÜwaö ÇS=Ë-·m<”ëÖ;¯e¹)¢¸¿‰ˆn×g ¿ê@Mvßj-«ÃfÉìœÚ¸ó*·£1Žë4¯j”]m!t͇jåvRn{otÄ®j·ê´Èévè<™™Vw]Ç/+N‰×]$ž j‚¦WŠ"“Ùw .Äx´Öà’l2IB½_˜é½Ѭwáëb[Av©eÁp½Ò™¿ éì®h]ëmžêüÊÞ#n?TJ¿ ú’éa»p»¦6­iŽï<Ó´}Èh=—S½"sqLJÇH^™à)BSˆÙŽ±Z©½`w”g”šƒd Ë©“ä—‰ ”Û "º";C€˜ÑÁä7ô‚¨ÔfrÅu«W\‡&¹Ër,ÇÔ¾ë˜Y¸ŠÑìWᦎýA_³ +¶ŽÐjl!™Õ°a¦õ(zÆÞxœò<¢íΓMBÄj‹!”JÓpCô¶@StŽ‘‚¹¡èqR{ †Õ „¨Âfê,d&÷Ò,çY˜å¼Ì“¬ÿðI¢/PÂeÊ@GN5B —\€‹¤D†Q~ä/Ñ°ýùUÏ9Åý¿èxŸA¦è¼Ò {û8j¥µ8Åp>kº~D$ßg!•ÙY»oÿ1k®WƒÖû•¦”Ù âR›&¢g©ìAËtÌÁ +s CL6ŒÃ ºÁŠS+‚ᒠ5ÊLCŽ<à “üDv¯™Žó3Ô±½ +Tlîˆ]÷ÔòœR‹¾+¹é}‘»_…4§czÓ}fwM÷‚ß! Å钂ÊîšY9° +¯ ZÙtd%µÝ/{Nj¿Ùj™}…æ~¦߂' ­%(~3šå`–ç¹èy®HˆžGí¶é€Y/´%8ÌFÇmÀqš»øe¥Ãq3Lµ^)Mó#È5p‚¦ +#5Ÿ‘ŠÁÁ`¹Òp¸^g1V°´ã6­7’ë%Áí¾Dë}Ö GdԞc2Šï“†èv=Õ´ýNJ¶;¹p}“ûÖS¡Õ áû¥VÓ gä-»ª–íI¬3 :Jn!ך‹“|^Ñû¨$·]µ§£‰ªç [9]µ¿#b×}!v^Ýû¤ 3½pT»ÿE*ߍ[´½Ê¥óÍHnzREqºm›îgeóI–co$~¬ÊHüL•É4Çöé^wÂ,v°"Åò^¥…¨Q¢7(Ù¢°½g,¯ê:Z°|˜nXÂG’ÉÆy…–ø$'ñ5G!´2kaŠ½-Í鞎ætaKewQDô»"0™]S.©}ç‡Xwþ¥I®ã,á}§¼î'Û±ëülž›ñ3:;ˆ‰N¹d«È˜ßñ}G:Î_pɎQ ²œê8R©© FÙL»ÜVšJeL|H^–R|à´#Tƒ—æ•ŠŸñHFm¿¼Þwƒàt;ÖòÜR¯[^Éh©d«e£o»ãYB,Ï¡$ÍsBêÚ^½–íuuÅ=xBc`1J Çê&H2>eiÎ µé=Ž5Œ‡‰Šá“ÚöÝG‘+ÎE‘ÊÌC¹Å¶!ÇÉÌ \CNšG²*ŽÛS°iz- â+ÚàãŠY¶RkÄ 1¹`—ü&ý¶ñUnÙÞµ×{j×t2Pñ]Û¥ç9¹ï¾ݕQÙÝXŽ¤²÷=SwæIÆ»HÃàdœ\p ´:¢fˀˆœo.ŒOV´c +6Þ¶ æۑhkÿ‚Ùt&è4?Y†ç<èL­i¸qB“a«s½ò;?Kf,Î0;ÒÐ, -/Lé  +FóÝ°>Ç*†Oñ£:KA²ù?O´Ò«ÚTFe›Êö°^õýäyEoyz± yÑhŒül¹5Ð"ê¥ +¬Š3~¦8¿sVËò°Êò’Y²Ýį ÝÂKê®Ù€IŽó";Lo¦µŒŸ¬³ +)Mñ)Qtßx.ƏUڏªIÒ(<äŽãVŽ[k.„Qk0ŠVn%Ì/¹«oܦíWIò=ê•6ãø7nÓ÷žëÉMÛ¥]øþÇz¶ãPÅq=ÕôýÊ%ÃûàbÍê€ãýzq†ßJˆbõb—[ȐJí…ÏҼ別&ã4߁ªëW0èˆ]׏×98¥û©Ûùö;×ë‚çyUHô='·ÝwjåýbÞǁ¦õ,Ês§)·#NËö Z¹ÞÇ°JMΪ 0Aâ¦Õ[‹"V]„ŽÓZ†ð{„/©ì„ÉLƒïžb8u6#ùUAôª· Éz'ÛOÝÎëz¢â<Õ»æ Å뎆àý¯›ï„äæk‡Òý•¨– a–Ú1j–·¤²]½šYPå®ó¬]·]´ûîO½o~×K¿[bÑw“â–ZΕڍWÛЩf#›e»öšÑØ~áuÁjz_’ Ãù¤ê9%ïÛ<[r ˆÀ'p§»ÁÉMbæŠ-ÄgÖ+§h7R8Ÿhï±ŒÎî”ØrÝXu÷e”oÿ _Ø>CxÞwÁâPœ\oP!r^GŠµæ …ɤÂW$¶±†é1ÜÑ)HvIðñSj@R„zÀdH5A¥(Õ‡i¥!Ø-ÇT¿Ü†]²>‡ƏÅuŸØnãTï£[yÑüŽ +in÷zÓYÁo:¢¡yÞ×kfC8=«ñ’ŒãÉ4Õü›èXŽ%څÆBÍ"™íÇí8îci%ZÑwžgÜn'êöG½jÿÓ{æ‡ »Ú$˜P­6ØLZ¦Yñ˜©˜½ÄU\ƒ’©Ù€9I¨èY¢€æj~™nÅåT½îb¤V"Ë,wŽÔmׁÆ÷/Kw^y¥Û¿e{LCf4À”ÌöˆäwDBs»¡ xü¦{bÍì„Ò2½`”®·Eó?ŒZm`†Ì'Ǫ2$8¼_a¬jË0³D6ÁHa¦é¬‚Í’YŠ UšÌT¬~âô’Ci†Å«ðº UN—í’õ‘W¶…©µÆb8e&‰µÖc5çǐÖð¬ÞúáyÄxEgú®ÝÑ£åVAÌÎp“d&ãèe'bÙvGBt¼¯¤3=2Ñ(6]­ívNÇä}@ŠfÃãç÷¡¦‰ DÍV›œ,6¡V›÷·“^ãxd¢ÐXÌL©i±±eÿcYŽéLŒZrl¶f6Ú0ž'×ZLr«ÃKv줘%'’›cAÄr›aĂStµÆ’4なí:ŸV|ç‚ÕúªØ›Wî¯:"ËÓrÑò°Ü2»eÎwaŽíf‚Ì0M­µæ½§"Õ¢ÐDnqrمٱ~qK®#f×tP®Û3 ˁ(âRðXîW-ãU³ØP˜arÓn»® +i¾W…4§qåÂïHŽcu¢Y.ˆ›¶çݖÝȐ#´^¼2ƒA–íBjzÌ®ùÓn›nÚ}ߥzRcP¢„:in}¯Ø&haĒв琣¥¦"¸µ¦Üªõã(÷WTºn¸Ã÷PÓs(Å3>ÄNUÙËmNáý©–~wå’å=·q;-8~·ò {Qzµå<át1I: .¹ 1Jt9Pg1~[v 2Gò@)3œ*˜Ý…¯[Ž@:EbgI‡(=Ìt,ÂNõ|‚)D?Ñ.™•X¡È„]±Q;–óPb©yø‰¢— Ãõ"•žW՞ÑPjÛtÌ-»¯äª÷Ïn›Ÿ4D†'Ó“SQžë=R¸ßx…ß±0Ñù–§8î¸Uë·Cé>P¶<Çs·E½n½o +¯3Á³…&£¸µ¦ýzc‘~µù¸]nÁ!¬¶ ‘ÖÛ éY +"UÙ +ÒKî…Tšš ÷à’ !S™ŒãU›Jìm+ÄÎ]Óv›èznH%«sjåt`p™økFC\¦§•T–§¥4¯k’×U)ÁýÉlœßÂTãCa¹e\JS,N¥)—ä–çp¬]n~šØ;Qó=F)¦ß@õÆ!‡ê-ð +®£xåö±äzbÓz`u­‡‘Ž¹aÁí9NÐ QP²Ìò(vÕQ”ä}NTí¯nÍæuË.¹ŽDäÆ/ÓjÌø»›°Éz3!–û@ÕµS+ߣnáyQDt=j¸4”¾‹5ÑùLBg4(Xy¢WXqš¯È“›AÆóvšò½êvN#êhNÃÆ©%Á Ÿ¡à1-çä}ÀÊQLπeËV DJ^€…°Š¾¦*´¥˜6ˆM§#Ï©Z¥aËv¡ zžÑú¾#9–õ)xÄä>‚á»ï¿ónÙ,ˆá#µÖ€’¤ ²*ݺëT”[u +$Ê« &P,7Oñ&Hê 0Ll"5nÇbüš“`…9©ò s«‰šó3Nñœˆ‹­«ÍEq뭙mûÕw]LóŒ‡fÉð¶Ü³»ìÖL/繦[ÔzCñ»r‹a¢ýGAg7 „Ø.€)¶ý|X½(ˆpÇ džÊ<†bzš¨¹(KÞ»<­Ú$(B|ðâ 9†á0´tшx¹ðñ£d@ŒŸ¦J˜Z!‚Jmä·ü¼Š¹mÐ WàñŠMž`r H1¼‰ßÖ[Š_˜ÆÙ¾[vÕtÕ/»ÎÇë(^¥Ñ<ÇqY¯ÜÎæiî3 #+f@‚ô†€"uF"gìÞC5ç¯ß·þg-Ç}(½Ö†×vÿ‡Šöû¦`s:Õ-8eچì¹AŠó+‚—«Ø‹4ìDXU¦á&ˆ£5ÿpV­ÉHbÁ™0Ãær¦h?µ×#’ãU‘éA«kºD-´éÞ¯*J«qU„fɈžÍÂùÍ+œ/ÝÂûÉk¼ÝÎë¢\9sûîYÕzœè¹Ï²ï;ˆ^p'̱¶åöÝ_YzÙ1Ð,¡¥ðmÕ;à\ÅY¨yRCi‚Õ¹Cî»ßt¬®Bè´Þ™ž endstream endobj 134 0 obj <>stream +áBàÁ{¢e=ò +¿Ã‰®ù3Ðôþxã«dyNl^iÍΈ›–×rT÷}žsXkœz ç>HÐën‚ç*ŽäÞ3³ðºö“™ÿEÏ7³æû†ž%÷ЊÖ+Õlh·h7„Ô·ÝtK¶'åÊñBŠXn&|²ÜœU38D2?‚íÙEŠlÎd8¶ñ#¦Ñ3ŶH)¢¦êUÁÆúEäšõ=U1^†«g:έë:ßtíW^áx(Ãr~ÎUњîW•ÑÐråxñ$Ž‹9¶õ6OvÿÙuãY×u7Ñs?…Vg^å6JÀ‘"&ˆ'ÐF€OxœÎ^Ãø`õ'DôÎZË{&œ´«ÖóL×~'Z¯#]÷©[:!ošÎ-oxMû[ü¢Öd “âS﹟Ó7X±š1㍀Å/ɂ {Xý‡jÆG¹ð;”!Z"@„Z†E'Ï,4>Nd´ ¹PɚAøH¥‘$ÅsEAr<¡uͯ‰–ïÌ,ÜßíšíyÅ÷¿/¹¿.8¾-8’ã˜Ýè‹Fì-£qbf‰ÝÌ¢7µo;eN£æ¹ÞƒácZ ýÚ ³%G˜ RÃN…¯Ô"´P¿ ¨8¯FôxÕÐ`Ïh²æ +>_³LµK-&—bh•–Ⳬ@½æP¥Ø@’]r.Ír¿DÎÏ<ÃûfØF+M§jÆÍõšŠè4J–[qb”â.zÄê$ijÿFzö#½eüQk¾¿4Áà^·Ø‚Àò=`Õ[%U1&Ù0"7Ò°f8¹Hø0ѓ]1þ†“äT.|Yè„ì~àÂUO )zÃìÅ*Oéèçõä¾ûð B°Q"S»q:'vžsd×­ãv!A÷>$èÞ¿$áýè:Ïä²ù»•ã¥ðé‚;ÑÓ%gæª-ÅW]šm߉)Ù Qn¥(¿Ô¾^zÝ6ûfL’M³ÿøqŕÂr»‰¢ûBÚ3 B”4»@Ӎà"ñ3$7¬Š#áӒ;A‚á]”[u”e؏4­G*ÓÁ²ýŠáӄ.fÓy)~§¤Ò÷<‚Wn!jŽâ NÀ럵Ì÷~Ë~0Z@K#v„Ô/ʪ·æמ*¶O‚Áì;V0;ˆ±JmŒž <Ø/ä”šž£¹‰)5¡ÕMsÌ癦éžÜu_GÊæO¹ò»¦¡³Ë,»ÅOËíZÖ'³î;*ÛÎWMÌô¬\8Þ¦·L²,§ýÊõr cz:YöV,Ç80¬P H!dª ³$Z×x¥A€rd"i6•Q YrZ¤áZØq´€É:ãôjq”JóeÅx%¥tÖkîÃI΂8u¦b8e¶€Œ(…—&³¯»µ¼½õ¦]wžðŠ®Ã±†ïÜ wø$÷-˜LÇ €,¹8äL¡Åê;ÑñÜü¾ë‚Ûv.Ug(N®µa¶¬'á•VÁ¦NÁ†è́'INáÆèAÇÉ̄Éõ¶ä–ýx±Z°ér…0¹ÔRüªÜ<ä •™N­¹8^µ©@ÃÞ®]2¼éØ0é½"åBózËö˜Ø· S|/9†ßv¨ê¹)Ù%ߑ„æwL,:Ï ҜA xLK¹#¸ç ­ÂŒ‘¼åéU?ñ)Å1ÀÂõò ³Dÿ°“$Q~ÕWžb<՛Þ/ ‘فƒà|gwç‚ß{èù~’,ß]šä{ŠR\_báuÚ®¼%TFÇ$dF‡DDÖC•Ým¹o:B­´äØîÂ<ï…Ö¶]2û¶[fßþî—nW3%×e¤äºÒË-ÅXÆ×<×{hz/‚“sY¦÷"E2þ†ÉöGí=­t½ /Nt 'Dí>]q$I2ä֏БJCá«Zƒ’÷:×ñ\VH_JjÏ ½ä·!¢w¿(hŽW¼®ùÈ­:Ÿ¿ñŽZ6Ö;¿ƒrÝú#!zߘ5ÛA‚Qh pŠÞ0Wn&N.¸–æ˜}Å)Ɨ,»âF˜WjBnß²<Ûe°‘‚£@“¤ö"؅ižël¢ê:à~$…Û ­mÿ‘Ù÷ÇÃ~ßuKlÏX•ÓHI–û2бž™-ç{¤]w”'–[6 ymû/ŒÁÁÔz¤nó…?°ùÂ5øˆà0Q¯6¢nÛO¢Ä)Åá©Ä#ç1¼± XñcÊlÄÕÚ6È]÷däÞg½íýˆñJÍÅ öf ß;èP¡U(yš‡x±"+Š×‘üÄñdüÂs^oe vÏà’#NÍy%–÷!GÊmÄMÖ‰0Ý÷AÉh`¹d{Y/|x-ӝz2S!¬"sVÕ*¨QÒk” É²3ÐÂÙÕà$+±#…&ó$ë³_9^òê¾[ì‚;Q†ïÁ,ºOÂW$Ð2‹3ýDä.QR­[g@Õp\ŠÖZ rÌ?BßzÕ+ÚWìٍ ¥¸‹ë–H° ~âô’ƒnÝt>*Yÿ±Ôr㩞õ?St“ + $ùŒ`UJRl—qôz‹qŽçr¤èºH˜]r˜Þ-Î19á5}G—Uo1䪳@Åî$K+¶*ʨ–è—܉2,â‡ËbëmFñËþ£¶ó|Ñ8&šNxmç•,³Ü<œQsß6,¢ôº“É{㙎„(ÎÏ4Ñ|iÛ¿ÌÆñL¡ÐTž[p6ÑðžB‹½À‹¡Ô W3*Bp 8Jg&€¨Ör¬âýÉR ΂NÒ¼% +&W3%ëo æ} lNĎѼdù…—qôº›(Éùm{ÏÃç¤ö@ UüᆉþAË«,Ët)Ìqß v—qĊ;!ŒJsyŠÕq¦f¾(42Sh\žÊfÃð#F²Ý /üI2ŒÄbóYÓzª™¯ýº£øU¹ÉHÃn0|\i"h¦äj¬Ì@€jº"¼‘í†T /v° Œ(ùuYÑWŒn;<`ö,Jq%Aè ±:ÔÊv¬…»`F8¡ÄªEäBóRçyM¨<¯¥(žëPź "í:áS…6ãæ–Ò ËýHÇæ¼D¿>ð ­Q˜_qE*ÙÞ¯߃!¢íRŠê»f~ ÌãçävQ²é@†hºŽž¯»‹«µ °9“与f*öŸ$Ãð¬ø=a.É8n¥©Z©eÈY"{Ðr$ßà•¶‚‡«N¬²ë~Ñ1¼%ZªN¼pÑ^Ù4Ïz9Of`‚àfŠÈ&´‘m˜aJc1ªó>”X¹è0ÂÂGˆŒÂW´Þ@#„¦b‹àES˂ Ò»IæÛ4ÙxÀjš®…MWÌÀ$juUóKŠáý‰ª6y^•9ÁhüÒ{¶c@r-7ø‚Mé¦=‘Ê` PhP0¹ÿ!ԒcÔ%×3eۙ0Çò"H°ûˆ*6 +2Fñ¿+¶Ê,¶™,—Ú¼%·"ùTFC{Cn×y*‚Ng$|ŒÖ&|Mpbכ $W\ ”¬—q–ûlæ"n–è0Ê/}Ô‹’¼²«øU¹‰àA¢S ñª%à­}Ø3¾äøUÿ°c¥–ˆËMƒÌ$ùu÷@zÍ¥,Éü —øÄ6hɌ˜5×}±òF¼î$Em;Wk|žÐ2ô$‘‘0¹âŒ[tÈsË­¦ÆßDÑw(Êr]Šß–]ln¥IæŸ8Åæ~VvÝÊs ï¡ÔŠëfÁµ$Ûþ 5Uj¾/9_“®×”šÝ "áwÍèÛÿÓlïMÀ(±;d„Ê@°8#Ko -Rô¤šOtžÕ˜V×.°ZÙ.XRÓjÌ$Óû@Nr"÷‹­Š}ӉµÐJøDÑ[ȹ=”ÁKˆax£µÇÕÊm ¥Ü$ˆQn]ðáši¢d¼‰r ïEÉlCH’Ù­û2œojÝuÚ®ï…YÖ{èi¢©kþϔMÇ"èU¿pӔFa¦ˆlB ’Ù«º‹2|W|’oð-¹S˜a; +²¼QóTÖ ¤úÁ¥Y~Í­Jµy­Ö:ˆZl`ÜD°zðš¶ZÛ{7K´É–›‰p+΅Êì +ëP ¡dÈä@É1jOÔ$(&ג,ïa”cúåxÿ’»«øE¡JýTÑ| 1CrT»&é®O܈õOԌùOè„ñ}Ñ65`3bèH(Í †Õ€15'àÁ%AÇS,ÌT›И?Ó\çå<Û4t( "@âÄgO‘Å”|„OTچ¨51Gef˜ÐVf>“Ðü œmY ‘‹¡›‰mã¡ü¾ò"^ªâ€Ñ'¼4¥I@b4g€"ônYŠ÷PžY\¤U&J.µE*µ;Cm9LftœÖh”J`…oH%iU&¼ŽÍ¹ "Í?ø<•u¨‰Bã #µ¶‚HõÌrå}W0ý c—}$¶oƒÔw2ˆPe%‚Jm•ê•ZH’Ë~(µVižB6‹8Ö1–RsëX}„©§ÁG)ÂLJAÔj›Qì²{,©ÖtªbüKSìá%;ƹŠ÷ E)¸'W4/œ^t0³”DÅ Š5˜á¢]¤`p&G«4 1BdæØÛ1›Îkq†éW­à( RS°¤va¬róÁŽ÷KDs½@TqpšÊ>bušéXøÇaI^èÉìãøõ–knËy’åVÝÄÐjíCÔي`Ö[ +S¼Ï¡žë”[¶ÝOiŠï@Õ5LSíwq’÷M-<º¦ãP3¥¢«­cG<÷Âg<çã¤ïY³jà8ÕþA19¡”Ý7ò®ÙØiÆëfÅs)~Âì#Ev¿¿ºŠëÌ/Ù®B ƒ“à²v­£l¨À Ëkx!šopÃ+¸‘)àK`…O +ŠU죚õ I/·$͂eÜÆ /ü +*5œ%8 oú‚w-ÂÜjSf×ø‘œ¯˜3~BÁ¯:  ¬; ¬{ˆ¤4 >’[V¬a0„Zl¿j»®Â dB¤:Bç¾'²B,¸D(µߑ{BJ³ª˔Ëå &7Ē÷.€QfpœÊ6 xÑ"hŽâ%G²¾æɶ#f½MÃg´€ŒpI .…–Û•"¹1ºj(Et,Es 6He"I­úŽôL·aG© C QŠM$v¢è'Æ1<Œá՛GQ+ŽENTšŠ©¶*Ø2†0z©M×­ðA¥Qˆ)‚³¨¡bã0ƒU· Ä&¢§)­ãçIDΚ‡(5™fXïçAÔ$¹3ÌÁCÜÁ9ðÍÈ\×)‚Ke2P+6äT‡Ÿ¤öp¾ ©aw:Ldl¢Ô<ÔXÅ}ÀñÚ¿ ^ÝGœUn/Œ[o0Í1¾ûÓx‰Žé;~Uofèbæ,|Àð")²)ŠÔµ¿°óuË0J¥õLÓv8P6Ž_Ÿ“¯\@+ +DŒXl˜ÒNìL­Á†éèXzI`¢E£øÙ›èѲÀ™j;ÑSŖ#-ם£Ø2À@½@–Wj3†_ö8Wn¾1ü +òË>#Ó§(½ò&ů¹=SlBª\ h¶`+Œàv3~O˜D¹,б/À$ѨhÏr’äÄ«5 3Ù± 3Ü/@©²+V1'vŒpñ3ÁH”ëÂL½„ŠM+Æo4gDIõ"h%IbÕ¸tå \Õx½¤4•u ½ì-аþ¤6ÆH.¢‡ªÅ¯ëÞ ӃÇ~I¬ºKŽ…)ÖKˆ³Að¥Gœ]pzŠÈ&Ù¢#ÈtÏlÀh?©³Ž$ÖZÉS뭃Îu ‚gRÈëìŪ@¡˜AÔÆ0cÕf’4÷gšl;§šN…/ìï¡®ñ~ÖõÇN“ü:[ät~b%(ý€Ÿ¥@´è 4Xn3M²ÞL¿S+µÕHRÉ#h±c-ÙY:G­k ¢éH€Âü;Wp.x²ê`´ä@|býW‹vcŠã5`Á†Yè8±¥V´»e•LÏ ˜­ÁæhÞÁ甆XÅöƒ–íQ©mHãDa嫞! ßehÿÉp¬Ÿ Ë£šj±3•â†*ÍæHÖ·±ÞhAãe’”21ŠÁ¡ÍûŽ¡VÜ "–\ŠŸ­z…¦2?[k5Mµ?B õKÂJR<„gLCg˞B§ +Îŏ+Î'ú¾ó¶ï:ȽUŽäýpëÍA +vŒAJ–Ì@ +¨W(¶¾°}Ï}— Zç™ø)ZO¨É†¹<Ãê  µH±¼‚@†ö¡dÉ,͖Üˑ}÷¼žYàáƒ*c‰oÆ/+mƉ®+᫊[ࣸ¥À“'PœD½fÇî>éû.LPù1Qf¸æKH¡‚c`‚ÉÁx,8¾3³p¼­wnc¢dÔœ&:Š¯¸¡¹Î%™Î‹ñs:ë +¹_(‘äÞ¤¯ûRÒ:S‡œ¨´<[r%bšÐ" |Û$|¶ì,Íqߣè5×`Eh=ƒø÷BÈe‡à"äNà´ ‚ìÆPË~C%ç¥D¹ô;X1>‹s,ÏòÃ_¿o=«ØÜœ ¶"Ö±!Þ4¤9 `˜^Ç:¾û3¢Dhá¦zµ")eƁ'ếM±ƒ—®š…ðŠm冧¡Žé;„Pjˆ£ ÀL±>’Vl"~ ÚJø²äb Çò,€Zq)€Vm(€¦Òv¨d}…m¹ÁJ×lbëíÃ'îÈù§ø}͉$Çò*а<ŠaU[ uŒ_Ü¢õFb>ˆ«¶ RŠâ  É=àX±y¿ðÈ®: (´3^öÇÒêmóÊ­CYÅöh‰.A¬® 3ÔÎÐc$_Q|"kq^Å5 ;()j›è᪷ø…áM–âü‹ó¬a¦ûd ÒV˜æ¾ ôÌÿ™¶íœZ¹óê¶ÓPÓdf⦪mfÙÎÛqÒiÐ(Õ~ž%»ÏÔßùDÛvDjyÎ)(N7Ô(Fô0Up3v¶îÇèÛFôz€®6Ž‡´î+·g½‰Òë }ó“ϳ¼3VkT”ä3€áüL3}Ó$÷ÁÚµ +˜Ó2/v¨Î>ì(ŁÓwž‰©6H²k:”cH¨k?[öŸh¼ôz3Aå$¤pqð‚G;c8fOÀDQ‹CË]†Ë^ró›V3 ´Z4 ‚Î4݅=Þ;Kìä;ÏÄM×ÝB ›¬7•£šÎÆÏkQ²ï”×¹8Oq/Hê_t®7CXö—èáʛØÙ²_H9š¯øa±éHÕ|ãõm'ó«3h¹z¹ø]™õHÝv<Ï7 8[÷9Tl&€¬ÚX·ê(I,7žªÙß!Äz›€…ˆ­"§Šm„K¼È4,AÊ·-‚'Ë®ÁÆê ƒÍSÚH²ŠmÈý²_ÐY"ÃP3µVË-„M˜ 1­OZéyTmH†Ro-K©4œ)9ϲT÷)¸4¥1xám7@A ‹ ƒú%³Ë£`wåV\ȑKÆ)faŠ÷'x¦Ü€a¬Š@ekŽ`¥:æ@‰SK„ŽTYP*Ïã Sän€$úUâê %i¾S᳒›àâ}KP¢UKPbsInÁU¿ì¼%È*5Ba’¤Øž‚óGèXÅm˜9¢W˜Á¢0 ^% ãå¢ètÆ"ݺ§èY"Û°Ótւ¨%7£Ø%G2܂ó(^½…,·æB™ÈJ¢Ue1VobŠÌ(xI2#¡Ó%'2TÓÕ0ã4tžp;ÑòÝ/Ô«@Uiézó,Û=’=# ‚ÉÕ ÌþÀc妨%g5×UÓx%~Shɯ7“¢oКF 2M£%ù5ÓDûY˜ä¾‡ñ*¹=ßÁ@N­EÐ R‹ø=‘Á0rɕҒsA첓8»äl¬`{Á¨µ’%W}¦ú…gA¬Z»“ô– Ãg4†ÙÑb£y¢én iº(ºÎljöŸ Çê&É°·'VNGݖفÇî(z²Ú^ø¾âhï½ -›Â’ÐöÈLe~¤ ³¼g…¯ëÎâ—UA~ÍåHÉ{!ð\ïžȩJÛY²í¤V4Eá6ržj<çÚ†˜}Ř\Œ_XܲZ¦·A'ª,”œ©4Èðj-…ÉŖS‹kfç}p¶¬Ž…Ô|ªŒx5ã“XwßÇ9ÏK‚ɁYz0½Ú€°hüLdzB¢ëµk¿tÝßy¦÷1Gñ›O*¶½ã;°¶æ‚©Dö u©¹Ndz5©|–#-·ùšf;Ø ÷ƒÜ~'÷¼ÄåÆb\û›Z8Þ]/ʈ OÔ¦“QŠ÷`ªÚdø€¹ ©è{QR9Î*Êlw¹vÅ€¯ÞE¥-øiŒŒDŠE‘”’¯JÉG˜\j7Ы2–(–ÙÎöËM¸5יڶ?'šÖÛ<ÏúŸ©»Ȫæ­kº繯ÒÌR“ÁnÅXZ¡±8^¥‰,·ÖFŽ^n"I±zMԜñ&ί5(ØZ õ+-F3Ê=Õ2ƒ±¤*Yf¡Ý@ÍxeVž·ÄÎ÷ž[y‘[®·DÅ؂W·ß§ºîóLÛý”¥y.ä(Ž»ªïS.½ïÅç!­å~ÜòÚOumRÝt2O³æiÞ¯$ÓtÆ*ÜÆJ*­ƒŒµËÅù¥Öύ$Çê'|[n$|XnÁ°;uÏ«R‚Û%9‰ó'†Ø,m–;Y$ÆÆÓýzáÃ4çp£ô–‘ÌRãÁ‚Á9‰ºÜJœGp 5[± + -µœ&ø—"8Œß›ÐwÞ/*«·PÇm¢/òkëk*†•¥wU¿Â¼|LZaÆ%0ó6*ü¦.‰å3Ú«3Î÷êŒäžÙ˜„Êøì&µº7SޖkF÷òDÛ{¤ì|V‘Ú]/ô–ÕŒ_ôÙTéü¶ úJϐb¡cº^å'¬sFV)kˆô•†"•É|ªç· ›Èr‹î“%¯Y×qXo+ª¬BFE®NªƝŸÎ_°ÅÔךtSÕSH;d§%fY +ËY…En¡„*wài:Ð‘‚·ÍxowžÇ¥4Ï;2rÛñTÅÞ¾DgûøŠ?“½8IUL1%µhÍpòj7 U§"²ªÒbíõ–Têb«[”’e$U3õ¤…cdE–Ùj¥kº]îeÑÙהºmlŠíöۆÓB”_h3ŽbpB³~¦É®Ó +­ûc+4þ«f+‘vÅg¶`ï"T—Yƨj b™Ô…¡H„Å¡˜Ä¥ôÅÆ*É¤Ed³-WÛy¦ÿ|ÁÐR¨[g/S±¸;Mt8Re6M5D·û +ÅûÕ¡µZ”†»­ß„¦ÈgI§.5’É+}C”U.!ZÚZrš"rea!‘GªJa(Ù¦ðMÖG+f¶ä®ñÞ¯ºïSÝjs™j¥µê|’Ü?”„Þ#‘ºâˆMYf;QSë T˜ö¤Å†u–TÕr…t£èHˇ ë,lÚR÷,a¥ŒºÜÍ¥09RȋnC͂ÛHÇod\Å-l”æ*Q-ø´i|vJm1ya“*À?0´4$’zdN¯F“uQõ…­ä5Æ©h¾ ”~²®¨šU][LVb4×Óû-ÝtÖÇ2"ë ¡êû‰Ñ,W¼ºç žâkasz¬ãuµÂÕ$ÆÔ MGÈFS¨©±DI™3#Ö +=\M$aGٙ-ª%N"' ?p‰5ÊKx¦Ö"¡Ï¾Do¹­PÛþ»ŽßX$™ÔJpùí9dnc•×l´af,šK^¾¨/.«XlŠšÎ‚² sròuUEÁ°¤~ª¤V ¢¦P”ž®T˜š´n ªº²\caF_caX*°² öKNôUÃCò¾ÕÐj×ô¤Ýyÿ¹D¦£Âʘ~œH éå£+†h^8^Lx(`øB,00˜‘=¾œÈ\Zè‰úhkŒO)³²¸bº[é«Ö›åº5W‘רV^é¡Ø’•Œ'¤4‚ ›—´(¿8TH°1 5i‘@5Å£  ]ɞò­E­ÈšSÆfΫ”’bVR@QV]Ó¢²4 +Œ­á)£ó€“d†A-#̘ Ž +P¡¢i‡ Ž¤Š,½¤00s*̙¾ eOaŠwÖic–Öy#©dAý(a©m°cl)Íp›|^“Á"rq´±°²0€%CR”…ˆ((@ÚBÑI +hŒ?"8pGxà˜v¨ à;âQV$Fޔ´xbPÀm‘/mIז¸‘W–V脖èŠdzÅömÅj>C]r°WÙ¸~¢¢¡#™[‘Ä@.H½À@€KréŒÀ8‚):pKd @§ˆ/P<À¤3ó ŒøëÀž"[œ}•5rJØ*•RXYÜ~:«k9½ß”P\hqÓ zVAúç’ÀØç„) Ž8® - + Z!€ 3(0 éÁÂ"“ˆVFpÆ¡€Ôc„«oÜbÈÑs&®TÓÕôSõeܖåZ,Î ®W)TÐlF.P©ÃDŽ_Š' à”с%”¾%3pª‘™@,üÁðf +/¸¿oÜ"p/…õÅ9mUÒE_dՖ—I,Wr«¿ÄiLn*00èS‚¨ è\pÀáìÁ‘ÓÁ‡ àh¹ D. lQD +®0ÁÑCJ0) ,½Œ °i±@UN‹‡·9c ÖºðÚnQ(i‡ºPá5wȜvÄtFSq"’â†L>Ðq‘€6ƈŠLZ0„ÒÁ¡L±£HÂG5F ¶$?!6pìd˜€ãúA§™ÊA ÚF› +dÑ–x“õ¦Ê*jGIKLJo’"¯}›ÄjI««3͘RÔ"ž˜.Dm!‚cÉ¢GM‡/pü¤ÀÀ-‰aÀ‹JU“ä ͘@P3{>̯Åp\åJ\Qµþ4D-c]M³´È/ATé"ÓÖz§k Ëu›ó$…ã…ƒ#‹Ø2@p°pÀ‡Í Ç\YJ +°¶Œ@€ôòa^ ~¨EcΒ¶?⩥ꕗز›^‹‘áx¼FWdJXMP$ ²°8àóƒ“ÏWâeªP[§ºœMcR&‹Ù6ÈnÕä¥[MA¹¹º¤Ê_᧰/µŒ, nߧŒÊüKIo8*%+ Ò|Fxp€›""A+è# … $Às¡² +Ž 8<"H Àf ¦#$ÄÄ߄.¢O$žäè‘dNdÍQSú6ãPNL©¬³Ê5 þ²Íz« -}Ù\%a•À’f+Œ‡ Œwf8¢)8py˜@€×¤ƒ€é‡ ŽÀŠÄ8@jfÅ,ž!# üœ0¡€•ä#C¹9dA#ÊNÕ¦–ŽØZ[AR`ë%Ø|ÅÔ^{Ú +³«nª)dç(Œ¿ÀŽ¼àp¹ e¾#ˆÒ G&& +ð©Hñ +øӂ Ûä 5ºPô©hk¡:s'¡%{*jj®º¢ƒ‘S–Tf €4±&ìL±:l©Q.VW(5 0Œ€(±€Ò„%BtƧ' ÜŸé괃|òÛ­˜‡Ž¦nONU9¨¦âüiI—j‚Â¥¢¼Äaò\‹ÇÕÄÎ?»ã¸!¥³ÛV8ÌÌ9¶NýM9<[p ÐéXáðÀ€¢€Ž ÐÊÔ\¸J>[ˆY»1¸¦\aد ÙJ›wÛò6´=¾R=Ì\oLzh ‡kéjÇk< R¯A‡Êh)NJ_¦ŒÑ „nr¶pÁaâ8|#.pTe  à#  $_¤H ªf- ¢pj8ªy‘0>þœ@».;Ô¼Í4(®š+Kè +l4ú’‡ÂʜšÔrVacs ©éi<àJR³AÇNŠ 8ÝÈ0ˆºÙ¡` GƒPBUñ©!LI农b;:EÀ§M”9°•Æ_”aKÚ.ÝVINî.-°² k\ölòš·(-}u;¿4[nð¹xQÌ +É ¸Ê‘yÜӀ1¤DèŠÌQAä„+ãRV1¸‚m}úڒ†¼kVLÞuÖSX™èHÝv•Dæ/;ÑõW£0Ù +—JÜbT%&A*ÒBi*²‚zUu³ ºf,}£r®š®¢[X_MYgxQÓ-ë .G~*ǛÐöAß3Ñž‘ÿä®k5ÍíO[]êjR×ΑPVG—¨Ê‚Q*!çE§‚qEFD†§Ä5ç(âH4k”ž,I½2¬¦Ý‘¯oO˜ÉÉEKÉ)GkjJöõEtfódÅg<Ó1¶mZN‹dVÓ:‰É†MW吡-”‡íË@Jƒ“À 8@…©±Ii:ÓR܍ +vËq»tZZ¿‰èx¦ ³:&z®yeóÃJi{XHt¿— ÷«=ÄֈÙ,3#Q¸f'AåŠelÄÊ$¯8T\î;¤¾óTÅn'O°3nXMæèi „Å„Þ¹Z2û(]±­èz¢ 2½"ð™ ·âbóA1©}¸ŠÂ'TP®Û¦Kª‡ªÊ‚åµêñ +ÂꎥÂUã-6—šËí‹*ÇHu«œÂŒ´¾âB©*sÕÓX’ÊêœLò’ƒM¥ëZQé9«§4~…»e@ ôÃöYä2%ä¥%ö2•DöYº¢ÿ„Æ֖ß5þ(I½7búŠ›Árɠʦ'"+#WT˜Ó*Ë Æ:Ëh½àV!¶œUÒ|¶$¯CQ¥_@‡ÄjŒ¢ÌE]\좮­³ SՙÉÓZEÖh¼–rk­´Ô’TNsAW-+£,føiõ¢R/£²àIKk¹¨–Î/RÉöGDr¾•ÑÙÞ;ä¶S·ðúR·­®š=Ó­i5”h—Ü—³e½ó=]Ï¥4× ¯ck0Ó/3±ϕDƇfçü§;¿#]׫Þ8ވHž¯JšçŸ”àqLî¹íf*NjÃY!ÁåƔÌò榳¾S‘<ï3KvÓnNo;®ÈÈ}W‘jÑI°Si-•è“U¿m8çØ‹2̖ݖåÕLlüµ“Ùž+©LåÎç’Ú6ÓPٞ +i¾ßbŠë«œÔwîىi¹‡) +MâD”•òt”åó$nš3‹ZËyQ¡Ùš¦ÆdߤóšO:×/¯e}íÐ{®gf–s%¯i¿ñûÖQ_¬”Ə2"›ÓJ*››}•QÓÓmñŸ¨ÂkDOá4%Q¸ ù«%ƒÆi¿¡/¹¶jë f«y$Ì É(´ÑPœÏ3M×I”bk5Ô1K†s¡ã°`ø”™^ʈN·¢5ßð#Tæ¡~±U½ì|NT,ÂÇh푔¢#¿c¹¤¤´=©ÉÜfTâj» =¡|—ÊT#1¶#$õÉUËáHÑoKl\¯ýÎ鰖âtEEé|ŠÔJþRí*nÍpH®úý®ïN/Ú̎ñ€â*Õ«²,Òøè «Å`»èÃmîWUçW6_¨Eãs²^m1Ö.¶c7mGGÅóQIpºæ¶ÝRåþ>b·—&Ø—IÌF4Çu›‹2m¹¹)¥ŸVT櫯°yS˜ZP»…6²”rÁá4¯RYíë4–5¿Á`½èH%¯ø +Œ hH«l*d–rÇÞv¬â·•¥[‰ŸÒå +•æ1ºŠûŠ´Ì~Þ±¶lÐ{ŸÃ÷× ·* Î×n½Þ<¬üŽÔ Á>DZð¯¦{·Ñ‚•]‡ÒpbNñ=]ŠŒŠ ï˜Ð¢'Šq«ÓÅJ+-­ï4NòœI2l‰ŠëA­¸í®õÝ¡vßå¹Ô~ gHD3Duu™±`±èů˜í‹iN—~¢Û‘æuUJð:E1\ µÜFý¾ëÀ«úmfJVSrÕmRGò|Õ™ß(hÎ ¹ïÜ ÷œµëìÈ C;;ÍõÌî9™]۷ܳ;ñ‘›ž’PY?Ú]Ïý\ÉpÇ+۞"¨EæQĒ? Áç”ÛvÜÍõ¶åžÚövÌFíÊ焄æz¬ۃ–aŠ5)\ê¢ÇT»è;WòÚ2Ë® }ËøYEjû0$µ|ÖÑÞhH>7>˟™ÒüÙ ÷Ü̾‡àx断—Š½½@Áؖ]u\)Œ.dõõÞÚ +—YiёDbiÉ£0úó(L*¯m…Ú÷å÷,·ÃSKÝª’æúïÐÚþüšß–ßóÍU¬,ê}Ãq‡Þõ"#÷Ü°*Æ6 ‘ÈÃMªÉ¨¶4§3‚ïo¬_k(Ô«2™h8Ž¨=×±Ai9­¦÷ÝKÔ®c¿p|ÔËæ¯e| áW™­µ@3žD&×Qìb«‘’ëM®:?̖í*O±6‘c—Ï4¿nãtW°9®JdnsÑ œÎmVOj9oR9Ž94f{‚ÓoC`²º&Ö,HÛŸcp>×-´ž,[Vˆ­^ÓzB¬³>%µŠ!Õü#éåÖq¬B£©ŠÕQ¢Wjt®[4Ø«vThüÒ´:S!ÔJëzµ•Åu§»Î©•ç‰=¹õKGn}’ÛžC2£Ã"b£±ä¶íÊ/úÍúeÏ-µðþÎ6Ìme;7y™uÁáF#±)–[Xm×½\²~t›Æ/½èz¶ç=RׅŽÖ÷âw Wí2{‘~A¿k»̞ +šß­ã¹›*W‰´jÞñ„b?‰Äm:X-²L¦rˆcїMöël:tÎÛh¥ÒP¶Jl !.³•î”ÛxäŸ.‰Ñ³žÔqZNëú”OD×Û`£-{ÎƯحçz¶¯ ÛøkP;ïU®{•ÄoÅ®Ž$zUÆbÉÄ.¡4û|½ÎžCd»Q( gÔDNKK¹õOGoþ–èlµ÷!K-µG'9ˆqŠ‚ÜZciŽÁy%™å5%©ñI¢06ž ­² ,º‘;?4ï# ÅýVDfvYGhyä¥4=®£4?)»Þ 3+¡^ÅE¨Up ªZIç™†ÈúRHq½p{nC*‚Û·–ä÷)¤8ž¨¿íPÅo¾jY.Gªž»©Šß¬Cj9™æ•¼ÂÎVlÙUËe½ñ9'—íFܞќÛwÝêç‰Y¶=I¨Œï…”fí¾óEAô~”YÝ ç³æ{u NÇJ®¿ã6¤*1úÖXYÈ© ‡1×¼Hd5¤wLMç–¦£ k‹Ér¥ùpÅ؈ŽÒøfR{űèL2Ë ±g{”G¬®ïËìZŽhEËyø@¥]ŽXo¨¤öý(nûÁšá`œá¸¨9/ä=£áT4¯K*‚ëŸ`3Ü6HýUT¶/fÏ÷Ž$UٍT\灢÷@ªÛ¯3Mçq ì>±¯kq†Á™ J‘ùT×z *Ü_ÓTëMŠêüKr·néuXFhxaJgw9Ø­2_תäT^‹J‚Ï5«q~JpnÃç]çÁEj®â7E÷UÍwèöÝ'!FÁKŽTp V=·’ƒk”•v8uv§i.ÂgÄþ0DZÁbm>Û®¶æÌ4ì–ä®õЮ۟ԲûB¬z¯Ô¶óØo\íÆñFDrý‘ú>ô’Ù‚[sÛ𪮳l|;¶?…Êù w @ è%×eÚå.fÛr,K2œÇ0,îåY¶ûdÉpJoZ®éEË ¹å8f—]*rÛ¿Gé·)Q¹ÇJ®ƒ°¡:£ÅÂ'EŸ©†ÁÉLŸâ¤%à@“`°Zï#×|²Žñ.Ы·åüþR#.eŵV[paÓÕúÊ.«™×”à2‘‘܆ã~Ûp]fúÅf35Ã5·oýpû•F“¥zËlµä6V°6K)z‡3ŠÎRÝZóႹÁc¹#˜Ç$ +¯9…ÆÚ~¶â¶¡ ×ܺóPž_Œ<¿&hé–Mø`©©$Éx(ð $Òy†’Ûµl²š¶Ò€¦c{MSŒG9Žõ6È8¸›¶Ed¶‡tj¡‰ø9¡?œWë ‘W<ÊÔ%72zÛ¡†ÔÐð€V2œ0{~«:¢ï‡ˆÖõa—̦RÍ¢ÇHÅØn¦ä8Ÿj? ×q cq$È+µ +;^5r«ž#jÕwíXšÎ·+Þüªã°ÞxßW=߁Vô½Xeïm¦eû” çc¿p?0{žc‰~­™@µÐ|²áúð†ë:±a•ÄØ^4—Ô5W/3nѺ~£Ý";±Z½U¦]g1V¯6ªUÏVÌÍ)4¶·0½QØÕ u~æiΗ(Áâb¢ã¸,Y-+ĶgÁpýWžWBz߇`1›6¾÷~ÉòŒØvŸ˜-Ëù²blA®ømè » ÁahÝ¡õœP[®ÓXÇà˜]õÞÙeóqªb8È+:‹àšK³ìŠßn²^n1Ô°7*Y蚞ûvÍîˆÀhwEAhw×®œ®hdöi¿È¶Cî;Ö+ç#³m½;žóeÃs¿¬ÙaEŠ…bgÈk*vVÒC›q¦ë7Íuß$®·f±4Ëo6Qu§š¶K¿ï¹lÐÚNsí*vÃjOî:ïBD÷CØH¡‘>™‰0«ØV •ä PŽJx´U=\05¥Ø]PW\ _•›„¡÷Œõ« ––¤ÕE':]±… ÄfRNë¸#¥´\µˆìVC skyŽÕA`oÀ*{ŸÔªû'|Aã 7Ó©l—‡ú'‚ç[ÆpƒۀóM·0B‘ÕXÇä†[ôý·%Çu8¡Ü;Z°3­ÐûîÔÂý|<ÉV”è#À19©•nGä¶gTuã#”ùI`Ä š(U[DΒ\ÃÌ}Ä8ÆßaÊoD©h7–¾nD©æü;¨€1¶ ³Ú`!ú¾ –óS”_i6Q² ”|oAÜZcfãu8ê2 #Â$ 1L&fQí +ö¶Â·DOÁcԆÐâU3Pé²1Ü,¡YÐIBãyŠí!tª[+Cb4ß,8MU¬Mы­ƒŽÕ -µ—ez¼Â鄼gy=Ïp=…ɵ&IJó?×r%*E–"µRƒqœ:3!lšƒBÍožhûŒœ!2„•a‘Œf’˜;—Ç«n°¢ÄšSõrQ¼JÓÐÃDöÁ'ÊÌH•çÁnɱBÍi¦ahR!µÜók®µb¹iØ[ +ÓKÍvãvËò Y6]‹UËì%hj 4å–áb™¹T©Î^$“Þh¶f *Õ0=Ip—§W=„,æ‹áœb£D³Òj®ao6Y¯7Ÿí˜Pv,·â ¿Å@Ë÷dÞçђß-P¬ˆq" +… /0P¬`¡Æ Ã0d‹1Š-XOY´ˆqÂ(ŒáâD1h ž€Ñ„¡‚ØÑâ„'H ž\ƒ5A$”IR<›,\°`!)ŸÃ¤'…†0^ƒÆÆã‹alj 1†ðDQFÑʼn-ˆÆ/:btÈXñâ… Ì  (TĬì@¤OˆN”ÐÁ@ @ @ @ @ @ @ øþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøþàøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/>á + §ËN¡ä(žÀŠiXª5¥µìÆͽ7¤R{q’û?R¹%ͦ®=E]¶/ɱ_†™îS±k5²‚ì—ï; @„ÔT¢ÈN„íº˜#ÝFw»&î–ìJ¬ÞbÈåæQôzKZçy¾(ü®EpÌ~‚ç«ãg¬—ZÕ~+€vKVG:67AËUL„È•&%ÔVAvK¯ë%(¡BÃàòuO¡“¶;)Â÷¸ŽÐld…ÆwË'7JSlMH×©ßt1~l¿ Ÿ®»&à7ɏº/Äu«€ëßÉ(z±-µoº¢¡¹”ûƋ!$ã=†åû4ngôe³±Ķ7õÆûU°Ûïý’áA±fzàîš 0×íâԬƞ,¸ 3Wn*|cù'¹ßc=Ó¥4Ç÷–e:_¬ÂýØ­ ,÷¬‚ãUž÷«²ý(Êòý7ëa·fX·eØD×|§Ûf×ã‰ÆiüXÙy=ÕtÍÔÌOq†ç|¤ð=ßÓ̤Yr¸àDôt½½0Ùu9иž;§qĺë`Ãq,Ê´^ª-»€Ú¥[D]ßÉŠón¸âBø\±¹<Å}à4nãBIÒ\R0=bs:N¸° +×»rÍl€µq^Ù*aÂýÝ,œ„Ñ2 Vüˆí Ñ!xñM ©r1–é†Ó²Cݶ ˆÖyÑ*Ï;úªY åÆiˆÉ| 5Zp"tÄìBj¼.I͆Q™ ¦Vžwmï«Ü2Î-¼‚™':ïCMW]ƒŒÛÉÑÌwbÍjh³k¬à1ï'¤ˆÅ™¨QïiŽe5ŽQ·¥e YvÉÉ8~µ©4Éua5îŸfÑjôHßw$tºä"™B›À$‹í¹¾ZÝx]0†Ì³Ì÷ ’÷+ÇùžL²ÌÆÏ4n͔lóLÛÝ@ÛzH²ab–Z´û¶q’ôÒK˜y¢¿øiïgk{GiÛQ홍®QºSýª{Áàrœt½¡;od(ß[9Êkè@á5~¤ó¾)ü°ú¾!róC؈Ùà@œâ0rå’߃9Òk ©j<±g6fžb| ¤–Ûo +¿‹qªûE±úƒm:‚XvÎñmg¶Àd·Àj%Ë󀣥ÆBDë»Y8 ¬W·˜ Ëufxß +x8^¥Ïüé5͂¥ÕÌƌáxΕçq±oøjÝ0”¾óPÜH¡EðÚ%!¥kn!Ôzc^ß~¥õM·"h•†a†Jí(×3>ß + |® fYvÁpÚÖsa’õ'~Xi#ȱ8Âpݤ¸ö#£jd³kðqÎo(¥kkáp¬ÎïJø®ÐˆU9^2 Ç3IŽçfËø$už·ôe«`¨ËV+ϓa®û-K´ªÛ= ©ÝXbåx2Î4ÿ£8Ö?0‰R³ÀÂUWÑS¦û™ºi­ò½&šOÕÒñÐNfyCß9 _˜½O‰¯·@br;Q¸oú¾[ácuFr$Ë-±ô‰4 +žµ]Ms^#'Ê®û]Ùý¡ž¬Â÷žW4 zœó#r¦à”pÕd¢ÌJˆæ>ËrÌÿ]Ïv6ÐrŠ_V܋Ÿ˜]‡YFC脻`J•#€QºvÁK3Íoy–ó6Q´Þhã•è ×E„q<ã[o¯1¤Î-bÙ6¨Þ·9Qõ] ŸÖYÓZ–÷“²ý0ͳ¾$Iž31®÷S,¦ µK+ü®gzÞ(¿ÞZ˜iý­`s­‚íÕ톕ºfc&¹öÿDßuW,ÚÞój–G¬–Ù ©dx8Ëø^ qŸ…O¼JËhÄ Õ|bӄß)¥ÝørÏhÌ,×üáØƍX}%XÞû@ßy=Ðx šdyϲ»û¨lº¦ïÛJ]7  Ñ| -Sk`¢àFÜ(Í ÙxQ«ÚЫ٠–%zßíÒó®ˆØ*HRÉôd™ó@p<`ünÇ9×ã‰Âólšq;“£Z/Ódï±Ú´ÏjØ$ãx.|Âî-€\n1ŠVgKî9ïd4·+^åu>h‰æ£×tȨٍb4͆zVƒ„8Öoø)zÓH¿î¾©ÚnQ<·âGLňîË,Ûz*HtތŸ,8A,¶$ØËæÁóŽY6™§ùîE°«>¢'‹í…¯¼_)²íz¦e=ˆqlgQªû@Q21É8 7QmH¨âN®â¾%3E¬·™ª˜ÜU|§™šñ"Å1†¯ÜO)¶ól˜k<à—܉ñÌ1¢ép ì;¤u®gbLó_Éy?á¹çÚnxeãÅDÇæ€Ø2~‰ß ©íý‘ٝÒÈol?¡&—Â'̾eÛ]½q¼§Ö]—C5ßk¨bl`¡xÑ7­*í‚>^øZ0Å&hé¦9ì4™$ÃðNoÚ.‡:ÆÃ<Åõ–fØnód׉Åxá¿u×ýªð»¡5Ž—3U÷O–弈­8=[ö?­¸'9?¼¶í¬]ùÞ¶[VN“N£eÏù™õ+HvݎS¾§¼Ò÷„U¹Þ±ZVÃ:¿ab\ã$Ët-€Yö9Tm%vÂð2Îuž“ÛÞ+¢ßð‘ÂñŽT´CiZIi[>~åþœ(²À©y‹a–OôÝß~é5žÛx Ÿé;oÐڟÓ$«ՒUãgø®Ø(ؽQ’_p‰QŒ‡Y’÷9Q4_xm×=±ez?QúK–wN³µ®ÙP9²õ(Å´hŒwãg½ê+Ë­·_Õl‡jévAß3]ïYŽ·ÄÎõ\q< æH¯qòSß}x2;á³¥†#eû‹Öy¿rÿ +Q<ƒÊ— b†ÉìÃè…ÿàc"ûPZ¡©@ÁâpªfüQÛîÓ4Ûw2€Æú .NfXžÌB†g>N3NH§ó<ë?Šä»ŒŽ£lÛµ,Ëy’a—Ü +Ÿ+6#?Õ¢Õ¸véyÓn›ŸÜªó&Ã19“ 9/(Ö{Å{¢™Ï"'ì­Äx¶7¹n¾ÑٝÐ÷liï}±z{à‹>Sõ†’ Ó©(Ãu3€Sl2Ñðý Fï{®ä¹âX„ –š ž°ÝçI§QBüšëà¹J!‚¹ÙDÓ{›¦ºîE¹¾[Qžý3Ðs©}çE¹p½­—¬ÆtKFƒº%«á³ªý*˳^Ï9_ã„ß!¯d5°Úµ ¨Xµ l n;dYŸÂÇ%‡bǫΧÜaªóv¢ê<ŸÔœ’íi·ll·k$«gPPyRs$ˆÝ`ÉíçÊLGÚîs¿e6²Ý² +ŽÖ¹ ¥ï¤Ïc9Ê÷nšð½#Jp 1Qh3€cyŸô]g]ï_Åä‚N9žú¾ãiÂ÷T’ë<@£y„—§× Ÿ*4%ÕlÏJ(î†5{F—m㉂ÜvJDò½î—ŒÆ2ë¦ò’!sÅö!Gkí¦¹öqÙ.!Žó#|¸àf’í»Ÿ¦™å4Í¡Ô¬Æ 3íwI–ó7Í·ß8-ÃÓjÙ,葲ép¢lÿ:ÇCêÆ€«M³ÁíÆñ°_ø]Ó«æ;¯ð;£í\Ïè[vchuÓqÃT–ߣÕ5 „¸k6®ˆÖjU×}éº?´EËk +JÛÛ~çxB¬ºo ³¡j4¤W·HAi5”†Êö¬Ú´T-Y^·¬Ž“'!Fi!&iN!†‰b“›­ùR!ôÉU÷_ ä9dÖMGŢݨQÒiȪñ:è0¡qÈùž=ŽYk<Óö¾ë¥ß½<Çp3Ð3¾…˜¶#á!÷{–p<Îy ‘â™ï3uÛ­lÿ7(~eD×Nåz,|bý†˜,82\q2ÌtX…ç¯ó"ű~… fvÑxȬZ¯„–w ;A%È\r«ÿ\Ó}¦Iz½èÁRC ŠÕ}šì»àtn&ÙÖã•bŠì§ªöƒ¿f7džb¹Ä.4¡Ysdßõ4ç4>|âü¬µ3Uf5Mt>ê(®·õÎ÷jœí;9`v4f~ 5ÿå8¿³y²éržn¿±Z†͚í5«r8N5ž ÔlçQÓsÀ¹ªcxaB;Y‚Íí\Çò6ÓrÞgªæ«ì:_Ž³|ß90ÏPA gp‰šß<ÛtËì|ïG…çåDÛv5ÑtGšî¯ð¼ v]ç 2ë©`¶Ÿ¸Uós¤ì¾Iqí߉ÂñšÙ²MlY 5ž×3}ãù¤ð< ¾GódãÑt1„dÿ +߸2Lû‰T³½ìvÍìVÍ#õ¬¢:¯ÅWžÎÕˆ­6’£¸Ž¼ÒiX·fX¹e0¯e7R’m:äÛÇ9¯áåÎë†Ró±KmWۉ°:K’MWÕ¢ÙèyºëVüÂâ>Šã<ÉR o5û­W¶|­g6~ ê~K“lÿQßz¨"8]ó* d™¥ö² Ûa„s=ªŽEÜ40«í»fx΃fIŠá‹Õ9 ?æ9–cÜŒÒñ’Ô9^“jFãX¥ã]·eyMAi5¢Ö4C^µà® gšbDó?ˆç½JrÝǑ¢ùêÛîIH͂&!´ + \x^Ð׌Fv{VAõšv¯I¯bDçM”b;û¦3zۋbçt:SôÖ¯["Ó»b×jü¢dx4N5äøe_áó’3NÝuÒ,»n…êì¤÷«¢ë|¦d?Nõ˞òì’S䊑óU¿PƒÅ# «µå~ɓ Îå)v灲í`”æ¾ óÜ¢ºýBBsº«7Î?*³Ë*Z«¼Âëhžê= ³mã‡ì¯iÂõ ÛyÞÕ ·+ZÓühÛÏí–é9™íùœê: +(MeRœÌbüÄæx¦m¼¦öçsïw°b½r˾û¡²ïjœl¼“#فFéì‚ ’ü±ËžÒ »µë–Ûõ‰‘¬çEˆa¾K3Ü׉†÷Gìyïs=ۅÖ6þIH-ü-»›q®ùN¦ÒPÐh¹‰ Íü—dšnhMÓý®é=õ<Çd·["*»1œÎóf Íx@弋1~÷ƒÎõŒÔ6]Û®SrÙuP/»ܪõEìÛ¿3U×m°I*Ó ÓT¦‚\ÛíDÑ}àU]×ãs¤k½O +¿{Y²ïBŠç¾È°M72„ÛÁ(ãvJl\/ÚuëÍ@Ïûbu^ÅYæsÈizË(‚­ñT×|ž©›ŽˆmßÕLËzgzÏ#}ÛáDÙtEª|ï}ãé@×v¾é[GŠ®Cfá4€Õ·ÞŒÔÜoa¢û8ιQšvA³ª浬F ´ÜQ†ó Eñ}FQ,î7ãýHÝx$Gr>†é®“i¶û>SwÝ ßÓXA í-x”$œpÙ'lºú;Nye5ÍF–o8ëÝ<Ûu2ÈtŸÄÇ«ÃL½ˆËÍe9¾'­ôº'°Û ÕÍ7Zá}©¯]M§Ú«5(Cn'à÷Óq›(µ™çÙ?ô=«A£œÓ9©eu[GgxbKô:-w~—´Æë|O·ŸeȦ{Á3®C¯gz;Î6_OVۋQíNáyÆëoh]ÛE±f7°Ù³ +ˆ¼h(¡Ñ;RÛ#Vãx3Î5’m'tºëžWù]v{¶×ݦÑAŽÕ[šâú÷K·£vÙþ™çZ/£t÷cmºã˜ïñëªAÛu)ů·1Df”¦˜\ǎ“Ùƒ¦×+×1(´by/Stã©Ëúᶬ‡‘zŝ0>уÛð]im߅ÜT¡•q¢£ ÉwkwN—DD§;"’ûµ_9‹s,çÄÊûVCm0«d9†åi¢d¾Š’ÌßS¥6RÛ»Ap:+˜½/A†í">d<Š0í/)®íPŒê:ÍS}ë•[5]LT|?fÙtÓ-O5MgÂGKîÎ•Û ¢˜]gºÞ[»rº¬¾·‘–ßp¤iûU‹Fc©…ãÁ0Çú 3Lsà˜ýÙ}ӁÔz0ªóܶ­§™–åXœe¹¥öÝNáu*€´ØDôL¡…Ãxß4]Çc ‹ëц­ý´g¸k:¯¢ëÍ~7]u )à´ò +®e +v7rÓx%·½¢ç|Vóœp +¯‚žÕ¸iÆñF†as'x Îd¢f>ÐêÎû¡²ñV”â|̳Œß™ªû2„â;JÒ¬'f×vG+}z]»€(E« O9Bç¼/ºï†Ó3 ^˜ä=K2|qžó)Îð\ +“œïÒiü<É*ˆá3ƋÓzèûGº¦šÊïˆÕ9ÞNôm"4ë?à|ŝÛv9Îù^ŽžWĺó¸ðBýÅRّBûIžï€O³0«hü dz&?`oZˆÊÕ¬š •¤x.ÃM=D ½¦xÎW­h{Þ획èѶÍójf×¼šÙ%qí@±E¦Àž#)–Z&d¦ØLÐH©­Åûãõ75¤f£H=Ãêªé= ™áí(Åq3~eü RŽ—RŒÛyøÚu"?æ¼V{¶g¤Âý-Ëò)èlûçá@Ãù?Zq#µ]K²÷›Âi™í9 •Ùá<×ya5î/úžÑÀbËn¥k:Ÿ'».Ũî{ÃêÅë›îÊ%Ã#Yf±Ù@ÏsÛ,›U¬šÇ*Y $¾¤¶ó>‚aö +4Sf5Î3ÿÄ7Åö$:fAœ^¬J“jåyÖ-Žtœ?jÓ}”d˜\ ¬´d6íýR†ÔXˆÖ7Mô~ȋFã ¦ë¯mº–#y.ÅÏËÍY•ûÅHn0¯pÇ®:Žôìßy¾õdô”÷"DtH%ÓKbéy6R4ŸH%ËFé{ Ãu] òÕ›‡ª5B±¹ µç³ªíd½â^œá9ß´mg’,çS–eý‹bœÌ󼏙ŽïÌm»Îh…çÍ@Ïþç;¯†éÎ{a®íR˜ã¹)¿ÒÇÉ8~­ÝLËuï·ìΨmïw¢ç| ñ+Žç¹ö³æ|0ëÕFÜv©iÇq2Óñ›Ïõ\WzÑøœ)ú~‚ ƒ»išù0Mô©µ ;InD¨¸M•,W35Ïù®hþLÔÜ÷€3¥æAF)ÞaĂS‰~ÝÙ3¹]ë•`²Ýhéœÿ +Áë„Ô¹O~G"ßЙZÙ¦ý?Uöñ +§á3uãÝLÍzêY¢ßeœg¾5MG´ÆóŽU³ÍêÚ7ǹ­œ¥™ ¥\O„ÎÖۅ™)3a¸ç}®èý¿{I²íRìˆÕKˆiý ”]Gr ³³$Ïyã5nçÌÎi©p)GôI‘}GRdßyÏ~ßԍ×4ã¥R¸ ¼×{ŠÑ²»–¦yNDG‚Û{ p;«U†ÑÛEꚏ¢üŠ«fé4ªÀw¥du,dz=ƏlÏa’Ù-­izKkš^5›F£M”ÙG UÚqɾKVÉö|®g»5gi’í6N6ßZv޺ݐZÏjØ³×é4¼Ø¸hµj7ªZ³¼ª–Lº¥ç«ï=ÐÚ¾o!‘Õ©¹Ú ¬¥=ÔTµ9É*8NÏ.8Zé6¦[:ó©ÆkˆIÛ4ÓoEÞ´f¸âH،áSŠí¼ ÓìóÇÛvÏhTµh6X §Ð|¬äú‘*·ƒñÓb 1‚ÉÕ<Óv'Èrˆ‘L÷’LßýDÏý+Î*\ø¼-Ê+92«æÃ,Åù;Tj´ ÉOøªÞ<„ä|È0Ýçzå6šÙ¸ÞꮣjÝu^ð|oEXÖ«ÈÙz3±#vafwñCÖ;«g5’‚Ò*¨‰Šó0ReSï».țvƒYU«ÀÆÇãq¢Uà{¦Uð»²ýR®Ü®ÆÙî¯$×~bõ‡Dô®a´ºój i?K³Ü7±³7‚GËÍŠöG¹p¼È*úÌtܦ3EçY”j¿Š_—›  0>čWý̔qZFƒ™ç½<ÍøÆ®µ'Z¿Â<ã[œfüͽ÷©®ý2PtÞxÓa¹fz?뚣¸¥¦xe¦Ò s˙¦ç€W7ßWUïM”cu–&ÙåÂýÞ/&Ù?ÂçJíÅPˍD VϙªéV–g~ Wœ V›K“œyž÷Ç°z +a[ ’<×â$ÏeÍy-‘º¿äªõŠ²ÌÇ¡žùÁ-ZŸ“ñNpÚOMûo¢kºauž'ôM«ÀI(͂g–^#æ‰æ«,Ñú”#ºÏ¡f Π•Ú +â•Ðv\çµùÜ¡5]Œöû°gýÈLEkíäxž{nçyß¯Ùï— @k»†Ô­¤Æ÷|¤p½cÚßᣦ{Já@L®÷%j‚Â3ŒRoã5NG”¢Ñði¾éb”ä¹ešÝžÑð‚Éô˜†Ìh £ê¼ˆq썤˜žûAÍö°Ù6D[9 ®Ø6ÇkÜî7•ÛIáp%$'&:_âüJû¡ªëO«™]ÛvWÛvœ…@“í簓”^òºÝ0Fé{%Çrž…Y¶Ã Õ~™#ûΊ]»±„vw•$§£nçwÖ-Ï(¨lïû•ë½4ÓùáX[‹ßX‹ÑÍFÙy!ïYÞpúæ»Íõ¢-œTBn|·gzFª|RLëA„h? `—Ô«îS»ð;š¦š´ÂóžY² +z¢o,G²ŸæȶS¢é(Œ<µ(ˆ<bŠí&|ªÔ6ÔH¡±Óþ*­j÷‡ãTÓ¹$Ót=ѵÍ³]×¼–偿g4HŠcu=_o/ƶ9]«`je @Ð龋I®ý-Ë5ʒ¬ÿaÇ÷­›¸Ï=½ë¼‘Yž4 Ç£i¦ý;R4(šö›øm±™(Å䄂æzÈ-ºâ «Ã@fµ Åì ?³ŒŸ™nçÙ¶sqŠÝ-ðtÁ„Ùó;§KÁãåv¢§ë털¶{!Îm€•éh˜n¼¨Û.ñk­f~ëÆõFì„ÙMøºâBŠçþ  Ú/â&\ïð‰ëKìÅ9æ¶ÄÆõMBi{̬o¤8Ö»ã]‘ñ hÀêd¶Ø|¦l}ÛöÓHËz«z_-ïKŒd~ˆ/»…®º—¬¸,Nf;Ïsÿˆ}ãåLÓ|›©yïò$ëc Ãì"D3?Ù®ka®÷ʬÜnº¥ç5·ð;«ŸcçI–]u@Lex”æ|¢Ðb¿Þvªf|Ðú¾ã™ªën¨f=0›Î?¿ë>ӛæÿ`ÏûßuÝOnÛ}`uM×ôU7ჵ&C©µV#-Ï©0ÃâNš[l1Ô09ž«¯c5Ïù®éüSKǓnéx;TuÈÚîóLÓ}äVͯ‚Ù}bVݏi¦ýÖiÞO^9¨Ü4µ0!3=ñ1©·X· n˜ô¼•bz¿“„Ûa§pøbÛ*˜fÝu¾jyŸGɃ,Û½Z7 „U9ÐÚæ­r4[fÇ´ÒíŒS´=¦­FP:×#9šó@«9. i-OJˆ†0*·“i¦õ2̶¿ÆÙöß8Õy¤®šÞ‹àV[Ÿ«5§V­KBÛëjÕn$¥d4@z¾ânžé>T;·›å ½û?¢0‹#ûeúE§nãymvm/È{†gåÊëŽØ7¶K÷ƒÁñ}n[´‚Ã0ÕqQ+ fµì† +-· ®·&9OÓdÓi¹e4‚¾e°(Ï~8ZlZr-~_wÉ-¶¢-WÄ®ó.Oò½ú}ç)Ñ/0 +:@ê®H¼÷šéZüÄzh<f ßóŠñ3Ë5PzVQªv Rž7B\ó—×¹ž T,.IˆŒoUt†÷Ò$ç]‰Õu”ó<¨íƱZF£'Çۑ²éJã<ŠÒ¬NåxÁ0<‰®û«· ˜³\ë±(Íu¿*[¯°+nՋm†Ò ÎÄp* ÅoË-dXæÇ(Ý{9P¸ÞUíÿ±²él¦d=‹¬^ÔªëBäT¹-¢=K²E›Âzû0†çfœí¾ nÇBøuY†ÙW¢aulø^s »“0Áê Gñ½…™Îc»dyÑn<øïY¬Zn(O°¸G.·A«4C.·¤Ð5GnÙ{'÷írÏs>Y³Ý†J®«^¥¥<Åär¬âz0›ÞG¹q¼ŸeÙÞÊߑÃõ6â#EÏZãu%¾-4˜c¹nŲوêÎÀù\ÈÌVœ +™&3¾,» Ü´ŠV# + š§˜œM5l ,߁ÉêÀݳ=¡Ï8Þ Ç{äºoåÂùCà·þ‡Š¾Ç8ÑxaT^'µžéM±g{Ãéünšßµ8Çâd$µÖ†ŠÒx°zNH}óm˜î:9âüïI§á¼šÑnÉôzœXd ˜Hù±ø mIÂfMIp¼Ðª¾¯ë9àu?bßvÐí¼.¹UÏÁ>­'Ô ]·guJAi6”×5ž(³ +(Md-|Àê,I5×+Ï[bÙw&ȱÇÙ®“^ÍhüHáw#Ã1žd8vlj¦ûÁ¬ºoR燈ÜühX۝ÿIÓ}䎗œ¢Y`'Ì.,ïƒÒx^•ÇÉëŽÀg{4Ë6 ±»‰/K-uÛU±g£t9Î4Œ2Œ74Eö£¢ï É.¹8Pf#^ˆÒ/D/¸“_X?C(6Gó<÷s ë:¦9ÝÆñ–„ÎnD·n!t¤ØZø¼æ@~aú ¸o3%ë—Þó\MT,®Ã¨•¶„侫r×x>èún%y¦KÁóeÿ’ý&G´]²ZVA´mã<çÕ2/F³ÿ(fïø‘ñ)|áúê¾+jÕt^pœ¯ã©šó>*Ûµ¦Y`”Êõh–j¾‹²MBD÷Qø„ñ2†d<4KfÆ9ö¯0Ãü*;/©}Ó q¢ñJŽáþGQŒÿ %‰¢'+-d ·‚x¥VóLë§Zº ¤^ÈëÎÂçD–²ßE’böA«µ«ÚOB׸¹jûnÅùPÇþŸ*ûn'ê®û¢ù$zÄò)~Âð'|[pÈ0;M5¼QzÙS–d=͓íO^éz>êº.fúewq„:Yn¹ÙTÇs3”[o|Rg*„\j?Öµ^Ù]÷ƒ]ñf«Å¦BÍZyf©‰,¹Üh¤d¼ÏÕ¬b×~`µí'áÃzK¢ýÞªÚ /"¸ œ¾p7"¬€Å`Ž^iWEizS+D×[Š0=ËÚ.ù$³€{U«À +|'Àw›v£Ãz$IÕö‚Ûs&Á+´ )ß7’(¸'yÇÍR:§ùÅæ‹ãj°Yf0Õ/µâ6]Gfßû§»ÅΔڇ(2i»n)¾ÿLÝu?T6…YƃÏø‘áyNH}ßùTÓ|¥·Œ¯ +¡÷1Ó¯¶gwŠÛ ±é}Š²¬— bÅvçËނdßíDßwBÝ´^®™^ˆñËme9fG"£Á´ÆóVŠæ~–©6 0Un$t¸ê$|°Ô„Øó܇ ÒÛPé=½B *BûQˆaø/ ^ P8¹2´XµÅ ŠÝÙ4Ÿ‰Mïc³Ðt¤bõ+7®‡Õ¢]€4îSè8^y`ù–Iôd½¹ zÁ‰Úu6Rñ$9¾§(Ïú¤Už×#eß©,Íý¥™_¢$Ûq n>Žò}÷Ä*¡e¦]×IÝvDkœF‹Qç¢GlÎä(¾/»é=÷K–·4ó# ,Ñ#¸<ÉIŒê}Ìò}„Îi§o= «σè$ñSDþYÓúâxOA уJSÙ ²lWÂǪ‚ ÃßXÅx˜*\ÔÛæg¿ñ¼”áל#V̸‚Í(r¹éLÑ}&y¿c5ëo¬â<‰ÓKΧ ߣೆUZ¤´ƒ“¨¹1ü›±͖\‹ ˜Ý·óg²]vß6<çCmӑÀÁz“°rDgP^30c[¶@Ã$w‰ŠÉµDÅêH0¹—fzßÒïU9¡a é¢/è€ÕxˆØ~žè/R±ú U|ºªýB+\oƹ¶ËnÏh ¯é=Òºæ×4Õù—$œïä­[†´Vc‰(î_¤Š§×uîvF5{†—”¾ùÃ×Uw)¦ë€Q9 ¯Ù@ÑqßPY #Ö·K–çm×µvřð±bCÁ“Å6B<ïU’çþ”mסEÖàäiuã$ߧY´2€Æî„xËL¸ã¢Ø½h}Ó]¹dyÎ+zOB‡=rÔ:wÏluÛ, ^Íh¨Ãy¤ÛNi%ÓCbáuAAñ»dVZ ߓ»£È¥Æe×ýHÑy(A¬86Bh;Þ2„0›ƒNÓü&jÞã@Áâ@ø@•­$Ézf;/Gé¦qÃ÷i–Yp(lˆÖ˜Tµ¾Dk~õ»¶ca¦éNèˆá?ÅCÀD¥uÃð)K±Þh]ۙ,ÇîB+Û3-çg,µÒb$³ÒP–brÃ.·¦_¤–å!§i5<†â9£ö¼ïj‚ã%µý2Ð2~ÅÎXßA¥ŠíƒŒ[K“œ?bÝt)Ç3ÿÄϗ̓|Ÿ~ßvˬ<gª¦kü²{Ø¡r[a¬R q^•·ä<ˆ1œoQ¦û;ÑöKsLÇB˜5÷ÀeËæ CÄV‰†½%¹êý•Œï8jÁÉ jÅý¶csGMäþuˆÜ'‘ÓD6A +øÜBèU_qŠõ>Ü°úÑK֧聢oˆYB»øSSNÕ ³œ@†O¬ÎDO”šHój­dz•¶ôžç’Wy^Eí %Oh'tºæPü|ñ]Ãò%Ë09¦×ÛKTŒwjáy&t®Üx‘53BiÅ ¦†)³À°ûÊS|Ÿ­÷BBs¼¨¡5¥ð +~¢pºB/7ߓí_Réxß­Ú^7{†§£lóNzMÓÝ?NÉêŒÔ8Œ`چ¦w 2|ÿ5×wÀ%=»q½²Uàã)©h5¸ˆâÐó„ç‰ða©¥øQ™é<¿àvbvä¹ï‹ÂóŒÕøžÚÆó‰²é¢×38Ì6‰±kMhmóošé½‰½Gù‰Áù4Õz,¶LïmÓ ©r<£¯ZÈjüî$9žû‘¶ý:L²^– ŸSœ'+涓 [Ó¹ŠÝŠÀfwC_2½¢µm×CEÓ¹4Éþ=]w /Iò$˜}GJÖkÐ9Z·0Çöê–Lš•ëÉ Ëü /; ®ú˜"v™¥µpúöß<Õ}>^q.Ãt?h<ŒÊó–Ó9L‘¬G~Õ5¸™EŠUt"£¶^Gª®¯ Ïr ¿-6fÚÏÄÎõšY83›ö—èIj7`™fy «âÅ,{‚ÇéÌÁHTÌAÇЉÁÈSKÂÊÒÐXœ¾õVð¥Oü(™¬h½ ¬Na%ˆ=AÊ·ýìÊV½¸e?jÕw)B)µ9Eì–é–ðªî¿èÙ²[P1"“ÐbïŽÝGŒb|°Ê®“‘ŽÍyµc¨`p6M1ÏTš  ©¶–%zÏó¤ãÇsIîy¯”¤îëT¿ÚHœ_jÍ-¼ß…ç¹à »€‰J;ÁV?áó¢'kÍgzÞ ³g¾K4\¿‘ží>Py^˜*80šYDœV(~–è$É1üP‹Öû`Åä:Xm*‚ZöÀª¹@Qq$l”æ'tšè Ê-8&W6LNY$æv4úbóu¿ÞXŽau?aø?Yö¾©6#–›LµK'+&'¹9‹ÆjFHë=HËÞàãËNà…RKCMR;ç¶OƒÒ{dÖ]—bTûS²ÀêzoÄOTœ ൄ•£4  ,µäØܳëÖ[QŠ÷)|¾î!±?„†ÿ ’û"E4 ÍOvÕû¢"¸ÿ©¨L¯æYÞ¥evÎ+ÝË(­Æ÷L/šûošì<Œq­ŸRÏò¼Z6IÜzr–i½—l؊ßÑ:iˆ®WŖé)§dvBè¼îšM£±¬ÎïÀZµbEö ©ñ¼À)2g]ªI=÷ rómžj ’¼)šù0Lt]M“MWÅ®Ý8)’çBŒ\lBß2=î6ÍFOTž·eûWŽä9áXÝÐ[ +§ƒnßt É.4è×YNGݾób’cy=Qe$K¬´Žc”ÜåùµÆ$dfw ÃåDÓzcõ]w¤Âó€œf˜Ñþ›'Ú/‚ôªG £s¢ã9ì÷}ó›»³4ß0ã„fB'+.¥Xæ÷8ÝtÐlYÞHìm„Ï +M8ï… Ã÷ŽŸXI?±ƒÅ£T×Í(×vÁªšÏZïCcl/Ê5~»=£‘œÎiÌÍ}>Xm)zœÈ<à4‘yȑ2ƒy†ë4S±}ÂÌw ‚G©bÜr3)†áQøÀð$r¼ä`üxÙ3Ѐ٠Dª¹M4|ÏÀ“ô¦ †[vÙG€¼ô-|°æ>Ž_ü˜§X‚JÖÉs«eŠu†3%ã;Ð@¥aHQ"‹‘£õÃ\×ùLÙwP5Ìr¬'1ŠÅå<ÛüŸèÛÿ“ªû/M¯z$¶L}_ÚºU°ÍÎiœ Åù8[n#Àð](ž[ñ'Ãl÷¯[³/~Àì^¬Ø>ØX­½Çò$DñÅhö/±ô-Lq¾‘àQŒ"“Ú[Æ«4ÇyÂ.9>/¹¡Xþ°kŽeiö£ø©Zs #”†”2Kr×w+Å3†•%4(^61_·– w ž«µ$öm7Ô¦ý?jº¿¬Îól˜ì::Qe-‚^r"t°à$ ñ®%Ѐ×'L1üÉqœ71’ñW.`´Ìÿøa±e8›'@á’9äX©½ŠÕ}¬i<ò[¶³HÃÞh¤âzÏ4íoY¦ë<ˆâýŠŸW]‹QüA ڊŸª5©VŽUûÀxÍ/†Te'Ê+¶Ǭ8¿­7@091Uh+Æ2þÚu× áãÄÆàeJÆpãU›(¿ò&xŽè” «&@qjUÐ1zz"sq~Á-·n¼°ü*^u˜ uˆªµ@*¶Å0¹•%Ùþòìj3qVµc÷­Ñ™®øûQiÉUx¡r ¡ÃU)’ó/ÌuÞh¥×áDÑ{–hØ]˜EûQ’e\GBgÌ?‚ÇëžÈ%÷‚è%·uûw¤oº›§šÎEIÎ×@Í{)Û.Å vaf¹•8½à¦X3¼¨;¿ÂÛC’^mWî›”ºù$|Zl$z®Ôl”î~î‚퍕·ãbé{v„Ò+zšÜ\m™ÝQ ïE¹Ö‡Ãu9Rg!ÀpþÊÎ;‘rÁùº`lÊ¥u¬×Mõ«M +VëƒØô% G"gê Æo잒DïW8KžiVÑÚòÛ÷K†§¬ÊïTŒå¼‰ž,·5Fd¤ðyº€bRÛt%|Sd'€¤Èp iº ”Ì‚(oÆIÞ»8Åz—fy3%痊äv^ð›n…ÐÊìd9&7Œí§ò<èºNxeÓ ­èþ !ò™/öëæ£,Å|b¸ß‚§«~róÒ¶“Ú®£nÝw1ŽSgrˆÎ<Íó=h«V§9•$v'9 ž1¼Šq}WœÎõ²Û´ +Zšã; 㕙¶+כ^á4ZŽå> -85Wk)F5ÝOÕ½'ܒ÷Mð8cxÔödTvnávK,}/çyöȉRë€sW¢g«þøu¯váz*È,´B+¸ojŽK^Ýu4ͲJ²l³lã%¯e{× ÷W“ۏµô¦›QÔJÓ°ÓäÞ¡žùÊíZïFzÆcAÔª¿(nÉyÅæR–å<\FC¦¾³nµ±Øñz1Žá}¨ë»—æ¹ßâãc ¥ÊBÐ5Ô°6eyßÀH—ý f‰NÂGëíƒ(†§y¦ï|ªë;`Ս§’$ëÄdÇ+ŠQhh®a 0§Jø°ÖRŽh:&\Oi¥ïÕ<Ëtr–ÐHI ±kº¾*¹ F¤c NìIƒ¢Äªï`Çú=Xq_+æS@¤æ°c”f‰n½™,·ê'‚Uk/„au;Yn¬€Ù^Šà3Œ[p?myc%ߟ[yO”½Wó,ۅ¹ìj¤Ð0ÔX©Y¸‰BûUÆì®÷#È1»Q¬I¶i Ów!ÆðÞãØu—‘Žõ.Ò09*—ې+Æ·H»êp¬à*¸XÅMÂDVÂgë-†ÑkMÆðkMYmï•ÀgyRBl6^e±…؁*«q®ûÖ¬`õÝÄZ“#´‘ótfb›“VÓjmëPIžåTêû²zV£»]³à8¥Ó!VO€¡Š;üµSŸæ-R,5kW œ,–†)”ò*ç#¥ó;˜¤y/ÃTû]Žg?…îzBÍ »ñH×ü¯¸AqýÙî¡ó +b¿ô/~[u–¤Ù ^HÉMÌ¢÷>R¶Š_–Ûˆ*´aW‹òìÿ±šûC­˜]çÚõ†¢ØOyzµÅj½Ø™:ƒAcSqŽãr¨i}¿KVßuÔl á•\Ç°«~]û£Û¸ˆ²«í„ùç3eßy )z‹à‰*Kìz{1üªS¨I’S Ÿ_š`p@Ót,9EË­D9–—qšý¿­¸E.¸–æ™?Ót㑠Ãü›h¹N…ŽÜÃÎÐyÇJæïLÓx.Ë´Ý ¡X¯¨«Î(†ÿ(ŽçŠÖ8^‰•[rK®&*î·J½¡ø’·øQBSásR#áӔFûD‰µöòü²[¸9’‡ð9‘¥0ÇÚNæƇq¼ºËHÅþ˜(™O²³o¿q=’ +[t(]ô'Fï<\rC¯{ŠáU[µ¼_†ëEl›_IJíRü\½AXAš78 b«øe¹­êš£ÃDæ"¸åfbuÆÂ,ëWg:¢XÿQ çsªâµ¥Ž'òžÑiµó~ðù¦›Ð…£Gë j=ÛãiŠá`ŸØÉ+4 [Žr¼ORãyC¨Û¿œ–åÉ0Ûø˜%{nHßýHÛt-I4ÂÇÓkB 4¬ÐÔÚ͔¼?rÕ|jX +mֆiԏô<÷§)N|á3uæë;lªÜ@|Zq'Çs¾ÆžË@“ùUɛU3=å{ƒKÒ° /Eo=TnH,·뙿‚ÆèŒ!&HÌ ßy¦ê:ç¹®„ŽÓ™–®9ÑûE1« Ç:fÇ ƒCbtBñ#¥Ffßûß5ÍZ&¨‚³ BZúQg0ˆ !  À,ò{Ã"vQÊÎåyæ¢jŸútî’4Sc¸(pQê&Ò +2=½orÀó\”npÕô¯pª2’]ªžô…øÃÀ(uƒ\Vû6&ú½Ú®óÿ±*‹“¿/$jÕޛZ¥’:­Rã_º +|ŒÞ3UuÄÌNÝ'ŽµDÊ f îÞ`3¤]ƒË؆lcp[†Û e Ò¾á`6¤Û1¢8,,8 ŒUÐ, úxXeâà€ƒ±p À¢D H±‡PêŽô,©¡O…2OÏ­ -'¦6Jý¨,­£›:æ*6e8U/Y5äÍ­ÆÉUŸ¢=Szæ}gä°õÔ>®ÞI¸j•›¿ægœk)ÝaRºÆÕSz'ÑÛE´þ’B=S®<ù¶Ò; ¯~ÕÄ-:k½Æ?»£@u®ë˜z¨3%íÌ3U¬*¡U£ßIè¹ÒCŠøÌaîcßYgiî#´ˆgšî$ú™¢S‰©îÈקéãêgá$ZÝÿ1âM¥uêÓ3d_‚õ'æ™êŸë¡þêZê]N;‰“X:k¤ÛiŸèó0*ïI·2EÈw•o'îŸÅۚˆ·#ÌõU,%åg«ʄy˜³7Müz­ø(Ì÷YOâ$ևŒ³I"rD¨JGÑ Ó‰$©¥Ä:S»©¯kïw"‰“X:L¦ÝÍ +‘½g¢6N쓰æ3ìÝt t"‰)Ô;묳ÎÒæN{Eœ¼ÉöÓIXBŽÒIPEˆ9 ,õ,¤dŠÛ7Չüš¢£°]´{’Eï6oÔ¶YbW‘×:­7ÑϲnKlonúYIõ,œ¤ݐšUŸQ•=Jn¾©1ë¾.: ¶íH󦦬‘¡= ¾ñ*S|ꯦzñÍ?)5|t˜_ÌFUSW¾£°Äº|iq×n×Ö¸÷µ‘7=¾›¾)=ãNãNÒ6úáªãßQ˜º&èª:aÒ;KõþóöŸŠ¬H±·®IÛÒmÆÔFöŸ˜1ïdϗ2¡Ú³Uë>+Yg)uþJ¿Öæµ¹µ×Yg]Âå=묳ÎâSˆÎ:ë¬ÿ4õ©(±W÷¸'Ҏm¬Ýgd±{Ã'¢þÄ[¡·Wg…05J ÙÒa ²M û7ê³ÎBÕ?+µq$Y +¡:žõÜè(™"cot’WU‡ñ³p’ñFtÓeã׳–2ÆTÆú'Aeù¶ª‡I†”Â:erï.Len*¡dµÖ{„Š1_í™×Úï5-eKšoÈSÓ¾ý•©öƔtW¥ú³ú^þŽÌQªîd¾çJ©Kæ}'IÆ}Þ¶þÖé>£®MÓ5¦O…)µ WOÕüWU¯dñ¢?²=#²î{D–®S/a2äm»}kœý8!Bðu-¥ÍvdgCˆí‘¶ÔÞt_ãeN +Y’}º“˜;Ú< a¦üuLLîd¸Œ~~‹žŒîžÕWm:KiˆO$9ë¬ñKÕw®³úP]ŸJpÓé%Oö;ŒþŸz”ñ:«/!sÂN”Š| vÝ‡IBOõí§Çv>¾³Î‘Œ<¨„S •¹d4€`@ ‘ÈÄ" »®j.$¢pH0 ‡a0PCQ €!ˆ“ +HK.0k¤}Ž>‹Å‹ß3ôÉc •9 ñ¿BÎDPA\”ÅqFyQ™% +{—‡0Ê^[j7Ò;6Úï­þúZAV‹4=¸wÁÂ[o¬öB[{tÅHþH—×v$5•¢õ•£` –õÍËf,<{h‹ŸÁ\w8;+ •ƒleAˆü©mÑ ÷‡Ú³ƒÖ¯6´º±;p9Ô7:1 re”@¢KƒùKÑ@ŽŽ0Ìjžžl§ZY±™‹¸ë×„à@º‘>J@E!=¨äs”)-Œö¤éŜ02û;C3e pŒi§Á³µ +(?¥[ŽÊÍ$9¿þ‘x·G‰Ïaì“EF*k\¬U'Ó "ë,–odn‰!R'ïu¼Åc ,ÜüÀQÀoA€W/°þ]#^ïæ5ÓuŠ` pÑfp’‡râZ¥#X_ ˜°-|^p›ì Ȃ_2ÅìVû_ #Œ)¬½ì„2çlóÊÈ7v ìSlÏ ®yPé\“ŒÏ²® MUÐûòVõ½ƒ4tÍ_éf¬¾kÒÐ\<%~:ëÒ\õ¿Ü˜y‹¨ya™M_2v”¤ãŠ=·¦úöêõÎPMÚãðýló“÷¤ôK6Sj7½ØIAýH;Ãw_2tNòw¤VsS¬…T³¿{ÙU g¢;¿vŠM:@N9e`Àyp*{§ÝrŸÁèÕ`Ïx©ýù²P˜Äx—Þ,,u®|%5ÑwÐuHÎçàÁqzÒD¸É÷í~Û k[‡—ò~$i WU Ñü$~Ýì|*àË\¿ü(ü ›)ƒƒ[ó[v!ׁ’nâlÓTðmS'[^LþÒòŸdƛè41 +¹¤k"Õ]íÿ¤¤0P 'ˆð%ý>ړpÝëi#ԇÖ۞)©C~Eü­=*³Är|T‚3kÐß¼¢É×õè}DΫ *Tíñh˜²J' +K>w$±ÌRŒ$Ζd+ªub.Ke©Š_«¹5‰øS\eGŠXR'“H^ù´¬$`€ÐjŒ8 = u,6ÎÍSpÀŽ c鵁Ø#ª£ÑÀÏ}nàf=®Ô Zll8!#‘[I—!°¼Çn¾!áɲkPi£€Cæÿ¦þ% ’‘Ég‰‡,_Ò¢ó ‚á:utëÏøV­?_‹ý!¾‘³÷9 lïç꣑.žj8™,thóz%Ï鎟#1gñh/O6±/ÒeBÅèÓ©v—1‡$ZBÊVÓ`T7ðãKªªO¦7ŽX`Sš‡[k@þ€ä¥ž7ÀO3ôQkv¨Å2¶ž&Lõ„,"”0Z¢Û¦gM,HtRzJ!wî`Hˆ’Siõ_ûÇ8ˆGü51 A#Úr«bü£ñ³ì5+[F!pD˜e«(¶.Á,ŠLx»*øL† Ƀ?Ñ5ŒÌá,’ +5…‚ÐxÁ‡:RƒƒlW°?Z¼¥Je{gLã6÷QøœÙ1@7Â:¼-ƒ;ž‰£(O“VÎ@ÝNÐePZR‚qÂw‡WÂf4BºâɌá•ì¨%»¾=¸`”¡¤/É၍Žœ³žÌ‡ä/ÊtšÒEH]CbaNdÙĊÀŸºÃ&%Yß6¤s]6+ŒCxr¯‚®¾ÌÈ«ÈÝi¬¸œê˜ŒŽú`n!¸T.;ó‰ Wv›ŸB‡a¡Í+$cZsÕhT×Y÷5#€g*ø_s Gù-·êP;DӛYKwšQãKIžËNC@ƒÑÚ4¥Š*ÞwÚ¦Uœ>b¨e.ž0åX>8˜¯RëÎ>!Ò冷áó)¯Ð¸Òž÷Ý㥰äN¾ð: H©Ð`#@3F.Ûà´µ°Ö: +˜m7Xk>É?<Ý|çõڞ`K«¦U6MÄË?ó&¦ª„” xvZ°Ô¼ëᘴ:ù•}dÎ_Dt»4H°âg Jӛò1’†ð¹Ó¢)YhË¿‡]ija¶$¹ºË–ž1%6a,ê§X’ÚDI&pь3d=¼°Dr SÑ㱓?½@‹"õ9ÒçÿIùý† /Ũö3“ú4F¡ô²F>òè±ü盵37®õÂ1¯R íÖþîð ™yd^r¸<$ד'Ú7}?ÍnÐÃ'h™û˜1Ó+|±Ó<žïï6rŠ £e™SMMBõ¿Oô&oŸG:¤é0ŠéNæYuÚGÊR4ÐG¬Kçl…4 +‘Fs™–†Ÿur§ /k½ôK¤¡ÙI`õz…z…œéJUÖnÓ ojñpÀ L^UÐRHÐ3R£PÝ×Ñb4¦QCÓ¬7`Bžà¥o¯C¦s…âЖ‹nñC”Q1¤Uuõ¯ajë:øµD»Ã·Kã6ãÜ®îB‡ã›`[0ÄA%%Ø}ž‘‹"Û}šK•q´#„þwhKm¹:…Õ +h§(jŒcŒ\±d0Ìvž-æ`è‘K-`ƒÁäuòDâ9µ¥"woQĀ24ó‰8ŒXÜm>´ô+J¥ÌQpÞµ T hÈ=`´ÁFˆ»xƛ¡=(ÝéûcMÏB:3EõƒœuŒÝ» ’ð-¡©Ém< {¤º1{Ú©õS{&¼ýœY:@x;!Ï×Á撇Ä?b›Ñ ÷[ÿ3^Ùr²-úH¼Šø•¼†Ã¯ Oxàë-*Úd+–1ÂDÍ»ñt%…6qhÊ`Ý{¹é„¿$K¤8A”.\!r¸?Mt(Øðü<©‰£¦eð/ز“[óƒâ%YlŠà,º„’Þ_°¼ê{t¾ìSŸ ,åJF¿pÑ.÷ŒnÒý!á)†¦G„¦¦P`|'q4§^ ¢ _7';èJ÷Á{<þqIz3÷šÔÑ¢œNÚl(ír_¬ <ö<á¨ÐJ9ÓçGRQûu"˜B@’5ß«¢Šh—±D+£ýŒ¿4³qµ@MgÒ¡c'?ˆ4Zµl]1~ÇK\œÀ“­…oÛqòⒶw&¨…6á-Å—\;¯€é…P7QˆÒ4=°xE¼«IÂÈ¡á!È뙚¦éxŠ‚ÿ5›ß IvídC\$î#ºG4敚0]ÉjÞÊ!¯¡ÐðVŸo…ÐÏÓÆJª2M‚É0Ž ÏCJ^0ƒÙÌ|W+Bm J}·²sâ%ilöÂô:3ÝE~ŒqƒwÖg”Ra¨ø}Ÿh‚>UÔ͋ùõ% 4:²-’ߨÖR5î™e!¢Ó½ç Ù0a-CcÆî¥jf“‹–º•GÿSv˜–ƒm<—mpƉֈEZ¯ƒºÓN>ºÙ½>0wãŸ%W&ò +e*ÀaDҁ9:t°¢¢ÔâÏ!Q¬®`õÐr®) M M¨Ï_•N*IEïWòВiHü9`H¤ÿiFhv™x.­kJÊÆA+nA•î‚Àè”ü/a˜ÎéËzS¿´@§’e[2쐾0wPV;ÁZ'5‰”®[pÛ)…ÌDÇ7ŽÊÍƙÙ~îb—è]8”,?±özà’‘}oéVQ~Î/æ¯OÐ)ú)a5Œˆ¨Ê«œN^`¼—n!2­Í$?Ÿ› +2˜×ÍAî$ÅӃшõŸ\ â&H(¢ãÇ0j%kÈÕO²MbžÓF֕ƒÐD<¡“·‰øùŽù%êèº"鉏5âhÕì¤KBp¬«ÜE»jîaXŽ¡„=aÌEŸŽ^‘o¸Î›¶úýhle0±Àb0> Œ§’z4`±49n»ÂaܬÝoÔjÞ6JŒp҇ Ô:v¤QÐØ°¿ÌÇ$Ÿ;¶?¶LOø*y­û®ôRžk’ƒ_­ PcșÉ)ìÈwxÚÊPê\ Â\jí0î6-ªƒÀ+öÒ(¼ÃœcBEºœ%i­všž.ªP÷ä_*ÓùÖILŒh«Óc7«ž»B;5ïƒyÂ1ÄCZܯOå•0`z®‹÷l¢à[tùzë:°ZŒö#}^·…n›&᭟ûz}DÑá;iǬƧCrUþŒÛn(‚¼€”+_–mèy/4©AÞi$î$1¨ÂV¼íҁᘐWÈõ4+Å1htY7U`Ó+-{MIšEz&mÁí¥—uyaÐõz¹®`±íyè2ÁÅÍÁ÷¿PêÃIΰA¹6"Q£Ë·qł‡¦ðžôJŒ0r1#Ä è‡ù˵á ]ÎDæÁŒªŠáꐢ’¿!4’t²äÑývç·.#] +—ÊÀňÿã©/“çˆÃMÉ-:ûÕËNâaÇĶR0 Î\_.l~^RŽñ•y¶/vf¿¡…®ãÚ)ÁÎöíøq2Qg‚«•ì™©-Gú–œ<»L‚ʲKã ØrF‘Aw˜ÙÚ6Ȉ©·ðõŸg´}7ΈùäÑßpâ˄$@ÀÎ1‰JáwbÍ.aM[PŽ¨)¡Ï$£& `Õ°›Meu`BŸEr¸&S¹rô ’K}À‹ ™h&Ï耥]H¤ƒ©\f¨ވÍü¡ÔtRL’ÄY!üž†Ù›êFÿ'£µùÅb_Šø”Q‡XƒN¹ŠRSáÖÁŠ|³£â¬— i€<©ÿs,ç5WðcgL·‡g|ƏÃo‹iPeÇÂç–1"X—ò/˜!Kœôö”\“|>A“˜àS_i“|¨>t´©ï`1%х’Ú×_ ½h=„Œ XÜHîiñ”δ"z¤|N#!;‚¢aƒ§‘IÌ)/ý]F5aFÁ9 +t€E*='UÀ¶[KÚÄáù c‹±’Šþº»jTΓ¶Â Ë0¸÷ºC†bÞ[:=Œ—bÌý)îàsɟ~ºt¯Lô#÷k7° ›Lsd º¹xc[¸9E‹Ð7úfìcVx÷vÑ›ãwÌv! ‰þ¥ù°ŒXcà?±Dº)|‚Ür/‹*ü ÿÀÙOÎМüˆÌ};L€…!(ΗÒØt'L¾‚¬¯øç¹;Ð7¦À4ÙRaO³¾Y~¯£¾½O´öCÃFt¶r.a¨ »JãՍܩð®(ä‰1=¦ åÎ ԞŽwíÕÙè¾r…\@`hÅ)¾•ã—ÐŒ>\á1²¤1¨TO·žCSžÌ~¾3:.¬È5Ž£êD‡0ݙ—cVò#?ö×`VÏ58’Â¢©ù.ð†w³ý|Œè”té=$ãà½Ä{Ø¢“ÿÎA¬aWÛëu$»#—“o¨QèеBÈ"عââ.üêå./7C=êã·©—E§Ñ† é +Ƨ‚¨ » y°ˆ¬GÖô(Œ2_Ô%o‰Êî1 ÂPÏbò'êY &p`úh«˜ÂŸJËq}ï~ÎóÃíê#Ƴ©…tò˯æ±n„­&± Wü娮zՂ¤‹ÿ=ŠÄ„dn³†rÆH‹¥ŽÇ½¦=À¢ý…™†ç}T= +Kñå¢Wr ÈãÀ£…qhŒ;‚l¹/€Î,Å~6àÕå#b³W¼ìÚµKÂ5ÿßÒ.‚c%íüƒ £ ÓæöœnÊâ™H7€JlçÜ9ö&˜·#ÁíRu¸¨lJ_ª + ²pžFò­úI‘“Ì­÷úRî¸H°=èǝNÄ]g)ցš³5o¹ke—ÓWJµ° +#  ÓÎt Æ6»À²NBeNžÙl‘¯tzF&=ó~àˆÁ±[püÆ蟌 Q•™0+ƒñirLå +íS±Ì +Ù>¾—ඈ×2ƒi˄R`ÉÀ\2þzíÊ¥Dük³œÈl—’r|¤e_LEfN‘ â­4ð¬,?=f#V+œ I·÷ûˆÐx $\©VÒ=U,Á›†|õdÂÆï»xooý½+óے—%ÔÂH¼PšJ!X†8òój4ùHÈfÇÝúµ;Ù - ¹ÃvñªÖvB½‚Åá[·ýσ³ë0¦£sÍUÞ +ÄØÛHk? -qØÅÿš*eJr›ª"šåŒ4:q“ÄF¯ÉesÁ_`ÛJù®”Õ’yôLé_¦„WU^œ%<Ҍ`kp9ð\á¤/¤Öò,¡Ŭ^¯3ÏŽSÁ‘_±Ùâó> +3 +!Z¤á!YÆé6ul´(™ÂàæUpq ùƒëÍÂÑ؃š„Ž#õöÞH%Dì…©’‰¿ºN!.9‘“e[@)þnb À‚éó?Ï¢- këí&ÄÆKªk1gu½Æo£Ô,sp€º{ÍNTnÁ[pô ++až4K©c!Tyµ¶\ö°›!!ã`!ÇÉ6Ès¦é@K/Ep¼"‚wÏ\Н®M4+¥òºË1;#ÑøX Ÿ341CXÕé (cȐ,sr<ƒ)…R +­Š”T‡´ Iü±ufº'û·d„ŠâYø~‚ç87æ ŽMšWªÄºépÁ +‡>öŽUAC‹AÙD>CþbzÁãÆ&L øU1Þiq‹GËÑ„Ð;q]T ÓàZ2~"úȁù¹6gŠùӅÇhœ¹a™MÝñhèâ9z”#NIGãu§*x²”ªS'©Þ¯ôìOÀ†Å¯’ĸùÿ|~ʄ‰BF—†3Ž™„jÅ2Þ玠–XڢāþávŸz²ÞúýrŽïê^ +®Ñ8YË2!#QÒ9òÀôC-.*ó fêj•n3%—ç‡ØE€\Í4S§;÷ZÕ­·’<78‘%y'‚m44²¬ /n%ûª\mê$ã”&d³ìØl»ƒ ;XªÃ¼+šÐ1¤°'X@µ!СõíĈâ€2sȨA³Êþi³óøP¦îT +m +ÎÇ̅rr- r`-¡ž[q0êÉ"HhNÁö`E“‰Þcñ8ˆE`½âçþ€Æ-¡Ñ-µÛäEËà4Œ.µ†œdج#¸½êP‚î¥v„l^wÁ™¾ÏÍt CBƒõˆNÞì8x-&8\…ÚŒ7VPy¸Ég»i"m‡ï³Ôßj`ø_¬Ž¤pM¾Ó§ü]WJûÉ:†Ã7HÛéÔô]‚ ®¹B³ÏÆ û›ˆDgèS+ƒÇV=n¯I镈à±fÙ.ŵ֜ü‰‘¬à¦—ìd¦©“x$‡NÌÀwQüã8Q¡ 41ð¢Â³\ԟíV@»G¹9ŽA#¡+ Æ ^ÚØø"9BƒÙÄTâèåڊ3m”^Ž<è†ÔÙ&¬À0‰W–üc¹oç„H%Îã]¿Ÿ7ß7xa¯ÞÉf[;×0:û͆ LÌDÙ²¡[µÏtԕ…YkS*º— +œy°2'‰" Hƒ­îÕƒÅ8ƒ3FXr’Ø̝åg–„ðlj¸ì¿”|]÷ÀM‚êìHA/PØxé­k ââ²ÒV¼‹Gq’'æÁÊ…)Ãd=’ Þ§¬ ÂøFM”.2ð4OW:Ý$yΞ¯.ê^&~Ü>J™y=0 ŠŠ ÆÊP“ö8 i},#ùò +ÓàZ[ ^+Éîô&d“ŽBéjÁëðôã)̨dǹvK|våC“WsóQË:'ûúnÚrç]½ñìà’=íRóæ .Ö±3gª–yõ¬ýȘ²mÒ¶¾®ü¶c­ê2ÙºsãªÃxÛ]‡g­âaSÞÌ&{uS/ž²³ú¤±õ™õ"ž²<ýËV3{-“SFÿÕvqídڍYwíx^»{nM‰ÒzÚÙòfJ›zð¶Íl/·î©Ò«=g˄¶Ya_>÷:µÐî|cðªøV]§Žø»çiÚ³£v“;ր…ŠãAD¥‚$¢â ŠÃ…ÃB„FcAv婆‹åqGM·!͗^2–Ù¼S^¼Ñ5vÈvvµkûåAgôÂCÊtµ[}<áÙNãƒËÄÎà)c¶XPTL˜mÔhH(X& +T +@˜[WÛó‘ È4&§Ô8âg~ö–†™F³ y{-»›ÚR!‚òT›…D§èœ†ç O}¯Oë\uY¦6ßYÍä³™3ïd}]enÔÆUÔ¼ÚqI*P8*ªP*,&P0Á°D2ÁA¡ÀYQTP,h {H(P€€åb‌$ 7@E§è*‹žÆÂxjfvÞdi°0a¦Ñº`ä¾2Vs±å­»«Î>ŸëNuF{IÓCõ­>µ[DDaÙñÇ}ÃÛÑ~ëía²íîÊú.“ˆk4²GĹÜÓ'ò"³ +ME¶Lˆ(“™\“:us€& Ed‚A"a í–Æ [&kKƒëՍj˜eb ½F¤ßÙ^–ñ5~˜ÔзåÉÆAžP§yÃî܏+Q—ÆÏ,“´ÆÏ-¤£®5ÊPXfî”9ÃxŒZ/êë/3føÐ,¶.¨õg <º4V—Ænªù Aµ2KãLÞè)=úCÍÛ ÷¼Ïæé˜û >{[»4Èî–Æ.¤\}N_j}r™ØªÖ)Z4=¥÷ØëSË)å±<–Ç—‡dy<È.—GggÇ-圚«œÍy8[픪¡ë…Aß+íOkê*æÂX:ꏪiý¨šm.ržM¢adZ&”¿›"š3nӍÛçlˆ™rŸ3Œš ݗës¶†jï "­âQ5Ûjø'Ր¡9ª†ú¤nJ5v¶PX‡“ ]óe3[*`¡,@˜50¡,P""q<"ô.Y­Ueo_¨< (Ì»å±L7Wù®:­¹7USό%ï±­’U¦•TWu˜Ú‹x³»åahµš“_K5È<"–ÁãÞ~±0ìo†µk†ÚeÚØÝUUf"\C‹kOÕuW™k¬²kën«Âê2ÇY†ëøîîΎ%JÌLbf¦lÝ:ey–¯SÆ֕kU’g4cwÿþ—ü??{ÿŽíî¥Æÿùßx,bfZš¤ód¦DT;Jøօ†G44C¼ûªéªšežê©žªšf¦¥9yËÌ=ٷԛêOOÏô,Ÿw/=yy–ifÖfù<þÏçÿÿøÿÿüÿÿÿŸ>ÿüñù|>ŸþÏçŸÏŸÙݙÝïý³»³§w·'9ˆœ·gß»;wכɋ‰™™)ÉLíÌÌē™'3õòdf>”WõöX—Q/%º§x¨gôXQæâÞA3Þ=hõíöÌÊð‘ˆh‰«¶‡wÇhîøŒÅçëFó«žäo|㻚©¾»ÆÃÅÌÎÌ\4ŠŒ™‘2""#¢fCܙوǷ"b#6ÖåÁÆF«ÅFăx6âÃoš¾Odè"žñQZl\d¤L»2÷ŸŸ©Ë³××ôͳÛ¾õá[{¤'f®!U\tü÷-÷ÚóhlB˜ËÅ „e|”¦ ÊV&Ôe¤gxøh O1émòýn÷{K¼K7Ûל㕲Œ9¨Ô[†‰™d}Û{]²»ž*åá^-Kђa·„¸d‰ß¾¥CCwº¸„hgG—.ÍÂÈÅÌ£K|faì.±æªq~9mK[ªšgâ$U³0.“Õ|³1ÍÂX¬4X§—ûÐ, D³0ÐÐ ÍÂèÊîë2±¤3df²waô9/ÞeÒçº Ã값՘âñÞ-öN^dJiH•Ži™OC†½0ÒdR›!&K“ ƒíÊ暧æ˜;®Á H„ +$‚£â`‘XL L**ϐÀG„âÈ`G‹L€\xTH.2à‚âÈ qA€† +à{º‹]ÿíîr­Ï ¯¹©§÷ý¥kÊEµïé|–æ÷lGå|ÝáÞû×n/µ-¼®&ãc™Y#šÎçÑø~ïîÖ*ÞÎ,~Ûê­ø½÷Ö¡.啐 ¾?®Ÿ‘PP©D.*@¨x@poJ­,4<8ÀÅQ1¡BYÐ ¡À"Á¡$,ÛJʬ•g»ç€PXTP-¡ BҘ€@$ +–èABAãX à¨\DÔN»úäV,TˆP"È°¬nwÄËÔ]fîîmìîæ² +ÈÈA™•:ͪ趻woÛPõön†.í­WVO;eù^[å»»Å<¾Ì»¡ê¥–uµ§u-iv[ªaUÕfÝÛLnëês[žJ¶¶þõúz~‚¸ž",« +ò®ïڎ½¿¾Tk-K{[¡^÷v*ýµ]Ûu]_P MP8,&P€Ô–4"<€\`xP. ‡…dB(Þªç’Ç…Mx8,*@(Ž‰*#‹ + +´ÆÞåë‡=%±˜D"Xõ_Í7¢¨ˆT0< (ð°DDÐ2!‰$Òàa +H H" &( ’>æÈ äPy@(PP€ " j€H" ÈÁÂÂqŒ¨ +¢¾¨Äôë)C3³h$ +†"‘H0éþ€º–@nB–ÈAÃ(dŒ @`dˆF”¡ÚÁ€ÈÏ8äWƒMŽþ³‡ˆ=ÀŠ0+Žnl7é•K¢ù¼(|é àîf˜bMMæÏ2çRì×?‡Å7½Ñ“}CÃÎfìl· ÈÁ¯ +Âzˆß«_Éo¨--¦Év¦fÀÿÄýFrkëBUüa©ãüâŠæ¿6läˆS`ó{¨9A\ ßç/š¾^AhdƒCž›dc¤úŒ,GRӈHP‘ýÆUÙ¨ÏÉÐÝÆP‰è˜÷È~[M›ðÉ®M蟉^‚IŠ¡´¨èœQtՂ@ö°Çˆ®Yû±Xƒn—6Ð~Hh4ôPèÏeæÍù†ŸrLÐH­*Ùuß jVƒdøöÜÌ(~/¿¦–r}#z1òÀ—¥èÚ́†ÉyĀyúÌOû”ÃÔõ)ôÈ҇ÔȔÛÆvmMFO‹½Ë ÒÄ( ”&½w¢ÀµK•$‰„ú2;<¨A®ÏËf ú‹çèÜÄHœ­PkŠD0æäñ¥ñÚµ¥m§ïœf›}V0M}€MQ¾£ÅKý,ùÑô1n‚W¶Ø+S• +a´ðâ4B³…f,¤ ‰íwΜ f¶~DZ½‰qQZ +ܵ»vÕò±fú‡.¾á˜é¦€¦0hfyYiû¹ÝL×FR&>+¨×sa–zLª[›ã±ê³¦O$¹”ïóÍÌ/9î,qjr6ùÏÜJ ъÐ.×È%Q=$©óçĬšÏ-$ÝW-­4¯8¸Lì-#¯Ç%‘å) 9Àe?ã´]€M=›1?»8XM„.ˆÈƒ«I‹?ø“¾Ò*/í(Û© Ô¥t5Ëe +–_s¶J­f0–zì/*u ^"®§åÌSþû?:¨Q”4ŽêÀžRu@ºÐìCýw4Ù¢Ž`—éIãئ~ÿå¬ÀÞÙ*0JÞÖÏ,nÊ@,ê‡#Áð.NjF>Ú©À÷ù" +Ѷ¼X"ìÜä£ 2¥@—°;ŒŸ¢ª"%RJJŒpñ]­|¦¦ÀÜ Ñl + +6 ÐGÓ7i›ãã4̝£lÀœ²Šû’Í YçчŒûÈ5—s{ia +!;a»±Îâ­Ý³æð­ÿ@‹ê›É_HfÁú¬Ž3ö ÃØñ8„­×ÿ–|„82ځ³÷Cæ”äÚb4ÝÙ´Zr_@$Mì‚E‰KSplW°a÷iäŇ_µáÓÝÕ¡{9iGÔµù®ú;Ê6 Ïý¬ÁÓ͇'ŸÆu Û±óMûQÞæ³CÅ'¦™c*@Š·ÏtÈLÁ|—¼ú~‘ôÑÛëxañ¡iÿcƈhôävx–5]GÅfˆdLž^QÃvJÿxmÔx“xÝàmLŸnMg Φ÷Îފù=B UÁ˜.ž-ÛO‰å”  N;Õ.gäç¾iÞ¬®þ¥xƊ?üöú'–Ƴ[j˜žg*¸`Ɍš’°õ¶‹»ø'[°IñêÜ#™QcôÏkª³.W=¶`»*^eC-¹ÅÑi©ê-°þ遭áoHN7‰~øJI¾l‘o;á *ÐjÝ_Á¦T‡¬Q4ìb•¯œb'uq¨Bx Ñð§8dþâÔ+Œ^¤·nG'¸ýÃÖrU«Ñp"`ÅNJ§F »É$¾y¹‚tì ¦AK†âY( *f'´ôº +Ùák¡h_D'5Ÿ¡F'u{đ.m/ƒæ$_¯7p·!DTCKp‘âäòÜ#/ËàZøÌ.ᲡץôËO”ºoͧœ¬²'‚θ0ùàil›z^ôRngUQ¹ÍbÊÅwÉ߹𻭭y!nn¬užÀ#oåo­f ~¢,Ë2ó-hÉÉ8x©D Äf¤6#ÁÊñg«pû‹É€B¾3lû¤´E¤1ì$€WÃ2¼]YÀÞøp2ÏPƒÞA[Ž—3W%Ù°a…ͬçžÈ:ZvéË._³Y€6†¤%L‰.Éÿ» ˜ëèsÄ +=‰_גּLʂAñ·¾:ãç-SÑ<#̾¤ÉÛ[ÏCòêÐíäNîæb#\|Ž\<ÊgDœ¥·KI„¥Õ¬M&hMŽåµúÌïâ¸H+¸ÓEˆßðGOŠî¦r@sú¬S¸R†G°‘ûàÖsµKXÁ’ù ºCüoóˆnSD®C3fÕTVs’š«é!xpw–þ‰t ç瑻”¢:3kþø̼W/S™oEÐgG,TÕÉÑùu6ÀÂ;’¬˜Ñ Ó(vƒ7Ox¥&üÈ´IÝM±8’¹Ä‚–±àՎÓå#»ߊÝRGB ÉJéBS਴ü{˜%µàcî;ÜצªP'¥Áʯ:'zÓÄC¸fFÑòJ„Z ‰´"Ñx®ãB6PâÅ©yiÑhÿ:†uDS×ù0¢Y¥©Nk^)‰˜ úóq”ªÇ~ÏJß®hfÏü1ˆÄ¦X{£èÉa«€”¡Ä#úʞi·:c³HÈòSb#û;‰ßKyƒß¥¥ÂgXªÛ£-|" ·X}a\b[ä±{і€ëþ¤K΢_Ÿ¢øÿ¶\«zQË%Iæ3:àoôµŒq‰›ôM¤§nVü¨›Èâ‘+`ÿO£€ŒÑ¯´ßa º6Óµ–„ÁvB0÷í¢ì©TWÏҒ-L,æ(uìúE®¯¥©'¶êFzêڒ­^Ÿ©ê¤~`èà~õ íæóz&Œ8|¹Ñ3˜•ëÕOå.UªWÏ÷ʌœÛ-˜@B¿ô8=zWÕé°Â´Z”Tcâ c\xU´Õ…¨2pšz +½«œÐ+㱉©Íç¼V<®´]É*KŒo´k˜ ŒÀ–½·8€ÂGx(Àˆ™è1HfæÐ®3©…S*=xœA3z&QŠžwþÒyèÀJÜcƒqÁÃǗijVjtí=/Kݤs +ZÄB.Ç£\ZY½œÁX_€ÿnµõ`ဗl9ˆ“埆AÙï¹ñŽãŸªá]‚ñèè툑ã`&b°s^Ù¼\&SeNiüþHŒìܙٕÎSàm¤ +ÂR}›žÆ'SB&·šÅ:›à+ÄD¯ËD¯qܜ ԋ³ža}dþÒ¥Í7i’M”p’¥Þ³î¯O­¥ÜøàÖïGZ6z—++çÅi„ÙãÓCùJìbžÅåm,ę†üÖÃæà<=ÂãÚiRcÅ÷ E<~˒œ0‚e˜õÀ;"À0†÷øÄ¶(MT#nn™+é[‰³”Uç +WDèùmpã;¥LûÃ1$°2=N.Ç!9r)”©Ù3qnG:ÍÝ›s“A]Ç/•üø›ÙxE¢¡çç[a´S5_ʖ±êèM¦£#68pzXl&b'“Áá¥yD©€,ú%ÑD#°í +ŒÙRòªÍᒻÐd6¾®¬ §Ïòʎ ]î˜ì£„ÆðY†ÚÂÍ'c/Ãè‚/7v»Mé‹ 5xmÚfˆ1*,Upþbª Š¶²ÉKõ.ƒlk%Ð3\HcøÍy7@‰]ÐÞ ¥é—ÿ³#+×SK7îÍà‚Tuf=B†î%/œœ} ág²`—‚é§î[`Ô +õ§|±5U§f†h «3¯ûŽš‘ö¯Î0μÀ›†Ý0ó-M†ñÝ.ˆ·•1KL¢mf@êp÷ž§™ñoèk9þåD4L¹ÐQ(=9˜^+uÒ(2Åî™ðîÐX·?2.¬Ôhrl2ÓÐ%"NÕ7†¬°áÍñnÇê9 *ZÉ]_|Ìdõuëíw掱æ „ðÎÜ\>°Àλó†õÊbnHY|e"ýÍ H‚Äú¥?|o îëlC›u£îO"Å ‘@û«ovC)›?ùbSgLY,SÔGKà èßDò¢À]4B ø´A øb4Lì:7Ühá4,Hîf¾9çÑÎÄãZW‰>Vðìè ¢³P›,r=ÑÒÈóDb$yh›ȁ¡§ùëνëìèÃ@b@ +Ö‹ òH‡Æzß匮bë+ê¤1¼TjØás‡(¿o\{ñYlµ^Í ;ê/Š¸Ó8Æò¯Ìê{ëæ°LÓá9ªî2hBs𠶔ˆaC¿0ÞÛâEÓóüŽá ÿSX~‹~¶Ü±öáÇ9]EZ‚—E oàè}¦|ۈë¢Ø7}_ˆ×Qt» ãF̉sÛ—LÕ݆c¸•Èy¾½c¹ä£ßÌ&è]pòÝ¥2¥g¿áR®äe“ÁåV <ü›†oÈ÷ïü[9¸93ŠÖZ >焹9þ#CsIôØÄÈq‰ê¬¶]Ö/'>,IÍ-§ÒÆUïL§æVEýáòbL@œÊnt|M+¿4ÌLqCŠäÔ‚æ‚Ê}£È¯½Ð}Ë]ê>\sPOü ÍwÂ";.Ô3¶eksͣۖ~œ5Ý=…)Æ>_y j»„ ã9Üқ린‹„,' ÝÔïØ h²mì]Ü÷(΍(ByiÄh=Pã1´ûT „D„FHœäîÏkɱà|¹”Гù^/ ¨K¸æ°¡hÕ > Šqti•Ü> @1{ÃÐÐPZªjÔm’Öþ´B«qÕ>&ö·¬ß‹®hÙF ¥ù#§Æ àôêàƒ8(tN™“õټܒ¹Þ*ñï»la¼aoز"ŽhoZx4%_ñƒ¨Óéùþ+çÛ6~S ?´W^Å´eáéû.°°çPÅÝ3–p]èŽé·LFÌyíD̆}á]ØÿŠ@j%ôh +âWH.ý7=[Ÿ€qnó¢d_ |ÌΨÆXꓶRÌç1”êÓbÈUA’ý¼õMMD>Ys\wÄÀP¦Nï_g†B¿âSæÖ_ûgõ&/áÑ2BîaL¢OÔý  ï‰jÕxŠ›û„>tÔH2Š:p +ð¯ô`ù7‚?9ú~_SË|êpíᖦ´…2ìî e.«/ê¢FK±†ŽAïƲt}™¸T{ô²†º~œª •Õˆ ‹ÿÔÞCº`O¥i Š6m„uŠ M²7Bê¹ðJe,6–PÕlaž¬66+>Â@Áøb—tN°výø£Óvœ)ó k¿T·G‚˜Š·¯ +!µfá©súNΨÐÈd`ì‘ÿê2µøE=¹™Ø”쎝 š"?¿½OâzáÑMlò=ÈûÒStiiք½%Å5š¹¢3MôbøÍpCä`,ÞøKî„ÎÏÜLžÌ·²{ÝVŒ|¥ìÑÍdk ÈL)`'¿eŒL -‹pY"Ãr‰/üÏ:òïÔûj Q[ëùš!Ud¹¦nö‚Ì–»ò. K6×S’íðl÷ ^Ǎƒ /xšßc ]8.ïÍ/-ÑÕ .î#Ôó +%¿³ ϱP£ÊC¦ +œù¿0Ôäh­xÓû‡ªRŠ}”O݅$ŒcÐoŽv2ÀZ½´¹—Õéôc§Z$îւÔǸxZÉ]œø}'ê®2²ËkEl& y»„°áN¢àªã‘Áô¹¢FꕗB…}^«ðeS–†hZÀ(LW¯ò±ŒÂŽu ¦ð¤gn¶â\¬F@­ZtÍà÷Ý@WÎêå»t䦓«Ó¯ÈpÇó”}“ó•Bb…«~B¸È€zsÍ, ÷ÍâÍ&è[#šn{þ“qÑ¿1M[bëm ñ[Ý¡ºÜ‹OÝÇÈNXæcà%<Ô(aNKfDòðHÑ{—x65\™\ðt´VªÕ×m&tóñ0ÉïzîO$©’DØk©ÃS¿%žñ4ìlC+¸¦ÜÚýטC͟)€ u—Þã«—)ÿá°?&r)qìãKxuf[æ7—îkó7FOLQt¤à—h’›ïÚÄ?kX•†"}q¥AMî L¬Ã•ZÊ>•²2ú2~\—yÕåÒjáHsÌa]8‹Pܝñ•,"þûi«¢°^ÝE¬‹·—¼\]A?.!߅ "ú¡8æoX¸ÛèˆÞã?H‚.¯pjÁ“kdwKKÆÊ]AÂøÜ:œ‰Ty¢/–lMðƒíÚë7ìü ·¡ªÍþ>Å +ìá£I.1/}p^ÍM{R bÎ'¥ôã!ÊÃt 9@Ø%¬C)4¶¸p{Qg¶¬f?)Y®ŽÖ 1+* ÑC#¨%ÆÅWoy×CµÚÑMw%Æ*BKÕRü„@ˆ3)|±cÝ«nGꅡߦyƒ¿K\vz `æ”=;$|;¡ò¹5¢þˆB‚aÙ/ˆ·Â¸uløRÆ7qûòӋìø|Áž¾Q$=À²· [ÌÀbÒāš¦=≂dTË~˜0Œn]>rCրܪqXÈóY4Ӝ¢>†y}„ErÖ |øLz_~[ßöuÏó«Ó*˜Ïƹü”¢}¨­ÈÒ ‘œña“=fº(|nöò++ïœ>¹!jØ?¦º¶¢à AŠ(á ÌòpˆXªl +)ѭŧ8·¨áš÷­D>7VïáxÉݱAW+LébwÙ4t#ÙÙ"•»X&l/ý™3û2eO7ç¡á˜4¦¿ %#D/Œ=ò +òjÊ\&HyÚJWí}EϚ>+¡æõÖ¾¦³_´Æׁ "f²]]x]ºM;X3·*‡W|³zQlþ—ÿrº°®DiÑT¨Ë ý+‚ª,“1ï¤a˝•7¤ƒnÓÁ„…s¡#Hu +«jA2\Ý“ôÄîá +î­ µô)Ļ쬬k¿•MÆ\§Ò¿ê„ÕO’P7öˆW!œ»‹'è<ÆÆs(ï^@WôK%0‚ããKl¿Ê] •þ Ì¿ÛtK>1¡yM>…U’ÒΘMä+¶8…¤9Ú&÷àŒl.q‹g1~ÜÀÍjÇ®:„rêð­˜x(Ÿr V\młÁ˯Ý Š2/?j¡h¬Ôê¢þ’ +Œ¸hp”íXc¥¬ùä:X¤?îð’'÷H¯™q$0p¹ÈƒØÌöÐ g"Bea»MQí+Wò[w´,ø3oß#=ýâýëÁ`ÏeRõÑêF½| ‰±Ó¦G"×_¾±Ea8ÀgÐÆßi’(!–ŒÛxÇa;>ݝÍ!gɋ™´Bà‚þ‡·B¸mS]ÈpáÇã¬Z•[–š¯Çrµå–Žì6žJK#%”‰Äœ¨Áœ”„µ¤È,R“«+¹ÃC#å‰Ì.U|§*HÁeЩýbl{©¤[-6ÆmR—P•]|¢ O–¯#Õ^çð·G œN5C­4#éÈb:4çôVõ²ŽH&\ˆ—Ãáæ‰e ©ûT*K.FˆOG[—·ƒºC] Ü2„֏7gÀýâCS°GèØ3f+]ø„#Tó,Âj7±‡|²j¨ s™.Kù®W Ë/V”lÆdºÏ9…C¬ãҗÆÕŠÀa#F(ùçchà|rÖÆàL#nÿ _¾Û‰ªúÅ Þ¼›¦êÌç<Ñá< )0g‰ã*œ3 0R,ý¼÷–[²òþ½›3ñ]Ð0ä*·:††ŠŠà®‡f—ª¢4•oШ†ú?ÞêêfÉ-ûõjPì4\{r¹áˆþ­©ØEÝIC´¡ïÁÅy[Æv6Dª·Ó£ +T»†Ò~ ў•.kŽ„§kFrß2¿7–<t(=³„iC°H¸(+Ûbÿ¹²PÂA7řX0•‹S¤£t¡±C –'ã a–Ø<0—°õu;‰U^â4ïƒWޟµªI v„[Å•ÜŠ_† ¯Mã“<©°ï 1ð|+K7ëóV2¿“œ0VW©m6f¬Š3z–s0È>q.®ÃFðüRƒÈÞÓ$1df'bšöó}¶Ä•Ê2û EƄJ؄iHžDž| …G… éeÃF¹èiÈò§‰?Íõƒë·Aåïƒ+)M®-®ü;—, áÃZu/ŒÃ(Ñ#ò'¶3‹L1 OÉ·¸'=¹¹™"m­4I¹¼9(l%ö®-»ÊÜM[ÂèE‡¬/݌F$؞¹×÷èЊÁø_~:ÐiP–—7n2‰»BÖ…jO¹í%O Šk"…r¾8ŒÓ(·/?²!ÃÚ]­u.W“\ø¼:³ŠÛ$³€.ì9IÐrŽèM4þ@yÍí»™R¼µiS»Û¸ÎHéÅùØðzUo"'ÂhMe苫Åjw^ï®!*,óåõ.#dùõpU «Þ×i& x<ê¥þoõ kR´ä¿Óâ¥;8ô`dxâzV;4•$ U$¢¥)5ˆÀãöì4UUÛee¸|p쭍%{+J"Æcé×RFŠ ±øt…*íÝ×æ–òm&Ô3\ ã.i@” èXÇÂ_²b²7úýÌ>ÌT¹¦µ¿U º„l{Ô!›zT–ÊìFØ™ÁžàôÛ݃fLõWf “oˆ«ñ€ð£èΧ8¶Œò!û‹®Æ–ÚQG^µ–à Áˆl°€?ÖHv¸pV˲à#lƒ!öæ.Ÿ,ãÁBe‚—-²i»Côù-q* ³ŒöØAÂóÅ +‰­—ƒûýé{N¾i“t¥Ljw鼟h4Aî±ç1g"Yjä?ژ´4‰’ŵ¾÷-ö`mþjHZ¢‡lS̯ÒÉôÑ%tj±5*•{’é‡.×4b…ýô‘·%JDåCÏýmB“ÏêOÆÖmð[ãÌóJqC·ž4ÓèJKWZ.SŒVºôÁRš>"ئÏóL1ã¾58 t EICÀ +x)Øo´dã+ºöF: +˜*¯n* ۬¾Y Ò©ª)†8Ohû\ j‰z•=Ÿ¤ðOÀ2X†0À‚4ÒLƒ43² Œ±Åád¥¹ª „³Ç§o?ñ§ZjðúC}f㫤š¥ÄŽ=Þò·Òkî"!EÎVƒ ”7™BlÑ M¬hbjÿ»•™²…lP•=~S•'®CýþžEåº`&±Ú\ÞR1G!¥sÚÑZ6r˜’d]€ÀHÑ¡y7—HpZ¯Û֓ì¥äIQÁܪ>҈‡Z°šÏ¯ÐB'½@öŸG‹ÀÍdAp¡)!Å`-zOþºÝ6à®ë8, ‡ +½ÐÖbÇéÕ'EkG” +9ËéJ‡B[mn3õk/qÔAƒ¾rvøRƒç2]/¯3ƺ +¥gí³‰Ö0“UÀx;ã©Õ¯£BORmƒÑ!Ýkƒ]pC«³.°ìvW®¬kíq7EwO­Zæñ$ð™ +² ”š¹=WY\î,ÝRF2«°^±ª]˜M’ÙÜ ^°ÞJR\`hȺ“+0“È'ÛvA€­fˆ4ŸýjCÑÍ_Á晘%Ñ,rˆxí ò´®@`pÝFL Ú°t-îWçœôçÁÍ;ï²uÍüzZ|5šI7H†ÕÁõÂK¦tÓ3¬9@À©G.Í/ԙÜúfzÀ'4ÓÅß[OFTý$l¸h^¨°¬ŒôR9Oʾ]L#È"Ȳ"'+ßù¤Ÿ¹/&Av5Mç1ïn×|ãwŒ¶†XQÓ'&ÐG-Él7Ä\ æH'úš1ß{%'®Ï7€03‚ím#Ü@½¯™HçÔ1EOa";v^œŸ%ÐÿFì/€ _Û¨L°ñܸè¶ÓbãÏ`¬«?:@à8 +åC•ü@r|cþd +)ÕÌÐöˆP—ŸšR›Dú²ëiµ‰¹ 4´h²ý ŠM¡‰"3ȼÍî¼³"eŒ4–µ¬×5ä8'¬m7΂¿äÑÕqãRH’¦¢-9·kØÿÌê{„ÛpˆPGàúi§‰ÌB3tF•œ û4[â6Ú†ã£UØËT!,6-*É/„> ôPìbŁçg/fiá e+ï ² Ñ]" ãbÆ=Ô?-ë­¸?„3ßp¹‘9Æ&¶Ó/ ÙbçjK‡/.êmüX7·SÛë&b–ìP–0BTYÜGpW) Uk,#êõ*Aÿ +f¤ºWQ÷r´\Î*ø–r2à>°¬ƒÈ7œæ6aErm*™©OÑélêÞ͉ñIökL!1hIí` ц^³£#ù·tÚó,²W„m ï:aŸÀ‚ Ê[Ò_ᐞ&HNh› Ô1¬€  ƒ^­jÛí7Ë4púqcŽZcˆZÓÎ뒝á­+ÑfIa‡«WÛ@B\ŠÇq»ÀÒ̀(ø(ºÎY& è¶ñ•QÛiõnm&öê°©eV¸žwã`ÊŒ ØÏ?4Æ!.y‹ NóƗ§íLT.¨‹X’NZJîº"kÈÞ·>·ºy\»Ï–t0dÊ2K¤\‰ºšŠ;F…3æՊŠ›xYIPw"°‰Áß|"»ó$ĚG§%¤êŒ~,ñĜSž15MÍdÀ!mĹÛñ^rýcŸÀ}VËnŒ‹ò¤"KZBã•[åò =XÐ2£”YÍ{ZÐÝ|V$üP.K˜®½çáRbëY[dgÁ'#µ%C sbGÕçÂ×Õ¿~ kTɗ)÷¬ÐŠ²Øöa¯Àmpn°>¹×ÈëÞŌåM‘›âi·Ü*ÐÎÚ*’¥þ¯„‰®<ñá›äÑ<É\ÉÓM#ãbvúUŠÏz[pâ6BAÞHJ +\}¶¯†RvÄät0ÒPæ€Z³ŽÂèÕ³›¼Œ_E ¨x«uÕZ´W*Ìð»p[u5Æ<µ²»’²äùª•ÞbL¶ )7©Š ÂÆï¦{r^)áHŽ´~g\„kÛÎ˓^Ǚ>£¸ÎBW•µøbU¹k†™ æ:1ੋÔéÏý_h§ƒ¦[ÿA[`ŒR£:oT8‘®ö†k[jޞĹÖÄLjÇá3eﲇ=%dn¢Â ¦Ú½êhÄlLþi±`Y«w—8­ÏÍくÁš³â^»âX@Ԍ†+…ýl13ÊáºiÆ)I¦w „›» º›§×ëBï»í 5ǔ¹—ßgf¡q'÷Å<ʽÚØcåXé‘Ec¨šÃÊ]ú>Œ¿ÿäÇʅuö„%DñjÔ¢¯<Òq1>reUåUWðیÑigO¥¨ ,ö +ÖOß>‘]=—]fƒkúGÍ(ÎL”mÂ,w†‘PsÌ]¬±«òï'–,5%„#ó{°05!f:õ‡:ˆs>˜šILrþÏ΄žÓ²{à‰7¿ƒ¹W|þ[¯ÑJ§g¿(¡$߀Zd¸ñNm¿<ˆkœ¦Õ2ào˜-€®Äs8N{Hˆ ¸6kœsŒ­¼Ò[¥¡Õ°¾Dx„  PË$ãÔ +à_ZBíàYí§µ‘¤°cÄVÌPjýH„!¦«HXN[g֟ í•ÜriVx8ã²E0 ô‚bÙwG²€È¡mÂEoK)êŽãòzrÃíÐHÀÀ‚†ì¦ŽŠ>ïñ9Ã_$Ÿ fá£jK}³^T mGB4Ž±Šh˜»¿S!qg#Xÿ €Ð‚ÛjÁÓíÇ»iVXɸœ“śjî‚Q«ÌOÛ6V ü<Ä¢¡Åæ è +Ã@o¸èW!¹d½8—÷2 Q‰Áuí]ó­³ó#Zß È ·£1|QÃ(4oíÁ®wÌu +5xaUúä¦ýRµ5ƒêš.´—9RäŠä»Î"/Uæ£bÒÆ%@nˆÇ=¶CnnïÃ0_3n…Í¿š¸—k›>M=æ믬{l~­“–˜à£Šl6®aGuüú½NÍ<€wÎsO`Æ'ÝÜn€ïôýM2+-•’ìk®²Š¹8®Bã%VꧬνôÐ-‘øþÔ·ÃÁÅK¤NɧÊÐrL«ìO ç°ûBÛþò¬$ç#=¯6êM^•[£V–òq¹;&Â2û€P”&NoÖàtþµbôVº&†eùÄçƒê%`¶ôÃdý’%[ÿ|a˜=Ën,¬2Ǜ¼SKdî"ó\:X‰ö·«£4cQlDÓ²9 +DÁœa,û þã{Õ´, °œÂ:Ýä5·ÈzmqK·µ +« @KÍ3²×Åé°ÌW׶3Ê«6jHÁ×æ&²?ÅSL¸¯¼¾?ܵ|êՄÁˆ#ój~½~;o– ×O/\%jL)ÁN.AþøV–ÌÍ à_Ç®+ žÆӘ]Û­ŸM:žã™Ñ9H­˜R^ ,ZŽ,7A™&Zô=¶ï˜–†…aT`£b»8›ïzØ'Ë#«5òÄ15- ¸ü‹"yšyP`D!Ñ8[*9¾@ý!<\eú”Œ'8¨ehŒáÐÈÐ>ø™,pJ¼³¦P +ä—õT˜õf¨púª{u¤óãõ[ºÖQiƒ`ôޓJ%Œz5†!ÆM§ê¸°¬h—œ -#‘ЂÖ}¥sZ¸ÇU½ ®Æ“/ÉÂgÆù•vb´ö8±Å/¢IŒ"jÒB×Kç 6›N:Lcj}~†\À2€E¿ÐÁÒP€,E¡Èõ£‚B­=Úm¢:Òå™h-ñÐÀ8Þ3Î|f¤Þ™vå¹z0o…ËÏ ëB#ºý‰´Sü֙žÄmHÕ4‚°Á²ÿÝ´fd±†!Œ¨X@¢ –þŽd$B œ@ú‰ ñ6dØjäp'±Rjَ3!-çm›ƒÝ~øð£åF@uÁcՙؕžˆN±“Õê’ÍøþÇù2-Yúóې+ÞÁ°ž<î|C‹ámªljÒT]þŽ*²ÇÑH©UwKTpH°ä—åT98ŒøUވª¢‚у¢èi£qºÖQ0è°êd2™#8´ˆ?´HÑ$à0 €*hÒ¨æ ˜ç“×3¸’-ª¤Ë~ÀgìÔH,—Pk¤0^åý,Ί]N¦HLµT‘)K•XC[A<å™,Ùà=¦ŽŠˆ`°æݔ"Tü†Q+öŸÜ9r¿OxäÚÚÀЮw~y˜‹£PžÌ!^®ž£È~¬|ÊãKå"0ú“Øv‘!’O·QÄÿÏû0ê˜ +˜d‘oî«üc-oHº#yÅ!J}¶| «À~HM˛µ$Þ ¾Rgà··öJˆ‘ÄK-`b•W¼ڂ`‘gЀÍn[oo;%€ãÁ¤ÛŸHnd"JJgƒ +v¬]¨´$;nÛ|q¥K +ÌáÈ#\§Ý$@ 3ü™‚Ì1F…-åNÛiGøŠ5‹*îyéðËi³‚kú•Å‹*–è!d­·t_QÚÈÈ60ߏßð¥d’ÔFïâ Б¯{.o¨"L„’ÞôNƒR¤RìMÎҕÁþGj\:$lF3dÓÃdÖ¬Gϙ7U¬ÀEñÿ ­û¾¤ 4þ5²V­?¯Æiié—<¯;xù •iäv+Íxr·,`Ô\¤ÜÏeá4݂²ØºbZ?®ªŠ3a"H*dêuˆ _9ñqÔ¸c–M˜ó)ãЧ+9Ñ·æ~FÛ4U.ԑ/^Åb²(k0ˆçí3BPÈRa’mïFz`Ý-ÊæåK± ½Z1ˆ¬È2SúQ÷Êé!@ªò€k¸æšj: Ô³jGø +P÷àõJhäð©cÕz¨–Q õKl.ím+jD§‘9vØÛ¨!©Ê£ÞsŠ’5•£r;}Èߌ…D÷òK·žž:«-A=üW–à ;ûé6lï§ówë®âè®Ø›ðOoã[g“Õ¼q‡‡-šÒ8Ô· +û•Ÿî b§2¢‹áð¢­<+¶ŠÇ «o¨_/RþM¶Ù¿Øªå¬Hð¯n@=¡F Ê,š7z/k9ê &èv=³ÐËA®ù_5yR5qW‡{:¬‹­”~šE s̀%^ÔŸÓøúºÞ¬:g,ò«‰"ŒÌô¨×ïeiÅH¼rtNÔ×@ÖªrÒ­X2­y·°‰VÌb34¦ùM;; kÔ­È çi»¯B­++TÅ$Ì_mAâî>î´¦& >û…¶ ƔT&—O£· Ð(ê‘àÒF¬ÓôXïZoîišÄ»èNµ¢¡:Zï0ßE+Æ짮OÝ󃈭.ÄÚzY +É.À~¤Àlº°g,lD—Ó²0ïšñ` +dfM´-âà R@¼Ÿž)&uÔ²A©òõíâcñB± 7´§“OÐߍX|Rêa6¢Ô~\_`°!îU"p[‰ÆvyðÃÓìÀ]þ!`;'¦Ï­]gAôqp˜ §ÿ ø€áÞK”–’¶®^ÃGH}y‹Ì*I–àÒ95Ð>ìózý¥‹¢hM2(Õ%ô¾7‹³%%ŒÓ…™"W!Ï°xdÀŸ@bßm+!›\¨:‰’T3Û¦©tä˜ÃzF‰F¼eMƒãZ +ùÈM½Ø#¿g?s:ìdÜHg9’yܓªÞÞ· à ê½„§:f÷ùµç|ËlAª……æ2´^ +ù~@QóÝ2‹ù^[À|Kûf¾ƒÒ‚Y°á²÷ö•šÛ¬Ð\À†Ö~ï–NÝÞÇô(߯H)ßUó•ï•Ê·Ð…ôŒ…SV¾1Ä+ßï*\ƒ7)/aÜ#mùÖ¶¬|gnµ1âDaSq¿wO3ï »I¦ía¾ÑUT +a¼’ÂèÌþf¿üE0¡°àŒß5:f ÒoåÎ÷ D¨øÁÞù®™úÞ¬} mÖrÀ²Ñ7Ž”;è»Ú»2¥@Š+.eðVµè²|£Š`[¾Kà ÈñQ4‚N֚ÊG1#@ Ç êˆ3x/)ÙVV£ùhšï5–¸zg³SŠ3|LfÓO¾%M@ ~&z零²ÐW2…~ fMéâê]NccÈÚ[Å .aÐwu.–eé1MÍlIеmo½þLj¡pÕÌÕÔ×V9”;DLùvI1y籟=eàiö¹fˆ*2'àÿñ]øNY3Ëí·ªn@‚çjÍ®m|Ùåj*×ß&€ìe:öt%ߕ—Q +>ßîýÚbnz/ӝÈe)Õ½àÃ.ePf‡øëqÌ4(ÿu‚OgÓ¬#Å,7%´-LänË^ä'¥H_ÂÅL[%”ÿÔA*tÍ)g^í{hYìµCΘº±Æ‡Q|ÎVFf™ÎrÞà +^¡’8sÇšõãTh‘P%R̾j´‹G +„tö™‡ö”MÍÄ͸jðH‰•\qIà©ð#—åèž{$ŒèÃÉÆgò°€ZµÏ–a°¿}¯Kà¢C‚ÚØMzV2‚Xz „®w°ä|d!* ›®EãGš´åRÞ½á£Ì®H…Þ¼ð¹^ù+}LƲ1÷áD0-A¾öIƒ8s÷˜Á>–ŤËcš&}ËÍTޏ¨‹ikë½Ø·ÛX£'ÞoÊÞe&âP0æ:Š+`€Èóg‘M\à ‰FF¢6BžäÂh‘ÉðEÌ ô}q$z›ØÉÓÂM°smd­u COg¬‰ØÔ]±·<ÄGl‰M‚ ¿“¦œÇ7v„-f«ªšz©ÉqŒO½ƒ«šQՕ1–´cÀ9†DY~˜1µ;«wŒ·FÐóµXAë -³$ÉE§…¦k ڔ…T8Ö.—TýyûÀ%›”»Ìk•ASVÃó7ܐ ?X¾VS ~2¾¤Jä8Æ8ì 9"›:z9[ìw±û0Ye)×7—K™‘Èy¥á‘uî'kqkobw³òe‹f+WY˜2îÙ*»e§&‹°JøS/Ç3x2 endstream endobj 135 0 obj <>stream + uþ £$vËäå}âíçX@+˜‹6˜N³a…qöÆKòký>¿:òâԅö%*¥›f‘gÊKÓ8™V«^'ä=¡²¬U—=gQRÇÙY? ÔÞro Nÿ[YE]ÁŸ9ŠÄÀ4­o5§w~bË'0•E¥Æ˜]nåôà•OÇUíɁøLšöIþ‘Ñ%µ;4UÅmˆ`)n)èúê¸EM:NtèFÇÉêåiûS¹,óÆ9w P{sƒ‹{Õb¤Ã ¡ÎXk†ÄÞn9Æ_<EƉy®è“ä׍vW4Û3NŒpŸNŠ‚¼q’åA—Ð,OpS˜¨þ`f÷ö&%brþV¯”dèý‰)#Ý\ ó­>á¡á‰[X +‘ÓŠí]‰ZHˆT†lXÓ&|Ê?Mû>tùLy‰l_«wkq¼Y~hÔ9:uES}OXwÉ¢ªn(ÿ²<ދЈ³%rY<#°P°Aa0·õ Ùã>€öŠ’`Å¯k­]¥Œ·S¥àÇ;w¨#9ÐÒ ==ÞSÐT0͉xª>3ÏfÊçp7X"Œg¼³i•ËÇ.¶ˆJv ÁƒªÛQZV¢xñû–õ/ùG…—Ao +磊O®; +Ñ1óyoô¸âè< Œ%"›6.ô«o„ëeڌ¨áù¼ÿªJ˜v ®FüqîëPo ²¥£–²ÅÓ@‘õ\#ÈX+ ^¢íÜ>XÙn!„mÀ n?ã`–ÌŒô—U/â‡\`Q—4†TÕ5œûñ!{ë±À@±~H°‡Ö÷r\A.̯ `°H¿À²0£L%8äÐÜ"wJt:sW¨n%(¼˜èjoÞb·‚ Ò!E]; @K)b¿H˜ª6çHŽ–í)°¼%TU3æÔM +DŠÍ‘‹µ ;SÏlmÊ;…rRo ïèíl§ nqӝc#Nhðï¼Øæ藍2†"Nü*ø̧ŽÀï¼I8€3_ÊæðfMÿ޹ߗTâç¼ì<—h՝GF¸M±|YÞ¸³®Rõp+§·.ӂ;áÇóN.ó\΄ðÔ#æ&ûí~î ºÅÑ/#&f&¬Ã$ÆÜySꁋt÷ԝ*V¸úD9՝æp5Éîü!b îIúbð'êtçBÚWˆ±šR»3©Ü+d©‡ÞRŠx RW˜zƒåò<Ø;1´…T'¹üÐB:ŸQ·ŒEÓRM—Òc +,AâBbWÓæMQš­V:Ë¢‹ ,â/®nPnšˆNœ8âÜ£S}+aMº‹NUO¥t"’bdé´)ZLm‚®W¾»Ýíã‡/ƒ÷+ª¸ÅMµ¹ºÞ]¹½¯û SDæ``þïåš•‰p> gqÝcúÁ{7ˆb#Ąڇ/RþJyòP¥Ú'áÍË3SæÁýC×çk½Ò´H|ò¹’Ý9¬wÆ쩽é­j§UK*¿]æžÁ“Z j-B[<ズ©l¤dLÏnpéFæãH=úË֖ÖjÊÇð°x£dñ€ëM2.­ÌµXzcòõ‰`g‰Jùª]M™| L_lî pªv] UǑ¸Cš=+™ځ6!³i\“JŒÔ‹w¶ße´V£;õ‹CœJØ»{v–l!9ƶ;%fí_b, ¬Á~gǤÕQdž e%¯*{k]X÷Îú6)ºÃÿ¯ãPò\½.¹ èõ`è`±H¶…•L™„g·¬üd¾A £|g5¿äc™\Kœš Μg¦ÐsyC¿_Ps/\“ƒ4²Š’à(…;!ƒ Ò ´²¥tý!¿¬Ê´ àMmbýãۀ9G›hvòË?§I‚›Ájø 7ÿÆi,˜^­ÂùqqµœDÆ̉ ¸b«©¾(ôpaòê. ‹aϦgéy;u9 +€ÌiŒèTÇ ‡óšZ®OÎã%ûÍg:H+§7;MʈŽ…ö¯‰AD^G¶'ÙªãL”ê6¤ÏÙD_Ä?\&ê:£«ymÏC•·(8'zlbH𿏨pɵÆ˸MŽöyP-ՋO,•é´] x)z‡PèÏþ ÔBòá%‹rlL/WˆŒ–@‡6 µJ7*-I«¨ìš¥ý]"9\`yìâ@.Pn?ÄM gN AŠh°ŒÁ"wÝp °JæT[-+¸J£yo¿£¨R¿NHž7'ePUÂZA-¼fdÇ] +ªríÓs&§×õ̒g±Ô› +ÂZ`¾EÁ1*ÎMô½%Sé³ÀZœ0â+az»w–›-U”ÓþÃ%|¶§ÉŽß]]`䠐…ºúîNþ4ûÐ È:—Ö>fôv5}e­øôÊ%êfÝ£y¢¨Wé<=}fáêOª”Gq3bÓ¤À­ë·¶w<|é›ÃǨ§ªÈjÕºPDåQL* O ¦&ÓXÄ­pŸƒ=$‚>ÛQëy‚i ŽjÙoÇ*²Åë;mDXÉ6®C’}¥a§Ùë¨O‘Ën¦¨PÕ ^bŒ6¨”µ;ŽáBÜd÷ *`¼/ìW½R +Mýïú˜õFÓ +±„êlÀ2'J×ábùiD¡DXÃ"J#ò¹Ö®´ûRÓ^œ׬­^´)ÖPËm !—°Ù}bYœ·Å gì@ŽêtàÅüá|;G¬”‚ÖŒªøÜ2À)—6/¼Äiˆü(?Š†¥t1>iœ + + ]As’…§x(×bë:å·ŒÜZúf'5ӆ–¡8ÛNËA¸ ˆp6HEÐØB*i;ÊrŽµòª¦§h¯>gˆš ÆUíæšdƒN/=í\b§;ãé/ —!`Cë/vø\çGç#£m§ëô²,ˆpñÅ¥¦0*Æí\\bg¬2ðYê«؍>~I{S“›Þ¨µ\îÎåbèBz&4î¬òZqB‘(”…žt’¨8•å*¯ÇÇ“4ä#ÜÌUŸŠÒ‚N¡prÿvö‹ãÖv0®C¿Ç³Õ/ãPã~+ú{ÖbØb£ìV íMÅJóÌ Æ=Ew”=·X›õyb¯L´Û6Ô$Cóàiɞ¥×œ˙!úõlf`žÜêÞ¸ü*‚}B°çJÖI™ ¡-*GÎÆ.Úgu+iG$ø”‚ËÏ}ovfoÈtÉBUðÿ:2³½ +[vVÐåߖu§)˜À•Íâ\¯„¼ªØtý “˜}AC+Œo11•‘§)ä÷«J’¨‡"…q$|Zʶ鳶zFº´bK逅âJюÊå•úCÁ2dºÑf#ÞS«q7môÊË*⺿§ @(]¦‚hƒÀC&´f*6{ÒæO±»W[R™Gîã3­Þ'ZE¦ªüå"•èäâNQ¨´Îb°HjQ\›Ð:҅9Ç oUÓG¦™bSô2]?¬víø%~ï8‹æ ½¼ë4|Ê­S-I(õK¬ gá::HQ‡‘…guWìh%¦h+9Â@—O“V¸å{3—òamv…Üù%‘º¼Óªc‘`,ƒéb~—µU'.öKç›qAž^ £®÷[Ñal ”D\üÆ×G~Š>—^>T/ð¥-ˆ­°¬ÛxlЊ­ ÆõÄ –*¡§,®ýÈ+Œ&lç Ä0×P<@K—»°S zO4+ÂÖi€&‰> +d“FëèŒZÊH$œfj´Ç§öÚ]ï¶4(±'Q]Ѓ¾€$Ï^Ô=úÐ"~heˆXä›Ô@=´?Xb³7Ÿ$é£ -â‡V@l†åu“èчâ+V4äC¨’þÆ…H»¸ñPÇ«½k´Ð ž$¼"*²òþ݈íU '¯’øwÜwn¾IÄIµ®/C +b­¹(þüi›S¯šŸ!)µÄÞ˹´ê“ìÿ^ VùsCç«_ëÃû‚dI,Ê*˜Wài}Èû„¢ÃW1.K=6@ß&¡à>¥˜>`ûó…}óGQ$D=SÞFa¦´1Êñ@˜>¹è’ÄG}h§÷´ôh·XL}ù@–Çí +­!;QW3ÏF½é:ó Z>ýÃ{éò˜ÇÊôOßÿ´àkúö#;Oè·òìòŽx5NƒÐýçx)׈i¨öû¼Ì+Ð +y_sÌ(t¿‹ ®àýA¸Òq_VQƒÏ +ª©•#1[ÇYîs™ ¦ +¦¼=“ÿÕ_>¨}–ŸÒ%„ÄãL1wÖ¦M2ZEC¸’K?TÑFˆÐѯZMö¥¬G½6ô²²¦úýҋ-6q²èkŸ 0J,(Ä+|ó«öRDÅÏpô¹é¨v•Ôž§¥=׏Rý…ÂÒÕf§I&XvË&=xYÃ;ðTÌëpèy@¶käŸ_ƒdB¯NwÅ5δ¦jôˆ„ÓùÞ*’puuý +@M`Í+§F‚!I„ìó$ã<4¤Þ>¯Œú9p‡Éí¨Ü§­¡æ¾{³%õ,Xel0£½@¢[Î#z®v/L¶`¯„O f Th‹¨ÏÏûªOhƒS”ySôk2R`ÞkÛB€ÑU¶d†š‘¾â£¨x跏”´6ñuf¼û™´€^UéÚ?“ÿ·“þ›ô“ û‚ák±Î@T,§À„bÙvŽÛJõ:¢¨‰hÜÀ†ë¥)O¶D'/*睞âÒRqöDIg"¶ŸHh¦Ê’ÈkL™X”¶(‚T¦Eš§Q§ `œÂòšªØì"Í]‚X£맂3Eô°Ò’¦‹4,xŸ¸ ëÒ`ÑäÃo1§gn+5G‘•)bmJˆeç×b­’„0%5æOå(y÷¶¸MLß"F’úë—DF&Å_œ þݐ¶±Øµ›³TêÊ÷ ¯Ûr|è ó/ºûe+±ú+’Rœlápò°¤2(¶´špPI à0ž€ã7É?•VMš¶/ÃøjWÁ)ÍXM¤Ú*ÒÐ(JŸH‡"91L·¯ÐVqK:½Ÿ{)»Äø“‰ˆz ¢G|\ҟ|‰YªýJQ©O˜)}¨5óKI%æÔ#ë öà2ò=>¯¹„QKœáptñº|•K6ä¸Fã+ƒT½vË ;=‘oAn>O€ôñ:eÝ~%éßÜÄ1ˆ€ó,÷Z¥KS4ÈáкC ØuæK Ü \Ïþua*enþ¸l^ÞBéU'ÐØÃcÒ1ç+Õÿh?‹¹à ‰˜Ú„âšB.&baG°Ԓ“—U<èõRdq´áhêÛXffWkÙPÉë5®Lc”TpÞú,­ÿ)ß,_2¥n‘—V/¤ÝÙã’ÂA•í:}E=G FàS¹Ït§!\[‘˜ +JX‡1ò-Äy¤° ÝR¡¿ ÀÐÐú+ê[Sàú9t)>Åûa¸é\3*¶qr´ëóósïÓ&~H+ã p9øÃcZûS´¦†ÂØÇͦGK½Áe‡ fªæхYFó1²c ÖúK(mçúIEkUUîÖ31¶v]ĔïȨ3Øú_QïŶªß2§ëð0™<â¯Õ”.¡’ÂsNªü‹‰úÍ^ÀEhOÔ¯šâ–+…7jh¬.}IÒ¼ýўFo·F’…½Æˆ-õ:²ÂR䊒•È‚çæ&FôJ¨s> œÃñ°fŒ‚™ +à§ÇÝÇ€SZ@ñ¹/ªæšÉ9=Š,[#UOXDÍê׊²ËtàÅ÷’¼Êe† H©CC7çp‹°¬µM®”9ˆJUžžEјRàÉs¢ª‰±ˆÀ¨3o;ô“&™aÍ, §Ø¥­Ý¡õp¯S9è–å|x?©´0–Cª²W3žï®õƺ±[ð&%ݕý\©¦Û$}(þ'a ÂÌ\E³À*ݪ¾QC,¸ïšœ‰æ+_ü'4žNWôŠx´†*µÞôÒ{Éᶁì¸æ+ëo†É؎ú•ÛW§HÙEô ¿t椖ðsXùÝi,­—5o<¯þ©áµfÜVT5ªï^êœ$ÌXR©C)!kço6Õ:´™ì7Ïí[âC%½õ¢;Xû÷ágU_—Ø•jæ\ ‚a)r¤OíD Aí4L¡‘›ê—2ûBZÃônn°`‰R¾'Þ (…TU_ç²>° Ðron²?rõA• +o³-Ó ¹ñfµc™7W™‘Ù›’¦: V$͔ÎÃ<\øöTIՌ^¦˜òo8˜!w ´Û‡‚AÈq’´Ã1‰¼{â²1i çè,Ü+Ç'˜§Z b-Àw´ ÒyÈæ %…ýe¿œÍkѶZÊåQë5šÑú«‚˜jn”b©!íó⏌©Ž=VÍbXc%¹ÒtôàhÝùkіì›0Ô'séKCi ² œ¸uìÂÏž›™" +Ó;|åf¢^Ǚ¿»Oº¬ƒh(Ô.EHùr†ªä¹ƒ±¿µSÙù€äÄI[dûаE…ÓAkA&„díÔíæí«h)5Ò©ðÂ$1©Å¹Î—†–dþÔ÷r€*=ÜZv.~tDRwTÞ«@iùm%Éƹ·¯Ebô/0Í%PmŒìål t?Ô §1W>O}þçaP¥Jî“F̨S§n»þ$å749õaòò–†1o îï9£ •RTK +Sx"ê-V!ßÕrêá?4ðüä ¼WJšD4"r‘‘†1o­šºoHDVæÿRè˜ÏæÍÍ ¤jš"’×Ê©ô´ä-ÕQ—yÅÚÞØÖfU)õP~èg°™*#ú§Ï¨B +ôt(@KëdqpîEºÒ7º!,„6B*ò…Il6@Pá…Ü-¾ù@¸á5+wªéØd9t7;ã19~´«Û`£ +6g¹Óªâ%h²9¸6xzîę`:}–Ñd¥ˆH !×VFõd–Š#Š€º1`º^"¢˜*š]†§¢€láòAΰ~œ&ý}Ýí‘-’´ ‹îړ*%xÃÈ,§âÕ­{õY¾„šÈ¯Ô+ÊT­±jŒ D³ú*êÎN%1ÓÃr§[zÊqü´,Ýãèè²þBž€•¥Bfë¸Ãm|ϘP>7mMË_ü ñ놠û½¢^9‘ØXŸ’Yƒþš®ŽÓnÅÉÅ5‡ÙÅɉû©KG´e4dù|…Á„‹…OϹvNһ⃯©úN¨§¿jw“´S¬ÓÊV ÚI+ꗧ~ªÏaàpÍþ»íÑ[Rð=”#Z~óÂÂÒN³*†¢é²T*zΚ}¬‘¨"X9*zàÆÁ¤T˜[œZÌP‘PÞ 02›k®[ Zè—XÌse¹Ûèv‹ÅŸgؕÄÔ ñf1#)üP—èHr«šY;l?‰ü¼À‘~Æ؋°Kñ*Å~æ¯ÜýC*ð~~9È'ø>c($ã}I>g*Jن,È@2q%bUºµ²îpòhÓëbtz. ç.„À_©AšŽLŒ<ü eq^Iþœ‰úúëÊHñ€ˆø㜇œqìžQÈc—( ;ý¡דv'/┾ˆø‘¶DK³Ž“¡ÿIeÂði4'C†]64¯†¨EÄˉ[ü7RSíÃ.ÿ-ë¾ÔˆmëÐòŠBP¹òdNTà=€ÐeŸžÍ]ͪ“­t4 8_»úL'šTæÖ9ùJvn–ÿ(ÖÔ_í5ì¥>šRîÞ¤E.Zº1¹ +ž†Æ “ÐÙø0ʂêlÓ'ÃYGjÆ&¸Vmü÷º‹$BÁ…°8ê®Ó4å l¼¦—&ªº×:EæSa.bø¸OúL|¬uaR²æζP05é?Àü»oB+\õ“ÉQÎt äL’n/äoŸÐ+¤õî—ê ¸ÈNÉ4Ï¢=¦öª( ÊAžIžTvxDsQd]KÙçõ¾ÌR† +HÙÄ@YS§H +hm°ßvLIu:û‘É#ÒéË%;B.#w±D5K:@F£Ëà~á(VÀé¶m)sFÐJ èWm7') 8RnPŒ¦IMÑÝw Fõ¦\”(!±ðŨD`A1ê*Aȱ6Nk>‚p&¢¬6뾙üyÚD~›³ù³ŠÇVÔÑYy¯tè§KÝsϵêc®ëQ†½3ï©¥’í V+ÈHä"s ¤»¨ú'f°3Ÿ#õG%líð ÜïÞ×6\ëòSm³è~¥øà‚½3¡]“knÊÇ}©ÏU;:îùrÜoÆ!Þ%06ùa;S ;}|ÛXt;BþåŸÉ½|°k=61hºM‡›e#rKóü°£o—þzM@à?šLÉ]H'îÈ)½^-ß· Î +eµ:wõÜÏY2ñ„ívKŒ¡Y™yÀ!ã÷ĵjêsÔ® +¶(³D ä…œÊîTlãÃpu$=Dh‹ðAÙõÐþˆßHŸÂ-p—Nµ#ÃÔëÒÊ%W‹™¯eíìºG8!mœ¯ŽÒ‰°EXŒ´!HÑɖŸ­ö%6^BÍî€ù@¢:¡òD؄÷xlÈ(¹2˪%>ý<0ñ™„vÁ¯jYn{múõ’r¬Oòã\{R¨ÜΰšMWµ|×?Ÿi»-VU­—AÃÿž”apŸ‘ã±™ÄÖ<«õt¹#Í ”*äƅY6TµòŽ2Ã[‚+ÅiØ œåæEž“먆uÈ)êm€§IâzdNwþo(ýkd ×× G¸5DbÏ)„ Fr hÒ=¤¬MË«téÕÌ¢‚Ö/#ƒ¦BHDºtHZ¦ùFµ7GÔT{ 9$œ¢MKúg[Þì&kÅ®ƒí t̀Ì⨣! +X¢ĝà¸.@Áʦäû^ðíàê7²a„ŸðË#.Ì֟•:¿.–õ V×Á¼‡=¬×–¨¾ „F+q¤* âTÒÃ>0¶kÁJMAÈ4ԉiÖL${ˆ ªÓRb”|”°çukómE»'~ُÑ_DC^Ö´x ,l•gË+ +  ïýj¡f~±¤E©â…éÁ³Hƒ@$w"”0#A]O½lfrDúT G.ØjPZ*¢Ac +‘±ËœïÀN7;Æߺj‰ZŒ0éÌ«Zy8ö$àq*•DRúN)LX]x¢v1¨0Ú)š÷W‰ÇصÓÚæAbò.º(53#¶%©å‡Bz€«¥2µ§Ã ß© ±ñçë|¿£Vý•EŽö9• ˜Î£pr%—þ^‰ÄêÍ÷=M(·éLBðØ1JdcxR ûÒwÊ IÂþŸb!p>}Ó4.\ÕyPT6Q–ç„u únWR¤~`·d|‹o'?·&Îþ¨j8+ÓR€*܋%†ý\ +R]+löm2;Š­æJ*&Ö2Cxؤ}­¡*Jד|¢´ŠQÑPÂñ¤lÙ|ëÔÔðݵO,g\æìŸ0zcÍfX·Yd~å}™ÆDß°§2¨ J¤N…¥oªÉJ§‰ÚÊÆ|ƒa±!¾Ò³ËÓPÑHÌ3LÞá’Ââmd˜¨±m°k@ô¥A±ú£9#²¤2° 1¬ùµN©$tF#_É!!¡ð1 ¿„Ž: €ž°TŸKx¬˜R…:V5Åú0NٜÐiZ.Ý©5?ëë tb?úÑ* ËiՎ¶M‹*ž::·œ³çbTS›¹¥J +1A>ƶ®†JG|²ƒµzW²?Ð3îØëÉ~â¤Ø¹ •´ZžŽR=ú|P`O.Æ RS£?°pˆÓå§ý +{$$ ¸Ñ¬e¼Ò{o.hÆ+íؔŸÀxÂNϨ‹žH4#9ëy!‰Â(Q< +yÿ©`öÑe´Í“]ƒü9ÛÄä#À¤%ùÍád¹6  bWŽ|ÝH]»åðÃ6³âW¯üú黵+`-ðýßC¢1pQÎõPˆèA]å¼wEDDétSj@K m  +$ƒýÐXØTIº•ÃÁ§J8¦¨“Ê h,lŠCBTªÄ"óÐXX•Ð,$`c@¢¡¢!A`l'[^|¬¶D , ( QÀ¢F6! ,&¢lJ3°RÔJA¦‘ Y͂RŠA•öLD p$’ìl<¡ÎÄC‡U6„¤™B +{Zm< šÕ¬|0D”Pç¤YT6¦šE‚ +uL¨Yfº˜m©û•8Lº@±"p@1̓"ÛÒäA" +uL²×"p›ÀG¡‚`Då ¢Ž ƒÃä1`fž H*5 ê³ê˜`ž—åÁ¨@_%IÍÛ@yFªY:šå{+" +Œ„fYÑ,“'Ôñ˜< )Ò¬@i3i¥Í´@èÅêõàÑL¡Pg%ë0ii*†4VH*%.P1¤‘uJ! ,fÑ4oP¨ xH„:®ÏLxô£šE+´@±j­œöU+ÁiÍ¢â菁ÀÄFÇbì@ €0iL@ÀmÄdSXX¼N¹)§Œl£9V^E@à)R:NAVb½É Äbš¥…:P™ht +²¬c ‹ Œdü 2 «V„&𠧍hlô ƒ ˜øC„ÈAç#‘ ÙLLÂ`ÊL™QrBX »„XlE#”| hÁ.RPrqEƒVá¡NÇ´@"‰¸Ò)g ‡`P²Ø8 (m<‘ʼn¤™4Åb²•&\x„èÄb( $`  +¿´õ0 + øpV³¼ZŸ†¤¸ˆ81æå'PÂ8$Œ·4ÒÍH’ +>¤Q +Ä"åŽ$’MXtR~°1ð(H0eÊ 8‹iF´ [ÈÃÈDPÀÁ@€!PU„¸D4B½ šL„:šG脒2±°()˜Äìdàyh %Ž (Dˈ¡tJ%qU4„\d”$Y‹¨¢!‘] ¤R0"’‰8 ‰Q­ÈÕQ‰ ؑÀkVbž‘AHª8R›f V*‡|¼•˜fQ1 IÓ§C“ù@À†–)/60 +-&ðšÅõaø`#R`'Ÿ–¬#!ÇiÄ7N4 JDGGDŽLJ)ôPredÄÍ2Ë >02 °…Ó…Æ*˜FjTȄIE‰Kƒ±á±¥2š%Ãù¨ÈπäŠÍ5±Íb Â; +²äqAy¿0@•šöFr?+Šm©L~ž*ô …ä !Jm>šEä˜Å6Þfӌ…âAåŠôàBÑþÔÑqʈM¡x%§ DÆSnlt„‚Q‰‡ ZUʀJˆCš ØLdÍÂq°áˆÈCNïW +šÅÂeÒû€}¤¸k4 ©z5ÁHr´5€76(ÍÂQ…V8b¦Q‚X„¬Å¦PiñÑ TÉ)=681׀À+8,œR³¨Z° ö8e&J¡ÃÁiӆfµ1qÍòyðhd›i•ˆi*‹m0ʁõ((9Í¢‚ðp îñP1ÙA,&S•6FR³´PꜨÀFÁÙʚƒ +uV Š‚,;b&O‘¡#I€òòXŒÙ ÊHÛG*7 JŽ˜…ì Ó,2Õ@T±3yŠ„Î ªØe8-“Q'åD¥› •Âf§Ë>^ +®‡™F ˆáC$":$ Ò,p$BÔ'©Ò,#ŽQ.pH§ð´¬5XB¨³ !{-t,F6°ÏL( +>¤j‚5b†TàìFˆ+¬ Ò${-t +@R™Òà¡ÎG¤#*yD +O³T,È“Ž¨¤xj”ò“€’Š)¤å *(%è ÑP¦ã´(*®À4¬„dF¼Ä(……òÒ,”ÆI_‹ƒbÈÎH$ ‡Œt•hBɔŠ …”xH8» bz °¬5ˇ„q×èª2ÀTj1t*R8 ªèÀDTPŠ%2ŶaJ@Y€Ä”Ë@¥ä¡Ž¨$•˜PBG30Öh!œxÀd ÄàÀqé)J«Yd¦Í­Š§¥“kt"‘âú¼l“ÚH’Ò*B …‚Š$¥…™…ˆ&Ø`¡÷¡Jž™ˆ: ‡(A!¢ÎñPG³x.ÛÈKd+9d` UŒ@ƒ‹e€ÍBW³Uis±T#®Õe´ÉV\ÈëÄdöÒmæb¹‘Á\ŠˆÛÏÔ'™. ( +Ù&E„]®•,6ƒ¶"ӕìå`½V¬™kå``µD,%€XÌÁà`p2Ù暭Z$³Mæd°Œm#+™“ÁD´õš¹^""«’Íåd0Vˆ“ÁZN㐙›¹H^$1XkÄÍ\$/C‰­RHH^!1ÖV²‚ÅDB6«E²ÌX³×‰CI)ÙJJ La«Vlà5s‰h &"ÀÄD0q%n$&cµHÜHL$g®{¹‘ؾLk‰¸XK$äu’2c…ÈV!#.äub‘ 6Ú¼…±ß„>S¸üêºå¶’U +˙3“] kø¡¹ =ƒÅ`0Xky¥ŒÀb[k&sð7®5“½H\ !¯†ËV²úèfÕ +±Pd­ÖKą¼Nr“Å6¶˜ y´Z«×‰ZlE„ê…at©0-€*$L¥ ]`¬I¶bµFÖÌ5º0Œ.¯ £Ë*Ãè2“±TÃE•™—;3SUuwá{ïAøÿþÛ»_°UlFâüݵB2{Ád®;yµwy—3SY›™_¦ÛÜ}1ÆTÕM‰«¼¹Ê¬©¾ü1>—™Üªïx3™[ùûÿÿ[>~øÌýè{ „¼^ ºÃ÷èîîî+™k™‰ðÛÖRDd¬-Ö™µV®Q\,7“µP\¬‹‹uy¹.‘aÔj”•ÀËdkÁX³ÖÊÃ&ÀªB]sF¤Ù©$±¹l­ÖKä2`Ú­`)/Rë‹5[QÌ\¯Ól“…¬T諪ŲØdk‘¬•k›­b›kC¡ÄV±M×+k–ñr½ºÄÅz kæÚFF\/Ò«Jg«WLd¤¯ߍl¥%âbXU”Ø ³Ø(å;m-–…¯ëÅ`C©3ËAc«×jV±3’M%ò*5 ¶ŠY¬,¶ZÈK¥ØX![ÆL¶:ÁX1ÙVZçÀ˅âZ¹ÈX$¯Ë&[¹´V.W K¶•\ Ùêb"²"aµ`°Õe¶ò`Õº¬..Öeƺl"«ìòš]F¶ÍuYy {]<¬‹‹µ*Ù.®×ŵjÁ.+¯6™ìââN% ×ê"[]¶‹ärq­.%.–+Ùŵ™à"+q±f³Mv¹l&³Ë[]6Ùfb±¡É¶,åEҒö²Ù¶Ö‹ÄÅ°•¬$RX1 ^¥-å3y¹^ˆ°Z/ ’™‹a•[‘J\¬kÄôq*I¨2Œ@ ØÊUáZÁ«XIf2[ÁJ6ÙG‰‹%Àëak±L2`+WÅL¶R½ t9€½$.[Éj¥ÄµRÍV`³•ˆK4‘m—È0ºÌble¶U”:Z/ÙFqIYal6 #ȯ—Y6 ‰‹ªÊ.#¬XÉe×[Á.qk…\¶Ùªõ’±BZ+),Ù%¶ÁV°KdÅ.ë%½Ä^­—ÈêF%—ÙÊ EäåB¹\ôòš­Œ. £lsI‘±Z«LæX°‘äí%ò^c<¾D¶Š‹ê{°—ɦŠÏŊÁb›¯Ë&@l“m1X«µ‘”áE¹ak"À'ö^¬’-v Àւ±Z"%.–‰ŒåZaÄ`ÍV­Â?³Šf¬ks­Z)›m2Ùhk…¬@3Vis9`•¶VÈÊ¢ÄÛf.ٖ²‚h­D^*‘Wi¶Jµ¶ŠÍå`VÑj­œF(éÒµnV¬Öêš¹V_Ñjm$À6{ˆ½Z/Òì«øXe ÙTìþ Û,¦M¤ÄÅÀÆ€ý¡½àE£B–ëB÷w´‰¬N3’Mõ¡Y<¨‹‹á€mÄÅp IY1±¸À^—™ka¬b¨ÏŒdS9§\/°b¯ÔʋÔjm$׈ØëÕ:}Œ°b¨Ö&À¦º 0cµV+—˵Í"ÃHvÙ\¬Ölåu‰m®m6[µH.© #ØË¢µÛ(Z«W eR¢ðŒÄÕl5²šm) ‘éŒdS¥¼f³WÈtðO»}sß²ãvaµd +Ù' \ù0Hx|T ’Dœ­R¹(P*Ä'¥©0R7Ò%ˆÍJ³@x¨S ²€"Á<úÁíp§PH%Òl‡B¨##Ãa¤Y B›ÍHvlJZ Å@Ô5AcDàÁéXL³Ì(PY)Å@ÈfÀÆBÌza48ÌJ͒‰*vº²(_Zd(l‚@Ä|œ@‰‰-Í¡ãŠ`bšE#dàaL!Èõà¡NŠ#IEiœ´@ ¢YJ oÄÍ~b±WB,e”j‡*èXL¦’É63 Æä) F¶±˜L%sÓb!Á`€!ôôIlh,,Ç1 8$”L 4Ü\ ŒäS­¬@"DÍ1@rd„BÒ,)Œêäɕi- „È:v#’Ê)JCfÕI²ƒóB Œ=T^Œl`! 7˜¸càa¹™ Ā°Ò±G"ÉŒ‚fÝk#ÔépRêt¶“M“š}x¨ã63PnZbË؆‡:•¬¢`3â0éf#4`!âx0)ƒ•¦Aú`6 8±(¢™ + Ö(¤ƒ’š…š\(¸4VNòuÚ váA P¡´ EÔÔÙXX8'„v ©|ƒ-=eJˆñ`:8°S"m`€œ&ºK¶ÃCíØdl„:Ùá¡NFpØuxh#<8ÑcÒ*Z›p€“©Y^€Ÿ €2ª ˆ˜PJ ËX ²* ðIäC³|x¨ó)¦æ u^šá¡§#$ÔÉ P†‡: ÒDi?OTZÍÒì±J•ŽQ uRbD€‰5°R1*:PۀÄÌTœ]@8¥8«‘*0 %‰ˆÄ¨ Äµ(DœµðPçÓÎÄ>RÙI¥‚@¨Ã"ªYtÂCÈ QЄ‡:šðхOÈà ˆè„‡:®SR0á¡SˆRª(P®œp@RÙáÐXØÁH:†ÒÀJ=$ԁ’ +´ ʖ’JrTr0Àš¥c{‘Žªãà¡N £:PXÍ¢‡ãà¡|XÓiÓ!Pj­X¤†ˆ922F) Säœ#yRêx2J’(¯„P§ å¡NŠlÛhRqxè#’JχÆ”6o$hÖaçãđ2°R†Ôæ´¢yJŒ ‡‘LõJA…ÙCT±‹N¤ƒá˜p}0š%Ôbq0 F‚GÌJ¨ƒiȬ>ŒFƃGcåÔQ@!¢²Q)C>mÐøp…QÔ¸‚Š&EŠÁDT³`::Pb™•R€:X±S‡Ã¤'ª÷1ql)‰ÿAì† +̀Y‰•\Úæ¡;"*œ“Ô:ˆw)Ä4‹ÊÀ…IEkkÓ¨*\(ZI £bÀà=62 ŠÓC¡² á˜ˆ$ŒNªÑI@i& m6 +¼RÛºŠ• ˜  @º91P ÀÐÖ,ª̄FB!7ێNXà%á¡ÎÈ6š…Åi„q=¬` +J'!±5 ƒ&ÒØ@€b&£¡˜4 *$´…֐ÐÐ +0%:0H"D*"5Âúhf‹Í(”ø±ÃpéJìàÅ!‹L±Xlbó’ ÉS|$‰†‡Gj–ˆLHGr.<rƒñÉȕŒlÍ#ILd‰Áb°ÈÈi²µ"²„$E• ªüÄ TªX¯S–&Nið91%èÄdÊ +Ë¢³Aq€Ð‰*¡ƒÎè$Áa4‹IÊCƒ¨CÐáÐ0±•„E§aR`Q„*2 Ž20X# ÃÆ°¢LÇh£‚1ÒaÑHª´ *ÍzF%5ˉIÆo |9‡““‹ Ž,D³@Žôq$’¹‰††††Fì#7Ÿ T(C $³ÒÌJI%É GI¤‡©¤!IØ +¶ÛÐ,*; ¼0:(²ƒ"Û²`;ÙÒÍH#ɜÕƜ§B£B£Bƒàå@RIJ‘@I BšåT»±ÌàBĚ QçBÄ9³qCJƒJà†T 58¨¨Á °fqPQƒ‰¬c5 ÃI3œpLdËÀ0+mD2…Ù¦YRšEšmªÄâ± « ²2¢±°)Í"€a‚-í¾JšŒ@bóÙ(i %’†¦7L³—AgdP’$%¬Ä< šØӅɔB³¤  Ô >@J­ ¼‚Ã)Ýê”át,Ö ÚpLV[~¬¶Õ–)¨PfÂ@´¢ Â+ *jP‰¬YVTÔ qP7¤4dT‹,kP‘›È:8l"ëXÍb"ëX”’†`3ë؈N2&"ëؔ,4KÉB3m¦±°¢™Zx6UòzðÈB³ØC¹*Pšk ¢,j¤A4[DAtN§ÕiE#³2aP¡Î‰a“A‰Ã¤0φ)óÙu&L¨2y6H&Õ,.ÏƁfqf!P°ÀR$BŠ‡`$S<¤¡|¬Ä0 ™M bdâóÑ fb)†SÆsñ×, %²˜A¢V! M³Dѐ 1‰Å>F( Í"ÐÊðC +Á£'PjYAf㉠c²¡ñÙÐXXÕø`$höcû@m Hr6 A³ncàِ$Å'£$©™•æCf•Y¹‡ÌJ=™•f”D…¥ÂâÈÐPQeVÚAeVªÑ, ɲGECâQѐÀ6P “’T4$Y ¢!IͲٖ — äFúñŒ +”Ä(²J³¼0&.4 +^£åø¨@—`$Iš…†…†…‡Ãùx:Tn8$ýXm™"J‘@Uhl@RI’½4 ©Ô0fÂ@³8À,­a& D0N…Èæ é…ˆ`¨*Ð.D¬Yf¢Nƒ¯4¨è… +uœÄ¦,0D¬Qƒ&©È )™ŒÁsCŠÓ,³ÒFdQá@…: ²×BÇDÖ± «ÓÉBÎJ‘…á„£éÌNfš…ƒqÉ:L+ÍH2œ bèc‘…f½¯LOm˜9ºïãke~¨íÿù֝ÞþËÏEÜËùì~þîv·ÃõåçþrÌüóùٓ3?>¨ºÏù“ÿ}9~Lֆ/r?ÿ÷LJÙÛ0.|†Ðqü…ëZD“ù?>Ž £?í¿í —ß>ölÖç}¾ÃÞ÷­œÐ}_TŽ›1=æãÝ;Fîæ†9ÛYS9¡ÂtaŒû Çoö… aÇtÆtí¯¯!Ô|ž/þº„¹óý1çû¸ÏÿÔãnŒš½š£2¿k¿ú¾ƒïå¾T9¾:³ûëý—ëp™aGîÖ]ý† _s+„á¿'„Ú0®»·ï;:‡Éïѹ?C~ý5Œ1&w«ÿÃם¼ðõã?Mæ÷FÕ| 9rÇüN¨ìâö{­O³Ó½Ý¸Êûžù1úÇí†Î Õ}|Ï·q—cìՏ‘fæë¸Ùú8rÃ×q½c÷ëãև߽ÊúÜótê¿ð}¿ü§s_¡C͇Ý]¾×fÝÍ΄ËÊìÝ/ÆV_t?_3+C×ïõ{×î YŸ{|ù\á{êџ„™7ªª>mÕèØ56|è.¾××ÿ®OáSo÷~î~ +_¿wñû]òºv¨Þÿ[5;Ó1üÕ·Í Ýùz·¾ôþ÷Ÿ\×üÆè¬êñ%3Ü|íí·ðùÅÎ÷pÛûAøÝ·!;¿2«:d~ŸÞΪ«qF§ªBu>ýXTíàS…ñ}w×nÿŸ·Ã÷ô³ýНŸûøx7Sá¿ø`¯'ú‹ï5ÿëێ¯ÝìýXÿsµßûW…/ÙukLŽÐ-t¡>7;Ù­ªümçã|ÿiׄêϽf§vï‹/º|îŸ;&ԏŠìBýh?§üò]~¾åŽ©úïüÅÔèÞP?ì϶¿ÝèâëîU·ïFíç¾ñ=×P_÷{ç‡ßn_=£³>Tá¶ë†ð-ëû;g\QÞo~™ã{ç»cûÛÜøúàt—ã+s꯺çï«®7.ç¶Fvo2Œüãǧ1¾×ﻟãíõí˜ûð?îæììöï‡ï0ùÅÌW¸áÇM¯Ó™ÿ-tøîõ{žñ#//ÿó»m¨ ôþšúÏðÕן.ûvd}¡zs¦¶C‡ßür5Ûyo¦2¿ 5~Ôu¸¹í^¾nø:?cvë‹ììu†êúÞï£CÞõŽ®ü>ê?¨ÉýÞÓgÏLן?ÿÎ÷·ÚʹªŸÈß/º2l¨ =û¡nŒ¹ð=¿Øº¡¾tŽû2ftÝtÏØã‹ï[ý3Tfý_£rë¯3̧ ßÂ}£;m¨ð¹Wÿs‰îëëþ½Ç¾íþ·G‡®ÿ¹ß½CåýŸ{þŸ ¿äø¤oø²ŸÂÔ÷¼ÍÿÑ÷˜?¿áo;G÷úSÕÅ}º×¯ñáÂレï0ÎÿͶzïFUèT~ì_OèÚÞ>È»Í1¾÷÷þ;÷é翗ðÓ¥oLÞ^nñ½ÞþþÍ÷6!»Øÿþ5C]ÈÆÿ\¢‹›±ÿ“1Ãç«ûùnÂØPûéƒïù0ºtø_w;çsÜèQ¡jëÆõá¶ú³§SŽý£Æv‡Ïõ¹!ä^èOã;\æèᳪÇ|üœ½wµ_¡g¦¦>~×þp½³3Âøþñ»ûûÂèNÿ=Ìeè¾Ûîa2tþók… +*gŒýQ;õŸ·ºƒðU5ý#„™o£òFÍ}ï „ùWu½£BOîìaC†¹ï`Ãç±?7BêƒþÞ½±75có¿¨ ßDž1»ã{kÃWv]Ž­ #üô„ú‰ÏÁì}q{“¦{𽟿“Ýÿ{1¹S£¦ïF…ÿŸËó}˜ßëíþãkÕø¼ì؛cûgÃ~ +7®ãí¡¾+Ç£Ûøömfÿ{ÿé°ÜíèÔ¿Ý:Ôÿ¹¬«Ã}ü 3l¨«þb¿‡½íԕ?ãêÆîÏ}۞ný?É0cêG>Uõ§ÑUq¿þ«c~ú‰m­×*•²Š­$ 6XªPD^-³nŠCW÷0µ_+o@èP#¶Í\i›_sY­L´V¬ËÅ [âb¥ÁÀ¢µÀÅ°10ˆm®Ø‹d```ÀZ‘dï«`B÷ë1¶Ç~Çðõ²ïcý”.f±ÑG^8úq1¸”.T Óè’—êÂÑËÆ¢ºä%}/põ_l`¥q™4Í2â2}¨ZBxE”hÍ¢Y4ˇ‰&S “ƒb4Æ°ñlTãœÀµ$B׃ÇF(5¥£›Š” I$•Žä®ZYŸ4”¬H)ˆO8˜I€ÈâÄ¢Åb¤Í“à ”)Œ$ï‚lîºý¬gC86 ³ì¡X‡ôÐ)^fQôÑ,¥òx@Rù)à(ˆ³‘8`׀À€H¨ŒLà×£¢•ÇÓñ$Äq<%p¬´½TH¢$Žf á؀ŽFĀŽ +YI³hh–Ž¢ GÓÁéÙÈ:†ÆÂjÐC‚f=¥ÌJuÀ8L-Ԇ5’ÐÐyfKí„…2™”›D¤Ž‰åáÈC–‘2§—+L °ŒÃCžþh!«ú”&„Cˆ'H…â|N(Í¢YR ¤Šx%xìDH¬VJ  &LR@hRÁ ¤€¡²aê}hžfæ[`¸F1¥´&™ŽFʛPp !àÉ£šåT2PZ’…‘TYiͲrÒ,hF @ R¡@»HЬ‡fùœPǕªÐ¦C)Í¢½F ÁàÍ҄’,††„X­:ìðQB"88p…‹Q‡'œ¯ Ó¡ÐÁŒNëÁ„L¸>˜Ù¾N! iA‘Ù–¢AåBA³ÀL*8k:y=hԖ&Pheƒ)…iˆÈP=tL+ ±­$P YP)‰®€ò@A€20!6‰pV³(¤ˆ|,ĄFBaD¥#üÚ¶Øé5âº8°x. Kh¯žè€¤²`/P‚ðPÇu +ÂC¬ú”vP ì ø”ÖeT(]…`@˜0 |Z(q€ó…ÐPrðPçÓ1Ñx”Ä¡àA2Àà‚áÅ0<¡Ž€V‘¤JWdVªyJX¨@7êT¨ã<#©‚ÑiȬ8'P.l&%ÐX< +u¼ÃCÔpµ†AÁB¦‘”Z©Ï%3×ÀaR7(hÀ ”ª%˜Ð@iNڄpºÐ¸J V ÒGÀ‡:ÄCÔéBÄ!. KP@)º°°!»BÑ, ¨¢2+u(^ÊYJà‘ ,”b ë)¨HЬ#³RH*9%EÈJÂ, Îz XبZYg¸F#˜Ã3!\ŒH ¯Yòb” Š PBØZˆ8½ ‰„ã±@† ì"6:  ä¸Î¸,D¬!J ‘ulRH€Ò©$»;ÆfÈûÝޝ Ÿ¾…ð¹[Õ?ýø¬›þÒÕcô„¯ïí¦æGwš +·;ý¹øܽû¾üÙûóû·ïo|ºðíƒé/Æçòíc¨ßðÿ³ÊÜ vªê&¿ü×Ôõ|O…ûÞsñ)|N¹!»|š¬.fn|ϱárdV?Õí{†Íï»ðݪÔ7E_¡;Ô÷^Ã3c§÷‹½¯Óý«{TW}]eÈ÷±Â_M¸ì_ówy¹áo÷¿>ëÿ¾¸š +=9s·ákkôÿöø~y?£·óë·úö=øbò'Ü\‡O]á·sôŽêܼüìÿÿ™ºŸÙûÿ]:|þÐqdím֎£BÞ÷<—½_§ræ‹:ÖeoUÛ?¡slåÑ_BþtȟýV¹yy7_»Û][¡~®Ãü_u]/ÿê¿FÍU/_¿>ï®þ?ìÆöM~¹úf;‡º£²nþ{kftþìoÝ¿æ§cïõ÷»ÿQ·y{s+Â\ÍýTýü SؽÎÚÿ–ûý§‘¹y³²?Íèûøßãä^‡Î©NÿÁ^þ§û6Âç¼ï¼õñsC~³ßcoçó}¼îñé>çl¨Ñ½¾uºÉþ`ì¡j·ë† +5Õ³û_\îçÙëúÝ£º†­ïó5TvÇý°Y³{Ÿo·ûÓïæO]mè_;Ÿëëùâ'\͌þÞ;þmÎíǎŸ¡«>¿î÷û|ßùîK>ü÷ ?êža|Õ÷ð¿á?çs„¿Û·îû|Ìêþý{¯ÛÙ#T^Mu÷~}]•!„ouõo*|ñqG†Žácú ôêþu_Æܼ÷õ»ÈÉÊìßý݋qãSpûÿýçSVèþ·_³¯?¿æÿ·»Ú«íÝüòa·C]vÿ«Ÿºîÿ½m]æÍ}.þwê˧ü*Ý}WÓùëÆ~O÷=…Ù/»3söÔõNÿÕwøàz¾ûÞÂøXá‹O¹õý­+duùºásþTÕUUŸk7„®Ù¾.¾¾çþðÅnfÿΧ­ï£ÿ·';3?Ýç5ÙE~v߆¯Íq÷õ½ýöÎ|™ðµ²3Œ }•3³•?r¶KØ0rëÿgCÊp£óÿõuÿ»a|é ÷9fæ+¿¯z>×Wçû>_òcw†·ÛW#G}­/nnkԌQa|ýr~ök}>Çß}7:~UVŽêZa„Qaä÷ïëݽË>îÿ÷ý¿Ÿ;ü~o_÷ÿðŸSÿO9>÷17ÂÜôΘïáÆMpã7ÿûvÖ]Þ}Õ×­ÛðÝjŒÿ›ÏmÌnUO·ÆdøŸéÜã¾~ÝçùÏÏ5Üd~vøÑúCŽé­ÚÍ÷þå{Ðýëë·þ>:}ý_yסKÚí/ÂeÝWc»ÊÿAè.”ÉOß©;w÷sTq¶§¾mNuêð1+té°_}õ®ºtu†ÑÅîæ«K]úÓ羆›ú»WsóE—º>oí—3&Œ±S3s;³]>ïcÿ}êԛuß©?{F÷|o=Bø0ß­G·¾Ñ5u£SoÝLϧÏÖå~ ¡«»/Œë®OõEÕ¨ï¿î—žœïï1B·ùÜꯝ~¾ÿ~þÏ­?¨ü2êóoåÖd®›ŸŸ3õq¦{³&÷SΨ‘=_ì¸ÎÎÉïµg~Ætnç÷ړ÷årBø¶u£'»ØÚꝎýÙ¶‹/;ӟ.oÔw •ãrò27ëóvýÝô˜®?cäÎó5÷=«óº¸½ïE×÷!üû.:Ãø²c³.TÚï]ûÛ~øT©óÿ)3Ünw02¯;¿ŒÏïW3BWøòý*| nz;|ìïmïBy›‘òg»sg˜­Ÿå¨îýù‹ õ¹·;çsOLv»&twMþܗ1þBÿç ¾UÕÆç]‡Ï;ß[ô§ÿí >¸Î™ë̟ýrycÜgoîM˜Éߏ³;.ŒÏåsz|—¹Ñ]>Gu‡ªÕ_Øì.£üÎåßôøÜE†ï«¾íû©¼Fuñù·Õ©ºï+s«‹ßWYÕiô—ð¾GýÞãÈ͙»Úw¡¿ÿ~é27¶g'÷ƒÐã{ÿ"„Ÿº £KÞ÷g½oFîÏNöO§¯ÿbv§CÏÈþݺ£BÍÈÑÿ±;„Q_ù9ŒÚžÊ°Yr~§Oӻӟ9®û·þ:|­þËP>ý<Ì|ªñcîsçØÏÎú"Ôn}PÕ©B³ß‹Ëñù_kÌ•ß{ç|°¡~ºFeÿvw«·5vÿ¦îçëÓîlÈùü £¶þ{¾|þÓOÃ~úôÙÝ3ÿ¹~dýÕü΄¼ï±uó3ûUËùŸ®óÈãëøo_ó=CŽÑÿéûç-Òꛚ.º?vÝ~Ôý†î9l¨ÿðcL} +_ûsÿ$_Mç¸ÿO?Ê {_;}1þÓï¥Â\o[ß¾ÿçö=øÖ{.C^Þ}›þJŠìËïÿ%»è¨íÊé¢ÿû+/t0~æ;˜íñcÂt}Ü/yã»&ë{¡û‹ªÜÝ_~¾çpcÔ~ú?ó{=Ÿ;¦¿å~1˜Ì>WîäWVYHýâk˜™;›×óEgÿìîüºŸj¾Â§ïu9>…ÞËúÖEç~ãGùÿûØü0^TÝ۟U«/÷?æÓW~þ{ªûO?þ·ëŽÛsêãþÏèQ¡ëæ÷†0ãó{g¸ÌÚ0î77{„pŸsdõÿsù÷Ýó¾¨ýŽãC~ØÛ]dWݘþüù+»Ç͍‘ß½÷íŒÚªú.—ùuÿC†îù7aþ¾ö¸¾»ü‡oSY!§{†Ï7>‡.6܎üNöãtçå\ؑ!otÜÏß¼0òs¿«¿×oýal…ü¹cìgÏT~N®ÿÛÍèvóî¿· ¡/tÊÏp;3Ù¡óVï9o3oBÍOWçUøÿîýÎß7:fȯó5÷:‡/ Œ¨ÄQH´ÁXL£Œ¡£`, ¥’ÁC"˜€`(F06 ’†ÃÁ` ŽÄ8)Š¢8 +!Ę25U‰FÜÓäh LŠW€Y\ÍÉ%{iÜ%« VZ³mÚâ‡ðòôjKhö»‘:Š<ƒ»ìÚ+u’f¤õgI_v±xvž{“©HX%‹.Π炽<˜Ì•u§¶?=hlh¶Ø ’^ñ_Á1BYRƒ†¨þ}dÈ'ôV#I0ãe.0¦þõÃ6Qµsè‰-—Ö˜q& Ë#L—s–Ÿ-à%ËÔì¾|áà- )FÀ–O¯ÿ‡çÄЈÄÖЫµn’¹¬D1åþ²&ÀÃhp@Áí«W¨°&ˆ¢z2aí*ÝÔÛZWÎüRP:%+]YÆ£i4Á +vOŠK{ÔoN—xåk9ZdìLáŽ÷#•¯WŒ_öNvrEÓVc¿N8˜)×jVÀ ?¤˜Ùà<ْ)Ñw·ˆwÇKöZ¹µ°€Ä“?ؒ5vȆZÝABýQŒÜT×­ÃqB±èà(©ã0¥'E":Ké=Y¸EM¿,W£j•`‡ +9'û `ŒßkÆrd20’ëfi(3—®-––™ÌÝ Åµ=þ -tÿxüÌÿBt¹C`ÔRìG8M > äNó»q¨í‚g“·†!Š‚¾rS—Iv> ‹A¦04Èp/õd8›“™W`5óÉ&›¥™\}ÔßÚ+£rw-㠘÷'–®œOþƒçpWLZºÍ äNœwÌ8™]ͺ)•|•K¶Š«îåáñþU÷~fMgm+¶‘ÏK@â"’sÕ÷jET pgÜm2ö·] Bù(¾î×Ì. öÄ?Y‡â@y0Aªè,oD…çYËvԁÙʎðüncˆ çùfð +™'•7Ñ +–ÕÆy®Ø9}‘`I²!¿VÀ°k^gB†Ö\£‘>ÁÜ¢\&¬%šíƒ¹ºX€Úô0’vƒêµEPY¥¯f´Š²}7 hLè§ÔT][#àRhÏxñb-¦efyÀ®}ùê18ì‘ÖNRiz>¾ÐF¿"€‹Ì•ÿKí®BɹÇN§³gÿuhæ’x¼´¦q‹\­º@r2_މÖãÅn5MŠ…]E´×¬?g)•aµ=瓏?žó€ùkÃ+ˆ\Ž¯ÉŽëFAV$qšX·Ø}áw‰½¢{x« +ıe/ÆL£Ù ¸)µ5ÉÐ2¦¡ŸïŸF&+`ɐ¬ÇN£hI“AÑ=h°ƒŠðı ¼ ú,j°³î?¤Fџ%€ÀÞp‡ä*@µù5Z£Ä2ªCÀ'éN\•<˜ÁÑ4¢¦4ÉW7ô´%êxÄ1ß#^ý¼ôŸ“6`Ä3ñCÌd¾½ŸóÒø¢ÀËI`½Dû> +¨Ú¯j¦ýñý~/å-cÀ‰úoã¸Î°É«Ül©¹^"`yg=°òÑ ÄÐc~ýý©é¬^ô.&”–ò#=4¥#Ëû9ÞLò:Üü×ù3‘‚Kó9º4ðrSÖÜcA97U}Ž,öál"9PÎzíõyÍ«&žÂiàHà "eð6ðœÏ„©$‚·:'Ä4áòdýfSÄÂéù[͜©qv­ˆ+ž4 É®;½8ÿaB€o3Ãþš]ýLÙP¦§¤0˜Y˔&V{‹˜€–¶?&kMëOººÜWŒ)ÿf o·¡ò±ià‚PDµŸr5¢&í.isÈ~UlrjÇÙÞ1}̝Vb.'Œ=ú²ó‹*˜h$Íø‚±Jhúɝ#Z‚6:¡|Ô_¦Í–_à‘¶–ò– ­¹ŒEILóák€»4Þޒψ\KÂ¥rÛv¼à¾Í¦ú3uÛՅu¿Ï^œì\ƆÁÐKÜR•V¾K¥;MÝP¾?“›] +¥æ‹ôë`MÓÜ,6KôÀ÷Ø@ +åôŠ‚™ nÜ:ÆdG ngíÀÁéWËE +¦#Ør{*ƒ´¼ ˜ÌM®ð)ÉÐ?ø%¹›+U!j°Òñ@E8`´¦‡a²!ѳ*Á$ãHBw¿ôË<¬à +Õ¯)3sûVfFÑà—Cª* +¾±µ©B$KCð}¬æGHþWm¤›Ú¾&”xçXŒMÉ+ŽÁ}Æòûx‚ö»‰;):ršºO&³OÐüÓ‰s°ç²DïjgÜ×pĹÜ%ϳeb‰ÒêšÊ6’wÔÈ´ƒ[]?;°#@X‘€!XkD  ip&ÄЦ §éIÇ'Âó¥KþT_¯ik4¯¿çkÌ}öïњdŽo"+7‚Í¢¡<•´VT~š6u‚`‡Wù‰™ º8E͍-´‡8ÜmÞ&Ѧµ_!è`0"Ë«©‚¸2°ËDÿ%£.ˆ‘ ¥:ñ¥ ¡‡nt\²§g‡ÜD†`øœ«ü'AŽj‡#8UPöFFM<ˆ‰b<aV̀mFøäh9ö‰bäp<ÑDhÛŠå¦tº”@èÞÆ 4÷’ÌuyÉ҆ ׫Îy9!²ª·—ë+r˜«y»ËÞê1ÄøwÃos6PÐÇ[èaÐã +JyøA z…)ñÇz ŠR`˜E›Éóª†û÷ƒÑŒ fi重Žù4Ë*åOÖs˜R´NqöG¡Œ•±%¹˜’³nǒ[Úm4a¤#8ã° ê^U.UƒiR÷œY{€R%ö'DO¾«Ê§Ë Š%žø323á5û)«¯0vÌ=,¥Þ:¹÷ÞTEûÜ쏓†U…™ßx XÿŽ;ZöÍÎå›PØwf<“µO†uFL¿ÅÒ¬c“÷pÖGr1ùa'ë҈T£ÅGý"õè#2Œ ³ ×*ýËíe¾Ñé±ÚK?ub’,[f§ÈR.œ1‡º³B f–5@ ΣÁÿ®î“N‹ïƒ%‘6ñdÈÄ1J§¬8W Xî]À·ýj*;¹uT¡¶°1¢ƒ7—˜eà™Iq;‹3¿h/pÊÚÇ£jFÖøƒãEe$îFdLÊï¹E‰,Ks£;7ñ²ä‚­›²”¢Ü!ó™Â,9w P=Å°@6¥¬é%Bn$¼”Mú¸˜$(—˜¤(ӜNÎ𠾸$³€£±µ8nIqË5âʈÅÀ}ºÁûZÒ¥Ÿ:fAÐóTñpΞ•±=çB½1ÐÛǬÀsÉ4lZhĐa§’ȯÂ"½úöð\r‘¨‰iМυé ù¹Ðé~ØÁ£Ut+ ꜱðÀ>!'“v1ãâ–dÆ֑=͟Y–ƒåD~XÌÅ`š;–£RÅÍjs±¤[ +üQ¹4—ÌC]86èœÆ¾D¦ä³éò6&"VÎ¥»4¨œ ÑE9•"œÚ…è2—!à0šI’B—|[äo$ 6˜ÉÛ94–çoîйÃöÂ\®?e Ë2¼0àážež‹S2²0Ž‡Ê΅º“Ñ!z”à\ NGqŠ=΅Yꃜ$F”]“B†,{¤¢—¦@xÇ/æâx;5KÌPÇËæ2øÓâySIˆ/N3÷ö~‚t’\ ±¹àY³pÄe˜æd¡Îìo œ ~gñ¢y¯ÃSƳ²R ˜šJÔ}r +ÿ>žEkÅWîÌé­6Íåo÷Ô¬x¦oÎΆéK-ȁbòwü]HÁ\8^‹®ûËf žLÓÙ[Wm>ñ.æ–RwÔ$]áÅ2Ô¡©†™%KšËx´ÀŽùܑGP) ¯Lº.õ¤Ñÿ8{ÑeJ¤hæ&Ò ¶ÔùãRªÂ+#×f˜N#t[¶3¥Îß Ž­äy/çÔ'ÆÙ+~æ?Qz=n”²ûøŠÃ{‡¨UHµ,<¨bìÍ͵fÒÏ ^“>P«ñ½zòÎþ"¡_'¢ÌäD ÇðH³ÓŒ5™Þqd0µ×®X(ƒäÁ¥¬C§šÎl­^¹&¡X5—µ›…¼%¦v/Ù¢DìHáfúÇhڑò ""Äb"îLƨ°s̚ ~CR’á«áÁ*Šf⮎‹.h–LÓËé/â;ÇÂYç^É)SÛ"ƒíŠ[=3tõ¸KE§ú"æD$+Åï,Ñk'Y?VoqÒ%›ÇZ4$Ò&hºEV)ËT¹¨´öÚàɄFì&—·õí +Ô¾ PÁµN_=îÅ1x|%^@}NzT¹ÞËëؕ/Â[9Ismùl GH®Î¸zàQ9뎷V’nξ iîbD‹~©†Á‘¡Ð_5¸Ìp¢Æ8 ¬š’èý+J?ߘáÝ BzÌ/ÿ4Û$!—Êl&0¦ã,åò–fÁo%k;22øó´œQ +5ô耰´}Þw¿H +™ööíZ/þ 8/ëÃVµ¿N7OÞ²4åü„HXÉBò®Ö셥çkê4¬ƒ”¥>^LæÖìˆ'@OdšPžNµeÜÉõ̉™øá:4ÿ¸_iží´LHVx}‚ÿ‘ô'Äpà¼îÊw½(ÊÌИ‚¹¥£Îö3J» ðd›ƒIcÉN4rÙF¹°Â¦LÞ#sËÁzwKnÝå9X¬ŸÝyÓ)ö}¾8v™£fJ9-·q6AJ‡§/ˆ„’²“‘ÄL{£hB*9r€iC9œ^ãÔMË¢¨œ³/oXó7­;‡;† ´S2Ùnþ·ßˆÊÊâpµ…hƱ²¥Qu|åPÍgŽ„YAr· mº}ËAgÑ.OÖt够ÓúGÃÄ$ÑV[IløÂ3ðϱ<Ù°˜Mì%öŽn>óô•KÚ` mË7ç%”埂RJ~i=&ƒqƇ$¨Ï=!œ™¨‹Kڝ58z0úÖí'Ñ+è$¾™±ÖhMôо ¤#o•™2÷ Bê­5£êV†¡ç‹ú…£RÚêO¸8?f8 Ê͔cTdˆÀ˜˜Ía7ØÿŸv04Š†!ÜzàC’Fv{Bh‰WsëNdǖaѪÈêh ¬¿ ¥½¯(†êüOS€ (g-³íÞpŽW8‰0JCR§Ó“/ºXL!(·p' Á¢Ÿ @'ÎñvØÖgÞdF5\ãkfO&À·¹œv͝M”¢’˜º£rKÇÉ,¹‰–—¾ú6yÿÛ9'[ Ël”Ö1î8œ/\“ÅÚGÌ ^Œß(×ïàxx‘®ûYZpQ—\`Fm +ÊMD ä$'âPçéFêl xª”.xè‰:ºêÇ{>&É-ˆRº½ +(jëÎ0”ÑiÅ\0É ¶xäǐh™9¿ÜCñ´Øx=Lý.£-søõYzüOw‚‹¥NyŽ÷F´àÌö;T”¡vIdÌ6ON횪e¤{j¦ÄžàÛfn¸‚x -RÃÜSœD̯—[²³d¬ÿ1 ^ðÃA1âÊfÖ9†¸káþǟP ´ŒÉËlr~‡G;˜À؊¹ñ‘ŠíŸ% Djq¼U\_Aâ&à˜TOxà)]¹D§F Ãï`ÈWe„ø >ž‘6;JQ + ænàuk¥wåâB¤ +q‚yF¸,¹m'6G`æÒ65+‡Ÿñ2ŽùÊ´‘Éš¯ê\œ³üë2Ç’+Z¦ó€H $®ÆSâ˜÷H›gŸK?±ý/²kÊ‘Ú ÞûŐ³O Y—QT›f¾lMül§Õ¯ dÑʾ Ÿæ­`VI»ë9@PëÏþ|Hƒ¯Zu²Aî'L9É<»½åiJ­8!ÆáçoÀ¸t4ge§¤þФ—w칕{ss¦„Œ±<­Ja%’)Y ö&ĬÁ¢û9B®>Ëd•ª…ó7äsON wϞ7çé7è7A E=bN˜+Í(FO-˜ð8¾Ý$Y«Û,Ñ<"r†=ƙ'ý‚¸X†·º 4 ‰mS«(b¸"¨9/5Aé–déWFíb°E$³×!PŠt5¤Á2{¢]™áÏ|`Bv/ꜛË\”l‹Vĉ³ÍBLë®C±NÙpYk¯‘Qq™ˆö(MKÅ2ÙóŽ&vnDpÜö?bØáÀÑóßD ‹jokÎm=½Ñö·gõÊ̬Š”¦F³$±ˆ~V€R©ÕNfÆèzz.²(Œ¶ò]‡¿¯Å…ñÃس†TÊdm uöãY¾Rr#õ“X‰LÅ͹x¨ÖÀEFÉ–·î‘â˜ò?৏·b–¬yî<,(ľ{«#$@„ŒÌCj®m‡N|S£O[Ôÿ쓂Ô2ßcZ‘á¢~ÝoŜûa€¡¢ré—c§#8»}ùP¯Ý¬Öƒqþ‚fzTf×HihHX7–ûBT œNm|{Ϛû”v ~e֏UÀ⚙X"ôàܘºí•DçÛX¶8DŠ«U}x­ƒ‡ù—!57­Æj2=å9óèŽ=cmÉ)XÇuÐ1ÿ+2é-Tڏt60½Ô¾W‹RÄñ4);îâ°Ü buNj™ÉÚ`ÆG/4e±Cm£ö­xvÇqϜ‰ÿ…ÂŲ Jñïôó(ÏîI1Á=¤åW:XwØÀj­¢+éeó*Î 3ýQ(= ›Saý•uM«c^UÙ]CðQq‹:F»p°­Hn2Ë«\[i8ÚûPÓÎ ©érpÉú±2~‹ü{Ùk¶VlGòp£ôJ&>,ZµBX³a%®±ïÚÚ%ݛش˜÷\㞪þ »,¡¢oäzf³œ~M²ß¶l°Rõšg¬Qê¾°Þò¶¦©«—–'™wÓÂÙÂ{ãâ®à·—îjöæâ4„M-#Æ¡ÞrE~ĎA‡KÏÀM„’ÞÌJ bh“VàUL¡¡Çb®11`TØe!ɼöKüY—€WXZ*b— ‡Î?®"C'X~Žˆ38x9×ìPmî\Ø|ýYI§¾æ JÜS ±LBÚ^ÙÍÒ4r•Bð3À E¤%y¢‚®’¢˜åÛr•+°à-ÙÅDºÆÉæœ1(’Êeόn¥„;¹³²}4qÇEQ§‘ü'jVÉV¥~°¼ô–™wäÙq¼u0/ePnÙt Ø°tšKÂýXíþûst÷&Aþle;Ü¢Pœ(åšxT܄Zt Ï«",Ðϓ/Ùl~9–¢˜rõ08 +‹º4Î[֘˳5Ãp58}…RÃÀjÑIÐÅó%´¬ŒäÏùšÝQªñ÷ƒ'âÁÛM0'rѹ"çj£ÒF6(Ð<©øõ~DøíŒìú€=ž.™j'Tª6FÈ¥|»+Hºb&-I…™Ühðѐ^49¤0i•wÑ£J]ªId×Ø©Ýüªá¨S³Â”b¾x$£s¸mlÏÈÒÉÕÈ×6¨Ÿ+3þÝ%˜‘8ÕFQšG«´—¨ +nûõÀF̱iÊÓïmà/ìÕÌ}l?Ù^Cç˜)„kä€Ë¥< J +BM3¢f\øzF60ɖ›PÞ­S“Ê3ó¦Éh3¶Oƒð•§ÉÙL”ä]ŽJ[ýÂï†Æ‰`¿ŠîÕíÓ¶U=N®d/³Ñ!¬)@Ò!úú™¤ñǪ:>šÏ^Z‡WXŽX Ë¡·+?Jv&+Ü}Ê iÜ obþÛå´;}©Æ(ôZ“Ó¤`¢š•ÿ[þm³ÕˆÉ°yC”,ðòNE@2÷Þf‡1½ý`·Ð-±Kñ5£¦^mŠä™31±MeHÓ£ŠÊDÒ#(üûȗtB“FœÏð‰ÕdMÖ@`#õÁœPDÁǶŠo…é+¡^eW% ÀÁx´IJ·U"âF¡t±„ÝU¤xEíŠ%áTZX¢sœ¬Ê.énÿ‰²¨“éHçÓÁ׋AAƉá1ØÁüɐ¾§%¹=H]FþSÒã\9ËÀVà™rˆ)+>ϸ#`ÕŽlaf6ƃä *™ÈJ u„‡)2¯Z”¸ÛZoa³kj_è­~¬õµè9ŽwEvgȧâ +•ŸÄ˜­ L÷1ď+5û¡+¦Ùeç[x¶ò$„“A.+±s¡¿ºÒî•'M)-KÙÌj8¯"ùúáÐݲ ñ>ÏÉÌ®†n£ ¬CV®"Ñ´‚ƒ³WNΝô:‰Aub©×B+ýo‰¾îî("Ón',¡;s¶{eZv|É E¾ˆ‡9¯K¹P¯^y¦åt?ü„»^ë;B@¬Í¶l¤JÁ˧ˆˆÒ+µ-MNF'2S]Ab”ÏÍ-G¹$©R_!›àïžþ¯Á™Ô˜-s‚°  ¸©¬xñ¨ÓÌsžä«®ÒK@5òþ76&DIþÓÀànI+wãt«Ô ÿº1Ñ_Š‘so'?º’?¥åÌ:”êúG¨&Ȅ+Ãtp‹*fVz ô/iN¦Dùµõ¡I6°Äßü1¡’ŸPJž­[^¦/ЙÛéø¡Õ@YǦc!íG™pô„ðç%Gë·«f@pM«-ƒeµiç ø’c­hXг·ãs +[P*Fåù–VWš=w¹p¡R&N•}ÂáRV–k|ܳEàc2iâl!ì ©Yäë×Q¸á|éÕ×]­ƒ1CÅl“MýÍ&æåF? aqJV $icú¡Ôÿ|+;šÞÎlÒ½T C1Áh8âBòK®q#–Š^ª¿\¤œ7‘Ä$â!Ö¬ѧÜ«. ìÒoŽ!=_y¢ÂñRÙ6r*#l·ŒÛÒ|-œí‹¤h•çaý·´ÈÅرâ‹[‡ +%áB©¥ý“JK¯ÄÖÈ{T$8ÝdsÞÜý7>*ˈ"ñ—ò#¨o{éu­âm©Ù®j¼WÌýkiÞìELh»ŠEU%FþÕÿ¶ðCûU“s +öë‡? "yù{ÍJ¬X2ò"Z\j\G•E»K㓎`‡]y +vµ‚o%/*Iµõ‚Ÿ1 õlflÚúË" JÌ ð!õbꏵ\;¡X"×÷æ*©ÄÄl3Ò½é•ü ÌN¨êž›“¹J63FË.ØëøoõeõÏ5ðK’hƒ•­Ï›Øì`€åh¶B;.ëªêäÝÅU| çþ–¸&;ÝÔߕÑh…8©Z$L&ò4ÖèD]Ž+x¦NèëBÈž`Ö1žeIKÙÕD)$e¨‚òve8¸–¿öV9è&MÃÀr{ÐO$,ԈRÈ]Éáuyr +¥•™ŒÁÒIÌ!‡¼MÒÁ 8¸†^ò„„ÿfÿyD¡0Ò÷…à¥aÞk%à1 ’ÏtÈWàOצª¿\ÿR@­ýìÂ^wâ?ãZnÇZÏB¾VzM +)AÝ» æ i|A™úÊÖá´¦S%SÌX4=ÅÅ0Ñ|` +4ù QÉÒÑ´€Ëú2.‚sÖÊÿw +·—³0ãD±]Ó w´¬u‡®a7¿uЧvpuµ'à}h¤]vÅÇefÈ"†YÝ{™}Œ“k9Àeà´þ2ÁÒœ<.õÊZ^n1¦)€ +ÝOƒp;ÓØSéSà#sØ#ûCÿ×R_ ¼X@œtF3Õ_ +uM úã»ò(q;ôNX­VTÙkRp›¦eרâ'Ø)Ô5VøŠHDÊ.Q¿vÖéý¹€ž 4ÌÍp#ÅÌúLHõTÈý"V O…êQ"# ì͖õsrR%ïfêÅ/¤!Nä; öaR¦¬©Îß¾Ýqv=‚îÂ[2XåŒú*<æñêß4¢¬y9¨§iÑ´Í|¢rP—)|u±Ê`ŠW“’³R¦<)OrLÌ,Ó ñ¶S¸t½òZŤ”¨`j4º«ñw‹Pˆ1`Ç ”$T‰ +ù[¾ Óãù; /‘ýE¦‰8&vpú)‹€G`¦Á;'Ø[vpP×ûK«Z°$"tş#·A:5Ť!÷q™CÐÿ¦¶Z´ÅEèƒduÛµHf_x½C·ƒBΗõã¯rÚ¬ÍئÙ*!è2%ÑJ Ê}0tj”ˆn§™ô®påÙt‚³-.µÍâ+--Ò¯ˆÐZt“®!u“u†ÄEՐÕ`šjl ‰C΢jH‡îǐ]œúÂx}-Ë4)f,©–×µ,úß Õ2Ó¼–-°®j]¸–猚)1(}-WËò'šUùxÜòo£„¡þ*J5—?!\êÎ5¾¿¥|7\~%䈥öß½hÇè};æÍÑܨՇËӁ„TͪŽÚÎ%„!*«Ñ’Ôñ4ù¥K¹J‘+sõûßÿ9€k4¼Ÿå +ÙHaU:wÓ©rS¥t„žöÔxߕ®õH¿Œ¯o¡ ô¶[ÉÀ¶ LŠ)¬EY8)ï”דH¢'ÓëÊ9X[Båt ¹(J!X³ÓÉ£Pó˜!8‘žFúŠÛ"IGJ-Œä*}A÷/&V©;Ú«>ž?çcS˜”N±·QZÌø›C³ª,/ ü®ô? úÈîÈ~¤¡l=\¡úCÒÀŸ*R+ª¬~ыƒ½t·ˆ¶ŽYfý¬^¬gâá2¬Àk³°Ç’£SNegVíâ¡V Ó·¹Ž•@jÈ÷w}Œp’kûd#»¸ë53ä"²kIu‰2›GÄ(^1nó$Päí»ø(z¤nióÝÄêQí2*3P½¬† p‡u©BjŸb¢G©¾q)m’> +ím@e>v"CüÆ¢Žã2 7ÂúbòMÞЅ3ŸÌ–§dúël°•o‚·]ô]ü°FéÑV†Xo<»ˆïbÑ&RŽ£biª1ªï ¬áuñgK¬½4O¯vԁƒŠ®îŽLf}5;´^EgY+]±²§ Èᤉ4P AAà¬ÜðîïÄàtž,>‹ GÂü/Vèb—Ðp èñZrì,ÒÀtð¿,r~îêR c;kŠÃ+6۞븠›®ßo.d™¯cøÙ[󡯑(¦ˆÜšž$Ë{M·Œcšï²×8¨[ñkTŠ)ì÷‚ƒ ‰t‘9é—µ‘ØÄ`L¶–áߋû—Çq Å1a)y„ó¬;<ׁ&F#|0â9<"#_S‚˜Ù:<”“ÇЮ.#§»îë!µòTø¦ç¯eøáÏõÄ懂Q0®ôóc}1+¥öy\¨Ñåó@µ°KTP)xße·˜>ü¨„|mõ1?jzÍIÓ»EdŸŠõÝÞûžÁ[Ùqtºï–ë{\¹Ï?E:ìÂ«‰ô»@uK&mÇõà)˜sl[¤'©7¬ÅNe4µÜ'ŒùLph’ü&ÀŸœ]s·`³ý &WHp]Š_³-òـ¡iû3ê£Wµ“Bxû|_‚&6ü¯¬„;ÒËїMŸo<5€ç58íø;-rñãR¹dgüÉOÓì¸2_òÖ@“€D™—91ãeqU½»9cš‰A¢lǪǡ°ißds¥%TéeÄFµ½¶G ÝÒâ›ß[è88ˆ¸& ZÒФê⑺”7‡æêìܛï$…»©/&‡ª~1ß«ýkSп"ø,‚‘ª »þÊ2NúÀ˜üŠý=:~ã òúÿ®„4—á|—ÑW8ÚYý¾á +WÌö)&™!1î÷bŸ[[z¾ßj"(d (FóEëã ;âúöÐð({`°CÏ}«ãc‰S;ÂZ÷aD'I.4Û¥\C‚£w"…‘„ ÑO=W>juVDÕ9’/ìUM˜ÆÀ›6é2A—GÑÒÄàb”µ“pãIâK ,7šÊ‚7ðP¹Vg›Ç¾5ÿëìrácù²(¿{8;Ȟ:xž@àí›P¡R󫮟áã¥ÛàsÄ؆ÓRbÊߛ LÚ!88›·Z…_hˆiw5jÐñP©×*úì«S¿Ã§²«sPê  Hk[Tm¤‹ täDéPÙáûŸÄ»<­‡„½¡3r}ŸÄhI)füÍMÿ}þ\ߧ>éë|GÒ{=6Ÿ0>k”Š¥·MÖ:ȎÚZè!Z2awƒ)#ì.ªóõìDS÷Cß9Ž¿‡ kã¾zþ ïEºÎxuF©šè•óËÄ~oèfÚ Wtÿ¡V@×WÅД>7IËûL»œ)Ü|~ÁÉ_®; +xk0=+4÷$~žœ%§²,ªø8V7c›ɏÌ}qRã°jp”·¥Æ{Nú¾H¶R@xò+;â‚|Y‰_ѐaZz]~~½¥UìÞè4˟_4R’[m Ë‡ ÿõQEïäiÚ´ +›ÈðgÆoG¸]€8Þ¥_Ì_ȏ‰H,}ÀÚÆ|9êùÕ:ç‡ÄÑ¢4×)r혛Ԛ± +¼*ÒyìÕÍÜZÒ´ C£+œx!ñw¼ºÏ8‡òÁ烯±Y×÷ӏòi§È.R\_1êâüºløØÙLw¸ºóúGX#8Ï- +­‚ñUÙËÿf xþ™Ä྇Òôg Éû•_ +3¤ëÅdñ3ê¥ZjûÌuа”zæ-׊â÷a{™¿ÙOÕó©´bÚ÷V¾ÄgÌ®;ì+¿?׋ý4z¶†úŒš^R¥`ø;¯%òš]lNÌJ“‡Í¸¢OŠÁ¾~dÊ*ùŠó< çn½­h¶ñ°ˆ>öÞ¥­~d6½ + Ú +Π-‰Ìê à‡¿Ï÷´•ÞEóåئõþk +f­±î02ÿóû¨Ӏ ö&¤ +k†N€˜»µrJvD&¨€L´Wl´˜v´|§òO™F<]B04µÁ¦5{z#‚Ç5šy€ŽÚ Dñ¥2Ôàˆ'âz›CN¦Ñ ž|bïjnú@¤UÃëW.sÖåJxU<¶©®?Iƒ‡ø ×ŒÅ˜c‹–¦ +(‹&ñ™v¿PaíT§3>½¶|6/Ï@­Š]b|è¾ê8u:ÖôctÄû+?;qœ6•yqUâ÷…“} Å`7­˜¨Çk[RlˆU§æŠzý¯ÇK‘= +Ç5!u?€ýc‚Yª;)¦Y(¹n9µV'©6 + ô:Ÿ¾ J¬¥5Q¢H׸›ç’´uÞû€´ +›¢òÎW|»Qûnë97Œ‹„>ËlrF)ÏÀ–!Lj2\‰ˆn‰÷ôn +‚ÛhûeM '¹W¶÷®žé®˜*¾†óÔiu\Èhú<ÔyºÍô 4րRç÷°ä5:6Vö“£¡=éô%Ÿî®q§_xÕúPâõÑzI°‹^?¢í#lòxr-RÜñ7Š¯Æ}íÝtëñ¤¾‹¾ +]!6ݝ¢e¯üÚàˆT£œr¥¶(&*MiD¼þ34§¤´ÿ¦sŒu·'æËÜdšÇÓaڍKõRó«øàa:¡é±§cH˜’e8y<9ëËð µ'…È;sB/{Á¿ÕÜ&8í·DÒ×ȅ±F*¡ÓA([òÅ>™†Ö<¢¦H"￶"BŠ´y¡P…‰ «q{YúD({ÔzWs|>¼³Xç¤F*k¯²Œ³*n“Ðn+tËY ¯ƜPÀœÙÞ#èRVŸx†œS®ÐŽJ rаœ¾èþç‰h¿ž!6¥£‰ÔˆÌ([ý»õ$L¢…êÎ7-ZZë½¼ÙÚñoZ¤ûfý ^ÎVSöÄù‚kdTTÆqBñïÜ`nŠ†6ZÿZ­éÉ dQ?ý |Ìò9Ê•]+Á¿šÅø ½A†øW‰Ø&L±ÇYý›)×XËL-¼5ýKx­æH š›â +õUÅeÁ¿é&¥™‰Dóʸÿ¹æ)„Cõõ/Ñˀñ¯ˆú÷B/ˆÏøwø‡Â·œoŸÔø7œjälý«¥‹÷,&R®Róé_ü›ö·U?§Xÿr­Ä™ã½05è_Úïy@Ê:ìZü»×2è_ü¨¶îMiú>þµ›×í;´þuâá‚ø÷¤ZÜd¤‡˜ÿò.K&~M0›'üÏ`&ËyO1B¬4šËh·¬jOÎоDXîÈûÃèÓ +ꓟä&iS@÷§ &úǨ6—õ® ZÙOhà2Pe9~wqI ²^o]$¾BˆÕÃÝ"ó€ßˆæ%)~%J2sÆ[; +²)µD=¨=Ä8|²–?în·èuçúy8{8;ðiý ŸÔóEw`HG"Ni“ø£”ßdxR¶h/_ªgPw¨¶âºÔûˆ+{Ÿb¨·x3êZK»Kôö_ÝË-¿j>®PoUéeßNU“U¡^0@ |öÝBLnþÇ Þ.¹‹ÔËùk²~=4Rƒ ì ¦Æ»ÖíöÑA1„-$Å _—lÏďy½:öùð›‡\/ZÊ$!ü øÏøëÈp ³¼«Ž½[[wôܽ~û(a$&ê๕*xçÁ.´ìŒ4j…úù„ ægfé„ØŒÞò¯¼§kÖ»:Þ*;DÏ_f$ª»: S1xS@ +²óGϯ.;¤löAU×+ã +Ÿ YZ@äÅÜÐAèåõ@Aˆ í+,÷¾ïSâêÙ ˆs\EκlÖsƒÀ›ÌµscºŒc³â‡„7Æ°+ÂÕÒëÂÙ뭘oXÉ'ù¸a-Gt"qlÜ4ôV¸SqÈø:©…ú+]ñ•>&žà«¼ y_1$›®­ð%'gœ‘wd2„2ñæ ñ9àÜeá8=E€‚¸ÖªÕ.S™§÷\¬0¯VaœeŒÍfÚînÛT‚[ðÌc&+Ä\6ÿ¹0’Í„%¤Öݒä?ïEg "tӛÃÎ'ªW®Þ°XÏ­—d=¤¤0¢ËèêEÞͮߛaÐ`Ì°Á×µ\ÕûÈÅvL1CÞöb£êí䦍†21Y:è*#¼€?{,ú-•È‚ÒFÕ»Ÿ=UÓÓÔªˆl¸z“çïãIՋ+œA媗ÛÆȳ®^îY½ß«æÂΪàê}.&,eoAÕnº6óX‡‘Ñäª7†šeÔ»ÀáÞ3°e÷óŽ8Èß-,wF‹ÄÌñgh ˜‘ò1‡øMEÄ#¶¢Å•ÐJ©æ +è˜ñî<úTvî×lª»-ó$>È:nÈ  ™þ`<ˆôã-t=L›y  œN +¯A!ÈT·ŽfT¯Ë &›!ÝæOg­¥Ñ²÷¨ÒÄTç`p­ƒž4fozõÖ×]Áàä½ÅèÖzkaÏâô½I!ÚþåEE›øs.¬dkÊѴ—¯îk¿IGŒJ%Ø,2»I:.LßÚiëÚ>3wCXҐäu˜1¾¦øbèâ/¯w@X”6ü~LdŒõkÇM{ï@ó¢y«¿ÑóãÂ3õˆá½ç¿/¬@úÝ«ª6So4—E@.Õ{‡êÃ"Îc\ژ¡ÒòۄÀnÏ?åj«ßPòÿËS¹’¦åØŜšfHméÚ¤ ¯|²n ‡¡ +bžNáAæMZ(8(¯}ӘJ o`µÇз» XnÝLz‰ñªÉX9¸R#!t›ìýŠ×Ù®F›µa’àݕ+å½8Þ^=ü<$$AñŒ Á¡Êùú“S@[Öëì†p/L3‰e¬½'¥^ßÖÐÐb™j»–¸«ÇÎeŽ–ïÑýM½½èž¼GWü•ŒRÝZÿ>méýÑu0ï†r“«„gHÞ*홠Ͽ¥i Š®~´è.ÄQ˜ fù'é‹<º ý]XèÜtã]J—J22”Êy«]ÂQDkÊ6dX©ßZZ‹0CÂù]ÍM€Kôì>?^x DäMDl¸ñÁ¦°0Q֋Ì:¨AäŒ7uT.A ˆ +cózúñ]2yò‡M·?"Hxæ´~˜žË¼è${ïdļNybw ½ÓÕ¢n¸RZ[Ó¸™±Èt#ÖhWI Ÿ¦7ÅCLWÿä"#uÁt[þºd,ÿ.‚iÏtݍ7-nª3pÆ.†¾#ӅÕó,‰Ãt+ÁneÐ#†¿“ø?ˆÒ¥¹*‡éêº OkpæÀÌt™ÀÉ?ƒ©ï=@‰tÁ,ÞYß۝(sEèãâQ³dÆÁˆ_û ¼²tÊ+T+úKCre0õˆD‘$Ÿ!(€þzheôؐÁŽ$\:¼#Êû‰Á +º2ž.,|ìô1?ÀÌ&§ºîs(D¬ ê +”ñµÅ† Žº£*ÇɪÝ%çzV‚á2Œ§¯ùW'Pcì•™¸ñ˜–+Ó^J3X6’­0)õ'¢™ àñ a6ïõdØmd6£=°ÐÞgÒ·ÇÒ”2{è4©ÏS ÿτ% +oΉÈ7oÑÕft<¿]êU}}Ñ©IzaØ¥1â¯ù*ÃwñjªD/uš8;¸©S¡)PòXÀUxú±š¹¼tr ˜ŽòôrºËNX w6ÖÝ£ø1“­ZÈe½ç«Lˆ{fç¹çnñÞpcRìÌVÎ\’*¯•ÒÆà6s£j0‡ƒ÷Ÿk¬ºžV„\Îìïaœ]‡_OÅzžØ+º +c6ºõtNÈ \¦Su‘Ð ÃÚC'¢?(Ô +A¾4søÛ¤Òxd—Ñ…<”8K72ú'{íþJëoÅ´˜ÚrÈbÔ¥ð;\YÄóþêZÇ99+gñ¨¡öÿź}h,Í¿[Ž{6$ºÿË°LW{A|é.ÉÊÀcÆÑtWJ ŒÖ)í"¢8rê‚ç}å ?Q;îøzOÞ¥j'ø¢ˆj+ï–K|=碒Ó ?t¨M¤¬ÚŸ'Ï¢\gNþä[ç¤:e(¨«¡üš•Gâûd +,òŒ¿Ý]oµ‚Xf‰TùQŠ€Î‹8oË ÙÀhpÖ«îe&¬ŒÌ\ámœ{´’Î'´²šŒËFً%>û4²²|‰rÈ@y«ËÉß©-8´Š´l`Ù¯2Ô(­ÛMƒñµBµéÖLÖ­*_SÚ8nŽ2áýË,7]ì*ÖÁÓ¹Ž¹ø²’ëv/¬`—ø–à ŽtvOåWT²Á+¯YŸd8/Þ¢ÿœBÈMÑÚu|º)yz!d35kX¿X—Åw…›Ž$†ÅçÚAÔ FWWÏ+;…ðàûãDî£Ám´ÖØvÌãÏì >ÕÃy9åw¢7/r +ã¢!°wF©¦N³MûF=¦×0¶¦ùÑÚ4Õ¢|¦u$‚"©ͬ©CÝ$o¦aÆíõû-ÌT8ÿ¾¦!ªSˆÊs-«>Â%Ô¾%>lŒø¥hʬ³’ÁçÜ@‚á6䢇ÝR’Û‰»»[±&í´î¤íÿ9Š‡ÅrA ŽZ"R%ÀB¯—Ù…È°ñˆ×âћŠ÷áY K“b¤¦g¶†ÿ‹£¦0ØTO–îf·Æü4¥eosÔλ ô˜9×Åø ‰7b¹˜ +4ÎSÖ̤OÆt×÷·\€Š¨²s#&ÐÚ/#%|½Z¹ñøˆ™e _7¾ñÞ|©b2¬EÌ.>"åò†}Þ¹HÉ1«‹‰„{îH—E&Ëh#m¶–ƒ¨zj˜õKCzóIA©¨wwp•8Š]: +w’½êãOüfÙ·–cKµ>ÿúm+ŒÄ9QWïÊÛ(Ϙôù¸Æž«${¹OEå´UƇkÆMÊ~és®ž7™¦{ÐIm©³äÍa¼ˆÄ¤Á=¸–¼iÏÜ|TÎXuÚ£Ž82>"ô¦Mg¿0©Å«ár[EÚ·VZK{Zø^ÉXMfCþo\ÑûŒ²F:¬f¡À¸9¯]ÔGÕÚáµ FÙÕOȖë#§´3Œÿ 1¡,CNbå"5Žn¥Ã)æM¨þï’l¹ßL(qË׊*±†¼XH~}L Q½ì_¿ø~|ÖHER½¼Üëü%Dº)irÙD+yç†EŽ|sE¦3±ã +êìÏxÇÖûAÎ{d—>½Ÿ¯âÛü¥)4Æ®×÷ ÞƒäÇ"ÏZÐ]•frbLìM•:×g ‘ÑæîqŸ óò¬ +tý‹Ð¢M€òjÐpô…E¥}ÑühHše¶Þ]9¡uKà%œ½ïýÌA«°-:j”ÈzVx /¯¢u+,:.!X ¸0³4à´/²£â”À$âÂù`§ÑZ†…†¸€ÚÐí/:æôq.ˆã1]Ž@vº§&›Î@ûq~ê¬ý~ój6}[²fÅ!…Ë+é=ÌZçÚeE| ÎäP·ŽŽ|Toå5¦Ü_§–U¢£Ì€±÷gÈ.^dL Æ[י¢¯tl@¤Ãð–Ø%ƒmE‡¶iƒ"ó`ôÐÌ”ŸdGÃ%_ó˜ ˜¦ÆúR˱ÿj6‘”s,ùz+H^€ª\—"BT5X_Ôœþ}ËäoNHßúù¦ãcë„ò-ÇPFÍ=œ?GvꖜZðL*·èõ&`Wmh±^§ÅÆèf¤.ÌT3î콡a;4§æˆV:Ô5E¿PÎ9…©üPi™=¸ ЀLÿ_5)¼ÄÀ…¡Î†œ–u4n¬ÔýþZ98s¤„ᣁÜx¹ Zº®/B„Ü:xVсì(x + +AÊÁCydÉä'Ûð I99 ë\öVaɳbÝ,§vz f̝Ná$´€ò#‡ 1üdéÎø³x2ë)˜ÊHôPcœÔéD`ľ)ÏyÐ<óp$ úO¥Ë3D‚%Î%V5+­6¼gF–ÔU£±—ûdÖyÞãœô~÷š1CŒu¾OBðþÐA¡¼–‘Éé_CÈYîzåEö·[Wê÷R*ûXÂœZxҔ’ùŒåPgµYÐÀ}»ŽÜJö’_Ø 1@°´–b!qX saÊ}à÷ˆðãÈ`@nÿGÞāÖv¶úy¨öI}—Î×æ~$óJã…5³.Ì.}<3U_èr՗r÷Žè=C`ï¢ùtÑðX­@ Ô©Æ{J¡ØŒÑ,Ž:œmx€þ®É¸›â¯ŒíR‡ ó¢5{ ”Ë,¤Hç˜iøÛ]և7í;½@ÆFXµ¥n1K#4¡níkp+&j$À‚9…W”ƒÊã‰éž^‡ÊŽ]j@֋þPÍsEr‡Ë&ÍÉ'b¹4},¶¨<ƒø|ùÁ=ã­yI¥J >ŠŸ[GjèšÉ¸àÑ´ýÐo1W)G¢)ö³+º·®Žod£ ìëžØOê>¿ÞCÛzØE²áͺÚHÓh(¼õœÄ»La\xLÀ#P|Ùýÿ§ïƒ@|µ±`=²&£dõèN;áb<û[½ç:Ñ@ŽX xS»¹éÁ;„ØÓÌå~5)û ;}ïÛ¯e3<ÑNKˆ$ì&±?[Ýø_–á²¾Pœ,D/‰Ç ͑Ұ½V=¼<½ò|gâ=Î vÂt«E¨¦1`PN³Á·ÔÈ4î +²9Cái®žCDàÔÓ¶†°ºê¬D‰j2ë>N©ùv×`¢ôR\kxÄ ?;i'øIu³Ñ›D<Ÿ†BXíÑeÈ7(dff›„Cª:¨S&ˆ†:Ì$ãbá¨ì¢¨¥mWt÷y÷‚‘†.6ó,¶5"~ûèâO1Ð8©Ê úÙgdk+ç7GüXB©Ÿ•ÙÑ’²;ù”À”?]à}ÆíûÂIó`Ö½ ð…%`e]­%^$Ÿ” È~­i`!a;V;6ÜX|J xç2kû®fN«=´·ýb²HûßÎù5 Ê47À‰ÎÄø³hŒßæ<ÐÛ w{xM÷Å·=z›’øS4ݹ©’M|SZñµ½ó#ÏPwÒ¦Žt- lęo$Hñ‡Hyv¥ù5€ùŽ¼o𱑍G«Óÿ²òaèû ЂJ£ü,_¥ÊT:¤&S+Tì__“…ëÆû/q‡ýýr•ÙÛ¿!ŽÉˆ¼íuÇwÈÜ×´—.ª)öÌÙO.Y5¨å)Œ¾;‚f›¯„ñzß]ÈAçeÊ(Vk5òóçL_%c#=Ž×ÞO²r§˜#i=Ñ="‚ò;ÿxÒ¢¶Þ¢„·MŒÉ•"þÕ¶‚Ûi Yµa$ýÝ'XÿD(Þ¤ *‰r¸†óêV˜ä4e®ŸÕ¨ƒuM$'t‡3œÛ4•´žR© (]þ5Y?‰¢/gF ¦Ä(•–úÅBðz÷¿ÊZ{Ï5ýƒ‡ÆÊ"u^·ât ¼áÊxCD‚Èõ[%£]îîiOU:y§Ð„ՐŠ¨Ý{Ì Þ!Amo䇥b|`“5ÃMD^à§i%÷J@o²bãéu¬üà”Vóøܜ$Ç*J.G`V‘È”Æ ê*¨­QIýSeÙ{Ë·sXxõÄÝ">ßÇ!fpÓ̪eßñ°µË Å%m5]1´Î®]ݓ`)ñ%ãùŸujkß&¶Reþ[¼Ï¡Ï…»‰ê½à,búг!Qœ“ +Š} ¢EÀ Yk.dhâ6ià”¼]ö…“¬ñÏy;†»cØ&ŸµJÎó'¦í5*1/ÿõÌҘ­cÂ\Q}#MrÕÚ=3žxÉø×O9\xÂsöa5·—¹…k^ZóÉÖ‚¨â‚œ"!^îÌܚ’r™oNH4}ŸÐ %£ZVp!ÖO§%3‰>‚d¹£|æ$~Z՗2ÀÍ'Ÿ™àý®ÀCü4¼žuhYŠˆò"q}63wé¤!L0•B4n¿£ÅÓN͹~mŽ26TºòüD0S S«çÑ:"pTîÁOY>l’ü‚Ÿ d}¯)«>Qÿ1RÏTÌRº‡ZCÒN8¡SÉb›6͗%w¯ÕÇ}ç¡UÀò…°w¬V®ëȋR–ÑéßìØY;KAVòù¬Aő7P +|ê·EÚÐ,Y%%9ÖY® ­FPo›ÿ€"nI–-픁1“»ùœþqñllDg%†¶ÛAû!ì¢ô@Pú÷ æAs0AKDmÀB.: ˜ø„ânì&Â@ÐL Œ)°4ß²ØO—”BÊbÍHó÷-ZGœ¬ðÖö×têãeò2j@ —®ÌOˆ=·Ž³ÜىW4ze8Å1Ûo IPJÆó¾jBYÓgfŒùYx1Ù€¯2>Ôqš"]4€mÝ/‘ú¯°ÝrÈ2nât¬°óœ:Ji€ò-q—«ð@ˆ9<žnK×X&ä_ž[´aÊ#,I!„f^;ª{ØþKâl—K3M@x9‘TBð÷«§ Ъ\°3k}‡b`‹–W³6„ÿu)KÇRþ{ 㖠€fÂÉvë=PHázJÀe¾ß á‹W\Ãp1)#à ]ÏêÓw”Q*½¼óC9†š ƒÙoqçqÔ¨ë“MÀ0 Ý$m%ÞN?¤£]†˜’"²­ŠƒlÏ3ÞY¢ÑŽBªÞ.G5Pqm©Ë#ÿµ¼ÞlæpfÅqa›#Üt €‡2¿«l=†/m=g!Z¬Õéö4‡3®Rf~Ú9k¿jõª$µ“o'æy(Պ¸¿í`4Œÿ{1X ¥ +sü§”ÂÄ OÌAí'˜B{!·5 uÏ&•fNsÖÑsŒ˜ZOÚi‰]|¤Á`$Fá ;ÙsŠáûIºšeñ`VòµÊ KyËÆÒéd†hZüÁÑÜvöI0Ïvsßç¸ñ¯~wõ(7<|qŸ‘'àËQ½ò_!4·g’¢Ã2H>ñõR…ȬœÊŸÇ¤Qy<Ó}ƒx:A!ò¹Q¾aðWârŽ’ jŒ’¨%óé°Öúڅm¥…&­}·”˜•ÕiM¤¸‰¯& 7Zåÿ5Ð[5}¹–Ê}-Ñæ'@ï³yT¾G‰-ƒ„å5ߖ-îùfLáH·6Ù§îÏ!K}v.ÁŽ]Ž;µ…nýd[ï8 ˆÚwt½-ø–ôé–_MŽºæŽ‚¦ñºÑƒ#.UR™W1{$–ö6ifMÖìgX ÝÊÅ,Ü5Èò”€Ô:Ä¢FDy6¿¶ ?@!ܵ]²èL|»wÈñ5Œ¦bÕ$Ԉ‹4ñ©XÍäÌGÐIh`Ò´±r(œÞ'c¡~ï-ø‰Ã+NÉÁÚV¿Oô Xü(v窹n²¯ñG«05Ä×#—‡ìb"nËìªU›UU KÉŪ1ÛhÆHöqÿUwîn}Kԗj•ûHXÚގÜÀÉÞ¦ÉVNáUwœÄf¢iØV_”TTÒtYÈyäçÑ}c"ò&wµyFz–èÑ:eÛFRäÒÿ3™Ã¾zd ‘A1˜æ‹¸Ø Û_ËAÊíBkoXõñ´w§öÁÕýeü‚>Lž¹‚M½‡ôàõí; ‰Q†m¶‹aÿq;¼ ’j†Ýä,õ0™»Í©Æ›d¤¢ô7Žº©Úˆï_p4¥V2ܛ! E©#ùÍéÌãìغ àÚn mà°l5á@Œ‡ð +ú Œ6¢ªAŒ•]àØ5ðÝC>µ¦›yvÓjmÃÄPÉ ¿g‹£«ò[ٚw8t”¸zéÖwÅ»P2Hû“@§Ÿs\‹yrÀh¤YþÏ?z{ÎYÀ:É=N~›Ø#âùý^:þ}ÚÞᵄßtË¾ š ڞ6ô|-eÿ R +¥õƒþùSt!åÿÏ}ìþ03@«Ä5ú'/\p €Àz-=&A\uæ÷ª2¥”¤”xØÿDuœ§§kg®K+"ÅÍ9IJJ¯qPú…K " +ŒE`,(£UìÆówCKh?B±A°^uÏ"%dL5®Ð¾&fûøڍnÿ©óêA³ŠÕÉÇÌÏ {ê5]·ƒ2«ÇhÁ( JÑ¥ê 1UÔ.ÁAúÈêcm8‰×P†Å’•àÔÔ¤ ¹ˆA|µˆ(è—ô§û|(P°Ôâ&Á ˜‚Q¢`p(›ðàdd]H#Ä +SÒì#]œ¢O* ;:HÂ3ã ù’àñ¿O¥…cq±#Ò© C8rÖÏ8–"ŽMl¾!ª@DKC«$ï†(Š]|xhOÍ/wgź©\7»H´±TæTJDÔäˆaÏ鼞‘ÙÔ~™`ƒÝyý?Çé¤×#Mü謩!§ÜŠ¾ÑËƹ)Q;¾ Ž*ŠSáÒbœ]1ë5!“ØâTÃ`(ÓäÝá+jä§(9ñ¼ `¢pá[x"7ªH5Zˆè„$eå%Gq*ãÕ2Ũ˜bC~Léh] Ϫ¦gßÕ]u¢:è$“ÕñùhA©K!ˆ¤ MDF´KdgD¹‹>ü–W=”‰~ìÑÓ;UòÁöŠä‘Æ‹n“OŒ•£¨Hbý£¢z,n³n¦ ᘢŒ%%éœE¨2‚X"“JuÞÁÏúAPÔJ;á¸Éjn`#ŝ2ëѵ}ås¦3“î£9N¤ƒÏؐ‚(E*ýҌ™{k¾.iҌ‰1 ±õ œ®ÆcVÕU𹊠' +q‚Fµ¨÷Q †%z™£>4µôûE*å· Î&㐞êó¢9DD™©Ä Œ¨æQ¬ˆ¢Ä†*‹J…¤®m³&Ö‘êS^ŒCo•5•íQܐ+–IJH…9'ð¬'ðœIœ‚ÈTDb”ôs‡]ƤÅb‹þÿ•héíT&¼Øbp±Æ -òR™šÀb…)vS-ÆzšŠbÄ8Åò÷bqÌâìĺ2Ea„…¢ü±}L‘Ey«Â‹§´­z†ŠŽ½Èðâ<彊αMÍ^³¨Î(‚‹ °€ íwm$ú{§° ¹êUä$,3VŒTS\>V6ÿiý0?öâªêMŒöޙ?ˆ,ûcåBaþCj…jƒôª,äšCµ¤kQ”vRU5&â¥ÑW1Ó!h¿l¿¶~H£‹sFU¥GtÊÔ¢.$ÇPýÞ¾L—ejŠUaÕb3ä±,Tÿ ‘û’“â¢aú2Ÿ¯êŽQÂÞò8.óN4‚Z–×!$‚,t²—M•íLš´ªÊü[áñDFâÄO(“Mþl5‘˜Y¨_¤šš…¨ˆ¨k*DÐù"Yª¨V8Ä9FcÑa Ép~˜meBTR¾Q ÙļÂ*ÄT­Ña>ÈÐÛZ:‡TuhVAAa6”r …ñP'“ˆ‡ñ¢B% ¦+A5iÅB±L‰b²€ƒßQqKˆEÎ6N¤®?ց¡Ò[Ò7]>Å/ SpõǪï3j#Ï".Ãð…6$u$a'î2›{è ´Z¥+²xb‘aІÑ²ËâYß®j¡V‚â®ÈÈÅÕºÜWˆûÁa+‚&CNöÓáRÙýÛ$B…}" ƒϙpW‚á&ð(Œ"‰U÷qx¿à6%BîÒÛÒÎcZçBOè҈Ž¼g­Q‰fŽjˆ×&܂¼½ûb<§Oìu‘HA¶× §È! ò+A¾¢©.RÅÃNÏGa ŽÂ؈hŽH՘X9ž +;HÒHä­Õ˜Ê®éZQôórçuάկ6ihÿ¾ÃG\ÂýK±0Gt~·uæœ$¡‘…xñ>£&ˆBI(¯QƆsŒ#4‘(5֒iwæSIÍö_ºPÛI5¿¦ÜÅl–]f¥w鴆EG"Blp*97Ó_s¹08S‚†3Ä0m'>“ ­w¢A—“AGj:£Ë“˜ðøPG#ÍZšÊ„"âò™v¯ߞ0½ÄlSzƒÂŠ•0sàtZR +M…¢é7ú»‰s2W-¡Ön`j­b)·Ž|‹KÃÁ¡“8Œ+± -eÎ%HrY—*3VË61A.x.R.$Ôµ_$ôÿœð¡Ï11ß7µ‰—¶.“‡­¥õ„yW"ä0QÅ嬎öMÒÓÂãà^\#aT aG_ê›`§nTBR‰ui Z\,®ï—˜Ê>UAÕÓBÂ5Ä·$ ÅAa†âÅ3«¢¦E,á!B*O°¥ªÆÓˀ´òØË7ÙEÆþ…ôJ8•V\™—WE5B—&nB”hAÚ±_ )šÑ%FD‡ÕÛŜ íE³'HËñ4lïÂ6ˆÚÿÁ‹clg‚DØJñ1š¦V„—©"M´3¥PZfNTW5dSXƒ´¨ bŦ +ZÈT¶ò©/PLgCåSÌGîܱ„jRS|A:µA¹T'“Üä¹ã©ðKjp W¨êêQ:‰eŸh˛‚nFwrù°%ÞÊë¥ c\¬s!“\¨³"…¦ì c«={°G5ꌖ"5b/“̺I꯰÷ &<šÐ¾IÔ}xTdˆðjü”HtÖU~Ê) ]j·Ÿ¢·ü*hÂ’Ö}©ÐÄ˜ba½òÃXnwûÊÃDíÈ+dÊ;uN슐‘½tVñi»ª „hitoU4 ’ÑÔ°¡Ö¢Lâ1µªUIûG7¿Ü/š>hh•ð¦ä£ZGá Àˆ9oŽ7UMþÏM2a‘MFÂç*‘“æjª·"æTáq}ðv½Q`,.§ImîeØøIo±’¦hK„TjLL¬nºPpP9#¡WP}È­ ÔêÂZ¸m1Q³ÏE„ïK”EeLA‰`I®Táy4ì§ +Ñà+Ô´¥çB4œ¹DÙ¥U +ÔMbŒrˆÑŸ³3uT¤Ä{'XGª™2¶ ¹Æ 7¥ÆPLçUŒ‘ LJÄTåÖÔYuZ¸‹GAÖ¡«Uû,VµIpªú×4VÚ23{Íp5ÎÐäÐ3zÅC“Îão¦®…·I½#Ip²c2+ÿŒ¸6Þv^,"¿Jëó/¦ö(# Ç"óm9‡6¨Ø¨¼áìA!!ËXôªÐµb$Ššp5.rVLØԈ/ i‹-‹2út‚U¯É…"ŽÿÊg²¤jªÖRWïNátœ·qbÐÉR›‰š  )Õe +M|Ú`näA +w{ ºDIŠ51i*&¶³úxЄ${Âd”2®üRß(XmTŽ +’œ‚.éc\úøašˆš e%<…‡%ºâyÌhFÿ¸*$!g”ã*ÄíE¢EÆxäÌLئÂƊ##Š2éϱ§žnÇ£ÃsAü‰cØá!IeÞÒ2¢Vg¤>¥NDeBPs3XA¹HŒxdñ0ÕKal>õc%ˇB>^JOÉÎH†ü” jiˆ rB¢B­|ӓjÜéáŒñÅÒh•ÜèZ¨P•¦/7âH.œÓê”Ã"'Ԁ3V½ÆÁ#‡o£2aèl­Äø°ò‰YB‹d³x¼–tfæòLM]¢‹œS©1Ō#¨g'ªH¢Æ%# mWóÖĂkâ–ŒG6²š9‰5TC£ ¬ ™…)Ցª .B<µ妢ŸuF–©¾J³IpÁC~™ TZ¢Ð”ü­ÃkH&>§ƒÈv刂6¬x¦Vµˆ;2Ž@5!ÑÇ:äÓÌøÉ=ãðÄTáU$?I š©‘¡Õ¬E‡ªaƒ¾†ËUxÕÄçã ©=""X€â¬8+@“e-ïc [:•™÷ITqÂép9¾4&?…?ü«šÃ?ƒØZcº#ôˆ(Öt†„*¢+oz‘Ók»Í]Fb E±>흞"Jƞ½˜ +EäVú %¶ w…Ð9.á'î*oV^ÖX)Fè#%az_2eÅg#1¹TI&YTIê¼Mb: +{VÊ #„?Ō˜Û‘¹æЇ.ñhA^+ZWcÅhÛx>Ÿ­8¶ñQáԔ,6ã©D9Ÿª[Y †A>Fèãê©âë0RÆan â‘«Và€«… ҙZÞ¿ë{É=ÞS½B7_ _ç\ d( $”åMžy„Ò²IN YŠP†äVˆ‡ã«4yÃT;óÒ!)ɱ¼™”Ã’Ê„² w¥#›0tXL’+%(!Ád‘”‘ªÊÙ7h‘SŽP÷Œ„ÏálÝ­ ‘_†¨651¤©=¡¶BF말à ™ŽE°(8 ï˜Æp‹*’/},|8ª8i ßÞmZ„fDê7F\¢ £†´áƒY½L„È€ˆéDË@?q‰ÉEMõSÅ[QÏfŒ•‚Æ-¼tcœ‰¢@ ¡ |FÌT‰Ë©ü!SêƒB²¯^¡è5j“(1Hfh +\„ +EJ„(ùYëOê§NahٔB$,„ “r˜mÍ ÖقbJ2õ—ÌÁpÃT+ä:Jh :ªÆ<6éjð'Ø3¦™`ò÷|2rÖÚxyHŸeÂáDñˆ _ŠÚBù’;T§áØc«"(*ˆÃ’Ã[¥ T­ðÖDZƧB(j2“f>YìK ÅÈGîÔý“Hd„ ‰‰KÝúëXÍáÃû©¡Ò„±žêÔR—Ë_"Ãx˜Á=MòªÏ$¯½“ƒMjWì©©é—é^?M+ô%/0TE¹¬\¤XÔtMüƒ[¸5˜‡¬äeªœ¨3U2Q¯=G£(l¦OçÄõiÃ滈R¥ƒ3á±xíP +¹Ö•ñÄèó¿¤^Ýå£SÔӴziNŒEF—8I(æB41•6¼fMáߙτ3B¶²LÁ¨¸ƒÙ +²ÐY帰ÄéŒXBy‹#BÙú74A ÅNæ4)1ÿ™hwN†E‰~uY Ä9/ÒU•2Š®~ÏýÚÃØ ±¡qÍZ"¡9,pú*Y]Z„ +:*ßpJÆÞ1ó0eÓÒRD…Ã>¹PáOä † +ïG¯†µFýÚÊyc®1fØc©0š'a+˜Å­Ä3Žª’øâÚZÕ¿Lª¨š×2 C‹¤JoQµV¹U3’Š/;Ëd—ûžË—äÉG…§>¡ +¾ãŸåAE¶oõ»»ÄGB o)›èÍPAޜ!¬ M\)Šª ý'TA%KÑU•ÞÃÕ©¨Êa1Ÿ×4±‡¼ÊÏ'H,W…ö[ëÛ¯$äDU +ÒKUMhi§«*¯ÇȾ<¤åRâR£^‘•Rw$R“¡Maƃ3™… ®¦UC;Xª!TE E­›$XêÐÍžR:™. »TózÇ]‚þ ¨Íò˜·ºTŒKê«{ü« ‹Q­çZU3S†Òoj½©‘wªbâ$z ¡‡+“’¥T£@ÃPEÛ5AsMd:g4ý.d)¢ªH'B”[®!Ë>GSP&Àܪm˜HíZá /¿Am²„0…Q-ì¥Ö ðÞªFxóìð<¦0n]âBcòÝ{ìP¦ûĀ +F@aª/}4ÁÀyøKý20A8Œh~ø‹Aâ!ˆ 6O9È4¡!hðÁ¡H& zK ©f B¨†T4ˆ¨3j„©P/0ŽP +œÐ;ûè†Â˜“)JIî…Fp ”#’  0„Žˆ<b‘ a!§Ùµëús¨Õ5¤¨ @Ó³k¤_Í@9´™ /‚'¬f`ÜÉø4,†_С°àÒà×P…z58¼ðNp£ƒ÷tŠÅë‚Š"¨‚ˆ4¯p'ݵWÍÀìy°GÔ”*H„T* ¤† æ${5¯mB²Ó©f@ +¬*DBT̀,Œ¦|ºOµPQàw›³&&Úå¡Ôy „‚+tBHS + P`&„jS€Eéc05&\ãð›1é/Ó¸¤âë36ÁÁUS–\(ZÕ§˜#¼&« +ŽºC½OÔ ˆAôU‹@U\…Œ¸Qµ-dªªô +LBUÍ@ˆaàî ¿  ‚ZÔÌaX\„`€`‚  ˜LÊL¨S¡2h%¼@Ðe¦ dµ@\™ؒÌÀb„3p@e4à€0­Zí¦Š““f`ÇJžÌf‰Ë c} Do)b¦Æt€Auez(]\ƒ™6“ym˜*Fuø ‰›#‰¤›xØÞÎÔ +„[\ Õ[¬p /Úq P³Æab&5Ž DQšÎ„&Ô,E{ÎJ/‹è²º«² +i5ì¡<%C~ÎPSª>´ Ô= +À³#ŸP"~àÐÏ\¨Uúêq.HÄòIhDCóÎ%S|ê‡–d䱺616°¦zØñ®õQKŠ§Å†8AύJš£ÞBõ +ßÛèqMJ1ÞÃ[‚f÷£©¶ZS·b^¬ežïÈ’?tjãffˆJ\­¢e’¨5céÜ5¹Ðqõ]~S¨«Ì“N6-’ý P UñÃýHøaš‚>†°%艵Bhs•äšNC*T£F³Á”ó~à"®J,ï[Fм"%vM}5o)4«ˆ]&œ…ÿ˜jñ©¡·SûP¢L¶9z„œH!¨&¢uG‚ˆÂPC3ãàšŠœØŒT¾MÌ-~¨gR³âèóÄlø͎ÚR‰Ó*¦Á¡‘0b7û‰Ú±? 8ù&Vee z…Jë%Ã}Š<é_ñMåô˜pN)FŠhþœ¦MÌeÂՏ8NES2+A¯„ImD°«›Pµ¡6¿PŽ4ô`”%Šbò¡…ö¨šà…Hñò†øß_ù‹Êz‡ÄÌ5$D¥zLx$T¤ÛyV0D@ߋ rEaŠ¡NýÈdU]aá'$ޘ Ïj6±ç>[?è/")bÃ@2á(~ ©ùlúU6>>»†B]¶“ü|W]Ür™YÉ1N¬ÝôH>›pïˬÊC·¤íáDВÔÆ3âEITRûLŠRÑmõÍå1ãÐ%ì½hâÚX\"N›î:$ä͔ˆtáå K‰E+¸=Éþ§,dµD5sÙôϼ““«ªFz¾Š “Ô!­¿ú! + "Ù/¥˜‰eŽÆ|‚¼Øl(ú[á}»ñ¯’Ï#èwƒ½2Š“¨¹ñã%¡‹ÜÓ œT}æ,ð4¬£\¦wZ +´‹Rµ±aíoȆßËQ)^†¯‰y¨ÍsŒ†R©³¨”È„AKWÐH$Œ†ƒ2¡¤˜ƒÊ€Ì~ X ‰"±x<"Éa!@DPYèªÊa|ÐI2õã:Ðá}¸.wîóÉ´|ÏM¤4Ïi•'Îê¼sۅÄ:O¨eôš‡ÿÚ4ŸaØ3§¹®en¢0æ8[2´kEAšQÖìzbŽc¦."BÃ6¨]•ãµþ”çr‚Þaþ个‰ˆk(k¥L54{½Vn·ã°¯sŽ‹Á7>g`3$qÌi¡ŠÝG¿á•cxéêN]ÿy‹×ѐ+ß )^i݉<£ä€m.G÷x·þæ[Ïa#®Âyÿÿƒ8á–Q£xét÷–š"o7ø·TÇp‚“Bªî8=XàÊU¸†ŽGÞ.¸ú“ÝÿN:[!1Ýh»¿¿ åû [Uhžß‘‘•X¡öGê&¾NA_ý„®7!'ýaéó(9ë ++žŸóv1ÇApå-Z”`¼yC--ˆGš¤câ—Y“!yWj»'¢èFR>Å¥®!Ս¸ +œîÌÃCà ÇdBÍ]Øc#9¨z«ÊPiʈ[Tñ/পÿExw€]8·ã‡õmÏRVV8EduãŠ_¸8Ø'¶YPk'Ø×ÆÆËûÈ­­«MÍhÔæ’:mEÙH¦‹i°d‘Í›ù²3"`7EÛàH·C6“¤»ÔøöctIx¥u’&Ùpàæ\gæØòÛ2 ™ØVNúҞú§FÎøÐÂQ~‡=v¬tœ5äaW¯òøÀ¾ÏիӃ-RÌþ`¬’›ÇãвkQ£Uè¯KÇQ‚½d‚çZ]ƒÆ5«•ÞZÙ,®][£v¡G\ký\Ôá´F4ãÏS”5÷4BÖv¬¡™ >Àa-r$nq´ýêŠàòË<˜ë¢œë{ñÂÔæz¼$ô5Q÷Žø…°\œ-KÇÞK„Ù·G\ŽÁ@Ùå[PœT Ü <ˆ ȳ%[„Ê`âI’7ËÞ¾sHÔoIžŠp‰âÍjcñsiyx y›OO×6åÎ(o5¬Í&Ó%ø ªZ×Þ+ˆ¶qÝpØR`±ÏòŽIØY>£UOjà¬9®xíZ„Íwik” 3¿2D؂óY\ÌÞ'/ý.BIµäH‡=9Jauq„Ó-½”4Ž’ôóëm„ÉÎ=+™ûN—CvaÇ"ëE!âJ|kìŠÍ¯UmùsdJ1ásfÔ¥›Õ_!G¸ØGs}œëvE‡¾>¤JUL¹eð]x¿3ÂLóøÅõ‰UÜ«'¡€!Î:¦™0ÔÑ&¼tì"íà»èaT‰Í…]×"T\·ƒ.uXÙ¹¨eDêÑ®Á·›­´2ñ5êóÂM#áäù©äTnã6/õ¾èÈð}Nlq0Œ9à.èØҐ7ÜàcøâÔÊ¥_sSÕ9?e¼œÒ0nÉ XNÑ"abƐcã¦&«RêEòÕxàÎ!CÉnÇjûgÞÀ`ÂÌàyÁ^W-§ÒU‚ê4˲zè¥*_┚a J»S}1Ìß¼¡j¨€tVuÄÃ5R +J\ƒp¾xå 4D»Q⯠æ}Àv†- )·íò/ñ¨ÖâCFåãœç5|c‡|PhVS”:pŠ†ÝS#º:#Pj³ü~¢· ëk6 7*y!ùOÈJkƒÑžw¡µu¦ÃäE ƒ_%CÄdU‚¨j€Fp?·™PñҌ;±4Oô\¶QA¦B\ššÌ;Ãv7ÂwÄG'4"aµ˜¾ÈÊDç½A$G>ˆDЁ4cÍ +¾ä  ~6 +QN¬‰Ç«6![eQärüˆ†mˆúÄâ °IPŠû`cƾ¯ƒ8h³´ôÄ­5dIÿPÖ 9n`Q6`©Næ9 æ–ÿÈ䡇@”ì º.YÁ(d!‚v›h=½€U<›c0vZY@gè0T+ë깁27ñÄ@ùN$qÎdÀ^Î0U>>„Ä–åԀôRÑLÖ⡯üá ¶—ôÿΞÌ>38Óe¦tMàäCùÇO®Zì‚69mˆ G]¨^0~ÿïBì̜L÷0·›YX\@L˜¡TôÐåFl†§ñ!lڕõo•o³ŒÑm¤ã°¢DúÑÊõj¦B@ FšŒq»|Á8†+­-¦&n%t‡†•E–óAWQ%æwvEõ:7MÔí$‰ŠÙkAd¿ˆ +Âǁ(5ãK;é|qNUQ¯íT6±ÔÌ^Á³5$Í z-³‚zz”¯ï¢Zhú§–¾6ú;¬~º()~‚&)ûg}úÍzåh^>ÁÆ=&Äì žáUOД-z‚ÛTÀ—Ÿ'Mþ¨6úÃÚ©_։±ÓÈ7g}š´NíÖ¡NÌ]ºN:õÕ6=¥ÎiYÌ)Š©«œÆåÊ&rªò—n§¿µNhº!zåh pjdgrFQ%”î1 HâÒÉ9ł®‰©'þk‚Y¦u˜rÕôÿ­[˜n‘¦1M]¦NhÒtëDèMQ‡4ÉgϤF¶g8–4S¬:Z&_¥'œ1EPMMÅ´iÔ¥«`6ç61Uâ³ÿéÅ"ñó:õBk€•© _Zý뚪—^o%¼t>#íRûŠ]z‰FH.ui:ÁÂ¥‹Êé–Iäl)úK×Y-ÕÍ./Zz —ZÍÌeõ ²Õ%|zÏó¦ðRå/«4ès¤*@câòI¥ Î2TòÃC ²@Đ÷ɔDF=¡Jé{q!¥+ÂÅ( !D ÈjJ¡ùŽù)ÈcIÖÈô铨N1y½Nz.c'u®:ƒmÒ=éD“€7dÚaÒcY.©Ûõ!X҉8%1hžh4݁9R¥³ºFzó'¿D^Upb¤™}ˆnTã±. +†§|¶åÃp•UÊRӂ,ë]taŒuŒf©ˆV‰êô®®zȇ¢ÄÄKîß©½&åuN¯(·2>šÿ¡µGëRê–u²¤?VÅ̆T%<ܪpìÌ +ð,EQ~«ÕÑ”¹î£# '®¥9ŠM°$GõGtGÜ'\…Üàè®çX!œ@§¹1ŒRT5ò5ÿ–÷A‡J*ŽÔ¨$²²ùÁ=Ô$ƒ‘ö3gÒ¨¾ éöCúº8£7{OdÉOuQfF—"óϔQ½ÏÐّQÊ«fwzs£;éLŒPg1°d²HÜ£ŽO/¬/ºâ°ò¢ø÷è ."Aù ‘$¡k‹ªœˆuk6-ª+#_v«ªQ,Sy ‹æÐ9L£"%®9¬ Šð?²Nž¨îjÙ‚Dò†À‹y“œè¡°³PÎÄeõ'ñÔD1«ShÎÈÈ ­ž*$Ò·ä°îˆê–‘ùӇXÝLž149f94 ½ì{šö²ùÀÉínÛ,ã‘$ç¡»¬û~h‡#•(ÔDqå™qN•úO*bõ?ÆEYÏ£•„äÇPó4 Â':Ê¿ÍcXV‚Åt¿]¿W*ˆÔ÷u'j=€ÞЂž,…²Õ5ôø‰Y—Ÿ‚+ø`ÂòQè‘"[CÑWYŒ%´vJ €¾Ñ©sÿæš9ÐDÃ8%eO¡‚l‚©¦H™:¨ïÚÄOqYg(Ià7ë…YÔÉ]+!¶-J=òàò¸Êà¬dQNö݈Q>L£1¸ÏP•‚PMÀ†¢"7Ã~À¦º¨âáÄãRuié†uµ(~ƒçBˆRqœª‹ý0Ö1ÙBlFš!.QÄX"YRÞfbʜy¬G]K>X’‹:͏CÉö›ŸeM·T<©½834âêŠyM©c†ÿò;žåŒ¾RŸ4"Am©OŽŸŠÅc±çjº90XrQ×݈3£Øk7úWW¤8rŽöšGïŸ +t›l"8Oâ0E%”Uè.*¢­IAp²†‡Õ +ˆº L’z9¦º(˙¢þ9d€šK]ۆÞÚåpê—Ä ^l{Ýù/,·¶¶!§rÏë½Sve>eòJ\µ˜iڇkàp>©3†§RÃî&D’ùn|'‰&?汁 Û;ˆ<ÚÅ„U¥SD÷lGÙØ„ +ùp}!¯1Š ¾óD™¨V®v@îÿY(ß·û§µX0¹)#þw 4†Éñü‡®Dú0Î îm~ë„i%”nd$ (÷Iޓ!·ž=٘© ·ÔdHªânK#TJ+嚪Zˆ-¡‚‡²¢LÜ`î æVÂ'¿]¶ZÑ>…k=Ò\a4f$1"tZLÆÌàçi¿p'äk÷$ˆMmüg ¤„ŠñÓÉþôñíí`m¥GŽAýçó†6±"æi¡Ó{MFßp§4 õtÝ2 ‚½—ÂßÄ ñ¯BVÂfˆE–šÊF 2Š¶‹ÉÓ$£Å(Ùk+†ÑmàXEú×[ij"wÀ¡@*Õ1å›*Œ—FfÎ>ºú×ßl“«í;_êŒ)žªº®©Åw§¤±½3ô*¦I¿_¶‰YÔ½8¼²¦ùèOÒî,hé=\¬y¡3ñÍ4LÝ]]0α°ÕÞAq´ÕM™Y¥ +Ę( L dL´“‰½6ç?æx‹íÚl¢"v°# …wN§œ\ämðq,*„²Œ ˆPò7(E86ñœY®jÝÊV×¢dÃ'çxXÛëìÛâ~I0kûcXÖeȤx¤º’Ú΀Xm_f)87Àü M0çQœ?(çHĵh²a ‹å¢–yï†íUnBÌfkâ@i:Û;žT¾¼X½Üæ“9ê§9XLmtÂ?~@È# €Ñ¤ËnªÇÍÈ»€_ÃpŒÓÅ#ñoeDž¹Nˆâq7C¢d^ïÈÓÌeÍâwhêC»`ÀÚ7®/’(Vbkˆ²œzå aYïôÅ`3œo3¼”,½,P>Ç7‚¨è7Ðù§‹H^Æ¢Yb1® …°ÏLÚW4C»½’cz»§Š<Ëns›£±TßÙ½ÈcÛp—oD¸R 5GO4W^öœ“0Õ5äçrlJŸÈ˜º _±Õâ +Ú­QÉyP~Z[¤tÂp{Ü ôGf«1çV 0™-¾Z…±d-CA¡p츈bWÒaÃT‘`C^M ‹>”lóÁSˆØkO×ÃRñÌρcÄs=8›ŠW\ø}¥™¦Ç CŽ +H¿Œâ×'TÇAñ'–vcÈº! +3ÂS¶<»e7Pœq 騢—aÑrEÁ=æƐU5g.­1V3b~2é±(úð9^ÿµ0™–YY&ª[¤˜ä\ž¶ïL&aM@Â&–æP¾i|”ÄñQ3FpîQF'ÒJ¾µ{kLg¿Ôº饹á®[W8ÛªÄP ‘FjÌGÒÎ 2‚i|d²Æ‘bÏÔá¬Õ¨¸¥™ö™fE‹Ê–Oq©ÀŒɚ¨¦nÈfÉ0€F¨×Ä{j~öP…GcPâ\Sà ùjRlÜ‚÷τÌP¹ÿ½87X'$id!Uq†vùaÀ.9 2éX%Ëé„N%6®ó¹†Ò­V˜ +7#î0õŸ¥ÖIœˆƒ>[å7Ya« +ÊY¥Z¤MÂƐ¶‚ãW_ sÉ«zÌêˆÚª €ä $¹³ è«Æ{مÎOð}Y{ñ©âÆÁ†Þ1»ã‘&\ –SlÝ8¡Vná4$EÜ0?ÄÒ¹PQ.òj*,§U~ŠÜr¶¶Iã“Ò!)_´K¼tájPÿóÜ×*(A›•|òÏæ¶áïÃn¡iP;SÓš/;îjʘ“űYaußï*±vƒÖg €V¹÷‹§ù;À’ÉÊSΓ÷Ojä |Ìù÷ÐÚá!¨mG-x9¸vu^®HšJCÃÀ¦êhs1- ãÝ´®`!¥"e „DÌÌQ[Ô¢W  +ï(¢Û8„GÄJ(àHH±Y–6¦Èæ)‡Îãòó1èN›ÙBìmp‡;@A=ÈH±$Yðz‰rg®>¢)‚ǽKd?’TºŒRzik½Õ¬ßõ~ÂÑ;/Z­ß…(¾>ÀàE¦¸ èÔåÝéy'°ŽØÄ-±~ 0´3s»Ç¾Ã@‰D”Äp 7œ3¾ºûQ¸wm„Ù`Ýq}K#Ê÷°uî'á‰t°å!šÂbéèTÆüZ–ño’*tzf(´Ëœ¾@ÆÝ7Š 1J¼²2Á!Շ+æ75ûÈæKM¼X›©¾i±Ø5—N>(ì{ÿAÉÂ1&¸äoå‡DßF2âr±{ÓwIdZû—” 9ÎʍñÖ4ʺ±±)ÕÔ·R)*ÆYPÈ À= LqPrA{O ^À”ÄûÝâ æÈ Æ”wB¤2ùãö$TKy‘#5±q`÷NSˆb€K“A¾z® .A=úL¦ÜŠ/ãîvÕW¾ƒ($5¿$Œä¤ÖÁªNèÈâ[Éta«S2˜Ôm_‰ô3_Ü]ê+ñë̐W<\ÀàðÊT†E(Š/ÕàœY ßñUCT&tš Nº@Aª¾ÞêCdïD9'š`:úÊûPV¥xml',uó@Î7Àwҁ&Ú&-æÐ7ßMn«å 8©µ‹¤€¿Z²ƒÞ:I¢ÊÅA‡w7¢<£Ô;,¹õ$>Ó@Äî¯z¾ñ:â£deQ Ë ŒuÔ4êjå/.(Å *æ^Ýqà"ŠK^PÚimßS‚ßC ⃓ +ñaW/q4­pL)iíÛ}¸2ã´p‡. ÔÞa@À\§@)Únn!T†«bng* Ïà §ª,\͂W+ëiÈ¥ïD‚ÿA”âßÎE‚N“9 |þjÑÿLÉuë-¦”£0§¦}súTž‚…ÒÛe “J°žO±œœñ–õŠ¢¥NÄßSœ“ãIO5ñ£J˜h–9°A¼}¤5óû½Ba®¯´•>ø0ó:"ƒ†•6á3¡H3ƒ¨ƒ*xx_㉿†â½H!pHDè‰.ýÃ9m»e—…;‡}ߚb…Cgg {KgÚŠ!â™n")ê'©BöŒBÚÇâä-QM”˜ãø@­aÙ² ˆÎu+n^m},6ì0kÍ˜@åyó¶º"ÈÕ~ºóŒ¥æÏÝڄ‘e³_$Ψ,xsAȕ~×)F¹áX* Á ñú­‚†o.22XSY08 RJ9r&ã}²°ñÖ1´•+º?Op*z¤‰Ìä&T†›IÝäc5“IõÑôu$9wÍè2‰ã;üô÷û2Ž†¸=÷u"ß!(I(ë•~u¶»¬tE~C€Bçpõ•ó_@Ô ~R–ð²xlÝ$³AP‹sÓÃ÷P +Š”¥õIl^@þ•½QÅ' ™¡ÎK…4š…}–¾©T@GÛ6»¶©)õx׃JrÑ¢+}ïþÐOžã€mÉc}Í®¯/ºªÇõ#È«ªK´ÇÁ»oÜÒ]ør(4¾ dŒN踙NœX4oU.7‚¯4‰^&2åëx=ò²t4£aÓeÒáx]Prp Ÿô¡5é)k#Ãl>KÜÌOØ! Ð8ÏܘRk(ŽJ€ö”VpÜmß¹}‚ÞkŸ‹íLÿo¨4¤æœ^9ÒÛÌpÙð̧|¼h¿‹Ž¯ŠX>̂u(gÆ2àˆ +£ðæIJŒ¢ëÅÚ1z½cÙmÅ2Àz¡‡éU¾7oJŸ˜¨ìVÁ+¶'ÍPÎçŒd>Qwìć4\¯‰sÙÚy|Iƒ˜„æ$æÅ4¬U•]šòsÉöÔ;¸üaÓe`É°6ÞÏаGS™‡GÓ9Z ÛÑ!Á!²}öDÔTɪã$g&òx™8‡ø0 QÕ÷X6e5'ю„Œãò`9•0.L¦,h ם0^°5"ë‰ÖÆ"+’‹‰í /’`D<"ëJoÄt¶ª?‡(·N;!Áx-£èEY<†X0ó#ù÷“ú^Ï¥ý‰‚@)Bñ[U{mfùŸéJF‡C°ÞÎà‘"•&Œ=S_l8¤³ƒ}FS¢„ùI¾9aÔ ÈdzÝÇO. í{Æ`[üQ)îüåzy¡Ê*HG³"„qNht3'AÂØú6L†c­ÁhJF ±×Nó!Œ‡øZ`‰ìáá<žTý£J©xJ«“æ'û¨d$¡›DœÉÊd¨²«ºÁ¹sN(½çÑô]"Ö5ø-”ðŒ•1ãèܐœë^ñÃôpËݳçI˜ö¶ñ¨iÄ=ý˜£óL¡¶áÐ9߉]±i f´ëºÓ°T±C<¹å¸€+é®ó#yûMwƊ²lþÎV…°Ð „—åá}âä[)ì†]zPu§¸õ©‡À¸}+e)9-µy¦!›r>p?cä1òëõҟ*ƒ[Z8ûÅx©cˆrÿ%ž¬T8“€ú¼½=Õ °Š|¼¿]–×÷;"†ÕN„d4lùW +M2h&ïւAEMÌ8C‰ÇMž‹0•ì¶Ð’ Ѧ@P-Ì`B—Hj¢çÂ}¸Ài©¼4{Š¦r¾øLòì$çyIøxÕ)H}6±¾èí52QØïX ɏX%‚‹~—mÚb tr¤pû`‘é;>2G9o Ûâ[J2Jýžzü‚ì†~ŒöN¶£+’.½5äòd£ÿŽ<ïlGßß+ʂ´òçJ8Äç,¼¶ú¶°Öˆ zu“¿,ZÓãɨýñ£–·‹2Š•[›öRì™ÓipeܤAp˜¿TÞ<ϞN:Á y¢©£Y­éqhðÏÿËëïhG ¥Kú @¼‡¡ªân|9åy„Œk-˜8—ËsT¬®XÔþR QÍÇîxµj„Â$ÕÖüÌ嵓67Kê@×ÚZJ»&¹€À~èžÓyßqÁ}žkÄu6}bB>͌§F•up¼ ÷«SbJ ) Қµž†æ q(sºóÞ1ÎxÁ±#“¬%Ü53DóÀ@¬& Žû–¾2ì 0qYÁ# B‡!_ÝpUHSÍ-¤=ZÅ.AóYö(§¸¹†ªüTÜJ%;–ï»s ë0 ô,ð£æúR]dD¦Ü“ŸA(ã…1|?¾3úc_G–H³ØÛ}©ƒˆc¡7$2&º‰±`y3ÿÁ–içÔ&èC8°|‹#K‡àÕ»'ĝ¦L]ŒÍÚ]Žñdš)HÑÊÕ$ôë`¼«Áp!µà‚U”å^åÚ q;<™%Ö{ªXž©vQvšwžï‡ýø _F‘Q¬Ì¨û2®hRû7Qžy:€7öv;åßüÑ«[椱ɆT©‡O´pó™îçQ¾¿5áò×!üÓ}¢™Á@nT5 r\KºÚH%»i¬±3¹“„x ”g²£Ý Ã3#¸sý—&¹2ƒÖ¦›ÑƒŒåX)“Íʔ|µãh”dï:ªõ0t@\HeòÄ_üZ¨¥Ø0£úÖxU²ð†Ñà:Oã‹Dêµ@ðOÈ©•è©`¤DM!¡ Kø轄nˆ*ùä¦tB‹–üJø>92¤œâ +¬e(Ñû3ao +B Ö´È,™°d%ø"ÀcàîñÚA‰’M>:Uþ2eø)J6¶÷#ÏӘb¡y– ñHe©9‘½CL1—H1§Ûû!s1ùø0y(-³.LÁ›î°LàQãcînl«’GpkÌSÎéYڇ'K 9„ÚpK,8eΛqêñy*ÜR¢@bW` +ᙱÒOÅý†–ŽÐǜ»$tƒÚú¢W38¹ËÇ:RÎê¸G®}K=ˆ1Ïw;܍lTÏ㹊 xÚÄÂ{È_;ì$¼K[~X€°„ðÿqp³g:óÍ÷µïkðD¦«dÛO½åגŽoŒSá&%SsIÀuÁçGàå_^O3lí$·G}ãBü*5¡ H|›…™¸úó¢»HDÓõÞëD!"óz=Ë1Á°¬Â¤ +9÷mÒ¨v€•p'Œâ,Œ{Iò¼™B3†O½¯Q-LÚf#÷¹Ç;ûŒ"ïŠI*jÆU +ºâRùôEê” myŽ>@òJ ³z÷\¥,ê  +ùq ’„Ûº¶Ñ| þôtÇbCìqëÄ-^‘#ÞQ¨ËãTb܀˜$f =?¨5ãøyîö|¾Ýå@wæÛǪéžæv?öøŸÚ|Õ`ÉmŒÁ + +睔áå•ÞBã›ÞáIê*úÝíÊb¾ßð'Ã?Þ9"Âå¹=é( O"ˆ#;e ÕØ •_–ºðbpˆO`]”ÃnÅ;J:"‘ö£`üŠMN1ŒÂÒE Û·­éÁ‚ÝzñŊú?£„ŒW©@¹SüƒóÍYÓf=}ûSrLWŽ °°ëdÄ»>Ã¥&ö§g‰wÜã‹Íâô&¼Øus8mZ5¶©hë\F2T#©÷¼;¯‡Š“qocÎ&.xhæ\'ÖPÈ„ŒC)Ü{v˜:/¯Æù ‡©/™Ây»w8¨tžÔ'Ѩ“¦Ÿ”~dLÇÙò¥|«¿Yb&?ék»Kg(¢ñ»ýÁlªœ¶µ‰?©d´qÈ<³iAÜ)ùÎ^Œ>¶,ø²qYqî„3¥Ó9»XìY}nÖ^†c–ØAlù4öŽÕÆ(á¿Tӕ}´þ„k|¡z­ÐÄ*ܐT¯SP‘“³ãnÇIiэxôDtð³ãìîuÒðôÍ£®uKÉ,ú…˜ÀVÇ­à'_Ó'2ŽÜgá(ˆ^]ï¬Y«“©/ƁßCêZÕÖÚÂÝÜ5u2+‘üQü¾=_O±îõåätîXÌ ‘g–™bMða®Tàå ÿS(W@‚9S¡É “k6´zõôJk©t:÷uù»ïȳ7–œ[pƒöP”Ã@ ‡ÆÞ3³nnR¦ ž¢~×÷’zÚE0ú +¾±`Ų¦W ¯A€„áwTáð@+ŠóË; žü ä2he%½˜]ÕRÆí‘ý’´r9Üp^Ü>ö ö·ö—¤®þ—ʏó}ëÉëúë9’4-ù–Ɓ¶Ü½Ü]Xh}º$ +Úŵ›!ÖP'MGéߺž/2èÇ"«E[€ëu5¦R/Ý!J– È©É»EñH&*´ñd„/ ñj½}ÕyK¼ ÇõÝU5KÉðº©33Ýñ/Ç'WþPò«-n*1'S…Šw`0£¢ZbJq5OD?\ :w°î¾X7ÿÒ«õºz8Ä&å ª Û£¶¥L¼¬I }EMmx“øó•é3›­ðÏ\|‚Sæõ”8¹[¿954!êóžÕLNán +—pn³z§3´ç?QHaýÈhàðÍ$~ÉV‹EP N„•ÞΜ4¦C4‹¯¡€˜3ÏOõçqumg¶á ½´Æþ¯+é±j<H¤.TDÞÙkŠ ~[3†0ö9ö3y®;J1U6`A®šýÉàJÊZðñ$¶¿×⽅-C›}(ûÓ(bv®˜ËÇv!¶½½B`5…­äµDÕàWawÚ"šßhÈr4l«{ae€E.RÄ} R’Æ]Ò! ¨¦¼xüa È*¡U¼ˆŒ„G€‰¤=l]•I`ã')’ual“)ygÅ. È(så­Ê5Õ{ƒ¸æ¼O§5/ú­„2—ê3Å¥‰âqÐOm »§A«à¿åqž}x¸êÙ'̊„ž‘’# |²wøF>§åwƒÄìE'W-â4}Íoâº+é(ZÏî”!ÌqNô—·NêΆFt+OÎ.Ä'K˜S$StCŽ@"Ø(…Cª"¥‚Ìðò³jØ鷉íjÏވËä¸;ŸeSØëSé²S9NV¿pî DËh*1æ²M”¦¥(CSù@QZøÀ÷ù“Ž†šç­ÑIoõðꗇ2‡zù+¤ìôQën%>3®ÔxYéáR,NÐ#¤r…JR‡°£¹ZÀ’©T‚w±õù*« FÝ8oDÃÔüõ÷J”çQìtþ,Où¦’§„ìàfÜ-º B–íͶYæ +âõl@\USŸ^üÇßâv —\>¥'[ßböpßжˆÐè€GMLs/ºøˆêªÊV¨L©âÄý¡Ÿ‰¸ ¿Bù×9ԟ“HîäçȂ2ò]¸“)¦ÛŸœ”Sõ †Šz—úS\l ¾ÎÔsnиJ <„~ \翊GCsù§¤8첺d +-Xˆíw´[!Y!“üˋâ21ZáÛ¸“xÝûӄI$1Bµ|J?©M@ÐÁõ ÿ¶zôB¢î=0¾#åb€øÀQ©åâŠA")8ÈÅ|N¯Oî™ùpÆ|rþY¿q"‰ìDùΚ=N§Ô&íñéòdPa ´‹5؈ø +1.zrþh¡Ý#‡Ar~7,7O‘ šÓ‰I ¾ˆ‚»ãbø Ñ'ÏŽjÏÌ &Øp].`]]9c‰ŸM› BÇ{©!—I}f–¢P®¹‡ÁsàÿŠþqÃÈE2*¶üõß}49ù±zëÈ¥ @“R Ä%€ ¹Ø´Ž30è飯H.Z“ÁÆ% 4Ü+ì?ÄåE¦4YêDÃÅåS—$ÈuÕ *.©_ŽüÊMÄÔîrq )n<'AÃ!ǹmÃrM¡ž:#•|äWÇ=yHk¸L6ÑÐO®«†‹°ÇŠqÔ9·z´.åÿV‘_°Ô'‚pÉ¿Ò̓i@TÛ À*焛 èô—ºO-@ã´®*\D²çŠ nn?\²ðæ²Ò3Ÿ– +— =°>SŸCbMT¥„(Á;›F|ÈS)@ +tÁ7ßׂ]‰’aÑ:§ã'.â\…]mfíá¢ýÂîX¡ÈkYÀ\VØ+%ڟÈ5Bü“ñ."®ÒÊ)Wpq<“ +’TrÚmq\üòÒòØj`\¦ìàšÂ˜/fþÂ"¿¢+°}xš9FÒï9VÙ_„­ToáÚ¤¾®ƒ°‡Æ,O#óÓDdTK½ÜWgW‡|x¸b‹XB…‡Îô$v_ÑCæνehæ£fM– ÷§šD+¹ÜõÀŠ{nhösVå¸âx#IAš;•Lºqåh…˜û·ñ°ë´yíυáì’ÓKµLªñ΄ËÝåƒé›Ï×ìøá/Z“‚‡ÂQ"+ P“{QxÊæÊ|ÙÙH’M¨HΎq8}õÆJbÂû±KâS‘F•ÞBjW÷șn5B°š=@ XÇ&jÇÍ|ن°"·=9Âé Q‰^<Ž»êÛæZèãÑ­ÀºÇ™ÇŸè®(-ÅüéŒk!D„-‘ààòåM2?ÿ`iÔÁ|Kã3šb~yOŒ]Å7G.˜Áom‰Hҏ}˜5¬‘¬vêxÍ·ûC.ãˆÐ¹؆2=S£xԚ3\ƒ1 +Ûǜ#\•Œ\Ð|æ{ní_(=̂žÁRâQS8•ÑŽ¢ÉŒmŒ¼c¢-²ô"°/‘¾ãˆë¬eð•ùÍϹï§âµ´›®ÃNM¤Z{Ñ*ÎSúõ†Dû³òåuD5‡«€RK ¼‰RI}ñC + +À;Ëe%ŽÄȐ1$š `mºÌ½Ï·« V¢#ðä…g~òåúÚèypàïšAùbò-<,TǜäåÕXS“Ïl´ÔŠL´ØÁ€[Ì q2ì=ӔAûoø¡hÃ'ϵ…ƒi¤œŽ£öðƒsÞÆ#(»xÒyCþÜK@‰/…£GËiøe«-áE¦ÙKÞwŒ£“£–¶1GûãÕø¿Šã¨ÖÅò_æ1OHž—+_˜dŒEÄÕ0¿§îot]Ÿ}Šåíå¹6ÞJ_5¡9R:4 XZ[ÇP»\¬6´»0™»›š,7 †ìÁ› NháŽüL1ó¨½Å9› aŽD*Bd`«HE/’ +ìÿ Tí¬˜²î”ÍÏ ^9JÇ+®$M7‡y¸=DÞãßhµ•1‡5&Oì'-›w +ƧK±ã¢œp‡ývuۑ ¹8ãCdãC‹ôF\¦™ C}ÑN d";±/Æ|vtP§2;—¢L¥HŒºŒŽÈ#–À^jā–3tØXáº8öîñÙ^͜ʋRò°Ø€ào^ø(uùt…F¹:¤_-ñšúÐS>Æ –׎ÅBAVºwP¦VKA>±>ðJhì´ç¤‰kq,‘=‚‡<ÕÄw´4Èi@xošÍ˜ì‹* O…µå"•ã#öòRØåڒ„C~Ât‘ —*>Oå1h€£L? —ÈèZ™1ãà“ïLª  ¢ Ñø %`§ïSȒѼ8³Ør|éVЮÆÑýæÌ^kDg³ Æq± YÀÍÁt¡Ëær;jO%„W¦R«…‰>yÃñùh½0X _$FÃê(ÀÜZljKÑ̓O‡£y•ûèòÒכ¹!;eðsƒ>픚€Ãÿ »VJÌ÷ +8ѕt›ºe$0Õì4݆k|gyÃ̃^ªk¦S¹Úú‰L–äÓ¤)²ä¢¿KH§ø.ãvb“SÍ9Y’cX츤FS!ý’{á-1…"ØD\^¹z¨„{ÈGðgzQ ãÑ~,þ­— ddƒ€ +·ÏӅßÀKËH6÷£-ÅðÈâ&rII2—m¡Sµ…1wðµi!çñ˜” è`Ö JM +?µ¨65TÌ~1nvE¨A=Ÿ•seÍôœÈ½µè=§êü$®F(’NÃ(Zˆk¥ÂPÄ «éïk z ¯Ù aú͒¨hù9¸šÖU׶ÄØ ˜$ê–ϯg±ÚaƒjC$]´”M"ý!EÀÂԞäºÆhŒÍ¢j‹æFuÁX÷±òc˜.EØÑ°[ª¦Ó?¯+Á)c}ll1Ë4ú¾;Í´\˜Áª‰iB>šê5÷o¨žE8pw‘HßµLÇg2vLàÑ­g¶ÿ/L7/qú\0½6!s¯µln“"kÆcxȦ‚«Þ”ÒAŽ +AÅè1a5Ù¿ P.|ÐÐOtƒtö !½7zE¯Áܜ Í,ÂÑC†Ó5œÏÀÊ+åÇ>õÇ¥ÎTè%ûË°IvÅëœüä»$öƒTªpÒ¤Â"ÕOž4ºr”‡-𛰭@PÜ$ÉáßÍcJrPº ûÍWFO‘%4ctКì3ûŠÎSŒ“&Ò«L›ÙˆBÃ×µdÏ O&¤ïÛ§õO¦§C¥’ ©€w©FÊø™ÐÈ¢ÚLv܆ô_k&–oq_ìšl÷£åNV«lSšœe¿fór¤'ˆ+ñvŽ{|BiT" +…Sê&I‡†Ø`cõBÚ ǍÀ¬ed|‰Ó„[ÆìŽäÕÓ0&?cÂêÂcLü†|Çé’(¥RüÃ,Y’Q­J;ÍÉGÁ}ôàÆ~ÃJ0с™Ü‰g±l ý¯Gµ²`°u½²£XïÊ© ©ú"ûŒØq۔Í(1ä(9±™ó?dÏù©tC5ñîF ¶Ê|~©=\$:¤„ŠŒcå'G )bg•?n‚¨Œƒ —í£¿õÈ°A³a¤š“`­@©ñ.|ŽÛäeÑðÁ àG°‡ÒVY0Äú),؊OƒºSH`#R=Ìy^,®r†=€G[XûT*uL-Y‰Eçašà-©‚ƒ|H^÷' 3d“ò +ÚÓjÆX!¸á˂2ðøaŸæ†• È<9vuÝÎÖܤ›yéŸî4ÖRD³¤ÂÕÙÊÃÕ‘üÏð²âö?P“µòâ«%&j¥¦}{@«¬±ÐÜӚ†pÍxXCPݝŒ·Ç«[TáV9@ŽŠJ9Š^ß8ËQÓR^‹âØ©:-IÏ5¯¸{×*_ì/fXQ®F +äL¿ íö åP~›Wol[lDï´ãtRm_ìV½E­S¶N¨€Ÿúáy[wNQ“c;42ð'•#“•ðý:—‚éŸé0|À˜®xDEè-Ãé wXM´2ø;„tÝ¼Ëƒ×šÌlëûÜà‰v8¸¼preCoÎ +p77Vw<#›µï‘Ó¢v3OÊÎxz¨)§¿Îù'A}I¨âWhå«<„G—([Æ"¦ÜPîÅi 2:ÜBу:?¸…ô>ýt “¨Öy¯—ac>SRÜ#„"ø˚䘝q£N݁”úXQ¬m¢--V!ðÌ.&ZóN‰'f«bË;ÓÒxVq`ƒt=¡$^uX¢~Ek$í5-p–;W¼¨ÝÓx¨×çf;-Aª6‰6ÏQ™ÍOú´ÁÌzšðîÖÿ]µúD)†X4Ì΄‰mz/ÎÓ9å9f½ \ð|D.B3HÆ¢V`û÷±)ÔC àü»z4&‘ô +7ÊäòºÊ;Å­M’p™2'j{à_ÃÆÔôfNIõ6»ò)q¿¯¶ÐuÏd «*ô,æʙ‚Öóæ {éà{ûé•O}ÅXcÇÞÀ îÿçŒÈ#d”0á[8bí¡¾Ôʁ†YE7•ïYع[þ ìxµXº +þqkρ,ó«/¦¹àH/¢ÁèŽíï„Cœ~M+@ÏËHŽùá}”k˜1æ #{ÊK‹.™¼ŠL þCþs¼¬¤’_PÔ¦0ðØíz2¶Qyc:Ï~|Ñsø˜²zš šäƒqçoàÐêÁÎÁ?SL2#ápØ»@÷fôhtÀ«RE6ŸÛ&›"5‹b“ä/õz.”)Š‰HÚyŠ¤NÖþðÓh µü œÕ7h20$fî Œ"ÎB6àÖí‹ļktÉï\ábìmÚùé´ítٜo­Iö×" îQڈõ¢çiçüú‰™›µ¸¡š&¯Áb҄ÁëDZÒ&ÒÀ¼r€ö­†õVEÊa0œ)bu 9ï2ª*p÷Æ Îî +¡œ÷lj|ËßàݹýßÛÛþ’' }ø=9 šV–»óyWm+Þ|ŒÐUܕ_ئ¦?òü͍ñY‹Ã çCi{wˆÑ3éx'MaW$ô„K,êM¸ö«ñ3), C®G + …v¨†ºhĪô<¹ü+FX_H瓘é]ÒqàeE¼ K–CSÂ,§—sqhžSÃ*Œ•)éEV‚¼…ô\³·†èg—H6˜3žiDeuîàv\þi.ô^¥ó8¬¾|0Ó³³´§~ìC{6µ¿°^=p¢RØ(/^¼ˆ¹ñ‚TC¢ö4š›Àüňóȁ/¥°Ê@:÷@tŠK‰QwLFrù€J5%‡zÑ-´Š¿Ïh´©AZÌDÙ㚪M¦ÿãV¾@~²úÏ'ˆ‹»%;Þ©X‡UÑ¡˜„&8e‘u/ö/VœË Þ,‰ÖD³)" aT¬R½ÃA)°²ÆFnòEöã©; …ÅÿË + ¥¨­Ðmˆž¨YT(!×ù\‡c«|&L0]f¬{ÇH>c2?Q§S TŠ`‚$»”þÛÍ¡<}W644ª¸êÍtgP×Ø+iä +òõ`͆¤Æx¨d9=á®RÎH£2u7×݂LO省¤ç°Jk ÷~H Ï$øœ¹Ùa%›’î-’Ám ©˜š +bëàÐ7Úî¸ õa AÄfLºY ^² ´²è"ÔE†Zä©:UÃk”@˜…Œwڀ’:pë:,- €yŠ¦Æc+¿¡&õ Ë(Xieð,ƙ4ŒO-~úYa¨Œ#ª +r‰dÚ` ÷m!ZÀHœH×U^ìOŽ^R[Mík­ñð¡ƒûI”ÂêÒ> +ý¡Ÿ ¬Qõ•x»\‡sŽØ$‹°ÏPÍÖfkÊ®Ãÿô™'Œ6J×å4½2Dޑè§æ‘`<*²WñäÄD6é»qÇ-§2WŠM;ªGÄR©'ó^0"KäÍyXñÕÞé†åhú™Âê(ñ ïP¤%QɁ{0YR„ÐG¨5Ÿ;šqUUì2­]¨’à\_æ,RsxÉ8øPÚÌ'•JÀŽCº™ˆ¤ß„¥ |I#¼¥”aú{ãŒêtˆûI)õŽ’Ñ-gD>Ÿ $K7•øiF—ÅÁ†è‰»‚Ší“2K·.8H¥ÖƒÎE¹Ô“¨A+v¶³jâ)ëI`lílËU| ¹‘"ÒËùÑáÒ§7û¼Díóhq#þl¸~â$,,†kµÇõDºÄø;·{Ô[ +?ÝéD4Â5[Sâí c2{X‚qQ!Ù=~òáN6,Û™jMèòçoØöí<õ†Ì&¢b7„Þë‡0Pm Yp“VôÂtC"»BU(‹œŸï›>FK2 SÖ›¤!>¢]Ç2„Dg±¤Y;æ‡ÛA ±7J +ôbœ78ºÉ…:.ÈÈÔʙró"±‚¬ÄU9e߀’§Ò-¯:­»}µ¨Ȗ–¦ 3&büΪ}¦GԛTÔ)ç"5¯LzDï¨p)qhñÒ¢"1q¦®*šIvŒ[£È%ó…*s±Èý»qkÂfNÈ cóBj„5öòñM)™ºcÚD 5ýDÁË&|$e}”âÿ^#sÍ~-€ªSÊ&«g&*«à\úûgÉYž¿¯>£Ѧßðz YšíTèÝÕ¡>–› ۊÏÊŽxÌm»é¤°HmN¤;]@i: ’”§j`us®Ñø\Ã&ý}*Ž®¿%ØJª¢òw2¡h6Ä =¿×‚.Í.r‡ÿ'ι,f|nÿáI†ýï8øWSb\»µÕÊÝzápÑƒË ¢&×Lùnðm2K;ý6¡‚"¾ÀlÑ­VìÞ°P F=g*Ì\¿æ ©ʬê$8F1ƒ[{/qG‹?`§7{,™—8Ái'+FA(ìÅ"¦NÀ¢ >Â*OÛÆ÷Ú± ª0iØ‘·Y¬QT 'ȖÇã)—%—KøɌ"RfB${ƒŸˆ…yåÃÍ^çïoå8+˜Ñÿ†…¦#aaRÇû\8”šI”¬…'süþxAÜÛ·ú"iåõçjÆõ*h» יUKå`l=ÿ^h!¼Ý0ê ™ÄRÀXQ0Hâ³îDQh^ùnˆ%6G¾ƒ¨Pù±Y~“ÃÀ"ú ‘6cVì/?éÖ©/!|È4ׁ€ —e‚”7çYžÿ›–dË. ‘P@çöWԇ>stream +ϗÂ?¬÷˜òÊˇ‰v¥ñ–dՎw5²õž.ÄÕIS<¤®„צXFrìÞ2£â¬ª¹ä\ƒ£tƒ-E,\Lªú¥RÎ_äƜ'Jƒ`™KD˜¿­&ŽRa«o Ì)ûdÆxÁ*ð*¸Þ†’Áž§þtŠÜuEº4ÏÀÙ0ÃÊ£ZÓÂBmD¾%ëä­D:HÀ»ÇÞÍ`CLŠÎ-Ü.”°Ž¤ˆý-nY3Vê¬rׯf“HwH Ü©aî C­›À-²7õg«t$± &4h÷8ýw wR¿óRP{“k[ô\´Ïµ4«8/‰N+*Øø`Ϝ +7ê–|`Fò®Cû¥K;y ŒÂÐæ·ïZt{#­”Ê¿:ƃ%¸«ŠÑ^Úc˜ç.“ÿÌV*Elށ³lÝl Ro :´ˆNLݺñhwÄ+´íBŒ#þ¶Z܉žx<Ü5ñ@jM —ÍÅÚ÷)úñÍù?¤ƒ kÓº*-í¶ RLG5Ñ>ýì„É…Fj2=àjààUº.•2Žu;·Ëýti$QOµ Ãjv=zä</nNx)÷{8Ý⌮àÍ£-æœúÚ4þ(\ Èê3“Ÿ:]0i°?o&úE„‰Øiî¯Ï¼¥¾®¨ßtòû»½s•î_ÍÍšÁÅêCxÇG +ât§ºH“ÚSµØ\‚¡Q¨ :èŒñî–`0µ—‘oÄaÍ~®ô:•8žeæÏüuUF(1°÷—hŠqž¶MªlÖjÇy>;y"¬ÁÑJӅ@æ¡ëêæ…Þx?œùB?Ô²cB”QŸf¥ðóCÞ± üÊÀ—u3Ò7 ´6ē1žõÆ^IA>Z:ôBPÆÀ…}ç ŽÐ´;• Ò`‚CR]ðtŽF%\Qû®.¢#ÃÕVþAGäö„Ò¾™LXZ_Dª´“lýäÍx¼ÕÀi+ Cd×(QbDžSìÁ<éañ&Gð·ŠE0`èŽ{° ÂÃùô˜FÔÞ¬gHǕ„‡¶’e=_§OÛüc¸¯ÇÜ£ÞGô'ÂNƈNÃHœ¾Pøu¾â|(ßa*Ëûj™{ÈÀ+9C¡NÍÝGÞ¥G^)¼RO=QÏË"Tç’~ËÔ óù\#„&%ïf«<8"3¤F ȈÓÙþ1 :¥ÿ HG`¼PäîÖ }CuÑöôžæĶeÀGíˆ\‡/+i¸{SNׇRf‹}9.ݳ«“ÅÎØ#‚†¼‘àú^s¬sùe¶¯Y‘\±f¦¿³Ü7ïA›=,RŽGdÃ^zøã b1ŽD¹ 2È±W­$Üô¹& <"—+~‰Œä²ü0»à4{À"ŽÑ0MÝ_ž ó/#U?ªò?¾Æ4daÐŎC 9­*I]eI»)wDð3p/²ÝlŒûy‘üõ4˜ ·©Â#²œäÊìü1üÑRÂH®\„¿àG„@OìaEp]ô}DàG—‘|çwG$î÷¡Âj§_š#²D¥¶¸7–”Q8"iê'u~µU“ÀŽÈëSæç7*“šçc€å„ž©'PH +ødúÁ; ä3ç…&\PeîÐ1Àg`êC) fËÎá&o:f|NPæˆÀM'7"‡7È†Ã +‚×Ɉ|Gœk²Ö2"TŠ-$ñS=#Bð8/ß׸Œ˜ LôáP 1,8YÌÊÁ]!ihLÊ[¶©®‰NŒ 5Þ©CaGÑ ¾äÉ¢ÙB9QxxL Ä Rbª|žãÁ¡€Ôõ%ÙMG+ð}~è2g揵ÌÕBb¸x&ʬ« ¢PŒÙn©‘ɳøî.êÜðyj6E›8ã`ä¾fçú/ÄÎC$Jwzüúj™øèI…¤…ådRüíšÑ3¬Åˆ÷kˆü‹êõ¾6RäjQv 0?`"Tž9 „}߈÷ùÿbLãþ#ÀáÙ@éŨx^÷ðՄ„"Á™@Ú3ž÷o!Òüƒï6´Dœ…Èx’ÇúP=ŠÖ†Z”úáü¡`C‹ÑÛΌá‹jÉÎȖÄFùíü&ƒÙÜÌR¿§Wš;C¤Ý”g…):õ®XÖK-ß ¥ªkì2=Ø ezañ¿ßSc"‡€È ×ØÇIˆ·ìÁp€ÃD Á§Êо¿­á¸Çˆ"s]!bCj3÷¬vf÷Ü Í;z •@*z¸+DXÎUOOÃ$3ڕØb‚ +—-ÐÔdj£I÷û‹ÈÑ-<r龄ȏ!’û/–"ÜJ':}2äY9Ú 7ŒDˆTKYÿŠnŽ¦ðPž D~7h×µ&!‚º“ñ0Î"}ßEÅdŸ>;@0Ìx9¤ù3Šµ`ƒƒqC+L"g…Hë±ú 9 %Dîüþ HžüœëFI‰„Èàéçþ7X ˆ’×ö¹*DîþÔÁü V!’Ð*,Sçsà\h5ò&&[ò Á¡%·Žžp(a +‘£Év0Ôʞš¿¨îq„ÎåVŒMÐïÀ7ɺ&ûì([ +‘ˆ@Ѿáö+À§u Ü[x'U¯r›mUîszLå؋W°Tˆ˜LUÎòpY“Ûº€ð~ ëÜ \ɘpb5(! +žãœBɂAl…ÞWœžßQ!ò$½¦(Úl(Døµ¶àAü(}3FÛé5˜¡š'&àýgÌvÒO……!’7 +‚“&:Üc“ÙZˆä2s%뜌M9{(Ê!§F+\"%ׄˆ—c^""„Mud¯ûcL€´(.ÄêƳ,ân+Ð.WAˆhãmbŸ"‘ö”Ø+ÈK BdMˆ˜Ù-…ú¹¨Ö­Ѭóå¢;´½Î@¬Þ¤çï1u.tžÆ˜«è÷“8ÄP0$Ïè Ê&^]ˆwÑÈ©Ï´¡…ˆZ>Μ;Z•[€±s¬ö`ê˜ô!’Ð*ˑ~läæDüî[¼&C ώ¿©É‘ñwE—àPîn€ÕXS"ÑՇRÌPñŸû2‚}†(-ÑB·Û0N̦ê•QpP¸S‘Ùßÿßvéq"Djý&—Ì"!„Y&/¯j +Š‰~w®ŽJ{nŽø»Œe?¨¥Mªó]qyòåRûß*¨ËËñ5¦DëdHi!w‰¿™I8™…*àÀ„ퟲÀôÀ'DΧãÊÞîчß9=›Åý’"V€NF¹ê r&t¤'*e㩜j>ŽSgMO—[² ±í¿oðGÖA&3փHÌqöüç ¿(m‚bÎ=ƒ?gôN씂¹üG]C‰Ÿj‚@‘N‚Ž`â†g"ª+»´Ç( ÜAcpXå‰ MQ™ ”_#d~í]'²p“¢2¼Ó½ƙ£B”æUÛiZPM\/x-Dã4Ø;ˆÑ!Ð%?dnÉ4ó¦¦êÎVÂ!EhüRØ–Tj]qÞO°v ˜rjZ8v<=6–3A,LìLˆtÍHÓsQ"Äú4ÁÌyWBd¥Ð4ƒ¸­1̡ɉZ|y TJÉý3€¨2¸5"90$I©¢aЭLÊA!6ˆüc, "ún%5dD6xÈ ²šuD°*`»Ž`ÑÀ¿ rLp—Ίk£ Ò»kò2Õm.ˆX*åä.NGS¥€,ˆŠ»2†i΋Îk‘÷Ò1䃝‘èœ@A$·MpϤº>ê.ˆ$åœå`PD*^%‘¾BÑvŽ²§ˆ/4q½â„œ•—þ˜Ó‡©µP6¾¹ ‚ôy#mQu " }ÁéâIADîð“¨VŠj"Q`ÀX¡B.‹ ²Ç¹ªÏ +âSW±ób ¤“ÎàÓfW7ô³Œ¦áÀŠÊöÖ%¶°ˆ#DÂQrDásÓm— +"·]Ó]n·p¤ b3éTøH8Û}Ü]ADÞ§k +<Aä{Nk˜X‚°þ½òˆä <Ïç™ òm«j½Ï¬¨… "–ah^ s "í)•R—ñ-‚>â&N}úÓ}ŠŒ¶Àü“sZ, D1`w!= òn‘DBîܯ×"-ˆïaùšT4ˆH;&æîóˆÔ¬º%¯±Ó5¿uÕ&Ù´[dÖO 4댕Ìu+p£¯H§Æ¤£~sôüq?~%ÒD ̄¾Ë +A¤°êùwòäU‘QFgر(8Ìçñ¡oó·{d¿4h¼!VÒR>åe—$1,„-…ŽZ5@¤Swg +$RI … D€=°"#^Ù­ÇÇ "V‰Áï9G‘k¾86Ò콤­Dòb`¦õ¨ª4§’ì½B <œ+¨DlSù©gnÞõòKân'\…¹Adåë‡Ka 94ˆ¼ÌƒÅ>‚Ã1G "¶tÝ4$;/"i{PåêïüNÔl‚®)ú¼šñU^LwB û¶V㩶Y˜k`¯´¨©\«ËTN yŠß–óà òp]7µƒÈÖí°pãËCñÛAä™mÌEÉp¹âoÛÀ¨…ªˆúþÛ`N…S–ÈB°Å…ð ? 3!ò¢àA&#ã¼rY¡„HN9>x¥a"Q)KöBBdþ¦:åg αD]•©JC”/fÝ¡R–(ëò€wM G{0"_l%@8lÐw§Á&!2åo’ ÂàYBd=‘L¨‡ªóǯ‚Hˆ$þoûÓ´c !Qü\U)Í.„¹øW$WáO×mè°(jµ% +"ÆØ_†¦¬ÜlQh.DURÌ{.*BäêjÅJ5î&ÒVÏ;*Í:ꑈ5ó&F™rÕ VW–r«YDON(?RQˆ„1!<+øöWˆäv­a0ëL>¤1ÍH¶p[ +‘qê5hçòL’òEH…Èj˜ŒNc’–Èž÷"ÆÝÞÄ¢7ù\!bi¶;Tó"¨p¥B¤(hb¤Ä&ý…Á˜T¢«“î0 K¤ÇË{{0¤ÿª…®¢ÀàË"gZàmö͉µ{ iÍpHú£êf" ï ¨OÈñBÄQô\be;Åiáp °F:ëI¸9/"?ǍAû‰ †9ñÏ÷Dk„Î[Œcˆ\@fð´èmEî.ÆYâÞÚ©•–VÔBhÿ a¨CüÆ<ˆ¿O«&ExÇò%ô,ø}Ãåt8DPŽŽyˆÈãÏ»J²Cäú|U¹¾l‘ýŽ0Î + þZ‡A‡ÈVñ‚sNQˆº%˜C$S) ´•R/qˆlˆR¿nFõøn¯C¤"~ -WÌSŠJÞ9«q` Î$È@%ÁœÎŒ©£Þ†ûnËú‹äó×$’0x`ÐþE–?–ÙôÚ£fšÃ=!΂2¡Eì’u»œDï°ã¬‘=DO<'XïVs'òh<Žáêï2ÕîðŸÒvöP9Ëšc×íÂmºì×M•Y‚-†e¢]nŘí;Ø'o—ˆ'Kqž‰“´€Ævч5ë@|â<„ý÷‘5‡‹„ðƒ·éfí~ +4ò0'Ä&5k¶‹á 2OÞG(J>rø‰{vá˃²F«ÞG?Ü4^-®Ÿçn­Ó䜛Óވ=g¡3›]ö“¿¹H¡Õ¿¹Ø%*‘Êlý+Õ`—zâߝ—]p>E?cdˆ‹aG•¨•à&Hêf†ñ£P¸0ÖÎŒáU#» Öt¦7OkQw{…È +¶ïÔ6'`…HŒ5«ü%haÎ" +™]ü ðñóS ÇÔfk©·£m¹qæLdçìOÈ.í +Ê֋+.» C;e2Š°‰FULTì"̸JqÐ[e¿èC.D¶æ×(R°d֒ï#÷}”ôƒAì7<ß=ßçÊiRS:ŸŸß"?Ù Õ®.·ì؉yçr©…¾øô 'Ô%ªYˇ¬ÎkB¥ñÒ܉ò«DVÀµÁ F¾‰îÓsw´ñlS­›l΄r!‚èÚæ|»…Èm (œì"ü=DOB´˜8¥1Ý%×í™BĜewQÕ¯¥ºB¤YH˧oé «ŸÔ›‰0ÄÒ*³I8…ˆÏiDBdî̀1‹ûYEœÆÝ)½'+h@ÆAÆ!øç}hE¿0"# UçûÓÅ!’Ì1âëÕDˆÜÂù•«/þN" PÓ èòG‘ä9¿èļC}óAäq IârhǃˆÀ?òÄw,$AS’ü4Ûãd,ðÀ¸é?r…H*¬_ráòP$ˆ#u< »zVòD‹DՀZÌñ‰Ð) ÿ×8…dø¼Mù1òœõ½ŽÄ“^»Bq¤A5;<÷À "t/².oNÏ­q=ñɵ„Q p]TÇ°˜Ü°ú"ˆŸ¥ç +ý)¦?–ôŸ*Ð#ˆ˜i{óê¼såº.9DS+Pçhƒ],¦d¨¸D.ˆ<ÚÉúú)I%үݺZ3èDœ u¸#ˆŒ»uÞHÙ¦˜ +ñµŠσÐóÊA‘`‹.ÎüÓy Adkúk§û]èRJ3O ac}„^û@YÐƑ}‡ûö+úW=gûQˆ?¨…®L DlŸ|qEP›œ«» rÆ'yø‰”Áœ¤“5 "ÌÓ j4¼*]ìe¢L@øH‘·ÀøžítšŒA$?ž*‘ZRO܄…vŸ« ´EZþ>˜ú°W%Ø>t "í6 ý³`ê¥%fbÝ©‰,WS6â "G2rÆO£œEXœ»î­÷;Ø#¬öÊóۗñ;8^ˆ'TBˆêÓôŒ r` LY™ÛXókî ®àòÆ„—"ËY_J¬eâG1¿{'æÛAñ'Í‘žšفÀ/É5¨_‚HŠiÿ2MQ*×Ë{C<&3K +lcM[FÞPÿ"› +^–— 4°¹£ßPtÿ"6"yQ¼Ö´ˆ·Æ,8SïH‚8ù—2n‹Y $†HKK„®Ïô>†l­'µºRŽÎXkÇ©<¢ñ ÑEJN7$¤Ú§á䀣 „¼å¶í¾%œ„ì“óþ¨<ð"ò$—v…Ô‚Zù0(¶>(ˆÐ¹$ëÏ·áå +V28Ü]ÄØe[XGrAFò1ƒk“8aK/ˆ¸!rÅï#p[y ™\tÕv£wlDÂöl¸Zí ÖUisÌu…F?å]™ß® –Yű "¾çJ$vӟïУIÞ-®ÎóšìVáÚï0ˆEšý”>‚È̬|ßîØÍ<DlÞç즛Õ ’ì܅º¹à(ې—ÔºBRwe£‡ŠØÀuŽ¼øê³ßøì“pƒÈ,Nz·el$zAğÜ^#©¾? "Û~z8XÄ[ºg¡§È t$Üó¶ÛÞDì“àž^àAF¡ÙÅ?ē£ÏQ:ß!ýQ¨·Þ‘™ðClkX‘c[îê‡oúr=cú!™csàˆ¨ýå9˜B‰xÐõÝýEn³¸-nõCê‡`¨CƒÒ½†­Û¨ªóCèär“Ânãâ€û!Ö¬aÌ÷CRe DՇååûCL—ÖO›}žº ?ğ3/Ð CþW5§'Ls§õ‡µGÒw þÄ›À³çP$² 7A.U0?Íò°Ë÷ 7ý!UJÂ.^˜þÇIÂ_^wüSþE"ÙÄê[È!Ä’˜Njœt–7žÏú‡¼¸°ä­¨J˜ÌQ ÙS¦ó‡@ì²Çßiþ1)z‰ûçÿJê1ØJ±õCԋ˜Ä+£æ ~H6¹z™Þ-oÒòÕ ÿËbõ{bŸ}_mX|H:§ÓyœäCî;©"€ù-piaχ0ÉÇ™3û‚"2z +#™˜3 2¢)½|º’æChøgHL’>òäçݨhþpÛ7ùPçJL©"ËÐbÜëC ï7ÈGÁ|HþˆhÍ:)Z|ˆ[8y1Íb„;>E‹ùBŒ¯€ÏïÛC~ÚË>¬LùÚCv\·á>Z {H +CP+21‘!ùM(”Äu¡ÁhöQ@k‰ÚÎ?Æ +ùüÁÀà=„é(yQr1„ð!Ê>⑤z¥"c`ž§ùô¥­Ä‡0cóvwê¶deƇhŽ—©í%— 1àCTËh+ó!¿bãc 2[dùÔ¡Úì2“q·€–ûP-øÜnú¼Lw™F·ú™´8kï!–‹…‚Q,ßC&W +¨˜SÞÕÜC¬w7Ž»bfú=äרä|SæÕ÷SÄL§)÷îäë'DŽì!nC“J8 ©Köš ÑD„¯Ì j1Í^q©°Ó’7Û´E‘;x{ˆ¶—¸:_´‡<7‰Ž]0ü"‚¶›ðô=„©¸ÐüZrÑ=$¹Sb~·ÛÜC0·Jy€°—Pñ!¾vãóÁÝ`~é2¢´-êpñÝ}‰­@¾ï!áë ˆél¸‡è7T%ó=$$\x“&hmƒPLÜCÜß GÎ=$¹PÑ톰{ˆÏ/Ô]’ÍÔ=Ä}Œ$z#ìsð!?쎅À#ςËî‡ó!{ˆ !–¼Ëõ͇>f]òìð3”9s­ÞîçAJ}>dCþޒ´-bóz5Ñ!Õ|ˆÉŽ€GY'Ã,€ó!‘nÇz>Jò!>JMyZOó!ݙ&üÎò!ÊMQf³HšD†ó!Ö¹©ÆxÙ|HoÛ +lŸñ΃毗 /ò_?YíMš;7ù¨*ã&2T[ÐéËFdøŽC©‘Äc»6u}Ž>äjÉþ’ Ciú% 4à‹©ã[ӎ>„²¹<˜‡úú&¢áMÍÓåC,›J@å€Ù‰çCÎi€€&'²†è)@ô¹2_~>çC¾e|=z©ð'ù^!_lV¿çC +Y12e°æCú<1ªlÐÚùé¢U­zEÿ¦Çƒï¼¯”^[ bõ®dˆRšwxc§—S‚ÒÆfz‡°›”€OMĜ ~à¬7>b1½Ë)&Õôµ‘¨]É/¹§~ð;„æR¥}úbO:( çz1n`ȽÃ8bÈ[‡ˆ•ù>²R…·MÆë¯?:Ù¡,~c²Ùƒ f¢èvÝ¡DôPºx;¤¦ÁËÆNN„ ˆ;>œu| ý7_ø}¤Ñ±ç2©$MðUo7ÝúcHÌú ŽÄ¢vÈãpÔ7¬9Sª tÙ!ÖÉ*]£ÉÑÔ- ©ÛÍ®¤<ú×ÜÊ;dΡb±Î*ªwbð”œ^£Ø³¥"§éÓïV&qL/ ü܎Â>¢`€v@-ç(g—½‡;ú4ć\vBtüño|¹CžÅ½ûEÔ%&–r7R°%ºÛ|¡¿|iÚèƒèëúÇià0:'ÕÎ/›aDp~NvóbïË¶Ì—@t*߇ðß-z9Dœg#s¾rHóŒ&÷“RÐrãkÖÐ/ai9ı]ËvXPZt9D3áhzñYH9Äî¶`@Ýá/²òlHˆNC»šâfÑŽå(•z¤(ŽbRîË!›˜´s‹|hË!w]!¼†ýà)‡$ôøÍ}(fù˜9Ä#È+ƒØ ¾èäì‘tß<© Æ!‚€§ØÑÇáŽCœPÉ» +zbEúwö4rÈëK&þÌ_êECœLϬM7³äeo0Ów6̓C^w7¥öt39Äùc0;0¡É!vØ⏢¢É!_k/:ÏքC€›mbv[xÎË8$ ~Ñê`';qˆ°^ÈÁ/ÑÝ,™TSˆ½ ƒâ”;Ÿ¯º8ä˜e ®ÝË0|@òÓ°S5¹qi@uŸlâ¢5IŠž3ÕåÂf ãALó’* ãVù¬Š/|C>ø9ºµR µhÜoˆÚáö­kAò  à;Ù/Âe®ÀÀ!æ"ídmÈñQ´À;´Û×ÖÄ@LóüÙLRG÷†ž4`“©U„² ¸¡›–Âßqíø“w¢ax§:áÇ¶˜Hê|Íq‚C¬7é+fHà¸Ü. +ÙßJæƒ:8Ü1tÌàƒß+dƒCLÂä×Õ(€‚«Ý>2鏇Ìö¢(q¥‚48$þn?ÃÌxpȞ‘n#Šõk:¼oˆ‚äþð#Ì..èb™&C]•5¬âÈoczSç¨oÈT;è¤(à¾!kÄ«¥Ò¡Éý ñná·d±b?ÊËýòèÉMcRIÿb)yU×.3ú QÏePŠv¼Ñ7diqU×BpÈs}äy,©Á!ÃYJ +…äe¢Õ_Së†ARÙ pH²[©°)8³ì:,8ČGES’…IpÈ-£îý4ðcÌ‘úyßÀ’Z,áTŒðv™ˆR0ÒÍ=°÷®Žº¼ ‡ô¼úCþa8¤GIcㅺãpòÍ)JÑ-&¢þ x´3‡C\²!!»¾¿„Cœâ/AXãþЍáË6φQp4åÉAG÷¢pþaƒÉ#Jµ}CÈ"ž;‰ݵ¾!¦ŃaâiÇ`¢#aAz8$EŠðÀ‹‡ü 9ü¬% ˆC’ªà‚ÂF¸ÈëÜW@ò„6oèÐR©joÖâ¿ZlÙp¼ƒ‡5ÔAK’WBZPRP$–©² ‹‡ê €rPáç- ”Á! HˆB®ÜÜQ;éRDo‡<­§-|(đðBpˆ ó6>*¤3AŒ'A”î-÷¼ñ‡X<é] ‡(Ý4qj.bí¡Ï9é:Ã!ÒQQôPâ‚#[qj;­K(`;¶8ÄnŒ‹?>-q 0ó‡áo\pÂ|JÂ!ÆØé,2:ñ +‡Øv!f]¢ãäx*Â;6……XÒf­æoz³?}¸;ÖqÔTXJ$iö[ [÷TRùá†6±)$•õœÞjß}6@ƒüãbdلcöxýL*% ù…¾ð)j5wÉS/d}vÒÎ6¹Ödjœ^ó+¬4°ËR1ëÏöѹ+ß5ÃÇ9 ûŽçúŠMR”SEñýæd\©©ã#Ɣ5œ±éº†‰”Í °ùžÒ¿¨™« +l´r CRÐH”æVI–7Ye@¼c‚éc­ÙafªeÁ=\N2'âPÃíËpø«ëړéw‘þf¼NÉÇŽ`à3÷\!ý k¿»T‚Ìÿ (›®ø£ï4 b`}µæTm»¹×‹qjÜý\..˜2’} ¹V†tžÊ€R¾/ÜÔ¤ + °Bª ÊU„öç·‘’æ… ‹Ìü;aêsÔ@@O.wބl@âc‘êÇ¡_'Aß ŠY’hÉÄðOõw3re½F•Nö{ñ¬ƒÙö®â¢ðŒíif%´Ö TŠÙéíVnç:KÉà‡Ù²ž s÷-ªŒù¶Èx`› :¶˜z×j&©ÞœHA&b€5¥vðs„2ݍ ö<ùƒ3¾K®Åå5DoE;6U›=¤®ìV¼%WiæUÊù¯Ä½Ê9¤£Ñ¤GPÎ`šY}ÌP1y˜º—Üž &×mÄJSjyúu‡¡¹/²l·§;˜…üM‹gçû{•MϏ¬£›ü¦-Wœw2-ZÁ—õÀƒk±Ëø8 |dþh²?8jx9Ë*óŸbßläÙõ%—ÍÉÃ< {J™ɬ³;(@]JûÀ€È7 ‚O„&†ÔüäêBƒ>‰4Ïh)Ã<Ùí(®L9ÌÙ4Åû®ò_yÜ +ÖF—1”ˆg°ÀÉ:˜tï ÿ$´n½µª8€@Šà:Q¯-%¡vSÌÙ*ÆÒ·²¬àQ‡dC}çø“dÇhTy)¤Û¡ô#†L=)¶‘O‹Wmá ìþÀ=®å¥…ÉÜXY’Ȥô[ßd¯Ä— µ•!YØ×RØ·è?®ÅÙÄk@é*ÑdGÓcȆ,¯U!KÌØõ‹óü}ÙTkjáà}î4Bø@®°Ãäd® ¸UëK«\¥Q‰£ BçjI!©¿ rO½«|qS<´Žæe± ‚X|þ¿hÒÙ¨˜ºA0)á¯>38T>Õ_`']lW†OzfRí›Ý«7Z™ǯ§Òµí4XïVÿÑ1ˠȔ8½–áàI—\匬g.I†Zp|²å‡ùæäË1 ûðòd:u¤ G1¸{6T­Sœ²Sf§ªIªAäãäsŽRçÌ¡ÌŠC/Š(Ι ‡(Þ‹^ òč\äMhÙ$—»¦J™:ò©•)L àyÓ*S ¼˜$X¢z·M:؅M™ õµî®V"¨ÝÏ·\!:ñqèir‰¼Ú4ê?Ko¥{×nàγïˆÞh áȠǁr”»rÎËıÊØY [ð —[4²Z)®Ýè*ÿ¶ÖíKÈQJtuA—ôœ¢2}9×ı]>ëälÐÆ&ƒ'öœ$í  £{<Š$ÛTR•s:†™˜Xñ¼CRD+Ò["e|-$ƒµåBâBChVH“B2ÍÀ´¤%4á2zp¤cè!œ€ÎÌÒ¬¬êÿø—I0Sú»'¢jUU땸ǁPÙ&äžxnÎl⚨²qèõì콫͍¬v»I33»“33»»33K»›` +ç¦4 ì3¼8´°NlV¼av®K“Uôô‡=¡º '‡;ºÈë1ETÓÅ¡.¶ˆ+͸÷þ‹üâ W»ÖÈ·jA|G) ¶òb¶^f,U·P +ïžø,z%¬µ¬†…âœ)!MKüV0„À–öD"¢øC3hb ˆr9ÎÜÊGÒ3 3))ÄØÁ"~ Ç]j"—‡64᧚ÈE v™,îx<¶].RÂN =Õ´¤£OÅOåEZEU²bóõW³VÅÊ"³ ;$w.‡ÑΘFÕ;MgŽ¿—0ÒÈ~áÀgå€øëÏ ¤b1HDd[Æ'àŠ–¢Tz¦3žÅ$¥"#S3ZPŽS­º^ôB5 ¦‡V‰`f «È*b4öôff3´KǘNT.¥ä:ŸœYåÄ'¼8ôBEù剐µ ֞AërSDÔĈÐ;U*ª'fgD¢ˆÄ¡F=: YOHöå‘ʼn±Iⶅo>לeŠ&ȼ¦DŠJԋyE´çÓ²¨*ïÁ‹Õ‹¼WFWÉ—‚1µm¸·9!Φ7k^š-Ÿ²¼cg3Œ>ª2~ïCθ–èânÈ.ù—\÷»s^ž‰úÓ5ó<ò‘_Jò©æEŽ7('y†s‘Hè1<§`\º¹R €ÅëÜî—D!iÞ¼¤K"Jº…þˆp1ha’È1¸3Ä*‘þHò,鄏IO²C˜'Dú;HõN&Ր&P&á¤áLª[‹& &¨¤{•¹#PÂpLˆä¤Åfä€?Nj2:D@yò…TrDÿ(41Ýßü“mŒæÀå„ÁÍ<Êú|&hì"ÐÀ ¯ êSýʪkÁaɪ ӕn‚ñ» y‘ò$çü»Î¤“  oœ¿Øäöþº<^Ó¯…‚÷×7ö®”|àsÇ·Fôþ™¦?9̹›ð'VK °½Àaû„u7ŒÒü,"aHß ¢#‡#ÿ¤]Hõ„´è‚*é;,f#K£¨Šë^w‰£¶ ‘òOìüm`8ºÛA„ bQB¹.+^ÛèòDêCIÆژnû‘YV…ìÊÈ#ŠY“ã,Jì9_c¢aœ‹è¹ul¿7˜Í)±ƒcM&‚À Ʀ¥ÅÓåõ*1A©#3¯=—(#ýu²¢= °/®Éֈ?ÎNÆHcÈV(„h÷DãÒ´ò`«"ô`½¥þÀv<,=Zùó§5³MŸæá´âè W'*Y…ÑéSóåpr6^˹4^9ØÉäß=àî¤a×0³°ÈäY<øÆ«ŸAÌRWq}ʺcakèí-Z6g哽R<Éq1›/eLé4„ÈÌÚ¡fpX1OS£tEH[Ï2߇¬C'(Ήb „à +¿0ŽDG§¸É~Ó±4YÃ6ôCŒyÀò¤†ìšP°pe~xé8 ¸Å-ʙ`ã¤_ Çá^À u(1û|à÷eŽC I9_¼–ökø¸¸ûÀ0;Ž‘1W²<õ(ö"v¾¬Å®Ž = +–¿./`…jœ›/¾² fTÊý4ùGà¨WsՁ^@(k¥e˜”ÈßኙÅb–,7Æ?mR‘k¨ 5Í©ã¶ÀDse‰,¹ðm®úáÉýGiy–Ccœƒµ©††“½ºìh†Ü[«3H–E w‹L=àû!1϶ÑEOž=&4lrhÏfÔ‚§—„H¤Ì¬âƒâº=ˆÓ;sCŒØyFj_7A€ùmšÑx°íóöËSèAºQŽV¤®È‡ß–½6ýøB¢ŽgÓÌúß $(⠈˜˜#¢ebÑö¦5x ¶:nà’]ìêiŽøŃ‘>»4ÆÊ17²H?%êkì¹ü“›› yٝ±éÄâSX™ôú ”„ ˆµ~‘aýþè“(ðRB“t[R›ùbeàX*_Ža¯¡2Í}ÆÀkŸÕ‡áS;µ—s3´ÞÛ1LШéѸTO³ˆiUÁ÷ä„ÄD Ò'-Aê+½øD,AÚ4ƒÇìQÌBÂF­¸”Ýþ¿ 5ì‘9z9|ÈNq†Aæ@Þ;Mñû†á©ZLÀà!Ã0ŠÈ8–à †:\fb óAւJ¤êÞð„¢–B•I»àw”îJ,&‘²É”˜™Ò8Ú 11Êw‡Q¼:  ™[Xɍmèðœ±ER)uI+—”’]Åàc@Q†[‚š†X·€ý4Dÿ†µh>䄻0r½J!% Øϑ…Ć*¾ØO!AÇ]zÃ0 ÌÔU±*x¦Ôp>’™ìÈQùRQ@ie‚ž(•Lփ}kجdN¥Y›%QL1Hƒ½•\ÇY)èe>ê¸dWªIè:©àÃå0°Kža¨u°”²ÇOŒ +à7èLF®š&軫×obÎÀID|;ìáŠÿu¼0$ã§eŠ++(sFâu•Òܔ(Eê-ðÎg-xcQR¹ù絃8Õ”W?×ðbœ\}0!¯ÂdAg8ü¯kr¡Æêíâ7ê“2Œ ”2Yn™WŠˆÙÁ€vÅ0ZÑÑ]ä{܋¹û ¤ e…=. +è¶$‡q^zØDÌyê?·A&†Rÿµ¶p8 +Q¯Rƺ%`ØñF}5%úi¦:êצ’ï*8Qñ51±ä2BYT[¼{Ô!‰6dÎ'꤮JM#IÚhÃûïa–D’Âðtñ®[ÅoàŠ ^tÈ‰“â~ˆ ÿ kìþžrR*×̊×\ÛÕûqÎ6±4§+hø,UYeB|ð‰èªeEC„ +Ü]_Mqñ¿þ©!½Ðñ~H¯pò '™XcLlõÅPÒéìèÄk ʆ‹`¥!ÔwU½ÞCfÜ×é‡.½ ïvp]YMC;&ã2(ö¥ã~‹´f'E +Ø[ £%Ç©/`EA„Ùé,ƀ–2âÀȔlÊPD{hjQ‡Q:Ol# +K—+“²/’¥œ|yÑñ(ÛóUäW™f_Ôý?Å8x) $=‚¥qÀl³¶<>[Td‘Na,!끅²?ú_’©Q×ê½ú~,e$tРѯ +GŸŒíÀKüj@é6˜{˜J9¥8®åRb¨<&¦¤´£³ïoP~½ǒZÜ °9Àíü_~Ž*ú‰_Òû ¾S•0S½}ÝOƒ&HûHiý.ñdå.W +Æf‰ö‘%ޑ­Ù] Evü—p@VÆ_NÕd0DØñÚªŒ º¼Ẕ’4°ÇºZ ÎÄ IÑƒztfíéŸz0< þ ¶ðž|Äÿ¹y?ô ‚Xè(³Þ“&¡íš+´˜n j /ÞZ°|2›xc?¯ð֒/ Pßx,Ȟ„†uႯ Ÿõ®YlÎ_ÏÀw!® +Ë*Øc„®)Hƒ¦0"o&db¥Å|þ LZÆRj6°¶ó$«\‹”‡ÅOPº’~âú ¯U.0ê|'hð=àˆÕà§æªƒœœ5P‚Âϕ`fÁ›ÌKñîTƕ'Aví¬$—_ /pÑÀÁ_rœöÁ>œ5ßàl¯þÆA¹»½JÄ؊ Ä<Ψ'µǘ‚kÞ[=‘`݄à +Iïø ˜;C' +ÇZ'ÓL{9œe;1M{ÁAcô ¼nÿ@jÝBORu1 ]\Â÷뗠ˆNì>d ëùøÛ{àÞ¿ N"yøóãÃ*¼@¼ÞKWçÛ½›9 ­®!¢ 9Ñàò^œå¡T ?IN€Ù§UÝ0°êÉ›Sn¦AÂÓ¿î$)ç3€4~1€\ pؓgUQÇàÿ䪿@Þì¾€dÎÛ?òÖd “áR€O‡@@ˆ$š]0é-(pöû ^ӕõïa#­¤4@z؃yÈì“sZ`m9Pê¦ÏVÖ´€«Š-¨:‡ì)Нe㥚¾3 +°†Ù¥– A^Ÿtwxø0¶íeAeÃê¢ó èДî%BQñÐñk]Cq$œ4°Ÿu¨8—t#tÕ7HU^/Äû£ìJ¡ æý=‚c€î|¢Ö€s¸VÙÓɦ…ÿ§ [«ØjöŸœÊ¯ç8t¸^[z¥OP^ÓÞb¤í¦@ƒé3 „ˆU€ŒBçbœ=¥¢g¾’’ðLÁA‚_Q€ˆ מäI´ (@Œ°$TIS”G|§?EX#Zb${H&´ü­lMì ä˜R@þGQ:O`HQ <†to¿4dnó·ìð‚É KT.úá-Ïa×J€ÞV’@é{èz¼®äE~‹”K¢Ù‡®?mÇ$½¡ïJBT`>Ñriuß¼”³ÉVXêÿ}ì<$Ÿìø~¯óbðe²<·HÿyÈéLJ©3Ò¥š«"ìáã½ÿ- ÍÿŽÃ…ûOÎ_¡þÿEÌ{ôÐÉôñW”ÓÞ?ÞÖã!7oû§¹1Ê`ó ¬ÿOà{•­ÞÌæ/ýouæù7³1ç¥ä׎܉ÿA˜3+Õ VŠB·ú +¾>ý‘j4VÔ´8îûèo|çµG¸æâ—å/:ƒ“¿ÿÒµœk“˜^a£¢Ì5Eë/ñûžöbwevþýwŒûEB½÷[×NÏ¿˜Ní~%2ñАz_ U:÷ïÅü!Øß|fÌÛÿˆ~©ýWyöf!=»l|$Íù^ÞcÊqôó|ÌÐof\ãÏØÂ¥iç‡nþq²Ñp_ïB¹Lc°)2¯>HHœm¹â;@ar³7ýø¯°5~¿^ íû±š‹9ñŸ||izVáŸ6ƒ^'èpàÿ5ûµzSXÿ>ùLW‰MÆ×£lF¾ïkftÊuŠ'ƒÑíb@5çJÂFf÷7˜ß„Ï(®nÌLûH½ÜÕ72îÄò쫟;·Ë>¾Tæ}$Ùk×ΗÉ/„ý)HŽVËÇól“BÊjeËÖ·÷­$< èOÖºB´¾S—¾ßZ9Ò'QÊTa,ØCGà1>å£UÑDøIµ?rìO2ÒA(ú=-Àî\}tT6Ýù˜©ÒÖ'ì8ýªh‹õNà rþ¹ñï» â÷¾„¡kêísŠšhHÊ`D~Vü}3 >Ÿ+"hxò;]ò=:~ù©ù!u1„~µEæïL³?d€ŽoÏýÁ¸j¹(nürjM›ÚPX%ÛnÃKM`âÔ9P–ó·MšøbѽFü29ïá»ó¡Y4üc`nċ£ºðSæÑRSI=RíØö©Ô% nÁG5k_«Ã히øÎ á;µ¬& +é÷¥8¡:-Q¢gF9]-õä¹T3-†÷¯Öiÿ¢‰G<,ç<îc¬£Âä)®¡W 8UiðædÍÈçǎãï©kՊ6Žç­Dn×Ö&a¿ÅrC¬C?Æ"ûWį´ˆË>͂l”5¤æ@¸Ä–ºÎ ËDmgšÖcÈ#:bbO`tw9&ëeø@Ð39Ìàêh-×ý‚²‡‘ßÚþ ,Æ1}y7ì@z+A #¦ð³O€Œ9mÉt—õì1zŒšÈlðt ÍPY,Ãg(M$Škƒ ä8*[Ÿå„bÿ;t?5Ә^¾[ÌÀ%Ì{}1l|ËÔYW\X(­ø4φQ5¡D õ÷0c`DŒ@óQúSWQ’º™¹©?D@†ZÈ,sla,Žß1èº`iÂØ['ö&eÂEQ$~’ä /±œr¯|?T7|HtxA . O_ò)»3Ò/0Vc;~Ä_̼ÂQcqþ¢äñèµ¼…`Š+êwÉG»â™ÛŸX#;±òÒO•.ÞIJ)b*È(ú  ,&Sæ¢!©QûìÝA_0À¢ù+ÎC/@3s¿\wb¶Îå2…œ”õxþ=Qs莱äZÚ:¨Xgí)=˜/)ñ˜×«Å[ýX%-K*V—ˆ Ò6"$¦Âé÷¦Å:”x—M$"’ùðhQlÂ:z©ëY´¯xI`´Nڅa¸¤Ø{qôîHerûOÉ:8Ý¢3õŽ‘”)fJG"lÄȦö]I2Š¢T¯¶(Ñ£RÒQ÷Ô¡59àÑsÒaeœ‹_#ÀdÍU¬cp&´ðÿ‰±°¥¿ÃñKM[®.!+y8Ô E +†’¦i”¾6K”¿¬û@ƒ'é ItU•ÔQ`«”¥½U>4†¹/'³naZÖÒݝtÆ\˜Dˆ³T*Û'G æcj¥òŽÆ~{R/‰6g,¿!gUžt&ó¹bÒÕnÖ0;ŸöÕ™Er,5)E»ÅRžæáF¦é|k)®³žY0 ÏŠÈ[Ýr‰'QñXüup$ÿôY¦CŽ©æ¬ +á+˜£˜Óß!ÅÐ#W1:ÞX„í"²ä\ká«UßÇdê Qw ¦âúÇߞ‚-7Or; v—e²–Wj±WÊi ?D{ U·8š¾lÇ‹çJRþÐ‚wq­ö©O¤Ù9{Ù_–Ä8îYLÅ,1N8›¡_as¹Òc›e#­²ŸE¢FãP®T-4­ùʼnÂÔ5q}¬2§nBÞP,Cw‹RAÇãéUUÙö‘’j‡!Ƒ~¨-țC­WyÁœ¡8»ÝUEýXôœ±F{^™¸¹x¡·ÝÊ°†ñ35ۀ>hӍâI¾…ÚëA¯È®úŠ±Ñ¹‘)ªHXÜüK½óÐý’ Ю»BLª«‘¾¯p<$dƒ.°¡$MÌ*ÜPûÃe +›©š6]è'Ó +F^¢±‚‰$l¸4Æ]·(lÍUdKøÎù‡Ÿžij®±Œ{™}7o­gaÉaßêIñ¢á‘×ëþ ¿ºð¦™­†3a»e_9•Ð£ÄםX#“„aÉK„gŠÄ$V’ÁWÁxÍuà ęӁ^eïÐ +_Ï͜ùŒ„ aRL†• —vëќD9„c +W»CÓU Ÿ?Ø (R3‹y浦¼+oBYÃgpHŽ[¬~™]Løñ]srÜæÈ-‰mžB“•$î_ˆ¥ +¬öÅ° +x@ÒÅ0$sµ¡JZ)ßVù¤$á…iš.Èċ_hª +SšÜf›ìÈΉ%,xKyxÀ¦$y’„}áØÅ"2K ²ÂÙʽÄh2§#,=j ¦ƒà .¨¼Ž† òl¸&9ÍO .¦óiÉ{‡ìv̒$ÿÇêg-tê,žôPÎ?bfÊJ–ÿ"öí‰Ã0¨<Þ7!³1bùPˆ‡€PdöJ጗•ÿË©EøÞ%O›cIÞ̓ã!lH˜3G2Ç¥S Ûæ_ˆî·¢;Ž kb¢ˆ¬ÂY ô¬2ÖƎOR |+DµI dZ£2jàPži0ƒ /¢£Ý£­¹JxÛYù&F>õĘY.æã V7€ÅweCæXî5q›n/-eü€±Æ0lÚ¥zÐàƒŸC£âH‚)¢ˆýŠ*¯` 2©Óv–®æu՝¶BXµ±·Bû̲›,Ê(ú>)ËÖ!(&HôxƒÃ:p<W6È_OnH±Ÿ~ Øÿ°ñ“#W¢®n]£ÌjLrž®ØTšU#t$ävç|ð–Ö _Ü¥n"æQîvý3§á"uFAJÞ#:¬BÁŽŽ Ë:‰Ðh–=Ewfð¿s~×µY-¶€Çù\دþü=%“ô+‡³ÌÑ3”!#Ô|èã«–ÆiàÏf£o0lʧ:0‚Ë:ÁI?-?Wžã˜Òxl—.* M£¢$¥E4„Ž ËŽÃúQFšøí0  ËsVµüuï™ÝÀ—ÊJ:^>†m9ÆOŠÖ!«þ‰½im´ÙGšÃBbT'0œGéà‘o¶Åã©ØŽÌ:ˆÿ³ÊÕ‡× äJ”¼I Üˆàyý1¦Ø¦áãÕÌá <ɽ:ìÎ-(K£±·y=£› ,eð·1óÄsâÚ2ò+Ô(ª/î'QSU¨f¨Ÿë˜pÝ&¹¾;‘bÔÁ‘Ž(XƒÌÎPÁáGGG¾2±þ¡§óޗþ16ÎÎÆF•èDzy‘#8Ïç@ÛÛ§ŒêÐëg邃4ք³öæ:.íÕÂuUlâÚ‹—3ØÀŒÙ&]$t}dïÝZ.è¢X7Äü¿ HÆe?Ò>#L⑤‘uˌ„6úH=;}ÐÖ5:àD»ï\H˜RŒjL0)^ðå>śònGÄ~ÓxOÂýýâÍÀ¯,ΜÁVŠ‰O˜#¢.¸€hæ%¸;Ò¥Û"J¤›µEê<˼lè¬ü£“(û'ȆH˜°|wüù ΫP›x{‚"*ySÙg [¼Æ .û€ô˜þ‘Ðjؐìé wn~ߞÙSž/šfkV¤IyP&1ú)ª¢µ:ÿ›ýÊs³AÜi~¶Áé€ç˜#íÃH³çL í1«ŒÔҒò% vVbè½²nz½ç`¤ÐÆ⚉$É¢g­œ9Á'P#&¹í»jÈ95žÈ€>˜éÅ4öĆÄÉ0ØD™yå´p…½~R3TT´ŒðIª‚-…QÛíðY6kÓCª´ƒ{Êbˆ†¿Ù?9˜îÚ3½ùˆ úH§nEÔÈqoƳÎ>8‰AÛÌÜ 58ҋPÜcã R~å×Ö£o ¾g­;¯zDª½”04L‡€=tóë`†Ë0þ>š5!??Ɍ¥§;+`µ§º‚óL·žæí-#áðÿ'züÓ9ºÝ´NÓøKM!¶q³¸ê[×ÕºÍâs$jKí'Rò—3©Üdó‡Ï‰ŠÃ¬Þ¨Ç>ԓÿC+†é-{uËÜJÜyÕé  q`;öž!1n¬Â)øKë"¾(sw¢5ÙFâ +NF•®EåQ%…a¤5T§y-ÖÐ0'"h&Á¯äŒ¡á’ Ý¸eƒOÛ¸ŀ"Ñ9ÿRj\y<öKœ‚ŒÒPöY|Ä EËIN„»ûnåeJ¾ƒdž¢j\*å œ‚O1Əaû¢dÏÓ#K·Ž“htºð;‡‡Á#Åâ8xçDn6Âø¡!´¡×ÒÛ \-݂ÞØeàˆ2&ŠEVn²kDt_±È&x§jó%¬àö„JÉVŒ:¯B®B~ˆ ‘ +d Ôæ"ý$žbR‰rIéyG­q֮챻(Ö +ôؚ6«!Š—×. inÐqjì4°}Mø 8,v¨¸OHºéèЛVª<Òá}l7‚Pg™s°¨HbÂb(¥ʐ3I{‘3hA¸g7¤’s{ÂQ¯!p8‡M. ™+œ|ªHn°?÷Ók h—œ{ö$7ŠØ' G‘½þg@·Iђœa…\nÞñ±&ÍHDã‘ÑÞ¼Õ-Öq»ë¢jéW”š†Æ§Û鏠Mxëa°«£J¢¬‡¡ '#„EŅ7epk^â5¨.Ð#¿z¸¸}QômD»¨ <<K­6ìx™/MÚ3nBf 5Œ9À¡1‡˜&ˆÿÐ7MÅ÷¯‰Y´#ôÃd¾¨iõ@Mi`=½i 0+4§Èಿ5œ5/ Áߥøê£ØIÆùG*D>T Ÿl±°<1‘W03X¢“x|-R l¹‡M‡Ê$Om2#Út¢uE„‡eûÞwê²°ògˆÆPx…v@J„ "Šr“DîdZú¡oy›äC>c(FýÇBO§FD9ßíÝFà-63SCbÜDC/ÕGÙ ùµ~t#:$'C3ƒÛHWZ …”‰ 9ÌÝ M +ã.$„ MƒÈZÈX»ì,´Ÿe…2!æ½1«„#˜‹ƒØ–4½ ¹⒇ÉúÀ!K…Æ=Se…‚ì­sáŒõ}ø¡<¨^7¦w´%CÐÜք8Œ>dÐ(®¥iØ`/ʚ §‘cK‚lu/‚ØyH;š +Wa@8Þ‹_r;?tœâ‰DlCOȬ{¢øÇìUcûC&y[ПhçѬp½öE!̀à"i!Џ™ùÜ7b‡¯KÌÏß÷áy ¡%?ËöZGP s:àçlX!ïƒ?zN÷¡5 –ö‰õ؇_ ¶>ÁdMôÒԇBc±ÇÒ§jœb"Y™’€,pè+á~Ü@Ïhyµ8E #tÔ÷qWa”÷àD’uÏÜgq[B¶g,JÚ#”Oö '°g:bÂõXÂÈYoIKUÏ;[J ßtÁ8¿íÖdŸI.¼Ú^לb‘p]¯oÝ¶"Ìè„fâñ÷I2,ZÐ:·þ:£Óº[–F”VrŽ©ç ~ú7<Œ­×! Bh„¼ê-I‘xÉYy› †!\z G ”>©ƒaIÃß2kÚ¹o>;v’ãÓ·˜R³æåkoìîÌÂ}RÌ·7³aÄG‡óÐޚО+hM‹/ ß±°ã Œ—4Æ, ¢¶r òÇC‡é 1å_¶ 3ßMÌ ˜ìaGÖÑT?y¤ì!ñÞYéï&|_ÅmQ`LR° +Ä^ ‰2.®H_¼‚Õ€¥9…ã™+Ô˃N¨c'ªY€Ø3Bõ‰ÈqÕ ò;†<8œ‰±×‰€a©Òè1В/2©¥LiÑá8܋ƒAqɍtŠ;±&Ìÿ=@aðÎ ¬©-"òlÎâ¼H¥n¼h 햒ÒOn½¼B k÷û¤Vƒ:þKd–ôœÊÕGôáè}€vR›(KÜ˖ÇWP ƒòÉ+LR¶QóûèHF•Ár%—=ÕròP· +‰La&à>©‚’$® +ñFÀ¹²¢Á‹dR`c…i'÷q ·5C¹#>h!<\ØZ¬‘LDrŠ®]nf^Ï¶Ô +â¶Ô¯Þ°Ï_MW©äŠ²Â`Bý›-ùp³FêIK ¬4T`è’PQ·%ËmÊSŒù¶ õ[¸ Š›ž_¤&或‡«+öƺ`Ê˜_ àìo±³T†cÎþ-â©ÜûØ!£ö·£‚ïâV²Oò᥿ñTQ¥5I7º {o–˜‹ +}J£õ5÷>[!öÞu½xå£Æ«aáQ*Ó/n4ê%lã~kbûès³ >ðÑo%gþµ„ÖV6=DŠþäŠÎ½-½Bà‘@;H¹E)ãºt|&Œñ48Õfà©Ž{V$±°¢!"륱©§M§ƒöKOPçÙò‘T+(€b£Èb_G™ñXòCà|ú’â‚Ùx„Ÿ9f%Ät˜ÞQTËÙ|I‰V™Y +àâ @ÍphÚ1’iU†9zEÚ-RKµàƒÌË£¿~áôæI–H¿T5‘s¬9 z††är –<#0îê¾!ÝÔwž!§µ¾´²›R!Í&eQð„l@î4FæAª>Ȑq·Hk¢Ï¨Œ[ª;FÔfA ½ŠðûEh%D©u<ÒZdˆ€ÃB¬ÉY͛÷HgM|”ÚãüÚÛ¤Qãzôl›ôtjÓ#}G 9ËeG–Gêqݏv5€ð8}¿âƒ<²ÚڌõÛt SmSt|Hp>ÇÀ6G›®ƒÐ‚ÔËq‡Ü,’ãÑä)\(¦9¬ G6±®ÓùLÜGo´šŠNH»ñ/Æs¬HX¾ñÈÐã써£&]‚ÍW«ZìiR’[{3-—ô¶4*!É)žM‚Š×íÉ øæ™=„Zqø±€ŠýŸ1z¿wóûÒ XÉ^@…¼p37W33ÆCÕáËÈAñ¿}f^\WFì²;ä“y›Ûá@”—ÓƒTPåìx»U€ˆŒ¨•~Œ4rwcô$ºáùæ`WÉ¿T@˜ì‹1lMgx/2všüÕv^ŒßE^òÖŐ½±ÏŽpäBÓkÂÅ^RÒ ÆźíÞâu vm‘{®k­ WØ´øL~âYtœ6¶,Ò®<k”5¦½qƒJö"ª"’ê(L”ÚšŠ„3c_z½QÑE˞§èŒlMñÃ_ƒ¼ÁL… K‘'{Æ°™’¬LÈ6õâ(.¡!½(Òh_þ.?Q‰Õ†ÿ]ż…œ}`s´©-;Òvú‰@Jɲ'r0 +ßÔ¦;cØ9‘?î›è>õ=R%©‰ÎP²›Ò_S¢ØJ[;‰<äa–xJ"]]fÞx$†*Ä!‘ŠØ©dýñ(Lîˆì.[ßYHwIxψ¾jB½ˆB¨ú¬QÙ r“º]ºÃ´m"¯xrÕRzWÖ(eãÍ@ô£ ÓKœ0.Žûp¨”E4Þ@ w1x•¢ŠyùB^Éø•]Õ·±‹OoÂ࢚eB¬)澄Td‚ØæÓj_MѾ’ÿ”Ö®aÕ¬^ƘBôøš†h |æí#Ü”u»õùiø®ÏQHÃ-´ê £HÇAvg|ƒÌ·Àîà랇ªºçµAêܯù_-Ê#†Ñ~ŸðqÀ†A|ý~Á)q=ŒÐè÷åRí—nÁ!rg?}æ´YÐO·ë +¾Öû‡‘ÇžÈH³Í±—o)ü!^OY—3=À»!ŒPcé¾Reþ̀{)!m¶p㊌ß×v"enÉ"&Þx†]³¯U +~Ô 68†ªl'9üµ®¹”ÙÕv;¶ºõ4C匣·Ç4u¾×[Íö¿;r.gõʪàX“ÀÂ%–’ƒŽðµÔk=Ä 1}RÑeu%bWs«1UÅ°eҋb¹§ C¤Ã!߇1«C§ÇèQ,ÏÔˊÖÄËÌ0 #/ìÂ`P9Êëu(pí©LI(*Öbɓ/.–Ò¦ø%JiIE¥rîz£!£š¤ÆhŠÅÕ2´½@¥ û;¬c%SË#õ(˘q‚"»'|^X]~(õ/žÊÜČDƒƒ”Ï329 Ê<‡¬8¡,ŸS•öN“"ÿ¦_&q88ɑµÍ[x@VŽ“®ØA{U `>ðQÀ8•­öþ(Ðõ–öšZ¨@‹…‡vóÆÌÂvô­1áAÎEwƒ$`¹ÊØZ2mVÀb8q5.™¿‡Âž`ëžDáÌèÑøT‚,Y"É46˜]h@JQ¡8 Fäϸ©D"W0cWcD*ûÔ™†ˆjQ€˜*ªü$ã# Ó껨½þ7Ð_",èóÂC(±ÃÌϛVU87X˜Ó*4‹æ5Ø”(Ié¶ 2PžºÈ‰D8i”ƒÎˆˆñ ¢©òQ±ôÌQ7_äèØÜyxÎa„ý r@M8·]DˁÄ=Î7úrˆèH!CDÝ:dŠCä°Ò"©ˆ~7íGD½'&9"Ê9{V°Ž÷©ä¨ê¬âˆÃ­Ÿ‡¢ú‡^ ‡ÞøqThBT+´Ûk>)ùŸ# µR®ë$u÷ «Idnj1¦áõC9§a‚øQÀü +~(R¬£'pôâ[ŠV”\ÖµÄÆ ÅúWÏ +좩˜pçf®&KŽ éS="žÝNö¸îmhõ‚]SHK ¯ËÛÃ}»\Fۍ¹Ây¯±µ|ÍØY ù²4¨å’‰¹¥‹Ê¸Ò«4>½®NY0¢¢¢Çe7Pƒ¥}«ÓgŒƒ¦ ”?Hƒ+æ1 )˜"(gʳgçÌþŸèï„ÝØÌq”ù$N‹Áh͖ÄeÏ2¦·r:Ńéö\c*òs5—ˆ¬‡ÿ‘ˆŠd ¤$Ÿ¥ä։䦠Ž‡gÓj-'šBÞé‡,K‘úd2ÒlAxýA©¯¨x¬“£šHœQé?*Ú^ b‡£#¤1¢/øÖ!b A煩hOj‚¨D½Ÿ[e=ÒMg“©î‘4ŽêhbsݨÅÀi"¯²GÓD×ÄubÌ–¡KŠIF@,ˆëÛ$ªÜD;|¶lQ”óª¾è[—„Ë͐¼_xЮ§7{´Ñ¿»K)œJq› +G¿ÍûÄ㧠]|)® 7§¨Á+;‹D˜ »SQA…BY*ü48aÊ]m8– al¢Ã‚A†ÊóÁSä t‡€¦ð_Wæ!"Ðêÿ%½%?æö¶žj­³Ë\ðþgI»®céûaLó}}>>hzòÞÚv‰Õ›/Åx¸7t8ddO‚`)–rVÎÖ¤ÝPH7J» +ŠÞx̄%5„_äªöQ KY€¢äm6ñ:•/~rœ>låR™£³¨bVìëËtî#•š·å5÷ñ霥ÙÜþäóèˆc$l7ŒÊå̀X¬r]ò(qQ¹ÓA!<:èÀoK•› œ¦w„{¢AÊĖ²N6¿70@%¡^ŸØ@˜ežtNç”ùeñÊ6$ÂÎUOIE^ÊUñqÑÀ`y"Ìzl€¤l|ºù[Ð>8 RNêÇÐf*©…QhŸ«Ìç 9;ÆЈJ̟ÍV 9[RPZeíD‹ŒßàäL8¤ëìÐۘ'|jöaÑm ðƒÆA‘Ts7&dS4I£W'¨ S\Mä0d)ǧ…ÊúÇƒd¹fšëŠ0hZnI(ŠäÆq BÁX• ÓqoX‘/Ç/•'m†2 b*BŸÊ ·0¾¡“CrBmÚ$†€ˆe¡`â>­~¨~WòÊd4ïÚÏüS·Th³”r•…ea‰í)~‚ž±ÉÇ󐶌¦ š/¬¸ùÒd¦²õmÃó Ÿ +¿Œ!–&žr§‚¨ñâ é~Ì(Û85PÁHØ¢Tܱåp‘?›%Ë §½iöå˜zdõ­±A}s“#f†ADpßHÿwύlÛ·¤‹ùœ¯ ƤêÁZ>Y-ƒ¢Y4rE†FO‘C]¶ñd« ºñထ¸«‘K» Þ4Ö·5_pr¢Îƒ&Þ7îÚ²<ÝKçÌ5gHlÔ€,ð£LuøqünT)?³ýºäÀä–ãE˜x–·³Âm4W=ÄI %ˆ‘:¬Ç.ÒgÓüé72I„¨±!­öšêÕÛawi8ÿp +ƒãؒujԘµb|H$(Xìü‘le^i]•Oegmš¤ÍÙ& 7gÀ?ܦªù‡=óÛÙ×BÌÓû;»lÉþ‘=ý¶bŠYÌàƒ0P>&´6JùÆ µb¼¶x4çG;¨X>ã&ŽN¬ë¹Î[{¥Šä… +T+g)ª[Ú#Iî!eŸUänŽ4þ –ÿ@´´€_ÿšÜ+üØýœl™¤@œÔ/ƒ®WG!Lºcç=3 ìxÃM?ö9‚›ÍJ$›æÆ'€¨‡.˽@ez҆ùo„õ$rߔ‰kbâfC©]ø¬Ô£*]]Râéò=QԨˡ´€-a4m'·Yd÷é&TËN&nR8Ú÷Älwkµ²Â×Õ6&åê+?3 ;n·ÂcrB¤i~õÜÊúí +¬…”‰ªë冠œ³1ï´p^>SÉúdzåï,’ÉM -W6&ø¶ Š’ƒµm9-qbŽéG€ý¶Ñ@]œ*OâÒànç@¡ùªD@TIe‡9Pq$ðÊË"r2§êÁ¨î“?‹…|ò7EJ¾º8MÔÉzF ,bjä] ¾fRçþ»ýè +%•üsŒçJ(a Í!ì¹DtIŠ/ǔ¡!x°×£“‹¯â4@>h[À^ìXåîuR  ÜnL)ÍvóZý”[©‰*5I$ªçioÌT¡dóÀ7z„+•å Ç:2l“ü}ÜÊ؝©tˆˆÿ»\GgÅv´†îÀ±€_‚`“VHQéëY¿I9ŒHÀTD`ijÀmÇEgg‰û݀‡k „ùkí”gˆDqú$MÐc ý`“ih `W¡þ6†ý=ìݾÑtˆ¨ä¢»/²Å¶Ëx²1敼yÍ(ô/|%kºü¹ + ­JϕPnŠÆL¯@ÿ!Úï*pa ;PŠp +Ü·GÓ\hgp¾O~QÒn×2:­<äÄÀ¶ÊRv£wC‚0l=õ€¿h5wÒd#Šæ À¸ÈƒYhFÓúg@ýØ@ð€QhTZà&÷Æ#wZÇâOíÅ#'n€À‡%ª­”·®?L¶†WM "ï™Añ’¯ÆGë蕘E/JònCßkoAoAQhawΞ_å\nç1нmsþ±UÕcTœàbÝc8fPÛ'/‹ +Áéâ²ïæô*PêCh5l¡}žTnŸ^ÎUXRÃóæ›2¡:p¯ñÐñŒ$_¥®/#žòíö‘1Ìs’·óÄÕ  Ø-¼Mq91þèݶió ƒÀ•pŒo&Z¢ìÝqÙËX(Ãuaü©|ܸøõ¼£+‰u¼Ð®=Ìiï³øD¼£Á»ØÌzsöëhKBûY»&Ҏ&±5O[ø î"p5€^`ÆÄîŸÉ]ðOŠ6«†™Ê¶óź6(Фss¥Ó¡OÁ{c{ÍRȟ+,tƒÐ¨aMŠ‰šF 0£My+ ´Bð˜BÁ­ðµP•óÁr‘éÈ‘4(œÆ@á¤u…Ã;´‹2YÿGGèh‰ËR(Σc*½LÒ#(…r¢-Šü‘†•H—·‹Ë¬á58m÷<ˆ˜A*„Ž5¯jJŒ†5ì] ¬¸ êgN¢è¯;&SéR÷w~F’Ú}úǖ—„D!¯eÁðs7ê‹}¥âR à­©iF.5’©1%ʣš8•Qìöåz!­zT§ J°ÿbr)ÇÎãɞ©Ù|ÕÎMÌ°Sn6Ä rüœ +ª4[[ÀjÖÑóR„j©‡‘qㅠ÷€[en­n +\ßÀç/ÌSù‹¤¿SA›õ9;ø?\žSGÏõ š52ÎvF¸kK£=ƒ5Yw>ÂÍ«ÃýœwYCWáaOv̸xµßÁû=!t*쁀*HÐÕ$à‰8(>ÙDÂä¬b²Ck?Lmî" ÑQ‘ +òÖ^È>—9a4â1é“dÎÙ¨gÿüðxÞ|øžÍeÒ¾w[Ýü÷Ñ$˜×[žˆ’ê?@šH°ëîüŸ ·½µÏÉB +Aüì…Çù¶C ÷wŸ›V£:– WXr/<Ýâ$#Sω÷{h2HGžéJ|¡¹²÷| +z ±'CÆ{H¾˜_ÔðQCEwe~×h(#é縕þ}-Qò +ì…ä8×t'LÆ\Mâ”8]œòÚw0Áâ¡ä„)÷J<¿êq7œ=H‚aÈoý.‚x}‚¤·Q+‚™A½ˆuÄàú‹Ÿa±BðkMÌÕhõ—lC©«­ÛANMì–Áøü’^Jó/ä=®n#Kª$ "³ h¶34EåÔsZDQ^`À”LP¹d²žÝÒI?C`BW8µüK/ÜÕTs0 S[6ɦ\ÕÒ¶Øf@õ/ÁÀš&» ¯ö–v9þ=9[,ôñ@%.ŽxºV…ÄÖ<'R+ ¨ŸXðNdôÀãßyZ5?Ikçüè€+¢,{¼Ÿž{BžXPH fzxùî†çIħP:#HNYr5§«¥ r…´”5 rJ‡(z¤H±² ÉÆ¡¢$ÀëuþÄJ&áǯ=èFÈìd‰*FÞ;É·s°Vh4Á¢Ÿ¢]'…þÈ«:Œ±gxmá±?çeßõJ¬¾vïú<"zýƒ>ýë´ þ×:î—/LR0WhÊN˜­ +)#9#h¿~­§Ñ=ƒÇ_5“PÔðõXT¯ëÞ|ÝD¦ éYH•0¢_•+‰¦¯™#õòñlUÀù“D¾ÞA%Z}Å)‘kQú}}r<8T<•F÷aGÞP{€ù°$¨–Co( e0ou¥Ú‰)LCNo5J:¯uñäñTj¾1m_ǏС^[·­Å®S²ƒØò–ß ªòœø¶úŒX€6ˆH QF<¾Ã9  +0]Y—Ÿ¸° …=á„D2 öñèþýÉhXL€Ó*§@`‚ÏFþWþ‹§vpy³¤Æqx`CSI€5£ëg(ME¾Z£ö׸ev`F"ŠËŸ>9áé)ód¤Œó«§̖TOœãÄ­f!ö0Îِ½„ž~ó1B¬.Ôêv¬¤‡F¨ÕƒÉ˜h+yD¡–&°‹Ý±¡)€§F垧Ý>Âq-¯²äŽ#(`Td„M¢ÓC S©7¥"3ì b¾í’»­gÁó 6².Ü×Ÿó_KlZ’'6j¶»REŠ¼I¼£²Jvî…ðõà •n‚EpÇaא’¾œ:=À0hçP–Ã?>iÁ$+Zi{ánIüðÌÙCp³I#¾ØA=š–êv©8K¿ÍQv³>=€Z .òÙxbŽã V֏%âA^§½ ª°’Gk^û®éx…Á“k^$GCS—Õ° Z7óCDŒ$…×ÂJo ¤6CK—¶$ýIÀo‰š¿äb‘h…§Å L †˜ŠqøJ’'èxxê¾zX‡ŒQ×ĞÄõÏäÐZ:Œ%þ$ÌÇ*÷M  ` +–_Ãúš( {ëúb&..ÙÝTV—«ý³PZcd'%L"Q¬Ê¢šaG©é<¤ÑŒZǕýN91Ÿø +Î#UMïM¶éÅܨ™I;y%³9Ätc­¨dUÈ9Òà"): óx3'mnn×ÃQ<_&£;cۄ-Õ•Ét|$I%Ge~ÔHžv´FN¼‰-- åsSªàb¡Ê›GdFŒjrlÝZQ ›ºêY«j6òÇ}†ÇÛp‹N:ª‚dæŽ[€ÅÀ $U³j:e‘(¥1;TÊ[—4à ä”e,½ žÞ\ú€ZC’DàüÏQ:ª0[ŒùNý-‰§DcâWïP‡Ûn[xZ^\Ú/C]aè&Ն[8ˆZ7†½<$M6tÜõPnX6Œõeàq¼ðÉ°CUûuÝy»b3„Ë Ún½hô®âþ}¾ÎnþF<½;ýN&0ãwk&‰ö…›iH_`Þ<úd…ñ‡9ž¦u÷Fr=Ùg}|‰Z’åg”,‘U³â3àZ›¿gšî´;œí"m _$~<½}ÆP$r²ìäþ‘[ôìù€E²»Ñ[ѝR–³´lÈßcä5Û¤…ˆ.ãì€^L…j€íM”w~ÉsL@q áb‚”ÁeÔÀpm¿¥R.2䅔¤-êzë„iQܝX^lAðÑmß Í|7Ûê9v‰ÔB…’ÖË­k3éÁ’zÿ¥ØQFGb©¼Oa•lX> «R²¡6´5b“´­¬çí@Q6V=CP–« ËäD|ͱ_8V’_óF¿L‡‚~-ò•Î&Ñ×s¿:²Ž#Ì;dû<ç…cYÇ؈+ªy½¨NŒPã_Ýçr ÿÕjE™aÿüŽtv>4”í„sV‘!÷²øÜΆۯì…Ÿ*70£ªr V@ýD5¸>?H8 âIï‚9&ÄÚ'©<Ô°ŽÒi, aàqÕæÀœ÷èá`@ä+Õ!wâé}œ}àÂÃ=Øó·_a¶F +y™Y7%s +X¬±ØB"þ Îab¶w= — •³ãÀ+H1Nzº\ð®\i…¤Ie hêL¨Ö¬Ÿ$”ì¶Zóð&N”¬˜ÏƒNRkûó.öÖ®ŒÏ$â;á…éLláVp_BEJª ïfÖb©­˜u·Õ‰½§WŠ$1;»@»d>;ï,Ã¥â+µ·)¤AîÞbm·sd'*ÐhÝÕÏqk–ç{¨4›‚+öa‚•úÿ +W˾å,X}ÚTH[;a#Dŋ䦚‰è‘ÊÙfà{ç‡ÄÒZ¶ 7>Ñ{ÆBŸ–¹ì‹>ÓyÒ¢ûiþÜ\”Ð ~t#—C¾ý·û·Ÿ§ÆBÌNAÅxϊ)q7éf™Õw¤ãQ»0(üè…Òœګ碜ë¢÷¾RóD‡ëÕ9ªíCGnjBæ5ô:{ìÀ‹OAº’Ršág#ïêå}•){½{ ´C¸wpÕãa³Ë.›ÅÃù@¹üì]Kè[—žÕýá¯ßeÄ|Æ_<¡v ")§†44âP#fFJÁjBLâ!“x0aF … +.¸J8˜jö¾øbaäÅ÷TPâ>Pe%¾’’â +3ìμ8L1)¾óÝw ș¸bÔŸ™Cìëxb,Î$6†"" CÕ"*¥Í´£ °B«ê“+ÃÍËáΦ06TVÕPfÕ –b5k£‚¢¹¨±êØXÕ¢JšlXÑV ¨VmT\°ªÚðâÁ%̈ ‚U­^UØUîׁ`"$M²gŠJÆ"ƒ"¢6JC˶m©–Úöº Þס¦}}ÒâÚ¶ïa³m›L&—ÍÁؖ‡âþß÷ý?úãÜÃ]GП:}LczÎÏ =D7Ÿ®PÀŠÐÄQ +Ó0™xI’8:ÿK±õñ SY@¬F0£âͬˆ&"’±0W ‡Æ e›íÛnÚn¤0½,f”ìÔZo¢ëL‹F*j’á`\Õ)¸Upe•h ‘ÙT˜Õ.@#@" QÂ.¨PDFXˆFE|Buq%#~„²"œch,ãbñ(l$U"&!†’fY²ç9†&I²h$µ­[—eÛ¶Ó¶ÖV‹j­µ¥R[ÛtmÛ¶XìÚ¶}ß·}߷ǃÌóÙ¾¢H@Zù—¹Z,6?ÿ?óÓéâ·û]ï7AÁyÑÌÇ333ÃÁÌPÍ:ÖQ46rd""¢R‰NCPÀuMkq†Y iUh5T5ÌL£a43šN§Ó’jT>öü©¨ÇÌì6Ö«jSó5… 8 ˆlÄôfŠfº²!ßAÕ8*ª”ÕUÙëuì¢,°2;"EŸ=ƒJ”î. 9*$‚?‰ & +ž2”¹ÜÙjÈ6ûÈÀE,â‹ED $…$)“$I’ä9$9$IâpH²HžÒ£4 ¨ • ŠÒVD´î7&uÉ·!~f”íD‰‰¦Ÿý DU³Ü¢‰2¤4÷-#~àKmŽª‚LêG£ðº6‘ A £ˆêÂcþüýc­¿e]ãÔ3á¡#Z¥ê‰&ôKö÷Ã$4;µBÜüÊØh¬I÷×ö{áöՁkƒ½ò^Á[Ñj”ùŽI癐ûF£At0¶“—bȼwITï,6Ç¢ƒƒµ‚õ"íðC‚€•P(G-bºIª—: yÐéMGh›ï£»yâZtY+JýÖø c&éLvFA^Âç2£YEw1YVˆ‹xÐåý}ÊÐMSüÏàÂÏâð>šÝ»á2ܦIõPböPÚà +I—…@ž{ðf7éfŸ¾Õ…鍑ӥP7t"Òºiï+CÊ?â‰kÁrAÝ}’Ûg|õ¢ :]# Íîýó‚È““pðý5?£ÇKîÃ>ÐR  +0D×gó u™Þàí°tpÉâ•ÞãvDéþÃò—ïˆØw’m`V‘µ#³/Ñ=Ñç¨é«~'07x| žò³ g_Ã;¶üʈ³KV¾T…Ï´’ï·F-¼Ù¡Ñžñ·£@â‚ËdôسƒŸpºþOI&Ž¬b°”Ï?¡ù!çZm×Oà%m«íiLp|Þ: q bý†|‡§£ù7ÇHݖÈñÒ{erJdŠO~ÆÜúߓ—f³,Ïq(‘}‹"„d3px©O܈¶t¨hu'¯ª1·J28°ýbq)¤Ô(D©ú\b¾ÆÖ[BâF<€Ìú³’˜–«^Ìâ&tä‘);ÊB)ïEŠYŽ# ˆ§dÏ8Âø}&Ï·%”½Y.Ó稙|VÜnäòLJÀê.“3Ùö{K4òzÙ^úxŽ6ô"=³øTj‘üÉW+žL¢†&Dw®êséø ԓVªLŸ@Ç,º,?îjú}% ÍÙc¢ qâNäñ:e¨'[˗¨¯ë—m¡ððÌæØèdьÃÓw6²ÙÛ6ôu²ÇªÐÞ2«!Éà7Q)x]—ŒB²ÅYýËJöãðÁˆCK9pBO=ìYÖË4òƒíÐÂÏXð»äq–*!ô\¹\Ã+œŸýÛàÃh˲ÚSDISi¨2ð‚– MécÝƹ øžÄÛ;èwœpö=*ùMž†Ú/<Þf,¼a¢“¸J³›6¦¤CÃ=ž“(…Ž&½’˜÷ým òV°"A[ⱚ‡\÷Vö.2e욊ÒM¨­ÒN ¨TžéöÂÃ’î ¤I^ÂÂSŽrY!ü^")AÖ¯E‹Ô’¯D …G]Æ ˜g ÔìÄ@©ClGoÜj<€\¦)Ê‘t<wp… K)d%è "Ùž@ÒãRQ;”:ŒûÒ›êßn}•ŒŒÛ† R‡aL͘EHœë½A! fbÑ¢»lÖDoä"GÊ̔×*bäQŠäH¹ß5®ËY.`wk¼fµ¸ù~¯å-™B+x¬F³—BŠ&]ºC ]€[£ÅBMYùéÎODË´¼¶ øÙqqÿ‘6°m¹@?õ£Ÿ»ÿ3“¶v+yGMÐ"ƒH{ ùõí ™zkí#Æíå{øÎ͚ g:&Úp$ DÝ;¢ô[%-ÊÎl8¯IN"ÅóŒj…8q•ËŠ0":ÌUø PW©*Í{~‡Ä2ÖÎHx’”¡pLM(|èo'ikØ뽵ýxÍZûîe‘˜cžê®;ò6Ãuû›ËšA’Ô¯Dj-ÀCЉQ’×¾UK‡ÄO_{†¤ Cï¯H$™.k±ˆ`Ö!Xŵ˃¾øўkwóJOä¦b]ó'§z ¼|p&ÿn¶ùÎÔFDó> ;ð›¶}¸mÀÔ §ùSJþ—}5DZášMd´AaÒþˆ%¬Y›Í øŒf…èÓî-¨Üg7 bþDE9Б¿jmIAéôS»ä×o9¾Å2ÔǑŸã¾ã›áÊðT&!¤+v]F3żpTV$é’ð#®¹ºªÑoÙÛåë-à t2(DžؓA-Õ6y»äpokÉ¥ )Eõ'ì‚xh2¼ÿ?A1;óRØÿ,û… ‚éŒLæÁxÀÖÁŽ|0A²?  ¤ž‘èáæ±p îllÚãøC’ò'.ïÐÝ4>VEÄÿÚ®˜mßâÇÎ.šÆ@Oqµ”¡»^äÅÿ°ržF(¿ß«‘rC‚ K¾1ƒ.‚²/Ýÿäĕ ÿö9W²Hß°ssŒ]åÜS›¿è ¢¾ämWÂÿ±«Œ¦^ÿ#ÚNíÄt¹MÍDº»=(—çXáó…Ì€ë“lqW¥_ÕîþhôÁYj !^zq$á‹«@ P +±è&úQ²/fC8cˆ 8›Ùd‡ï-k¼]ЃœŠ{† + õûG ¥ˆÇú±G8Ã$êk~<‚ªòþ7ÿÌ׍ɺªÆk÷Í>$í9~‚E¿éºwï6*F?úù6Cg*w:KÿVÔÖìîNÄD=ÀtLñyj§Ë¾R©UZ¢½XÈ–ÄÐ*Þsz©´˜AÓÆ) +§¦$gÐA«Ù8‘pû©>þB;CÑ8Dþ, +ï«Ò]$ÃÔðé@jBÛñS[ȅ·I¤)ú~@m¾¹ð0e$o¨Y |&Cc|՛{-è7"ãÏ*¢HÖÌS"üJCõ 7òfÈ`ç"!´‰*/æŽEp)–2;¿ž.hü !/KᐱðÔ%HƬdTZúôd‹ì²¬ämù{˜W³jÞPûÔ¥õážÒ¾ækïñ´Ñò-Do4ÿ¦râg•0Bò—¯[Ü Œtr•³³àÎÃv7³Ý™hbQH(‘ç¡!Ðt}{ú–Oóê*ÄA”íÜg½ÎÅΓ*ÃßGˆ‘>ÐtýŌÊéóª¸n=†»Äƒqc6U>*)'C3:;kÏG™¶Ãñ;´½7¾ÓÿX6¯ªD¨ÈX÷¯¦ósÿÕÛU%¨xƒý^Ë?ˆÅ4i›2YS¨»®Jr*š4 –Â;†bƒÔËSWA›8q–¿ö«sà… +l ?K,S¯™)Pöˆ'¯ ‚ ÑÊ¢êœ(=>î©RÕ9ó…Ü0"p:R%X¯ËB ,äìQ­†KCízî‰âUùõl× +GirÜVLÍøP=Ä£Êø­˜Õw>ÉNÂÉ¿w˜†à¦èÓÜxq7C{nõ¾Ï$ïŽañʯ:ðY˜#Ò¬€qñpý#°á¸Hšåêx¸»JÄö¢íø ߨ’RR6co!óå?f[ËÒy¨\0Ì/zTÝRÑZê“Ñq»ûB—u­Í5‘HªZÌ:¬K«EžuÚéóŒ65Õºëê“ý ”‚’>°Ê<§ží8D7Nöj5%fæ'EÉxB.+L2lNUÌëêmö,&ô,X©ê¹Ù¾¦Þ$C*6©XP«YGŽ!±Ð²6jU‘6—Y'Õî/Ä[ØëRè,vAèDڝL(AÈ`Kq2À3ÐïÕQ²_EªDN»Ù‡Etø,'? •v?jDˆÄD;` •fÉ'~/¸ëíƒëO;‘-ƒjqÃ{èì˜T½ž 90—ª͈Kn YR,kp£enpᢽôõU2²£ìj<Òìa5ûGq?[¾Ž„çÊ/ÒFP2'?1Ó&Âymê¾Aþøk (â­K+ÖÔõ øXè˜L6Ž9A–„Ä–†7hœ×·åˆÙë£ ˆO¬<õ½ +ög Xèà‡`hk³šòMÑ·PYê ­¹tøœ¤„ôxu³Ü A 5Ÿ2ûÄ%{pÃ`rµž j%i£ÃKÀëŒf€̲:k¬Ð`W×p‘‡sN‚Œˆ2ß5“#XŽ"Læ²u¬·nˉգùïÌYƒ¹„8«º𘴯PɌ­°DåLèÕeüë8‘¼¤°Þg¸§Š h·žl“ÈöHßàØœf˜ÁY` ôY–¢¤ÉØ£ÐáJY¹ÐngìCK.\‘dhïEäߧt™”ÀÄÌιÁU€W ࣫Ž+ðRêKûˆ‘a{'\Ɲl&õyI·I þIš'z¨€Žn šÒ<5‡ò"CÉ Ù™øʏè* + +éL~ºÀ΅5Dáš& €Í¬þ4²áLƼö¹Ïg!´œuûÙk¼Ïf5ÈQÍ æg¯‰­DíoTÞс݃ +BýÝÉQ$*U„û­ï]ðZp‡;´öEÍÉJ øçr„ɦ\°ڹ(èôÔ<Åãe£–N“[¼6n [<묑5Áé:ÝÄz˜”èàájQ˜cÃ\Ǚò°|Ê `Ú5XúAuܐ[‰¤áà!kg»ç˜Ž_­9ǛÍY-¾Ù—"ÚŸš!3•vkQß ŸÏ”¥%XTXÂD“ýfãq<“•à ®åmC v³e«$¹X×p6ÛE +rw +‡Då.Šò]ßÇéêË"“Ró‘ÞSÑ]A fÜix»mL£µ©tÆ;\6L÷:˜…]/¯$3#dVâÓ¨z¤[·K©~g_~‚\ Ùü[•%NÂ<ù-~‚…~í2‡®¿AرÈÍÅn|Ù8S©zÆÛᲪ=¡À1Û·B”?—ô3”þ~νÞ'¾ßÙ÷ô¸TíÉ{ wc:FTœ\1UÏÅpڔƒ Þ5‹ÐÒ#¡ß$-»\*"ѱØP¡ŠAu×&•tHÿWç^3ÈÔ$Ë û¦.ý…%bßÀ·ßҜÉ$55 ï§ß ñĪ¢»÷•Æ6~·zJ7Òc±H%à6ʖŠ"DDÒ¶õ»Îƞ®S憟Ðxξ,Pq8ãMAFü´¼ +¤éoÚ?W™Ç*À§•_ +€n÷OðfK‹Þ]M©?l÷*ÄG €ò¼ÄŽCÓ¤M)Êâ]ÛêÆ'ùâ¡0 @ß>)Ɣ ü%r;®ÀŠ]øiü­xG**‰ni¶ÑT»¬ôƒ¡›SKb Hrÿ·@“¢ÿ3iÏ{–l:yDʼŒ Aó ¼ã/:±´F:>y0CxëLÑ zaÁÕvNǒ‚¨R†š{՞3ûæñwÍ<îÎqøh z‹…²$²šûÕ<„L#ó.²Š@+@ ƒ<Å®§Z¼Î¨¹ +rë̀`:¡—Û$±A¨@œ&tá`3(•Ïqm¹+ÒÅ +=Ypnµ´4{ßµ¡2ÁÅхM g°ÆzÜRl ‡ àÀõbâm:øo¢Ç‰?ó2ô®«7HýzÆGF-ÿ["×´1Z/iBh¿o&ØãõwȽIûpQaqj\(È× ·*ŸÖ×ܗœ®l’ò€¢@Û[[E6åó¶æ4ÞjòI.^˜4Yú´(}«P¿Ã¢ïÒ•ýª´¯ùÿgÙ¾)Ö<~á“ÈÕµ¦ök8/3õåyj_'g%o7³Ó0Uç{RºFÏÍ"ë tS㓢†¸:"²°aé\ókËáwŽ%áWbùŠ±ˆæ|ÈI°Ü4on~NXâ*ˆ«BjfQ¼ªŒ¶!¹Ž ®÷«Óý¿fçD£Ž¦2Ü|bŒ;/ï½÷Y_¹wšˆåžÑq$*žbƒ؀¾]26>Ž;G{¶;§&l„b0 I^[P̱HÀå Îu+ÉãݤÀ­øD¿e‹ÎʲƒW|" ðO’Þ ;tZ·a´Ç#é£wÎû±h›ÙK+ÃAa5ìE[6…ßñaÙùœælèx>•ªªé°ÀŸyЎ|È-È×uÆIÇ e~#_,ÝgT*Ê@kÒ¹dâé7gôÜâ&4¨'Ð]éK8i&!¨G0o‚pCd€0¶ã6ç­¼GóA>‹¤Q÷ ¦*€ÚÖöh— ¼ÎÃA¹Â³\ø-ù'šù1c Vö'Õ1zÕ¦µƒâð~IZãÞÜüE9'$¹¡þL·‹àï®y¹J|vI…lVÞoéÁ«g)C«ñy°„d¨ë§Ð[Y¥‚¶Á‡[ìžb<]Méãz “%-öç ¹™.s‰ƒkkÌ9~ƒ~`+«v'!pƒ¼Á{K£¥+ï£÷$Í´ÙV'håÑÚá@æÕ CÕëª'a Œ&4zµQ*“ƒzòëÖ§›`Îdf®*“”Æ‚ËZa0Ž1IPȘ$9S[ü [ØՓŸ‡A➠ùG&™ §‹ú˜^¥ºJq-“+ëóÐ$4µÇ¡¼„hll†âØD²–y?á¦Sð›¤%´.7d¼ÔHãEèÕ +ˆ˜ífà˜H¦Ò§$%Rœ1À}Ô·~՜@5Þ.õ÷-­cIb•$®Á‡ÃðÒÃ!ŠƒÛ&@¢¢L {—f“ ®Çb}¸s“¤ ]ݶóEÃ`$ !öyË*ø¥' «J‡•|ľ@”’äS¸•Ú–êÈl˜(G`)÷O;†ªgØdŠíGMLÜØ PhíMîä&ȘG;ã²'ÆM:ËŸÿw1†7»+^4×Т(ß C¶F‘›€—ûó/RôUX°ç{¾)C)ãpj$ºÎTLtPC®43j5°Ñì^ù(&·DŒ9H<¤Úk¨:ÛÛ'ì(*ÉíNVO +3´è;—­Ë[Áo7i8e?taDf£$“`†Ãí÷NP *‘“¸py-m„·¿<—ÀþRÑkwê:ˆö¦bÀ‘7òTqÉÎòøÙÁ +3KãÇB??1מÊXìæ{EÌÒë (€¡RWŸQÝEób¬e§ý(aɓZïfñNvBøU*Éú$rWáV,ښРß_‰´Ò¿šßÖöhhh׫<&5qì9,(ͦé$3Oc­²Ö‰aŠ—AÕftxÿ†¸lùҔ:ÔZZ’Lœ]§øÎ<0LÃLÙÿKÙºMÜ+ ¢žEºÑ4\oÑK€{Øïb÷ò@¼Ê +£-ïƬÈK©÷ +–G/3Jm°óޘ1#òö?r¾—€6„| +žÈœh£Š4bN2‰ÀÚ7õ•ŠW7 +üíî_ÿËÐ0-|™,‘2e!Q;N¤ûöã^–9Ä)ocZèòN&÷–¢6D4uæ,`ÖùªHÂ2Ò£¬Q4qÖײkWm8‹Ä|TдvÏÿ×Z}"¨ó%hÌ’ZÛ?ª(÷áG£²ÐŽnYqŠÂÆsŒËzJï´k»j´Ð4n9 +­·kBX·"٫НÒW4®jóLAÖª îîH¾¡ç eIÜ1)ò#çI +jLõ[G¥C¤N <»Š›ðVˆ§ô´U €È9V^B]K>º¶ž=î"ɶZâ»VùµDK—¡¸©|XF Ð  p7ER]ö¥¸¥hŽ”cKÕk+F‹â6–YJYz‰áx›„èÚþÁiÖcC‡äQ¦+2º<ªïq‡ˆš ?+|ÆM¯½·Mœ@SèG l [̑‘[Xf'I澃$8ó4 +ø)óP¨Å +ÅÂ$ÞpQüb­Û W3ݾvOEÏ°‡Š…‰°ïB¨’8ŠÖ +udAˆÁÖQtÜÄBû÷V¼‚³³mãeóoGãç¨o¬®ªó +CJ‰Ç#£y)akqˆ)!$¶&™n¶„˜ªÁ‰ŽŽSB)üù&#^è()û·CßP¬~ (üæ*SƧóË;ä#m]Çf‡æVU|ɏEO‡ +9Cö Ùa‰I°B}¹[láÁiÌ2Ü×ÊT9äÌeÆLhN†Ä}“5‘nc¾Ðir!¦$FËç»Þ†Ã5J\EŽ½È¬Õê­¹ÃðÉî; ašé<*"7Ï+ˆYºls™Ýlª¤þU^¯A &T.pт+Í#zZëŠM¦6GK#|¦.—ì¤ÿœS\ = ù:–¥dUßKÉ1 +5œÂBí1TÜ{ P")̅Òh6@^wVCD¥¯À?27$p ‡ö!ýLÿ;q>ÑQ +—n´Pžñ®N÷0ÙÅR‡¬gQo7×Øsd œÚ + ,f§¶v¿o²{tääm:R­Q\ÕPÇSØëðuî°S Ëzdx T Ȩu¬BpÉ ü±·àÁ x)¿,MÖ´9¨p˜Â„iéA\¹ø‘ZkB³ÁÍdC¡?à~7‘•ºvuZâØZŽ €N≠ª¹Îuۈ¥€Å>•Ä^…-røßð,—Ì‹¯ñV¦[ÏG\ ¡*w×0 ðõ>T™v­bHTBþÐܶEòµ B,WuDþÎ@“5‰ôï)LïO6‘5O꿕@UÝZV‹]ÇJœuŠ(÷C"ӈ.¼1òÂ;»D6P€MØ}ðdÊƀƒóÔr'‹ˆŸfI¤$w®fþ¤RY"¦Ï3ùêø +²uqØñÛ¹çå3/½ç…oQ43VºÑ¾ñ'КFìm ŒwEî·ÐSb‘§×MNá˜þÓÛÂÝp5эøŸŠ{÷•(ÖB!±zšðâÐuy?ÖíòdÃÙôÙíÀ܋ÐMÞzéÈô?IáF ³ƒµ¦Š¨³tà©)¨Õ&èsÏ`‡xFWc»~ý†SH/h¢À]ìp6XÜ´ƒœ°îxÏ#/º›`3/ċ¡Ý¸¦Jw©V’j›(LKƒH!fuÂÐ"é 2ÉæB…0R †ßHŠ0ÓöèVOd°hyQ‚šøÖ:&Hnl8í­µµkkAHŒ©uŽfÆÒC$&mµw]Å«±Eñ­´Íè4¶½µê%Ô¦«3iE™7ɄUŽµŽ½d³³Ðç%՝¸ p^]lËãU&~¸®œŸÐ«KõÑQ~ØV‚¾~j›«@ðNq"‰#Z5u؊œ• qY¶HG!\Ä ~dÒdøÎR@qãÉ?Jv•.DlŽ‹·2Á¯D\[5Ëí=TÛЀÔc,Ÿf%?ãƒe%X[íGàé%³hi!o¼uØR‰…ïÅ¢AF€óœµÃšRú¿\ÕÎèÙ|ÈíøËPVzÚ;aí½8Ã,¹'m16îx‹X©=ak¹¤\ÙO!Ýäu ªRÓE4>Š T¢wñðÄ(R‘ÂD!`)aKÍ>¡¼~1ÂöÝîÜã@Ømñ.áyf…¢'lÅ ªº0¨#lƒ#Ïú›´=cÖ"Zؖo4qOÁ©åŸÍÊhÖê¬ß|¡Îæ¦s“BîS?n.4Ô#‘‘í'.²7èóX×Hk¯mD|1¿f°ëˆrÎ'×x{œ|¤˜ Èk^ãmuÈ°ŸÒzŸË ˜js¶X´Œç¸ç1ï€pUǦۺ’¹D[ˆX.~'˜‹Ò&´vÆ!& +08š ž(Ò¬ò7ŒO›Û¦ÔeI Ü-¬ò3…Vss£„2 µv +@P!ÖîÀu ðNv‡¨˜§¤ \`¨º©ïÀåÔüÅl—Nüw'Xi§eròÉhÅÛÃsë×Ї(D×Ò÷?ÁÚ#8íp囹ڵ#X%ŠaùàöǞIô*…U¼ßƒ‘Á¥Hy±y¨ ù¬0x•e¨CñÈ×sÒló°Fš‚6–å–õ‡f°æÎ}„_ÀúÌ„ºÊ³òB7 önœÏx)ãDž}L_YPüURƒèápD2#Y j*(&‘®¢øu’\JÏøò$hhH®©¦ÃI° /¿óõòÓnø¬¡ë<ë2hÓ²Î)V09З ÀÊf¢® O“™òåu‚½ŒÅÀÎTåCX²Ž+Ë{ë,}¼ÉUH +”QŒðÐX3uâ‘Ú\DZÁ'),͋Ú[Gáæ>:6ðívGh•´)eÞX:<ÅØÿ…i'ú®p™½f úm|Kf±C<.5¦MMBGO;àK¨¡P権ŒÞ•)ƒ°H Ó½rö–v<…w/ +T)­Ÿ9–m퐭Ša+Ə¹*3·y¯Ù)[Q „ˆ(T‚&4C9‡é›8[>ÌÕ1íÃwJ J~Z¼½å¤¬p‘¾õ…ÌIÃߙ€§ Ñcì4!YµPf¯&haÆ#M¨Û$GŠhÂcèîYÑҝ¨&@‘"k $ʦ³¸QL×HB"ZÑ Øjòªâ©þ0÷vMÀ…–ç3! *h®jm $t>¦`¸Dã{W8\0rТ­R-ҍ9¶u>Zï/H$ † — –”[)?K0{q+…xã¥mëWFWÂíٓÚ-ñ€_iñ)94ïجŠUæk‘ {žMÜèQƒ”Rtò#Øâ‘@Սk™ ½pĞ8’ _Ùý¥KyŸÒ°€d‡_ 䤂6w#úü•+z¸>…„]E°L®·ìÔ³CÅՖLÚ¦žê…§˜ÚۄwpÏÛõ$AB[30r€ÓÂÍjÌ÷ðñ•²[”–¤ܡמ½èÛ±'Ã@=".Ñ!™U6Š6…Ôy…ˆö˜Úu`ÚÚP´GIü–Þб·ä@ š†7#þzÈΈuJO“7åµcWxkT¬Á"ZÑ!9NÖ +JŸº|8kµZhÒz#l½jŸæ« 3pK°TY. +œ¹ÎwJ­Z +ü]RìþR'Œîæ_“Bqx˜ú ZÚôòfž¢ ‘6-íú£[ü]ÿÆ!:ߨnv”·"s‰Sÿv5䦥Ü"®Ö"_Möp±ÏØh9³¤‹?yŠÒiûàê"a4¬Þ6#g8e6TÖ!žqÂå V€0!Šÿ‡ð-7jÓé¸ÐëYª/Ž~Z"€¡ãZ—–Ã#”X½¤ˆÝ• [«ˆ`Ҙÿž!¯‘b› +ƲRkxº¤¯b[i/B'Ý5~Ômz°Ù«^iQ³#„è'µ:Ò9$]©òHOPñâ 9‡otÚa‹}ó·|DrIó¦Qu<{öÚ.B›¼‚ºðß!¥­¢¼[)?…·c&:Y¯@Ù 6û +^TFIäîrqW=i ǦP»dð0šÎ¸+ۗݸyÖUݔ“†‡M!Ú ̄?äpȐ.£Ï¶$v™ &À w0^^Kë±5n$¼gf³EÞTÍȌgÍÍ`Á»zšä±ÔŽa·FA´&Lëoø؞ŒøÉnz‚s ÀhiÌ* ;{Mbʃ©aÂϞà„î˯]¾r2ø¶ùÀ`;Në.ÅKe¥W€öÚãË¡%í òEBëٝoÏI“Ý÷1JAઓÌ[C\ˆž‡»I‹=¦5F¨ÒÀ–C)ñqæ×M©äÏKTO© ]Õ)Ûšj'ÎÍ8Ej¨r*çú=)phÌn´"€Õ|OÁPÈSÚ¥¾˜…«€\£ªÚßá†=ë|¢rl'äi¦ãxAWô֑][\òëDÿ;@Э`¤yÈáëæELY˱ å2,pÇfd¢iÕÚ^–­<ûá^ÀÎ%)¢]g‡”W I]¬öÊ ½>vŽ7e˜»'5Ò¥@ð€e„’aÞ:UùçÓq½1š€Ê€{¹Y2cQs‰³ñeü_“ÝBÄ85v%•Ç‘G^‚èÆ“o— &ï"œúçŽÀó3—¯Í¥E±˜ð¨Š6Zú‚£ ’âýº—•Ç-T¨ 3P‰ÖCúïøNŸ&ýbãe&[nõ¦"µ‹#GðÊKþ¿+ß¾0ìÓðÂù*Ž*ÍPãMÅ» ڀÅoàýSԚ£‡Ü¥ñˆcÀîޅ9(¹"wN\ãNÿ…•¡Ž’-†QœF@=ÁfÂʁ 0š¸º‚Z(ÕÝs¬Î@4<)ºà…ÙÑÛm0~P”£¼˜4ɹ˜—r¼4MÆèwÖAh&œÁ›è[8Ÿ}‰(¢8 9;(†¯¸&Öæ bâ %ó©0Ð"u-§9*¬ J˜‚"½˜ñïºnú:¼µ µ>êO¡@!êqhòvׄˆ!lC 0T‘P‘´ˆÆÉU~÷ÔÍêÚå×h½QLî[u<š‘ãïÏÔ`ðG˔ÙbûèPmì16ÇêZ §OT'o6?Ö3¡f +ÿPj5AdJHí˅l+¿ RÜiH(‹=x-a¢s…6eº)«&BÌ®\Tõ €D°óðÕvvÜ8i™å°|Tf±òÜþ/hMX 4%¬2Ï|ö#U€‘™BB1 +]7è~VUZÐìh_4Îlɾ«#g”ÖQ¹J®é!á˜,HΝk–.CƒÔC‚ÈÇWsJùøårãÆLmÀ ªÇG‡Q/„áؐQá(­˜óÏߨ`‚†FÉY‹h8"O%Y›ê©È[¨€²õs†5Ž¸>ˆ[—“„{ ¯«æþ?Pd·‘Ä|„amÞڝÄþ.m%Á{¤ˆ²ã#c䆱i$W¢ÛæËXŠŒòìÑg+ žÂüúÐG· ~|¡b Ý(ˆÖŒƒCŸÏH;›ßO<5šš[R$J—éüû°Ãۛx÷êÚ¯IôÀÃ>š£¹§¾"°Æoæ÷S¾è-ÖWñÅ÷U(«Ä˜Ñ›wQ÷Åg±ƒÔPlñgh‹Sþ1æ["¦W¨äèhv‚è4{ëÑhÌ\Æ-lã 6ñ9ž&1¤` ’¼.lÌÜß³Ô‚Õ£oE|U E@èv±àèmqÌîáhTxÅn]ÖNäÿ’™šá£.Ìç#ÊU;1Í ðÒBGØÑHDša‰¨Á -mî1›(1Åk禂ȃK—#Y׀¦Ô²‘æ•8…5Ñ@ÖböµBã(…=üvè3Y÷xz':„×-öçÅd¬I£…ܼlñԋd'U©U)+Å£p +~ –£iŠ=lËß"ÍÓZéÝ$Æ%(èC[ñ\ÚêÅk¡Ë'żÊA]Ùõ‡O_Æš·×è]܍‹‚âpNoì¢ÒE*ZʅO4—êN’ºԙTH^eB­®Á +ï¯`YDw +Ô0Ì«í¥Ç Œ8¼&Ëï •£t¬"y &„MýÒ©WûQœJ–…yûTÔF¼é±áo¬p)壸 —A‚ñùWDÝ[T2CÒôçS=àÆ-£'RÃaPã:Ô^ã ¡¤«¢39òJ¯ü’*'¿ï·?{–µëE̪‹Ü±Ö\oW z +Äø+©Ú[›5­¤”«nœtó£•Ù²¹2y࣍ä,¼ ^”@üf)BÚèÔ\«ÒP§'r!ãã=‡%Us-¼£~|êÇ\(x4ü1TŽÊ‚­ˆÄº¢àäALÇH^߃ìY8aQtP彦w"Õ¨:åà »ÍzZ¢§¡kúý§”+­5ô¬‰ ¢ú1@n—Ž93p +AS0)(gòipãÓ5VJ}âÐ7«îèÊY#ÃÕ-.û¦ŽÚATì!IšP4/¾l£y•‰Ë¥íÛñ»Å&FŽ#D梖 + ƗÊi¥ͪ*x#©t²ÒeÏüÒïK¹ùäՀ 1 s¦°Œ +Ÿa\„sfàRh€`ŒæšöÁ• TÂwN×ï•âF‹õ©—3) +|FQMè²Ãó p«› g«±EÖ䕦S»|hÈú<Þ@°Áe ¡ Ð0úŠÑ½·-Jç•IX(¨©„¯*±=ö {a\ÓІÃoðØieô¶¶w&ØÐð:mB)¤;ÒDy¥ÿ¹‘Ø´é™w—aÄ0GÁ­¬0Êîãý`•F¯e×Ì@·½ïñJϜ8o™¹›õILĈӧwEî:t7o|Å£+Ÿ=q¥®9ûW‰2®㵋L¦™Õõ€OR¥¸þ¸©IÀH˜j°ÖÁU€Xâ6¢÷Û? zà“ÎxÍ5‹)Ï"Ñ2Ex6„”ŒfL — ÿ×E»ÃdBFY!Vlc¸ :ø¡™G‚¦PEÑwräüõ/±‚âè¦J€¤fõ,¶æý®X®Þì÷ÄŠrZàM$%MLÖÕ·€©¶ ϧHѼPd’ż–ƒ(ÖbŽñàbTH wŽÌ:?—†v#úiƒÛ¢¿¦7óKßÎr‘=IU@n›$0__Þf }œ²r,ímeo—’‹©¦gL 0MoˆíLÇÎÓúÕZR¤O“ƒ­AP¦¹‚؇=©ÌÂÍï}_erG¾"y."T`O°¸xe:Ú؃^• Ú¤º½Ÿw{ ¤¥Õ¯*V·1yë)‰f¨R•é³®<𛱔£§Y¹*ñ˜Rs ï_Lôäº7|FlóŽÌ¤8F@Ág‚ßÕñî{[ üãVBÆcl˜Jñ¾H‘W—Adü?ç‚ÌiåБÚj/qMF“S€—õs Mô~¨Ü`æÛڔ´©ݪöFöä ›sôÐ»ê±ŽF‰Ñ Å' ¸¦Ç(­ý0³ÆkÛoyËÑÙ&nÈWÐÊB¡fÍä;këdíáØOKQuRáòôË*•“²Wõi„võÔgÎm“CÍP7Ÿ¡ø\é"lgfwÙ~À³÷¢˜ws؇ðæ Ö%“ϧ§›I6mŠ`- +mP…1bø ibk8¤x¼æ¸òƒR3œË˜×Gb¾0Ÿü(ŽÖ”’͆ª;ñš€Ú(à‡ôf0\ñ>ÉØfe«ää/ª +Áѱ¡>[oV+Eýnçëeù atîÄIÎ MxF›”wä%Wžž›^by²!%I.mÓ¾™Ü:(Ôµ?”ÐMøp½´Ó+±'´"#F]Iú!¤‹SK…8¨3õU j€Â‚Ÿ˜_¢¼¡k+¹pʦµ"-»öVvØÎ2—¢¹À!÷›5J—\ö +§ÿ£3Và²á#a­“É°N¤ã:ÑÅv%_½¾åÚؙãQ$:Á.„‘)ÊäCÂiéÄD ½g +Àߎ±f£IL~ž]/#š?°æ,¨ÜÛQ$@ˆùÚÇæ(Qi …ý–`K†9£QŠPóIgh­¬¼·5Œ>od·HÀX@UU>}jðU®°¡ió![Ã ‚_ØGï¥>ÛGMø±ƒV"•öP´XϴՌ Ò[$(Zbl:w~–zXíšä{7ö‹2=µÈ¶<È¿FÔ kʬªJIuþß¾•ÇlÇ †5„!f>>¶“×ZƒÜÏqG§H›,¼Ç“‚=£JîµhñÒ=´À7$[ï|¸I܄}B4™§'½©Áœl3Öe â)äz¾¯š×ë^ñüU'«Aíê09Y”Ü«¹Å¼«°¹aÛÉ1%ø˜øۈðé¦!”lfV˼Ëú þÊ|üKuéyá-§·X4 ó;ÍãúÚ÷Aš”ÈC`Y£À#@ÎõYä¢3ÌS=À…³6 “£èjÛêҍ\ña4ȱU…²Ø+ÀéôK= wÕß_æ.²÷´! ,EÔO!Þ8Z‡XðÙ³ëp»0°Ûê¯ókTH¹ò'!êŒ6êø¼µ j™fBŽ Mͨ‚îH6Š†_æåJt;'C§ª[q¾§ ï^±Hå“Û ‰Ô*Gù%Hѧ„¿²O‡~ãÚó@—‘(6"Xˆ1ñé ÛÆI<äՁ˳™Ð0Ðãö‰(úÿ„©aib‚µ#QҎÈøU‘ Í‘>¦•šÑðޗ_>×;œgL[xlF®óŒ&º”3—¤ ‘jHÇs¡Ëj‘Ü}èꀧh Jö'<,é†#‚B·,í¸¬—ݘÚ;e¹y,e0c.'¡’’ºÑCŠè^2–p` 4Ð|ĕk1¸ÑJ0ÝÿÊŽLŒ¥Lé4º¼μs#ºÉtÁ‚© ^_~Ԓ³GÚ/J&c þœví¬«Gèôš‰uÏõZª94ÀÑFõÛõ¬ÃÑ0ÏáÝ¢ˆR21m“Ó€ÕQ†ÀÆÂè: BŸXê§Eþ 4.ö²µŒ†ì0ˆDga2àV‘æP¶bB·A<2z¸Æ¥!7Náå;tòx¨„è'^‹ŒÛtpqæ&FL:„Å¡=°*t%J5Æ{}\+²}MSÀenÅY‘ý×ÑÂ¥¢†}4³Û^¾pê~æ¬m„' +CÏF +P8õèU%ëOÓ×dÌq—wŸFKÃø«fÊ:|”Dªôʨãpɍ߭[˧±Ý3ŽF 3ääTS¢åac½|Æ7ïÿîF0¾ bx%‘kŒ§ËãhXp^âµ¾ÆÓ™•¯IF_W–Š79 ã¬`CrJRy‰KÈUNµ\Q<„Ä;ìaÃa¿ä9 Í™Ö1Ï}vÊQ÷_q蓜…¼±%@áÉfÊ¢´""å* Ð¶Ãi™µhz#š”-úÎî ‚!ŠezÁZª ²H¥1èÁW2‚¼â$¹un`”fDÂ$†7ÁÚÄQ¥z‘¤Œ8ÚÍ:¥ˆ’4+/"·xž‡ØW¸Ú<»¬Tb’óÚ'EãÀ¡€P9/)ã¬g@ø[>S¢adªNF£(-##u ֔<8†‹a1ïYø85œB®’*¾Apdx¸#¹ +,æ|&gvÉ&:ÏS¯Ÿ%07œž¿õ¸í{êd„úçÈņl͗rE(âè5F˯• ÃԃŒbR©ÿ1G«?o*؆×/úûr£Zb…KéR𹒨­ ÚĦÝGB¼*nh Ÿm”99áT•âIm $©E…“ë"Î +úšî‹2g£š@ºÙM66Á‡â’“‘Là–| š1:•²yΡB‡¯„è‰]míŠ[ۉqñÈ#\ˌbÔ®~Åýk K©œéÄÊujQ·&j@õy±ý¤œSxèXª?úá!ký{G¼ì-/՟`xwtk~?ÀޏÆd¾½-¸üWs¼ÍVwz ÔæŒäL!ŠI²OٞÔ?&¦?ôv}ƒÒ*Ž¢ïpȌ–F@c[}äÏîj(¨ Iƒþ#= K5P[ç‘ùÞlY£«ç/×æy +N(㤌£º‡rĶ8#¡GÈIÚ)##Í;¿Ÿ#m·‰ÃÈ\7 œBdò‹I’“Ej§43Ý¡´[òõ.òˆ“ð ŒII³¯ó՛oTŽÁŒäÎ`‘‘SÌ%Œ´,^/’…P=¶¾™$MµmÒ¾‹]œœéJ‚í7¬Cí†1òXÑðœ€_l»EbWr kã§ný i ¨J™’{Å—E”o*꘠ÍéØã"hø”h7K< +îÕEöbÅþ!ÎÅ)ž +¨½üo/ñ/z¾f1Öžƒ²s—ȵ}h®åöÙ%Ëië<Iýµ·Ø¯¸ Ò‰HŒ…áX ^Dÿ"MXôS³LO$l·ôèx5¦ךj¤„îÓ©# ø˜‹Xr¾®Ç•ñi—-~Yó’‚Aͪ­AßÝòyøJè’ÿÌ£€NRÄéߓ¨rü S¬™»?†©›y`ã¾K²ÖÙcÿ)6ƒÍ¬ÁÁ²˜î‘ÚèBíÌpcϯÜ’a@C$üŬ¥´œzù¸ˆ{`M{D\·Áè“Þ¼¶‡ùuBs’‘ö¨¬ ]šöØJ¯šb&ñèx0²^<‡ÚX‰A‚ó.g§d@3åÃ2‚¶üQâxe覟 E ¬ +ËÎ&<²—_£¡ibàˆ2n×°aÜ{<•¢8¦»Z}d:‚¢²ÑiªKÕBñ Ȋ¾ RÝ …Í—ŽNW¹W‚0ÁDSpTÜßñN°°æ¦¶²ÈJµ3`ÿaëÒ!¹Ej*7í/ '=íAØKèЄ™cԌ͆µ{%Ç÷bÀ Ï®P–&¶á2Óâ_†ªÏLy¢5Dx@#ëA¬™X8ïÑ}yÖ^š.?ªñÂSXË'.Xú™f”} {ð[‚Ë LˆÝF‰Ä{eg——Ø;éT¥öGV’Œ+»*’Ž%’Ž¼Æ=˪›”Ò-őõu´ c¹$2?³Ê¤àL  Hßӛ/mŠUíƒþ»ý“íÐÖ<+²£©(½ùi³ìP· ¯]VMF)Ø)þ)Ág[ ¼‘6še)ÚGÄÇ/ÿIÛ; 6#‹»´üª‘J[%áV.J'fŸšå-VHÝŽjÌ|A%ZHÖZES½ÑN 0Õü I0„ÍÈÕºqIÎ÷:Ù'qѓțð7_XfG]tΎ …˜cÅ<”‚?KC"žÏ\ô3M•î7KuQ§tT½¹(ŒOFJ꬏çBKñ¡ödŠÅuªº[Ó@šŒýŠ×;?¸«Õ'ó âÌVÏÊç@¸SÖß$Ìåã0„Kâ¬ãXÎL³,syE—‚  $2 +C’E•éy³ˆ×HáÀs¶ ®ÍËb¡kBƒJèJ©ˆ•D7x& w2ÒÀæJ!©MÊÌÜ¡³Í`Ô¦Ù­!ÐޟXwSVÚ{üyO ÚôQõ±·h×í[ñ©‹ëdý— l¾"ãódϟèât:eK­žîf«N”GYµ¶¿Rü–¨¨ý +}D }‘fÆÕÙ>´Xàÿߝ”2€$èÅø.&z½ÛÕ_“«ÊÞ #·Šîéw~íM-ŒªkL[un5\—ììz‘ #M¦E04MÚ`r:g»{ú—m:¥'P›Â„eࣷ™ð!àîÒ&šVž’Íní@)š³Š­è›-žÃSV“†ô!J°Ò=‹ÿâL]¢Òe&% 3¦OSWeˆÛNÞ<z7yèÎ(d3%1ìÀÆnÑ3›։Tp°Þa{ñ´!| +”ʾaËr HEŽ"¡È6gøÈM>ÝæU™rLË«Bâ×iS¶@ܵ’i:*$[͖ޞG"1O„™Šc¾x´q/¸kc:q|JÜñÔè~C'…±ØA×5i8M’X"ۉÀzÒKá:´È$Îu²JÀO+Y37DoN& NMX,‰Ù„c§eyµkp¿ú #JÕ6#‡“÷lô_ƒ=5]ë̐¬”ˆZ(ï¦ å1žúNõ]6²Ä¸' :ŸºífLhbD×ã<%¡‡yP”›§E¢öÎV¬"ùÇvîé—À“¤û‚°m¿©ä. Íÿ*EòۉKµ‡Ð-Ö&÷ ,à“%KÿTsy3¥à(Á?i¸_"ª•–­:!Õýfp¦Äš§¬¢÷ +cë’ÎäO‰ó7•kÚ #m— >ƒ 0>ý!Ãàš¹p Ãï„× HÔóÒQéN‰Ÿ •º=ù-íï†Ëø¼Þ+G`>‡p +£aàaÅäŸÃ"Ò.€cZ=æúÛ"ˆQsÙÐvíò6]K™Ì„5—Ñ(¨Q—Ëזm›fe®…½K>*¯ß2Ïêöl xw¥)l4˜šç6ªØ`|ÕtòáÝ]{<˜åé*8stIaü÷]  (Jð6cԓí£V¬êÃXIÌk8¨®Yˆš¸oŽ×æj¹²ÈŠYˆ3D3ÓÅ +•^yçödÙõcè¶bHÞå ÓÕÉÂÖ_ꠓvìÖô÷¡X¶:Í(×u÷Íc~;Πx‚"iB¬'ŸÅ(·SGñ|·0uSöڗÐ}±Zýñyv?èÄ/†i1§ìŠ1Yê ß#(`åy0ëÎvæÙ}moÞÀßS4† W2ù;Ɗ˜±² ‡·œ¬lÓ ¶×œÈt}ˆÂ”‘w“ûÑ0Rýâ©_Ne)$M@w'‘‰¬äXÐ÷‡ZКþé¶Lj/™êàm"Ê%†Xä±Fï` go%=x17—ñé$<ÇæT:ȈÍÃzWEȉoñÝÜÄG]íÎW²õ1@«äv,$¹Œ{³Hç]bÄK +/5+õd«¹8.À W0eÜFu§[î–ÜCâ5aWSð¾mA¤íÜA˜9ÑZ¨¥¯Ÿ€ZÇW–žá³¼G¥èá›ÔgG_›nœR¡ñÚËdq K‡OÀšÚ’¹&9äƒœ†]-NQõœ$‘ð©^¸Ú )Iè¹Ú1­ŸƒŒaKÞ}üۉÄ6ñí[Zäj„ôäÙZ²ì.PkÉd‘ÊW£ç kȖ$r XÐлjxtc)ní-ÿr\­æv€áKxEL ª‚”.ã­tBzÈ %ï!ê zeq¾˜6‡ûÖ¼&”1™E:¼š šÌ¦åH°ÃùŽ9]Ü©&@Ì`3ç­óC&—4§)šòB Eƶ÷uLX˜g¯daÖn…R€x4Š ^] sT=ç ´oà«©¹ƒEÒOƒu¹Ž½#%MßfÏ ¦¢[?©…šç*¡¶Óø3¹IÙòÏJÀ㒏_`8^•6gQŸ/s¶à lûh˜V§Ë䧃s48U6Ò®»K}‚´À ֒F<‡“O0JõBr²¯êN…ý²ý>Gõ7–ДÙbFß +Y—s\J6õDuM;pÃC~ñ¢æ ̅8å¶i4ŸŸOÜ*€Ú ˆ¢\þß*§ƒÿçi‚ô4gêÏ8hÿŠÞLÂōdòNí˜?:Qù+æŠD‹?}‘hþ(„º¨2Ñ#{?E()Ìý¨Sˆ^í§&®Â~i¥<ë’$/õ»[ûJú™[HLa“‰ñÓÝ-…¿¿„Ñ:ð31h!¯¾¼5ãÐïp¶ž;Íh9¿ÂFõ`æ¨&%:~ë98_Ÿ bnÅÿe4@ü‹|®c¹ç“_ Ÿi³H?ì žüÜ­Fs¿'¹\G˜þ(ßGjbzQ¤yñå(ßîi—Œ&Ý#%ÁÊ=â¥÷륙ïj|ÂH€ƒ¨$3ÔYÅWh™å9]c^¬i=]¦Ð"Ö;8?‰dÛêC¯}ª'…—z)žƒÄ õZa[w¤Žáž6z‘‡D¯M[…f‰ ÉLEsèÝܧ±oó¼”¼ã¢Xœ[êOÚ<9¯ÒBóÐ#Ó¹ž§¹Ww‹Ñ¥"Þ÷FyZÞ¢;È»¾Úx¼ÄâÞƒ‚|Ä¥£bÕ®ñâ~*eOS\ Ü)l³xJ"®„´Ñ¶I<\ZB<" +ˆ%hÿ6²/֏5hài +z'àyLíÁýâ'”#˜Èó;±¢šÛ—åրa¶rÌÀhɏ­¦b(xµÎ£E-ÓÒ !”—Xa曏BØ~IÙB]Tws5ï#y£*טäáma„´ς"è!Ս?ø’¸‰†è¹ +ÐLÛ½Ž™±=MÅÖ~뎱< S;…oK©W¥}kV„vî!j;m„ymw‡Øð5be«ÕŸGv~­±«U'£»§N„½¥µ+9 ìÊI|e((¯“ëœ7d\êz߶?ëxz4[/‰´®Eû¡d"ۇ™3Š}¯0±E–lN!çÅ?Ä¥Æ6¢!ÁyˆÏ"ŸE»0ÀG¡ÃÂÂs¹w“[›žÿíÞµV<µbÚ¸KòéUòN…ÓÈÁ…ˆN:Ô>ìê'Á« +ÈKp£ÂöZóìÇϸ PÊÄY¬QL·™ˆ1×c„.¤ùWE%¨ZՅªJ– +}x*^Ì/cí²Dìe ´ªŠãŸÇãq…¢¥ç„çVíĪ\1ínÄ£Yqޖq9s€s‘ÿ˾ߨÖG9¹vãv/‹V&¬ +D£ +ÞlÒ>`‚iù…ÊåýÆ¢õð_”ìØHDƒª1ﰀÆRჃ¼r$Ž¤ÑŽ\^Öþ›tbÂÈ>Z¡â⸱\?ä֋'Xèw‚ÿÍÃh²Šl$A! Úö#ýÐ8¼šfÙê*U*ö»Ðô "m»Ž·§øWJö`’³Vè'¦nÕґž}!ÁúFNõ|@·ŒSª‚œuœpá!"' My4•WCðURmN·…ã÷q÷í’(ç­¦H¦àÜ7Qõ¢ƒXe/!VÁS»4Òûlõ–ZÑÝ3¾ë÷{„ {M0¬øÖOµ ÆúµÓ"†r¥#f'ƒdY Ui`ؤÔ7Sá’QÅxŸ¥ø1µv‰JÐ2“«‰Q¾£u¨–zE“è³Fä²¹¸ÈGÿcªœ +vÎ9pÆ ŸRxH±Î{M=šŠ2°`€ri+²ÆäR +U1(-¢3¡”SŒ#ø%=••­åÿÉt¯„'œ‰ðžp ’ÃÌ¥mŸ‰Óžû…–˜ÏïGm(lzà­¿AH‡ötEÂÏëö;Wn³ÓUNI›³trÍj…Ðø 4èú¸LJ8bâ«,‘22°9"_#‡ù&5;3 +¡ +°Æ«Y*Õjklæ"é®<+H*\"*j®u2éÒÈ>Qa;µzî*[øW‹íjtH¼Æ—¡Ë¡8Ù¸ˆj¨‘úðñ)(jœK†æàí~GX‰+?!®ê\ýõ×v|Ü£îœIÌÊkØásƒ2¬E* µDlûÞquï8o±=è4!àDKF’«Iì?cæ¥Ogw§KlЮÍó5²ëÈØè16Á¶g!>$€J㏥Pý†·Ä yTêt†µÐKæðe'Ñ°‚>‰‡>û´0éR&¢D™ÖQUBžùҐ>ƒLè%­OY}óìHѶXLú͏{9Pjévd(€Ý/‘Œ0néܟ¬¦åKGEڒ}¹Ú¡NW÷ A|†nt9:}5lžÕÜDeñ Ô¦o˜Ïü":ø"ã4å[ ‰ý0Ç\4h{ETg¡}(Òne0@+©s±à +iÔ=!:ßXC”拈ð =ƒw” ÃX.(o·bÐÈ~þˆî +ƱÂôåÙD‘™/³¸Œãz꥾Š*vKûhgÌê84ÕÇàâeíóåXï–©ê%Ïa]¼)ï« Å$'Ÿ1èÐ ÎÆþj¶è„E—êp›_drÄã‰KèÎý’¡|Åaú_-ƃ´Ÿ×½æ˜gœ?iÊð5Þ çk¡™i?¿M°B¢rõ‚ǘ4"©“€$£ÉÞðž$eÈ#°WəRG‚É!¶£2˜Ô*_PPfô¹™ ­-Pص`S‘sCŠ~†FàÉ:€ afs憏¨\4Ù¡%eV%Él$FÍÆèžæ9ÐÍTð'<³³À½ÐŠ÷§¶Þ‰2ŽYÌsóGœ™ß;eø?òÔP½ß´YŠ$Ðs¢M +^¶Întº`Mv_Jê ùÎB!Û-Yǃm^màYIæD0Üϱup<à²L4íb'2mjiÒ:±EcdõÊIßb12ÄrèhªôOÃyA¤z¥ן§€ögþ=EûÓó)¥²¿^zn?À‡h…ÖÆ©cfí܌8äB{ô¥r—w¸¹õ8v6Úç«Àæ £ëaN<8¦h¿ƒ:]k¦}RÇKxÝOݟëþwý„S"†6Ìύ›Ä!™÷UC`'¯óÔâ#ûHŸP›aϧOŽV>EâÆgݔAh3|B¼idj~OÞÔÂÑùîé(Beˆ…‡*lÏÙRàìɱҘdÀ”§,ìK3œ¦(×*Yõ wؓ<³Ô†#ò±¸ÆÁ¹x†?5ZϔÊM#þƒç¦Õ?~g. 2Ó;ߢîãÝ9îTéæNZaôÛiIn¶v2ŠÎf‡,ü D*vBH1o<Èg&G+çԇÿÏd>g@e“ÆÎh¦j÷/§©Í®¼rzvµ““u +|«9MF,’DêFsdG>¤e|ë*ËÁ)/šœù´óJàŒÛ7ÛÍA“½ù{D¾¼ ¡ÞéC“󐤗7Êaæ&ì˸Eݐ>H^w^%ŽÇf½þÑ*l²Ü:m¯ýmgöÕ¬'„Æ«&¸PÖ9 í¼]™~¢fê°{öi²§Ô …ì<²õ¥Y-ëg¥“&µ¹ßÕÍÖ¶º~Yà 嗉5æOÛÜ;Oœ ˜œ™2”)A‚ƒ.Å$ÛrÚqeî?WÚ©m­^åÄÂþŽ;3ö˜ü!óŸ/gÀà#âþ»Œ½D½D» û13£ÁïҚéÎÌÇ 8™ˆNž¡ß$"ªŸg V<^¯2¸Û}l@ý3L§ó›g?afIP¨<(¨9PþèyÁR~öëg"Dàr/𔨮DLðò± ¢ØÂäqwÙ{<. ³ŸNâéö€qœhH ‰ßDó ~2ù>/%Ñ̌ 437$‘©‚ˆJGD5*`gVUUYQUUõr5Dä¡™7‰ˆŒddZ€ÌÈ 8‘ ‘‘`Dd"¢¡¡p"ƒÈH¸ªÆÉÆƌ‚GŸñ‰tJúŒ% Sß/B†I(eÎî&g"ByrÒa÷ßßÿ?.†LU̘™™¡©™™¡ êõ¢"QTUTUEu¢uTŚªªªªªjQ•”«Ä¤UUUUEU5õûç:¹ø0s›ÀuÄ8(`䙛r¦êU£ÊUUU­š*¢¢*&̈nŒc?^’"–V–J…© ‰ˆˆ“$IRX’$I60#I’F’dK·ƒÚ@ 'kƒ•Ú€(ü8IJ\‘äù¤•RÈõ¢#p‘»Z MV,l{P.—º‹gH•²ˆH‰ˆ­ù\;sžé â)@DDDDDTU­©ª¢ …o%#f4FFà.¡P¤"B¡ø2R#")¹ÈˆPDLD„‚A‰I’<I’F*ÉJG²j_·u+‚jÛ¶e]%<|l²m˶%¤Ô¨„|nCp‚P4ÉdÒ¦˜Ë-, +V*"4Hd|P#Qõ,T€ˆˆŒ6GՃÛ(Çõì€Fç*˜ï‰<µâ!£3N¡97À°VïŒÎ¹5J)ÁZÕ.õµµ©™ßH +2fëœîBÆ;¸*˜4çhtBdBº8µÉ9ÊJ-‡ÎÝ¢/ÄeÑЙ:Iö‹³|ñ¦®Ïù¬mBâôì†Ì¨õJDf¾¼‡XmBgћxGï>t¢ÝAg] BA8tV¯+.‘)XÿUt˜¹Ø[Ÿ]£‡ªåk ñÑsJ²J! P­32|mU­/ÔeÅ̃iå/~Ŭ ‘sGWcÌÑ^;fiȊâªW]ƒ›““‹(6A—†PumãŒÍy1úº±ýãØ+ÇìÄŒ£© +*Ùö1“„c†„Ø°/Ÿ³'&v}àsN7"2ôTê¹RÓ¨Ælváš%Ë1çeF€2fBς='OvßO@˜gÌԍ¯%Wcžs·Œϼ чö G0=DA\2ÓCªÌÍñ3§úÙtV><)8'|³-£Å ,/fÚJyFêŸ{çŒèb攖ˆÄÌsçä€èÏî/Òž”$.vN¾Š¨Ä.û€šIó)fÇ$KÀü Û{ +½bð´¬iؚŠ¯¬‹%<|✢aÀ-HÌG€·iw,F²à«p*-øVºÉÄCõ͉l]ƒCiÞYqº9Cԍ`×å4æ™m7P†9ÄPfܜ4ŽÝaˆã””å0’ÿ;ÄÑ&œZ"£ÀM;-lNÌVÃîáIsÊBÄ^F´A¤-Msåq`ž!Ï0ô¼Bù'·€Î¿–²°Ì™\| +ihÅÖw;ä开~οcNžèB‰­ì“Œ9+ƒ>’³˜Ó8Ïò¼wâ0s&Íô µ5dé?gV·£³ÂHó•t²2ªôõr΢)/§#Áô/™Ýtb¿]Ndèr.ŠY]˜BPBVÖM­çyNéæo°¢V`½"+ •ýLß@<ÃÀrnta¶h¯œRÿ™C'2-±$ç[éϚÒYøóh–#µòÍ¥Á;  rZiDÔ6{ŽrVéÏÅO**+ünžb¬Ç¯¤Lä IÎÆ!ܵ.pñgýüQ§B1Üu°)¢=Ès†m þ²Þ¡5^£o+1í¨½ðP•@ƒpA@ÉyßÍË °¨K6É)D!靝%Q$ɹÂú ‡b"9‹Ú‡]î¡L³ˆÉ9öÔG&²é?|†Gݍ1ã~¯_´Zr.0rrUÅ9‰ID3v0"ì>ÒX?˜¤rªŸÔ¨.ñÑË?tS +0èR¤Y¡÷òÓÄ@E¬'*%àÃe…ç^Sɸ]#:ÐõqšÜ™ùœpêÌ8PÅþm¼â\ô&¬!$¯¿‹›’åäjˆ÷ÝòúôÆ)Ž3óŸ¦àÚ% +‘`ú„§UA¡˜É´n]œ¼Ø_ #Åéþ% ¨qr¡š4ÎhO‡Æé5gv‡¶Limeô·;ã '·štusÀ´Ä‘GV±›+(ãt#­Fm Aœì™ÂãTgŒšÜñ8Nq×ä âØkÒ×»Î{_Ä׺(ußgGvk’†,ν|Q¡Åى­2lûpq†pÔ2aÅ«_`‹o ŠsÄ×Á{hÓ»~ÂPvZ80¦ª(NÓlâ¥N^Ü2í¹'ÎFʼnÓ?_°&NÆ၉³Ÿ¨ ›¥8sÃ5ˆ8µ‚ÎRX¾rHG`50Ä鋒¼åMüÐEÔÜ÷×ÙAÒð !z<¨, ‡“êÔKZÅ¢êìpVå‚.Ê)XHpt8RsÉÛ45H-ù’p8#ÕÅ2#ª¹FéýìÝpÆA÷…çËY5ӟ½Z6œdÓ|͛=˾`?6-Š¹ßX7lŽ?Mfã§Ù2±%¥-ã4NG\PæśÆÎ+€ï£‹…3h£²æ ÏMß`…s•aš+À0ÏàaÏ1\ÜóÈzÂéj4ž½Øp;á\:¬:‰I¤€jÐtȄ“lÎcÁæREx5ÇñÕ • +.ìñßTºä>úS¦¹5i¡@@‚«©6£¡ò=,¾%ÍI)$Ô(c•er¤&3†‘pâ¡X¤ã‰M(LÎo¢b3ã›áUjfÂÎ×Í6Ñ(!ÁT;‹~ö˜yZ›HÔ¢O·xeÇ7­s֕°PVÞN›mܵœð!—è1|Ô×r¦¤ÅÙ{y +ëQé²£â_Òéf8+©7·ÒCRÐn¢"7CS|Pßp’ؼ•̈́q àŒMO +ý@À\N4iâÅ¿YÝ h³DKï5pʲ‰Õï$} y7߂`ē• +ð%ú}Ì­çj® +õ›]“RW—°¹:D6¿¹…|ÈoF€R&‡?V•åeóg’ð›eݒiº <棔m•¤¢”…]#nöɼ sHrƒ¨¨¹>Ü7ÏF©Ì,yPªöÔ¢ÿ]ð¢Ø‰œ=\ Ö5rÁC +Ñ:og@(-㛮?4:Ÿ>)ö7<xsCüܜ%øyó|›“Ó€ÈFTSÎpL´™9ìPµ,lošÞևÚÑ?í͍š5 ˆFóê 9r=}«Æ†±ìg­ž¢Ç#t‹VYÂ7Ãé ø¦"s$Ã:¼<¨ˆ¢>•&ÏbѤ÷uÑÔJQc bŽ²šëŠ7‡«7›¦ì3cěM¶Ç…Ië DäϤ›‚é¨ÈKñ %ðfé °ßMÛç)ö] •ïæ|¶œ’5QDUðnî—Õ¥ÝÍÌ+rͤ­ÒBÍᬫâ°Ýéá|¿s®›Ý ²røKËr+ºéÂ0 r3˜B]yø"á^(ã½-(›¿m›u“„¼ëÕ¸æù€ŒƒÁºù§ÐtE@pB³íÞ©Åëpj¶Eÿ¬¾ÈKm‚Ç]Fnn©¸ÅpMè~i^êæ6]¢@[³¿wa!qS:q2ƒ¯r>Uèfi«ÖNšÑ ›¶gj>7Ã(ëFà4l +]ã'|V ¥€JÆf[ãa47éÕ¢‡®´0´è1ZnæJìÙI P”›uÍh†jD“›¤-F'„–äæZÑ Û\ý şÈ7s—ÇÒü¶¢€N F ë¸O³`R‰>: 7¹¿ŸÑxâ$ètyC܄°Î“Qç®üÕk·y‹&–òAãàpVk²&D¹µþVܬ˜Ê͓Yš ^LÝú_›%gà izûxA à&$góÔ@4 Ö«:lj@»B’HL¬›mš^Qᓘx ªì¿#xÜ*­ 3ÐmÖ·§=÷AƙÜæ™7_þ‰I9‡½uŠMsnU²sÛ uÒÚ6ïú’0¬©Û&,âø´9ì ‰˜Ý²]ÍI^ògÿ̬DßØfQ^ ÂÅ<&¶É-:ãñS>¼òY‰n@;ZÝ\À6q_o·ÊŠä `âøhûÚ;‹7Ád£Aåµb<º6]®M W\ÇêZYYñÜ(ÛPþÕæ[ààù¼¡“×¥ˆ©M ÉŠûÜÄؘúTt_.‚6+‹Š0ÇvÝ£^0kÛx´¨Íã¨äD3Ö\ Ý +'(ÍPv6«¸¥ÍíaѲ2®  ¦vtć´Y"$çb]¥jJF›Öá7Ÿw&ýnÊm96(wÄrVh³¤®:ZoÙÐ&Ç£YÎXpvUˆ’Ú­K뎂aM©±‚6IQÿ-¦È*u9 MjÁ^5U¢åÚþ¯2¹*73\Zp6ÊRs³)|QÁjeƵvFg³‰{äwÙô1Ž€²xç.™Í¤ÐE<|‚³6‘Äl"Ió¾ ðçf×°y¼¬h§—ç¢ÈÎçN.l>‰U6¬ÿn˦µ K݈§»­lšèŒmgV‹ á0Kj 9*›kÚl\՘G^C¼Õ>¸±QÃ'aRØ;:þŒI¦vâ×g?£:ùßcŠÏúžÚ>6# ëâË´Î<6»Kˆ!b‹ó×܃ñ ¬}MñãØD*֔²?,ú +õ¢û®-!ïAcs–"ÈFÄÏÒ)[i¹KIM\¯£P±I©Óà ῕Ó}dg9óþ,3çX÷Ø´Ll•N2îç= ÆcK›ÛDªHSjÌ¥a“jˆ•° 6ü¹<嬔œ¢&D²ù«ƒ‰4Åv@³g=‹™Êóô3bhˆÁüܱÐLc-ñØ,wŠ.f–¤*W°éÃÖ[ÖÅ26ô—ÞˆU‹ÍÀ´H=(‹ þšAÁ?¸åp²¹ò­ç‚Ì­,¥€_3pÏiãáSÐ „Anu&ššDjÍ"QBÉð°â·†ÌéÅ@^ó´ÖÆÈK6]&ø–!Ž4ú €×ì“i$çÆ8ÚW‘hâL½†N¾*e;@à0û“*ûšÃ^S=G@]ÓÕO´Ì•G²{/ƒ¬ONØ/ÍÉJ-K]Óìœëdþm 1ɹæò”eÙôoŠ3Cüþ[ Á©þ9!æ­ÙFjYAKlÒ²p¤©«[sDä’ÊÂۀ[³Z¤!=¥m͑a¢D±'è[´5I´äpu‰$ÂqHFW¡FäÖ±¬5aoë­ÉÜ£¹§¨5fqåÛ1B.¦5-‚iÍ儨͝]"h͸/8vEsëñ'!\Šæ8C)w:·8kmiӄø›šÙÌæ¨C—˜5ƒ]N›¡ß¡Ú„<`N—A V¼.%)™0¬Ù-€·^ CÉÜþïÌ·&šQð|š;C6ƒL#“Ò* +ìí%¼O·¡uTfR½ØÔV+U¤ ¹îv|–«½õîÌÌÎæ[ÇÆJœ«…u#‚]Í,îñL9 JW³Z‘–r5SÑ\c™ Ô«’Æêiܳ[M¦á‚tçKJxÊD‘Ù¤—lAð”š~‰%œV%Ýh¨ÕDÊY9Û)]Ah5k™C'Z3Ã"A끄’*ϐ–•œ„VÍRœP²Ž/«æZ!n¬ÆÏZÕdÐzƒe¹:œT5}y‰Z»“ªGW²€Ddœ+Ù¦¹©´( ¨š¾Ò>–ý—À„P)·”Їþ SÍ QL#i?zeU©&Û:r‰ôò‘jÏE ÛàáC»=ºTù±;˜àYˆ›š²%Š~:µùÞR”LÌ!MͽÃ@'‰Ý(ãÌDK7ɪû„táºô‚2Úé-¹( +5‡&TíëåtíR©¹ºEÚ³á÷77Û¬Ë3ñÚg%ÇüT*'³ZѪã9°O;Ñtá¶aê L+ŠSƒpD¦8ÔÚ õ@A¨©'ïêbO;”.{: n¡6@i—a¦¢«Ðv—ÿ3LmpwÈMr²ó5«.ۆiTSî7q";Vz5ý¥N´ =M’2DÀ<¡" OS%‰TUW ‹ÃÓô{(ä^™ÝiæÙæÑ·Kvšsè9fVí®NӗLs9Ù?Ϋrbm@G§yzÙ9«9MÎWÓZ•Ÿœ¦Ã àrF¤ÕÓݾ8MëU=uƒÓÌѳOø1¥4Aݳn»A)z¡÷¦9w¿ºÔ¨ËåÜ4âÂqyuAjÓlö҄Qà7Éç{aƒ0Mlš«Ÿb4N›]-ʎÏLžÑMªtÄh ³„1 šmpŒ§ººI™–!{ífy5óܑѳˆØÈ­¡/Iw +î ˜*TG°í¾&b³. ú*=/¨çG†˜ú#o¼J…mý\6Fњgf™n÷…ŸºxÉÄEL`^YÅÙ\Ž¥\s S5â Bû¹Ö"¡édz±U4˜ã͈½+ê2Ò1“,G Ttܑ5xŽ‰­e†ñéˆÝÄ8mÁ'Ž|V_´#rViG1xM8‚ë¬XbdDbüÝüh&oÞM´Ü ›öhÚhÌñ XÅþñÎG[EÅÇ +¾7?Û +¨>>³› ŽxÚ7ÙÂ$€#™G瀀ɯ¿`†K·GFªð¿F#1Ëm¶Býêâ«ÑÎ='±RG“¸¿Ð9ùnðúÖÿ…NUî0À«{»Þ3|ñt":¨ø7oZIô@”©]#w÷40˜ø©fãjFAžœiO–°·TÐCkÑÅ>e|àá÷ô ±àżëîPŠy½WZšö kúԟ[Ò#z«kXü%T(´ €e,S ¦Å}ô)–RÅHü‚è=O~àÕ .X«\¢¬8&ÝtÙöOéÄxü‡èEÇޏ»-.„[«f5eŸæÉ¬ŽD™D܃֐B"6¸Aä_ä×ê¥Ñ-ŽZ?U/ǧUd‡D#Ћ%¾Hl»ß±xzö{)ý‹<Æ;Þ¿ʕ®MxÕ +uGcϐÚÕۗz@|1µÇyQâ‰U5˜§¨ùFþ  +ð“†ÓG½Â­V‚—aBg¨»y¸¡ê+ƒK>ƒî”‡$bÂàJÂý¦ÍêŸ6£ºÿšuG;V`Z¤ST” c Ãó=]£¥ÉDMòÌ ,ØX¤1õ“ š5À?˜2!¹¢Ú(ýâµnY$Ã(ÐĬ+°#žíg õvɖ4MX|‹kù†4Mð¯LŠyªˆ4µ‹¿ž¦aB‚Bxńk¤ pAÁ†’†þaÌãÃŒqðŽŸ1æöt@ÑSøIà+"ü´âþl|àÓAÄhÚBÏK5ÐëÒ Œ‰w ¯œBٔ^ÆuvwÔ4è4qÊ :0ÁðӔ–aJl>‰c@Ÿþé(á‡Ñ”,04Æ aͤàÊX~ˆaIoôi·`|O4Á> +AO(ŠÈ¯<ƒ~‘!yÏ֟yšb³@Y…ÛA©À„¡,öÝÛùçíèáô)…º€wHÂîäòÝÿϨäí^Cù4½”2„R ¥‰&·©ÿD€rN~ÈæχIåÕ0žÀ±ì{dø÷PMI¼"egEÂð(ük°Ãw3Ð:XXÀ,? 8%üÐåä@dŸ—_“|J”.AÒ\8v„¹ÈLç +Nœ3b€IRls#û+Ši|EÛ`•–ÊÒ"6/œÕv‰e'râè©”6aðÍΉTqÓ •^ ÒÕîT<æ|ª´å9E(j’r„HϺ9#43/&Ll•1þ„ 1€˜«¢=œë¸‘¬¨Æöžh%è<¹6Š²H³O¿g–Qõð¯¿áќ% +­ÄW@ m¶kâ>*2.ęëi6lmÎPÄ»:»æà猲•¬cŠ~5âï݁«° ¾W|r¾‚O¸¼‰E¸SØ´É[½Ý•ŸÐ?ÕPé= °6íþ\)Mß&“´ö倗Ô%B~üR†éÑB|¬Ò­,Œ¹ÛE¼]%·\”ØlèUÅ%ÞÚNµÖ)ùºŸj—sïɵÉ:˜­Ñ0´>ܑB®·EsÚڐ"y+½Àý35s¯°OÜCpRŒ1¯ÚÊË?SÅîKýB ʈ£Y½\0*;‰"yBP É[E¦Û ÙAڜÊT]ù4ÝuÐÙF[mz†3™y+¾eҋ¡ü_Ô\¨YW×ø‰%ðI"VõD&=#Á…ìiõxÅOC¥ŽßöÒ:ÏìU?ìЙÉ÷YƒÈ>$\š=¢>¹²Nž¼m*»W” ·{Šþ7$`Õï7؇WA0èùO+¼¿d>Ð)’€c Énfü¢¸[ÆՈ˜0³‘ÅËØ0fa“Øø,Úˆ6R/ò,Ih‹¡šÆ]Ie‚’g“×ý`+@‹¡ LžÍ9~¸˜“I¾?џ¼Í®DÆ0t0É1Z„âÓÀ¥«Pؔ‘¬U$`&±BŽ ¹¶LÝbøúökËßø —My½·ÅdîýÿñÅ Çs “’©¬÷êÜa:óï8-dyŠ ÈeüQÆó‘Û}àâ¢EaV¤ú¥¼îgsøÃ>õ”VìA'iç²¾7ƒpôÚҀbý טø[SþZê¨guZRRúD‘FIk=¨€†ñ\¢dÔHYJêX)x^aÿ,Øû†2NJ'KýDKœ(–òÖDk`ñËD‰jÄ7QU3â!«þgÿ:ÿo¢K3ÌDᗷ%Z"=1LhŏÐOq ©¤@(ÏÑ1³Ê7À[4MÊµ1|EJ$ŸoLTõ Öng;N¶“.]H¨Q—‰þˆÏ­¶Mè±jæÓäB[1a-~ ‰&Šº3T/ èÆ©(é&Æ¢2òé8Tè87äðž›xM™ÍÇöŽ£}`¡¹P4¦æþÄð(ð¥yž©ã8Ç"Ä'FՂa~{çʝáÝþÊ< MGÈ9 þÕê1u0×}^Êç<\мé_<³‚Ú óDáû~ñË)dâeQû±íc=‘Ø ÛGÃ^낶£«‰ó8^þ1Rìô!(.f¾FÈQ› P¡=ú•z’[{£°ßàºJú)?æe~ êvk€Ÿó¤¤fÏUÀ°øΆx u‡ûÓ°>†*’OÀ@ +Á–6R[>¯ÿÙæðL²úcCӎ¬,Yþ6¤¾kýì‡Ôå’۝uNË%nËY¿Š^°:ˆÂÎñÛÀ<…gXŒí¨–Å?ô¼L—®g†ø3]‡z—†+-. endstream endobj 137 0 obj <>stream +ÙÁ…‘íÈåzCõ%€Kµx¨Ú¿æsÑ£°†dKÖjN$«ŒkgÕ bFa-q}e*°ê9©‰üBA í ¢L-ÐÒy5ÍÅ݅ΕKê5‘h”ñ,Ǫø¼€<’EŽTp¨ग़‚bL‰¾øÅÙHþ¹ –ª‹†Qðs@oö)Ú÷¾{c_éØ4Œš!cªáÝ8ÿ~’páôÀü¨\j¢Æsæ˜È%û+®lxL­(°O¶ÛÅJR:¥K°WwüEôP=£7I-lÄgð̒ Ly³o9 Ä+`Qò‹aŽ> ¡î‘ü +š÷ê˜9)7³`;›Ü9SsÚg穯'[D|¬–Ê*ˆn˜5È=îé¨Ádt3Ž†Ë‡Fh!¹úN]o„R…’‘4ujƒ…Ì°–A³uÝLEP«/»"O‘Ç*½³‡+ +ቜ¥0‰|DÃã'º„ab²!ãw›®¸g½çÇ+v¥¼w{ñ‚¾h et7û€xœ\ès‘Öe©l(ì¼É ¾SïFÄ*±ƒ5$,ë¸Ç”ÈŠÔ•åË*ðøÂršÓÒAö}Wòz\Ã6Lýͨ6߇ïL@ɨ¢ô<Í$Ü òe™>ð?N3E¯0KE†A¢?“;£ÿcÀéC¡j–'‘ ,ԐkÅ| æ±Ü• 'CT‹a¾1Q¨Íe!1$B)1TgØ6ý‚°Í™”êÉÃÁö¤Íñ(ƒ…äì`u CuÍ$°ðŒwଜIYŽù„,ßaƒVåñ±“²§"é6nå%[¢@x å„Ë–ÁîZYqš¤è⫐£ó(³]cÄ'¶ƒ®*’…Wv”!µ³M³}ŠÕŒ›n\6A`¶ +Æ׬ŒRzÎLˆ+`d}Î9ÆU)UDp…H EÔd-ß«Ò&Œ‹æ1gVU]¶}™‚±~ͼ q*“µ¾âzë=­][¯s€e«&EÅ¢Œ:,ø™’§kÿê ÑzªM2‰ÖîýG‡A3ó™ñš©‡»d®ö†–_5Tpïõ˜T@Þ%©}µ³ŽöXQ¼ëaÄëó:t¿¤'ñÞ]™²¯y)~‡äqêŽ7¿l\Ž6„¿M>ꇊ¸hCRœ¢’<€E‘"4K¼Ü±Üb°} `õ¥ AÙ`JyLš ß±"æSrnJBt{¸$MÑ°¨œ4«g|*ÐL‡$ì]~½ÙÀü*BŽ +Ì-aÒ°³s‹öÎÄvÍ ãCˆCðËkìœþÆÙ³ôâ¼ÎÛJ +üí&¡?£×ÑÌ;Œ¬0”™qèaŠ°3óbs 3²Ëx´Pl˜3þ•õ½i +_Ì]&æä’Ë^õ¥<Mí¬U—ŽõÚ¸ö„ëË2Eï úAó¾>?‚©c\Å´Í£,ðb+Xañ:ú¢‘^¸ƸÀPÁÝÕÚ¦”Ãô¾WTº…”vÓ d‘VÛ°‰ûÐރ'ýLI!‚ÀÑ$ãù©«wxÜɕô˜kñJè1z 3¿u‘ËÙI6²ÈîÊ Æ“¢W8 +]>ÓY‡WÖ9Æ )ýÄ^ÄÁ=W¿9É°’c!.V‡nÃ_¶Äý‡lÈmöQŠM üíܳgLGôÔzêê +Ý^*UÊ>ÀbI”Á“q$ >-‚H;9äZÜü„a#*ùÌ*ä9‹?{lk'j'#Œ°0ª(Ûpeÿ®8²®¢+†##…[Åÿv-楌½f&HÃϐìWþü„€ý¼®þ+Ò«ÿmnÕË;%M)è¦5ç†&aߞHP&Dæ¹mÑ|ëhQ®×âŒAN‚›À¼ÂúQi×P"÷#ëíRX.†Ë„YtÈ[¸Ö; päðø³Ý>ZyPà€æxF—4u̅zð<Ɯƒ[žEÖyi§©ˆ)z5E[ÒkÇ5í Ry“™þËOû¶ ;ès3\SÊf a´Ú˜HäkuL:c,: ¶A› Œ[[ÿˆ]"ÁÜµ ÚoVD¡ n‡PŒL»Ö žäÀ‚S +†Jqà_¥TÍ»$x:s&0 ¢ì°·Gö4kúPüÛ*°8í³ïIÀa”r$3Íê7µJˆ¤\–ê|h(­Ä—µm(AŒù¨¿B®º©ÎOó)¢Ð•­åÁ\Ÿö¯¡/ãý ¹,# À{žƒÅ·ˆ< Šaº.ö€¨1 +ö4ó-Î`lǘ6׊Áeýýç"u¶Ëu·v„–êyÿôºøݜ؍þHŠÂnJvË÷¾•r}A‰¼Ãw LÌx)Kÿ®<”áî— éö¸æÕ;ãO›x¼}‹Tf®U l|9daïìBñ·åWº¶3ÃXûîI‹)0ôõÑw_+ªƒý'ÍÓŠ9NNË)ÔõE÷›íhLEo‰ô„uUO-æqhXҍe†—Æ“Íþw~}l•„2¥‚R#r8AA¹ +èIè™x5ßµœbx‡EL¯`°+]0g˜G÷z¼³–1l):&u–Iðë/±J Ù±âMqˆÏ\ý<"ë>O ®öóäe¹deIÈd˜¦Øs‡ãEBü—õ±ó¯ÔÆ1à Ü°[’+š¤éÇ%´B`ÚZ +ê…d%lšQ²Œ>t¢ñ‡¹°`–—|nIòjòˆ8ØÝÈù©.hk~éÇ$”Gå9†õT­Y$ôÐÑ-˹ÁÅ/öBßc…VÀ•9ÑñÈ(|(9 €X–õÏ?†Pó.5ÄåDâ \Eú®$£±»IÅYø„=¦ ý¥a+v¬wɁ  ìþÎÓeU¤ÖÍ:;8äÏÕkÞF։®-¥Ø¿(æp1¬ýLf6}ZYiùYn¨¯zµZ™‚T%íW$.†ìízv²î‰xÅpTÏa™ 襓™ â5Û®#ª,b$T«« ¥£Ìð§Ó'ÆÌ#©5iÇöÑÚaÍSf™^f©ú7k|‰’` 03‰/üvz+ +=®‚¿! `MÇI ýêÑ%:\ïÈó0nÃ_‘εòô\ºãäñ*¡ <°uœÿ :×þ:•Ïdêh>eHCpµ4d7""«µ´ÌQ Ni¬¿=C† 'YX %e +¶wä¯þ™@ý=IEˆÖ„ Ž‹€®xàGvPÇÓaZå„ïC{ÆâGo ԟë0P Íx:šÀßö6g⺪¼Ýxy+·°i8•(I tÎMCL|Øh3ę%ši¥OTQQd˜:dÔÎ÷­”²²;ÓQÀPYu@¨´á*È=͇‘ŽÎ@¹¾…”=Á½K‚þŒ±ó{¤•ÅèÊÇ ¬aÌP,øãÔö±d×%®x^•%«R ѕ>h­Zk]_="D3óFü†Y²°ÒÌe¼¬8©Äç%Sé¾ÁÕoj-…“U9ÎbCq8¿q¨P‡†“t2ko´,€¡oP¼[DÓҁ|¹µÃç[4dlY ŠZ½o¿(ãvZ×(DÅÃÞuó<[xøߐ†Š’aù'ž8ßáRÂr;$*|¸ÆQs„@?Nƒ*&^­™îDÙ? ¥ÏÀLË:*ÏÞíEÎ+†˜ÒJÜIw,uýùuKÐ`õ^…ëÏÚ'ԏ(ÞÆÜxØöÀòr4âöTÚ]w94¸þc ‡B»–Ù·É0Mÿ£ºly5ù¥PSVº‹&X?Ó'€iшï9°ç¨Z’8œSJè۔$­&fCÜniNʛyÈ¥9òˆ…¤6hcV¿¤Æ´Ô6Ë\Éù¢\šô +ö_`a]‰]™©¢K{µÃóíØߙjIÊ_cÉ"Þ¹T#Ì.‰”b†Ý 2òª²³]͞Dà7JÛ|i3b„¸fÙTtWnòzé@Ëúˆ´¤šÉ“¿<‚ѽc–2+*K)IÈ]žÉ嵪©É qcUpîâëÀ LÉË}x8k…  >®Mÿ9³ 8Æâ8Чéé?0JfÿêDN÷?ŒÏL cRîqZTdž™²„-kâÀ0îՂø_£òb•¢»ŒÀ7KVW6]þ­’ +Ž*k ³}.¶ò=æ©ò-zÆ¯xÝђ֍}™å9‹>dœ—FåŸîñSC–xVž‚`P)ςE\¢tICÊËhçë.Ïõ0ÈCk\6ÖøT ̉d,•M±‡DWh½)9.á_ u—•Kœ•Föh}‰íðë!УCC˜Cn@Ǐªg«^º:U9Ýrkr4dF ¶á7叛~Ÿw™ST@8KÁn[`¯â#“X)‹Ý¥¯ÎFÌç¨qÊк4¯4ƒ¾Þ[X²¢5¢w § ¼¤ñ;—¿rMrŠ^Õ?ìz}”‰^ÖÇVHVÂì/*Ò`8̔2à;›ú‹Á §ë-EH ÿ#ÃÌŽAtˆ­ÿYlÂވÀ„àéâ÷ÝÏÜò̸$/ID*ÈÆažbçýH'DÑ÷VT ‘ 3³ŠÜNc•0°õV<֌Éj»ÔGº \‘:—²IkY¤º»úS«èòBŽµéż÷®É† ·»"û³ëièíŠø±6´‘ù» þƒ<&uB[~¦ã?D$æžO +g 튴ë$—MØO вî¨Ã¢.ËÈ>Ë^Ízgl¯ž§Odº›#€ flO6>„›¶›“:Ν º ¶´õ²ôj-*¡¸6º »77y–QaÌ$ £D˜f€6ò?ë(â®Ô’¥å*·{lî :+ˆ::qãäÇpáU£|bɪè†Dx1èQ—÷ÑаƒÎ?›µË'’¼&p9ÍFrÚ@ä0V@£ÂˆÅµ•È…5b۔%YNôœÞ±8Ȝ8¦gK¦Á‚¿î9‰h<(}Æ:‘öñ¨ÚÏ=@·ÍiS'Õ7û9ɾ™¨Ä»TÚ°úIqžâF¦ôi¸>|5W3õúL‘‹ú+¨(÷O©ªòXÑ̒1ÀyOF!„5c#‚û‰ÅLX +O'¤Š¿wPØà„µ­UäÚ)Üî…à6˜,DÆI–á¶­3Ž‘‘_!09>€§“ŽX)’×ô•ò¼©‡X]ãm"n2ç×í <ŠLÈ7ˆq°£8LCô?¡/RI +ÛíÿPQ.⋠…œü¢iQÆ`œNEØ"Âc«>ã±Á¾¯ã-5–ÄJ³èO +Iò®û2žq®FiÛZ”öƒdñ #j`ᛮöÖföŠðG‰uO”©R ]äØ) F©xÆm.’®ÆÑ +™[êàÍÌo=ntn¬ð›Å‘R"©Î;« +ªC¯’´%꧵*À*®w”´T2dîQöŠÇG©' e“¹èÍæ{]<3OF6}³I6Uʸ*ƒˆ[¡š–«ºöâpn{€‚®tk¯"¾8N0tÏĀ;Tݹ¥E …o£-ø¬˜ÚQ‚ ï(Âx¹ %ê´ìÿá/|ˆo!ηª/÷P֘ó(ÍÐ*‘{æ VØ£ÝW·àò[5£´ÜÞ;­2ËË1S#=ÚöŠ½ ZIÕt¥á¸B#€v«îÆ÷d÷œ%?©kœöÃÄR1|.4ÿ¹ÿYL€Ö’:³só’ +Va¢`dÂ4Ý·J׆@ÁT>ýîö~ܸ>p¤¬6¤Ðƽî²ÌÂ#‚8"¸h˜sÎæ©A“û–]±Xðé• {zº¶à¯ŠºÅV`ÏÖ.g‹g´Ÿ…<¸Sšs#…ðÏid”èré§+‰ŸÌB¬S2^ „BXÇESFNHÁ¢Þ,…Ó7[Gˆ%]—£Êù&¥?Mö8xF,„Å1­°=bдb„:Ïïý×ñ‘EI c<òPÙA¾`Îs3´ZžÚ_VN#a ~Hޞ`~³,ê“sÑzu6)´"nŽµüëº\RÉwå^õ]X®ä2ÉF ++…ãñ7@ÖɊ ^Æ;A.Ìã&1°¤[¤q’¨é _Kü©Ï§ ¤è¼ +Õ©"»­våHÕ§s΍%#O¡‡Ó±KK.L–[hÔt¡Ô£  .˜¢¨³_g .Ô=Šopzk]Ãþ„^ªõfð¹*Zs•'P’(ð,× £/KöQ1؛¥Ò?µø„›1œÄC±$løòø™¨ÓdŠÂžҍĂ<Dõì3I®÷Þ±v@Ý}㉦1û>^â~…&³PNoæÄí(åå#20Çýto›6‰H­Êò›úùr€d¬¤y2ñBT‹†ðE?j>¯‰qq/ÐC/CSÚ&>î.]z|”[EΗÞxì©.ðG¾Á7“wß4bÊiµ¥~"ÌÞØõÅeÃÞôtZv½™‚€Ñ(F×jÔ qeħ[.B0s`žf×ã®Ñ({n°ªêζíi ˜gEÏ;î-ëɦ¹½|fU{ƒR+{pƱ‰UÐóʌ³œÇ9’O+…ç†&¡áûhÕòzZ´‡*¨´Ùf¼ û’²X.tbãÍâQã3Xã‚õ˅!¢õÉ3£¤zÜkˆ¸¡{±¬.µÜÐ*é9ñkniƛ¦G%tKO|cᜫ–»»Zk妐&=/1.=$áÎæ­g±Ð8h Á|ÕPØÚ~O®½ãœx흋t²4" ¢jPÇC]ܪ$9³¾¥ÖY$\S‹XgåIÞ¬)†?EoÏ"ü¤°ê¾ñ©Æ«(½ A"IŒô¦UA“Ä[‘Slíúð½$%žÌ_ê]³‘¿)çÑO9'ì0í£È&5€}²w§ºØ><Ìã`.Ù!K.AßÜÄ[tŠü<±Ü¦–ësÙÿ§ÍCJ +ØÔ¡¿‘¤ÄŊaºé¨<„Ï&Îa•#ö0ª½s¡ðãDMԏõV‚H áyÅV1+‘ÎDRIøT¤oON@+ITzõÓâŒÀ–âLg¾<™Qh¦_ÄZ[³±i]óó 믇?߅Ô7§,ca4¤dÜS +]PS‹C!’EWnX»4À~½* âú‡¤Í÷x”³¦Š(TФ—ô? «Mp<œÔCú!ùÒüGí;›á€Í°,Ég¶¬¹”ÎÏ2,ˆ f:]I!‚÷Ž +×EOkՎú3Z¬„Å\Ò«Y³"v™‘„#à‡"½•Ï—²/e‡‘½e.PIj[\ß똈>q(‘"Bñ_&Stƒ"Ù0nyʋyjnx^E²ÆÈ]Ü%?— »I!Ν™ ôE¢”éµ8MºeÎ-¿€E:S„R¤a%‚ bK@E +N=V-yÜû|¥R-¯/C¤÷]µ€‰Ï#6Ìè[£0 -9N"ÕGÅD¦,r§’Y| T ¸Îa· î#˾XÔwㄳ8Ô#"k‘è(¡£ÒމOî­ßQaÕç UèU”6\ +>@Tq"aúÙ"ÁTú™X}8ú’,$g§„¢ƒú£‡W&U̱b·'.(\wFQÞo8j+õ=/ŠÕÅÜA g!™V¿Í %Q(„†Šlg(d4fBl=b.ŒÑH"Œ•5åw€âºÒŽ…|»ÒBQ†=p3³í)àä'–_³½_±¢m©§q7åܚMˆ´2BC6D’àSŠœ´=£õ®a­‘S¦N‰ÌŽ‘/g3×=÷!) ³ò•ñ|¸wO Ëv©AÛd”ƒ“s X;Fì«_:.DT±äí~¶_šžëPþ‚álØîêZúJ@›>·Ly¢™f²j„ MnC“1Í/}䥢óN.T+x79 áùpx,å΄ÆžHý(Ëj»"Ì4W˜‡ Âx7؟jÃWÜm>Hk¤hüÊɞ¼5Ärfü +ö8¯âtu“S¡pk#e+p¤Ÿ¸Ýö0S,·ºa“•âz`ŠK9Zg'¬„.¿µ‘ÀCF`Ájù…ÛÁµ•ûn³zAÝøäWf3w§ô(><‹wz“•bQd(f’€Ù¢òB.<Ÿ q°՞C!_…?ä”êBv£«XuWG°¥p)±GçxR„<¬2žËÖñ.€)†>Ÿ?Vh_˜È€ix¦4gzœ?‘jÞJŒî¡w‚ø+èîß!ÂÜÕ¸Tª\ÌO@æº 9<Mõ¨ù†J]FÓògq½ #V5×O¤øÌ|©t}Ù»(Û(hyP27ñ-y&˜Ði°œj -’É’nj&X¡ˆ!¡‘ý,Døåd05$‹xŠïЮ <mNn.ŸNî%vcd9ÑÆSÅwvíî&ŠðìJ)+]Qü˜³Â¢ØI0Õ¥D”^.öõ"ýJÞ=éÖÆÈI|abdÂ}ÞÄ FE™ >P1*{ Œ‘Õ¢–׋úY{´X¬ +êõð7€;øàÎ@xuÂ.ëM=fEh¦ݓîŽZO5¥SŒkéòŸO:·í!PàVŠæZ5Օí +c#3O¯`îa†¥BžÍ—$ÉéÖ­¦$QVÛ¢û³Ž!Û+[êĐKôʶ~l€¼¢ç~,B4¹w'™"Ǽֺò‹ö[ê½¾½¿¢¢·a à>wá«S·‡ø¹áÎB‡Ú|°’ð·Æ¦1/¸·£,eÝS„NÙm"§QV·Ý(öhÈÇTÝXM+¹ª3R+ÆٙŒè¹—h8Xb"|X”Ÿc +‹^¸^ZVÚ«5?Ê¥ÍòßÁCd`ÀœX/â>Œ^%ú_çïÀ1" <& +3ÙÑÀoN‡Ù£²’æˆ9[9”4˪Y~˜[.TònÅØl°pß`%xýÐDöþü#x!rØ¡;4Úpˆ¶{Quö·øÀ|¸§ .·z&8”·‡‹õ¼ +Ý0Œ¦¡9PmGÁç× ß¡E#¿‘T-”ËA HÕ´WÚÞ~m+&C)î“÷ ̺“Ÿ3»* ä‘Áqu‰© Ü腲¸ «6»Eù~æBxÏä\bX±ÿ«­²%Җ%y~É2°è>¥f™oÆWt¯"”«ËýåÓ< A‘MÐ6êąh—…çèôr![ã‹jãW(¦ûx"ØÏ0ÑàÀÜ-þF?Ύƒz'Tâ#2ðáÀ0H4¤N?=þ‚|Ò8j€£^@þ˜Ç{+Ü—tú¦êD.¶Í\w{à~þ­éÐE .aT#ïê¤Ðwĵ¥tV<`eàʆ˜ œT–®TA‘ý׆$[¨ÂÙ!•þ‘À{Pó@| ¢§°[æûß(;ð4ÀA¾úï/”Js€J 6z.¿Àc—¡ï€n>¼¼Š[<£š¤y²AuŒØ“ÚÀGZõ0®ãå'ÂÁ ÎÌ«mŒXD¡*W«©ºýbwJK‹… å|`‰åËàJ<ž”à tž<±V…ßÖ/»ÃÁ»?T¹ |0ކg¤—2›û÷p+'h·](,*þy6"è”Ugl?’¬ZV3Jðc¡ñújÙS”Ù‰ËLžÆ‡£gøïÏ.âhÃYûˆ—M\Àn}¶Àr .â£\>ËF[ Æ`æq SÝq°?Õ´¬pððEÖ»Ó"ÔðŒã}‚›©ƒž« Š°i„ ƒ´(ÃÐÇÖK·^¹ÙWR©Ç·ÞA~)ÌVÀô((ÀÁ•ID›ëÑ{p¦¯¶˜. +îÂ:ža´+ÍÈ9¨_EeËg6àCÊCíoÚƒ*à À3‡ÅÇ"CñkbÃY­ã“mn' +™ZŸXD¶j¡µl\,ä’>O‰¦¢è©Hc'óˆv¾í9‚Jå‚x'P‘*ûtJUdCµx(*oTó¶‚hsj‚JmÍäpuóòòÃÎørhuž4?pYkaxJlN7ïVJèÌÆé¢OsÚT½·?&•Üm¤)Žq·Ð‘®ýR'µÂd’u ¸bŠË݃”œqÛ%LÁRΌ;ð±Ðts^ËýâÉ 3)ÛÛÁ|l=¦À˜í—ÚJ[[ +Œ´ŒšÔ,XÇÏ +*›fŠ(ÎY f:!¼µ%’W™ˆK}ò!é˜Ê,¥ãz +g¶W¡4˜AÖ8œ*æLQ`¯g Tj¹6z Ép¶ªþ–iCƒ¾ˆA‚5»eDî'Z+œÍóUš†ëíz‚pK©Á±ó—Äb- +ÎtVÃ×K39öµBôzh£æsóÑ®ÿÎÐö™Ë™“æ3Æå²äXZwJÍ2‰!Ø:œ¢<#”tZwŸÁoâ½û>'®¯Rùt&Y<.q —Jk=”‰rÎ¼S‘ÞH|b}Î8X!elŠ?ƒÈî íöÌÇÓùéíõ¡OE=3HSaSÏC3r˜æt<3 ïy±vEŸqÑÌdâ ÛÓÍðWmkF0L—»%åk©§‚Èa;:a£f.ÌÏ=g›òñ~xQ¤¥­xšH‰gú&7ßÁ(™ï‡|¤K‹°¤¶áœk±M#K›, ñÀ¤¹âO×z®]LÆôìGÈÝi¨¦šä061J ëŠcÜ1i¨µ¶4vw°ž»,F¥žï2/•Œ   +ÐVx~ÍÄò³Y†$¢¦[uzl¬‰p¥sìm`¾>Ÿu?àE”ïÀl^Â6±“¡ôSÓ3=€ÞnÐpzœ¯½¬kXëj$ à“À;×2ÅìÐäþ=Å֋еµë[Å8OíÈt8æ‰¸`÷?ó4xêvÄÕ§Jã³ør5ÓQ÷A<îMäS]]ôuÿŸR¼RáóP›–<¿"µõ|>}ÈBe*´ö©ðÀ5*üÕJÖiÀ@ÙóÃ<ËFòO¦å=i¾cZ€ÿmÖüèy-CÙð’É7³Ò ‹%!hÄ$3kÅGB!æSávÈ`šú^P_ªvÿ ØɘøпªÊ€¥«O?–‡Sð¤ìhHÌÓשi—hŸ;‚œ/_!q®ÿÉT\ë}l­D_;¼öŠ>˜_•ýÖÃþ—vºdã<}j8§ò¥ròݏ/¨ óÁ9b.Ÿ¼Ä²ÈçĽ8ú籿…¼ÄÃÑ µ’ó ¾0¨À*™âÝ61ÐKÁtҝ`Õ¬Äm+ŠŒ2‘þnúúݪÑÍí£v½^ß ú»0Ìt퇂'Iˆmÿ‡A&˛dªº†¡‹.úOH‘³cødV›0\Ÿ¬¢wñ@)´È=â©›LyCBJh×em‡‚§À“ßžâŸ\ió,3˜| UD´ü[t£í“³ fò.\FìKŒ˜ô'{oãŒ͙ï§%¤¯1YŽW/u³7?ª¨RKk05s°GEãW~Ú6ÿg‹þâ-Õ±© ÖRøÚ5ÇÙi©¾rªò"@åýyî­1GÁ>/£cYÖ}¸¤;Æ×Óµ²R՜e¾^¨ÇFŒ”›ÌÌZËb„k1y ”¡½å®à4kÇ¿>-a@"l­I؅^Õ’„\ÃÐ=Yfۛ·²…í û>#õ3qJ1+ߺpƎF¾AÀõ¹„*fQÛ¬Æ(ˆ›×y\¢ê-L4w1Á73’‡×†ºñƝÀ¬ˆØ³d(«Žãf¼Ú‡sš€PÕÁ†9ACS¼MP©‚}N› cGTßK×Æ4À¶‰”šcZhz»÷ЪŸuÉ¡¶`/w0ž"&ö²h±SZ¿%'²WŒø‘3Ĉ’ }pÛtRRxKý5ljтüæÇ©böśՓÙ5£©Ï>ü +‰E1sô³±3½Îrêx¹ L¼lÇÊ<<ˆùQӓ] ÕÎh‘² S±ïh–_àµWÐ? M†bð>°„W[R¿b‹Äp¹àI¶X´’úkI(=‡©ÇøFœ²=BC—ц#,_=§üÈCNÉžá+ LÈËuÑí2…8QhšÙ–SNc$ځÚuŠ³QQÜ3ˆÅmÞæ¯äy©Ód옲àge̼Ô@ rÂׯЎ;'§¾¢À¾­ü˜¶Ù’ëC xf ɪéÖÂÝ'Rõ&xÍ8NrpÅ.¾ +Oµs=Ê6~êyý>V„öÃ×âEšëéF¿FÕålÜ׀ú4ÕiÄ%'—ß“þÈÔ¬S¬ñض1)X['º0ÉQ‘Ôº”o†B{0&À ž­Ñ_µ‡C՞ .|ÌøEˆøŒ^³ÝÐ*Ûÿá?|3¬­ã™…lM^—‚™E6\PÃ!Hò)èðº¹oÅ a¡.;gœîíhoy²ä\!¯üˆ¥çÕ#¾Ÿ78;Q¢¦!þÉÎ ö0P‡94-ú¶ìžb(\™¿¦›%§T/«+E°ªŸ$¥Èׄ~7³™`ӊ‡‡;,É'_V@ãL“?¸L¤WØ3ɆÊ\P½9'ˏZ#pó$]¦EUŽ?\ÄYW°üLÇg½çҼà ïÂíïÕï;V p¡,º¤è(+½ÑS~$¹^ù½Drû0õMHMù¥ ,2'ØWëèœaÃ\ê$æ@&7˜;!;oYz Ò¯Æ/éC…©eîífÀ +ë Æ6Æß@\(wíXáÀ@Log¸llÎÈþÐ k®Êã(ƒ¬hö©øLMxbü ïWOažbbYedéÝ..ÏZj}§j¦äle¶zI•4JOr+Gâ@KÉAë)/”uL0„¼¿'Ó+)]é«\5i3ÝGaŠG?æbXprcêÙþjíYˀB0 ñ ”´†-û°xÖÄws>©‚Ë· \áN+VC§ށMlï*½ël´‘½§óf´#C‚gÁ(¡5‹™²cÃ= ‘¿ä|Yv ¯ã¢xvÚÃE¹EQž,“JА‚…Œ\º`aÇrgXS;î¥/ZfBá9áT[…Iš)¸\åe .Õ}¾ÞSbr›lmsáž6­±ÎόÍ>Œè¯üÉc(ʼn㏩י’}°Ú7}¦?A®7¦&‚Æ#»VìÇùY#&؄’(ñøáäð™¤ÔåQV‘V! i +ûÉAÐæ&Vlm.Æ×HR³ÿ„C3B+“ƽ٧j³ÅTŸyì½+Ô7dqI~áNdȁâ4ÔBt8& +†“¾=Š)Ï&±Ôzm“©Îe¯fôT†.UÚ…91³ï즊SÃ~›˜ìTÖ²õ;y€1º·¦I#ë÷zuNšJ÷=“ú t‰ÙT©ì£Èní\¾¸âŠÅ]¬9ÕCMzJ:„]ÇQÑ8, ¸*~ôy;ÏúV?Ú/dU£§1J:) kg}ìYS™3¸ÁÏ -cK@¦Rfq䱝Q_yh0ŒQýçÈQŸÐ-˜}"€òÍŽKWpMZ›G4½ä,c RÓ ö½ñød˺bhQžVçë À¼1ÌH¶âðs® ò…+ÑiÈÒ¢Ñڈ 0Y9´ˆńc9öô¹¦)]£t#‰—±‡NZæ(‹1&wÃ"°›ÂÕtKc‰¹F´Íz¼2©ÝÙ÷œÝaFv®"€Î;":‘+±xß8"Øø[ é„ -p[҆°mî)¶h³¶},º‘³)è ¾ޖ~ìZ1îÐóé¦/u=`¿Sèyß¡J¥ ò€ªìóÉßó_Èž S¢¸ùK]j#V‰ÑÛ&Yá8œ{? +îÙ×"q_¸Q-é­¥`ÿÒ$eØLFŠ\øSv%o_÷FhŠnxÝITTÝx_WŽ{•íÁâw ›B@©TdьXïĆãgU€)ÈauÏó¹aꉈbw˜Ã«`@î‚¾ÈV +…I‘Ýø¯Á˱y²²;E@ËîHÅçé„òô|`MßÆ&B!n1ÈhöÙõç»p—¥øÁ¥Î·²¼Ï…E +#ŸB@ªå%¦¹œA ºÌ¤…Ö<¬4‹«@r¡/ª1\nW³‘tåâíJvî;Ûws}„•GÄÝV|ô§#–Á·8äíÑà—ÉBɼ„d+âq„Ãelãוs! â‹RNT–¥¥€3JmL ‘":mzhû­Ž›PB¡iwľq;*IeX ØW€KM¾`ÅÓq«$¬÷6Ԇ…ˆÇ±âZ Öt6ÃUsU+WÍ~3 THnÿ x•?€î$s$ýT¡7ŠLۃþq±0§~ü4î@à –ËÔ8$S„i¡i3÷¾†,»l:AK(ÁCZ@ÏUYŸ²ëòß➖ãkf$äf óþ)`æ«Æ†.i ´#“ƒg¨”"—Êxt%…Ó'q>å%©êýÐü°üø'EÅç ٞóÙf]4—“”FEȹž¦+8l Œú|LšHa&™-׸›eT +Å]ÿðA7~Ÿ']¥x2èãdm)§ùÐÁñ|å2žAâdâÉ"Š}7 Ú­7 Ý‘‚ÙW<“3øIh\€°“G'ìy8ؓ%üØÀÙ´|[ÚÑ“V¹U‚‹uxýš.ý B ^f\ g qs¥ŽayõZâISˆTWüƒõÃ.»Ç"ø,*«Û¨ì(¥Â’P ¢ÌÁ" •6¹~‰è€ªßH|!@bÞÎu– ÜFv½ÞZgh J¬)80Â\‡²Ü¦Í„-ûJ¡‰6Á€Ð dՀ,éØH¿°Šìÿ±èÐbbpBÖÄÀ†7TuŸ”Ä¢^.G”%¢þ‚SŒP¦{h4š¬LC²š g÷µ}ôZH'‰;£áø•\ˆï8#W—ËöÂ0 䏶UX½’qrOÁW±$9°‘Óq§¥¥<9cÕ+åï’ô4Y„1ˆ¶8'àºæqÊïüI #)”” ꤳk… Oç¶Ð¥õ4Û-j_0GŸ¯/”X>¹ø©^‘`‹{PnP`rÑ{ڞÁÌ'A_N¨^K(Ð3pö‹b™ŠùNKèzªX·ö(—§{ÛKCò>¸oÓõ@\ÐsD³Iއ'Ô¿÷‘tg,²çBôÔLAx#ZÄÊäN0| Òªµl/ºª¨‰‡Pmš2R‘s€±à!Üë`Ñ&ÜK끒ØMšn»´ŒÇÆIóˆi°êI€)ÑÜ„\€/ðbT^Š½‹žOÂhkãK‘`Â"p¼QØÎ2ÁšTLuw·‹Tô€ßi/tÌÀAܳà|©‚ˆ í+Tšd.&I£AóIYÞh’¼mð‡Ë÷F}ºK“ŽÛÖ@d@˜d>øË©‹ªŽ\¸ë÷G‚.e(Ø"øe…sk£¡NœD\)éG6!°ƒûê”2ò$†!Xºn+3Ç®ì ð[$Å“Ú Œ“/ +°î†ˆ3 hN¦³óÂaêèn83’9Ú£Ów¦.òyR5ÓÎ&8Ƴ*jú w.ϯœaV“áêÍFgz`>Ŧ–Í4tï?Ã@[[ýLbëÎ >T<ç §.mgba¶%'ò™BÛÎøI/÷LŠÀ¿2·«z̃Xɧ†¿è^Õmk*6ÿ¿iƒÅÜv?DС ù 7Ê¥P~-þ7ŠO1nÛ²èq¶b ®#G¾/#tÊÂÊL2ۍ*†î:Ù&ò’Ï_`ªrhYB00bF!ð’Ò'>ÄS‰_³ +–ü}ïرŽ÷]—M û®Íz)–†hàó¶”`µ¢#ýÕŠ™Òc½—5s%N1J +Ž!iW5þÁÊ®áä/w)\ѯ"l€?,7Ð&E÷c%c Ídß'¼ñ€I^Ô¶m±Æ.I¢ Ò5(0+á’àH€$ÑZû†é—à­J3jê8"ÁªN‘2Êm§rÙ©E¶íòCœÂm+Òý øf(8p¹¬)–$F='ªÇŒ_£ÛЍ:0>–Òô^„ç‡ù¶7ø»#Š™8¨ÄÞC@±8@‹…ãq˜¾ ¨H0'LNÒ¬LP±#@¬§Ëä¬4úôÓÍJP£p#Ž¾– >C° ÔÜOTßwvm§J DP͝íN¥8‚*,ªÓú-A€ –OªìGšÔán1$9`2ò@Í(3Éʈ5á½u F˜†Xêÿq ®2ÄOæ#d0nâGÿÔ4¢Àlöò€k TDº 3½¬ÙÒj<ýBÁŠª¡ÆqMr’ٍ3øŸ{•}͟5wâ>|…·€ºÖ¼KuÍú΅ϔSgþ¨T÷P V`ñOIÊ°¯{xI¨Yþ@ZÁÞQ˜¬?µ¾zâÊ*T~ôÞO±É9gLǞAþ§è’fJ²ÝZNý§¥.ENŽaêŽçÒ>½'wÑÿlñêØøi:¢^ï§6øƒ“éI›û\Úöi¹<5©Ú„N®îò!Uµ·êÓÑ+"Šö×Y?PŸ&Z¬ +´CTâÞ Â  ìéM× +ƒ{%²8 X"éëiÜÒ[ؤql‚<Ÿ–©¾ÕCÓJ-5qgï/Döô˜ó)šèL!4 rzƒòÐîöàŽÐ¸a‡-bt*áS¨PÍ +íxʾmCFäì±ä!!Á?›Ôè=-=µÁ)ºªb]îïé¸RTDrD·{ºS¢~¼ M¡{šEFÔHÎì)èe|Cٟp”ÈžÒæ|ìd‰+k{Z¤Xž…>O]'½ÿ‡¦ÎS"ÆG׬¹%¨žCú\= `ÏHêi±H“ ½ù06¿SX—JÃìÓJOõËÒS+©Á ?†¯sïDOÏ4ôBOwAã#;é)ÕI ô‡pço¦~)—µq&k<¡Á͈¡"ù/âä0•À<]0¸ñø:D]žŠy;ë4Xž®U܀uŒçþsTž6bÏÚÜā›¸±Â ¤·ˆn½rÍÆ5ê·}¤)^ ¾Æÿ[óë‘3§· —¼"EnmñôöaMtփ|[snY‹¨=)³{–HTÚR††6“3žf\²û¦5± :Í!_è! žæ>°w-bþÙÊx@Ò¢)5˜Û֦֍ù_û>:èV^Y½ÈÊ;…·Ÿ1ΣÄ-Þ±Üa;•”»SR%öA H,C¥ô¾=W;Ðâ•þ$\͈ysIUÀÜ)sßí‡êÔMOÿ Y¦pÖw: +¬±½{ p”÷{øñ¹‚TýaµwºÅ£0–ÃV#¼2Ú×WOiøß[ª…:•—ù¡$ g§~|dF=Ý avŠ¾ÉÖpšœblðÆ>+;%—äÈNYj—ÆRaðsb±Ó ™]CGT AnÆ]±Ø"¶×uZ¸Ds¢î5”W¿*×T’ñ>œþՇ…X߂V§ëÁÕ£vgû#3g‡ÕKýêþáqët1U§^ÕÂ6Pî–MªÓ!vB¿ZüäR3£-°óü§Z-^Š›¨b„UÈP›Ž<8Jé·"ã¸NW:iM›JÁ2Cq0•dMüM{9D§©ïX{—ššÐé“å'J½‚N‡nAR"Xz¨0Q?§h]P֌À_\ík3ߧ“F„ûÝ8u҂ (nÊÓõ'=§Ÿ08/U<¯¸8 xhZ Ÿ·é–H3˜fNӑ$s*ØZð‚Ç ìá”w+/§`X1—S:%Ör +ìGÝjÚγþå4ÓtPI+ÒÛnaJ,è,7x©àdK'êŠÿ×Ma§íÆ`t"d*$9í[6ÉHùt 9Öjèš=œÞ|ëH\=¤!Óú8Íh¯„u¯<"k<] pÄ~äüÛNÚ8N–UêGkúñbô‰=$¹¸8.‚ôNN£ÚʤÅIâ4hˆ-£“, ½WõW5t’ §ÈI0óO¦4Œ€ÂiD}ì +P’züd §A %-;¡ÎÊܨ¼+$¸›±‚Ó2 ܏„šÂb§óQy8§QIî=霾ՁO~˜ø󌗃 Z‹Õìþà´¥Ý]±{ÁuÏ×Î"´K o:†Ïã++}÷¦Ð¾m1ùhŠ°n¦%‘Ç®a,¦D2lJ^YçD:šFiœÞi=戀7e¯- ¼Úτ¸ïMΦq„;ú¯ùs7ÍY[) ÓL] óOžv"õQœÉPõIÌM­#›Õ›)7 w/­ÀIcä¦à˱GHý`Ütô¼SC¢\„)^-)ƒÍoiŸ@ ½Ã› §ß%¦S’Ø;nÓÛM¸×œ Òü0¡mú¥D¶©úÞ=›Ä73G±iÞõq<Éȶ Ï9ß»èépèM±Ç‚L‹CsÛª2mš‰›êôŒ¦³¥xçæÐèî¯N…²i€Ì« ùìû{H6€ÑVmÓ“þÉt…âÚÃðŽOt2+)—ÛXÞ#z ›&j¢)V@n'ؔ§)œå‘(Ú ·±ëR-}ØtÉ¢«CÚÜ}Nû€;ɕÆCŽ¯iØEeR]ôOåÓ=ïMä4­P<±ùFÜ$à5%B\‘¼ðãTpS©¢ûO¨†ª5u6×䭄§GКvú8s!tdùÐ[$M -|¸“ +WdMqýï™BtÊI¢JÙ4ý^À{ë,XÓ øÁԂaªQÑÏ/Ù¸š6pwìF–É¹òn­¦d„Þ_#2¶u¬¦r8¬Å×·jzÞæ—zä§|©šF?Û¾“¤šÆ¦0&‰*%0鐢´º ÈÕ³[<±þEò)A R†ói:I3ãâtò +K­ÝvG}\ÀÓtƒI4|¦¢QM•dIøW§i8@H¿t¬¨]ăc¯£ v3¼o%W—Ci—¦p¥¶qÜ6²4ú3[¸œ ÎÒ4eQÜ)ó9íIš½™þ!%‡ÛRh(‘¦äŽ—¢º/ÐÎÍò1tRÞîׅd}¢…вdçx…¤Suâ9šjom¸FÓ.B›×%Ó=ª2'=SãߧªÄ\»BSX—‘š^¦ÚÉ š†ÑŸÚ¿dC+tßvÿY% ¡y!Ìú¶i³ÛÁÓv<MÕä6Y΁8Zâ^ œñ™®.`Œ_ۙ +ìšòW{¦b:@ÛÞìÒ3}@3U°L‹!°1…¬ì†<ÓquCj÷±Ê[žé0¢{å“gQ–®g˜Õë +èL7…O³ÓÇüábXQE©„å”Ê­¤$±­™Ê`˜Y—\=çKÍôþy#Un-u[šÂC°LÓŸ¦ëdÐL +Ÿ¹C4¶xï…ú…´¶ØÃ>[ ‘©ò™©Š£'f¦Û-%VÌ!3íýB|ÂîªÆLIf{±Í˜»dÃgraÖ9ß‡Ï ü=ÄgŒÊt0ðÜÍM‰c\a¦wÄ'—)¯SÀ*®Ÿ Ó â²ì»í8û2m¹³°~Z)Ià‰ÏVïr‡ÏñˆO6Ø5Iµ/¦q;úÞLìÍdãò|_C¦S%™25ÕJ@ ڜ¤]ÐêeO¦ãªd1;Π¶“éžJ¨±ª¬É4ÜlÖ­\¡©±ÂdʐN‹Ÿ¡áüڃìºUdÊŒƒ*†L…‹x_„Lísé7ª Ó¦a¤*i…£õcÚ :%¨» +ÓyªÚ:Œºæ,³§í˜Zuè˜Ö5ÊW€ÙVºv“°iÖNkd‡˜®OL6h M¿äÁ˜_„~‰ /¦QRU”ê{}1å G㵘΍d,¦˜|‘&ÍįÏÙZ1uº]„µ·‹A £rñVŠÑš½íèZ¦ ֓ޭN7 Ç 7Æ)ԑŇaj¾'îP ¥æÄsûh6$™¾è˜ +SÓ´áSe;M˜ŽìΠ¿¨’ÖÇ oÒ÷¼dJÃýb»`Ð¥o¦YMÆj’®Noõ`º+m~°Kbªš1¦ Ó&ïTË7ÌK ôHsez¦ÏzGœÐœß³d`Z±åæ[ÖLËÚÕ¼™Ð‚¿Û€idŽ–dA§Ø ¼tÛEÔhYû/ÄpIÂlq«•»3®ˆ;oâÃ5嚟J̧]Š§„Ü¿Š+íôÒ`9;õgÖC(¿tfà…„Ø¶×à—¥—Üz‰vó”O,Ÿ†îKÇ¢î2øºù8Ì$J})Ž‹po·¡îŒùҖᙃ™Š½Ô?´ˆ,¡‹@®õRší±\)A9ÏâÚ#j»tð̚p‘¼ôÒÎnÉ==µÇ€©^OÉîÎKKlb¼ôF]º ì @ƒJR84ˆ—r +–tW±}Sžîä ß\n¬´Äõ]:\Ë3 R:°ä¨*Eõèv$l—>!n9–véKûk“lQ“dQ¶YEv)ªÓð–tþðÐýKn úà1þ˙—k¶^k€çҌ5ÆÛÎ¥M²+Ä1’Os)æž&z…¹4bòJ(€©ŽeË¥ó·Nbl:A(ýŽÔ_¥ñÕy½Nº\r©¸¦ø꣤Ð8¨KZ£&O½Ö094([mÞîø-mÆå¹ MßÒÅàwŽ;,Ól‘jÔzªðzK)ÉìMSêxbΉR +/(ñ¤0¤îó,DxsW£!üÁ&ñœ8z¸- JBzÂ=o©,=Ñ=v…tì~3µ¥‡eµ—ÊÝ3Ø“®2þv«ãuÀÂ!|¿“ÖZJ­»—_¡­VK–wë¿K=Y(nêTK…úÙ÷Ajéôj)Zô0FóÊi©3×?j•É¤´4Œjü$‰6íŒ6ZútÕâ„q ¤XhéüGš?Œ²–Ò€ ƒhÒ8>KÑß,Ux'! ]Z¥µ}RÒQn¥@>é癐yö³Yz0%u„ùmÐ,¥2)³TQŸ0K ß÷8 +gşìhÊdéП x,ÅKüKÌ<KÍB½Ü†Ë”ŠRÛYäY­…ºÄRÍâïÃÓ¥8WüŒê(¤–º·&>÷¶õ´ÃÒq5‘•/«D>Š¿©'Oæᦍ°"ñ—DºÇüÖFüÝ!‰¿ª\i ÏËÀt4î:,…'‚Ìx-©gðJ"5©¬M +¬ä/Lø˜z¥ 2h±æ2p¯´çâï‘p@bdÕ]©”àØ-ʨþÚYB ‹òŸ¬þΑZYfÀ\i 04à}´R1‘ÏÈý¶&Õ(Íø/Srgþ& ùÌàOš ܟnbÚ§cBj8rFéßØ°JuÂFßâè°g¥YßuÙ¶¨Æ••âvÏ9QÃ(Z ÈJËêÆòA#ÑN÷½A¾VD¬tj¾d*3g_сrâ* +JßÏRCxÕW)~Üà”¹vG‰TŠþÚ½ +zÔ¤u_R¥AÖÂâ?EQ¥§÷¬Ú JE_9ò®aŒšZÊގ¡ÀÓ#_àØ+²¨ø|4¦Ò˜ÏÁwBé:_™ÐMé[ + ÀY‹Q©(Y∏xJD¥ïDž”ÞnC¥ðvÒ5lëýdEçBcJG’ ™Ôº)2Û4$ú1†)S0@§.õ{*î†uÑÈ°ŒUöLÁ~RmíÃ)¡)*O‘‡ÝwSzy…CÉü-àÛ /I@“P„a¦YáÏEzKKÔ á˜ß@ =‹ƒJ(ú†‡ÒÁcOŠ‰ÕA“V¸Ò’fvã€J͂v5ßH¢PÞOhO=á¦ïìä0 &¥Á~wþ%|à!PRÊcxÔ¤ð:V¤|ÃëL”†^AˆÐ)†P,n{gR°^ÀW,úô¬€”jæ_Æ3RPéÎ_J¥Å·+Æùj ÄFRôöτF&/Ý.•3€+(Jۏ=š¶O±Ó¥^Øޛø"¸‚DéïµÇÍ×èYQš…nÖPŠDl®‡ »•bOhF¬öºg! ' ¥¡á˜RÇ̇4²Ÿ®ÌQÕ¶± +hÍS W*|›œ+(´.^çîéOg?Ç1Ð[pŒú'%XHWÖá˜*#òú³Ð<5·OzI黖46ÎA’>é)I-ñ£S7Šêæå+s¹Lh’mEñâIÓOˆTPÝ|åI°ÊµôNúú¥)À^ m9jêœËíFS—;Uðùý'–…ÔIÿH]äÑ:SFA\¸áJì–ºÓé¥6(6¾5ÃzùAZ¯NÙížN]eh`Þ&^<됱µî“º{ø‹1¨¬7)Mé”mRó~…Lú5p•Mzª$lRpl\aù’êl·HØßùÐKʄ+(Ü(‘²èå)€°x%zÊã÷³%Ý0ávIΗ*-é2xs¤€Õ8ËSJô0Kš4÷ÎħÚ'韭Hær\:ٟC:zùyG))e©¤õ‰º"PI? )z}¨SR‚›©ü}9ô5íaÛ" â$=ÇÔP +•Ï‹P҆õÇÔ +%e‘L÷…O3%“ÂŽ0ëGŠììFéÿ<Yñ§ÙV,ƨ$ÕŒ$~…qdGIÚ/S#rî®m’”Ïq’¤#a»(!+|žH'Ú£K0/96’àHJ5@Jb§¼5’BEu÷I?Å2æ¥ñ-’æá<ä”QÖdÖÇ`)Š R+Eڇç¢9; ‘za¤öвê‡@bá|H§¥‡ÔâþÈIxH7dŽzºÊvÁ!•ÆA–±åo˜±ˆRÆáwv¦šH,<£ü&;Çb"Րޯ4¤5NKD¤q{ƒ½D¶œ"2 Ô³B¹Eï™GŠ‰ˆÕËz!]/§†Õ\Ó1œ ñ¸ä¹ÿ w\Hó‘1ýéÌø‹Æq-AõqH½D¶º EÞ§„´¼TO«6°£ÒƲøË=Š“eV—øÀ)©ªìƒµ= +Æ÷Ϋ–œi°öƒË-€Òb‰ñÕjT )HòC·‹¨ }™E3Çz•Ä&Hñ5~ Rӑf¶H§ H§?„%.ÌÏq=¤)Uø-0éHK…èàÉN'›²@þJ 𥀔 þ9*ê4xŠX˜©S5@š{¢®"@ªÎèJÖvÛ¹¦€Ð¹Œûè"¼ºF€ÿèT¬üüðì€þÑfÃVøGƒÖG½zÃøÁUË쏶i©+5Ð<Ÿ+ôVß¼Ô©Ã …-¤-[r?š­ JMþ[ßtYü(^ŒL]DÓà",Á¡HChtÔ á:º¼¥p$‹¶÷ÑûÍ£Gî:*ÄP8Œ£‹çQÛè; +½{0‡m[j--1¹yT裈b„®GûDm‚ƒPÁ=f>ÚtÅ‚x••ÈGDZÉ÷ôŒ^$ŒB»s* $£ö÷› +ES Y67²B‹Rv£¡ }“¡2È~Û£!†b.JòèÙq@§Îxò!ÿ”¨×ibš·¦öhü`€i·Ç‘Ï>œG ´UÚu—‘w§)ž ‰é{ÛHý¯•ìs„KÍÖCñèÅ Y:ÊmF7½¤t¦ŽG¼§¥¹°Ìù‹NC‡%Ëâ¼ÔÕÀá;:[S£° mР[ïhL +# pæGO[<4*¯T*(ƒÞ$°7c" w +ˇÚ×Í×íhÝ>jü²Fµtí©ݾ˜®¶ ­6E°wä•Í3í(Æà\8™¢Ü! ÙÑFâZòg!µ/¦‡ŽZ$ø¢Ôƒ€‘gºŽ®‡J<û÷ñZºhe%ðèdK)(-qÖ;: +ºçCå—q§£P f:Ê·ÃH€ºŠè>O‘ø°E0&b[Õéhf ÁeH +Kﮜïråx˜ HÁˆŽ¾ùVÉ9™"tôaÈuQñƒ“:â¦9:Šk¯>G¥â–ónà9Êj +ïЄ}£‡ ›N´piß6G+½¿Ø4Ⱦi1€·´Û7þ•ÙŒ&)£…ƒõ' µr]š]LM‡ì\Û[µP\óÝ DÁ5]£;$$Wû—› ´VÒ8ÊîíGsÀ‰R×´CÌW¬/‡ÜHb¹gáVDµû,ONA +‘ÝGˆy®E¿„j:©®\¾Ã&Dù ;¬éÖ»¯á +|B3 ?W€1fŷѽn⮤§ª¿ý® +?oØt«êr8q»l?ã‚ ¡áôRn¼ç¢òÞ­¯ú‘ëí"Y‚‘ÿöÏéÖ?5X¨ ~ÉNÆÙÑÀn<8ŒÜ#=øö0±Io^¡Üìºñ1iQî…9©YP”Š‹òLñ¯±hÑÁôlRiÑii¤±}$ˆe´º:{¢ fþDtpJèSƒxi‘ó×ïg0•"£qBSů¶ÒDÅ*Œ¯2U*„ 9mP«ÌºìÌD3GŠ¶O˜èÙ6á?ñF'íÚÇޘè@²~f€s…Zž…-A(¨´ñWÛ¤÷s8 h4*K(Y]í,LX‹¬¨;DÈ-…ìŠR¹ H &J–hGÔ̯ÕRO2BS_ n 7à&Å®DÉú±pدàÖzv¼Þ_þ6)ÑF¼šRŠ h↵âÙ®–ì/áò.Ä ªf«/^Ô)M¢]ºZ•Š¨2C¶½ƒZT®Ã˜DÛ´F³Z„<ÇÕz҈¢)‰ZÃՌf|«f/Sn9ÿC’èÉW…S~ÈՀ$JBBq±æ6Ð'GÆW¨y<‚­Bð29þŽņ¾eÒò²3¤û€D30)Û~DÇGqk>¢¤²ÚG +†1BhßÂțà[• ‹ã=ô¯¡¢#R•|KF€É}oGôÇ +ªCÁÓMÅ#à'rDœÍ—Ã-xÊTܛj +$ì?'›W8$¤rGEӒ}ÄËí ÀüáOH¶ëvǐtªdžçQ8À%ô¦HŒ-´ˆ6Ú´l\CÝB”Ñû¨òo&­a‚!S ‹¢Óñi lW"Bõ÷K‘÷å ND±¸×Ùþn+Ï*Üi õ¿ ŠLC Æj<¹‡Ã!“P¯Ãÿ'}\‡hrO×®³¾q!ۆ(”Y·ÉÔÈIMEC4Ï]}†>Ü¡ïæb„v\¡\q‰É‡T,ŒÆ¨I0¢^KDœ› â(DUÛϒú9ýýtx/å-áœ%ŠA’mD¼æ Sb%W4Í¿Êçi{v*¦ю‹˜i…‚@ UãÈó ©E2Í ú7í9¡7¢Â’>WðÔåƒRÕ~¢§f8ÊbÒ´D{\OH©·®Ž z‡r´)‡á1…ÉCÜJw™=áG¿Q"Yu„_8ù§ž4e?Iù¡vp/oà‡ä{÷¡\füLÁY‚ö¡Yh•hQ¹¸ªîÔîk*M‡\‡yˆF>”Fƒø”_ÀŠ÷Zò»ø×@ˆ‡yJÆ=”¥°ŠX\~wQÂÚà3 #¶&Œ*>¥’& '®ð«8„÷ƒÕ){‰­_¿ŒñP±Úë£.a°ƒðPµ(âvùj1jO‰¤¨3%6ƒdŒñ"h‡‚gɦ–þ"Svh=µW·‡¼¼ëPŒþCðþÅÜyúÉ÷¼É¡§B¨ ¥i¢íÛlÚMísŽ½8éÐgüƒZæ«° +Ðø>ÑÁ«`@èPìÆW݊4.òº mÉ¡Ó˜µ@S5ÁjYl2Þ֗¤CEË7(SÓqèÓÚí]„)¬ Í0t\¥9õj\.4+%‹¡»,$O»¿j»ýö:¢ºáPyÿ%J¦`X¼‡¾¯BHm½@–’¥± +|TQ|VC]’O &è†B'È §ç~c74—-=ƒ0£>Õ5¤¡¼u¨Ù´"  ^½ÐPtd_H>ƒ!^Z{;¨¸+ÙЙ@PnFôÐEœÏ"û@¡uå†äږӯ(ž%Ÿ4VØ8 5¿ŠnV\)dêi#ž·ˆ®|¯ÒÐÇ/BF߄4tp,ô˜º5çeòoÐü²ÐÐ%L­é3˜^nY2~õ] ÏPX a§ö\g蠐À!ß´†â—Œû´m†^ÙÄI3Š4\<+Ï`ª€`n$è9dGeReh¥0”ˆkŽã@ÍÅm(hâî¶% ÅLC_:–YCµPÖâþ*‘ mÿt{‹âe:k8@å5D†††© GÊ몡¡ÂýÊ,ÈPTí¨4ÑchSÌü•Qšsá%OôBÓv°;Þhk©òBÅU"§ôšlyq’Yh°Ž5Hy˜ÕŒÑ-$1„2 ­¤'æBsN=ò\¸ äב̫H.âBAMýþ™Q¡~0¸Ð·ÔŒVR‚<}7ﱂŒË-ô”4‹VÆSÚBk6y‰ud è[(ÀÓüg‚^înÿ™ Ô÷”æY¨í۞@5”ÄB©i9[ãç`za¡Ë‘DŽªzNva‘¯Ð:j^aoñ§$”ò +¥ôMxŸ:»ÕÈñpM¨'¶®ÐM¸^žôç‘×0MryɈ\•P©ïoÁ¤U¨†EÙP|ò”h*4˜6P¢ÉS:†‚!+‡ O.$R¡¨Lè¹Å Ps s»q *T¼ð¿è¤8ÛO‰{ ÿ±KhŽ•©{HÜHÏ<…æŸÐJ¡¥Œ8š· «cÀ:u#PÝ;Nª‰¦PˆëJçirž@‘Â;QShÎÏÐ/m)ô¹nuсR(sÏ2´³p¢VRèçÛQØ T)]¹Sƒß¤~Å7mߞŽØ–.P;žÿ"*¥ÈOh;>ËJmzB3Ýâ U²Ë´OɅʎáÙ ¥*ûúi '”ÌùPQ\NG‡¸Yë7yÔpJ‚ñÑ"4¾Š¨UNÉ*¨žM¨¤Ä ýÜB.°©UuTG^-9Bm ¯%T•Éb µè¹•PmëfAž[B¥u/CÂN|Êþö„uGˆ2 …<®0ƒKG%¡;ü%Y]YJ463ë Õ %½ÃVß4•|HB&¢{°êín’šu•tÛµ #´ºg¡À~öB¶½±ÄÖ(vCÜ´”­îmy„J mÐ»uÿT­‚^®­ú=®!J8_qG@ˆC(Øä´z„ŠØ½àsŸÃ¨2 KAh™â‡“Û•Ä… T'µ¸¹æAí‘=è,æ’N-hÝêB[Ø À@³–kDuâ3~ŠŠÈÂs¾6w”€­óöA±±£å%éƒê#”¥Uø  Ü¥¼rP Û3˜˜ô2̓v9lò n‘è²ÈïÀÂRí1ÅY5z)uÐÕÁ ’æS¤ƒ"QKÚX$ ÈÜCíu–±$‡Y*4¢ÌüakJ‚Y +±Ünҗ‹TÝñµpС)ò7þ¾Å9à ‰eù$´Šê"oÐ2¶;²„e¾ÿh>» S÷H£”Peô˜´ÇÝ ÞXj…ɁÙ Þõw.¾Ó÷"}>ø'¬‘¿'‡ Êò…iE¿Ë®A“ue +ùÂ-ŸúW[eÚœü\ÚA|Å J9ƒêJ®TÕBša+ÐG½2h—ÃŽAý+ä¸Ñ7œ+s‹ÁԒžƒJi©1—L[ È +1hþóܧó„„A[GÐo…J–¾`A —²jG2x)À+€A·¹TÚ\Îc¾Êô™Š!§˜M‹Zd²/s­d¬¹”WÌg *GéՂê’r…Ž“ë »Ì‚"ÆdA…Tî;…*¸ˆ Zq”+FAЀWP44³Ä×[¨¢Ž%b„„.Ôâ”/ZÔÔZl4G›)è}%¨ó©'ñì}xE)踲Éí‘Í©3‚ Êp#­r›Òy`T|^Œ\ì0Ýg'€½^òÏ>[©sO9ÛÕð¶tæ*hqHjå4AçlØO zs¦Åsy˜ õã6æͱ•„nÕ ùXž Ô7§Dêêy Ôj8YÚøk­G@‘ô‹o# ÚEÃÅÝAÔ-́Sz­Ý6¨º9‚F'銘ªFP0Ýl֞÷à5 L8ìšMˆÍP%Ú ‚fÅðØA"CUÎ h/ñ‘/܂jàÒüµõl• A…CÈ¥`aìêVK‰á¬°dl~6­¢y ‰fN›R0¬é&4J@=P•Ä聚sQÌþ T@†@"ö%ôezx” '¨LG’§\ +• éÐ51ÖÚ҈ +²{+¡~.@‚_±»(ömx!{[mwg =€ýK2Š@¿Ç(&DF@ Ÿª/PÓÓè§@OxZ8š–ü\_À,DJGBôʂ ^ ¢µ =ñƒwÿ“t.ÐÇe<çê@lø-;©Èµè;jã>Z]‚ ô‹+P!Êr¤‘aÞ*zÉÿ^ñ¬àɊ$j™`Õ¿wb`¯Jh_¸#˜Ó°ÿ» í×õÌ\qõ‚|ès,½õ7V à2Ü-‘ë6 2Õï{Ñc5dyÞßû\hIè嘩Qk^>õ1:ÆBr…«ªáb@WPY~CàvMFúœX{ ´¬¼ÎŽö¼×xä49àꧡ;ÿô€2v*Ó· +b;bÍÊSB97{D:Ô %õ€3 Ð˜ðÁ.Bš @͹As”0éð K Gòßب€¶P,™†²þi“h½jaÒ¸¾ïÿ»ÙezÙ +èU&Γp vZIIT@M'!ĝàV6âI(frÙÔP@³í…g‹Ü>[m +“p²r|f¦L£& @5/ ñ¬ +ÐÔSó jP]“2I?<•þO;óìGm”VÂ}k]ªýõƒ´aŒ°°üÌ©jTV„®÷¡íV¨³˜äǬÿÓ!ë8lU¨—RbÕÕ§-€šâÄaü;íi„΢³cb/È)W^Åý ²¯WˤWÐ#yãRU·ùST%E¤#y‘¢Á$™.)ò·îagšÛ÷®å(\ Ãþçh¶|ÞØ/Bÿ³ªÉïÓB“gBú ¯/ÖÀ ¥&O¿Ý‹÷‰ QЊícyG´Èj¡<þÅ߄Œ39…Ñ_ÜòÑY‘DO!m„‹¹ rîÂ?ê>“ëñY®ÓðþîuKöXƙÄÇóHä…¶–0iÿ„ëð¡£6TdÄ“öçL Ÿœ#µðß +ôϘ~îv&[¸Ç·'Å|KÉ0‹ÅÊ?cÚn‘ ëNA㟋…ÿT‡Çyôÿ²…þÀ ZˆÄâìí²,G·¨“ôÑìûûXçù:*TŸÝÆlëïÅÅJ1VáTÛ,+bT¢úŽbKo°Nþ¸¨?oun’R ðWÄVá‰Ä.'ÇBKáHóûÕígº~ªUÈ*uX ÔË{þì€É¨¢±w?kZ$Θ?¿ÙßZOhçˆVÞg×® ñ%QØÒä Ùá3™ Æ:³ºÏù¤cáUDïSŸZgòôÇ9[쯹Oôìt•°~̍¸O¸ÿU™lR.^¥ÿÖ< ¢CA/¶>mÃdŽ@B³;­µÏ‡ÈÇ%Lnd}žÆ”1­Ïg¶õÔJ£Ò>ST@ûP&ý.QJòÛtô)&gϬÓ20û–˜sÔi~x_”}rfžb‚3UÐ'§0™sVŽ[¶ŸŸ;Àû\yɾGŽÂ>±Øg=ýxŠi‰ËߔS%ð4ã%ó¸·:Àçš×çî;â6%®*â©ðq}âzÉè$å" m}gR¼ä±@Á†++ë3&ÃìBAFNJÑgè”C!-Œ.—Ê ¢>Gs°¨x…šdí鳚›§’ÓçL4ÜqI=!Ê,¶>ù\Jº‡Qpû=òŒ$}22ö٥ǀ£OÌâ°£\]¤¢ÏÀWñ>›>Ÿ¨¨™£D’Âó™üz@=ªÒ(“T#ÒùÔgGéB\k߂=)(U7¸ùÌ`¼êl;UÅl>ñV#¨ù|]ˆLñÈ‡æs +L´?SKò™Êãóà©à`gOZ>½Ó³Àp²i‡•ÏÄx ÷‚ç®*Ÿ/ì i±ÏT9Ä>rñ›GŽ%1ù4*žÐŠ2ì9Œš‰>×‰D>—»O)™½Ÿßç +óIn83cg>m'aYÀ{LùÃøy}&š âIÀ=:€](>ë-—f´'ò`‚÷4Åø, -ʁø´Ô÷…”r;B>Oög‚Û&"|BT zEÃ'X‹ÑuJ­—[øœ›õ,3ਇl >í0ÓDüô |2·ŒÒDR3ýÝó,Qæ‚ÈN†pÌAэÉð{‚±öÎï#KjÑ÷lËÌh«dùÑMR¾g¹›I ¹È|î=÷ꀌcïÙ+Éê=Anf½àúÐôØ)›ÌÀ@TìÜ=¹üT±i[(žÑî™V˜3bÅRøXQpÛ³”¬0~ö\,°î ?V>²‚U¢”õȞ]³B'%ÒQéž0ÆzQžˊa!æܵ‚6Ì=ͨ”«Ô’Y£ÚsnUXç\ª±ÄÜ“Uð³tÈÏv÷&Ò¡'îùáž÷.ä8Mj6J:…4cüì9ÙÛ3Ô} BŽØ¾ì®=7ÅFå9NÒô˓OÉïh͏H\ú5_ZV¯Û®E{V!fߏ¼á¨’={’+7x"Ë‚΄³çù¢<ø¸)[˜ÝE&Äj̞Á¬b-h)˞øc˜²§HíÕ{^OÖê̊{ïæ¸ÃOí¼_'ìÙÑÍ×vÉ8 `϶ÞbC¬vpgÙ~= ©×Ü}uáÝôz¾¯°ÉŠ6Ÿ¯gX¶v=“ø¤ë©Ì­\OÇbp=•kÕè»XOU4`=}0Ýô!»ZÇÄ\©åɝ«gƒ©ÍWcdš¸Ñê)«•“lY8èNÀ…@/ý¦e§ž +(=˜¥ROòYdÀH= ƲÄ"vn1U$gÚb£ž)'c‰2 ‹#QÏo5ÿêy2f^/t‚E¿ç’˜ÐèACde6¹ùô\~°—5|ó:=³ 3GT‡ ^¥E¥'±Îƒ¦&Î Ê@鉿ñç†JP0éi•ß£0{H¨d!~K¹´÷NÏ{4NQ2Aø(|žå½óÏéyŽ›1èĸÄ<÷혴çÀ“çù¬™ÌþɑTî-ÓD ;Ϩ䆏#֠Γ‘§9ü-a.^ÿ‡2l¢É‚; lžè»Kiހ&Xb`͓Õ]VµIŒ}¼ðJš'& +ôL4OéÚe‚¤«Ü.«kfž3J*óÄqp-UÁ|\3í|ր.Ï ´ GE5àü¼Ë»{Œg_¥ÍÑÖ[žÙïÃ÷…綴<ãM} „†¸Äødg'p*ÚMu3Ì!9 Š¯<ôäTžÄLøœ…k­ hò\Øû™ñLœµî–TW¥FIy2—ØÜöâ]ÿV Ïåçô&õ»vð<ÇW(yþ%E5“¬D +rîù›x’@ ÞÔ +AŸ~EvÜô‘ã-ê-É H÷CèˆO(òL±-7ãòîÄÛ+¸¾¯¶L'^£b: ôãi"¥8Yz,Sç|öƒ¹ ç^7áqƒÝíx¢\ IT;RÈÊY겉'Ès€M§s™SöþJ‰Ci©sœÚ5‡@Æs2…Ä‚¨êªϨñ¢lÓKíÔÃC«nf‹¨ÃóÉyR¢ $õ YÔö{¡PñdV:³ü¨¹‹_¹‚ÏãÄ´¯ÙHWO‚‰`ZN¯†Khq¦Ux¦¥jÝ(-̦á‡z´OÃ:=Ï¡'}°pxZB„ ʯ´s#¶(Ê°…ÛðL—Wzɕá¹ÐÚ£_~ª¢aà©êTÝß8êrçÊÂóh' T_„Ú\´FÔ´8«ðw–igtCÌJdØ.œÒ8ÑR*NÏòT!Æ k µãìD'Mß߃iª#ÚìŒR%Îå-‹Úϯi8xš}Œ¦‹ËÚòºì¼«‘Y€à¯M…órSëð‹mÛ9Ñ|ÐÆá“ì(;9#)ÏJ‡2ÿép*„7sä—dí,v¢K;¸š™ùA±êÛº¸ÅF±½#È4 D ¤Eœò¯Stˆ•;¨íTVHÈI3»9'ƒZ T¼ôKÀ<¢7ßY4ŶӾñQÍÁN@V_j1½`>Zt¼·Î;‘–¹4úë í¾gE sUÏîá_mm}P,…¯S¨;$'G‰­óY^ïé$M¯“š³3´-O¦% ¯s~H£B€×™›VÆ7ÓêS¯òD-ëBù¢1ˆë„˜ÃS“fMp§{"¾t\Ԇ.x!DS§ò88dÇNnÿ¾þH‡+‹¡J,>_ƒŸ†y7®Î>kÀxÆ6ºØ:¿É7Z¤ôA”–ewGSël:x¬>"…Û¡–ÖÙ3õ ËcÔÓˤy2øèðI’d˜µ®óŸ2ý(œuf̃’L—¥œ%n¸üª³s<ÈS]"«µMÊ:'û0Ԃpd V„›YÏΠ£cÀ†vP:05q·|'ÇþS´4u‘ÅcpxÞ«ΨÎM묊±G—¯UÈÀ. GèTsÑTEÕšBïwõ*ƒ©N4S ‘É9Õ»‚@Þ¨m׶p,«©$¥ÎíB¸ ÎÑ%uŽ˜•ù¬ÄAêÄ€YêÐ[ŸwШà®j«¸´‘)r©hêÌYÊQaþ†™ÚÔ¬p²9֑©õɞi‚:ûIvÜ`R½´ú€:›KÏçJRµ;8vº€Ù|:—:v» ·<9½£[–ïÍ=ŽÐCT +YH2p_,“”ºW5{ÒîùK<g¶Cdöf{C×fˆ3ö&ZãÈq«_¶‚ÒÕù¢*´ÂÈÍè/dø ™Îœz qÙzÈY‚@€˜NÖ(ðD¨ÖÐ絅xŒ:鏣Sy ”Dž—©yQû¬w°t¢œ$ócB²ˆìÈ •Î±(^RC¦¥C¡t»e* U~÷ï2)/ú¹ÙÉz#䟑êr„:'b” ¿¯úàbW*œwÊO +B0.Ÿ>LIdï”RÖ¯µ™s š™›ãJÇk¸{ï ¼ùxߗ¿ÓÇýNÃxO¤¼gSeÈ4Œ z©Òù¯4U²hé¥#Ó008g¨DC.Ù/]ÌKUh†Z@,4?©â}iØ%Rj¨ðPéCei%a u`ÐA¢QGZj(/1ÔP©T”*òí3󓬩Õj4 < Er£Æc1È D€°-Äfûs€ƒy2Ôáéã »îݏð‡l"&áɧô‚•s.Ú# QŠè”Éw·m·™éQY +¹}Û¦läAUãË2Ðô>:©¢0lÊßëAY? ¸ÈjÂ×ÊíÙ“'㤪Ñ@%+Ñ°fâ²pãRíҝðëꪪªXßM*9’=BSv´eOfSy^^tùô>óՒՕ¸©bº + šJª&h4ÜèòÁBóK?{n1Y1P÷³g¾$’$ØgÐM"4‘IÂVåð/ ( 6C2ˆ ¡,,šÚ¹–OÇÜab×÷ !‘‘ýÖ¿”u99Ì㟓ø®"1Þþž +âÍåãp´ã¬˜(Ø5Ю÷G[¢X´8ÃRpÇé4ìÉm{šjÜÙx^ˆ*κԝõá°×¾§qÕÙpåQF·i®r5äs©B®Ùh^@— ÈÀW?fù?ú¨ÏLXù©Óš5);¤Y_nÂuŸž;LßUçÃ*2?óWŒàâ¹måé}“è1%~ÎDA es\Üٍ Øo%ˆ.ŒësňšƒL¾Ëo™_xñù¨ßö×yXm‰bÚٛ†•á=Xvü!€âNËX/ˆY€CŽê2̼zðd†æ‡“hhBÔaՍ™¸U3àϦ¼+óׄF Y<µ¡H8ÒZréŒC„›.Ä •¨xmqnãðϸ˜·Xƒ&|üžѼG˜'Kžg®h8ÐÁ,ÜIBp-D/ªN×'=áЦ×ÿ³½O +¾ÆF*6ÀTŸJ6¯ /}BÈj¡YÊ=×(‹²/Ãú†TF²ù’jêµM®ûȈ
aº–®®äŠÈ¨$Å5òRŠ/ÂÌH{-ûi=\øTdB/QA›Pðƒö”¿7Äfø£Î%Ê8é2?ü5ÂÚ¡4bhÓé¯#ØÖ$)[‘ÑáÚcªÄIá–Ê3aêú=Y¼rqŠÞoÑí[òj8ÃNWŸºÚaÔ¬† ÷p Ï©á!Ó¨­̼¨™|®ïGD‡úÖ¥C_ÄÔ^~»¯˜„ȨuÿØàe÷rè3zó^~ðç#´rHñ#”ºsúã=]D`¢nÍ~,ê¦A&Ø©‚€V>s'­ßãZ í ;ÇÁN·¶D =Ó/³ÀL +jEsØÔÞ’ö“Yņ‚‹4QJ<‚Ve–]d¼ÌP¿›Ú¶[W6¢ÐÒPBµ1Äb 1ŒfÅ;qn³/Ôç.ó(nO¯ïã˜ÈJñ4¹%Ðìés"Á}e×òðd·ZœÜ!êæځS“hT²ÿHh‚ñDM²½ˆYhӀFY¢b€;ØYÎÂÀ€Noat©çlÖTSTT“Òv¢Ö6Êmú5å)£CêE÷&üÏDFd`…$ðei 1ç1"éc2£ò ¯lî ^boåæ|£'EĐ²ê†´ NÝaÂ"Tl‰6Œ©¼ ¦”p«ý}s¾Œ!±1ó2“Ö½ËfËZeÛn(Нüqí—ú'¡àÀ‚©0‹Ùë&Óé!³èÑ.òpÎ#¢U15'{A!rŸÉ®z +·C"ÎFL±‚æôFô¶ZO71pòfåaË3þŒ|E®‚Ã8r¤4!Q1æLY-z‚{[¾#JؙLM¾â/ÖÃИ…¥ý7Íáž- ,—ˆÁG3Ì8–â˜Å}èKô +)VåVý´¾j!£ÈË{«CLJ§Ž“rCÝ®¥~ƒVrñĨ†@l©×7ƒƒíÔ\îþé¹ä*¢Tؽ>W³8g@·e¸_rE,ÞÓDu F¥™”rq”*F¸(‰‰x¼«=;&Vr㽚ªPר +lƘ‚cËbÅÛ[ ÄÞêÉI'-ŒÿÛ`y=ue\J©ßÚ«’˜!~)9Oƒ€U#3:ÌT–È míà×»EL]‰°¬UCÏuüŒ“Rð¶ÛP±‰£â…‰Ø³™‡ÿ +~®V9ݸ-v:ËgRÐú.ù|íùV¡j𿊁 +C¦&êúðÖ·jc‘žïXÚ ºä?ô@>‡Z¿hóé¯ÒÂöz©ßË7,J¡P*Á Ə“££¢1’g£êJÍä´¢*d³¹áBÞ`TJý +[È öö™½ûœ$á&wkSdÿ3™ÏW¼ÐÚ^ +ÀØô}o!0Ôio!ѝSz­‡Œ‚ˆ`=Iïu¤ž :‘™[œm~f°P…¼ ꌯtbߌµ¾?ÆË¥¹W*¡ÿ D¥²‘ÿˆíù|³z™î=0KŒî„(II…§Ñš·p›PgEho8m5uˆ3eǃR€ZTïãDIÐڔÙۖʮµ(d~ځ¦ÿŠeúIt0“Lñd ߊÈÝwfJ¼@î¡çŠ‰q459WìT6üŠ(_jÚd$ßð#•šX¦¯í&7yÑ‘-ÕZ<¥‹ð$4¸Û«¯É"2:ÀÚìАØ N¶/` +/ +|*ÀÙàe¼Í°èˆLw¡ ŠÎi¦ÝÜ–؍¬m=Vv-°é½ÇÒ§ñGyˆ>}˜îQiý¸–TíEÐˆ£2À‡uG4âꀀMùŽXOÝ<(¿B›t§†ª¹ç³ :àãçC°‘REßF‡Æ\t¼Ü^ªJ½È¥öìSënJ#ŠaG°¢fIb礏@-• ùáŸø–%Øs¢¼žÄFÉâ1þØiÝ?$mSÜB®X'Wh»3¶öfEYL=Ñ åƃÍA\¹eoùãѶÔÞ `épnâghþ•q£?_±#©+ؑãC@]$¡%šõŽ& P¬(»¿Î{%ËùwRÁ  p, >•$Üþm_v¤ó±¨¥ü¿µw$,ôÓÑÞ€$¤ßæÎ3fÄòXùFª%—Ì«ˆç±ªm—$ ‚‚›À8æ;úŠ”À;Çð9==1²¨+ZŒA_Bã?Š×ïgþs9eŸöÜi Ž©ji·#A¶ «ôZԎ;õ;î³_¶gÔ I²V%¥ãÞ$?¸ìj²ömpJÀù.꣹¬šÍëÊ _ÍZ1‚Â[þv +X&ôó}¸ùUÝ}{ªÙ¼RÎSýLâËdL.Ù*Þ åϝò˜—_³¦º$*ÀÀrOãµÈǖÚâ=á2ø-D»4ñî®n×ξ`eœ1w‡…â3þÏ!3UÏàK³ø"¬Ob[±cP9ºIA(#%N°ÔõÎY<jx¥ñYí¢ã[ø0¡Éýp‚³B^¹G½æþ²2N?²E²—ˆ ÍO¬ø{Qò]ɉú¡/xËWD¼V˜GtÐD 70Fà êÖ­gP0QèÓ©ïõ³yÀô(믤˜^O'µdúsž[ZÖ'ÚB˜¯S[LŽê9B§!Ôû©æ¡9y¼@ɧê~Ñ©¾û&E7ۖ ¥ w™Nùa€­ š5‹<«ƒà׋¨å߀€õ›ˆmƈßàv¾JOô„µŒ;è–3Lu×ñé\ª:7Þ'KØ´<ç©Ùeï‰ =zÄt[Q—ä×\¬ÿMC0ŸŒöŸcR9–ãZ  ¢æD’v/Ô Qÿ.}•Lº–;Ž4R¿éöOé¾O$8ÛZýçB–Á/L>ßa¶òYØßîºfâÀ^uš*Šè¿¢h^¹\ßPœ6¨E¿´ÁšN¯–³L–”í¾cÉkXç"¸FŽni#gH@ó!{¿{Z¨»™nÑüÚµð…§g=™sêi'Š2¦Qø®Ñ¤T½C…JËФR>¢ÒcjÀƒ‚«Í8u1\–p¥1F³Ãm£åòsWZ° “OKæj²™ÏÝÜù#"fB'+$"è#g;É™5Àí”ù_„L(R£¨ªH:y½UâmêƒB”vé³á-ñ2»|Œ¤jcR'ô;E´ª¯˜å ÿfÆëBZmPÀÃJÝ ŠS^JnA¦l 3£z@767[ÉD +qÁ]tÇž;„;ö»K¦Kä8„^Alh¼•í-À:9'·X3J^Ù¤å'ygÌ=ĒŽb²‡m©˜Ç%wú¶†xE‹·EA,}bJ&¨2”€G¯: × d5ÔáxÃýmQì8H(es úÇí^6žÉ¨ý'ïŎCÀ¨îŠnfod,*‹("•ø'×Cò†8 `Ì(£îE,³‰Š®J_aҋw,ºZßyù…W9L‰†¹2¢cç%ÂS)¢PÝõâJßg*\|/7R06÷ÒAŸɉlwK—»­Œìš_g_—ÔgÐi/Ϙ.A¥O´\ò J¥?ÌK¯hhé³AŒeLÎeb‘œ_q +"óÁ4jÁþ@Hƒ©ñæ1ÉüÉ[/2g*çŒú¬––ˆfLïÈc–‘šç’2À¥lV288lµ‡Œ‰Jç›2ÆGìþÅ°FȆēÃ`«ÄÅb1Åk ‚ˤÔ1Ý1Ù2c±j%Fdò9]ðQð…\lGüÀEw£Džª` S‘À¥µ¯p´fZp³Ð`håW‚¦¶eРÌC‘Èêã·Ñðó9ò'ó +¿7þqr…ùU¥ÖŠ½¡Ö…±BxF'í¬‚B‹CTg©¤‚vžYôZv2W}ä¾¼Š\ F珏K€ë¿èÄ‚ÿ³ØùúlAùeˆ™Ô‰£Te¿I{ª€õ¨‹‘€Z`·‚bÿ)¥ƒô‡•)ª< Gìª J‡hQHAvQ‹¬Yº€àØKÞñ Q‰ð"H¾5ÉXn{"礜0Äצ1BV·‘fSöõSÄ3S‡DxÌq쵇Á³ßk|¯Á,ƒPZu }yÌZxr¿Åqru^Ä`/ßßáL¿CæíYÉé`׏\žŸ„„!&¨lÓ%ÒHœ ä/×a/G{)¡9>ÎˆÑ¨ð˜Ã§Õ©Æ¨»ðFŒ“b†…j/±ñªâ¤ïæڑS^Äö=&ʬã3?éî¬ùrÍCÍð±1ÿ1˜E<ÌVûғǍ¥æ2ÇÐi>N<ÜL¥Ç¡H ŠaAV?ÖÝ9-Žh'Ê )¤gÐNTÿ%Ç>övÇqÔÞIå/ÜÃG¯Ï/êVBqݓkƒˑ U/` A͹JÁòOb‹óJ±ÜÛqñeîÔyëÜΏ’c¸Þá+6]<õ€Š ißLb뻈œ$¬ï’(°Ó“à ö1½Néíо3u”Un6b¤4=¸;aBBÂS؝Œ©) {&H(x€qÉF-ÔYm6#UÞç$‡öÁbº¥– L 3ù(*7#™m}¬œ÷ ùŽœ—d‡¤Õô\â K8õ@°z/yëdøËkCfe% : ã{bM¬¢@3›R÷b,l Ä{td¾<ð¦Aÿ5y†‚–óÐl-XúŽÙƒËp R%ß0Cl’2ÌÅ 8©=>\Ši%š2÷Œ:f$bª½!^tüfÙÍ0į/ksîøû¦ÑECÚI™"ßäÚ cxEqv‹’Šm @(  u}¡_:b4òíÒ0¨¯NÖ.†°ª¥ñQô–ÌdÄG€+ŒÄŒ…ŽäL3¨-çàšCÍÎOd’"Òj¬ÞP¹³}ÌM*Uýë®'/õ±ÀNc¤ÂH®ìb¤ºH–˜TaÒ©¸õ¬c{°hRxêÁ+XÔœ%¼ª´åa–®Ê|Žu«¨Úݱ×|§!py‡zÞ Zâ‹\ñ& NÑ«¼÷€Œ¶l*œõbeàŽÑ¤—ßßG2ÃÛ+ëøí¥ërŽë‰ZuÚ»m,Í_•Z–Ø¥âÚ¬`_ºe{#ÉuÁ_#wULF´àPar;"z©Ç‚®(oB˜g÷[ ‹6¢ü·±•Œ[ ¹ò1ªÒ(l¡±Âf³*)«lFïÇÏ6²!× +¿Joøk«ÍÞʯ1Ë»š' ÒÖ Ç×Ø£•Ú^ãO%J36x‰°´Ë–× +1 +¸)áµÛqÎ]sÝJZj-ÃÄɱ¦5”F‘ö¨„:…”"SI|‰”=ÓjkÿO6ÀÖ,êÖZóՑQk.8¡HkŽ4I=2Œúœ5õ¼k·ìÂ1[Íæ«q|)abøjE½9*Xt5┳z’搱G'«ùeD[¿R 'æøÝ‡*×s“ùb¦mÖ"ь4ÙÎ*@(³@nr™’Ýdÿ%sáM:âªöÔ¬hþ&§Æb³jjÜÈÃj15m'Ç]lñÃR#­òfJ4,ûάIjÄFR‹ç討ÚÝÅ%‚Q»Î½ŠsÚµ5vhcn¨1~ã)*ƒP»ß·"VêâlÍ#¦™l§ÙÏÃ5wM¶ A;=è4C÷’…lœVöFpZõ§C릱€Ï< k„OÒh‰v ßIÅԙ‹³ s¸ÃJN}¡ç°´vÔJ³‘èT¯Ë8ÚÙs!S8V´&ÎCŒ¤Ù1g;FñnF’õ-–#…4¶I€´t­†Ôú )–—šQ:šUýž­Ñ?FÇÑ.O¬¬v‹bß4ÚQõ‚ÊhTpÒË¡&l…°0Û²%˜•.¢ñbAÒTD!â¡)ºŸ=aÊYP¬Ýç¤`§!Ë8´€82*t:2ª3Êír‚oH¡÷2´„‰T­NbQE<vœQœ$@¥9ÙÇ´V¼ˆ ‘#£F¾‚RhñÿC žöh\¤_+§`ø3§ÄÚ¯÷¤Ã+2+âŒž›¼,4uˆR<“jçð,Úuº +´¦·„xgÌÔ­ Ê®}wVŠ푬4!º0I®Sv“H›;Í4J Œ¦ŒX@äLys~gÚ9óÙiEû/þe1æ²d3©¤Và¾;²qòfìKyt3F`ß »Wºd›Uê ÐfvˆTuj˜¦YQZ…$K(š;†§›Éžø¨kfn5W13õªÃ•K-@_NaL¡2ã²[H¥Ì8nKY]kë)™1ząˆÒoÃi„Ù݉³©°¿õ̔[Þ/;¢ QwSÒ睓g¡Q3»ŒÄì2þ)—Òeª*Îir10N=KÉ>q°ÍYa¶LõL¨–„A´Œ Y¦™eTzÏbÞ|虍XöQÐË[ÉóʔûSW ƒY*ÓyéTFëŸ>¬ùˆSF¥Î geÊìú©UY©"úÔÎ(cƒ2•0Fþ­uê†Y^®H +P @T±Œb°žT«x1bç€(Ɗ¹½­J›b¦˜û‚cãM9x¡7E1õ«¤‚bª¢TZA>7ÄK]o^äJ%‰¯b@bn…G쾩¦ŒØõáõèàÏ(EŒM "V‘s¯ër<¥ñTL“øÄwaâäb]̆bB1º÷ë<£ãÃH)äÖÃb-aóèÈì°Ë/:L9vH•tõ2óâ)X&Ãú'Pãu°ºr¹õ,‡Š ;ôÝpÐ°!6®æ#€t1Âƒ2¦.@Aft/4ÚÍ)¾FŽP(,3­÷§u HBÝöOhPÂTT9"aÊ\A¬×(sVª=ϳÒ|‰0b óÂîU;vŸ””}°+ Žã¢ÒW7s"Mù)R—g ˜†Áú¤¸„ ¦Á·©I,Ùª`Ç«†ÓÆÑÐa²Œ!AE4ñãíWÖâöÐ>z&Q`Ñ׊«vTs‘a°é¬$0—t ‹2Ä9`™iI XYvц5 «AÔ±³¯°nžßA+7 9 $˜e_)“áLù-ô/];•;Ú ‘{ö%ÆÙ/å +ŸL«_×ꋎ~± ¸˜Š—%ñ%FKa£“.¶uµ³ù2YôµY·!º{_˜Wÿoî‹T¥ÈÚY“«c_w(cÖí¦èD}¹Ö2ô.d…ˆk%ËᏬ|ÝZ¹ù"Á«@’‰é0¾î/­j¹y×ÅÎ?D|qgƅ¯Ô¬D¾”å`Uø^­ÕÞÌ{1;»®îÅypaâ^'”X¡sA-„ö"¾Rç²õ{ýѧëåOìwÜä(½“ÿT½HYŠŒz‘:Eþ3 Ӌ(K\H/ÊԁNç!öŠœ=r´3ˑà14*ê*€ä¥úªû—Z0@@9Q âxÝØâB +Ûc‘ +¶© © Ø*°ÇCxqÞ}iø$ýâ§\` Dr¹À+v#d Á)³(E¿K¥ïîI‹ä»MºÞ¤*Æñ®+¡˜°»îu‡>òèGtÉ—L^ûÑMž2™ìÉ®Æà´Ø¥yò_°‹JdHZpn,¥î-ȼ,&Âx{&u±˜u$ÔE£¼0›¢«Óu‹ÒÇt‘wX„‹¥¥Ã‘6¿èh=6ND×M°*9 ]§ºÈk~} ÄÆ|ÁªÂg]²¿UÌ*Ô<’ךPe‰õðؚÜ?£÷oJƒ‚})îîx¿×臘y\Î%‘cćKBÖ2妪é>µY¢5oB­ÿW.êA–wK¡Ÿ‡ðã+çËâcHÑ9ì((ÛsUéyÒmóÍò£:íy×I°hÜDÃß"'á_Ê z²’Y噄’àyN?Õ`‚÷bã»3@½'/Ø}ÃØzè~›!2oCGoÂid$®ö§©4‡gP„®V~us¬oãß?Ï9“M&ªŽAòóv düùœ$<0‹é‰0Sè!n BžƒÁxjoщ ¾ìÂ-À„Ù÷©-¨ú6¹3wÍïß¾’¾ïÉ/¢FÖ½Cn—‰è”ýÛdO¹.š:W Ô$«¨ë‚‘¹‘˜e*)Ú Ð݈…¡A ÀŸ:2×M[Ö9ä•$õ“õMÖ3=+ûL¡4y\?җLjh6έJKdž<Ì‘Z÷ (ê²9JE³ïVþ8#Kª´ð A|xŸœOô”©y†¶œ /s¸Ma5T©{4‚dKÙ²ÿ›9ñ2Þ½JZ,—|]³|&ŠŠìÜ°[–º‰ä%: +¹% ˜VÆ 4dŠ}µ|ë@âŽï¹E"µ¦”iCc2֌ŠŠŸ%¦á±1Ã#¡.€ÄL2“e&SÌÌÉ¥‡]0×½1lÁÝלMlY…;Ì$ãàîI·éD¥VôUH¶è~ñTÞ«¢Õ^S¥qb‰ ÇCÞlÖ ›ôQÿºþ’TCL~û†F(ŚŸ T±Žûota]·RzÅJ\S¦^(qí¾æ‚¾—Gæð¤9¢Ïvî[„fç2©°¥¤2bà¢ó׬{‚¶HPVÚ.ÂãVÃwNEFjÌIF9½‹k(H5^8eâ£à¿œé>r_áH÷yœì£º)[­Èoé îÆñf4,Y9#Gæ{­B£Ô™:kˆ(;ï…HŠEØzM÷Đ"¯çÛ<¦r©¼#|u#J™ H÷ªEyߔ÷·¨èmµ°H¥¼6”ÕÐxµª[ ¯÷ÊÃfb”‘âè •ãæüŸÖT/jÁ%•zûŽo*èpmHP8G³{¼ÚQ’ËÅc§•@GY¢jß:0tTU1üQŠöžLÒ߈ØQªäGƒ˜~´Dð’„Ìõl»Ï[ʆÂðå^»Yj<+Uï›Ýå&«Pªì²f‰C©@œO d{vê¢P>¾ôX€Ì lۍЌ"Чnª£%]ÝmìŽ@À±Ëï®Ö›þZ5šT×óT‹V»"5l qbÅt°ðár6Š|²â¨ñ|ˆg„èà$²Ã•Ñ„•ÎvÓ‘U—Š³wè[Æ&sñn>Z=Ös¨ÜĽ˜]ÂJ0Åf¾]ÀHBHœ÷ðRhkùIlý¸e`•EkxÈTˆcªÄJÓA‰ÙE$Á2=%ÃJ!%sÌ¿Ôy@¢Qvš^¡T`ð·„QJ}ÜÈ{€ƒà7wSúaõë=†ð/K¢ëÐRÞNqp‡Z÷F»ÄAѧKÃl0˚µ ¡ñüÁŒÅ3ü“îXÔJÅ8àûƒRàÁ¡ÈקƒÓá×?¦¢¶xIR–¡Ï’hOÂ>UdáA#(thÚ±jê‚ʐ±©`rA w/2cäýì´³A„Ç~Œùogë s/Zmà\Uc+j·R'6º:°¥T˜OcgŽÖK@^ÃXg,qmû•¹Èc”,ïWŒ¸¡ÕS #¤œ±M]HWÅÚ'‘QoâM`  <æBeãœeµr‚9 Ÿc3…ÎLý‡èáT»%Cjü™úfwbrÕnLÆ>9ä{\Lƒ•¡×…/lhDÉD¹ÖEàݺ·u¯}êÒéô‹J™Z ėŠo§>íQ”Vá&‰ry¡A\ÉV$z¶R\Ó{+Â×þWGZtgÁ”¤eñP¡7pÛ6ßèÑ)¸ÖH +UÞ_ FøLI?‹x0-ÁêÉVԊŒ}(Òµ +Ò#Ò=À€é¨oф0À´ÂrÈ3‡0§m/ŸTæd•ÒĔïÖ2Ô%i¦%„5SÍ õÒpÙÁ›Ibè@b.©mY3v²p¤ò•®þ© ögGÈØ2-¼ +50›²ÆÓ3'’©0…y ­Õ6ËIãÅfâÁ1õR‚€ëµ2µvïWB3,ÀQqyâ¢È¡¯q¢ZWâdho³ýKƗŒM™ ŽÌ@M‡®äý ôS©!MšHÙCŽï“8’ÒíùuÐ_PgiÓ{X¤9$÷÷… »0üñ¨Ä°¤­SÝ·Ÿ*NÿÈHSÔUAë€û…m%!8Òõ?ÔÔ/À–p©®c;í0‡“¸é¤RƒlÈøC‰ßœ’qéuê á*„³„;B†;ÕáLÄ!Ëù4" n|ڊ֣΍k c- …³,捧–kòqu6˜æ´«½PuHÎ- +´C9“}Ì´9VÀO/–hxn1 ‡ +)hðÈÔ½} ´tfãÓQ=á3äÑ|–‚‘u@!é6d.§ª6á:£DÀœ%ÿ+¦lÈ}ì‹NAÅÈÁlhz„g£rGI[:ÆëöSô0ٕxvv7~ôä¶œ>¤ÏOG¬ÐYF³Qß½üœçì%·|L/¸­"ã5ƒ±1u cr 7“~"›ÇŸÝ[;Á¬rDá(gáG3"è£\—D顜kÉyQ' +‚‰:ÀZõą“T‘52ˆØCMÕIm¾ ˜“w°ákg*3؟֤¾Wù€ +!ú„‹z”câü§Üc¸t˜ ûï¡´QFÖл˜æÌ/!ݜÌF¥¢“ai‡kõ’« xûKº¦®«ïemœÎ›`F>+1H¥óB\Ói:­í<¡ž ê> í|‰H"§Â'µ?ECà¼Ø]ÌX‘R¢¨ì[@ÔAJ•Ú¿s|“’µ¼¦+H| +Ž­eVôFV™à®RàÍÒø±©œ’òï?úò¹èõƓ>gF•°`Ð9ä ®)ҟ­o ˨\[—'b0ø«ˆ „Óƒm™(ð—'Ö'°€ÚxÃ2¿ЊX; 77$Ó–:¤atÃ[فM¨ÐAÊsh¾šâK¸¦îYM$Pab…'oëþB¶;òÏ÷'Uë3Ûz'ÂèW°6>],Ëp²„4éùÊF3⿕î@G|.Èõµ†“d…¬ÁXY7…³8A§ Y¨i^"a¹ +öeP¶-¥˜ÀL J)*ÎE¤Þ2ö‹Úµ—äYlìŒüç!h4'bübƒµvcs7K¹‰Ã3ßwbìrþís¥ÂŒ Š>ÃÞXø–^ÁFš>žÛ8Å+–H¹h’ü]"tB‰›"UNçϜ•“‚20šY’%ë/Ù⧓ sáFM@¯øtè,Hy„Àñ±r<©©æ$8ÐÊ! gük£GŠ„½È åŚ»W;œO‰–8ã‹"s"{Ö+êµ~‘¶¹³í2Wiˆ&qæVC£vÔcš%“ð–[Š›9séTf©æ+ùf¦\Óc­R¦’›ŽÅP·¤îÊB#ò³À‹Ðÿ=W‹õY‡p½ƒÿrÜöq#VïËýŒýfHߙuq]ÒúÊ~Š™¥!Iä:À(}þŠJ¸³k2™æb&oñqäïçk.l€™qhÛ6%]z`äJTJ ¯ñJAºä‹^Qpµ +QÒ :Rè>#T;Jš–ÑYªÃh•ä€“‡žóvš.›SœßI;.Aá¶tbüJv9ÅX£‚‘Ðh3qZO€•¸7±ªyñêTň\T×ÕR֍ÆK됴Üæ×LµAzÔ½A7q¾˜Ÿ³è±Ï5)ñ'•~kÁr‘9‘ÏÐß«ÉìÄÖÓy©ôê;ÓE¹Ãy9¥Úúg0ú™‰üœ³ôUïr¥1BªÊcwjKA‡é€ûÆÚÝ×Pm·H>ã zöù<®·E‡†n™Á€m¹dkÑ½«s…uTwÐPÀ„^½ó–¶ dG +š[®,€ñxÖu_O%rŠ,×AŸüéë…ö´ÓÞØÜ"ƒÂbTö{·ÌÚ/(âDyøÈ×`Ó:³SÄ.Ǧl¾øHBQÝ Í °0ŠŒ‹wxÃx'ÀÙø'u£±BðéÚòQ™F@» aX¹DWXLz:¯ÉÇG:ÃsZ`‡? ÑÝv4ÌùçtIµ™7 *Hž”ÆøŒBŠ¦*}"$kK[ùö®1‚Ô¦r-¯>9/q²jd¸z<ã„]œyúhïÙØ©ïã!ZÅE,B+5}¶o¼Œ*ÏX³x±T§ ÔQŠ@m(òVn‡µI=¾:ªù™Jâ5RظBC¾~oôÐ,ep®ƒdåá%EðÃж;yG:²á€Í€ýuöø Ó/f¾ÊZp·%ƒP®ö|•º»ÉOãiêéçûÌB(ó/àкIOô%æx,l3Î7î%Ð3OP®äۍ>)Ïu+yêT8üѶïÑv*øšƒ5Âò݊¢«ê@ÀÎùŽ¨/0:Ð{: °ò +ó5s(¯æ lTƎBF+ê»(c_J= +º¢éu»rû ""\¶í¡®90ÙÝp û‹*iíÙlzp8G%×ÅkÛ=°ØŒ¸z¡Ô +›—ppEîRŠš~Þ)ph•q_¡lԏš +è^¾ÈYæÜÉ[I‘§(/(w@2õÒěÌ÷>Õ Õ»¢Œ-CӋ©@ø$›QÛ䄔V|ÿÌš˜HÉÁUŠ¼¢•þ%ðj²ìŸ­ïÀ¦ô™µ1!è΋Tê ª)~¦$õ/(„üé²"#‹Úàˆþž?MŽêRDõçö Z\ùžmoñï ã­F¡ï»FËðZY}þðHâãt6ek›#à÷ûF1½ ø”z"H'' bɧ[àˆ'¯2„ • ðP{W¿™¯‚ʉz×#gIÀé¸ÐO7÷½kähR‡Ê ìhø2¸6ÿ' 4J”÷¤KϘICµCäYŸ +8ÌÀ­æ>LB¹ !äM §¸æ2nG¤1˜gN­%Øî£åV?N¦br/n[¨›»úOÊ5cÊÅQä(ʞÇŽ`AÿÂ鑮É0$O6 4šºÆˆIôk/•¼-G>¤§:¡ÿ6OKÿÖ«rP2ɈF<'¿¤.1š-({ +ݖ%aæu=µÓÍ]-Ëü<¾RFَÄŽÝaÀofT_á: èrD@’*Í@êÇY5¸â8J†8TbÀÇU;…¯0ޙÙ*ø½ïµtÍçÚTX÷Dh)¿E¢RŠêŽOӘRqêbN#vFSQ}g˜¹¢¿P\ÊôE–ま¡³@›"‘®$)–ƒšƒ‘C>0nõø/‹àh-•ó¢glå'± –ÅÀAÜ+?ó‘°Þ€²¹]eZDžÖùÓх+:€– +c Hf–èÏÔ,†æ‘ùJLøºÖG’‰™S¥,e¢Û˜ššþX´ Çj’˜¤InV‚ÝGpp³Q–K‘™Àûëý)'u]2ãáe{"iñ|Gi KæT±“-æTCFm4q­½ñDI[­àÛPý&:C5ÖÆYôÃÂ)œñS$Ä9’)á·ø)+³Å*ÆD–Ç%;Xö‡€Ë–ÕËäWuÿéX±âtt +v’üÐ^-ş¶l½Z +™%@p³æ›x!•Ûm³²ûo=›óœ¡†i³²95™Ò?)›õ¦Ž$8¶Õé$¬±ÌÆÙôI"„3’B4k +HI¯Í×3ëÐ rf%Ì£>™¹ ™uáěiJøüܜ”Y@™•õ/‰ EǸú%³ò¥3:h˜Z©Õ¿M2î‹QV*f•Ï€“ŒK©bVÿ&Mà#Ë0+'¥¬@†–JÚÝtmSûíUÈÿ±f-9K_œ§#M›Â1°fe% 0àÅSSËåË*~ø ‘ih¾Ä|Ù Z㯳ÙbׅZV碑¡tР뀖õZaÀW¾v%3,ë^ª˜Ïµþ—vbYyÍEbØO¯¬ücäŒQûšÔÊ +Vîʆ¹â'üÇ®á.ˆ@5‡˜“DPÊú +ó +ç>z€j^4( ²¾\ÚA <|­`êyº êcp“ÛB>Ž1.’51 ‚ay²ÆU›2½»ú ŸLX¸$*òG>¬¬ .ð—Oäî#’Ìk“õ 3Ì"!´u£¾*â76R¯=\‚n&Yóð'ÉZ±wدíè[âˆiOJÞgŽ#kØÖj™Û 뷂ETy¬ÿ,ða§µìSÒaú"-êš'Ž!k=cïŠÓ©NóºÌXdŸËíkêõÃ%ȍœƒÀ„­´™Pl¶#L3NÒ»É@S©"ô±¾vŠ # ’Ãì±Ò^·0,rÖÙz¬yosȽì/`… +7 ë f + ´íÃcý‹œ›™Ä'êñ·ìXу„ïÏQãƒÐî‰ëq~u¬÷ˆâ-vÕ¯(ŽeV6ñõ§ÔG 5lf… [TùTÑbÅ¡mÃZ– ÖÅÊÆ–Sꠙ±6¾Íœ\¬˜ŠÒ•±ÆÚèBì]2VÕ©fü&1ÊÊFÅ:”]»ãQ“êbPXø&N!p±šf#>ýԆ2×¶ÉQŸÀ ¶X­»Ë‡¾²‚-ÖLѯÁ¦/gÜ"$V…Û5¸.‹:,VÓa¿«ûl„Ò ‰ dÅʪà:žpIX«½ Ãx ˜¯-b]Hؘ‡SJ"ˆL±~D/=rÏ° ¬_ e†uð›³ð}he‹bM!_A +(ÖÂõž»ùÔ~ÌÔf~ue¤¬pí¾„>Ëp^mt89bÍòJ¨o*1#¬~,ÃЭÅ]~c|þH]e´a… ³»ÉpÕ³8k;V}¶ªÙeW‰ÖycpºåêßÁÔP.¨ñ°m!6w#ÍP=…u’$–½„¤´YëK[ì lÄÞK؆ˆ0óþJºa%ÿbÞq?lX³cSŸ€/3ëC¦†ÕÐlõO/ÿ‹%¬S¡`SeôŒ0Кhî€,ø‡>VBA¨QT§k~*¬Œ5Ð,›ÓÀëƒV²­)­šŸÁÁ@‘°*BN ÑÒô‹Ä°ºDêܱƘ.¦«1Fqb¹’`•%€màßòëÌ'„õ©/qƒÜ×auV–býÍüP ôW“a¢IGÖREF±+çÏ4XÅ=¹ºU¡î‹bº©ú“é½è’`%ÉÆ¥˜1)r!ÐåZå1D°2©œ*Y"ƒ„B’J0˜Dʹ3`ºú¾ÝئVÛ=ìú3`¿úÆ{™^]£Vª)EÀº±´¶S-n¦V[*Ææ5Ùæp‡ÞÌ»+S„ÙØ_%{,•.xº’þ*“£šÕyəK +ù«œ¹“)(±þ*k"6ýØ-Vfp.S1¯bxVýÀßæWËà̼ )4à3ò«GµBÚÁ9n´ï‚øUŽ|›\) ­NS k¾T7ì$v¦n†Pf‚Êj$‚>ßl¿ôÕ©”3Àfú*û>–ÿXs¼^ç«t+ݏ“ÊóUÆ-E[½Ú‚¼iœ¡T‹T¾jÇZÓéÙ´š[7(6äÕ£ûðÆW7³ø“¯è$_eÂRŒ®e@ª:…¯Žì|•Dñ¯poRzÕȱS¾WŸ¥¾¨óU÷*)ªÜìç>eºWéD¢ÁºÔ¤4‰ÇzõuíÉüã_§ÔT¯² µgÔÒ/pŸ6›ì*§ ºCqkÓ«?-!ÂêiËE§}ýuU|=ö>KÑ«2ÀX;Ž¢qÚp|°"¶žW¦= ùþ{„ýzºáó꼞6ØÀ>Ôrc}‹5×UšhϧኀEa^5WÔ +2tK8Tµ5¼[…«E›?¼½‰¤¼º2`þoHÕK^Eøȴԁ&-ȹ…˜É2~¿çè’ xµŠÅ—ßՁ%ôÎ ñ~Çà‰ö µ:@ÉÓFëêH=òœ„ *y^‹æh SÒè.Aî*4Kû<“Òµwu×>×È«Ûí*KyÃv5Þ<¯ªŒ”Ú=íª®<7¢j?Z{˜(|G „\u4"° ^p—bdWGþndАê+:Ok‰*Ám¼¥KY]Ïތ‰lƒôºÒnzËU:±ì¥xÜ+í¸uAï/*!ÇñP§«z—×ùáåMëÔdp5ž:çM ÂÆécàªL(.í]õîÖ +DWõmT2Øâ@WSÀ¨Æ‹à¹úÁ9±HÅðÉ°°Ï(¬Å¤Kôc¸\½&ÿ¡ÞVu4T®’ÿ¸îH`:|@¹jl•‘Eï²ô…8[ø!CNû­bùÈÀ`fª…ÒèZVãÈçãkeäŽqU~¢žYÙÇ-¡¸Ê3 'D(\Ý>•ò욟†Eĸ?kÜú¯ü܍&¸šýÁ?Օ¬û#^¸z@ÙV›º UàN‰mƒ@–Ö*ÁŒ³qÓ$lÝ\­:fjz`ÛOÕ*­×TŽÁ’ëåSÍは!§#P­Î +ïFg¦Z-KÇ~ýœËئÀ/F5ãõüæËqè3¦·• >v)éÌ9Z}€pÁpH`"ó¸Æl½Týˆ° +­>{6‚<ô©ĬúDQA´ZVàЧ0ÜC«æÄÔa´hù:ôæ”;9}¿¥YZ0!x ptEs«2TƒÑ-ç†ì6ê&:\ÓՑyrS°$Y7«_a~J™}CÍAªdu¯]J)ßVþl«Y|¢ø;vÄò_’)É9¹Gì‰w9€À†nw• ºŽ¼¬ZãˆM×±ÁŽLžà}Tr¸=‹dêj9î‚\˪ë¤Aƒªaômñš~(óúü¥…ï?¥`Ô0V»83T[äŠ÷W²Zë`pôËK"ï¡2²˜o‰ðn°¤'²*0 LêPYx%Õnáý«rncüJ„[Õ7 €¬jÏ_LpDsF¡ñXÍ]-¾'Þ°f¦ã|k‰C¬ŒT¥ÈÁº¥&Ä©Hs¦¶…~ö†U‰ÍîNÖ©ۉr¢bíHDŽÛ˜Xµ–<ÑKAÀqឝû½¬¤²H¬j ¬34šV36BôÿQ=jïYeJ«­ÝV]í¨kC=Üʍ‰a•Ÿ}!K- ú-…UñP+‘5½¹Ðʑ–<‰+¨ðç*pXM4§b•qEÍk¤DýÄ¿j4f~U Õ´çÊ°¯j3˜h<íü¦¯ªyXšÇN ùªÕÑAÃÕiy`~5W­a ü€ô"«ÇŠ ‡U4/á1õE^ûª3»%,F¥þ`øsWE=rØ*é.q°«5ƒº’ñ”Ž×ÔU­cÞüLDº*¿ó?=R,O´é¡ÀÑáó”ÛŽ!ÌæGgeyxsUÇ*ãz`»¾ºRy«&!8ñZé£õ¦[•Y\¿µúdüTµ‘L&‰Œ[õ9 +Ζ[’mÕ÷ÁôðQf¯±£;” ƒ<1Bó›äte—]µêÄllò6õŸ¨U ¾o²~{íg®TH«2äQ8è l$È ×rU ßû1Ü×~ÁLð¬ +×û}Iðd>Y%4ªYU¼4¸Ô:Å0ul„YõÑ(ã,« +eü¹%•N(ybﶞy™œ^[Î}/ÿ «²žé¥!ÎՄŠ´Aˆ¬úÜ2tUuM§ƒÙ‚ˆ-¥JˆŸØxR ¯]Uûœ*ø[I"DZD@¹ªÆSÍÝà|Ššä¢é­„‰?\U‰NΑ9PÆ£‘`-õÜ!nlU§_`9Uü甪J bcmâPŒÅW« ">G«:Ž2ñgÂööÀ;V⡤Ô$Ã'r/%Y«jØ*iVLo4¬ªÉ¸æ‰ ‚ +榥¦ª›‹`”¶ZŠ@UÕèú ×? UޕĻ>T5 pô¼zùTêPUm‡PÍA à Ù@¦ª`‘cõLLò«*UÅçQB}q$vAô ªÞ½a‘T¨\c6ªªûo|vÜ6Í.ÔR>Ã%ªÊ«#@Ĕýá`äwA°VõDªú¼g×âHö©J@0`$»9åPˆsº¤I}žkÚÀiÃTåDˆ}uŠª¢L¥ƒ”±Ë;™DÂÙMJ¨[ß@U=uwä-‚_lEªòꐪñ‹ M#:tQˆ×äS}'Ùëw‘0‹QU'Óu˜Š'XåCÙLšZ²€>[†+­ +øÀ—C'SW„ªõãß êJ £|êõC3U×j‡ô¡ƒº:YÙ”¾©Nˆ¾5 ê,HŸê®?´‚¥³FÒUNo ì÷àçcjyª CZ’‹¥~¦zK‹EM•zžû‚$“IjÙ©]ó_öc÷\Ö֙éeºïß EpIªxJLt×lÀ$Ì©š()ß'sÊNN•ŸÙsn>v£ò@b0 Ðñî±Ì¶¶lSŒOö¦¦joyÊ«/±ÜyrYCR¦Nhª"{åLÕIÖ¡|?fªÿÚå aY +ÊTÇ^Ô4—@‘ÏŠ`$2² b„LcªI“û¬¡q…ûdGL•dFçfÔz43ªHÝ +£˜¬2³"«”:ªÞ•vYªü÷a Tõ­t=ö¨Œ_?rWªÕ½œ=†_£a¨‚o1îñÑXì_cëc惉{Be2WìÇ쪬£ùÂc8ÆõªÏê1àSAU«]Ò¨[*ð’LíZ7,}(¼¦Råôsh0åøgP:8-¡o‰²¯†3På°À½C¿0#¨‚ojºIMtjù&ž*16¼Pt2÷=5):½õNý²&’Dòk7Õ2 +ˆ%Èýׯ§ü­ü‚þ© CÉýY„‡† i–|™Çž§TbdÊS•$cO°ÖŠÛ¥êSÜôúT«ZP¯Å§BFhe ¥$^5°fú­N>•lF ÔCéEQ†X@>5gŸHǑƒ0ÄyÜ©”ôàtòjÊOÚ% o¾S™EJóÊæT͝— ¹ÿܩź»éGDÕ;à$ܶZ¨D¸_ü¡NՄœ9è©0 +ššîÌØŽ +éT¦Ä´ˆNõß¿Y¨ŸôÄ|˜µÚ®Qc¡—_s%züwœ è¦R5i3=á¦"#FpMh0ù:N½©ÙÀ%š2NåÂ=³âT8F²4雅z×ô½©; ` ¿Ì÷ō7âƒùoB°»—b7vÂ|-3äqUYԈÀmÅò܄²M…“Gmªà¶¢M¥Û¦fS—‚˜¡V6¢ØÔ½îÜÊ0PÒa¯¡¶cj͸âæn ¯©v‚H¿Jy™¨j-ðn¬P üXkTåËp|æH#‡K¥©½#9]ëÅM—xT‹41ó yv-C#šÊnÑD¼—ó½ãBS]¥%v³y”I<ö0!Ï}0á™*+µ‡Ñ j8QŸµgMj²L݁È|-*Sj‹×£@æ8ÊÔُKҝ`*Mk|p87}År€G:{YhLÍùN¿¦‡ ÆT§µyUT ɀN15wGB,ͨ¸‡˜ZÑYí ˆuS±h@{¨܁6{‰xÌz,‡ÂTëÙìü÷ÓºÆaªË!‹Q4P¶L­Â֑ěéÚ%9ŸŠ®áD ;£ +£¹ÌZØáNê†Î>‹½éWjÜ]³åFë}ÞÆ.ìCS0Q맦ýñ²øòZºÉ?T·hþYb_Yøx˜JåÙ(QrªôM*·‹bý”¢R¹É+cx.¡ƒ¬¢#•jÚ¸CÕ_Äñ”jœR˜j)u×(H>Ÿz®ì”Ry–b‹]÷þôÿDÐ[ì¤>à첇jqW H©›®á˜…ŸŽRÍýò¼ ãÒû)Ñ쀂ðõˉ ¥nIÝãAâ2'4ð‹£•OôÖP‹µ­ü^E9©áùÔ)²"Õgƒ“jqÝýÿ’ós%Âä?Æw-ӝ*"± ~гIuJÞGÔâòv‚Ë·£Ö¼i‹qy3‚¤&¹uã"¦„‚÷’*¥”ÊãÆTK*sígCÉò¶‡-'WO%œðÆ?âmà"5‰?'©•ÛD'Ő© +°Ãµtdߒ™¤Fª” 'ýÇÐ؋¡†ß廣uåäriКÁ¦54(ŠFD/Ø8RMPÄ[@)u¦m¤R\®¼ÛtôÈ=j©ía7$LÜx=ª:þó,ð¡9ñf‘Jùq©TÏt·U.çß ò +÷õrO+/J–•éÛOYZRcÿ/s›.ã`ÿäB!µæóÚсNUŽÈÇÌêGÎϏ·Æ‹ŘÊ´W€HÕӍã(Ÿ6y–Å?ªdङÌ:ê‡þáaGu3]àöSXÍ·ñ£òcC³$ní¼Ìy²ý§v<ÌLUaþ1@çÃê!Z>êmOVxZ!‡…èRk@ªgt:Ðn§Ý>ñÞÐ(¤{G}kl<؃éý˜Åµþ°{x¬õø;ïtœƒ²ªéahPý}Ou´³kÌ9`°sù«tÔê×h‘ð· LJsTA§ ƚcìD*GíO–ÜNžê€Ó8j©mÄB²Ql9°küEm$ +َf\g/õÂQ§ W®íÔÚË—Ãd™óU¸=E0Rï£aÀ5j)/Y£>ÅJXäUŠ%Fõ?ܼðûùëš*d•:dû*1âò4´(ÄOÓ79Ѩ*^iPö¸íu4w‹9/5,©cƟT–ð 3õÉñ_²žXÍ21™•?®cæðõE‡³C†fëÀ=¢þl“<¡.¢ €ÎšiA¥ ?%0ÐRÿLڂ̱•ðž`T§˜Y,â:Ét¾ñí¡bŽá^,Ôýá°RÊ=T蘯-×y$dU®oZYvtC¼øƒ\ hæ mEÌ©ZT3tÓü¨5úŒzTaÖ,jÝH¥‹2o.D•ÓØÍ[ÎG­EłNCrFÒh Û8|ôôüôþÁ+dº]ŸÒÊ•æ +&d làJQN7ôNžI—ËFÔ$êEpf ë§ȯâ +‘Õî©F}¢š~ÛiŠKÌ ¥Ä1Þ+A'ª—ò/†žlKuŠ 7?œ¨¸s¢ÚÈéQòl¢ +Aùž¦‰š´R8ÚQ÷çÉâO7Š¼C=JùÚÜ 0QIQ7üÅ» +OÊ©¸ÄLÏ©$j*/ðˆZæäÙ9f}¡… ÿ{Í5?TòÏNù)ʜÄú Õô^bØFZÉF.–\ÐYiGäÔ; ¶>+ Q«ÃC† Ô¼ÜcüîÌY:)u/4ˆå<ʾ_@¨ú‹‚ž~I¹¨]wôژ9?Tÿy~'ݖwþ¼ô¡–ìfç1ë¦á¯eˆ#<·4ãT°"dPg(×úÈ¢s÷›Põ ò‘ êxábsYGx  õÀé®ð8 èRý"I¨,ppEBmâàµK¬ßwÿÞUÞ9tǝñՓ…ÊýcñŒ ªÄÈlÎTnâӞPcS¬¸˜dᄚ‡<ڒ(Å·2<%ìm8—ªŽñLŽ³’PÅëºiÄòÇÝ<ސP7ã´J¶G¨ê(ãMdMƒŠ69ð$d½ •yµ8kšRyN· LäŸÒ0¯˜5 TrV«~P-ì@=!«À[Ó)3cú§¬åƒZqŽü³z@*Y…µ™€zêXlŸ8q¡î›ªÐjýØKtP­£&*P¼,'nË ÷Û2=êrPك•ÖšeÀAåS…ºnPó¼æ––íU±AÕ%@0ŠfJ,/¢A= RÀXiÝJʍ¶i [_ÉÉs OÕ@™Id¿ÆOÐ ¡ŽQ6ÔW A˜úVåe¾Ô L?ªz,°6ð,D‘K+wJ)Ú [çç÷vÒ-G:3ô;ÝK5­¶îS+Yk½»¸O‹Óv:flÈáÓI‹µûxÙzˆD[Fk«JQªèݪèÌÛ>0mÛ@«3èkiE°öú@·bئdW€uïùýÛ÷>œl3©“ìðH¶££ý‰(C.¬-cmÛ¿“æñâ2ßÿØ&Û.'ž?çù@þ”³^óÿÿOàðà·_\ü¿Ý>îåZJü3cÊÇFLM©y`þ`fƔñA’hÐØôN å׌*ÞÁõ¡òÿ¡7»Âu«?à¯îå)P(W؁qsŒ+Ä?âƒLHH6Ðᮎèùó¹~à¶ïÿ·—ûM>SîÎÂ9Ȟ]9XRhÕüœìçíͧ„ÊÄÌ|ÄØ̔JJƒ I²ƒ$IòHNðIÅ»ÀYÞÙ])ByÓCZiւӄ/äñ;$$9AŽ¢‘› ÑG¤o¦iß™H–—±üÁ=ø¤¶¢bk|ƒ +‚/’`4G€ôڊ¶ã%¶maûìqŸ˜^C”ßþN šù4`#ÊÌËSlæD&*™Þ1d"WDˆfŠUdµFq‰‹}VZIÑQJAJ…¯®û ,0V ôGŒÎ¼ãö±Îďê/Ö(’0qúŨQÝ®F'"²ßESd‚HDeGDâT4D‘Ù]@GÑ  ::*AtrñZGGv§ +ttÔ@j`Ѭ¢Qœ !gHEGªb¡ÈH°HµªUŽßp(ÄÒ©¸Xr`Œƒ`:í`‚ ‚ A0‚€½@3Œ{0ûÍì7agçÍ q |Î OýOm7Xí*PÏУü0Ãw0­D0 ‚ÀŽR~`îÀA9ªŒ[wµ@™FÕ-{˜O, +1“¥b—ÇÇcAeŒýdŸÛéé™Çȶû7ž¿ÈGl_Ýíá9&¥"íº¤mØv¸ï²Ëö(]2q qíªš(Øï'Ÿ•Î=åй`¾Aü:3¿g~7N­ý¸™ñè¤OYU‘û„#½~ô:ÎtfÆCN!ïC»gŒÁ))¡“¸Nwû¹ßÇÞ±ú4©¨¤›Ö3°À’p4Œ†C’yLe/: V2@VPXZ«ŽUIª&0¹®ö‹Î4jªnåÀwùƒ€ÄƒPHæx‹Ñ²Çm$Ïnt3²-žvòædãþÜ~P®‘®Øt#Ã&’¹ûe·èøˆ\éÀ> Ü®›Nõd©¡/Ä)c E¬© ¼ã¡ÛwëžôD¡9tõ‡®4Q󋈧÷ø‰Æł£ÿ‘9[ˆ@´‘YÒÛÐkdѵŽ¸ÄóSnÐ þ’ ›‹¸nEaúdä >Öû ‰‘¯ñi ¹_….Cƒ¢¢Í@!Ú +ƒa5ö8XŠ;å|˜!’È5àÒ"s‡ +|È ä ‰ì—|9vf½ÛJ½×ãcòš." Ù9Øå“Ü´†VM!O!i]‘!ä>ûì`›T&8ž~a×æ'«x3ÈUü¿eAÆÑ „®žÜ2U\Ò:2;@2dšæ H,â³ã‰óáÛûyG-áô´<ó™.‹P‡è ÈUAØî1NÍ`¨‡ @šB¡×Ô>„!þâ8Æ2´n·l–ø™kbHýÀœµ× HmßÎ åßo\|?ZÃ_{%{í ¾?•Eð×X‚æÅgSmó#‚äÂušˆ_kóۉ¢tIŽç ãª¥l:ëD<ø‘mÎvBÏ©ºC¢ÉO’0÷'~Ž'ôŽx5,:/ªÃóö2ê¸âê#و Žpx)&*䶏«[!cøsMÍÇ+^&†AgÐÜí\óɤ•ëd};øØup {šX‚Û„]ϼ~Ñ›>«`Ôud£fvêɞ¸í3oîÑ$Kö¸’ÞÇÖ!’>Ä-‰fэšt» >&PZŽŒ`ù©¡žR<Fáh^­hdƒ>†¹gs‰$ˆ¾Ä)›IýÕN$jü[ÄO˜º†èð93Eû8"® Ï,fC9ò‡…P‰¾ù”™²T ÙÐW„{=Ëßö?|EQ«Å¹/ cΘ£öÞõ·Í¹€4®ö°†1F>ã@üÍ à„ûQP±.š ÑBXbË:Šjn/‹óÌ؛}Že<— `4nÔÑóÌ?î[̝žÆøLÄrÆ»Ùy‰w[ý·6zuÝñ (qq’lŽ1˜bŎ 9¿àžð+IásîºËþKA·öSLpræ³Iœ +̅ )a6-œGéö©q·‘%Oº#0ÚUÃ6½! ¶ÏæòŠiâ$“”mTãspõ¹âãP†f>B\Rm–àyGNçßj崐“Îüþ'bKDôŒCŒÍ)ÀqÀé”Ï©”~ŒÝÝwúðœBA w•òBCù‘u¯Îá4ÃD=FÀÍêÃ¥ÓäNL¡¸´¬'Ɓf–®š³QܤÌ'ˆ’ÖFã•D@Sì{LæMƒî,«.L°ð‘kqÝk{Eh]wÌ °ø°k(?È$×øx9—ŽNã(“"Å/Íwa“n9 ÞüüKAVv8TóKZ¨ÅÙS°úø‹UIԛGH4õ1@ ‡ÓˆÒ¿9ÅóCe:CœMŽ€\[g'¯‰P•DK n æªâ ú¹(gvvЍs‘‡KúHw…8uUây‚ŸÆP%„¿¾)Ž%´tg„)P9ˆ†É´ù1_öŒ›Ç+ŒÄ17°Üâ¸SâÀ²Á'[¼N_=„“âƒ×݊?Œ¤›ÐHÒÉôˆ£Îù‡Ä+BK¥üˆ*»9ySI\nM¢ªOì,A +Œ(‹-x­é{x:XÜoRJтƒÅwÄÍpÎ?,ØäLþ>¾¶„;Cƒp^SŒ®|Šnu¨‹ß,C+,œpq06›2Ùú÷ã"‘_E²·×Nj4tï¶TUæød“ܳ ’¸ÚD½Ù1Xþ söSÀÞ5 {÷;Ü?„P“pK”kg±4Ѣ¥ô_·ø¢ä¼fÅÅƱ%”‰.ü” ˜oºX…,âÄ ýWªgØs§AbŽ‘Øɱ al¯9æE`­—YS¼è}ùblw͋ĸ +ÊÌzHÜ7ŽšþJŸ–ÁC”îfÚáȁV$~©¦Qê¬e;&ÍrˆS†՜ßûð.5WÆ;z‘?C²_4¬.…ôÑxëB +L[4VYoëŠ{iKqE ˜¢qFtvFãÉà 7hì±¥åRHõà˜ñ.µÌ¨˜º, h¯¸ÀŒäRçá)0£ï`àƒ†ÇžÆÚ9`»Œ^\jéaU¸2ƒ‘°ôªùãØñà=Aa žyæ¦ ÚG7Šþ—ԝ§va2mø@¨ó_ºõk¡¡ÔŠh­/š².ÚÕÆNã–ç† ‘g=$tçëVéÄT¥ ú×¼ðá’(ËñbtÜ\ƒÑ' +™ÑÍkLú»-] fdÚd«‹µé‡ðW‡<}¼¥ù™d°‚OYdP‘V <¬J¢ÊR}Ÿ*q×ФÖ3 ÈזçÆ4ѯN)ó+ó|Æѝ/f‰g2öOÉõŒmce*Å.0ÛÙ¡ép6Ñ}ŽÕfté²,"Ÿ€%%I_#ŒÓ ·}íù*èÏÄ1ÑÄU3]ªŠ`Ѝ¥µ±°-øZØØ;$é8À̝́MCh•@ ·i_|]èÑ84Ív_HumJ`x>ďxèþ•Ð­+ýéæ=7àíq>4~ØPÿ™[éçÈi-´!6î֏iÁÚ1 ½äÀyðG¼ÌñaAš9~Kї¾r¾×cÐÖ䖨Z†˜:Bp9 ‡ÊuUOƒ%¾LJuÆÚ@*õƆ/;íÐöj)…B ¡¶WžÒmW `eÉ©rðßr‰/­Ÿ`‰vCš!·NðW¹‰Þ}6àni5Ì{.D\÷€C0õ¹¸¡nüÐs5Ï»h=FF ‘p$% +²àWˁ}Ó¦c~¸ˆ]Ž_ШF®"´m(<šr[9iÞ}·¸Ù–@n Ó˜fó¹2fœò:Ö¨ ~é7„D±~;©ϬEoÇÂ#ºµj„ ý‹)~º‡åJžsÇIù0ÜEe£ùL¦óèà–2@_éLBÂyÐ^¥H}üëµ¹Bèæ-”)Ç®ænÂþrr[ÈF™û¤+8Å{B¹-tˆšv`‚e÷ºO÷òèV(6Õ +Μ Î!o)[!ÿ^ٔÑ4¾ \n@CÁÝ^‡ÆN/Êw*ò,ÆAVánG’é!d31å—¢,§ zя‡búþè†ƒ·£ÆM-³EG¶. û¸èßê[î É Ì=i!u™KÞÑÆðÑÆõ.ãŒÒ 4ó˜šjQáÆmä;nl6“.ÆÎ{PÌÒzƒÙ²4êöÔìòÃKƒ‰£DؑZhp}h°®0·Ñ~ +R±ƒ,bˆ9*¿<âͲõî&´ŸÉÁÙ}-;Ã-ËʦQ«Þe™"ýS@©|/ 6 -¢9l"‰sÂéû„#´3 Ór(”'àËÞµÃ,ê^jLWr“Sz-afÙOó6FÉNþïA×NLh읮¡õ´¼.Øçñ/Ñف~oš‹Òµ¦0ëXœýH…L‘$Aٔ:|åc1µ³”°R‚M¹ß-‹QMÔP !(‹5l\äíÝ×€K°,Œ’¹SËëÃjk®E-!ÉPF¶"ÜJQí£–B?)®É’oÁË6Ǎ‰hd²¹‚8/Û¿f$¬*7ê$~ÊFxZb¹Dn2a‚9†ækù´läRЉwºÍÔá'^r³'%¥Ôì´ó´ì‚ ^Y‰Å[4.kò1I¢“̹ö~„N¼çê-×/$Œ.Iòw¡d±ÇtCáÝîҘ|22€áóWòðWcç9ja3O'5¶¨êAƒ"èê™Ó³8cÎÈÉ(Ÿ˜ýC‰i(§ á^2YŠ–•×ҀE½&ìõ”<{Ðep¢VÔ%ÀF+)7"¢åêñ薫䄣UùIþ©áƒºú¹íÏÕ«?r× 뱨û¢AÀg½²'\ö\P ´vˆ´à²“êªÂX½ –T¶S¤¹¥ŒÛ=M‡tJ1Ìrñ?_ÁçÕtÙWÎn·ÚˆoögõXðØiˆ(LÇ@z€$K «(«ò[þ`™f§ƒu <¤C‚ƹóÉbÎíeêùÓÀyoÿ‚Ӑ6¬„SüF.ÂÄóèfÙø,ð{ڟ9µ¼P¤µóq§3à÷8=ê0÷6"à›Zq»œß\‰Ÿ˜9†`ÈdV•Tð‚¸¬_R¢GTX¹ê€(,¹¡è ¶@˜ï¾’²KÑÖgér‰ÀýJ$Bš˜OçøñW'›°Û*9ç¹ù{[¢æ ˆUЦþ‡îþx…‰ôL@zùß©ñ±E¼Än {Tè˜q[òڎz×¢p 5›žõn³* (ßîçRžkî¼Ya~ÔÃì p`þ†¡Ð!Fxsb,DñÃßçW¼ª>W B(w3CßûE¢ß™â_¯ ­=k¡VØCúññÿõÆ DÆQe\ÚÌÁOa(ƒ†ÄË;%žLY!øҍ§!Ï¿ ¥gÆ&æU NÏ`ùЄ`<çL@` Þ%NæEt-Ûi 8ÙƉlj—‰Y:"ÂÉ3^«ñ|Py6©›óây}ÍZ(Ýäޚ¾‰#qž¨bèÖm÷ôSuö¸ÞÑIê´uj„í?”Ðn.rÀökËE^tK¿—ëUã=fµŒF3Òq¹`ËU¾(T‡rI¡+æp¬Y\S%è™Äy­‚ùûý×ßZ΍lû)‚`fâÇƬO’w2[ +\…B}`[äa9`¢RˆèqH‰¹Yב7h$_Ê÷¾×‰`C͌4VKÌ" ær1ËOã‹@$\‚é½ð«œB¼A'%3F‚F~ `ÒÇcP˜h:llt© +ŠÀôˆŒÈ%Rgù7ºü·–ó-hž%b³b·›²[XW +šÛ ªÝFtÚ~%—*Nš®ãW¼tNz{ ƒ/iÇK+›ãšÓ9á O|ù!ùÃ훭šP¥ÎýlOh*pãŸr¢|gBôA!Ñc…ñÞÐՏð¿…Tƒˆe'Tåí’iãªÎh%=ážO¤ïó˜‰/.„âeôC—2´ÓZµaóîb"4 ‘?øǏ ‹kÎäÓór ¥Jþ{Ù÷…zíDq P;o Ü(´V^×7çöã£3¨0´z¼ËÀàa©Ñ^n”w¡÷{ëîsÙÐ%JIÚZnC&=WŽE7Ýîõ13ýçE»i—t.—ôæ…ùX;åjT%ïÇíY2#A…"W{7”퍳9˜ª‡dÒn}à̔|®š}Úãbfå ôðð6ˆè†¥Y9­þµÄ‚¡ƒÁK´]^#kzÁÎCŸfòžZçoA섲fE`,„8*PS"8ÖúàŠA"D((Œ³ hæ?AP´êóÓEŠNæöY€>g›‡.ƒ{ðç›~­ÊV 6ÃDFXT¯Š:»;.›âšÊÊ´c²uÈoŒ,~äL°Ž,‘$’×ôRÎ/ –…^úQ¢•j•Kløė&N‚ú_„ìüH¨1–0åíÚ†(³ë–OÛ«²ƒgkVxLjCyë9¶ÈÊcpqíu©C(„/þ>´!ÊY_G +!FHð? +šÛ6ʪ`¥º'Z…Ⱦ®0ÔNçÿ_è÷SЃˆîeÃýAç­ØL#½KæF24ׇy¥ÁQ9, w,˼Ÿ§‹«!«5 œÁoËAZù‚–Ä„_ÓxέíŠD˜xÚ­”F‚[¤¥¦ˆ£è,˜€ ~i—ÿW”] +¹%O ±:êyt˜©I§ÒÞP6Mµ‹‡s—…HÆÕ§ êŒðaçÍ連Cšæ !ù4óÕ4Œ:uä_ð®}ýÒ ÅB¯:)ªªÓ¨§rmzòˆHO‚äwc᪠Œ±ƒ#ï6Üsá>ǽ“‡g¹ÿŠ>fÕҏÏHiò¢r²WxtëÑÒ}O%uPk®=¤ämŸJ⨠àŒ ¢˜ £¯OON„aÎ$‚>òV4Ñ*ðÀ³B †ìa)E¡´yÂuú'øßIÐ{ÑÂÃõObHÊ1Áü,ÞÁ0å¬g½Ò‰¬ž5'îLA>ŠˆÃ}¼ME…®a­+&ãË;%Üî̗)ÇBò˜¿¡ò¡ó|ûf9[h‘Úmví[ºYW×µ–åtí]f ÓíCŠ™ßóçÌêñ7½oǬ‚1ƒi=Œÿ³ø;¸F|”ëÂÅh$È68Óå£Ím. ,|˜Ó*¬–9µ¡Qzç7A›Hà†±[Å1®ˆ"…îj¾=û¯{Úá +bŸŸç6Dÿ&*®+ɺ¡³îŸÄ›YʱîE¢2g%“·“调ʫÏ{óÍrVu †/úž ù(¸4vÂi<â6)le³\мHqôf@ª$…6D…­ÔÃá±Pæ‚|Œe¹«Ò ԓèÜf›óâPA±T0ÎcéÀüþ ©3‰K’@6ý<5 … ùêiê6`ícºeŠÑg«QG¨tàeUY0+MOç ›áÐ1Ñn7AùÂÐ8«[Æ,9x²žås•] Hno¦C‘±»×ãã¿íÄóÂööÓ‘Izt™\G2k›ëc5©[Æ î_o—$”8´Ž©»5VþW\ð„Xº\Í1Q´BŽÜ®$FÞ|Âc挏‡t~w—@ágÒ6;Ù(¥?ÐU³Ċ}lV®Ø¦A͑»O5R#øWYY­UÀ<¡W%ör3Ýø]5ÒLlJì\ðÓîÙª¿ïm+8q×ôMcî 7¢8Ù>œÁt[øK¡0™Š 6bç6¢2ö`Ä`Ib½}6‡&QaÒµomÏ(ŠôF—4"±c }+‘¼e ‘Âoãé·$ í¯'PwÉš1ûHÁ™ ²@Ý]˜:žý ×S+,5­Y6• µùù2Õxo5ØÈÉfœä&~ËÉÜ Ñ 7u˜ç 'ùëƒûŸè +Ãæé7^t7©ìÏL"ùð//'LEÍãzA^„&/ó}T(OСØî󪲑7[¸= SS‡(O¦ô"„‹ŸVΫ¡wo)O[Nø-gËæ;F°'êÃCG±¢ôÝe $‰žº"…§OØ]Ùԗÿ£W¨Ž˜ cIGŠçÄÓÉHë¨0àa8¬©ÎØÍõF¾T×Ý°„©N¡ OuÍFKJ: ê¢ºÕ+”ªãâ{søiT CŠjª.*³U·ã™Â_l§:͚n,Šªã¼DR¬&J2²¡ÎÙOuH M½åûç§ê(‰æ%ª:5 ‘XuŒ”©dxØo–ÿʪkKÖ9Ç?·«Î=ò¯º(Ðd„Õñþž¿’²X!`^8Ý'ƒÎȧëZ]j5‡ç­Ž²¡Öàê ‡¢|[$S7WºÉ«óÛ1›ã§ËRàlܨ°¾Q+EøFÖUáý¡°î2´ñË!ïî¯@œ¶aÝ)(Ä:. ë@oDh¬›×¡ª ‘uQ®˜©ÎG¼q·Åºklω m™ÞªÛ <뢹!PY7X éÂKÝ¿L–‰ó¨“zÕö(A¶#;³.|”ÖenÏɬ+Y9è¬óá= °g¸Têä¾D.Ô¢> ÷Óöhyˍ(etµ‹nnÑ#,-rBë„0‡(‰<Áa%ñ–K¹M20dï$'¦(­ÿXøÛzT¡Ú×)O~€ç±É¿]„Ü™m[Õ. :*D/¿BòjÇpšH—Îp%€3蝵#É¡s䆷Så¨BuöÝ™¤gíPy"ÀÚÁÌÚÕn¶\µ±æ‡PÊYö×Úíî†â·€|C_;‡ídOCÂf2¬Çv©¢k“í¨“û¥9Ž²OdŸå³]è—Ây)çB¢q4 ð Eqp´Ù «íÔµ¬n +m‘¿¶S3Jö¤U +N8rj!–]›ÈÚv¨qÜGwç¶û†•ÐÛNr‘ç†RŒnwȓ^ÅYÅX o§y_³a9Z]qø¬E³¶FßZ<¨ÎHƝ}»×I´»ÈµíE„Y¤ }:”™ßûíž4Ùë]Ù¦ +†ß¦ÁáÛõ¹ !óþkŽŲÞ.Ü/hd-[»Ü{~@¼Íò×æ>œuüØW¥.X×v¶˜€K»vêþZú +ž1™Õ];ÉhÿµÃ¹înÝ +wW¿ w7ÃÝÍwµìŠ´‹ÏK­Q b´ &.îäH3î$swÒ¡hÞqgÐ^O«˜ÊÁí­Ë][¡¸tK掆>ZsGòózMMWRáØå*\ãåN˜¨L˜;ª‘՝š»T$Cxíj…83°‘g\ƒž;)nV‡î~©lÍâOYá.ž€ˆù•ìEiQwVG†ïÞ4Ƶ'·])½°(ÊyG?”Ó9Ü +»7A±»¤’;/ÛúcxbEàÐ{ƒv߯PՋ±UŒnwMÀ‹ËÊ՞ïîÂ@bëÝEÝÊæ»c¯+èîÎ4\éµ;i¼â½Ý‰»# +eîrº;õ° +xw¤tx§}(ô,yÌ¢aL¼S «-kUy*ލy>@Ä$'¼ëÞrð®–8¸i¢v㧲-2Ý9IñïJ^b)º–ïW­ðc>ލ +‡÷ f߇ò &Ìîñ£¼³Lím¡°,‘@ñbcèuZMc÷G1ð|Ø°jæ wdAAïˆEŒè]üˆãgé]Þ‰Ô.TÑÀEÃ]Ô»½ë֊µ,œ8Vªñ¶ü†úu‚Š¬Ó|×P¤½ Ãóùpï Èé4…Òä£OrÇýך”Û_ïAãÖ@K½{K)î]4Û +ízä×ǎ½‹‡–™½#„\ÌÄ[α>T  ›RÚ&×ø8P”¥;@rƂ‡¶hN™Š–!廉Í?ò‘r@Sïå Fã;ï»ñ n„ÜÅ;:ƒ?Ó]+](TÑ6äÆâÔw{†|}tZû.“Q€m9PwH¹DƒÜO,¿‹§G9ð0‡Dèwи„Žvœëe?îŽ+iý]#u.1ÇôZXþ¡iÁq:î—ù½ ']ʜ[áx9å¾=€7Í4Á À+ƒe±Ù€ã„úрwèí`QCàم’ßÌXé„]†lÇMô¡Ô@“õ–ý9s‰Ší Ç͇ä¬úåæ`\«£ˆÁ›ec 7•þè"x%sేßÚÐÀËî.!ÜD͌¢Œöuà-MHàCžW¨-Tá‚` öxÿSNyøÜw¿Ë<à饘‚§° + óB ž”^ £‰xl³•Ö‚§SÚ@\ð¼¬k9Gÿ甡Ñó«Þñž¯ð ãcѼø)Y¯ê¹¹ø=xÖØ'Qé¹úüç}9šcŸsÂ\Û$’º_Í}7‡ŒNB!<È>wîdŒÏ!3ì1jÉ8ÁÃt^2~{ †…ÖVAmbéicšý´ìX" cÁÛ sÂûª‘®.J ‡z¿^‚¿¤g^æú‹\ñ¹ýû ¡“¢-#-4<ÄÀ²üŽK””3:—Ê /c€pxa‹|°ìºL'6«kßR0¡™-P<¼½ÈKþ°/ÒÃSâ± ¤E^¦NÜä¤ÐOŠ^(Ȟ㏨ÃÎñÛ»áÑ»àŽ¿+HÏ®˜°¦`êð‚'׆´qêÚ= +Ôª§ôÃMµvAÉRÖ͆Ÿ·¦œ¹ Áw>stream +0j¯-ǔ S;ðþᐈqHƒˆvf¬Øo`C P÷¯GÃÃÔçKÂxÓCµq ¸‡–/ñÆ 4©ŽG`¿žGˆÒÂRº’°uh¹AÏãå/Ñ ,r xÓã¡ÿ6=³xÄØý±Føx¶¹]äöxýã)Vàõx,£3Ìã Qx‰´ìxWÒHÊÅPûfw<6Sš?ÿ$}Ÿ;\Í;fXãèñ:Î%ßÐÃÜãÙÅ$Â{oˆÝï¥þx*í¶ÅÀR€N\±ŒÓv‘€xÖAQDMd‘¾˜&䉋¬y›¤Rvšîn&|²KbI¯çX‹<±žhì²rH O1Ìuæh†äiwÁo#yÆ(Qª‡äIævHZà8ÞÊ(™ŽjôòÌD(y¡ãŽ†‰`JÐü?ÒÙ¹+*Œ¦úgá“ìça&1y@ï5«ŸuyÞômij@7O‘ èï/É\Ôá¼Ü~w<`.t›»Ìž5Î&39öBÎ¥Ýìz‡b§UÉքmΐûþÑygàp?èëlbʜ‡åcoù—óÀÛs·Ã%¶$¡tMø¯Cu‡å¬Ëy—Wõ[.öwPƒ<Óy?ÒSBß`ØƊ*{Œ å™Ä.9/Dm–AÏ#͉DC˜ó¾âªfx ëœ÷ +g‘!BWÛà´5«•cuހ”?2häÖ$äZÒ :qÔçËæÀ‰‚­ ä))ç}ý½"*¢óڂaÎcáKÏFšð^Ý´2îúbQIçíb[¿Ø:ïkü³аnäÙy£ôoª¥à8BÏÀ³ò†éßys•ž×kÌràÿd5‰Gž:^ê@EmM£¨BÈ3ˆmÆ©çÕºPY!ÂkdgyÚ_ž§P\yfçp;£|«ÈÔ×Ú£?÷c¼1Â0Ò@‰?|•ßɃnô h V߀¢Ú´S§Â)å_! ÂÆ*¹”6§^”ð¯9v’‘pŠ<ÜJq‘ŽRA±|àõò÷?œ#S/îVlåºIõ·ØýÐ5w’¥ƒède©Í48 oÁ'ö†9Ä Ò ÈÔãø=pTï@ôµq4CÍzªÛþ!Î~ßDϯ˜«8Î+$c>O@à$ég°JZx-5EsDã‰2\WÙZé³£«/±õä(>ØS‚òKgŠ ÐRo­}‰mÃ"|s×9*òK—B7©0EHQx5=UQG@6˜6¦[–3…J5]ä‰Džaé4e…éI qđ \¤Œ(]±Þ0m£Ð,*;z’?Ýĝíðàtƒ>p7„âÁm–ÏAëÓw „8ÛPâ“\=§ñ šÆ ƒoõ§[qO-^õ1  ûˆ{£¼KGYsæ²i&1N®ÿš’œmÍOÐAÒIDùOœž0S%N°2Ò/*|YÝ+cxå ©Ý±6féô¬ó£wÅ1¹úY¡Uêü¤_ÖIÌ_¢åϓžõ"*Áí)üлo§¡,î-N¬XÞõYH0æ]ÁלÞ1Z¬eïáKÃGù ÁÂEY.1æÅ$×;[m¯ÊŠ-÷¸€H¬´£XàJ¦¨W’¹{æ;÷΃‚°†ƒcŸÓ +=ʄêDû!æœÕ[Öh?©^ÖP¢î_ Í·ü.¿¹©6‰Ýhmbâ‚ÅüN;íDÀ(j1èoäÃcM ™^œ_i´³¼•N2ðtåĸ¶øc½ ^|PcðüÑMµÈØÀ‰:rJNt ²èP¾íE+ µÏµ2rfD„uz_DÇûÅ@Ôå/&lxNvēÁ£´¡Æ%°dR0©zN8PÏ:(Š RÌN”[§Á¿°6¨Ìû åÃdÀoT%ç*÷JzÚm_1»u›EŠ˜ÀW?*M~¹mãp$ŸÇGDEçg±,0éIGÑ;ì¬Ñ"eÈa ²¹_Qä‚ïˆêCÃÅÈÛ1ǧÈ÷×c6îÞęsä£D&,ò0N@Ս»OÜvö /z:ñBÇ!Ù´¦Ù"“ɉ11£È îJ…˜e8=*‘@Äjÿ>Ô"üÄ4œ +#øKÕHšÇ€×=zP±Ÿmԁcòõ„8†8#6CÅíø_êìXŠ‹œjºEÕ» (º£ Céç@€óЊ~+V' 2ŒçúŽ¶P?»•Ñ+Ɩ + yV¤±ôìyzáZ;Jà& +«éN–뜰6è ­@-ÏfV½ªÏZg“&jV( '^ ÉØ È½:!&¯@dp¤‘À#8 iÀnÌRRЄ@CÕù­å¥áφ‚§Æ~úŒf q51ñÒ£"»#ÒB§w’½ŠV³I ØÂ~ºAD8'_lˆØ[k¼ê ¥ƒ–/qÁ²D£MÌC¸ª¶FØ"ÚÄOô~ÇÔ9Ín!f{’¿ãl³»| xR…v=°”¹_œu>ô‚Ö'é€nÉDÇ )hÄ’ƒŠj“hr©Ð¾/0E¢I +ÿ9 gzÒÇ^µ‡G,¦·mC Æ]n65<_Bs`®ÅréΌ`*V/Á×:ƒ>˜T¼†¤B́YõPü'}!QLsw“:Äc.EP¶Ù©Ð &š÷=MxZÅßƧêé¦ùïj°ñD0WV ·â~¯pzµ¬B¶Èh-@ ­6uÏÐÒmžè Dz"ÓvˆÅ1ÞõD ç¤ó<$$‚(£Ë-E©õøÊ1òûåë‰ B (} ˆü„(˜'°+ ¢…9s&†4yâØ|l>P´ÃOK2܍ۑ‰Ž…ž(~%ZñXO„IÌ3ϨÚ®¥ËHÃÐÞyCðKC,·¼“¡8Ÿ| ¸Î<Ü3I‘(«ám>1P9I8ÊzôxRçÓô‰óD½xÉÊLh۝H«A>>‘Î7Äé{H©|b·«–ÛäÑ'Úb4ùøkܪÃڄn¡Üàcq(oÜä6K'ãá^C½Vb0¥ òžXBÀöDÖ͞ê‰ R]I©s+ŠÙæâPÄSA³1œk õ¦eY_Ø%7ŠPWH¶¨ŽM·k’-3fRëB^oI½8–á)ÓE¦0ü?Z¦R Â"‰z¢ÌËs0òŅP +åXʾAvûìD]sQ…ñÅh1f¦jqÄ%œ›bw¢Îiɽ=·Ž WóLÔnó·ø@Yâñ)( ìÑ¥FŒEڋâ7•±.x⫞Ag€4;<°?O†¨—̝Ҷ@„<NFqJæËäÇé”à‰ßìɹG éäæ‡7ÀŠ}á êzé)A€&Žr;ÀX<—zŽà˜XÈ»Ä;N$ Íí9©‡F§PyŸäQWŽ½…bŽ»éuós%œÏ‹ ‡öˆðUÝÄȾ*m"MÇró|Ôw˜cqàJŒÙ»î6ñöÛ¤¯M|‘ +³Ê¼G-ôɋ0k°~ÌeIƊ‹$ m¢øH4‹$ÒÜ&Ò›ˆÉ§šxìq9'2 àÙ¬ª$î›À«æ‰5‡7Ìǵ9=­ùj"ÀHÙAñ™ˆd›ÃLÜ×NӐ 5.huü͈ՙ¨ñApÍDç8‰MžSeh%‰‡±¿W»±'r” Ü@ö˜¸|iàDëã¼»ç6*KrY„2ÑIrb†(ÜEb"œF¤`¢.À1  »ÀÑæƒÎ€)Ǚ~$Ihí.÷01 œÜÂRUº»}àGMš#Œƒ( ÅßÃDŠ‘&ˉ™ø]hb•S:g¾ +Hܖ$0±ŸÂOfXàµj1]¢ðJÕ +ºÄ‹Xãµh §FÊ5ÿ#çÒs¶Ð$cҚ 2æ\0[¢ ¾&ˆ´¼ûûÚñ˖8eoïΡ§/2ÇQ‡#ò÷.Æí=óm™$ú `£XÃhÒ­<!¥´Ä2¾¨mòZâW¸5©àN¯DyÿE¬Dº³Ôu'ð‰•È…¶Ÿ“ /ö§½ÆO†îwY$Ò3¹_hýC'‚ˆÄ¨Ž%àÆ_2}pN•Pǂì ªDE+…ÝY%Bƒhü}þÚ®¡çë¼"LˆU¢PoϏu•8 ú\÷k[JdÎ1®(1§—¦ßG tм±Pq@‹Î¨bÂúBޔ[ëAqiû4“Qb܁0”ÈY躕“èK²¿ô>Nd‡?Ӓ’+…¤?b„î‘UÈAT{Ô¼‡ÁO)‹†sx-¥`BÈÕ +g¾ŒJbLߐMYŒÐº=0k÷àw—g9G%‚‹µPÁ½!Ǚ#Òõ°ˆÌj±,Σ„¼0V1ð0$q8hã%ñ/†!±@Á”Ä¿Y’8ÄJb-í$‘° uN +óQÔv®Y“sœ© cñàÞöF~>;®FâS®ÏøŽRDû<áÿíÁ˜p.%ìÉÄüóŽ°q'1‰B#ÚQ:4°Ù’DÜ&߇»9®'‰¥P¸"`m£è(‰"9›D&Bs±nlÄÍùÀ‰$_uÄ')Q*“ƒˆ¸#T¨J?!†¨¦Ä—i¨µ”¾¹)ÑpGò_Ëç9èكñ®­Ä™ÃCÕØ{ ÅiÀ€ÿÁÊ:KT´¶ºŽ'…Ù)V1Ô¥}EìY±žt’éÌ*Å/€ú®igXS‚mƒÊs݌všÀfA$9Äqsÿöj÷gœòÖOÊK«OUW'4…åM¹´Þ"–Uæ+~­à.’Jz'źG©½±Ï`êF†þ¬T?ô\jelsVüóì>JÊ+˾$g +Hùʼn¨H€YÚ"9¦1Õ¤Ú£v¥WrÏëOøTñ^B÷n J×ì¢@_Á=¹°© Å[T*¯ +åtÂéÛ]༧bãØM J\„J½v(ÊâËò:ø +‰cD±UG!ñKK½Q¾4[³|¬B=zÒ[½ Râí2:kàn¦ƒKLûºWàoòÏWҖ¹/,¸Ú?UšÉØzJp¾B²UÞðí(Ê×Iê)½_'aÇ'‰™ð¤îìG|2LꞒ¶ã¬W> TÒÁ»Ÿ\øsªUk(þ3_ä-›q:V}FQ*#·|½]» >¤ŠæЎœFs>Ó=ԇŮ9À5aRPäŸ#Û>©:ýÑ9¡XôEïÝD?ªó¿ÛÆæ]©ó`QQ€R[¼®«ULb¹:C·†r¨ÿnó¨w¶¶-ºãæêÎö„D¥XÁ’ogCTÀ±RsŽ¹°C¬ÏC€Ÿ"ó>H²,’àÁùzȈ4¾òŠXª¼ª¯ó^ Éßé«i2Ü2sþß҅!•91"õ#q6†Å/{©­ÿÁm h¼’•Ø‡ gÿ(^Œ ÄšÅÄßÇñE·x“bžÆn&*3YOʹF³4óÀ„(ȯ͝ÛøJg¬ªšHÅT«@qp¥xã<è(E%È¥y:¦T¨C՚±v¶3•±ú…™ë’é-M’7¯Ã$=3·fêxòŠ¤-fÅí˜U>j‚“b?s-ýÏQÇ Þ1š‹ÝbF飤ˆ+Ë(Žla‚)‹Ywn'“³ÎÄnñöH`Ððn¢C$’á 8tú•6`EE²ÏéÏlxfñª–ÚµªZ?Kâg‡êë‹Cöe‰3“~>¤ÇÁ‰»˜4ðÝÔ£½8€‘ô µÒC¡—¦”¡QNô'#C׃JÊÃBð;Z/ÌÖæô€á@ðș=\JU ý¦!F¾l +ÀL”J:…û:Vä„eRë­ ûŽñ6èÑA·¨!ìb.3S“BÈ_R«·kè+kÊ`ðñ£Ò-§A¡õ£…š¸H³ëö ÛbCp!ó\ãM“W.(ßã¦ê“¥#` ہzÀ`Ô*VîGWJ$Ú{r¯8kâEÍH/¤%çù¯é ‡øф‹ˆ¶ÐÕ¶Kñ²/ll†7ï‰ëÿc½¥H4ªnx…(šXèÆCAŒ˜³6>H!~ f%€Åô$çØnå{Øm×6d$¡ï1gÝlsoIQÛ cõ0ÅJ”ËÅqÕ×P6üŽúDA[2ñ:„­ÐÈ%—‘þ(´%À@zÄýv@aPݹáæ‰2áÆÊ琣)œŽAÌ ±ZPßÐA·¬ÛDJ+Ií½šŸ:ãò9'¦PÁÎIEŸŒºÂµ5hj; ‰6F†Á–¶n¦]žTÓY1¸ÞÌ&˜ y[ÿf-²wÑJ¦O›¬©M\$Ûs­ vë=L@`A·Ÿ¿ª·­}63G~Ñ|>¬ñMȤÅÅ4¦Ö`Ï?”8i1œ+ø.rÒíò&î$kòSȜýÚ°•Óä7U?6W[‚©/0¼CAs@Ü[ˆ¹cÂ-¥¨éñO*m‘»Ï]|–Z4ÕÌ·–ÓÆÐ)ùZ©Mt ` Þ¢ær­à&"ÉÂðŽãíW¨P^,S›8C…l“ 2µF^¸hÌ­m ¢òjŒ{ØTq¶…Àó)!F#ŸFa WΫcɌFí®õ£Yra5ýAÍÍhãÙIÁÔ{6*Mô|—è¬Å<ÿÞ6âÿ3– ‘fB4 $€pDÅÀ*£ +NQߕõ‰‡’¶t*Kûü$¶TÅ@xÑÜaØÉÇBB4ý·ïº"K­,óÔ©yñõJ³ì‚(Ôbâ#{¾la h!ó”AÓªæ¨gâtW0Œ\ òÞXw—®ÿo#ρ`º!šw¢ðs҂Em„ˆn¨Dj3å"ioȖB÷q©/,—g`>Z¾‘ +EƒÃqš8*̲aAò©¶¦H‰£Á¼!AîªkÂØG¶Ñ4Kª¡müy«MþPLå_)¯×܌ ¯…6y„òoâó&ƂrCîò6_ åÛ|§æøM»PüZÊ!p†¤‰ÿ¬ä®˜|éf}ìe}¯Qn xJN°1Êù)r¨Ò‘¦Ó~Eq’0âZºe±ë]z8Ï÷­ýBÖIýˆxÁî“â?"´ ®9ŽÔÕ}bš‘#ƒŸÃ'Þ˜÷š¡gŸ€Ê òl#¾’=è„gµvI¼Û@-"Êò!TCUt¥o{‘BsáÃÛ/ÍóA¡t]hV‘5vm<RXŸ"08O˜ŠÏ\[Óe_ +*bxI˜Ð¹vc˜Q yHýÃŽ›ï\×wNÿûò¬ã1…ƒXÛsèt5·Mý-¸ð;YëIWÖ$¦©»ˆiéuÅÉÃU°kúÖJöns:Ú\&—:(×eª±,ò‘ú5 ö³/%¢3GU…Ñfʄ„™„À%;㢓nÈ\«†<}§LËA{lú¤ÃÔ¬½ú6žéºòý¼f)4›®—¡  Ü&ÈnUïT«ˆï Ó¨3фéê©S¼È¦Ïzƒx¯åoþÆ:c+¶>¶F°2Ÿ§ˆ©N }Aþâ2›ÁÄ\QJ´µðo @ ª ›ƒx =¯´—9dLb´›•öÓøö’Àp¦wáøk¿©«l ~e2%‘ ØIo#’²Qפg½ž|GäJß7›ûžžJØÃ<Ðàe×Íl^x±¸’àLÁè +®©ÇôeÕá}š)¸»´Á=Óò:‹ËZôðMϔy]»™.šÂÃ1­X¤üBÉHN1x1 È«5€k…:CO8.èÇ«A„JYVÉQ‡•¤‹äO‘WoÞZÝuFف1Žê‰8D—÷/­7®w½PÒ¥œ®!©Å½& :iY‘WIdҏM?>ñšE=‰‘&³ ûÁz¡»QÉݪóÕ݄ÄÙk:חfjÌ!œâZcÉÁŒ “’žléý ²“pDD™Æ`í«×(k" <‘|šÓZ+öÏyiþYB=X#¹¨*AÙ՜óvæÙáö3%8mxÂw ´È'­¤ãaa§ðºë +óی±T6Zsyuéª@ÝÉ,÷(b»ùùŽj…f}p‚j1 Ò¤‹(¸"ó<æÌ)‚§B³žµ­àE’‡]xÈíXêæÂç9: šë“wXÂWð:À´ËY §8@¯Ð÷Ú˒:ÉEŸdFò †5‘—0š_\‰¹%Áü¸ëï-2HÈ¿>4`*ABíô_k)B;ï¸%}«™ ôÝá§. —yý7™“.Ÿ%Ão7#—¤ bç9à#[1yˆØ±9؜Ÿ†Tç²Ç^/¡x¸ŠRûÒüS.™`¡°€$¨£Bö•S6yÂ)þЦá‡c³a#‚„2Mÿx]ÆàNN)t›YÅM†hßˆ•L:žÔ`æWȜb”ë°‚lŸbð ¦u!f¡ºz@pN7¾W0пD Pƒ€é o É1ûZÜ®¤‘®!®CQD€ÈŠ‚ªPÐpJ:H…f' +:Ś2D‹¬,$\ 3È ç ! +‘ÑFZϕ˜Ù†é¨ ðjà +x Á´cÛcdcÝ÷_¥ +¤Ì9û˜K&o8m‡ëv¬%ºãFûèûÐy1„ª®ñ¬Xo!ºfé×5b¦Ï,fçr˪h«´Xºèh ã%¸žS3uKCV• u·«¹øAqE»0 ×í2ôË+'ºˆùá¼»'cã%ØrQ&JBe* »Ro›:©7ì×Är!g%‰KÌǍýÏ”¼`®;I wúaèdo!^ ·«îØÕésiáZ­J6–œ#€û}6Ã}>©”åH\øËÙS€‡ +ô&—,qڇ ‚ô·áík)Ò:†@ö "¬)À~E¤LyWÅmpÉù!ˆ‡’ÁV/J76:¿;%ûª &¢¯òP·… +Åu “j¤/æ=¡`J=v©¿¯ÊsAj†RIV膴ìZCØ¢Y_.£BìS‹Aø·Â`ÓÒXbÞ¦¯—ã2 ) +LÞë”!á¨mn#‰æL0c„gö™Á^Ùp$@ jôj]@U³šîYáv¹<>X…ƒY†¦ýcÒ"$OC8Duz±EŒ^Cë zÒq"Ђ$ÞUP†Ø #‘òН1Üø‰ŠcvÃ1B©oò…£«\©RM‘™fÞ,ºˆ­_Ðènð 0>,öìÅp¨ß„¯ÐøQr+˜úž„‘í[g 5¹˜_ìî–û(»¬¶V+ôMM;Éÿ“ŒA9ÅE’ À'û FŒ.:”MF +õp&Ö| Óø3pebGA˜.µ+Ë»DD9Ž âXa„¤ÛaWHwËàÁr2„Á­T¤écõÐè]7ÐiéCþÔ|1+D¸ ýoJjâiÉVÍH„Ì'‚—0´µÎ»ÿƒ²P¹Çr%šæ¡Û¬ªTÙ+˜½ýV ^Ù0Ï/ìœÅ®lº°µ—KÖÕn«}eaXT ´ñs°P¿yB{ èõ̂NÿIà"AÄr§B‰aÒX¤^ÖDŽ¿6´=À—ó¾À›ïü4ô»ŠÒzx0ÇÎ>˜¢³Ç›J`l£¨6=ÑØaÇ%”¬‡½(­øD\T¶ ëlA‰šp‰½€¬’¸Ùˆ¡ÓãBMœU¤a4 èü-5 âOâV³ïÇ?)РŸúõ$æý?ª)ù®»XÊ/)—u‚üH Ët× Îí¨³éX ?úQ·è~¬dMZ‡šô¸äï‘l˜nqÿ¸ .ñ¿ý÷SýØu€²bÑå¦c+òª›EsÕ¢ÃIDV?á.‡ô—_ ÐFªhbŽ:•ÿCùȺ¡Ò× W‰™W Rb«‹"\zùwúºô‹ e¨IŒó\„}ã_¾×+֌«Ð`3Š1ˆ¬“»AJp›×̦"‚DÃÁ=T­.Žvkõk½Ó7S*ïä؈ Acl@ >Ù­)ó }ÁX!à'\H¬ƍLG·L(ŽU*Ç;ÞõøTRøº¥¾¬-_6ñ\µ`31ûãçӍY—žžŽ”Ôñ´†Ì‰z÷–h´#4“¾R„h¨LŠ®2ÌCJ[Ê-H#ðÖbÍg~ýíeò‰å $´›tÛ{iéØLø.^f¡¿ï³Âå–+ °òw±K7DÞ‚!2n*‰ÆˆŠ=QG—~>%y§(-l ; c×ò‹>ڎFJX·&yP¤Éíªý‡Ñ}fí9T„˜üø‚1ok‚f@r¤ÍÊ7Œ'T(Ws¢,Þ› Û¥Wªoq3|Ҋ(ÊÞ.â’ÜýÓÌÃæéá¨P£Åý”¥y¬‡¤JÐxjr˜ê u•H hõEÒµñ + !fn˜íIo») ùódW 귁ýý" ôX¸N:ÿ¨,£·öT*屐âÕÙ1°Ô€2²5ôd 9 ùÚAÝ2‘p„ö3¥^¢¯òÊÛ˗UoÑ¥0Ð*ŒLMThE2Rk€ÿ·m±3`]é``Âuð”uÅjÍd«âg¹êÛÌCeÝ=ÏtÆ¿õńä@ï3ÆÐfv„TrU=QC4-í¸T¿db삞*5lqú=cÌÙBkè°I+k ëô÷ÿIëç7h8v]1†#ò奐}·­S/f])ŒqÜTg&þÄøµ‡A­ ó³ûV ghyñ›ß²ü3ž•¥\ž‚†[(‚²j¨j„b¢$«¤BaùÄ@D†‚?úq­2f–O9qS<¿ñ¼ŠFÞ9»ë­bÌ@—-s­þUËÂòÀ3ªh?»„vMÔÓ&ʂ·!aL¥ý3tÚ¢z°CLd:/´8bͱb“þÕ~.ÂÉqÛà«Ýîiƒ1òÉ6 :dvg»&V»ËåÊ#éä²ÁkwaYNþ¿Öö€¥÷{›–%¸ße!ÚJ Cæô¶6cûlÖi)‹q +½ÚÒ¬ha±½3‚;%æßvµ¨ ;l&«n‡%o˜+O” ‰då…QsÆ\p‡ðº™5 ½|ÊvL?´ð')u€ª¹v,˜û»§Î&• Bã僵¦ÜÆÐs÷š(žÜ±ÜvlårÐ1­²Ó@»ö^—¢rNäÔcPьFýǶ‰nÁ’êP1>ÿ?¿Nîsé]1ì„ç¤$DO°|[³Å5WåÞ ä–{¢æSÉìøª4Pù,<–îõÌȵ,¢ÐÊEý›TSL]ŠC {Þ4}Þ¥¨´‰.è!f™£¾ü '˜S¼mJ, k¯ü|CÅ}\؊axüj`ÞçÚêãÊN%|;ç7Êùí:Š [nu³çóWû7LÛº*4ÜbÚòoWƒ»›þ¶Dæ·ý8J>}o¿ãþ*PõS ¾ïËXÛ # üðß´@«‚u.©Â™`2­?1:D¢…“ò¯wœõdÜs ¼«+µ0àÝbùCÂþK?að#ö»‘=©õ–Ã(Î>îËdدc7Bǔ[ cIi]CU¾¿˜~×UQ”C `ž2þaì;M!Ñã"ë ÖTàoüG¤Žu žÈ¬ÌÑRÒA,tÔ%hÒìxw;­î<„ﲞƒÃŠ°»òÉôb£‡„| ¤£âQ>Ó%¾Yþ>Zò™DÀ‚{©s˜fJ‰P Ìm¤4:QüZފ|Z¿QíÂ)IC†‰¡¾ùÆq‹-…pðy¸7Ð2ƒxòGéô Κ‚J§²D†ÌW`’³ÀLù²~¬Á8CÜT·’zQ“ØەL¶Ab]U¥^^Sò¿A6# D\Côîƒfc£È\ÜâÈÙÙ°jùzÛS‰;]=k®ò£¬©a™±æ´ ’LXy‡µ’&o¦rMsr­høEÆ"$,¢]T*ý}VáÑvY£G4@oå¼A¨„ÄâVZaZÁëGªM×L¡ZaÈÅKEÖPÔycÐ‱ú‰dŸ¨Æ1³¶bÿ¢µVñÀU̔÷jÏ¥ÚG‡5ÅÑpd'E_Ò[¨f¯µ²ùž5ÉÐ[&¸4n­ Œ3Ïú3ʗ]}©ºÄK6êc ÑԷ홱Aé+*µ=à\g\dêšh쳺‘gÄ×qC^+šâ•¯g1N³Õ±°üÓ\<Ìé˜ö‚;]™ðœÇ»ô#^6lÀ“-w~ M ùäԟx22)‡Y9WÛìsðkûÿã ¦¤šÈ⽬/~çë‘}¢lŽÖÕ $Œ˜‘aR£’ +èÒù¨"y;Lä6†F«Š0­Pþi"G +ìèĨì•0 ¶'±_ÎÛdIþȶà9ÚHy¨,=‹oó÷ÛYå5Ä ʍ<4¤=(>ÃÐb{‰ó2T8j)ǯJZ+¦rRÊßP¡ðŒ×”ðW‹àÁw¥Šš?rvGH¯­rú¿%Œ¤÷‘‚µñ\I˜Ž‰|‡ò.¸›¶RçìgëµÒ«"— -ê©.ɨ.àÁÖiÙ +w³R¡Àp²²éM7Ž2M#_#6›H`ò̝¦J¦ñòmÎ7´¶5N W>#…­à¸}i™gf)x#± æˆ±›úV@qÅ 0¹(­à4lûÏü´«úð÷ÛÖíý·ÕH8þ(—%›šûÊY5‘ ñ™/ WÏ"Yçhä{&Ý2úm‡Â¤Ó¶íqÜíû·ÜIÛfŠ¨(e° +¿Âm?Z£*ÒÁÐuG©–nûEo+û6™D©Ÿ¿ø¸ùm×¹,¿à€{ûžÞš.ÖeÂuòÛ¿ôÖó!˜(ݍɞ}Ç.á'1 H׏èvÜÄ©bkFâEêæj%Ÿ‡„4Í37¶Æ&ó0öÜgßnRýˆA|ÉÝњ¹’€(˜¼rGÌ^Cìz;9ýr]5ûx2< +ÂU?*Ë”;ŠªÔïâ½wèт±“©xp ¿Ž†):šÿ·ò5I—7/jj ñ—^úéÅ|xçZt Ǻ±;ٟ¡m %!Ye5OµaP¹`¨÷ò a,Dö*ňŒ$¾=eÏÛ V±0©ý iîŒÇó—®"Ôð´(!ÿI BEžªÛ5ˆ<${DŠЍ½ãü¤¹F·5I(%«M×èZaNʕQÆ{@Áúà¸ÐD‘ü%ú0¹ ™´¯ox;^,[d‡Û = ïA!‘¢GG ."Ð3­ê¤ FSAH-mlIJv,¡¨‰/ìZ±Ç8‡Î/ F8"—fJ'ÖPj¾›ôE²85ýBHýG­€^;S¿[B:ÝzЩì ´éÝ£/.t™]–8—R)û/?˜ #N`æ;V|‡ØjMÑ&6¶dgÅ(SX9ˆ'P–4ð~N‰3Õžnç®ÎX +´½ìx°lÞ5àp'¼sŸb]¿¶ü1w¨6øYJ43[ _̈́ûÑ1— –ºµ½èÍtšíAi8€u_áå˜cB>²èǬם‡5~Çm°Öq2íÇ&iṲ̀þ=­¨Ç¿ëŸc;k}„5@H-J{&#ñh–Œy·]g¢HÞ. ¾˜Sdè,LéՌGOaåfxàÇÃ%jÁ„¦&}zQ­‹ÉK@!Ö)¦¼Èð°ë+Oó€‚hð@Á£Ðq9R5˜õRQÏ¿©ä! Ù6‰ Ö£…êîó;n¼2Ñ £))<·VÁ6šR*/(,¼EwhŒƒÔ8†t[¡xH“ק½uIo–$ΖciÅ] Z¡‘8+}ƒõ:cé &¤=_úÍö\º·p×a]Ãه\Üâ;K¥™¦ó5¸cD çÒâȝùVódÞ¬b…Ÿ‘¦ƒ›NLf“®…ºB¹¬1Œ_N£q™i¿$™À¢ÿ!‰X@?ò’ŠnÆ7‘‚qÿ[÷`‚ä1C+Ø%*÷ItÈ _Êė4Þávªv2rVÒïٍóŠqÀ ºˆÐoÐ`)ä"JÔ _ü%ñN7F2ÖàtÉ €syÁ~ï©@&s÷T¬Ö¨Ó¿V/éÑK +AØÆÏEb)1…Ú¬ÐìÅD‚“ðIÉ£7ýI1¯S¾\ŒŠ~ÐXbá3—AT„ð9ŸÅÆLaâ,ÝÀíY¶`ŽÒÖæ ‹t(ÜɷL¦ØêÅA DŽû !iÙI9[·"Lr%&æA>Vëeob +×su*3QŽ¿«ÓŽ3[" +T¿*NÜ  …pœ%£r‘Bžª œ’¶3Uš1Òªt`K˜RۊêÀ‹¶òmÛ瀂Ĩ‰"S`Zè6GSˆl¥$´Ó¶­bTk¥áZKہ„ŠÎ „(ÜU¨ñRP¨´ƒÓCc ˆ„B1ì.\žÝ¥ÿ¿9íÐ#âÁn4©hÛ¶#T:) +ZT­€ªˆÊ%‚²W`U˜åHŒ0‚.´².'LfRp +Ä­*¨€jTxDL<¶H”Fð™p#b¢¢1#&¨š ¯Ž„ïܹ,Ó¯e¿0ô?é)^K"G'sÿBãߝ;½‰3Ç Hp¸lMô ÂÙãª%G½þ£|GGxô»ê¸4C›6Úu;µäJT9¬ë²‰Ö7´›®ÏUê +tÝ»Žµkgv§vm­¶uïÞ-×îÔn¾Óå^k_Ç^^£5Ë×LOí{êût]~þ^î*ðr7ý­Oë±ÏV}ÿ¼áß îåâÕ÷¿\~¹¼–_.}ñ þþ >lf¶¹Ì®»C<¼2V嘡 +ñì²´£-ff633Ûff¶ëîøøFÏÑGòð]¦8ñî|DËÅx‡VÇcƒc¦—y<:ñ؋ö‡)o±µ€8&ÄÃ|Ø9¬€8<ì˜Hà,Œáîґ©GÃ5pÙ50UQ ‹Fµœ´ö +F9>²}Ăf‡$XÎØU O&øɘ‰õE˜cØP39ãÉCD‚Œ”Ã$ÈT…t4 ͎úE‰såKf؂Ƭh¤,EÊã ß #ŽLfž¡|·“4¶õTœF*TV…Ì8ŠÞö¢¨d¼M  Sp€’`4 ‡c3=VJ~€** +v2A8HiȯîxÞ¼†H“ÉJÖ-à)†ˆ¢1€p£t¬@ñ ÈpÐ œoŠ£`§ot¯!Š”Ž{я@ÄÉ9«Í¾‹,ê€5M Èã3¸]‰9·í‘’®±zOÓ8Ö~Ÿs¸­ð»©¥cn.cýÛ°/ì|‡>ªB›qM“‘͸’išŸÓÃõݔ½¼zqˆ¥ž‡’[É „´á\¯Yª+ŒxƒB8'ê·ÀŒ.†‹8'†ÌvK\/'ÆIy¼”n$7rº¬k˜¤¤Ñ³±HÃj”´‰ï‹°üü4w¨|<³ ºœ>(I†ÐQy4‹hÉÒ¯‘àpOJ>ãO§Ì³bEfý§Â¢tÿ¨½*Åyœ>œ¹äŒètõÌkVXœÓ¦õpM/i@jͺÔ>-PŽ7âЊªgr£ùÆ¿×sÎCS‰Ú_2kúÖä…xâú–n¼µ§é UòËrK˜;ËÈ8ƒRWcÈØûFo¦- ‡g#ýn’ qEZêj—¡tÆ:<çˆ/óc÷š:qQyE^8¸1Y‘ —±yÕV 2¹Ú8ÜpÖ¤ŒŠã¯‡Pqpª–¶£+Ó,<ò”?™œM,,B„³iȹ³¿^±+äˆ-–t)7ø6«êö ËÆ¿DèŽhû–ßæVu³nMj$8þJ9 +§ÄPp£V|ãýzŠ–A]˝|[ˆ¼<ñË°Š*6:•]ÝWB`(”ønª]ÃɃ6µ‘IÚ0ðgòe¼áªLÔ®’µJâ ÚF¬}«lB™§­Fdúÿ³zÅhNSW˜¯\ÙUv28o˽áÈ߉h¿o6Ý{zzý=1ÖÒ¾…ôcέN_Ø£Ä5ûO$À¤¢ªïÀ MÚ2#]]Ú«M!¦¢h´ÙP³)‘ÜH½æð)qåš5¶«BŽ°óf†X³ì)Úi5©¤šj„LéRyÕ3ÌWj1AMÊlM2‡ÁK"¥ô;MÔ¹_”²Á +r—ÊJÊÊ|t–³ü“c†åúðLܖZgF—~8Së±ß?I²™•Š9ìòÙNÕƒPe™)W†>̔´Hœ{˜ÓÄÚµ x=KáØ.ә†¸n–Ië%˜„…*SÔQ¡Ì,X†GìM˜MO|ER™eŽb|+aÅÔºEäZMªœrÌ0 Aƚ´?žZfoYv’ÞŸß`Žõ¸çÖX¯†ÚK"C´RemÎ*¾Ô;`{©-4z©9@ªÃà ¨¼¤¼^*±£*ô;ÉPVÀBÚ¦™ne9‚»Lá‚!·1….=Èr〈Ü$0Õʌ-õ`k9Îm â‰³\¨e•F01˜¥Uö†*Kšdu÷­Úo YÊDý™ÆRQ +X"–¼¤yaٖYzËÚȒuæ”ø»æ¬O.xhÑ{ ±2Í+<`Þ'ú“pRif•ã£öÑƔU•âÁ£2ª¯ä*MeK€Ùi¤K*›tqæE%ŸQxÌÝù-iJ¸xÒ}¨…Ìkؖy)Q¯ÀaLNØ7)%2š””M~'-ö#7[J j¥(UÃð¯T´B””y‰/ÇCbÜPR±/È($p8_…ÀN÷¡3ôÙ 8ŽO(37T&‚äíôãLÒÄ|ÌMÄPžnMöwU{3©¥^%29T‹/뱑(Ö [“C̯P¶¬ä÷€ƒI%å€nWJ +J* p@ä1dcYÄISå4‘ÖÃ301ÐÒ®äqÏ$’~ +!Y&Ù8 YJ›×½FiòȎÑ7ýL¼5Œllbv]¤|­Ê"…0Í4Ä@‰†íz +|!9Dq”=“P_)"Eŕ ‘ŸU©«®pÈUÚL )܊~ ™f¯¶Z yuæøؗÄõé€À€¾Ëü†¶°_|۔@Z²h…¡Ï¾„£Ý7"±òÅøã@¦Å§Ž8Ô âAÏ¢dïÖݍÿÂ<}t³´CN†, -¡ƒW>þt°4Õ~uüx)ÇûÛå¯åéÇ֓Ó;J֊~]<2 öԎã=Q«—zðp~ dé¸Rª…BǂiÙuŽú‘ sd×r(Í*Gåôï嵎ÅÑèVÊ"õe4VåeVùÆÝçû +4qðùé¸n´KãBµôVÆsdµÖîŒlj)h Zñ¼l”õ¤a#ëº`»F™Tˆ9>VU¿šT‡ŐSé6ï;ˆ+'WÌ#;ûæ[§‡uH¬6Žþ<£ýÌå{ԓÚ,ûÎíÕ è/J|#˜ŠÓîbÆ ”3–QUñ¦sš7ÓGŒV9.¾aTƍSî´rž¢4˯?,+L¶‚Ñ ]Ð'EŒÐ¨ xÑÁZ˜ÒÝ.Þ²Å"U˜K)‰yöL¬Ô$0;L‡ª†$6õ©„4Á% ¦’1DÅ6Jû‰ÏÂjË/Ù.>4µe¿]÷ŠÝ*<Ñ@dãZ±þ3¡Ž AäOk4ûQ@YÒÎÎÍQÒô/ËPÆ{ɛ«X>| 9 +ÂÈÔ©ñBl—dÐJõ/[4AqhlØÚtkŽ%üתHÛ¤Ñîn0)±c)RH©Gҁ¥ J¿Ay^c"`2.¢k滺û®ÿeîlé2é ]Þ㔃™}™ô™ç¾'¸q{ûèÄ–oí·ÎtÙŽnbÒsU@Dlú¯ê»ÜÁ ®TücÀMó)»~ÉÄ+O3Yšg„Ütƒ`†™KÁ»‹b( *%B1ǚKsÞ&ÓZ jgç1«°à;IX,c¡LpÅçp²ÀœÌ=‡n”Z«Õ‰jžÒú8Zel{lÌ¥Ô#½5õzzÄ +§6˜÷id‚rñAµ"è#94û’¡‘ÌúNÙª=Ï)˜h\²zÆ¡R™>}ýÛ&—¿Nz,úp‘MlÆt„ 9z:‚1¯Ï̙h¹p-iàIûÁ§À/zAI®Pt\éߑŸâütñ‚æê4›„6 Žî§~85EÓöSžuñc>›| i.+!óhÇmŸ²Z= ߖ«<:zbp |·ÈÞ[¤ì¨~ì¿ÖŠÔ=nEÁ„[íÊø6iµç×âñäUc&=þí U­Ô9á¿YïÀfÄ-çoM­ÉPuElàبòo¼¤tJç0C ªHø܍bùŽIÄaˆQS ^À ¥û ζ\Ã8Å¿ý‡Pb2›XԊƒ'kø’—.¥7†¾`ߺI€Wü8³r‹È`I“ßs”ÆWŽÖ¤²Þ®PoÏ¡—}µ£È¤ ™Q)‹•&"#µg6F˜5é!’ò4PŠ¼T›JÍf–ñÁ!5ÐábÅʬ®]ÑÿðîxÖª€¤“cξ€Ù»™¹»EéZ ­ õ‘{TAÒ¹_¿phNê°¤§Ó@²Á“ úg9–ÑÓë«<V³¯ÜE7DçE‘XՄèT”ҁ9‘îaº'`ˆ|öµnkSÒÓµæÕÌê/œ8ø¹'ÖÍúÀ`÷Ò两ûP‡‚•-é)o‡—¶Ûêu—d:Z™q (bÆùƒ8X‡}häc¾Zà'˜Ü-X5¼¤ÇtŠnH@¤2#D‰z/Ã?Æ÷꣧C• ö:‡£¯,XœBè:)ì8£¶¾M"I 7FMy//h„Y¢‹u“-Ô ÌŠnÞY“À^X]täDØ.ï9É°Ú«¶¨ƒ5ŠŸb­·_>]Üð%˜m£ÂÕ¥¿Lž«…†Åâ½²°°„Z¥ÌJ´?“E¡>LQ»Iþøž½Š«Š”Eã7¥@át ²Rsk.ée荬z² Ò)[–LƒXb /Ôµ,þï}R#×ûü“9<;°_PRè=¬SA…0dwڄ?¤1.(4µ;¨ÓÊ"+¨EÐj²û]$…Èäz‰°™‘”áÍrJbKzTK÷ØNjÏ_”U§Í±ËªŠ½87"$c©ž+†¯Iü„MÕzûœ2 ,1!#r3yåxÔÍzè° +‡Íi/k©µ9«úò[°¾;ýü©ÔnãVQn„[q`y7qȪÃßf½p>—+ +' _,ý1ä +² ­+–,ID¤ê‰Þ†{É~' kH,©íÐOÍcüQˆ¯»#ór&XLJKµòòoP5-庿?鑯q®aê@$´g„qmÓÐ\vdb4‚‡¡ORî +²¨Žº Ir CKw'dÀ¢lÄ(<îfÂDÕu¬™Ž†sø×Z~Eìs‹v¦O4#J㙵%šDXbúD[ΡFéMÓOUEOÄ?yإĦÜ'†àw–´¼;80tì͒Ôñe)y¬³<â~ý§GêåŒ#Ág=áÿ_º;êاìòbN‡†mÖÎ(;Mé)ÉÕ»Äbâ8H“JÛ7;£hðØS™ÝŽ«%`М|;Ά¾/ /ýCáUö= gžˆróçª$à¤/aëø{6$6‡‘~Ö}vóst +Îø×¾AOé¡-Ýu°B²£VTå“DÌÞsÌ)ïá/íÎË¡oq$w陊²ŽH¦dhz?2’J{NŸýöD@ÆdãXJ••\ñDÀÛ\´üÿ‘r@ÚµÈM'†ëÏÝ sî›jˆ‘d{4î„LTæ!•)æÂãD^HI²RÅP–õzútÆ:§Õ4Ш®ÑwÃy¤²Ù»•µl½+Ô¬‡3‚&Ÿ,AŸ.ÒÄùcUF­)¥Z{¦<„˜EØÒþ\nÂìNJw¾öÇ ÿüê#®v™¼õäŒhùjË0|#ª*T/z«ä6M +¶‰ü ­»ïW·ÕÎÑ2¸ô¨JO_ ÏÃBÏýú¹ÿ1­. Þó-NJ‹4Éò‰a8Inљ¬Ã€ÎY€¢úOÛÆ-bqA $ŒÓ,³:!z$n8{[qÒÝ¡[B-&ÖhpLÏ]ÜPä8@»X·ómmŠn‘¦SUåþb+,äÕ˜å!“lEÛa€Cøû˦Cuî©éŠ“i(¿TSʞ=ÚÙ}¤Z°„?úãr||‰8¢`¹Ý§U_-äL» ì}¼¼ 4Îaè *°Ð5[4`ͪo~‚½wàiŒÚ£èø‰ÜÄ4ü)¼èå j%¦‰Îo¯²¥‡Þ“Ò¬p‹ý“iG°)a¦tª'ŽöQ•!…_d¨ }G48ø>ïÂ.߈ô¥þ~[5͔BQcuðüÒÈÐÁ‚ Tä…>@ÈÐÐhË©cˆNꨱG-!ËÍ8Kr|÷!ˆ{ƒ£<P\##KßSºƒåæ¸þc.ð (¢Êp•”C“€Ï Ê‘²/u¬ô^º¡Þ) ×‘…åEeí츅&(¿R+NFUäÛy8)¬{d6V·çÃ¥ќr÷U yÏÙ\Ò%#^µÑæZmÐҌ³Ôø[J¹0I™àöß°†NCoofA]i Gëì¼v2Úª`ÌI¡wņý¹†ÞR²9˜•Š%X:f¦‰[¬!OšTÐñE|×ÙZ› =tl•¦Hƒ¡Øñw–¯ã¯%&ÙÖĜü MȀþ Xe_ŒZí6ý^/âÑ ŽwËD€›hænjÜÿǁtʓ2Õ­Ôj +†]«„Ž†ajïàñ¼•Y°=o³¸ÅyÖ²æÛ£H’rh×T;© Ù}¼qJ¹¦y$ Ñ&äíX˜òS˜ ‹¼'!)wƒü=ÄÝ*h‰LÁ1£Q²·Ee´FkžÙÐhÂl9±b‘šÞù%F¤\ÄÉ;úýÿ…H„ˆþþë¬\dM1/1Ìjô͹ñÐ,¨²ývªä…¦CŠù”r¨Òçl.+bœŽ„k-2¢’à]ÑP3 íèª%Ì淅6C²t¶ A"҉qÐ-·ª½Õt`H(EOGº-Ÿžz 3wH +6£Àx-Ä;RX¨ô!†F`‡YD.$\ZÌJ)O*ÎÕ#v¡¸ŸA;BZ™mhÅæSîa¤m.? #õA³«9ÒetìS¦)§)ÐÇ£«l6¡Ô¤Aw×zÔq%]®‚„¤Q^9ŧƒˆ^GQdTGšÁ‚úåÛãUzq²ú¾$ÊYǁZY£˜§ràú ’„õòåù#·-òZƒå[¡ÐX ÞÔ,®Ü€µæ€ï€R<ªlŒq +)L«€¾s Éݾm…yà·M€TҐ›Ôørç}&:M{×Íq)ýÃv–Ï°ÂfüÃ×Uµ?†Ó‡Ñå_ɞ” ôóқZÈ6ÏÐ+ðùc¨‘€ªTyð'¯«Éýè6ƵÐ˟ØNJ¯Œý,[KýH휄~¾•"nøTSËòßyzÄϔDw*Ӕ)‚Ùà‡Býî}ì'=þlðÇÕÒN²T‘Ñ>½%¸D[ÓÅ>ñA´>Í~¿µ‘îõÙørÞ`¶uúO0òÿÑlâ#þFl'šeüéøž¾,çIâž5 ¬g{xÓ—öè¤ÛUöŒ£I=Våjz_µ½Jz>¯èÛ û@Ï+‹=O%wÏs‹mÍzÍ£‘Ýʓ1ϋ”©å¨XCŒ¢²h“òŒ¯X^¹äEví¾G>X\êg0)i ã1±qÄ"Sñ0*Igñì‰jxtÁåì¹YŽ‰Ó^™böŠÙW­ú B8/éÖ¦6ЭMúËúž¶_'9-Ô¡„¼![J®¨¡óä<‚âüKÌ›Ã?x+H1˜G–R#9˜(EÙS µñÉ°*ÔSåLx ówxþPF!%âÄî|˜ÁEJ…%Ç‘çRS\EP +0ãØ-‰¥®‘±Å1EDzJb*ˆ•i3|¾º^áaÉ%ïËOƇn–à) H¿…dŠ§Æû‚´±R jLѐ"\L±oPS’Ñv"^ò‰¶çÈD/ê +ßhNGŠÖ€+0¯éi̱UáRìÝåc¹2 IzJ·aÎýòཚشì”RŽ +á¶áPõ ]Nœ4b˜˜ ƒ)’å€Ô¤1ÿ&KÞYX…ô‚téT…wÄ°$·Î¢‚ș3öRD >ð¦^Š’ÇlFtÀ¤IÌ{)zŠ‰À-úàK‘\a h3 q˜ñª&JůM?dÞ*‚ï€ 3UJ†²\å‰<1Ȳ­¿õÓørê“@,Ò¥xBSu)r˜ŒlìËàRÓ|+߶ˆ¸]Š)ÏMtÚ¹Ÿ¿[*‡.·.EHùºW¼E’6Ò%-Øâ1/E5è +š±Ï8HG`dÑD¤a`oUÈeJ ír­@¬ÿµz7 —"ZӐ¢ÛpËô˜Ï°›Ùý=¿DA +ŒšÑ‘ëœè¸…™ÿéó¾š-EJK%ß[6nY´Kx:œt:vd%Tµý!a^!òu9zSù:ôˆb$Œ±ÑªCMâ‘æW9iðîX)Ɖ™„w–ðþIFôøsŸýgê`Bq´ÎIžZŠšpЍôda…vý=,ž²{ŔÕk<ÚÂÒÔê`]<Î%M¼ +Ў_­…0Þ÷ t‹[É^…¸[ö+m’?É rýé/VŠÇcë\ýŠ«Bi‰ Éøiî½ð÷®N7®“'6Ì3mÛՌ.vʕü=lj¾Ë¥¯2ƒ ¸ o{„Bt Šù²u’ ®¿JÌRôV"ÝdªI§Ý'†¨kéðdÕ2@.fH\a:1K±33™ç©Œ–¢jÞð`| P‰µNqŸi=9²Wõ+—¿™'z™ ?³oeôü,ÅWñ[ÏØsÞPZ–¢‚{NÓÉÿÉR¼|M¹:6nÏLm¿„|fצŒúY҃RD–|9Í–CЃ¯£A ^­u{­³ÿ~¤XŽÿÐ"í#P3}hݝD/@L…[Ù ]ël~&…DsFj؂'ZQ0­X¡²Va›¢D<¸ ÙàŒ$­ð°\¥{ mX­ŠÅ¸ÒXáÎÛ Fz“…±R´lšÈãOìürh|䰁kMëÐ@šnH²ÊIßhG_½‘£n¬»*E*³ÛC@rüԃ'ÚI÷_”|Ém + ðå±xð +ZIA®ÏI•@54”öƇéË +§þ‡²…ºóõ‚P͚„ik*Å®ae‘Ç©Cðõy;‘ž:ï@,ËN“F•â9ÖöM¥È“CFìi1ÓªâuŽr‚>ԗ’ü(Ï gDêï•kîÄ£Z’G$Á>‘Ø°ÂöDÆOPHdüìÏÛ˜#Ò å!ädP/݋:ˆiRá:‹\1 +M-˜ k«Œ¾Â ÷¨—Ä@ 0UpTº‰å@· +ž!È|_^¡Ï?U=Y‚ó¹Á¢f”-À„·4-+ÅMDÁôØšMžâV)îÔ,&ÁcTøC¨h ǚgˆ0,TO/’VŠmÖuˆø x1`-M¿®œö¥£[[Ži…<3¹P{äì^å‡]²`…, nªÒuhMÓ©Rt×ѰϳPBFÅãÉiöM&*:”Jò›Ú÷”¢¾_ÝÚw‚WÓ·QΑ€kÅ÷¤Ha¹Ýtêò›Äíó :´Bà²{Ch ™oJñò]ݞSŠ‰iÄ¿)E†UãÛÄ7Àö@Ãx xٔ"©qŠq(͆J°láR·ÂøX½IÐë­,ü+²ÂÌ?¤ðÇ1UP/c^KË.ßÔ´L¬Xՙ>æTl$¥8j¤ÃƒÐýÄߤÈO܀åÇ®OZa±æ +FØà¾d£‹”“”¡ëˆŸuâ]=A00(ðyJ«Bù¬Y¡æ†ŠŒRToO]¸2q8ˆTa!å Ý¼`¥8J´t+J ƒÛò./¶BÀyw)ŦI“˃G)jÍȌ ÙÚ"tpÐT%@YRŠ'ÚHìÜï‚í> +;¹K”ÜD¦Æç–^’ïÒÏ° Œ‡¶¯Ì= +öM/ú ¨ìð¤<ïÃæ¡K·±R„‹ºÉHÑ®g8O¬PjRÌüg ˆ²¨kÓ 8†à z^ÿ+'*Eò¨¿'u+T+œº"¿¦ Á UŠB¡IÒ²J‘<ûÑ À´*d [†s8øUl:ŽàŠGõ:­ª+,~œõ=|êíRÁq„P"‡)P;eÍÊZf;ÆJeÅ = ›.JÑ8qaʾa˜¸7æɉ´nxÁ˜Á|aìzéò³Yu+@Ï6/m°´WªæQAëå•1ÂÁy²3\ø7YÈZ Bò&Vҙ7Š3Êy·ŠÂ(• ‹8SÔ(DWJÊ«kïYEû‚ÈFŒ3UdK€ nEýjN^öîñàŸ·³ˆx†Rn,ˆ.PÄz)Ñ0ØæÀlS”Yÿ¹_÷¨À¦|^¦ "f(í +›?cm˜n2Ìfï‡qÀˆÓb³n0.Ìü¤ 5`‹ŸÌjOxtƒàspDÐyR¹ÿ0E6óËjJzÂ=ìOCýIâô§4yvu">PmøŒÖ¶"ˉýÒLl×ú‰’oƒ^¯°—D +S~ôR¿žÿ—.¢Œ¤G”{Àjҏ6*6"`Xß@SKmU¼©™}ó@ìoŠmÎoùà¼[v’DÅn6UÆü·1å×o©»7!5ˆ=¦A…Å.–ÍúœÆOÈüɖžGüä„Õ·ù+^JªAdé×Yë Ü1Á•Þçwé QR*Öû›ÚKR퍓°½Q=ù{ÌPRϹô* ^/Ûãh@#Ræ§r,,B`zÝÒ֏–f¥§üӑžHd[ß:Ÿ§•Ô,ú÷ÿ‰qž¼ÁÙ"®Kó:÷ÝʼDR‹YÞ²¹›=ù¹³=*uÁ°âü´û!»+4õ§öXäÁc/®Y×Ýñ1îo>:·ñáOŽäµP‡T{"§‡ñ¬N\lñ4}2¾\Éså¬%qR< Ÿ/((\EŒK±B§[’ÜÄ{í…×SÄ»¹Å}†Õ±™¸ ñn±ëºNëçvrxõØn´< Ê£YD¾¡~M5ĝ?“-"€Dáq‚A0&„™aÅZGkBxªô +.Ãu´HÕ±£ÌàY^1N ž®¸W¼ƒë?ËòÁÍ<°K(”½Ž7ãQeŸƒòžxÿR˜øcgÝü„ þŽI qÄ3©yPQ,5Z"ä> ܖ5 øAE¯È©«Ós«‘Ýé/ï +®ª»Gàˆî2(¼—b%mrî>®ªí<¾“.éÞDbÔ Àí +<#'™N>‘`ób}’¶{o˜¶ko/º^q Bƒ, M§Ø‘v”î¨j"£‘H‚ÖA; +f4a +ÎN5ñFŠ:*úÇå&çCФ¯ÉQQbÞLé{[( 5ê愣f·?rfÂ|ji´¦IÅuCé`hV­B¨å÷È8W-_0… +€À)x–T1ëIŤ¾Ã!O“ÃøŒÜˆq€8Gs¶¢¸S„Ó[~•æ­Td6¡¦„9Œx‘¿†ðŒD¾:Xù¢æy%ïÔmÍ$¨ê I,©Æ¥†ú»TT©,éŽ‰Sæ7”ß9©G"JM~m´º¼’]&X¿£`w–„ˆÇ`k0¤|_ѱÉÔM¹T¬ ](7ÄÎ"jR¥®ú‹Ȗ‹‘+b-&Úö¸Êå›Y҄§Y6¡—ŠÈ”CÕ±®|H®G¾4`÷TÀT„Kx[–S±^„² ñ‡ÊG¾‡uþüEŸ9:É\!RxDLšBòzHÄeÏÍy‰dŠ6SVØã`Gå1S1ÇJp<@݅úƒ ×>¬^ßùÝŸˆw³ˆç iÊT$<ɎLÅyíͺ”÷E¨|FiP±'Ó2 3µ€ý†‡2gx'2v™ŠÚüÁ5¯•41VÆ.¢¿] 8SQ×®)ZEï!àG˜‚„ã= +Æô"œÁå•ä3oSP£ N‘ÉóëŽè²ÐSÏ:4Ž0k)•k»6Lf I0W’6ÑJ&‹G±P™ÛÄ-ž¬2gþֈ æp…$ô©Sq4 üŒF¸B·ð@Ü08 ü¯fŠõ)à‡³É°`šNk9¡…Á1ËjEŽË ʆìTyOE• ç‚8«$>eOG"·q›sÈòúAà讚T²±‡Ã™Ó†ËOÀÕjÇðÝZaƒ3kR¯Ã,Û |¬‹±‘*£Š¤×½6!§'å”ùÀ!C-ÌàlA,6‚âyü?8lMMf„àˆªÚH8XÙõ©‡ª¤¬  ®'ñÓՆ¹‡:#ø.W&¡=!w‰#Ø0$gkB° g#pxão°U-8Ò"f‹¯ü_ú˜EHÔv ·ºÄ³É(=w^›*’"׀*ï!ßT‘0ڒ;Çðœõ/YØáœ:ôÝí)/í¶eq@Þ!ÐÅâƒSéCl %aQýØ3úÀîŠO{eTE¶çÛ¼*©Šp$Š@æpé±¢‚½Ü#´ÙQôiðÆÃÑ¡|¼Ùul[è†Ü*mFÅÀO€AcáëTŎ_âñØSw9äCDýå'7zÎòªŠsõššLÏÁ +*K~XÚ¥tËB9è+CÐƕÎÃ2 @Bò£‚e2D?ëª"ÔØI Á€„sò¥Ê*3Q‡T}9$o¡ªxÞIñÂÇä¸YÏPEPÖÀ1iê¯GïÊ«/<%ºˆªŠ–ê¿ÂJU#›O˜¾¦1¾aÒ=#qR‹¡©‹ýc¥ï¬$^¶²E¾º™i2í,#ŠAiTõï>\–à{±.Õ"t2ÌjE¿ª‡ +ÓCO+&~ÇÑĪ¨5n‰3ù¤äH›GE¢Ë½:)O9lD‡;î&椙"ÐØY-â"tvklsäҝ/ +«½_ák\6çÕ%ØÅU±ú87 ôVÅ\…°ðÒ¬I ô·ì[‹‹n7ë×ì—zt¯R ˜xÙÊ©Š_ñj ×91ÞQH¢‹¼ Å:¦úùFâ¸*"›Q4÷…<$¤#%zHèpæÑB¡SJSÐÔµÀ•øB×Á†­ŠG³›+µÀWÕÙp×AŠ˜ õ—˜F‘mu|:±tð“kU\‚Nç:#ØY¾ o"´˜ƒ¿äŠôcě²rUD[)¥Çq…¤ñ›!0Pîh>Q‡ Gë}OÂå«zŒÙ«b—'Qàs>lº´ïî)ŒkÞ=<>X’á¸Ûxuñ„‡ƒ¯XÅ öÃKa3ÑW§ûÕMJ(ž\ +«(DTHr$´‡lò|LÂ`î@2èÈvëž EÂѝR3e0‰»EFŒ„N›ð’„$ð]$’ZZégI¦@ø(1à2 DøZ‡o¤âc4G™U´Û_«œ_As€n|œè! ¹Î™ÒH8o†V‘Nêj+UûŸÏ3‹o(” '¼’iBµŠtTßX_’ðk™ð§Cˆ`Št ÙçÇ1Âï1ID2 9µœŠ-¢(Vwáþ1 w{¾âÝÅX~[Ä] Ž +¬!®’pêG„R‡x¬Nâ¡Ò£¦-'5«ÁP³UÙ;léD®è°gs†(¡Ðfe*mäç~{æZ,^è*i²¹ZSƒ¼·”ï7Dº}݀…2|@·èmN5Ý7Ž ÏUâeÖdÉ „‡'tÇßùç÷ô†ÃLg +^@Š˜Óž‹ ‹b€1 ‘¼Ú(£l*a=i<¾6‚·Jèià˜>´/Ê:±CH23{­W1Å©ìeà¨h)®¢Z¼ñ„½n œ!Ï3å[ä&µ™áW|±ÇÔ=ÀDìÛ:`ªlÙ{á×4V\»µ¤„+ݎ\ºŽ^Tz¥™EqEÜÜ?ÉÄ!Å{(ÁßbR8!$ÆÇWq¬p̬¯º*J RïP…2ÂýçG>R¢æó-±ÅÑ eÛY­£¦³Ï·çžðQ!ÿŒáò;úæ|f™à‘¯â“nl\6Նºð.²Æ`^. ¹þgxê5S£D©`Å zž< ¡g)2à÷r"!–·®ÑÃWȅò4~H¼Ì?¬xȉ‡5¿‡:‰ˆ¿p˜.F@IClGTvl\÷dAmü+bÇ+Âü„u=s-#\š¨T,¨:|L nn¨I£¶)† Î0}°¢µé,® Á*‹ðS(*µUÂ%Áú`yX±äºcrÆQ¨'˜5õ4ÁQÌOa¶t$´®Û»ˆˆ‚Ĩ¸º~q|•pYÂ×U.)XǪ—E@6šd-TÁ S †P4ÆË'›Kš3ÉíbE7'ãÝ[£?÷8”¬Š®a4EáÃÌ*ö¡„²"†¯>)þJȊ¥‰¥ý6\2N‘ëù¾G7eý$æË)­ºÄ Žíá•cEBc¿òC«…#ò—TbAÝ%Éb2bí6wDÿ*06ºJ€vîGf–*M — ™±“D2ÓT“ˆK«úÁâǼ„êçÜÖ󮶲bY`^‡]¡ь¦%T„X÷Z0.pVÉ4(6æ,¼Ɋ_¯¸ÆÎ+×ØõPäÌ/ƒpû=vb)Ðæ•Ä␡À‚ºâ넎Õf+îU£Ž•n€„Ûz_#j°A®ú +!;ò3t—ëo¬EZb<Ðn©¢«ƒXÓRloq€'V³Aؚ› °±Á êª • Yó‹À؛b08ŸT‚0¹|…Â6¡›è*h±‰EÎá F>ÑÁrõGÅÆÝ7¦<\ô«jp»7¼ 'j°À•ë)ò¼p?“ú%°Ç©"t5Dü´±6ÅyŠi˜¾_'«¤–‰&kµ +ocÀJ99Ïj1 \ãíxQ…mU硽m”” ãw‘@ŒNN#U×l2èn©Ðe¯Y`'~[}­»¸Ù+Ä5%m-?«õ‰÷¾ã/òm”£Ì"őéփ‘¿X™Þt­$s$ ]ìYйQEÀniµFÍy¿Û·‘ä!ºþpÀ1©ûȉþx¬„E[tMz6G¸Ok\"|ˆÆ^NrkßÓÓcÍØ©©qL¬v1‰=zÚ¡³rÓ¶KÒ­¼•’­l*,F®OÀó=)æJðÀô?ü/‹o™….uÈFhÐnC}Ë )©y!ÅúŠÔ«…« ”­»4j‡ÆŠÆk;<˜Ô#u(–gý|Ý$!‡ø¶AE•Ð¡ˆ”¤KIâƒÖ§Üö “ØŠK¢ó*–¸Á£±Kmχ»ˆ=|S70ä*BŽo +9M8”rI 3¡¸.É4ºŠÝ¨è+æ"St‰§|Éiah»÷Ýi *R¸ +õDˆåŒ:Á’œ ‰núLq*…þmî@¬ÌáoKÔ *²ÅƒÆ¨G©AžÕÈ¡"OmL2%S)†4q=ù'YÐ?ɛäÜ8ŸtvBuÐ/ÐN&»Î¨j1VMr$ê'.]<¸ùéÙÉd´ïÊœ5…œ¨­™Ô’fÚuœu‚FçAš*ÛN&5½›—œóŽ¤;™¼p»?'èç7Ô¬–›¸žpJ¦™¯{ætŽ,ö3˜#ï³T°F٘ä"!o14Ã9²܌|†,glÂ6í +çH2az?n‹ý\b½&G’¢j†Þõ.ÑK^O L|€­Šë?¦¤Õ×@C’hùƒ:¡äÙÙl'm±P¡á}&Ìø×÷‹)ÄÁE‰·¼’· ÿçü©% öFe5¿VìD ì#²[dÐùãœ€á  Ë¸™nÆèªOµî†Y¨) ˆÜƒÿnВ8:ÏäÄÁILà‹6”Ïd7Ý14¨½¨Eb9¸ ' }E­ä°MÃ¹.ì{Å,‡O±d5åÝbAðhÕhOæ}GD*ùHéZÓ|38¨0ҁâÔè“"­8~p¦öjKqЂ†ˆ`lyšáøÍ¥[€C¦Cö„´Þ‘]Îq€~)w*7VZzyõl¢žýUÃÄ£ÅÜí÷/æõ´Øó$ŠI M08.ƒÙyø ÉÍWKuðª¥%cC¿1Ž%¸²‹ŠÅS14ë™xah&‹ö1ym%²û6aÞ±Zi›®2ÉS«Ž ¯”ÀÁâۋ{’¼Õ˜;:ËÄEø—Ìïj…YÒ±‰ +õL¨ÂsG҂¿—0æ‘Ý‘ÒŽ®¹ ^ÜVvxò…Á^ýûƒBˆ¶ìÈÆ?9ðÅ«S¾BaOËî@òå +^¹ôT¿†u{':Êk†AF)…qVIG™®êœê‰Ãã"ÚÛ·¯!ŸFÌ̕°4û5x~ŸH/½¡ñô‰kP™D/C@²ãIsJöÝ=y3?kµ€øI!Ixƒ¢üu›¨éÛ8 -,˜YÉ¢(H¿IÙcÇÓºÉ5í‰qè‰Xx ùëlæLk×ò†—º[K£|/ Õ éu’‰ÜR+X0{V«w½w~j£š*"`3•ß Þ†ü"ïca‹‰›Ä÷a‡‚´¤ªîO#LÚ6mö~ù.™mtG'ÁÍÅì˜ä:@c X²:-_üvãK,•sëL@—`¢Â +‹Ÿ·$ÓٔQ:k%î u¤h§)Ø÷*¤zmؼY[i:SYŒ@j©;Ǭ„GÊÄ琈(iðs%`yÜH£¤–Ï „<°I?­ÒÛÆc³’NàŸŸé0ê¯Pw$k‘VUgD,ÃáŒG黎¨ôPë ÈK?Z%žô:ž$vL ‰ØygJM?!ã]ߨ˜“NÖî2nNX-n¾ÊÅ>z÷l‡É4õ±É#+Ž¸݇iú¯n6éУÒßçÿ¨—<‡¼‚\`"*in9ñÿhïðQû¨² ¬S2[*T-ð#½fÔÎÍàVÈþîã¸È¹±rZ$€v«ÁhiÁ¹öÁI—H4%(¼¼¶l ÏéoEÊ~—-*,÷¹%;TbCeg”ïKÆZ;H%Ô8\0ËZ[ý¿£åjîFšÀýL­bÀÀü¢ÐÚ0Ä©iùä_Ú-cô^hlj>D8Ô^µ.ã2d;sD]Ûä*¼0%՜ƹõD¿”X¥­?BQՎ³ üŒÌ$‘z0YàɨŸgĵ‚€»Ž,ŠÝDÍõ8¨ @° +'çæØÕè¡f?K ?‡aN8ü‘L—º»¹·­%͡󎦀×ތFÐkïÔÎ%Ve%uçE0¦È;fÿâ„û–ti2—Âe”Èi ) 3Â[y]úÑFÿŒ˜šl +ŸdÎõöYª¥;Oîz*RÈÂì3 §sVE~m-9Nh£´«ÚŸ*ã$ßüþ›àó?Š˜uŸŠ«Ðú4ÞõC¦ +œó{Ü ZÞсíÛ3x(U¼â"ÅÃmx-9 ©$6pý t¥sÃÓ1öY†O¤c¬:."?³á˜Åù]+¾p))$¸¨=Ïó³0Þ^ž´&cÜ=œÕښLn4fNÿ$×Üé3(2Ø[ xÁ Q÷Dò{$5Ϩîþ"w½9¢·uªQIý"DÖôϦ›m*žmÁ†é>¼2¾S´8Œ‹{¹Ýp§2Õo½6tÞ¹‘׆ÉÚµ±Û×}ñœƒ#—|¦XéŠò‹p´ªWÓºd\£4Wa zm¬º&ùúGß;Š>V\µÈX1Ã2ë5ދ i"ÌýubâMßÕ§< 3¬Ž‡uyËñd„1SSêDÑÛP­}äJ7·ÜO›QÐBì&‚‚ÅwŒi†§¼ßؚ{EY¸!RÎáãW?f¦R[Öc3Pª*!y–z‰@¬‹|I¶JÔ×ÑÆl¢Á€ã,f¡QZø‰)¢Ñ8fúhÁ®39€Åv÷ÄÇÆ֕’P¸~ ä¹”Ãú‚y[ºòÛÛsþ/æ¡—l‰x\dC¹¶•«ñƒ\ÿ°ˆÖH3”Í,fâªWºÞï^OŸŒÞEžP\¹¤Å½LçáÙ4E€Üø3M¹ú§ëBäg7¨ZÍ°µ‘íJ¿3²–Þ@X”â6Àmߍ‚]@IÏ"@žmZºUN‡ù åK…õ±Óüª Ük¬ûz{°ÜÀ|ßÄä: +財}^M&d‚Q½æŒÜH#P, ½ša&Lÿq*g”‡ãâx áHûã¤BI9FM§r¢iE¬é´p%ã¼ïæ±_’§íAŒ›úo“‘iƊ± «—i¡\Øå®è‹ M Ýtš×›Dƒ×’£ bq{ÜQÍiÀåäÜIä‚gì¼¥Ó6é*¿]¤ ’Àb×Ã#¹!9¢ßüPA 6GŸ¬lâ`¦é ¤cC/ûr‰e™¢"7+â“A±ò¯'jÓñb‘ÇaDg@I>·Š µk"®"¸Ú8ñ¢'ëhA8=Š°¬¨›w¤9 1YRb‚ÜŠ8,èÂeú½¤qâ + YUŸ"â¦S&7d§({4Œê^=à?pٛ^<Ü8°¶jµ†AؓÎPpøwVi”5³'P7z/íòvFPõö‚3XtÂ×Êç!ÌBX(8eÏ&6nÅ)PDq¤“YpȊuRâ6\iqûT!†JLø¾²¬9R9"•Îj¿?#fûŠò$¶C[qT¥–Sà­s[fÝ,I „“»¨v"Nx’Ìcø„ÖdÀû¡³•º3¦;Å~Ò €j"§H«‚ÓNö¥0Q÷o†–™ÏX5Í 'LŽ{HEY¬†ùüŸps¹jҎ²>‚j`½QeYƒo™LÀ€¢d 3¦4‘T*Ï9ò}`ØRbß#Ñu[t$?)„ ‹ +ÅhÅIäC»í£iŸ›ÔœvdìFS츇;F ¢ôõ¨w¨VŠ£¹´$¦òŸª iG0mäœ,ʝT¼‡?(FyhDhºñƒüCµÙÙvR dÅK\~í.•aP«þ\+N›pn÷þ`³ŒÅÊ°ôNQ¬Ëè[²u_x¼,<¾ãí;C±gEe]ì˜ZŒDo×Î0«‹ÓmZ7 h¡¦ãáR ÛzK0÷lB駝®aÏ¡K®mÖÖº‹c³9­FãÄñۊû 6®£4òé ³•~ò ½^D¥]äöèÐøÆy¬°$ÿ’h8퓈ãö‘”¡MI1þ̎ÎQuöÒ;örý!YŸQn”ž>L߅B©g@Äõ h8´Ú²QËhòœƒ’êm;趕m ƒØ²Hr²=iÿЊÛÁ)ÍH¾Ý´æ)7.¤wè +GêxM°»ò÷0/ M²ÛW‘ý”c¡Ù}¨Òy4ýÜÇô›R¼ ¢œ–¯G¯1ÆZx€tM‡ÿœ±ÌV²;ÂAá4{}Æ8hŒ8Û-”¥+Š¯õwõs|`q&ƒg*„Lpár»*ƒP;òõ¨÷Ëc,'í@#Ðn«à‚sD+à|¼Û]»tp~‘ùR‘–ʬ†óXÝ,™4ÌV0Æ6í•(ïoµà“Õ<º ñ­?»&„Zuuï£ÔqÅ{X+ï$®´nŸ#3¹.ք¤˜í°™‹i!}3È& ÓM·Ú‘ÏiÐ+Ã"ê ?©ùu®¤nârå'"Á€j„l9ùs á£ªlsÑIn®Xµ°MõB›I¯ËrÃÕ¸@4C ®CÌö6uw¸ío‹¤åˆŽ”NR ´ùïJDEZõ¼¢ ´Ò+Ï´‰-øœZÃw^%ÑOÞ¶3`â˞M÷ƒd/Ö ƒô¡=ñõ2™o¢„°‹òav<ã)—ü^÷ (ÇxO’¯éU–Ë•…Ò>+é½V“’DMÉçÙRâÏï ·IÉr¥´=–20K΀:+Ç'‚6!Œoô„|ò§¯—¤˜ÄXçíð¶ø+¦«b/\­ ?¹€n‰D$ぺbët•êž‡sf…d? 9h$‚Ê,XªxÖ¹qX&C‰HÐxngö]×Iï2‘ó¯È“‰&cuÉK#(½îK äeœN´"¡¾ I®@õ|Ü 1‘½„-K5¯0‘ÚžŽŽi" œE¥»ÌÑXJi°nŸ4‘pÇÁ bƒ&"‰¨:T¤e›ŠÔ4£õ˜$ÓòÊb¤‘/8½=Ñàé¬÷Þ°‡Àzx+±£“u:*òº5åòà¾h^¿v‰Ì/ßD…‹­5â@Eæ®A˜RÈàŒt(W’ì&í|ɛõøIÍÈg3 UD5U˸³Ç!ñ›Ë”ö代‘’°Š|˜&흴±õýÞYŒ”tFÔa:|PêtA=j œTx'¤'èœY TϏ ÑŠ"°VDf¯+¶" áV¶€P}E` +ݯta¹Ä"dÄܐE²‡˜1‹`" È÷( „îǬ¬å+Î"£8…ç6<ª5 @ÈÏ"ðq¿+¯¤-> +,´ˆH&‚«Øööd +J‹ŒƒôßVìÎi4gôᙵH¶{ƒ÷DÐé ¦)—ú„mÑ TÂs^Àx«¿±ó[ À1L‡+Ž¢Ì¢*Ò0™ ¹º¹›Š‰ˆŽÈó,ém½LÓBZœ²-‹Ðohzj=]¢Àºrš]Äß"¤Tê /r­>Úeñuñ"85ž™¥Å‹Bß \ „žµ=»È– ÍÐä­j¨©Æ:ÃDK8ë"²O \Y?³™@ȱÐ*"£h’Iã…×¼²¾½HùÎ<4â¹cI4î_…r§^d‰M­™ÍRCAŠ22w‘å*¬Ù0ÀôÎ~ë?‚vá׊¼y›O¼¼¾çE†`*T}ÅƓ\žy¯‰ Ú"Ç}v"î‡ñ@¥ËÁLà"œ9"¡Â€jŠ>¬Þ>a:ÁH“üN%éîêÃòyCxpA¶D¢KKK$,Žÿ¼ãä7 –7%í2ÎEšèl왍xµ)ÙY “æ"FÀ Î —Fì^ÊÌ2¡Í‹\tœ©&my)°ÛóX¹…‘$”gé->§`fÌ*ÁÈ`d¸0xZÁˆâM +-3Áˆá܂lÙÿ÷[‰%ÞÂߖ1҄M#Íé¿{Û²G +Ç+k!ŒÑÝüx{Ž-Ô­dYã÷鐆,ËÉ©ED‹{ÔÛª’‰HG(Œ ÂVô×÷7knLGŒŒ3 ôfȬ‡$ Z1ˆá/rüšÛqT y‘ÒQ]LŒØc³Þà¤ÕÓˆ›‘ @«!FàÇJ“ùîUyŠ‘f²íF½›µ³Qrb¤WÀ宋ùaÄӝâÅ$d4F8üpÐK‡Ôäû,÷&ËU–þ)12Ük$Š‘ÑmDû¼NcOÓ=©bRý䠃bdm¤#¡H²çEö´›Æ§1GvŠ®$¦¬ Z[Œ|;Hœ«)ËßçX*d4xWŒœ”d‡Aõň­ãcŒ”“+‡ËÞÔÆ Y0h«:­w+DíÞÄEšpߊì’ueۚ`j8;´Í1×#‘ ®ˆ°Œ‘ŽÕ¥¨e`vŒ%Šìîß/­×$€b„M{¢;#›#ä„7ïQÜ0’œ»œ5£‹Mh›™¶^ŒXW¨ÊTp ÌÈø1¢ØAÒ¦a;å Wþ9¡)ç#MµB¶l§ 8°$a\]Š"áA\G&.Î<^T|D2b Ü@ #á­ ŒŒÈð$`óû¦%&?¾¯Nµû ¶<Ò!¡”ÒZ¯„‚MÁ(Ø ŸC=FLqùS+#ôù#yhGnŒd…d>¹äGÚɼˆµ ùHrÓ1‚jәÙ®lñ®… íÔ8È׀X„AfÓô­ó(º7öka\Ò]ä}m¾S­/ÿç{÷­X:0Ó3‚œÝӁ‚z ä%òdf`)ù[W"áH`Ê*PÏö¥U…qxŒÏ'þÊËÿ½ŽŒgF°†›p¶ß»}—ùÎ¥±R(üEÔ6#ü,sÕVöøævqüJÝ\nFrö·‰”f¡­è¨o½*×7¤D¾äA̺)Âðƒ3ÂXMž¬ú~°Qq½œTYMT€|Lý]R¡å¯•6H 은f‹¤Ü‘”Œ¨ÖïŒØÎ.½é‡,JÆýÎu%"ŽjŒðY@Á¯¥î#'tÚՆFxá¯ÛqÄŸLîéàçä+`]f4"hfŽžèáa9ybŽü¤:.À҃hêk”Ý`€ÅdœôNHF + ùA¿` R!ÔF#±>폷ƒ,Ä3ÙlaÄ޺áûA_šVÖ©d6AßDcÊ¿êÞ•Ž¾ú‹¬'%DžÉ}ÄÐHLˆÉðDTmÅ^áe6_Ý‘ר‘Wa‰¬‘?Ðz®Ç»”ñ'­ïoÑœ ¼žÒêŒãiÛnÚºà­5ÆÁ⭑€Ší´–PÔ» kU:6‚uid#šÊùrCÁ‚<Bå1×tük§ÑЃœõûÿNa+³u\¤NX‚A쀑“ŽóR#"Ÿ, +Ã,◨!õ³ñ uçÂ6aïJ인"¤ëFˆÖJˆ¡u(¡¥ó@ +ûÃs…È6£„Æɾ߸Vظ€—8µ +ÁÊhŠÑm7©T¥H-!£H¯qÔ0~»öÔaZïÌÆÂ5ü§\¸áÁ£ÐúįIG\™‹,0¤,N oC£PÉ(à0r„Ïž’#rcjHMKt7+-äH%lÂÓ°s#Ýô½\ÍkMòpElVûàý¥¢’ÿQEŒQž÷j+¸N‡*éG7‰aôûŸýq*ɑÃ÷˜ •“Žl·€e.s%GÚ#N˜Þ¸±Ý¸»·fçç ò Ü ðÐã¿÷Ö^ü¼áùfûL£|É܅n§õþÄ2"û¯1!?ÉUq͖¤4Âs„Ddo榥ü«9ÅH µç.mïH @‘bèÈ +ýÚãÃÉ8,Òd>ðh¸uä#þq¹ó†Ü¯øÂkêÑɼý.\é2ìÜïè]ËâÏöùóBíG%t¾âlkG²‚ÓÉv'’´b]Ã]¸mgý3zÆÞÆ÷+*WÀÃò¢¡Þs‡³‰ø¬ó‰bŽˆŽÁ¯¦‡¬å=¡B$ö(ò§Â#£¥ m<2Ca‹ +wµC „ÓòHà ï¦6lú¹³³Væ +§Q@ZÖ&wxŠÝ¾*F~0|ð]„û?€b Á76¦µàOvÄ×Yi~$Ÿ@„Iôˆ‹kPZñ@%jêìÝÆ +wŒßWEÜõç•?¬%Ãg oò1ã#’ çÈ º¡º‡x<¡`rÖ#±¬B>w'’˜~¹¬§GƒõȤª5Mœ…Ö˜=‹¨û¯ˆ 'aÓ¤Sé6ÓR6‘­þ_½GfݤBׁoaǦ5b*Eӌ……ëÔŒ¼KhMPKș±~d|†jTÀ|DúµAp,BÂÀ°¤GKd +#'^u68Ça¬dMu#¤Á©bÀ(IlMÿþ>Y¬­´ £hC¸'T˜ˆ]åß÷ÎrÝGƒm½Íkîn8qóEž²žæeÜG.ç^#9'–U¾ WÅIç]ŒY¨Žè‹Oæ„;EB‡>[;È<ß »§tOÄø’´ø‘0…“=Î/0ù­‰ö0 Ê¬\üùXÜ8aýˆ8$U#ú#ۀœ 'àIúx4ë †ørÕ´ò¸ðÑTƒ÷»å]~Ø6[dŽÚó&ÿˆ·ÛÐœÜà6 "p’ÿÈ4¸;’ö„Xšo ýªCžàA ¶P~O‰C$AáOÉT ÓSTÉܶ‰%È5DÁŠ¶ü=]šB~C ’“ߨÝ@ô,ÓÛ dà$Ÿ”µÔ.W*"Ü áñGÒ/ý’ AQH£œ¨»é•Ø4+T±'( ¥T¡°ï!uü,è=Bo° ¼ö £A2bŸËDü$ƒ£‚´¹„ï !ð¤R?xCˆ~Xĵ}€ †;žã$EA΃$“íVa$¬ +/Ÿõçãe_ãÊ$î[& oþüs$®K¢/äJ¼žTK1JDÜÖ?#3(™òöŽ$>(„d‚̶k¬¹K¤ÈHá«ã $±å’œ@Yó9‚X‚ +À‹’ÊY£!i=pù[}/þ¨ñé'õ¾„@.øÖÑDžü_Â3<1‡¯t{&£gUÓ=¸v9ˆËGu<À9úW/¸‚lï€!&cõ–š0®{¹­îòØDëž16þƒ½ÆnT·ìLFH'ç'ÍøI.bÄcþ¥TC(6àŠUeúîÐj嘭 Ÿ?ß¡ +ÑåYYpé’"£F"À0ºoÒBÔX˜~~ÝêSœ•ùk+ +ŸÒXtǁWý +âRËÜ.ƒG _” 2³q&bX^ ['§î»u +"a1aPjÜ1¹Ô³ÅL¬¶`6‚3Ãk’wåє¡?ˆW‚:PÆÌ¡¸nf­5¸)¶BÎìȳ­¯ãäPNƒsÇ$›-A¬X΋ä’{—J¯çÝÔGúôPïc9؉,Q”CÖ2"·m“ãå]) B@tœžÒ"%š•u0ÁF_9öîeIf¤UÜ)wZ)K mÆVK™`ºµ'gP÷3ï=‚Ἔwrþ°­;¡›[Ê·ᓭ¸qzÈUnäX(‚çä®YÇ4 œDI…‰|ØlFŽqÉÁñ´ +I‚0nl`ð|rÒT’¶µ +y^ÑäcO‰Ù²i¦€C}ò:`ô`Öå"3a›+GCГ¬0F­mÙČ9FåMDKe«ÿc‘p­(Ú8.Ñ©¬>â,Žœ=.ϕmNn–N`D9wôÁ¿8è5Mõ%‚ݘy`} ‚^4™læt¾°ûî<¡NYJøýˆ¢›=  ¬¡ã§Ñ…ôâ½|1†©‘öS‚_ý́Þ%H +þµ0BR††_Eºƒàó]45Öï>Å¢KSñŒ•Ó†H\ì×Kþn¶…Õqã/Ä +w†9F5Ëdò}×'ü©PÖ¤¹í«ä j!xþí`æ h¥!sFqq¼AȾ»—È텡X EV>Lº;>qþÍÓ!됹E®í®yÒ|eø˜’I!¡žroåþ“›?ÖQ„4ÉýäA.†™p9 xˆcˆ öLÂ,qypx´7Â|* ˜úRhyTM 7½°›Vèa‹žð] +uêVEAGbÿ]ñÉB ’¸ÉÈ,†CdžŠ8ËJ)U"ðLs¯ \(îÜK‡›3NÎ{~;¬¥‡7Ì5@ét.îÔ#NX©É)ù½Wd,«Ôÿøßoyóõ/2袦ÅҎò*<Ïqo³ò^ Z'ßÆ&Ìžó>€1'7:Aµœ¼iEªâMq2÷‚Tö wàäööU­ÌZÆMþö>àr‰>K²… ®"ƒ‹i½õkŸ8M,j2Ça†¥ÉÀª¯ƒFr&ͪT²€q”¤À°ÿ} M&‡Lódå!æAL¶|È£(ä`ò bš/ƒ‘¾2 +UX°ü¸b '҃™KûîWmn|íj VKF}¼7%£ÂäÃG¹GCΓ8C‡²ßŦJF½* ¬´"QÉþ·VŽùyISŒD‹Grê^^Š>zƒðd'z\ %—o°ÖÎS9 +Nr|g4‘|ëèOd_¥µ@WvZBªÂx¿‡õŽ‰ôéáLËtƒŠìñ4â: IF(û2P$ õ™z_mÞq „ô„ÅÊU¬ + Øðâ!Ðɓ™$WöDl/9`¤¡ªe-Ž[‡Á~½´w_î+òÿBk5n¬XQXð ðüÝ-´©1`“2¦F‰æÂEÛzš`³£Û~4í¾Ï£Px<Çã±lH”ê÷XTÇ ¦”ùðéŠÜ|Áü;úü»¿–‡ãUÄ*Ðâ;O Æ?w™€Åjo~Q¸O{E.Ӟ2edè®ÿvT †_Ñëf¾É)Ðû#•€ùt|ü&ÎÄHE˜N„Ù\™ŸqlÔin|õ¨Yï2ûmðÕ}ÛgŸÏô‘sG‹£ðy°80åÛ÷ï³ûvS =ç£y6eälšç»EF¸îÈn—ðM ⶅ­j£ìF-;‚K™`ĨŽõåŒøɎm^ïVfÂè֛ý:m>كX矀æcȭû»zW?á¬1_°ß{ ¸·õDZ¹\.ŒBc""Œ\äD ÒÌÌ023bèÌÝÌg‚ACi$¨A‚™#ÔÔ0”YœŠ1ÁÔæ´á†«à +³c#±0eT³ùƒÇp» ÷éŸ#6”}Ç3³Éß±ÆIr¦Š"(˜×ÌfaÞ-6‹…Ø"F>ʃ*VÑVhk2‰$lØPe7A0ùÌbBdÜMv˜m&"1:œÉhÄ39²sÇrÊ`rø,ÞYQR¬#"ÎÕ ¢PUV­ª€U‰ªÊÊõ:ª+>ӊŠUÚµmKj$ UÙÎf£™™™©î(1…ȵÛr¹e½ áó_üõ©m}ó©þÐjýšãPðX)smHIǚ$IRPY×B[SY • V*umµÕÔÚj ‹P=m¥¶m“AÆpbw(!ÜIP"ÁòB!3pL@–´€m?p<ž‡ ¬D† „d¢ü¨|ÖSp ‚p@ G¤3=îe€;J `*>LFHBœ5‰)CÄbŒ€¡D¦·fô®ë¹Ž#Ì»¥®™6ĵè€-®ÖËWn¨Â0×Ï@™ÝõmCy©ØW&Êùl™¾ó€µÙ/Uj$,ß ‘[Á•]ö" °ƒq#* ° ¥ßnMR €!ŒW^H>*ê4ôÚAۉ¸»x&=57Œó1BW´<8@íÛH¼ÊᩓTò؂úeüÃk<慘ÅvPÂF(#­pILía±yBö•éCƒ §Öš9öv‰™¸^_µ‰œNå'ûfU)Ö°X¤# Lx¢¹£eݙ7tèØ´É3%9+8«'%ܘl7é™x©ï/ç_½c¼"ÑÒ%¶¾úû›_u¥þã=ðõ5ÅcaӔVŒŠIÅ'H +¥XØ:*‚–EF4ºPґ¦æÛ%Q +†^‚‚Î8Ô"ãļƒ8-y™x¬°›AIn:þVµ/¤ae¾±&.O¡‘¾ßý»Oˆøi‰X=Ð~73“Ú#ýÆósË%P×b&p¹,xîøÀ- +åý¯l©aÍD **ÃWèr L(}juÌ/æÇ ±œNâÎVB"bYücØR íÔ6!ýùœkù²r3¢Éní@V.cã?¨fÖ*Æ ýãÎ(×ðâHSÄÖa@­äAkV+eՐïOŠÈz¢ÙswÆ= y¤ä¦ÿ ¢_žœ/¼h0*ÏðÜо †_I Ò© æЯý¸þý›îÔÌK¸b°æxóE7ßQG_–á9ѕï: F½ȅ9„zæ@hõR¼xh>×1$ǟ@¡Ó ÂÃ4Â>‰Ó¯#†0ÔjŽPÑÂl!0˜(? ïdŒ6dž4 õ9g¼Ç€D:½ +Î9 otÏ ŒѱÙðÌ'h*`?;òI†'ùRëÝ7³fxÛäŽÇDOÔWÍT ñ:œšHV&­0rÕÁÕ¥UW1«Š7w}9OµlŽ~Æz«ÉtÁ(µ]MUsÏ óúü™„1jk”Õ æ$Ìn­F̓*Djž”M‡ºýÀd”dL “YŠþ¦EŸ$WYEêü`?X»¶Á•ÖÃ2:Aû×ÚÖxÖñI[–ß·vÌ'èTèB"W1Ó>±#KöˆÂ%m± +$cŽ¢MÙjáèKU·&›€¸¦•6§ß.˜yd å@Ò7´nu(÷`áÖôspòÓ>Ô!µ‘ÛöÈÇÿç‚t‰Ñ€Ð9㗲Ž6ô+dè}›oЊá°Ò3t@BÖn˸€2SÅ·Çóœu3åۛÔb2xNj1¢Åk·Dò![ÖrvN¦>,xíRK4b#X•å?C@ ÷‹°Aå4iê¥6¡¤TüÏ=8©#2‘*Ï(¶]’:vRFn€4ÄɌ¤S‹[LB ]I¥ÙºkFlëhÎUF“©á™ŽDݼ8wWÀh8t‚Â03¸o{]?ò +iS àȚWý±¿øŸÍޞçú³jÕ¼Á¼9xzü y[ E. Ò 1eß?Ê—ßp(Ô1ìâÁ'~”k:‡°2Ø¡@Iöˆ†!öR`€ùhÍ£otïµ9Í<›ë‘`¶Êy»¯(ÿ†ù´Iò“HŽˆÇÁ‰_%ž“g|֕›hÀƒ"Ë{^÷á֑§íAî'ä/Ô´³*æJ;Š!8 +gd¤^ñK Ÿq[Y×¢}ó¥ý¯¯“^ä q–“ì"ÁjÒ, +÷¹OÞ9<À^þ(½Íõ1tquâw­å‚¶ÉÇøA¤"‰ñÆQDÚSѺ9!’Ï&`''ÀIGܗýK¥Ñ=ïš*DÏÔ×'O׫(ÏYD³Áîëíãpï5uŽ¾ÞìÚ´Õ<ªêº°çñŸ1Ê‹å€ZË:t”1)¦9 ÞcݯÒxoÊ'˜¨>íӀ"£¡ð½}:¬ˆø#Î zaEšép`;.<ƒwÀþRñ¼*h+¯2 ºI¥ã¸©å.ìô¡§| ´S±SºÞõiõ°…1 ã¬,¨ "´}pQB7ˆÀªf#âÚÇ-ŠG¿{&ƒH¼ÐJþWø–΁Ù0 ØQ‹ŒÒum8<‰µi+bh’Åö–6¸ZŸ}ýI.L´’Þ• +9ã7ÚA±ß8Š‹ÌÀhƒ%”b|טmÔ§•„¢¥œ’ÃéÒ¯hna‰ÅˆîÑ'Õ1r0É"k—w¢5”–t%¯HZ“Y±Ç±r9w"+O’lÇi àà +ªö®•&H¤ÝäRħ«ÇÉTŠYà ’UðÃAõÓÚq0‹Lû‚‘O½ùÂ\ž¼­èۑ׎AÄ!£ ¹L +.ðÊæH˜Ô= '¦ÞŽ^讕é3לø®LLFÂ8Ԏ8Zˆ%+<šÚÅ\íW™>ˆÉƒ÷) ae‰‡ÔÀ Ü&‹ÐGRÈi'pÄ(c–g`ýG荣©ÊG´a#Ή…9jt$©¶‚%lW­äm3sØÅlâè süàÜÂ'“¹½óáJÀ¨s­¯9´›ÚЗB[êf͏ª7t¸i†®ÔÐR®\v`}wè8ûY¨Æñ©Â±žŒsHùÂ÷Ÿ¿Qcn;Ú«a¾êhï6¶Îðœ?”þˆd@ÏÊ ´òì& CŒq–Æ@ñ§lzÍ ‰ËïÆÊhrÌTˆ™#k…Ý(\Œž¦£3‡—¹gϔÎ%Ǖ›$¡[ü¯.ÀŒÆ‡. +~—é¥þ†á`˜RF[ظ½XŸ q‚Ã( 7ԀëTʗôxØbY5´Qȁq†Îœ´vù1–ýµ Síë©PÐ~%·†×Á‚u8éƐÑKM·WÖ"UOÚ¿ ÑiFv\=–¢É2²ßF—ˆ”½‹ÕnWÏd~ôÓ ŸsõÅ&é+ðæ"ÊÜñË27žÉmA6{>06ƒ²°‘ÿe¦#¿6«ï_Ž| +(~g8 î©`qáЩü‰#þj,©ü®—[z×E’Œ\ÿ‘±ËjpB~”'Ø،¿•<Îs7þ|ÁÖä è±¢k ímÛ°ÔfÚi¦|0²I59XŠœÃOž? ¦³HnŒÅønù3T–õEށé0 +;ÞÓ4ˆ +IaËà ¶û•  R´€ÃQ׿¯B»Çd¤Á´t¸bHÆË æ1tq4"[Òòƒ¤‰Ó,ùîÛRËÊ!,wå’Ĭi|ײ ¶ÿ ýf2FìVeðy=»„p& Qmð¾E$\,.7î@Ä @¸s+‹>ßY5â'¹Ð@ïˆY¾`×Gn…ºËr‹<2\³~GÛu‘æoÑ4ͪ¬òŒ­p7úϔ„Z¨µ!ÿ“ZŠ*8Pè®Go/Š¡˜½H9 ‰†n +\•ùÑP‚†0™ÙôàÐüÞ³>tzSœY;a@ÅÊÓjlaCe-K]B×oìm7‰Á Þ{Ǻí=µáD¥QyÞZhpóCÇé^^ÌÖœ×G ¬a+üçè ís­¶€ƒ†ŠÜðï}u\‰X¥ª¹eÿÿ"NSÞ˜cé® Æ€êU¦‚‚¶@þgŒÊV´e2Ž¾N–ÙmŸG£ O`ùÃcXS ¡L§œ v*7»= æcfhL˜¼ùó³ÅKÈÃǖ<³±­oöE¤Sª´ñ‡}:v~æÙÜëó~l?›bÛ!u!¨’ýZ°ìÂnåÂÜ_öLž³Çlúéç#ò)¾:¡#·M‹å‰”<4”Ê‹¤ ld!eç×wÐ|L°²TaÞ¥q^"øAÁ=Møm¾;Åhx `Ø=µÀj|nwÁ)ˑ*ŒrŠ@Æ£Ôªi|R‹ûpÓÚȞ£ƒÞ؛àbÉ¢0žAZVᑞĪ«)mOb£B‘ŸV´€g¼¾À6§?Á01ðRD˜ž"õ‚AŒˆ¨c¼ܳjȪé=­_;™Ùé‰D@úb¾xñj5s>(ÓøYFrkd8ƒH8…‚FÞV ÒeT勘Ñëø´ðãû\y1äj¹bÐôŸžÕÌ߀PÀìk›‡ç(Û. 1Y¶“ËSÅßxËÿ*¡Ñ!%bê +#ºŒU߈ګ#/“ÆñŒ`—‚Ù»œÝ0ü©­GæÌ0İ䙭F]ÿŒÈ1ŸãkC$à©ÃK+,Ä0ñD"òJAkµqO算Ìæ§iû…t.ÃU¦–Snð÷»HAäRù\FÆ&Dúàu!_£Î6˜b%sde¿0Y.B»ý_þ þ[¯¿°Ð˜£_Xñ}!vØ‘ó›[ ^‹ñß*ªaΒË£:®«-CÛÎ^ý`o.¿Ð|»t%w*E–Œ9h"7ò+Päڍu p2}ž9ux(Á˜ƒ™ª{ãK&œ(QD\ C#.R'!€c$-X^ƒ¦"OÊai®¬öÅH=QDo"ù0 ÇðCýЗ^ ƒF \`;hÙU¬†‘îüCw 4UdzÔBIñ`ë _ `#®„•Ï¡À¤8’b`Û¨–mA؅½‡|SwBû–°¸ihyD÷âÑhŠmíñšîýS…Nk  §y*:ÁpÌO#çC¸J9`y´z®aÿ¸ê•f"N§¨ý”o;¾›â Äpê8 Y +"å<ŒQÍ°×$•N\vhø*JÍ,‚ÖŠ•©ZK¡1‘>)ˆí»)×ÈúЎa‰:.nÐú@N‘´8²‰tZː~æŠH@b&-ûypM¡ bܵÄÅÂ.dõ‡2ðCß !_ßU™k@žE—ªÒîQàÖKuJ<„åA‘Öºg_6¹ù‘?IC˜//‡¬}R•~Š²[e)±É@;È5¹H4Ø/0R°¡ým¹ $áxb¯Ä{Ó K\ª^†·,׿O¨f˜åÁŒvŽí¹J \Ì gí5ÐM% »\)£ChyMS,Á̺öƒý¤ÒPV)RÒ]Ý´è©âöèJfé(Ž\¬0Áïÿm(í KÑDõ0L íÁ—Iä¡î |rÚ–ì׈,tÀ¯Äi„½è3B™p , Å2þB€? ŸÅîAá·ØŽdÇ¡_fg­‚ŽO3uÙû<$4YA¾¸%<š.ï¬÷+¯8 f ¿àÅÏàŠïv0KtÍÉ\Áûœøœð]|±°%òb)r³Á®ˆ:Xæ9 +®*Î~Ņ‚‹aÈï¼ù¶ufaFÎ@YÌVdÎÐ[ücÉúò}n³RæDuÂaLdh8ÃMݶ—-7ã¥nˆuv毚€ZÍMQÀe–Áücúͼ§^´y‰?–³ûŸ2 å y¦ppr¡Ç;—4ÉÏ Œ¦“™KÊÁPV^A!… +cß³uÌ éoBìiàäòÚO9 +§zë£p ²¼¹ì®n´Ld¡($Ôߎø•)Ú¾­|ñºÓ/" œ9ª¶¤[¥Y¬ f‚RQÓòk¬®`¾sG%ˆŒß”4œ2„š/„gcEÊ Ó6,M* ÃEOø6©Ðh^[݅L$ú¶?2VT5ì§0Æ¢Àö`YZnøu: ¤-,œæ—òÙȃÞÈaÇ[DA³“ª$&ò™-¾B¤WR •8E»ãTÀÑ+¼|1ÍvÄÂë8eÞÛ|ÿ(¯_'–+v0ó¡¦+¹’%Hôƒ ¥L­ÅÑÒv[˜ÜïÛRځMmÖ{@]:m¯ß¨!aŒÀÇ¿.D[³—5fÁöϾxFò®º‚ ŠV†"¿Ü(J*È}\NÌØBÄ$ŽÁ,¢:Kz Âqe¢_¸ÐѼ‚×ÌòËI’Îe‚6SÁڊˆ2qzë7ÿéf{.1aó +юŸ”È,¼k8ÚêNÉz‹ÊF2eõ„??‚æà;)Éë(ž¦†Î(0uó‰Æ\@¼ß.Ku̺kÊÂü²»>¦(„JµëÓèƒmêç>¾ãÁw¦N:àØ¡|-,€9²J, Ý#ð†Ý¡K‘^]L汙eÍÉ@H—ÓY8埒|ÜÔ!7×ËíËl÷Å¡ºœ2r{ÅàQˆynÁX²l…²ŒÅ®Ìóï¼êñHigÖÃlï}á@D+ +Xd’”fð'ì¼éŒ"óÎ2´íI¨§Än›¾—êUrH”äـá-ü¢+²æd5¿ÔÒÁ…sˆ^;{n‚Xº¡˜uÏð’è³ÉlhEª52 \-B"@é#DßÔ]ݒ‹od–îH½ ý¤mõ+æ"5ÁŠâ›Öñ$eËxÑ+4fà@êéø 4Æ[…7Œ8»FšIÿ°‰鱋<Ûʝ$5óFÏÑBÇF3!Yd…[€iŸž(o5p`aOO„P)–z€æ´-I` ÌVÛê («Ã=Ñ^/ç_ø9pá‰ÌHÆùÇO^1Mûm¶®°îÇu©è:wÁ‡‚dÿ̙€ýiì{ߟ_bˆyµ<0P935ÑÀÉf·Õ²€~xJ¥5£‡ùAz¡8ÁOÔ6ÈÝWà–´PÚ`4þŽ¬«/Ÿh:€ ´¦ˆ…¶0țx÷¤¿ޕ »—I¾êJö ; YÐ2H Ÿ@ ÝH[ƒÁŒ+ÚI‰ˆø¥ûȈ&Îëm¡¶ÅºKúõ6a“¸®ñ×:2G¤BZ±ä?h¡Ezq¸Êþô†Á˜ÒndaTfŠäGfx]„ópp3BèLj›ÊúAoþ5jK¥þþÍÂMN@¤/§D}~’‡áØAÐI Y¼çÉ~ގó_B!^»nÈlʞÃdb²×Ya£Þâq"pfõɾÔ{™A ¼ÄtÑ= +µ=Ì~Λ*ÄÀ}’jähùÁï+œ˜ïÖãpÕ Rùô?þ8ZuÜA¼µÇ‰ÐdŸ¿jsŠ‚;NÛ³åKu~œªE÷h5—3iú²ö9höÞš™ËM>ÂÔÚ&QólG »˜­:ðúËþH@cɅwdQ\hhúT-5NH/jÌ}œPÌ·®]Ë¥^¢ýÆûó$·Ü•¬±v}9\›n|B“Ó›Žÿ£úÉñn¡ïÑÓ&-$—ØP„„ª!S®F9"?¦œ÷ž:˜2þΛ‚3p‡äa†J!ÌÄugsAŸ —"°)ÄmÀÚ>X%Peù+ÇÜr’ãïk4]&µk1ä¿Ê/ +Ņ‡´s."ûÏ[? +®Þä¯8Ï3•ˆÅÍL¡\¦¼97œ”¥C!:s±/%F™¡ê£ú½*˜(tA%É~ú›b Ò§¯Ü• ÷B;¢`T§p²Óó™9ØZ@[#q~Fšc͘#͑@cä$þƒmñû&dP`e‹•pÙЙ|E†cIö”âAvÉA3ñ ‰ì }©¤‚š«³Ççdðzq}!}4û¶ÿFåú”ñY†GyŒ‹h¶ãÒN8³Py¥÷WÐ΋w7÷^=½ï8 PÂ5`†Cʸd•8fqö²Ã0‚@WN´ð¿†¬®×æJš¿ñ¬^"=» ¾œÒZéw Êc©r®‡¯yŠ wØO¶¿DHƒhMqF;Íh({ÑâžÐ?Š§ +Ù0ÕY©9unøN‚=Vµ .T¼ˆ?x¿³«f~èWl¿ŽbÖ8KAÂEÓï|RrT?ì-¨¼4}­˜1ÍôÅ:E¬þÝl#ụ̈жîB¶ÛÃqlÚñ‰÷[ÖÐ4o°^2‘1MÜ…³¿UQ´­½{GÕêÈ `nX¬¸M›ÏÚ“‘!wk…°F“šnÄVÛè¶à¡aþñn´¡–˜Ÿß£‚ +{ˆç÷ôÿ‰ú<ä¤Ó¼‡³­B/“$9Ž(0»7NeVÓʧР"Š‡ªvʱ¢¡PyªÄ…=wé£ÿšá`ŽE*H¾;ÿòÚ0ë¸W[%¾ºþóï Ñ¼‘ƒmŹZz½¦å²qÚ ÉNQ³Ö`¦ËiIª,䊅î;4kœŠ¹nÍkbcÃ3QSwû÷ÝðcA—_{á>--ÅV4yBEjÈÓΦ3pä]öLA/¦Ä *©®¡ýv0˜Ð¶'$Ð )Â×E{Æ €J9BOåM«Ç÷îõþrP"è7É ?À»…láP¨æ9%Sa#9> cËxñ ]xx4]T4_¬²^^±T¥^C£6y÷ œ7DtXî@,‚8›ÐŠãE%6è{¼,ŠÅ,Ë, ¥‚`Ñ04&[-{]1«÷7òÃ֎¢“&Ó]Á–Æ47T=]^Av‡µ9xÔ&8)ae°uÏ/OlUÛ®6mמ—ÍÝ$ÓTÂf—R"RÙVŽ×Á2¬æëà~…2qôHjÊ[ª—‡)w#}–Ò;×k¤”R©ðXKÊÅvrm dñ:JÍWi5 ‡ŽŒ¶"¸^üÀ†Øü£§„d²#ÁON£(§cML§$ãù€“ƒŒ"EYãÏ|J©LΖ1ÇÙp¼ë}8–AñGˆFmXœ0BV«²`t;`HŠ€±_šð‹>­Hòe¾¾8÷ó—ãî8…z° ܁'äcÈHl‘éÆH-þ[Öhq/ŽªëÒþò …"F¤ì¹à„b¯åýeh½W,þis›s¸âÜ3^ûªÕW+šêUc8VäÈÚ*‚Oç¨/NÙ‚¨ê°*ùéâ^Áò°Â¶¥8ÇÝS¿óBQ<³Db4TéÏý?^žHóäF:sõå +a¸+E™xa‘…10±®Mi«¤¢¼ ®Ž&!,Ñ=ewZ– ›Òw² +3U´qbeŒjÄ°¦1ĈsÏ@‹¸,ûvŠdß¹×Gß+ëæÃâ|i Q6èë-5ÖHF©Ï9VMßx¦ÄDËÅ…kƒš ›Šô«•u da×GGí[_ØhÞÝÇÇ nÂ&ÊJì›ÝæÝ­‘cèçÒ±º¥¥bjœÝv‡Niòº[´ +˜'£á ´n’¹I$¯ªF‰Qw·MNî +G¶’Ñ»Á.Èj±&»Ê»5mô Fw=؝´ÍºAFœ4^` -H±Å ™(¯5Q° =I;}ɄmþslK¸[¬&2*äZFÑÐpàQ¨F¿'´ µ.ùÀ!U룛û• ˆ +ío¼H^–—«ýsÐê€# +½*v²¤7×,bˆR™»ê'`-•ua~XX7Íej¤£âDcêFï)—÷V{/.!p–܁£¤€jbšq)kîρx±3ó71>o¸ÀÜJXèÁocìS\\pý—É<0pLƨê~ SÀVfÀðò‚ùhTrÏØnqƒÉ4Æ@£ö­W‰WJ %ó7ï8vB~?¢ê+ A¦ÂEaI=”Ü~n Fyš¶Ž@"Õ;95ԁñsD\´Š=œçH–TÓ*Nšq!i=ÔÓTª:ôš&±>­ðÇ®{ÚæY_,ýupËL1æ#Ǟ4qs +ØII¼q„ƒ½Y“½ð¾´^9s/i¶88¦PcõÅÓ¸ª¿e²&ÂS eÂðÏÏ3F‘W+CØWF(ãvÈÁdõptè~À)ʸSCÔ²2~^W§‡rk[—,í:&Qß$¶ý1ZôõL_®T"——³üm¹¾~Ôncžx²d•˜ŒAìPK'qýI^‹à«>›Ž©]³ÆPnºÞñýqK‘\sØÕ;.iFu‡w"¯é8>Ën™» à® ¨°X`×JÝD»ø½yÐÿu…kUQɟԱ£B1õe‚ñû,’Jò˜ Hf²¾Ù¢Ø‡·94/“Úœúé*oŽÝI:'3xTQ¹³Ý~Gïn`%­þNS9?ÄU06$ÊR¡égW (+¢Qé4ߜœÔ®(¾L¢T@‡[S +u3\¶žŒQ@ŽÚP$Êúó̢序šteB½UA]øšê!.G–¨"aè.“âòKÃ\I¸¥P38ʙP[À×8³ïý83ÎwŸñ†Ñ‰Çå÷/”ŒÎ1 uh~Z %§ l{ö!Ö%CKÓ·ýÆԔŸ[Ê!•pΕväÚTî¹]‘(@ÂÌ ¹tûx—òƦû¬@  b–+i,Ã~—|©|l ·9ώÁ>2î[Ó¸¢à,ç[²ÆÎ.ìKŽ¢.0—ðË?4Ás¼Š àŸü^žàþH +СX(/îÁ®ã*˜Y伸]Ÿ™¾€Å‰31ð öiwW6’è‹ün†¾å¤f–ŠÖ;9dGÂƒË½2šw‹bn™¦`Üø1l¿9„OyÈá(çüFŒg$Ìñ€¾øhœ E÷†uASˆ7äLN6÷6g1|Om‰1FA•91_¿ŸÏ²¦ +9ä–å—5à!ä +|‰„óTaÕ4·˜žÝ(ˆW)¦Ü<ƒè— å‘OÏQ¦NÊE—3àR™£½¨HS +ÏûtÄr«×"—ŒÿЃ;_¦€?´ä 2Ô3Yò¸Çêv,ÕR`µzó)ÉAÑñÌéÄèvØnž$;~ø²ÖKÖu*ÕåxÓîÉ]ÆÂèëL„ýƒÕ(¾Ì H®TÖà„«ªégqK$Nn„-TMMþz"RåPçC´aä‡øx9Õ虯¨0*#²á£y8pGJ.*/ÎzMe[•Zë,.-ú€¹+Âûü.Ùc}uGáÜS>±_©Ba¤Ò¾¸ðH‚cB‘µ^O– ï \÷Ù(9”BˆÉ4b­ž“›Vj4&U}bÂ|÷Ôxù(— >­ù`Ïﶃ `‰y•] +ºŽØ#\ÜîÔH¥kqÌâÙg8ŸTPã—5ø¬G\28(ÃÈð69#A9îL"Ò +lѐL9³™kâvËø*DÓt*›[¦Ø_ôyë5¤æ]ꔌƏ"3ÿ¦ÈNNž“CäèâåèEdö×@¥†"I˜’iæ8m•T_c–¾#Æ2Ѕ¸WõÔ |«àӗ/Ê”q‡­­ï YŠ=- a˜` 8ÎJ¬;ÿ•Y¹æúsƒÃ›ôp0²é’ÍCKêº/ðÒ&®t¤µuŸbè ‚ôŒZµB +³ÝÄ·|ðo#= ¦`:»ÔÜgæ¨Æ³§¤ü&üI¾9‰%€0)àÍâ^ó_~¶´íuýn²UUCÚy ?Mo§ ˜³.PZžÎÇFo ¥Ô®ÍÒ͊IÁ0Á…I;)ßYÿ:P›K%ÎI÷DM NJ2–¾ä½[Öß2ž)U£H€ˆ,â­´E}qy‡ä$çk~)"¸Fُh®WÃ9ö@` Ö«zÈÝC!ÔÀ½‰Ú×Íb¡ù¹ùêyÀ °½G—é7ÃýÐF\·&q˜ARL‘¢t eìYwRâwgá8V S|ïfÀÂ8õßòßíwÞ¿¥Ù[00Aч¼ñŠ¢öI®Ö³_Ç7kÑYcùIvK± Ñì*¼›Ã2´¬ôc¥³ò‰ËvE÷—ç»Úíú:C€p#è¶lw6ôâ™*Ûø÷Kƒëîù.ðÛò܌o*pNjþ4w?®OŸË½Û[ù&»¤¬©LÛhæË$AÓÛ­Ùv˜¼*‹Xe+v;In?®°£þ_n·½EÉU®m1uoFÌv) ±¯ù·êµí‹]mm—8¡öà ºõÿñ™Na’€ÆC¿ð}¬Ùüoр}“%äó·9ëg€ƒÐÀÕr<æ:ZS¯þ`5†3Î\òè\μÕï¼`"DAµ=#-®k§ÁU¸Ît„Ì|Έ2àT{²Ó¹šÅ–[ÿ&Eb'ŽÀ8¢E°‡ƒ— Tfwq¯9 ^^?V +wNN¼u=O<-sÍV0™q½o`Õßz¹ÅÈ`ØÖ5ù?3È^m­©åB`¶´æâ)0°UMŠOÔB†`ËhOµ$£jènסð屪¡K–Åhª-ÒËQí¡c¬Ó²tN*ìcKí;¼Ô•ÝÅÒ ©ísI:F!^ÔpðçC]¾l¬}!—²Vn0â;ý8Óá]µ×x7Dޔw×¥«MKC÷4,yÒË™‚±¤UT“ñ‘†FÉé-Ž¼›‘18ÏÉéC_ôg˜+yS:ÏíH‡½¾c0‰z¶ñíØf -‚yh/q¡%ãS•Ð¹Ç$ܙ€Ö»l½ýsÈõɈîçl$.Í/B÷ÙýÏM#‡òÁ͗o¨ˆÅ0¼ž+Ս¥yv6´O‹ŽDŽgê‘[­wfë~=ñTØ5f v®ÔÓ2†_gâú§à ÉœëÙHŒAÊäúïøY›ìȎNa0#›wŠ\¥k–Í$­æúԒeˆXÞ,$3N[]¤ f¿úÌB_賙=y£–ÙÌðˆ¾%†Z2§õ ß1«c­¶Doƒ æ#³V]X•ú_î[»Ö܀öòöƁ+íò%‹9—ë»Ê-»è0k9Ò[ÄUfÙILô›c†Jehpšn â!¡Cœ‚üàNɐZ¾I¼Š’›µë|?ƒ]T­e¨ +I{wÚl¢Å`a¸æqÚ±N<=<a·‘1:Le·ȀšþíÙãñž?xù¬§çcðÌè`Xr6K§sYšYWšÀ‡CÚÄv8.…¤¤óÈ*Gëz^#´.ÇY@®’u÷æH!±zHÂïìÇD ç„P¿¿+hvñâõXÇzsœñ×ä§ìœtóÀ#*{ L¡%ü4ø}g>‚{¸ÿDBvŸæ RÝ Í*‹ï1ì¢ÀÞ ·þ…¾_óûåÂ}µË˜½¥Ö«úÁÃ;9û)ê–ÙŠÅ…•Å»ÝåÙI2.[/ƒŠ[gЃEo+ˆÐ°ÿºªVh™aª¨ý¯Òé"Ym”ô‚:7ì¦s¸âÞ?åppxËQnW…g md‰H]—@“%ÐQL” žÛÓóSPç\‚ŽÐ8W!Vp]ŽeCiœ%.o¯‘!ÚõÅ!¨ˆ´"ÆCXlipLÁ ÊùåFš×a¢™»6N á  ú¬]6‹à,¦ñ¸ X5&!×­Speob}ßÊË@æá§ãÍäµòÙ*`|‰‰ÔéDC‰Ëå”ʔoObÿPÈØi¬Ú¿UÉÜ_)•¯>n(3œ¬q—úHš#ii’ô‹-®ľçï¿b˟â®\ø„RۍáC)–nrm&ÅãŽPh|˜G"ø›maP¦˜žÔÃD썪Œñ…›£KK’ ßåÂÿG[Æ~鶔àÿÊêšqº (×»¿ ¥rWˆ¶K¤Ý^Åz¶N³ Ò~ʊÑ[…¡Ø|Œ~ù¿ýh‚¬v¼ 6Tö5RrÉ}BŸÒ†ëÁš!¡WìW¶Hʼ†pž.7‡ÁUۜ°¨sî0¼ ¨•Ã^‘G¨`(óP2³óWšÖø»âúÒpp}h]ïëÁƒÂçоÑD=:Ï*EƒDAÛÏeçe6©à¢.­È±ûDîH¶®±å‹Èäùqì*àk` +ÊT×´2‘Ô"Y¾¢Fc´žÑ^£Þªéð2Ç\Ó¢–+JŠr@ÓÀÇ +Äß îð,ælÞÇàŒŒZÃn{¼æ‡a%ðpÅÔî)žàÍ"\®xjÿ©Z@Š÷­ ïŒ{4‰†!ÿ>ou/ˆ,¹αA•…%ñ˜(ï=áôÂItõÿÙïDИåBO&RÄsï(ßÚüZ¸;Gó–FCŸ‘~ uü¹a€œÀ–ŠHì†^5ÜfòsŠŒsØÄÚiáküøD¡ÂÔ+\ÈåÆ&žeÐå"È6¸GÄí%¸F=þ©ZÔåÚPQ× >ò¥víºêz÷>¼P·zT¨Þ¥siÜޚ; È"Ä+h`l’ºv4j¶È'NB@æâ±rŠdÅ!€HZŒ¸?ÚAá\¢=.'pHÂ$ÚFÜ=)b0æ–äVSí¥O¯Ê­•8©­ˆÐ.™ ç^ù6k˜ƒ¢)«‡÷hܛ*ËQ–A.Aäo)ÜõCá±çlšÏ òCÓ¿rUêêö‡í íÐÔ(²ã+S²gÈÆ.r›Ý19I}]Ÿruƒ¡-gu-ª¤._’/<]¢BPÓÒe\PP} Â….¤A…IÒïu»éo;—‰‘Êm.qȞ¹¦µûr)ˆ+¢ª»MpË_>\m¿Öx6˜j]ù¸ £XÁžÊè½óTÚß +ÑsÊú–\>GõÖ¦êØZôZ²~ñÜb¼Trã–:„ß–\[³(­mŸ¤8È\ª7b`íYb¿£?¥’ó’µE€žþ¨[‚„ +--hEÙ1’ÛÀXó,RõDc‡N§¤W©(hãÒ=¨ó Š÷$D\×´‚}ÐI[꽂hIš[#H›À*š˪ëÞÁÍá5«›%|¨”Øzv(¼µ­~vCéäc¿£ñhžÏPÅašüÊ ½PÍ«ÓA&6+ë +çî*Ԋˆ'Ô^0Èx÷ªîŽP3Þx¢ùH5z~PHŽ©C‘COƒª‡MDµ3Ÿc«tÌh¿L`Çp¹¸ÛØ*'0Ü.‡Ì MVƒKap¾”ŠFnižÆJï{¼&ÉiT=AÊÒ +¼3€*Á!ü˜±ÄÙ˯4aLM´U=8èÉ]ªŒJŸ $ùõ…M%Ð)\¾(yÄڀ¶5D'lӖU³9:PÒÿÊ\§54©’¶?(¡®™ß#" š.dauO Îðv²ÍU:(›N¦ÀøÈì8ú&0¶Ï ,3ŒH szڒ(eX÷çXèûcªWí9I;Þot¸!¼vŽÑoª0pvµ(šª!C™`ÆAhé8À¨ˆÌ;œ”Tœ©’á‚~÷îúÕvîƒâ¶"’Œ•šX$}J‹–ogwAèdº¸g©qó3èY÷{#š>ÎÖLAY¼€„ð×&ñE^½c ‚çXåðҟô!쇋d:¶Þ(­cdž}Ž^ +¤’ÊõßëS¿a°ê/üšÉ­»‰Ê“MÓÒȅí úÿªVÓjqLSã%êÅÅÿ—œA$x;éá¬ç1(ˆœd¡6Ƹ‚Í¡‰© Dm¢ù±‘sـ9[ùÝc°™(°_9‰O¼§,¡æ0)w”ä-@ƒR“?;9€c6ЦhèW?dâe²ÐŠÆÍíí¬Ù­t¡Sƒ¾o¦µglB„RÚ h_ø(q¥(dm¸ £ÒËûs/¤ð2ÞdÐ\k º†pcÖÞ6çh(†ò¬ Œ7˜Üi!™ÒñB%ABŽËwDzq`°¯þgkú˜s/£‘Û‹)з0 ~³F¶–“'Im*DŒqwP(z|FþöÏW[0Rb/ón°lç’äö´ŠQEn>"2žn.lˆkÚ¶NL‰Í+BG£¥ÑàtÓW+azϺ2H’˜iN¹&ó4:瞜۔ñ èA>rsxhÈÒA;öà¤JWÇ»ÃÖ¬Úáÿ$ä'|åE3ã3@1%ê 6Ãj\eßbž~èv¶õ +àaÐlp DÿÇô¥£Ökp¿šÄh– ¦H‹¾ XŸ±QœO5:ά‹•QõêۂÝ¾6Þ}=A>£e¸Ñôrt^˜éT”«üãuÖCü \Íèmé¶KÖg}tNO«•£I’”`!ÌÇ<ì!Ÿiè¼BĨæ=ir¶lÚr™yüáþ¥š[艰íð³ßÒÌAZF~©U АÁ„ø ür²JY‘ü@MG“¦¾Dº\Y.çS4A1quvvÖƒiÑágö!bù‚€õy‘ä†ÇùÆî’pÛ0ÙŠ¡ªQgÒãĄ½7„Ž‚û' Ð?"ë[Fè š:†)eЁ¤'4æP •Å¢8­ò´¶+8¤ŸÃ*  !Ùj^™¢›ÎÃÔÇ<=p(\Šáw>➳#£+9,¶¼†8n¥P÷wU¨Œ \h":zé †˜7Uiœ]8ëÁöGµ¾gZdÀAD÷Ǘ[9””¨öhLµÁv­i¦?܋pŽëæTÂMY×N ç8ƒvuÊéñzL`ªk2À +Œ2·¤0Žj wY•Ëìã˜;R  Íڜl”nHåõ«ÑáyÿfÁ¼ó™xË¥¹¥1ÍÃoҌÖtZ…xWvïDV< ¥"e²c•§·ù¬_•y›óñð¥èјìK %àŒ{oO—\­Aµ) ++×âGiÌÐ)Aȝ.Ì¥4äþ8÷U0°tX<¥¡˜ä 9§AØí“âDl$õð×ïRÂgïiÂ܍]Ü3ñ¥}õÁHª¤&ðj#Çþâº=r>a©±M€¼W½›¾òt!ê‰ø6é#ì!‘> —•û›š#®…1öÌÃmîÖ)¤Ì¯¿Ù3xd݅ +¾oXoéÈ»`OÄÿb,rãÑF%8åÇJÿ8ˆ/2ҖÐf*¦–¬ŸÙØç¿<ݺe1'eÛgó\PÔ÷&Ê&ŠëÀû¡žää¬ êbeâ2ã3mo®ÑøÊsÎ6º(§C4Œ@qµDˈ éc‚\/Ø6™‡sÍdOíÏ·ùāÅÅ¢pŽSYñŸ+ýÃ,ü6`¦h/f¾˜¾©  r8׈` Ì9#‹Œ¸GFj“^ÚMہ7j®¦CìÿSöO“å/&©Ë Œï|aëãU…:íC_åy5{6˜šÂ6æUüVÛ$F ðÿvUuëZT^´>«Pi£¶™–qöb@fҎ¹r>=£Àˆ\„Â!Šj^(ãýšcÀÀýôN‰s0y÷Î̽D/8%n¼6B„߀–bÈš™§”YcßØø@ð +Þ´¨€CwT;8øʈÔQå¿2;z’H¨ ÉÙ¨%BuA8âã:d"zö&4w›Yˆ¢è¦¡§ŒÖŸ}ý‡5²¹“ЀrÝ× +6镈g%‡X1b W:Ø·^ze˜ãÔHMÛ>†–á^á"Í3Fb&ªòcí ‰\¤Çû7 ¨l+å×z“¡NGâa£ ¿x[š¦ ã$Ù¡`—]§gŸgr`Mƒ2¼DãøÖ÷š‡·AHÚBM¨‡V’>ª" ðeýäðùü°Ï’›ÁÀêr a¦ Ÿ¢+¡Â§Êæš *|ÆÐ ¯4q²§môJ³ó2ÿdâ!Š¹ß;Ã~P’ˆ?òːï4mÒ¡¿7 Í9{>åü9Ϲ6YÀ¿Ñ1å J=¯ëQ»Æ <ŠÒÿv¬mn“p•k9ú§’‚£°–ߍFgólôÌ|\ÔeIÕ@£àMJjFw!Ȩ[÷‚E瞣`[ûïEMb‹žíE‹bd±¨Üò˲¢Ð>¨¨G…‹D\í Œ(ì¶{Q{¼d§i !*Jxn¸ CGòqhtã!M6TìEyž†>ž|j%Ƅ¡@^ +jÀB£ndT(žÒõ.‘»öVEˆwm> 4ôc´;$1¨‰&‡…+ª¥lÓ~ +žP³%¨¥t‹M 3RÓyD¨ûcñfYÒ ¨Elè×D€B1Ð؋®¬˜T¡˜›&žÞrËØð“iµe$‡ûôURÞàÙ(à’šNp#CУÔçþ¶Ï*ÂwŒz[œÀJ0ôDËÎѧ*lÇ|x˜Ï~Ӈ>‰t¢0ò™iUkƒø|oÏÁ'°÷cLè>Í谂ƒ9I‚¤îé"Bá Úó:{‚Äzž‘Õµ4®ÅÀc ϤGñ¼Œ7ž|’OOڋsÖ*<z<¼Þw1)Ù;‚Ìh¿0èN:ùˆ%¤v‚ü–±í”Ög=…ïÝw–{2¹‚v®d¸NëŠÁ:qÒSuÂgyY§qÁs¾e/pÎ×m÷ќö:Ã{V Ì)):ko9oÙ×gU¤G}Êiýò%ç>ICNç1áŒnŽSP3ž¾: Æétï]SœB(Dï͊hr(ЪšˆSž§Æ®0œ– vTË*\§ú/8×$LÀ)ø+¿YH_¼Ç—›JÑbx¸inYa í6µjêÂ*†Á6ŸéÝ …gÅjͽ€6Án½‡Ù´ƒKtZ Ù4ÊU›O· `ÓÕ;.ë'ÝF†ämRg¦Ž¡¦ù±AÒX0gFˆ@JSöŠŒ +¢y§E)iBÓ%þh~óù¦›ô…/(rI+%SH#öb“QŘl™Ÿ!ø0s#H»LŸá»‚ü^moQS¹¢øfµÂÄ­·oƒâZ¨Ìzzo‘d meºmï&X nõc=s‚p=r +"Õ d’DxÌR˜ Ži sИOۂŒ©J b1¼¢˜€no1M}: &qžL/Ý8QŸ`~¥|ù‡i`*¡‚&ó—WNüan/Id³6ÐKéïÉ˲Ig–ÞiÊõ!»>q"çlOË«KÑ%`B¥hŒ¬‹,AjmÔaögV=ºÔ¦”˜Ë]Èré¦{A\Ân»¸´Lžd‡K=yr?і‰€6Læ‡2Ъãú–@½ T[ÕÇ£,=QF¢níÿ žA–ä¤þÞõÜ¢R2)ýËÝ’^ïëŸH¸¼2­$Ê¡íºR’Xnm\颔$JÖ@N2‰ãŽèÄ[y­ £Ã©4—#.Õ@ñªr%Uzû{dFJç­ówµ-Hå2*HÕ垃¨TSJ$Ðqq ã)™ØÐDÌ3åsüßó´hÅ 5 Á¢u±!³)gkD‰Á°÷`¹ãÁ8w*!‚!¤Ç˜ÌMåÂ: +JaJÀ7Ú8¨a䈌!t™½·D—a–NT„P#D÷ûYh[S§GcŽˆHOëIÿèaÚ¤I}•J⺄6 Ï8}"@ lý1gQ;Ƥ9A¾÷(üÌÍZ‰³3dnmS4~ˆlèþdèô¶ÀVšMT6-p”Ó=)p¨Ìѱ܋uà ·Ì³¶+¸@zÐÁ–¿>ž5ÍïPLTÑæHÏl`ª Á +5QìÌZ)[ˆJêjXúî1û„ð`ªÑ€>`d?±‹bø9k,D5ï,±@…GÞB +QAÀh½D¥3*ºÓU‰¨dâ·.àù¢¶š³bà’ 3 @Ú\êb¬uÐaË߉ no^ÅŸ¯åQ ÄtܧèDõ˜¿Ô-«:N“e?Q‘qŠfäm:¯q“v‚è“–ƒ ËÖëÔ±ò+sBeµ9ÂòQ­" *¯ûë¹½cþ¤žUvWÔ‚_+ ÁÐUy…`’ä ã¡8 A脾Z¨~xñ^¾'€G4´\ê ¡àaµ;±ûÃòÑcÂBÛ[£[K¤Áyµ`Oìÿ ‰¼pw˜rD_rGòܯáǒïô1‡åCTX^ÎÌ-ÉSƒ,¤øT¸g f ¢G“¶ÉeU”>.º”ž±å8O“›ÁdvóëÁ5%CíF¨ˆôâKF€¼Âb^À”È-Y«ÛV4öaS$‡èŸòO/q„eó=É_Qir.(¶T„tÜؘ 4 /Yærû£p²àZ°¯¾#4´³óU[)ÐÙnß5!@‘¡_ˆB‹z°¾ô¤ÆçÏó=ŽÙÈjìiîô·ì $0%LýšÕ–ð<.KaèmQñ™ü·Ôà…@æá8É¿VT»ãP‚0²@4e +¦ŒZ²+·/Tÿ¢:Ôkÿ¨ÎDøEKÌaè¿KäiÉv©V SF¾*§|üz¾®ÒÀ îî ßP”¹]ãê@ÿ›äÒ\ñ…|¨gJµv‡ØMìU®òô*öö9.†Î1gzº0&ß6A‡ñF¨ðq` Iº~ÍKù¢Ò*Í¥êäOGXº'Kƒ)ØqÒ%E)8 V>3êÎØ?‚%¬©&ûJeQJÇû…ê¹ì”5(Ô?ÐÒŅ÷ð¢ŸEßJF=O€õâ»=ñ­'• 9ÇèX)î%bŒŠJ08¯W)µCãìü8{ò¥â˜b%Ï͎3gçùzLÙ´å¦m U1Ðsd:®R—¬Çô›¿ö¦0ߺ-ú1’Iý’‡¹hKñ8~”˜Yº—([8蘩7¼ýî°ÏwžüJŸLõņœp‚¨HhÇæüًvê›âgÔúfïà‡Ä õEՁŸ6eÕÜø¾Ó ‚ΈyøÒ"½ª«ã|Ú¢lq•FRpÓƒÕ´ÕõFÐy;hT…¾Æ@g͓9È´XÈ ‘G»˜¶¯oõ‹ßFXÐx^ çÈ%n|õ + T£_&³n¿ûµàÜ„üZ-é2Ÿ•F™é=¥%Çìq^÷2«œ©¦+~še1úŠ%г&%ÂêoËPM«Ñ’çjÉ̏ËéNš/éÇ=Z3–ïÒµÒ3µŠÞĊWí*Ž‘„Ïxí|Ì͜?¸ç?Vt‹à£)D‡eºôä0w}!+9EâIúxdýxW{ê–ûœnº1ÿè<0ém‹ÑðèîJÓϤ⧖Ò&]÷ÆR}±œ~«–Žv«î“óöÕÍ:ˆ\}ӛ×>S•ÊbOÇüÕä¬ì´ y¤ãdEOš”ŠÑq¹ÿtLuå›r–#ìuH:ù hNh9¡Äò­^J¤  ¨‡@i2¾á….Ðô(RÝIA '*Ä”M~g)wŸúYòÏÚä.dÔ1ŠZ¢¨œDÈ 5–±§Ÿ"UMßw0Ñ°ä8új˜  ppY¼Í÷®ˆà‡A0ÇÀ¾#Î_NÒ¥÷òËDå§DD.CN2' 8fffffæòӅÌÐ#DDDT¢žˆè|ð? Ž DÀâ—ÿüy^ºÿ#=UE]Ä©¶m#˜K@—ŸHwª€}¸Ëå½dßÓ÷_Þß'·?ýòÿ'òC“rªSñ§€¨B‘‡&B Š#CªH¢ŠíÛ8Ñ1!¡­B ˆÑ¶°m[‚ l#… +À„pœm±Ô +niÚ¶N[ªçVg»¾nÛ·Øö˜]ƒ¶m ZÛ¶-Èö8˜\öwWÙý¿ýúNÿþúÅ% "R‘€ˆˆÌB†ÄÍF0ÀŠ-bf‚•ª$t‘†ˆHT«±¨[ᆒ-(x„VÔ Úy®+„ð¶ +JªÍî7mU]VÅL]u¤iÛöjšºyXÓlϵ©fٖµÉ¦Ú&’œ‰¥–êÖ4Ù¶é& ¸kS•¨CžHôÞ>Ç`ÀÊē‰mE`­Û¶m["Q ìáÏó<1ËȶƒC¹l‹4y…kB˜¨mÛ6oÞ&Û¶mx0I¶\)†«•¶m;}»VxÐ lÛ&Ù݃ïÿÿÿøçÿßþºLDd*²™ÝC²œb^ˆhˆDHœa‡ˆŠdE@[È¥Àˆ#ˆ¡‚¡ðmkT£ÚÔZ­Mˆ]¢mž·mÞ&N†µ$b·•ÄÆZ%³lé,–Z$²nYêZŽ*…ÃZl϶y7o7®6ø€b „Â!‹mG»¶¢mhيvÁT33ž™ÎÌLÍÌ°fˆND´9‘‰†c+B͘PC¡&´jFÔԈª²ÔÆ&(l®YM ƒòmC61 jfjjYښÖԈ +ŽB’ƒ-¶‚Á44x;‚ríØÛíÙ³7ñlƒf§½Ÿp`>èÿúMöQv±ˆˆˆˆŠˆŒˆˆL˜1 +mD`FlÆÌ̄™¡‘ˆˆÑÆ°…‚¶m! ª¶Õjb‚ªÙȍ…‘͸Í(p+·m‚ÛˆÄÑÈѶG£Ñ¶¯dœ¨ð¨Ä;Ç3ÀrX4ȃ²MO±€54 +T,BLV\P©VIé 0î=Œ:Zj3€C»@Ф7⮊‘ IF+ÿ°c”œÉ!RÐɦ®.TAÁfçé Êýñ$z*% ztϧÐÓ)ˆ,#ó(‰®„ÁÇùµc_HGÄ»S¼6rì±4ð¸þf°ÒqÚx1}Åy×~!¸8êR÷6Ex+ë!64r3<&ÅZ~’EôF†ªãÛGà•Ö¾Ù8˄C鈙0…€Ó"“ +bK „ଳQ1›ÿ΢PŽó¸ê‰šýŠ‡7¶t\¼ºs +t5#äáþU +pÃç-Q’ºFa’çÏóM¸̬À'Ì®s~3à ÆÌ €®„€«Ú„oV†"\×àE³rxä†JÞ£þúZHE+_`¢i­7– ˜þË(0“‚ÛÙ¿•W,€0- –;ƒ¯’?€æÜ{ ÷¼½ŽFò™aOr…¡Hyñ,ò¤/b+/îà#:’-%Qü­€wlM^Pȯ ‚P+ÓF’‘a¨•$¶IX€«AG^ùǺVDк(Ï¢•Ý[üb9o_´YG÷öˆ=/ÚÏÊÑCÆYYâr"+\q±ÍÉháõÔÄdñq¬ö×è%³Rcn;ž²dðYyI̧‚2©Äš)£DŒsˆÿ3Äh¡q{SÕ&#ÿˆÅJ‹úB°÷÷³vDX ˆï½Eïò¢<%ÒU@ qÍ|œT+™#g]ŠÔ‡¾…²#jÊ°èÎÅéI7†O³éf©Ecü…ÎÉ­ã˜Ò+õm)aڒd oU¥Pœ²…ø†AO¹Ó݇çü©ŠŽiR1ò2Žš [6´ÔÀ®:±_âÿÚÁ>‚e¥QŽ­¢ÝŠXNäãK0ßºu0w +(?VGD½^ö’ä{͌äÙ|u÷›Ø»Œ?yþ:kF•é¤rX[F£ þ#PØʞ¼BšÔõÁÃ<É»Áµ—<÷à˜=Þ! Ð•‘×úQæî5k º½zÿOZÍÈsEè¹i î@,¥6yB?¥ÌÄßPI“ûù7…U#f@¹ üP O𻨌8ªœÃhŽÑª LÙ{t 2]Âg0t‰ÿ•cÌÃÃáy† ü¾5$âMæ„H>Üî” Ùèdeß¾èFPÝæ¯þrJ`m›2$ßóµ.¥zxì¸Uö.¦îGÂJ02~Cþq±Û߯¡¶]e»V7ññÇQɼÁ(£,/À)ö±‘j?›ž¥( +V8Ô¿JyG#r £qJ`c/CI„wåîxFžÞ}žȌ7A§øe¯0"ԃðŽ ³„‘‚§^P‡»ÖS^˜€³Œ~£r€ËÓ¡ü(šÇF×Fù,¥Z—â@¿»';¾‚yU„¡ +zš`ÿËÙv ÊQ‡:%X[,#›¹ÈNàZyk ÎӅÓ\Öá{À¿·ê `qæº77)CcGa8‡÷ •…hš¦ôÍÆ^ð(N˜ï¥j"J[ûð']ÄÂåŽCûH&ÌÍ6?C¶®0\‡åƒÔ‰‹mãß0J( ö ]¡¸=!Mšb±^UñWNUbûj‰œ ¼¸Iî±0ž9lv¸Iú6ü?ЇüãúR‹€6ÒŗóDÄI¶2üôÃ÷'О §À¤ÒA±û£>0ïFËւf.Øt+Ø÷ ®¥bŽ%~6NcÃî@k¯’ÊW Ác³m3¢ €Ï 6¤¸²–Õ¼ßþdœ©:±ƒQ ‚wîÈÇgM3v·ÄɎIL†Ç>ç.j+¼'VéÚã,2Lü¤1Þ +—ʱ.˜í Kc&x˨)VDw<5Y\“ŒÜ¢<¾ø +yT¿«á.d„³âe¿;¸Á×LٚÚ`^ûˆ9³fh›rG +xdÿAToØFü~jÈæ¶CM`+;¨‘J×D9èWíQ…Cò1ceÍîÈÜ+ nƐ¦ê)p³ƒÙ¬–äèi¡höàÞt›K»Ú óÍ®Zd9Ðwq|–gÅ(§9ÒããA¸á¶‚åЌc&m˜MMl¢Ô¤Iyiåf]Å·0+<÷È闳9<ð7iaÈH‘oyLõœã6¶çÞC¨o‘‘BŸ í·ià4‚ Cå˃B§<Ô ‡Ápx ¯¨I @Ëuõ×ù©[Ã8¨œ +ëژ¡êœÓZ¾ºôl]æJo æÄ=ɬRÜòUT­¸¤i$“»›1jÙóœ†ÁAh•òô^¤Ôæ•£h› ˆT›øÜ6tÊ5U–dnÁé\‹³§æ÷ ÖÍö 4pV›/æÉï'û„;yœ\^3Ã౺©ñcì,ðÇZDÅUIdó½"³K`ù755NM&ô©˜xO—-Ú~5º~‰Ú I^’1Ñ=\™ŸûdªLs˜=,èf"ÂÑÍ$¢¬Ï6›ÄÜF¬~-(¬`L¢ýÕ| __ld!ßò¤“[Ž–¤Ö‘[8ܤžú¤žƒ$4×Oò¡¤B£‚%ÏÜ^L“N8$=µ§HNÞ0ª˜¡óÊ!à0¯iîµñâ&“¦üm]ç$ú1£$Ùa€9Oã„ŠéP–?ù—vH… UáhDT’»÷Æ^ñßR†,b|´fsÃS± L2ê%ÇŒÔbà2K$zIƒþGmò¹+vSHX$¤¢9õ @³™¸Æ©€˜Ž³Ñœ·ž^Iœ'<@òfάNKZ©ø[=$/ + ºå.É:âîZfö!°¤Åìqáþ•Ëbv óÎ|}ìM¶e +–ªQ»êuEQ…æ/OU\k¯7êi‡¡ŽÞÓ¤®ódÜÅÁ7& ùò§ ~F{3¼C®¿µŒ®Ä°´"# ‚€Ô«u׿[UX}úCŽÃËå×q«ÄZY}#jìʓìök%D;̽Ãé‘d ¼X˜Ձl^‚H ã +)ÍY@¥üü™@˜Y÷E£‡N?BØ_ØùnúZKYG¬ñ‰(•Å^%Ã1f8DeÌ2è ßFܚ Fc»(݋2 ¤P–" x4—Á¹†7°fº$]÷<î÷µhþ©‹„À/XR^ù†Ç¯ÁÏ×q5A–âEš+µ£„ÔQ•ÏŽåmåÜÙµ4—À1¡DJeóù9v2ó¾> ‘ñL„ã&‚Å÷Ëj†Y åת¸‡’ˊÅ/ò¿ÀV…( cÓ­ŠÙW€d‹4s.B¯+† ²0üß*œ ð\ü+r¬žá_ìó­e_LÏàKÕ‹Uà~µ + äÄ +e(¥ØT¤ E¯MÚ¯óϨAÁW†¡Nð°í4þ÷Ñs +Ь=¸¿‡<ô#^.å”Àf•I3}8´ºÔ±)Ä®ó”Rb´–áIô ó(ãO±ž8q¦ƒT¦®ƒõ6š`¶~E†‡ +²¬©Ø+‘ýI-O=‰á¨òF'°´!ö¡z’¼dŒÓ_ …(fp³ohëâ¿ÂSU‰Õ9!bÁ†n š&RÖÌ]¸Áñyðq ïõO‰j4ô}2VUe@nïÛßê"õËxâ"# lö€ýࡨ¿ÁCR6f@€×®Áç”wæêAt€ÝëBÇjùF_„ OÈÒ? ºò;%HaBÚg•¸sšB‡å†Aýùt¡j2²[miúsþÁº~ê rvöµ³ÔUÕÀ1ìb´»Jçã քJù±õü¡5ù¹d&æGp„‹o.¦ŒÃ‚:-±ÕŽñøžÐ4’½CpS Íá |…ï:µ ’‰ª€é†b)Þ "üµ Øᇘ²[&s ÝŽµ©=ã×ô²"ahŸVãl +÷Ö†+\¬°YÙ(vn,_ýzöOÉû.#ô–óªu(1èV(G Ÿ ÒXýOB ØašìYÌÞôK6\7ô…tޑž|/´Ém-£!x¦«:Çñ•2‡^¨ñ.¸Nô֞9Æ|#Œz‚Ÿpùä%5!›_%P:<Œ‡x}@/W)ŠmÆ`z°Côf}=Û¢§‰€¯}\ð\9ôA«äg8ö +’.Y ‘;»(”.¢½€Qq©W€g½X-@cWöEtk3IºeÁâk^¥ðÓRDL§ Ç2 çÙ¡ŽF¼üAjR0ÅehÈE;PzÂq$’ä@è"}v +¿|§E6ü¿èQïÇíœûܙ:F̪]€³3§Á +(8’-î‰(9#©H;¬ßpޑŒGo–nxeE²f2ÑQE‘+ÃÈ/òõÎP¼ É(b,bТR ¡Iôࠑ›JþŽ QÉ>T¸lÎSžÜ¯H¨¹­›ŽÇÀa,Ó³E4¡k£bƒÉÏ7¸ötOTl=pYïÎávpQ”n}ŠPùÜ¢J3¶™~RDER/]Ï͈ŠYôËE»p”§>¡uxP!Z– ù¥("y‰Ö¯+ËÃCbvõ’(Ìíò4Bíz2´£ˆ§&Âp7ùÓIT•øD§¡+éÙYÕº•Ê«”¨<¯G‘à‘¨æÏÔM—lägšsˆ2¦= ÇZ%‘áûÕySŒM-0¹OK`˜†ŒF vB§É!)˕ß[9S(!½rEåÙ#«kh‚}Awô2Ðȵ<²s¢ÓØVàOכhB·ÿyfJüŬ­þ‡¹¤›†y[‚î8¨T#äÃh¼>Vöޝ¸I}¢"þŒ¶Jêäó ÅÕ ï?•·¬”?åÊ dϙà±K¾µɈXþ©C ¯o¥]$—H³9O ~œÓe ²¡Qã2r{èw‘ {‡Úkw0Rf¶q°…ü½%©„jQ*XÑ_¢kLþ˜ì j¡È¬zJ +*;з'!ìPP"u¥’ŸÖ2,˜,7ʐ 2ê“"㱟öé¸$0,¶³Qé­ åá;5õÀo ö´ìþü†kHêÐ`«Pg8Nç½\g `s²UûÙCfø´Pœ~Ú@85ǐêAj+ªÛ|‰es$’#ˆàB@rª +›“mœ|ᑅ6ÇUZà+Uõ>ÆÐm÷8¼%ZÿXRF- O.übށÀԎ‘ñкkøäÁ~‰O…" £0· Zà9ª™"*™#k :GÐX3üØM&€Y)®A–ݦRÝt`Ñ h0ÕqMá4l¡æVôHFT|ÐTe¸ üÁÚnY„š%Ù Q<¶ç ©¼cð± ÚÊ%s —‰`âÆ+¶ì)¸]ܬ¼úü‚S?IN#—7!àÖÞ + ꨹0ÿC{ñ$Z7ÐÛÇý%>¦–ÜQ†’œ¡¨Þ‰ºì#2§Ém)æ²p¾çædÀìø?R‘`7ڒh48”äޝjLaqƒ>aÀqOš* ²œœ’ÜÆåá¯C +Å[ÜD½tú‰Q¡‰Å=ŒW‰[Îi¿‰XŸýDWgæróQ†$,×³Õƒv‚Ó ‡ë|A vˆ«±Š‚2qQ¸U§ªcN È‚pt<Ëry««£¼èⱫƀ¾§½(Å=–Òá*ì¶ORÇQJ#cld_‡,åH¬'\ž£vÈ\ÿ´hEü$•œj<]>uDż@üWºú‡øAùžÞ„9ên€ö«¸³àUºŒÌ® ÚÄå`æ÷òi%Òe„r1.W&-IÔæÂÜN&.ãZÏIÓÅLæ~}¦°ô‹ëœÒ:°tñ<• +k`\ˆ^fa._MUKŸwP2¿vEE"s¡T•?Qaò7 +i«‘]$ôÈhTgt!ç©àÊ¡…œ’ ¾ï‰‹']E[hQ’‘BÁÈðøç¼EróÔ—×Eo¸—Ýœ LzÛĉ£@µÜXL ói´HžJ{B‹Â Ðk„µÂµAB4 ¥‚;@Î1\”çِ©è$(_;•Û%—»­Ù_Ä¥Ð%bH [»á؆ÿŅ7xì”¤Ë ›ð³’P‰²bÚáÏÍž2I¹å.Â[H{ªÇ-‹Œæ#evô@¼ª±í›C +OŽž!‡p“¶Š|ê †í;ʍ^ +cNÖ·qÉÞ[S½Jœ@¯ï°OB®={C„—ƒð£RYêäÒ°ÐH½mT¨!xûž„(É@GlìktnÐí®â:6>ridNï!ÕàÐz¤ŒÎl6(VmåU;.†> z§Ã„Ÿ©ïÞþ’sq–ýÀÒ±Ý+Ë2 Ê½ãÇFüeŠu#•"htipÊuńƒ94b'6šeîk½¿Ø‰í|¡kÓ h0øT+´V…’ а)é00‘J®Î3–Rx£ +¦Ø?Ð(¾>¿b·kMѱ"ÐhŒ5…ç”l5ö_%»¢òKËð–Âï¹åõ…Q€~`<™ajÂ'L‡¤TcÏÙÈwðda©ÉP£ ?)GŠØÐØ+ f¹•ƒ9¶CÃíjKÉPv…Q)Ÿ^ìJ”²æNðϾÖx:±Ô14¢F‹£´ `ԑM¸¨$ÊSÞ$!ýÆüŠ‚baÁGtˆ¥¤í~õ h“g{ 9(w®t螰4, ²N2 ®¡œ˜L¦ ·׏¯éÙTpSKÁì‘ê1øÄu]êþµs+)5:ÎÒ u.a³lzUuxdãÀò<ÿ¬ð"Lyz™pzÒÆ[lŠ`šò¦†ÄÀH¼å–ï•àPôò/{(í‘棾ƒXº£Œ_ï5”̀䱥p=!ñºÈîøÆ^⏭ +º¬¿ºl*B!⮡z¸’ÆSj˜ŒÕÓiåžô9Ä&)þˆ=ŽÖ‰!ÇQo&nlQ`ª=§¨r‚þ2yZcE®*ɂnìŒ@2©M'yápQ§Y†o›%´anà: §[o$ X‘è>stream +eüØFìàÁX&§¼‹ ý ;Švc¶ð• åyÔ;ìတ¦EÎ+ÞÎ3 Ô–µá‘¸¢˜áÅršo˜‰Gĺù: ™Qɞh¡Bd¯ÓL7§ÉŠg„%€§ðn9=ð¬ºÂ,Y%´!-ùƒˆ}–:ð:hþcBªê5•*dn& +Û¶)8t¥Ù˜Pnpø^T«Žsݞ’õ.Ž«¶ +@ÀŒ×Iºj ªÝóèÞg Ç!±Ÿ›À«žeüü‚Y´ ê¾8Ú¥“{j«î²$ÕV(žkŠ +‹y$±\7ëÇ «eØÈTIHå´CÃïÈœ-QiYªRa „ÓÝRå“!..ÐþxLDÿ uíY—ø6CKÝÜue~•Ö=ðA5àVh¹}GظT›“ÖÓۇàe švò`9p†³°1-çÞ”y‹Ò +ˆÔíל¬hƒ….ïÿ†¯øP9ch-KÀ†–iÉ:Yp×-¡£AïLa¼[,P>«ybSKdØ!¨-Z1yK v7§¼½³_e&ã˜!€K÷D.æí>Sû Òhš0å,ќÖ&JËÄ1à"aJDF[€ßÆtN•ã yŒ¦yðhôБÿ A ¡²h¾MÑ#Ù8ldtZüL8Çèð¾_LPD‚µÖÔÀG96*Ù,×Æh§z@Š—<^€ß1Ùròþl@Þ1šKb Φ?Fƒkµ«‰wÊÑNÆ®oÉz¸AÙ³CFkïy*£ûóY ý€Hb!‘\ƒPH#4‹%‹g*ÃyS3¸mP^e°B-ŽçDZÔÜݲ“K]a[ ¹G¤’Œ•´­•„Plr^†ŽLÕkÆÏ+\ÂüŽ¡óT‘”˜8VØ á :¾¾³ýÐW`ýÑ)MßÕR%ÙEH o8)çVF–“ +¿N¡XDˆl’k•2gWIÍs…GeÛ㉂Xß³I^ig켈1€xP5 ¹‘é·›å–ävÌ©«œy©§pÚ,¬fŠ‘†‘AmÁëÜ`söZ(·Ñâ˜Ü4£¸ú`2or§‰‰á ·L–’ÿtCãÒb)å“ÿŠ^‡‚&—›½T¤ýJ¯_=B“Q:í¤AX¯1y/ øþÝkúÀÌqòÆM>|a$—›~‹ £.¡š§ +«…ž¦ÃÖ5yO5üçq'«˜·"_ÐÄ:‹vŠi”ŒÈ¸Ë˜ ”“mÈfɟð¤Ï]ÐÞË|“čËÙ® ôM7˜oÎ÷_rk|öáPSXðDæ«5%³ÈÍ/ íÀ(s'ßÉûWmª ¸á¯m +ú®î$X9`¥`ӋDÚ¿ƒÑ%ô l^ph +2Ç ÔÖFv•Ñ³5ÃnZ9—´&Vîl—ªÀÈš“&|9ÍDƒÿe€ûGæ<§ö¦9ÕCÅtðð1#)ͅÚBèïü4w÷ÁƒH´ÁLƒÉÌ8hüz½O‰ d ¨L:f ,‚—><FîÂÒàÕÆK¢ò§ÿŠvý9“•qJ\üʸ´[îB5“´YóÚßz¦È˜ˆÉ„Ãà1èáÜã^¯ómÅ+ʂ² ÖþBnÀì&h ¼”m͚Í4ó`Ó‘¦]ç$ÃÉêEj×.â•ÖY26Óe½<”ԁ¬:8b‚•gå‡SÓvÏä7ðü`ÿq(\áœGCX¯–鍌S@pN(ZÕ`WæáwÕ°dòC¾ì{LøÛàìGO,È\d[yj¶!Ã5R8×½ë¤ Ðø†°ÿ+¸  YÞc> ’ú" upV†\À«É¾½òDËIÐA§á©.F¬— Ò/6^w_ÌYš©á6\÷ÃœØæü4Œ Œ7Q¹†oãWPèV˜nd™}pÎ} ‡Ò‘”^Œë‘H­qL °T4‰.{Ò šMq£$‘û‰áã /ÎIp˜ýÚàG gûËZ$À7yb„*»WþíâÕ±àXmè£Å€ h©ü³É­ŽgãE[U9öº£^'Òz†<òMÛÂAUŠ-tYŒ,„ÞâC :á«óóœ¡[ÒÒÔ&EŠ^¼íÐzÙÄ[3óË°Å·9=¿ìñ¢øQÞqôSš‹~b’ôà@Q«èDÁ×.3§Ù)åñ”·£–èo ‘N V…A0´;\ðü@2®Dh/9ŸðÖà!I-·µ'\SJ `Rwi.VE, "kXóùáEþ@Íý­§ûI×ü†$-kѝ€j/&M)jM¸SC1÷Û÷!¼Ñ‹!›ØWBœŸÂ l +‡Y5¡iǬ\–XãAo.õÌG+÷}(oxÖÚ ç¡”\i58¬J +™À4±áê1Q͌¥ +ëåP°"”ƒã~å­¦LÜùa¬Â›>é õûæë#.„‰£c žªŒ„Ù•Oå:Y +÷‹2‰á–Ghf½WÔÜæoq› +4a†FBSl!*à¶ÄÁ†qÑæû]¡ºFÑUԓœD—#Èhژƒ‘PÀ/‘¨þ1¸=˂âÕ°Fð@¹…¡óú뻊,T•¡ƒ·†!¸òxKE_4-†Ÿ”"Cݍ÷‘“ywNaÅ_P1Í°˜È6Áš ’括‚€²}eÏIx3 [ +IJÕ{¡éQAøÄjâ–6ôn£ÍŒ½’:™š/¡Æ#à¤kc +ZìµKê|;F $ÚÌëo`³ËV“D= D_\¢«ÅÍ@ Kmä†gR/^‡ñóBàM¤Ë± `÷°ÖWô:€yF§o¬ÖçöéÌ|O€ÄB™—ä&úsÆ`Yþlu@À¿Ljô:tH–³w¨=]üˆY뾧-àëÁ3fIÄ6¹5‡óà±_ëľ@rþÔN“RÃÓ7û˖ˆ\´„º¼ò9,œ‹eüA·NI˜¾E}¶k'‡à2kcC¯~þÃgGe2,ÁнÔl;&.ÎvƒSãýf×CcéEÒ¾nßl\Ø ôP³è ñ°h|Ìø}2½äG¹ÿíÍ­ýÌ!¦ÍûDQý†A>sKkóZ§^CE•£§Aº9OÀ]ê+¨"Ë-PAa£¥—`B0ÅÕãdº¿Š'Ú 97sñ2~#ìŒxVëŽ:öðápp©(WŦ´ðSÀd¿¹ ;ñ÷O‘c{Ímðp›õAàˆtNãC.p v .ᯞÏÓÎoOâ<Ô@‰˜Ü£í ÒÓÐZ–…˜Á¶IÑ«f%wÔQêÃqêc5¿ÊßD"hFÓÒ}žPN©YyHdl@Ÿ5âSv>GFÁ!§H_³à5‡6¨=6ך€ˆ·ÍY}ô‰ê<$dÍ9(RÁ i¦ƒuÖŒ…LsÙ0þrzéÿíÍ՝¬+åÿ,%¿7D´KfíìzÞTC²€“™D-8HÜC÷úšâxˆgæV3cw­³‹?ÍÈAG¥¹4„…'¤¡ª +‡ÈÁÊ3eLߌ‘r¯`«™“ieãcÔÑøÎJwŸ‡o.VÆmý9%¤P«þÖ"Wĕ?{1׆?–7€Âè݀ÁPywâ°iÕððÓ̺òàg/W«puft¦Ö—ÆèNȄ»¢¥iY g‰.‹‚fÒ"ýñXZB˜iymJ6-#:Êr~XE/ x±Lœ{sՀ¨á`ÌûQ¤p #/…è^E^øÆhên ÃYˆ„ÖjMJ…øÚÀX±QÞf%ªŠ©C¡î‹2ddzÅYÁ«•! æ¶:|\îžZ¢FõšÝ] /‘OÿCÙ-“Ñ®µ-Æ¢_°ö™Ex±ŸÊäåú5E¬¤}ÍU'«ƒ–Ps“!{5G²¼q@¡¸*ž£2Ðø]Œ¸ÅP±#–‘EÕ +å‘d{´C­‚´{TC¦£3J)‰ñ+”0šša#x†ÜÁ¬¡jÝ à¢æï\·אâA²GìPgŠ?f0vЭBL Ïáߐ;Þbžr0Ù–^5Ñ+ˆ`æzëî7¯ˆ$ôöÐø:ÀJ­ y'à’ç7kø ç ¼‡#MsÉûéP3¸(Æ2~'|:KÖêfκ|`Øcì +kcØÐý ¯rj¿pRªšÂÐèÝÓ”Ÿ ŽÂõK­:ËÀGLTÕM;þka˜ædÌXmÖÛM»Ï±zxm¸N|¸¢3ØÒN:«÷…V!v·mŽó2LÝÓ¢Ëý 2õx»{0×&8no +¯¯ABf…´âÔÐ{šöt¸ï‰[·Ö9Ä2‰­ìJ×*StXjÜ æªz$L §¢l³*Ö±ˆ‚8e0¾ +"RÆUùFXÄqPƒNïÖE“…#beËñ ©“¢~‰¨†T‰«Æ̤;˜FRJ‘ˆü!cEˆfsùӟÑVYŒc¸žµÆEàãGð‹Ó#)Ï4ªHXŸN=•E¸ª.`ovq†ÂÐ~" …hèìE%D`,£+nÀ„èש†o†»—v}S[–\Ø¢büõȊ٫+ì€&/É2ªeSÌì¸mR"‹ìsÇÏ\ pæbƂ†ßSOœ'õ3‘ Hãê7Rañ'=B>r ±ºžõ¾)o²ÏK§šLŸsR`ð:!«i:4ÓÛ:Á@üõG·žC„ÐKVŒEéyIù$éIKÇ­¦{&õÅIŒ°a¨šïó_JiƼSXq]H˙x,¤Ñ>{‹Ðªà.29“N•FK–Èß{SÎVŠNµ®ýQÙ¶[ʏdØhß%Ũ¢@Þê¹Ü4"„9àU·ÞÚk  ¢õ“¨vU@a÷™:ór¦P҅ÿ±×—þ0¼EœLÛ÷3÷n“æU +À?jïë¡:ZÐÃûŽQ¢Jfw#ã­Úm›D¡’†¡üû䝗AÒà„úÕe"Öhׇàî×±FyjiÂ;RщR§QÌÆV2W¥»þüä`Çÿ3Ï»þK¦7"¢du‘Õ¾ð+œk£Oi#ŗkC‰ô?ˆÀœG÷Õ%aò>Øm^‚ä47³Æ•-—åڜ\ ôž +ê’#kÇ÷ÚÇ«O‹…¶ÍQó\¾©}F÷± ×½¡wA4’h¯Kd Ìæb@õŒòo5ŸôÞ÷ªÐV–­ÿZéúnb?,Ày F­‚{1˜5pü°¨Òöèa2æߗ¼Ó“åò– s…¸4ÔRÿé0£|lf©U^¿ÆwYXîâY¨JtߤÍõÀ5…Œ ¯×eÜ·YoÉÍ0dÁË c·½ÝO˜Ô¹_¡5yYYSXFƒßÅ£QqK<‚»Ûç ª=©f“ #oð¿%[TéÎx_xFޅgtý +炝.ÙërJFàWzÃ¥~¸ç=?KôúG0¿`0#PÝ»<ÐÃì`ú؉h<~¶YcqØDK‘?`Ø5ÍàˆèS`ÕÈÉ›¶µD<‚úÇ%Œ¾S?lg“Ï/àh äXw\ —>“|=K#w×bln„L"ó·2ÿÝè9ô“–LÑ£W ü›“†4â rÝØɍlmœwSè†'3à<å„Ö÷çeaå;,ô2H•*1–¨²ÚÜæ3Šº#†šo·“I­¼Ã-Ͷ€—€a¼+ˆÀÅ.‰øО”LaÀÓy¶+õ–ø;Úèym×üŠš%, «,±åªÐøž²ÕBPß|öf›äH¹Ù1¿³ïËë&[(×{AÂb¬)‡ö‚cG aËQÅöÜu’&EBLºgáÒÿJä °FՖ4D9ðJ¸ ¢ÅôT˜kqÜfBÜý‘r™¯rñ²BÜ ^hVh†sÐm'œÕ@—9É7à­è€ ÆEåe®¨ëPБ¡FÕ“}Ì@E ‚z"‚°r_Nü™e±ã"”§…/?‡HtøîR‘ ²“ o®=ç\ÆÅMÐק¢ÎTÊP—ÔfzX Ü:ˆB6j¿ŽÆ2a¦÷»t&òO(sŽã.¢Ò¦ßõpítÕ”/@ÏQⳫ±5Í)ï•9¶ÎBRNúänßËËK›šûkÍ“-ÐP0уÒ׈„·>a5iӗýàoî(òÀÍÒó2¦t[ëÑiRHjjrÖ²“OUCb ÎóOÉi-'>¹X™j¬YðÎ2@6;ktòîéíz™ÄèÞfŸÜSÒb´k ª3Û²ä(7rs–ÚÁœa»2Dvfš*Þ„z¿‹|,æˆZh`¤8´|è³e܎nl¶ +¨ÕlóaªÀØ®‚¬óËÓçT\fç ÓGå0ú`3Ïi ñ{¢œ+Òýaà;*ª—~ÃX§¨«˜!­l¦âэ4ëÞõmÕ!è¸Õ¹DÈ=JC\%rª°­ ’ëWRÆ©Þ½·„Pú±8¯ £)²¥¿Ü £ÙðAYøÛX7†ë: Ò¨ƒþ¨Ê&zvþÚµj»Ä˜"õ÷žk1$Xïo]MˆóÔ»² ̄#_äi­êàrRx±.†kC¢Ü“¬u!nx?–¯«qhGì÷YU†V zúžäÏtB$‡j·á\Ö·n¦­RíR˜CkJÚv*Ӟõæ/ʯ[â (݀¢LéË°êüT3u™nXƒbGKâÜ3Å%¯çìÆ-#.zážåˆNÄÔÃý¥KÐÄÉ\xU€3ÖmREŽeº×G÷¦b”[8¿ÏÙ+D—4GŸïä@Ø:q jàåàá9ûê#^ +ÊRE"KwIÖ]Åh™C'õ¸jBYƒÏ&ªK§ÿð Êû{ûß·¼±•:³ Ê՗Ë_] ÏkW‚²KǾsṘ›ÌjËGàEWŸêÇà6°ªØ\>FøìÄ4;Æé&•K˜Îà¤ßr *êPšžÙÀÎëØý©ŠŸœé†¨:(žÎ¸‘^ß}ò¦.P¥ž=¡4¤.5Àô|°~'ê­¢¢õWl~…*É1wòoºU›ô6°ì'xºœYg:y[ +Ã2#bBbV¬¿n^®ëÖi¢õ©P}Ošxk.<)d ] pFƒ·‚5Uø’Š`\ý=d(æñ}ðÉÙùÅÌn,7™…ÔáyÚ +oÌ?O2/HJ1¢‰¤ê™ ÐX©†Òކp3Neq™ƒGZˆÅ)ç&.%-#çÁßÔOÁ€ø0žITÜ Óådhã¡mså¿:D`@Äi˜'¤”õY%u£Ôf?F)P—j’Ëvh_e ƒÚc*pœ]H”í´ðѸö5¥ÆèkÿJ&.ÚæÅ Ô±²÷†ŠV[C= +a é.BJB›]ñŒÊËCÙДƒEû¦ÍŠb/{C`"¬¿/«¦2$=z dd5°8¹ÕÄ¥žÒJ:ejÆL „ÚÌìwÎ#r™G.ú¼ô(tBO +gFÅôˆèf²¢GÁ{í/=R¤zDDÖ#²l¦Ó°ûä{‡H‰›mŽ\N’˜¡“ŽÖìÒvë 8Íìf ½íÑ*bÔ§munrWüOÓÀpåÎÙ#³‹¸d³£æ¢8jø› †WI1='Ôóˆz¬›ÉCƜ  <²Œ}ÉÔOSÌ#÷¼³²ì'ž©Ò +×ɐG\B +Ø¾‚pT¡G(®÷eÕmºž´Éž—¢…f¢Ùє˜pÌ÷͚n%Íx4lv…]ñõ=±ŒNL)ÛÖѱdÆÄ·þ¨b|@2ìeSù{ÄVð¤3ÛÈGÂý©îÉ+ltÞ­ü¦oŠp’a¢ñ)BoüÁË7î×*íêRÖêR#{`¥ÿð}¥Óp7ŽÃHgA¥·?nª…q*ò[>›@èªÒ„!€Þ„àÁeòO_"ƒÔþm€ö@QÀûÂ1–“G¾±ÿŠúŽ&[›®9l D»Ug9NVÕnxU–Ói¯ÙAI9jÕãùÛòŸ›ŸÎÂÐÙç6 ÅÊþë“•ÅNcmÂÃæ¯êW:A Ãè˜UÅ ”¦6³a딌|™9[…N¿âHJçÂWk6ôR £:ÃP*T}¿Ž6 ­ºÁâç±w¢[ýú.–…ñ¶·Œ"¢È§Æh$3cًkJŒ©Þ©èÀQ îi`Žr½¨Ð­ËNµüZˁ°öaj÷X.•¦Á5¨÷—ü,½…„éћ¡Ý-Jéíâ°çpØí ñÝ£í%üRŸƒÿ胫>ÙX©ÜØÁ¢;^?z…ƵÐÛú°Ïqäu} ô¾P—Ï!Ùû±<ù»Õäq=5 F*¹'J¯Y`Þ<’'z¯à‘,Çþ‡ˆ0ɯ•ó5Lâ+)mŽ|Né¾Îb.G^@¨IÝBBI Юè‹^ (½“ÖwH¯ùY«$¦ô²/wØeLïõuG@&#ª¬ÿaÁ¬pü‹nvƒÛOï½ñ)Œ¤WÖ mn ñK…émàÚ£}J£¤7‰¢Œ'½}¥ªBéÀ¾…Ž£#0—ÔHiS//TTõ”"@tfüÿŽÌӈDÖSçԛ­Ñ +}'q9½´Uýø sӛt3–: +¬cŠ½cjrNÔ­bBâ¤8½]äˆû£wd¦Wö‘©sš ëUî4›ûÀ¯Þ%d>õ~KQª§a6».põn ë à}ªß¸›ú:ø@¾Î ®s‘À`9p‚.”cýÓ-è!§Þ —‡á)ŒVzÍòZ†ñC]¿ ã& +¯oCxÛ§ñyIu‰=ƒ;” ˜lLîÚØ·ƤtjÍV.EEÄu…ßÉ?õ¼¨ä‹G›Ê4Â1ˆÏݺ‚RQÀZ šD¢L|Éð!—DÞ´Z,‘îNÐkûÙ±í“Ä¿Ÿº^¥z0‹w… ÿ¨þûkì»Qù åŸÄ³¼5«y ¬EX–A¢ºQ”°€º‰fÊkíTo{“æf¤®¸D ¦O³§mè)ü¢dí°h"'E$l&fҙû”½g»`R€ç_F°þpRÏùKkڍTã2jNBÌÜu-4O‰óóDúY¨`“ öôÖÀ¹6»€m¬ž„w†'à?šËûôÈHt†ep¤.@¢Eª_æå<Ӈ·e"M„۝X ²29²Kn(Ö+ ±”ö!0—*&î‰4\1Y6ٕ³9ªO‹p +ÜCwÏžkàÆFÆ`… ]q’+/¥„Ùö–~;vêîV +4ì”êSTÄoēæ—¼Ôø{ûý­ÙèÅ?Þ4î {Ca$ûáÄÔ&û-aŠt,‚aÕLǺֳÎ:ƒ:QÌÍL7îlÙ¹pãFªHfz½»É¶¼6®p›ˆYüã*8ùÔÎ$oPy•¯¹e0œ8µ­©çv»,Dk;¦Ö+‹ŠàdÒo^Lï}†ýÌvÕm4G¹ ÈQ'ÛŠåG;QJžÛ)Ò àPîÉæeú…ÍjAh6ô<^^ØÒH³ÑYëŠåâIÊ©å1†FcivÚ‚á¾øËÁZ|[”|§z!•ßQÂâAEõÍDzš€Ð%fL rDÜàùxªÉÂðóq€ì.Œ!éE(5Ë5€Ï¿;á-õ/ѕ‘t2²,évìƌW{¹Ó†Ú”ËؾS²šíååžÅh‡$%OQ )’XóßÌÁúåñ(Ê$]ԞÔpº#˜+³*¼°9äQÿG2<î£NzþA«#¹Ý¿ýõ©MŸ6f϶Ì‚ ‡öàb‰î?5Âü!RZA”.‡œ…]×©ô*Õ!:j©Žjeu¨TGÎÒÂw'ÈQK° ÖXö÷(Ùvuq·Ù¨Ohaâ R¬J#A-ª4â%ÐÇþ•~kÏ <Õf¡Yaö;þt€$ギ°Š'6Ò¿˜…aì‘7zµæ»Ítˆgiî5Nll)ª‚³NMÒi;ÐÞqÿV#>unhƒDžIƒF™œºY (h®~TuÖ$×:êÖѹnêʸ!1 Ì(HDOú;£"Z¶¾à‘Ï27ÂMœÏ>”*™ +Èmøx¬ŒƒÊÏv^褃ójbŒ/bˆÆ9g2 Í!·2‡ûËÆNö¢BôÇy„Äß=q”ûaÛ"H* +û/TMwB³>ö‰+8qS¡Á“nzY?ê™®Š +HÚbbŽ?—V>箳ô¥nQ·ëj´˜ƒ!šsì ×¾OÌv†ˆ†VoŽ`=‹£>–êۇي1æ›#…Óß"2&;ŸA3v'4åæYŒawütÈȯ‚xxt7â`ry%…MðÚfkúºÝ†3âÙ$W‘5ÝܔŮ, ê8½Ø¼ÐÍçLJ6S¿\·¢ñ×P òܓ –#Æf‰ŽëãKoue€5ª;cl"vi+­ˆü]’Ï°©¨á2Xeϐ(*R„x4+ٔ}œþΆ8ޝ‰^ç™#—êò,3…YȎÉ9ÀÞô”Ýb0®¤ðuõyDñü–Fñƪ%Šãp%Tr³"r ËFC#û¤Ó­q/7œðÜÀFuëH†ËI—l˜äó´EËôG †´N-CɇÚ&gYömÛ^ŽŸvnßÚ²™%(Ò¾Š ñ¾E^Š«¸‰ð[» E'°“q~çf`©¶Ð±sÄ ‘úB¾½Ô'Å,8¸†2®w…XAaRï»HO Jt‚WºÓ\b,œf`Û ¶ |)sp'¢•À;• Í7¿±Ô„ P *ôƒörí3ëî“äé÷ÆC +÷ÚÁXu#{3Öâ +„ߛ߬Lb‹ûþÖ}g7­‡Òw¤Çdz±'ø³2ÔòpØõÖüÑp¤J›ÏÌàú™á<‡À±s0\ +•Aƒ8š2 ¯`&ÝÈ)>è«Â3ñåÀ…$ûõ‰¤Îhèsíl]­:ä÷‘!V—›Ff-×m´ z~ò%0ƒ]&‹ +¸>ôàÅgOâ¹ö±pL!íü„,~ ­j ´ìJ¶†0z>ÉR E¥6ØÀ N sÝmÛ^X=eÃßÕ"VpP圊¢`öi—&¥öthÕèž%úÆÚÞxjèBs,ªf±*°õ—!›OŽ£7+88KpP4ŸCÁ±¨,MÜ!‡dš³=ÏLÛ᱃¼È’Ր–X­N…/›¶6ž§LÌ Mž L~íVw/*xœâB€~ÅÌä/ݧ2xõ“ºô­%ÐOX“@-€Í±½CEŠÚy³¢Q’¨‚M€Â+ÑO7¤Ӓl#+`Ú® µ)˜>—€âÒ¼ñ]¾‘åßØû‡)‰4ȇ‡ëßFO°Mkñ\sUÖ(…9³Û©ÃíãРXÈN‹‡¤hÀ¡ö ŸÃ1¼^)j+ãùʎüj |¶y–,€m0)rGö>mJ€ïxxùH ÓÍd7Ï@%1l«¢¥¬·ìX¥¹€#øicóT(Ž¦b¸Gˆ`[ÄÿŒ]xxG }#A°Ûs+lããÖï*,~ÎI¶yIƟµ-Û£å W÷PÜÏðCŠUZZí§ŸYû7wHÊ뉭u’Q}&$ö6aºm™ ë|0Ú¤ÕÝg>ÔJûö:(1Án¹EWe`Dyµ~בæ:0Ëd¸ˆDäE݂»øšqՈ-ëÀh±ìn“Qð˜m'·#úÜn|˜Å´†~áqÛnƒ*úäџÛp6hºÇ¦ÓÖ䍊ñE¯}›Á,Þ¹óBåÿ#—$VªV†&Þ¥„àÉhL+:j“¤õà×ÉÒ¼8]xÈÆÿ±؞’‹©çM=}’u•y¾·Òtêù£œ!äz¿Ê-,Á.í.þÑ¥)<—öåx9›É»ôrZ3w”k«ES³Ûô@eUü ,:kbs¤Û¼º¡’0z·Y Çû)NŸ‡Ž&æ¦aðYEüebg¼»¡?]V`” ÉõéB=ÙZ{”¦¦X!@h5.ŠdÜUYà È? os¸·†7­1yG?ÕØvn†EeC¸„3dtA’ô ÜR$âL„jȲw4Å ”1fêÉM/ÞH°d¾´à#}F§VLC&ƒMûÖD¶^h g©³}+Å׿I‰aê¨*‰[\†ÏJî¸Ø`Pð¯§Ë¬àæ®ÞõÌùOÑ}ØТ›Ïä¨mõÝo$þŽÍÕَ НRAêNôÚ^1²î·+ B¥;bD†坭óˆ¯ôî7ªyümúeÖ8„Œ a=Ç5äñ v½`Âêt)š­fHãj_à<ۦg§9ȶQÔé!o©~ Öü°áʨÁO+Aûõ´¨R©¶-…@ëa…ò^É +#Žö›áDÈËäí7±P:Åcs¼‡rÐË{ç;1ïðXL}}-hm­Û‡ÚŠ€”y’(°;|ÎcOæIزí{(¸\蜇“íËWX™Â”¥²Çý/Ö¦“uézag6•Hè%äÔÑå€6»¤;€+˜›ä›ÊÊÙã=¾Ž<"-Xâyzt"Ë@à‘,w©»\¨g[hNöÁî×À’§óò䕺Ü J;ãgéþœÍE(±}«~M×&ûJ³6¸¿P}’7}Û 5nt͸²f›ÙëÃø,¥ „ŽäiRø¸igyñ½<ÿj!«*† N£H³ÂÜ®Î;EékÀh]M?ìôpKkq¾EP`­!ßK ×GÖËë/×q|cúöˆ@­Î¿Ì¯Ãš)iy˜øÑë|gfÅ۔ Œ=çMª‹ ”Xþoà« '%üó¡õ–ñ+¦%r(Ú!ðx‚ÁÊd®={¬bgJ+n”¸plãlÜCÚ"Gp§?·–cšÃØ£1I¦þ›H¡ µ Ú)ž~$^ª;º…í²®÷,âDF˜ÚáòXŸH¥Þ ôF`ïð †T~3qÊ¥‘ý¦éŒè—"e¹?†6q ã 6Øö›.-ðM†“"ÓyˤÓ)¢&Û©Èg½æ°Š”¼É¦jvÎvžË?Ñ(8‡8èå–—W²q-®…(MÖEpÀ½#°GMtš.̝œ"šü6>·D$o´<ÂÁ0ì^Øî*;¨ñ¶Ü z½œfŸu›øçgDD’2ËäöSrøh-=,d>uƒhìïÆîkæÀ4T¿_}àƒz†°Â7‰ƒð/hÒ˗º¶EÏqö)îYª1Í32¦¿dö£‘Ùµ8äô/â)U`¦͎ +69£!;kÂÎ Œîçú\ ç»s§ªô¤PFßÞ¯‚ƒV½Ì„“9v¶%•.@Ùok‘üÚ[gmÄÏÖ³´mÑVæØN"óEZã{^PÒg0e¤µ)Š! ºÝ‡hÁZP³fpÝâl½—µv9w+?fmt6îü NGA΅–Y›þŠIõ¦¬r=Û®Í%[{`:èé%tØE»Þæ'KñáØIž{ç]hʃÖNÇᬽëډz‡µýN¤°6ø®`Ò«f«Š™OÛí—BRz¢¨y¯ p³™ä0bÀ£_ÿ³EU›)nŸÚz KŽTr5j: ^š‰yyÉñwdz$)v€ÒÄ%¨º§Vj+Ç”˜ ˆ"$~D%DЙ &Ó±X™ßÁEW‡ç¾½&TEÎaÔ*cóiß\åÆwÆun%ÅÁý´ÀûSV‚Úò8 .†¢øâð¶¿1Ë=UöÐj8R$ìi[Š qãùi‡ îM»ÃG 8¨È« —N¹ËÍ2Tveˆ  µ¯_,˜zl–‘ã,«É"؛­û'V °g÷䭂 +jk“X¦) +ÇR»Mt<¯ôÔÖûñsØþiöø6X›3Üw3œ¼Ãöh;Ð+Ь¯Íê!rÓ±ÐmS˜oäkOK]ûW¨@–nùûÖN7•Ÿh·³µüÜÙW5vH;õ®ô·6ºêY2UÞ"Q=É(}³øÞ®½ j›•4Lœ™V\3 yì&ۅ{Õ Å­–ghxó,e+„«ÐRÇ¢ž +&]ÏZ‚?Ïê`¾5<©ÁË|šY£@ñ³ ö£ ša<@Í@ۃ'ŠÕ]«¤Â£MœM¨Ë_ §ô{'ÿéÎ,£žÑ&c[Š,TEf© |4ÿ‰Ýԃœb5ºã’t8«¯‹k¯øJoÈ׃@<– ¤©è'•ã¬c*TŒ}¬êsà ԙ<¢ÁßeáÌOïË¢§Çv Ô¾p ‘BXê—Þcfïb1— >ËZ`iS !ušBæÁ–Û&*ž è0p GIŽdÏùTÛà{ªÍ\´µY÷„w.€Ü|W¦d,¸í!ô"–‘9†Œ®d!ckè@®ŽôíÐ7PnÒ(,Àƒµíý•Âo …^N°ÒöÍ;ˆ0£ +”¢y„Bކ¿ç÷çmŽ^î…ÊO– +¥Œ +šèAù'þ€Ì˜4Ðfú«8´1Ë‹‘cìj Wt7‹óÜl$öäe]sš†yˆPØ)ïÁh–-Àpö‡Ü[ìתè&LfosùU6=>¼ýÞû`6hb¹VÑ|ä΍Bê_tó:׆¼ÉCèôƸ'Cö}Æ(ôT—Õᆂ¯¤©4¶Lßž¢eÝ%2*ÃÛ¨+ˆÇÚnÀyæðÑK 'B¡‰ïu˜È³vß�¡€Uc~½œßlƺ¯»«’_¯åÊؕ‘¶_ªÇ+ùxè—éÓ(åŽÝ2¶c;Q‰µí*…E…DÁÔ2ÊŒ7©™¾®aËhmìà\ AS½›ö£x:-Ò9ß†× Ý*ƒf>n·p}½Ü•t÷kp Êa¿@v /ö¹Ö2ÆÁ §G%¾,/éÿ›n’Må€MGâOdaßȎ`濌Ê&æ•"íÂܞ©s#r«à„`ŽýÛ®À4žî™ÄÍ*SA£G*>çyñ2ëÎ`m$|ž6ô³·£méyˆŠªÀÝ ¸¯N…Ú[‘UP—¹¹ø९E0¤Ë’Xçî4bx8ÚdtyMì–y‡j aJiˆÈEzCò¼Îí³‚ØnŽÝzШWé#ŸÙNáZ-JrVeùŽQTœWÌOÈ;¾ð7#—îÛ Î«›¹Þkº>Á•¡§Ìwbù•®­ÒQÝÄX?€p±Ú†s`d¯fs¿ôÙWÞc¡\†À¥õ¶w¡¸g^“ñ¸Ÿ1ý ¨G1&Ü`ù§œcˆ6é¬R5…I†…uo°%ر*ÚPqû¦f ÜlýJ‹k!z.ÕJŠ"Úq¼˜”ďºiÒ)JÁ18:ôöj'6êaüqšä fZXSfj8 ?>C31CkѤ1˜ `¨aßì"„ðe³Ìu‘”ºT´W¤÷и«ÈJÔ5º"]Þz\tèÚv+ì?Eñ?Æ_ŒiÀU¿h=„òa–ã4ˆÂŒŸ4ôÅL‘g ",Õ$Ͷ˜Ëk71µ@¥M›TlïNÙ蛱ø¤îZ?üÊ•'zée ÉI¤©Ñℰ¬„y+m™÷?±®oôJ~*X“ZÂ@©N=4"XŸ  ˜]&Ô çb¥Ægÿ¼TPß66óªò ¢­ ¶C/ x (BµR“ç¨ÈUˆûAvÓ à,ŒÀ8y!²ù¡%ñoz®N¯ÜÍÕ3“Ö‹¾Y®gЌÏÈÅiÝc"ra¹ú”¬OÝבsìÍÆP Öã笪ª%Z–¾ñuÞ[½›,9;ñ}±ÅFHNÔ*¾^Û¸ê}NÔäØ(ŽêÙ }ažšßïM +÷£äoŒ€öÓ¥~»óu}c/AÉ~ý"ÍBƒCŒ¬¿~â+Æ"ì]ˆ®0wmBm‘/nóÚþ£…lÂÒDšýžC,æž^¾.BœÈjx®·WºWËÔ \Ĉ5ÔaDé÷3,dÔož­ôëtVx@¬µ­»Ä÷®4Ƴð­Í3B®:MÊà7ý¦åíœÆ¦!è0B'Y+7;ÉèA–PF7úâ/p$‹1}|iQ|̐â>YDŸÃCí°)?²Ýù¶u¹î‡qbÁ*çâÜ;Ó +ß·­ 8{Iš ¯Û%s‡ç:y oÿl»÷4)*?keäo»J;$arÁ&P{.ƒö,ÁN¼Õ‚n5àâl Ç)£~ݜè¿0ÈØëm‰¨oz„Š ¡ëºg¨Jفùß_µø‹\ËÑ\w[@nR:(¨¹J*€'„2‘“† ñkZØ¥ì/0‰XÕ#©bêþØ<F®ƒ®À.jn˜<è:ÿ;ٔžI3[Ô©g=¾½ƒú鸅=:‹…í6‡(ùûrúÒB4\¼sÃô)Q“•¤Ä;ƙ݆ՠáÍÕÆK`¼’XÙ´“ Ñ0ðt[{2,‡ŒØ)Òÿ¸&üÍwy+}…¼qS? H°Ҍ|çqXF>bÍà1;ÜZœÔ•É7µÁ9UZéS¯óͦ«é˜PҊ møu4Ì_WÈ»‹ÕoàÙ"êÞÜHÕ}.™·A2š˜D;'¦bZnd¦£œOÜb@²·ÏÊYgâ0´‘Þ´*ÿ6¿04k@Uš"C¦tº«1"]‰Üåbp†Y€ô¶êÐÇl„ÈÔÃ|“Lð›!=‰çF–‰'«\¿ô%1Kš=£MË¥ºeŽ`FS<#nØ ÇMÔY+Т3h$µ°=¤Á¯büÃ7mî<(°^U^·Èf>ž¢å¼G7¢º¦‡ŒÏ‡ÿE£Ç  } ¨üZB¨ôež´‡y³FlZjóéC¤ob4%_¶˜½!ñø‚8róå0¨Óà$V U£,º&Q±ƒ¡yðèÂ_qVV´Ñ…”F@¿º‚™À¶›ÔËa'•à ½yïÔҎpêÊYƒ  èr©…ÐõÿæÊî•{UX±æ@üfbv¹“-d¨‡î°«”¨}稁œÊÂ[b•ìº™ô±SÆ"µÝ¥R…ld/>gÏð‰¼€ª`2€aF4¹e¥»CçH‚¿3ÜÏóX…¼pÚÇÍ=C ‰jÀÉ;·²2Md’å ¾—ÍŒ=z¸ =¡ŸÚªÍ9pßþW[nTàñfü¥.p‘NË~Õr$ÿ +$z©aÑy<ÝõÐ "´™Ç\çü€I¼ehå£29½£™D˜ŸM]7EŠzj›q7j§¾¡Vè  q Áê)ÔÃFên.µdƒi‚À‰.Ō' ã‘.½¨ð0¾½ëOA_³AmJTlOØ"“΁NJ-OÞE·í¦ƒ$®%d˜‘eÀ ë‘—E²Ió7“6ÓñɌ^/!$²îaÊ#Ì*àh$õ0Èu„Ê\äœ7ë_§+ž}hk ¯âûýç 0uÃCh¥×_¨G†ÜoñO«40a<~ÿӈeê{[ëH¾ý3ÕÑÆ'€ÙÐn;¢OÈ?tP)P)¯Pb{1ò‡+ ‹a¨;5ø ~-:»7ií†ÐGÿm¥b/TÕO‚¯ìwÀ[‚ü*^™ +؍UÕ"Qw3PZqêãÞõ²|¨bÁRÙ(uÉ1$;ÊAP‚ UQU6t‚ù¡o™8x6Ÿ(1gà8Í|i®±ïˆ“¹`òž3¥ÞŸ4Õìbo?ö"'å_mʧÛ0ÿiÈÂUjT/ýqdnÌ(¾mõ¶ª¥?6•™Öþ?nnø¤ äyè–}4âƒ=ÕIbdÙ^¶ºœ¤c7w ä—#2¤0•[è`¥‡¸Ù¬â +mÚÔ¤^oae„¡08h¿Âhð†‰FQL*öÆ>iðA*ð3ÔëÐ7‚´Ôn[Üb½Ð.±I!†b#‹PW­ôŽr ÂäM¬©vèǙ¡ð&„ÛÊc94ÌÆl‚y¤Q™íÐj̀QHà lÝÀü-À¯oŽ3­¦Sz„‹z¤ÝāJ㹡Å°ú!qî!NªGÜS¤ÖàÉöžªÝ¡¾™Žw\«ö+šª5 ¦ÒÙB€uëÎjl”ï‡E~ªˆIŸ­CæéÒézætݹè és3L Œ@‰ÜdBºN׆æýI˜_þúž¼;@ ÐìlxX%Yú²6©†Æ0]ÕÆá´¬A9ñ>븾ü¶´y¼Òj[: ‰#¢P@ÐGÁH8@‚ø`Ø +±æ>\¯BóBvq€aØ6¤¢ƒä£&<͙8Þa ¨ðzÎH‚/­è2Œ‚qmYQðG=` *{ðÿ¢!ù­Œ0/ž§Ë‘üGÏ'WTn7“A/iÙQµmV»‚“ +ŠT)§t§FG5†_€FŠñ;ûo[¥X÷VÊ9U@j^aZ ¶¡Ló¦qóËhÂΏ[ù'&X³’åUŒœÓÓP†‘ŒY`ÌD›^ˆ¯²"õ‚¯†Åä«àÝ®Ùڇ¾jý‚J “L9d xQ—}¥—ã›j•ßP̈́»ÄøÐÃUyröÀ„¶0øИx©ÍæXÆÆb€Z Ï;®Ü1â©P»úˆØ`2a%c¬ž_ð~úþ7›Ó‚Šä¿M¹ïX~Ã\Ú¨Ìtòô'FùXŸaÒ/tº Ê¡R’àÙToÇùŒ<5[.y<^¤Þ‡ÔpY`‹ãX‚5ÅzSWFþhZw.(¾¥;•‡…U;ÅhsØ©eƒ«¡Q¹SÁøÆSk‚HOñâ?¥ìtuß~W~¦;¶PÞ=uäDžã9àg©¢sõTî$càX¥bó,ÏZ[ÑS]/0#Êò(¦ÞýOŠO×aYm,ÞÿÆv +Îx‰xâîŽt +£{J ;§sê¸5K&"‡“w«cÌ) +œ‚@N IŒ3; W@:€Œ®¬„\žûZ—„-À42 ¼¯“ïû¢NUò§ÿB"‚¦C#ÉT§ˆÕOhó¢]€´®tt”zh2úßҁ¼*ÍÜ@Y*y;BiNA 7’7יªä!Ñdñ‰n¶´ƒL)¤š”\4ã΋wQ{ dtÌmv¢Sªƒ-](9Eœl¹ +fP”å6Êv7é[r•M¡Î?òBŠõ'ø ûóÔª/wáx”¸î„TÉJc¤½b„Å»ñø¬†Åvñ12M&ß=”:bóŽ ƒx†0F¸ã‘ŽL^-Û ;=ñ GC ܏ž7ºÕ¸Y© åôB|¢Â}àýýdG¤6™ÖBp¸µ)*§/æe 2ª—¾Âù!pée:¬!¬"_V;ÉÌeлš…•>Axõae#ց˜#i[֜ˆ" YhꙆ˜”-bŦ‘)6*±q²9fû¥‡™ÿŸ|š´è:­ô‰\׫J®Œ@7‹W`{}S22Z+¼§>WÉ°3xx”0:…’''MáBø+Oq"Û(MzÊY×SPa{êd~uN4•QpiZÓrÔX6™É92op¢Š‰óç•$Áv§ƒÓÜN½éð2WŽë2Åvêº -2Nž‰ºlt +Ëp§Ý¥Á‹¬Pžsû’Ò~ÉzcZ<€Ñz4P§’àÄGô‘C§Èu;—‡² (š$K†"Ý':ÃyÁ+‘3N%qù‰ó\¸¸F@Q05½ƒ,e[é'©Ûš¢¯Ø2ŠÐ@Û  êºaÝMr0K1檣N@J!ð1ŠÒ§*éðgþ4™o¢°!H3¸W^™%[P‘håCRa˜¾ò{Ånàï R&ô,Íö“õ†LtQiugámšrÝ:0vA4¿h{÷ #GÈNd¨Lu ?löa[ñ’(AÂö}È£^k˜« +ßåA§ö·<>Ì#‚ˆ8?ð+þ&ՇsDÉ ë #–•†5xýTQ®Ø€Ñ@ìbfǟK&µ™E»7ÛÍüpEوãsQBâ¬%k$ˆ”$ˆn:†|QDÀŠuÂl|†éU¦šø«²ÎWklÂéÛ°—‚§éßÄ9ýh—¤›Ôh ²´ ñUw–©‰íĂ?Û² +©ÍŠ[¸4֗ZØÞ Äû³ƒò2×X9&&²ä¸†C ]Ào$ÖÊË`6»«®æ±ÛŽ –À̈  ˆ8œ °ßDo/ôcàB¯s{Ëɜ´dÜ 9Ò9/̪`Ae‚Om JÁy ÖF]áK›÷tÒ$6‘ 4ä @И›3–óPƐ•â"/õ”PLþYsÙÕ ‘2FAö$ÍOUTœ•Ž¶²¾N…ÏÍðq+8³Ôˆ³Ù]jˆÆ’ÂtL\@I ”hç͒wÓüBuP¤.§hžõÂÁ $q $¬áݍ́6aVªä²:ƒŒ¥ÓLµÊ72Å8AÎúa2¹7ë $ߦŸÁ ÐË¥_¼ Ã|ñ¾A5Øð\ýg«.¨•¥¸ÍŠà·Ð€àY~j–D@„œ¥¬i’…ïƒvë=Šs}Ý~²x—ÝAIO0•_;ТÈb¾Þfb¢*ýt9ïy¤ÿAŪ©”ÅÝ áAp…\"_aHÄ “h-·ë;p_EOs‰‡žÝ®zª{¸Âz! ‘ "¹´È2u­1 0eaý˜gÚáû’LâÊÀ™ ¿rA ®`•¢UÁÆp¹À[ç›Ìþ’œxùöçXyOk1ÅÉ‘,'‘›6Ô\aZ:ÊíÂGWÔÎvNz0çf‘êÒGö¿úöøÉy0}} mLØCM6ՓßÊ`ŌíÍñéüF;¤%'¥ ŒéõÖxçk¼Dc±á¥=æZäÈ´ˆV_.§44¦ 3‘§•4·é–¤fn‡`zWÓlQöÜèˆg&§ÚÓè™qKºYŠ£áB* ª–` 6‹àFü…¹ +Çx“IiË` â»îgæ#¢Kßåû¿\‡94X>|éE[Юd‘nd»€½gm‹å¿²]ª¯h•ôŸq¿K[ÚÆ̍vðÅËTúúm€û9rm$ßX·}†¥?¡˱fE†9”¤‹Ã”@ƒ‚Þ‘”ã92^,Û0T_ùxH˜á~j›¤ÐÿêæÄà”Ž„T€ù*—v±6_ÇÐǛ:'͙¢c`¾)á8¾6ò‹¨¥·óš<Ï¢´-VØ\4Œ2Ö-HP͖Íe¸(¾}epÕa`™xI¢ŒÁ‘:‡™fm +b©^¢ Ç}ÔæÒý.Hløìjv­[°E°03¢ô<„Lž6m–ã`uQTSTõo¶EDDHäd $""'CÄC333S3&ər°HI’<ãùG%""¢R‰ˆˆˆ¨'Nm[*ۖe;mێú¦ªZSÕbUUµ®¨ªªÆª^VžA¶Ëv!ˆhÇpÿ¾}ÿ·¼þ—üýå¿Ù³ÛîûvÜ&&·}~6¸i·±Ûn»í¶ÝD„ ±ÈˆEîÎúqõá÷}Þ÷Ý"ÜCÌܾ9™!&@üÿ/QÁÿаéDàâ3°™!ƒ£I²$y’=’$}N$2½ˆîû¾º%„;ё°ÃƒÔ¶m§i;eÛÑö}Û¾íN ^Sd¹ªn¿\uá j¶.Bcǐ‡ÓNà‘&J¢º£-Ù*[ík!üÆ öµ­¶bí±nėáºH¦Ž†Z?(+ŸŒÛT!RÕªÈn¡ÊˆŒ-fz$%Ê",í\ga!&ž;¨d?spÀ¡X< Ry¢»<€ +†Ph„x˜„ˆ¨6•(IŒb¤”2€Ï ¯P°‚•5™S°¦àÂW8TŒ}‚•DÉ*¿¤`Ì"S¼ð±×1xšPˆ“û*﫲–#÷Նà²Xïº3'p(d8l`í_IÖô³÷™¬¦«æ¾g.B‘âƒÖãәLÍù÷{\:À:¥g¡TäjKàÀ 9󶤹E-ˆ£9U`eŏŠÂþòþ«SxÁ"»%Ø\þÕóõG©"Guõ›`°“ÀŠ +”3Ý®…vàŽùÈ^¡ÑM?]ÜÀ…»0X +»G,_µ‚óC|Ðç„_­hùÓD&⾏•? ©üu~^5¥üaM"çî«u'zª‡uû>IHþŒ—WS§c QŸp‘}•Ÿn¡¯Õ_2¥VC¤#ƒW_-±¬Noå40¦(’Çñé«ÂZÚ±ÅGÌw½ ®ŸvÛ0£¯ºÇpÏWé`ÍWEØËW£Ï0ùj´vW¦š¢Ûž•öÝǪ1ƒr¯êò!FZâFÖ^IíŽiCdè³W ‘)YÖ,c­[ºÍ©zÞqê‡zÄ«:}‡§´|Ç6åáâ*§cêUra®Swïh§­È%%}éUqöÙ@ŠÕàЫUF÷êhæ´æÏ«¿Ì µsÍۊsÒ&iÒZ›W%8W|¢j^Ë7@ђê¹qŒ$WcAˆW^U’§É«*8­xCà~!Ø ¯Ò%ò„¥$æI?éÁ«;¢l2i^m,ìVuýßՕËjßÇêºÓšxGFaç%¡î*~Å.Öj®fOsW©vY=±žÂævoG#'ªb©ðd½ÇÂTd `G?6ðjv•od“ëÙU¬ð±@»“-èæÎ9ÐüW,!ß±«×C:°ûAá—8ü®¾3–¬ùÅ6òëê F†7†*äø՞ØtÔÕ÷½£µõڋNYIã8gØCg%}}UÓÕ]SÆ¢Ñ/]ݹWlÒUãg r <ÔC†Ç“–Ø]ztµ¶ +.¦$^íÕ ïÜ$¼èjºÎù¦3tu­€»Šâ «ëF‘jÕÆ®®$ËIýž«éwߝ«l¶p•]ÎUòðë³wNúæê;±å2ë$kÍÕ_Zk{ÄÌ\;ÍKm@\°¤Šga^G3/¹JLÓ +غÖÑ+qƒ‘«+½!ÚëNU!WÏYŒ$)~\u&°H»Ã^I‹;®ú5MÀ|°quâۄ¹0gžquÉbRKb{qui§Ïn܏X^qu*¬lãƒëÄUq¨ f¥#®–~^,˜@VT@e}È,]^®Šr~œGýÆm¸ÊûÂՎ§oÙ¤öŸW·I‘˜daîšb"S‡©ªP.°WÃqЭ’›£u@º`„ù»d»wÔghݝv«cnTê°ÊQPµ:v¢S{¡]øÂt«©™>ã,ç依[å)é{tü(«…H£´”mÕ/2ˆLjég|mõ¯­Sãj4s»© ²®¶ÊØëÙo§­v÷Ì …â ‰Ú¹ãÓÂEÎ*aۇQ9×ÛÏVÙDUúr!qö{­Zgø€Ô¥»Våjš¡Û*­BöÑUM½™â—‡G—~¯„¨ÿ« _­Ž8‘í÷ñ¥×E1Xµ:0a!@F¨T«žÓ—NŠ@3l$.@D+µº[`T—e#V£VÕPj•nF`Q?­ê5ˆŽ8R +ù‘•Áý—¦t:­ªCÄ@Ä6¹E«$oXÝH8¶ÏO¿6<ÿQ³j“79`õÁª$$z˜ø[™Õã•;³9Èڌþ@«”(hwÝP·sa›¯Â¦$3RZ²¥àD^.Ï꙱KXÌ&بß: +SʒѪñÞ%,„ÀÉþ¤Ìª‘0=ü²jxGÛÉ5r$8’¦Ëj"qD{ØOФ «Ÿ_¥ÐjÝD–UÀÆfg>ɑ?̆ jN¦Æ¯ˆxè0³u£ùŽ|ùȪàlO**Ž³ÈªÇK~Ȫȍ·Qè;ðB¦ê§;Þ{hçx2åƍÏåÔí¤!ÇꍿjÌÑu2!ï8Ž‡ ÿÁr£1²R_5nãmR>Xˆk¬½÷[®Â#ÐPŒUéþÏ<ã#çHJd`¨Ú,€d¿øDÙeËùYWŽ£Õq‰ÕbøÎðT¥ÊõÆ(~…ẀñT¤Á©ƒr¢Q°‘]ì«EÜ;/Þ<Ò]56YíªŒ-ÞCÈx*nX]§¥Jb ñ­uVs¶xüýúêé «ÅKXTEN/”ª°Ê‹‚nŒS|5ý‘½«rÒe¬U¹1$`˜MýÉÅs0WËÀ-X•‰ñù˜—ìA‡—XEëôÕ*=þü• Qb¯ŠOáÐõo! ÖÜdîÌËAHzÖð&uVo‘™Èù ÌñdûÌÕ ŸÈæ5Ÿ1øɧû†íU7Þi`kV‡F8ã1æã.^®ëUéÚ5Ž‡´ª2pCÄxŒIbÇ«îT^u:,÷ÛöãwÕ7ƒXwUÉYÃ@Ž%<#Ì®ª]ó=µÓ±P2ÞFAÁ2Œá D°æJ€"¹…çM2` j‡æ抧¬ïnÕ×î‘ûT†ìš¢ÈX˜æÓ´¢š±6ƒˆåqÍ‘qU€Î»­ã·¬N½Bê´ª8 ¼—yV«bV°ïg3Zµƒ™[ÎdœŒXÀDÄ°ŠJ¨Y‡V8Ve¡ƒ7¬ + !èȘ‚•ðÁtÍ©†9+¶,‚‰‹UíÁ¾'5#®ØN  +éÐC’XUZC û….¨Aò«Z£…U•NÇ«Š³—¢µWõÇM`…Dç-WA%!¯é#¯*u~~ +{V2ò&-9ÏdôÎU­ˆ\÷¾t@!o½USU ›_³ÍµÜ õ¯m«*ó\íü_ÁÞ?0K2ïT§UݝÁè?úF~û aî ö¿íP{Võ¼·”æŒÞ¸¬êy@82͉ÔTDÕ¡è?B\˜}iXÓZUO£“vU¹BRTÕ~Í*$×#1'*äSÕÒ4:ŠŸ5ïÎóhk<Õ³€.U-/Ø]èr€ƒãý£ò¤ªìŠ>ùa@âóeâ¿*ªÊýªžFsˆ¯› ªz ®°]g5‚¿LàŒtè2H +%=ì3UÉÞþySU¢JŸÍ¡¡ª,Zr +µ[ª•åŠU¡ªrZõ‰‚L¼@ULC&48×b|•n»úrFªæ™|‚‹"“¨*¬¿CË©þdùD Ø]w¤Ä§Šör¨8ÉƒèÞÙõò,T%”9Xæ"°e)¯•9’$p|ÇdBUÏöì rAóâI¨ºÿ'›=ŒÐà™î—eô~ª‰Í­P Ab*Ÿª?Í®»ø‘»§ZŽ‡‘ï³±9•Íù¸6уÇyª3—¥ºh‹Ï5-žêiß©j]@ñzÂÞþæ4GkM¡[›$A Ÿ»gÒë6ÕõÖ¤ %e‹ Òõº¿ƒ—úÕT'âU€À1ž¦*E`¼kgȜÒU•–¬TIìjM‘ëw™ªr-_‘#©¾¨0͈”êZQÑÊ+¦:%Û´ËFœpû¨k'U¯ñÜJÁò0™TEËh´­ "´OÏ%Õ; ++©Ê€F9h +ë¨ãË ¢£Áµ“7`aRQéÜ@ ا*WDË{+E£xý|®øže ՇNÏ*DI´þ¨ óÔw®Ç'€ƒ’·TTy¤˜ŒóìPå, +ÊWU³’=Òö¨Ê‚ iAÄeQqUxØrÓÝQíÕ HdÃ>ÈAÝ<°ê¨RÃq+Â}3‘ù%¢¨O#•·&LVv3!ƌ,ºÊE°þT°´k& ]!êtEµæòëÈßQUí"ò ^¬Äú„Äÿ~.1˞¢Zz +ðRdn Ö*»s¡j"ÿD›‰ ùέð>~SÞñVÏ +ªÞpõ§5%µCÕRí‚cÉþrêµur²Ü9T¥Þ‘&²õÝPu×}ÒdN–îOs(5Tÿa²!ÅŽ iR‹"Âh«Þcˆ¡O4ÿ ¡ú¶t„9AlÁuLø‡àÜ÷ƒêÌ=AÇ¡­_T 7j*ƒCêëPS›ÉöYN€bÒBºÅ,÷ë¥|‚êþ[˜90ÉÇGŸ4`´¬| JÑ)rÕåd^¢˜è¸!_sÏç/—@•[ ^ÍG7'ø¹‹Š¤—§bE…ª ëÑY@Uœ„€t“R°¨»­@¡q ¼Õ‹ +ê´!#ÅOŸ €°ìûÔ¢DHêö©»]jð.± |קrÁŽO5Þ÷CY–räï©]Ÿ)‡bGÍ¥95Vù49q‘û·§rß•j‘7>¾„_h̀¨‹¥ XžÚÒo^ŸòxêtóúOÃ,žŠ?–Q æÁ«fõÚÆ •JzøÕNÒÙÙ©F‚á‚-« ‰ìØ©¹Àà9 ï¨qê]¶>µDÅ>ü]z(\€‚eï¬útþØiú‘8Ŗô‡ŸÓ©zÂàˆzƆŒÒ©Q…ÅŸÁGq5tªÒ8RîPIÝRØ\îÝÖ:ð߀AuÁ°Ñ×ãTš†„AÉ|á6ÕÛ@5µÿPÓ))Í U[ä_jJ©ø†©‘ÃØ*‹…Ô¥U-–¢/§r©• zBK ïo*²bš +Aš˜Úvv€¤ËqÜzèìLÝ¿½¬þRÁ€h²É¡HÎÔCÛA:}ƏŔˆ›æMÞTP˜$à·»íDÜ¿ xDÏ Œ-Œ¸GM›Z^U°Ä ¯µÙ³©Æ=¥ƒ(™²©Ãï3TzkÆÉ°Ê@* +bëÔÂô† ¿ SSíαÙÖTs£ ¼B5ÇÖíK¨ ¥¨r.bÜe×™Ê'À8[9“qçàÕÔõôCzÜOÎýÉbà̤«dêzŒ¾JbߋëÝ(ȈꨩA{ FA„hûÕƓÑ@©àT!VGS¤z€&Uþ!n!ojp§B Sí +Œ8G;¤LŒ;™u§4µ%ò!À¨eþ3umÜ]yÒ=SçùT=P]ø‹¨[Œ^Ò±©ëÌ@pî9FsÏ cjl¿ˆ5i:DíEPI²üPˆ%?¸<}ÐrÌT‘dTÄ{µŸþK™Ê¢¡èÛL„-SåUÐt¡ÍÚô‚ó¶†&-¥¾^‘dYS¦vT~`ÉÛÏüZO¦ÿø¦ÔµUPüŒ%Lí¢>ð*Ÿƒ·`Û˜JšgÓñIßE—’ub¦‰&e9=n ~ú±À`—*ĆÄVw–µ!5ÌìTBœtÃT*QÂð……ÌÉzZ™’0UÕ»Á‹|ëf,*d,ΥқûøR²T!Y ¦öèBÓU˜Æ †Û êügßø_êá¥düL¼¾/µ?܈<¤ÙéÒ•+iˆÉòßÁg“0YùVq4oÀÏ fmÓ̖¹Ù ßÈ¢¡`'¾Å,~KÝæaœbóGñݳùî_YA—pé)µA¶@á0–Š·|ê¶ÔYáLÔÏQ¿€ÙRO…º5ùÀÑÔÚª ÌÊTÙàÛLÆÇR•}¬Xê0ñÒ~¨x®T®O²ßÂuqÞJµo t›}b`pžyTÂש/ùÑFBãY©q:âFÝ s)ýÄ`›Ô8ê΢õöè·•*Ñ Œê˜º ÷r"wcUê(ugsª)G*Æ^?g©R?3ˌäu`á;™šÔwv3©ˆˆ¹(•Ú7Q æÆh6S˜zÐLªÉvàúú3Ê;Têt·dXÖhnúƒÇŠ³dÓ)µbÝ®Iu‘R¿£òÁفo³¹ø(µŠÛRܘàa]rlì’ú̎5ǁè¢T[vŒ†§vK”:lžŽ|RŸÜŠˆC©LN>È1“bz6"Õê*_Ï.¥ÁÁX‘ô(ubÓEu<1W×ÄwHÎ1ð—Ô–r,BՆx¾ü}R¡Ø±9ßÙ×|6²Êd˜3Hu¤žÌ±ÿMÞÇ=¨æI½ý€Ê;©ºCæMkÚÅúì›6\&µ}ÐÍ¿ä/I=¸(/êŠu A·}脕@Õ²ü[µü•ÔA% Ž7)ü@SR…ÐÛ¶ð{Õ»O‚=’‹’ºçü©›þ¨ó(̟öu—/’0}Ïʇ6j cQfõÛ?èփʎú­Yqo{?ìû¨ï¼—m6÷Rlm6•]°Ž*ß­o ü¹O¿£FVÎkª¾VÉé`_‡Gµ(ù%Y:Þÿî¨[²S¥¶u8%¢û̎*®‰ºï sµÞF<Æu«£–((Ÿþ ¶ctԒ11^JåsÔF¡4óÊ_Ÿ5[ŽZ%¥ÎMŽ*ñô]°ÛdÇQϞ"*m(£Ýâ¨j¬ÃQeÀÁQ«ìø*؏+¹>I™×¨þTäÑ©,ÚU,©[¬F¥¨N–MŠ.Iↈ*¡Qר>£¶ÝggTÁÀ­Q ’ßNŒ›Qé¶G];¼bWð2ê="¯£Þ·,Ðʨ-¶ÿ™ŒZ„C!qÝNÓJù# ˜ƒ.£9Ç¿¨Ò«º/jК‰!%ç•üL^T•EDŽSÉO#›yµm2I»q¥w( .ªUçؑ³¸¨ZíÌž’Þzœ‰â0çÝæˆæHŸ]“ìžùøŠš²ä€ÎH°2 šäFÔN®É²˜wӆ7ÝVÔ{æ‘Bû§ýj:Î4[6Q«z’¶WˆŠ 0ŽÆªèÓ£÷('|pC5d#û”ÙiSTµT.EµÁŒ?dúiNÆMTg”Ÿ}s'ªÜt1s¢¶èßDM*™Æ봎¿êAð*&*™_ÊIÂ:hBæ¹KMun·k•ÔÐõ%Su‘éC÷‡hÒ吨»ÍǍÕ}D•üÚsÎ`‘jpj„m  EDÝQà‡¨]/6D•¾ÝBÔ ú*¯®ï2P<úÈ]ÝGNˆ*=n$Õ9ýf»o°'»|›•FÜ«B$ꔐ•adã9hßk*1°|¨íœØâ4T-Êfè›™ûY®t ‡*Ҝ¿¡®£²jÿoàà;–P]C%׶ÕPå.œ†žÍóÜ\4ÔtµŸ¡‚l†JNEחaì(Àý‡mVڅ:Ùï+êF­¤õSš9ÈW¨r¤jtªU¨±äáT¨>ÊN¡’°”»M|ÖµJÐJ²^@Äþ(ÔɤO€D¤h¶0¨É+%Ôo›|ùÿ„ªf fóPE”)A¸è‚ËçZK²Ã¢VëÀ4 +.B™³èk^Zø“‰P7u$2ÒÞL2A5ă•ª0þӁP›ÉðËMvÿAõW÷FZ®F¾6T›(ÆÕû]á¶wP“6ErÔ"äAJPŠ9¨â°”—÷‡!ý’8¨ÿ…- ¦ûS¨l°BIãŽó•žA‘ìc:½U(D¹_À¿Ô}“ôéeÚûdå,¨û-•³y'¡íƒ¿—WP…%HºsTrfTi«d jPù$¨±òAõÀ[þ“”¥n3?Ö$¬+‚Ê_)û õ=ïu™¡-í`A}…$ìÀ¨¤ùÿSweAbGjB÷Óõ¤²^ ãv 6˜t’Ê Tö^ŸcâpqšÂQ/‚Z  +ò3š1…¨r_®æ ók¨Rœ1^útâÚY¦UÈp՗.AqEp\6DÜÔ–Üߨ¾1JJíÉ)9ò„‰Gä© 6óäIÁ=àº"Ô-£è²êTHÐpG‘d]ºžÎFšdçó"b©‘D1ó?õõ:¼°k›SUö?í¤MªŠdý»(Ç\ÖͱÛ*§>=ªb͊gçiÈP3M&¸ç?ÕÃßýS%$¢ˆ{$x(ÌӍÄzãyIµHæŸæŸ.Dyþ Ms±õ؀þŠ¥' ZnÎõꭔ}?•Z¾nW?†w?mNS:ÃöõB|¥L©þðôÓ+¯óRpqu]ÏO…·Ä„Aª>õ¿róÓêqß1óU0nbòÓcÚ'>”ädéS‹ >ãö…Æ«èøAfÑ÷Çâ§`Wè䂮mŸsúC£š¢B¬Á…ƒxîÔdºg}õIìSƒc‡Ó~ÃyëSdÔü g‡ã±zÇUÙ»SŸ¶Ê=gãéSÉYÉ=xŸæŠwçžòÔ²Xz™´ì”hˆÊ§mé"û Š?£Åq `žšH¹%Ì©Éq‰4+ȗ!9‡O½É®²¹WÓ®kó‹UHÉ +Ç ²Ck†@†ÉЃO½¹˜¡z Oc{˜‰T6zYür ”èfo™lÌ=ýþ!Aÿ6Ž°%oOõW½ c»ñMŠiÑöTDrvT=HÎʽn$›ñ dÙSÉcAkÐ|éT"WP*º‡æq×Su ¢£!Ï^ MÈe=õš ÅÈŠÅôéužèDè³öè)yb»«ìò-zºŒ@Lϕ(>ÄNEñê =5\³ÂaWóïµÚ*Šæžº–\‡ØÍÓß%ǼíÞRÓ NÒîp™ûη_ûô¬xž=6æ© +˜§zÿåé"ù1Ғ«•§ŸÉÒw§XQ)HåN¢6åi¹d3иQ…CEǒ§{Ð. ‚7Ÿ;Bz:ó£V´#Oiƒ,7€ï6ƒ§÷€ÁŸöû aÕ ¦HTô>xL¡ü÷˜¦m€²§Épލì4ú±€Ë"žúŽF)z‚i•1{Ê7“«5"ՀïˆĀÕxú²UŸN'œšEù¶àùÉ{p_„ÓðȈoSÏu7Eíˑ–ìú[5žÍÃÈGê̚öƒÿ7¥º’=çJ5Æ¡éo*• wv †èK#“,:‹|Â/We¡#ϒ•Ù"’ÊoÊp÷‰NÁU5=úï,öúøz +Ÿ22îðgÙþ–WSSÉvy)Q!ãö®Ÿ9™™£Ûšð¦ó1Žßpp¿›zNPÔwÄgꃬnJgA¦›J¯Šnv~nšSYsS ×ÁÓO#þ“z1 +žÀ…YWrSB‰H1!mJƺjS¼Ü-2x&f ÅM?QH§S°+þŵó#zð^bÖ6{8#+BÛ8?VµGæiŒ_MÉ0Ûº‹q×lŒ/C4ûצÃNü”-žHU¡ó !®/2¹Úôp¯!_öï&QÎS›>Ô¯2 ·#ï …&N,mºäùt1 ¦DL¾9"1Ԍ#ÑÈÿT{¤¶Ï<$À›cÏs³&Xß³þ>6µÇÂAÂ(ùÓ[äžÑ5¯ÖTÌY‰Dw¨ÍL!å±ò·ºÁ¦–[½µW¶sO±'^ô`zÿ¯©änÀ¢•pÛ×4…l„£CÀY›‹ðô>Ò®óš¾êO®¨¡c«{v¦@ OõÞ4]bÒA-:‘‘º¦Gؤµ6§RF¹Œ€­O4Ó½¬©ÌzØuŸJÍá¡°¦ÂþÚ&V5åI¶4oÿ×Ä_¯œ@D·Aû›¦]à,Š¹¤¿V„Kû5$§©ç› Þ]µ³“—­jš­à×âhúûåéL5¥:~úÎÕ´YÔ†(d­‘œ}75bF_ú¨/Á‚_8¶^jõ«À·:´±Ÿ¦ÔªcFà²÷8{š5³«|î4¥©ß¡¥Ô¹E9Ïiêù‚@ l•ˆ¬iZeß½ ˜CÓRhÄ?~óLîëP(ø±ß´ïã²µµ„a)MGÁ5Ü´”Úi $®@Se£2Lm(…ÀFÃyQ}ή¤îþÝøb:¤.kÉÓٍjºýÏa'Ñt,¶ÈX¤Ø·šjQӄFïNh*ü•…’"0êÓ¬‡é1g6]¥¤óÑU\|•u&LP7À£#í öó™zñ#垩óÓýþ…ÞK©Ky=Ó1:ù¿¼¨–¿”‘2öK:‰Äáð‚:ÂB9¿Mh\,(gJ÷ô{8Ó]Oê7¦ñ£}3­®Ù>⒠pÍôËþUéª{Q ß'ýÑ^R0üb—e:‘T2ÝìÓ¦TViJ'â˝'6›#²{„ki8—âíQ¿ù—i¥b#ëeÚHÑoÞKý,É&¤:<±+æÉZ“² DZL­Xã‘@qèðnG~˜ÚûÙy]«ø‚æ\>‹¦aµ®ãÑØaZ^œÒýÍZ¡¥bYRS±Å!3ª¤\M7Lõy?•ú ‘/ÄæWŠŸ5L=éBóÐÎ0UWZôz™_ïÏöôýzÿaUóɦ¬Õ7Q¸}vԊL!QCü¥dWñ¸ThHús‚©)¦/PúA.LõÅì˜Ú‚Äá¸Ô®§ L….h$}i>ÂU"ÈŸîàI勗îͽêûyþÒ驾_šËå/bN/5øù§¢n´Š_º§[ޗî.¾ö¥k©¬/Ýÿ"õӞyÌd噔.åK[ô¡` Qª}/x òð×K¥G¼r˜¶Š äôÒ¤‡¥/Ý÷䥛—îVàke¾Ã¼òÏÉK'ð4=qáÊï9^ºç?FmW!‰T8¼ÃØÿ +ÝÛ¥¾¸èC©<g=¹ ÜúÐSø)V–p«Kÿ&"w;@Ã"3 ä©K]¾Üõª|A$ámêµN–¾W^[ºT3ËáÎÂó×½µ¯üýKlšÈSÙ+k&çVBáBhÈ g>tâR +Ì¥>žü¸TT[ŽÚ‘‡4œß–¶nE˜‚{ßúçpi½Æ^Y¸´oƒKÓQêà±HÏ%= —.E£uÝ<êKMÌB>ëjZ=ޖ¢¨Å³Âlc¯-´h4g—¶T"0I¦bTž-434”-íU&xâÍƖNµøÅ^œʯ¥žh쮥C é÷ÀŠžˆâ™Â+Ž2QÖÒ&û+A6QþÃԋ÷$Ò$$VV9<ð²M-5Š¶mèû2Póié4ÑHCA©rëw¸‚`ªÞ²:nd*KK;jIësþBnÒR5PTG-eç‡70ÙéXŽ÷ +ïnîòf©GôKÈ]Z³T•u›)Ï,U¿{â?°I§¤¤óéŠYºçñÄ‘sݗeŠì$ÿZyOÔÓ(&f¥¯8çQ¯µ,­ýە¥Þ³j¨t:t…þ“ùš}¥¹ŠS¹ÒŠŒ¥‹HI¦E¾÷E³ “ðKåíHM’^éÐ!Ø¢Ò¢)gÆ*õ _Dòé‚Ï’ŽgAíkSMˆi†Á˜¯t’°ç,e½Ò‚b˜µÎ‹³J‘÷»Fi…(üy¥v«­´Æ†¨À'¸ÚÉ<'yølW£OžñlÑ+åƒa®L´œK,W*B€åµéÅ+ˆ¥p¥.˜¿•’8Gº•*™ÕƒF»gHU;á˵jg°Y©ÇϦrY©¡~ÅðہÇ=–þŽŸ…è<ÇJÏÖ@ñ…J93xˆ"¥ÈÖE)9N±Òµç• ¦÷¤0N)£0Ôë8W«ÂuG;iÊwãc +Z q ¬4¤©ÐÜSê×Wºä·Ó46Ü*•ü—R¼ðÖ*DçߦÆü²J:Ÿ*õ`ìâÛTRJ•?.忨C]…„ã.ҎXOm#|­ß©t´0ˆZ­º'c5W¯Š*FW"•ŠË@ò»~(8íóíŠé|Ñož4œ|q.îïõ¾º¨=|ÑÄ(º?“¨8Wr›åÛMEšªéôƒТó”Nÿ–@“Àe +³^£ÔoaϏÿnPuJ!Þ-é/Á˙Í)õŽÃšRVÀù'¤çž”^¤·ýÃ%<;œÁbŸŠ\ƒÿ]µYö4zRac–) ‘F; ¥Ó´a¥"Þñln¾¶V)í踷%'ERºè¢òšû¤tHx4GA:MJ×úÝÿ˜KJ‰‡/¼êICïLRŠëOâ…+ð#)÷Š”7ꇧŒ·å ¥Š„õƒ¿œ!cK¤`ITfM êź{#n^̄jO=ñ%¬pïIɖ«Xʯ”-JɗªÛØ7–ÊÊR¤û~7·¹m˜K'Þhëfìƒ?C”Ƈµ„$ÏF +ƲÚÝIg…ÿLZòWoñÑ鐕)IMMe +óz%‘•‘XÀ9%ð6ߧ›|Ò'$Dùà5¥jPên&Öc-(åè2¬›•%(-Ýô¨™=» î°žOµå¥Õg÷’›(PêP žTÀööÇØÇ|ïÿ¤€wÒl~:GýAâ¸NÑðœÞîPIÅî€öޓŽЕ“úG؜“¶&QƒÐ¿¿cõñ^¨Q5Sp)±"tOK>-Òsœ´l2®ÔÁÚoRAêM›)”êë·ßed7©Ð]җanRRâw"ÓÙ ¿ªò8âð¾—4Jëwä-Šy,©i ^¿hÅÕÄ%µò¹Øcj‘ÙWR¿ÿuÒ¡dlv©$¶wº%¶âfŠ:0“”ýZ›þúm¢’Š¢ÞW +ՍÀŽ6:nSÒ$ +Ì0KIÃ饃¸<ºÆt1‚úw!鳔rÓÆÄ)Ç%•t÷; [CÙýM2 J: +᧼,uÄQþ$Zz\OÒ={z?tÙIJ~KeüòpõC\ko3¤TKRÂGá["|<%駍pqµèEäþ Î SÌ8+‡œÞH'H„an3zÓIUƒÜ‘T[Ã%6àì#%êµöX¼|‘Ô–8‚‡–E»Y¿¿G¹'î`¼@:-Ô|‰™õÒ[•ÜúT…ȹŒHRý <ãŠzHJÍêº1]ô•t¤ ¾üb_Úv‡æ0¬lÇd-ˑj|h;‰)ÑǑº(©¡]|û>‹µÞ/éüFÊ}r1Rº<é}†_k<·Õ·„Žã»»Ž‚2]PÁèåŸóN ðH£;#µPX{upÇHA₠òI.I×#-_¯ + 㨮 +ö[”J¡êk·-e\8/K­Z¯å#(Ò [¼æ qòÃÚEšÀ—¨å æ"àîÀ±`ùO¬VÛҁV³¼bÛ+\;\AÁˆ¤t~ŠT ø†N ݎÕ'wöÆÍ $Cx$ø Ø_8¾êŠ-™Hýñhûs‰”¿Ûu¥ësQQ5j±©½âa«䵬Ýÿ$ˆÌ(|žPa”|lB6eyA‘‰5ȍ©^=OAêA÷ѵ°õðä=È.Dƒz¯o RÖ§C-íIZõ­Û6|Ƀ%x&ñÕ?•[B[+r_d*Ž—pãŸRËr3VˆBb ôáñ¾^€Ì·ºž¥eê¤yÖOG¹,ÁýC”-t—;±ðbY@„ǼÏÚº ƒ\|g5ؼ3iӄP‚¬’Ô–ÙeXr .V‰hL]¡àcîëëUÂTÝe8΃ifkð&×Êґ„I_SòúgBCòßIôGÜe7M°ç© ÒvZÛ|¸cÁ‰Æڗ>‡²’¶%7R !!S‚ÌÄ +t;¢SqK%Z[Ù©h~Ê¡aN¨'$#.ðe=AFì"²ÝâxgÄD MÞRšè àb à»å²ãÆQŒØí»AŒŸ²8[zü’qõn"~83EêLóT“ü4wqøÄ5µÑ +Ë÷´ÝKqô§i3v¦§;•Yøçãm×îa-(c‡î ͞]Á +YvaªÐ$#ëq¦—8iôùIF2gç ¦¤ ¦—᳐Ÿ Zè±EÔË]µTŸîE•å#Þzryøù‰ AÑÿD Ç_—ŠLÌôrªûëf,—à ¤÷„Hq‡»€HN>ÑÉñpNp]ö%"Â>îI$¿KÜN­m70څCöa‘^ò ¦)ÉÂÑ4Dâ¾äÁäN³³¨R(5šìcž=yM™àù Ê tB8}¥.5$t0Ü£1!…µW'dCÈê­ÀüÁˆ!ú@5J¨cr³É EÉÅõÏ ˜j+r1íŽõ¿H­©Ãþ2ˆ bèÃ¥zy‰¿œø-‹4VÃ` Aë éïGŸì¡N¯„t t Å PLû +Ívá`;Ó¡RŽÀp+ÅÈËMp†%„T „@¾h,$¥w`%Eqy°0k´FÍhÕ°dÌm8,„¯@!-þÔvõÒ؃‘±0œi^ÃåŸ@2)ç"}"f›%Laœ©ÂJ.óteY/É +¬ÕïAœä? $Ê ê†É×Ä ŸBì$ÏñÑ»–BÙiD€:HÿÉ9)ŠªgJ–ó7 +;MÖr˜R獟߳ +¦vªÜ$E<M¥Ž³$t+ӓÄðdŸ­P;ìOïL*ÛÃ^Á”Mí¥ßüˆïS‹gæ'”Ù@šBD–p_gb™Ó86!>¨A¸/¾Ct_¡w¬s7Þ”’GÌR±' òsJ­³¯#9dŠá%^´5­0gØ(¶pxw¢­á–îAÆ3NÖ'*ˆo;¼ÙµÌMDaáPÚ0ÓÝ"éem–^'y¯—-”û’Ç°GÞoà @ý]?ÏĀ7—·¨ù!y#„%DÏÎÃ)•i^Ñì™(†·Ý’<Œôóº¡2*žHø»ûª0‹M©cð˜‰îÞ-Íä©¡°¢*ßõäÀäè{³Ù ‘É ì2çh7Œ¥$[àwßãP¿ÐÈÌCǂ>‹ú=Ÿpè¥PÝÂÊWՍM?yòm%å\—<ü.@•VüâjûAö¢‡—Qñ;Üe„bf¸–rN¿3˜NN5 jcš×ú¬·×2;ØÚ£‡ʽZhpŠ´ø‘è® ;:…]‘̤Z}OÔáZDZn<™” 8mkã-!hE5‚»—lØm‹yŒÏƒ<'{ù>y´Ô¾QŒYEKJY¤ÁbÙ¾õÛéåÓ\Œ S^Äû¾Y4Û² ‡/£Gvl0V†s+«Œ±ZEîHˆY5ÚgV”3Ȧ\þ“;3"âÄðÌaÞržÏo(LÉInÞY2Ï ¥ÜAÛiŒåJš¡7ÎÁp=öî¨¤Åìd1ŒÂN'z*³™A‘Eg¡•p¦J8õ£¡Ÿ“¾‰ê§êm­ÇuuQñ'¤3@àHk͝âi±„,Ýôov~ô©ƒúcbòHeñég³`DN†€8»y_νÏ Øì®D˜=yo±¡)ñk±;Â ³hi—éFLP~cX…MA ,% +4G` Ù©hµkÚ.¸Àí¹Ì¥;OEƒÎsd¸Ñne™Å*å̖GÁʨj’?%å2ðpahvÅ«éÊóíjÃo‘'×|0ùÃrj$’•ù­a†fc†¾ÐQx“6ZǯÐmŠ™^©.éˏä¬ èt“ä;Lç¨ ûˆô—£Î¦i÷ù#'ô¬&y"×Ý$܃ IÒR` › 7öK¬‘#ÕÌŠÔ´A„ ¤iÀتQÝ¡†Ã6Ž€C¢Ÿæù¼ÑI›Ä1xÍ8!fM—e ,-ê›Ãa &‡—)áña¬4ÔÉÀjъ4æf»Çè™&óhQ> gú¤üÙav+ +SñBèÍE ZþO¹îÖt³]‚QŽ ð^dѦÕâj‹M²€FêÐúô¦Âô½Ù®Í .áBÞrìÐ6nèŽ( j'vˆSßÚìÐ+WôÊúûUuËuœï¾‹ö+ÜT¢?ÚFÊiz +ÛÒ:»6¦å¡)ð ãÜÍM"S—˜•ä„Ÿ¾{Á•€'¿C^W +@DCѪÝ.áǽZ]‡îûLÆ@æ ç”÷&éÐ3½îŒ +ÐéЄDFÀ@ +(–Ÿ”†Ëˆ»s蠃͡õD=d7²…C¾œÆ©Ì¼BP¡^p1¿²¤2rèðŠ{)Ãô9e1$‚Çx–8q`„#HRîØc¯Ùr' ¸øÂQYÓDßÝÿ¯JmPãT½#7¶ó"ÉVð O±ìQ¼úo^œš|êL…Þ@׶óxu¼%ªŒ‹¦pw6`v†…\¯Z£¦P¦ƒpVTä/Êý­ÝûÓ3“vF՞gÍU­R>†É –p.aùDü7…½ó²”c*¦Ë×K¦± ™ð7(´³0tœ$ ¶AVEjµiÊÓÁLfŒpXa•Â6Z–«íà;“«Ymæ£vï”ãù8çÖ¶ÄSe©ùÞ→\m¢/‘zÆÝÛTV))Ý¢ZG7ˆQ”¢ÄUÍFq:fB³©d¬ñ›ÂyCÏv? +´Á*n¦$H,TKS‡£1Y™TEïPÍë)lú#|©Hý‰Üî‡7•†5̾š0`óë"?¶q$ŒAÜJLÀÍYÊq‘ñ~µ ‹“1”#®œÖª¢ˆœãoJxRu7Q< n³Pê3 ,¶•¸©®3ÒQ²:Ѐ C:jWõÅ^ñð¶¯X1ƒl®±mU]k}צ€ +濇!Ú Kp¬iûZ±AV-@æÃà‹[ÿ6àÑm^Åê,§¥g?•ïQXŸµ>³”Qۚ6t˜´XÀ Õ_ºO¯°ç߸ÍøðJ˜°ErUº—i˜n“Ö•âdrL&pÌM1ß®b `¶ƒ¨Zå™7ž âÂgIô‡iúT”[×;"Ií 8®RF'¡~êmeï5ØoîÈ›©Y†± tÉ]-텵Ç£I¸ K³¡Û¼{Q…¾#ñ cÐC“—]Dž×bK¤ÎHXÏ흼*J#°tn ú 9¾× ,u –r›™©“˜ ¦`œùO]À¸å१D.žé†‡n&‘ÜEî¢ÖAŽ'0T¬‰öhIˆäX*h n“—ÑB jmlƒ‰uŸH…°(ĺm̙†õ;˜.»þnːwi-“ ý—‰läÛV|àXŇ&r²æ +¢bJÎ|±n؉ø‚P“l§¹„»Çÿw¹}L?ã½Þõk##ÛÎì{W1Þò–#ð >ÿ(LGŽÃÛ]'¸c¢!Z%Ìûݕ8€Á㑌“Ï.1´]ÌQ’½Æ˜gºšr˜ +„¹WÑ4²\ŠÇ{õíX Žvû²ó&õ(þcÎëxa(Úhß f¥ +õԙA‚þ"S¿§q¹ +a­gæ™j‚rð²?GíËø9°ŽO•ìqêՄšaŠëuéõïåò!êê¼r”ÖþÅt»/·-/ÍùWë +FÏD üÓ×7Ô¬ŠIh%¹ôõÒþ†‡Á¸¢Ê°¬œûM»Í\UO^%¡K)ŒÆ² Êõ°ã«\·§… Åó›!ûó5é9—‰05hÐ1£Ö <Ñ ÍÎ|J§±ÄMù³v;ómžµ¼Ä +UN²Mx ÈÄ)ÖàÁ$‰8’ º‹ÁP¡²ñ9Pä—Øgþ4ê1{¤œjÊf-tfŸ@ÅHÇM@½±÷Ð#J^K°r%¶4îJÚr ²Ú±Â`껥@|.’K‹ Ó1Ê&ˆ<š‡G _HÑ¥ô¶²ü¸àÏdXÑ8@L2WHÓæ)ßøËt?¬)÷­¥Yg|þ÷ýÈe„ö›°·0‹ÛúH;oE/ÑX4S²³f…‡k¤n»DÒh„I:]䘿 Kª +µµ‡¸m”Ž©ñQ„銚ŸŠÃí.¤%Þs´ a’ˆ°œPtÇ¿4ÁÊ L,ß"Ðé ~uvÜÒ£Þ{½œc×.a#A@fˆ¾¨ëñq‹&›"Éc£úÀúƒ’¬¦¿ œ_xîloY¯ +Ù5g Á„¶ÿ¦vüjÐ""$í7´o&ô6qûûh—5.ÄÖôøDТ¿”º|„©øÌL .O'N +ÓžjOãô5rýým™6«‚¤€Òì¨T`úõ†Ýî]yƎ†i,mqµdãk„Ý(—„¡)_4åã©eå¡ã"þÍd¼¤ò¨2,Q}64BD{`Ú¤|5Á>A·>æBùœP*("ÒG!³‘kz î ¯¥ &;ÑZ¶±"I9€iú ±UM»ÎJ™!êö]æKóL1„Ü­Þ‡+˜õjJë”Ó8éAŒç9¿5È!Å^"ßÿIɛ/¥þi–åIø¶^kôNh0r©ßºUüad‡úõMK¬:Å a¬‚ԍ´ú ©(.“რ½¬¢xz +¤ù±%¢^­-]’'è‹ÄݬÛ S&—¶vwœôQ’xíë a ÓwW“áL€`äJŒ‘¬9–\S^žbŽ"‰.1àf5͆ø~-=‡oδLy¡® 6ð{ 9û—° ²zƒó²@kLIF\½¾Á´tù±Q$æ2 +c•¥1Õ‚Ý(2®R.›ði jZ~é– B‰YúF]×pß«†_ZU5LO<¥26¥%÷ÏA 0v +rFa9¼®•veš1]‰^áÿ™É(èŽÒ„lhÕ6ZŒt)BéCf‘…«p£Fö÷‡Bzk@€Uj®j=f`z& 9JbBõeË>y‚²˜~}œ’8_ÈMƒI´ˆ±Óæ(ˆh(ø(¡Ói½p/ã菁¬îÜ￸,Ó 4ì‹D{ Ê]¼10 Ø .ˆ´6ëGÓB1OÍA*ðl n¡Aõ¿Êg'Ð=©>…•¡ÿóEQ•%\Üùâ(A>„TàŸ[4m…|rÉlyUb–“ááÍ] FˆÖ>Î܂Nüc÷Ñm +)&ÙÞu‹ó5’¡$_ã-¢-ìʧ³®î«èc8t?Î +Cø 4ÎÊ2¸l»œ”F…cWçŠDg*Ÿ]+gÇ99«€ Õµk:á‰q<·Çuô2*30Om¯F+•Ý'yOóeA k6´3~QŸª£Ø3ÄòŸ ®ÿ•ûëã Gîm™-0{¡¡¯—.hØÙb–cÇñŠæ®£ALaOé~‰]Ov`rÃ$Y£ÝÌÇYaȍQ,³ânTƒ¯4Úý¢ +ù9Áx6#VÚÆ2£ ‹5‚† »øYŒ<øjX…„€ÑXÔ'“ì-¯ÀRð_Möfm¯b é›Çõ N7b¹!§M«3[ ‹Ñx`þÓȟIe²ñ‹•M~â¥Ò7oŠÊ­í1¶‚)ƒò‚u…2ƒÝ΄}ƒ FîŠË9sªX}©£Á‚ÆËiG¾£ÿ‰“#ø!æ…˝¥÷ýßí-môœQ{]ÛÇýùa&è]°ÿmÎ8Ä|¶ ʦrz)ÃÃHº\ŒZ˜~–1W`?tMAc_„~Eì~¯:dN…ó‘$ÿBR'íDxï"–L¬OIYŒ¾0>‚ÒÉã}¹1ÀòIFTQ@eºžF!aó‘ þQ$L—uÚ3]]½‰ÖÅþ¯À>¾ZåîQª(^h·ªwŒ-Þ‡I=¼Ø°+µ!Ä‰€Š)ËE|‡‚[yŒeV¨ƒÉõ ÄàÒ }CFt;ü‰H¢…‰C¬ëë +ÍÊUžN3摬#zDf99ßûbÊY V?Յ³grƒ³ârˆ9› eÑý·I**Je?‘pãåiê³B‹¯Aƒ4Qd¸mIûÈ,(.ºsgmf÷Im‰NØ ·—$ 7B¥ ³w¹6^eÑ Ù²²nŸÌ±Z7 +bOÍN‹AŸ „ýÖJêˆÄIc†Ä,”mˆÔØê +ƘÒ‚EHúöjôÝjËwoþÁP!>D$ñ •ìFoeúÔ¤–qJííóD§^¥¹ï¥ÑN)ò˞ÒçÍ1¤ ^.:‹sRÎ/Ç6Hžgs ÂË-lb\Hì‡:(÷ÿ¹ºDˆ„Ë•1£ƒoªåUˑ¿ºÅs‚¨âã§Ù·† 7@‚?×:ç{\·Xª½‘܇f‡Q„=¤‡  +o>«l¨Œ¦*-¶3ö3œëš& ÇÃ#†üYu€Í0ä{õˆùDÇHËÒ',7îúðº^^À<ö.¢5iã_>ÁK"œ'ô(â!s)ñ{L2Û¦á\ÔÅ•Ƕ‹_iŽuT)eªÌÍ¡¨|Ùxž0 íQåÐÄf‘FÀ` ¥Ç/|Ãiû…O¾™Éœßñör4‹«×[ê=½6Vā®ätÑ\L‚¼” c^ã>䪴?u9 +œϬРȿ…¿˜®Sÿ˜µ ³V¶M¤N¨Ö{·‘beqÈònCCDGõo1 5tBË­8.LdDt_ïëùÌOuá¿Ñx`Ñþ:Ws¨Ù^Óޞ#‚¡®ª/¦8ì[ϼEÏ×ëb˜ ÐóD 0zº©­ç§¸ÜúÏù«³Ó0 ƒAGƒCC;z¢`€ êõ<ø`*ý13ŠçÍ×¥T@¢FPé"]“(‰¡f\ÓAX7@RZ cê¼V4E­¡_,Š›2Éû2ëcÉ c]N(¯eh±Ð6¾|mšð)WQX6 çrúÏsס¸ ôï˜È zìQ—J"_g)üõO¥%\Ò*/ê÷) [ØðZj“¤En…^^P·”pD‚Üöâ'˜“]ˆì—ãÅ.Ð6°5±:‹þj +{3óB©)ʄOPé!…ë“ + 5,p.ȇ<Ò2l0ÆȎYóHX®àœ8÷ºC ?°™†gð{қ¹PÇç:}¹K15|<ý—5ËkþŒgn8¢/Ûlãj2 B*⣠¸ÄY¥€;_Ғ«ë¤QRŒ‡7üÑg){nè±?àuS1¯±ûÌøƒ,ˆn=¿ÌŸ°:ÉRW%÷±õñ³"‚W«ñQÂÊK®tÉjÉzyÕ.Lk|’&.S.<p¹„ΊŸ—?âmdÛœ«Cqh¤€Vq(©xº‹äs™d¥ƒO#.”ÿ‹þÕ¢— ÆÄho‡3½;5Ýø¬¬Ë§ Ž(ðY泋O¿óâԆjÂȗð seFð¡H 9›j¬›mCRms%÷+3êCA@¿}”Ç_ڂù>¾0íx,YzúŠ­oØ*Rí°Ã@ XAß¼Ï0øʬYvÒÐà¹>}B\BžB´ˆ+‹±*2˜M†ëœè(*ð™„dDCY¦©2HFÆo~L¥¼uèŸAs­ý:‚7ђ>;^q2À|Ьç”K­£ÍþáW“3¬ì‹ãüǔºÈèØQ©tû"Ö@H•zi$0™Þ¨ä¾s`‘HD ÆÂQi> ¦Ldpppl„l.D#1†aˆâ8 !ƒH¬AxK¶JÉrì>@‡„ŠMî{n À}ªÄ¾5wn¡úsük ÍPÛ«Î-PƒäþÉ1˜F¡JUßú¾•×E•òæÖd^ ‹ l¥Ø—2=#G šÕdÆEˆì«àà9Ììr«6PԞ†' Ùç ·I¥Û‹”f t³Ü²šnƒ'ayY}¶xdŠÎüšöÕù +ÿ¿± È“±ØýÉíãv“v£[ÆQ€Væ¦nr[18¾µä–% ²°]ðè`/è‘Ûÿyۅp&¿‚Òc+ýdcOAqۙZ¹¢ö¸)m:ÐÉRµÒS¿í¬ÕVÂVEŽN‹i–ãK@epð’ÊÛH*Ü2Ã44ìQßwŬî&YF— Þ×QKϸ “.—O0=Æíb ·úâö~á¼D‚Xÿ‹1¸e® š.†¬¸ À+×LT…ïûež\¾02—¸åuh£ ì˜L8â–9dpí|€÷CÑTpˆÛ±†eã`aü„lýÖäžtØ·µÅLS n'mÕ¤u’¦3Që²ynIiú+&lðuf8nYâòð( n ,jð܎܁[œf£[¡TÕ´Àm^ÜV ¯h¸=Vå8àÖÉW ¢Q»BTÀ¨·íãZ!rs¥¤‚õ¿­I[‘ÈÙ¾öì‘0û~¶r¿-ÔÄöNbòŠ3Êo+4W,ŸyE'ü6oÛ}Âb >Q¹¬o‹þZ³H7Bê¶}d?ô~äßãÛlñBÇ{[þôuVÚqƒXÄGŸÇ4Aî`è¥yÇZNÈm»š4 0xiNµN$ëY÷AÅ5;ôù]õúœ0ˆn+îmè)Ôyâøµ¶¦!ÛR6[z“¹‘Ímw:›-š rÚ¦Cm;ÁöA MUGŜ¢DlLú“”¹m¿Å Ö3—õݶ%^&*… +3ópmO Å[fHÀ&ætk›ëKºç·¦̯[Û²E,PÃÆF¯¶Å9MjÛH^}\k»’Ý­XÛÙYIÖøÎlÛ|¶Ö îW›«×àÇe[ª<ÆU’)£²íÒc ’P“m‘õ•YáHzâ"Û +  „ŸÛÎOO%ÜIƒ1½1`‹Pâ QMŸ¬í¤ÜîYl;°­ÖëIãÓÜ×֌Ķ ýAµ¯×“$ðÂ-Åõ í|a%ìä%:k«lž­é a¶×emËUSÉðrÀ0´r´M^½­N–Áï(r‘¶7QB†_]›c4[mñUggäV葲Úú,B$.óªíyDÎ úœêŒÖ›š¶›šj[íÆ(8ÊïlQ[ýž€C˜Qà r±´8?mš`[«ëNïekyÜrÓ6¤]Û<ÀGÏöÖpzߎhœOÃLÛÎ,KÓz¯æŠßFœœ@@™œV$¾ÒÔíàÝþh«BKúŠxúÄIGÛsÔÀpi¬ƒ ;†í•™Ád£-7ýe´•Ô} Ç>ð¢í„Séáɳ—7ÏÔ61äåÐG´õ|v¡¶ÚR`A·¤Ðvåo†§†KÿÙ~ÏÛm¶ìƒ^¶nƒ»aɽÚg«”ցæÂÖ}kÁòÑS-r‘h¶k±¡^»T¿é|éa|pTk\LƬÝÚÙòô‰«lÙǂf𬻖d~ÈTëœÿת˜ÐnpíÙçôÅT~Aúv¡y‹ ª˜“õy¶Ùv»Ü…8,¾lã¿f‹ )µÏäû; +Õs‚ð«ÙÚº ˜! 0…¸:D¦.no‡­ÖOÊG±ANªöšEG¤“TÃgg¢GJŠ_ý’_W2©4vL‰æ.Û¿À¨Ð¨ç±?KW$ Um.Û Ê¢G‰Ø×ÊZt‹ÉX:6«>8-6¦ðDÛá–ðÏ=×?}{ +s„ƒ,!þŸî[ÕÅU4ŒÞßã´°¶¤²íÚRL•åŽ”3¿Õœ²Õê&çM¶Ù$jø~^³â\ŽL¶˜µºÓª ñM—sÄ5´•lµ€Í‹üUþþM²Eh„t‰dk fÛt/ÑH¾˜à‘­µáJžYÝ'ûjÒF¶üŸÈõ"ÛہÝüÖ9‘­•É#fê\¥½ê¦Oµì±M™~‹öî˜ÙÔlÃËÛ}òتœÇØÜLâ¸c[þ ÁQö8ĤÉêØå°¼!°%ˆ­a?-•_ìVŒÇvóZ; +vH/‘|ml“ñiۑ8bklûƒ5Oöclù¡QسâZnE2àŒ-"€´JÀq€›+c p09Lòa[}ÇØöÙqw$Œ-"²¾'>[ö°ÕϸÃVá(M–¹¨ƒµ³É+ç̷ͳ|Y¤õ0ȖŒä„m˜L1%Ú}Êj3¨¢?e [™Ö HoçÛ~À ýlµXªÊ¤q‘)ƒ-5¥3;6w*F²)»/=ûyÑ+Ø]S†Õ”ûikJ{b8.‰±l_©)?“7´]·TlÍᐱ¬ÅN}-išr²—ÖgcÎX*ÊdØ2άc"ɤý7ô@&:œP÷ZBõ&ôaß_+˜ÕV£¬»uÓ¾ÔmßÞ¯­R˚ÕÍ«¼–pßúµIh<üc$ïúùµµ6GMLƒ†”AŽ†“‘åã×Zà +*ïïk‡R²}í¬çŽ\¤§¶ëkÕòi õIék›=ð­ÕӉ 6.‚×¢æŒï1{­ºqì…÷wö˜®×òn’¿†T»®ºz­XçTNQ!P§¦×"ÑPíwÒS b.¯g¼¶- yíá—3Cã‰êH!ó00‚T¸Vu @Јn6³âµ8.ZԀ èÚڒww-„ âGÝˬ&àÚ!Ë=vm©í̦=à«ôÞ0°õºýëÚüèæÕ¦Ñ'CºÄMLûV×RM} Ñ®ãS×ZhŠá:ž®=A騨?ºÖŒ‡ÏkE+-=+ P`cŒ¡hœD<®½D 7×x@‰õµ¸–&þK€~¼<˜U7Ab›ejKÝ6Ë(èByNå=²fo-u„ÂÏ}6omOfÈ ÇÕ»µ¸‘KÃâVrµ±ÅW4jOdT, +^¥Qä>ꤞaÆւ[Ü?ïÃÖ¢{,Û:$;Õe¹eR4ØsûZkæfßèÂ%ìu­U…ØÖZÅÚ[ԝ䨭¬µLUåù’ÜUk“d±»Ô±q%f3ÙIiOŸ¤eÈ_ÍŠG%ádãKð€ý´V¶ÚT`iÝàÂÏÚ¿žmÏZ:&à7áqÚ!²Taf-úŠK.KË&Q}H¯þ˜µŽ]5`Z|cïµ/k»£ûªR0Q\ÜZÖê^ø?aÕí´Ö?ö;{H†<¤Ð%ÓdðèÕ ]ò.cíIuv&#U×z±=¦k]›œXû6àû*¢M8b-xšþã`…‹øÃڃûéL¢X#âÂÚ37¾®¸xѦw®ÆePÀé ” ºàFIx!_íw11Q¦©G=âbÃÄtVÄÖ«÷”:99¯7{‚B[š¯÷Úo ttÒ*\ÌT)@”cn9Îáy9W[‡2‘Y®VˆHW+â›@6i.Iꮸ¨êûþŸ•ìVªŸjµx| Q —VÚ^K<ÞÓjÁ KÞ>™óï2Eä¬âêIí"¹§-TÃüÏjWSœ™ÂˆŠ LcºSJ¹¼¬Ö°¸: @։T>£5‘Îö{â~c½=?XþÁÉveƒJ9ü± çè[µ‚ÎIJµ +۝Ú1)iú\ê³j=—¹ÒºÙïbÕºeøᎬÿʕÓ.¨$B:U5åm©é֔(âRµ‘´?J˜Ö°ÂŽªµ*(îýqBB¨ZÞø\hïK•jÿŸí5©͇RZ5!¸4Ú_t‰ù¨Vp ¤t*¼FµA&¥³¦/ªE+9æ[Õª½;›€¯$Ëí’òp˜…ÙF²þúl#ÚÇéÛ«¶7¾ÆS£xj¬¶NûÄ.äµá°ôalœ”ߢÖJÓ6ºY>Ú{Da V¯B˜mÙ¨C­‚¹úw`r #{;m˜_"‰€Ù,Cí§U£ë¤l»PÛ÷*Ð jW!,_ò/z³¡UõóEhKÿHgh‘DO«pIN; cÚ¼ÿ0ohÕ³‡ÈH뒚èíKl,‘³Y*¥q@hÀ;ïg§é/ všÄ>?-CÁ;<©‰>‡:´>-‰„W‡V‚qŠ2Ÿ½"¸)Ö4<¡==$h¢»3l=í2@÷†ÐŽ´ÈÓ¶î_O›Œájk_oÀ!ÑFù¡;ílí6[7'f™¥xÕ0 ¨¦-§ÕD̓ӊzœvHy€Œe–Gl" ‹ß0­Ïà´ù8û›VuáÞ´R– +ê²Eó@^–$vÓêZuôÃxZ: + Y¦§VÔW­åìPÆeۑ¼K>=S@á순…ïgŒ-Mû8£àužÆč¦¥2~œQ}iÕ@L,2z… +/1¼UûkyÙWzT¦ý6™öë—Þ(“*ÍÇ´j ™ô¯û)íՅã;ÑÚ8ù71-Ž‹m¬-Áü“'Ì«0­¥§§¨H–B•t0­ÅniMœ=ŠüŐٖƒ%Y•Í˜q£3ÎUÆoK;åXáÖÒ¢‰ù#BßNK›WJ+†Ôä—u½Sw‹žœŠ–•Š–Jj'icÏIGeC]9JWÂ؏µ†ìÐoCR"¹J sŠŠª´æDZ}ƒû÷9Ø@-Àºo€r¢Òb aÝ ,Ei')/HR[‹ŸICiÅÈÐ=Ҋkèz5ýI‹õ[ìÙõá" çP#mW” GZ†‰éÆ9wlXBs3”è‘ÅK4Ó`E|$hª˜•ŸFoÒÚoMڊyt&íõ1i¡šÈ}xxb­©:.3¬Þ–´p[0…*äIÕÉòŠŒÇ÷¾°á -r²{7¶j‚l<…$˶¡i‡•O€îhí6… 2ŽjHK_¯A e5=ø7‚­ººÝï R.‘‚ÒrÈkúåŒÈÑã -ä§ kÓóÑÂIþ=Ú¼*®G«_›óh…æ€VI—ïíÇÏ/G«“Ø8ZiæáhG­~£8®T.Zý­³w†_Ù׫¬F‹¯imb<²GçÍl)Ÿ6 ÚyCÀ:Ct$üEÛòüñ©–øl$´^´¦¸æIïÍû¼µ¤9ÝE»hP.ÚIÌPú2âÇ-Z~>µhaÿN±=­HX´Å^Ñ~†Œ˜H‚P ¾gAgU_²§²žî-z²4$umPى鈡çÖøɁ>¨Îê—,Y-© ³›L62i®©8<¢æ¨Z"xJ“Î//#e7¢5ô(1º®7éD´nó|4”˜òéüw)eIh“éSåõÄH;<ˆÖËO2ÿö<\.hÑw7<§õ3*ÿÑÈbqB%£>´–áž(%¦.vÛC[©’(Ôi*ìRÙ#ùµ‡»†68U¬C'ê4´°À‰8’®ë,ë ív„A1¹5ŠÕ‘[–¡÷›è’!4 ¹ +6Ȧ±uM<-|•Ê›~/ÿ+´5L̫Η®*´x¿·Wºrô¸' +íU­Æ€Q3C“ MhA;ÕI:eÒ=U0äæ#´9‘I k@Y³Ü'«U„vf²/ŒÁ/´þ%6Ð:ý¼Lñí}ñ®—Ë`ÁXÕÅ!üª£çÜ*ϲÚ‚òvžÔÙ?ÑCJr ¶¾ 5M™ŒA¦i<–ý¬;èx«)º™¿4?«ËÚE›ÐCþ+A[Í% \ÚãÈÔ!2Ï,æBÐ.›¡¿·ùΈ KDzYkÊë|ág¬}@[|b€Ûeq2¾–Õo®´„"ILy<ª ^x)ЊØ³¾øQü-#²éQÿφ£JÿÙ,ÌI11hí§Òý³R§¼Šfe*ޟUÒÔ™4.ž^”îzØ°a枽Õ|ôNÔâgTüY<ÒߘZ”@/Š/ÀUœi?K +®”Ééc†š\?÷ïÍ#Ú^ËhÝégTªe+ºÉ’ƸöIåLƒW¹E¬{VN‘’²#ghTö٘^§°´Û”z,#‰¼U}¶å­_€½èV¢ÊÛÆ°«øôY:JÁ­2ÈS–ø€/ŸU“±Ê÷Ä©Éi¨ÄÕi ٖ¡‡Ðá³XŠÁ. îž›\iNçhÊ×Ø¡È<븳‚€¬y=K”z‘®²RZÏö·¢%΀¾µv¶qø[ˆ£¢Ô³µ¢—U»#bœž%ž³ÖuéœKÏҟ6Ô눳¢+çäúfvèÙ³â+^)§l±hã¡Ïi +ØçÙXÑÆ Ì]}Òyò*Z†z:þŠûæÙK¥FªP°…â!FüÍh)ÑÓ³FõCÂìåYèÅßû }±žB&ς3¢§åqdEáÙL_ƞœ˜ErðlaìQy"ÞzøÏ"¢OÖÕÒãßYèpzt.¾. ëÑodçvÙ?àË+7Õ£Çaڐ: ¾œ…k꿌; ‹¬³Õùݹ{½ž#{í,ѿڀ =¿³³­? +Á©8WdcÕé°³k A<ˆLª3¿2ABøuV +=j¥U³ìސ½˜eù%uDNA)ÿ†{‹ãåÒYA Ê·Ì>óíäIgÏÙo$H@ +“e®Zk@‡¤#C¼?ûHáléBÍhJ"#Ÿ³¼Ôw“6«òà¸:R­d8?9âÇDwþ`Œ²qTÐ ´y¦v¦þ›³Vy;²²0åìKE,„85쓳ùÌ:+õi1f´©Cbl§¡lˆIP7[8Ä$,µÊ²óFÎ"øGø¬ÓÁÊkª±¥V©M00†VÞätËíÈ_óõ^g5{k.X¡ôé«8 ãֆYhƒ¡Ù B¶_R0ð3±¦Ç(È´†³^C.œÍ¹ Ý8¡ ËÞ_jåýŒjM ÷ର2¤µcщ吙ÜÍ#-8 ¹Ã éÜ‰…Ò*lÅSž¨¯,ֱà žôbì§X<5œÿצý o–b¼QLÌ}·—ñnÖmºQ›²C­ÝllQ§Š-`ËÃõ BÎïLÊÑfŒ›ÕÏC:îW˜øÿ6Ëp7æ~–JȺÍFPn‡³j€ó,‰f¢Ü6ŠR½Lûq£À4­lðæ3µƒ,y. Ók³і"%MˆZ^mÖr( süǶ‚„ÖÞBb~^?ÅfñthP|e´£€A’ ,އͪþ¡9W«g`ªéÜ>f͞‰0Í4Û¿fÓ²’ˆ÷–Ñ£4Ï¡—!Mñ›~Ÿkhï¢Ly³4]ÜݒoÁñ®$±Q÷Ê4Ù&ûEåâS³öö +d CcrÔ,Ú§Óü)øù$†š,DÞñ– +(»J9ím¨«r•fCc*¨Rِ7·ÔÊ£YßFôŸsÔD£YÈ}ØuAúô~Ù.<¦ŠÒàKDk +Öüí¿ÍBc(yý°´uÔ Êƒf)Ua‡¶Œ,RØ/ò&<†ÁøÕ7³>¬½³>p!ßV_½Þ=HBß^ÚŸÊ̒Dbã–Ýn–˜Z”1~H—Ø}¯1 Mù«ƒ°f–™"rsÿêd?ˆ¯3NΔه"ãÿ¹ð8ùÙr#Ú$Qf±¥CžÌ.çZk“Y$pË-- ê%³4`æ)Y9M’ÙíK‡c@>á„Ë~dvx–šw©éi2°密̦õKÁÑ¡ˆþ PYCäà;(vۏٮ wDÞYu‘ÆZ\ÒcÌb¢ð&U•¶˜Í‹ +Ó¾bv;Ös@O¼,H±¢ÌŽr‚(`YÀ(‚¼s¥ia½¢á)-Ä,‹3£Ùœ;̚-mþðƒ5¹Ì0 ±3ßΓjÁ© †—Oµä"›ÌÖæ -+ÀÀ +Y‚é®Ú0Lö`y"¤Rrÿ 3I§ +5lvÞ/{u¾¼²]6±Ø”íHfßêÝ-f Ë¢Ysœd5…œf­|rDå·dñ›`V Ճ=\ÖÓ±×~¸ƒ)c:`§e½¤¤ñ²¾ {áQ,´"m°ñSÅQÊÿ.ËÙëöŸiÒ5êyBì.˓[LXKíúf¦”îÃÞü‡‘©æf]. +…L1ÇÎ!©á:·Ø´’XÙ[O‘y®ëa—m‘[,‡Z®>U¦8[Ö§jeÓäW2yˆ£’°U¿eÙázš+ŽýRš-^¶³GuVmÙ$E3ÍãM¡ ;C¾é-‹™(7óT€#_½†—¿|õ㬡<õöÙV)N%•]=~˜9¼ñ£PY-kJ)¼b@ý†ÐʖÔx|†83Žˆ£§eQš|†l¢Ähل†8¾"„…–…%Y¿Í;üêV,¿Ë¡ƒûȲ>€Ë&ÛX6Í¢f´™œàbY%ff {VV Ù{ nR¨¬•³°§3ò–uT¤»û0è¯luœ•Õï€Ø³êõãÍ+ RZI"¿qÂ4õG¹)*»vFÛd'N!n(FՆ„]ÁŽíjI¼ãL;GÙá6ÙCŸYebلQ‚¡¾Y5Á)=3~¶š9qՐ¸ +<=™øùñ[TVú‡Ê>‰ŽG{ŠÇ“ó“¥Õ£î]RLïÝ)K¿1§ìDZ…·ÿ?¦Ü”Ã®qÈtÖÉ"sj%ĎÝ<ñێ©U×ðùËfø]Ϧ+Dn^Å ¾…²¯ÿ5~²H + ,«+þ&§YúUeþÈž²Vé:ÄUýô¡VŽUÿ¨ñ‚팑²4CR0dŸl0@()õŸÈ=Ùµ6s<ÙÔq¸×²ÐpM +¤îV¬6YsÛÉbÛfH]é’ëd)€34ð¯c“%Æ G"­ò#M†¸ÃËÀlÌyÌ¥)0l“}ÂpÝJe)W’5<¥¢_C"Ùd¬¼K¯É_c‡t.“Kï¨e´š¬ +øq=–áWh»ƒŸ;z_š¦Çב˜K:ï*ÙïÁÓç,ž!eë1Y˜æ“-t ÏL½§ŸduEóoSÙ-]³ºÃ¾!KáÈà™¨ /›ÅâñP¹‰zèç¼³¶†×JÖF¾ÉaØ.’ʺJ6X9„·Sɲ{RØЧdIR‘üX¨Î}’%—!d­~¬–€½×n’m`{Ó^k¯ˆ*vIÖÉè^rd’o<²Õ¦ËÔu¥DI֛#ÑÐutÚx›)•šh$Û\™IͳɤݸHVap n}$’…™s©å›3lï+¦Â.6 œâ×Ï0®µùÒEvOeP”­{ ,òø¤¼#«Þ`·X°Ž¬`²Sb€Ê}¹š#ËøkØ/®3<¶ßȾ»ëò\rA­‘… ý€h=#kXŒhÊÈBbèÙÄ^öþD™ÿ"{äÍE1ÂÏiª ,¬†ý¢@ ùǐæ1¯áfåWSJ0ö¡ó2!{,åŠöh0ŽUp!<ïä…Í‘5¼m ¨<‹4û ;dž€¦Æ5SúCV•¹‰"jWâÖ&j»èØ{#€SW‹àxã=o_°| ²g-±kI)Ǜzѯ¸KhØÑ<5T´ºù¶3”Å¶ ôÅxu _![ @ôþce 3ƒìDa]9' ›úUðIÂx*È0u‚l²aîÌ¡V&"”²%ýÙdÈ&E#c?àŸ)!Ëcë/›jÓÊc@vPÌhÀE8a7™Ôl¸‹ Ø<ÑÈÃE)û}dQ9²Sü±Tðõíç©÷caòXÊ!pK6IêÇj•Ðâ§_Ç*ºÌbÈß}ÙF ~, DE{¥Ò<’|@Ì ÛÇfçR’­8 eáúXĤ¿Ø».Oî"êsf^yì Ì,24f‰Ùó±„-3ºëHY>6llžC[ Ò­Ùûhb ª këM_k(Õø»‰¸n÷Ñ{l÷^ÏcÑ@Q_2šä»‘­Íc£Hðulóá$þP°ë¼ ×W${¼mðXŠý5U ŒÇÅt(|ø«WÖ;Ö¡1oÏóH£»c•³ 2ƒ³¦ç}mF1;œÑ®pƒ‚»ƒàÇiÝèvìÒC­ûþÌìX´Ýýè6ØlƒÓ™æoˆôƒ_&ˆJ›íž#‚ŸççX…Ý9VVµÕ Ž»OtfŽ"¸/ÇÖ`Û¤1X\­]9vϳ_9ÑzäØQ˜Éy€ +ûVkQËÀ±Ãѱ² ؎bo§ýE&—ÖŒ}c*áÛÛhÀ?I˜ÝB›7Üäu[+ôñ–*?åaܽ€ÛÆnԝøa–½6؍e?ˆ¦¥bKי U“bvy¹¢Âne“PÈ·‡ëËÆŠß7 Z<‚EK[¢$’ëàÊê$Wíd¶°±Ì¢\Qö¯±“Ù,A”Ž®±ª4òLz³l•(kl©qêF ³ +m"ucñ¤±ä÷~ ” ±6ˆšh‘ËRµçGg?‘±¯Ú3VE“Ù+œÄW~‘&«ç›±B1ûb(*Q3–€°,aq»±Äéd!r"Y±1cù±ÈôçdüŽY¾w±1[¦Ø$ ™¨e¬Ùs2AM°Àkâ;§‡ü\(ã™Ð…sZñt‰ÁÙÍ›LÔÚ AeꋱdÕÝ(*² ÝÄX"^9qHH#%0b,ƒõ@ÁÕ+PáaìK3–¬®»dbVÌ»¹Èñ0XÔLP¿ÈoÈ)Áý«Ë!”qš{±^ºªwó¡BëźH ˆÊ¢FÕ]Õ)8¦Ý ¥%y¥Ô¹„¿Ðܧw±{9H®»0 +MM+H«*Œ 7©§‹…:K_©² +Ö}ȞϔT×´¡%¸3¤(ÒÓ¢PÆ5‡åµØìÎÛ+£|µØ0œ)VïÉ+/Ï(bÙ5PuØc©DLns"D]Ø7Dg²Ø¯üŸò–âþ±XScÙcé2-k‡°>¯P7@jù•«…Ö»a±†®³D4° +,Ïbòôà= ©jÅ.ÔÀSíõð6lÚÎùÌðÜ~̱bÚÂ3àW±§ n[«ÎŒ= [KÕ…ÌûžŠÅN{˜‚í·AÔ ãé.Åf8ÙÇDï<`D³ o‰]=JìHbàá¨!"R¬FTx4´T·X2Â&Åþó}Ç0áÒl­/¯ü ë…èå&p5uµ‘E%ì]$Õ^!;¸·1¼F÷jlÎ@ ›‚D†ýO[€Œc`¸â8`ó ›´Š8±(\O‚ͶíI¹C¶‰Ug——V…Çüº&Ö=~‡Yöþ*Þғ©w[íÄ¥;¾£BÜF<›œm¬Bë!•‰ íNc&¸"ÆÄr°c€Ê+«2L¬—’!±iø‚*…8R1ÊÍ\ô͉­Ä4»(Ô"6ã.*¥Iv¤FŒœî¨}I,mUXK\”ŒfÝE]·ÑíHìè]çúŒgø svíöš½H,kêÙ-G»˜ © ð¢K/2Å}\4ÂÁ'PCy—»‡0ÞVÄñUY²š!%e÷ð´-bsèÏåÐó¼pAP_ŽázX—s5æwòøRÄB6"U߶Xl¦±l ÅÂ߈ÃùdF +Ã^IòØ›…bu”ÐÅ" 6í·‚½:Çv%÷L£Šiîe’!õÁzFÚ<+›­ +–bSãRe¤âiI6—¦ÄÆ{°šœm̲±±hᑝbï¨Ñ>IoXµ¬¡DȔ^gâÛ¼ {fø7Ž-’NR!:êü0`Ðaë+².þžì=ì>*,èhAˆ„c¹¤j‹"ê^X1ŠÏÝa5qŸÝˆð…¶ÃҘ„ˆªŸh)Ò\WvØ eØ0µQ·Ô}ñ@{V²OШÛêé°l›¨=Z{VÊ&OµHP±²$‡µ¨]ÛKз†˜ƒºù:Cô¼k%n8¬?Ô£ÇÃîE×c̶5 §Öj7ì¦ì3Å>7,-UĉŒR2pÐކµDz]úÁ¦¡ûJÞvõf¶P|À}KB°4,Ž†åþ–6'cÈ@^°ÿ¼1î0௔ñä6ž8 Vü8b—a}-Ÿ²á=)å?’Kû)¬N'ÃR*“ÅKݱ嗑aÛÌÑê^£há ¸ýAžL$McX“¡Ê‹2ýÁÏp¦Etp%LŒ6óðÏ´½ž™7C=1‘~³Ä°ÝSÀ%k¯ðû•í@Úë‰mŒ3ò”Ø »À=Nª”„ô¼°"±¹µ…Ti½waéþ­ û… ›{c'¿Ò—çÂRÞQ·q*).,bu'ÖM*ý·Ô£n «z%Dþ#‡¸×ÂÒõ”\Frqb™TRˆg6GeÂ&T*”¼#Þ³°DóL˜TUª$ÊÂr±Š7*Û£W•fe‹–J2a0‚W…°°ÉôŠ]™+¾•!]N…u_̃^J)U0BñàG…åIy +«( ˜ÐMa·@ˆGàØnqÅfÊÂƪlj¨+áGÃûp7–å©<¼DÃêš…-?—kjœÂÇe¸‚AWçHtÝü¬×’˜™óO¦„õ;Uïo´ +ä­Ì†þ­û$,áã °Ä3Žv„­çPåè ØHU ô6¼5MîÁo±ëÄd¨&­03hÊy0 +õ`iŒú*O_[tz®ƒÝî ²fù±@é`QëݨÖÐDà9XJ©+½l=©Vg;aÈmk¤å9}puVuòQ¾u,ñL2.ô¡s Œ~«ôÿj°׶Yç1X¡z.›q‡‡Áª.Ì`°²Bý ƒ‘,½`o/ºilIý¨P@c¸aáëY°ïs0ýäk-É©ñ +®žbÌZÁðMWڒ +ö0µ18ý%­ë+s‚u‡0ìÛÓ§ƒå\ò8³ÍëkŠ"$Ê'pý‚ÛéÀf`Ê,ãe‘`)À€Bˆ?žªŽ©=‚Ïaã<{Šêâ’쐃#ø¸7ˆ*ÿÁž¸°¡ªÚuk@Ì.y¾­ÑO:«×¢e?·_æØë'UEß ÿpšjOYœ·iž'°S(KúX•(æk˜K®5°º†E-4¢|g`ÉHô°û”‘ži؝‚ëeô…õ úœ‘þŠˆ»N¬Ð°â„ÇۃÿÀ –ÉT(i +D8›À¾TrÔ>tÚ©ª¾ù0— ¾ªû€´W݅ãŸ+Wéìaphy@X,Ë<šMJ{È4Í–é4}´²¤ M^X®:Յ°×/÷“€Â N SUSÀÞa­ȵˆ™¢‚ß°Á(uy'QGÀ +#–Ô5]k—ž“ۀͣF¢€ð¿ ¸Cí¯…ÆgTÝ39³‡ÎkzôÌœÉ °œ¬æ¹ Ž\2ˆ.î +f2“K^$­C@„¬€]ý.o£Ü¸ÃC_ÀŒéíÖX—ìç5ÀÚþõÝo-Ü÷U:¤P„þ¿jþꘉՀý_+¨‰¬ ÙÿJ(ù“ ‘­5%î¿~á]øӒLÆp}ï)~T”Õ}üùX0‹w0ÿՙþªÂù ÑØas8ÿjî÷¥»Ø¤þ©1áû× "!KׯÿŒþ6BGiÿ +GñŸLèõú×%VÀk,ý«™ybIv˜¯>·yq넢*ѳ𮿾흗‡ß&ɬ¡úës'¾Sð (©ã‚„uú+߂¢¿Š~?ÑF2yt }þú<Á}º‡Òæ¯ÅsÑvcé0´„ò“ØA³v~͆=Ã5rÞHñ£Q?%ß~¥'ˆâùfŸŠÁîdƒE2\ñšGxî‚Ù¯©" ßŽwZ{?·„‡Äæ!Ua_ä(Øð…èô«Øüó¯¥@ƒ_[Þ²¯ŽÎ»8¶Q#pG¿–_RR û›jq0˜§sH’<]Fü””4]œšL~ æ«,> bRvã^7ÙÖãW³Z¾ß*0B8D<5ŒdØø•â ¿â H?1é"“¶øˆÌ—”S*P™9^Ù1 ÆiÒÂt’Ð…èïQ‹hZæùÿŒ…&à V PüOB½3í…\XDž{‡‰û +pyv¢³¾ëeK„³¯2…ÀÑG!¸ã²¯îÜ1)BØc_!io ]I¨ý ÆK»üì@ºxáùÊD{lð¾ƒ^‹¼'Ìĸ¿kg”Â$ê«p›;¤8O_Á8–@›¾ÒIZ×6 JàÍkÁÇ aÏD´)ÞO´i+ì($|}²5¹¿ÖH +Xjô5Ú£¶ a‹¾2*oP*Û݆¾V£¶´…Àwƒ +úʓJ(úW×&Ñ6¹ˆ­$ ¡ð=lag~xU†-¼(±IC|ŠLdïÐûÂûÀ ¯çk‰*ÏùÊ­ëJË×Ùh®{@Oo­|UÇL«´ ‰œR[åI +ÀKçÎùê2yCå/´xÊ;¾ú ÞøúIú1¸½øZ 6´,]æˆ\Bc8¾Þ .m0cO¤×º;µÕÄøúûva¾]–Ü€¯"·¸ñ!G¯îß«Þ=9q‡û½6]ëãÕ{±ê?Ï{M—¼Pî•x¯å/A ’W¯IZð}a"3v‰w¯º ΄@eAØõ‹ñ${IìÛëêXŠjÁrLM l†´)ʇ»½¶OjÒV‡4.Û+¾óáV‰m%$Lt¾Á‘|:Æ ãŸ§ 5ªë˜TTê­×g1Îå1|C÷¦¹ÅÄr,'{=+Mî„×)öJÄ½Bq0»a¯¦ Ì#ª¦?Øk0-ÞÅ4‘«ìt–¶ÀþzígÂ¥®YDÚ)+׫³õ0®iÓoKƪ×yÁŸï´ƒ§zÝ·]/ºŒIs˜£ª?*z%–íC‘¥µ‹JJ€z(R§|úu ^Ŧ¥Ã¨×$PâËëë%2g&ӈjõŠH!æÆ´àÙ1€ÆÈf®^U}RÒ-4#§M¯XP)¶MzcN¦×_Hmwé•[sV©`«*½"÷#ª;LzþSv´"½n JˆôêΪl@«dçó»M€ƒ]Âzw(èU4 ¢^߁Ÿ@×ÊqéôŇÓÛçõPûl†lˆ¤ ÔÁA?¹üñŽ4ú °ý(Ð% M]µŸýŒlM+¼–ÎÁÊuï¼f\Ј°0¸ÃàÜýC?ºWtVÌ>6}w{fÌÁ–yeäÁ¬ìM=c^iÖ·Ã.3Ì+Ë6û8é +ãð×Õþ¯SˆD{Ì(r”¼Î£Ê+D¢$‰Z§>Ê«kó'¯Ÿ¦0Çúó’WÊd8Ÿ#ÌN›äUå‡IÜ$8î‹UÞyõ1+_ˆ2Ê2îò +]`Tq؜A^UŒD¶ªƒ>¢§µ‡b¹!và¦äDì”8î‚×PŸ¸kҐ‰ùFൠh³wgäï#^K™5’˃ +ƒC¼«ce u€Ÿ|`ê>¼‚5!J»ÝáuJ6,ðéîûõ· oöz!÷|¦Â ¼‚ñBŠF° N-xMíB:Ø»ÂSGò }4Ž¯4fIvM›°45=áäB®– ¨Ƹ–ù—ÿõwÕbÀv(?ˆüü$Ƌn¿« ò»ú§($謡wûíú®wÓ¬bvÄˎŽmÅP«#.É´Bf%%ÂÖ»:®B:á ÚÊó ž›Ú#OïÊÅÙµÝäV~@e-øß(Q!E]H‹¯»ºb…Ä,±sòÕ]U…ƒD™Ñ´œÓ]qürï—ä|QLç靹fJîZl%Äڐ‚–-ŒbQ‡€\‚²¸k.F1(ƹ=øpWÈW_ƒ»:"$¼K–†¿]M!PE‘ˆÿdEQúëzË;xüŸ0tEïvýTÓ øÛêZ§ÖSŒ5<õeXpb†9_íš÷50ûĂ7˜ùiWú¦­~B*€vçC~}’ÐõÖÃu°3öáÜ"Jª·¿a9tIÛÛÙÕÓÌúr?M‹®àÍ®6dƔG™ÙaØ. oÕµ¼Á +^Jª«ª5w¢Úî}V–#»r^ä1›]ì±+¸ÐDš¾c½ª±k): 4ZYÈbWÞHéɨ%b9ìŠ(« 4IȚçþG;ùŽdàl“‚àÄð”ðñXÝu}hèœ Tx³MÀ±y=䓹®§:Ä Ì)ú×µ—Y[Ûë×果âTýQzŒi]/ö‘6yC¨ÆÚÙ¼u=<ŠPBÖ՘Þ¼wº¶Þ›‚dUÖ$}#ÏêŠ['žÚ@Ú ®l/|èyAuÝý9.ÝéçìÞ¢®@A„¢[s¤pǚ¦ÜRvq¨EU´zééº5ºfíãü\—ãÒ<ö×xtuð®Ñy²#~«#¿PŒ«þb=*¯éºËÎj‰ T+Lõ‰¡&˜|BêjãK>4¤+Rëdÿu¹²Ü™¬Ûð¹Þ@ +͑€ ]tm’ÔHÿÛ¨ŽfI5ðssUZGEž\cPíóDWúÚ(yGŠèj8¯F²O®1FÁ§E”©3Ðu’xþs}:ÜÏUÇváûÂ2]Ï+ÿs‡…%Ñ£íæ|®¬—¯š`¿2,*³-$®½ð»µ‹”à#&ú,՘·Gn0dÔÌ8í†u L¨Ö’ ïÑX<­ð?ÀŸâÀ/²Á‘x‚@³˜¾¹êÏUá¯ÞãÀf’ü€Ý\M“äosµ„KcWšµŒ1w[íœe6W@q`Þà‚d¢âŠ¶b1T±ô5„ ßóžgî0ûÎÔd®¦Ç2Ø3^Œ)1Öè ³öl{)FSbæ\̕GAY蘇n``*J£Æ‘‹Â±HkƝ!˜«}ˆŸªU.gL3’-‚ïr…ÇüÿäXjÕc²s’îz9»Ê•p™ãdԒI¸N¹Bâ…ø¶Òª³¥\)øÅDT-v·>5ï‹Ý™4z"†r%q_”ì’w¬|~+$‘’6kúÉÕþX>ˆHÇN®iôlrMM=NqÊ2Þá%Wžn¼bœ_„T8Xª d ¸–Áq8äJ] ‰qeŠX qõoüöÓSýŽ¹ª¿„5è+X¯ÕññT÷v8ë GٝNq¥«{„÷àËA¾µÿÏxµüS·ž¥ZDó±U\ÛlWè9>é DHÍéWJ=á êtô„HW‚{BÅa²Uûº@‘EQÌc\9Y´IŠOø>$ï‹+ø]?°Vy‹ë16ø¥Äo÷r¯!#+J!“8$±ÏœÃэ‘œ#séM9O‘O‘HhtôÒÙ1AN•Äõà-M‚ÈÕ0â˾%>âª>1*uìÚ?Š¸&ìh¯,äÝpu:\¾†+1n^¿T Äø9ÃõÇ@Ã=ЍGÀ®:e'ýÒÂ5´O0³¤Ý®ÜªxwWz!ÒU…ÑÐ׫qѱ®ú!\5ÃN9Y¢ó;1©ƒ+Ãè÷-"LWÝòì‹NXWØ0$ûe>Á5^ÌEª÷¡#¸B#XfŠìÎΊ3ýiFÄÂÓ¹¬ý¿Õé ÆHãøîþ­`¥'ǹՈý­Œ’‰,–:CžÔ ÖHÔÞñ[ÉÔ«{f6—D¶o%ð¨@¦ôšÈàí\ß +ÑÌô­ÉeÊÂç[í»¨Cþ…„ÿ•oMËC¡åÐâ¤ðàñ­¸"v°DÖÏÔ¡cA°To-D¿"Mf,/7§·jI?Â<\¿Sû/`×Vnµp?PÎu êìy«a×­Ž©TÍ[ú×>~·UÏ|y+˜âVkÎôGDd¬‘ ;ފR‘-ÞÚx¯*û‰ÄW–oý¸pðÖdÉp¼ÅÊŒj³õØç÷Ûúj–Ƚ%BW‡önµï~1Ûåà¹[ÉZ Ï#úÁX¢‡yߝÄI h½µ‹óêVóš®Ù© NÝ–y_³biB t«þ†C?ñ²ñù/àõ- É×2O¿€ëÜjÐæÖÑæà œ44z[Iò'­<*·ÎD_‹þXa§Ì(¨šÃ­§PÉV±b6Á?+Ü +Y¬~(ÆJ…m…ßX•g[¡ÐêP¶ J´êÀ­¦ŽÕç>²~¿¶ºÓS;F95RŸõm‘¬¦fZ{"+ƒ–öu¨Úó¶.𻭓+ðMi‘X[ÝV©yê©ïU,’éæ¶0o#X¿ÍÇm=ç¼ü޶ڋc¼oAÙ<žšþÁÖ¶B\o¢¾,ñÉ>bT–À­ãz)q±Œ­­T†|x¼A½êõ]ë +¼è£¶î”]ú¼áÒWBlu;ÀÕhˆ‚€ÿ¨¥²µ `Ø4Zë=™”Z©ÃVŔÖZkæì%¦ÎZ æý4¬-f€Ð/¹FÿT0˘³u(ÙÀ7/_«šê~;̅¬­Ùª~ª0¤•s7«¾újØË×Npkeg ˜0ù +V4tëYóñɚâAž6Óhë'–ç« +…ÞLMµvkéè2V„÷€´hÕ·*lm+!𑭳°k»äë+¶¾Ñš¯‚·[Eê͗Z_:9k[S\˜}ØJ‚Í6ë×y XËf]ø’6lݏlíë[)A2$mYWñ¶¦¨ŸS¶R6jí( äå~9´êR۞ٯU­F÷ãÿ˜Ñ+ÃÝGKr_+¯J]àáqˆ +Fëj‰¢eÇÐôx­Ä÷Üh…£ J¢¦©s‹g­‹èŠ=QV%qVK-·kÕ¨$ÞRÂÖµrìdgØR©©ÓµÒ7:ÞDù\«Î *j(×*|Fﯹ&§s\k.açáZ‡Íè0`kñO„ˆHyeÚ{e[kÅnÙZMÌÑÃj¿ãwÆ_kµ›8s\1÷F1çi­ŠÂè;þÏL]øDke÷ŽÖ<˜î篁ÍZ!KeRy,­MÕUãðn´ bRD"“ªž¦Z*/'tЙpW«GgŠÈˆÌ+$ ´€îiU8Òbr¿‹Œ˜ŸXaÀfe›•g*µG0º§jµë§^øºjJ¼£X¥Z{_ £³ªÕh¸ˆ8]|œiýçë/ÕO@wª•¿€gHÅæR­JqغŽÕ ¯|<»ÿD« æR«ëµy«|&µž°(óƒÖ79EšIn˜ˆûH­^' +²è¹F­ °mÕ#´OŠXí=>ո䇁—Øpž§•àÓÌ»å`Ú;­ ¤uÃF¸áLi’;û‰O°K‰feM«z6FžÏ0Ώ3­³%MÄƇOéåÍŠU¦ÙäÚ¶já¢fL+™”;2L+˜ vš­ýê÷¥Õ–^ti­„"Ú½X¼*rÜ +L|ájÐäX´v  O OÒú÷ê‘V}›²4œd&Ÿ¢Z7k»2ÙªÁ„ôG+uj5E^¨kîÑjݘ¬³@ðøq{ŽV°9æ̯jƒE‰Xæ nõ„âç:ѕ¢5kÐUôO¨T7ºœ§'ZqKµÃòJ´îÂZŒlD«o¹Š!Zµý>´®OýO)ܕ´™¦ßÁw™2´ÚAÐ!µ¬pC'´žŸ½á)rZñ%1gøé׳î%_c˜B‰: Wó icÚòñJX~ÖJÄ~Ÿõô¡õYA*åܨqDÀfUGì=«ð¶g5p=ëp*ª$¦2jéYa=튕zs¹•.Ï +•.W¥5·B­Z¬[­ôېœÎŠw $µ¹IEäpÕCŠt¤kÇÀ<Îú¿•â¬Šê g•Ë18ëÄçîoóŽ¥[2¼ß¬5ž.zåf9¸›U4²|Þ~^VÃÓµ)H‚¨G¿ÍjNCgÛj³þª.Œ‰Š»²6ÂÊÿbHÊ7Í*ÒЬ3é͸`¸²*Âd,â 73«u'/³^¯ 8x‚`Ufõ·‚ƒÊ1´Óêۆª¤c¶ÕjK:zÉ̚¥Ú8pXÏ}è_Ö^_ãè IÃìœÀ½ì1N·—u}4”yYɱÆÅÄêÈéÞ¨W­.kßp.«¸t-pK:©ß²þªêÛ²ÂwRfô¨ ›ـ¶›–UKKöÍYÞT[YV›@ T´_sàoJsXV„Öë‰PEÓ¬ƒ«O¡³++·WM|Xë敘dА õªÖ´ª]eå—9È Þ0 ÷|¯ «OMÓeÂcS¿eIÊz6Ƙ=Ðòr@'óéQV„B†ÑiŽeŕ޳BaelÛC2Ø>r7Jàˆ¿jG·ˆä9a®d|,©ÝLV†’Q46YüÇdu'«Ð­ÈJXå{¨žz‹MUuJûi¥²×xJ²é£$æáHÖõSxHVð$cÿ2r!©¿¬ê;m÷gÈçh׎uåïi¹‘9qnÅGW€ŒÀàûÇñc+1FwZ\xÝEV¬ãR?ÇÇê”>à•²6P½#oŽ×ãą]«àw51ŒKdUœöÄښ”„€¬~'¬Ž@M–~¬@#\sQ 5Êǚ¼)âóûvÒRÞceLŽ· K&{¶$ö†nˆ^c±N:—àÊÎw¬r—¸7æáw›Q‘ n„zô½®úŠNJìÏý’øì?³¾—Þ¿±±bÇv^­×‰ø¶°‚#-ìNz, ô‘gSÇÛÿZO¬Ù_V³òƒÁô.œVMhijú+U…~ø¡Õ"Ü8¡ê§Í^X†Y‡ ºà+¢8:–ÖG{±²XÅÊ'é%×chHó¯&(C×Y=z S·L‡Åª¡üúEûöŠ• Ò,:êG)E¬â u6OjXJ i]™&¶Šµñ§ å02èOºÛ‰ö¡²ä'VhŠ.ð~XÏ a3’Å2 T&" xm&Ö£SC +ϨºÄš§…5Ÿ5z4ý&Z:[_«j˜òA)poObýÝ'^$¥ÓB¬ô +„¬ÔàÓæõ̐ƒXõ}‚Ú Íj±@¬ý‡5“ßrÒ>¬ž¿D º¾wXÕîËli“:¬èM­‚sGl]Îaý"ã°ºëj]AfñŠù.í6¬ˆ•°2æÑf:FÇ߶Ù>i•–R;u «09‚ès¥×‹£ŠÚ†Õ]×Õï®Ú'=6}…ûd\¾°ŽËšX/ºQ €7îG¤êÖÄ RÔ]˜¯ÊÌòý‹J4 +`õÁIàPBå_a-iAbÀlÝtƒPxßöRɱbRÌGg¬‘f^ÓÃ[è7©M$q,Hðk ’lI–F¢°V€‡Ç 'æ=†…Ç»‚%¬¾R]^olâý3£òßHMH|‘g\§,ô£Uפòá†çÞF8Ê0#j(£ ¬!)Èg´×sõÒњ—×!¬3–R[L¾ÂJ›2JÀ½ZÎbc–:¸«¿d¾JHŒê‘J +’²¯_iIôsl8¼ä qۄ§Bx …ðârŒ ÌÌ̔8^n/á& }‚„eu Ö¶]cÎò¶+;˜ÃÿÿÿÛöÿÿ¿ýj$pÚÀoÿ«êu{ØÓ» 2Û9Lì vxÝ+”ǶJ=¶÷’ˆiÆ6³ÇöE²$ FµCz8À”@‚ÜC"Šñ0*fˆF<•S,v5öê”kñ‡+x琽jØtG ZT}N×Oy]S™NÊ>°¬)Ë>M`h@:ÜR©­CÌ ëjéI_çÖœÝè ȟŸ«ó璹ªÄWk("_ìqDBHåp©£D4'¤¯`¨CcÈr\ÿûÿÛÿÿ\ҙéЮ>›'•«ª*%p(333svµÕÁ²ÂÐ.ȗա28¼,ʪØ[»¶0Ú®sý'¹•¸¨Ë-‘3‘vÆc? ²¼² ªj'kƒ»Ëº'&µ%GŽŠjñ·`Q3 >PDe\­Í!¨‰8x¹ED¼D(F”$Râ>FŒdµsç;áp7`$B9DÅ!RevX6;ÚÔÏá¹k™×Oô"*2è,Í ‘‰ +‰L‡H¸èˆ&©È&ƒSØÃóÛî;Øáþåÿ3‡øýã2ÊÌ,Tf"âY֊äOT•Ã8ˆˆˆN::㙛!œ:ô69?ŒˆÆÁiT‹©ZU¡h¨´œ> “p°’h<Šä1 #÷5B P"6BHDPD&Í3)H0ÆbÀ í (ÕþR(Üg͇­¼Š’)!#¥üGWÉ÷W Ž¼ŒÕ´( " “¬†ûSòG¼ÖN‹ˆO‹ŠòÊõT!ÇK~`̒øõ¯eBËe=»ìk*‘æòëxAOk©Ð9ñb4™j–›EQâCò"Ë~KŽaêËßé,ÔÕ/»p‘S¶æé>D-[Ҋ–ËþȞrAÉ"ž´(bf-Ö²ŸwfˆH%»ºÎÈ>¹õ}?iþišV1£BŽeÒ±y‰ÝõÍÎLí Èë>›úñÿ9ËJÎG0x֌Aã?CŒÚiñ… ìÃj(¥+솘1@xb¿X'ø’ºÐ"gÈPÊ|«·0Rõü¤ Ð êµ…á©W)mËØWGÄnÛ HñÀÌ·ä1¿D_Øzæ–LEÁpT·ŽóÈRW‰²Î“òõø ñ× Ú€L)L(m0”ƒ0ªçžÑ(ãÏVzµL›¿ýX`–EÖS£U3¡ìS.þ‡–‡X;¬[Çj^=žì–z-¬Sòíéða{afŒ’+Ç%$¯çËÍ«Wì+ÆÆýSҞ±ãÜA§Búf(“UÑïzÈoÍÌEŸL’Ãxœü$ˆ[ÐǓ1× p]̨BæÚMì%%9Ѫ×hœDXäSíÆxrî|u{y¦ž€(ØÙóqD“•õXi1(­£SBËZÍù˜ñbŸK, %:.ND.º9»„ †”¼LUŸ9x8*¶.‡ˆU—*:Daåe&#½HLl/¶äη Ö[ò,4l×Î +‚œ±dÞ&z<¦Î×ö™gà›²„ôHš'üéûv QÍÎ=-׍+y&lî=C¨çù \Ÿ¿%΋"·Ø< ­FùIé,À Mf0Â…÷ƒ¶%ݣ͎Âjÿ>áÉÖsî/Ӗ"¢M±äÓ´E×gOsðÖs|¶®¾zv€É3øž§4Að*2`z N”bE±Aíˏ¤JuIò̍Ï=3"8WäÖüuÜ33îñá›Ҕ4ŽÄ9{fԑ8:î™áþø$ úÌd"K”†æˆÏÁª-ˆ ÅçÄéºQ€ÅGv Ù1‹õŸ•\½¾䞶Ík`J«sðC 6ŸúŸÌ„ï߶gøjˆŒæÅöäP~ыò”>¤Ö姺Íü7JÔp\5Ž¸vOÔ§S뢧?¾ÍØzǾ”ªÍkŒU;,ãJRj>Ä Ñ;”#/îBõ +«\ŠgÑÆäœ%Zz„„Œ18÷m…¨a+©3¦; 8¦O/h;ï,Ð @ÀÛXy"·1JmƋŒž[ðw4+a‡ìaž“ÖØ6°„L<'ßL²—°–·&²J.wà˃Ây,•m,™4Ë䘅 ’ÒŒýÓ&-0e¸;—IŽò-g«Àŋoa±Çriß­·FîMöÃW>‰"'(ãt@u´wYI­ÓM>ÈÎ¥}z¨ÿå\²4u tGq8^Ša€ +°Ö” ‰·ZùƒRã~ž %Pó¶›Èj%;Á[H– +'˜¢ugP” b{åšGÄ¢^³×…ZFÏU«2 ÎwòkTÇw×Êt6cmš ú©²DŸµT¿é·PšõK¹DÍÿ‰h§"8QÄ`Aw£.øö¼ÏüÍVT]”ÚÄú®µCåK£”]BȌé@×=‡óuiùš!ÃJ#)Î6Á2°Wpò +×gy׀\ ëLðk†r¥Š·Ñ>Q¶=a¨SÈs ü]ÝÎ å îmԚ‰í µ |Äq —btšÖ14Ƌ|zXõD oåQ$´:G¶¢A­—B¿ÉSÎ'$ :qù Ýv˜Äºä»×¨c ô(…^Ƕž Ÿ“P«®ó[Ñé‚4m^",êÀ£5{k]AˆCǚ)چ³V´‰?à¼}¦“Îœ nê]‹ò˜ª§‹´?È a§;ÿ´´9–Á…s’“&²›šÿ÷ï °aëèшHkAÚ2t—O[Ö{ 2 õȖód|¬KŽGAM š‡©~º ‹3ìò‘MNýtj!鑜3E[Röß=Œ¿&‡*Þ ¢?Ó÷ƁÈ8|—¹¬£-_IÃMTFKo$ +¿kk|À;3\!gÏNgð¨É Pˆ¦!år+Ņ݊“Nõ`qÒEâ¨ûû¤êwœ# šq¦Š8¡³UëêDø[NÇ,„(è³L+»Ú)ÂjªöXD Ԋ8åü«ÜŒØ‡‘·ÁórnД$uÐÀ¤À³C7Š€v­ Å`¡q=‚ùjÓÜ8‘ϱ¨@܅&AQîÉߜô‘ØfIsÆîoT)qOIºÂKæñÚÒē<ÁaN?Ïaaes'x› Ò3V]ÃØ +¢¯(’ÐR2_’;\N¦\é N-…2GÌ,¬A¨_¯5ÀØ̯<žkؘ=ÊN0ºûɅi¢Žy¶t\IÅ0Dˆ£ µM˜ÞöòjïüÉT(¬tQ·ãW”­,‰PÒMhW—«“g˜åARt *äªs= ¢S:¥ÀK8¡å T¼¿j)I£ØöFpWV<¢¬„¾ú'àuÚ¹'¼Æ CSäHY"Hõ£à–µ7O=P ] C'šz\ßZmççÕç.¹ÓHCpÌÐÁ¡qž C†AÈcãÕÀBáHxj8î¯Ð}¢Y€Ä; &ux-©„a—É—Ÿ:‚ìà–“*o¥).@E—µ1=‡ +…_ÎjלÑY¼0±ï¸gL˜tÚEž¹‘:=Ð?¹f]ÐàS•º¡ÁÚ±{؀ÞrB/ɪò=`Ý2¸Cšþ9«!÷êLb„efv×T²©B¢‘xdP¹¾/Ì¡áwb³ÐÔÒª"¥ Fì(ÁQ:æì‘“ÝHÄ|¤ÿ'*@ + +Sô d½ŠºýD©%ßæ°.a£2cÁâæGJ,fñzmø£ ršQ4ùt ÆYÐìØûþ‡D;zدä$€Õf VÕ«6BÔÂÆ6í†.>$$R A‡z +ò”5âöudó¥Âê•$ȶ%Õ©»%+ÿ1¥n0àyo#_9ˆ²¿r™8´Þ¥y<ÄIõ›Â±³+4iùí†l¶r¿–™XžïLÑw—œÿá’FCÈò iޗp$ô?'Ðzì lÈz9ˆÏ²^’ãY¯Üʑ§Ÿ‚äÅ5}¶óSÀ{¨“RlÜïñŠ»(ÚìPXÄ÷RˆþP€ƒ2Â0ò³ñ1A¼lcH÷ü·E‚ø§ uDüwËÍË¥ +¼ê +»ƒ)dó~ýôñ¶ï'z^¥Æ:ef+éLXâ§w>[×þ÷ œ[_šÆƒè þ0I$ ’€B[XòðǎĀé RØäÇèú@þÂcü˜z)Ø@DËrÞ1ƒŒŽîj%鈍W<¬â Ö+ê/_Yf g³lXa`?©TÑn=Ø‰Ü –”Žƒ»Ð¯¹Bî|ê.”i”T?÷h!Ez­Þb±RÄþ5»Ù¡Ø«ÎqžMü“(f0Ëþe|Út•d|ó¢×N­82·§Ð¤¬;þðòԈËC™ÎÞÃ@ÖKjfãWZ‡¦‘{è)Ü¢s»¯4f¸ÁënŽô‡ƒM„ÖT‚j·*×~Í(¶¢x?Áغž6¤(oûÞAèeL¹“¬ààÙSXdÃ9ÈL;º%‘žüpÏZBX¥Jãe(6 ‚mÌ4öàI“ Æg€ŸÏå +ñbEÂ9¹G™ +°—BíœI‚åôý²”GŸ@ŽÀ šÄŽŠÀ'–5q„4°ÊðˆI~‹aøÍòè·Z•Dbƒ3¥¦’þR¦“x"Ød'9?PÈ?É£×ìQ±ðQyÚPq)ÈÅWš÷éËʼnß÷ŽaNlzÉyNBño›C0߈Î2Ú·÷j $hkG¨¨¶SABx=ÌÄ}€·kí©d1Ջ²¸¼­å¯ c¾½Jš/*­¼Ã4P_†© džâ´ÃAÛ°x+î|æcw䪚©¿Y.,â7oÅ´¼Ú3S(ø/>]•†™0ÁýøObú 7Å-æ86KÂÓ¶µ™.!3 +Ò~@9$yVX~ +­Z¾á´¡‰h@#hà.÷lú˜*óUò°!í +«„XD+g •‹†ãð´Þº gòëí/UŒFG¨ ÇZ02{ì/Ýid‰+ŸÍO6#S-Má$E›žÚì”kxGÛ8ݭ̃#„K“£ÁÏ0àGaç`"؛XÂr(û²}mYéó{‚‹ŒâÁÓ¡ù nÅ5,ÛÝUœÅϺj=ñÍBü;D?Ï 8:çaB5Ø瀧’ØEˆDŒa`WbHÔÜÁС݅ê&[Òr¬ö[΄6ëÀ/ÅæW¬ºT0§«Rä` +3"6HfÜÍ}^qÌÈÑ°ÞåŠöçC¢‡ŸWNfÇ6ɑ9˜á;e€Ùy;ƒ1K3A– ëf…«91J aÌí¹ªAó/;å¥PvTO퀠Ž°-YkÀ–+W‹ÜEÇàoÃOÂCFñËßYõmÉøëáˆý5| ì"aû©Õ/C<µ®†T±ÔÎpõY¤®‰Ü#ÝXВ€Åêéb]éÄ:YÄGèi§þ%q‡¥RÅÒH ÁÁÅÈ7Ø݉"O±ð Xº4@­ULîJ!6,< Ø?‚É»œxÇÅW—MAÍ+s½·ŽXÛªõ,Äþ¢ž‹š¥…Æbí]‡¤}¹1òRPã·à0P}÷F³z#A'Æ&R`„Ê³üæ£?¬a%*¥5Cý‘“·Ž‰FjV û¶Ùy‘¬ºÄÿ·Í©hú–-FŒÌv´r{G,¦J¾ÀÏýa¾_5#{ +}bM/ÀÙ÷ŸÞ!²ÔVƒöW~¹DÖJ}6á3"Âö]ꩼj…™LþyX¹i"ݘ©@â\EBÉ5oò{Ði¾¢‹\„AÇÔ¨j­7¾áMóTšR_Þ0ȼƒ½òmD8ôXÄÍ`3I2í¬ÂªÑHNÌC‘^ó+B’*`º1W€°^=7íkWõMžþ’®­«|ùKÒÀûì;,)ÒŽ'5ô©Ùææ0öšÔZúB™åôà¡÷,Ï×t‘.³b_€h3þ–t‹Ù» +ülâ¬õ¡Ò‘˜¿„Íg>^ká˜Ëèh‘0àéœÊÅà^°RFZz;&Gñì— %[X ¶›Uë"³ÞÃ} +ÿB~–au/,Jt9°«?‘Dܪ­=F8Š^\¨å“~o÷æ¥Ïeg‰(õ<\LÞ(ÝÙî…Òö+éÐkêïܜÂó,›©éëÖäÅõ'¤…1…é!ý£½{Ö$!™/…‘콄pÇ|Íì3oNÞ~ÐW8q#£¨1^•¨Ñ©Ÿ¥Ì×Ãá4@3_òJY,hSÃêïtò µýƒf쪲êk³(Œ ÝzŽÏÙ°5 ¶_¼qÖ¿#<‹ºÉ|8k†ñoGeJûx€3°(ƒŽ¯`ä~“ÎIjñ8(”*ºØxik—¼„eDF˜–Ÿ ÎÑ8Üç c'é‡ZäZzì5ŒÜaõµ_‘ÙÖÒösŠˆHõ£-ºG|øºp‘.+Û –wSßÆ +Ñ/Êb6Œ(°¹C•Gö@S ¾š–7#ëg}Á ($GžUí^vBLкš· ÊÄ`å8 10 7eõ·È¶gÚ´®&›ôDBÚè#‹{¹%#cau!]6æȒ–i”W„fj|)ވ@Ò~†Íã·ÖI¢€‰½-_ðá)w;´Øsœ¶ÂLWT8=B²`š¶V¥ÔdN¨ däÜ9<âšã[|% ‹F|þ×þ$ëⷋpžàö´&ÇÏß<í¹˜ýè—¿q7aL”>e:w¶†Öæ˹#*'Ìq¬‹k 6waê잳º<Ÿ!ËKígÑ®ƒùŠM¬Ñ2‡ðÅcvÑ¿åϐ±ÑDZR4,•–Á^$/žD2-ÓuòIõÏüüÇ@×%‹·.§GÕqÂ:—ìºnxú$˜âW~Dµ%8heäwUìŒã®ææXÀÙ,T±0Þk¹p"Gsj ŠD¦åYª¾~¥c;å?!kð„'ß4½+ÙʋÊh'䦌~`AÔ¨å +3EÈJ7£Ž@u8Ä „_LxÞ^C™¾»*¹àkœ—«Ã=T+˜`Þi”)ʞ²™úÎP¥¦UD¯¸±®ôÙÎFw‡µ€ $”ˆ—›î¨Ù<ëõ2–z6OW€CëĽAöxb‘9\(sXO→Mהk>Sp¬>Z‹ñJ#""¹ï,!¬¹CíÓ¼íÐQráU'ô…²Ç[°Ëüoі-sxê¦8"ªˆCÉiʨÑ6]áWtGkPKlÈ,Ü ·ä5§ƒnÈ1JuâÚîÿ—~ôéÌïýQˆ!>Ìý>§˜¼lʳ='`¿üïÒEí~Q6p¢êa¿´½[›&–ù]4”姯0µD¶¾y¾XNènxm—˜íŋáŽz;QOòýeûh&Oà×þ»o³8Xö!,ô€Hkä¬EE̖vqD_ÇãýØHÇÜ\°6º=Àraa×xocdðw?ayx´VaZªL„Ðm‰ûG&aÇç®é˜&þà®\ÔËþê81%†=ØNˆl£t´ù{µÞpáO8Ïm¸õlW€U©¿´ú°[(ïwz1SpÎ~@'ƶbJp‹¢BQ¦„jÆAßt嵖DcH­e ‘3}Å00XúcÏ)nJgýÄ2gŸ:.ûѤ‚>awÙò'N«ó$n²`>=袐:£è™á1h·€á豤í¢8 “{ÈÃಠௐÂÛݝ<˜È]1‚>kEf!x +oϒÿ‘â=?„Ë +¥,}'~qüTûCçomn_÷Ñ떖foFZb܏ýÍ¢¡c~ÁèB˜F + ÿ„4lT„¯AµÄ#ÒÒ½Œë°C –îe@_]e¤øý®ZTÝ $Fª$µ;kÑ7]։C ¢ÈA=4TfØmFÈÝðS{Q%•ó.ZہáhŽivþ±tgðJço‘# Qñ®™ ?GbÄ]§JĤ(šÿ¤c¼É¤^©%ú¹@‹W~n‚Óßþ9‚m- á­m9]Þ½°ã¡Î²’ùØѹÞ±P²މ3^¶ˆþã¡§À,áí±úÑ|^Óóْä30=‰5ӞDH?Tÿ\Ô0Ÿô7 )nŽ¡IïN‹öA1 +ðýïi`ÈgZ½ë)ÕF”y1}JËEqŒìµf:- _îÙWñGº…~ŒG¥ïe´ì͂҉P*1}NfÞy¬A5x?m¨€Ùzj°°ïêÁj8 =âB¼ýanºÉ„ÀSRÛ1òzÄ Voþß¡Á:ì[üLiÑeTiÿOq”ßzÿ:Ù°fƒÄÓ|n‹Hæó´<ü“¨=µéXÈRWF ìêòDéhOâîü³¤ŸÿÏt¿ú·¥Òw*ìÔ¢[ê*¼Tӄ¢'ÈÍø#Á9̜’ÒK°»§>ª¼ƒÆ‰ö©¹Çþ§¡@dð$#húôTñi™ù¡±–nеõý*1/÷¬—p»e8¥ä…º °óyU2Ãÿ™'s)Wì€iæø)ÅV€$…2ªûâµ6;g–Z¤ÕÉX+¥`ó„K Æ5(Ç|Ö,0$:Â'æÞ,Y±Dø®fY¿3caÅSÓË<¯à5_3 vWëôñ47ûmÂa_¦v¾¬xh¸ýš„õüüÁ¡(<Ÿèˆ†M:œµÈW°Åø=®Øå(5:;A²:Æ™6ÁM!`žÉ'xñß ·Pá¼DäÃRX ›ŸÈ Pw°1ŠLþ\t¬Ž2юú½ { êº^ðH$É-ZhU"È–§íóˆ3éfRW¤ðâ!~µíÏÒ‚')¼aBP ùz0Mö”òXÈQbä;©z@zkãP«²y™·GnÒ"Bw²t„d)A˽bc²ÑïåÔ¸_Ìmž*X¿aåQZÔY“‡ù¯6 +îu¨L ø¸ÞH'õÌðÒá¡n(3 QIJº0Æ/h96 Lœ&1³’GA_13p‚ÇfˆwËEÛïQpºàÕâúFl@©äˆ‘WÐ<;xvÅC(^ÿ@ ؆bŠàVÑZDI2m‡Û<¨Šs€]ÆÑN ê¸RÊÄ{™8+¦•ŒÉ01+A%×Ù¿ÊÐ#&¯ +Ðõ÷½R} m±Ë$“d´(¹0¯Ï äeڈqfÆ Y'kx±Žø;)V€ý¤â°Ç´ ñÂR£cåÇD(È¢ +é© ‡[Íxg,tؕ`œÂH†’ e„ëAä‚9îüȏv'§àЖ <¸[? vš•'‘Cñ€=mM¾äÊesÖbÝì…ƃ²1ƒbÜõ•b{XþFDò§)݅z˜æ]÷™±[8²AKë‹ÄÞó=ç–däoSjPóêœi^HgÞÒ~)€ܟn|]mÔ¤œö'UÑqwQ8u¡fO‘Ó[Ú'q`F$;ö¥ÎÉ°<ååD§Žß¸¤ž23„PQ “o-ȧ'‘T3îi”§jøŠT­–èaàJ½Ý`88Ó0`à½lah\a§Å¨O›dº2”Êؔý>ÓüŒª²¹K“tÜÓa—{ŸÚ{° +݈ŸëG7oÈ<æØŒtø\:ïä³ÿó›¥=òÚL5ÅIVåMó1KËKþ#,w ٗw5W{Û+ÿ[À»2ꇜD<`bÈ=n¥õú‹"–Ó ÉTHFˆԎ«•›å¤c≾@`IPgeX‰„,ãw±æXïÅåPæ¥{Úhžƒ<²@Ï~ÊAÄǼSÚ5ù‘Mæc}'˸i[þØ|7¼RÆ[cù“’8ª¨®_ŸGJ§½%®4J€Ô&3ýú:ý5:ëåôÝG‰œƒmd.˜D§/«ÍŽ2Ò±x²Í nR$™@o”ÔW#»ÕûTâOµÉÒéthmrÅ (€òAª1(y“­Å»¥Íâ%4 ‡·bpÔ.IQÕ·ä‡DhÃåÁ羏´³z!©j–De¢W²nÇ9&WI?˜)i'µ@”‘É“¬³°ÐÏvÕ$ó® {ôŽo]æyQ¢²Gz% ;2ØʈŒUMÖ)Úþý#>Çȋ¼2ür+Ëõö~/z­ä¶*“O‘c§=˜/GU«1å7ý¸¸D*æjŒH4Y}»žìˆL¢ª¸2C䙌!'S²‰)9º +)BvÈ\b2loLÛ o©¤$ r0äYù½"@ O¬òÓ{ "d$Zr þ#À'0¬©­Àm™íTʺìÇ7 +&bNùÑHRRï# +ãåSÍÇڠމfÀ€‹÷מ“MšJZJ¤4¨‚ŸBúæhqêÑ{XP…DüÈ8ˆ‰Ô£b$‚n'G€lbAõšò˜DvcRSÈC¹+ÇÌÞßvåÆðæ1oã³ è8 m3»„íNèk”š†›s,¥«±x`ÌLüÒú4j{x]w¢Ú~Ýx$vÀ€ñ@ÊÀ¼ŸA¬ŒAVªÉؕ6‘QÎáïcÜIBº×$ä³÷'Ž‰QB‹hºÒÃŒn‚»…Q±wbz0҅cš‰$¨:0êu|þ¢ð¦7/‰ÒÛ]JVî^¼ôŒüÉ%‚gkZÅ0xØN‰ŽóÂ8Çå!Gâ8±¦þ,‚bÁgy¬Òl-«üêc”ÞŠ7D“曛°°º©^‘®—ˆ?[4D›ŠUŒ˜óÒrLã°rr­Ê<åæP$tíx‚âo…›äŸh¼1.•DʇŸ©#Æ·Ö4¼‰AhƒŽ5‘¹.º4íáLÜ;&c"…}KDügƒž¥šo‰óþ cŽ<ƒ endstream endobj 98 0 obj <>stream +H‰ìWKŽ%¹ Ü×)ò•­õÛN0+Ã0¼ð +¶˜êÆ}ÀŒ*_¾ª¾ªOJ‰"ƒAêË_¿_þò5¿üúõxIÿ©¿¿|ùíïéø÷þXj>ëœG[í,óøÏ?_þõòå«Ï¿ý8òqüxûãÅʹò8l¦sör”rö1Ž×rÎjúàOß*6˜–ϹŽ×Ç~ÿ8þ¸Ž~úŸ¾/P>ÆòË̇µ3çՎ·ï\‰¿åÌÝ·I§ŸXÏÒæñšÏÖV€·?¿¥ _ë™ý´øH a‘†¾¶øÚøĬøOûòµ<+`Úߤ½ÏH“¦ÅзÒÆsˆa7¸_±@élû±'0©ñž¾[¯y3 ˆ7Å!{Vçï·ao†¿=ùvž¥Îߎ9íá[?+õÃϐ{ v-ºcŒ@îín¬G6ï±Ç²…ƒqtV˜D˲ïÏýº¶ò•ÙW^Ø?h G»ùØ fœßaÁR´Fç}M±]g¬¢¯W{̒ç҄¡)ó¸A¶Ï³–¦ˆPå€~!z`Íyͺ•[r¡‡€ +HLJ° kOž^{ †¹Cºp³Â} {t¿‡ùÍióŽB4¯Ã¼˜õ8,¢<ø}›s»îíåÛr8'R*õhÖϖïäpǔ5jsÃ,F.ɗ½é¦ +(rªBHø¿âì—|ß0ùðîŸ15ç@’Ÿkå@ù4çƒ3ÀU`ó\ÈàiÿÀuÛë€or.®SßF`ožìlÌÍç­F +8S‰Þqg÷ û¸â°µæ5NYª§ÑݝWhS¨Â Ã*WJÚxð‚Ímw5™0('‹ñv©_gà7óAÒ"ç¼ÁÛ¾Bà÷OAm.Ï˃ßl8ÁR¹«)4Þ䗎›e· ×àÔùfk¢VQvšòb +õ^°U ežÇaÏ:}“í/#¯Ý™·)Êê!·i³ sšOÁÈQ&S ‘%U +•ÝbO]}€iŒ çʙ”ÑxµšIÍ©‚Aaùz̋I9™V= VŽÇe`¢%ä7êؾ/‹qæQXeºùrøëG~‚ÚØÒLó1(¶u9k!Kp¸“AÄ[dégåGø}äãî㏕ ¹3ª³–ɾæ½ÊzÑñd÷éNÓ@/Ø †§¤[‹¥"o@¾JQ%HÞ>¯1ü‰e@™öØÀ_Õ°3bæ ]·8äÙûáà=VR¥WåîH­êLç&ücœF ùÙ3ÚÈê”Uü&çéWM2v®0 IïÂé™ã;ÏcZÙr ÑE/†n$åx# ˜„Q"Ù7w¿ÅHBPŽw—ÖABÏ^qÁk +:7¯‰¥phZeuô“´OW;Ð:‹Ck˜Ïä­¡FÏïÌ|ºB[f“òýþJ>÷È7gPvÓï6|Ãòbíy×wîõõª!ºýд¾†¢<6'âÞ:{ÏnÃâÓ»á¸ìïÓ¥4¡¸ydýY•Ê« R†²Aјä°)çB_ +iZ´ +­FŽ †"4F´«ŒÓ¬˜_×uåHÈ£@уúh¬nÐft$š¤8Ö&Àé–Û†N>µXÈÜKÏ › ¨†¹±h'é‚ š6ÙÁóZKŠ’$*ˆþ“ö²#Ñd•9{•Õn¢*•™û5Ï]à ²î5­oˆ°ª{ÌFF Óψ| +¹A±€«fW6v²ˆãû‹ZÃÂßdÎ1Fÿ¬$2ϱƚîË9”íÔÑt4â}íŸ)ê×ÙòoÀÄ,ÒÙ¡ûì§7Çè1üÆø§ˆþï7&Xóbâhux¿·n9ýŠ6º {ÈÎ¥}Ôù©†L_£×éW˲d¿}`¢-ﯼd:ƒýý©pç>X0ÔÑ$D¾ ÜʸþŽCø©ÙF%T£ øÖ +{ä.Nö4ÙGßäTY'èƾqO +¶h^Øy¿ã®eO´*;bUçµ,ü‚Š®eÎo§´>÷ù½/˜ŠŸâÄæ½í#}q‹lA•‰p¯®^ồ˜Œz1 >æòR‘ýy¹ìè&š›U]@š_öIλ5±Œo$;\j(>Ã֞Cëo0ýÎìö_š_éÏwè¹-¾»f¡² ty(k òB”ѐ2kz£Í:â.¾íhd«'ÑwÀÊ&ð‡ö/!ÁºÐ˜­ìZu›f¡~Ô**eÏ¡02$lÞ0Öc#èµƞ)ź°w7Ó]³·˜ñ㍫,É]rïä»kûËUe_¸³C}ß¿ðnjêËIŸÃêRÑ>„µ É.RÀp}ÝXàåvì)c©B#A{J¶]¤Ã”û&ï/®Æ`‚MuWÆÕ{:‰,ˆ‡®*v1;|9`1cJߢr£©%\9¼%½¼“ÕRO37%‹PƛŽ\ rkş¦ç(_ÜCT¿æôˆcï` ¥B>P¢ÝW¬Ðcn@g2К Ÿ9݊ÏüÔɚ7âxÎTï´Æ¸Å.a/œU¶Z«DŸ;éÙmI ³b<¥ Õƅ2ût.j^ÆnA£OØïO>Æòp¹)Kµúú ïå•mé3ò“†ÝÖ^'†Œß0 r”À¡è*¦­ mKù1—é (¥Y@ȝ™3Fo-ª¯0ïîžÞHf™°ÐP¯L +ôRÙ]_=ŒBv¨E[ÿe¿Ê‘츕 ÏSÌÈhìÀy&!ƒttãçR@÷{C†Œ¯9óƒFw¡–¬,‹„Þ1Éÿµ·³«0ƹCuEã[Õ¯ ™ÍfNw8ö`;’{e’á°FhCÓÀR6'Õñ¢ŒÒ£àR¬Gfsë·J´0bÐHÈÞ¦´I)V};^Ãà3Ú·ÑŹ‚*¯X£´’<"ڕ݀IXx©Jip:+7ü$Á9@?í*–¿ÖÏcl¤pT?Û]¬ô =>?^¼ûÕÈ31ՒLkéë-%Pë¸õ`‡è¦µQbýù ^›-PE°Ø¬Ò¢ HcžPa§ÕÓÕÏoö‡E¾mf>·EEÒHɵ½\Yj¹Ùnö¹˜ ‹:.Eœm @½:çFõ «ßNӒº$=È짝#+ùrâ+—ÛtÓ}EûÒ®umx)÷GýRŽ,äĪÿõ­sߪÈvέµOÔêc®DÏ…"÷;SÍ2wq\jR»pAçzˆ`(ç rJª’š7böõ<ï'%ÀüŠ¦¦¯ÿüÖQ|g1 ŒïúS—í`æôl:x >ˆ¼Rdô'Ü8Ø+è•ZY’Øs%ä¹2•ˆdq¼Ð8ÅÄDÏS]é~4y¶Ü/½Ìü„m”mBâĶ `ÃYw‚ûZ×½|ïzmB†^Œ™5¿Ö]íËM~¨åä¢;—Îi„Äu@Òg2=L°Ëºc˜Ö¥w”ȳͳ‹#íüœÆ—fwuEçK¢Üf•°2; ŽlÜ=—°÷±pé!–G!;/µ‰Ò´TË]ÅÜú¦24 i-¹–Ú`ŽïêsçôG&¨EVOHÞê9¿„t.±t÷g„ˆâ5špÛ Ì¡|ªaê놷‡‡–dâÎç ºB9pû3yÌzñ®K¹›ÐÈ1År†›däúüøëî^ ¸î@@Î? S“&JÈ9¢…˜ô¢›nˆjD³÷?zUŒÎá ýr<~ÿ#£IÓzåñvÃÏoûã±}›ªÃ¯–󲏉©³Í¸55Ù®¶‘u=ŸšoH­±î\K–™ì§Ij•kvÐ>÷Ž‰Œ/H{ z½”ËI•DüŠ²ÀR£ÂHE©P³_*ÎàN+$BSÉwß!Ì®ìn}Ç[¤«ß”ò@CþŠç";å1¯¨ÊDôÈö\ƒö.µüÁïb¬xø þ j› w-4“E +|¡¶2¦'( +.Þ_3ÓøØÎ 3”¶÷Pû«îSWè—`é"…f†Ìuí÷òXbME|íCÁu jҜ—Tœ’¥“’f9g²ôæ4Ï´8¢åeŠq‹Ò ”Ý9æu[fd–èÇ÷ãà1ì Á¶VNÿ•Íß.›t1ÿ!„ÙkW­ã™ä³ê^{åñÑäkò ´ØN8̪i$º….úåí'¡9®ö†ö'v3|¢ë¬ØÛ +GÌHéœ æ:€CD*eÃãÄT5ý¤zºî§L¬6eF+8&/|eÇ ª§dõZ¢ÚÚjWM/óËò“ôR)ñÆÓ¹?œŽü…ˆ}Xz‚¹ÞáÐPw‚Ø¿L0?u4&äNºÞôRiJé!±XRâ”Y7üNÑ1÷!ƒà”îæ_L<Âd›ç}Ä)clxí3G>å4M)^"{Ç2}qŽšþŠ $0Gå@t—O؁Ÿv µ .Ù¢«Æ\›çÙõÇ÷ÁmÕ{ôÚ@@ÕÔÆLèO¿"M4(Ò«àÇ@n½ê†RëÜgø!.™ÏÃ2ɵ^ÏëÉ  ¨€W¹Â M *~mòF?ʎ"õÙ ©äf«¦ûŠQï¶1OïJÓVK-g‹^"ø0?Q“¨Ù¸IŊž<0EPó ë䲡¯ÑÄ4Ï *’¬U¾qšž;«~F’9ݙgo\tílM€Cn¢É7šë‰êˆ +|¥õH³Þ-Ù´:#ú×åïL?-Ñ\ì+„´nUÆ%ræ–ΊƒN®9cX`ªÄÜÃC39Ùm‡rìw­@?ʚŸàëô Kð? V,èÕw=Çkª3YÆÆ­›Ï<=¦õk=vWycÇgòRgM'¤Jú·?Q½¶G×ív;‡Eí¶uÉ)@øSqvÓæ9æLd–Š" sUµÓÁ§ºjfÖÙ¦ZìFþ5H©9;ß #Boè;ÿõ?KԢЁ›ˆzAa>üŠLQ©ð/H¡SØqdõúÚ+—ê)aËt@tFÂi]Ջ‘Œšj¨rÒDÏëzn{ÍtêeÂí UðŒ%Ê*Û)R)K•Œl{tmªQ­!ÔbQ¢ñÃU†Ó[É·TSA\ã tå˜hÆ;VëSΤÌe}/™#ǐ*n¨dl4᥺Ì;‡Þ4TĜ•Š¨Pê½è̪&;ç+€uc¯Ezd)ÓMSTG9€êXIo,"ëá›k÷@z“h2k¼#†$-Á:_a±%ÕèºÑ¡xF¦¸ð,úu€¸tƒ˜¸ž›Ô–pzê1µ0î_p³Â<ÈɪfãxñèZxüôèóÛLê.{7‰§öɃêŒg3 ï“W~¾—èóÛýÕØ ‹tòÅ^^ðNˆ‰^­èÉÔ/ aæfæV Ö¼¥ +vØg ÌÇ×Ù+ⳬ®—àq:Œ¤Ü,w 1r‡-gSÄ¿mÓc‘¬ñ{mµ‘EhU,£±vQ¤f¥lÕ§ú½D——î¹øЅ¶æ¹ >ʧ^3;¹½¥'¸¶¥Ñã7àç<êºc^:U¬RºÛM©›ËÁq7,íãåÞï¾HB©hn•µ÷ÒܲÝÈX¬]³±VË<[pcWoNà0ãÿIæ٠ü÷kÃÓê†ê. +ÔPKxs¤‘B‰í´>vTáz¥€ÿ/GI5Å©Gò˜?+g0B;oøó5´}wû-¸Ñö³‡'=ïLtC¾L Þ!(`)Amù–ä®@äíàí%ˆ-;ðöÙo'wÖ'~Jψ ¼«ï\{ßU>7€Í0Ύ!?‡­îo³­{gí5ÒÏB²ª‡\QzM:UËu?¿“qÀ÷ær¶Â97…®!yÿ5…b“¡Ð“yô&Í%YqS(ð\ãìNhœ“™ênL"¼O’$ï÷šBï¯ÆnX'ö¾RèZH¤–nÊyëÄOÙx9JJᙠÆ·˜g q,B±Lʌ%;e]ÓÀDe6‰uŠh´‹Õóï¯uC…ø(’BI™*eídCãc3_)ÑHß¹îåŸoyŽ‹BÍÑðÿsj’¦ n²Y›œŒþ-ìôO„b^à‹Þ!Ù t)…§?UšX†ôç䕗`Éý åô^°n”–l¥÷Ã@¼…)¿(<­ò×s…ôšÙò?±•¾A\IfdI±R¾ v+°†§Ÿ¡²I²0†Zò,ÉæήYôòÝû†¨žçÃzz¼‰USŸ°^cÛp©u‡ul9#,¸ïuÝË÷‚jYH<…ä·êÛ ;9nð.^¥MÖ÷ÆZ7Hµ:A²9ªÊSӀW£«…|Êg¼j ]F "öʬB#\ÜSÖ./Þ"IK}J#1Š›YÒ|x¥j¥ÔH68)ö Þр˜8y ºåZ4k6윫è[É֋Ñä Àù²f+1Xi@;’$ k˜oïp¬×,ãäu7¾–-ðFzn‹{‚ +Æ6TçÕ½†reYt5ýÔP…-.‘ú8»v#½>òÇÓÅ.ن’ɨW¨6rÚXUhð.¶9“²Œk'9>þàãìW͎¹ ¼û)æÆÐ/%=±ÀìKÞÿVÕ­þf6ñA¾Ì¨>©%Š"‹E|î8û[GVlðí‹Ãk5Ù]¦]_Þ;sõþ¡¸¿Žaؽ5з/ÇÁœ¾ÍâÇO³Ÿ…·wGÛw>»YF¬*oS ³¦×hØçäã“̺å.Í,<PŽÑÒ`† +¨Kác%H‹P>[ PÐ T‹sA?ÈyÆTOì˜il€"\ó5‡ S¡´ýę᧨l÷qé¾ò†S¼à´ÃoȽ£×@JÕé=Õnï²B3N-²¨d;ÐÌ]ùJ Q¯VþˆËn5cý+ö‡n­ÔøZï,ÌðÀ9z¶½þ:?0(±Ü8í|,j'« +ÂYkÞpC´:‚îeñ‘ÆÝb†èŸØ¹•Jfš'¤üª÷¬ŒØ_në^£{U/®Á·Ÿ)nk8ÝÆcià¯eJýŞèì%ròrzùré€Å‡guWÁ’±‰ZUŒÕeÂY@Í’!ë«»7ØZÿ:ÓÝ/ø}ÃDKßõ +݉2ó!W6®Ù ©çóÐØÃû|5ƒ£µ]ÔoF® |Û']Íèk紜öœ|è1ó—}Ö§ÊGiÁÒ;©N.àö¡˜sã*_¤í9XÏ2ÑUs‹çʏ¯‚Å»b{éêáC𩠛Á)œ¯q¨F…`îન3Å`L]ôø+¬ +LBE ¢ÂÌBƒ*ËN²º‘Jg×,L|±`”x™-kÌùÊoOõP®·ÂS¢$休*¾NéA‹¦P³<ÜøJ9'rãgDRJŒ-:ʽàNÜrtä~‰ôŠ¶43VÁ¼Í$’.„œNªÆXéW´`8×T÷æ$ŠÊC½*§Â\wpع½fpÎÍ«™ík¼=2ÞSó3Tûægÿxü2<‚‡ä€ó&Ð*¶¡ß&w7£Ýó.ò<¾¾qãkž¿@gœÀÂóào_ ö‚m 6x^áۓ—²9/­þ’QÚj•\Ã.5V(t… +‹âÓÏ-|ã ð«bbÌEë ·:k +’ax:!’9#{5ŽB8ç”ù«d5T¦L¼$¨—Ü7Dё òߪøÀ)«/k‚Ï Ւժ<Ø楃;¶ˆÓn”¶züL›çâG$ÖÖßä÷‹“_1_Õ +sÊÌ/°Ÿ¤"hB;¶h^]XyÖºøÎ3 ÚVòŽ%DfOT9(æy¢w5¸Súû6Eµ›š(?À6Ç=7Ê=žºu”²Vk{N\®o¿é66à[(ê8·™ùS‚èþú-”ýST@Pï¢_ôÞûYšLz@IÞGÝr,}Àò²ßøï‹}7ȞÏûÂ4gû"MÎIϪL£ž]d–óEs¸Î ä^Kµ¶ÇJ1ö…éhý«V>ÀÌ}A<*šÊ(7;ÁŽ™ÆàÁš¯¹D’ƒØMƒH¦¿Eƒ¹· +UÒH)ŸáŽ_DNd-T¤vmâTÁÜ_ˆTÌt­EÅ/ä²Üב½™íµoœöG)š¯Ž¼w-šù°R‡3 +ϜÓv‘D#‹ä0Y½×^í¯05k:â÷™ÛA#~ʐÌá‘Ub*…¼!lžy¼×Ä-›ç¿ˆE_ˆ·L÷l\Dºû¼£ŠŽÅ¢Ëß=+™†^†¸- ´!¯·¤=…%$x#hÄü=iîê1YÆtdª¼J"—nÜW“óE;Ñäí{.EDp¨”sWQ2Ç¡Š/:jR¥uíjlNˆÜ?LЊÛDíð¼ÄKòOäxRQ³Ÿ|$iÈcÔ¤¸1vã()³Ù+kˆü.U4€ö̐ZÐ#{ŒÀ¢NjÏÌׄ‰b¯äÏ ¬œA9Jìè +ÏÜãÑ¢‡c¯W¹ýð/ÜË«½‰4ƁE!‰ÊNÏUSEóé7—Yüâ¬eà;W&ÔºžxÝYcL+{ä×ã)t’±D cãDTh”BIk›3At`f“Uå0,‡¾CÍäÅÄnO€‹¿&¯k¶­juÃ(µìÎ>k¨$¬~5¿ôSÒ¶‰Îðn…’/éؽgAëX™C–z¸&Äbwxo¼ ÝÆOVŸÇèjœªè|à<çõl-ªAƒ:ú†M"¨0lš4ÐvJ•»¢oëÔ:Ne¸bhã…î%½,#¸§t&D•€È‰ ç +¥ÚEâ¡5ÿÉ~•$DZ+±½O¡ HÁ)9œçmíûoHÖÐê_^8Š×›««8$ÀÔc¢ÈcÍz5i³†Àwm8íé–aºGãâbè¿.Tdx¹BnÇgü…%x¯…i¬PÓ´ hü´?—'Ä­´mó[,bÿr¯î±Í©Ù¼ppÄÉê-à†AŒºÁÕéôȤP ä½Å}„kñ +¿£ýäA½ ڟГwýó­Ï9$ +2<¾ ˆzŸæL$\ïjM“Í4ϐr³ŒYJaÝ+ßÀ¾(À¶idefxvÆÞQìÞ«ŒÿT÷مRtè`½5ÕÕÙTUž#ÓaåFß,ÀñRmê`xÙöʕaùpiÏü%ÜX÷‡bô¥À°ÐP]ç¹1z²ñ\¸2}Jcxµ9 F—­u±÷±7V÷ƒÓÜû7…|- ´›²öâ$Q « ˆîd3ÐÑœÚoûµÆ{5ƊQîë k QP~ÎÁ¾`> dЦ\9ˆ+ü‰|б¸x”ŸÁYŒµNYU Q$3…šhÿlí?(>å˜õå¥?L›¸¨Huå„ÂËû›I%C¢ÃÁÙõD²U£óó0‰[È|í=Ó ^ÌáŠi‘vP÷…®‚+€y÷ÛcæbÀÁ¤I@E»-PY̑ô‚©Òéº<Õùîx/ËJ´‡|ƒ…³-©A¤4Oø~$¥PõÊ%Én +7ã»g˦yåízďe1|è­"õxO¸è.2…íÑËZt±¸ï€sʂӧ#3ù—2«÷Æ1ɺf w€éTŽuW(~B"AíŠ5qÊ>蚰Ž©®ÀF˜ó†’ ¶Ï¿2oåŸÝY÷çÒ9|tf££ +tú¯‡˜ùß 13CjÚóÖÿs·|ß[WçEº9 zBbÐx­F¶âöþð sÍ"•K?“I—)±V®ß’†üB˜ÃI˜`ͦÿvžûP¥)Œe|=°¬ÿÓnQ~@,ö^6àæqøÇ\š¬,*2ëÎoòòéнJÑ˾M’°3IØߐ$ì–$쉴儖“Û×,îý°I)b¦œmKQߖ Nm›[¤Ì„”,‹À§–ÚÈöiÒeF8mŠôdôèÐÃ×¼¡¯gȱ¤y¶üÐ¥/·üœ ±d~ÑÏÙRª½hôi”›—t}±èñ\ +O¾Ñq|í^{ú^cÚ5ãe  °.:>Î9* ½R]Gc×@Ó^ܕ3V•“h$£i$W¼žYT"̈ Ò—¾$±Teafcø‹öÝéuÐj`±ªÀì¨ô^=‰e»¦Ø_YRŒ½B¢EÇlb;ÅO֖mÀèƒëá\aó¤+H‹õŒ8†óBÎ}—/ $6ë+œƒóBp]ŽñS‰—ÆÂ@ כ„“#@YÑâù— G9Ö:An-V¡âoüúŒˆE&3NÍ¥q’kà¬L•~˜¶ôy÷×Fq¶þæɸ„MÈÖàôÕ¢ [î0høÔèX|H[1ç+ôš¬½Jßk¥k8ËÂÌzC|JSN.!¬4•¶"À`æ[JŒ³…‘Kc_­íJ]X&™@v½ÂÂٖ¦ \¨àûQ¸ƒ»*Wv-ˆ›€äìY"}”·ë ®Šî¾ÙÏ÷KÊ×Û¼*߆sÎӓ£†}ËùP>Ù|!oh®ÖöX—E¸)ÂÇ̤僀ë~wÖ1ÓØÒXó1—¨»(Å~*#®å·”±6l/>½øt+‹8Ù_|ú]>µæ·íSàÓÌõÆ'-EèÝK«õm½Ê‡:48Æ1//¥3^D3ùþ°…Uìtc)Ú±\W¯¦"í¦J‡³G!´óÔPF¼ú׆âÄ»¬­›ÏEKPê +À2÷œjDw&÷â{x.ù_{cJy3*«pütï(HËڟ7Äh7^4j­:O)ÍLS®žêc+€¼µ,7æ´EêöÉ>Þíü°iÿ’Åà{Y{ب×GJ +_<9ûÈܜÃn7XYW=A‘,±¦SɸŒXcù*Ä-›—Ñ%µµkˆ ×éïFR\•Ü¶AX× 6E!˜2ð˜`ȎJ8*JùGÀ¯Ä=îa]{¾MÜkgÜkCÜk·¸×žÅ=› &gœ /ºŠM· EWºÂõ‰® J§ÈeÁµm̃‰w´Ÿ„#hBOÞQ„˜ ´Ùï’ãÅ枣Ÿå%mVќIÔ&{(c‚%Q<›Ê^µ[XKEÕQeV߀Ùض§g‡Ü›¿3·ïSÈv²ý …l·B¶§g<¼!µÁ®éZX¯ÊZ ¬”vTON\ޖÿÈ´ÃTDg¥‘¨N îpû¤¦Èãz-¸ÀÎ~[ Í¥†ú:߇Gе2}Jãú1’, P£Öûíø9¸àw<›ÜjLçã­FÈג@¼Ù!ýPM§IÖ"EÜéf ¤%8óNÛ>F­ñ^±bTzaõqm%ƕÞkJV;.,(—ýAò¶Î5âß}¯ü>X̟´¤'ÆXn +ÂÑ䋘£œw4éEœ²"8àá‡í_X8 y~·œB2½‚ÊŸ *Ã;ßôÙWPùÍ 2ýÉ¥„ª~Œ7Ée'@ÿÅñô ê$žNÒª +©Ÿ5Äٔª#DUv, ·¹Ç(A<äìä^J¬6ü‹ƒIԗgFƒx¡‚öx‹—J¼òõ#AÈ  ‡-uÔ÷Láû+ Bε:µ,þ&çÉ© »ë÷¿f8q3åÒBà—m¾ýINkô·„ +–Ù72ÅÆÈ_^ÕðÁÃNaï¨Nsj*‘d¸l„w?¹ÝÞ7àªd’ÓÖ±ú\P=§®æ‡Ùòr=íÞ@“N\T®ÍD½¿ !èÜcÂwÇeù䊘þˆýQò*Ÿ±_ÕXRpY‹4_jÀ=yÄÇã~ØÙ>c)ïùüñõÀ2N[¡Já-ö^6àæÁÇc.ÍI)±¼}šã‘tP´–íe%ÿŒ•4˜/¨<ÿ?еý`Ã!!!d +Ùî ôîqh»SØ"c&ôŠ†MO­ÅO5†“iâ$+Œ :é<û´p5oèëjWižz_×ú-½7çûª¤{§µÙÇâ €ö®È%ìfÎÓ€®?µ©u=A«•ë£7h~qÛEæ'p–¥-ìá§-,'á*_»ÚW«?έ{¦.ÖÎ.ªƒî)CK®Ò‘˃ PÁ{=æ +ûdü*@Ø7e±¾ø†^èÑõNÇ$‘ÐCÀiÿ(…<Ø »½Ëý:rl‰”NLQßâ"QSÉ«­ãiuïwYd´e‚™ÛÅz" Ñ[ÉË,ԇž$ô86%ªØ¥ç1Ý,m™ÝÁãD¥·7é9ˆKÙdcÇøìW9r%7ËçºÀwq_Î3åLJ|ÿÀÀ#›ÝR¹Ø“FcåD|é&³ROÌÖH¦oQ„š<~ÌMç³ZZd#¯Q\Aé&ÿŽU@Ücû/] +>cuàÖê!¦Uy)«sªž-ˆK)¨Ç` ´Cß ŒèZM?¢Û½«øÒg,•ö¾¦?`5ä°!ÂO¼§'ò',"½æïÕ+g7‹p…mõ³§$cºÆµ_¡Z‰TTj OI2[¸g6K¾{_”Hn +sÈödU1=$ÇEõîv..†:¸$‘æȧœRóQp€Ãzi—NîU ¡G{;±u‡U<þEO*Àåxñ’že?Å½Ÿ…;ÛR^/éß|ë͵»gVOë%Ôÿ‰XN!–÷Ø?"–§Qöé[ýã²(†Hñâùv‹É¿s|¤ÌF\Œé?n¿t»[~aNâauÔÖÚÆí‡âó}—q½~áB)qþ’ŒÎ`‹ç +ä}nA3®-ê ÷CàèWrEK*³42"ƒ\ŽªT¯@„ÒF!XzA¥LœQ(¼”UŸ òƖÛú~ƹ0 H2ÈؑÎQ•ðWŠÜäH/èP"’(ëÅH×Cw”ùùñƒB³òw:ˉºN(ñû™ÞÈÚq†(yh[|'ÆÁr‡åµ/gªÓ‰y5ð¸#û3wY££Uq¼$Õbo“„7††ND®¢tìãlFZpΎÖÇÇ@Յ†XÂ…j⚘äH2\«pÔ/ΕÄí?‡²XF·ÁRÑ"qkƒ… ‹Ëa–¶ÄDúMW€«æ3wrÓHbþ%›ƒåùÚùü¼Ê¼¦Ë 9âõ ‰£;d¥\–ಓ â¤á *#OÞ9:¯?ÜÓXcJxéb¥‡µc^@ÝK=¾U›wç¿#tôî"sÜPʾa" ת9ë>Um.õô7×é@®Cfc:"â¹ÁºÙGl³­Ð³Rí0ÈúŽÎ¨ýä‚êpOIù¾,ål> ×k‹Ê €úXÏúÑ,ê/}Ɩ}ÊÑÊ`Ý`µ4/¿û ï钁Ÿpt¢\ó÷ꎕµ‹Å)¥!Ô«Ÿ=-ÀÃÃÐì±0¨“ih"M—ºÃӵĜ­Ú¤°˜­ôGsŒL.<î\S@¥LÊ±Dí°[@Ð$×>Äéã°¬Bê@ +pX/íò‘gýX‘ªÛ}® +È¿(À¢W&gúÂÝâ%=µVmțjQÀÓ±=!åvŸ{T›Xo®Ý}Îìjá†}“©§A)¦¤–ȍìj;pJ‘’qezõLñÆV¥˜Zd€²˜T6±qÖaš´QŞÌÓ»SéÀ§C[o%1efÚõÎíµ0–‹ä¡Ÿ?nö h?~J¾ábü.ùÿ²äK5ªMé»äÿŒ/ÝVŒý»äŸS¡ìòø{ÓÊ8/fÁ¡QÉèç>~Ÿs_ŒÂ&ô'ûՒ\GŽÄös +]@ +þ?çqLÄ,ìMß1 Éb½'ELOÛí¶C©ðXŸd2 X5J'Š¥©ô*ËQ” ¬YCÄá;â+ÏÕ6´^Çþqeä×òv¸pmߞ2ãùeÞ6´H¬]‹Ù$žw6~+ožøPâLmÁL.hðN]*¬»{\_3áË\w¨C¶ï/¸__WŠš!}}¾þgŠ`‚<#e|§…=(›ÿ¢"!ÙÑ|ÕÜ¥Ïb)ÎG*Â`†×Š×§Ä*Æ…¸²Ic”Üô¹…£rJ !÷Höf„SÁ¬/"sì9ir嘊 "=Ä­°8P¾–¨³ííÈ®,¨tCVFŽÄš_¡¨–±ÄY@8¼½Íâ×ÑK]V1 þøÉÂËÍtÊ̌ȇ”³)7¶Z«Êâ2EG†ŸH³ML¡‚}Owתû¦íÐîî`"RŠ£Ž>N}lësGëN ã;ZŸÐwô*ßuÀÚÀ8  Ê&z¦âTåz­Uqûàéx»‰rÝWY0’%0d“FjVQζN6Õ Ã"á½ÉÔ¦ñÚ/4üË5üË?aø—Ûð/兩ÛñÓ|ŸÃÿž“ûcvëÖß©=Ҍë`#çô:W#ƒ%ÎCl+ZϦ”6ÛJÅNÌPhÄMŽ³Š÷䑼píÉ}šAsd{Ù­k/˜«ž#u½¬bÜÕlÕ¢ hL7ÙÊ-֋ÂsœÔ*¶Ö5Šg!Ä9Ù;Æ®GêUaµ]Z½‚:|¯ËMeY´2ýÙåß¡Ë«m&ÙXͳüÿBvŒCȦ«ÉgŒ‡E Yµ«GKY×Ky:¼Ô^/é ^âp‰?—C3ì[‰RÌ_µ½%LÆOøÑ$Ð26…LÛÍàö; ˆÝKGjå§S¬(YQ…¾–è:‚vj)…δ›þƒ– SþÉÉ·…7+P«L=ë|V§({AiK}ëL,¦]0VJ[5sj&k¬å6ÔÄM˜ڵþª:xÕq# Ì³¢¦?…¾Wíýeè(D¤Þ¤ø¹fwZr¨?)ÄÛù‚Š‡Š‹q!Ѫ¾ÂUOœË¿[ŸN²[…É“ ¹Õ‡“”lϕ- åC~Y!#vž$גW:c°œe?+eF'Û!Ë|¨®{e{VYOþHŠbëL ³*ã媴·Äœ»­rį@XK æy”áPda‡…j`a8Ò!€¹’_{ÿJ1;Ó&&êUžÓ‘¦báj³âÈç‹È[ò•4;ÓÖVü ¿hàüX~$Cã5Á¹Íø[:žv­ý4ÇÓ;¸.~j¡§…• ø©Z[œüâD¦íIӕŠ‚EÒ|n‡<¨$ ŒX՗úÅúU#$=ãÄáüuÝþ«ÍY‡ “åïÛ æ Ke\÷ï¯;^αí|4Ú¥úÞÓܼ˜Ê× ¡ÆŠÔpÜ1Ì\FËççPøû†Bþ;†ÂèƏ¦AX¹§y +ª¾EÑ'R© =(§zVý1eY@êk¢á)§f·ô(m5݂P‘ëk&+G~@nCè,f¼ÁJ9²Ûɤé.d2,‘”ÎÚ©¿e±}Y@ŒÉ‚z&"ãŸÚKü^=ñ?·Äüa¯-m)M¶Dk[y~U‹HzÒí2zÀVUu좻#Ëw®·þŠ‹Úò•ÑÏYUl+³s¤âé;Ü(| *}Þ|ÍŸTwÜÂ/ã„ÎɅj%Ð&:ÀvšäÖzº®‡4yfwëõ\ê̌žé|¦¶¾Š£ìµe®¢žÓ³í±XF8)#YIüño¬&ûnaµ?t#&< µgpT 6ø‚{ÇØ8©Æõè‰ Óþ’¬çÛõv ¾~}ۗWdþð96{m èˆ\>kR5ÖAÉõáìmë Äñ ”ì&®e§¾žt׬H¡“€ D#O=±>%ôà×5x2æ%í ,z×l¼öºcI¹ø&A }§·ø3q% ªáÙoYÒњ¤â“y1c£ø°¨K–#—±›ýTã%߬öÊBaé¶÷˜2†þ6pº¨#Ž[¦‘ +il6θ:4(è@_Éê›"îh­¨íËB’zÒ9ÍmD(þà¦A ŠÁo E +ƒWQh ÛXG + „2ȕ}QŒFf–}2†’¯%ŽÌ'rç[MMTRàhiñûäI|ø¦’Ò‹ïE€ +G„~¥g›Å¯#'!K¥q ͚ܱÅԐ*ATÄ3‚¸p)g¥Ñî +Ó5>75ḺzëéåLñs]Ì·Þ]}|ZÒïiIcDçÎ9ë9÷ƒÔÏ_H͆k̛¹#ôÔAìø5±×Mœ¥x<~agöãóù„x~Aä~†°îX!®7œ›xà÷Ø1óü4m[\lëît1x†ÀµDùêO 8¸¬õ…¤¾‡Û]|ìsÖCÛ¢@áÑÆêÒå\b«iÒø×B‡Æ5“ï[c ×>+P‘·-2©éo±¹i­*ˆõäŠî©ƒ£MØɉÌ:;E0¹8¨e¤öÛRDNÙ1ß!TbN^²yґÆè¶`GY~ˆDî×¢[Ì2BÕ9=@IOÐnžó‚Jܶߤ¹âjlörÜkS °Ú*’X¿üëÖe¶µëòÑwŔ1”¬AǀŠÏgâ8GM S#B¼¿U¤ÒúŠÆ k€]5«Êë2t¿þâg°V0YSÂØ×Å£êL}ž,úŽÔ7º’áw͐‰Œâú¯¡0‘) 8y¼¯š˜²f'ô9ÝTTŸ“àûO‚l±åÕ=Öˈç$8~!•ã µo¦Ïð ù˜L¯u ·Õãñ û$8~!/ Ï_ðIp„°îX!ê ÷M4’.9xhÓ_Ï:«ë ñ: Ä¼¾¿…}ð49Œ$mW +©HgRMN˜f¥ÊTÂàb7ƒz?f +º(!‰ŸÐ÷ªÎ˜±¡› ô&‹Å5»Ó’ÃFdE&J? ·M(ç’fÓW¸ê‰ó>¸¥ñù(›ùËT~5‹:>êu¨e jÚ§¾ý³ú¶VS%²ŸFÌå>r‹j ™K(­ÒÖh1OÈsCñš‡B÷+¢Œ•xÌ4w0€'8q &rI}Ÿ8Ûn¨tšæ€ÒÕvðªÝ_ýmAõÄ«—y¢IKy:à‹éaµ¦љ‰nm¯÷ûµIKØ8Ì#ÃñDÞ´¬ýqCÞåÖ®\\ov1~ýÍu:å“̶ˆBÝ`eöñl§¬Y~[9õóÄú‘äV,„Oeñë+‹ÖíÑ £ (Ø}”^‰çÉxPTTަĺcª[IJiX5Sʊµy…n€€Eß羫ñ€ôt¯Ó_̊'×꫑¢y!-БTæ/ù­œ± Žt$.¨½Ég¾&dí ¤VÌqJ’ $ªº2hxŠÉ¼ybXÒ©”ëû¨–|Äó4’:ê2Æߖ¶þ.°wû¸Õ)’<[éÄ%ß֌ ,”¬çÇÔf}®5–£_tà’x(T_H’zC³ ïs$vˆmá°ÚC>÷¢VÔ¥=È-…Mô*¼Q€/,Ô׀j0=äÍ&ÚS@Nxü§ª\á i_=äA¬'WtO9vÌ­ÂvV›ñí¥àŒŽ¸¤r©Òµn,\ã¢Lš/X)ˆ••%«¦ˆ~D¹ŠfzÆÆ}ªÿ´Ñü/ûUŽdÉnÄüŠ¹À(¸/ç™P„ŒG÷7”2Y¬×ý#$_N7ñÈ⚠»%©Ã<ÿÄgx¡‚|Á*kžñguÇ +ŃSØ0½˜g/xøJ>ô¾´@…f7ӐK“>é£õÃýÕU¾T¼[1¢Î®ô²´g½c­ çkÁØè±à{™”Á´'=>FzÙÂ)L¦RÉY T.ZmêÂ$ð*lùÕ>-z›6eŽSüx9úÿÝP«w­cÚᮦq >‡¥5¸:ÐiÿÂÐaq÷ôÍ]ï6ŠñõC1ݸ>ƾÎ̉%Àµ¬÷ƦüÛ{Óȗëݖ U/u.{øy’ç0˜“zELt3ILKµ³š(ÒJU-‡R`0dÆU±K᳊”Å3`aQHžExÌ,³»D“¦O«Ù…®ú~*VðJsçÔ¥,š}tAÜ0E½¤A£îGÚGUìµD#³o¯n£dh̜ÉP»¥¼Ê•âEñì›f¹t^ÒÞ€Q•°÷î5*ÔX` "B ©“¨y¸÷IÍ?L¡ÿ¸Aêן@^èÜÈ2œBâñ‹¾ š];³7„{ʜv› âᦽÏòŠO©²IN +À  °#³²TBn¥%½Lˆñ¦Šg`>§æE£¹›·3Ÿ—ï# ¼{q›™_°°·%÷ËÒzÁŸ§ærw¨xuQt_ÄCP\¼÷Dé˜åÇ}şa1,¥‹aÑÆ~•¦æGJ?YóF§Œ8Ð5ZÉ\+)Tq@f‘_Tß,O{¹ÁÑ­2Ö1ZÓOՖ“2¯¯&¿êcàc(ìØõßw‰0:üèüVúºI‡RƏ8£G¸Ã¥ÞBu©ºÛ ¾;Ú l@\ + RöÔ^»ˆ²õ}ÕBlùG͜c=ÓuSõ˜®[ O#o+Ø1Œ0|‚}e4ù %9âvM[-¾ôx ¥OÍÑÆwMAª—1ȒÉQMÎŒÕànÚ‹;Ôâ–’Ï +™ytV×;Df_Ýc/VÙ{¦O·ôÄÀ´È ~õkuŽÞ&´“†a_H,›¬Ì¾ÂëõY؀ŽFOÅZ±Püø:ä¹íÓ3’v÷*,(Ðú‡ ’gŠÃÜI@ný)wUI#óë»rL†Ã €B)c/’D®´è¤^!•\iž^¥9>ÙØ[šŒ¼9ÄËì+ôJ$/–xÙ é\ûS†Ê‘E«°×/΋Ý×5~fóÂña¥Œ¿V®ííšéÌl#j ËAÞnšmn¦M=….FRàvÈË<@ Ž+ʺ‹2ïòöVyzϋ=êg¡ ŸúO@)ÓO•¥fë6¯&D€ϲ¢OÄeö9!'’Î:1.Á=²×•/:¿‘K'h½ËS{©SÓ­‚½±1/Y<ÿCkßxa­æèÓñœÄÍâiWaõúw%Ír|JšëT&KfÍËCô¥QÔ>X½(Ý®Oªð¸~@ar}Œ]s«¬¹–öþؘ}oü]Ö¬Æ+ÿ7gÿ7g/r[F'ž}˜¯1š¹¬ +è>1Ui2 +¨Éj,M] †á½`^ž¦]›Ú¿ÜõD”§¤uÚ͵U¯,yÁûƒ•qù¨Íå2é?ÇZlç%=² ßïOE­QøõE´·Í‹Ðøθ5V=¿ÿK‚¡×$¬ÕG$ Uª‚âÖ4[¢– â;Z×:Շ˜C>µXà—{˜¤b¯ o­5ž=˜wZ;öиš¸ÙÎgMf,ö`¬ôg(c<&é¥?{0×+W6‹ž6[6$?ö¦òFy‡¸þ¦e£º˜Ý–ô“ïA „s®ˆµª ¢öÄ 6Ÿek"7ÀÓáZf•3íÕíew_þ–ð­ÑöþõXŸÏCñ†¦õ¾á½ìmøhÅEÉ× ìëcììš[„-íý±1ÿúÞø›ðs‚íµ,«s)X\¾|Ëè®°CÄuC[,¹6g_jŽ&¤̧({£™6oKhä¹ß¼`Ë9„¤ *È΁y˯Ë+ªÏKÂEÞ²r˃ƒ^!÷͝ˆ9"GFe•Þì€6³˜ÂÏ}Wéåþ¯(õj¦¯7cŒSêIaÔN©G)b¥·VHR–‘…]ÆIX† ?¦L Œ ƒÀlXeD4L‡Évõ +•ê@˽4ÜÌb+.`É.Ë â.NÔKØ[d“¥üO…륧ùI¶9mKËÝ {؛¼,‰]+‚ÑÔ{AÛÕÆeàɅŒR +û‘9Fpõ8…Â}ªa1ÈÚ¼[èxÀö¬N…BÙYÖòjJí¤.·¡”¶Ý;¶è«·Üù¨L-«ªÏdañbU=¦ŠÖݪ + ˜”¦R®Ô¨×`#«JtP¸ï¢4›¸w¤ä·7DÃ#ǹ1¯\W‚%èքoù¹g÷qK‡òŽ"{²dË1ß¹_ÌqŠN½Rgç漩X€ÅŸÛßÜgŒpø)³"˜8.m5mȋXþÓÝÅöâ^}¥èÕ&âËØÝ×;^ˆ‹ò­w€ýq&¨²em=Lð@R±OiNæWrq&P;ˆ@ȓ~ÚÛr½‡B =Ó?  Þû‰¢ê< “ä<ŽÉy@Ðytýã\šù¡X.}Jòuqö•¦U&5Ï;8ý=Áõ¸ä3½¤vE›µ³š¸›Ru…𠃆oÌӆ <­"ÏJ7 立ƒkۗϜMž‘‡5£û’gE­P9=Œ¦¹ÁÎßYhýåuQáüâ_X/­.m‹ßX$ñE@ +6smä6Œë‰Ç%ÿ£Í]öì(´›—$UŸNÉB…ƒZ±@µÛäŒ-x¤ggñ‰¦ÍÀÌ ø©'(ôª 2oÔw%AV½àa½%Ԝ¬±×þ[O†þašü˜²ûX+Î0K¯\¦‘Èz|~(>ÞûÛº¾>PÖéúÖêþû»§—5»×׈gšá}‚wVA÷fÔõ+Û#¿ÜYS) +¾@$î» ‘Î¬•Ø&_!2ÕSøTªaà͝×íùGÖ#±DÌâk!êRåÉÞS‡¶ö°t¦êbê?-&Šhµ!ˆª ê¥ê>§@®«O±!¦’DM€q )"Ûù£Û¨||ÔÁNw§ë…Jõ ©³¹É­*§Ó=¢þB’$Òôéˆà–âf?­ ¥Ð°ÁÃÎö–Ûš£ÎñšÐ®ˆn×3‰î½L;U•Âûÿ×_¬Ô¨ˆÓ?þ2Á·OOÊÜÝű#¨‡Õúç‘ñdpÁÜÁ-.›e0£UÄÕ᷄]9þ Ü£-¹™¥s̕* +*t$' ›™åçK“Ç݌SEædöx_!móéً,³mP¨Ë@c#­Â^¿8¯^×øõ)—e˜ÿª#?/U8•g¨)2å(T´ªî^(ô¾ƒA8…ÛC%68jëê˙ÕŬ o8§Ó,,ë-ÀWE1hû™2i=ª]÷þßT»Ahà@Œ¿&eîŽq¸ë߈äÍ Þð™"&Üš¿®¬©NrWä[S–1`¶ ÈðJ1}Ü.ÏFý äQg3Óv¸©S%èn-Ž:9"ÐSʇ[˜—ª¶ØWÈ0,â¼xùq\¸DâÅ=BZtgˆwå‡ŸE€^"5GxÌ— ¶í¶‡±b8í®è‚ߺ¡ó^Z/â#|x|2:v厒Š]÷Ç@<"5zu!×I˜ÖíUE]êÿa¿ZräؑØ~NÑ(CÿÏyŒ̽™û/&H†”Ê*{ÆoaãÁ¨Mw²”©O(‚dÀ5œºÃÁ}ȑܠE(8wGZâȖ´4ìc“þ­7·u9ÐZBoޑ3Ýkny5H•è‘Šê ³XJcUu=x;M$¢rsEÕÂN_u±É;?eål àê†aÈa™J7§Pl™lœq¼,Óñ Mf€»%*Fn°xÛ2ÙÉß÷q4F×çvÓtüBÏsL@Ot¬à®é؂޸¶¨î‡xrMÕªjzv½Ù_ÓÈÖ=ŸïFöï6²ýœ×ËhGà +½,šK{º~9“‚XšÀ(0‚J/T?uH?‚à¾ÉÏ¥Wl—קDXrƒÕZ4‡ ’ðŒ÷ë‰ÞðK<¯÷÷ꎗûq–ÈÀÃÙ¡ýìi²Ç ÃñB"“Fnó5êf¶[oJø…”Ð<\~»àçÀôdu“ÒëvÚ5ö›ÝÎäj'1o`™fihô~dήSÙfR¾²ö|ëQò}äämivAr°É¡ëNr×O¿´|IR³ž¡]¢ó3Ýû†Æ!¡Q’XïyŽ%I’¤¸ K’.ÑOg-WkW‚®õÂõø’ &E1X`󰀣î쨂(Նãâbu@©A|| ‘ VªçièSÈȏÌòDuÛ.¼é’QŸ>=-Á¬Î•h ՛hýݧ ey^Aóa±\ÂÕ³dK|WŽ©V°à·àwˈ™¤t‘6ãáµà£R…O&ö†²„è5uŒK&V4S;)³lƒBUyu©•Í&ˆW«pÔçu ãsXßniÙúwtN‚0ã‘È[Zb«Y + +c%P0Îeyœpõ=é­Y‘”ˆÒéQzö1¿‹¤‚¸ô32ZBvð­žzvqº´3ÒF¸8j[9­4bYpWbCÇcߊ+êdõIØZ—ã›E%çb)^*²E‘öÃ¥z”…äœe›k[(þaX®Cgà­?r°™é©*\æ.y ‹M¥e7 „4ŒœvšL +"u_3Ÿ’ õbÈÌr¬©i¨x»: ²â¼2Ôc¯Èk²!À>b(Ž/S…©gÛm]] +åyÖä6"Þ`âh 2A}ˆàcÓ««æŽÜ°»³â!àÜ֨ˆ¨÷ôq†ø¹¢ªå :ÊÞöñK³ðæTßÕò®–[Zdøžø¿•>BßnBŸ¡ï‡Ðç›ÐϛÐ×Cèó!ôëYBß¡‡Ð-ôãúqê|»ë|=u~ž:ßï:ÿ$ôùú~ +}¼)}ù)¡·øæÉúëd÷VÿÝ[O¤nó㿸ÿ(OýGy÷?×”[ÿ±Ãør‘f퐮oG\z·rë+·×ÿ󆃥LîvóvÌÏó‡n2˜FÅ32ÊÑW¼ÚüU¢B,̅ã‡dY||Œ}sžk/ì£kSþí¹i$ÀqýÃ+ÉÙgý¸~°E ßà’ (°˜‚ø‰å=£¡)ËCk1“a=£ (ei¡¼• þV6œÕyhr‰è×\Ïè„è +è2§ïü=H•¿Ózق¡­‘ÄùÕQ™ É°3%m‹ßÄ8¨I(›9“U&Þ«ÇeG‡gî²FGK?$)K÷&K(qc cÔ÷¤0sr²„Üò³£Æøh3Pÿº„r1xÜÖà®TŽ€aYÄü}¶Ín¹ý§Je»Æ~³TŽjVfþIl8ç~0ÉñÁ`y±…¡žÆÅ%†aP×h3»¯O/¨z?~cgÇÜâ’ci_ó¯ÏßÙd}Δß÷W[ÜÙÀËãæ^ÀØëؘ‰WD°»=Žú±ûÞ-É’š œÝçہñŇõ‘·^¸9T*ؔè«tå>ãʆ‡ìXr *Ü­òÏ~iڐû6þSèÖöVX}¥5ªM¬/×î^B<Áƒê¤v#8ÆÞi_dNª>pR(«ùñ4€+¢0*H#Vyaýü&ïš^±©SÉ_‚VÑÅ!l ޯ'úà¬òºÞß«;^Vϱ|‘$(¸úÙÓ<|Žé ƒµW(gý易ÇP¾´5?Ò)àgb£Äµ 1L>NPã±OsÕÂ3 æ†P¤ËÒN›‹K(þaXÕÐAô¸ÎυÜêÛ̃Ö§XL%Ck¬T™$±ÁC„ÈYA*¼8³‹Iô¼$H }Ó`í­(iWÙþLòŽ²'@L‹ºE€&)G! +ù,þl»­Ñ}1åqÖä2o0q´ yPæ >vå꛹#O/R Žp*ŠzOg„Ÿk1† ªOì7C>‹‘|§Ýå +‡Öµ@–¤D!¿i¯8¦N,ªS²`dç>õy¼ÏܫǸ«:*ѳòhòGr˜¨ªnÉ€ñJu`r¢ž=Ž¸Šœ ôO0ÏJÿ†v†-ìm¡v¸0©UŒ^‚xv”ñî-Kk¨‡Jˑ¦––£h.›Óùáä+ù +š|ý·‹¥óԛυ_ +>åÿûbÿ´‹mæžÑE“—fãÉÒú2úç/°ëœ¡,/Ôj»¬>~ퟞy|}aùñóösìð\A†ÿØÁzampMpánùc2‡Ím¡‚ Ó½‚3u¤tTp­qe·r²‚«|p͐¦)ýkÐ,ºf¯¹|_á[œŠn¦…7ÁмwÝO×Q×j–Ò±¼Àµ¸C-Ž‚Þ+x®Õb‡4©Õ=ËÖê7ÉAnîÇM.6gkñ7puyâêòæêŸãêrãêƗz.æšBú'SuùTÝïTÝÿ|ªî'U÷U›…b>ýÐHÚx‹7#yüB+ˆìZ—S,ƒ÷z9Iû!ùû>Žr¹>¿°;ÉãÁcÅcw’ÇôƵEÍp?ē•¬¸ùƜîc–;;¡ù²ZVþ"Q*è¡+YН©²$^E­+™ˆ3ë怘S3¦=jž’m5(­&Ô¸ l§F™Ä!ÂxäÊ´‰ âN7*ÔËÇ“Îf'Ÿ‚ûUÜ@ey ÕµÊÓ>lû@T¦¦¢:E€Í … ù„ÙÛ,þ]ˆ…ðiMÊöoÐK!Œ[-^¥ÝY3sG¡ªís!"¶¾GÅÅG„_˜®f°®ÉØê--¬š:ÎI˅G³hð‘aÊë÷A%Ñë|VKë¥ÍOš“Ï】œqí/vxm7çlÉf+«ŽŒr÷v­èó Ñ²*°Š{ k.Åɤ}DäQ&–Ú\8g=¦]nþ°n®Ú6»1][à¿ìW9Ž$ÉÔçóÄáq½â>a@`€V¨ðû´#"3«º BJwXdÅínfŽ‹©|JC®©N/Í?2¨oЁLQ㍇œ1Ç6(ôy8F4AÆèvî¥ýh֌´8Ûßí%E£ ¼Iö»/©­c:À¨–köW5+IÏ2S¥WéeŒØ‘©z¾ÁÏE?£ ’Ä&£pÊ(rNÕV;ómdù²§3h³HOoÿqš¸&bEù)öŒç]7}#DA{ŒÛI’­}Ëþ9^5ÍumÎë{óÕ[د½}ŠÊNv`G¼™§ý‡$æ›[£¼C¢¯@ƒ¬DIûä‰g»!¨ÊUB Ì÷c!ìqxD¤@»ýSέl”N*ÂZ)†ruv¾BuµކôcÃmÝ6 ‘‚Ó&‘l-ó¨ s¼åƒ ~Ä³à™ªâÞ´áµ^z´ß [”Æ؂rÖøò âºX[¬ÍÅ4ÌdVjFTÑ ¹ åݤ„›—‰À)ÍÜ9mž6N£ë¶›6ùâ bKä⤜g‘o›LV3nƒˆSùlgä\~­3 Ú\“·º!ü6L2øu05¦èÑ¥&ŒM¢½)‹¦« ±;ÿõŒ_—Uö¦Ýæe/$žî…"1U ª™ýÁ쪴ŐpÞGJ}s*ìw,­]é8ÀêÜ[ê\'¯¹ÛÈ=­Q"Wwå}®Œ~~»Ž0» a Ø¿æ×@—û¢ÊIãòp¬ey#YvA¾¬S t9Þ³'… âÂG…Ð)xüÀŒÂLÂ{ÁìóÆÿM mB³áLy´Jrx„ôZçD‹ûIJŠßYËnÓÞTÛÑF> «ÔAçøëÜFüí7ípÿPkrO»®š½ÛGS¿ù-†í"dŠIŠÑ|k´¹=Õ !·Ï–ÒÖoéZéSJ·ÏÆå”u-ëËKº:\Ã÷ÆÛ÷ºµŠÝôF!µÌ§]YŽ›Wú''c%{ìý—ÛùëeºJÍâ Aøù¡èÔÃd¥±Ç””@¸åO°õê+=MŸ¦¢2…½V'›·"‹=Nÿú§>70/—¯¸Ö—2„&€öÓBÕ«‰dFM@M¾¿!²ócè9¹œžStO ¶Îìnÿüv/}¾Þ[óè×Í3W¨jz•,‚eËÓ+AŽ×±Œ!ŠÈsn ¿3£Ÿo™ÙÏ  ø#7)@ÓD5õ3ßFò:ÜêÆé 2 Q%Ta,¸â „žþðy:¹¹œ›Y䇃+‰J©j¯5¬ý®öRÛ:8 {]J¹|•Î9‹Od½Q±¯Ú8Kj€Z¶J¶»¶Þ5ö:§¾×Izâd»¾’ìoý j‚µ¹/‘ò^º­Ud($ª“ŽÂ8A» Ù'’F¿/DAZHé‰ +Iy"_TÚ/ØÑñÇ2 „Z´„N´ýàŽV"‡V{|aMՀå-í[Íþ¶ÝY谳DžŠ•ÿ†ºxßMÛ°{¼€®'j=˜‡ëŽT¬4§=§.+¬Îš&“ˆ~˜oƒþÚßvì5)Èkd¾›ƒJW‹tÛVF}¡êRW—rRE0+ “„ñ + Æg–'ßáYTu^±Š´ƒèÌ-vд—"‚¶a[À'|ƒ8K[7$Ðo:Ó}ŹìÈ̊š pŠï¹Žr@ozs žÕÒÝ|· µ!øŽ5Ò¬¯5+§ÞõÑx‡UE„"=OmI/2óØ÷ýŽö„¸ìpæ÷ï^S¤ö'ìb_ÖQÌûÊh«¥ ª1Õûۀ)e^¦òæ‡% ê +Tâ$M©‰ä!QˆÉ)øÜð†‹S’P‚¡Ü¾lkÚ÷û×7ˆ¸–$ÍUɲötgÔøóq[ñ?é:® ¼ö0=põ\mz4!Þᆠ†¥=t`ìIK¶CJõoHûœ’ª™…—˜¸ðº´DWø¢£Í¥ø¢Î,­@¡˜T\NZªR8Së{Q`pDÛ»¤·åŒ#uŸB[8Øçôšîa š«ÐÏ}Ùsª‡]_wœ1çþNϯW3²hŽ¡aô2™¡ò’¹ËëÝ^‘”§ß|5ñ1mџ–œ´¼LˆÎXM}ÖX¡Uޚll$’FG.×W<,ÃtÜÈÓâ·ãàv#‰›*ëš×HÄ®U÷†<ðe³âºŒ{ï‚ *WuÚ©Ygî5ˆ´÷Qï¯ mKFnôØû°½Š¢ËÐÈ"²8óY”æ…÷†<ðe³RO»Õ?¼¢$_I—XV»—¾x ía’¬ÊÕO”³4LÇ!w ¼¬Ù^,"QDq˜ÆR= o F˜5ïoÎ4Æú ɃÇW¾£ýSœ?}‚XÆ¿5äÅuo|ÈSIaXŽÚIò?®©ÑnÏÃZñLl)U …’äã’#Û·µº>c¼a´Çï߰Ӈ·’a† #JÜ-Æo2 çÖ±éÒ²Ip +¹zaê7¾w»[ü±*yÓÕN!0†‡”á×ožþ‡Zu2ØÇòÛEV‚UOQw\¯ ø8Z¦ZèF~-ï`¿ùªùomÁ[ú¾¡-×g¾"÷ã›Ê­hÇ%힞âêù}÷`Ò1óîѨÏ=üíò(n­|Ùö5Þ£Nϯoԏ£fèãуxˆ°¬Y©rV¬âî¦ÜgO)ö0¥”½t«]§)ä”ÝstökJìUî”%gOβ'm[íÚ f±[,¨M‹¢'b‹næërLX0Sd­Qbh‘Ø{0öA÷¢êÁcûZ1iÏ×3fWÏ=꽧cåÓ3rû²ç•é˜úßôœÕÏSœžWáŒB/Ýü¢øA¹y€A>š’u7q×½m*\ãLWë?­*¦¥ }ܒùö«˕‰ùÿs©Ç}9O9e¨îï6€2™)u¿7Ö8m)A1náë‚#—ãu=qZÅѽ-Ì<Œí5‘e>Z Ž·ó(x™íÕ/óà–^ Å嫦/üSšjîÞgOlenOÀÑŘz¯WLÇW`¬¸Õ#ðƒãumÅögøgq +ÆiŔÈH77´¥EŠ©$F]" +…ª›+ӘvØY 5L)œ¨vCSŸ›¸Êxa£˜e¨Ž^ÍùA¥”ìfò>¦vk7¬*}TµÁ +»i3j¨ìãþnÏÈËʁ×õ¡v،[yëŸ&ÆDþ QjeᰌŒýuPžê¥˜Ü5¹šÐ¨s;4tcU½`¶¸ yŽú´kk64Yþô­ôj1àÉÈ`%&rRP~y“O›2hš”­X +º›­›Í­èÀ©ÚIGԍDïKFáàöD2ò{ƒ ²¡'Àc/žv[B“Is›M„{Û¬÷œX‡¶‘<«2b“ +ƒ³Õk JÀþÃíĺUUó0¤<ØÀ6üuþns¶ÅŽß¡¿ä$Yø€êóB!ŒZS½­×¨‡­¶žãҌW__ÿoÍX +ûÓP¡æ¤sÄ»hØ?oO¸¶_s\í#¤I‰Rp´Ñæ4ù€l ÉÚ(»#pÅ0Æh꣉엜Á¶UpºõÍÊnYªÉÑG1<*¬L$›x£+J2eZ©X´•ZÌdr¯Jë^K_#®Õ¿ÅüÿXÌnM¨Æ`kÒQÍñZGWÅà¿#å rrû\;ËgŸ0x£ïI¼;†¢Âì°:/°í>QÆ"†ò›+mö֓£ß¥i ”)ªd7ˆ&¯jVö«ƒ˜‚²Ç”í®'«Jnò©'MQ˜ž¬£Þôd¿ÉÉÚWÏÔä ÙÌ-&d]ô¦%g=´d ùВó“’ì¸*t—¡ÖØnJò8K=‰'Ʀ·ûÛ¼áH‘zM@ב…RŠ ×嗝„ÂÖñkciÕDj<2‡'fÝ¡ß ôN*6;År5ÎÛÂz¾v¶ ÿ¨¡mo‹Ñ^ûÈÚüáä8ê߁·H=çBöhC]øµ0,4;Õª#¿Aì‡%^S¿•é«ò8Ž‘E) 3C/AªZ]ß 1>\”r_îFüíœÕ›{ƒxk¶evìo¸Kà©'¼ü7Œ&ˆšwÍb¼ìÏp'ÜwkvUîŒrŠ"˶?!vÐùGÉæ s°úŠ*çÚ W£},í¤ëonLQ߸T¤¸‘©ûH u¼®8í¦ð–Õûúm›f…%{›Ž`nH7«5òƒ1Úp)ÞßcÄI üÑԕ†ñÉêY.èŠr$%#¤g»¤n¤sä³±iÔÀæÙ‘Œð•qFE­.câ¬Ó¦>e`í5Ÿ¤#$#"%zˆ´Ad£O,WôYŒ^Ï°­Õ££dÙv^[ü»‘>Ä]«çJNY#=¶#—UBSé3âÑ÷i¬>?¼qVä;ùì×ÍÛÿ_äsv©%­}>GBç™À—N ÙÙ̉JÝ6þ†× ­°Fˆg,Ûɇâ5‚â÷ò€çFž¸c扬,֌•¥yx®ƒ1Püz>Vv€òâ%1j ÆNƒnðµ2b‹R>f€tµí`Ãs@ì‘os–þt[±m„¥`#WŠæṆh_Ý©ÿŒ:¯\öˆö²Œýk@îö@FŸŠ‰î•7GNÚ#å=–y`„œqãï'Ï£!Y®×+Ux:+}q±ä<ðQ3föÊýÇ1nóox×êÔE»RëÕ>_ÞjF=\ܒ¦N4œµüV¥Ä…I*ë²Z`o¯còm¯ Á<¶SûæöNc¨„žˆYݒD%E=ÔýÓÇ¥OÐjk|Ãá^tü¡“‹Þí(¢'ñÄ´ÆH Jè5C|“jŸH–Ð5›nß˓!^FNmÙì­FÁ_Î:¢àüàFÏC£þDWb3&?ûßÔÛhù¦Þn{–¹ö€^µq*yªî¡bþnŒÅà)³¡Ud(ª©ò‘‹¯+ÚñؖŽÌï÷Ÿ ¡p²¬jq˯¡ï?+ªÿ»3”å-_eÄ1ù Wi^@v“ÜŽ8Dʉlfý‹:m]B–ŽvÇxIΙ.¿†”¿¢ú¿ž‘[ÞòU!ªpÏJzÄÖdyÅJÿ¸'YkãÌV%;Ðï¡ìèӀm=žœÿ‡>ÇFáV¹OÇ°êIz*·<¯¼íRýÒ2Ö±0Р֎BÜèˆâ8tÍ¥e°Ò²R/ªhÞëªIф\°ŽïhoG´ú¥»I*[²: öΰö¼ƒ½g‡¯YU”ù@¸ Q DªÇ'\s-Š#{ùÔct=wRYrþ@`jRü›ØMÀ`;¬PA9;ÚÃy#dWÃGr¬G°”,õux¶¨KÐÛ&Oó‹Tà÷Ò5´ë¨ŽåãˆY1H-6å}„«L­züBöa„Ï$®•Õþqd[A=fjÔ·‘+:wº$Òkߥú&ÁÖßƕ%¸ ƚ'8â9BÇs’©cë¢` äáC2baô‚N•Ž °‹ù°7¼"˜°¨åÿ¸®?IgZ„…i ® +çe_ ÞyOçª|„YõT³†¡ž£Ë2lAÕþö {°—ÃçºÖª…Ty`Þ­ÄÛˆm'˜Åž±óvuÐZ-L]è*† )ä5 ½$µÄUL QÉæ÷)1ËT/;Àl6a6åMwáJÝ´àS•œøêìð_(Õ%ËïBì +™ÞË » Ts JYbZÿ•Õ‚eæH.ÕàÎ(ûbí’d95$©ˆ†wjÓºÒΓR¡Æ|d];Ä©b^†|öԎ=yÞ=_ÿ¢Ö¦¾-]‰ ¢ uNB¿§‘[CÆÇƞž©Šj´¡¶:oO¢©É¹-‹¸/dúC™‹îfrÆdfÔz‘ת5Ö9ÛúW=eT£âCÇ;½žÅ²Pý´0©J'dŠ¥ö'D—»ü$gãQ,9™ú(Aké!}‘%óéQ)¡"Āä÷=¯b5¼æöEFŠÇÓÂÙoz6»ÕëóÇ-ÉÂ.‡_¹ÍmvG *yºj}‚YÊ1ïD(ûâÂÖ¢/#Õµ 6Uê.Dmw8|õ1IK¾ÞõBg¤{­žn«¤»Z6šÝ²ŽVoðuÁ:£ó°Ÿ(!`ÇX­‘+û•|²›ôü:ÐB8yyУ? EšÒÔöòVàÍ_ihúp¤ò˜ýĊ%áÜoØ®±Ë D»bçì%J[ƒÍÌ`ð7¦k¢^7ŠÊ­×™)Õë®Ì¡[½~À뵙ÕéÆ^³žØ:’Áí¡~Q«ø¢™›(#{ Y5î- øŽ|FâüOÍ,5»ßº®¬ÌR§;æuÓ|áÃPæuIOÉ3k|ôzV?J=çÑ$(ם#í¬ttÎ6XÊo_hŠhìØUഗ>&k|ÕÃT^sM0J³Ë²dBE +~]0"6굿CŸÜMÍWhïž]ìࠀ¯‘×M†tY¸&iǽbQ@Ywˆ^SEЋµEW»¾“j» e§h9Uø°f‰ž„öôSµ¡ÕXõM3&ut]µ“ݶM óˆ1£¯rV ;QÑK‹² I»Gìéˆ/ˆcT¶ÄÊ»¡ŸN¹{_ÜG>Ÿ‘k¨5µ<0ÉËNSÍ jÌìH/ˀ¤4ç<£ÏŠÒWw Û…\3åß¾®2¢Ž xۼΘ³+üY˜ˆaÙ÷ÉX%¿ñ{(Õe|`Y^[E>ük+}=ŠØ›E­?ŠØþ¥aæ;²†)óMÖ…WÞråM‡\]SŠöÜGž6Õ|+q’HÐà iÈ˽’x7òÀ¨iÓo ÛOs_õÀ +ÒG³È +bÚÑ +]šê¸¢W9Ñkq™¦òyσÞÞ`[ @YárM7&A»)q©/›HrV«’é*õ8 E̲]ßöim9 ÇŠäû ‘-à“º(Gæȍ8EZÍKg|B<ätÆà͕cY nÉ©[AÌ<ñ…vP›¾©¾?ùy‚n‰Vݍüü¥K» zÝ.AuÍÙü»0z> ™ÿ~ÃӋ;Ü¥o]ªL‡r•Ö8ˆí>Žã'ã «hÁÍ2Ê <ž%²Í+Z’!ÑQÛñ¾iCk90¿ǪáW‡êÂbIò³§¾á×­T<©2Ÿ—‰Ÿ¿@:Œ:~Üë]íù §KCÞ>U™ôˆh³q(LH¸k•7_v ‚m‚·Yë< z-Ü`:09ZªO×wì$„ÄÔ1p`›‘v¶Å©Pú©ÉKP1LÃiÙkÞû€s{VÞ±I…áµp–ý† “ôLGǏÎ2;롋4ᯃ¼åšß m=]úr·ÀÜ?e‘“½ë­8i·¤öê…RðØÁiRÙg–T‰)l*à,CF)R~\toéØ亰åaèç1\Uï›Wm;°¡²t;fSЁT´Î†ú¸ à Áa>V™+Z¤ï»+rmç8- S†~"U†ÊœEî7¥®êð낃½°¶_á‰uŽ/ðLŽƒßB;[ŠKrÒüÎùÿÐ|-ùAól¹µÊæðGš7âÌ,`d½4ÚªÊ›·¼ pïîÂÅQuDÞ©™Ò‘,ܝkÊäóò!òw.gô+°i ß©ý€Úòd­½B7ø'ÿZAZ& +ì=ÿɔiWéô°‹9ÓØ|¡rë›,mä#üì+øÍø²,ÔG˜ŽúCYCÀDcg7yÑ4OZ¢Z”ƒÿÂâ<íšö ‰ÿØ"Ôde{;³u-ÿ}lgïÒ͓V–-/úÍF^p-+¸­½0­å¦OËÑ?ã;“ õ·1°^ßÒ´øÂ؂Mªl³ë E/yüùÔ$ÕÐ:ß°½ZÁÊ%YÒÌî(Ő6¡Ð Ùæi{c©¨”áI ¯Îy³Žëà7Ø,y+B¨C‘÷ý ¡íôB¢/¹;PזVŒþ³E£Œ¼£k“0û6´“ û­RÍó’H/„UÊۑ…_ѓ-ÿ†ÊS,aZEè˜8V¿\A›Þ**»JfëÉfNW/Ñéٚ\oƒ¹°áË Q{;µ³IFwÑ¡ÂŦ²¶©ŒÂMv—Ð[;««ŸQyÌÞRªõrß[FµaDlŒ†¨ëµ°ÿSºfF÷‡?¾àÈ9Æì<÷õù–iIý#w³‰ûdÉ»¤ÎHBR'pŠEÉ Š×ݨ³ › Ôƃªägeò!,Ò̒oUïÌÆûµ +wÈ šžµq/êۘ¹+­ƒL¿m¯øŽ¸ØˆÀƒ… ÂRHw°.wôß÷ۑ¯ÓP³ª.Ó±å#_]ª¼nµ“•#iO7Äñȧ[q#³§˜%áBÅï0½#’kÒV’¥ÒCÑœ8·G:¤ÎÓÖ<Éâȃa±x¦É=SA0Í6¯Èšl«ðòãŒ%Ö ¾/‹H¾¡/GI´‹‰åÔ3ékì*ªOqš#–7f¯’h}Þcu«¹®±Þ†œ€SüGÕ9ñL'5BG8*Þö\¸):]¨ mHý D•7ô פˆåa‹ïìÐÄX%­ãÝJÔ>wº^ÙG=¡ÝO„yˆ¾–…¤·š–ÍVõo…E±J‹Õ­Þ¹ÜßkI>,†Ë¢qyC.BL:o!7—±nOÞA~I["_0c[öxž]ˆòîXUøÌy„Òí‚H$¶#]<4¢–gª°[a÷¾0ñ)[ùYätKò‚ŽÎ<—¶•¥›ç¬Øͽ³_¢µ?  2g„@À „äͱ\û ³°ÅšJ²¦ ÈS‚£ôH—!KˆÛ­\H {§Ø5=Öb’0!)¸ƒéÝ +hÅ¡%äÃ~ÙVÄ9Éyy%**5o„'’ýº ‘t¼è¨•ú„ˆ`=§œÓîÉÚÍlùBÎXðcޏ«¯PZ}{9»²ð‰%U¯æîüAUÞoXäÞ0Eœ£Ôщ’Åkî+oœ“—¬ön8»‹ìB‚Sýl¨eol5ëJ¢i6³aϳ·Í¶É²§=N#•pÛü9ڍ£Èë}§i™d ‡Ì!Ñ|ÔØj™Ô‡®­ ƒ$t$áØ›#íFË8»™~QN„u%²üwu”¦&‡N¹;Êþ_7„S*9ƒ?9’‹ PvŒ5ðºàsôn#nóËÈÀÉÚ¯&ý60¶6käïG S݄µ¿X8k„ŽvôSrQÿ¢—šÔÏïƒ1D5¸}iõÈF:þi.KR‹Ã/q!9Á5šŒÄÖv“+axÃB C0%tµ´Í ƒx(ŠF1A‹ÒfÝÖ ¶m¤xaߨÖ\#u/s +¥ñË@4›×aó>"5¥‘>Û¯#Û +gƳúmäZüºÜ{%*Î=T»Ï2ëÑ+­ &KSÿÜ Œœªå W[ ûë/ÿÁ²/yW$‰5ôºÐ°à)r=%o8™{m_ ³ç)ÑF>Ž+‹T@¬ïHšG•Ë¨÷1 Û'¨z9ö)éTsù)Uapæö„Ì«zM~@ì=¦u +QŽR|'e^+:¾–Å)Çy¬ûĨoŪˆû[ت(9þQD Å¢ynQz€,äMêeNJÄ?ÌëÁ¨2~ꯃE®|åd<],„2™[dcz-¤^ïM¦„õÌPc+XýÑdpeÉ!9˜óðdJWÀúhšK>!Œó²r ZËÏ«ӄûHcùs$rT6ËH‚ÓÒ,1¡!ù:Ûö'$6Qêþ·|IÄNÿôðøadÁuëüyl_b?c8Ügb‚Ea!IdÖ_Õ2!Kq;Ù¤l-¨}ºsæJùDã +C!L\ àkA´¹ é6ñîhO5št Æïkèqhu”–h ìÛ}€x‰Ð{€ rU"µ2ÌX¬ÍC^Â}HY}½\ÿ©c»•"–GR¤~6ˆtøوPôª¥wȹÆQxÀ˜­ÄØ)pMö®]£¥¾uí܈Öή½þ¿ºvé_(£¬Å¹cíefÉ@Öy—ÄіŠ jŠ£“Š ^|-¨.Yؙ’ºd¦ xdäpÑ°!âZ¥‡É ŽD©¸Æ¶ZPL¢šbƒT*…ÚSc’/&î%¸(–[®nXK/軼VD›ÉxÇ:‡5ðèI-ü¿VÿkuC'åƒæ ¦ yÔj°ïÝÝâDLÕí<ÏO²âI”ž0x#Ÿ=»:ý¹P“¸Az¥7˜û£nœýÄæˎû‰½ÝDb”]"±÷C$¶â×(\´~¨ÄË©ëC%zqmC"QG³Dbo—H¤×S%ötS‰'D½ÞTâ ÷ä­Þdb§L퐉ó7‘Ø;ÞgDÎ֛H\|oåÆc¡zÏц¬³–ãÓÐe"žºDWÃëþùPsz9BQ2ÿG=ì ƒv®—7SÇy……ù¨×o|·§Û¶î¸˜î|íXþË7׃%nïùêØÖ÷úNz fa›¼RðkatÚ슲æñ„Á:¡Bïå ½_”Z˜Qu•-ا¡hÍüíI &çý-ݞ„´«Ý oó ƒM/—Ý Ñ £9uµe˜'DÇäÄ+Ÿ÷µnx?(K×úeÙÔг:7Ž©vóËç‰Êݬ2ãŽ]W@(¡2µþfœ³CQj“lýëÿ«õÏô5[·‘\l€Äf®×5Ÿ£[›\6¿Œ ëgÀžqñ¿ L¸M7›5òcxŒ­c®:B ¤Ÿ’«¨H-˜ÜI1á;)ÓIE`’€'YÐeÉæ¢babp [¢FùÀÍ5‘•‚Å˘PoòPѽ0†÷)n‚ã…rWöœhQšÂ̡ہ<ŽÛ@3ÜØ7ª5×HÉv@pZñn~‰fõ:¬ÞGÐKô‘>û¯#—þéב½úq9aêÕAæmö‹mîÿ'×uzÜ{nçž5F™½0ê´pžeb¼Œ¿áõ8OŒ·1¶‡} Y¬‘Ž¢°=`Ç9Ôk Ǽbϸ⦇ç>¸KÔë_pÁkË ä&›ùYIm#菾¿?ÔJ…  svƒàn .-Û3j¸êŸ †1¡Irï‹jɵƒo>ŽXóÂb²Zßtøí|2›„Z68•–Cï_LÐÐÙ-ÄïÙáÜS²*!;;QDú&=†É,2@…ïÝCз¶ÄK0ȸAGd³ys´wN#p†ÆUÇ8O–ÛkŒaT{ï¤C~æ½Å´ð%zh·Ð>\ÇñKË õ÷ë"àéڊ‚ +ŌÎQ7±¥hïN_L†Y” 5Ï7¼J¤Û'É.r#ŸÎS‡4ük¥ù´Sn¼™Qó¾~[ô6‹IT—…¾÷%`îªÎä ãí~b‘§i;|½“ð€"Ž$ì(V¼‹».‹§@ybø­ù¦ËnXÉ»§? éH9ȋ/F:ƾ‚­P‹= DòÓFVëfhû_ˆ¹Ãґü~\xª\›%JpíÛ¯Ð÷ÇZÕÿÝšå-^óìžg³v€jžâÂ,Éþm)ˆãûca<¯fÍ2 ÔOw+`«tû³©s¸¡£ívc[Ô-= 3Z{‡aÎÛáFϋiuU¶¾TC+$tþý/ÚJ­ÛÒÑ>$ÇҖËÝ"—ãR‰ìðc¸þõˆÜòï>|ÖÈðITÒÂ@ÿá»J’cÉuØÞ§ðú…æáÿÞ8¢ëÝûA€’2³*zc Y(ŠÁ9öeÚ^">É˅v՘¯dñä?SSÙ«]Ô±?þ +a½Ã1•·l½|KkÀrô/¹;|-y¦×þù„&…H8òâöT³ ²ªn„°+ðA+Æ'ݖTï=tø5ü@¿–ˆHÍcy]¾ÛÿboóéKFd³û¼ì¬/è$cá¥Md*ªóÿëà:ë!?Ñ*;-°iüôÑקŸŸûç/“Ôë7³ZüáË^QìZüøen®FATKe>©õÛ¥ån¹Îï&ÙrŦVަÖǗž.7×Am mˆË¥Â¨f¯‹Ñ™1ñÿºÁÁ³®úÒ)ÎØñ|ζnĚ°l\Üo ­(«Ì¾×þb2yhuÀ׋þ¡'&JۙÑ`f¿ì°ð¹Øú2˜¡g‡Aap½˜a¹BVøŒm¥ï𸇭¨jºÓ]††ªÌõÁvŒ½:Ô3OÆr ‰•þÚ¡0¸mÉÈü³ž<9ä=+eÊÂϾ«äd‚3ñ9bª—’nºž *¢t6Dg´¨ÑZúP +30œáï—:Pkw¨N¢,±ca &ÉêûB¢Lñj’=´­ê¥°×ZYqÙ±÷¢žä©ÂÛ¾A&¿Ëv¡Ýl'Ä:¯M5T]ŸaˆöTëúÄæ^éhÛî÷Tììšzˆ{[!šÎC…Ý®»™Êêm”ÍÄïQ$4Ëq´–œU¤R¿(Èôµ–±ªPV^§&š“SV±J8O/0‚;õóFèæFˆgÉÜ ‚›ôCKb§ÀF*×UX팜>õ‘%[Î̔JÆø;ÞQ(ƒt¯FØv Ö¯?­–7¸t~8Ã__‰Wíí숷—Ý€º ë[­s¹#¼Sª{æéò6³|A¦ßÍajb“·°0oP.”:1Ûiê?FÖóÁSŠýmÕäxDÛÚÉÞʒ« _6Þ&Q÷Y_:Dg¾øs Båۃ–»L»ž¨Ð½q‡Ê?÷€² +ýæ3}y=«]CÕê +¨Âs×jû*v‘VÕÛSPæ#tçܳï(°™ò:Éѯ1aPGX+ ·'ã²yD¢ˆÂŒµŒÏ&QnSò?GΝC2}N®‰•¥’|œÜè #XGúpôr¤””ØÏ GsÍÚ­ª¹-{Ù=Å"hEÀI¾Lvu¦hÌzó¯Ú.Õ\¹Èé46ö]P0Ë|è¤p1y×Ú±_p[\Mç<‘›/kù"Ð\éú¿Q¥^ÂÀ*™Ç íá«û݊Ï[*×3ý?†î< +mšŠ0¥¼ð?ê° e>^wßoxÛdm +r +fWv±©PÁ„L”ûÔÚ7’?c\øµ0Rbd½yf[{ƒÐ $e›Ì¹A4mli, +YŠnu~è5쾎Þ£w4–Ù¥8#þª@ÁŒKÚðO‹i¹ÓG‰Isè™!iªJ¯¡)Й™,}PÄ¡E÷.åN,¬¼[—è¸cîÆçERtEñXR«Q’ ÝÈ<Š&a“ ϋҒtL™W[Y‰cJKo×=«Æä>}&ZJºJI<¨¥“ÔÊ}j~ÄØrŒ)é ãšTKí(,»ÑùgýAbŽÄÈE•9ƒªöƒÊê1„xòzðùc~vÂ*3¿ã@ǞùOŒ»ŠE÷y7ô„*<1Én H­ùKÑ'FÅ Mœä»ÿ’ºBŠj€]Þ"Œ7¡®hdQãR¦PÛ?¾6†òþrÙH÷‰£g +}Ío:DŠ¸æ‰{+·ùw óÛ +¾öèÃ_õn!3Ð[iŸ‚eÖCÅ5€Êþ›ŠcN7*¾áÌ*z¡âù¤âÍý’>-G ŽÑQþ]™S“ÞÅúÁ®Æ-öî@ÕÃkä½JÀ·ÔÓe¦¿9××yƒä›:bÁ¦ãýW7ÎWÞLe&§Po¦;ûHt[âæ´Ï¢MÙ+ý +є÷B} +¡ÈÖWYaïkKZnçùo2ÅWÝìäÌ­6·ÒŎ#u‡¯՝àx4-OäS0µ>¡(ôµŽYðw ]H—4waÆt%©È¾‰cF!Æ{L­ŽˆU‹  ’ ¿Øb Z2VV“ªºÀL0ÊÊÓWý]•\7‡ê«y°³Y +Ö/ÒV¾D`Ạ§ +­²ÒRÒÚÑUÅçW²V^­üùÇAÔÎÚIÆ[}\¸ ñþ,Å.V®XÕÄúÝҒ;c΋a†xٙ76Þéäôat#t¹¯AéX_'c¶ÿÔz%…¾~Ãí¢1Gtz ‚(¼©ì.ºï{!Úá9dòñ=îâŒkÑW]æéOHÖÜsïè]ö°¡0¥ùěÅJ®p•!qhxXY®:¹;%P +#e$æ«øi–o º¸Ú üÔIi®¶Äô`Pè4ç&)3zö‚%Rg‰¬-3'ÖX÷Ð͸;oZìZ ¾ùÚñìæÿŒÿÛýÄæ}y«{C1“«1ª¹1Ææc9…±!x4g_|Ë^˜”Yý¿a–ÃÙi½gßÚÁ©„¨ZlXnÖª5nr‘.¾ÖH.ú†?_~˜ ›¡e7¾´Nig*!;ÂÄi¿˜E3E¾°BªˆÒ~$¹&Q:̳7 4»[ö5p7Gûæ¶H\M³SǸzVr¢6³aH#¨]÷ƒwg½6yê @«mç:¶”ø^ Ug÷s0ï’A™ÂEW¾Š¨֖EQuº,­âÒ.ÓmˆC²kÕÜL³g—øæ á£åK¸|ÒËL™Qó~ÓzÎ2¤NQ+4ޏl'Ø­êL~°³½O,Úiö%.@Ύh9h­myÑûKk-óÄ`Þéwžâꆃk;Óð¨õÁ‡o‰’ɪþÎðk㊶*Š‹RŠïWŒ®$¸ß¿ª¥«Ù"×æ¼  ÝÄK>G¶âý–pŒUrI¨^®}¬ê5Çú ²mä[:öµps5ôgٝN¹2䅁æpb*]N1 ƒ²L”yÛݲ®7£##TÖ +«ˆý0¯OnÈÕJŠ‘ÖMJÚÜ)Ÿ‰^ٌÝa=àÀí©ëÁ·˜ŽÈӊ‡³ºR›IÜÿ¬ëi%·êú"'æ¼öüXÙ½¹‹K"Ã?9]mªZ×AÉbzÙv'JOå©VŽòêHD <2uc©uĚí5ÜðkaÈ¥ä=e)ã M?­£|wh6 ±ÝǪkCB·-Jš‰¾Û)9ÝÛo{7yèŠlÃ=¡¦ðNóÒ hA'©/ý¡¯i6•ý7Bý{Û^›x—:„„]ko·‰L®3,“°6iW‹án‚UN dÑKÆD/0yPߚLîÆ>|=öÓùÖV­¬°3A&÷¯Ø’e ʘ…Æ.ÛÂ,¤ÂË%:€‚3ÍƓF‹ Ú:é‘A^v +BµëÂù •À=|Ëâ20Œ“ä€rc¿¿aÙ;ÈjÝOÚE$iNæúï7iOáD…ßÑï )íÓ¾Lˆã(WԜýu#y.ß³<‰®˪J,²Qô8­!ÄYáYTN:6ê͎Æõ=֜öµc» ¥®Ò@…ë^ÂD¨x×¢¼#ƒ{"v—õfÑxÃà»õ‘ éš ñ'¹(†OÊâE~-†»{þmÖ×d´úÙ/ø‰s¥’À³’¹q*$‘+òØÿüKÓ#ºÚvØþ¹ pì_¹òi«`îƅ¿ ƒW†m¼}|+×ú…¼???•úZÝ1¶Qώé$½yLK•.$;ËôJùeúQÔÖ÷_·õ°ÿßè…0É®NÿéMȐÕH–Ž3?ЮKÇ`ý銗\ûctš €pÕ¢dl$Ì£¢ÖfagGBŒêCà‚ s¬ ­j¤îAŽÖ¼Ž’Úðèœsè‹J>˜ªC;T–‚Aê[„Wöþ¬&5­RCød¥ØJ±‘‰è;Ð7µM À)9jdAÿ02DÆxٔÚ?ŒìUۅ{äϳÀMÄY¬Sgi”š÷ÆJ>YúD¤€ó±cý·Ãçƒ,/É +Z\« +Á‚Á”ÆÌwuÙÞRۚìk3ÓYxwU+F$˜½h%ÔE¯g_#µïvà:Ž×=Ž*>ÛÊýä‚UüždŒÉÓÔh¶ #3‹^Ï,%ÁYhpn¸Ž¿–!²ãÝD:·L¯Óxáã¤bS%› ¢úýˆ4åxxd²j]©‘Ì Bôљ›˜¢€69Tò >Ks³| &ĕB”¦ÅÜ(–ºb“%åÉ÷²bÄôüæF5¿AÜbVGS”xÀó1‚qÄwÈnz ;iWoŽå*?ÍDG”fx6³(—¢‰KO¤ÀWž|¢¨9ԗêyÅxÊlû­—7èŸëëìÌ¡“ÂØîý9˜dsÂÎ2é¤ çTÐOFòž¹6!ãùb:܌.é]ú65 Iê]ÈBn\¶iéøɶ®mKo8’ò§‹ú¬—ÃO +È^¤yäëÈNwÑh½úˆºÞÆ~ÐuÔËxï)e÷ô”k~÷”Ù°5P¥ý@p1UÎÈ÷m„!P4²½ Õº`È©wŒëáς=ð磄 :2ú¹°‡æ_ܦ÷†Uܤ&w;R¾/m{º[[–)"›ŽÊ-ûZRS.©ËD‘âHÌó4&Ä »=" [Iµ…8ô}ÿ­«1wØç¹ ¬þɊB<{ó-ðî^¬ïã>R£¶èx¾ô·†\—¯yý$·ÿ½œUð˜ÃûÈ1~=L}oÐ®pXkzÌÇ-óW‚…ëÖ¬.} `wÃpþýQÐå\P;,uÃï Žm¢¹#=1Êq[W»müçÃòÕ bïÈê4"W^ê[FgM£è–$t×%Qa뺤ÿ’Z®rÜ;î(´>~ä—u»¡9³?ɸY£êeÎð2‰f3ÊÍæ+F†L9A{m¤² †ƒS¤6]5 Aï›úY:fÙ?²šEý !ÙtYJ »Û2ŒJŽÝµÙ‚®ˆ>D¥œVÆ¿7ô¾ß;Kž(óò<‰ÓÝ: µ–«`SGŒVs-/ æZÜsxÄ8öªüÿ²ûvw.ù|ì÷y6´±…Ã^d…·;ÒÏúǤ©¨.H5R:;™E„yf‹hæ^iV«ÑŦ.Â%\‘÷~: ®qÍ>›¨HDB#Bõ£7PJ5Іl(êoŸ’UÆt‚Îlø½!)z“ðڝO%õÃ8FœÇ6õ4>ÕTD”#&Gu¿OÛÕ £X–k=P¨•™ ú4ڞC§Úmu€xG²,uGnÃF‘LfÕ¬Ô_¡¿Ufå”^!©Z÷ 3Ç Ü¯n]£°ºu7XU®ytë¨n]xŒ`›ó1ê&M<¤æÒ¿J R±„1“„ §á,Ų4—´ÖÝ°U)~të ×á9rÕhñֈ (δlà?¥ÀUÑ]7‰Ž—B]g*†\’ÚjÄÈ~nÃÔ=bÎ7ì›Ú¨Gxã´î»ï‘—ÎÔÂÿköÿ¦f7ˆŸ·QÈ¥{Í]Ð"D»RïŽXˆ{’/ïé×fÏÓÚ¶p±XLüç‚}.š‘ó|Ǧú"Ô ºïØÛÉíG(¶ôЉ9Z'Z,5‹Ŕ`ô²*¼…Ìfyvñ¾zVÙK$Fͅ—H¬,-ß4¢ªÅV…µÜ5âˆó®ÐRó¦ð|¼Eá ¬å!K7‰¸žeIÄù7…Ø•¿YT3àó»@܉³SãÃWùžž/îIóúü.XqHI@vџi£´ñ÷Á(e!:ë2$ÊFŸÊq›~ƒyé.{Ep]˜K=1Jd.~-tã?ܼg1Ur‹[«Cw6µ¤ ‰Sª³¦¶‘3w”¿7æ›;Ìk{Exܲ®œj…|í²úw5±nU\$YEqû_ƒa°€Ä±•èƒÔ}R¯îÉo0£R¬Øñ vð÷ä÷hüú£LÖ|}þóªF—­>‘4‚27©$–@FÑ@@дá¤Öúà\Y͌| \l‰Š2‘ò5¹í;m¸7o9Õöϼ\Ã&?ٙ£Fj©Au õŒ|ßF˜…E#{ÕûH‘ô*)ç¿àº÷Z±Gþ` ®ó؟Ûš÷¤SæÅ°KM&%¡’£r$ÄdҖéTL:Ë-{Zü-‡¸ˆ lí-Hmôñ ðšd΁|.<¨Ú@deå@NÑ,gˆ>`E} 7ô³›çLìtaßóëã>R£¶€û{þÛ@Wp|ßÖ¼ ]éûæ¿÷‘³ +Kµþud¿=Œ˜u·ËŽ5+¥E1-r÷ì!˜Ü/ûBq¡É“†_vC‹·ºn·—_x›¼Fº:üµ½YZNØð:œ×¾Ÿ»7UœR?rJ åŒpèԥœMÚct‡{–PäÈ,Θ¨ӒbOúÈ-SðiЯMÌw㯝YÕ+¼“PÂZF Þ«:jL‹®¥¢z¯ø´CÑäwJ~|ýÀWwOO V²ê¿ß«­äÿR^íX’ä8̯Sô¦ŸþŸó¤ÓFõýÝ!R‘Y»ûÖ©”A‰¢(Ü·%Þñ0JŠú+% üG>H ¯ªú[„Ë hݪýCç*’FKš»ýYÊÿŒÛKvãePN²¢á©zŽÄ¹1~ڒö‘!²Ä 7]¸„âíZŽåª f—’ŸWÿ6ÈqáÞ(’™šš …tKŽòCå¯ zœ²lhåzӁè¹t“>2Y³‰f‚{“¿@Hçß)Åøe ’XÈZ˜=Ý"ù:pÅî¤S +Í u ^t¡TÄšhéö¿ y¯À¨×ã˜]kò[bː̀ÓÒb3†¯ªñëË7tWdõp“K‚´õæþ̔ÈJhcy@4Æú%wG֝´ê&Ç „ •…M­¥1]À6‚Ç&Áݹחeù¾,€mgc®gtlŒ„Æ\Ý#à#ņ:Ÿ•o¡´ƒlu =’6n¬(´Ü‹H>Èâîq¨)ÂÂÌÓëÕåZq¶œžtãC ÔÊRBº¶¢Gåð "äÐnºQ&Bí y»BŽ1Ï°Š#ŒL4¾â½yýØÈh¢M÷ PÂd¶‘¼d„È%ÁCˆ[E™ÅÊrÙÐQ3ÿ_m™åC·¶ì +ÃÏçoÐ)ÛI³3cL×ŽFŽt#m=$~íÐM€#½‚î*¡Ü´ŒRÞÏÌ÷5³à*»·\T~˜ÙÞàÅÂ1adnd?(>Ù֞Ôl6B¦€Í³&dƒ¬òçþãLaÇ¡ÍÑ(ü4AVâTö¦~š9VÙö“ý0»#Ì&‹LlÅc}¶]çwédž|Ø'…×’Ós¦°ãmyR b§Ý¬ÈPz'lõÌföê·/¶õUý¶B`í‹kfY¾^+4¾‰kaX„ñÅå·VxžÃ, +˜«ÝOvfÌÏ.¿ÚÖIPî'~)ãöIóRo ¾3Pãë×YÀ^¢‰ókaE¢íkæòÑx;,ìîZgBïÉÌb“-Î1ƒ5³C“XbÍÁ\»`f×Í/úÐÓÚÌ̔Òyéŗ„æs\ø½kÕè§úënÖܝjŽš` 'Õ_)Ð]#ësG”6O¹Ïf!]Ã?ööƒtÛ¸[‡bKûAÚ¬ƒl>Õ̑wíçWïqÜðt$“éj=d‘^gÁªµ¨º.i‡NžÃA*/17úµ + hrEF±™£f +‚ƒX…Öþ@y­ƒl•AÇÑ}€*»þIé×¾h#[µ×7³ +U«fx2½“ è!"™‹µó†ÈO×ð[šLíZÑ\ÉÇî‰Ì͊÷P,\õ IÓėOdBgd~9­—ºPZ‹CÃnË”¤¶:©<ê/^)¼··Ýü–  # Å€ Q¯U²ÃÏîÛډdZáU6¨Û$™éÖ]÷:Ñræ¶)‘ͳJEÏ4 3¼Z^µÀ߁ƒ7¼Áxƒ¶kµ;ð;39½½JŽá”©¡¦4o5;CÕ!gRv"•¢Zä.¿ØÖÙÎLyµû¦9°og>Nwê­7xÎ@—¯#¼…ùêÂÐRs=ò¡ô QT£ÅQðd­lY@ZõÏßàYaç.,™Ækq9{ñ¢{¢ +ړÑ5ºÃéWy&ÅT{’‚UÜjb¡(Iƒ¬Ì…€öY1 h¬VËÁi}¼CKÊBɺF|ƒF)kë2j9èã2¦ñUÒ¢ Ïã¿kÑq´è-Úw½iÑ;‚”êSU;†¾¬f +¼Qй:4^U'G!ûÀvyét­~@-Æëõ‹´ô˜!»&_Èê”D)åM9[;edÕÕß+¸ï%åµù@øò͡»®c¹ô*|k£ùQ¨œ•D§•í +}’C[w»¼“½Aû¸ö º*öLË¢Gû—Äo}ý¤¾:h–ì~#ބÓíV¤-¨ZÞñ‰ðQÀOl¤êüõ-ãz½}ÿŽí¼ã¹ß'Ýf·gº|Kiú­!sʤ ‡¡x§ïبruÑW ÌҐÄ.H.–†-v¡~¶Ndð×E&õ ×_vü}p²ÃS2•Ol]ª¼ó¬ŒÕ÷»þ„—ä|ÿÄ¡íð»»i,õ(H]^f+`´ýCÂXžf6Q¼ÿ3§=ÌüÀۍŠßàÌÜXN,pÍÊÇßÀÉØ·ÆÕXÛ¸k:½E®Éߪ[ ø’¯¯Àöº +[C؁2æ¸UO ×­™â¯îœ[>\å“Î ýãºc³í +Må Þ«´|ýüjܞó±ttö¶“‚e¨çï«ø–þ›¼q«‡«ürZÓg¥mgñåjÝá÷“Øhþâª'ô•‰oаtå%6 +øž|=Yy+.+Äƍ­B1ƒnyä &ôVm‘zû`ƒ;wã’:Մ v ÀέèBª%ŸT`[nõ7 ˜ÙõbaφÄrÀ֒ã7cÂÃ玂|7ÓH3ÖtDµáµHy—°¼;úú’l°ÕÚ!V™Å÷ £r£ ÎrÅòÁ…kïª}µτtŠÒϯv͋9JÒ:, “_ngTKbȓ®­ióbQÙ¸øÎdoHéä#CGýL¢j%o/“&²ìÍþd°£f +I>‹‘Œ¯öøÀªñõ!hý¡ìñ`>/q'œY‹-x1ö>œWš¨£¦v†-¨Ýi„ÚLC'¶ÏكÛË¥†Ý Ùlãê¬ösÕV8fb2åE«É T]ܒ-o¹å=Eë:ˆ.°áÎ\Úë\õ?hûºŸæñßw9 Ѭ^ÏGv°M4òe.ÐÄÚE¼ã”bŒ -=Ü=Ý"ù:x½'gg†ò;°Tp’³ä½óŒ_P YmâV_ã˜]kò[bií°´MrQ¹Åøõå +–Ÿ°z¸É%‘…šóoÀ̼2P¨­gò€hŒõK(Zuµ¾Ziÿ’… Ÿ=}-é¶<þÀæáÜë ’â +°=äÎz!¨üD$4æê¸5Çÿ²_%¹±åHlïSü ØÐ<œ£`` Ò›ºÿ¢dHoJô¶7µ±•CŠ iï:®Qv(q©ÊT››ÙucI¡åZDڃFœw÷ýDùë_6_^µ—K8Žó'5¢ò¾»’¢±M\\û3°"ä7]ø–LÛ úÆ#ä#êbŒÁ„2¾†d÷+Þ²n¯–î;3`F>`¡ðÎ݅‚\ÁT©O“õâVíú”1y`¬¼ Ýô/¯çÝopë÷0×=³*–²ß$ŠJ ›#Þ´ô‹ K’C¾u +(N*ÄÕsÙ¿6ü;Fn¤iúš>PÛ9o•“R•-›j™¯z,§¹ðö©c!=1’*‰!ηðÎXÛÊwíQ®Ck‹Z‡Ø0ƒk˜¦Ìur‹‰-ÿ Â/•=l£é=£œ%Ô8ßËyŸ$ë6YC—wâèå(RhÊwÕz‡‰šM>%õ;ܝµÌ‚—±jz DÓj‹ÿ“èS™¢¿à¼|”ý-uö×oV +½ô¦G='華~zÕ%Ê´ÉëYíeðºðt®ggä{q%PÿÐU&þy8|-¨K“E¬ýÙôµ6¼à3”`ó†|îH‡÷wªH¢dJ9«ÁV/e²ôýýaåÑ*Óh>À¿ÙÁ¾>Ws ‚íÛ«ñÛØ=+Ùí—Õ;p‚›¾È@B Ý!úöC_tdnɼøÿ`PpRέì¿ô÷eºúU¬À§b¯Èë>;Kw  ísZy4CØF([¾´9ÆþK-„èðµ WFì&W§Y[®. ùq—Œ¹¾k« “!¼™’˜Ó¸»/å°MÅï½(Ñ^S3¿Üâ@%âܘ’eÍHDÐÄX†B2;fÃlþÜÒBR3a h½¬ÎàÕÉø8JVíÞ¬w¤é”8-OÿFüŠÓbf·ˆaÕꔳk^ßëŽßт¥„!Rº®Í뫶8šêáæٖÐ Kree¶ö8$YÔÉw;Šç?e¤¿x +E!I¬kÞ¸Y€ÞT¼ôi¢˜ÉOÿÓæV¢ö +U­!RCô­Ì³/üÓ^‹u·š:òIÔb,cß?j>nï쑈åºã(ß0ê8Ç×lÉàk2IpEöàZ>C ±IÞH™ÆC~Ҁdævü6åZ $™1=%1ï§ÕÎ\& Î!,qOu,ÀÚÓ +4D=¾¯=Ï2ؓ·#—pyRX-º,HÒ߅;«)z +Xu›É½\ÿm]á sPjóŽ¼HÄ-êyÉy”¼%›#¾²Rçé×¹œóñÔË´ÅôwA\}Z–Ê7»¼+ú´î|^—O¥›tŸR÷‚EÚxƒ(®Y¦&ª +ō¤ûÂñ+^`kàäºp•Sñ¦SâžVˆyÉE…};xÙªQSM{çMð±ÅRþ,ÃâKmnZ¿ÂˆÕ¶.´·î8õÍ#¸½S<„¬èrIAߌºl“µåA }”ˆ ÷K[6«J[ +ÓÃh¢éÓÙ¡ÖD¿8Úº~H=;GçØÊMŽ.:<ÏÈ'ƒ%©$øZPî’o'„y‡»3«î ÕQ… jß$™Uäú°;y(øÐLEU%“½§\ø` w4|ÿwlyæŽË¦àmÐvþ\°ËÙ¼/£8±gÉ4\Ná󟙢htúÊZš’£v:ž2£Û—ÁøÂ`:ØÍãb²ç Ÿ[§ǻ³½[ùö\Í.5KÚ§Ðùnۈº¨f:ê6ËáîÒ8m!…wTZڏ¶°n£ÄBî%qH'mmâØ¿óŠŒ8°]ôTËÀ ¬%Ñe®–×ÑRp +ú=êÙRMSF¶àÁ˜PyӂS…zµZ~> i@P¢²’ìÓåÍ“qxRFÙ,5Š–ŒJ¾¹ÒèNe|'Ö‹Z:®Òæ4搂fƒ¹gn6ÑTZK˜Î¶hƒ….&Ë6¢v"2kˆ> LžC8©×ÄÚ³ëˆþuÒïsKsô¯ú[~D_C#ž-ÇMcVüž-{bg|Ûr¬}܌Z®l?‰ÑuÀ^!.v°âV3ÓÔ?Q7½ÊU:Š3í1âúú±ŸZfEŸ]^5(µ ¾´ÜÎZdäòĉ²ûµg[ØXuHqâBÌ9Qy‘5·:—Á#+0!ÍScݟ:¥>m¾é•5þÀ(þaÝo0Ðgxø…8 ³ksªÇ’‚Dz(G3Ÿ–½cpÞdyõÙf -Á®Ôø»P،È#Ay#FIl`nµ­'Ö£¹jÛèS惌=šiÒ +bo|$c…9.øZË¿ž“‘IeJ?ÆPʙc|v¬XÉon {u 4ãú Ú ®Aúv¥!/ce_ý?/“}îÙ´’ã°7¾)4nL_ŸRú(B‰3¹1hbxC\»ôãWä‚E8,í`(ˆqøIéïclÈX +Pߤõ“ï‡cÖÞÄ*x'ê¶+Š8¢07̨ ƒÄ·f"7Yâ%€¾_ .êŒTFW´»š½ÀŠ*ªEôÊ´: +*§6fÑ̈4®f¸‹WÚìgôQ1’Ô[µóÌàÌt˜ÿ&ç£ðGòMË$<ÊP3ÂێÝHäÕW)Õnh9PKG(¢\}³û²›=7½4{&Œ³×ïgÛãªÞÄ~n¢¸8¦ÑÊp1V+"¢’-2ÅüY›•N’7^‹òzÏ—€š#:³Ì6ÜB唽$΁prƒàÑ/·™Y +.Y+$æK)¨  éJB)&èåGœ~Ç(g¨s~-P_sø¶uòÕrã¤þ­Öÿ¯jÝ -g,ö}âFOÕ:Ae–‡ÈÄ;#cõÐÊó'vÛܤÙX¥¢3„¡±øAÄS]šh—¼bōª:hý+ælŒ÷ö‚–’2ƒ™ö¤fÞ먬BSÆÒÍ`œ^Þk§ ²­Ë Zc¥v43(ãèf}kv3˜Ovˆ¤x[Û ¦¤U[>™ÁŒ´ygox†»³{Ã+ª9nd”W×.omŸ¨·öx:Ù¦´´Î(‡g›xºRfÆ#β?ž7IÅ»û ºIDv F¼M’Xc´_+טt{x`pSL«âÏ'Æ=ìþ==ñ’¼ûdˆ÷ ­ïÝ +ÿØüÈY§6y\᜕ºdë¬gÞt=Y‚¥Ë +¿ÆûÌEÝøçQL˜æiëڝWYR&ëâb-Yכ=±¿{Å©‡â×ÚåAȺ2.ædܞüéŽ8ž¸Ó±ðV¸‰;†”ÈõÔÿŽQjÛ<­wÃûIu;/î +e7ØLZT¤*ø‘2n³gUM~¤Æ‚’!ÔÜ[ –~USë¤&üçƒÿ'’O #d6À’´¾[^G 8:0 kУ|> + ߄èŠõm ¢Á‚¹­†4!ISÞ.ö÷ÔbWþ_¾«%͙‡íûs‚þx?ΓͿHß;²d ª’™M‚(lŒ1¶ &5¹ˆ(LH™’…‚ûōFw:’o‹f:BÚt6ãNFa Ëp6zbÔ&ê×AU²ö¥ Ð’ $ë2Ë œ ÌD—¬g&“é±]û: ¬9Xg}ý\gê$©Öâ×E¾¤>gPo¥¶?g¶<gú:³w¿ÜfìրWӝuöÃ:÷÷KÔ °W4—z›A]‚fõbSƒFž^ØîD¯œ™p‹éh8X{¼~®3ÆüŽ³‡“ŸcÅZq얆û9lã3—ƒí ݺ٠g‘ÃuGaÛ±“¤œÉeGÍÆkÇ3cíˆÙ´4 Š œ=„出ñ6PâHõ8N}ßUÎ{Æô&½AS1¢$êöÊâóLy&ƒ:„l!TFòy‹»§¾ñëAÅ3½Åfæ;Dޞ+o“>±Ò5󶵓8:å^ëxçéVYLÓÌÚWÃ÷³Ô˜Š'nH4Ρ¨ea–䓨òtŽ¾ÕH[àt("'˓äP-* +§±‰ü+žY"åjaù¶\älüe…dv‘cuUå›áB£Ҋb¤(Ñ-Æá)ÛêÆïÉßèÅ(F}ƒ{µ™>o¸“²äÂbŸ"”E}3 uïéK±ÏHë=ÁRf%î'Pj’8š~I©±Jã­¿‹Ã )jTÏ>~ýàqÔ¹¿¤]Àz±63-1Ž¾(úßFÆW"Y¦º2•i_FñªZ s d +¹”îèt%q9¨—®Tàõãû ÊI]M¤Fë­R¬¢©Fh{«Kw$—4~áT! G¨Ôµ¹ˆÆÒe«„Ú°ÖÑ$ÔÊJ—Æûì‚n‹I\Ìzýà¢s;^uˆx±¶ñÉF'èly\=‘äÚ~pŒ¬1éwJ"÷mqÌs•õÅ-‘ÌÍJ¤G´QƒA§Uz6=}àpO$>ŒöaW‘h¯qÏȸu°ÜäÐ;B¨¯Æö¹Æv‚0#H€Ããqۛ]#²² °Jò;á"(žÔBà¥þF¶rô°àÈà%¶g÷ÕÝ× ƒü–ÕâŒþqÆpi·0¬TÉԂ´ؾlœ½ÖëfõkÌL9JÙßêÊ­”Û¨+t£k +TGIËõK«Æ¼îèßÜ—»ÙJ­q0¦&:®?³ˆ…@( Æ"ßèF¹ÉxB»y~¤`@XÒªâ6=öýµý}¥¤£¥vCîé‚nÏÍÚ¯A’{Þ1ªˆ‚7€XX[כûHcn¹>YH;Åm9ƃӢª‘“ëÔXozÌýÍmq±›¥ÇïxŒÙú +Œ#/Œ–.Y±E Zýs´ä…­óD&c­Ÿ´ +¼¬¦M{ßú†È®GÌÑÒéÐ7”Ü2æfªÂ«Ø&V8ÿ̜–|/½)« ÷1Ÿ0­Ž¬ÀÈÓîÅÚhA½{TZ”ªÊÇ^3ÓÏ°5¡«± ƒWšrct"ÆÌäºfޗë0ØODÛj~A[KJt4¯ô‰ϐšúïH…»­™†$8(×Á"¾ÏHÊví˜_¾Ì€ùÏáû'«­Ÿ3%’2ëdV¾Ì©h‰v|Y»›«A¹Àœ¢|¢´º©IO¯ïÆ|[ãÙ;®¡ójR+·ðm$fÃ4Á°u¸%Zߚ6FÃÌ(é²bªWÚÖ&qf&ëÖPPëçÙBðõ³mXߏÑ¿i]Å>V:—c ‡™P¦®Ïžæ9–°m +¢ÚeE%ã=>Çò™Ø´n pw×9–#hÅZ±¬\çÐÕØB3Î}a9íÓš?'ôI¦cDI”í1*ŸE |(‰<= +P‘‡cÂYgï©müì©@DqҘhhìzŽ¬ØÝ ‡¤Öëœâ²7²ìHŽqEFðGSs´†ÿ@µƒ%:´ÈJÐV óª‘ ³Å” ÃùŠlÔƖt$µL²ŽÛ ÿ¦dáµ.½Bä’ÜUxÛg‚7cx§TíáÚdK£Hˆg !š“{Û_ÑØÕ¶Ú¦;ÎÌKÔ~æ­WÈún*èæHîf*«wîC´²Š7%Õ¤‘Nõ!\Ã+)ÉöZ3l[ýÍ<{ï±o,µ#’¶ 9«ÊH…Õ± ²ÌØÒö~ªvçÅëQ‹d¼|n„ŒRd‡¸Ž›.K-ü>»Çbï&ÕÉ'Ug¸D{%£²`×zçà c“õ„‹à‡3ü璸Ô:ŽFØ·ÜE2ò·µy>î©ï…ÀB‚ˆV¯%`²`qÁ*zloãì¾-ƒÀ©u&…ÖÖڍ^lªQµu 0<+ö¦"9z;±*fj&•~¢Ò¬ã0 T{r\­C™ì±t¡u$¸¬õÃ:Êüµ–Ójag,YÈ"O±ÿ|JaA&/c­ÞfÄ[JQ°pBvŽÃÅë”aXU`QM—™ïÿhXX{HB3¨x.[pƊ½‡c“p+öŠeåÒp?‡I4/¯¸%|±“õßYæžyŸ™l>%YR_f:ÿ5g~ÌX/ÀêcU֔x +Ë>Ž°`½ÓY¡'›E’7<‡Ñ„yØÈÆ/Žér'Â/Þb×°PE:×Lí3váæ.Ÿy?‹]ëAd°w¸ü»À.'(ÄW;–¼9ý ⻝Ũ_/”ý³üfÏğàß.P»TÎÂô+ËUl C÷ÂW¦r]²cA6(÷—*C½ç`~.½.Äj2ãÆ{õT:ò%¦ä÷2yÁlœT—ý  MjcŸlé{±hÆáòO´z°U6Š7'ÃlOÃÙ+ªãr€ŽãÅË„—ÉئŒÚ½çrÐ@¸Jï-ã•üX tòÃrˆî$äF®SÅÓòü¿ŒˆØÜáf¦Šð¤þ JŠwÌøÈD0X1ËR~«¡Ñi\mÎf%³¼!_nD‡fU8Ãï…ahö’ÝÙTÞ õîýl„þ!+bŒ*< <«”xÁë踅Õ]ÄdüæÊESÜ\4ÅÿÁE{.zEF£fQÅ^Ã?›Òؓù[‰/éäÖÃ>!ôŽä¯àK/,(å¹â\ƒÍÝ蜃)‘å%[ +Ίs®Î `”ç“sõ¾(5ŸVŸÌ$~'°À)H¬y(ÌNê Â"6¡öòK{B,NùÀø©Åb3ù)¾0®a=Xõr]Ûå‰;HhþFÄ£o!ߧpŸñcùz€cŽO,n|Ö?±¼yÝîÎ Š œÖ­¶!#iüæõÆÇ©È¿·†…Y +’úZ«>/´haá9 Ùe7=e¡—½¡®,ß³§8bŽ.“æ'Fp0æ-I« ݱò0×·øڂ¾úw&53K±Ö;¶²hH!Ž„"…_e¶“‹[F´ýÿ\Ú¼åâÞµzåâüš‹ ÞݖGוFěÍÆpíµUג57–‹áŽ#ïß"+¨=S÷É}„hR sE] sK:Úû{Ÿ%Á(–"­4Þ¶ôo²Æ¥n¦ê˜ìøæôì8csø>КšnÔî }1ˆˆQÃ;DTtOˆ]œ­«;5A˜…¡WÇì×y³ŒR®ÈÎÙWy’Ž4́õ]C—`éLüˈ¼]s ߂¼Þ]êoÁˆÊÆëÓHŒñš#ÛØ]]ý ’IZoˆàõ‚^ÌEϔ:Gbó¿|WIŽ$9»×+êYо¼cžh Ž¾ÌÿÃE’»G$æ’)*\»I‹7ª]¯‘÷-~/UEfõ&á\Ö3H*ã¹Ó¶™ni¿Ø-‡=ˆyR¹vf?ãXÉõæo¨Gò–s£sÞº¤¬Ö¾y¤3ãžÔ@§íõü–äw¢ÎKlRýù-gQ¥éaø3ˆòt¶à¯„ûžóA_ º¶è‹Í¯cxëQîØrp>ƒ¸¾¹Ùknòjöé9™»¡ÏyQ%ï¼5ÙEz¢/ëºÈå£nµ9OrԃŒ¨×d.ð’YÿÀRšw‚„ž·¼Ìý— F€I[Ù¦fܛKbXW¸:9%©Ï(ì›Z0«åô•`œkw›Gèqük€š×¥sí?­+˃B•ßŒÝdÃY~ªÞBS”VN;-2ƜŸ$ܗ&¨DzÊÞóõŸÍÜ `leã]»Å%• DYэ«Ïß{`9ìi\kÅ~~…gõ¯¹Ð™÷à&në+ØZþýÜ­¦M¶k­'§äiã×ÁUAe-íÛa½Î|_÷ƒ0hÌ(–#½lüÕMáˆ%DÂFç /ã⑸œöA $(söý[†\Ã:“.¼–ôÀ½Çf­ÔVøÄ ûiiÃ׆Q´ìzkÌwȘ™V‘:Ó;<c¡Üüˆñ"ன1=çü•O­?Tþ·C:*ÿ€?)íOœ²˜iÈ&¢âµ×Oúìƒ.rÚ[±h°³s™GZÖ¹Uš?•¬R]AÝzÜH¯ŸGÚøµ±eÅfŒïGŒÙÉ-oøy¡( +mŠ €i ŠZ‹cnH¥‡¢'m¡(‚öˆÕÖ¢íÝÍÏ¿î3}í©¼ÈþmšäÍfäÄjÒX§â/›Ñ£Í ú +K ³Öó߈øç1]…kÁûÆ ×Ê͵ ¼™ft&2©ÏÓ¦8ɃwZ V‰øzäUŸìªÅÎ!Ä«l1\Œ‰ÝdJøSËÕ ‹ +5=ókÕ:p™8w[î#à†ôd!m„?d¤º}‰™Ù-©@B7¾q-l³æâý,”{|7~e1Wšç¹Ú¸¿Ò-“Y!ÃÃ],Í$ÁMà«"ñ1þÁæ‰„¬xX&WK÷È®PסÃV$Çñ>T˜§ìV­»C˜¸<_n×o³ŸjoX®>y6ם&7üˆˆú²%¦åW[dXêØÀ¹17 ¢”΍6­¤âÉG»[ððÛVñ0çöà«ñY”eHùh֍à\¶Ïé."ˆr¥Þ~©Ùgz£›ÿ0¹ÄP¦†u˔·…ïaêøØüTé‘\?Ù³²†Y‹hŸ±Ïýn7ð7¹k[ԁµ‡ÖiÎB]DÏuaիêMºÉt܅ÁN:£=ý´Â¦|vþD˜§*Õ±á9î0úMÿ€¥^Çë® —©ö-Ëô¦¼‘NÁî_ϽNËËu˟ÑѱcyBnð¸õ¶ßlèÆZNm:Sê‡.B°tŠ&}‚sš_•Ì‡Œ‘Û×|‚;¼¼,&éä[µ¿Wĕd«ü«u·}±.|Gáà0ÏEa¦t—çÃ.ˆ×Ãp³q^b fÌX]þ© øR˜Òþµk¨ZÝ[Ù •ˆm¦Ÿ±bîÌ[ +ÁêhÔ¥†[ôº­Å6Ҝi‡Ñió‚ÙÌÁË'‘Ð…È4Réuï$Í ñ8 `™×²ñ’.¸?WÓ|։þù•|ÆÄÉku¦Þ¼ýþï_ç÷è0Y3ˆ‡ ".åÑÓaÆIG`‹€LàÜ<à§Á”¤¯F)þÅ/ÆÌRçxXÎ1Ë°^ODpNkLæœHÎ:4g­žïH‚Á•Á0ÈÑM3tÆæ Uá4íè‰Ý4ZrѪ|ì®Y«ÎA^Š:I+7è£zÑ݃4»þÐà aȲÏ´ÂæÙsu]«{øR·ØÃ1"Ë?~î,Ï4gyÊgçÛ=Ñ×&Æðhò5];Ú¶—±f "¤âß ŠZÁ¦Eu]š+l6°Š—y~ÄÛ¥kàAÃË«¶Z#ñDiϪ¶Õˆ+ +®½xÐcŸÌèÂU÷¶DnûÞI3^ãØó¨vJbxuÛèlza8'ºDv[oËGç ×V<ê±M žôd¿´4&‘<+(s[ÍzG{Œ,òE†‘°$Ù4¡>u[ª_0dê[Ôm]’EeQŲ„²}6«¬Mm:Ö`,ü±q¨`ólôÚÈÃlG%¸¿…W,ñ†’«4@Mš¹J…šôî]Vü£° ¤¼‡èˆ‚s˂/Öp+ðß`–ôiý1? +×ÛÇO¸œ=®ÃWGõïÁdªÄ¥ ?§N0«*À—IQ  tšAžˆ’‡¤&ò¦ajA©Ó<²`&½cõsVè%Fæ¦P-F#´USÒ=g«iDE­^O–urªþF>Ÿ×‚ÜâÚ¡N·±Ÿ¢Ä"ó~“ Æ ®ü¹Ø¿[.Ç%â!¾ì!û°—Á +aõ¼N$ +‘ÝÔãQ?õ ÿ×(:*|Éuu„枎]•0±y>L´pŽ‘Pd™}ºš€ÁG͈kÖ-q@‡D[•R·µ´,GÒ4‡ä8=iîšÂ‹â1îp¬âñÑÓt4LÊwü©gþi/ãQï=T•1§z&$¯üÐs…kŒµþØs­¾GýØ#ç{õà˜`Þ}šÑ.r{®ªúõêA¸öý^”êŸz†(ýþì»ç©‹(X!ï´í“o•o!©›¦M|“^/ï0Êᄂ§ný͟j5Ï×b ¼àkCä—$‰bùÄI,ò:³mL…%O~±ôL4i­&­®dz㾜Y8L`YÇí¤Qº–~WÕ#Ó[é#«Z¼>ƒØÁØá}â$ݕW×‚ _«Z®Uß1tRþgM·áߖ°ÁR$™Y‹ä#áɨAw”H87W£'SÞLR¬^֕Ç,ÚÊI¢Ÿ"¬šñ‚J—bÕDŠõ´àkCíàõ)î%¹"ôi)ç÷&±µ¼<-€!Ù̺–æ^aa;†ºñ ÏÆ?7`+õÔg×eáˆ[Ü-\c—ßÈÎÑK2WP‡Ë(ö’{beÁ[2Je‘ˆ6Ÿ‘Y\µµƒ_õšÿ·D诨ÀëºÔ}sŸª´’OlâéPíC{¬:®þ¼+÷È*ȹŒµn.¦ÔI5µ\¦x↕¢ñ³fYXüܦ˜˜?ˆ ëÿWÊã’ib¼f¡¬Ë"}‡¶õî# 5”S,QÅï$IRKÂýSßescJW–ãxMÒ&›i©Z)W£Ã÷†¨æ³¹UE6ü«{^þaÁž$)JøLE¤Ÿp¥Í~iàFÃʦcü‹¶G¢>fªÑÒB¯e´üGÇÞ¢µi‡²fNªtþÐ⌥ëÐpÀijQøŽyYg$îàϙ—HëtóVþë´2«‘ù¼kÕ=RÝâÕ۞ýzúŽA*æ&)—Èqqìã7¤u¨œ×¯mù!t´ÏÉ1^uv/dìWϼ†tüÁèC¿zD>òï9<ÎBOD®´P‰¿©ª£]ZÜhŸ“ã 1î#¡nÂ>&º©PãúÍ­ÛOØ'uìKÚÀÎ-XË32UÐÉ÷¿ô–BoG0…9Sêô;´czyá|Àݙ‹,`o¿z>xj։IOò›Þ3 ÓÛ#É#¢4F샶É[Þ§¥c*s‘%w~jX^åñ̼Z~4ÓL¦âþç҂ÀÌ&ˆ:Ò-6Š«A· >·ô˜Öú¸O-8ðV4 +™Ö>·ìQoKûøÔb«ó¨Q*pÐÙÎ$ö§ÁÚ?S +‹3KĶ².¦¤rm`ÁúCԊERьw +hƒÎÐÒ¨vØО`A[€V “jü9ÀÈ@{Ÿ% ¿¾N«‡‡¸&¸mýäIñlj·@þM+HõxYQ ’ òùYú½àÙÒj)Œhï’-gÃv÷Øú -Ø5ø‰2WXe¶ÝÀE樆ñ8E§on}ø¹(ó@ÜÅrî4Û{I#ë$# q­Úik?­UÉPp­U… |!r$^>⅟ Ž–äxΞkk®½ÇI°˜Cò¯î`.%!‰ÿY՜©5n† Õê:́ +UÓú‘ú td³ª¯ã­®k_êξEeZQp‡Öâ،5Ë Û!js§4ÍUåŸôâó×Å57ë7ØÛQ×°…vЎAÍEÑ·kf›3yæùzK€+ º)lf+Öh"‰Š‘ß%f۔ÍÓd¤Yƒ6Š…]Ì–ލ‘ŒÙM:„œ—‰3™1$¢“R’ë7q]ïŠl +ÊÜæòi¯/GŒ/é䔟©âíÐï R$)_*OŒÍTPì¬#žÒß:ƒQQ‡t=9Ž{IE)n_ì|V·=ÑRõá|þø8Ⱦ2Î|Μ6îŽ02rN| ø”6wÏ'bF³çÈõ‚’(¿þ æÂÜaúÞÔ§g‹ +#áy ò“žŽ%0˜–Íë$7¥¾$#pa¤'ÔÄQD#!$t¤ ‰H.dOSMÖF ­mÙÁm‘Q&ª‘+sû÷!aH~ë÷C~¼ŒÍPën-¬|(ªÀ=‘jŠßƒÁ—ú‡XÏïY'|†/l pÀjá£+θE¼´³‚a[ÂB8=,Ä3ÃuA1úñ}âc–Õð> 8**÷÷ó»ë̽%‰‚®-aXl"Œºb20P'În ÛþS¹t@!rR+åÀ³oó;Ïdû¨µ_¦7ÌþÈ Òꁋ‰¦#ŽÓÄBð€Ö6­åýä¸ÒÌmh×#ÑÃlŽ *†Á\uÕ+/89ý€½îhæÊrXb£ŠT«´A¤ÿm¯…®dªŒÏ·GÁK4`,ւ•]Ö«F¬âS¥©T¡DS•¯ÞJrHyá÷Âã꾧ñ@è:|F»àCœæ*ÍsÀ)ælá˔±ö4ù¸bÑ/¯Ç"à´¡(f*{My¶vÐ%¯Î }†WÌX(÷Ú;°€ÏlИø>” ÄqU<‘¦Æ?¿‹ª™N©gß0®–Óý?f²9[6è4ñò‡D>‹÷"Z;k^8³·»ª1±‚›¶Ø”A)Ir°”~m`™^òB:ÏÒ7~/ŒúZ¢M5gB¼èÖ½óˆOfˆž0µ?-©ßw»à¯»èxãÝtxÊà°ÿ!>ãŸÑÅç(õ">¯‘,¶ö¯Ÿ/c8 +­¥â‘>½¸pIù7Æ©~ç4w¿°M§ËâzexwÉ¥ËÕ-õܯzkH#‘cLoå¹¼Ó E{8Ò­¼ ê-“uÐ[]r‡äþ/ûU’I’ÃîzE} d¾/ï‘õi¤Kÿÿ0@ƒ™¥š6«¾ÍErdøB§“ (37UÐÊÏ«S‚˜s`»®\™QK(¬±¡&0A«á”5 +²ÅìÚ¯ô–1·¹a«L/¨‰xÖïf1¦žõ [I”Œ4’ò3¶ù1øÐ_àä­IÌę´{ž÷€“Ò»…‚‘¡Û!ãÉôH÷4oxÌGŒBÕELÜ%0kAK,2³v¥íØ~œU9>x"AÖ]1…Sj?l¯Ñ¶ÀÎègjzZ3Ò~ƈQŸ?ëxƕrþœÿŒ'Ó—PÃ6½sBòŸ^Ôº¥ü*`ö8)y¬¾CÉ©•%ß°yôNÉõ·”ÜtôUY2ز%ÑÝùÄ.;`&®¹ã›)«\b•€oùñvâ ßh2¸ÖØÔû@œ_ã¶7§§©j/K»˜î8«olÔßìÔÎs„hÓåøjL¼÷±ÒÑqŽ°QLc`baf‹á» +Ðxéßd¯º™Ê™è,ì×ÔE•ÐA‚Ÿ•¼óañÉVñÛjP™ŸqŠ£ÇÀëɂ=´üêP“'SY2“ÖñhO˜y{„@à ·2K`Tõ\B-1 ÑÕª€hڂˆ%Ë €FU|(gk¯fc:“³"W• J-ÒXûÑÉ®5ÉØZõS]§oéˆòçÅWY+¯f~x…¥S¿ÞŽšU¼Üž£|roOí†×Kôvi?x8ÌB;áa҆C ¶¾½ô8®*h{eªv¬Róê;­Éê²ã›è¿ª„5Z*Ø/˜|„«àNûEUu¢AÓ éé.a²…VPWUíéT%j¿áFwL€¿ .»‘ÅîW@ÌoÊ~æÛÑXdð¬â§/ÉÁ~_…o¹‡â$ÑÏPµ¶QÉÞ\ i‚ÌÚVÚ:^ÒT¼º’–øxæm[Š§¦ +”ø= u°u 2“Ú’ϸUÀ§'Øà,ryâzùòM>€^E¬† +2r3†zÆ/³-Ûë›Ǘ¢€¾²×{㪠1ÀÁG˜M‰ÃËöñzŲ㓁ُE'ŽœJLëLCŒ{ + %yœ ÂU7¹£Xú+ ­ž5PÈsû]~D~€ÁµDcíöñ¨såd9³oÅáqûhte kÎÕ²7äg=}ë°Z»„­º(§÷Žï¦^K¬ t8ãÀì·|e~'os×,ò‰ðæfåǛjBO£ŸJEŠ©$µyÃNÍâé:´>o‰RÅã°jˆì3ÉËAøÊ¡)`?ò Íír×kŒkŒâ@­€VÔÇ+"FF9›Šo¬½iFVlü]7•G…jpt\ıU”Á.§S%×røG€žL#>yTúª#F}OÇ~"ׅ17S¥OȽ0{šã>XÀŽ!$ª¡,ÑՊà1GxŠìléƒÇC©_ý¶Ô—9n¥þ†[ˆÕ(õ7ø²ÔÛE=§ÐèÆ?$«4³Gº"‘UêdDKue· ýšŠßڝnÐ6ªSD‰xæËHÂ?¯ÀŸ­ÌTïûèÐ&Ïå¾ë€Ïµ¸ìvï<–mo^¨BEVâ%Š4²Kc$(J¡Lù­>挭V©“6)@՞ç©*=’‹‰›ÀâÄ1ˆï?WÙQÑZ_äÜQ{ÛUvtFƒ]<ã1S>†ŒžäO {´JÓlv§RJþ_uژ[ð3 SœemÓ©ÙìÐ÷ę3Kì-„Pd7td ÏóPØ7Tú©±^¤>|ÄIŽ_h¯f«Ø'k <潁JbБGœ‚7¨þÎß,ù֌UÉó^ î°”Ysìçˆ^ÃaŽS,Ò[‚§ª³a<«w›ðMÑVØQ€6½^ß4Z‹E' E„‰>ŸÂâ4OˆWiž]ÞéÌv¬ ë>ž|Lõa”·Ñ{¾š†ôpMˍÓôÚÉ›·”jì[Â*ÙØû±nô~NV¦Å÷“œK4ÐfÚ#ð2|´Ö8m0ɵÄÆ=|_cŸ½NŒû$de‚Ek¹Lm¥œ›ôr1Áʃ}Ë¿$5bSH†…m¦YpC™Ï4v'J|ìBe³™k㥳m霚~"m¤Ã5s(¢Ñ:Ú%éŠ,v‚Æ:ŽÎ +­€ÏY´A‘åå ×%?'r,œM¡Aõ ×b‘-Ž¤Mï™Úmçìcæ=ù¨ª1HÒ´EÅT X$¡e¯­jå Úä½O˜xuH2J¨šÈ,i€Sj.Nyx½7IåÄÁaœ–¾ñ[·¸*E¼§1ê…},(Xì-º£Ÿ¢Ì ,êüšl¯0Š™ £†âBßÀžˆKÎ[S¯¤NÓ7å\6¹¬ë²ëK|ã«0³_ÐAßV½íão(·C¹ëJ¹ãJ¹ã¤Üq£Üõ-åö?M¹ý¤Üu2î +Â]7¾í–o˜ü—‡åö-‘ZÖïQ¨ ւ,½\Ԉî}‚ÌÎÑ¡Ò N’òŠxlæˆG®Æ×$JáÂÏ23âԂé+¹{yíéÈvP7ë¼Åy†gÑÚN&´,ÕA08Ëô¨ë<2ß¿A'¢Ù’,¬yQ7 Y€…Ò ¨\.Iؒ”­»0¼Ss¤ü6öÜÍÇ*4GæCž1óÊ –vJƒiŸ}žÒrUñÛùÏ+4/‘ÇùUn„×qÚÅÅρ1MG#—,0j¶âs ŒÂz%;*ZST3X³‹×Å +Ç´!¥é_PIð%ŸÀ&w`@ñ oí05K I1–óëá3|Pª§oýP/úSéf9¡îjB€ϲâ›*’*„™EÃ×ļd¿Öp°o]ù¾W䱧Þ7X"àõ¾ë@N¶0E<ÉúÊ^iÔ·弨@P–~-×><î´ ÊVÝsÉȓzSYsG †Á&®s•¢€x‚«l®ªpY›õ¾[Ž*ÿý¡êö÷_ü>—%qAqÜvòù‹½ˆ]‡;Xƒ\-)êV7ò­rÛ/ÕWČnápîXghEü2-¦Ï­<Ïþx;­ˆ§ÝÚá~¸úêhË¢ ®úgb§ßÅÎü•Ø¹iõokCϼÐ:ù¢uú¾ˆz;õ;‹‡ë±êÓ5@G ¿i»‘ú¯-Õ3&…nã„Ðþ I%Š¯H‹…>tq”€^¹LÉ狌2Ež."+&§søt© +žìå’íBÑÛi*ÓziÐ0VgTŽ;¬-®\UB¡s+B½ñÝÕ·ì¾.£#mk\KŒ"”ý–UÕ»Mºo°©-‰*Fuu΁ÖÚ}|Ã×6Á6°|3?ÙY»þBøo„ß¾ +¿y~ó~ó&üö·Âoüiá7NáGk]ù‘€?" /ÚoüYí×*È|ÿØÛDæœ÷ +ü`)£>ÂêÑ)Å¥Ô + Ó¨Ÿ?]ßÜQÌÌl0î(Ž8Ó¡…©å +ûÛ ±ÐΧ®…ò%Õ~~ó^g™íà~YgëŠ*© WäR÷Xå«Uîö€—)ý€)”ÏËƺÝÔ ëÿÇÿZw“ŠÝÑâ8Õ}£ÕZ¥šbª–ºRo§"i•t£”ºšeù´Jå—Ç1‹„ + Ê`º¶àýFR÷A‹HCx~Ãù¨Œº¡,ÓQ[)JꀚE"šZHNcûñ¿ìWKv7Üû¼€ø€ÄÿF^È÷ßNFDUÝ$=²Æš'Ë\AT£P@f|S4¦Þû;…|/ }7;x¿֞µÉ”Cú±%ˆ9¾¾šw¬«1vŒâ‚ý,>.Õb\è°G¡4ÉðÅÆzrÊìÝÚ¹Güõ¯ï2Œ|`u4þììʵb,áŠh»³ñ"æ°ëŽ&ý¿w¬úð8íöA67_Ù¿Ò .ꃈ;¿+ᶇ„{òn$\{H¸OÅX÷„»þ{ÂíߕpË-á®Ç„;îº'ÜqO¸öaÂ-·„[nyL¸ù1á–Ç„;¿?ᎇ„{‚âýˆß&\н[øœŒ>껬ùüȚÿŸ½yùo^½yý6oޙxÜ6L¿h{ȎH/N§g4Nâá$mÊØöYC j²cW¸Ë=Fâ! ïM~jB¹uyѹeÚ|ìqfTÊØøÎ=ÞÄ¥/\~$Ø\õâ¢%H}Ï(F–7HWËÔ¶Rñœ }®_?gZâç’*[ûj9жR<$™¬Ñ;2n,S32©žÈ/R¼ð8)|;Š“C_¡ˆNëW€áÕO~nïpWòG€i³Xù€LÙOëÝCÉ?YÌ?®Ky+<׆^é;Œ°3è¼Ve»âú¿þæ!ióÊ&ØûMºLI«v—H,à·DŒ1^-wT)CBûõ%*6å±LçGÙ®1r¡¤C2º(=kðy§\éGh¨ËÒ&¢uy7|“Ú¡j³gÀy¡>ïE)8 +ãÕ +Yؑ¡ºì”ŠÑb¼w,ä÷›-ŒÀa°TÑEG³Ÿ÷¾9»YPŸòµ£Ôñ(ªâ—²Ø2< Ú©Ó.Ô}_ûm “ÃWh,ûˆÑ—ýï!Ž¯ϋϲz²I Ï\äs[[ïôlèôú ôòßôçŸ6Ú6ÚÏ6ÚCØhïUËj^Ii|“k@*¼¹† ‡ØRE»]x»†8´í'P¼~zT³ZD<µÔÀ•u4›¨›¡^œ<>Nútù%oèû25i^® xë›]AMpƒ¥×áðKO¯«4ò­ñ.,·4¬‹jÆ9,,-k‡Ëô‡~G¡¤ÅBFúcãS‹É˓ÑV‹BË +ÊYêýÇe¦"y˜­JÈz :"7N•N—-¦sn"©šXµ +¦–^H]‘Æ™…išüÉÂÞÒ Ë]~ŸsF-!ù§År†ÕÄy +ÁÑàR3ë-œƒË¸›—Çc|®ðê4¸¬VZšŸaéG†¥šº'Rœò¯–ìOÂҙû[ÂR͙¦páø ˜ÃØã2,ô ãËÓ5§†ÿE÷oòý¼ ¯rywóc¾z£ æûësÔ¼0òËe¸ò±_Çû¢çÅÏZ RÙöùKŠ–߄Ǿ~'ÿÝ°1¬ú•$È!ÌôÿŸ¤\=Î1ÀèÐl:/ëPvËgîüB‹ yUã~<«åûq?6÷Bïí¼|ÿBãIQ(Ñõwr‚êki¼÷3ûé³ÆóŽ-T}AÜ}f?=¤B›V®"-©…(5%z(Àn¢€Ñ*,Gà_\®.êΑýê“'XÈV:ÿ%«4­¬¹»H@]”7Œ.2f×ø:ÙæÓFû}é¾)>CBpÛäšTçxHZš,ØE®wXNH5j /BoÚ1Ï¡?¢ý$”n<¡ý +=ùˆÂKÜ`ë8…®R^¼¹<—ŽK>@sMæpR¨Öäï47e±»ÑÀ›,¹ê‚A€üÐLۅ¾—ƒª5÷¼Îà¿è÷ŸáŒ‹¯=S£M®£G›,ò+ Ì<¤Ó%•—ía i“9'™eðì•#,{J[TÈxRÑf4z(8f)ïXو>¬-ۘ™-_LÆÑèºÂ„â[pI:]Á²îÐ ;œÚ¶p¶+.À ¤HWª¬qD<~ø úHãA}‘C ¤»0=q—Ÿ'I3Íy²÷½»;ÀðÌ¿a¨bP† yÍ¿ôFîJ«èr”l§&º ¤Še*’¸ÉY‘UzÑnMÛ£Ìñ\¿_Ž)ƒ/¬Ê\*ŸÊ`¹àfÅYãQ·²ÂÉ.?:z2W5þc¼0õ=c\_Êà‚P`­k™ÚÖÊyR3 ¾raãL£ïhT&Œ¹Ë–mFá!‰kFˆ…qchP ó¤ª[ô…zá!”r¼OÂô’©z‰m†+À‡@&?·÷ ¸+Ñ`Úi¥|ÔØ9?ÝÑ÷º£ +¯SiŽZï勝&Ýúîþ̽iÇêÛF½þmë¹ñ®(7_ÏìNÜp̍£HVx—ŠUÇ\óEFH3ª_ÜQî7„3%geÑ4Š˜"Ë«}ÆÆóüzžÆÍë70ËæŸçýr}‹5lܞ?ïÏ» ¡r§7Åv-NÀ6àˆÈc.Mˆve¼Êœ(}¾—<ø¯-ŠfY«<‰ædt™)F¯Tlòº1XqÎÙjŽý+¤‡¦ô=&ðˆ`É{½@üŽ®{NûGG"˨* C`ïŒÇ+ +pÁš{À1°ŠØ2Ô³ÚÄþåÞݛök|ô‚B}¯_À-¬Ó^ç•M.8ÊVxñ¸Ö̐³h"ñƒôcÉ×I&ÞkÝ®ìñ¥O&š£H&¾íTw28ÉD0’ Ìã&~‘#_Ád¿.]÷µÙ)®ŸžùÇyæ6_gíÓYý;U÷}o¾ŸÑY=ou¸>1Ýù9–ú´Ý‘ø¢wD7ðMë(üJLœ3^tü*€ØC°ˆÒ[hsX†Ð` éŠNûGa +_Û  ø5ýq¡ÔpV%Ž¼´‚<(ÄMšb0Õ¿´užVùuôXšË5öŽà +'ÈLfR¤i7Ô{ˆ6±Ç-é°1‹5ñ<Š:ã5Rýð¹æÐë‡/ýÇ ë¼›Bá:pãGü2`«BÀOªé—ôcE yÛìTìDQ&ëé•IvÆG7naÄB®V¡Ú·)O•m£¨ˆ&³>ÉÃ.ãd©|ÕWËá[pŒ1§’Ïô_(º"wWêOס¯¥ +•îHÝCîö^£¡³ã/z˜z*8åÕÂöÞöøålòˆF̶vw` Û8>>»LnjŒ“ní†ðˆw»¢}JpJ*SӐ|ê¬ã#Û}»JÆÎÏèô߄X°j ê/ỨEB±‘3%X¹Æc¾a—ƒØ?]ðtÁ£»”ŽÏ¤ñ#ÏxBàÊøÛDrÝEr]"¹>EòS$?Eò_&’}“™VBé_äÒü +ŠÕïãáê¼Cã=Eê-…ñ°µ 0tOšvgšh3†˜hjy6»ÿÉv~5ø«ÖÇ JEœcí­þ~è˜Ãã”÷4˙˞4«(» FC•‰å@åÁ\Ç9Â\ƒßMÝó;&-Å¥Õ¥8‰-"Ƹ¸by«X&è[A•½Þ¯1Ž=Ž)`nliú¦èÄJŸª ì*0û¿-éUb6þ–Ñph‡H•³ºcü„ 2 ‘qÜç #oñéÕEÀcß^­ÎÊ¢¶¶›ÈôÎÆÁeIÑÃ1¾½ÊõZ’Wõ_ºõ/EÝú¿GÝJjí§$K±ò¶!™µ]ˆ$AÈ¥Ä@¸ƒâ¥ƒ2¦§V‰b‡_õ…ÚAÕP6K¾˜lÐ¦k:&ŽÃÞ\î+oúƒ½Ò÷r&ËuCçœ5·>ùJÅ „+£¤k,îsU)ÛÂÇ×yÜzàòNi›DÛÎ5ÿþQÏWke~šÒhJׂq©O¢Àëˆ)sIÊPÄä[($N͊ý +.g–óÚcVÕØÈÏ\Lf€Õç„OÞt½luÏï¤?rÌÿa¿jvôÈqØ=OÑ/†mù÷y‚ö¹ÌûV$å*Ww'v&v7—nó«*[¶%Š´kºæº§k^!œ®Ö=vV'ñ¬þ6zµUÖ;˜I¤D‹òƒqY¥è}»¾ª™`ŒQ¹§ÝÕQƒÅ’†¶B¸WóBÎõ܋Ôâ!oµBè^]G0±‡iõhà{õ€{¹tÿõ&ZZ.`̟«ä6>Êdn}¼†Äí8¡æ›Õ/Õëw´r–md:2§“³'‰Ù­ÅÅJ›bSÀó³c—0 {Œ®FZ¥ÞÊ<ºÝ +®$ÈT|ºGM&öGݍ`ùE§þ…¹«/º&± Ú«œ‘¥=±=ZOa› +‹ßä³Q$,¼×·;-ƌ²å@¾=®ÂCÂPº’}¨00ØÙ>4 NÎÜׂ™jÍt*(\ï)Ê$Ç`#L¥Éíö¾£’ ýK™÷m·<<Y»"›Ÿ¬]TUÑɉ¦‹¡þ€aØ|V¢­µðW .9$±?š22«‰ YÝaõòÁÄB¤Ý&’˜ô»Ð1µÞ<žx“¸a¹ÀHyφ:Ž2X',4MS‘!„+,H?yÒHŠ +E]^¶Öeñ.vš Úp8(lyÚF:°Sƒué·õÆ+ס©^¾nè¦$bë~W×iÑìîúFp×߂ûÇw}îëßÕhñ¼~WŖCÄö‡ˆµCĎCÄÚCÄ®‡ˆm‡ˆµCÄî±Dìs«ó±ó±ó±óÔ°—4“†½$m‘õ¼5ìxjØ7"ÖN;N›*¶~GÄú}ˆ‘ÓÎó£ÿõ‡?ﯫƒ#]L¤ìÇ~ÿâåWqC>ƒ·$à2±ÁþÂ5Ø÷Ž7 ¡Î„µ†¾Ø¿ôøB3HÅÜkë E±ß¸ãÖ Ï}`÷g–¹°H ßâòÿV\šç@¿¢i´7M£ýn?Ö4Ú£i´o6 +E¼æß*ç9r.ã*gÜò]ÎcíÊ4éÖ_Œwý¼sþ-¼K€p—@ív—À”õ¸K %ÐÖß.ê´Úƒ™ÿ U'd¨zƒ—Õ:'¬”´Øï?¤©çL‚¢o¯yfÁÞи—žZ˜|Y¶ù,âđӘð“Õæ1ò¹fY„ÕOá‚y÷ۙ[äGQB B[ÈÊÊÌPäN—¢ÏÚ'~ë÷"é¾;¬6Ø?:Œ >tË* ®e¬ýÌÏ4dÇØ é¥©=Æ|Ú#滄I,8í.ïa£2¸†sQ“䊷û¬3L|oë7öD– +Úâ?I—ޖ5±Ò~ª ö—;ºw¼Ð¦s”¶әß/2Ld(yÖ´ÈN§¯L“Z ´ä2‚Bz}ƒö›—¹=Ð^Bo>Qðù[ÑtÀb›È£o@6딯ƒI#sòµ)-š›’^™+ñ\Bpr†$_gœÝ‰°]0‘V9däqÆ݋³@ÿÎ㟖Ç}8}B©däå‘Çhð$ÈÜúÌÕcäݸe%—'Ãí·Š'àz‹î·®ho4QÛ¾£¶ÐYw *ähmÀsWõ4$êr•ˆžÑOCpŒ®;ëÝimBè¤Ü¯1õ@¦…+”ª™ÕãČÇÊ@9Ü÷ŒõÑD·FGdZJcsM!‰T٘¤ ½;u¼›J‰1¥‹!%'fGŸòûrߥm±ã8;4ðGKèûͅE}f1¯ÆˆÉ.äçå»sY^KŒâ1 +Azgûƒ\S;cÄß½ŸÅW:LœtQÍNñ»ÒXráŠ&?K Oªâ¸#ÄÚ0mÓ¾AÄoÛó‚ëÁ¸@e3¶$ÑY] 37¶ñšl)ˆà&WRýV{ ø\Ì­íPˆ£(ÌE¡êi°\pÖþËh1Þ %™Šî¢\°Rµ‹?g¿Ö}{vf+^v˧Kù™~×:º‰Èkx1c—ôÛȳö'4fOmü²” œ'Ze\€ÊžÕæ1:҅òΗ4™Û3·hB¦®#ië«ìGaýTuHtà…|L†oý‡òÌj¦ZòJ70ÙÏ5Xó?1Xó—¬ö0XõÆ^=ÜUû¶»òæå/øéÌùZççùzu¶¦²Qx@cK£XÊdýȀ4 ßˍÒë´ß¼ºÅözó‰Ð:,ŸÐaôeJBÒF(4¶áÌd»ž5õ•IUØŸŒ¥§øý ±(o 3©(7àÏü²W߀ި]0iºüaŸ²ê^°ºNûÅ?'‹Z÷ÌÈâTÓC>—E¾6µÒÐãðO™öã³dõeèj4¦Yû†¾ê„D‚ßÙã>åhg ×V^WÁý! Mhfª!»îsûúI²W{TpXkÄØ{zh3 ê‰U‰¼wª÷q!©kL1ïk +š°1;4WF¥g ÈuÙ=5T$DŸúW}f1±ÆÙ#ägæÛ«-1¶KÀ +¥ÒÀ–!JÑ ‹·vµøÊÌèÆå ³:*vêÈán/îh‚,rá=̑ï;št ^®*oÀËßµ•¢57XÙ·è‚vý(@ˆLÉDl„’ÂnÐÂóæÚ¢廪*u† ëÌäЫ7Nu?õàRÝ_¦]µ—'üs£Lɏ©YG-cK~ªE¤“Xi&ó”;ÔJRM­Ñ|ùV.žÜÂVŒ&L¥ÕÊP”P€P‘´Il‚|6€v#@û’j ~!«j¬®/+§OCYÃáP×ÝJÒ¼!…¬nä,ˆÎÏyÓ 7í»Ÿ–]ç}ä—óŒß¥EÙ7{Y8.\ðM¸Êã¶'n<àœóVhó2haAsÌR…X'rq˜r!ÐmQ8n¿r÷ DÑ\@uSö9[BSM€}0¤i‚¥ZʜÖ_¢“f^ʗÝX÷bé¾e½yí{šÌá÷Œt8ø–d¶ù¶ÓQ&žMRP™¿I¸ç%º-67,Ô¶Jí=î)\.¥¸Ìm¦‘Èqv¥OÿÈ£"-5ÞcüÎäe’g 46'áïc½Ô÷XV<髒æPvÕ"*Y†6"ƒÍØ␭ÏL²lÁï(¡-§xRZNöÓF…e¶L~荓› ^j +{G‚rè3˜8519D'ßHÕ´ŒJ 0m.³¼>¦Ôá‹öEQ3¬'§¶FÃg+N+³@ݔd¥¤bD·b[¥ CzÊÿ™"X[<`ô*:ÐMjž°¯l `mš¢rË-sôn™î7ûoö«%¹’Üî} +]@ +þ?çq8bêï¿02`ÕÓSŒÝ3ݎ‰im$æ#‹A™xjÈ,Kñ6 #'³s?ÁÂPdn~‚v+÷¥°C†C>¡ÿÞ&ÍeIo¾ø*dßUÈV·mlŸ &ò=†QDפáì3cG=sJNÿʁS““Ñ&q i^ä³ïçH:Z‹€S|”< :¿"¿]zU7š¸g—@4ÚË1eµÃéì¯¢C舀˜¦A«ÐxÔ …GBõ^h¸Š 4¹$‹pKәíн#Þ2]³~ËÙrï(u¤ã¡s¿Ýp%É£"#&Q.S\ï† BPÕÔÆköVô© ¡uä¥‘ðtÒ{U™¤ú ¹40;Ç׺]‚Α‡‡Ê¸̓Ë`Éq[jÌ%†NŽ´ml+ Ô¤vz?J1TՅÊ` Ý0=©T–ƯZÌŒ¢ ~ÑãA ¤óHÒlï÷–eÚÝǵ»Ì#ßÌ}RqCªÍÑaš®FP^zõò ÅýD²Æ%ûÍ\Ž:s³7RÈ*…¬Ú*$irKΤ¡õW­¿<†è¯˜>ZÛhÍþï„3¯òb +ªt•a{G„ghë ª‹ž!®’|&@­à¹Ï¹Y®ñ’¦®ÒK¬5–j>Ó]•7¾2.ÇQc \’àƒoߙ´n¤ôùô—‡úûïý£šBXs¾lËՄFçü`tkùÈÏ!4Ö ,ÀÿÉí›Õ…Ûü0ápûšP»k¹ÿ0|9¿·kwA-çé>˯mÇ}o﻽}øÒÁ¿°ޖ¼‰á8Ê~ˆ¤AºÒX¬x”—ݯ_ÂKd$áå\$åuˆIÒË¡ë+Y3 ^ÒkKÞäÕ¨<°Pi¡`ŠÚ÷ +ñ% ñuæ\|¾€ßÎ^nŒK}Åyé>©¯½-J-L…-¨ÿ›ë†›Ï º).Ã0¾ä>P·TcÈØÃbÐbüÅÒ±4ÚRÌ·V„'ÎŽ·é±a*»ä—«)§3±[2‚°Þþ¢}àNH͆?^¥¥‚#;*ÁHi? +É2) wö–]Ãô1ã[̙Åø׫lg{q7–SußɁò9Ÿ¹ó…6A6¶B“ìõsu“ŒºVö4“b‡ÇcŸ0 âp¹UV$c+Ã"ýKÏ}hOÊÿ›dRýLÊ?6“ZFÙ¯FD ºpÞïP)¼C$©Ž>ÀJV JÌ,œÞ &FàóR!(Vž‚{Cq„V>"TߚïJÌÆ0ÞLøÞ;25_ø)5+¤ˆÅǏܲ[8'J¹RnE ;‘@ÐyˆÔN•‹!Æ_&!½Jùœb•ç ­ÿTùܬ&CÕ~é¬_Xgu|Þë_Xg}4xXBYÄ-?<o«BŸ+Ü)@ VŠs…Ïí_9P¥Ç%e³©rŽvéà\ $†Ñ"à¹B|ëHýŠÇúv¡ÔáŒÒ‚&ñ¥0CY dÙ³Š¾uŒJuØ»êÌ$咷¸»"söڊˆ¾$®r ä!Á¡Ø8G™Éå +°#ÄàÇBl”ÈeD +RÝJž=–£÷ƒRVÅM鎔=„¶G£²+ÍǯZLz Á %åŽñ R€y$i¶÷»Cuu÷qí.Vó(axº÷Â9÷’HòÒ«K‡,á'$ÁºZ`\²_ÐÌå¡£±•é6HŠ©EÈ*…š"‘€rKΤa³MúËcˆ>•—a;Õ/Aü³ñèoÓnÿåޟäÞm©h¹øƒÈqßÉq_丿Èñ‹¿Èñ—#Çifëv¬YØ g^åÅêz鴵ك<"fvêŠ8ÇೆâÓnc[dÁm„e¥k~ ¬ªže²3T˜”Ü(<ØÖqβ¤"0÷d.¢ìù ô’¶Ú¤=D7‰)äÔÆnqûö¥9`˜ oö:_cxݽä0w&IWKVå°:–V9fþ÷-²J3* + ª,êIu8+ìTU9«'Æ'lÓT5JF΁HXÌlzUà£‹¨D¥­3‘=:¥«Z''¡Ý_Ýøü’˦óü£nû¾F·ýùFwÄþT+ITìB$“6B‡ˆ„ŒP +J0¢Zü VgѪÝQIa໡±@ÈÃBN”ÐÒ«‡Ë|^¡¨ÙS]à\ú+G „À’G}Y9Ë- Õ½‚¤ì!ß¾RF?Š¿ÍÜMì¶q÷¶B>! ŽxJ¡ᦐMŸzÙÂ!µ²¾éOR¤k½ÍiëwFùë7ÿ’ã’X¡ªŠ7UqW—fUú*EiÎ ãcFÓ dW+€QgžSë-æªeÐòŒs=ÛuËËØ®[fåì€Ût®#l¶¼˜±öYÙOÐB÷b§f’JägœÝÞD$ÃB$¬ÃJҀæH‹ÉI…ã,Ëßܞ Žv £]Új/q¶üë0‘½t¶3wœí0K×𷏰M+ä¶_¶]å@Ïû# ðâV˜·Ë·~Þrق1PÊíQë}O…9”"g°T'NRÎÐU„3Õ&ây´Ò9pÝlÕ&ƃRH„¡Œ`lع³"v•÷Í ¨ÄØ/‘I4Æï"mÏY¹û´/jˆfþŽ1ÎÁ +©9¨,ÑÝf®Åqu«øMڎì¶s¥LØX×åɪ>¦•=;²Ûñz +C)@’Q¡ahÔù!¸9…šÌ`UNAörh;T¥\b¨£KÂER‹}Àh•ô  +à¤|ÿ¤°ôÔM‹ŽŒÂ öX·‹r«³J VŪ‡ÞDNšÍ¹âœFIØó.A$¹?‡3‹Á&kô¬â¯MÔB×ÕÝ®:±(-!dZ» +yâCâÕfGŠ~:êؓaßa!ÙE[±[í' ®t9’¤Ê|ªÐºÌa7¼«¨Ç€ŸpãUÉ_¦pûÅ ô%Çg…’û= u%‰öëêÌížñl機.¸ÛÁݾ÷ÿ&¸Ûƒà>n|JЌü®íwõk¹É×ñ _ÿÃ~µäÊq±½O1GÿÏ:GÈ âd‘ÜH‘,u«gދb{“¼ÕˆÓ’Z]ª"Yy³¯}³¯ùb_çžÖ;æ;®±ìëòr0ªc³¯ã°¯c³¯cw¯‡3“{=ÌlRãyº×~u¯WûšwûÚ7ûwÿZ^·¯5Vә!OUo1þó3w«éi/3†ÿýüÃhÞú.·D5˜Ì>×Øìï¾ yû#[·çFHÇb!í­ÉÂÍçr©jïØZðӇãÕëùqR­¾»ç“‰–û»“üŸ:ɚ,Ðeüpi¨ÒPߥámÒP/ÒP_•†džmŽùM¥<ÆVÊ©¥w°ÓtՄÁÄ!Ç«R^y+‹œÜVFSõndñzÀ íâf· W«ªhAxOâ“ĵÙ=¥x›Y™ÎøB?Ðu o}h{4rÎ92!®žZ–W´f%K¿ùˆÎYÇ„׫Hm ŸH­N[ßPt¡@·NþOàK\ÌäŽú‹¬óXJêFDŠ;ʦ²yÀå„ØŽ1]‡@d›–hR#«ÇH¹ÂD¡2P ç5ãÐeÎq8¼«û8ìAþ +¨P”d +M™æBƒ4¦/0Ç dg à‰ÑÐ`Z!Ê9b‘… +jÁŠ ÷œ}cqd$»ÅÌ>ÏyI>Îô8¤\wä'Û§°±íäšÒxFüÚ×[,¾°‹D¬ˆj4ĽùHVç p[”5=žw4è8ⲅ€aYøїº5s!"C`¶.|Û¡tƇÀ»±½Ïa,Õ¹C®ˆX†ºÆÂÃVŽXÅ3¦ã©.”µ2,’éêßÐà:rl[ã85â‹,¨IÈ Y>,ډíÄèØ'Àú3Ü.i@K»Ûu ìæhÖØ åݤ ³èJ#€ƒDvcNJ’3–Z¡ôº\¡–:À,îP—%|aœð~4®A™ *í¹“?"¶~¾Û]7¨¯YŠtØè–\¶è¶±u ŒMС^ö¹3.€è¤<´|l8R{[œ¤ö rx“Ç»ˆÊÇGL>èi©ýðâ5ÆÿL^&yæî=€ÅÆä&üc¼/´õÄÞñ¤ÍB–Cٕì§âšoí’íœq08u¶3¹²:½£¼wpóÇHÉöÖ9I(ñ`‘ªI­ró,~Å ï‡oG‚rh;dQj`™‰*#_ÉÔ¨žJŽ0,*YœŒúÓÏ¿Øð/K‚Û_ŸþØr"gôhéÒ¬ ¦B n»§]‚™ϑ},îŽ~¨þ¶›´^ã]Û+ú›ß®¿Ñõ*Ënï”ßxSâœò›_•ß²Éo¹ÈoÙä711ãMé-úÛτïÔ_WîùA~ÓyAùM·³…xY~s±ë53;ê éQ€³ 0îEÑQl\®\.\$Áy¡«ë€a%Ù¦Àã¢ÀcS`ž§‚É)Áý"Ác—à²Kp¹JpÙ%xWම½¤ÀmWà´+pº(ðŠ"=i¼+°ŽVÓÑNîP £}QàñO +Ü. +ܸÝ<ŒTàtÛCüœ`òaÙÞAÝ!E‚½í­m‡Cûo$¸üKFÙ\48~Uƒãkœ¯œß¤Á¹ ‹¸9åw¾}çÛ粪ÕÄ<‚o§qY|hx`Ü5ßRa,±: uMºŠª†¥r#w58~›ô뇻cò¸½ßŽjy<Òê`ÿ”•ãLE2:ÀA8!+äcå7G'5’ˉyé‡rL +E˜ÁQœÄ@&й]ˆGA +¯§0°ƒK&NF²Œ‡!ã³DJv “\ÊA8…ÐNÝåRï[—•ô>õ¸EvL×(>ßd‡Mo#È>ÓN vùºTiŸÛIp˜‹ #³ù Î +² &<°¯`֜¢ÛÒ«{ ¡ ÒpbpÀ +Sʆ5¶þ ÀÌVàk˜›ía«ÛeöŸŸùyf‰mu‹ÑþO…’b=h- âc~"£¯„0Ž49ìºÐÓZÒþ.9K‡kr8‡Oæ¢wûNÓÌ҆‘ŸÙë«|H±ZŒ,¦-݁؎ƙÏL%G;EÀ÷ÃõI~$äû9I+GIQk‘;xÙ^TÚj…á4"¾£7,4ñ€6¾†Ã ¢ ¸äð'‰ÄülBü†ÕŸêkå:Ú«÷a鄿³º&xX~ÛBTg3ݶ"*Ùü]˜}ãºlÇíŒÑ=²ÚÉà¦ÿa§¿àbRl¥™q£øª~ë–øå@ö¢Î¼u¬­&ëu ƒiL#¿ ¢€­ë) ¶>vØmûjjÂüÏööó1ÑÓÈбe8‡ÅÙBro—§™àÐ÷âí2ã yNšÅZ/c‚Âà5iñ³¶„I_€3¢@ûšî«`œcfO+»hÖ{êm0Þ­Ëÿ¤é p +FÑWºÄÙ`´1¶¨ñ½Ñbøe·ù ɚ͚ggf;sŽìcbæ +¨Z-˜[³Z©8è8;UçaXÈaî-^V,2}}½MlV„YšéC«ŒdµjÆñƒs®}…,æXÈ+A9Õ;.¾ªÝ@Ñsµa¯@ÙËD!’[ʨ +vUn̜D1ºƒJŠ‰sçA Q½¼íÖÑ™ QD›šälÚ3ú¨\´fÙPÙ»%²Uõ>.³h… +ÙѾĮ©ãTta³/« Al–ðæ‚,ÑRÅNƒ¶ÃbÜ"n%G(Þ<øº„Gf´É¶Ð:¹’íÕÝfnÌXKÔ]ÒÂDÒ¤ÎgHÔ¡»~Àc±‹¨'ŠÀ%¡©‰šb|ãù0«=Jl: ÕIåq#o KžùQØ& §ˀ14ÐbR!ìð=–p˜˜ƒqA‡É(*LRVfGaVf–µÁM=âéNÉ.ÜÂ~EÇ{4õꌴh”© &¨ªå%Â*••1T‘Àg%Ô[x±ñlÉh+ÅôNNïäô$§2mAFvwÛÏ|Ú5»³üZŒGž2‚Å ¾G “ù7<“¾Ý¢_p G$ºîҟ³¼Ü¡S- +‰÷å8°CµÂ†iÔ&.CŽI$CÌú¸7³™k6}œ„xNº!@Y¬²GUÌ݇ÙegO¹«Åâ$n;+µ_Áo{Ö0Á‰M‚.õ.Lë¹])ˆå¨±EÇV1+9ÀUɑÝÍ wuGh„ Ýa ‚ç8ÝöV±…‰(\(†,5IAÑDè„ÀžÜ¥Ž¯_ÍÏö¼”œ?›­$ÃÆ&[[ðæí˜È_åŠü"ݕ•UY\³.Jø¼í0ŠÕööqŸ3¸ê<¤á»äKzI9‡èGƒóŽÎéw×~›ˆ5ƒ d— 6c>%æD¶#Ùw÷c‰3:Æ-,@ø¶ò4W¹ü盘Tøå‚7úǺÚ|‡ØP“>ãên4›üc¤Úidê ·x€E¥ÈãÑ6çm;Ÿ€0v_‹õ'ù¡á¢èg; ™@/܁QÈÍãÔ_Ae5¢Q]HlÞ –uÁm&XÞÐÏßj(£’@ÝAîÅé.ӉÜC?œ4U–1ùTP‰ËTátÏägm¢àÇ·fá^«d֌ƒ˜»‹g¡¸gq¶´jýø¦>D{MLÛ¤PA.ùÌ"CÁ1ªnX {ˆÃƒ6)©œ´µ˜‹ÊVq¡Gô¬Ë€ë‡JˆføUÝñÛ¤$Š»àêkLÂ{RêSh‰j<©ä&E:¯ø;º Îc &äl…GD ΗÔF’¼Ÿ™¤< +>Òs^ Еå·ì"ٖªKðaG³û!N¤¾_ž ÒÝDõVþŽkëspn‡»Xæ#41ʚ„ĸ$‚#$u£ÚÉ8…èøºl‡ÆNóîRõñΡ^¹R@“Ó÷~‚fg§8Ûà#ÜÎÙ9 ×ùÎI]T~¦kmJ¸£›¤/ބä\»¾—®a~îžO€ÔÌ|…€ a0œé˜{¬û°ÆV²DvDül~aúµÃ{ª 1J Cڎ+ª–Ó Ô|üûw½óá>G¹€Sç&^“?ðzQ™òkaT+d×Î/Àb_€Ür¬Üý,xâ”2:e6 âÒßy«žÒ%¾(4S0Æ ï点9ýÁµ“´^’D0 =ˆ +åýÎ »Ì +hYýÞº8î®y~Bn´ö(< äf’¯Ä7‹üD>쑋ҧTt8³œø–Ó Ôß$uS:—'肿{®%Ñ)7d'b Ivl‘'<Ÿ»ê1o“UR<*Ж5 +g¿ ¤ÎÏÄzG¥³…¾4FØúH¼š”Ý+…®º”l·H¼x¦<ÖûÞÈ ¼Ñá×c)Û°õvõ®ƒ¢—ëJÊSÚP Òµ-—]¸Èj ¿e—„N@‚Ÿ>X›¹šñþÆ{‹€ÜéXWía ¾Ã§::}daÓ$tq¬ÿد–$Éu¶§È ԄDQ¿óT¼ˆYToæþ‹!ÊvvÕ`^ô*…´,K t·­¡—‚³ãã Ð)­¡Ë4—ïD8æ›Î'˦*gÁ¤ÔŸËf„8øÝpÙ/ æ¨5ê$ÜOژB.(ý¾•}%@#„záè-̔òòLùp'ü˜²{éVŠ$2TÚT$MûFݯ1Nžœ5K*ÐRA²b£F%\ET¥ó,r#AŸ«%Ÿ:U‚QxãšH«+|CNõW†íwŸ5<Âïq}jò±³GÆê«S©5º)µ–]B­±Y©6e²CÃTVÕX½fŽëÉÖ+UJ ¿Ú–h$ÿ>¨†ÁšMæC 2GӜU…z‹´U†Ü÷ý„pbÎVKèœ|ÁFñï…9Téº*Ey¯„ƒpQ_¯$‰Kˆí1_G¤±gô×p`yH4J¼âK¥<­Éî)AZZ9k<ÐCŸ9 +ŒÜ1‚X-ÀüAõÈ=$1æî‚Õî[Ž¿CƒTéíŠ#§ÿ,ìD6å8*ÕòRQ´"òÐ'‚_"â=™xÔ„Æ:°ÈuX9ê†ñŠþ•èC‰ŒÆÕd³R´ß¼–Úê*ŒH\“‘­ÅÜÈÂÝþ:8¢=g¦S2a0u ñ™م»¬ˆ~ËFÚ'#Wü¥}‹¡ž'úV„=¡ÁÃFßÖ½›ùƒÂŕèËÕ$Û¥áÚȺJ;DŠ¦v¾ýҔÀMb»Žè‹¨IWÉ/”—ƒžr™¢” M|v_Ý­Ðä~HâpËÝÆÁ¸5܈ËñÔsÈXî{‹„Õ¿ªÉðöy¡eRBBT]Ÿâš:-[r¡öšzE*Z֘'ªç 6IÖï,Ž1MÌ_UŠ8(ö4EjNÍKî*%Õ¨ù‰©£âãR<‘5i¼­—õcє«]âÂ& +}kv{žͦyò %ŽÅ{Þ\?Ä Î4ø’Ó&©#Jý&DCoLz9Z‘ÉTZ[™Ç«‹t¯ ¤ö•oùð=×4âú¡áàªÕËÅԔ‹ +”¸ö#Pyk^¡OÁ°˜ììÛøg–ŒãôE‰Kz¥¦õÕÓb ž¸ïÕ²~+γfÁ:@¾’v˜G{«_÷at±¨l8ͪ:¥i“LÇBÇ»=Ž³ë“ÊG<~PPæQКd>F,ôÐcÇ3BuãD»ó:"_X L ˆZÿäòÕôÈØr†-៓XoøÚo3úžo+Œ|~c²]›àm^{¼ñd·xþ3B'Þ t6û©îMô²ZÓs¼ä} a½¡ƒÞ3ˆ{…’ÏÏ7N,Ï.N¤µÇç=|¾7Ù¡0¨‚¸Äuýdñ±]MÎÒÈ*¹l˜‘Dp`'ØERˆ$ؐò4黙¡rš¸]j—¡Ö ±ÑaۛµÒR¹+í|¢º¯2×¢Ûí9ñ…\'¿ ¼m Z›.tÅɈâd²lj™‚ ø$ÏL² +&wc.é-$/~:}Õf!Î_5ʸÁÜ;'öqí¬\£ qÜìê:ùC'ÿx:Y‘ r/êZäÊõ‚M©9ô=ًy¨É”´Á@ì©xcžÕáô QHØ*B,€#ö1ïg[Ǩb¨¡ßcÅEqBT¡é¨oßüXµq@\duÎ5ÖÖ=ú¸Ãho°wT×"ôõ[ãx䚩R<8»]:É4çIXß±*„L+|´+õLo 4m^•¡kœÓUÑ\Ã÷I¼®`©^˜43S”Èiëa}º{”¤W^häڃ¼ ˜Ñ⢠+—+f‹—úÊl–q:q3ûe÷ªv4­žq?­¬ÇÓ°§Ç€á'Y­™æn ÓiW"·ÉŠ6)2u³(áÍ¿çà\p +Z䕨µ$/bEù‹¿ƒÈà$ƒñ†àX±³°¡Ä.z¿°méÿnÚ:'nX:²yތˆºÈ0X\ëÿ­{FG¢y‹iä·ûªÜW…"òlèîL*åÍÛۓ}Ov9Ž°M±ŽÐª•×9#ËEPY~S=ƼÓ)ñ$ÎTï'Ób“Xq谓[í @É¢”$T^¬j-IÜÇ%¯UÀgƆªÅ²þúK·PXàBW&²Â©5ɖÑnt\¦Ë™S½\]uY†öU×Yy÷Cð+ÏØå2M ÞFæeʦʖ7ÏY5Ä­qÖ$¿ŸŽ)¸èUã¥H[á{ƒí:G$@<(ìµOëN¿Šq /ŒÜ§ì" ›ì¤Ÿ›,lбÆa¼„H@ƒcðdŒ‹gòV,Ý-K}á;®Ò0LT›bWdzí©ä6iQ ÚϙWkkÇ.ÂÌÁ§.6¦õ:MÊç~GŠëª$ÆXÀ†RŠr‘õËÐa×½å($_Ó L§Ã•³ Íx +èyXj„)]¯ÿüsî1§ÇğÔ6Uq‘ƍÑw]YBpÏÃ=sÕßal½l¯Æq¿ÁRÆsò” Æ7Îè÷F0+5Äúaë«-m1nW»0 ”«ÆT®×™|hJã–b'«"渞l½RÙ¥+òpµÔ)Úãî>ŒwÛHo ¢3kš“7ÝÓÓsxš8”©ï'ì û!:'_m"Úli³x³K‰¯Ž'ª„‹º”ûF"f߆¢;=™Ý_§ß:(²ºSQPÕ6¬†‚QFŒ}_ãêšôS;='›zDõ·v%¶JV„VFÝÄvS‹Û°ŠðúÖ¼Æ#éCh%å!úP› ¥µû±"ÇÚî"µtWá¢&‡=$…€2Çì~6If]¿;V°¤É:Q´kícb͈͉¡´Æ‰ä)BßC{9Ž!®ªn·gƒi«‹Õ] µTæÖÙg ÒÕ ÂÛ»Ú¿¹®}P~ï~ۓKÅw‘M‹Ng¤¿¢rÕEéŒl¿ÁҊ‚‘ßÆ  wD°š”Ñì¯c>ø1Ðkm©Ó’5iLçE¨ð€ý"ÔÂܯê*‹«Yª…ÖÑz°` Ë ‰+Iý‰²U^°²¥Åv7Ýb<랩ZäÀèÿ¦ÓXNK/¨±Zñö„Ô„ò¡•Æ·¼fˆ+#"¥Ö·(¨«É^toPŒv?›â‚í¬#ãyf©Úõ «Ñš2"ùl½®lš{ÉþbF{÷[ME 'ãêü毷vl‰x@ETÁ4ê‰âÈzüaÁR€[ÏmµçÁŸÜQèË·­ÚcØqyÿ‚Ñï];0 +ú{ƒ7ÆôÂùgDiÝ tÒðý‰Î_½¡MôH­i9¼uCXÇÞÏ …ó~FéþÀ‰âÙÂemñý>ß;¿M¶ýiŸÿ×í³¡Y`ÁbíÑ>¹4p„î­Y|I鷑“^gÈ%ç“ê&K†âú"jGø«҄€÷–h¡e7ý/ÛՒ.ç©çwހýI¬'ÓdÿÓ«ª}ŽÌPÃOƒêѶÝ×Ïûa+#lþnóÈ ¸Ô_›$' ò^eÿlÛïpk?¼yêÁ¡k¢z¸®©yQŸ,÷Ômyþ©;Áö¶«Ã«$¡ðýQG‰™¹«’™¹@ºŽXtÓ+ñÕ­ÄûEgÄâ7;Bõaë·øÉâ™}1º²§@7_MÏ C½Â‹…ÒD;PMaL¿¦öÐ:¹K¦×â;_î¿/ ¬¯`Z=Žå‘:¤ Ÿ¢ &e (…AŒCº9 ŽÈzë]‘(•O üVýQë9K¥¿nL¾—ú.5™‹M?fßCD1¤[€¼µ4ÃÅ^ØɎ7­ËÁ†oƒ·Ùÿ÷ˆùª´—ê Acͧ™É7¨‚é{%OëÞ^Xeº¨ð´¥PÖ/’îÙ°TóÁì5,›!9Xu‹Íy+œ¥‚ÕzÜ^¡³s-ñ_RjÀÛÏ.õ…eaÔ2ÁÍ]müc·î‰LÌn˜œ8 »+½U>ÿv†ÂT\å¥@èßO7Yñ|ºVy>€†Nôâºlo«—œvêÅ#÷ØJ{z/¿Sãòös@d ¸ù,ŠÌՌF u2/")Sc!À|ŠÖ1„¸"ñ!›v…:A<ôsøX< ¤ÜR‡9Პ>;퓉ÎÅMÖB°…c¹ñÕnËp uv¼Õƒ)Åí‹Wù‘f’›i|XÁ¹™¿Êãfm.Ìe:Ñe^, RA…¸jm’.æÉÖö#ÿu¡™E奲VW·Jd—lÜipkLM ÃԐ¶­®Ê‚8 +ò +´„(ÖM•TS +OªFî ”%÷7‡lr“}ž¦O‰ÞÇpÀ!è¾ø(L˜°âë[L‡œßdÃlÙ"HæÊ ÷º¸|o[‚fÌY~‚ª  +åmâÒè8Ñ~˜ì4N͉:—à´™ôÐ 3ڜžP+ˆ¥/½î™m,ËzdYê–*m éĔû"€_Tm|çғw—½ÿFÿêý9Àԅ§æx¨û]hâªN@³1dFy”.ÕDc©§à;%?u#‰®¡+5ƒ×7&ƒ/¡›><Áh4k¶CŸ1'.‘1$qؒktU¼¸rFØ;jÙԓÏÝéâUX/Ñ*Àˆ è¿Â]³VC=š…Ê‘bÙhÝ!ÅyÔl$4nREÆêð#.µ©Z!Î݉[ srò`S¨P¼êˆŠ ò`\ ÿƒ»`• +=:PÓ!UoÒŸ:ÑX*™1IüG³)À<á>ü2sh-cKª¾R’êÃ¥-ø© þMDÃÀ’:´兴àyA«ÆϜKã;1„DJu(±®*¡vFÒ¥Ž/u_ï6îÁI¥¸E*x >?tOD¯6•XKÁ_äüÙ{锪=*ÿLJF`JŠ§uÁÞT;A”/ Ó6? 뎗fvõƒ”¦©D±ZØ[w© •³;¦¶>/âœ3^ü÷·8Z6ôòZvcÊ_Éxð§LUçy4(éSX­ûLifðŽ^ir9Gbìž&*Μ­'âŽ,ɸ_À±ìß"[ãᨣ!95E5¿º4sLƒ€@ȸv^![ wÛ(ÃÚÕ&s½S˸4Z)½à^”鮜G™ø F\ÑãÂæ§j +vïîZ¨DXAÕ ¥ (LUñànÃ]çוؓ°9’ø.1ƒQ¯¤¾Ö9†cÐ-˜ÃFŒÛfìÐÀ)¡–,Ô2Öî*Dƒ%‹V,üŽY fŹ:w¢æ×*ğkg"¯ÝMgê mîxZÉøɅþªC›˜6 ©:C6ßb¤{ºÚ•|íŸ ¸A0.§%cÀÇ)@ë¿4‚¶ãâƒGâ/­¸zÕc…L•H;ZøÆ̈’õîàÐã .å"Jˆ2«9E4P 3Gÿá‹HyVÌX¡xƨ-†t‡AƒD¶à1ìíw)]ØÜåYËl5OÃé¡(Õx<¨« 7îsfwß൷|LÜ{Kœ “»ËÅ FŒ¤2)®|þó¿ÆãRQXë·3ï߇oÚ%ó¿bm|p´_{þá(<ˆý—(Zœ*]gQú½$¨ºQOKOEv¤âv£k3XÄLG 5§Ž9©Ùª7–Pp ¾·² ‹Y&¡c|¶ª2aÐ0$ßd„¤;8,ÃR‡PÍyl"·ëÄõàì³L’`ìÉ3$âe7-sg8·ñ˜Õ,œ9ܱ.µ$kN:–¶5;@¶ù5·¤Ð$dê³óÁÅãM ¶\ (ï|œ9·Ô )klIé†Ö3£­eŠñ÷åF[œ¾EoÇù'yÆó%„·+bìÕ_Rº9\SÁÜ@ƒH”NÎJ«‡ó*amUyZ´¸è)>ù§@áFCšC +«sMª·ÇÒä¼jÔx‘zÝüÅJîó؄ºfóéVÊPú QøX>2IbqáÝ´|jÛ˜ä ä 9{:j>$H,{\¥˜*E‹4%Á1~4ù{W‰9êT‡Ü.òOi‰ØŸH`Ôí¤Yà/¢#³"/ç<í¦o{wé²-xÚRúo-éÔÉ÷hVcye?»b| ͒…‘ŸýÐÙ¾-6Pf”=®ê‚è„~§uãÈù7Ä·"ªïa («ÛÉ Ó%‡·ô’Ò0÷ÃI¥L½¥RC‘Ú“äÊ_g“$wUt¥é"z¡?qP™•Ö!ŠÏ2R– iBõ…0sGÓÙM}2Pv>  ^S÷AÅøÂoR91>Ãy–Ö0JÔ(œQ5ñV…ÅŒFÏ€¤R»€Ñ1N˹ áH௕IYvÁe ÇZdCՆÑy‚ÿ6‹Ìh‡¬Ÿ=›îŽX¤ü@/ïøU§šÜ˜Ké×ù5%fã´¢–f¡ ésÇùA5_qÂS³ U"  ¦E¢Wã÷y)æO¦ñÔ»k[ ýÑ÷S`¯†oR±ÆÓrzÛê›ÉGgo­Ä>÷cJã—ÏOýÁ…\oøÏW8©E*„²#˜ÑB ¡#²-0GCˆ€B€ø¹$6ú'‡*h¯Y@0‹+€ÛgÙÖN÷¬×œ…}Ê]UÁª"k«“Œ§8OUÑb?ã¦U뗼a\Œ÷ñÌAœè¯ñ‚Þ7þ‹:%?3ÚùBÖ6XÇiHŒh&¿ö þâúPOlF¶ø´¸J‚âð ÉUuß +6&fpœ³ú"`‘"ÏCXÓ®*´a,lÁÎ üað™q¦`}ž56ï:w)Î×L,~1ã‡`kñøj$ÜÜ]j3ð×t>PTx1]TWx…ÍUç³4ΐ¼Â̲~1ø¨IáŠ×t›,oTÎÝÝ#`8µÜp^G ãƒ=Ÿ–÷)ÄOÔéÑQûçyMç/ü[­E ‘MR©ŸÛDHù}ž• VûæÕJ¥âϖøÉñÏ/†…¢½ÉË &pº‚ON«æKîù~rv´uñ=æ }MdbÔQ'8´&Xuæ"‚¥µpÎ+I9~HEQõ= lân‹à‡]@™´9äÕq¾ázþ¶«%Wrîûy$‘’Èó4`ª7sÿE+"(;«j6ï™i[–ø‰Ïì·N`Âun®ÙÆ!£ã]䦖Tâ&âËR,ꎝxÇ|ºäˆ3‡uJ\,Þ3A:LŽ†ºæu„ߘJWw»†þÍV@ݤdLí5Ò‡n²‘Ò ‹bn.ÉU°Et'ƒôC<þÎÏO°úË/‚3ƒ–ët½$ÜÅè%%0, ×IBôÜø%šÔo0_Pwÿ×s­…©Œã¹@tþ~›.ó$XY”ÎÙñH0È^û’ÑÈbÜifÆý+ºÒ«I–7U35¬,T߶ ée"Š“—èAºj0Z«PJ¢LµŒ¢„zr™ìµìÈdðn7Ú +ð6´=G§DkîAËÐ8Íç­Äµw1œÄÊ4Þ +I'±÷žA }w‰JÉ<.g³È¹LvŽhÝL±I‘7 +.q$Üh•É'Z@ر*$ð[Ìͼ•t¿B“‰7ø¾qퟯ؄¯Õ9­lC‚œèÒÂeHv¿À܌wK°§¢ÌËÎg½ÃR,âøÉt5ÖD½Sºd0ž20 'ŠqŲÖ'ç ¡xö} %±wMXû=àv×VÈç 0/„ÿ:U.ŒÑ9ž$ì)ÎîJ=‰)g¥œÍ¯ ç(ŸÅ°ŠG§ ÌF‘0i÷µwùÅÅ5Z§ó›¤á”}½\å%)G + 3ÛKÂ<šÄ óa%èa/`)"Û “Œ;<¬ã eQ¼œ¦Úf£JgÙW×nDâØ·©eå_„?÷6Ô(Ï× +:—Áb ‚¡Ò§‡"GËjd’X?.mŒS"Ӑ†já.ƒ¬E€ºÂò¦RìzrWȵŸ ª P“ª]Åå7§Â»>LzÁ<ãcSRw2œ^ +ӂÅ-¹Ø «x=¦RôjèoGҝ¬™íY‰úþ¨ºÀ¨Åa)¥RN°œ¦MËƒ¼›»Ú|BêúVǖ¨–#¿7U¸•:ˆ¥¾…Ëb'A©Ýk§>ûë'ô *ÌÍqYür€A µEDg6 ²œck=©\8ݾkä‚®A›ºyoËÍމ+%ûȄ4ÉAVð—¨Ío\šï‰nfךûbÝÐÅPQ±46õì ™haÇø„|Ó´æ³)\Ù"¡F¸õˆ¯hô,U¡B¤35ú!®H¡Ç˜e¯œ3ëEŠ 5èr– ڍ)­(–í"‡5œûØ»ÎՒMTò-¨!Ûj;ÏR`욡;A­Ü¸…ÎeÞ¢ |„·àšž²La\;85X[1ÌÔäñÑÊëÉKýo)€¶ì‰0íõ¤Â%Jß^šAÉ"–ü›S²µiŸ£@‡à`ÑB,¾’^F=úbp–TØ#Ï僇/Rþ&7fzK©“¾¥Z?-Ñ®ËÀNˀH·E”T¼ÙÕõ{–ŽÛêzÙ»ëwÖЦ"òüK"„Õ¨ø5 ’0ªw¯²¯@ÖáUà®r,äa¨ŸoÇ-£Ä!JrzÈT=5Ïê7úÍӍK³,¹½J`Hâí~ç>òö5¥¾ R~ârcgu f° 6]ﱤ]¤IÍ_L<ŠÃBǘDBn“k®c Rš ~Hä£D‰wJhŽOa¡ò¹^Å-ºËrô;¸ÐªÈý±WQb +I9£Eå”ëQÍä }£ÛÙÒõƒí>ÕÝõ «]Ҁ +-]YÃ<zÿ¼!]Βiœ4ÔH½'”ر ¥$ÒÚb ¡ß_E£RtZðBÀMÞ¹$ۊØíîd NÑ,ª,'7Ø£ÎÉÓ¨)5¯#¯ 5dHcȍ'RS¢)ž»õJÎÒÿ“¾I³¶Mq&yž^$Ö²Hä—큸³Ÿä¬Y㭈šJ“ò­ñòÁ…bÉzH0‡×²U~ðÝíÒЅqÜý ¢ì;‘kPy­. +cl)}_7ÒèÍñu—Æ/0ÍZf‹Í$Æ,‹¸]ºh]íýh&§«Euqä¢Ä& ®°W³S‚㐛qR6ÇpE”Æá?jÈcôd“BCº!¼ØÉÉlcÒÕʓšÄD³ÀŠÝÀÊ+¤õGàhÛgWT2fܱqšáÐxGKÒíÉж®×£»Ý]‹w-]XɍA ©”ˆ¡V3Ɋ–jŠErΫ{–ðp‹b%hØ@Ê"õ~¥Ì`›Tq®¢Þõ=P1TՋDË¡«†Œ½B±٪Α¢vC®[VCZƒ‡§Øõš½žå˜-Ø0¡f¸1¸Î!*@FÜ[?¼C|’º†b 1I¹­M xì!· Ù$#<%ýžbäl& 4ÓÀåçQEØÂO¨ú»0˜ØûþXæIúÙÒ£ ( ܒίHsDrí¥á¥¸6”ÚÒ5*~–%3Qbg÷²9ŒÁºã¥Â/nûr(ƒÓf÷šø<ç{kù¾š¿.iÐx,µÛd&Ò¥!ý£¿Ü`0C-·Oý‡°SR I¯üae%yöÔñQxŒWLWê´ÐÍÜ(DAâôq$nÔ¾¤dYVí•Ôƒ³œ÷HÓ8æ5vÊd °©9™¡âgW@!Š”g½ ¼qÖ'T2}ZÕ¼›bµ[Õÿ–¿ñû·3Ð5Õ4• Ñ<÷'"p#èRC€µ!=:×`s±w“ûd£üî÷ºðԀ˜o˟¿ýPØ¿ q†ÃϝÆÜg>ûÙô74[!xÐ!ñ† »á9»åe8MIî©i áujV™›F`pV£*k³Q'‡)Üy–ÿœ­tVãlêàw¯ˆúcUÐÉfp ø;)AF©û=ÑòÆÅÃñìœë¹ŽD£¦{³ö–`¡§@e€j¨†RNN ”®OËÔՏ³uêLôÄö‹¨ûŸ~#¤ÿ\zb¥bšŠ ÒTéø- ÒêZí`8á:{8B䴆}&Ñ·MÁÆ4M4®àԎäA|ìlóäêfS†aOhL~ƒcÒ¦ög]Ö'qÎ2>“ãQºTùx$Ifâ HZI†!ÛâAc1VHcò,:WÖ ¹#Ý?ÿŒ<ÛƎ7LRدÄOԇ¿¢Â¢¿g· ²cs É3hcÊ2¾—Madÿ†2YNŠèœk¦¿% Ïœ‡ê1¬<*KžÖ?똍øüïïóÈWç¥û/ûՒd¹ Ãö9E_ SEýÎӕª,:›Ü l¿×}‚Ô,fÚx–õ# €Åã müùñ‘3Ô1nì¥ÜßJ›]|3ÝJͶ¹ÅýV]Éõu¡Í‚’ÄIp&Ù³ï–Ý®kÑ35ï——€²ä‰sóù +9bd-D¨âz{O“tk؉{l¡ù <Çm†|Ì!ZòâšP™ÖA´XÕ +ÀҔ,:µN+.7§qfW5¨)cyÑÑ6ʳ5svM~ÚÊ¥€Èõô«[Œ¹¨ž3[Åö‹ë–àY¿˜$.^@þՁ ðÅ\®áa\Šy"ÈüîИ1ŸÍ7{¯|v6Ì@°Øþ+¢—“Oð ð-XÒ»G¶¹†pÀýœ«}Þ{úšÌñ§ h´1,ôJô“MimSÍ#€93eæ"ŸïÕi(ÔKʎ´zE´ÎCwÃãî Òú²0ەÉÌ®¤èAñ®lÁ¿3‘,1VG¦8)b˜+Šä$4¼å#ÂU<¾Ù<¡žxEÈ7ÞZH™µÕ8tù(ì|vLýnxÊ»#`aÁ?Õþäg`ä6ï9A¡©KwaÊËq¡Èý’j-ÁÉïàÕ!3œÝ'Wù“ìÞ¦7x’6i$Šÿéº e³Ô=]¬Ü67>Îý}¾y†á(A¸—dÙ+“D·%ÒUOAJótã5x¡ñÙ2:Øí`æ ×X„‡$:ö¾›Š½Õ$‚^æýnÒ÷¡ @ëÅL뺦Pª«a“V7[Åm7€3Ó@P=6ëa×_’ô…A=F?`‹M©è ­'¬±¨ÓÊý)šr¶atm;À²žçùV_½“†ÚŒ*þ¸p˜?E¿ð@¢Ÿ!0ò&öF’]ÜFퟅÝÎÄ*lœÔw$¤ä´34¥š“@Ç=?î8—Æ~Úå ¨±üÓfÑð +BTŒü¹´7ïÚ)˜Œ¹x×YÄ­1QÔã45 ãT‹ì˒ë­Æ“C#P/²¢ó´>›Ÿ&cÔè¼:¿¦gÛÝSÙÎìrÐí v‹F磾dï;ÐhäƒeÔ\õ‚p”Ì“-~cõc­Ê1iáAñ<=¼Œü”1A±&Î(ªŽ]Y?Ï ˆÄH¯à’ùê¯Ô%åbSýmJé0-¶Ó™ƒH3g³fœe,EŽ’­Mì ᧮…Ê{\¨'ç±¥°ÖŠý3-¾çú%uÿQKÐf\lK—s™‹©È‘ 3ô™t‘'­EÉ>KK„o`;*»ñ[d¿Skf\Åòq­Ôð؃ZZèDRêpŽ~í=4:(uŒÈöˆv›=ÌþˆÞ¿Œqû»[”&¬¡r‰ø÷2b—õ˜á`­¡/Î/-¢ MNb¤:ð¤ô8òY=ãÃàP`‡e–¸7%üùǽí3â>hí¯X›zQ—±0ªòڏùÈ؃Âfw;›¬}@ˆIͦ֟dQMÃÉ ZÞ҅Y§bNY´N™ÝŒZϳØ`&Š\ٌþyÆ~öͼ°3MRÜè@&y“¹Áj´)¢M§áÜl1ؓ_°ºžÕ_͝Ü gÑMǶ™›¡ûP 8éÚ85&Ô3E’ž7ð³P$^%גÑî3Ú¶_|ã¹soB…oعLr-wQØÀÕ¦™ñ{™i“Ù=²jÛԊ7o1Ñèüּߚ÷¿×¼sÍõ³æÍvµ†ÖCn3ÐxAh&JájζÌxž‹ AÎփ¡÷óqÄ=g›®öB`<&AK4žÈ"µ#A})µÙ¶h˓i¡,9g¹žþþv3®–rö»èýÿ¼èwü Sñ½èñR/¶É{³þDhdã‚…½¨¸ÌÝ5°xٙh35cÖ»©+]¬Î9ì %–_/-MoQ––´‚eø50‘ÆbzáEؾÁ,[ã/£‰1Æ; c戫f>Ԃ\t£]RDbúБV‡í*ƒg‰Ìçp’zæ°RÎU>ï¢|ßj^$×;´Š„.Vo0J:0ÀÛä[o¨üÄe{Ã,]°×õˆ/ †ÿQ*L§w†±(£ZWiíAz2ç…ÃAƀ;Ó×î©t¦=Þ®Âø·Ás,ªW¼¼øó*üãÅ‚ý@tpøàÒ¶é?`$ I¦ÍÜEF».aí79Ü¡“fÈܒ,ÄÂçŒ}iîÅÄ%Ùýh#£Á‹AìN˜a¯UÖ«ˆ­feíãù«2ˆWÝGšeqÁ]cá>ÕU¨»?ЪSc‰1 +±+c,ÊóÔÉHW FÓ¹|tå@—i[uhl‘dmzh|«?Îúûå7º¡9”tM›-‹UsAœSD±4këüVÛ5Qµ@cýðxìÇù²}‚,DfA-ž·ñg2¥Lƒ†’‘ ¸Yg‡¶©bódr’‹ -ªàbE”=•«(¤æGYè±K•úZ·"®ÞRë>‘¿æ2:“¸ÎÍëa«“9‡¾gÊQÌq€8–ýє±rJ¦»r0҆;éF })K¥¨qS™} ÓY‘vàÞŠð›Þ!ÆÝ@±j'™’Ùþï«å³NCùkvRáPÕ,7yÔ·íáÌV,÷ï_1âQD• ¶~PªÆ¬ûÒÃwƒW>zìsëÐ-f~ƒ-Òí¤_°Á´ K~ƒR8…ªþh'§Qû¶:[’w5/Ð"?]ˆ-ù>yݺšŽ¤hò‰%xÝÝhÙ`UøˆÒõnN€U(³Û±TïKI No'áÁð'v°£BþÓô·—ÇKacڇbA¶ÚhBëã +źSd *ÛMDôvü礪;k¹L„³¨Pgü& º˜"«sÈ8{{,åI㨒ØR5?×ä_K{fÄ¢'h†ÆëÔÖ7uÐWÒÀœ$ùöm¤¶/E&¿×|†ô8ËDÈ甴V–Ü„1“2ä–,4"ÅU’î”q³<éèv¿ÛåO%€fÑoòÙV×±!YšMž<ÝK§ç©jqXí©€Qæ9stÿª 0AU g˜ûK$/ozé!'œ6’b(¤m>Þ¢:ø¶ÈWÓ´UBÐú1~åOÍfFžƒ Ö€Ö~TŽ8̱nPLã¶>ޖœ.¹‰ÎÛǑ¢:@ ©ëÉà4™%§­J¬Ù¸ ÉíuâºÊê§cCyµoõnô™Æ6ï\æS’4rF(ÙEïJCÉÀ,³~<{ξ¡rrKcö€¬š™’ºöDHjD,)’ÿ+S㠔[±Ñw]—„.LÁfðS¶àŸÇ/ƒ{ Ûþ¶[¯Äà̓?¹D Ý#bÉ=3¬5ôÅù¥…i“ƒm+°á˜ëY‚½U˜o(6±«`Ø {OÂøàìúŒ¸Ï •?÷çìWK¶%© œ÷*jö!„X§ÕûŸZ!î{ÕU+ðñè¦.$ BŠÏ¯ ¹ÊËeÝÿ™æiÖ©cM”W]Jå|7 8 …ön·@4ˆHiôù$27±LÄè#£y¥Ëò=^H´ZoêÐ¥s‘Z_„ õAdýiìg} βöáÀLn6D á#४DŒº=‚þA'šÊÂpÏ]õãÃë Ç¢ÔÜÓd“W=$`X^ÙÝgáTw»LW?“CóLö³¤9$µ(8v¯ÜÚB‘ΘÂÈv0û«ŸðÚm[wίqس/Ch6§¡ŒÅÓ§õ5ºÉ€,‘àbŠ&ù̧g^ˆÇ×Pš‚I…ñü uøfZo&­‚>Û@>­¾Ýš×ôz®@;R7‡õ\›¸²aÂWt6Èùaë»ÿ^ÿùG±Ç4;v@Fø¯ØµÏ¼6 åÌü%¼ò«Ä¥L™6"Ö½Ö%°IY÷jŒð0E+èñeÑó@â냔ªî•CZd@t€& â\q“ôH$º œkBDë+ð]*ƒ +n²z¢/¼—Éûaàœ¹XÁ˜šH,;-¦¾{¦œß6n°çÅÅÃÎÃ+§ùD:փl#œïÛè˜üÀi‚˜µøï–êŸ`UÀYÄQ_üÃý9±¼q›DZ(HUHHQE +{¥–‡L¼Ò^Jì"g¯cÃK§¾—¤•EœH¬ÄÞϙT0Ìi$ø§o"xK€ãÎ).fIêlÞìó+ˆû&2¼úô.f*Ôק‹š+°±417Ɩ-Iщ ¥yw?ó,^þ:C/± !Ê6²h°Ê¯>&¼Xw±ù÷%ƒQ†"õE¨ƒ«„ϪÄ]%rÙ¡Ø#1ÛÁ¥ˆC“WÉ[¸‚¨Rìq/y^‰ø2­;©;Šƒ+H^SÑY@Vó`XÏ%3ë#Qu,¤æ‡ö«ûŒÏØdÖKGÌ·Vc8Z7ˆä€K<Ï$„ëkãvڐ™“8êy'lÁ‚!/¾Ûá˜!/֐šlÌüœÑ *ôÍ1c£Û”¶¯»©a^ß3ÛÎój>‡öfu,ý£§¾x‰P““ⶑR¦6 Ú¦Üΐc›¶öz¤TY»óàÌøÒ1‹¢¼K •Ryû€#$qTO¦v™0yŒöìÒ#½T˜*Њ`¾¨Ž\{xƒÏTÛ+}Ǩèhû E*l¶G—ŒmEÎ}®IJ¾W=ÆÝò²ª‚QU8Âá~ –ˆ'Œ«˜Ï ŒÅœ„/%€Irý«Ë?§¿3¸éi#7ԯφ·8R…\|ÀÝt³Ùºã4fíà¶dš)òs_Ä©&åÔ£c*:¡Úh!Ú©-eלvΩ®Ó­ùÄÄT +â >$HæÈT IYƒËýÑèÀ(ðó|$Â_ KBl <<©o(qò)ZˆâJR‚\"ʚJÅh¥.õÌ©G™0u L)¢õ˜Up=j»›Ñ±èÂÎyñÏ¿¾Ždó…Žpëw®Ä„]äFô¨öžÞ)Kõî¸|å¬v*ò ÂÔû@H‹Þ9X'Zá©ŽÅÞïÚøZÙö·Èî³ Šuk>Øÿßíô;ï΄+ºAᨍQ{ށüJøטÃÔ?1A·4û”÷ VDíoz–{Ój¹®€öÌ\n`S`«Øðß îsÞ2"ÖUÒ ½åòsc¼^¼Pû´zå:Õ5¾h NX^›OY&V³oXcOXây½ys"ô!÷Q÷Šc=–ÙE«]À‰B^¯r¥¼á·)¼ª «ŸÁ¯º‡éÖø|!ìëMÁ† šO> •å;ª‘‹ÔP“7ˆ†^ªyðyõ7_ã§J¥«öàZâ;Ëҕ5G2=¬ÕÌÅgãe©“¿hJÇàɆ޸<òÕ¬ÉL% +tLZW­…¿ xÆJy¸’áìÙ 4¨Aä½;µYb6ùxÎ^«rðhÊÑØrƒ«PôiS©€$ kBC”$‚)å0±òÜ“<›âƺ ¨÷k*žaÓ @ßØCŒQmò÷_²bþ|a};ƒIÿþø&¡·ÿ×îsÀÚÈu?+þa'ÚÇø“æÚÈpß + Aåý« +’7Ki/Šd•JÁ¤ò„\T]òžŸ +eëP ºLÜÊU°ÐÏàŠÌ[J˜Íéœw%·ÖFÝ-ˆ]߂»C7áh±S|lç#ý”W+†ԙ?œ9P{2+}’Ö ¬Õgޅ¢ÜdïJ:%¬+a¶F¹<ÑÞ/`͜9¿ &EÍlm)mÓDۃ;„ý\âÔ?ô©W‡Œ#©¥"qñMnP§}t˔l¸Â;“ É)¡›Ê XJ$! +ëšû‘Y$ø1ŽÔ_fÊ\©4ôáªèh±˜`xHPÐ0An¨Â•tu<=ÕÇÑ!—’8Ceö‚nÎ|ñxŒ0ˆG֛ség*kÚÉÍ9i±ƒ!¸Ùº¥C$ñtɘE²Y{ã’™’õÖBA›”Ä·wyl}ÍÁUad Ù]9·õ˜M¹õˆrÊ[ühNïj…Ø|êgiëÐ5§¨×¤6A¦Ÿ-iî­½Œgº›6nRõVñeOû5À® õŒõ=Ìq…­ÖÃsKÉpùŠ6ۉ÷3¨­Ä~[z@½Fû#«í(ÅUû->­îùŽbÓćÆÒ0‰ʏg89lòr÷”ç2„ýbVPάÀ›‡DË:Ô^a"EÈ\§l=ã2µ”"§”9¾HŠx#&ž3^¥"ÁßÀªû ‰½ð,Ë;O‡(?NSº×¶}"±A6.˜" Êá:÷ƒ,Bhpè2!>'uNx7gàÊÁurQËØWÐUôÂq]ªǹÎՓãÜÞá¹F9ϐw†HƒŠö¶ÐÙyx1œè—23Å<ÌãìÚ±ã?$§_í´Á˜ôO¿P\€Ä¿\ÉkˆÆÈéH~£é(Àƒ´%NB™X÷ä­/l2 µóBh)òZÊ)7ä{»šu‚ËÏA$^ºk½|ÿØ8ϟõlÌ¡U-îʼ°È1àè^×µ¹|½[w¡ĝ™{#p°õŒ r|À™càÐe„`žÁŸüBŠ2!#7 µ*abU§ ÷äshÖÞ\™ª6&ßw>ìʗè<¨càc (´,–Ÿ;3v“z³ñ)n²àÀÿͪtzwÔåt<Ç«œÞˆa¼LAã­%ÆhÿÐz¼/AÚ£n²kï$¢#Ìʚ¾X„É`5¤.vTõ3µʦ (p¯µ(uÀ7-z»Õ̵Ï*¼¥¾‡ ¼V143:’TˆrÍ++9÷u©ìP c["ª¹°½i­å'‚$Mì!׏Àq>¹Qù“=4/þ±$¿/ÛcÜ$ïš*=\wMù}po—è…œ;㊠^¼2 Ó<òó,© ï#šÆ~.„ý—ý*I’ㆁw¿b> 0’ yöü_||ñÿ#ŒÌ«{4ö|‘ +SÕ\°äÒÔ|[R¾Åá¸/‰wZ4•=΃/éSjR“ÄÞ½—ùDmº0b”bPӇâN¶ ¥þ¼ãÐê¥ 0ƒ“|ù§“•$è«:ÏDˇÄù·D*֛Z¼q½PwŸ($YBOjr×òW \>á$¡…†‚§]]åy$$j‡¯÷-+¦û­æp¸ó6´œÝ^)›p JÓn—)Qthr¨âöoññ~ÕÍ"óºyõp<ãê¹E·ØÅêQÑ®’G£wê²Ùèùfã1û¡ç›#^ì…XPC9am7 yE]ÂØjQÂ\lÓþÊ)°'%œÆ_5‚AÞßFÉ †q Ñ¶ ÝÜ :M„²Ä1ó$Fty¸uWP}4¹†Q–2zÛ)g¹Ž®2)¼Žúwʒœ°M¢ÞZE—MRnîˆÀͪkè•:&6×ô¨¤ojÂSŽSÓ-6,>¼šàf&¤OA:/õ]j˜_ÎàÞÕ:!Pk,±2åLf6Fbö0_“½}¨ŠWŒâ(°X“ÞÜ31«ƒ‹;I4}5ƒ©]`æůºA·¡¤ÄŠ¯Žk<È©Rç-Àœñ3…k‚´AH¸‰ÓRì²Zo—ÙØU¶“±?ñtÄ/¹XwpAâ.ñ×ŀô[z|°ëœõÔ-1“¦§vPË@gSKæ38ëA<|ƒö¢ãq~ðÆæì¦Ý¬…ºp𾋵ng•×B,é“êþic|=žg^CÁ 9­&b±¥6Ãl.]÷4Î4<NÄq<Ûl¥YcÄÄ  +C6)›ªµ.ÈtÙY|Üvfw<$¡@ŒÚŸ}—S¾ -YâÄj‹ÆâàÚ¤ÄFui‚,ãðñ³Ã{RËâÖñB+TQ˜tXT$kÚu^KŸ*ŽmóÐÜɜ EJí瞇5 00!Dë¾f å¾Ò Š½°Ä¤ê r?’p1®˜'g‰1›VrÙß÷ÔÒýËt2:?—Q<"ÞÞ¹:D"¿u2MÆÔOÐL´“Åâ³òª“õÅ#lCsÀعòʂ¼Å‘¶8¢ÃõÀ=éSÅ~ô¶Iƒ-꺯£ª›j>¤H%jc‚ž^ ¢“Ž WÑ¥œhքhÁí9Àì +¾ðñ‹Ž]0"Y\HÉ5p¶7)‰³RJŠ°›s×® jWᘘyZ‰9, ÐkŘˆ ¡ dé؂Ä}å1—$撖ܦÒ¥eV¼T\ÅCVpIZ]©iªíåÌáO*H`húe³}#ê‹âþì{L—‰F#+©Ð/󊹂áFNE×I]3ÂBo!÷ ©tòù(dÜò ¼”W…íÖ”ªCÑ·¥~×Ñ —$š6–®›Ôu¡VêQNHöûb/ªFùÚ%ÊM²Ãe[ÇéSWòÉ1á’Yó7t:@ ÓÝó"‘2²6¤P&=ê&>ùZ]ÉêŒÌ¬ÔЦ1% ºp#¡¾7}H="ág¤1pÂ;¶Mò8Ý*ßDÛFE¼E cRè’®r„ád%ÃDÈgKºœIø¾¿<â +lèüzW@HKŠ˜M}ôéÔ-WT(Ôëb÷¡—Kðªý£ c†6™Â?ק5KÔӋ^®š”|’<ˆ‹C/ÐÖ +õÞ݄–C‘n­_"8Í·—îµ,ÀIêùÈA•>·#×´$¦ãNSV¾œÌÚ¤­Õ¨d` Ÿ±à™ÒÈCbª‰/Y)-GWÞÁI÷»YÑwˆ¡9œ§Í :'­I{µ»Hï\cSkMã‡'t³Ñ$‹ý\%Ü@ñÕhç7¹3!ÛZÂÞq#aªõ··À9D¦ Aë©}.y«a–Ž­ž˜Æj‰Ý”ŠÕ%;¨ê<.Ìñ¿--ÑÔªKé2g4b¿E&ί¸À=)’ šÌMÔ­¤ÄfbZHÓÒªô&¦¤–§Z°¬bs¶²òcè 6C¯ñ ÙÖEA„#N[zVóß÷!2dI©ivDƒ#ÀŒ4ʋ<‰yú,Ë€é¨çͯðÑ_M«£fO<Øéc}|Ò¯œ ¡šH™./ñ z9»I(wZøm»Ê¬VìêÌzÏg;pq^V°ŒP²„¿Â¥¦Ö[ü ƒ½”ôºÊMÙxܾġ6—&£ÚGþM à@á¿úq#£‡ÀÊ<Ï4Ü㲯=¶ßÄä·VT ÝÝç}§ +çò2=†œBP=dñ’¢¿S±&M" RÖy ÜE᪍Š”ÿ¬5Íß ¸YÓʐêhÓÙþMã÷„η#‘‡aÛ¯¾†¯»€˜iÔßß4UIÎÅzÞ*D^ÿxOñ×ƀLÌ+×oYœ7؀Íl<֐Pƒ=d8ã=ÜêXw"ŠÓ†Ö¬ž9¬ÆBÂ\t᳊…ög˜„ÕpÛÏ¡Ææ 5:‰)Á–X¾n@EcvCAz1X,±×ºÕê¯íÚëñÏ/‰Û™ñÄÿãíÿxûÕ´™ÚÀ·'±ÌÆg¼mÒaƒ»ÌI5­€Ð…Ñ©wÎѸÉfæ°ãŸ¿@/Õûqc“ tâx®TëÓ'­Ÿ×=^¡@ÆJÇà´®”W¡—19¹دrl)‚v•áÕ¾Ä]%SzòFÃK%¡åÝâ¹Váôæ}KÄS²öƒ4û–?Î3ªË„³ ïó„åHS/Þ¸á‚cŠ–jã)iVF?ç@jCmá­é®ªþ—*Ä™»SŸ‡'®"¿:a y8ðÕ¼OŲv÷^õ +®ž]m-Š¯®]ӓ¶Q•FñÝc9úu!Ôýh o$îEÚ.Wnzh2óG0(A…æ°ñqiÁµæ1ê²´5~¤‚‘û$O%²œ“ZÑÑûv(¯¤IºxéáÜ ÝïH•aµÀ8d¿¡™Ëw„Þ«Ù&E”Z„«ÒǺ’-I3[’¯Q@k[ZÿxŽOiÀoß¿~ØãÕv© endstream endobj 99 0 obj <> endobj 100 0 obj <>stream +8;Z]"6#sjc$q7kS/r/Xc4V'Q6n)KpnlP+tG_$C@O@-fe4@58MLJF`N/BK_/?^PRD0 +(:)a.X+kYj.S4+sR6`:lEC6fC0\P#a,ChF$?$tFhO,pFSV3&?N*X;.#%g5)E';a*o +6*6DZmcG_oiYaPpP8NQ+`17h$aY6#!+&+)S[;4[kci!Jb]RT*.d>XA6,MuCYOD!Qq +KIrPr'Wq(=H6=97*S?%9)7smij4YSnSa>$K_T5h +1M(],2U3b:-rd;1E?IY4T@#a,lVJ\jH+9%@h8^4g8&C,63#5?JVXQS;6Ulbn@^(2F ++%J?.H,u#!Z\QdfY;P:?K#RJHhnR[0F.(O^n)'(b==S(j-6kP)lbCTRN]`eB5^\`> +Kq_Zok,acapr(BEhFSuXFks9-2qCK>lR(ia,Go(7_qbEkpK#H0I,t't5&,E8HN.EA +RXq endstream endobj 65 0 obj <>stream +H‰|Wˎ$7¼×WäTŽ$’z\=ö´X,|ð4l/°möü?àˆ ²ºzºw/Ý’R¢È`úò¯¯Ç—~-Ç?~=n_¾þTŽ—oG=Žo/ܾüð·o·1çéÞ³zÖhǽú:G·cvàyüõËíכc2FüÿEÞÊ+Î6éõœë¸oˆéŸ?0]pz9þ{ûSÿ‰¬ÚiØö°ÕÎáŎ—ßµð÷Û½œ¥¬ƒûAP;A5óxáB‚61û +ö>k¥•§u}j0ëp‰:ˆ»g£5¢åB^ÿ¾ÔÚÎo«œƒ+gûÄچK Âp®åWÿUܖÿ˂--Î5´n.ìa«Wî­[``.ÙS:>·~öåí!0‹kcÜ_Ø<+Ì¢qUȌÓʜíŏ–·r#³iŸtšÅG¿µsÒR˜0…¼´4;¼ÜNt7:ZO$ ,Ao.k}éb˝󒰒 ðG͏!?àæ£ËQ}нe/d02&KcÒ¬gá™.Tb)¨sÊ×esbóaNú´ºÂ7 +…BjÍÒdWjlô·žü= þ½Üp_|l¸ÙQq©G)þÁš ¯pÖ0œ› ý‰!з³oØmÀƒkbÎpµq$±¢pa7-4¤ÚÄɵä€!\ ‚°ixî8 ‡ƒ§58€ÖðÃÂÉu0Ÿì§Án$0‚á°3Sò™üïw +Ú:¢bÈõµðÅ[‚b À¿þ"ài\Á7@øÎah½šøÆ(µyÂ-|"·cf¯ö€°תõmÞ@²=ßGXB9Ӗ^ÀÕs÷i“±RR.e˜wJc …Ú°4Aï¹Y¸–Ç9,·+Ã8ܽ-°C°±€M¼ãîÌm\tyãéJuÌS‘h»OÁ˜ûªÃ›ºf-7븿`~Û/š[“Ó~6z U#Y'ÒΑ&A[$k˜ّÆ@™“ã½K÷ºV"zà\.¯PNÔu`¯ªåUŠH9¦š"ÿ9)0¡.Uò¥¢Ücž2¹§’¯ºÐòL×N÷¶é”T0@Ì,™/¡xcåh¹«qjíBÉ@hq:@ôCƒR"Çá"#1ûçä†÷šCœ­c“ÑžÉ ^À/å¸#V¸*ÜM¯%È¿ðrþ@”h½?©ë,Æ/÷—Û»ñwŸ¼ßîù¤ëø4»0×ç4 +nýÂwj<Éȅ?àÃÀk|øéw ÞLÿɀÅz(¤õs¯ßàÚìšË£ò«mÆþîP¶‚²nU`€@1$TÇ'‹MÙ@y¢²xŠ3ɽá«*Ƅ4¢@,‹ã fù÷wdOCÔ9}Q)ÿ8"mz`[Á¶ÕPªÝLŸ±šC”±œ]8 1¿…´Ö§ÝáÆ2>à‡åíç¾÷ÕĦ¹b³±ˆÌg_Á÷°éU dÇ÷øޘ‹M'¼û]»ÊÔ+ÉZ{|2°ÎU䗢Šô#íiù{X>»ˆQ²P2rO xîé|ÐÑM–¨üÃëKÀØÌ@^f6Ub Cg©gªÆÌZí–r3"³PõV9 ˆ2u÷¬’f@w¿{ƒàVP9 ò¸X%{¤ðVô•(ŒSÉC\¨"^S´ËdÁt ++Qge“Àµ¸*vbILU^ˆ¸©àî̘™ýªäŸpe%8tH¡©í°@»²ˆ±Âak©HÑ46DÁ`M*º ˆ”±k”S,»aþǽ8]f ‘bKB³?¥pbÛÔP°ajëâ}§R†ªa ruMèüØw•eÇ;` 3Œ€éœ–1Â×»ƒÎ.Ëhb¨\ƒªŒHôìáUv™qíݱzcš’pø¶|iuu[>#O^ÐÕ\Ûä8aåµÙg³£b·eÉ,”'GÍDP؊ex`?†+¥ØèƒJ÷¯5%—è(V®Æ{f%·¢ÇÀ&¸eƒ1*CR>a8¸ì榓BL¡IÎø¦‰*oφ˜œ!­gå¢pY—Ŭ.]O§»n² e’00ƒoƒ|µ$¥NA¥~¨ÂG“+Zc^™­l7™¾-+ ÜÈçrPŒ…xÃÕ0ÐúšfÇJý_¥fK¡äÓ²‘g›J™õ¡F^` ž*`û¡Ô]={X©'Bû_•*]f¤y`¼×(¾ÙÀê)0–š ‘îÊççÉ!Âlòrr¨±‡®¨Mjª|Ʈ¸>³XÖc%xÑ1BF¿š=)h cC¿³SXâodfìá¸u¾‰ÐËãŠ>ôœC§ Æ9OC)w8%˜ÔÖ£Š0šæáhF‡Ÿ¡RŸY›jΧ¢è:‰ ”H2öæ`Œó‰¹›ošíÔ\Ͳ™ê»±‡±oÍ}‘'‘¯<žŠa öŸJqӗ'lË©Á晚b2§¤‚àx÷™‚ëÆ#ó¯U¹Ï¤jS„§{{êXû)! +)*=–P¾X!RzÞS±aö³ –¬K²­”RÀ–/Ü®úÔBýo°—á;U”•sY%qz÷±¹˜µYú>#tY7ïY8?%ôbN£ ·‰‰wO„fŸ\²¤ó'ó§=õZž”oмÛu%.ÈÖ¨)ØjåùÄõÝäü­eÁ´g(sø$}1ù¤@µ¹ni»’ ù~eÂ÷7àm2½©õ{ú‰T³HXQáŸ` A÷%¬í bGY2–%,­"€´Çï±®þcrS¥˜ëôk×Ü@eýÞsˆSЋåÑbýUiÓ¢ÃzeáÔîBçëÀl¢Æ@&±¬ÒOu,úë¬y 9º8$c«{1îóÔ/î!Õ9 CDÚÚÖ,æ¬àëвÕT]/Ì܈ Ñe\ÏütµÏ•‡ ©{l|¾Í„nÌ±Åeµêi©KtëÇó…¾Ï4/–Ý-¼Þ£ú»D«#Ò7V³Pd.y¢ÚG^;jKzÈ:ö§\dZ«—“?E ƺà«`\kyÇzmS²I½Î qp™u«Vö6ªYîTхÉf*!?Iõ&§×hIËL™S‰ëYc·è‰JÙ9îÙÐûÊ2]EŠš$*iÖ.ñSÐójAÏÇÔµK‰ h8d‰²Åňތì_á‰6xcñs>0yEÖß ˆ|!ö«îÇN±w8R!|s³¥Däe‹‡oh=5.ƒSænXŽ«†ó·‚bã15W5%ÉÈ f®›–iÁv>Èú1Åԙ'gõMȾ’O2,5EË©0ڌ Ë]â’û‡::<äTÐ2à!‡>qã#ñÙèâʟ”˜ªªñ`¾Wˆ€÷Háy])GÒÚ¢¥«™#T‹ÌK·ØˆŸðÉÅ Ñ\ŸrŠBN3sc9|»mrۛ óù©Š"ÿ7õՒcÉq÷:E_`&󞆖6¾ÿŒf½ª7#c Èö¦»¢²^þHF™ŽyÔA},ÛlÉé¯Aùãö&Ì[)pØïþ䕺¾ˆ5»ßf8XkèçM„N›ì„3Å ë&×Êh|Ó·¦´Üvå¶)áÏ_^Û~}qŠîîýàŸOÁAÛÖ«<†í¸¸;õÁ/ ¦L¦÷: 0ßD 4 &GïhG#?EÚ8k2$Z£XDb°¶ðQ[h:ù,Bh×î¨Ê†²»A+"ژºîáÙ§«jt%N¥©aFòxÚcӋ­!1ˢٙ;—÷—|UŠ}EwŽ•é”¼õ„0‚ó#…’ÏùøÈE¥—S ´©ð"u:Un(Ðä;p¤ +§&5îüJÈ]¹?—:LIrAabî é’¸¢q-·u©Å„ê&~㧋ßú_?ˆŸ¿‰Ÿÿ%ñ;zGñ?*~í.~í!~íç‰_û â÷wjŸŒã‰_Ý.NšÑ‡z4‚wí³yú’¹):æÙ¦x¹Ã™LŒ›dÂÝò¹°û¢Ñ9]eŽßk0ÈNó;^ì02Ë|À†Ž*Ënv4|KÝäd£dÉf@gR»ž~ûê&Zd ¤v1)÷Oä€ùàr€?9`þXo°PPß8 = °? ðz3ÀûO9ÀÐö:`’€' ø ø ¬ ~ƒFºÉ ñé[s0CßؼÎlÉ;¼ä9ý·rvÚå=”ÜqÖq +;.7 Ãd–FW.+ùÌÏÀŸgdr¤vY” š˜{g¢lN—¸'O¼Æ À@éÀyï ‡Û#T© –ˆÀ =úh#añŒ¹“¹µÇ±­dêŒg:=Ö/E\†Ïj›+*ÃûCÍáa.é²÷u”Õ6â>`8p1è¦pù\ð뀎¸@Ì<+رÜ­«Ñ'ÉA&+ݨZZ4™VI÷~=¯¢FAh‰î ù…ÆïYÈ,Ë6‘Ÿ#­(Á앂ƒ¼ÄVjÑ;™ Ç:«¹«Û€æ¥ÒGÓǔe¸J§COÁ¨´†&©‚—8*9¨ë‘-´]"t¶Âhö]Å+²Ëìýjúï*—ìšþ²‹Ìst·tîRŽN5™ýȀ0l§jLî®59©‚4Þäß«+µû×’¶ëFaxû¬êðäp=ÝSŽˆQP.]êš<¯­%qÜÒçn[¯¶Ñ³8*[ëWQn/°Ë|5t…Åå|WöL¨6K»µ½’+Ô¸V’ˆ¼‘j¨mµ¨¶w"˜'RRÛi€ûQ^ÏDÌ덱ÖØê 7¨äêÞÜdç‘ÑIHۗP½:Gd°G‚ÝßÌ¥gâ'wpf´þäõí‹6÷m†î¬Íû› +_}ír×1„¯_ÀÃàMd9 La\Î}S…ní¾m}ñ:–·÷s>Ä2Ê;äÂþ+z3ÿ6½ñûãÿ£ÞøwëM³E´ 7=®-.ñÐ2‡ w-ًp½&TÆãžüè/ŒWˆJ:q/ìIð—I!8áÅ/œbiùŸªt½½þœé¾ÈY9ó5YúÙ1n¥žl‘éd:Ö¾oŠer#å7Y1ù€ånï¤ü_›Z×÷µÏ–t–×ùÏÛŎ±ÂUĄ¡Õ‘Uöd3.gCþÉnÉ/ÞÒt6‡JcFR6I~¥Ž£eÊ=01»dÙ.ã'©D¾¡Ò–ht¬.R˜7ïWð«ü+¾øŽì‹÷ Ò¼ò˜£vRŠ¤ gˆKÆÂ9©ƒ[Úª:Ͳœ×møE]Ô»ä™@ nž +xX¾'‚튻Nólfw„%t‘Ë,hÌÂNc ‹֜¢G ½Ú„­U¦äâªÀp/œal§•5Ár3¸µÑiãHƒ5àÙëÃË Ò +ÇAVÆÄ+ù:~"모E¿Ž_Ìlļ-™C5?ä¡å”[cJg'#û»©+“Ñ‘XÆy ‚!*q‚ØX7Ñ­ERL4m›¾ÄÉQ.Žåé,c +‡)€Ú:-hÀQQ,;¨Í£«3ë'@7Êrå‡5š¨{1EÄ«8f4!•Ž„3‚•[\bÇj»Á*(I2lltýƒ²ÙbŸ%YäÉ{cB%cžtß{Ì/ñ,>#}#‘:Èâé6ؔ1®$Bäa&ûNJdBHß lO¹`l.ÎT^/6Äp¢¯$ä-ƋڏˆmÀ=4¾ÐH4UdE÷°utj]…ØÅç=: F: ½àìlxâŬÚ,Ú°€³;Œ7¡!ç:“³£°ã »9VgÇ8è{oú¼¯<êDýƋÁѪQ-¡ ²óӔÀHè>Þ¹P©Èԅ.ËÛi0ƒXÈi1™ÕX¦lƒIoðˈ]$œ>/A΄€›ãç…tÞTŏA–Ü‚ÑƕJ?˜ÿ¸”tᑅQÙIʍh7yºëu4&²‡Œ@Ð S±tÆÞÀ5kÅÐ2ÎBτ>!Çà‰¯`ɈãDw3øY9n‰ýoê«9Ž$ ê|>XÞÇ{hc6VÙÿ ëGdwUƒ£ ©¬”Weçáî‘B,o +Eïl?êÀt³\s B·õöŽKÙw†ÏÀn?àº)‘ñ“Œ^ŠNõ<|ÿv{ûÉ}ºëJgù£ï¨øµ&7¯ãàw2BÊ+”µ3|lð|¶ÃöOßqV ½þ3žo5~Åøg²óÍKݶñØß+‰Ldb/êU¡¢ðˆ°\Sí”ïÄn«~È×:rL3E3Ë~J7ØmeúǬó£³Ü__¼£ŒÊp“¢‘ }#’z¾°&¢§=í@•¦ƒ–->ø »‡“ó=³#Œ*Š;~l0=_»,Pê`€p •d]CÕÔí~êB;Šà¿ÖdÑ·ç<¤UŸÌÕ<ú^ltœ#ºúôWŒz¬—áw˜çø¡ÃÛ J0Ô -\^›²nýÑTü·@uUWŽ¦jHšG´\n“–Å»é¶ñûƀ×زä \ïÍÚ!ja1Œ&\@‚´Ÿ + (sS6‡ Ç+J©6L8‘ZÔq±Ý¡-êFƒªJ×À±8+f¢Hš©7îiÙC@‹gÙ¾J¹k€‰E§X›|½hV +ecQ³¶Â\í¡†Ô)yn½Kºg´n5è̖çIӎ·}hEMn-j+YDGßÚUt@eŸ›—*¥ ìEŽÎ†?n¡¼4u<^ uŒ¸_0આ¼#ü:,µmW廜áFjTÞÄ°Aìäëy.͍^Xf™[1œ-v¾5ºÌ;_‚݃ ،²ÇÅAØ>67-íWufA²°î„ÖÌ·ƒíãm&)W† 3ú{/A'LÆöh¶®]H?»Årk#G“yó](Œø§ð;È60 4Ñbʴȉñ°AfÊ0ë°­jÊà´ÏŽ©3CÔ»N²Áj"3$Ɩ;؏ŒÞXâߙïSÞgœE‘(…×vµÒ~ÊÛXUE6o(A5¸/ŠsÀïR3zíøLK%Ø)Ûe¨¶çª6ö´­$Ü6eìæäâ&Óhjþd§$6þ±ÍE×Îüå‚ýÎQ0ä¨$¯2·|‘rár3º•ãàcú>œÈ/zî$Ã0;Õ¢­zŒã³ˆµ{ŒDÔ@É]ħÆÀV‘»S°ây9 ÄD]”ʐ¹%Ŗ@RêßÉ؛-ÜÔ.Vb*T§³m›JIÄêx‡ä©h.Dx¹oUÊ*´T@1œú@úm•ÇÏó¹¿Y6ß­›ww›_Ô-wˆpÀæf%à%³i¢“ež,¤r…{¯éæÔG¤•W%é tKE¹*›?H Ñij†u +Q|™úÂrÓQÑl>"‘sºällYùã ZY1P[/rƒ—GÔ\í†J©s ¤a.Oˆµ“¹uW” °W`¾`Á}ŒÈâ¤*?$p#`œ¨a+€n–:ßpc1ܔÜuX§I‹ÌËD` á‰Áׂ6V¼Ff{]Ô[’Ls2 úï_s½rèR¡Ni0ÎsñlÅYŒˆíOåX.;€/‹¥+øy /4E ŠTö`JJ?8)]æéXðØä¨3’£,l햗¨ž²9ƤáU®./Ÿ&²/¤I#JM¸1áσ³ü–v›Q¬˜Ìv‚ïÞX–¦'ù†µ»Ú6‡å¬¶S‡u¼]ô¥Ë½…`f…}ôÜn•–g§ºåM.¦f”Çô¹»±®%ɨrPÕؾ½àƒî1„Ÿ‚íŒå!ó™&9>g n  p[ýÙ_â¸ôÀà©Â'mf:“ÅØ9× 2H¡8gªKe-UnkÔì¥E.Œmœ7”EÉÛ +±_‚­»‚È|ÝÆ?éC—1OjҌìuñF}$, öFâÔþ¼ôÚµj¥ ì „Ëß9: To¸›"Z$g1G¸[ öhAe8*¦ë´Âºðˆ^„ÕÉK©óñ¥{PQ‘L“äò°U]©ÊÈ)S÷i6¤Ád›†¡U—ÕÈ0šŒ`(ZY_Ü0`mßq¯R¶ +è%7¾dþÀMgjìWÉ’³qy ÄDÂõ†jŽI[7·ºó›k„táÂlµâOØ{ñDÜn[ŠŠ®œÛôĊjä,Z·çÖµý î.òBèÑ Y˜nH$:D!ÿ¹¼£AfËC\qyœ±\ðw­Ñ_FŒë½‚ÇÇ \Üs‡hopKšmLáñ߶Gôí ëÜÆ#_vdüýÛsÏgÄó”ìñ^Oýý.7ƒmY¶ÃHQ»òÝBRµä©Ü^ÐõàƒLmL6ö…M)²ÓlP©Œ³=²CÂ"*µ¦k¤ã@a±õÔ³Ù =¾0FÕ^TM;sƜTõëþ)wÕäIŠØS–FˆÌ)a:˜®21ƒY™—ìÍܱ|yŠW•Ô’ô-Ïr@Ž¨¤œoñ+|̧G-jµœ6„T¦¬@út.[È ÑÔ;Ê/RES‹wŒ2*ʼn?—NÙ%jËkÍAҊIk•´RñZÿP¾¤úå+ÿ |õ•¯ÿªòõŸ+ßücʗoʗ_”/ÿ+åkWå;2ø«|ýÏ*_»+_û—Êת|ó§Ê‡¾7§"šèF úÁ«ò¥yڒ¹%9©D—RòΠ¥Ü¤¿´ÛY헜.¡f¬ÊóË#|ì°¿ã‰È#²Á0Ïlì©¢ô¦4sÍq·¼ t&M§¿¿Dcƒk2ÅH‰¹_x ÿÌ”à}àæàõÂëÆõÆõ…ڍʍÖ ìŸò@¹ñ@Û¿IåN剠¼Ay!‚u#‚;ÔÃõGL¯Tï\`!ú6˜W6‚ ú ڕ ÖÛ-A¾6€n‡ÿð‡Y +mhV3ó€¥q¥Òì´£\[É:–}é»%™É±²3ىyñ°U­_¾NI}r".™›R³‰%É9(¯‹Ê„ ͲJE 醷4©ë"ÇF¹ÂÔtuÌÎ5•îEW:Cs³Ù®)>'í{õxöÁÕħ&¿3LµñË:Ñ¡Ü[4’7 W±•7j +žÍc²Ú_PúÅuZâN«C? |Ü1¯¸pœÒp}r_®Tœ¸%ë†W²u1ÍUuÅæ˜iv´ÄÎcŠÏ_Ûö4­˜5͞+Øz‹s²™u •‡Øéz‹±ÂôíqgƒÅûŠ™CË8Ù¬¶¿OÏÀ^æWP‚~Vìh³U qu„.øõú©Ý촛ôõsÔB¢¼ÔY-®CT^+e•ÆôaFq~9+ŽcÙV¾.¯š½LOÌôtŠÄ¨å ÍL_ËzÜÿ{:]ÁX!³É;¢®%KYõCádsr³²‘a̸´´½µq0CÎ7ŧÎ9«l_È°íû¨n¿»™Ü¥9v;Ö4QCÆãk>Zúɨ +WÉ1V/SëaäÙ×E<eÏ2gVA8S¥_ùˆ, ¢'¼–HÀr$ï;sá£-™²Dîñ´‹‘ÏQl’\—K'÷ó-KZtôZÄ0=k$þ¦åá’(Ð|<øóãY¶Ÿ}µµ‰<‡ë˜Q·è¡³D3¹s“}ñ3Ï!í³û` +~úõՒ[An÷>Å»€'úÖs„Á˜ @â,fî„UEv«Ÿgd“llÕSwK¢Èªâ +²„Gùf«4»óöúý7{æ4i†²ØÃÅöSÎf­ØÞFxV z>ŒÊÜ:y³Ìxƒ¦§)$Βü B…ÖýðLd¿5Ž~Ò/™°ÿÙæuæä´Ã ÏYN¸•û°ÓEÖCüegQ×V%f&67úrÉWö1}ÆÌäLí2(y{¦l~ÎpOžxÀ?éAƒwpÃ1„&uÁl7p@°…E¡ ‡¹Üо˜ÑGÌ­=nÌme³Ñ¬iôX¿”pù½²p¡Iú‘ær Ò(=æPtˆ!¼%M6î}…®¦{° *Ÿ þ¼P„'¡ª Ç|ê)}]’,ª ±"АªÀoUր®¢—~WVŸ ´³4wÐûÂã}ä¤`ãx¸E]š¡£š#w–¸#±DÕaHõžë{±™Z †Aºh=¦·+½ÐŸ»\TúÂ$¡*éîM,eý†%Åw@(Ñ çŸË­e^fßU´"kµØúU>g]™PT²«›Ë.sà³Îû¸²µdöPaxN•˜¬]kò')PJ+8-‹Ê·òQÞ9It´-¿©EØ\Îà㜪Sê°ñF „m†]O¼Un¥ÊA˜ñ*Uºv5a}߀÷êÈjf{É çÛÀ}·££éE©˜½%š*/4¤*&ÝNZ Änè.X¶¼—:﹞õ …lÌ¡¥KW“´Ú`A€R´*ø3žƒ°°Ïq£¯ÅýeDniNþdfΨµÅ±1ƒwÕ¥#ùñõžý œg1®µ[³FãÌ~4‰1D)ÅÅg:üeV΢´Î$³²Yy’Íó×óñç—ÎEbeOp½¥é7éÑ¢R£ [‹\'ßplk1«’,Ic NV°âñûñÂóSç*çò±+ET{Ey¾þa«/vp#oOiÛhٖÍøÐҀ Ø_~ý«î»„×_ÿú°)˜‡¶ F_Æ_“׶$ǻ֘¶ÄqƒÛ^c4£/äúm—_"l\ X¼Èõõ¾|}0{~V³+^@ü}ˆ0yÂq¾¦ßs$7U¦x'Åw&ýŽ¡}Jt„ÛOmÝP)6G` +…C‘__Êm9»†µç>7ēb‘˜ÕúñblìGul{[يd§õ-Y‡ÌUdëÞ¸^î p³ÄÈUÏq'6§L™HJz7ª5Ël¥ñ¸€!Ÿe©IÂCê±Jæw¶þÍåºÎ¬€dF%Påg”ÀZ nÂƺˆEçv¤¨äfàÇ|¨Mòƒ£k£œï Ã=ðߎ®Dy7”¹Ã7¸l©8åÉ»,žó-@„Z+Fm»øÝù˜'ÈËZ3R!C®ã’ž)Q¦°(Û8‚pÕM¹7§5aï*ê +`á©R{Bùslñìë 6Н=>ëQlÓgŒOšÊ1ÞèÝd·jó;W–£y“Ÿµ`™‹å!©eTª'xg¡ +Y=-úÒE‡Ç¶§Ð©büEJÂ=H•¥±DÞ¾V¿U:£ÇPÉU¢Æß0ò’Zi™çãj×Ûº±69Ä¢¡qlZ߀Á¦›Å)ya‡Úy‹±è»ƒìÖ'À¶¶a·1N MìÅ+„w‚ÛP£;—Eë1‡úƒÌ æɍþ÷Ü©ÚÂÙ-Çà†Îrµ Â+SuÀDÝÛŒ÷öw4¦ó¡È9šÚ&Esâ0²öê…Y~”w 7Ž ±Èé—ÐÛÖ@¢/Ñ3p‚Õæq7³_uѧ·j²[µJîÈéR—̱(Eý¼5Ê—¦9—E¦Ö×3zï,oy_MAYdø¸¿%Ýã)škq@«1ï9«íÙã-ÎY²’KfeŠÁŽï}^„jS¼TO؍GÉõŽÊK>ۆ‰ç¬¥;àKvĒ= êgè5h ´šœi¯Îúw?h¢oÜ+m$XȌå~ÿꁪ¬£ã¢;2N¬âlùšìQë!‹òž;VI¼É^¹µ$%Z­J:W¢y֏ â-2coxc&1ì>ÍD€¢ûú(ä~¡:²ê퍌XYñzeÄira/¹Bcê˜:BûGGÜdÑ؛zª +©'Ì똝}œl0ø¯öz”€? ÁÃï{¼§kZ¥lU½ž6o§OV<›A!ȉq¶Ù¯ÏÅf¾5¿®D­¼´+O× ²ƒA¦±4ï ZåHlêñYO¿iߙ¯Gnþ ”iÙÒA(öýòÐ’v»í½€yúT)xAÂìÒ@q{©=—í¦3åÐY€‰$è‹ Kóõô †òFèÁ›¨z![͛ÒÊÆ¢ò¢vFî•Ë¦¸wÏ RÒWq&{sÚÝ +Ô¸¹ ØG\î³eI¬ô…X<’vçvl"'Jù°!E + €ë¯ã˜ky߀dg ª¬\ÚT;^zë딥 z¦¤ GnÊi@¹ö??ó²lÙόÌ;Μù²5< ç½6o¼ÐÛ 2›ÐÏë`´èYŒ e½,#2 eÈg!׿•×Jøl¢&‰h ÈR¡wàW“ýlu۝°ÒREË c ½ù;BŠái@H%á"a“Ë\æ"Lƒ‘©TêÒ€V{ԉ‚¿í–„¢ÆjÙ>Ž+ò“FÁ`à†XÔØâJäÙ÷ ïO‰´û˜’cc@Š®€ªUšâTPK¬Æìw&XUt™•„S¼EÇ¡k§‚,îÁÅ]E•¥ =86“eF VÜ qŠŠÛ…TÖF§°9SG¯×ï¿a¶U˜÷i™„^ôúa™Ñɯ]èa7f^ðëc›”uÏ7vd×Ûõu>?“×ëmÓ£v|]ðëãZÝçïÍòíçÞqÜ;r²ƒµÑ—$ðǃ_ê$ٙ`»0ÃëOò~µÇ\ôU^ )Žå€Òø+ŸW&à{ŽH2€)ÞqºñF L£¡¤ÅM@µñA\::!ú1½ÂaR‘s/-¡Ãc×`§{cBªÓqa_ß_¼6ö^£FºðųjäIk*ù?pJ+7”Ë š„<ҋ3¤åc4ž¨S!k‘6ë·Êb͆Ç2¥¡Õ íêÉ]]0³C±Åªä¡ƒ{ÿÍ~µcW²ã°Ü«˜ ´þŸõ8™ÀÞ:H©T·¯û¸=~ÙKlá–T%Q –´Æ,Ã,]CJ‘Øñž?ÉmșNïtd>úïcÄâ|½ÆEÞxEì—yS-ò$ëÌU +Ù[w ê¡žÈžE5† NºÀ„R¼½8ÄߘL´Óx‚÷÷5ûŽÎåµG•ÿ¯ÙÖbóø‹T/ Æe©tTäžÏ˜äÄ ˜;5*ØxÑܽw¤é•?ŒÕ|~«”ß±v‡ï í…tt5¸Z¡> (Úþñ(²§y× I…¸‘8•ÍìYó¼Æ{ Ž÷ ³¸eqÃÇU6hJåQœ~†7éâMºñ&}›úð¦}—7Mª€JbSqתñÃ2>3,õ†¥þQ©â©TõTªz3,õRªøL©êaXâ)Tñ®Sñ&Sõs™‚8uð½ÄkìaždãÍÛüÊèÇõýÙ-oôú,iU¥ãÝÆänÅÁ²+ݔ€NPP§ï—a‰ào/‡+yÀ ¹/ˆ\ªy™ÚêžEÃmY„ܱ¯ :[EàæEÇý±pŒ’½XšXr>v ²ÁÔMJƏó6–X]bS´3Š|Ç­ `.øö‚ Šûq“(­µ%ú…‘œðûke”_Ú/6øö²?ìÏ׶|ñ}Û÷faÐz@›™zUÆî–zSƵ ¹L&Çð%9ÎÜ׳$ƒuZ ‚Ù‡´G¦’ž6ÔYý<‹ÌA6Íi>V2¢¼:T2ÖÑV2ºÔ"‚Pð—_›¡Í•˜½þõl­òÛk+¾!nð‚ÃÙÐLä~ʕ…:[’R=ùRY؉,3ÀÄg-5µ)܀jÞ4/—§W>Ëd*siÚñ´ŠMZˆl5=Ä|ËÔÚu¨#¦£éÞ>á2ž¦:.?ðþñÞÅÕÑqù ò(=×€´¤{ñqûcä^m|Ýo_|^÷Çkg¾ø¾ó;'èÒ+ ’¾”qÒt0+nü¢4ykF@Žl(KÑÚ0qT v€5— ¡¼£õM¼° ÌÈL'¯C)˜J °ØƜ„ìEMŒ`i–dsû­iâLJ”R»öP³`Ðn—„ñ/’Êü†¹¢;­ß÷ô8@œlþ¦ÂMü†×tøá܃àb8gÓ¿´f5ÜŽdÊmÈ̵VÖ ¢CA4 ²³ä< V®Q™öÈê‚׏€´Å ÔTo¾³¾¦i‰O×uGŒ,ÄaCÈNsÚÌ ñªÛÕ•´c.]ˆm­r`o”f®Ï±¸äöˆQEö¢Oa#´1®ï mi}†µ"ˆŸiáeRØ8JrDf=bë+ PHÚ\€!ësgˆÅÒ1çqïu"=˜Øãï– +O!ƒ%ÓeÒQ-ÜaD« •êø@³ä\å̌á~ÎÜ.{ñ†önM_?¤È^“–ãíß^ÖÇ _åÚû¶ïfªe¶*ÕOL¯ú??ß*~þŠßïüß¿üEÅï•=%)’^CœíÔÆ ÝPt••ÇûDÞ&îgV÷}•sò|`E¡©ç8Þ÷k¿D( ‡µÈÍ·°À"‰?.ě(Õ*¯n"§´Ã¦Ã«®ÙTS"‚¬†6¥LêqèLÐÔñÖëô Ï՘4¤¿ Ó4é©Z t–4F-G<ˇ!?C“òŸÇ{c M“ð…*¢3)ï3ÚN»ÏKaIfM ²«´6¤§¯÷…ÿr,¶rZe“Î즎 +͊â«6Õá˜ë+A4­Yu(XŠR +v&­àÍ­KþÊ¢Æ"AO뉥b’V„LÙeÛÉd¨’ckB AQà™Ö$Ѕ¸/ì'ÈLô®¢•}Ì×V«B‚Ö´aF©«e\4Ž‰V%öãi¯æ-ÿCÓ?V¸‹ÿ>?w½·ÍP45ەf{C˜º j^;åºÐÛKXCiXÝOœŠ‘ÿ³yšuo›¦£©>Ó7¢GººTÆBÚÉdøý©ÑÚ>7—ÄÌG{1p֐ÌjM^ï!'VÒq¦ÂB̔£FgKUgqmol}¨ŠP®©ZJu‚¨¦N +Ô΋E² !²¬ 5sœ© ÌR i@‚t4m=b^6W߬C’Xæâìæ…Ó˜¾IÜešûYe)¿‡] ù›Ý/IÜYV½¿°X)eKå²V•³²´”ÐÐFú†ºããS+7ù:— b'¸à‡^m~«W›Ÿõjå;½Zùc¯–Î^­½Z»õjíêÕÒ³^­½Z¸vfèÖ­y)XíZù¼]›LÆ}BÀ«~‹î€¸˜¬°ÈÞÑ/ëâ(;H¿‡qýÒ 0's;ž•8. Mîú°â"MsI4wŽwºX'ªšœ¡ƑM“C»l飠él`ú¿”úG(#»4·ÏÝéaN!Æ£_ætÁm¤Ì†Z݄bq»SÈóá[© «b3z¦¦Y9éK°2 Áª€‡«ëŠjàw¼úHMQ8&YڀQ/:%»_u ˜8^¯=“r¯þ§_j =Jÿ òÕíúJ{ò6¾‘ùŒÂqKwfW1»‹ËSaá½±GYP^g¬EœØþò¶„Ôû}ŽÌáôÃZ–IJq¯m¬bȝ¶A§£« Ãe+,€oÀh®NiñÆ8vEä©9öSûøZ¸võHêÚá»PB wÈýƒ)7T¢vãt °†² Qk›ÔL‡9"cm)ûuŽ…– ¾dµ].&ã`Ž˜4ü`^·¨æcy¼Ú7¶ÞáºZa{ZûØ´ŽÖ9‰Rc9,¢éDÕÂî˜þÅHÑ%)îEãØHG yA;âžÖب›,UŸh•¾pÚU,ú×=ðÆä<|ë ÃN½k{ÉÙy£HÙ½Qé.‹Žƒ³Ì$Ƭnµ;+ë3 ÿÌ°ÙQºªHµ<Ç8ÄãmV7áëŒZcxcJ¢ø3‡‹†—V6¬]Œ±æÐÐûF©MÉNˆÈôŠS}¥iäC^‰œ°!ß«‡õGM×ÖZ˜×³™ È:*Ä0…¨øLkæ´æb¨„Í9wÈ-2Ìg{ßÿدšÝO0@ÉeÞÿ°¬*JÝm;»Y Xdf}±UŸZE‘Åb[1†ôú€ß˜ g6oŠC¸ð J"tB…)Ó¦³® <µµ‘lA”Ål„^óR>_žùšKº§VsáóÁÑ¿–£ûp 5à\±V¿ûµPdþ5îbl5¦˜°ª·–ДŽ—PºU–aƵ¨%¤ +Á®+¸[áþ¥í1©³]+L¤ÙªôRWV”RZc1σeï-QBštÍcŒ;œ\Ýr¹+OJ¨ô…|Hã=èì…ÞÒ ùžÈÉ°NÞqN7OÌbÈ1àŸÜ`ÖÈlÀÄÔ$™½}¥áI1'‘ 0ÊõJ~ K:Ÿ ‘õ@S¢›Æ—v›v ;eq‘ûÚÏ\»Ÿ@û Yã5£dù¬Î'4R…Ò…ÃwhuSêIôt‰tƒÐüë氉æÈ}Þ#D.ætûן˜¬nkÉÊJa¤ –.¢Õ‰ð/ЗO3³¸ìÙL¦Ú+ª3¾ Œ8¼V¦rßè˧ëԘ ‹¸òa/.xÅÃôªõj +¹Çƒ¸‘[¡Ðō‹9,ÿ£Ê +ˆ‘Ó™32ZaÑ €¾$ê7Ùîœ ! ý6íª"Bª°v&ÝSo¸Ò(j´ñ÷ #7D‚•DÖc²äÊ{Š…Ê$1ÎyQr}òQM øÝIeìx¶r#ßAږFßǺQE3q•I¤tU«á¦dÇÝЖµ—ǽ_gø ùSy}«3µg}+R* ¯±ô†­Ä˜OhóL¹;ësÖ±þWX6EpNß7<å\Pv†Šª…ÛK ķ̲ûYQ‹?m ß‹úÐ&«{®Gøˆ@+Z0@yoèøÒ^-®/ bÛϜoÌð«ŠEå$jÐL·ÿ\Žž–úËtW éñvðö’ë-9ðòٛ'sRînZ…À÷ÃnO6|¯¾ƒíà±;p›Ý89ü<óŠ1n4ÛºfÖ{üIGÚRµL‘}R•Ãu­X|•‘ÀÎÅΔ„ïG×ð?àQŸD‹pxôÂ`C,õêL¹ .ÆÅ£Žçºf§¿Ñ8+ß]lx­S^ûŠG¯Sc6,Š•7{Ÿ<º–ÇÇ°¸é½Ce@&=£Ø«/Á8à’óH#4Fs,_3†¨–uM‘•%Æ9ž# \ÌÒXÞBÿx­ ò*1(Ë¢h±y$”ªH/›ý,²övLº†__EºßÓ5çõoÏN”5AOeÝùIèïBP¿‚Ÿœ—Vñ¯É«{ëëùj³“H ú.1l[ÞcÄm¦Ê‚6À<*>4{Gˆ³­…r­/·Àìèb¬qêü6Kì¬ñ½Bîÿ„õmå£êv=˜#¼õh—…ìc±Ocƒ/[— ŸWÍÁ2n1§ä}I|¥¼2-ÄfËÀúœ +Ì­è,È®å@jΉ.䑾é~뚼ÄCÖÝüÝ\}HUT¿Ê1HçBá@¾™â´£Dˆ…ØûÌq͍rgȍ ù)•†Ï±ÿÈå,®Lü¬>6À²<뙓òïï^¹Œ<³jòXëõUˆ¥©ÈÎèhC(VwPÞ:±0b®°mŠUI±Âß½H‚MË{¿@ÌD8íEGvÚh4.†¾ºÔÛ(âcï(À kîU´hׇ/Q)°.‹L2£¬Ø±Ž€ Q<Á‚½l›öÆ¿.1ŒþuNÀ£Ü +”L2S õŒgD¨Bð1Kd‡èïŠMϖŽ`É}œqOƒyÁ`Æ&ì†\ò¬³âʋ3ƒºµ¥ðÌ=¡^2›ëò9—Ò}Ŧ¾g +÷7Ôæãil,Éò%Öä<Ù,“ÖLäƒïZâu§Å˜V’ˆûÞÎS2úFŽÝÊ©DThxá)(èܝ¡3óÈä–ê É¡ï`ÁDÄE7aMœ¼¯Ÿ€f)¯Qž™iVÞͯ—'Qxéi¾Ê/ã!uðê-:™€}آٜs› '®(V¤³(½i‰w<Í¿o|21³zÇö¥`r€KÓç÷懘õ]¦7@éR°¸~J«coªÞª&¦æš¬˜Ù˜9œ@Jý4ÎlÚ äbiIà:Ø>$~kTPÕá´è+}sN.$$B –álø `{yzñÍCç-¯?Hä±¼}|<¤yØ~Ãsu‰5Yóf­ äZà +Uƒªú&Ð{UoS7¢WV.g6ª*¦Í®ƒšjâû†áÛÌò‘Y¾aæ(r_"%šè9é„ÏŠ­-!>‹4b®› eèêL °Ú +xŠ„.ÞH“€We•y‰Ë_R ”X³=|V1t[Vðuµ:­(ÓȨF¨&àè‚ŸOäFÆ2Z”ÿíñ Ó=+7Âí£¼<|ü&0\Y´2^ASƒŠ»£ƒh‡HêÝCÑI¦LVªüH;cEñDûËÃf7´Ð—Où|ƒ­Ï(pH(‡£$œ HöLˆ™É§a¾8àWSPVóú‡œ[(Š +¿)$W߀9ܤDë} +lõêàö8Ø© ííG‰ú{—¨1½›óRRSóÏðÁ¥5QT’"ÓÄk5â=jOÀ)ů'°BI˜ñôxd!¦ÆšL]™ö  ºAEèÉÅ ]ùJM˜ØÏv¢x$¶—S À¬Égu`)Ó^"ë2+ė„û¸t ¿¾rÜtÅZ<Î?æ—2Ìì<á˜_¯ñן˜Ì.šjê>1ÜÕ·†ß‹Û$œžÒÛ¨~ÁçÃ3õ6¿ú¸¯Þ°2o?}¾W?öŽ÷ɜÛVź»Õ¸çF ½ †ÑêÞ¨<‰T™…öÝíÚÝ¥€òžbs.¦æ¸è ÔÞÔ{¤©ÆTfZ>ݪØ*÷Ó^²q7¬ß÷0‹AÕã>~ì(À +…£×Jk±H㤜“A5Kßfò\±c/Â/5' ö²mÚk~[hÿÊøෟ㷵HQ履O¢)¸Òïö‹ç8éåp¥rK¿œàžó`Yí,¿c%Êý—+bƒÇöØüv8ç¶a¥=àÛ Ì Í×2vi–=&n!¢¨#!zF?†æÁý)÷“"WÖQPLÁ‚N§Ãÿèö”‹€T½x`7«ø‹Aã%¢\œA$6G…gî1~g;ĶÉ:ÛƄê2©‘Ǧ¾g +÷÷âµP˜¦¡«6e×ä<zææùÎFaµð]K¼î´Óʖíê–ëzمoôί„ +-CÁ(<%³NùîÌ xª.DäÐw ?  ݄Q>yßÞ7 Y*[€JtäÆûR6§áÖ¤úOáû7‘©ʹº}~´÷6À³Ñù&µÿÁK¶W/Ù>^ò§^²=^²ýð%‹? ¡yðr6iò½1=Дj(Q³Ž­Á]Òð4Ç´%G3…\Xpd:Zî4Þ>®+òíò妽7Ë5{^ ,xTf.=öþ¾a8B:Ò«Ò¢Ï ¹€;2÷œ˜[DªððËV?µ\/Ϳʧ3z¢Ï +`vfód?,&Ô¬ Î5>î˜ê›Ô$%)\kk#ÉYIpÎêžxÕ m¿~â鞮¬ûÛæêϲ®ùþówÎÔú3u<3uüŸdêxdêøQ¦š7 %Ïiù_KËjžØ$çAݽ¥x’œ|Ò38ršè ŽÊɱöœÔu$}„!¬›Ìߢ·ŸzkìHL’ûÆi/:‰`£Ò¸fe‹ûl Ù)Ú +; +pCp^‰³ÒZ,Ò8É[2¨f9æ±î_ìWIŽÇÜëï-ä<œG0à…µñýfD5¼×2¾¡/²{Ó]ñ²2‹É!$P~Îk² ¶…i/©ÙºÍ‹¹ÒÁ©×yg f,Mn7hœ–¼À2GµæÈxÂâ9çQ™wo#ÞÅ'ôæyϸÀ>ëC)¸Q yf6Ší¹ÒEqk` N‹oyÅc…á-Ì¢¢¼¨ìrììý€)(ùݹ²ƒõ-[><üÃ<ÜÍã†_†$úIý§“D¿‘D×ÁÛrI÷®ƒe ‰‚ŠÆ¶慐mf„î²T(x ÍBZ gpÖ!ª"¯q³„ªR»°ÅKQÓ³;e­pþ¬,\ÔAº°¢ë ¢…Ò“Ã~« +·„Ú&œ­M5Æݪ„$"×V¸Ù%±»ÜÊ 9Háëwóx÷±©çNùîføáèö›BõáLsQ’ÅrkžÕ]`¹šP†èpÄôÚ¹«Võ©ùÆÉ?Q„&+6òVÐEv¦L³ª† a@¥£3¶v_z)*M€c‰¯j5;¾Ssçý¸¨ëNU¹¨Þ$kÆ U-y‹Mñ;rjŽ¥ ’«ù³YÛC¼v/ΰù]A¦uS„§$vf¬´(‰¼¼*x‰<æ±*7†²¾úø53¦é@ۃ¬³æ{ËOF¿"³µÏ+¡¯Ì|‘ªÀºK’µ¾0E’t¸Þ­­Û•&㯙ú]õ yh©w¾ÁNï¢Ú%£z‰UN§Kþ¬~o£ª?´¢ØýªšÈ©°ªj¶Ä¿ˆoj¥]‰¯`gÎQÛÈìõˆ[—*ŽÌP¶™¾Ñ3Ґ”7@L™r9ÑÇ qŠÌß\´NLfÍnñŒß™¾Ló:¶M°v{HšëL#V +Ï·‰i#«¢îZÇjOÎëð³\ïõÄë®êÏ´²gG¡Irۏ+s ¾%ThÚ|áW2ՅÎ™£xH]“àòqø˜8‚`+-݄l´xß1Ð,‰ ÀlV¿!æ²án!¬é +Ú»<¨üJ›¼{gî•Ü¡6íî¢ô^Ùí& x€Vì¥ßÑÌÓ¦ÅTÌ×À‡ an?ž3Üî.@傢|<Z$cº f½—éŽÂ¯[…9–HfˆI•] Í·Yd›\ÙòÈáBR.i«¨¥þ†oBv˜CÏ5Z$Hñf1.š9…@Þoª„· •}„«î7—Œ7/>G² §¥ÌÚFd°øʂ pÑqEu®6C4ZŸ¦àh>ÓT›V +³O-ÅA¦ŸåÍÊËûm•wC® ¢óV9W€52”k¿\†Ÿý5 ûAÉ +rÓå`^ž ™äkÊwKå„$Iºì$§ î5#<º½•æ¿#ïÁle놼ÏÕ}ës„ønelç’ЗžJbh$G™Æ\Õ=Ô…ƒá¶Ì»î¶¥‡›huú?ûÔ¦ñ‡9f7[˜æ¶ËÓBh›3¾Áe'¬ð•Ã/8¼›Ý—õYòuwÀƼ¾üPôz쾝í'Ǘmí´ŠûîV㞗<ÞV¢àUË㏎ôßëHݜ±² +úÌÒäÆc°å¦+Ü Y“¼T3mnŽ0œYyZïŽâÍ㮟ýxEÞ~.°åiõƙϼ뺷P>:Gp¥Ë%‹J›ôn@"S܁ÀÀ ie .òª&Œ=°åô¦ ÷wŒº²ÐÃÁ¯ó*;2j+¦GôF~[ƒ%¨˜# × +ñÑÇ|&r¥œ|ì.ñÎ;æKÿ˜ã›Ž¦Pg§qþ˜Õ9 +‡µ?Q€6ŽWb‹Fk±IÏIzAq´uÁÀ4¬óéÔ¿ãk² ¶…iÏþýPŒ6:õI`Hý¤ŒÑðñO¨ 4àTr ¤™”•È¦™y®gf +»¯VvG#ErŸU€·¶+ ­|Z]å×P§sz-"Š#ØW$þÍ¢I9éžyâ—O·ž„îz<þþì™æå_YÚýg•öœYßW¶Ö=Âåôxl>€¡}_>ù9ûÛ\ŸÎÇ檑_~(z=vßÎæÉLJ¹6•~ƒ¯úÀ&V“·ãƒ¾~}͊üÍÿ}6¯ôp) +åÄNR9ôerd/Gì.§H€Ad©Hk=C)¬Z‰P͵¡a/Á¥â`Åæc-‘=Yå'»¥™ÿ»-ûÜ2:…p;å{bÖÅ Ôóа…¨têDMV¹5OS¹´Ñ–åþuޕ€b¾lÝd8S¥æSdóq˜£7QЇÛÌé*×°~P4¿&¦`íŒcFIÛOÇp$ðå“ÇÈ× +µ¸ß9ëæý¸Lµ½ Å=÷V\'§Å8ƒUMöÞb3¨§Ss”8ÃMïæÏfm‘pw/Þò úà–Ömp#<'QgóJ‹’×Ë ˆ—@'ŽU¹1Ú«Ÿ+j5¤uÿ¨¨ZQªfi4Îïw½€ +€ãÝj3Zcù¼7TŸ<ŒkZ)_”„Г³ÞU&ᰖÕÊã¬> ÄÂ[J®‰‡ôŸ)¬pö׀*Š7¼±ð¦$( OžeŚ’D1“,),Zó$G)¡G··ò!XîÈ«–É¿nÈ+£î[eâ»W撜‘vIª‰Úw õõF®êžH×…ƒŸ"Ü?ïÔڇ"üQÃÞ^&OfýF^È%§ +Î^ýú£_?gFÇKûßÒ°ëß4ìümØ9Y£fÂYMUŒ~Ïiž+Â?#“ +Ò"É*åÎz„sJ•‘—f!žñŒ$ÄK@V ¼kÂiµá/‡2)l®À/‰©,5ÏøÉË$¯ƒEžÐcÖnùUÏø`±Rx¾õàD_U×ê’Y`3k1"p´\qÚæJO¼îªþL+{v=.·ýˆö7Çà[B…–¡m~%³[ÙéL}ñèq¸<ò“‰ +I•˜©è& þâ}Ç@³Äÿ€)¸¬¾ßnrî $K€ÝL7Ì ©‚—&Ì +Æ·_Š°êYìÈޑK´Ed@´r—ei\’Ì@–~ƅšäãýgl +¤9 žg|¼o>wÖ¼áL­v¾|ß±zóSp•Ê¡»JºBúXC½ˆ(ly õ_Š/[Íuˆ!S{Ø%n -‰FF¹¬JÏ5ê µ0¶®Y:¯»¼7-©’„Úò¦Þïç9â=†âFe›i\gSbè1‹Ø I\âØOàmN®k´›ôœDU2¨euã,¥]ë¤XçŽ5YÛ´—ä.¸*ùCL½¸¦š™F +ßÕ2µê-ÓÛ3Áu¶LƚȒQ¤pœÛº±D†1±¼53.GŸmäÓÓÝ.ÇY×ß%:°ƒèÀãþ¶ÍôÁ3ŒìP¸%¸}®GDž»Œ€FüÕç +ðô\gvxöû‘Û <ÛÿðSû¯ç2µØ­ýïKû—ø®ö_+Ò¨ÿr’z}(ꫨk·ÄJƒ­)õ:¯‰Q¨\hˆ¤Í š‹l­ÎÔ2ÍÑD)—éL2ÚŠ7 tAñ ½yGh¸µ\aËå&¼>Êî)Q5m¬t±ûblÆ桧fœÀþª£V¥ä×Ò˜BKœÂ+×e—®dÝü¸ꟿq©dR¬Yؾ^˜vîÞÒj«gâîë‹y…_f¹½°‘Ž—7j’ë/Åwø÷óãôø¾V}1v^ŒÇ}/ùÔ¬G÷ô I~JþÓ¥N¿IþžÔiÝn¾³Ÿ+ ÞÏË)uÐjÎ~>w´fsu®ƒhÀŸfÞ'xö@Âèm”³.òُ5ßÛ{ƒÎÏ¿Njþj*¼/#sÛõs^FÌ~1ÛuÄç„9®æ¸Ï—ãiœ,¯ø:NŽx&ÿb¿Jrd¹•ØÞ§è ”¡y8aà/úm|ÿ…ƒdHʬê?°Ñvoº“%eJ +E0ÈòŠof²¾â›¹,Oæ²<™Ër5—ãj.øÈ\΋¹Œÿß\6æQþ—vðöOuðk„-ãÓåVK-hàC¹8H8GŠ4>›r)87ãBxg\›9Ç¢\‹s:±&Ú&ãóáÜf½¶V}‚6w捚B#çfneŽÅ¹âܸ s®nÐOgZ¦µCºk½p_²³[\GFvÚe4»¨;éÊt•Î ®ŒÊK€¥Žøø˜"!™Ay³"h…L¨–o ozæíOÿ<›Þ¬NÁ0;‚RۑŒ³•7ò•çŒšçԄ«·Xɪµ!Úl² +Àd ô=0gØwŽ eRHÐUDöч‚R^™X5 Òiò@³™QÕÌÌޖ²Áß ,t§Ûí$-ÂQ›×Ó-ŠÏU`Â.ÛJîÝnÞ.²Ö]w„Ý•q…N*gT¸\ú§‘챞Îóðþá<ºTÎ7u]E'êµžÁŸµõhÜdQ9¶âõQᗁk³Üíãs†O¦ekB ¥¦¹Ó´—øÚõ„"nÀ®bnËÝ +ZÞc¨…±Þr má¡óD×ÖÑ+ü{ŽMë¥à¨c ðí @rTœÇ`õe‰ n2©È)r{¶ÛÐhSyOÅâ{GâÚ*}W·ÅRâˆ|° ¹µ¡ôÁ)‹E—ôJæâ)Ãõƒûmž‘íZ¾'’êƙ­FîuvêMԉ£—>5S)¯Ô ÒFƒ?SÜSΊÒÃýZI I¸Ž²0Y´íò¹·æÏÙöV)6BY« +*¶ + Èw!ßÉô,üÈ=C_Ø¥ãFê{ÿ¥ìmncÚÅåae·d¡¹»ê_~Æ`¯&\.¿Ûa.?t»E¼l–pXž6ûF)þôC;¦ëxµRÞoXH{—’¦¯·oßæ—ÏÊñí²+¾wß5Îy²¨õyà0¡‹ŽöGÚ»öÏ"¥íàШ”'í†5%Ôè^ϐþ¼5¢DW,U@±ü\gŒ¬~jYcÙäñð—¬&bޟ«v'ësÕú?‡m:@è*çê +ßñZš/0RÅn‰eêÈxV.À JÉã{œR¢€™ªf^±“uC×Y×jI¤ÿ×âµøÖºXaÛA­®; 2X\}{4­~Ë^º˜õøìb:×ÎÔ¾}Z6ܨ$¬ÎNÞGsBÕúV?@>ŠX”E~ÑsE;˒¦@¬ðé½Gʹº$*‹6ÐpuËÓ;´Œni“а͞dI#Wò_´=Û-(°ðUlHKÔ t³l³ ¤m(j) FŽfkâ5É8ËXe3#@ÎÜ +ô¤ãYü9z² Q¨µàæ®0q´„±{톏íÚzÛª`·O'F £´|TaDØ{z»Åø¹ÇôfAËý/S°óª`çQ°óKÁ~)Ø/ûS°&9j±ƒ]RC`o +V·tìу–bu `YD},± ‹ã‘ÖI¹ô?èÍ î™f“þ L(׺l(Ó?O3«W!²XPIyϛvCÑ;Œš™}Ê"ä‚߆ÂÔÔ'€Y hü¸ìÐW}aC™ DJQ‰ØiÖ(nƒ¥1'Ö ]ÔÔÔ9VU“³m6ªò’hUu¾[]Ò"UÌœg}»Gñå"»‰æ‘?)NJ”܊”›)ۊœøNä0œÂè}†¼ëؓ”A.bi‰)>Kh5°KoÊÑéG?¶Ñ•;QRúŽE<ïkú¬?Îâ°!¬ÏxOO¬æ !7.ó÷êŽÅ͇Ŷ‰\흠¦Ä~1±@:+’¬ÐŽVTñôna1ÅFíÓS½'5U¤×€Tlm³Ó ÚßDzeâXo x.âñ±hŒ'Âþž#‹9ë%Ojó'%)#ôh¹_$ŒMÌqvÀ"EE zIϞÔSuT>·]æý1G*«|Fµ‰õæÚÝK^O; lӟ1Ÿb7Ÿ©oó9y·Ë|ö¹|d6–kË-:XnÑáqh½¤x á2lì¼Ë°Ðï†mAìÍ?fØb0ã¼_ô0´¿ülsNhcB‹ <]*íÂ:lxKÞNe˜ð¼:PáUjv•üôÿ’^Vp‚ï nõ¡{¨ÆRâ3 gŠå…ä<,9ÖãY_–âÈۂ\W»ÀOk¥m‰žK8Æj 3þ +£<)Œò¥0¾Ka”›ÂØQ|fŠ›…³Æ©‚Ž¹åÎ°j$Q$X)^ä*¸·4Vç@?DU£|êñwٞsÈë뤊ÌUMۆÄ'Ý*Ú(™}¯áˑˤhÊ=ÇknZ$g»Vžjà oÞV+ºÔD”Õ·G\F +²ƒ)3[÷ªsYe·VË&üór¢$÷Íxƒ•µÁE¨²\0ËúdVÓpS“QîZ–O+ HµÍê î9tF<x N)³—š³,îu‹9™\!k~ mYnš˜5+È•ƒ4Vt«øŽÉ0§%•Ô²‘÷/´ (8@ÏÞPˆËÐ!JÚ㖰ÖNbYPÝ ±›¶\¬¬\'ÓP¸uµ¤Y¢Ê‡/c‰PÌ– a)mf°‹Ï㜱­Ù¾øóÓóg®v¨ši!¶q賰ʐ<£Sº…ÐXñ\Ä:èH‚­Þ`&¹™€³œ¬: jÀhOV§Ç̒:Oö­‘&!µÓ‚nñ"‰M0]Éí¢åYˆC‚®›®Š+/ÈáZ$œÇb.Fé±~©†ÏŸõ¥ZhòW‹ý-¶L»E»ÀïòfØéś-ýŽ«©è±PR˛5K¢åÍÔã¶k«è¨¤½™ëœ5=i§8Â-i.ÈÿÞºj“½À{Iõ*kػ̣ÈBæ _ümóu M5 öX«>C¼óC¶K| 4èÔ*¸2æ< –âÉ­ õ{w·¾µQb±MùȦ¬„îՋºÁÇòMÑþ~[ÐKVIaÙqŽÈôÁ©åþr¥‘Œ¶g«¨ÈHjHC³«ažwjŠ|qn,Rdý`èÈcóhÄÝØ^tƒÃ`Ñ#„›À×!¹ô,B×1£fåÃÄLù˜Aƒaø؄ؙ3sGA £¨`€xÊ~Ý%Üzz»Åø¥hj·Wò`f”6o£ZÈë&•;–q… K»aPΠ÷¦Ô@(Úèg¬§ó.Í5&ÅwL'¿*Ë êˆZ­þÊ~µ$ˑ±½NÑhÿŸó(fB ½ï¿pH’UýÆ +Ùòlì^u¡YUd‘H$àm“€1Àˆ2úãôþÉf-o±:ãj#ÉA÷É>E‘F[ÑõS7³„‡D:)£øÆ8gÄ/4õHQ +ÿ¤…Šža°É©ï~eÛç>¯– šÉt“»ôLJZ6¥†€¸O4ÂøÈz -—×½5¿¶.]*õ$”ÅXUP±Y8ܑ#_Ét¾äÎPµ–Ø-T²Ÿ/71úÇ-£²Û{ôãöO·‰ø|‹Ä£FâÑûƶð^͐ÔËúåçåä·¯Çï¯×ËÏô]‹KõŽõò?ozÚL°à³þ7:QúI'JÿÝN4Œ‡ø$t¢Ô¸{ò  P:öÁ ,Åê@…ÅàÄ1y`H`’î|ÿ´YWÚüX82¯Ðë2ÁèõÜÿY]±¡x‚ŒHM؞4d¹`‡Q÷E‹'{üiC%Õ䨀©œ8CèK‹± %Ö %"Š?kTVL̺ÚXS:à:°t˜mw.Y§œ?4\=a瀤Iªº\ð损Û.~ò“ÃÜXΙ:¶v·©“Ã\*èøÁº¦)–sdĺŸàµìp¬gS›¶»ääor@<ãÛOl\¬2&"` éÝNÓdêZÕ¥âX­´ÚüϋZ£^Ô@@føSÔX„)›’2jq*÷*F™€×²Æ²1)A¡u^¯3ÑkëuÕN.-p°4Âá*M{Ìöà.p((Öè·[-_s<aËÉ2s! +R/5ŽD8<ŠD×ñ@5E[ T>383¯5/%Wò;U+Ú±‰­…>C¼ëSY֒ƃÌC¿¨° ¥@,n+“èQ¸–á\Ñʲ‚‹}ºùQ®¬îÉ—oyöcA—ŒÈð(g‚eö$U€²í«l4ÑÖl§ …d +PTAK4­öú*ç8­¨öbYhjYD3Q¥®@¬Œ±bód¿`‰’@¹ÇÎw¿ŽNö°Ѭò68¹+LùEáß6|nAîmÛÒíßJß äX}Õ6bÛ{zÜöøUï괚²/Í­¿#Ô;B½#Ô;Býv„:êÒ +Ô·S]þ^[\^lqyÛâ_²Ååf‹÷.~:È +Îwúӌr5‘©À€‚ß ^£í ,Ô KË㕝•OLY=¸a¿¡±ëۀ›*éi•ÞSO>V=GûÛvâœëÿËK£¡ÛÚٜÌÛ‘ËC¶Lטç!$a5aŸhê#ÃaX—Ô²øLŒƒ†jgoÎdòŸ9~îÈ~ÍUÖèF#±L¿V]2<%® rš8‹´ÁÞNšhF5¸’ 5¬º´7d÷¤ô!éK(ÀƒßÛÚ\VÉ †åÛ7VÊèR%‡ø¸™MËa¦1‚;¾ëÝÃqâo[D·Ú2XðÛû£øí>Þ̗î§,dý古Û×Ó·wóÍgæø¸¬ŠÏÝWýí•zƦÕߋJc\¢Rê;*AÊNTês¥Kr¡­lã`e‡'O€Ñ¯ðÄ Â/Üw*^ Uâ‰;뀝ówãEŸöý×L'r¿ê|")Tbø ڎoґ”.Ž:ò`ê¾Ç­¼ uç.… ZSèÎ;rU¿Àچ«l N*ºÝNÚ+é1Gª*fÐà{d¼k„ql*Ý¦À¡¸9È +6³-@%¯Òìҕìú;<¬ðáÆr‡õ*7ýÅw„óEpžé0“‘gSŽOÄô†$fn÷'j:tþ©õ:0ẎšÍœh;ä{’Ð MKC{¸…±¥Ì±¨) jî1§¦пΤÓå’pÍÎ¥¸9ºQ(ÿ é͎3^¤ëòÄϾ¥É`Žù"]öGõÛ}¼‡z}zAIÌ古Û×Ó·wû›×Ì6vVÅçK×FáYß úÿªAŸóŸ›é´C†|ߜvR/¨øtúu;-ŒÂkdÓð1yP[H2ex$iJ3ÜÙée{¥ÏíY$‘++·4Ü:ӁbYŠ‹›O±bntÄY´ÃP_Á<¯0‘ËC+Ãö²&¸Óh!¹d‰®ƒ4Å®–î‘ +…Oy!m˜Ì‘€» ñ±Dú²±¡ðvžGMèJ˜õPüað!T¦ Šd“V €‚Š£@£dg2‹_ƒÍËþ°lfMîIâ ª¨J‚aøܡѽD抂Ú}és!~DTErTۈmïéqÛãג¡Áy£)ŠYì÷m¹¼îôZ¸”J§Êb¬*¨Ø,œŒ®NÈW²ƒ…/¹3ô“¼D¬Ä ä%5ììÍRä(y¡›Ò®¡Ý +h·h)8¦!•¯“Èô}·?û„É*†á »ÙR¦¿>Ü5ÐXP,ˆ<è-¼ˆyä‚`Ô}‘ô@8ì~Þ¥Õ)€Yp’8í°³’[£§w9!.¦…mœðþ¢51'¢ìs9-ƒ¬ªM0ºþ¸Q{{Ê[?/Í.i’*éâ¾y ½íâ瓴lTÒ|[ˆ·…xeÆ cr›F Pç¤Feà²JæÛúŒ‚:ñ»BJ’µh w¢€¸¤k¨”dLøV¸ÌdwM/I¶K™§ º{÷„ÖÑB[Ï%© ­¨‹’ šÅ‰é­†°˜ðÎå'۝,iBpþ~õ«/êWßê÷KêWoê·wñÇS³ä5ê_’¼Ð þ ƒ”ÜF'¤cZ½¨à´³7d#GidXϵZÏ­]cÐç²&øö%џaæl^¯ù=íZC¶=Ÿk E‚¤[ӟý¬Á(œæYC±Ý¬çVj×zIMõ¬¡ZÍfÎl]!L^•¯òº* +[ Ź¶HĀ}2K. i–éBià;G^臡žË¹±É~&{Ÿk æwÚ2Û-™Íl÷”þ“ZÍٖa}ËØç­ÁŽXÍåÖÌX—ù"cƒ §ETÇë+ ªcÙCW?âà]|ÈC‡Á +MêMتc¥¤rãÜÈõÛ‹F½rq~¥_‰í.‰z£€B' àJ»ž úôèéͲDù–ØŽ1çêø!å˜v­`=¶–öI] +bŽq痸×J¿roÁ¡cÂëða1nîYñÌáÈø.âà½dx¾}q¸a!5¾ÀHyß0°î<ŸØºÂ7sÜcÔ‡¡k‡š¡Çš¥[C´@‡í!¤+5mAîy ñxvX臏¡£Œõ”7FQ÷v¡SGâ=^ +HLÒMÀa=œCµSM? +µxøJoÔ|ZHñR­˜&;×¹ïŽXDʅn·G,S'¡õi4T#vÔa<²_hær=ÇðµÉ’ÖÉ'©Eƪ‚šÝÂ˒Z?[r6=yÍÐbîÐ>{ýðß^À÷aIJÉ4LȞH"¹3”‰Gš³ÒzB¹£Ðör˜ rY¶ÕàBÔv´4d5ˆjúÓ¥C|7r?¿ŸÔ~8š½qç¸ÖŠe‹Ø!qs“Ü{©¨2áQ.A•'ÙÌ꿋!ý‚Vø©Å¥HÆ5>ÅÍkû!.nýF}·vïGªÔ'{>úõ0ûgE¿¶ya§üZPU^¶€‚ðÜ8©Ócjkp¼²A¨Q<,D®re.ìt +Ö»»+ƒ²}gSmoT,;:Bá?ÂÌY”Ɖ¢±vm6›-3ÏE  ª|¯°uÚñ]ý a>ÉÝ Dé"²ð!̒º<"Y5‰é1°±‚rÂéHp­5@JSUur1,¤Ö3,š±Ò:-çÀÇaåþJ*:Ð¾+7Âí³|½øø£@‡ Š>ü;X»®ý.3²çj`Õ#9[EºBˆhœ£ÇÌ£¹°‡)6„³õ„|ǹn¥Çus| Ií $µÃP²ö³²?`Hj‡’ÔÍ^C6·?|¼cýÑg+Œ5ߺŠÚáð”Foðêù¡,–ž¯÷gÚg=¿Ÿô¼¤ÓßÒóÓvzK×ùFž£µ3¤J³šêW4tö[î©e:[ýҜ¨>'QcñV¥iJ›’ô³ŠO¶ò;äË‘tE˜³g¾$‚ÔÀÛv¼“ˆ#Þ•dö´€=,‡K–Á„c4…€´÷r¤^©©JkUÝp‡++8ê!Šu$‡]ÌîêsÐþrý“ã4#©1Â~Š¯D¶ÒÓþ l·Æe„âoc¿()k¥«ž-O^ßz†…šnÃã*²møK9Ô”æÕÞ,w½Äj5«KƒÕúœ­s{ɕó³É>ÞÇ @ºUgá^%Àۛ®˜¿Å㷏 ±ØÌ݊è?µ¦b­Gzr‹ê.±’“¤û³–è>¥.•RbÌ5܀:‡œ]ZÝ6Αb4Ïß-îkÈWh…Â;cÿ3]©"Ìvdµý¢u‘‡ø¬q!â!Tx~5¿@I¬ +YÓê’Y˜…̬Å6Q3c­Ì*îôÄç®êkZÙ³#¨/ìä¶}­©Ž5KThYî°·dçÌÍ4э™[åp—vBõNGbHE/aGZ|ïh–¤S»X¬å§…Ü*zŽ5US7õúTÈbuf¢žð͚4$¨2mnŽ&dD™óÛ+Š/Ï[ŸP\¡/_‘—íìc}1`#:ÙE\Q¯ãì8§.¶Jïô‹_‘8˜!á‡Ô·¿K}XrY'Ög*1Ræþ Ë¿f‘ìÛÒµ½ޑî‹2ÛÑ~Ҕ~¢»Ê¤©å0ŽXÔRhî°F¿·:¨hkH#¢aÌuTÓ;ThŒ0´AP7LY¢ ¦³‡ÊP›í-“Õ†×aܗîò½±öŠ·L³Åw¨Öïyꝧz·jµKþ79«ÿûœeTUHļ‡u´—ÂC|iañ+‘ÁZ³¶êȆÎÂ}hcŸfQ·?H>q(£¬ƒÔ-¬ëÌqLk¼:×áÈÜÉ*ƒÔÚ§ƒ¥ÁpMn²kvàö–{À"¶ÈÔ7•?…‹ú&SVì˜ÙXñ ”b[¤?>kKȖ*ñÝpˆÂe?óò8¢ý…—©q¡ºâÍ8‰î–;pÁܱgLào^œ©–”ÜX îç¯øeŽSüèŒ(“T8–Ê;5­xû‰‘ +Iêâ:²ÑZ%Ö1Ā¸§çÂ:÷©ßã{² ~¦}øwAôo¶_3–µ_=–­_:”Mz"Ÿ„j7¡Ú¿žPí%¡ÚÏüÛÑ>¡•§1+†©+å  \ÊÕ-nÍWÊ]8Åé`âÌö‡²G{Қù¨21…“œš¾Ú>¤nµÕ•  ΜÓe?¢8ҀߕššESJˆã•ëPœx”šµBªŒt—ïJmÜ׿Oæ}3*[Ã&Ͼþ˜k>)a¨É9˜{ûO‘l­ZKÒ2‹°#݀$”­Ü¥@‰³sÎßù[*²'Æ÷ï¸[¯t<ðÎw|¾77¸Ö}ÁR +÷ûs¿c‰—ƒS(L¨»Jº ’h}Ï¥ƒFnԁP¤¶y|˜ü-6ÿ!±¹-÷1\šä²Ô°vYïH÷EfK)—U9±Š*j†&«A£-r§ôtßÜ+  ÒÄ +íµ°¡·RöÅXj?kåÚ·»^hì”@mÔ SVšèî|öTÐ_gÓî—vã¾t—ï¹¹—ÍW ¹Ù˜Óz£]±|› o§#JîXêpïÉGa&D–ƒÙ•¶døGàCЌýöãKsðŸ` +AM…™”s&Dd+Ÿ+˜õ]f†Dž}…;–ˆsh¤&UtIwŒVTI¨iÔ@ê +FVÎCÒ=4š¨"Á8$ß³/³j™yma+#Än.âΜ©éîºß¼š^¼ø^9¡Ÿåñÿ£Usšw{跑 ßL¬ZfZlz'9̔ʳƒ-@©‰`V®|y’(eš mëÙC1ìø•م%|·YsÞª]AxK’?ôpŠ%÷DŸ¬£€%’£½–$ì.hdQ•S Ô¾Ï×急ݡúÞÚ3}!ۑºvË<åm·8"!l–Üʼ²Y‘_I}B|eº»þ徑‡N]? YõàÊÎÖ3mÝS/´qú/Ž)¬¯ìêC]”„f(àÅCšK᪺2©Ì@Úü4pw]V³Þ«„èKK= È3‚KµdsÕf¿‘ìT~97æcƒ uq,«9†=–£?JÙµTzFjV?Ë;Ö}̪\âAWÁîÏY å—Äw½‹:sp–“ûÔM¥<¼T“j þ¢]<£Ò­gyéáÚ!‹¥„$[W ŒGö Í\®ç¾¶îÑ:ÅFj‘±ª f·ð²„|rKΦç`ã!¯úI/ܛ¿}³‰/çiw@X¢Õ7YL%-EeR€žQDP3ìó~A¶nw™¦¯ñ’+v$×JZgÝü(!LdÒdææ F”“HQš¼HÃ@Ž»¸†2`bB˜BÊn0 +“/a§±óSûÉ–‹å¤=ÚYª¸ñ%á4֎'3m­.iŽDª•Z—{Æ ¤%§Q:myaÕ4' ©[üV Íâ re¦µ(Þ¡|é»fæÖ"íØ6$1—È~xK +%;³‹i’­‹Å7låܝòÍÊWTHCB½‘W¶‹‚¢dxVþaPßZŽ$Ú4®„€c¶û³]MŠ†àdøKHξ&hZK¢¹'W|d}±‰¦Û ƒçNoQÆ-ìòìHJ?vó5r;ûÐY%gÔfÒÌ/PÖÒ:}÷ÀÇáæ8 +á´R'I «º|Wn|ˆ«^|ü‘5¡ûþÕ¼ fÞ9ØÜ:íì‡ÌÿË~µäH²ÛÀýœ¢/ÐIÔ÷<6¼èÙøþ 3"(eVu=ðƒ1Fmº¥Ì”DÉi#!×Tì†ó37¬% +žZ ¼‚›üø¦ eš§BY¨n%-µY¦ŸÚºmLãț«‰å­Ð¥´ÇÓ¼I亡‡bM µvݱQI{ː†‹û\Uoáðuî&俴ӂÒÒn>_ú2ƒhè;Ë öÔw ¯.³YtaEqª xE¾øvSíTD¡*fæ,Šp÷£u¾:-F]ñJ—ǵlóÕ.¸N×ðSó¨ø’oêå…^^èå…^^è¿ì…*J²w këôàU3±ã¨™Æò0V”ِôí©îôÁ>ˆcuis2%ìMÌ,¶W(ŽÁ§Ð ÞSðʇ.Âoj”AÞ7À{Åò†¾£!½”h€B5£þÝÃ5ü\y½‹”þò‰™Ol¤lÃs¡ݝò9YÚ­©z ÈÔÑ&oÀdr4…»Ë»Ž +Ô"6¯ŽX„ŠÃó2ƒ:L«™ç=¡¼ì÷+?ÀFâr˸CSå1:¹°4êÌQšº=7Ð ¯ŸhWm4ûµ¼íuÜóvÃ) +—‚ÜRâDvæ|òVrNȏ’ß  @Úîlò×ÐǞ ?¼ÖmÙúÝ62ÓØ7í +0±l [õ+­ÓÈ.­;©Mú´ üÀ:lE¶À »gªtë4VŽUvӈxYÌä  ëFî,~©2ý³ +&C4 +¡ÓP÷ì±'•ŒˆTÏ´™*+ ¬Ö»’Ù3N¼ðžøe˜…˜Kti¾/v‚þ+|.¢Ø =O¦=¢ð‚lßó…ß²õà·±®‘Bcò©™¦nqm—H5Eu³:'øz¡àç+?«Üa¸ÊÍoõ¿e7¿5n~ËüÖzð[íæ·ìæ·ìíî·v¯€6š7¿5ßš7¿5ïv«_ ¨®^vkÝíÖx´[O~Ëî~k×ï,õ{®­*ÿ½ßpBÅ^ ò¯j£A±ªTՎ,¾ìn°´[jÞÑ»*Í ÊèV¥Ÿ 9ßÕ Œ>Ñ¡d´æTz4žÊ_W‰âFT«=DU¼œ—Ð…Q¡Çx)Ïzæ&oX_Rj¢îý>„ª¡êÿœPõPõËðÈàöRûŸdAml¸V}ݕò#óPÒ?` iZ!öFÑ©n/k *d•[™¡ºbcJ bårf=oRÓ¦+)¹À4Aça—ãÄ~`j[Óà‘)fÙ’;Z~ʧ_ ÐèB¸Å\a׆ˆÅØ(‚ýâ; ðdÜÞ%pÐh˜º§ÂC,jD&}ªeÚdq¦\Ö‘N«©…‘`h‰4´á%Ž¹±Œ;Jÿ"€x0uÏÕOuñsÆÔñ½ß©9?^ sŒ·$×^N êÒ¨§ùT«µ\8Mk¬­%·dߢjͨÉ/§ƒ2þÐ?PYÓRóØÿØøTuæŠÏÓƬ•Y*(š`ýþv(ÅËã +f=—%0é1-"Ýg(xq˜iÐ$» qšI&eyP¦§ÚHgVÍø]²„§ ]É[Â!d<-FĤ|«•¾S)çTt´g#n™Êô1ŠÏo²³þÅæ$5N2² Wòx9I69"/' +g¡„]b®j‚× ±sæ<Ùö³ú]Óüžöç¼x¯²]F€mLnûke}‚Û˜”1ubǘÖïvŒ(ö¸t%Æ"úʗz¨Ç¼|iÀ½š³(×Op/P‹ŸKÇ +™¥ó¬®LÌ$­~²Y«ÿ§lî.à‹Š[~{xøŸÃdCó¨Î'çû醗k%œ~o;ýñ­Wõž=íñkv½|ÁJæß~(z|¿}ÿ4?|­Ë©½§Ò >û÷Ñ{C ^ìñEz#º™™44¬”zG2QɲŽ­¬!¸\l +xÆuD•}‘ïô’5Ÿ×™ð5¯–o"&ú¶*îą̂蓙Î,±0kŒßÙMÙu­Støö}²6þŽ1Dá*ü¾9qÐy§AT“ym ΤƒGô/Ë'gZâq§Å˜»D$Jl\þ~]1ö]öpD…;Ë ûÇ*NßƯ3!µb¦…0…å„Cÿ‚EÞ0óRÑIÈïÉóö¾·¥æ +˜¶¶²ò¥¹Þ.3úÍ4]ÂKäýu"otœ»RÊ$OĈÝYc?Ó¦”e‰Aó&Ÿ9§&ŸNˆ–9BBðBm´ˆñ X‡&&-LŽo²aƒ4jiÀ4¢ù¢º»r?舫(õZÝÐÖ¹©a g[kÜ@š$CPBKŒÃ·Æƕ LÂ@½+¹)`¦péÒ<ë-6œ ©’~lèÍ!‘§!l6~Ö¨Ó?“Jy]ìÿÝÅzÉ©hO^Êk_æ£yT‡žyD8nw½5œÍؼã -mŽkn”kíÌwZ¤óö¥¥n?=¾ß~ø6¿|­Ì¹½«Òàg¶@0薗«ü½]åªNý!±=¹ãë" õ€z»Ñ V¥ÄPhŽ¹ bÍ +D铙qŽ’ÂÃÇi•Ô]¡(ãˆoꊺR3. öñßì•^ßþ±aÄ¡Ð/¸f^ y±€_eî9•Kc!; +ë„ß ¤yíte œ¿U¬; +AG]4Pˆ&[¢‰0Jö2ùK\!ckêKiDt«å3«sâR/´ütÃý{M58Cþ_Œ·ó›²%‚JFkÌ¢ZìÌLº-½Á±ÊinWÖô}Ø_ + c”ÏÜyã ùïÄ³9On¸ qgf杤çhmBÛÍÈÙÐ Å֞l=àdž‰Í‹W?;Ýæ"¹¶õ‘cÒxµÁ<‹è²–פ òâ=Eà,+øqíçҙnÖkn¡¹S?pp¯B²gÕ77ÎX.BÈ[.Òé!‘첨ñü°X8d[™ØSNãV!?Ñ`(â–)Óu©:aêJ §†]z6Úò£õuã!Í nӘ"y=lÝVæù[ëÓOîil±¾©(Á~á/˜‡ƒö"•Åç¼Æ*Hø$ =p¼ }łCb3['B¡¯Ï¾ÞWô4Xª÷w—ÿø¦ßöªæM䶅ŠF=êL3DU‹òAh}ö‹9¯9™Wxª/Ó*gìµP£¤µî…€ÁHªeZ ¤ ”ÆÚp¨T—†’"¹o·[Œ–wͬ†¼À½=,T”¿-v‰á³±ŠZyÇ`Lzêà½"uè;Ü`WÕêìz¶V¸Ù£ÂP¾Ïð7sGïë/5󻫙\|™¾ªÄñ¼;ÉwU¯ÝžA³2-™Æ<Ÿ›y4,•û ¡ã© «?ËIÄ5}…ýúã<ÿŒÛ÷U³{>ãó¼%×Ï8SÇ\ϟõóîƨŒ«@€bÓ"e†@Î2ævái‘Ò Í £ŸcÎCÇðÊ¢ß<‹\] ô­W«x¡\x˜_$ÿÝInN²^ú¯‘¼×q'ù†SúKw –•s>$w©½f YÌ0€œ XÀM=éõg˜y:«3gíº¥„L/$å3§î†‚߯Hh“*ºÇ¡¢Ð»¿èu=æ¨åë”о™ôÖ±hÕ•¼ „Ÿ]Zò¾p›"ŽŠÛô;õØ;'&ž›Æ8cœ +NÈÏ2g¤‹ÆòªáÀspcÔm1V¯¹mˆËS—Ïpxe£-^˜euü¡+YÕÄpø«:ÉKk)݋q³HÌ$ÿð%ØsM\¬Ìo—ò/ö«%¹’îûºÀSüó<Þ¹7¾ÿb™ «JjOx"&ÆÑm$æ#‹A ‘øã7Îv³?§ÎÇ/ÃÝÁòF*åÜUäé¦ÞIñuzŠI"Œž¢Ô¦¬#o%¶ú ôûAÉ:QJw$½‚îÆ÷¨3DŽÆ/-f Î9n­\8&bHñ%zÙpµòÇQû$ä2FNESO·zC+GD%-ÒÀK¯(Ù~¤¦€Ô{©:T%¼û÷@7—ãÑ{Œ½áªt’êŽXePõSxXB¼ …%g2b°r“g„~K­€Ó+K~jeÜé%óÖÔmÐö g\Š×s1ï¨rèd6‚Âý-Ÿh¯T?ûDû­|¢¹7Ø:b£‹üh£Ç˜T,yʙ¦®evÄ'i΁é函+p$p"j +e9¥«…m;0©=Ê·j÷pGÅAÙž”ÞÙÜ*.’®+ëë©|þrí*|â¾ U¾Ã *}£¾© àLX®Òם£úUÜ>@_ë±t ómê[º)kîÒ'pô¨`”>½`Ü®8S÷«öíóÒ5üTûzñ»¸_Mٯޔõ†çÂK"Næ# l‰ÙŠ`‡Wù ’óxÃe"Îs‘ô€l‡Øcø éÔ¨ØvC•ü3fV%Î Äñš÷8sñ;VyIïâ Ü7!¿cŒSß3*üJ!ψh× ê€ôÙdr¡û΅aµ°®%^w–ÓÊf6÷Z]o›–G¤•P¦e ³ÌST»|wƉN<Ü«jÝ4ôØ'Pé&äÚÉûö¾Í©F}óBƒÃ-H_©ü맲7pn‰?d±¯‡ü¥rºÀq}‰‡L}Ý(9t i“Ö@#]Èxh̀)±§¬ «ð šwXbÛ7D´ w!꛱Î:¾¾h*¹5Ų}¬‹q,Jïj0R•fqR…aݢܸv(L,IK†^$gÕ§FG§×'©½Èù@ÊÚ^öRœòÛÃų³µ÷:'²IŒô½^2Úp¯ãj.85+‚,qˆ±£1’(³Á'™·†.Ù¤ +j«{Îu¹ÍøÈûL+g»æy´·kîwn3èñ±ŽÐ{C¾®–×'(…u ›âWÝß|L}WÁ)L>7K„Y(.ì5ƒÜ‹W¦Âܧy| ?À}x@~('ãêœ.¿6ó±7ã駽Óé÷qé~$WÍÓ<¸HÑe| ‡Q°‡ê’\z–EՅµ–sªBƜBU£¾ž#j“º°ßÄÊÁj6Æ¿"6Y +ï\6"4½*p" ^¢ò#aˆ§H—¶ºaYw˜ÙLYŽYÐ4€µ HuR}¨ÆIÞÕ¤ÁLG½D°ä° ³²veõ²Eî`u +§©Íø}ÃêÜC²ŠÊ»ñ§‡.€Ö ë×¾"ª9ŸªB˜<‹Þ¼Cè†D¯án… P\´D[0Ç57ò5žâ´­ +ìKËY6Wd\>Ÿ ÖðÖÇ$[•Îm­ò³`8єÑÿº±}ЍíK7þ%ÝغñxñÓCTŒÎØ-xý[eÊ^y¤õ(µ¨ì9Ivñy—iˆâ“ËP&%–Ë=†°Högõ¬ÞE¾©’@…(~—¨¯"^¡2ÏÜcüÎp¥†(Ê¿(Î\¤!þŽ1Ä{eî_Ü/г@ÔÔ2eÖ2›¬ÅPKaTq¦%^w–ÓÊf ½0cuÅح쑳D™–Yƒý8ł2ÃD'¶È- 8}‡…ŽÄ²n‚4yßÞ7 Y"FYJ±äŸ'òðGso”<Àˏ÷¯L%"iï8hB—·c–ÃÇÐ*×ПKãï!röŒr3§yÆuìçdË3}‚ES¡ñ@Æ ±}njáoBnp¶0ø%E뇔Sò¿¢òéß»1&øâµL‘)ÁX(¯ª¸sˆŒMÎZÊI„¬f2ŸP¢7€‘v¢ö "ùõx]̐ÇQ˜ä’™¯ÙÃ_Pd§J[î±÷ ƒ23Ú£z‘üÝpg¸=æô^…Sd™YPÜûHžÚ)tš¯²[i»£è(¶ç…/ë¡Ä £–Á–ÉU¬iˆ4ú¶HÀ¤Þ­ÅάîùROúp‚~v¿n¦þ¶·‡dûã7LbOvŸî¶Ûß#NßÑaõàÛð;–÷Xó:·¯7¬¤ùÛYË÷׏½cç}2ç¶UñÝÝjÜóÇ5e|Ñz|óÿFëË ’w-¾o+ãÉc°é¦+< [“"U6×@Íaãäøí•ç®7´ÐÊ' +5vƒ­Ï+ð^ÇF1û²ÒÏLHåɨKæL® +îÀÃÀŒFфÐ÷¿SÝõcR?±usn¦Mî?uð`5€W÷àxêßÉ|醌˜j4*\kÏyÄÎq©Z€¤ES†¢±‹O^|×½_ ‰Lë§ýÑ© eTCSáȐ~oª +±£7DõÏA•Öâ#£“AÕèvÊgpűŽ@T=֞“û³mÚ'÷.'ÜHØiA·^ü…ÈO +˜¢®fEáQ«´áPlàEŒåÄbš.b +'z,fVCšã!2E³’«VôKá4›²¯Â™cD*j‘¾¾Ëj…Ý¢A;)ÑnÜñû·GIBq=Ï +Å[P¿Ìü§¦vû»RےWïù' +“ÔGG"ÜA•FqÛ"ÀRó˜Z7•€_÷Íòm‡ « ßÉñÅÞáy‚ö¿,°·»}úöyƒ§\°´<ö#¨~ >kŸµ¿ÏڃÏÚOøÌeÒ¥ÿ5BëuÜ mégȤ#F Ú2;„æúdÍ@Rð¡¯H‘Aunš‘øú%¹ôœ¡¼«=ï +Ù8®~ +éuæù”iñ]Š.î/ó]–N‚’+Ù32ËdG義û³4 +GµZ†Îö[@8„¶Ìðo0±fé&=¨+Õø0íp`æà ÕãbëIՋ[ £¼sb–Ægt—Úi–¾‹'Š¹Lmî»7ŒA^êæhAËñIǽrèæ4ùÌ`Y—Á™—XŒêëT%ª§íUcìÖ¶ýB$àÕrT {ÀhäÒ|4r„Wgì^hQGšñ(Í{V^Ü îÝş2*g(aûʨÿ8£ +"ÀC)5 ¶ßž]OXÐðÍ:v±Ìï‹/‡4ã˜Ï‡N3™‰ª0 €*mZש³ReQ0w¾²©1ó¦‚ç_ìWKŽ%7¼J] ’¨ïy ³po|ÿÅ0"(eæ{6036ài£6UO™úPdD£'•ñ#™^ sßPeñ)Šw^4 …÷À™)S–èÒdTü°ƒV­¤¼Ñ‡+îÌÇÂPԆ­Gmb]50cÊàÈÍ$U…µµ‘”FêÈQùz¡à×+®é±þ¡&ñÿ ÿË֝ÜÒüêPÞù¥f\Hý’ì/É~I s½éíK²ÿkÉ®Ó 5Ë[öPÝ"§–Æü@ˆOÏ$…‚´HÚ‰re="8ÅCäeǶpŸûIˆ—€¼>yք٬â/‡2',Ž .‰©,;°Ÿñ;“—In5ŽõÛ\õCqÕ3L}Îï"¼èÓPuÕ¦¶Åorž¼CLüì˜m-¼×;-ž¹Ë–mËu}lù½ó-¡ÂA6 +WÉT+Ÿ £ÆáðÈO>ªOAR%ÖY*: /ò¼½oÀm‰þÓ¦2û¹i™áÕïGuã0nœ +^ãc{«$ϲ Ï"ÇÐÞ‰Èô#HVÈ«¼ãBCòë~ý6?YÀNyÅçuvnï8Ó¦]ïŸÕK•N›¥JEÍ·8{ـ‡GEž±4qûU2CÚ°Ž¤+»6¾U°'lÔê~ˆ‡’%QQÏ(”i¤ÈJ‡ íky"ϱ¿Qšò# ÿôɧD?æ Äst]-Áþè¸bsÅIrÄxÌ¢ôBú–/Ž8a¥À‰C*w[S<'‘”6T³dX^ììŽ@fu¬=¦ìÏöÖÞÓzÉǗ‹zϽŽ­õÿÐ`þ‘Xj4Ä2„€ÓºÄ’wMäÉ(÷QØÉ-DöÂ9XÑÀ˜¹Þn…­~ÉW¤›hOלÂËÖÞ[{îóûge½Á­½¥½ÕÉض¾ÖoyJ¯o«ô ò-: +0ô˜—ô¼”¾çú/áï²|~»V8=Ç%üë&ü9ÿiá4wù‡óÒd’/3ýW›é<ܲú˜Aî@ñ VùøígçÊwۆH¹_ôÉmÜS§ÐÕp§²=è1tvã±2}N 4Pìe×ôú‚ö›ÇÝÐ^Bo>$Ùʶ>Ê"|`¬¡™›õ3ÒÄÿ“—õ8Eù‰%3‡ml—ú.Ò\SÒ®¾.¾´Óv—)«Ý“ÜÓ³øďJöøצT+膇úöÃðÓàcWÀéiæDð'LÞâõï¾·Û×V–ÛE¯ï¯sÇÌ{e»vÅþé‘FÍÏY½ÎF?„ª—ª»ªTǵξäÿ]çu ¡óå²@+ç›Îµ%;_Í` sÀK Ùö¾ÀK ·6gJ§Ê÷ÒÆ#ԉìOj£$lþqó3ç½16$Ÿ÷Ž³ß:Îzë8íÞqÒfGË© ß=§ÐÕt¶õÒeæw|o3ÛzǏ>ÓÞñ£Ï|íCëKßi/}§½ôvï;ǽïÜà÷úÎyë;Ëö}ÂHØ?T¹ÛߥÜW€ÝUçBÅ3O-˜ã‹sqŽt(³#:œK#z(†tåú›knÎ °I7`0ka_À¾u»H×5»õ‹V_ ¿»ì‚NN©“t lÍMº"Ý3¤« ŒÓùñ{¿Xw¯—®Ç×Üó[ ¹¹œ—ýšž¬«f¬^oc JnXêOŒ)rÿØ 9Ëá-¯zM¿àï~æݯ˜ž¢·Zp0˜BP&<“rŽ!G¶ò¸‚Yïef(Œ5œ´Z¸>ś]0©ºêLçʱ!#Ÿ²û’ è2²r¾Teš¨H0NWkÄ13«–™×§Õ¬B0ó(Šœ7’ŒiŽFÜ¢šQ|­‰«€ïÈÃ/=.²9¶SO„ÝÕy‡Ø»~%€3÷ƒËŸàt ‘36Êõ6`7§Æ•c;Z¿WôsxÐሿðƒٕÁa™Ì0R*÷øúõ¤*fÀ®²õÝò +º±Âž7¾ + má¡[,¸Ðé°¡Ç@ +‡^Nû£hƒåâõÿýB‰Ì¨8ÏÉÚ³U6â&‹J˜NÀÚ:o;­Mv÷ÒX®±w$®¯2Nm{,E ÈVOm¥NY½ÂH®ä=!ž2]£qê¿À3rÒ¡åG!¥l”µ–¹×5ðÂ=Žø2`¢@«J=T‹b#Ï©ü:^ aÌۋu‚ÚD°,f0?Rcõè׃R#•îHŠA—áå3Cfôü©—Yt‚S,89 ¤üÄhHhǨ'|’Rَ¨Ô¤Ò†º_¯(¸W9+JŸa²HJHžu֍qÈvAß.ŸGïñl¾·F§‘êÎXUPõU¸XB¾ ÅNÎ`ä`å$Ï }c—îê꿱÷_ÉÞkÑ°[ñ²ÛžÐ;¿êß~Æ –@Xýb¾ß~‹øxÂéyêr¾¡çDJ¬”ý p9__¨’õ.\âÝýícjL|[˜c{S¥= æýå–D9A2œ(qà´àŠ.㏴ãoҘ:.ãÁ©QùN¶læD÷z†ïç­¶øÄSËécäõÓê3wd3>òšÈv¦k~'{ºæ:Æé°ÍÎ$…€ºÂ_ñYYo0ÓË•}½eìÆ,¡9”Ç3ö¸äCžúÄAÖMCg!Ü«‘þ ܋ÔâÇéb…Ó +juÅ8`RwÅÕOƒ¦ÕÙËf?¾¶0n ½´g¥õ+å'—Ø4I;‰ê„BjL¿.kÈzQ~Tu‹‘,ښɛ±ÄWˆŒs OT7o@quÍ+$Z]nk“  Øæ(êYà 0£˜ý'΋¶J€j ‰±BÓÀ^–: N:ýD+`¥Éб×ZøLþ §¬Ò‡  grá&0{_5žsd»=Œ´Ww‡…£5Í#¶~ž¦môc Ž~3]V+FF„}”GŒ_E&g/ ó$þò°_öËÃ~yØ¿ÖÃæ‚ÈÙ¥töáa¥¹u`´’[Ë#c…:,’GZåÒ¿à8“ô³¬.š˜Páv©(+¦§‡Y-ªY,¨$ȼçûÉÄô³ÞËÌ>eò ÁïSaê +`V¤—Æ®/lÈÈpI¤”•‰R³Gq,µ°f¢¦.äXU*‘V?lþTåѪêüh]Ñ"M̕‚WûxFñý"}˜nÈ„“F½ûHx$82¯gx…ÄJeÁåÂe=Â*›¾“Ž€ƒd÷3‗ó5Ó-%Ì“ªg2˞#£¢˜!܅kîgüN©¦¤[§¥ñ/Ì3¹~șé âB„ĬÎì ²> £ÚÔ¶PÞtç3ӊ#-ñ¸Ó♻l9¬Fr]ñ¬ÂÄ[B…;Ÿ®"rðٙ'ZV ¾$‰›} [JW‘ŠNBž%§ÐU- Ç +é@HꔥÉÓIÉ´»M âë’3à´? +KîÙ<*7Yü§¯°ÚcF¹6šr1ìbˆêXáÝ°֬Þ!÷KÙ¸;¤^ª§ìÏöÖޒӺ§vS€mØ£¿)lvr>‘×H»Ԟä5ät 9ÌÔnî.ï(¶ÅHÿ‹ìžï3‰Ùdh5ϙi/(¦æʨ’Åå–q‡¦Zù7ûՒcɍ¯ò.P†¨¿Îc0àîï¿0#‚Rf¾*c0‹^ ¦6݊R>}(2"(˜ahÂÅô"j¬腏~‹]±®Af¯}=4ºùæíÄç‰@0uÞa¦™jU'q° ²|~4 +ž©õ±I^ƹ-„_߸{ æ÷OÊï=[а©ù*ЧYµÉXÇûr,g”FÌdò¯ÈFÓ kP¨ä!ÝbÞ>./'t<ïž=î£ò%£D-÷Xûç†!ê*ÂBúÂÒeàÊ#Ï='ƉÊêdÆÝC å«"µæ_Ù-îèCfŒ{>Ptµe=ºZÂxrœeò+>½më[¢)Ý*þâ¬î‰D»ÐðÛ7OÊ·Vý*­jË —;A8µ2žì£Á"‘|@÷u) +Ìèþj ç Ïq)Ùí/k¼¡½ÅVÇ;Šè[ŸaÐQí¨=ÆÌFõ.œi¢¸Ù!¢]­… VT<,.ŽÑ$¶Ì¢°Âž}QÈíÀ´)ùK~ï°ª9³ëLeØ[ +‹œJÃ!Ù»úšê"Ø^¡Ï¢¶rٚíF¢ô—ò/¿¥»UŸ‰ßŠÀF‘Öªrg²³Bå)& +¡¨u§t&õ²Ù›ÈkÇ=oÌ}†E[K:EÛV?áêÇúÜOùD9Zµ°µê¥éwÂRÀuø¢ƒ bö ðøþ~BYYæ-¸¬Ÿ¸v¨ÿädÄk–ì™Ï¬A[ÑG(>½ò€¹©‹¯œ{šo¯\ȋu0›í[pãÅWæœÚ ¶Í™ùSáä%²_éçƇҘ§+–§P¬´— ( Çþýuä•ÅP š¾3é­iYò“¼|œ*0_«ÉÔt)¨ðÁÐʇªÅ1Õ'Œ~²èHF¤×P•…A1ñkÐ_GÂ[…h4ä²V5Õ._çŽ9ªöD<íÄr”v¬¿’æSÃåü;Ì¿6Ìޅ¶Â(—Qìéž Z——¹#g²6îVfb}—i™§H•3d›13û(8›Ž&f^ÑðUµ›w%³¼¡hèë—=`£J! „yÜ!½½,þ‘åΛԋœQÝ@lµ¾Ž\wßQœìKZÿ¹'ÂAo=цC¦VÌ3«_=üé9w·ÔyÈ9ɺÜ+¾Z!pK>p6>L©Èê12r²«­Àï²´]-ÙjÚÒ¸š¬øß4=½xM­ò™Ï‘ñ&°4hóø6YÿË&k”m²šSN|çÍê7áIj Í:vƒåìÍ Ðó)˜AG»€1ÎÑ!ñòq[UHW(èÀ„¼™¯Ùó`•œÆË(‹Xûç† §ËŽ$ \-À•!ž1§röP$$IÒeKÂÿŠnÕÐü+;ZñDÊ_À4Hçlj 5+ˆ} ßvL~5Z[Ô2¦Ñ­’OÎêžxÔ í¿½póÉŶ~§°~LÖa*V9±BH—匄Q¿àXê,cª¢éûur¬b“=w~qÔ(qìqxýuw¨Íã•_Í;fóvv¿)¨ òg¨•eæœ\7T¡b•"cÀ&IWǐÆ7á\&!„ÕcjR¦?4ðl ä~ˆ<‹ZS£Š”x\F€µ•j DÊV  ±q+i»~ÚÄZiØO¥ñà)‹x‡.»dS£ÊD +Ä[ O÷ì1Å}ØëãOþ݃GËb_óáµÀâ¢J­“ˆU=‰d(³(Ƙ‡°æsClgòöyƈ';¬Næ4”@¢Ý§jlšÈkqų×KäIUT)ž«pudvñLç"ü;ÆØ%ä{fðXþê T‹::ýÆlÇï+zœ…ïZ¢·š%ÆCH&bIöÆÅKçöê-úDÊñîâ:P¨‹wf3—˜0Jgõ+8Ž1 x*É;`ÚE‰´¿È¿uÏM§¶–(©ú÷˜. ņ˜ž·?,/LüÜù¶Áae á*¾áïøz9žù+ýø‚XÜ?¿þдœ~ B¹'âÚuÝ&÷±â—÷c㪷lŸN¤žëÓs»Û“UÇôXH|#›hĮ̀%S;Í>ô©D¯:²¾BaQ¾™>OŒœ+|¤É~q1DZ$äO@Æõh,µÇèCþÛ~“W™tvôîؽZÛ½­:Tk™4‘CÑÊö±xNæŠÚ_dÒÑòZKt|‡$"`_[í_úZTÙld”9‘þ7Fa[µ%(ÊXøŎC c¿ý pßÐÏ>óK"°ÇlŒqÆ õ—¸JPÍ. kê°vyåØgrÃ$éa\<éTá@Õ ¬E“K‡oSÎ1Æ)‘B~ÿeõ=‘!‚êµ¥ê- È*ïÏâÕ_I ž #SJ,¬1ÛH?žku®Ì1öCVR( ä® j‹þ4ÓKãŒøßoÏþi€Xw°Íìë¢ÌŽp ӉðJtêá~ç°ë•”Çmãz-#ӏGVnæ¼W"U.&ólá¦È[ÿ× Àþ·Ö=&Ùõ²Mê•äT8_W¥ª•¤vçœÂm@ùƒfnv¢Fч&å4ó_c‹{¦Õgß¿‘wÕ×ðÌúýnŒ°2B‹¿í]]AÖí¢˜â!êŒ)RÍè2­oÀ4óš“íJ­ù²¿=þ·ì7Šûÿ‡ìߒÀ¥rõÈ´›fžu¢+< Ÿ&);’ñÌ5Ðmå!n…x¢ýå¹ë í-ôåáâ%ßaë3’ꃚml4F5q‘X@!™½ÙI©f¥¥uN-ÍužC/Ռ¬¾ˬ˜hÎ××$7‘Ã-Ón4ôÝm@F iƒ'l”ãl-ۗŬh’àV@kÔ{MÎÜÏ;W¢n”ý?7–…`+³Uܗg /-ŸØå ªÍÐþ§åHEiÐÀä®ù rî¢hRQ¡üÆ©³j2  ß‹,‘ˆþNˆ‡áKæ-!xƒ‘¨’êC¼ÍèWv¤`æ#ÇK(3ªPË|"|H}«vál.2âÆO =o3œrZw²D‰%e¦˜¹‡³@ ßàÔ¬Þ ¨£:Á¦iL76rŠR<3ÝÜÑŠ j«{®x¢Ìø‘û +g¹æµ—k~Ï㩈vñ¡œÿü,¯OÐu¹ƒêÆ҂æÖߔÑã„KN°0{YµáPt ÷^žDV?Am@[ãÁÏúFN?{+¾ËH{{ì½ ¿Ñ5ü“ âùÿº¥B…i‚n¸Ãõ¤Ìµ +©>nV„$•cDÙ6èˆV‚ãh 8 äýûU’\G²Ãö} +]@Žœ˜Ãy´éˆ¯¾ÿö³†÷žÝv´¼óFJ¼ªÊI‚€7rdÉ +»‘iǀ`œ«‡lܓbÌgû‰'2ÅlhˆnaîA!Ñtýœ™s/T‹ÀÇ_~›ž«=%¬¢,†ËYo%³FÈ nƼ“9´‚ômW¦KõŒ—þu0y×ËÆT`íx–°#ìsÂïAò¹Ÿó|v§ÎÑÄúítYSù÷àÀÞË~Ö¼ƒ®ý•Œá»\b|‚-µ²ç D~ÂbÓþH;7§ÈÂÍÅ*³¨zZ{F^Ÿ=¡)ñ‘Æ2}³Tøx!wcµ·'Äób¥ýT›Ø_îÝ=…x¹Šð\° +ª¿w§EmE‡ævG`ÜèèëûÌ!ÝÁX';Ajç³,Í*P¯Ò²êäõ®÷ѐËdµÊfuÝLÇ·rÙ`û³ýLùµêíìO^ý¾¼~› Fï,®¸Æ5¯œ¿{ôʑ¤µF¬å„~bóFý3D ͦ㼷ZpÝMÒ[9ü@*2XE.¨·Ê²hQÌØ]­È â‚my¸ÆÚ‚PÂr`æ|¡ùØ%НӧÈþý•á2·B>–›‚h;6¥|T‡z¾6?í〪-ä€C¿‰jAöC±ªÿùnÝ44·ÄIÕTD¿´+tßÆÅ2ÃÖ´–ÆæQ×Á="Þx›ß’¾ °Áê=cóF7üÕI 2ƹ/í®{k锋Þ|\‹?8¶š9{O¦95ÜÍNÈïÅDçµìqbB7ÃÍfÏ)?B›¼rL^L;Ä?u•¬©ô†;*YvÅX „¾W¤+ V òv_†4¥  9q?¯ ‚o ÷áyRÍ׬È}Ðü±>*ËÙˆÖÊ8þ²0üˆ‹*áÊÀ·‚ã@Ø ‚=1aæ²çÉrNä*ݽ\?C$©0LáÎHÊ>‘eQ”2‚Cw³V ô镇ž¡×\¬z•êsf™æEà§XÑ<'÷b§È-tlÑ¿-©ØÌê'oHÎÕóY^ˆÜ‹Ð¯DÎõRĒW=ÏnÞìœ(o<ËCSi¬¹hÆÖ=y ª±ŒsŒEÆ9ÅOv¡É͆»i§m<…'Žè)á˜Ñß-ýmÏÞHB^A‰ééláÉi˜Åÿhˆ}Õl\56\ª[G1Õ¡ªMwÐïÅ^6©D© RÆZ‹1“/Çï{‰±o²ßò+ŸxkRq¶Bâϙ-K ÿ‹ÓM¡Ö¥¡O;·(òKuRþ²¨pߕn€ÛÊcCåsˆ‹—)àœÜ—Ð(¢S À ÷Þ÷‰à¬j\à\ˆs#Ê 7”ЖGw´ß#|£&F=×sÞóe^õØ®²$&ñ$EÛ{p&šÆ•½àLq0hhÌ5‹JÈj;¡³Ÿ*xU Ԗ¢A¢;T5ÁD¥æ”x@¦ÚØo"yÏM=öü´è>{õ̼?àSZº±RqÏzeÜî™Éñ#´ê"Iь}a˜*kN6ëJÇR‹63+ï2o€ëkmè/qPnx"œHñ¥Jiå ú»«²• B¼°SeþàƒäP6LÌ$ÝXY,÷j¾ë¥sø<,š§'ZóKžùAd¤šÕÙ(ta%[€h:Ä'žf º1e27TLIÛî}þÉã1ê‹ [JÕøCK²âM’A‹kLI‚J0Ù"w±_d¿ë^l(ð'°é.[ŠëflÁ¤”ªu#î¤ë"øbfòö`H«w1vÃgè%Y#-&I¶·SŠeIA¹PHH¨B9Ø9Óà“[©®ºT4h÷›%›GT6·®ž¥8! Àg§ËÂ^7§ûÕx§¿P¤89=ƙ•pdc?:òûú¹NàÍ,—ûês‘ûGî Fî»TìoGeƒUŽÔߋ¥sø”úÙÇGH}ôåžú­@Ë.ìª44ƒ5zŒk5P¡¢A2Ðm"}iˆ‚ëstÓÂjÏ,WÏr Téæ)Tur¡-DP$«Sb„óÆC²ZͱÃX: àÁ[=ƒªXv™šRN—…ͲðMëvւàl*ТùUä¥*ОYècåìsvNuŸä§~ç${ +1¬ccª6Žˆ`‰±ö3'Iy[í 饩3%y‘ðÅÙc¾#0±Xà´?ÒÖ£I&‘†Ê„wù@Ýx̸“á]¤#˜øÞNŒãÒ´¡`§&WR.ÛÛq•öSmb¹w÷ãâקi6VºÑ¸y>ÚÑïüÔÖ‚¾¼°š¨³âD=|CíaèÆùLÖGã)¡¬,Bé3øeùþdð“>1užíx&¶üNN•îǬ߫Ý?9õ%9åÖµ”þ3Me¬rm*ŽF:/†{Èýl*½×£©DÌv»j Á„bށ{t"ÅT¤`Ó~±Ë˜¨mÔµ~­mÔ bÿ–zöƒÔ›×Ôë×Ôëgêõ[êͦž}uêٙzó̼³Ýòξ6ïêò¹ÑžÏÉuÜ`ˆ¼Ñ™ûöý҉¥óÊ¢ÌF–%Šê3Ü&å+q&§}nÅù„aâ@’ûýGlÞ4§pØÂ;>Þ/°OXŠá|ÿX?0**ŸØÏòÒPR(0•\Ϙ¬NÔH?%wsá: 5ïeÔ[‘Õ`TP¿ÐUu +vµ@N÷ ¼›Ìí7uæ;ÚKèÍ; +ýF‚éʍEOl @ Yûù,ZÜìP_ÔØèRä#‰*\-vb}ÇÚÿJ{É'RÙ PøÛÓ¾³—Í«µosÑs}™a?kXÇÕ°Ž›aw‡ZŸàÕ°ÖïÖù}ÃÚÿ»_5ŸÌʯùÕþ¿jW¿Z¯~Õüª]ýj¾Öv3¬å?Öª&w±¬õ‡–õ0©¿jYó¯XÖӔ¾²¬ãfYífY >™—ø²ß¥Xû]±Î/T¬ó®Xíçk‡aòôù£XŸbíÍK¢!§Ú·T’]cìw”ªÈ¡2QÓÿÙ¯–ä:r$v]@þ?çqtD/äMß1 Éb•dÙíééÙx#U,2™‰ju@rhyÏ¡Æzˁ6†!Âç©®†í:ë9RHæÆa½<µó,ÆDß.„Òë^‘3-ÄM&ÕùX!×ñr]}'ŒFñCö7‹ï½é+]õ­`Žt æuMX,¿•B)ÕÂJ˜`O!ž2 Â~Ä?¾œgä¢]Ÿ‡Úùvàìl¹Y§ã˜Ôð¢¿ë¸õ(*ÌêAÕÿÅÕ¬¸a[:•MZW²:ýôo,\]åÈ~2³pHh©§yFp¨–l¡b§¨êÂʯ½äÐÌ}.0s,£+ ¤° —™m8zÛ>ˆ‚*Ì©mPjX ï5ãf‚ÞᏮȞ³®¡qú1ë]ÔÉ£—´Â§nª¦àµdSZ­š«S¯ @”^];D•Äë( ãõ‚¶]Ž{ë>ζ79ÄPVƪ‚ ³ÈP¦Ž|'{Òs°Ø"õ垡ïée‚~çoç÷:?³VËPtõ „mÝL‚1Ø_p:N¸Áö¥ðÆõK7–i/\ Ë.9ÖÑ6þʺ¿°ž˜×sa}Bo¬_ª¿Ñ}Å8æú†°Þà&®Ö®×ç)pô#³ºe㈓b¨å~s’7Ð+(4m.î3H½PëΤ!$Êr¼v“µÑò¬1T!’šK”Í‘„)‰í¯Ñ ø j_Ë¡4êEO$3™ ÷3‡¢²3ø +4‡@bx¹ˆÄ2°ÚÍCۙ@h­ðà][7SZs¦“.cî®&G° ø:Åv£Wìld %’2xýÚÈ̓D¦nºh™C[òàU¡O‹ÂAL‘ÆÓ·Uò‚ÎdT˜©Â4¡6¦åM¶° TáI)*>ØÕäþ½Qc­$GÖ5S{‘¼7rJVO +í¬,äÐÚ¦ ªX'Ó0Šž9Ò¦*I ¡ÕšH-/&p¥ÉÉKhj›¤ŒbYnt¬^lÓeŠ%»nµé>¹Ï©NƒÛ·5†+E·]R²g'ñéã8· ;SÉÝâYN·A¾ —¡Ø!¬R 2C„œ#[srF»ã8p—G´«’¹,`y^¢etUQOˆZÉ´¢ ¸ë"˜'ۉ‹¹9xsYêÂð´Z¯fJÀ¯ë°ë{áþùl{Áˆ–)%Û9>sæ(rˆ2”"Eú+U‰’Äâ½7¹ÞQ¤šâîµÄf4cÚ³VO¡ø‹aµÊ‘Ÿ¨ço Z.JùÊ|Ôi`-ˆ - +³hѲ0rÝٛ +РÏ%ê[æKLØÝæÒ/aA¨m +ÆH²òÄÕÃ%iæ˜Ð6’,tªKm·ÔËÛà‚ç¨üz¼Á$?†ëÂqÁWé@8Ó¶,¤^ÛrMÈ]Aß³ +#ÂÞÓË-ÆïôP(èmÅ£šÃÝ_E…»ô¢R7j¥_EuÁ¥HÙÐPUøÖ**WM yÝh]º®]SÒ»j0²×lhŠiՔí;”US»¦½¦,ÛË&ŒÐûZŸ ×ð]IEd¤IÉšçaSËiSÛiSÛݦ¶Ó¦–צ–涛Mm›Ú6µý 65Þlj|ØÔíLdSÛæÞ\j¹¹Ô‡I}xÔtzÔqzÔôÿô¨éJ.·—GMÿ¸GM?éQûͣƛGÙ£–Ÿ÷¨éæQÓ㦻GMßñ¨õ»5ß«aœÉ¡Ò@Øí*d5H‡±2iä7S£¢žäß܆ÕԁYUò z—ÆBÏ"Èm#n¦‰a8+§õ* íÍ6nÁ9ªšk˜MdÄ\-BЯòT¯‡DHúHqçcü»…ñÝU&X<¥»r¾µ õ+õù q2 +w‚"3nš‹18V>…á32jñxÐ‰Ó  Ï[ʖ^BÎ×ì¾1´eh¦5S÷µ¿-聐mÉÔ©Xºø˜ ÷4הêL=0¥Ý œd‘x­öTt ŸȵÔ¼APyÞ!>œ™u}ð©†Zý\žÅ£Vd^8«sâV/´ü¼âfn»ù-­Kë{b »@;ãOIë>ã)­셇HüŽ},iݬ*–´¶ÛÌñÝ€dñDj­v>5uÙî‘]Œ@.ŒigªÙ¦_t3ð^RÇ ëA<²µó’?­M2h ¡ÃõÚæ£Ãy7¨Ð-]Á—¦“ƒÒyTÎ%–¥¥dê†Ñ/*Äëö1Ï@µÕ~WKS÷žÊB,°:Ӂd|Ws¡bEÂê…8~[Õæÿ¶›í›ˆ¨®2±ÏL”?‚.ï\.&žq(M{ÂM#š.¤–×”ì\Æ2n\ºÊ!o¾RÌՆ9ëD•Ö±Žh¨ŒxM2·•ü/·äøëÎg„ wSRÝbxþRì.¹B'¬B}´¿òñ9Ë5oëôq¼}á8ôÂúÅ^ìñåZ q‡×„õ îàz@¼8€ƒŸ9>ÌеȾБh·ÖíJj¢·Zrïn‘¬[VëK–#©wï‹åÖ“h6ýÖ'6ŸÈ%ÛkC©; PìE•ýßä\÷LE Rs“o É7¹èÑ)™ŠqñŸÕ“T9ŠFRÝ0,A¤º{ÐH±Ì#þfØ÷ [,u¡·~¤J(þ¶,ÙBäUkÝeIü‘,wY2~,Kú/ɒtȒñ©,§,i§,‰ÿ½,IwYRþG²dÜdÉøž,)ÃVÊ?”%åӚ)g͌¿]3í³š©¿T3ík&W{ò³FUQålTÇ/l5XájT†ê­QÙýhTçÙ¨ìjÿâ}f/à}ha7ªµƒëè/¬Î#<Uµ”FV‚*☷FU­ëî wô*‹y@P»•¼²Ö+P¹8À] í9†ÆCu°ZÀP257‚Né¢wÐNÑ¥ú¬Nù#ᦨÛ>hµ|™v¹%M[®µ³PáÈEÕjDãùÂý)Íô·”5Æg皖HU»‡áo Jò–$_½ÊQ˜Íê ó3¨º…p‘䟡Þ]é‹"9µm”Ó)þè¹ÒÐò£-ôƊŠþ\¢qÕû6_º¯l)sÛC6­=L'»~èj]ä„*ޜÀ¦­+Ӝœ)˜é㠘6¦eœm}Ô[s²•:icâ/zw`5f¥¼gF¬û Ž•=‘I—®£¹ÌÉWrÀ”™qÏí7>ØqiH/ûJä(fLöŽQ«PÖ=dvzîq6âC|„Še4O¶ÏV£Oä’Xc\d°‹™Y¦–ÈBúyÿR1 å*±˜J´—ØŠ¦…¾šÇm5 ƒÆØWÈFXxD 3O€”HÚvô\’§ZÕD»A€v,óŽ¢Ø™B(²(,Öěb«b¾†OÍb$b«Xþ0ȏ´H/«$ »nP1zR”õûʉôYN”3'Æ='ÒOæÄ°Z€Ši­ ù{ðˆ¸ÅÃgv/÷¢ê†r.øvHxF;tf¬‘‹v½9cäñ­îztB°i릖–þ\3ò-0ì&l1(FNíÚB±î?ÖÛ¶ tŽÖ-°)×,¿â±K˜\Ö£ÕÒ ¯Eêh𽅊’æ—ÍU…Áž7Ÿbk ¦„e2ÖZÐ2$PýMú]´#<ÈЬ¹@¥öªš&‡©â=ù@â›È:­aJOöt²SDÁõõ(G»à»¬ìÕv;pÍÖ¿£½y^sËK/á*EË[0©–ØÀÐö’»œ´ÓÍQjY€,ó Z9."QKQŬT Å÷ ¯•ôfŠÓ íX²䉢¥C ­ÃfÛ«Œ¢ñn.©òõ½p ßoØE ™”b— ±r +î›t;ЃvPaÒ"=¼ôµD¦M5ÖÚ¯â8Ǹd ™Ë1ԙƖóM.µˆXeé)ñmJ3[’ϬaC“ññ¢ŸHyg“Z¿AÊÓZ'å€ôŸY×!F‘ŒAʺÆIÙ¼SóCא—ìòÌpN¼ý_ì:ù)É\¨wx®±í ªª>ÁY·HrIÀ ‡„½#‚ðwi·'{¡’ѪY–¢¨½HŽºªxjˆx73µçÖ3ÌͧxB(—Ð|Ȫ bœlµ½œ5#R‹)Rsf–·â|“™;®i’f΢Ls-ñ;%4”IÌžÃC_"1‰UÒi䜅J´ŽˆÉ)hOlßb +âm,€‹hÕÌ`W”š#Îü”©#“fyÞu¥u¨ãÀ¯GfÍqHl0NF =…ÃgåGø}–ÛÇï ӓõ2m{dÔºîȐ6µ°e8© Ä̱ҖrZmTÌ°9k;‹fOrÕ¦Œ’t$!'ävf?Z´ŸÐßeøÑ?êE© W7=Sšy.¢É§DRPR¸vÕÉ`³_G“ ï¶*Ÿ¾æyìñ× :öÞ¯ÛäÔ*a;׬Ä⤿ÕŊ«èVsÌé†`¨±ïO»¿Í:öŸ¤ÿ“ôo‘‘Ñà0.ê¬ù5åÑÛҊ¡ËÝ°2Á¿ûsjó\ÏjÏô.ÇV¾¢XiŸ]ó Å'Ž7/äýæ; òð$ˌ\÷SÞjYj溨eQ–°@p³~«•ŽÌßä]ÐԕR'$µ5«â–~`fj¸¸g)©„úp«U•ÿõ7§ ´É°œ‡¾>?L ‰ñÁíe癉G+ÿÅ «_ º9¨]Ö°áù¥û‘K&4»Ãóa}A6<+ÜæØ]×¾ãj£»Ã´‘éêå•q’š¥‘ÁXK<Òèq‘ sŸsh—FìpîXÊQè-ßòUzìÁ@d¢!Mµ›N娳Ñ8ÚîÂNI†Ú1âDµ‹ä!@t¾‡CµŒ±ƒU¾˜zú±MH¤j;¸±3Lû”¸Å¢3§ß’·£­[ÞôŽµt=è ˆÍùÈ[㎽©,ªjùX$ûׇ¡:m¾7hy÷K˜\\W &x}¹úMM ¬Þ Œ¹•öøM3(ö?‰ß^¦U¿_f¢Ív#¨+Ï/žJØßۓj†M+\©X–Öµ`}«£\>¹xýÒ}Gv#˜jñ‰“‹Ç†gAXÝݦûoÙX¶]wà@{ƒ:ç.…(‚Y¢ªä˜-{î¬!"¢(¬ðz"aáryrQgχ°±ÚKÉW¨ñbUA7_}–ŽÃ5BŒe¡Ìlš¬¶haÎö1>µ dŸÍ˜¯ +mРda÷伃•ñ\+Nۜé‰]ÕÇ´¯GQõrÿˆzˆ®‹„Êîì!tY.FÇ›é¡ïš?´Þ5´ja +%V(ø¾Pô Ú¯;fZ¥R¨lg‡xŸëåk7sÚb…»¶× +?Ë<Âõ% +‰KÔ.Þ|¢¤ó0>êÎXG× ˆQ]fd¸©[ñ_3®ò†œUHû©jWç‰ß€$ pžqi#…X‘]CΫ;fTöø…ã¶1ïþ“1ÿwc ZúlT.}åü¦\*¿Ò&¯Þ•¹;`Û±ixW§ÇCcÂd@ Ø¢ 3І!&,>=˜äÉV5¦êÈ»©9Ð×O£ªžÁaî,x’ ep!ï>¼›„EŽÙúteG“$ދ"({ß1’ JóÌ*)°*XMŽ…éPÇƹÂÐfA%]¨9àK¡^$Ãs$¨¯p֝æúýŅŸž±ÛsïZÕòVDôM|M½$rgµ!  à8¦H3͘Ï*fò^Ð;¸´ûù}uCΠ:¢û–žh¨ôkíѤ¹ ?úG@µªðJCZÔ-Æ­ÛžeŜ‚]âLÁaw|ä|#ƒ}t[•׿"pøÑy§è|÷­Þ!VÅÄT¦­´$¸ÉÏ};ò• Ɯ®ˆ÷< ñ9Œu®|ƒ?zÊ#ÔL±¹óN„ +z„êýzncòœbӑTu6çCÛ]]͎„¨q¢lìPm¼|‡IAÏôhç?ô{mB;sŸYY;ôÏî–ÙÕL‚¤~;^/°,T&nb•YŸ´õÌ©Ïò]d†ðRŸé©Jáç9’?T€SlJî ‹܅’õ €xÖ£ªÒïˆF%9ð÷/!}µ:L ¡ô– +_¹¹íC9:Or›3W¹Ðð¤&lÜ;*¡.U²AœB¼%å­°_þÏ÷y脳@r>¸:gëLœ%Þgö½ŽÇÌâÁÚxÑîÿr”BQý¹+žX õÄ©žöE‹c–}žÇR²«èo1€z.<"8´`p¯ÍR£ +¬øê9GScÎbµ¡uʎ¶éuKFì±}?š*º‡•BJ™a´¼ÌhüU‹™w‚KüV”ö¼È‰Y ŗ’f½€:sÌvܧBªŠà¹šD6£÷ í():¼„$—À)šjÔ!ވ9Æ%ûÍܳ_%Éqä@ì+ú€ܗ÷8&Âû2ÿ?LH’Uݲlí›/ÑdqÍDl÷Ö½moB#”±Ê sªE¥Ž|'q÷zšÏ(õå¢Oü2êeûKàŠÀ'ÄD’"(Ã4âÀS¿@]Ñ^ٟ0Ôd…÷¸G&Roi8Ûªí±JcaH“ú*9ù<XÐgÚ}û‹7¶Ûò° Ÿ“Û4yGÄk™åOšD 3ׅÉD(Ÿƒç}R² B:áb«=Ê N¤˜f«OK¼•¼ø,Tiì5òØ£mV´Ê¶ÚZ]ÈR &ˑ‚ íFpÖ®²œIõˆÑ +D8È>ÐÙå.E™áúj•”jD3# c¦è0.’¹¬]*—‡ãS…ˆ%b1U•½_‡\Š@è8|œ$±EŽÝ +lFäTŽüôsbtä½VæêˆÚç^ ÉÓÅ@Æ9¢Ò)öFäe Aè7㣠|åùƒpŽ'œû5œó‡Â9_ùßÃ9þ\8—fÒ§ÃV5+ž­Ü<)EíW„BV ÈJjå> NHçÅO[±®½f;s‹‚ø¾‡â}’Dq¢ùñŽ³.œ•h“&õìÀ¢Õ¶ìÛ|)®i-xz>;°ˆ—(}hµ¬Ìk’j%$ž-TKŠÊ•åGѲñæ[l®‘çª9hX;g®ÚyÕ2ä²úAœ2I¡[[ßÉâadr£Yت“U8 +®ÅíEÂe/_¹ÚîjÆ#w+ñöåõ‘›®8¬º<’ +pQEï̦ ©)µ%¥¶ðGy%²ŠC+˜A"Ê6íÀĦŽM¤ÛE²v¨Ìhcg9Pé I í:™¦.kÉeQâM’•Å¨U&N§Ûþ¼»Ö §ùtwRb²þåŇúŸ•g–§[6%Š*ýÉÞ§›Kí2ÝmÐTkð;ÕrîÛÂ[) £‡C¢„œUµu‹H"«¯6ªÓÃXI*ä©a`öbԆ +¸“ +0Õ0h1öƒc;Yj¥m$a¢·`/Ԙ\º¬IŸ²®Šº^où7P¶´‚,êI뒔I«TY—àŽl֗û%>1]³oO¦ù^ËUÆQyz +dÙ¼2N +èÞ,¥ê)¸9f€š+„<ÈÉèގŒ€ÿV9[:þíX˜ 5]áÑo{eE¿ÀŽ~A~+Ðíe§6XeÿZ,œæsð+ƽ|GüJ&ª'jö–‰ÞPȨ,±µ8%„¬Ä¶¸^ñ…£â"3Ö¢ìáŒÀK[S[Häêh™(ä‰ÚK²ö%ã2%ÌÚâVÓv±,¸¹ ®ÑbI’Óµ¨,ØG©ânc;E¥A˜yUÁ…jűKË/FÉí)e)‘ïP+¸È.—“n¨©*ÐÚå…l7]/ŒS5dT?P5fÇ÷E]{'êæ5êú5êú‰º~‹ºùnÔµßuíDwëagm;mh^û½7«É{,HúLÊí;†Î덲Þß~¡h¨ÁÛ<HƒwÒ +I×äf“ +–8’Õ¾.Íù„Ëì×=þ[}£Œú´]áïñ‰ö K1œñ{ý¸4kŸñ`;~e ¤‚”ª~ òºn “i½1aÙÙ<і(~ïÁ˜FéùVIä6x+­•G˜a%˜õÈXCő©ãBâT™)hÔ™ïh-¡‘wäà+ ¦© +Mz9‹jÈ\OŸ¹Ñ ÄšÄµHcÈà°“ÚÖ]Û_%¦œ"•½…Ý0¬7{«rõ`[À¼mY7µ¶r·¬ínYÇw-ëƒgܳæw<ëö³Lʋe-wËZ~ʲö0¬úďYÖz·¬WÇZ®Ž5]kyp¬åêX/†5ß kü%ÃZìjz×®¦ØÕþ¿íj}×®3ëwv±«ûŸ FHÀñC½ZÐM¯–«^-?©WÓU®Ž«\Wµ:.Z5ý²Tí±™•êRª=Ù À£¥”אB½^°½OÈ"V„Ì“IÒì* å݇T˜ë+ÚX”kiÊ|/Ô®BÝêB÷17ë£àwQ;Ä(èÛA¡‚À ®þ,2%=€¸ÉÔv/¥@®[CªƒûMÙ=Õ‹ï½)EûÎm»L1ˆ£æ9MX,¶çª>†jaLЦO°_a?î?¾\ÏÈI»–‡ÊùvÁÙi8r³ÎÃ1q“=ú·Ž[¢Á\xÐêÿDIYSÔkí;¸­€c}Ö+e(›C®.Ìrd)™Y7CUå ȃ‚MUc»­ÉR£Eb5zÊ VŠªY«ƒ»¥B°œÈlÃÑ׍ ¨¨¥Â!\e0‰TYÔþ¤ÁL=Á!†s\¥=l]4nyã½^@É[:Æ!ëQo¤èqmwò‡„Š[åQ±…ȸG¾™¸{=‹MS_îúÌ2ÕX<¤¿Öïw[¿ž¦áf[_I% ³ ÆeÿþÃîd/j/ýÚäüҍoÚ '˜S†±GbäüŸù2pÈ~eÏ°±Ö°/.¿TŸS34;ü¬!¬5´‹3bí{Íp= ¯ c’EQËýæ +$s [ª2C‚ìõîŒjBö§¬t·ç¬¶Ï˜dµ¡1HªüÚ)$©L“0šì@òk6,¨V/‘ÌKd΋š™™X‘j5{Ò%êS!ѽ¬„E»mÓr8í‡ßÄ8h2ÀÀ6sÆl“=5ðœ´2hs5:‚EoM¥3E Q"=ƒáUÌEW69)M nš Ù´¨ ¼ð¥Eæ ¨¸´!·%w èœF©ù–Kó Šõ6”…,Æ/ä‚Œû_s\mìq¦¶ ‘˜Æ™&ƒRWnu…p­fË\‹;ÔâÐó{…ÈÌ߫뎢øD_=,m¦ÕoõØÞé4¿Sšé2ø+@’Thâ¿"%v2leë‘"^ðŒiã„ân‰îQŽmJ¡;[¹Ð$ê}RQq +h¨(Ÿ¹òcCƒL®[¤âc‰)°é)„9Η7x°\“ç\ýÑÍc®¹O9ÓIòF€}Dú—ÛrævÜs›~-·°·ó§jiãÆ"­ÛÔ\„Rˆs¡QË–µ ”²o¬¶ï¶ï!¾ìW'p¢I,MvP_àõK­›ÞӞŠ‘L»öPÌŒõ¹ÍË¢‰ úkÅîìØC1c±·[­:ʚ¤‡¦kØäÊF˜U÷`ï[Ãas49WÅ\+4 4r“­«m=¸wIVDÞX✙¦ë¡’Äåñ‡@ +›.Ÿ˜êk~òžk¯ú=6ó¦2­]ËPä¹Ï6oynÛúÈ׎”¯v!ÑÝQŠ LÉûp>632sW€ôÑH+Ì_Γܟ2Èvû‘'gˆ w'y«§0Óhî0±±J²*¶—‰R¢€*`ƒÓ +M¡xt|~¼L÷¸ÝêZ.\Ï—g7kB`°Ž–ó½£j`#€–bó€æ|R9¦›€}'U‘Ïí¥ÿ|±5–,ôŠmþÁ ]ÃLrúTô̶#NÙÌyh¬¾žÙÝfVa¬¤‹ØD õEþ|ˆªøâ{òXü¨t’b”UlÇ zÛ÷ҔmŽÊáR1. h&-Æ(9ʼ†v+,y¼ä‘z2¯©Äj +º”†·K|f»LçÑͦjF%ÄôaÐJ¿Pp…CþL)3rŸãn„E(ó&6ž+P¿&´Ë˜£Èӛ02;„Œ Ì‰ +6‚[2°)úÑ:_6ÄC¿ ðn‡pÜ\¬V&–T@À¸³?AÀ+¦&÷yñÑÊ6ÒNp žpHL"¸ º•òð!#è *‹¦ê_f¦‡^R^kâ£8°jÊ=Ì[Úª¾ïŒ[Z1×éX(Qé¾m,>ÅÅ6î¯c›O¡ÕnöMƒnp@Et¿C-lO`¯Øc»Ü©ü•Å%ï.È8·›xþ´”% –*,tÅ؂#긋7‰Óàj”D×fåqO´7'¤·ÁJBCÀg!³O1¦}}¢ÀSÇÇ浤‹yM¦@l›‡a}á •Nñ$£Î`Ñ'ý~_ó)à| =…ïé#=ûk7EF‹4É®½1à)ø¦Æ´ƒõÙÚڛ«MVÝPñöQ'·m;îÑTqÿ±M>­åM>¸°xÑaè¯Á±öÕ8Mçý)áN<âÖ=2»¡æä’ô]’à‰ûz;ªK¹Hˆ?Á.©™v°KçßŒÂoÜÍÂù 2Aù¬vaǍKú­Å4±^DƒEzUH`­“¼É@IJéÝBz‘Kf§É™¿¯âD¬¡Ø¬"&Ë1Qòôrìi¬1Uäð:iç5Ú¯,nÐHxÄíÔîÑžB¥^`G{¿ß¼ [V•P÷Áw†$^³87813ÆtDvm/çéßT¼µ¸-§Ï§úq*§qJ§q*OÆ©œÆéðMùæ›âßòMåÉ5¥]Sú]ה.®þ¹kªº¦vsMåæšö ¾Í¢ —ôS×ôÈ[Ùºªa¼e‰ºÕw5x׫g„Ä•y†È«9]@i[Óæ¬n¥Iz5&&Òó¢sâk.ÐcȬÊ.æýIç'µà›8ê[æ;lËyš¢­ì¿Ü®ç¿q8ÆÐYº«ó—Œñ0•âR3ãwøÊF× <•® Ž8×/Èy¹fˆÜä^B¡–Ю´Çk‚ó8ú‘èQ(õOãðéÆýlçg$ } õ”€|JÀnû¾¯ø€xh@¹i@ú[‹.Ȫ@þ]ˆŸQö¡ +ô› +ԛ +ìKtì›JTÀ$xkM¨cxÂo¬XKÖ(zŽüuÐ5ÂB¨?E¶hÅ´™á;I7%mg"ŠqH²mËæÍÄGjà1Gögî®&ìX «Ux´ 64F‰8M[¤Uk¿LҜ´ß\4Ï\l˜Tˆ9ø\„ŒRvX[_·%—P´-Ù¼¤îLüðfͤ}öòԓôÔ·zß#ÛGí§²ˆ{> hžit=£¯%"óÞÐÄôèN'J P¾š]éÈÿc¿ÚuìJn`>_q`Vý~¤6 xsÁXWXßUEvŸÇÌØk`“…š[<§yØl²X}C>Døó‚ÔÖTWBF 2Ã?Jô°…-ó$’FÀô幟ñió½Ü5ðàÀG~4ÍÿYÓ´‰IÇtüöÀa:ȞكSìÇ\ȯHéI—²wFñ«e€G ß +‚mfO’ªG4`{6uù ÅòbU׺1eŸ )y#O÷•âE‰½ÅÔÌ󷅘¶ÄfœÆ¹êÚ¬pi¬gVë”Ù<ù`;í:ö|áZ—G<]òΈ,Þm³m´ã²‡B~§c$ÖhÃJÉþÏu:P¾JŽë™m‘‡¹çU"®wÔÙÇ®ƒ¥ûEĝ,atPË!Ҁu#Ü"†ÚÇå…ÞÒÅÁ®â¶ÅUØöà"m}b«¸ÃzaŸ\wqÓq}â KþqûŸ/pU]Qî¤L™|å‚V½nm0]`Vç«Æ#Gh°¦AéÏõ±[åŠÖ›{‚ÐúĒ^gôj}z‚eNµJ„]aZˆ@éÊõxVt0¹Β&тÑkŠ¤Z'’J¶JÊr!r6 E’ïNΕ‹uHŸí"™$+mEÑß®Oª»xÔgò@² !+P«BzÚ°u·Fl8ÿ~á Rÿ”&¥ÊK±€è={v‰ôµsôý¿\ì®ï…ã盝•BbþÐtÝ1ZìN²M\²b<×Ó¬=#†WæÚ=£Ó«Yw…Z”ýxfJÂ~›ÈÙd¹‘~ÆOÃX8ï%]K\3wwmzëÙJÖ{m_BE°n+)óZ·þéÈ"êü"Ƒ2g–ûð'h»ÑÖÁÞáÏ×]£\AÉ˙«ŒX†µbë©Ü‹ÂòŸÑŠmΉ+tä¯ÀŸAü¾F?ƒÕ»Bá[þ2ã;0¡ÓçzfŸ_ËV\oÓÚñÝÀ{ÈÄ$dQyåüÏÆšY»º?Ef¿ãú³¤kœ¯r`qñ'óæÕm±Ç¶Ü°TÌÃZ< µ‹qÁ<ßÄå,a;K+әR„Éúšøù"q8öÛv³$jŠ©›öÑë†üʯ+'l+5ïcÁ‚zž6w$Qªi‘I¶4¤M&À°o¤Àç=Êi·Ï÷$Ý8;ûFëô+]›¤{,tíG£>j:.ò?q @kæmØÎu&­ ¹˜Çº´Ø}ÅqóODi/סÍW›aD^ ú¹ò?4ª]«­j[°Ë‹? ªT³1Sìn“ø`Žž…è*̲)ѧ´½xÏ[­¨@C0‡—ŒµJÕFvÁViØ×-jü©M' —¦Æ£L±ÍoÓ`#²Ýh&¿´¯ü3K¯®ü’gHyÊFlÄÜd= ÂÕïÞºÿΈ­I\„² +Ö¨à+¦{Yî†<’ýÐK°ÀI}\ ô µDl¦`ªüÊnRö_Қ +„´ùWbíK™  t;Þ4ƒãöß ãJ(ܳc¶úÝò”¥€ÌòÄäAeLtßЃ>€)݉sgAÞ-OYʈ²DÜM„Q(yrÈUaòqåÜ-æ#Ë+(gZÁß –;Dá7X1rq1ÀCGÚ@0ypž rà‰hrkJ'=F¨\V|pÝ-ŸrÕçžÁ܅ƒ2 žA-çZÒýàfxš=ׂá€öAN(щ+÷\´¼ÅÍò”eÆ* oerJ› ‚$aö‘äâb ‡¢x{—/Œnx8.ÚULÙø)L¤%ͦ¨{²7p\²¥)JMÝ-–ˆâ.ú´â¬<$›ƒ‹©î•+Ê(ûqœ-<¤ê&7Ü;0UˆG°#¦R…¢ˆuÖÉbGʉD i“q„Ü„’Eœ­Œ¦éÅ`-Ò£­°ä¡c‹•jÈVH½p‰Ý«âlñlk‰:âò“¬EÌÅê˜)µ{·ÐEG}pICàPq3ër1úÁ_?i›¸‚z¸ž2t–&,¤|â1²pĔ¨`úXI'EWOº¸Zž²4ž3,Ä5̒&<¦á*¹›‡3~ +sŽÓ2 |ôœíMÇÑöØ¥‹o‹€R‡–™ª¢NÃ<ðt¸«)2jÊ´%âl¡ÞA™›ŽbM8É*LÂbn«N¸«váãfÀ2iÛR˜Å^ô•Ár#ë//ü +_^>ýõs|üòý%'RoÊÝ®¡¯'ŒÚÀ¶;Á́³ÇŒøÓϏOŸ¿†Ç÷¯¿üüXƒÁO#cNê÷2ªH/“Y££ŠÎsƒ>ÊÖҘEÄ_^î\ÝX?R|pÇê>tt˜WNH°Ž=K'ËS–‘êi ø¡øÉpiÆ”yôqµ7Þé¸Yž‡¥ASãïöيªé8ÃçS1‹UžbwËޛû¼ïþVy™•—J¼§Ý _OØÓ;;F.Â@Tyµ Èx(Øñóí°ôª½=O>ù +xVºÇ§ åk‰ÖŽàÈdÔq³kFÆçÕµÈXîpMEvX ÉY¥bµJlÝÏKEdtSqdÚðò¡Äþ&á:ê…e#2²‘­×šf!V´K‘7bÿ{ÉËÁÁÆ +æ´8°ò¤ÁæÆj:#q<µ8mšˆ+?w[LŒV{­pÚÄn›¨µZ²@(›ƒVg»]|4„åTç\íl/@Ðe¶LNŒ–+{Qit1i\¤}³ýlžÄ!b {&WZ/·*¯É©O1…©ýQÏä‰ Î`C–XÕIK·ü„o¯ñɊEm6™ŸiqˆÀë!‰0¤• —¾ˆ»/H»¹‰ÈÈK…¢/­ *´ðêÚ£MÙx2°a‰ˆ85¢žãZCU7g8Æ˯ÜÝFd4âetZ»}ʺˀž¶/öèi&á̧7 •´Â*t¡{WU}c½³†WSö'‰ ž¤H/YQO|ÆdUºð•âaƒ8Ы>ˆƒD¢KT~°8¦¤i:EÃ!í±óžgU Œ.’Â}¶P1lȨÄØB>¬„lÜôî×ǛQ‡Sy2áÐP7ë0ÂÊ 8U*†#ÑÏ2« b³õ>ÇÛÒ¸û-³’¼˜ƒÌj“ÌÚZ3¦çò®ÄèÄÀ³Ÿ6"#6v€XØ֎E)¼„ÑšO¬«DFWAŸŠkrÖ³öÏw‰y´É‚–ÑníÐÓ ÚY lðè +ûg,¼íõÌ柄©ÇŠR¶neõÌÚ%ÃÎHE`híj­q7aV† IYôb1ÈÁƒêÍ}X´ú´ëCÑ}ÃXî°2roÄÒ7ŒUý9^̆ûx^&[ïá}Ð ×6ü¼‘‘­+¢•À)¹èƒn ¸ÂŸŽ¿>ÞÌAu(,~Š^*ñDbn¹¹‰ÈÈÄJ2ZME7y1·0ž5»È¹=Våß1oþd$½á¾üEG%nô1t„Nÿddƒõïi^ÅIP+g'Â¾× uö@èèõí^P˜ ύoè–çZ³fZÓ:ُ[õçóMŠ¬ß¹ŸÏÛU` çÛÅϬ/*ƒÏÊ(SÏLß?ˆƒDëò ÄðhÒ½=¯€1d7™ãÁL ?°9ü=‡N‘1©»Èè&Óy3ˆ–?„ü»÷Ý/üõñfŽ?Éy$6¯i6mÕu1ڨޟpß¡`ƒˆ¼1G¢¯qÂxÊçuÈç«5´ßØO˜ã>çIüù ­œXëml-6„/õôлz¨5õñsP› +(UI½¬#ý¦ÿ·Öv:{KKñŽ5`ÈâóÁ"s<˜Ü3×l(~»Ó´±Œ›UŸ¶9í¼˜ƒLWô"X!VŠÜ”0»˜ †Ü91,<™ƒÌð$9×@[3!à)â|&ÃæÅdòôD[ZSkõc âæ¿×´ÜFdŽ³•š°’tÖ5d…º8 žtåþš~»Èèv+©/β¹fTyhšè¿-°{(0²Qü¾çšäç˜sÈë~ΝÎwŠŒÞ ڋEý8 TlÃcŸUÓMBÞ<×7Ôed:ÃXŒ"b°l™Å àÍÈDê*<˜pי¯NCW¬Ø‰ž„.ºÚý½é0ÿ9£6¼òH÷¤ÀeûlÈ,8oéP}뙳 ¢Ñ‹ÎÀª%쇌ž¬Íǒñ´¨¯=e!28Ym½Îª´îÛ,kjEº'2þè9¿™Òƒë†]žÞx5j³ÁN=÷(p£wꪠ3¨¸6° ø,j¦|\t¸ç-´’:Y“0±ÿjSP™ñw7…± fâ¥ÔX–ð_oF6ÊYÝo¦¹•¾e…IŠ/e5·û²Ø0™ÕïÓ{ôïú`lLJ&¦|ÙƱ°èÝGŠúH6TÍsd¸ oš¡ôäò‘ëüyd`Zyl¯‡—øñ«C}ñï¼ð×Ǜ9ÈÌ<kV‘oºÛܧVËmDF6öԚYñ&“jxµÜnâɁ™–äKÇÂ6N…«Ç«ˆÑ1tý{Üsی”Üóõ¦–@&J¬—Ù¯i¥¥ºƒ$üM¦ùh3èÅêÊ?ˆ ·¼™#0¦7ُ§u’ú5ë~ôø's‘Š>ט†=ó –zŽ9Êâ's©§rfÓÛ6ï-oñX +ÖzÞn#2G`,ï%%iEûlÖì¢R1σy1)û:ØÍÈÄy—¹ý±û©¢šü³Ë…Ý?‘Nz®9ËMbBÝxôÓǑ9Ó½ˆ61ÕÖpáx1þN©…5Û3Êp×»a~#.Åýù£ø(Ñ֖Ký­ÉÅm{ËÙçcGF6fuI_›3­{#ŸE'iõîóçU.]ð ÜÅ9,˜¦òº á˜9ïÆ×ÔøZµ˜3Gxã;¡r$ÏNýøߍo§_.(\ÌÛmvÑÛQÍãþ[͞jþ—š1ǃ¡š‡MO!ªyÛ´ø`éjþÅdl(ù<å¼Á5‚4ßùWíwÃē9ÈôÝkæö&ˆò±!‘?ƒš°`2»¸¼‡˜7\æþ¼Ä¼áæ¿»˜1ǃq1+ÍS{ÈJšŽ!æqŒSdë`ÑÝæ™Ú󸫏 æð†ßÕÅü‹‘<Â+ö~ jy¸¼yAJç+EF¯¤vëZÞðh>Î"¶«"QZþIÈ}÷ï ×òãZ®q«¥*b]Ë¿]uoe1µ¼á1nmn°ÔröIøE׸XtÖöy‰ùg¹«Êü Zîu†ÊÛ¶HãVêÜҋ•kù£k´ü\ÓûxØ}_»ÊFdgÓf2·ÂFd<f6F+ò–ÁÃñj†+‘A<:·ƒÁ†*¥îØ£qN¢ñ÷$²ž2Fcï4²%tí?¿56ÙôÊC£ÚˆËž°Àö{nðaê&ycùN®n 2×Ãx¼À¤šß1jwŒƒé7ç\ 7ׄˆfH«ƒ bﱽؙa¯°ú¶D'=½Œ "XóØδ35Ãݐʄì6"kh¥¶²¯­¬$[žW¨òƒñŒâ~0yn2CÝ.ß0w¤Ï™Ï( B=¯ÒX¯z]2J‚ÃüÇ̗´ÊxXö®$î60zÅÅ;nWå£!(ރ¼ÃîÌeLÒÚ Œ>hßh|Õ:ß1!îñ–‘Oëí`†a†^̸2îIuùØhÕ»ÓÈvfbPªÚ˜˜‡ŽÕÆÎ\ÆèÏdW»¥kñ©²3°Q³kDÈN›…ЮɒwZÿ|æŽøQŸÙåž_Çgû– J _sàìÅSNFՐ;o7ò7©×üM:™Rÿ-Ýd#—†h˜#f“±i4q¬ÒNk#Ą'ÃcÍÀdSñ`Ԇ|)S8“o›ñëídQ;˜kcÐôšì#nÞ®v¤Ú0­6-MM®LG+Ã@m˜i™fÀl{,Dæژ–q†¼®pÂejv¾3°1Fwik!Öd»;¨~ç|:*BÄ¢ÕºÅMRY„¾În!2þh>/RíöH¹“O6\}Ñ«µú£E6jiCÜb a‘YÞ2Ïã;£I¨eÇٚ”ɹ„•ï& _"ƒ›[ñ2ÓÀKj2bb ØcDU7¶ûŒÉ)oš êÉÆÕ?«°ÀLÆ㚶~\}AÌÜÜFdüqj¡tœéHSlͼAÞ×¼ò#2{9U$n`ÒØq~"ê™ñ¾ƒþ%º*!聀£³Ñ£ž,¢È)Ž§ycx9ígVUpž!>ÚeI.]e=ѧ[ÒÕ!ÊU¾¦@qI©æúÇ|–Dl­ßÉjº÷“l"ÿçŸãæ¬7Û/$ß\<¦šˆÉᣯ´®þÿrsï¶øV$]šÜO`°/I¨ºäƒ5ŠW¦ZGSf|Yky!Dêe?’­Š_‘vñÀ œ#ow¾2ðýED•‚G*2ïXF‡?҂þ¥¹0Üê£Ë“ý1Õ²]Þ%[t¤I̵¨îœÃ–•‘ñ íDŠ»…±™Üùþ8™ËY²†:¬ŒÂþ‘È¢Wæ~µÜÆ[FÕùAÐ`¸kÓA¤·¶aýs_× +÷6°03⟨Ùn—ÎçR ×L7þþ8l‹Ä´ÁŒ›&¸×~)ێï±;ãg¯pŒ°sZ;ÕdÚ°jG؈̘'`ò¯úŽ SQh¶ÿ(lÕ_3uõ!aibsܘÈ6:OsuzJw½µrc¸¸^©ogr÷_úñdéÙ³êß;…å•Lë†r(2ŽÊ_;E•6>€Ž¢~yA›B/_³¢ŒT6\ èæ +LýҞ¬VÛr¥cÝ×¾?Næ2†*jaX¢‹©ÕÎ*öU¤mYãå`|?íe;36† 8IFª¸•»Ûˆ lL[X6†c#ÓÁôv2yn¶Z—Lё,Z7G`]Iî3]ÓÄf¢j8ÛÔÖ;V#s&ÛÊ´âŠ{d0+’†5ËՏbÙ Ï"ƒ¯m†3Òì­ò—U²d҄IÕÏjbg.c:Á¨ioÉúx™ä¸ûËì̘»£jƾ2^™«3ËËp=˜üï  “îù¶ŠygÔAáˆÄ¸áÖNˆq,1¼Ô,¼-/:Lƒ*C538æ Ü=«›ˆÌµ1œ0sÀœ3’®?ؓ.0F㱝AÉè´0Èuš¬ª‹ŒG~4¤úœøA³Yñà|›ˆÌµ1é`®¸áé ·pC@u.ºcñ‡ö.Ôði@Å{hÄ{pèûϙT€«vÞãUϾMÞ·kŸ$ÿ½ú¶Coš•,Ê .ÒÎ~mÛÝÕw—»Lð¦zÓ½è:V•W³Þøûãd.c˜êvfZí Öç64íŠ m°3—19á6ZÁD†ë›gáÎ\£mnLàiMëq|b…9|Êúüuf…gٌ„2øPï:ºšª÷ç¿Ñ]~Ž×mÐó3ɆæÒó úu¤û +Tºï_SY—ª~K€cFE“P•5*¹,1¡* O~ZÝ÷ÇÉ\ÆPŸSÛØZ¦öBo™GT±Ë™W檡ªîB‘@¨Êç¤ñ„êFÀçÏG§²t3ïLÖGtk˜7V ;s#kÛv¦-ic:U°wÌ¥Sw6zóGX û„â†N}ðÒ©;s掗¬tºò¾cn¥z3.U“g€IU]m]TºT=ØHþ␪ÓóUºÔò6ÝvÞ£Rž3iå á)c®žm¯ÿ-W‘]Ä*ýÿÉUÎÒh螥?ö‰~»Öë>çkÄìμ‚™+02LT­©EH¾ªY¯´n¤ºØ2í`.c¼ T“(”Êÿ¼•'ËñˆWµ°—½ðv‚Ö1*xεÙd7µ!j¯á֥̐¸f÷Š ’¯—ÜLCÌù{.¦` +’ÅWîÈ>Dá=¡r¯ƒ/Œ`‹øë&J#ÃäÊG1lD6ò¬Û™ä^àØ]lë}çŒ‘¹ª)̺ŽÚT}JÕ-DqÀ½cã30¬MNp[É>]Ü÷j¤Ìþ‘TQm&5\s<Õ'¸ô­bŸËy†3"Ì»k\­Ø£ˆ~üÁaç^ÿ~Ø£f8›ï/%uÑf½ï\NRÎüÒÎ ­¬¿Õc”k@W ¡$šR¨ÃŸÖ¡>îÔ3˜±Jo5€J”£'A-ûaL2üú–ÇÍÿv¼hkª;Óõ°f¯ÕWýC«ø¢;] ™=ý±ôеö£Byà[ð`mۓ —k–²GˆÐæÉ㊠ñ½hg¾¨ Æ—Bâg󕰴u‰Û‚$Õu‹÷Ù]N“T™q Ï!É9m‹ðt*aPV;×6†AȱŒ@¶  +?Ö¶í‹môk)`Vf…JºÖvt™kæærP‘RTðÒ±ðŒ¶ínX<üVh…àÊ£À £i+¨kÙ×iFNù°–|ªùñ*ž× W»£RK “›ƒ™»’­-罍ßÓÑYI ûªIp³KæÖí¦Ò ¸¢ñ‡0:ÔZt|·?yDÚ ¹ºX•)»‰7ò¶Ð÷‘XE2A ‡I¬„*Ah¥x§öÏM–€ælš-vœH:¶ë´‚C²F§ÀÖoV˜¯@†¡ÌßL0(+JòÏÿ:J5eÿ¥ê_ûªØWÅþRûîöúX¢$n#.yoM ù¡DÙDN2˜P +Ûk&ã€D€RTp[®Î8Å©,dñe‘QJ*g ÜrƒX¨90ßß3jÕã=žÎ^ڕ[‰{û}í4ÇÆ× ,M…•× òGe.Êu喢Áü¿˜Ú–s(Všoµ)¹5ÿ©j¼”’x±>C œEb Ù õu*)ÖÌÉ¢TH@/ V6Éh™Zä`¥”Uá˘9AÄØ¢f‡<\†'FpÆBPj*SMwÈY9KìZõJ:W' qý"ºœ¾²\ ™ ¯B—ÒÔ(8üL¹9zÒ+¿_ùý»æ÷ƒãÀÒÐ yNÓù˜á$žaä#>\Ëoâ/ŽŽ„zª]Ç'y3ój\<~0™>>ÿôÉçíO:ÓZÚ"o0 ¡‚´8ðU-_*v½ÝàÍÀó5IçЧW\Öu3ÿWìÚäõëX€s³ó]_fÜì É_´ìwqóûwrôS2´RBÇå5á¿qwrr5vKªÔåM#xÅä­XîåzƒÖ  ±…äÜ0¿(vëùÁ®*H<=Ï=þøáÁt>cZD}Xþ¦¿ ûw¼ÄOâQ¥ ÄG¤«'¬¥j>S֔H¦d40²´e7ñ•cnlÃíwH°å·èÍ+ƾV£©{„ 7”BÖc 4~m!ÈܬE~£yqAV$ cv*dkà=ôM.]3Ö2o +'õê–C¥¥Ù«I¿ Ícm:Ç%!ÙIÚ3Äφ%)¬B©5‘¥ì‹}»^®’mr¨˜4‡†Âøé‚a©ä"PÄÕbP–¨Ød® ²LÚ/ùjz€êÞ˜‡´Ê™¹Ø“kéi¶¢¼U¾«çV0¦×Õ.©äò^FeŸ5Sƒ‚(ŠI0÷öÉJzægi›‹Œ9^NR¬ˆV<ɪ‰ýêǘˆˆuiÅî)dÆàY8«Ê³ÕÂ3’°BEGž×0»Á=j#qáƽW —lx¼‰Ó9×tz¿¸è. ZÒ¤óCe”{ñ»Ž ŽV|ôÙ"¨Ú3+šM{îî„]B%EÂ$¡œ¤å0»‰rý¶o 1MS“&ÚNjíK¥t.éT¼JÝ#Iƒ)õ¥É‰mõjæê +ðY“ûæ—C¸w_1‘ÅáV!`íÍ׬yÆo/ëÒTÇõn> o¬¼µ÷¡ª¶K±p£¼ÔÅæ´r.Út©‘òø“b㚆ÍúS—ƒš˜Ë²£-™’“Ùú‡Nœ (|~Ï}*ê¥M]xänØ5”ô:€C*Ez¼#R]îØÒDÄK’ÒzÍ “YA”ÂQäŽóޏá |^qýÖqM¾YT«bÙE”{ªýÈAƒ¥ÿýç<Ľ%µHËs{ˆ;ilT…¸Ã4'e ‘1døqBE›‹ç‹úú‰“sfL£ŸMs'Æüu Ù\ ÚÛXq´A-[8ZÔn¼Š}ÖåG‚jÑHšÞ'þ8qöXhk3y}ƒ)º˜á5 ˞>’''¹µ…n-ËYý<.1ê¸<^è«2øuÜþþ»;þkk©¾ ùr«‡3Á=]ž=üSsH°î™¥ÊcÆÅ{.Qž¶¯ÃZTÍ{}yí8ÚkŸû„†ý\«[æs›d…p;CôӀӬ³N2Œ‰¥­BHzü3›HcàßRL5ÅnϽDÚÔ`ªµLD-F·!;PJó °fóڎ™.;-rl,+æÁ`Ë°ÅÕº|ß}ë”zü–Ù­Ôɺ•C÷Ö·ÅZˆ´©ýòÞ¯}݁sï@„~çH ÅG܃žÛ‘š%øÙ÷©s·Ɨ &Ò>­c´½œÒX¿‘:oozŽUÅ52cƒëVªhÊԔB–-'ꊓ“pÀbuÿLÕ¡j¢wo&0쮈oŠý{weõjÑîvèCb<Î÷Îú÷WÞ¿òþÿÊûg¾:±ü²Í«7å‡Oî:P@7‰ª‡{²¶nيϣHÔ&£!µÚ¤OZ‹+Éà¶ì]†ÆÆvévZ츻 «ºîk5ÿ;=*֖¶ëì¸Îå,âkK‹ú’ZÚtøÆ5Ÿlj@xPÎ%‘Êÿc¿Z’+¹qà¾O¡(H€ß­^MÌ)žèEÏÆ÷_™_±ÞS;Ôm…m¹k#U>V‘ >‰„â¹áž!–Çvf•m‡ã ÿbýR­¢ÝÊJ\‹NbU/@®øEšðVŠ•ä²já—OËîýu/å盃×/o½Ý[ȯ­n²¥kUŸr{Å0¹µAL¬‰ì™;¹n.`­¢Æ[8®¦î"w`,t™ÓY×薽sªóVb­E9õš75ýٛC¹­te¥RاŒtª·Þ1Yʜ, V0Â×`xêµk5'1ø¢ÐMÃKÙêT(Ûýx9$¼rÜ,Þ®+×ÐÝؽ[ŽæßÁ ³õ§ø +üûñ‘‡úÌ@¡Ni¤“šývNã­â·ÞùÆëܚmrÆ[ŽDœ§:é&Sà³Í¢[acZPÜI<1ñ,Iã¦î˜óʀ.AV(Rýšnï.†Ç?y”“–;),ß%…ë&…ÛŸ“Âe—Âå$…ËûIáòRø¯TÂyþùð£§ý{πWâÿ[ÿžñu +»qžÈÒvš–,âDìÛ>9¦$q8$ï°G e¾uJ€YâÙ®ìBÄí”9¾=ªµÎé[•v ´Å©à0÷´VŸWÙufÃè}b£ŽÛ¦éöt?8þ°ŽØ§ÍÝŪ§``° b¨ýcJlß@‰ý(±¿•ÛוÀ¸#Äq"D=¢¾NˆùDˆÙ q,Bt;ç‰ëFˆò!’1F0b °QâøNœïʼngRÔ;R¬'RÌ;+æ3-æ÷æE}+/Ö/–ÇÓ)=îõÀ‡OþÏWú_éÿ éÿÈþԄ%Ûc7ė™3ìpf*»”‚£¤ÐJ“²z (ZdC›îÅÌê#ß´µ]/ò¢Ö•cu[ív“çá˜8^4{oM9†´Ö ê dÖ +_´â¶,úŒ×q-ǚì0ÆÙ9:³]ÓÊ8óê­yEá1ÑìQãÙïÇ±T*|ٜ´`ehˆ”ʬ'Á 2ÐR¼¸l·Íìÿ¥WåÎáW„_×q%Ùup:ZYë¸È +4â,xíYÜTP::GFœ¡$3Î#yoòŽÓ‡2ÐÞJº·Agо¦?ñkÅj™¾Í£=ûe:9cfo¡Ã¬iGµ„/ˆíú3"×@Ò÷™Ô§Ö7l‡úÙµ-œÊ  ~~q“æÍÁå †Üþï?[}¬þû¿+{ +Á†¬Þ…Œš“å©8U-UМ¬2ãÐý6M¼Ö]ƒ•`¹Ùi˜ˆË"u%RdCތܝ.§oGW4•…¸k¨ªX•á‘ãÁÝÃ7bªKnOµ”I.Õ¤†aƒbM^ ãÒ Ób„lŠk9Ä~Ò%»`kÉôˆ Û ©ÆÒ¸uO=qµ¸ïcG¼»¸Ôá*þqUý°¦ä]Éñ.÷I¾Áps‡o(ü(w®õžYžª‹y ZaGk Õù¦C«,ù‚dx.CœKÅ[ñ¯Ë_Å¬1MýÊCäxækՄÿZé\ÑJ0ìV¶÷ŒìŸÜ.ƐÙyïÑPdċÃû…ÛãmÆÒÓA…bº¯Ìr@ۑ–ôé6N¬M¯Pk +öÜgLjs”j2ÖäÒ1õÀË]êZ‘À‡ÓtD¤Ðpi"ú 3£`ê>æäÐЯÕi37Úþ묻ú@{UŽH:„­‹ÔNêÎlèî Íø­‘Î«íµžG¾åhf6/"4\¼W;›Žy;ƒ|Zö•¨Wåˆfig™är'k$l[±VÙwª«#L8á‡Íç*dQòdƒGažÈšl*,K¾†ép 6–Š“™ ¥Ú©á:¡=»pf´ëTïÍó³Ó•SÙL³÷< ·ÑuG¬Noƒ"D*ÿõº‹ã4fÔÙä[¥øÀéúÅg¶Ôu!z¶Ê‚·ÓÔõƒë°Úçˆ[®¹RvØê/JŸ›„Yà…ðY ]ØÚ¶8]NÖ4½ê³«º(-”Lno!(Z0s; ´‹ßZÁ8#ñÒ—FøwŠ’0†_“L²R!{ Žf » XËdö€²`§uÄ´žX+Щž‰ôª¸·VÜç«æ®šûŽšÛ²fµ<ÓMvù²†oê6<èæuˤ1mbë–mû/Åz;p‡š1\ +yšh9ð Ïл7JŸÛÎÎö_’]÷°rXœ1æBàqûó.I¾'&L`{á0ŠðåÓau¬¯KÙæÙûk¿[]®z£«Y±/šÀM‹Bî™B–ýñ#*dyóÈsôƒôõ‘§¤bMe@€uÄ÷ÖlÊ!áÍÔ-É#WåÖC5dqcØÖjcg-J ëPo·K±ÙÃCi§vËkœ1Ž3`@]À¬C²ü° T‹ VK½Àð]-@ŅN²ÎŽp²"·<.cèjêH±”7”ÒÖã)m¦g%5FN._Ü,u Âê5¤KJ5 /¢`&> endobj 97 0 obj <>stream +8;Z\799Ol\&9SlYiJqBd?#Whc(Ko#:\H]3BE)BF,Y?(K$h)ZeX02^]oSJQC@[buY4_)F@_/c7B;!XC.6XK,PmA9;CI`La +5iMH;e5+:kqC"ImBP%@`bg=S*rr3sB1NU1?d/W#&e6=iB9f"h*0H0bc;Y=T\&!tG_ +E%m5#C94[>e-AZM+*tL4[<#]s8G^D\BJ&^6_a"7<-/YbKFY,0_T$bjQl;-in$bqHc +NColVcKe.?5))^XqlCc%#D`-;N`M;%cpM4_KY:MK#@F1,a+tEJJ:@g9mPL[S%C1WS +9.2)'a`ZeBaA^27Wm:CjE->9]8h7rAd'h<+;OUI:$GjQXbK>ZAkH![G3YKL)%.cOJ +4O7\IG1B`eo,p/>MmitY4!>/R@"ne(-(OZGN +ERfk#LYTF!/!GA10qOld4Tk/>H`u]2Lb^g2Bc8"QVQpdP9dXiF7>-^;GH[5:GN7]V +9`ZFpU,,61rq=RXo[S[I>de%cRg2E>n<(u]0S%>ON*K[ZR0/bo6`V@s,Ep_V*[L?QG,phP9g9WP@(3CXmc6GQ'bI$Qso"+_&VXl2FhCiO:jE9e/ +a%-/^qg(t#11K-[_.pJuf,QthRO#d=j5ZninM^G,[/GI~> endstream endobj 96 0 obj <> endobj 67 0 obj [/Separation/Black/DeviceCMYK<>] endobj 140 0 obj <> endobj 141 0 obj <> endobj 68 0 obj <> endobj 69 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 169 0 obj <> endobj 170 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +1.4578578 0 0 -1.4578578 574.2424927 384.8018799 cm +BX /Sh0 sh EX Q + endstream endobj 171 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 174 0 obj <> endobj 168 0 obj <> endobj 175 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 570.8743896 384.6946106 cm +BX /Sh0 sh EX Q + endstream endobj 176 0 obj <> endobj 167 0 obj <> endobj 177 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +31.4974937 0 0 -31.4974937 479.209259 374.9256897 cm +BX /Sh0 sh EX Q + endstream endobj 178 0 obj <> endobj 166 0 obj <> endobj 179 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +32.8737183 0 0 -32.8737183 484.9260864 374.6470642 cm +BX /Sh0 sh EX Q + endstream endobj 180 0 obj <> endobj 165 0 obj <> endobj 181 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +14.5059566 0 0 -14.5059566 548.8777466 374.4988098 cm +BX /Sh0 sh EX Q + endstream endobj 182 0 obj <> endobj 164 0 obj <> endobj 183 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +22.344265 0 0 -22.344265 523.3276978 374.4988098 cm +BX /Sh0 sh EX Q + endstream endobj 184 0 obj <> endobj 163 0 obj <> endobj 185 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +28.7369194 0 0 -28.7369194 491.5461731 374.3908386 cm +BX /Sh0 sh EX Q + endstream endobj 186 0 obj <> endobj 162 0 obj <> endobj 187 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.7787738 0 0 -3.7787738 566.690918 384.9187927 cm +BX /Sh0 sh EX Q + endstream endobj 188 0 obj <> endobj 161 0 obj <> endobj 189 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 580.8320923 374.210968 cm +BX /Sh0 sh EX Q + endstream endobj 190 0 obj <> endobj 160 0 obj <> endobj 191 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 577.7244873 374.2381287 cm +BX /Sh0 sh EX Q + endstream endobj 192 0 obj <> endobj 159 0 obj <> endobj 193 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.9013809 0 0 -0.9013809 576.2424316 374.8041687 cm +BX /Sh0 sh EX Q + endstream endobj 194 0 obj <> endobj 158 0 obj <> endobj 195 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8369412 0 0 -2.8369412 572.9363403 373.570282 cm +BX /Sh0 sh EX Q + endstream endobj 196 0 obj <> endobj 157 0 obj <> endobj 197 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 569.8287354 374.2381287 cm +BX /Sh0 sh EX Q + endstream endobj 198 0 obj <> endobj 156 0 obj <> endobj 199 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.2857869 0 0 -2.2857869 566.9191284 374.6765747 cm +BX /Sh0 sh EX Q + endstream endobj 200 0 obj <> endobj 155 0 obj <> endobj 201 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.8279291 0 0 -0.8279291 582.5550537 380.0325623 cm +BX /Sh0 sh EX Q + endstream endobj 202 0 obj <> endobj 154 0 obj <> endobj 203 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7065377 0 0 -2.7065377 579.3574829 379.4421387 cm +BX /Sh0 sh EX Q + endstream endobj 204 0 obj <> endobj 153 0 obj <> endobj 205 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +31.2286072 0 0 -31.2286072 487.5593262 374.1472473 cm +BX /Sh0 sh EX Q + endstream endobj 206 0 obj <> endobj 152 0 obj <> endobj 207 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +1.973617 0 0 -1.973617 577.3394165 379.4664917 cm +BX /Sh0 sh EX Q + endstream endobj 208 0 obj <> endobj 151 0 obj <> endobj 209 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.8015461 0 0 -2.8015461 574.0306396 379.4108887 cm +BX /Sh0 sh EX Q + endstream endobj 210 0 obj <> endobj 150 0 obj <> endobj 211 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 570.8277588 379.4393616 cm +BX /Sh0 sh EX Q + endstream endobj 212 0 obj <> endobj 149 0 obj <> endobj 213 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.5208943 0 0 -3.5208943 566.9191284 379.9049377 cm +BX /Sh0 sh EX Q + endstream endobj 214 0 obj <> endobj 148 0 obj <> endobj 215 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 589.7988281 384.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 216 0 obj <> endobj 147 0 obj <> endobj 217 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.4350855 0 0 -2.4350855 587.3017578 384.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 218 0 obj <> endobj 146 0 obj <> endobj 219 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +0.9013809 0 0 -0.9013809 586.1159058 385.2606812 cm +BX /Sh0 sh EX Q + endstream endobj 220 0 obj <> endobj 145 0 obj <> endobj 221 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.1624177 0 0 -3.1624177 582.6931763 384.6661377 cm +BX /Sh0 sh EX Q + endstream endobj 222 0 obj <> endobj 144 0 obj <> endobj 223 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +2.7962234 0 0 -2.7962234 579.8527832 384.6674805 cm +BX /Sh0 sh EX Q + endstream endobj 224 0 obj <> endobj 143 0 obj <> endobj 225 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +3.2928212 0 0 -3.2928212 576.3486938 385.1330566 cm +BX /Sh0 sh EX Q + endstream endobj 226 0 obj <> endobj 142 0 obj <> endobj 227 0 obj <>/Shading<>>>/Subtype/Form>>stream +q +0 g +/GS0 gs +32.4982376 0 0 -32.4982376 482.127594 376.0359802 cm +BX /Sh0 sh EX Q + endstream endobj 228 0 obj <> endobj 58 0 obj <>stream +H‰ìWˎÉ ¼÷WÔL)™É|]W|0 Ã؃? ±¶Ï,°«ƒß$³ºª%Æbwàƒ @“Ñ•& 2?üíãöá¯Óöß>n·´Ù¿=Õíß·þ1mÿúl?æ"{c«³îyl¿þtûç1™sÙĐl­Ê.­´ME1Ut»¿ÙԷۋä]†¯kø2Ú.uâ‡t?{,û„cÿ~Ü®wÌÏ*ïpp¿ܓìih}‡ƒÇõàÜö¤ïr𼌧¤ó?X®ÇöºÏVÿøcÓ~=XgßgiïÁé|9¸æ¼ÙßáÜr=Wû>jféõàŽ K_e«"Ľ}—$þË ®Û¶³¥î¥Ýå]÷1Ä-ˆñ×Møâãie +S~„)>BÚïŸqìöùþóMó>,0®å ¤k½o/E©®õ¿`yhÿP'·—G)øÇöó·¤qbç<ʦuAý8‚2m ãy+pƲWüqp¿áüš|)÷±9HœäCÌ͘KðcIcísí¬€i­IkŸn¿¾­!¶Ê¶ã4¢ëxH`ûe >­%6äž6 IÕÜzž #²›òõÕÏ_ —aw#ÑÙ·ö#¸Š¿¹ç_ÊÞF6†{R`ïò4–f´Þ“Ø]ÅÝVº<³!¥m éÑÜV‘ÛÚ9möh>[m'n˜³¿&ç +Û +ü¥m`öùØ΢ý>zÁ„D:×}|N„U<Öðӓ³*“+gœË2º“yÝÁÑÝàrÒÀ™ˆLˆoeOS×*Á é½V·XBŽé\û2æXl§µ(¨XYÕ=’>„1ⶾ1+cG¤Zî%|Vc‰ ¹§ pœ¢³ó¹ XzXæÈnÁCÖW??†=SNíy¢<6$«ÌKšCRªyWí)ÅΔ²À êoîäXÀC`ΏXâl;í÷rlˆÃ"żë‹R$å€Êã* ÜÛe–¢êwì\Qòfaot§<ºÜ5®mÅm€™HñcdK¥pà€Üøµ';®J>¡!âs ·]³}ML?æY¡A“Ú刷²PÜ¡íyæí|=l‰Rb¹ŠÞÂé–Üâvzªó¶º·”ké¡!¹o±:>ÿ)R}¥aÜÄeº»uvݕðWL 8@?%YkQ–¼:°±”üF"þb;·NÙm80ô||C<‹és‚T˜éZ\ü8z ×@ÐÃZL~È ¢i0)5üÆ Τcn[³åšAüa-P/"•! ž:2Z©ôÓ×^=I«ý˜šý)µœøs³K4n7å„fï>7¼øiZŒª+[.u¡;5Ӈ¼žï0¸¨¨®²D-ºƒ§£Qõý ò°;dÒݑY21g}uulsÐɨùEiŠtý®ÖˆZ÷Ž|æcÆd›9ððn5Yu÷Š^’5_D#Ð-ß<ã‡]°»÷›Ï±`ÅĶVðï7‡ë¸¾Ã´'”Ž…ŠÑ?cQâ\ôŸ¦¦µ"}Åh”µôu"¸r®\ûè ‰Ì機Ù.µA҉ÖH}\Í~çø~Cêè „tŠE‡0ú{u›ä€Ææuóâ‰îRi7(áZHWc—ÉÉǺ—!F#"øÎŽ „ÔFŒh9‚Ús(È Ê0X™€ðC!à®F™ÃŠN43÷j‘ÑÝXR,¤bÒ)¨®˜Ÿäëp¡ BM€.ÂSÆù^mWÞH»øáæ.VÜ¥™fçc +¼e i !f7הy²•tZ÷”&tÏ3u¿úIšŠ´êUdԘ}Fh&Bg`㪠ICr›Z½/±ž l::29‰–(,´¾Ãÿ¤Uäd´UQÞ ý]03%£ð–çz—2Uª®zÏ/ÁçÐ*δtñšÔ8dÍgÅ/ŒKöN„­c{ñÒLFAOR]}Iß¼€„œ–¸êº†½@ÕCïŒLÜDÖ6|‡”zÙŸ ¬#„âvøðoDšÙI]>vpàÊxÀåOl3úvõî3-$UvúÎÍìüÞÌþOͬ\»Y9µ³ú[ÛY½´³úÔÎêoogóïÜÎÎïíìÿ[;+—~V¾ÑЊ€VÙs5}•9\T”Í@;˜ýª;—-G|óžQlFZD*}"™ú´Èu !ƲlŽe}ˆ¶—%ɐEruÊ­ŒXãc²m:qwgzé4ÚºRx«EîÏ2~5-ùL/9i{g. ϋ[K eðNx̹*:(cAtîÞú±R4ˬì6Zӌ”7ŠXH ¸ˆ¬oá1ø¦”íê¿çj¡—ÐD½“§N±Y{Ê¿T±ÆÄ£rŒ/`Gb;™ÃOOÇTxIà6U#ÒåáS-õ»=uÜûlû˜Û‡.húÓ×"ñîi®Sş4\ÂlÇ~\sú‚i­9Z”,ß=>D¾y–¦IiŠçŠ¯ð,¢³|…»ïîî‹Rh6ãdQ¼ÜÆñÕ_ —UÏÁ«Ý„PQØÌY—’ÞíDÚ£âuXfójÒ©PHÞXÀ'qH}w‚gÛGõØ.9¡åS,YÕ¼›ªÜë-^ ¼Ð^<ˆ®sÝÚìå|˜ÕÉ¿Ö>Žç-кZO†Gñ¾2¹CóU÷zàj¢É·õQdÈ[Ѳ _£®žü¸ R«Ñ*/üÀÂÀR¯ìOÇ;‘ËÓ.Ó%fz9¿¯xûÅbü@Úg”jÇ)HfáiÍ+›ÇL×1 k3|¶˜jäìÔÑ"Å8ħm±ëœZcD¯˜òñ Îa1ÜܒÛÕu—ýš£×e{ ÀÓr…& œðÿÊ×IÍ1dLčÕò̌£NŠ7-'¢.ãZšoÓ{’aõٜì.3'iÌtyžîÜð§#M˟sNwß0¡c¿5ö¶w,øzóî' ,…#]€T–¦–6,ÈQœpChA| 桕¬c»òòYIð*h=òw}þ=õ¹u6Ãz¢£8ù5«Åþ/¶K±®ÌÇ÷›ÆӕHÑÃq\`(Ð Ï5¼ ÄÚâI:©5,.èÀm·lûçºÆÞðÌ@¸½=dG ‘NÙӉï%>›hcH1{â÷vp¿…Æ:Ô]‹±Ž'£éhî.f¨AO]6© Bº^oè`µ?#(¡»ãNm;Q²‹i§¤ÀRÆÍ&L–•y=0¯QêH‰®­Pé|L>¢„c¬þ$óÁ%ӂ…Lõ¨R.6ՂÛËؐ—:„_¦÷’ÂÀÎUéÒb]«…«?#ÆEÜm:®ÐûÓ¤ŽÒ +Q‡!ž}Þ´tÓÑ<õÚ<ùl€í~¤«KA üõ'~d%B#©Vé˜Ã¥¤å§:Ñlºß†Xy^_Ťj­<Z&>p›+S§}‰î·Ç©ñ5,²•{yÁ%n˜Ø®òíšê•®Ý$/ßÕå‘)®yô®Ééø†LÔ©î ¦—(à„¤•U£æ ÜÍ%v}õ4⟺t²X_ã[¿-âR¨þk˜VÎÇ·p6f–ÝÖ4?mú_ö«$GŽÞýŠþ@ dr`@éâÿœ‘¬¥gdÈÆØ°a]fÍâ–Kd$k +$¿[ʆÒ`Þ£[’¯*ŠwB¿Î3Ú2ò‰«Š”JWå)5L•dé";.IÈÒ·—¿fú¹¿¼Êՙ^êœI®4äD4zÍbL7B£Å”[²³Hg¹qÌݬ:#Šèœ +¿mx”=Āí4Ô†·ÈïR†šåðIÛ37 ô;-U@ٍžêB"Ҋ&ìY¶G;”""«Ë–v UÝ~LúΌÁÊÂÕ9‰ 4ÓK$A¶CUCßI¦Êû0X ÉòvΆ\tiÉiµ7N« 梁Ò.N¾W?(øŽ`µò{ûe0õÌ+ÆxÕlëœY{ìA(AY–JgŠ4l +åp«Ý3Ò°{(jÎm;´º†;òJ«jB‚W}-ÃÁ«';b­Sf0ç¢à8yÕñ-Ã5\¯zË.ÎØ qêW°"Ø(ø†ªñœ|hÉjMر­É!ç eC½úS½Ñ¼ü(萍DÝêóqþú·«žê¤#Â:=1ŒVll€T ‡¦úR¸tWcñ:D}§û ÷yé¾®y*ŽËy|÷Tï—J–Bšµb¦ ƒyb†ÀUÖ e»Ù™si‘Ûlu%°ï?ù:}Åöže ÷¼r@”¥úÐù#銊XÀÜPÅjî< žgýBÌöˆoÜ*ðWJTÉ«šÂåtD†žòëÉ@¼L—38›¶ÂX wKn"d0‹OÌ!o²Ò/­®Fl¨ÝQØ(̲| +ÄšNál*°=îf|MÁæÅ-{)^~ú-ÍÅi;ràŽÈ\ó +qwH|±zAŠvU&¼®ÏqÎ ;Ç3Ôh( Éo1•b¬ َ5ƒkZ`Qžõ˜Û¶z¯wíNGØÌÕ®—øÚ^W7ì y7µŽ2óX{=â8Ãq’~ø†ÏcÂ$ÏAb±_ EÂn³],:š’2ªèPC_mes=äÝØ; +pCı D‚mÁð9¤Ö)àùÏ\®'ħDUá¬.±WîÛ½1±‹œÔ¹Á»›…Ы»QÊG´€Ü€êsª!±*€î•¥F{Ä9ÌâkÚÚû’EôpڋRØ¢ >řâۉ¹ÑªÜÚ%hm#^ҔäÀ,Q!øµÛÔlWz/ÍQqáî]9*Ž6ÙR¨GRzqšk× G-º>0Ÿ_™ÎÙxˆË6ˏëU«uü0’êeoˆ”ü!ƒï8beÀ>D‚¥ò•Me¨E‘ÑíZÿNÜsS8I£$%8›Ÿn̞;²œ¬"ú›|}“4ŠˆàPÙMÅB‡*¾h(˜1æ#Ǻ)˜Ïê]ü@)¼­ QÊꑠ‡O¤š1Ëy•Eã§>fÞ N±Œ)ñ/w|—„j—Ù(¢Á£æS1UEˆTMÊî.¡hí2‘v>o+!Ǧ¦) ک̺1;‹æOÊÇÑ{Œ]ôS¤ +)b•AÕOáa ñ.79&#]½×ö¸Gè+» d•ë…Ÿþ·øhŸf]ƒš äq5qÜ +‘‡èU‰‹îõZ+kåke +x†vTn°ßCá£Æ@‚¤Aú#ë*s´´è—˜œAð'vŒÆ3÷xTÉ · r{®ÊK­ã@h4!QžDµ;Þo[¢w³X“st~=ß¹Pi.|ןKQ1oÙr O¡‘0TÂP +/žS=ËåhE/ɐMEVAóÁ¡ï@ÿ<å<„Ì8ùÜÞ7à­jÙ0›zë=‰4<±¦ßãgWôg»¢9¼Rúnÿnj'7µ7µ7µw‚s.DË@Q;Mì®·qDç%ØK»2™•CÔ((ñ¡$qEÊÍEîҞøžQœ×qšÍ,/è)"cl®|ƒÊØYLP}ކEÉ"˜QÕ©Cô"b¬ÈLJº½›ny:C–X§W>¸Ó£LþÀ^o-¨ã‹gFÌ]cE²Ë jÓ¬ŒW|ïê÷¤K®¤3Fò5Vš`ñˆi@™ ‚YFêãXB!Dë1+ɈõÌPèmmýmC'HSJU”…"Ex– 6¼ÂæžۋBýZzë EÑ«¢´æ_åK\Â~„ê7d%.¼ñFáoÜD¾¢ßó'ý-Ñ¥Í qæôD„ضeï®Í©»øö*&3”‰Õêf¥¡çg¯ÂS}©Q(ЬDy˜3#a@tˆˆÉ·©Ígßèë/bb~fì~´z7{Ø +¿í3‹³ÿåRGÿ:Ô=ñPƒøT(#1ú$ú9Ï9Ñ Òó}óOçÆòn‚3%ÕÍÐIû´!:H‡yge—7«RŠq#]„L‹Oƒ5¸ÇÑE`wʑvÉ8Šâ¶SÆϟõ5ƒr-¬YñŽÇ-ã~ûÕç%'kÅ Pﯿ ÏjîàçÏFXZÞð3Ohñ}̃€®Ë7ÆZ°1ß麮x=!‘&®WÐçµÃýpæŕµzïå” ê(ìûN_"ÞR„Q¢©Q(wó–I²²†¿V~g¿Z’,ÉmØ~NQ¨ ý?çñƋîûoM¤2ó½²]n;f³éN”^¦(ŠÀ%`:5ÐT™E¬ç‘ÜÇroF³jÿ@¨lIUJ#)ÓcÏxžÍUêWùyT•e™v¬óïxƆh¡ÂïWjŸ‰h…ÛÉÖ^Þi¨øsûr¥‡ãJO<îªþÌ({v”( ö~÷G r8cª·Xî?Ó7ŒÎÓ“iÃLvõ.pñѾ@óOð©+ÀAhQ;FF%Laqj¹µrn0Võ_þâž÷¿þ¢Ê]Føó*ìMwp+üM»­c4º^¿pþõ•íõ•õµCþ‚~q…¨/<ñRø½ZêË伐ª]Ñs^Õ©½8çC–S Ûä…q­ü®Q¢ð™Ž*-7Á2‡÷kt×]ÿUyÒM“ÞJ D3Úw ÌY/ߍèh#l:­èǶÿ5•oߘ/Ão¿àfaûð`Q>Qñ¾b¢q)ƒK†nҌ‚6|ž`øi9’Ž[(ÿÒtڛ-oèþB“-y]&ߑ’}ápô2cÏT¼)Uïh¿ò QýÅÎhÊCþ:o4%U “cj/…-óÙf‰aW'À\o6׌f*HdkÁȉÿ® +ê1Áý ¬ºW™kØÅç)[ŸOœØ52hÿ3>$O“ÃÜY4™W†¬ÝŽÁW­ y˜ +òÿ”oÃiV9£®ÏjB fhD媻²_~ÊUV¾V([ôisv…ømĨ+ms¤ T»pÕgTÿi|½Jcç…)±•iµõçM‚.0åmw†™·¤gêY+Žh–?t.ãÆRÎ| +k°ÜãBõE +um'[´g•7yžáÑ2•È¾¦ßºž½µ—æ;-Š+0R)FؾåÐ8k3ý0g¤­}Sú*KiÌÍ8w˺(†˜¼¤ºŠgö ¯ )uôUÓtܧeâëL'5öÈύ/1ãÊv˜;ÖìÒNN8g¯++þŠÝ¿wòâ›9Nñ’“¿%c6ç.–‰Åà_ŒjøT ·tÑª€ð엦€¼×øŸRáE^}§XUñfD÷–bŒ<3jzÀýId« e÷Ša.­ŠPjFýeÎhsÇ3‹j²œ‹J`ñ‡vÙ©Ö[¬™ÈË_jvz>׍uâs&&›Ÿk-žå[ñ3Â0쭲ߠŒé‰¢™‘¨$H²øύ밒‹á Úc²WÒtg»a,jo06w¨ÍA`gç¤Ø])v˜( ÚÝ51v¸G»¦×1몁£”Ìä•õ+•’ÜËPy±!܁uƒý0Gá(ô{ly ô¾qÖsv +«Ç†¼CuTK¢Ï$*øy,Ö$ìʈRWqI €xˆ¬v䪲ˆ¤ÏòqÏð+åe=jüåÏ]î”pÊp—ŽN@AùfëG»NúÊîˆ'-ôܕî¿ÚrŽÍ¾ŒºâékC×Î)PP#x«8%Ĕ„Œ´.¬œG¿Oƒ³úPb4øßuèíÅ¡·¿ú÷z{8ô“Æ× +Ÿ5•É{+Ã]7i>D=§i#*Û¬3€Ló™A¤4}싕|ûqÏAÔ<½W 2”‹2Og2{Kw44XúÝ-—éŸþPÜõ)³hvN®¼Ô퀞eŚš¹R]Tv։ß%ûëhƒÝÐíWY>Ú rr%G­rkþjÊj­Ê§a%¢Sƒ€ÜªL,ÖtD\ç‘ÙçÕ.«²f[a$HÝìÚãj¡õ bˆšïÐ*&yø LÍф·,ss?Qü:9_Pl¡_>‘·ä övbçhB´#:Ëgpž;­u•Ð¢²¸õyRsߌDÚ a³h˜©TY’šE„¥˜¢ä¿»Öü½OÌ–±«_cWÿ#Œ]ý1võ/R¼s8³ÿÏ2î€2ÞÕƳÍFóÆØw9çIÒu& ¥ÔËæÐ1r°]+œc–`AqN]m§È°†—%¨p혉†ñààÄ7[yƒ•†ò@ë“4\´ʆZ’E±¾&‡‰6˧?Ñé—ŠýÒõøê„rW§ù—úÓ[¡œ¦Iq®¼ÊTQ‡«”’׎«œš&0•FÌžWÉ5 ·\¦ìßÕS3ÙÎç)\‚?«šl‹K Äüõ]“Üó}N„Oñ rRãdô‡&G¥tƒC"/¸YØ~¯å’•Po<·`Áñ–T`Òe;JM€á§åH7¨vÔ³+‰èË'(˜2ÜyR¾V ¤d«Ò¸j!ˆ0-=SñvË9ƒƒ6ï\™îC»üÀçØÍãyî ó*6ÅÚtmç*ù: çrVí.Ӌ•½Í¡?y ٗŽS(ÇûMS¡e ÓTæ?›ò1£̕–k……LÞv¾–[f—·äúUöÚb2Ñ»Õ*²|øQGN͈“:¼›?£²³S*h÷â*œЍrZ§LxÏʈ’ÔÍí‘Õ›\Uc~¸eø½,0 Xõ|íädy8÷Hu‘à0I…Â-dÓ 9HÍDŒ¡ë*Ô%4 „dYíèJ¥„ ՔA´ +¬á-,:>{Ϭ>/†‡Åi !gh²˜{À¢Z¶Ý3ëÂDßTÞ*Ás3ÎݪX•ÒÖ±s.8áíÌ´@)LÝW^#g£Ùf‚ýïÍF³¢“½à,dïö¿É ¨œŸ ° + +¾9tK@gã¹|Ù¿Ïn +Ò/øPÌAVsŽ±a6®ê±ªõV§{iìÃ;tÔ³V¿åÀ+;³)†ÄaHrß·fȼDJdœâ¥ä%Ó'–]ßÏ %Ú Ò4{°Ïê.d‘œ“#kßç×F2"èå²#¶\¹ÝºÒv‘+2üNáBÃå‘Юdí°›†zï ä„¤(ת¤ÙßòÇýŒ¢Vm?ËprV¾½œöTÂ¥ÙÓßt*ZOÙå8»¬GÕúÝê^]&•ütÃoµªißî.©lBg:ûÐâé»Ü+We¾e rlªú`¢™¨ë«ƒ uÍk$¸<”ƦîUz‚@™àä Ér¢0[n)õü©“ž9ÂÚKšNo1~ž Ï(ã«n—}Àí¤O¶YÞÏçÉ$ î„vÂCç±V>%ؖZbžÜs´!Uê´pù<Çðg“¼6ÈÒ©EŪƒšíÂÍê]È#9‹^ƒÍ>Ò?žúF™fULÞ³Q&œðó0bç̺cÈ;Ú§†Ë"Þ‘œq¬1ª?sÒû + ® ¶ ä*ǁ_m º:é­6˜Â9 +je¤oMC€ϔWJ+¦¯« +ý‹náz|ãÝ +™kóŸ¨vRэêåòŠš 's­°HÏLà]¶T—¾PT]HÔUžRYßÌqŠ—ÜàÝÌÆàüÑ ~aË?øÃZ|j ‘Á³;äSÿ“Gx¡Ñ¾S¬*ˆx3¢{+¾Z¡NÊq¥—¹r\hnB*Ÿ(±¿Œpðœ2o²FU ‹O‰.t¨Eå¼Òá6¿‡™™ô­Ú­ZãÕ䞗‚¿óvÖàªEPe@÷>•ƒœO4’fç¦Q½B蒏¸¾æná¶ö÷w´uo܀dwk܂‚©åjܝói\œs92Ë£¾k-žu~¸;Âè'{ :öíÇ{_0q®uÆ´°âXiÀÅÕ|Öijõö«$IŠÞyE 0íË{¸ÌþÿuÂÝCÊ¥l03ÀêBËQe¦RøҎÆ=þXc—jÆ3U¦´q{ϗNôŒfXòQÚb:Sñ-¬‹vC÷$YÌÄ@u½;É/@²ì'"L& +!Ô²gw<9Â\¦oЫßTÒz¨›‘7(Û¸|qOcÍéŽèÌlYÚk§®Úÿ"䢈Õ~wŸ]‘GAª÷¸ [咶Šªš³ê©ü:‚ŒD'bÌi‹¸¨¬ÊÞÏvâܾEÚµâ]_Efµý£jrp¼ï oy¥…™þzúÜY][Á‚j^}7rpŽs+ (ULT¤<%#Í;«rÌêâ¡Ü@±Š1ó¼à_Ièem8+‚Æ#“\ÔÓQbŸKôÚìÔ0É'YÚS„ªL~äHþD_á¬΄.e¼Ÿä H´CMóÊĸ¢\‰LñÚkƒ³M¤ .ŽlOMû!KW´~¹Ýó ­O,›pF~n'XÛðœêãuˆ½-@©šk®Šñy¤©$r›ÎpûXI•ñ ÿs9—_ê¬ì¡'Õ ÃR¨ÔnXæH”8ìp&‡mG{ºm—ÁK¶m?`×âñÉȘf×6¢¿ps'”8ÍÀ6ƒ.À4vP¿šºÝ…»U^¡ Mz÷øOÞB[O%µ5 ­§sy-ŒåÉ#›f{r;tÊx8†wO>†õU‘ èãR—7QÕWpEÃZÐÑÎP(Ê<è[ Šq¿@ó•Ië€Ø’3¦=k÷(Üä]¾Ñ^$]§/É´Ö5bbê/ŸTZëÔJ¥ "âVh2Ÿ2çåÑÌ#™,WP)CVHc Þ8\ùlì•Þ|/t`¡8Â9°igñq¤©Õ ñ6͚¼eãº{ãb7ä&—Ô +0€¸‰(…çìöæ4U§ßÛeډ@—þS»´eý¼2æ—ðçnŠw»(ä +yå-ð±ÎjgÜu‹=ÅÞ`¤$lhc<ãÚ²CYW`g\Aϸ ´£p*?ÒNÓ¼t°æD;eڅ£nJ…²ˆžd'hQ”ê5DiRVq'V™¯4Æď€$Ev—™Ó +þEÝäl°þ)WÈS—ß\c”‹—<óõ=@^ÌF¾©¬メ­™Ä÷g^o듌Ž+yhY|&Ʊ³š½9Ó!Lü®nwds•5:ZòÆ"IøzóìD”¸0¨´l +7y]’§BW7ì—“ÃÀ ‚+Øb8l„G?¸ÝÖàªDû€a±XþXebàÛ"§ÑéÙyƒ’:CÆXTÏÎ#÷åՅà’ÓRC\€ØNhÄ*‹rÚØä×帞°WŸ"qþþŽ-Ç œsÇû÷Vs'Ì ý¿ßßw¼äÓqX4¥n¨^´K 7ísOpKs–XŽðÞzƺæI5[©7C<Øc-¢[F–u¤½xQU8g·yôÃæ¸* ™ŸH"Û¡†÷9’ëԹѬ‡vzEl +²ÔzFJäoåW£_X¨p*]áj kŠ±-ȍ4ÿ$¹_ž¢eŸ{V‹XO®Õ=ßo+퀝|Ù¨[a†}Ý^ôS‚©YLI3·¯u&›Èn£üGÊS;–Á0&V50—Ms—Ê;â£ÎÕ6´^WÈ“믏—þ:\Û·§,¦ÜáÒ_‡Òßb”œ—ÆBùµU¥¶`f•ü5÷qȯÃCí[,Oðÿ&Ï'ñÏÇ"uê"þó$þ1þ¬ø›ØÙ&˜éf?ÁW. ¤½—Ná«lÉ«2ú¤jq.±°®t¦ n’¬w͒ï oJ¢N=¯Ò¬ÎGA9H}»ID;îW0VX1IjT?u›ØW嘊€#‡’×4™1“Xh݅DŽ¡ïY˜#øœXâ+„¥É×s.ÑâP×-%ê) yÈ9§ë+œõÂyð¼”ñ‰èR5)Æ<ŽR–R>œ7J[g]È Ôs0[šItÊ ÄÎȍœ|¿âɦbPi„X¾¡Câì>²#>ÙòS÷W¿/¨hó‚ÇOÖ<åé€/îi¬9Q—¼·®‡íµãw®Ïv~¨ö«(>kå†<{1Œ ò|S.ñ¦¨ª9«žòZ#ˆ øo–ç ~‹” sÚ"ÎsƒUÙÛÙfD4ûÚÔþæ[›je¹’yž²ì3ï#.&۔sºÀQ èèÇɇ{õü(…íÚBÏ$™¡+Y䝀x +Uì LëÏGè·ÑPâñ+òÁµ,˜ç¦„­ KØËpa8R‡E7e»Ó˜Š›Ò0úâÄBaË#/¤‚‰ 8›ådÛ}üI>Š¦TóuÁbçņÓÖ7~"àl[+³¿ìÉSaºÝ‹Z^ÞøzェƋVþ>Z)͚†Éòåëþp_W†=3_ö_ö«%ǎî}ŠºÀ3ôÿœÇèYٛ¾ÿb¤2³ªzàÜÀÌÀ›ªŒ'eJ¢È`ćï¸ÞÔ)xŒÒ-Ç»‰Â~Sxwô’^½A\«1MÓî+¤ãðj®ƒ›ê7“€Õó’ô|].y—>¿äêÊygò>f¼”%9i”>£ën‚|@àCž{G4PQèºóƒ\KñÖßÖâËîÎî'‘,Vò¼}Ô nm”à{滍Y§Ø•« ùÜ‡)춾bŠ63H˃ÍÙ>g•°ôq¯Ð÷/*8N+TÂz;„?¾ûí‹~‹5«ùm›ò¹ÖN„Eí"Þd^ÊdÔÅÀz^ë˼¢Ô?~ët.-Y›Y*|Ím䆂ïQÝ@ó(½š:ŸÀð:P:‘¶ö5”ª=½³Mèz[»ÿÈ)ξ¼x£8ƒÝb‰%ʎÚyô<àR>ÆG€= [,}¬P Ø×ÙjÞî̸N£¶ä0eíµÅ®nµë;ofÀ7ÏY!"¾Ž"Ö3ÄAv: uí®ÔN3? ›²´®Œð2™“—¾+w„ Fg´â!²GÅðª·HŠišÑÂÐRýD¤JÍíâYœßÐ…RD¨xò¢ª+ÝV!«¿)ì™äT˜t¸hpñŒÂÊ5d±…€9@­Êg×,k…„ Ÿ +ò׏è5y˜{À¢T¶Õ3ÓBÊî…Y3Ûü°¨bŸ»U5Q$J[G©ºÙj٥ЫŸUŸq½õÚõ;Ðÿx UÈçqþíº~ë`-Ë«–Æo=wKÿÚWËì°+#¾WêYœÕ]”ùj#âa5ÀëÊÔÛó0¥é#pNÉ°É=‡É¢Ìw]¯°‰þ2O`â¬ržÖrw£¹ ÿô€ê’¯1u“ IøáYVŒ)*¡luR¬Ø¯£ Æ°Û¬|S·wämœÝp=·Êöè”MQ…˜ÅN¤=VrÒ +âP«0¦#"ˆÈâjÇ4þŒ4{$Ÿ`´íiÃöÀ=Þ~˜vz¼=+áê@kí@ß¾ x¡yF´V¾^½ >ÍÙñC±íÝ^ÆÎnßNLŸÛÒ>ãÛύ㬷$Þ¶ƒ^~®¸G¸×—Di)(AXËSÂ9ŸâF“XŽ”.ºM–xC¿ Œš³·ZùmòÞ„eÉ^rH„}¬4 úk>c‰Ôi:®â‡Lû;Å?T0úN³Ö‹Â¸Šßö㢗lk¡&@­:ê+t þ–×x™‘EoÉۀ7ú‚ŽÔ&4 8ÅKÉDŸäwúA©#¥©×‰+w ÄM–QÓ-°´|¶]ÂÒèà•¸oX¹Ýô©­ÂöS‹Ì*74¦f6³•j«8e3 $Q ÄS¦kÔÒì·üv?£L†–‡ØýqÊwÏÜëž +x™;qAYHÛ]ã)¹ŸBoâ†"4–Œ…kÜÕcIGZ2ÕCúâ{Ç}û29ÍoZ<=\©#Ï>ªâ,TÔ|¾¨ò à¿%fN/Ù(r¢Ûm:ÀÊz +„Fœ{¡2ڛ: +—³4~i2+HpIz©¡Û_g“–_ÒU>Úû]PÍvÂǹÂaƒ,|’<лÚÅ3*…ȉ(½œ¼I +1NU:Sí:¡£´íòyŽáÏfþš$Hj‘±ª f«p1´qG¾“3è9Øì#ý홡ï%×R׆¨5rÞOe1º÷À!z‡6?ùÝeôïÔákvöuÚîÅL‹èšïP,¡™OôRÏ¿Á>Cì»3IÎíl–aAÄX—‚Y Jž3 -¨n®É_•9rKž6•_0›éWú)×g¾a kõ¯ Úoãð ŒÃÚ œü!Ö^¨‡u«Ð}±ûÂÄ*¬kÈþ µ@*›E³ÐÉíSiR ò!8Áøôø^ñsÜzn\ªÜ®GšÏ–µâBT.YÔ9®+³ä°¨ÿ‰û«.\ýš¦z_˜R-[ÔSHÇ׬vA·JhRDû³\Þ‡n¿sùŸËå½Ð)6Í^»ÝCÜ-ûÍÝÜÑK^í [gorªtHOà$C¦1™7=/y Z”n÷–«p árޙ|§/e&Ž1Nûó”Ê–JÖé&§Ú•Sí¿!§Ú#§Ú§1îvä2~Î|¡‘ÝÌWÀ©Zä.Æe¾ Â|yÔ–Á"Xø–>Á%Pâa eÇ]])ÚÎ9 +ørȽà-YÐö3å ÓºÌUh͟5W¶M[¶¨ÚæzbÕèœv„bŠqïêt_ 7·"E!kÜÌróê[S=1'¶|âp1ã>®E¢Á% x6ëG ËÄ!¡É‚˜M§E)¶vœÎú̶e뙟E7 ÀíµÇX¡Ï±Ï÷0Ö©a +²x1r°+vd4t—©Ô"ïd»`å§æA帛?Ûn{ö+ª²]Åuc~ÀÂіÖñ¾äšã8™#ù½’€.wè£ +ãKš÷â“-cöOÖËÚõûvHëdõRÕµ\õ²s>õ‚n¾™äPº·Ϻ+4vÂHc{ &ñ´É{_ ¹à® ûX’ËTÈrm€‰ÕJ]}ÕSšùïÕS±%²q8êie0ÖÝPÈûà„jlµcRå¸V>ËÓ¤é#–CÔ>ùPìΈƒœƒö‡ OñŠÝ… ·£'®²«– Ã?ý# Jâ%7ŽÝj¥nüð,+Ɣ#º3Ù;ë¤iµ_‡œ’µïºò­™ß‘×,S=×E{”…û2ônìDLã¶F¡ÔBÔY0¦#"QˆÈ¾¿ÛeśШ›ʲêÙ¨µ³Ú‘âSEg¾ÇyùècvMÐc`ޟ÷l¿M¾;{ÐàÔfµn ©Rñú.Ù¸óO÷—–'£ŽQÃ*}XC‰´ÛÜlÛKÓm—OTè7…z#?oA‰%^šäÔ,!XrwÀí§åHj åYÞB9± å@hªD;‚üR¯r¤`¯rF½1© ?Cñá–+\Iú-Dm¹ZM÷Ñx{ÌÿóŽöû°]xÚ~øöÄ«"E~ãìuÝ«=^ŒkzüRz~»^ÇÖî_O<Ü}ù˜Qo—Û×ÿõȂ<Þ¬{ƒã®Z·xºZ¡ ɵGƒ`úzÆ,§óŠ·xoÎ䯡jªæÜOw$ ­IÀ)^J^}Rü’³JM­4%Ç.¸É2j`Ê<²¤Ï¶úUE-ç už•ÛMWØ*$°Z¤¾½æ„†ó¡qŒçÀ)›Y)'Û³#QÀ5ê1®-ùí~F©C-Qÿã†o0ýÛSÉNÓaÐ^m<%÷S¨)]² +\Õ¡ðÈ]„u¤%S=ý[­Ûqwt¥A­fZ<}Ï%g%Äã9U~œ>îc‰™Z”z¢Œòޔî•$ÌíóBe´7Q:*™¢4~i2ùBpɗYÅÛ_g“–_2>ÚûÝm’#>ÎÝeùjáS·NÛB»xF¥p€§J[…Þbœ¼IHyYÄ/hÛåóßM´7qnj‘±ª f«p1(2G¾“3è9Øì#ý홡›Ì¶†òY–1íÞb@¯éÒAª—ÓbhTŽ¸VžJ\{šJ]Ÿœ•¼vè"º¸ÿ!¨èÜG_«Ÿq)èw°ÒÇh\†‹Zle¯Ð×ÅU¡¸C××~:“[¤^‡±^º?ìfä0&ˆ gÎõ!°ñmJÁ!ßu‡6?yÞgÈØÔ™¶~6׉úÅLËÆ5ß¡XB3Ÿè%é{ƒ} Cdóê²[¸¼¯:®±.±¨Ù# H8HԊ\òWUÄù)9%F’^ªY\Pú)äŠZÈû OÔQû?±å?Ø¿3ökì_oVö}R6ü›ýjّ$Ça¿R?¿ß3X`]—ýÿʤäˆÈìv™Óö¥ÊLG„mYÉ2R{³Òdm" Þ ‹|@÷Ž¹i8‡:徦4kIü%-ÎX—=äÒ™B†!‹X³‡wg Г º»Ö?>ùÊó +æN.ȲG¤‡*1Z‡)ìÊ1i®Ëƶä‰å +IjÃ%’‚ϢͪQmZÙy¼ םmÎ*gæuQßsWPä¥2rÄ­ÂYœWÓ#Œ5Ð;²W‰6 ‹rÕJ-¹ÝI”P.gR‚ñ‚wÖi^ªªÁ²däSŒ<ÔÉD™iKçm¢›"¡ËS6 ‹váš1žM7djˆŸŸ Íomz2þŽ1L#f¤™Ôá­±Ûn ëÒ¶6´*Š Bƾ\™Wœé‰Ç%Ã`Ì]öì(š/ƒ¤¶<½é n ½ 7ŒÜ•}ÜÌ-xz¯tN×оP3ÛCb§Äà ,ãÅ㎀»RGte‡ôóØ·•u¸ß÷¯wþßî,“ KBcÖßZ¹äïȸ±%­ßHÀj…/ +ÈRæá0¼,^ÒXƲiCNü‡\¾¶'Ä£´åùË7oÆî>b<-‘¡o.l%1ûL$obÝԆ[wÞ|v}Ö֌rèò$ŽVvƒA¬Dú\øå-~œçßq·r ÓõÏóˆÜ>±¸ÌÛóg}Çe§°Tº¤î(dqr¹æÒ¢s£ŠÉœW¿K•f +»™|®½æz¦·öR;*›Fƚ‘)ç`Yr®ü!S8¦\EnJ ÈåѶH›à]]Ŭí8OX!«ï˜éž‘Q7£ßÄã®3³!™¾}`3xÝe‹íò‰Šww÷+j¿ºFo©.p—öQ¥:””·o‰+$’ýš0öڒ8wÙì>AF¼V ¤`_[L2¾·P¼XÇí› +­Ûòj=tü—Q¦Á¹yúãÛHÂ}^M[mº5—ûRÊÞLT–ÊÆáÆ'5ñ\àÌ^·ß\ *¸8N¡ÿIӆfe-™Êt€xRæg·5 +ÆJî6yõß!8´ƒÎË[òžöÚb0ÁÈF€·›æ€ÌŠxÁÐeîæcdv8ÐîÅ=f~@•WK²JIMNðuä·[ÃÊyð† ÄCdÕ&gFD}–¯{ˆ?ÒÂÈՎ]wþ ³‰vÚÈ4 Á¶V•?v_’ìæÐJ9·e39Í0Hñ£ã;u§Eùƒ`ÌL# d!8|©±—ÌŖ™ÕéP{<\i\¤^ (‹‰;ÍýºàÚ7…ƒ¨lLÇݲ<ßÖa;X¦‹ëRz &ËýLDtk²É"Q÷°üº»AZÊÄÛws9’Ô$o8 d™×ú6.¨Z73å,°-iɀW'j% ÷”æ:Ηífúãát ßyc ž%“7ôß-y 5Uè¬à°}}8`yŽzæ¤÷ü-žÖžÈîÖÄ Nà^ ™7Hûקx)yÂôIùaEù}¡ÔQ¯¥IŠ±Èê.¸É"« +ÌYû>OKê¾Ô:ÐxÕ+Wn·’´U¦,ªôÏ*74œ íF–¹ð~P_/ hG¢“kÖÒì·üu?£«–ŸöíïV¼=›öTÀEØÓßt +óñR½óÍ=4ê·z/F‰‰"3-™$ŽA/|4pw>…¼6gZR8¹òŒàÐ.`…&ȱ¨ò €Z$讯Ž"à ùʶQ·û(²^¥ Ž‰†|¡‚R¥.…Q^•æã—fs\r.Bo{|MZ~©‘ùlïw½kçáã³»ÌÓùKt½á@hϨüè*ëcJÓ¢) ©F Ž6DIý‚¶]Ž'í(ÆÆwm°G§« +j¶ +£ñòœIÏÁfé_Ï }o˜£ÙϦ‹ê¶ìÞÁ {ǬûRÊ)TÀ)“WÔvÆt!œi75ÆIh£|F&ÒY­UjO +:ì «·0#vMÓí#Re¤oÑ Ú~¦„Rbæ¸\ò$ôÞ_t ×ð½ëN» úKÊþmFÿ3:íé”+C\)c®wmº°'’E;*Ãi·.ò+l@UV€©§.V¨M‹’yDÞ‡Œ™TaZ­ZÕÕ7äj—d/7{`g®Z˼ê¾SiáÜˈ—½1êù@w|˜õ-tØ ·ÿ®jG[÷ª ȘXÕÔV-WÕîœOÕJË ™ÚQѵc²Ž0ŠÉÞ‡½A{xï &Ú½&ìc¥÷æT˜Ø3ÀTãªê4óÿTÕ«ÑÁ­ŒÌ½gœ3ÎW!¸WÑ䌿¥r¬†›¦ÏÀÀb&_|ë•1Ø÷ÈÊQ¯¤apŠ:T³Ç•\&Îrú?S^9”Áz©’­Ö¤½‘äüð,+æ”!º1ۖÎ:ɨö+¼-BØí©|Šì‰Ü’·×¹Ëj“ÕÕZOù֕–šXxµuÌéˆHÓ"²Ï›Ýˆp‚J¥Ô¹Z˜×9¿b¯µuy4¤ó*{ð÷ð ØMQ ÉPèDZ¦Ž•ÕižXºàG<þ»Ù‡£´O|·;ÍýgoIñüYÝq0³ãb¨PJu?{ q’Ë5—¨6+-³ԁ»y/§]Añ¿Iò$IKç +±ù[Ÿ½Åe[Ò¯ñ‹ÔÓí÷jÏؚq­²XBÖÀÙS¶µv뉇§±§vÇIZš$­±qH؀Bw©¼…%+'¥-¼µ; +ûÃäØóåJçvb‘1¶òAÉlɒ[@Ñ°û=sºkDÛ÷*×ƹî&§¸qø¶N:âR¯dLQu%Jiø3­‘SKT²fCn¡¶f[ú&îè%Ò»Ao@JGðA’­À¦†z†æĂ/ïÞE{wÞ\úüTNNö0½5ùV3^ËâÎ1‰÷¯Ž¼,y›h¤öÖؔÌmââÝJ¢1 ÈBRèqβ­R¾L†XŠ%öR«y”âbûø|:]fvùç©Òv÷6!"(• õbH&‡¹#.Þ  +tUÄÔÖ}WŽÉ3]‚¹ÿRŠcCRØiÔ@ê¹ižYÝñKõd‘́ÿÄ~Šk œÅ•i3;«´rê…kâ!G¢ +­ÂYœå<þ=Âøq•ÒÜø Ù;×£B÷š¦Q¢ÔV,Õé'$ærk¾ åkSiº¢ö¦ì’ž™å>´ÆCÌÉlPq|òàÊ"Xþ€{OCR¶pu–Bt)=&Àôƒ*÷¹BU† 0Ôl‰ŒÜ¢i+á+ýzº ®µZ +ñ›ú€u M”(ßÕ5ÎtBjå¬óÝÅBÐêwèZ1­‡X$¼´ïdÎîʹŒqÂâ!Àh1{ %ô-ğyÑè?~óê{\VhºÏÀP/sƒM:tØ©`oßþÚfÊÎÑ(Ûa¥ ܜ ˜*IøàQ¿E~ò4Õø:½eåªÕ¾]8òfg°õW{?R.öâ<çøz„àßÿâ|Λ†¡ ôßû/ÓÂÌ/دNØsø'ŸŸþ¼ÏïT¯Æz!~)V$÷`‹÷ïí¾…x"¶_¸Y~»ËҌ7Çdï«yÞE’KÚZÅ׃ô‘H%ðµHk4 5„)u Xß´cž1º•Õ`1dhæCmøÛ)‹zV2neJc•P§`ÍÏæ]†Ý¨òóÈ*KJ°Îß1Ƃh˜B…߯ìEÖÔ*Úc«KÛâ;–Ü̞Š ÛÙÉ©ÏõÄã®êcî²gG‰mïwÚ&‡ ¢ÂåŽígöñÑùqr¤”Kó*A'áо@=FðÒà ¤ŒÅ㎀»RÓLA9µü\ƔŒƒF®ä‹úŠ{H•ÅÉ0ÞtÛâÁ§èÿ?ìWIŽ7¼ûó¸/ïða|ñÿΈH²XÝc[Z‡£YULæ™ê±€•=ƂHRÙdz8ãyx¢³é4sèÈț¢Ôg¼A9eä$(Ñ° < º££‡:D£>OÒÛ-;. ùü•ër3–F¼dÃK6œy1¬PgúÃPùÁÃÐø±£P)%äÅkú¿BŠ²w)”a¦ïPÂ3½Q™.ÝÉôwòR §û†ºNŠí@ƒ’maµ¼O…)=c#ËÝÏýü#®Öí7Ôý#ÞÏ[›¾½ïx?oQ}ÄûyËñ˜ŸqôÖ´žßö;V7>q¦Êw,ù îùÚC¸•jïk€fU”## Òda2^Z‚-ó#–·•êvz¦®àž;BÄq!ðþÇvÓ¾–»õ¯‰ÇqXŒ* Y=O8‚Ô•(™ä{˜w0=1yМ¼Úž†š_dó³M1™+Åçl¥ÞCY˜G³²(2#µ¦\/ÙQ²‡¸?!Æ¥=¥kl§"Rð`c ÑBõ™©!꿹ת&ìÙÅÇð¨kΣU€ÕØeJÔ Y +") ø…,˜ÎÙ÷ZSM)tHã 4#y"sr-‰O9âý#GUóF‡ÛҀM1d_/· +Ih‰Iïˆ\~¬}>·ÇnvÙ¿×PúJïyQÌɃi‘c?[­k4(,sÕHåD-ÔR¢•¤,ÍCÀ\ژ°­ï5ÉݐÄÈ\‹ • þ"VµÈur§—LnD°iQkURð@e~¾4¥A‚¨ükÚÚIü~f˜ ®‘9%™5bì´h¼öåL ÇðU¤ÏNe]Wh5E:Ií²·& +'s‰Ŏèn¢Œ?p÷ļIŽr¼±«¼+¸«iðº­-@«ÔéêÆ|ö¦Ø'‹"O£®I9ƒâ´Fmðǯ¶?¬"‡½ÒÀÅç/Ýú>¿5ŽJ˜j^ðƒ'Þ÷›5úóõ… Ýtþ’j|;?Ï€õÆ2AO\&ê ÷KàêGÞËûÄßkL²Ä™õ&2—ü„Èl‡ÈL7‘9n"³"3"s­%2ë!2û!2û™ý™"¥2ë]e–SeŽSe¶»Ê¼‹ÌxŠÌvŠÌ›ÆÌó»DfiVáÖ8󀄳b¸fâ¿\é8QXVñ7oܝ¥Á½äþáHa.Íî Dl¹Wgqy£kLíYÎÐR4«±Gՙæ]â՟0ª àÀ"Þ ñU1Ä¥`ž'ÔÐ1dLØfaø Æ÷Bš© +“¯=êŸE­6KàÃQïêÞŽä° s +kšàæ›èl§‰“?,ÖØØ uõ5Ef6âšP€§¢ }Ab=Ï%Ž eÿ‚]T)-%ÕIšZST"Ç|“ü‡aˆ” úšsÉhñ^AxzwD=¶ÐÀ[È_‡fO—’ c‘b¤ÊýøåƑfúµ”[ªÑØFÎx¢TÛ¾ÊΨÇ`D¼n>4¾¬fÖZüR#õÀµWg¾^¼ Xîø4x¼ »ö—E¢Ç±Ü½Œâ»w£ï Z!¬,bßþVÆþǐ^ ¨Èé +ÿŒq‡_Ü%”•Íԏ¾–r®¨H$þ'½°Ì[bÂOZ»2b½¹¬{ÌnKêI1ú|î~±~JCꅚæ™zjä¬GÜð™„F¿¤®µ/GÆdvZ¿šÙ­'Umw´ŽÐ“wäl}ÀÚpñ&é?ÙÀS8ˆiµW¾AD>D3dÄÂX$K®*·¿*šÌ/éåãT7 +O¾ê‘“ RÐTÃMð&ẓ™’ò•z¦«ê5s%·"'o5ه.kêr˜—ÈÁ¨å CË챫™Âl×`õ3g ?BãØ%5Ç»4ví=»B¿]¶¢iWv®óµ|ÌÎ9Ì!ÔÜ/uñÿV¦–ýø"à'Çts_z)èŸ Ç£}¿PBÃ/§„f(¥)sE(a&²%ä·e3Œg(¹§KFÁTÁÚ*›Š<;Õ%ª{V'™ü±HÙуu¦…©ì"ÔüRv¸\¢ÓÇw{tÄSÀäꢂyž0%X8dLØf!]h@Ž…è’Y&3I]Ök܀¸]yä…ä0e wÓjx1ªóH*w¶Fwšµµe?ŠÒx ÐãºðS‘Æbäñb¯'ÇL«çðêÐ?{¥°Fa5ÙÏ)Ô7Èidr£ Ý$¿àµ„MV-*¹ÀŒ_k8é–ßà\ð·Šù\fOqda‘LŒ˜8s­!Nñ ü|¿ƒ)Rù;Ö80´µ“ø}‰\Ó¶¨m«ß!³øNŒƒò7›yöå̼šx®^—"kZ O´Æ#:IƒSwÝ+”h¦ qUtjÌ¸§#ÜDÂ¥}!G +ø@.ApNCƒ×mmZ%Ît*Eõ9¥ÄԍÍC|•òOPÊÓYìß×®Zg»Z3gð ÀÚݔbÜíJ§O•ö¡²Ö*å=p®.â#åT­n¨†|à4³CY§À8}à´\oW; =þ»v–³•Ì´êíó[¨iž5 ĪŽoÐ8Í~£ã¿…âȲÁŽëîc3äŽÖ“»à´ŽÐ“wäÀچS«ÉBŠ½-@w)[µWE ƒÊ’9e@ +$0›AP°¤2èöwH¶ò AB-;O§ºaXºçK¢ÉÃ876š>nÙù&‰÷ :i0(zBE¥÷9/áª"QÞ©^Ob—3b< VíT¾4wX(þ¢ `(^.{ê÷…¼ôí˝^Cò£%U7ô˜se­Ä†î"?;Í÷$GŸìWIŽ$7¼Ï+êÙྼg @õEÿ?ÈÍÌÉ`dVk4FÕR’–Œ`8}17÷½ÄQÀŽ'7Â_(ñ& Pë֏˜žäC´¢0èZÄÖº”hk²äØþBq„|`vÎâkL«óY“çf¼A (%(;C|lbõ”Ê´((æ¥Ï…x‰¨é†»r#¼ÞÓÛé◼(–€Å<ùY|ß»øb1iR÷øòvcÄ_â~ – Ã~úòùO7ßò„‰G%ì³/h†›üyî´òëí ¥ÐñGªñí|öÇŽ$ç÷×Ë>p¿î}¦Ö0åä©5[©OÚf0l-B….É°ú¹gÕ9ú¥Xœ=†äIEyÎÏs$ÛÂa½ä4dbÓ¨!Haio'ÊÔYb6ø‰<°‰$Ô ­ÅKZU¿ rMğ¤‘ÐÍâUø¬ïʈõæ²î¥|+¤T͟¢ã¯ŠŽj9Fþq’³\ÉY>Br–[r–÷’³a‚ËâÚÝ>Fßî°Kí.—ªöäÁ[˜»ù†±³¦ +yI`ĪF¯?ÑA~ÑԒ^±HŸR9ºè VhP×@è¹Ïx?ž8½`©“ëùýuÇê‡ÕÅ1©Ø¥ýîi^I¿÷Â` aÒG¦fª—Ìnfz0“þ©½ýmýt²õ6k–Úè©å¤]\%\—2[R¾h— +t³nr3²FÑ9²Ó®ƒÅ»]“ [‚ü…µˆ·™,nµ>ÁLº¡ñSh$^rIžc¯€ˆ7.èÄ«úí²O»˜w}/\˗üìÍÔý€j0·Pž˜7S—ŽT+=`±Ã?¾O°#HÖ7HqÖÄŠ…ùfoo*¦×§ÏÆ7«ó0¦AÉo}Kqd,ï++Õ¿“Bo¾b{RyºUŽÉh~àÎà1g$b&‰…"²™>¼|7,ðʄm¨JÐNÓPĽDj`A3³“2Ë ªÊ³¨ VÎS`0}…»î8¯§›Ÿ«Àä_*fKnÍ«‚·j|Xwܬ+ã„΂*g”¸Ý\"×kêÈÚëéZo!Š +F¸mèø®Pt©Þê|«¶¾'9ͬÜ[îz¯îMÒZج[ÿ1TÏ'ikB ©Œb'Xèr±E(Ñ[ƒ×LmH-ï=”ÃXo9]XÂ{žêp‹º…ŸçHÑCÀa½Üµó*F_/ȏR cÐKY +ˆF&Õ905A®s?mÜ6´ÛTáS{±¸íMe*žNò¥XÄQóº&´5æêC†ª47ÉOˆ· ×®_ÄÆÃßÎ;òЮÏ÷D^ÝXþ®‘¶Î.‡'ÚØýM‡­‹sá-«ZQõF£êÙ/Ü$½®¬Oh›.\]ž±ƒÙ}³pHiÅ´g—êÊæ*ö +ÿ¨ò €Ž‚}/0s"U…õ úGjÌ6ý²Qˆ®¨Â‰Ô6¨5¬€†÷­z˜u'8Ä2.„ÛÈ-r|×û¨sG/Û}ê§j +^ªAÕÝj=Ð\"¬z^^zøÜÅSBR¯£,ŒKÖ š¹\÷Ö|Í¶F½ÊÊXUP±¯ðcù.ä–ìMÏÁb‡Ô·{†¾°KGDê'oo–â»Ü¡<撇6'X¼ý ÛݔRîörqt¡x݆@“†ÍÊ·”…þûŸ‚LÇnµbÞ¯^°P‹$KüãeXvœX©Ç§¹Æ·ï†ã²W65óO •(Ç~f“E†ìo”r2h¼¡ÀQKý”‡€‘Qã˜×ú^Câ¡Êš€Ӂ` +é(‹°œz¸ƒ:‡œEªà›k݋´‘Ç÷€ébÌB£¦¯ñÁÐ֎Ø]3„å¸Yke›‡Ìš@誘.@¹vr¦®æN ¼.g¬ieŽÖøI'i0í>V%JGëFNc±ÃÉaúàž>ÅÈUK;©LðPp6Á붶­’t£¸|O šB1žM$“ÜA‘™Ø R?æÞÒõ!/Þ%g[ +ƒçYõ%@$ +Uídzô8—Àà´çþš9tä'ôP®pœñ唑“ ‡³:‰=¼GPiy«iY¹W›m­tw]OhJã³rþM•Ó³oõÛF0®qü¢7ØáuCP%»GôNÍ¿v;•ä~õ‚bñã°üñ2,;ÎV8>íûË0¾}7üÞ#ú@:åuëtf:œD*éV4·"dõ[~³rbBF¤ÅŒÑ׬ý9å/)¨¹—µV¦#œ„ò: úû *•7 ¼=Ä#œì*F0”Ël@$(¯SÛ +²ùSÀ-ævµkùóCŒ +q×¾Û8Ï9p^sàüœ?çÀÏ9ð_6Nˇ`úcDô¹SºÉVD2CSŒÂ°"0–Ò;˸– ¡ûNbÓLT‚ž’€GÄÏQ»lýòšgWٻʱù QD:ú낖¼I³\A;ÏSš1O<¸cÖўb£†`f鮝I±R˜•ožÚjõŽPOÝSyÜPÊnðJó…ðÕ,J"Œ04÷¾-þ#Ðô©¡{º"~ƒåÙ§Ðv¤MeãH Ýé +­•£U•ê!Åê@u@IÄ=óhf?ëL¨–D?Ã㐶0g6E + ·QiM?žm{Vç ¤Ž âªïï# ¬rÁXÉ‘A€JàÅæN‚UŽItU)ZBu’áVT¿ñ&)q¼vQh œLS%fgñ½DýÌ †ÙÔi”"TE!Q^[$}…»î¸¨ž{sãs$c°0$èя[¥ùª´Ý«´ý󫴝UÚnUCæäö­ûÂ× pþ%ÜL¹ÎÄh´¦€L­`¾ZÛvtÊÇÛ–T?ÿ–?€…Ç4 +œ¬–:à~…û4CåH–[7)PꝜJÂØÅFrDJkŽŠ%;JìĪÔLûí~IOA{«ú¡ßY ]Ï êâ¹×è¶17GP/ÃyLk Ü2<þýmeÁ`ÙÀDøz‰uÁ$Å*µ–ÅŒÊL!ٕ\ל1%FæÄ ZD¢)/¦tC$€YΘñš0GG˜–;¹£ÛÜ9fקà¦OàÐZ©¿æbq±4‘Î2ÃÇ3M6>ê±vgL{×ôNx"è`øٞúº³Ìr-ì +D _e}Æjq×µ[ÇPí%V·_—œñHäR- ¨xb$Ñ,…ÕT&‡IØaÅá(pDz_›µuMxYƒ…¿:ç„q#‹C{ÛZ}‹ÚÒ÷XvÍ?¾+7.*>\üšÙj§NV`¨iÞ{J«Î~M×;¡y(8oF¸(GöI#‘>6áÞÑzÉ֟Ðú„ž¼#¬ C{6BÃùÖ=UÈY\{U½k0:M}vð1gsÍFö ý+Êñ‰!++g[€ nV¯}¿ø¦y ý?4XyÒ`åSƒý9 Vnl»ñ%” í.•¬Á>'¥ÿmR²£tsÄïªvŽ%GêMŽ¤CŽ´CŽ¤›79R9’9²Ö’#õ#ý#}ˑ~È5†¥G¶‘)§§iw=r—#ñ”#í”#75’矓#¹|É!Ìo¸šŒe9— ÃQt¹\‚OPø÷ÆvŠWãr‹¿âw÷ó¶cücŽÃzi×Lî…ÆùRɀ4ë+üĕ¤`às+ƒ°ö¨É gRþÈw˼åXÿÒڕëÍeÝ«›•fUdÚáãj YÚ<ÑCLs@mXýE˜³p•¦ˆiOÔ£õP{NVCÇwµÓ~«ó­ÚúZ*xî-j7­ŠËߪà˜VõJ«úÒªÞÒª¾ëc£ƒ8öÐzNl A™“çj}„J—»R *R¸ZŒ#(ÂRkê2¶=í`ŽC³vû0¡N0à©©,*Ôn£2UrA•ö.À¹-´ðV’ê4{~c¿Zr츑à^§è ´Áÿç<‚-¤ï¿˜ŒˆÌbÕkÉ#ƒàÄhÖ#“dfDäT“Ö›'}¦§ù5`–ÒžÎðˇ‹Þb}çb”±_?IU¡èkÒ¡†Skz¸u=à!/͟ ÝrïçÓ©9P¸ß€6㏬'ò -1¸b°`툡I´p372O vð²O Æय़OÙ!Å"½ôC·w®ÜÙx&mŽì“|®ÒBx ¼ÃÉ4¾¼žzíAǶç\5kÖv>*õ²!³=±³œ9»õŸgg™þ—ÎÝ,Í®ñ¬oŒøãwÎ÷†z°pÞ÷¿LË:à‰iâuw­-Šn7íßs^W{~~06Ðâ/Å.ò¾B¼ï˜Æ÷â‹Q+<ª¿¥vï˜;£_±Kgî×%öekv¼*ڀö qñªÈiç_¼jé.õ^‹ ‚¨ś- ¤‹;?@¹x¶•=€%|¥ $f +‡ªÊ,î+¬4±´BLƒ• í‚YñVW‘&òú»ÞÐOgõ?Æ¡ÞØ/áê,ôóþRÌ{{à cGþú%j£üIm”ÿDmäiŒm{ÿP´l~>EëöªŽá}­9¬½‹–ý¡ÞDË`¿‹Ö »hÝþBɹ-@Iºíà¢u A_œµÂó/¢5´jý²¢Õÿ¢µŒ…RA“¹,·R{é¸d²Á Σ¶mî¬Qõùê ™¾§8¬îøåٍ‡*{¨_¾Z0ž`ûò¥9`»”wvhap +ûkì×Îj̝¨wNÄÂ6}ÂXꘕã¯À}«ÛJÎ(,ß\ÙH%‰ šAÕzÖӕ&¢Ùˆ ©rS÷ßÈVÙ.‡YÉç)â-i¶‹eÉ)zXíÂY¿8OŠÇ5¾>eC9Z•Øµ€ä/Y˜aµSõ†2'Õ·ىÝç,r>rá˜Y™–‡7¨•´¬·Ão»þ«bpŌÆÖ¯¯ï8ñà­yRbÙ6⿏ëB¹Ï̺эBp¹|Å&»ÝŸÕ¢|¢ÂŠê.a oM  Òóì‘é ?-Gz@q}”ÏnUpìÎ7ª‹V©f]5.û`„ ©ãë>®âõ‘;2ת´ZÇ0×Ã)½i“¯X}@™P:¾6`€‹Wª)Ô¦WRa†/ÄÓï\®Y{ÊÔü‡×NpY%=ß+)Yp¹²eˆrÕHÊÓjo„ʵí3—ÝF•¼+©7ç +™¦ÀÍ +e(‚ÎÇ[t ž²v¸‘Bo*~œEqdÜ'Q¢í-T}å¥×, Ý‹KI~@•WK“”ցï=¹TF”DÑM‰ÄCdÕ&gu¸õYÞîWü!-Œ†àŸ­ÏÛ£õgV  %4ŕ­1 S7o#d.± ±AifJ¹^Ëf:r +4 ?4èºa¥í¾[•$~!^ J!»‚5E4ö’‘†%Mê*VÍ£lßr xY¼‘ûyàÚ7m]¥ŠŒ¹çnò†‡o2ïEë÷#Ž¥ÞÔ ùž^·ÖÔáIÒ¿ñ±ÍRNΕ/°w¼ÖéÑÛ8ðêN撟ßL)j% sŠ±\>æÝZ†Øö'›¯û,™º16lìIKY/tVpÈbXž£^sP¼¿ràií‰ìj&eÈ}ß*!ó)=pŠ%O˜>éá­(¿”h° ÷d‡Ù/d‘”“!«¬ùRòt±ñrÍW®Ün%©n +Î-«Œ‚£áÚHh/²v42†P_¤ŠHrrfý ÖB–üv?£ˆUÛÏ2œZ…uߞM{êÂ%ØÓé0$´6ž²«—é²U ô{u0JLùî–ÕRUM!䅟5ç‹æl¡ÅÓwõE@žª­“'ȱ©ò«g·€‹ݵê h,N©[žwSõ* A hLòAr†ôÄ&aËí¤Æïú˜ä$¸M[ÉJ•ãûäeÆ}Ö­rküãl×õÉ2Ë÷‘J°Þp ´Ã ¦¹Ï,‘VSšMñžÜp´!IêZ¸Ï1|lz×ØÔ)cUAÍváf ù.ä‘\“žƒÍéoÏ }%Ìa>nÕd=àÝ°0`g̺£K!” 8ÕÑ΀‚äŒS¡×Ә­ÈÛg6¸Ã¤– Ô*·¯¶úF]ìVÔlN‚TiÀ¯Š!@‹gÊ(%fŽÛ%OBçþ¢G8ÃW֝ö@õ‡’”r#×OO¦VdÙuk]âêÀklyõŸ¸†žä”ÀúfŽSüÈÍ]¥ÝOêÜ0to_˜Ãò¾b؊wµa‚¡r"»ú+ ï×øŸ48 öbVAÄ/#º×ԛh¥råWژsŅ¾&dò‰‹û’P#vœSâWH@U­ SO,VèM‹’y܆8|3é´[µª«/ÈÝ.Å~çìÌÀU‹ :ɀU¼SÙÂy/#]vbÕó3€ÞøR֗«¦½ý\Վ¶îUwbU[P[h|¯ÚÌùªZy9!s;*ºÖb¬ãÃÖF1Ù¯ a/Ð>ÞûÀƶ„q¯ q¬4àÝ\ª9J5NU§™ÿRU¯ÆÎÝÙÊÈÜ{Ɖ˜q¾ +ýÚ’3ý¾$•cnš>ƒ3ùè­WÆ ï%ˆ•}"®dÃà!tIiÌ^]Éiâ,éÿ3í•C5Xïªd«5yo$¹žeŜ2D/fa鬓ŠjEo‹+´’\ù*²'òº½È»¬öh²šnµVݧú֕–H,zQ‰s:"Òôq³//köyd=m½<]r™°x>]'û$‘=ÃÍÅ[P‰>çXÝGfåȖ •Z|lUw¾æ®_|§~7Ǟ«oɑ} +é÷jLô¼àŸž_Pâ`¯ûÈŒUöõý¡ß*÷¥0¾MgøZ?{[ÏÿQlGÛßAÛCÛw2#'Ë¢Å;þHím>µÊÔ²¦:ÍÊ®4mžR»ÉXÒðV’•ÆWðÖÍêÓ©¹´ø~½ÅP”–’ %¨{³ˆÙ·#†ÆE|a«Ç=O FÍeŸšIO?Ÿ¶RÎ"½ôC7Y¹s·öU%Ò~SÏ&²·(Kew'J|íBÇ)‹¹ö õñ§ÔnÕ@Ô©Ú·C]l=«ÂD/0Ù^¸lÅÎY©õ# Êiƒea¹‡}¥{T‘œ,B¸ú”’»õ'tÝù R§®ª¨}ûò‰—(ÖÚC5ØÃyYåM®åiv÷š‰ J‚´ÿ%GɹÎaîäAUƒ²ê~ëp>GTŽÙ€v©iӓìÅÎ3˾¥Q©ÀÓ¼fÑQ/6‰r$^Ò.œõ‹Sæ<¯ñC±æ„Ã|¿Xa4T¬¼)ÔP'ì,›:‘FQ«­{©®uª¤°=ò/ {,-açK5§«^3Žpw㞜ì;˜œyÚ˧ú_HÎö’œíŸäü¹äläl?NÎ ö_?×$Àæޚ„€Svµtú®qš„1êÕ$¸þFû`fÆDËþ…¹‹¯¶®¾1 )0HÃÎ)`.ϖV—ð™R—ZVÈ߶< +ᅪÚä%,#G ¸?äE?Õ쪼¡Î"ÀþÉÜÂE`õ±›?gÏu!LíR5¸¹¹¾¤:Kb}ÁÏ£%'3eWîÈéµæˆ‡ 0÷Q…ñSjáñ7¡ÖŒÆìÔÜ4yåZ¹n‹×BTz¬z5õ1h̳øÞ|7nn +/7÷}ˆùÒôpŠIÊ˞I'b‘ýzPêº:ÑZª)u5 n²H<3Íkßçm¸Éf%üÊíŠ+ê\¢™Ÿ¬’掆‹eÂf’ˆçZ8eûћ2ŽBˆ§LϨÄXºäûŒª}~–áõ!¬x÷̽—©Ëö Ž©¬†ÜÀ”V43G!‚ã¨^ÂCí\×UõÉTy:p_ ܽåW‘sÕZêÞ¹òŒà£]¹tíîe~ò €B},1s2;=eA††ߤ®J¢ ¢ˆªz¼4xh¹Óó§^fÝ +®5/quíñólÒòkÍkÔÍikü“6Fá“I•ÓbùJ*!Ò½_h‡ýJzI€(hJÓ¢! )¢Õãý¶]>Ï1üÙH«É¥« +jö~,!߅|'gÐs°Qµ¼fè7z1—3Z™¤—2R{m;I-·ÑÒxÔ +ÍGïYô>+lÃIZÂÖ-J¦þF/ÚË~¶õ+€eûòT0»{vÉ* ôýû©Šéfú›ær›iTå+%8}WŽYèü¸í4U`¬ƒ`R±’S©<\Œ&Ê_LÙØÜri¨r¬Pì²MÀ}‘€˜«M¨+Ѳ*½GN}…£8—/aü~•&>D¨éÿa7ÿz“ª’‘‘bK”€üÐwÙD8VXUç~œ– +ÉŠÊaÕ»ž€.•$pŠI.*Œg“Ò£Í. 6ÊÎÖRXQ@‡º0Z&éYýÇ{®g@“Y*×ö„x”µ›?|13v÷-ÄÃfè™_®ð¯v…wÔÍ@Ž!³S7{pe¶´© ÆdHáÝÐ +&y‡ÉP‰©9šð2eº•í ś:ó+ŠOèÍWäŒtÁ>Ô)¥˜‹Å¼å$êxÆz£Ú\¨n9_[i=m<ÿˆX£J½¹U ó=ˆú)î,ý4µ§ûìºû’žCI9JÉN ºV(–,¦“`Q8êÅÞß+`5¶Ò ˜^«tnDÔԠ7›Fo°RÑhü”@MÄ]7dÅre¸—;·ª0z ëV­xÆcÝâ{éyü–Ÿ³ÛœR~õп}m–tÍöRrè¥ +>ºña?UðŠ°»¶nè,¨rF‰'IHo¨#kl–çyy Ñ­¬)g¶´üÔUL©fMÎêcÀ´¼Ú‹pý¬îÍ^ÚµY!ÚÑÿª¡?ª¡ÿ?¨†þ¢úOBÜáé*’ªY +‚…žÛ ¥&z`kðš¡ÃÊaHF=c(‡³¸™Ì̚á©.G‚nñ¸! ED/§˜”<»ýzP"?J5¬Å(U) 9,Õ905Aíû¼mܶ4*kÄ$6”›ï]Åyº(–bGÃëšP~Èû¡ÞX$?!ž2=£~fÿåûŒ\ôòG_V¼{æ^÷TÀ ÷8}¦Ã1ѵñ”]­¨{£Ñý^åXPè0h[ÖÎqwyÆfç­bÀ%¥•K Ï>ª+˛æø¨ò €B},1s2U…õ úGjì±ý렔]Q¥©mPkX-ï5zþÔˬ;Á%–q!|íñólòˆõ>êÜ1Û Ÿú©š‚—jRuÞ/´£S¤¨çˆj\iZ4$õºZ`²?жËç9†?WÛÛ ÞRƪ‚š}…KÈw!ßÉôl¶HÿxÍÐoì2q#ýÿ¯ Üt𶻫m˜bØ!Í'Ø}ÿûw Ox’6mÄqý1M„bº™ÀÕ?†•okþñÛA–k´[1Ÿ©lÔ¢×ÅÿšŒ]k'VêõiŽ?ãì׍ã°O6Áà¶Ô)€ª ÛÛèPdÈþA ™('“ì îÎz„Ð/u  Ú¼1Ï3„ ^ê¬80¦‘ŽªË©‡#¨sÈY¤ +¾ϳI+Ù%rù™à.ÖnÜÔög|0»ËCXŽÛn­lëÒ¶6º*Ü(×V®ÔÕé‰Ç¥‡Á3wÙ³£°Ÿ ’Œét[!T¸1P:Z7rÄ'‡éƒÇ}Š‘»m¦2Á§®aX<î¸+‰P@ç0ŠËŸ©Á±,³òŒ¤/÷õc¦»À*IŠWº6 Nr±n÷’‹»@=‡ r£‡vϺþãUtÇå½AÝïÇùÃIܶZx@yÀ3æ:jÜš þ¥äiãñÝ΁Lù¥¢ÿB='“âÔ˾C\X<4‰ª®hï')™åÔ™}² o{Eñæ)à Å'ôæ+BMÖrÃ>–d«=Ï€ YÇ3æ®q Ôý[]|Ö0” +2…©äú¨r…´GÜLéRïS˜ý$Æ«ÛL°`ƒ8Ç]Ý1–îÁÕV0új#Ö2y|+Ÿ¥gÒô‘BÊ*äg8„ç … ZÐ^ÑÙÇ|˜ÐQª1*M)Ú8™Ëð¥¿7¥bÃ-ÖÍ–ºpá‰~©11˜G7ig¬hJžnoåsǯ9=ÇÖ Òö[;’9¾ª˜"h¿iýV·qˋG5…1t{@Döíj7ü@æÕÎõÂì iã.º6jz\#âÕ;Eü~t†øJœßȖË€¸Ó; C»ÅµÃK!½ÝÌԕ½õ(³GcååÆ›œ”ì‰&ÃdgôòÀÅ¥|¢.@€âc…±·Õ{X2¥…ŒRA¢.¥wq‘d\Q´& +Š&»ÕÔ!®´³›?Ûn{´*sZœtò ôŒHë%%Ÿ w®¨ã2Fζ@²¢cžQE1 +åŠð{Vl©ü¹~¯Qï÷úûýÜûê÷ìDj…³°¶öÔ»DMë-Ƭ—æ f…r=Ëuëñ\·°Ï)ùà0º¶Í²¾ñC>8”|hí¡ý¨ùQ¶+•\åý÷ꏜ™ëQ±2rûí2”ÂÒ.õùBfV½h—}i—œÿ¬vÉ)Ýö_Ôð‹^Ò¢›YvÞÖl÷h”OZÀ^鲨síñÆxÔ3Vh¤|–ß[汨rlJ©¡ožãI‚ê%à“’‹Ï>©ÙøJA/M:Z%µK n²Œ˜YÎVëoËÞ}êþ?säûÊíŠ+ʜ‰S$^W¹Ð˜z“°¡Ì˜º8e³è*s`݄xÊôŒúAšý—?î3ª8ôùik]Xñ†±ýtrµ–©Ëö ÚûÌêÚxJ¦¼™w³@¨ þÃ~µäÈrÁ½O1hLþÏ#ÐBÞøþ gDdVU÷<Ù2à…a¿Í€1¬.²ÈÌøÏ:äßÙÖZ²´ËÊÿ¦Y})Òf­Ü›¾Z¢¨•"ý¨Îˆ6¿ê à2ƒ1WX9^ùCكª¹ßCæjäÙD ŠìªÙì_᎝†P°è2_z˜}+¸ëLIë±Ç×µÉ˖ÇìÏ°¶úu||öغÚ׏O]<Çx cQQ%TžÒ+o˜f!žY7í»Ÿø }»¯9cì¤Õ'e¦ô¬XuP÷U¸l} ØÉ55èZÝÇ×{…~£— +Öé•ôbÚöT"Åí ›ŒS³:è´jÍ9£ +ƒä¹ì4ÓoˆEêig*Ã;³(('^OsFTÊXPU õ/ÞE.`-ÖÁš©òâ,#N†kŸ +`¶ÃPfêe©ÁØɤb¥ ÒˆŽ1‹ë`oœÃܤ¤´¦Ð"FÕ*™`±V»ÐP¡UuúȚ2­ÂÙ8¸ÈŸoÇøý*ýÂg©ÿͱ±ÿ«Ø¸Þcãúߏë×׏cc­ÓϖæÐ×hÏ.eµ‹þBŠI-yPqYjÉFA#2ÜòbükdœQãYÙ׸‡£‚×Sw9ñ-ÔÀ$1ìxêpy Ê꯹ÇuËEù†-öû’wô5Úå¼ýn• ÁÄ¿Âó—FÓù¬tü#/óêÂã¢7¹d©ÛÚՔ\°Á@£75e¬3Q—aàð<‚Õ¢cÕj~•»} p»ÈëÔ78H²»),•DÂ&Éj¤ÙbDKš@ +LPX^—)û<;÷4¥Š%Zu¦~”z¬PqF“‡SHºTTª†øjk[Àûtòâx6ãÂñР®UF*VœŽ¾¿Ò!Ýõ-.d1PŽWGOçßøzLsÅë_ŠocAT°X£ïw"hà‰Þ¶¶u€à|óœý͍êÙQø¹»Å˜»5òfxH“áúÍ^#2n ¶ :€ ›ƒ/§šXÜèÜ µ"×44,$UFWµ„éChÔØ¢8ÑܕhW}é®Ùãþ«m§¯Ô§WÆɔª,ú÷¿r¾ƒ7ûòHôó?˹”o˜„{íuAo;Îhýž?þêóøõ;Oéùõëùìð¹B¡&=väõ‚÷OÀ‡?ʾmä سìqbE´ Ÿ]a7ò€ä‚¥‘ÿjEÀiL&8;dH*c•=î–P7À¶‡íÿ€ªë zɳ‡"°‚ԙbʚîÕÊÏ3/¼2Ýþú—·û‡ ^Ão\ÛüB»ýçòçyæÏsçÏó3þ̟?óçÿ[þt?»;ÄË£ˆ—«²‚±Ü‡Úš†Ùâ3v§Þ±wº%Ap(®7½›JÝJË·“˜Wõ CæùS²WRdÕÙý!cBóPípXk¿} +Ð[ˆÃD—àþ}¨ˆE ö “uÒ÷E™‡ÔñŠOµkVÇ÷°dRýÕLAW«ÃR–p÷¨qœ™Ð`¥× [TꕑX´Pµ˜3r|mˆBœÚš™n+ŒZø¹"š…_ôû1ñ!õ€¾%BT(FG§q¥ƒ–¨5Q©JZ÷„‘ßÊ~ p„w]ób§«ûº„èfü˜½‚cí㈿—úñ›9΁€|$á’Ñ3)ì¼ÈTfã²~—­ÞÞ2é'¼á¨q§xê.ÕYÒ{È5vxŠµÂBnƶ™¿²Vú~–Ê‘)1Fòí?wu@iê;RŸoû<éã?ô”x×å趇#u|ö¾§Ýª¯öøõÃ‘>þCCùx ç½@ÒÇòÜ`¾àù Žt,g¿W„Ø3ûx§‰"U™7½%¡Ð ;–sFŠ_ DÇo OL˜ +õqëÏn¡¤SÆêÉu¸ŸX›‹!8™¬‰Þ0&Çx£€œÙC©R?ÒX~-: ÆóT³{{Bü”žZW¿bùËÜÝ·–2vo<ãFN»ÏØHr¿G¥¾£ÂÞN‘gÌ[b£É …`Ï頍Ôgêâ3qÁxžñ€„¨Õ¼âvû@A¦tý§¾AEÀÝ""ØzÂ&o¡X¹Ã5Ð{‡ù˜-3.ùrÏg7Ýbö-ku=ë3®´q_…©”¶À€–œª!¾Úš²´`"TžÆ ~<4h@*CÕ–Tß_ieéã¤û„wp–X3Ç«‡`PX_à6àô/*± ´OHV¹QV¼k”®·­mñ7µîëœýÍ oCòc*üÜÝbÌ]Ž¨œý÷#†2ZxHȸ18å ˜=¾œ†ÐâFç†8ÙÛ¡¡¿ÍAðÒàC¨þ›Ÿ;gîJúXÒ=4ûáý;/7澆»ð¾Ó“´´ |ù’6]ŒÂNeV9ÃÇWj?|V ¦bWË}´5ÒÐ+ù­Ö/_„#DvjÀÍFÂx:ÙÙªXž^gFvË°³ü6ÃüN+§Ãî{ÇÖã¾ËwdQý@¼-”!É!úoÑí y@ ~ +x;-ê¾U‹qpã‘ùûN¯*H‡}㴌’û÷£ø¼äáï¥ûnå§UýiU¯²pòñÏn­þÀ™HÂOMÙ÷gÖ¸T®Î¹²I–šÙu[>3PS½,rê$"ãÂ2YØÿå5†ÄVêÁåw4Ž–¹ÝŽÿ½ÍŽöxy÷µ'„ÌnÞi÷·qH¬²"sîótÂC©éûr+°Ù·W)iÊ,\ʏHv8É?‰Ö¦×WJ,mÈmAº—œÔ–7œP²½Qú¼¡ŽÔÙlmã,ؗ¤·AÕï§ôйXvüb¹,`>\îáoŸ4qžV©úø(H±ŒûŒÚ`{ʳpNz¿ +e…,e˜R†:Σ*o‹é!à’?*Q0cÑ>zSþíFe _­ËJÏ4o¸I›-1å’OË +¼D ^qå®ýђ¾ +Å°™ü붚¡„~#[…l¼ô×K#ä䞍éþ¿úõüF«–_6ƒZ…uÞQMgéÀ%Ø+~0%æì¥~ç/krh"ôo .F‹I"qfZ²(Ü@^øhâzJ_4ç/ÚüúQ-QT‡~;=AÍEU_<¨Mzë4*ÅÒFæ×CÕk4‰ 1IÈ72&¯zpQß_"h_z˜ä$¸•ìLaë±Ç×µÉ˲ÇìϼëÇÇg­‹ù-Yo†:U2C]¾ÊyLejšâ9…áèS’4nèÛåxÑ®cìz×'9ºô¬XuP÷U¸ƒPì䚌ìþ’ñõ^¡Ÿ„9»ÿÛ}‘Ûoç¸7àc*~áFåD.™`íLf‡Š¯‚טä3ÜáÒËÆÀÄ»ÇS”t9ê5[+ì5Je–™¿b†ôý,¥ÂÊ »EÜoº„{øɺË/¨ý¡d•Ü¬3ô3Š)¥AFÝڗ¸ˆÛ·¼ÆOBCïâ”ÀÆbKþ(Ì]£ÝÇæbÞÞXÃòñÆ´8bú;%O釜Æ¡þÚŒçCƒs{)бRÎjùËÜÝgé-ºÔÆ#n´1÷}MÊä;*lîKB˜—ÄÏH@MQ€¥'3zSS1Ÿ‰Ó‡çac]˜Vó„¹Û +·K±?õ *%îf‚¶ž°‰w”<#ËH—ƒ˜f‹úL ;¾”õãè¦+Áè®kgßÏ®MÈ3ñ®5ôV³»kO­W×ÊË ¹ÛQÓõžc}>la6“ÿ +öýásnXh-{+ØÇ.+î-¤ +°3 Tóîê²ê¿ÕÕ»3!íŠÊ}Vœˆß×`¸wŸIr®ß—¤r,Â-+f`1So½Î˜ä½±òGĕ !B—”æì•Jîç5Hÿ_i¯*`½ÔÉÞkòÞ(r¾xÙÎ9UˆnÌ·¥oýûU’\Ç­÷</@æá< Exá¿Ñý®Ì, ÑOÔ·’C’߆ì|h  5deuvTû³-\Xí­¸‹ìŽ|dß7äSV¹ YE^ÍYþÔÜ:‰­Ù@@T"†Áš®ˆ4Ý`yö!²Ý"‘ósÄúá#Ö¬¨ƒúëtÆruÆò3tÆrëŒå#½sâC½Ý¦X«ÄžêQ—'zË0Qé„k÷…q>6\¿¤_Ï`áù…À;¬–ë€ó +Ȉ3¦E eÒLŽý¬9OӜE.;P))4D¶Î¨Gt§”%'¡G¨ R_ë¹ï³p#u_ N/ø[Ù$kTÜ&WiŠJJk=C;’Z&ïðÒ§Á†\ù;žñÁÐÖJâù™mۘ C•fÙzµk lå²J@«iQ:ϺUjþ44ʆlóë\6Qž.Ƃý²Á„Rš— ÅR·^¯’×!5ÕËH“Ì/CM>¶´¥Ï̄Š ”P`°å¤ÊbLDZ9[ºÔÈÈ ¡£÷\®›:ÙyÆóM¢nÅéëËQ™u—G€óø»ù gKŒÊCI¦Â—«6£É¾Ï5³$£QLu£†b/ýñâN¹Ì¦PvxU±5N?žmV/)ôlAu }wà\ã0V6-CjÔòonCEÐÔò€Ù!›P +Él,1³6Ø­…Tß¡ïU%¶LØÀhƒ¦^εD‘Ȇ&Ó3§¾(Íû󛔤#ђ¾ÂUwœ2çîƯjµ Æd E…21¥Õ{3ä-ÞG"¥ äŸiäªVõ›ôƒA'•Æ))ø}Õ5šœ‘únÖtßPšÈßCv)&”s÷£ÿ· ä̛HÐhjÒç`ÜÓXkŒÙœˆÖt׎÷t3Ë1xtĹޢl7䚦Ü$M‘WÑa‰šaü¤¿¹Nba‘3ÖtEÄsƒåÙÇØwȾ§Ì}ÊÜ+-*rßv~ԟÈ ¬Î:mé<·Ã14ó’\APö©¾³ëͨÏáHÅ¥,ðg #áê6t¡ÆÛ — +…`{˜ZZŽ{ Îçuj{õ‚ Ëûªßõ¹ðÚ^F(Ä'Wþ~\ÙàþP9„jÚæÛV݊¦š?¡ÑFpû#<Š£9˜ú5'ÝÑz3RÞÑú„Þ¼#0¬ U֔ý“\>âT)äv­ù”6HY”,%éÏX'-é$Î?IMS϶uKÝ0¬œÿpøjåÓ ¦öÌóv¹ mªs¤|I|óNr3rrù•x,æqèü’¼7X¦æ‹zš¥P»Èåfrü†–ީóPN=É ®ˆ :õ(†~;ËÄÖ.îYß ×ãWÜÓÑýzý$w}Üõ)¹ÿ™ä®7ɽÝøX¥è,’qü¬]$ÿ]i÷.Ò~ÿ.ÒÎ.Ò¾ÑELY ”~Náiy(Òò,ÒV¤åV¤å[EZ¹õŽ8K9P9P»ÕœÕˆðOû|Χß>­Ó5sMJ˜I—PÒ(öå3–AG9ÙåXïø¡[½a;º‹ÁQ*æL¡w¼Üýe­ÎÜÏ­ ª²ã‡d;6òãìÀ&||Úחa¾û4—½* Yj6KT@i7AlÝ®§zô¾½©“h˜79ó³J1ì5µv=Å×¹¸:žK=¦½§sOm}fê‹k‹’?ªøÖL ïÿðþø±?VÄvˁ^óÏ,bË߉Ø~±ý÷±ý±ý"¶ät\T|¶eÞ7Èú‘÷,k—?‘EÛܪ”—–¾ôÝUôpX›ÄTàنû¨6 +KüæJü™¢‘I!¦Ž&5øۖ†C«MÁݎXáf_é +?™pGÍC@XLð^·,¦C$M‘§B¼e¸Vý"Å~‹¯ç%¿õùžš paù»FÚ:»žºÔ¤.hï3esá-iO¢hw¥½ò8»ân‘_Q¸²>ònZêWŽ9ñĸŰ4xûÓBž|´°ËÚ?ªüðæ•×Z`æXÕU¹ Ðö¢®ÉÙèύÀš«g\HÎIÌÚÈpZÐó›^&9iÅ•*—oÛÈ=úªS^)ü‘ü/÷‰úT¿œÌ}(P7š«¨ƒ^Rà¥7 ŠÕä…è'ÎuKn˜Ç/hæò¹·æϦ¿‹úI(+cUAžA†8rKö¢ç µÆR_ïú»T”/D½ œOi„V÷¿£@Ê`¾»(1 XãìŸJ¥Ä12©#Ï!ã³Þ\_³Þ?òòÁôO¼:ã V&áÈIP´¼`Vð3;Ûð°’=;˜X :zÓÛÝu´küô_™‡f5*1RÀ}û¸I-ÛCæf]ƒ|P•I!¾ˆÅY;醅ÎÍŎ,bå̘öª™ä±2ƎNNÀÔlòŠ³êV2Ã_¤Ö,!*=Drˆ[á + Y¾–ؐd‹—%ÁŖTäC£„&Û¦îya-‚»Ð÷¡8B2àt$’ž#ÓY¢/«C‰9B7èê;Œ›ü&¼¦‰Þ6éov,}÷÷«‘úê®J%‡‹¿J‹fR)d2H¨iÞ¤UšnwBsPpúðP(Žì‹¦kûU#w´ÞŒ,‹;ZŸXœu"ו¬ …Gù‡ÈP'¹£â$ieiB­U +ƒÁi’lÒï>Ö¨Çڋt/³Í-YI9Û”“uð&’«ôæ4¡–Öh³f)þ/Ÿ±\!ð-¤Ç…»¹›-9G²q`!³8@T/ ”sÙ{OŒ³õþú%YVûaÚq|`·?¾îën6ß Ç]¯l²‚0r jH³Yÿº.âÁÑ(‡„M¡›¹¼Â‚çZ¢6Øã€ÆPP|!©F>U¦ Žk“3©¼^iœ?ÚîÄŒÒJÌ?Q@ú™ä¸„;6éY*Ú ÓþKšÝ6;4äáÛ¼Âxÿ¦Dª¬eêxLq½˜æF9Ç3’Gåbåì[¸ß ~c}lÀ§æ…|{záå.ö­݅ë/¾0©Ä¯¼rsR‹ŠùF¿-‚¥§2³-£Ìô)ªžfr†d +ºSÓiÐxârf£z5; ¾c”í¥Csàa ˜m€nÙ³®7ÜÒc4g?m¨¯Ë‹qØÐDæ´qóV3N\–uÚàt¨Ø¹”¼oobÅNÌ)påÉî ´8jìÊ[xº 7”ùN}Qâk#_˜3-æÂS+hÛ¡šu#’QÛ¹°+¢‹ïçl ‘.œé։Ý÷ÉY¡µá—fdþ°M w» /£u¡™5’[Ò°&¦¡6Éß'™–s¬Y6Jǒh²­–Ø'€˜\>æŽ/ŽxL{Exùãb¹‡f‚°ÖÝñób¹ó…2¨f¦…1òÈLMÊí b"epaŠÿ",µüØ0ÑT/* HƒµòË.bmx”=^6y"Pƒþ€ŒX^ƒS¥²WCãTÁÓˆÉ˜~'3qšûI zÏ ²M VÙH\÷X¢HÈ£›Îè”DK‚«ŠXW® +”´ñàm ÒʄA>o— +3ö]Ù¼ ¬T(ÀÛ¾Bà¯áhˆo×Hֆw|rשíG:u^UªÝUªR吩õ&Së'™Z¯2µ®ÿE§–Щó¦S×U§ÚU§Ú]§ÚU§æ«P)TÇU¨Ö«P­7¡ZN¨æ»PÍw¡:îBu܅ª.{(U»)Uû¤Tí¦Tó_*U¯RµúiLö5ë3¡Ú$Tá¨CªfÆá!V¥(·\?#WÛ)WËO©ÕúCµjµj7µj·Z7µj?P«ý'Ôj¹©ÕzQ«õªVë]­Ö‹ZÍëRý­{lzU4Ì¿KU;ûÏ¿1[½š9“pGO‡ËËó_{¹õøq± 4R?àV/®Žy¯:îÀããbs_~þ`~Ïãkԓss"îÍ£÷ä6+¾¼š›^‚­ØŸÀÚôà¶q/‚Jd§b"†™ådsÆBÞ.äµ½p~ááKa­ZF2Éü-d%¢_þ¶|%bø`ÑЌ„üXòÈo92ê#Ò^Mn.,¢ìD4ۆE²@má¨f¨š"æÆ¢ \Ù‚‘³á©^FÁ›-@Áµ§ò¡#Í&+ŠsÇv«(`¶GE‰•™øΓvg€Ê¤k­oè¦O$šÀ÷©;ÍÂVÆæ[àRÔt +xjvµàS|0wyc°þ |“EãêQ§ rڍ ÝãŒÕ¨”ÃJ„€Û’@sgG€xhä½4rå¶ÄV8!æ¼ú‚ÈÔk “¡„Üg~='Ó­Ä؍l2R( „®L–ë9PåzSÁ¿}¯<^!ÔQmf_gÉìpÇȲè!ñ(Yª<òùJ +cÛðèzVž‡ÈtáHWšeŽk"²«‚Å>P^¸)ÂÖÿ–yümmYìzÑ&7~•`JFØו¨}ªµú\÷¢Sy +äF™šÍ{”z26}ô„ÌvZø×#Š%¸Lí>ûFøFÜU«Á™õ½âN;õømŸêd]LP…à£€£OÒT„‰•À`}†éœçœhW²þô†§EYßmÿhûóÓö/Aà½r¡gº&ðÛök;,4‘‰¢;Ü ›“)Óèh n•¡â +BqG{åqÙ ÚGhåáæµ\¡õQõ`ÏÎTH#«Š‘Ê€|‚^”Ù’”´ê¥9½´4$z‰~)5²úÌ3;`";_Ï«ÜD·Aºa-÷;Ý@#AS4Ñ؏K¶0‹qaêÁVQØØðÝ9¥ð@×®îE]©¸•n,A1³Û¸oÏ,^Ú>Qç JhèüCt¤ª@˜QË_q œÕU¤YŒ*pX˜BÊÄ@P€Ñ.ŠÚD(ÒX²#-e>ÖÃåÓó„x_œ´geÄþr[÷ÅÅËcÏkUÔz0¡ÓŋôŠ"ÍìŽPr£§¬ ågQúÕ2µAjç\m ÈJ\T¯‡Ö£%—Ét•DÌ껙¢oå²Á–h{N=ù9ñíƒSßaõÛÂjøcŽ„Ì5§\ýV^¿{ôʑD¶F¬å„þŒªæügʧ>Š†({«egޔ,¹•C¤"‰U¤ƒz«l ‹"ŌÝՊ$*Øæ†k¬ ÁÅ,aÈ’·ÝKúTÙÃ÷Ï^Nƒjc²žrz¥ XlŠøHõ|?ä R[ЇþÕ¢Ök ʪþäÖºlh¾¶ÄMÕST})@Nèr¾Ñ‹YÓt–Ææ^ףU"úÝx™¯I·X½å`lÞç†/ä saœû’uÝ;K']ôÞãd|øÅajæî=™öÔp÷:!ïAÏ²Ç‰]TÍ /›=¦ü +mòɱy1Yˆÿ~ë*ZS©3,*Y"vÅXm¯ˆW€#Åèí~ ©*J8 +äÄûÕX:h`‰¢lGå2ٞRÉQ¨q…÷Tà(Ež¶3†,¶Zi·}âZÐ՘<—·bëÙsA;ØÖr‡û8NÌô eå#¿ø…}ŒIËe¼Õ[~}ô N??_l°†j£I1ý |bò"îJPÙ;åÂTY\ÀWrÿB<þ‘>ΈÒãÃëqG>µé—X}* Ubÿ¦ „¸y½Aõ-û=VN{Ö À`‰cù̘ͤî l”ËÔ0p&¥Gvøg›ÑD{{! +8´ìûJt‰ãIZEr?è>ˆ×B‹ëTE«ëú½oø~QÔ"7Æ•­ÎIÄCTh ‰ªòUËÞCü5/†å!àNŸ²•(¥¶P^´Æµá +$体!³Al.cf×m¡«BN,¡Z“>æiÔÊÝHäÛb É] +yö +&Ñ8jF è¡B±É9GE€å{í !ÄäßYÇ}ÁmŠ¯j.Ù¿#7xß7cjšäûÀ’ #ßú ¯»e’_ðݓNƒwœÐH=Qîì]û¼¡‚ꔶ¶ñ©!Ñܸ6aðŠS]½] ÷³–ëþªèÓ¿9•ùsNyòªž¶Qì¬âÈ1°Dg»žw_ˆÔ®¬Š)˜ˆ:NΈtÓυK~T"iÆ¢ÛòÂüy£B+d\soږ@ܤIԁɒ¤žxÛYF”¼Czė»ö,K­"KfM–!Ð $ô+ÙJfcw2ԆÐçIS¬%Žƒtÿ­¾=žQäªå—Í WaÅ;òé,܂9bォ¤­ó”C®Sέéûñ`v/ˆ“H¾‡é÷Lm,?è ßLœÌ¢Ójí7ìî…á¥ØŸúSp7TK™íҐ­œ6#U¶0ä tǗ®¾„n¾:üRÙξË6!câÉmȗfwٞZ¯²5j­Û2£±ˆ±ŽgG˜Õd"Õè/ŸsÃÂÆHúPÓ»£®ár~¨‹ XHЪy—uYõϕõ\Nޕ)W‹'ÌSʉ›qÀÓ½ûEs®ß'U•cqnYñ$ÛØzHnÔÆ$ó•N­¨bK6 ¡B—šæÓ«3¹¹FÇ ©&Toõ®Zöj“ÿF– pâe;Ÿ)Ete¾-õìWKrå8Üû¾€+øÿœ§¢#fáÚôýƒÌ)êù3ŽŽª™Yxc3Ÿ$ +ÌD§¨Ú¯p‘C›YFÜ]vG>RºÇ í€ÏA«(«9+Ÿš]G¢±5ˆLÄ1¸¦ODn°2ûp´|>`ìï1ë7ŽY}@\ë·6þ9mh—a<50TÎ3ÅÕʱy¢ÑÌ t-2RO/+€/i:0]ïh=Ô¾fʏu¸xˆ¿Ó~¤ó‘Úúx&ªÕyišTÔ¨¸öí¶þdEu#³Ú¿>“§½³gec>ßnÿû/^îð Åæ&KÚ¯Û/sšÎbËb)6žËï4iyc£aû…ÄuC õØàÂx…X¿T‚dØñáŸOW ëŽ+Fmpÿ +ÔÄQ3»`fòùYbœÅ,þ:Ð(Ž¶Î¨%´)e¹I¸‘*ˆ´×Zã ©²œp#m_ M/ø[)‘5êà&¯ Ôý”|ÖZÃ:’Z&í ·ïöD¶L”gYL­ñÂÐ֕Äý3EÛ¨ à ه+,>ãp«áϹ<«F-—Ÿ;²¯eŽ«ßž¯¾´ ›S+Qb`±"ü§{ۜÖ9ùPÎÊJ©UË@ëEl<>„y¯ƒß+Æ`XêP@µµü]ҝ¦-Éù=FS¿>ÉGÂÎNˆš0’ ü&ødðÍ8?¸f4j­qA'ZkY¼nGäI¸Þ®¥rgthwƏT—ƒUÄ¥ +ç/ un0Ú&}àâ¡ +ød{ÞÑg¾í°°8ûü¥úÚA¬½céÂÅuNJríp~Ç]J„ìXšA—Ӎ)­çDn7hÅ|Œd³â¨£åR¿œé­;7 h½BwÞыÆ×Ö6ž•ž{F¼½-ÀRÉíºæ¾x4T4ÀãX‘TÚAMŽhm îf[õ•ê†a9§÷È·Änó™ o­a>8^™°ƒ©½5VæÕ~~ †Rç´h J‰/üדódÙ¢üõ´yÛ-0?`úö); ]3:´0(ü‰ú†µgí$+dНkjì;*Oò«ˆÉñ+p[”à„ÂÓnPŸGªã‹Ìú*gÂa‘¡®@Ž­+ù…dÁ’äÙ$Ñ$é©"1ÜäH„S®zÚ¼"nI|sŽ ­Ö#MT‰vúû #$ҝ€O©{mÝ^å>€Š•:8ÎÛ³ôGÊ®5êYqebFŠI=RØZ55% ¡0Ùv"öÐÄCÓ(²þh!ÁÐiMÅÍŒ36QK‹±±¶Â†oKœ®' v4†ê˜Pb@±dO”§ëôïùG]^W͔×ò5ËÏ´KLrc]Ý¢ bYƒ¬=ÍrD-•õû` ëv®5ØÆz•mSAÃØh²œi_ÛO¼×Û­ÙquQ:Nñ]_åb0­m_UȟQRgߜû²ÙvŠ½3Í ³¦ žCíï[Aj¾‰yß¾‡Cœ2ÊMnªd÷4nˆ‚Ycdº¨cµo±9+_!XyÅ#«—\Ö­Õª ¯MªuÆB53Qùf‰®V°Ml¯‘¦löZPþúEN™‘²kétèºèüt|¨²(W xY2ܙß‚Qúڟ¤_Ž`ìLB¾à›¢ìÏøÈ\åm®ògæªÕ\?n®Ò'æ*~h®òÝ\åOÌՑºaûdæoR¿zª_þ²úÅOä/ý^ù˟Ê_þ¯È_ûTþú?’¿a¥3Çû3$ÆOïnÐʸšà‚1l{¦9'YŒÉ›@ë5`eEËm}Yjc"B‘ç702ÿW>_XÔ°¡7ìùBÐ*­Éi®ù@̲§‹õ¶ðÉd6¦i åú?ZìòO‹Ýþo-v=-vþÐb÷?j±§½"—öCïÚÔ~ÄÐãdèñ Cϓ¡ûÉÐýÆÐýNÉù <:Ÿ ?aèt0t; ºÜ º| ç´#˜¿o<ù&èÿA×Pôd½Š“4¿7NÒ¿»"›´’r=+fϓä5 ½F7ÿHZŽ~XÊaæAe¶Žž¯LeWòÆ俒òBÌaiáÀ¯/ËZcc™4„ð‹Xž +˜/êqª\À#+¸Xè~¶ˆó&R–`eÇ)˜ø£ë¸2öº +^@ƒ×p¤ƒTO.¿ÿӝ?¾¼²L 8úÀOÉ*0 åüˆ¡²q‚æ×#o{ZžAý&+¡Ï~?l¼åÛ·NҞqíÄ_ DŽNë͒oK‚@_2d!~ÿ”B6׈ýÁ}Š=RٓÎÈ[IéEÎñÊòO×7ËA¥ÎD«\;ÉÈÝgo˜-ñ,¯%V4éÛi-ÓƦTd¯{lðXÐÄæçSzöoàØŠ£­sq+Êû~Øã´åø„>V rðÁ’ðeӔ«hfD¡ú¬3âGD5ip™Š{zz>Sü¦0"DY$€3½•zQb\}ÁÔZCÚªÍ B6<%”6Èͤ,¥}Z/E˜P®FG/%V +”g<÷²Ê²Œád¢µ7|~Æ_ ;rª ðö7ÜÓR‹õ:ß\'õW…@˜³h¼œøö"ÕQÇO)WÊ:]Äèü)yÏsÔXÍQ¥ô•©°XÑÉeðŒL$ïw¯¥]PI5Rë#ñjºû t˂ޤÆuq\¯­&%õ‚_p5¡ìFeùÌnnÕª6¨¶E*®‘dQ—H‹9ïk¿¹žrà•ÏÒ´(E–9ôý‘mœLÃz(xÍT´Q¶,2éŽíPâ;Ç`Ÿå™bIºL–Ìšt‡ +¨Š’Á`_ÑåˆåèJ{Kßzn¥6ҁš«$¡ɘËuB‹‘-âBҔTö)ö[|>¿QÜÚ{jήÂÊ·—ÓìJxrâðÀ—”f9Nƃ'‹:X~wCôû‚=¦÷…ÌOƒ¼ð΅«KjŽqÓ\R^íƒä`¼¸”—1Bìâ`–aÕ®^Ð'ÌBÚÈSsÃlÃÑëFИEÈ’Cä\a6ÜVjý¢›IN‚cо¥¨:¹b|ÙAb éÇU÷ÌÅ¥¼ìôÉ;Ë’tœ™v 4—- }^0äŠj4éó䖣h8µünhár²ÑÚô®4rt(«\Õ>ÅÞ—…ÐòHâ¾êhXêó½>ß0f²Ý†4(Å<ý)#vÂÌsz{H»`׈‰Á0²M#> NQkΛ`o¿¹‚iƒk³Ênà.ˆj‡:ªæ„B©ï²n µB×/€§’F"À°nl¥#³ªÐ©?é®å[ҝð!é}ͪ¹› ¨WÓÒV”ù؅ $¶ç*o2'7¿T\#ŸÕ)‰õ—9ë!wwF5½08_ºÃO,b™ßqùŠÍc‚hÕíDÊ%þKjýfWàےgͺª֓+´7u—­ {ïôÊV'éLp¢­y}Z†ïDÞëõ²|ƒƒg—kӘš5ΰðÔü‰Ö4©”gC.º4÷ÃÆtš0½-[Óåäf—J¯éjÃÊú9 j¤\0‹vr<†ir¿¶ìÕ¹€Nx«êcîÌ*4‹õKMÛÊ8›vÁE›$l¨ânÍwÓÊÌ ™× ͧ +_ëûáëW/ÙS°h7ÏyÁÀÉÖÙÒˆcxWÃã<Å%U€Pg~Ž}ÅnêÐã¿Ù¯–ÜȎ¸×)êjäÿsŒ9ƒ`À ÷Æ÷_ #‚Ì÷ªÔn¸ãÁ,´‘2*?É$ƒÁ_KêVíÞI ZN2OA'jÆ +$÷j‡å¬|Ÿ¢Ê±(7MŸ‰66_׳cøòɖˆ,Ù2x‘òbÚÎìéK®6®R0èèïÕY½+•-ß$¿çwNóÿ¦s*ÿãΩMk9꧎k?­í׫Çþ{Õ£ÿGÕcÜ«G{®íïùe¡ؖTe£*g݂¶Àz‰qµ(Û7™êrk.ct•Fkü^Ãm[5õÄÎåÌÚëŠ&®^ÑÞ)3 tŠP&)âdÚ6I§¿‘s“:Û¶<@“)·hð>Þö‰¢|€B½jUº¡œ¤~M®ÅŒg£q>´Ý…ÞFÞÙÁ: +' +¨îPŽ‚]|‡ª=z}þ+R¸n›ïÑ"sóÃ-ˆaÚg[zA¢“j|ép0o +óÝÔ@T¡-ôÐ{rùžË©­‡¸­ì,ä•w¬©B|Â" ?ÎúWÜ­t̸Åg}aR}ÂÂ×úóýy¤VÆq +Á¨êîö=\Ps¹æÐÈHäI®E¢¾j ž¦h¯ô}íãÞUð)]<âQ«ÉæYÀút„å!û¤Ý”á,ÀVÝAÝÝJÚæ:ðQ ã1çÛ·Ö¸ÁXœ®á§›dÐBE´ÐΌg5W&œ½ö=¤Ï9D|¯ƒJ,ç˜ 0:Ä7\ð×âç8`C±Ë™;;tˆédèïÜÜsۊƒ4‹b×VŽY•±¥Åõ:ÎÒ8lò™X}ÎxuâÀºIIl%´?sÝAãùðÓ I•ËOšJì ”©ûvÎstIbá›Nß¹ÇOhˆQâÔîj?íuYpêž`´|é´éj÷ìçFfç‹Ö{4Oèã¨>Ÿ•±3¬“{^– Yr ¢Ðï1C®ÿù›­¹½B±×4eÒÊ6…RŸºÂ”®E½fW´%–ï>_1FÛÖՂ²¤mà£1íf×$å¬jnw´a³ [×LNp_GẨmµ¨LC×PKÃH4°Ýx¼2÷km/¨Ù›v2X+¹ g¬48Å7S9Û0=±ŒBjŒk®ÞY¶·@C‰Ü.kȐ)Ý0é²½}ÌÌÚÑùmŽ6éGõËǤKýJšÿvÒ\>uÙÃÚ 5Xg´Ÿr‚¬ŒúÇp‹çͪšªçu›ò¡K}#Z6¢7)¦8^EBVœj~hCaé—Ðé Ô±¦}ê(ìž,¥R9ãI_ +™Î)؇†ÎÄO랲6î•çBjF`³ÆÌÙӬ⺶2c3}êæD»2©!:×áîãÖù}( ÍXú™³-ál‡ÆVv+//¦Ê¯¸)7.WwæQŽ˜çŠŽB6± +ÏT3ûør+d,f7£oåV-èV×»\·8Mþ(ùF³,ÎUÑà‰–ý|•ýy/ûõ—Ê~½—ýù\öó_”ýWs‡qš‰VM´Ž'nGÖJ>Á‰®—+ÈÀTTO54OÍOÛ7¥T™“QãbûȱÏè‡@ŽÆùxÇݗ+¸&)gZ°ôËÈò›í¼’ãX žY/ ,bóÍc‹¥ÝÒ±Æ!VV¾L0Q·:¿< B9²õvÈÑ{æµ>‰Hñ!Š)-³6†\Õ\"ț}Ä27F@ìSŠ•ðCQ¯~<—®áç؈2ó[ÝÖ¥ƒÞr@ùÅ'£¾ÂJr…ßRF}OÍф2(Ó]<Ú Š•™êàÅ'þÍ~•äH’±{½"?Pߗ÷èÐ}™ÿd$Í<"³º…naF€ºTÓ#|17#iaüîÈþ;L²å%)w“½²ì3ÃUÇ5Ö¿ZÌ6ö±2“þ +;éÇçÚßÅ!q#YàÃû#‡âù3ß0-… H_ýÛ=--;ëú‹£ÿß9zu´™wYËX/wéçîHjºÉì¨=códcïJsçÅu£5ûu)†•WUY<~ø¾3”SÁ[nÁp3BŒaß%0ûÙÜÂ^{—ëQdS;T³À\h歄“D8^p³­ûÝbŸ/°Ð vä`Ï[°ðŒkê … Ðì‘ò_v] 9¤Í$mﳃF÷2Û§X™R‹Ë鬦1š¶\ñüÞÑ W‰TýÃs‹3S‹îÈKIáEÌqDYÕ…C󹢝´›Ìœ}Ïá€ÑÕrÌ¢TʃNâÆ¥ô2´<¡R“™œr1œ#aÊVÊÃÏ"ÀÖ/5GG!wóg¤wˆ¿¶ÖËä;µ$INi_ðý•ëhåŽR÷~gâ!ØÝø¨Âˆ¨Ïò¸‡øSblpÙªd\êS^4pòq“þ"¾z†ºõVYU8¾ŸRê¹­BáaB¼¡ÌZ*Ì»ãŠñ}ž¡\¹G‚µœLôìE#'€Ÿñ—ÉŠÄ`õ–{À¢\¶Õ3Ób‰Ôú¦S,UØç–%Üö…M"áQÉo‰W©º^(ù bòC×±nÍt4Ë9Ù ^qÀBîñrgÿÚÆ3•Ý8m®ÂQ0ñÍB XzÕåu-ÛMIúÁ̄ƒo%ÏÞéÉ®ZÒ&¥¶8Å%²,ÐQÏÔoÇW<±³ÚW¶RÃ^µy‰!•Â)>Jž2}Ríú¾_(Ñ®¹ˬ„1pL’¬rRKüÐÅÈ ¯ØråE)UžGÎ-ÓV¹¡á"IhW²vØNC½9Yä@’ìWØÒì·ü¸ŸQÔªågN®ÂŠ·§Óž +¸¤{ú—CI­á'²žÝ¥&èùæy/Œ*ce°Ê´dª<†¯î.ªÞP‘èŠBkgÊ%gíVXƒ‹*¿¨E&ê®@ôƒ­«I$qÀí!5öXŽ¾”²wPéŽäÙ[˜ˆM·–z~×ˤ'Áèa³RåÚãûÙ$ššyußÌ ,ŸÚ Ÿü³< ‰¡@Éi·B;ŒaÒKº€%Ð”¦EC@Œ“ÛŒ¦Õâ{`Ö!uFÓ¼6ÈӄJZQ³…¸áÈ7“Ϩç¡aëç,}¥Mct‘Ë(z±ï.•»vÞ¬;Z¾Ó¬]ATƒ˜Y‘&…ô®ð‹zfßYÏÀîÐË´àÀ¯‰÷—ö¦®6Ò¨ŸÚ¨÷S  ]àà+7Ó³ÎÉ͍´¢»òÐù¿è®ÇÏÌ»­ÞJÿ±l'e +P"êùúŠ¤˜+ÆÄd§»ð2s†ó|âJzå§dÖsœâ#wxÆ7³qsþ(c›Û „ÏÞÎÝ!Šõ˜‘v€[ÙU8ö +íËĨv_ÆÖ>¥]¶+l«Ó/[–”{€ ­Í··0}w”XÝß.Û·Ø~z#cTÕÒ0íTþ€”Sà@,¦„ïÃÊÆjÕj®¾ 7¼”ûý„:ùoÕ"¨®2 ü;ýŒtىiT%gÝgLW|´õ5xà +Òù¥šµ0ßk6`0'9“Ò̧dqÎåÈ J®µxVàí£–ì+¨Ø ´—÷¾ ]Y†c$_Ú®¶±Ò €‹s±Lt¹Ðªqušù÷ŠºT(}aÒådø”t"gœ°âæWÁq¦áGVù,ÆMÓG¢•Í€æzuZÚ¢ž +¼h\&„\N¯Ñӛ\­\¥kÐÔߪ»zW)[½mÖ-ò\€ϲbL)¢;³mqãkRUíWô¸b··ò1«ÏÈû@5[û –h>CØaÙª€.Õmòþ"zñ‰hc:#õ€íëåNdüOû«ÑúË­Y­aªs}Iãß$ÕÚÁ±ÀR˔lsØzÜÒoeyGï"™,Ø1“ÛË/ÉÊ +à$C×¥±C‚àâ¢Üp¢ZšŸé‡ÊõÙäg}Ìø.«Ø9öðöñ‡IÕLL_Iõ÷$U«ëþ²ù–Ùæ;UÅb?ž^ÿó†£k³Ù§…èþËÞóÁ 迬yjˆî²ÿõà7üRùÅõF¯í6ű†¾ˆ_ºQ}M»°ÛÂo×.âk—šáùȉ{Fl×K£ñ–âZÅ-#Ó(Ð(º¤ãnû.z„8¹­†¾v% ¶žGr•oú¾Dª Z i³înÓ +"×4l–ž`ñÌhd¬'³¤Äþ„•’]¨Pἕj]ÈՎ½´Ÿ ”ór›Îyk{H,-ˆ‰ç\՟¹»^Ù¹Vgÿ1Ô¨ gU¢ÂmeøŒœ·{››žYëe°)8€jãc¢e„”'±zÑ9è†û¬N³Ü•*På,澘vX.ôMaïòšò®ÃØÁ´=3åï¿TKXNÐ:1’ xŽ|ð¿Øþ…Þ°„íå6Å3ÓñúŊÂçÔ –°–Ð×ÂZC»¸Þ¨þEÌp?ÇsÊKù>§Gaٞþ}ß4Ÿû¦ù¿Ò7•ÿrß4ú0ö¶Œû¥¸]â1þ#ñÈ7õØ?U}W~W~Wù¬ù§òўå£ýZ`zÂm¤\6Dy<ÛtÖùȊ«{„jwœdªU@S(££4îÆUqøÞV D;±uɵëMÑx¥0;33 lŠP&/bfî„’N{ƒà‚²k'Ã灆1åíÀǛg¯ÙÅR3íJÍËÛQîƹ Á¼9¥<„ݘ¸0‹qzF’:nB­–ž3íܑøXhy‚…£--ïD÷ñ áÉ ÝU®°ó½•‘Ç5ª0"êXíâW»e9mü5ÿbšßbš‰É¬>[E5ZRß +Jró©œâÚºææ¨g¬PÚý+~§~‹›î5÷ó9’mߧø(¹eÛ2òû…RG0J‹ÞñÙ%7YF L~`͝ö†ã]ucȉbåvËG[…A-òü«ÜИz“Ðtpñ\«ðÆ{ó:ɁxÊTj`?H³ßòã~F±Š–Ÿ6÷÷®¬X-û·§^¼d|ã‚cŠ j㞻ÿËÁ,Ë- ¢ÂÉPë¥Êž ÄÊ7÷ík(=·²¡/½çÈӁ}µƒ»;7žä`”V©1–˜69j¶-XÛЏ=–£oAº‚Š.T†Ä€\G× jÒ3®¾üíÀ`„¬<¹öø~6iɵæm´÷{wëu^I +ˆq™‡ó,|“€M½Ð.žNÄqˆÒ»sƒ-©ï':Pa²_жËçÉVÏÆôM¢žZ¤«Ê§Ù*b$»ïä z6›¤?žÓó'ÏFákéÿÔð`+òmÒò+hˆ³€‚•sŒò*„‘«"Kÿ|CenfDÙ¬a›±`‘ªY՗Ùw÷ìÊ»8T`ýqÄ*UÉ£Cg™S¿\QKq"± ³@ï¸í4£¾°£ÊôIã nfˆ`8ª†ŸPy(µ™WøáÍ"95K[Í)ŠŒ˜«M¨+Ñð’#ù­ÂQ\-?ÅñÓU.˜9Û?îrô¶_îRe2x}hù¼´0%„c…eunÀya©’| ÈÀ ^µª_ÞPMÒ¾ÆGnŌgãæüѾ.Œ6êÎ&ÖT˜Q@ºÃÆ0éYêãNÅS€ÿŠ<®oOˆGñ +ç¨6_Æî>ǸÁš«Ãk¼ìˆ1²oZó0ÞtAô¡-ˆwø€«ë¡.Gë_ìWKŽGÜë}äÿsŽ9‚`À‹Öfî¿F™UõZK€ xmº3^ý˜L2"˜‡\{ǚª!´Â'ŒÆßLÞÿŠ»€ŽYù¯øÜ_ØXŸ°œðuÿù~ŽNÒ,ã8…cÔuO‡‹¨¹\×0Éh.Jì„hÕO.hMKp_L}íã>VøùÄùWBµ ¾¢ûª"'¥-±ÍÔ`x°w7UÛ¼¤è¤ ú|ûØ77§kùi+Û¾š`„Ë 6ž†®L¤'»ü½É¡s‰.…oª”¸kހÕa¿á–¿Ž»œkç ½Ä¬2¬È7®Fn¥mŋ´Žˆâ +>Oh][9aU—ž(”½KëˆÉ¯ÄÝç¯I´Ã©–yŒ™yÕÇ4QXN˜i)µ›2–()øc“Ìm²5"+z>¼FkŽ´œ€äÛ %Å1 Zs0Ž+9a­פQ* ®Âã=3Èa–°[…W–]µêx¢fÚÒY„`Ñ@A—+ ^C”òš™µ¯ÑRÖDkìtõæÈÎÊ -ƒÐRúŠ!k çï ÙÐÍ7×<×W,u³‡¶¦ï°çL.ꃌŸþT¨)YEؖºthD@&'D¦O „sMGŠýÈ~;ïst 2Â)Jñ¢=†¨]K{WÑH‘‘²½×!€û•¸†¯ùCZ»B š½Ô¨Ç¸º.AfxB_W÷« +"žŒè”ã™ cE6®ÂZí1cÈúÏovÏýºqNÁØÇn¾5Næ°!ZĪÑ£Ê0Ì>Q7¦¯D(j«ÕZ9cb] +©e¬[É숹³£G"â”Æmõ.B }Æò•>g†GêùWýÕetÏñ°ñÍhâOr<~4Çõžãzå¸þDŽÇÿÊñ¼r<4Çå's\~"Çó‘ãyrŒ„vë'Sl¿mÛK}[ƒŽÍºõß·ƒ(æ8;ºØdÞâyœƒÉÄÃV^ QX½ˆÛä*on%¥@òŽ¬Ž†ð/€.ò†ÓntŒUŽé÷/>ъShºúøÐè]í{[ÆMïç+¯óÑÝÆ4íŠ×=‘x©ÌèY±Åògö‰2JªsÿÓLÕK¸Ûî…õ™SÛ~¸Ù›…œû0BNF5%º²ŒŠ9¼>I¶nõɶ¨Æ¸†Á_³fƒÝ—“q«\˜Õ.ã +Cϊ§ý¿×ÄaÖ+„f»…ÐLhZÜ*åð—˜p¬[f™Wç—L>Wv¿½ä¸iôC{Xt5t‘‹ŽÚ„¥©º–òæQáøèä$‘€”Ÿw"9Þ¡vò÷#·„×HPSýc§_ö´á§ñ”珊óó™eW©÷FšòwkM¦]8G„²*2ÀÙM‘  :λµ0CW¹m"e÷aüy•Îõ@ÙKЏ8Õ>$¿ë€†ÁšÑ$::» +»Óö56ßK×ò5uæ1ÌÇZm€øV­ù©@©ÒÂB[õë¸à\¾bE~üš2aMét‘ýþŒ½E‚ÖtßËdc*Üx‡—C)ÕÁÑA‹ƒ³E!w4ÑCrFp˜;Ù"‹GZ˜e2íˆÁd93nêLKçÈÀ¢1”¡ÃȒåÒT ðXVÐÇÆ ^³;s–$©* ëhlW™eiç¸òÓ5ÏUϛQ ¬Ï#‹¯TWӀ„YM# çÖuµh‚Jqm]MpAv½žiF°–Ð\¼ ´Žò:'©û:³N 4;…rù ÌÌÿ&)tl`oÓ‚Þ6zŽ·Óß –Óñ¹t-?u@F×T(Ý^õÐ~tpл< Ì4—2d45G–}ûÜôö‚âNûž%ü‰âa–îÈËý;f@«K2î&yeIý¦#q1‹k½±ø×@‡±¤ ˆnUÿ°Fˆ¤÷ã¾2Ë{vnd% °Ðûâ éÿŽ×lä=az~qôOst1…5ûÅÑÿ÷]0„˜eÃIŽ´_ҷݑLšÉ쨐;Ò9Œ%Y1ØÛjö³R ++Ï©²uüôð¼úz*wkó_+5SØw Ì0·0××؈8ŽqfK~hæ­já„lôO¸Yè~´ˆór–`gkœ²¬skjdI¶S¹ ppüD:Gôdy ÇÿÕ½?vÞ5&- ô˜v¯ê H9¿0bè܏o떍Og]1WÍF]©#¿6¾ò×IÖÞ9ÞÝÈžâËTZŽT(Bâþw.窝gªþà9ř©àEg䝤ô"ç؇²üÕÎrÐ)4y`ÊM™oßs8`¶Ä³¼VXѤo§mtÌPX›õ¹ñØb:ÑÃ6a”òæ{àà—š£#»ùåÚ¯Ðz9z|‡>X&)ròђðý°Ô$=íʈR÷igâ&²š4¹Le >³¼ÝSü¹0ºõå&ôú0jojFÉuqùSk më&CB6?Ô6ÈÍ´¬”s\š0E˜®AG3–ŠrÅ!ﳆn2…,k9›hí]##€Ÿñ—Õ–ÜêB|½åÜ¯®}S€ER脹å÷ÆޛTG-¿¥\¥êx£C¤ä»¦£ÝZ»?5晓l9`!ûxÃs~mã‚Jª±Ú\…WÁÅ7v è]jd—×õÙnRÒ/ø#n  {†>ß+¿je›TÜb×HÒ¨K¤Å\Ï5Èߎ§xig +’ˆ!‰È}Çû‘nœMS<”¼fú¤ã²üv¡D;Tø͵Øhu—@ ²HׁI“UFj©€º8ôú_®Ünmi_™GÏ­ÔV¹¡á2IhG²vØNC½9]ä@Ä+ìiö[~»ïQä:q4ßnXùörÚS /θ`himÜe—óTT=ßo†÷@ôû‚=¦ï¥Ê­A_xgàîšêãy®(¯¶¡\y9piÙ_á $§¸˜¥EgØõÖA/èCf#mÔ­Áaåè㠈L0ò…ä9X˜†-·•Z¿ëf’“`Œ°YurÅø~‚ÄD3oWÝ3·Æg;é“w–$+Xú¤Ã]€Ð[˜æ¾`É"4ÕhÑ% æÉ=GÓxjù=ÐÂåe£µ ^äèÔ¢\Õ>;¢©7Í@I>W½›½¥¿=ëóc¶e†Ãž-³QÈn„‰ˆ0ëŽYïLiœ21f¶¢©`ƶ`µæÄ öö++¸6Ø60«üî‚ vH «kNhÔz͹µ VèúðTÑH˜âƑVŒ`W:õÂµüDº½ZT’ï‰vRэ<\A½œB\Q$dW.°Ø¬¼ËœÝüBQu­z/Oi¬ÌqŠ‡Üß×ÌÆà|é¿°Šåüa,Þ5 ¢Wi—ú‡ÖúÍ.Á[è³&®*‚x2BûTx½ÛŽÖ¤[ÞÍú–àB_óñ%,ß%º¯Ëô-NžS¾MsjÕ@ÀÊS÷šÓ¢ZÞ¹˜=Ü3éÂôµj]W_Û]J½æ«; pÕ"¨™2`ïÔ|g$ÊE;ª—gð‘Õ—Ü ¸×²¨iG[÷¦ ´I†*žÖÌù4­Ìœy4|¬ðµ¶_G½dOAÀ^ Ý¼÷G[gËäcïò®NçæRuævl§©ÓÌ?×ÔcucrĄ¶ú~֜¨;DßÿkµÃr&ßGT¹å¦éWbŽÍ€âzs _B;Ù-"KÎ .B.¦í\=ƒÉ5ÇU½ú[@Vïêdk7Ùo”¹_<ˊkª™…¥½NjªýŠI´‘eåãSŸÈ‡@*÷z ð}ÎjÊj­ÊçR×&-b<›ˆdpM[D¡™}9Û ÂIDØ¿¦¬¿pʚ âÚiãߥ ݲÄS©ÙÈqKp·jì·Æ¼£wÑÌ úç.ÒA&YYìdè¸t-ô ظ¨:œª–Þ?åÓfþ/ûÕ²d×m÷ó÷®ÄøX'o²sþ`Êå,FI•õÿUAwƒç¡;);Þi! û’‡AÝ(çgƒŸY໬|çÜ#zÇ£jæ¾+®?/ª†—3:ø»Ô© J¬θ­ÿå'Ώ‚¾¨;G.÷ÒõÄ wð* ŒwtéW®öJì¿Ôøb¯°d—NœÅç/æZ@_h£•ç¢á´b¯ØVîî÷@T\bbÕ͚žá+ÕkP¨vÔªú‚dÃGóé uYC0ThkP©)8¨²5Æ;’j;²6Sý%òPm L#QZÖë- +BěöÑA>b$ií¬Z zf’Ž!25ÆYÉßT¨pçJÒö*P!‡Z²ˆßä<±î;×öPˆVÞtÖÓ>+üfç³ éêWzÔV¢BØú9¯ ¾7µs‰®e؉Žhf&JG0zRm/º=n“×U± UÊO@%µê÷Gõ¶,4Ëߧû6ðòô(Ò¤f=ÕhfjV•zŽ!t4Æ=fG{Pg‰Dßã>%M&\YÙYIguªèjlº¶³†¾½Hù«àÉ0¥qõǏppÔÜp-D­¹Ç¡ÌR©1~ÆLÈmñ/›Ÿ‰çv76¯ò6drÃ{¢ïK^˜|߄pE 4§²ûj̪4öŒnó .1®GÈ +¥²†—zƒZÒ6â¯ßÞ}ñ&1—Ù­z3ÀÇCì5fnryŽr>Ð吢QîökÑ1?™y~ :FÏóÎÆx@õ™ê‹@F†j‚2ƒ# ¢Œ*€ôxj³@dɕË1ë¦disøÈlJ ØW(3Ó±3íAŠ¤C·+cìGrGî§Üvç"ðúýlÌé…}{ø²s@£E Œ}×Tè¾ïPáh¯-…—À]¨…X¨€äõ»µ¶ÛY™fâܤô;`ôXiޚ,³gŒ‚U%vŒšÄ/â¼gåÆÝz^\üNE$< ˆ³››†jý2¢G +‡ŒØpO”]Q¶X@ìl±SÈ}-¶«k蒦øoÒ˜«îñ­J<¡ó©JÌ3joçT¹JDUŒõöXF¸Å‚UÖ;¨,< dpswKf'æÞc˜¸”–•`U‘Ý£àFzÀ}š‡"ñ¸¨Ã!Æ>ÁcpÙyúQ´’9N?$“Nÿo’é.%óª¬e:‰| úï“ ý¡Ých;ÉjNÞuˆvʆ`eèǪ¡þIªaýÿTø©Ü+“ûþGÙÐOÙP~]6Ô«l¨wÙP/²iùQ‘ýÉWòú×݈fWÉøÁ¾½ìòvE‰•æí,p“wªQ¥À®ªT,E¬:çØðˆ’EI¹Õ¥,Ï:Í}JyqE‘Þx¨±ò Ý2«2l(‹6„“ÁP,NSõ³WY°, ɒhb8‡Â˜qŠO¯~H‘O~´h‹Ñ¢SL²…~‹–öæÅxH¦Ÿýß/Ÿø1?~þêãüýóß¾¤Ç_ÿý[óYóŸÿò£?ÑW„Ç××Ýhaù1^µ£P§K`<íS1ðÂsQÛ@¶æ ô¿_DƒìÅÑ OòbQN{ðúrûýöÉ}»ëIûøЛWÇÈJ7lPÔ~úFµû~ÃY£ð0pOKéSð'òD__®¿rýŒõöf{NGÝÌ8ì{—y½!NœÝº¨à3õ(æi’¹{'ÿCw6¬¬unžCÙõ<‚8aع5æ+Þýð̞éÝøKHƒ~ñ$ª— †Q´œGÉ`䦌ˆ$“L¦—Ï®:“z×̗ݛˆá|˜Îá;Z›f wÖt¾n·ȝ?d¼kõÔßágAe× ·±7¤-Ñ5ËcÜ>øa}Z©+‡;¤Æ·ØÜ£—åw˜Î‹\Ó°\Ò°|¦×ùó§#ÖpÒòšG´Ú/QC)>yj ½ r…Y$¬l¬’«Q‘ô¿©@‡Á¨M­ó­—(g.4ˆŒ=78WUp’úò[NcÇÔ8‡.ȗ«§heÆB‡IeyRGC3’#;½u…É`Eo= „ì† '’°ó Â\)ˆãwiž¼êQÙ*4ñ~3)LsHZ¸ê5y@]ÌÔ£uäaj •4œã@Å^²» ¯3…Úô"@äGþò“¯9_½%´m̲“ýºÒ6dt…8F›ú΢ø.lR³UÅIUzL)Ô¦¤µ”/§²¦) V”)°ډfEÚL¦®…¼f“>Iœˆ«`&^³uü¿ ü ^¤¿ðx`Ié;['`Äʐ*Ø©Þ°IZµÈ¢º³T<Ñ Ó†”„[†Ž&«yå„ôË:fÅ{Ö:Î9)Z@¤u•g›ÒHMÆlW¸á©²˜ww0’šÈ,MZ›ÚÈTù`"›P°ñgN:ÀôΆ@¯1¦O/áñ>ø‡»5î=»dÆQz¡B$IºëÎãE2r±' ~göð@c&±kºnÒè‡ÄW‡™Ú˜Îp·îC Ývš0¯ŒÛ2Dþ¦IuPeÆj¯®--îȯ–;r¸÷)ê6$êCé<…ôfî¿Fõ2ß+WOÛîEfS•ñ”©Ɉ`[¡}MÉý—¼ <᜕p_ð+Øm¼¢Õx|ü@˜\/ ×؅6׈K¤§Z t:ç} -Ã/2pêûڋàû—Ç^¯q¬¿½öýY\¶UP(î*^éOŒ{P䝽@ח¦0ŽâjàD·Oñ@ƒzKb„³¨«dô`1Ð?µ|>ÍÜñÆ4£|• +±ßJwH¸íÍàÏÞӀ ”ia˜w‘/–IJË2Y¶‹nÆw®n—R5ê: xc`²q왽)`ÜÐô·ü +Užóñ‘‹JY +àñ¹Å :œÎ2ÙÞºã%‡ÖF95 qç[BfJwg©Tj‹¬„‰¹ƒ.F劅kYYx©úðÉÓÚüEɳ?‘¼ö,yûYòÆ_•¼ñ¹äùß&yõIòê‹ä՟’¼~—¼£ÿtÉkŸKÞøÉû9ÍëϚ×RóÆgšçŸi^Û-¤¡ÿxC‘A€e÷âÈsÉárÂÆT¿=¶ ’Öwì ‚%ff„`õ'ØÑDeù9Õrù<ûHê t&-§ß?ÜÆ:ÿúˆ•âƟ¹`üøpÿÌïqÁzá‚õç‚~ã‚õ ì{\0î\0Ä5É`üŸ‘ýW.XoOùñ‘ vܱïq>¬ñlA+™´Ž•¬Ë pCµ©èÊq èI¿J•‘«*‘•7™cÕÇmÔ©öEy¸èoà.H,řcÆf¡2of؝••Â.>²¤­W96íKgäàµbÃÎ|7ÆÔ³*?§j +…_#Ÿuòº®¡NÏ3E­cd›¨»Ü›4R7L—õ}YòEÀ«˜m¼ òŠëÙ{m>£àËÍï"Ɔ×"øSŠ}ÙRÅ)±¬ª(¢,‘¯Æs“î]øA:•Î“£}kšn"@N³}%[oòS³.Ýl+w4z^qœ{gÐ&Š÷#‰\¸È°&–Å'O\ú^I ü*f2v¦)·Ôqqfý¼>uœŽ³#ñPaVouÖ4I­ÉSS"È«ÕBKœ^{í?™‰©›ŒR·%K+1ú |©éøùlvgíý6hKaãºê +f*lÑn iE*Öô`˜è÷/ÊkTu™L¶²8óŽø “òP‚˜ÏI¥UI%Á²­`L¶aàýTÜqãr/jÒtq;ÿ@@æc´ž>­i­ÙTé5ßå<¥÷CÜÌ{¿¡¼ÌDÕù{e1(K)^õ,È¡MfÏfÒÉgÇû¾#¾õÕèS@3ŸÐÿ0ÛÈgΣÂr ¨lâr¬RV¸ófd—‘d5 ¾AÏÊr°(2žø|êŽ{Û Ýf IšFeŒ‹jJk'Wq=5o~=ã(”>k' =ÅsxÙ£lŒUz„½¿ýû·xç®R¡^Q[mzÜaÐÐU<[›Ç±âñ£ãÓùÖÙ{„ö9–£p1÷ „­ëå(q˸ñ飿œQÉpÛ7¯#—$Þ±»Ýa*š0¶UæssÏ6OYG„YpyŸN[ÞdÐò™¯ÑAÒÄ'ƒ¶*êÎ\ٜ.p;O¼æº­|1`Þ;Nu{|¨«±”o„aAý3a­Œ+ÚßÚãÆ>¶ò9ÌX<³çcSÁÕúÙB@‹Ô£øJ â°qÆPv¸Ã-R7Ǧ*Õ77‡…‹i೚ ~ ¨GâVtõŵÞԔ&&IEÐYuÿßšŒ-Å°ñx^Õø–Ю&a§õ5vEѓòÏ³¦E]úhsö`&é`‰.KQî¥]cƒÅ<¤4üA=@ǂ-»•aôç)¾°¤Áá§FÊúý@‡&—]^­2–cëô>öÉL\¥,u#GU©6)k£ÉüËù‰ ·£°œ*1ùºlS´¹&/ÞâÕªTšâ59†´JP(#Œ® ‚ÌîNîÖÒ9åèÍ«å!ŒSžÏöÙG c‡K‹ã9Á]#Î+j‹,í‰WŽŒ¢6×ÝôÁK½åÇû³» tºQXý)ûU@¸ÃÚ߁¯ô;øˬtSZÓùB-Kþ§(=~½¿þ<Ó}‘³r&8j>bùÙ1nEWKªë€Û¶³ªÈ©þâÂN5ãKÞ~¯ßðñÚ×c‘ûêgSºÐ’×ù¯;¯àj-ꪭÉ»ž¯¶®V”_ù^D"…vµÔC-ìY»h—My%™–6Ô4ÌÎ!›iùúp!F󋤗©ë]©«Ñ¹†˜Áo°â«7ü«¶øÒ÷ÕF)ß[°Rm|+¹f ¼d(ʌ¯Û #‚Ø¢H¾6ý¨vvÄî¸ï*o+4–•dä(ÀXϦ‰à½Bbp?1Ïв †utfa§±‡EÔá·±£ŠwC³6aïi9…P–äo¼IŽÌäÉvÒZ¬ÇåFÁµñœ"“œ5iuK¾øý°QdžI"ÀM¢2TUK^V²Óz0KÌۓ=T÷é²E a¦W—íUÙِ%˜qÞэÕN›8â—PP9°ىéì4¶8‘ayúɘÂ` ð¢±8Ù,í 7kq4¹…¡!:µ¿EÄOqÌèDbOÞ4#¨¹“X\Hج‚¢$ËÆöá»'­ÿŒMÍxm­$’Ýß-T8²,zɘp܅F*EúyäoÄ!Ri\#Ý&3ÈcD¶“ °í€+ì- +BÒ ëÁF×s`l/N…8ã-r,ǃТ»$¤›È?~𠊀àB?ÑU“ -ÄÖáQ_4/^t܀%Ò! Tƒ³³ï‰¼i:tcÙ>َäh€YИv˜µݨ•®Rñÿ±÷®×ÇÊ£:*8~˜m…Þš 5~©é +Œ”îџª FhÁ×ZË!}·ÕÒ:øÈO/4I{“oFô"åôzu H xÒ¸9¾^IˆK![µ( ²èVPŒáJÕԂ —’^D8ØԴ澡ê–g"Ó:RD” :•®ú‘o¯øM’Áf+Ó5d=_ëüõÁ;ê‡Ý"Ÿ€a¤åŸ¨Gy> ¯`®yÚ"ëÍÏ(ç ‚iÕÕcc·pr¾gö`¼âÇÓóçk“ja Å`#êå¬P·ûMWŠ¼ý€ß «Ñ+Ü~ç.úÆlͽ}ò`¡ãì»`è^1*±^†ßaúì àBAƒÃ²3½¸º²kÝ-ÑPؗÙ½S§åuS¸-7GÓjºc|Þ\‡r\ 1 ±4ù›J2 ¥Q1v5k/LÑnÄìo»¿Ñp¢;Å#SÀ .ÎY>m]Û(jmkQ3ÉÒá8Õ¦*8-PY'ñ;î‰vŽ.°arŽÎ†Ác -]:%°ÎjÈ;Â×ÛCÛgUn±É +.dFåM4;Bx úÌv,÷B‹Š²Ç܋áCz +À2òÞúl~K!d¾fÍ]Š¢‚0,œ^›®ŠŽ ü¦N÷$¹1_O…ÉÅãL:®E¾°èík²ËÃÙ²6™žìûS[•ä>äa2ノü„3à´ô;ºÑdÒDûæqkݦXICå«…²8­³çÒ©ó)ÛeLßLcHŽ%C°Y½° ôž¦¥3ªÖ՛VoͲ³I-Ö„‘-ªp…/œb¼áWéýõ~M×J X)ÛW¨¼‡’U%ÓƐ™ƒ Š|E”‹j ¤ø”©æss;Ùé חj¿ÑTí!+KVHyÏ¡jۖòD _–ýr Åh´UKžw/™Q/²ö¡Ø:ȸ‰üàÎئUѺ³°¢Xy;jWBì‚,m.„E!®Õ±‡¥§GÈq~8fPOpùxSݽÅT&Aijš2àÊj(‰pÉ+â‡$oF3óB+g]Ä:ÁMám.r«Ùóô´mx…AŽ¥–Žâ—„:²œDëyQ,ÍíW z1ä¯t2A~)ŽÂ´|5h£I-ÞNr ."ÐV·‡°šø…–VÅ ªY¬"7œ +ÕÃwe6 †q<;¿&±.kFvï +²’÷~ª~ì{h31jµ¹mc«–ÜnézW4‚<Ý°*oKqR‡¨ 壤vÇ;ՆZÜ~œÓß±´ƒn¼ÙCDí÷œ¦aNVvþd •+\«x%÷¢>}»jHÇK…­)“Tž¾Ë&-Ûý4°QˆÎ»¡w•MJÞ¡ÌkliFæ3»,Ô}‚(Ûj÷$ð|ý‰‚«Í0Cê/05î‚4Ìå 1£v2–.‰’îb;¯@–[c'29©6r7V±™èJ©ãûý.ø¨"¸0l¾Hã40­Ìd2SQ&Æ_ ÚNµ¡ÅõԙE†[',ùços½uÔ ý†“,/Α͡«"u°ýaӔ地±N¿È+M;PE*{0‹£œ”1ãt*²ÎIiòÇFò‘Š>•×Y zÊð\ýLŽ¢p5y!…[I³m˜¯R6H&K;d¨0™Ý95è,KÆ]´ esi-ËY­¥6Þk{»âCMC ßË"µ\ ,š­®¡0Êfì.然GwÊAUcÕ©±è]üÍc¿ ¶3–‡Ìgšä؜5¸v6Àmµg/‰ãÒ׀”ÆVºQf +3ËY¸ÎoÖ/¹À+¿È[š*™pѶíЍR:L.ƒµé!´?gNò¶vÙLÁðÑÔ6»ý¤Mn<©3²Áœοt¯‰ÅåK©>yaBÔ¦U+•÷eÜF¸üµ)°§zÃmé}ì„,æ…ìÅïFlRºÃâÛIs»”ìeÖ¾Ï-~×Ë+üq{Òà€ˆ3v@Ü{Ž þª/ÆË:Øë ¹ë“ŒícU(Hø0ôH’:_!R¬—+L¡ ¡ÓÂ~‡Ò½èNÇ.…¬³÷î’âϤÓžë·žçóUÈñt;ƒ|3It(×R}1_±^¬'èi$|6.ú†Ò§ ·À}$¸ŽrO³Ë.…«ï.On«ø†ŠÓªd7ɄeK2fÕ kÃ–\WD>”³ßÆò4æî{^cn®^¢šllMWÔbÇ@Ç^ûÎ:K÷3‡†q²[ÝØþ^,}pŠž›ôÕ¾¯b[W|AN-&}ñÌ~<¿ë6Ù ¡U¨#4ª—"«ž#çMR=›¼}¯3mîrl–]&§RlÙª™q“¶QK»°6foÁ/=>ﵤY#./Ëô­i]w}Ëkònèm“%¬úGáD¿3sBUÌ®‡¹–,„ ×ÃDڇ2ä|C<šSV«²|]-IËm»ùHnиq^L»z›OV½V¯®ó¼Çjžqh[i?.hs£<ôÁê8v’J¹òQWRCíJž¥Ædç^é[ì¾2¾Ä¬2)¤Œ¾±÷Q²©:*ý–«qØï²DE;¯EíTÛTÕ¿a¿ªj(M„âÂâçÝ1Žº6ðíÖ²¡øÀÓ¸Šøæ†4‡˜J\æÆm<ó(¾ROr‚'’£²ê8±JàÚãíÏß0æJ_Ô¬Qû@ACÏê)Ø[?~•??ú=þ*ã¿ÔWKr%¹ Üûº€$ÁïyzéžûoT½zjM„WvÌFzYd‘,ÈL|ÇÝ~ƒÓréÖþ©Aû5ù´´åÅé×OîrL,ôÃáýÍ%IGA^«=a +ž´µÕ֓ì…oW]£Pà–Û .S¶gË¿5m ~×ȪœC¶+­{=™,GË¥þ¥/ÞózÛ90㾙¯Ÿ·¸6Õò–ÁCÌ>Öö‚XQ'YÇg<;Nhh~«ãS KÀmÂÚæ…«GY;«£kŒuÇp“z[¼wšTçº6›4X LÐjnøç…è*œDó¾ŸjÊîµÈ"Ùÿ° +º*¢žËýóYØÈQŒ6îß»6Í2:µY×e|Éc|Ÿ9iû×õ{Ö´¡Bk„Ô\-X³x¨HwKUîÕ{l¨œ‡µ†€j˜Q1dÙtî+L“=OÁÙ’bT^ ’ÐΏüŸ€J4å¸LéSìVu™ãøó×8NÍ­XÚR‡XªZˆ|HóyŽ&÷ï¥WÚu¯q)1-§k̾.».¬ðeõ )¶®•ð…¹3`Ò$(]¯!oY͝ÝmK딣äISniœö|íÌ ÙFÎÇ û ûqÅ7«eÕ? ‰û5{S½\USq»ÞíRÙñØd´[¸k ÑȳŠúqZÎIDï$RRÎÐý6È™½)³ÇzWŸ/"±¶¸ÃÔyi„ù¡Ö|‰0‚.Rìõ¤ÉšóΈ¨„x¶¸ñ/½qO´åŠÇ +ö¿þõ|2Wõ d4ñXn¨Î¬Æ¹ÃÞ'y¯|ŸazÉØoøÔ¯×wŽ\áùÝ¿ÞÕrcŸ©ø?ÎüŸ N}þü' +NýïgÓ"ïÛ>ñyŸu {îpãT|eݨÎuùe³Ä2ÏÛa÷pOãgöK ÎEYÉøŸV¯e¸Ç~íÁŒë<Ö¼E€=&bоↇ}„1ƒÆ¸"SLìDÆ{—.iÆm!»ˆ}”ú@¥Ü”f#{ŽÓѽXt|¬¼¨-˜Ä?è㒩 ÕK€ïíâ1w:ö¢KµØSãZøË¥ÒᶉÊ t­‰P2'+n&Ý^xœþhjFs&ÖlF…–«‹íhXè¼uJd§Y¯Þæä}’Úï±Q=Q:6W\\ºû¤Ý§: V"N¸½yiúA²{ˆ¶Kèƨ$ōQK’×\¼þà¹Òð3ÞÒã×÷ܟ‡B‡"[‡uÕߒßõÃÖþqß{•Ýá_%…ájÎê**kGugÑ|>}N_é¹Éµsæ7KWù—ÈA1TdÅtc_àq¬­¤*6*b?Äë*fþà–çõë~A?_çº7yî~Ê-yØ?B;ډ[Ž ý"©=#[Š6+ήÊb)¦"·ZêE,êU¹ì–x™vJ¶,1/5¨i”›Ã&‹Âòy{&ï˔ŸÓÕ-·v<:÷0/¬‡ý«|ëƒÿjÛú_Hæm€J5oÓHÅø*yŒB^Þ¶:ý6„W+c çqåœ:…×b¸ ‰<6†UTDêæ%ÐVÏBž‰è¼ 0ŒÖ9ƒJ†{á‡qŸM•Ù<)ΰ…zÉU΅bÁÞCY9X”boΔ gbêËN’Z1¬—ÇE½EÇ}XL™HKš2º%'ޗ!7ܤ ¶Î¡Z¦Äóâ¦P.ªí/;¹iß¼‚u{r‡Ë>=¶!oXéÕ­BgW56¢@Ë%¾·PrqGµ‹‡ÂÔì¿ ±“Ë5Ú Ö1¿¨q{¹I,Ñh 8±©œê@È­A[Ã^gŒ"‡LEÀºd¶ÇÁÂg°Á™VxEs34€¦‡»°&ű8>]÷”ñŸ8ÔÄ´½“GޙoÒü5dZI,8ž²?‘JH“…üÅ= u˜Æé6Ֆ1…p³]üÀcnè× +2TuÐE“ç¹ Ž‡¯¢>\ãËqÐ9 {KAyy<ؤ~v~êbãÁÔhx”j+Ø ¥ð\Ҙ)Ýѝ5mTƒŽ`ÓÕ¶Žàˆ¾À-bµÍ´"­«š¢½©™¸=¤œ§WASJБ"rš^Eˆ€¥ˆ­åÏAÝÅ4†Ô--9 1(éđû¨m£Ú…N7O†·M0§="RˆÒQ\. õ–?¨^58´ÉlÃ>Š½6çlŒQð$î rbâ!ÿî9NîÝ¥1éË3·‘4Ÿ¸*|)¢Íä6ð_Ù?pÉTÆ|¥Â ßÌ裞Ïß^y_î¹Óµý%í¨ô½e[Áß1/üI&bQ,ÙÇ Þ¼†m®ýê'&}×&ÀëéÛüo‹½oõvŒû|ß¼ªê${†¢»#,ÃD"¦m¤„(#@´)SÕ#ώ˜%ü-ÁØ`ÆJëXõ`} Vù÷Ÿ¨vŠ|~‘’ÿùDýÉë]3µÉϲ½F1 lkˆ»}“ë½Vïø>`yýüÞ` àèq¢X`Ȃjy««Óý­+eþ?kÑ;¼ý®S*õ›ÙZçøáÁA·9³`è¾cÔa<¦¿ÃòÇ̃*/ }Økð»Ò‡§ëKfmºZ +û±»oŠ}µ»n³Érc´­ÕÝÝD‘Aý<ö[ 1Ú;Výl·PˆG˜Ó³Ëó¶¥N-¾5ðã¡JNɾ 6¨ÆKt3Ýc±Á¡ F8à”Ià\HV¢&&ÿƒ¼ŒÃôß;kfËN‰ÿa怏µda×%Ž&»ãðKI†©”1Š "ƶ"ªÎF 9Š’š=%’ WŠ”ØrÑ 7ç,ŸŽ©c4µµŒ¦?%ubmêPÐ0µs%þÄ4š9z<ÀäìjØùrO™¥‡;¨]<˜LÀaî0äáítÐvYÁ#ÁƒÌÞÄ°„Ó Ë—á>hOñ@æ˜g1\ݐŽ°­šG߂ãÔBæaõ䦨 ¬hzXƐkaið? +…ËǥЋùz+é8š\;.àÐÙœMÅñt¶«C–§úþÔSy9˜Ê»"?aÄl±õô(ô»¦ÑfÒôXyó…™+K¬¤¡ðE¢®,.ç:s›´¥ÚU,?LcHŽ#;pî¬>ØjOˌÒY¡ö€õEí¦Ñ;»e6) Íz‚0²aCžî §'ü%£»ÎazVjÀ)Õ®Bå½lû‹Œ*™¶/YyµhÑCä+ê \Ì®Æ@‚ï@™j~¶¶ÁƆÑq}%æMÅì2±â ud„”÷œª¦í(ÏAÄpeՃ )F›­’8²$¸{ɬˆú¨u~LÅÑAÆCäoÆ&-DëÎÂ@±òvÔ¬t± ²t¸< +6…^„cCOãûá—A=Û÷ÕÝGßÊ$ˆxUK<@9@%ÑÝ?òŠøâƵ2š•\õ`ë7…ÑÚäU«×™%Mx€júQCGñ+B“ÙN¢õº(–áf»" @eH';"È7ÅQX–C‹‘ÔâãÇ`á":Ú¿ps£‰¢¡U1ÁùFUC䆯Bõ0ÀS™Í¨a\¿o“X5£ºsYÉy.U?νtŽ]˜–"·¢c¥jÉ붩±¦ÅäívUyۚ“º‹ÚP>Jj÷»[M¨Åíorz8§v´pÿì{í!zÌ÷œ¦_.Vvþd µ'<§y'w¢þ0ºvՐ>¯46¦LR9ú)›tlö/ ‰ƒBt-[”š¡¬'v´"ó™€=ê~¾@oéÿC}µ$Yrã°ýœ¢.Т~”ÎSá/Üß1@½Ì÷ªÚc{:¦=›ªÄK¥> €Ü}¥ ¼=FÁµ!h!õ7Xv +Z½`Ìȝøæ%A2‚»Ð †WËmßlj,LJ‡áí»Ê€¬¼Rèx¾ƒßE7T$. BLãÀ² 10Seğ ÊNá&#AÚ* "êB}S¬øû/1ä~éŽê› ®¼Gt†ä«l»wq§¬ç€eJøہ¸Ñ’qªكQãà„ñÓ¨Ð9fÉ·D´‘Љ¹˜ÖFÐ4e×TüȍÊh Z!Fì(}I¦›¤ ¢ÇâÍë‹ÈS›U\5‹PUÖÆ03ö•Üølãí~ˆõwiƒPo0˽¾Ì3 M=mQ õìpE<±;«J næƒǎÈ.D,kh ào„ýŒÅ!íLS›³6ÐÏ°­qµ’q\øÞà$O¡óz02IŽºUz£|AbXÚEÜÒbÅtÕìHƒ.TÊ!®*ØÉܐ)sŠ¶•U³ûPÑ ôCf¿ðÅ /lDŽäo㗉¿0¯2u$Lºt$D\µAx`Æ%ŠËßɀ³´'<6ß÷LÈ*Z0u(zç=íI +‹²½¬4+ð'¦evÞgj†Þ £‰šÞÙ®2j*‡Žš-E±L±wÉ® \%z²ÚxaݘÆKw91Ú×lbmú¹`i…î| Ñ#=>$ÿ¬ 5ûL\b'Ã/æE»b„½‹@° êŽ¹±ÕmoªЄvØ[O„OÐsáD8Jg +¯þE3ý±feØ®¬{¯ê3Z¦˜Eá C5:ØÕgø­H¨°Wl¾=ý2¯¨Fà9›è‹nøkô—úð˜á•fçþ‹Åv´K'.‘‡ÄèU–Ñ’å貖R¸Õ.†ôڕðû¿®}Ÿç\p"ýíõäïÏJ3CiÐ< p1¤?ѬBaÑðf‡L<€1ßD U,2ôuA€û)4h¢·dItFpÒd^%ìF”ºN>‹úã7j?µ ½Mˆ¯RÉr^÷f&ÌÞӌ ®ig˜ƒÝhX?AӋ±†ï\½^²Õ¨ñ€ ¾­%ˆc3Âú[~…’ÏùøÈE¥“. }Mèp:Ëø̓œÖquNMvÜ9J¨Vå¾/µ/˜’ŠÂÄÜA½rŵjYÁx¥€ë¹OÿƯíYÿö³þ?«ãûúç?LÿìIÿìEÿìoé_¿ëßúþµïëßøýû{؟°ÿhôï + ú[rº£Ã]ÏXüô$¾©<%½êªwäÉ&̺¨'°áîđç’Ý䄍©~{lA$;}ðØKÌÌAó'ØÑPeù!…pgóì#©—R®IËãé×^N9¸;ºÁX)"þã¸Àÿø_ã‚ù¬.Xÿx.è7.X7.prAýŒ Ɲ †¸À’ ÆO!ƒõÓÈ þG.XoOùñ± #Ub¡O¸E<ûQcWó€µc¥Úe¸!k*:€r\Ô/Reä†ÚY±dZ<|U··N±/JÃE{sA^)ΫlŒi3Ãí$0 +>½ñº^`¤Ø¬wˆ€À×mœi9Ó½òJ=KÁxö9URx,Ü8ü9Ÿup[׫NË3Å­ãÍ:.Q¡Ü›,bž«ö}Yr àÕ Ì6^Pù”á<è&fh>£ÞËÍîâŠ+†ÅÝOÕ'öUuEUyUM­Ec‰‡|5^17éÞõ¤Sé<ù¶oMÓ«øÓl_I֛ôd"֥ȶrG£gˆãÜ;/m¢v_1’È…‹üjb9|ÒôÁ¥?ᕌÀ¯òª|]Õ )·õU3ëçõ]Ã9`8Ñy¬€W½•YÓ$fISӄEß:‹Z²w֓g·è©Vu“Oêõ†FÉÒJŒö_j:~>[=ˆ³ö~{Y—®ëª)˜)°EE+±¦‡Š‰~EêtÖ1$[YœyÇý “òP‚˜Ïi«LI%½ª[—1I² ýÜq£r/êѸÝûA‡‹g¶|¬`*¸:¿ºp¡EêQ|%PqÔqÞ¡ìŽ-R¯Ž{‡KUªs± ƒ…À4ð™å‚/4fY±xPRP_„õ¦¦4 ôH2@(‚΂°}ì?~k2´£ŽÇs¤9G m«v:ßʦh8rRö¯óyZúPÔ¥F1g V%,ÑUS”{i×»ÁbRšA×½OPQô ¶lVF¥=O¹h´…%¥?50rPÎìŸ:4é¸DèòjÆ»[§µTf.†RŽº‘£Lª¤MŠÍóm2ÿr~R‰;*0u@–S%&_—]Š6×$ðÅûA ­J¥é¾&ß!gÊoW—ÌæNsÊ·67)ÊC§<_Ýó ÙÈy{¹åŸFÙ*x5ž5kڟ~ EÂnýÛ½œ4A§¦ë]Ù.5 :YŒÚHKç$‹Ü‹¨oõ§eŸW°Nä$æ Üo厔؞ˆ‰½ñ®w¶9í)cUµdÎ#¢“¶.Qà²Ø‘a*}i|Îç‚©Z„ýàwN>o¿p±a÷¯kz}q~™noí‰gÛÂ97 Öîù=tíI˜_ÜÞ>N7øñÓaߟ2Ü¥µÖ†ÆÌÿ™ÆØýñÿQcìÏǩûX¹$gx¿Oó!—ÝÔ+]Y²éÇ!‹\Ü.OݛÚõ4³MÚ’¦’å¥7ÕÎ4Xc]k`ãlۚâG[1¨_GD-:a qL™— /Üã8–¹¤ý–iì$óQì†JyИ¬ëÞJG¹ò"¡Ñ¶ò¢a’ý€uKv.P,l¼×ó +Û\éÑѤÐÖ×F]«M'§075JèM€×š(JfgÅͤ؃Çî·6fTe¢eÿIäª.t M⦥S;ì¹i™÷ٚ_ï†i µkz;½ }¹:£Õ'{TbìpiñRyB0z#U—ƃzµB5-I^sÑüû +ˆ6Ý92à)=Þ_s?ܾ­H¦0ͨ«þ”üª„ÐúÛãލ™‚^•ÕF*«›u'¡¼ÿzþ<Ó}‘³ræ7J>®òÉ1‚"ÈȒéÆ:තŤ*2'd¿ˆ×)f<`ÉÛïöõñ¯}=¹¯~6õР ÐLбípS¾žZ +×(J*C’—äúÒb+ù„m Ò·0éL¦Hî¤Í#–NA–N-,ôäËÃnTº\dúœ*j‘¿ÞÎ5D~sz†¯ÞðÏêâÿ¯#Ž¦†gjƒd"ÍÂ)â‡%ëPf|ÞfX\)JãKó¯Y0Û&¡;¢üoò«%7’Ýî} +]@’Éïy¼o|ÿ…ã“Õ]-ÏólàÞHU,~’™‘…üB§NWC·›±§ƒ"ž…ô>ÑdAW`û9Ï ®£//³).{-ma õ’’#k²¥Ä½‡²q±ÅÚÚ\V4‚8™Ü. ½a½ü,žFDžXD™@K‘rñ—ø¸ 9ß&M°MÕp’û™Be¸˜¶»¤ÈdB0o*q¹§ŸÎ-wݦò«[}ήêaD}–Iœ·PjqGµ‹a™@A͎ Ò*GÒh/X¿“Ëåå1E£àÀ&¿ 8ÕmZ ÍgŒ"gßh>Ú~wVÙì9XBáIÈA\­! 4;\…Å­Ø>ö”ÉŸØÔÄ°½“?>è æQ"ŒH= t"—' ù‹{@î0+òmªcáf»xÛÜЭ·,fPÍAM^ç‚ØNE]¸Þr,߃ÆÙG +*Žx°IùxÀÛ%¡LϾÙuve°Y8>¼„.¨t>ä° K¤Vhvu8x°ÂÓ¹Ú6¿·ƒä,Ì:ÀVvÎÎÚÆAÙ ªÔñ¾â?÷Þ=|ì<êb óÁñÙÂ侀‚ÍPÚîI‰™Ô½XÓR5¨[›~¶õ«§»ˆØ6ˆ”´ ’´ sÊMÄý!é<¼‚š’‚^±S›Tʼn€¥ˆ¯À—*» Žh ªXÕÒ™ˆ JnîB§›…'Ü&ÈÓî×DÑ(.[ەO ¾ÚE³È2±KÀâÜ-‘n T‰›„P#+¦25çÏÓÑÛ±ªÃ¹§72ƒ~àíýð Ãͨø/¢ì¸çµe~)+ÁrÊßÿöòüå“×éî+]Ë_ªŽbß[ŽóÂï$#ÖŒs¼àcƒ×kûjú®~­äfÀói5;{|‚k²ë—zÙÆcŸ"<É:l` +{-®wEX^)dÐ [¬PJ€9H ™KäKÂð‡4ƒ=V¥k¬z°¾ ŒøôàåÓ¦[+PŒÔüóµ&϶ÍD´²ìBŸQÐÁÛ²®ÇÆîÜdx¯Ù»4è#~l°<~ì­bƒ”gg°]˹««Éý¡+e~ÂïÅè^~WHǁ„æøšÌ™½ùGŒ"ŒÛðWX~vˆÎ– ™´Q°ë~á4K^ͱ/K?VcwK±¯&×m`¶Vn‡¶ÍX×õâóî”ÝÌ.<>v±äÁ&’jP»8¸-õgñM7j$·CŽ†«Ä¨Û†2L7–@ìjh†ö$Œ®a" +b’?Êi8Ìý½³Z¶ÝªÈŸðXG]²’"vì})½0”FDÀØKDÕ^˜œÓ BERG£`CòàJ…ê$ÊU‡EgŽ§cjM½l4u,Ž£IÊÚE v®”ŸF'Gƒ8 ²´BßvjŒýðAæã:äæD¸å»«.ߦ{¶Á +npÈÒ5ïaÚ +²HŠ•&GGŠ2Æ܉áê†4€mÕÜø~»yf@&aõà&ψ ›.›vŠV üE¥ƒ4áêq%Õ¿î+i8„ÊðÝ ÓF?q<œêÛ©¾=µQE¶Cæ¥òæ‡HO!.imn ]Š ÑfÎôÌ©î´VÊPñ"QW—sí™Ò2Õ9½ë,<ÆC3aŽ|ÀY+sú`ÈkØ þ䛥71Âçckj .”Óߟ³_>¿0ðד%ô«p$族/¶4ú3À™4Z˜Ç–ŒýA»=¹Ÿ)r†û©¿¿Ê Tfj‡ ÙæN|t EåR—û\ÀNӄP©Åv¾±Ejš‚ʸÜÍõE¸ •Z×-Òq °Øqê·é ?Þ¬ éTg všÓ阧ÈQuY’&ö”£Qú¡[zŽ¢†—;ã ºånÖÉÕÛS»BJOHzÐ;Z{¦Ý#¤\où‹=çÓO-j±Ì¶†Â¤=VÎg™ƒU²Ôû,™ÇÝ5µxñä(£Ö\jk»ᔪõ²=±vÐM¬Z±h­VöC*>?RýAü9ák¿¾x¾ó*|㏠+ßøZøÖMøê‹ðÕÂWKøú]ø.ü« _|-|ãÂ÷{Ê×_•¯ÿ¦ò¯”o}¥|q@Ë,ºÛoì²î‡k϶„ZÂþÜ¥´;ZI%ʹ5É~åô àÀnO 5a(Ño?,rÒýŽó„¤ˆ©|X ëz=Uˆ7¶.À}$ïJÂ=iyüúǧX ô·…ÁX8|ùÈã¯ÉóÏ2AüO˜ ý‡LÐoL°ÿŒ;Œ&ÿgLÐþ<\ÚÚ?a~W¥ßكVµ2H—VäÀ>í§†Ó_â_fæ›Òw 23cW§±Ž\2+F¿2lÜÞ. }q#¶emh,D+e)Úڅª¬¡_LPU'Hø0òH’Ø!2l¶;ü7õՎdÉ Ãò=Ŝ`K¢¾Œ]}Š)W9qâû&êµff¸Ö‰“áu·~$°t® 6¼˜íƐ®¬„ÊÃÏ©ŠÂ°pã°åëäl òQ§Ý™"ƒÖñd·¤Ý¥;I¤:ü–uÀ,ù"àÓÌ6>¡ò‚ë%n«Æ‘@psødÄØðZ¥©òľl«Þ”WVâ]DX¢¡µcÌM.Å¢ÂZǘΓO»kqÈT }åÁ–3ÈU¼ºu³­Üö_äçö ÚDí~ÆH¢%\äUËݓ¥.ýÞÉü*f¢rS„”[H{ÓÌúyÿ£Ù,0›†Œ8s$ô]gM“ÔCSS"ú_:‹ÚC’ÐӋ»èÉL<Ýd’T/‰†’ñ…—jÔ5?ŸÍ⬽_m+l\w™®$¶h;P´"kfúã›e]&³­lNí ¤RžJó-RiUVI¯Ìà&dÄØGpÇÅå«ðig<×Ì6ÍD»=ÿò³¦…fS×ªW9Iéý°6³~](¯2QÕ,kU–‚r”ÂU¸‚ÚÔ¶v} 0‘Ží}G|ï»Ñ¤¶ª¹iœ"g¿% ª©ã<«n½ÉEWòÀ7èVY 6ÅÅŸOÝpož@±m–|P©¦ªb\ûP;Z;©Šë©m[ÏG¡ðY;IpØ)Æq/ý%;ØL¬‚*éoýïÜ$¾£äjˆUC‡ûO´n{¿ŠáW¿‡‘-×á{÷ 1-Gáà?ÂJ»ýzù”¸eà8ú‘»œ5Lå6¯3—$^2¸ò‚©{ÂÖÖñJï8ëÌô.Q&á–¬O§)o²g9æk#btž kâ“!wRñ z&‹sºÀ`*ìi¯t;/Ì{‡2\׺+ù‚à ê_ k}`ÌXÑD,×ûp%tx±Ó屆©àra¶Ð"õ@!¨:lœg(<Ü¡‹ÔmáaR•ë΍À`ábè¬æ‚_ºd>#žÞn&/òôH2@HÎ‚¨~Ì? +£U‹IG1l¾Æ»ßòjÒuC%š„…””ûëϚ6u¹F£–³}–視ãJ{ž óÐ@ OGC8¥À£cÁ–­Ê0šó£´…%•ö>%0RPÎܟ24i¸Dç²j•Q®Ó¯áJÌÅ«”¡V»%IðôC¾@ϒõ•«6ÄÌ#‰=q9ÞuËÒIèº6Ö¤íeõƒx­ÃĂ2­þOFVp°€_펥iʧ¶%x{Iâ”Ý3ŸÉAÎë¡w“¢oÕºZÎSÈÅ´" '€ÞƼ¾º8é, ïÎN©¡ÐìÈ]X'Ol“âû©ŸNÒ@ùœGpM¤#æ Œ¯qGJꕈIíxÖ;;œö€#¸˜uHóȃ¨$äm‹ìT Zôȯû—-.pÃ.ãòç…ßù…_¿`ÍŒqf¸1ÖxÿvÿRZ};»´0Ø~p-ðæ\£éÉŒÚ#Ž›xv%¬/Úúø†Îsæ ÷Éß?HeÇY`ÊÿCµ?­6óVÿyµ±{ø/ÔÆþjÓ£_°”¸<¤åк†üvSÛT³.Tç¡ò*¦X®6Çe÷¸·¡öfö£O~ i+¿-*U=Ó`ý¬ Œ³³-‰:ÌXȾˆ†º4¸µÑº˜½ÄÈqüsI/.Ù©£Ô •ò¢5ÙXwå£Ìs‘èh[©MØSÌ ÒÉÖêE€wšX lS~ºÓãS  Ë:9Eº©g¢?8`QúFѨKMi½ðð~u4ԋ5{Q¢ÕSùlªšž’ÙáÕ«–ñ hkëy6ª^¤˜ÍÕNgC“®6i÷ÉF‚`m€ºµxi<!(¾‘»KcÈ 'E‘¥?É8Í?°¯€¸î¦ #>äÇû¯ÑÆX¥íh²_„+¬4Z +|¥ßÁ_f…à2¥5¯‘-•óþõ~ýãL÷"gåLp}\͟¤Ç¸AÞ,¹nì®mmfUYJáÎ\§š1À’×ïõûëŸ}½¹W?›Ò…þúÛ/oñïokKw endstream endobj 59 0 obj <> endobj 64 0 obj <>stream +8;Z\799t2Q&9MXSOe$LR?#Z(aKiuZ/b^$_D1^tWc4Ub3W`Jhe%QPi2[Z7%n/m=\%o +'6-E6a`9eB)T!UtWAG`SKIG]\&(I=hk#,?WY.Jj(MKeH,qWRm?;Q.6h/jh]7n!(W_ +#edTt7_AI%f7\E\W9L&]W&0qRPU<-T$)eV3i*X'7[6\$p+.i9kOgU4NGin)n9Wd=/ +Otk8i/WoQ@K]OTV>1s.[5oB^$/0FEB8W9t(at,iMhI*B.TncD/+I&#h+\1>FDSW;m +T9%O$$T*`"6t$.#!2M4QkYdG&#Bs&Dol0!k\>_fgLm[B\`eiWC?SU/CEm9R8;k*+< +0mYU61oI7lBS88.&LG;[KTXBOIUNp=KL$H7_pEku'bNghZuSd$G:Y!0R@C!A9rQIQ +*SS[L!McJn7O1jH..&5[KH(q9kA?s_*Q^'WIITK.p*4f(R.N;87\*Q%C#io`B,shu +(_io'>Xi<\@,#Dl$>5oDP34&)q&MILW39 endstream endobj 60 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 314.3819 388.0284 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.518 -0.635 -1.523 -0.945 -1.415 -1.212 c +-1.666 -1.447 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.483 2.877 -36.883 2.401 -36.618 c +2.089 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.945 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.059 -0.688 -1.808 c +-0.283 -1.884 0.143 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.806 c +6.404 3.94 14.394 5.401 21.671 2.964 c +21.715 2.674 21.885 2.406 22.161 2.251 c +22.636 1.986 23.237 2.157 23.502 2.632 c +23.767 3.107 23.597 3.708 23.122 3.973 c +22.743 4.184 22.287 4.116 21.982 3.84 c +14.442 6.371 6.166 4.88 0 0 c +f +Q + endstream endobj 61 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 316.0977 382.2853 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.929 c +14.603 -31.195 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.473 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.588 c +13.741 -29.6 13.738 -29.611 13.732 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.652 c +7.057 5.845 17.421 6.119 24.149 0.112 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.145 25.948 -0.669 c +26.213 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.06 0.828 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 62 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 340.6773 354.0192 cm +0 0 m +-0.475 0.265 -1.076 0.095 -1.341 -0.38 c +-1.463 -0.601 -1.489 -0.847 -1.438 -1.075 c +-9.093 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.081 6.445 -29.063 6.477 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.894 -29.725 7.93 -29.871 7.938 c +-30.878 10.299 -31.418 12.86 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.019 -12.412 34.929 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.385 -11.451 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.812 36.226 c +-17.982 35.97 -22.797 33.819 -26.45 30.107 c +-30.309 26.187 -32.411 20.998 -32.367 15.497 c +-32.345 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.763 7.476 -30.785 7.437 c +-31.05 6.962 -30.879 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.155 -27.733 2.471 -26.22 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.977 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.866 0.476 -0.265 0 0 c +f +Q + endstream endobj 63 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 320.856 346.1036 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.253 3.019 -9.758 5.485 c +-14.59 10.241 -17.281 16.595 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.736 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.189 11.741 50.056 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.704 42.033 c +-15.634 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.819 2.273 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.267 -1.254 -1.558 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.341 c +0.646 -0.866 0.475 -0.266 0 0 c +f +Q + endstream endobj 232 0 obj <> endobj 231 0 obj <> endobj 230 0 obj <> endobj 229 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 54 0 obj <>stream +H‰ìWˎÉ ¼ÏWÔt)_ÌÇueÀ'Ã0|ð4l ØÑký?`F³º[3WŸ¼0btf1™|™_þúõøò—¯éøåO_·tðߙìøõí˟ÿžŽÿà¥æ³Îyز³Ìã?ÿ|û×ۗ¯¾~ÿqäãøqÿí­•såq´™ÎÙËQÊÙÇ8n圵éƒß]U(˜-Ÿs·‡¾¿]Ç?ýw× ”±\s™õhvæ¼ì¸çNü-gî®&~b=‹Íã–O³àþæç[ÚðVÏì§ÅG ›$úÞâ{ãÿ±¦K_ ß˳¦ýMÚzý¾EWU¨qN1ړÔWZ tÚþ„"tR€IÆ{ú^¨^φñ¦8d¯êüýá6ìîaøۋoçYmÚÑêÙ-Õgßæ3uٚ‹3/œØÆ +àæsن8hX•ky1å•$ãcc›Ô5+ÿ«ãBô†]0ApR8ÂýÜÎ\'Üëž(Ž,OFß/pÏ>ÿ ‡HäµöŠb\Ïٔ4½êTä*àR°’ÿêq•™um@órÄÀ¸Gև`ù7JÊZ¡­–гëˆNáwi\(ŸE¶ úÅÉxÍÄ]sÈ4­Õ@ ^kçª[]á¨ûÛ·ŸÂï•’ßÈZǎö¿ë.{êmTQýP˜†ô‚½Èð”Tc‹ä¾òÌ×:7tÏv&oŸ— bPfƒZ‘ƒl)ˆ™ÿ-tÝâŠgëÃÁ[VQ¥W¥v”–³9yÂø;dœ‡Œò³3V, "H V§¬â7Ùyñý i’¡¹Â0}õü-ÐûFøF£«vcdÖ÷J;i†gñÛ>µâ‰ó0ASÝ£@.í1þƒý'`}f霏5M]Éú§þ|cüÑõ¯®?ÿoºþSx§\è˜þ$ðÛ>W!’ך +EwxnNRz¤L£[ Ú*C܊qâí×eŸÐ>B;_n^Ë3´>#«nlٙ$É(Ç*. È'³óm¶DR*ZµÒ…ÎVZ +½D»Ôcdõ XgvÁÄá|}NrI܇ køøyÚ@AO4Ñ؎K¶|¿,慩[±±ß»sJáþtu/êJÅ­ü¾±F¾evwõ¬â%õ‰ÏãN¼øª§¸¿èŽØ_ÞžÞÊB)®À5ƒök$$Ò' úJu 1T™‘¹‰D6»ŠdK,q‰~J¬D¶=†L¶œ%•îò­‰sBSS$¹pç‡âBå`SË+.^c9- P¤±§Üï×h‚«Ð©Ÿ^j¸÷¨œ}¾6> +¬1…r¥D\Š<ö½ï¢VA– ½ó5¦ÑE-‹Õ)™ü°B`Rº+Küõ¨À?³¬V:û' +Ͼt¤@Rpœ9‘лhQÅ=&Õô™««‹CŽzÕ¹¥/lEçƒihÌfg.lÁð°à¯>œ0zû3M—ì.éBÈWu’ìr^[Ñ͕·¢Ûš##Û2¼ú¥\¸(v yÏIëLuê~.”<±Õ$Ÿ,ŠÃwÝ.€èöóGÀ­Ù|•×¥W(!p ´ÀøX…»šç“kÒ6€J¨inè))9ז$ðJ)ä4Â}ž‡Žþ+ÜÇÔñÇ×v¥ó>^æ èÙßmÔ±ÿsñjPIÎöΕNÇ7™âgÕBïWuÎûKœ +º±T•¥]m<´6D+፨&çˁÖP[4²Ql÷d÷ŒXŒÊlšYÜÒÞ` ï?Qaù?Ð=Ä6D‹5„¾•=Íϒ7¼ëá\÷ø¿|MˆÑ+_ §:T[÷€÷žv§‹Ê·µ¡áH5GêhL+, äÔÜכ^á'±C-Âe,¶'¦~oÁ°ÉQ¥B…QÛ·\4„"H|wE!ã¨ÞhìáÝõ¾%†NìQV£Î*sÅ%à–èF6´ÔT^PºgAå$›‹¥ÚIù}R|Zc¿ÓX‡ ՉàEƁ‰åü»æ³ƒ¾Å äÁÌu0ì•\ènm6Þ¶?Alµí97Ѳ½J …nƒÔNNk"øbkïˆÌŠÃ§½(¨Ú½ +Í –ÖÐc­ÒŒµƒQg=7M–QANÇ“ ÅË Ô·¾ÛL×̈́Drýà8?ž‹ýb\Hnäê^}òôl®Luäā/©ÙlˆùœXö:£œ%Qs–çš °'uP­OÍÔ`)ڲэU_Xë—mÀKÍ üÒ~×dðEû/¤þ/!…ÖÒü]1¹ÕUàSK6 Ëîb’Z‹š¡kìj‚æñª3`P´~*í ¾‚÷½{i,i–›½}%å ¾NÁ¦©nèÁ›ùáœíª‹´û§Ãۂ¶¼é2Hï1Ma´„loFj òøbë~Ò¿²È-·¹yb{ ¿„vc æE³À¢Œìi¾C νH "»K”U-– vçÙ/#{Œ Ó^sdmÉS­aVëŠÌa³«StÁI§lš™=VȀŸ2 4º>„¢xÜj̵ssžY¾î[½FuÍ£Ó<êËêw³ºêUӊûXæy5¯´j² t›{M}Ôłs¨ÌÌê²g3yj¯<Èf|ax­Lå¾/ÐçëԘqåã¾xàÓ_˜ Y½&CO<B̍È5hôFç-f°€:+ >Ng®’Ï +«^ÿ¼·ë>ûÉ.7ëUB„Taë™d±aÛôX)k´ï׆‘…„fdö"WÞS¬RN¤ËÄw.|”üG¼ŠßmTN<";«¼å;Hû¦Qã7Àq…VTÅL\U¥RºÊMµÍÀõàx³ööx÷k†/+/n†Ü{·"3ÂkçlŒéÀ:ϔ›±³6g9pˆñÿÆŦØÍùïkÃSêó.T`5¬^,]éÓy½m¯ºé™”ú½¨}cªºázøÓЂþýjɑ,·W© Ô@ÿÏy¼o|ÿ…¤ô2«n`¼˜¼JEêI¢(2”ó¦Žo®í‡Êo  B;Μmœù½"Q9‰4áƒårµä¿GX¦»I÷ƒÃK&¶äÀë³//Ö`RF +––óóŦí5"Ö^À'Óç³ÙŒ“cÀÏ®C›êÛêûÎì[øIH6֐ä©×©S9Ü÷ûÍ7™éì[ê™rç\ +ݓòþ{ +µI4‡B/bé%ÍMYq)Ô𺻠c¬#49n4ó'Veß ƒ͒ ¿+HM¨ŒŠèšT2w+£ÕeD±³˜º +aœfAdEöÆáu¸hÍOÈÌ÷sº\ì0‰gxú¡*î0ŽKwøžÌc!®-*tŽõ’ÌuU±ðPfÔôI|ßrkˆŠŽ&ÚôP‘eˆ(GÞ)•3kwHÍz †nƒ\ýBž^¶óT%Å-2Û¦l‡À…Uº•ÜA~Ýs8 ‰|9g‘oäNNw.G o;mc‹W:ŽœCM³³ËRbGMW.`Gfh%2sá#jœ=ԅ°´õr3¿@)`UºâLðó×d ìJ‹RçOó°û%ò˜gVn„×gùxºXÌ0-°XÉ/QdÚz«›» è ÇÓꖷN¸:P9Ð|<ýcÍî^ŸK6òáãb{,†e½ùyíóa˜¯~þª²§=ûœ×z`™‡‘ —ç>óZÏx÷q°–ÃË,ôoðaGåeÀ“8ʃ8¤Åÿ +qÌõG7ëÍ1Ö-µùÊ­€­7¾Ø\fj GôVY(œ7j±›—zÒ¹ÐHUY2$«ÿ0ÇÒRfé ŵ¨æ¢,„*鍓î·ÄÒkròÃ%¦LtÀŠ•{À"²³Ó3yc1¡ ýñ\UboL=Èn5º¡"1j7­¡HÀÕ%¦m÷úyu{ãZâhÚb˜ãÚ؉_Ñßr%çŒËüÚ3€síҝ|¢ˆBpwßï8Æ;Ý9iW(C‰x  +Þ èÉ}Lj†O‰/A5¶?jrx»ë>òïÝua^¸õ¶Bœ•±2¬ûââ ¹:YÛØ/‚Ö¼_úé^û·õ„Ðp‰yÁé5D¸ÉЃin–;^bx§(ppõr‚QŽ—³frM3ëŽ*,çB3~R]^þ}"ªÝˆj‡ˆj/Õ¾ó°‰Æíø+Eeîò,*g£("EeŒ+…ÝiQn:x/YÐÊ~I"|µÕÒ u„.S|6xsJ€×²ªJXU\ùDõœªyiÝ¢QY|½häd†QTÿ.±÷û±YNmT‘¶Zã|Ås0D"¨þ¨¿k(ÁÏ䁔©4²´B‘Ÿ­Ü%¥‰3iÂ”=Â;¶GguŒïßq·ªéxÀÁïø|oŽpÑþ‚¥î÷ç|ǑTŽSHe=Rw”tA%ÛúR + :<Õš&ûîK|gK5(‡Ö0vÖK|÷%c´Ú°Ùc0âÐ5úœéäºb•€‡%†Ÿg‚faCâû9â=p˜ã‹<¾¤,LZ ü,²¬­5)³×µ€¢ST…Ñ¢¨6Œï=í;;³RéLó„”aõÎʈXÖ}‰ï\ÁEûƒíä%×Ö£[ðJ³Æi¬ìé,®òʂ–OXÉ_#AßõDÁJP‘P{€‰Kv_‘íµÊ&¤˜C-"aÄùêzÛ$¬û6%YIÓÃíSý¢ƒBwÑÅ}ÜCÒ~ ÈmGæù³ ·ã2Emlt›Mêã:‰-Ç7h·òüôåÊc@bïè¿_¡˜Û·5ª­Ó6­¾¼7T3¹)±C°pCyµž]AšRSèv ±nŽv‡iúø‡×å˜káÖ7o„&¹ÕÏ^vâ}ÐhŒ¯6²™#~ÇÐi(¯@à·÷Så:±‰9ÛWwL#Íò½¶ˆðGéæCˆ­P[o‰4ÛP*&TãƒL°š„BïbÕk|:5—“¾·8íÒÈÍc)—ᣵƵÁòdí°¡q߸™SçµÁ´CÙ×£Ò吝”»IÇLØÐM*Užl*=mŽì“|Ո™ð‚²J×îD¢ÏBñ$µ´6*¹4Ic(ªüµÝ‡®l´¨¨§Hޜ¥Ò°{œ¬Âós‘Tíî³ €Ã5–JÏG=J‚­R¯z4‹D3k‘õkF„֢ʰ”[í*À¦ï +h4†R»0Ò¨$>¢aMïÐÅAÔoоÝíBóU‚[Ú`¯µŒ~€[jÎ%:𚽅À´'ã +Ì8/Ý¡|—­qCÞ{J|¼Òÿƒó ^`3%ý¯—¦™ e ¼:!ëÐL5½šÐ3Åü&éÜåã-ˆJÏÏ `âó„Dý4!¾µÃë%PAc‚Ãb·üDYK‚‚E%MíÅg?ªÕžÜ^LȂ¿ ¿÷FùCaÝá+T:Û+M¾ò ™€!ìWqYŽXŠ1ž8×îÈ^åèu].\µž)ì\ŽËÆ£Õ-’¤õOà‚wEIhGúf°JJjD#EüÆåÛ:jýÒÕÚ)šŠkËwÄÒr ³þŸŸ¿šŸÝâ€ûI~vÛ}Ìg~>þa‚a‡v°öõÈOû¢ù1jõ\Øóóñ³ë±³ïq‚ççÃ}qMÔ¯—xËÏϙ뚥± ²g~z‚Ø@H›(”#‰Õ‡…Å C„E©K@½‚i†1ÏXÚ_ŽGºP@¥Å‹Çr£µª:;ÓË v9Þìˆoü c?)feD¬ 뾺Ì¿ú·Ê¯ã¼\·Z®uyùB³%³¯Ræç\œ—5Zr굍ZŒ•b‡•Cç9ï¾AåЁ‰’±¨‹TଠXùÌ9+[ ŽSr’w!’ýûU’ɑÄîó +~ h±/ï‘éF^ôÿÃ8÷̬*¶¦ÛZ›ÖԅLTDFzø8›ò7ç´{§†fg7fó}rÖš×ç°w,XrŽ¯i2Lânëyœ11ÆPµÓ×Åäògà#[YªÛ§ûw÷TÕÐhfp©°üñŒ:­j3'*O²2šOjðØXJ®¡yø!¸IÙÜ$``PeÎ%ñcfHoê®±ŠÖ-~Þ° ó&D?»¿¯6༉ylZ4Qu‘Óv*-ä½¾ÂUwœF•{7>ÕÀ´ép€×^}æoë3+©•C\¬qi3H¾‰BLl"µ!÷T¬üÂîqSÑjEL…hÊMŽVîª,bÑÕG”Â.”ÍÇþG܍©ø÷ûÍÐ؏XÀ¹ÿø¾ckZ»œØîßyŨ»JºMìXK í´±‰e.¨T;•y¼vOZ™ö „ðÌn)S:EBàZÕ$jÓ÷”Éü͑•¬õŹÍ~bç¡.(>¡÷ÈÛÒö±\›Ý4‰e&‹öõ:ε.m±$ÊPÅK”¯´"S`Ééjû«ºÔXÁv#ÀnÔ˜"d_)•6¬å5cÑZþÓMù“éæXû™éæt]7‰šÒsýÍ<Úx´½xôûx´Ýñhûöac¤Å¸ÕôŸ¥¤šß!%NU0ê.s> )‰~R҉1D&yÝ°åÑ­wmy¾±äWoÁ/æ¥és2|H‹à­¢”4{¦”nZ§T¬{ÿTæöeöÊð_=Ç1hùY$S½ªFR´ndû&+‘+©¾…É°‘äšî˜eCy'e!Vò C%5`§֔®™U4"}Û$.€èÀ¾K`JÇ AÒw+ôù'ΝÙ¿‚6.¬û +K…K–Á„Ã,d‹ Hˑ‚]µàٕ¦8Ö+aKºòªä0% WK°]΢iñI^t§YLÇûQ’9QdyX?•èÂ1õÕºü2›¹~ÏWëúå[×ì֘2"iBÌ&Þk†kä¨UBtЃ‰ÞLRތïÎz„-u ¨Þó=žál’ý–ÝhµáoWÛs…½Õ Kdc€Å7ã²»€lŒáñ3Aø.fHçïxÆӈ•Âó%oM՚µÕªwÉ,¾“ó¢ð­fž\™Vûzâu)¯ñL+{v“¤™iºâ*4 ƒ†Uö¾º™&úà1áîh#|´0ý‹à¦à"„¯;FZ¥Žè}µÿ倲ÐÀ÷Keÿú…¼ª1Žõ]T5ÚºRU@ΚÉccBÊù *MšB>MÚA-žUÈÇ  â£äT¥0Qù if§ƒ¦À1h +ú i™>N*K3ÿ•­eåe÷nÅD\G¡ íêˆï …#qˆ5vfÕ6GP‚ïeº‹ÍŽ{;j¿ ø„vÞ#Ï÷ ìcy_5°YFyŽô–rUk]}aQS2£ H|$æ2º,éŒ#Ú¿ý]¬ÐK¤ *UÐQæsï@±ªB”µMr×S؅ŒºKv+[†û+5ѕ/¤.¤–íú äuo'O: ©***m(1«äÎJÉ̐2ÝæzvF”¯Îv<#܅ú²…n\Ääd3 ¥EÏ"´ÆPêY›@êKÍҁɹ›?c$ˆ*`Èw/žšùj2iIəÒ:áí語Q•%…¼Íˆ—Èk¸*7Âë³¼]]ü”N*¯ÒûËKo/á\ðv× ÿøË+Zµ@Zà>¯?Ls,^Ÿ™pu féèè7lFª«(”Ë«ÉðòC±¤¼¼ Ë.g'Î —Oûzæo_ Çe/é´1÷ô/•Ÿè`&u¡š »à‚€´gÝ n¢±iî‚­Ð|«ç>Ï8RœN +¬üªQ3$"_¥z2Êiß䦜†Õ*Üñ·Ë³þ ÏúKž}Ÿ<ëwòìpãc¯Ë2ÊKiÿï†ò;•vÎÍ.3'åLû.”Ý„B?ˆâÁ¼¶®Ö[sjÑ*d쐞àð¸æ¹6Ëù¼DÖö'ìv!/-]Žw&ßéc „XâZxë+ùfãªefŸ¯Üýõs· ^PI?3&jÕÇD©;Ž‰sÇ3ÆDhD!“·rh©{*ï>cÑÞb­Z¦ÄlÙ,Dõ8®[¤â¸n-.äý9¦N‡A¨öVÙO0¦N‡š:›)Ü“e{WNkè4«ÊX™¿:ÍÕsC§Ãsƹ=Ásä4òÖó ™ +énäݗ‘7çŸy3ÄUNëUÏ¿~=W{g–ösõ¼Ö¥žÍ‚¨g„ù¬ç¹£4MئáèÏQ€ϤŸ­<Á³£ §X­Î(—èûçk`Zþ¼FÏ¿|ô¼¸¸U³²hº›k\rU;‘g.bª[æ¤öΔÆ/˜™ªïªe0B™ÐÌÎî­æ_OÚ&¹@ùm¯êÖ&¤-òݖZóždÎ\Lä,‚/ßØ5 ½=Y8˜4·óñUËúyšDm€/SáÀ©+JðRñ¬D¥JNb]gV”q”pŸh»e´³z¤—RŒ[o*Rr;3SˀÕZ;¿l©{žjj4Sjv*Q¯4ʚ*šZ:°!ÚNõ-’YĚ⚲-+,{«Wr¹òe+7¦rV'„Ïñ¯2qÖV{,5oÔŸÀlñ s´xdY¡>qî̎øh‰Áº¯°X¸dL8ÌBÝ +Ð& Ê!;yâÙA"ƛ0š4 +(éÊ«’ÃNÌ*¾ýæú–ÃiV]c„ýèŽ9‘ë½À?GÖºå®ãE#Ž™fJù/H ‘þ"‘ï#‘~G"ý›$2‹iPDÒ2Šÿ’à’ohûlºô`¢7“0㻳1€–ª9õMõ–˜îñ ?`ì 4üíj{>Âl5H1Ò&o¤yíëa˜¿}5î8‹¡uÞ·þs²m]É>à’ª¡q”žƒÞí¹—£*õbµxV- à„ÁÁJûG¨d?`¢–,v;V‚KåZ©n%¼n!î!5nTã‡H3ÿè^°’‡…0å«@]6©ä|P¤´2»¤äZaú[Dpx„£Ù$o³¤orùÞ·(·ipŠ—’ËLÊÿŠúùK"§à¾A÷u³­- ÓX÷°9 vð#5D?EÏՔð, Ý\Žk7ÆλM-Ij;b•AÍOáaT BaÉ51Ø|ûxFèW‰Òö6±Ëðkæ;'v™½ÝÃ4bük¤ÓžÑë6†·@¡Á, •‚Ÿ:£gÆW‹Çeº(ï³8†¤&k.êíö¾Ô€ùµß¹¡ÈÎÍé¢Ô?æBŸOã¤ÂûRÖ·~1][LǛ ýƒ(Ûbïy®Þ8ˆðø‡4v¯'Ëûì/¾½þ°ÿ š;Ȇz©šÇ8# 4>EUՙD‰ •D1Lñ•5ѕ*>D£Úéï>®1Þ «\&qñ1xbÁL½t?3*sbo[xæÝ,»ÞÊíñÎÎL«}ˆ$5ƁÄ$?ÇM’vÞÕl§hù>@œ<2;d0¡Îb'd»F1G12£z_7È-Zµ"ýÔ¨ERPâö¬JFDîZ3 …a¼NWXÏÂN~ÖiæP +Œ;òÇ+͝PNYU96Õu„‡Q¢èè%/Qds'@bF¡múÊu;ç_cϵnìɦIì‰Ì¾Øsî ÂjM×¥Í8ºsxQ ’ä#¼‡0½Èaœ¥ä¾§Ü§ï_eœÙ d VMe%c·CK"°öS⨪ °°ëÍ8W˜¯þ•/ˆ™ž%{Ú'…aƒì»j(EJÓ"àéÅí¦¨¾ÙöóB’ Gœ¹ÖˆàuD#¡ùS[Õ¾Ïj±ÈK¢ã•Ce­ÜnÅ„j¥ðH¨í ± húvñ^ ·4«—79â-Ó5ëiö_~»ßQ’LÇC_ÿ¼aùüùBٖÃ˔ÂpÃǔ”¯ã“Vôeõš¶º +F‘ÂäsU™*oaÊ¥ûöcT)l#©äžK •qæªÝ][žøêàà ²W×®£ˆ‹•tÆà5/QÔ˕ùê4¤Ü… +snjņ€…´Óø¥ÅÌ A¥}”*—¯cä¡,Ÿí?­ñOTMw×î2f4÷9óõ~C»xD%-ÒÀK/g5FŽè'Va\²_ÐÌåx²Òcle–-‘"VdmÛæaÔBnəô4ØúÛ3B?²òJè :õL©w=“žh%h‰§±¹*yÊí”g•jÖvÿ¥3sß&²ۑ7¥8¸bïì(j¹$€Æ»/žd<Ø6åÜ6 ›*Ÿ_âà+ø~Y!vùã7Oœnaµ‘³ +)Áw\Üü%$½a ¼ç«c²w¢C«4xf¾…ä:ˆ÷Ï,Àæ 6½eÁ¦œªÃ­Bv£IWxÏ–5ü7 ú\2–©7d9µ=î%£[ô£DžŽˆÂ+X˜}]©VÊR•dª5eŸæf¹ÆKÝY•ò£~ÀjmO +G5-ç«É¯ú˜(X¥Æ8ÇÛîñ¥¸XÝ°¥ÇߦËúÑeë¥Ë¶Åp±;A_”‘Á‚ðUÌMŠyÑfÉ݁蒆p®°ÁKêR­°UË8+Ï[µY&…mÿÅHÙ¾=ÕÝî^^PÇUt¾ÆX0‡¹³hdÖՑªX«c‰(a•cÖC(<Ð}šª°,„!¥$K\K©'‹Ye>Ù°-M‰j Ÿ+ÌÙw2Ì$3âG«Òd•úE¥èκ㼱}¸ñÓK1¢#í3º¥‡R,³¼É›TÉæi\jü¯ÐrŽ•À¢¹t8)Õâû8P™ÏÜù⫸[à ©i-߸[K…™DÅxät#¤Ä1 +N¤ÆA…6êd kÇv3{2Ki¡ yWõPKQ7|•M폜E™IÌP£< š½X¿,°’:W|lû•ۚïg½,°J EX©ÇX«K½Æ&ݸ _&tãÝ}XaV­´õ¶‰íµXŸL“ÖzÁÊâúR=¢åêrš©LÛUs‰ o‰üÒØÿä1â;Å?V±…UÍ6b{ò_»Ù¢šuàÇB”S‡Š=ò²ÓQo°àÕóI«çs,â9šX]ŸCïí +ՁuõjûäÝÓØ}€¶v· š+vfÊ^Ñö œ¶OÐÛ>cö=¼¼}ú¾8/]ÃO¾Ëx’^¿‰ùÿž˜sFâÔØaëlý- ÐxHLŒ`Z™ÉÖJóê™5Ž,òH'«ûXã$âª\aþf>ÀPk9’ÀÌN-’@à$ 'ÝÛÉpËɁ8.]ÃO9P,¨`t‘f~ê:äßpŒúV²+{Ë<š#‹;n^2÷‰be¦²}¢8"”äyÄß`x‰!mõHsøÕ,æ\d¯jcLã&F3,X¢Î¶´y)>‘##Y€Þd!ž»|Yˆs±ö +ó›¤ÿw’®èÐÆ·zþt5 7ê¢|nc?ž²[ÖO<Ìkëa½å#¨ìk‡È¼z_ 69s³\cæº= »;¬ö .ç›Éoú˜(ÀW;sá­/ó¾îßw)äÖ=ŒNž¡+ G†Ò^ULÎYl/áè¹cΒoÍ+ ’-1”Oµ««æØϑâ#À)>’宏“‚C䣫ٖ…tè; +pCD²`â:}¤±Úš&ƒ<äùcÜÌâU¸ÖgeD|Ö}rq3‘ßç$=̔ò³%›©‰X”¦âé"gŠE ÏkÂfá½£ê’&$?!Þ2]³~{ˆ’ßîwä¦SÇÏB^=Xþî)‡Ú8ýK‡cŠkã-»JQ'UmÐï5ðÂ#wÅË´ŽLÊ4Ð6—fí玬(»ŠoßUր<"8TU6WmVªø £àFŸKŒ‹è®\`Bƒþ{,Gï¥ì’*ݑÊņeÐòZ£ñK‹™x‚K4S”ù7_ÇÈ£r|Ö먓ÇlÇ}ª§* +ž«Ié=$Ví¨):¼ôrùETBôTºc\²_ÐÌåxŽáãj¶ êÔ"b•AÍNáa ñ.䖜IÁf›ô·g„~¦—eú¡}SøßNá&„~§_Ù¯…>T›òç8-Õ7mfڕîÿL“ÜÀBxuÂÑwÀ\¿Æ¼æA´åöù… ðþO± ¸oï'$&í݄X&Æ÷Kàæ·Ø²óv™r¨æy-ä’aPQ&ªË¤v‡zwg ¡ûKU÷joÙD x?ÆЅXԙB™mfTÕ³f’1™ˆ3H{¨[ΌñlRN@ö¤Ü~&4‹Š¹óŒq`1#²WKaŽ5k-‹ë’Y(çÅf l;WÊlÎôÄë²¥Á˜Vöì(ÚQ:Iêô.C¨Ð00¼*yfKb›“ÒtàéFEÐ]CہMðÒà"¬ ‹×#­R è”F©ù¥:ìÛÄhYä–:˾s‹]¡Ì£xŸ(‘¾ojxñæSò¦°ÄP@°ÁUD¤PÌlÆǔ²ÁzvyŸÓÌ£«~@/ {P^Yµª‘XUYäéå5ƒÊËKϨ +¾@äv´Óß Sú¸ïÜùwæÎÄr3²¿Œ4>Ôåš%ûyu©™’»©ÚÍ93ªâÈ=)F‘Èûã7¶³=ÚٟO¡¦;¶oÏÛÝ«4䥠ԙÎ×¾ðöÓ¡Š·õUòB÷KuV9¦LE¨ ²¦)áK}ŽºoqÁ1‹ô ì ÛÒTÏÀêäs…AþN•¿‡ú„}.Ž–ÌRà=´^Ñ)œuÇeuL7~~Ên+SÙ~ۓ¥qxEz®FAüZÛp”<ÇÒyiúLaü&›²ë@»ŸßW‘7æ¥L…Ž‚Ùód­]ª+—á[ÿ ?H&5dFÝâߺpãYVÌ)à«9œt×I!¼oäû·n«òaþ'£OoÖÉ|38Z‰@8µÊŸÊ¶•–$å[ô˜vÒ{˜Óñž„gŸoۚe©Uw·#F¿žA?AŒ2§6$GV¯•šÆôÑ>a'Œ[##€ÊÇt֟ ¡w¥_ùŒÕŽüÅ~µäؑãÀ½OÑ(C¢þç1ðµ™û/†A)3_•´hczárÆS~(Š FüØ·¿Àæ¡ì8âW|n7¶òœcNîûÏ׫hNۃ\‹½ÛòDÙ®µD“ï˜Ø{›¾¿&}:±:•••ËÒ.ËÒþ–¥=,Kûdü4P™÷õªÐýí.>ÐÆIM)™¥SOœ‹78D9ÖØ;!c\aìêšÂ4¥•ÕfBU,ªšÜy×Ò°@Oû#M“³bêŒctâÕ©o€§LS²°æÆ`x=ÍíÅ2gз/k:—¯•×¦3—ïÏÿùŽÝYyâ¡Ò° |Ar‰ÓÄ¡Ì5«¬qºŽ* òæã©ÿ²Žlˆ°FaðSˆÕ$ÄÒib†Ia‰Ö¿y¢¾Âø|Ç{GįH÷´º!Õ끒ÝS‘!„ØA€¤Hó4G“ã:Jw±[¢^¨ƒŒ‰Â–gÙH ÓÜçªqx¼I¦E€¼¥\I“Šý±aýš9I[?øÃÁ.M³ +žy騅ÓýÀ]êUꮾKÙå\¿û±Ò=*IxÀâ_ŠGÁŒyUzÀ«±z®àÕg„»ÏÊõD}öÙºõYεÏf…¾h”††{Jm½œhkyeNÒEéÁ5c:` (ó»‹îû—§‘}ßø¨`ñŠ×³’V “*(©ï7‰Îãvs£$ÃÓLÑē䏨sœã ûiI@B!™ý¹„aKÇj¢Á# ±]Þ¶"‹5£Ý 1±CäýJÅ$Ñ2o +$¡¯p5¼ðHãk7Ï ç‰“„½óƒx0fåéãÛl»YûfïAf™æ5ƒHiÄ +Vò¶i ˜@#Ü®˜¬+ô6BÌÞ´kõœØ]Efëñê÷ ‘Y +N.‹)7'¾x¸.‰5—†œªÃ÷:p_ò_»FE™ù0ö–GLŒù@ +¿Šù“k žR”ÏÉoëo‘ºNQU^ +kÚ"Žó€YíB’ÚOå’/Û(7¹tûšû±„ ZŽõ’K(’agCv\^P‚æöÏíaDv{·äÒíÓ±¾‹§ï?å’ov¥RYÅc®úä#Èø`•ŠŠEi4ÂPy +Àœ¨—4­ªœMŒ®Ð¬:+ Vђ‚é1ÃÓKyÂÕpèØö8œ¼ò-spCŽaô™H¢Û{¾±RrG‘¦|*L€ŠykÆ:óדBÁöjFJðzV+«#ý±Éinòù)v[ˆ#sT¡†(˜Vë£W6 ¹”0ª?ÍGù^Ý*§0¢$‚ш›Èr°\U7)ÜRüJn«­rÐYÎMb¹Kн—ÿvºñâ•Œí¥¡$tΰDÏÔëu™F\ Õ³W4yŒ6G×5f«Ð ÇxÁùƒ;'㌻?$–÷·x§æ9lƿQŽøöahçñ]Rò÷t€)&ªsZ&NÎ$EÊY¾².!άÈ_ü!—›xDûAã& Í*/Qì § ÒEå¯ÛžáX«Ssd_ÃL(¤o¾›._ÑèCºÆSß+Æ÷V­—A#Õ2ŸÉyRFÏß\(!îk‰Û%®eˁ¶c`’ä%Fïª"c`àæ8jH9%>x öyÌËÄÑH!¨c5m„äÂ2CF0* OÕnSù\¸ç4<ý¶¨ÚRéíEµ©WK£W» ù:…qsMz&Ko` ‡.‹ñ·G Æ#C#mѪJµ²ù´I‹'ê‹û¨OtOvZ±Z˜ãÔð¢»RFõq¦‰ÐO/…ÌlùhÀ£Ú˜GF>ѾóPÅ íOèÎ' +‡sƒ­Ï eŽyd/ÇÔ%g2ÿYk"•É®î2“·…Fµ!Íjc-™ª£Há¨IJ0¼µÓvŸRT^¿)ÿ¤uâ+ï*É4»H¼yªrB] ›åºÞì,_i°n ÿN®î ï)Ó¢ äévƒä ; Ïéi]Gõ]ÍùpzC1žÖðÒËuC§0YÌÛ£É ý1T¹},ƹj–oÄæë<Å ›{•vÚ=l»ñ¨s>Kµ5?ÆYþáŒÿ!gXG&WíÞ·»i²v³“w„®ó­¢ƒ£1ák6¥‡NLkîë)Õ]$c`:ë©×Óùrzjð©ÖÇT_’\cªÖOʪyê·©ªvUUû;TU{TUû4ÅåëPŒn{ÓZwG=’T8emª%Tµl8TI æLåoÆë²1tS‘µXY ì—&R¢c‚éÀ]KET9f“­hÒ1B‘N:™¾žâ–6ÄÊ qbÍgº¤o»|4ÒÁ¦ëòƒ *^⃃3ÿ NÅx—Õ=›Hëuþ(¢t1ª×©•«1|ƒ*Œéå ÅÎMcÿ¯‰-¬œ7Àcr/¦0”=N=@€Ç6‰ºõΣÀa¿Bá~– S;AY蝙Æ”kù¬%6f Ø]œáþ^º.?ôN]ރˆÿw!îßP´ŒÕp,ÃÖÓB@Ÿ^‚þŽ¼Mt~[ Lv&†1ä7­-ê>‰[‰DŒäçEþ™÷³Ž©¦õ5/›Y^ЛȌչòªk'­†ºÁ¢vLåµSY‡Qè%Ø}2˧¹ëñãJ©ú‹¥ÔüµBªÃux`Ã3;w?Š¥râù‚5kßÓÝ­“WÖ5«G+F6Ž› ò¨ê΁Œ9ÈâÞ>TZ±Ýaj'è^õ8ŒûªõêÑL †W¿oèijªŠÙPD¢¨Ï܆]ØÜk¢|±¨\­ïu྄ÉWÅjÍïÊ·ó¿#ÔýPóèðRøµ +i‘(Ž‘è°Âõê/와h@ì€5mvÀÎìëÙNŸãd‹‰ÕÛ Ù*²ÒèZ;»¥HBtR™_°­¸fÓޕ6tœÁ»qš|–³ 72ò¡ Œ¢1¸¤8­lÄ3h¢“ÉvD5]kÌû›>ÿNÜmc~gd•Ï‚uõL$o¯¸Â}êvò‰,tZ 5 )BR]° Ç_*Ålž†Ÿf 5˜æn6²ÎâBSW“Œ|Ͳ‘’}a„ ½¢z¦âÃ)¯öš2OÙ ~Ÿ§,ù[•XË{üðâ)s âƒ` }֌ù~ÒëUç[zßøÌX +™¯§Þ]-,BPí«ïŸVNAssc5S©H÷—½€¨þÍ~•äȑ#Áû¼¢>÷å=ƒú ºÌÿãfæd0²JÓÐhHê¼TђA†‡/æ掭*&*Áe5KÌ t¬#u{ qd’zº|ì{‰š›µ&%«ÿ¡*醇I¤è-ÜuÇYóA(on|eA/cõùjÜ?Ö¸K7R&’ûøÇÏdóŸ7“Ղ´‘l„þÒX-±R=ZþLö»í¿¿í§íoŸëÑfòk‚wF¶Wœr9ßù©úx¸Ó.bõ“9¢;šÚá­±e/ˆèëªÀؤSòùóϸ9nðÛ3ÞÏ[dcùˆ£·Êõü~¿c¥îÆêãÈ v¬êH Ð’˜¾†ÌRÙ£¸!†øãÙõÝòÖRÊb¶ÒŸøQƒh‹hh#‹IJw jîsí%Š‡Íz.Ø]TøFRSÊÜçH$¤°‡uh—PîEy¡¥Ï –um'é*Ü(À A—É=Whm¡K±v1.ƒœWù­þ2OHùÝçޕëä²îCvO´+áÕ>Ïa‹ÕT›’Z +{XƒÁ‚]̓*•EëÕÈÞ«5ÅÙJ;ª䁆[ÇƧ¦ZJێԲ*˒²{/¸:´p*©Wš=æµÀ,ktBž®Ë‹µ'š~-ŸS¯gÐôøFê)FäïČO­¨b°ÉŽŒÅI,èSÙ5mOz +>PïƒäA*Á¤†Ki‹¦˜wF›wóJvû”1<Ÿµötc%æ"ÁÁ®w*[ªÄº 4°h'Rô¨@=.y)"IÞ(LvÉØùçb%£qZY(¬,üL ³Ò:Ã/Sâõ*ñú3”x½•xýÌà Q©MJ›7•Y-ëьOô´8 „•‘xQfŽ¢ªmL{ÒZï‘RŒÃÕÉÐõÜêl:Óy¦¶¾Ç õwî-!÷iFu“õ¹ÿ:)õëu1]ÆÍ/ÓºhïxùåÉ/Óìí¯9÷—Ÿsc(vqÊ eÈç4ÄPj<È¡„™È•ß–Í0ž¡äž>2ÊL³,Ÿmy¸Wy0ªÑuÍG=ÓÞ1Õý4¤Ñƒu¦…I·ñœsñq‰Nǽ=:â[ZEð!ß©À6”|² &l³.4 GŠBôéG ‹™4Ù¼ò³¤…Oy!9LÙÂ]Ä­)æóÍ ä#ùršµµe?J2kׅŸKÔhËêÞ,yqדc"Òµ¼Øë7`¯hº-´N)œc?¥¡«©œ%€]èÎh<£–¡¬\Tr¿ÖpgÁÆZˆäðG.ø[Å|Q¹8ő…EÂÉ +ï\ë^A Sd¼¾Û Q™"•¿c""B‰÷gs ÖìÍV¿CfñLŒƒCf<»93¯&ž«Ÿ;²¯ieŽ ÚÎW_š‘Í'¢DÃb…ù‘¹+jÌ½0rZÈò +ˆ„K»º”à¡àC°®ƒŸÛÚ´JœèTÊ1ã³ÉÀ,±w¾Jùw(åd¾)í;G¶æXµ«ÇPÓÓ°v7¥w»²ÔžÃQVÿµ‹ÊZ«”‘¯„«‹¨jŸ¡juÃ@5dXS”ìbô3H‡Í¹Þ®vzü±v–šù \Ðç—PQkW H1†ªã´€„FDžÈÂ-Ž,ìuÝ}l†ÜÑzrüÖ+ôäyÆ°¶áÔj`²bo Ð]ÊVíUQà²dN Ìf,© $:€ý’­¼!H¨eçéT7 K÷|J4lbՅFÓÉÌ'Ñ@â}4= +¡¢Òûœ€pU‘(o‹T¯'±Ë1«v*_š;,?节˞z_ÈKßnîô’í(©º¡Ç¬˜+k%6t‡yí4ß Q¾—8 +ØõäFø %ÞdjÝúӓ|ˆV]‹ØZ—mM–Û_(ŽÌÎY|É`Õc>kò܌7¨¥egわM¬žR™żô¹?"jºá®Ü¯÷ôvºøc^$cP´îWñýÅÅgmÊDÑîo7Fü︍1,…,tïçÝ<Ëó–¡À£Î4³sƒÜÙۍré:}á®xþ’j|;ÎüóþÀ‰ä4`=áöéüÍ~|ô‘WÅÜ1P–WÃÊ]Ø Æ¬EHÑ¡™±Ðßb–>÷¬4G¿ä +€SÇPt|#©"0Ìù}Ž¤b[8¬CÎA¦4‚¤–v:Q{ ÈSÁoà……4$•^h-iTú2Èÿ%̓nž?…Ïú®ŒX'—uj·s!0/Åñ=Š#– ÿÍr,ÃÚÍ8ëñø…%… jÙg0õ£ Ü·åàuza/ÈãÔqëízäa€¸ Ô÷Ox*ÉÙÓ^Ùòcú´m–dUֆåO«OL¦þ+¼ÐՂ3HÍ"J8¢qOÃKÔpaí-;«i4¢äA­K…ˆz%‡ô,©5Å )/D*ª3-Ln‹—¾ÒВ¨¨\`9â[ÐaÕó¯-ü!°ÏaqíáÏë­ý¨‡»$„@¤[õ´êÁ{Ϊ” +î  ˆå,žš“¯*Ô £Râä‚ðô. Î› + +§Ø0͞®r ãÊ÷<çwä{µZiq9ã;ÚöðUtr<~»áø(„Æ}Æ4i­ÿý/Cг×^ù:xAQÖñ8í8 »öÍbÄãµÜ½ŒâÙ»Ñw:¬ ì×ï +ÿOO‡ùÿÐaüKé°v Ôú'ÂN +hÆ¥šÌ½nÑd…jf ÙܑP5ӆMûö”ö€g;‰^ìCð©ª,í+îÁ+Uh'÷ß)b²oÙrQk§ K,â³·V”[*š;cYPÁÃë5æ:1)¹Ö¨ç‡ÊØî[ì¡æ/©–¦MKˆBä]cCåçobÄ£PO8n3[ƒ9G)¶tfƒ7ëuð‚*–ãÓ> +«Ž{UˆÇk}ųw£ï…Øڗ¬‚^ýõïë¯éïè¯O#JË ‹pifßXL–U”jé}GøÜÅ·‚©€@kQÌ`¯æš?¿i Ô^O×z„¡ö¨Òë¢óáü- +MûLç™Úú8GÙ{äîyÖëõ½=[ÞµÊDNèÒ÷DVŸ.‰\k\A`\&™{æòLÂfôˆþ±nN13ÞVš#ŒdF¿ž}iêzûŽšÜÂûµ†ÏÝGce‚itM Æd û>ύ”fr 7=ÄÛѳ$XW‰³'t »\=Àõ3¤³ØTß¾‡üŒx X‘ùŠvëÁÀ«߉‡Ѥ·p×gT„¿¹ñC$mð˜Ì,sû°çn‘D9}E¼º¼Š7U¸²Ïy„¬P®1ŒKgÊ- ºejxiÊûŠt²» 'ØSï ¹o#“ÛÒÒc÷R©KóVe®G3º‡×N6³2Ä÷i×®gòevsKmYg¦/ƒâ€ 7¯Æˆ¨Ú쩼˜<¬¢Pêõu­ÁÂK…îg•¾†89¡š!¡j[ð±3·3eg¦E¡ŠÕîøQ„»r#¼ÞÓÛéâç´PÛ3¿$ãJÆ1,¾”ÓˆùVN°$yø2´á(mMX&©5”× ]ÝwЎ°/`‹îÕIo jMԒúŽ7«n¤kw§ÑÙâ#¥*®~_Pñ˜5)(™hùá€÷4֞RD!ÙÚ·v<ì×V}Xí©xôÅyÉ2óÇ yY”[Uym–ˆhØãý͒>Áé¼HÎbOŸˆ<Ý`yöÚiñAL™c?§:ïWgoì5y”oì„3j‰¬OYÅñ&ÅX¦k náÑh ³˜B0ü­~QÃî”D,˜F"ùÿد–»n8÷*zÝÐÿ³#@íIö?x¬*JGǾɳp;wÒ­ºÒ‘(Š,qæ#ÈIä®Ìí»}‘ßkiåï$þOÒrB‰ûg2—½^Æ㖎!²¼~012žZägj‘Ï2¿‡Iÿ FöÜ¿"Fb´ï«Uª_X”ÿ§Fú]ôß_ôSô—Çj$ÆʂðÁ¨òÙ·ýd®ŒÍ2ÔÞû»¸¹~på‚]9‹ªiÆâJ¨™Å•ö˜9^,ZaP0’µ‡™”¿±q՜<ªP0Œ*‰UÀ~½»ÞBŒ6‘-¾J9.hötÅcæ9Œ SzráoŅ֩YTyœ¿Ü"á¯?8K§tË, á/·_ºÝŸß›ÑÀ£68Nð3×_ÏyÓý9Ÿ_àƒë—Tã˹LÚ²4÷Bã|©h ä:è&i+ +nXHfÒ(…Öâ#ƒBRa¡¯‡•‡yBҌ}îY±¾\Ö}ëã‚<ý] ÿÄ—šÕÓ MÛ=8Õ¶•N¹UùZ)V,O“Z‰s´Kõ©¡¦Ø¢?Ja2iÓl +­@ æÑÊôš¾=Ý?«‡*ʸ êˆÎß5œÀû +ÆÊ2¦ KšKýªÝÏ;8A`Öɪv°Æõ,5Ìá\Hyúž…$'oÌɖPM`oªîÉ;ÄE™äŽÄ¨‚?…P±_¥¾)Ýu +gÝqÎX77~“­ÚÍ!‚!«=÷í)E|ìg(&ÉÒFQsIüÖ3é×Ò° ¥ˆ±ªw‰p„mf­‚†á>d„J‘XÇ#f‰HÊI}ŠÆÒAð5•MuDžŽoÃ|PPx÷±`f ¿T¤™¥äY”‰c{RÈÕ(o¦´òMæRÌ’ḇ¼Þሳ'¯ÿ4^ïÕ#Sð—6oìTMJ×-îWÆ ‘a‰€œA™MôÀÖP¦¹ž®ñœu¦š‡«‡¶ï¢—Óþªó+o¾ºïÕPpnQÀèÐW(.%ªêUõWˆªz‹ªúÐÇ(zh‰¾G-@×jaÁ®P‚ +Œl[–Z€:^jÁ½¶tDE,r¬‘›u“Ÿ¥•¡’ ’„ËàCOÛ$7H¬ªÎ€fO—˜ ãR¨}?¢J³P0“r­#ö>£•a +oÏÐ;üb>–ŒÐkoÝÞ}½¥ýq×xìŸnÅ«>Ãæ+·´ ùٟŒõó«Ó5ól™qÙÙý-ó-QJrdù“Ú‹ú%Sà‰Yœ´jV z°wC½!ä™Õé‘ü}Ԝ­§‹ì„[w5Çî—ëÙìïõj²q?š9%–­A˜l뚵Ö ¾f®“½‡|ŠÆvÎÕNv)ÛíțËéaEWZ!w?Ò~ݶ.]˜9÷`Vî”'ÔÊ£ÑÇ|ƒÌ×( +ěªëŁ~º7‘_ÞÑMN›¾}*‰è¤Í Ná|kévÁX!‰=(ÑÐf7Ò¿ #¬rüþ‰=9ðÝðÜ0(ó­@Ȏ”g¡ïYÉûWŖnÁEÖ÷9[£x—œl‘•úâ8:ñL,r$zÐ)œuÇÙ#Íúrwã7/iwt],fú™3žÉ9«[iô` 7C E|_•ÄðLy t5V™¾Çð­‘Ö#BXµ±àoe–Ô(ZœA!Àk"lqæ÷¢²Xçö¨¬ùm0B*ÇâA„÷ÏÌ[#K³6[)RUÔ71fL†ò±»3¬&ÖÕÀëŽìcZY££ÀÚdßWš‘ÍÛ5¢DÃb…ù‘¡Û*7g˜èÀÈÖ.Ë+¨‰ÚLO‚W=.‚q¼nk Ð*•O@Õ\õ„¹½å`”ö|þÊGþ=ÿ°R­H-[M·Üx|´ìlngGºÆ°'Ò1@ù­g̣ޔ·P p#¬ê]ND%2w7DG¦ãkm¥b­ŒŒ©¾¨2€ì¡xœi¼”‘\íˆð6‰9²Äõè¸>Ì jÁ{MQ6dÓçO&ÝBSe‰4¶W~×)¢¨4ÁþŠ€¹!mȲ Ç=r÷„¦­GÖKÖ_A֛¬<Œb\TÎJ›7aRMĉˠÙïyUÆ Q‹-ĊÒ'“ÁÔ¥0±õ`šëé0<稩:¥DڞS=¦ýMç7Þvß;*m9·jÿÈê֌¦gWñ»Š9ì -³Ÿ -üƒ1èvÆËmù_p:7Ä㴙nN:éf7÷•°ÛU~æúéë9_¬jÆãó Êæó—dÿÏ `âyBàO֊eâÚá¼"⊇*JNþ¾€h‹U Ž!¥D9}¿Ÿ=Æêð„²j“mTÖXš õp½“äÑ×P¢hCPP\…ÌÌf’uˆp‡áQÑ®€ =~GÀŽ‹¨¬3“¬BEF^d•¨‡ØõH0Ý ÕV»""RqdjÇõ‹¹ïh­ÜÊê@ë­¼#ïXÛp k`RÀÅÞ »Ôßi®*ᥠ؅ù™ãý” ,©|ÈDRN¢ÙÌØû °5¬†Å, +BŒÅL]5èãrJ:Þ%\·2cŒIwtZhÔ+8“Û‘“·¸Ù£ÓÁ +O‡yi'ĤÚùŠOë4j»"ð+(Q¾¡ÕœÐŸyŽŸŠÏ=çñ©Gôۙ>uN¸Î ×Ð-ηfyø·”f󥧓Ҏ_ÈIØ¡ŒMYñð¥¥ÀdYóIϹ??°SÚñ é؀„uœà”v˜°V,¹ÃW—øŠÒªRHÏ6пùµ1!:†÷!ܘ>åÇ_QS”¡Ù[Þs‰Þó¯H{aBŸÜ¡AúɾŸ#©>-ë£àz¯v’‹Ýý˅3?IWIŸ™¢‘©å…߁s{µÞ¨±Zö©9¶º°ú$)'I/Žt fՂ&IÆ\ k¨ªè"Rñ–ášõ‹û-¾œwä¦]ÇwÛûˁåoïhg—ÃS÷¦U† Úú÷OÞöâ‘lŸ‹éZì~a¤<%3 Ž j&âôSfU{MK;̬š0xû*ÂòˆàPõÆ\5•úñŠ/: +nô¹ÀÈAfH±gYâu¶áè}#èfŠ…p¢„Z¨2jšŠ:8¿j1k‡àP'•ÔÜ6¾n#wýöÙZÏþèìWËn-·Üë+ÎÈæ›Ã­ƒ|@àE¼×"¢ëÍý õhÎ̑ É:0àËçðÑ쮪VàðéÛeYv$¹ƒ–á@üÄÁÝ=ˎÒkcv/f¤8©ÎyÉ~AWã)ÞMÈÖÜQ¤¶3ÖÔ°‹6ÃÅIÎÉÈÁ†Eúã9C¿ÐKe­ew©u–õlüf™7vGI!¾¹°CÄ:MAEi "7½r.2b2­Kò3óÚ¤ ï’×¹û¨ŸPØk9’•Ÿ I÷¨a¯Ë¼Ãê×7‘ñ®bÇHeÖI‘>ùMž¤éø÷ž¤v»®Ë“Üþ"SÁ®¾Š°ÂÞ]žèG½ÏÏq<ý|ãð$·¿ÈQܐã¸ížävqÑ+<_â“'i|8ý—!ÁOIã gýWúŒ£íŠA„'7iìÌM3fŠ„T­ÈY ¤¾#DÚ59àl óª5£à¤vΚ=ܞùé?ˌ¥lÊ+¢Dºª*ïʕë + …g9öœ+ÚÚ= î:EM40nƒ¨ª#ŸuòŒ˜ÿ3ðxB¥Æ79nÄ]«ãiÛ=‹ÿ_C°¬Õ¼ç|EÒä vd?Bë¿LV1ýF¸Ûím±VÍö²Z¦Ñ’{Ó§ÊKsl9Ô¡NñÐ(V—w†<¹ó*kø ’$&’DÙ¯ËËЮrÃÜ1ôÃzÿó‘ù*aÃÜ%"Y!³®PÆQâ©K»s´¥h®$ŒÛZÙ¦„·Š¦3fÉÏòԙ9U=1WdªõŠê!‹[8Z*‹±•'[úû™â]4‹Îõ)Œ_Ÿrê¡Y¥™^öÉ9–YŽ¦+CÖP–8÷±‰ÝŸk¬8:C:¢Àj‰u¸ÈçÜù‹“MýËïþÄi?ßþ|™ LÅËY +‡À#ƒlKËäWÝñ¥Â«+ÉK!øæÿ?þćéñ—˜,½,mýzÿC¬TÙkäu0›úHÒÁßþxüúû{zü|üõÇß´1*zuVÑÑ(ø×€±azø¿ÞÞ¡6ê‚soÉQ¯wÀS'f=}éÇ ­¢yHþ’Ló`ûҖ‡o/0¤ÝãŽZ©ñµÇXg0/ +ë@íXMYœ„áÑÎtvCEùˆ_NòÚÈN„ŠÖµÇ „Ž hâ[Và‘ülÖò|+Ð%îŠãx@Ÿÿøió'²É2ú”GÛv¤‡£u=æÙ Ñ*cØ{ñ;å¸AQÐ>l`õ™¡P p»Ä™\xó!éPh&¤eÃ1Áb¢R#-b‡Ã×j‚ û‡“LndK9§Âa£RÖü¶³«AL¸Ckô1 ¾'¦mc¹šrÊÅ澊Íìí9ETÝd¶aҐ™û>Q d?ÎÙ¤N6þ …¤åô•qÀ; ìgJ˜¼(ø¶Mê™ùÚÝÐVæƲˆv O}ÐßÁhCi™ +™¬Ô )…^X é;+£€ç̨”ì A3ëG à.£òNHäÃr:Ñe‚å2Øڟ`±˜’± óX¼âËZ••±g8W0Ðê w<Ãi>E÷k^tOþ0_Às'ì°}žÝÄ=ì´ fmŸ/ÀBÀ- cUåà±h"oÔAáËö€Ìbë“dÇY˜~Ï쟀)Å^ Nµå@ÍM—PªµY~àù‹¢}È(}Bȯ9/žíä”*Aeo9å°>KdyA5| Üåo0»î"»!5òøŒöÞ½w•¦Çx×T®ÍMLá¹ò¹9õá¶yÀØ.£÷Ïï?'Ê N¹äƋ`0e‰—õ¢—|êEÖː¡q"ýã·—-D`©.-÷c­© fæý2ÍùÙTÔÚð`dÊNd¿,WÀq“³eVùܱhÍðäÛK°ÇT‰,'Gs˜'©•®[ôÍX„Qõy-úhØÄgù˜>¬‡|Š¶ÿŽxtr>ewÛa‘È­Õmؕ٧5 b…ìÍë%'.8ptúÄcö–¢Di2nImÄ4a$Ù·“(OÂíëø^³ã­áݒmÈÖiÿÇËæµHêY6 +N<Ո‡5e¿î“cñk±È)óÿñÂØ Þ,πuí÷™ýŽF“*Ä7Ü»U‘?»³>‹.ó5JȄÎ&•bù>h«° Íÿaª7½Siîþф™K’Rpñå8ö .2\Œ7Áåc´ÇЛw¹ZY„,V8'pÆ羆ç¾^\{£ò@'lt+)…ü6üF6«'š×>FŒQôªz£&` (xöêNT™¬ø‰Ê”æJmÒªëg _÷¢ºK?˜å7K˜™¸›9¬ÏÄßhE¡mI]Ï +Þ{ò$påµÞ®yGŒ’åe¹rRë3ä/u,Þ/ZXÏÉJo N¨.ÿy˜oÑjªþ‡ =ðé"Èêá¾vç͛¡,#õ§hƒdþ¿û/ŒX«è\Š:—®„2ËOÝäZFñÔyïðýbΖ¡ÞAà†ï“¹˜ÙB!‰ñ³""̍ŕì&àsðtÝFøºñÝàJŒ¸:bÙË/šÆœO5BûW=6þpRn)HÒÏt(V©IçªOKlºá×Ú-RZù }83O!e->c™2.]O,JpM3=3a<Çî(ÂBï[`9 +Ûª‹ÃË¢™fnKE Ž³ÌÛۋŽÞù·2HJDzvE§éˆ™‚Å|2Z“ÏK³HÅÕ¢UPZ¬ïñÞވoe&i4¦tñŸÛžû3^¥†Q¬ü̅µŒÊ?¬á8ã’VY#áÂ9E¬«á ÊY°½tq·ºåeÎëÓ!¯¢EPw£Æ6cGwlچGúÁ¹–ëÆòiá¼jضyC»L–Mömœ=Çõ-æf»à—ð $ú‘€pXÏÅxAŸ±mNÍlš2ÔzgEtC‹ `>t¢æ /Çq]–ºVµzSù]#X’גm˜¥ß,ÓVu1z‚ðŸ‚-?ÁqX.X¡Ý,½fÙ)Ëc—ïMÒ5üªL]©–Ö-Rr‘EWØCÜdIç¾®·uќ¥ö/ö«%׎Ýγ +oÀ†¨¿Ös @ìIö?«Šìîãã‡ç|þÎ/……?vÝ?€~ãqð;0¡º¯G‹l”½PÚ;l<Í䳁ʣáð%kö°ÑZÍsDÈ;ËÆ/ðƛW—µT*>ëfדù¢¡ øLåZq )mÑ65ú5 +lPÂÛÝ ¡ +õÄ¿è !6'º"ñ„Þä͈¢`¨wƀ%›‰:j ¯¨ˆ‚´Ò|DŠSB½0îÙ«¾\våÆÍ.i6û졼äOÞ ;|·Ë„Ïìªj¤kqƒ)‹îº QŸKÁ®KêPą| +Þ¢A¢y½ TY9ØZ²ñHZ¢ºp…¨ls‡ ø'ڞ>ãè« (•7|pä4W é.°Üðe!’Â?©ÅC•Y¾]؝ْ Ò"«¯d DAa½0d [֐¶/šÉŽB7b„xõar”Åg¨¯µšDö°¼†ÍP,勘Q°=+lkºÍCíS:CÉ÷.t÷ŽóÇb¥ð…ñ(Ȥ"?Wß<  ðÓ5߂™Kky+â·ˆ§/ÛãÓk´ßf¨âk¬m*L~ð2CAΧМÞZ À$_säoþ~ acxδ÷¡K{1=ø½*“W¹‘Zj³ÄLôóÈtŒ0 Ë%l“i™ê­~_¿BáÂT)îø{%]a³DkÉZ´ÆggÁlL+[¶Ò£÷O©•F均…=¿jYcjÔ£L>;s-OõÂQ#pÕD– ,藟ìؼCZÿ»êÀãä1s6í°ñ€ +ÒÇhÎáòrá†æñHye¬?ýP Õ6iºX p lÃac b“¯ÏÐ×/u\š5®™ÄMµ¶• bg€ÅâLþ(§†}×¥”‘;}EUýK9¦ S ²/ži9PxtªÄ&ÓÄÃ&¹ˆB„–©Ý»p\šÆ±­x¼VKÀ.4j’/Y~¤Õ†§Âö;w«¿Cý‹Cí +œÛm¼Éâ¥I¦ªx=­J869´ŹçÖ¡‚†ãÑeké©Øä㡅]A¯§ué9ïŽ@¾ƒ‹ÒohœRTݤ›NÊÇ1ü³“‹x‚( În +úim> 3‹Tˆ> ™9lõŽ“88#= ¯Ù jõ!“]3b‚¨ITúÞ‡é‹^sæ å›ôíפ~“š*Ô¸™WÕ^§BE½í@Rà×g˜úbõ9±-2ìpÒә‰Bp…™Í˦ù~ÙåwôÅ?ÊBL¹ÓpÌ8eìJk¸ª˜1ét¯z>þ>V]¸÷ÐÁŒV7CH÷âØϙäÏßm ›ùä×Îqí»Ü¥Ž&Ç àJ0²'L=%ˆªSßz](/ì ûƒ\ Nø‚Íh8eò¨–ãXŠ÷´ô #âù‚½N‡1Ž‰üá< „qÿËêaß^6y¯ýJՇ4³.£øݺÏ}àp 4¿?äþ³.îÇÎ7÷o[÷·ÍßÁª«õƒcƒû½ÛvÃÅÐ’ü,É­ÿŒýÏyáÿ±ü¯©bu4)*XdìQ—’ íñÁòoÇã*Ûæ¬T‡€]Š¹0vKƒ†zÔÝ¿Ó;œ¢ +zæ™P­¯™î´Ë÷òvÊܓ™CšRÛ³§àwÎÿSŒÖµ~MX˜0Ÿ9'aìâYfSÀH/~¹rÂF›™¼Ð`5k0ž¿¬óü¸¼mJ•¿oï¹ÓOlRÕàSAVŒ÷Q!gŸA}êaØÎ>vxs OTŽXà ~ ¼ ª˜o@ЛÚï•BN´‹”0wØwD’ìgiQóº ì¼Aҁj¯ð=Þ?ýýùº ›™sò^ªá7'O<Äÿ‘ü¦£ÌVo¹^_$¹zv¿8Ä@QÁu©Ôè!éYg$‘ó´Ð›¹•·ñ^ß G¶b,”c‹S`1‚#mP«ËæHˆ†°LóŒS렂d+AH–/ûù1ÆÖÇN…Ô󀽬ôÝù¤wä9ÕA;÷½Êm¾‘dÛÐ)Îr´]ŸÃɲ)}ç:¤K*™Ê—˜Hz…³UÕÔÙ%©½…Íqt:fׯ~xé±P"C!a +äWŸ|…M†áF¥ÆQ•ùÍÍfØ5ÝÍÌÝÑFþæUáüŠÔÝŒõPgNŠH±Må†èn‰÷DiPåWÊ·CÚ€Vz È=$æ<=l÷v˜ÞH‡zÀۖU_`U<ŠdC)û†0ôóbIžFÊà,!^ÂÔLø«Âˆ¨¯úébqr랐,U'–ÑÂeԚ‡àåïÓ_¥\ñ.Ï?€Á±ÞSp"çŽ {Uvpz{ù¢£aå7d0Ÿ(ñ½Ö{_Âôr üñ—Û‡üâvQ;¼ÜÔC¯¨ÈðšyŠ±„h'÷ÍÐtè ¸7C\+^»U4v3)i ûƒÎ ÔÈeÊþ°•£`1B½[58é;èŸsCO ƒpê“× +;DY >ØbjBäœf›™nœÔ®$ÍãÊm¾I?X"ñ²z!ˆaôK‹²«¬Ý¬È–•e¸ÿj¬öºB!Õ̤öv9¼«×׬¬vîÃïÆn±³l\´®HƒXY؅ꘂ«ðÖj„Uó!¾ ö œ^;¡«T#h’ö4qÞVKà³UR&[6òª–%Þá# ÀÝR/X4ûµk¦± ?]™lCÛk¼ËækOŽ[¢÷@LM +Ýêð:V Ãü|ýPÅ,èU±_ ò9 \rQp¹·äÕ5sʄªmÔ§|žª­°£7ì] ¿Ó"ÙEÙ)‡ºôj—N­÷„x~¿Ê‰\™Þ½Çø¸†=Í±úяûl3**äAÏ%3ÖN½ß ZCM5JÜdêÁô›:ì-âoê,b–¹ƒhTëõZ²¸„Óƒ»‘4c˜ÎüCÞlß)õ SjNύõsí“᣽$\´^Åþ¼Û ºZ¶—Z6žVƒ™SظˆOdŠ{J„K¯5Žk)A«æ€•€¤Ú,aÉ'gÚh휭}Ôã +µ9}x ‰ø»}üÊöáºß+|1Þ6ûù]ëÿýZoŠÏ_i¯Í—Á÷²tØt~çԯ˩>½lwð8œ³~7ÔjîÊÂc÷pîzÆ‹ó‘ÞIíN˂?‡3ÙäÛ#Môm¥#Ú¡¦SaÁ‰˜¸œq›N:–Ñ(ƒ¿eáÉ_!&ÁÍðabLäg°-¶6›ld(Ùé±Pá8W9^ƒ'f@„xjŠÜó:÷=vÛ«ÛÇM•'×w³üpgý ñ¼¡çì@`„½€õe,jêjh3žU\Äz:C§hŽm” KVûƒ}ñ¯¾%ò*FÏóùrƒoë×­‹ SX¡mÛl¦.ÀYk^’ͺü­²oúöƒý˜ï>ê”0œu˜uìÈË6‰YíJ¢ò¸‹Y³ô@JbÏ­ÓÃvo‡ÝéíK‡*³,{•…ڋ躈ÊaT3‹û4zTÿ â%Påù«Âˆ¨ƒô!~«hȼŸ!›™-Kd“p«å('[ý'ûÕ²G’ïóú5òÅ|œsœ¯ÐÅÀÈÿ]F³ºº%Û£Q{XÁ€áê¬b2Ɉà•lVÎÙV’P•÷aÄZ—Å2ÜÍw3Ûà€‰FÉ懛ÁF©‘ªª°ÒӁêP‹ýJF¸–‘QΞ2W+¥›ÁÑã‰*gùf?/Æ°6{=ž‡æÞ î4KÌßÐ ›"ÛÚï $ÝZN{S +ŲAjðŠü~Eɐ‹Ò$¾¼ºÊF ²ôº1é¡Ê£Nµ,ó³úÆQÅÌm×£¾B=¬EŠ7Ë õ¡_67!Òù 7Ýìò˜ñ”ìá8ˆ%?Ï(VÑ燿ûû +ߖëJx‰–‰À=:²¼;¶´¢›?øõsŽ8`Ï&Å'ê{©NÞ͊Oll+¾!"gƒcáÑ-—¢¸T»yž–7Åe9L‘ÏYûYbÙäݳ–kKï"ßKé6»ŠŠÖ •.1 ×Ѫ‚š´~o±}§Œ`‘7;Åø|éÅ%—OÍÎö.Ú¼înYeœW4beùã­å˜.Y‚ Síbž¨UÂ8¤]¡‡Ëõ 'Žc­É¥¶ËUíÓü+üXB± E$ÇÃ(Àæ/±§Ûò|ÃÉÃCÈîæÁ- –éÖdËWµ #k…ŽÛ,2 ލg…¼ +eägQ (¦o°Äpy¸¥Õe‘+*\7j5«ýrPû²(¯¼J@•°§C­RL"³±hä–KGÕT¹˜Ú§Õ¥‚Àìº?|»ÁQðh?1 ŸjŒÂ–…بµ^L]¾Ï +Å5­.6{æ¡à7ñ£@2<ú +ŸFæ²xù&oÄ"ߕӀ²µÛ» +ÔíIŽ#ª¡´!>ŸÊÞ%°‰!•}Ð؂¤ª•J;ÐU'„ÓÞtx±«)Â\ô£IS¥À®5¯D5ìgÛ% L½í©Ë5&šö>uá ½TOÄÞ¹£{;0ùUš[—œºŸ½[-^2OÕØ/‰…6GÀ~AÅ3ù¶Ø@?Âò9é(M“Íš*4 ñŠ•ÓÞtä8·ºsŒeÞέ“Ãg9E ËÓ0¯•Ý§¡kå˜Òíÿ=¹¿ûÕsxS9⌧ +bïÜÑ)-þ9ç9¿Øôîin¥Ê~ qïëŠÉ/«qºšUô¦ cwõÀ&²¬þ]óŸôýÌÜå½K@oäã*´+iÑ^v¬ñLqÄ®sŒþC/ŸU¯! VI¿y¶8|@€Hmç¤ÛÞ%p|@Ћþ)ö¸æÔ~ Ø8Êŷ♢àžs|÷]`5x95HáyÀóid‘]7 °‰Ä6ó‚Wæ^îGiWÜE¦Ý*¶×™3gӆ©4’T)1É~kM÷Í9WOrÂZ³å`nb¬ƒ¢ÚDÙ½fí’S¿ÿÚîPsâ2G¬0¢áBgê|†0åó2‰OclÖ8ê´¨Æ!…ÖÒ6µkL®"…­Á,œ/×8Æ\û‰'oØÖµôsY>xÿBúYæƒÕaÞ©Cÿ´:Ì[u(T‡r£ó“ê`ÍûÃÖÔ¡(BóA£³ÀàîS^I‚j|O+°Ž­CŒl½#Fu% IžÝŒiõpfÊe,l3Î5šÐ°±Jߏ|êåj“@4–¾s±ò ¹Eœ†w °áðÁ¿þõ5µ/Wþ’!zeIWÑ^&À—•Üú‹9a“Öê^¬À}‰¹ÂïýõøY ù/í§ŒaoŒÐîé±.§ÇåüEbç9±í&±×¤#ƒãœÙqÍì8eöH_¼í&µóS©mLmûTj[r2màÅܝ×9µ—V [ò ¦¤ÈWIk¹âûFpzrV˜þÎv)ÕûùFÎFλ‡`-Ió¥Çš´½šíGåÒÈ/˜‡Žê莓/èJGÖΤäô0 eÙS5©™µ¸1y¯Úä‰3/¶Eǝ®—›Gá?=G¦Ug‹ø—µ½®¬Õé²ð$ÙHž=­8r î+ ß֟Îñ±¾Êâ]–ÙUeÄàÕÃ!TyÔ˜š¦´¸zyéN3õ/u–×RêlôN¹ô_^ƒ›@Z8y3Ë$ó½ôžø]J3ÖÉÙuÊMM:š¾Ø¸©1•¼ïÄp¯y¾bäô¬C ç\@y£‘ªüÊ;èå·øR¤Ü§”ZwæŽ:Šg‘Oß6íé6ÛoÇ©hôÕ¿8éñœ”'Îmå¤âsiù¥„|ióG/«:ë^VÎÕ¾šëá͏mæɯ«C/N©õ@èWÆ㳨ÿ]úŒu»À&¼ü!d4Ú£/øí•!Ø£·X¿¸KÏkr¢ŸxbÃw§eÊF*øYs¶»·N›Nk¼¼¤ "‚ÆÒ–µ#T/½bO3Öæh ¨ú‡†‡iƒbšõ‚DÝÅÌ8Cç2 Œç€ª…5^µ¬z Å.mÏZ¾7tœÂÛ⫊[Å(^ÃP›êm«"'×5Q=7¾Õ}‚Ÿç•+Õ*ׄón2$ÇèYyq ½Ò5<,²7(¿³E‡i¹>éðºî¥‘ó†\™¡–y$ü0à놞!ÿ‡xZî=¹ÇÙK?u—cÇÛnb`éæÞM·}Uõo0>ÕÙÉ ä¡U‡W jÕ{fL§£ã¥ñ´}Û¾²K­‹UP[yƒºÀàò„Ëw¶¦h˜íîµÕÈÐÉoOè5P"uÖøžV1ù6:›²¦v7L.ãkülC¯œ¬ª[yN“£Û~æ鯘O8lyÕƒ¯kè]ûüâ[ÑÜÁ:9!U]Í3øu)“O«ÕçŁÚó~ó{Ä0§Ž÷c³×°gi©™wÆÿËEzÕtúÇÙ}I{è͕ó;ñÍoYþë—Í9‚*Y?³jo +Ù·UökYÕbêñ«VÃ(Âe£¼'EA?|g?Ïv» ‘ùÏ1èˆ4]®Ö¸@%éåXþB$åçŒóåÝÿßüùמüŸÿíHÉ/ endstream endobj 55 0 obj <> endobj 57 0 obj <>stream +8;Z\74-"qI'MRh-F,4oR'q>H+\4bJ/g]^b>%+j1qDsZ*fj6&isnr0Xu*uK`@i+6%$ +_S!+4F[jTE4&`q+_AnK-D-jCs; +o-e4R444^5kkd-Pin1do#%F`&r.Wi\Hc%5WR;ku4EdLXf!S6AKDWg+?^9^@i? +9WQB&UVcuB**(,lc4O!8-L'_1BVj3l/^I:9O-Z]5O?%5OV,s6,Fkn50%,f1?_B64Y +:0i"bcO\CVZLk*f.,@bbO[eS4l-Xs]:-`U$&YGM^ZOo@PXW>7#2[>=n*qo6i*8&`8 +F5Y]0DK$nZQ$pu/]<%DkK3f8$Sk#bn&cZuO:jS@b^B"?+U.kO~> endstream endobj 56 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 20 0 obj <>stream +H‰ìWKŽ%·Ü÷)ê]Ã$™ül=¼0 ÃÐÂx-@Ý$-|}GD’õêæ6˜Îxd%“ù‰L~ùû×ãËß¾¦ãOþz¼¥CÿÎäÇÏo_þòC:þý»~ÌÅÎ2ÆáÓÏ<Žß~|û×µy}Kgöã?Ç[Å>ïí(ÕNó|¼[goå Xþðöå+?~?ì8~üòVó9­u@UËGÎgëýxÏç(5Núg­“y¼? ùçñËeJ‡Ù¿B/‘}Bsù¨~šõy<>µ“ÿçÓÔ¤'–ãO€ÇÎ÷´á{9 §­$n +{3ö®OðcIcë[{uւi“¶ž®_?·U¡x ÑëxH }¹.”NߟH¤N 4ÉuOì¥êy7ŒH7å!{5ÎßnÃÃ?^|[ϒS9½Üf¹ù¿ÃŠjÇä^yxÊó°3wYR넭9_àñ7ò‚ ƒvHMˆ°W{¦BÐp-D¥óÿÒøK–W(?Þììy#¤l§lƒêfÇÖ©PÀ5ú½LÙ8êÑÎÚ:@E„Ç7ÈÏéDP‡ÏžÈd«C#Q +ñ¢£QÎË%ó +ÞÆBÑêˈq͌Mè4”ÑY“ü2ÃgunÀ›ZÞŽÓ'ÕwF½F LóÚN·~‹µtî9‡UêY.›\§!ñu1sšá©’ô郟K[ðcÃñ'æ¨qiŒ®Ì˜Ó‚ÃÜÇé—<=îETÏî >SÑí pðãiuëd;›9ÖkaQÁ›iRè^;gáasŽKNVe g´\˜=b*ôA¯±i¡z»îGD°ÿ·T—¼=·éü­B1¬+“)jf<ö æ^cêH܉òòÚÏÔïÜFª.áUÁ*ҍӣ}Î'°êA„ÌŸ"Z«DeԍÄ:3òN«IQ__..˪‚¤”ùÜž"ûA·ê*hgÏ]嘔%%˜ÊT#Œc3Y!!q)&ZË`y¹˜2SúÞC@24’ ©8üNŸ$Ö]ÍQ=– ŒV ܨQ;©-dãIÜDÀ/=.u{Ð*Zˆ´» …¬káVü¦È Dw#úÜHw`’îÕp"½ÞóñâáoKÝá‹bQéL/g² ‡Ò2&Íeý¥6(Ÿ¶²µŒ áצÔí†Lor‘)ƒz«T¶ˆ ÷ÕKgë£{¶%•V°J£±,,ð¥HÂõ;ež—Ú^ÁÙƕ&yfÓQVéúéãIbÔ\h+žì͒öQ–,+Ýb’sEžjʇޢ +ö +V †l.åðñcÈ"dÂéîAt‰9ÕJQKH%:dÑETRCFµ¶¬ªeôK²Ø¸Ñ½GÛrçº)k±«¢=gÎIX.¨wÓÈðyÿar´Ãç [ä1|ß.øàî©Ýk¤3çóã'Œéäöƒ‡º¹ÎbO¾´”ö:ïËÛ²õñÝrÞö–ïƒC[Û@‚c6x!Â(eð6›'t7׈×²ɽ+-ؔr¹È)«-ASjÊ¡¦3ÌY4kÊ8zaËjÍ¥-„0ˆò’HŸr g”XÝkQÔXò²pž^Í7ÌAÞÑHgâ‡â1A1ׂñi¦Ò…ŸÔ¡YZ7bf‡üˆ±'@ûXûîèÐXd£ŠPÆh¯„2ýF(‹¡ØSL©¹Ú}“7à•FmÂl%4À–Ua¢“16t'©†]Â4b•˜ú\üPéñ·0.Î +™“¬éâD˜²ZU7G +!ƒΔó’i%È#;j' ÎnµY9‰8¼~°”‘UÌAæb6*™&s Ÿáz¤ë–9ÎG½J]c¬klRRvZÚVþ6e. üC@_7’ 'P“ !3:añˆg Þ˲"1º=£D)ì^=Ïó÷sdÀDl÷Z9ÜÜkP-•#LQ€lŠ¾8¦b¾×ÿµnY\×àÌT5´”55˜Z)íkQ¤m5V¬5PNÕ1E#} RŠ¹Ñ„\±u§cÙS‘Qbà"v¾"Þ¼Øz+«ÞS<²l ÈÁ˜%¨H+>šÈþ÷xÓ¨h£Ú*tõÑ\I#yõJS·mՙ_0…6û®‡ÓØM“†×oŸ\¼›š¸Ä]½8›/ ÇËTfx4a/¬ˆÙ՝Çl»~ŒK1Ï>7ŽAA/™ÝÇ¡>×ô.ã3/`<3âüëɑJt¿ÍõÈ1ù9· i‘«PO$b½¢<¦NBï«]äh¦Ò\HÆ(˜y7á]ÃU¤Õ»]E¥¥,QF*8¨¢èL5gÂM Å«5ÑêòÛʉ/þ!lèÞÖ¤ŒÛÜø’U–"7ƒš[‡«øG¬æÃN¼Æèÿ>·¬é­o– +wf¤iæšXÜåu¯äÉXaаr©sÄi«sÜóªæå>Áº|–ç õ8ˆÌ¢â‚w8•Ø–iጀ%¯êÖ֌ èqÁ}’Èê`œ½@œ}Eœ0ˆõyx8xÁ¤2Z‡/ه¿Y!"Êzi`Œ‰q0ø½“=ç,ÑL:Oh„V•ê4-Î +ÙÑ,¢ ˆº:>;S?0›ñIãh ‡”þìØ:Œcñ” +놗¦Ù +YZí¸8M5ioÊè Q½Ù÷xG³¹mËÉb\'‚B­Ö™à`SֆSyö°qëZÔée‹d.QÑHåNW°±’¨vp(ª?ä ‘ÉÕFÊ} rçxê¸CƒŽváÝû‘ˉ‰2ÄvŸ7\ùxešfÁÖ.»áƒ»ÕkÓå|~ý„IO›ë‡ŽúhÇõuW‹¹´”ö8ýZOåþñÍpÞõ™ÿÎó3/Í<£¥÷®fA]„å¾6ÛÑ%4Zi <¦øë«tíEà"û¶Þ»­l}ïûE§þÛ7Nû£ˆGè¿US +F‚’ºZÌ®Ô@V¦ ª•Ùm/ªŠ5Ôj'a¤eÎËò!*E÷ë¤ý(Þ'béh¯pÓÓš®w”ÍÔ]4H—LåÂëM¬—+b':@žHäÏÖ8X1t‰m;GcM¨¸/ãç©æ +›®ð`áŸu§|G¦ÐÆlú?;¿U¡Üc°ç,̐Å9¦ÈzxÝ¢Ôr^ ÅŽj–ÂTɆ546Ék-%õŠˆqU°xºûB AUÉk²-7´¦#½Âºzw[~O‹¬\&"½bP©«yÆ`Bù՞«ø3K 1rÚø/ûÕ²cÉQD÷þŠþÁù~¬ð±þ`„ìÅ4Høÿ%Î#²nÝ;ã‘-X€Ä¢»ëtVVFÆãĉ”ï>YÐI¶ÛjÓ*Ëù ¿¢wËývþ쮐rYsåy0o¹ë9r¾Eîø¹£‡{Ò%rÎF Í«0ó>ȶ0±y8EÀÏYú*·ƒ +5­ö;ÃàˆrkZU&Ï *¡@xæªRDKÊÃOìTŠ‰eÒJãDD¢6 ­MZöºÁ\Ð=&œŽÜYìWÛ›_Nã@¶i¿$ÕA  +‹õÉ­¡HŸœÇŸ_§9\Ž½”ª]žæ¨Dccó@–!Â3JÕ¤sŠGŽ(4 ‰É•4t×â^I¤jk£_«¸D>ûÒ)Ûªa-CƼˆû‘Ñas‰J¥•s6ݙê”àþ<ÑæW3;ŒTAí‚$”nñ»AFðÁ0Ïti’ÝUtÔO fߎ×0  yÌ@Ì.':¨ÏSš9˜óLÑWÀ+‡Q.øÁ ¢™,_Ìw±„*Ý(zJ¾VíAz|½=y÷µŒæxÕ=ɼ” Ì•K¸/àªÙFÞ}í~] 8«K®½¢ó&B©Yäùˆóæ‘B{¹ÃËvšÉŒYk  +jã@OM$~•Ú´ê(Ë:sÛ³n5zŦÄ@ ã0Ηñ(MìÁ‘Vè[³ÜTßm0Lä1º–¬þìaÊæÇ}ïˆCëã¶bTKyÉÐ=ØÌJhF2½"‰C!t}wõ"©tÎw!èÏ(ÊF\µž¡¨’ÐÜsƒlÏz7k|I+Tqtà>€n­(¿qúšÛº’Ô§›Î´Ȕ=¯5صezVûÌÙ¢¼nku“nî¡Ê-ͧγi…Ÿ‚r{»ÖÂgÁ,O|ÍìÆêÄ}Ú¸Ç=±#­¥æpaí<¿€SÔ¥T9¯©‚Y¯e4¬§¥Ÿ3…ªG#id‹WÚÔ9W;­>­³É &°˜¹ª{%·|ð„ß ä l˜Îž«ýMcïç1ŸÑ#mf²¾t äo}Ïŗ$´c‡øÉÌ:Qï1,OFMåΪώ}Ǧ×àõ‰¡µnxšk¡k\í´¦ùKZÃÀz¾Hlëì à—øH‘d5îÁ µ}>ÈÚ¼˜bËi§Æ¢Šk½ªP$hO™W<¥Òú¼°ÚüxÿCpRw.—QŽt ­¶ªV·uGñਯpƒpGûò—¦æÝ1uJ^Š‘ö@_ƒnŸo÷ Züt1ðçý†órٛ¸4z=†¢¦\·õï.Þäûf[¹‚@Œ¨%tnàtϱ¡Èu‡¬Å!¶8$”Š‡«Rܟ=–•rÕ3ËW‚oì‡Äqf-ß!+Ob,Ÿ³¿™ƒ¸ÙŽJځ>_¨ŒP¢ù4 íE§w¶Á.aۇYsx÷“Žguݳô˜6Ò~¬íj`å4¿¬ÕãE5ƾuçЁZ:ÞÜW‡cÔÚ´¿ï )ƒ{B)„r­æÃn­_ ©ƒÉW{Ÿ$UÑ@(g]²0]Œl s,V#ñ:¤Áz{NË/X–†•ÿÓóžÇ„°\Cô¼W{žp«Š„¿Áƒ¿)¿üLaÌXa,”±D ÆÁµÖÔ)¡¶DpoZ۔ÔI_+ú~éç™É4ê$Ž:XñH‰š(”=m &¶Aº¶¥¨(ÖŠ¼*ëxrƒåö–ÚM@8¸J6¤ùij)ûk›_@*ã¥;®£²xH6;Î)ÁÜ/ š±Ù„I…YN½L(‰…è4ÊìõÔEqŒÚ,]Ï Q»Æ³eªé +쬠®WÖÂ'‡Šäiµ|o +¨á9 òj¾"F%¶õ «MQçð¦ ^ÏØßÀH“àÊw§-ëãý§¹ÁôR1Püóo\äl !ِóï7<2nÝB{íq¡Oß­¬îrV³¸ê켿«w—¬ÕØÉVüø.ѧï§ÆjX¤Oöò‚·yop˜ƒ\ECÐÜO9Át•6‡4‡è0;nÕ±CÀX˜“ÓµVÅiå /x½ÁˆïÐeԏ†õgÞh#n°õ,©†4ý‚¬R4þêûQæÀ&¦áWÛžQòYRŸ…$%ºn¹5âŸl&”úðP¹Jà 0µ³\¾ƒt,€Æ-£ÊєÍùoGõ ˜‚ëq1NS8®|™RIBà3ô6Ä»<÷¶²=н]j —xVì꺖àÃÁ3Šôk™ëL¨`A“‹åýà«ÓM•\«7ˆˆsæ ¤8êðÑ¡QVjt¹©Zÿ(Lý¤Ž)”ø³°Þì—BdJ wàz€{í¸Öðmå^“ØŠžœb0uVZ— r‰iKÿH±,—²ï>®‚ÚÊdÇ}6Ð2k QÞ߃6ñ©qrí |pñ<l†qö =»òŽgÞhõýXÙçùgÙÔERTž«œU$âýͽ3g~µÔ³`Å{çÏ=áü_ãO,r4¸øóÉ‚Üú`Ì-eñàOàµçµºžyí¼yîÉ‚dÈÇw͟Sc5,Š7{Ÿùso¤®è›Þõ¤r19FJa2’Ð| ›’W‡¢üÃaùÍégv˶W ³•HyàÞHõ‘ÒåiõÆò%ÄË{=`RǼ´IR¸Î˜:B* ,vF° ÖS·ÓÒãñ痌ǝ¡îÎÿíL%cª²UWþ/‘Õ¿ÁU#{þ¬ ÑçmsÛ0°R=ð ¨éßͅúhãÛ/µJ•É¤£¿æüòÒöKç¸o¾tŽûæKßÿð1½ýð)÷öñ‡¿Ü2°@M­\ú±öV¸/fÆgî¹ÛFòüò{7‚nÀÐõ÷o¼l«¶_Ù¹ÕÖß½ñØú[7bñ'üüøÝ÷?~Ìo?ý‚ç¿þùû?½§·?þã[ëÙë +Ó§_¦_>ýýfG­Ð; ¹ˆcïíä’fh$&8n +v'…rÊõ_prµ½e8Žä¼‡oOÔræD»Š¼Pž3è9ã0T*苩ê¯ð·¾0:%úÄæ?;¸¿‹;mHhSxg‚GȪÆˆØÂù‰2—ǁÓPÖÌ)Ÿi+ËÚ&D=.ÐÉøCcUóüAª£Lâ g+4Š‘?×&?SZ¥¡ K™dÀ2Þ*çÂîÓ)qÛÒÕŸm}'uàvk@£Þ&Ǒ[‡«Ý6SKT±M‡*àTÕøÝ¡æ®fŸœ…,;{oø| £v Dú±Î(Moø®II ?1ùJVû§†„5îYcìÐèˆË [£cƒ£Ië%ÍH‡½…ÛTî¹kS•¶GlgQuYŒ¿ Ò\ÄÛâñK¹œ¿ÖÝêjh©P +-!ßz¿µ78+W :èCî2Ìó™.Ê@~@,VçE»Z.=”16ªgudSå8 ;¡J–óR§Êö]—lß wÛÊaªÅ÷;F50¡€'‡lx0›ì؏«ÝË·ÜÊ·|¥¼ïë5Ö®Ö™*,¡ðPÝ7×À4 ¡ˆ0]sŽ¤Š’Œy;p›Ïˍ­mɁãH… XÜhQ2NSvùä@iáÚÜ¥.[+k¹è*™U^ŽÚP½ ÌÃ+óºv`´º$?Ÿ¤ëº‰d1ž¥;gTrÊ@-#/ñ½/³4ŠÈÁéX‡!;æ¿È¯’\;r¸ïSø‘”DéBÞÔý·Åˆ`þÁ~6삁êFoüS~J¥8ŀW]*[crUÜú¯µuY8u%EÁ@‡o”³b£¤ÌqtW¼”2œn8;!7jZ£ý(¡ÜØ·åÍë].£"3£Úú÷75¾^ñÌ\;óS­0fœÑ›Aè®æ€¾‰ÌWCUBÛ|`¨JÕÿÜ9Ng#C²/*k¡æp£K„4¬É¾:è[ɗx:‘Ôƒ¹µÊ]l8w‰x˜(b<öCñù„‡±G•£_ꋲe×6}™Ø<|m—™R”‹Í4ŽºE*ÐwêޗduÍD7z +ô +`Q‡õÌÈ0ô1ÊÑÉÆÍÖ­Ë8Lrn…Pd’)ÓøDòÏ×,$›áx("ñ¯*ÊL~Ôã¶à*d|üÑ´SªÓø'40­6/ÿdò† lIbV«`4•ŒŸ nN}½HQj˜ +Ùé•6¢ÍS¯L&·‚ä¥qZ›o½ÒÅy5L×îIЛFmQ•ÖLÁu Ó\ÕÝ*™‹xŽš\Œ'!h( +Õ¦»ØZJÄE¯N¹ AäFéð…Ü0”øضWaÎ"yiÖèȜxˆWôóE6EßiÛ¶6 ¦6÷T›‹c¼È JlÞmp>’Ò£ö³ÀK‘EjqÙïÂÛÚwd:“îE “ÄXÓ¼mf®Ruô]‚ñ 876®rH‡S.ê.‘7À´g·xWʐÊ(?ÂLÊÕ;xû÷Æø¶ñK#¿sdÝ,>sùF¼Œ?âåYoðáŒPcÎë +‰<šŠwX{ôtnAº×q¾‚_nâT€+´¼³º³û=¿D‹ ¸ŠÊÕ@ây"Ÿû ,e,à`iQÐù /ÈÖ?°‡1¡ö%)CÇr ߬>eFÎÅ2½ ôiºžo6Kû€ +´‰5¯ØwÅ@ Ïû6]Ø#‰o] ;¯E´b&WV&n$ÒÎ[Øiš9ÖÒ¸1ù5æù åÛ.¸5Ö˘°Ü÷3ù\—Ož² ¦öÍ´/ºNK´èöù!©á YG>üì$eÍX9'¬äDØc=ˆ:Pr›,ÚP¤›]RYÏ#ÚÔ@•ƒ ي†Íi¡<ŒrÂt:ä7–ÂÄÍß&QaAŸPX ܐ€ZÑR¨]U fªh «y˜›<[£·t¸ñ—½7¯‹¾ ­8 xŽAšš +j:VWǐ័aӚ£ƒ ºy:/âGáÀ•ú”Þ f‰lT)±ÈWQ:»*‡?mð‰Õ§  ïãýb´fÆõŠã#3®Ìø ÙÐó3®Ì8/3ÆÏ0£ÿ*3Ú÷™ñü3žŸdFÿŠÏßbÆó÷‰ñ¼$Æü.1Þ×Äx~‘Ōñ‘çw˜1®Ãt*ójòý‰!é™Àló“ “Ë ú“÷) G%ØÈA7")R £çÈÜlµwÚî35-—ÇÌÊ4>qe¡ð+€^“¥»Ô¹bVW´u» ÒÌV0JNõ3;8èhÇ£·t¿Äó1‹¤¼zÅr˜Ú5.zwHª,ÖcdkŸ½Y»jͅ'ƒì7"zp㨟œØoN hVÎÛÎ@Àà\Ù +MÄÂÞ(”w¢ZTœ7«Y8[è°9U'%½‡ßœ‡3ij¡¶P-þ<)R¦ÔÔÄ[á‚:vrìÕãU¢˜ÐßNÄ- (oaö"ÖaNðÒ¼­ñ踄Ä;'T £T·Ñ„zÈözé(ˆ)N¿äk~ Œí!ºÐî<ØÒQBþRËi¸ä3Ô½Ta°põÌÕ9*ìFúæŸ;™.ÙK³V³3üÓ *ølÕ|X.›\dÊ[«ÅWÖõÚ}|Ÿ©W£÷g_øvS@•§‘Ch¶®Ju»3Dö!4‚†ºÚ¦ZR÷5È/Õè¨ja„ñæû8s1¶DËÔ%VŸ¬ŒÁpqM7wQOÚ9ídÑÌtqÞø(š·‚œqdϸiËތfþÒY&^¢Vjž5Ù)æ*¾8mhÇJ‰re‹1¶ˆr¢Ïÿƒe}«ÏIT‚€ÝR값,\ºÐÕ&›ÊMP®»ˆ§Êëé¢&¹ôiæ±V}+y¹ý½ñ׌'j´Õ—‡ÞŒÕæO‰™zßzSŠ44ì­9’_Ú«)€©Ôa2m@\>Ù3Âú[ÃlŽNØ|"ýíÝc¾è îƒ¿tG§Û²ˆÅ l¸Ï„\Š„³xyçq©ï®AL¢Ù ç®ùLˆÕÝßµ•FõlÑX\¼%flN.ºúøÄj›FsùnÿDþ;,‡Õ3jHÖy¿„­U°u[ã_8‰'ë«#!¥õvKÆQËxÇ^J¿€¡]|Ø ¸~;ÖI~-[(T½(»þñ­¦ì‘¨ÓöÅ`›×|ÎfC¢îòh@G=ßLɎçúH¢?Ô§(É£ @Ê×±ì*‘KÏ.Ì÷SäÔ볜KôÛÓþq!HŽzxRjÝÙm ªPBƒk0¤„.¥ùŠ•}ò%‘2õÍÁ`VÀTE{…6ÆÁ†ƒ„OÁUÊõ‘®®³„J˔ËM3¸ Cù“—\ß»7s=D µ¤ù‘ZBlã]j%4D±„ÓD€suT8ۍRlÖóÖP<çè«â‘—á`!iíï¡Î7@åäu,¼ãƒn»&üººY)­ž®ú”pÉO¼í†tEͱ¨‚¨~(4‚W“ˆ†ú–.ZT8 +ß;ŸQEMÆtaïÁ‚êůà]H“ ³gòˆ™0ëGD;Yá\½ïl–_h¿qDª%z£J†y#ÚM³ãÒU“~ÂF …'ºY¥hε'É^hø'úsesœš„êÙB]¼ÂT!}ROƱÇ(p5ùÏÎÖéMÍÛõ[[¡Òø¹ZgŸL¹‹-*“ⲇQ“}$0q”•;(ëÇÝ«x[T7Gë@åì)fË9,çakOõyŸnÄeLJáQ›­ñ®þ¤~”-c­ÍaH¡_Q/£a’p­£Å•Kf‰#”„£ÐK;ˆE-±×Àl«¾1ž..åÌÇìŽYœUé÷gþÑ øÁB#0’«¹˜€1qÄ +%+ ¸ YûJ4'4†¯¶¬@ëXv|ò†óXôúLòŸÿjKҝ˜ ,Žò0ùËÍN˜W"ŠÆ–4‘M¸ Ïûk·âÒ~ø1µú/¢…yàЗ_õ–ÒOÎkØy æ¤’_ëyå[;‹¬T´ñ#¾þ 2:¿BFçþïӑÿ—Óô$UÜ b™ŸÊ+ý>æ–A’ô%£"#°»[§ÜàöfïêÃ2*!¼Ê”»ÀW„EÄ6íñ$ª¨ÛÒw +­Æš"4’ˆ‘ðèjI8\Ä?eD”÷%÷d½ÒÍy7”¡¡¿ß„‰Ã0 %ßCÓÄYé½m) Âc‚Ì9MòÿêcM‡ ç2¢‹ÜT K¤É m;²t_-»vÜFp¯¯¸? ˜ï&÷½É.ùÁ°8ÿ¤«ª9‡sîò$ é²g8d³»ªÚ¦4@ÝŠ/WIE žú,ۇ&Ái¬à>%¦$v»q‘Õ‘™E…² Ð·UöEe +ª§îðVfzÒ}W†ô‘ÏÔVçÂ9ÎuÓn¹Ýf–.¼Œ¼´Y6z8´J“VÕA2N¸–´”Ùb¡K$}ÐÊ¡;Ä)W¬£5ñè ›~Ñ¢Ud’3W±âòÛ¥æ9bTw2‰.³ ì{‹32U-ñÒ°¿hVf[a—¦*»›‰›è8´××ôØeá$¥B‹²É)]ۋX{8ñ?}úá§ä—_þíãþý‡¿µ—¿ýë£ùó×]yšû†=›œ~Áù¸«æ§øٍµï©Ó ȅ†Óƒxúß«Þ)Å›öà˧Ûï·WžÖ;¿µ7\ôRÅj¾µÁ +ü9CüÆ<Yy‚-îyÿß wý($íÁ—O·ßo¯a@í Ë»‰, +bhLfj«)+ƒ³÷0rå#w§ ÚåÜÜÏ×?|Îæ›%kåDJzëï/Úñ䯢ˆ*­ Árf1§5‘­„éKKz/Þ(áÏøÚ_z Ÿ¥³ Ú\;?ŠküªîTLÎÍð©ëþ\†‡oñ ÷±W&ÙÏ3vØxã‡|¸ÒN.}þÁØX=ÞxÂéq˜³ËQ€ã=çíUŽåžÒƒaðe'™ŽUùÕ6hìj%­ÐÛHHîk¥rÚal“Ú›5xÛ¤æœjIô²Ç´¾ÒdOZÝ°4OR:xGßÕj@ãj<Øcó2 ÇPŸI5ó ZÁ¦`|”r®'L´ö3z+5K҂géqÿÕۃ¢^Á:ûuUcÆFë­h13ÛÕAyK±Û¿dx®Âp ,$->™O Ñ -¤_¢Qa3™Ñ÷‚ÿígä¸qC©¸îòá~v ",ý¬™Ö¼q•* P‹YrÀ¯"8fÂIw8Ñ#&¡¹½ì_-a¿¦IOÝԅu¨)Úø‹ˆG»¬ do™L#?“\[ѧ§26þº±Ãy¼hñ/Øê +ˆÏdèe¥ž‚&<[Âûu¢Vèx„™ûËyœWül¤³õµÀà§aoŒ ÎIÁOÒå8`É}›õ%o’û0ë²î“s0ÀØa›mï„y?‹CŽ½ þ|"m£ŒïcW㡎žþ9ï<=O¹g8¢ÀHåJ”•uƒÎÆFtŠI.¯euBò1«œ%¬Ò‘—2çY}I֎'ýj¨.¼wgžDý`ËÖus´}ì@˜B@Øg£EÃÍMŽ ­s¦ä~–2Á«×eäµ Øk0÷¶æ‘AkÊi——È'a5TUÞ7¨‘5 +‘W¿„g +ݲ¸¬ x-³<æšÌuêFd“I£~Hh.Œ6ÜŽ_ÊS!‘L&ÇäÅfv'è;à ª¤ Îz© N¦P]Õåß2ãuÚOx¼-/(ƒ‹|û² pb‘«ƒbƒY+øG½$™ÝO ãËáájЃLçƒ gþ“ŒX™Áèýú*ÿØ}Ò%º}‚¿-Ž¢¬_{ÇN²˜Ï$ìýÉ£í_Zò ùåûÞ‹[@TäÆ_øÂôà|byºœ ïOèýKw½ylr¹néÙ´©Jƒ_lfþâ ˆ¥³‡oojc½Póí}LPûó±¿ÜÕfz>ŽQCŸ ¯ M˜Ì8±<š1#–pÎLPÆ<ºx¦A7=Ž†¹) +ó"u«È‘4JŒÅýš™:ݑ!³ã.Íä†G÷/.ú’'­‰5&Ÿ,Œ©t‡³ÄÇ5Vͯ06§I1·@J-¸žÍ\QëWÄW#Ö㐞}õý{…ªC6ÊÐj"ÎA8£¬lVYkŠ9¬’ U:ƒUÎ%{Ãÿ95.\c Œ$;Q¸4ŸG@B+ž(À’fˆÈï(_ù_(Ÿ}§òÙMùæ‡Ê—ÿßÊw +ߖº?"|ý¾~ +_¿ _ÿPøìÏ +Ÿ} |õ¾y +_{Oøꟾ|(_ý^å›ï*ßðδ£±š“Yuf=ãêGÀÓoJpÜa%Ãϊzs"œóªHR0V\í6ì¾ËÞw<È2X(–€7PÀ Kö©ƒÛZ0fÐà^3]£__cºgv†©+#Zë¹ßö!Ü( Ü) Ü)à=ïÛ~ßû~Ìò¾ +л`7 +°Ô' +¸1@? Ü`žÞ×Nïk7 +°‹ÆAãî|ít¾ùt¾íæ|˺3ÀÆßã}í¿ì}é +/(Ùüö¿@æ±@¼E‰ü„ˆ1t™½ä y¼f%kZTXå}Ãõ& *íraø)雂ºr(jäVÞSÛG'§n\½W¡phUªÏ¹™i¨q`LÿÄ/÷îÉáx‚n§Ë‰`‘N“J#L…<=ã<«ÓÆ4ž`*yupË9€NssÕÈü&ÂXøV²°œÌÆRÍLkò»ò³êAÀ‡÷ïµ<¡ô±Ysß¹|%dóuǸbz"¿9]P¢Øª²›N0S|ñ\iÕp꬜µ¢<ËF:WkÇlËz1¨ŽuZú6Æ"”ÆS[aÑ;њVb·Ä¦{£qy‚H¢Ðü[Û~ž‹!%]xˆ¯º6©°Ô ¥nÐ[Õ ÑÀOÛ{æÒj×Íå\~ÿÝn5VÆRà[ð“Ü~s*¹ødža°fÖnDðsHeê<Ðh²ÀK«›bOZ@Þl cuL9½Tø~nÁóqi©ig~kÇî·É3ç×OÊlÔ¡ÿaºIRŒRìÉS¡w‡¨L%A‚a)ZÛJ[‹x\÷´DÆýñŠ…$o2…œõÏ©¨mðO՟¾£ë;Uç¦xaq!¹_=+ 6q­…\¢:Š…ÀæDa—i€æ#µÔRµLÁû‚”a€#`¤Ö’ ·[åêÄ3k=æf…D^bδȩh88q©RRc7×û.²²iAÐ5 (n(,{4®@-ܚA[~ŒÉÆP¦~®8{Ö¹v>l¦òÁ‹´_ +„ûuvÒúòÛÏþÌi҆ï&A®ÀòóÔ+g(Î†!œÞ¸<ŸF óU>f=¡J¤LœíºT§ñxø ‚göÝiô–¿œàê7¶®§ –GQöÍR¸ “]1ÿŽûç…;=ܕ—ŠJÇ8geAª$²Î”×(Í_*òHøÒ,‘ÝT˜l!÷´.€kCx5 +v©YÐ +â[7g/õ&<ÜçØlPIϬV<8KkÁÁVEŽ¼d+xâä§åV4¢˜™â-¾>ÒÎrÃcI‹ ‘xûkM…mõק×ñ!©(X¤äØ3‡–…Ó¢SSå€ +KßFŒQ‘QKD(¸¯’j†Êš×Õé d-kÆ}•N{j˜©ÓĉÚÂBÔj9؎Õ÷(àuºs“æuš>Y¸j4ø+Ô}Í¥øÉò¥X‰Yèý¶¬Ž8˜k¥ð{ýnênhV eb·ç,Ž‡ý«ÝŒY“}–ªuùêž2d$ÄJ ¶Ý²Df…Ç/ÑÖ¯k_ä:.¼É™ÌÍ\•ÚÔÌ-ÂÒe˜bvC\T¨È¶Á¨%ŠíÜH×ÐË1kj ‡~\=Œdp{.H2š0vÜûÜɴ˟pªÕË`šû6^ð›ôÍ*™!<êµh·¥¬ì;YQúbõ§ýv'=q¹Ú#£{ fô„qÍ —Òc£- xvnªÜ’ qI@׆¯s°ßùvûex=b…$hÿa¿Zrìȍà~NÑh “î ÏÆ;ù c¼À½ðõ'#"ùŠõÔúÁ‚^¨UñŠE&ó9®ÚøG`€8Wtrl°1ŽÐû´“ËÈæt«/Úhē#±Ì_†S0ä)±Ï—UÂú‚fïûV~„•—ç{¿Ý›ãhîõünsü‡ù¯ë0Ý]ܐ,•cÈK£8=Ą z®â ¯™‘*ŠlÕÚ:駊Mf.ѕꆤ¬˜Ñ:ÉNc¶Áßëœ_÷ùÛ*µ€¤‰Á7¦ÍÅ !0<ݎÑ´Bú}ëõ%²·AÑååU/: 6e"jt(]s +ÛUŽ©FÝaB‰¦T°‘¶`&ž¡¯AÃlãœ}b¦HäG?V ö¼/0- ØbüléëcŠ¦7õCU_Q#+Q}¸¼’ÆcìÌl5~ß¼6`Tf¹ÞUøÍADž[WÛ4inQ;±ã'KíÔ¦Bˆ|]Ì Ì#… ÍTaĐþ°…Îñh2…²—eÿ–oŸˆä—x ®æÌàw¦}³/‚roQVluä×`9`¹³Mg•Å]®ß®¥·=ŽÍ÷‘ѨêÖdÉ5 b9±Ñûy[#„û¾Ä'0põ¸Ã’EÇïÇ·Ž#Σ·EáD·ðWÿ÷ËO?ÿòÑ^~ý§?ÿùO?ÿñoóåÿÒû¥÷öò¯—#} ¶‰ø"¨H´ˆŒßb¹‡8E†ü/ÙNȪí¡×¶¼l&¶×ƒ÷»ó÷Û'·ÝÎsöáŠÊ_ݦ\XénØðàõ_}' ²6\ĶÜî·î[€¾|­îP\Œÿ¿ýtþÊõ+Öˆ½ö+t3âaLýxËõ‘3TÂâäìt ìD”Èi²r <$!_½/TÉN+ˆ®æ¹áEi Jý0œfæ§?¼ʒÍßÀºýÝ_œ$òñ¨½Ù‹‡ÃE%rVpƀº!IùÛå³Ñ.4’ÇîîÈÔ?ÁÓù˜¨Ÿ\V+Ô¸wÑ‚íåt™a¨ù{ÃômŸñk†`7n~{¶þÒÓSÐ3\Þë{%8ï·àòX~‡éù*gæ£-½S¥·¦H‚{¥ŽVÝÍKN©èë'gÎ<·ì›ìUƒSå’Üт!û¬Å$€çG;ΜÉÎ\cd) OQÛ@tç¢çñnð]i~ÓðÆVÌd‹;¦ÊwË Í—K‹  gi¡Ã{ƒ×õè™Ç}Šó憳zí9ã„|^`RéÌ­o98vPìÚcú¥oÚø +­ªH–@Κ“rÛï¼é5¸\Ž†íÆÃØPciQîZe?*ÞêüÏÏ­QŒ—å´àýÕm‰ȗúðóñŒ}CX¬=CŸÐ*UÊÀï0$Õó + ð· ×ÞB3¿°ßOê8©©]‚ÈI“åØ9 Ñk Ž¤UWBô+=‘÷ÖöÆtG}œ™é·Ë‚ùi;}räÑu$ÓóŒoœjGPàFrG½?@Iº£8¬xü'ÙXøØñ p)vlpáÌê=1æebó†)è¡ô tŽÛmr5åNÜÀq·Ã(ᷟV_ âûåDùtg%Á‘üd© ÿ¦Ü8Ê!I<’¤lm` ”˜ÁÐ$Ó0µVôã*É »½9—­•£N0–P~¾{RÏ¢…öx3 +¥›Z¢æXÊ¥Á^\˜½ÖP&¨kj¦`5ªqh^Ô2‹lRæŒgç«w6|@ßÙ(ø¥éñ€‰!‹¯Pò±yh)ûwÌIÞ¤DºšnÒi7F$ÿ;9VÔÉ";®X%”³Êm°jŒ¤ÓYóà(ìLªøµð·ÄßršG×xb~¨ö¹6Ø~x\?¢ öÿ™6¸_ÁÎy´Áñù6ØÎ6Ønm°}¥ –ïhƒå›Ûà<Ûà²æЛŸ ú.³»Ã=Î6˜úڃÊXl@©ÄܒO4‚UhÐè ÁDÅKàwV©rÃÂt?˖½¾O[[´PF‚6n°B#G BJ!hcØŒ1$6MÇÓ1ÐN)(\gì9ÝË¥~—8ß +U4`wqlÁ +õk¬0‚ê—ÄqÿVÈ7VÈO¬ ‚Ñpے(¥±Y!ʍDy­¤Ð¿C—;)Ø7jc{"{ÒÆãßÔÆõû´q½sB?9ãœ|qBù*'ôuŠãú5Vè_b—Uæ~‡𩱫G}Cù€¹²]Wú³Ð&+ª¤Mc+Üh,Ÿ9•Êʛ EŽµãí0¶}u§I½“KÁ$Š 6;ÏçÞ©<æÆZáB@ˆã«,þMà€©2$yáNs0ß3XÌ%Œì4ʗ€ w¢áÐë|ÖÅm^¯8 +t©„Rñb–ÐYbh±¾ÐÅü8µTž‚j·ñ¾†šzžÎ)§º|õðyí¢áî@#ÎË\@uU)¬SóLY镍ažIÌ%•2¦âLS‡$dR}ÍY·Š·uiQIW´×?ŒEÆ1ì”{K:Q«á +b¿½z¾û%üŒ‘IC8õq`©~ÒõÆ©Þð b G"l¹‹:'%R?kgý<¿ B;ê°!ãCÏ ÷£ÚŠ¶±ÍW݄å]ÝFGÍÆ»X[â)¤(qdзÄŇ*Uã£ÄU/y#îZëñ2OŽçEoFÇM2’7©Ÿ=d +–ÈG¤9«S².©7®¥Q7î&ˆ]™Õ”]j_y)*J¬´‡.oµÄ·Uþ[µnÄûg1ßâ?~Yt=àK,ÖrŸT/ጘ +Ÿ²Áwcp$э#^¶­ÂQ0¥3G—HÃÜ£ýÑaê,*eçO+ëJŸ$é%& ²¶ßû MÇ䫤¡ =á ´,ŒÜH1ª1|ÞåäZV¹ä€¤cUAÇYN¬VÉ]d7ÍvãzÆUØ 5¡ ~»§Åæ­Ñ«µ»Mó3«?חüŗœ ñw9‘;·¹.»¡}ËZ<¾' ‹+®%OTôôfëW÷sê{‚Æ&üXüÕø"Šûé3"Ô³´¼w]<%Ñï>ɞ0ºÆìÐÀ&… +nó÷%ï.tE144U*ø" 7ôÌeÍÃ¶ß ÃªÒ¤a :ßVäÏâvÑ#×à½g¿Æ.-tޟh’×ã£gÖ÷Sƒ½ö€–/è;Ғ¡ñÝ"‹·Qºx¦dY³ÉKE䉰&õ–4fLnûJîXjQy úP²JÖ!Ãà˜ª³8ðsam( \î[´«£ãBÜ&Š)uP–KÅÖ¨ä¤ ¨([nçi™«„–eI€LéP(²òSR±ò¹ÿN}•ìØqÁû|ÅûRµ/wúøfÿÁÀ Øÿ(#"«»ºg¸Œ8–ᇯ«kË̈È薕ȲŽŠÏ®MÌX½ƒŠë°?ÞUÖy•@1ýn›tº¬˜»{žD'¿”’2¸Z…½‰‡ÔÚý8€X5º3Ñ}#ñEÆ»Î,Ƒ­f«˜Ý§gòW”di—¢zë²0Èû©ò¿^—F‡åt‡ ±LI†x)ÈæñnkZðX©ã"«};¬]‘óþ(¹½ò· "bT›C4[¡'¿³âBØÚö= •ªîÕ¥&/ØH·7~”¢\O€ÌuKÎD’ÄÊo­2ݑ\HÊä µ¸™d²×R™jf܎à¯HMÌøäD¥ÌÙïJaO„並͡u9™Ú!Š1í`Çc4™G±´‰–mç/•‡îA¶¶HÂÏ\"‡qQêØfXXkè‹õ Ìä±Éb¡ÌFÚÄÇ©ó;(tŸ0”mKÂÏOç¦×ˆó˜õ +µ£OWmÕ<ÇÿBƒÚ5¨î4~\ƒâþøÿ¨Añ­Ô²å–Ù*4±…5ö&ŸžÕpE®Å֗»VóӇ¤)w¨^hÑÑ­±àg×0 ùŠk¬1Î5°²6€mí€îԖBãÔ½OBû!ŒÛ³ì6TÄöÁè %‰°ytóî4ÇA5Ä ¡Žœè9•—rÛA®yO;‹KhÙù;ðEecd¯èz°ÍîõŞ a6È5ç 4›«z·:OÀø:Šô,½æ$¼pek‚jRJzKЋï?5?­ì²IڏZez@sî绪qÔ¶&ÝCçCK¯®j”ƶƒ tQWßCâ)Áø™ì2ãu j£’{XiD9hª0×Lwá€wº¥ÇóË(ÓÔÛjoZR ðžÿª$Üa,#ð‘.™‚=1¾” þ?¥Š´¿Î´/¢/¶GùÛ9#Q¢XÛtÞu,°ml0¯Bÿ +©ÂÒñ,ºý?ðñÜٱȾúÚÔq§¶Í_íßÏO?ýü÷üøõ?öü¿ýô×ߌÿò¯û€¸ÈßP|À¶œìž%Óó¾óV¥=³SNÚQk +[Z@ízô OîŸÄié†/ýáùéòûå“ëtûJkyÏÒ [$ÈLݼe[øƒM”-‘c7†(<6¸^SþýÓ¦ÍWà¦êö{]Ÿ ÿÄÁšo½ÓjúÌwrlñùé—ë%·ŠþÂæšÃ +õs4(d@¹uÈj6g‰äIÈÄft ó!½]Eàóð‹÷>ÄlWI±¦¤0­¯üb¤¶À`’DÚá~Lˆ«qnÕ¤Ó–Z“ÜÖìv‘¡¿ÀÇÃùøé~Y£ƒäLCC£±ws–¹Ë˜Ù2ò»ã)Ðua…Ësláb-]#{…+œf,ª“=xøŽ«Ýæ6ü +Ãyˆ½îÒ^wõ•Â¼ h/ +ÓR%&†]È7Bý¶OŒ»O¬»O¬ßô‰ý‹>±í>qþ¸OLûãŸåËò‰íUŸÈ@o^øD¥ÂȖ* ~ٜ ¯l5I¿l!/Áª%ÙEp0Õ™ùÌÊý á£<¢Åò `õîðó‚´f]8Ŷa;š,0µlô¸Ø֞ËC^é7G,:’¡µ3LW֜eøTÙ÷F“$È&»GÏOô"sáÏ Ûí5ß=LàᳪÃÃÃuu¶Y×*û‚ˆàb£:CËõ±ŸçÎÎv fØ,Èa"÷ã͹×ïsîé5ç®KùêÜçÕ¹×5ö[νîÎý´50f]ÆlÜ|û¸øö|ñíùæÛåiK¼øvYž0–oßòíé5ß^vß¾L¼|ûz…mŽoùöôVn¾½^|»¸l¦›oO_õí_0îùËƽ~Ÿ¿Õ¹7:÷ruîå;»Âªw–oûðíãqI—¹?,@Ý/UÆ6b¹v°°ÝÉÉÉØy(Wž#²'6:ãCe¾Ð">)EçÁA +¯!0êh/41ï®u-šxkçÆ®½Å EÉÇA.…mD[¢ê2E0Z€ý—i©Œ^(EÜùx`F±Ãg.‘Óå=hãøü€˜_Ãý„HÌÄÅ1¬ p>>H#ñ—dý$pô ¦ÔÎ >?;^ÎesÐ÷3?_åÆ̙ÑÝà•õjQۉn!È’™â\Àè¡6'ZïŒhV,3™Øõ±g—8} …èÃä&Óq GÊþ¼è`½é™ÙÖÙ+a“¶#ꢞ™­’DaòYҀðD2iÒÁ4 Šƒ>§O_[ÏÜ"cArà;(;t‹ÎõIíB„¯PéÑ'Ô3—•VòMF¶)†Ðé\­Ð…Ø‘0IG aô€ú‰kø(!D‡î,™H¾i¬ö0x T(:5— üÉìÄ!·òÕ¶…¤|]ûÚ»kßxí«ÿ%íKíK7íK?®}í¢}yÓ¾þ}ÚWví+í+ï¨}åiߟ)}òŽ?¢}vìc"÷-èÃ"°K-1]iŸÔœ½QIq‡Ý …>·“ gñg;p²ºÝ§ËLóí1‘L·¿íD`ˆæÉ ûôTU•ç„põ° '+À5k8ž>½¸ +S€dÛI¡XÀíLïÇí <Ðށúú…҅ҍòWD̦%xÏH+RÞ +X"6šIëT2šœCaK Ò‰u½‹”0‘aªV ðÐhYY©ŠŽ>oºe:«¶üSÈÙ!9!RPUɸy¹OP4èŠË©sc‡©gœ„ê§&y°ª„NQ”òh/¶J±¸×Ç¿ÿicv–­Ýƒ­4³fmçÞ«%Û[[†/-žRŸ:{±CÞ )ª%4Îhî#•ö|ƒ’7Ÿ^Ìn‰Ÿ_Û»ŽœwxÇ Ë º(Œ{ë‘àvÔæ ŽþÈüBgÜc¡'—|Eæ°ZÆñ¦óM®r(v›{zªLNç +8;<Ú Jò®Яâ°=òšXË tè­4‡1ÐfäNº{±‰wSöòÅĒIh”p±4Ï A¨6R]ïPv¸Ã)Ja‡MUªO„½Ádábà¡pù\ðe<‡%®•:ëÎæò¬.I‰)´óq.ÿÏF-¢H]EMõx1q”ÐŒIڞP¯I=Bg)Óo•ŽôlÑ­(Q¯™‚™Y‘%€ždïo3N‚¸»Â.n¼âE’S›Ñ Gø +a’[†—Ø:˜õè€uz.QºÜZfžÛÒñ‡Ì2¿î[—Ta…Çhâs½[ÁÜdlkü3Zp{`oðâzÉÖÕàõ MI±œ;ÃÚlÃcA”T€Daf‘ vv²¶Æ)Þnˆd…¢ºØ+ Þ"d5¾÷ËË%uni麫aÜw²° Iíhæ Êí+ϳ•Ëì*hz‘‚í®:Y +d +õ¬…r½Au©;Mè!ˆ`HHÛ  ’ŠzbQ/¼ó|ŽÊ°åÁ«MžXs˃¸Ä偝 fHa”×õ—êfípóëˆó¿rú05Îpb¬¡/ö/É-ú¹Ë噙ÄՓ Óu‘½r7.¼çñWR£‡EÁ$ÍÉqÌuÝËI=%yÏ£ÅëXîò;²èñÜÔ<Ö¸®½·áô-þìÿ~zú᧿äçŸÿéÏýóúÕãþãß?0cÀ‘– nËdNÏ%ºÏ#!îʱh$½…북þ÷³ë!W,>É˓Œ/ãáõéöûí“ûtוöò;+V<:¤›áΰmüÉ'*NçyðÚoxlp¿)êÓOõe6„ ^Ÿð{ߐŸ¬ø$Àžo¿Ójú,vrlñ±ê=®Ð‡!¾‡í9[ Қ|64²¸-Di¬™÷!U+—BçE2ëêã‡á¹›oø”Ë t¿¸,Âq¾ó‹_v»üÚC¹¹,^ùYr;ޜCU×A_@XÒKÆÚ³Wòñ#>6˜ÎÇGqtßå×1¹Ê»Jz“ЯÁªìT>3«Í'|ğ ½eîþœû L¨—k¦Õ¿C™018Âöˆ›Gó2üÓyˆë½³ë½[ï\ÌëKo.æÀ&¼AfF|lúìnúòÕôµ«ékÿ¯¦¯|¥é«¿ÉôõL_ý¢ékÓg@c1u|:y1ãíÎÕå·é.±oñÁtKgá{.·ƒzÏr}ž6Ê€r5FÀÏÒn aËý‚}_²QÀTª9òáï&²Dÿók ލ©µ ŒTќ»§¥WõÚ¿ƒ”xºdílµ^Ÿh1ÖƟ7öàõØ=ŒÝáZ@ú2C}©-- +«\ ›*WSlTgèìXÏó¼!ç9`‚=¯i¡öÍxû7Ìøx׌¯wÍøøf|>˜ñy3ãåfÆ˃¯˜ñù`Æ×͸ýžfܾҌۃ·Íøݍ—íÆË{n<_íx¾ûñLCþ­Ž¼GÞnŽ¼^ ù|¾ÕǛê_°¡½¿'3¾/¶ƒ†=(®*aï%u¢Òx’Ì+¹°Õ•ŸuQ@ +Aå]Â'µêD8Je óÞè~ IÒt.jŒÛ¹…yU_g›?Å>Ésˆ¡F;׶¥˜Z)T?áõ×Úgàê…`QŸÄã‚_¹Fºð5¡«Ç 'Æúbÿ‚Di—ƒ¸Îhˆ2Ji‘šFXÏÜŪUØúeW¯Oç¾Ïû\Núáä¯wÝY®;µ7šçîJ€p I&‘ •×N­1Ð2¤!žg Se-Žö2Jè¿ŸN4âQ(t(ÁÏ¢…z¼…N`ÀÕ¤ °TKc@Ü ë W>7#‡Ò×°½t@|"[ô5ƒò¤³+ÖÖ3·X¨÷U,ÝøRÀÝspþ@i‡"²W‡‚rB=sY‰&ßöšKL¡Ó…l¡ñ#a’VÂi×x‘ WŒB†qèÁ‹“É;—>M€‰JU§æ’‰?¹¯8D㑘w|Iûw×Àù¿¬vÓ@{Ð@ûM¸eØÿ X¿¬õ üƒIàè/½ûl–<ëÓSp•À„edPÇ¢ö¤-‹]ŽÚ ã˜BÀÏܧlïØ–úå±8™¬ðÂm4Ñ¢"É'¬h°š®ã xÎ16À>‚±÷¬éxúåM<¦—··‰–ªgÝÏõýÈ ôï@だƍ ìFö@åC<¾Ú—ßÓç¯$ƒü@ùC2øf.øÈ#´ïÁõÆe]É`<ßÊãm7ˆÂ€xKøP*×2“Õh”l«Œfá–rQýÓ¤ʀ&Q̼sfÕ1O¢,ØϲÄÚåíÈÔy•á¤Ç¿ ±¤Á32PfÙô57Èô”x¸z¯’2afÿs©2w(Î9XìƜŽ¸™GËÇd'n{¶xÖ¹ó:_UZž..(|n›hU|GÉ ¶Ëê:AOA3€g;ÐK{@é=~›Í îüÖáH#Æaî•vX&§åÄTX–™á™DX¢¡1•bÙ Ƥ‹56 ˜oëâØ)éÊóq²±ÈNY<:ڒʵc‰Ñ˜˜rÖqyqb|–¦ –Ç'Koœê Ï –kdÌD妵Èpé! +úy~ÑpNΉ¸¡_^×kVL×cӔ()‰þ‡ÎÒÙ;ö­Üùà¶ÌÄÓEÔNHVáÄCWti:þԋmÄYƒæã­M¥Ÿ SL¢yHÚOCc!+z0,ú˓H×Ú õ–&ç\KLKó ’i–~Ʊl)¨5üܒÛ.l>ßVƃ &àÉMÔ[ã¾+Z©^tïo5”“¤zúcÔý¸ hŸF +çÁO†:¡.õd'gyÛm#‹vmmæg‘ËiKÞ+ªá¥N†<‘{<-Ó:ô9IÞ¡²3ÐÝÉm¿ËÐÈ1-(«'Xit®¼ÖEÈŸwE™Þªo•J ˆ: ëÂfªÉ„‚¤AX\Ž4¹Øhê'¡þÉ~ 6G¹îC~%=ڊ/R=ïíùó!W“Ö¼¸`VGóyíØÌ·Ö·iÅã[χ'°ÚgIL}„.‚^?9§¹˜)µÇà(}‹´ñé=‡éy¨ïm^gNA<Œ1øòCf‡·Íí(p?kG›äŽa0ï¹Ò™KÀr#w2-¼[2¨Î´Æ’MèqY1›Hh’‚àènXÛïpíõ†L6ò£ªR_È{‡ÍB`à¢|.øVR!ë®ÐHèjW:—kMôIRHTH¥¡Ïkwì×äxIšµãyfã(¡•Mên¸¯¦.a &e+Ÿ{3J4Z¡¤³}¤\ˆáIñ®ñ6ã ˆ»¯!ìÒáVi-¥9µ-z„¯Ð&ùe¸‰-„ùRNˆQ§ë¥Ë¯eæ¹-È.çÁPÊW«ç‘¬0M|®w+˜›ŒmF nì-^\/»¼¤)-–wbX›mx,ˆ’ +(#ÿb¿Z’츍à~N1 …Â[…ÃÚx'ß`BT8BZøú®ÌºÑó¦BòP³à°óõ…ªBV&++XšŠ6=OœÊiÞ]ŚåŒ5“àãLYž _ëvsh<—0tÜeיL4"¡vS¹œ`X?͜ÑW²·OÔp`z$2b"Uȶ&rÈ~„òA cLñDFZr8R"©«ÛDìê{^÷³5&Xó!y`iÑæ"4/ÐTÃh¯í‡ìÿºÀôKÂqÂ'~ã| ±(çû'Æzcý‚óF8¼,8z¢€;¥-~±®'ºgØ`k+¤‰žfÄÛݬg_½l÷é: {ŹÿSfLûÃfLÜ/_⌉_0cºqpøpõPõ h +ídӁˆ”…¬.ú–Š’E²:'y›š×Pê ’«ÄäY'Úú Öèç ¬ÖIü0—ž„ø¶xFäsà„‘5Ø oÑyˆÈH´~SƒOãC%؆Bh‹Éâa0яÌRÁAaÍaÑ eÿrÁžx£Ð×ø-Œp"„¹4:| +…}Lœk1içP¥Þåò^eœ€uÈ8ýyäêdم‹:q™ՊӃªI—ß‹uÎ7­<Ç"öajӑU”ÔŽ;EIŒk®Á»P“Ëõ\iZ‡°®…Cä½cs"S‡Äbav¡8å”1J´@AT…ƒ +^˜Ð­7žnär†érîÍ ŸÚ:_§ù3*+ÝèAlY.ÁY[¼9 ÃüŸƒèøuüú¥}‘µòlnx¯ã/¤FO‹ ’Iš“ÔècŠí$3IÞólñ¸Ì ,·ýŽ*ÍtyՏ5öµWH3âÏþï~øÑþͯÿùïþþ‹wëßþýÑâ|à(Hí ‰ò˜ÀI ¶ó(H¡¬òM *H7o>¿&Ð_ß».,scóÞFxs^øðÛ¿¼rýܾÒZ~U%&Ï馹$¬ ¿ñ%§sk<ö ®Û"E½úÆ»° óâéáò;_ó• Ö÷Ö=­v‰äQe²Çÿ<¾ÄL¿{a¹~÷ð㥥[ôԜÎ9]!.OÇ!";E’\}ã B×½q»—%d-ª"P’˜ˆ?4¯_¿ý፹B¬Ô)æ"ÂþÎ/N­qûCäÉü˜™™¯w=Å[yuÕá Kèp>¬¯gN¿çø0œ—Ï¥Èk²>’¬@IzÓ_9»¹iPëöµî)óŽmÒ¢Ù'e½Áo¢'Ȩî×VßÂù)7šÐ+”KÄ@òžãâ9Ý¿Âp¯î/q—zì3.î3.Ý‚—òó!èrÕ{d(ÝÐØ7Xñj°l7Xe7Xå“«~žÁê_o°l¿üZƒ•>Ó`åÿÉ`Õ»Ëh°ò –kÒëÈ}­ë ¯ë~à[)´1t¶U¶Öýõ§‡ï÷ÂW9(>Kßy’›W´0(pšÑø¢x4ªXk¾_Æµ G«öýɐSó÷fK¶rRÉIþ2ùŽ–­kíKšôÍÜgZŠüÛtŽÈ£-Ððőzz Yë ¿_ØSXgôæ}}@¹PÁÃá¶ßgi”Z4QƒfѨöPSyÜ÷óÜÜýÿdýÝ7ž÷IRýÐ1 ߐça':ó”3AÉhA¹EOŸÕ¦‹:ž °8{ࡤ[³1Æ¢gß–õ,¶ië3AZk €²@Xåtw¾á†\?Ó :µ¸0ؤ0ó™êϓ0€¬L~MbªÞù_Î,VQÍ& +aö±6†x:3>uRPX“Á:aÖÖ|}d9 ¡L€À“ÂDrÅ_°§!"Fo¤G´D*\5•qòÝD^þ1GQ é‚ËÐg{FQ´qOI÷šÆŽ¯]•U'Pû3l²”X—ÔÎ{EÏEž”–VfÉeI‡#ã ªhN(P¹o!r„Îæ +ÎM,X66²îeš‰f¼SBQc!.‡ÈvRÍÑ—ö¸¥Þüï^Ûÿµý¿ ýoÙ¿x“y†ïÈ\Åû퐁ž•qŠD DŸB%J…{1¥`‡=ê¬`h* 9å‰ðJÎÚ6“™ŠÀ—²>Ì|äcÍÈĝôøÓo`OõZ»–Öv§ËÐ;®^[m0Ñ0î³ïrûaø!„€7tS'ìZ?qÛ~Nɶœ+èõ ðÑ$­ˆa 'd½a3¨XO„ù…ë•ðÓÃöùÀ|?ÕøølÓ ö×<}NžÐSÛYiNo)Êæ¶âM¾@XÖ@Òä(60v´Æ‚Á …&™Ûás%¿1î·-MyÜÛ^C„MÛëë;SêZC¡wZ¢ mÆ~wèÐ5úÀÄS3¯Kä …ûÔYÍXðµýÿàö¿aÿâ ßC ^÷îÃl÷Lë {>ÉÝJH‚>p6ÔæTMX¨UȀ0ò¾éÊäÛ}»L>P‡¾–Ë8!F%بZ»@—¹Žd+P'½µǜڀë«á¸ºññ|ìþsÏJ“¹Ö +ÙOƒïîJ“õ+h²Š&ó•&û•&ózöS4™wš,Pu +Ú3’l’Œ’ŒÏHR’ã…$õJh‹$ã§H2Ý#ɲ“d½dÚH²m$Y‘óN’ùB’Y¤hÏHÒIæ{$yŸ#ó‡92_9²íù…YH‘éJ‘é3)҆82_82$Ûã¥=n4ÂKoþw¯íÿÚþ_Ðþ·ìßÀ¬QðZüZšGõôy>øslÿ…ðí•5Vv-…ÚPÒP$=`hò…¼Ç$Ñ£b;@Q± •_P£Ê‘ŒrÂ5”>5O?kYGΝ73sUí ·ÂÞ;’k»˜@öԽ׸A++†÷GûñoŠÈéS§£€¹Ü;ʒ¹={m¾“$#õðy´¡ªëÆe1¬É²‘…màj/ý¼#‘ÐÛê³LF¥µ«ÃFæÇTòtŽ?§äW@ÿè€þªN;É{)¬»?¥›kÕtTcÚaù·IÏ¢övþW3É|®ê°õ<¯\´Êhç"^'rÇå÷$œ6¶væóÈÞ¹ +!ë4±å,÷¹¤^²ÊQ#h7×»®®Ã[àtc“áðLÕO¬sØ£4¯”pbí¼A +í”ú5Ôäk(‚wP8 ^'¤ÇPΊvß¾þÎÏ)WªÿoY‘­^v ŒÝºÃïB ,)‹Òõ3{hÀioCqñßú#º»uã¬É­½xȬ @µWYÃ>´¾,·R6ý ¬P>—~MJ¤„ËZH‘1/w³ÊIÛE_,é¢2©T©"­ +šdQí7`Úºš²Èj¯VÎJú*Wö·´B¬ìREË7“< ©‰=XG;ªÊêDÆâ¸ë¬ž”՛>óèWÁýnÁýõUr_%÷ߗÜ#i®Á¡/tü£]ÎÜàŽŽ¹aöùÚ¡JJâ¸Æ\{þÓÚ|!žÉ¸£:¹aJóÂo:¢BH?W´¾;ܘgø‹óOB}\FnDi Vh$â5g|èø…PSðœ—Iß¾›¯÷¾’ö×çï/ý¦úòÓïø‰9õ`ôÜ¯{ý?”ñø¥2îOe¼þweœŸ¢2ο?ê|ôÏè/FQA8“a]OzVVvâ95K $G®åqDq™êg}¨E·ªµýtá#Õց?B¹ÅZŠ¶|¶áë>ƒ´cͺåòAèð‹Œ® +é»Þˆš%N*›(«u2·—µ¢·kQOùRš§»ÛÿÛ +Ëådéb³B@-ÁÖ.vì-I/hx£°¢™ìñmH,îñbÙËñªTí“ +µEí:µö}E7P–&VáPwçc+rK/NHy¼Fª¶È·2Bóù䐊ÔØهìæ Ôy½é^$=7¬õÖò²U-<*]À³zÓk¶ßg*º‚ ò¶U –T,ꩤÍ$Òg֛ž|@wŒ{•œ ‡>rãí¡ýá™ÿ×Wîåþïæþ'Þo0¾¤‰‘—{=’ß „̼^D=käÍ9±á, +îP'.R%&'þ;=—¿ßéyˆ¿¸˜=üGê~1”s·dÄ<àaÖRJ%Ï¥MÕ9U4ñÀÿç׳^O·U×ϳIŸ¸äßïÍ¿þÝþt~¦ðçßß6VÔ„iæø%7¬Ý ¶`A{» +-ŽڒŒ¢SVP`qƒï˜l«®Â›ýÀ€d¹³rÀÑØcl•±÷ûÖ^w¯:w€YŠž°G¾-˜Ð€þ³æ¬ì} A-·@ԤǀjZ÷ÊA2·èPäÜcÁF«±àÎ`µP­&ÃÿІ‹8 ©7wX:ªƒiå² õ×E +«¯ ·UQÑ Áø +Füª£{\ ÕXÎò±=]TØÏáØòq¶è˜)GÚ1´tƒ®S¾Ö©¢èT<ô6¼}ûõóŽ:¹¯ ˜þñÈæ5‚0; +âý¹¯÷}p:¹ŽÔškۏœF.§ÔÃøÜрµ[f „¤íñ‰“ªc˘–X»\‹ÝVº-3Ò-xÈyëóãÃË°äD“0.´`ÎџDQ¡øŒí!d +M·Ãp,[ޙW’Ú•­ð³C^5©‚Œc_‡:{*C«jÑQ£p–jè°åá®Ù,BxPP§¥R ®",V $'3΢v]Á4‹%…J‚κž>ͳ¬öE¯ Ú v>r4±—•Ckœ©©m N*œã"dàœ7$ ¯h@ðJÂÚ ¼±cäq šP“ùC²ƒ„8›î"§¡¤óøˆÎÙ}6ü¶ó9IêŠöá(Œ5¤ðÝçð«À}øïø®º뻕Öß÷JéßT< ¸Ô1^®©É §¨oBÖːS¶Ã<³(JôkäÚíëzë)è C§vóšꊋ—ØAÏz€ÙNù7jô$h}Ÿ’&mÏGÉ5֓þG‡EÔ¥ÞT*ùµäìŠÚ…ÄÜ&Å +[£‚,𝘠yôâèaÀ6¶±¥‘O2›û¹\S[ðBr€`ñ;¼PÚzò‚áíà¹c¢S.•kw ‡ºc½wïGVØHú„K}uçWrBrL$5Uöœ¹<ÝâŽu©8T»ù?îX«W·0Î…?Ðb¬E'U 8¬Nß[A?Æg‰äÚ×},Äqï7¼V§ÇóÇk5 +VnkPä}Î筘qžÚò$’yÏWµõìžÝ¦œÕÎû¢æäb{×[O§x¢ÈM–~GrgUH‰ßôîÑkDE»´Onín¶­æ Aº€ÐŒ¨úXÿ³Ïx>v™Â‚†ÁI»ŠœÑÅý«Q4œ“?‰sIJà+ú0ÜøA¤`„µ,#(g‡·­s°2jã¼Éãâh‰CLãñÃjvn“f =CìÂ@qKÁ“n ÈI}¯—#úG=ßøYí6«r{8hïәCaÃ#ìeÿ ž€šÛo2Ÿ¦%E¸K=H]m.1¿­ÿ6ÓJÍI=¬-¤^$ ÏfÅFO³½«YæÕï‘ÄÏÛpTÛË{'þd €øêŠã ¾}Çe¥AãªÜ“ëj-ó~gŒ¯ØyAŽê€î®ßßí÷ýÚ‡Å@V%ˆý‘;¤ûRrfÃɨj§ÈmÙ+ ÈÄSÑtžÏÒhÙU½„©í1c‚¤ØÁÅËó”8ìBë$´ð€ª¨WW£M)vÈ@¼70Š;€.÷|? ‚"b͑ûE×h[#ìÎ6Õ-/ ¾L5’A°×éF>,‘Ëýáǟj‘—Ñ8Ù«ûìК‹•—g¢¨§\²‚–f7 +“$­¦Õà˜+´L$ÂCØPäÅ;·Õ"}Î^ù†•GÜ݆»$SêUôÈ$ºMƒIIÄ3Ùo[*ñ,]`¡"¨nOhÑTʕªFJ,ˆ÷ÛÙû“†~joˆµø{jß±óíÃ`uP«·H[îV/QjÄö$ýzÙÉSò˕ªu[RG¦®Ar¤ASݖì]ÌzœÞâ­ˆãӕMÊÍO”51Ô^Q+!{PŠ Ê2á=¿µùö«%ǎÜîu +]`~“äy,m|ÿ…#"“¬ª×­žÖ`ì•WñÈb±’‘‘‘„ÅŒ„Ì’>:à¾ëo„0x‹«ÎªŽIUÍ$Ýá~—©Å}"ò]Í+”²Ï;4·P6Ò;X½$Õ`Ziïo ewKڐè(7TŸì •/½iW•j lÅ3·À¡A«Îb&Ü‘»+ßa×µgƒƒW¼$›brŸky^@šP=½¢Î¥îL)èÕ»ìo.…D^×øÍrìõ͵×w¿yâ"aôÍõîã†ìփýIC¶ ™=2{iÈìO²úACfڐÍukÉnM™æ®¶,Ж•Ú²voËÚ£-kÿƒ¶¬?Ú²g_öژ}ԙշüaLSM* î ˆ‘:$&~¯éۊŽ$6£:ªHCC×Ó®<Ñ^ –ú گطwGéjpU:Ð<^…`³@Ճެn瞽6zØPd¦…äٻ¢ÌB.x}’<ÂÇÅXšc5ÒF÷J¿¾¢â·ŽØŒñõÞþûœ%kZ/ºŸŸ÷?øy‹?|š—:¾.֜yà÷/ Å¡\8°óô¹»–û®¬ç鬊pvwøýËy{Ìï³ÅÓϳósïý,BÌLkMF͞jÃ…⩾®x¹eàÀ aí{nwzÊAr¦GCR½é^ ‚ +j+I-ø²Ài?òÃN­ép1ôRÆÊQÏ ðڽɩù#&Ow÷(‰>] çs0ÏVÛ0^OS½æ)ØóEœ²›co‹äpS¸ÔCA6ž†ëْÉR YÀUAÛgŒÙ•š7Q“9\½=YyÁ÷Fú¡Y¸mè¹Ý:)€›hÞ1¡Tt»²’€¥]j@£iáP‹«ôÙ4¹gÓZ´ýó5by}›£æ—+d¸rå"K*»ƒìjØ  2¢FÉ碷InêZsúRóÖÑrqù.ÓÞbÅþj”^àÄÇU¯C +óŠ÷rï>^!â•î«±)ÄíŽ)ܳ”ŠMYvk{…ƒï»9dé%í=X,d,ù¤Ã›ÈôtR•uÀ>+ý.ý’þy°T _*Ð?©å7T |VúCú{*P@ˆ„¯y_òM¼øØ0ºu€{yºë[P#r= +Á ÆXÆޔdWÑñˆe]©ž ÿ•M•!’珁\øŠ‡›ßÒlàbæAß¿²®iS¿¸ŸÝÈ·ÆêëïF´Ûµ·£ï_Ϋcú:¨~žûÙ8L„IÁ\ʬGºIk]^îS&±ÕÅUǞs£b‰ªB’*[§[²árés×SÁ-*с²Ò†TRöi;)CsÁ=$êÏ/šZHr™’ƒQ³[µ1ÛŒ¨´8øAåêhfð4Gµ³@Õ¹eÔ7uËîc +Àœ-Юu¬r»"¦ºNd@h‹iú˜ƒ^z²û!"{̃ùÀ”dôÀ+®°å_±³åNæÅG+çêr›—çDºÍOèj;Ïn´évûƒt<;YÏæ›ÌûÝ1}Ž©g‡~2y)†É²ð|›w"ƒ¥yͦÇ~(Ž|ðž¤;  4›ÞґÔO´WVïh¿ÂW>Q:#ÐeV¦VÔ£RH‘¹`Í͵nxú¶Üø +óœÌ´påIëSÇèU°Où…¢Ê6¸]%Ƥ¨9ù€”]ƞ딓թ¿¢fmä‡Î"Â2ÈB9,œ¹ßX´póvý¸ÚaàAûªo ça§ÉÙ|³è¼<毣êéçɟDÊ i…&þߗü;$'^dù•¾9ah©•Ë oXö¸F’n¿K_²°ÛGá<¤Í1á[½LIøÓðOIãæWs”7ù¤%Á1$Ðø7ÃUFû ›œ M¾4óBÚgùØï|ìûçùhѱ_t쟤cù :–ß cб¿GÇ +5½‡4P vpñ¡E59¹ êUTãǧoÃFæJÙô9WZžåk†]2EÙ2™Ì¸)zb‘úÇ^ýDœ©nn:Òá Þ«a‡ëxAÃt_½[À ³  ;²D‡Ùéë̼Þ 2б8L1ÅjôìåØ¿7Œ†,ç¹Èh,/=ß)Ý¿•U2ñDŒ«­ Â?º~sG4Å«á2DÀfwι!T!Û~*€ï(Åܯcy)/(ãŠÔc–ڝ®"?¼õ mÅ;‡i?‘Þ£`ƒÉ$uZ5¢‘¿‚ñmzǼº¾¹jšáƒð P#D?Ñ?LýÏ1Øì™0x#÷c«¡5F6—ÐmOikÝ¤ê ªÇ–L`’céØcÔÈé&—Á ý ÔÔÌkH6cÌ[À•BKGם¡Gge”GÑîÑÄ<Êm¦ dSB«c¼š<‡ׇ”Ú¦‹$ò&œQ›Mkˆ`º"¥Ò7º6mj&Gö—'õ¹‰/2ã.Vö8« Š#FÑÃj›;]PKÆ3jcµ “"LíXëý»ïÇ,‘†qK—è¿\$(5c¸“1ç—²ç‚íÕƆbÚØ+‡¼÷ð +ûËü¶Ûap'©^ð +ÑïõÒxÍdÒívÍæ1öºN’dÀ©1ÝkN‰ s¯+~˜Yu•yޞrÝ!4!ÙvÄP9üÅ<¾ìKÔ¦¼@¬]í‚BbՉÀQ¤Âü+€Ô‹‡quñÖϺË$ˆÙÜ7 î÷¥kø< +z˜É”Æ%O$Ú£HUjۆôÚ/¬ä@®•ñ‰96$¹¼ô(2ÑÓ"W‘v?7Æþö¼²›zn_ª¥ëym»ÿ¡¿ÝǘM¡s—ZxY-¦…ªD6½Â(e«ÂD9jéÜ7ã}H²ƒtó›Ð,ݿӀj +>+†^sÿa¿Zr츑à^§è tƒÿÏy„ÌBÚøþ‹ÉˆÈdÕ{O–%ìmºUE2™aOæ,áž6³„Y%âÁÒʱ¬ íÔ0NZ…³48ÞþöÂgª«i|ÀB2ä=îPW‹ +¨tƒ£­«.È +°¯³…W +”Ì«Åkù/ä9NN÷qfœôoìG'ÁŸ ëèÓ%’_}Γ_à$¿ '?íæ)í4ó•û±Xº†/¹ŸQ/¹o·3ËCî«®xð/O=“ÍÒÔ9õQsd™`ËM0µðœvvêÕ;Š%ôä#ò\¿ÁN“9Ô7i ªÙÁçhd1×3 óɀ¨Vɟ»¬Sï, ¸[û»˜åbE¦±³¼È.,añڅk6âžöÕ_ôü'è¹X{­¿ÈùŸMÎÅmƒcí°Có¡°;t²#|–Ì$ö+¡<1DŠÑ8ز<žíh1F ðP˜'–› W‡°¿º™ðӄ åç°¢FÈxF òŽž´~‹‰›ÑKá.„lٌ™Áñª°‡­.mˆïä¼XQ•ý£Ò¹lÎ@`ڗY·s½8 +Öe~‰¡·é+ˆ +](H w –¿HPjÁCº8µµJ í LT‚waÄûây%b¸-q) Ú+ýç·É¯Z —Mâê' 魂ûÇ,ýß#ÂFÚ¾C%Šó8ò%ñˆ upÍͼ/Ta]S:`©/ͽ£ÿž×&_ósOÿ~ÖQ9ÅòíC› +ii“¶Ê²c<Җ¶‰T7­*r¶ÚÜ1gy´ÆEFIa*X,h¼‚þQs|ϑø!À)^ÒÖÝ%†öv!»´‰l*mÄøA𘠍—¿Ã¡Ì¬ÈَÿP¸×ބx,³ÚA¼[{ p#ƒfØGy +°iGE÷Þ堂Á†,΁5Å ÜÖ Y >"eí¹Î.R¦Æ°7¥f%Zj ›cÔw Ì £÷Ÿ 'r¸ã+¾KÄUT»ÈuÁºïPMhI0` g[è?Ü@ZŽ”«èÏå-ò–·$IÓ¼ŽßEfӞUÃRÈ.|µð™oй¢&þrpûÈ .šEà—žßšÅ·ì_]ÿŸÝõ;>Uê/ü«X°7Kî™i,rº³ oRIÑUÏG¦³ìÉÇ<4ºf$p— +’£•»j*‹ñÐc¿D¼`£°‰¦Ï?ãnÚa 3ïŸñy¾°¨^°%t™·çÏú9ê.ì`;Ÿáæì聲0âDŸcFÐ|%$ï[ê Gõa—“{ëõé3uäW˜É¢ÜÕ&ݑ¢hÀVM7ÝèH)·LD¶IEêÄ{Ô9ñèÔ*ÁR¹÷X*oäƕM(–á#Hì¡~€^´…fß8ß52†sŒ-4ã¼}m¡SŒëÑVòõ‘^n[è¥Ëњœ3”ør·‘Ñ}E[Èw”wð h¯,t.é²µQcb >ιj ÚÓÚ®½Hgïö+e`¬¬¬8ð冇™–níí}ýEô5¦ž~-!H‘$õ/·7wìã§ì@ét{c²létFõ1/!ó™Ýכ +½0ƒmœŸÚJ¸ÆäX½uZM ¤‚ 0‹oé‘JVñG"H¡Õ½MÀH·ôÌ›ö¡Y`ÐÛaà®Ì³Hó%ì³Â©®v¢ŠÉ”.óf`j5#VTé¡tsϗfƒé’PP\‡TDqÃ42—´ gÒ¹‹[°>ý5 „¨ÁƒÖ­B·Ûà‡§Ñç”Vz‰}LgT3öëhƒAìöT¾YÈ;B{›|ÌÛàAgÃDš$rȝÈëA}²Òx‘jÉ•[S%$Ò&ŽˆD< "û|·ÝH©ÿ`ҏ¶îIpi¶”NI¿OjÃÉFÒ«$…,r…WUÆ=åc;®ÓrM™Ž9psԐÑ|¾jȈ}Ä纱uñ˜ù8Sfã1ÂHí®6ò­„.`û°>Û>v•FÞxIÙ܊- ‘½EÍB·33Ÿ#ŒµÔ Ÿ¡–v ¥ +Æ÷]ØÆÚ +¯ÃD_¡µOqkíŸ(îՍ§(¬Ê’UêC[é’|aó@%£d:hj]C8Iõ9·¦´„ÆhÇÀ IëIâpV:ÐßLьf^Rƒ_¹ç°Os?)Øæ,²‰ ¤vVP(ޔ{ԚÕ#²Ã猑¬Ëé˜Â‹¸…NªXâ8Pø!©I‚x-]•Ê86’™@¸Š°›%™tI<óî"‰$þ:Ði!­^ ¼hn2·²®¶ª¶ ÄC Ŭâly‹ñ 5,SñF÷D í»í°ý|;Ü?ÖûŸj‡ãÞÛc;l?X1ûc¯^is:3ÿ&µÇ‰‹>7R\²¬Ê2#!2Û¸à‘×sI+é÷aY-ª˜`ý€^U¦–óº–5*‹eãát u¨²-WìªZëf¬öÛmüö/홶úȖò_ï?4ÆF b36€³–€Ÿùø¶‚>ó–Šåþú…ñ}¼¿ «Ø·ëýÁý] kíàz¢>¼_ïßÿ÷í˶À£èÖ,ô´U×=hNö^DBWõ˜)_h/É?;@‡+j„€vÇJ÷±Îx°S eÚ9,Œ¤Wƒ”ì¯d“ý¡'m7x9‹~ÃàsHk²Í¢ëd(Œ±ØRHIWÉC0,àÆV}C|'çÍ«V‡•ÞP5g=.Ñ®êcî¯G¢p{¿ûж8&*Ü©k(Á39볯—é×ìB°PS3嗫4AbëQwïz‹›3w%(’Béçh)…\ö²'Ò˲Õ{ë“÷ØYv7¶g÷1ƒÖŠ£BE€`!pÅH?:R¡º·o¥©6¿›¿°peÇìÍ3ee†¼Á¦·–Ã¹ œo! [<Í$W>Ð.eóÁ‘ûÕ !_IG4yls7J¨Í¢$wÕ¿çšì‹Õibçº ³ÂTc/·N¶“ÄÔ&*%õ‚†@S àÄ~H@iuôðÂÝXuT˜èFª8ñD­Ô ZÑйÀï`+[ÁO¤ÎrÀÄNÓ[«ÕÈ—<û]^¾Å.[֏¾IR âûòì’dsïïè³öóò¬>šª£lÑyV¾%Ïæï˳v—gíQžµ»<û¿©³ò¨ÎÊ߯ÎØëž3Ã"“-!¼yç?pnóѹͫ¬àܚ—Ub[RUiE%䅣ï:¯åðr8,›'¨u`XUXž•Žÿ9Eu,Oßÿ³åÉÛb¾QSíYØz3ÅUQqsÝÓsÔ3§–æo9ðk•S£³W +÷šûŽï9b­µ=§x)9×÷IÞ²¤üz¡DR)\s-ÙÑ]q“á&ETÑÑRu C¾«t 9Y¬Ün) ˚+u•bƒhòsÉð^Ao9ŒŒ#ž’%#ìiöÛ<£˜eÎ2œZ„+)Àµóž +xñªñ Ž)B¨§ìâï0x+@´‡ ¡îªj½$/Ë +ûtÃ}ûJÏ­lèbўK OI’¥ÆíR-—+¹:kÍ^]ì´Ýٗ•ÙœµÙîïì±}9lt¡SBO§’(ÍÇïz˜õ#œ•'j¯ž°† ɵæm¶+zÖߙL턏ÏnµkҞ…O쇮x¡]<ÒÜ× JïÎ ¶¤¦€'ª;a²_жËñ¤ÎÆØȾu’Ij‘®*Ÿf«ˆEÒ ä;ÉgÖ3°ñ+ùùBËÅ~ËBTî•ÊcÃNr£mb—¶’»…‹r¸+YÁ¬êŽÈê¢lúÏ'Ôæ&M•Í–Pd#Ì¡ÖìûGº1ny‡ÊƒÌ«>+UõH‡¹3k2)F‰$Q ¿ôÉ7å˜åz—â}—°Å~*Ó'ƒ¸•!‚á¬<×»T´wÛ|ŒçÀ©ê®iÿ²_-ÉuÜHp¯Sè|ÿç< +GÌBÚøþ‹©Ì, Ñ4)ٞÏ7dçC7>…ªÌ¬ÍEΞ2(Ly°í’ᨇ-Š•oA|}‘â«œWNó¼ÈD±‘Ðgè×(Ü j̨iŸ•NôŽ¢ÙF;/6qv´óùqÕÍ´~€EÙ£û¾ ËîÐ2ÙPsÿXСÆ%Ó©bêâϜ½‹©Ì¤ìʍDogw‚^²È¾V{+nGnîÈJㆮ ŸŠëf¦\Ÿ59NÙU´{p‹ÚŽê˜¸Ô ­ø>Ýp.&–ߟÞúÓ[?eF3N0*ý)oÝg<½õ‚]ś*ó¯]Þº¡åuom·™ãåº+v·›´kê|kÎ)‡ê@v‰„ cڙjFX_u3ð]’Þ†õ"^Ùæy¹‰Ÿ6ÏV+©Ù-BßzmíIß\ *ŽÓüò×Åä têÇëÒR2õ‹ +ÃèâsÛµg qWñwIʐs.Ë14Xiá@2>‹«¹O±"au5…¢/ ëªõÈ`/•xÂæ!ª›Lìó &ºAwwîÏ8”¦¨]›·×ed–‡#éÚ äÏê ¼gpoèn±^|#¤˜_x•2ì ÕA†sÁ•ü^»ž¿ÿÆñQ@›ÝŒìÇùK1Ú°¼DoJlaL¹,h"/ßÇ[j·ÏŽlg®_šÑÙ×ëûÆ^ ëí`½±vè܏€ƒŸ9Þì:ó 0ôžÓ]úa]ÉCMôvBKŽàòɺ¥m‚³=öîºXžÐzÓ +xô'´–Ø|z 7l¬ ¥Þ\kQ†Qe?Å79×=REQƒÔLKd@¬$û¦&ntÊ&€b’zÈE” O«†eˆTwÏ42lٖ>ö5Ã֌n®ÿlIù´%ÿ([R«ÕmüЖ”wk¦üzÍ̟­™ú§j¦5Sî5SÞ©Ë*;×;Beãí.TÇ/TÕÕitz +•ý¡2XN¡:° ÕþE:³¿wÚ l¡Ú;Xo¬ú÷#< U3¾®¡‘*â˜7¡ªVƒõhÊNô¢ó€ ö°½W sq€»%í1Z¤†ß®kÀð>uHÞº’¤Ó¾øw0oª¾Kt”=Æ¢ÕyC;šu|1˜éÊÓNeû?ÊuŽŒTÅFÈσ›T²éo)ëëÎ5 «Z¾J´ÄdV¹A©Þ“ºy­ÛašCæ*(½…äWi†³XJ¢lέVÈpihöÑúβZïÙ­¦îßÛxé>³å b­šÍð[˜öQäåÐCtÔ2ê]…JÞ¼@áã“ €ÞŽ³»Õ²ÎvŽ¢?²ÎfârŠ<ô[ ©gæQ*{dĺ¿à³(2ñRËÍI7'ŸÉÁ7¿Þ5¶¿xcÇ¥!»ì^Jµ-dž-Vþ¼ ¤fîçL¿ð틐YÐA1³ë©Æ H¤°žq…$>+Y"÷ç¨nŪFÖ°˜BÚGT#hVµ‚Çe5‹‚ž±tBùÁÏçˆzÌ<2ÂE3z*©¯ZÅD½¼TVId•à²‡»?=c¦|@lUÎ×ã³o1îµYlJyÔøœéJ‹reE9“¢9‘þÓ91ì„ÉjD;ÚMKÅ<¨Ø ëør/ªm¨z¡ÇKlZf¨±¬]coNyA|ÞدNp &1AµÜ÷pÍÔZF½@í©5µkÖøô±>GS”ÖĭʵK°xìÁ&ïíVKƒ²&©VéÚCEIsåf¶Mq°÷­W±¹SÂRs-hè'{^ÛzpӃ õŽ4Ä)§“²(LˆïÔsòÞDÖis{jQ'…Â8Çè{¯.ÒÞðUVöj»µâ­¦àôÄÇ5·m™d;FʗgR)pcò†''íŬ3®2.@–˜sA«ÆÀIäk ò£éÜD +ïw|fÿ 3ý醉"›¤Ö  Ô,uW€]L &ҋzE?ÂÝ.WµÖ ×ã«Ø »‡iyX¬%© rv"A.®tª¥î+Åꀦ~RC9–˜4d…Á‰ÛKÿúb S¦t£9¶ùÇ¨£7µÙSÖ3i˜HÖ[‹oœÆJ®ˆMœÀiZڐ%oê²Þv«»,Á¯›±îêu 1;¡7]Ge¥^¤âÞBˆ(³…©c”“I¤ï06U)†—©‘ó„¨ÇL¼}à+¢V¯Õ*¨XûP"Þx³kÈrmËÊ,8dRª^ÛÓ ëy€'99ݟÕãíü_^Þ3ü ÚÉ. ÷˜–WÍT¯å:C¹²?¸ƒcöÃ`^-håã–âÛ´èa³ûéé–ü*,Þ`S3yB»Ž ï"{ÜÒw;iËõ±9çŽÖ›‘ÞùŽÖ»{=gû+;ïº&+(ª›4éP²z¹í‡ õŒ2 ªUúǪ¯VŒh¤ @¯Æ)˜Èq÷©nVûù¦ +ÏüRöÉÏ¿ÌÏ5ؤ…•ýÉÏÿ³ü\‹Ø>âç¢:J'=/Ø5Šª³}µ±é¹Y$=[Bæx7œ&û½ÄSŠ¬¾±ý$yÊñ¢½CØ .°‹C²:çߤìNÊ6@ÛO—zÈâ«xóœ¿DÀ5ÌGGŽaÆ{vç.@„±ä® "qÆõHFùâðÅUnŸªùÎFYˆé2%%͹4”õ¥ Ì©s å äIgSw2*dKÊ+ÄÖÒ¨REqA–êhfoX‘¢#Ž%6Š¢9§·´šH=ë0t¬B´«a0ÿq5fÃU18Û£Pm%™‹‚"—úvÉÈt‚e“rÀD¹@ãEè áË®h¥ÀôŠ¬Þ̅x6>ª8"î=}=cüª`¢m×ÿßQæö„þ¯”Ù$ظET´RÄ+ô÷ß8šL¾Œ}°F?Ž_º¥…5“ø¾WâØ#q›~ãcöãk.¼¯ Öøâú¥ú”š¡.¯%µ„öp½°v½&8O“ŸÙ5­¶˜]fF™O¢:Ô²F0í›@TCà˜èè—T8ƒ ]QuIª ð³ÏçHòÛÂa}äT”­ +7çöu¢ø¡ÔlâÒ֌œ°ßÓGz"mÈõ˜ÿ’(Þ·'Ä£ð]Õ&֗kw¯*85«ùÚ>Šq}'ÆãŒq;cÜ®·[ŒÇ»1®wŒëãq…x¬[€ëßài ճ̂Uï0ô§SîÇv²¬+3îKpƒÓbø %¢£±4+Š{Ц|_Æï65ëSŠå}ï¸>&{M|ˆè>ãý~¢|…¡µýx¯ïXL·±¿öŘvt@Z€!€cßcÌ/X( ț¾ò-ÙØ2þ–Ÿ+pZ$ì¤ÜÕ&õá‘ó%³Ã(d}.o]Réä}šuA*P­×«]cœC£Ðû´('imFjþÄY{Èø>m¡ÈIhÞb8®-y¦ym¡˜å;^¥éX“Ôtl¡šôd.\=L>Ù+ñr€¶ƒŠs9h é]¢a•C“¨¯.Çy!öf¹\/61I"¨9җ3Æìke%ÅÓQý˜½>â/X±$šÿw›¢<ßíŠòÙõ_îŠêwEåOuEõ¯wEe õéêŠÀ7ó[ÔRˆ…°ì€¨hÔ)ñ™7;¬ÔFXë`f¿ÁÆ…±¨¸Ò§Ge¦Sg¤kt7P™•àMýcAµ3H‘‚Î%OÕzž81œ¾)¬ú•Lgílµì×f§F«½·ù¾#ï¼hþÇ í Ÿ½÷9+žjG*6^¤D0 OyUB qâˆHÄ VdŸî¶b¥™~.é[gÒ/¨­¥Éj¡˜Ù}ΝóªH!Ôo*1ŠS9Ú+nÓH]‰Ž1°óðŒçãUBÆ쫶ªÑuòˆù³zZ¼E¸»JFž Ðl}Ù‹gø™‡”=cS‘Íìjkö šÜ^`Óáp­%1|†Zځ–¶ö2õ5ÿî¿´¶¢ëíZôµwikí_(íf1 4VcÁêô¦+èxÿÍ~•dÙqð½Oá ´Ÿj:O¿ìœMî¿Pªªo»;/»lº…¯ÒL ì ù8LUi ©y5³YˆLãnM +ŒÕƒu$“@òzÚ}5Ù™¶ ½}AÎ +ù;5tr?-ã™YŠS§ f©ù“;R7å¶3M€îÑ}ÎG·Nãƒó fà‰bŠáDTU>´‹9M‘ŒÓ`#™±¤§ð^mY¦÷'4QD{¤æƒ/’ŒÅUUu4éªdˆ‡€ í^ÝãæÊÛC ½`Dÿ1؇bhw1œ¿,†ýÇbØ~K û¿ÃîäPfg™Óù7«ÝϽhºžšà¼¢Šq·M¦œ‹àq×cʐÏè·îA-¦ ü 3Â'Îy^«:“íU÷ÇéjêL֗§«º5¯«ÖçÇüõû«§°;«/ÙüçãóÌà ~ÁÀ^Ù¾óûߣø+{‚Ÿá7Œ|Àù¥{Ê~¾ÆwîðZ@X+h×5FÄ÷# ȯ§´áIaËùõ³²ºž²‚⋛왾¬ ܒ",/RÐÊ@ãJú3wÖm}žv§T eVtXDË@-å/M²Ø?¹çKŒ[µñ;™fѯpöá#¼Db9×ø;ÚX¬)äkgô€P¹€Ï¬Æ®8&çÅH«d´Ê--ö4î¨Ímî²å@‰Yíã[4}“}ð#¡Âå†íc…z&y½Ç‚™…[Õ¥˜T•SWyƒD I¥ò ’¿É]õ±·%»(¶ä­-ό¶Ñýaܼ˜ù½L\ì]U„ÐÍ–TеyiV¹‘)ì_¸’RêQ¦BZó©ÒÜ/‹ÓÊ¢ê2yÚ ®\w5þ øÍí¨‡f˜AUs»ÓO­æÎ B'XhÊ ^™¨‚F׋'µÇ>—ÑK-FœÍ(°ÈÒ9Úïaÿ’j¬öýkžx$ãÊu~@œ™ñ( +hOFS…i¥ OÂ¥ìH;À‰ã€rìÐòºí»Ók¯<0э]qàˆ\©ô¤aý‚“`+ [ÁOäÒʆ‰Oj¦m?Þû%:?$èûÝMªL¢jŠ¸´I“v³±Ö.M-pLÚ±laÒÊwLšÝ=šLýÚ&mѤ•ï™´&­kÒNq$ð0i&“FBizþõ¡G[w6î­ü¾G+áÑòªîü<Ú©owüMN-T¢–·†çŸToãY½+©P¾Y$U¢2)§ÔÞ)%i£yìŠ+àUç0i^ äéÀ]ø0¥vá3Ó©‚NJÂ§­[ø؂#0¾½Ú[J©"]eÏ~¹€áÙëé+4`1*@DÕxÊ&ö¾Ê¼[4ì* õVUë¥Jue†}ºá¶b y‘¥hh“ÁÚ$@l*áò6j¹\Á՘k>tRf[°o‘kSìwÕ²Hù•Ù´Vl´n¨t éŽÞì¤ö›¨‹ù#8'³¯dʼnÄ5¶±lCpÉCj.†DYLa¹Dê`ÞN-¹¯I˜W ¨0ÐŽ`¥*‰ ˜ƒ&“a +œ#׏šéSl+0ó¡ÉÁð¾É×bG•ñ“úAÜLðWuכLtÈm>uû@ª’×´ºÈˆ±jBpÈ̜7’çÑ"Mĕ‚ñïqß>eÇ2]Ϋz­x{J)–”¾ÂžLãN‹Ý^mÅSšÑãWF7ž/: zôóÅq͎ˆ  +¦¸zϋA˜Ã¢¹ÙdU’©ã"T·TULmÑæÄ£¬Ý¥<“´'Æo¡¹ó7A)ir¯Í¿Êááë +w' µ0,T] Eˆ…+£nL~5Uä$™§::âv­æÓ«sâU/´/ø剳‡POõsý¿¹~ óÛð¢ñ™ë±òÝ\o8Œ‡( üŽ}lsÝ=+¶¹ö׬ù²Ý0€dñBj«~µ‚u)÷ˆ.Þ@5Þé`¨Õ‚0íaž‹êÑ"ÅLûC|rÜó¶ÿÔ=·âG‚°AáFëýEáB |ËÐåËՋÉAé<*û +ÓÒC²Œ‹ +Ób¸ï:"P’ Ü’”¹ôîÅ6b‚µU6N$ã{rõ0*ž$Ì.Öí6”­:ÈþϏàøëïGÂ㠐‚¹ÿbNœ¡Vbÿ°ØÚð+X|ý¥ì5|ãÌzæú¥;}¾ÆwîðZ@X´ƒýÅÞaLð<~qƒ.êµ<¥ޕ<ÔEowèÁ‘BÝ2Y׶ôyƸ"ÐE{AûKˆÍxA{‰Ã§7–í[Gª Ðìe¥ýßÔÚNOEMRs—oLÙ7U9ð£K6æ¿J“”5‹FJ;0mC¤¼{¥húÿ û ÃVÚ査ڀ_¶%Lj¼i®§-É?³%óiKæÏmÉø-[Rn¶d~hKæݖô»-Éÿޖ”§-±ÿȖ̇-™?²%µbÞö³¤±sÆî939gúG9Ó~+gúoæL«N" •÷÷§PÝ~¡Ò`†›PÕáÌ{*ÿ¡Ü„Ê¡Ùmô!Sû‰Ìtf?*u–ß_ìíÅÏý¿¨Tž­'ò\•jž€íȽ©¾¼Aðºç»BuW¢m €‡€>e…ÚSI°ù*’§”`зh L$jlÀÔTqÄ>&MÛw4Øc~uù|¯·ðG~#•©²ó…Té¯Ùncݵ»eQ%V`0üµ¤ïEæ5riÙ= *—AÎm£Jö™Rîƪ(“!‘ÙN8ƒÖW™š~ö¾2Ÿr|WX¶j<¼Íˆ™ß?ÕǪ;Ý|ÛÃÒqj¸‡k@¦‹šÃ‡(Ùz3õ©./}ÿÌÏ哛ù֑ó™Icá/”;ñÕf•zzfngÛ +ŸÌ¨+ÏÑ£ +¬%f +À˜YùôßÙq÷$I >£ŸV.–¯ÆcöÁËâµ,UMAI®?-oX·…Xý´§M>R¢gW-€!…^JŽJm<¿ú¿úÔVçùzÒæTO{¬É ™û¹Ðû›/‰†Å7ê;ÖG=‰çï6qÕÐtçÇ*q.®´5‘A'ZŸ=Ž¿Ë”o[ãòÈmõTO0OÜíêlÆÓ ¤ó¬Ì3.ü-~+®èP®OÅé×bÅÃ{mƒŽtäh_÷ +N¢È¥‚fòŽœÈlù&{?ýÀ‡v8ülŠ›-¿Ft¹"Ú®€¶{<Û-œËÎ. ¹:x»Iì ÞDÞã½N­ÃDL°üÆÊĉb×ü±ñ´ 7Íуìê†7ÀÓûSmž•uOÒ\4òµ…2âÊÝÃI·àß{}åsÍ29—»§ z %ºÖU›vžÂ¨!äªú曞ìÛû†§:)‘²Q@i +M{zò¼Ýö½¹íåµèÍw× ì®ƒ>þöȽþÍ~µäV’#±}Â°¡ÿç›H§‹b­|‚•’ú‚*O#©AP7Ë4Í4£(TÁDù*{ë_§Ó~ýÒyütv#C—[fá!Næ)Ix¶ÉFßy%ô!àÓIÀ©ðhYî6éÏo¯âwꆬ| ¾O:u”söt(pqÔ[ŠúEv»Ç3ºÓÃÜIyˆú‹ÚΫXFÂI¥JŸˆf_¥^üVŽ{‘q!Æ2t•|•qã#ÙÃ>1›™³T®­ÌÐk4fÜ3ëJ;ýì§vᨛÍî/ÏCüÄtÃޙV&–×v˜ñS¯Sy#ô¬TkÀ%ÕZJ÷"H 5 Ç(!Osrº?˘^Äsü´;@Ê×ó?QbæèXWþ'—ŸÌ¨ã—«¸Á+WúÿÒÝOm[ŠÁQt»žYé¯ÒâÊδÛHRípw†š£ UPæ1 O33•ÁÅšùDžî7[€¬$ÝnW–7ÜYr©ÖqÆÜ®@A{B©ýgy‰+*q^#4t–ØÍN‹Lã|y—Ò/È& ÝóÓ&<-’ÿo~þçü<·‘Ëú7?ÿOóó²ý’¥ÂÏøù(ÑR•3np©Dã2 v 4pÏÐIH¼Þ/H2éýLE a‘…‚^*+l@w’›KÑ\†?­5N õMÚ!˜–\#Ömz‚‘\Ù'(ÚÛÔVÊY¤—[¦]{u:Óv9ÜóáìÊ +?(ï8ñ£'ASåM¹´6·: +ƒðÔ ë¹¶3sT.Xz" M¶:gÆØZœøë^²)[Kµ¬¶?”ª"¬Î¥=9@©5wŒÉ¶^4‰Dˆ¦0^iÖë9REä8ÅKbh·IÅ^i[a=µIçÙF¬(ÀQ»‚‰óô’žeášò"ç?{áž?…s}TAěݧ*Úp´Ö俤ræö~ÙÇÎFŽAû²òGå ­‡ÌñS ýcTžx|…IŒ¦/ ¸•t2ŽKrª6çœ}b¸Ž)êEù˜b"¹÷öL^|Vÿ!³MÈÔ>)d2hã!d_BœµÐlhتšLŠç3o&±ÓmqQÅ‹]JÁopðŒ’Ó©Îuˆk™™BLUÎèÕZ;ùÒÒ?‚f•@ R©n»Ý®†jó1倚»ºˆ€œo¿Ž¦fÛmV¾„ÔA-Í!!·è +˜HƒÍõ ë¬¹D+’Sú[ûv ”W%$2'>‰x8ÙçÝÎdߜò“þHûñöí¦ì¡Ø<³çÞ7iÏ:&²ƒ+¼©ÂSÜÊÑÙ ÕSë-Æ@ÏáŒèÑO|9£ö¨­n|]ýÄü9Œ‚ÃHì®>òÊ(8Qho[,3`íæ2ˆoëd0ªËe¨í¹ŽOpxL ºáG… <Š+y×ÒÇ£ì›G‘aqÒžåk¥=s±4•v²:}ô•º —&ùuŒ‚é ©u)»¿9|õlcñ«†³ÎªXZýp¿‘j¼™¢MÝ}AÍ +¹.³¥OÏøŽÌ*}w³dç×Y?y tSîQiÔ­í3>*8õ)[órf`D±Äp"ª*¡ÚŚM™¼éXHfn]nk7–fz¿q‚»$öº “BZÎ +ûÀCrîÉ\´Ê4y›âGÀĨÎ1¸òvƟˆ!Ó@Sý³nØÿ«nxk†ë—Ípݛa»7Ãvo†ãÙ Ù ë³Ö/ŒqÊÊã+~³ÙV]pî-«2›_ +™ÙƁ™žÎ8{.IR°ÁÍ<"¹zQ™ZÎëlkLÛþ­œÅö*~Á‘©þáýÁá6a‡Å2íÏ/Ó²s¼p“¢Àوx~áw{Ã>ËßÐ pļ­X{èø¥ûÉ£°,¼í!üþíDqfDÜÝ£ºývŸÅºã`ÿ³e o÷ +§ŒÓ„àUYæèÑð§}«•±Ç•¥+ÝǺž¡Ó0 ({#LÔ<µÑvU4Ð. +Ù¤–ƒjÒÓlšöXbš¤›µÙ0ü ,…”s•4T茞êR8H)äºkmŽôÄÏ\՟]/ŽÄàö~÷G pLN*ô—Ôö9ƒµámm6hí—é׬p + >ÚUŠ@½'_Èùè â$0*Ñ  8Š¥ï åC×ËPýÖ´ÿoš¶B7Öß>îÓ¹lhžñ[ìý{2£YžÍ¹Z2 ¹ÌÔew+$kŠ;X+ÄD‚g¡VJݕ#Xfrï¼ MK =‘I¤ ÞÝ%Š »žÖ'«óµ#†f‹ôXØ4.bhrwƒYºr›ÚJ>‹ôÒO ¦¥º4]·.»ùdSÒÍEZ O˜—Le¨;q0iA<°6óŒÅÞ¦„ƒêˆ*O®R‡ +¬ å˜Á?X=¶Î¤ý_—3ѵÙò¾À‹£­»¢¸v)¸s8ՋýòE‹ÿ^ŽÔ[Dýþ¬ŠD_'Œp%l>Bš XäâÝÌH‰´œ5Sã‰T1 `"%ƒoÆüiF=~QðC6YÚ©UÈçò$Íä£CÅÌ¡F@þ™<ŽÈ$H¼y´Æ¥ ðöìÁ?¼iõÉZ³Ýü×J Dz¥N'G'¶q¬0¦¸uŒø»¸–U ºûþeÐ>a+§¾4a~€…T ؛4,QÁA,1Ô,àë<ùÅÎA€ñ§ålƒŽ U¨ç¤ÛÚ";✣×鼎.¥†ü<‹OhžÄœEyim[f}/Ìtª.2“½²ß«ô·µx–FŽq¥„ô£ÈÑ>%‰GQ²L1½}÷°`+÷ÁwRbc-9¿ÎâÊì“câè*û[YèeBß)C4«Nõ2¤âðeQ’ø-¶4¿oûo}Iu—:q¸+÷<Èã‹.”ԐjóŒAþ˜½û©$–VuLZ±¹,ýn•fô[Ž©}"¬iðeܺ4Äf¢ëp@o¢À46˜@ð‰šûrU¾DS >™žþÚäknE¦¯Ÿ%m9Fúc*ÇGÏ1Lï1q觠¿þàp.—cýq~0·«ãë{gX\݂Wø/˜ñ}̀£¼¯ ¬-ôFüÒý ­0Ð,n{ë EqfxÔ±Àí#ðá÷»^¶ùŸö¢ñìEëW½èٌö¿ÛŒêß4£rkFã֋ڳ}QÀÏþ¶ÀíèE¶éًd "\s‰hȍ" ©ß^Õ1B¾Úœ?¯¨8~ΔhjKð:\œÜM(o¹ éUí}i×äå0w¦}–¡œÈ£Ñ %µÙJúfi’S{QÐf—£b$4R>š$ŠÀ~H +êîhÎ" +ÌÌYô›6Õ%’éUʗ¾€ `’#ùŸ4®Q?3©¾ç ~¢¹9a(7i®­þpa‰´€³äñÐFÈò5ÑViñûâéj:ŸÅW²@e`ÊpWQ‹¯ã€µË5v½ñV.Ëônµ¯*V²m×{[|¡žù·Æpàc +E68y±ÉȤ¦Èûz›F‰ã>m‡Î­,^4î*Õý'ä­ÈmøÇ¡ƒèÊM–'u…tŒI¸®Ù†qñ˜Zßæ¬×rOä&hF@jX›h8¨~^?Þk>÷ŠoŠ‹­û~³‰«ÍÿòÕn#[K"›ôˆØ>8o:§:ëq}æµz¿«èQ! ºUØ«9¦9.eãïAâ\SwÞ±H! úàëmÒR^¯U7\&ÇNæ×抷›ˆBë6^×B³#»…ÐÞvm1µ[rÔX¤[»¾…`$»dy¿Û¿4'ÖZeÉb­€5|v`äê-m¢éT)Uªj0T©’[R €Ç+&H´-þn”vË)¬ª­ÆÞ—ü”–{E5]òد–d)’¸ïSp°ø΃µ‹f3÷_ŒÜ]ŠÌª÷`mÓ ¬*¼"3B©Ë5wè´_º„äc½×ÒìùšúP”Û;-)¸z«uƒŸÃz²žn[Í÷W³•wOC}‚öìn4'0Y8û™){E»8³Ÿ Ï~Hüóàîq q_º–ÏγÆm r‰ü֋Ùï-ýö¡áv6Ü¡†[ßÜpó;nyî¸ã+7ÿ¯Ž[¿Úqë7tÜõJǝ÷õ†ë-u<4Ü wžÝoh¸5™ Eþ›bKiŸÒœoSšë…Ò´sˆÔ̑û_”šù&5û¾iÍú¨5뛴¦IWz cÁ“>×t¥AÐ|ĜKLÌ$›JÊÑàí䁗2‡Q­‘Ax H¡/,0û²Æúª,,W;áºÉÙ ",®þcžx™å3Ö®´iûw!‹… +Oå`½*´J«Kñœ'RÝZ‚ÍP¿LÊÚöõâȾlàþܶ¯ÍF§!¡ÂbÏ2”h ³j°½nÌX-Íñ63ii'Ô̌J,Ýdù‰/¡ßû±>–ЮV*û5龦j6=3­ÿnßÑ8Šå•¥ð˜v(*ôÞ7ꂯPân¿ƒÝ:’u]Ëܺó^ïA%ð´ÐЉ³‘ˆ·&NîZœ•T• 1B“IRÐŽ@ç}{²ýÜ ëæ$bO®œ ߟ^9ÉÝÛ{]ïRb;?‚ÒÍwåGø}–ww¿(ª²ÌMž-‘>LSTìÚÝeŸY³ԍ‘,\k8’TT¾VìP_ +d¶|µöš} ƒá‡¾ì3hÉCns´ P +eøџzO¶Lm^ÝôLaëàÁH'ßõ¨˜¥Sì['³ ÜT\ýóˆ<ùÂõ€ŽÁ÷ð6yµJžLñÞJK‘Že~ Ñe­æ³«¯ä úîÁ/Â[Í|”+ô¢u²ü$—’$ãý¥rnm:P­³¹g>Y#Þð^*ß(ú€%ƒ›F…ÅÆà—9Nñ҉eÆù2+ޅ¹ŽhŽ8Q€6Ò ­—¿Ã¥ÆTi?יüAï?¦ÈÃsǞ®×®—ÞµoX _“r×¼Zä<4Ì3¯†¤fT+S(«QO7Í«Té‚xMø<:µ—¥’Çh]#7ŸW‘Z1BaCe…Ê8×9·©\Óbe_&œ±W¶’¯Cz¹™`n¯>¥Î´¹²Gluԝ™ï(ïÐÎ×ØYV‰ÕÆ&CϘoðê4@ì­µ]årÙÔw'E±·Ú¸9“"žDgmF? kvF÷‡þó'÷3˜nB²- ÷ýŸjeÌÌ>àée¸í}ðG¾1ýxbKo'Nœˆ®q½¡2­¼îÖ²âz"ûqÂý;ß·ìn 2ëo”Üó&¹çƒäžo’Üíg“Ü㦸;()õ—í·lüGÉÆ>-€sÿ²±ýrªq %çüݟ3ºÓÕf‚e±| jUå +Ô|”»òãf7ê¢D¥¾ ,•øô‡ C˜cÂáóGð¦E͍ ±“ÈH…ºaw… ï"¤¸âöñîÄq ; +âûRhûÂV¯†F5ã9&Gw%h“ÂÜè:fŒä8H“JšgWŠ¯l&©ÒrŽ)¡á9›´éZ$W…˜|R5ŽÔuI—²¦Ï¤ƒ=ø"ˆpÍèùW(Ѻ¹69-“ˆïèí1ºøƒvH<>ÀÊXþåzÇP›G?Ø3—z{Bñ䑙7W¹rC¬É|‡¡ååÎLi8{L`Î^W-ŽµL|$ê¾F5xhі.ז·•E¯W ¿=°ûIçå×î2*ȓLØÇÈOT¸¤…2®[R­­Mª^*MîYæ­o ¸R]R„¾Q”&Kió‰sòœâ¥S1u6çˬª*”t…nñx`£ê´õòw¸L"RzÑ”?ӎiÊã¹cO×Çka×Kçv«¢Qš?$‡ÇNáùabz*Óôú¶·.7ókÒõ]fL©‚ž>M,¥fåÇÔ²¢7ª×;À :Õ<6Ýh]µ0έF‰†q!ÈÔ^ƒž =»Û­LÒ`ç"¨>Yº€>Ï% y^Š£7ŸœÀ§c\£S\—®å§gßí¹±~+¡³ÚÓ&\ëÄeZ•¤´ +`€D¼°D ,߈[teêY43Á"zpI%½_Ní%òþŽ.@¥Œ¬ÒS—׊ l¨”[2¡ÙçÜ&í&ŕ}™Ð̙ãz´•|ÒË̈́nRy±I óJâËÝVïíHêC3!ßQÞár %FY¡ &ö ÀŠ²Àw®ˆ¥\ÛõàPË,vž…5)Or¾X1nÎÔ{>—©¥¨}SÊ¿ÛôßѦ[Úö¼ûJý ®¼Ômè4 N5@4-+l6ÏLn–¥Z3ê´³;XŽ³ñƒ$‡f§¶²­13V58rJG¢Ce‘’ÀGx˜âA<â:ßJž ÙaäZúJÚåfMéÿ{Äú G,Óýö9íy?Úºç}À¥ÝR Ÿ"»!”"ïU”Bæ¼ÂhzrO~Þ셲©)Ù±nŽ22šÏW±8®[+øfˆƒL%‚ç#½»úÈ´2º@"=[ÖWI…„¦âeekX¸å\ÀJåG± ­==B™ÏÆ]ê†ÏPW;ÐÕG)àü£¤u·üë0I˜òîSàºû +¼ ë+PVàu§öØW ªÿ‚Êì¨f”MU­k™[÷&Ó{Dâ½Ë3ïu–#ØÎåìÚG¤o¦èFÂßÒ•+Y&O{ºíÁÌY40$v–†½7PÀ)÷¨7ŠVd‡ï+Y£Ðàúü0eB']`¨¡`Ì‘Ô%Á¬–¯Êe| ÉÌ  3kIÃRx/—F·W}IⰝÒzà‹ê|"sÍÚ)¡›(ˆf»òc0æÍÇ/¸¡,+q8ôëÜоÚÛ··Äý¶–Ø¿«%Ž{Kl-±½­b*ò®Ž· ›Í®ê‚ëB–U™-0…Êlã‚G_Ï%EZ¬¤ïƒ#²; W•Éå¼®kÊâÚ7N­S;¹Œ9¦Þi ÑÍb^¡LC­á»!¡Æ•ûyƒk>±T†þáã.t’VNp9*;ÞxM² ˌž¥LÌswâbÂ%ò(œÐudâü˜bDÞ¬XŒ Uj£ufåƒÔ¬¢ +„Ì(…•ýEiƒõGJì€ ìôpxaÆM¼îՎrìòTÌ«u•GÔ,,Jdr,U>ÅHR2ÀH5T#Ýߝ¹ì¬9®ôæ¨ú'˜ ZZ½"…à´†§:ÒÞÕµf\÷pdžSuÕ±¿1+€ {ÿ=9¶,ҕ•^ 6÷j¢•Ó9YT$¨Ø†Ùg TŒbÌC«Í)>ÈDA¼7ǺÝyÇ!…=Ý/@øȐ̋ÆÑ #-RêØ`RIʯ7ER[ÚÌzÙÐÌe7 zŽ¹Ýª«Å!–ŠFFdžnsbçÍâ“Dù”æÄY«,žEaÐtR¢,à 4=iœÈ¼š\» Ú¶ºg¹ªÖ%H¦œþ`a›ô|òÐél( Û¸;S-ø‚úf7[÷[èܦÞç¤(× +í%ß̖Uȱ›šŠ5N@bԘ-ÌÁCŸMtãüV^@{v· ŠŠ„Ÿ™²—“’‰Ç010jõ½ÞW/|KÛX˜æ0ÈY¥,k—â1©õ‚æ,ù.ЋuØfÏï’^p„”Ú{q+*ò†¶´¥#¬æ>R“Q6ðôRµ¦À„Z%’XÂåãÝNÉÉÀ!Æ#YsÓàKb³å3©˜Rð¿ìWKŽGÛûº€„üÎ#˜…µñý$#ª²^Ë-ɲ1@›îâ˪üDFŒ®«lÉo›¡ÍîÃt ™Êâ†#FmöÆ6ao6¹jk¹›â=o–ÉK›ÁðŽ”îžÔ>_r$ïíé$*`ȼ}xð É-«ÕnõóS=àZGXn£‡ ¾{À»#ô×¼¢isx·JLðAtNLþèœVºÚ¨+ù¯ÎI-‚wNíÙ9}§ÜvsɀŒ‡ÿø ²â ¹ÿÚu$9X[Ø¿yù[mÞNî‰âM;úš/(–¸Ú1Ùó ;­¸;åÍÊòЌVí÷Xo +º «![/.åî¢ÚÞY¥AýÊâXUã¶G€ÏnѦh¾ªÁ»šÉHße·ñóKðzÊh‘æ/~þãçžÌ†ÙžEÊù×þüã]Î4ى¿œ?Ts»€Ó«¦õB¼áõ›‰KæêêñB·ü;'¸qbŒï_,qý ‡Øὂðçßî=ÜoôóûÇpî3s­G`õK•~D•z¶ý.›ç[ªT_á©JóªJëT¥ñT¥qªR{G•ÖC•Æ)Jë§E©ça½†‘Ð/^ý?ãÕó—M¼¾E0-òàà—€S£ÈÛÖX¿ ž‚_,k¾™§ƒk’å`á!åñÖÞ,þƄ]élÚmßLY³Z±nÚðUQ®Ú~T-xå"ÊŠø)HE²öÛ¸ô¤¸de%‡¥u˜EY8í¯=7–å220°šÎ¸æ–L¹Ç«võcú ³“x+W­6wáRªßgåÕ÷Ž4ÍöLN¬;µg¹Beþ@QŽIÊÙL¯ÒQ +ë~Ì­{¾én(=¸)æÀðh¯ˆ@{é£ +Ÿ)VEÍL›‚BÉÌr?=ãÌ×"Ž;[„$Hºª8ŠAÈ1-³PC™é‡éƒ‘~m•SÈ£,ð¼9çb±„9›8`S"°‘œš£‹ÞÅ9ƒIÛ˝w¶|©É EB-IO’¸_ðãÅQ.Î1”×æÄC0}|TqDÜgùpÆø ”mE—a™A©½£[Äû%OO†jë„௒™²ÅEµÊ³™) +z^:tÍ*T½†·iad#Êõͬˆq+¯bõkL„9¾®[u`²EÝêcäáòµ3øl)¿Ñ=(ù™“³”Y3¾ðœ^êû| è¦À‚>Ÿ#IDS|äÅQ?ÕÙ¸9¼h—_¨ç>£'„” &¾§ôœ”’ڐkÿpL쎀á›Óâ³Øڛ7»Œ:å»ëZÕ Z' µCvƒ€XcÄ, ß(yhQ3Ëký!é/oqù¤zò×_`ÿ´ÛvÄA_q¼^èa^¡xé~ûZÛ1IJÜØN^Œõ"÷ÛK¿2Ý}Œù`ÂÛ]BáD&ýÑkä¡'¦|_Ó-éVQæj“0”—M°›E††rõœOå¢U åÊ4²×«Sc`L×-€ÞbäæڕËð§µÆ½‡jjÇšMrIb³Û;ÔÓÔ­êÙLóW[É÷$½ô{ÝKúi–Ÿì Ð%˜¶‡'Ìk‡‰”Õ+4ôr)kS2fø\UÒĨ¶ûÅQéüŠÍgr“äüÂaö[ÉK›ï(yg´÷·ø«¿Ã_ëä¯qò׸ùk<øk½Ë_ýŸæ¯~ó׺ék{­yõ¼ºeÓ²„ýe‰_â²Mîe[¶øIgaæ7´u°®t¼b=‹%Ÿy-ð8A]`†ËAf?¦¾‹!JÞ)¬CMUˆ)³Ê=z™&èKäa.Ó§þЦ‚³ŒØªñæϜwáø ²ÙJìpQþt¤öë %Á3Õåia×ýDnPe÷J(Z{xÀ¦¨VõŽs‰N³?IÁ«ÔH¯Mê2²šGKƒGÞdý°ßSÿ¾¬áú”õµ¹RÀ;ðq‘ÚëJy•£EN'.•I¢\–a¶ +TC1ãåS4¤Þ5‘útЍ¦k´dþña$v—„¼@+ $òr3³-'› 'U] v¸ØJÿßõbgëážFú7‡±˜º¹W¨µhmóM÷üÒ kmE×!ú‘âk_µ­µ ¶qé`‡oõ†ëﴆýÑ^¢·†å›­á~´†ûÛ­áø[­a=[Ãýnk¸ÏÖpž­aùùÖ0?[Ãú/µ†yž1~C ƒæ[¾A u¿«†õTÃùÃjØÿZ ÛßRÃþój8û§¾l—hq涣F{\Ñt#uAq åUV#³Â]ÓÙÎ%7ZÃòZ\1‘ßU¢6sÎë^×È,ÖŒ—Óý¨Sµ±­òPüЀüá…?çx…4 èü²#ž¿ÀMs¨¡áe™ lÚ:mZ;mZ{Ú´vÚ´Ó¥§K+?ïÒÚáÒ'ýϺ´ñpiãÅ¥¿tiy¿-«n´åðú®Mû«öm­£+·MC]ݲIÈ+‡]¡?GËåðîsX6/0Ú´=5J +­M’¸JJÐK +mO¾]\š‡§þ×öü”WåïW{K!U¢3s½ü³“sÔk¬Ð}ùWüR3#Ë&Î>)ìMs_‡[b©µ}á%'ú>É[–t_n”È)…k®Åû¨»â&‹h +˜Á¢ó·%ä@ƒìéd±r‹„Ô*â¶BPW>Ðð.‰Ð,èÚAކz» +ÅOɂöƒ4ûí<£xEËOKÊ/®$÷Ï{*àÅkÆ7.h»#ÔÆSvÑw´y+@ÈƇÚBÝU­"ŸÊ+¹òÍÀ}ùr"¬p›g1[»tÈӁ}ÅI6-—;¹:1ûtÑbC»J›â 3Ί&Œ´e)Ç`ÙÂx9IܣׅÞ̌&ÛÌý% !3ß`Œ`R1uógN<ÿË~udWvì°¹W¡ H§rXŽgí‰÷?ø@Þð:Ø=ðùšH¯‹E‚`Ù1¤4«t¢‚£PÕٛ ‡l$˜§Î _e]wí´oеSÝ7íDˆƒ+w.ÎZjo’TúGôZ«ùÕ=ñª' +?Mè '{pyÁæ[e{­²¸—)¤V¦bªŠ/[r1aX5–Hµ[µ‹I]Ao±LP‚ŽÝ=6(âmN:oKPV.–¼ Ên¶õ¦'žªðòÄ£†Sf­R]ɑ‹¦«Ñ…º\¼ «EƐÃvŽo¼ÜÜ+`})‰Š³×ÀG·&’o¿aòñVŠæš)mÔMúH3û͜&*Égu°~;9û5.ç¥óóïLð™òždv´·)I[‚jÑ´Ò%$ÍMQ˱®C­ìB²“CÌ.4‡ÈRK¸¿Ûþr:r9{4ʄݝC)$ØX6àô£7HÎs'ïd§ÓNCI]©ùÜ&Çìwº—˜t¼7Ìñfcˆ¶ =G¥ôž%4¼³QöS4Vœ%uHðEA%Îñ’<éNJá¨{ÍHf÷§»ß°œ Û>-IÊ4õ•Òþ —©tÇÑ*ipIš–Ò=Ž–%º—H!rmë@ç‘Ñexˆ?@»Ù ¤o=ü…¤‡¿ÀþÉE&ÃøéÈí4óý6;W·m 1¶ “yt‰~%pP[Þ`…nVߚÁy©Í£ÇµÓæÙÜQÌ̔öwGhæ1ÚóBû«Ó3°I[YÝßf !ñzŒyOá™®‰l=lyÙJ|•F¹»8T3Ȉ,À0ïLÚ.¿_‚§…P²øâçŸç繍­Ø_üü_æç…èèù"šßH4«[CY¿„àÍب÷ÃeC~º•Î¿ÿäxš•M–”Ý~©öœÜÁúFàÖ q³ÜüÊÃWČÕÇm‡À‰Dpþb÷öÚ!ÓÊó a­çŒä+b‡ë=9—¸ÙöŽ=¢‘l7I|gYЗ9Ùê—Ç*Tß„Þª#ëh +?Ê¡‚˜™ezÇpjLåÂçÎ|/sckUŒïãoŒH²ë.æÅZþô¸JšäƒŒêšÝB8½å°0AZö[Ã[8õÍ`eX$hæ–HÛ¶ÀöP^ðV[å„ ž=UsÈÕ¨ï%çFP– ?œÖ¿¦.8÷ Íי‘¦e/ÙÆ åP ý¹ +G‘»—L3Ò9`¦Ûmãœ×yl·dí'üòlRû¥µü¥»NwÏ4‘*_]ç[ÕÌ´^6Ũþ·”†9v窄ô`"{$I‰’ø†»@”e +`qå‘Ç<¾á rîÏfn"ãÕÆh©xàN]b!ÁXF”ÛŽ˜™†á7úÌò§òÍfBé^›ªÅ¿pR¢û Vã{1÷Z]²‡”Ÿ³è½fî[Sé‰ÖQ+à›ÖõâJ§ç¶ýÛ,ôú-TX02JL¦Bݵñxx=Ü ÃOۀ5€Qa$ƒ‹0Ãú®ð¥šÕj@Q"·¼Ké3ÌÛ_ïÿúþ…¾îè&Ȓg=½d 8¯ÍCá€x掱Â:è«’&-iÀ×2¾ß!tü0Ç)Ét£²:óO);Û"C +Îw q÷,b” 9ˆoa2È+ÿQ …u®“ü“±,L{ëàfïÑ\m¯uéQy&sŠN®­Q¨4§¼Â1„ÖKù•ç­XþÎÖh aôÞî:{¦¾ž”æê í;+çöæs6ÆóJ´i±3½Ê±²ª·xe†2k¦ú¶4ÏÖZÿ§ZŸ†”3æ.cšÿÌý—˜SFªm•*£Í =åJfÛÂo¾JJ‘E…•mÍ +Ùœ¨©ì¼Eh¼ïPÿÀ‚*ĈYå=º”—Ãÿ±_-9v$9lߧ¨ ؈ÿçàr\@<5¯+¹çÞWÖ«"“›àUd£+Eù<{¡ókÊuŒ5ç("cù|‘ñúˆéºQµ.ß6â@ÞïFzwÉÈ „…¾@"7›‘©*¥M©9ž±Ã]F@sÄz¯Ã…§éä0֒¾B-í@K›uºç‡ µ{mÅסåãq¸Öþï–º²À+Z‡¨Tã*ù ŠUC?²îÇܺ Œ2£I}–çÉàAݜÉçÉâpT&пL¡D3óŠ +WÈΧɽ-\v9É~â΢Â@#†úM¹Gµ Ð9"9|¬°‹| z“Mz˜ÚxÂÒuT¹¾Ìö(I!A¬–®JåÍ& +ÉL ÜZ¢ArÇsöL§=;1”tbHëÁ 2 ÓM¦Ê®ÒìN9v‹ÄC@‰bTq Â1ÿTÛSÛ?«˜a³m4¦ÖåÌmG;½ö¸£éFê‚sß-­z‘ð˜mÜ›æv.Òb5ýeX^‹+&ò; JÔfÎyÝë—ź€ñrºuªÑpÉFÂî'å·oüõ'Ç«éå€Ô/;áñôLä÷m/Ë[à9ʅ¿ñƒ=–éP=&¸1VÀ÷/Å +å˜à9ÌëkÔ7_›G‚ß·8Ú¶‚€±±<7R=Í´Ù$ Ä!™ªOyó*‹Hv2¨¨»,àÔ7qP<´øE;Cúm’œdE ›Ü?ác¾òÅ´ü %…7@7•O’ÍÚø|øJv•BÊ·J*ÔëÊÂåvHi9oæV%Unes¤'6„«ú3w׋#ñ·}ßýÑ68DÆB…Û"/g8r;“°¾ùz™½šjRÎ\«d”"–î®x‹›3w%²é´×®6´#¸}kaí^íÖK__÷ý){bQ± Ï~õ)¶Vº þ°ªÑäKðö6Ur…ßTóŽ TnUŒïUül•kw„^g²A›þЌN벂«ߢú-ù‹E57 úµK¿ “ˆ¯|ãXÜænXû%‡\EÊ9À·p|‚)«£Œà"ŠÃRd÷'S֋)é\à /w –“¹\S²ŒãÖ³+d;Ç3Në”O‡x×0íF¦£è´„`AñÄy_ +¥ÞÐ*†m šlec+øɁlY˜(ahbz BµÓqû²X/ݏ¯*3ƀˆŸæ¶Õ~âËh„Ælª¿ +kÖ>¶f—ûâò°fùaÍêÖL6‡7c6Žò‘7›îÍ&½Ù:½Y;½Y{z³&oÆìí‘rdkVš­ÓšÓšå¿±fí°faŸmÍÚӚí`ÍÆڍ°f÷¨ÂxZ³ˆñ»ºË,U‘º]?Õ¶­y´måöf;¿Ý]ÛÜÑÏyé°9õçè²Þ½ ëæF«C€V§FM¡éQSWM zM¡Õ¹LJæ­üN¯3&|QéïWKë:úEN D<ãb˜›£^cÒ3ÿʁߩìM:…{Í}iÄJkûÂ)>JÎô}ÒZÎý¸Q"©®¹–úÄ]q“e\£¤ˆ*:Z* È#Ð }:W¬ÜŽV+ ®ԕ4¼3"4Û¹Ä'…WÐ[Ž:qÄS²^„ý Í~»Ï(ZÑòÓròǁ+ëß=óž +x™*߸ ½O6¨§ìâïîìœ×…B9n<Ô êºjýˆ-A¯|5p_¾ŒR”5^ÚDæsä!K²ÈJÅóµ“ [r>Ú;ÿq‚¬fO¡ã»[jMÊ+aU Š7ÚAæiî;øˆÐç[RC@Œ0Ùo˜u?H›À¨¾‰N•°* f ‰G`ê…|3ùõlœæ™¡ïXyn4˜•ôbÌܞ’Ôˆ¶‰zäJî±C2/ÒF¤5äÊÞùÏ(ÎMž‚³þX†2vÍfg6íîU˜wX9%Bæ]_r•ÜÜ9̝i“I1Ê$9ê €!u­Qrh$¾Èïzua;•$ˆVÄ·2D0ÅeÈÖáb¨´™aþæ)UʚöIˆ”'0(JùåÂÚ?-‹”!|w‹«aªJãe¼XÎ[,Ô‰<}õRíL mùº/²à³r‰ÖQ,;*Fò 2£¬hÂKCÔy\u2cÞ t‘DŒ^×u¸33›lI0÷€cŽ`WULÍVP&Ç(+ÆTgvðFÒa'•ÐH62Ì[§8|wÃôDtv2ñi=нãଠbÝÊ˝"ӕ¤›â J™£ÖÔ»pTçÄ­Þ(ürÅÛV™ê½õ¿Þú}r€_ö?³ÖÐÖÃZœªß"ó8nk=Ðôº·¶Ë¬·ç†$‡´}x΃/mU#ÔþJ­ÚÏ)PCÞ_‰"€4‰'Oë¶Îí÷Œó^ƕ,˜m\0׋²ùjÊF´´Oõ-h|ÎSrÌ.†¢ç†4˜Ö¼i_“*$gøZe?%&Kž¹…Y*¬¾KàDní®)–Ë +‹jŒKf¾«ÈD¼›iæñ‚Mº¿Žm¾@˚ꛆÇÉ´«„Tá¥äDÅÚ´³‡ú È%/Gj ÐVCà͂'›û :hFH¿q”2ë e¿õB¬;Ïy¯XO‡¿þücìm0¶Àe!<™¶q΀1¼¬’ËèþÆ5Ú¬7†È9C`¬¡/â—b¹uÎð\!æ cïýáÛ×àÜw~Ïdß,»¾Ò:¬öÔ|Ü'Éåû-5’{ï aMm^¬fñ›óÒÃ'Š7­r×|A±ÄE¢r£vÀ>P×Ã5%˜ ©Àõ”#8Du %é…$id#)mÂÁõs¨Ò\&ea%wŠä¦°B*»'‡ÌG=Ú¿Äúʶ}ü½YŸó!ýáC.Wâ>¤<|È«‹'>|Èþ{2>åCêáCö/}È>}È<}Hù¿ûúô!ëó>d>|Èåæ1~W/É[òïÖËøT½ä£`öO fŸÓςégÁÌgÁäŸVL;+¦ý¢bf6òø…@a|<êü…ò‚NÊÝr¹e¿ÿ"Þh§@Øêø…uÌð\Aóß;Èoçþôíó/•ÇׂQ4£Ò“(ºÕ_wE¨/rÑÖ ÁèVïJ hD¶ÀU@‚®1OWåWëÔ¿¼1]’µ©ü€Õ»¾ƒeƒDÍ,OQǘQt8HF^_[³Ã¯YÂ'Ý%€·­ìʵóF­s“Ê4ým-ž±îŽaØÓö¦2‹!ïQÙÈ×Qd\½ÎWÝßw/»@2©Æ2kH/Ù e’ä˜ðƒøk…Bv+4¸™Ê+ôïYJ”éßÛx›>ó·?ðÛºV­fs-lûH +Oï0y”z+ Š/N `¯uIdä£ ( `S!¤µS}JÌõ}#¿ª®UÑ£´ø}å~½Îg¥OfڕW†·}µø<¾ùåÆØõŵÝä›ýï±ñV,4ä–LW»õ]…ždÚ(iPñ˓<Õhw3DdVʇez³J¢¼‘4+]‚H×ÒlNH_v/gs®â3ë™d8·#I®¥ 쟃h]Œmh¢OÂa¡„L•¶fl!Y'氲߀‚6˜Ò]9ÅâM¦¡v&s³³/‰¾C‚§`»$ ì—"(Ȟ +éûQ¢´…}‹·1"|åO詽 =µÏÐÓÿد–$;n¸×)ú­ øçyŽðÂÚøþ‹Af‚õXý™ÑŒå±d÷æEåc â“H䓝淰S¾>ûCäÔ(0¦_¹;±Ô)–TdÝPSz¬Ö@bŠkÞpæØ_ „Ã#´ƒâž¥,Юc¿@Tt8,pÚ…˜+$+&“)VD8±£7¬”s€‰ïé#=ÇD*ƒª*ïkÞÝÖð"|Sk²`¶M{å_þmÒi'÷ˤR”Hì’ÈÛI*GeññË'œ;¼Z:’bh?C±à% £ réƒÝPK«Æòbáʨ¢>8gîgü/ʂR-Z=¡"çR¹¯xƁ©ï•Ìý‹ëTô‡Y@@µL™ÅoÐ~û$úñ‹ÈïµÄëÎÏ´’D´ÇT«ëiO°£G)©Ñ2Ì}™§Nߝ¡¯1—ÇPÆGß¡Ijd݄Åä}{߀f©®ӞHÈê¯ãßáò$ +Ï=µõ%UY¯ÞX 2΋fsÍm*8SˆƒN:ûâÚܶÄ;^æ_7¾*‘Ý|Åö¹`q€K5 àüþt )zW@Ó{Ö¯ˆ +Å^X˜ÃŽ"I,Í59/Xaå q©ôÓ¸VÅ¡ÏR1Ö@ÐhDãâ,y“=Rrß\S׳ +áùƲájøÍÓbµ§»_Òã7<~(ä1=c¿ÏŒ[ÿ×wk‡÷'ÜrN¸ögO¸ãO¸å˜pËmÂ-isL¸vƒñ„Û—×Téì  z$F&Ñ‘Ô º‡R—ÑFVªüH;c\ŠâŽö››h¡7ï(êù€­ÏhpHÈÂQNP${%ÄÌdhX/4 $*¨—#›)²QJ®¾k¸]cÌÛó-S·ÀÁNmVæGúÙ{Ԙ>Îy>Ö´ü5×`‡ØDWIJÍ"b«‘ðÑ|NI~… djBCèd=CM5eÚ7€¡W;ƒ„åK(9yÁā.sE8_NUËÆ®54‚¥R{Š²3¶ˆ/» +÷qéñøë ÇM—¬ùƒa¾3ÃÌÎÓ#Ÿnáøý,›Ë¦jXîìãá÷Áç®Pgj£nô//ÔÇêò=ŽO7¬¬Æãìüp| ˎ½ùú>:Ö·añõi8.ûH¥…Ð)¹´º‡õN¦ª.̸q×1TûTl\sE5ǃ"BòM%MM§2³Ø5² +‰±¬oœöG¡÷Ôúu?šXTƒnfĎÜ°R=jz­´é9©îdP5‰\#×årYGÀ‹ðM­É‚ýÙ6í%Ç-̀¹}pÜ·qÜZä©÷jЗ1éšœE„PGUåX{ÍjŽy$½„GX7YÁY±ŸŠ5ö $.±¾qÚ]…PF¥qñhª÷ÙÀ¼“µvà†`½Sf¥µøHÏIޒA՘dI ™—uÊϱöš,؟mÓ^¥fm>2zÔàà„6pcÌf, o7謖¢ÀŒÓZ ä<áñãªÌ;Úo^SށözóŽ¢k°uäzW +.ԂÏÌFñ=Wš(nv̔]Úiò­¨xŒ¤0£1¼™Y”•…}Ž½@€¢]0mJ~s´làý¼><üçy¸¹ÞÉ~’h’h9I´I´7ìmk {ÇÁ²„ŠDAEãݶg慐ëöH(/ï@‰ €·Ð,¤æÐp:GÂîÐÅÑ,ȼrÅͪìú…=^ŠšžÃ)sn÷ÛgeᤢÔÝ˺¾ Z(=Ùý¿¢pK m²ÁùÚPc\µHJ"run7‡(—{ÔiûúÍ<îÎŨ8(Á1!’N7ÿA¹wܪ{º‹’,ÞÀj¬–€¨ì3Ԅú0DG ¦×²|­zÕ§¦üEè²b!oCfešW5d*%˜±¥±ø¬Cè%»Tš(’XËÔj¾}£ê¶õtèëFU9©ž%kÆ U<y‹Eñ;,Õ@‰ÒÉUãÙ­m[¼VËÁ°vƒ¡ Ó¼)H‡$f,´(‰¼¢*x ëãZ•·²>}ü:3†ë@ +°°dΗ?ýDnk'¡Oc¾ÈFU`Yy’µ>3Y’tu¸>¬-+”&ãÓ\ýÎòEh©—Ý`£wQm„’ÑF‰ΧSþë¬þh½¨?Ô D±ëªÈÉXUÅ|`8Ä·µÐ®ÄŠW°sä62{™që\$љÊÖè=# IyÄd”ˉ>®øÅýQ(2qÒ:1™5»ígüÏôeš—ΰ%h‚¹ê“¤¹žq`ê{%sŸ˜â1 ê®q¬¾1›—Ÿ}çRÉÈx¯%^w–x¦•ÍmMbu=m¹2zç[B™–¡ÍgžbT¾;gŽ! M‚Ë#¥ù˜8‚`+-e݄l4yßÞ7 Y€i³YyGŒél:‘ÃnjÔ^ȃÂSêàÝs/[ @†Z´»‰Ò¡àÄa:hÅ_úÍ<-š‘]Å|Ýø$ÌÛs†[-Ĩ\PT‚óûÓE+dLwAÓ{FwdÖxY*Ì>E2]<Lªljhh®¸Í$ÛXaË#‡ I¹¤q­¢>¦ú΄ìt0ºžk´HâÍcœ5s +¼ŸU Ï•gÂÕð[Hƛ_F²v§Óùò\7¸ådAP¸è¸ :g[4zŸ¦àh>ÓT›V2³O-%€ÑÏòfáåã¶Ê».WP +Ñy3?V¯€U2Th?Ë=öþºaøAÉ rÑå`^î Ώ5å»ë§„$Iºì § î5#<9×M»˜ÿŽ¢³•ÍŠ>WÖ­ÏâÜÂ؎)¡/=•ÄÐH$2%Œ¹ª{"¨´Œ×évøu×ðèSÌÁHŸi¼×ÿþ˧:ØTýò¾0ÜqÇÃèŸZ¾Ãـ +œ%ô›·xY«#Ûù醕i}ü‘ݾãcXv의FÇÑ\Ưï†ã²G2/¯ÓÆ\þèJÿ¼®ÔÜu¼ªk4¿îË`!KNW¸A·&E¹m®œu¼fÆCïÝÑ~óºëö[Cž(ZÐ1£D§àÜçÞ í›)!ƒ'¸Òä’IµMŠw ¡)þ@``†ô²ÈzESÆê°í´ ¦Mðo:xáB¿žYٕQ[{‚DäÙ.AÇk¸–©Š¯^sQ¨å£Ÿ¸pŠû°ß5cÆaÓþèj e4¦î‘9@¨5Ďÿb¿ZrìȑØÞ§¨ ØÐÿs£^´7}ÿÅÉPJùžk`Ãc4ªçmª’O™RHŠ œ°°Å[F‹ôäÛ[7 ìCWtÞ¡ú:>¦Ög+´Çómš8kç“ÀúA£ ¡ºÐ»’WIYt™çzf¦P52+ê‘dùYxkº šÊ§QU~uÚ»×"n±…¶¾K2€€Qg€œÇtœñ맛*Aa¯Ç?O¦,›òo,íúO•vkì[ßs 6\ɧË%?@êñùe ̍¾~jÝZÖrvzçëË %ãǐùãcvÌ-“°Wöá?¾‡}÷ÖºšÏ-/ûMÖÍC”4ŒÃZé'‡-8t êéD"ÎT1^fždGrîî«ȅÁi.f‘áz„²Y´:¡¥+M]_@ C À²×X …²Ô7ŅŠâ†-7z¦{íMʙ˜y°ÿ¼©ë­TšEµX±OSia,ÃÏ×ÉW. +ˆù2µ“ætŠV6w°‡ôD" +z—Ù&Áêb& +Il` +æÊ{Œ(lûéê’¾~ò;ò±DCnÓW6½q¾ímMHñÁ“ûœÜ,‡Á{µš÷MÜÅd:ÐT‡â(°™5®žÅŸ-Úº®ˆ¬;kriˆ7è\·Žp·¤Né™±®—79^£:ÆÕٞgüXQ£ ­Ë«¢~¶¢&¬Í`A姻gÀëþ2Z¼Qú’ÇôeòÚPd|æÝ¡eÓHb £t]Žz¯ÑX™ÃX”œóŠ£d@ˆu7”9½òç}±¤¹ÂÜßTM|¿ OڂÄ[àÌ=5¦ѕɚ$Ö¬$šG¹¡·joÅ˴ܑ-sܐFž·Â ĺjYú¥‘ *‰\çB’I#GµOdëFë€.¸~™¡ä—+ü] Ÿ9¨íH^ É#·ÄAÙý%×/¹~̌Š—Æ¿E¯óÑëø?Õëæ—1{aMåhtœœÚ°"ΧE²BBZEE¢œQ8œ”u†Èˆ°pŸëIˆ—€¬@¹×€ÙrÁ_ÊD¤09‚s Le¹õŒß™¼LòÜXä3fyÓ¹ê †¶Fç7 žHô‘Qu%…5b¼´Íœ1ÛäH ÜîÈþÌ(kt´4.–ù¶ä¯·Æ·„#ƒl$®©V6;F+^‡Í#?ùèpT™’vÂËÜok 0,ñ?`X\–¿/71VP’­dÂÓG;H¼Ôé`Æb|û%‰³žÅŽÔŽ˜–,"b;ЈU\åA°I2Yú'z’¿®÷±9â¸xñõ¾¹³æ Gzµýþµ¾ció…Ãâ*•CõH ð࣯1¨¨èEDaà ©ÿT|qšÄJ35á o‚DH-¢\FæÉú I¥…c–Σ¯¯\›†\IÀ?}òYÚïó9â>šîÎ`}tYã܋CQĞHâ2Ç>£',”9]a´øHÏAT¥€J”G9í|EG ÇÚçSë³ÚSr'ì ¾¼Ôsê¥laæ<š÷S£®˜®Î8ø­­˜¼j"ËEYÄnnjÇòFÄ: ŒYpqÉl±;Þ']mCk:ý™–;Xìpíß>Kó .v(¶R̗—/ù\Ä8S[Ðx?{[šîcë¯Ã-÷-–'¸Õ¿É÷Iýó^!ҊÝÔê/+ðKêŸ3Ò¨|8G=^†ú÷ê\-±‚”) ϏÄH4. DÎæ툌»u¤•)Ž:J9ug’VÐzó²@ZKèÍ;‚ÞætÂچ»Mœø(úI‰ªah×H»ÞM›"ô0–ƒAÛØ_ jVJζî5Õ †e%¶ïŠyئÓbÝ·[©þýǑLæŊ]Ü·ó‡nâ÷¶ ð¨„Õ‡X?ôtOdãñõ…Žäü%Õøv|ðÎùæ `½á/¬ïø±é#©Šét íã؝ºíNýÇíN½Ùú=»S*¼ú/Iº.Á%=m·µÙ’ÞçRgot5¯ƒ¥ÁºÞ¸epÉ`iiËàP-o¼ÆÔ|üª ÖB§ÿaòò£ÙðjdQúx¯ÇìGY³œ=fÛ-f;;Ìvo0ÛC?™žñÙO¶'xë&Ë3¾u“õߺËòÐ]–‡î²œÝå8»Ë¾×]Σ»Œïv—: 2õ‰ +Ž“º–”´ŠÑµÑÄw2¯œ™¥(»e` < ‡õ‚TéZ÷«]c°JÞãh¯îu±r¶Ëlþ4FÛ1˜Ç¶ z E~K»¾¾c(2í+sê©îWiÍÖ$5Õƒ™ýš¹r5Uœ|²Wâæt'Š¬ ¸ƒ¿híy]´%jçÆDq rTébȑ"µ©SЋM’l>3™%ғëè{eùwi«&´}&Þ#} Úú`rjª“åâ÷ +èIO»¥Ì¡§ vùK¸ÂH/¾ôVy驟ØRÚ:ɇÃv&ªFoM¥[ž²¤¬,p&jµw„[l’äœô]ò–rÞ»?ô-˜yΟÌ:QKÖ ‹"šû¾uhmԦ؈%Pé‹õT0j%ù̋ a•j#q8ð¨÷)fhÔÁ²“‰JK!æÍH{ôj—pSW6‚}4÷·Õú}V¾YRL6‰¾€3ƒÜ}LY “£&$À“´_›úž·joÅ«=¹#ïMٍòþ/Ï[ÿGˆu3﷋d¼S ª„\çBJ{•*GµOäãFë€ï7ÜÀâésÿ=/©Q÷’ÞkRæ<¼$k™ÈŽ/ñ³`*S;Ã3^Wºc ½ ¨Q}Ü¥däÞÖtÕ(;­ss°¬©Ã•àUZò—5u(kj1çe?Mtâv¦–Ž0ÛJގ¢›íc;S‡ÛCáöńËç½ÂÕ°n_<_ã¯úânè ìÎÆwÉ#»o*i”mIWý +ÄR\n”…± Ï' Q’Û“Õiª8A}–*uO§‰ò´ý5òþ PÀ¯ ÌN‰¢Âse%ņ*ñ*AZH$ˆ%¢MOû€ãG0„š@[ƒ'÷Yœ%σ# `¢lžl“Gdn2¥Ýï,þ=مðiM"€oÐé!Œ=n¾ë̔™‘»L—K n’´FuŒ‹6Ï3~d‡n Ø̸¼”ñ©dšÍ™àɺeD‰7ÓÝ®“Ñl-TÁ>7´ÄŠ¬ž°üfi^N»SFL|ìþš¥u“ÏDz/¨µ‰cì{Y#³µ,àz9ìGíÉLeDaèŠßnGð÷FæÑl ÛþŽºàðŠ08*¬–£¯x¹ùË…†Ÿ.XØÙ?$«ãcDvÌx[ÇÒ>¾ó¯ÏÀ‘ÚûúFAJ”—ìý?ËÞDGZûKö^²÷ÃZ‹ÔRÀ¢×ìÄ°uýºx q//À3nùK\Á¿rà±y4“jS/ë<¶Ą)z 8¬”,–>8+ÇHör*=qÍ1TS3-Ä î@˜yΆÂ߶4mdÏøËq®¨s&Nâ’y¤‘r4iÜûµò¥¿ï¸wö¨o¤ØoàUZ¾ÛÜßœ™Ç.«³ëÀS×e{à‚­+«sá.kIú2ªƅÌrŒä!ÜT9º®¬%C¾Ú]uºŽëôeDVS Që¦Æ´gíȥî8꥕_5m¯fŽe~å%—÷³ÜÌ$wÉ--¢XUµQ‚g±kfÙˆªLϟõ2ëVpØ*Ъ¨TÑÁxÎ)¿F?Fkå¿Rø#M¡ŽïÎÔ¯òM«Ãmµh&Ϩ —t8%Eiš4Äs"ï +c“uC —Ͻ56Ò*•:ÊÊXUP±U¸X@¾ y$× ç`á$÷ }d—`b&½$˜Á›î„ÿ°_-9–ÜHlïSÔÊÐÿsž†/Üß1A2B™ùʞîq<¨MUò)•’B R-·MlÒ£Vrw hYH}¬° ‹ä‘×EÉôëO¨Î-E±Y%™²š|N¡­ÏSÂìîeˆ4Td^ôáÝTÅô³ÞËL?¥Qu•>–â4Ô(€YèüïôœQ`ØP%Å%±RVfH¥Ç(®ƒµ±7քeE. u@ŽVÕ%Ò‡Ž@ *½"^U¡Ÿ^W´Hu1n®>Qüx“ÛÒ$A<ß Óïϛ\,–‘‘bK”€üÐÂl"+¬ªs?N K…”7YTðKW=)\*Iº©˜äªÂøqvnγ®PÕ>¬Oá‹ê<Ô€Ñòœæöþã=ÚÜß?ÕÉÝð íª\í ¦ÅÖ>8[ò¤&Ñ?׸I4dÞ´‰aíkªz–Ö¢™²»Þr´²“÷Þ±¦2ˆšï‹~;ï¿âþónŽÙÒ_ñyßâÛG E·nïŸõ‹¤NA»º!o ½ ær!¿äed#P—“”ñûm¹ŸijNÈ»{rS@„-ˆÆ1‚¢˜np>fJ»®˜%à9‰Ç÷3@ã€;?ßsÄs`1Ç)&yr›SiE‰¡G«&Q`ühÕ¹×µC~Ê[P ¡IzöäÞª§~)uÛe=s¤òª×¨63cwò»Xú͹̇Šf܇òæåCÑ&.:wXJë:i„qtÆÑáeÖf+àåÝû¹¨—w[i>½Û1’*É¿äÝréF¸E³Á i\Ûþþ‹½sí6ƒ•3흽|ã6×ØXåð=A¨ñ.õv—õÿRaÖp ˜¸ÕwÝC7ª”(O|³ñMѽLˆeG<^ë˝@'yòzø+wô¡ˆë°‘öOhþ¢5ú§Öø.­ÑZãDñUÔiþÆ<ÍQx)1·¼£Ã¤v-‚$š‰ +ñ‹\ùB² #BQ£üÍËéU{®©ÆÇÉ•‹ZwH…OE–7j6Kp?Køv¢fÁMÔÁöit½[nZg»Ñ^jàBÞÁ­Vª!íÍ®€8B0eö˜^uN Qv±Z5®©/ȉ’Ü'yp`g-Ayª,V¹ ÊjZîo*êÂmÒ¨²l-€äÛîÞá^c7¬ÝÔ?žRh»¸pˬØÐtp»ÕQaSŽW/ÂÞI«n°ÿÁzi\⤄‚Šg„×/'ºœôìýTæ6¹Ô ­ª-![$ iÅË~«’Áɾ™„Ø1Ր¶Œå޸ƶB~:ý¸W;H¡Aÿ0Ê݂ÒóþdÏ={öaE5'ÄØÇŞR{Ȟ5)ÝR,x®"ÅA8ž°’ܐeĀ#Ð.žìNÕnjݞì[«lBpí9r¼&ýWÜv“ƒr3ˆ ´!ÁÔUw–7ä0I×ãbÍ®z}Š†Ú“«¶Ø¿Òb§MDˆ¿Ë›a§7oúwÓÑ!¥Â› Ë¢ðfjsǵutOAÑÞLM¾µ=k·HÂ=im(€9Ø·ì欬áœ2b ™/|ñÛæ뚁l¢³šk¯'?@ü¨U$pgþàrkžÜŠYã^–›[ßÙjXl;—3*Ù«‰ºÀ÷°MÙþ~ è%«œ°dÊ8FföàÐ2µÓGfÛ³UTæwAY$5d¡ÙÍ0ÍK$ÞeÜX¤HúÅȑÇ6U +a7¶Ýà0ØG¶Ãá"ðõ±›?‹ÐuEL¨ÝyEÆ0ùK½¼ Á´.ø~q2;¶j9©a4Õ AÙ‚Ç,o¬™ei֕ Åsˌn!ï‡SžtØÖ‚,¥*R·‚Þ‡R¡k^c³\ÏKÇ®YYM*Ðë,IUÑÌåL›ùØÇ ÀûPêq,úx¢UP¯¥Íl/ÊŠ::ѕÇÍ4íéÕ)E{Ñnåþêvën•Ë Ò_Ñ7û}›F@Ö#fý6ÏÑáeêp-†\}ZDãl–óá9e9²ˆˆ¤ð]*1:Ët³‘6­•0³Iˆ …Uðú¨ Yi²A&Ò,(d\4ˆbú_h°C&Ù%Չ^ ½’ÝöãäDÒÉW± Qԝ8VXO>ˁW¢×ž÷üB*Ë}ߊ7Ó 1G{à“’;¯>©ŒG¾^(uÄ¢p͵F´iGÜd‘Þ&«ÃxÅÛv K£CJGü¾r»±ˆ­2Ð±¤”šrDi°YÑñ\ §lVýÎn9O™®Q?ˆ„÷ýŒjZ~–áÝ@¸’µáëPHS/SÔæS^OÙ[ÑÌ,Ú_I$Šþݐ氘ˆ™–L•§CK䫁ûöe” [ ÑóºçÈ3‚*9 53_Šüê¬6(#ê´î=“€ÀeÍ·«ïovjéŠ@h‹ÑC.$ù<7›=EÏïz™$¸ÄÐEÅã9 ¤ü’8óQ÷­ñGʧìA.ó4+ Ÿk¼ÞnhϨ¤—tˆÒ{‘Ͳ%5Ä8Qeãý‚¶]>Ï1üÙZt뤓Ô"cUAÍVáb ù.ä;9ƒžƒyf¨úŠùÔ ).~{Ñï¿`xŽÍ^Ólê×ûÓÖÁôÖWëÓ*0À—Ÿ VoTìp1ó‚Eyû¡Ø¥Ü&ccק“è¶0‡¯mqòsÛ8êF”Vÿé?å¿ôŸò·ö˜»Q6ûO©?ex’êoað²*¹;P9Ñ*qLrCšÄWÄ6¿þô4˜_g:Ê[z}žáßÝy<'(šÈd‚#CS•ðu˜õ^歈gªž±THC" +˜|‰¤ Œ UöÀ¤¶•E2<1*u‰)k¦©æ5d8†¾+ќö8ýJ*ð]bÌ­Np¤Ñ"]½-yËÆ¿G_%ä0–íÄul«ª>ŸB¢L¦0·ŠlM<°ž©ƒÅÀY¹Ÿ|–Îý +êP¸[-þ%Ô¼;Ÿ±3ãh^K³Õ¶ ]î@âªÒ¸é^ÓVÊ?^Óõšvρdž{ßj›2ᡁáõΞÜ9m÷c¶¹DШ–ãsݎŸëvs%(ÂAP„èL›f1x…AE¦둨íçš/†°m)É*­ +R µ.†pxµÆ ¼øiÈ͊ŸêµB¦Á|ðÓ¾ñ“´ÈðÓ2y‘„´žË¨÷ÁOuU JÊ fžPïo)d¤@n.&‹Ò£q/ËsE;«òj@,öí’GV²»\~Xد22ý¢ô¶9‹X +ÈÂ×Ùg2:¡ýÄï‚2HªH+”ªöù.½¸ßn\ÑíÃÎ䲼ч’T5ÈÊ2VټٮX¢Ì  D³Sx‹zΞì)lÐîR4¸¹;,õî>¡Ú|?„<Ç£Gµµy|Ç%ð}TaDØgy{Äø•ïÖó–Oãôiœ>Ó§qú[ŒÓÅ.Û.zÌöÈâö"‹Û§,þ.YܲøDñÃEË%»|èãŒ|‘¥A€"¿‘xƒ²7±P“$-¯WrV:±TYDôàxƒcãaÀKéš)•¾SOÏ$>V=G`ûÛvášñŒß¥¥ÑÐë  ±Õ¹½I–é â>„D¬v䍦¾*F«KÛ✜Øξ\™UïõÄã®êÏÜeώ „0’ÛögÕ%ÍQáÎ@§…«ˆìëL­¡U’Ć] Oš”š"„¼xÞ1p[­L¡Ûh7Âeìm‰’Ã9¼=䦹 ¶|  iv_ï?L»Lopu 9r /xyûˆsB}Õ3÷ŽÓþþK±SÝæcs·Ï'¶„Ûê>{óÙ÷½yX¦œ,VsæóLkÝõÓßaC„šcß)ð*n²FœÙ ¦× i{éOv%^21† ¥VÓµrSbœ#œÁƒ¦CM?›™ò~b¦·&Qsû@qÓ¡PMØfÊÃÍfž´ö=A‰é†¦ª¡½¹™±PæXÜ7÷šsSè§3uá$\û…ó(rÆX­-·¿T1¬z”%c×ÿP‹ð…r¤Êàhõ(YŒÍXšÏz³Û—ŸìRvùÄèú„xÝAbv a½±BÔî‡xÒ³Ø-YPòïöý?jߤ†Kš4ânõfē:DÅÙiçíºt5šm#[‰¯É¢Z8>_’*Ã'–¦a‡Jƒ7;­n¯´Á=K•¤|e5Mþ·Î´p ‚–â‡qoª;þü¡Wˆ»(ŐdÁ<¯0‘ÌC‘!„† `Â-$-ÒsÐxàjô>q!Q8òÈ )aòú\MKٝÌâÏ`ó2E,›Y“•xƒ*ª†`>öLé#3¢ Pú\ˆ‡ˆªH®*H{Oo·¿Ô|.ïµÎʚomä0Bªûâ=ij¿“¬:⚨ë¿ràÁy8“ÕTÓ±ÎËy€È˜¢—€ÃúQðÚªŽÂRûyP`»OÜs ¦*Ï´ƒL*`=Ë( ÝqUU‚(8Q~ÄrI¬í"ۑ¸eöºj.k„VƒcÊV±Bkñ  IFΪÄzvڀgT}hûnßþ¼àL"WIÅìJ¸´¶û/¶.Z£µâ'rV(*·w -KwpSé躲¶ ’%¨_]˜Nö‘Ö°0Eˆ:X8U. ÈÁG™L¨¹ú}:üªœ|à—)ÌÕe$©j°ËyºK xeÎ6 A)VY”`€eM‰àQfz~èe®àò7QTQbœ³@â—<»¯ÖÊ?¥ðŸ½ìôñÝ)/Íúµô©ŒÑœšÉôÒꁼ€"š&-1OÞhŠ†/6|‡.Ÿ;ÍV +.…ž”HŒU™7ÜŒ¶NÈ#ًÎÁÜú*/> S^R õÉRä(y¡RÖÐn”-Z +®i¬Êƒ×Idúc·?;Âd•ÃpÝl)Ó?ŸŠf 4 "/z /f?rA0ê½Hú‰F ²·ôãrÌr€•Äm‡=@¹5zx—b0-lã„ïÍU{b¾},§åkUµ N‰®?n@ÔÞ2׏K³KÚ¤Jº˜7ŸMoY|¹É‚Û‡ ý¶ßâΌö>Š5w0‚qæFÜe`\%ós}FA]ù‚]cJ’·hï"T“ž!W#ǽ2aXâv3“iì|kzM²€]šz +Ê»wÐ;Zh àwIrhuq’£fqfz¯!,¦¼óøâ»kâ”óûÕ¯>©_ýV¿/©_½©ßÎâ Çk5;eßúÇ ê ¤ÉmtB:¦Õ‹ +n;{C¦QÈV6Äã âw­Öój×´Ä©¬ ~þHôgØ9[p͟èiW Ùr>W E‚¤[ӟýÄ` NóÄP,›õ¼JíZ©©žª•læÎÕlÿäSy—×UMX7çJ9ˆûd.–\Ò,ӅÒÀ9G^èÃPÏå¼Ød?“}Ï®5Pó;m™eK¦E;Û;¥ÿM©6{¢ù­b¯©éï­ØŽ¹ÃXƒ/7l8-’ ºX_U›ðÈ>tõ#NÞŇÁHyß0°î|>±¸a +€›9îµ@êÃеCÍÐã?£fo°^™¶¡b.Ô´€Ü+òBãñ>ì°Ð_CGëWÜEQÜۅnïñR@b’^ëGÁ9T;õ×äñó P‹_I⍚O i¼T«¦ÉÎuî·í†V5ºÝ±\L„Ö{¤ÑPØQóa“Pà j §4)/n6ãB6’¿n²íº®¬-ƒ +ÎGs­ã:}›·Q¶ òµÆ´3‚ª¹ˆ¹ˆ==~U–ºTÊk-9¦UeG\b<98I씲,ýAr^}rf(Ã횞z™%$8ÔI“Ó㜭Ñmf’ôúª[Q×\ö4¥O–4õ=;Xú¤ŠM¾ÄÑLΨp”PYz¸ÍÎ8ãÚÖJ¥ïˆØ±s‘ œs¨¤"áön@E“há6ußAy{€<ëöé¥)mH½iy½úËߍ²¬­oÀKŸ¥œýÁ”|‰ç¹[× {aCTíï}ØAn唕d»N¨¨U&L=Myd€ +90Ü ¹ÅU´@ +ÓõWÇ®n ÊòŒh:“¶hz—bÑ1öéá¢ìI4Œ¹27ÑB6þE~.@ €¡òµÄ¶i_¯ê]¸äÍl³1oj⬼8aʂ:<î1k +ÓYnB® _o³ø³†Gù©¬..u…ͺ¤ù*ŒÝn6|lùæqQ« ³á«Ê"²ÞÓÛ-ÅÏÕY«5C»ýl3Ø¿¶¿Zuûë[A˜ÁcUŒ@–kå\uW-ïi¹iËM;\&Ö~–æ \nÚ¡Üt±|çå˜Ë»Ov,> K‚™É4™ix½qÌ´ÃãÝ銞à±òM$–•Ïg‡H^ݬü¼Xy¹¦ÿbå[5Ïj‡ D³!Ýz­(š+¯T,Ë!¿­¦‚îÂ^Ë5u¡ÈšBWËoÕãäg¬UhкÜ|ÏR“)z/çÒ$#U· +̱3 QûIÔ —GÜÉâ) rêØ0ÑE†vXð²ÝÑú¤*=û”ꁫ8ÜT!Q ¬#%ì`vVæ›è¯ì¤™Fµ¶â§ï ++ï¼ ¿\l7dª_Ъ/[MO«ÊÙhrGlzã +Ý.²†³e­ùA9ΔÛÕZOçyHÓrT‡Fƒ}èu¶Íé—öÏ:{xm}Š­Ú +זWÑýߏÜMh@°ßïë“o¬ß¾ñK¾±Þ|ãÎâËEft q×fÍxíLÉ:¼­]`!Ù.^ïŒzDóIy¨’ÛåzFðR嘣ÛÁÈÁW.ħEI__á÷\Ïø?éJ‘-”ý"›rQ†øbd˜š’‡Âš@1v‰Ñs&«¸R‹.ÎgF ¯G녕X¦?kžcÍ%F+âÇ.Ñ%s’&Ú1²`³Ò‰ã£}!{££0„¤“°! ž·µ–¤Ò»SÌéׅ<Wt¬ÃL÷RÈu2QG¸A‹&4٩Ș‹£þ'ûÕ²#ɍÄîþŠþèýø÷ñeÿÿ°A2$eVõÀcÅ¬ëÒ-–2S!)‚dÀE¤Þ7±ÝÑzrïõ‚ÖzòŽ¼l/°¶ñ±[€‰Û‰ná’<·=ãœ:¨”Mõ0ø‰Sƒ0dûúöwH†å•%<‹`½O #eÎÏx 4-šåÆ,·úÂ6ÂÙP¤_ÛΏ.šÆOl—™39m‰:@õ9ÌKíp¥2D YDÔÌj4¦:ŠéªD6´Z 芘-O„2Ä8²KqA†D¶–å—lû^„k½p†Ï²:¦1ƒm÷Wk¦ú|wS_ÚMM«L$؛³¾ˆ³fwSÐìƵSAòvè°»ÍÂK«L8V 5Ÿ°(e«b;`Īl׏r©´mé[ô©ZíVS;‡ ‰÷Œ÷ã‰ô£DÇåù½ºcÒÆa¥²[uß{Z€›WÏâsa ‹È¬`~¥ÓßÞ=†ˆþ¢2­g³ »{êÁoæi¨y)¼q1™‡sÆ £§ àÔ5”hýpVŽë{Žd\u=Àa½´»AØÿ WŽaTÝ'Öxb2úøÁB”¯,Œ¶ðL1ööN•(²Ö…«IetÜŸÔœ"X¯­Ðž³Ú׶bdØP&o)†¸guJ3)>°«$QH‘ì…;E­‚]4f}âÄ|Lx‰F\܃§¦÷SU<ªŒZ£ëÝ]n±…¶ÞKj¯-¢.%£;v/n¥5&£H„3|M=kLƒ™“Ÿ:šVúõhšU#–¼qãu4º6¡D¿ƒW2Z©H‚L¢t˜Ë¦aÃ_*vÇ礫mh}®EòsӁäÏ®ýÛki¾@µ Z(V­ÅŒWžDÁO>Æ8՘ej*„ˆ}èägè&m;àZÍ"–¸w¨Åw뇶hu±Ã +ÈÕwhõ¿‘±šA±ËÿÕ ×xû­/õ[1vHZý?5\õo¸ìÔ­â@À՘8?µ‰Eø·Q@*(Ùaâ$±nQ%J>ÃÐ}ü»sùšAGö¦k\üSBžR‚žzÖbõ1žš\Hێk-ŽãIÁš¢üPiÚ"¹2{¡¢”¹m0‘õ½·ã{Àµá–“*ÄÖÒ%ó&gÔ’“ò°*n\»õ=FÐx(Ò  àk¹à/èì2/{î%ñÌÀº«1~×ùr«¾çümÌò!†× †¶f¿ŸírQ?#ƒ¬J +‹ïÄ8¨ 9B sÆ×æÄs5p»#û˜QÖèha,ócÕgoM C”ò:q•Èr²¯S7µâ.BlªÏ¡}!»¼éZ“v¢cžáH0,U—’× ÿ RÿV+à é/Œc’ê.ñ;Be\¡ût­îÊâ–ð F?s=ñð&Ç/tÑåMõé&!í×zfu¶¾³A;åyñٞ³ÝM˜óíÿ¿ÊÿgKªŒ NËÙöäo\es¥g•PfÕ;û5tŠ,ÎYµˆÇÃÐäK…¼‚‚ë•[ëY†HJQ´7 žP•mL(ÎqAVh$ ‡» G\Eu‹DÌó +r(2„°ÃJvf GÊÔèͬ²–7ä{ ^:ê!èH6ҞµoÃä#ùšhøû‚Åìý–¶¾ñ‹\X·Xy³©…út³rí… +Yk\»` “7˹D'/Ÿˆ8`Ý(QŒ‚›Nv.¼‹Œ`úçÙÍê…$E”]‹.çnÝ`Yx´‚QÏE²gjÅe§¤ýÍ£rÌӂLàRÓvêؑ¡·ÉBªê°ó×ù¯L¬ 3ñX ïs¸0:š›Ý“!䇄óq±ËI‹pÖÏÍ-Õí_j´ K"Ó¡7 ~ Vxüh¦ Áœ™ã¸X+sxf‰ÛŒ‚*ö»Ôî6ÒLá›(®&ge­yd>3+n"ñþÕà©é©=e­G•1(¨’ÞÝ%tÚ˶ÞKªj@‹¨«½¤+ÞdÎéÍU9Mo8Ãg1éÉBË¥þëMçøšÎ2Á ¶fioêùê©v¥Ñ&ÛAÿ%ó´Ò¯Ì³àЬäÆ|ñ ÜøbÅ&d.©]$u™ñª$*"ÌeóÃ_*¶‘CdÕøb}®Z½ðsӁêÏ.z±×Ò|*È =e±Ì—ù ŀ[(ŒqJn3­ Ò¹¡:•;t/Àµš9„X^àZÜ¡߂Ž Ñ嬮3v蒴ú&Y­þó$ÛH“F"¥¿Ú¯ìԚ|“lp—‹T3ÂHDø7hŸ Õ `¨8꨼Խð[yBëÉ­ ´–Гwä×vµ a¹{ó1“>·=S% ƒ^Óy ٛÀû€Œ!ŒÊÓM”„$’ÏL´ †)»œ§ºa©ú\ŽZ5­p¶Æ,7;‚}„³£H’Ûtir+Ÿ2”î™ £ä§*r¾ìs,˜W›†;uÑcˆÚ·\YÞãÊQlhü 9¥©œe(åÄ1{.Ð(z7ë»C¢µC2k½p†"™nkK»¼|Ü8é?`Ú>y6Iw A-þ <¢Ã=m…NéáìÕ, ñœØÎ c“õ@RîCm§ÆæõK%„²2VTl.ïBɞô,üÈ=CŸe{4cnãÛàþÚwt#Ä +}­–Sóv‘Õ®¾nÿuGˆ®Œ+L¬87’ð–¶qépÎ26M§¹žÎ˜3lï8ºÔ|H¾ûô2í׺%ä±/€×â({n×g–sLÓu˜Û²ÑäÍrÂØ–4VnËrS\3£gÔ®!e™ “÷Ú°ÈÊãæñPe…Fš€€¯³å("¹žDÇäïÄ£¡ï1~ç.',In•zŒ>cÌò!á1 mÍHKäWMü,Z#‰<߁†Ãª€àí˙…4ñ\ ÜîÈ>f”5:Z}N,ócµ@Ý=¬PbdP9Ñ¡}7¦wŸ#¨Úr¤Û +̧´jÎà~[[€a)ï2íßç-Ç4CŠøzî*OÜUÞÜõSÜUnÜU~Ä]1 ÑÙ 9 ôYכÌ#ËÒ2àT±TeáÈ + +Äâ†0‰®ŠzMï!ä¾=£€x,Óm‹¨¯º›.žoôj“ÍÄtsÇûæáFò›<ÂìIçcçUI'±¡þBäw‘\L?°†Ï%’“}¾Êó¡Ðö©Ö"ô Ì8{3Ƶ(1&[ ú8"P;¾Þfñ±E[W’å~åJН\aâl cÛ´ ;u{ۆr;¯ÒwïpLºÏêqì=}ÜÎø53`ºÓO¶}ÆkÛ¸`¥$µEí´ ·Õ6Úmæ¸gз–x¢èâVûÙ¯’äHr#xïWÔHþ¼§mnìËüÿ p÷Yì‘(3©M=ª /$¶X<<øÕôœ¤ŒEt‰¡ +Ò»w§+ÈÞ¦Î3'­K¢#u­½+&Y¼/\2ù«}a ӊ´7†/éö¿H_”nrhtûׂ¼•~ù‚C³òAö„‚ïA‘+ÈÓRÈΔ=™Þ¡§£ Å5æ²ÊðEÖRÄ+gª9jmWí¡Ü×t ŠÃw„+’mYšŸ ”φЉÑΛY:ÔȬ¼{…Â;Nù$“ç¿`p2l§{ÁeT€ë4 £X>Áu¸C¾½Ž"ÙsŸ.; L%¾óY§ÿ«|ŽIÄç®ܾÿóo6÷>3ÝBâü¥[Àqc8àQ Q{~ç ÐXÇ<œ|._¸0Î_’ý?7ÀÏI뼿8®Èž8Â?ANZÁyéøJµþÿ¦ãcV`ˆ—ü{É¿[dä iÓ©q…ÀMãèz¹²Î鄬¤%Ë ª3¢9§êiO¨ ’Èè®-èÑÜ«¹³v÷ÊWô¬PšzZÊ 1†ªJp *¸âG]²ßãÇOQòÕ²`ž'L¤¹¡›á +ûZÐq¼@Ž¤OPš’ƒœìW*0 õ¦ìr$ƒ]˜Š¦I ͇_Ð?ÙF—~,X,î¨Þð-üI½æa3¶û˳;ÏÎ÷Q ŒÍ ÔïáYã÷¤R™sGxo'„4—YÀý¥ÙËÚè×\O×xˆª²—rPõ›>gG8]a¦½¬gX¹¶¾9Tå‚sKþ_,u©Ý +šÊSº]?Pz(ŠK™DF:”›ýp»"qz®^؅Ûñ e×µžªìØßuÛq}±ï§õ·û?©¶Ò,\Búígyj?Ë«ýüRûYníç¶â§"[±U“þv¹<™¨Tí3›Æ¢ ™²,Í1o¬™DÍ(Åâ ÒÐN1|½?W9Þd‹Ô·< õ†|Ԕ©î1ô™›Œ£1¿öþ± "±…0=ió”§îÜÓXs¢ÏLbTx$҆9j½4¶oÖ¡Œx؉\âQ)r•çMF:cá.ƒ_‘¹Ð>Ò¶Yu*t·nÉqÏêðꅖŸ]léYœ[í§‹±>>”0nVµÆdٔ÷Ì` ¦‹_c½§­ç&ßɁº¥¸çöŠŸõuØ>!òÆhéö…#ß Žq¥©ÆÑkÐêpÔí°?òÿdŸ˜›Ã«U;|?;ÐÉèZ퐺(g%óë a¢i¬T-‚øðh5F`+øqÝ›óèÈ×Êfb¿¡PüÀÍ#„Ô²»\ßc5B&üiÆ¶bÒ!_mëF|¿±Y;̖îCöñ2«½¨Óîd*wùT/l +…ò3iÐl]ÌpjFáiG²_73s$NKyNcÿ-eÙc®i\±<ÄJèÈð‡‡¶$Ùè=‹Í5cC‚Œ_HÑ Ggh—ì1Ô¨îð×b+É0Ú}´…°F±¢¯¥Z¿(;ÿ¦ßÖ©ÙÊÈq…É!5f¬ Ú¢¤j[€cŒkNý,Ú¬Ÿe•™=YˆæÜQïói~˜"ˆÊtB‚PŠkÁ.¦N×B@*Äí²-û˜v!»kfVdîgÕa‚>B”õ¦—Ø©ø•$š B·wZ¤…¶Ö%© @»Qç›(«±êå9½½Ý‚ 콇ϑY¶1úÏõ¿,fꓘ©/1ó%1Sobf[ñ9­Й1,s­¿ìãl+a—Þ«6[]ÙéRIÑÕY%ònÁØ.€J'&çê(ÞDXŸpb¡þXŸ?Áú>‹ÃÇ=ãýyb´}‘òåú~ŸîX|¸±h±¥¶ÊߞàãÕ`ú\Ôµ:É#^:CùÉèUÜùJžßÄ-pC¡À<²}/Þí¼WL>nNùóL7-4ÅçÇùC7kaù(„£>z^£ïß:¢k\3l¯ö² æãñC2†8ãV¾o sGrîºWÞ/ŒG^Ô‹i¨ö·ÉÀôO20ýG3pØóZ¬A áv¤ Ý'Õ äHÌ|_PÎM5¨å=—Ø„ú*âU ai'T Xok?G$ú¢€ÃZ<íj'1[4ü¸P¨°…´í*ÙÒÉ@¼dR1¦rEÒ­¯Í C³Medj.¿»N黊dRDž –÷8Dxe1–"e²Â +ñ•ášõ‡ †lÀ7rÓ®ã{bñÞ8“jä]g—ÁïØ}¥ÃÖUlsá+Áš\ÉʗãØH,È¥Ž[,Î/°™Ž ™¯ƒ6ৠWo"¼DLDêbZÈ#‚C¥œ™Š‚¤ª=R|íÞaö¼wh¥*ëH¾KtÍ6}lb# +áDÒ&èblv-ª4¿écfàýh×Ü0³@Š/•Ÿu±V +¤v•ù$ÚFNyóK×r ™<¢BŸ—†¸¿(L“¦€Ôc²0Y/h×帷æãlw«¤“PVÄ*ƒŒF' ˆw!¿Éžô,Üä¡ÏÂhTct“‰(ðõ`—ÄGS¢AÅ?AK¸à΃@°‹:2­g\֝Á͕w´¾TÛzGë}yG®gXB£‰~'Ì{ó1™XJ”3UýÉhÏ&¡8Ԓ„q¥G|WÜHÍxÐd*pªTjغaP#”ŽÒ~x@Ñ¢ÊOKIËU÷ðŽp½Œ”®ºg~«WÙ¨ì½-94OVØêЫ›šƃù*|ͪ]¥í Ú·IÛÚm»Ê«ð ìÂ'è…Oô×eãévU¾u^¸†Ï•oVÛ&¤_Ð}•§î«¼º¯/u_åÖ}m+>çÀlv“GBE[ ÓS¡á­ÒëgÀ…3jˆ(OY*б6Øõa¶¤ÒHµ°Š«¤_dQfEâ ΄Ç™kŒßñÝ»U +'ß`€TþŽ1 mͨè+,oì¶ÆæY½ŽÖ@l!µP‰mç̨šøá.¹£1oY££E¼±ÌÇâäîI%”x3p™$ê–íÎ0щ›xU©«†¶"ʽ„D;øÞÖàµÄ¨€^ÛìßÏ90³Lñ•É¿{&Ç0ÍñóWpr}òd}yòKž¬7OÖ¿ôd$“fz2´y²Ë'¯‰t¡XÁDs8 d mS&D+` lúº¨/D}ÓçþN”¯õ-%·¦ ˜qkb£ï…wµ¡H²:©Á#aY’<òÛ®8‰ARÒå"Y«dúýœÜO +Ss‘Ò†Tµ-¯Oqò˜¾ÉÛV‚8€^Ÿ¥\ç#TòqŸgc7ÿæÈÚؤԙPYVe?ÔÒa§J‹Íy^ÑPéñ"9)Ð$.£tOïØ\L‡â Ãê;´­ÅÛô¾V2¸©Õéó¡v +×ìIaŒζ²@džŠ"÷EŽ P‡}.±ÜSìRäÂÍ;¸kBil™˜ø(ŸaÐàð¤UVå'#À’Š#¨M¶.³ø82"¤CéÓY“7.ñgK»CÝðm3ˆ7¹MgQÄG@Ÿ¬Y™fïéq³ñçæ ÔûÜ-‘Ñæ]ª ¾ôÎA1ÜJ¿:‡ ͊$³ŸrFôh Y |JìA°$#ùfçv²˜Y´–5—ÿÁ~•ä֑+Á}ŸBÀy8Ð;{Ó÷_üŒˆÌޓ7 ÃÐom¤ŠÇ*2IfFDڑ/ÿÈÍ\é 1]·ƒçtӁnïZwÈëµÏÊ~‚²Y´P,åš8/ÓÞ$:•õga‰4+SÃNi3É¿¸fÚÀX͹øcq‡Zü e¬pô’Z]güäÇöŒ«žVwË¥óñ‰Ê~›Ó®4MUº ®’´vÞ©ò¬ÊÕRY 1\ŽIŠ2« +ÒF—½¦ 뺲çě“BFÆ¿*BÙJðR‘Iº®8‘ +O‘›=vqÄUäN{ X÷öK‘!„#,˜ +@}’XªÕsÒq{àª2aáA½ŠcéÀNLyRfõ³UÇA…òCS³ñ-`3ö!]¹‘ +üt³ü¹:™¿!.7ۍRÕ!QîˆÊ·®î!ñØ°¹Ê>ÈwZ½;Xó›å|^¢µêhýU¯S;·×\9>›ò>fò­¤…cáX>lê0UýË>~zûh¢ÔPGÈޚW¾ªS1õ‘å£ã¢ÁK¬å$÷ÅûÝY s¢*¦D͌gœ^ÒŠš×Úð·‹Ó<ƒ·Ø¯!ca +׌gü΄¥‘¨ƒFʾ°þ”­bçïxƂ¸¡Âù« ÌĪp6¶}…µr^TŠš¡µ2­8Ò· «ÍgFÙ³#0Œä¶ýÙ¢^µD…‘åŽø±JvÖÜÌ­˜Y²UÇ–ã£ÍP]ìH ©h'¥ÅýŽ€a‰B:ݱûÅZ>.å?ºÐ ’›o ÐX4*äRL9’—ÛcãaXÎG»/=¿»Ó‰UgIëxn3î“"W–— jöæBÏgneÖHŽµøœ—$È.Ù~•¯µEê¡ûïÏtÞÖ[.bó•Á'³ZMÙÆJÕDŸ@ŒÙìì­ªDÎj¤ðe}dëÙÀË_·7Ä e>“l²Ê9z0lÙ¡Ô¹ Ÿû{@'†Â’¶´Þä R·Όc÷1ÝW¥jŠ. 5ÅNÕÓÝN··òEÝ®È{ZîuCîÇë¾ùqB—3IJøe ™Æ³­21iú鶚QíóU½éí”ñ¹#»Â„¿ÜœÛ?s8겑i'wýe"½:*¡›Ú¶蝯݇áÀ¯_ndûë/żN€/ $¦Ó5€x!Œ ®[À¾/yÝQW£½óŸ#únöЬƒµÝÞx ²ü´ƒ´`’—nfÈÍÑDÇX晖1 xÿ¯ÕÝÿTuç±X?t 6>Ö¸º†Ë/Ô}Ì0Êa ƶ“]Û`?ßǛùÚóó»m¸üBÕ¿L@WpYÁ}Ã%½q†¨î›xð ³¾mdÆgaµ~²Zÿã¬Öo¬Ö?bµÙá§ûϱÚhóÊj—®¡0hŹ+çƒÕ̦ìåHÎÞ}·3˜Âày°G(çu@+º¼6J´V(ÉyöY¨±c,‘TYû'é%ïî~–ôš܄Þcۅ&暙u±S!½¨+õtúGµ`¹5ÏSic,ËÏ×éXÆ +ˆ ³µ“áü•š˜"'èÄz#3Í)¦^4¿ØùäžS°v^£$5M”Àû_~E>VhÑmöŽg0˜ºµFsÒ-¿äú_ÊõD†TÍ&?—sS+FÄéŒLF(ȉ¤˜H’;ëGSªNI9.3ž‘x Ȫ“;M˜­6üű¡FD›#8•Ä<–ˆgüÎÌe†×Á +OЗµÛ‹NUÏX0)œßôw#ËWEɵº¿Éyñ>ª…g3W̶7Þë‰Û]՟eώBßrÛ/!}s ¾%T$£p•L¥²Ù™.ZñÐ7lÙÉÇDwƒ”J,²T´^ýâ~ÇÀ°Äý€)ˆ¬~,5s!»me¡Ž ¡‚“&ÍË +²·_ŠØ¯êYÌHÙÈ% Ç­ÜÅcYö{$+¡q¡ùv¼ÿˆ»mÏñé<âã};rgÌδiçûÇúŽ%ËNÁSª†î'PðP”ÇTÜ"–°áÌ¬¼ewXG¦Úp„7-K"£‘Q,«òà€Ô‹ªÂ1Kæ5ã+—¥%?’ðOŸ¼Jõ}>GÜÆеÑÄG‡)®&9I†Yœ^Èß²Å>£'lT8\c´øHÏI4¥€Z–gyìzDG ¯:wŒ)‚ø,B{Líʳ»ûrQO™7ß2rò—ÄR£.–®ËØ?œÖ)–¼i"KE™Â6nkÃrÆÂ: ŒUc¤PØfW|t·ýÄtÝH¼„ö:íuÛ·ÏÊ~‚¡½¥½Í踆¾¶7?xJ¯…UF@#ýêý8z®SzžJ?r{‚§ð9> =WÈ4a7áßáÏùW…ݗ“þrÒ÷¼XÆzM²”å—Ä(ô,ŒC¦æ턌¸t¦‹iŽ& +¹Lç‘ÑP¼y¸Ÿ Š%ôæAkk¹Â>–MØ(ûA‰§áec¤‹Ú¯fl,±yZá^Æ)ÿöWjZ•’{Àµ–~À6â´\9ÁÑjôr+Ôþæ8™ÅŒX³‹û~ûeږ8ƒ]1ðê„Ûá;߇m>Æ Uèüüč†äúK±Ü¼N€¯+$JÌ5„x#BŒ®›ÀÖÏÌÊi€6¿Ïïr<9-K§ú“–çG®kpa/§åæœÂ>wh´wºš×A(±Ã‡¶÷žbHbØÆÑé¢&ç] 15 ¿(†9O[bŒÏ“šíLÍöÇS³ÝR³}”š…>¶ý¨Ñœ—F³_Ívm4ÇÙgŽk›9î]æxh*Ë3¾6•ã ÞZÊöŒo-eÆ·³=´˜í¡Ål×s][̵˜ûÒb涘¹Tx’þ!!4œ'®(k¤«¤Éðfb!;+‹Q¾ËÀB}@û©×½Ÿ¯NÁ3y«£ÞÝóbe ® Zkœ1˜×¶z MÆK7»¿yÆÐdÞ#s쥟¯Ò£Å$½ô33ý½rånâ¸ùd¯ä“!Ѕ\Qfi@¿Ñâó¾hPÔÕ­êZd©6ő«"¹©cЋC$Rl>s›‰5ړÿ˜çÊr?&®Z°÷OD\ŸMS«åÅùç4uZÒ\45à”ׄCÌ´å¡©°Í¡©~d¡¶}“—m=m:L5ÞÚJ¸ºeOY[ MTëœ×8$˵üýjI®äFbû9…. ÿŸM„7ÚÌýN™¬ª§n»£c´RA¬W$ó õ»âÓ,%}N‰~š—hÖ½ÿœh6;lµøb†\V‰ÏQcŽF[A•Î`>õŒæJ>35)E7¡=°’/;žõÞ`”RcfE–SMVa +±rV¹VÏè„TzéÛ5¾«â¬,6§BsÀ/ƒà}Me §£‰¤pLµPÚ‡† ·noå3«<‘Ï©œ•Öù,X÷c$ľ• žâ[’z¡öH…¯fåªî‰‚¼Pø5ņ”Ê_s”ZuGéƒ'5bd;Yü +3VX[µ:y>ãv<Ö@ÒaCîóÕLFð#>׍¶KÎAT‡Qâ]zòà:”Am¿ìZĚðä˟ڱ_ÎB˜yܟB8ÖåO^vÂø +/wLî¸^;œñõrÇûæŽsþËfzc£Ïµ×Sdêªnf֛šÍCs2ÕÁ¹5—ÕGãa–‹sÐjäùdx†º~P?L¡LÓëi£킃ܿ–{œr’A£hñÚÙJy S>=(@‰ñµÂN´¯ÓB ¼" ž ðÖbäÞEZò=ˆH…4Uóæ°€sdÖP"UZ~wóçìÅ.„Ÿö"˜ùÒzðáEx“•²+OäVÓˆ—€(Ū¢¼yñ'zè´óƒçÿ—8öaýši5ÑòÃz}n¤.8÷­´2Û'…ëlã‚ÇoO*‰éepXa¹Mx@õ¨}ØæÜk[£³Ø0^N×£.•GáœâI~{á?ÿæ:L.F»fùûxügZù…a)!\–\‡ÿQYÚg½²®Ÿ_¸qйÿ§X«Ü?€#ÞwHÌÜýñFQ_x^¥~Ëæ°¤Ì=ÿal_:ø:ØþVœv¿ú%ƒ_2øZËN]A7fø!A·Â°=]]󵿃<êY³C°—ù+~¸Ì{ÑìÙO4ßæ¾o÷bÁ4½œâG*–„qºÁ™ç ÔõÂ=×RO툇,H‚0ëœ#†¿mu²´:È*^ñ+·[`Ñ笜Â-ë*7DÎ hJµx/Npí—Þ<á9o™®U¿H³ÿÀ;ª=´ý´oÜpe!»Ê’^í¤e*Û~pÁ1UÖµñ–½ý2«ÖAfAVñŽj¥«jËTy;_ Ü·o#²Ú*ˆ¾Ø8=—@^|´K—¥8륨¯N ÀlXj¬%VŽ•~g’Û‚ +w³É]rOÀÑV*°0–fömCÁ¢Íôü®—Ù¸‚ËvVe•Šã5 ¤úZó¶Ú;ÿ´ÆÒ$*||w—yú·ÄÌ;z»¡]¼¢’^R%MeZ´Ä8‘w…qÉ~A;.Ÿçþl¬Õh^ˆT±ê f»p³„zò“œE¯ÁƏ<+ô½¬ +珞oøН$Ʌy9Q+¹;P´,¤¾V(ÃbyÔuQ1ýú/t§ÆȲÙ%™6›„Nã­ÏÓÂìîmˆ2Td&úoª¢z‡Yïe–ŸÊ¨ºkKqR +`¶”ÙN3 ª¤¸$Vʪ ¹öXE:Ø{cÏ4ÅMCÈ5Ъd"íqèªÖ+âU5ú»¢Mº¨+9#ïþöŒâk&›å¹ ‘iƒ43Ai˜6P਼‘9Õ°SYEöR¸³aK]vxƒdãaÀKõšé•¾“ªg2۞+³¡™!܅{Æ3þO©¦¤×AGc¿°Ùo·7ù2=cCäCHÌ +E„¬¯ +ÑêÒ±6 ŽtWi­*¬ôÄë®êÏkHYvôÞÛRçéúýÑó +]o¨3s¦ºÔÆ .Y£Œb_S(‡€Z–ö‹k…zt˜ ÀuI‚ÒâeŠ„dÕ»­ê¬7$fÀ)~ä~Üjy6γÈOÃ]a¯ûäÙhÉÅ2‹.©,¨e y\ºÆÓð"íÒ< ~G{-Í>ÀŊoå1ÛN QšOd Ò/©'sMÙÜB«š4 —#ȅ³D©¤þMêrÍ÷Yœ0´›U̪/ȧæΨ~En˼êN,÷tànAF/¶JðñÐÏÐ 8+%°zƒÜB×mï~ÂóD —¶î°ÐHõ&©äqͅµ:»ÉHim–ëyiè©Î輕^'kpÊåühVd©€/òâZhà7/ÜÙÒ¸ïÊ÷{©`TÓØU¡L«i‹ °ëå³ÏÖý˜g =á8Ëâ[L|Ó[}œÝ&îâªî‰2»Pø%Á–XìZ3ì Üë¥S¸µë”Zw´yéÔ—(YVBeõ•C§ô2%äR¤ï:PG™jÆQå¢('r +>‡LÙ¹S ™82%è2…¦x;œ8:ŒíÒõøªRs¢§ÚÏ£RýR©þ«T¨TÿóÌm +ã›àfÔƒÁ‘|@+ääݕiúš## Ëæ¼4ì‰âÍco(¶]¼#Ÿ{n°å¾­ŽNÈsø3k±Ž³ÒÅok@>‡ ++ow8[£KfYD.^•“§™|ô ôSðñ·¨}Á¡Z>Líüc½°ˆ©vœ‘«}R³g* WU®MsÈ(Stþ¦ês6çoij5\â·"¯Yåuƒ¦ÊY§F™‰EmB$Z‹‚.¤]Nx Umx”ÀÜgfŸeI¥ ·ö 7;öÔëvÊ'*> ¹›ÕEH£ã^vÃ>ªz.ßÒ'$y…Ô²{üÚ®û‹D¯U)ØÆ4(pþ|„â5ÉÅf£’\Fê/I®ôNm²{ŽKpßÍ$sMC…´ »–Â{üz¢kµg7ú|øŒUºýó‰Ý³`¥Þؼ%G_1R‚YïeI-iÝò‘¼»ŸÊ1“ÕeDZ:ãT™/̯ŽD l¸*‡†Ÿlš‘éÕ5ÕcîM²X‡hɑæ6!z +ڜ‰öµ W=nÞ÷(~JäÄKõ瑛Ÿl(ÚÛr\Ëw⫃쇷²˜ýœÝ²ÙŠ#ó·ôZ(³2…ô‰ËÞÚ}½©á\[¦ß*gOŽj4ò–YŒBvá“5={P®œo¸h¨·hI³˜äPf …g1±º[#% ˜ò=¦ÖnY}€Ë·1Gמˆ§(,C)bý-ÑÉɊl×6}Åù¿ç Ï1çÊÀÜídë23w³5ï^faj¹¨J— ”ƒ4 §(X›Í,rÞ>0¯ÚÍf’U_Ï´õ;?`§P!¤„eÞaÍYŽ'_Â<˜c÷I£Êµ"¬ýØ™Vî‘öÍD8ém& +8eë`Ƭ¸Æ5Á¡ÆLäìÓRGñ¡ì¤ìò¯xk»Èm9Áՙ™ÚPØs +”åÐX€ßé»F²95´¥y =øâŸzrnväú™Ï‘)0Ë»þœVqZýËiýÓê§u¢ø©ýKs«•¶±âr§ÎfWáQZ…­6cÈ2 +gi>ó)M_ÁX•|Ì@û˜ÄÛûuÕ#C± bôV¹VOÆiÍíW¦6âÛ=ROÓéèZ€_†PøšÚ¤5¡J’.;Ùö_(7ú¡Û[ùÈŽ«€ãº\Ža ڊ% 0Á»ãÑþÛ1Ùðs‚,aCÙ?ˆø#bA¬ÀX·Š\ýx|³E¦àVþ¥çé64TVö¬>hðŸbóDóÜŠWsÁ{QþzztOCʈQ–Ê‚<â¡>*M…JâØ h˙ÄÀXdئÇÔ¤ó:ondt‘' endstream endobj 21 0 obj <> endobj 53 0 obj <>stream +8;Z\78TM]k&G-S6OW2kcrW4J30?u#-ESeTW_D$Lp779nT9.aKa +T1l:0R/QcT!$TfXZ^:kI,k3H7RK4P]jOo41+n\]3jhAA-QnJKMK1N4\+b7XjTEn]b +Y!9`,IT?#G.4Y0bdiD`eITX$TjG50PL +3^Y.&7Z&C.=-"KK("'RFU5t3(J5oA4Sq]&;USoThaSNHca2rLC+1^Y:Cq1+g5Yn.d +MNHkR:B&a[46524?[=GcnI&d=),#B'D1S9Kq-GF;[8Z)2adh@W!\!R#RKpJ>I(A2ZBiFo=MPG2`6k9L09:H7[Z6 +QKoSl`+md_j>rT*nHhdtDW5s`o]YQqg6JttlHq/5k;VOc'QZ@frN9gS)=#3Zc\a1U +;>)n@c6@H)d8VqnoVe_0/".CC:'`6cWk4_`J)_<&f\qs/SJ&BVDj9Qklq=UYO5::8 +3fh;=b]UtHfgl'0qY*&Kc42ee^:bKPs5*N7dUh!V1 endstream endobj 28 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 312.3725 392.8279 cm +0 0 m +-0.01 0.003 -0.019 0.008 -0.028 0.011 c +-0.556 0.144 -1.092 -0.176 -1.226 -0.704 c +-1.302 -1.005 -1.227 -1.307 -1.053 -1.537 c +-1.235 -1.828 -1.414 -2.122 -1.584 -2.423 c +-7.953 -13.647 -4.001 -27.961 7.224 -34.329 c +8.301 -34.939 9.426 -35.463 10.579 -35.896 c +10.65 -36.259 10.92 -36.566 11.302 -36.663 c +11.83 -36.797 12.366 -36.477 12.5 -35.949 c +12.633 -35.422 12.313 -34.886 11.785 -34.752 c +11.439 -34.665 11.091 -34.774 10.854 -35.008 c +9.764 -34.597 8.701 -34.1 7.682 -33.521 c +-3.098 -27.405 -6.893 -13.66 -0.777 -2.881 c +-0.592 -2.556 -0.397 -2.237 -0.198 -1.924 c +0.214 -1.894 0.579 -1.608 0.686 -1.187 c +0.731 -1.005 0.721 -0.822 0.669 -0.655 c +5.168 5.462 12.509 8.938 20.168 8.466 c +20.286 8.196 20.519 7.981 20.826 7.903 c +21.354 7.771 21.89 8.09 22.023 8.618 c +22.156 9.146 21.837 9.682 21.309 9.814 c +20.888 9.921 20.466 9.737 20.243 9.392 c +12.305 9.888 4.695 6.309 0 0 c +f +Q + endstream endobj 29 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 315.5146 387.7234 cm +0 0 m +-4.89 -8.618 -1.856 -19.608 6.763 -24.498 c +10.9 -26.845 15.723 -27.446 20.261 -26.232 c +20.569 -26.149 20.877 -26.058 21.183 -25.959 c +21.305 -26.084 21.46 -26.18 21.643 -26.227 c +22.17 -26.359 22.707 -26.04 22.84 -25.512 c +22.973 -24.984 22.653 -24.448 22.125 -24.314 c +21.598 -24.182 21.062 -24.501 20.928 -25.029 c +20.925 -25.041 20.926 -25.054 20.923 -25.066 c +16.363 -26.557 11.419 -26.071 7.221 -23.69 c +-0.952 -19.054 -3.829 -8.632 0.808 -0.458 c +5.306 7.471 15.248 10.414 23.3 6.351 c +23.277 5.891 23.579 5.464 24.042 5.347 c +24.57 5.213 25.106 5.533 25.24 6.061 c +25.373 6.589 25.053 7.124 24.525 7.258 c +24.261 7.324 23.995 7.277 23.778 7.147 c +15.276 11.478 4.755 8.38 0 0 c +f +Q + endstream endobj 30 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 698.6083 367.031 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.381 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.008 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.894 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.859 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.31 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.476 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.155 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +h +S +Q + endstream endobj 31 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 678.7866 359.115 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.252 3.02 -9.758 5.485 c +-14.59 10.242 -17.28 16.596 -17.334 23.375 c +-17.388 30.155 -14.798 36.551 -10.042 41.383 c +-4.466 47.047 3.468 49.755 11.33 48.736 c +11.409 48.526 11.556 48.34 11.768 48.222 c +12.243 47.956 12.844 48.127 13.109 48.603 c +13.374 49.077 13.204 49.678 12.729 49.943 c +12.287 50.189 11.741 50.057 11.453 49.656 c +3.3 50.713 -4.923 47.906 -10.703 42.034 c +-15.633 37.025 -18.318 30.396 -18.263 23.368 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.818 2.273 -4.809 0.338 -1.46 -0.956 c +-1.43 -1.267 -1.253 -1.558 -0.96 -1.721 c +-0.485 -1.986 0.115 -1.815 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +h +S +Q + endstream endobj 32 0 obj <>/XObject<>>>/Subtype/Form>>stream +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0.25 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm0 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0.25 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm1 Do +Q +0 0 0 1 k +/GS1 gs +q 1 0 0 1 333.2021 185.7029 cm +0 0 m +-5.257 0 -9.519 4.262 -9.519 9.519 c +-9.519 14.775 -5.257 19.037 0 19.037 c +5.257 19.037 9.519 14.775 9.519 9.519 c +9.519 4.262 5.257 0 0 0 c +0 23.887 m +-7.936 23.887 -14.369 17.454 -14.369 9.519 c +-14.369 1.583 -7.936 -4.85 0 -4.85 c +7.936 -4.85 14.369 1.583 14.369 9.519 c +14.369 17.454 7.936 23.887 0 23.887 c +f +Q +q 1 0 0 1 368.1533 196.0017 cm +0 0 m +0 -1.355 0.086 -3.67 0.258 -6.943 c +0.137 -6.943 l +-10.802 11.921 l +-17.538 11.921 l +-17.538 -13.266 l +-12.766 -13.266 l +-12.766 -1.413 l +-12.766 0.022 -12.875 2.423 -13.093 5.788 c +-12.938 5.788 l +-1.981 -13.266 l +4.806 -13.266 l +4.806 11.921 l +0 11.921 l +h +f +Q +q 1 0 0 1 390.6714 203.5476 cm +0 0 m +0 4.375 l +-14.506 4.375 l +-14.506 -20.812 l +0 -20.812 l +0 -16.401 l +-9.165 -16.401 l +-9.165 -9.906 l +-0.638 -9.906 l +-0.638 -5.53 l +-9.165 -5.53 l +-9.165 0 l +h +f +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +0.25 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm2 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +0.25 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm3 Do +Q +q 1 0 0 1 400.9633 203.9792 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.992 -0.867 2.156 -0.945 2.266 c +-1.022 2.375 -1.146 2.43 -1.316 2.43 c +-1.548 2.43 -1.716 2.353 -1.819 2.197 c +-1.922 2.043 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.802 0 l +-2.802 3.035 l +-2.169 3.035 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.055 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.997 -0.274 2.806 c +-0.091 2.615 0 2.339 0 1.979 c +h +f +Q +401.53 205.971 1.458 -0.679 re +f +q 1 0 0 1 406.0547 205.9802 cm +0 0 m +0 0.853 -0.376 1.278 -1.129 1.278 c +-1.577 1.278 l +-1.577 -1.306 l +-1.216 -1.306 l +-0.405 -1.306 0 -0.871 0 0 c +0.875 0.021 m +0.875 -0.632 0.688 -1.132 0.316 -1.479 c +-0.056 -1.827 -0.593 -2.001 -1.295 -2.001 c +-2.418 -2.001 l +-2.418 1.968 l +-1.172 1.968 l +-0.525 1.968 -0.021 1.797 0.337 1.455 c +0.695 1.113 0.875 0.635 0.875 0.021 c +f +Q +q 1 0 0 1 408.582 206.4821 cm +0 0 m +-0.176 0 -0.313 -0.056 -0.413 -0.167 c +-0.512 -0.278 -0.569 -0.437 -0.584 -0.641 c +0.578 -0.641 l +0.574 -0.437 0.521 -0.278 0.418 -0.167 c +0.314 -0.056 0.175 0 0 0 c +0.116 -2.558 m +-0.372 -2.558 -0.754 -2.422 -1.029 -2.152 c +-1.304 -1.883 -1.442 -1.501 -1.442 -1.007 c +-1.442 -0.499 -1.314 -0.105 -1.06 0.173 c +-0.806 0.45 -0.455 0.589 -0.006 0.589 c +0.423 0.589 0.757 0.467 0.996 0.223 c +1.235 -0.021 1.354 -0.359 1.354 -0.79 c +1.354 -1.191 l +-0.603 -1.191 l +-0.594 -1.427 -0.524 -1.61 -0.394 -1.743 c +-0.264 -1.875 -0.081 -1.941 0.154 -1.941 c +0.337 -1.941 0.51 -1.922 0.673 -1.884 c +0.836 -1.846 1.006 -1.785 1.183 -1.702 c +1.183 -2.343 l +1.039 -2.415 0.884 -2.469 0.719 -2.504 c +0.555 -2.54 0.354 -2.558 0.116 -2.558 c +f +Q +q 1 0 0 1 411.1372 203.9792 cm +0 0 m +-1.157 3.035 l +-0.291 3.035 l +0.296 1.306 l +0.355 1.117 0.395 0.91 0.413 0.685 c +0.434 0.685 l +0.445 0.889 0.486 1.096 0.556 1.306 c +1.14 3.035 l +2.006 3.035 l +0.85 0 l +h +f +Q +414.267 203.979 -0.828 3.035 re +413.403 207.799 m +413.403 208.068 413.554 208.203 413.854 208.203 c +414.154 208.203 414.305 208.068 414.305 207.799 c +414.305 207.671 414.267 207.57 414.192 207.499 c +414.117 207.427 414.004 207.391 413.854 207.391 c +413.554 207.391 413.403 207.527 413.403 207.799 c +f +q 1 0 0 1 416.0063 203.9245 cm +0 0 m +-0.945 0 -1.417 0.519 -1.417 1.556 c +-1.417 2.071 -1.289 2.466 -1.031 2.738 c +-0.775 3.011 -0.406 3.146 0.073 3.146 c +0.424 3.146 0.739 3.078 1.018 2.94 c +0.773 2.3 l +0.644 2.353 0.522 2.396 0.41 2.429 c +0.298 2.462 0.186 2.479 0.073 2.479 c +-0.357 2.479 -0.573 2.173 -0.573 1.562 c +-0.573 0.968 -0.357 0.671 0.073 0.671 c +0.232 0.671 0.38 0.692 0.516 0.734 c +0.651 0.777 0.787 0.844 0.923 0.935 c +0.923 0.226 l +0.789 0.141 0.654 0.082 0.517 0.05 c +0.38 0.017 0.208 0 0 0 c +f +Q +q 1 0 0 1 418.5278 206.4821 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.167 c +-0.512 -0.278 -0.569 -0.437 -0.583 -0.641 c +0.579 -0.641 l +0.575 -0.437 0.521 -0.278 0.418 -0.167 c +0.315 -0.056 0.175 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.422 -1.029 -2.152 c +-1.304 -1.883 -1.441 -1.501 -1.441 -1.007 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.173 c +-0.806 0.45 -0.454 0.589 -0.005 0.589 c +0.423 0.589 0.757 0.467 0.996 0.223 c +1.235 -0.021 1.354 -0.359 1.354 -0.79 c +1.354 -1.191 l +-0.603 -1.191 l +-0.594 -1.427 -0.524 -1.61 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.337 -1.941 0.511 -1.922 0.673 -1.884 c +0.836 -1.846 1.006 -1.785 1.184 -1.702 c +1.184 -2.343 l +1.039 -2.415 0.884 -2.469 0.719 -2.504 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 397.7275 198.7507 cm +0 0 m +-1.07 0 l +-2.796 3.003 l +-2.82 3.003 l +-2.786 2.473 -2.769 2.095 -2.769 1.868 c +-2.769 0 l +-3.521 0 l +-3.521 3.97 l +-2.459 3.97 l +-0.736 0.997 l +-0.717 0.997 l +-0.744 1.513 -0.757 1.877 -0.757 2.091 c +-0.757 3.97 l +0 3.97 l +h +f +Q +q 1 0 0 1 399.5566 201.2546 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.168 c +-0.512 -0.279 -0.569 -0.437 -0.583 -0.642 c +0.579 -0.642 l +0.575 -0.437 0.521 -0.279 0.418 -0.168 c +0.315 -0.056 0.176 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.423 -1.029 -2.153 c +-1.304 -1.884 -1.441 -1.502 -1.441 -1.008 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.172 c +-0.806 0.449 -0.454 0.589 -0.005 0.589 c +0.424 0.589 0.758 0.466 0.997 0.222 c +1.235 -0.022 1.355 -0.359 1.355 -0.791 c +1.355 -1.192 l +-0.603 -1.192 l +-0.594 -1.428 -0.524 -1.611 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.338 -1.941 0.511 -1.923 0.673 -1.885 c +0.836 -1.847 1.006 -1.786 1.184 -1.703 c +1.184 -2.343 l +1.039 -2.416 0.884 -2.47 0.72 -2.505 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 403.4843 198.7507 cm +0 0 m +-0.111 0.389 l +-0.155 0.389 l +-0.244 0.247 -0.369 0.139 -0.532 0.062 c +-0.695 -0.016 -0.88 -0.054 -1.089 -0.054 c +-1.445 -0.054 -1.714 0.042 -1.895 0.232 c +-2.076 0.424 -2.167 0.698 -2.167 1.057 c +-2.167 3.035 l +-1.338 3.035 l +-1.338 1.263 l +-1.338 1.044 -1.299 0.88 -1.222 0.771 c +-1.144 0.66 -1.02 0.605 -0.85 0.605 c +-0.618 0.605 -0.451 0.683 -0.348 0.838 c +-0.244 0.992 -0.193 1.249 -0.193 1.607 c +-0.193 3.035 l +0.635 3.035 l +0.635 0 l +h +f +Q +q 1 0 0 1 406.3208 201.8435 cm +0 0 m +0.112 0 0.206 -0.009 0.28 -0.024 c +0.217 -0.801 l +0.15 -0.783 0.069 -0.774 -0.027 -0.774 c +-0.292 -0.774 -0.497 -0.842 -0.645 -0.978 c +-0.792 -1.113 -0.866 -1.304 -0.866 -1.548 c +-0.866 -3.093 l +-1.694 -3.093 l +-1.694 -0.058 l +-1.067 -0.058 l +-0.945 -0.567 l +-0.904 -0.567 l +-0.81 -0.397 -0.683 -0.261 -0.522 -0.156 c +-0.362 -0.053 -0.188 0 0 0 c +f +Q +q 1 0 0 1 408.5288 200.157 cm +0 0 m +-0.32 -0.011 l +-0.561 -0.018 -0.74 -0.061 -0.857 -0.141 c +-0.975 -0.221 -1.034 -0.342 -1.034 -0.505 c +-1.034 -0.738 -0.9 -0.854 -0.632 -0.854 c +-0.44 -0.854 -0.287 -0.8 -0.172 -0.689 c +-0.058 -0.579 0 -0.433 0 -0.249 c +h +0.245 -1.406 m +0.084 -0.993 l +0.062 -0.993 l +-0.077 -1.169 -0.22 -1.29 -0.368 -1.358 c +-0.515 -1.427 -0.708 -1.46 -0.944 -1.46 c +-1.236 -1.46 -1.465 -1.377 -1.633 -1.21 c +-1.8 -1.044 -1.884 -0.807 -1.884 -0.499 c +-1.884 -0.177 -1.771 0.061 -1.546 0.214 c +-1.32 0.366 -0.981 0.451 -0.526 0.467 c +0 0.483 l +0 0.616 l +0 0.924 -0.157 1.078 -0.472 1.078 c +-0.715 1.078 -1 1.005 -1.327 0.858 c +-1.602 1.417 l +-1.252 1.601 -0.865 1.691 -0.439 1.691 c +-0.032 1.691 0.28 1.603 0.497 1.426 c +0.714 1.248 0.823 0.979 0.823 0.616 c +0.823 -1.406 l +h +f +Q +410.67 198.751 -0.828 4.225 re +f +q 1 0 0 1 396.4922 193.5232 cm +0 0 m +-2.286 0 l +-2.286 3.969 l +0 3.969 l +0 3.279 l +-1.444 3.279 l +-1.444 2.407 l +-0.101 2.407 l +-0.101 1.718 l +-1.444 1.718 l +-1.444 0.694 l +0 0.694 l +h +f +Q +q 1 0 0 1 399.9179 193.5232 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.991 -0.867 2.155 -0.945 2.265 c +-1.022 2.375 -1.146 2.429 -1.317 2.429 c +-1.548 2.429 -1.716 2.352 -1.819 2.197 c +-1.922 2.042 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.802 0 l +-2.802 3.034 l +-2.169 3.034 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.054 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.996 -0.274 2.805 c +-0.092 2.614 0 2.339 0 1.979 c +h +f +Q +q 1 0 0 1 401.6655 194.1169 cm +0 0 m +0.222 0 0.382 0.064 0.478 0.191 c +0.573 0.319 0.622 0.526 0.622 0.812 c +0.622 0.912 l +0.622 1.236 0.571 1.47 0.471 1.611 c +0.37 1.754 0.209 1.825 -0.014 1.825 c +-0.403 1.825 -0.597 1.519 -0.597 0.907 c +-0.597 0.603 -0.549 0.376 -0.452 0.226 c +-0.355 0.075 -0.205 0 0 0 c +1.395 -0.6 m +1.395 -1.035 1.268 -1.366 1.014 -1.592 c +0.759 -1.817 0.381 -1.93 -0.122 -1.93 c +-0.565 -1.93 -0.944 -1.87 -1.257 -1.75 c +-1.257 -1.088 l +-0.89 -1.244 -0.495 -1.321 -0.074 -1.321 c +0.352 -1.321 0.564 -1.092 0.564 -0.632 c +0.564 -0.572 l +0.589 -0.2 l +0.564 -0.2 l +0.371 -0.499 0.084 -0.648 -0.296 -0.648 c +-0.66 -0.648 -0.942 -0.508 -1.142 -0.228 c +-1.342 0.053 -1.442 0.435 -1.442 0.918 c +-1.442 1.416 -1.338 1.804 -1.131 2.081 c +-0.924 2.358 -0.638 2.498 -0.274 2.498 c +0.098 2.498 0.392 2.35 0.605 2.053 c +0.627 2.053 l +0.695 2.44 l +1.395 2.44 l +h +f +Q +404.393 193.523 -0.828 3.034 re +403.53 197.342 m +403.53 197.612 403.68 197.747 403.981 197.747 c +404.281 197.747 404.431 197.612 404.431 197.342 c +404.431 197.214 404.394 197.114 404.319 197.043 c +404.244 196.97 404.131 196.935 403.981 196.935 c +403.68 196.935 403.53 197.071 403.53 197.342 c +f +q 1 0 0 1 407.8134 193.5232 cm +0 0 m +-0.828 0 l +-0.828 1.772 l +-0.828 1.991 -0.867 2.155 -0.945 2.265 c +-1.022 2.375 -1.146 2.429 -1.316 2.429 c +-1.548 2.429 -1.716 2.352 -1.819 2.197 c +-1.922 2.042 -1.974 1.786 -1.974 1.428 c +-1.974 0 l +-2.801 0 l +-2.801 3.034 l +-2.169 3.034 l +-2.058 2.646 l +-2.012 2.646 l +-1.919 2.793 -1.792 2.904 -1.63 2.979 c +-1.468 3.054 -1.284 3.092 -1.078 3.092 c +-0.725 3.092 -0.457 2.996 -0.274 2.805 c +-0.091 2.614 0 2.339 0 1.979 c +h +f +Q +q 1 0 0 1 409.561 196.0261 cm +0 0 m +-0.175 0 -0.313 -0.056 -0.413 -0.168 c +-0.512 -0.278 -0.569 -0.437 -0.583 -0.642 c +0.579 -0.642 l +0.575 -0.437 0.521 -0.278 0.418 -0.168 c +0.315 -0.056 0.176 0 0 0 c +0.117 -2.558 m +-0.372 -2.558 -0.754 -2.423 -1.029 -2.153 c +-1.304 -1.884 -1.441 -1.502 -1.441 -1.008 c +-1.441 -0.499 -1.314 -0.105 -1.06 0.172 c +-0.806 0.449 -0.454 0.589 -0.005 0.589 c +0.424 0.589 0.758 0.467 0.996 0.222 c +1.235 -0.022 1.355 -0.359 1.355 -0.79 c +1.355 -1.192 l +-0.603 -1.192 l +-0.594 -1.428 -0.524 -1.611 -0.394 -1.743 c +-0.263 -1.875 -0.081 -1.941 0.155 -1.941 c +0.337 -1.941 0.511 -1.922 0.673 -1.885 c +0.836 -1.847 1.006 -1.786 1.184 -1.702 c +1.184 -2.343 l +1.039 -2.415 0.884 -2.469 0.72 -2.505 c +0.555 -2.54 0.354 -2.558 0.117 -2.558 c +f +Q +q 1 0 0 1 395.8676 204.6355 cm +0 0 m +-0.615 0 -1.114 0.499 -1.114 1.114 c +-1.114 1.729 -0.615 2.228 0 2.228 c +0.615 2.228 1.114 1.729 1.114 1.114 c +1.114 0.499 0.615 0 0 0 c +0 3.003 m +-1.043 3.003 -1.889 2.157 -1.889 1.114 c +-1.889 0.07 -1.043 -0.775 0 -0.775 c +1.043 -0.775 1.89 0.07 1.89 1.114 c +1.89 2.157 1.043 3.003 0 3.003 c +f +Q + endstream endobj 33 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 315.4511 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.914 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.076 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.356 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.716 2.674 21.885 2.405 22.162 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.443 6.371 6.167 4.88 0 0 c +f +Q + endstream endobj 34 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 317.167 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.089 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.742 -29.6 13.739 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.853 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.15 0.111 c +24.009 -0.326 24.19 -0.817 24.608 -1.05 c +25.083 -1.315 25.684 -1.146 25.949 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 35 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 341.747 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.438 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.007 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.081 6.445 -29.063 6.478 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.895 -29.725 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.976 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +f +Q + endstream endobj 36 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 321.9253 174.4812 cm +0 0 m +-0.363 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.757 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.797 36.55 -10.041 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.41 48.525 11.557 48.339 11.768 48.221 c +12.244 47.956 12.844 48.126 13.109 48.602 c +13.375 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.742 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.262 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.429 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.116 -1.816 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 37 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 487.2256 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.914 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.356 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.716 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.443 6.371 6.167 4.88 0 0 c +f +Q + endstream endobj 38 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 488.9414 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.089 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.742 -29.6 13.739 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.853 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.684 -1.146 25.949 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 39 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.5214 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.438 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.007 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.081 6.445 -29.063 6.478 c +-28.798 6.953 -28.968 7.553 -29.444 7.818 c +-29.58 7.895 -29.725 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.936 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.976 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.8 36.256 -12.804 36.241 -12.811 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.957 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +f +Q + endstream endobj 40 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 346.5654 366.7712 cm +0 0 m +-0.528 0.134 -1.063 -0.187 -1.197 -0.714 c +-1.259 -0.958 -1.22 -1.202 -1.112 -1.409 c +-7.281 -7.971 -17.194 -9.521 -25.125 -5.021 c +-26.88 -4.025 -28.444 -2.787 -29.787 -1.356 c +-29.774 -1.322 -29.759 -1.291 -29.75 -1.255 c +-29.617 -0.728 -29.936 -0.191 -30.464 -0.058 c +-30.615 -0.02 -30.765 -0.022 -30.907 -0.053 c +-32.491 1.968 -33.674 4.302 -34.378 6.852 c +-35.776 11.915 -35.118 17.22 -32.526 21.789 c +-30.075 26.11 -26.17 29.281 -21.471 30.795 c +-21.35 30.674 -21.198 30.579 -21.019 30.534 c +-20.491 30.401 -19.955 30.721 -19.822 31.248 c +-19.688 31.776 -20.008 32.313 -20.536 32.445 c +-21.063 32.579 -21.6 32.259 -21.733 31.731 c +-21.737 31.716 -21.737 31.699 -21.74 31.684 c +-26.668 30.1 -30.764 26.777 -33.334 22.247 c +-36.048 17.463 -36.737 11.907 -35.273 6.604 c +-34.533 3.923 -33.286 1.471 -31.617 -0.651 c +-31.633 -0.691 -31.65 -0.729 -31.661 -0.772 c +-31.794 -1.3 -31.475 -1.836 -30.947 -1.969 c +-30.789 -2.009 -30.632 -2.004 -30.484 -1.97 c +-29.074 -3.478 -27.43 -4.781 -25.583 -5.829 c +-20.726 -8.584 -15.16 -9.174 -10.081 -7.815 c +-6.428 -6.838 -3.029 -4.849 -0.33 -1.934 c +0.145 -1.977 0.594 -1.674 0.714 -1.196 c +0.848 -0.669 0.528 -0.133 0 0 c +f +Q + endstream endobj 41 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 493.6997 174.4812 cm +0 0 m +-0.363 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.757 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.041 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.41 48.525 11.557 48.339 11.768 48.221 c +12.244 47.956 12.844 48.126 13.109 48.602 c +13.375 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.742 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.262 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.429 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 42 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 672.3124 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 672.3124 216.406 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.339 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.443 1.726 -36.46 1.436 -36.625 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.708 23.122 3.973 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +h +S +Q + endstream endobj 43 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 674.0283 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 674.0283 210.6628 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +h +S +Q + endstream endobj 44 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 698.6083 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.008 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.895 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 698.6083 182.3962 cm +0 0 m +-0.476 0.266 -1.076 0.095 -1.341 -0.38 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.817 -19.071 -4.752 -25.569 1.645 c +-27.008 3.06 -28.198 4.659 -29.125 6.39 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.953 -28.969 7.553 -29.444 7.818 c +-29.58 7.895 -29.726 7.931 -29.871 7.938 c +-30.878 10.3 -31.418 12.86 -31.439 15.505 c +-31.48 20.758 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.051 -12.782 35.299 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.835 -11.071 35.311 c +-10.806 35.785 -10.977 36.386 -11.452 36.651 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.241 -12.812 36.227 c +-17.982 35.971 -22.797 33.819 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.477 -30.785 7.437 c +-31.05 6.963 -30.88 6.362 -30.404 6.097 c +-30.263 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.156 -27.734 2.472 -26.221 0.982 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.9 -0.819 -1.783 c +-0.372 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.265 0 0 c +h +S +Q + endstream endobj 45 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 678.7866 174.4812 cm +0 0 m +-0.364 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.758 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.741 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +q 1 0 0 1 678.7866 174.4812 cm +0 0 m +-0.364 0.202 -0.799 0.149 -1.103 -0.1 c +-4.342 1.148 -7.252 3.019 -9.758 5.484 c +-14.59 10.241 -17.28 16.595 -17.334 23.374 c +-17.388 30.154 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.754 11.33 48.735 c +11.409 48.525 11.556 48.339 11.768 48.221 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.677 12.729 49.942 c +12.287 50.188 11.741 50.056 11.453 49.655 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.633 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.339 -15.418 9.753 -10.409 4.823 c +-7.818 2.272 -4.809 0.337 -1.46 -0.957 c +-1.43 -1.268 -1.253 -1.559 -0.96 -1.722 c +-0.485 -1.987 0.115 -1.816 0.38 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +h +S +Q + endstream endobj 46 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 329.4638 354.0017 cm +0 0 m +-0.404 0.102 -0.811 -0.062 -1.04 -0.381 c +-4.492 -0.013 -7.787 1.042 -10.844 2.776 c +-16.742 6.122 -20.983 11.563 -22.787 18.1 c +-24.592 24.636 -23.743 31.482 -20.397 37.38 c +-16.475 44.293 -9.511 48.96 -1.653 50.008 c +-1.522 49.825 -1.332 49.684 -1.097 49.624 c +-0.569 49.49 -0.033 49.811 0.101 50.338 c +0.234 50.866 -0.086 51.402 -0.614 51.535 c +-1.104 51.659 -1.597 51.39 -1.772 50.929 c +-9.92 49.842 -17.139 45.005 -21.205 37.838 c +-24.673 31.725 -25.553 24.627 -23.682 17.853 c +-21.812 11.077 -17.416 5.437 -11.302 1.969 c +-8.141 0.175 -4.733 -0.917 -1.164 -1.302 c +-1.054 -1.594 -0.809 -1.829 -0.483 -1.911 c +0.045 -2.045 0.581 -1.726 0.714 -1.197 c +0.847 -0.67 0.527 -0.134 0 0 c +f +Q + endstream endobj 47 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 500.5219 407.0984 cm +0 0 m +-0.007 0.006 -0.013 0.016 -0.021 0.021 c +-0.419 0.362 -0.921 0.144 -1.144 -0.467 c +-1.271 -0.815 -1.275 -1.214 -1.184 -1.558 c +-1.395 -1.857 -1.603 -2.163 -1.806 -2.479 c +-9.388 -14.288 -9.29 -33.352 -1.587 -44.975 c +-0.848 -46.09 -0.051 -47.112 0.788 -48.031 c +0.767 -48.505 0.919 -48.978 1.207 -49.224 c +1.605 -49.564 2.108 -49.346 2.33 -48.735 c +2.552 -48.125 2.41 -47.354 2.012 -47.014 c +1.75 -46.79 1.445 -46.812 1.203 -47.022 c +0.411 -46.149 -0.342 -45.18 -1.042 -44.125 c +-8.439 -32.963 -8.533 -14.656 -1.252 -3.316 c +-1.032 -2.974 -0.805 -2.645 -0.576 -2.321 c +-0.237 -2.42 0.121 -2.188 0.298 -1.7 c +0.375 -1.489 0.405 -1.26 0.399 -1.035 c +5.364 5.059 12.056 6.935 18.15 3.806 c +18.187 3.433 18.329 3.089 18.561 2.891 c +18.958 2.55 19.461 2.769 19.684 3.379 c +19.906 3.989 19.763 4.76 19.365 5.101 c +19.048 5.372 18.666 5.283 18.411 4.93 c +12.096 8.18 5.165 6.266 0 0 c +f +Q + endstream endobj 48 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 501.959 399.7243 cm +0 0 m +-5.821 -9.066 -5.746 -23.704 0.168 -32.629 c +3.007 -36.912 6.779 -39.259 10.713 -39.259 c +10.981 -39.259 11.249 -39.247 11.519 -39.226 c +11.59 -39.422 11.695 -39.593 11.832 -39.71 c +12.23 -40.051 12.733 -39.832 12.956 -39.222 c +13.178 -38.611 13.035 -37.841 12.637 -37.5 c +12.239 -37.159 11.736 -37.378 11.514 -37.988 c +11.509 -38.003 11.506 -38.018 11.501 -38.032 c +7.489 -38.368 3.595 -36.126 0.714 -31.778 c +-4.895 -23.315 -4.966 -9.435 0.555 -0.837 c +5.911 7.504 14.591 7.855 20.226 0.144 c +20.107 -0.419 20.26 -1.049 20.609 -1.349 c +21.007 -1.688 21.51 -1.47 21.732 -0.859 c +21.955 -0.249 21.811 0.521 21.414 0.862 c +21.214 1.032 20.988 1.062 20.785 0.974 c +14.844 9.166 5.661 8.815 0 0 c +f +Q + endstream endobj 49 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 522.5449 363.4333 cm +0 0 m +-0.398 0.341 -0.901 0.122 -1.123 -0.488 c +-1.226 -0.771 -1.248 -1.087 -1.205 -1.379 c +-7.616 -7.47 -15.972 -6.102 -21.414 2.11 c +-22.619 3.929 -23.616 5.982 -24.392 8.203 c +-24.375 8.24 -24.355 8.275 -24.341 8.316 c +-24.119 8.927 -24.261 9.697 -24.659 10.038 c +-24.773 10.135 -24.895 10.182 -25.017 10.191 c +-25.86 13.224 -26.312 16.511 -26.33 19.906 c +-26.365 26.65 -24.684 33.012 -21.598 37.818 c +-18.68 42.363 -14.834 45.001 -10.705 45.319 c +-10.633 45.128 -10.53 44.961 -10.395 44.846 c +-9.997 44.505 -9.494 44.724 -9.272 45.334 c +-9.05 45.944 -9.192 46.716 -9.591 47.056 c +-9.989 47.396 -10.492 47.178 -10.714 46.567 c +-10.72 46.549 -10.724 46.529 -10.729 46.511 c +-15.06 46.183 -19.093 43.42 -22.152 38.655 c +-25.384 33.621 -27.144 26.96 -27.108 19.896 c +-27.089 16.326 -26.612 12.87 -25.721 9.685 c +-25.742 9.641 -25.765 9.599 -25.782 9.55 c +-26.004 8.939 -25.862 8.168 -25.464 7.828 c +-25.345 7.726 -25.217 7.68 -25.089 7.674 c +-24.275 5.336 -23.227 3.174 -21.96 1.261 c +-18.626 -3.769 -14.251 -6.348 -9.848 -6.348 c +-6.681 -6.348 -3.5 -5.008 -0.685 -2.289 c +-0.311 -2.5 0.118 -2.272 0.319 -1.722 c +0.541 -1.111 0.398 -0.341 0 0 c +f +Q + endstream endobj 50 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 505.9443 353.2702 cm +0 0 m +-0.305 0.261 -0.669 0.192 -0.924 -0.127 c +-3.637 1.476 -6.074 3.877 -8.172 7.043 c +-12.219 13.149 -14.473 21.307 -14.518 30.012 c +-14.563 38.716 -12.393 46.927 -8.41 53.131 c +-3.74 60.403 2.904 63.88 9.489 62.572 c +9.555 62.302 9.679 62.063 9.856 61.911 c +10.254 61.571 10.757 61.79 10.979 62.4 c +11.201 63.011 11.058 63.781 10.66 64.122 c +10.29 64.438 9.833 64.268 9.592 63.753 c +2.764 65.11 -4.123 61.506 -8.964 53.967 c +-13.093 47.536 -15.342 39.025 -15.295 30.002 c +-15.249 20.979 -12.913 12.523 -8.718 6.193 c +-6.548 2.919 -4.027 0.434 -1.223 -1.228 c +-1.197 -1.626 -1.05 -2 -0.804 -2.21 c +-0.406 -2.551 0.097 -2.332 0.319 -1.722 c +0.541 -1.111 0.398 -0.34 0 0 c +f +Q + endstream endobj 51 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 672.3124 401.0407 cm +0 0 m +-0.009 0.005 -0.016 0.012 -0.025 0.017 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.517 -0.635 -1.522 -0.945 -1.414 -1.213 c +-1.666 -1.447 -1.915 -1.685 -2.157 -1.932 c +-11.21 -11.129 -11.093 -25.977 -1.896 -35.03 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.411 c +0.916 -37.779 1.097 -38.147 1.441 -38.34 c +1.917 -38.604 2.517 -38.435 2.782 -37.959 c +3.047 -37.483 2.877 -36.883 2.402 -36.618 c +2.09 -36.444 1.726 -36.461 1.436 -36.625 c +0.49 -35.945 -0.409 -35.189 -1.244 -34.368 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.316 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.324 c +0.447 -1.16 0.483 -0.981 0.477 -0.807 c +6.404 3.94 14.395 5.401 21.671 2.964 c +21.715 2.674 21.885 2.405 22.161 2.251 c +22.637 1.986 23.237 2.156 23.502 2.632 c +23.768 3.107 23.597 3.707 23.122 3.973 c +22.743 4.184 22.288 4.115 21.983 3.84 c +14.442 6.371 6.167 4.88 0 0 c +h +S +Q + endstream endobj 52 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 674.0283 395.2976 cm +0 0 m +-6.951 -7.062 -6.861 -18.463 0.201 -25.414 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.553 c +13.839 -30.705 13.964 -30.838 14.128 -30.93 c +14.604 -31.195 15.204 -31.024 15.469 -30.549 c +15.734 -30.074 15.564 -29.474 15.088 -29.208 c +14.613 -28.943 14.013 -29.113 13.748 -29.589 c +13.741 -29.6 13.738 -29.611 13.733 -29.623 c +8.942 -29.885 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.652 c +7.057 5.845 17.422 6.118 24.149 0.111 c +24.008 -0.326 24.19 -0.817 24.607 -1.051 c +25.083 -1.315 25.683 -1.146 25.948 -0.67 c +26.214 -0.194 26.043 0.406 25.568 0.671 c +25.33 0.804 25.061 0.827 24.817 0.758 c +17.724 7.139 6.759 6.866 0 0 c +h +S +Q + endstream endobj 263 0 obj <> endobj 262 0 obj <> endobj 261 0 obj <> endobj 260 0 obj <> endobj 259 0 obj <> endobj 258 0 obj <> endobj 257 0 obj <> endobj 256 0 obj <> endobj 255 0 obj <> endobj 254 0 obj <> endobj 253 0 obj <> endobj 252 0 obj <> endobj 251 0 obj <> endobj 250 0 obj <> endobj 249 0 obj <> endobj 248 0 obj <> endobj 247 0 obj <> endobj 246 0 obj <> endobj 245 0 obj <> endobj 244 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 318.2861 213.571 cm +0 0 m +-0.009 0.005 -0.016 0.013 -0.025 0.018 c +-0.5 0.282 -1.101 0.112 -1.366 -0.363 c +-1.518 -0.635 -1.522 -0.945 -1.415 -1.213 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.977 -1.896 -35.029 c +-1.013 -35.898 -0.061 -36.694 0.941 -37.41 c +0.916 -37.779 1.097 -38.146 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.483 2.877 -36.883 2.401 -36.617 c +2.09 -36.443 1.726 -36.46 1.436 -36.624 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.367 c +-10.077 -25.674 -10.189 -11.415 -1.495 -2.583 c +-1.232 -2.315 -0.962 -2.06 -0.688 -1.808 c +-0.283 -1.885 0.144 -1.704 0.355 -1.323 c +0.447 -1.159 0.483 -0.98 0.477 -0.806 c +6.404 3.94 14.394 5.401 21.671 2.965 c +21.715 2.674 21.885 2.406 22.161 2.252 c +22.636 1.986 23.237 2.157 23.502 2.632 c +23.767 3.107 23.597 3.708 23.122 3.974 c +22.743 4.185 22.288 4.115 21.983 3.84 c +14.442 6.371 6.166 4.881 0 0 c +f +Q + endstream endobj 241 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 320.0019 207.8279 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.413 c +3.59 -28.75 8.094 -30.578 12.792 -30.578 c +13.111 -30.578 13.432 -30.569 13.753 -30.552 c +13.839 -30.704 13.964 -30.838 14.128 -30.93 c +14.604 -31.194 15.204 -31.024 15.469 -30.549 c +15.734 -30.073 15.564 -29.473 15.088 -29.208 c +14.613 -28.942 14.013 -29.113 13.748 -29.588 c +13.741 -29.6 13.738 -29.611 13.732 -29.623 c +8.942 -29.884 4.292 -28.138 0.852 -24.752 c +-5.845 -18.16 -5.93 -7.349 0.662 -0.651 c +7.057 5.845 17.421 6.118 24.149 0.112 c +24.008 -0.326 24.19 -0.817 24.607 -1.05 c +25.083 -1.315 25.683 -1.145 25.948 -0.67 c +26.213 -0.194 26.043 0.406 25.568 0.672 c +25.33 0.805 25.06 0.828 24.817 0.759 c +17.724 7.139 6.759 6.866 0 0 c +f +Q + endstream endobj 242 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 344.5815 179.5622 cm +0 0 m +-0.475 0.265 -1.076 0.095 -1.341 -0.381 c +-1.463 -0.601 -1.489 -0.847 -1.438 -1.075 c +-9.093 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.081 6.444 -29.063 6.477 c +-28.798 6.952 -28.968 7.553 -29.444 7.817 c +-29.579 7.894 -29.725 7.93 -29.871 7.937 c +-30.878 10.299 -31.418 12.859 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.788 29.455 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.019 -12.412 34.929 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.385 -11.451 36.65 c +-11.927 36.916 -12.527 36.745 -12.792 36.27 c +-12.8 36.256 -12.804 36.24 -12.812 36.226 c +-17.981 35.97 -22.797 33.818 -26.45 30.107 c +-30.309 26.187 -32.411 20.998 -32.367 15.496 c +-32.345 12.716 -31.775 10.023 -30.711 7.543 c +-30.736 7.509 -30.763 7.476 -30.785 7.437 c +-31.05 6.962 -30.879 6.361 -30.404 6.097 c +-30.262 6.017 -30.109 5.981 -29.957 5.977 c +-28.985 4.155 -27.733 2.471 -26.22 0.981 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.977 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.948 0.141 -1.771 0.381 -1.342 c +0.646 -0.866 0.476 -0.266 0 0 c +f +Q + endstream endobj 243 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 324.7602 171.6462 cm +0 0 m +-0.364 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.253 3.02 -9.758 5.485 c +-14.59 10.241 -17.281 16.595 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.042 41.382 c +-4.466 47.046 3.468 49.755 11.33 48.736 c +11.409 48.525 11.556 48.339 11.768 48.222 c +12.243 47.956 12.844 48.126 13.109 48.602 c +13.374 49.077 13.204 49.678 12.729 49.942 c +12.287 50.189 11.741 50.056 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.703 42.033 c +-15.634 37.024 -18.318 30.396 -18.263 23.367 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.819 2.273 -4.809 0.337 -1.46 -0.956 c +-1.43 -1.267 -1.253 -1.558 -0.96 -1.722 c +-0.485 -1.986 0.115 -1.816 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +f +Q + endstream endobj 267 0 obj <> endobj 266 0 obj <> endobj 265 0 obj <> endobj 264 0 obj <> endobj 238 0 obj <> endobj 237 0 obj <> endobj 236 0 obj <> endobj 235 0 obj <> endobj 27 0 obj <> endobj 5 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 270 0 R/TrimBox[0.0 0.0 842.0 596.0]/Type/Page>> endobj 6 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 273 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 288 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 316 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 331 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 317 0 obj <>stream +H‰ìWێ·}Ÿ¯è˜YE²È×ÈH^Aä¶õ°r`ëÿÔ9Eötï® C@ Òðl²®§Šþüqûð§iûÝw·ÛÏ·´ÕQwé[/yïc»OøË÷·¿o?ù†økÚ~üâÿöÇ¿ÿœ¶ïþqûËÛùó>úìã˖·íËã'lÊØô³O$ÿ˛vÙK2ÙrÍ{Z¶Çç–>ßîm¯†}÷ QúVw•v þØö¸}/Í%ŽÏDwÍ¿žƒÇí2ýæõ‘— —ø{¸l2ö^;ûÈcá{¶Ýÿ4ÛB'!ïÃ\ÄøÐ%MM ` ·Ë<¿Èó“ ÏÛ.‚>n?À5‡­‹øÁ'7õ¯ÛÉÖ0òÞFÙҞ“K_öÚ́Šn÷¾7—ÀUß³;jÂWI÷šü´²”1áÒ ygâžÝ†]øMݍõvf·ÖNiO“Ë¥Rße»h¥Ue +Œ ÷bv:Ý?Ný >LÏá§×ƪe—¢î2Ó]GÏgcU¿†¢ö=«¼†wØ9ž§RºKmoq–]Ã(ɃÔޙhîh9òz"=UñDÆÉ)-e¥ë;k:מ&hæÑÐM0ôl÷Vr‹'ÞÌ¡ì’í ˀOSW·Q²!{W¡ëv±îp4n,ªp²#±´ ¸qè‚îà\pº‡„Åpºî‘ˆÃZ¹æÒC(?v°^çF‡”="ø4;”ˆ$Ëù «aUӘ0×3Ô1–! ñÚ4cœ´ã‰puåñYÏ ø–£®E€Ü=R[k‰䇸Uh¥jê±1gÜ&nÅ»øÝø-†s"àG°D¶¶qwîI™öî>rbÿáìswµÿ˱YÇ%ìݝ"X³ŽpœÇ_€ð•å _„¦AºW9AW,ÙÂ)Â¥Ože5 ˜ßYàá肷¸¹‚¢AŸvK'wAí…N¨)¤Èc¡žD~YÁ‘CÖâÊ0í­.x±àhd¨ÜspdG=q©`•PÁ<úÏê¼áe7uÓf3—ßNi–v¡e\ê¹Ý2ý i„Ö­äN­3÷ÖÂà1Z¢SiGrÀÀÜ×VhxœâS#qî×u¿Oæñ,ˆž‘.ŒîÙA‘ ‚60ÙÕ¶¥§®!D´4:@‘±nÁÄàèÖNHêÜJì2B~0Å!ݺµ¥Rª[S‚[j +4hcJab‚WALü_{qW ­zBÖ¸ + + F”2ž`tVä€6}LƵž¸PX‹Ðlµ’<}q`0G¶éР--\̉QìõõyèÐÁw¬5'›ÉƒÈËt*¼OԐJ.$ºg3Ó"Kè;ápøâP¼‚ÿ24Ή®M·u€ûY)µwd°]ª—øxúÞª›÷JLa˜ ì6iz@Gt‡Û  ”¤c:º .©Â·È´Öðw‘‰ðM­èDz³¼ O«(>oÌVLcH=îÒÕBy6o«Þ–î+nÿ©É6 alw–-Þ鶊bÚ=ëÔ5|ΌÝí +ØÁ¬ÅÓ +Y!ðƒWTô©§ÖÛó€ã†ø`ÍT§Þ1d(ÏÀÍãXu¬+jæŒx— S9Éøq{J½v<ÕT»âêRnzE]V·dÿ£_`Y0£“J_À K)‘ì€î™>‚áQ(Sê`I™µ±7&ª'ÜDJ2njÍÇÊ`!§vÎØÕ,"i°¹è¡Ø[F\«¨!ƒd_³°o‰oÔØá‚L”+£÷cL9 û@29jŽÛãǯ96?ϯ\]Æ×ÊÈÇJaröVhMŒGŽ]=cnÐ΃$˜*ò WŒs †òْb³Û˜bÙøvžŒ™xÑàN"ÁÉ ©Y6^ñ@÷nHâ÷J « k`þÕx)ù\e|c Ôk ,ßZå¿£ÚWk`ùÖ¨ß^eüæ"(_-‚ò+E°ÿö"8þ…E°ùa ´ìzIàá ªo•2XOªÎ÷Š\ 3-‰× Kõó¤<€j‰®¿ì2,Îk«u/š3&ûhgȂÛGD:ˆQK{‚–;\g¦côé5ª»+¡$Çÿ¹à?Ïí“ ìßφ*éâ¾Ãi6µÞ4…ó(g¨ PgC€,÷Ë#HdHÖ˜=’5]Vš™ÄîJہf˜µcÕMRØ1ÕxYDìÓCށÊ,á>K²n²€œçFcïeƒ´åQbúzŒy—t‚Ð @В¤ÁV¯ +t°Ë@TA°.Ü'4¹Uæ »t‚èšL×r_ՈaåéÅfÄ%@QšJÐûö¼€êâÀ¥@b·Eé=’C»›ð1¿£9snFxp[<ÒÜÚp¤’»RD–—&gåÎ}ÃàDâ=T~P +¥Z9­6a¦*A´— 3ÍLžõ==hFÆ =8±²±|‹sž+Fæðªª^0}ø&‰õS–àª6ÝŽ»G¿=S!ÚçÀ)·ÛW:NkîO ð({®j…xQ¦4½ÍWÁ”ǤD¬óWY…?Ý"°A»]Œ¶€ˆbS²þ„8oPÍ2C?Ôjá Â¥¶^.èߟ|Þ;·öЊDÕYŒÕe˄¼’ +÷Vò(H™{(6Ø;¬”ƁÈ%¶N,Q„š2ǓN"2k;¢%´e±¨m¢>+ß±·ÄWXâuÁC¨FÔ¡vÌ6±Äqpì(k Յ%&ÌÅ}p%Nàúy2”v¦Ž¤ì ™Õ°Ö9—µD^À|Ð 8Êz<»:›20ŒÇ-øWDç8a ”¾Baq”;w¾ÎúC‡â[Ýõcûå{ßsnÕ@þñgç ÏÒÙ¶Æðm߇ÑTڙð +P]g‰“×E¨?·¾‚QÜÂ]1z¯¿ônÏÞ;tM“uh[4Q'XþCÓv„¶0„#©ýDo7EqKjÑ£µ ¸qh]kP§£§ô+ §[¢h^¼¼V®•†–ZT€ÇëÜ؎—BEÃó* fø«aUƒiæz†ê5@W/&(là.D­²†¯lîT¥gFS£{‹¬u-DMIm­yTE‰·‚RÓ,TˆnõlE_Ö«ð·X!‰½ö¨yÏÙ³ ¦|®¥ðb¡àwgWRvöÿHG¤…±ë·9F婱‹(OŽ oËÈó®Ñ--:X6¢ nÌ#“v#Ò£¬XŒƒ×“+p9R'u&½±·¨níf±èaØë÷YµK!çÅ딳ʟJ4ÏN‡ŸB 7Õ ëèÔ$:Á5b’ti|­” ÿ\e¡1Ù±Š´ A+ς«å}v•5:¹õOö«%ǒÜîûujëG}Ö>‚P00ÀÔxá¹?`F™™¯« ØÃÞT)^fJ”DFk%çY°y="J*Y9-Ou$‚S³Xé&o, Ë÷êwšÅ –8ä #!ˆN êûJ Zo÷C{ÉGuid#j;ªb2Š +a³±Ñ ÖÝÊA¸³…joêq”Î3%¨¥ú¯ ‰0¨¬*O¢ê©MgT[ӄOº’‰g3Rz@8pe§±ÿŒÜH”²+8ƒ4wʂ˜Äe}K'©šó\ó {þk +lðÔs’²·Sg⮁Œ½ß¨Lç{†c }‘¿ ¯E©5;T¸tb)?×(‡¿Ô¥5ੈU宅?¾Ýqßoä¾0÷;ÿx•Èå¿®ºÿ=µÿ µ™¿¨6ý¿Ymö¯ªMUûuµYËÍDÒuçHdÕ£q@Íq#òšì¬Šn²eœCÜ•¬ö†–L¥f,h¬]¼Uw¾ZhacÿID %°þÈõ {’”´—ÍYõjV¯ƒóƙ ¶rá Û&áÏËìrÝ#Y ÿD\š›ÔÈ©j‡$CF½[a²«},TÏ©c˜”bñµž rk'â”âÂÔ6J2gZª4¤ëŒlœœ½ø"¡WÍ>Ñæé^x¨+Ù£9òÈÒºâFU"] +[ Óz€¡' ~µÇ³Ù)’ƒÚ°GÍÃ¥7êw$ÉÆ[‡Åw‹Îµ›öð´Cîn°°ÌØ1µÌýÂöúÂEw¥·ïpáðöª$xɐ/^ à›¯kø¡Izdÿbá‚O“žÐ_Þ6½n_4’J‰ÿÌúë×çë¯3=ɕ#ÅQçf¢Ø^F@&mØ<+Á– ây‹¯)ڏ\RÞà0¾>[|¡qN&¤uô‰ȸt¦ŠÖ¿··ß=Ðí)aon}<çÒÇq‚óûqEa³óúË_ÿæûûÓ¯áíϏ|óGDžgl(‹/Øè8Ðpõ¡råKÜw¸²Å_®hõ<$©ð¤Oš°®¼ƒ1KÀ£²r=ëLÃøJWC¤lavâ“wq}ÌH|X/\ò£’Á”2¿4ô¹4óއ„þˆppÕp÷‚àˆø†Cq Ê‰aèeL~ö#6 nËäSE_fh?ֈ;3¯'ؑá,óö<ß¹7ûS•¨ß?•È؞LHÔ>bŠ’€dT!eàF®#´€¹ˆ(u7ãP‹Á‰©ØÙ +ð q6DòÆ+ï×ô?@—*¼7¨D1Õ ($¡1ü@æÉ훶1]÷ã`œ©@ˆè~*ÊyÄH•ˆÊjHW°šaËèœJü—=ö:üL¨(t|8¤Å³8§rö4J?» ¯:ÇAl´ÌSa³b·±Â2‚Ÿw˜›+£!5îšD†Dqᔪ›Ø3,vξÆj#…Üñ0 ¦ÑÀ!’#‡¸0PÑċ´EK¹P-#Æy¤B¾…߆|,vX|ä½Tƒ°¸S²±`7Î3Û}­=t.ðØ®(”¸2ü¾ï!ü(³·©4±£œÔé:<£Ý<²M| +‹>òË`¸OîÝH ˜}u`ÇjcÎ-*)*GÕÅ +unÖ¨Íj_y'|掀—²Lê]™š-Ü4ìL‡[ép˖A/hàâà±Z4Šì{À3b\¹­„v~¢‰-«¾@M<Ê,û†4ž×Òf:Øb´ÑtBÜò4Ÿêq=ÏøG4? w¬õã6íN ÷k0?½OF†ìB¸Hpø=œýÁUÙ© ˜®}'a1wç¾Æ“f^¨2…Ñ8 Ñ òÊüoãÉ>@íä|2š«¦JÜVçì‹4½IÆß1ÆzH(!44x‚»‚#FߊŠßTò$²ÜÞ;CÍ«oª´³3J«”åþ½ÅЃœR !ñ—xQ9“Ó9kAÔàbxQ]¡b/Ið^"›ÕYÈ]ã@0*ÙkÀ’5ÙkVrÀ&›C3ÿñüáxYâkg[OUGË»¸„xûðíxî¤sÎýñ å?˜ïóútrONĹÇy<Ì°âËgØØé#×7 „m£Y¯¨:>°„ÈüJ6ј©1z Ú2¦.¾5&iÓ[Çp«*_ЁñŽ‘t·´;žŸk Q€ ù%ñ@=Ëa„ÊŽ‡dFö1VÕzêÒêö"³Î¶¯3ÑðlÆÉdÁ†˜c/51˜_t|‡,"`ó€ÅÊO|ÕD™íAJÙ{ŽJ9ö ” ¨ÊÊïadâ€Zìk™ÐcßôótZÏ­MmšûMñm8S ”Gµg¿ú0Ýã'‹—[^8ûFrØd=ŒaUâ@Ã+Ì(èžHžGx·´cD‰‚Gv_ék"C&¼×˜*ß~€*ýš_‹—ÿ w€{6ŒLï1±Æ¹yxB~f¾½ádÙb û¬ …ÊBŽ`Ëà6dæÍÍ!†Áßýì\^94A7{ž›3ÑOùí(â­N£nˆ]m¼‰½ê}KÊcKx©žµŸçÈöýusïÝözV"U.†ÖÙ;EÞú_vú;FŽÉv3€l“Z8U#⛪Tzhyäé¬Ó¹ 2‘ϱhæö$2Š>D¡RNÿzF‘ƒ=|9ߙßÈ»êmxf}¯¼ÓÌ8Zü–«º„œG¢˜îgD£Î3EJ³ *¤?› ˜¦{ßÏd»ŠÍŸ^À‚ìÿ_õSõ÷ÿŒê?RÀ¥ò°v;ŸjØ"ËD{xNQz”Ê G ÖjKÔ +?ñŠòÍk³”KèÍW„÷ö„6wdÕ;%»²?ÒÅØEE" ”¨R‘T²’ÒeN)meÞB.Ջœ™€Uf,ôæçç·‘ÄVé6lÔùê6 #´Årܪ`ûr˜& ¶Z£Þûá´Æ½sõSԖšGùGbY¶2©â>=«øhúÂ.OPm†Ö¿ZŽÒ•è+˜ü;¶µ¦(šTÔ)¿U`¶Q&ú}±h‰èï„ ¯²¥„àÞE¢Êªwñ6°#‡0!y;^D¹0„¬ñŽðR õ­Z…Oãà"%^ŽñËMBÏm†U.ö¤KYQjŠ™g8 ñn=ÕtucT'Ø4éàV"')g£›;+AñÁ°‘Ϻ'ʎÜgÔ~Mg~Q9ù>/O@ċ÷åý?ñY;_ Ô ä†Sk š;¾+£1F„GN°3{Y¶áPt s-O¢:¾@-@Kã¯ù+YýZ[ç°°Œ´vÐG®ýÒòøÝÃߘ%®ÿ÷G* çy¬uA{µß– oîç}yÒâUèöJðñͽ_Ükw]jk1÷è"{AWêI¼áJÖb?rº”da…YÅg/:d„¦µ46W +•ТÜC–Ö›345Æì»rl~œË_ÝL¦}0önJÑMw.“uï9ᬺ|ãµröYLsjHa¶|à´Cãsֺƥ†ñ5ßCÏZýÎ| ¦b&o¦ñßwݕŸ2_Q«r#'ƕ­ÆÇ7¡(v£ª‚§òr0¤<´!P@䔍þly ÎÜûœîÇ1W¾åMÇøÏ¿ãqA¢l'»á rc Í+ґ›áìO¢¼Š+ͧ°•çúòF˜×_ΖWÆz»¾]~·ýžZskåëyéϏ1c›wê›/1°Žƒå|êYUõ¯pƪÚ3Hh©øÌ ŒWϯpª1$s“åg4»³ç|ïÙÉQyWâ’éz ý>Û¨¬MBå&8›`ʳbnFY.H«wÿÅ~µ$Y’Û°«ÔÊ¡õ;O‡#f1½ñý&J©÷ª{ºmÏқªÄS¦> žKFÂ`™PÀž‘¥ÄÎ'9tUžo€ïU·BÕð]âîÿØýº>½bÏÚÀ¯B§…ƒZʓ]ͬԾݑè Г8Bã¼}«ªtG{-ç®lo(ʆ\5_!¨TÏøæ‚hÏ|7Ó¹$Š¨8pm€°u«2npB? +ÛôȎõ{®{1¼`Fj“Aº9š¸Ü×ÆU‰ãýî-oêÏF½Ó_)¶E¶ {G‚,ƳµBƒÁ!<ÑE´Á%‚ô]Ù ·ºeÆïSøž•†¨˜Õñ*¬»ºÉhÌ÷¥Ti5€dÂØCNz9ÝÔÅK6Þ C§ÎCö}c¿)#7g#UmO¶P-Ô´‚¼ðÖ×3+8+‹Á0ue'ôSd‡Gl…PŶÿI}§,=o] êãIGZ¸•5Θïkqë™í3g‰òº¸™««ˆts U.9(>Už )ü”ÛìŒÊY^"øžÙæ 8½h¬»uÊýâ\„³2³}y‹¥„ƒºQ\áhC±;²^”¨X^EÉf·_í…­/øÓX¤ÀkòO:C§¡€î= Ï7}îw絉‚è” óõÚÂÜzO[˜ž.óy³{eƦ·H{¶°<'ÎΓI{X¾çOþÅ +È—q{“°ÑÉ"A +½(™•-zÔ`œEµÆ¦*ˆïÚýª•üLRdl&Ïeâ€XÝé¤={y¯Ò¶ü"=x֝ýŠ·É—*­CìA +’6Pµ8çí1¨ö¶?H[ð«/t >!Ÿ¬=_ ÖBë¦ýMH¯ærظµxtv¨' ‘&šPƒV'„úŽOø˜D{܋%°ÞõÙ$N¸/iÿ¾a,_]}Qý^sɸ 1O¥nwé´®œRoDC]K0¢šhö*͸ŸÇÉñ¨»®àBøR†’ìTRP<ì¤Òc¥±&õæU\,ù°=€:ن.ã2ÁœhsQk¬*óIèiM!ž~ ë §³YŸ^z(oŠÖŒm­§"MãÚÕk_€Ù—GÞcN<ÈÒ¥ãu¡D*†í̈™7¥Õ8ŠNÌÞ<ÒÒaØ éèá¿Ã¨6_aH(¬âwÛ0çI“سôM+”þk§ñJN8…ªÞ&¿!Û$`k·–D!U—FVr ~ÆÛ1‡ ãÅP 7<­o$ÃÔêÕAyýã% +_$úðÕ¼Ô~œóWÊ£åõ'å7ôüHyz¥<äÉÎy^ÞÈ*rVn7¬iº{‡Ölߙíòx.;³-?| ”¡”†ûÞàب7ŽÜö ½"OÀqAq¯ºŽ‡Ìc0œÌóßÐ(ä²½ó˜ÒǏÔýÒYa¢Ú€±š×sîïh¯Pk{äÖYϳ4•gñÂRèt–ç^ü”·ÿÝò^•'@u[߽ĆÙè°?EM@Òu´ äÅ ˆz‘=„Ü@uF¸ÒAªÝ“™%l-þÙS»yöm̾o,Š@à +Z²=As!€;ëkJŠ®)QÈ-*'þ^HëA[•ŽGbœµ +|¨Ñ]¢#²…ƒ`Þ +ûy妧û´¯ÕK ­D"×c¡€úö°¦!+´rÃ`…"½¾YAð ïX$‡¬~X΄j‘’ÊTÝkpß9Ám@OÃþßï äTq*£°Ã3æŠ +Ê6=ÂÍ+ßòäG¬&•e’Âù‚QôÝûKæ(íóWú˜ºò`ø3ÊâÚæ³®ËáÖxÞN×ó—såî9žυÆx« ÉöO‰® W“U ¥Ü?|™´L¯w§`sMå>lÞ¼RXJ"lЛږÅ3óvŒ3¤“Ç7A¡´Sªqt¥¦  n~ÆÒþ$XF‡ +Uð—4sºÄ¦sÑ|zþå)$ŽóOÊÇvWßÂg}òרe獚÷¾¤N|=½Ÿm½—f®Ò|üº_ÿni¶Ÿ•fùIiŽ»4Ëz­ÍrצýEmÖÿ½6s… <4õq¿ý¯r¸aÿ}pîï×/^(ˆåô¬×p~`_¿.¯š~½áÊ£õg‚ µ‚>Ø¿wϝzíYB_ìMì7ž]k†×S !®t°)jª³¼ì®³ÓbmÂ?ÕÊ»ÊuöÂñŒ)5â«jë‘2³©ï¨ýTÛÓ °ÐL=©"wã šº¤çúðfôýÈ2ö~¯n¶– ¸¿’V@ÒPoy¿evJ«²ÅRÍ{k7^QG‰Ëµ\/4Õêw( 5Ñ 4 úy ÅœÞ×:k»°ä,íRxŒ†ú^Yuy "m¤µÍ|‚­Ñl—š/ë|øþ¯JOö£Ðô¶J™R‚ˆ"^ñfÀ)ïòÇ«Q¼—¤öi/„‚oñè·/ÝÚ]·úß'§˜£œ1ñŒtÔFEÁ[”²ÍIèÏ@îZ%i!#„­ù–Š¼0¥Ï1û‚¤?¨Y ¼RNš +1­,k4Ĭ)ñS´fWöÇ»þóà¼}å AÅKëR£ ÁÔ|ò£~‚uŒG2t;#‘‹®ÏJþ8‰Z—ÄäétÖó3A ÷Oe«Ã@ÜɂuŒQ%œÞÉ&f¦ºK¶å + ÿ”G}æëâÑó‹hÐáíaÉæÑ÷[¿x´ùUÎy½fµÎ½~! ž ‚%χGÏ&âkלáío<Úª'Ìø¶*>8muøùÝV¯æ™ÓÁI¿‘q·´Sìr~¦[õŒ@=-›o¾¨­˜_«dÁ_±H éч¢§vF8–àúëìçHE~L±æ¤_ÉK-•†æعÔêB ,"¸ŸE“œ¥r߻ܗßTë;o>Œš2JĬÎöuaÓç§ëP×è!,?髇|VÎD¥5oôij!Úò%>Ö7C¡¸ÆV’‰’ÛÙÎ]0JÀkB“;}¾>có3 Ë.”—ÿsôÿ£M±[%/àèœÒCRê»™€ñÁ€jƒØÑøÝäq©š*TbÁB`àӍ%Ø"qKR÷ƹ5‰»î_zŒÙlÖíJ:m- !&å’*1‹¤t2–=¼µÀû‹³¬`ƒlâ;4ú©T™Yv2{!˜ŸQ*QÖ2¶ù6]q‰HÙCY·":l]ú̙ͧfZ–ˆ¡ç#MK4hæ߉ús½Qe†#Mé¾0ëfŒIxà(‘M'ùÍz_?Ð\²¥t^¡J3Ššã¤ÊN鉨ä7a[OXeJu˜nð0<^Þ¬QêIŒtÉ4€ònÜ}¶ RѺšSÉÇä´#¿þ„Éfš’l¬õ-bé&ڃÿ½¿¬Ìâ³hõæYyP[þ­c„âµ]Àµ/ÐûËuªÏºE\ù°¼BbÙ M¾7«ÈlÝî!!æFð6C]Ô¸™Äz<¥€ø8¹JB³hØçÕمd÷¦VkL³ÕN!Pu­1ÅÂßäX©h´éG@όB>3^i,‘½ AîS,QF$ËÄKnÜ%ُ¸.”¾ù§œxvQw§°Ó«{Vè@UߔÅö¯¡ùD¾5 _ ÍîáÇgjoðeE­­ô©ªzµã vd«ùpu)óà`M¦z-S\ÿf-ñå#ð©q“é晩äoÕ+’µfB|Eï™ÔÄ dIz‰†E‡çQ#îlh»¥ì¦Î‡8D4 Þ@%vœ9Û9ó{Ö/ÅI„ ™A9åèhÉ~®L9’Leå Ék_ÞÌèx̆ä+ šþz³i›´€ÓF¾!³Ú̓kàX MÕmõ}Íì[øIC6֏äi×)P9Ü×÷kgŠ1v-5&Ü7sîiޟ¿Ãœ6™Û¼˜óÂà?,3¸qCQ̋9 ¯}Í.{ŸkåAb¸ ƒÿ®•àÆk_1çuªÏºE¾òfï“9÷¶Ø°Žˆ7]÷®”Á˜ôDŒàåï5¸‰xV&ˆ>;êU¹È!j$āHJ\âcÕCŽ”ŽYËWhï}A>ðQ#b²(Pê:ºIÈ,U€¤‚÷jõz;)]ÃïŸÝîjZ®ç<;QЈždUð“п‡ þ ~J|4ËîןoOXkCˆ ±‡‰èñ÷=î*P—°¢j!>ш4í†.>¶"ŒoN…Eëæ˜×§›ÚÄäÚÌqÄæ†@uMȁu‘e\&4 +_m"n´¯ÉôY/Llç› ÖlÔŸö·Ôklbíͺ™ÐMnvž<,Öäû’M•­V{4a Y»ËW6eͨ}çpM{¯í/+2ÈcT+_Â9ö@»9cø–0N·7Iõ‚ŸµZ‚Ž=ñÊPiu=35-”ñžK¹Úl{†šøŒsâ#V $}„!l_lwŠѪ9ösÄÔÀaŽS,:”ïÚjsŽ'[ ù×Ø)ù×òpHù§5&&Y“´ÍJíÌÌ,õ˜FÀ[xFcNÇDz°ës½¯V*Z¡w»}ùL¢ºš×Œ&î[U£YXÝàl¬½¥Ãµ だ¾lj1æ«Shf«[ ù´;ÆYy·Eíu+6V§Ô¶(@_7»xn²ušØpÖ0Ňø$)Ë3w¤3•ôeUˆ~ ¼žÁ*Õ\cÌTË£)ÜFºž‡K¤óÎóiRš>ºÄL¾€}ܳ¾ôRj"DyvL¦`Q_Ä°Y¥Ù¤8ÓS`ÌeøÞ­'* + ³X-/¶®ÛÈ¿¬˜SXê' •àe']i¿V–dT]QÀ/OÄCbQuá ËbBͶ¨%µ*ʖZ. Œ4½فøÊTÎêž.dNøýÝ´çŒþÑæ=ú.͖‚­yŸŸ{ŸèWj +™ÿ +_¬0 ö¤&í3îUÀcΚ«Éde#_ÉdEaÄvÝ豄ãX5#Õ:Œ·eeêq4S2ÚÑ]é÷š õ<¹’hË¿Uýi¥ÁæWoªï/ã4 íܾÀ8Ü¡/Lc?½h¿N—Z,å짟D×é!Ñ­°LcäyÚÏúRÓ܌`AN#w:(k*rk^n$°/·ÆhjÒj ¦ÙÎåÌÚRó…)ªÒÌۙRÐî§k.Ô3®aÁF"Å«ú0(S{9Y'ðþââsFNV1 É0†{E4¡“3=÷M¤eËT-Á¯ï¼.#;2c=;vóqö`ÂÒ^Äb²,óïü@xÞd,îªúÝ]¹ì@¼uŠÏʍÁ›w¡c…Yø'ôÐþ°6¶¿^÷ÖÆþ·jã¸×Æö¬íSfY–Æ´4¦¸kïq<£íFê‚ëBX™ÙƒR;¶qA´ŸT-“u}ŒÝ@zkÙ=ô¼jæ¾yklÇÆÇé~¿õùÑY4 øn´l-̽7‡Ö‚jP›ø¼â¢Üúë!&>Ç^ÅÇ ÿՆ#«ª«¼*Oc̖K@w)dX<£’ˆ· ©ó+Q[`™ŽÒ¬¦d2Í?`d²X°ŽÁÆHûâc9Ëp$Ño È@² µê3Déý–ÝW}Cê(=²ÁãÖÂÔêkÌð›1£jn夛‘M\ „’‘ye»Je\“<ØÐê¿ÝžÚ«¾Q9íZƒlHvZ¬($°O´p/Wk–ëÖ”gsíp1&JG6·im‚]¥!L÷ë#]~ý ÓÓ¢5ã½1,Xn?°¾Lr$ ÙҖ³Y»·T×l/×ʃ°1¿u\ÌQ·•ÉÛmãD=w;—ó—U\ý´7½%Â~Û6W®¢–3`¿Ã¥­¦Hòárö1£o/GҚ‘.E½¨ôŒÃKCÌV¾@˛ ŠËõ#(V:êB‚â¨eÔ%(ÚSPü;šª´±@©æ¾ÑúSQ´R©["Í³ûŽè­8 +`P—RN™/ìŸl«4%6eRG¦ˆE JàG| ŠQ&ظr}¦Êä¢ÌP ]J2TŠYI·E;ÕBü‡ýjɑ+Gbû9…/†þŸó腽™û/&HF¼§Ì,Ã=íÍðªÄ’RÒ EŒ‘ûí àÏ?T¡˜Z¼ænDP1ÛbyËí{Œ?ÂQ &u°ã¨Â;Îè¥7¤¥×ÀcžqN½ÆRïG—ÜÐmæ!ç +}l҇ZDa\lÑ_h›Ò–†ï¡6*1Ü ‘ß?{ °»Ì¬"‘œŠ¿\ )†\0w’NVß2°°ºØSüJŽéĺºLäÀù }ªl²]ˆw¡ðYÛ¿-½;Mõ–“Çø\aÒd¥Ígr?ބzá™XäHÎW§pÖ£ææý)†oÏØ>嗆ÐQދòa¬)µ¯¾#ޒ_eyË XM¶‡+xX +-šK¬ƒÕ[ðáH¢À@.4ZJWÝÁ: µãM9¯M÷¼ïÐÔRÅŒJ¿—Ò8Ç&½ôûf^zåÉÝ`sdKòÍ9è O”w›ºÌ÷)´J£%s0£$èJj Ò¥ú8-•ûÉRôĆC‚êì'ۚ6L…ú3ð)&ÝgäáĄ|nóâ,ä»g„u±–o“ÖÍ[þ''ßïb.?ÌqŠy¿et5/çC‘õ£¦Ëw º~¨h×ÃӔ©Æu!¯nþ»Åõ‚úü¤˜Õ%â—q»×ò™Ö›Ì<þžFÏ]N8[}ïRòÑ¥ä§.%ÿ Kg—Ò¼Gig"P–›[O=Êb" ‘Ö?ïQ$6ÖLüÊõ4ñôÅ»ÈZ¾\ñPÅdò7Ç|—”¦Ï 80“÷ +`‹»¿ß`ˆ’³¨Â:D±ÌK!&Îõ5½.­Ý٘ÙËaëïÁ®JŸ× 7þA +pãi1ô9¥€l“D$@ª‡³Wa®¿®|õJÏèMT³‘Ö*Õ/L¤I¢‡ú#Üd‰SÒR©…5P«0§OD^ "ûò´$Íùk¶T³nKó¾{î}ØRµV@8)pa·ryöB£Ó”ç˜5‡—5’Ïw­Ø®YG‹èãp¹#±»DäÊå:Ëm_w½\nûZ/W‹ nu>€•^G&W×erގZø +Ã`„Á®÷þ™†ôÉ`ïÃ`ËmÿŠÁÞ¦V=m–öù?©J]èe;Uƨ—ŠZ÷0·æ +£¼h’ŸåY✣übe¡ŠYû„Ôâ—)¤h*“ +JVÈݘmMq€GItò2\‰òQ;Ë'TnÊ= +M€f¹ás…ÅWdb +Ã+bà:yb‰àÀSûöå0‚UÆC_#€‹dfP¢?Q[‘¿¤'b†í.†À˝Ð9!­'R ¼9n2S¶[Õ.Q•Fñ# B1«8U1~å…ÝÌ-Y“ñG +_â2¿ö9øÓöä²Çm6Rœû†–T™Ò—Â`¶qÃËZÏ%3 +–Ó¢‰‰Ü¨ò´s^÷±Fcq,`,N÷ðõ“r_{ûŒe¿eÿ0–ýÉXöOŒeN­=^kxZ\1UM:Š)͂$)Ö(Nƒ—* U—â*NŽVÐ[–-Pƒ…ýw~ǖqöß®õ¯¸ݔwü~Å×z Dnï´<õ×ùŽAùÆöý]¬'ºG `j.÷“Â(g<0QŠþ-½ó°U% +(ù9¿»Z·9@9}0 [öp etÜç¬ý¬+~%ài‰!¤2çÒ_¨¾Ÿ#¹Êqͦø‘ç·y +E&††™ /2ˌlóºoÀ !Ÿ‚‘=üG{~ïqh2åÖn©ræõ„TaõžÕ%â—q»·üΠιüš\ë°‘å– ØœÛFÎŽP^\¾ÏÇáûÞnk¶òÃ|„ùrU–ùZi>›¯Ëªÿ‘ùÊŒɤùX¨`{¨ö-€ÿù·­9[¦9Ózø3[|‡> XɈ˜ÜÆò-ˆP³‡dÊÚên›akýUëd{ +~ ˜xՇ¡Uf¾câÊƕ¢{!¹šd ïóe/&?Ò»„†¤—øˆ“"PÕHsØ/±‘Ú‹BIãÛD±ôN®SHºZIeÏ:vXBº¿Q”ϱÐ7²X­||iýç&×ãA8þ:%’+Óá—CC£Èœ̝¦P2SV9±—_É1é´oI“sÉ¢qËnùF $åLóšEv‰,6ê'M¦ü2˜+¬#>|ڔ¼x!¼#!ç@|Ò7”±û—ç¾±D5S™×çÍ&()1³)´D2D}ˆŒàôYW6™ +ÞmS.òB(é$5–ù¦æö}©Ææd‰ÊC-¿RáÈcë„þRÀf”'ÿŒ/OoŒùlé±o¹tþg1q‡ž‰W'„¼8üàzØÚctsþžy©¡îҏL£ÜÕ.nº2°ðcb?¡BñAŠ‚Á Ù¹Ÿ“ +³ æ:Û+>A9ÄI€·²7YˋWc×ÁµÂQfZ.ÙLÝðò &¹„äÈPe¶2²µof5æ†×Ü­ªâÀ‚m]¾1³¯»L$x6P +÷˜>Ö6mO +ëêû©¯gØ*èfuÏƑ. é³`M°Ó )õ2`¼óʂãÖ«Ë4èo ã¬l{cŠvç¶j/µŽ‘íµÊ"lÆ\̑ãˌ¼|[‘Q›„ð)lêB +…~¡î9@¡Ÿdôq’îá›Þ÷mõÔûŸ¤ÿ͓~ØVËr"QÉë÷;ï%žÏHþ0·¶æ#½“P@ò?‚Vá͞ÔÍuXÒ8­Úõê ò‚}ÁÎO°3ïVõB‘ è:€Õn3%ÌÝlx ø˜¬ŸöXt»¼ÝþoµSs—³ +8™Ò!‰°@ÑNQ¯vJ +w5Z m,|×D…U[9Ûdý;¥ÒÖÃeêP?€_U* ÝgªÛKën˜P +?o˜ŽÀL”€ÅíÐě?1ŒÁ·I3ëÉÛñ!ëæÖ<­0†Ñ\»Ÿßlµ@,´Ë5+³ê¿Ôû=¢×±eßy¹*,ÐÆÒà¨"Õ°ÕÎÞ/ە­˜2ï/"@6Cúœ½KaƊڪw[CW@šˆ0td°M¿ÂªSϋkð5¸H¶¯Jî˜Çn>•ë˜Oð1H/ôº',U ÜL놏‹ 'Óc;—I*šjˆA·î³WõŽY¾œ1~«˜Yq…ÆÄh¸þ‘ÝBÞ/:yF`B“å‚(텛ÒÚ®j§+5*Y×àš÷Ü,÷xé«]HX­pjærýfò7}Ì| å炘?£¸tð[«ùÅOÀG‡Þ=·LtR¨_ ôQt÷Žv+çÒ'ØMÖ*A™¿¢Ÿª¼9ÛUQÉéç7Ú:).àZ j)m(ÙEd9_‡OYŽ,"b¨Öb¬òb/˜ŽÆÏ~ÕÊ´Xß@¯Y¢0j®4€© +‚‰ô +ò7¢Šþì ¥yYV¤`Ï;Íí>IEHºÉµG KF½æ`vüʁ—  }!‰å¾ªÍl˜ =pŠ%o¶:êÝügæ«:J$áÂþgy%툗,r9À¤sôZ±ÚÞkivÈßlÍåvЇ2ånxd•‡r4ÜÕ6«8Ñ?¾²Yݗ 5GüÊtÏú‡ÈkŸß(Ðñ0ß\݊f•‘¼h.S¤æ¿uë]Dkü'“§nB®Ø90¹·ëý@;¬rÒ"=¢ôp‚°#5Ä8Ñbã#û íº#y46ynrb©EÒªˆš"*AÊ ùM®Éÿ²_-¹•Ý:pÞ«¸°¡ÿg=oОdÿƒ°ª(ëN^74âÀ[uõ9E‹†Å©{ª®Ôf7ˆ‹‹7>úý7L÷6YkJC¯tüЍ5±½ÂQµ[.ðõ‹Áì…J“µækçq2W¯’=ʱ9‹_G}ýr|˜Ó—YÜ|7W=˜t@fÕÿDýIQÒ?ZZÃç&ëOj¡ÜõwÞ/=çTŠÕr‰þ©N‡™f‰ [Õüï˽«|[ØÎêv'{•«œUŠ#Aèã[|×ec¥Þ|Ô°0«ËAÄ1…šä0™²N&;ô¹—]ͪfEê8ö9}ÏJTb ),tU®&Úâ\b|P+£+dyêKº´i«ÔE7I_á¬{-ªnß|¨,oÓÂãϳܦØW–? W±=í,ïÎW–wÝãš,ùÊò*¨Çf¤ñu´²üø0~8ÌÂæ'³ïYÞAãà€Ô,ÎvѾˆ|…pG*7FJ`ÔåƒxF ‘Ç)+ÝÑr5$š¶5Æ{cÞ •¼PX3Ó@892ؤ%~r{ñ¶Œí[æéÐh™d…Ùy>1î„$/2›7D ¥µC²jÅ8H™T”3s‡35ð¶#û˜VÖè}/fè£Æ±SE-”˜žP(<œÔ¦FöMYN‘rh'0- ^ô¸‰jðº­-@«J^ÐK(®ïõHÝ"£=~§¸<É*,uIáê@>QœŽk‹—ÓäFâix!‹º@Ìý)Ömj(k(kgXbj7²o 9ƒD¶’O°²'‘¤ù±2wæ°H¬Š9 Á"Ð|.Q¶Úñu+GPEs=gœ!MnS´…A2C0[ðˆþpFe(ŽµJb¼×-½®z’—Œ¦œëñ“ú”0¶ØÛðeto[–nýVúnB.µï³ò#üÞÓãôñs\ ô4å?Qù]ç9qióögåÿ€•ÿxƄ6)‘ 2÷xÆjlSíwëÊ®ÚC­ãªÝ3yðñ*ûÚ.벞¡Š€¥H±¹‹@y͛ôaàLmÁÌÈU 0?÷qՇWÁi±¼ƒ«þ¬ú“¯óý Ïú3ú£bôwêO Íû™Ç:c„Òø”_?þÑÒ¾‡jáßMî¦[ø'¶[|Aõc7˜Ù]RhG6`ÅQ}¤>vU¿£µr7nZŸÐÊ;òx? *·‡%¸9]Ý »r»æ\S vN+ƒË(ÔhÂõÉ첿ƒQšÕJͶünH©Ðgü®Tˆ i2 +ϖ#Ú­íddmÇû¹t)E½û»¼úŒ½µfd'Â4¶Õ©˝ß…¼ÃÖÃõ©>•ëŸq}Ì lDWõŒ÷zKXP÷3F‡ÙõûûŽå¬íþµ/§ÛÕÝiº Sºù\ÈÁÂ؏œǽ ðTÍ4ê´þ:[©Oü.-Ù̕QuܞŠ BêsÍ%h…‹µ‚ … ¬ò-/Ø×yŽÄ£z7à°6)lŒâr/ + m·Ü ñ`—¶Nà`|ÁÀuÚ¤qÈ / ügó„x®õY±v.ëÞÇw³²§ø!îí3Ü»`Wv"§,ÛŽàšÅ½îµÅÊÌ ¸/±4€‰WM•½ÂtÒSÈ- Ë.`•ÂŽy`Wr™“Z]¢¬…q±+ªéO±kFâçøé˜wŽi&’fýª«<©®ò©º~@u•›êÚ>|—ùÅVe#¼cÈgeã;ŠêsÅ;ÂL„Jȏe3ŒW£Ôdzæ'ÚÂ2– YD²=1=;Ÿ­«ÖõL{‡Þ²¨àŒõšU 0ù6¢È.¾Ååþ†s{tį@~H7æy”`áe0a›…p a8Ò+D¯d;=KWxâƒðnAWy!9LÑÂÙ$‰77Kòå4{Ô֖ýÈȐ‘ë]~—¡Åغ蓺ž3^'5î'u}lꚦi'Þ±YBö3¾¥BÑ< Š=èÍ fƒ;£†h SVçøPº™kÛØcø‹€d¿Å6¸#ü­ÎzôÄ=æDŽæÃ'×}"VY~òôЋ FGåïã{¡­ûvÄLãx˜±ÙRwÈ*ÍìjsfLM¬«·ÙÇ´²FG«¤Ô%öÖ¹H(MÜMÞa+V¹òóY„ Vw‡ph'0\ ^ô¸[ƒÁ붶­Ý:‹"ñ¿ß’U“¬©ÇÏ,þàY\‡½ôøÁÖ£±‡ÝejÁ1”¼ œÓU¦ðÆ«LY\Ïá(«îÚAe•ÆVÂU=”²ÏÐnvËàÞ(MoðÞC<€*–ãž ,‘óv±Ðãϱfvf{è’úk¨éþÒ=|A¥ð fÜ"s¶8BI´Î×=l†ÜÑZ¹sý@ëZyGï¬MšÌ¡ØÛtW®×\+ êIF”éŽÀX7Á’Êg÷ÛßÁ(Íí«¥3€š*ËÔ\,n{Syèª+üdö†H¨y=!´æfð^#±õ©zZ¨GêÏ®Y¿H±ßâã¼#íú|·h|;pvi¬«€¨.¶Gßë¸õ¨ í‡MþOå0ë"ÔeïãCˆ¢Tª/Ô+µ| \º09í%­ YÅwÐ5¦…<(8TΙ·(Ùü£ +±ªkzÒçƒg·­e€8W;5Ûpôm#tr,áD©!H¢–ºÃeŽÆ/ZÌ,\´•Þ1a ¤óXÒ¬ë·Rø#{R¹O:Nzi÷uº¯Õz ¹DJÐ"=¼ôâ aŸÔýDù)ŒKÖ š¹#x46-^Ôㆲ‚VIT¨Þ_¼ï(®ìiɞô0,vH}܃ôY-ã}«øӊ(u<‰Þ$®«½Ðtp“ÚéÈÈhö¹ô*=ìaÍ{%7åbKÆ`¤»(¦ç²½gn¿|I·Õ™ŒãRœppli’›ž~ÍI¢u}§GÙ5©r]7>aónu ùsC‰Q!Ä¥&!†ùP0À¯vf¯«'‘ GR»Òm‹3‹”„gŒÇ| w‰ù€äë ÏHÝá‰wolµ·›`*qüÿÚÛg:kï‚]’)©º´«öB®ÚkÉñªÊ(Œ˜ßX5Ջj¬QՕ¸·woÑ@MÅ»’:0@³§K„qU×E4?Z]k†JDìs-ŠÑûp>«‰ +lê>‡VÜCD£º§<‘ípå↩ñbPLi÷æâ5”µsÇug¥¶eo y¦ ÝÂʞąp­EF%šÚ‚œŽ’¼V°C?>—˜ßv|ݕíVsþgT–VÆNìŒ2(m£(µ¸ ‰¡8 +ä6‹ÌY|ù)=Q^eWB¼AÑN c‡ _v“ëß[Tñ}é[´\êÀgåGø½§Çéãç|©&º’îåË¿\«þº²ƒ,}‘M#Z®ÞúÇ¢8‚Û`Ø(m±‹É£­Wþ`¿Zr+ɍà¾O¡ ¼ÿŸófáÞøþ gDdV±$ ì<‹6´‘Å*2™Á±ºYš>Æ 8ÛÄLŽ¾‚p¦&šIñ~½ÿ +¹Ni×ì•Dw3©Ôczõ¯€ª”wCÆ×Ít*u;à‹Qƒ>§хɥÚY'KÔ~G#†ÝžÊ—}"¯Xæýz /Šö¨‰¦¨ÖªxŠhÜÅêouÕs:"²ôY\­YÀvÁ'Ó +ÃXÍ æížõøž37Bs¤†fفÞñð®óšöñr/½¡œäñ¬æ±Nôx·¬êñiŸùêsãOŸ:QVñßIü’ÄÇÕ››J· àCéJ\´ ¥ëö HÎê–ÄÜ>g­¤M»Qäšþ¤d#({è­SZS“ˆo/Mc†‰C¤KÕǯ Ɛ‹sgwÍ Wx°JRÕz[½˜í»+?[š²‘ì€Ù{稁¸t÷˜…éà lº±4]_KuOٜuƒi3Ϫn¤ uÙ©,?ÛÃ9}…³5ëaø÷ˆá§kœ&È Ú¿›ó_hÎ kkZî&†J{ò¬ ïoH°°’ÅX­쑚#ËûÚ\WÑ?Q< ý~÷˜ÆŒºbŒ›¿JhòRÑç-”:.õÉò§6?¤œËñ-ŽóRcIÌêì÷¥BLÑìÕ>vm=7òßõÜéié=7àT!!ým7ãî¹C§gϵý×|Íl¦4n«P`¯J¥-µÓx÷«³°kC,ç(LE5m¬*Òxª‘9% Òº»jÝû/u՜,Eéÿ[Sþƚ2§½Ú¾¹,¬{¬ ”ƒ7!©U|ª#DëæÖ|J|–²Syæ&oÄ°l±ÐðޔZ¬t?gäƒF²úȃ‹Zg‡‚f%?(~¨ W'ÕåW—r&À܃~õ¹Bcf¯W"¢9É4r r±˜o0Žiñžq¯F•ÊŒÍ6ðî]JE)°›3?¥Z#/ìž]ät¿˜ÖÃ0¾®Üõþ홧ÛæÄC€rbVq|‰¤ÏJŒlÍs21V¶z~(¦àÆ èWÁxå§j#³Ë‘Vä4}ÆbQ1“÷ +®Õ¡Ö AÄ9T%e^g-E€³W<Æ"‡Ïzð=ë\€-T¹T¨Ššò¦Âšy/P™ç}}ÍDɪÐKr‹z{ç”°X´?ZtÀªü…ô¶Ýø½¶Û» )æãÄ0-©=Ú@ŸTžm<¼Š¹ÙYúámO„nû„…)ޛB¥ØTÕ*0œ797Ë=¦£>Âc<ž–‡äÔÌåZ3¹fÐU¨$碑}yàNÉ<ð$wŸš¢®*òf]ƒ|Päþusól-Îâ¦%4\íhGƒ×ASZ®YÛ~j±2W!aìåÅ9XTU¸ØÁNØå,¢0åCgˆ ò­ƒdîa¿  d“h]ÁsLȎ>œ. ߢ£öO‹,a-•‚Ó0úv¡D*(T÷Éia²Íy—"[Îü€E2 ­‹K/øºtÔë_ôØæÕãïfê³WUŽYÞÎN ¸J +I½´'…À(prXÉbÜt¦uhŽà @×U&OO^–ã@ñ‰ ­¹º<`§à2„›‰“=Ry“µØUc®Ë,,Þΐp“†g%F—…©!Õµy³KUZ²_0ɕä£úrïl¯îoÂHöÿëœô?Ûf ÁÏ_¦¹ ¾Áv¼¬‡wƒ€¶qû¡<¦Ñ»ïÕ7Æûõ|üRz~;Ö'3šçûßœÐ÷õ‚çpð#·†E>yníaíìidċ#C,qIcÌD4¬ÎIQ^öÀùÕ&/yÉñÝ"H†A:ƒ~09™î››ó¡­.s(4{qñF)jr`Hy,ÒXºÚËÔ=ÿ™FߞÒBä7ßD¬ŒÝ}ªßaER-}=ËêcrqRÁ¨aæeè”í0DXÁ¡a‰=Œ¤Æìì{9ªæ‰tœc±íû‡anmDúhåwµ9ˆ)õƄ¦¾TÔ¬ã|́:·ª?J*“Tß<*Ìvÿø¶fi³§1Sª_d¦®pç¸öL·^è,„ÌΣa”RØ¥&Ú½´‘"Õ2é¬Ðá(«åo#áeõ„B#Ý5ölº“=‡žE6k‹Wª[4s ¨›sÃqõµJShy%/²¸ÍÝäT6ŽÞ֕«öS¿35EI–¨#äèWº£mx.ûŸÊï$;Ö·êø[U‡©Ñ^Œ«Zÿ™´æ.'iœêæ…~6›´ M‚´œêƒÎ:öƒÚ±‹ÙÈ-\*žBÂãÜlÿ«KÌ7”ìœ91ÄzõßìWKŽÉÛë}òÿ9ÏÀ€=ßá Q•õÔ2ƶ ÌØÚt'_få7‚dÙò´ íg*Óºi©îý/ÑRŸv‘v –0"µÁÔrm‚2zg¦–Ü0ö6ÏÙn½’-'q ^lÐ7È[Úª]öÜ%²“K+3a•àîÊ)$(‘D‹_Á’¼Žq˜;ãSªWV]rK¡3ݕ܃ýn)ebD±¾QIÈÓ¼zU„‘¶ðÖðŸæPÞ²¯0Ûôp…2瓧" `΁Ä8Z…½~kîwøÞæ{¬Z5Ÿ•¦±ž1ÆõŒ¸˜9„bLrTdyOª¹„-ÅJò.ŽVÐ ±ÜóG¼Òw¸P+>®ñ¯Øü½>5¼âk¼Ý „åKöîñ×úŽå/lçï3<¶Ýo à@ó¯>5£€ÁdF‡Âè5ƒùªSØ+¥ø,g´É(.N”È`Gm±ÛSѧ<¨» ³HŠ¡„|•=À-΂OßDÚ×jVm­ú‚\3hˆôxìÌøUÝ;)f֜U~ÐBˆ—G»kj!HMmÞý¹Pn³[´C¨ôä¸7tõënžOÓö ‘oölM´Yñ`CÌ]™¼‰¡qõÍr·—g…ˆ„'Âh7©áã›ÉoP: 8Ê°/òûÓóN£y”¦?í¼õ'ŸwŠ-މ7Ù¸%Èý8/… çÍô"IÚT´m,‹U²»òIuè FP8R¹&**oÐûÊe ólz(8N NÓ35wÂÁօ4SeI³×ôñEÜÏaFõeúׅ£yáuñ[¬YMoŽ l…‰§Eí)KJì›PZT7©ÏyªÏOov„AÿcŽçW™æ·¶ìézË?(ӒòjäáEÌC›W=qš;ú + ûr9ËK*ozMåŸxáäó]U•/æ8ÅG^R@pºT^M’6%<³êEŸ1JÉw9$ÁÄqQ}¢í%Ÿ6äVŠÿTyÅö¢,ó•¢W›ˆ/cw¯¹:Í3n8õҞz‰z•™;TgœÐÆ'égÊȱÔWÙ{Îu‘äÅHY„'Š%B¡Oä󀝦(7mkö’%oÅcwŸSôb™DQ!“¤Ίì3š\RZUî€éß/˜Ââ|–ûk›[œüºãÿÞïnú•Æ_‡)ÚÍíÏÀíÁí³+^_×îÿ¡„©×%,ïKÂàvn 㑈ìÎU%– +ña1kQÐ 5ÌÄ!úìÙsè^³ƒÔkºnâә +ïâŠèíPD‡!EöUÙßA)¢)b³‚£†êµ¯5߂h{*# ùê)…ŒœëD‡·úŽÜ¾ƒ!Æ!ÆõžÿÊ·[Œ÷!Æ9ÿ{bœíµsYñêoñÿ›õ[­8kÝ6†EÃùË´”ä =¯NX©8„¿q…Nktõ¿|}L¯áþC±Yϯ“9Ÿsz`}ëkĽ?Íð<âþŽúl¿/j>ëI/^ÁíÁ‚1±RLâKXá¾³šˆëRåàìåú`)ËzQíAÓ,”=øx´6üE”Ú_Õ +›³1Ê78KF~¥!ËfÎ>ädíÆ=moc½4¢ÇÖÎèl/Û¬¥X]Ú¿ŽÒÓf®˜moŒë‰§]ÕÛÜeώBÎxG:T¬Ždã7Nu0ÿN!€.ÙäÌM-x©ÎbaÓf¨bƒÄ4Ä à ÷Å㎀»’FŠ¸T‚}¦*öVXõJY©³Ì§tã‡[HO„B`œ:ºxri=IûP ¥-…Û÷ªc3<¦'òVÆjv£«¾ g4÷P·²ª{ü2Oˆ+~—‡Ï*FíÂÛ­ÏC××¼-QûA±™Yiþʘÿ¿Œ)v ӂ§%HDj/FLòØ&Þp%wfLTÌz_¡d&©¾)_)\ñlSڒþ=d£ßÉ-¯c÷;×v—‡Ê; ÙØQr´Ýû2ÄsÇ3¸›*ëV*Ž%5dN€?€ñæðQ‰³Wán”õˆG2ˆi^½H ‚ Ko`rï+ p–ôÈæLê…kb#ùZ­Â^¿5w +;Ô;æ2ìFƏÅÞúqŒCì_(ט¡îKÌ ¶Þ±·†÷þÕÖãóÀ.÷Ç/Tëcªù±‚ëý±…[ŒÎC¼è}YÆôý¶Xë‚b-Wû47IDí!«6Í,oJUúôÄtb“짢¿KT5œm@‹ ‹!©Åçq ²ÏWßõŧÛm_ǜ“œ6{).u҄dkó£ ’­;;‚f àè–hxњUlŠÕޛ:>êfæê„}™†·åð‹#{ûÔ\;ÕVâ˜@0 àŒä)he¯¨ dĞFA[™ßä©ó, I[õ˜24^þ +í`}ñ˜›\5q3Zd{(ºÜø§Õ Où*Vþy‰:w9KԀSYX¶ `F©DEŽGMi{¨ùêÙT™Þ)Q\p^ŒÚҋÆ4ZªVkÃKÍé2º0uðUñ"²  *yGZwéú¥[³àéíÇlnýÙ¬ÆÁæÇ/¤cÌ0¯Z °íz°¹ý0S>û׏Ï;›¿‹ ÈÕÇ +ÎæÇbDl1f8ñÂæmÙ»¨z[F;O6o¼,§ÐFBù*!ÏÌÞö»£z,+zò^2‹L¹ÆFrÕV< Iz™;MÀ*wïe x¸Ù—dï–^¥ÿJöoß]ŒeB/ù—ÿ+ZðãüZá3ÄÖÃ$MÕnmÒåU^tR³Äõê+¬Cý+Úš¸ =풌ŸÏçˆ×Õ48ÅGÉ]WŸ”lòԅR§A£}XKT´K n²èI€?¾3øèLo4ô¢^í}èF§ž‚KV=¸£áO@ؾæÅs‘t›ù_FÎFœ ñ”éîõƒ4û-¿gä¤SËO{×ß\=o27뉓 79³ëx̬¨­íþOT5B¹ê[Ç#sf½XÕ+§zɖË1ü»Ü&Ž\¯‹Ðs äAÁ¦½óž5Ç¢ +±®cH¾¼O^;ö…j!¸kåèãBò„RɶO7ÿ˙Aíw &?r‹‰5+¢%—#lbKêuÊk?Rt}¢>¥0Ò +×7y}CnØю¼N¤À-½»ýu™â=Aãý†¶]¶aa„w¹ø¥¤``¹ë´É>¹Dµ—Ì–ëår_¹–|Drær}5ùU3>Ëòfì !ûôÈÜ4V‘,ÈL¤æÈÎdûÎu*é‰âÉÌây¢Ø"xíŽÜ~Þ`gG@—ˆ»£òPæMbóGs^Nj×GG…ü'ÿ©í‘ۃ¼´o‡€ªòvtýÀ¤¶%ßʳY߃ÏÝ ýO4 j ìZWºín°è·¦õ xÝèpu ŠtzÇâÝÖì°£Ý^ ˆ¥ùtüP,1o/§½îkòñؚó×Áøöóàït²®/7O§=LãžÍØrd¸”%~i 3€È‡œÀ9ÙÌÓ²8§¸ýÄ!ý•Ïê/ç¤&Bæƒ=b¼ää]m<œííB‡‡â³…Ûˆd³ÉO€áïñ’Æ2Û^ºÞñ_Q#éÇ⧴p)ùÍoÆé^ɾÛ÷ÏyUo&;'UˆD|4¯;'q‡áË +¬#š¤Ä®H­¥ÆTû½Á‰ècZŒÅ¿ïŸF»koÁ·¿@«· HøJ0'r%8°påYA¦[åE”I³ïŸ5ev ¿¾mØvù/”–ýJËþgHËþHËþ´ÆDÕYc.SïbÈøıܵ&±¢a¨!\ŸuϚñ÷´ŽVH?±$ƒz”e6ŸX-ÀïçùWl<ÆzÀ‹ˆï+>Ï[rûˆ³[ßxþìïX‚p0|ù añ¶.ћ¤h†ð™cNXíV!&ê?HîGQþ¶Þÿg~ÅxÚÒL¸‡e×=Äjº®o²£”z±®LéaÝâǨêd÷ªN»‚w:»7»õ ûVG&ÞýF®/°Ò³Xȳ ^‚ºWP¯€¨÷Ì9õêýó¬ÑãâÞØ/]Ã×ôœëKŸéi…3R{!ßJ¦o­_ï DÉÝ«}S›º¼}¯”„ÉИsV„+m5m{ˆ:M3è»G›Ëñ{P‘ܸ6?ÎÑû”D΁¤eڅ³5¯¥G _+`!i¯¿g<âǺ+’H1¡/–¥ŠIMÔ?¡í3°ÚdÖñvI$½_NÍ%Êîê-6@­Œ¬â³´´vO£µÆu†j1ßq†¦¶O 7»ûyÁ®ìë ;¶_²CŒEÐ03ÀWî ÷½9²GòeFì”wDH‰QŒÊåÒڐr™Ô¾sÕ@,æÚ®‡K!€¢"Ohἶcgñá=Ôcüòî¤wß ÷ŸôîxðæÝN) tËJ{\ÞzÞÝc®ž¾*1Ù.åÁ§¶®19XYòg–@S @!†Ì?À;k<´óLµi]îœøï¸ó½L:Tx<„÷n`ßÁ1+چÕFÄC“ÉáóZ%n‹‡*fò^àüúC”œIÖ!šeZ +1o–蟳G àc#s™¾ô·€`XeOƒEª[un—+À…§ÅÐç”Ru 8€to¿Ž&•íöT>fã‰à’搁[$;ÚdĒ&›ûÀ*µ™K”"¥¿U6;¹´5•æô‰ÈÃ"²Ï«ÍIUôµ«šõv5ï“Øsï·«]eYà¤Â…QÜÊexئ¦<ǘ9z\ãø|U±úˆåºquñù8Ӑá1ÂHì. yV@°sd˜ë]kt¸&5§ÛÅw+ý}2löÔåÌÌçc/Iá+ÔÖ´5\ÂY?Óž½^‡I¾”{ŸÒÖÞ?_Ú9ûäÊڞ ÿ‡ªÔU½CÏxÛV:8j]Ãܚ+Œ£I~–§‰“ŽHݤš¨á}Fjñf +)šÙûÍoÜ’ÙÒxœr¹®Dù¨õ“J7å•&@Ç*·Î¹ÂêSàî_ÌÀ#tÅÁ¨Àô(™n°ÊxèkpÌÔJô'…טn~IwÄÛÞàêîÐI!­+^$罘ûU5K®‘@ü¨PÌ*ŽÁ•· †ŒÈØÅþÃ×À4»þ­f³ºàÜ´´ÊT¿³ s=—ì(ˆüÖ6"»ª@máœ×µ­1Ylû/[À\¬ŠÏ¿=Bðß8 ]w·4m÷_¦…™ ŒJ¼Œü øg´èçyŸ‡C¾^¿pcÓzÿ¥XÜHfî;¿ºAO\GÔ +Ϗ@šßî²XÅϾÉ~5ßɏ¶@ê‹Hv‰( ² ´³†¸R—€]ð'ƒ‚b ¶ÀC@ÙU0 jc»U!ž]ô±9âI¤y¦Ïæ$C2ª\}¢ñ³´l<Óö1öa +)í*© è±Õ¥Sm eH0cåŠÕ6gzâ×®êcž²gG‰õlïwÚ!ÇäCB…ýeî8~&ÎÅ)ÒÚ0ëžð‡¶B•-H¤Ü@a÷fš±ø¹cà©D9€)4ÇVHßqûædí ズqVXώJ\;>}9.ÝÌXґ)›3dQuƒSVöMí;Y¾;{¨[@™7¶ŠÆg¡ÏÞ# Q$»Ì 0;¬|™ÚBω,ÔTÈ1Jàߥ˜:צdXa%^°QG_zÜNùDv/Տ¬ëê.ƒ_·¤2“ +™'_,<}ZŽŒZö 9,>önnK°¤¼­ÂvfR¬W9³î4D™ÏH|¼d3á›4÷—28뗿ùcýMƁåóóÿ7æof¯àyÀüe¤öÂüòŒp"¶ ¶µ °Â6ÏÝUTèQƒâ"T…=ôõP®%Ɔ}r a˜"bú]®Îô +Ö © ´ù)‰Tu sgfÆ¢ ßÒ%qö\Ù%âV9öÉZú[@ñ3¢ÒPu3d¥n\šàsÊvk!é['/EßdþMW>]Á¹‚‡×9I·G7Eµ*'¦J F +ù#Ÿ$s“<[Í1§OÄ}‘}¹Ûެʒ1Ͷ„­¿Ôèâ*#ƒT—ô¸µé@I5wÌY@Ö¼*À5ÃÏòjþÊg5¤¾ž#ÕBS¼t.²ÎÆÃùн\¡Zá*G¬(ÀP-¢^ÒØ’äåÍE=­OHQžûÌêñfœîcŒ‡%³–÷€õ.ƒH*of«’ºy“é¶ÇáZ¿‚Dµ'–·8Rc0ý´RR¦*‘|,Ùªe»k’÷ +.`ù— k]n=!ôK: `-"EÆ!ċÓG4¼™Îä=J!6K×ðëkØFÅÌdj¦^ړv p,IàV’ ‹)Sóš##Ûn®S“OO­¼¡ØBO>‘ëÅ ö1ݔÐÖ!é²»¬¼®:®¹.z[tvdd8c<æmÇIäÍ +K°¨¨ª­L~åê–'ýÀ$:Îß×èÑ!©ÈÍa<|1?%]eg)õJM™Ý“šÅÏQ‹Ë]õÜtÉéÐS°¸‰&¨h‡Nv£·[¾@Ù¬ “Ñó³ ‰ü8ù)èù©KôÏ3–ãJÐØ/]à :áÎ÷ü/ø›þâoú/óþ¦?ü͉ák ´¶êŸëÏjo®Ù؛ñ´7ãïooÆÝތ؛nLœ!vµ&äQ¡uÏ#  \#âՑüëæÖ<½¤ÈM6h¹>‹½bdw.gÖΐZ¼™ÂMP³W&äecKã8ºŽ6µ¨0]LíŒ:_ËéÜ#Î$1*ç +c/¦v†V^ð.x)¿‹÷»i±€Q°`·òæ#€ƒäÔ%òm!kœ¹•H”—¾]# þwè)‘Ö#'¯wÁtJ‘¢¹UâGäñOö«$G’äˆÝçýø¾ìÖiû­]Dè%Ő2e|Ñßêú¼°Vs¬éˆ Ä DdŸÍŸŽ—e/ÊH ÏÞU³ì•(³äî@TIWÔ]í*O‰Ý(R’?ò´¹ÿ²‡RèÓ¢þÑlÉUˆ7vWüQ9Dʪ>~e8Uy<‡¹C®ZÖÁn„Ô †ÃC„-9¦vhK>2Q³,ɒq/C#+¥i’¢B%•åR¥â5›³RÈÁ°h0ƒ}’êJb²4¾‡š}…«5G1|›Çfa²l¡GÛxŒ‘V†³ô£(O„íµ}ÂB¹íM¦´r,˜×ªñl¸‡ãšzN×K¥ëiYÞ¥kiHeçr=3ùL3çÕ9×"Z7ûædn˜3Öûô›Ó «¹ù÷ü,Š7ä\‚c+š<(?ô:ÎõYòãñÀâÉóéùðìùñ¹ÝqoQoxâÉÅ9mcCSuA=ÇAPTR2¥®£)øndža*heÔeb!ª›uMÞˑxO´ä×Ò\ =„Ê5†ú´¾Ê@ʁrIèì¥yVíޜ‡é#nÝ9³zÿÎ?ø÷ºüóuƒäaŠ’Öÿèú+¢ë_D÷D×D×?$ºbïßVp ºÉùñÌ£õŒHΈ*>ÅùsݗÖ?¾ ŸR4-oUX zB¨µ*rˆ%{jñdŠy ®Õ^^|d²“&µ|@Â&á*> ;všÎ^ÌV#åÎ@€¥‡FóµB·à>W³¡œŒ&¶oµäÈPnp3i1ÍH«Š +‡ é¦æ(q±úÙͯ3?¥V£MÙ]–xB71i=\ ámÊæ¸ÏkBkòá@ßr ( E`r¿ +8Â)®cŠmÓ-+O8z[¢õêUåל6ëH*A݃ãènï¬Ö^_òË@>ê¢Áÿ3°@‡ 8ee¬‘Q<ã6cÔË@ª.kÙ±!tè^YÅ][ܯ€ÒâñkCÓÎ)PPC´²&2À¡ígª Óº-b¥Yû ‹8ÀÉ_ów˜aNv&ëçU÷N7ˆÈL:ß5Æ!KÕh——䵚y”¬á£äq „“åþƚ: ‰ô5.”‹ï×ý¯q7ò_ÎÆ ‡×øºß‚’Û[,å»ï¿¾ï}›olçï·{J†@Ï×еà€ÁnƂêèm Ys!x÷J9>§,íRùD‰$v ‹Õ=Uê„* @n‘Ž<ÈÛ»8â~N±d~}ÍƈU_!— Ž§ÊÞ;{~UŸdUµkæÍÔå¢;S;£‚ÖtM±Nû±E ©nP”#lݾۏiìDHMÛ'DÃYښx³"aÃ]9»7±4®5 ›º^Þb’åãé’Jqi2õzfò™>fÊ£œ×¢Áß=î,à‹òc4Ú:5( ‰O\@µÜ ’ÒÜ«±Ô¯•kx1{Ê|ækhi¼¢QBëkBæWšP¢¬Aq +ÚlÜ +cðS +eÊ4ûüÈ;'eväáN|ÞæerAsÇZa]³Üçú¥]Äݬ¿ï²ºþ1Ç)r›gþv6ñ®.åîí•ð12ñþÆð÷/-ÁÄûb$ÀµûpmÈՍÿd‡c{á•ýK±ªMē±»7¥¹ð Å8õҞ†1‚Ä>äþNh²”Di)ÃA¦æÈ:ÆR:×Õ¨OwŠ¶Ÿ(>¤y"×ýv:±¡*Üôٍd֘Sk¿×º\Ü¢y¥²¢ÑI®i…Úa'²Ÿ…µäìVeÚ÷@¹ïL!;ïõ³èwëÛ:æ/ãñb¼Ìř EŒÿ\Ño®èŸ+úƒ+ú;!îðÀf¥Þ±ö²‹o1sVÝ†iaAt9ƒ–ÂI’&¸P4dÊ!<(ŸÌò4÷±ªgn½^‰Ë´åBvâµÃŒ@ÈÚâ4î·K‡}\÷enÍ«Z&¢©ä—[ +Ÿe_;¸\«Z<™¢üÿÍ~µäXr#±½OQxý?çið½ñý$CJå{Õí20˜kS%>e¦¤Pƒ„¶¤Qø¾»%)B«jh^¨ Q`ÊæJémËË(J¶Ø ÐX@—øœI¤DѪèeêٚš¶ÝnuHÁ@9y?¼H°T¶DLo~JµPjdWñqäRR&d/ܛX6Þ ÌE âÙ )øØfÔÉÑ­¤ØË눇ˆ­ïÙ-à[OogŒŸó¢Ù·C‰,¿/³ñy³a&m² Z=åx†Í!ÂÓ—À€5<,_gÔNY*)Ù荑äºJ‚·\F~傿8ºýUBNNôҌ¤,¹ÆÐÜL[¦wæ×{€³pOÓÇX/´5ckGÌ4ŽGFÁ•<´+¾ãض/çB&Æs5ð´#û˜»¬ÑÑÒ#Œ‘”Jo]‹(‘­ÑÞ-¿É `nû8‡Ürg‡¿áо@FðÐ à d¡Á㶶w%‘‹Ù>ºünéSìí܆¹ŒPždAæ"¥óä•9—bu@bšÜvÕLkÓÉR dbý†&¦ü¨åà÷…·€`4f½ÊmV1.è›Hì¡Å7“÷¦c%y©·§†óT5¶!^i¢¾ÌÎôЕ?ÔPq”A‚‰NM-/$¹úžEe 55xK¨M½‰Ô9—˜ß$>*¶DOŠ` +§*GêGZ…³5׉·¾\c·ýµ¯žøÕŸòbZiZöäŽ4œù$w\ePßSkÅ ’߸Ã1Dé u$ÌZ•¾ÆluF’B¦ZƒvYc](ŒÐÌXó¾fDþ íR.`Á‰è&æ@CÝ€+Æ52}ٛ7ôÈ;ù¶úûZ,\ÃßµÑ ~=Ro·§ÿøõ—QM–cÚn¦ÄŽºÉގh@ Ô +„tô ßF^³8Ôñê‚ø4Ÿ^?$Ë£ãå`A>¾ ÈÇ×Ҝ¿6Æ·ïG†\ù1†[–¯üøÓü¸¢6A)Ð?3zqÕȆx:½åáôÚåôÒÍ鍛Ó+‡ÓK‡Ó[c9½z8½~8½¾^?œžfY½íídõÊiõÆiõÚÝêݜ^<^;ÞÍè!Ÿ>áôæ´xX#ÿ8ÎP¥ËßâK¥ï€`6_nì8ð5® ø+~rÿÞ‹/æ8¬—¼ÓY,záæ|¨L°O‚Éuáþŕ ÉÁÀçVú`ìw¦ ¹®á?…nmoÅÕWZ³ÚÄzsíî9Ä1@h¶Ï@Ÿé$€»äfªTõí"ßE´E IŠèY禾C×ÇSS’­Ø—Á•Ò®Ñì݅,’·‰A25Cԉm?]üÆUâP‚¥Ä­÷ãkñ+0/™X½~9†¿·c°Ï`ÃåçM,=¬ÝzX>zX¿zX¾õ°yëaõèaùèak¬¶ØÝj=lì6Ž6ÎÖî-¬ž-lž-¬ß[ؽ‡å³‡õ³‡Å[+Ÿêa1Vs0Ρ¦[½$ƃWÞd0Nh;eìÀ0)¡8²ä±òì®Æ¬pïh=‰3õ'´–ГwärÀJÎjRS“EÝ«DÝWÎõš«â»AÄ„Á$Å颢…;‘ÃIlÖÉoCÆp¶Xuà b?2tlûÿбé':vÏý[tlLÕ.ÿ¨¼>Qyý¢òOPy½Qyý!•§f|Ž gØÏÜG‰Ù‘sc†700˜A©Å»QC¤7¨ŠÀöѐ[±=FHÿŠ&‚ZŠ=ü­4 U39 „«›bÉ5FÎã©È¾‘ùõû>Øç+Ç녶fl툙Æñ¯ZYíj°ª2+4g¦gjàiaÜ8æ.kt´8—1÷ÖùPbւÂp½Ó›™}œ¯7åâìàí ÌV‚‡naý·µ¸+) ø‹îcêËvYÈáëöç?ñö'hqü@őbåZ%ªÜ3.½å~×ç,¢£_Ä ôÐP†æòW\Y-ºd—/æ8¬—´ušÐÊÍùP:Ӎ«ô¤qIM·¼‚Ï-qŠ±KBmÈٟÿ¤ÌÖö–jó•Ö¬6±Þ\»{‰q±Þ‘ws·Œìc4žÞhؖ³_Øf*o>&A¶.¦%‚PcŠ“£«Z*±é÷Õ_°ÕD‡’ZÏ?ãj94„Ñß_ð~ÞË+–†¿žßë;–ÛØÎ_ûRtvt@Z€!€xÙsL ++R 'Ô¦_J ‰D‰ò{æ·6“+JbQÌ£®oÖ%çÒ»ÔKbFP¤b<%€Qˆ¼„®»è™!êÇEK¦Ô™f¾G$Á*œ¦Œ•|'nia®Ó£ö5y;n؞pyGÿ£D.D:ªÉ¯‘¦Ju»´o*Õ!¢¸û0I›D¿&Œ½¶¤È]+g¹Äáy!ÅZŠ³¶…J%Hár‹ÄKÕ´H¬Ù7F¿_2VQªÁñyþãã0{ˆ°‹Ð´Ó"¶®ñ%LT–ÊÆæn'”õæ¾À½p¿/äâPѵ€ÃÐôJÿ²2õ¡îi—呌),´KŸKLdû¼„4ìT`Ó*¯o´´RsÒÃ2œhÉÖ¥lqöÖPÁÐ\ÎâãÈ¥dXAh„²–ñU_%È!ќàckow„®œeٜ’xˆØúžU÷žÞο&†µúb»þÒ6ÿekG“µf ï4ßnnö_9ßrf3. †òü¥»>Ã#Lbû ·åðÛ/ø!ٚÇ|±Üº^¿0Ð ë—TãÛù`ñ?Wþö˹=qmQ_¸G?Ó~¾—Á¦÷‘¨“ú™q)&»§^·`²è—ä(½ÏÄyäUJl’Iy>+È´„ÎŒjÌL\º]öH.íÅ=¶3½G]ÊVŠ{³¸tb¤¤p!¨-n•h*L*Вq²q£†7±å:™VÙÕ·9 Ñd•±ežýT/‘–šMK‚BÞ}¨ž-¾Ö¬ú—²û/(;«ï™zÿû8—r9—ò¿à\Ê͹”ò»Cö´È4Ÿ äØ<)•pñIP’iÁ.ÆN•±±Ñ©´ìc£æ3ª „OòOªO¡tqPû2È·¬Ú²´ìÞ @-´ð,hûéRta¬Þ`l1§«™Ý*lë×ð5ùª%ñ̟ L+ã ̂C³)UÊ湏ßç܁ѵWCB ÍÃØL'îU ´(l,ÆîÃ_*vÅWœ«h}®mós?K¨à1Âu|{+Íha¾€íʵX˗£ +ðöP¸Aô‡¦+²$3%m'C;R ®µ,cyZځ–¶Æs}?²#íµ^‡h}Ñ×Þ  µÿB ë“ÌoÊ2¶r³v =½‰ÝÀFÉ!E“Š¿j*=αújxÄiµääßq ÷Ü~ãƒBn©Øw¬M¦„6œ²”X '´[€ÐgÊ¡~&S±‘«@’z6±p–Üõ"òb–Tüw\IÛÕt¸ ùŒLhêK%Ÿ¨…P&³Ø/½úxí:;çdæH^s¤ åÁ’ +i´½ðó}·Œ~L&%´¯çf£D/*º’}͐:`óž¬ì*ƒ†"“Ÿƒ±E6°Áaq¥mšM­"PXy÷Aø"u9¾Ÿ²ƒojþÉ¡lU¤ŠØ+xÂ8ŒzN]Ci¦ra«õM9fïgܤ÷p˜ÁÖ=÷p;+¤6úž…ÏÒ\X1t’ÌrœC*éªÃd@¼Ž‹lìC)ö8LmÒ"œõ°¡èëÛ=ˆ/…¸ƒ±îñY5Àg•·ÇêµqÒê€Ùòžó‚Ñ[«zäVݟNȅ’ë7|ϑšüÜj/¬—‚Aí<žÝÖ÷ …ŠûJEJEœ¶â&“®˜R,×¹Ÿ–ÏjºŒ©¹X|ïv9X¥ë. é/ÄÛ[°¼Ç!Q„Ss¬f©O ãØRì· xF~´7žXg +t8܇w>Ûiâ%tÓaëJÙ\xJ¸™‡,%ŒèX@æ„/ +þ‹ýjɱ$7b{Ÿ¢.Pý?gðÒGh0àš7¾¾ƒdH)½š{ð†{ó >e*%ƒÁh²»ŠUÖ÷‚Œ#O.\Ýg)Èx¯nd…œÚí3Ƥ0Èñ‹\Û &µ;áÆ4†~_ýÒò)³ GŸÁ"…p"%7¼*ÎpEÐø]S‡\³7 5ƃ°5º”%YbŸu¹s/L½×õIöÿvëéúÄÍät +˟®[‚gG“¦€Ô1Œ²0YhÛå´Ñ؜ÒüOB¢«Ò§ØWø±úB¾“¸g…«Üüü*.Öv;zŠÓt¢Ÿ®uŠ“<ƍÔ%-ô¾lA—Ié³üí²‚˜Xé@C–ÀîVg&ÖìÎ:­¯Y-TÅ<{>”Ó®†rÃJrئ~¬ðgֵၥ6&ñ¼e÷Ô ¨'ÚêörwŸZ;—â°ƒ—óêª}»úõä/{-˜Èòª®#gÁ&㝩áëž[×E0d¯àéúd|(8}n£»ßë,åµõhËFÙs«”ýú¡›­S °åËVÀÞP¾åÂèž,ؕܐj ÄâڝtÐÂ;Þnx‹#qb +M®†ì/†%ZÝ[ˆé:)+MÙÉ UÇHfà؁íj®”’h¢dUDVG€ª†ùœ%)Ü«ôdÝEÕ)ªm¤Ñ *bp–Újˆp^?;  •lè4Ž¤õ·'Õf•†ÐšPF©„±EuÃ÷í£zÛòl[넞z곺F\{OoץưؘT([—”@A¹¦ãÐn(x%ˆ¼õÒö­éÐÜh=É÷­Oìû<»ËֆS5]}iìÕÇlÆrÝ3ž§£å7÷o¤pòšªµ¨3¼ÖTú#1 K”mŒ;iSݐÉÇÚ·“¯U¤‚µ+ÉØ&ãÛòêóþñWΣ¡5aµü…ï:ÿ™V€ ;«%¦ÓÀ-ō¿ñÁ7ÖÆò˜ŒoàçŸêkÿ&vù|CXßÐ.ž'Ö.× +ç9púƒ]µ™±˜²ÁöX|ég†HQC‡êb»JmA«iÙ­œ‰;¬®£>bÖùøh[SfIÛrꏶ¹ùx´mÚæTøÝâֆ®æïÛ ›ï!žvãø‡f+ /ZfbÀñäÓnØ?ùš/£ï?ØÍÆñOõ7òc$öúÛjì¬'žêýû /Vc÷àÙÃÿˆ/ÝÌõ͗rñ¥›$ß|yþQ¼m…‹/ýc¼ðÅìIˆÇà u=VxðbÌóOõ7bˆ#Ö7ά]gе‰¸ øÅ=םãKý¹ÁÀ°¿÷—ÎA¼‘ž÷z!kë 0 Ò)Îñgsž½º@']hõH¢Î‘³ÎŠž%;vµÚ%„¯Î¨!t/e™wPªQ´ZßcðYn1÷ƒ‰]{Á¢à((®“OÊA/8)ÖÃ'5Âx̍©IúYÞ$1ã[È¡Ä•3EÒž‘+Å~¹#¾ã 8å5ΫMÎÔÀ“Žìcî¯&GJi{¿LÛ›š(qgÌÕȤlqKTa¹†›€óçÐÈ.¯"ZÒAxåuð¼ +<·%Öª¦L鈽EۊXù®À|›é°ç?(ä\¡Í]è{0)eU]Vÿ¤™®'JoÇ +V™>ÿ©þFòob—Ï7–xv±žxv©îsÜV G»–Šàï3cºxŸüú[’.%÷D…Bú‰¨ÔW”zæ èOm3jäò‚\&X¬ÖðµXõØ?b§ÇE¿XïZT§K'7MbÑaÆꀪ?I,Î%¦—ê‚ö¥ì(ßmßSû1øeáÈ&”%kL_ŸÙ?µ¾h&‡Ògl ½m­Y©â0ê¹HO¢éنt»É)³ú -!ï²ÙåÔö“é$X…¸ˆËšÕ}╉/²Î˜”4ÕLÎ!UWÂä…dٜ"„2ø.z?ªcÒG8ë×æŽåºD%Z`MÂßþ~Ñ3ŠØÚ°5W™±]QkÑÄú¶ò}HŠŒDꛗÇ%Y¸[ë^ìA·“ vÕÓJ‹£ŽL¡¹fÁRqÉÅ_§ ¸¯½Pµ¥s¸Â]ÈоbÜ*µtèy/w#lC›¿æÔz3²Ì÷¢œ¥›ý]9„xqÃ…È +訡¯¹äηÜsaHrA†Ù÷õ‘cNà°^Úæm¶ÆÍù.+É`Ñ÷Ïñì`çà²Ma[¨ðX&û»Päñ<¨–çޞw€/­Ymb½¹v÷Zý[7´®Èî¢Ëo7DãnˆÆÕÕ£!ŠGC¯†(ž Q:¢t7DéhˆâÑų!ŠGCT~°jw7”þÀn¨Ý½Pú£{¡QÍeÅüï¢/O÷½ð»ãû]ñOgüËoÄ¿ñÏgüÛ<¤›é €ã&À¸#^¾À‡å‡ä›ù7ðÔ¥?£Ö·¾¤€ +¶ «(æËÃe:Þ…ÄdۓѾþÊüe$^¥Ï [Ñö˜’•Ö|ú•ÚÀë@o† +ØH™â£ÈÞT2]ýMÏڝ¡J8¹0þÆ +ŠΌ†!Kõ%5,šאϨÛDþÞ0‘Ò,Y¬ÊBö‘eowr¯>^»B[ÇÖhzΰÃQsÕsi´ýáׄÍÅÖÎØÊO?ø¿çÏ86»˜ÞÇÙÊHu³Î9ä ¿Ø00-ï9O½µ²‡»‹’ î'ê2í:×zŽk#ÖKÁ=Hí<^, ŽÐëàîðÍ1¶qtÄM&…ø_O ¾ÑŒ©9!î]-TT± È#ˆÑ[ÐÚÌÁsÑ[”Z˜ d©O ;íØbÍ[ڀgä¢èá öÔäèƒLî(ƒÕuá‰Aèþ¦CÛ)› OYKқr„c°8¹%d-0b1VYßs»‡ÄÛÞcõ¹}ŸVlà½ÚbZh9] íö™ cRbzÈÀ[Lê*ƒÑ˜Æ^ôˀ¤¹Äs‡£ÏB¤ïg{ò %wŸô¶e¸"hü®‡© ‚c°B:À“ÂÖèR–F?f]îŠ|;õ^×'ÙKü›šž–Skµèrõ€[úûՒcÉm÷sŠ¾€FüÖ2¬…½“o0lÀ H _ßI«[n¹$0³htÅc±H&###Š8š4Ddq¢ErÌCÖ b»öLÚèΆiþAHtUú¬¢êúB¾“¸GÅ¾rçç[qÐD4Å @¿uk0{ê²qÖnœ÷P/Ä{°´K€¤ôYþŠ€gºÂd•Ž4´Øãn-Y³»Õi­†Z¨Šy ÷l,§}ƬF ìтYן­® ¿XÓÆ$ž·,®–¬q [Ý^Å®B‚P¼SÖ*‘«Xºztò+D +/w,˜Œäµ¨~eÖÀVëÜPÉ5¶¢e`DíÜN¥÷¹@ŸÛ§îyÝ*ym}΋jÌllU²_>s‡ÅG<ɗÀ-ß\ݍ©·L˜™'Üu5jH´bqéN:h±¦%K›ˆ,ƒ¼‰iâ[ «“ K³ºw€Óe8šªÈíÛP5ߍ<6%¼¨¦$š„""M§#`¢@‚ùrÍÜ«ä™\Ý5ž*S&¶Ñ|^P £É@f«Ÿáa,üÖ ­\k³øs4Vº2mVIˆ9“Ê'•0¶¦nøÕ¶Q½mõ§L¶-uBW9õQ…‘aïéåã·Ô˜4õɨÁªuS +¨í£éx'D„‚‚hQ/mÝH¿tæŽÖ›Ñø~Gk‰Ï¹¹<`mÅ/ +ÈS›Ò9ù{”¯VOR¢ä2¶ËwØÖ Ø)ÊåI´üš¶öõ&qÛø8×Ɛíèšm J˔V<ÿäñº5©9I#¬½£âÚ³Uö9eµCøPž Hf­¯•»I¦£IíŒÖàmÈò†ª´JjÜÈ*Ž¡(‹U@é<”ø®²¼Â~ÈìZ-\ÿx·>hB¿°òÿÃÊÁ¢ >P“B‡¿b­î¼8éu¦ø¨»­ÁŸåêôoewŸàhD7ýÞèÊ7ñû²®w,¿ÿÃ~ÿ5®0Ǎ}÷ûˆC¬o1}É8Þßë;VeØ8¬úíþÑ#PÛaÖÏÇH.¦nõ$ÄpãE¿aö(Ðï>—"”Câ܂pI´JÖIr +Ý%ʎQJÖÖ¨–5†’—¾ Å‰e®";TTæ¼äÅÁ’‡+­+s÷ \òâPòR`œÊ’„(^ê‚]¥¶ jZv_A[âöªë(/1k¼ùWðÒ¶¦Ì’¶åÔ/msçqiÛ<´Í©ðXÜòÄÒý¿[É¤§Õ8~1§ÀÀºn#<âé4&XÇñÈÒñ »×8~©>#ÄË\ì%¶×Ø{¸^X{¬¾§ó¯¼ÆÌÈ®úû¸ÿÙTÃ<ôûF˜r#̀´Ý sý¢ûÆf=ø0@úa®÷$ Ïa.¼sýRý“ãF_â"ÌÚÃõBºæ~Š;aJ`sUDZüÌÄò @dm `PõØ Þœ`Ù«¶ù½§È’oe˜7¼A,ōa•¡²Ý ¦½ñcŽäq´ýælÈ>1,ÿ؝“ÎI'lvÇÃ6T©Jd[êvì`¦/W±Ø¯%ÚçgoÌ5‘">Mf{÷±›¯a€Ñâ’m |e-v€qRä‚|mƒ*²ÉN1M ¸hì ÒUà†çҘèl÷K¢×³KÂÝ¥L6Z”e䃆»±qf9m¹ªâL¬~ˆØúUöž^n1~mcKDdr#ã€x”“¯’\ÇÑ­•qBwy’÷œI×&f0t‹{¬;Ç ,é· »ö¯‚»Kç g¤k7“¢/`"²1 ãlγׇ¦õŶEó|O5úLÓ)ŠåQì‡(æSÛ²™¾€‰®¼Ô3i°„3Y)³n¦:0ú1š>–,ø>ˁ_›rÝS’ñ>Ö¹¾çÈr‰*ï8¬IÊ#dL—l7ç¹þÂzÅ5ǐ¤Í´m21ӄMrûmdÐÐh3Éu1±”£ZN%y¤µ®7 ¢mv.³Ì4*âBvJK a?HÁoØ¥Í`Göþxàl)^£íÕjvš<+|キ+ás±=Wÿ%cr$W +ƒMŠ¢»ÊZ/d;ÅÓÞ\¸N_C2>ņ*•¬1-ät°Gµ­ˆÓ¬&é"WµdÂTÆÐÇ@+͞–ePAÝg[臍( Km.”¬mìÓäÌ,ÕGÏ_éeËÁ!‹“¢xãAX"‘kôc´*z¥Ø½ìðÙ»3õ-kiu­–Íät +zIÀ(q4iˆÈâD sÌCÖ b»öLÚèbÎ4ÿ $º*} +VQé }!ßIÜ£ÎÀb_¹óS²[rÕK®µ«T¸ýô½×¼»ÛÏf§$( {C‹E;ë0’8oÖ8ÛÅ°6¥g»É²B£[Mælgö½{ÆË(íkz ³ ú\5,„íG¥6⑞E XTm·­ò.¯ µ¿]0XÓÕTS› àŸ뀛=/ˆ«ØT»°etKR –åÉÎ×h-.¤µ“}Ø¿e“×Ú +±C&Û\kóZƵ¶ÃµZ¸_{IÜ:ø÷…Ÿ1Êd{Š+‰¡±sê_tû®ÛeV„€ìˆ¬å±|ÉÚÏ-kkÀ%t<_(ðyQ`™ïúòê3Ú»¿|€jà¨C}﵄Š&”GjO°&î;Ós¾~Ñ(— 9Ÿ{f:htMþsOò¡½B„æÃIKÈû³YKUHð£Y%`­Öî°À…ÞâÃYˆ}µ<œU±Öč?›Õ&~Ïõá¬QØp>¼ä2±Vz¸Á±TŽ/¹&,UÂÃKFò`ÖSîÖ:©/UœÎåá%ׁµzïÏfµ€µ¨ ÏfE¬5ëÓµðr +O—‚h¤X^rƒh¤”^rƒj¤ü”» ª‘JzxÉ=PEãÃKî‰k‡1”b£NÜ[7³¸fmñïÌG°ÝölVÛDéy6 Üo3Ƈ³gmÐÇ?š…œFݬgA?`ûûÃYЪV>A[©éá¬ÁNãýµ0ðwü}ûáëo¿ÃãÏxþÛ_¿þóååOÿzo¼jüëoð맟ÿC~µäHvãÀ}Ÿ"/P QÔ÷<½(ÏÂs`"‚Òûd•Ç6܆^¥âI)Q" âÔÇßÿsãqcXBñ >­Øi´cíÁ8h³Êc<ÝǁÖÏû·ý!ˆNJ¯øŸwD>¯°9·‰û¿^7½yXýNB©ƒ´l2²>+Tåúð†Ý ÆEþYÛ× EÝ.ûã1Sù„Ó9|ígTôzÂ+7~Ÿ×çÏÚ²¬E°€`_1’‰ºäòeìÒlr¥u4,ù«/à_¦/äñ¯>°YºýååC:/tÍÒ|ÉÒöE_çûš?žq¨Qäœ3üJõè-âС•ió‚êÇø)êï.‚8t—1l…ŽÃî®ôÚS:[à¾Ec°çà6J‹gƒ‡*{§Ç2Úøœ³sb@=öAhsmG(£+Rî6D¸8=öÆJZ®0!Ó“}F´M¿Á^+`i:­&ε!m°ÁyêºêûêŽüjùўL¶¬FTcrܳà­b† M cÕ¹A€4f˜Ò_¯–øìý[ÄAC +£ó`ô`k8؉2q{±Ÿ_5¨µsôkäËÑΒb`:{H8 V?Ü~lÈkª?ŀÉtbl…žqaÿ“Y¬‹±‰ +2` +àdØ]ôv™w+hGÆY¼k<ÐI`à4‚ia…ûFïthW +lŒ§«¶f¼ú îï ¾…Y8$,¨|5ç©·Ð~Èffm~\îòJ͍eÙ<”Í7e“pÓÂwá-å{]ñ<÷ˆ•QÇÈ(qg/1W€Š|•HämÛðƒ0kyý ¾Øåžßöù´ÊÏ⍕6”°¹Ÿ˜aL?ðiå¥ÄkräB­ò@‹(YńÛȐ(¶ò&ëå§Hþ•±9 ¥^h—¯÷¨ª"C7Hܳjy2[€–Xv–ÀɊòœ…·,Î0ÉH÷+¥ í1Î*M˚®à\Ì*zƒ Cº)g¤,–XFu±U±ˆß!ۚÈI<± Å TDHÿ÷–=ûGËޞúÊ^è»]÷üŸ«{þ#Ë{´Ž'ó:|ùVöÒô£é¬>£×€Õæ–*ÂƒÛ ŒíOšcÜ8# vlŠ‡Ë°ãÉZ¨Þ¨< ùÑ1ëBâ·UVۉ¬‹Ðq&ñ´bõ.ãÜ2£ï¯¯‘å•³‰0ÛïpÀøÑPÿŒßæáÿóp£€ø]w°¿Èíïgû? 0þ:´?ʘ”ÿCãyg€6¯à[\|¢€Œ~Oâç3àLX** _×f9· eCÏYµX +%o–PzM!ØóÊùÈ°âj“.@«¨ì +ö<‚¼n©ÕPâ+µ»ªl92#/ T3™)zôRÂz…Y빯6bFÕ)®†#EVIªhŽñ*Ìý´m×_e2{ßH-³lts¸_ì±Ö×XXfîQGé1(ƒqýý[6©¼Î€³àéYŠ¢É®€"X.ÎcÝÌ¢• +š7Ý "}ÙqápŠ™17ÊØHקæسøiúYemèû¸Öqœ’Ÿf±¶ŠØ<cyÄڅ½¨,”¦6*è>eRËUTÖ!Ú´a?U£úø*uïŒ +~ý ®:šV•‰%°áÌ¢‚ [*5†Ÿe^z4ø¢Årî‚-¯Ä-^ ,lù\ü™sy*FŸEe&ãõ¯Œ×…S$£J›4f$礍ÙæŽî¢¼gha(RÍ¢ŠÖ`ÏސÛÔ՚cYå[è—Z9㱬óvs*‚œEiR7`²­íw[0nã´Â\„Â&¼U•SO¿ÁŽ€BE±ÎVd— ´¡F#Ï¥ºJ^WW¸IäÏêðÔ8ä>R>f̓†Œ„¦sƒ èßÎݍ•Ï ±ÊgïYüõêG…bá¹<˜Rg)¥Bewr „<òCYâ=‚ߤà&„5)üqŒë¨%ÝØÝ“Š0æ8;.¦?£ck瞙ÆE5¹àð‚Ѳ&…kmë²ÌÔ5GÌífÈ5“é½Äë4±IèùîKÂðô²åq›¢¼P 娀ù¥Å:›@YÆd Ù·óæ¶x¡2Âýµé!y*Æ({>7 + S;fM…‡|\U#J U—¨,ñÙòʬ^dBñP&MÅ¡]ÂJÙHª~“vJÖDõ”sŠ6ŽÇ!–>öä†I"^eD‘1ëtՁPÓöï=׌éŠæR–"m +8K¾š56‘¶Æ¸ñlGߖŸ‘;Í Yd ˆöŽG aašøfÄû0}ðylúBì øŸ(7¼EzR!ûB| mÐ{U[Óý«8"Ž–‰*ëªA#¨lU~…I+ýrûB5Eܲ ³ÝlÎÆüþ_úœ—Ô]~îpÁIÝÝù¥Á k…MáVMg2ˆ«Ù>ƒY‰/ÿc¿ZvìÊm྿¢ÀQoíƒÌ&»äAfa#@òÿ@XUÔ=:·ÛÆÌÄA ·UW:%’ÅbZÑRàd‡UÂo/—ݱâq/ßӟöùæo÷êX¼Ô™‹ûUbÖ®ÄØÿkÌwjL‰ ]hZôÞ.”Z%°»uƒ[ nÞHjJšä¾©' +}e•²3ÓmÐî¶!™*?Ö¢<í]ü;ŽÀù}Ÿ«ÊƒúÑSúÊæ6TÙ<.Œ7ó\wG¢>רdÉdptuu‘ÁàݍŒ+¨ÌÄ¢]ÁHcs"RÍ*%ރOî¹n*a,¦-Z^ ÓB¨E9„9ú(_TxÔ6ˆz|Z¡¤Õ´Ç~XÕ2ÉïR²r ApÃ=ýKÊLk¦”õ+Šl3lïj›±øòJ°A>@÷wM­¥‚Iý]Ԕô©bՋväåWWµ\¸B1ÚÁÄäa8+É:¹íðEï ç&ž§zµÀxIÁ¤É¯°obWÞ¿…ÆÛsÜ[…¿<îJËA`91î3$IډI9dÑᲘ± Ôêú¹(ÝJÔ ýÛ±ôÜâØz´ö_¿¾°+Ìñ|ì2úEm»*‚\× yxü~~qÛë<å<~[ÏèVþÍÿýüòÓÏöá?}ü—?ýôǯóõÿÞüŠùË P¶^m~tê'ý4g ^a¹Í`ôŒÐ_¿»V¥Ìô‰-|ƒ·—Ûï·Oî۝'íã·[²Sè„ø4Hô?! _‡ë¾ú€÷´GµG°>Eð6܌ÿ¿½œ¿rýŠõöf{NGÝÌxØ÷.Ðgó òjaÝ TªG 3:Jݦ9ÊHùî,$–²ò€`п–'²"~^æû>YñwdÓkÎ;àŠ~qÖÉÇh!¥ê;œûrágPCýÄׂ£…In TûØÝß1õwøa`º†ÏÕp¤é%ÞO6g…ÚÒÙq!)áRTógü)£ležp[ÿ BóX•ø¾Ãå^á›8yáٞqó×<–ßaº.qæ\>rÎÒIy[`ÏY9lú)KÏ0'úšCÌ<¥Ž4DWN¸KÝìd•¦Þ£‚þà Ò ž +};¸b1V­ó13 ñPÁ‘.…»ÓÌɂ]ÙЎ Ô¼¢NÃV¯dçÐC¬4Aë넩á¬îWÐ삾£'¦D$l\°cIyôÂvw…v먩©Ãñb ˜f¿;¼I¾´=ç á )^=-Þ¡Ì…iÑCøÃàbç)"†óÚV¨¡µ±¤w_ä½Í©ç‡³‡÷S‹§ïv>ôÍ)Ü%©ÖsxhÁ/Ÿ +eŸ°~`¿™úW` +Ì9‚™0NÄT€<êSGmYGÈÞxÜ­í¢ÞIIzsՍX¾!¥ÙÒdnñ”/è{å𓠃«G(>煞ÉÙ¥ –o8œM ‚ÏD³S¤¾“r©†ïcë5IÑAóä•Ä#ÐäÚNmçPk¿¶½—´½MÒûì3’„™ €YíßfêZڈ–aäÍjÝjÕI"ùKï3Sæd"ÔJW5y,PJ¡©‰Ý°5ÅUý7H2+2hV]­A6>IJMc˜ÂBáÊÚUl§n,q¥]/G–6/0¤@K´:˂·S¹á&z¨™YüÀû”`ÖZ<ד z\ÂÞlWy{¦iQf† äÔ²Y˜#³"q«¢S#ÃTÚu¤¬¾lÒQh­Ð—%IÉjìÅ4W)œUèߤZcÛáÕé o7>èïÃ~ú>.ú?¨/ƒñà_‘u±3n"ÁÇÞd56P¯ÊÄ®Ž®7ᓪör²Ãš|úvjc>G}œ™ùn—󬺣àqy"¨Õα£$r²ç ›¶¯·_–ç +v@Ó7œ <Ök±~ããø…G’2® 6ÆúbÿÒ<dd%®ܑ’Õ1ý_ú*ü¥øYÀ-vÀ‹_V ë +ǂëV•Üïýv¯6¥øö9ôEžóF{Ð +IÒp0º×nT èžb÷‰"\)®üåQG vƒ®yБОZþ‹ÚcF°œ%êŒUă8{ۉ8è”4¥er'õ #°uëä'yQÁt,²Im3Vœž¯ÒUXçÁ›Îøµ»×ì´úx¯ñ±‡<´”ý{Aft&E3^®(o;íF”(£ÃØ·&/®X%”³²m0iŒÙD^=%5šŸÙY %ù[âa9ÍG¥xb€‚`fLþ;…¯|§ðÕï¾úk _ýváë?¬ðå[áËO…/ÿ®Â׎Â×ÿ· _ý±…¯Ü _ù…¯~³ðõo>s~MnšõŽZ·Â—pŽôèX,9)G‡’O4‚Ho£ƒû’ô-€±ó¢Ê{à?†Å9d…ômë‚ ˆá h㑲[q–Ì9Æ°#X×ÑÞ4=F¿¼{ŽáEÄż·\îæ±~ ü¿AþŽ ç Ì ” ”ßÀó‰֍ÚÁù›,0O˜7˜¿’òIëGÁ Ê´ØIvçû¯©àvSÁõä‚ùz ÷"žó >à|h,ßсù€™µ:WÉZdEñ_pÿÔ#В~R9Fh¨U#‘.֎ÙÁ2ŸÔ„M +›\L´’¨ÔͽSbŒ Œy…€%ïARæ3ôëù„©ÒsYnï`´gp—kÙi•¤+£0L4ºœc]œ=ALQòwqA©ˆò¹åaænk1»l!Ìsè)^M@/í ¥ø-;p²óÛ@~=\ g,s‘Ô•08Ë'Yq›žI|%³ÐÃÌé!•˜”Wc+ôL×l]ÚFÒåç5fPõ"ӘhuêaK:Q«ñÄ~ï>ëHÝgŒÂIB5°¤=IzãtÇ3_…òô\–‡Zú¬õóü¦ÐÌšž’Ö§›ão~fYÑ&¶YJÒ$™ÞVwÑAS„n[®¬A³šì9ČAÚB"‡ eèÒvtB/y#îZ«³Yªƒ‡œ7£À&كš™TĊ[ýò¢ÈFZ{x!ܒñr!–âZ‚ØoJMa׊0*]Ò³Í]qûAæ#q¶êíVmñîYÔËYÛ-ZÑa½(×-ÖrŸ¤ ¦ÌÚøÀxÝ9ód¸yŒ|Â%×@OgRO¸ßµ÷Èm\ ƒAk•Â¼H¢Å˜Ëš×”=38Sš$ŠA¾ÛŠ`YÜ.Šà¼ñì¨9ô `¼ûD¼† +›™ÍgdçÿÐò}GZ2–l\˜[ +è^0¦Òc³ŠK&ä ‡&•4feGn{y‡7„¸¤È†ß!Tì<¬CqàaÐQáñyà{‡.\C•ÑŸÚYR¡Zu’D3†akw”h̒–Ûc†o¨NêgñÃ[$^!:iç=Sêà/‹Bp¦·sF*Sü'#q>ÛŸ¿t¢'®úFÏû;~çtôXëö`“ªÚf|>‚bE%i‘ÆVì˜ø€ãŽï‘¤x@ï æuÆyöIש@њo_?´…Röí«“E>f3{~Hc{Ðw]›Ü¸$ˆÇ¦0gÎí^óvlÒ/,÷V®¸ÇsO]öޞÏ_>½y”?哣c endstream endobj 318 0 obj <> endobj 331 0 obj <>stream +8;Z\76'?jC&G2q$a:31sIrS6*?c[TLp[F^o0IdKe,@WRaZH6&h&>a4^7]kR$?N2;1 +)pp%V2o;TB%1#r`%=EuK."5M>Ej8L>$"U6/b#(>H$:T/% +Pl^XZnac]'YgT1;;C(_!(u^@i\RVK0\6(pDNArqNmh*I9!G,8.UJcX8 +[#[+$;T"qB=Qkml\rSgrSaR+TQ)lIXW:Ei"h+-3;BkWUW"(7UZ=;m0]1])NhZc +%X6-7C74#Wkaa1q\B7%)nhE\(o)p;.9S3!0IFRR5 +al,QUZp0lhal1f1PBl^VnhTQ5>JS>GcNLD]>!cuBUQJ3mEf6"J;roW')o4[EQka^[ +2d`qfcb7u*;65T!g!i(AQZ@2Z0&@L\hK9muX:%_20`GG)E9; endstream endobj 319 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 363.7622 185.9284 cm +0 0 m +-0.011 0.007 -0.02 0.016 -0.031 0.021 c +-0.625 0.354 -1.375 0.141 -1.708 -0.454 c +-1.896 -0.793 -1.903 -1.182 -1.768 -1.516 c +-2.082 -1.809 -2.393 -2.105 -2.696 -2.414 c +-14.013 -13.91 -13.866 -32.471 -2.37 -43.787 c +-1.266 -44.873 -0.076 -45.868 1.176 -46.763 c +1.145 -47.224 1.371 -47.684 1.801 -47.924 c +2.396 -48.255 3.146 -48.042 3.478 -47.448 c +3.809 -46.854 3.596 -46.104 3.002 -45.771 c +2.612 -45.555 2.157 -45.575 1.795 -45.78 c +0.612 -44.931 -0.511 -43.987 -1.555 -42.96 c +-12.596 -32.092 -12.736 -14.269 -1.869 -3.229 c +-1.541 -2.895 -1.203 -2.574 -0.86 -2.26 c +-0.354 -2.355 0.179 -2.13 0.444 -1.654 c +0.559 -1.449 0.604 -1.227 0.596 -1.008 c +8.005 4.926 17.993 6.752 27.089 3.706 c +27.145 3.343 27.356 3.007 27.702 2.814 c +28.296 2.483 29.046 2.696 29.378 3.29 c +29.709 3.885 29.497 4.635 28.902 4.967 c +28.429 5.23 27.859 5.145 27.479 4.8 c +18.053 7.964 7.708 6.101 0 0 c +f +Q + endstream endobj 320 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 365.9072 178.7496 cm +0 0 m +-8.689 -8.828 -8.577 -23.078 0.25 -31.768 c +4.488 -35.938 10.117 -38.223 15.989 -38.223 c +16.389 -38.223 16.79 -38.212 17.191 -38.19 c +17.298 -38.381 17.455 -38.548 17.66 -38.662 c +18.254 -38.993 19.004 -38.78 19.336 -38.187 c +19.667 -37.592 19.455 -36.842 18.86 -36.51 c +18.266 -36.179 17.516 -36.392 17.184 -36.985 c +17.176 -37 17.173 -37.015 17.166 -37.028 c +11.178 -37.355 5.365 -35.172 1.065 -30.939 c +-7.306 -22.7 -7.413 -9.186 0.827 -0.814 c +8.821 7.306 21.777 7.648 30.187 0.14 c +30.01 -0.408 30.238 -1.021 30.759 -1.312 c +31.354 -1.645 32.104 -1.432 32.436 -0.837 c +32.767 -0.243 32.554 0.508 31.96 0.839 c +31.662 1.005 31.325 1.034 31.021 0.948 c +22.155 8.924 8.449 8.582 0 0 c +f +Q + endstream endobj 321 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 662.1581 147.4655 cm +0 0 m +-0.476 0.265 -1.076 0.095 -1.341 -0.381 c +-1.464 -0.601 -1.49 -0.847 -1.439 -1.074 c +-9.094 -5.818 -19.071 -4.753 -25.569 1.644 c +-27.007 3.06 -28.198 4.659 -29.125 6.389 c +-29.104 6.418 -29.082 6.445 -29.063 6.478 c +-28.798 6.952 -28.969 7.553 -29.444 7.818 c +-29.58 7.894 -29.726 7.931 -29.871 7.938 c +-30.878 10.299 -31.418 12.859 -31.439 15.504 c +-31.48 20.757 -29.474 25.712 -25.789 29.456 c +-22.304 32.996 -17.712 35.05 -12.782 35.298 c +-12.696 35.149 -12.573 35.02 -12.412 34.93 c +-11.937 34.664 -11.336 34.834 -11.071 35.31 c +-10.806 35.785 -10.976 36.386 -11.452 36.65 c +-11.927 36.916 -12.527 36.746 -12.792 36.271 c +-12.801 36.256 -12.805 36.24 -12.812 36.226 c +-17.982 35.97 -22.797 33.818 -26.451 30.107 c +-30.31 26.187 -32.411 20.998 -32.368 15.497 c +-32.346 12.716 -31.775 10.024 -30.711 7.543 c +-30.737 7.509 -30.764 7.476 -30.785 7.437 c +-31.05 6.962 -30.88 6.362 -30.404 6.097 c +-30.262 6.018 -30.109 5.981 -29.958 5.977 c +-28.985 4.155 -27.734 2.472 -26.221 0.981 c +-22.241 -2.936 -17.016 -4.944 -11.759 -4.944 c +-7.978 -4.944 -4.18 -3.901 -0.818 -1.783 c +-0.371 -1.947 0.141 -1.771 0.38 -1.341 c +0.646 -0.865 0.475 -0.266 0 0 c +f +Q + endstream endobj 322 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 642.3364 139.5495 cm +0 0 m +-0.363 0.203 -0.799 0.149 -1.103 -0.099 c +-4.342 1.149 -7.252 3.02 -9.758 5.485 c +-14.59 10.242 -17.28 16.596 -17.334 23.375 c +-17.388 30.155 -14.798 36.55 -10.041 41.382 c +-4.466 47.047 3.468 49.755 11.33 48.736 c +11.409 48.525 11.556 48.34 11.768 48.222 c +12.244 47.956 12.844 48.127 13.109 48.603 c +13.375 49.077 13.204 49.678 12.729 49.943 c +12.287 50.189 11.742 50.057 11.453 49.656 c +3.3 50.713 -4.923 47.905 -10.703 42.034 c +-15.633 37.025 -18.318 30.396 -18.263 23.368 c +-18.207 16.34 -15.418 9.754 -10.409 4.823 c +-7.818 2.273 -4.809 0.338 -1.46 -0.956 c +-1.429 -1.267 -1.253 -1.558 -0.96 -1.721 c +-0.485 -1.986 0.115 -1.816 0.38 -1.341 c +0.646 -0.865 0.476 -0.265 0 0 c +f +Q + endstream endobj 323 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 396.6318 143.4166 cm +0 0 m +-0.594 0.332 -1.345 0.119 -1.676 -0.476 c +-1.83 -0.751 -1.862 -1.058 -1.798 -1.343 c +-11.367 -7.272 -23.838 -5.94 -31.961 2.055 c +-33.759 3.824 -35.248 5.824 -36.406 7.986 c +-36.38 8.022 -36.352 8.057 -36.329 8.097 c +-35.998 8.69 -36.21 9.441 -36.805 9.772 c +-36.975 9.867 -37.157 9.913 -37.338 9.923 c +-38.598 12.874 -39.272 16.075 -39.299 19.381 c +-39.351 25.947 -36.842 32.141 -32.235 36.82 c +-27.88 41.245 -22.141 43.813 -15.977 44.123 c +-15.87 43.937 -15.716 43.774 -15.515 43.662 c +-14.921 43.33 -14.17 43.543 -13.839 44.138 c +-13.507 44.731 -13.72 45.482 -14.314 45.813 c +-14.909 46.146 -15.659 45.933 -15.991 45.338 c +-16 45.32 -16.005 45.301 -16.015 45.283 c +-22.477 44.963 -28.496 42.273 -33.063 37.635 c +-37.887 32.733 -40.514 26.248 -40.459 19.371 c +-40.432 15.895 -39.719 12.53 -38.389 9.429 c +-38.421 9.386 -38.454 9.345 -38.481 9.297 c +-38.813 8.703 -38.6 7.952 -38.005 7.621 c +-37.828 7.521 -37.637 7.477 -37.447 7.471 c +-36.231 5.194 -34.667 3.09 -32.776 1.228 c +-27.801 -3.669 -21.27 -6.18 -14.699 -6.18 c +-9.972 -6.18 -5.225 -4.876 -1.023 -2.229 c +-0.464 -2.434 0.176 -2.213 0.476 -1.676 c +0.807 -1.082 0.594 -0.331 0 0 c +f +Q + endstream endobj 324 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 371.8549 133.5221 cm +0 0 m +-0.455 0.254 -0.999 0.187 -1.379 -0.124 c +-5.428 1.437 -9.066 3.774 -12.197 6.856 c +-18.237 12.802 -21.601 20.744 -21.667 29.219 c +-21.735 37.693 -18.498 45.688 -12.552 51.728 c +-5.583 58.808 4.334 62.193 14.163 60.92 c +14.262 60.657 14.445 60.425 14.71 60.276 c +15.304 59.945 16.055 60.158 16.386 60.752 c +16.718 61.347 16.505 62.097 15.911 62.429 c +15.359 62.736 14.677 62.57 14.316 62.07 c +4.125 63.392 -6.154 59.882 -13.379 52.542 c +-19.542 46.281 -22.898 37.994 -22.828 29.21 c +-22.759 20.425 -19.272 12.192 -13.012 6.029 c +-9.773 2.842 -6.011 0.422 -1.825 -1.195 c +-1.787 -1.584 -1.567 -1.947 -1.201 -2.151 c +-0.606 -2.483 0.144 -2.271 0.476 -1.676 c +0.807 -1.082 0.594 -0.331 0 0 c +f +Q + endstream endobj 325 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 462.5444 388.8503 cm +0 0 m +-0.018 0.011 -0.031 0.024 -0.049 0.034 c +-0.979 0.553 -2.153 0.22 -2.672 -0.71 c +-2.969 -1.241 -2.979 -1.849 -2.767 -2.372 c +-3.259 -2.83 -3.746 -3.296 -4.22 -3.778 c +-21.933 -21.772 -21.704 -50.824 -3.709 -68.537 c +-1.982 -70.236 -0.119 -71.794 1.841 -73.195 c +1.792 -73.917 2.146 -74.637 2.82 -75.013 c +3.75 -75.531 4.924 -75.198 5.443 -74.268 c +5.962 -73.338 5.629 -72.163 4.699 -71.645 c +4.089 -71.304 3.376 -71.336 2.81 -71.657 c +0.958 -70.327 -0.801 -68.85 -2.434 -67.242 c +-19.715 -50.231 -19.936 -22.334 -2.925 -5.053 c +-2.411 -4.53 -1.882 -4.028 -1.347 -3.536 c +-0.553 -3.687 0.281 -3.333 0.696 -2.59 c +0.875 -2.269 0.946 -1.919 0.933 -1.577 c +12.53 7.71 28.164 10.569 42.401 5.801 c +42.488 5.232 42.819 4.708 43.36 4.406 c +44.29 3.887 45.464 4.22 45.983 5.15 c +46.502 6.08 46.169 7.255 45.239 7.774 c +44.498 8.188 43.607 8.053 43.011 7.514 c +28.258 12.466 12.064 9.549 0 0 c +f +Q + endstream endobj 326 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 465.9013 377.6139 cm +0 0 m +-13.6 -13.817 -13.424 -36.123 0.393 -49.724 c +7.025 -56.251 15.837 -59.828 25.027 -59.828 c +25.653 -59.828 26.28 -59.811 26.909 -59.776 c +27.077 -60.075 27.321 -60.336 27.643 -60.516 c +28.573 -61.034 29.747 -60.701 30.266 -59.771 c +30.785 -58.841 30.452 -57.666 29.522 -57.147 c +28.592 -56.628 27.417 -56.962 26.898 -57.892 c +26.886 -57.913 26.88 -57.937 26.869 -57.959 c +17.496 -58.47 8.397 -55.053 1.667 -48.428 c +-11.436 -35.531 -11.602 -14.378 1.295 -1.275 c +13.808 11.436 34.087 11.972 47.25 0.219 c +46.974 -0.639 47.33 -1.599 48.146 -2.055 c +49.076 -2.573 50.251 -2.24 50.77 -1.311 c +51.289 -0.38 50.956 0.795 50.025 1.313 c +49.56 1.573 49.032 1.619 48.557 1.483 c +34.678 13.968 13.225 13.434 0 0 c +f +Q + endstream endobj 327 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.9936 322.3092 cm +0 0 m +-0.93 0.52 -2.105 0.186 -2.624 -0.744 c +-2.864 -1.175 -2.915 -1.656 -2.815 -2.103 c +-17.792 -11.383 -37.313 -9.299 -50.027 3.217 c +-52.842 5.986 -55.171 9.116 -56.985 12.501 c +-56.944 12.558 -56.899 12.61 -56.864 12.673 c +-56.345 13.604 -56.679 14.778 -57.609 15.297 c +-57.874 15.445 -58.16 15.517 -58.444 15.531 c +-60.415 20.151 -61.471 25.161 -61.512 30.335 c +-61.593 40.613 -57.667 50.308 -50.457 57.633 c +-43.639 64.559 -34.656 68.578 -25.008 69.063 c +-24.84 68.772 -24.6 68.518 -24.285 68.342 c +-23.355 67.822 -22.18 68.156 -21.661 69.086 c +-21.143 70.016 -21.476 71.19 -22.406 71.71 c +-23.336 72.229 -24.51 71.896 -25.029 70.965 c +-25.045 70.938 -25.053 70.907 -25.067 70.879 c +-35.183 70.378 -44.604 66.169 -51.752 58.907 c +-59.302 51.236 -63.414 41.084 -63.329 30.32 c +-63.286 24.88 -62.17 19.613 -60.089 14.759 c +-60.139 14.691 -60.191 14.627 -60.232 14.553 c +-60.751 13.622 -60.418 12.447 -59.488 11.929 c +-59.21 11.773 -58.911 11.703 -58.613 11.693 c +-56.711 8.131 -54.263 4.836 -51.302 1.922 c +-43.516 -5.743 -33.293 -9.674 -23.007 -9.674 c +-15.608 -9.674 -8.178 -7.632 -1.602 -3.488 c +-0.727 -3.81 0.275 -3.464 0.744 -2.624 c +1.263 -1.693 0.93 -0.519 0 0 c +f +Q + endstream endobj 328 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 475.2114 306.8219 cm +0 0 m +-0.711 0.396 -1.563 0.292 -2.158 -0.193 c +-8.496 2.248 -14.19 5.907 -19.091 10.732 c +-28.546 20.038 -33.811 32.469 -33.915 45.734 c +-34.02 59 -28.953 71.513 -19.646 80.967 c +-8.738 92.049 6.785 97.348 22.168 95.354 c +22.323 94.943 22.61 94.579 23.025 94.348 c +23.955 93.829 25.129 94.162 25.648 95.093 c +26.167 96.022 25.834 97.197 24.904 97.716 c +24.041 98.198 22.973 97.938 22.408 97.154 c +6.457 99.223 -9.632 93.73 -20.941 82.241 c +-30.588 72.441 -35.84 59.471 -35.732 45.72 c +-35.623 31.969 -30.167 19.084 -20.366 9.437 c +-15.297 4.448 -9.409 0.66 -2.857 -1.871 c +-2.797 -2.479 -2.453 -3.048 -1.879 -3.368 c +-0.949 -3.887 0.226 -3.554 0.745 -2.624 c +1.263 -1.693 0.93 -0.519 0 0 c +f +Q + endstream endobj 329 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 635.8622 181.4743 cm +0 0 m +-0.009 0.006 -0.016 0.013 -0.025 0.018 c +-0.5 0.283 -1.101 0.112 -1.366 -0.362 c +-1.517 -0.634 -1.522 -0.945 -1.414 -1.212 c +-1.666 -1.446 -1.915 -1.685 -2.157 -1.931 c +-11.21 -11.128 -11.093 -25.976 -1.896 -35.029 c +-1.013 -35.897 -0.061 -36.694 0.941 -37.41 c +0.916 -37.778 1.097 -38.146 1.441 -38.339 c +1.917 -38.604 2.517 -38.434 2.782 -37.958 c +3.047 -37.482 2.877 -36.883 2.402 -36.617 c +2.09 -36.443 1.726 -36.46 1.436 -36.624 c +0.49 -35.944 -0.409 -35.189 -1.244 -34.367 c +-10.077 -25.673 -10.189 -11.414 -1.495 -2.582 c +-1.232 -2.315 -0.962 -2.059 -0.688 -1.807 c +-0.283 -1.884 0.144 -1.703 0.355 -1.323 c +0.447 -1.159 0.483 -0.98 0.477 -0.806 c +6.404 3.94 14.395 5.402 21.671 2.965 c +21.716 2.675 21.885 2.406 22.161 2.252 c +22.637 1.986 23.237 2.157 23.502 2.633 c +23.768 3.107 23.597 3.708 23.122 3.974 c +22.743 4.185 22.288 4.116 21.983 3.84 c +14.443 6.371 6.167 4.881 0 0 c +f +Q + endstream endobj 330 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 637.5781 175.7311 cm +0 0 m +-6.951 -7.062 -6.861 -18.462 0.201 -25.413 c +3.59 -28.75 8.094 -30.577 12.792 -30.577 c +13.111 -30.577 13.432 -30.568 13.753 -30.552 c +13.839 -30.704 13.964 -30.837 14.128 -30.929 c +14.604 -31.194 15.204 -31.023 15.469 -30.549 c +15.734 -30.073 15.564 -29.473 15.088 -29.207 c +14.613 -28.942 14.013 -29.112 13.748 -29.588 c +13.741 -29.599 13.738 -29.611 13.733 -29.622 c +8.942 -29.884 4.292 -28.137 0.852 -24.751 c +-5.845 -18.159 -5.93 -7.348 0.662 -0.651 c +7.057 5.845 17.422 6.119 24.149 0.112 c +24.008 -0.326 24.19 -0.816 24.607 -1.05 c +25.083 -1.314 25.683 -1.145 25.949 -0.669 c +26.214 -0.193 26.043 0.406 25.568 0.672 c +25.33 0.805 25.061 0.828 24.817 0.759 c +17.724 7.14 6.759 6.866 0 0 c +f +Q + endstream endobj 343 0 obj <> endobj 342 0 obj <> endobj 341 0 obj <> endobj 340 0 obj <> endobj 339 0 obj <> endobj 338 0 obj <> endobj 337 0 obj <> endobj 336 0 obj <> endobj 335 0 obj <> endobj 334 0 obj <> endobj 333 0 obj <> endobj 332 0 obj <> endobj 289 0 obj <>stream +H‰ìWKŽ%·Ü÷)ꯆ¿ägë1à…a†>Àƒlê ÍÂ×wDd²^µ47°1ÀF“E&3##“_þþõøò·¯éøӟ¿oéп3Ùñóۗ¿üŽÓKÍgó°eg™Ço?¾ýëZ<¿¾¥³ØñŸã­a~ԖÏlåxä¶ÎÑë1;°>üáíËWlüüväãøöü孕såq´‰­z9J9ûÇ£œ³šŸô+Ί“'6žëx¼ ùçñËeʀٿb_¢|Œ…Ë,G³3çUŽç‡Vò·œ¹c›tâÄ +ã1†åøÏÁó ç[ÚðQόÓâ#‰‹|ˆµkãü±¦¹÷ „µ:+`Úߤ½ÏÐ_?ö[í8'm¾ $Ð~¥J§íO4äžÐ$Ó=±–[¯»aDº)Ù³~þþpöDþñÉ·í¬ž zµäzóíY+¬¨ëxÇxO= P–%KK‹áó .±*ÀË X1ΠâÒ"¢r¦:ÿ,YœoØÉÇÏ7G>ÿŽoRÛ«ëÙçØãÇ íLd§U°†Î£ãÌAáMŒ{×ζVÌÀ&ÌØ9Ê8SŽËr¹@_ÝïÎ/2¾‡]‰ckûV­ëôj3fAKVÞcØ8¹¯#X¯ûtý–F¸WÖäí/TýöC+øÛÎÖy£„0ûxûÕ鑱§‰¶4‘4Ϻw®¦³9Úæìg> ÅRÇp‘Óòì/>` : +GÎܸOŒÀ‡ÔtQQÐ) §¥JÑÑÿ (­èß7LþÄ,Ȝšp¹·V§)U–]ãeA FnâƒÌ¥*/ä\\§:|Á½ur>{6̷ʴɽF±nȈ[b«Sö‹Õ³É½TÆNNHu)rU«%ßxè‚6”E“åÔb¼]ê×âv~0!—R+oðÜWÌK}ªA‘Xlmœ‰Ü”õ ¹_”§vQÓÌT®anæCHþˆOçtÔQ¾U ÛBö,„!µýeÈ%ܑu›B×;‚£|³Is S4r”©ÄLbIuçÎ J~õ5z9ÄÍ!a”aºå‹;¢:”¡,t¢°¨< ä GÒ``Ýñ¼ŒÂh9z•vµgÅUÍo¾©$iäOÐ7ni8Ló9(ò×ðË.°öÁ|7þ×ÆÚH· O÷¬û‘~ù¸ûø÷ÉnpF%÷™ìëžì¬3TÅZ]I/ÚK†§ä9¶+[yñµÎ áÙ.òJÌ|Lr™ILÉa–r°qgÆ ¿E®[š`òìýxð{R¥WÕîd6ÄU:aú;Ç<Œr„³U”,v&$P«.»þMΔ]҄RZ+ cÒSV wž5ƲÒr §9¾·ÂÈîÕđ ˜ £‹d7m^»ŽçLBRNww­£„ž½U™$Â8Mž§9Y «ZÝ0í¤$í_Šo]Ìó* «P hÆ0-bXVáù¸ÿUŠŸ#òe˜8Ò¸à“Ë—–Ç™l,{ܧ_j•3àBŸRoX-èªÙ½ S9=ŽïÊ_]yÐ÷Eú0%|³g.ѲÜ[7u ªÆµ©”ÓJrÀx®àL2.`æ\žSÞÙBšäƒò£N±ÖØØÇ4¹Œ>Ãõв·cö‡n¤£4È^™òFf*]o.2Ý[×^u¼s¨uéë%›î¹DÇîQš,x¹(säW”œÇ¶áUù¬|Ÿ#&2¡8sÞQ…•LQ|øÜK¢-~ùZ‹ßÖöXz×xçĖ½DóàÉHóº'jŸ^]1‡wÀª:†¹öêçf2Õ}–…¬ŠZô BI…ËôÝg߈ßxûê«Ù6û÷N;ßY¦<¯SQDÖÍW˜ +u¹”Œæ£ƒ`Ê Ö7KýýåsÞy%ëßõÿ`åOÿ¯üWåŸÿ3•ÿFÔÊÕô* ÑnÅ°È@¥‰ßà„1Éɑ²LnE« WV6ŸÑ^y]õ†ö¾ò3â½k¹Cë38õPÅÎz"ù˜ÉX]‰\Ü#³ëu¶\¢Ó¢’½Y1Îzg<ßE®›**ej‡C‡Ò$ʸŠF½¿wŒm9BUáïA¸ +/ØøۏœÖC¡N‰ÝÇý Í?¯¸'!<„=<¹v±0Ç$ˆ×‡JzÐl<㸾ˆm½öu¤ýÔkÚmº>¾ÛÌ{¾¨o<¾úäØü]=˞ý#cÏÚÕx}P?¥9˜b¯¯Э1”rKå{¿ä¥°ƒÅ¶û!&²&çòïÏ‡ÍњVZ¹ßŽ†A,66¿Ç)ÄéŒR•p.@Ÿâƒ# +;B^ò mµX&‰4lmôë.öÏïҙڪˆ–á`~ˆí‘бäƒÊUÎÙ´e0‚¥yBáW39Œ4@í‚ä“žez÷á'ÐÑZ"¦™.;²»fŽÖ ÌìÝq\B3OË.çp0žgÜ}Tdj¶`Î/˜BV@+‡P.øË¢0–/â»HBƒn’’¯»® +¾¾^Õýœ¢9n‹º©ê– ÁUI|pßàªÙ‹.ÜûÚýÚ úoVO\ûDçIeÎߐ?qž|"2h/O¸sQʵ ›ì˜µö 6tZ"ïkÒ¦MGY¶˜Û•µÒàГ6%dp°ó׈KÙaF®Bïšåaø0‘ÆXb¬dÁò¿JLË|oø‰˜VïíҊÑ-奕îA1+u tdz#D‡Cèzï8îE6è| ܕÛŠ¹W­7Ôªì3ó€”g=›]’Ì +]+¸`ÝF«ªpŒB?Õm¡´«ýÁSu o˜ÙÛbP•nÍn.Ç·yVæx~ˇús÷+ UùôT\Ûâ\Ƶ³C¶êÙ{QÂЭ^FD­”Ám†"Īšè§zlƟSøžlKšò°šßÆzXMfWÃo·J¯læ¹֛lên/¹éþ&î©m4”ì÷Á8©&Bî #Ôªö»ÛäjÚÉ^ü¿ïkpv–ÆÄ4ܝôOѨأÊeþGþÎ3XF>¾’ܧÎ´h){^÷°®­¥gÉgÎ6åuk1q¯îbÖÍ=\¹í  Õ}6íðSpno×½¨YPË«‚ŸÝЀ CÓ¢÷s!ËÙÔÙx³ÅvÑBá„(‰®HÊ¡S‰`rBب¥È¡äĞ'2À¦trñ~r‚N ¿¨tÑSÞ½‚‰nó¯qr˜Ìì÷Bç׿9sg@Œg Ͳî'9w±‚…l÷ +6Úpé»4™².7–Œ5ø×P¸ñ!]H¸xƒi6Ñ]Ñ Œ®©éYM9MnMÍ'Ä_qˆ¯[Ä ½‚ò¯g‰ +Åù|tÒkùÓ¾q’xI ¿ÂáxŽi Vó,ӎ Í2.`½s¾½_¤cù¥buˆJø1Ê>ï ¤ièö3Äéü(ìW‡#nZ\\‚ êU”h¿Ñ€CSÐvFñø‰.“™O‹i‰3Ígñ¶•î•9Œ Ç÷ã‡×¾yL³ üZ +}ó ne ²ÂO¡ié2ŒÂ&%>”±[´¡´ãÚG^1‹( +dÊ1æ¥ ¶}t^¥K“e1Ê5›­i±ÇQkçU©3 ì\փk± kËsìê *ˆîmˆ«Ü}ãþÚHJ –3ñ‰ÜZ#yTœ&HÞ³¹z  Ì3Ÿ{E͎õ¸ÑÎ.&9R»×Ù¯×R.»6Ý¥$K {»ºƒ¦¬ÑV„BÐDÏÄÚñ…eÇ°˜èہ±?ôM’xO^8S ÿJ` Ü£¬Ã“߀ûn6²u´',IŸ®ÛF#»½ ÙI·[«’Úc¢«é°§:ù.‹åêrp˜þvÓ ì±V›­nSœ0(?ñ‡Õé}ëÜdN“A®}ߟ…1îý†×Óéqý¹­F³ŠÉm n¼Ïüܛι¡-:y(>÷y²šËdµ³Ä¼/…ÄÅtÈòú§Ô)®¸ +t'‡¿£Áõ­êƒ”ñM¯K="*Ú¥}B5*Ðj¾L ֈ~óÏüêë³h#2ßSm8Xæös)z®Ñ/ć¿¹rdÁXÀ<Þ „°Â@Ðǎ¬Ž¬s°'jãÜÃc×ÐÃa}6ª“ç6e6ó!¡‡‚ ´‘ùØHÁµd¤¾W <]Ïo|m©åšŒ}ïã7ÂW£#{±<¾ÀÿOǞfáMæÒ¤—íRˆ«— +ˆŠoÀM @ë„t)xØ#’ÿ†ãXñ‹l×FójÄv%çs/ª…ÂÔúõªÝ®¿n¬Œ§72¶ü:½©¶x(îÐ\ãZj2¯;&½øI—,ÈpõùrÊpù¶@*R‹ðU9xñ#K¢•M8éd/D Šv¥«ÐZb‰r>z>†HT)P)*Ö#â"Ý kQ3N‡§žË­}!<uCˆ@aS€¢ˆû`£Å.À»|=7(PD¤Ëÿ} &Ñ纳—êôZtär7‚`¯ÓÚ= ¬üýÚ×/«éóBT˾§P‡A±é)CÏæ¨Y u ¼öùN²0¹å’]³ŠQ›$?5³fÌe½p›Ú:ß±ŽÚ®P±+opàè;×èŸ@˜ÜîìQë~ Ž.ÅzŸ“ÛRkb&˜ÚÕXê«b£TòÕ¬Fê¬æ=ÄÝ0…‡ †þÔ^CÏâßSïû‰öœa$}ªÕ¯`6àYXééåQOâR¤_w¢arJþºzµŠ¯V]ƒ»§ù€Œn› +ŠU ³ëw݁ Lãë՝ß(bHQ1-…çySŠèÉÆàu fkó€p•1Y¦žž·@½í¥m‹£Î½$!«ê$ÃøÔ@£Ï7`³—-ƒ1Í\;¦a¤æ T­E’[O4àDŸgöñ@‰úb Ô$|Ñ.Yj i•Çÿ(ÒXuS.ވ}»Ëvxv ÆP-ÁCõ¸bŠïµ¼n ¾¨­¶Ôm¸úP³RjËÙ3=½x;€{–C7Ԟ9?íyáa ´çÒÊGúR¥ñ둸foÏøÕ>â×ú¯ãWÿ!~•wüZÏø5¿ä!ùëâ¬ÿ&å?Ï_ý™¿ú+õŸóWýæ¯öÌ_ù¿ò;}åWøš_ïê~ëŠ ÖÅm²Gmu=ÛõQ⨗ù 1²­jÍIì2kñþ0|„~'’7:OÂs¥þÎ'ι=QºŽ¡jú›‹¥!\û +µ{žu/7ší`š4ºÜöÖ´K„û’ŵ YaÜþÃ~µä֑#Á½N¡ XàŸÉó ôÂÞôý‘‘dÕ{’ ð 0@o¤ŠÇ"‹LFFFnàZ3ꆞwÌã+ïˆJyìϺ6¨C²êç°õº»j¬¼Ÿ‹¯ùþPdfµÆm€2Xf/øœÚŠÿIËÖå”LΎáhþâôN֓§„yÈ¥ïteûñïç¨åõf³ê÷+lßd(^NÉÊö «2Ía¼„Ð×ÆXô3ŠÐ…–™^uŒ¹J½‹¸ºO¼º£gl8_Ô¡NyÆç}50‚–îïcYhÄ«öfèJf”©¡æ€oäð0Q…YvÉ~Œµ,»±ÿü‚^Εå—Z0¾*ý.ý’‚þU)¿P‚~)Aÿ¢”ßP‚òU%èJÐ?S‚>$æs)È7-Pý?Z°aÄtkס}[ P$r=*ÁƳÛùá鑼Áð”%ŠuOö¤Äˆ`Ž&~§_€e7¥¶!ÄI%Ù¬_ÉNÓÿ;É–ÍŒ9­Â53¬·¸°H’tËù΢ çMq!zp^bq£˜eZÓh<ÃsŸ¿o˜|3ä¢ÑÝ :?hŠÈ|x $°,lhV<ï…áË™íÂ^÷óÙBà³äþjá]-ø£Î†"Š +³ ÿ‡¸S.î”p§ÿo¹c‡:öIT†œd«ð•áÿïz–v*Ø­Tm=º–¶¶XµÿOÛ2::&B¸ÃTï|ã݈oqiª’€®–Ë“<ևU¨E¾…·›K—Û¹ Ҝ':Ž?/ï’ÁàÙnöä äM½nó‚*{¼‹?ëâ(œKÃ÷ŽíGk5ÖEÈó±t{)gS¢x~Î×;ƒÑ5L*”¿²£b×p~˜HƒüŠÙÍgO´%óuâZì ÷`v+gx Mó5yC-Ž×¯ ɍX·kq¡÷—óí¾¶ê“wþØ5âDŽ`®2í)—{¬ÖØñ¹(Ãq´ÀqÕ¹ÇdtÙ'º¥qOÓRS¢šìØ\ÞÆ'Õ·#¶ÊùSŠ¡€'ä˜# ç#›Ãt;ˆCñãåÛáèè’ã‚ž ÿf ‹6­}ÀJ«Ú·ø›·¡W!Á¬¬µ©ÚQ.–Ý™ûfM`×8V·] S]§ú1“N³Ç”®f© ‘Çš%rb†¹Zôé¾ö +)Áùµü3:c´ÜÙ¼±øä•Jdµé6ó"³ªÏmÜ ©íš¼áæÛíòñÌ[Ïê›Íûã1|6ês¶ýHå® ¬¶²0¿•;“A¯sᮟ J#^ÿNã°hfª®gÃ$+ç'´ß¬jÐþ„Þ|Dé</V™[QŒJ!°u+n®uÃÓ¶åÆO Ñ$ÑLàÅUÑ,á…·PS}ÌB“çä†ÂìÕ¼xXSÛ`4Ûsè%>²éϋLc;Ëò(¨7Y,Ÿ’"4@_sfm;ÄÖ}‹Ô‹s¥î<úí˜> }´™<¬úèJŠh¹£®°FѬ"×e§5•fùã€:Fßzyè7ÙºbtøÂٔ–Íÿͼ˜\-¶¾q]RÖNÒy³Nd;Áµ¹ôÝÀ)Xæ×Cé§ÆèÎÚþÌÆ->cz;»óHQ€6ˆã#Þo«W˜˜'j™VÏN”Cp8‰×Í%©´Ó5M+Ð÷ƒŠ;%D:ß@­^U˜U췐FñÈ+É*é²²¾7Š¥'؝¦{k#­klU,uæ!jñ¦4zù¡SDS¨¥͵NÈæ³Öëë yOÛð»'ÃÍ[âH— •çC@ÑÔÓn$«F‘0BÚ Y£A=z{}$泖 ¤V‡®ÿ«ÑV£Ç¤Í®Ñ žøW0Å󄫯‚S7àTíBKàÝhņÀ‚Á›Pº5/à ãZnAi]¤°è¾ZñõKßϲ>+N_i¦-Ù)¥˜#žç¡ÆڐŸ[Ày=öU=¿ ë1®¬®Æ¡Ò—ö!ÍÏ 7{ý­Ò="ˆa3?£™Èí_ÌRÈ9Ýh÷w´IaFC §šïí ½¶— lÔAr9àªG™’Üt¿ÙY ¥wâ Ù2ìn¾®]Ϻ®ÁdÍgÄKɊY³G(›ššPºÐQøÁn©*õäF:À…tåÝX·€Yò¢È‰K…Üþóv/Ù¼Ò_˜é©ËÑŽø/Ðû‹e/.{4»Rí™5‹w“‡×ÌTî뽿\_ÑؑÏ|Ø/xñÁpÂDNJ‚<)!w>H»É\ö]Ú¸<‡VY)r:cÕ­xÑ À4ê·«HååhÈ¿Y½ªˆ*l=ƒØ‡ƒÞÿÃ~•äȑÁ»^Q`#öå=Äľèÿ¹™¹GfUqFähÞÂ2"cñÅÜ<²RÔhãπž"ÁF¢Á¾-Y½€¦X¨ŒAãœ%×£D5à7#• ðØʍ|)nê5>Ž+4£ŠfRÓ(‘2Tqjs3¥z°¿ ]V<½û5Ã7hÈÍê[[©?×·"¥Òá oõzñ1]Xי2;Öç,Îýª1¡Î(ð3à)wà‚* +hÕÍ^š#ú2SȆ[“·´úNKQu:jxøˆ@Z0@YoêøæÒ~Èv5€Ší8s¶1ï)U”“¨A3£zøçrô´Ô¿‡X¦¹I÷ƒÃJ¦·dÀËfo.3RF4|;ìæ²i{¶'‹ÝÝÙ.'ÀŸWÞ>ƋVß×̎±ÅŸtdݪ–ɳ¯Sªr¸¯?6½2ÓعÔ3%á{çÑ=Í¿Ç£6‰áðè…Á†øõbÎMuqñ¨áµç™]æ£yþ˺ÏÀ¶ÿ‘nìáñPJu@bG² By5V®ácç‡Yëò¸˜„ßëp"’]ÀßØz©uhÉ]Ϊ:E˜Žƒx•!gp6E´A©ÑLpµ]ó¡2“6 Â,óàäÂÊr)/XtH#Ðlhpúãو¯\WÓ@·Ùº‘}¾·£Vû[d€ôÈhóʀ 2lsÚ)`Ö̑Gyk_™!pÀZÅQ®jZ´’–s$€ª'€ÀIAOSãq²Ìrâ?ŽK×ð-þ3r¦"þÍ?³>Å¿r‹£½BUNµ©¨9²PhNɸH{A±Ò¼jFq„V>#öì®*ŽL“<»¿F%ó™Þ÷k ¹NDµ +ý¬ÖÅ2™ Q,* ,%†2D£X€1Þdž(ýß©Â5qC?ý¢çŸ§çR!t‘óߜœË°þs6JçQçS +à:‰¹ŠH´_¢™“¸¯„ôÄA^ÄãM}`9DVŒa,Ò +#'6E¨Aƒ-vÂ7¸öÑᭁ793!cžÑgÁB…;+u,cLˆVo‹ÿ“óbR!WÜØmsÓv^ÕǼ_/Ž‚tsۏàãéé$Tx3ðXá)fêÞ¡)uâ!]<ۊ¥†¶˜ÿ‰¢—Ðæ}ñÁÒ±¼—èPaû;üW͈Ë&áü¹öS÷Yúá¿g„‹´u‡ +§òZéîÞÐ*⚛y_ +©;~Mi¥Â4÷V.ד|áŸ4¢…šÞʹȗï¿Ú„HK›ÜU‚鉻–º„Œ ]UiΒ³Ø/"×æŽ9‹¤5.FHZ„!È@õ¿ †Ôû9Cä8ÅOººwFIì‡agÝO„SÑVØQ€‚Ém¼üÕЊƒšÚZÒr÷\€¯À!>§ã㷸כuÔèÖµÒÑ_¬ë<ڑPìKÕB‚ ™ œiZˆ‚A²€qÄÉ2fe%ÆÚIú’ Sd¼$ š^·HH]Óâ¹µËâ‰têøľl xŠ2‘.X÷ª +-)\á\ õO€0i$¤@E….ZºÈ/îY´èsv›¶VõH&»ðU +rV•WcÉe5‘ð·ƒÛGNP7Q,¿UýÖ̾eÿªû÷ºß±U©¿Hð/!ÁÞ,¶gfc‘ӝt“BŠ®àÌ¶²'óö隑r€#e!G+w¥Tá©`z +¼ac°‰6*Ö¿ânÂÁ1cþŸõ…ý†-˜Ëº­?ççÈ!taÛûÕ¤É=Ý-P–š@”ès®D:Lˆ\ˆfÏEõaÎI°½ÕyhŠ[OGvE/Y·º£÷£Á2 ñYÙNeI-Sm°"q â?jœX:5—˜ «÷8 +oäƓM%–á#&GÜ¡~€Yt…f{œ}ŠÑ9ÆšÞ¾®Ðı´•|mÒËí +ý£t5´&åLü$þÜmdd_FÑòå\$Æ+ )&I†âi)>ƒòñÎU±=­íZ腨lÔAèf¯õ0+%`œ¬ 8ðÍÁc€·×/êúK¨kL{:­û–>!Iª_}ÞÜY°;œjJgŸ7¦g¬ÅÒ¨>¦Óa.ŸÙ}=”ãF,9žò䪭`«{34VoÁ›>Sâ¨À½Ãۈ¢ÿŠ´`Š…ƒ=d“:Î_£ƒ‰`Kw³¢o°Ìê(êFU·¸+܆tÛ*šÔÕfžò%S¶pLÏ ŸÕŒ4dÍ™Êäè5µ[P²ì|(Þ)MçË%QÃÙ#qઋ íýеƒ¢Í¢b3´ÀÜÜîs +˼Ä*¦ÇNšÒ¾²ºÇºò­{¼£/’|€*‚]7&Ô¬ w‹¸‹8f%^4)1«j`šnݦDå¬Þ‰€¼PøÕÅݘ©ÿXð6ïÁpi¶P{¢§G#Á¯Ä2ó:¬0 +öTËëYÄ)Þ1~Ž\2ªÏW.¹Ø®c—°›ƒL¥u„á]µäfŠÜIº}ì*%Œøðܲ1î¸e^@ë +ÄùfÔ ÷‘ÞB§©&¾Â8Ü¡/Ìb?ÁÕmœ.;Ll/túÉsþy¾º‘„%JéS}Aï%Ã*‚¤FòP—Le°ZJ•µpÏ[c´ÓÈ IôIëpV‚P?¦¨J3/úyGkŠâôÐÅ A°àž³¨·H,%µ3—ò@'™i'@‰ñ9c'«¶= |ë8:IcÑv_ÄZ=_ÄÁ³Šg–Ô_†…õÐýô´2áœçu¬ÑY ‹Ó5ԣʶh1–l­[‹µOÄñŸß8og:ë#›Ìû¼hHÄ}ÎZ~åòmÔ|æ-Ëý÷ g5çË°”͏kƒñ¡v ¬#t…kE}Þ ÞOøç͓eÿ—ý*ɵIb{ŸÂø9ç1¨…½éû/:HF¤¤ç±ªQèjÀ›ÿÅ')•É°Ð#êÖ,ø˜ao™,0 ÔaÄ®W=™éfPÖ  u ™+®† ûXç%‡‡€¬Èô‰îG% F²¿âMÔr‰õŠ«ÙôØƆ”4¹fqšëä'\ãS J!\% an1¶º´!¾“óbqÕ í­«mÞÁôb+¯ê×Ü_/ŽÄßö~÷KÛâ aBóÃóep6ŠIíü:¾—9¶Y**Ìﺴj‘”R7û¢ÕÔbñ¸cà®dEQhûŽðÙÄe/{p¢²,,7ïÂ×J¥Àjj}íÙýšAkÅQ¡#@°àK9jTèóm©4¥ñÌÐè8zVC™½x®ÁV™eÊ à­é×1Égø͘ŴÃ3¨M>‚–9ݑû¥_°‘¯ÜãPþw£…Bêm Ÿµ|Ï>…õL´Æ7]“-Z#vnùɖõ°¥d½ÔKH +•’>S©, ú£ˆ=íçܬV¸vh8µžÀR]yf¢¥âÔ/PÝr µ ‡˜60dþä@î,LT2Œ4½­Z—ŒqÙ³ï²ò-xÙê~ôM‚êHù‹=kßµgëæ¬î‡;«wV_ܙzJ=x›¯Žu(?pgÅÝÙú¾;ëww֟î¬ßÝYþŸÙ³ü´gùiÏæӞͿޕ¯Û*[d²q«KwûKãے•îm•(Lê*]GS yãÐöùuŒ[¯‡]ó-+À¼S¢£bÞYé ?§£Î¼Ó÷=ïämñÞh(›*˽ ¤*r5Sä¬;`eŽzîIÏü-žP iÝì•Âæ¾c=Gl³¶Gà/%gú>IYVp_.”Ø҅ƒ‹ç¯îˆ›,£&;T1Ÿ–’¿©i ù·r»#¦Wv[!¨«ÜÕ= ùεƒ¸ õvšÄOÉföƒ4û-¼ŸQœ2§õõ—®ê~wÍ[£Z.Þ0þ®ã1³Ø 6´û?ç DãÀ!¾Qºjùˆ*Á¬|2pßþ ÕçVAtq(xϑW/-Rk:¢.áR}u!1Œ9LΠÛlNÚ ¾1f•=–£Ï^ƒŠ.T0p"C×¢‘AMº~ÓÃl AnÑ^Êêì\n5ÛIC¨//$Ý튞É;멝ðñÙ-±&çYøD}œoÚÅ+*Í}%Qz+ÑçE·Z¨ݝ0Ù/hÛåõ¤ÏƵ1=]›*VÔhŽßÜÑ77ÎÜI>w½.Zÿø,ѯH¹ØïàX˜Ê½l{ÈuÒ$Ú& µÂVrw p‘~»—{E«{µƒFPM|@{nªKÙla9Eª ì—g=í®¨å]„TúúѪT¥Žs§ìÄÀ"Àx5 .¸§"D`_R[›é‚UöoCýÛP¿TÆ02°‚ø%Cn¿ê€S][:ëo\†YCmÙ¬ù²ÚB%ZfHÍÈ*žÚ›ŸBE¢¶D¾L²ñÔG¥ÅÞ*ÀŽ´.Ëâ—-³uŠÑ¦¨Íãú5Wiiã©~ •ó ¼WؕY” È6 Äë¶k/?⩾Ÿ’’%ek—M`{õ]'rp«Wg 7'–ö–·(ðgõږrRÊ\^°‡îJ‡}¾ÀBË#(Kç-TxÄ¥RgéG^Ž¤j˜}Š_kðQÁý ; „:ÈFH!¿pДÊë 5A…[Á UùÞ·^ÿþï¯ΜfžÂû/Í(ÃÊÓ(qŸ„¥¶€6bÚòçýþ(ãñzà¼âý2ŒËòÇka[\·/ë m!žˆ-Æ +ÏCàè÷"–Ϻ¨ s–þ”|¤”,4DnwX)🝎 µyèÍ69— b{Añ¤uðš/(>qØô†èÔòvÍp‘ÍT.5>H¡Ö~Ýë"©E³L7”8’™dÞ4ßÀˆn™xé¢ñ¥r‘¤b¬YdRúIëeï¾W2YöáQ~³ìk`zÅ7ÿƤý6&ÿ(cÒûû.ù§Æ¤ý°cڟï˜ýkÓÿRnj{Ç´gÇ´tŒÕ”êZe÷ÇS«n¿Pl /†SZÔ·ñé]«ì‡rÓ*ƒí®U7ìZu~q¥9 ¸/­:[ˆ'b‹±Âó/Z5¬ç{¤ŠLtQE‡x]ÙA9Ú¾ÃҐL^‰RãÙ%{´IVä—Ï-ŸP—nªF&-Œ¿6ùÄÊTsﱪhw¾!þœÌwÕm‡ãÞèrۉ{ÞøheýªÜô·µ¸Æ‡ñ¯ÔÊ×!Y`2üEs£hGaYou;Í°f¨ü Z/<«ÍÒM[ÅÆPå˜p‡ +ºHpe© ÀBŸÙUþ˜å´L»Pzµ®•ý¶Ï7«YÞÛvÁdBõQËT[Ža1bùí$A{PÓ·Ã?,5«[ÍÙÆW{ȓ­4r¾‘_ÕÙM5TZü¾r?óZÅ#m( §ÛZ|Ÿ<µqï¼ñí¶Ê²”´nÉl½^ÛµHMøó™$6P™Š_W:…O„̃. +™å¦{Â0¡~u&6P"áµ÷ݲŸ°™h…··Ä7똡æ3"µ—6^‚\ukvliXt `ªªï|}¯¬KÛäl¬‡#˜¨£ésUâ¤Ä‚[DJÙ"™-‚T/w~ºÆJ=;ø,ð¦ò Çå«g1æµUlIFÞé¥(òUu_UQ÷½,x'ê"ÿÝu±ìÌnD»ÆCJŕâœFZ[>§¨f³ïiàH$I8._üžÆT¬O¶4Î9_gøUaÎn»µþí&á¹ÎGšÇqLò«Ü,º‰h­%J(ڊ… ™ÌÈ{´~L\‘rPßi³)ºŸñšÉû+´gIæ £H«ABØ +UW€ƒ].ëè Ãb8Ü7D{\®*¾—®Ë¯B·, ÛÊÐHó½/ÜÇ’äâ!L‡ŒDÉÝ-ý¦‚v¹xDB¦ƒ ·‡þø`K[–ÔºîKàL-¢½§Õò¥: •æÊzãûãã±áÉÁaÖsy\<¢ o,Yò¡©˜ƒEW:[:Çv¬ß|äâV†rÁ»òRoÒq!䨴MÇÊòi3ìq§L8ö +Ü÷Ûmð‰’0jâîg ¿bºe Û­…šÍâùí¡¡ÊµµyŸ.ùƒÂ(×¢©!Z@×ÑB^åZׁf¼Óáæ½Æ_`fü„uÌщ=ŸïLíê€äŽy`–Ÿ·ÀmËÁ\œehÖG¨¹˜Ã¡iò+©•3bæ”Ûƙ'›S²6òDñd¦Û~¢øÄ_oÈËýûXnD0‹"UY#Ù. +Ví玻~¸P/(¢Zî¢ÚÞÙp¢™6Ã;”u,À*輦>¿©Â»¾¯ )ûÍÏ–Ÿ{²Eûú7?ÿósO.òø ?7õQ¾ÓsÀ©»è:Û;_ô˗GŒ?”L¶âþÿ7Ê<^Ðÿ2÷l f¿˜èQ«¿ÿÆábfôc• 98ÿLË +ë&1ÁìÄÆ'€cúÊ×מgØZK#îóu`͏Î?]óéûÁ ^ó j­^ˆû÷÷àÔ÷´ÚVUL+s˔ý©¨2Á#ƒeW•ú0࢖>Ǭ4×<: àܱt=iQ“Š*Üìó9’på8ÅGNBÕ2¿qsþ˜Ux…EV˜ >£'l¤!ÀÄ÷ô‘ž“J_jYl™Y™¥^»#àAø¦Æ´ƒø,¶ö¡nË°Rïã{îŸxÝ<î'Àãàõi€ûßà~¼N|W„w=¢ÛÿÎèn›ÝèÕ•F?хäLŠü +1·JˆŸ%|´¹·ÀU(­Ü%SYŒƒÎä?áö>`°¹¥ÒY–÷‰ûûnŽúŠ¯÷ ½ë y]·÷¯õ‹ß.œB†t=Ý#P00ê×’ v«»q‚ÿœ4Æ/±¯Æ©Pî?0q öŠ,]”·Ú£3}øéVÙW´AÞÏ« ’=-º 5§÷óêÔXb-ÐÕht<#Ë>ZsQ†?±8bõNI[h2š·Ùý­³cͲÏš q¼JŸ“ôrÛB7½©\¸¿Ï´ùd¯äcúl”w¸f ‰ô¬¼Ë–®M×3£·Á1W Ϭ¶óâ‹”¢ì‰)2s>++'þ܋6(é÷™ëiøYòjvúB³ÿYT÷§mP½·Aó‡Û þYÔ~ª ê¿Þµ…^gª ªÆw³ÛFu×mb1l3hO%£ÖˆÏ¼™”¢˜PÉ€–³ÞŒRjLѬÈҘgå¥g•3z¹\ՕŽ Íý- ˜7%œeŦ.‚!83ØÝǔV|‰:¦ÃN†Òþ²ñ_º½•/·ýDÞjÑí¯:;¾·3„X·*ËD3+q£I¥P¥‚izt›j•£:'ò ðËwt—»ü¥ämޓ? :ØRŸÕ;'êÃÞWî«.…Pn¼¯Â$ØÊTõFìJwŒ¡—d\ŸO)»Gu£ìQs V¯F~wiÉ ´—YiYºY÷¨²ƒ«y÷ʲglq+¸•ýl¯Þ[¡5›~C: +a¬&M|…±¸C-^XþÂÕ}iu…Ø¡%RξúUåZýª|X  „•¤ô!0hvecHÌn® +}ÉTý +äÖ\oºHš»qöÎ@Êd ™>mxšš˜B–¦'ÀFù +Ú ‰qC=ã °c“Ç‹Z;+)TqÊW +ÐF"E|̸© /' DÍË9‚[褌Å؁6§”Ñ S6¥3#€}df®Ânx7Ξí‡zˆÈ.èôÖƒßMfã®j=d3]/xhRŒ*ŒA›÷`‡QðÉø;´O•±Ý•qý°2ŽÏ”±ÿ”2Ž_WÆaQÖ`ÃÓ³IäÝu+2šn¤.¸B^1ñÂoÊÅ^F{RDLz¬¦ß†eõÑ÷̼ +›8çyV56‹Uãåtu¦6¶ÕI|ëÖaí/üþÇ«Õ°¹¬÷l>ïÛãŸfµÁ,ÀÀ}Î6~åûÛßÇø´{6ª¾>¿áLë~þV³ù˙`Ø×ma-¡-œ7ª3܁Ïe–†”…#–#Ó¨Qê’rŒMÓÎz„ЕºìŠ²YÏÈ:¼dõ@²·Þ {ƒ“22ɸ9k™è”ä ây6ç™MßÂÙ§}a»ºÎÿñŒõ@™B¶vÆÈàóª`³V—vÅor^̲J>«³mŽôÄÓ®êÏÜeώkÚ¾ïþh›"e!ôB°!Ø>èFin“S¬µ`fÿV£=Ú µHS) ¸Bê‡l,žwÌܖ|# ¸ +õŸÃ>«¹ÍacÝcköwl ­- ×!Ñ3ƒÖª#ó2dƪ”z©R!§ÙLiJëyC£ãDugöáõ ÖÊ5z:P…oMö®hÉoø`4eÚáÕ±õ?‚E¢™ÊUýžÌ$¢‹À˜`7z©Í|kÞjþž|u(”Ôn?Žó½X* wnùÖÌôö— *&ݦZ×Êü¡OŠ¸mm‡ösnf+¼;´œšO`7]yf¢·âÐ/PÕrA+¶28 +¶²~üå@.­L¼}46= <ùGrþ”žïÁ[v[™$Õqã/.­¹K[¯&m}bÑê–GS¯([åÅ2ښrvz,ZûmôhÅ=Úr6>z´~÷hýéѺ<)E©‡ûÿ̤í»I›w“V~Þ¤e7iùՃª¶o&mþ²I»zÝ{Œ?ÕFOÚr(xû©nI³J÷¢JÔ&Քž£¤„¼lhþü9š.‡§Ñaͼ@»•Ðõ”¨§èzVºZ «ž®®§ï_ízچhà|k-˽š¤£8›:ž¸³î€™9ê5V¨˜þ•¿P÷ٛô; +Kúçó9b™µ}á%çù>IX–pßJ,éBê]KÁÚ%7YDPÀ$Vœ¿-SÑò^nåɨUÄj… ®rCÔö€f?—Ȥð¶{+Q$ŽxJ‹°¤ÙùËýŒâ-?mîo7\Uý°0ö³Õ°åâãß:3‹ jãA»ÿähò„d\pˆot]µŠ|*åÌÊ7÷íkȋl%D_<}—yFðQåf¡¢ê’-åW×Õ/‡Ã%ÜeÁcDDzIøꈁ^EEû†Ê@¾ /CÕ"aAMz~o±€ƒ²*;—[ÎvÒòËI£]Ñkz™×êT¾%Õä< ßdØæ\hÏ(â¸DéÍÉÁ–Ô÷-Ô©Ê{ãý@˜z¦Å˜þlLOÏ&¤ŒU5Zã77õÍm3wr z[´þ噡¯œÜ“°«ª–\ֈ=Ä:©m“nZQC -²o÷l¯¸9Ovä’éßÿBun¦DÙ¬aÙDŠ ¬§g˲»‚–wR`õxF&T‰£ÃÜ©Ž™t¯$Bº!öc)JCXéßÔG¼Éîzua;•;IãBÜËÃpTí-'²”B‹H*39V(?TÖ´‡ØˆÜׄºÒ /9’áÑ*õ°eñò#ˆ/r`™!×UëC'fÅE¾Âš s€˜±UPp|V6¥å#3šñ¼W‰“  ÏÏÛÚå<ÿ…œ'Îèue­…93ŸÉ–$S;Ê.!* Ψn†¬4æ¼³ìR‘IÖ“׎:y'è#›Œk··²û÷ú‚ÜØÉ<ítóÔÞ©)ªµ*ž2¤+y³ ‹ÖjŽ1÷yˆìËÝf˝‘ê?ŽúGý’͂QÛ_sÔ¨ö›£8ÏP:hÛG[Gm·YóñÚ°~ïHÄBNÒ­â­-¾EB"·xüÚÐÉK®I:Ü2µ E2˜âőÖñÌá!þªgîU• +emv8ׇ¬¹ +th/HKÐˋÁAå¹ÄXaQfQr0 «0ŸÛ®=ý$*û))Y¢qæƒË«ï8‘ƒÿË~µäF’+±}ŸÂ°¡ÿç<ƳèÙÌý$C)eÙîv÷Ã,ÞÀ›B²¤”"¥’Qò®¬æîÄn„µå% +ü}ÕÚ³xùû¥°؜Cu¥Cœ0ÑóÊÓy %~âPŠ¢pmÙ^—ø È$¯!uj~ô¬~À{7„nrØd#¤#—úf5'É —¾ê8 AM‰®Ñ3ÿé–ÿaãÈ?øtO8ÂóŸb”Ár&¶¿S™ ¾r‡âó}¼±yݯ/ÇzAÿ4ã²ø´hâ8vÖ +aÍX!®îO?“¼€@'e¡÷T+% 5‘Û 3íãw§cCőŽa.ˆå­™Ðšþ€Ö›èYj|ÀJ¢q˜”¨Â)ä\÷XI ºå&Ô§&™758°¢S&rê¾?K—f[€.­^0h½èÕ÷H&v;Ðô/–}8˜LËüs_B#ðËÆä²"äŠü`LâOÉ¸“ñscÒ˘¤Ó˜Œ“q“v“ø¿“t7&å_2&ãfLÆÆ$g,[V2å‡SΊ¿\1í㊩¿U1í7+¦f#i•·»VÿPl°Â¡U¹õžZe¤C« –r¼}AWªõ‡ËÌõ¶Ëеü%T×þkƊo­pÿ‚¡Êê &òD¤ûÙ2R^ÿX¯é|VêHRÔæ`N¾Žæˌ×ØõÆ;á6«0a0*È)ŸõáÛÀWãÛª gdPZ¤âãë7Sª]Ÿòr ³]Ï£tÞM [W€;™(=ã҅èãÌÊæ!`’FóCºžûܨXòã=˜þb;b'xû‚o¯šÆh$0Íì¶.:n¬˜».<ÌÖ* kD3ÃF˞jãßñ\*÷Gõk$¿d+¼b՚ý9Û^“_/:>þÒ>kâ7M|]ž‘k9¢¢Ú¼É^‡^{a­DÞç +äö!ɘ‚\âÊ/g™Vx)Íü~fÀÙÇ¢Ì(°D‰w"ç¹39Ï3•9²r9þ˹lŠ³1€U¯™ÃvS~&*>"cí"º™^¿˜MÁ¸´bŽƒm<ۍöEryA¼¶»¦â&}“ÿ¾ÖÇUNKè@*™Åè´î,e-üe[/ŵ¬%PÏ;ËÚxD€„,kjµ’Ìk‘jjw&ü£rçf¥S°ù¶ˆ­…´ÄZæš6´\²ú21I’yp¶Î LA$%Ä,ñnk â=uG˜‰sXK$¦¬/O‚/G,Й#–GãߪEW .¹ƒhûí’[^öÎívZþŽŽ¹KßÁn™m·¤XFâ=®g\˜Åa~I.´æ²@~aKàH‡‹rí%½6—òãŠT) Ojè ° qÁ@{ùŒÆVnµVà‚¨\ÁÀyzIÏjáŠ*êäXéöB¾¢#à‡p¦ÆÁzm…ö¦‚&:Z“÷Ï8œ>£ËH;a/dH—UvÛz¾,ŽŸØò> +."±¾¥ö˜5º¦tsÈLå‚Ãì] á›[˜¤÷’²QË'bŠËz䊯Kå?ãaæéuz˜˜Ó¸{¨ i ⭖ŽD5Éð|æ̈́°ª Ձ‘¸A$‰‹ªyJÁ©T'ÛijÌK!&ÎH{ôR\ՕŽà­ýׂN²J¸LY}Ef—\|†}­) $î’ðÒþmrgOÕfÅËDÝѳԑ&nÜЎ˜P£‚ØW>«~¥û© RÈu.¤¼W­rT߉„ÜhðýŠ{°/ñsÉ¿í}»Ùûr¸{¸6Ïð>çaïYËD‰f ¯0 ¦2µ3:cöZÖ(zõFöÐ_Îè}ÕX¥ŸòSs°š‡+¿«Ää®fÁ¡š…ò2EæhLu®æ!N.`¦ T¯Õ»Wp¸[ˆâ#ܝ +áêThEW§â¦zw*óèTÔ¶x§RîÊ窼ǎ)ªrhéM`ò`•[$f”4J§‚±ºêW –âz#Â*Œfè:›32ˆUæá7o;BöÒ¥î 0Q¾‚îÏ"kŽbٖdÁÀ¢v€••ª8Ä«ha‘">fܔ—½®nà0f•”1xvt­\rP[À’E錏@‘Ùtõ\³øsôlßìPÓÕâÐé! §‡¹áæ;oÍ2# +êž\/øèÖ¨ŽqÑæyÆoØ!¢=±ôû5i¬¿%‡2Ž•qܕ±œÊXNelweüPó]ó'KƘeÄö™Ö³ØVj6y' Z^EOXŽ³´ #û;cîNÉ »³‘Dv/èUeÆ9ö½­±ÙÚö‡MaO¶WÚ7|㍿ÿàxé蛃6nÿÓ-AÛW(“Ø"­.øjóí«|>ÇÁýx}am Ö?U/î „_¿íöŒsíOŸ€,?î2™>6* ­’ûí.Ñ϶K8ÉÆ4X6Å%Õ왦Ԍ2—T `“ªdoýzFÒa:@û4šŸ\°(()21“ìß ë¦,yªˆc,J#“mºæOØ T)¤„ËTÄÄnÀØ)Å3bÌ®¹nÆZ“#5ð;GögFW“#ñ·½_¦?[„­q–Pb\4ù‘ ŽFÒ§HkÃÈÆÍÊç +ác ¤–²„Aˆ‰”¹Xgé€a‰nÅQ,|”‡*ÎWgõeoÿ£ö6ÃCæ¯ÖåiAÕöeú¾LßcjK´Þç{ESÍL]ê\"iӂعZ%=kՎ¡%¿*£4fr­oÅ`Í]:¦–÷"5Õƒ9ª*gWMn'ŸlJ8:J‹áÿa¿J’㸁àݯàÈÀ¾¼G¡¤‹ÿpefR›Ã +ے.$rЍ.Ԓ•#ҖÆë¤â±…‘Þdž±ØK—„P¹Qëi¾Ôƒ-ó¼dç%ö^˜É@8}}:’ý?_þÅÄ×dëû:1¶ÒOa¿àÕ)!äb&§¿¸yÑ̟Ñ:Œó¿$ú;á2W +çFê” ož7p#ÕÒpÞ …>É¢À@Zá´Kø‡¾*ò…?$¤Ñ¥ù-CF×;m4*³¹1ڙŠ€›}Ï +”r/õK%¦šC¼Ýëb ÆZ]±£Ú"seŸòBäWêQá@™rr+ú9N0Ž$¹¶–þ(²e]GzÚ á[AÕ®ÇaæL®—kq=KHá#­T’èhk-¹<)%ÐG=ÚM‚ú|KJçz»v3[õ\s!%†q֍Vv!×Ö1À_s6;\:íLè#µˆ?–H©zª±ùÁ(Kü¶>jjL +h8y‡,Ÿ€ 6gp`ghÍù– ¬dÁõ„[ìïöãÒg  +#~g3j÷f4>׌îÝhþðn”¿ÐÒэÚьʽ}£†ïõe€Üьêñ¡if€ŽpÙ%¢ 7θ¶LMdZÕ%© `í™»˜ogӐ)‘‡V_ÂÀ£ÓÉ^S§‹¥Zñùö´,&M^W0깨Á®Q5Ó[$g·É1» Üÿ,êÄUemTgä° DS8Nùn4â‹Tß«A‹*ðd‡Id͛EmÃújŒ i +mïº×$ýî>|Ås½c®œä¹Ù{„3.x²fRC¾&s¥²wF¬û ®EY±^>m>]ää'9 GÍ´÷öo0s¦{34¨Un™åìOT5¹(4óŒ‰ZvC𲚠+§¶°w;ôŸÓà<Öem…øͺèÞYêûd®ø8›éŸ.ZÜ,a/T™t.×CˆX¯oaďæ—Þó>îŽ|êË GG5ëŽ2âk6Ž=„6]¡-WdËØrÄ5ýà¸NHc\û’=ÔÛ}ô[·…´”Λ=úÙÀÐü]H· mP­Àžmlêm‹‡xx=:ã\‡$¡¤=ëð¯dŸº²jL&ØÐÖÇz»ˆ'tna¬¶ Å\v˜P^f.ëÑj™‘×!ÕÚõa‚ÑìÐÜÛ ú} ½ã¬‘†Aœµ`^ÃÙ̚üŠúKéÐiY{ NÆ +Ρà’l¼&Æ@•æ,[†s. +®¯Kanø*+g7’* +s‡0=ÃÜòj¸‘FÊg)õ¯é/Q©á’ƒ³w\kt˜7Eæº@6ï_-WþÝMõÚ³³\0±¿úh¦Ì±Z®À}ÔTâ׃¿Û5®ï…kùèÃ[äÕ,UÒÅ{#rô7×é€+9®=]‘ÃéÓíú¯b›ÍvÔ*DbeEÞD¢”Ú¤Ušj¹”î@…Îúãž9d´KúxýÕI¢ +e吽EóÔXl ‡õÒ$Ɯ  bio'j9$:BÙ։<° m=ü.5Jﹶä?4ýË6!¹¸Ï½+ ֛˴׶ѮY ßpפšä?4Ì=©B¢§} )$¢3€) +M€â\ï¡ ïG»ö g`}­«Åâ“*rC+iِY¡2ÁFͱÏ-*×e‚)°4/öÀ«GKŠ×!5&Øh[³Ï§=L®ì[mQg&ÄŹó5o¦1œL¬6&º¯±÷T§boÍåz°)AÕ Û)…½Õ®/GRăÖ4yg7˜+¬ÎèþПï¹ÁtŠmX¸Ï_²)O0û€ ”—á2çÆïøF÷7Ö\zœ°pà„rý‚ˆç§ë»Ûñ =- Önôg×»ç ÙG^—õ#4v?4v¿iìþ-»üd»ýÇ$vg ‹þuX~ëÄÿ”N¬ÝØç/¡˯%ò±÷ß¡ý CۍJ­ßc0ÚÊ@ŽKA¹Ú4Åê€Ô8وªØ<‰{IêAhÛCþ ¤ýÐ[ŸÞ³òÃNª<>e­€8“¢ª¯ï‡,út+ùSR>5>ÈÀ5÷,rLz®JÏ"59‡‰èÜØ6Ò`úޕÈÁ+“)ª¤ìM]%yÆƨ†É4ËIÚT¨&~9RCÔW¸ëN“è½»ðU¡ÚŠQó¯P¡yþZ%ÚmF&YÛVK¾ÇÖ~‘’7˜ɏ®t •¾•ƒÍ*}øÅËZOny õ‰-Tä%yÀ¥áåLêØØëïÖ°»öªrhp‚eÚC7î™ š´¤Ê¯H ð5`µ °ë†AI߶Ãx vò`¥æ¼ñ æJ 3fŠÔjá·T¹T˜Ü³¬íb7W¨CJ0 ‰a鮡¤ÀyŽD8±-ÖK»Zr/4Ηöv"]AÊ¡^Ú:Q€ª]@[‡Ë ¥>ù£Ùe›ò¸Ï½+ ֛˴×þ­VD-ÿî2bok¹jl"”õfXbÔ#h˦}[Èm™-ÍóÀ¦à˜=Éy +H®¬ ØP¼!ÖUk4­2ì3F2•Q#à €¸G¨¤Š!ŽU‚DÄkéªTÆ×à ‘¹tµZs¹tY¦§ÝgMoA‚øë‚N aÜxpӜ7dîYÕ1É6?B´FÇŖGŒŸQCVáèËÔP^”Ãò~9œo“ÃúSrØN9,w9,o«˜Œ¼Ëí-Ýf±­ªàØȲ*RþÂ2™¥mxÙë>dH“•ôÙ9‚õôª2·ÇÞÖ¨lmûÆ6°dcÊd+§Ö,¥ÐDn° ìHdôbÒUf!¹–Êú}°;Ót>sÂP &‡³Ý-h,çqŒ]o|Ï«5K‹eI¬-ç$ò!.¨Z2°« ÞÿUGxZw"˜é7´’ž#+¤d•`bZJ^Ùòòz~ò[Y#à‚ÄJ~Lϔëx¿FÕ; +²~‰=óÖs.¨àbxç°í Yíӊµf8&•ݬNVv¼ë™ýJ-Ž²¡g+œÐgY0K;‰Ro®ëzæíÎæÈ¢§ËmüàÞ¬&ü›¤Ù°›Î¬tË´v«ô©†V!÷®‚ *¶^6 R‹2:1¦¢ÕfŸ5$£ Þëmì©3εH¢¦û¸<2$³¢°óBG›SÛg0§$ç×‹®Q [Òô¼ÏP,dÇ`z®ãV+°²±D42ºÎP­M¬ÜY|hŸBïXk°ðŠŒÑ‚æ“mÙÌ¢¼\©v9\Þ%«Œë­õI•}ÍLJ_}G_ëSR@¸k÷H¿tÁgä׫v¾…ÐmaĕN®xŒå¢ œed^e\·×Õª™€É !°ªÓw¬_Ò3˜I0LÎA´~v”9œ–È>¦ V]έBk[ ß"½Ú8«•ÁK;ýcú‚è")=V¬hÅ&e¿Ê}!iéë³èEù?ôlÆò,U+»o ‹ iËè¸:‰~VyLV"ù%m~y§à|à0VrETçÔ8q±™ZR"0Ý`Õ]–à×ÍØF·bº ž¤é"¢Ú¹TØ)ÌÉW]mo2±É[^ÊN9™$Þ€ÔéK¹'&9’ÿö„¨ÇÌ[ˆ[ŸÝ°z­VA¿ÔŽq´i›=ÜðnwSèINN÷çÕ·9ÜÝ3ü®æ‰`5OÌþÕ<puRWö_ÍSGóTîÍÓ­à´èC6ÄÊè–ü*,Þ`SpB»*¶ì-,`¿zÛ®o7wGk¦}ûèhmqµòl?`¥w·€áÊuáë Œ–wS*NJÿhñÄIjeQ¤Kƒc¢E&²À“û4‡AMCü¾ +Ïl#¼ÉpðóCðjˆh’ú?ÿ~ü\ƒY1;´“ò§1ýõ'Ç«Üi°³};Èæx»×M±ØO¸}Çfä‚9»|L¨–ç~ýþÅR׶º°ðë=ý±÷_£õ|óvx|ñ™µÖ°‡úУwè‘5q_ê°u^Õ£üO=êÿªSÚ]Ú©Gå‡z4nzÔN9¿,G56ë2Œ}>õ·cÔó‡-<^#˜¢LH'¿,Ø5Š¼±cµqñ êiñ‹¥cŽ›y*¸&X&~¤ÜfÍÉê/LÙQ™Î¦ÛöN—)Ë vÁíÞJJ6@;ªt1Hžó} ’‹äìçq©Aq‰JËK­Ubm¤a·¿ö\X–£ðRð‘èsAÐdˆuMµ»oÝ׀ôäµ:™7s×lk'>!§êþp^~铺™ÂIŠyZoõ +•ùŠªl”3™^©¢Æ~Œ¥x¾én(=¸)æ@óh¼+€ÖÒG>S¼{™6 .äu¤hÙ§A«פR;[„*YI—G\[s@’‘g嘅ªL/LŒô«©éxH 2Uxœ\s°¤[ÀšE$0)‘8H ÅÑEïsùÔÈ­ž6·Owá¬ûŠ…Jžq¿à狤\œdÄҥυøLU÷ž>1~ÆiZÑÀeXf˜Öޘ¼ZÈë¥OwŠ*ó„`°°4 :e»‹-r–aor#Sô<ôÕN̚…É´0ËG¬W:_©m,À«õa¶ï+WnXlP¹*³ô¦\ƒÜÒ"øl(¿ e@ÉϜ䘥Ìè[<§‡z¾ Ž+é¦À‚¾ž#iDl ‡õ’Gþ’{ááü´CbÀåÛÂ¥­¸ ´L0pž^ÒsPJê@.zü—D¤~¿v92–Œ -Àd¦¼1'(¾’ÑeOž}¦¿O»`"¤]IÙ«CÂTºU€E+ºh©¨÷P/úµ¥^‘föšÚ5XÔm€þ¢ÅâúSó§1Ú>C65׊-rÉb±<Ô. +ZŒ3Ž©%ŽHMuŸ¡šhICÆàør s‹¦áã˜ËHÊï%9•1)}™]|ªäˆmP.{bË´‰ ٿ吰úVsXõ«ye´çkV_à°qrX;9¬mk7/rXý»9¬n›ÂÆb°q#°ú÷Xµ„–³Îø!.ÓD_.Òbϼ³8Ë>ÁÝÁÁŽrÅCõ"cÉgÞ ¬ŽFPïrböûk QðþHamjž(¬B̚‘öè坠1+cê¾ô·åþ –7–әٟ¹n7Îñ!%@fÏØé‚hLí×fý•Î)èæ(? ÷©ò‚ó¥¥Ü¬`QT³zÈ>Ä(a¨ÎxÒÀà kQ`LŸˆ<¼ÀŠìÃÕ6û=Ô·¥|+ãLùu²”À;9Î+¯Ç•ï*F! ›>7efˆ¹×Ƨ¨©À˜ñr\KÅÇr-g¤ÞT£é<–ÿÇ,•ÔU +ò­x6ß,æ·åe͙˜Ð¨‘À§âšÙTM¬ì>ܖ÷Èy„k35tP{;ÐÞæ›öú’ ko×!Z’ä{_u­½ßQ׸sÇkíáø™î°ÞºÃ«Wôî0½ÚÎ[w8_ïÛOu‡ùìç‹Ýá<»Ã~v‡é×»Ãxïó?Ô^ÄyÆø+t šmy…ò|Q ó©„ýÝJX¬„委°þºöú¥;%ZœŽãž>»]Ñr-TAq åUT+²üeiÂ\ÓØö!3šÍòZ\ÑAù ªDmåÇÞ×Èlí ¸&‡ý¨¯*mZå¡ø!ñÓ- +ýÉñ ehÐøaŸxþ3Í „†‡8p‡ŸsüÄ7¦¿Á-âÜ+¸°³9I¾æZ§<÷ÖëkÆ:åZáü$û¾ÑÒ­8Š±ªÆqœ¦Úû4(0 žFi"ë‚ œ`Œ2ãк”Ç‚ >ý“øh=7교Ež¬ÐI)ŸAOöW\29€JZëýŸý*IŽ$Gb÷~…>eܗ÷ÈúVuéÿÆ8Œ”Jµ´ÕŒ™.R A:Iw˜¾zÆïd2Sæìݾ°.‰-]åïxÆz`O!¥`&/¡sW–ìQñ›'Ó â—Ù'ªMòQٟeŽ‹Û¾¯þhA¶Î—„‹¨ .¢|$±W_0²wË:”"qåÔY!WÄÜUêŒx,ªÖ`X" À°ˆþäë_z³‹1 “êø2Û­°wBK›ØRASôÌC+ÙQ¢AÀaáHRÊ[¡Ùͦ +]ª?‹ï>±ŒÕ—Ù—û ss„Þg¼x‹ÅçÕ¹#ì/Ëi„¸{µ¤fIÔ%ï)…£/7‰ã¥á±±®˜…–{2ãÊð‹dýùÕM AP›Uß?ækA&4K’Yóüi±¦CXÀ}²›jL­VQ3‰±OcKû«È°cß$ |;4=/oÛ27LtP,6ü3½ä†V4 NÙz e"üä@f--xõhiê20å­]Úó]–>ÏnØUEUŸñc¯vù³>çf­ü®W+o¬šý½yµôžWëß÷jåôjåîÕÊéÕþgV-Ý­Zúï[µ8ߖÔD;Z¢ë¸åòG^­•~oáúUSèáŠ×T 0©¤ô¼*JÈ«Fó:X—ëÛaÍŊ„Õ… qüuU›gü×­µOØM¦uþ¡3¡øek²ÍÈCsÝ­Iü‘5wk2~lMúoY“tX“ñ¡5§5i§5‰ÿޚ¤»5)ȚŒ›5ß³&9cÞú£š)–L9KfürÉ´J¦þVÉ´ß,™šC>+ow±:~¡Ô`†S¬r7潉•ý’N±2\Ê1Á†.U×É_O§R ¸R!è+DÍpßēRåaµP¹¢ôpSªjUX·4ÜÑC}æÁíVôÊô_þÅnZ´ÇTzª„¥Cé<¤nFßÀ½A¦ú¬OuIcUѽ½£……fçQ«U`g  È‘Ž*×éù•iú[Êzƺs Ë«J°@cø[‚ò¼%¹X/tÔf³RÈ\…·+)hH½+Û£HšDyëtz@¶^ihúÑúÊ¢Šþ^bûªïapºÏüúW¾ÅÍòÆ#†©ídwǀr?¡7-P¶ugSƒ +rzÿŠíË&GʁȎŒ³‰:‰c²3ˆ£¨°³r£¥¼GF¬û >+{"“.5ÜFón0'ŸÉSfÆ=¶¿x'`sŽ_Òl°z‘䭼ñJcGv mjmög°Dk˜¤õRDešdNQ?Õ©éˆRë?ãƒGÁO²“­š"TÖöɔjR͊¡ÞeÛLUdô낈,àEԇk¦©M®>%/ï½ñê·"-ƒŒL$i„}žÃEÐnuå3'‹ Ɉä±G“9œ$ë¹Q`êóU@;Â30?Þ¹ÿa*À¡5‚â3HäzPÙë{Õ +4¶ šÕtkÏ œ®.Wþ–3}ˑ½éOgoû³U½­d/õ›è‹%Qå¸kOs/¢!˜üÂ^Ē g\즑¹ ŠGµ¸›S[^ßu°òzuÂ\j¦½Ïÿú—]P\Ø)ó¡‰Ö+‚b™=ÖÇ6_ŠkÚ¢ ];±#‚b§¬Wàk^“T+Êx…P-*WnvÛ:{ß:*›k¤Á¹Ì0]0³&O¹*òàÞ >1k,ÀT>t}äÚÖÄwêŒ zÖ5…ÙƒÒ×ôdõrÄu9by““Õ¢«E—Üa¸ÎKny9;ÖHÙ­ æ•B yNޖå¤`Hd3®gÜ]ŸcÁü%ZP¹o«m›H§ûŸ¡Ÿ`¦‹Þ0±m„O!ȓôúl?c\0ÐZ>ÔÐúîtÚ¯k³k½p=¾9;sfÅ;é}ðÎÎ~)Èk‚hÑÆò$RlHœè|L'æ„GËr'‡X`hQ¨Vs߶ùuê(çèéhfu2Ñ/ê°úz†Ê:8Œ•TNÉen²éý<&Ç쀪ëLØŽp¼ýh1–¦»à¨ßC†Ã{™‚Bå‡Óóá“ÒJ¼C]é›è…DôZ…£~lF4³¾Üñ әíÝÊ$u³aÈ»íMæy´å^åQò¨)U/‚ÀðXz\% äiNN÷gõ¢»VÏá9þmcÏõü4”žÿ;ÿƒ›Mæ?¼ðË.n©tX¤ýÖç<µi)Æ¢£né¯Òâ6šÌÌ0Ðje#¼e(}·½¶\¿Úƒ;ZoFzü;ZKèÍ;òt? šd%év’¸¢ÚÁÉ^B.vysÏà …ö‚d˜Ê±ª­¼F8æ(k™Æqw*©nHî3¾/ÂÝ(Øùòó¯ósŸFV(ëO~þÿæçüA}2͟cšQ­«ÌŸN𧙦MÈ}[®áå&ÿüÍñÐ34Xõ|»ý’í:9C™ÿa¿Ú‘ìÚm`îUhóŠÿÏzT®rð”xÿÑÝyîŒF–ž¸¬d†}ÉC‚ Ðh7Kpàf¹ø+¿þE¬X}¼ì81Cï/voëbî–Ï€´ZÄlòµñíóˆ™GÄl{Á‚Ñøµ ÷~mìX7dIi Õ=‡Hc!kf +»¾÷/ˆ–IÆ(|1ùRvyFÕª˜ßgŒ×E ÙU×r&Ö8éY•.É'Ï5»…pzË= B–l:2¢”Ün„,±0e@hæ–<Ûöí¡Œ(Ú_•¤T)-S–Ž‰:ïgæÆM֝þDfZÿšºàÜš»3Ã,ËV² åS‹û¹ +g‘¸4ëëÂLÏÛÆ9¯{l·LíþDqž Ê7ÿÖÜ¿¤¹gšH–ß-çÿº¤™iý±)&Ɛ¸ÑsUb|€þHôf’Šàëî¢!"¼(K’ÙnVŽô—ÉþÂ@±èlàMýÕÓlFñl nlõ¤bžÎ²Ì©6̈́,Z"eá DÝ$ÚQ….¤äj½dé^,ÅÀ}+ƒ‰3=ñšTÓº^AÝát†×  ›cr‘PaÀfT—L52:~ØLvw´¼fáÐ6`˜¼Éó¸3«/O: U­u!bËw©Üëöïgÿÿzö’á’þ‰RJ*c#‡pÅQØKӀf掹²wÈ iђ*®ñO\½ø~GÚøaŽS|$Ӎ¸êl4·Òr¶%4…4›ïrîM<.(íc—]2È Ÿÿ¤~¼PF~RÌʈø2¬ûèãfOÒ\\/«‘ÇǨ5“éÄ<ª /–™H=ù˜wØÃ'Ôf!·ä&G+wUQbҟQ÷>`K‰‰^-Ö¿ÇÝì]¬sïñY_XF?`Éä»þœŸ£n¢×;Ø®ßgôŒvsw@Yè$șcLXŠ —OQ˜?¨’2Ì5óûZ®A P8E¯ŒDÛ{Š¤=­º±íeÖ•´IE±"øЪZ:5—˜«·8É>²T¤ÑE>Zk\ª)ˆ64Û¤ÇÆ&o÷¼6˜+ûÚÐ,ÏK[Éw“^úµÁdq—<ïæ—Í‘-Iû*<³áæµCBP¨ëɈ]âhm$š(JW]5åimwáŸp(â†ÊØÕj­Àø\zÖa/±þ-‡õpØzrØxrظ6^8lýÃú›Ãúå°u)ì6Ž/Öÿ»V—½óþ¹†hîòlˆNÕ¤Ò«àmˆÚDïˆà±Û)õõE™®nÐÆypÑÞdËÆÐ`j‰:-|¦;¸h¨£øÊ$dÖLukiݎ +ÿ—:žÆ¬³à.ÏÏ°SóEÆmµ"+Úw(]2›Žù,6šAf`&ï¼ìÏh®ðÆ ñ¾C]몃f•;{z”˜ˆÄ\¦oý- •¿)R·²œJ €Os¢Ï)Ô£&Ê80»è¬FÍø¥Ûª¬°0ï¾"T·)i™tõd­ ©F½IŽÂɛ•–òŒ/©˜¼UkÊÌ鎈õï×j^þ~ÝøòƒÅñ„|Àå"¸€xj^'²§½r„¼ò1¹ ^E"º2J̳Ký5:挚sd±|¾d¼>b»nT]Üe>–¸Æ2Âí®*òBD`v˜LÈT¥‘©+69Æ0p—Ð4±Öuèð$®L3KÆÆY*†ï¡Žv £Ñõžý3ü9[îuhñãÚxÜäÖÙ¿Ü½CUW&wÝi¾Ö”j<%ù¢A"#c:HjÝ!²SõEÑT|–‡ÉàE]Ÿ³lQéIápV*пLQˆfÞƒße¶8ؚò*VN2ŸxÓÜ×é"tbö¹G¦ P<"8|®0ûŠd ړíÔ@0°hŁ©@IíE«"y³€!™¡„—@ƒgÔXŠIoÄ;Ê tRHë…/ËM†Ê®*Ù]%U*ˆ—@ŠYù1ÈòáãÄЧÝÞîñ‹Åp<áOÃü¨†ûÓj¸ŸÕ°?«aVÃùZ ó§å°½–Ãös3l·m\‡.gÂܧÔÇ1Ún¤.8÷…èjՍ„ÄlãBèkjÛ¹¤G‹åôÛ°¸WL°~@¥¨íœóºç—Ź€±8Ý¡n5Ù8gØó¤üå…7þùwÎW«•e~Ù ?Ls"¿oƒx}ÏQþÊö|,XV†êcƒ‹;›ç/Å·ô `áó`6Ä +71¾\a~ßr´–Ì>¶h7j}*jˆ”_8rdÖý‚xó\—¨öd†QQ‹%XÀ¬_ÄD1,ÖBæsò}¢ðQ(ƒ™ì¯hd³ ‰Ì,dÜb„ß°¤S,›¤œÅVnø0…u•TTX´¢ª›CbËy3Â*ɬҔ͙žØ®êcZ׋#±¸}ß}hŽÉEB…f‘3ižI[_ý¼Ì†ÍR5•Sî\¥ +™D\ݽî-5fZ%ÊéØ^s@êé;zßúX{W“h¥¯?öxIåÓzì¬nïµg÷1ÖŠ£BMgeHÄRNQ*”÷¶Wš*ô»ùõ 3Wݘ}¹ÊiÔÌS5z8t<ó‹7VG$Nפ1Ž`ãiÑ,è%3ëÜ(èÚNƒˆ„ƒ%ÇTìFµÆmI)Wòsöñא~DIÝUÿÄÑð/9,J¶¥÷ gÖÙ*îåÑYï¤2Õ¨B™Ñ…×—×vŽ1.ìw”ZG¯!ݍVGå}‰¬Š ¿ƒÈ•z¡% {t<°dÃüä@ú,L¬eèdz fµÛqÚ§Äüpݨ ¢¨¹ógúŒ‚HUE¢lîý…¦ èG’½y!yhùE EòÐg’ú;Ú¢@+ßhÓÚü(ÐÚS µWÖ$ÐHy=žÿGúl=õÙxê³ü×õYyÕg½Í<úlÿu}6^ôÙzÑgáã95–é–Fo»ì[·ùں͛Thݚ'UbMbNi)%äi£mD¯åðv8Lšw0³Ô-S*Zžå +î´<§ûò”úÏZž1!X¿W¶^Hß$Ø@Äçi£ž94ÿʁ¿ªëìM:…¶æ¾I½8lœâ£äLß'Å Å䷋)¥ð̵Ô.îˆF–qfÉUd´”¨oÊCÎ+·Gǀ–)Wê*ÄòÐÔçR*|‚Þrt2ŽxKfŒ°_¤ÙoðŽ"?-¹¿=p%¸tÞS/Si↠Ž)>¨·ìbïîܜ×AQ6.j +õ\UG&õ³yû)ûöc¡[ÑÅ£=—@Ò$k±>I©qQÄWgºÙ§‹•–s ÌMÏ[‰hYöXŽþ<ÝRô‹!ԖÂ‘æà'ß´˜)$¬*rŒÇlgφø’ñÙÞùH²ºû¸v«\“øJȔŋvñˆJs߀—ÞœìHMÑO”w¸d¿0ë:Œð['£*h•DÍ—@Ù ¹1ùÌz6nó¥¸ynôš•cü<_«vROÚ& uϕÜÈc9¦¤^T!Ú(Z¶æC‚nrUÙLaiEÐk¶ûÑnt\æö€ +„Ì·>E+U•I‡¹3l2iF‘$YÍ~ÊmrÌ|Å¿Ióz†ÁœJ"D?∦ ‘ gÅô›t´Ü|Z ôcäUØ´Çá#0¨È¡ˆH•éG&„ ,€ôZ3¿øðÃ3®†­*µ—‘c>caÁQ­¯¨aKɍfôtƒcÕ£¨vPç @'N/€v?¿®ú™1o¦ˆÙó^¨Í.ÒLo²1É,Ýj]*µ*¶fE—ŽÅ5ʊ9%šÊ»‚£PßÙ£ lR°ÝVe—ñírG^Z/èZ¤u ݌¹)F]i©Þïè[ÑkM guO¼êEáàwO¼í”Ùöoyý[^¿ pËþ9uÀy¨ë€S¹[¤ÇU×ÿb¿ZrëH’Ø^§Ð$äÿs¡ÆÞôý$#«²žžd[ãi؆6Ròeå?È`4”¼n¯í1ói»+öO¨úõ¦øh:™ìØʅ7Ú"¤É `œ( %=ºäîyy‰ïvÏs˜V’0Ó´`Ü0&øz§a†´%B~\2=qõÙã0ë¹k£ †ÑOÄhÛ´G³hߕM†ŒsYn¡‰[u¦…uxç‹ieˆXÍ=ðÊ^]4¼é• n°å…êÛ¼‰ÎG°՝"ÓðP€‚µ6m¯+ý È*Gª P%o«*ðŠÁ΍.z).üÄK¢]×Ëz÷÷ÑYëáðÏ_mN;€)FCÄî¿tÛ8g@€À©Õ¿pÒóå‹f$ÙgX¸pgû/ÉG¬°Ë} `X»À/û.1Ãí9pú3Ê{°QÃ1Ձb«_3?^•2"ß@ àÉ-"½†Ò}³[ìýȊW´¾4~ƒÖ‡œnÈýÚkٛgZ1ºNJo<«²§Tf:"R%e[9ö!ã ֟]™3(s”Ž¤zÀ -LN½«Žô[ÝʧÀ¾º˜i{ù¦!ñ#õâGwâ~$]üHyíGæՏÌoû‘ö!?’7?2ßõ#s÷#}÷#é§û‘|õ#ãã~¤_üÈáè/wüŠ/Á›âò¥}ˆ/q#Ì|“0óJ˜º¦î„éWÂÄ7S®Œ)ï0¦GwúÛ%Qí¿0Í`†=QÅjñ\öDe¿$±¾({¢Ú°'ªí—ä#Ö LTÛž¨¶]è‹s—šázŽ›DÛó€TC.J—DU‰Õ3C¾AOª07m7â+D#rëx¤¢£ÏW`ø{^¦¥·®Héô0>©ª/@¢J“ØGzÑïÜIq˜4«MߌŠ}ìdÛ–âmDþyæ&qú[ÊjcݹºaVË£²–ôÌøï-ÉÆ:ãí0Í‘¹ +¸,«éÍP¯¬"Ë·Öáñ×CKC³¶Ðrk}gA‘º·þÒ}æ—ý¶VÍfz·-L¤LOÑÁ>IÀçC˜ºÇ8û” Rw AŒ-!ì $[ÔÙD\N7A’NªÍ8Jåè±#ØVE^jø°y)˜“Ïäàşwõ#Ž ß—d—c×lÏjÒo—vI°xÓ晏àÉõ|hóÊçp”-L™J,Ö ÝÒUäWð H)ûZàÌèí%ºž—­«£nÂa‘,eô°ÂafýlZ`Og–`à™\†¦ò†{íu(ه¨IPï$lŸ"!€Ý2 +²ÂÂ½Ý ”2°Ëf·mºhµã[òTnГÜûTžÒ®N²vé*NãŽ8%éOÛµ©]µ©½¯M•Nc؉›éJ¹‰¯ =¶2ŽLgPJw ÏF/žÄWòQnÆЄ‰|®$‹¼íó9¢³ÃbŽÃä®.S«°9oÚèÄ2±0“Êèà„…¾0ð; RÛËSmú÷Øå¶=!…ßz¯6±F®Ý½ºbˈ™W\rƵMý¡Á…G§cI SPŽJÎ,6_°ð0¶4 NuµÅ_È| à’Œ«ýU`MvÀcZÓÄ%W»—¥X0­™³÷BŽ)¶Ooc½ÐVO"{3-«½{†þ”<´+ŽAøò õ±™³´ßÕÀӎìmî’:´êUޑ*ÙÞ$3Biât¨=idái“3]kÁ£\ÅÙQž±ð@Ò!Y¤ƒ°´Ã§×Df ŠÍ,m+ñž€Ž!‡™ð¾ØlàîôÄjÃNõ9eUe6QYmå8*Bcsƒ|å-´ƒ@µMbŠ'bm9ÄR&}HSD{tÒE¦ˆ—ÅÁµX8›ßÜÚ0¿š>õåçëËh\Ñ/ïñÏ_èŒæ›JDG·ÛÞ~è5lp˜¬¬V<-ø‚Ï»1uëŸ6Í6zÁÂ2aû!éó5ڈ²ÏÈÏ×êÞ¿öæ£÷½ã´g8M„¦˜ˆ§ÙʼÑÒÁ·B™‹*w®"S@ä§mcŸ¹ªÑO…pÛ7ô*aÈaÊ̌­h’fŶpXƒÜ?®ªõëjÚèDŃ?²‰K[3 +pÂB ø©Ä=mÈe˜ÿP¼žÛâQø­÷jkäÚÝ­ÎM«KªŸ:÷:7'µê> ­åÁIÂíЃÍÇ/’œ!m$Œwsü˜LVÖð‹(û/ÉGøàÙ¶€x¸mÀû×ö’ö³oÿÊÃP‹ÍÄ¢-G£÷%¶@ƒ‹XhôÞ"èhufT²â…OÃ+ tZm(0>R6·Š "› þ"Jì¯|ÊdG/ J¥Ä%WÑÁâˆETæì= × z¥ÊßÑÆz¡­[;¢§±=2ʺ’‡vÅ11Æ_f,çL‡5ñ] <íÈÞæ.kt´rïHY°ó²Â{*uÀí@ ´lrrC ©gÙ´hÞžô8#}ð¸­-À])ŠéàGºki£YÙCþ#D"¿#ñ§š¡‹ÅKkŸ¥Àï] +ÛMiBùÞ±Þ¼cý|ÇïxÇzyÇúæ;&ӍÌ^ŸG„’ìåI!‰±x†RŒÒdÃt¸i¶¹ ¤õ؝eôÄ9€ˆ»'´óùy¥ºM—A¯)Äëéì=ž¬”ÓaÆÔ|ê¯ âd ²Bž¼²”§NÜÓX}Rl)¨ÂÃÎÚù(Èy…iüÑÒüˆGytE¨º²}¤í•YAÅ«¼¬˜èÊ4^$éo®ÓL¬¼-útD¼çÖÍÞ¾í°+¶Cjí¯ÉÑïÕÚló÷9eŽ–oq´_9Úÿ|Žö£ý-Žæf´ˆíÓFþ˜,Ù=¶ÚóleÞHÛàê-BG–”î@\ìsõY~ +@ÐGhòEÉF=ÆÄ5Ÿ#IHl ‡5èˆÿÜ 7çM(@¥£ªI¥­8!ÄN0ð; R;趴!WEþC!ynOHÁÙçÑ«M¬‘kw¯B³T+ íápÇ¡¦q•a$ˆª´ Ì’)²,+ŽL ìIû88yEëË£œÛÐZB_^‘ç‹ Ö4EádŠ½-ÀÌõ쫒·ÑP?6Ù¥ÁϜð(?±“Ê—JŒ¥¤èȜy@€i¢0HŽãý2²BóÓü¼äÿë%×ç‰ÄýÛ¨E=Õ¢þ +jQ/jQïÞ±å¯Þãw¬ÍГ`‘¹wm?14„Ì™0YNø€”*þ)1oÈÏ!÷4‚PsG#ûóÀèåãå"ÙîX禮_ËëV^4BØáñdv%±.ˆTÊ»lö[V$È 2ׁNÜæDÐã8xº2Žk†óçÊBa]öÝXn¦Êµ šÁ>,â/÷Œ›øò åeü0i…_g3–âq-#QôÃm…rr–ãù/ûՒ[ɑÄö} +] …üÎÓ0àÅôÆ÷_LŒ¨Ï{’áFOÖG©ø2++32‚d1Ãv.ǨÕ~jñfŠ˜(D3;H]!wÚ¶4S²ÃðFe¦“¶vڗ<àõRîaÍ؈À›øX¡]³å>¿¬$·Ðé,—,1œíæñ&ATÕ2±¼øi°‘œš£Dƒôjþœù)¹.ND›oÐ]dZ7IxºbçGoCD`^™@lj‹êÙê.È×ÊxÀBˎ#Ùõ›Å|ZNގ¾f6xÕäWK/¹ó vwU·²Ó½ÆjFﺾÑN¹`ÎځüY»ß©¨ £œ2+ªfóB R€ F&1$I²‡ ôõˆ#—*3Ž¬`ãÌÀè)H¾ %XqKg¤Xmø‹ÃÛ_åäæÀl ÎLúÀ'ã֛™Ë ¯\}&¸‚µ÷´ýßK#FìÛ#ƒÏ«¢æZ]ÚßÉy1¶•k#c^O<íªþÌ]öì(\ c$¿2Çä$¡BƆÈ[Š“ÀÞ¶8}ð0%8;²™¶B-$×ÄKE!-wŒÜ•¬` +"³Þ¾þe<ºpýÓº´ÌAåWÚäÑ;Ó®äî€ä´¹ï.>ê•-Î$S ŠMúRž6·Q, ¿>lñûYq»‹uAáDb}ü`“Tu s'IáËÀĺUÃ›Ô!ú«”§¯ºó¯RUe‘d²ÓÓ¨dZÒÿŽ\{©`ë†\ÞÚMݼ©J‰©Js;¯¿°Er–2œÓqˆÈâjÛ²YvÐ=_ó‹oÎ:»È?~ûÒ&5´îeÓvùaÚáíå …7¸lEƒQrø ‹wŸîã³äëÛ)ìòCÑôx;YŽ\VOL Ë×9~îoß÷ŽÓ^Òx[‰vfñ§ý¿iQ·X,ðnfÊʺsvÈjÓn°òBX™™{nŽŒm¬hæ: +üŽbæqÖ ŠO„i¼"מ ìczRÑ]#¤ÙÍnV/æ$¡±®¨,l²;:šKñî;‘EFî³Ø#%§0‰ÛóÛ1ޘSãç>•rŒâŠ¶ÚÈo«£³•áX¡>DÀ[!wÈè*ýï}½£±ô9NñÒ! +՜D’ àÑÞ.eô …+ +pÁƶ +0qž^Ò³7½Ú;þSïۋ¾Ô¿£ÚD¼»{ ñÈPÄEê6þWC$åúh0¡šÏ€Sù[Ílˆ)*3ÛõÌd¡þjdw´Fˆž‘ úKÌÚ2A µºJ°¡Vçôz\X:x«ÈúÚ~&·è)Ÿé­¾}¹Iäõxüý1.-,Ê¿³¼ûßVÞc°_}Û+Ø`'©†W¸üµÇ˧0´/ðۗakúlŽOšçãåJÌ/?M·a.«Ë*œ÷áØYÑ^®;¿;k[Íç¶O"ûuD6ÍM´²ÿ‘¶®Dp-y°‚3£:è*çƒÈ̞ìåHî]æڟåÆà9ƒ_伡ÕÛ ¬Prñþ\–@zKU ÀÂÍÇX"‰²ÜOšK3ÿÍ-ûܚ•v.«Ó[bV³lÆkà u]¸“º^çcn͓TÑlÊàå±uþ•™bºld8c¥o¦Èæ ú°Ny(ä]®-Íüê¸èBQ#›˜µóឍCs¾HàÛ¿ +ì•lùひÔÇq èk­¬Ô÷Ìiñ–A¯fKyñÓÐ[§æAØ͟3?¥+"íÂKò z —Ö­‡#<[RgõÊ%Ñ®—AŽQÅ1:ÛKŒ«i5\Fû¬¦ª¦ c³XLF÷ýîšÒQþVá¡Êë敡ÀøÌ{ƒ‹ÐˆåOÅHÞ+DÙ©rÐV™‰ÃX––óz³$@ˆE·”5=r¨µ“øs™¾ô÷€*TwCÂ[Bpåºpa” )?t_r&vÖÉ +EûØCØmV><ËyÁ2í× yM´[I¸õòŽeŠgܹèoíہ´E’ƒ1Iz€ˆìÃÍöםZý´ƒ¿°Û3ç4²Eå³¹Ç%§ +¢žŸ"ý)Ò‰Ñ1gý+Tºþ‰Jçÿ©Jç´_מõT³=\Â:“˜ 8#“ +v•´«‚¤ÞYˆL© + rr`[ÈêxFbPfø,™‘`µá/Âf•‘›`°Ä,–ˆg„‹yËü®\}&èËڍ{ÚþŒï¥#ö팑ÁçUQq­.íjå¼x!•—[+VÛ鉧]՟¹Ëž…¾1FR¾9&' •Ý_$–क-ÎdÑyÃّš|´jaB%ænáÕ/wŒÜ•x0Ù +oÉLÎÝØÈx¹šàLðÆqý ¤IÛ²‚ëYx$¿Eø5¹färˆûÏã‚VÐX–÷À!É äçGl÷5·Hœó±™V+^å<âc¾Å<·g ú—ùÇ÷K“lçï3´ÝŽî(xçc ê faús ¤ØSéåmܟ;}Ômߥ,-–ØÈ(–%…jô’/ª +Ç,›×Œ·\•–Üvå¯|•æûzŽxŽ¡{£#ˆ—?\gSbèÑÞV¸AßpÄ#Và‚ +˜8O/é9‰¨´!LôùØåe{B2«s£ÚD¼»{Êï‚CäOõ—j›¬10ï©¥F]-%Ì<þÜûåTKÞµÓý’û(섶N<»Ø­)³ÍåØf7|ƹہb9ü]\|ý9Ä×aßÞ*û J|H|­ë!¾íµb‹ î2éWï'@ÒsÚëðú‘Û Ý'ݯçú™uÓý}Ñ}™€ŸÒýZ¡Çí£ùèõi£­®Ýò*I”RG„ϼ(ô,܇LÍ VZ4n:ÓÅ4GuU¦sÈh(fîç‚âšyGÚZ®°“œ‡¼éfÞdTÞ*£Úϱ.b_¼±9"¾]i…ÁNßBñ-’Óª¬Ü#n¶ô¦0§ëÊuÙ¹ )7¿ÜJõß8Šd2Öì߯?LS¾mŸ^=w_Ì,ü2ËmÂFB^ÜhM¯¿Ã0I¸}!Q_®{ˆ>!Þ¿§¾$V3îi|·ÓO·Óÿ n§ßÜNËí´·þSš¾ÖEÓËiv 9§¦Ïòìm.E؟C„>´¼0” ”°r*áR=ŸJxŒ©÷øY%ìFÿÃäåtá}Õ×{]æ¼t™ýÒe¶k—9Î&s\{Ìqo1ÇCGYžñµ£OðÖO¶g|ë'û3¾õ—í¡¿lýe»ö—ëÚ_x«¿Ü—þ2¿Û_6È%ø|õ':h'µ­(oµGÈʦÅ.UW,û×e`5JÇkï¤X÷~NK¬69úÀ7w¼ørµËþ´Ö8÷`>Ûè{hr]Z¸ÙõÍsMÆ=ö`n½ôs* Z,ÒK?÷`†¿W~¹›0n>ٔ|Rڏ+Êjl©ÿÐÞóºØÜ©›[õ%¦h³ðœ«"»©[ÐÄ!)=ÑØÎè"±z|Yžã]æê}ŸÑî*ƒ¹>ž¢š6äbéøV =IêÜå*©§l&Ìa¦)I…iIõ …ØöMJDŠ!ƒÕã`ÖVÆ5fK ¤ ˜S  EÒäZäg‹7²d•9¥øi¢Y÷þ!ÑìÅd]ÂÙ¯–Kn$¶÷)úeèÿ9aÀ‹îï¿˜ ¡Ì|¯nŒ©M•ø”™’B cÙ.2ªý½KhjœTóÕFÄC£Ž’cÞ úÍ 90“÷ +î÷7¢Ô8—V64Y¼"qV¹fO×ÔÚÅF¨>ý- @¤¡©[‰^·~M§Ï‰r9êE ìIí×ÑcØí©|º”'ò•]Òz ïÛ£ ôf«VÅsISÔ«èoíہ¯<ÀœŽ‘}^í€~—Ÿ¤ü_¹Hͺ‹T¯IbϽo.’YLd+¼©Â(nQÔöAÙÄsÌAšÃzšÈç+ƒLÖG|®›X™Ã”: bw‘(Sê@¦ÔÌa­a<­Öä˓ڞZÀjëx3Š^v®Ë“:¼ 0já+ ?L~¸^ß?êå‡÷ÍçüOýð4IL´ v]ËòôQUªÕ5yÈ ÒùÒ!QëæּˆMåg9K\sÄ_ 9<ٛ¡¼€ûó7S”¢)&¤¬o°~.xìrR÷¤š½ÎôÉ™›rD m7|®0ùŠLLax% ÜB/ª%ƒNAèQ º&"ã4ØH&3€ý‰Ýïn>–_Ò‘a»K!psw蚐ÖC/›dÊ®ÜQê*ªª‘@<ŠPÌ*Ž!•·¿êÂ4ÕfV>KáK\„ .l@ü›Í'.úÚH]pî «2k_ +‡ÙƏ·žKnÔø1ŒÔ҉ rT~ڇs^ײ¦c±,`<œ®¡Îd62#-ì‚ó—Gþü“ `]Ã&¦îöô/OƒËk°å~àox|øã>Âu{; ¾ÎÇ㇢ÇãmãÞýë‰×u[Ýçcoþö}ï`öu«í³ÞýŸÖ»þ³ÏÏz÷YXÖØVŒ&Q©ÜyaË&mŽ×€È¿/Àzæl \†o9ð­ùf6¿CwÔ÷í4@$LÓCÀ)^WŒ>“],ۙƒɉ8Ù.u,»â&˨Is6þ´ÑdivPP¦:´•Û-¬Hrò¦pÉºÊ QlZUZJ‹ÂÕ[‰ëvÄS¦kÖÒì·üå~Fe‡–Ÿez~WñØK*•Õ¶Z¦.ÛßuÔ)]Ù¤x)!ÙGÅKî*L gçæ|hoFIgn#¾( ÒCc5/i¬ä5×)ÀE͖oOˆGi‘¹ù‹o"ތݽÅ8R“埨G'Æ`ßì£d=§§ªQÛYh¼ÒG…=Âåh…;òú;T• +oXôõ<ÿŠû¯›ÝA”õW|ž·@äöŽ3Eãzþ¬ïX*}°¿“łíE%‘Ë)¤Ø‚“Ë5GRX½l"0¡\}5ÈfQŒþyÉ Mëqü¦GHL@˝1B£È8´>gf»®xKÀi‰!-Gûâ¯@4\¼\§©s`1Ç)^r~[«çbhhiÐd L -A÷ºvÀÂ} J$ô’ÆÎï=n–¾«Rx}ß®Êg­³ÚD¼»{ãw1ú͹ÿYêÕX](o^](êÄՅÎ ¥•4¼môq´¯fm¶ò£w›rrêÝÜÔ«w[i>{·ÓF*ÿ«Þ-—n‚[T7kÖXanÿüݞ¹v[‡…³®,?«£&è˪š'Œ£&™ýeíé.+êÿåÁ,ú‚_&nõC—ÐM*åÊŸl|Rr/¤&ĨÃk}u'“‡\º|Ì$“%ð[¬äø½Åµºi3íá4ú‹ÓèŸNã'œF8Ã7•¨Óڛپ«¤Df5u|hP»zAx]öŸÕ/˜ +Ým“¹¹BJ'Uc‡£,G)Tk1V~±“L·¶ÑÞjå Z]@—Y"3j‚®4@Yåê1.DýìpFvCÕ*ÄLæën<·ý$e!õ&׉$@1õÌÁ ìxˁç gúBË}ßÒ6³û!?{à/%ïµ:Þügæ­:JTáÂögy*툛,r9ÀÔs´Zñ´Ý×Ò쐿ٚËí¦¶Ê”»á’UÊÑpWCØ,á¤ÿ8e³Ä/¡kŽxÊtÍúAäµïgTÐò0ßn¸ºÍJ#yÑ\¦TÍßu´€žK '‡J9‹²/*Šu#1’>—HžyÛ쯢¿Y¦¾„¢äB…žpÒÖ6ê3 +ŠÆz˜I$ª ¶„9´í,Ǖù¬w­ñG:'…O݄\±k`ro×û í°ÊIé¥[RS@Œ=†0Ù/hÛåäÑØês“K-H«$úûՒdInÃö}Šº@uèÿ9O‡#fѵñý&R™ùʞhG½°kS•x’2%Šf_• å…|'gÐÓ°ÙKúÛ3IÕV̜n8Gãâüö`£¿ÿ ƒsl6š6Ö·¦q&ƒO .‹cŸVƒýøf¸zŸòáK‹/ØX˜·Š¦Çjë·—'fÑíÛ¾vÆÅϝã¬7*]Zý¢•?i@å/m@°t£l6 -ÿPàI‚¿M˜ /ª’»ãӝ+·%:E\óÇ·§­ülï_²»›få2ƒ»«¤ÀqDb}üÈÏäÊÌaîT¼™÷Q&V‰4dkhH?“*ûfµC@‘|ɑÙõ¬šV¦Ž£Ñ™gT²KÈaiªu ñÇ +óƒj¶ýi†tqÖVèÁ7E_á¨G-«q?bøª‡‰¯lW^Ƕ‚êù©#ÊDd²óí›#©{Ñ ^M糔¯lŒX{÷JÅßã€Zwç3vV­k¶Ú>÷¨NÈI£¥{-[ ÿ~-kÔkYNƒ¹ +…qÕ26!d¢CéQ*ªpO ÷^XÌ­·³Íå €F™¯ëväx]·k+N þÔà0jÒVY¾BQƒQƒ‰Åz´iû^óÅ ¶§2V¢˜Òi]Ìà𢡑Û'¬D¬T¯÷g:Ê+í+I)ü+-SuÕbŒtžkç'+ÕU¥#)1˜tV8”¡ëzÌÍgq±"™´„Ä«•ÝÜ:A…ÂhuiW\“󢞫t¬µ2§6æõÄÓ®êÏÜeώ „0 J†Éö¨A¥êšà¾œÜ¡B¦A“¤`B>Úª„µš6n!ù.wŒÜU«SÈ6úŒ°{[˜3-C~{HM36h¹@ïÑzÓ퇙Æ·N¸lçÈþÀôíÓñCN¨¯z–ßqc„1^`†æþÄ~pۀÇö|õ}û?f)' ֜ù÷ܒw ¹¥2[¡]niî0>Õjs¸½ñç°7/SÌ~…á1¦‡<†‹OyŒ¥r¼<Ʊ;ÈÑý»#§eûÄI¦¥_/®/Ldҕ2ý+떍:3µ›£ V¦Gx´3OIÜP|B3ŸÈÉý­I9÷PæSÔºêÎ[áªýë*žÅæJú„U´•Ö¥†Ptì: ×5B•ÅÙ#9½HÙKqrJñäŒ- Ÿvãµö b%]‡’=©)ósR³ø>j™!ü”›G*9z +7Uð”Wv¥· |bÓ “ù)%½W䧀òóŒy~êýxÆJc\ ßK×£4çn}yü Ãh£> "»ÿB*Âúv£*Ãkô—å<,SëmÆ°û\·7\ØÉìöKññ°Õý¢³û.bFì²ø®îçxa´<-Z ó¯þýÓ¿o×_|ì¦ +OÕ2ÿ©Â‹šDÇÑ!2ADº ÛLOéc¨ºB¹KڋXNÇ:õožݳSÏڎ‹±“_ž†ú·ï8‘A[óø4Õ|£Åuį(Ä dÁºï°Ð1.í [8ۂØàÒr$ -Òsψ²½Ñ»ÝB päU)`Òú-ÁH;ß §Ô+hª—Ÿ͑%ô§På?õÜje˜l…=—éãf±«ŸØοÂí`3G\×#"-s “5ío¹ Q/ñ b´v.gÔ./µXéw†K‚§´iÜôØ«'¯JiUäk’Y+ Y'¹€RìðYM×Z±ƒ«ıÂìUoóžw3´ä¨1å +} Š?-^#xÊxAŽ § á¤æ(QAR‰ž3?¥¶Ã²ÙÞU!—îPEՒÔJJë‚ïÇSºÄpG( ÐæÄCXåžQÅqŸåíãO%_Û÷ÞwgÉOdÈ-1D£Øïõì`UF—ù*¾7ߍJz¨¤sß·ã1cš&§X”¼´ú¤ž°Ø}\(1; Ël-i×]q“EµÌ<¯’ KJ««(qÿ¨·­±Ünqµ¯Ht~²zÙ +‘ÚZ ®ªÊP—ÎÆ};‹\£~kØ%¿ÝϨòÐçg™^ ÂU‰ŒfÿöTøŵ3ûZÇcf%6Z+ù¿|j!Phº Un¬ê–“ +<Á©©eßK8¦«½h1]2 ȓ‚R™âóUŠu#1’>–˜<‡\ۂ`®[âx“¾€~²ˆÂºP–x6áˆBÓó»&³tãey­\niÛYTïGµûhï~x7U1½ÃÜIõ™l\&"ÛúÊF˜µ!‰«NnŸŠ”‘ˆ\¬Ľ q GqrULR8Ü÷Z>V¨šÙ&è‹Lš uµwIkGêÞú +G=jîM1üt wú%!¾$Ä#1Æ÷Õì¤u":—iÄ]&n‹W Î-‚ºò€S.¥H[ š;y Qý\µj>#–Ân†Œ[Ŭ­šlöfä–,OCqÏéþI:Ò€UELhû™ÊÈÄÞàyém†°Yýsë×ã'ÑÝ -Ξøú ñõ/âûâëâ;1ü”ß½[ÚÛ»þY~7ŠÓŸL6ãA‰éR)î¢á®«5uLµ’™L;^¯ ÖQÔ[ýã%T9Ld}àÇ7ûŸUYÕ67üi­qí¡ZÐw졉‹ôbëö{^{°ü-ûÚC³hök*i+^ÒK¿öЭ\+¿ÜMòo>µïÒ¹ªÛÂå!Rf°’imв$< +ç\5ÐOC³¶kâP÷(=‘ïg0…ÔŠ¾lsÚü“B6|ùÅ`¯™ßG³/Ö =Ýö …é¦FƑ—.ŠW@5Çö»ê±[‡˜¼}» C |É»u)h Q…D8Ë\T²m âÑV úœ½¸x£€ì&¥`ø\,Ò³L§wIg?þ+ŠµoOˆGi¡ÖY¸ØD¬ŒÝ}¢“SuŽýkÉ7Úº'_Àp(‡žËù$ŸUÏ^Žª±¡ŽÓâYbçÇ7‡‘¶ +öZî]À’Ítœ†Z@B¢²›5Ÿ±Äć”WjBÓü[©9˜¼²»Î”Ê=5mCÉišk¿\eöð14”«¸"Ê ìðf!£{‰( e’&§X”<‡úd +9~\(Q—å€øìH®Rr‘ÑQÁýT.lit¨GnåvSs¢YtHå ú°£á‘Pµ…S‘ëj·ˆ§LרÄzKÉo÷3J”_žðㆫ˙ÌͺžÉeJcúZÇcf‰‰ÚxÐîÿòQà 0ª+qá!Í®«ºå$Ž‚ô‘£ulAÕgr>"Ù^´€žK O +>ªæ2)R)+g¹$b¤d9h‡ÜJA…á%У†²¢- ú‰Ÿ0Ù/hæräÑÚtIS“L-’VE„ùT\¢Þ䖜MOC“5­<“ô•˜[‡µa­ï/–ïíE¾·oùþ ò½=äûñá[—exRÓ°Ì:aDbgĒ欴îPn±ÈXh\–„m5„5=­è…(‚?]9ÄWƒñѯ'…Ÿ uŸÏ­V)ó2‰-7³ÍçËK +èh éOå`Np¨ý.’ƒ´CŸ4mɈ”É6£Æ§Ÿ’¦:ĕ­_À¨ïÖÎõȔzYóÚ¬{…¶0ÕÑ珹À¾÷RªË ï!±q{㺖ð¸òÀTܽ\¹À•©@²QªcèÍ=µøe +.Ÿ¡°Ïþ +äùmG/'o9Ý_‰r±v:&›Å–|™&lk¬~ˆ)ß+lšE!*žt½ ï&ztQå°â7~·èlD±jÓc`⠔ȔV»ùZ“£äT&ÎðÎü€E*)­Ójü<ì1ÇiŠ§{¸&º´†ïʍpû,w¿–fïÖ-øÕæ¯ÿXùjו¯n"ïB ]ÊW•d®–;K…fݚ§f/”¾M³ö0¼†\¶~‘¯)ÎßÇus{q!íëÒCÁÚ¯Ê~ƒÒ$¤›ùº†Xn?|¨cٙMe¬l*ÒѐyëÒÑ/Ñ>r{ƒ¡á BÃ×ëǚzhø}ÓðR5ÿ†ÝĪ=Ô\Gyé°JÎÚÑaÑ@Pß©~D7A[Q¤‡šJe÷uåHé°¢¹IÅ©©Ä4–MÉøYÛQ(>1 +‘Aº"º¨åA þ˜7Ñv +éÂÙÃo.„dä¸q`¡\² &³ÐȤ·—#õGMRZûxºU‘ª —RpÔ§¨Õ‘vavÔãŽèŸ§;öSm%ҔwÜÀo&{Ìcàû6öC:u£Ò®Jí±Õí;,Ô¸Ôýè­H¶á¥ú0èƒ÷f¹ÖKlæJm´±DsŸr‹_Mþª€,«†Â½( +ÿóÅÓ(ùõõb±¿ˆÅþ-A,ö‡X<>| cE§PâÖ<Û½#‰”[ÔWô`¢7“´ƒ»³–h:¥jüúPI/Ä~ÀG@Ù;Ù ³®ZØLó¡hOÊsS¦yÖ³¹" r¨<}Ú/*GžÌèTŸ†ÄOBvwÆÎàzUh™V—¬Ú@`tˆjÖÙɕ9ŝžøZ4o®i%vè£Aq‚A‹åJT˜¶¹ÃüÌ´[n6N]˜YÚUN»qi'TµêDN@ðö¢Å玀V‰;:•°ëÃZ~^ÄÛ²Š2u™’)"Ÿ3õ„¬ 5T¦ÍÍÑD;/sN{¢øò¼õ†â +}ùD^µ7Þ:ªӥم›vï:®=gÔÅ>9T‹Ÿ‘6X"¹‡Ü·¿‹µV%’Õv*O?ÓsçŸúx¡6-ƒ†e&ˆ[á%éz“™â£ [›ä3%ßZ!£³Ø s–‰:@ͽÖhv’å= ™D4LiH¡ž^¡ªä@+—„5‘[Ý–8@j)Dmp:B ýyöþ1.¹÷¥kùÚU×6n°çþfSÔÜßcԗŽQ;ƒO÷7m}!míéÂ`X Ö}TAþN<Âåf늒WŠG /¾aVJûäq ¯“Jº•wl•0·ª=7Ø­ç-ç¤Þ+>ŸêÀ7Œ*·ïÏíŽå¥ƒíå}ÊÛÔêþö€×Ðâ{i!“GGŸP–¯„—SƀљÙ{ØdðTÕRþ#C@-YcÄÄr$î7¬yie'¯¥üHj+E%¹jŽóI½*<À)~tÆA IºK& «Ün#NàD˜ø~¤µÏw2ÈySÀËͅßú®Œˆ_†u¯‰mþµ×#Ô$ñՐѼ!WK»\ ù‚SU‰Zʤ0…5“c´f‰Âi¾¾Jô^¡WGÀW[³Fc¯.½Ö ìætñ†7Ò€_MX•Y7§ºYZGK`„9ÍÖ،}"]Ë÷ܳÑ4µükŽmÝpi·$Cóù?Ã1ŠZò`©I•Š©aë!³Kñ6y{ÕqùšEøòs·ÅqÝ8’Ç™ÿ|­ŽŠÏãùö«²ß ¹ùfGF[ؕѮ ]Áݞ Üe¬bÉðh“쌾IéwY‹Èí êjº£ß9ÿпî–{& AÞ}@wÿÈÝôÉ®¿›ÜZßjëKÕVÎݬÿßÊ­þ? ·rÞVs`ßn4\_æČ².ü;Ø;:øØèfF#Žª +ðñµLÓ×8‘ÇjجOó¬›%Q”ØG0Ô •Ü}¯6¯Ò³sÜÅu^¢©D؋Ûû©\°;ê¸Ø썋Jå«AE5χ7àôD•Œ8Ã$”Ÿ¥0à }g-ÑnJ]Vƃl¬³†Íø({OâÃjÃ_DþÑËíÅèþ‰ Pxe¬góš'7TžŽ'×k7Ú´}û҈»;cgp½*تÕ%«ø›œ{C5ëìäŠÓöÆw=ñµ«úšVöì(ª>R}Î1•-D6F}(©˜¿(';œ-Sž"ÄÛÑï¹´ªš´µè!,:&ê€V©´”¹Þ섟C™?zcXøÛØƱò0.Š"ØÑöºD×Ýȳ[½€Ž¨ÖÞ,×zù|#§®)²\b©¹@ˆ_Mþ +„〹 ‡r¬jøٓ«…&íý­ü¿PùWK« +-Ù·eí}¦¥ÕfkGEÍAº¯*xk¥e½—hÏ®åÖ\½)…Jt_Ð#~UBUöÙî{…‘‚ŽÊ#É "sYü©¶éHd¤[¸ë^s=õðá[…¶e)déñ͂_ǂ=!\& Ä¢pi+TsRÿ¬jpÛå´ª=àTC…ºÍœ*x&¤‚”eÎÍðšïìŽùî+L iøj+½…õêR u2§Ë„Eq9àWEE höL͗i}xëϬš?B ÄЛ®å+‰‡Lè¡Úú?]s®žæl´`w¶ñÍ<_Ã<Ý¢š­ÇTóõ¿%žÑ֝x.í–Ò©Lö¡ò —¼°–ºe©¨Å-F™]yÔÄ6Ø«¦–ÿ¨ÙC.ëFq\·Šáq­ÅZõŠÏƒ^ìWe¿AsÁ4?4Ë|)ÏÔ 8­¥Fw+u Òy &;wšYw™BÈí êjºÝüœŸIçn¹×a¢@Ò݇`u÷¯ì Eƒ´ù-Ò~_‘6*zÙ&S¦^aÔBKDöXÙºPÆ)“Ý›£‰*(Ó+~´_ž®pCq…¾|"Û vJ•¡ž½™ yŽLú:®½®þ±8Ý ¹Dêc%Æ] –t†±°#q|å IÃRÍÒ"¥˜¤§òO»ÑèÖ*t°Ý±ÛC‹à)éz”ÙRêE•Öm{UªÉȎZ<íðÖ²Èrî°ÆŒJsP1ŠcˆÆÚÅ#¯P‚â@#߄µ¡1pCÇý‹ý*I®,7bû:…. çá<µSmêþ '€$ߗږ£ÝWûo$âóqF"‘C´Êì¾@“襬dk—̬õÂՔÌt{ܙ™[âËM“~ý@§Ýa®ø½Û%^¸Û™ºr-à°»ëÈ2iÃïߺ=c¹º#³Ï|ÁB›süô¹¶”wÎhOµ½ß7–´“cÛàÈ՞˟K¦cÉ4].¹’iŸ+/:´-µWösxåà®D°RɱRÐPh^)()¨Î?›‚úÄi”‚z€w½´KÆùuy£˜©‡A%ψýçݗh‘}” +š¸fWT83I…ÏçH¦L‡5(¸«ágLøy¡P‘m†ÜN"õ¤…¸É¤tüœë6¥¯2î@M‰dª/ß{S6PŒ&Ù9%+GÍÓay‹c.2Tõ²(ñ”áêõƒû-¾œgä¤]Ë÷„0½pöœ¹YOú1q“=úXÇ­Ge\Säÿ”ý²¦¨§^•M-UZ¯d÷áøé”þWÕ+8r–p^@•ª9)ØTÈÙmђø¢¢Xîûq“ÞHž¸â¶°ªXuílÃÑûF!ªB áD C¹Æ"w¸«QûU3ˆ—*¨üàA6mD1ç’zÝ®yƒZÕ¯O¶M¹Ç † £)Y9šË“„UU¬[B¥Ñˆ’º +³Ñ«×sÂ8d½ %×É£¶9}VAB"­‚¨Ø*’P^Èw²;†V”úr'écâ͔;ϧÇý½=î覈Ùµ£æí«=|Ýþ뎰»2O˜on$a.ƒ¨/€ã5qöõtµé1 èUFW*ÊÝ}îrê‹ëÃâ(»o]×gŽsL3 p"vâûÍqÂ×jSX¹‘3ü JפóŒjÂ2¤, ±ô^veÃnãåñ^ ¢ +-+T¾Ì€Ð©'; (`ïė¡ïv/ú +ȒgG:ΌÛH>féD +)“ȬZî³Íš@ä¡]q R8œJ¦ëəQ4ñ] <-Í2ÚÜeŽV¡Ã;R ԙ0J T$0 +³k“S-µà®s–ö³i3 +¯z„éfð¸­-À]‰t€®–$Óg¯?ÍL#þzÙ*²Už²õÙ*7Ù*$[1€å,ƒL—ËùŽydBzÜ*–¢ŸW3πÉ]‡üÎðÚAÆÛéÄk™2êM¢WCY#Ãò?5¯y4÷u|ì Ì>h¸áx°Ëžtp/v]•Jý°£Gîašg ÷T«Y78M›¾n³‡[lnÁŠÑÁʀ|C¤‡ÁwÆ»šˆ8ÕQ ½HԍàV£×U‚äå|éÀz¼Á¤Ò"ŒíÏ6|ÝÜím;Ém¹JßuÃeнW÷ˆ{ïéå¼ãÄ€ßN_,ûLg¹¸`—ž$UDí*¡l«\´×Ìq÷ d³Óˆ`ãUñÕTL›ܒ8wï®T iS½™É |) í§‹‘a\á2Ç_-c˜–œ½"|¶ÿ=åû¢a‹õ­qòKoeœ_p¨7%@-í@KãÁ÷ü‘š¹×Öõ: Œ!­½Ykÿ«@Ž)ÐEáÕãËíë_?¾YÏÛ'*zºqáü¥›´p¼Éð°FÆYø;W€¯:¿€äŸ3,\èôÎ_’X33okÊÕ¹ ~qì’3<œä?¨Ÿà!sOëNƒþfÝc–pOÏ÷ô|'1r†£é´6!Û Ü­v—+b™/¬•[°†’_S6÷Øfzæ-ÀÖÉUðE³¹ÝqgÒè™äÊä%å…È¡ª$hJYôQ¥£Øwþ8â*Š½ZÌó„)a‡C;Ãö¶à ¸0ɘ 1%o½ñԓ(‰õªàr¤ »0­L“ /¾Aÿd_š„ô}Áb´#O½È[øƒiÍÃzlöçËþí^v¾³`b^Ú¼•#&ï©Ê·¶ò€pÞ2Oxm¯2.afµÑ¯¾ž®öRyu¥†Ü ÉXŸÛ\®Q£jë PA•-Ø·lÿ•¿bQ¹ñÆ­ Œ<}ÛõMW™8LY/ÒiÛì—Ó×YÓs‚…ݵ¿$qZ²c7mÇôÅÞ¢Æߎð`ÙJ3º„ô_¨:ËCÕYžUçªÎr«:÷~H±S5Yï=ÞÑø#×S;mÍˆ˜¬y¸i¶¹ øcõ@5ÐçXÎ3.áñý¼Šð¦ËH}{^ßÐ#5ª?Ù©Äю¬©.(÷„[)ðGyòÊRž81›÷I;3UQô°³v> +Œzaíaz•G<ÔëDîïè’Æ ¹…*7Ut«YœèŠV|Ó߬ œ€%ÇÕ§#â=7X7ûø¶öP/¼mlõæ«mxO/ŠÝ'ÙÌ&¥5åõû`ìès¶%ªrµ©á“æ§ÌÉçq ú(î¾=â³2 ›'Dn7垯íFžÂ2bñðT¾ZU*œŠºÅÿSr‚‚ï ¦0Zu¼ùè¬9'I ´J DÙQ{ÖÁŠ•p¯ÓÖ­Æž."HÇ´V÷‡pW¹`—J§Šm•¢€m¶eoóZ¨ìê™|DìÏ2“qˆº¼©üZxÚQ)¹€½½ $^~h `T’«+zçö`=\‚£“ñæÅ Ü»ùHË20)®±‰©&¦>MÌLL½™˜}‡ì¶3Ãý4Ö>óIïߛÞÍ,r*åkônâMï‡lVJxyQ'qŒ›Þf«çp¤:Rež· ¹Ò.Öɚ?B;ØŒÎåhiòÞÏ=Ta­Ò'»gFChAâÛEþÐã¿Gþat1㚭ØheÞ¹_X¢¼€½Eȃ×jãjIŽ¬I쟸†„Xé|ÏÄJüÂA‹«VQ‰äïF&õw§Œ¹:²“°4C˜¨­’-w`r¤ÍW©Ž¶èË£Pr¨‡óúŸ4øZ(?ðZ9*Ãr›³DqG‡§/³G¢·± lÑa`Åv˜òn+¶HFƗۛüúNˆ ŒLi¨Eº1ƒG!&-=ïæ÷oäGŸ…y¾F^3óóõCÒçk´ʚ9P6UÙwí‰#ï{Æ)/*õbæ©ý=0ý“LÿÑv¶Ö³O!hû YÙ1‚¨À +J¾Ù}jË»/±ìôQ¤©hâš]L-®!¼u®ùQå‹>kPð°«½A† +?/*íº-¹c n2)“Œå_tëk{¯¡Þ¦2Õ‹ï½)te.™•§5Ï„å-ÉNY(RpýHÏB<å?د–äJn¸÷)t)þyžïܛ¹ÿb™ «ê©ѳ°gz¬ÍS¬bø$éڍ‹ ØÛýŽ”:¹"‘7…'P§ +Pƶ“Æ »µ÷›'4-:ýòªôVtk}¸Jº.%^:­ÏC×ìj}9ì(yl2Pï;ÌpD `´¸ÌŽÀé°\ݯ;QÝ:Ü ,Ôcf6»ènʚ»ÿ œþ'ýOAŒë§ë~5Àý½t-_àj~LÊÃøU_Ưú5~ýÄøUã×ñák ¬î¦d„Rz¹×£ê)ãÜRx:ÄS!Ë£S‚€3ã!¤¾¯êñ¢qcÎ˔U|‚ uU¨Q{9á9äº$Ö´²Y Í¼ô‘8yPÞl”Ù§AdˆïŠaÊgoÓñîNÍ¥ŸÀt%xWpíäu{߀V‰N£·ùŸüC´äŽɾªø×®bKËþþ6n/ql_qü‰8¶G۟ÆÑÈ¡…qL}Þè8ôLf0iÄÑ Êo²6A˜ƒVÄ۝–°Îº"d…ÍXç)‘½Þ˜(CÆ`L°óUWã2)QŸù—ëäxS +¨=Ž'‡’Ð’ddHE2V- v4­}EHòT´½ìGñݹâ÷#ñ†ên©R.k^•ÙðècOÓÚ½˜ÊŒ38'!µqPƒµóZÂåʄ˜¸4ëM¡.Iä $#-Ÿ]¿VªûÍ´g¿IëóiÌ´¿šj +M{°r„Ç0¹yÎ6öetcÏ?“övE.@M[SfkgÐE*÷?3´æìYµ§œ&ݍ8zKUyâ6ìÕ©J­2»pŠ1k‡„ÞÕX5²ØfîÖ4Ïlzàû!˜4¢ü•UÓ!/a}œ]ù~ùíîãÏÕ¹0ý¡:‡W1ê÷KˆeÌ Jà^ç5/\pj7ggѧȽcí5ô€ŠQ"iʟ¹@W-%ûhÒµÕ½WÜã3^ò ÓÊ9=a×Üï<Î4Ö +>#ô©Áõ·òú=Èp; Cå* ¸¥~¨ÙVžÛ”û†……ó!RfzbŠÀý-O«Ÿ >@ŸŸóÏð¨o˽ï›ò8ŽñÛg¤Ó·kù‰òúóŒô\ü™g›Uz–†6‹.‚—Uçò…BÝÕYBñ²U° ÒÜŽ%]<Ö*²Á&Ɵ¢T]¥æ²I¤)¤À‰òHCHâW¤H[Ý°¬;ÌNYŽYèæ4€mÉHßh’š=µNr÷RMª0H‚™Žz»’Ã.̶ÚՒç[§i¼øcÃê¼C¢ +ù´ñ§ÈPçläüÚ×C@5gÓ¦Zîõ±ß­;„lHtÛ»†'¯ý¸)5H¢Ê?{#_ë)B =BqLÇX§àö[ƒoµ>6 Ѫ©po •jÿÒ½™÷ö¥qÍèͨ¢ˆºÅF½w¥\Ǜ²‹2‹.Ltg’äbt—i‰ÆãòS@•$Ñ°×p²èN$¸RñۂÐ4†Šù$@ebg=jÈʇÂӇ¿áó(GÃÆÿcï! BþmÃNçz¿½¬Z@ t‰âÖùɅIŝ–x[Èk®ie³@Ð]Ø¡:ÊèCK”™·Ö`¾1oE˜‹ÍS4w‘S@p\ú Eí:‘\„ýhòº½o@«Ä‚8TbÉ?.ã +:1ú‘–áGEx,ùÛYK:rоÝþ:k>†L¹–.­¿…¾Ù;ªÍáĺÆQB#¨@ÈR‹yBë+5€Œbû[\ÛT÷J¬ì~3~±œŽÿí3‘×éÒM<>Ñ`o¤æªJª >+O‹ÂŠ|`o|͒DÆjí;¶æÈ۝‡\ůàu1CG[’Kf¾vÝ[´åGßPêQ‘\e‘?rYx0ì)Z…íR\éwd(”N%x#+ÓnmíŽb> Êž¼>x•W‹"3”°ìfö¡ß"钂k±½§+¾s }\_™n YEÉmo©ö¯ß¹™ÀeúÎpÝÿ3üúÀÙ*ñôCk9ð_èñÂ~‚û~Àƕ|pÿOŽ7ö 9}"1‘î6춍û€û-pñ[F7To_ü®wþiüÞ\p"ÿ«O«y>ù ²òtƒ,Œ«Ôhr 40±å1O±?Ñ~ò\õ†ö'ôä…*»AÓO¿àQ}h¥_{!™''¡˜ä& &Ah`I£HCêûï$ž4Xžî9ÞLâyû±‹;¦(›tòê.çŸJXr½jbjæ¨ü8€¤ÛX{ϓvŽKß$=4e*f¼xcšˆç’â´¾qÚ/QF¥q±ŒÐIu usíûD% ˜øœ^Ò:¦2"šÀ—yB¢ï±Î®ŒØonë>û•g…Dî$Øï,† +Hʜ²vG&Ôà´áP† ®ž Ì.SQJ–˜)]؍µ³J"¤X 1C4JF¿¥­ê-j9ØÓ‘¥lϾ„v¡ßúsþ’‡ÑØñ…4ŽtþA³‰&+•ò«µhjÀ¯ý×õhL$Íñ«Iÿ'Õ4™ÅT̽ws¨L®éF.È°)ɦŒŒ^¦%ü’‹Ü‡„ì0 +)½×È><dtžg2²«TüÂiþ«t\Ü{%¦°Úÿ^ÃYÿf¿Zr,ÉmàÞ§¨ tCÿÏyx1½™û/̈ S™¯ªà6{àÚTe<)•’HF™´LîÊÕg‚¶¬Ý¸§íÏø^1bßÎ|^åÖêÒ®øN΋ᨠ­µ§ýƼžxÚUý™»ìÙQhïHª7Ùõ*»¿I*,»É )[œ©¢^҆³#1ùh+ÔÂtJ,/Daà;FîJœ˜‚Ãl…$f.$¶¢ £Rˏ+ú £IDz‚æYt$¾ø-¹\äJˆðçqC+(,ËvàŒäró+¶pÍ-çüWÜíxË tóŠ¯ùv幽ǠÞy›}ß±äøÂvþ>CÖíè~%¯%yA8A+Ì~ԁ {­»e1¬#ÓAíÑöSÅÒbŒRY§Fg 墠pÌryÍxKÀiɇ`SþÊ7©½¯çˆÇ +½@¼t9ájä‚ñhoë¶ÁÜðÂ#Và‚â˜8O/é9‰¤´!LôùØåm{B²©s_£ÚD¼»{Íîγ@|¨—{™ßsµ£ü’PjԅR’ÌÓϽߎP2ÔÎõK¾£°Ú:ð좶¦ËÀX5J +umàsÍÝÎËu#ñâºëÏ¡»ãôöVÙï tׁt·×ÐÖöÝo²k{*# 1~õF =ב]‡GãGnï`H>AH~=ëgêÓCò÷MòsþUÉ߃éý埿üó#-–±]“"¥Ž >yQhW¸ ù™¬tgÜs¦iŽ&ªªLgÑ^P̼ŒÏ Å'4ó‰ ³µÜa'3ÙÒͼÉ~Qy«ˆj?c]¬¾œ±9"²]i…wÁNt½…Ê[¤¥UY¹G¶ô ¦0Çpå”é@¸ùíQ¨þÎQòŠ™°fçøñøešð} 1ð²dÆ®ÿÆ7à™ÏŒB:+ÜhLï¿_3V0Qx|#Q`±ËXá~œýdWN¼ùexþBÓӲ¤ª?éx>SöµnÊ^ŽãòeŸ;DÚû\J±?‡;|éy_`è!AèaW›‹¢œO=¼ÆÔü¢æ<ícü}R³Ôlÿ ©Ù©Ù>JÍB#Û>k5ç­Õì·V³Ý[Íq:Íqo4dzÏ/meyïmåxMe{MeMf{i2ÛK“ÙîMæº7™>j2÷­É̟6™¹T8“þ!!4Ü'U®(qµI—ÊÊÞÅ¢ªËÇÀ~X +ò½÷ R¶{?S§Æ‹½Ž>ð›;_|Ù6W†?­5ÎÌoÛ }MöK 7‹ß<{h2ð±sí¥Ÿ©tj±H/ýìÁŒ¯ür7}Ü|²)ùڐ;Êjl©?hó/öxjêÖF‰*Ú,<突Èoê4qˆG +AO´¸3šI¬_–ûøœ»ª}¦ý¸ëo(«ÕRcŽüs²ŠÖê&«§,'Œb¦?Y…Yõ[ Á훬ˆ$C«ÝÁ¬­œkÌxR0§@A÷6¤ËµÈÛoiI,sJõÓ:ÂY÷þτ³ÙV«Ý/Zɕ!ù÷–¡©‰ÂÍ@ÒWq!*µ—|fdÐDhõ‘¼Wxràà¥Æ±¬{es“•™BLUÎèÕAµvò¤¥T3ˆÁÉìRTëu;àÂh@}L9 «£Æ<ÀþÔ~mð»ÍÊWËòDÞ®²eZäa{4„ÞyÕªû\¢5.ú[ûv ”W%`LGD"^ nö5¶v)•_ó’u/©Æ“©=÷¾yI2‘Ý\a¨ +¯q+Ig/4“M™Ž1ÐsP#ú|jȨ}ÄrÝ»øùsXS‡‘Ú]BòeMȚ¶ï»Ö°Ÿ¦7ù8Sۓî–]ºw¦Ð‹uœ©Ãcƒ¡‡¯0\1A¸âzÖ¿úÖãŠ÷ÍçüË®¸ƒZzcqÏe•úP–jâ&¦A!£b:XjÇܚ«Œ£I‚–§‰ÓŽ2H>O&g¨2àýÍr4•JE+dçѵܧ`““Ì'Þ´Û묟3*³á¬p0¾¡7â—âoÄ +–†o$†î¾‹˜»,¾«û9é·p‹ÊÜó¿,€íK?Àö— +à´ÓÕ/ýûÒ¿—´X¶é +¢1&†C¾å…}7iwìSÑùxÉ£^c…üìo9ð½e‹&Ï^) nîûv &LÓ$à/)WWHœ %&'.Êb¸ÔÃ숛,£fš³¥ðٖ'K£ƒ„2Õ³­Ün÷Š"gâ~²®rCdۀ&RKeQ(Y½•ˆ·#ž2Q?H³ßòÛýŒª}~–éõ!\•È®°l-l«e*Úþ®ã1³»6´û¿|ÕB ³vª á¡êQĪ¢œêÕïªÕul—ªÏˆ®˜®¶Ðâô\yRðÑb@.]»{©_)Öu õ½>–˜<9”©Y·Ùd/ ?.²ˆÂ:¨ÀÀX¤imRiþüM“Yº‚Ü¢½”™¨<ȕ¶E…ó\ÒhéŸÿ@ªƒ,æm~¶õK€¢"b)¥é™w†$&R +èãï¦*¦w˜;©>“ËÀÄ*»^ÇÒ% 0k¡o†³¥©êbd'r±÷2Ä1E,X›Iš¦¸i(19VhŠ(iñÙ¯ ueYV™÷H¨¢¯pÔo-‹™wøÇfQ.cÚVàóÑ”†ž§V×à &Þ&sÈ& €;ë±T•TxÀÖ@Çã÷€I@ٍdBƒ¿$ëöW‘Ù@%êvá'ãy6Wj*zåêP§Ê4ΌNõ /Œ‡ˆµRÏM +*Ès±}X+ô&+U%7ªðK{셽e$%3½…¥ò˜D·–Jû Z,¬^Òï QX.í{¹ó¾Æ8R,BàdzЍq¬÷§]繻ސgæL3D©í”c¹¾¤¤ U,íÇäY.Zp5u/“tÉE*²ê]†€D4R2à/¹·\ž›óG{»¦ V¶p±¢€<-9`˜E¼¤g97w«Îü8ÛâQZH^~óMě±»×ôì’®+®³>º›BYŠô|¢D¿R×r”u9ÅÏRŠª>éá÷\X\¥’ý7ÉË-7æ3‹Ùcèk–4«¾ oP˜›;? jvU5S¬°ªX¦¶÷T.íl¨¸›?+À–~•õ€ü[ðAêmì‡6wûp¿îæ‰À.mßa¡‹êM$RIãòhµª\†[sŽÍrž—z—Zž³Õqhær½3ùN3ù]äűPÀÏÛYÑ8îbsO“¦þÝ)ti5¦êÜûr¼|–"•¨[#y¯ pOg@ܗ$[œ;¤çå_ìWËrܺÝë+æ<Æû±v’»I²qþ@•ºYX7Uñ"¿Ÿsú$A4V*¾±ª¼†M$Ðèóèºui›ÓO7בÒNÊxõÓ ÕÇ/‰š»ê3ö؋khó™¨^ì)‡ƒ½VóT¼$6Ë姌XñuØê¶D£™MK/›”Õ([SuTvèþªÿqt‚ÃC%ÑŸi‹¬¯-˜™=,N”Œž.†þe(îw”ðZRÛj§Ïy”3ó!}Òõ”'EC‚lãZ(ÞÔ)—®?§Ý•ùÐ&,Ú¥©M +6mR8´‰P¸lÊëªß¥i~Ìí—giª•HJïGšò.MùG¦¼HS¾A9µ£v]°»ÚÊ94†™¿%ŒÆ0†$on/ì€­mä͑›KãÎbCñŒCqítÆÑ,SªÖ{e?7¡À¾ÛíŒíÛ cЪ¯†`ûøǖ\”vô4ãÔ¬HuÂ2‡ó|é ,’jë㛂»ámFè³eO| +Æ.ïXf¥…0c;©,’Ü蚬Eñ²©l[G$ +U?ãM3NéfBꨬ&| Oâ½XÇàԛC B‚·A#óë+ötdm€~Éá³c¬ߏ⼿f¨wœs /¤Xké~®ß +æòq )ŒÞÖìV§“ ÁØÓNÀ.ªFڗb!µ vZÇ£2'‡ŠyDØòvnºiÙOVf;4-q;3äħʎ±ô8T^+ÓP҃)¥",:y![OmKº=Sîfm…YLö-Õñ…Ö_tO?ý¿Kt¥ï¨–èX9û衘«ÝÑ#:®r44ÍX¹Š7ÅàQÊÌÀœŠRÃ0XEwS¨Ջ¢{P`«¯¡1iñNÀì}÷K˜M«Z€Øv†Ñ{yž°ksI»Q*IG8®EY/´»àl,ÞõoëŠØ麢V¹:z1ÔVÙ»"zÔÙ þœýRfí±¼¤ìt°ÅFué\2زJLÜ^­ +k²¨­bÀYAêÎë©jÚ\ÛûÊç[úïæ圗@ŸÜãïà²òÉeåŸ.ë\V^\֖ÃgÀiØ,×Az ž…1“>?©A-•YØáª0Óvm«`ª'ì'ø„½ÇØÖùÙÙöÇ~…¢d˜SdékaºÙށCMùê§2“ľ6vQuì#°W€a<–!©ŽVÌi¯ÕwÙk £ü&kDò¯Rv°‡HËOI‘Zįª&j“æ¸&±z©@æNºÉgÚ"Ïs ffÏg[€/Ï֗¼¨!¦W–½·Bd>­ší’µXBš÷¥…n×Òd¯¢2õ,ãXbïò óÙ6cÓ âÉmþ“7 ~ð©ñҊµ¦ÿúûÃç‡Ú–R^„]3²îsºfÿ ù¹WÍϽ:èã§Ïîòé3ò|ùü鯇´‡bö!ÏÕ¦=í§÷|ÁkŽ–Š8àÍKl°Tñí·µj«¾¾y­ož8×ú­ñðWüýòðñ—ÏþòëW\ÿíÏÿôä.øçkϽžÛ1=~å1}}üí°æªdÔf¬ô£íÀ|P½ÔcUüt Èü¯™5üxùZ]2!6Áwô›Ä@‡§e6M6?d»é˵ÆÁfœåˆ&\ ­P= -i¾o¼üñ66]ŠAI‹áZ&ç¬g’±c¹ð&–ï5i÷‰å»"U‹kÁ.\‚q L ÒÙÆ%|ÊZƒ“b¢1¶ Le ˆ=cMý‚mÂÇx6ٖ[Y +ÝX‹BO 6eO°¬õÌP±td¯ˆÝaÍ©.öªnƒÿHØ´iJé|±‹æ¯Mo‹ý|±óhØW… «#)h¸2¨AÏ!·ŽI7£a˖¥)tAÍÉ̐1¦É*}rO[qøÉÀ)”Q,ˆB7‹Ö¹VÜ žŸ¯×ùìÎKZ·£jÁ>=bMÐ9õ®+6FC’‹`¨tú°@­}Çk—! ²½#u9X!|yÈWºÖbçs€Ñچ#”µ”dKǼj® jÚP“Iˆ´+‘Ít¶o‡ÒõµŒ2An)؈›5X4(vLccGì†và lŸÇ;ØOwžçñ|KlF¸ÍXQûy:rADý8î¥!¡@#]*² +g æ‚'sPôÍ´n\<>,÷—)§÷¿5 ðãm˜êx²$³“Ũi8 ØÂm‰óÈ(_Æ\2”·ÞPË}›’Ç”ÌÎXß[Ö²-ò øœ°3–»a¿± l³ Ÿß¸ætˆiےÁÝ@0r5Zë¶md))æL˜Ú~xu4 xŽ·Å¹ýòŒò\LeÄ!ˆKӉj¨=Vb/xŽ pIëގ×P‚¯ù[7°Ã\äLÕeœoeýaÆ)v÷‘]î »ÞAn»ó¼ë¹¿üûrô²UqŠ±fë^Žðî0áîbÕD±uTüoš©Öª¡›S¼0êæÑ}¸¿LY_wüÒü¼/C\?1© Ê4b:ht[›Ñ¶Àñ*—1ËÌèëܼ ©¤<£ã„õ]ËwlÊXÁ¶4®sõth¥ ¨CÂ:ßOÈÈ#OMÉډdªý@vè3 +}2]ô] Ròóf¿òVÿíö¡z¸áŒ\8Ða‹Ð1ê$%¯Æòãôu>•¼™Úíåô®ñY¼­Ï/‹SÆàuÑ°€;41å¾bÜ»6DœÉ<ÇÀ¹Ùt֝®AÛ½‰‹K7nÀ¢9?M¶8Çy&xŒ?Å—pìoÙóe€¿çßo™€e@|¦â®À¹U¾õSt çþˆózÂyXp'ÎãŠsA»Ì) +æëéK+ο åõˆòúÊÓDyZPž^@y]Q^_BùYº;´9!¹¦Â|ÆxøžOÏ0žÎ/oÀx>a<Ÿ0žNO¯bü™‚7Z4Áåkw9¾Ýí€îv@w=£»®è^±ý6dßÑnËV/ò=Èޒÿe@=cz“îßÓõˆéº`º¾sL‡ÌяžáotGÿ÷¿èŽ~2ç]æü™«ÿÚI¾K­yïÛø63|«k]ôâa@¸e§ÂîÙéÎÊ“»Æ”ëÏûïƒõ×rŽ5"§½|_+Ïo|g«ßócOìBÃ;ƒþ·âЇa§ÿø—OüüG€ù]§ endstream endobj 290 0 obj <> endobj 316 0 obj <>stream +8;Z\799OoM'[.3XOWAH7mK+oP9BJ@YH/<[u^Q5#')3QaT[RI4_+OIP->Jq'2J^9>L +NHf7\h[&P&F=:E5%6_g=\)H@F=>.V3*H1[CLoW4HpqR#F*??5+%ZRY:%Le(&R_dU< +D@aC9:Y!iS$d#slFp;A3'm1d"i!u(N@r]oZTp9C*1-,'4jI]tdo9s]\lDn\OH5#// +L/YAXX0N@AXFYL=;03CQ*>Pag-EA\R)E[WX]qqXBOA*#0cZ2ZiI?DL/V+:1&6kmo. +(,0VV4&,poIdFi)r'Wu[YCBr?NCY$%f5+I\@Po_G_@EkHj>[XCU[MtX1_#;9B;$`S +,O%[.PA>97^bI*lk+lpiLt7](\KZiF2e1]l_n[RUPjdf3mdpdD41_PQ;j?df,L>V? +/'@-*9+OnI65eHUAF;6)alV/Z8,>hcl*Z8:&>j_YOmmd]E;dC%"i7s4#?$G#bFgG:?nMs&#gAVs,54DS(qK+SY*DFiVC^ +Z?IVJaHCE4-&Q#X+'#V8.+q)I!C@/O)_<&RUGAh!EuhIH3_"2HFrf[I%;=OSQl&kE +*AH9(=rVnL/p_I\I` +%er)I1._Q!e0+?.;<5=U3bmeie+7?q,eEkmMUQ1WnsdB(rt@TEjXkqtiL +G1`#E?7H#Z5fl+ZYE"MN0ao1*#P,1^7Tq4$LqNqB+_KlgU#omV_p1DNO>#nT?,KXS6=s +FnB>E%KLAAbEi~> endstream endobj 291 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 320.7549 392.0108 cm +0 0 m +-0.009 0.002 -0.018 0.007 -0.027 0.008 c +-0.519 0.108 -0.999 -0.209 -1.099 -0.701 c +-1.156 -0.982 -1.074 -1.257 -0.904 -1.461 c +-1.06 -1.737 -1.211 -2.017 -1.356 -2.301 c +-6.741 -12.916 -2.485 -25.934 8.131 -31.319 c +9.149 -31.836 10.209 -32.269 11.29 -32.618 c +11.371 -32.949 11.633 -33.222 11.989 -33.295 c +12.481 -33.395 12.961 -33.077 13.062 -32.585 c +13.162 -32.093 12.844 -31.613 12.352 -31.513 c +12.029 -31.447 11.714 -31.563 11.505 -31.789 c +10.483 -31.456 9.482 -31.044 8.518 -30.555 c +-1.676 -25.384 -5.763 -12.883 -0.592 -2.688 c +-0.436 -2.38 -0.27 -2.079 -0.1 -1.781 c +0.278 -1.735 0.603 -1.457 0.683 -1.063 c +0.717 -0.895 0.699 -0.727 0.644 -0.575 c +4.527 5.255 11.141 8.773 18.218 8.667 c +18.338 8.424 18.562 8.235 18.849 8.177 c +19.34 8.077 19.82 8.395 19.921 8.887 c +20.021 9.379 19.703 9.858 19.211 9.959 c +18.819 10.038 18.438 9.851 18.248 9.523 c +10.912 9.639 4.055 6.014 0 0 c +f +Q + endstream endobj 292 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 323.8691 387.4424 cm +0 0 m +-4.134 -8.15 -0.867 -18.146 7.284 -22.28 c +11.196 -24.265 15.666 -24.612 19.795 -23.298 c +20.076 -23.209 20.355 -23.111 20.633 -23.007 c +20.751 -23.116 20.898 -23.198 21.068 -23.233 c +21.56 -23.333 22.04 -23.016 22.14 -22.523 c +22.24 -22.032 21.923 -21.552 21.431 -21.451 c +20.938 -21.352 20.458 -21.669 20.358 -22.161 c +20.356 -22.173 20.357 -22.184 20.355 -22.195 c +16.217 -23.765 11.642 -23.53 7.671 -21.517 c +-0.058 -17.596 -3.157 -8.117 0.764 -0.387 c +4.568 7.111 13.602 10.251 21.194 6.853 c +21.193 6.428 21.49 6.048 21.922 5.96 c +22.414 5.859 22.894 6.177 22.994 6.669 c +23.094 7.161 22.777 7.642 22.285 7.741 c +22.039 7.792 21.795 7.736 21.601 7.607 c +13.582 11.232 4.021 7.926 0 0 c +f +Q + endstream endobj 293 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 706.1591 370.0264 cm +0 0 m +-0.446 0.249 -1.01 0.09 -1.259 -0.356 c +-1.374 -0.563 -1.398 -0.794 -1.351 -1.009 c +-8.538 -5.462 -17.905 -4.462 -24.006 1.544 c +-25.356 2.873 -26.474 4.375 -27.344 5.999 c +-27.325 6.026 -27.303 6.052 -27.287 6.082 c +-27.038 6.528 -27.197 7.092 -27.644 7.341 c +-27.771 7.412 -27.908 7.446 -28.044 7.453 c +-28.99 9.67 -29.497 12.074 -29.517 14.557 c +-29.556 19.489 -27.671 24.141 -24.212 27.655 c +-20.94 30.979 -16.629 32.908 -12 33.141 c +-11.919 33.001 -11.804 32.879 -11.653 32.795 c +-11.207 32.546 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.162 -10.751 34.411 c +-11.197 34.66 -11.761 34.5 -12.01 34.054 c +-12.018 34.04 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.752 -24.833 28.268 c +-28.457 24.586 -30.429 19.715 -30.389 14.55 c +-30.368 11.939 -29.832 9.412 -28.833 7.082 c +-28.857 7.05 -28.883 7.02 -28.903 6.983 c +-29.152 6.537 -28.992 5.974 -28.545 5.725 c +-28.412 5.65 -28.269 5.616 -28.125 5.611 c +-27.213 3.902 -26.038 2.321 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.642 -11.04 -4.642 c +-7.489 -4.642 -3.924 -3.662 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +h +S +Q + endstream endobj 294 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 687.5497 362.5948 cm +0 0 m +-0.341 0.19 -0.75 0.141 -1.036 -0.093 c +-4.077 1.079 -6.81 2.835 -9.161 5.15 c +-13.698 9.616 -16.224 15.581 -16.274 21.946 c +-16.325 28.312 -13.894 34.315 -9.428 38.853 c +-4.193 44.171 3.255 46.713 10.637 45.757 c +10.711 45.56 10.85 45.385 11.048 45.273 c +11.495 45.024 12.059 45.185 12.308 45.631 c +12.556 46.077 12.396 46.641 11.95 46.89 c +11.536 47.121 11.023 46.996 10.752 46.62 c +3.098 47.613 -4.622 44.978 -10.049 39.464 c +-14.678 34.762 -17.198 28.538 -17.146 21.939 c +-17.094 15.341 -14.476 9.157 -9.773 4.528 c +-7.341 2.135 -4.515 0.317 -1.371 -0.897 c +-1.342 -1.189 -1.177 -1.462 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.705 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +h +S +Q + endstream endobj 295 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 492.2558 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.43 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.447 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 296 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 493.8667 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.672 14.166 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.898 -27.802 12.893 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.626 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.103 -0.986 c +23.55 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.781 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 297 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 516.9438 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.489 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 298 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 498.3344 175.9551 cm +0 0 m +-0.342 0.19 -0.75 0.14 -1.036 -0.094 c +-4.077 1.078 -6.81 2.834 -9.162 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.894 34.315 -9.428 38.852 c +-4.193 44.17 3.255 46.713 10.637 45.756 c +10.711 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.058 45.184 12.307 45.63 c +12.556 46.076 12.396 46.641 11.95 46.89 c +11.536 47.12 11.023 46.996 10.752 46.62 c +3.098 47.612 -4.623 44.977 -10.049 39.464 c +-14.678 34.761 -17.199 28.537 -17.146 21.938 c +-17.094 15.34 -14.476 9.157 -9.773 4.528 c +-7.341 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.446 -0.249 0 0 c +f +Q + endstream endobj 299 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 681.4711 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.448 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 300 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 683.082 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.672 14.167 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.899 -27.802 12.894 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.626 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.104 -0.986 c +23.55 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.782 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 301 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 706.1591 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.197 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.617 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.489 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 302 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 687.5497 175.9551 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.094 c +-4.077 1.078 -6.81 2.834 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.894 34.315 -9.428 38.852 c +-4.193 44.17 3.255 46.713 10.637 45.756 c +10.711 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.059 45.184 12.308 45.63 c +12.556 46.076 12.396 46.641 11.95 46.89 c +11.536 47.12 11.023 46.996 10.752 46.62 c +3.098 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.938 c +-17.094 15.34 -14.476 9.157 -9.773 4.528 c +-7.341 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.446 -0.249 0 0 c +f +Q + endstream endobj 303 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 353.3784 369.4727 cm +0 0 m +-0.492 0.101 -0.972 -0.217 -1.072 -0.709 c +-1.118 -0.937 -1.072 -1.16 -0.964 -1.347 c +-6.365 -7.656 -15.433 -9.511 -22.933 -5.706 c +-24.593 -4.863 -26.087 -3.791 -27.386 -2.529 c +-27.375 -2.498 -27.363 -2.468 -27.356 -2.435 c +-27.256 -1.943 -27.574 -1.463 -28.065 -1.362 c +-28.206 -1.334 -28.344 -1.343 -28.474 -1.377 c +-30.02 0.417 -31.211 2.517 -31.969 4.835 c +-33.475 9.44 -33.096 14.356 -30.904 18.678 c +-28.832 22.764 -25.371 25.854 -21.106 27.45 c +-20.989 27.344 -20.845 27.264 -20.678 27.229 c +-20.186 27.13 -19.706 27.447 -19.606 27.939 c +-19.506 28.432 -19.823 28.911 -20.315 29.012 c +-20.807 29.111 -21.287 28.794 -21.388 28.302 c +-21.391 28.287 -21.39 28.272 -21.392 28.258 c +-25.865 26.587 -29.495 23.35 -31.668 19.065 c +-33.964 14.54 -34.359 9.392 -32.783 4.568 c +-31.986 2.131 -30.731 -0.075 -29.103 -1.959 c +-29.115 -1.996 -29.13 -2.032 -29.138 -2.072 c +-29.238 -2.564 -28.92 -3.044 -28.428 -3.145 c +-28.281 -3.174 -28.137 -3.163 -28.002 -3.125 c +-26.638 -4.453 -25.067 -5.584 -23.321 -6.47 c +-18.727 -8.8 -13.573 -9.104 -8.952 -7.634 c +-5.628 -6.576 -2.583 -4.598 -0.22 -1.796 c +0.219 -1.815 0.619 -1.517 0.709 -1.072 c +0.81 -0.58 0.492 -0.1 0 0 c +f +Q + endstream endobj 304 0 obj <>/XObject<>>>/Subtype/Form>>stream +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 2 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm0 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 2 w 10 M 0 j 0 J []0 d +/GS0 gs +0 TL/Fm1 Do +Q +0 0 0 1 k +/GS1 gs +q 1 0 0 1 343.1801 186.3174 cm +0 0 m +-4.936 0 -8.937 4.001 -8.937 8.937 c +-8.937 13.872 -4.936 17.873 0 17.873 c +4.936 17.873 8.937 13.872 8.937 8.937 c +8.937 4.001 4.936 0 0 0 c +0 22.427 m +-7.45 22.427 -13.49 16.387 -13.49 8.937 c +-13.49 1.486 -7.45 -4.554 0 -4.554 c +7.45 -4.554 13.49 1.486 13.49 8.937 c +13.49 16.387 7.45 22.427 0 22.427 c +f +Q +q 1 0 0 1 375.9946 195.9863 cm +0 0 m +0 -1.272 0.081 -3.445 0.242 -6.519 c +0.129 -6.519 l +-10.142 11.192 l +-16.466 11.192 l +-16.466 -12.454 l +-11.986 -12.454 l +-11.986 -1.326 l +-11.986 0.021 -12.088 2.275 -12.292 5.435 c +-12.147 5.435 l +-1.86 -12.454 l +4.512 -12.454 l +4.512 11.192 l +0 11.192 l +h +f +Q +q 1 0 0 1 397.1357 203.0713 cm +0 0 m +0 4.107 l +-13.619 4.107 l +-13.619 -19.539 l +0 -19.539 l +0 -15.398 l +-8.604 -15.398 l +-8.604 -9.301 l +-0.598 -9.301 l +-0.598 -5.192 l +-8.604 -5.192 l +-8.604 0 l +h +f +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +2 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm2 Do +Q +q +0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 0 g +2 w 10 M 0 j 0 J []0 d +/GS2 gs +0 TL/Fm3 Do +Q + endstream endobj 305 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 326.3413 215.3164 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.425 -0.596 -1.43 -0.888 -1.328 -1.139 c +-1.564 -1.357 -1.797 -1.581 -2.025 -1.812 c +-10.525 -10.448 -10.415 -24.388 -1.78 -32.888 c +-0.951 -33.703 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.814 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.23 1.348 -34.385 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.933 -0.646 -1.696 c +-0.266 -1.769 0.135 -1.6 0.334 -1.242 c +0.42 -1.089 0.454 -0.921 0.447 -0.757 c +6.013 3.7 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.025 22.065 2.472 c +22.314 2.918 22.154 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 306 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 327.9521 209.9248 cm +0 0 m +-6.526 -6.631 -6.441 -17.334 0.188 -23.86 c +3.371 -26.993 7.599 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.912 -28.685 c +12.993 -28.828 13.11 -28.953 13.265 -29.039 c +13.711 -29.288 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.612 -27.672 14.166 -27.423 c +13.72 -27.174 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.898 -27.802 12.893 -27.812 c +8.396 -28.058 4.03 -26.418 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.612 c +6.625 5.487 16.357 5.744 22.673 0.104 c +22.541 -0.307 22.711 -0.768 23.103 -0.986 c +23.549 -1.235 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.451 0.381 24.005 0.63 c +23.781 0.755 23.528 0.777 23.3 0.712 c +16.641 6.702 6.346 6.446 0 0 c +f +Q + endstream endobj 307 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 351.0293 183.3867 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.374 -0.564 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.463 -17.905 -4.462 -24.006 1.543 c +-25.356 2.872 -26.474 4.374 -27.344 5.998 c +-27.325 6.025 -27.303 6.051 -27.287 6.081 c +-27.038 6.527 -27.197 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.044 7.452 c +-28.99 9.67 -29.497 12.073 -29.517 14.557 c +-29.556 19.488 -27.671 24.14 -24.212 27.655 c +-20.94 30.979 -16.629 32.907 -12 33.14 c +-11.919 33 -11.804 32.878 -11.653 32.794 c +-11.207 32.545 -10.643 32.705 -10.394 33.151 c +-10.145 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.761 34.499 -12.01 34.053 c +-12.018 34.039 -12.021 34.025 -12.028 34.012 c +-16.882 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.429 19.714 -30.389 14.549 c +-30.368 11.938 -29.832 9.411 -28.833 7.082 c +-28.857 7.05 -28.883 7.019 -28.903 6.982 c +-29.152 6.536 -28.992 5.973 -28.545 5.724 c +-28.412 5.649 -28.269 5.615 -28.125 5.611 c +-27.213 3.901 -26.038 2.32 -24.618 0.922 c +-20.881 -2.756 -15.976 -4.643 -11.04 -4.643 c +-7.49 -4.643 -3.924 -3.663 -0.768 -1.674 c +-0.348 -1.828 0.132 -1.662 0.357 -1.26 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 308 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 332.4194 175.9551 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.094 c +-4.076 1.078 -6.809 2.834 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.945 c +-16.325 28.312 -13.893 34.315 -9.427 38.852 c +-4.193 44.17 3.256 46.713 10.638 45.756 c +10.712 45.559 10.85 45.384 11.049 45.273 c +11.495 45.024 12.059 45.184 12.308 45.63 c +12.557 46.076 12.397 46.641 11.951 46.89 c +11.536 47.12 11.024 46.996 10.753 46.62 c +3.099 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.938 c +-17.094 15.34 -14.475 9.157 -9.772 4.528 c +-7.34 2.134 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.901 -1.616 c +-0.455 -1.865 0.108 -1.706 0.357 -1.26 c +0.606 -0.813 0.447 -0.249 0 0 c +f +Q + endstream endobj 309 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 338.1704 356.9717 cm +0 0 m +-0.376 0.077 -0.744 -0.092 -0.941 -0.396 c +-4.138 -0.204 -7.219 0.626 -10.11 2.093 c +-15.688 4.922 -19.83 9.753 -21.772 15.697 c +-23.716 21.642 -23.229 27.987 -20.399 33.564 c +-17.083 40.103 -10.867 44.701 -3.672 46.005 c +-3.543 45.842 -3.362 45.72 -3.143 45.675 c +-2.651 45.575 -2.171 45.893 -2.071 46.385 c +-1.971 46.877 -2.288 47.356 -2.78 47.457 c +-3.237 47.55 -3.679 47.28 -3.821 46.848 c +-11.282 45.497 -17.725 40.729 -21.163 33.952 c +-24.096 28.17 -24.601 21.593 -22.587 15.432 c +-20.572 9.27 -16.279 4.261 -10.498 1.328 c +-7.508 -0.188 -4.321 -1.048 -1.016 -1.249 c +-0.902 -1.513 -0.666 -1.72 -0.363 -1.781 c +0.129 -1.882 0.609 -1.563 0.709 -1.072 c +0.81 -0.58 0.492 -0.1 0 0 c +f +Q + endstream endobj 310 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 506.6396 404.7549 cm +0 0 m +-0.007 0.006 -0.013 0.014 -0.021 0.02 c +-0.414 0.31 -0.911 0.123 -1.13 -0.397 c +-1.255 -0.695 -1.26 -1.036 -1.17 -1.329 c +-1.378 -1.585 -1.584 -1.846 -1.784 -2.116 c +-9.273 -12.195 -9.176 -28.468 -1.568 -38.39 c +-0.838 -39.342 -0.05 -40.214 0.778 -40.999 c +0.757 -41.403 0.907 -41.807 1.192 -42.017 c +1.585 -42.308 2.082 -42.121 2.301 -41.6 c +2.521 -41.079 2.38 -40.421 1.986 -40.13 c +1.729 -39.939 1.427 -39.958 1.187 -40.138 c +0.405 -39.393 -0.338 -38.565 -1.029 -37.664 c +-8.335 -28.137 -8.429 -12.51 -1.237 -2.83 c +-1.02 -2.538 -0.796 -2.257 -0.569 -1.98 c +-0.234 -2.064 0.119 -1.867 0.294 -1.45 c +0.37 -1.271 0.4 -1.075 0.394 -0.883 c +5.297 4.318 11.907 5.92 17.926 3.249 c +17.963 2.931 18.103 2.637 18.332 2.468 c +18.725 2.177 19.221 2.364 19.44 2.885 c +19.66 3.406 19.519 4.063 19.126 4.354 c +18.812 4.586 18.436 4.511 18.184 4.208 c +11.947 6.982 5.101 5.349 0 0 c +f +Q + endstream endobj 311 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 508.0586 398.461 cm +0 0 m +-5.75 -7.739 -5.675 -20.233 0.166 -27.852 c +2.97 -31.508 6.696 -33.512 10.581 -33.512 c +10.846 -33.512 11.111 -33.502 11.376 -33.482 c +11.448 -33.65 11.551 -33.796 11.686 -33.896 c +12.08 -34.188 12.577 -34 12.796 -33.479 c +13.016 -32.959 12.874 -32.301 12.481 -32.01 c +12.088 -31.719 11.591 -31.906 11.372 -32.427 c +11.367 -32.439 11.364 -32.452 11.36 -32.465 c +7.397 -32.751 3.55 -30.837 0.705 -27.126 c +-4.834 -19.902 -4.905 -8.054 0.548 -0.714 c +5.838 6.405 14.411 6.706 19.977 0.123 c +19.86 -0.357 20.01 -0.896 20.355 -1.15 c +20.749 -1.441 21.245 -1.255 21.464 -0.733 c +21.684 -0.213 21.543 0.445 21.15 0.736 c +20.953 0.882 20.73 0.907 20.529 0.831 c +14.661 7.824 5.591 7.525 0 0 c +f +Q + endstream endobj 312 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 528.3911 367.4834 cm +0 0 m +-0.394 0.29 -0.89 0.104 -1.109 -0.417 c +-1.211 -0.658 -1.232 -0.928 -1.19 -1.178 c +-7.522 -6.376 -15.775 -5.209 -21.15 1.802 c +-22.34 3.353 -23.325 5.106 -24.092 7.002 c +-24.075 7.033 -24.056 7.063 -24.041 7.099 c +-23.822 7.619 -23.962 8.277 -24.355 8.568 c +-24.468 8.651 -24.588 8.69 -24.708 8.699 c +-25.542 11.287 -25.989 14.093 -26.006 16.991 c +-26.04 22.748 -24.38 28.179 -21.332 32.281 c +-18.45 36.161 -14.651 38.412 -10.573 38.685 c +-10.502 38.521 -10.4 38.379 -10.267 38.28 c +-9.874 37.989 -9.377 38.176 -9.158 38.697 c +-8.938 39.218 -9.08 39.876 -9.473 40.167 c +-9.866 40.457 -10.362 40.271 -10.582 39.75 c +-10.588 39.734 -10.592 39.717 -10.598 39.701 c +-14.875 39.421 -18.857 37.063 -21.879 32.995 c +-25.072 28.699 -26.81 23.013 -26.774 16.983 c +-26.756 13.936 -26.284 10.985 -25.404 8.267 c +-25.425 8.229 -25.447 8.193 -25.465 8.151 c +-25.685 7.63 -25.543 6.972 -25.15 6.682 c +-25.033 6.595 -24.906 6.555 -24.78 6.55 c +-23.976 4.554 -22.941 2.708 -21.689 1.076 c +-18.397 -3.217 -14.076 -5.419 -9.727 -5.419 c +-6.599 -5.419 -3.458 -4.275 -0.677 -1.954 c +-0.307 -2.135 0.117 -1.94 0.314 -1.47 c +0.534 -0.949 0.393 -0.291 0 0 c +f +Q + endstream endobj 313 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 511.9946 358.8086 cm +0 0 m +-0.3 0.222 -0.661 0.163 -0.912 -0.109 c +-3.591 1.259 -5.999 3.309 -8.071 6.011 c +-12.068 11.224 -14.294 18.187 -14.338 25.617 c +-14.383 33.048 -12.24 40.056 -8.306 45.352 c +-3.694 51.56 2.869 54.527 9.373 53.411 c +9.438 53.181 9.56 52.977 9.734 52.847 c +10.128 52.557 10.624 52.743 10.844 53.264 c +11.063 53.785 10.922 54.442 10.529 54.733 c +10.164 55.004 9.712 54.857 9.474 54.419 c +2.73 55.577 -4.072 52.501 -8.854 46.065 c +-12.932 40.576 -15.152 33.312 -15.106 25.609 c +-15.061 17.906 -12.753 10.688 -8.61 5.285 c +-6.467 2.491 -3.978 0.369 -1.208 -1.049 c +-1.182 -1.389 -1.037 -1.708 -0.794 -1.887 c +-0.401 -2.178 0.096 -1.991 0.315 -1.47 c +0.534 -0.949 0.394 -0.291 0 0 c +f +Q + endstream endobj 314 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 681.4711 401.9571 cm +0 0 m +-0.008 0.005 -0.015 0.012 -0.023 0.017 c +-0.47 0.266 -1.033 0.105 -1.282 -0.341 c +-1.424 -0.596 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.358 -1.797 -1.582 -2.025 -1.813 c +-10.525 -10.448 -10.415 -24.389 -1.78 -32.889 c +-0.951 -33.704 -0.057 -34.451 0.883 -35.123 c +0.86 -35.47 1.03 -35.815 1.353 -35.995 c +1.799 -36.244 2.363 -36.084 2.612 -35.638 c +2.861 -35.191 2.701 -34.628 2.255 -34.379 c +1.962 -34.216 1.62 -34.231 1.348 -34.386 c +0.46 -33.747 -0.384 -33.038 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.717 -1.404 -2.425 c +-1.157 -2.174 -0.903 -1.934 -0.646 -1.697 c +-0.266 -1.77 0.135 -1.6 0.334 -1.243 c +0.42 -1.089 0.454 -0.921 0.448 -0.757 c +6.013 3.699 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.114 c +21.253 1.865 21.816 2.024 22.065 2.471 c +22.314 2.917 22.155 3.481 21.708 3.73 c +21.353 3.929 20.925 3.864 20.639 3.605 c +13.56 5.981 5.79 4.582 0 0 c +h +S +Q + endstream endobj 315 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 CS 1 SCN +1 w 10 M 0 j 0 J []0 d +/GS0 gs +q 1 0 0 1 683.082 396.5645 cm +0 0 m +-6.526 -6.63 -6.441 -17.333 0.188 -23.859 c +3.371 -26.992 7.6 -28.708 12.01 -28.708 c +12.31 -28.708 12.611 -28.7 12.912 -28.684 c +12.993 -28.827 13.11 -28.952 13.265 -29.038 c +13.711 -29.287 14.274 -29.127 14.523 -28.681 c +14.772 -28.234 14.613 -27.671 14.167 -27.422 c +13.72 -27.173 13.156 -27.333 12.907 -27.779 c +12.901 -27.789 12.899 -27.801 12.894 -27.812 c +8.396 -28.057 4.03 -26.417 0.8 -23.238 c +-5.487 -17.049 -5.567 -6.898 0.622 -0.611 c +6.626 5.488 16.357 5.745 22.673 0.105 c +22.541 -0.306 22.711 -0.767 23.104 -0.985 c +23.55 -1.234 24.113 -1.074 24.362 -0.628 c +24.611 -0.182 24.451 0.382 24.005 0.631 c +23.782 0.756 23.528 0.777 23.3 0.713 c +16.641 6.703 6.346 6.447 0 0 c +h +S +Q + endstream endobj 372 0 obj <> endobj 371 0 obj <> endobj 370 0 obj <> endobj 369 0 obj <> endobj 368 0 obj <> endobj 367 0 obj <> endobj 366 0 obj <> endobj 365 0 obj <> endobj 364 0 obj <> endobj 363 0 obj <> endobj 362 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 329.1758 212.4824 cm +0 0 m +-0.008 0.005 -0.015 0.011 -0.023 0.016 c +-0.47 0.265 -1.033 0.104 -1.282 -0.342 c +-1.424 -0.597 -1.429 -0.888 -1.328 -1.139 c +-1.564 -1.358 -1.797 -1.582 -2.025 -1.813 c +-10.524 -10.448 -10.415 -24.389 -1.78 -32.889 c +-0.951 -33.704 -0.057 -34.451 0.884 -35.124 c +0.86 -35.47 1.03 -35.815 1.353 -35.996 c +1.799 -36.245 2.363 -36.085 2.612 -35.639 c +2.861 -35.192 2.701 -34.629 2.255 -34.38 c +1.962 -34.216 1.62 -34.231 1.348 -34.386 c +0.46 -33.748 -0.384 -33.039 -1.168 -32.267 c +-9.46 -24.104 -9.566 -10.718 -1.403 -2.425 c +-1.157 -2.175 -0.903 -1.934 -0.646 -1.697 c +-0.265 -1.77 0.135 -1.601 0.334 -1.243 c +0.42 -1.089 0.454 -0.922 0.448 -0.757 c +6.013 3.699 13.515 5.071 20.346 2.783 c +20.388 2.511 20.547 2.259 20.807 2.113 c +21.253 1.864 21.816 2.024 22.065 2.471 c +22.314 2.917 22.155 3.48 21.708 3.729 c +21.353 3.928 20.925 3.863 20.639 3.604 c +13.56 5.981 5.79 4.582 0 0 c +f +Q + endstream endobj 359 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 330.7866 207.0899 cm +0 0 m +-6.526 -6.63 -6.441 -17.334 0.188 -23.86 c +3.371 -26.992 7.6 -28.709 12.01 -28.709 c +12.31 -28.709 12.611 -28.7 12.913 -28.685 c +12.993 -28.827 13.11 -28.952 13.265 -29.038 c +13.711 -29.287 14.274 -29.128 14.523 -28.682 c +14.772 -28.235 14.613 -27.671 14.167 -27.422 c +13.72 -27.173 13.156 -27.333 12.907 -27.779 c +12.901 -27.79 12.899 -27.801 12.894 -27.812 c +8.396 -28.057 4.03 -26.417 0.8 -23.238 c +-5.487 -17.05 -5.567 -6.899 0.622 -0.611 c +6.626 5.487 16.357 5.744 22.673 0.105 c +22.541 -0.307 22.711 -0.768 23.104 -0.985 c +23.55 -1.234 24.113 -1.075 24.362 -0.629 c +24.611 -0.183 24.452 0.382 24.005 0.631 c +23.782 0.755 23.529 0.777 23.3 0.712 c +16.641 6.703 6.346 6.446 0 0 c +f +Q + endstream endobj 360 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 353.8642 180.5518 cm +0 0 m +-0.446 0.249 -1.01 0.089 -1.259 -0.357 c +-1.375 -0.563 -1.398 -0.795 -1.351 -1.009 c +-8.538 -5.462 -17.905 -4.462 -24.006 1.544 c +-25.356 2.873 -26.475 4.375 -27.345 5.998 c +-27.325 6.025 -27.304 6.051 -27.287 6.081 c +-27.038 6.527 -27.198 7.091 -27.644 7.34 c +-27.771 7.411 -27.908 7.445 -28.045 7.453 c +-28.991 9.67 -29.498 12.073 -29.517 14.557 c +-29.556 19.488 -27.672 24.141 -24.212 27.655 c +-20.94 30.979 -16.63 32.907 -12 33.141 c +-11.92 33.001 -11.805 32.879 -11.653 32.794 c +-11.207 32.545 -10.644 32.705 -10.395 33.151 c +-10.146 33.598 -10.305 34.161 -10.751 34.41 c +-11.198 34.659 -11.762 34.499 -12.011 34.053 c +-12.018 34.04 -12.022 34.025 -12.028 34.012 c +-16.883 33.771 -21.403 31.751 -24.833 28.267 c +-28.457 24.586 -30.43 19.715 -30.389 14.55 c +-30.368 11.938 -29.833 9.411 -28.834 7.082 c +-28.858 7.05 -28.883 7.019 -28.903 6.983 c +-29.152 6.537 -28.992 5.973 -28.546 5.724 c +-28.413 5.649 -28.269 5.616 -28.126 5.611 c +-27.213 3.901 -26.039 2.32 -24.618 0.922 c +-20.881 -2.756 -15.976 -4.642 -11.04 -4.642 c +-7.49 -4.642 -3.924 -3.662 -0.769 -1.674 c +-0.349 -1.828 0.132 -1.662 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 361 0 obj <>>>/Subtype/Form>>stream +0 0 0 1 k +/GS0 gs +q 1 0 0 1 335.2544 173.1201 cm +0 0 m +-0.341 0.19 -0.75 0.14 -1.036 -0.093 c +-4.077 1.079 -6.81 2.835 -9.161 5.149 c +-13.698 9.615 -16.224 15.58 -16.274 21.946 c +-16.325 28.312 -13.893 34.315 -9.428 38.853 c +-4.193 44.17 3.256 46.713 10.637 45.757 c +10.712 45.559 10.85 45.384 11.048 45.273 c +11.495 45.024 12.059 45.185 12.308 45.631 c +12.557 46.077 12.396 46.641 11.95 46.89 c +11.536 47.121 11.023 46.996 10.752 46.62 c +3.099 47.612 -4.622 44.977 -10.049 39.464 c +-14.678 34.761 -17.198 28.537 -17.146 21.939 c +-17.094 15.341 -14.476 9.157 -9.773 4.528 c +-7.341 2.135 -4.515 0.316 -1.371 -0.898 c +-1.342 -1.189 -1.177 -1.463 -0.902 -1.616 c +-0.456 -1.865 0.108 -1.705 0.357 -1.259 c +0.606 -0.812 0.446 -0.249 0 0 c +f +Q + endstream endobj 376 0 obj <> endobj 375 0 obj <> endobj 374 0 obj <> endobj 373 0 obj <> endobj 356 0 obj <> endobj 355 0 obj <> endobj 354 0 obj <> endobj 353 0 obj <> endobj 352 0 obj <> endobj 351 0 obj <> endobj 350 0 obj <> endobj 349 0 obj <> endobj 348 0 obj <> endobj 347 0 obj <> endobj 346 0 obj <> endobj 345 0 obj <> endobj 344 0 obj <> endobj 274 0 obj <>stream +H‰ìWK®ÇÜ¿Sô^³~YŸ­(À+Ã0¼ð²èQ€ÄûŠˆÌêé!yø2¦ª«ò™õ韏OÿœŽŸ~þ|¼¥CÿÎdÇooŸþö¯tü÷«~,5ŸuÎ֝eþòöŸ·OŸ±þøzäãøúøý­•såq´™ÎÙËQÊÙÇ8ÞË9«ùà¨8`¶|Îu¼?Ïû÷ñûuýÀíà\¢|Œ…“Ë,G³3g(ñø¢ü¿œ¹ã˜tâÆzƒœOÏ7ÜoiÃ÷zfÜ9HÜä"öìOðcMsŸ{uWÀ´¿Iûœ¡_¿lG8'•m>$Ðy¥J§íO$òL TÉd'öòèuWŒH–ò’½ê÷ï·b„áŸ/¾mg[ ¾ECnçj§9²sZÇޅàôÓz?ò¹p­Ë7äNÙÑí3r#µáÛnÝý*RÇ­.=ó¨ÜŽ”ä )¯ywÁ}Ž>æÝ¥Œ¡a§†Ž g¥k'œ Ýè d+ݜ]?—+G•h2>o™±}‚ÒµSÝKúõ#g•¶óó¼9vAYìãÎm!A™Ô¤‘ëCƒ‹Rü…Ëðsí?6LÒúd.Í9X(çZ9P>› bÙ%/›º‘¨ÃÂ;нšÆÌppÝêðã©ÏÖÍa3¬·Ê:@XÓtôA›D¡ò²µæ%§ì†!brF/•™%'¤J'ŒVµ+Pòƒ‡ 4莊œT(§òv©#˜3ø[ÃÉ ÛRŒsÞà±Mü}P ·r·!û:?y2y²¹_:-ËЋ$atê|Š¹™-!njUÜ5õ^‰xT UÈBö*J$µýeðÜá[èzGp”6©Ža‰JŽ2E.IYR\rg¥$7}ÁIäSL´†2TP†É4ÖIkÝB(j„y‘?’ƒAq×íx《0ZŽ`Qçñ}µ³®â®æ–/@’DùúÁ-(„‰wA +EþnìBÖB¥D‡#ÆÚHV0O÷ªû‘~ù¸ûø[658£f¯õ5ë--ÀÛâ;g eÕe‚“ðèûÅPÙÊ(]ëÜ°{2F[¦;¹Í—)\H¢È›Æ“²L"¥ç–X;û<^¼e¯©ѪÎÓø¢"Ñuˆ~§Ìû˜PŽpwæ +cÅN¿™VZétl˜Ì,É<¹R1Ö|Eúžë,³ÙD)s"©î”²ìF)AQY•_óܝ*ЮÙú†Ð}²Òضܧ5‹Z™šo¡OI6ìtÕìނɚǯLô}9L±e ^âD fjèH$ä÷¦RB¦–ÌGœ´1ŸâNfHç|׺—o]D¹Ññ Ê¿‰;È=œG­q°ËT¹@=GðÌà ×JȜÂ]IGi0Gh2¹™9Hs½9Ãð/¬ïU×{uÒÍìëəîÙ5žþZɓÍ.EbŽüŒç±mxu=+?Α ±ÝgŽ{%ª«rŠ) +P^´”y‹ÿùö‰ÿ[۲خð± ʯ“ƒW#õë^©}zk͜ÖÓªº† ¹Îæf25}6…¬vZô?2J õ}òíñŸ]}7gfÿÞóÎO¦kùÛ¾-dÝTpŠ©ðQ—O™Ò¥*Is}³¾ÒÔÇ{_󱋍`°íÿ¿ëï®?ÿgºþ-Ð*—jpÐÚ~ï†E*ªL܆u’§GÊRºd­2œZ9O¼¢½ó2ö†ö¾óÑòZîÐúŒ¬zWËÎz¹Ìb¬NENîv¢¬ŽLà%ë­4G™«•–Æ2/Ñ.ý-²úª2»`Òl¾~Ìq“IlYӆµÜ_§ ¶¶´!Mí¸d  çËR^˜·`«¤5õ{8§]ˆ—+¼è&hùec!ô”Ù]Ç«Š—ŸôÊsèÏ ¿ÿzr¤ê‰0“ÉOšÁ»ºS´¨¨ªý†VõŒ2@H¿ïÑ,Š7‰xß9’2 +eÙ-„Axwõ¬zwޖû›^¤ä%¤¢ƒ"*ʅæȊbÄMüÝê·h5)ñâÆï"É~n=Fådwºd‘%OMgæ“‹ø§¯z ª¿Æԝ8¦¹¬ nl’rMskÄCÐù YÛk‰2ã#̹^ǵ3ØyÍTœx¹OÐgÿ~VÖwŽzŸ(LµÅžÛNÏhÊÔpù¤@X•½*ۘP˜šD¹}ýê~5~ŸÅê×Ýî߀Ieäw}ì»_ž<ˆÑSüU "ü¿ÝR¡çI²VIå^Ԉ¯o‘îû3xދGÒ0Ǐ7Ì~×ÄÙ±Uï¶2¹ÇITôÖhšJ‘Ä“SÉz¬êdð†žÏ7,MÈTÍïrÙÐ)¼œˆ†Ú=ÛÒ80˜ñQc¨`Y²Á[§’i.ÊxM¹v“KWÝ#'Àª†SÕ¬Ó{2?ÓE5fÛ   >kŒKN9_ãà»4³fÄ &4Óxx1אauõü¬jó™•ìÓÈ +9ë©ñxsÅnêªä©Šj¥9H$rµzò's¼s*ÜÑÇޅGtüó.'&ÊÙ5$Èc¯t$ÜfôýÚèÁ­ é^åX¹®/Ÿˆçbóþa 2Æq};Ûú<Ú¡Îö›¯õTïßt¦™ÏÔ7\Ïf`•)ƑóÞϲWÿˆÉØ«võÞ4Ri ¦Ðë+ôjˆbn±|Çn¯û¼÷ý’Sç§ý‘‡‡­ç€ØZVm +zn’³ºÏ¬<ہ´LTË·½È¥&ÂP™œ€‘‘¥„æSºªìä{¯Û'bÕh¯pÇõD„ë³d«‘_ÉÈT/ft=®^LÄNP^Èá/7¬1°aØÏ4*›…ªY(ï¸,uU(ØevÂC…¦rGYŸÙîÕUƒßšP +ÙÊÍï <õå‘Y‘5÷zö*+%@ò 4µhڍDØÊÜ á@SÕxk)Tñ˜M/ŸûÌ,ÐG ¬AÛ'ÚzC1éõ5Ô´ûÜò{ +ž +*"½|BiÑ5}"!òüêÏUüYÕ§9m¦¼}÷ðQNó +i¨6­²œ7ò-ÚXîw7áÏ2@¶ äÓVÓÊU/ȧæ¹ã²¡yû —Ès6Jh\…™×F® C«‘‡CÜûš¥ßÎYÁ@…:£ö¿Ø¯’$[Ž¶×)þڑ#3ó< +Eü…þÆ÷_˜È^+l­Zu¡«^ðÉ0¾……ÏZ…%T4°…ÝЬÕi…6=‡ž °ˆÓ K¤U,g„³[@‘9Tm`×(m¹ ä%‚îµ³!UG“t¯K…æö›âáv°Év?´„Ö$~Nq~9È( ‰‹ã|Oq0 ¤1;Ømèé±Ö9ã\>E™ +;bR'ïÚ$“@ì¶aóz뗨ù»’mÛ9¤Uw0¿úýÀè~杊S®5xg§Iór…ßCì` ØA゠”YézO”ó‘/˜xfҎœÉ¦ƒurjÖíp ¡Ú +¤ø±[fÇû3û]¹U£k}Áºâ¼’ŒrÁ/1§±z1ßÅìt¡Ð”z½UñýãÝÏ6Zv{Ô³Ù»$àp%îܽêÐ wßg^ô\]-7>Q~马õÒùåBg{ÂSÇ\Ù°…ŠÙû$` K¨q ÄÏV[rmËbEVRãI/¤ØRÈ a `´Ãšq +®µÚÃð=&ÂCˆý$ÛÞ†c¾ïûD˜VïÛˆÁ-Õ̓ƒ˜µn 8‰Þ½ˆÃ!L®ké^èÒå^Î]u| hrÕ~CnÐéžñ›„<óÛÊɥЬÀÅ!€'Âf£'dÜ0 ýUضGv¿GðPÝà V”6”¡ÛkŠË}o¤Jï¹5©¿r?‡¡nÆùJ±mËpvÈa<çl0ø +žè"dðˆ ýTƒì‡‚¬¦Íøû~–Wå@T†Õõ6Ö&5Y“õ~T*³MXùÊIo¡¦§T¼ÕÁ,ü:0p²_‰=Sƒ|<[uϦGp˜S ¨úÕª}…À}¶%S0Vzg¾|ï>òW%m?…¬é?!«œ\/;bÊҗüQ8°é®xðpñè$ѯ DµhE4Nó¢B›ÇOøXÄ~<Ì( |ë«írŸLHC€]8ö^ûæÿ½ûŠw¬[2/*W˜GM©¼D~-ɗ`¶pêó0N‰˜§Ðs¦\óǁ +Oi¶.}p-”3k“ÊX¤Ò­H.[wހ’]zB7t•©Üñ܇®ãt¡„^þ!ñôàzÃ`ðë«ä@~[7(pVb¢À!×PÍ€XWÍwNAзcùœ—*t¤âê5¯µ±ú¶\ßB“)†`Ðk؜5Ǝ!ÐÃ'¦ÇÈ:}‡%Ë°ˆé!ˆz§ËMZ7Ï΂әÆÃÿ ¥Aü6y5áúpí!+Ûuل­ÐRõ#¯QU]‚_ñu¬áùP zã÷°Df¿Þꢑ‰W¾™õå»y·ýϚ‡øÍ»æú† +~Ô|;WÍèdÍ{ôj"ߨiÆژ{cÈã a®ÕZíüðƒ©5¨ ô‹¿{6P-Y÷ ¸ÒQ±Gi»T foÔ(êK~s¢ŸÌ[5­/8ô-Áo­à¥Àxñλ¾‚a¬²¬aW|‰Vj¨3gݺa™+µË°e$½³ÃÚ¯„röș˜¹HžÞZŒ¢\ ·X›…]çRËØß0l@ÓçòW/ˆ1³\œZ$à étp•eU8+žÁÁkœ@~Ek¤ßϞ·.BD@Iý(óµªðV"F{– þVEi”‚G0>‰´0Zý'ÍÿïiöC Ïâ°ËٟÚ[(à Q•­ÁŸ? ìLxbßcS0çijz†¦MכåÌç—<ôŒœMZãG¦±A|ße­|ÎA•-û7€¹œ¡á 6 ԋˆ›­ÐbŒm +( ¹-©—|üÆrS%áï/éÝí.ÿ˜uªY&d315õ WpJË< L²Ò¸y—ü +¨ë#mžü¦žQ· zf±@þõÎßè™æ…— „ÅkKp»e¶¢e¯€YÑ]¹\’”Eäu»k"6a[W‰Á팉T›ìf]‡‡©Èe§!„ÆÍÍE[g¹î©c• ñt«®ë­æûA ŸÑûVØÓË®å¯ +ÛÚfe{.´sá©|ÙÍc™ç5zNcÁÀ¡[w¸kB*ŒütHy±œå0„cigÓÀ)÷ËBDï¶Ïº¬&«wùñªãÿÁ÷}¸¢›;¢Ê{þç¸ñ†-æÆËóê?d[%ö ™(÷þÂ-†—ô½Â±~‘ÿ™^Víǽ¤ǽ÷þý·ûùEž2WxßI}¤ÔOVV[œùjmç-Imt1ð8hˆ24íð©õ}ƒ’ÂøÄ +®%±²lÕoXç«ÙõÖ²¯?!9]ä«û,ú+±()4cåáÌ×Ø _â=ѝ ê ΓÒºô¯ Ãcäóåŧ Å·vØÁy0²0Ý]V€é„û •l/„r'°ž1uTñf]¹§¼ó‚u‰?fÀÐ Â;ÀSLV*¹z_+0#û‚PéÌ;¼ßz}ùV; cÎwax„ÚÑ9¶Oè݃kYßJº ÇÀ?fÜþòK'´n(·Ð—oT®'$¢ ÐGÃ^éàPgèš#òÝ>bpÓdÊ\BRÀG½±>ʏ£rÙ¸ð4‚_RڈgʈÕ@rP^€*g’Îòá¿pÎBÕ¬'ç<þCÆX““ìÅ(Žáœ³|¹:_øhÙ¬õÀÁ9ׂ1®‚Q®=.ιN‘_ä)s…÷=>8g{‚ÃàÄbóƒsЏÜíi—[`I×1ó]*6%v5D~J2‡<¯ +ë"gü‡ý*G’$9bú¾¢>0mqï[³ºþ_ pÌ¬ækk#RéTd\~Àá8ÌqŠENB–ïd˜¯BL“ùåfi㦧Ú` ø +Qlk ‡I©/­Ði^¨K¹n&¤ìmûù¾ð\ì[æ.«¡sïÿ-?ETG~TgqäçMc¶9úl š‹¨ÔPãZü¤ƒP^‰Ôwhɔ÷ÓìÊvÖ¦‹J-‘¦Há*¢Ó\ôs£nd>E¤ü}ijŠ½o{m[Væ= ? †ÿ¶zRÍÁåõ NڋÇÄðý˜nd„ªÑ>Ðb܃¾Šz&¸­èå+m'|®Rú"¯—”>á±ckÖÙϑªï ˜bÍòL£¯ZM™<*m(æ•nÄ_µŽÅl¥²ÞOYÏ~|d§bŸkÝn5¥tBÌêðX·z÷>MòÚ­Cÿí·¦bòH\¨eÞºæí@z¥dG»b§’Æð^´D&⭝íÑ +£L¾$¹ &Õu]‹adú/‚ ëxFÛԂ΃©ÃÆ>a®Ù>i³¢µ=ž6E%K ¹“,Zl#î–Q + +ìkÅyNɶƒ$°j@=v±HO¶Î#F_ÒnŽ)­¨7þ›nxEr]~õÀlp½BœõÞ\Þ{ÝPcOtáäQ¶¥Cù[—ÏZ¸ù1K_«7*E¡ÓxŽahß(nëØTt·ÐZÚ=3P|=ÆY8#?šz¸ÂÒ6›ôŒPñ†.娸ÂÇF¾Z9ƟâCø$‡úàÏ,“JgÝ5.7Ò¾æÐräh.ÝdjdýK–,ÊÝÂÖëB-…=÷>F—mÑ¾_ŒUpWÀO&Ãù2Å5VL‚ÒFPaÊ´PQ)tÜÀ'=òL©ôõzÆå;• ˬnü‚þmBt@ƒ ÷.ÏF¢2Ið·r¨¦åcˆ ¸ZÈ;5($ O(×Lï°)€dø4I*z°&‚»î_zŒ© êv„^zrù=¤ÒI‚d3ɝŠKå&y@«@Žl&­u‰-á2W^¼(¡RÂ!Íÿº>!Ú|GƄmñKý\㉹ˆL'ì“ûL]0I˜­[CryÉ$ûX«A +ÕiQzó’“ÔÐÁO”ȁÈz`)‘M§sg=€â­¯€f—MP —ëŽ +Èîk¯s”)¬ùŽà׍m=a%ôî±¥ †èýª²O +`¤È£”zcßl¶,.̍mx +‰]ªÕ@kᚉ!ÙXé/ŒŒÁÒM´-~—OG?ÿ°¾å9f3©*VԘ‰.™ßúÊTÖmßÄæë:ÕgýF\ù¸ï³Q[öBÐÍêñLý¢nÄ.ƒ.vDY¨ÉþíQr:s–( 45½·Y °V½~"ªXŒ†ôÛòڝ +³Ê"ü;­[¥¬ÑÖ_=AĄlƒ[Rå¾æ•… »ÄגòÓ«±¤@ñ›¡ÊT¬'`p+Aò¤êwõ:çÚÒӉ«ª„ÊPá©ÍM•dé*;n)Hô†÷—¿'ú!tŒ©Vz+sEj¥#%võDõ1݉æSfÉÁåÆ)òÿ 7[â9c¯€§ê!Jd©h U7|iŽìàdˆYÐöLMýNKU0v§§†‡x´¡ûQÃdz¡ˆÈ²e9HEwœIۙ1ØX¼8'ñƒfFõ$ÈåˆjÈ;©Tys$UÞ¯Y·“i.-¹¬öÍiÆÎȅ™1t9mÚ^ã0ðÁjd÷¶ Ê: ꕷñªÕ÷5³clA(=Y·*gò4ì +åíp_«6Ý3ÓØÝ5çÂN«îiŽ¼³ªz§U›ÍV­^䈵cqnꍋV ¯}Í.óÖµò Ñ߅AŽ×J絯hõ:ÕgýF¾òvß'­îm‘bÍŸºî +c3É_ hSärÞ—¸GF¡O²èc5[>Dñl{ ˆ·D.>Îî‡21+eÙß`¦w¤—NaÅL•@G·D`÷T(ÌWð`õü½š®á_ooÏ4‘g±ü[xjÿ#žÚ‹§(rœ¨d¤`*¡wªjžY¿"«ýk²ªÿ«þY•;Wýªª•bu¼J² ¿ÏΙ®}Ð f{ó‘y©J&™[òø¶~´Cq*J>Bô@Nð-VYyÒfQmŠ²3à¼Ê¬wL7(=Š$+t°‚©:B, œ:»ãÆB06Ú,W*ØÆ|™y•:øY±V(Î}újü^+n’2½?£>U½i"Ô{wAÑPm;Ëçì–rPT³£”+îÓf¢–=øÀ™Ö†‹™:¾}©r°ª JC{é|øU…Äaî¨$-ž5MKx„áNŽ?)%pšõxËb¤f(»Ü¨x•‘æ™MQã÷ÆÍÀ®ìJ§ +OóÈÍruÚCÐT¿AóôÂ3³Òˆ7,iœY7tX=ø- ŒÜ­L:r‡Q[Ë|ž×»úÙês¸ùŠUt9 a‰ÍFa·šûŽýÑ\mœb‘ª/ê CÒ¼úu¡Ôá¯Â3×%/YäàOàêÊ_[.Í9c““+î>tʔ+ªîh¸ ­ÉUë¶2¦¼]%#J…øÊûC¬Ì•üº¿Qܦãga,{ƒÌA‘S/ é+Ž©­¯ä}°’ÐzeÐ63¨"™GÈWU繎GrñËÀX܏y¿«bqñé]<äáÀ¡YŸ‹×&/ä|­´J¹Ä°A3I7c€ìÊ.2;ÃJY‚šðBV©¡›ùޖ3‚Æp $ë®ÅÌ+YqrÝñǹ$Jü¼Í:ÛµÆIõ2ŸXOÉëՒòâ¨ßЎŒ&,%SŒ­¢êjÕΘ?”Œ“cSH¬èB +W¥O³SxXB° ùMΤ IÖ_ÏðüN-&8Ùޙu>šrzÏ6Ú27xkÐ$Ó©{Öq=3\OñX,¬sˆÂ’<óF@µž¬ÐÓ¥cV½¼!x°vÓ¹óvFáªEP¤ÕŽfUÓeČå ¬‰†>ÜöfºndÕ0›ÌŸµ=X¹ÛÑýXç‰(éÖÆxo*g…H²W–y4Yóš›å/ /¯”K ¾´;ÁÌå,™\ÒÇ €5yµ3§ +6~ñÜiÕ¾B¤×§š€ª!mÉuR4G +²ÈÍ)»è…Æ^c4u¹-3gçrfíþ^ïš_ó‡†Rô+WxÛyng'Ürq0MQ…±uR,en»ÙÈ,Ÿ+¬ˆ±`eTòálY°ábnSô°³Q邶@Ë£c· ñí-B‘cc7gFóÏ+Lvs¤™äc¥åTº.ø㨧9ég¦n0œWÑyfORŽY^w‹m³•ˆ‹šßdô¦k ½îÍ@Éé?ÓèÍÚYv2‘#O_f¦ÅÅǜ7ä’òû@âQû%6²¹³gÕÚ¯9=èd€Ü¨“d¤6iLÕXÔ¶´ù:¥§**÷@1Ùdò±æä«ÃbnC¿[¼ˆ ãõbqö¯?mÞ*QCodä^ý÷_¶… vȈÚd5ĸ¢uü“gt®¸¾˜õ±ÃI’¹ýÐáµ³¼òŠ×ÂZ +Ä×µÃóxú-ºÆ4— IßBqüèaċƒm˪;ªº€xf®˜“˜< €ˆ‹LŸ(*ò«ÞUZ…ܧXäLd/œ—ó¡­.,Èj‹¶ÂŽÓ¶¡ $“¯áP‚Z͈7>-ßu·³_-ɕÜHlߧФ(þÉó8áˆqo|ÿÅ$€ä§ž,ɒzVžTxd±’$‰â>ܳpTÌ7gh¯Ò·ö—qŸœdù8` +ñ¥„‘"Ϻ%7aWÝQš"r*ØôzfYÑõ­Ê¹œç³¤–-­œL¬^Ãsz{»Qå¼AºǬŒWV"«†Âu(ûgFjê’Úùµk?þñxl­[ð#~ÄËú/ÇÉËvò²m^¶/Ç»¼¬¿š—uó’Ñ:1ۘÌT@‹šõ×R³£|gJÓUÂÁLí†Ûó;†xÑ—+Ï:E{éÞÉ®6ÁQîù½ÏE a} +²®w “=är8ÿ2Çèƒ^á5ߎ!”×8¸Ëó×÷«>,|Í:îþÑ N ®ƒþÏÇ®ÎfŠÄÌMK›÷ŠÝ=›Š·ñ-Qȇ&„±4¡Š@&E¶‘x! Ua 3H%Ï1+Ka.a NÈk¹bùá XuN®/þ<õÅáÌë‚ä}§¾8”¾dsOyjHf±ô%©i´º–Ü^À¸ÉjÚ +á–3“¸Õpª[Ú_Xîc«Û8Ô͉ðiyKÃ>ÝÞ¶ ÛO»qüB·€,²e& w¿íÆ0Òó9øÅc…Ýp¿Ð/¬ÜO¬o,DZ¢Ø3f”ZᾏÇ1’eWù÷ÿ-1nâýcº)Û¸1fÿ¢û¶nŒéÆúaº]ïIë>o„Ùxfÿ¢ëž+L:ø'6_f {Œq.pîâΗ|¡Ç*ýÿZù¯Òʃ…5<ð-âÍ ¦ž¼bÃهh‚Jyº˜þ ç‡CÝ̜@UdI<©díó +¾z3{eñšö±‰KHÐÁ4¾ „»R¾–Âø)LoIa<¤0Þ¥0þ)¼+a}K û] û]úò+x*aþ’†o+a´cº®ú¡R{>¯…KýžµØ] ÃGZØoZØ?ÖÂö%-Œ‡öwµ°ŸZXO- ß×Âx×Âü?ÒÂ~ÓÂþ†ÆöRÊ6Šïz$õ¸K&lökàuLm¨u'³Ýe +kdèš^»ÈëfAæg[yٔyž’˜vU(x+zòÒÐ7V½úN³žŸK˜Ã^`FáÁo%¾à$V¶¤2Ï]€Ô#8d7C½äKüƼ^ .P#)Ê8.ˆYqw|͗”A–S88bޚ#Ëò'(|³w‰Ùˆ1ÆX×(³?•±f[ò •ÏaÊ@ù`äé RªM3 ­EèÜ r¶’éY&â.™ ¾‘l¿…§sÒ }¾Yâþ<°Î»Æ:š<6¥€.hó™ë)s—Œ'RiÜ*Md”´ƒLÓϚòº’>y%îÊÉ©—៑2ƒ£ŽÖöâDÎ>ªIµ£ÕÅoÑ €…cô1㫲geîȏÉ÷Q'ús!¤ÚԚ"»Dä4Ò…Ú£çgMf vٚD•ãó +ÒøÕÛ1Z +ÿqãS^Çǹì<\Ôâl7è¥Ñui’.§d ‹¦QC@<'sal²ltG NÀĶf‘Âi7Î"$ˆ÷Zí{êc.â´×pÚ,èöŠeʼ=™¡†…ž1XNÈ)ãu[1ƹ°±©¥ƒ¥R8bp“®©…UÍ1š¢ÞÌŠ£ðËÕʀÎÁæÛ"¶VƒkÑÈOh|½(#…~¹±‚ÉKWšW•è]hAš F ðÏ*‚šUÑ´†UKiÝ ×Œ$Æàõõ@v,øh@ÌóX· ÍLHû%ý­ÚUl ¬²èt'=yMoó-/8]íQB §¶•ˆZZ%öôqó%7ñºçöv¤ BÐma-…äiBu8½^Ò³œ{\LôùÔýž·’gUXĜoÎèÍoÊվؐJÅf¢vÿ­¥ñ®ûM§ûmŸv¿åm÷›¿ä~Ë·Ýo*p=¿J+FЃ|³š"ÎÉòu Æÿåƒø¬y51ߕ06€Iò¬<£ YbSt®l`¼® -ÿ3GW—´›JKÑX}韪Ï{㌃.+Úí +páûP"Ø h¯6È~­™¾Éd(õ bØéޑw¤4[ý†VÀgӗuªk‹¤s+KxÑßäÍAwÊ+0¦-‚ˆ ̓}¼[“Ïþ!éߪÁù(Áa,f¢À<&²ƒ‹¼©ÈSâhcx¦»":ÆÌ¥„YÑ­d„B(Š)côóçYÐNbÛKq¼‚³ ;TA÷B£¢mÅ+ìznAél“Š :¤¿ï‚îpۇò+¸Ýát쒦›`Gxº‰q¸ yþÏۉƒVRàà˜Ý׸W–d-»Áªîv°#Š¥°;„ì­  .ãy‰VuáQ£SiŸWðU¹Q®‡´E—ÆۏÞÕv(UFŸñ ™@˜Í”ڒ +3(T$ïVæ °Á?|Ì Žö¥5{Ý¥A-•¢Kâ"+¿½ÖYúê…%³¨Œ½ Ž@jéìzÇô÷Á™¾E¡¨v\’¯]®~“­r­®Nrµ\^'ÔäÖ¶FuŒS,#~¥ &µØ}  ùÝj˜ÏjØ?] ëÛÕ°|©ÖïWÃڍ=¤ÚŒ©ß,w]çâ¶ú*‚}#°Š´2š—¬‹ ·¹–’=r4ÂZËIJé€æOÔÑ¢¹ëû«&dó«€sòµώ"Üú‰ld/ m\G´·K¼Ô#Þ­d(ä©úÊ]X…©ÆP}·l¶R~Ÿó¹v +%€ä!R\u‹Hd8X\å6ø>ˆ2‹ +"Ó§ô AS"™Ñ¯ÊaT°6Áž•òzfw«#8}Ԛ^‘ÎýH®Ró„.ˊ¨î¬ ,” b ·¶%%_WÏ$_›#(à …$G¶³bB±ÜqdB€ÖŽ\#þÛîkâ÷9aT8—^©„cø³j"ÂÑ·¸!è-î;êM R™ðš¬qôZ.97ë l/4O·lùëw 7£EΦyµYŽXZšéc$´®,w ¦Od=^'©öh‰ûͅ°0ç:ŽvRǛëXøbVßåøŽŠoߣÆND/ÃFæ–ã?ôEåæ‹z?ŒQÜ͊Å6FmLa”»œéՀÊÊ8Üöìy„ÛMN7á7*7ѯe-ä&–µQN}ÓM˜Ÿ´+±³Nv€5—»PG7ÂLä@ó7›@K¥M!‰c\UÞF +R%_MÆiÐ$¬#!A—+ŽëyR\bŒ/³aå³w—½Í>Û³»UŒhdeÜ:{—¦¾¡†²|ùoJRwNˆsdB”1[£¯æ5o·®ctxͦugâ>éjúR2’Ò(VqçI_ª{™é^ +?Cq@úX¤½´S;R›ôš¥k¨ˆªæéâyã˜hˆ¿–'χ–¿èeVôýe\ÐAñØC¡ö„ÿ²_-ɒÜ6pïS¼ ôÿŸóL( i£û/ŒÌXUýf¤±Ç Ë¡U3›,DB] Ê(+3Bsx3¤´€)ƺºKÄÁË)­ˆÊ\% +Ѫ‚DWÚÒS°ÃTO9‡$dñ†3gé,ˆ×QäM¨ž‰EŽ¤}u +gÝq.ßnüô’í›4ÓìÃÄ*_cMýzvÌêúÀ`Åõ°Õ$™ø¶‚7e¡¥SsY×é:à«÷"‰uUC£¥ˆ• ÖY9pšâ^[…Ü󲡩© +ŒJ¿–R;Ç&½ôËÓ0½òänu`sdKòE<è ï(ïp6ë3ߧPF*Œ–4Œ¬ 8©È™êä´pTîW6h¥'öª«N¡qr&]}—'ë|ù&Ù3òprB<“Å[ˆ)6:N +ë0—o”ÖÅ]þ‰”ïwØËsœâ#︌²f£q>c¿ÊM{ùŽÁÙ/%­`⺠yj3å¸ òìæ.Ì öó“bVFėaÝ{úLëOf?Vª¯N¥?;•zïT®Rý£Jÿ~§ÒîJ»w*ã:•þӝÊB€š5-¿r½kyŠ‚âd-G§ÃʘLç˜ï’¨È·ˆˆ¥/_Àw¿A%gQ¹uˆb—B œ%êê{½´vEc.Ó·þ- ØUáÓ ~«Ê/R€Oó¡Ï)¤žTt@X— ð›:£n«òi™žè…²¨ž'­*Õ &Ò$ÑKm,Y┴”j!ðÊÌ銈óoO ÒìóçÔ©f]æ}{î}S§ê°€ÌqªÀ…^܊åÙÕl4Å9æ@Í!iäó•AFë#¶ëFÖÑ)ú8Ä®Ãì®"òCì:”Øm_v=b·}©GÜÂÄ­°RðHëª÷:Z×á%­Q ßᥴ Ci×ë„LaúPÚû¦´%»Fio«X=m¦÷\Àƒ.4Š¨ˆ ¤2r¦ƒ¦¦òV ·æuFÑѤm=TœxÄ@L/ôT1kwHoykv)š +ÒVÈ™í̝’Ž¢sš÷:S(doÊ'õ¨Y>W˜€põ{ +p-褊%ŽUy-X¥=tؑ@‰]“º ³‡zŠ~jwÕ<Ü:-¤õà‹æ&eWZ”:¼Lñ¨C1+7[Þ\üN »™`²Vãïjøæ—ù¥Ï¿@¢¶‡ÐÇ-Úl¤.8÷-¨2'…Ælã‚G]Ï%= +"ÒCÚ¡PÙiç¼®cÇâXÀXœ®áû•r_zû iË~iËþ¿ -ûC[öoh˜àZ{¼Öð´þÇÇ`ªIQ±"¤™¤ÄÉIbðT…¦ê*ºò“£•»Ø-K¨ÇÂþ;Æqs‹Û¹þ÷/»9pð;>ëÍΣ,V¾ÖŸóM8NÁ^z¤î(肚Ë5’å '›HúOᝇ­ªHYP@ÉÏøîêÞæåôA¶âŠ8rŸ³´®øJÀÃÃי`í/¬¾Ÿ# ËqfS|äñmbÃR‘¡¡¥ÂÏ"˔”óº,Ü¡TQ<Í#{øG{|ïq«È,¶f¥Ò™æ )Ãê5+#âË°îS|çñ\~NI®uS’å*P9—’œ;D¡ä¸DƒCú9¼äÖlå¼Ôa¨/¯ËR_+ͧú:RPù©¯\,œ¬8"" kØÊ~óÜï¿Øš›kË4-`>@+­ß\«Ë¢ +D(ùƒ±” ¼Ôì)´¶ºÛfØZ¿êŸÌÿ‚¿L4õ¥gèF–™/™¸²q¥_H:‚:YÃë| ŒÉKz«ÐX™î_ã¤#p>åp5Úö=6R{«Qªòm"Zz'ÛÉ%]ý¤bÈç +E;4!%ß(Šè2Õ7C²X¶üø- +ÐíÛ3Jww‚R%Ítþ‘ih‚¹SªÖÈêWP˜[嘜ŠHE•qBYTo¹²ôP ©|¦yf`bŒ ÛÒdÜÏ!ÁÌ9[™ýíÓf݋·ÂS¢*äHU_§t'MSÆîO7~¢ŠjÊ2¯o7à¥ÄࢧÐIõ!F‚ÜKdØ6člqW“H\!«“J2Vº +æv¿TcsREå¡b©pßÝØÝ>å°©%øɯññÈyËaÌg‹0Tü6N÷¦±wè™xuBÔ‡_¹Úö6ƹ¸±TÝÿ)=Ü7€‰÷uï݄X&Æ÷K|}RSCê¥ï)GI¬]\ye6a!ÊD€B…H!jç–zZºÂû(ìñ,ƒé‰\(~Å)ȇ# +ðxBö(kykìÕp­Ð•™ÂKbS&%j¥ ÷€E ofÔTQ‚±Vß !Ö››ª'»U娰­#>BK‚l¥‘é[õµMȯò7ÿýõù¯g,eé#?ZHê5DЂ€´Â™©— žWOXO¿i Q頞;°Üíaڝàª=Õºl¯U6!ØòÀq¾²÷”µH²MBè•lêGà)s¸Z1ÑåØÚ}\‡¤kø©î÷mmCïÇý_?î‡mµ,ŒQ,*éýzÊâÍ¢ŠèI*ò>×$eU¬±Z0$f@+=¼Çtqê:;ÔiœVͼú†¼Ÿ`‹°óv†ÞªÞOÈs½Tߚª¬TE¦ –*»RÒ?Ü÷MúÝ췐ø¡öjîro¯Îƶ¦tG¨¡h¯Æ¨§½R­;WG MV,‹l£¤Âª­°mj:ߥRäCpÔÝ¡þ _å+ Ù3Õý±ðö©îýíÓÍ1Y°+›£¹ŽAXØþ +0¹Šøí \ @nÍc[.kít¼f ›¶Z &ÛÎåÌJ¸êC½ß+:[õ[ ÏXE„…ÚÚ#u’·oµ³Ìf²åSæ¶P%ä4Ä ÏÙ»0ÈEiÕ[¯! ¢VIè9Òئpaހ+ŒìÅ6¸‹ìÈv!<v»ùX|®'b8í®èBã{‡¥^ݜÁ´.ø:|8[™œT/š²ˆ— n÷ٓ¿c–»‹?%̬0¡1.Ì¿ÅE7÷C(OôR“{ƒ J{ߦ¨6Sõ§xb¬yÍÍr—ní5€4€ÕڞS3—óÍä7}Ì| E炚¿ÅÐëQ󛨀 Ž¢_ôÜñ*M= Š¤ï3ڭܗ>`·ÂVy ²üýi©7…»*9ý9Íx"ÏP‡kÑ©*Ѩe‡Çr> ‡«,GæTk1Vv±+L·оjåÌ,Ïâ=Ñ(xjÔ;Vš@¬ ‚‰ü +ò"þì ͏zY–¦v³[ ›=NKä›P * Q–8A°ã+ž„žv^ì Y,÷}ËÛÌNˆ!Ú§ø(yßՑñ&C3ßÕQêðEá™k¨ÏŽhd‘Ò&Ÿ£íŠÕöK³CG̾r»ˆ2¥pxd•Žr4\Ù6Ë9Þká–Í2_‰z/Ä[¦kÖ/"É}¿£Ê€ŽŸex!–¿{VM9¼L±š.8¦è»6ޒögü@‡Õ™ßÛÑÜÕ^²€éÈTy;C. Ü·£%)ÛF‹·ï¹òˆàPg®¢ZöC_tÔ¢@ëÚuPý[ o^%³FWæS TÄ(’p†¬Aâ.WÛ¿´˜$¸ÄÎE­ÉÍÆ×1ò¨2ŸõN¢5þIÝ$÷©£,v +L.îz¿¡Z9i‘^z5Xv¤¦€è'ê a\²_ÐÌåxŽác«ÎM:,µˆXeP³SxXB¼ ¹%gÒc°Ù&ýã¡*+}Ø rPñǃŒ~ÿÓsl–š6Õ·?¦‘&>opõ>-|ý‡ÁêuJ“½×ëË bg®Ž?Š=ÊícvmD·ƒ9}™ÅŸfãª7]Yýÿ¤ü”?(?å¿Z~ÆÀq›å§ŒÔžú;Iï· /xV•Ü(›Ø"qNbã_ìWKråÈ ÜûïRÔÿs GÌ¢µñýƒÌD‹ïµmuÌD‡åÐFb¾"‹ +HdBí²,[Ùüñ»±üXØö2¼“^EÛ3û³:û€æÅzÿ Áµ™ÃXÉ)‘‡"šÉ2:(;öQ“„&]âÀ¡‹€É“kÒjjù¨ ÔÜkULĺfW“àÆn”^³i^õ%]ރ¹5 ê✤·pÕ5¹oiT«·iòï[ݖQÝW«? añxÚ­Þ!ž¯VïúŽk±ä«Õ¨n<~@·#°kkµúñbüp„…‡ŸÂ¾·z—ƒR³v°Z;Z=t-¨ ÝX*eÔG,äu‰nNYMßÕÐHëŽ›*™;²;& f¹Z=RprÓ&Ъ%¾s]÷âæŒ&.sûnOdãôòè/Då IcdZ8E®ÒL‘š@1r¿íœÙ?\©Ÿ;²_3ÊÙçñ-LR£OìÍQb`˜’Üœý Fº§¬¬€Oyi;äH TÒ8|Ùjðs[[€Q•¼ ORÚ®Ÿ9¥nµÑƒŽ¿Óã`F–¤þ{ £j¥à˜ˆÅÕeÒ (dÏáA\êq±ý§¸·ÉWV—æÅ£<íìÇBÎ!‘æQúQö$š€"²çÁÞ6B6'•Ï”xòÁ‡ ÃZÖZ¶BY”_ì„òÞ®ÚA­íª}gòaà×k8\lO™ãz†k8Ô0(6*÷0(ïy“?Bœ©-˜Y¾š–é>®Yàð=-–xM¢&ý¡I”¯7ø1ž“h“Hcé¯L¢¬š%÷»¿z;Lj4¤ñ­Æ~µ¢uÕz ›þ58z Ñ~ñ åÏnÐÄ>‘Ê;ҐG¤•ú5áïhݹÜÖ+tçyÅ°6œDS†&)ºÜ7Àtåv­¹¾´Î-ƒ·QDÈx"™„T::n°N³¬Õl °Ð놔 }þÜ@ƧšŒ\³u Þ¿“Œ¾í8?—10wïr}•¶–E÷¦³ÖŠâD¡Æv «H‰Xéü±X䛧ëS¾•÷?ãú>‹ã›õŒ÷ýÖ²îoXŽóº¿ß±’µqXÎ I·O÷ ¤˜‚Lçkaàì k?rA,÷Rà©ZhÔlý}¶RŸH^º²Y*£º@”ÔçZK uÝ4T&¾ä/GŽk?GbRpX©lŒär/* ]ÚÓJ7TDbz|GnÎOžºÂh sJå!:P@>øÏ8Ââ§ð^_UëÉÝk}7k!;ŠO±¯~³ï‚]݉ž²lû‚kûzÖ/³'P ‰ÃLÔx×Ôà+lç!a…Þ²²ì6+lkÑ7žJ®vJ«Kµ0.vÅ<ý%vÍhü¿ó’˜fJiÖß ½Ê“ô*ßÒësҫܤ×NãKó»+‡à(C>‡RlŸ+QÓ0 ù±bFð.1éØ·GG| ˆ¤ƒ`ž'L E†vX(†#Bôa†kghI ï}pÎ-è“G^H Sµp5IhâÌçÃä-ùJšjk+~4e œ½~® ¿4i1‡4úf¯çČ÷I™ûÍ^_ž½&”-Ž²YOöSº¢Ê¹²’S˜Î ÏÁžQ—ð†)ËB>Ôr¿®‘ܤ°ú䂿UÌçÞbŠ# ›dBûáë~wY“rûàÉK¤òw\ㅡ­•Äý³%×âÍÖ¿Cañ™)Œ¦íœYW÷ÕÀÏÙ¯eŽ–'d’ä{k¼I(10˜ qUtj¬½p[B|;ˆ„—¶µ)Á›ŽB‹0ø¹­-À¨Ä9€N¥èþŸ[³jÒ5õøÝÊ_¿•ë°ÃŸt!­Œs\-8†˜™ÎéW8æ5®¬´çp”5m£²®ÕʨWÂ5EÔµÏP½ºa 2ÖtJq ± 椃ÃÀa‰Zo×8 =þÚ8k)„[Iý=Ô4ϐ⪏oÐ$4&.D6nq„áøžºçع£uçnø­WèÎ;òŠ?`méÕÀd#ÅÞ`ºT­Z«¢†Aeɚ2 XÍ (DRy˜öwH¶r‡ ¡–§SÝ0,ÝsMlãe•äãv(ÿú'×û4í £Ø@ ç/ÝrËz&F<­½Ç1´Àí‡<Û¹^G<¿p!Ÿ¿¤çñ|C 0:CÐWˆÚáþøô³ºÌ„+_¼-óhËø÷¶e¯VU*³am‰q_4šXòÎ×RÙ¢ëèf…kš¹þ”±-}CP/Ø#2NQ¦*¨¸ÈÿE7‡õPpSÑucùãB¡"‰ï5#?3-Ä “f ðà\ç¾[r¨iºL­Åâ±7ˆ®ÙÂWf7GBÍg +¡Áï‰6¨êh9x…äÕ®Uÿb¿ÅÇùÜ´ëõ=5wŽÂÊw•›] —¡íþ¤C»Ÿ3”¤'9³6 Â`vCçj³RQ¯ ò~ ¼uaRÚ[Z:³¦ïà×טòŠà¥ZÎR5¥JãU_LÒèk•Ѧ®àÍå«fŽ~lKÇIN$ÉBµÎ®stý¦›ÙB‚cH…G•ÊãÛr“·¯º†+…?Ҝ*}Òr$è)¤¯3}­ÖÍ¥R‚nÒ Ko>µí•Zbž(A…ñ‘õ‚.¯;-®M™ÝPVŪƒŠ½…/£ùòHö¢×`±Mêã^¡Ïr©íÛÀ˜X´B±&¼ ß$¢«ˆ‘»XšdIÔR‘Œèké]šØ«:»²•ÞTŠ{U Ff±‹_z.;{–ö+—L[iáÀ:.ÅÙۖ¶ô&{¯µ­?ùž%@YtK8>aËnu õsCÉ}ß[rŸ‚~&dUCOÐ+°n D#Ñô®t›®Å˜EJÂG ’Œ|‰÷€”ì #/IUݑŠ—C¶ÙÛM0•8þûìEÛ³wÁ.ɔ4[Ú5{!×쵌äxMe K2€ wM¹‘B5ª¬YA~{wŸ>hÞx*ɆZ<]Ò Œk¶.¦ùìl­*Å_,µ·¼<”|Î"2èÔsÖ@Aʱ(cEÕìÒÅ#“ýbUL‰÷æêՇøQ؝sÚîúXÈ}˜ŠNL†({’ÕBj­2*)ÑÔätä¶ÓƕkòÇ×ܶ¯kÒÀo5çõ`â¼eì1Ícm£(yÈI¡€8b(Žu’æ,~Ž_ê'kæ&7 +ñE;%Œ=6|Û.×õ}nߗ¾Ë% |UiDÖ{zœ)~n—jŠ+á~ª]þç¥êïs $dý‹vњõf 5÷ðÆDVX¥-z1y´ ¯5ÏB÷01Vâ gâš,Hh("z±OØ'°+•²Ww]]—)È´õǂêtwAÍçI=”òtÀ{kM%¢#“Mµoí,ök£Ã jwÅm`ïÈ[–•?nÈۢܺ¢(«9+Ÿ"·±ú›]Æ%¬ä¸Öô‰¨Ó Vfq´æËnƒ× +ǘÍ!Æé¦õø¦3B³¤†zú“ý*ɑã‚÷yÅ| îË{t°.þÿÁI«G‚-À:ÈèËLE³ŠK232b.ô—gî{´Ûâéúô‚²’ÇðšÇÇØÙ1·¼ê±´¯ù×çÆïFµ£.LD½’ø’ÄÇÕ6l“Z75àMëJ]”–vƒ$h«›ˆI­Ë1‹h&mªw¶$ßôU¢’­ ͦ4OÂR¾Q^3zw˜ÕRGP÷ªõ÷ãHǂ±²ÅFFLŽ)KVåæAjjÐÀìáU)ZB——dŒ™²•âBˆ›A‹_£p¼„9™¦}‹lì'yÖƨK “©–u)E¨ÊSE™ÚºìSÒ*õÀ™ºÀ¿[?Ýd7QéþêÐ?Õ¡ÒÖ¾)±š&2ʼ‘o°I·Ð®#xGPH(Ž,lµ>våßÑz*º?¡µ„Þ¼#Ï÷ֆ‹h +ÐdE—€q*ZÊUU‘è ìlJ%Ù§•X'w"áb´¿CWr[Æ,G™ŠT7 ‹ôŹˆñ¨öÂ[¥†y¶Êãô;|Ýój††Ê8Z¥á6û1:F:?]PÍìøÍîø;;æV«<–öñµ1ÿúÜø½UŽMž^ÙôŸgÓãikS„AL´z2] "},bãzüIcÿ-e=cÙ¹†£“ +օ™Ä_ô©%Z5£w^˜5Û~æ*`ׅlZË2t •$#foÜÖ†A‰`0^m!|2§¿–Ø·õõ’)˜܊ß֚ÙHôØÀd³ÇU1 :˜»½KÚàÒCPÛ ½ˆ_c"XøÃïEfäË`ô{>¯ÍÅ¿HK©Á€/tõêF5ÞŠÆs=†îÏÓ5" ÂØÏÅ9^¨³Q¡Ñ[(u\j”áoM.¤”‹k->Ç¡¾˜Ø/"ÀƒDé/µŸçæ1­éƖþ]Ó힕Þtìª#d¿í¦]M·éôlº¶ÿ÷ڞn+Qh¯L.Ux÷£²®sA,{`¢7um•R#.hûéÒŒ·7Õ<çO5Õ,E Ùÿ¥+o]CÃ^Ý_·Ï °fB^!¬XªVòè¼@,Å·¡ì/Ì«áúÓ³Lˆq™b¢æí)<Ù:ã´ +ðÕ·…<¸(wö(èV§ˆ7•‰…«’íbƒ¹ q;3¦4¬%ú3›žÙ‡î$ëÈT:ÉÁ"xÈÉÚgƒ ×jd©Ä˜lÞ¦„PSÔ³ø³í¶. Kf˜5¹ˆ7è®1Œ›m$|ìÔõž¹£ [ú\ˆ‡é¬Q…ñ!š>Cü)/¢m4öμÑ*ú&uŠBòKˆPi‹óÒ•FdŸ#± Æ¡ûˆÅ"c$^`yW‡vX¯QgS‘¤¾7ÎôŠGw<®ôÉl¯šúۂºÚÇj·y²Ñ:8qOc‰æåuDvÖΦj¿6i¸÷joÅ-µîÈsW8nÈï·Ü®×cVWêª\ú›ëtÀ€•טŽˆ:ß`Eöùn+«î¥bŠ5­h26¡݅TÛÒA̽¸¥©hŒ±()ª Óà èž>Þì}¥1 R•=µ.`‰š©*‰še‚oŸ•ô f2Ն–í¡y¹c+]`¨Ó¨^Š=(]ºC?%"m”õ^¸¥.bʔ¦YÞ¼¼ÆÿÁk䉒ȼʆb>®¼! Gi¿Î§TÖñl¼Ç¿ràz7’ûšo+åÕç/‰ Äx½ÖG*O+ÇÎæIý¸Q`gK\s ¥þL q“IwLë”Õ‡lxë!OÛ +±ZÝVQ‡M\2ëÆ5¿Âò%Ž¹„¡ZäF¨B‘ˆ¨ÊŸ¬ ê©^.Œ¶†Üâue-òö²Ž)Úâêål¢ÁÓW  Ï>JOY¨fuë¸ó À=E^c™öç%—e¸Èk¶áèύÀ›KÊ_H%N•hê~8/èù¡—É‚c¨G¥ÊµÇÇÞ䖧>êœW +dPøÄ}*`ZB Ÿœa“Ìt4WU½¤ @”.üÜ{ 1Nìe˪Á9´íò¹S[ +ÀRÔQBY« +2c9¹UŒïdz›¤¾ß3ô½Ûvt_“;Žuúüp¹Œ†ø0ƒÞEA‰iÀ"` U.&úGd!%Vs‘µyœ{5%#?¡‡ô÷Œ7(a1èôѳn_beø½’==˜Y FzóÛsìúL£ü,íæWÌÑöT{"äp'LÌòZ¤2§d +u˜²\c=]Ïôd”Hx§ÂۚžC=¦ýMç7µõ(D¥²8¶Ùw\I#‘î㦷pÝ#‹¼YÚàTFeZˆ²bqâN:b‘Ÿh®x´% όiÚþ½ëßæC9cS'ç`ÙЦ²dsDéc—Ìñ7I6K‰ÊÅ‘"§Æ魯BŽ%všM§f4ô愙ÊƒåMõEÔÀ 1¬¦%RpßÎ"„lÀìÈ$=G&´”_V“y„o0q´„±ÙtÃǖQ½mÞßYúnñW/õÑ]—­§÷3ğó‚&.“DBMóN"° +܇¼Ä Z„‚·€HóPÁE…^UrGëÍm:´–X´u"—¬m¸½ãÕP+y¤è漯®±*»0x;MºM*ž…¸ú,l É®ô‹^²²r¶¨)ë†aù’«øb­l°îp–%ðÿëŽ7: i#P ç/ÝbËlÀúx¥5XÐ6n?¤Û0 Òõõ… -áùKªñýø<çìüçôƵAMp?~äV³ÈÏ­Ù¬¡Ý­Œh±EtÎ!¥SóA.Ë°ü9–(¶Apúº!Hª +x¾K&Œì‚§IiЮœ‡LöõÊÍù£}Ø‘Qh‰éà3 +HP“Š—’ÇGz–¬ö2u ÄI¶Ñ·'Ä£”%Iâ»ob}¹v÷©~›I¶ôõ,;yLT0jÙmµ.'l‡ìîÁ‘QE„¶•Ô3{ûŽ²Y¢æ4îÏ"ۏ7‡ËÞÚWÐÄO0Òämˆ>ß]}Ù¶ö1TÖ¬ä¸Ç@žSõ¿Š*’V?Þn5fG»¿>®Xâ@ڗ¿“›ºÄ×Å[(,üëÞ%ô…Ì $$0L§=¥Ý§l¤¢›ÂÈâ¨è £‰G‰-‡»r^fOh‰pæ(Ÿ=¡®|KÔ"¡µÇíÎXÔå¹ëØ­-ÓZjɐt]É,ò+‡/cç«ýT¯l «,Óª%äé÷¤G™°]ö?¤ßIyŒ—ðø•ÂÃô¨© ë ¡ý3o¡±¼µ`WCO4µØÅâ-ȓÅ[Îö‹Ñ*öìv“Ìïo!ßqn*€Q%ç J¶w„”h">|Eª´ýtec/å9Š—j·@ځJÀ¡<õL-W:ÎR+ 5Åꀩ7i‘8fù•I—ʽ†|±—¾¢Ã…)÷2›:^ ;ye!LŸž]aVï ¨PAåˆÖßùÜÌ8Œ•)ªÞ—è=³âœÛPö4%80ká!Ö|ˆ±!ySÖ¦Úyè{TNì!&– +5Л*—c RWéM%—ØìÜ5y5BƸG«pÔçúñÆç 7õcvÕÔVèÆ{¶ó}“ÌßìWKn%ÉÛ÷)t ùÿœ§a`òÆ÷_8HFTe½V{ Ìؽ‘Š/ÿ™$cÆaDs„$U#_ޓGk.aN±’Œ£•»^Xú3žé\(ŸWÿWl.­9`‡W|õ·;qj{`åÝÿZßqd®ã„"ûÔýJ^tÿjCނ†çs„Ñk RV§¸W’÷YÔh“QbœH;:*ŒÅ؞¢¿RÀ®u—$©q!ÇÑÕ`u'Bô§{"ók5«¹V}A®4Ez¼ v&ýªî ³kÎ*B—KÔßU\ùbŽS ò¢ӥôúTAiSÂ:+}Æ()ß咊kaãnU…âÛ+?mÈíÿ©þŠíEqæ+E«6#cw¯¡¹:=4n8™5jæèM¹;Tnœ°‚GTDddYjŽŒ¬ì=ç͒O=ež(–•>‘ÛÌöP +ÁM÷š½rÉ[ñXÇÝæ½X-ÑÈAUÈ%i…»"ÿ\öäRÓª"q$€~Á6ç«ì_ÛÄܲ÷×ÿ÷îxw°4þ:LÑn¦h¦h¦h_]ñúX»ÿ‡"¦V±¼/ƒÝ¹EŒG"²;W¥X*kÚDo 3qˆ6{öÊ×ì õš®›¸Ät¦Ã»¸&úwh¢Ã"e™ú +CJ›•5t¯}Ô|K¢íªŒ€æ9ª'rr®[Þ +Vp2?¶=b‹1Ãyˆ2oËÞEeÜÊð='™7^–3€uh#¡|HÇ3ó„y—gTK¡‰*tŒ2«M™ÆFrÑV< )z™;=À*wëå;ZА½‰•Oý÷€ž…„ ~!WCñ8ñ,+Úûv Æ6é¬ýÌ«Tê­#u.1y"(Æt1[äì*QJjl®‰µê>e]Rô À k5G›Žˆ¼@ÜìK²wK¯Ò%ûo?\ŒeB/ù— ÿ‹šðã)[áKԍ›4“ØbÒçùñÉ:]¦ð¶ÂbÔG9Ðæð‰›Øœ†IÖÏçsÄëjêœbPrßÕ'U›Tu¡Ôñb…k‚ùñN»â&‹žøó[ƒ÷δ7@C!Â]ôVØûЍN=—¬zpG߀°}äÅs‘w›9`FãTˆ§Lw«¤Ùoùí<#'Z~¦À…uß=s¯{ê ÷8}¤Cëϐ­§ä~0’áS5â¸j¨ã‘¹Šž«jÉT/ْb9¦ßz—ÛÄy«‚uñô=—@ü´`2À³æXTñÕs¾åËÛdµ-ë:¹- Á]{,GŸ’'”jÜHÎÂÁ„d9-èû]I‚k1ùP²¾?öø~mòªX¼Õ)¯5þHÐõ‰ú”¿È)\ßäõ ¹aG;’:©“·ô.K2/Ä{‚½‡á°¿¡m—ßs ÿ6Ô$(©EÄ*ƒš­ÂÅ`DùN®FÁf“ô·g„þÈ.ðªtëÄ©Ns„îºóD‰7|x•aS TÌq +¨B °Ð© ÜÔÌ;8áû7ÁXÍԟEωð€¶*¹óváªEP´°êñ+•mù³’=:XXi¤‹Þ^¯nZ>îBcÙÆ~hl·Åûá¤Nô._xÀ ï2"°LIñ&À‚WA®6E}/ù-×ËåÖriú)‘œ¹\£&Gõ1`X–=c[ٗGž §¹xä¹~ nCöfngUv¥30ÄÙ¹9s²ñ—ÀpÇ£-1{v.W«×³§IVÔØÔÅI˜ÞƒB¯·Vîc—Œòo²l(CyyÀ*§|ù\ò¢ËÛ +eåªs³Œ¸³ ˜— + +Õ6L +‹aI-“‚³ðòSs„xÀìˆ%}g†´œ_•J‰=ÒÌè<­‡ '¼kŠ9.⿲ÍKão1õÖ+3YšW¬¸ÈÓq¸Ç¤Ç©{"[mya ‚h9P7æ.ûÉ3£{¹0tþÚ&‰Œ;L͑íÉ֝w"=QôÌ̝'Š%‚ÙNäîó€} ;iñvtS~•™åiT9jó4^|>*b@>RbëÈ@w1PUØ³_0Eárgg³ÊÇÝ P” * ìZW¸ín p(ÇÓ.Í-WªG¡ï˜¼{gµÛÚ14 ¦fïø¡X؃±³cîDKp,Íö{cýÜø÷G8Yݗ›‡Ó¦rÏòFd92ätÉþ4^ó"ÃyH l+tWÑà”²ô(ÞP”)«žÞH5„ì«ÄäÜemܜÚèB™Fòý“ýjI²ãƁ{¢/ þ?çQ8B kãû/™ ’UՒCŽے¦7ݕU$ˆO"‘˜¾£€T6é pÉ{|¤gim/]‹ø/i”tó„x•²tJ|q#֗˺'×W»O+¯®LOnªµñ¶Ú™S¸Cvüà£f$#¹ƒáRÏì÷s8‚iNìþ,úýôÁáxí+ÈäŒû6Dç‹/iq'²EØ`éJ·‚N§ +~•Q$Ñ~úp«*»Úyüüp[³ãâO”˜õ$fý³Þ³~%1›qQvÞè`ÙíbôñŽØ¹&‚¼KUºi7¹YÃìÙy×Á"^‡N¯ÉÅ.A~Eq-æµî͉Ϲõ3Eë†FQ¡½hº…)s,æóî5g^…Ðog³^k‡z×yá<>³³×Ú+²ÓꦅòàÞL¢/ ¨V:"Åê€Å>9r Ž`GÒoPç,³+L m³‰97ÓéÓ·gã›Õ™\!(E®ó·:>Ã9Œ•84!òæ*’“jÓ­rL²@ó{9ý3)•£Ú‚‚•ó@ñɄm¨IpNӜÄ5{ӜÃrf^'%–FEŸ}P1.¤n¦S¸êŽójº¹ñYykŒý5ñQfe˜÷Ô$Ņ^¾+Eýù§ÉÏÀ(‰Ç ’Jj=¯v­ajÃDZÖ(—U~–™6òéiŒvlÈæó¹l(ý´q±à÷cƒq\šÇ†b·­çUN‰k MÛ(ã̓¡À'Ÿì•x䈙pCq.)1’ñCzU.‰2•,Aiàž#/ÄzÎå¼Ø¤Y’í—ØS‘'1:/ös²ñ›* ý£½ë÷¿S¿ÏÄó]ú]òaë÷»z :—•v;ú}éw÷ÙRöTVP©ÖïUuS W˜¬,)4K .Ð$š€O¬ñ¸ ÙÓ5^„qôyžó/éó9¬{ ©PypïUÂ~3ŒËÓý¡‚‰$q>3,!t_Am`%àáktQp&•[›h–i)ļ¢®îf%»’1¦î[Y «ì)IY}ü˜½ÝâæC_S +¨±«ñ€ð^°_›´ÙKµ·â–wÔ]’ -’bA‹Å•`Îòç¥HHéo–ÐÞڊÊkº"òpƒåÙ{hcPýW#«V}ds'vŸó匬,b"sœºp¢§r¹Ó<#tå9ÖÀÌkÎ5Ž§‚ŒÕÛÚ®W'w™?Gj2¼F¸»ª‡<`¤Ø0ËëÌyM¹ÖlöÄ gj fŠjeHí®ðt]…p¦fø„ëp‡:JaŸ)÷ér±Ã yÊÓwyëôï/ï¡_bf}÷qKDtdŸ“À5>¼¥ +žê*\XŠ÷¥G‘Üö\qæQi¨Ô,Õ|܏Â5:Ž>u~YÈe™í̝+{’ò +l!¹²†bCù†¸kO€ÂU¢=øì˜0}I·Â½"ZPÉC$'®’ցG¨£(™qØ™@g»Yü9z® áӚ|²‹7è¼ƍÏù@–i‘O±Þ&x 4¢µ*7.º¼¸ø 7D8Æ¢ñÞŸŽ)Ðvõ;æÍb'iÂdH´´Š,°Tfin}݇)¸ü2<"¹T}ÚÆ1Žs¬QÙ:öOÁ˜Œ¾w€_n.øã7.CEçYm£Ûõ—nnæ- èg.hÞOÐÎýº‘|>?¸pt½þ’¬J®ÀÄë q»š 7Ž‰Úá~ ¤ù%–É*¾×Iò˱_eµ+Q IpeãäØæ bÖ` õˆ&—ò°7p2R~=ƒ.ðæ>‹8è ü#E&’qråH:N빧ÒQæöӟ%fyQSÑ3c +)ñ2ÉS ø±ä!³&ò4±sÆn“+5ðº#û3­¬ÑQ`EÛ÷ÕÍHz{¡DÃb…ù‘DÞ*7g§ÖQ‘’WÀ$| Ԃl¨$„ q„³ž1xÝÖ U"À°zŽÉ‰ðÉorÖÞ06ÈÁ0Kïc•(8Wê±hVdZW#鴛k ·l°>a¹œå·½®>Â9P +Žó¢1šUÿG”„Ø$« 0Ǭxmžu<[dkiáßÕ2¥Ÿ)2ŒRÂ,o°‘Gzݬ¼£äéÄp!®7Ôh:›$ª:V4? GÆ.³Q"&ö™nªg©q0\‰Nþèä&$g´W]iˆ5ï®xå +_~6‰3ÞÎߪpr3LïÜïßü¿q1‰ÉîO-”÷K7BØ)8RÜ&À›´›k‰ƒ ŠPd„º°—>oҵ̘PŽÕÔ "}‰í™`SÛ2‘ jAçïºYp+K1Ò©ñþ̹ ï*d`Ö:Žb +,ž)r5²d)µ¼A¯U”'Ý9a[èé0¯¯%&9Ë8LeN¬›"Ä&©Jp$fÕ)\uÇYbÌúrwãÛPÓÐ.ãFDʜP&c¡äŒ’Qž£´5£¤W¹®æ3­@¹i%1ÿĊÈq5u^ßï«ÌkrFꛂ辡 qu‡ìô+»²¶þ² H^)¨ ë`Ü9Oܸ§±Ö”ð6/pBÐ];Þ ¨û¢ÀZáˆ{8¸#ï"$ãqCÎÔåFÔE^ÍYþTµAM!ø7KáOÀ’ãZÓÏ –g±­Å +-ÙLK¸Vê£LwiÄ:²ºtJª>ך9dôS|އñøq/$õ—!{±Ÿ#ÕBl ‡õÑdî…Æù£ ºÄ–¥PúŽÜ°°©«çZ‹ôì*Iyyó_Òhëæ ÉË}îU±¾\Ö½õq³d¶ÂòQð*˜T>Óf%uñYӕÃ1ÔÉT¨vã¤òMêdß-U…”©J$V+ßjåÔk]ï Õë6 ÔâiiŽ`ÇP·°Y‘Æ!:¯Sۋg¤@ù´ŠaÎãç§ãZÆJgr†šæxÐæX"êƒ7h„¼¸"_qdaÇõ±«òŽÖ›»a^Ð:BoޑwŒ ¬m¸4¡ºCÚE[T"qU¶ÖªnPà‘“ ð5/y4xX"‰–X„Ie•¥k%õ³ëœT7 ‹¿Ú¨[E_Ev6câkŸæU¹”Ù’òINJޝ›ÉÍÈÉû]öät°²Ó¡ç`r%M1íôlÆoí$àJjmhÚJÏDÆöôLÎ枞‚žžŠ¡ßÎhÒuá:/œÇ7ùÙ¡Ñgÿ4N}hœú®q¾OãԛÆÙn|VAièÂVÿ}ü¨ç¬~Câ´»Äi¿¾ÄiW‰Ó¾!qªqqD°Ðöqë¾ «FCŽ€1Fø«¢Jºb&KñS_.âCoÒbGŸˆ€èÚÓ^5#Â#fF] g3!ò²±gV\ +#©0•L®ô^l\ˆÛëä‘*×}O®vŽVZЀJ!<”ÞɧÞ0Ø9P¯à·ôâW€1GŒ›HÆz6këjóŒù¬É[o¼Aψ0n)Ax2Ü;f¦EA-ÍÕ/[ß«òâ*”‹‡ßdªÚ +/÷ùKJ‹úH‹ÚÏô^yï•÷¡Yˆ³¹m$Œ@KsIùÿñۇfG óÜ°Ë5¨œËÝÊ Ÿ·Hh¿ʽ/ô ›WY«¾è_:*”w'óÖåK˜uÙ8°™_Îåú±Š_ß­ÆMOöÛðgÎëÊ?ùԗþdêÛkÿ“©¯MS`½ü²Ìü# }ÓF°tå}æûŽ™¯ws~ú&{Ùr˜ò: „ígg'CeÄÃ]†Û˜—ՁÜ?Ÿ.(‚¹üº| ».{‹¾.GûºÛå_¬¾“:vGÈì!G‹ù%C†‰ÐþÃ~µ$YŽã°«ä^‡þŸõ¢ëþÛ!R¶_fÅTm&j:r“)<Ù²D‘ÈŽ2‘¡’ŸýîÎ"JA¨ÂcT R?gAF"Ն¿Èè±|sfÚL¢fª×Š1҂*I5­\~&$ÞÚíCܦ1>˜FÌ®¯ô²¬‚N1/mk弘xÈ'[¹bµÍ™žx\¦7ÆÜeώ‚˜$QÖôŒ*Üê /Š éi‹“³õÁÃK8;ʐÃÄö¥“È"¸„<´xÜ1pWbÀŽ©~Í ©Áı¯àœ7FHå§&ù VS@€6hÔ3§sù[Ü>¸aØ\a””w9 :º¦‡€S¼¤Û‰&‰ÄŽþãB‰U^ø͵ˆºK n²ˆ8€iD«øaɅáJ_²h†Ü’®ÜnÖǾ"¶)ü¤Ñà ©' f×65Ô¥®HGJWP؈yíMññnÏÓ¦°=Ó׌®W}Cn£i>v~@Qîªn£Ë¼ÃªË/¿V’£g+@b ½!tÛâØÛOí‡Mš¹ð·à"ðúÕ.Ú»^dÛ:éCuëÕ Ê$Ü~€‡¸½ŒÝ֖¹}Úçcc|û¹ñ§ًé +²2”îž$Jh”{…«Xm„Ý5Þ;Tı5MŸ)”ÍBà<å¼hiÖhn³“ ­—–С ˜Y¨íÒµÁZ–áKÿh WȀðP•¶+×í€ Ï²bN,s¬fÃÎ:ÉD°+êo>º=•O]<ò}:ß­Òö[;\_U—2e¼Ñßêú¼°VsÌéˆ`Å"²ÏúÏ Ç˲e¤{ÿ.ªYö‚ÆJ¬Yrw ¶d9qÝ;ÏIÚEbò7Bž6÷_öÐ$š­´¨€4[ۗ§}ÝÝÕ¹#¨‹Õ÷Ï%ãX²‚¹S3²ÎNž‚à ŒÃ£„]9¦våhKÞ7QÃIɕ¸•ònÒgAÇj§6óT™9i5|®ÐBóÙugpPÒ^ M–Ò÷Д¢¯pÖç-é#ŒŸ¯²YœìÂP¦mf¶ JuÎE´.ÎÉ 1­¯8§AosQðý)VȹÍVÔy°0~èuÜçgɏ׋*￀Kï `‹÷/ˆ‹ï[Ð×µÂóO:Îi!š¶{ ʽ%K%]¦4vÄÝêÒÙ%/7äeâŽTÐSŒ÷r$ê3ùXʋ¾‡Pw@兇}ƒêùD"d—$LÂ>–ºVX†šÏ :ÓG\¹Õ'ô#@Âgø÷{‰äa²’Öÿ€íúÛõo¶û5¶ë¶ë?e»bëoË:°Ý\@B›Od#É6aŧ:=ªÜ†€•‘oCÕјWËKEYVÅG@ŒËVVqeOonC֖.Þò¾\˜`Iúm(~†©™,GÊÇ/0ûPm>Wè`y£K”¡QïV`±–Œ™ü•½¶X±¸U#åÅf]xSs„’ÂêP3͵Šnewõ1¨Á;t/“ÖÃÌ^ÞlŽÓ‚ž^­É‘ñyÌ3{zZ¼[„?§…™âVç75þ.5֌„©²ÉoÿÍäϧɟÿ~“?ï&~üÄäW£È=%{©Zý>eO;«)>Uu5Տàw=esvMTÄ2u®k~›|wöàŠ„0«¨UßJ Ä;è»N̦;Ÿ"î®6dÔ1Žúü#†Uú°†Â$¿áfÛv ´]>‘ñgõ-ÞHÐ[°àxKÄ4™Oyö°ܾ]‡ÔNåΕe¸Åqî¢7ˆ ¿¤UŽì ‡0Iá#Ÿn¹YÞÎÔ¿[¹?×Üüj+׆Ý;ŒÀÜíaNÿq•(h74ĖyMC˜z+ŽŒ‚ Ò³ì(帛éð"„gðÑåÙÑž[•WyÆP„KÈN¾¦_»ÆžèKª­IUÎ"çoU>ßr ()Edr¿Œ +ˆú)ÂS¹[ÖMáðm‰Üµ~1;Ϻ’PHWy u·5«ûÛG~ûÈ{Z4ØÀñk>>èæ#Nù«däθ|äõøH•Àq˜J zÊ×¥â©-òƒa@bñøµ¡hç(ȉ!# +€·ŠXÐö3•Ži]>±Ò±ý†O åo‘ùˆÌ0G;“•ôªÆ|wWˆÈL:àiÆ*!MÕ¨˜Wòt͑¶tk6³{Š ýj•— ½H‘ i¾ˆ°ö±;âyö³$}ÍډUߐ ÛTÝށe¿ª÷´Êڀ5óáÊÂw3=h.Š¶6ªsP*6éï+Åy ½nЕ[äº}ºß³;z©Í¼AԜÝ\{VÜÙp^7„ì8sê;5^^"“åêÒòœš¼}½3ùN3ERn€sQã_wPFù5%qDwMÊxbb-—C‰dÄÌ,JHZ‹±®ŽŒ0ÂÞ2»ù3yòÀIJ„æׄ}¬4 O™&‚"ÔÚ¸” +ᷔÊjöù3t·#w´ uši™]pÆÜ1WXFG€–û]¾ÎD¹¯¯w,¯ÌqŠ—Üí™ÏMä«¡l¾- ?#7ï+†ÑI¹ŠÓSãnÕ`ì~\r‰ã?¹âØ^XfÿRÌjñfìîSr.¼'h1N½ì'ÞÄîC.ðM›’˜,e8ÉÔYÍؕΫTŸ(žw?Q|"˜óŽ\üo –k´º©LÕsÀ””pk®ËÍ-šXÊ+J ›VHvriÆa¸*ï¾Gj~?0…ö|Å͢ߍÉê˜ÿʏ?!Æˬœ™QÄøÿ‚+úÅýOàŠþàŠþEˆ;ðüIˆµ»â·Š–5v_˜B¦†…ófAª;({ +ª!kåAþdJºyUýzàÙë¹9˨—jG^ËïMcËZqù/¥!nE[;Iõ`³ûÎâХʌ#-;E†Fcä o€–2]sbˆþâø¨í~sf6Pg&}à›1†ófî2Ç+—Ÿ ®`íö!‡®1>˜FÌ®_™áV*E×êÒ¶øNÎë„ÙV®|ŒçzâqÿÃ~µäXr#±½Oñ.ð +úÎÓ0àE÷Æ÷_L )•õªe`03צJ|™)…B!9²eŽ–*a’¤Wzs«E”š¼9ÙòÂ&§óH~ .J°wøm²$ÁSG€ˆ·ÛÚŒJR0,"Ë‹ƒn5Tìë܆yPމƒÌEJçÎ+ /Åê€ä4v›×Lƒ#vj`{é´ò0åKMÂüXx«fcúô¬¯Y]*€ÄÅ"Z3Jp›ê0V’˜š|âÏS·² ñK“%«š+v3H41³Ý‘¾…¤[BßOq;†zbƒì4Л¸ÏkœHé–hO‘O!ðõSÁ‘š’VáSOœ Æ[_N²[|í«5~µÆ{YL»œV<¹£ +oeÁƒ jjd­¸Qòóv8†X÷5l+EP.¿Æìxs82ñšWuV 1B3eÍۛQù{(ßÐÒÃfá‰Îq µ z­ Ëthï쑧òm5úµ\¸†0o£A{®··ÿüý·QM ã±M‘?tە}ф@ªUèèæF^O;2u}º`aÛ8~HVgÇLj옐¯¯¥ùü +Œ_ßG\2†›—¯ +ùD…\y› ¨_™¾¸Lkd[<]ßòƒp}íp}éæúÆÍõ•Ãõ¥Ãõ­±\_=\_?\_ß®¯®O,³lßöy²}å´}ã´}ínûî®/ž®¯®ïfúòü”ë›ÓÒêO2MyºÌ.fbƕ¬À.ãˍޥƕÿÄ·îóí¼øbŽÃúÈ۝%£çCՂM >בûŒ«žÒ,Éwa´* ŒýА‹þSêVx+¯¾Òzª ֗+º÷)Ž‚³}ŽúL' ,Ø%;S¥¼o @/ð¤-z¨¨Ò`ì‘äPØúñ֔n+63øR¶ ›½» ÅÕhb|•$X-ž.Ž +ãºäyοtÉM`¶ø•˜—ÄL¬^¿œÃßÞ9Ø4¸üº“¥£‘µ[#ËG#ëG#Ë·F6o¬,lÕÈ££e£‘ÝÈÆÑÈÆÙÇÚ½Õ³Í³õ{{×ÈòÙÈúÙÈ⭓•O5²+Ò9˜éPÓ<3mi©E‡Þä5Nh¡Ú¦ƒˆð+¡8²ò±;Ú]–YåÞÑzί¿Ck ½yG~EXè¢ITMÞ¼è¶%êÀ²Ê[ϪHoÐ*± ˆçtR±NF"³£ÒJ~²ˆ³-À›Q7 ‹]?N2mû´é‚v?û·ژª‘\þ0z}Çèõ‹Ñ?ÇèõÆèõ§Œžš‘z3|b? Ý5&®*ê¼1ƒÙ */žïŒ¢ÈAXHC}A¬1òÀ6Ð(nX´W>ü­4#Õ¯ðäÈ!œ&Hk®1 +osúSû6Øó+Ç †¶ž$ΟiLƃ^ív…5Œxµ@ï6sfYñI Ü.lnj²FG‹z™$‘ro/ %&ÃO65NÎ2т›y±wÐ ‡6{ÁSG€ðn·µ•øP4F9÷1f;­Rú:~ó;ÿ j?tdZyXÉ+wKywhAùÌ2êòª/ôÒP³öIþtŽt 0_ÌqX)tZÒÊà|(Éé6VÒÒg\ªó)bO^̅ÑJ§bìâPyà?I´ޒo¾Òzª ֗+º—ëÙ¸7w«h¨œc4ŸÞhߖ9³_Øj*OžâáÜäÅ´Ô.™òähĪÎJ¬Bú¾Zá ¶;Aݺޏ«Õc´ù¼ß·DÄòŠ¥æ¯÷÷úŽ—áulû¿¤mÝ3` + aö3Ø](±æšjµê¡RH"Q©„|æžõ­`rÅÕF†jó°%c#¼—|–Þ$bÇT«(N îÀ,DB×Yô̔ õ䢄q_u¦…YïE°.N+m „Äm ®Ó£áònïpyÃÿîQÞQrz&§#ð£Î‘þJ‡i“ªÖ¡¤¾U®JôsÂØ/—´¹«æ,ÿƒ$#_#/¤dKHñ©…P©©^n©x¹a5-k6ÇMÇ?´Šj ÎÐ/&rx óâ4ÅZtl.÷¥”Nt1UÍO(þá>ÁýæþXÈ¢²‹ŒcJò7š6ÐU®d„ØÐzBä´°ªL¦?K¬d›ž™‚ïlŠ òô…¼×Ü,³‰žl-PêvҜ°·†â¾€.s£´—cà š5¹ÇŒ7¨ûU‚¬RÍ >·þvk˜‘3S27u9ùTiDÖ{zœ)~­ kõÅ¢þR7ÿ uk7°é;Ô|Ül퟿óy˙í¸48Ëó—ìü 0‰m"c†åðÛoø!ٚÇóûñù… Ótþ’j|œ Äsào¿!è+DÍp߶~þ|+ƒmï#Y'ý3ãÒLvN½nÉdÙ/ÉQz›©=dWó[Ji•=© Ó:Kª±ZÅ× +‘mi¯®;DŒ¾ú.­þŠ`X·¬`S˜±Õ›ó°ƒèé!R–)`·äÒI¿*+½Î±zPd±¤†WœZKN>)ŸŸí/>¸Ì­ØqLãÉЋíÈv¸Ò¬é„‚ ü,»â#Ü¡Érlä+P›ÞM¼„} :¢Ðz!³xq¹øæÂÕqÌ¬Z·1-äåÀ¡eŸI^ˆñ*.fiðRWÍÚ „ŸË/-™2Ûpô}#($ æR @Š¡Ù gq,aˆ‡D³û#ÆçҊKŠØŸ:Û¹&Õ+}b=]^WžÞåá/4׍&^0tù‹j4é{ †QÆ&ë-\Ž;;Æ&ŒŠ´c(«\u}Š­ÂÅŠ]È#Ù½MD•ú¸—ç+µtã«æ8§Ñ„íæà–ä¶IêâŽä‘z.AÐs»ˆ>KP,«–ûª°¡%w9Sâ±³Ck5ë„ê—rŇfÚe'7¬¬Â‘%ººHyÁ,ÚÙÕ̿د–\9Ž#¸ç)æuý«Ö6¬…½£o 2 ɤ…¯ïˆÈ¬îêyz£× $䫜êúGFD3Æ#°f`ÑÎmWW‰fç>×rk—ýzÎ!<͵…Q /Ùô,Qù«Ùî$ßT¯î}-í¾u«Ì…w÷êf1ã>¤iH©m²b=ï}&aõ•óVd4=* >Og;A[#ÞVbË0ᕋeò8‚³£0붻W^Ùؖ)uFˆ{/öï‚7ã{C ¦ŽN¿ò’xÌ,],²ŠAˆà¡7©’Œ«ôb›YòѪ""Ëû¢ ›´L)¯N—‘v%·\Ïà0Ó.š d´ÙžÅ]¾ª +F3Éèÿ­¼JÚa2ŠQ=ÿºÏÞºsi?Â÷»}jugý Üg‘ËhÛ{÷¬¬-ÞÖ+~‰‹k".Rx`Z²m£ÚéÖ´9ÿ]zö¨±Œíȑs4¿ J‹s4—دs‰ÜS.a©L¼jµÉlB+3Pý•ÊÑGГOjº¹oc’‰ÛÌdšÈR`t±1·Û®=ÉP9ê ä&Ë*ù$z{òՆ)UüouâÂk»_¿G?vƏØ=ýë/0Ñ ¬ ! h†©×=þNK 8¾h­&˜qˬ¿¼Û1CÒ&5,¶¡-{´ ΧàÙxµJÉ0óeOUŒcUáÒӘºnMë³Ïìä^›0pq›éÑd¾§Õ'0²b!”osSNز6çMŒŽ’d+ £MÅ-0; -¤iò1jš¥¶rÄKŸ<=ß±7‹tw-êµ̑sk/ò·5P ¾w”åå‚ÅěeŒQò.sx3ì&A>ºÎk¯Ï@Û2GÁp›ô0€YÂsô×Mú³Ë­›€åI8gHéxÄ]¾›€HbmËãó2Áº8~~ïÃ]ß÷v°oáøbnÑf8âÁ$æ¿%z*„æ~”$Ñ)ÖÇ(‹B⋔Ç(éݕ0„«X °Hù!r†HÍæ ‘J•oÉ#²L,å,R[àc@‘•e¨ˆð‡P¥¾¨ ÛÌyD«GUI¾ÇÆMl#Xâç“ÛMìÏ9†Ï¯ü6?0zhÔÌ ”ÛNӛS˜‡JAwFQ’tÛ¡Ù(Y¾¤§ +±»ý³6g*³ã' xÇýHžþ{ÉSk¹—F)‡ÆŎ_¥MÞ1EÓÔ2â$Ö0 5ñÞúlK!܃ÒR)S,³¤EÜ+£Hoy34› b1×¼-?ۏž³Ë\¶êFXiÓ¢3½ø¤ñ-BKºJÓ9ʀ7¥š‰Û÷o¨âCîV{pU¢ÜLö6Š·yÎ.cd´g[°¶%8ÏYÍÒõD9Q³eÁ ²Úr/V¨6Ý·Ù6&÷ÚpdÚ \Æ­œü§‹2nês)ËÎUYýŒª²ÚìRý#¤ñ Ö{ q…@~¶@ ­¨cÁ@\0ψôèg ôó£çኁüQ Òé ¡ü»|}¾ý綣ndžU¼­d~{ßïCž+S–Cbæà e(&ñRX<ÐSšëו!¼¦ ñUeˆ‹2ē2ÄE⛔!ÊPž(Cx³2´UÂX¤ÁJ«)åMâq'q«8L x.å™8äÀ½ÑÝ&ôÞÈ å 7ô/ŽÒÿ‚êÊ ùÌ ýpˆÛfÙsÚ"œ0ðùX„ÿ¯<|”EH½á°8Rø$ÖöQäýº­ÿ‚ÈûÎþw˜¨³ 0v|½¯Æî 1v«í¦Öø|-ï>¯ònZû­Ü~|—7® µ€3p¶Úï¥ØzqÞ¯ßcDÞò½ƒêBÂ_žÒúr¾×2쓔»j„q{mù³öñ0Íü¦FeéºÔÜZQÕñ‚¨:ZP€~ËX¿EfֆK¸&î:l‘c?HmÎEJÊ23ö‘áT¤ÌÁÕHªù¾Ú® jƒüœ.ŽXªàÚ/ÊÖªõâ3®}kxêk£p÷UêÚ¨‚µúÚ¨:¨Ñå⨞É9¬/n°ª)\|ä±TÞ.>rAz…|»¥`-Ú¬k£Öªýâ#ƒ&¸­]UÁ¡×‹\ÖåêZø8nW—iĐ/>r­4¿éâ#W°FLW± 7{9^|䶑EÃÅGn‘kõ‹whŒ ”ñn-@öQ;yoOF#Øn½6 +BƒQðø×Fûu­[ß4iV;üɵQTÌ‘º6 +ôQ+ѵQêœ.^|+Ö\.ÞFW\ɳQèøÿ¾}÷Í·Âí‡ßÐþç?¾ùÛÏÛí¯¿<ëÖÿÍ_> ˆù «Þ~ûîß'GyÕX¢¼Ñ'í›pJ,€Ó΋¿u֔3ð?ß½›?Ä~´³>,µ; £½ÿuê8ú/óå’+9CÑ­ÔñÿŒ[=ìôþÇïØä$꼒ª¥7©ÂÀ!ûz^´ßñð£Ub†DGáWÔň~K{ÇÂbVjA˜“Új3OO÷q Ù&/u¬ÍÞ`óa`˜4/9î8ºs8:W1!E§zò¼ËCá€×* è(”%¶EÆG#rMJY¨î°þòVv•á¤Ú‚\á¶ò‘¢ïӄܽøҊ§>bÈïFûå[·FnUR›Aس­Ú¿”¬‰ÓoVÿø¸R¿I›q2nht…«á©Í)e +owãp¬™|ƒ×6 Žþˆgïùð¸J¿Á°õáӌs*,˜¹Õ(GʑXœ ¤D¥ÈK‰)µlÓö +µÐl„ôfru"Þå—p¢w O“¹$RµRšÖnlƒlð§ÍRí&ö Ö¢´‚I¢ÛZÌW¡™zÅ 뺆ïhîN™£ua·rÅgf)VKÊÃѸµEò„‚Á”¢Ý`íÛeu-¦‘3]½Ú-£/@ÒÀ¥‹Mx«¡{~²¿lz6?YÆë ¬OV¢-‡H%º7€­¶~Øúm`ë?€­7ÀÖG`ÉT«÷E" #éäkG`í›À†Xû_€µ°öX_5rÚcBzTÿ#€õ°þ-`íHØTòï?¿^ü} 0^!‡½ endstream endobj 275 0 obj <> endobj 288 0 obj <>stream +8;Z\7?+PV1&G;1Zd2VclHZ>WpH_L,bHJ$L`Qtu4.%]E\14qC@'.W@?g(le>&7e8%H +2e">(DhM&!+J^Kh%I?JmXPU)jVhOK9Cp&nbB5(lKL-6M?g-81:Xm`$K&o.)/,Q.?C +@l0C53gnMh9!d"IPE3@IY8M.jn&)+ZXUJOh`^cSj&tG=!B?/!V4[a(Va(H>5,mn3O +f+%6D8R2lF7Zg:O7KWB8;iQC^#KoW-.(#S+O\3`/=[!24X:TR" +VpKN:11K]BO[B#c1=/YO;-6<[ImtXm!_2t'+U@og4C2K',>QMqbl/?L2fSod<-kH= +`^eR<1d,ou`%W&`o=Ao7JQ*6u<,#7qZ@PL!Z;Bfj;!0'h7\Klb^m,E+dRr-6-jGp& +T6TYr5$GHjZnl1,^Rq],3+i%!4-3qkjtNq]<^j0S2ET>:F_ZEI]bAf'TG$85q7 +Ps'VoUBe5gU.k8$GZS_g^./!@(M%=W4rOk1@g2dM3Sq'(\nl$I.a!e"q?i31gR_nC +)0lsL(d(:*c$lM^r;Ghf'\*^Le'>!=BhKb-2baa0q/l=Xm97!MBP2nVD7f>jO7nVZ +Y?M4T"Jgt+>=N9]Sl=[[bAZ@7 endstream endobj 276 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 462.2114 388.7379 cm +0 0 m +-0.017 0.01 -0.031 0.024 -0.049 0.034 c +-0.981 0.554 -2.159 0.22 -2.679 -0.712 c +-2.976 -1.245 -2.986 -1.854 -2.774 -2.378 c +-3.268 -2.837 -3.755 -3.305 -4.231 -3.788 c +-21.99 -21.83 -21.76 -50.956 -3.718 -68.715 c +-1.987 -70.419 -0.119 -71.981 1.846 -73.386 c +1.796 -74.109 2.152 -74.831 2.827 -75.208 c +3.76 -75.728 4.937 -75.394 5.458 -74.461 c +5.978 -73.528 5.644 -72.351 4.711 -71.831 c +4.1 -71.489 3.385 -71.521 2.817 -71.844 c +0.961 -70.51 -0.802 -69.029 -2.44 -67.417 c +-19.767 -50.362 -19.987 -22.392 -2.933 -5.066 c +-2.417 -4.542 -1.887 -4.039 -1.35 -3.545 c +-0.555 -3.696 0.282 -3.342 0.698 -2.597 c +0.877 -2.275 0.948 -1.924 0.935 -1.581 c +12.563 7.73 28.237 10.596 42.511 5.815 c +42.598 5.246 42.93 4.72 43.473 4.417 c +44.405 3.896 45.583 4.231 46.103 5.163 c +46.623 6.096 46.289 7.273 45.356 7.794 c +44.614 8.208 43.72 8.073 43.123 7.533 c +28.332 12.498 12.096 9.574 0 0 c +f +Q + endstream endobj 277 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 465.5771 377.4718 cm +0 0 m +-13.635 -13.853 -13.458 -36.216 0.394 -49.852 c +7.043 -56.397 15.878 -59.983 25.092 -59.983 c +25.719 -59.983 26.349 -59.965 26.979 -59.932 c +27.147 -60.231 27.392 -60.492 27.714 -60.672 c +28.647 -61.192 29.825 -60.858 30.345 -59.926 c +30.865 -58.993 30.531 -57.815 29.599 -57.295 c +28.666 -56.775 27.488 -57.109 26.968 -58.042 c +26.956 -58.063 26.95 -58.087 26.939 -58.109 c +17.542 -58.622 8.419 -55.196 1.672 -48.554 c +-11.465 -35.623 -11.632 -14.415 1.299 -1.278 c +13.844 11.465 34.175 12.002 47.373 0.22 c +47.096 -0.64 47.453 -1.603 48.271 -2.06 c +49.204 -2.58 50.381 -2.246 50.902 -1.313 c +51.422 -0.381 51.088 0.797 50.155 1.317 c +49.688 1.578 49.16 1.624 48.683 1.488 c +34.769 14.004 13.259 13.469 0 0 c +f +Q + endstream endobj 278 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 367.4321 144.0831 cm +0 0 m +-0.24 0.134 -0.543 0.048 -0.678 -0.192 c +-0.74 -0.303 -0.752 -0.427 -0.727 -0.542 c +-4.594 -2.938 -9.634 -2.4 -12.916 0.831 c +-13.643 1.546 -14.244 2.354 -14.712 3.228 c +-14.702 3.242 -14.69 3.256 -14.681 3.272 c +-14.547 3.512 -14.633 3.815 -14.874 3.95 c +-14.942 3.988 -15.016 4.006 -15.089 4.01 c +-15.598 5.203 -15.871 6.496 -15.881 7.832 c +-15.902 10.485 -14.888 12.988 -13.027 14.879 c +-11.267 16.668 -8.947 17.706 -6.457 17.831 c +-6.413 17.755 -6.351 17.69 -6.27 17.645 c +-6.03 17.51 -5.727 17.597 -5.593 17.836 c +-5.458 18.077 -5.544 18.38 -5.785 18.514 c +-6.025 18.648 -6.328 18.562 -6.462 18.322 c +-6.466 18.314 -6.468 18.307 -6.472 18.299 c +-9.083 18.17 -11.516 17.083 -13.361 15.208 c +-15.311 13.228 -16.372 10.607 -16.35 7.828 c +-16.339 6.423 -16.051 5.064 -15.514 3.811 c +-15.526 3.793 -15.54 3.776 -15.551 3.757 c +-15.685 3.517 -15.599 3.214 -15.358 3.08 c +-15.287 3.04 -15.209 3.021 -15.133 3.019 c +-14.642 2.1 -14.01 1.249 -13.245 0.496 c +-11.235 -1.482 -8.596 -2.497 -5.94 -2.497 c +-4.03 -2.497 -2.112 -1.97 -0.414 -0.9 c +-0.187 -0.983 0.071 -0.894 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 279 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 357.4194 140.0851 cm +0 0 m +-0.184 0.102 -0.404 0.075 -0.557 -0.05 c +-2.193 0.58 -3.664 1.525 -4.929 2.771 c +-7.37 5.173 -8.729 8.382 -8.756 11.807 c +-8.783 15.232 -7.475 18.462 -5.072 20.903 c +-2.256 23.765 1.751 25.133 5.723 24.618 c +5.763 24.512 5.837 24.418 5.944 24.358 c +6.185 24.224 6.488 24.31 6.622 24.55 c +6.756 24.791 6.669 25.094 6.43 25.228 c +6.207 25.352 5.931 25.285 5.785 25.083 c +1.667 25.617 -2.487 24.199 -5.407 21.232 c +-7.897 18.702 -9.253 15.354 -9.225 11.804 c +-9.197 8.253 -7.789 4.927 -5.258 2.436 c +-3.95 1.148 -2.429 0.17 -0.738 -0.483 c +-0.722 -0.64 -0.633 -0.787 -0.485 -0.87 c +-0.245 -1.004 0.058 -0.917 0.192 -0.678 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 280 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 513.7944 322.024 cm +0 0 m +-0.933 0.52 -2.11 0.186 -2.631 -0.747 c +-2.872 -1.178 -2.922 -1.661 -2.822 -2.108 c +-17.838 -11.413 -37.41 -9.323 -50.157 3.225 c +-52.979 6.002 -55.315 9.14 -57.133 12.533 c +-57.092 12.59 -57.047 12.643 -57.012 12.706 c +-56.492 13.638 -56.826 14.816 -57.758 15.336 c +-58.024 15.485 -58.311 15.556 -58.596 15.572 c +-60.572 20.204 -61.631 25.226 -61.672 30.414 c +-61.753 40.718 -57.817 50.438 -50.588 57.782 c +-43.752 64.727 -34.746 68.756 -25.073 69.243 c +-24.905 68.95 -24.664 68.695 -24.348 68.519 c +-23.415 67.999 -22.238 68.333 -21.717 69.265 c +-21.197 70.198 -21.531 71.375 -22.464 71.896 c +-23.396 72.416 -24.574 72.082 -25.094 71.149 c +-25.11 71.121 -25.118 71.091 -25.132 71.063 c +-35.274 70.561 -44.72 66.34 -51.886 59.06 c +-59.457 51.369 -63.579 41.191 -63.494 30.399 c +-63.45 24.944 -62.331 19.664 -60.245 14.796 c +-60.294 14.729 -60.347 14.665 -60.389 14.59 c +-60.909 13.658 -60.575 12.48 -59.643 11.959 c +-59.364 11.804 -59.064 11.733 -58.766 11.724 c +-56.858 8.152 -54.404 4.848 -51.436 1.926 c +-43.628 -5.758 -33.379 -9.699 -23.067 -9.699 c +-15.649 -9.699 -8.2 -7.652 -1.605 -3.498 c +-0.728 -3.82 0.276 -3.473 0.746 -2.63 c +1.267 -1.698 0.932 -0.521 0 0 c +f +Q + endstream endobj 281 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 474.9116 306.4962 cm +0 0 m +-0.713 0.398 -1.568 0.293 -2.164 -0.194 c +-8.518 2.254 -14.227 5.923 -19.141 10.76 c +-28.62 20.09 -33.898 32.554 -34.003 45.853 c +-34.108 59.153 -29.028 71.698 -19.697 81.177 c +-8.761 92.288 6.802 97.601 22.226 95.603 c +22.381 95.19 22.669 94.825 23.084 94.593 c +24.017 94.073 25.195 94.407 25.715 95.339 c +26.235 96.272 25.901 97.45 24.969 97.97 c +24.103 98.453 23.032 98.192 22.466 97.407 c +6.474 99.48 -9.657 93.974 -20.996 82.455 c +-30.667 72.629 -35.934 59.625 -35.825 45.839 c +-35.716 32.052 -30.245 19.133 -20.419 9.461 c +-15.337 4.459 -9.434 0.662 -2.864 -1.876 c +-2.804 -2.485 -2.459 -3.056 -1.884 -3.377 c +-0.952 -3.897 0.226 -3.563 0.746 -2.63 c +1.267 -1.698 0.933 -0.52 0 0 c +f +Q + endstream endobj 282 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 657.2822 167.9313 cm +0 0 m +-0.004 0.002 -0.008 0.006 -0.013 0.008 c +-0.252 0.143 -0.556 0.057 -0.69 -0.184 c +-0.767 -0.321 -0.769 -0.478 -0.714 -0.613 c +-0.841 -0.731 -0.967 -0.851 -1.089 -0.976 c +-5.663 -5.622 -5.604 -13.122 -0.958 -17.695 c +-0.512 -18.134 -0.031 -18.536 0.475 -18.897 c +0.462 -19.084 0.554 -19.27 0.728 -19.367 c +0.968 -19.5 1.271 -19.415 1.405 -19.174 c +1.54 -18.935 1.453 -18.631 1.213 -18.497 c +1.056 -18.409 0.872 -18.417 0.726 -18.5 c +0.248 -18.157 -0.207 -17.776 -0.628 -17.36 c +-5.09 -12.969 -5.147 -5.766 -0.755 -1.305 c +-0.623 -1.17 -0.486 -1.041 -0.348 -0.913 c +-0.143 -0.952 0.072 -0.861 0.18 -0.669 c +0.226 -0.586 0.244 -0.496 0.241 -0.407 c +3.235 1.99 7.271 2.729 10.947 1.498 c +10.969 1.351 11.055 1.215 11.194 1.137 c +11.435 1.003 11.738 1.089 11.872 1.33 c +12.006 1.569 11.92 1.873 11.68 2.007 c +11.488 2.113 11.258 2.079 11.104 1.939 c +7.295 3.218 3.115 2.465 0 0 c +f +Q + endstream endobj 283 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 658.1489 165.0299 cm +0 0 m +-3.511 -3.567 -3.466 -9.326 0.102 -12.837 c +1.813 -14.522 4.089 -15.446 6.461 -15.446 c +6.623 -15.446 6.785 -15.441 6.947 -15.433 c +6.991 -15.51 7.054 -15.577 7.137 -15.624 c +7.377 -15.757 7.68 -15.671 7.814 -15.431 c +7.948 -15.191 7.862 -14.888 7.622 -14.754 c +7.382 -14.62 7.079 -14.706 6.944 -14.946 c +6.941 -14.952 6.94 -14.958 6.937 -14.963 c +4.517 -15.095 2.168 -14.213 0.431 -12.503 c +-2.952 -9.173 -2.996 -3.712 0.334 -0.329 c +3.565 2.953 8.8 3.091 12.199 0.057 c +12.127 -0.165 12.219 -0.413 12.43 -0.53 c +12.67 -0.664 12.974 -0.578 13.107 -0.338 c +13.242 -0.098 13.155 0.205 12.916 0.339 c +12.795 0.406 12.659 0.418 12.536 0.383 c +8.953 3.606 3.415 3.468 0 0 c +f +Q + endstream endobj 284 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 670.5649 150.7516 cm +0 0 m +-0.24 0.134 -0.543 0.048 -0.677 -0.192 c +-0.739 -0.303 -0.752 -0.428 -0.727 -0.542 c +-4.593 -2.939 -9.633 -2.4 -12.916 0.831 c +-13.642 1.546 -14.244 2.354 -14.712 3.228 c +-14.701 3.242 -14.69 3.256 -14.681 3.272 c +-14.547 3.512 -14.633 3.815 -14.873 3.949 c +-14.941 3.988 -15.015 4.006 -15.088 4.01 c +-15.598 5.203 -15.87 6.496 -15.881 7.832 c +-15.902 10.485 -14.888 12.988 -13.026 14.879 c +-11.266 16.667 -8.947 17.705 -6.456 17.831 c +-6.413 17.755 -6.351 17.689 -6.27 17.644 c +-6.029 17.51 -5.726 17.596 -5.592 17.836 c +-5.458 18.077 -5.544 18.38 -5.784 18.514 c +-6.024 18.648 -6.328 18.562 -6.462 18.322 c +-6.466 18.314 -6.468 18.307 -6.471 18.299 c +-9.083 18.17 -11.516 17.083 -13.361 15.208 c +-15.31 13.228 -16.372 10.607 -16.35 7.828 c +-16.339 6.423 -16.05 5.064 -15.513 3.811 c +-15.526 3.793 -15.54 3.776 -15.55 3.757 c +-15.684 3.517 -15.598 3.214 -15.358 3.08 c +-15.287 3.04 -15.209 3.021 -15.132 3.019 c +-14.641 2.099 -14.009 1.249 -13.245 0.496 c +-11.234 -1.482 -8.595 -2.498 -5.939 -2.498 c +-4.029 -2.498 -2.111 -1.97 -0.413 -0.9 c +-0.187 -0.983 0.071 -0.894 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 285 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 660.5527 146.7531 cm +0 0 m +-0.184 0.103 -0.404 0.076 -0.557 -0.05 c +-2.193 0.581 -3.664 1.525 -4.929 2.771 c +-7.37 5.173 -8.729 8.383 -8.756 11.808 c +-8.783 15.232 -7.475 18.463 -5.072 20.904 c +-2.256 23.765 1.751 25.133 5.723 24.619 c +5.763 24.512 5.837 24.418 5.944 24.358 c +6.185 24.225 6.488 24.311 6.622 24.551 c +6.756 24.791 6.669 25.094 6.43 25.228 c +6.207 25.353 5.931 25.285 5.785 25.083 c +1.667 25.617 -2.487 24.199 -5.407 21.233 c +-7.897 18.703 -9.253 15.354 -9.225 11.804 c +-9.197 8.254 -7.789 4.927 -5.258 2.437 c +-3.95 1.148 -2.429 0.17 -0.738 -0.483 c +-0.722 -0.64 -0.633 -0.787 -0.485 -0.87 c +-0.245 -1.003 0.058 -0.917 0.192 -0.677 c +0.326 -0.437 0.24 -0.134 0 0 c +f +Q + endstream endobj 286 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 354.1489 161.2628 cm +0 0 m +-0.004 0.002 -0.008 0.006 -0.013 0.009 c +-0.252 0.143 -0.556 0.057 -0.69 -0.184 c +-0.767 -0.321 -0.769 -0.478 -0.714 -0.613 c +-0.841 -0.731 -0.967 -0.851 -1.089 -0.976 c +-5.663 -5.622 -5.604 -13.122 -0.958 -17.695 c +-0.512 -18.134 -0.031 -18.536 0.476 -18.897 c +0.463 -19.084 0.554 -19.27 0.728 -19.367 c +0.968 -19.5 1.271 -19.415 1.405 -19.174 c +1.54 -18.934 1.454 -18.631 1.213 -18.497 c +1.056 -18.409 0.872 -18.417 0.726 -18.5 c +0.248 -18.157 -0.207 -17.775 -0.628 -17.36 c +-5.09 -12.969 -5.147 -5.766 -0.755 -1.305 c +-0.623 -1.17 -0.486 -1.04 -0.348 -0.913 c +-0.143 -0.952 0.073 -0.861 0.18 -0.669 c +0.226 -0.586 0.244 -0.496 0.241 -0.407 c +3.235 1.99 7.271 2.729 10.947 1.498 c +10.969 1.351 11.055 1.215 11.194 1.137 c +11.435 1.003 11.738 1.089 11.872 1.33 c +12.006 1.57 11.92 1.873 11.68 2.007 c +11.488 2.114 11.258 2.079 11.104 1.939 c +7.295 3.218 3.115 2.465 0 0 c +f +Q + endstream endobj 287 0 obj <>/ExtGState<>>>/Subtype/Form>>stream +/CS0 cs 1 scn +/GS0 gs +q 1 0 0 1 355.0156 158.3615 cm +0 0 m +-3.511 -3.567 -3.466 -9.326 0.102 -12.837 c +1.813 -14.522 4.089 -15.446 6.461 -15.446 c +6.623 -15.446 6.785 -15.441 6.947 -15.433 c +6.991 -15.51 7.054 -15.577 7.137 -15.624 c +7.377 -15.757 7.68 -15.671 7.814 -15.431 c +7.948 -15.191 7.862 -14.888 7.622 -14.754 c +7.382 -14.62 7.079 -14.706 6.944 -14.946 c +6.941 -14.952 6.94 -14.958 6.937 -14.963 c +4.517 -15.095 2.168 -14.213 0.431 -12.503 c +-2.952 -9.173 -2.996 -3.712 0.334 -0.329 c +3.565 2.953 8.8 3.091 12.199 0.057 c +12.127 -0.165 12.219 -0.413 12.43 -0.53 c +12.67 -0.664 12.974 -0.578 13.107 -0.338 c +13.242 -0.098 13.156 0.206 12.916 0.339 c +12.795 0.407 12.659 0.418 12.536 0.383 c +8.953 3.606 3.415 3.469 0 0 c +f +Q + endstream endobj 388 0 obj <> endobj 387 0 obj <> endobj 386 0 obj <> endobj 385 0 obj <> endobj 384 0 obj <> endobj 383 0 obj <> endobj 382 0 obj <> endobj 381 0 obj <> endobj 380 0 obj <> endobj 379 0 obj <> endobj 378 0 obj <> endobj 377 0 obj <> endobj 271 0 obj <>stream +H‰ìWÛjm¹|÷W¬ð>ºµ.¯sæ)„0ù“d`|&çÿ!UÕ­µ×¶ý@†0»ËZ’Z­îêҗ?=¾üék:~øñëñôûS:lÙ­Ìc¶|›ëxøÏ¿=ýõø Ãú¹ãק/?ýœŽ|úýÈúo>Æ*·UÆ:šÝr^óxù¦ü]n¹c¹tëyõVlÏùf¶ÁËÓs¹Y:Çê-cۘå ñ#7ñmÁ·1ÿ¬üãë·¾Yà´'¥½ÐHS΅‰µ|å9éÅh ´`©¦›í92¹¨ :e:*?æâk^|#Òa¹ÍuöÌíÚËÓߟþòßv[=åw³z¶{|ó­Ó¥ã5,ã=¥[}ú­æ.°@Èø½`Û =:íûå Ó¢×@ÜÚÕÂY-sÑÓúåë —0G;ÌàzCŠÜSãF˜ä­gƒ;UKçÚ>€³,ßj›o÷2,Ô +þ¶y+ÍÆ5 ó-ÍáiÈÃΪ´imÐÍ0…cŒ×4ö,i_ßàÔ4=‡š5ïõEöÓžt¦a¶Ó&f—Ê% ,ìKqEZ×æЃæ“v(_v(y³vÄ÷ô²žÞ è úÒÇ܃=m»ö6 ­!UÆT|×Ìù_PCjÚQ^媃'ë°#2´žc(ð<÷¬îM†nÉ¡î®g[{½@ÿˆ8íIiW$rGAV~»£døñÛwŠ9u•ädéuãWâjg:°˜§öB4–å¾÷¡]çZ´eå‚úð/Û-OOžÑm™-øH§L÷Ñ8HÃÿN 3jÑáÛ¬ý킫‰a²|]C(ù8bfÀ®3û¦SZüÁUóŸyžŌc9w;&-™V}ËäU–Wì²±­Ø&ûy=!Œ"”"#dâĦs±TôÑÎ/ŠaŒ±¤ÌAB›×Š¹®¥ÔX}z=Q +vLéŠJoLÒEšÈ¿•ö³¬¢s(1É«>9Käù‰ä£fWâí Ÿ¾%sÔ+5yiw³ â'Ü{9{”Xâ]¨ø‘âTgÛøU½ë„pW63Çí +ßX¾Ž`ïŽÚŸýÃFÌ$—„˜.\ªZ9gµ›Ò䤬@Ú¿AXñH=+S6ÆÛ¹È º÷ +Å[WëlãÈ©VÞApªà„žö~RÖ'ÀRRPŠ½ðÃÞ7”@Éûöä/Ύ=J2Áœê¢r¯Gà÷JQ/wØÒØ>Ô³(¸çºÍºþ-á28òËÚ¸¥¾Öcêswu"ñɔ÷®ýæÝÌÍ¢ ‚ñܯé¨;ÄAú&‚TÉQœ/:x=µ2ËŸ}Û÷Ŧ2˜lK/Gq*LÊñêB8Ãe´CÏæ…få@ÜfRŒµ8fN4š%ÄFÃ;®šF^TâÉë¸ã*ª—žŸÆÉ8MÝÖ¹|_-쬭tE~ôå2ԕ /Ì ß½á„ÏÞ ðgøa×ÖFU•t¤A¿,³ ª^—i,Í7—rÖ,;Ì5э™Æì+¡yÆTZÝk}ì«j÷ÍÒÝ|WMèÌÀjêV×ãktēˆ«=¢¤V½Ûyfa ¿Öˆà*Ðõè&„Å_}.'Î æ÷Š¯RÚwÃfÖ7(B¬¸­üMÑÙ4ÆIX]ET]é } •2£W—Zè6<ó4¦>”BŠóþz9{ƒ–É©V¡)Òì|²o±Cä@ò¶†ß©¶°_ž 倂…בÞù âë¢Z«è•”¥žÑt‰k² —éeA=ê@‚¼÷²ÇZpàð³9íá#7õΚGL¡G®7¥o9'͵qړ‚Ž@“¥¸üwlG}‰ÃOƸ§µWtàï ‘!òoä˜ä¶ËÿáeXF°£¼´i§{Žt^î´G݉=s{÷Á ËHF <°¿>(f½¼ã§æ¨–ñ¹"i@R¥Ê%£eëp‹ ¥‚"@Zxï⊨†×aGeL‰üÆ]ß@do_wˆ–ÓÚÎ/îdŸ]©nð"Yß7±7oKobÃQœ=÷~én¾}àԘ–ìdô{ZR€t÷÷p¿&X‘¬f§ÅœY\sTo{‹ö—dãüùûË+"ÕZ¹Â%.\ߢƒ!™sm pµ¾aٍ¢*®£H1e[„Óãñgɛ%þàwW÷—=Lµ´œ©~Ê(þ0ªÔ¦Ê‡*•ßý¶‡ÉÅ%7–Õª„4öxrÐ q>“›öû…¥¿¼)´a,[Ç'ÕªÞm\¾÷*ۚV@vig«a+è9ÚVñþÆÞ®Òõ¾L-îªfe'!ºø•8{ÔJßf¶?èt¤À)iœcԖr=+½sÖ3ä^ŒQ~J dÒ"ˆ½Ê­á-À‹jL  `Z;Ç"f‘ |w‡{ÕòI-ÿµÌŽ›í“Zþ8j™èx†bµ²çëJ-* +Q‹½>IӀqâéV\XÍ ^ðV³uBÔm!%”q·&*+‹?S÷Iݎ= ZÔgêþ—R÷Ëןa~Ghï/¿]#])*!8 0IÛýköq=úxSï‡ ½[yЈŒúNLr1¢©1ƒRvîÕ(0”²B)¾0ŵ¢,«B»ñƒÅö8òé—áFHÿI¯fÙv’À¡õ/ò«YŽåˆù<Å»À(j_ìï‡Gx¡FˆÏ‘£ë+dVwshP¶¬)Lwג…D"_ú[¯ÛÔë:¢#n=Œ?äòþYìêWuuÚÖFôFš=ô¡.Ùn,eહ÷0ç¾Ü‚/ ¾Q¥ †k"ËvïÛR°1ËìÊ~ +` S‚Ùo#ï*˜x1üqÑã¯ï Ç÷¿þ¶Ø:ÿùx$ä4e. ƒ/µÜR2ÏL·Žu¾Û\É?ù×ãóeï€){[ßet»9>ÀÄސ–o¢ÇP¿8ª2€†¬–*–%$€•ý˜7&.Ú$!˚ʔJ¿Š¹†™´½)cƒÆ­åÊp§F‡4Ñ"¿ÙR­ø¸‘Û´üÊڗÍÁ¢¿‚1­H%Ž¹É¹cf¦çƒÈRÁSÓIÖÆ_]î¯ךkD½Ó\ƼsÇ-žØêÆmözÆR^¡Š’yžˆÀœäþN±Å +j‚å÷ˆPێ:ʍÑWe‘­³çÊaÑaù·™kˆ¹Ú O~5R½ÙÁQÑޙMÕc¾à(‚ÿ“Ï—}aýÝð×ãŸnq ‚µA<Í#Ûi~~ÃT¸Û ÛêÚ}‚ÀXB_èûMzC3Øï*ׂú@{ˆb1Áó8û]/,§‘Ô=™,õúh99:ÜÎV£±-ƒøD÷)>ó™Í0‘³œ±„×ϖy /P¤ÄtŽ(ÃM$pŠ’§!å5Z}dG˵–t_š×жµÇbáøç7vc?ª°…ÛY•Êð*—5q瑪µi`Õ:" þzÕ1›E˜3€MÞm“œ"‰e´Æ¬gýã~:*?²Äž•ÔTá‰Qo±öÜՔ+W¢„vöÛ $6ªòæílí{bk…‰|¡â‡ ´ÝwNÜPëLĪީ QíYï¦ô³øóêŒF4!“Üayr6`hoMÎ e6hó¢Ö¤QÅՏó ö_ l(q ¸8Oõƒ~:²o•³^.ЗÜ,‚Y[Ò+¤¼x?±ð"Q“_Ô³8¯æºžuÙ­¡ `ÿ“¯îÆHÎtrQí £Zm·t±à‹žË¯K–ÒÉÎ̀8¡O8¸VIlEØÁ*²÷„&Ýço8† ’ˆË3 +]·ìO…V@úa˜sô͉4Ô3—×[ÙS5û„~¦*8Ûí°­È†Vç ^05fG£ÀP¥ä--°/·ª¡ä'­õí¢.•e%ªŠl*›ðP™``q§Ká¬,µÚB÷þ£m»²<éW̑<:›Î„‰†ô5™œj +‚Øäê&™Úgw\(º0'(„âjU|Gô¤?uZèËÓqÀXNXX¾^âN…”胞©»“JÓý 8Æ.)7Ï#”g†i`1õmÒ"W¼µ¦Ô¦Â5yK$ÈSÌúLO¼!݁Bc¨ôºn'SíÁìl ˜$e#5ÁÖ/È1l›ç„‰DhvÌ‘”y÷óTáÆSþxÄö-—:ö’á +,{ögW:³ö1ËþU–î¹"Äh²x¾ +C9›«†þ‰âÍ»}"_A/>€kè ŠvJJ¦4î³@þÌ6®g{’˜6Wº¹U';¦¢¸5VpãHžªK¸Ã±‹Ê8@Ý#o¿ç€éØÁßõM½Š°]Úzö¢¨¬WlîȎìÕŏ¼xâ%:íé؏Òr@¯Ì¶­ÞÜ£¸M¹JôÐZ̼žÀuí'}tÀ*ŸV䫳KA”}³/Š% +z½×I\z>‡ìÙ Å¿Ü¶k)ãt~ír×yA‹E& + eè<Ä6tޒg^ W½hqÌLæƒSA +å<¬Û»’FҋÑÖ8ÌJضKÆeJþݎÛMgRž¾ZRÑP˜ákÞ<È.¨y,Aü(E^ÔB\ÂÈo«"Œqþ+°T‹úÈ<’Ó(¥;]ŽhÖedäÛ-¾Y'2µÁ“DÐ^scGMù=·+r'ÉÜMq'¼s VœžÛíi–›É4mE4>ÊTJtóp«ÅKgÙ]Äß$¹0ûþÐCV$I¾ñº, ËæíãtWÙJY”L%ßMŽ…]§õW[a•ê!RÄAþ â쟡»õW‹ªæpÎj~hB…aeZ“õ6jl,Ïl¯vÕþygsâ[ûé=؟åÚB·JÚ®7G^×S ’¶0,—´…aŒÜùÇì¹2ÌFÀªN ³.ÎÞ¢°cÔ’uYY4K]¾nŽ€ø®öÛ«%ß&,úî·åíò ¾åiÝ`µk†,Ù;O»•X­`­ÜJe¼åàtL%ZÌ^W|%ྠC¤á·žËsó½"9_ÇÇ1=ã£cÀÖâÞ4ÊWgÇb’ʵ?N'í4ÞÖêiœT$•i}ŒÐJw^×æ€xZzhuˆúÖ~×Ô2_+EXù–F…M!û´ÒîõÁi@öT°rÈ* ©”ÚÁP,»÷v=ÙëÔ˜–«>x[Wæ&9¶¼‰äw®“7¬|+À'½´ ©l÷ +aæÞ3Åñ3ŽrìÔ5|7úÓf³»nÓ*(½ðÝÔí<åã þFþÕ/£ÐÇqC¼šÖVoI‡çý¶BlYÿG¼Ÿ}ÜyÐmR(ëµÔÃî‹é 4,±f¯`7–Íê‡åt*˜­Ùü£ç:s™Ø§@bqÄvÉ|T v·5~Eð½ë ¥Lÿ‡vd©èe‹ãO«ZEZOm_ÊɶÑá•~݆P¬c§­ï0Öu¨…ÁÅXMM_¬¬Û²P+Ÿ¼?ôÇym†xBe×æ,ò³¢Ì”e“ðJ–ÉF£-ܐð8t±UšëôŒ9Œó5ëÌ+åh¿B¦"_,/Ï×D­ƒ¹GÉ©Íû•$ ¥Y¤ßö>-Od1e%Ó§ píUVæ†+BÅ‘s(,ÒEÖÄ茈gYæF*ýÎúšþ$ +A¹ß¿åŠzÁEDÆ[¡u€C7Õ-À0nØCx:(<ë"í2V†E!ð¸*™ò.d&Œai6‘oF Wˆ+šÈ/Þ`®Ysuƒµn¨-høXàC²¶·Ùeal×ǟ^…t3•º.*ŽÒyÐêSµ7)»ëW±÷nù(äÈKºûøRÙù;ø-W–¥ñ@®,;ÁÈ¿´E¦/ÄtË'¢r ° ÔRâô÷š7AžjŒ~ÐKoíÜ_mvêT/8±÷µ˜\€Å¯Îå0t¿IlóÙ¯rI’¨÷+êÝðûxOa€ª•ù¿°43Ò#"³˜V˜EKé–~NÝ%3¹V¤œfù8@©íªpOi€<þ:9¬ÎõïT¸ZK u§û`¶Ø²¯•T€²©ö0?Ì3f6_ÀUFgµ@h„¸ @göÛ¤|fÄPçÇÁoù¶Ñ͘ØE i8â^B.¾g|_oÝoQø-0ö!tF±ãbq°„yêºßä º@§v®—™²G)•Z~}û®”?K$ý ”ííçŸ/ÑFóí-Œ +Ù×1¯TÇTo—…ïÈ$õ*§¿‹Ø‚ý®µ‰zìÀWßÌdÛ+º×¤I ŠV¡¿³t|ßÍo”VL¡‹Ù!:NǪ›×È +PŸp 1ÂvZ—3(Cê:øŒ7LŒ3* —Â(!ð²ñ7“±”˜^ƒD¥Û{}ƒýÒW˜øÍÎT¶ìtHû¡¦]|™ùOÞ +=԰͇0©e&žÆIIߘ#Õ fXW6z z»äƒaC'B[ùôÅk^Yßhtß×ïgþÿ~挷óïÞäçò°·)ù·8ø÷Šƒ™Ñ§åõËè®Ò.¾+ÞØ[Æ­S3Œ7#n›-\Z–°MMA¶&3VÚ®ÌðTãtÝQTÎméPvÙÖµ®8´oZcû–³ØçÍ.¿ÇÇ#Œÿüƒós,u‘tÿg ðFs71¾ ƒ[üü†?Ê~Ì·‘oû/<˜s÷š1È9 ÙýçõÁÏo—±à²PûŸwÀcޞ²ŒcØS£¯ªðÝ#gòêþP²x´xÏ@|‘$Ž@¸*þézœVQºåÚÏlb¥ +v‰r“È;ÙjÖπ9¢;³ÅEíJb>dCµ)I1iˆõr—«¬˜³ÀÚ] R#a:Þg ÈK”5úµ¦ª‘ÌtõÇbJã.3wSö™èS/>.lÔ>/ößKòÝá&qíY9#ï¸':o6~žmïùa’ØÃp¶†¨ž9<\ü–æeY²ÍÎØ0ù°ï±a ³¼œ}¾ÃV·w¹p/ĎuM]¯²ößQ¬„lßoHÇÇÊ;‚oTu¢p²ŸÀYZõ1jZ-õÌô©U6»xaí§ß€¾ œØvԜ^›à]ё8LŒorSrÿÎj»ÿšq*:£}gœÛ?d ÃÙÂö0Jŧ”cÿt¤ômÅ,õqB`çœÛ?äŒs‚sÊùÆacŵ"¬Œî÷xaj¬ƒ „ +ž†ž¬S=´M‹IâŒUD3+ǜd¥ïpö úԋùÐÆÜqž#U[ ?à› !‘Å@‹A³¹w§ÉBT.ûxª ½°Åƒ6iì"TQBñõHÔ9nÆñ¶øRÌáp£›ö–¹u™2ßóïÉÏÙÇ]~DØB läÌCdJ}ši=&*k6º—±djFh¨¾•ø +Aæë‚Ò›.º©¯ìÓ­ù˜‰Ü÷Q^[Ö¶Ý/m*ÿ6Ý&zC­,¬$·¨Ä2*ávYR BN@<»Ïœý¤»¢…JÒnê%°^º°êzþ)Á;NH¶6#&1,!Qõ×1àˆ[ßi}“ÆÑ1GܱXóU@ݸ¦ +ª/ŬÑw†uoa¹€6´È\Fýí&6Š+ïDó ‹iëÃǍEaÔÙ˜Ã*ݸVCÄ꾐ùÐb [Ü`\,»U¦yénłÑÞìцíÄaÉÊÈ°„Ý8xO3ÚkvTiD·"Q}| 9èmdŒU!’:s%µA_ïߧ S6û¶Â†7Æ8 +mŽÐ—£ïº9†¯<ª]|€ÐÇ´ˆÎ·üW=ËBÙ$ªtMÞ-ùHä¥Õ¦‚Ðéø/åÞYð+`¢!Ô$¦jôº‘ŒAqV¾a­&»¼aKA5á<#dö¦æÈJ¥ÕØÙÇq!»gÅmzgçQxuœˆŒª >üîÐI–šóï¦õ_×´Žf‰Ýô„s>ŸÐŠ¤ŸžÊí(=©:¨}6œ3œ½ÄánÚbZ™"cK$®sœ#g÷8Şä< ‹¶×tëÏ ÖE*/ƒ‰ÔÖD+](E?eŸÕæ¥E͟»¤PcÈ«1<8ÙÅ©ªÇc­ÎÝ;"PAAu’Ê-”•øµY¿B3óÚÇãzŠ¸FqçTÜÛׇ,х‘B­Bt´¦¿÷ôNu *lSá;­¦šý†Ê¹Šz„©.°«koxÆâyZ¾28 ÿŽž85~nÅρ< 8ü±u“’^ÖJ]áÀ‡Cvøbc4hæ,Ö$0«Fڎ¾*Ã3¨ô@–^‰²håP–6ï4±4F­·o®v‹U +ªÎ,£(+€‹ÚÉ€„f\»¢íŠ¥W!²À‹ˆsÜÅ)Üy^…©$Äpê5Æýz>Óv‰}¨ÔÇ;‰õ€,\錌Êdê!º:ŽD¸ +gN0:;_‘ùN(è)ìùÛ0±þáÆ( ½‘ýD–u\\ݧ'E¦K̛}@qb” BRœ¾µ$d/äBšç[–0»½ ¯§€9÷;L“l²–Ñ/謦ªb¶,QIf)>þ¤†ŠµP µwhÜntm;Ûè°£Ý7¨ØÂ9ONéíKg1S}©±ÞK ›ºKYÍívtߕXˆ¶Ù&mŬc_†•E‰ØðL$\V±u¦ø}ÿúÎÝ£åÅ;÷Ñ_:ޙœ½Òàë‹F&Ér‹ƒòöÌañ;IQT²WbbÎT1{sígöÜ;O7‘ÔÓÙËþ ˜£ ç +5µŸÔüáÚ`+3BUzª—yîG€ßFés–à[˜÷IØthšÓ¦Æ’@85",mofk°Ö%á‰îy¦qñºvbTˆ—EÝa:òGÞqOtÞlü|Úûö3ËA¢‰¢$ +JÒUпdžÕÅdu±a„ÒžD’×”%³ÏwØ*•±;‹bô¦®yõD±2³_yE:>VޑWôc!äygJÚV}Œ6‚ŠÚgX€Åt9ÂfS˜ZˆôÃg°Ã—ª<•¥Ê.%çï +~q(UÖ-÷Ì8 ÌaNÝfÉö¨@-0ƒÿüƒóÉÞ¶MÛ9 ¸¯ð„Ö[ℾˆ‹9¸šô üɽÌNJ±×ãa}C;âŸ1òÇu˜kܾ!¬²âZvÇ ÷{àö·ØÆ;…àÞºÓNõضÚqBïÎYˆgVŽ9Kãºb—€Ó†¡´¼1wœçHÂèSl:<„L-FÍæ^Ôrõ£Ç>©èºŠÊµéM縄I!KÈ°Ç8 ©µ4Ïl0Ž+êµ~Eë£AÔU2Hûã_‹],»U+”ÂVîq‹Z6PQ‘4êÈµBì–²™´±d–3HBE9+ùZol¾.¨RhïÖ£'´O·æcf²Š(»Ed­+Ž#`dã#ÃÀIgøŸW·Mèt+uH”†òqÜö]5.‰DUÛí/™y- º–gÌe6¼8o`/¯€U ®ëJyü +×5Ô5ùú'P-ÞU!&^ñY_D}ï¥ô¾Þ¿ïØì­ãY›²«j-óÁ˜ÿu\S¹`ªÎp¼¬{w¿éªDnüM +ÿR˜Ëb8¿G +k—;)d7€JÛ½ð)  V°ÚÙƓ.ðRf©{E©±Y`wßdØ¥tÎT|ôCˆÌÌ'].S6FÞ·±þYÞ¯f72wšP²7‡yᙬLÿµT¡†;B¨P¦dùiSÐN ˆFvø0ÑX̞¨öÅÇH+;¢ð æ²Ç.øÖbœc|YïÒS¥ìéàà˜áøØáMêW˜r𻧦1íÙ¯’$»•¶ïSÔʑópo¼°ï¿m SÒ{v„Ä÷¢£½©Jøóäõ‹¯Np«ÎhBIðÉrx'xüô´ꍽVÍòzð{±Ì\o,X÷ë{‡»Ï¢f|ԍ.rû®b˚ày„WnoóöæùÛèVۃÝ°5Õ6Ì>ßa«›ªQ™ù¥¯ïì®ýKc†O5U¸ÓÛú(§På²ig9D€CI„B6°¶rŒTÏ©;ªvË¿ÐXsá- X§YÕ./(BÆɊ&–;ô5 iJñAú›%ÕBSg~Æ,s{(cB$!x8ìHò ú—DE0"Ó:€öº*”Ý =½Æ£-)eƒ›/)X3“¯ÑqôásòMÚIÁA oc5v´D³cþI ÎlžE#,——ÿl…{ã÷\q ©Â;-&“•ø†¸Ž„ã xÄ èëÄYõyâ¼ÆVc§±²Ã–©‰Ô]Þ*~ÀÌkk¬ÃìypùÖ»ԋB=Ò81À \DE4¦ªÒPèÊÀØåó̲ɧ[ù9ÌF·¡®­Ôœ_Ú¶Å5ûê¨:™ò¡øªì.ñÌÂ:Wä„aJþ¾Qe-Iu/$ÉZ#ïê0¹€|.‡p´ØD«ÙÇŠâ…-³$!¥`5,[µ›tñ9þ~0(}oêé†T´–@ªAû`ll)í·¤ÊµêÖ!͈Ln.°ŸöªkQÇ5\¸0˜ýöP13^ÔùñàÛn“ṗÅþ‘ÌH"§J½²æĉ¸lÛçtkÄW^g1Ä!Õ*âüx°ÊøR‚)¾8ÕºµåÃqž•Ö©Ík{­Í‹þ¥¹³ìi¯J–œÞÇü«Þ6$w¢xò©¯è_ÆîÞŒöÌÒj9J˵„HÛK,E=(\.=Â^PïÈ-îëJFÁ¨v1Þm3ã‡RËEB2 DÕGô~6^«S·m Pµ@ß`4n–8r @6C_të*1·)’ YYaKüwó¿ÖA¢b"ípéݶڤ¾Vໝ\GŸødØÁP²ÛÇ° ·¦ž¨v³Äz`ªmûé ¸Æ¶Ã®’TYNÈ!ûl‘°L…e‚š)dSÁ):ÎNåÞAÚ, '.ËZ;kÜO¥ë°ë;9@qWZo^mKÍ®øg +:Š)(ÉÑMA×~4µ«‚£ù¤#„$E›Å šaèff†W3Wi©žSÚñÙÚ9^µM[|،óó–SçÂF"”%šˆÙÚµ…fêñ¹Ý)N¬‰íJg¿ö`?–k vcƟóæÈëšcŽrma˜kÖ¬‡›#ÿx؁5WFq +h5²CÎJˆºîöӎQý†2Ý;¬$§Eë-ˆïj¿½êuE“À7øî·åíò ¾ÚFë@ãiGy/íoWô¯vE£Y8ÊD|;t¦<4vfÈ{X¥íN¼•;]řNîJµØ²j5óÞÛõä´[²Ò‰î “† +îÜ$T0Z5®͊ƒÀW&zhÚTœ.ÓRdq¨F‘•`mº†oÌkÓf³»n.¹ægy‡ó¢Ë诋ËÛÀ[‘å@Õ¾­x¦ü(ô®2k!9$ߕovdså}ã{̔çyª­ð_¹Ùéï1÷€V€H!¬n´d% žY¹x¥Ëh4׃ׇšb[T0áëûf‡Ýã:\y¢Oµ4´0>äFë؊!{În‘Ö§Cý̲wžRÙIÉêOu>Z¿úñ8ü;ï·$ô.¿Ã{T¿ïÎɧhِEõ°ûb:(=Šc;ã)È(¬ÙTÌÖ`lôÑs¹LìS ±8×XÝ 2™*@Ôî_`›Ÿ(³s ¤”é_´£ŒîkªçdZ6”ZGÆ +ådÛp<¥_·!ëØië;Œujap1V³è©‘ÊJl7—l,Öh±òÉk-ýòº[EÊ0¯Ñ:Ü Êd3ú)R_äìɾ€t'ši :µ:+‘”3•@L׬#/ÑxºÖ|¥k¢~ååéš(uÞÈÀ:eúè$űÑÙ&š®g"‰» 8ú +®­>—ÏÌwŸ»+<²­”<ŸP•àŒ®±Þt˪*8 ÇÔ ™K”^„Í׋-–ë&½Çzð„.=»(ä'î. +Ë£v\ÿèׄ¤µj&ùTQė9-Êês,YáJ®õ17\‰*®˜œCb‘/²&ÀgDì<Ë2G0R?í 綠ZV t(ÈíºšDÁeDÎ[±u€S7.ÀpnØD˜:h< #ýrVŽE1ðÀ*™/d&Œáé6 .ùîLòŠ.ò¯°Û,ʹºÃZ7ÔT|,"YßÛì¶06“ëã¯^‘…t5•Ê6*ŽÒyPëS¶79¿ëw±÷o)dɧ”þñS…ç{ìà·lY–È£ªl)½”í"ÓbºeQ»Xj)ñ Š‚{͛ OuFßh¥¸vîmv*U/8±7¶˜\€å¯Îå0”¿InswÏLµ•,§Y>Pn»-ÜS. σ¿Œ$Vë‡ +xj\­%ÚÓ}06¶Ø²±•Y€·ëù'ˆEƶÍpŸÑY/@°7paÌ~{¨˜™2Ôùñà[Âm´3ævQD&\ý½ˆ\Š Ñø4M$§?Ý'~#ÆÞÿe¿Jr$9’Ø}^Q¨†ïË{t¨¾èÿ‡1’f™-HH‡™Ñ)éọ„ª†œ³Ð­¸Á{`€ï„t-Ð$8oêxÙÈ +ïk–v;F P—©ùéò©ìðùñ°˜ãƒRL´‡j [^á«Û­:浿z”™¨â¢AQr¾GÉ9jßVÖks@<-VŠ^î!úÖ^ÍÔ!n¾üh¢ñWh¢™š×ññøþ·_Ø_Cjœ÷!Іï³ËšaGuB¢ú:¨ ¯ƒ¥2ÂHHòMA.õÝ[4ÅU%¦±žW•jÛ«@WT^FQV¹Ô…¼P»}:Ù¥*6ÖhYàEÄ9îRy^…©$Äpé9Æùz>ÝÐlGy{§Ps W^FFîß8;5Ú +"…=']c]‘© +3³Íi¯ü»Ž ²M¨pæ oØS?÷â€k㥽Ïr|C$Éò„A‡É—‘¤u¥{çTùÔL¢3ÈgÄYØV•ÉÞŠXíâ¥í„"ؐ&³?aâCמţ˜òŽ{âåÍÆå!Y“ÈÝ$±P’Aš9<®øM­;¯£,[æÞãäÓ}ê(7XtxÙ&Àv_J\EïûÖ·Û\\¢.àCêqû7»ž¼„|ôø ç¡ 9[§‹ÓCÕ¼œxGƒ÷áê0‡x;³=œòm$„N–QƒÐMïÓg?iÄ(j4‘Sj‚?/WZ•ì¾”`Š'7Z›r?j–0¯Èýu¶ÀùPP}$E„©í¸1qfX€ïõ¶¹¦ÒJÑë+úÈØÝû›Yż¥¯— vF¾p[J£N­–2onқ·˜™–®‹‡1·Í,Ó-£­³o·ƒ¶IF£Šˆb‰ÿƒZ~,Ø Èó֌ ¢vÿöÐLf×` ê™ñ‰WåÓ¾Óò¨öøà +PkX!ݪ™d8o1îۜޖL¤ù¨"=´ñµñØĒú%❿ÆåìJ¹^Çä刈ÊZחoX_KÜïò†CûGÕ²ý¦æÈ®˜ä8vövœFÈÎY‹‹L\ò(<º^Qeõú,ü~¡&,,ZÝFâ{?ë\YórZ;3uPìŽÔö> ϹüfCáÙG¿"{‰Ëùáâו¼‹×^eEŸ%ø†É-ªå ƒCqZ×XºNHËU Æ? ÛßÃÔÝóLíâuíÄ +¨Âº?a:òSÞqO¼¼Ù¸|Úûö3ËA¢I¢$ +JRU3çÇ¿Ç†ÕÅScD’W-O"ÉˍÊìóšu˃Ëâì†š sâê‰âKÛ>oï‰4}|yG^ÑoŒ…ç™)h[õ6Lõ´÷°‹ér„ͦ,µé‡Ï°ÿT屨,Uz”œG¼+øÅ¡TY·Ü³ÍY`S{Ær#"µÀ6üÛ/ìOö¶­ÁïAxÜÿ±q†¾ˆQp« ÏÀß9¢—ùøbìõ˜!pa¤ßþù¸F#üûm~a}­\_ø?^÷Sßbjßø?ó+ÒòÁ7ՃzÀà–Äk³:Á¬}v¸ºb”€óš!4„1wÌçHÆ`ôÀ)B +‹{Ães,Š¸lèÙ€äsÝÅáô&p\»¤Ð#¤Ö³9 É´4OoPKéµ~Æç£AÍU/LsîׂŸÝÊj a+wˆ€E(¥ÈY"’¬š¨ý»G‡Uæm¬™u µŸPá;֍¯ ªÚ»õ°‚¶tkÞf +«zÒ$"]]jå¢=>R dtš¿¾^ۄ@·‡¨Å5œ[ûTmK"OÕtûK»¬P=Ë3ú2‰—8o`/¯|UF§u…<~†ërKþý¨wS‰W|¾/¢¼wŒzÿÞ×wlû­ãY“²«j,»ƒ10ü븺rAWq}¸ $Ýû훞JàÄHáo!…iõ{çñçHaír'…€´(±Ý+^ÌW°‚Í6žt‡/¬ÀÐ0K¶aåÆfeÝI|“QY—Ò9SêñB]f~qÒu2õbä=è?ÊûÕìD µ Îå*n&+Õ?´[ʉÁ!T¨O2£üøø(ñÂÈ¿&n;¦ªVLñieGT›@öØk-Æ9Ú×.€â]úbª”=ýœm8>ûpwú[9øý¦ÌS‰ÿý1ÔÿâÚ͘.ÿ#iþ.öÚÝL%Mû–fºß/éy½®aPÔ»k¸ÑååíP1]ªX–ÍòqtKÚã’1&{ÛM¨¼@‹ƒ–/o5CÆzM×1Å}¨ AW2¶ü>®Àž½\ÁË¥«©`œ ¹Õ~×S vêò÷P­9C½ðú7ûՎeǎÃòYÅÝ@÷õ×zœ¼Àoÿ饪ºÝžã œ9énéCQ$ævë)F²£ë5ÃSxŒÛ–î¿ýòºV«c¸öß=ÅeÁ5#,|½Ûÿì)Fê~Žò¯ôü–L+H„´eöp͙N€™æþ„ædmñ³¼ŸT.2s!†²IEõQ¥šø†fÜ +èË „Ì+ óQQùh‹+V/Êʬöø'qgÀÖ*HxBç4c²›øÝΔV(ú^‡ìG¿DšY PLlç£ÍÉ +ŠÒA’#ÆAUš_}@gNµFídDog;øã$3ôá‹ÙÃÍÿ#² á=²¯_—¾C¹…­×1›Àž,0׌ Õ~­?p‡õþáu-Ý1»7¿¢:N¿&„q¯wÓ߃z¹œw™_‹‹· y}Eµ;ju +£¯Ð34Q˜5 ÃT<לØL\É(¹£=Ó(gޑ¶ß3ïbGrCÔxª%DŽƒ²­1 /—ó¥ Í"@0~ˆ©š9Š•3…Ìÿ2FȈĬJ˜(=òŒTc8êØüu8ù÷RÆ=œn¿0×[°h`ÝÃÉ™í>Ãë@¹­?0Âéüðº–F´œÍO8íÓ¯ aÜëÝô·p²R÷W¤ü!‘âyâ—g¦ÿ†<­ßåñ†Ô,>½[h–‡–:–b +Q’(Y5í,[´…ò€¨S7ý"=œìGÌ­W8>r…(ԊŸ½Ú¥eãïkg¯‹~Z¶¿aù‡Â²øÓV?°Âì¸÷´@¨_èÉ{.½6ʒ€GûB@]丁5£Ó%Ό&–£œûw¸Ì®–3æ?q÷ÂW„;îöŽÏü¼…ý;¶RóãüÀnoéœC!7¼X> Âà;–~}²Lñ3¶û$~|îÒ>++/”é@n\ÑíÅ®£ åòmG>qͅZý„d`Qå©n©*þ3Vh¬½0 hŸS½\ç7”Î.ãfYKƙà‚47J{Aú.«çÔDûV†Ë‚š̘àI.ۓÅÿ%…""Â(€[Yf2”¿ E¼Æ½N1e…|ÏXŒ¹W)5Z=y‡&Y’qÑ̗ÅX-uÑhØPs3™GÖÇٌŸ½j/ün +DÓd2yÙ®ðkO¸1.‚O4@«wÕòÄ}=Z=:…<*ô˜ÚEÑv`PŽ w,Qãv·Îãk›loP/2õèHãÄt@¤á! +¼1T•º\—×ôožH>½Ê÷àº¹vIÖ×{Ÿ6yf› UÇH/à9Ê¹[ÇÜ9áNb¿ÈöLÒìþü7 }ŠwZ†¢ÃæJð1BʈZ,ÆÍX‘R°æ¥ÚÍp ‹ÿ<(z¯jâºX´äT‚ÖÁ0l*헨*µèÕAÍðŒÕ ØÊ¥­èYÔbõ î èÌvû(Ÿy\”ñz8ðË.§ÄXõ¬nÅ áö†à…CBx™öčxl]çx«ïUQf1Ä%Õb ~¼X¤Gâ(Á´Wœb]ëØÕüý< +¥S—yµŽ+ +b¥«3‹EïNW%KJó±ÿ,7ã€$NäO~cå¶î«ƒ½/«©‘-=ÒíÁ– ib6wŸ!Å’,Ś•éÏȂ–7tâ¡ZÃF{X0 „ Tà›ä)ì,`|ÚcŒ„ÇÛ õè FM[®®¨)P•9~q Æx¦>k ¿Eƒ}Ô_dDÕdÑ'LÀLêgA÷¢)+,­R֋ÕÍCWÌE-1š¨ú¥«~¨+ÁëØ07—²!ÓJã[_{Rtð6|úhÏb¹mõê\FI‡šÄ1óR@_܄Ò÷¤9~œXbeïˆlѤҁÓ^tè§/Ûôƒ¡{8ó`æhƒg´¡À-ýqºX£±Ø#•: Ì@é ¾Cß XÈzFÔ=öœ•u$Ùdz.u°Abô¥I'©Ì%>v¢˜ßßvkûmLÕF>ûR$¤êð+ø.՜»­?ÔG›©"!}?—º’â•-'¯l 5㵬ï1 +]¡†Õ—V¢7k%*UµØj¤Bý]ºK¡.T3Û3‹hH¨,†ê2°SšZ“Ev5¾¦š‰€Îƒ“5ú¾·†½ùô!Hµº`Üå—Ê"ݺÂ5vCh4ôC±Í®+àœ¢²â‘mž!$?+NB¼¶Dѯ!G­q‡(ÇmäRµ¢Â\YÆVÆ~TÝò·²÷Üʸ¹÷K¨òæ Iý´ZŒU¦W Â"Ð\l²kª>LU7™ ?5Õ»ºPtàÅÂ&ÍÏ(×¾ï÷2F…×ÐVÎؚîe<— D Õ9m¨ûÛ°Üöíj·ˆ}#RScD¨J4ÅXyE^ø»M‹¾3ÉLm`ä:4ì/˜©u§#/µþ@ë#H¥Ä‡BŒd&¢S$ª½!Ñ÷9¢Üצ² +M€^B1…¿œ‚8V¨ðÌs#Vç)N°h™{vˆ•ÇdÔQjxƒ×²©¥ÀŸi1÷¬Y 侘†NËW3ÎZo±/Ã{Ås¦+¡Ë€Ñy@‰¯»P†+ý“ÓZ!ßóõ͔ä©ÿ⺗› +uæIj³G’ÊÍQõ2z@<‘¯ S$ւ©š@òIeC÷ƒ±ÉH×xdù H…νTÒW…œSnò19iñM3•e®9Ɣ\,‚³Ö¨.ØØ/,7Rcš•W e;:U¶Aà•ô‰ÄR†¼?ðb®}â gš±±ÆŒv«ç :V´BõŒ¼‰Ô.Uh£‡~ôp1:@®›ŒÕèFgd S´"z°ƒ!€z'aq ”º¡?£*ÄÆ÷!ÐüYšóQš¾ð‘ƒ/zy‚—{"÷T1Ɔ.+¿%*ÊPßjé‰.ßîŽâM|€¸÷ ¢*»k“覶Nm¥z¿¾­Á´XìX¤³(8ò’¬¨ÊZ„:]‘ÆÊReõ ˜hÍ6L‡ò¾óð0>ôWíå¡¿ÒgˆÄÊ´ÎÜ1[ à’0÷·ÌºĊ-ž÷ôRå¥`ã¿MÓã·!bP™°{®p‰DGáUÙ=c ¾7¥YÀ¼˜ÅJr–?Ô~œ-”møó?—Ì¢Œó«»§¼ô0k C+·&™f)_¨|W’Ñ }4a|1Ÿ +0B‰KÏ­V¶6DãÊlç«<–Aw÷}}?iþ=…7Ìî +OP‚áCteüqë8\w+<§ ô…D"§ÝÝS_±ZVgÿZ6O?Ô¼<ÐÙT |c”¤UU°Áþ¾¥*—³¯—Ä€“ÿGû¤Q2‰°ZþLœN›ÚÁ#-‚6‡{Q ©V³Û裻=’Ýéòæh2J&Ÿ·‚¨¢Ö®˜(ˆufÿe¿JrkInà¾O¡ <#çá<z!m|ÿ…dVÕ2ІÝ;m¤Œ—•™d0Ø¢àu–&w“ s7à£u¬i^[©Û¹Ã}{(hm¿ž]=tø1,]÷W«Kyk¥Ï²ÈbâÑøBl¢Ò€\n“|3G#)ï P—þáðuاHè®ÄpFµvDÒFŒÙ­§BÅ[Ý´™ªp_3X¯6Wð¸)ÏO³%ŠZ¦<é‹yœ)\x6´šÏIDR„€”½Ç =k°GË©z ×/Nµ&l$™õ}-ÑtÊ>c/Q@M‰]YVÒÒ]ëETý ‹^í.'R~âžè¼Ùx<”ìõo–ƒh“ÉgåEg݇‹Åé£Y˜Aºl‡¸õKúä_ÿä|2Ešƒ(¿¿Lów°Í—±'p;è¿ïs?ægϏõq‚VÄ/՞ý¾C6£®2M¾ß æㆱþn,¿åD³ÀMv1¹À8åÆdHHÕ2¾Ù•šÞR\*µ…2£t5$ƒŠ¬U.¡@ZU5@¹Ä Eý‘ +낉kÍ¡a’)Ë[ó1eyߎ’XÙÎÞ=Þ;Ys{~/¾QI[ö(Æ;umóê£|ƒ Ú*{…Â>Qc˜Øñ^DÍ,Àü^lH +ÚÁ-F/¹²Õ¡k ÈÍɎ„‰‰4‹1†e\ù×ñkV§»FÅÏüú%BZï|З Õ˜L*DkwÌb»[5($KVƒB!¥Æ©7–¿–ø61dÿ³vÀôáŒû­RîÓL6zªkÙQ}=»:- vM‰b|Îê@MmÀ9».®pæÅBx‹ñ tuŒý^!ý0Ç) + Š½%ú–öLxážÊu?n7êvhoS«/ÒØ_¬’ÒAÆþ½ûûº­ÅI1dͅ~µwÿn‹¨°e¢o­»’5U8ò<ÙÿD/Qø ´:ãÍZ“€"½ïÛÜn@ö¾d){‹.SsáCME­×MK?4²kÀ2éN1¿ûþý-T]þ ©¿)¤Æ0Zoù¯”Ä[A 8º„!ûޜÇ)(òQQŒÅÚx–}s${¦Dê· >ç–&OªU¶)„ÏɔZôC¨;{µ/™{„R¯EÍ@ñúoj†õ V-sVÆÕXH+bnœ(ÐæãÙÌäÅ/±ßhªB“µv«„ Qxq* U'‘×g*HþðHÌÚ}K>mlpKbƒ›M„´ØiâúÊö¡BåPÁቱ2%º²•n½ ëÅϖ·» +t݈£Â¬‚É7°_b,ù‰…¾åj³CRfÃŽ¥P²Ï˜ç "-õâãâ²Hè¥JŠDKý ÓI§ÏØòŽ»×ÆãÓÞ·³¤*4晕٠揇‹ßcÃzŠaþýQ¶?ÊöGÙþ(Ûÿ]ÙN$¯å%Í'£˜ ×¼egRJŽÀ )Ÿ³€ž+˜[býIqËBSÌg_ùÈ±ç› Ð]xPAg\¢Õìc”¹è%ýv@¦6¯Š¿‘ãσ!w¤fõ€N͐Ž¤¸÷Á¸Ø’ÆÜ̘$K ‘pŸœ§"¡yH«<ö*0£Hã”@¡t›”Ï,êêüx8ð÷7œÛ"ÑWç°;à•¯7„à”øH(¯Y{ÂbEÎ>sÉ#V xåÇFª\` ~¼HàE!æR¬8ú¡µÍ †%ü Õ ŸÎõZ›WøJR™iì4ИVµïCÐõv¹&¡“bÖOô•q»w/؋²»Mw¥›ƒ}£¤xâÐص1¹›ÆåœUÒ¼IHî@Uþ©7@(#Šlfú ré¢u£fQû›}/&«…ŒÕ©Z›Ñ¦]—HڒCªAÈíUÇïˆ&¬ºn#£šÅDJ×ðÏ·óÁ>¸@A¶¡ »ºš<¢¦bKt7œø­%¤7ꐫOŽ©¤·cˆM/8uó/?AÒ©…•|&é‡]OÅ+€–‰æ*Þºd¤“ägñtXi«ya/׀ý3ð’­n÷Ñ?‚n-(ì”8³•ËRj¼ ”:¢G¶0hõ¡ääâÁ^®¹,VI£~Íö*ÖÈÕ2Ù/=è-$ò>T9„E3ð ¼5c–8ƵÁH…ý“ÓàKÜLY‘“ù¦|Ñdâ“Ô©îƒÏÏw®(Ìu ªâέ|.:/ç}Àhã¡RŠÔœy¸ã »´jZÛ¹zfGRÂÈÅKòã+jäÌƵEriÈ2i4ù,Ÿ9?ÿÈ;ª-un—Û +kççÁ&/gu:Aÿø-µšõ%!µ–ÑÈ(Ï^`KX7SÉá[±JZ1Wøï(¼A©[µˆýr˜)}Hšëòqa'À®/oGF$QT¨k¦ZʜU¹¢ ƒpxTøp¬ÊãÈzAu}…Ÿ`ç{5–ÜPˆIùdV©ÎdãRO׈۸8ƒÓ(>Y—T=[á&»Ÿr$ $µÍYyÌ^YEðrß[jvÛÖ8‘äY¶D‘˜æ Á?ðQb9r1£{â‹ú:Ïǖtºdñ7tžõ°}ÇÙÉ>ž?ßvl{-ëÂR*©Á? +È´rÍ%v´yIN2óø{äQ[ÆðÅTuÀQÝIÑ~ñ®“B⩕(‰£_ WOMÀH‘Ì#Ðæ-És Äí²…ðY[2OrÒCO¨›ÿðr Ë»+ìÓ³ìUw\»›ýLæPïc¼ísÅp‰×布’è—_’Ð5{Ü\µÃñ¨ËI@ö»9BχϦÒ},F&…ªÕu°¸¤ÓT›èf)©Ÿd„ZT¶ý5šX?™#ÕâîgVáÆSþxÄö]Œ’Q¥“%}JðŒm6Á°öI"÷a [ÿ$$½·ù„ñÜnE`꘴-`´J˜£úÀyX ¸l ádzj!MYq¥Ÿ¾É~ÎäMäŸE§0‰`+X£Õ‚˜ÕÐyM»ÅI¸ëà&q–OÙí“0 ^§Su¨;`1çŸýÈ°ãÎ6þU­ÿWÕ²{ÛÃ6[3Ø­ßÉS^fz6Y»ÉÚ²wlx­L³·l³Õ„u¤)whDX4@êñà#ð y/ÿm– +@o½{¾ NU¦{ ý¿ÁBé<0óãê Ñ4ÐI;âPë²êý·‹NÌ¡$ț xèOãóz•]©èïÀ}6zí±=Úº¨·_K×ð݇-sVmFKFJ¦§zƒÏ?²›) H¢Ñ>Ne 佔;S:æ¹W¤cdÙÌÆÑKB³’äÏH•Ð<¶ŸÙòóOÀc?ÐdØ; +p©ÄmÇDëÕ“%"ÀoC}NÒÀv HXAî 2ãpûÑɍmB3fd’djâr5OÙgì&à'̀Ceµ×êÚµ²¤­?a"åÕî& ¯¼ãž¼);žïú筕úÂO/&ŸU±2çGˆUÑ£YšÙúš¶ÑRó][…¡Ëúç/Î'«n”yÚÕ.æþKµJàìåÀÍÔ¸ô›Ï÷¹ó³çÇúÀø‚VèËÂë ø½œ/éyíàš×¯õ÷3àä÷ +Öm—A½3 +2©Ru}³«4ÝÐt·WÄ¢ÂÇQ%˜¨!¢X!Kª\B/˜ psu´ȹo¥°.˜¸ÖÒ¹3M2 +g·æc˜ˆÚ÷GôdeûöîqßùˆÚíúI%1|÷Û’¶æÀ°+æ‘k$ÃVßP>ñËíÓÖ\ï?àÃy}M1ŧu–O›ï…5 .E^rÒ;•°’så˜3©+V 8wa#!?4å‘Ü]à}Ÿa/>Oÿ@ƒ‹ ‚FÄ‹gK»å9S¹öÀ× :M@EE‹4–Ad¬2é̟wÇmˆ§Ýjÿ8tDž¾µ·e^¸ÿýoýüoõ3*¼šñX¦·àî+-Oó…Í7„ÿâsÐ&ê‡ R£mÿòVì‰âI´û…ôúxòŽ>Õ„Ý :@;{—•Œ¦”cÆ©Ô3ÓÕ3&WiÄÏ­®°‘ Σ¨¹m4#“=oߢTL´eýØaÌmΰ›\Ö´Ì>œŽ‰²òm$6ºÙÓÛv Ýg®Ò¸ú*/VZ›è,è&ÂrÙ¶iŠ¹+NÉ·6£æ1T£©¼ì6¯íð}u.‡(¦ì‹4ö¢oY}ŽœÄ”£—=ò͵å=¾³þE_»{Ç׺¶Ê>¥{€‘3•=®È¿“?»ZÊ9ðýµ˜³àz¼ãÄzT E¥Ó²Ëß0/†rE\mÙ2rÌه{•išW¬s&s+×?<ù摻š ºøñ©·°3bÌ·¢6ÕÎ%x_ðeU&¶ÚôX#;졍U&Wm"ÛÔÉo^“è©®q¸Ð64™ÖÁ«ê•-€>~ 2÷!=r¿røoî?#*ÈyOHW4ꙵã.IAa«ú»Ö‘•ïnÃÒ~Ôao7aPÝC~a¸±écKšÕE#DNOÛ¡&:<ýçe#A¿&R­}®r›uLêÜuYëzò…õ4ñØå…-uY×HÈö›š#ótücgÇi„"8Mï$Ÿ< +.å“‘=ãÃïxNr)Âi]Ñz™²¦Š‰’Y"qÞd-åãdušË#‹ª˜’ö¿ieJçC{;y®žR /^.pIPý¨=€ÞŽctj·NÕà,PS‹Ú8CÕé<øë`'.cÚFðNÇéHþjŒ-²™ZFðoU!à.™Ü¤¯ÞmŠ8†xpª.jàÌuM*f–³¢Ñ+€/³ÔŒš®p®çš–I"u…P¸£ˆR?ç^1g[Xö’øøÖÉreºÏ-1]çuŽ\–jàk’ ”ÞN³[e 9¬ ÷Y†tq°šHˆ»t¿¨Aý”}ž¶(-±}—Gnê-'[¢+¥fͽ}Ül‘'“  ‹ºýãÐr ñ€p/ŽýͶ×>ÇSÆ5ºÆ<§òžl¯èÀ(!¤V!JÉ+«éçMDžCˆ,Wá=­¦šý†Ê9Š¼Ô\5JìS¼áKÈW§áßѧ&n.ʟ9yBpH +ƇÒkÌv¥/ÕásÈŒ3…cPÀ\Ȍm|*ôuP^A¥²òJôË+G;beóîL ¬ý˜ûæj·\º²êÌ2‹²ØêYYîPØ%bV­NWn,Ý +‘%^dœã.NáÊs+,%!¦S¯90Î×ó™¶CìC¥>ÞI¬déÊ`d(SÿÕÃýr¬$ÂQ8s’ÑÙùÊÌ7¡ Ù´ë¯ƒŒSžmDêåt_O6®ÎL.݋"3$;@œ˜e‚… „ŸZýÚ¯4Ï·¬`vû†\OiÆ.èv§ ”ÏtV“ªØ^–¨$SgŠk´¢B‰IÄTû¡mmÓèÚVšö›»œaXÚÏœ'§ôv‡¥S̤/µ#×{)°§î\s»]`È"£ ðàì|ÉȺ¨!GH4Š +±ášH¸T±u¦x}ÿ|ænŒÑìaœ¹ÏYŸb&g¯4xû¢‘I²Üâ`¼½r(~§(Š${%ýTə×~fÏi°òXsÔ0βſ‰R炜+[ƒ*׸ul°U‰Æ2ÛÂdzîѶ ðÛPZŸ³·4µ@jž°èÐ8<§M¥8€pjd:XÎ|/+gáX“}æ^g×µ“+ BÜ,RèÓI¯xå÷ÔÕɨ§Øûöo–ƒD#2EI”ä«fΏ¿sÃt1™Î 7VùI$yMídöù†­Ò{°x ‹P3k®ãÁ^=Qûðõ#¶rðçHM“Z³ŠÿÿêÿcífJ—ÿzš?¥^»[gFOcƒVםy¸¤ó‚½nbPÕ»›´¤Ëåã°1Ý«X–ÍòvŒKÚãò1f}ÛÍ©¼@ãAËDƒ5ÃÇ6œndŠ7£îdÝÊØò;šG\{¹ÈË¥k(2΄Üj¿j,ð-Õi,®Ôðûzµ À«ô[c1S>­ˆÞ°žó6C`wý÷Ð\¨m¸–ˆÆâÚÄõFìZ3øûIfé#ïÎîiۜ¿f÷d-¼±;~nÚ÷õF]«dy=ȽXb®7|ûõ½ÃCíƒÅËø:xó_Ìö \/Ć5Áã¯ÄÞfëÍî›RüX–âb¶kMu ³ÏÏ°ÕM¹¨LÈ¢å†qcÍ,Í$Sî(ÞÌ´5¯HÓǛwÓ£Bµž®Éî2¡Ð |kLá+õ<éSo€ß¥…ô]MËyÍþN:§Û  cQEL´ eyº‘Rõlý’Rö¸Öy£ÔùÁ)a¸Ý“!ûN)ûeõûV êí{‡A© “çkg̙ÿP*6p½Ž nx¡Tž({ Ë2,–+vx&üoXåÙÇÝ*¤±×Gvÿò0ÄrÊr/BnPí«ƒL{ÌKØãVõêæeä]›m‰ޅãc]ˆÜ¹ØÚ»_>Z{ü}mõÑV³úò—–†–Õ®¶ÍLjeÝ<Òé‡PÇРm6`ºn”&u‘yÆ3p@-弁½¼í%.¤kR)ã+\×Pÿéï?ñ°êW…÷ŠÏû%\þ+ε=Þ÷õÛ~ëxà”È…ÒqM­2©:­/²ŽëQ.tA3Â'§ôþ™ÞÕ¢ŽòK‹Ú¬ÊÝèmmFS;ÝÙ´³"À|¡ ÂH!XY9F®£¾U»‹å_h¬¹ðP¬Ó¬f—”Î!ãdEËúšƒ´¥ø }ÅÁfIµÐ˙›Éл4&DŠ‡ÃŽ$W± €IT#2½ h`¯;`¡DٝÐÍk<ڒT6øø2‚53ùýF>'ÏQФ´ðf1V?GsA4;æŸ4ßÌæY4ÂryùÏV¹7~Ï—*œÓb2YoˆëH81‚G܀¾NœUŸ'Îkl5v ++a¼wÔýÞ*~ÀÌkk¬ ÃìypùÖûŒB=Ò81À \DE4¦ÊÒPèÊÀØåó̲ɧ[ùšæ¡ÛPÃVL^¶Å5ûê(;™ò¡xWv—xfa+r‚0%ÿ¢Ü3I ]œ`þ!Ýé1ò~“ (Áçr?‹M´š}l¡(^Ù2KRê–òU¼Iߑ㏃A@é{S77¤¢µR ÚccKi¿%U®¨U·iFdrsmü´W]‹z­á€Á췇Š™ñ¢Î·G?ÝᮨÓpѨº–ë¡¢lö¬9qb.ÛöyÝñ•€×Y qH5‰ø?^¬2$¾”`Š/NµnmF¹Æ°Dœg¥wjóÚ^kóbiö,ûGGË«’%+„÷1ÿª·Íɝ(ž|ê+ú—±»Ï^V2Ʀ‘\ª[€Sõ9!sýu\3Ïlö͚=†Ù/¼Z}Êcȉ2;é »{< +/•=UG¹óHä­cÙü?ÚñÆVóŒ +gb þëadú:Ý|ÚoûóгéÝ·Æä“hµ'wÄÍ6ÙÎE5âí‡lôµS1£ìXäçÁF´ÊEÐø"0ò&™;oy{x ë*2:HšÚ{˒°(B.d/Ž­teíhåº?¢ìî09÷ö1vǨ¶A5±ÔŠÄ¢| Í%ˆ¹(©N¹!VÔWÔï 䰁ˆZÁ¦é‘Ï\©_ ôHh²I²a~åù¨ÜW{빛齙ØM¼eÏ3Ͻ‡Q5*ː4ÐÞ6†‚uH|ý—g5Æ +~|;FBÁ†tçíj2UÜnW7ÓP- Ô-w™Qv}¶kol ³®àYW“smèmy3Ck; O–­‚¶ÈHÌ(,¼höÑÇÆëåbÉ\ m`þʜŸ0ú¦p0ƒViÁÃT‚Òš³}!oé,9ë”.Ð]µà=NáøsWg=Œ…kÛÕ³OƁgoîå/65ªSb‡4êº@býqè +-{Vé&o\“ëÕ,ã6}e&äóÀPÃ}Ü`VW™ºC5t‚W€» +mʲgÞÈ:0Šv`¿=Ãû)çܨ‘9Ÿv¾ƒ¥R‹"`m®­BæŘ ÆàkJÕQuώ{1'`dëP‰Aƒì’7ÿfe /¸d>vc5WlZ›p#+cBûÀÒüMˆÖj Üa^xŽ¦Á$„W¼”c›ÙbÇcÑ2峗-RBH²`Ÿ"Ýéþë¦mçÔmúØvÆ:¨6h^cב'æTST'—^]Á(˜onhL)ÅǙ~úý›P‚6ÕquO­Àr=Ÿg'×:í[8³ž¦MƒbOxµÐ¶ïÃΚßþýŸWs1½Ø†œúý—mÚ<ívz©´¢íƒ8ðû7ü²¬ë¼ÞØLÙk† ·¤/â»ù”ß®ìLæð¯5„ß¿]»ˆ7b—1Ãó8ýñYf5£g GëûÅ.³kJln1&WÄæ†[oKý-.o“$}T^Ø£+£É=W95mÎRšÁ)„KÈ.†UtL “tDâÚA¼ ³–ªÓÊv8òMöîJUe+Kwõ)…ÐNSi>öÆ6‡ êwì §DÙu˜¢ïùª¹}ÚчüDËéÞ\’ 2 +N^i‹Îf2Y¸pӐ©‚ö³£²áu^hâÆ ù¦“H‹Zҕ™©?ֆ9·7ú>º5s(šÝkš§ÅFTÜQ·£Lk_YڍIóÞmÃBÞۄø6¾³Ì ì/¢^å‰Ç…?ï²æój n4Sp!8töÖc˜ÒЩ „Î 4´–qy¥#»JIjÁäÞ¦Óó*8Ý +,‚ßzõ±ê/x„òaѳÝËqfQæT¼užYñû}MŽa•³[²õŒn³ä;9 +Õï?ìW;¶Õ0 ìYÅÛَe§æP² + +ö_33’’›÷`ªë¹I,[ߙ`%&Ê«æ^Ӈ…´"Ö´=æ¸JfCSÃßúKäIÐ4]w#ùf 8˜(„daXf¬‡¢ØŒ¥7•³U +Á·¢=ÙÝ©´‚oÚT‹8“ñMq|Ä£ÕΌ®V&ñçmŸD]÷؍®Å•ÛÌ A’+ìPLSÉÚzÖCûØZÁBZ7fãÿÙÿ¯ÏþרC •R ÌÑ÷sü­~Fi„Äð:+Ò/Îî,FëÇU+AwŸ¨Þ„Æ|‡ÊD¼ùDv­ØGL½Ï‚ãKH²W%ø‘rêz¶O9èô­Þ.‘pZ ²}Ž­2Œú`×L?ëµf²Mj!£™±ÿâލáIÑÊ<Ûí_øqH ÅÛ ÙoRŠÃS­²¾òYON]b§,B´ªsPTu‰VA|´$Ü\­ÜC3D§&Ð-ÌÅâ›Xó\1áqóè¬ôžÈÊ0‘ óTÇö’Ncêض‹uð8Ü­\ÏÃ[KsCÊÖMß±dxÎvð V%Ó-ÐÜÚ´#Ÿƒðv!Žƒ¼ž†Ç˜&ýíᾏDp„$Oîwqÿžiy õV2UÁ5_!›YÊÒÈ)ÜpròÄ:Ö¬í~¬D¨sœ=›ãÁ¼•Ï9=:>¢4"¾YhÏçµÛþÂb´Ñc´ÛZµFh4"éÿõ L¹ùؓº&DƒYƒæy¹Ã ŽPí äŽ ÅwÈ3\¢‹€É TÆFÄâìmö ´=Š»rÄõ> endobj 273 0 obj <>stream +8;Z]"9+$>+&4Ekt*q&kg\W2P6%@tfjs,44hGTgeXf,VQMQ.dJ8?BbNn+:9ET"oDkUKTe7e8 +auEI.ZSO_'g-a`h0T-a&4-XGKFgIXGl6#YZK1?NnWt"_cJrQU:Tt endstream endobj 268 0 obj <>stream +H‰ìWKŽd¹ Üç)Þ2[ԇ·n^†á…P°=€«÷ýGõ²2sjvcÀ‹F•âӏ"ƒdðË_¾_þüµøã×ãòåëßÊñöý°ãøþöóå˟ þëû¥åX½#üøÏ?.ÿ¼ü‚Oøñº¿þýøY ù÷ïË/8ƒ#;z½E”ÊßѬoß´ìÛ¥ÞºÇQoVãh·Þþ{]{ÜoÑçñvIiÜ֘Xk~î‡ÝbÄ¿]ìÖê)•Ût mN [Ç^<éZn¥a¢”y¼_ÊmTn<Êú1oE7‹=æÝ÷¥Ô±™w×zŽ¡¡/¬J zâ…ž‹º•ÀåaüoÅRÔ¦gÓÐùzÛCÔp„÷-@ç†gBݏáOpÀ_ ñK,7I,_LF«Qž°[Z®]NIÂ9a´ªh Ýà·#Ó t˜p7ÓúdÎ"‘ðÂuò:ÖåN€BŠJ fê^{•Q5-ƒŒlaéåm*ctf|‹™n«¬M–j–ãÂ% ò]lPY Ìs5¸½7eó¨’Ìåmªð¸Lzmf‹?«£µAŽuµP1•dÒáªTá WyQcô²A§B⾖O ¯Š Õá9`(1ÃZY>ç&ÉýÂ!À¿éHœ¬„ûdm ¦>¡íAa“ÁŽ…Sä +>Çã Sñ‰]µSˆîybò–`ŠÛÆ*Ì5èfäâꯅ¬„Þøi€MÀVöiji8jªô5¾¦=P§«á`&2#%‚? O¢¹±L1B;g ¥„ò0ßuàE‡‡ &ÖPPz}‹Ð’Qý˜'Ž{ŠìŠpÙE’¹ >ˆÄáCG­5E‡ðä:rùRÖ@ÀÙètv­ »Fx¿åÑLåÕI–µp,™ËÙRìj»xzz(-Ûò˜¯ø…n¨¡mÒ½óíüÒ½ë8žÒ$º§(?[žÊ]0 3`¯ÉZ3 ™xl˜]͒4Â%Ì$™à0Gžg“Û?ZL7"·í- ¸…ۍé †ò¡hªBå:ɎƒšBjKaéÀ.'VV¢îl?]1×ƺ‹B"X³¯"®©Ú fÒìP HEŒˆÁ3èvV¡Ö[žé”®æù¢ã>Ô²x£†Ò\CHÀŸxW8€Î8'H[ýëÈ]fxP]A®Xg#üZ ·Nžýʖô#Ž±?cÐ⹯Á`ðO9°öÓÄó®×CŸ®¼k’O(Ì +éƒJ‚þ¶ïWfªÆڊ0»ø¡ê9ѹù +†øFpûÓÄÓ¦×#Ÿo|Vç®è«Ù;HÐûùDëUȍUÝTk„•"ÿ2ݐd‹'Íq—ÑŠTb±ƒ]½ PØн~¸"±ŒfڃÄùä ò×xøP’Lٙ9Ç®l“i·³@ ‚"¾Š]Á u°ž`½bΠz¦°xõäÍsGBÃ*|`¡hˆ2âF‘\·»4_«ðÀ­&t¢³“_w¶éwR´I J”LzÄ´8H®K=φñgK^ U +4ˆ=¶æ¨¬Ø=ºmÍ€âËå¬8“T6—;4§8t:Ì )Ѕ4|là×ÁLH&u±¢&KÅÈá |oÌÕN;(„‚}DòdR‘Zœ%ÛèAòË«7¶–µˆ°ˆö°2à=ët?%?XÎb¯Ë<%­9¶÷M8dãDä¸@M×;YnP´h[푠W?¥÷Ó\xr˜Àó,»Ÿy°p5òîåAY Eo²H'fe´•ìº« jHiŠKÆ]7ø”ßTë&8çÉ{Y–)l.Ò?ܳ#˜=;¹êª&;“ SÈN(l¸jˆÈLu›L?l'Úopc$l¤Ñäó)w±ñ$±$ߺ±µ=àÆÇÎOäšûb;WÙ=YWò ÔUÆ#ÒmÌDd°ƒÛÅa¢íAÌԐœÖõ[zò„'á!5³¡l¬›z­‚œœ¶GdÃÖ“ÃË`ï°e0!¢ÜWr­ )¥Øá2ȶS E+؃¥ÁèfDÓ*:`×و\‡£0[ ò{¼$Ø­öäûH$I($òÿ²_åHrÜ@Ðç+øQ…û= EÈ ýßP@OïÌR·)gµèF…¬Ì,l¡å€ ðºÖ–û`sp'wŒø,³Á0ó.XhÚ~YuÕpN,‘.¸€}°§©N0ë‚&ÞEV ÄÀhàM®™ì‹Žå¾†Øg†ÝÃâ•.tþª•,Ë[Kîh'ψn³oÄ–Ø=û]ê=1ÁE¦Þ3ëÉ?­Tý$¡9gaiEVC«$S$5ÉFÌ»\ʲãd +ì–ð(`ÈÎDvµf~PÄ«¬XË´æ³Ò¦±ûÄð¹’ës/½Õk†-dVeâ?m~uφkB8ϻեû.‘¸å‡DÝø-Z‘n½„Y[}F{.B¾¹ò@_‹²ág Jóê3! ´ºT¢, xÌ#Üø™ÀŠ`M_$o¬s"1 Å2_\éGâåFAåÓW˜ûÜáw†eiA¤ ¡[›—ð:bzm­Zޛ“°Œ›‚Dþö3º]4X¿÷¡!†K½YIÜøBN5ŠjóÁk›M­–Ã* õi ò܉‚]Ûە=ä~q ´bM~þ×/ULû¨ò¨UÀ g?ƒPçƒöÓ!Ð7]OÚV)ÌÚ VU‘ü°dµV¸€úÕ÷¶EMãoJé,;ü~Š½1¦é­ÏzµN°T=™ß¾æ­¤@5©‚]y/£Ž{I¾¹§P-Q·yþ`,‰¸“ªQ÷X{J§,(^e—‰ÌT}nU)ÈFñLâ™P]’J®hÓ+Bö +< +IÜtÌñ·‚RkæVèÓuÏB¥²“1nÁtW–Í#ïðxÈB:©Ìõ_ùÚ͆x¿j5³ÉÃþ&©Az?ÁùìÊ¿zŸŸš¸Ÿ9(}ìRtgOF ìƒV¡V1 %5©‘#Rö~–ɦK¢ +Šh¾n¶Yj'ÙqEѕ@©ø¸üô°µ(ü–µ¶v(0ð’’Ë —jٝ¦[ì.o‡Å·ó‹ž4-ÑAb§ÁVJWÆfvG<ïÑû;1ãÒͨK©»Ë%²\IKl^¬ɭj–º“µKÓÂSô¨|5MU•üœâ·:7Ýñ ¡ao&ºë™b¾ÊÒìùďíñ©ˆ+ÂñÑ'É~ó˜¨È.؂~cÊí=1‘b©!âß\‹œ9˜Zt¤)©+£Ö‰ÅuS.”Äö²lÏÌXÃ/ØPž•Îeó`Z_ß±·Nÿ1Mt-¿îzOØ%œ¿Ð]Lx]jšSVÙÚ*ÀåÖ÷X@hkG¤ªÊÇòaa¼‡›‚Ÿj—Eî;µÏ˜õ¤»RüäðUÐ£U8­Ó–le__9ú®˜'!Õª+˜Eµu†ª¬ÑNˆ ‰)ó‰C&ûÌì ;ÑzÉiq‹B Ö­‹ÚV;î,‰É\Lo˜2ØòÞ¼ú9<¥ÇZW'PUeêÚà†Æ äBR?!ÐXånk—áó‡’1ô°&»¼E‰#ÌD*ìœB۝¦H†‡áïmى`.´¹7ËÆõè¬(2WmÜâŠSé« eGEÎxÕ]Y•÷îïò±åe¼E܇øYE_höi¯1Ì·ŽqbîHvt(¡‹ÙhÎ]›‚ÙÝyi,çÒé9|O—d‹(oÓ~ìgÛýìø«~¶ü¹ŸÍ/~6>ó³§Ýý×~¶¾ûÙòÑϖÏüìøS?+VoùØÙ.;»^ìlØÎÎÿíìegãïÚٌ»Üu~ù¾ó)qó‡Ìvk·Ø:ÌmùiŠqVÊÊj>B&àóI÷ÐÒ8f•;žÎÈÉ×yI•oÙV½d?9õ¢j¡¨6ø3Ë-jæ!ÇÉäÁní6䤽óŽ]ˆ*ÑÕ2E¤æ&ÝøF"ë„9ˆÍ{ ruÒXpw¤o'žhÏò%•ô ~-n‚¶{¨sœÈpžqb$vÈ#GS×4ÕLe0˦ªÛRÑeäàˆábd½jb_À¼_Ñ»• 6bP¹\H[åwr‡ +Ñæ/Æ-˜iCW1¥J·;bÁ¥g%ïׁ á´59óšÌMÓ"­]+§Þ¿¾|ö¾¥³Ï'ß4Èɬqôpk§Üü‹t68øÌoþ@Ê¿W ùQú‹]Þ‚3ßãÿL€âE€úÐüËô;éՎAÃúœ"GÌÇÔy)s“ÍýÛXæm’*/ՌfÆÈÒüހêŸÐoø܀Æsjÿn@ öú¯xPÂóÇù6ÚµJ1mˆÃý¿È_‚0Àԕö®’^ŽÎ¬QF‚ýþ²öÔXS»‘™}怲š:^yu@û•ý7x~ry êjŒ:úeÓC̖„r±,é n¢Št;b·òð–­‹™ISªÑÃzÒ®¼cf×p£yÉW:×uaS‰;nl~ù.~C–„Âœm¦Æ #èÌq`ìµAûµ.:ƒæèºnr&ÈÛÏwŸŒ_UüƒÉ Ùeûš °âRFBÚ4Ä ¡2WýŠÀjå-ÚLNQÆR®Ø/4.Øu± ã¶_X˜Æؼ±h »®-7³3½wUC×@Ësëág]‡ŠóCPÃn£ܺ–ƒ„áh"ª½=,Æƞݹ +ZÎ弈3,!‡zI”ñk2 Ì YpÝKÜÞψƒ•0Jc±ÿ†ãIñĽD^0 + „öIæ +§Šlyþ;Ñ]ÚÁšçŒ;K¸KSzß?Þ^ãñ%ÀcŽ²y endstream endobj 269 0 obj <> endobj 270 0 obj <>stream +8;Z]"9+$2'$jG89jo-(^F[QdX6Pn-t8E:5ikb^`Z'rVZ%j@UF/k=):,$ESLOfH=NT"G[2 +cI((Od%e<hf`GQg6bbpG3Zc%^e.Wo8BCoGWXe0i"%]@OR%k/\o*$5- +:uqZ%J,.tA**8Gi~> endstream endobj 15 0 obj [14 0 R] endobj 389 0 obj <> endobj xref +0 390 +0000000000 65535 f +0000000016 00000 n +0000000147 00000 n +0000055133 00000 n +0000000000 00000 f +0002361953 00000 n +0002362350 00000 n +0002362767 00000 n +0002363355 00000 n +0002364123 00000 n +0000055383 00000 n +0000056124 00000 n +0000056553 00000 n +0000057037 00000 n +0000059643 00000 n +0002603390 00000 n +0000055193 00000 n +0000055282 00000 n +0000057804 00000 n +0000058211 00000 n +0002236380 00000 n +0002312583 00000 n +0000060243 00000 n +0000059947 00000 n +0000059834 00000 n +0002200491 00000 n +0002200604 00000 n +0002361839 00000 n +0002313707 00000 n +0002314874 00000 n +0002315836 00000 n +0002317284 00000 n +0002318265 00000 n +0002329287 00000 n +0002330447 00000 n +0002331412 00000 n +0002332832 00000 n +0002333788 00000 n +0002334949 00000 n +0002335916 00000 n +0002337337 00000 n +0002338777 00000 n +0002339734 00000 n +0002341862 00000 n +0002343603 00000 n +0002346253 00000 n +0002347972 00000 n +0002348934 00000 n +0002350087 00000 n +0002351056 00000 n +0002352471 00000 n +0002353413 00000 n +0002354600 00000 n +0002312649 00000 n +0002200727 00000 n +0002235210 00000 n +0002236064 00000 n +0002235276 00000 n +0002123044 00000 n +0002194760 00000 n +0002195722 00000 n +0002196886 00000 n +0002197854 00000 n +0002199279 00000 n +0002194826 00000 n +0002036981 00000 n +0002105988 00000 n +0002107179 00000 n +0002107514 00000 n +0002107630 00000 n +0002107746 00000 n +0002107862 00000 n +0002107978 00000 n +0002108094 00000 n +0002108210 00000 n +0002108326 00000 n +0002108442 00000 n +0002108558 00000 n +0002108674 00000 n +0002108790 00000 n +0002108906 00000 n +0002109022 00000 n +0002109138 00000 n +0002109254 00000 n +0002109370 00000 n +0002109486 00000 n +0002109602 00000 n +0002109718 00000 n +0002109834 00000 n +0002109950 00000 n +0002110066 00000 n +0002110182 00000 n +0002110298 00000 n +0002110414 00000 n +0002110530 00000 n +0002110646 00000 n +0002107035 00000 n +0002106054 00000 n +0001945803 00000 n +0002036182 00000 n +0002036248 00000 n +0000058619 00000 n +0000058761 00000 n +0000058828 00000 n +0000059079 00000 n +0000059129 00000 n +0000059716 00000 n +0000059748 00000 n +0000060124 00000 n +0000060318 00000 n +0000061225 00000 n +0000063412 00000 n +0000129001 00000 n +0000194590 00000 n +0000260179 00000 n +0000325768 00000 n +0000391357 00000 n +0000456946 00000 n +0000522535 00000 n +0000588124 00000 n +0000653713 00000 n +0000719302 00000 n +0000784891 00000 n +0000850480 00000 n +0000916069 00000 n +0000981658 00000 n +0001047247 00000 n +0001112836 00000 n +0001178425 00000 n +0001244014 00000 n +0001309603 00000 n +0001375192 00000 n +0001440781 00000 n +0001486680 00000 n +0001552269 00000 n +0001617858 00000 n +0001683447 00000 n +0001749036 00000 n +0001814625 00000 n +0001880214 00000 n +0002107342 00000 n +0002107439 00000 n +0002122616 00000 n +0002122189 00000 n +0002121762 00000 n +0002121335 00000 n +0002120908 00000 n +0002120481 00000 n +0002120054 00000 n +0002119627 00000 n +0002119200 00000 n +0002118773 00000 n +0002118348 00000 n +0002117919 00000 n +0002117492 00000 n +0002117065 00000 n +0002116638 00000 n +0002116211 00000 n +0002115785 00000 n +0002115358 00000 n +0002114931 00000 n +0002114505 00000 n +0002114079 00000 n +0002113650 00000 n +0002113223 00000 n +0002112794 00000 n +0002112365 00000 n +0002111937 00000 n +0002111510 00000 n +0002110762 00000 n +0002110817 00000 n +0002111111 00000 n +0002111189 00000 n +0002111338 00000 n +0002111435 00000 n +0002111565 00000 n +0002111859 00000 n +0002111992 00000 n +0002112287 00000 n +0002112420 00000 n +0002112716 00000 n +0002112849 00000 n +0002113145 00000 n +0002113278 00000 n +0002113572 00000 n +0002113705 00000 n +0002114001 00000 n +0002114134 00000 n +0002114427 00000 n +0002114560 00000 n +0002114853 00000 n +0002114986 00000 n +0002115280 00000 n +0002115413 00000 n +0002115707 00000 n +0002115840 00000 n +0002116133 00000 n +0002116266 00000 n +0002116560 00000 n +0002116693 00000 n +0002116987 00000 n +0002117120 00000 n +0002117414 00000 n +0002117547 00000 n +0002117841 00000 n +0002117974 00000 n +0002118270 00000 n +0002118403 00000 n +0002118695 00000 n +0002118828 00000 n +0002119122 00000 n +0002119255 00000 n +0002119549 00000 n +0002119682 00000 n +0002119976 00000 n +0002120109 00000 n +0002120403 00000 n +0002120536 00000 n +0002120830 00000 n +0002120963 00000 n +0002121257 00000 n +0002121390 00000 n +0002121684 00000 n +0002121817 00000 n +0002122111 00000 n +0002122244 00000 n +0002122538 00000 n +0002122671 00000 n +0002122966 00000 n +0002200427 00000 n +0002200363 00000 n +0002200299 00000 n +0002200235 00000 n +0002236208 00000 n +0002236305 00000 n +0002361775 00000 n +0002361711 00000 n +0002361647 00000 n +0002361583 00000 n +0002356874 00000 n +0002356938 00000 n +0002358070 00000 n +0002359006 00000 n +0002360402 00000 n +0002356810 00000 n +0002356746 00000 n +0002356682 00000 n +0002356618 00000 n +0002356554 00000 n +0002356490 00000 n +0002356426 00000 n +0002356362 00000 n +0002356298 00000 n +0002356234 00000 n +0002356170 00000 n +0002356106 00000 n +0002356042 00000 n +0002355978 00000 n +0002355914 00000 n +0002355850 00000 n +0002355786 00000 n +0002355722 00000 n +0002355658 00000 n +0002355594 00000 n +0002361519 00000 n +0002361455 00000 n +0002361391 00000 n +0002361327 00000 n +0002596910 00000 n +0002602960 00000 n +0002603027 00000 n +0002569780 00000 n +0002596428 00000 n +0002596495 00000 n +0002518804 00000 n +0002554702 00000 n +0002555618 00000 n +0002556780 00000 n +0002557767 00000 n +0002559155 00000 n +0002560084 00000 n +0002561529 00000 n +0002562493 00000 n +0002563645 00000 n +0002564591 00000 n +0002565984 00000 n +0002566915 00000 n +0002568065 00000 n +0002554769 00000 n +0002424429 00000 n +0002482957 00000 n +0002484041 00000 n +0002485215 00000 n +0002486184 00000 n +0002487630 00000 n +0002488613 00000 n +0002489768 00000 n +0002490729 00000 n +0002492148 00000 n +0002493100 00000 n +0002494256 00000 n +0002495216 00000 n +0002496634 00000 n +0002497586 00000 n +0002499028 00000 n +0002500474 00000 n +0002501629 00000 n +0002502593 00000 n +0002504010 00000 n +0002504963 00000 n +0002505925 00000 n +0002507074 00000 n +0002508036 00000 n +0002509449 00000 n +0002510402 00000 n +0002511586 00000 n +0002483024 00000 n +0002364711 00000 n +0002409114 00000 n +0002410078 00000 n +0002411241 00000 n +0002412206 00000 n +0002413631 00000 n +0002414588 00000 n +0002416007 00000 n +0002416973 00000 n +0002418135 00000 n +0002419116 00000 n +0002420564 00000 n +0002421526 00000 n +0002422689 00000 n +0002409181 00000 n +0002424365 00000 n +0002424301 00000 n +0002424237 00000 n +0002424173 00000 n +0002424109 00000 n +0002424045 00000 n +0002423981 00000 n +0002423917 00000 n +0002423853 00000 n +0002423789 00000 n +0002423725 00000 n +0002423661 00000 n +0002518740 00000 n +0002518676 00000 n +0002518612 00000 n +0002518548 00000 n +0002518484 00000 n +0002518420 00000 n +0002518356 00000 n +0002518292 00000 n +0002518228 00000 n +0002518164 00000 n +0002518100 00000 n +0002518036 00000 n +0002517972 00000 n +0002513279 00000 n +0002513343 00000 n +0002514471 00000 n +0002515401 00000 n +0002516791 00000 n +0002513215 00000 n +0002513151 00000 n +0002513087 00000 n +0002513023 00000 n +0002512959 00000 n +0002512895 00000 n +0002512831 00000 n +0002512767 00000 n +0002512703 00000 n +0002512639 00000 n +0002512575 00000 n +0002517908 00000 n +0002517844 00000 n +0002517780 00000 n +0002517716 00000 n +0002569716 00000 n +0002569652 00000 n +0002569588 00000 n +0002569524 00000 n +0002569460 00000 n +0002569396 00000 n +0002569332 00000 n +0002569268 00000 n +0002569204 00000 n +0002569140 00000 n +0002569076 00000 n +0002569012 00000 n +0002603415 00000 n +trailer <]>> startxref 2603617 %%EOF \ No newline at end of file diff --git a/logo/ONE_logo_guideline_KOR.pdf b/logo/ONE_logo_guideline_KOR.pdf new file mode 100644 index 0000000..9ef6fcc --- /dev/null +++ b/logo/ONE_logo_guideline_KOR.pdf @@ -0,0 +1,12391 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[14 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + One_Guideline_out + + + 2020-07-05T21:17:50+09:00 + 2020-07-05T21:17:50+09:00 + 2020-07-05T21:17:50+09:00 + Adobe Illustrator 24.2 (Macintosh) + + + + 256 + 252 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA/AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A5j9dvf8Alok/4Nv6513C Hn+OXe767e/8tEn/AAbf1x4QvHLvd9dvf+WiT/g2/rjwheOXe767e/8ALRJ/wbf1x4QvHLvd9dvf +WiT/g2/rjwheOXe+3/JhJ8n6ESak6faEk/8YEzlc31n3l30OQTjK2TsVdirsVWyf3bfI/qxVjFl q1zP5hu7H63ZvBbj/eVVkS7QgKatyPFl+Lqow0qeyXtrY6dcXt3IIrW1R5riU1okca8nY032UVxA JNBBNJI/5neQI0V5NdtYlcVX1H4E9+jAHLhpsh/hLE5YjmVn/K1fy4/6mKx/5HLh/KZf5pY+PDvC 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 VO3tiqJxV2KtMCVIDFSRQMKVHuK1GKtjYUrX3xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/9k= + + + + uuid:18715102-ec34-cb4e-a300-f74fcb57a2a5 + xmp.did:c4e0ca60-e36c-4c56-91d0-11d6fbc8a293 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:95dbecc1-1d1a-434f-b17f-a1cb7f43eb48 + xmp.did:95dbecc1-1d1a-434f-b17f-a1cb7f43eb48 + uuid:5D20892493BFDB11914A8590D31508C8 + default + + + + + saved + xmp.iid:b37e520a-e346-40d3-9f2d-d0bb16169f23 + 2020-05-08T12:19:34+09:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + saved + xmp.iid:c4e0ca60-e36c-4c56-91d0-11d6fbc8a293 + 2020-07-05T21:17:48+09:00 + Adobe Illustrator 24.2 (Macintosh) + / + + + + Print + Adobe Illustrator + False + True + 1 + + 297.000083 + 210.001556 + Millimeters + + + + Black + PANTONE 286 C + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + CMYK Red + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + CMYK Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Green + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + CMYK Cyan + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + 오시선 + SPOT + 100.000000 + CMYK + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + CMYK Blue + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + CMYK Magenta + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 Y=90 K=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 Y=85 K=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 Y=90 K=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 Y=100 K=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 Y=100 K=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 Y=100 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 Y=100 K=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 Y=95 K=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 Y=75 K=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 Y=45 K=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 Y=0 K=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 Y=0 K=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 Y=5 K=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 Y=25 K=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 Y=0 K=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 Y=0 K=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 Y=35 K=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 Y=50 K=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 Y=20 K=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 Y=40 K=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 Y=50 K=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 Y=60 K=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 Y=65 K=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 Y=65 K=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 Y=75 K=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 Y=80 K=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 Y=90 K=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 Y=100 K=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 Y=80 K=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + PANTONE 1495 C + SPOT + 100.000000 + LAB + 73.333298 + 43 + 75 + + + PANTONE Black 7 C + SPOT + 100.000000 + LAB + 23.921568 + 1 + 2 + + + PANTONE 408 C + SPOT + 100.000000 + LAB + 59.215687 + 4 + 4 + + + PANTONE Warm Gray 8 C + SPOT + 100.000000 + LAB + 55.294117 + 3 + 6 + + + PANTONE 409 C + SPOT + 100.000000 + LAB + 51.764706 + 5 + 4 + + + PANTONE 3165 C + SPOT + 100.000000 + LAB + 27.843138 + -30 + -16 + + + PANTONE 7715 C + SPOT + 100.000000 + LAB + 35.294117 + -32 + -14 + + + PANTONE 7470 C + SPOT + 100.000000 + LAB + 32.941177 + -23 + -22 + + + PANTONE 5473 C + SPOT + 100.000000 + LAB + 35.294117 + -21 + -13 + + + PANTONE 2238 C + SPOT + 100.000000 + LAB + 38.039215 + -33 + -19 + + + PANTONE 165 C + SPOT + 100.000000 + LAB + 64.705879 + 59 + 68 + + + PANTONE 286 C + SPOT + 100.000000 + LAB + 22.745098 + 17 + -68 + + + + + + Grays + 1 + + + + C=0 M=0 Y=0 K=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 Y=0 K=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 Y=0 K=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 Y=0 K=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 Y=0 K=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 Y=0 K=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 Y=0 K=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 Y=0 K=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 Y=0 K=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 Y=0 K=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 Y=0 K=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Brights + 1 + + + + C=0 M=100 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 Y=100 K=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 Y=95 K=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 Y=100 K=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 Y=0 K=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 Y=0 K=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 15.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 10 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 53 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 11 0 obj <>/Resources<>/ExtGState<>/Properties<>/Shading<>>>/Thumb 57 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 12 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 64 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 13 0 obj <>/Resources<>/ExtGState<>/Properties<>/Shading<>>>/Thumb 97 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 18 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 100 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 19 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 103 0 R/TrimBox[0.0 0.0 841.89 595.28]/Type/Page>> endobj 101 0 obj <>stream +H‰Ò÷wVÐ÷u6PprqVàÒw6PH.V0TP(NÎãÒwrӋ¹  ,L õ,,L-MõŒ,ŠR¹Ò¸\}Z áR endstream endobj 102 0 obj <> endobj 103 0 obj <>stream +8;Z]^_$L)a&-KcCrTq:&HVfelAfqg>=YmB*NDg1\HW endstream endobj 104 0 obj [/Indexed/DeviceRGB 255 105 0 R] endobj 105 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 14 0 obj <> endobj 106 0 obj [/View/Design] endobj 107 0 obj <>>> endobj 24 0 obj <> endobj 23 0 obj [/Separation/PANTONE#20286#20C 108 0 R<>] endobj 108 0 obj [/Lab<>] endobj 22 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 24.2.0 %%For: (Jiyoon NamKoong) () %%Title: (One_Guideline_out.ai) %%CreationDate: 2020. 7. 5. 오후 9:17 %%Canvassize: 16383 %%BoundingBox: -4069 -4495 1475 947 %%HiResBoundingBox: -4068.6179436713 -4494.28356125641 1474.70925772807 946.368022105353 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 490 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%DocumentCustomColors: (PANTONE 286 C) %%CMYKCustomColor: 1 0 0 0 (오시선) %%RGBCustomColor: 1 0.567022800445557 0.098382867872715 (PANTONE 1495 C) %%+ 1 0.404500633478165 0.111767180263996 (PANTONE 165 C) %%+ 0 0.406133115291595 0.466832518577576 (PANTONE 2238 C) %%+ 0 0.198311477899551 0.62525200843811 (PANTONE 286 C) %%+ 0 0.304029136896133 0.350257307291031 (PANTONE 3165 C) %%+ 0.59317022562027 0.546718776226044 0.529767155647278 (PANTONE 408 C) %%+ 0.523893117904663 0.469946950674057 0.455934256315231 (PANTONE 409 C) %%+ 0.010559288784862 0.3623086810112 0.403027504682541 (PANTONE 5473 C) %%+ 0 0.344449251890183 0.4366435110569 (PANTONE 7470 C) %%+ 0 0.377213388681412 0.40836700797081 (PANTONE 7715 C) %%+ 0.232144340872765 0.220090985298157 0.210716724395752 (PANTONE Black 7 C) %%+ 0.550409376621246 0.509278178215027 0.476847052574158 (PANTONE Warm Gray 8 C) %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: -2164.74227551045 -1044.79493808252 -1322.85227551045 -449.514938082517 %AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 %AI3_TileBox: -2150.62430187764 -1030.48193774682 -1336.97024914326 -463.827911715331 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 1 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -1360.35289239465 857.365022394117 1.8041792237656 1668 954 18 1 0 6 43 0 0 0 1 1 0 1 1 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:115 -694 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 111 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXôäŽV…P 9@OBú»»»»»Ýq·å…D²e9"冐Þäo“‚H´$@â÷ßãæ)¥”gBɄì8ïýÜyUpt + +—“”í(,:×gríÃXÿrhP°v½Ôú`ZL>jÌZO\kóô4³$ùHšæ`k9!‚с Œ „VDö›<©ì‘7Ù.­°„,pü¿¡’c¿²ê²ŒªØ*ٝYbÙÃ8§Ë³Q²Ò$³Ç-qlÄʎ|ɬ†F—ƒ42e‡Ù‹,¥É&D0ù¤®G]â)_Ô4û¸—Âõ¤Õ¥¥فY'Ùӎâìq½ ! fC:kâUIòˆhSc–&ch@¡ „Ñ0À, Ã0~¿‡yDBÑðO0¨ì0H(ˆ©©ì0ŸH E"15•* Tk/¢šK)wX¹vBU%hǍ#wXÆÐ@-CG#ƒ‡ ,tPÁ:pa†‡„0#})ϑ´}s²”»ªËšÌQסdÚ¡ÌQÙ¹Ìaä‘14à°h0 ÄÏŠÜqpX8, ÅB±H,ˆÅÑFuhH<#2ˆÈ]¸AáD>Ÿl… lȆl¸¢¡aÑà0®…Ýsq±H, Åbá0µ•ƒ¡CÞ‘pP48, ‡ †‘0 0Æ £¬Á0ÎvÌad0€‡,PÀ  @H”ffJæH©qcŒ’1RÆÈ  ˜Àс… +Pp!x€a€¨Ã'áÀHjóc…bÓ1ÇÝnîÖª™š΍®Ì‘TGƒ5r)eŽÚ8€1ÓñÐÔØÜàä|“Å4ÌbƘ¶.µj½b³/¢‰*ÚÐE:®mrÙ|F§o„V¸Á ;x¨d"*2:B2’NJ‚hA4ÕrQUY]ae½•(E5Ô¢j¬f#+3;CK»!,a +k°…9˜1×óÑÕÙÝáåý—8Å5Üân°h$,4™HE6ä"rÞûôºýŽÏÿˆ'®xÃwø Š0‚…0Ä!‘ˆ#ˆBh@,cM8A‰JXâ˜ÈĈD"¡H4$ ‡Ä(ª°‚¥0Å)P‘Š+Š„B¡hP,Šihƒ¨¡¬á°ÁȆ7  Š†††EƒCÃ,ºð‚µ°Å-p‘‹/‹ÄB±hX,‹q¨ƒÈ¡ÌáÐ!î€pH8(Fbãšd¸c‡‹EÂxâE®Ã‹EÂ@<ñÆ°" „QI†aÌ ‡…CƒƒÂ!á€p¸C: Ã9˜C9ƒê0†Ãb±hX(‰bñE.pq [Ԃ^t1 ‡†ECCƒ¢!рhxC6`Ã5XC5PƒÚ0 Š…¢A¡P$Å©0Pq +S”‚VT1 +‡Ä"ѐP$ Dâ‰L`â–¨%œhbˆ¢¡@$ĉ@Ä! QBQÄ ‡/ÞpÅGüÏãïö:Ýïç¹È†Td"ùÌļ´¬¤t6'p ¨À"ð˜h ‹ƒ·¸†S\â÷Ëû³«£óõæla ¦°„!얆vfVFf«µ¨†RT¢õʺ²ª¢rµ¦hA ¤ !蔄tdTDd* 9xá+œ0ÂwÚ@ŸÍe²]ºhCMÑ7‹½Z«T·:ÌbF1‰AÌ'çƦ†Æә1 ðs`aѐ0@Hӂ˜Á˜Àô;î˜14``HLˆpŒQC‰ÃÇFttppðð *€Á¡A 8 €‡ 8°°˜`82xLààÀBBðÁÅC† +!LàÀðÀ… +ð@ +xA…€À…@à@…x`ƒ F0 2Tà`qlPÁ! €¡ƒ +x@A‘"„2Pˆ€Xˆ€.PÀƒ (px„0$ 2PØàƒ‡ ”`lP! +ø„ +\àÀ%˜@† B† dx°@Áƒd°PBŽThÀ‚ +D Á lÀ… +:x€0è¡A% €Ç(\ÀZh¶ÁÊò:±‰þ˜ÌqåúéSc&xØÐNe¼âÔÍÛòó9EU5Y¬ˆ9xœÁ£¬æeՈ$s þlZ£º£ì€€ˆ\ÈBŠ94¡ 2dx˜ÀC>PÀT"‚qhðÐ*0^‡8ðAàÀƒ +!$&¸ +@ôÈ@á <¨à0Á€ˆ`€` +$Ž\ðÀƒ‡ 2Xx耂 J 84Ã.(@áaƒ "ÁÂÃ!lp¡!BƒŒljOÉÕœ4¢ùƒRX=Zg¨xTǞ$¨€ ¬†ÕÃ^%áøMI84 Á…D*p`!„ ‰ Jº<˜  P +Š ¬?N ‚´ .8ÄÁCÆãCƒ‡ ,\¨A +’!„ ,Tðàƒ +! `ƒ`phðàA† +ˆÁȃ#ƒ,\¸À€(<à°páB *,ƒC ,åC *€€áÁRˆŒ‘ò‘0Àp! @Áp`¸ÂE„Æ1B8p„„ D²»êbٷϓí—.É,åoû™\ÖWvº99֊f7ìÕ±d·ìa3Ù mIJhdöÃÖ`õeO¤BB;¡ä!"ÍýªRÎj•y{Z{¾c5ëöL$ü ¥\¥ÙhwMòë™&Ï>õË`Oµ½“5±v÷9™˜ÄªÙËXgz/«³¾[óäUº²’ôm,Α„ç§o¼R}z/kžîÕ¹{û’¢¼Ý˖BÕ^ï^öÄÒ{ ñõª¦ä‹™y$ùÚN…–{[fÕî·/³—eå°»]ÌZ#¯NÍ·_ I¯‡ïv£¶ŠCv»C±¬Õ ébØI#«9º»8RÕ2*ô½Ž%Xuïc+!«ó™övP|%Ówr]®zœY[Ê*5ïT«œ{h•÷rÚ㺏 J«óšºWKâjít÷ýÄՃœ×»§}!zÒÞÏè$]NãÝç¥tT]W÷¤»œúk͘œÑÅ»RqèU/¼§ñ$-ãϯ˜iS'Wu˜ÑµÖ\Ç̺ͪÊøIœÊÛaReIfÝIõ¾ù"L”Ë#ñÌ®DsIùæ$”Çڝ«(Ewq$ó°¾Öʳ"AüØU’É‹O2~zÜUÆwàIýpzÊ)ä;®e~Pí;ÊB¹j¥ä¿HUwô +…òèñÎhììÇÍ÷³²£žðç³Ðô fҍî¨| +ý¨ §(ËM¹‹áQ«L£¤±“×ÍKnGûA¢´;þ^¨3´+%:Iîî°¤KÒQi$4å%ÉÉ~‡!–´×ҜÅ#yށ5ŠÕcqޝIïøáa:ï 1§»3ëKá…MiWüv6Bxj6oˆó(swVÉáWn)ë—äÝQ庣V'•å¥vÜuMéù7Mé&JïŽÿNŽç<¡/Òebš”ÝQ…–ùqföRÚݑ’ÊãΣ³TI<™8nÝYE‹ádr?Gœβ#J;,I»Ê›,¾<'m£~Z9§‘û&D0:h8zÖ Œp `pœ9ÀÀÑ ” À˜P€ >Àp¡PBÁ1!‚A‚ +2Pp€$@8Àpaƒ d¸ðH$:…døš§Ø!ÕéÑxâ4JH ^GO‰9I2h”ûf¥$v¼_÷½Å•0!‚±A⠫ӝ¬MãƒÆ)™vßüŽ†$hæJ8Êw¿å‘„ Œ0pamdéKñ¨Á·g¯KQ6YçzMÂQ§ªùçÒNÞÃðªwÿé‚Ž³×® o!K˜Áè qô «’,#;.Íä¦NG%ÓBóíxYéõ˜Ã“­‘‘pd`āĄ†}G"L˚tì¸ú°J¨zØ̃˜IG9jR]Šé°œÖÝF“SÊ™9¦^ë ]U$JÌ{QjhvTÍØêH¾\}ÜP™V#ٟƮ~t(­<|Ñ%R‘Õq|œ%ΐ¤ÙaCêë™DÒñaC©3sìW,©÷pÞê,‡Æ’g‡åÕdÝg'6>îÐ~–d²ÜفϹÕç­T}à”›ÖÛà0ÕOõæOji›z9f—,;òìÌõ"#̤KÄ19YµÞ¹#²1;S’nS•)4x¶K¼T&F>^²´ËzGši—ö\f’Òu2´œ}œNf—׳˜ì0zÑT:twIT´†.O³LÎiãeM ?é¤W•¤ÊQgðl‡Õñô’éhx<1ÕZ7¬IÉyIŸ“º4ÕÉlRö(eiÊ"43%}<(tž;K?:tÎ&t.»gÝO*ÊË Qé>¡=§OéGuDWzÖè‰G9KEŸH„t±Ré3UâªíU®VKrºëZ÷aŸDWˆDÕ+3ÓYõXÅú^=ó•e¢Y 6ϨwÌ֙Îݬ·9»QêZäA2òUªS6‰&fOݙÚ9ޕ¨Zxïü’º#²²©œJf%G¦ÖLÚÙ%µé«›jŽ«uoõ­©®Õº«Öt½×ê6{V,SÉZÖº©0=‡Ö¤×W;»›õúóõ½vÆìö©+s­99«b§Õ¬ô½ãQj†rf”<ã„Æ7Dl¢X5щ&ÁjRÕ¾·Ú*¤“óråÓ[¾'ÍÔˌ7¨eÈ%ª—MTõñËêVOˆ`dÀn>Ý·½æ  äÏS®±ñ8?’—/[—)=—‹\I¯Ù-ʃç«[ŵŸ´ Œ d`ƒ©”Ö„†Z)«œ‚ĘS$Tr¥=šàœåT&…“64Æi›å,©Êg‰å˜Iá^Gê²%…>K?¹k)¥Îté ’ŒUyZrFh¿¤i4•y5‰¦ý“Ž{™Gè½o­=ñ÷·7t¿ãÕ2nÖÙk—c5M/¯Ü;V’åô™G¾ßäàkÎÄjƒFt¶[»ÊÎyæþs¿qÝ1~¦œßí»¹~•e%?!‚!‚:"©i[Cò ¶5öylØõ\b‡7x:B²ÜŽFJ$¾Â9ù_—k­z·•:èì©êéCCó^§lzƒ%·eµ÷¬µhÈ,[/Ö?&£zژ}-rÕH­“SˆLyãºm’Û7iGu²ñuY1ëø¡ñLÙÕ§>i]¯?4H·§$˵3ŠË>Ýùò59mûó¦Um— +k;Q=r»;+«'¯°Žc¬K¬zùL²F›n¬õ’Ë®ç8ÓhBãƒÛ>Ù)k÷OÎ~uSI„>I8lÊuŸÇEû½•hã˺ž•Øü]eÏ~L7Û7ÑìƒTn¶ü:»•-Æ™’n-ÕÔ;YŽns͛J<¿Yb×´¡§zL[_6ª²”W¯ˆx=¬Ã³›T›Ù)oä°t”|'D0>h©}ÇY?OÊíچå{Éß²YI³3bØóÝً¥ºžÈ&„=þe‰ÅÚñq‹=¬'D0גŸÆzbOÆ4¬ã¸/÷ŽžV÷Æ=ª­Wµú¥oü¬z•]‡fu«Í6§ºí«÷Œ69í«»i¹1þè²Nc›KFÔ«÷Ʋ×ßüt^—°eY7þ„Æ-•±žcĬ´ªÝV!R[¬¡QU&eٍ• iª‡¦C¬7ëšï›±Äƒæ£ç«Üu'§¬êX ÇM"¡á-Ggë ÖQfÓî#C GÊòü4Ç$—yUk¡}¯ÂÌã-äºæñ>GæV’[·ès¦¬fÑk4’æ_Žn¶k-úøNæLeN“Ñ'ƒ¦³·è¾,™óËS£Ÿ¹†ƒô²™«þ"ýì&YN³•“nÍ +–[”uþ.K•;u2éYþ{šróF6RÙԍläßޚl$×s$íŽ1ƒ‡ Bð  ( ði9Ò±_t#8”UOù<ß<º*Þ¥«êÿ´âs®ÄµkUª.Bô`oíà³ÎJ¼É ,T‡d«´Jl-éSyÚa/ñª†Y˙4¹$"ªåÜK2qè3fcٛ«k,‘>DYù»Óüd¨ùªÛa3ˆgzÝm~O,ÍPÖ½žù› ¹Y‰¿é¯)'œ^‘3+­v Í\j¶¼{gŸ›ÛWâ­¿âôª¿GL•½«ÄiI{" ¸ÚòÆ2Kî­¨.&–¤y؛ÍQÝ)U Ggæy¶Wµ2vŸ™ Š„£’Èœïœæð0ÊyÕÈR~y3 GýˆHySIK8,#á2”fþ#+Bš¶ðÆЇD9ãÖÍ\ÈÞúí›vZώ¼bùwD)~MˆtÄ+¹rmz:ÖF:EhY×Á§¡Ñ­²ûÎÒ%<;<™>e¡š%ÝG*ožkž«¸|ÐÍdë÷n…¯JC¢™¤"ÛY±*†6U5šÖÇ-!òQTvdi9DTe­×Š/Öï.—o¾rr={×ÇìÖď= ‘Ä8?4š«·ŠêX™BöÓ9´,Ë:;®wM)/sî2õeÎÔ¥Ç@͐ "T–¯COÊaQ‚ùꨄ¨Pz ±’ô§ZêØÂßÌPaç@›Éy±ßÍ.ÏaW$Â7§Ä&_Ëâ‘\Ò‘ŸêåsœÌd<¾L>fiW|=+îáö\ªU O·kÚŗ=…ZCf6ž§™féE#Ë£‘e¢¥• YÚ¡aÚÒæ$Nû¤Ç–s…bi”Fi§Õ~·9“^›eñX»LÁD3ò¤eÚó˜â+ÝÏlÌéÜɬÌæÒä³n‡ÒٝÊ#G=°ÒG(Ž]R¬ÖÝêPJF.Ú½Ð(F=Èg…•H•wÓåäý|Î:t´µ°2m†ŠzxËu^Ý´9hXxtž¹Gb‰®2çŽñ²/^åõPnü«{TÍË%œbÞÉ=î¬?è¦mÎΒtžÁèU°½¡ 6˜ºٙ¤­†(~URNaVRI¾^”C˜”'ñØ.]ÌkM>f8ùËޑX-³Ç$yÏÜ]Ø;W}ì“qúV˜µ¿ënœ™«S7À¢¤WÖcøθ*ëu,+Ö?>n8Ö,³û«Øù½¬Nl"—žrúÆ3¡%ÚsrŒÎ¹_(=6s':SïÈ«?xº©X{˜‹w؝<`{ÜýUJü ÇîLYu_2`•'¤»§mèGN|éxμÛ*ÍòS¥Ä;ú[œrNµä~öéÔ$[#g¦OògN4¬Ì¯¦Ozòn”S*¢¼(é§' +’§T7ûêScq{ϳnx-=÷Õ ±E$ø.lb½êLn\èS½vUÖêW:¬ÇµO¯B/ú°åñZgEßê»ùØӈ¤^¬«·á‡ìâñ} +GþZú÷úû¯~½ã³±gމ½GÌ멱ݲRžÅþcû³÷Ú.˜> ë,ÕQâøD}Ê¡Ý6Uå}’û\ ‡±7$ w„™u«Ï’Y(á¸)º› ™íŸT45?í0Ëx'?UD7Â:¿þ‘ù¾–Ñ]vÚXtúMIFfþ¹xô²MƜHs¤[ùØ"#óÕ¨Š~súÊôóïÏSæ\Id:ž?†æ^•Š–ŸËe4tòKw½btúH÷6<÷žt¶þlÑ<î)mˆVt¦ßôddèóÙÕl^÷ݙ5͚åæ!™u°ú5k:҆骧X²“UOdB$Ä&¢}uS¹ã<¡9qüú=*¼Ý¼œWßóŒêÐ9SgfÎ\ÕέÕBª#{¨Ì&ñZDxT®4ĜZ]Yò¶Ë¦C‡å=?gr’UÓrî؟spðè ¿çãçÆ'BSe]}—U¦TŸÈc5c­“¦Æy6­Ô,cö5„í-‹Zó¡:ÛT©ðÌ¥<ŽO¥ãf8ägÝÙ?¾“0mBôO~Gþ2£òñÇ´¢C#DLÊò=9u˜5dBSúhE¡ôáÊÚ0mnì$"RցÆÌKÌi }éÃîvó¢úáaâtl_ Õø3²±ú7F™QÕulæÏ}xLkœYWUÄÌijù.¤Ì¹Éc'3iæò­ñ [ÖCO¢›—IY•[MÒ:ÝÊ<ÄCcڕi7¾'}”Mbež•áÑÐí>°î–Y«cí,‹2æ’<¤ÿd#™O›ò­“ëî9åÌ)NÕÝÝ6âýùüí‡3ó¬2±ÏüÊF|Ä»ç•6¯ùád#b'mhN™FB›-Óhsœuæô¢)©Oÿ¼Û=í¢»2ņˆã4¢2"A¢!£ï(NÖK‚KÕ_+é2;êf#Í;’°Ò©ÍQïú¾&Wºž('m‡Ô*U‹÷C¬Së³jjey?ª‘MUßóՓl5™mŸ¼å k¼ý¨Es·ûTáX µŠŽrs¤ûa]â•uzÛNÌhBCAysu’Ф;}írÜ«µnª¨£ƒÌ®wD7Ó;óEgg#j¡“ç='aÓæN³Í «Ïq¶·³‘oUBtó:ÕZ‘êZ†ï±dA?gŽîïê²ÂÌ[ÅHÕ:W{S¬{ž !á$Y²)¤Dúÿ{ʓI÷œ’pŽé©$Þ4diFª<š_¦™jnfÄj+dÃãDwÓõYW9/YÃ#OiϖΌw¼ZÇ©=•Vt’¤Iê{›ùï3eSÑä卾©oC2•kЦ9T¿³q:ƒS2ª#»¨çOoyÕtÞf‘éXîá‰R\T+BœB,9‘ɉzýÍÙí͒X‰^OÉÆ׏éuD×1MGã_m±R§t¬¡ú-õ3ã+UU^oª3ªjQÖÜ¢ÖèuUûœõv)"ªöc”dœ’‘ÝÒçFBIóÔÈc˜ól-=jï‰s<¢›S’%ÞÜò#?ºWޜ¬HG–hó¦%Ò±†6Ÿæ¡!ҍ؆O¬™ØT>=5SßIìÔrïÇS‹ùœ©™õR'j=dÒ÷JRMyžDYRT?*›Ta!bf©šù4*eæœ]ZõJªg"Õ-Ÿ}föé)ϧêØ*WëYt&o]^>ÓeDSŸ—E®Ö¥§£™ÔÔ$ÝsZs›=©U¼”œ:î·Þ8L»;Ÿè›x +ŸX˜G–}Þ½œÙ³ +µÚªå“J(Ê,›¡W6Ÿ“4BS‡¹Ž.ãBªL4³L²B«VeâëJÌ*ݹLÄZjÕ©;?žR®ÊRí9㊵ŒÐ’SHO»¬¢:»afUõ‰3ϱ+Fõ¹åY°n>iJnê°§¡=éÄ­<˔º®h +Syº’<ÍÎó<Ëæ=•„xƼÌT>Ë=¬|vj†Ni×6wæ”t×?édgž“bI9=³ãÁ$òš[v2_sHžßoòÈÐ75ˆó×ÍÍT2HIc†„8§Ò͏†$îºsn×:²¶-K•‘Íyz"²˜ÑÌ R•­èæ{pҕ6³“:bk†è¥RùUžÛt3¼Ú|ļóž¶ÞL¦¡ìÿ>[”+áõ~–ÜT5ÉXH”=3òPÝN‰„‡IYæòó(å÷Û:K´©òo߉9%ÿî&½oî~~ՑŒÎúX8‚iyâºÑIí[}±¬!BóÉòB·aùö¥àíÿ°üD ÞW6ڋ=ɯAK‡l±ì>å†ì²qÈÆ!SÖåß4GUì—)Ù¬Ð~µ)6D75É¡úØL™åû)‘` ó¤&J×·¡Úó„6}'¼,áeöSd9Õãa¢Uo§JUe›E‰¯Î]O9•!cßë šÊn‡5½/¢oF¨çô“ÔQ‹Ù¶FõæÜ7ëbEiE} M\dv<³`ёçüœ‘¹ú›<úM_“ Uí;#*6M®<¢þ†..šÞz’2š7«ÄGdd6“õVY1"<ždéè.ò«¦BCåJÞSh嗰½šòНðö‹s©!CS™®/r™%õéiµîéOÁ"[¥#ªÅ¦žêç`¥¥ÎHMyª&QNß¼]ɋšhS©ÈάED”öˋŠpîȦD7ŸL”Aú”n<òUG&Ñ·£-)??Ð$Ïú6sbŸùhWâ¡ó{û„Mqb^ÅP~–7‰]ÝîD/;I¯'ƒvvÑíI2ç[ÞÝՓ4zfKì²¥µÄH†ÎҏŠªD§¦kWtsž¤¯­i—Èæø +–njª[²sÈ¥›Ì›ëÉJb"¿.k²›ºñÈx¬?dáB… 2\À!l°"‘ÀàèÀB &@€#" ¸Œö39_T(8‡D֛ÿé”j–loX°jlv”n7Õ9Ò´¬zâ¤;›=±uLC¹™Ið¬©Hn&œ4*3ãÑý0SÌЈ.úÐUæèyDRwXX£³¹Ñžë¨DqHƒ‚œ:ÅBˆ!$h@€ ˆD„’ùlX~xb:J4" ¢Á±m”„AeŒ!€™™@Ý6ÑF}”ïs¼ŒhOâî¹ËL_Lˆæ»0jñü´Å©ÚH˜R¥1B›ýåñfT·4»kENè§ã…^e=1žrÞskÓéà"^ Î{oZK‡âúܟb[ÉÞ[wu¼N=~  G¼ð8þO—³T1 ^û2ñě·?ú–â9‰ÏmWñd¼5+óNTWM8¬ÓN,Þí±EMój wžk{‡n$uÎáÐÒ½›[m¯½kîx±Ú´8¶^Hiˆ\ƒl‡ zHTW9± '%›&‹ ·YEé#õôÀl”CÏOÃÏg´4ýup©ê|˜¹6ØÐ}hu)X¬ÈÊÎE[Ú2ÜÑ;ÝfI`®uãU†”Ÿ•ïwÅO¸¨ +CC£U)ݪ"J{XӜ;ì¤ 'hŽ(k“%u‚t÷@ðÂK›ã›ØwE«‚ôÌ~-Ž•NöY÷•ÀnÁèÏù<ÁAPŠñ@@'äŒo.ÚVâ (h¡A¤;¢Çÿßbô®å‚¨ïÅY)üŽž7,¬!unôІ&8®Õܚ ¢-#4÷ô'@ˆEcH´  nÐ`H!+ ۂ”@‹#Ž•7÷攑¬ûšBî)©#z«ý{†KoúðKÌÉÔO;Oež©Cúi>PªÅ< (߯F«$.pŒ’ã!]êɉ”¯jû»u“v]Ùhî{éÞ@šF=P>`x"Õvo4亅BÏeÛblí +ýÕ¹îÙÓò•$Ÿ +F–Xm=›&Ղzç3™ÆÛõÈÌý7ëF‡°mûGŒÿŠ½þ¶ËA‰ åJ…¥‹-GŠn<•rđ9Ü]”Iè?÷€þTdÆAëŸèÏLgô?„÷èÏÐ28hÿÃJ•²…5Ô[ ÿUá c… ógZ@n–?äá*7n±ú“XôҕÍ2 I¹î·¯]—km‹´ M(÷Žä¶£o0­³¯|ŽØíĆÅb£Â:Ž¨K +¢SPÃÐå1+j(è‹â§ÄXÕ¡µ" øŽ9wΘëØ*^ºÔNáSžΈðËìÐ7n* +ñÌùRƵE +Î÷…¼ç]R‰!?JéÁßë49~D>ÈС‹ Ê#;!/íUžò{u®.tT7$—W¯B­z¯°i—`Ý3H’K„d”F|ŠSÏS D¡¤Íú8ÀÒ6î{µ6míò‹¨ìÖ¬%¶W“eQ§ –­cj[ÐÏ¥$嬷OFe!„…+ÍbmEŸV´YÜ§:m@ˆÌ>½žuÝíããjLþÞðÚágjOì‹á¶v Ck»€l?‘{L@½ÂäÁÕCì<åpA‡òC>Aþ¯íØ>wš«—ÿ}«øÌöù*€\sÈíAr £11z¹^´ºgs…½·{+ë÷ê"DÂ`ùM°IÁÈű<ØNy½Ž§mÚ/œ¶–À8ö`ƒ}ùzlv-}¼ÐD-ÁòKÆI¥´`DÀvß`ë=ž1þ_+âgȶÎÊÌïºXs="`¯«×Ì-u5a™¯·ú²X‘‡[…ùÀãâzha[×=q=Óq=gãªáZ’n5IŸóžèéLÇYËù +‘î¾×é츴®6,^ºuô ڝ»T/îYöÊÞ«Ø°hÝ9¦̓›n¾˜»ÂŸù^;ŒGkÅ­ÖÄ@¹}ǟj­óÁä76< †eE•²ïD£€l8WÁðpO@bUÜyËûà2\†U-¼Äz$Ü0\íñ6â#Å!~ Lê ]›)Bn-øL¦ìì'à“Œ˜W9@A!GíCwÄ<ÖøJ“ÜgÐí?>Žiwzúdk[‚†Â”Ó), Jó .¯rœ¢ f Ë\ÐÉUUvd)·ÊÙBÆ;<ˆ""Œ‡6}¼¬Ò“ž»öK>dl؊t\cIÖÂKzävÇÔ +üëƀæ8–·*⭇ 9m7kp)œTíêXû¿ÛÈÛN à‚ù-NûQâÐ?«Y3À`;éNó»Yï¿-Ö륰j<1…Ë#zà”ðVƒò;³,¦p磖üGÌ¿¥(ù=Œ—B³¸€ +wc_jšŠDîÚnR… 'Üͨ¸ý•™3kº»*pqyŒÅH¥ + Äa÷wÏuåݸ;«uôړø_æH¨Bo÷æ h&¥Ø¡€4·ür+¨¼+G¾§Z©Â†Üb Zy©Â–Œ ÂÕhý–ÂåihÛµ"R–BÓ |,³ì€Oaóɬ‡ËR8]Ÿ&!ð9µb…Øÿ3}\ø7G_OU¯@1ØS¹ó‹Ží(îãK… =n@l–hšè­Íš@ÂƈåÕ :ƒ®w€Pe:E¯yøõÀ½¿i'ª§@çɔÉTh•+­Ú%Á¤^Å°¡~Íuù§ýÓ4žü§÷dëÝ׿@fRö“@¼Ž‰ÈÏ% _ßF) +–@\-Y.e6U~æ€Ð/2 榝Sj$vÆ íÿSY xÀ@|TŸ:þCýòBP(DˆÁrkœˆŠ¼:²ˆÛVåÐ=Öw T|.n¢ é¡y :¹ g‡5 v hpü¡s»ÑF]&<ŒDMSi yäXü¢?-ò@ÐďÞÑø¼+·•‰<¬ ¯`sqüWÂiÄa0ül@¶ }–Y°ŸT`ÃzÞqM‹pª åûÏþLÇ Ímä~#unÔ¦0`Ò(« ƒQ’ãøäák{1ׅ€zdÖÌ\>UjÞʼ…þÖúr=Àvÿâ|ӏ\ò¬'ê@ÙFñºâô9Œ9ü”ÍA˜ÃU™RŽ“"ˆ¢ +t?hßI¯ûAÙ1є´çî~p¦ INsd7$kÆ9ÏS Då1†Q°Ch1%—Öß¡].Ieþà¬òŸ†MQzð€¯œêñ ‰s+ÞóßB ¤ZIâãp3J p-‘Zþg|!V-ö™Ù~3õ1¿WO÷±žÃKÕ7ó>Ï÷ƒíȤáR ×&Ý©{í×%üÓܺøyjVÏðel%š „‰`À@ éñÍS/~ÖA8haʺxïÞMÏ«5e;ÞA(‹òuð~ OwÒB}Á‘Ø-*~> +;ˆV×Ö!Ø)ŤŽ ¯\¬ !ڈ[B×âyõ†ûó4„[ò”òÅÁÇÁøT¤!cm^„ œ^™}y±@ˆԄÖͦg[ ‘)7*pdÕ]w #–3qžÍÒ72ÎëX€æo…¥Ñã‚:Ÿ;C֎‘ÀùzŽl“È5ö,ÃLâ=Tr îzb`܈²H_XXœ8zp+Àwн¨ðÅDFcÅ#‹ù‚åððr9èNúŲÃ"±¿5[l½}äó£°L¨pã%´^ËÖAujŸ/»ÔOõ¼ÂØØ} ͽ†…ïºà+ÿÝ=>}Wyü<ûŠs*<¸;¸©ÔpfCêà—G 3U.Vq\¤Cc«B½ÔA;í–Þ[ãº^ú? º vEDZšg 8/ço×ÙÆ{0¿ Ù<èzÌNqñŽÀÀÞw×'`Ð 0@p¸¯ èiÉõÔq@e¼UT¸?§åÔ¬O%AöÜAŽç3¦væt£Ó(#“<ÿÅñ/:r{¯k¸Ád›Þâ3ÙÀA®XË!Ôؤ´™0¹ó?zÃwäúhn·g?æÕI~9!6:š¬¥¡ÖŠÉ (öÑ'Oøá>µÉÞdsõËtßͳɺ—œtg±x1ÚÄ ÃJ> ÒµV?qgõ4Üe7¡\™ú7åuªê4°ºÁÊVF…ÑÎd¡Ñ|q—Ñ)BÜʘsЩ)¦Ó쫝RÄA\S*æ z²Ñ"ˆ¢“ÝÃËN°¨áH 7 -QÞॉ¨S…8tñ ×l·‹9㠑 „©g©=(Ã_/Åþ=p?ud5è#úÊkŒ={W’/pï›ÌMßý¨ì·ô”aX>Ñ¥a'Öq¼àõúê?µnÐçèºüu…&¥ƒ}{BÝ¥‡–ýlÐV¨]qMQ z4Õäò%Eh¯ y‡Ðÿ9·ý3d1ÂÛÓgSdóŽë!eejd f„fðWpy¸dm՝ê#÷28³-«ÐêÝSD¡;õä081¦cœw‰ž#B ¾cfp¸¶¹h„¸u„œ&‹aQƒL;™ÁŸâ‚®¤å q1®î +kl*28!)e-°+àü´ÔõÏ1Ø åü¥ÌÆà²5–ÁµÓ¹cÐü FslԃŠÖÅ3º¥Äƒ_Œ¹ 2š;³ö_¾ï°Ò(N5FÝØj=£Ž]gƒî¸[§ ¨Xµß2ø¾.q¢ìiä8êk¤;a‹ „ M—‰ïZczµAƒö%4ò¬5j`乍 4Ïà!˜¬;ï ùKÅ u·ÊÉ%…{¦L4"Ör·w@ ‰•ƒ§AhºN7k˜Õ‘<<Üä^Væƒ>îvÎÎÛ¬[­'ª?ÉR ÉúÌÌÌ}¨ÊÀ„ËÿB.B—ªtu©å^•hýS5'Ë`GЮnCC¨1(ºxÆÄkA-H“”$,ÝFðØ«=ÛT¿ï,2i ¶–•KåH”ð=̂QÓ-_‘TB‹d ƒX GëîJjß &- +aЭæÀƒ²¿Š0’èôBá_3“y`hh_,ˆƒ0hš\V j:¼I/¥ÁQ(ł‚wQ†uøl8dŽhröÁ Ô˾•%ÜlQt]êS sÙ²QåܐёoGÑ£)êOÁÖÿJ”ì‰];…N?ú˜‹ê›«´e‘G'a0®8ˆíü\Ñôà£mÉÑf²‡&N´s*¨B0žÐ̈ƒC|Y«¦¡ &•/Tai'W›±c灙T¥×Šã?p`ʲŽ¼悆fÐ{#pÙ®ÅLJÐF{v¾]«h2H?<ξÛÉN‡Œ/BHdàÄÊfy„DïÑtÈ3·jÁâJ¬}RV ªÝ`¤INü¿Eu+æ|-˜j×H0°‰ýeËá×}­ jR ÆÔuý³]”Z0Q¹ +„CŸMuõ/,H¬Ð¥Øx'öâüÚ©1'ˆ &^çB-XäÄàá”×GuÙÞ嚌 ›´Ô»)´t+㘗Ù¢}º[v›@4£\ÁD„·.L¬jV>ž1HÒ:Ŗ mÁPâ[̍mA¢_¡$u'´SÔ¤_ôTå +M{›Ë³6®§]P3ga‹ÍÇÅï˜Gɂ:ÜØ# ZI“c€'(ˆ(ÐÁ`¶¾hÑV}AE@.»<™YAr&0πP)+Hg%EmÇQ²‚Q;¡‚Äٟ”Η¯ÅרŸâ¥áÀÉLj¨h RÐ 8WCzÉ3wF”Ü.A‚BNIPsÆg;"š°ðüš*»#Òç²í@Ò×ô"Hż».F¨K“êîŽÎ$elÃ<pD3ãžóO5ÇaS²€èêϑ£¬©¸ªœ›¸ƒGÇ Ç’L[^ ²#™ºßÌawìA²@hó´§É-œ±·-×3áOÛ¹À°+³%–©‡ sŸuß¡#ö}@3äc¤ªåT#”¡v ½RÂ-ä‡Ã<ˆ(ìŸÑ¯JhíLù–>@ßå#íþ4^ ¾>dò:Ê]mñpiw ‹)ÃOˆ-˜Öe~¸ŽĎ¾ÿŒTjõüg4Чló—:Éytb¿¼óJüƒÃ_¼Ýv{²?:ÚJEýقìÕϵ.¥å×)ó~ˇ*!g[°Øûñ’³5¦Å50U´ŸMB9ýøõÓð‡ÞêG²-Ì,7€ý T/¹bÈøßK«Åœ_FùíÆú.Zµ÷Œ$UÛ¢=RR­6ú&øí¦ÈOªùû>Òå"å}~;ôå˜Qá"ã¢& +Ò¡¨¢K˜E]Žbå ‰ '⟧ÊúvZ¾q2ûútmêì¢Ò´3[Õ£o(UCŸ·ZßuáÒð|ÂÒjò)•L«ªk@©Q1—o¾‡È:ÒC°–.òóòÑڊE¢#¶qœ%Ó°‡8 ñ%¯F3Uš˜>âð= LÃÚ± ‘… +µ”„Hýo#]ŠP²Ú¥¤A`S¼Ú ÷6È®º{!üÑÈ֕3¥îUðË[¦Üý¶6y‚{Q@ˆïg¯QlO”®›@–o£Bí- §¿üì­;¤çÀWöjŽIAªµG0’6û·HÒìé äAÿš‰mžKÕ že…7&"5z¡õTcƒ0éWÏô|ü*WÏΪç`ÐÅ`ôßçcÞ'«%Q/7v¾èpfµb%gÃr‹éѕ£š}£ôL>z½(¶ »ßÐÓzi:zîe‡B#qÃ4F¾ÝZÑąKdÊÇ3¾ÏLŒÔö},,c€Œõ×ÿÖÙÌ+| V')íò¢Ã¨ ÔFGŠÊ+$#–ªÉ¾û±êmKžèEÀ6yfkʳ +y`ºÆÈ_mã"/P_Ñ7OëÕ¨¡, +¡áêí™=°íÏÎ÷¹zV¸ôìKÈvÀU@<Ñ(/^¡ âäò‡§&Ë’ïq¶bÃSEˆu•Jòû£›ŸHM7¯“Œjc9Ó&{¹›b +¼~à¾Þ’f¼N© kIðU$ú±Eæ;99òE—fDªä Õ;¬O¥+"|C·z +2Ô=0ï€iid3¼óeGö}tw±;‰zÒE«ü ÌÚ)B/ šI½>3œî½s‡Š€'žƒrGu†Ìw +Ô +r€à.µÏp}y;‘ÈrêÔ§­†å_w¶kÚfhII¡” Vaz§keÚ5â`"è‰"Ú ]¹È›ìUG½a%Øj§¬4;Š®ÙŠÄ+©H­¬Ê֝ •TR”Øإٵè9Û¬ÚØÕ° Â4•Òê¯*‘ ¥¢¡év:•4¸aœá_!„=;ó†á|õn Žò™ˆ!b™O„P¿fTy¼"„uÃEBˆaU½!,O'ŒƒåöszX¹!œæ%h²!,c™ñjƆðSo¢cɧ!$Âvþ")´£|Zž²KÏgâ|&|)®,ÂàüŽïžEH‹!!Ë,¾ò¾Œ­¨IŽÐÊkDð/ç¯#BŸPZ*t¿§¼ mCX)ñýð áp{¾¡5‰°~6V»!TDf6ÞššÌlQŏÒëö +[ñX&SœôÓölß_t7¶pMê¾ +k½k&Ñbş5F¯°D+nt9x]ŠA[¢¿E–{Ÿ¼C€r P¢ƒ3–èUÇe,Ñ÷ξ¿­,Ñì¼³Fóü%m²ºtAã1ѐç wLô§ ÕqÍA.—-ù’{‰N5¨G4ðB¢Ï¾žÅMz¢öm…¢¾‚è"ÉĝÔs T-”õy‚è>L‰´·G„v( .QÎqø®&A”Báø"ë7ÊCY‚¨€4Œhíåx‚(B^‚à +¢Ô@ŸS ú[ žÙ¨ sgøÆx(:åR—á¡ZG¶"šol1Z%jú‰7[¡Maˆ²ëÅs¬Ó욦ú+ü¶‹yà†OŸªØ‹ð ý$d+kï 8X¢>T™b6AÐæäcB¾†¸X­¶Ï ñ6-T•y%FÊâYU«ÁÙÌpkœLe’Ÿ"!² + BÆð êb2âŸy°fâ•e (ÆyèÐúö/3ûJ&ˆ@[›Eü ´YÂËÚ([`³üX›ª >¤™0²^Nî_I¢ÎúÿBðˆ>.løÙtQهlA’#3õÒëg몱hnÝXȟ õY÷mÂÝ|<íH,NС„¥Êe¯{&èLښk°L@‰9“Ç€KڂO¶Õ²iZ©M;:^j»]_S«ÿ2&µ¹Ød'b7€lx7{†¿¸9i;nق~é"C´sD­ßq¼ŸN fÓÆ^…­G‚H”ýà'œIè,¡Å®r†ÖcÈC­Í«}øw·K]JÚ‹Ô‚H©ª.’^3B(̝ênÈ×ÃiU^Ë^B €t~ ‹*{< ad1iý‡?@x ÷>izå×°d󛙖‚MSžaàú)$"à`zâ¡ým7|œ £ÓÑñ×°Ò¾Ýzøü͔ȳ×C€è)´0ÆÆl ckš‘WÄi‹á†ˆQÓp§ò±B>LFÇ^W«[¶ªñÁ´4IàE€ \‚!N>}8ûÈ­ü°¼JN§@‡ÓQ×á<’CkˆD xRáÄ^j²B@“Û¡Ö퐏‰–Q¯€F†3ë2‹0=›)n÷Ãf‡ï3¡‚ù>Î bÏÀóìéܓü¨÷îsÃ#ãŽú( ö_#~¾X kX Fr_³yÂ1Gb¶àî&Cù¶”'G¢ò°êJ—º·Ÿrt$ò0˜"3ayÁ­jðYâ¯å”â^F\ÀJ`4í£è³/rgε>ý Å߁Æ Da!&I„»bQƒD]•vßv§¸e†¯xÎqwôI£ä¾wu°;n¥šé!ÅE¦3›¹¾Œ,?Ê ²»ñ¯` /âì‰8\(e”j;‡hO>_¤¹º˜ùód¶{”¿¸üïX$QTeá¬'(±YáˆÈ­S}.ZÆ®E¶¬mÑÄDá{ˆ—ÒÓ Š_[0ôö±*u—ܯÎ~ + ´#•Jª=bRd†ŠÊ¦h$7êÚ _làr&MJʳ$–H&ñÏWOeœø„3 W¶ÿ̓m€­âI%«“chi3'A}®–L?,ŒæQõ”ÙLkíŽ2Lü…Åa2Œ¹'Fù×bÒðÁ+‡TÖ\­¦ZÉíúCXgNK1­4å +r§‚$j–¢Ò7*ޚhüÔ½IŠ¾)Ný˜Ž$Jòí‘Ðãs• N¼Å.5D2TøÂh” <³¼à}þI”Ù©êÛÁñBΩԎèƒnÒ m›~³PtoÙFây–ù{Ä5Œè$@µ]XÀœZJ°Z‰¯ý[‘Â5ù;' AQ”STrÈàÐÕHäÃ`‘hÏÄìe}ÐãWo8¶muÆZûbd2QØ ù9©% +g'¤-vlßG<èÂ÷ÿ0Þ|:àP):‘Â`«l-HáôdÏ a»œA÷µM5ü8©e8_=Š jztå/‚›¦ê_¤|¶4JçÝ+ÚïÊ­Qýu È'º–'÷¹.(ÿº[nWêÙ&U|×U³ÎôÙåsÊ·Õe¥b7ò¬N.6¤‹k&|û~Ïió¬ÝTم¾[?;Q€ÎRú#ݯïü†w fíF”ªýù„2ޚ:ûk&óqÖq%_^¿G2ÕXŽä¹É}ë›"l"Ä«á#è¨t”©܂Ýódö½n|aلG‰ù3Úl¥R˜©rŠ”ejgu…b•J|“Ž¹Ó`\Ÿ%dþ þbuhñÛ 2¡ïxpû½Ôá¬êzÛª¸ç}?¥ÇËËË°,êbbÔgA9÷:ALB¨ë¶.ÙÐmȏî™kc %'®¯LËV4pEÀ“«öð¶åf?¢®¶tN896±tÀà\+I*VÓ`«ÆïÎq46Óçõ3¶Ó“GglOx3ã®uWƠ嘕ŒÃÃAdñì† ãcæ!±k +i' +̲OÃ|ÛØÓםß4^«U·. ‚UÙq!½ªn¡‹TÆi¡¢S •…N¥Á`៣²`Ix’ì;ñ֘Ñ=qRƒ©ä”6?9–b,Q؛PåOè)ÉØIÍLHÓÿ‰«3²„°‡ø-ùZ£Ú”2rY>%E<‹C‘i·Gã˨X-Ñ튖Ð҈f)P™Úë}¶ +°\‡ANɦE¿9:þD^ØN}œŒK³ÚƒàjÚȧSÞñ%_½T‰ÁˆNd€N+Ç;Î äjñ&ª_>lã½*B娔BzšØ‚\‘£g7\^3¨»ÄG™pøhŒ³3(©0X;„®/Q°Ž„×B…+µÇH˨²¹-*ËJd SÜõ(¥u"%”è«ÊÉR6èIès£<´Iq4lƒîšN~ž…X]vOó"ˆTò “ôéǘ÷~"ø™vĐÀh‘u¦¶1ºz%ðôe º2õPAÀ ‰h+1š±LÿãÅLÎ}¯‹´¨»$§QÉþ¨¢:T¬l—¬ûfÊ“À™lúkÒª'êäDºõy^žœ¤QóòäýJCVñ +Îpç11ŽŽÔx3¥ìEÝ6E¸%§0‰z)e« 67f†@ +ë¾õºho*ÍgU†è}•ÝYéHXÀ• Äm'—,†RßMy^²ª`~hS¦Q åëT“3éôÏg´„N)Ë F„µŸÍ=êoižNjöç•'vÂÇ·Ìr'&ƒÂçäaE¿¥{‚ß!^x(Qôðê·LÜB"áˆÉ²l´n8G™TC7² Œ¹¼ 4ù[ju©·"†£5<ËWœ‘&̟ K´Ëe¸te3§­«‡kÂáÜÙò<~Ö!þº1ÏL¿‡ËÇ´èËQ°Õm¸PóÌ蜠m@‡#cÙ®š‡¯wÜ×Îjbò|YšÙG´ð<┶Ú{¢¡®¨w:¶7Ò3¥X­áh6$Îܸ6nt2Þ;ËƳo˜s7ÕÄf‰2Μ~`ZQó ôęå?°¸aºM˜:ã D3§è­š¹ë:ú¾k¦”ÑL Ëγpžv½ÿ7}›TzS~T4³Í‚R©ÎmЀJ?âÑòÌ 6`ÔOÄLÙ™poV@Ìi‘~Þ*œŽ¶R-jKxeW֙Ìxë̬d¨äy8¥qˆ¹èejæp|ü÷¨™â…ŸjfKa.§ÐmS3]Çk1,9û©¶Å̀Â&^3oµþVú´<_´GåJg棰f9îÊHDvA j.±±ýÝ]gŽSþî–¥:7¾•d:Ó3Øè!ÿWbê¯ì%¾rõBŽÈsÛ̝“…¾ø|Ä*íx‹Ò­'3"æPšOz2Ó¡QògÊe—"6Ó|߆ÕÎ(Å }œ¡¬cmÂþ €ž4«b6³®x—È°™–É,&XufµË*¢Î\h IOâu¦ªGe[º@Ç1"‰I\ê̪È9ºûŽ‹´¶Cúx<ð·úôæѱ&ž;=ò +î¦1Ðÿ‚5`¸[\ëîøØÆI¼ƒCÄ"óQ>Å1Ðd_+Ùâ†GOf=d©ÞG ¼9ò>ŽõéžaJíkJx9} «š82p½Ã„&ö± O–ƒšF!¦ö1wê¸Ì,öŒØÇj÷t±ØG°cûˆ“LF)~ü’.0#/ûñ8S?nEÉókF5Ð]?ö¡t0• ÁKˆ\x{œ.ÏZúr›BP-Õ£€×7*Ó-4í@DjgÂvþ‹ßÌ(/@:ÁyÜÓÂïêû*#‘N_s#8#¶àŒüNg=èä܇ì ÎK¡F{òpBGù¹C—=aœÍ}4e1M¬ºç »Ê¦Ê+úâ|Ûòæm;}¥gœÌIÌ~qþď(æ✞ g ½ª¹•-¶¸8ïßÏåqžß6ßâ4Á±cqÊSqdxÍ݂?äP‹œO3 Æâ<ý)|ËâÔ÷Kå¾^qîó"¶®âüåvxýŠÓ‘F2 §®*7©[q²¸´3Ãù­©âN[‚kn‹[©ËL H-Ø¢ü¬ž­æô¶K­ð +Æg«—Ü«²ìVza7›eÏ՚„ ®cϧ](FûÐlåk6ߣ¯ÝÒ´=ÍF¦WHÓâοfÓD¡Enürâ,›®ml>ü +ËæÖ\gòZ¶ÝÚb$ þÂ)÷•lÔ-2à ê'Ùh§s!Ùì^“¯e;{Þ΢eà 뫒M¯¶šžËÖ–­†˜j6Ëo0šÏœ?[îðٜþˆã•|¶›kYâ³Á‡qŽÏ{òÙàm˜õWóÙ®«Ûfî³=Y1T0/NŸ­ýÒkßgk ¥í¯=«4¶´e,´± DýýY€W>@g²ïêONî¨î † ìŽFâãl 2y'éáŽÌ̄ouÕ«4‰Dɔ1û,8ÿ=ïûNh܄ÞM쯽ëÃóM-ö +:O®y\€Ëí?!–Mû§˜`ƒFŠEfŽÙ {½%6úA6°…o~·Ù`i Üæ+¤ÅF:Š°òL=à¿xâ)gNñ u£÷rӅa÷hPNT¼)„/¾šºŠù²„Ý·3n$–2[¢ž AK]cêß˚ÑÌ!T0)ÓLpýéHCìÕä'|ý1nÝ3Hk¶•IŠ,Iý=JⷀxhÀfsDº¼3[`^'íÁ2Y¢–Rfñ3—9̑ց’ + N" ß¹QüXC¢ Ša‰- yâÂyX‹§7â·  +8kür§’#zD$©*$¿>¡€ $ÕaVË&(—=u:G$Z¯x(‡ýó#¥BYµÈb*‡¶ÈeÅà6Û-Ž #ð¨"«ÏÇTàrͲ¢-Že™±î:l®‰”d”-8p!ðY>íój"2®½Æ³gö±€@#»Ï/7À3«”ç +Qh§8 ÜYÍRùˆÌ^*ъŽÈÔCD£G[¶| p1 ú%¨×¥SHüڕ¯íE$ +J.†è ½û?…š½óEÏ=y’ÄÒOG±‘§>cÈ ˆ 5VèÉA֘èàóބ“Öƒ憗ý&o­ïJ¶9¼Y¦|Q?x2LعxW/kV ¼XÀ§•w=üýÁv…2„ a\ð¾§nÆ4÷ûæØ­›§·ùï֖* ‹:Ɯ”4–¨Î(öW[L`Tk8‡$îÙÌÕlgŽôH…Fõ®Ÿf-n'ƒ£b©;9ªÝ-€, ú“]„M5«Üq çU0:.]Z¢u€±¿UфWLÉ8U{ITˆòš…ð’\m4¤”;Ã5ë¦BMœ3Á¬O>åJ »Ðöä‹H"·HKråÚ5Ѫ÷] ñÉ™ÆщŸ$ ¡:?å™9œá–F—¢ù…ð¢˜ržíĵJúØ 2ñႍ$N‘å-±ÐóÿƒöÀ('C…Áæ[[—àR^DÞs*ŒéÑ)*Äfܧ°}ø…#´X™õVâј-›Ë{4úusNgDV›VÅ`äøRé@îšj±0³.•6Wt³)ò67IÖ± f¯ ZÐð‡Ù!•ÀM>b€c•]]9W ˄ upí+äWç^/»I«~Àr&‡n ä«‹ÜÐeFíÜYœ6¼ê}ƒé¼Ù‡ÈKe;¥Ä –_,ࣶhÚµeá¶D¿d%Ë YñÆwJ?¾LNW~h?îK;ïé,‹¬ƒÙ¬€ÚÙR ãC®diË| ?HXþî³ ‘»3«‘¨_‰Þq¤ŸÏÁJÙ¢Bš*a¨hÅq€›V Tàüc£  NË°…‚ü½Ô¨û/´‘{ŽÑôçM:vÉäï¸HŲõ‡ +Pž‰Üü’âÄÐSŒ·£Yµ“6‘z1ÅV+?Ýz‘käýL«Â°r7j%»â+e+¹:còbç&ƒ§1l#Cu¤CDzƍèƒLÓL´SÀŠ…÷R–«Hí?V‰S!‘ù 6ŸÓÅJæ ði÷L¾¯ØŒeÊFŒ‘$™Ü°‹0?R …ÖìŒ@}û˲¾OÙ÷òtçžéàhŠà¸ù®9cK»HDã7t•N&«rÙFØ; w(—žxS>Ü؆R‘ñµjB%Z|hâ)Zû’¤´faTôʾðŒ Þ=0P^9”à«5qÓ܄!Ÿ­¾²ˆ¡¬ì¡<´«{H¢¬ä%4Pœƒf¤:5ŒðŠ÷ rj„xh +ã~¶¥ÿ!H–$­É: Ãö¬×þ±¬÷E^6عeº¸ÝרžLÎÔè(±x,âÔ)ß⦉Wë§üUÓT>Z~b̽æ½À?ò,µð–8t+õ°2¦˜÷îrŸ€ +îH2¡Ñ>ùu)’xû’¢"­¼:· °}zKlKZߎªªÄފsp‹¹# ^ e¬,z RØ)¬Ò8® h)âÄ"ø„0Öjøÿ#úÌÚÁ'4-ž 4´_„bЍ¯ÀGВPphR ÐWèõk$ôrη±–"ڻإÒ3/¡Îߙ$ +(×w-DõÜâƒq)ù=†O3¸{fPÍma0Ù}†h­j§–9„´c“<ùÙ«ï±»ÓМÃ@äd`»:~N¨?ì°®ÆávÚe*÷Šœ>¾ßòª(…Ø|ý&¹¶…¨Ìšj?z©$ õñ\ © "Ï3,ë3ÌßwjãnÚ+ƒ'ki±¯Éš>NîoOyùå¼ø<út%zGšÖ-Ð>³Ä 艄ÏÄ`çÓ+4JŸ¼¯M²SÒ7Յø\r{TŒ ȸaGrWßÁPj%øJB43+¦À¿ÔŒºØö҉•’ýZpèù꺻„Uû/ÀaSÆ*Ë|{‰O}¸Ó˜À~ǔ©Ò k4Šì®e&6­ÿ ûÄ\¥lí$€ú€ÿlêʛ:X'“bJ¸qCôúû/HÔ¤ÜyÁuV¯Ábrtgëí A9?œ‰ø!›•ôQ C“kTFJÿÊ6ˆ4FIbƒ4©Ê‚ȅ…¯ûŠÊ8€l×z·¾Ï.tÜ»øÿ¿&ë?÷–_Bö^0sJ@ïtL/ºy"ð2o»Ü!O'K 3K$>X3‹E,¡ƒ»G¬êÌÀÖs3.ѐeÒÓÈ>‡ïv$l:^l5h`)šì'X—ÑT%͕©ÐÂ ž +WÜ[†¹tî ù•R]‹-R÷85J¡äâû)Õ×á'ùÌ{ÎÇëAzœÊ8å NQª6nî§K¤ÏA‚™ ^yT“Ò­ÏÜèò[Ž§Y­<®õ×Å5¼K‰ØêvP¸¹È,ܚH¤ˆÝoA­%„íë‡3Gv‡ ÄqÜ)ÉeMøì—ÂXça9Îu«Ch¥{Uœ€¥uò™?úå‹Ò·! ‡Åzã¯,µ€Ð`?¸4;I¯gŽ.qˆƒn‹1öãÐícóLSað€–àÕtÏZœnÎ'u·eÅÆ€FH,w/¬0¤XÊ[°R‰UÖÙY†b† ÝT”tفViJo {G×ޏ*þ؇NDåþ n­·%•Dvr»£”yžÏåcÜiB¤fw±!v¹Ñ©ÿ?I«NÞ¢£X£˜£Xe0aXcw¸d‚¾AúU iŸI+éUØA™_éãg•]1@á5ÄûäMH©R·¸¦Ó2Tm¢ÛZ”õIʉëB'ŠZ‡vÂêúO0ü?±iê[þ[Wu,—…Á.ÄÖ:p¾`n²E+˜ûôm~›—L­ÊΛً%öëÿz,ÓÃHA®SÎ s¼Zô„x ˜œLh  ü©ðë-{(Î:úœ´¹¦6ÿ`¡ªïp¡pe«Ó ;BªÆÍè: 2ïÒì‹MS`R]œÁú :ïpçjÜ@u©ãë?Ž ÿ¯ô'ûŸ™èè?d­˜Ø;.Ÿi'[=k„䂘ʇž‘ÿñ+¶RÒDÛݡᶮwš:ì!œ(â=8DmÚ&j3ïk”à¢/óšÕ  C“«™¡é9ê9¸N¾rŽ‚'4‰³Y¯>ýÄ]=ÿĉÞn–UkYpª¼ñ07âHA³Äƒê;Ö$žà0˵EkÒ +lÅ${vc,¬è("c­{£”$õva8Ýæc2=|„GziæŸÅ-»Ë]# îü½± e Žµ(MKŠÝ %¾Ô_N]ûcNº™'m³71“$’¶47¶,b÷s óÈڟâ1{†¤˟† —yôÊÀ_hÉ~*ÖᖵÓE©eê|œÒӓçé#~v™•J¨Z^’/ðC•vãŠl ‡çÆ­&£Û?gq£]÷;!h”/ ×èå®Ø ê!(ò‚ßÏźVÜq€›àŸJ½¶þJ+뚜އÃÔUÞݚíËÚ¢{\ØY,„s¼´X­GJå"MlCUûò¥°4­s䀜NW6>ô¼9=3ùîíҀ࡯5ïÙG®4Ûm½éé,Oøçt¹rvòg +’lªæŐÛ9ÏýD)H¬rZayzpÍíuûå(°ŒMF‰Åß-`UR«ÿ”ù‡û}úýòOÓÎÖ´ôÕ®®yo•˜[¿9»Ðv0U÷ÍaEˆŸùjˆxÑhð TŠDžZeé,–bܤκQ’¡&|£A&é%€BU°ôDzȖÒ+ Àý0‚äÀÍAm £|Tݲéø¹”íð"rÉ°–?áÆCû(»["eÞù]@«T¶®^Tî_ÊG‰{1§R¨mfY¿¦D9ÇüUSv™RVG öèe%è‰uN­’Ï~~*19k¬FmDG¬tÇÈb*ãˆ:ú$Iv2-Bɘ ¦9¹wŒ*φjå3esÞ/zY™•„§’ž©RU<«ìQWù×+áÙÓm>}ÂuÉúé|+çp®<+R×ñJz屖Œ¨¯vööÁ çµ '–Ô G}i8RÁùo`±1£ZFYÆ"Î =³DµÅ2F•­Op§hï¡ÕÆ9 È5‰»ƒ÷–ŠÈ‹_á@øT|ð!‰x¯$ž0zo•ZÅ /›ZÏ/áIŸ‡-­OoZS‚vÖ¬s2ëW •µúɺG€MSÞ¡N‰5ÇLp[o˜©ÿv˜9–YIç¿Zü;Ñ´übG‹±éëéˆ2‘Տ¾}vDåTa1<«†›eö“…yB—”é é c9¯qۘJ͎)h)>à¡úôÂobÑ[¿Ø3™¹³·²E,^wŒ,µëЀ™™¼†‚Ä–JÛù—S½†0(ÀHic8 ñ:þµZú—öcY½,`8hE­õà"=î|¾ìª1…Ä˅B`…ð¢L‡Ž4Äå€֑ €X Ë+Jd.gR]µ²®´\Ô§ÃØw“a°âoŠhˆa¯;á°-šxÔV•¨@J' °íúN•†—Í…yø&ÄéÿÄQ‹xç•×šä±¬Ç¡ÆŒìÁjK/ãϑi<&2¼ÈÌSŜ y@1Y¯Ñ­AÝ Uþý~ë3-€e!k@šžåw/ƒæ +±xtòIA˜rZrÓÂ)¯[Îkµn90ñ¶ âà4v,§ù$­'[=t֍Ê|5äb“«b¢q5ÓõSLp°€•L¢ê ìóØ` Ù`ΓÝÿ¥ò±ˆ“UŽ—îu±.0㐺dµA|-g¾åt3,Ĺ&ù±Å®™|9ô CÕϗ¯nõ lÊÈ0Æ3NŠ÷¿‹É€ØAwÃÇ-,›_ÒgÄðJǦw³ƒlPÕFß7¸Ó!ãô"Aðä¤d¦3(3$ô!7a‚'óÄ%xr1Dƒä4jüd)«¹Ê–2ïJÌ«Æ£ €‘ ÓÇÕûkqޙ¸øûŒyñ±¤ÏˆG¶\˜H4±„§© Z ³Ê°–CþÂÏü8½ì‚ˤNVÒ$WԖ-,8˜5Õò#|+1<Ž­E áŸ|¢ †é=ò­‡˜²ô_ˆƒ‡X&9ÝDéØJîñ1‡2c~êÀã˜M?>&W8ä*êj#ã']²Õ”eY–|ñ0œµà'·îÏ£üÈ3^ÝÉUð‘7űv¨­!¦CèÃu ·*‡Âº°&²>ðù@!ÞÀJ:°ƒdT˜¿1 ä~‰'52¦>&LnýüåÓd`ý¦’³*°Í4xÞõ8ÂDÁCDì¬n]0¸ñFm0YˆVü):Ë=ið¶–@R”FF]ƒùêUÛÈ,ŠRÊfÈk«åúC»)îg_š)”üPÓ&ۘŒ/ᖻͶ fé^*vg½À—X“ðËÊH›8õ¦ä£ìL\hE]FÓ"}:òorP¤¿Ü×o“è9—ÉaÄìÿãhcp,1£šŽ‹£{m#ÎÑëG½yé›!óΛ£/…sGÍÿUÍ~“³¦¬:·åâRóŠè€€)!§ýwtD2sÇgZºGüÙ-ƒ±A¢R¯­‹—‘jòêpÛÞå~ÜN*'ƒýüvl쨃u«i7fo6‡w£«ïûö0fM%cL[„‹Ÿõ´÷yÈ)Ö,¾FR¯Ä)Ÿ]ÚkþÂܛ³[QŸsU^M—Wy·<O`Í +yšï=”Õ".!(…4߃ÒXF⊮’Ú«Ÿ}ŠùZ´–|m\mR:¥qKƒ:²ŽJ%>|_UJ¸ÆÂÁyI4÷‡±ö9óÛyô­j\҈¡ Ðf+*€:%K·‰f­ÐHçžÞãG%DSú“ +”0h5Ìõĸ®*¢å}ÉñÏRM­f º1\ŠÉ­ìÓØ•-ÿ+·¿=Q¿`—–²i¼ÙÁ‚Ÿ‚Á«ÛȺQ™ªpZ_|Úé6Ø>™&8Ýà·H'NjEàoÌÉ欏9æä®GÛ]-÷SËøÓ2Õ®Úzq‚üš$£T›õBh(‘nú+¶µ®R+©áчê¤>µwM¼æçx]ÉyR·5šÆê¬{(æÒni`N¿[Äÿ%~²„C´0r¤® )¾X”–ŠÃ[_KÞíüòVÌGÙ!á#3){  s_9æXjÌÐ&f«ÙC­z‚˜˜L´¬ì_^ìiØâÑ(¦U#æ㱀òÐÊ/¼ ŒJØÁ=0]Œä¡ÅMý1RR fŒ»7öKÝÆõ‚a±#ôÚjÅaIœ¤Œ•¤Àv=B¸ÁÏ?²+e|H&N}°yé?€èºÃM-s"S“¨è…D/ /XIE6*À"ÎÊñÆé'ø¢ˆo\R¾>4 üíðÒ2ðä9UŸ \‚¼¨ËÅÚ0À ê U!Öe ÿr,ˆ¡7 и?"‰¤@úv4asÙÒ\g2—̵ xLóøúÊ5ZÊu‚ã3ÊÔäŠKry›Õ B®5b()r…\\¹çÂmžý¸þgÁáFüDV˜Ǥdýt͂lã;k”Üú췞S$n™[·‹m¬Íòa»Üt…·ÂO­ `V|·*kN­í›f‹ô@¬ñIªàšïTh²÷c¥¢ÝQa«¼ˆWÖ0,×ɐE…p! S‘òT¬ ID‘8< gݱUúä­B0×¥«ÛÓ×]'t\eZP®åRkY¬å +«eØv[ȹtÓeqÈö)бLo)뷓ñBd7}%˜óÏ7~¡5ôBÅ M/_ã]¨ú\¨Ä[(´…¶5ñµ•…>×ÅhØ-ñ +uZ¡Nb}\6‹´ú‘Î'…:–½œt(-DÇrb9•æo•æÔúmaZ{YòmDM0SEKŠÇb䃔Ý8ÂØ1Н‡l#É©€‘×Y¤Ñ[L½ÅȌ…b/íc¾èI…xsjÛÉ6ÕmX¤iø2“uò +¸]§_cÍ» ÅzÍÓ¤$¡6û5™TlÈ#†þd’Sp¤EŠŠ¹ƒFùh?|$Uœä[ žü¸Eóù©¢ÎÜ£„äßdPé#j¼Û‰(K ɵfD1÷ñe(V$ɺÏ!-ÒØp½0¤ mË ÍغNӚ…bƆ~\Ã`š*˜Zv`ª—Ò ˜n˜C“AVüKíâ û AŽùR ^#7\›{هÔÙCÊ Ù4On é‘ûËÉÑXå1K 傣Aã(ۍڏ§*~}˟bÍïŠókòüImbwNd½¨mî8¥¯ÂÞ=j¡Ç=|¦Š1«(!þ<¡W˜•qY½“‘p +2،1¢ŠÕ,½Œ JÀìþc©ÿ­‰¹ÊVˆµ€Ïâ¡VSšµj¯ØJVµxÅJÄÁ* ôኻÕ6M‡‰*Uõ*`Õì"ªx€õœ×FnqÇ#œäâÓBöë¦ۗ)·ZFXøÉ$ôl ­_¾_ð» Êޒ9'aX©i$!*#›Wê<%<ÝEý~D Q5sc-ŒLSȬËgåãfÓ÷ÀÓ±º#7rŒ7c¬ê¤\{²]©5¤_ñàhðÑ|ÌY%;*1È݈$¬#ö¹Á€IŽÐrÞB)š¨]à¡2÷m~”4>=÷çƒ,Þ¡ºŽ7ƒÈ®"·-–ß2Y.GޅÇ^²¦g§àžcÔ#h]Á;û’\Ó«Î1Ðfüw¯´À¹uý%1¼áõw#Î;*½Á…ˆy̏Ás¢1ÊsTï š&zY@Þ½…hôÃ(üY‚´$ðC 3„Nƒ ý$͸*ÅA̹(Õހvy ½ïúŠRÿúçtžÃ6É"J¶¢Ä€ >Rß¹Ë ©Ý‘{mEnW@nàB.„7¡206œã¶¥hÃU + γh²u{“¥ˆ? )Í ?:oú—†¤iiCr̈́b¾åâ#`L²1tkY’JGqÄx·1Kw›·÷a[‰iKH() þgÚÁõ‡VûœÚ(PÒôð¤uƒhi[I^ÖáB’:æô%+'Õö›³ük†) «²h(‘@؍“¦¢_ÀÐ tʄý?ZU•Ö¯‹B×/¯›+&hb¿Œ^Gv+63p÷þ51A6L<¤nQã DÕ@û#Öz5×>Pì)%ïµBâØÁ¹Bg•ÞDôã©·¯x4±cܳIùCþR]Pªá®žå‡ô/<“Y†8…Nú>¨ÓùÃY*ìáÜùf¤‹P¿6½ñªÕNvT·WoóWsєÇ\x6ï¤qS»²p© Svr©[}.;3›:¯¾˜ç…A·.mÑ8ÛN֒MŸÇb¢‡ætÜ·R¬º¾XâÖ£Gˊ¢}%vîpþˆ:èïpeûë<Æ­>í<Ê-}ÖyL7E™›Çéj(×'ßç<þZ²¿òŸÜy„h¨íï´‰À6sÎÛ»«D€¥FŸ <Ó'ua¹ám@ö!¯ÓT›"t„±M—g½±€2ÀȤ+ÛÉÄb¿?[Ó6¸µÔ+ ÍU;SÍèS³çQëÚN&¾†±´GÒ·KŒöh íJ`4Å'K%îðÌ):3$œU1àï;À£N~Š™Õ°—n/vŽ²Îœ[™J2Õ5W¨BfÒŸ}õ+¥Ž³Y«°Å ô5ǃ’ˆ¬»à‰t·SÀõmÙÚíévRg¬ªYÿ°€ð‰(%e·+tÆ " ѐ®|`ï ¬'áþ(U¥úf˜½NEA¹×po1ûëûïH8ˆ‘a¤ '¸›Z("G]³† J¤pH?ReœÅqáI6åÂìþ"*‰þ͹·Œá°máņL5ðઘñ°§{‘XT݄fC-cî¹B.MÁ‹@FV2"xg•S 6ÆFüxŸ>Ä/CªÖ%’tE)ö +§.öq‹,öt#Zìãö}±Ï•³ÿ œ¨ ž«°ÀÎëÀè(BÀŠ ““““ Ÿïo<0ôÖxüÑ+Û<=9yêë¼yèvE´Ç*WŠ` —tv6ª×6f—×ç u =‹–ã]ŽÊaÅ[áÎQ5°¹¹a¸œù(ÜC0â +žÃÛýOD3ηî°À˕’SÁ“1*YPGQF·Å‰_ºÖ <áÀ¤Å ÊN™-±Ü!%-#xkáŒûöO%6‘òûZ°ÚUâ¿Åpê›1©¬\8M¸Œ.QBÅ.“¶\«Yf6˜mUØQTÌ-J^=Q)EV‰Ž±Áa%ʵ¯¢ß2<#„‘¸»mþw½ÆVˆý¯Yþü7SÑø‘;üՕK ùç7?òè/ÜìE1PûÐ ¢‡®F°v¬V4È|<¹!¡Z™!›[ƒ`.€ÃBSn›Ð( q‹ð=4éUŒ1hۂؖÒFºÅpt²GÑ'¥ô¸nØðï¸ÿÔüÃPj|‚vÏÛË,Ödüb@÷U& ä¬Û£E4…Ì!-\ÊÀj£³¥¶l`†~D.?H…9Ø6&š†ÇUÎÍþ’Û²ù´óŒDßHߎdèRB%fuPz/XfõçG̪R¨ò˜¤ ÷ÂÛ$EÌãQ°9„¨ê3BÆ؄ZÇ¢“{ÐÑsGHSÕ#ðˆ& ×Ú_V–ãhinq!g9Õ6xèë ¥i®†]J¿]㛹A©À”| àҖ|] ¢•2‰IHa2ý%w]Òޒ,É]I`•ÄiJÊ%ݓL4ÉvIB“ääHv/’'!iÉøÈñ#ã¹Þ‘ã)nd³‘iËȌ¤‹T/’n‘ä+@‘š‰<H¥ˆ,Èê!ÿ!s†<`H……$RH+!’«Và ³Zƒ´¨ùut¿ï —Ö®”Lwòά½Íuˆ—!E¶¾dIÆ#Ûë =Š §&Ç%©³'ÈÓËŠdÄö*š¼'k=Ð¥‰S¨ý3®³êuõIê°ÛÀܙg 繟˜~ýõC£¿BzÛ{L‹àÊCCBe£¹`2Õ=8ÑªÐtÍF¸³å®ª’h¶Ê@Çîɶ§žv!¸ O‚Vî [5­”UL‚<²xjgíhóM«q¤"°žýAI±/ÌîJ–?S„ÃÇF쩰࿆UÐp¿“ÈÿÌΧªÄ6õò}±=ßË2‰M3Kðk°·‘³½rô!wAþ(áúÞä:#Ãæ»úÇù7åWi$¾Ðù³,@%—î` •@›qD^\¬¬“œóûd[˜¹S\BØ´½øÿPÇyIÿBؚ Ù,ŽÌƙØ曗{(ä&X÷·^JfV¨®Òg5ß"[wuµ&¨÷9¶êƝöaÖÝ/sAà×1¤%oø/Ÿ4ʱç…Øeå)œK’9ð‹2>a£Ëá!‡è€ý­Æ-Ö²Qš¾Uù{É>+…/F?ùäéäG[9–iÜClú¿l †ØtÀþÝ[dRög`Épú˜=ö†Jò<ò.E6 yAáÒµ:º(Y5cܤ$¥L))Oò`Þÿ¿õ!„ A # +­óQ µAØ "ºZJrÙ¢ÎKTŠƒC±ew<KLOIÞ©Iéឮ ™è'S떠Ô-£…Á¬tŽÈ}¢œc‡–yÍ( +6à@H ‚ "À$  PÁ%XÀ'@,€ &°Á P`€1"ô'à€è^ ul@|ÀdÀ 2Á%P#Ѓt ƒ˜  H°Áˆ@¨` Œ B°Áœ`l Dh€€˜ €Á6x+ Á`A4hÀd@‚Pƒl Á 48A$È@'A +pÐÑT–DfÁÒÝlë—ÒqÞf&ªü-¨8ñ/jQ¾bÆqÁ Ü@\0®É'Ëü -ØBbd1ˆì<W`VғGÄ9ÃÉvºóìØfúüê‚Ø‘ƒ,îYþ#ЄŒí?d3öcöøЉ¯èʼn#B;}SUZˆÖ&*~CÓ¨â[Ôiëㇸ ᙼÐp†E/§‚câL¹?£ÈÉ¢,aW­ÕS +ƒ&•dvð‰h\ö‡×‡™ÎXSOPÉܕRi%tÌ:G6@ŸæQ´î5$EžFG.à…?ƒSëý~u‰ºò¸­;‰"Ðw È7"15™z¼Û¾Z4Ï’`œ$ Wƒ›ÐAõ\ØP['þ±i=˜í¿Ñl"R(u8¢äÆ:ã¢ÅlWÓ)Vw 2ò2+N8n³ØÀ‹s2ÉÐâUy/Ç!áÖ8F›†QGŽiûêtJn˜ÕŠ…qiîìN‰l©‰ÓÄëÛ=`5‚(R’œ^uJhܜ« EZ4Ž\j$yË´“—sWNÅ¡ZÂFñ¸X}U1 +,‘“øã:RGT‹¥päNyêyI¿6GJNµHr+&= +˹#C³80’‚G:IN‘¶/tɌ— ¹à.t,\XB#ًÐ!$”ð@ê¶ìÁùG*<M&VáNAÆChw°»Oª½Åò*µÛa¯ú©E;I=Ü%2»·úÌq(ï£'ô#]Eûjöjã­¨ñ…WQµÑ´ïµé3úîjðÝ£p;GƖr3dÖká4XùÐNq”e™!Û7ښîeÕ ED&&¦Ja™‰‘@dIqFJúLú¿–é…ò¸P`I˹ʋ¬¡ +E­rÒîH,rírZ‚Œ)˜ñVòZ§4åRº65r’|4͒‰¨Ýž«Âx5{$Úã+Ͼ‰~åýBÞ§æՓ9Æ Ú¾ÙîI +Úåӌ1$¯¬HF>dý%ï8uËÐŽª—WMKP¦Ɂ4zQÍKšTÈäÍÄÿLnOÂÛX„É㊛8ZÑw)V8h†ª>ϐ„å4¯’qQHÌË"5’ƒZ4$gI0ÄÈ6Ÿ ˆ¿U_m^îxЗnsÅʐԩ kb‰OYâ6ç%“¿Ú߅(Uå#AeÓwb¥æTŠûUö|ÖvT#g+>e!zÔåô.™úÇá( w›”-4 1&nT>zI8ÍkÏ´Õ-¦®©z>;‡Æž•Â¦Q£uejLÍc\²ë¤”#ìRç5߅H8¯ Í©Šø*"÷eSߞ§ ’iЋX§hGþýáÁIw&÷DOÞóÍ(X³YóŽÕ•ù.1ӉyÌçQ^-cGl¨'9-ËÁ–¡Y(øò7D‰{V;˜Öþ›ˆèœr.µèl"$UmÄXßSe\êŒy7œ©ÁWÍb\h¦héi½Ô±ó åp+ò݉¹P%XAwۃ!¢òu*‹NÒԁ¼²ŸÅžc Þ\¥¦¬[A¼× + +!";ÛpWÓñ¼d*¤p_ò ÛM«ƒ¦“¸Dфm9B’*ϣÖjÑ m¶©A‹ÔDm";x:Æ{ ù 5Ê$‹ŒÛ]W“è”-!:‘öÚO:¯¥æú”d.9w{(Õåö LS/¤h×Чow0™£ º–RÔØDæå8¢£ùæ"¦˜úD;À +£ÇˆÐCFɈ¢ ÈÅBÑ¢w»”ièQ;i•uhLC¡b±Lt.–ºs—Ë”•ð–2ٰˌ‹œ—¥œÎ_Rªy¤š×¼Ç¬‚Ìm2óõDåD°à@Î}ªJÍF†^ÓºbˆæeăEš'*ÊvQ-ŠÎq¡h(J¤%e)ÒÈ*¢-Z/®¹*q¹f¾#Sd!Pªq°è›Br’ßôÇDsèÌÁT}ŚÒLmVR¡’gJê—ÜOC9|¹3yŠó};Éäàœš(aRŸ¢ +~ã9•'#åNÌ(K“ÎGˆ¤ R›rÖ`˜Ê¨¼ÁêPDgùæVÅ>}J/gè"ñå!äèºûšbÍ )Ä¡ªÛ•èÆ …™™‡ì²?˜ª$è%" ªË÷QˆSb""ASâO•ç5ž …°ï¡7DôŸSX•š¦íö¡w!¡­I¼D†Pè#sJëBŸïAoՌN3*ڝIP™§Ã>bCãa{û š¢‡É©Ó2C–©i‘;’_¶Hv§Þ[4³êېþG’èö¢Å¾¦0˜Òð„7Ȫ9m¸¤Ð4î³DgíÛBŸ:Z'š.y„‡8%/¥V'J‡¼\*Høu`† ߤÑóéƒÑ¼S—ѐRð¦£.¹g¨„‚çi1.৮4Š#§0ÂÐÈÃׇöU£ ý%#ÿL² +ÍZ(»h™ec£ÉŸMj-Œ + +U)7ÖâÛ sÆÕ~9b¦NŒš0³=†Û\†¥*ÆTDñ—ÊÁc3‘£ÙAƒíPGä Ã*†`« C ÆB.¯¡¢”D¦÷xNæÕÏÍꯢb5§]ÄõÚy;ò(&´íÖ¹¬B;«N¨ %ùA(#dצƒ±ˆ”<ÛA½¢l˜©—Î "™(^ìWgÎÙnDhÍ#x äÌIž=xX݄™ QԅP¹ª ñ†PʬIxL93SÄy6l͋¶y'×´¡dŠ4"pæÀ¬F™ª‰rç “¡ÕæÁ“‰^(Y¨9X”q²x nmº,ÐØäy.äeúg"C´·$ Åò¬L4ä…ÂådÝìODTâWž{ÔjðÄøàtÙ6þÂ,”mGJ>pBÔéeñÈTrÅH‡¥%'¢âŽ+?(¡•ƒhR£i=ä !Á1REu²¹ #d´U5õ ‘d—á^ø‚,“œ¡êō4"Cõ€äFLà¦j!ë]L›Àº•Fìø_ˆ Å»"Ȭ4L‰‚Ì„ ×}´[ÂYBVBQGU“2Ð,l¡WŒX¨¢C.âBu‚ä2G2 ž0C«&䀺 +³iÈ¿¼ª3;¨²2Š\‰w#UZYlWP(jøT5ÍÅžaæ`$Á@ê{0¥Ò–!z³qfÒ8H+ idá .voDqIc+•¡‘î<± µÖ?æ]›Ð-a!1iÍ bj3Eªª¤D†º0Dß4é)b{0ào—¼³j˜˜f曝 +‹šïšSX´Z×rÀ{Ê *¡W/ 5ä ÑíÚx¡S‹ãÇö@î ¹ô f9PH%Ƶ9¨Ö(â4ÄÀó <âslÝܓù]ç÷·œõ/%š°þå†HÑßtªÀƒII8Hæ!¢èØ0XÊsS(´‚I(¦¤à~쨉À±5ìªK`µ¼†«ÞÁHiØ£Xn8°¢¼Ú¬rdoLÓWm$Ô%D2m“Ø.ü¥ÑÉ=‘Øšå™é„Y. ©NøÃKZ–SF!â¡™‡VÏi]˜·f†~|:}…A’šÎ«62Êih© 2Uxq~u>C³ˆÔyiU×a\×H¤H¨l¹„xc¦±½ìŽtDõ)&¾**S$œ K„Š–ˆo×00ÊÅc®m*¯še箐Àa±ÊÑ&©ÅÚ.'›¤"ŽPe•õ‘ 5cÑ'œ|ÝH'îÊ2Äÿ,#òÎhQҐ¥Š8ô’G¨ñސ ++ã´çë("”UVŠÜ\©9ÉŸ ÃgÆóҕ,© ©'C› ;±)N‹™ž A$!Òƈ·Iɶ¡‰5B£HªŽÐ=™‹× š’X•N•;«ÍÃ*ô ‰­.aòN¨ÖW'>#qÅA_EˆÈÄi„ÂTLðC+ÊÌ?žOADE%jÞα‚Ôø§Šª¹4~^¯ª +DzªÆåô@=1jE$ %GTmßÅ4DãP$¬VшeÈ=K6DÆT$SDö(1bÕlFDºRŽ )‡£s£‚¤hLT{PmŠ¨E¡(C]B—)ÆW¦ Œ©ÍJRj"˜Z¦ÓV›¢§Ñ·b• +¢½±®Qqf‡Ú‘3j™'lÅBÈUÅßÝØ%õ3>g‘=•™nÁ2źd—b+JXÕœÚ +Z±ójm%Ô¯jï<$aS¦ÓrÄo’Ór™r/â;cwT՜r¬¦š¿¦î暡Tá×'e\¡µB½^×ù¢Ö)]EF¼e™çŸïq"[dêܞñD,·”¼˜>â¯$MH)Š‹ªšœ/¯ß'Â=ÒéÛ©¦}Öwқl™,¥f‹=ÙhojIM:M[ÿ&£Úß;Ë!ÙZÁÒò®V3~p‰LÉaˆJ"ß ‡Êó9 U¬n)F¼§Ë!s—SYˆ4†Ä=ñ¡RðGþ­¨¨SóÉîŸÎ1BTm¢jŽ¾ŠÄ?Ó¬ò:g$¬VÒjâ»BE#&ªBßDà¥Æ‰8Ï ÃÈ›D'k6‹‡YsS¹˜ƒÓD¥B£in‰%hÚ8‹æa))©Äë5Ê%j”x©E_¼]‹²"yH/¡¡ÈHƒ»)Eqˆ2.»RɎ–:„Jb#!J».´\ø4´QK£³Ê²[åIcd•  ˜ zøã)R*h¤r¥Jd†F§ªCµä%Šˆ:tÞm”¢%›b$¤œÎ¸T†\ó*J¢g6§úìhLAT’ò4š¡ÍЄ©´©iÌ̂â‘Í=NÍISQD¢Œ¬E™aïb‘\vbæė&J.5aø"MÅIÛä)9ƒÈå¨`ˆq¦ + +O‹fÉt?M¢Æ4eÍ¡Ô2MÍ¡¬•§!Š?jŠO&NöLԇê…m†3țsÞ3$Vn—g[¼´] Õõ¦A ²?2¥H?Çù±ŒŒEƵ¨VˆìÖí𬕛•ÑúB‚¢Ñ’VÂôAKã˜íã™(†¡èTMQ7&g¡&W–cFâ{Ç1ŽÏÉ1žétà*«ú:Æ#ÒŸJ(“jãrUØì`¤@èØG }a>&òÌ°äxf¨­i(ªyס×TæµM‘tª$TÇÁ ,u¦¦ãˆ¡uc™:ÔºÕ06µ1ÍǪŽ`Øдᱧ*Ík&j\1Q5!Ü©(’†h+҃!1I…ÂÌ,ÌÔ4T³ŠŠ–ˆsµfÈâYmŠ¦Hæ+YY(RBN=)GY†Y:ÃÐÁkÁ•cV³£*‹È•B# +‘í ‰à,? ÈD[˜lþÔ-~T8öP ƒ¸\îgáV¾ƒUË­Ãæ€Vw½ŠA€p2Ìr 9x™ªk•B逜 +Oî +®ƒ¯·Dƒˆ¼‘§£X- ÕgÆå°Ê¢èTÍU‚¥K§hŠÆÂ)Gª¶BeČ<!éTa„Èx:…/Þè!³® +}SN«ä0î&ÌK­pîA$¡Ð<•Wt– Z#×B#S#Že–À ±|¦l4Ýÿš²I)y4ž—§C=Åõ'Jh3æËQ+‡ß=âå‰f©õú µ,Ikˆ¼‰ SÒ_“\•x½ˆvêD‹hNÏ:C„jsVÌd‚uΌ°NUý2‹>B5e?rÉG†„R +5—CXrÐV:äÅý¨Š‹:,Ñfà„¼Wvz„¦¼¶>&‰…¡šŒÂc‰8ã‡fj âÌ| 2Éå~D6ë> ·XÊ?èeå¡V°d"†%UE1Âh08¬’rcVDÁ¢˜kܑ”¹’à 8<†!¯ë:è¾út¨•‹ÐlŸÆA/O1½[Iœˆå‰‘I§ø(2U\åêP UüšŠ“LU¢¤(n¥(%¶¹®B<¿¦¼òf¶e_SW Z+šº‰®‰z¤žÈ$êœZ9,¨Hä@£‹j®(áXåq/嶨ÊgÍL›YMý@ú + +¿c‚¼Ò*G”›ÉÎòL‰.¬ÒäCTb‹¯"vÝ:,¢¸HŒ5–ÓfÙEJ",/âR"U咵_¢Ä³“t“ +7¢~¢ú©Bõ™jD…ü‰  =?yñ?t6ªÏ~Š•'Èå Œ±<§RHÒ§r°` •+ÁЙ´œ‡Æfk.žÒiž‘iú\fúrÚµ4|tÚnMú´zmÚèçAD´ÐF:v±1wô)L—4Áª¨¨qŒ¤@­ÒˆCkxñ¾˜(ÊË&"Q\D£WYâjLeG®›X¢qñ²zp5¶Êº&JÚëAÞǦ ™¤¶ˆ|“OªAŠØÊñ* +Cù€6¤¸«b©8фÍ̆“"ñ<ø(V$OÜäò ªI¸ûŠîŠýÄ«‚{г>q*rvƒa(.Toˆ¡=ªpƒ*ÎMy5äI‚©ŽW( K(Š£žCA—X=ó²†÷@b‚—¸ÉÉ9tàš(Æ%,AÌÐ:ØăôGˆL†±xù¢x³9؜ˆj(e³ù碃ª[õ°ÂÙg}èTOBº©ˆ­yÑÁª"R? [Âbæސe>2{§2Z=I(øtP¹H§Ì©Z©Ó¯3\gTA$JÇBPiçm+”tŒáí­átprŒEû<âCz]Óú LUÿ?¢7¢$3oEI8&ú„LxðbÇÁ¥ÚTö„$ö2¥ UsÉ.GA¨ÛÁŒ¦%i$øóÔ\&8ŠäKŒÆùì~á4|ö +>«â}¿߰º¾Ijðù¨"’©ò \d|æô!†äå‡xZ4öV¿¸»H—!Û¸Ëi|Š§?²Æ_aOý– =¤g9®„¤&¬Ø%Ißûš<ØÉLN_p蛜m'÷‚*‘. \éöKbe×ÌfQ)m +… ‰ü± Ðk‘½åUP§âUàJ#¯£B¹½ŠMò­ó—·¡ —T.ÔÐY½ˆNçA!EÄlM-dÍH‡v'SF0ܖ¡ìŒ—1¸éÑ»;5‹N[¿Ä¿‰Õ 'Þ¡Øq‡å‡Âٙy¥Æ,ÙKhX4ÂIC£¦æŸóŽíiÍDZÏÛ³Ñfâ|L|lŽ¹'%ó^|S+Â&ê5dÅX =I,>®úCэÔP™ŒW1ŠDž(Eºœ +Koº§b¹.¾E–*>Ĉ³fè²Ê¢G U|ˆâd<—¡Kú9d¼ÊàŠlÜÅ"'óZ‹Åº(fC:-†â'N|ŠR svJܟ.Nä²wqkDÃÉ[šH?Q> K.å”ä\­,ÒæªyŸ×½¾Ê9’üãxä$‰3¬ÎŒ£˜!7Õ¾‘ÞÁÝÁË£D®Ê*í5·ä,“‚û„3{?‰ÚíEiŠ¦­‰’-9ÃyœC3äȇ¤Úȇœ|ÈrKùJ™¼JŽL^¥ÈÆ­«B.¤¥Ê¢š ù„ä#‡Û+è*7N÷¢ÍXÞ½>*Ú'´ïó„ö=f„¢„jß·¡z±#ßÃóÔ7ü>nˆþ~¯ Y« ï)éø¢ÉÐ%WQÚæÉ.Þçáiö)Æ=·÷^Oýý½یEemJ5-2âp¸absÅBâÍìR:òÖëË£ò™ +ŽClì,m¥•&•Š´ŸEڍ­lJ²öü¹Z 9(oÚΚ´b¼iRå=#þ]?çñ(2+>döxbñ;W–ŠP_«ÄS4NÓÒ=F 骚™Q7¥ùùØjBÖ¯E­i¥í¤¨°ÍëÌ ÐðU'üjµ“·M»ƒãëÓ~O^!ÞëQãó~?K´ó.á£6~3}¢·Œ„rB–>¸J/ÜôT™pÃB¸ôÂQ­šœfÚÑLOò†‘ö2êÓÑÃdҎ&k˜Œz‘Qg!ë‹3§$«ž½áiVeå'G¨¬œÆn§ ·q …EÄ}ÆïU»k†ŸÅƋèå+·Î³«óæÎý|qå¶V¥îÂ)®&h¢6=zŠ¨@.ú‘ž'~ŒÅÖwAÅS·øLIÛHðT Ù°Dïôæ®ù3’™‘™é{|4uDA»&Ô¡ªW-J‘‰uàíûæ›ö5¥®"\ûxTµ'¢¨1\g‡„¶\F–t`5ø©…÷zD.ÚïýQ£Ç¦›|~õaÌ,–mÄ°l$\vùÖG­ŸW鉶Ç7&¯Öñª#R/¿Ó›Œ÷yÕ:·ñ‚'éÍ*j5~µÕp~~µÕˆ“º©2Þ´zp#/4KIˆ/~¤SÃw֙Gb +NcbÒ¥ÂD\ôÄí–E!¥úvsV¢'nèáâ©> 4s\FŠ­¸Ðdz)C +å•"?ÚµŸ‰¢PŒE~4>Üñ¦S°}M­šs_Ð3 +«f¾ ¬Œò&XdŽ{”2Ý0¢¦ŠÏ‚ÄÌ@r¦‚±èpÊËÔ,Oã¾C*j,R…õCh!̇é +.ªHÿL¢$¢(ªðg,Íú7]±'b÷°!T"é-ªäLdfľ©?Uä1dœü;ˆ–Mä2´0"ß°¤¼yÈi´ˆ¸'ŽqœBBäƒFޒ[È#/Yù“Óñï *²ÚZÉÕZH^ÿª¼È¹ã5œ8‹]œÌb8y\‚pҏdA¸;zr1Ÿk4Š£¶O¶S°´‚to͍NÁ r¯q$ÉG2(H>ò•N?#I.¤ÉRÉi¬¨å…Á~xù…ò e½…KË9RùrI ÑÝ#¡‰«ž¸ö2™Oæù†,Ó¼:¯åŽ9´mÊâamfb¡’á¼–íR—NŒÌ‡8—á…‘á%yILæ-’ÀKÅüò¡Ì÷-Â9©Æ҆åAÚ|!%DҏlÕӌÁÎhöBSíØÆÜƨ“µ¦•Õiˆ=qÈM̯«á‡F¾´ Ý#Š¡uØX_~hãK#³á×Ébä©{°vvAlP‚t`ƒh``‚p€­e¨‚Œ›œçBC“Ë7‘žmÕAͅaÆE?“ܤ’uNäÂÀ½ìêLqÏ$ÚÓJüó:¾ÅÁö¿þȇx Gšíþthóí•Ú¤ä‡!‰t™ùk0ƒTJ”Z¥-k‰8á³´ÓaËQã[Q…Ÿ¥¡šª¼†ž¢n0¡",=ðevŠ;dÌd_*[žP1–D¾>%8¡ŠçàÜ*aÙŒgÓҙª„¸`#>Ð*‰i¿Q<…*+#)ô\ +•[®qü8@Œö—/§Bã¸fÐ¶ÎÚùBRÃa @+Tô0Â2+ϐBŇ¡w +e#Ÿ=§mñ +U:n¼þ Yl*MŠû!ÉX +•ŸY´€„ÈÙøʪ?üÕ&D„ M¨±žÕBæè«&)'TlŸ¦ý„ëᄪ€ê”‘äò«² Õ©‚ Äîð7'TÀ¬jê¹w꺚kI8¡ògÔ¤ÒJÜ4‹9üO¨â˜7VÊ|U›‚e)TB,‹3d£Páû–ìËU§Aý`*ã쁆læªdT"õ©¬ÊR¡Ò$Á¯!@ñ㶯ªP]¿wï +ÙB¥€lûIÎBåÃð—à*¿,T<^”èy|ÕU=E‰ÖPX¨ bސTv­ •YLü«…ª—ðuþ›ú 1|ÚÓ €±øù³–8j$óW¨„”ûúšå£ +•õ'*éy +U…ý ÐæDEFløÕ9 +•ñÏr1&›’œYA(TÎoè”B倞S‡pã«VêUqS¨*ü GÉÓò婞PmYºÉí|g¹èÔâÖ[L¨Ú/ÆYP'TQuAÃðÏ'&TMMÄ6%µ^¾Ž¼ •(™Æ̪ĀëÁ]'$VÆ'TÈí “¦üv}#„—*¥©“æl4c$PÉWÍ#í„Jc‡HøTõ³QVz[’B剧óµêŸ +)¦î·ðöì ¡³PɊ„ÝP¬PK$,®Â÷Þ;‡µ#iY=…Beå× w›n…Ê’¶™ +žBŋ × S¨ˆ›+ øQϱ÷ïÍÑ P)Z"遗ïaª¤çÜ$`p³R¨ÕŸE«ay$¢*]‚Œ†®ú»¥Ù‡,Ë2úD¨¼ÀLòç*ª–0ñ•‰j¦€¡¥9/*OØ-rD¨\ÝEs ÜüZA 4ÉñG¨ÜveÁ’Ó¿ŠÓ¶ðˆP½ƒ’Wv &BõoßÖ ØñâèDÍsï-×ÆC›„ +Ç,¶è®*„Y-ï÷Ƕ¬&È{—KÊüªßŒú¬9*—"¾rñ-;6›ßG¼EWL¯WVá^ª/d”'$T/œÜA-ò,”„*þމ,ÁìzšÁÕüUxß\ U¼Ø/ ™jq½H¨0h©`¯L$ÊIUÈX($T¯w°oßMz,¡ú Ù?@„ŠáÏòOe~­ô[m5˜gß-¼‘ôäI"P­ AŠ6÷ޖ,‡¸šwѾ Ýr(îU„ؾR›` q¡r<ÖTÃ÷#TÕ÷$™œÄ5E¨ÚAm„ªG##“¡â{À U9àRN¨Èév¼þ6ðžP5Á9ÇhŽ$˜Þ;0©J5²¹N´&òM¨˜;×á`É/‚@ÏÍm]3¡‚Ä¥Xí*‡&T{Y°‚ +}Êwû×Ît_ŸEŠƒ›Ð6ИP oE҅™PäºX3ð½à@<’P8 A<¡JÌu÷E 'T¶ÞŽ„Ê);Úë7¡Â5‘ct=‚Êñ?Ï;¦š©Æ”ZÇ9ü8ЃYV*+$Á¾ çòì‹kǀÜ&ŸRÓeBÅbJ©•Ã÷Õ!'T\¾-ú •n¸Ú¥[_(¡ú˜¬“‚±Û‘PM¬8“Péû°r0S<›v´Ï‡ $Tý|¤Ìw •­Â:¹ Ž„ +|‰§Ê™€o!¡âž-&ÎæݶŠ¤67HÞÃԕϋ¸$TÄõ™PNøU|!c@B%ÌÐr×wm‘!_B5Ï° ˆ4$MáT¸èë‰tŽ}˜’P¥\!dtÈ*˜²«®WGQ*¢Ñ#ØX%T<6†'+âÉ¡e`‡*‰OœWÙòÂP•arS¤ßYæÍqՅ‘cO©'¡òlÉð˜¢AâÇ×R%Tc[CP$Tð“ lªÅABeD+nßCBÅ“ûš—P%13Í´cB¥RbMçoݾ»*‘1(A:…Š‚S_¯É j$ÕøƒBe÷O¼±ý~­C)T/ËK˜¨?¡›…J3‘)U +DxK +$Côê¾=± +ß*¡°Ø(T@Š÷“Öw¶`<“²Rd +rí3œP=|Ü( ÿCv*á½)~ÔO¨\ðVØX{N¡*¼"â€*TŠûÄÆjÛ6£Bu5hŒú@rkU«QåÂ× $H”@Š?1ߑ9ÆÌQړrÇzI®«…ÊèŽAOë›ÝB¥â’?iZ­…Š—ÀZÉ>oZ¨V/?üƒ‰buY¨ˆMX(»! ‡5 Õ¶êa446»ª+ˆ³8ÕÚ³Ÿ-p Õ19®+›£•ªô ßB…¶<ubˆ^¨°+Á…²…ªô5Õi,‰¹yÜéðj¡r¯uÝjŸ9¥@Vö½˜lY¨Ð”¼Z¨¼ñQ•<ñHø­P,ToǺ…Š^|rsqî«BUî(ì¨BE§!bzt"Ö.»œ‘#(優Æê[.IŒæqð¨mB•[&€#f6È~šPuÏ_mzì ÞUL¨Ê春‹$ ­6¸™Pí%/Ë+Ÿ*ÖXL†•8dWB'kº( w*ÙiÐ4ŽpÚWl'/TP +í¬ìÀˆ •IS®R'¤ ÕzÛø#®^*#iP„„ü>øÞϰ½Pýq§`%8,T¯ƒTeÁ_5*ˆªoœãþ 4E§m)syqhííðÌÅð¡ÂÏW‘€y-çOüCU +ŠÊåþAÝ )gÔ㇆eÒ)¬`€‡d0;ýÔNTDƒWÕ ðV?Tß ‚ ª')CTäÙ |îÊãÎ̈́ÚQÕ-Ó4lÓ Q(¤i6 ä?f…¨<‰Z/;Ù¢:cŠ&ëWˆª˜°¬’ED•贔 æôQ³Ü+)ø¢â¢E0á6–Q0#¯Û~ª5kóöì”Aj·¤pB|÷Ï)±r¢Êþ߅sÚÚ¼IA§°Ó²?oá¢b/žú'M›v\´Q;…¹Rsù-ÈF0ÈTÎq× ªödÔC’,ÕÉÞ¼#“Õ»%½:Ò=2DEˆ_Ÿò¢RC‰©‘Aåƒ1©û¥Ç,é!*ó»ðg!*¦Š ªÜ˜åŽ¹Òe†×|É*àÕ3g¶Z>PƒÏ{ۺ尐‡j²û¹IŽŸ›8u‡ ‡ +¹uJÝQ4%%_IĎ¥ß†£ÐôÁ1ã?#Yf`á¡ +ù•Æ•0d>TÕ¨”?㧕CØRƒJ|€¨Õµ²ƒ>DõùmqÏ ˆ|ˆÊœ¦ƒ›u"b1ŒQ„‡CT±`ÃBTp¥£wEPX;Ù2hˆJ/|ümÚ÷c§©°J¬ÃÔúh¿ÐKP*ÌÈ2u¢ª¸œZg¤,#øÚ6"fs÷Ÿ"*rhhŠ@ ¢MK|I).«4ˆ÷ԁ§I6¥Ä†¨rd¸Ñˆg꿀@AÐv QUˆ–CMúayÜ¢ߺ Q©…±³ÏÔBTU9Q|zÀµCT¸K_åØy†¨äÏ"$֏Gˆ +Ôý¼ûz©BˆŠð¸jøG!*º0ÿäֆ§·aˆêÊގžó,ƒœu°)dÆú|ӛ‹O¥!ª›Îí±$BˆjΏQÑ`Î0b0’íªâß/Üa³føõ¢²ÃWâœ?!ªl‚¨´ˆ‰×æ>Tµ ¿V›úC5u;H¼~ÁQ£ø•(å;«c>t¤žªCÁ.ŸC\zþP©UܪN*šhË1ԓ!»º;(„X“È©ÜÄ×â(»Ë¸e‰…W+M+ãóPu+všê…‡*aµÓ4iÜpL ˜Œw£ø2€ùxÉò©îm¥b4€GøÆèVX5~*ø9‰öð‚<u?$0›ž¿$Ö¹‡mØ컧¶5ŽCE~$9 ÜU‚÷Û)6Ò¡ÚSò9‡í*ç0¨YÃ=•j¨ýÍNJÈ¡ªÌ9. K9ÑI Ü@(»ðÂvNÑ¿ˆ}oÌ%AIÌS~}Ôü*ù¿e|À8\*‘[, yï‹n!vj‰²߅ÅlCußÿ.ü)ƒžŽÖ69T}Ou¨Ò¾‡Êæ­.0id ØÞѝùºÏyATšOõ§•¾ÄBTóùVÔ2"b¢Ê×ÖWÜ9\_"*å …Z&Åßø„¨´jrãÈ©՝‚¡Çބ›•&rAÜ>•†¨ˆl—F«¢µ;…@Wé3[EB¼ÊÎPá®N‰ºÒDPË ª*g`Òª¾}){4ÕRH¬œ—s +€9}é@¥»Éá_%‚w* ´ –[Úáá6ý ö FYž€Š[OïÈÕ9!¢’Ÿá%i“]ÍÁδB BÞ¾õ5¼£RAØ^Þ9sjOÂc£úuãsè©øˆÈ›yN±WÏÕÓ¢I¶IÊA9(È᡺'"6üæQÙx¨fg²™u¸ýRr•`šç¡‚õÃÏ$ÞÍiåðEi¨Š;šk1+” ØFtHÿè—m_!,ò¿é©ŠÙIØ#©S|¨LƋ9AÛ úþ{Ç`M¹PƎ,§‚©ÈnšN ïxŒeùCe~”™28xi‡] Xۍ¬  ¥xZ/ûV¸Tõ•Òp`a¹[ƒ¨ê¹LN"ªZ$ñlœX‡¾=˜!¢Š UZ;Ý¢ÑF²¬gJ [¥äí!øBÂÓ?–cÀ¥‰Áùµ¥×ݜóµ•q Æ¾Î}P÷L>’ðêßZ{ÿ`ö~ÿ0De€_f'—ª1§ ¢BjW™"ª1“¨vóXâ<øe¢%¢Â¹L&—6[{ÛÈ遨cWýN"¼&M}¨¶G—·k9ȘÕ{iR¨°æbÁá@Tú› +®U ±²‡´\k—â/º ´} rZòn•c‘€ÂÀI2šsUI¦¦1sdÖ©™²î)ñ&g^~²L?{Ë Iê£EDe¹ô†/drXDEyx¦&¢þ¬€ALRÑoQ1}¥WCU¨0¹®#*Ø~ހñ`ósìGT™gIyɸû§5Ž<ÜiDe¬Cß³K>:ËnˆÜ#*IêB˜š«VAe«‡OÝKy`iÁ»‚pMN øÕìLtdMÿœ®Éڈʹf H…Ž•²ÆÄy‚Ž¨Ib[Ÿ>òaDul1ì‘ «É#*÷¼Ý]në6¢J,^"$ß0™2'uÔwÀ`Då©¥UQ_Y@5{yç“ÉyïÍT?Ó9™~~t)@ßV\GƽV.C²U‚‘5 ITm¥„(8T]~#©è1Ú-LCé"ùE¢Ê¹åà¼[­ím}þ± ¢²–ªÄn2¢’·àHºRDÛËÎü\ [¼ˆJЩ}hZT“y•þÒ*¢‚äÍ8 hœæBBUKEP}£~ш +³íâ£I 䈂¨’GÄC©22ý¡Â; / +oƹÏýP¡…VV™gM¯U1„ÂýbŒ;#r~¨p!™D%í`̶p”l'… Å° Qƕ©em»æ„¨Þ"˜H»òSöwÕ[5ˆÖDeÅøÛ#”qɂf%miˆª©ù#‰¬á4³ +8oÈç>FˆŠ©ÒÝöÂ\¶m‰•˜@ïÑ»X㬕ùHÿ¨å‹l…¨l¥ÙÌ1„-Du…y:Î÷éCDUr›±®ŽdÓFT*óЇôÍUˆ*)ŸÑ,ʝm› Þ—!é’>öx %[qGD5kعÈQÏQq‚S´ÍQ`Ñ~Ýñå>†²«÷ÕN%ýºMV:øjãÎIo"*óèM &­yX6¢r}W‰î‚3EÓVoKò_èˆð’çGTÊæ7’HæNÀ;¢ÊjIÔª=™%\Ü¢4‚9»He`èXzÜ*D Ž²£n™”D¥ŠÝ>Ry…HK9EõŽ"ÁÀM‚HT y•,\Ò}‘¨Ú~‡E‰ª•ž1*'‰êWß}ù=‰Ê¸­7§ÇƒD¥¿láàA¢z(›S$QÕ%Df‹Â4žW"”pÌG àÜÂDd•6¥ÿ¿‘Wý;ܵ*’!®„ +«JqD¥ÕuŽ!…­šS7¾¼Õs¢¤Uš<½‘)%ŽŽ¨LðfËî®#ªu®è”2‰ˆè/¨^Zf”RûUa'-Ë]P†=¢Ú\µ4¢ÂUb\QYn°ˆŠµµaÝ ‘¯¡ì!lm¯BŒ§ß‚TpQÏ [Œ’RÕ1ÅYQ«R-d¶ø[]lØÖhƒDD7§Fk×ÖèFñlNæjûBι„q5PR)B-ïS¥©Æ³1î†8.ólÛ$ëîï‘GJ´Óš¸Êœ„éKAýþ aD•¦r!s£Ž·Æ¬ƒ&›+•ÂGGÁÆ6´Û`;câ4…Œ–ÛN…v J"7¸D(—Àäÿãz¸rmh,ëD R,³.‹‰hðH,”²Ý֛bç¢6•yÎÞ¡óÀ.̂÷Ôў+.×ÅÐȯÅɪ…H=Û°ÿðq.V¤¿ÿô§Xk÷~FöQlÃÌGša^†Ìç7Q*MÙ¿Ø9ÎÀ#uTÉ;öW ¤þÿά×o$ ¶aÃÉ£"Ž‹xZÒè)ç«Èï_¡;qPãºuOÜ-ÂÖÁŒÓjò2Âö¿šI 2ùO \žNóŪ“ [ý5Öå@ùXoÜZÒ*€ô‰°RÂ[ £y¨³AüáõtÕø•#&J¢eX`{G®ôrÉÆF§»L¾#¹P B÷®Ì*Ýam´‘IïÍiøC»N8ªÒ1ύ­d¶TÑÎ~‡þ|*IhXÁäã8Ç°h˜à¸t¸?HNñ1 f©â†#ÞÞã:µ§DÏÔ?Ü~q&'®ká3†Y²¤©Ò„Jç„K#+-¼õÓ Øå‘ÊÌC;Ü'0dâӖèÕ`Ú+ÒpäO¸ðnö‡J¾ûPußKA¤¸F¸‚fXAØivíü Ä{G*sçã|¸çà P¿„†^añ[™{¯ ò²âMìpž."ˆZ Ÿ»ƒ”‡æØ÷Q-m¥šf=-ì؃£iÉd s“ÅÐÐd-†¥­!féø{ô ÇGOc8†²?0‡O­þé •f1ól­ž“B+j3«áiÆ $ÃXapOß4M@2¦¸»ÕAwӆ ùÜäcæJw™ö>þ5¦Âfþ™íêb€~É®.Í,³ê §‰Ãe‡nÑKþ7ÏÅ|¶± ß­@/ [‰z‰^¥gH¬v¢^-.gPä¥zð[*XQ@¦Ë’ßìÊc?R&×1›d›ÃL!tó^[Q˜¾_Ô7 ¼Ò¾N=³‹«ƒÈ,ôy¨l±äfd²êûy’¢ÓÅò êÙC8CÇ]¦¢]édÆÈ]6¬J’º¬O; ù %?`Œë¤t"!‡aeæ¹¢'Ðʺn…YIÔ"»ü>~ý ɍ=¸K… k" ’“‘ô2„Œ¼t.Á~W'‹‰ªZû»’CН·Ë݀CFÉ—nvbýÌÚê(.žžEæR/)ïóÈdÕôì%å3ük ¼¸±ò0‘vXcTÃ(-nFèi«Å»Î$WüþÎ]˜°ØJʀ̿ìUJ{Ä°” ™@cŠå²††§Ú¯" ¦º`~ð: ×5{‚ÒRՊǒèÒ°D C[¨n%ÿÙ°ë}Ñ#¡×<+€‘óÈ:‡{(˲SDß帯L”^CëqñtA­êY>"Ió¨Å×Ì?ºFâ„}ÚQÃíZ€þ+"iE•ºOeñ¤šÉ-­Ácnû^F—yÍO¦T’ºmÁ1I%ژD±›€æóxӚXÜҋ˜•«]@®ïkúöºÈ®Rªò´A˜üNñ³£skmUÜ"߃K +pžÁ¼o4ŒÔÝ5+÷âñ‹”Àw(aUEΒg§v ‘—\¹Šõ<Ž%ÿmêº(æp¹ô­•QœwaSÞâÅÚu€FV».Èå†òG´iå'òH߇œXU4/Èg~ôè›{h«jÓÂËEúÞ®·Ç÷'«ÃÙ5åC§ò0unG  ’Rªmƒ?ƒúl´‡éÔgJ³¯ÖvŒÃ£Wšèq.¯›Qe«‚¬U “û™ê—‰àìÈԜô…ø78&øs)«fxç.—\S± ¸Í<£ïàÙZ +ØW>î-ºİüIVP£D„¬—Oje둽‘DRéJÃúƳ0 +‚öPd¦Y‡& ”zT}†,Wï7Wú\nÎÜat¥án.'=Eî DKG†¨Ì«ãD§Äºuº~5»=ÅöØ$ˆX1yKs”Çh;¼Vš}QÌå)(4.™{±}i®só/57ÿ©÷˔»–sCêo$\ê;æ…OxÞ"½÷ìË»ììÎYŸñ?ff‰U”ƒµG~-ç§ÄSÜJÈ*Î;%–tì+/Å^ÖR@&ƒ4”d:ž3¡òº¶« +}d«·×­ÅA/¾möc&cAæë- +&J„$K·í¥ ËŒÓ&ý‰–¹‹G飅Ëëfc¯‰Ž©¦nNãÀÄ£⾃Ë7”ÆSđØ8¥®©¨h±¯&pÿžàXPLêuÆÚä 'Bàn!qÒ±VaÇ-òòcìY c1„ì§tð}¡ÓVgÊnWèã+·ïù-ºï7í>^RY§U6ÚL®…ÁìšÚ‰iZ1Bїâ©çCbÅÿVã2ÖȾhUÿo’€LǜxGOÐÂ/êØëÖq®Ö™çÇ èD”kl#˜È-[  +Eˆl„>‘>˜T@ñ¹_¥ÚµÂ-šu YH¤«¨æ@$ÓÓ X>@ë×JžHf^í³•îß]]™›û¶‘gÃÔcÈVd³”Ãôë‰G=Ëm°]eý;&¸¯[[4Ÿ…N\ÙXZµf_ÿIõEoƒ‹ +î +“¿#¤Ž£òS=õ”ê׈Â)ª81*5),ÕcÊÀþµ£SZ.ƒgùU¿Y'ÔÜÌ_/¾¥ÏxÖõZ³9X £c7<ɓ>ÏÀG28þì›ÆøŸï‚ /&5˜ÑâÿÄCùrb͋B&‘Är0.,YyREàr¥ntE3#E=qT¼²rF Xï^wwñŽûÑõIlqÂp¬ætK%|Ú¦è™0CYÌøHCZí¡T»þa +¡Vÿ²±|W`\F—(Ó.ž\ ªR¼ä›v"0¢Ïk熤’bU0lš×Nå!­RNùsÚ gÚ\ynúsœ¥¶–bè5€XýŽlqŽ¹0Àã8~êÇ(䕽`“uü(²Â‹TýÕoðLÃ÷¼þ¯² NõbÛ7¨º\&Ôw[6j^÷\0néTÁ!!GPÂ_ ®¦ýv’¶ºD¹Ùì7Ú`b³ùhKÚ92Dïj—¶½¬ çÉ°2%û:n\[jílS$~8xتŸ[s)ßážt"X¿:;¤(DTãwۓØ$Lª•ý¨$´c4a:‹v‚"~~%‚ÄɅܨÁò–ÊA{Öo¼ [M« 7 Œl& à5ç‹Á…1¾ûQPCã4Er›’ŸÞgÄÒíã°µ®ˆ%Žõ¼ˆxíÔnÐM©pÇÂù.|N£n\K\è\>{fPõqˆ ÆäXȇÇDáé@cÜқi€|ᜏ̂ÍzBobMÍJg¼gdùx¸NcvŽl¼ql²M‘~8¿`Ô¡Ûg0߅^(÷‹eÈ6Ú=´±ï“‚Ûf˜ñfG²qÌðí>¢N»C–­pþ +AÌ3ç´ á£ñ€:Ä KHÝSæ'Fü³~z«>ž·½‚Írf…¸×Xi†÷›[r\Y?“·ZБ­ŠÇ{ÂánèÁˆ …–Z<"´¿CE?Œ5Ç£æ¥}ID††˜] +Èv¸ˆG‰÷q\£YSSð<7éG ˆâ +Š•Ÿpæy,Œ¶nZȨß{6ko0ÚBíjªðÈaAH›Î,³fÑrœ!:‡™ÂÆ¥Y0ÔÆk¼™ùGÊhÞÓ²ýL‘¡øš·îÙg7­H߄eKՙ;ò¥ÓÈ鿖(á"Õ>îÊ£ÞQ£äuÿ&âù´#9¾ïèE¿-•"]¨Øûô$ÒLFåÃûàÕ#ÒT‰[„xBöPh¶!„ ùgIÏè½ðRÔÉ« &]…* •ŽN{@†ÿ&AÑoÌ&æd8҇iιÄ6ŽTa'!…4äO¸9èŽzOum 6aúðøCÖ~æš +¨Øà­n/i5ÒF“m‡.…]r«šg®l°)h»ï›wn?&Yr’mö~Ø4•ˆK€Q¼P¹ c CEÐrõ`²`ñD¬ÞÞN9N£u¯Ù? a]§³© ;3 tüo´Ír‚öþ²M7{FåÆç`ú.Ï3%nö÷ÑØʐXr¡ç³9 ¹£ +Ñ÷‰6‰"o_L6 H<·¢xpiÙâKr€jv,‹ï¦2+5}ã¬IzH8^óRxÚ}Qª9Uvq‚?ʼ1Y·ÕfB‰ !œC0zS%”‘/Ÿõí=Vºƒ–¾¹™0ÿâD•iŠøÛ%MMóîýç}H-ôÝŪF剠ŠÃ¥ôm{d·_ÛS5õgXu·‚Ψ qkƚ¦ù™rèH+H"Yõ¹}W`V×ñô3%„oå×@à»/ˆþÒËh *m˜‘i8—W@&lª®”5íc^ :"9”j3In¸}5Û蹪“–É…èjÀi5ÊZÄM p;L[~%ç’Åÿ*¨©d”„â•¿E5Ãëì^€¡ÍU­¥:­O³1p$‘="1éÚcPpAv@*’œrtJ˜Ï+x°™ã¤ãÜ.þ´Á·Ê:L_‹\%LSèçfä{ 4¾Xü +©ªd´IQNSÚCv£Æ“ãêo£× ʳ´®ávGfœWb"æ×h ëW&‚‡æ +èwÕâOû &å ä„¨Í+W3{Ù3öÈäÞ€š#¡Doe¾™Ç©h`ºç#ûÂã¤å°¢áòÔ<ºŸ8·‡#C4g E¤8‚ØEV?#:Ӄ#¼’¶&dy:j3¹õ1Ñ(hÝ'ªrdàˆö NtùSÿy|$»Úì}§UäEH‚­‹¶Ùœ&MÊ®ŠZÅ8QàßÜp“Ò-ÙÍÖY¬õË5£o17/VZH[¡`Ü-_\Y¡1‚m‡Q”.¬s ŸŽˆ/•}äU»&ÏÏð–÷{UéËZ¥üàwíÖjž# æËnŽì=lh>/ꔌ鄭!ÍâxBð¶ìºäÞ¬txQ‰éÑ#¦¸Âz¶ç0á„Ó @‚I±øhb¦ZÛs#ކ˜’¢\ù ¸—‡;}i»+êCSÔcéq® NDÐ,P7»<åo2¡<ì¬hª¸…ÄOÕ<]ÐR3d<³x7ÓʞrCÜ8<¾—E¯nïCâa!„‚IÌ*´š”ƒÞlY "£!¿öE:ψÌBX¹é롑í2€€D:æ u»„T(Ø9Œkx¢ä›ˆïAüýŸš“x˜p'/Õì=„[*d°\¸®8™ÄŸ4i*éúp‚(QwÒ,ηn¬éð2i +îߋ††Åpa¼¾Ë9f„/6ä+QǾÏûk”k^ðûэ$À‚»9„Wó¨Ê ­¸;¤—,äê¦ið2 õ°ÞÝÕ¬CGDwî!fÙÅIÝV‡"o0QʝSÂ>kíd5=D©øbAÐ9ë7iù~dljÎÒ +‚ó…(lî²IOoqÈXdœ©£vÂd³IÝs9Qûúø65È f²ØDßµÅF C3Ĝ˜—-‘éó"çN«P"IÁoyk q\·¤+(ÞíÍ £ï3ˆS-_+á0yæ¢jÐðô:p*I6ñQ&Ä&M%¡¼µ§’’Ç­^T¬6‹ÿV—}ÎùÉ´ˆq•p—Ag¡ ‡p¯¶†—¸X/Ý ’c€J“R«0´ Ê£*泦6Òw˜ +¬?/ŽÁ£®QȦcF:jbº¶ó“!Àä´& ÎÖ¨¼àHF +‰4 )vxC´à¦>Åjh爜j (f»²¹–A¾ŠÐŽR ‡bÑ´1•Žä¬ª™C~Üç91ςغá]SÛÓÎ)‘§ð²z¢3,û͋M…´%u¨µºåùŠf(Àe¤Ûr)öۚ™J9âLÃéâÊÉd"ÅãMüùÆTç86ÞÊ é§ì·ÎWÔô~–è81SŒ_†‘Ê—-ÈZÆUÔ`¹‰[+ åت:ÜT~ªÕÝè š"Ù°’3ãd{“+ ¤G + +¿Õ³²ðüÝ<¥p‰ŒP¡£´k3àaôJŠ(²[÷ⳅ}™|:Vâ@1$Ț€òÆÑíܜ{hP Y½ƒjjµÜR&–.SNmýýí€be”ŽøÀñ|C²þ†ï­Ãö€©sË EÄϾæM°€¥ºü»7‚‡&rÖq·Á›cç†ÌÌ2H†3dÄÒÅ6ƒþ f³dbj“êá«lÞÄ+ƒ)Ä°¨‚#*“H·È—|V¤I[»„·cÕ6ak³hÅ +ªi“3nz‰›u¥ŒNÝ6PY¦¸ËP×ÝI‰Ü +{‰Z¬ 2|nSY8$Tpë¢_ãLì֚ ±ß‰o¯T9ÑmŽ‚z6–9ÕîËmG¡g8YKZÔ<!¹Ú­©ä :)¾š ¢{Aòå†ûúZ÷2’L=Çëàû+f¹-Q›¯÷;afCüöIr!Mã0-ïÅìÛó‡6. +À‹èÐrÔéF©ô†‰²?rÄc/€µr”aC+í©1ÿdfÇxÑ QR- …sXÌ|GçÔ6ÅíÌè“ñ ÆÚHxÅD‡™õޙ¦àÅ;í…CÚËÒ2¨³Š—ÎÎìÞ÷¸ü®¤BŸ(r´ܗaæÔ~w‹3á1ÞéŠw/|N!äg-¹‹F!Þl4~Rì¶&Ðϳnú‘Zʝ[SU›©Ï¡ßaÑÒ02 ÖÎjm_¶¹Aúƒ–ÂË°D¤Gé +:ƒx¸ú¤$§ÜZ¢×l)CՓ[ÛlêÇ ð©îX}Ûè\@èÝu|SúZ²T>£çhø‹Ã"ÀÁ¸<•¹àáo¼Î ËÃM´ ÄÌй¿\4j©§@˜cµ­&5ÍHôaEhT.¼çïÖ®åfa[Üj¡Jš‚~Ãâã’XãIŒ6"\CÞ" æqß òÚ%뜱5$›8~ýçÑ<TÄýô23`ü<‰oí4­=†›ž=k úI®°XçÅtÃ%*øx)šoYÈLY@ݎ•±„¡NhÚú#|7à?y€·Êªø€*ÒÑõÁ !†‹àuTðm…}NæÚ^æÒ¨s;¦wðOh^>V]¸ÈZ‰•âÌJÃõ@yÉ:—µ\¦jô&}‰õU¾6,½€èuh#|‰u$_JwƒjÅÒ5²Õ‘Žp¾ÌPj.½°66ۊVäZ­¦ƒÅ¨sŸ·l³Œ)î}žf™¿ö}H_rŽ-Gfávµ«´| +N*;ÌpÚ¶±#ˆùÃïaTM1i=ˆ­ÁDŽݘl‚*~Ïó58Ò_ ß’UGd+ì EÑlT# -<§7G¸[)Y¬ƒ ;A(¶™¿&ÃË÷{X¿u\°A¹”ž4ˆ{rÑFáV# +‡ù¹Œ­b Ùü¹¬ÂÅǨ?ç4ý3ã*mR팠,‡ÌàøAƒýߜ‡iʵãÓñ_rx¡A÷ë›·ÆñØ ¨(󟴑:@vÛÃðV°€1ž¿.§zÚçèܜ²½O +ãd@d°ÕüЬâ%C{óhB·¥¢`Y–ëòL… l X•E²â´¹ŒÔ+Uq¹µ%} §a󳔌¨³¯êÚhu¤¾1$X— ÃPGDƒ[ +°iì"\bKµéÚ¯Òy¨«C ³öÒ`þÙÈV÷'1¬[G‰yk%6ámæ@£A˜õÒd¨_,È>ë7áÌyih¾P4øîâñ%ÞTé*º'±yìVð+o:¼Z*ç)Ã2Œ+ã +þf!ïÌRäËßÁÀÆ&6šfÒÿ{ïe09#ÿCZ@úT†`´°7Åuk¨Ø:õnÈÌՄ^l[Ðïä[ðqÕµ2ÔÙÂ5¦¹Uq@‡4/ˆÜæú@Ó¿h¸‘}®*Ï_ºó ’h?¿a]’¢Œ€ÇÞ1ºA;ˆ¡å&WK•‡EO(¿8҇¼®ŽäÀš)’mºNxə^/„T§ 8W!2BDžT †=gÏ?T¯Wš(ÞÍgIóhíÃhŸµ]Îè¶t&Zô.B"õ+?Íj 7Í5 9CE&?÷ôƒiñqfAOû#N¹@qÄYJÏ°»=¢v¹5‡m'+P …W[Ç 9 ÂÐÏ2ß2ÖY%gbù×ByÀ÷¢MÑÖ¸„„®‚‘7xà˜È[n®ô‹áÐÁ„yÄÅ͎ –ýèkÝèÚIè¯äà-xÚ +ꇰªòH© ¼˜·.ølAU?†Y³;=õ²ÅtUÐN†}59ruýK½:€3“ÈL꫓çý)\µKáå€Å2ú5o·¿¢/@·ýûJ¡´ø¨ÉèØÉ’Yޜ⠔쪗T +yuwÞ*ê5“ [ŒáDO ‚Ñ.€@¬¸A_Xá–i°œ·8£n$U¢… WÝõ=#[ªÔ«&:⛙]dælaÑFPY*"’'(+„b(êg,öû@˜l'G9¾·+[ˆ¥)£¾™&Ð¥§:%IÇî[56ŸÅú¥ær¬]Ù3âæ“š^BÃb=£Êf’µ®5vXkcq‚d®ÿ(‘ÄHtslo +PÁYTå; ܑl£×è#§»‰­:r¼·˜'=Q”D;CûFhØVðý ¼ßâàË Mn–X´‰œþï֯Ç2±[½'³={àV]#¹ö¡\1Îà†ni5…Oê­¶d-Á–toP7^Z–!–ó5Oßý0zÂÎ\c—=WSƒ@ /æ“ÜÀ¿íS!B} •øÓdé`Þ!;¤GT€Ì³ ì֙9Í;D'¿»¸.¾GëMETÅÔ!úp:C6¾BRÃj§MQûμ ïuEa|êj„gs‰]ÈåÛS­ïÚûEFÃA´Ê<ÇYž¹ëˆ÷@Ã}ø´ôÖcTÏV#›zŒ $‹`ƒïî,¥ >Óš\ÂS Ëj:yn‚>0å n $»¬‹äü¬@–á·}õ©ÚŠPÒrÙp¹®­FC \Õ&ƒðÀp@œ +‰è3k,ÆÕB=DôT”œn@¢«p'Ԙô”Êؐ ?Xo]ˆ®¨àé"q€-À‹ïJw&B—O`ù Sü@ƒ£¶ „í +‰†ºâlì|By—ÈR!/´?“ÞY ®I7oè +SMõ²ûó;dx᜕ArªÙåñ¢³vžVHí©mPÖ§Âήƒ}¯“BK€¿ ‰7zõ¾Öqñ”tZ +WžÒ+äccù3H¶N ÛÁæ_㟣X™ÈŽŸÝœ„ö[&4,ïˆ4$:E4œ* yÐÆ-v°êu¥pù‘ +µAâŠiyÙ`ÑL”*ÃÃgŽûv¬d«…É ‚sÍbµZÊ©C–|Órf4ì„d¥rJ,ÄÖk%¨QɄ¢w©“•W¿” e>ñO~:š%À= © Wú¸³ £óFîYžá¿³LX«_KƒsVHºúÉÒ,È,»Ã/“+¡¦’ ´óšR)oTöÈ<|4% ‚ï5̾ ×+|¸@!#A{ùՑý_Òneèðø -I‹†Hù™5g g3IN,r[´¡ÿ¢‹™¾ë‰ jš5ù?¼(R£—Å‘;³Á:ù§¾É‘•[CšÓÉׁ]ž5ñ…aÇÂ-‡ÐãU’"½®ÓD°iŒ–‰Œ¡S´žâ‰>Ž +ØTœ­ŸœMìþ+1nˆh·â“!3å‡"+ýŸs7ï´·.„…¹“ê[r¾ä2ùçßé*º“¸W½¦ª×çò x”õk|`T +“«˜ë²5µÆbÙÂúo9Küä©7D ׋:bK;Ú-¡˜×:Êó/{[ù3—£§y$ÿn…GÂl½êît²ˆY&óx5o1¯b› æÞWµjê À ÌàOâQ‡øZm.Õk‘]"©z"0íOhÍá·á˜Ô€Õ#Ì%Ì)„%ÄfñÜ“ç$xŠÛ©ÙÁØ1¸}£íÑñ„("1ÓÝc^‚j! RV4éåÉ=°ùQ£Dñ1 n“ä\蕉M¦˜™k¹¥ð¾¾/¸Õúúýé’>ÜQü&–),Â݅ º"?Ú%m•LW.yè)t‹–ð1<%ùR0lE"¥àñ:¿œâ²n€IˆÉ}1‡¹¨OüÏ(ЉFËI‘5¯R8°W²ÝŠ•hÔ÷1æe̛ Ú4 ‰+çD^"‘"‚ôAïõi¸zNhÉÀžRDÄé2KÊÛ}#Îés/tûëZRzmúª Sԅ¿Hd(ûÏià±â¢½Aþ>{ù˜Õþ‘¬¬¨=âçW +d\, (™Øæ·ænT£W8&àTxùÊÇÌôæx¤êC}bâ%io ù͹Ãÿ²>ä¸× é†Ñëoa(D\»;îiô ٶ⨠+t_&õöjlëŒ8å€ù`õ†a Gô“½¦ “ÂVGy©ådú$>Ç?åŸѲ‚*E f•»N´©ê5D s% dz•¹Z½%yƒ¨¤U*îOEAóøÈï8އ̂Uø¢"mqÂA¾©ÀùŽnåW”ëÑrïb´ž3 E×Ìç° vó([óú˜ÀP€íÇaõÀòíÈø¢f^S²–¼FsÀ±àæöbÅç€r&#>Õ>ë*œ +ZñÝÄû–µG¨• ¯i}Wž-L…FÍ&6IbYy2Ï]n ÁàE Ò¬`¡±M™(Ž„‚¡+Lp06/ +=ÑÑLf¶»wŒ³³Õ×Ô-öæaö ³aýëË£%>)q3ß}ŠîÍHú}†ë³‚€^Á¢áv©Kñ‡ .nF®Ú2øª aøÒÏ«ûi €3Å<í{7d»# Àsä§ ¨ø5ÁóµÇg^åAõԒy¤$ÿ\³]â|Ð;Jùª0kV£8ÒPážó°YÅÛ`ØÚ#–Û}7 +ÕÈTî2‚éÀ tƒÐnÝÎ q+YÔ&Ýbq6Í&gãêп•Âf‚&ûŽhë1…ÀÐÖi˜¬‘{¥¯Þz_ÊÍҘim/Sâ†Në=§DðYþV5Ð-ò§òT½G”2@4zÍû7k©ös0ŸêÑT!ÝÀ"úԖàÏ¿îÝûDžII\kü¯IŸ=|ýþÀ+‘Zz”SÀ”äÍì¯ýŽìò %¢øè ¶°V$j4Õ8‰’]ЖvœØ›¸”y!ìcŠ«™Éœ*ž¤ûw&xØDº;v„ÚÍù‰/òÈS˜Ô·]w&sáˆO0s͐º¸ÐØ¥/à¨"ë“Æp['}ò×èà8Ú;uG²hµzÏWûâX€=fyՊ{H ¢-†à —pZ­ï¨¸Ÿa9‚© Ÿ¦È²5ù0Q‡©tÇS˜/m%aœ—Ü´° ­î™Ë€ý]ëÄp*$+§«¨½“ü‹eò`èÓ~ƒQ2·j))•^½lsD% bÃÏ÷7bUšX÷PˆµMš&Ô3é¢ùÖè"äXÁ­&©X ÿÐ9<Üêe R¡®$á֓»¬Ü<›´Ù×{*Ã/n€=Ýêž}kO/äñ”ù•â9c¿Q…X¯‘úA†Ü¤>#21 ¢Ìš‰rò+ò7ËќœÝcQ]¹µÝŠÑô%$X´9PŠÛ$XWyúdè“ͲD(eÉ‹ré(?yüœv¢—@ù"{Ø&†êM6ȪŸe4ÿw…x-S¨w9‘[ԍԍ0Ài¦ëüÕö» •Óÿø X¦•^ cu!õH×$L +Ì_µAgyÛ̉èéë5xÚ½ëÔ±âðs>­=]øî‘ ²Ì8½x+7Ó!ãXrpZþ•W÷È뿦ê,ïÉÆ8J¯p +<¼²$æÙ\ÍѸ í;¤wWBh<~Bªî„K›-…–ˆ¯ ůèdÝÇý6î¶ÍAk: Ä6.+ k†ˆ©;€DàÇì¢Ê5ÁS¬ÈD.÷…9ÁZÓ_„€Œs´BL7¢hªÎ ìÀÜa¡ÜÆ4ÒâOwfŠ!W†eo«ñ­\ftÁ m|çP×p~–ÎMã[a"xÿ59q·piª(¬„€(-íÖùàeW`j@£>Ô@‚ÍS …¶ä-&EeeD)è’—Ø,q?"lñ[gÜ$¯ñIÈî±@J Otù¤ùVÀi>oÚ BÞ +!–ÍhVL '֋&ˆÈô™yf“û4ûlƒüÒÀD0D,îø„".9ˁKÿ°ÀÁmwËÖyGIrC€gæÏÈÈ̱7¨¯¡§w‚+ßöèÊcÌ ’0š‡ÓŸ0åî“^O±˜å|Œ*%¢:W½ Èf̀X Ãeöa¯F•âAPþð&9¬|`–Þå†RÀÃ6˜?­Û¿‡oÇ]û[E/åôþ²KÐCW¸Ðç7Á:ÈAŒ ɐ„J¨BO~ÞG΄üØà3)—‘‘òe´‘€ՈlAj/ЉGX¥‡•A°è§’7E0^ωoÑn¨$ÐÚZªñ39ÉÎJ-¬Ì¼² ÿilȑ²»Kw\Ò|üd©Ü¡6À®øÞ¸[(ýÂãSºœ5_t¢ØO¿¶ì7ÀM”Í¿’Ká.¿Æ²Q]*,ßÀr¨Q–otO¦Mµ¼%eï–frhÂôYo°Á$¡ ˍºG¥ö7Èʚ…¹j ¾…ËÜ©½£¼Ÿ—zH‚ÔÆ-䬯Kÿ¶;±Š"×j.œ†Ž©9òÖùÈ*…Y.å²z2[.tÏNnQAƒé´»/1<ü…øŒé&¯Yî‚ŸxvN¿fTÚe/ÿ·T^'’âíÈ9.ª0ÈXJʎõƒÃG:ëªfœªÑ€á-÷\4JÍD6 H1«V‘?­ã´9ª¢ ®ƒç/…8%Í ÀͼçF¢`åÈ!Ž§É +3¡J¯Pê%ô-Vˆq›ßYû²-ZÄ,dæ„åü¶¬¦¶:ùMÇi!1 ‹©3ô7p% qE=Ê c9U.ë,äÎÐ8h-üÆRYâÔÞ°èe…k“.1pݔ¹°°à^(çd³}!‡å¯sjcƹdI +X ¤ñ/a[‚$ “yÓ·µÐd0ãI6Ù¢*ƒ¨%µ O*“Z’‡ÔiC³â—ÿE&åhÉÐB§&m +Y…-”’É»êl}2¢©ðýúƒ®E•,®ñ5*í ·Ù±«vðŒÎO˜½ÆÝì'³Ð-xkb©ÚôÚî +™‚õ%Û-ÓQl<ŸÝ×>àì ïÌ=žÌ +uGÉaRÚ8Ó}-òzÒËBŠï™B¬.|o²™bS4‹•RA±0¥L@ÀSdQɇp Þõp†2üs—åžQqsՀ ‰Œ àpqsèèŸB¥ç•‹Õ¸ga^%Ðk^&òMêæºÂ`T~ц-dAœóÔ惮¨©ÀW¾™Õ‹Î4‹Z¥À"¦60 E°¿Ú4µùñúD’«á©f¦†S͛¬tWög‰„ݽԝי9¦MçœÂÐbn]ÙOŒŸ{ª#jÕ=Q¾®'¼Ô!ËEBù)ײ‚˜‡—‹Ê‘ Æ:áS qD¡WP f«v·&_¬Lô£cª§dWXµAt¨9±Á²ƒ ÿ‡ ¶’m4«˜šÆÈ*´)€¤÷¹Iè +ÄìâW¹&Kí§sŒMÉ&ÍÄÝ\<×pÔrßØÜz­'›òѼB¨kŽÂöa¾jÏ/H)gQø×ô_' á® +óbèԋ¼!7,ÝîiDÌш\PD"?"½ÂÉr*×ia/¨¬(-†ŸÂ1!0¹³©z^“—#Ë2ž+é à2ÜêEˆùJ¿„–K&\h¦,ð.ÂÚ!ŽQ ~”ƒ¡È‚ 䂸 fò0E®GÁ|0 »…K­í}Û¦NACGœZ…5âŠgìt9»rQv”;eyßØc» W[ࣂbWƒeõ(U†P.á±HÒ þ«EyqÍÎa(“]%ëؓóK£™ ì· ?îÔAè%7GÍôéYÈÊØgxNÀ©á"¨L§5O±qvÜ6ðk6¸YZ5˜æ‚BÀôIù›Û¤¨W HÅۈ¸ûu‡¤bJˆÆ\tQ^äZR=d7—™ÿ—³œò9?¹)d0ÔcMÿb {>‰ø@6¸Wwû­j¾Eb5èÅ×OÕy¨-¢ãs%â&€ŠˆP ਽I3J€ƒ ( ^¤€ö/(µ¤e™6+(¬ÂN xKk“z¨“2M©˜P +˜“™Zƒhÿ.•¥X40<>^²hÃ’Å>^*ZÞÕ'š´¤WJø¿QŸhFïe„ÝAEó`ö@Uœmj& Íf„Ê—f‰fl•²!³1ŽÀlEÀÍGHyâ”€e¨ `> e“zdĂÉTHè40¾HÑΉþëzŠ«M4¶0I²R´(lTêñŠ}”­g?‘h&”È^Rzßc‚ܾ$*¦ÄVãWÝíË|_@¦”öHأ؂ÀÅÚRßW¤Š-ûBtêîÉ:„© ]2ÃÛr²»ð²V± ÍÛ³@°>00W[{+¶½„÷ƒAìüšÔû¤'>ö¿/†âü¾×/%öÙ}êb‹ítÖÆö­G÷œ|ª*1ß\VÕ× æªÎãíVî.óѧäßÿqU×mÆ< ŸÅÆׯâý¢Oׯª§·¿CŸÄ=U5Ð`U9Ä|Z­hfBŸ œªŽ$2ƒ”“ä+uÇf|²+–ü¥º€ö­@p^_)vb©51Ÿü‹/¥,³ÏLYñtɅÆû®tÊï+è2#]háo¦êï…Á'Ôqè”î¡õsmIQŒ±Á  #jªELb6p0 +Ä jÁXp%§|j¬¤|ñ{ #…ƒ_g„UïûÙ®TÉoÑæjEsåsÌe`ɗHæBG©‡Èœ]“>6O^‘üüQ€pÎ7 GI}Ê\[¦i®\2ù³Q1þðÛs0¥z)sáAZÊI0—æÀà€ËEH\Mò=þßãH.Ä«Š Ü"“0A§@gk<Ù@ÉkÉU遫…D°t%áM cºÃsîB) 1! òºa¦Ñœ¹lۂ‹… V6}|XºÝºá'ú¯àü÷á+~÷/ƒWµÀ½YçhSaï¤Öc¸¹`êӇ~ÇGÿñ¸Ï¯º¹€hó(¿ªFÛN›7Måœ+ːŸR¦/FÊÃëйJH'óS#³Å³æšÌ‰)sB²E4µqäGE?CO ø9Ìñz ¦Ê‰Ž”Ô‡Ç + + RùՁmé2û|Á’¤Ó}ýž4’\vvfÁCÜ-è[œ¾›ì–~4º­UP¿ˆe‹ªMEóZ°|ÃbäSI Ü4Ar H/uäYzò‚i§Ã–I!&JPŸMÝ1„DÁS”¤7¥Š/ÆÎÔYôÚ”³{Y–](WW(K´[)H¶ËÕ( H©<“65G%1j(ÁXvxA&ÊO F`ÖÁ1DQV¡Bou#!¬“ƒØ \*DüúŠ¾ ÔÒÆbà=¸ð:ž’€ú±ŠQÐi[Là”„D®3fbÓ*‘ +E®X+Ð`y)_[á,ò&Å2p äZq#x\€Hr'àHS*ƒ[A.—Ïò¸L¼¥?ý¡”ê$• Äeä¨Qa×Q'dݬ*L=”=EC­Q_êõÐɓ%gEž<®-¨ëÝì(fÕtãÊÆLcVóSŽd]æ­Y —í,å‚ÇEádÄR(¨Z˜”üý³;}r7d TzàG 1±à nÕ*ŽL(8‰ }È ’¦Jý•)Úî’0„bî• :š%b8•SX´f}>G©ª¸hB¥ —²0ÍXL=“n\æŸ|yYx>ƒˆú•~V/€œqyÍ.r]¨Ž4®`èÀY<›/ +(Ú¾¸n›\k5))Ri„[ãâZU'@FŽmqٝ Yȸ ãíë{Ëq-t¿DY«¯G ЙN¡Jt©¾¾Šü\¸æwžI_q²ÄUø +T¿{‹Œ«X÷n\§½9 +TPìS´óÖ÷½qåBõn\֙~®ë’½W;Ïc Ì“ìP•¿¬q¹òuVWb\˜~k…1®#ü„…ÒËékºá‡}Ï+%SŸÍ‘Îîzh2÷Ô¢·Õq5ÄÚÏÄÉÙù3ö-6.{ðë-u‰ë?ÓíÕƸ Õ;2.OԏpÈȘ¾p£(é!ÕFO¾èe\}*ô‹©8ò>ßË÷cvÖdœûRk ùŠ|9ƒ×'V.K)Mn•fDŽ•Ä§Ï&tñˆãeG ’Ü öý®(®”Y¸——à¿¿ŒôY Ü(–þ~é\ßaœ½á:`œ9ws¬òßÏõìûRŒR(•Uק°M\HAm6œºLŸ}#Ņ9fÙµvØ:¾ùµ5v­“Ä•$n}Äu¦²¦qYÉ„Œ}?”%V@¦Võ÷5nH'ŸmÙ7Ô4>&3¸¥Cò÷…†,q!«>KÒÎ/ºš4ã˜Dw¥Ç¿¾srн€Wdÿ\Dˆ ﺾlÏϘCçØ.2œ_glÚª‡§Ù‡ êËïž*¾½3ÛQµÎù|SA (é‚I½QZŒêP #E‡€êç—<a ápm]çCS“Ž!„¥­W=Š¡-–ÿ°%NJä.ŒÂl1ÒŒ-F Ü(8é]Ԃ¥ °DYvr(tœ…uÓ`BNÉkéq2öÓMTšO¶Ö¼”¤›ZSb8NBGEÈJ¸§ÏiÑñ¸ * 6h°M0(¶¥(Ç4Ñ,k!KÔJFc®¨=j•Ùi‘r £øµiED¤øõR:²Br a8¨rK?FÙ³™RJ+–谐U-ªÌÈjÑJ @%Bߒ´°5þR‚V + Cb“Zq6’}VrZÖҞE¸Üåá‘D9\ #Ùè3é¬Mò#CDF’³ø(îåþÈã S#øˆÄQü¨5¤ã:²šg’umä–j#ÚáLÙQ +HGf´Ço'FÒ>Â^„ ùŒv–™{,°"žfñ¨²x5¤i›‹¡¤¬•›ß¨Šˆ²iu5Ɩ8Qéc}× 2<¡!È,Pl…ØÁz8Vä:2cTŠYÀ:…, À‰*§ €ŒõAïÿ嫪ûÛUhÄÙb]³ [ź¨õïÅ:C +ab PñWêíËH¯Ž\íýMšJòª“,î&¥áïjŠŸ€‹ÝUK©N×v•0¨›È®ä‚ endstream endobj 112 0 obj <>stream +&@(ÍÅÀ v™[ºû=­°-(¬_ÊeóùÏêí®F!WˆÃ÷gí‚Ä~HS6·Oâœ5Ë\«$×ʐÁåæ˜È"Ó@¾‹!°ŠA¢ó®Ãøâ_ žä½Ðïkñ“£ƒÍMb›—Ü#Gn;LjE⋆0—•ŒÃE›àØõãñ¯æ1ô.¯uê7ea“n!ëäΫ⏏ácÖ¢ªD”/ŽÐ¥ þèɦ—Pž<JD‚)ÑEÈ/ØòÎqù éø­\¤‹ÂYA*røÊ©/Õ¼Ž’¾žJØüÀ?ê¾÷ôž%àÕFˆŸçêe>mð|Ê%Â*óŽ[c+r+õ¾g©îbÐåXkSœsB–ÜÆj`! (U2à'àüIçt—Á¡3 Ô@M«``Dc¢Àû9$†!`u§:l¹X‹òø†" ì¼e±BË-85Ò،՝ ÿt:iC½ñ¾¹*csõº1Nd®Ã ªé6€&‚Q"ÂAüÔZc¡îqw˜c‚I(ß!¢£nÃ?ýH„ý7 :è½CHÒ0œwt¿µq«-gÉÇHfm4h #Òf{™<œQv͘g>;¦‡Èmð·'$b%‹A gę$iY1g§2ÿdyBæa¼ ª-â¸ÐV§‚ ÔJz¶4'îã€7=ի˨Lô5 }]Nv³ŽP/”þ³j—¼ß?ŒPO+Ó*„Zo¿!Ü·”j]‚çð.ÈIi9hBnX ÑVØÕB/`’?º 9v´D"$PB¯zu‰sèu©6óþóÛ4—Ï`NU»Ë¾ å֊:ÔT¦YÓ¤v 7¬+MSFŽ¦Jä¦rï¡èh0–*Œ&¶.'ďì +ËåAö:W “S9TƒP +xœq¡÷ÉLH&Šë"h 9Í}ap”VÚ,l~ ‡žMVDYžûóû,ð‰’d‰€ q€4¦X€H=¬M! aŠ3’H¢[+£õ9h e™gDƒhDGRyÏӐTH* už æî¸q¹‡ˆËzfcèã’%Ö3Åþ¦ÜƒšBÃ`KR,M<Çò"²Ä˜Y™ø¶[ˆSñ²Ãã1ô+7ќ“Þ ~qåùݑ„îdÂ{,ûí¼¬•†…÷{Lq{@B†RT ©ä@# +'à³wÙL~•ÉÐ%ü :f¼WË[ŽíÎ7EˆÌ섓†ZCŠKôå+:·QŒ&ٚýLý¡]Ç´Enù†$±¿g[W°„›ºò#ŠÂ7áMY,‚%gcÀRœ#DE_•œ0æ¤Þ'nC+L—]È(ô¿™?86oáà÷VÄÁ«_ôãTq¬±8Þ¥æ¨(œ©Q‚ 8„Òý8Þä@ˆOgÑGú)tò½–Ž½ +®O`ДSIü§¿SïÚg!§jþ@ãOùÚí&*‹:t ôycÈ,BJL!aዔ6¦›Ø@9¬q.¼ÝSÛQ@Í]YŽüeÌ»¹R²WԈcá$¾¦ÑÑ4F‚h=·=sņ.\RÂ:¨GHÿ.¬\h[ÿDö!…ŸQº!¡NŒFNÌÚÿüp§C(îä¸JùWvˆæŽ™³@¼g¼Ù[ów!ç×ÙAîØP_õ%‘¥˜DR _ÞØÝ÷ù;rtôŒ=òŸâØ{Ù¶4¨J–ûù—XòWöÿëc>/ùã™V%ÿä8ݳŽC /}DEÊI°ˆ›gþ3\¹¸í͕Π+¬ÁOÙòµWÖÖߖEµ£U@©—aHžG–ŠLä.)ƒ Z(n¡—ðvîv9 àÑ& ð„ìöÅ NX‚•Ka$ŒuÞÒÀÄD°h„þ€ƒ …xÓ<¥ù¬³È#èÅ)©Ê* ±ßL< 6|ÝH›«ètÄ/åd[bŒVQó䝞tDK¿?H«ßÍ„š‚,Ì[:‡e‚üÀÙ¥–ûÕƌsuí.~ LÁº¦l žZ7ƒ%N‡ +}‰wLÍf·{†ŸÔî²ýŠzz›öL"ºa§¿K§öM±3 Jl¶Ej1y¶HòòkåEÑ€DHS©ÙÈpԃ +ƒC1ƒRÞQ|vv§rœ]òN3³ñù6VfkAËl5%9˜Ð”Ù:ãó(u‰oŠ‰”û…1R†TChÈÆÕ#²mºq‚¼éû Nèu†z½×f‘ÔÎßiÅ;#%ÿ€×¶xø<šMkHõÍÅ pCâ™M +¾×!뤎n@U„s¨qh^Ç I„%KåépfKQªÄדe-/…·Ëi36Únцa/Yïˆì]+ô¼9dGQœ„Gå³æFk‘x±00q +åÙÁÿÆÃKNÛuazDA»à²#cӐt~}ÎUXÞéZ'HˆõÖ +è°â£ Àm(¼†Y?Ÿi ü›÷ô=J\ÏÎp¶¨˜¥¬EJG7K¢[)Üž+0?Bå/!g/AÒ¸ÁEP¤73ç­ÞÇa•4>—F€W@—âgâ̪ÁÑ Gÿ·¼ U3C¥À/Ø ÖlN¦Äùoxíãà¡ Ý7¹‘,:ú,ñ&¡ û!J€ön¿BwphîZ¡®Ä‡‘pd,{WI^™ô9¼ìõVkMQÏä¿bBAS BHòɦxë勷”T˜rEZÀ É½Ot®¬­@ÞÐR!5üЪô(ÛÐK´÷LñW%áw4Æ'È…T•i9¨ ûQ˜ÿ7¦]ñ†`1úvÏrp\·ŠÿzãQü ´V¹ê¹o²•mfb¹s“¸³Ü pUÔW\O]ÒûsÌ:«hlN + +‰ eج Ií«mPÙÊÜmÞvúûÐ'í€~B™5ßum$ðùcùÑgåðÝõÅÁŠÂÇAŠ#y¼ \ ¡Š²ÉmÐ"ƒ{4ñRƒàRђÉÀ3jÇ +A> ,ö3%/—}±sYÚqfRéMDBóým•}2F— ·sHb ÇEÝ­ú4( Ö(`aö^´~ôû“¢\$ DüsŒLÑo²è~²–‹ë2.Ã?ˆtâÔla”Î¥L§š•æˆ“æ+ؽ2bJ¹(ï©Gl8²?†ýµø—ó€W×Î_ðBQe/öÜ0Àš¬<«JɠžÿÍ(†ÉÄ(ä|fZF€t˜sK»–9 aû\ÝlóØ+¦ÇÄ&³MÞ9—tðƒUœu¸Ý¿É ‚Ä)yNꀊªqÞõ©#¶ðÞ,za±è ·­ë¡Çö2Xi+ž/ùË»y1£@’'2sû’Ý·„é\ ª$d’§9f+`™3Æ|q7ìÚ `Я­JëU&ùÄ5ÚÛÁ ÙèÃõ™É$@v™­\lÉc—KâXúØدA¯  MëÔ¨ñæê^è¢ZÆÁ5"Õ¾.è´#Iá,ã.~‰» +œpٖqSN¦Ûc¡lHž"³ƒ»"üL%(fîíå°™¿LR:MŽ™ôN‹ç(”8셉_#¿/=C´™øFîh’O),ì)¢€´îÄt¶÷ϧ¸ ä—3/f sÒÃ9^ê3;©kD8¦'ñQ˜vK«ß°îðìãD¤ºŒìþðÅwрÃ;‚…–@‚LO҄¬q(œƒf[Ãl3ãuX؏!ïük$P‘ZؽQÜ2<ø—‰}…O2ˆØŠq4í浞; +¸)¯N•¨*J_‚­p/OYVÓ©ha?F؛|ö¹S}™+ è>ÇG¥Š/hý!"çR¨ø9J +cùÜð}TjÇQѲm~o^t¨9ò…u3Ð)`¬ÑMðCmx&˧Ìsëæƒ QÔ~C ¡´1E•tӐ)؁—½øI™Õß8ΏåŸh¸HŒ%™ÖyÈ/y”5¦Ó{¡ð²Z¥õÚɛþßüW—Ùý-à7fǪº®^#ÑàQŠÉÓ»…«§‡É|¸]Tìíb¢]6#„F~Eb*h }£È } z¡‚•TeNÿäÙGÕ>Á2¹@¯Ã|ëGN§­Û^p"j|Å'lܜd‘¥£¤#Ĉ[¾gýÇì°ù.|‡€£s¥Ýd±ˆ¥‡L8Æf$hmÑgܸ0 +‰0«íÞA(¨®”¬I–à¢n ®i ^ÐÿüŒû ¢˜@åuÞ÷t†®»÷I¯qå»6 vX˜Y¯ƒ,µ×GÜøgËößÆìÂåºÇCNc“¶lýÃdìŠú#'ž¦áْ³Ì±2úŽ ÐÌ_=.jÈärÿSþ +Z'wz<—¯ùf0DÏðñ ’† fÙ دɪ4AWÿ9Ií]˜´ºֆB|Ý +ä»U9Ô±"L£Ô©0ĄN´$~…œBðŒÐ'ƒA ©ï‘":)Gæ0F«árΞ ­‹Ä‹ÒL:óS+1*›ˆò³ý#·±†^wÄÒ{ÖhüÍ¡µêd÷¹-:çD$Ù¨‹+6sýè¾·{ „0] #o~«Ø( ¨‡VŒ*î[®V}5/"ÅñmüdhÍ ’áØЇ¼‚¼¹dŸG¦Ó›dªäqú#tæc6'tG@žv̨¸p¹À@„ÿb§¾¶=£;æºùH…Aõ[§Zºw§šhÛÐ}–ÇŸ¹ŸŽª`; +¶¯¿¬Š4Þ3´¼°{¶‰$©g=]èTŠYE”ŠöÓ¾+5Ÿ!‹ÍX§oa¿M°8õ©°£MÒ/\XÄÊ>–cË»¤·µ‚Fv0õ¬s„ÞrVÆ®¢›ºX–iÌ^ wQ€î³¤: 8Ü_¡Ö ?Cïù(“ÄÀÀ0•Š:64½{3¬n÷õŠÌÆé5Më‡3«DS¾&¯ùNŸ–_suËÕNðTû<4%ò'ë½I µÃÚ¹'Œû¸´ÞZrdxTö+Ô èMBèºXÕ! Ñ£ÉÕ¤úÏyŒÕ"«Æ¨¡]˜b}²FW»°&5gí RN?(/Þù¸yGsC88ÕÂsWO# n]éçØ#õòÀÉBHy n8ÜVÉ +cö³¾‘ªA'ÛSS²T1àrZýÃ4ö|èyœ,` ŸÞpï¢[¥n§VldmèIÇr ºž' “‹ö¼îŸ8bÙuՑ”êì”|ôªîoÕÑLÝ:ý;8 Tx^˜¼X…òªç2é0tm ®eÿ˜†üðL0ºã>ÕÛñ‘@¯¡›Œ­Ü™•2 ÿýX—P´°`Ÿ NÊÜ„U¡F@ŠjÐ%ó¨PÝ/½ðc$Ú¦§T½iž&Áº{œ·pIO2¦É,U°]WD;áÍjI–#D=–]Û iÉ|â«Â„¾8W‘Ù•$g}ÎÈùøy$SîÐäõƒSЉáċ_’ÔeEÉÍyá¨a Ó1“’zdGS©OÈë'K34˜‰·äçÚysxùGm@§ðŸßÒÇ þ·H0ƒÃ晃&¾îº!›FÂg`:"I×:͍!ÌnâˆÉæäÍu띔 ]=6Ù®9ÝöûóãØ"QtÁÃ̦@Ñí%/å[ëþî‚ ·¸%CÍOZæNhZÛ/mê¼$Œ‚&wÔxóD¥1g¶¡§½G‰³o-¬`«õa7ãý¬ÙtÓ¤c •ÒbÇ$PVm­É"+ÎbJ)A@÷Ñ abø}±G篍?kHŸó¶a*ù›!mM»$E±W‹œ KtFÞë$¶£+rA-E`:BÛ0{ËÕ.kK–N;TÆÃ.ÜÔ+Gë'–ï"Wö‹¡6¦•`CéØT¢È µÒåä¤8H³q|kç·nsL`ø©•eR£jlqú$û-¤œ %HÈð¯=‚ÍTÉÌæ3ÁÚÎMâ×ŗçQFö9¢1·L,’ä(O”ì ®“g®˜ƒ¬”D[ELû­èžàƒ´'­ŽÏhs[‹Á¨Áv8䎦µ¨ü„5*,rÀ¼w±Ð›µH—Q”F¶ðshž‰…ÍöÂépø%^7àüM%ÓpYڕ¥vä”2˞œg÷1®_›Ø”ܦÓuæYrQPEª·q€%ŸB*ááíx VQ®Ô¬ŸÈ«@¸„/M:ÌÌÓ?+Ekði²ÝE©Æ„›=Jv4êͯŽ\zRvÊJ¬!nòï,”ËZ¡Z5í0ÿ¸>íME@r+Ô¡î)¶‰À_”›Ì‘PF’?_5èzîéoöùÒò†ÒÔKÍÑÈο‹ì³(w¹®Åá2ˆ_`–tᐠþÐûß9çÖXxÁn 5UÙ cÈ.ڄ2‘«Û + +q* ›A›¤‰Ÿ:;LWC‡æë¢m6Vmú4??0•çù#¼†8MSj ÁR7€5øŠ¿KøÂP›¤5|”¢ É4ͦ‚gµ¨ì81­7›ÁÀ¿uXAܬåõ¼º’‡A7m·Åæïþp^ïQ³¥68éj²Ï͕씗[på%F×È!»ÐV™ÞȽ;•\~JˆH€cQ¹¯æމÍjŠdý p¼uÞâx}¼%O*;ŽÛ@ŠŸÉx9†ÕŒ;ɛé„áë8¿ô`Æ×v’¿>¦ê‹î͉ˆ­ut´Î6fÓ]éLíŶ[5皢Mƒ~:G¢U™&fÏú’±²¾Y”QÊ +‹ûq³[“ÈzpXâS’’–S‚”Ž–0žOA[ïH 4ì3÷˜ù“fÉÌøª†([@š.i2mU&qÉ6ß¿#„ ~o…ëSQÖcÕëc†³%¡JT¯¾Ï³©"[m‚Ád¸TÑØi|!=䬄Úñ¢ž¬au{çt„9_§i; +Y©G¹²íäL +ËìKpH+W6+cf ÓáÏ^ëé'ˆ=Ï rm3»t7cS(>hÇÓĎÔ~\ô*ÐLs"ˆGp«Ÿq”ÂE6#¨ï¿Ù´ =„ŠNû«Ål÷3YW|@ÓõŸGôœZ ږÁOPpßuHÎЈRö[vPX)Îã¯ä•êÿ±…°Pz +Ù$脁º¥äwüšŒp·°ùû"–€ › +‡©N%'ÆUNKÐB[Keœu 0HÆA—}TïT`‡Ý-X!iê­WÝ*uvŸ”glu™ìªë­°8Øø¹2âàùÁhDŽn^…ì Yãý¾ò'… +év'J:ä5֕Ò4q”à‡QŸfÉï¥7—Ïï»A4¨b*#›Y…HÆFLrP‡a][ìÏú€•~S*&' xgÔЊ€¶¿QÄÆëD÷ù‰®C´Tᢽqí_/!mX\ºOÍeXµŸ™ÅÇf¢v‚U ¬u‹þRÐ)0öô؆íÃÁ‘¥SQPx…ґ]]l~…‚žõïIºÂ¨"ƒU¢;ææ?Øߌj0òú‰¦mَi ‘iÕÆ͍@J°åá˜GP½ugÞõŠp¸²Ç«×Ò¥™#pÒ;î3ŠH³DÛiœÃéŒA‡hã 4<Ýèi Td[d}̉ìa +”‰ ‘\(…à{ë«çûåfVX]ãfX£†c+0NAù~× +;ÿÏI'Äð-çí3ªtE.7``Á±Ý^ÉYƒ >¶2³a&ÀºNé)0|I; ®†šE’@+g›ƒÌ “B"Jì\º©þˆWÓ«ê4låÌ¡/öä®óÈY^[ã•!ôg&‡ÂÖÂÖ¾ÁÀ·vWnÚt/÷¸ÅÔ. ‘˜¼£ø•5‚ >W"1˳=ƒ}³¯±eˆ¶s µò¤ Ë2T»³!%_qü$<z-Y̱¬|µ$”›Ó^óÅkþ>ª “ËdŠ¨›“·ìm\dÛ÷3±È(FâøÈ\ÔÎåæ;?kŠfÙë;ÒËnô³þoÀ_!üúl¸+h^â‡ä)ꂾ&XÝ£q3ÅG¶ˆªi‹N®ü‚jÙ!éaÑcµl¼Ì32·1TlE±d#1‘ ’÷* G†‡ÆmÕ:oˆ¼qdåâ­RfÏGÚg»µˆ+ÚëÅ»"roB*’ÚMUŽfJ 쌎ÚÙ=Æ©~†‘ÛP;M&^P +RV¿BåÔ5òGÍcCÞ@bŒ& e3¶­BÎÈ®°’ñ&.¦!f-ӓˆæ¡ bpD¥ˆiœÿü¼ï¡Ätªzš¶%¹ÌžŒÆµO´HTH¡vV«Šªˆþ&U’¿L³²dP#üø2¿9VÈàŸio(s9¶5ø*ƒÑ1S3î̈́»$Hž}«– 8*G+Brq¡ñA/þrÖw©dJKÉ}r,MãP.¢ZN#¦mŠ×+5J sFÀ"4§-Käf* ˆÊL´WUv¼À27!ûÙ€€& š‡¼@ƒa‘ñA)`LÁ¿FÊÀq·_– è5Xü8¤ô ² žôm¹Ÿì­h4èJ%)<͸c^èéÖH…G­>„´*Óø13úÂ/„ÀZìb˜±C§ „]Òsù•Öñš«@â]ܖ¼EÉKĜˆË‹¹z— ±*ù@Lf0ª® ­ AüÆÚ%S˜,Ü Àp7v‚°AŒ¥ÀôÏ°þ!À×wgLñbSžo½Ý*¹Æ¿Wu¦ mvAÎ {]Kjw1|¦^Ìve¤\Ÿ&<8c…X•¸©¹&=“½´´RGáØâ˜õ²ÐQŽá@+B€«öêi>ànZ"ϲSˆ)Áxc#ÈpFævž zÀ·ÿ1 Ì\Õ10Fûª‹¿ŽPŠ†tháÏ'•ÐÔßÁÔóŽç ¬cûõˆ.rLA¾vŽäÆԛñš±›Ü„2þüƒµkLÏ|Á¿GA/HQy +ö­ÏëO†Òlc\o(´ƒâf5Ò5°·Üå‡2Xr÷¡Sù×½CnPGùq9;@À–¥Ê “YÙ}d:ܝð ªVTU+Ê-Só] pòKÂÐõ¸"A¸BZ! }–Ò;÷4ܞj €Q.c˜'l<6ýȁ)Á,ÿîˆ"åÐÆHþ™ Žçá ‚Aë2ÐU$˗¥Beû‚Ü\Ñ-0lԓ¥:Þ!,Ìc_9ØPœŠŸ.Vq¬ªoÞ±“œãÂóB­[·vsá|£‰¥KÚñŒ§@¦Ü·?DÚËq^CÐ~d˜ÀE0ôî뫪þ;ŒÆÎÜÝ'r-5{§CºÅ=È×cRk¢X<³8¸.¦Þè6Î.7ƒ«dÌ÷YWW%«½!݄w{®Ì7(’gÃ[÷![åÑþ恚¯f÷)Æ©Œ„;Å {½ñ³6)N©zThØ ‚?b”m¬2 Iô¿ÝõPB¼œó‘ÿ†7i†Õw;œFÚå­ÿŒ^’eäà Ÿòø*Fٗº•[ÃE¢ bÀªl6l5¢ÍÌÇÍ]½àá{'vR!4nXOE¿*÷±’{l#˜1Ö7K aÔb ßRYpýŒ è%öb:X*¡V.òó§Ì¬ÈÙ8ì <µZ'#uWK—jb±L¯ˆêß%Ð8ÿ9ËqȦöäP҇½üÃS¸IJŒåOQá>*oñq^˜£‘¨hÍ¿ËÀ™3N ]‡„OVÍJ],‘yqA‡#ê¾È{@,±´`0-û#ò³[³ãP¤µ±€Âñ(÷ .,ûvïhBÛ¶`äu4>ã6þ€éù'“ p¨æ+4Ã$Ai?ö2•Ç°éNÛÎu*ùA@–P»H܊lWÜ:öYh†1Z‚,º!¯›ÔÛ¢W¬ö“ ¶;eœ"·_]Pϊ‘´zo^D ¢ž'I –ú{D +Ó}—Ãk RÒ¾Fœ(ᧃ‘ý—j×ñ‚±˜vœß™ãÉ귏Ë1+«Â†6P|SH‚£Îã‘DŽ…2әʸÄ=ÖÜÂözЂoî˜ÆÎ[&\vÌ­ò}=Ž/«wo›:.큦DÝûn4úÏxW¤ãÌáËé(Èâñ^ 4·‡—{6‰ˆ‰²Ò ~k¯9Gš  +>„ Fý× +‹ cº ?(\édÃZû×öסּ k€‹À«õŒ¼µÀ¦fØJ9Õߐ‚ë™?6ئåâ|ja¬ÅV2>lõ±ŸWúò¬.6‰I‡¸Š…=j5ÍcÑKe™ ¨!†ø„·á2½t¼š®û·Þùg}Œ¢ú&”¹ëŽÝGÕ_ÁØ'/Éy€ƒôŸOü  ‰.å‰å–g` M™"gMAG;ñiÄKˆ5q½¦á U’Zûm¢Ë´µMNJs $+{U[6ªCýǚ5Æ«OŠHö;M]“i×3˜zvŽT÷Å`S © 3rÆR˜R8ÏPP-à +uö ºjìk8äs ™ú¶ ¾LLö:â˜ÕfÔ¹2iÓGñ£ ®O÷Ѧn# ½GbzÄñ‰dQɗ†#xô}å0|»É ±´FpsT[X óJR úÙ[eŒÃÜӌzóàÛtŽæ·Ô¹½Ç@®P&Y¶)?œË>‹Ô€ò¬‹ÃqS`¶^£rú÷Ì¦™BÐwÄKe#JA¿4(˲AÜøßk#Âß]kŠ j7„ò_Àt]‚:É£kBSÄ7Jÿñû/*ø«Ë8hYïsV%ö'õ¤›R‰{˜&þÕ·bnþùêB·-ñ„j­ÚÌ掩¤â™˜‰,œÛ¸UîVíIë.ÊP"ŒK§@•Ôy/u9)Xÿz²züƒé:±©ŽÂîd4uhŸ)4!ŽžQ•Ev©üO‚h,pdӌ ~ +ª‘w*–çþÎøªH3Í¡Í +ŽhµþùEÀ/0ºkúŽ23¤n ‚•?é2{(,nè›NŽÇÚ¯X„$rBÇ7®“é94왨>$#Î 8~€Tµ˜JZŒ·ÇYco‘zqûŽÝ%s( ¸ªm@_ÉéTÁ2µ+ŸÁ-P¿øÚÚV’ýªiò·6ŽÉ!:rFn~¬û_RfÚð&ª–¿¸AM6ôÐwÙå2éó–,çŸ"vKÚ3iãbÉ臢wBØX¨®©¶s&Uh.±½üÎí1ʑ½…# †íÍ]Ž©ð“Q0}a´@uë¾jZ-÷bP4Ž²›˜¼0äEdžk§©Ñ8E8Á†"ó֗Cʜ2G‡ Ãç(nñÊ6±j@?ijìae@Ã8w5q²ßcËˌæ!f2y¼í„ä¢2í6¡½*"„¼u#æ •¿žã›*ӓÆÔ±ùãÅ×·jyrÆb×ùlýÖ}Jôýã# ŠO)5d><ñg'› ì¾}5‰€´3,õ?]1sÃ,æïò¡HüéÆ +4š#’4槕j|ª0ƒ²·,êfYð*„‚øÌàç“!ŊÂée¢«t¯MÀ ï»%ƒ0zN!,Ÿ¤F¶Ç„j!`±‰?áíµ ¦ )ê+ðóð~[4¡ˆÃ@˜Aè|RËïrÑÔ÷¼ö4=¬²r]û\[jûö«<ûŽ_Çû±Ú;ËJgRbìFfnD…%´|RíUl@`F’p€z%FPŠ÷+9†¡Òí Íþԋy/± ý'«ÉcX`@§§íÓ~fÆi‰!ŸÚ z—e^piº$+,HŠI¸xB–Õ—É‹¸ +{ÌävÝö’¢¬À™-æ›=èÑíó¨¡MDc °:Þèæ[ÌÑå´Ñ ZÊcœÒ*¼žûÈݖ ˜:Í÷ºûj®KçIV3»(±û&ŽY{UÐ:Ú‹?°¿— 6OmÆ× ÓSsoÊ|rŸ¢p†hvHʎ†íŸ¸"6lt2~D®Ç•…1»— hÍ÷Níý«w* d“h!Í@ö–çjÿC%àâéuËØó_U1’=;Þ13}Êêuše‡—ò5«”G»…–éå)È>’$”°âæ« œû@uq¢-íæ3äæÍ4GI6aÎÓ_¿àé(fõÜ%†„åÉsé”`¥j| þ##á“ýìˆ< g± {Ó©JUØÆî½™Ûù‘Âx¨‡/䁒¼öõ†×æ3§ú6\¿œ^ºkç–ï¡È؅ ÇMÝ,IDcÖõVJ—¤‰AsæKR:¡ÀSIÙ RDËWc5cæbwùz^v”L∇å%܃ +¨á(c }#ôÈr݂ghݖ»Áô‹C¾`Yh +g›¦æPfhœí¢6¡HuuÃC›m•Ÿ£¤ñe w췖vyd5 +’»ñ¥MuªY5¾=…KáV“×YéÓ¨B»ä­Á$ÕFXÔ$²<órʞ[nÖë+Jht€’ª»±n‡‡ø´ïdÓ$^\q;Z´B? ù‹:D¨­ûÝߓ?ðÒÃi7vËÍýºDÆ¤éºº†‚ƒ)Ë~FÏcÁ*ì¤ÝŸð¾YL úõƒ`ˆ äy=Z‰ä¬`R‡u˜Œ2ς³QÐ/4d}ÞÂ]_ˆ½yLõ)ÂAð™KÞØ+4'ëïµ"ƒÍHbѸØÿ ˜]ì lÞÖÎKè%œ_å-žª„B#Ñð4¸æ$“âDJ”©œ¿.×oý#ù–oÖUa=ž:ÉÏTzÙ'¹RŸz3ht>‘rf©u)ãÐu'暶\+ÌcA%LRö:hs[?t+#ÎðßFЫÆúƒœû£„žBâÌØf¯Fh"eÌ^+lrêG÷»¦uk¹YËS·À[Ñy·ƒXqêh1¿=Y€òsòËC¾kÃ`·â°ëèK^»ŠU! m„¯”U Â$"—þPÏÁó+,µl¢“üçîR.Ê0®$î)ýƒc‚®í‚™½GxO¸ýjXLÙ6†¶Êö)Òçß%cÆQTÒë´XÇ¡žØ’H¾™ô<˜~ªI2~û(‚¯è +W˜'E߁ƒ Œ ˆÁ'ÆÆbà­àãˆ)TÖzÈò‘é3 -—“¶«ÑÔW!øÄ¡Qv9&!pÈAºMù³ ÿZŒê4[„yS»ï•ïöŸ7{- '`-9qKÔô’‘³È­Ò £í_⬞I·2 Â½j F‡PܸÆÑC~íëŸ×9˜|'”øJhhý§¢ øü{˧k=@Ep¹Íõû16˜9)f‰YbÍ$œiLIõ1¶Z©Sí ÁS²è”“ƒ¥8ÊÁM|Ó9gÎkr<ìeõH»Bù&´^H'+D¦b®|pî%×ñU.9“Œkøðf¤0´°Œ©w@Kúazâ÷÷×J¸L²¬q«Ä*ÐÔXgó*„¤²9žžlKIƒÚù +q5ð-´«Tº¶•¤qˆoWSƒ¸8à*oh¾ííÃØùô ‰³V”í5) +ˆ VKdDëºþ;ó€£P,h¤BJJ~•):ù.€‡¶@ãÓêåDܟÎü`jÚ*Q.ÊûÚkZA6yA÷€^éq=R-?Ã2à֝}[àˆBûp˜aÐÑ:äºgdTOFŽô$ϓ ³ƒš«ŒÆi ?%[\acø +?ðÁá“õ–¸´Ú#ùìû%ædòÇèn,e¤ åڄÚ|)xYr5D€ÅÄζh@ð] à<§…ð])cÒÉԎ µ CÜQ9љ¤‡B§z(m̛+¾-N:Üŏlgd§=˜@•O_ÜDzdFPF3õݙÑív`~®˜ž6ž‘¬.Óh¹,]6¬ÞqÄKÖæQ°E0«²y! <¥§$Ùwú»£KNH(–Û5â#Ô)×n§m3’˜Ù¸UÜÕ­Aˆ–µêK:Y´k=˜-Ä!ˆØ‚˜#d9†ã)LA»–'-ß05r11Oú`¢¤ÅŸ²Á‡òݾÙQU9¼bOO–±í€)ÄvxMu¶¤¶=£d²€fla.A€‘8:Úæ~„ JBH¨ñ'#G!ç.ð;(wšO²”bEGx’“^j@֛$ÄPÙÿÿï·ÿÿÿŒg:rš€Ú쪩DÝ´+çÐwpH:QvÿýÿÿoÛÿÿÿ½í?Ò:思w(_Ñ ŨÚP°N×'LlՔE‡õ¢{Ó4ÅmqP‡ª »«_um³£Add3“­>°Ö¬D~ìÍe¶Àe%ŒdªœÞ¨´ý#@³Pð¡h@‰Ä#1.øx. +„"*6L4H<¡ ä¡4‡1Ã@E)d”¤“ÖyóZSáTW«9„-‚‹ºÔ·‚.’ ¯ŽÈº'`—2Öìµ4ŽFû„FK°í汃[aõ“Û+•j|U²7KU>h¦£ «'›…ÄU»²eÀŒZ2G”UÓ¯¤Ž¢ªg¸fd'׺;<§ 5숝-ó TïªGOEödœªÜ_›º¦"1§Iš4´g@Ž%:S_‚¬¹¿¡eu`¦ÒO˜Tä±SòÒé¾~Ú¥^°t[Q°žêE˵£$po¡m5£{ˆa'©×¢©Û›š™Þ— +2픽FQ4NΉ’¢8ˆŒYôz©Aٞ„¸tËS嗵t>½TJˆ°2™`X+µ’ËR)¹7Hi0RÜ@u*«oÑÊÔ@*"nzoæs¨àÄ>Qq4™Ô5-½O‡}½¯VQ ^Ë(-£L˜˜ð‚Q„ü‰')ÐÑðDõCۇ%ˆŽô‹“)±Û‘*à/-ÍXt[$¸:ŒÆSU®´PBµ0:Õ¹ËAI5yRAu.§äåöM¨QÎñ+Y,ì¨ +yU8¬8³à‰³FñiXµF 5Ê@²*á³ôMÿ ÒӉš?:´èˆª¶`Ù¾ßÔÃuEÞ›:#ÞèL§(ʸk¢gê„]èYæYÉT^òÜ°*( žÌ:§3 +eC李?NäNdÌðBƄxçÅÎ]гN¡éoê¬5à³w0í:ø]rΠg’˜)ð©œgĉœÆ…'#—8MWïQª×ªÉ‹"Ä:déՍX2‚{ÞÞ%"€J’âÍäJT¾ÆàÌ^9ξTÓCkÔ=N§5Í.ۑœ¼÷™ +:¥ã¹¸eú}¢2ÏÁDñ–·wGv wÑÉ\I‹ ˆ¦N±ASh¯ÏJâ&çQtt덧øÝŽ:ˆ]‰RliҝŲí¬ÛÿÃÃú Y—t|À}%ڍý9 ÂÖ…Ä Ø»–ë„õèÝv·Ûnv¼‡ÝwÐ˟»jZ\àˆé ,Où°3ÉÑÅ̼G‰¥\/²}××òœŸ\ã7šØ‡ÿ_‰‡HÂuƔY¹ÖQ_R˜<åRöÜülØoFÛÙË2:"Lj$,ö_`ÚpdªíñʝÄí€õ¥kéAӈ9Ÿ6ßgbŒ©1»pî* ûƒ*²Ï1J&QOÈÄC5N¦X-–‡|¾ÒT}MOJ1&of™T‰w¡Ñ7ÂRIRútNš¦oÛ^Ì/]š$e±PçÞ'¹±ð=2“õeî}^Ç)U,ÒÈgæ•2§+„Èñàð ršÔ8î‚0m)ÒJˆßÝԅÓ@µÁ‚§E™Ê)DDl8‰Òéý´aòCñýÏ ‰j/b<ê<<;aõ¯( (ݝßV¡yb28,S÷ìâyxÉØ'7lËñÎîAAØ{²Ø2 Ê­ÅÔfT"4˜²àÜwÅÖ8÷¥¤2ôÌ÷ÑW†7NìM yœ…9)ô,I‘àØ2ðþ×6Jª>JjUrˆÔo8„ó5-·Ý[E9Ñ””ÞGu…sA›}hݞg[ÍKjåAÛúÒ¯º:ó(Š:A!ô%Âlòõéÿ†Á*IÑe=ÉۑÅÚÏ÷ïÙ6¤Ä°(ÐI/Éí×jd²‡§Ó«ç5®YvØ$P:¢ÁX è»Û>j&"&´!”´™WŒ¡@P[d0,aPMKVĜ3¯ô¹’ÔÕ)[VاT&ôlA-ÀN”Aý¾R¾¢ƒß7T¤ Y³þéQæÄ?{*Ž€‹Xñ‚ê;IJ%)KägìŒ_‚–Gh‡\”AÉ?àRE÷4ì7ž^@eF¾÷(I*jé&’Ô'ë’Î`áÓ®Zt¶ –´5¤<úÈßߧZ"'IåÑA.¥@–7Ç.dK«BÀI<džö,i—Lw½é¤xº%ÁREðmßGc'S´^íPïù²Â¤©¾9`‹¼lüð}€ä^ïðwÿºÍ‹ª>ò6âXm +Ì#+8¹BfÔŒÑ‚,,Jë‘rÎ=Õ.º8©B± à ª +øÜc|¤ç‚A`ØY‘ÕñžBn©-´_ä,ŒŽT‘‰DqqªΑ"Êå 3X*%ræHM"RøéX÷nA,쓧ÀÒ¥™/ÆhÜ}»S—ÛH9ÚHQ–TjX¿ ìÅCòÿ€í)ªV—!w•Êòvlá€k¯EŠwÎ]ƙt¥¨’´u҇úH¥YqÆnã#‡±Ò`©A#²NÊ™àԚ¼‚%ö××`I5 bðÉOl§ñ¸üD”%"‚ÓöÊÏ/PŽ81OýLCoØò’Ò4½,Û¼‘*‚5d¶Íè\¾@ÑðÖ5l·“ÔÝ˲Gò6R +ëyà¤'R_oÑ˲֯‘â>Å­ël}ïCÔE.¿öŤ°dû=4߀CÑW*«òÄ|FJ véïÊi­Û|‘ÔLó+Û±ŒGÞXä«òZÆ:Ê{Ùä'Î7ÉÃçÕ"¿oqSë¯ÇÓýAŽšÔø.¬°$ZðÊü¬^ƒK~ÈWxÜt!üÂ÷“kðÚל೉þvd7æú(è$74øò +'WðY Ö!øýˆåN 5ßå7ô}JAƒ6oÇP°œõRÐT÷¸Ap3öDw „ØÜU>Év +,î¢=kZ[ÕÐi;^ر†í&V´ºI†@HíS“¤}àVhOë`mÏُM³w…Ý5ςÊ>«éÍȞ Ûj±±ûq¦Kìö¨zØn79¹ËöÓu037ÔTZ2¤²î”‰¬» +9×]店Y}M։ßBuB† TSGÝ/4/ªï÷ãr_=½ë¶“æt=´·jº¢ž¯µ˜Ž°;1väbé¦Í㽏>õD¬~ò”ŽS¨gkèzgMè)ýÂÔ]‘þ½gûÁ¼•ñÑOÕóéEÏ÷ÚO±sí*oJç)ìùa¾–Ôÿƒ«rND”p>J­#GPð+ºùÂ:+Àú`¦ÓSlNã3†j$Ζ$º­jýæé@W^‹"U¨eZ¾H·¨½°¹É¾÷æXX‚eØ®9u? •É†!Á 1{Í^è˜_k_Ó:—ìY¼,qóq‚Î5‹~j4GlIo\§…²'¿pÿ9-¥ìnò\bîЪñþ"iöV8ZڝÅ#aù×aÃÑO“Òw8‹ÑÃQ#MØ=9±*,¡[í/à ¸$OB0ÙÊi!$Å,…$W éâø²ÑHg*Í@ñõ™>JCê ¢gÕ)Ûàd0œš†ß:â逻/ï"¡ -×Cÿ]Žè=&ŸÊÀ“ˆ¨7Ò0øúáã‘=Tåý«„ tx[èÃ¥>o1ðD&W±cK>éÒÆ?ÚÂP6ÃþæǤ "ò‚3tR@P0èþªJ4 ¶–wéåp"ÂëÌèXXÄF•€„:‰  è3ˆ8º) ð¸6$ŸIôdñ)ŽGÅÞ3Ï-Õ^ÞP7‚ôA8è:¥õ–©]N¦:Í] Ì/a«>P2 D¥ˆ:ßצ¯!á…ÏIÍÁ ÅŠ‰’[pPO‘&Gˆ=ómŠµ¤U›Ï8®m}‘MBԑ¼“ŒÉƒ˜é—’‘â"æËê.¬|÷Âò_N¤~Dv—¾7”JµãÏ6ÿW㩘!€§ß+ž‚§,%®ºò3ÆÐjâÂ'3KžNÝcjO]R=(pIX…¾¿i&ªâÎHŒ˜VæèwbÂÿõó{D4tû½ÝvÍêH+ÊۇŽÍÆ~Ǚu8qYù"Î9pŽæÒO& 'üÊ 4…g¨µÕ€ œ4….¶.Í}eX„Ìóq‹Ó;Óñ Uz• `¡¢{JU›Ç*ÃZOÜ/ùó c w2æ†É•<ýp¹?\ñ‘"ñfݍõ›Õ³J² +ŽA½ÃÖžÌ]ÒÒ¤5(Ԛxƒ[Øý9¢4îÊö2ÏAWf&ÍU¸Ò†^¹{ľ4y÷qÓ( +Ë¿×=hAgÌô@ê6ôÌ´PYFmM„&cɀM <ÄÙѤ^ê^ôÂo&iT ±šk?p–”5‚cI3ª×²ŸÇcd÷h3,iÍÿ/{s©Á´OŒ²]Z§“(<¡$®¿¸ ™šJ žDæ2_´êX÷f枇çÛ )÷$8ó#‚ž jÖ¿—LÙ®ì¡&«‘9ª.a³¢õ(ûÑTUOÓòü˜Ù¿Nž¶­º€ãufÄ*À#š㚮×Ë ÔÔ9`go.‡*µVë|×H,©P%H +õD†µ˜F0{AJ8€²êwà‹"¸y^Rç@ÔwÂ5œDbÎ\×âÁÐsüä×ï©/ + @Ÿ/`?É:òÞ¨³FÒhCZ†‰¹6<؅!?âBgdE°Š°7Ú{AbµDÖÊIP(o6cÆG_.*'b.ÑÒ&ӑ¦ ìUÉÑc`pO•ç—ÓLSÉò`À=Y.ðÔå2gz^¤+™ºRDŒu¿d†¤‘ ñ?ʶ̂Y€Ló f +ÁD,ï@ÿ#–5•Ék¼<¨u,Û§h ؚ`G ˜Z4’ê÷R£ã0™r, æ1ÿ–X$PŠ5ÖB—tÆ3Ñ)®! Ù€²•ÛM+Û¿3Җ+R›c5šgõ›WGG ù>•*,y3«3D°¹úԞh‰ +Í`F]K5ë” ˜ A،l³¯ižfþ‹`˜èæºÁ/‰ÌY¾edŠJb‚Ò͝ªÓÒM ;üfÛTS¸Š>-üí<È-¿H?ùö”Ґ&õJjø O—J^:×DHŠ}¼IPˊ;K- 6$TY²/E Ì¹Âç¬9³ƒôyÆÒvAˆ@E‚ó£QWÝmÜTS6t?š÷‰ŠÖF:ƒò¦ˆ!NÞî0‡>­€-”±üƛ‘9¸8E2ïp÷Ù¤•ü@â2ùAŸ¢£å1+šØ•V&óÃ-Ö <ÚðÒ"qS=$7Ì ÐIY‘ŽM€ÝTà֚ýqoƸˆm!sý¦ø¦Å^Ì×qá÷ÓÁÊm^k6I‹rX êáˆéÓ/Xhn ¡Mã„Ù(SÉGþqÊõW +÷åJèe*í¹‹]StaŒ<çx ²ç-é~ÄáëÐSЪ$† AUSÁoXšé•Þ¬Ê@aKCBâM‹PÕñ$ O`J£PqXWޓ7ÂÈ +,wAæ6üŸÙ`½G +=Ôr&ÌD¾ÑM§Ô\pa€8p HЧƒÃƒ(VE)m†PŸÁ’w<"¦`ïN.f>»•%ƒ«D³X“©ÿððÄç—•Ãä¢ðùìPPjEC¾DÙàqwkC —ó³â¢H*% ܳMÐ@æõB{Nmiì¹9 d„ Ízöfbu:>0 ;ç©GY–˜1Œça<O&´r žÉžÎ‘xßÙ|Â|ïP0ےïºs7Ã\· ¸Èâ¸3°nÛ©ºÏ +_pD—²óì¤fqÁuªgu¾¢u4°ŸÅçkÈ+xNlÐhíÒRg›çüŸZµ^sÆ Æ˜3¼\ÂrVû”“Ýì%§” +9UڕÂqŠkF虲`œ/¾Žç1´y<î»jÒ'…Bœ —Âp¶O0ÖXá”ÝÒºœÓ”»€S^<˜:8*ÒbYUJåËÍã¤7í‰XÜ&وg›Â ŽBmÆÁN´õmVÝB,fóغ°Œ£K—TÈf; +Œ¾Äæì–ÖØ\õ +šõËb'ÆjË°äæ'á 5÷‚­ÔRN™¦›é[œ{ËÇ*Ò:ˆæ#-ú΃ÐdÛzš¢vbùKÂÃRñ%»¸^§•b^Øì«RQcL¤gÈȘy2··aP£ï2U‡‰ÈC«yn¥*…i¢Âl_ïQd”çö«Ìù–(Ê\ÛúMfØ@5ç QÂ(É|á 2Y·w]±1ËùýýÝfs>Ý{Ì÷ ‡cÞV‘B´*Ôs…ÆœÝRûsOɲ˜âC ˜ÿòb¡õ 0˜Dy{éæ&ÍÝCQšämW/0›J€)}gg½C”h$dÀ“éö’Jv“z©žµ¼¼OÌ2M)>å.O!nܭڋêÒ×G—Í §›K‰Ñ äòu«ëˆË€!Ÿà×níipéG0ý$c&õlá[8”mXuª ôg}¦ íbfùòTBCYž@̃hý€,C낸 ô¥ÖŸQ¥Þ5²c¹;dh,±ë¾²ø‰ŒW²2‰bmO ]é0½ÚWæ\¶ò&QÚ²ø +cȀl®‘ëÐ3Tex‰Ñ7(‚*Y¯ ‹=竇N*›‰uLz¡S—„l[$ˆÊvÒ5;¨ì+OÉWԅEòJó´û>“Õ{t˓ãêðûƒft¤¡á“ٞ¢Ç^½®$ƒ€ŽŸj—‹3r¾ü?‚rÀ¶u4B?K9`ÙrŸªÈ³J\¬ö“(µíªn x]Õç9ì0Ñ}ie'䕂}:8¬ýHŒj) d9þ— +úº°²…T èÙzé;ÌxÊ @§éZýO%¿)z6!C‰þ½xš:2=—dfûœb˜žê¤˜Ö.–Ðy¡¦qŽ_xö 0ûËæN©bÑÂn*]¡.,BÚwÜûµÿË*á×Z¯RÏÈAò§^Æf¿ őNŸ{[t€ìl#ÂÅ×܉å3fZ–ÈT_Ð}*l°.@•ò®Òà%¬öFÕ3 +hZÒ§‹‡¥2OÚ[ YBÐƑ@ÿKH…d7 “ +vÂ~\ܹeŠÍf{yóèÈĸ ÔÒ¿ QD…Z`œvj^–i¼õ¸s® K_äkÍ«ÖS?M(Fóoq_хä+žêO­D9rŠûª.,C|ÍEãXú•õ,ª K/탤 Ö…•­U*?ÉOb™¬ k~ˆ½‹õЏ·º &X—ÑqÎN6¹Ì¥1´N-£ŠjèA§“LeuäαbùobÒÑ ÈË!\-ÅԞĩd7(‚øþ_¦«­Å­ çˑpãdIxò¦ö!¾,Ü¢¥.¬Ü"Î|báðª˜Xù>z©E„Ï庰¤¢P4g¾…'e%Kˆ=xgè5ôý ÷­ +ýB†Å¬%˜F“ª={þc3ÖÍ¢ø5ïü9‡âV ÖW¾2µ4ãDNª{wë )H#rÙCìçÛu´dؕÃAÂ噝•‘¯Ø,˜ÆîaŠK(|WŠíú¯ˆv0ʼcÜ—±Zs‘X#6VN´2HTèÂ|QÓüYÎC5í¹xìðŸ_[™Ÿ9ÒÇ(” ¤ B¥¢=qê7$Ðñžàñ@asåm—¢’HûqAU#-µá! ªöôMm82è"OÌjtWA‰wrº^£$£xDfV¹˜ÈжfY‘ùŒIYì‰"õ´§|Ù¾ªDåöː¿Â=%¹Í!ô\¢¥a4év¢,&§ƒ;Mˆê`9bc?à9ýJTPK Oߺ_݃èÛwVÌ ™ß‹ÁÄY-H>…;Vj¤Æ;‡å¨µÄ%Û¬³l]XôU§mIig1õƒâ¤û=x ¬ÔÄ:ʝ"Ù(âÌǼ¢ÎöšË ¤£·vÿƒÚçD  ÆôdÏ +AC³È-„5ÇÑ¥ÌKÝ^« «'cÙ¶¾ç‰ v±f)r«1ó+ŸèÆ-:¥8ÖׅåS”ùB².,ú„Šâ탤ŸÎ’EXKtg¹¬òÛ¸½„%P‘¿Üª +áô5å¨:ùº°ÒOˆîP© ‹rԔz³åpj.ܺ°¦*ó‹¢×_ƒÞRÁós§ýá‹dùËòãwÕi˜PJꢪ ‚Žts<܇ٞž;ùêÂÊ_ããÚº°èf”ivæÍ20šÌׅ%±t§ôKo²Q²þå;ÃäCF |ïw@ŽP ó3rz‹(,'áÐ”À$è-åDñ½纰hJ¹D҉•ðcBo‘ÎÙø9ŽK ÂZ½s‘¶¤e66LÝs”¤„_uoIúR1ÎáÞl‘Ä/ªgž †¡ µC¨.¬3ìقrú®.¬ž é"öÙoPrëÂʝ7 E|.Ú⿐ú¹r1+3T<Í8ØN¾„eíÒ+…hžŽ(€¼¹e¤×ø-U³M<ç ¬¼ÉßL~gñغ°L)*8-%嘫Zè8?ž1’—ÐŒ½¨Ü8ˆÝ|—ŽÅ=-ëx\ ¬S%€®dí¾2ÔÄ;†ÖR <>Eëq%©F"=¸,‚öФ°­ «É â”P7‘Gy æQns©Ø8{ «?“0P_$ùúQ6‹¦–κ°Š1àöø¼~‹ ñ&‘ûDã÷‚è1á°súùºLX6ÚÅlT× cڕéaÆõ9Ûå«4Jž.•—Há{×\;Ãέìx3(á½y„~WÄ N·:/¤ÌÊ’Ÿ¾È§3ÖGÁ”\Ž5^BjýŒ¾XºL¯`/an¼²VÿÈ?dׅu_5˜þ3R2®Ù]i…ÇØj)uè±—°fµŽ™0NºšQ}”à{舕0H…ãtùÈÎ\–³<íJÞI}ö)ª0³_<¡»SP€Zü»®Š“b0c$ñIÝ~¦ðeÂF3¥£åY ÕF“;gòKP!GKoh˜RêAõ1K#œ£²’á|בŽ0+ãü›X™I¾<’úET$®)ê‚ñôúÑ*Xb˜ªÝ"ÕY™ÏܱÒó6ñQ?ó4LMòæçU¦N.ÑHú@ó™+9tUÚŸÿW'ïèØ]HôTí•ÌVeÄÎÂèҔXž=Ô@À·¬Î¨îÆ• ½4LùÚÄD¡NÛ$¾ô¨7Á)Ç+4LÍúß¼Kx.†Gê¨Ü5•·†}GF´·J‰” "\ËR]X…鏭º°<!aƒu8¤aJ²—»;Ö4ï îs8]eA_¼¶Ve3@è®Å¾½Z]X~$2u?¼ 0¶1Pô̆ +E½¨šOó RP³aó;@ yðìҎÓÙâÏ¥Pzš`ý×*O"vÛÇ]‚.e"©õ\ÏPê÷ʦÔ"vʲÐîDD£‚4dXÖ\~qõì߄PüK*æÒÄË8Ó¹þSE/«06ø4ut©^ä[‘°ö!‰ƒ/ÏLÂ70„l‡‚’L™ûË÷5$—R9 †ûÊø¦“%:{:¾ùO2ÖØBáWÙº°äÉr|ہ•Þ#÷…ñÔà‘6éµNá/GRØTžbd…PíIòEâQ[–¶Á[iÝT畺°þ±,HzY„=<ö*âüý[ Y¾D‘£D6±ÿ’„â\Òû±Ií ‰üp¾‘Žà=áËÕgEhÒ7ZÊü8+h\¥%©N¼ÞRòe ÿŽåZÕs§SAÐgÜo1¾¢˯üï…V^0·?à3ˆ-ëX ¼3›˜ûc£Ó v_`Ë9¿Ý¼ù [ÖOßå?à_†%óŸ×(j€/ÝÇáw:oÅQxôn¸–Åân¦Ö»ÿwÝKƃ87 À˜Lí¥Á ”õ,Š¡ÒtÆÍý”ÌÀt©Ðó'ÿVó‡D$6ø$ÚxD—X u% &€ +áÁ¤vL0’ +älŒ–Ô§„¥Š'~\Ø/é'+4s”¿lèÈ2˜ DTÓ·´',Ñó¬HÌp©ƒ¼q&Àé^, +c=Ø +Ã͝²,§™ÅÃÊ7ðèhì@ÒzõR[|NÕ¿yB1ÙëxÐÙÜudõ0F1•ŽˆZ tI¤{¡µ;wŠÏ°ï ;àËðOADn ì Tõ¨UÓï¨þdtw p=)tÌež½aûÂÐ î=ðO„¦y]ù7۞a ç|pÞÑvÚí» ÒÝYË‘¥B7¥º”ýTÑ-ˆCÓÝ îÄ£èˆø'åÂÿ pI¿¶“Ê£ ú­¼ ÎΈu8g¹¿ »'pà2nj ô…JbbHšiBʁêZ‹©±.‘¶#;wâOÀ>AÊA]ª¦Æò*”V&‡ˆ”ÕGÇ-Ó¼$£q®H-špêP’,Ìâ{OY˜ûåV òC©™ò7Þy`œ+'0_àK@ì;¦|7ýbúaßfÔh»+M‹`°cË\ +‚†zìŒ#p0¢‰—ÎÀ,§¯¤²V0ýˆð‹ÙeqÄî]ª“ô½ Æê;&5Q¼E,_€;]ÜÃAŽ§k˜XÝü@fÈr^XÎö“)¼cL¯@ñÖÿ‡‰õÇþlò§ +¹2Òè}“_AØ9Gh}ðmc0·¡eKP€l›±æ²JQ`•_ zHÂHþŒ²«wðxÜÆú( t‘âa\¯ëO { •ïý‚0Å'8»F8@,Ý|€-¢ßf¥92d9‘r±çº›q£à:z²H{J¶ÁJƲ8r¥Á ˜jrC'üÞhˆb§«î¹ Ìf ØHrã¨Àðˆˆv†ÇÓO§ëX§†…J ìî·mŽ|LÀ¬…¤D[Ç\ †ˆâwiûZ÷1Óè²:C"icëe0ZȖÀӐ´~©,ŽÀ|T_‚€MR*„%ÔrSý¡•”‹;æèµñ ƒ€ª‰³§€Ó7° G’ÀϋÖÜ­´8±D¯ñ§ì€OS0ؐMÞÆ(L~QñPñÉ"pŽ¬áèÑÄÄ_ ítÒy9<à0w‰NçÔÕú÷D"ô€º˜= °™1Àú èÓ#ÙB[ЋÀ,–ð$ÑM|O l #0 +éӍ¹5ùí-~iÙ!—ÕTæ˜it¸~KŒ¨3á)ueBø"@ìj ;F1cÙ5ÄA©4Uÿ Žd†:輤á|è™õ·X ûš X¾¿ŠY†@s[|VÏÒt!пÌB`U! qòèKXåQr8âWsŸP€’È1 e£Nú¾È&íc¬Øƒ@Gë ‹ZÝ[Â(jxþON«>$”̘cú•Ó„í;D•ÉŠG p+ EuÑ6‰ p…]:¨,SäKÕ¸jèªlÝ]l\Ŕ^:{í–ÀðÌ¿Ä)—6 +£ÑÀ Eg´ŸþTì-yf« +X™ˆË¥ Üå<¶áE蚫ÀY~â2Ҕº& ª@ϨXUÌè×µVì°\ëÄy ˜l.JåOì€U‘ÅŒÀøµRCb¡ë<€Þ07äEJ´ñ€nToî'Ð (]OÕüÙªÒÛÀ–›0×/ã;àiè-sÀ³·‚Nîñ\„@ˆ åÝtä‡Ûâȵé@zMÃ`O7`¸ˆÁ FxêÕuÀA_?S”À h¡MTض¢‚ +"}|˜ ‘ßÒÐl~ôèÚ. ªw˔〠ŽöbÔEá (=ôlfD8@•¥Yœd€Á\´†ÕtZ5< UåßЁ£›¶D"èû1®<•A œdU¼ß0g$°½–Gí•$ó(äÅh € Jk@“Å"æ̘]FhMuڝû_ÀR˜5 ‹Y°LÌ°V9Ӏò0—Í3k¤JX`O^íñg%É#t­ŸëÆá*[ŠŽ’4òÈ +eT¶¼¬à…t÷¶ª4 ˆ–R*¨×¦º +&0$£&àEˆé2 Ly±ŽISÆë|%,£Œŀ뢼â¦w&mˆ·9^œ›Ì2 ØKéD+’1p‰̍s‚"_R I iñò>º_ç±r?ª­zOÓÉ*c/  Ét%½€:/ ï°`#{€„b²’˜0 hzÄ,F%“9€…Ú.à¸XùÊ|–·€[ži¢:G鍕ÁÚâ©y¯5q¯›rm+ )i/p³ãð É÷ù-0"¸gÀ™-Ý«¶&±ñú5¾†}JF9 + èؓÎ$6v `/ôu©½®gIÀWÀus| £xáÚy$`g³×(lƒù%Û¶šZ9²N"±ZX왞òJÌ :OW•)ú35º +Ž ……×€ìœ]Ÿ«=¢ä)@(=§\”Œ2“Vª +ªý#¨?LZSK÷hÁ+¡1ôBG + +–ª 5S + üxrrÛԈpôâñJŹ›Œ„ÀY!äq`bAIP@a¦ßÑ"À †R<nQE <‹”ò è!YŸƬ¥3ÂŒnæp}ã®Ãuc›Úà»@ƒð$`–G°DC&ƒW…3u­ ]ŒŠ“Â?•M@×É­t$ ÷.–ðݎ{ H™5Ç÷¤.š”´›N7—€õ%¶ ¨h ÿQ¡XåJ£„Vh>aoB%@/.S)",o0½õÀ<˜ÿOóyž>'ÅÇÌz’–©÷'ôP*“c²trZÈ$å_PEû|îÞG†5~å V•ð!çyՄ*çªñ˧»[ߋ#8…ø§þ…FC†dÑ ÕP†÷^ÝhG#KCæ!3t¬côEa}jO3ä1¶êÃøó\°Â$Ða\öÇÑz€Ä~P>HXIŒŠ"ÒÚ6.ÔÓ¬f’{©nŸ9i4¡¾fHÁ±DAÚJ½LÇGz(cpO" Ë«©Qׯº.u’®XÐÛí³oŸþ‹à›þnôSMÑôã€5Ó¿2[é÷óG HìBúZÚþ*¦u’œiðý"àLWë J9@~©•%¬ӷ‘AÀ¢ÒŸ§ȁ@§ôƒ»óéÃÊ*‚ñÄp;®€È—~L"9¶W+xbúÛ̼Íô¬›EPßre@åÄq6> Ó. +¯šqç‹V`2 Üïߐøä°äØ·C ëz@’ã ÐẕWOáZ «Âóºü"1ëZ€§ÉHΊЋöpH1Ó?àŸ¥ #ZÌ:遠 @ŸÙžLͨEÁH›]‰S–—¸º“¹‹b$T×%Íô÷õ£N·.~ûè(ªìF±M’è§^äÜ.Ί-€˜°cð58Ô +¾ý*c*BŸbhõV©9VÆŒ(ú‚c&ewfeŠúüÙ£ÚQì´2öVÎŒ +’"@›‚È¥–Ñ~†@»¼J[²W¨b…ês6tˆú# +y¡Ï– +€`¸ù½öVé¬uø°“»' {ö«cÏã iA Ÿ.z·äˆdÍ·<ð2[–GO:"ï€N€¬a{—Fßa-þs’èôð¤ÍPóo¤ íÃpKà»Xw `³Ò ÄœvÀ.øóÓ¤Ÿû”)Àfœ¼²­PÚB)æ(2B&Ø”h>tØNñâÈÄã 0 Àu.)0–Nbøxƙí3‚óÒȘn ËlH}<‘4Ó(°JóóO¹Ûº Œ.¢$$ÏÉïîY +³ +$‡)Z£ŽÀ@퀬ú­`€´ü/=ûß*–vò&!¦&Ë@X€&4A †*¨ØžçWXv`Ì~ál`n7€½RAHóEgXÄâë¬á0è]lì⨠¢YMxŽÞ‡¬ +zrµÒFsq}d2P¥u¡€nà¾uÖз‹ú/‹ž¬¼«tkXbÐ3;’@úó + µä’Œ9$´û5™p»'LX”<%­ hÀÎV#Åß4½O²=¬4@¤(+ÑI–rW\JHNPýŠþ—^3-ÀŒ0íñ€ Ó?T`@GõF̬¹ËÝQ»!Î@ª ÒÉ`Éê `¡›+ÂҜ ʏ±ÄøF”4Èg—¡`€Æsot(Öca”ºÔWzF§wE¨Á-ß æwODc …F¶ +Èì@t …ÓnŒ ÂÍàý–ä½W¾½ ¨Ö<®üô]—Äuûº®)âÄZÝzåéãýSÙy[ó Ѕ+Zží QÊ G;L #Â"]ü‘oüð®,hå÷È@dÌàß¿“m ?zîÞ èÞ(‚«”T½hhòp͐µ¸sxR± éD € ¢¼þß1å0:ƒ¤¸X¦¹”-óšÕy U)¾´ðÙPè†bBU)\°vÐüٍ2‡q_- ¨­ÿ"5Û£ &–BþÜ&‹„y˜Àü€’[¢¿kAxy˜ç{Ì eŽ[Þó,x©a=XÈOWeä0¢jààdéûF€îO$ +ý£oH»]ßUQÎ)ʼn‚€ú’úR™ç)x2c{90OkØ£{ª²Šo:éKPE eqpe{X +KZ exד”PIÐC›öŸd“(ÔNñ͜á†3¨+ŠÉþh µ€'´QGøÿ¿Sê¡þ©Äà-îÇæÑÿ_*îé#ø!ñŸ cÙ»ÿ?ŸåÊþ?Gš%‹}åUÿ/ÃK#ýÿäºÍÿcÚK£bòÿä Ê‡¨?ñù(¤~{ü_-úŸÞ †·A2½ÿ®'__¾jӟZL–i ¤I1êŒå€ƒÏ²c¨üÿÌ¿=\2”ÿœÈ©ìÝùçï&Sxú+q×x•ÿAÏBz Ÿÿ=ً¿Á÷Ÿ©6‹ÝAEè½PèÜü'ìô¥ø§íï#{wÒOr91|‰©‰Äú’ó‹Q,ˆÿ.YJTa9¶ÿ8žËð¿æaè +n*ü?ó–μŸÊb0aF/²Ö÷ Z³}“¤öþ¢T[zk—Zó\yÿ1iÿÿ„?)Ðr˜xÿán¡Û³ýsEÐïcv©vkSôÆìÉ1÷oðf“Ê‚û7‚ +*Ã#çí.üäö>6NÔôf¹³wµ•Äe3³?dÄñL ŽìI(ü¹¸bi±XȲ]O…¨yË ?”Ãé` Å¿.ûˆÊ¤ÿܵ¼0ïߌL¸j¦Ã¼]Äê/°%P¿ªÿÂ!£Ìê/ç@åó©èôw•;P4ÍÓ?›Èt‚'K”;ÿ“ö̽ʞMåÛòèüɵ39e2QúÃ7oâ@ÏT(XÒ?ñ‰Ú*‹_úÿʧó)€5B”l±™élÊ.ÿˆ™@ Yþ‘Ð[G¿ NgÁ +ýQÍýfjÚ+8Ò;±ùÇ,ù£4£|6Ï0oM揢\%ß$˜ÿ5$NíÁ ¹ü—ÈwŽ?†ÄÒïqLfüçUnënßlÿŽÞ%‡iüyŒ ËÇ_ˆ)9“Û¬IQòçTš» °…¯1ñÿ*¹ùùæ`ӗ?æªã¯èXR´³ñ‡hý2i›Æ_;«mZ먌¿Ó|á ÿ%®åÓ3n5ìâß«·Q%‹¿ÀH+¿(>‘ƒNs“'âïIåD8ÿþ”¼Á¿sÑbf§¬^ߟ¼(°ý[û7¡ïÐÿ¿ !¼²-Z‘–]ðÈc røwÌ@7? øã;±#_?#>f;^¦`‰¶àñÆfý’å,yÜò¬´ý=wæ¥]?2²¸kÃôK6,on¿F˜ÑÙ{ +'µ|ÿ£§ÿ¹íGkŽÃ-`ÿØyú¿UßoýÒ»DÑûí ʼ_Ĺ“÷+HÕ¯ÝK“V¼æ5 +fzð~·h¿{!í° ( y÷çb؃w÷ÿu&(š­tmîð©û-ñ\ù¹3õ¤ûY΀G`žÿyS×ãÇ íç0‡æJL2£{9û·kNÊcIºÌ~d$ÕÌoD¡ÙX¶ýM‡ö+^²_xs2xXûÝÈÅ+ªöǂ†Ú¿]"¸ ýå-µ$îu)4ÔõÃçŽr•¤´OI×ÿ’æ©Œc6¨‘ÚGӁàû­GþA•úQˆøïU±Œ9.(bÿ¶8µd§§a¿ˆ3f£e ûåò¥vª>Æ×ÿM3·ÿgíE©K¯lobOTl’»ìÿ­ú‘½5ýƒ•ûwUS¿]NÉ´3eŸÊÛ³&òC ú›=ê=ÈÐõ? +çZ >dû€åBHùÑìk/¥¯{ê\cB7x2œtªÕßµ¦Db0¿*?íF¡Š—`¡}çE¤éÔo¯›³ÏÔߋtyN&¥þaÓÐ3AìÛDê7qn@ò"ÇFý³,#ƒB‹’UÖ=šþp_KO¦?*Ž£"+¿ÈÃ@9Õñ˜{Ñ}@»þá$]Ð_Zó)Ê?†£ÈJìcÅ%ü31úå¯Eÿ} +2òür²Åô·óöµŽx~%ס¿„'}”áéü”G;÷dªÃÎb„!yù«’¸Ú$ýp•-Úý…ÖX€¸Ç—p ƒÀ»Ø¿w(*ŸùéVöûI€-aÊ£O¤AìcþtþµI¬÷-<^Dðæ×lsÆ©`OCîè´IâæHO&(@‘®h¶¶&?q÷aÙöl~§åümo{¬Åš¤áⱍ¾ñ‡R·’3ޕ!‰—ÌüÔ +äö”ÇôQæ÷ä…y‘¿(céa’!ó¿ùñÉû(?sã>D)k¸f¶í8Ç`•4ÁÖ1³Bš+S–‹ç%™G8Œ\¶ÙòŸŒ+Ÿ;}HnP–SÒ}ãã}Ü֜SpòKlXä‡@ðøÏwÄä/\´ä·@›¾ñ÷ɟá:ò#Tdä7a1€ôÛõ;H.¼˜ÑÛ¤qQÿ-ã/€§i]Î † ò:ö¡eHòMY°€þ“þaJ†\ü·êÍ´W=·h(ªnüÉ^Ç|ƒÜüotúýšõ¹ÞOT㟉#õóiŠÆ¯¦Ø·Ã2ãÙ} °œé^Ä´ûõß|åáfpñ£%üÍ +¾ú¾ñ࿁%Iþ¡~ù9¾)ÀcÌGXüàÙûؐµàfûԂÔhܵpðÄ2;…22–O(÷vœð£çƒZMS€UÂPµíPt À†Q¤¤Â»¼S🧠Æ\ÎyPŒmÚþTaUËè(üŒïâˊIÂß­ŽÒ±¼EøY¸1õߛOõA-Bƒ¿m†„ü}QH ‹BŠS •à+ þ£Ü9KOvÜÀ¢¾?:Ya¯™$Di"ËüÝ2Ë´~¹Êá©=Öø%ÌÀßÖ¯FýÇÃ뿏dT‰m×#aþ}H5?}ñ•^P³õOPµÀÈÌECá7·~³’â}{ØóÆy|Ö|ßß¹jˆ¢pƒ=dý!˜G—G>š¥C½_¯”Þï!dÒÃÖºÿÛjâPÂ_ÿ聩ˆ÷ÇÝ«¨‹,Y7áý¯2ˆ÷­h5¿ÏwÜ_gÖÍCÒ_:÷Y‰ ¿X—vߝCþu[Ù}ÅÈÌÂ@¹¸‹v?'X廁iîºO+7ç‰þ½fRÍ Lº/'à>¨ÄDóä û{îÛpŠ}#^Gqî3ñ5ƒö¢Þ-yuÌý‰§¤°µ ‡h×rÿœbe6ĕ÷1yX0èrÂýP”v®É–€û·†&d!Ø.Å*øö}%½}€&o_¾¯³¡1ÊjºÌ}x0xT@@Ͼ3Óڟ‰lÍÌ""`µ/ÔKÖ;_Í Mº“òá4®´RéoC\Ã2i"Ù×&»¥A^ŠMížb ôá'8=Ç|í<еØo5øwÙO ûJ }™ß䪿íÕނ¤Lö+íUúº"°O>´o·†ŠæŸöUB.gM¥¨ß䯕/¦û"ƾsCþ6¼w8 +%½^™]W‰ýýB,ˆ}í/sØwGº_¶”a?m«&­äVا²ü;ÀùBòÁʯm™ `X +´Xý{dç·¾ + F· ¿>ôÅ­Õ×o÷Ó¨¢­ùۃI³×Ÿ±þ'ùE¥ü­?Â8èú„(Áw~g%‡ ËPBgŠàúÐgÑÖWˆ!EÔ!4çªÕÿ†7&SoVOw`õiÅ@Òӗã>.X«>dNSjÈf¬¦¼¯¿Ì“¤½Äú\>†Ì¼c°oV­ƒ¨+‘_F”ú))[äË?õ1é÷ÞNKìo€>3P[¦¦jK}Ï f…»ˆ-–ÄjrÅJ˜#Š´µ"èŒ~ZY!Pcw7}eŸßE(ª‘Õ.@ê÷¯ùvú·h}`t€ºÇ¹«>G™ªÀ{P~THŒ'nc0+”΂rèâe˜¶IK}G®P̪AÿÁé_à1æGýCò  ¥?¾˜(ÐØCÚ©õ{ÂLC}I߸šÓ Â9g(š¾:Ø\÷ÅPΨÏܹÀì%ӟÊç 3/¦ÏËà >› ôoõç‡WñÀÕâsÞÝ G¦¬çõÆYª¯[d<†Eu +Î>úٝC_i­ÙhŠÛhÒá#ÂocOF:v~kßô_€¡Öw˜—‹>sOÔ II?”ÀÉ`ñw ú  jOLiyc& ‘$òýùCÉðá𠍘2e¾]›À<¨÷‹CºÜ~icÏïz†Ûèéóð?-⽐nÆÃýå¬àî$§àG| –?çÀ÷~v>7Ùñ͐î*?zñ…>_Éü~CÀg*ÓTƒšv‹<Ÿ§þëÝ5ä‹ç‹‘qðü?¾^G#&xçw·#EmR6üH WN—\ p6²5ßA¿'{ó ܯró rþT|¡å҅#[;hÎ_¤_–`G 8°Ÿ¯&C1U`ûæësAü V÷ŸÙc¡ù„a|ïQëØ&~÷ñ¯•ª­N‚ÐA—e]aW>&SK\ó¯žJ"ùªžÄrô²&ÿ¶Ô Èÿ°Ô]¾&9tT å”ù!Ì ©Oí8‚Y}¦7‘Ä*å雘úR·ˆºßËïðm@*8]ÈnV¡ÒNM§Ñ/ßìø‰X~§ÖôN/ßá¿ý:ƒù¥~Fl®Êñ—S}CMD—6z¾²vzŸÄŒ»#þ…peç¸_…I})]R¾·ß9~)Ôq¡y-XÏX‚ +»ú ㎠+UPl›…¼ÖpJwzóy»ß_Sj¹döAù"ô¨ã÷“äÃo߶ÈG§?žŸ9`¥Ð{{é&¿c ¿Ï‘Ÿ]ˆàø}šN¯ÿ½/G[ÓQÈ —…3®ÀG ~˜—ÒƶäeåÚFùQ8‰3Ã5jèã6('ÚcD%>u0¢¢6n…\-È&?Ѿþ)ßn¾=F b³ 0-”9"ÒɵØ*’¯^,ÐA,Š ʌ¸µvsäà¨z6^Ü õþä=9°è‹£ÇO^4$e,÷šùFž˜‰ bäëÅÇ÷q¬é{ÒÏB +Í>º‚á~ü»€öøQ顾¨ˆm¨~üõg—¢Ç¿’&ôý„‚ÇY<]¬Šj&Ø ;~h"g¬ %Ö]ÊD±-¹qãç¿E±X·°q ¥­ú!ÞÁÀlç~`Fݘúñ3âÚñPøZE¥‡nìk0q+£€Ú$¾ò¸m—qÇGmÛÿ\­†¾Ïf§!{ýäÖ½×õUÏ3Àwíç}ö(”I7¾þ`ÿð1þÈ_e¬‰pö΁0ðÚÃo\"!ü«É Q°Ù{òáC†ï;}ð&ª3 +£û”àÃ6ÿ¢‹`ñKqŽ2!FE¸¨çDî-jV|Zߤ†68‘Šüqê½—âJ±° ÷*²7«Yn‰ï­Qâc#A?MƒÄ‡†”R¡ú®á¿±4;I b ñ a÷âXñ½Š‡û©Ûpg~+1ÚÞ)Wǀø“ øá»îqŸþ´4M/ïçÀÐûŠ+>P|’á;*šxðË<ü‘ÓÌ°åðÏ/øÀ„+þ¾IcŸðEìÁRø4¼{ðW¤V äÑîçì´3.,Ê\/X*6÷6ÈðW¬†ª{’‚áïØ2–^ø˜kuêvÌÍÀ8ÏZøKÝ5æ‚6leR,|Ö÷Envz+|(ŽàšÈѺz>Ò£ +áo‡7!#ævYA>ÖèrîGËR +Ýë•A‘À°/üÁC¾ZÄ/H–¶ê÷q¹œg¾Q>×ÆüÑãÍT©¬I¢>©Ú!v=„MU[àY@ue‚_¦:b|J }›n˜M£ >8]‰ÂÕ^_n-B#ú盪w´Àa–Ž¸¯D4‘…æëEÔ¥VeÀ?®Žžï¦­ßфUÀŸÒ>”6jˆJ×ö¢ô²£¶JçûÊT¼I!˜ïS]ðkUûW¾¿+lX¡cÅù^ï[¡Ãû™vTiH÷ ¼7™mÑx»ØJðžãvo æ>ºßsi°éì=¬‹Ø<2„=7jø—•ÙÌ(ݽZj‚ËݧýöÌû¾Üksü¿Ûƒ‚ZBŽ[ÜîyŸî#ñq/~…r²ÝoCZ (À|\ïËh¶\¤ Íè^D±ûŒ.)T¸[¼¿È8×$ Ip4G#ÑË»i¹Ïâõ᠁S¹OV$§öŠö w ,2yŽþí']ƒ`ùô‘·}ë–wLZ®½´4ÇúÆÀÖö"D)ë  ¸þÛ°*Ì¥JúÞKÝ£iêl?P« ‰Ó¬nZUÙ~:—ºê…E‘íAÞ©H§(cûrF­O`•Ø>b›7/ü+_aû‰á|A—{$Äì +Ã@1؍ö sñ˜vªö¶šÃ(Á×ÝàG)/ÚWÇöy<¶þP‚Úÿæ4lêDL&¥ë9 £°Á­ÇKÃÅþ0Û¤ÇÑ^QŽ )BÍ69åjU'ºò}`ˆ¡!÷rj¨_dØ£àÛ ãýî(ˆMJ¬pþBp;øôgÖO)#¹ó >a@ªjd5›Ò̀µfÀÀ] ÜÇ9û ½¥«o³¸«bžxÄ>,͖„´¶ÓZô½¶½Ù.Ÿ¶ëÄDù ±“‡×ƒäƒ'¬²J” À”7Â17YŒ¾ı¸>!ÒJB‚'ís™Ñ!½úCÔÍ4cöŒ‘J1•]þØI‚ææ&"*"ATEG·#*ù Ë}’¦*Ÿ†™Nqúéd~L"’Õ%)Õ ÜÍèydö`‚ƹ„GÑêÍ:qu'u¯ž~ԮЎUU­"ª£*é3gF !ãq5¸šÝ±«*l{\UXFWh‹:‘ϼü×qLv¤"—¸%?N*«Ž®>&"Ò»³3pvrµÏôJìi§Sb ­x¨>BÛ»¿x±)£â†Ø÷NE~„3'afàãW­^ÎAED~özXڇœÍxˆçaDîúގXÌ¢Ñy,–«áåØc?þaEŸ~ùØ\‚¤+¶ÇcÂÏoè²GÄ"¶´Ëö¡ÑU/+“OÎýÆ9“ãobˆ"Â#Q֒Ä쵙}j2›<‘1"R"Ò™›ñÖ7¤™Ó&­bЃ¥Y¦ KK#» »š_–f&žyZš;ds?mÈNÃ[9¼•d––6Ò0íi$¾=.Š8í[*÷¿µC]4í8ý‚ŽGµ…-ŠÊõºT½ê›µ¶þÖß_ûì.kô×H¯³·ÛÑb­×l6›n•²Xz¬gºè¾oÏ->ˆõ®íeó¦Y¨”Ü>#à²ˆ8 +£BEM”÷€3> +^.BNLTN¦=¨ Ä"’´¼yÿ,#M :VKmօ Jï/H+(ÊRòeƒU{í0´üŒŒaµ°0¿;UŒÞcŠ8fÄηˆl}¾×ÒHlñ›}rTe¬3©ðîD_J醹åJìåVÙ;s_´à#¹œ¦'¯pÀÌAa›"<ÞîL'r +;¼iV×O3D®àìë]©ÉøÔ¥ìUÇdDR,Ë;)«*M…ìȍh×󘬜â-Tøu ŒJ_L +Úòó/ƒbãŠE€Æ› âí‰E »ÃÍRòqŽš¨€ ;3ˆcn)pƒO1FqŽÏÝfF8ÜäÛ!±½SælLcwŒ/žPOÍޞ4°õ‰ÞÐÚDº€sÚDTåXÜs؞¡6‹éä3¿à@Bª  ¥˜·ÑF Ü:}\Bw¥ÅÒU-ÁTû¨Â† +W8Í¡kW;Nð5õê¡Dð«î…š”•Z–¬¼V(2Ø{'DV}3ÊNVJ¦~UrÁ„j”«<â´®mC‡$-eÞ½jÆD-Ë»WUmQðŽ€ê2¾E V¤±c‚â5•Õ>gÉ°ˆ›úÁìd~¸wõLè.Ü2ùG~Û&à˜¡ÿ¡M”b{†™…q‰otCˆÿg,„±Y, ° +åL_™“¥ë˜Ž>ÐÃ"éKYp>†ÝfT(e +²>®÷&%ÅAaø'Åv¶!g’ð´ñg¨T{PcÓ÷íB[ãŽ*”uûŸïD8.ŽX¢òµG`X3f{ü7PJÔ¥Qíí}Hb’%²%jVâQGJøKÒ{íÁÀH0îmi?5ùX¾”óc¾ïVÝâQP‡”<(QÓ4d4©ê*¹8$–üã•1×b¦ÁN¯pý¯/IÚ3-óßZӱ֔ BhpØ„GùŠÕ…ÉôÎt™`4›âsuÕ?ç¡“ã€VÏÜj=Ñ· ¥X]¼:œ¤‹PMzÒ~dŽØ“a~4±¾+LË}_ú2¯¦qö +^ôÊ —›¡ã<ó­ô—qs^œÞ÷†]B“Dàµó#À@y:'XUØ+e°ë§¯é|lÓ¤BeÀ…¯æĽêœ½ÀgS»‘¸6úå| '¡Çß6õù“EbÉ~Vf·_¾þšîU@œ)EÓ +ÖCþ8k3éM`_“¼×C«Ú×[Ɯ¬Æ›ðxR ‘å½ûic%HAP˜¨_Fq>Y»šeXùžî,¸‰Ú¢œ&ÐySjH…½)áU«v£¹¹dþr+yU––?#`¬Ð÷ÊŒš*ˆ;GòáYÈ3DLû£Ä±#w²QbYÁ1NÂÕ?ù`Ùy.ˆˆã£ÿ *ŒíÆҏÎCð¸‰#˜ +‚ µþ8bȈ8h4&0ây¯#BdáôBñp»KBâáÃ5sw?Šêîôç &dBk¨¦6@Ð욲ò´ª-rdÇC;ØhŽgq¶"RšÄ¬î bª«xÎ&~Uä2ä +”Ú2­#?‡?îtQ¸šrjƒ}å{2ŠúÛfÜè#Û¡Œ€«ß|¦ø ÓÏ(ú:‚ÊO4æI ±¿”>Œ¬nC\.VŒ"¯à ­N®46Ì i0SÎno廑ió/™*˜H™Vûâ¿üºÓɶ. pízK(:*T–)±±öq)[äÊ!+ç}s\•ß£êÓµ7PÑ&ut@š¶¿~õ;æ jKI £M8ù¯åý©Æª²—ô°ç«%²:ÍòÒÓ3ç]¬.Ôå‡CȟçÅç_ûݱt“º +HôqL¬Ml×7ƒ#öçJÔ!/yM‰Tã¿Àö-7¬(í<T‡¢"┺١;§ÂuJQIßU:¥H/b®3g«¾…®{F(aÕM•©RGÔ}ŽøþHóKOÎ ´ +U6ô¨Ê‘÷ðêR«$5öË×f’–”‘D¥¤o3*ÊËÁ”ÃmtA<@ô0¡Ìp¾§Œëš.”ày~opޘ ú`ÊS#¹ç1ºÇ +t†.8_b €Mڗ‰ªèc‚?!Š>[kÏ +¯‡•EŸ©_†Ô5khڢĆgˆ ¬ZtkÀ‹@ÙФ½Ñ‰°š¶hÁÕüâÃÕ“è&–èЙ K(Qfà&y¤9c½˜¬Âýõ˜;‘%bzØñAâ%O,ç«7GÂÑ úD–”}I•5«-æ2™uâ/U´„g¥ZB†Å¤¡2‰+VPʦñÄ(ìñ)w½Ù˜ŒèSŠGlûŽÌ_ÕÁ¶÷Åãý÷Ãu!­!q÷ƒ5rå^ãû»é,jÍÞHBVÊÃg¬!¥ŒY$ä{Ô"‹=¹12òF{ž5Y‚Q…œ“λbƒ0ßÑ*"™¡E´àôITªD#­QðŒ~8GZö/KɏùÁÛS{3m>dñ(Y­Çéî·¯ãšá7r D Ï|ÚÂKMí!§4ŽÝŒß9š?óÓýmÊIzöádۗ8ëÕêiœ/¼ŽÞ …½Pý¨€@CÌä9\nÚìCß¾¯¹ØrM7󏐨ªéÔ0î-ѦыaÖ<°©³º°È®nsÛXÖJ½úÔe6†F¢ã9HbÑø½CJÐme«+~Òùu¦Àa(I^â'’L‚xðI‚9S‡(Ŗ»« ÄX:]÷9ÁrÅ-xjÐ)ÄâƒÒ¬Ž´æG‘“)`žAåȗOph´Z‚Ñ¢éÑmÿ›$ñ˜äiá‡DÅ$öir6°‹t¥6Ì! wLl¬NL"·ÅÏ×è\Éà<í5?¦:5†¹ +`‰Êˆ,MÈ7´ètÀ}²˜ÓyKt¹~Š9`E’<¤bµ¹ùòÙ@ Ææïvhwx`¯%AÉ *NÄÕg­{’‡XLÁ!Ðàë“ÿÍN‚õeƒ‚p‘ 8-ŒŒb%y˜:X›}­ތ$…7<­K·wߚ:ô¸åÀëXCˆôaJŽHdºo²®˜XÄö„‡‚/xfäó( ~ÊÀÉ'` ÅâÑ#¬é&TÑý”BSڇ#ŒZé£ß ®Ñù[G3»®ftÇW䛃•)U» +õ4/ŽÕø«‹¨à•?4UP>Ë|È$ú µc¤ª~1ŒéNPö´Èæøq"£Ñ¶Æ1€‰?A¢:1@!‰bµðB&„$·.ƒ/A¶ëjˆB³WŽeà(ㆂ¾.®4óaËÜ*_ ,o‚i Þ±'‡,¶çx#×6kn4&1BÉäFæü£ª¹w¸ß;NL1 \;Ü0ôtá<¶D4¶ô?+ŠÏÏWhlÛ\¿j{?ØKf¶…lÃC€èQ€Ž>Ë è[b-9Ø92œRdû«cKzPPƒp‰×ä#Uù&/qi> +mÂÙõeøôòI³ ÚD¯[Ÿ¤.¹RN’/ˆ…!ÊåK×àÀ¼@ùq€ÂÆÏH_ÖÄNá™Ëö˜ˆnäøÕ„3 ¨°Bñ‰?"ÈÁ2ò‚|±Á“*¢¨W.f™8gw·ÓS ƒº„8øOùuP^ÞÊ'u RãÕÕoä'$¾>åM–¸ Ÿ&<R½Uè¤ByÞæ«Æ…ñ ¤P;¸œßTµ„°f‰;qCb.ck~c_d¾7 KUç”,°Seþȸ~ö#æ1ɶzë ¥¸˜€O`ègõ&‰ÚR€úÄIf,Iæ¨9i¥p ŸÔéÒ´µ"ª2)f•Y(·Šé›“5µÞ }M 1låSæÊ|RüjsÙU[q‹ŒÚŒ$ñ©ÄK©óß0½ð¬-qæ^Ѓ-'ÒØ :&S!à©ð‚­ü «G®a^¾+Vf>TxˌÄÛÖÁ©JèÆ`?m‰Q–.òà²9D3dü„:¼Úrj¯±¶ôì´„+ 9ۅµ…uø¿”£;rå“à€’ÈÃêrƒ 0ÇÞ¨baiÀøˆA¿;  +rfïÄ&趰Ç ÝÙeÔvˬÝ¥ðâ[•#xŒÝÿq\ êJýÅ:Ðô) +r­Wø¤D„<¼wÒA!7„Wæ`€—¹ùy —Ì©4?÷q`¿bŠ)m 9²£#K¶c{@V@€´;„HMZ"†%` 9f-ó~ôs‡YºƒGiÀ²CA!ÕÔÁ,9ˆ+Ú°cò qFw9:æë"4ÇͨŒÜë×t õ°mKHµ[ 6øY»Q°•´Õ¾ôKŸg7¢kÕÛ'#.U:˜H§ä³ådèÍ ­_™çÊAbyIH©&ìü˜¼R‰™•Ê™,…|—­#w$ +b!2Ê.(÷¼³âƇ™˜Ò$.´^"çê:\\ãK¼bìšo»ï?+>Ȩ2Ð"c¥`P@ +t+~©Ê‚bÌc&üÐÜb÷xèæVÕ\ ìR“‡j®ÄRPŠØÊ[ÉgDjn¯#Ü¿Öå!þvì’>vr›)À³)?ýÈüœ¢a…J¦^79•øÐK¡Ç‡tP°²³mìNÿ ·m9{Á¶ºÎhÉ ¦E8¿¥yêZr2Γ™ÿûÁºrp1ü~;¢—ØY‚”kn±5ö€Ü©e*RȳÀ[®<Ùsu¢õí† •è#ÿÕ>Š °ýÙÖC03õý=ڕT§†ü“±ˆ ‰Yæa¸]0™ˆ•Ú|K/ùwCž(ð”vL‚lü—°ý©»j;µ‹gÍYC†g•)rIƒž„àãË<¸½?: \`V¡þ –\ꎎÕRۃ{2*ÕÎÕ³¨±šÊµ +\yi8•ˆ5d² ¸Q¥Ù¥ÕFà!5Fn \KºF6ž@³n5Œ;œ¨êÕq35ѶÃãá´FbÅ?Ô€)šm…¥&鬻6eYF揃ߡþˆ±™°Ïšð4:kÓæ ¶Ípo7æ\¥ÊW¼3óÇP'’I¥7t Õ!»}Ký·Þ’ ½äÊmt±Åµ7Ž¬žÓ€•£m *8&O¸tkÜu×GgóœIÛÄ4²¹åÞ&#ÛF%‹kUüRWê;.túþ«é/‹EDD‹ÛF)¤(z%`~VP¤Šê‰©RÎp“F[œ²¢+á”ê\Ã/9ܓ8ÿSWM2TÃäïÿù¢*¯®{ñzYàþfK3ӄ+p×)­wnïN…vìR8bˋ­ñÓ6”‚(Ø6û´ãp’FÕkE„Áóò1Dàù¡ý*†ËcÉÆÚþ€ø‘:ú›`[§ìÐÕ%¾OFØÄûr%d®c6ç&í¦OiX`æ^ñû“A(Q½gúuxTGQØOƒ§.õ/<‡ØŠò€Â¯»‰]â‘ðì9»æݽ¯¸.½~ëÕeÎDà“•R˜±ùÛ;.i$xPÉÍ®ˆ4 *º¹DÇ© G–t‘sðèBÆͪìvƒç¸Ž¡)¼Ý6Y¦È„=¤ù^ +µD$(_ؤö¸}¸ESAÇ'ç€"œhµðÎ?ÌhØOv7â`–”–c½évzÔԑ°ÍЉ¹w¡TµõÛ©â|âL)á +$’¤0¢GzlQ–q”0´CÃV×ÍÂÁ±Ël¤•)<˜ù]–Æ4?JñG7;…ý©yÒa”‘º( :ªµÎ`3Èb@ª +DùU*jÄT¨¿$ ÁšrµR”ÉÈ×Ή¨2«Yál«×q(|I²©cÝHMô<}ÆWۚ6‚@]%Ü& hî›ÕÓxJz²0*QÌ8íù0A,Þ6J’I'cŠC£xçåûŠçb’øÓ$B¯°;8±‰HTj·K?Ô@ñ +n4“ÏtR°§8,=6ÁKÕjß Ÿ«„#ÁhiŠp£TD¥4“vý”¡‚;’¤x®—D¸pʗ7Ñc|t ÞÞÛÓì+Äκ0ÐdXK•ë×Æ/9ktu@<ƒwq@Oˆ²ƒHx»fnáá•Â‘n&÷ðã'˜®"T‚À@£žÁ3+ðÀÄ|c,¶†£n£7©‚õ뤊¹Ñ —®3±ØcU·Æ4ég^Ñ¢5ÓéQݱŒÇ±AmHè{xÜL঱?"/íA-!`NCï¼ä„® B$©iË"Ý«|NjÁv‡ôÛd\}ÏgdJÖ§ÓHQRÍ,œ¨×˲qjärÑnF¥ÕmPºtìÏeAÐè³Zè†Ôac=§SðJ§´qsTو¥3°¬ê—ÁÀl@Ip”2îô¨/ÖrÀ"Î[®I¨t°TÄóí{ΔKá%ªŸ.c¹tȏ¨î\&ªÛak% º¯“–ïwωt±ò81;<Ã6QO/º +ì,¨[¯ +Uýdò¼ò3‹Šˆ¬¼üH°–œÌ|KÀr&ØBá~Ú† ɑhޖà1Ô2Íu' f6ªŒÞ°â¢’•ÿk”­y%Ì0Ûv¬xáÝX3{šxC€¬oÍm‘ÍN"˜£›Â>ðÚÃÔoÁîYpâÐÄç5\ÿe"@ +ñ ™7,ëך!¢@ÌŸȸüŸ½h†=bq„]µQs‰âzÌù/è—xÛDWSvbMØò7zfÈdC8._#ÀDÌ< ƒW‹ø^P*þ‚×ÒDJ_ÎDë·Ã m‰„ãbgÆÒeî’‘N +Y£¶b<$ÛºeÓ±½Ì.Nð.¦Æ‰ímf/a$`²½¾PÛB‰˜OCÐ.Ÿ +p Ä@̺Éú[AÒí­$Ø  ­Ñ4Ô|„¦Ü˜X ÜÎ@•ÉÚ$=ûe6g‘¯É¯¬$±ö¼»(Ýy‰¬Ï@)ÆDŠ¢íy0>$¶8l Ó©û”î¥I ÑWg”À̅4(cú„¾\3ÊW$J1Ó[‹8BúEáAŒ”v HŠã&8ÃI3Ô/³î— û¼âUœçF¯[Œç«™à\^ݹk—F°\MؼÐ[]š +í,¬é¦ÏÌrJì +×K,d'éô–Š“ÿȁc^‰D˜;«(ÁRë¤À±¥¬L +¨Å3h4L祉ž^¡3/ÿŠ{=È LÊ0äàËزçÒ GÌj ’±D)âÖ|)MRA9ËAz +bçtx¨‡a;˜¤ÜÉâŸy"†Gœ…:é&L5Е ÞRóp[1„ÁR¶M(«;$ü|}–cïHF@Rï=6j% Ã3¹(QjX±ÂÒYSÀ¦;†@!¡Œ!é=0&×h€#Kp;-ÕÃŽŒì>'²ðFàšõ¸°Ë#eì- åkt:Žñ›G¯½¦ ØÿvûØÉ«xt@ОnüÁ5æã ÅÒ*k‰`9{xp c9M>ivÃ/dàT³éi®q82>¿”Ø#nˆ23·.ßuä.Á˜9åÓ,…þ¬Š™‰Òh°Å~I sPn<3ï=W»©+‡>öçTÙ´X­EûØ,ì># ¸Íi9³ž! rˆ´öê;Ú|ن>bè®.zîS +ZEiÁ›>ɉ2ÈÓñÞxòõ"6À)òLJ®–x3^J‹‰dÞì‡PiV6Wˆ„Œ™6c݇ßüE&²Á'>8€p•^Á7™2Ñ¿V¢SPrw%<Z}–t€Ó²ò{%êTI¹ÍÂ5ÆCÅ¡´®XtL¨“6Ã{lZmЛâë¿2’è½1¹ÁüB«ÓPnºcÿÿHÀ(nj¢Hùõ:CŸiRíà—`›æÔižXÎÀ¢¯,k%×íh_ž®Vô®¢Л1B~Ò\“hr"ӂÏ.‡¶Ñ–üþ0©“¥"ä©´h6œ‚¡ÀîvRñ6bàÀpWçYXÿ´k7ú©‰)Çä²U±«Ãn§,JŠ¹-¥ŠÁÚ’ê ”\T¶uF…ü€Ô +"°…}ü+´µüµSq…­ý &YvÉ 4¹Y¡l¯U]³0Q‰-W—@Žb¶âý8”CÝö)€]ï;´±ÝLp.б‡Ÿñ I=¼Ü€“‘éªÚ¾r‘g}ä  Ñ_\(sY9CÎ× æ+ÙW{¯°Ï RP¯ “ŽÖŒÎi| L“BE€Æ ¢u¹œâ—Ýdg†ŸÃ|µ &Yöõ“ Î|ºÈšAÛ‰ßD¼3`‰â¯Á{bø™Ý„Á»ÂÊ_v–õ`¿î¦(Ûo MUSG"¼rJÐi¤—cÑðÄ|Ðq¨$$~ûÏvàáâ__£øˆ؄C±ìÓòNìt7ÝÅR_íMês–®Ã¨¨‘EçÌ,ÜDtƒœ+š¿éa—œÅ«ÅàíâC÷¨:'H –£5J££Þ>Yû¿3FT¼ùyP@y¶[¹iA)7‰J ×I.‚aÈіvŸô/€]"ŽÙ!ÃçC-ˆÜ¢àŸ‡Ïq³Çƒ9혅& Lkq€xuDá¡âЊåOد„Ë®HâoB²5çÀ±×dšž¸š§ŠË¡'´DâÚ¹1„ªgp_›®"Ž§6ÕIºu*ÄèB–$Xc~-݊N[´àíëq)—d*ÀÈ1 +·¦ ‚p²t­ À§ÄF¯NPòÂל¸EÐ!bõ{Ž;+0t›(#ÌHaμyð¥3v#Ñ6E·tÛä´sæê[q4å4Ë!8 ·“oç¾±>Ö¾¡Yå«Ñ ‚5OAþK0Å°¼>7éȘó¢rØ?J!ö†âæÃ>¦ +¶Ð!ÈxOx"‘)Tšã-‰šz› ¦+npÁ®–ä +Ì͉gݨØ݊}Ú +’2ûî“ Ô1bù­§Leô¥D‡5tpäú¨^³,ºðýh@oZ—Ù\s E+yŽq"L["šö2„Ñ$B¢ÇŠÍõ‘Kå ¸VJ|hàD@WãW;l;¡ì°·6@—7<°*2wâõ|åMšë¬ìfF'0.Ì ÷‹¿µ†*ëGMüuPû²’k—ä‚6«+ïíu¸2S$"/j´Ql%M=“ëþ•ÒT7c¶ †ÉA¡e›¬‡N‘÷(\ÙÑg'DgMXVš¦/Z™þ´ÿLfàn²c¸[‰^ø>ßy2µ/Bé¬ß?Œ»ìrˆÝuÚò¨r–”°¡7~ . +ñø:g…¼¨‡ˆèš\ xmÛÃE¬lw’êO©¶ß}ˆ¸×FAå&ø^¥Å?MQÊ­)Rµ8kF*,3o º҅C45É· Ï]nW‡/“û‘ˆMÜMÉÁ#â9~ÿ ¥iåÖ>ŠYšëYÿè˜Ì%ý]x|îçaGU¼Ì#§žK`ÑÐsÚfû8õ ­€~"¸0AI&B8ê}»Ù§åà +,W{tó§5ºFóÑï™5\Ÿ§áëÿÂç¼ã×f‚à%5‘%櫝ü jÉrÀCï]$‡jM¯bñËֈI&I³úícpcš¤¦ô ›òŒŒØ)‚-¤…Ô‰\Bôß3XÁ™Ýäë³²ÂvŒ‹«Æ>:7L¶ÔÓ;/"i¼;y2c@Å Æóé!x7LêÙL-å° +a\‚,£É¼>;;U®ëÕFîy¸˜µ(ù|¡Ë4G$î2(ñY%¦11 +w7÷Ý r$–Ñ™s—Q ÛÓ.-è½:MÛ6XjSɋú½Óç@x,:¶FhåÂÇráÚ8ÊÆŠ …o¯Ô`"tž+´˜vÑâò‡Ñ™ás=²„oQAq”ø óòÿM-mEø1ÚLøî0&k€ñ«A3‹;»Ä’‚öö·¤–Žo=,RG“^q¬h_æõÊÛX@lÑi<$Žº¢Íº@d(•+z|IÞ`‡E¦d¼ME9hýÈÌ=˜ËKज़l7•ùˆØq+”»d B>*НwEg¦p¹Ubâ;·#Vy:îà&Ddiì>†Š‚-9ü"å|ÙK +2SmfæêîÄn'²ö¸Nµ°R\œ¡ +ûùëô“µ¤º…Æ¥TXª2`°6%”ê#N23äì)x[Ê 1(nšçÞÐT.IÊÔìQcvJ’ºé~<|Šd®E5§~Ù¨÷¹jY[kVœ ÆUK‰Õ\…ãõp.óoÙëú¬b» Ûõ³âã¾öédV5_V‡±ÅIËaý O•4:ªGªBjYʆÏ@g¼üY2(Í*„Ä&ƒ4u-µ¤Û¢˜Š?¦óäí²åm•`0TÀ^Y¢tB~ìÓ.èè{\’±Z`×"·¬m+©‡­Ö–V¯”ƒ«6ãÔL1,.æ=¯!öbmΊ䑄ŠŽÓr€ "é(ŠDIõdˆY²äæ ,ÝÉ%Æ8F”m¦@‡‚|bx·Møí;‹¹“‘©|ÿ°ôd¡9a!Ò@\õaEÍ)ždy{M–=‰Z„(ÙG@3è9”'Ž›WÃ=Ði Ö&Æ+ÂÆÐRôNÿŠ®F$û˜a¡W•ß?yËMüþ û lë +‡{Ê…RBcZ)zš…´wÞÑøªà“+u ›§šMG~‘Y?è»sР„s‚vïQ,bÑß0•  ñëÉÊØÔîˆ<ðm‚ØŠCLAjÃ\Ðù™E[óç-Sµ ^0o<–B;šöhpàWÆÝ\½‰Ûé\¡òhË ¨²Ø^ÁAcð°‚ +9‡cÖÙ ŽŠø»exÐKaµ~D—¡G¸úNÀA¿’O¶ÅàóUÈRâ_A 'ž<Õ.³sš7N9¬æ#Ù2üÓ}ÂBGÕûi:T’Í¡ÜFVBxpŒª–ôpzâÊ`¼›ºÈÀp¾|Ózmè\²BQúáKûæðp ç +‹®·ÿôÐC—Q"èÇTQ'yÏyK8M4Ý´˜')ÌÀí…ôòÀNxod,Ž­;¹’œ›¹êѤÔY] šÞs‰÷‰âÚ%G¡lf§öF’Ñø«Ôuñà$CÈ ¹q&&A“D¿Kà_°>ðAÒ¤°ªIó¿Nð،ê Ö2ÉœXÝWʾlMI Á„øZ§Õ#؅b‰Ä2»Ó,iíÎ!E$ó½z¦‹Éºë+3g Açðü+ôä¼yfd}݆ŸE# +ƒËë«®Ù#`_§d¬ðó.˜§šÌBWw‰¢ âòk*Å$‚Dì+ÖøÐi“«©›æd¹òÓø¦"‚K™º,ˆ„F||›B0Tc”Y ÎÀ~¢óm7ؖ Ó+,Á$.58žÈL éÿ/ÎdH#êo%ÎK†xlāµ|c"F^Ú¤Öœ¡Hòýô·¡]iÈ7Õº¯åÁýñwŸhSm¶3º|K4ï«O)²3õÒ×Ðd¯ ¾DíwRBØm¶:Þ ñV'n¸Ÿ£|S+muÃhá×m£‰ 1üêΖîÐ2;Eðçä8dÒ¯ 9$Dƒ) E#h4„;©2捡ω­Sxs±Ç}Öiз…`E5 ûˆó˜£(UôÜO”˜'‚ÅÈ¥|æè[Y™ÛȃV”*ËQW´'ï¡ïƒ(c*µ(Ì;eW·XÝhÅ$É‚K8¨›â=B ^CÐ€ˆWϑO O>>ÙíåÇúoÜòÖ5UÝigìÀáeèéHÀp¬ªõ+Ÿ¬³Çmf Õ<ù§µ[ˆZé%AÜñêFؐUՋ“‘Xœ‡Å‹ÝÉ:aQ·PÓ×<¡ŠOÝîe®6&|Áä°"²©TÞ:N%€[OG¦×Í )Ía£é~W8¶ÜÏáBU°Øò,Âѝ<˜_ e¬*¶Ö,í°éè*íŒr3=ÑÝôb ÔÖù¨®$CÍ KÊu­³…Bá¼v|€v«ªg²®ª› ¾Ø>…˜‘šYpˆ¡‘øËÛð€œ9§0ÂbL8E¨³ªè’…ÛEaVà8*fgUa˯*™U +½b#ÿ<þŠWî­ShWÅÂò9¹œ}«ß¾‹tUЁ}öÒK²dUÍ©²¯†”dU¡º,Rf±óaÛK+ £@«J–ð¬§,Ùæ£d¡¼ñŠs“"RI#¸ ‚3œPAó8&ê²SÇ $„ ‚ªšì¸®Ìø *^Ø,!µ6êNîz—ÕȪªH}‰>Í&«jª*ãa­¡P‘èì”Í0UÎFÅ÷ß°‹Tˆ†@¬yaåA¬ª&—Ó«ø[Ï bõ»o¥ÂrÛZ«IãÖªz8 NX°UåõŸ“ªj"ĺ&Y$ªG·ªÙ;ºvÔ"‡ÂXË´°O}ØԈ®zxÝö«£›y²2Óûÿ] ¶”"Wd¨( ?Uçq$÷×2~J…#ù—©éaC]¥Ê:¶†ŽÃ\À +Í_!jQ2šS4ùXfÊ ñ)wôÁœœÓÁì+èªÅ,½ÔUeRɃü²²‘OA[f!Ë© b`Ñ;*­ÞL6Î'ß|‰Á*ªV¥S‘£‹ôr:W´rúD 9ÉÁÑ}+$KŒ¦ÞLD<|.$ËeŒ¥˜Ý,J}k¤"fF#شυ- AŠ ’'ur}íG çaqý8Ï0ºøŠÃ5h"åØþepe†·¦V÷™ÂÛTGé FÔx8¢€ŠÓ³h¼ËCŠ!GÃÍm—wu¬è<žäáÅÚÑåpq‰+ˆƒKcGed™å3ÇAÁö_B3*,óãÝN÷`_Ý*Ûáäã Ð^$4Œ'Œäs_Óù$ِ†ÄEfé͝]| Ëzêì¡c` øDQáô©+@¿ÙŽâ}„a٘&0F‰ÿG:—)ˇ×Xm¡¦ýžL¢=˜ùc¼ðó Á|O¢c™ÿÞ}˜Íá`á ©E) J¨Ë ,ƾԆK“é7¹$̏É|”¡Í6Ò95ÉÏJÅÝÒK´BYË¥ø‘t‡Œy¯K+2]c„ ³Ú‚ “ “"íý«ÕìÆÀã´¤V¥è ‘Ù/½ºdæ¤8GI–3*†“p¯ª¼ÊS-Í̼ p‹ºè ¤áÊ:QK±•‚Uj½›11# ¼¨³kkI!·¦Ô3Vbab»ŒøYëM[¥‡„‡™xs¬>”‘WwJnŒh–ÈoGZ£æ’Š?iÏ`œDa€­¡t £€ß@˜Î(qS)FH±ÒžÚB +¢PÒg²ŠúÕFÊl*ę\EÏÕ¶·ËMgçO­ +Qx‰ÈtrË\5×p8˜Z¹8‰ÀÿmYûgøûµz©l¤ëŸ"Õ¤¨Yµ7KGpËÊ;I:6«n9¥QÊÖ ;ÕÉIéu%p"¨>ÝÍ\Òp½ß¤Àæ%ò©wê׳óîÍ8ô ×M`ÓãvèLO¡;Ép7RS&Kéñ„ÕÁ›>%t½„u5UAðÙx¾& +ˆVõkd|¢Ȝ€áÚeŒÔA*I«þÕ®]K«‰ë´›ªn“Ä ÜӒ© +œl… \’Ø +HÂÄ —æ4Ÿ!=ê.âÌ)3+x*MÞÖÜTLòÀòO6ߢrnÆ"jÑ(ù¢S,H6Á1ÆÒå€ÙTåÀËÈãt"Ƽn'cS0ƒ +3Šd.AÿUöÌG¿ß2QÇðx¼š¨Öv¥nøö9Î†[|06= ÿ¿&"[=¸Ì"DmÕÒ1ùÁj6/åM RGž)G8Öd£-ïEàéÐ$Π4¶.O`-7ØòAB$»èsg¡5¤°Böb¹Z‘5þ€=¼ìû¬¥*V}ð$ʊÁï3k¢H#¡ž@*+Þìh,Å(i¬1 +Ú•1À¾™7ñJôíH-½p¤m# ä@›Éx"ë\K/:OšÔæÙ ö‡u¶†æÞ<’÷9'xĶõًÃjGt ²}ÏK’B‰™C“C«y‚zè)¦+‘îQÞ +è`Ï°øU)Ùãi¥q±èt|Íx²s™C̝”¿@:P÷Þç¸|åþ8@y+á'éHéýUŽ(HëÜ¿ 'G˨Èžà‰¸^lR6Ý Ý6™ÖÚ[¯Ïýnñæäu1ØkÂCIz©Ä§üªBÒà@´ùà`*´TפÍG-kf̳:X÷g‚º?þ¬†ÝßãwªˆÞq¥@Ùõ†R1ÄeÿTȍ"2ØT?S: 30½O|´ÝV·ÐÒb´¡QÇÆ:2Š_é`¦Í#†Ãëvù[MB‘ð–Ù8©ð¡A(l¨aq6µ‘Þ«í9±Âº™úpr·IÄaUzóNÝL$]·?‰±À[üzp­s/Œ2Ø$v8}BLš‡nÁÎòNÏ6ÜÆ-²ðHì +±wøó¤‡}9Vñ–]IïLñÔȯ8N‹=Íëöút¥M†â^©ž’‚‘§øŒtY‡´²¤îª”ݦWK öh¶¹ÙKF +ƒS°Š}øœ¦ õ€ö‹cÿãÝe'§*åkğ Œ#Û™gdVߞ‰ZbLÒçÍ î·5‡fM¸Ñ’ȼã•r ¬Qü{1;‰W7Å)ÆN°ŠÙãöBË朔v "-zËðÊSº@Ô¾©.¨YWò¼oØ>ÃÞÜ{kc•K‰hrÛfµÐq…]õ˜^’™ Ȧ¦W’Æ¡( $Q›3OP‰‚á"cQÒA=¬×#[choRGð¤ 4èòcMÁ +‡°V½ÃO4®w‚¤¦Ð¥uGu8ÉÁÈ¢#„psÞðAO^d‹ŸŽ˜$Ižºf΋ƒœsÀÔ15#ü@ø]·xMºQ€mFs`‰“«È£®„ëÕØ Ây€ºåÚfò.ç4h:ì0_@£»r÷ŸÒðÓuorðOß´¦&£Ø8J!UÅsœÕr¨èaàI¡®SUbÀV+„[%âÚ)Œëd&Ýn‡Ê—sv¦ûÃN²LZô‚ÑCþÎԑ‚á$#mª’´Ì §°?tê¹/ƒa(1W`úU¤ §æZ„‘ÑëØéτÁdƒ° ¸%”4L•¬´X1.W°›^wUP"úIó^§KÖ]ƒI¨ˆJW"l 1“.EGó<ۉ#*X„¹ +øþ’™dY—'v½-Éòt©J6>q1 .¼ätܕ¯©#–«Ç'DÛö’ëW9¸£?Ig«€A •È@XôY8 \ÿî·l{"›uŽ‚@°bÝ´¾á;百‚:ró"(J!„‰5b!>2}T)Šd™ ‘tZl¿o¢F9"Kéììc¦n&ÜHÚ]º ^8´çÏåëVwI‘Á#.¬X˜È+½Cš‹ŸdNùBIñ+Iã"ˆ¦Ê±ØÕþQ´ðàêBë‚IÎuPÉÿ…OÇe1ÛÖMٖ„ì™wWTØàñђ!# ‘Ô‡ýú?zÕäq¸÷ҎjMBY£3^fjú/kʘEÛSŠšÇššaçšs®ñy‘n£¯2Wa?Ìl'Þ¦¸”jð"Á¨7~jb!mî_“ÿ‘Tº#ç&]R›äòx4ú¤b:oþ–Iïç}ÁiÌ´7tžD‚À©”bŽH€<À0ÙÿKm:È3On¬:tèxòØýKò % S2õc —ÄSrÉ" ¿_4ý¡6#ýÜjÛ­Xôcû« ò‰ºŽ\H׶å¬'jÈοµº)\œxü,ûb[ø00ÎÈ:bT°¾uÚÐ,_8|qÅÇQR¥f¡­YǟL“`ÖFTrD¢hdx(„H80×oí½¤3)Òó]:u»–?UõM+@Ì ^›Åµ9R<Ö$l€-U~FAnBC¿pæ @Æ}6%x·t¢˜R¾¥¤M@A8êª#¿[€®U3Lj=Òwâߚ]/Òg˜ÒA0«5(]NüÇÜn…ÈŽ-ÖE•6¡â>‹B2(0ð C蒣Âhqšj£„$òhLŠ ˜þ±ôHE1 ‹¦(Mûì­$*Ááù» r!…Ήór®’=¾Éw`ìÎ'‹fxµÆ×5©(_ÆSâ‰Ôpã DòɆ„„ÂŽL(HPÈì}³ â·åöÐôõ±‚ã—“ƒ÷KЋ)À7¿ÏYÆÉYªÊ±”žœè8™a™@Ř>s}}åæ‚ýDÌÀ ¾ ä}ŸA%ô>`QÙÝãºê à2@q‘ó?_ôJɈ‘ŸØŒú‚Ñ·Û|BJt¢t{ócóY¸ ªw‘Üx +/ú᧶ñ“±ï_°Œ)b~ÑÐæ7³4æÒ¤6pÌ(<^Ix×Øê'IX¦e÷2)¼A£sÿ«Z%ç´1 +Ô:;J§“4Ù +f+`ù˜ÕÜ„âàÿåø‘u&C‚tp½¥é© !C4êèã­¨nàq27_ÄKÑÿ mY$Ü<¬„öS(2|5Õ&¥‰½{JÑe#­FŽ9ÁóÐð‹N0YLc#k¹„«®° +™Á-- µ·*²hâÅ@o- þ¹Üp“¢‹"ò]Õ=‹,—‡O—þ/Ò”)I].›¡ê[Œ…âžTG‚KJá,j0MR”l¯Xãc?ET珯ÅOŽ8PݙOl¬úږ’R²yPáîk—_©J0X©Jö_©ài[M+”Å¢+AÐë´d0*™BHHÝPiJ5 Y—/ìs­aÑQ1êlý¤Kp|‰ü¶»‰EzWt|øÏÝeöƒWòK<WŠ™„™›v,#33XDd Hô„Ày#c¡éøÎ`vB÷)½Ã. ,òK¤ô͇v8…×°TïÕ¹Z¬.ªWJ²¼Ccè;¶Sõ_]ô­¤ªß.ELáf¢ô¡YQ%ϕïæVhzqÏ +Ðã¡yÇøO¥™LZð©˜vWC9_e¶DµV’Eæè~õ‘ö +ñ´‘ЫEÔq'r/з‚ž*“eš¥: ^½¼ìc»‡D$6PP(?Zrl5í’Ú+iºgh}{¤¤ãôÙy=òÔ +’Pª‰2ÅabÐqÑ+ + 8tåѾ@³Ù3rŠ¤ŒÊñ7Yë ÍËÅ?k6É|b:éãxÒeŸ…L|dÝ(UöÎÈ\ Þû鈔ÔÁ˜ü×D$IáùÃ)³‡GÈaI¤a†‚kB4“PVl+•Ôôb¡ôå§·–òæ«Kà*^âömíÅÏ´.ã˜10z5hÄü/ÔB=Î+3 04X»ÁnVûjÈÀð–™ÕæGCJgJaöèp ‡ŠôtD/!"·4Ñà¾\ñ dB˜¾"ÃS æ§óƒKq—"̾Á©™ß¹2ꊖ×ô"ü¼Å§‰•œ¥”Å]…b²¢ÕX8fxc¬ˆ‘öw)FÏÅm°,ÌLuƒ³í·Ï¼µ® îø2JÆ]wFêê0‚0K#†ÐM†rÂ?æNcÝõâƒ}É’K;tÐss]ê—©ß:Dæù †™ø9¬PN"PwC…ŠZWV¨ª»\=K»úŽÜÈ-Ó¾1w Ùî´¼$[…Ö¯ŠÞ§«¾ ø"ïeù¼É‡ÝÛ-¡$œ¯wk jù;°2oþCÙÓYÅr‹ jÞEþ5š–‹cBՁ"l̤SUÚ¢,î=ýªmŒ}DÇ ܬ¶¼UswCӐdӝX9œëiãê;'8¼ÿE¢Ê2c&Xˆ¶ w<ikóuФŒV0SMZYIÔ6càâ}9úkÅA™Oˆv†¶q¡ÒX•ŒROdúòÃs-3X­w*Ú´‘Tãl²%›¥Æ6!X·Ðl{ÆÍkàü àìàe'aú*c䫝߬¡ÔÓ¸ôÿÅ# dÁ‚nÿ Ò=€Ðþ#g˜úEÎÌ þêÍÁ0íbtïb©`Aß{<øºâW½B #™ ‰µµë›JL +ýÒʜ„kà\Û>KÍ&o>¼1Å–¥ÚüHۜkÄh‚!‹T + +€;ò¸¡º²¬$µ 7dk›'àr¢¿¡ýӜW¡_è-ü¾r²‹ÁEÁš‚©ï% +Ä +ž-SŒo&¬…µêÏWm»ú‡XµðTVÑ,SðöàNb11òè]!6Vvÿ(ôdÔôDá +±Øs8év•”.êŠ X~àIž•2”Ç’žËt_›5v4æDÞ!ÃùJT˜‰ˆ·v,ÀùýNC’ÂðÔjQÐp3‰7‚‘­XCxd»P®Ù‡ïQZÓýDð¨óÆ¢a¢ûú.ÅKU(·çÝv6ЏoÐe VÇôq°‡êm%ìÌVJI6øwësãk@\¼Ü¯&Ä>âx‚¹¤²ÔV€p§  +^zªçj4ÎuZQnŇÒG„7²„¢rۑLeÏë"Q$dÁ×›88 +oá!è?´¼œKBØì­Õ6r§6~§Ã—€gزPL{ +¦ .¾+Ó«OÎàÂ,Úz5O@9¬$Nö…ù¤"yâ‡!ï àöt²/U + —ü5¶ušpÁ‰üzÎ?@d‹ 9/Õ_՜Dk²PNn½¡L¬BQ¤Ç+LÌ٘Œ­ÊŸ]%YšSÛgšaŠä•  ÚÍkÁW‡-—µƒ3!C\•æVqêÅĸyº¥˜xg êÓ@?,¬Þ¤_•F°…’¼à;åßÛ´¡”͊s=´Íø»sªJÿsÂSÁ*Ô8a-T˜4@m‘ëñëÃÜ«9ú;ž8²l˜[ëÐøýRFWE]ŽÂjÑ£ +ç}Cåô7nX‚Ôޒ<`ׅ]ùÌ6Îr« Ig)0RJu‹"¸W ¦,z;s¯…ªnäæ{°pQ†)H ÑL©þf÷ºa)6ò…MqPÖLk'!ŒYÀ™øÿbuùæ= Ê=\éy1ç„öÑS¤‰\]¨pkˆ£æ§ºÐäÑÉd֜°`ÎÖ>#É ˜v¡0á%¦ÖÎâf +áH?ˆ\² àö‡¢m!µ[Æ¥õB/=RjBT&Q-º4óÉPÃU)6®Í… +±ýß †þ?=ôܗð™SŠÐžm{zOZ±ÝO—£=ÔY±Ë¾Ùª„:3YR.Tñ ûSãŽí. -,­Ø åB‘@7»|$9¾/Sö#•LP؏ˆê—µÕœM!žNrÓhmþ•B„H”‹ð·ãK~U’×jxÎðÉފ"ƒ­,S¶»iÁ>s]bI¡V~­ÌX­&z$FA¤cë "þÞº<<4†ܹzÛÒºžƒÙY«Øc;:Y½*´Žƒ'È&µ5 ÿ×ÙÓÍsèµJËó©¸vIŠ¯̈<Ǭ|y$©Z=ñÂÚqXTH‡ eÙnK£Ù ­~׈W¸ ‚6bVcÿ»@ôó—eAÁ… +òáCbTœÚ Zñ‹Ð8 ±>iõJ6!sÇo;]UWÍIëóòf cJ«S¦²­²^éÔ*v…8ÓGêqz!8.áÌ9¸eL­òaÈ—V­ò° úöýßìiÕ½`d¨U¤hŠG¾…ªH&h•‡‡Á‰RE2õ ”ÚnZ†õ>PÆÙ4'°Xâ‡2OýÿÁHŠiŒöS8D9i"29ûÊëÁžK›Ïý ê:à_ì ª ס +¸Pöíö:¯Ý±Å>x#SÖSn¨Ö1‡w¬€Rn§•þH½¡¶å™ú:q¡[k=ÍäÙªH¿µjeê–ξøÍñšØ€OÍÑ X 忛¥2)µÿRXнMœ}î¤3 ´„¯V½ø´@€ìp¥€¸òn5}d 7_(ZXé1äŒ'BÀ™ÑΦÁ›¥M%ÆoZ™›\ÐI áiøÃ]ÒHHy®ó…"øŒBÜzŒ7nuuL?—Ä_ÉHHð®SãçÛW¥¿HJ9zfÂqL‰¦[†öKTSÿiÌJMy£Vkƒ,hõ¨Û?!Â%wn]“`¡H% è¾éyߎðÌ U‰'ñ_†—Á¹¯¹0þ ƒa¨÷ˆÅ•¤ÙŸ’`öXúÕsŸ9?˜œ—U‘\•?nʱ¸Â#êˆ](îKŠä%U?Òû4±èàÜc}u_¬Fž~ü)áə²¹ÚuŠïÜÃ-Ûþã¿k›Ö!ßRûrþ‹»n?WY&‹†¨EW{XMÀ4lW eÀÓ•ŒPåñ(<1DZ%Ôj|8Hþ›rhb(%m£œ5ÅP­@9hd§ïӄ ¶Ò5¢žÛ§6eP&ŸT£a6ˆKSû;í—þÖ>ߥ\\}HS’Œ€lÔ +[šV8hk ¥½é"²**%)çŽ \Eo{EŽ§Š·¨!x0[Ò(Æ{€¹zÄÍwà™&…ê£Õ&ÕÚy…í/¾{ ^êþ1 …Ì5©´q¹S\M#µ)š†ké. öµo +xºŽÐWb(kUÍ®ÙÐK»Üc°çê©{Œ‰ õÐq)Ú&›ÙG²lv1-ƒ%ËR«ØÖÝq”¢E ‡.¨ …0‚Ÿ-*O9‹vŠîÎoo<ç±àQTßÒD]²x&"póêa’ԛ͛yΨdjÓcYÚD +!@݄ÖáéJ±®àòêèZMø<؂h¾«  äAŸ"Š¡NqÜPNK;e¢¼Ö¤ÉWQø@}È=h“d/'™î›I ¥^Ä1—{u[¯F„}o©HÓKh“õe¼:ƒ ª-ô²W hÇ*‘I½§§Jèä#—?¹„¬ö·q~קé),û½KÙ0•îHpØÉ °K…qTôˆð«¨wß3ómYtx=j_´Â°ŸùZ—=š§\–Þþ&©/3TP_üwaßFùeªm`z±Zß1þ4½à’ë^ÖTï”úPÃÝ̨æ` Y›øs‚I žpJƒÕcé CÑ8MÃ|øUQFþvú'cùé1ÔJ‡é]ħñÄ+ +¢(Åš´ÝX_ ùhÃó+žðëÝ$2ª7yn]ï.Š¯v$âIÖÇôŒ'(`<†9ÑÚ´ÇÌX!¡…ªÆ`ÅXsBÊTåÂ&B  +ÚᑖˆWô‘-80еkö #G+§ÎP&­¬t֑b‘z‡Ú"V^†âçšP̚‚Ë&ù¸Út˜FùIȒ¾dBœÁhØɬœ™íÈ&”¡”kü7]?\PyYdĸÃ6"·è'VG¿%n}Îr½Va– ¹$‚6ÄÐój%#[`YÔòà'±Uxšjsx5d ªU™«Õ’JERI˜jfb@Ú~e˜kâG˜ÉU • T඀mˆõ}•Ä¥\vÁPÚ0PÚ·¨[="·‘ú+¤P÷øU֍eŠÊt}?ƒw6•ƒ1¸Ÿ™š’Â2‡*Oúñü¥p±~D%&#¨Öv2¨YIvOò؅51M\>˜¿uÓð‰v‘Ås•}€¦( L¯’øg#Ñ·ˆ ½ +5º«>¨/.é„ÂcaHù`Õ3"1(˜¸ê¸Ýø’Ðe œkz]g`´Cc;‘ݽ¬ÀÐû`}e+j°©£—Ã¥_¼ÅØ] +‰&]Ë?Yp—k¹mãÔBg¯òg\J&ÃH5´M´ÿ"}å©88U¿`#§ £÷øé©^Ì%LwžÃ:š {t«†‘Rǁ!œSo{5Ÿ>8?R_VØIm— ´ ¦:Øežæ…®…ý̍ÉL!&?×C½ÑQšö§—( +!…òE󵍀þ*r +öê:÷ä‰n©mñçlÄaÝw€;¯áí¡£åcæ 5ËÜϤ +lczê:;¾Ô§´¡´SÑ/fƒ‰%×Ã|Œ5‘¼?8î °"💫zC¢atù'ìKY‡Š¡¼ÑT`:ºÌ^UnÎZà }¡š8IÀ©¡õƒùÇVxÏ ÆC‡to.Ñ †RÀ¨‹ˆIò¦pˆµRÚ&‰¦xü Au$•(„P§¾ÃªäØÓÏÿÐ-õݸ­^šè7Y”±ÀšˆQ¤-9è™o2ˆ…XÅ!S°ê3$ÝÛ$Q¡cz)ÉgDMsÒ°Ê AN[ÈMÐfîÌ@K 3í6ié%nZp\8€"Ô¢¤¶2l*Š =7zÙPGRá¨=_›®¼%gÎ)’~&ŸÂI²–ºï‰<“y¨ÞP+çiûÍÄ#ÑíÆ_„\¥ƒýU3™b·o™AûBùÈf±KÝ1&í“,"ÖXڗq¤¬qútÏ~ ¢ÂˆvàZ¸PÏÁ´œ·„‹ÊAœÇB-dñ BTÑÿ%:%´Äq±ŽÖ%À·íüX½±:›WJK.8À«£õ}åÖ®+ì+ÆÄ?ý.Pîƒt‚x/ ûûA±fD@¿²²BÍš$ÃdÜÄæÈÉ¡öŠù§²(^¨S6uì=–?ö +ÆgR'ªöÂySã†9Ø æøF<Î`åϒOoJ쟌Þ,éq.±fbgêdG>R&‡eT[+XšÂ.åÇ÷@P¿Ò«'·Wr·ÈWïÊQ#X𐏯L Ÿî·26”±¹Vz—‚­³röD*ÚøEK ¥iq‹€TôR–ý‡%­*ÙO%öÈ÷;eS¡>îȦä=:SŠ,ñ¥dµù.ë•2öÊØ=)]×O}‹”ì&õ(}:£QNP9>é/1Y-œF(=Ͻ*ÑƵ=í•LÉv³o’F°˜zÛ-ÁvºqÑv‚Ñè¥[!˪—9q¥Z HÙw¾µÉéÁ­Àú«Æ$Éa-֔öã Ò¡‘9 Êþ×%Ïzd2ÛiNf~¨âîےhº1YR³tx%­vœøæ*¹G>%ÅM”9J&Ò'é\¸üg+n’UWðÊRçö]f"D7{¤k‰é³2™‘ü÷¤iûùÚß12à³1ù"ë-šIç5µÈµÕHðŠd­š1Ÿ"™Bêš,G uk̚às ØpKdvѾ;"GU7†!²DÆ<&¥(Fl?>QrØ`ì?s™U/s}{¶½Ýw$+# r~0Ù¼W) +'ȏü”¼%Ú2',9ÿqÖeiŽ}´úK´uL¯$® A«Lיeâ +°½Ú0+@Ã|4Ž”'Á&î÷˜©ÅÜHµ +Ûckxõ1¼ã"ߺë¤oÅQÌØ0RD¯+‘Ìí8‰ÍºLë:²ÇeÕqå·Ø’7¹6QFiP‰° ªÞ)8߇®zü§‡ ª‘ed¬0‘¯¨(„`4ƒNŽÝ€ã»æՔàþg7Š3…$y-§¿¤VnŒŽÛ˜c“p¶t™N‰#¨ÍFæ[Âêd>¯Ñ4oçèÔ>]£6&Sc·äu'w´¯4Ê ‹¶£nhLŒlcŠ !¬Œ_ƒÜXMF+•Œ@ÎÉ|ŒÂ$ kñX-FëÄ%1fµ»æìÕÃÈ¥›ìû ã½8&õŠfÆl"É|;0–:>þb¢øXôD m·/b ¥ò½{±7ÜÎɼ(ÊT©ÒXkPqßÿ°mV,™-V™“ÄïB$8äcŒã…î|SȘ—ÅLٝS쳐R~9^‡äqvu+~uì‹Y‘ò˜¾ŠW‚H|·*.òª8¥‘ÆÏA9RñZÿW‹Â³±Š±]ã;A1jãŸØj ß˟hDÀÃïŠøË´ÖDð&~¥Å˜©‰Ÿª×E  p&JÃWÆÄT{™ˆ˜1ƒKÖ-±7¿Si…I« +q3q tc$ö¾zƒëó:$šÆ]°X\…-Ïù¿ª8»¸ ýò$ÂF¼ÒžõÄX©ÅÞú8:#U†1~ïR¹1£¯ˆ÷K¢"ê1ˆéAßÑîUTÚ!/ánˆ:ÐÒ~!Zó¼"ã™ipai%:!â‹"G41ºƒhd‘D[ILùœU<çG±âþ±ˆÙ­´ß%n6ªŒÄn‚P½æ»ÕÊò±}ø¦Å8}ÿßMuzÌX‡<ècIÂF¤ðŒAÇÁG=ù{΋• ‰ë×õ'¾ ܲåÐS°\G.Iá Ô 1·U.šñ¶!“žS©•‹%F¢t¢ %t$ZIºUº^ +¤¯aB¡šíÏ0«aØß;œ‰Hw2¼ )^LRöBi]aCë_È(-Ž`ø7p Û/´Ö ½p[Ìã.b——¸®ëØ Þ”ŸqAR—ÚÚVªÇšTÇ*Ëó¤0Õ|‰ÒLÓûÐX({þëΉ¾tXÉxÈ_¬6ÿè |<Õ¤îöCû:Y8ÇÀûW†Û®Ʀj0Ðòg¹¤¾·%]˜ž3š_§Òˆ“Ôò—©¶‰[d* e¨™Ê0mNð+ÔTYЂcÉ-ü›vƒ‰p÷³‹Ã¼ŸfƒE&¬$à¤^þOכþ¦@Mb!âœò\"ìŸ_"wà<õj +0ò·0y¸­ç¢sډÒÖl~S=2òãJn~ÿx|ù{³v¡¿¾_>e)ta˜eÁPìŽ\oÿ<j Þ¡†#¢'>另5IþÌ/±P»y7£¿¡d·´ã!!²Š«)…,AÄÀZ›Ý[8—¹{—|p: 88þ ʢуõÃ'ð¢ÃÄT¥*©Å‹¤#©\…¶±z¡äiÔ¾âÌÅP¼g1êÂA´ÁâÔÙ¾4oSL8Ï]fDŽWR*¸‡dy,-:g¡´*Ö«\y>Ô,ªƒÛ VT(µZÇ Ör;bA¥ò. +§SÐF°DXGeëí@zœÏV ¥·ï Ûd‰:ì¿9®4¸ —äF˜>fx³W­ñª0EtBý…jšß™mL™þpW´C¹$Œ|c‹™Æ&^Ä°‡‡!íù- ÀPÀàŠõåã¬@ 3Ül# ‰'²c…Z ‡¶<ùf²Ô͹ßR®þ…º<ˆx_j„E}Éò×`S0~¨öSKp5}¿% šôJ7nP=žö…*lL quLdäc(Ôß +Á„C‰ÛÔ¦¶Çº"q¢Û/Cû7¤2 ²+Qž¹™_Ö~'Ù}…\;(¡”}ÑEó?Ë>>¿E%vÂÁº®Ù7Xt•-‹›6Æ$O¿ùŠKÕO©2wßдFhº>5ºÁ  E¬~þ–¦*nºwÑ N8Ÿ=®é Ñi@Meqkã¦È3¾Ó¤‘ ÃA•Ï|ñð#x,nZ MìO¦Äô'* W‘è_ˆŒ$„ÌG +9pþ¯/¸ä@H}Æ+Ú-B­¢Ne¤O@ +¬²pæp6KýÄB•ó» /“{Dt^löÎe¶”~¡Ô»ÞŽô™v9™‘zawTKöÔe@FÝÔÉ@ûÏëˆH¥CŽÿ*¨Ò¤&ß];‰è/ž™?‘\<ص ·ŠÑlѤ’(Ë)lá ÅL¯„nçÃ1T ±nIW½Y¨hu4e¯£™¬ðêTpŒU{`àüú…×7FT¿PÓC÷ANzWkY +>‡s,…bK+õËN‰ã6Ó1X>Éç¼Þ0^<7UçœPýb´ýë”þæµbÄ0°êìhrf•’Oì‘÷©,Ðt“GLE þÔ:k2f +AajNTLH +žJ“Ü",}XVô ÇúrȌe â' pÉP*ƒ%zñÆ,Ù-œòÇ ¢ˆîn|^F®kˆîNJmªç‡ìþoÁª?"іª·_¨·n†ß¥‡w[eURhŠ—R›wqÎ^-0T”ùñi@ŠûGµù‘h‘%ÆÜ`ŒaEIZoØ©Pþˆk„!;a(ƒO@PüúëÂPDö„Ô¦ZFj)m!¡0á5ÄTò!øZÛ^nŒ' ËcDÿ—Õ};¨ÿ^›u)4gÞÄ* Â”È=ˆ—?‚Œïwá³LñÍBúýä•^l…žqÇȸ‘£§0{H»B;†Wé\²(iDR(ê‰1 +$ˆž‹µÔˆvþ½ž‚œ.T\Ü 3%hòN7èà1nk nc싀‹Òhޕ%I·”r$Ä6™,"§ô"3+½_¨ÂC²]Î$äþ EöÚEiŽ~…ÁÉF/KÛûÖî5ºB}0Êͪ¶§2Ö\S{/:üi9`(®}¶ Uµ£VŒÁ¬vc{íDw2yΧOyߕ¢ÒU;6"À,{·¥™ŸJf¸Ë’I ¿$ãF……!c©^`ÙùLðÈ%'ÖÏB&øß*¯†L0*@ó±‚Rc擼”Ýaf7•ÎK­Ù ? ò¿WâMÞÿ£Z¶ÜÁ¹™6©É€ää8»$€´œ‰²BNÃ|Ì<Ñ}hnS¨U¿LWwÃÉÊ3h¬˜…94@h¤•'d +Xÿ~+ÿQù²íH<Õê4[|tÙ7é34Äì(.ú>}0üp¼ +5׋ë!HÔ&x_È='bKÖ rbõ•8ðâô +‡ìdryDøÆÆ©ýÔJ?—|R/X; ‚}(ÿ 'f3%]¶€#¾¹@æÔªÈ`,½Êb‹r~¡ á¾_¨7¦%µþB™¢…ÏÈó겝uüFmoxàåS‰5–žÑD«Mõ à²Ô9-J¼†nD!{eÎÂH“€ÏÐ7`“ËßèmxZ´-ÀJႏé¥D˜SÄù!6ƒrX¡L¾t’/ô›HÛ!E/Ô¤¼Ó%.D›žsQÂç¡uí¾º· +5ÃÚ¹ÞÆ»‘.La±ã ¼P9¤¡»P¬Ì¹O)Ë.”15E"z؅R,îœÖ@².ÔY„ÑL'F",r°³¢Ѽ²NªPŽ±xõPæޔoŠ*8 +䀺PhFà›gqºPÝ;¤¤œï¼ñkîŠGD£_å^zBCdŽÃ-Nh ¨Õ颮UjôéåV4Ò)‚ä)l÷°&ßõÎeG’”#Lè ňŸ'Յò«ÈWMˆ$2RHÖ£R¶*Æؔ]¨MÕÛ·íB9µ>­º—7›Èq»PŸ¾ÊÊ1˜mÞ²qù´@²to*Ì{ [¢íBM;2NÄOÓcSó–';§ ÚJÈÁ±[´Y\12[ÐäÄÔ:éêÄ]‘È’Àg–FvD˜#3œŒA…â8þŎ°B_ò½bø`ž¦6ùWè&1gñï¤*‘ä8þæ%x\"Æ6Ó´e£Ìg £}éRàZ6_$þ… ƒ¸˜ì„ÒátGCÕ¢Ò\fÚ8¿‘œ#švð†(§, %›úH}…s÷µK®Û —¥ìږË˽æú’,‘Ÿ€‹ÈÑBæQä¶õ]6ø +¼[!£{íª0 Âœ{¿ppwcOÜq6·wì.† ®³ç}P÷¬Ô/a Qq¸{õr€W˜)æ‰ü#H‡*êù‹ëD{zÂ"¯g= +9£EϪc\Þ¤¡ŠÿIø¨U6Vž›¨ÞC0YD +DBÁ˜DRn ª`l||„>–H£0E1Â@ÅBÜž dB¯2#Aí"/LˆÌ +)4!ƒ%I¦C€¹~^Š PêM)BP6hæäÁQd$„z^ ¨dÊ]¦¦-ŸÖ`‚~W ) ëf7ö<Æ+yà"ÇX$È·ÛכîQ‡‚?d ” +¨,Ò—†Rô‘ ,¯kLL`€`~@Tó­Â³qĵ¤^ Ìa”zË)¬¹@TkÄZ RJQî jsÀ@¬v–(N9ˆžLXyž¤ „Y7©œ´FLv°ö!°ð0•Hˆ?M×ÿ¹ˆ  °f@µ[Äj"@H79 ˆ#t.¼ÒD~a›´ƒm9†@Ž¢w¶-Ï°f³3ÂVˆ™r9°wˆ|×)’'¤Q¡}˜L—ERÑÉþp°¬€?±0ú5‹?G@íþ»V0½:ÄËæЫ¢Ýl"P¼3æ0Tÿò‰à ÷Ï¢ÿÁgß·C“âdŒy©ÉþC¾ïT‘ç÷³Þ"Ñ¡ÿ€`Óu@Ž-ÿ!œÁ^ä<4ÿA.äHڔsÿ ï0՗‹²Ë¤+‡LÁ8žWÇØ l¸?ø¡-¹ØÔ~`)<ë zÄ~à™(ÞÒά`§œË%LÀû \9÷kªÆÀôd‚HÄ—n†ðL}ÁüAa¡‰þòüXü?îh‡dûá!×åjÚ¿ŠÞË~p¡G:Äëû‘ äúá†æKipHÖÿAéÕPý yQ×Cz@ŒúA樇UoˆÂkc +?ÄiX›“C"ú(Žù¥¿¡äŒB{”Œì…r|Ðä°p†VüS`RêñGð¡ úÁvޫᇒH ~.~¨ÿy`l°ç|ôG$€‡\ŸCû¯ÞÊoa!®Ûñ>ԍ٠è¡Gl÷AKԍÔA‡ç閁óäëyv]ͽÅ+–¡ÎÙÕïC¾ÑÅj’:FómK™ ™¨øköA⟹xú0‰ìƒò‘F_· ±_ÞQ}à‡Ö—0Lx¨G ç…Tf’¦]LɇB† ð ÿt’ãÃI Zxè|¼;Ƈ—ƒ[βø ØP+ +JŠ; P1¦c©1†ÝhÉûgˆÿDR)zB +ªàâÚP@e©\†ÎZƒÏí!íR‰ g˜.އÕ´(sÇð4Ð^Š¶³ƒ‘¡R‘mvI3Á~ÁQ7Lî¡ò>¾i&îAÁï‡0"ƒ" îYK’4›ËÞ€ŒOêúJì‹JO:”‡±?¼E!7óÏ¥a!-Á’@YgËÃ}Ŕ¶ÚÃsaÕ)Š³‡T;»mŒÇ ÖA,Jy"öĪœ·T~ª7䗁Óæ…=œtÅ$€=r4k}Šõõƒó$«¶` S®FÔ°Š‹€Û tT“íö ÖCz°§p†óÐ$w23!-µU8ûŒ‡>Ùöã4 ¼²;¶Ã8çaÈêPÛxàыp"SËÍ"xÚÿ"I=Xk±õQSöôð@Ná\ ŒœÆv7X›¬¨G×9-=Dhjr ÛÛ&°3ސ²˜ó4—Ùõƒê]Y¤L:ªØÁÈñóFÅðàJr}D²ž‡èÎ%­äªà¯wù]2B,R1ò1íÜ< ‚ò°Ä7‡Ó÷”$¡ÍCXÞÓPó“ÿ4dðòÀu¿DryøÙÃ`‚¤°)D®å!Ð)a#–‡ìÅÊC*êî@pÖr …»HÞÃåÜIHäáK8㑝Á&ϝÜÊ¿|¢GErruŧCá![zã·Lop÷£‡Þgìðõ‡Øû: @‡{-†Á™x2iNf‹‚º0H<,í¸®ÉÁ®ˆ½Òø%ž 8Э éçø¿‡‡øèu5j¤Š»ü¢íå«áAõÇoê‚Ø$Uæ ¼.ÚށZfð@‚ØÑmLà=ÌJip~Õ[Ù©‡ÊÝ! ŒäïàwqwC9“Ì +Ê"ž µ+‹ëé"|¨*€&ƒ"Ù»Æ2Ÿ¶Õzƒ~¹Zb°;˜ÁºƒRЁeYÄ¿ ¦+ÓÈU…&FÂgî œB*wx¡®F£hkÚaƒ1À4ˆ¸–šg³~™z„Àlà |8©o‡¨-—ÀJ´A7Ô@µ^XÒ³UIŽ4Åo›vˆbG9ƒ);€Ï¾ àFBùv(¬±¤@“ÜlJ¼ö‘'ÿQ±1®ì(èÕ3‰·‹=È©L(&–B?É[*H®ì@ÈÂcG’zù:v¸Rƒ1’Œ*nÀòOý9’¯Ø!‡jˆ3\²¼mP»ù#Î×!ÃÂØõ: o燑RÚäD¾U4Ì}·wîz§íҎ±]Ëocêé>W A߂ÀMȺB_z™£“0Ž†Îm"’³9qÙ^àh²É­d{:ƒŠö`¸M­ƒ`h`– yÿ¦ù&Úg3@•*¾ÆrãÛKâ!ä…fã/V‡„¤™N7 i¦k"VR¤Ñ!S‡ÔÁ:¥J‡Rª*˜ æ®Ùu@¢Ûcá¦qO@ÐÛñé€ ^Ò?»O!Ãé +P¥ÓSëø¯mźӏӡEA"›ˆ»ó1i4ö‡˜L&¬…]à 7u'µ²îàX¾‘l”‚¢_o{–ƒêËI0/}JÐÿÅ‚wûTÏñÁù«¦vöË{¾O˜'e¢ï¯\H㠉l0P0EùÝá;(zççÀª\¿z‘aõ9„zÐĘø¸¾OééUÝtlFÄQ™Ã…z˜Ì}ï#+QaÊGFç'¥Û—À’s DH…-MƒI é +4+Ë?5ðË0ÏÜïü'ƒM1šC¨ŒáîЏÁy¢‘\±]b9¯sÀ94àì¾Õ«Á¼Â»áùKÉ~`+YE$8羶Æ-$/¿©‰ãóÀvºô,ƒ‹ôúcÉA5pûËw‘§‚Þ ó!w;9RßÆ ¾SpJ7ŽäaàGy,³ø {lÎܒCîÇ-:n¯T<ùF˜/Ð a¿JDƒ”ÁÓþ÷Õt÷f€ö^e'(wòºÊº•¬Ç3j6ÐñSî—ŽÃz¥ÁÔ«‘ˆÙL å̂ îÏ:œ¦ƒ˜á€Ìl Ú~Ð4ÞbËN•ç*”m‡Bä`_¿@!Ž+ùYÅ¢±8@°y*ë&†&»©8<*½¾ºZß㆔¹Pà¢vâpe>jTԗr¨Ã¶£vV–iª¸²õiA‡pXJhÎ;%åeÈ #̦<òŸ×TL4rƒôÍñ1ÿܝWA÷Âú3v|M7‰”OL7¨àkÿÐLãidˆ$µC#ÝIƒFAjp`+ºÕüˆ.hìÌìCÁ›áÐØچŒGmBO®Ãp’õÙ!k‡Îþâ˜Êf8à÷4¸½–±Y«Ï÷†f9k¡ÿã¨þ¥’ÍÉB¼­C€ú”»It«A˜žøèÂœ@Þå[d¥G˜ñ1o0(6õ î/Lޗ3mˆ–,朷fX¢·´Ré­!5á ì¤Ð<.». +C€2í§˜¼/’ºî‡Úðo§Š­Ž.⠞-Ð ÞJ ¼Áê †i?£1EJ§ *†7\l7|½=å†ärTJäbbäU)°^%ª¸‘qÃÙL7x‰”¸¿§…hD(XÇgÕw"Ñð ÒÀ‡A -©Ç†e·ÁBµ¹—Û9ÔDÅýöë„:ˆ ãÆ1‘SDԁ̶áaP1&á䙠¿6(”sHk·AOïÄüî`…݄̆$^ôäDHŸ=ÔI2·»øeC‹rC¿ÁæÂýz¸ :VýÍû\Ð[Ü6€—ÜÌlC<¢ê‚Ø-“m€J‹B""Tlƒ®¡‚ðÑÛ°ïßÔädÞ$Ì2"ìë%rÀ’„áFǛBÕ!]{îñí­8èî¬7biC†C£ØÀæ@Ù蹙т8*´!x0ù©ªRҘÿt60Ž²O¸‰ Ø3¸àT7p±¡Ìh«‚P¡p,l 1– gˆn!-• NeƒsÑÁâ¨èT“ 2eŠ¡ÑûLj(Ƀ¨÷¹móGdƒó ”@pµ: ž5ap—¶Ûë÷ÊҀ(N]™¯1Óü Pˆ K¥áÑä{‚€îy &Ò 6è3…ÎBƒ«Àé¥îD/¼þŽm&P¯›_ÃÉqôp`Jˆpqr>VÈÑØ´>°dú9 G¢ª¨ à5¨Î2ÚTÔG*Ãsh™çæüZÓ<‚Žã|×ûýZg¾“3yºLzÖ¹Ç&×ÝNOó{þè"™¸ëóPåÔœÁ5Ø6 f¯ë±JxkW” 8p„ 4úa5$'(q½^0]:‘áά“ïŠÖ`ÓÀjÿÑÖ@lái÷t.W&jÿ'þA³—'068tr†èi ?% >t²jxíÄ=€¡†‹ÛYnÖ#©†éâ°ôi0ƒòl;ÒfÀ©þüƒöÁ휽§15üšý Ú6K©A…€\k…¸¤ÓRÃçî¨Á.B’úb„ 3j3ž,PÊõq4%DßÔ½1$¤ç©³u—ùþM< dø²Úix¡ô²³ÞJi𷘋M;˜VÑ+ © æIō·U?™å÷4@+ÎY°ˆÝ#}–N—˜£! - oøûS8Ãΐìgàïìh½ZXj´¢ÔriááèÐ3x5oœÓÑ] iˆ¥íOYdQ懆Wˆ#ŽíBÃÝ™#H£¡‘QãAJœªµÎEÃɔÁVa‹è¶“D€DÃ}X?4DjA4| q”,Éô€Ü»éè M±>‰K½,?Ãø†úŽ M€¹‚Š8цјÑí¼ ¡—4äoE +¥¼,Ñ÷h@ï|€tuÚ{3ÐF8Ž¶¤a«uC#»©[ k!i^æGÃy•*“odŸ![„Ó!,m”ä˜@C„ñ6C­è`™Wt‰óJ‘<ÏҤ9Ÿ g€“16— @CÜð{x} hš¤Xæ<­~ÍpüCëEB®¯™À[J–ä 9ˆ€/¶é£qaã¡ùòÊÖ°¸úľ]rs@k@7CÏ" b›¡£)X“̲~îLe]RºÃ]3 ¦Êã´»cÍ “gmíP€YÕ Æžôݍ%5C0­ù> É4ƒa„OIP“u0Âc¨JxG~iy¿IÀbõ©Œ$ +ùiŒò 82€ãæ]¦`a ¹©GíÔt¼Fô- cê]YdÀ=2@&b–Ù €ÎÕ´ÅÈxC9À54@0dPƈFÞAd’BCCOûŽÿÃkº?ë’dø«…în8ß"ë‹!C»t)Òü1¸J fR˜Ÿ‰: 匄Í+p| ˜®ãµÇp® Hz @Ì â¦ád?GdÇàS(˜§fBS蟛aóˆšß0†¤3ÉæÃ$£Û/•Yx%°/D‰f^AÀÆ<þÈøŸVHù +†+«¯: ôÁÄ¥=4,8s̄^t‘Æ ¹ƒÂ]V–ö+°U®À‰:%l‹Áœv ç”ŽÆÅZ´),†4•Ü SÚk€ñFŒ×VþšKZiR zÝþ'QÊ餽XAIŸ Š¡…)Z(O' Û°ä‰AÖ²8 +â…ÛmӇùve[Ù0àM‚p «Fэ. Zc°”‘S%÷…¾bž••éw«ãú¹0H–¿–·½êÎ$†¼Å“•öBJ}aÎEYŸÏV¿­Âì…5<Á[®åÃaTÀ/¤$Ž™|R–ÅøbôR†À30Ô³ƒF¶é Úê6N†s†Õ~a—º\ȋyšù'ŸYêj¥'ÿwìðÁ@þ®1>ºº ª5ç¶e|ï©+t §/ ä7´ O7á“,x%bò5ç¡`¸ÆDEmQáᨠÀ€®¢U„†§æ³Í¢£õŸ7†Ô7´50 RtEM`•b9 k€ò+Ô +SÏzÄ_àë¦BÓÂ1ÓòÔ~p0‘ +Hnd"¥ð}ÁHÓ½7O̒v_ý8èbÓT´Ü©óOÔ%·‘²/ +û‚àŒúKB{ä`\Ø4ð:`¿ˆ°üF4ù¥ÛÔ/Èßjý‚»™@±ÑŽ T­ìôš@þä,j~ANöä5i«A‰핔 7Å/dÑOjƒô?Æ®ÀT›uoÞ8’v „ˆÔû‹éJX½CÖ5»A˜‘øüYù#VñÔ 1^Æø$OµM|©&PµùŠÇY(ñ[Zs~4 Ý Ê߅M{µ9ù{}!ôÿ üI“6™ó‚BNÓ(„å£Ë íe×¹ î.Š] ¿µ_’ÈŒ‚Se½ ×Ì{R°ð/š#*bQSl"¬Ã€õB žv­ìõumK…‡Ó ªƒ*c÷ĂËÎ%œ¡R±*q^Àn¤È{B›K: ʐ|¬»pöA5ˆ{3-y!²Cüۙù.܅6Íe÷b¼ðÜxŸEŠ= +_܈3ú¶#^Hx•=î^ˆyá§p€`Ó /±>õ! +zÓ,¨¤-¢úeQìP ÇÌžˆú“£'¯üI»3¸øø"Í&»@(5Â~ñ‘(œz÷<®…[y`;[\Ú7:§™›µ.ț©AÅ8âa]˜gôð[]8l P]Ù¼œåÇ*uA{ŽJŽ!7A]È2|%µ‚3,&@µAA +çN^a¹„z ]€sát×ÀžõvðêsA 曟9 υÇjC´0yÃ×åBƒžiÐÛ¥–µk’J] ¼øÑcjñµ‡2mJ7@.äÍûû4.ÄP* a¸ôpŸßـè*Ÿ +ö éï)hDµƒáBЏj¹¬Œ;å-ÄûÒY®D}€pa1Va¾Y\eä¶ ± ƒþJªÄlç֏øžMÚ²ú ÏäT+oịZg}¿Æít~küw¦.›E¨½û_»ß-( ºB;y±hÅæì,{4Ýgì»÷¶pøi÷‡«´-0‰$ÅrcÙå0§¼éaÎÃ@™à,~¯£º¢ÝŒø¼g YÊçà[~{¿\Mš$Û½WV¶€Õ™H•Ü¶¯QWz°k- éç[Ç€Õ D, a²ï³à¾óÜ±à˜7çµPÐvi°±™u- ˜)\ç€8A å„{Ș3ú¤à!h«…÷ÒjcZpcMÒî\íÊË„FÛp8 X‘[!¥ËÖŽÙ“^Þÿæs«ãú’f*5ŒðàM«¹Îv¢õ^î§hAr –ÚøȆš|cz0tô¦ËÀHHñeáó¨!eÎ'=Zâłz| õ¿±A^¯ÊRÃä,xž¹¯ å­=Ò?Ý, G\]«²X&À,ÀFz07ëG, !†éî|¬¾9Ð +;î'Ï®`ªü¬t¡Ê:­ +Òµs)’`9…b†%@,׿Q,{< ènbýf˜‚aa×]á|`œÎ„…Lì,L‰Ê\áâŒÈû„ñ!‚U¡K¹‚ÑèИ<ßfÂÄBßMݹÖñšvI/|,dn.ýPǑ0 »yŽ¶„aaø¢bÒ[  ,<:Y,OÀš± „ÂÄÂ! + ±`–Q†œ@…+$˜r<}xǂú GH\4ÿèpÆBð6-ª†°€NÕ6Ñ¥]"Ê8^ág'Ó¶€…W+#‘ٿ¢IO“šì + +ҝÞ12Uà&ξ! 8Fè |òA•«ºL8º—u¿J–+¨3vz/d“y\Áø}Š!x/­øûiï™XG¢M­¹H+ãO Tu94æR¿7q–Ï‘ÃA3W@ùÏ¥s)WÀƒ§ÊßD®°iô‰ ·Ú4®0†¤‹F +XlÔ¸>ÚâTß0KÞ?â Bà""þ©Rm+”ZöýR`v+‘©U+P•‰x•Í´é/5#ԅåÜdh£ßC’&¯ÕVø%îÃÎÈ\»R=sžCʤª“[²Â +BV0ìCÁ÷4xÂToòÖô¸zñsú¸;­‚|"ÍÚ ÐI×È+5ŸÝcŠÂBòá +I<»Y„WÁ#ÿp^VÈKaá)è÷[ú(4B«>šˆ·å͎¸MÈ›UøaaN5–¬ˆ$¼-V‹¼Ë¬Â1·Q2s‘28*°ü* aqŽi¯ +pä äÀ>¸*ô’á]_ZjU¨Í†@ýXNz±* K=ÃVªRHU^r™Eo±\ª‚FÐt9ï=ÈÑ¡*ŒË‡M—9^´Ë@šH3UÀŠ÷LÀÝCƒbÂÄßt±ÑàŽ¡É»@Øu*d× õÂÎüŸ:ù]P§RÄmÚ{!› +è8žÂoÅ@A/1m®0„[¡{Rß)ðáÆn3ûÝçRAŐ¡ë”înK%nüvC• +«¢Tà%9Е A&ˆÝx ÏtcThn*ŒçQ:vNWÌ0)”øe3hhËdmWÚD8$€ú/„ +)?øõΌÝ?õÄ#ç× Ø=`™ª¾¨À…0ïH´ê¦ì£­Ž eÝ+šJHý?߯OóÐNÚã§%ÆlO÷£ÚhÍ@OAû²–T&øâK˜"%-¼%‘5…ù¢â·n‹iÔ&üèÿe$XI™ßË“†£âè * —e’™`J^ æú µ%x\¼°%t%,tIŠ!=ÜþD­¶Ëï—K#øg6±z‡ºðD@. r½¢Ë¥ÇYß­²´ÀŠñÍÅF!KW·oj3“1´=x!!ؖî*á6üܑaŒÕR9‹%(8} 8κƒJÈèÆRìP©×+ÒÞIø71ÂPê¬9UZb旣Îʖ"jeØ1÷,V”¯Û®SvñI€#ƒ‹¹ìj!72>¨6ÊNÂ#©Ñ€L'á)JR›"Ø¥²IÈ”*I°Pœ\œˆK{„oΰ¢pŽ&†"åáŽÜLfè$æQYn¡^Ÿ‡„UÏ%°FB9”"‡pí šüô$8> ²Uo’Ì'ùþàÏáŠâÁ| +Dö¥òƒy ùCK l±î3Æm„èª@v +JDIÂõÃÓ«ò({$ ÀàÑFĝúP ®¤ôԐ°Ìì Üß +É!@|J½nD“GBÜ_ j+2(T§A#Á9>0üCrý™”]$ˆqs.Çàg‘¬¯]¢’•Š}ƒ„ÎáX‡ù¨L49/\ +¦¹D›ŒPš‘*‡öB‚:‚ý–Z5qÀ,C&C࣎¶~ôfùŸ$÷mäXÄ~2KëÜ÷Í’ýâ´Ë"N +ÄÓK D €´ô§Š’G"‰"â(=a²F°:LŒ’ë a´g”Äã`f°/,¢æN¸eOé9)òGHD[ÎêGQÛÕ`üx‡÷ÂÀvïlè"0DŸìŠO( }„± ‚¹ ý UrµØË2M¥Ñ#$÷Ær‘ÈÂ<½4BÉŽâæmHaH =´ôFp]ñ¨Pu»üêÚÃ7BÊDé`ôúv¡šg0 êO½M0Ú‡x<%ŽÆ;vu_—JB€#4r”ä]ðêtV6o„°×^ºJ֕@ ©I«öK#Ú¯ +L/7F ä©Q¹g ›FýdÀå>r´5L˜p€4‚z')z1Õ­h„A +ZôÔa‰ôŒð®a Z˜ÁR‡.JL9#@’ZuK0•f„çãv3f„VÛéº;»Dˆki¡œÒ2V}ƒú•ð³ê2e\¢Óî’gKFxZ®ti<£ƒ¶Æ› à"¤§Œàk,ueüîAWqNJ`yÆÚçân.kÄ3€&dq¬U͙̭> QÄ7>/BÙ›ñÚEÈií&8¹š1,Àð¬°b"`@Ê.òO=P†Ž»EÐCE¨¶ÂršE؄,[„ôÌ#&W½ASav•Éæö l3@RÒ喾‘EØ9¥ endstream endobj 113 0 obj <>stream +.ÍIgVrOæ,U„æ'O÷Yn”ŠºŠ@,C“Ÿ€@u²ð"o ¦38ÿ ξ3_÷s„T)æ‰"`©Mƒo¥á×z_‘ Á'.ˆ"ÐëY¤!Û0X‰ ©€>`Ê$x8P¯ +É©ÊéËÙDø5TM ùÖºL˜ye"„i:-‹o. L„€Vðb´ìªêpˆø6DHqkDWꉀãõ¹|–D¨ÆT¤ +ôˆp;©Sú“)ˆ§ÁÆa`qž¯±ÎYŒ ‘E„a¤ˆðÛ=`½O‰ðùžË+0‡ˆ€ü¬º¸C„Óáˆfˆ  „¼¼RN!B0%tËe„eì¸ï*@B±ò‘HŸA„ªzº"©! Q–¬tK)…#¹@ª4÷cÈ{p#„Á‰õþ¬.4Ȫv„ð+Dw…•JÚ Æ$b=öŸú|E®ÑǤzPBـ&† Bs‘²œÕ@@àá;ì5D=" 5¬GӍÖáq C8±jæ5¶FŸÑ²œõüf‘Ç6rO–@pCèX ç%+4‚† ? a•(°¹ ýí˜1g¤õÝ,WBÌžÌe¼—eÍh¥.5rÊ32D«…1ЃÌQ!ˆ… x–'À"!&Íw‘P¤üœñ‚É +© WâV=bÑë䢅`GK/[7\Ì_oƒ£và Ñx©¸s­(!aæŠ@­'°0GKoŽ½Ðð#ú!ø¹(ÁyêMVNN„¡u: Õÿ΃–´rb–„ ònˆ%jW œ$E EµÇ(Xi`ßMƒU ð½ÈPLPŸâ7¤}Lá‚5ŒæÈöñg¨àA˜ߔ%mÈ­s‚îª<v6Ây*gÞè‡Æ[ž<:þ­¾ä 0‰%¡¼òCeƒ@Ö7ËE BF¯Öór"ˆ­5ªI,f™ë‘Ac‘mè©×ž7J;®~eñ@Ò¡¶ +ܐµ9Ê*|Ù8‡§~-æŸ6´ÇœO€ZM¿\™ØTf‚àÏQ Hl}lne‚ ½xgMâË D¥gð¬V֜ôÖ¯-ÔÊhÊx|Ÿ‹˜—åqËÃ9(·ÍceCT`™v}l瘪J²)¯ÄBøf†Ì®[Qñ•€kÍ~Þr5ÀЎeeȊ•`Uò-¡«O ×å1™.h<•™‘] Ø+‚Ï­2?ݍiHei¤|3nÑ.Ÿ¹‚µ’¾Ä僀s#œíÉÆîÝF1R4ƒÿ ÃÕPÓü^¬gÇ:¶Û‹‘BÖ'%bÄà óGó픔%ŸuƵ׵Åt*z¢yú@9áÀOÌ.\Ói¸4K3I£»8ã~ oÎwíVj?À¹Tî:´²9Ðhòj0• »±~`Gˆj¡š}+Aý ¸“m8Â<]ë[”Ž†¤–ø¿”%㠥衆SYlµ”}=øÃÚÚ¹W`=Ðï”ø”@Ì nÜçvp©#åÀ»Åï!å"eœFñƒ§¸ÄŒñ3å𓬽ë@¦œrB¢ì·R¢>X%¦¼_ÍàÄôAfc•Ù#§¼Kù§«;´–‰>˜îRF£ùš'©úØ''ÄÜò¢Ïšäöà±Påø€4`±=€ÑĆf{~eEAšIòZè‹óŠÔUÕÌ0®v ë!Rï +±ƒÈ=˜#ªÔ%alz@€Ã +Ë`æ¤3¯;ð4Á£lyÐþß{w@É;5¥ÝÛ<oß®«^óÁ*b2ëö yv„h0z’¸9Ô¶ßbÏ”’ëAK) +8@¶¸û/#Ï{ÔðÅQ!mÂ×G‹.—µu걀 o , &°Uº£OìT¯ÕR÷x-ã< .p°ÔŠ÷&Vg(åcOgeMãƒúHð IyGò€"Ò”«G?È¢¥h§UH#NŒH†Éwp.(‡ñÀU (è´ öäHaª'Mê@9iðàå†Ü“)Bœý†óçöHØÛ1P}kQ¶XډÛ£Ž¼ƒÿ¹€uÂ# +æî - «V‰Tk$Ù3')u8cW|ì ö°ƒ; yÁßò¬0ðLìœ#0½²MGO#4 Líà÷ÖÙځ¡î‡ ~2; ÐÇ õ¯†¸¬7¼nÄM’®sR$à:`YÞT[Ä%­ƒË!ê˜õ‡A½b¹& ôÔ$ØG¼ÈT½RÕîWÀ;‚“oøÐ~;Ão>’:0õÕD% èàÿvÜÇ9ð/¢ì8v`¬Õ(ØÏ-*h8³.ŸœClïâ…O ¶9ئ­­™á8µ ¤5k: Ü1érO/’·ï+Ÿƒ£›„ï™ÎÁÑ;ÄcE^‘kgª{ƒ¥ˈ©oÜNâ +©D&°(T½ŠÀååù{Kk0v0ÄÏç> VûúZX: +j©y-@x&‡ðj±.À¢m>Zg›kSþg+ê¸ê>wÒä&Ãæý‚² }l¥fø†Þ€¤†ÌÐQÐ ±1ÿ<È7x¬R2M¸z7Àú¨íT>h&ç©Ø‹Ü ø¯õ˜#Önpú M!­² +ˆžÁÛÁmÖo°š×<„1–°µµÕÍjrgQáQœigeÜà1ã±6hÍz˜BÄ Q új9qCLØóŸ ò4ÅúæmDº \cHɺ§H{܈$=ç4D×@IF¨k€ dÞ&µm€3 ú%³!ž|`K!“mIŠè"„%‡g]§aÓOQ˜˜ÿøEš›6¾Uñ®›Ð[°6âÊÛ§UD_Çka`‘°,ú›ºhc:%(† Ú ß»ÄFj6= Ï’ K9À˅”fô0UÃSÌ· +æA¹ìAíÜí"” 8Í_É‹-dƒö¥Â¸”Ùxe¶q ÉË b~µ›ÿ´Uscƒ×÷6¸‘­@±A~•bGlðjþŸ‘Œ ÉJ Ê†¦Æ¨ÞjP¯fÖÄA0 jgM„(H 68=…ì,ȗlât âÇ¡êé¨rî£Ûm~E»5€ûÃl À•h#Rƒ¨ïSxC×f ^#Š<²ÿ~`\¬$FøÁüÒXƒWΙYϼÅÕÀs.&,¬Î + + EÜ ´„ûU$g äXG ɑœÚÙÿl8†RǛMa&J}&ŒÒàz'K¨—zŒV±C=•AâF¯ã½ÂNeÙÄ®þ AŠ9É<æáÝ" j\, 9‡í’Âр„I­O ÔGòyŒÉЫ#ÛþÔàÐ;yá«õ)” +¡ÁõÜ ÙÒf^€¹®tøÅ~„Ÿôòd4Q ¿R«>ƒ‹›®C4«j €;Å1=ƒkÿÓ²ƒX ϔfЅâ|°ŒÆ˜=øY2Ôî 1&ž@_­:CTSm‰ˆ©3@„[Û©côÑ¬Æ qÿöñpè£9ƒ=VP‚cYU*'ÀÚµ3ë‰&€AZLd_+Ë Ð ÆK3²ƒÐûåQšA/ygæSdÙZfx‰ïX™™R’2ƒéÐÞ#[1M°6­6?†cÏFÃ×è²QéY¤R_^©à[>°¢<Œ¾‘µà P)&øå)ì<Ÿ­ZD¯]ÞQÀˆÁ‡Í]Üò+…ˆ}ÆzÛ°Èø{¡9ÞѸ]Ež2 ØcFÏÖM.g0 ð‘„ ’PZ1BË[¨FЃT-%ß'ôÑÚ$ zã´mv S‚0=N—)\—ÔÔ`€ª_hW½«½ ƒÁ)Z0 jFv2AUºÑcT‚ɧF!§dÊÒìœôóñ ÈS#­¦SdÀà¿ýÓÎLÀÀxž‰>ž`pÉ^aí-à‘â*îd+Øqw€îc\½CqÔÁ9Z×Dñ·ǤÁܑ’AßKµêᶁªÎR=⊿‘*ê/ð÷u=ê ø „Åxڋ_¦£ó†€}çÄä›ý‚uÖM0ǜ¨ú`V9¦½99Զ˿Uæ pf9’mQòFá_àÏ€ä>+e0­ÑƤ&PG2`1 n€ÿ_¨1¬ŽX†³üvs5ÌXáq¹àœñÅJâ*õ‚êoåÿ«Ž¡‘^0?w¾óÃ4㐠¶™3¼Uhë O¬ÐÀÕqà£,Œt…³¡Ùyì yH¿ǎ½u†MwÁCPcmáÔÔæ±í¿ À2H1ˆ (»À†ÇR ˆÙ»Ã4µIe¼Š.ÀãL݄øQ1ŽÒƒ.µ 1•Ûax.XõË tL]ËL2µÅ^€º–ª¬t²lʼ9£±ù$¬M µ»Û’ø Äóñù³#@‚ù +¿ <€¤@Ç0›©Ï‹SŒ•©‰N¸ ’©¸@¦4 ?Ãu²8'þ©Š©J D ™ñHÎo£@ LS_¦ ôqSø"8«˜ð®|ÍÀ*æ´z]Æ\T ðR«‘~8há谀Y0À?OõÊ[ßNw»- 4ô¢¿£ۂf³ìј¡8=(2á’Ù ¶`%ð•ä3ä’ׂû­ÞÆ^öŒ)cFK¸ôȟ>cý.{‘yËdDXr—mÖ5!Ï\Éá`ç4 +®ˆì]ã±Ñ›xÜ>_Ø,è`§~ ܑê²"iàA‰þ2š;ÖY–Y€fýÆI§.Yי¦õ3ÈxcDìǞæ¼.pn^Hn>®;§÷{èʂºh^T‰àßMÆÉH<¸€ÍEt’aoΉ%#:äáâÌXY€L¶bNb â%¾ jccÌöœYï°@ ØÈôeXP/*˜(y«ãaض×%ìZ @79|³—\¸Pû!A `A d•N¦bÑ_Ú¼a$¶TN>5"(h´ÈrNPÔÇ Qc‚ WwX—ß²Â,ø9pT÷ãï¡3'#wêM5`X˜HÑÌèAIô@D607[¸¥ÎØ$¼m¡ +¬Ýøi˜›pVŸXŸ¢KûÉ g(©¸z¯?*Ç—¸߸r.Qˆ ‹a)ºð„f ÿ,yÁ3«õ5üV£^D»’¡B‰Eé·N(£5b¢hPÙÐÇĖm)P0ᬶÿø² 'h™ßLC,Ñ$L¡X…M®ï‡¨cIR#J òûŘOs­¸2‚‹©ÉܑBeA&•1¿«h3… <’0; Óݤ·&'Àý€îiöÝÀ²p¿Èj†~¡Ð¼·}4œx+U4ôÒ­•‰CU|<‰, oµãd¤z¬RW’6pâw@Ä=)a m6^¹:äò‘1Z‰n‚ýLDË"Â%mÐ8>ÒFЭ:°Õ–)•Ïx<ð¤œ3r«öÀ.¨FP,àäDߤ&ÔA(w™ãqÕp؞¦h)€›¸†|“³tðqŸÑ·«A¼ÄÖ3Þ×£7&ÏҒ3à7¸D$ †¯oÚÝ£ÚU¶xSKhÏ:|D2v  Ê ’0iþ÷:Ö©,|Á‘`ºÓ7¹V둳Ö%}º$G ¼t8·ý#“Ú$ÿ²&QͅáËúªk™ÇåØÉ}âCDAÁaï£H‚]Ññ*ŸÌ¢UWÌ'·y¦ÊÆ2_&77=œ6²Côy²…}dE—÷[ê`b ÿ^Á3á&׿)SÂ×6`E)/·‚ª×6ó쥀î‹ÜúZs…Pm̖ËÎø€®8U‹ÓoàEQHYx„ +HbØïóø (ã-Góåó\%¤¹ØòbèàÏa\[Lî»5\TôÉ°nd؝E%ÀCïz„å*êl·%T ×Ab´-ð;‰Î Nߊ–s§ò¢™H`ïo℠+¢’^E£÷ÓGZ&ÜK&åÎ~Ô"šTCSÅéÓ´H´qjÃx¾Jbkµ§Œ³À­½U³á´0`Փ­K±Hæï“ëQ֛4çÁ Ö.‰µTEÔ r˳ÒIÛQUD[H}™²ÆPh#Œ)"ð†*>¶™•T¢‡À́‡›í:øÑ}ËUŒ!„u,Q£‚a/;—Ž ‡.æ]­™B´¥Éáç ãØðy‚^©ñKCùYbÏý(¯¾žE”Àµ!Dàh×*3*¹£j„‚á°Ü’‰è´‰á Ë€­Æ«²„_Rú“ÌñêTHBãNA}.‰.,g¯•ƒ +\£b:Œš@Ԍ3“ä@8ûس!ñ^Da¬ŽS>@[1Š:¨Ò ÞÙèÇ°û@Jo{~Яðrñ˜8óúæ%Š?K¶³ú‹=$¶º~7 lOœMb:ÀCØQtç~™ø© €ÆÀQr‘2 T”k0¦%Å^—Új¬ bË÷žA2õ¨mshm¥„ؤk©´Î²<¯JÝ®7)#Pe­\H¸ç}ÈvM\Fúê7ýՂÏ-ŸJ5ØÒöb7‰½ \´Ü`ñ¿—gÌÝbßlk"N#«t¼Õ¡d*bü·¤[QmïÛè%ÿWkøb ÀlžÛ,lŒ]Ðt\/¥˜ÀÇÆñ¶d} ‘× ê‰‡ô„^Fž8þ¹ÄPÄç ‡Ò®á"Á¦œÖIFx¯KÛÂ÷TÌÝ㍚pCÆlàꆅŸÐ²lpØl%¹eœCN}5€/Ið(ÉËòæªH¾íƒß½>@ ÔÑ./r “úHWäê0· æµCý­lý9'›ótƒ•*3µTáb†zÅ +¯[µì–ZFJaRi%88Þ(Ö"ÍÊ㨝áùni¡gBr2̆Oö¥·eLL›n`€J5‘®Í*È?è’÷Wrß-æPsÃͼîÞA†­_ ÐÖ3–¥ŠÇo1[šúí’á^ü'xì`ï/^ÓAYùAÊùò]øB#7®ˆªLŸžŸNôÍÍ©Ýçª?e‘}J‰…oÞúÝÔªpø0œâ–xD{0í:úêÒù#ÎEHR-ëTˆD4”˜Iî šÁ}ð¤`¨Ô±³–ž g·0 ‚ •SlìĈ}²`²õt,†„±ÛrÙNÖœƒÀ%Ž°Å| —æN´0 ð`6Ûö$lGår^Ðl)ñÆ`k~¤°¿Uq°ïHj…¹pΜÀ®NT8ø/v_´¡ –ÿaÇU×¢c çA¼ÖÏ©#¾ŽÚ½•eùjegW¿¼#Tz=°Áµê  D4i¿Ïï3 d"¯N@̨ŊÔ#ÛB¡Dj•Üº»â~F +b¬(6ÀOiŠ¿ÔI.ùE™²¬.¹q·Khò0po»ã¦`Wä~Ôp_ëñ¯xJŠŽ}&zƒN€ºãžÇŸ–T"2a”}ö"²%/nÚG9|ßdÓh9£Ö¨ëW°l-Ãѭ֔ ÈEU¹¸°ÊáÒZ”œ‘¹Ðþmz…*ò§•BE +”IÁ7³4ïîj‡#q· :º öIKô9ϹBò©Ø^²0`Ê3‚ȪŽ>¼ÄfÕ"»û(틪 ‘¢ß=78Š+F•#‰†Ÿ5…¢# '$mÔÿ +ênþai“!cÄo!Ô$rŽ_Àk\¡0å'äۓšèBwC…Ú»íù2‚lB]°ìF#Ž-@ü*TLJ‰hõQ~ +s¯_é_–ùׅ¸(¢¬Š‘¬á4Œ ¡ÐeCQÉh”i– EDÃzŽ3…l3.w‚“#@:8ÚMqé›À+0Aìõœn…ÌñìaÒ;åýÙþŸ H; $0âş®xÑmŒD³^ ÞáD–%%9¶fáí“)’ÉÑ7Ìèµ!(5ƒÇ‚P—2—Ökµ2Á҄Plõ¼ºüOߗñPV¥ú6ƒ¦9w‡22¹§)AäÜÑà”0‘ôfɋ°b„ãºú"§m+5žÀ“rX£Œic2âk=ëHцfÛÀþ[P¢B+äNCÊO¨¼ +Qëðdáý‹wHð Šõ:‚"t +òxh säb"¿‘t¡uà#ªêlV"Xĉ)p9És°Ç›ñ ´ƒÛyj¶ƒoœy/Éb÷îi‡8Øö${¦ŒaU(`4€Ïhžî¼BT—ÎPA@.°Fú¹/.jy£Hôctº÷À6 ò*ªFŸLà RÂ'à”³îR0ڏS+ããbYѓT¿Ýdn¸Ÿy“D[´@™ãò€O̸û‡ƒb‚{%Å"Íg†×bž\©A„y2„ì~©†îõ`¼aҁîñXïôv Õýá§p¹u¬2ù¸£6uB¿­0ò¥ mÛÜ|5“5Ú¨Maž_"…“8¼±„=Â&Áãhâ™v#g´}G\C‚ëbõeEeb‚¡p»<+¥/ NÚ>нšžNê@°FEXÝïñe¤ùùyªº–’éÙóKÎ́^¸ÎÌû·]n@Öêëj4-;£»N]j4ÂýÅ'|Çå]Ѥ£Êj±uUóӃž _’n M˜*\ÈÑe!+Œa`){õÄÆbù¸mQB'œE“mžEjÌÁ0úîw£2žU?Trî¿p§Âñzdõ)÷ÆýY«–Ò̝õ‰ˆ[ªüŸ€6q³Anz)Ïlʅp¤Cܟ²,†§ƒ§LÒ"ƒõè%scH¶š” +mÐ! Ì× ÍÝI8²0’‹Øú±c#®›§J&#~ê„ŽýÜõe/»iï'{p¯™k3—Ž%ôt½º÷‚öø¨qymCù$ÝÆLhtúHÀY&4¿ÎNoW©D¢eWˆS“dQoœU`”$ g0(@cAN9€>ä1iˆù €l&€C0ƒž–ô!ÐÅ#¹¹ «ýjÅßl#7U37N\€ë×/.ҍï9@®ªè»E¦G>!ï4ÑÝø½þWª›2±œÀ]”½CéXX¨wä +yŸ³½øÐF#6X]ÚÄ?+/æ{Ç¡FËê±ãïúýÑø1°xdû‡åÔÌԓ +[ǞÁD +,Ôæ6yÿÚ "¨@¬z¡_tÂC=áSÏ*A±£ü*%)¤,ÖE ra¬yCý)ü¥JB¬¯Í—?´ùg˜ô(p5åE¨BïqʮȄèŸè€ªÝððãæp-D¢»L·“è<[-4Ì3üÕ»øyB‚¦Bô 1)Ò±>t2öÄ~ï  ¨¹Ãö|¥héÞãWÀ £øÚÉ¿´|#ïP.4뭇óŒøYg@~-…ÈïǐÃЋ]}8LŒÈþ†8/:‹«¬@~—ƒ(fûTÝêE/F+ Ëϛçšwõ´G)w»§¹‘ˆo#bQáDÐÑÙ§… öC֗!Ë{ÇÀK [[oyòë+¼ÀS™bÀCIcr)—À†t†ŸŽ‰^:½lH<Â4›Â1= Þû4Eœ¡3¤>¢]Ñ[ü–þóG?H»Ì^X×`5ø&y܈#Hçn Ç¤ŒÝÎÕD^B>ྡྷ–“ Jìç¥CŸœV~ºØÏì3÷¦V†bÀw(›OŠì+_Q¾²•êìyÇO‰Î½ˆœ¿„íe„´™Šo½åø¦º ®*:ªRžO¥§pÍ;¬OÙÒ|&œºæRª\Ìòbnš}fßÕ°JÿŸ¬²‚¸è¤ TîãîË-ë¶jÇ9‹Ï#R³ï„ÖøE³Ëh^-úš¯Åëh±b£#€'£n%m©bíܽd™¤ónóºP'‘T³ºb4Ÿv,8ûù|\äpBæ)ÿÕ® F6*-oœw +úê¶ÁR~Ö¡Aô³´ïÞJ¯è;»É¢[л(wfëi®EfxãDkzY}¯¼Ñ +â¤ÞXðg‚vLšIQÙ´<9›‰ÓÉ&ºI|`†#ݱB•l#ZƒàoZâÇUXéŒN¶ ítHä2®ð¢ _f«ú$Ô"Mn„>š"¥Lrk¾X÷i `†XˆY5ð¨&·3«;û¸2Ո¶þGœÑ"ÛP•ÚÊ nKÝïìy¡0DiÏ݀r>“¦“H±Ü ¶/,‚Q(䧴Ê X™×~bÚu1hƒ¾gR.c¹^Ö¸øňźpÅ5Ž\婶–Mö±sOǍ5}ùy¥Äõ|¡z1Ð'cÜّXۍ㬂­/,øôYDôDˆÜp)§8­/` <À¯ÏȂ®Í;Œ½ZÓ+©5ŒP3û:ò)]›ó–IøØz€{Sœ½ò¬ÊÏ2 øˆ(Uø`êo³“<¿À¬mÆøðÚhÌ)rækñ³Á¯åÿ}üæ×pǏŒBÙv÷Ÿ!¾6Ò˜Þ˜ÇÞ¾k¶—cž¾‘üR¥©oüÙ)¯šåWC ½K¥ïÓ¥(ò×êI°>UMd¹¦Þé›`þ0C˜C°®i4¹*{|Ó³ûcs<äÈa!>†V 8Ñ#a ¨Ü è}­&“»,ʞ۝fapWUãì¯Õ×M‹Ö~~â;_P³ð h;>Ilè’Àà^NçÜ_ ýÌUiAz m˜±´BRä° “ЇeÏ7Ø+ـd~D6´Ó&âe¬§“ þLnç„i{ü¤öJ]-Óô²o ×X›¡\Ä.kqÓÏq*â#¦Å!µ!ifPŸ­&;bÈš¯Iög8S}dS@ýg8”–&ó,M yKÉr<µPqƒ¬¾‡¤Uì5ÆÆEƒD´,=%˜OÞ¼ÎDÃùJûS$ëòñ´É»6¹dÔ:k©nᣧo+©/Êk à,ÇO¸Ob«¨*r“&ÏRÇïD¹áGóHõ1šÌER;ì +ì|šf äÆÌèp˜ñ„E$ši„  ‹=ú6]{ì½$)’ª bjÕÖÒ¢֊·,z÷pšÕ¿˜ @XÀ’Xe͝ǂ²yrBN(t„3*ÑʜëVëRùU¼ ÁL=!'”q 7žØ“=¡Ü×–ËªÝ Ý™@Ɔ§%pÚt¨œv îðصmú`B§‹ ?! Ï‡>¡XU}ê‚*/«@lû„`ü©Ù'¤må,½ãçå!hïãû„?ö§à©M D¼—Š=èYNI=!räøx– +J–LŸ0(Y³P b±,ª(¥Y*ïÒÅúÀcÌ O-Ìl-Ãf»Ù6ËRPB0Ä"d ¥$BDCHO X‚ÔpÈå‚XÄ+±ÍL»ªuºdډyÿòœ}7á=¿{^ì,iHÆ]€~I¾¢¼Rö†ÿb—¨3q¦Ó™ãL—ŸB7$Võ#!}c®>Wêàùø)9Äb •û [Ä =Ÿøý|dJBúž\|26™åÆ¡À^ÜÉÜŽR‰²Q„½œ¸Ã»1†GµIñcšÄ ž´ˆŸ¸5Å+üŠÏHò&IŠ뉪R@®Ay°ò3«Jeõ7<ÂÊÎ$YÖªªÂÂú ¤Ó³Lê¾rU¹\¯Ê¢ûÊI”L2:D€8ZFÓ(G+¢ p陃ˆ²ö³Z¡U–‘6F/K³³á´Ú¥-Û{>m‰„F27ã¸YøhY:,‘Äl—µ†°¯¬=·7³ÚH£˜mvPÛCnv¶Ù#…wÒí4»‡@` ÌÔ÷¶fbTÚn˜À m˜Nƒ^ņkZZ˜o¦[><Ûg_6Û¼+–‘+œ‰õfY$q³ÂÜ@›Ö6ðë 5 +WØØù!‚«Ür֝-åöœã €n±çé’fërG[ëº¿¬+G3Ý»ƒ²Â®[u³EZ´v%‰å3 «‡ùj›Q•‹Ã#¼;ÄkbbÄ2—`ˆþ’Ño/jRT|d-3Û·õHgS¤å{Cz‹ßísT7í4S¢ïý= Ru§Þ‡îyÕ»»\Ð?áÿ¾O¯Ø‘?X Ü¡À½GěU𥂨dû¦Š #°ÀÒ @ á [ú€N F2>RD\R¢Nej3b 2¡²° äÚµÃ<âNϸŽ£?¨^ ¨¿< +(¿í‡n2H:„¼n8ÈÐPÝH7Y‘c5nr4j±ÚjFprÅç\z•²‡DäØ7¸<Í#ԊˆgâË´“@½‚É!2!]¿„£¶HÉÇ$av%|{‘BrR¬Ê ¢²-Nö ”íâqÁ”«åjP3š#pQ€Ì³‚‡a†¾ÖůÃU¡ç²ÏŒßò8÷Ýõ!)hGŒ_Ü7ÁM›Æ?͘KzWdñr)Œ`c•„‹¤w†+œi·2«^2) Z]/n&ðÚRÑG ZÞuë1Ÿ"Ùñjy9<1Žç«,Š®]ÓµCñçtvBÞ $9{…¼fykÆXn%K/(U ^EÈï耢x{eËJ¸ûb܌¿òúsc½±|û$$‰Áˆ·ë©hX¸krÌf¹nqyƒstŽÂÞSv3.•¥³ :ÉìHψ½N¬rîaðŽÒxæÅxv½6IËÏ}qïñÛ¦@f_Ì€Ná ÒT%VºÈ$‚ì˽Ù" ]Þ=@M@C¯§¿ÖJðŸq”Š§½¶î¬Jõ ¸ÅQý)ÏivˀÌD70Ân£ZÁ".Gy9¼À°yGʳû‹‘Î2ꦐ}*Õ"@7©BCŒJy}uŒ€ßv%Oå ÕÏÍ¡¨â©Íçœ0R>Á†{zÅããÌ)%N„0[}Óë#`«Ÿtòxþl*åt¬†­ ḇp˂ ´UùwÌ0 YnÌ$%ڀ±g<À—ÁœÇú)ÚiK0‚!›éba<»rÎNÓ\d.dùïb ^ʪWaÀÒðF¬²H•èM2u×kn,X1+«ϧšF€z½Ád´~ZÈVxöš•9üÞ\òŽÕՊ“â§T[²ÉQãE&_û¤8ßq·Øfˆ0_?œCëmç’èßJ(²=KV¾£,OaߛWÌÈc®€@¯°â ¹Eeíå{£‡#NÒfpxäa@Åyúbd‡öÔ ±Wê6Ç'2µ407¥ è‡o>ÖƘir4#Ðë€nÝ« ‡† +Gðæý·Ž’ÚÞ|Õ`ÿ¸0iï©Ïý´Òc›ŠFýU÷°b1¨ën‰’†Ù]jqޗîҀ̤£ô*Ökhâ®×GÉÄ }‰Œ¶?ýeô¯Wz—¼±øŒï)?XÃÌOXÈ4Ž}o붝4tÛD‹¤Æ4‘9‹þÞ¢W¢tљÍ1áи<(£—ýZ|_ÎÙK M̛ XQOŸj þr âuS´>Nú–ôOWœæ’Ðà`5¬6=†ãFÈÏOùޒx9nI8†²°f‘|è¤@fµÍàL/€¨v­càäÍöõâ鶭y»¿!Æɼå;u:=áçᔢhõLJ©ۆý© Æ Á`• BBþ˜béD ô®ä˜OQQûäž°Ì™…7à]ùHÉq s0¡0>^šÇ÷]²­Ô*¯‰Q—AcË¡u-Óã[RºÄNBÁ֛'eÁ…ǨÞD@ "(€„Eÿ} +þŸQÀ:ÃLU`‘ú³Öš%{)u¥‚}Öó&T¹rKˆ£¶;”f÷PZE"½ž&E_‘(Ó璾s} oÚZ¯ føe‰ˆÇýUùuj5è9±£X³ÑËñÿº,ŒlÕFéq,T/O—ÍÜ÷äB‡³úr°«EOy%Ðé¯DVÃÑŽ‘ôÙ9|;&2Ìêù’²ÏöÚÈ_KbMFÎ~Ï£xŠäîíI¬ÖCÌóp Ñ/áC€L¨„AÂÄø&pPG3Ã<Ú°f—B½•­Í ¨—“1•@]˜¼€`ì¥WHŒWOrÅ&1 jœO!œÃ‡ê데lÿ;vÃáèC”‡»‘t²úCªT–¶ë‚(89.Ëeë 2ûž&æ ¯‚TSÓ46Ôüß1/Mpÿë¬חqe֍/ÌÞ=^raµœÏ‘QYߜ_Koã6!ÿ¬l£1ÕNB'ëØ°K~;*ÆȸÝ¡BÈ*^^ò‹Ã8 ÍC:]Ò¾"ž­!?dÒj"_‡ú ¨»™ó‰øp÷ÅgûÛÄ[¥̈+ ªé£GäÏrN€£Rƒµ!F$´‘£8Ú»qÞÿ‰ä}GžšµÑ«Tð\4д‚Œï/Æß|2ÕCH¼äžä J>û) ì«Á¢Ÿ(&ÞþÓÐÇ©BÑÍ,Õ”fÂPØ2j¯;îÖwL:/Lˁõ\”˜„ònrÃB9…s}ˆz¿ÿ1[ëüz+ *aE¬÷à9ɟÐŵ¡é”7è£Ë´mB:̂ÞÝ1צêþ’*l‹ŒÊ¶\p0ÐYH]ÒêBJ¢‡ªB1%ד÷ çÇ¢Åöo"¨3ßé0i?Äd»%z@ÌD-–aR!‘ACс +ÛÀdª˜Öˆ™ðêó» +=‹òX £ó„ÂLæGöp,Ó7ê_2¦,Ñs†P\N¶,Oªàœ[ ÁœäC0UΑŠ|Oàf7•ÜTo¥ŽhË ÃÅò!à3zyÕOyì½P¶aÓ°!ß'Ô½þònYZ´}öžþ¾ä”¯Ë¤¬@wñ…ö¡Ù!“ +Ù¯–kdB,üìÅÖôbT:þæøàÓ3ÜaïO7žqâLŒäô¢ë³ véM_“0Ó¼©½£Ò¡-¥ÖÐ,š¡ÚMËÑ×´Jì.•…é ¬%+?6…6ñ“x=IO ó™ g±zk¾i¤doà!“à¹?îYþၫ©(õƒKkéßMRZ̟̑‰ž§"—οÅɓLK˜Àa%Â4¸ýéÇÇJoEüü-B`Oœ7C)Ôõ¤lÓqcž,È|ulÍÁÿ{å-z#$¹ç›O + #$\Ë×®~NŠ'Vzçssû¯–&eQ¹–Ýû‹Ðñödm£^‘ ¦P¢"­áÐÁEŽ¾¢ù 2<Åey²– + ŠÃ¼MX›aYaròëÒ¢­Üìža|¦¡tzû|þ?uUÅuqïîScKô‘ÖÖ»Ëw³åÔ+–àÖR!IJþ»ÌäòA†Oõ›f¡HÝGÚOeê‰ËB‘Zø‘¹Ä[ sh2ió²ýÂˋ)؀˜,ä!´ú`•(›©&Ö÷Ê©9 ¯­!KY;1Å9ᨴœ8Pu¬™ïvÌ°Ö úð÷ä6ä°Cñc¸°e‹¢jaÊ=±%``«š‚I«+¹Ú⪞u@øe 0ºÕáë™êaÜ÷âiYÄúÅ “~d~ŽýвaßW—t§G¤®—ªbˆ¨p%/ËeB'õL×q#¶Þg´N^éŒFÔNÙDþå¡!DùWZ[ƒÚSh +c3Å'…Ü|òÓ²§°¨%ª³‹(÷Ýõ°E2!<’–C|±…8E™À{šô%kÉÿ Œ§“¢üQ•J‡—fA Cé“Ù:Hp¢€ÅŠÄ岓†»“ï`ù…—L…ŒH,«È;îËQQø–_Y¯VhÎfOè¬Ò ÖºC*§Ûý´s`2ŸìQ?ùŽ)=±ï­X"£ìujD® ¿ ‰ÏHÇ:kEȁA˜–ΐ¼šžòŦM*àzÚ}Z\«¿GfJ¶[ 3MþCu«ù¾‡ã†ƒÿËkÝ`&ìÊên]k4¬&YF&ÖÅØD t=ZÈÎIW§Øu®aªíbÊë96Gç e`ðlè l Ýmp؄ð×k¶÷Z¡YÖ QÆ©ïzƀ;ü»i÷¥MÓÔF´„1…”’0&Q u“ÈX×õ~4«f.¼a#%þKtvÏ{óì‰V€Ûôôsيƒ @‡iýÛEFrÒ×Tá 8xsæ­ñžwÈdp‚WeDB¾c<'à¯0ו»ÎFF̌³ qOI!˨ Ì +›fìÛ Èzü×âèSJ¤eåfÈEšÙi‹Ü-w.X{‘®j´ø<$î Ôä£kL`ò!ð¹çæ}X¿BZ¢«Üòß °¨Ýí$( "‘Œø¡+äÔG¨Iš7ˆôÿUƒÕ»cZ+œëµ>âDãͯPbõº +2På2å`¡=Š³‘ËLO†Â\‹^,ÐÆê‰ñT ô$ï8ÇM4:\ܪ¾ f¦Cäyü5Ó͏>] nðš 45ß_ÙØHdžO9ëïq ܔ‚Dû11aùÍ-/ʀJ¶-ÝÙ$%áö¥ƒ¦„(>«wE¥ÁÉÆù*@´É¡*Ä3q䌖­Õ²ò©LYi˜Œô2Ȭœ®ÂVpr¨£*5nv(âI³nñ5‹_.!Ý߆ArÃX«Ñ³mñA¡ +Ùàuf™/€8J„ …eƒ$¬5Òfz‰Á=ҍÿY›’Ômî˜É® +}¯ç1=­ ç7¦È™wÆ@ö£¸˜l¯—•°M]ÐYX2r¬SK=^¿>€wÅqs¬œà>¿DY³‡ 0þa;ê¶a|p¤¯ÆÀ†9?sæ¿@ÍzïK@¦gÆç‹ ˆUô+D `ƒæwÐÖùÜT¹œ¥¦JÓ7Q„7ú„ ëô(L<î"•yOèÔ7ÛÖå› ½rem™¤ÖæÊ_°|œ:ô‹€t¬ªü´5©þ I%9žÑL–inдüDÓy»ã8ü72[°ø3jC|mÌ."ÖE[çÈ䈈ËhxøéHÍzëà@yõz³*=Þ­›ä‚”«è|]d›ÐçÓBA›ïVÏ@»zE̪WºN‘&ˆãTOÇ#Bá4bL/¹“ÀFüwæ~쎙‰HKøq͍M°óN~ÿc†€hâ§d¸Àb܋îŽø–e'ZõÁ„PO|Œþ¦C­:Rjr‰.š½½oÿåÇU¿îNš¢VŸ;žÄ͉Z‹ˆ¢ÃG,àõKÒ!yIA«$Ö5h¸Ãú·*\qϓÀè²1Bm{9œ—%’/téò°ˆríÍm CÏÀÆjdÆà>òÄHgÄ"G ü&Þ\ÿ‡¼|I^,Ý|9¢@6ëèža'HƳ<ÚzÕ§nŸð…½àçD°*ïJ·ÿÉdKÏ}h4†GÊ<Èë~L€wa¥á÷¿e«ÖìlµÐ?`1g|¤r õˆ%¥Íy¬U¶¨!šª—Y-$ÍÎAqâÉñ¥q”iƒý[hïôaÊí¡a»û’Õië*B×Íü5WûZÞÿAK\îòºké y9'G€÷Ž©º² 4(ßd¨ôJÔi“+¿Â ‘R$0s[o9#&—øÝÐ%³¼ÀâúîD#›5]A¯¼¢œŽ<ñÙ’r54 *ƒ·tèi+M¿È’0¦iÐbÈ]0҈ŽÄÚ*ðI ;‰KÐ2kÊÅFì¯*¦¹Œ¯>¶`ඏ»»Zæ‚øü*N~œdNšüၨ¸Ù"Ì0̞Ȟ2½1¦G¤(| ډáÄtµì™ð ßLü–…¿>ÔxÉ£ÔìÇ“) +¿lp¤€‘IT +¢Û@A¼¨p0>=ÜsðæÃ8 ‡×šÒjÿ&+YPhn&~ ª +&H}KChû²5†)N JGK…¤™”8ÜAïqÂ"b*RhÑ{Ö·A;G¶ièÒ…\½‚ܝ,%¿Ñ9¶ïís‹\•‘Ðz[­ ‘©ü,døRØS «¬Øòä·xðº}0¢þjùØmšÈö…ž×ˆ1C#êù2"ZðE-%WÙ?Oi‚à Fa¦FÒX¾àA 'Ù!w㌴€†:öVÚAAdWèDVB",B7ýㄠ+¹@Ù ¥ÕÂÞwÃpEBÖu€WÀ-"ž3Æ¢u„ºìh9µ/Ž…¬© ¹wëí¦­ ‘UÄ=çòÝ`¬ÿ<(|Íۂ8E³òðÀóóî‡9Œ ö€,Žp“§ê2²í§âŠÐ1CëØUpÌAt!øÈMùúð(gY¯ËðZ©àyªo‘1v ¦®{gáÁ§øIÑæOß.ô4‹Ï ÍþŠ¥ŽTõýo&(㖁H•ÛñòH­u`ÇڔEÿ„Dÿ×I”‡Íp¹?1¤ä¯˜!æ‹2”è¡‘¬ô⯍ÛÎ<±è«¦$|ïãç6MÛÀrmÿ@Š ½‡^à—k‰€4æõŠ|à ©D³M\oÌîSîN²)ÔE…<Ô#eq>m +¯îHbçr ôÁu„€Þϟy…ïtQ›­u©C0ô^7³?]IAàHrÔðJLÖˆ‰£Hµ`f0­§(}‡DÅÚە4?2$<_–ºŽðòsë[ .–ed.Hoêä†r‰¨0#´ÔoáÄÜëJIñh;Òas8¤æóJxfˆS&°1‡”ÚÀÎøH´.]öQé\¢çoéB0{y$W-SnU”°;, &ÕK­Ã@pö0˨Ø ¨”׳,¨±b•qð|®úCÓÇ«ôËäEÜôŒB·¤Åú„E퐽"œbô'Ä +…½úX°²¬J¶8‹ A‚¢êˆ?ÊD˜Ú·Be6¥hT§¿°*5³WöèFzÐvyÀlRø[PÍÇÒ*¿‡–Õ±%Þà +þfHCùlZçË#£þdNñPy¶ÖÁâ nÃ}DáÖ±%²YMº’Oê(…_WZRGRæH8€2ÀìÀ6Êâ@ÛŸÆX%4ΌãzS ËêoÝ9ì×@®8Üÿp ®þ¼„’ +eÿäÈ3 ý @³o À4gO’ Ÿ‘hñ>ÇÉO? âŃ[Ë°$¢œ½cÎ5 NM¢ÔQÏxœ&+ ýmØÆùŠI³UP⧍?›^¢vKzg÷æ¥jŒ<ûèÙ¯'Ç°w6†¦\>CPÛ‡³¡®©ÌVí‰tr`êþsd–a¦*ºm©Ÿó-÷[_2ÁúZ®ìo:R?å”Æñ Dˆ`Ç¥¡%E"ÙpûØåp}×òð‰>#ÖK¾þ WZkc¯ä|H +_²¿ŸÆk˜=ëBB!C\['årÒœ\þý¼=!DÑâ+…Ú¯®Þ'î…ü<¥ÒÚxΫPŧpƒ„¬.>à£éÇ~p„¢ta^ ÷$EÿꠋeÁ#ðÍìÉ Ò¡T«PqXCò® ¢%4Ùe%:ë,i¹hPe…¹Ôœƒ¨#øµü 0‚'Xªv+׏múTŸL€ßÊ&njՆðnÉ´ €_aL½ÂOÉÄPš-òúo¿‘$ üZàý&5Ÿ‚ׂò'ʜZžŠ‡sƒB›l®ÛÐûñ¨šÍZìÓV(”ڐ†îÖMlª$DàÏ5[ª]cÝ'eK$…ºV+H Ê3>VÛÁƒ-•^éj›à.Z~AD^{ '©jŒ-Ԗ`/$§„óDh®Á i2wî+ܗfÇF‹ÿï[¨Y8Ëúüïº*Q׀WÊ3s¨ÙҐyT˜À†E˜¥õ3‹`}1ì‚úƒY€ô©VZ†Þ¤ò +™“pFºµæm³™Mäᤖóíºóï6Þ ދä¶î³ùqug>­ +% ¼ŽêPníF·U¿Žª¶Ò̂‡Ÿ5½²´Qó#̬Ýá]p襺Éb)'èW\2ö²O‰Þ¾H2ŸoȨ…‚óÔåNYí(ºÔIŠ +ûm2Ê_f(-Y¹&ñÓàSD³e×üžÙÂ-UCEšÙ¿‘»NþN'¥Ñœˆª\q¨(ژ¹&x½ŸÉíYÒ6Ø©¿9ʱ#@ªìãL^FÛ>¼®¬ ßðhÁÖåjˆ˜$Dí‰˳·1…ä²ïò%Žäƒ‡ÝÝ9‰7W.Ÿ¿¤&{elpírHÃæ†:ò$3 =-²%‰p«oÃâwAu,õѾìÈÀ¡N=¿—ÂŽXÓH'^©´þnb{¶ “fêø˜2A”ø Ń_Ê޸ظøpwO“Ž]ÊSðå~%糊cû„š(î#ÊìtMêDJ惙-ðññÜ5SØ$wàP¿²_o)£,ˆ³±å+ +=WZ}ƒbÄ-øµ©ˆ;©#•Ö6ŠT3 ëS¯r0„œãð# ´Yô|Ž%€äæ¼àeš÷ùÁŒîúOüþHO¾òn|ŠbPõDûÜÃ*ù/ÑP)át%s%0ŠDþàäþá' -ÆùޗeЎ»q>‘⣓œÛª#pñío;“§(AèÖ +º­pBXq>¸rºùý° qɕ: ¢S«´W+€]…m”qI]¤ì{Êa®–J{9[6ËkʃmCjÈS"fBÐY'Ó±vòVøÖl¾NR±nÄùXîh4zËÙ{8[Uø "C^8(K7]ÀvÈ/":ÂþÖ!#Êš!(˜YJ^ÉÒ§½íq1ýx*Ž}ÊãiûØf‘ç1ÏeƒºKldÔÒ,3À‘Þ ôååhýo˜2›¨± “ý‘ÿ,õ-`¨k6Ç f`Á˜µ]ɬk[}öëBÑ!žÅ-œ¸»#ÿ½ç˜{™C ‚\ÃÐ ‚m‹ú]?]1=c§¯²K…_e_HPTNnÝ%Áf vP'”°è¾”©ïƒŸœåÎ–e£ q*·f" ->…@ æߕ)ë ¦Þtøj¶ð˜ÿ“­wã’>-PµÄzˆO4ÞæãFÎ;$Þ=HK²¢×—€%©Úß ;–œm'#}³Gˆ=·éR±8 oØ"Џi§$àåÝ 2)Öt';a bØñ—/îÞ_qá•þØ-=ô|°J–v h®uHwÍGy #HÉ&ˤ޶(¿úŸJÉ?²K¬¨ ÜÈDÉi£Ò·;jµ1¹+£û!¦î<yšÆ*nЍ}!ËÛ4ç.){æå å¥÷4_°ŒîŸ +)E‘)_L¹}ý‘ GÎ8+ÛZ!&.’_ߚ:QEé- q|_”Ÿ +‹ë– +QÔv0Žæ äe©[t†í5qW®+J…&ExªéoF>­NdO¯€§2ÓXLÄË,„"6±áÝ<œŒÒvxi–QpÔ);¤ß.͚—ŸóhxüzIà—ù5JþœIŠ"ûw g`ýüCü} nµ8T'Í(§ƒ +:µtÄ BŒ—„^TÖ¦hÞà„§ÅH¡;dFyç͍¯²0L‚±xn`sn¨PÄNÆ3S< Mßڅ~=þ”„lñxXDZ{wVÜWtë×Å.ÛâbµAŠ§à°M&T¾$ogòæeÌ_ԕ£í«f”xŸê)H…ÎìÉ(‰ÀÝètјÖù$~ì?~;L0NNp©Â D’`!½È®ÑÚÄÌâê…-´K‚N…íâwôÌ &iú»Ú:‡@ÄpN–¸ŠNʯ ëK‘)!ÓzØ*Ý£¦Û`ƒ×®õÅR`ˆšÈʚ‘Î^’Æþq#ï9ÊçsŒÃž %Å aç°Npž§„àñN÷üï@³3µIó…:òÑå‚8Ç`Pš÷•Jý6L/ôb½§ÉTe'­,?Yú™o¯®—Ñžmì2{ƒ\ìH@…EUa©’0ø)½“B_HьÞß·ŒD¯á«lÖèó΍ȓ>dípžúXR½!CÜpñØÐIHN)¢AÊ÷RßRæ ç)—Ɛ e {ëµá,äM&wɨ㠥¹kž«M}‡¶/b2mâìl©{lð¿æݳGª«(Êèâ3ðWæ#]kA2ò ”îmXo¸¼=tl;&°«MµpöãP²ðOuÊEì`­CüBÒà}`B3°Ž3Z gžî;œr¼($HϦù‚¦kî®…)A Ò§{D6ÿˆœb(ìϹcHõ…õE=PIW +ÁÊnNj:Ó1Ï9XvÚªÏ`"…SAL§G§r8©±”Rí ‡žw4>éÔ<~omBõ?õ"€Õ† öŠO£€;iö8„3\BXÛDý‡FÅÐ5Ò8LLø¹wš|¼ÀÞY5T|Ã6e_j›+]–™(4§³½·£ŽÔ¶¤Ôõ¾dºwÃ(¾ûl")»à¤Ð úì~ÓôSؓF‘¢„EÂæÑ·iô +ÿI–Gãn˜ÑQBØáå`âÇw½ž[Féû‹ë"Ð#P?lËl¦ §_”|»›ø²wžtÛ +×F_7ûݘÀ® ¼4¬¢o¤À¿ã$sžrw,N;W$9\ÌVP©ˆÔF…óf™¬F+j™tD±7͇|ñê¿$/ì$£Wí1”‰‰Áå‹iÑìÃø#Šþùí@ÛÍi“Êê‚8#bÅËEâ¡èagÝlžUÙ}VR°­8ïÎ¤ÀúÉãë5XÉq…,ˆÂü[®{·öɁ†ŸE²ôò𠊾[‚÷[9š£×` ¶x‰Þà…Î ’ä":ÿbaõ˜þ¸ºj sLûµ´]e@{Ä B‘=ÈOŽÜ°o+wõÍýžOP6æŒT®£óÆ^Æ£³TÌm€0GˆIW@bìFáò +ÞÀÃçþgXŽ:€[€«÷}P;ïÝÇi‰D7©˜¤%þƒ*QÚ™ì®è¹Ü¸yª8â´ZëÙêgðn6xä¦v=¾7t„®å‘b¥c’0m „ЃXæXjDLnS0PKÝpV„GÏ/Á–‰Ûœ}IÌ»•0òDÛY.WÉ¢Ó®NÉ_7󆾟Ñ70Âúkš*%I˜}2ûݳï€ä`O"äH‚á+Œ!÷hÁAÅ]rFFtªÜ®ÅÙ9¢ºÉ0T\+2,ªƒ’ÚÊøc韊k[œq—èÇêõ!Ítý¶³^kŒkæå! «R x¶mÁ_€âäÆtè0ã}$ŠOVïM3û_·‹[o}17‚`S¨£Ò†’ƒ¬Pèæ/ªK ö'U,Cs̘%À?ººœóE´`Œc~©‡¨:öâÎQƒ”¸N dé- 00?\cpSîd|ÐnJ}0±´+ܸ;´«ÂÞv\ÁŽñ÷T®¥K—pT¤2'Z¹ôGš k„8‰Ö/;*ù€#¸YÒ©i‚ÛñeýC/NYFüpm&È}ÕåžsFh‘¦Ée*hÇXr¨Û;ÑàƒöàeÒ$ؤy±V*rØ¿µ¯‹T‰¤Ó-/±ŠŠÔçßÆÅD#'ä¼·ǒî%7ÞÄ݄²(»y^ˆ‚rW©Œ'–Ó ‰«ÝÄ>KF.dç`X‚ +DŸ|lϱUóp§Gñ”I­Üµ1ÞóÙy‘æÂB¸b[{ùz¦À ˆQ‡Ñ6\N~ðr[rÆc%£&š$=“òDc²ÒŽðd&ñì¢aG+ RÓÅÄu½¬ò?ê÷= “•ëŒË™ÄD¼D^± +f&<¹Èaµ]>“æеÐ4¾‹Ú„9u™¬/Í}bûe_$wF¨É‡ê€1Y=ª¼ÝëÝ=IMŸzšJ‹ p›j©Ã°Sç ¾íþø̈́ï +Ž8Ä? ǦILÖû;” P'™à±H»Sö½íÜ"xŽÏãRvãøv <òî1’P¥^ž#€Pê"äÞàJ8dÄÁ’s>ìð >hÒ AÈ>@G…Å „å”)ÐØ+”uS ˜¹4BÂÖq2"=Ñј¢Üƒ#¢ãvÖV[•RsyÆù1^Ó^íY’ËŸµÎk rU —Ȫd”(Æh:%¤[F‰»Y[“uÎ_Ï·Ë\Çç4RÜV€B}Ü{ˆ„! +PŽg ViCbá©âz»Eâ…† ðu89uŦ ]÷r¦(â©.QQMÁ›ˆ[*T=<næJȱ‚Žþq—à +×%è$fHÈ̜¢Y(((AˆœŠ¡ñ?7vaIš©ªª›sNà“X5âó5–#X¥a¯WŽk0öœhgqpSxÁÁ}ì7 ™«ïÄÐn—ì2ý©w‚ëW¢t«Õd~iÈcúI«Á6`¥•zŽøGþ•ðR?@ùEX)–K ‚ Ÿ}Ðîx6œä%^sIX‰q/2p³»Â¹ê]»uóùÇJXÓ÷6žßþ²uÇ,_:"‚cÔ·¨ßÐP‹ SuÓ‡‹ß²è¶S +:mÆtG`KØ]„• #ø9¡ôkç3£²NœjœXrë ŸÛC?¯Zz>m: +Ür,¶Ä®±aõ®âe°dGÈò¤½A]CTÞޒÆ4¢Ôã€&!ÿu”ØÞBÇÚK9ƒ3Q ¨R y¯Ò×&ÚÚ_zlŽvü„"Œ¿,Ù?c + )û?„æ$PÿU : '|º©Û 0€!¬%oÄ' Eî.п1¾#¼ù2ïÙ'Ÿ±Ÿ¶ÎìûéÐ> +àq˜AeÖ÷«·÷u„´äta°c‹Ï5u¼Ÿ±àڇ&£1§ø,0Ú ÖJDÑ;ï©p8ϧHpœÄ?—ÑpJ'ǎΠù`³Eéšÿª~µg™nÇN®Îgq]¿Iè +×àñyK¥e ÞÄ|Ì0/?%Šס%Ë+òt°ó<âáÇ7x;:ÊÕAŽW،Ž€niwG´c-z¹sænkÌBv»Ò¥! £n=–ü´š0àӜp9*«"ñpÝZGÕþ@#ÂÕ`½©0¨OûÜ öŸ iÂfdìÐEõ ·¥â[0Yµ‚àAU¹@ل-“ ¬Îyâl¯îF¹Ë~C…ùþõ›…àj8¹w~vï/¥dÐDaðÉwü±+ÜiÍF-ÒZô“[ªŒ¥±£[Ü-j×xyg9iì‡0•~¾7åÂNJ›;ýE—Œ¨Š’‚Y˜Âš»Aà¥0`þ>¶0ÈÍåXǃÝn V $ÿT;р؇o XaEN <šE…3£c g8â(¹ `n°3°MLWHINë¢CP¬@ž»(Ý´p?vŽêý,îhGMÆȅï=8Wy~áʽî9@nƒt«Ì»"cù÷e¸Ï³ÊÎo)…òš…ËëÒàUë´Æ‰•¾j§¬¶ Êò¸o]ò›»ÿKp¶§ +ƒÀ&Þ׀sã*agoidUO°’ZVé&nÖ;X$™×Ëíà“0$”8äŒmé¬ÀÖlìLº´„ò?ÅÔa ‹¿16ˆžTl2ó[»Åì<Æí¥Øÿ‚ Új¸iAˆ“C^EºÎb5$†Æ‚ÙÖ0ä*Þ¾Dàõûœ™èâßaÚµ!ÅÙ0ÄÄИAðãxV#>U SÚ;Jo1í4ž™Æ12¿"(DZs¥ìRK“5ö÷¿ I}þ#°òDÄ3„OZMSߔ»Kˆ¹)æH;ÿ™-!¬ˆSè{»ÈÌ¿JürjGÓH]3^ߘHl Âô\b‚ +~wM*‹D!PøñÎh"qPìÖæz—·8e`Ͷ̣3!Œ‘ó®Ê3oJ€=(仧ÂVtîÀ¹Xw„À,ìG´È*²VȱBLþšë!} +SÑa §zùՐC•!·$åRpîLŽ£×¯äoŸþ'–¯e 9°~zþB)—»Ú„Õ¥„Ý-R +¦šxØIs4¥ú,¿¦|³:F¯C2:¢¡ñÁcW“œ!ý.„é÷þËîÉJ;ºÔÀÀäã¢*‰º”_ÐrÍÔ(¹›æäí ~:¶Ž|¿fñ–,¯«ˆÿ•‘ë˜ùBÍR|GÀyqöx{Pô½ÝDŸØ÷\ Yö—–Š>•`U½§·‚`{Ïr‹É2PJ™±„ú›BêúF*V¿OX'OÚ¶ôÄÝ7º ppqÖt i‚Š€\šãn¦¦gx„}ŽgÖêþ´"…Þ¥fÛ,SDš›í̝:î‡ÀñHY]ЛݾàÅ»­\rĂMÊZPDI7`EBëQX_#p¼ qy,{üqã´,`’¡@–)kÃÿ“AãM3'¦kÒ;„„Ëš’©¸a¨C5ž”<`Èqx?&Ʋ`tâæ7ÔÒ X&®œyC7g ÍûQõh!CI ÒApR¡­]o”y3¿Uғ͐ìP0ñ_„šaÅE ÐŽßU#öûU(Êr\Vµـ^ô¯lC +U$\pá†Z tße5w7šïː`Év jFI˜šä²¨ÄsŽíQÏ6|P¾ :¤1ë¿À ˜Ü|áÎ*°Æ*F›hÑøMŒ?ãdËjs%º4C‰¶‡¡Pc´ +‚…èê†tÎÄ ù܄ýïsyK!£ª8߉§¬Ó«üxÒ#+GÝë:"³‹VˆõgóœS@rE„€]f#Ž„Av¥´2²‘÷äÅo>†ò‚‰çÀ3ðᓶ*ÐGRp…øØvVæ‡XÐuþHʗ`>° hT „Nþ3ò“x°®š22IeánßV¿ˆ?¨ó[|TÆ +'ß,ÊæÀð ` +ín½¡ÊM£Ê¸áNCÝßÜsÝ-ÚÂ1znؚô¯-¤§QH©Æ}ëÔÉ䌤Qddßênì¦<ΆÆÎCA„ÐûÍ£ðœáiiâ/I©]ƒC8aÞ4ÐüðFW{yD>ÃÖøXÇx›>þ˜eq½Á +ÝÖuǯ +Wë/õ˜…xæÕÁø´&Ôn“Ö0gDžRWª·xíÜ­îGv?äãLæ4 ¼ÅÕÑ ‡Ã>mi±òPu J_ë*‘¢‚ ÏDßôÀ™ÑzŸý¤Uw¡<ÉÎ~Šûìfp”6 3]$´Ò©LN+ÅÓ±\¥øÑôfönÀ¢!¹ÔÁðÏ­û“ mJ:àù<[ӃûŠé°>ª‚§ɉ'_LfðÔ8?Ò•Üj>¬ Ifp‘ÐÒB#ü‚ò¸Äæ²dœ‘E–†] ­F.V¬N²tÝ×¾ÿ%f—N +ºgržü‹$˜;áܸH*¤ ˆ'ì}?a-ÏP’Øu m…¨Y½œ›i¡-ªK)’ö¸1c× â•œÝ õ¹ŸhPœ yšýÉpŽÏ”,YM|Ck»¾ª„Á!-X³­°6Aú„ܺœ8ŠÄiû’7šÀ ~ÃÆ3$U<Èÿæ¾¢0Ôñàm¯¢V…žékìŒO‰Z¡W0±²g쇇ðòä0Ò9s=wGєOÀõöˆß+¦ž®è¹Ç!fOÛÆNµßµÑÝøĉ+0™å!L±üІ¼ +oぁ0Düêú‹1Aü'Uá‹[C„F«‚Ò|$'Y%ÔAok͘«AŽÉn·/³[¦pEW‘J"‚Â_±),ë–í§ÑÀ/‹vrZ?r7ÏÑX‘/:$úch+Äd3.Ï"á/ß(ÚO-‡MçBØêÍ]%ŽÛê  5;/P•Ì~ú_Út ÐÂÐñLoÏ{S b¥Ÿê‘pLº"·Ú+©*¸ ‹à_|€ö”æîºÍ..úEa£¾­µˆ“¼\î\¾"ê׈SŽÙŒ"+I ƒÁ‹óÀÛ(`ÝtBi¯Öªœ®¸Â h¨¼Ç'Í6xýp­£6u8I,ò;–8x8¼.SÒ[%°€øEçÜó#«í/×a‘Ñ!n@ŽZ²Ç5 –ÅoUò40Ï¥m¦ÀØÏA¯¯ûU’ðý¡Þ˜ÍÛÏÆ ¹ÊFè8~ +|¯ÀNB?s  >a–“ìp² NÌæ]wc$H$„+Ds@}Ø,+(²Èc-˜“XpËS5\æQÑHð/O±C[2¦ 0î0{QÚEž¯x°a©¬TAš=™} +¡m,‚=`¶árX- :”Êêè©‹ä—N¸Eêý^Z‚MSúbh?åH±º51PƒVITi;£CbÿA°2€h©E¢Ë탮c+¤÷ŠÊI£_ÁóÜxÅÇ40üSTm¯²éc¨`”³zÆi*º6J¿ ‚SՆ)_ØÏÒ G“—t³™)ˆhŒ— šh¡;°`ú2#âÓÍBT/ÚTÈ$î0Ë65•}πS ñ_Ï^þ)æ— +D$l¥ÂÊÄʄ9ŽÔ 8¬ÞoOq/¥a/Z ‰å<ÐǦ=F t>ýlŸ?‘Š üè{_"MÆÔ¼2"õÜWòb°cD‹Ô»(ÊÛ¦ÑRÿ°vGOdn•w麼ÀQ{ÎÊíN)Åxà–a¥·“ó–+~¯ùºìëÅy†X¨GÝ(Àž—Ð kŒÞâ©;çגè5a£·t(F=ljšáV&šìådëeQÆÀ]äé~ÉójÖʤHÖ\5p÷/÷ôy=ïYåÒI}ÂÅ»­ê_óæÔå«^]–wŸÿC]î;#]‰)„ýjT}¢Rë°¬ÞK gµþŠ¨XâDâ$ÖÔ* `M‹V”w—`I¥Fgk¹5ÑY“õÔ!:óYVϑaz狝W&¦7>]$>SžWDŽŸàÔK¾b÷šd‰š”¼8jèècjaáî³Pž¸ôóåk¼.nТù)1y6d¯4LA!d +€y!mræ¦Ћ/t[g]É㌋p +š4Ì6MY!䀂buãé^}é;éN¨ó_A¤t°õ)ÆPh薷|ÎËg#ýÖ£a wÔ>B -Ž†ÿGŽíéÍÒYt`BÒwDG‚GuříÈE.]Qaàp;”7¬Ú†¶G3iÖ9<èHÉç)$ä)Ô­•±G@±V/vÉǐZHᮏ³¡csÃ¥£®ø Œbc¬vkò¢0Iž™!wóp±à=8ì/ÓùÌvÄBŒŒ‰a(çòú†Ý¤/„œ€ðòQD[ÈÈpg³¢$kzü¤vñäךç䦭‘:-®fL4LúŒ²û¥!F +‘KhA6*õÃàײE$ÉÆmªñrá –#FIk‰C”l¼K%ûþnÉès^pzßC)y¢uÿŸˆøßyùf‘¢øI›DÃw¿J*cúX@E˜ÒüçckòE!WF†ƒùeê¼/×ÅG{.°9eíZéó´#£ƒƒ%X—ÌÒÅð謂>oQäLj î/¢V’ó”柿O]ؼÎݚ]Í1­ŸôT„6¼ç bqßæ 2ZÉïè¹µ€~×Y9øu涐s}žX›R_çùÓô<=Q¾4NĜ‹’ºX“N†IQ*8 @{ä?swÏ©•y"¡‘ ÂS 󙺇$œ'À†¥mìég Œ~IëôÑÿøþ%²"C¼,áàYú‹°¢,¾³Á.¯™l—ì +ŠÕٔ\î”KF°CY¬“?×O÷ñj=Xñw…#"éÈ#êó>ÇÏ]â,†B¯9ˆáøÌê1ë9Ñ>¤Ì–%ŽÑU¼Ök~ZB>]݋Dáۘg nB‡>týʀtÖ҉ØîùÿòņÞÓ7”RNú¶V$¯§« ± >¶jµWÛ²Çüö{»ý&ކVçÌA¢¤lvèkŒäh©½ +Iàws°Å1…å9¡p‹ÓQk 1T˜´·*PˆþèºùWr»”4‘NcGîwX4{#f·½r@ÀV,@Ž„¶6™Ÿ!@r§q”6˜„}”p&ô;ahµôVnÍP«cðéQŸ$ácBï€rüøm?¥9Ê8Kn8d O$xa…™Ó2¶oL€gðmJã!«.Tqd6ž¯HÆu ÂÔ&•”âíÈá=wt}†¡%X…mƒÿ¤ÁÞø×g_³2AàµS𪁩[fn É|ð¡$åt:$úÙ9÷#òíÁa‚ÌK×Ë÷ú堒†–¹júbþH¨;«íÐäq }0L€Ã.-2ÌGœöPf¢_ÀPC¬zhÛaÚ5 ÒTQdÅ¿ < än—Ž˜ +ô¯QúŸAsápðtÝX^ú?KÞê0ý+æ¸O:·®1Àíq}2kêµìsWŽvεyjñLd|¯¬”cú (pf×á€RÀœtšNäTČÏ$³;Òè¨[ü›þEñJú¹Ýxgô4üiþB˧÷ZÉH:ßWU*³É¡e¹ 'D:ý?A÷«³Tg-¾üú(êQPƒŠ@×/כ³%20”6ρ +ÒKi`Ü݂[ut\ø¿8üŠ]+¨DKµ[é ÛzZpêz!±æÉԓ¡x/òﭾ-ˆ‘̸GPí«<Úþ4È@,­J—p™Ï¿œÅÄ·R¢ghýbg¡ù¾)£Qd–úg :ÊcíʵþÒ¤¯ð·H*l´à¾ðˆ|P2ÍÜùÓ79ˆ >–5åýyG?*ªªí;wê²ùõ +=`W¨9³L*¶zŠÊ«z¨yܽ4Rp6K¥ÛF6z•9Ù)ö¦ÞÀJhBá…Â.»ÿ8íõG¹BžG>xÑÙ\nŸø½»æ˜Z%ì6å]®{\JCܸdÁ飰’ ÉÞ2t@qX’G¡õÃÚ²¦®Š6aÑÎ(T%„;U : +õ»q,ysƪ¡¬r%†…*ðOG!ÕQŸÁQ@¿·×Weÿ„Ö× T®,Íwb +¼qfù·Ïˆ9R2bm-RFðÇÖ6L÷5FáÌlœ¨÷‰N*¬F1Yþ&­˜VVŠôaã˜È7~Ú¢0l™ÒxˆUðI÷ö¦{la ¦nT¯E–l6—¦),Þˆµœ5EQ¨ó&¬0)Š¹{h¨„—@ܪ(ŠV؝t7Q~äG_%Å1èAÔÝ?Q„˜€­òPx’rJ +þÊÐ0Â%Epø¦;'f¢‘ÓîB›¸ +cüou(l˜º§¨Šó”‘ãgöEE¤'ÛÑ/¢H»˜/Q8 àj¿Ü¹(|(© ¾é¡¯s:à9˜+¹%÷ÈÃ@—G-.ߏdø?Lãµ5ÿZ›ÞLµ²þÄèzÐ7±±'L‡ 0¡HßÝG'Ì[òe™ Å"]g´–áFc…ÏœñBÄJ@‹äÝ>(¶cÁ­¤°>ó†(%’ PP‰ O$àFùÔA1ߊxìÔã P 0«°A1¤”nvýÁ (>ÄçG¯à—Ѷ,(à”Å#¶è‡ + +hE‡pV´Š‚¢òÖº†&oW£ Št‘ µÜ3$Ar]À0zr+ƒ¢¯¤¢°î>)Ÿò‡Ï/ˆE—ÙmEm»¿Rë½£~b#Øp(š—”é[ƒ÷‰o PÄ·´=RžÐ¡fØ碐‚”2C’‰*uO«OÌ>˜‰»×ò'Üغh‚?qc÷ÙþÄTqî'·úVÙO<•$ä2õššqýÄÓŠuès‰ËãÂy7@jtËdÙ3뿯ÕDîP9Y[K´¼Ç‰_A§Ô'°;ìXµÎõ„sLcERM€±ž®zK‘OLúœ‹2Šä“7 ñ né|sìšz´L|Ât¤Nxž˜ l¢7èÄîûDÓI 5ÉDöŸ¬ysHÕ͚ö„õE²¾ï}þdOœî9 ïZbrÅÆlsS/ÃW0 èás=q¯PF Da=¤¨8,ËíWÜ}›Ã"žú(_°tA¤ƒ¡Ó}ßችMŸ0²šzÐÔ£3â„}ªÄÇZCž° zBèñtÆk'ò0„ˆ'2²yM—_Åž(¾•ƒMM¹“l ÷Mßϧ‰b5d÷Óè¾çCµ*N0Hƒ?>RgP‰s"?\òMÈîᡃÿ‡s´΄Þ{mDñGX``wâÊPX’M–¹8Jš$Ë·ÄN•h¾³ÝD0¤‚£‘Uµÿ€ìDŠvâún{ð#©`)KQԊ;åó:‘²Cç„m óvŸ9ÉhˆuâÌFÞê„-ç>|Ùp+©ÓX)*:“g¨>ðS¹œ=XRÿ]ÅãDÜEY‰Æ Bˆ8'ϙ8‘a)¸šˆ>xè kt`N8°•sNDú‚Ãðôt”¹óù”ÃHN$/k9‘1¦´ˆˆTäRä'rS\7UkŽÆ 5µÑPœx£° :ÛJ'q¢‰ç“èË \Ã1ôKk›Æ§…ÚìÙÄ:c¹0ÁÅA7|áùº¤nâæWÉÔíf 7±`pœ˜¶˜Æ›P· œq<š i>4}¥¿c½$ČbDÊ%¢… ÑÛFIÔÍB¿På$Ž£¹¸ »dßHw7ñvP7!\ë‹t‰9ìÿ'Zdc•ŠxŠ‚‘ ,ÐY-Eá« K`CÎ&öCáËlâŒx«²‰^#C 6Ñ/@ú¾O&¥° ïcl"n#_饽i"ÀŽ­gÒêšÐ;aC\&,þAŒœö¸­‰¹ÞYÊfZp¡i/twXYG7"§¦ýqs&Çi1ìcÒ,;÷‘µg»Krš>!õƒÜŒ?&À á«ÊEšÂZ¢×NÄâQ²¿æóäw\—1£ ™ÍÄoeF4‘ªÍÙës¢f&Üzl±õzé`&ñšpÙ0a¦”Ÿ‰˜,ä²—ž‰kšF;Ümèýü4; \“Й¸’5dAŠˆ·›õ€¶t휙J 8!½c±âwUÅˆ7ð{ç2ªÀ΀Ñ2ÁÂÐ},£ø91‰ÿ@ý e‚{ΩQ‹^ÆdÂRh²ØLŒÐ»‘]> k¬¹‘‰CXhÂcN›ÈÄ4Ã{nd+d7 …f Èutÿè½ ÇB†“RT†ÙYºÍ(gï°9rH\ã) .aØڟ‰ÐÅĵ#‹ ֟ èȍ滛 aáF·‘¡˜ Ð¸*è˜tM$‚8b§“YF0L¨ÿ<%d¨Â0 +ڀ­=I0˜ðE+ßú~¿‰ðñ&–6œgk”—p‹7f.á5˜Ç/œüTÂû¢˜õP‚'ô*ø®…—¸Å‰öœ+¬·ähÈ?»ì‘ø%¦¿!íK€gBn˜ÍyºŠ:»DïBŠá& û-ÎʗP ++PJh!RC–PÃÉ>BÂ4¡¢á³Ž“b•nû&Æ/ôKô¼ä­¢¨§ÏÂ.Ñ2¤xÛÏ$Òï®Xv†Iò§;—8Èpsbó°Ìi .¡Å׌Â%x“.1â³DpÐá-CŠ4Û9ë–XtZp™ÂP§Xp¨JÄÁÁh_{ÌD6CÇilS°8f[¢Òb$HЖ°Rt䘛Ì–˜:øu )ñ—¬%š°V%òp',aˆeMˆk°Ä€ùÓ·HʲDý€b2>£r%l%˲Ɔ²d‰‘ XŠ@ÁÍ1À:BhŠÄ,¥TG f£ÌÙ4™gÔruúSR¦#¦ôЖ–"›Œ^7:&ÕPŸ¿›¾ÂÕý;Ba)”~"]ƒÌoe«BX6âÒX ‘îöF+‘àˆQhÒ@ñÏ;>ñLî‹Oè}O#ûÄÃKDç6Bö&t õPõâ Q>/‚Ý<¢±K]68ÁïsÐÕ øyKüÞPT?yûŠ`䅳U·© 8P§0Ö9-o³G”³ÿÊù€ÕC´ÙÄ£ChLjmҒjQÕáî¡­l*~ªÐAÓö°Jˆ(!ˆ`Þy¤¨uÕG™Ý +©›¶ ¥¹sF¸Œ8 pKPa¡®å飵Á*#Š›Á`Ááø{ vÎÌÁà8œèp٘À1F”[;PÈGÆ]„řځa›ÊCŸåRRQ…™¢ hؤÏ#¸‡{ðFXç8Db¯¹²íÎܧ¨,â*‘ÕŽ–,bÖÐ< Ö\¡ 5ÁN+˜¥§#Â[=%øEL% T럡Ù±8옆a½9|GÍ ›îýü~CíE؄ò'”èV‰œ2Ú +¶YŠÍ¬mF­öR¬x‚žS]ĒÈAUQN]²(ÿb«QƉˆ³ñjræðñC 8„ž¥!îÕêy(˜ ÎÏ6cΙ¬åž_mj“ ݂IŒ]£AObó¸åÔ³}ÙX"‡-Âzñ£!øVœ¼ÀB»vÙU<> †„=åtG3•ÄLƒ:0jAe‚Î4 d93±w«QhàmBiÃ˞sðR=@¯¾€È"Zoœrq÷–”Y^¨b½hy/E©PKþ2(ÎRYmo•Ž¹€«£€=Ñg¦QrÁË*Dèw¹äïqî{GÝô "TQî2Oøº€N=­ Ê)¢[-îi’ JSD¿©™"˜"’Õ³^k«wž¥ˆ +ðt½‘>'AtuX\ˑÔD»ˆnK$øwš#ë-¡ˆ~òcò‚”™ ˆkôÎÉâ‰ÐþŽÉ³qíN3fݍ#‚ÚÜhñØ$ŸŒÈ‰8!. cøà9°4lîûê¡Ãb– »céù‡g òÑ{\¸ ·c¿Qð±×ièÄÕ¥88yy³ðìë)&âFPðDu(¨ëáeï @j‚ӉЊ >ŸX³~y‰ø§“äàùHA87ð/`h ZñA5 <ÁÀYT"öˆñS)øñ÷åï±,¤ûÂö_"'ª9è}ÏNAÙ¹ô‡°;\ßÖz”a×Â…‡ðPÃ!F„U!Zu¸¾OL߶aÿ€T¹¡ePì³-%Cx¶_D¨ëŸƒ€Z%L™˜¬Ñ~lƒ„!V"H”íÛ?B”o‹ÂÀ<7­ Qùlä ¼„òjª²EÊHÂR¿ì-‚=RWg+`éÉ»µ‰æ€–PÝ¿(+ÎJƒ¸/ÐüdHèZ!SÑì6ÍB{܈N⮄°áëd‚¤VRˆzêJÜÊáqCL™Uƒ ®ºuç8Oˆ|YãÙj#ÂõL5 +»}''téA Êڄ¸NP3B?6Åà#V&č6ãÉ[ŽD܃ ±») ,”È}—!ÒgÓ1…"yÅzÄTÃö-b´A™QQ— ›žmOñ‰4;à_‹ÍÄâÖÝ%G"@$ï² kSɱ‘x$ˆHœ™[$0²²Á>Äe™„âê‚ù Dchberç2$CH–[Ùv½°È+yCˆŸNý²‚ €Gx2ˆ>\ƒ1YYŠ1ˆ1þ€ÞÑ%ØqðH{HQ,¬ÊéRš>)Yé,c^ðĨêٙî+ˆÙ éđÞlaÛ&â΋ +üœGL¼šfûxØ 0]œ6¹;·¤Ý5°Ð0vurq3†‹ñ›v­ðÿ±NÆ0”}>0þý!îüƒÎ\߆Á¿PA=p™$õ{eó…òÀå{I½,.)Û'.ñ‡*«ª2‡¶Ë.`Áe—•m_¹,öŒÆ/œËW~æ D‡p ñ…O„ɇNáy³Y¬Ñù7óþka×­©ø +»§j¡µ^o`/Aꊷ«Ø€ ÂNm¥iY“‹Q“’POÛñh-ì´Cm ý¸©ÚLèTò¨Ú܌ ›Òxt÷LF=5§lÆ7§A[NÙÀ0ãìyëÞn¬ pA%îXsf‚îìcEg^Wæ!?¶ËÃ@ÑÒ¼sd09fIže§ «sb Ì!`õ#=fè Oˆ™*æÇ"Cš¦i4}çq¦C{¡Œ"""RyuæäI'IöSšŸU<=V©BBµ–ü¡ tDdž 1ŒY…ÒÛj2¢_iÿÁá.$q3à e||}Î7Ðúg†ô»Åw[<êBØ¿D,"b߅œ ‹i"Äb1‰m1áÌaãÂ̑®˜Adn š”¹räCrnò¼¨¢áÐ7GÎç~tDZ&o÷ˆÄñ «h’X¡4¨äÜ6 Sp@4D‚aÁÍdw€DF,>@:PNJ£ …aŒA RŠ!¤ €9èc‹q2º)ÖËÄÑÙ +tö$^ÆÛeŠž”ˆÔt*%DIÀñóåL7kq‹úæ¹®'ê¤~Ñ^Ý:I–Ô.êDÏq}kâ=Ïha@’¢ ÒüLÜéHzœJL²¦hLg|U»ÆGÍ)ér˜Lºëb¢¾¤üŒ  å½b°Ë×Õ%åÙ)Ô_â’ȇ-‰+ƒˆ°ò‘¤Ï±%)›uQ¤(²/$µŠ¤ì-Jjñȱ"亨PרÚg¢Iú'à‹IBOËώô;e˜–LÀÐð8’#ôhx•´[uŠ0’Üÿñ•šh°ëvÏ­9"‘üñ¤ ‚$ +ôŒ¹€$׶‡DêÜw•ª—Š ýHb d#QÙŦ¥¡Ñ­H?‹øJ֙ @‹l¶&RÆ.©8ÖE¹ ic^ëGžì²{@pÐߐ£Mːÿ¾%£nQ•¹Ì{£èü(ö!b(6Àß1ÊaNë @ÈHÿI1R[ò Õgë!1Ô­|‡æÉE²Âž5lKH‹Dƒ-.cu%)ȕ¦, bEâ^Õ儊4Â^KX—fzéÌ-c9"RKH¡h` .NuuòAr§j÷›Á!yFžcƒ?_Q Æ®A6¸£ž@®ŽÅž4¤ˆ¹P¤òû¸~jOÛѹ£«œæ5M‹þp4½É? +‹*!z˜Ÿ‚~Út”ñ_„䲌v³ŽLH¶TìVëóð¤B-Y-„ø) ’x:ZpÃuBA2;g–É5ƒ¤gÎêæÕ%µX¶ÃxbFšË|tEHˆFýG:$'ü# .ÜE;Î4×àtÁÎ#bP÷QÍL£¸'ô”ÖéoFÆÓ4:hÄEd×C£i¤Ï‰’² +ü}­Ü#‡G OeÆuG ¦‹õ‡¸5Ð%=ªÎ -*:°ž€€eÓ0æ•n]–§ÅÒ¬ -<ùŽ&êü~÷Ä~龎˜c4/Ë÷É:ƒ2HRÝCþ4Ú²Ù --#¾|V‹×Q0|“©ºEdT6š“ ?K.8²G몁¤#òÈ(+á\$Ž†èˆ6ê†G¼WÇ™u=Ðݱ.Â"F­`ÜköŠ%HDbFÎë+lÐr”ÿíƬѱ ËdmA\7B#ËÁ½]‘aMHSJŽ0²!-ˆèZ‹`Ë?ZYå‹8tY1E]uÏpD´˜ñèÅYÞ)¡ú­dçÊJp$6Õ +Ÿª Dj ÞÈ>Ñח co¤—Ãi‘¡ûo3šT¸ðE=çþû,eӍè^ Žd}äz’1³îr‘Ìøûâ-uf£ÒˆlDå‡ØˆxŠÍkäzÇ­t­È%Êã¨1}8U³d¸—d"¦Q˜TiSÜ ø€$ç&‡‘—åøÆ°ìØ:΢(c3sÅhTÎå×Q’$頒@¬˜.¼*h½Fú–£Û‡×æ±üфÎÞ×YÙÈÐ6ÐÆÙƊÂÉg´|v,.àE~¸}ŒÍ3ÚÏWI俆]½®ç¡=vE§à2¬{$ó™߅ˆëG`³TÕSÉ´‹Ô92w¬Ha” ÃkΟعÂìC|ØдòZ– HPÐHÁÿcÐztÑB;Ò!&6j ƒóù â\ÀÇtý¢%xi Ã>+t-´š6*=ÞP‹\Lý!¬‚ 6¸àD8NÞÝÎVÉaÅÏ,ÏCQG`z×$@4ÖY€Ââ}Æ;óM6?¿†A‘cVeÉg•¢è>¨xsB`„¡#¿ÁÈ ˆô̓AlzŒ À¨Åqî Ñä \B|7£™W£––p¤'µ$LV ÌTözÃê¢koÆâ%ðO¸Xd"¶]OÁ.B3‚ê©Zá`‹î­E&…òÙRhÖ@G8-¨uõìàEÐȎšž²Ò+UWÓ‹H Ä"²ÂCXäˆé\_Q ¯ˆ\LQM鞮剋;k|úÐVtâ®iE³@¾ `YÑÆWo„‘ &Ì`¢¤K—‘%@ܓàÕWOEE)ÞˏÏ'’CXÆTPSTþëÑ?&)Êí¾„ù¦ v—!²ñ`!MÁQîÀóQ¤¯þ¡aM’ lFs¦« vî +Šœ7.~X„“ ÃÎOdˆöÍ`çÙBæ{2p½÷ k‡w| +Ä^9Q +(­*Ö T8Ñ(˜°ÜD&&æFÓ8åI F](ŠtöWø”6j·rÖîï(¢}¾ á®"@Þ!ª?o_Ց²ñ~Ì®è ÆÑEŒ£Ñðm̐«)I?«[j<,r¼š…®ØM†f…>±Úq?§wŀ 全—JOQ3Ù$`‹©."‹ˆ›ébYEԓ‚¨ ò蛉ûÝy†K.&ºr'Qdiíö,ת[NDdT9\g¨·È!òñrná½3<”Él·L[‰ë]É]Z‘C¬´dvø:‘ô ‚èOs]´5Ôò›ÿ¡'QýC-‘?T“9ª2É÷XüPÙ¿÷ü8Ø¢Ä˅ñ S<õÖ5>ƒ’›Ð5"ˆ§“*7%`±PO×6wÒNò ¦IìLësõ¼¡h­Btá‡ÂÐ t"Duë£yh>ÞGǶ?%ýž8Ž3 ap»SÅÀ!Á‘ó»ihû\¿ƒâËjˆF£ŒK6ô èslH‹C.@Ó¶ÅÓò]ÕPí+±™lªGҐW7kÆÅA4úˉDŽž¡êýÔÚD§Õ5 ¡³ݖ!Þ^âP†LµdH­ € U„n¡›:34"Áñ!V C-ß3 •#Hü†ˆþhöŸïâ¿oօèBçC.DèA­Å™B Ã*—ÖõrÁj¡x'b͛˭ªâ 0e¦ ði ن8|¥úÑê‹×i…ꐹ@;!B¯ [‡ËQ«šq*ô£ÎådN¡!"M¦U&Å3I‰¶%X6˜eîm„Å1W Qy8&±ÓÔ°¥Fìí³óå}BµhX ;À +¢Ôð\ïU'4ì«‘àñ¯&®W{‡¢Ü“mO#Åx®6¡˜àƒ-4nL6±¤Oï7ÎCý‘²}³ŸìÁnßNªâ!¬ëšA—¢+¨Ï^#3ÿ÷y©HŸä“ÎíËS7ˆã•Þ>HÔ ø YBkYðw¬‡ñÅWƒR¸‡»|}Z›L|AaJMj͉ƒÊˆF¶ÅBæ„[Å;>‘5¨L ‚ûŸµ`––sD +ŠÅ+ kMg³FH$hÐR蛏šÊLΕXÌ  pµ¥É„C֓¢‚°iïìöà__½À)Gr!e[o\x=3óÓØU  ¶Ó¢M ¢Û÷î&¨€ ²œƒt¯Ïåc Št¤hPþÌAOøÜg·(€îc½Pž¹+5UÈ J®ËtQŽ*ˆé³)¨ 4¢#óKà Š¦ ?|ü¨AºíA B§÷6Î;¼p8A’T¥”…6¯Ÿ#ÊúÆæÛ¶¿`æÐ¥‰×#=׫ߤþT–úôùR|S“¹ººíö‘˶B]—ùà98Jü!š¶#í|āR}™}{°£¯aZFÉÎróm®vtb¬!©rўÕ-ÊÏ=VÿÜÍJtÁêL¦öŸ«hÂ~xóȨãúÊMÖO…óƒT?ÏRýh&ÄH¾Bý¬Ù}¾š‚@óÓôÇü ¡û”3­”¼HqŸÆSä¿æ˜6¢§Ñb =#ø¶Þ³*laFÀÈø?ŽQðs/M`ÀÏ]ðÃUÂù}àÝ9Å÷‘K¸0ô>rÞºÒÖÊ.xŸKX³ûèxS8¾:ªÔÓ[äFÞÄ‚­_ +¬Š®”ЇöãZšó|“Ky‚­= +ÅFR§B}F ݬ`k dí΀L‰Èé£F÷ìÃ&3ۚé“5ބJ¿ü¾wØxÎÌ×Tú$±fH_Ì÷ôùlðtõæùð$ù=™F©€é,–ß`šcH$©áÆ£ÔõÄ”yPWç#sw°„~ï²ææc6©•“NùgÞ¸ºK°5¨ EøÐ O’Oì|Q=‹¡Ï[bí ©4 ã2%5>©ó¨ öAӖ1 åÈák©¥<®>å;gJý‡eq3=Øaðó÷hWÊÒa¤¥ë§LÀ!,]$µ'mcܝ<’¼cqŽˆðžt¬'m }ª9ºçæ YvO¨¶>;ÑQU÷\õÔѺ§Q½FZlî šmhI¬1rÏÿmdX€WWÞß&UÜ ßŒ ¾‚ò_]ñ‘èf#dQ æ&¦<ÀV †";ÉP‚ýA»³ýLŽB! MëC¡xèÚz0«˜$ÿà±æ3î0¼9e§öO»=K{E¼&cjÈbsØ:‚˜¡¨I¨8¨ØØBÃØê4ø¨®AXì1¦ÑNNcž™¼¿C¡:çÎliätҗö¶ï{@׎ҩ³®8ßd8줁üSN ‰r„CBªÖº†Å2±ã"±y¥¶‰×Z«ðþÔÞÅá*‡NÍ36žjêYnœ¹Ñ€ëßÙëXôî‹óǁ‰zÓÔhOögp™t +0ïÚ¬y‡+h£lÕX$U—Ë óp®ëª”ÕÉDÿ0ÝïÐħ£³ûœìÃu}º@ +\”0€Ï£šÐ˳ñg©xɨ9Ñjyq ­I2œ3‡ó“®â¹×€c»xg6À„H5ā„8s¸¼ƒµ¡¥H4,†%|±h°q.ÆA€ºæŸ…Øìç½ÒLxÒ qC³”go@¾×ž²¿ƒÿe÷Ç(¦*ˆ¼TEÜȑ÷½ÝÁVÁ7H m9Óچ±a²îa÷¹Fõÿ=ã 9“ÏnZD±¸}“u ݸ ý *S—”ÑR’×܋*>þ¤ÄåÐÇ †øegWӕ©ö°<¨DSV]¹éKêÙþ>o¤ +µ‹kk ÿ#dðë굃CÊB’‰ ¬þa;Vb™L#„äSwÝo!‡ ¾osÓ?Æ8$9¢Þ?eÏXGzÿÝ*X!7dB÷êcï,"ɹH÷¹Ž¤ 8ÁP  á"`H,9ÝM±óä†C’|±Xxú& Áp/êAN\_möjSÑ#¢kŠ!unáP臥A$™«7͈Ÿ„ü ·ƒ#QÝ°"Ä8 "m¬u’A¦ŽÌ‰0 I*üÛcª ½ô…$F·èf$YZT„¸FT“˜±§Q© ̙¼íš Éú(Œ{½Dr™‚Cr¡‹°–ÂAל!Qӈ» ²zvN>n½ÇQÈZ5`$÷V?3©l*3—_<ô óžF"\FrúnèаÂõ5±ÖIÅ*x\qÝBeÝÐÑ ÷5z(ÿÿ÷e´à£Œ¿‰Ðò¼u¥ÿãv9t–ANÄB°AÌ$ñ–QÝ|ΣW|Å%iö¾VÕùTîÿ»O4(q=Œ¿O˜mmÊ5ÛXˆ¸7U„O!!CƒèìYÑtzű+¿•þP‰HØ:Æ×fð0Qˆ3¡ Õ@‘BE§â»¹ª³ÛÓWz½PÓ«ËÄ Öۈ²Y,Ì^ĒHǵ¶øE¤ötßƄuóÑo˜釤Àö€¬_‚düýRÏá*Ámýjˆ€áo} ug +D+‘jÂâ°ó¬@étÓߛ::>Ʊ)l@„ÿJÀH4ut$º[”@©d+þºȌQvÄÿZ@$ €Oœ~RÿQ—–U¶Š³Dk&Èì´]"°±É¦›C³ø¡’7e.¨}“`œ­‚˜(IšIDÍž·:R6più<8Лyz¢ýb&U6{ñI1덬mSÙ¬k)Th»zKN¡%6¸Pµqµ+’ç )f™Å$ªÃ¾ð5d¶^‰eýáÙ<€ÅN!ÕÃ… HLîÜغÅövµ»gì€Õú'ððyàÿÂԇ§Æ¤ô³0ð™ÐnÛâv¯UTŸ0CAjçL¶’ Ðfʄ*µØÇk¥‚IH(Œìñ3§ÓÊN¶)°_á±µ(¡#t\#H5L*‰¤{«ãgKMd#,»… ê:ëhÀøȆ8kf2ˆ´sŠ™ý€;§§ç§Y®aŒÃ…+çiD ïüÓrú ‹„þéH# ajDøØךû€öÒ"Ç.Õ_ÏÈû؝m?<¥Êxu–`Hô+µ=Ȓ) €j&Ú_~açÿ5Xé¬HÒ"fK©\CjèZäé'X† ög@Ž}1‚ +~$·´ÉE8ÞñüF­,è"`X~N ì2#ØI'Œtö/¤À ÚàÞ(£øc)—îÈñkjóÆ_‹””j@3£9`Wíñn¾»ŽÐMxÛlxÎÏs‹C.Fa÷¨ +jh0ÅkS=EűK„©ix<%Þ`+°Zë2i„‰ga:¸1_ZUB¥§DNJ8Œ ¬)By$/ñ(Û÷Sä?ÿÂ^âȍ ›á”?‡ÄhT0¶âTž^쌛•uq@éò=! ânÓÁÁ³4#—d ðÚ»a¹|‹8ë­+îæJ‘'‡$«9Ë^àì󢙋4a%R£BB*®uu& lö2n¢œ¡^í²M À¯þλ~± +<,:© ýÕRB6zĄ€õÑyvÑw|l îN… ;]Ñ·aOòÞØoò?îÆxÿ=à?Tâ"B©5w…*e‘n7ã3þ™i±/òýfŸu<8ņš+"¶m÷p]OÄU'Xö,ºŸè/§´óéñv^'ê¢ô"rҝŸîIÌ)¯­ äéDD”"Ô ?¡;;jè£kM½ÛÿAS!V:>¼ÎûHìuµŸÈA*£æk³ÕÕ èB9ˊŒ™µ (XŸÐê"p(&œß ¤,áš.К²Ž`€^³zžØ‚lùS ýAô–@‰Q¼”æ?¾Ëzr3~Vµö…!^iJ5ɳOr³ºvÍ=ŠÁ~áMē ‹yÍbŠK-Ó8ð§hoíϔyًR¸Ý§¼Æ„eQ8¦–U:‡(;8‘ÜÒ̝gnبõÀã¨}›_áõÆ9ù]^\äø„¬»*ça—±á‹ä˜ëŽø_H¹aߔº’²‚xX¿OÝMUïŠjØ©4ÿ?q/>?|-Uu ÆxúE9F®—ŽTbenŒË‹»äÈæÕDz³Wšïaِ 9‡+P#Ñö§sn!’Drìt@{|ŸF]óOBɐ›l ++>Ãvì . +ɐ£µóÉ(`M•™ñ\τTànñ<ë?Œ1¸J–+σûëz¹¨ʟ´Û-Àu¨Órº +ÅfEýEu-Ò-àr­S¤¶æa ¬{"Ú¨ ‘Ï—âlvyZÃUlXì´;m®¯ÕRy=ù”"$Z_ + 8h>ÁFÁ4"䶯íZS›’ÐÄÆX…|[]#‹x#ȯÛþçÞâ­xnß gUo2|ÐÒ§+)’òzPÇ"¯÷Û©aiîù›Â îl£”Ÿg÷ו_¾îŽ¥k5opNàÈÿn $jÝtqûJ±{cvnLÁÄxLÿ(ð̂P€s%рxcà lÿDá}‡•pMú'^ËØ8”x{Ò:Nw§h]Bç÷À¸Såy,áÃ|£s^è†Ñ"/yWp>oU#ǃ’в{rÉ…õôêb+ ­!ŠÜ³L²% Ac» "›oR«#•X|-PQ¨h|:Å ø)Ɯ¬ßWKwuŒ³­ÖöOm ܺ¬Õg‘‰ ‘`:ْ–±/ؗ;6ªªfœþ CVµ\T[ûz„K5 ¤Ö…Œ(1S”6U / +E°†*T8ŇèíºõílÜoþµA±gÊśr¸zхÀ3uØq„ÆôqüšÀ€\÷¢ž( +ù| úÇøîKoø+D ¸_ƒï…©èUfˆ©˜›@@Ý{òúyAïÅí®£‚¶†v_>µÛ¹S²«ÿ `†11þ ¨€“‹áír£=Í}2mÊüxBºN—(HÏìŽGWÀ¢ïG×;i¥®œÉý ó!ì4¦§}myO+¬’ÈMú™¹€òPBAš6f윌¢º:áÈ +ÁþŠ°÷¸„Í +^yÊîèªÔíÙËrÚãrHTJýó(„-þkÙ*ƒ88c˜Zâä@ ËJCÝøDÊ0#"˜Rn]wã'ÕW nxËßší3+Øu/.°ýq{®tn20 6€ð1äxÖÀXýNÂÙø€Fæ5«FÖî:Ž°'™V. +Mt 5¦ëYîˆBi ¨¬‡s—¡‘ú¢} /‡N¥Ö@\éÒ ‘au_€Lÿuätf"…x(8%B‘:…t"‘×»wЁ€_ãB»:Âi>>;“–Ÿ2‹ÿò™Ï€¡0–{Vs³‡àKÆ@ÍÞ?rWm4@1ÏíÁt +ò{äs ŝ¼ÿÀ¼Å¦TgKKU ?ðm%Þ@üÀ&ƒAƒ’•BÁs{˜ YBM`àCWJBWU ¡jɁ”~Áÿn5€ÌW$Õ‘RHþðߙèDµ ˆ(å!d.±dÅh6Aäb8p•4Ð6¤Y=ÇÍá0P +uö÷4z,,؍Àï×ԍ +î’鍅=—., #«* æÁ,®e±‡ã*Š2 +,>(vú¬*ʎ[A‡f=ªtik ‰#¥ "ì|7 7ŽÆ6•¤„(çb_®cLØ->ÎéyF9‡¡áïÎr§‰g´ãu®®š­À¿X : ?¿ U9¯0á—V(€0(¡ê†o¿ lœŒ¯»ÌµßЁŠž`v($Òk½êЙÎCM¢("â,ƒ2ðiT,ã +XTߍRôc ՋG!íåå‡s?Ì'V”€¸{5cÔà¨lsÃkXØ9S=áÏÞÀͯAØF³=3’ 3ÉV©¡ÛI®ü€8ü©ØÄmŸ¯6¶ÚŽÇ +âIË]¢6þôô{^-2ˆV˜5€«)Gz݋ 7ÁŒÆºµžóB -e,JeíîüT=®]’Xwu÷¬ñ÷ + Óς>Ý¿ºo„‰v"?p²‡!Ýä#¡ôšêX”FªˆOµ$ù?¯m(=(hàdupX*´SINº¦w<Ó«Þ-В¿çéBÝ¡ýˆßçw—4rª½¸žQ,š}áÌÊMi¡ P÷çà*y«¬†HTöÁӺš‰ÙUdñt½³tª2ÅÏ¥gîì0îe0dwJs™‰%t”ˆ9ÅøA9OûŠVü…Ð-eB/Û7'£âº¡“À‰6íxƒkÖ@{¢Žol#…|qlhÇÇg¶Ñ¿Ýy{¤ªƒå Ø«aZ-õñüo Ú9ٟ†{§bbÀà¼1]ÿJþðŠ0€z5ú,V³"âo]ÇBLÞgËNà0‡Ǻ©´9(J’„p¿"Lԙφj9ežVun™O”ÈsÔŸŒ ¬£”/TðeB;Iw +Ü%®ì6x3րlh€@Îƕ%íú Éõ¥è¹±¬ n# öýJeláçÙnå +W)› á.´ë­é×\z'rjð +{ –¡‚ñÒN–®¤n®²pQ°ý¯ýtYkÞÑjþ9>yŒÑ€=×d"¢F$›lifB•œÃ¬Ùsc»í9YæÄ?x |BŒ|A0ڜæ”^oÈ&cjÀA+ ‚ mÔcFg3X,X'(R¿áׄAAˆtŠ¾ °CŒÞ”tv*Ô×W 3¢ÝBATÞù‹¡/pò…6ÒÕ ¤aÌåv§BÁRíášPž®¹¤<(ÈißÅÄ"Q›K¯jTð*,QeäA¬ô_&å`ߒê0jÿü`1‚›;1mJƒρT,ÖO4®¡Ü| ]”ûQW+`'8[ g"üVõDMÖT|f®7ÏàÒǙ‹Ñ 'NË¥Ör鱃9Ç®=¹ÐWù }|a¹”2¶çŽ„|ž´u¨èËE§&o×®HÃö73¥mW ?驘L%_Öb¢@ö, ф]א®¶‘¤¸ž¡by†«¢5†¥BOë°æÛO1·[”ŠœW{¤±µî(’KiǸ˜…’mcÔOè_ê ˜µü𘳭BRiïƒ"ªöPGºQqRq Ä\¹h’ª¢ªá]¡ A4õ¡,ºÁÑçÉóSáÜ0IPH#¿@Ôs†–<Ö«tê•Ë÷“¾+<ËE<áI{ +­[Õw!áç\;Í/Õ2’Ë Qwz«¬±N.Ëø@,íÒÜôçe¨SÓÒm=-WŠ#±Áÿ‰¥110GÛeKÏÃð|òa–¯¶’½üÅsщAöCÚÈ‘*í„4\w÷oÆ÷àë†Ñ>VÀ“ üû]LZ—@#¿8PÒŽ +uw[Ÿåž…#ìUu)o¥M”Ñ@ÙÔ¾˜K dœø +Râ4`‚ÂêúŽvÑÙZ‘Á2(¸ýyYžO9¤¾‡ òiqÈnóŽä‹Úþ ið\ì-G}á|­Ì5×SYÕÈþ$¨X¶;@è V †UénaÊü#Q)‚ ÷´Xi?GCÀĺÁKô·Qé@Bó_â*`…ŒëPO¹J¸â{—°àuÛÐel´3èÈY°/¡¼üö(t·Ì=[ÿoŽô¬\l‡ÜØí«°FÐpr”7¿fØT†Ûü2»ÿ÷ËkCðà$9¬^o ¾—V@¿¡onÑËUqþÑ参]íAØ?V9’$,Ž_ÎIœt­®½  (­<bŒÒU¿¤Ý'á³IæªtÜm]¤_ÚöѼqÃXWn"”øãË,ÊC™/VBkþu=̚“¶ ÚqQ´ç µ>6œx£‰*KD-š8Š-sòÅcñ¢aÑ÷Z»kjP¾pkÿ´¼¹P5I€†ãÉ*ýà…,Ÿƒ ßCÜÍÑpȘå{§„KÒYü8&º*ßO(—”5ÕB +Eȑ!‹ÉuC[¨¹EÒ¡Ys9ÅÆÒ¹†¾¯2›vî@þ¹¬r-~¨1ù²¸*DØ3Š †ã•KDÓÙÝdsEŽ4Ÿ7.8ðC€€x[GDɈ$VA`Ù¼U™ÔeQfµY¦4Ð|è~>ø Ûæ"vU «`oŒÍ~9ûM*_|±¹Ö5Ú¶„‹Ù!vnS°XK| <ä‹&öÂE¸uÅMa÷x½E•’8JH,¼¹Vz5bèa(fsOÆIZ²«ßzL·2OOMý–hd‹âÀDÈö.-1Ó5Žxʁ öæ¯pï,Ç~ª‡eYܜ¢ÜðéÁ]þèèKáğœ.ò–#¶n¢DðAvå;«wN…]êd#¿$<Ã?‚%œË;B6Vô÷A¡Ç(ñÈo¦è±¤e¥uúãæº °]pu\ñ”4Óp..~ªvÆâã åZß´lŒ£IIq¸i&Jœ¤…?ÆôºŠÏîÐ-q×Zb´Ýì͒]Q=cÜø9WrÝÕ¥äI1ç !ñb¹G¡ì¢©è«ÚjGäΚ+­KÄ\P½•÷›Ñ«xrèÜ\R³aqåÙ þ¼ù)C‹J\#b1s·.S6$éÒñ–Ò¤ÜÆ\Ž0J*Íó\H`}I™^ 3x.àDúµ£{nê+17}EÁ¢ª N¯IÏ=,öÐáÛºÐM¤½CP§z—°m`‡$À¡ òvP®·‹¨ãÚñ‘j!ÿ©€ÙOí%ßÛ Ó›2æbl28JxÂ\U³Cðǎ»¹ÐÃòá 7Ó ’Øz¹ê\kFÑ\Ù|˓³j.3x²y’PB–„¨JVÿŠ8/t’t¯ÁµRŒˆuþ»Vr5fÊ?ˆõ&æ2èÌHJo Ëb¥Ù¡À§is±¡ M>Ox‰ë9h üÀˆÑ9N ’hkz¹q wt aìI,ÙË f ®AK™Š‡J›¥žX_Ù«U6H±ÎÓxÂ14€K¸³Ó£Œ—dO‹òwƒ +¨ñbxAŒ‡‚ÜúÑô°0ƒ!ç¶Äl%„öüãÔ@+BÉ2ß0¾‰L/Š( +ÒÜ=@æÑsù½öþÇßÿ³7d®öÏ wýÐz¨lÿÜoÔrÓ ×¶í(”¯Èƒý*ø×èrŽ6~w+«;–Pë‘Xщ¨Í!ù ͆×yžà„Jìn #ö«æÙ&ƒ¢V£¥;´®ñ5ø/1ƒÛ³!#0Õ@´‘ÐýŒ.o›;ä«$7û×'­gÌàÚ²Œ!ˆX'”P8¡’ðêCÔÍÚòM„´ p‹­×%À+ŠÃD?WGϲ å|:d®W4‚I?)V"'Û¢bö‰8O§5Íl–´ÄzŠÙy]{srÀõ AöHàeJ¢£í"AÎ W&NÚ¿äø·ò¿“Ám‰\=ˆî1¦ÓyEŸÆ„áºÅëhÜPåª+*¦Eäʦ‡#mÌc€»þ‹$bq&ПÂΰ~ìB¹3jÈ.znK1úN§Àû|bkÚá1× óˆE”~ø•ØÒ#ïNæcBtØS©K/ì¿ >¬+ߪ¾w³w‚«+„FÜàÿŸË¶Ê«F5ˆÔm:Ø· ›kcé£÷~\Šc¶Ü"üèÂ#3È©ˆ¯”0϶¼±`ÿÀŸU‘׌—ˆËdd܃öjÀ+¥¸ŒìFGÕFtU <£  ´ ]‹¹½1ÆçÜÏk5ˆœ¶÷¨{2Š¡’:£:÷u1 }Q>È7‰I‘&»J¨°<;F~H“Gv'E½ÏnßI(Œó9LîR™þXÕ;Š˜tnžˆ©oËîU4Nª:v%ò""Þ5ân!c@õ€7Ýõܵp0d› Zó°ÏŠ‹’þI?9¬Ê¼£*Þ|Œ§îåøC7wê3:*ó¯ ¢³ f_O*§ªßWÑñRY è«×kž-Ë DóïÍ2/Aÿûï–<°›ÞFj0­Ñ¡ÒÙÌd¿tÚ+j^ú˜â¬„„û:·kÝE­þ↩ ëâPÿ!*Öyå3žž@Sˆ™Ùy¿Cªãm‡, ú&°ä@Ü¥Áô“±ê‹•,«ç^a»®j†Óöd?ŒT«õÿœbŒAÏež•¿N|øºý´ØߔËãÏp‰ +Áçë›óÊ$Êò…‘¸¡?‡2"t«¤zþ“TÙ:kŒ¦os2¸gP% W“nüÁñD‹š¬TÃ5Õû0\ ïw'jót!¾aìþ–{û$Šô±tlÁM÷8½Û–¥TÎ]C^õ KýAòÓ&±d {'3p(Ã<j±a|7h•Cº–òøª°;ä?‡¤Ån¶µ¸Æ2È·2ra՚X%/q¨@’M†>s(4ƒn•¤ËðjÚùJ‹ '“.…ìy¾0Q+«W¦öÚ§f€øPNÜ_ jnõ V0/•aîÀháÏMç­¿:pB +80ú}žâËĐ0Èñ#æ ™QöÅÍó_ --ìw›šmX‰˜‡!hþ ºXm̘4æÚ$ˆs X7g@ŒLS©  ¨!©Èd;<ãߎ·H}âP4yZɌ¡*§qù#Ì%œâZ¹ŽAò«G§z×Óø|f]¨ýxzXMfÔî¶ÉÊι—ƒÀXG)ý½|‰=I§ÉƜÁTÙN0šºdòå-ý¤ŸÇcëFûr¥3cTg\—‘‚׌¨®tì[ YƒátJOxUzt lOn}ô1>þt† +–R‹‘ðñŠ[x.4gŽsi71däÂìQÿLË>D8®RÉ@rá5\ô\ _¤HÞrÁÃã9œ„dŽ_žMzÉÐU·.ÃÍÌÉÜ}2d¾È[&¸sû4ä[pÙ§ý¸/—§Iÿ4ɐ7Jxæõ‰¼: h幕éì<}¹äÓÇي*KºÒ“]œ°+þç *â¡ÒX){OnÆûî©) ¹§ÞHVÄÆûiF{²nÏTOš7[OՅ­x,oê©&{­Áñ@îôäî.(R©—žN™è›.‚2FOàÖ²^˜„6¦¥ïÉÏëUžrî—'O† +d¢øõ¦¬ñÔ²ÓN½Å¿MÍa•ZŠ§ðT…¨hÕÙþÓë[ò­ÓE'&ïԇ«NÅUcè`•ê™R§YÛ@S-ýëfùÍwíšè ¬°KN;™zýsv²Ôoe'µ&Œ‡)£šÀéÁ¸V…½uyP Fˆ΄Hâ>æq +OÜtF“|¨H×8%\Þ¦ˆå)%“oÕ)ó' >‘ò¿ÝMðp}éԚCwôvtj•ÙÐEùèÐIfz#~NøôÒsò.ªÆS"‚ñ½Eöá¶øÄà`&Î#fHìaó&ÐúMášš™žIy¼‚´Ì°éÙ–.8ˍ¯‘ÝT§ÑŒ”‚•‘=šã69QöÓäû¿7S-»“”ü8`:^› ‚—6Ót>[>RíÌØ¢_«XÝ+Ü cț” +ü-ŇÓe—Ñ«CežkÜдIӐŠiº0ºÅî]8!çc€¦ˆ™ˆXzÙÒS3ÿè’wÀé/Ó&wÿ›ìz™[¸ß47—Árû¦e~©ä3ei–ikD7›åã¯݌ã˜KÖô•YÙw“ˆª 6ZŽû¹ãwÐVe˜Çá² Zp€­¦%®ŒðiE[ʓn}cÈ°% ^™èÜô¤fž~ ‚:°Œ7ý/$e™$lZ¼–qÀ³Ì«É'¹K=|ÊxóºäSnޗªÎæS轓•tÉ&\±HTüZg£¹š +øœž¤«üp)%Àò4^{ü)–g¨¤lŽPFØîÒïWf×?ý킪ºdIH¢0]£YBÀ¶–*r +Í¥2¯4­Ã ©¥}y$— +ږŠœ..q  =3Á¥zNþ–œ„Ž{K¦kÀùÈåø c Ð ê³Z"× =[hT +KU’:QEy’hé “T  “üÓU"‡…§Q’Ê’+¢N–Zæ¼äKõ9‡È•°Ìwë›E“·˜‚휸ŒÈ‹ +ñ°dwüÂR ¥Á` ëkl%ïp>ú+51)÷•Ð¡wºW:ߣó¾4¯Ô…[ j¯ðޕ0 iEy´!¼—ÞWz¤•z"•Šz e%‘¨´@Æè‚VÎEü@-؇çl“䌶J¡¬Íà£@€)ݑåO¥âý.%"CÂRÉ+™ ”ì‘‘ <.J)_1h¬´Õ¿±Ú1-¨´eN5 ޟRîŸ0„zJêf9Ù¶0¦ˆÚéýQÊàé LU<§|ι¶õۆR¤|¢·¤Ôi"wÍ¢R·‘èGɁ“ÉÓ¤/šM2£Hãâh ÅÍÝ CRf¥HÎOðp3)xE²œA¨YjtÕY†Iij‚I=²Óì_’75âлÜKŠë“òËs—”ËáÑ*v‡šKJÙuKqŸ©2çeù"î.JÉÀ#©Ç$÷JÂ.?l´’tÒ˺ÁûQÒsÑÏ@%SO1‚¾î=µÎ¼#U 0?*ú´WI²Î‡Õ´ãŒa‘ô:¢%’|L+<#l”æh›î¹Œ¨F¤ARS3I1ŠÅ@R¿ˆù#GgÖGzl¼´GR—[$Ňá†ÇÉ\~ŽT¿°"Q ‘¤.…Æ}bh#ý;dT(’†ã:|[FÚ¾ÐhðBp#wŽ9†#Z„j†gGㄣ‡Z‰&h3üQ¤¢è+`5¨-åFЧ \‘î—œå{`ÁÅ>Âú&†Ça³H òóñÈ1ξ4ÞPBjÏõ7¢ØW9ÌüQÈšoCäÊ£V¼ÔÂE”¹‹RHñ0OÉސY4¯!O#y†äÓZ\"kÅeò8†ÔN®M¡I`-}$ö÷„ôÊ·SÈSB’,H R÷F" x˜‹VýAJ×ï õx™8S^â –\Ó>&¤`Ø$P‚‚6&¢üO涆É)YŽq÷¯ì©=®¡ú1G*‘—Œ÷G'‚áNËՍcü~dõÞАÿ–âŽx}o´oŠ´«:k)2W2>ªë£ OÕ¡ÆÏòæIú¨Lœ Kmdð“ŽGn¿±:ê{ÃèW˜Fª6‰NÉDŽ‘œ**US¦UlFtaý +\hÙ +[@A4N1%~@óì{E}"©öv#8óàÐtMø=Vg²«Ð Qò«ðȕ‘E°Ì;óX·ù¾@6½+…çE¬Âþñ"ǍÆ5¨lh®s•;›fÃ{p§VQ‡ Œ9ð‘X.`»Èn̲.‚²Æ¢Üׂñ“4Òô :yþ K.'«kR sïê—[ +Œc"șÖ´o‘õÉ¥ºE »ùqPÇøÛœ]úÚӔ×íqa0‹MZãÁU_Ùg‘y€¶aªÀf‘e bûý9¦Ƽº,ÊïÑ;„:Y%£Ó¡>ÆK«i¼Üf· +ƒ]º$>'ûˆR©/m#”+æÏy`¸°×W‘=Xm2ãùJ4>ÂʍºmŽ¨„"òÙ£"+ÆâÅ¥^‘˜Ö^y"rƒ7^\Cø@ùŒÙ=52R„B‚S *±ÜDÑãØ6 Ž˜ÌàP`;šÈ¹qEmü†ê ð½´~ ZÀâäÿ‹¾_ܗ'RµD+å«ê—áŒ;‘ óŠ]ÜZu" Џ²s"Áˆ.ß_ãD·ÆrëhÎh?wÎiòœ–æëƒâ&·éò;öŒkG”Nß©ÚY%Ï¿^pJd߁I”ÈõvK0Æ>Šÿ†+tf‡&Ђ»dƒôŸ¬d õ²H”ä†ì40暑5% ¼–Š);2âA™Bî<GKÒ`ý*åŽ_p<ä/cÂC•"Yý9;xÁçGâ²;Bvð®e·‘f–Ù~›X Ý*&rJ5ä (Zj’ÎD MÂx‡î'cٖ¯#Z§A_í,‹É^FxÆ ý0“‹Õ Æ†0†å×Сe Y +SVC/ô¤†ä¡Íú¤‡¡¡·Áÿ I—+‘ûÜ uoyÍ ™2ÈÔI!ö¸Ð™4­•.¢î0de?¯™P:Ú~¸íà]¡G|ÑY_ȹâEúñ& +9q!?±p +ùDÚB}7…N¡a*-t[cO4xªe¡ßA +A×$ÃBͤ9}þ¡@2Ãڞ¹u}‘ù°P^…ŒþiB´/O…ÄZ.LŸBN²%Ԥ䈦!98„h8I;“B£PáU@´ÏÖx¸.B•‰œ›PC³µynœò¨=„äM" ‚—Ùâ¢q¼2"DùßMœ%„:˜²!¡.ÒÔpJt„šÔ⍐¹†kù +ŸíµÛ§,̊©ž¿t<„€fÉ ¢ÔþH'„JT¡rkªÎ1-…”b úy£|l¹!ëÔÿ (sgê9†4j*I¶5Ýéžë[¡¹YTì`H ÕJáEÕt¿ â¶{ۏÏÇ°cóñ1ìzöéÏsË +JbídåÀ?5n¡žæSÄäý>‚4‘х(¨Eõ êI/¨5zTqÆ£t£¥y1A—ꝌÄ.:eŒc¸ +¥‚ÜäpÅE°•‚(Bñ úý ‚ÊEb™ QÑ#, ”Ž3ê„û­[%ÈêýŒ‚ckd™›‘ º‘0A–ƒlAʀPÍT5”ö4 O0*.x +úº>½Lö@®Û[Ký˵?ˆÿ‡’v¦\I¾³È[ ҅MŸ‡üåwä趍¦1À„à}áÝ"UEP/÷18jK0 ôÓI%n6 ô{Ê÷ ƒ /XøÓqçŸâ3—¦Nzð1ÉJP/=%šßë d8Ð#N°u2 K†úÁ-©.fì©1W ƒl‚ÕÊ{xQ ²7ÊN¯xŒM kˆ³üø9³‘8©µ„³ˆ+¬ýÄ›ÒT¸ë•9j?F¨9 l2© ÕB¿N ¨<Šc.®´,G„°É›)q$% :)é:*A{þGIÁ#5Ïd€ì¥<9•<-¬D€ŽnfNžÙã#øÜ{Ô9Ä@ ©õ< # @©’ÿýŸæÏíÊÆcþ§ +Z„ï?ã¢b„v€ÚEÔdT®éKCì,#Eü¹óìXÕºÉÀ * šÕèç$¼ÏNJ÷gÝ?œ¢±NB×èÏç0¤rd œèªÙë-AÏáȘ"ÔÙæ ß +ý¸€@Œ ³BPWBïÇ'2mèb$¢š;\òó&p_E’!!‹«Ÿ¦ágéðólüæT_ÆBìÌæºIÝÜãXJœJI=ƒM!ܘ¬ ÛJÖÖõ@ô¥1¡¼“ÈÜü2ôaéAË>Öe½ +üÔ>àtÓbE‹ ç ω½O•[&ºAíîã.×}|¿"šû˜J75îóž/oí.oû$ԕp(½®SÇ9¶à²0\Í:é·iŠ`Ñd¥ÐGçãYNÅYm‘uíF›éŸÁ©O;Š™òü$7ð(†¿Ebé¢é#¹täó~à—•{è㲍! ñ? ‘íö + Súçc‹8³èæ˜÷|u5âø Úùô‡±/çãʛOVñF`Fï¦s¸/ñ¦Ó'ež ™ÂúÐ3º—jC>Æ0Ì>a§«agÒ®ý'ßå{PÛÐö97'>Kì8–Ü\w' ‰ô„Ìncùðw÷ØÆh Äù$/‚ŒiÕ Äk ^â4!;—7’ç΁Ϲ¹Zˆ·ðìICÐ=V7û÷€†¾ž®#do Oª© ¿%§qù~çâó "7¶{½¨åǕìmÞãï¹<[B°ž&?T)9æâ°/+ 8AÓqĜ{ôÿñt`x;³\÷$¯Ñ…ñaígl¸G‹LÏoOVwSº=Þ;A¨ÄIÈÍù¢/Ožâiò¶/qÙsN@óƒq{PiûUꙕ0µÁÊ1ëY+õ„"‘š¹]F ¦§™[OïÌ žâÐ?ëÅÜÅé´c=´u£Eúê9÷­wè,äV±B9$t­zÞgªè ”ÅþMöÁÉ(³{éa6± “uA½½jÒcޅa§<¬èZ•‚P˜"zØëÎÔd°†Ñˆ‹,·0Odœƒ}tÒu'/r ´âlmµOB’¥kÞÍú€*¯VFž6ފº“ñ›À¸^8Ášùòæÿ­N,g0ðjÏ£7˜,úŒÿªﶪ00I—n`цØLLÍ`™p¸”ÐâÑì6Z$â¶TîÌ+òlÞo®ÝÝ©æBbTš"gøêRÄRðš¶ñ×"úkt„²…ŠC àƒößÈ|IîAÏîߚ(›w>'?¤(7.¬ GU¾Òqû»—QÀ=ôø“Sòc–еÇãÙXd¿=Ï š¬ïuÎ;k«h0Ò ˆµHTÅt›§ÈÅK5˜•Ãm‡ýNãà],1hñHç>&/AÃDˆ"w7ÿ˱ïóY*Y,‚ŒŠÄ 2–Ò ø+2UðùR/h7Ð[âE®W˜õ×WEÜ¡‚àdJà¦RÃ@%}R°^¶EÁrò…"’vÀá—Ù(’Ÿ+N£W¾N‡"T¬Âò]z"P̏¦#ÊÒç¼Ú®ÃœMOdLO$Ls?>$Ãx5 qgÓ v¨ù߃Ìãý è}bᅊ"+µù ÀÝkè€"t2!ɜNN(-IB\R戎øü$Y v˜p’´;DØlLYÎXxµ£Og{ào?J¶æºÃhh‚Û#øGy‡’–®’;f^z?œ±VœhøࣛÑ.(¥)%ü/¢^*|‰ÒRŠÑ&ÿƒn ÷èü׌éÍæ•81ÏÃw­'–&ˆ×gå݇^u™v å‡>,©f4^îtW…5š{ |è€ÛË#‹÷šƒîÙU#{ˆÞ2d#I$;×6 êí°Ø„Û1Ó +-臉MGd‘®%¦SOȂ@ž´‘P3aœ£×#q(ÑZ` ñqyD:DðrØ?Óï§ ²šM †FLž¯^öwK!-nºäº´›%ïr3”¼]Dö=»3Æ ÇTŸ5úÓ2:M*ñ»-¢üf@žî×rÚA|}Û0Y·G[LŸ| þO7tͶ—{IküOÏÒãô°=%sgèj&y7§Îó¼Y)aÓó ÁDþOؒs;N{ñÜ«bþù¯ÿÁ ÒÌF 1¬Ú5YòÌIo§ãЈUÅ&Ì.Ô339æ.܍'#?RîT¾©r’B72â‚ÌysWƒŠ”“ËóԂC㼚tæ>¿Ì?Ï#Íì„QuHéé´¦: I‰6l¶D¡ KwÑ¡Bª€AʪTm)Fò9Fö¼á±¡g-ZQZ¼{4ˆGXš¨–¢õ¨t|֑#@ˆ0ˆÄ‚1‰Y,å€F F2>H@\PJ¡ õ d Ä„”BÊ Œ–„qmõ_A‚1iê +҉›ktŠ 8µöÊåÂe–öÇgnâ|›£ÃW©Å7Ú5™rBûhÊqN ðzR…iö”|9þ!ËTÍ Á.½gú™{BƒˆÝöV*á]ž¨N?ÙkÀ¯ak@юnñÅã´¯¯KýdK‰A\ÐÆ :²²/¤¢Üĉo{€»áB¿êj%©üy¦œüTYp‹ÏQªDU0ŒáQ/+¬¿K¿¸y¦teã?$N[ ÎBµœ€äœ¸ >”jµÐÔ çGf¼Ô3=§{Àÿ࢝w† ’…hø¡ow«Ó­·ª£¯ãeÆ0aæØBÁݑᬅáÀ‡©jtýëéèç±ï“1º‹\B$Cô…-51D<¥ +.ŀ)磵49Ì [Õ÷;÷ °eDŠ¤ þ2fýWMÏ +ü>§„£PÎ;hÊ ŠN×4„UØx]™Êq¼9· +ÎÕôù«öéÓ¹ªsÜ#-ÔÀ)wvlA¥€¬Á|ŸÐ©<©ë„2‘mªßRª°ªjgqoâ™õÊ?ÊÇNSä?íďÃü卻¢+!ÿ֜ä¸ã§¨#‚GäŒJ­!‰ÛU3S.÷d"[ÀêŸf*Þ Šb•tìm‘„oWü&¢6=—®?9ÌÈ;€JÛ8þÎÃ17@2Vµlô/ÒM,‚M¦È뵒z~`³hµÃ…Ÿâ*G2ån'Šßý¤³/Þ©i’Ô"Z‚ñ¦GâŒþ"P”å Yõe}«Aº ”d .c·äzDcE„è˜æ<1+Rßýõ5°¬*‡S—|Æ5³%ÑÒïç23€œõ4I]·³êØTÆ­ÑíÈfuhi•-œZbjyãëÄœ#¤‡ »È’ð(2’ €˜ ‡§ÑJ`îGá+åòkÝ2Xi/âw +z·Ä(ך‘Czëjpöæź-ÊçKؼÅX +­J:7ΰ9®é ŒÿªðA{ÁôYú~±¸Ä„u mQ¯Ì’ŸUZ›„àŽ¿ñŸIŠâB`4ÊÆiËç ¢ÿªI•·éoøÐÚ¢Z€¿©„2ð横g¸G³Ä¼¡Í ³ÿÂÁ©X +¢5˜- 4}û¡•YlðU–ªä,ž6ÒB‡W@’b$!á[ +šÉJñ÷ÂBÖZ +² òCá(¯Ô¡Ñ†2»c0,i§âß äjèÓ¡*ÇùT Sñ3²SB°‘É÷/íÃ"laÞ +øuá·v¿ó:âÛÃþ›Ÿ‹ …i›ç õÒìv‡‰Ú}¨Sòoåæ=÷_[p¢, #ðƒ°CŽ*câ`á>”ž{Dó0ð1@>#l´Œ· ¹³íۀÃÑâÒ¡Ì÷"ƒŸô!9ðä!ÅÏ=‹ªí4…˜T*†LuS ¼×Þë‡êþî,yOD_ÞÑm#+›R)ëȨŒ"Ê^ Œ3"Bò‡o̒èq½¦[ à•±ôóñ UÖF}G?aà V fnVS`;d7“Œ“Ÿ±|F ¹k +E:ˆie-lOÁGw˜i@øD•/æU× M ªü¾Ñ@¨a‹… ’¨@L²ÆjTçê\ +ÇV³,©Ûœ¸TÄ#¥¥ÑùL}@ð˜#r^s$³? ­‰ú#L ¢ zûpBU1 š^²N\”™*f¸ŽûöI5ÌUó蠖¯ô~ÁÃïåçE¯Dkk‚ý炝*³U¶m k KËrº^Š^'Z{ác³í0ñþ¡;¿ª=í¥,6`^X¹BÙÌɬ•J’‚`F5}“Œ%·ÓAšXîkÔ®çjq¢:ª ¹+PF¢Ô1æ«°©eî/ô €~äWs8Çs–ÿµB7ðÄDîwr#"'¡±OIå+Iß$݁Ýç¡¢¯)mC•ZãèÀpÖ\ˆ<뮖-Nÿ¬¨8å@Msƒèh€Ý†DoD ÷„nÂòð$L~3VLL­.œv©v‚½ +Sæmªô¥Äº)Òn'.† ƃ ßÊF{ö8é9"Ï??] ”ԝ9Ùì“R³á%WœÅÊ㎤[IžƀC# ½_Ò9¹ÌíÇÈG !s6=âê›ÿr0~ ìžå9ÿ$U&R/%þj§ ƒÅ6Ì ù=ï¨ +\L«hG%Åpa¬µ"ꨊFftVûø9ªl)µ}éâэªCëlÃ!Ëwtžt2‚LÚð“¬Î„ ¾aë†Ð6Í|`r‰W‡Îmµ%‰ÞR8Ÿ=É' a¶wôvÊ.+M‘ªrbf¯trùë¬ kMzïœ(däz;("e +•CáÓÏÀª@a:WœÕ‘(¿ÐÆ}%úu⠌ªâ>Ááÿ-?žüE= €SUÃ<¾D›ê/tkÝ6BÉÜ$Fß-;¬’Ú ¢-·Ša‹ÓjV{,ð…“Ѫê.­ZÀJ¸³6‘Ò${ÄÓ¼ý¹Î®"!·ð¨I6[cäú£8Ø%ޅ]¤/¡~Ä££EÊE´z†¼®we{‘,:»í“„Ž&$=Äø™íÈÜC¹ F­[ۙ.‡Çƒ¡*|ÑÍÜD°­~`Dœ^‘oð3y˜”<5$þˆ)0«üH•ÃJ•·ðQ,_CýçpeÞÐðŽ<|XÀ9{¤ßœmK|¤¦\^YItќ̦ËoúXùˆÊ¼Eá‘£ž€÷¥}Íà¬`áã‡Áiœ²U é²µ>ö$„dÀn`0Åó‰ÿ +Ì{®?ÁZf‚Þgò¿9¾&ÿA¤1z ‡ó‚€þÄí™ MÁêÄÀ³‘À±¢WÕāIKV_É:ÈsO P· îl_!ùÙl¦æyp>ѕ*BD“øjó¡Y RjcmT@Þ-ÊD^œ«ÝZDAj‰_¤ü¹Æ‘£~rڒ½•†¤$ÐC6`ø¸˜Ý{6CzB~äI¹"b —qRG†u³B~ʎ곌17§àL«º.-{0£°©A`üS;F^†Ú ÛôZNù™RPP^dqäår gŠhdµQRpŒ('CXV• ¾ç²Rx‘tàc(rý[”àæò£5âf2@Ãm˜º‘Èg"š?[£‰Pn”É* eslºoÏnjU]_w¸öÈø^j‚â@: +o«^j4„ +¡VmÒàm +•Çp§ø3 ‹4Ç ?UH0LˆÝ!‘ç¥ÿ¼03ʙ=ås]¶Ö…U2Ä$ë‘ׇ:ª>¢ßú ¾‡î‘8‰±©${ՅRÌò¬×d™dþµJϛTƒ²!"h¶:1‚CÏñt!óþ1^x4Šf„º€.Pޏ«Šh$b§7Qþ±à}t£o(‘^ÐX”¶¹äƒ%Ò(öw,€N»¯WÉ. N%ƒŠ"‘Šb$Ø?‹îý8Ôh³~ãL^í ‹óW•7ÆT—^ Ñ?=Á%üŒØpÍGµ7x4oá_e¬¡!ê=ÿ@ì}IyKðÝf³ü +[Òs€9ᄃºEHg{¨ôú”=ïÐc.XNJüτ™žOÞOþą'Ý8õ¦Ád<çڈJŸÌÊñûÆñÉУ××c¿„ãŠA`yN§1)æs1Á° +Ó"iÒ¹è¾!ß9öûû #ã÷è¿Q;,RËbSÈK&Ǎò…ƒËÒÊíÔµ÷[I",¼)¡ªŠ,C xxÃäUM‡Ÿ®Q~°ƒà¯Hç"‰Vx\ÛàÚ@ÈhÓîÁÌåUð+Î_Ñ!¦¤Àžb<û"KˆICöRw? +¯‚6¯S¿mÓo?ÿ]µþ÷Õß­.É†kî§,4ÖsÅ1ŕk]ƒµnÛ,ú×âU–Àžy…?x¬ +ĶA cCt» ƒNڋô$/RÿÜ;<ÏeTî#~{Q±'â*fÚp÷"Ú»Þ1žÜzÿÒv¹žó²|´MbÆ9uÔࠆší†kHòqï÷Ãü– ÃgÙg@À3ì_°œán…¯ÑvNd‚äHÄ}ñ**”X@»'þ ßóšJ:GJü¤2‹á±ú}·)€šÚîc#RN2 vèý—‡óNpL¶ð*Å䛄¢w•»ûú~Œ(Ø¥ä2xÈEâ!@5Z‘IOo·Ûã Y·OnŠ®5š´=™6º šæ"úJ1îx·ð0B=Å%ËPøถr‰öځ)¨ azCŸ6TY§7ÃÇFX"¯º‹xd´Qo”?)ž›ˆðI⣙Õ_IO¦c9«ètÒOOˆmFïÀë#œÈÖGJáÿöª²[¡.\4öÏǸüï?Fžò7¦’iSoíç.¤ªa6¨uŠ\‰ü(£\Z é(àìՊ€2{̂Ää³ ã¢HSI¬’†àAûïÕ0)<ÍK. ¸‚#U%„ŽH"*€ŽOÁAHÇžCOµ,}—©œmH¢j«Ø»,g{è¢„ä†MçV5¨’eð‹FYäFò8¢WXQ½9!äŒQ}æ">LMõygÛñÿ¯½ožH°þ¨rdï×ñHщR$(€"ҏ‘`ÞR5k“!Ô ’ˆÿ$Ü%ä¼9½ ú«m*j†¼uYó¡è(C4¼ L‘™dî«@N¹]AÛUœ¿ yü,*¸|_ ]¯Ø›%¯mP*jö¾0-*ýÄ袢ð(û3Té›z·%}ÕUñéu–QöW« +Š¥°OÄÄ| .‡g/æQU¦­%ˆåä1÷Å|wÞ?êÔ÷ùMš‘ðÈWOԝÝóo{W#Ž‰Æy/hðâ#®:jÕû¨¡túW[ΊŒGæCSVSw ¶/˜jK}‰¶ý‰ ‘–:®Ó᠖2˜|©‘>‰¿T˜p| Ùµ•9`+†ß’×±*áäe¡âp>’BIÄ@@S–ºÁ!YQf*! \aOÒ&"'ًgC‹òÀ‡zºç;f(í~4配­Ï¬ß.@(zÀû9{ÎpMÐs¦¿1¤ÎÇØu•PH8{;ˆ]cö“Ðd39Œ/ºûã(°Ô ºïó÷À}’ïç%·Êޞ|åáBVK³Úưﮚ-ÕØêÔóm@ãþ& ¦vۀ¨ŸP®Äïñ3˜Zšë5ÝUaô0^½M‚Ä\÷§y‡²OåBÔ…Á7碤sJé%ü;Ré_¿}â%âOUHPPÈ3âøJ5üüµ”sëª`ƒmâ5ª{/š™«‹:'‚y'?·¹ÐúÄO!‚áؒY\(H#"B¬²‘€:"W°.ù}>ÏÚ§æYE9þÒ8“C ÁèôDv•Í} +ߪ\LÇ;A­ö- õ#ý`Gw³jC13í±TßiƒpEF@ù¨r¯Q³ï¡ªxzâ¾Ã¼åæË—PÿN‚’õ(iQvrðy=‹%ôL—ÆÛeó‘ûDˆ‰ònfý³y„‰àÙè®­Ú¨û¿ËàUC¤ž-Îf—´(EƒÞàb €š HNž#™ÝôNÆ·ª¼*|2n`Û¯<ÿ¥(3_Uhž +ƒ=K¬k (ŸçL¼ðV©þM@dÄ0 Â:»»¼ªK@2«‚|@Kì¹$¿ŠÑ›­²µ®¼ +C97\ǬC&¼7 º†±۞Z¦Äó݆‡ý¡Ó»î»z—žè§BAߍ%sº^DŠ PBð‰91œìašÏªòD•£_þ“ ª zü] 8ú•)ÑræFöý†+22 ¥Èf+n£6!F„IZD GÝAFمJ.€8ϳ4«'1Y3‹CKëòW#85h_V1•#Ƨ^0pI-~^lùËàèk$­˜×õ"káñEª:«c1}‡[–‰â“IƒÈUœ%ލnBÁ›‰ÙG¼“Á>áËXÖ I‡ê1j®—3=Ì2ûLe.Ôκk?<"ÍoØÔÒGk Ýe@ӀL9…£×ÔZÚ× ¹‘rDŠƒM9O b +›;S3¥í‹M%®ÆK½&{Z¯p”vMéæý3¹¦zMÅ­éÊ4ùáÒÏÉèWV4T^Uêpk´õZžöãé(51ä J‚&"¨Ù<~šlœ›=*â3¡z­1A¢¶´)ç±´[B]4¹>l"M™!j3åOºÑ„‹¦ÆqöDS®7fM)ašk$×mª×4% ÍÇ +…&Ðd÷>jûև ãN&²Ó9SÞèÈîàKÕ«&Fb÷¯ G&“™Œi&b{iœE$SõPö“*¨Ìä) †žÃØeê‚HԖ©%¢æ²L}êÊD=7P”Î$ó„5¦²ø"õÿ@Œ]®U¤î˜ŒmìÆÔ ëäE$Hœ­R,«¤ É (—6D}œÉR|Ô~@r&[‚­LÀǶ@ñŒü¦Â]iW"‡‰èჴþF®¨®ÁÒþÅñ@@E%ˆfÑ?§ñ Q?D4Ê2°«˜’6÷ÜÊøÙåÌGî’P °€¬·6 xQÛ7úBý„rgg‡>!ÒO¢ÞﺵÑßGd׊úT,kÍB<ô4Žì@u]ù1Ž *p2}4·8A$• SP•.".Žñ½0‚A«¼ÙõUˆ²“ß]F3Jõè¤'Æ῜1= +¡ê*£Gü}B +Ï£§*pyö¨[®UÛ ðÞ鍋sô:sT—Žß>öŽ`߸˜³£‚²ÏC ›ô6ÚÁϚQvƒCTæòÕ ¡íqÔ ψ,C¾á6€³R»ÑT°èurœýMªB)…ö§ä”ñBG„(¾w>G̊¤ú‚Š;ԍößmÏ]Xÿ7«è›#6Lڜ9ÊH®sKðrôçFôõL½Óó6ŠK@®õȽ z@ãèµ»Œ°…B Éîù|Š“®Fšµp†Õ&Vԉ^¢úCU€4ÕØË»6Â.…7”6r·åÎF]ÙèÞùÆFd¢Ò˜ª7†¦Àç/܈)Š¯Ñî/Ex+:Z»FSÞäç‹ÿ4}Ø_ž3ZJ|l;máLþ´Îy êŒ|`kO#`dëJ‘%»ˆR°:@×TçY¨è_€±á} •Š¿cD}i ¶«t'Ð ^1“¬fx€Ä¨=ê¢3RFØV/"€ÇÀ‡°JÃîOHç ô_ÙK„½0AŸR.Ú¤^EÛû,: àÈ(w-ƒ%dÔRñØ¡ý£Ò=œéógé"u1:ŠòëQ׊‘Ô¾¡Îv„:ñ"nŠZ¤:¼ÖEX1©9ALZB×Ù)EÇnÇM7‰ZYÁ¡‡›Ú&Œû§ºÊÁÓSFNòì5趎iFï”øñ¿¨“y¼é¨ê~‘3øé{ô|¹û"Åø)Cr¾Ú¢¬á ã÷¢)¿ +& £í¤¥¯í%Hv.²ÌwÇO]{eۘƒE1h¨ú0¶EՁ“5—-’›Áٓيb¢H˜Ô•ŠçS¾eMHS”‰‡.¤úAb¨7ÀuÇÂóœ&±å²¨I‰Å§R¥k²h—W¨ThétÉ>Q$ˆ1ä!’f¥..yŠž¨ôeÇ-4 ْþ[KtÊfB¹á>Zé®HëÉ¿ØN ºÄ[ыt‰ûøUˆjEà,L ¢kõÁ› ¿T*âPþ£!*ª±ÕOd­ñ@»^Š"!Eš‘ÍÀӉN‚ÙûGñv ¡–¨nuԐEQvMšhagR#rÜ3ulŠìÚ0)úDà3l‰šÕóDYgRo}hÀ0‰éT©»PIã6?äPälD‰( ª‚jFû g4\;rãmàlw‹Ø9¼Ž”% +•Î'ÅFno"ÇÀÖÄÀ¶‰‡#ÊƉµ endstream endobj 114 0 obj <>stream +‹ˆ@ÎGèÌI"[å¶Äž‹ëH”jùÏþȶÂ,z™ˆä ªª±CÕ÷©€ˆn²?‰œo>Të‘A›{ÿ!Î8ˆ$ù›Q›¥ãERAÏ©È#YBü:–µy†œo¨v6k0!Šæ„NXˆGÜÔÆ»¢³½Êæú"©crEtbhïøQ%JŠè::Q< „¦‡Ò]u¬&J{P–]‰ˆB ­vތˆrd/Hù–3 J{ "qvz¨ºÊ klÏPϜ¨€@G<½ìÐ+`Da>=W+¶"²>ôÈùU‡&4"ïgàE ø±x|Å÷›<“>Y&4ˆHs}zJ ¢¬öö"œå¡5¶Rj$†0q…4|T046ÞCEç&;T NÊh #2ÈZt2,@öÒí˜Dý”¶9‡êPÝ’¥'¼H5òUšª)€Ô6Èç²8û5z1Æ׿e3o¡|ˆ†˜Œ±œJæfOc¾$Ô æú ¢l[€¤:šêÕ\ç +—ƒ¨c¡U5˜WMÊ`»UÅb K&¤ä\ˆ|’„¶-ùT+CboQÂ"‚­rҕŸCQÚDΖ Ó6‡˜G/Pë&]HChÌrÈÝR¹¿ ±c“”e jÖÿ\Kú“5!ýr΄b«hZªÛ¿•¼j_?]vTîҟä˜effÜH¾«AM°øÁ,< ý-–SPþx>n¯4ü ÄqÐÁXHçÄ^nL„#!%[)|ãFw.° ô³ÍÆ£C±[Ð;e„äÈQE!|©©ß¨°ÎŠ¾ O©É·â.*õt*¦Šƒº'š³b „¢Û KNöïþ#sx%ëçgê1*cæA¬ÿ™IÃý⬠+m/cX)ø9Šgšëd²ÓdTE‘Lüÿ+ý ½yJBû[Âb»ßT *uƒ;¨¸¹ì° Êvv ”>«A”6 +bEƒTš ,ª¢}ùE°a3¨o–ATûl2 öÎ?î®cÐB¹¨ô®Yq_ BJ†}¹;æVŸ ÕkÜùÇ;÷öNZ„·À§Ë^îÞ6P¢Qð^A5vã%Š  L±ö@A@.hØ¥ 6ž2,ôC/§†#˜É™f”|¿É"$`%(DÖó ~8ß@DéGPß«K#¨„ÞÄè:SÒ0æA=Ë/@þ@½iIP8¦ä]z¾QB>ÿ²£j=(è“ÿ08םý°Á=,4—ngŠxe ¸]çˆ ŸÝÂQ¹ëóÍoN›»Äp³@ùé¬J}C?|ò(e@X) +ÔåËUfò"adº<ˆ Ő»9! DÍ(™€R…ë"Pi0 ºûWBÕÁgÙã¨eÍQ܀`CpÔG0ë0ò¨Z +éúdñÍÐÑôY£'™ ë@jìv€Š L꬚þOÿ–‚3ÿ¡ €iÄÒXi[?‘VŒ ¥éhÆFåŸÂ +_N¡ŒhL ;¨„ÿOAÕ¶ÿS$HӋ"€º†2%Õt«ÿ¨K c<ÿ qpØÏb‰°íŸX¨æsHú§]ΤO§pÓЂ,ÿ”‹.˜püó,“wø‡í³çÜQ=æß‘e +qW~¬Z^÷gfæG'êC‚ÔtF“F Îka F‡VöWÁœ²ý×Z=éȅpr«y&&R¬‡@÷ˆ€ ã¡Vgâ=°`WÃAøÁ‚*ý´ÞPè';=ùççkgèÏ<%ƒÒ‰y¨% ßá–78[?±+¬ß>š[ˆdL?Dª6|^A ~ÂÅ9‹"àЮQÅ.#@«¾Ï8™a*®?$kJ#żO ¸û v ë>/×6ùŽÁYœû“_# +ôÄ:#Wê÷PáiݟÇ>fÑgþª …}¦ôñ³u~V€—ÇG<|ߞTâ–öä#ó¼Â=«Õí ]¬×xMêɤ†²òÔ_Õ²•àGŸÕç^¶v¨,>çù£›í9·ÓÀoùèQ‡O–etpM×ô±b{D€wÉñ4Ïaù;>ÙRæÿ`,¬Ä¥‡>w¨JÀ 3@¤ö8)V7ƒ6¡Çã5´äþžÏҍáw!T2Úùßსuó ík>ñ +êÕÃdm>Dc,æÓjðÀŸŒÝ`T•`ÂÀôÕEµ<oïCÕ”|~à(!cÌOàã4^!•Mf2ü+•ÌB„úž4ÇŸý%Êø Mh`»‡T<Ñ>¥ +kñÁ|8cz,㳺„ºH¢‘Š½ŽLî÷@ˆҌ¤‹ê=äÐÚEÚO)#ò +B/c§Ï¹+0E-|ÆÎéH®{zû A¹g§3Œ›¥árf„ûíé ŠnO 7ˆÛž€5nšÐoٞq}÷½þfÅÊõøÅñ%Lõ´­=ìO=¹†wؓq9¡®ïT̲ý{>䍔¤§BÚA×b2ë$C¯îìˆm¦žéÚi‹x^Uͱ=˜.Ç ~ïÿÑs@¶ÎŒ^ž{¼WÇqf¬Ñ“…ŒûýãëÎ%é™_ÒRu§Ö£í€‰áãüº®u|Gò2jß;x·Ë¨F»—;8"øð•*_rgâc›Çyb–Ê2-î @ÔpçŠ÷f‡Ò•Ê؃ ^ë9—v¶“‚Ž¨pìXkN%‹w¥ì6²cËÅ~ƒ1ªn'Â>혡éºeí¼#ìÐàʺ\ªê£3í qAqGovtéF¤™ £o5.âq^véRuÔÊ£+ðÇ]*e“å.§å";'’S>Q¾¹øHø/Õôí°ÛçK¸ÉûÞÑ3ÐâŒS¨‡þÜ-'—•:\”{@=}_ý»Ö*Ð~ȧ”°AæÀ‰•#(Þ«y5M:ʤ[…ºÊL…B¯Ûh‘•$ÖD¤†’[6cÜ噜lΖZ= Fj©ƒ¥µ&ö¾õL\5bFéІP +_'ÒfG8,ed9.WZ„æ¸ %¹¯Í¾¼»ýŽZ˜¾¡6˜ñM¢÷=òÏvµ6P›_ç厷g긥ÁY“TáœO¦r¤~ï8&ËTÿu…HüÙçÜÍöR«‘×ßmMf´Ë°'¥½pA9ЈÿcÆfcžNð_&¦¿8Ž8y›?¥u=V6·ËB¿ +ZC­†äiIêQ¼4ÑӏãÉ}¾Hòê€ÉFݦ"äî®Ý# ¥|§ºª`¿ã#ÂÇA†b ÆËF™ùTÏÖà +YóvJ·¬×G¹c8²‰ ’HՍ=¡ƒHHb´hí·üýVk‘Ùh‰‚ÀLTðmù¾4h·ó8«R´dJá&hK %Šmºœ:ª™*Z0VY’Ýš ë’« ­|Tµ¡“öãöÜTºAÛgF¹,¾Kǯt àž+¤L"¦ÎÕJ)Ë ‚Ïå9&áŸÅ’5ØËçØuãëŽ +ø¡1ʞÐ$ÅëyqžAlÌP[l\ó©ÓAÿ¶üXº-5ûî›jg|ö½~xL§Ìbُρè¦çöB׃-x]˜  "¦šXAï«îßæÁµ^…|3z k!ᆼ÷Ö,„ÿ6/Q)äåÖg!žp­1H½IB ö'_WÇœàÆ $®†¶ì{û(ÕfÀFAÂĄö‰žÐ݂ æû×ǐºsnqF—^PxOOêHxÕT›©Bš67ë­ œl%ËAk•îWâ6_¬ —ÎßϲÖð_á4•º=xڑ¦j>„7=wº7»‡áŽ>ïæEšƒ$´ÜtÖTâoÇjäó ?«füUh*~Ą.Ó&9±œ¨È]2\ô$¦Kj€!¦Ã1€¥&$CgA2uo@#—nٕZCKë’ IOô-KКÀüpV‰b#óÌ[Ød» àn²Ò®Î +y@î›Jne šÈ%¿vâôË±€CŽ«¶¶phÙ¶8 ocü¨W,*¡I¼ñ€¯ Ælœ‡õï ™3ÁP¨¹çžeOŎß|ʕÙKyB›Øw®†´&br(­×^âö›ÓW=aLõ¥óñS2{®@^ßÝBԲΊlñ;Îf‹ý᧊ˆFn¶OCŸ‘]ÕȘš!#ÿŠìǶZž»ÖÀêHªVx:Ð.%Æȳ¿,>K_°¼£*s2ÿ·Öð £ +…ÿg Ûô4TAýŒcµúhK…‘N +VƒB}ùp|î¦(~^`‘ªÙÖ/ËæהÛßî’T®ñ 9„ÄÈ)1_Ö ½ÔÕSÀÀ®ò¢§Õc¦ì‘ÞT»*ØȏЫ҆/ZpJxÆÁ¡*ÁEÉÊ|;˜Š­JSܗ¬l-,“W~áÅ?ª¡|_ Ôj¼3^ éãáÞT„Õ„Ü'z¾Ó•ÏH+ÈÅïk{o½!¿‰(ˆÄdt5n<íÖÌ僞¿­T¢*x“Í&ͽý8ŠÆû?>ùµ¢åÔ[:©Øû£¢xY¸ž¡Ì¤5û›*u; +쇄àMÕ4:8±L`¸˜"PifÂޒ&kâ QC3 /$ÞP(D:„ï:AØîòo¦ק— p#Ð) Èž&§è¦FO¥ùLVœ‡Vù`Eç-ëÆ&d K4&Xƒš†:9óio¦«CÀo³pª¬VPÌ7»9â*Ÿõ‚ ±L=Ö rz&õ3dqÂk½NFÒ °1àÇÃk 5©‚ÛA q´£žLšÑԀ–kg«hÉña!ÖюÙÁá}:EÅþ›àúE¢>ý ¾>^†?†Eð;p¼¶r­”2@¿ûŽ¢¢Ž¡Q†rD<ÁˆãZµ¨ÿ`Óß8 ‰ÞÙF€pj†ó­|lIè!yb}x~PÌúÒø–ò«J¿È{uá4zËÚ}ƒÔ.Gȃ«WÝéAMB(}é†;Mm#:§ñ8 ç¸AkéАŽÈTß¡YvH!ŠˆÜsΧ»A% aàçûÉ%Ó•Q¼oÀñEÐoGï|ѽ•Ri–jT¬ þañDÈ$åC_2¥º2uZI‘¸haÛ1·ð Ÿâª€ÓÇOvo JŽãwТú¸ãöK\€y¾åƄŒ;ßP¡¾…w5Á?úªJ „ÿŒp­dÀUFø:܈>ù|Ž‡~3/pàÉ<âJr¬¿ì…HÁÏöë@`À/>ƒybJþÎÞ °è^z‡Ä`r“äšQÛì?jn[ÚqÞL )Xœ_Ä~h9ká£Ò‘„z{¤JaÕËÚ˶Ú÷@óV÷fòq`ý“•X¾òÐàãÃ'*H‹ÖIÓY•®ðÌ©¼'Ly™&:1 Ã‘Ø«Ë 4ÓA²ò(õ¢Š7«â‚õî0¾ÀXÿ¾ÞÚøE¹™€ w†“y¨_ÇõOA±‡þY¥ÙqAºóÒùèРIZ½!ڑRÝ1yÖ çùjð&ø€$l,uü’ìƒRT X»¢b)׀ÀMØ,⚜Œ(»µ.³8B•¯C¬ôó Ĺ·È„ÞŠDà%ØÅ_±Àx§s¡ËÁ•[IVuÝ÷¾Ä‰.#◌#y +mßáŠ×` LæqÁ¡ˆö +8JEø*)–ÈÂÆ3 ÃLpïÛöFa Ž‡$I”“|ßÔVæ†æۜo7Òàwñá~ž›tî«Ç7s ä½xÌñZnä„ýào(iýQCü»æPÉy] +gwNLȝ +¸³tqt\÷‘Ž’ÄáÕ²,OéV€lYÑÖ9Œ×„–²\Åւ}à–EMC Á´ûlÊw?è<²UJ„I04ħ<= ý—»¿t„¿Iý¢bz$B¹N-‡v§˖»Ä² ð²•ÈÂÉGRUPÑÅùYÊðåàMh‘V¸îJ†Df*T$WUD¡õ%Ê°A5–¤ê–«ÊïXF&œM—P–ÄÕ¯Ô¿ˆPã~?EE²Ê3"yFÐfju_w§i†—«¬y5·H‰\uMö•a|ý}±N”âýŽ ‡‘0òÑjž‰ ,ϝÒ0c(!öšŠœ2DÐÖ{Þe³ƒÁ0\†ÿ‘€¾P¿íu–÷CÇgÒÚ8Á€F£Ï¤¨rfJýu)ë­*‹LÒ¦õôaW^º ˆpzÖ Iau2»Š'kž°¬ÉkMÀ€|9lºæšè=Øëù†K€²•Äe`¥ï–(C´¨ '(-—3ˆ‹Õ”ô½¡Ën%dd:üÎÐ H(z ¢À·,H2ˆ•+#_]X$UÐɃ¹-~†ÝåÈLÇû—’x GäÌ;þØæFè¢î%æ¯qÏe߁%NðV¨«´áà³ [Ömßð˜¾ÄF¡{Ap¬ó%=\ÀQ˜„$Gl9w¨6Œ2+â¿­íÓ4ÞÇ í¬\ö±ï{kႠý”§ÄûÁV­Pu\…ƒ ¬X®p¹ îÚ0û<*h ü42V¢îåWV$cî^ŝg ,'+Že6Ò$i\„RçFôÃ'bl\v²ÕS h/À÷P‰8 „Bò cÙ-ÂsÖbÇÃ¥¥åÇ#naÁ{k¦õÍÁC¦! PüüŒºµy9jºª¥÷É+á{ÙãÁ§}ö9\>åÎ1„@k"Ù2XÐę3N~}J™ëcÞ×_ck“¯+=z¹0 ¨Þüê»ÊŠq¥^mS@-àêQà$¸œ«ÖmJÁЩbÊЈô³¨‹šÛRÌ J˜à$̓éh£Á-–ò|öƒ:<8dúCÞXfCkB $e/_ôDÌÈô<ú0™#ßb‰§@F5õÉ(æ5{f™åi¢Ún1Š…XZW+yíù1|Ðsìä$ÍÓÙ¥û§ø^ +ºkpÕ[šÊ›>é*è,+&СD¬ VŽ´ËBPa ù)ðiâJÎzaLäBç{äLnc‹ÿŠ$ôJ|íz+a·M½ 6Ûq/‹˜>OxàÇ“o›Hüùߘ}Œ·{³Ù‰¨/æÿ ñŸ[¨o,[†«Â žÈhªò ܠȦ;z²6‡\f—Ó|IkmêÜDÅJÑ…FÚ\Ö£ó¨dú R‰(Z¶&"¡Q“°1ÈÒ‰ Àؒ¾¥Ö}/™Ç<~è[–tL[vÄðFáǕŽ€„dˇ哕Mp<“ZoÊy#0lŒè¹¼‰›šæº”w+VãëªÀ%„Øû£GÓ㐳#ŽL~eÂWƒm"`ÈQa\,ñ«ص†mHX ؇&³ºtGHÃÈÄé +§¤Ñ^Ùm<=¯x`3ÒÕÚþ¦4-¶OÂÂ+ڂy:ˆu¥ò,ō°+÷w\™@]ƒ±hšX¾Ê¬ü/¶ ¤6—cû͒½úˆ¯¾`ƒ CbZè}V +" +-pTù#ÔZÜ£r qO¦›«g„#dþ,¯bq¨égË<{ŸÑ\o ïW0r»§x{ ³òO±fû¯(AÓÞíCПð¤èQDvkÁQ7à³EE—S‰àë³J"´r…ßIÔâÏi< Pnû½1ֈ'2ÇUó&pF0SÒ Èæít‘¸CT‚¯@Ú4¢çð –PÖ®º ›´óN”.*<&ìÑ2`ON2ÆÔÕüL™ã@â³…º€< }¡ ½þ¶+Êÿ¨í­R=żU§@†r)“Çàpi"g(Ã5¬ûÇÿ,N&| d7·3KÐ OLò9pÇ@Z•ó&CN1°ÂÒF”µ4"®ÙˆÓL×ý9ýÉÁô +À·ywÇy.ü½00“¬Œ› FYÌ#•(qÚV½Tjˆtâa;äŸÿ7:ÓõxbÑOißƵÁ¬† –ÁpÌèyä  ¾HH ˜Úmì_^·Íÿ€Þx„çaƒrªp€§•K¤²6˜NWbhÔčc6ÞÚW•a;üCJA 彄”Ö{† à/BÆöqô+•Ñ£Øx•vƽ‹T}8nÏˁLBi¨ƒp}©ƒ + ®¥’­¬èùX×ÛÉ0ÿ3 +‰ts)•SU·ã@V#f5LYþ~~i>6úՇ¦NQáÈiC|«rÀ«…0 à•u’—f…š‚#ãi *„`•·ˆÃV9…÷©!PLϝê¨Rs%_• =`b0Jï- +†zF«¥ºæð>îZ‹Æ ò€ŽQùL\¥†d¢teG¨¦jâq@£ ˜u¦s’ .´X@ŒW™hKÎ éytÅUaQ²Œƒ=±(È3w KàAïàïø}C)êÀI]­aZìj0/ôÓòEнä*`D&YGy÷!{4Ôð°‚Z«4>e)Ým¸ðRDhè9¶‘±›-2“àóÍ(ƒì¬Ø¥óÑ2#+ı¡ü&5J§˜Ï_¹uUqþéI¾¨œ$}+¬\@ÀTùÌ;¼-œ@ï$Â%è»&@tªµ5‘_ò3æ:C{³i¤XWi²»ê./ i2¯ÃÒÞ˜qç‚.!ÎV«tËî9†øj‰_ÑÌv˜¦á\J¾º“|&-ÅZRWשÍìÉ­+‰!Iï¨J;Né \Ý[&{‘aÜ®îð-÷'_­QYW1Y ƒQ å…O¹Ê9èþè:À<«I*ù.1jœ–E(yA”ô¤f³Ñ§VžßKiv$ÃÚ8àké%Aµœ=wøõfªÝdݟɋKs |Ue%IÀ¿W,¸WG +ûhì6ùÎYò&rÝwџ%18m] Kqà'°ÈæX n=9»ˆ_ +ÚG’¼>jQ¾a +Šõ²§ŸÊt4÷a-ëìa|6?ªLÈ·u’2¾ìƒ[µØ í> 9xlcKÏ%ï*Wî*uö~$äDb:H%ÛÈ*¼*ÀN搟É+AidfÖ,ãlÜyÏ¢IGo="‡òô•@ÍN¼zúTFAŸ:-ƒ~° !è09€Â!˜ÆI’¬—ÏÕSŽQàÍQU°sY^ÙîÀAŸÆ?¼mwRFÂH{=…Ñb ‚£ÁC›„¼`Öq¯§6vÁÆ,$1Ã1¼íˆVµù¼®÷¸k@ÐjÍÉHßiø‚QgtÙUÉòÐUvÂymt[0úXÝí[¥ßò|Ày +â8*–âò™ñÑÈLm&ÌàÃ‚–šEo8)HŠ@j^ c;iu^8»øGÏÜó bF-¨±iw^™¼(GÆ.,¨/pZF¢¿´sØuxBËä u͔D·®ÀJ[1`·‚¶²¼ëçE뉿%:9ðcØÇP?£ŠCIj´ +Œ`U·ÍbháGp8¯ÖƒÀª‡]ò—ÑF†>¥°ÝE·°ï&|Qß 22¾; i… éÊ "$VO£¦LõrÍ1dv;ÇPëEä^×,&óKÃo5£±«¦mdÒ2 6¬´¬ªàD ú†)ËQ ä@ۅ:¹!Æv6ð…¨+”Åþܶäe#šáaîÓà_f£sΈ×ؖ̇S+Bø« hX1“ýbô¨&G+™µÈt>J aÕxôXŒÈ8C 5žkåugB#A‘¼#gëæß@hDæï„ s֚Èò¡›,ªÌ,°Øڇt™5Í>àšÎñ†‹“™Kd2Ûq\1ìFКܰy0VÏ3£¥`ÉØ?gPh@‚KÚP¨+¹'Fš­o †B”l…=ï%±ÉxZŽh߂k>X¿¥Y•"ÐKoµÊJ`°£€NTûF9ÜÓå2„Çðh=ê¬zŒl®˜ú<‘Aі)™;»_‘‹`oÉýÌ.`Xwn)ç‘ZhI²Œ¢ƒB¸i;=º»Î.¢ˆÕ²]²-rç[£Ût@»ùû^Ó×#²ú߯BíJ „ŸWM‘Z¿Aä«7ZtÒoÎCœ®¢¨k>$5ÞiÁa¸à˝I Ó¶ra™ÌÂ¯¦²RŠ>¨ò4 “ÆfÆW<`{õ‚!ÅÁփT²SÂ=õÁñ½ ÒX?ėġ…êp4¶ÒOŽQÏz 8ò&Lì1œå=ª†š? i«ìÒÕºi†Â»[4¼7õkA¹Ðg­.I›ŽÕ°•ÛÝöHžW)ÓTÓ)”} ¢?Ñz^^xQF”3õàv†?~övø +&tÉis¸¿7xø†*†¿¡Rü­.”ó‘!¹«áá?ÍÅ·½ Т¨>¾òµq%ÞÞ2L•›<½›×¶Ü&½X +×ù~[єP˜@A’W@v„fPµ ÷²å•I•`E7Š–ï$ ~-…ˆ­IÒIÈCw+lÞ¸ŠLwæU®IÍû³‰Ã¢^ÔÃÂOe÷Ǩ€Ç;âÒ*ìæô¸×R~¦#1oÕ)Œzä…_\| +`°+ÄcŠ Å½c)w 0’PEY_à ùëZ˜OÛfO¬7±xÁÅÅ=Ô¯µþþ‡[PN„ÚðM¹K3 L’lq‘º}y8^,—¯®ñô0fôq“\Cé1¯P°h"ÃäÒú ££e"-Î!Gºñ˜îªJXiÛå qX бzSg»¦ÀP1ª¢» +˜<Éw-8zHÎÍæ%ù)ÎÏTžœø°ü© 3óY]Hq+¹wé5»ç/ÝÎ2(ëVp({ñÙ ´)Gùke;ê4‚åL; f×i4dÓÍ.ý‹È]^ùfBݽQÕ2TC*´wą̊àú´?¯0O})ÔAÓñ!±@ÁÅ+Fz”­ŒÅ6¡&«†úTò(Óў؂ŸR‡U†¨* (‰ÿÔNõO9yêqˆ#<\»ÊÔ'£\®b5ð'†û©\‰.ŸÊÒáLJä#…7>!J†ùÉ/ØUß$?¹“„P•™?‘À•Ïá1ðÓq4j’ŒyŸÐìÑÛú¾²u@Ÿ´mAí|²ìöØ YØÀ#¥dOA{à£S½l×*zÚçÈ!|’žž®åæöë¡îI”S+€‰Ó4mÚsz¦Œ¨]~ ڍñLٓ{!¥kîðð­»™Ѳzç.܋Í4~¦l5Sƒíõ=îºãÐLŠó҉»¹¨Oi'”¨îÒâÃòR»™—‰ƒò˜äsÓFÐ21ÐfíR¹† +y3 •I+áטjÄÎÏà•+©&ob¨%ïìџYTZ¼gÛ‡‰â&;yùŠ…pLPì¦ ¤1q‚}÷P>arrzÀ˜ +ãe0Aÿ²9ÖÍkbš_’Ä”Oîò0yÉ&À„uø"qqyLöæÚlù^ÃÔ˜'÷ 1(_|y:b#¦«ï£lß®aZÚxQ­—âWú§‰&o“ÈOjÀRJ:^ú`&©nÙU +`²‹õÿâÙ0Y[’]ðEâÄ_z.‹s€A¿ÔYl³`öÔ&'öۍyádç»l»š^òŽÈXmÅJ>¸ô¬ôI=à®Pœô.q¸eró•¤-½D™AyXFªŽl‰`é&tÉJê*°¾qRÜÀ\âœN à®x€%˜K\úz¾Â%†¼ÄÌ$pÉòç9ÎÍ%ßRÒ\þ¼¥î¢“´Ë¶^óÊgC2-ÓIbÑpK¿`®RÒ¶äûûl×8JšÛ ñ5Zr2þ¹.˜°´Û KÐoéZ1Ƴȵ¨æ¤Y28JzΘ¥¬#ÉR{:ùŧÖÉg+™—±Tõ_çïºÎn%Q…1DÞ+³R[;‘é,õr$ÀR1Zi¤9“~¥H“XcÙÕ¾A_‘‘õJš±:¼R­cêŠÀúFàÑñˆþàçl‚VŠ™¯A@C±R$¼¤HÑÛ«Ô"k£‘ö$z3Ցï_ Ïp—LxHªD]çJÆ©{üÒºK¤  …€6ƒÎ¦m‘;‘DRÒÜÄm’”˜vÕÝêF]m}VtW +!¾+$¼#ï¦æxGbóBˆû®fŠëh#¤~w½š*ô3Ûf/›Ù¦ŸÙÌGf;3ÌØl³Ù3f6Ó7ę§8`v™o¾Ù,ŸÙÌ)ZÈËÌa35ãælÈ`!É̜ï'Æ՜͠QŒ‰¼£$I’ü\fÌgˆ9Ž¤àÙjlŠCãÁÅDtD¢"**µ¨ˆE„†_ô#ÿ˜ÄOÔust5pGƒªí‰p…m@ôX¡æPYú'âVõdTŸÞ"ĜíërBԃˆ“ÕB˜È’Ú.á²0׳m5Z›lb×]Û£‚‡ÇIO„‡-\ÔvpÂÀ£y!7 À\[Îv…V MA”º7d*²Šá:QŶ/—òØEŒºu» +ÙæpùCùCx ¸A="zHÑËô:™šúé3wýB0@¢ØÇʄ‡zHýøÛíüàÍÌÌÌx.(3C3Dˆ@I$ 9`VƉô£"¬µlÉ[úöZqoÛ^GÛ¶%¤,¤!„ —Í£¥¶xi &×Q°€ˆ"r[L:lÛ¶m“ËþŒA­@H®˜Û°Ê0oR!ˆˆJD4DD‚üŸsޜ×k¹2uGŸ&„E{J¼¶Æ29L·f‘'II’ƒ$O$I’$I–4"9H†ÉQ’„$I’üÀÇüaêBpAÎÃð„É +ÛR`:½‡€„’l݆W`T´ôڎ°€ô!ø¯` „€<œN<å~ÿ¶Ç}ò‹ßˆüÏøCpãAø?ðÿÿoà£Ú¨”œÞ3 °²€8‰…¤H—Ü=€D808>B`XPªÌõ(„ ¤™)ÄEÞTcJ”=Ø)&<ý)Ätñp¥0«Ú¿ÓÖz¨%ñ ޑ3ä”vhSÆ­—?„Í4‚ q=°_uûôù{¸¦A‘£ÉÑ)I>[ C'ÊQ„Gö_}¢T‚R©]¥ªIÞª¸<羟ÅwŽû…,|oéÉÏ^©¢ÌˆC9ãRæ=©Xqçø$~ ízE.O”ª4TòjÊz³i|•ñ‹AI$Íz|0ŒØrVî(×RÜó-¾òM†cE¬ ±qF“4Vþ|ôj(ÜGü-ƦÅN\ÏHv¸Û`Ùüt˜—6íA˜vXi Jր.V¦ªã0ߧùlzŒnFŠÖãÐï˜Ò¤T€K ¾èóÜßÎç,ØÌiò„9##Ä@¥nî<+˜+–ÂÿŸPspáT2“Õ¼³ºˆ®o¼^Yƒ¬5¨X ݵŠw{µÏTÜa]¹òFä8Ã¥ûҁŠÏnN÷ ‚ƒÇ“Gjܚ)6\¢T`[2Wäykè2èYéæÝúŸt²cºÎÀP’í +cÇQ…€ f ÍnUZzŕm'G›·œ¸å +|m‚P?†|‘2k®Š*T?†3ÿE@{`X¬Z½ÚÐ.b £Ð% ³š=#8òíDža²î÷lFþC}¢Füì“R}Lÿ¤ þŽüQ¶€Ž]4Y-ÑÝ ´9]2äxÅ }Úދm‘å—Ÿ#ódâßm‚üõ\ȉ¶°£½ ¶V_µÓr´[ÀE4ÙûÖ¥PÛÒ5¿õÄ˜ˆ/ØÀõÈb0Ï=“6Á֘ûyñ-Þë3#[FÙË÷†Qép‘ZÖâ; '7 ’+;†`ÿK×yù7ö`düIw¢loČ`š@CñjXþ?!VÖՖÿÞð‘Žj¯î»Q6‰”ãzYЈ4²5æ׺aœ+JŒô3²EÙé5¦bol¨÷Eyg FIŒUöt½(›EÁF(X7I7|2‹÷éd”bsï.ÊqB“Õ‹rÓ¥»0ʄÐV‹PéFkÓÈ̄AµÖy.š0À±‹K£ddšŠlá%”nGŽ‚ƒ£D"çFùˆ/ÊF‰ÂRGYä+Í3U&óÍ¥µz±`t\t¬ÿ€Z?>JM<>¬2ìXØõ(ÝÈëþ °1†0(» ú(BÒ£ ®‹GùÊñ⁠?Ja=4›ÀtaS\RÊu//¹Ì`k¢ÜÆS–”õF9E‰•IÙ"g\“²!°NJµ<ó¤„Öqnʟ² ”u†YÃ+()”¦gßa)Ò1'õ°þ aU‡RD¦w)Mar);4|m)CÖƒ`óPÁ­!€D¹D³”¸÷úÀ¥¤_DiS©9Iâú—òµ?½”@1êR®Êw$âRîdûñK™;ù3„+ ˆÕÃd¦„ÿäLé–y-T;Ƚ¥S“ šç9}L5”P˜Ä”bôQ›Óëƒ6ǔ#4L‰O` á/eMǔ§ª;Sæ†u~êLѧŒ² ¸gJè4S¤¾LéÕ)HÍ[R—rÜ=fH¦ÜùåÅ­–)3´›»š)OÃ>SʄM¾RTšò;©¸Ašš²)’b¤vßedð +¬Ô˜†ÏÓ^lÊ}w¹ûlSîÀ¢xߔõ÷û8¥Ë(©V‹‘9§ã_C#ΡÊ~ºÃ‡@9¢Jµ‹¬äwÊŠ!²ÞÖ1¦æËJª­`MW)+› D%SüQ¡táß©~CÖñ@X°œ¡HŒJDoœvépž•5;Ì1ŠÔZV8a€@ü¤•GÁSöè‹9â̺™©•Ê¥¸’oË#†£±•òv2º0©•‹"”—ÐôôWLk¥´“Ãûc֍g•OúMKå MÒʾÐô!ÏW¢fvù^…Vv{\‹"­ì§Ó¥%úˆ¢¼VsŠpuF²à“òLêT‚ïû ¦­ßÃÔ­ÈZ&P½•ÂR@\‘äJ|Ò8†È¢ï"ÎvCâÊú*¯žìNÌF°f *¥œFçp^Ä?¹Rt¿S ³r¥¼V¹*¹²GÚáÊ1ünmzDnñ…ón’ý*—Š ÖsÈŠ ¿u +ù±u#Iv«_2Õx(H†B¿P¯Šògšîˆjgß\¼íwb¯Ÿ 7):T¥È ¥C™ºäܼþ:”{ÄçP#ŸAÕÆv"Á·‘ß"ç<@Ÿ“˜°T){ùÕ›&Ó NšîÌäÆʸ0xŽßª(¯U SÙ. V.â‰o? #KP³ +ñ€EU\¨xÚP"Y9˜)ðMÁémy\ ƒ¾µCq¸¼ÖB09"§Š÷æP‡k™@k–+BÀhOøä P_oEÿè;in…~† »ºil¥–Ë>aCïò󶼁¼4.=iáBà’ÌÏBƒÑ¡°ÈàÚZÝDÿ¿ø|†o) Tk›!˜« ~ *ïÃgD}Ó3ޑ@ƒšûA(0X?•ÿ/J…ªM£€,¾ »©Ž­±leµ«HÝ«z˜Ç‰ I:Û6Æ-¸RÄñéFÓ¼å ìÙ¼m¿`3”ò%äªbPHõùEv¿"Ršb:mg¡ò’‹‚âÂý¾ÂޅI¢'¡®!bñp,È7RU +öéBC(³F5.Á—¾V–1Q•f‚H­:'ÞR¶HÈ]Â' G4‰ÁZ°¬‚œQëu°÷‚üK\ÖMyD ‰¦bï¦T@Á=0.·P<  ý-gaˆ°á:ˆƒf[’¾j>åú]!¬›;`±;\j#½u ù›Œ҈0«£x–þš½iî‘V}« ÒIZ¬„@i`ßǸ¨†·xÛb³#Éi¸w_;ìçZ¶bfŧ¯e%†?T0’:&/üà—¼Šb°†îρºo@ +HzÎJæs°o35óp` &ŒøCM‡%yӄ¨©Ø`QEà 5Ià±z+)áYHµJ~PÓ>Q«+ˆhgóÍê X–<7˜=O“ÃñŸXÙX ýëô3((Š“î°|B=е•±2MT¢4©f&ôSÀ¦oÄÔnnb"Y•¬_RÉs,ï +f~\$Ü – I±j§"S±o}Šýâ¯Ððl~Vìñ@“gò’X`žhxŽóhºŠ³øÕÁ­ ð‹N"e¹ +Ê¡iP2í¹á°úò¯m‚аUSè¡ð‚™wöi¶’ ? —ì”ٚҎ¯;6NÎMçâöóBš¤~@i‚ʳ˜& P ,,¦ g¹MSåʜ<ßi"Žû9 +µ ÖÓc]ÓôewYÃ@ÔÔK³ß!IáM3K±Ô$ ìU­RAQš’ëÉsÚ¡¦+@ámŸ&ð÷Wv­îjªbiÔ#íÛx³êA£¢ø2•ÍnÔm¹AMzšH:ëLAi‹6­(ª¯ZPxÐSȼ¸R*#‚Â7¦:ÙéçêKJMø21jZ S¨I1je!öP K Ӟ­@^çqEEH…vc#55„V¡.³LM¥¦T <§µcgý•èâtwát!ÈÍ €ß4EۈýQƈLC¯µDh±Å¨T¨àîAɐ ô¿G ùKN À4ÕLï`å×È +¡ÌÁÐ?\jT«Ç—JÉËä|þ!@\B/Ðóƒ]ðhöͯ÷~!jqGÀ<Ì™±”ŒÃçœn¶ÞÎax,inõ ¶˜Œf ÍM¤npr™Ñ¸9©.”Ty¾¼þ½©Š† Åu¥¤5߇hŽ>4^¹¶B`vBQÁ‘šùã{t ›©¹$yJp°º[!²‚8~é–ûbã5g.6ÈiêT×ôRÓ>ŸØ«Ú€‘ï¼gä‘Äð¥at±,œ9‘†B}áò' +‰–[ÛÑà—Øzq:±á>ÜÌå áiY.B3[4ä&wôÉk€%Ö#àx6µ®hÅV9þ ®d¿Th0!2°`Zzðĵ2zz^ç•í{ ¸¸‹ZêË(šÿ¢À R¼ÎWnzu[œËºAÎ8ç4ÿ2uHE—áJ÷ï|‚SµìNÔA³ð†‡…²¬#˜ÎK,2á¥\Ú-ès«ÏìYÿñŽååùQš¥²v¥EªDC}JÈë/ ÓBt=„§$Ô Ÿ4ÆŊø‘ä{-=ÐýI;<¤é1ýIªç¦ÐôßÍåp¤%w£–ëwÎ &JàUÔҒŠ¸}L6?ËÀ+Ï1ÓáŠ]¦—9ˆƒÃ„ÃH ´¶Ü§´J’fNy?Ô¶ÄÁÆ1èӟ…ÝÜfÛK/cðõ=êyUeâNIr£p +v\>Տ†¹j¼íp]͝»N¸±¶ìr¨z×el—›Zƒ%bÂ_þ.1L*:ä¸k,ã‰áj§6Æ/SãýAlύDu<Dœq}á%Nĉé® ë#–LÁ‚±„”˜¢ë¯°Æ:ë ÚÅ«2Ç)O-îH1††^JAՍã¤øЎxìå»í:÷ºxyá´A|(xÛT„Š8_-Ò3šqYÏ­öc¤Œ‡òlŒ3!ÆNO@ Ì`Fþ,1=/„¡%Hfúâ6CȖße ø ½1˜ Ø\Â#Ni¢£­FJñ鋐ºQ=¤ß-+}vŠ`¬?|F^F¼³AôûK]t1ÂÏ}ÐG$¤À­¦LWóó–AÀÍS?Wd"1e w‹õÁdD,&ä3†·Zó¢ö°dI–&½Â9}¶„´B¡îÊö`âŸÍ˜HšqYã Pº nVJ7€½žó\Â!jþ¹Lá¥N‰Ð¨=8bßÖ¼ýß›aʏCáâ%hö=IØ»[p0A‡ÔyQl°ÅpÝ¥¢ân^Ԇ» +v’í±Ð`£6Ç'׉!ežhzñ?ÓQÁ ˜™|FAë[埰C$¤¾å{é9ü”3¢D Ù"-±hN +°­ñX%ÁÌB)l ðï$aÁ‹¤/Ìéò·ÂI‡bEwˆÕQªÖÚÜ›ÆÙNÈM+­¨‡EÆ?@£üWÿ=‘ý¼xî-`³Ê¾û@^„’xÔ,‚‘å)NWmy3‡¼úÂ(¸¯FÁ6ùóƐ)aaÒCð+ÍXŽ´¾,ÂÝQo´Pƒ +’Ýû”<“.>°+ê‡ìJØÅt½gق/Â(RQø‹ „ìͧÓà§× '@yWîí%äpà‘™rû)ŸwIäþ•†%e‚á¾R[Þé\ŽßùšÎ‰r¦9úç^0A|€ÎÄ+JÁaFá%W9€ ;ªÕ„dµôGðåtö˜‰yŠüLƒ.¦eæGfS.B1ÊÏu!íÈ1S¹2í((9’–ص3HEQ(³qÖ›Ï ÀÐ/€­Øî 5ªoÕ{/¾SŽ?8qÀå°9«\05H^&l õÙ%üŸä• Ü¢„Žíâ„âmçKq¯psÀ»öAµ ©O£²t,üN´Ú$HDQWñ˜ÿ¤ü”mu@b—áH"EŸäBÄe\ŠeS®ŽÐÞ­OAµÄ¹9ïÀ‚!a†P@ªÐÁ|"&¨{ÍÒ8gÞ»Çd‡Œ '‰“QåÂƨ«š=ˆýÖ/h3N=E¤.Égz3œ €GœH½(ðv2‚D/ …â䃐MÔN7 k ÷ö^œäC qŽBmDbù@½+8Dë}‹amü¢c.IͪýðÊ¡Ž“ßhT¥í딫È8_œO<°¡) ·lšzÂbXlSìK^ a‘YCï”=×ð¼µy'!‘,ÎCUq®€Öµ8 Iš˜¯6¾¡ç¬º¹•8s©Q}Õn*‹Ó%Ч}@Iœþ±DőZë2Ýä,g]nú~öÕâ~ätDIM¢ +Ékz§ v2Eˆó‹º—£Ñ¶Áꄪkmœ¦Ý± hHDn,Ž-ýµ¯Rx0ÄÀ·¨R…\ú0üL˜óˆO „Ð&„Á¢€é¥ VZ +mùt e¹Ä2OçÝÇ· ß]– OjHs‘—ÂrˆÚÅíù¾æã +—º)±·CàÔâÄø“slTEy‰2b®LÒ˓ZòÝZ”XÖ½ª‹–»%„b¬!Ô°©€N\(Óv°iÏX6žy©yãH\f¿€ÀʅÛK¤%ädkúoü?Èu®bò.xô`ÃcÅ È ÿzZŽšú†°¬ßÌ'BQò̐$Wf*Çþ‰éªÍïœg®üÈU–>W¿%18 +œ«¡d1ü›¿@SñP<è=I½ËqîPú?Žç0àJ_Ëú€¢• uCí¾Ù$¶C¯ciŒm¸C„š¬YófŒDhÀn%þ/ݐKæ‘;ãÖʺà‰np?øÊó+ ½ðzp† x&Ûf.FÄ[¤ÁaÄ0©$[àH/Ž¨l¾×깉1ÎBŸ˜ìFã?P˜™6EñíÚFÊII§XŽ«Ö 4OßeÀäV ƒø ¥d˜0gˆHK‘V4g“o",íPàõ“mD¹U’ÛËÝèÈ"Xà;ç½-ÎQªkE-8~ûÖ tDc… mº‘M|¦ó¡úÅ(X§y+ï0<ŸÎÁâžÛ^{ ¶Ø_¥l ê³Ä‡1|‘)Ž3ñÜz ¯Ú+'ûOÔ£g€FHº¸Êa"8l0åìc«7çiÓ𞬒x‘DÑ0¡µMÑsÎe:)A±_ó†¨ÆùÊÏ«s)¦60 F<ð`£¡~,X“e®†ÀGÂõþG¢>([æ4)­„ìù“ÜWXl¢&[Xáh~åtÔøn,û( ÁqÉ +ó‹‰<”0)A*­ËC2ß™ªAüºcٔâ] ì$n„_cS(Èe+h¥šÝV{¹·£þ$&$VÅ#ކÐìñ D†ÃÛ¡í]ódÝYâ½æµrΫOŒLhjMVªïx3!&à’I{÷bâ¥ï¿ŒAD.ÁŒ]š·TZ[£it×P²ÇÅ%`Š‚ØÛ@ÇŠsêèەñ5®ŽQ ˜Äžþ׃êÿ/“¨ÇY€Õz2Õ@"…ëûLOÅf +)uÒJÍDU} n0¤¢¿L 8l)€¹õž¥là˜8gˆ0€a…À–öô]fÏI I/Ñï"d[¢×/HÀ16Þk!$|T¤ùŸ0N·" „2çó®î ñ+šý‹ù5TòkŠ|‹0ԀÌÿî홲ò•ï_!üdžˆgxê¯ÃCâ ÏYÿÁ¿¥pÉ.ӂüoyÿX†°ocâ¸4|l…Qb ¾)´D¯þqW6œù㏪ÓB-÷”dÓP˜—‡’ÍJý«ÎÈØÞZ¾¦v@[‘ìé¬Hýaçä;èo'aSЄ-õÛ×sýHv ¨Û$ºŸ’"Վó‡¤%Ä÷Á¿+¼ß6»t†oÿmﻐˆòÿ*þ+žü\Üì¿Uêán`ë/«äÖDR±Æ-ÈMýþ¿Kâ¤á²u~ûT- 𛘠¥ ×>äÿk`„¢Ý_Þz•‹Š£’ø75”Þ6è Št-n¼”— ã–nZ@ý¼øë?·ÝÅn÷ˆÚ§s.fpƒ»ä»¡ +ÏÊp‚@n¥Hø'ÃddÔÛ:F=Ñ PŽE²0ŠO:¥™WóÄ{qo‰¼£Ìk§›ô ù·mDC€hƒ‚ôÔÿÅQTZ•˜ˆX$\,¼š*DqÔ¢C§áÞùgŒ(X&’Šˆ(rÜêz)Us $ÛžÇ9ÝrÄ gç“+R&rœS‘–ߪØc à_·c‰¹¹Vs˜=4ìœ Û|;œå[.9œ†#Øy×!T+Â~ ÷‘9ñè ú+v¬M•épÒ¨ +Ä+Ìçé­+dpêYRSí6–û%·G;M!‚mÄ4c¹^>~ùûOL&M-DK—@éHfqR/k¢¿Þ˜=µù]FäÚê Êw4ÂÞ¹¡ŠØՑJëoüÑÙÌÒb«¡ Ô}dÐ|36+]¢hé‹4èÒ"št–Ú–Unx”\§囹e@’€–*U¹Ï#øÁ)Du æ&ÚÛT»Ø[ù0>©÷㓤éRPvYõdÖø¶•?…KöääÞö•üƒ£–RŠCsÕÃÿ‹Ûý"`ø_΢IN\˜J™ ‡(ˆÆµy_É«.y„ü[›X%º% )œGw¯¡ƒo–Åi¬ø¾VÀ¦Ÿ}Ðò³´ýïï§uG£)ÎW…‚…ð¸¾:ô¢ßOCA*Ûíïr«ÊÓ²ÚžÒþ`Û»ïA¡£u*PÐ0 +¤“‹&}©J‰e³×Ömä‹ÆûD/ƒ(fÑ6ùÄ®xy)›nQ…‘ãiÄ%@Ľ¬fàïš.V5G6F”&èφ‚fQâÙ°ÞÞSž MmÙÀŸ‡ˆ¦\ÈîiKv­Û‹²\­oKÐT³à-Ô(ªž|銉»ŽëÇ@eŸ*2šN€u¹PDð¡ËFD•±-‘þÿŠ^½â~Rò)ô‘ú®d¼6+GçT4­ +­¤#QÂ"ðµqòß/R¹½ÓÎ,î@Y€L H¿«¨m›‚Hã*dƁ‘äáÓùDðtÅâ´LJì$tê|4<¬D&Ãpv’ÈU +%JÉ3j{™[1öV†_/áÒ£yšat;§ TSl£w (ԓE^-·;¬µ2Ó ýÃÃáüU è ‡Åá3,r;¦)¾*rçx° .7õÁ§° ½§qý˜Ó‰åSBÏtÂBÐcºÈiÕ µøb€¢jÄºNOõè\3F~‹S+½š)‡¢ä6ÁÉt¬¾b“Pp&p¤âp4d¦qRØ|n`6XƒÇÙ)…åŽõäf°V¸|4š£ÝôëÙÛ2zØ„êÁb¿Æ‘;€ µ/* ¤d¥õômh̽Q1| ÉÄ&àÐ7Ò0*û 'XØç„[áköÀj].r2ý¦„”Ã@nžzµÝ„CÍè÷b.,_¹lûÁ}¬Åuà >X¢oòÂ/ò†_B @ÌèÝ(«°û™ÓÍSp(Ç× Ä]:ð{Öú|r”“$ÐN…Œ·´uSZ2 )(6'pD¢Lž)¿»o+„·ñìß·x7#øfA–Ï£ÈÖ-æšçZ9Ö|¼?=pÔsé×·P>JjŽ)Î#@YÎsƒ|Kñg£Ôê Ž´œ¯wŠN×@Ïʊ1È·"ʎշáì=’´;„~‹¥0ÎZQøܗ€½ê…cjÏ'›x³Þ‚ç˓d—# ÔÇÔ ÑrÀˊ‘äÑRÙx‘±`†¶¨ #´K)t$£Än(‰]ì^­ï/¹L”ÏQ¹H¢ 2ނKý¶}ðƒµÝS-Œ¶ÈT$¤NƒÀŠë—)jŽIm‰k¿¦’üôÁz=b\ñ „f€*pcWǨÂˉ㿓¢ F¥ã6ÕÎÆÅ#4G/±u:x+Ùh,ÕUÇÃ]>¦í*^žËÓN±@@d;É`é,ù<ž†ÍWvÄ5Wâc)q±ªŠÙ¢ 86†âCÕ#¶Éy 9éØòõ´à!gø*‚k¿4p¦ )øb Lúß$\'Ô.„ÑH¹‰3!˜JäêßHVeŸ›²ŸðARXÆÿuØE³­²ÖÊޞáÄÂòW÷%H‰a8âÙ.؅VÝÁO&tÂðŠŸš¶›U5ì¿É’@Õà>ãiJ7rs)~3­ +h­þ)`´lÍC5xê*|m@¾ ü À\]‹Dš›U’Ú²]‚éX:03Má(<›·kNK ]]~4{![`Šè8Ý£gëQ'&Go+Ñ.š‰#ɄE¦|x°Iþ{ËdÔ£cJÊFXg­Os{Ä.A% Q.TÜtm.·Ý tnöœÿsɗÊÐ(¼kZ^-RÜT„óÌ´OãÒ¡[rŽLgî¯Áüt«WF®vÏygFÊ&:–’}Sz1¬#„JRƒXiK؍qÉÕl;‘6•äÖY–ç.3º$e@º —ïm§´‰ä–%‹«ZÐ"ŠòÐGbXbÍëSò[üš‚’"Ì"Û.^BÊþ|ïA`/)oX² 5ªÄLñÕc4ŽŒvï‹*ñH7¾”3 `fà鯃–Š¦TØKj‰á<«ä»"SKÐéL;{,‰©%¸V@ó2–ãþ*Áâ²G¹|ÇYA"éZ0‚ÙÅEˆ‘²ËiµSé'ùžåG鵤2©„›Ÿ¤úA_âKfÀ§®&Ú¼Ù»{ËdѶ¬Œ±r¢Ñ½$ùʎ³ÎòµøvŒ'DŠ“,n J?U]z±Œ6`·›lC½+Ły+û!•´ïÿåQ÷D‚ß,ÍF>~àì0^À š˜8ú€jP1.~­—“¦åÈٕàø„p™Žlc)ËÞÛ Â€­išt+´æȚ6© ¨gͧǠJˆ‚zÉíJd~0¦¼ÏäXÛ¹ß*bÿÇÞ"*wº5DϨ«(§ñ#Ÿêr˜¯%ÅæšÃýÏOÜÂjÐt¶C€CO¡ uCM ë,=ÉÃ5ª[– Ùí`yÞŒ®ˆÇÁAìPM!Ëÿ kêâ«&hoFt)‹>Ø ÂuþòÚT5ši¶Jˆ™pG”óÄè”{ɸ0#FIŒ:"ŽäSÆâní‘ü…rÊË'rââ«CÞ + â\Dû¥ÚÏÚÏ·ZwåBs;2+Ìå±uXÄ¡(î¤b)ã€ø!‡P›;žAU•è(÷«ëVBUà °©Ô`2•ø s´çÚڄ[”féÐnâlm8I·hÿ‡n7á½øðl$SÀg|úvðH·V•ÍèÉr}ýR…{*“«Lãulx-ç³Z üèŸýUâÕ 8¿ÂyÍ@Œö•ô¨€Ÿ GفBŶÖêÃ9çGûeÿ…!(ešzŽM›zºU¡I̙ž"%ëÊ)…,O XÄWá®n‹‰ñ´è„IÀŽæ‹•ÕôBªÅX?FÊcN +½ AAË:Ä¿”`†<¡žŸU¢½ºWÌÁg¬¸Ü5°*qÿk;>¯'ߘ9tf¸ƒ²:5uŽ¬XÍåj-îºg ( T¼)|ÜøºXM!‚ùŸN€µh[Ö7ǺáQ6±v(ð7£;:~—ˆ|‡x…Èbc¬µ`²™e"–^29…ޗþ%N„^£#M‹îÀ±l¸AD•ƒä Ã¥@’ ÑÍqKÉ÷¸ØøÀ»ˆVéçÓÑÈY¤#u¿> ¦z…®sPPüåTFßÐÒÐ÷«s&‡Þ{ÃM@-1ÃÍ>²r|bæfB\ò—Õ, ÷4î]oua À̚&Ѩï7ÖÍ&24ÿNr•Ic¶Mÿæ° ¨¶=Ea+Ö²‘_„žÜëŋ«^ÕA½?’ÿ ¾ð¹|ãE0ri0®÷éQAìè_ŒTRÒwÃuN Ö¥ˆ&{¹T¯pB<ÚR[Óá¯;i2|o»P1PP/9Dc‡5gÝá‘碕F¦þJQ øDùÆ¿ÈC’•lvž'¨cfÝÅß$+o SkåÚ·“&N@Ž!.ÝÈ·Ÿ4%WÚA©ï0Ϧ‹ä›‰bã' 6(P$i,U0¨:ʂ!8ªáü¨ ¡0å@×=½drd>`%®¼û™.&[I–µw\~aù•EdKq2ž€u({µšÛdÑ âÿâ€áè_¡€#1 °#ž9†‰sŸ>©~¶° %B)wÔÝôßèQؘé¶vaB»@¨î «ç}mÀ[‹^xÁ?/×èü¹Û'æl4ÂCA|ÿá¾nj m{þS$Ë% ÅÖ½k«r,±œQ\ŋüþ°(—[¹¨·‚°ÍLô•¼8F¦(‹©è„&¬GÊÈ0òêwócåøäG;Ûcµ ˜K_ `™ó@åÆiê}1Ó ìàS«—gbÝóžl›=Þ0$©ŽX7®çÍ@22¦Épµ€B…óàø ,#a\åNÃȦ6‚“ÀWðH÷ 0¼³=uR¹£%Ã¥C/DÉ3œà·@ÃDšéï1ZO½᤭r`Y ¢ìÜå§g\ØnŠäÖæø%¦r#Š÷)yMw÷(£%¾éÈøŠ#EÁÆ /×Ë+Å!IÝ2a'¸ã(- š}nÝ?³„Ôîîãñâ?‡>nᄋþ‚¨³S 2è†>cµÞ³Ÿz€}¯Ó&0²KË3ИáúZØÖÂSÆæºW#Tb‚;I¹¦T±‹”°)ÂMwiדּNJ9Eìü‘ªÛõUkvR€.‹#e†K0.VYr"ÿ‘êÒÚk…ü=é÷ØÇÜâÿÙÒë…⍐íLTƒ…WŒ¬° M“FÆQ@žÌöÄëÈh"ËYÅuPÓ=l†“täðQ78Jÿžî¤'ßf%|~¶BMQÎïC‘<Û<ëH À¿J*ä+{¶×ú™Û+aŒ3ÅÓ`Âßsʤ΢ë3ÑØ@8s€ñkH1ˆ†È”)y {9s3[¤¾z•—ÒX͝)ykðˆÊ£°"ûÙ#° ÎQð2ǯ”•<ÆæÔ£{³ÁôÃ]ƒ$›Æÿ‹#ëõóI„¦E÷ …‰ +O8“•ië?xü°w“'9ÀF½ä±=ý¤#Ù ™ ÀMýq›Uzb •Ž)çÚ \—]—²6À¯\ª‰§7£þ¼÷ü@Ñ͐]\þg¾Ç@ÜñôÐc¨ÉnÄ,íZ,0υK¯äö&²&¼‡\ø¸O‘$a‰É4èÿÔ;qž¹ð¼@s>mé´4Þ>:Œhx§!?X–5>™4¼CN„m^tœ¦ÀÔ§ï‰ ËËÈ¥ 2õÚ¹û¹Þ€½îär’®²=;ÖçÐ1<LJW7¯ß‚ˆ®ÂÂçrô“Š@\ê\½Àm'ñ*œ¤š®RÓζlf¾¶Ïâ+ø§Ñ…x:ª½ð¦šØAéÿéå< \Îë Gᚅ×P‚ù„uæw…š|ñî"aLJπÙv•sÕGQ]v‘2””K“Œ/xGÍ=×Ô&äåR†XµÌ$®RiÙ¬ÿ*SR @§f®.𢅰ˆÕH<›Ü©Ã(ÚΕ¬qáÖäczZ‹Xüj¹LHH­±ÞoN‹×šDCƒKvˆ¡egÍÛEÕ+œ=øŸYT—ë +´€U–ª©®„‰&ë»È€F5’൏õ‚ÇhøÉڒܻ`“ÖT‰‰Pã,Ѐx÷ä©Ä°Y= \?Þîˆ~þôüeGؖ…, mš²8ôI&ì*I‰ìà* ™…å<’¤ÖL•b,Þ'ò²äéÙ«±cÏ9 ‰lÞYâú½ +ÉQ42¬íýcA]P3>ª/H +“4ÕÐêQYkð3‘ mSX=wE]ÁwÑsí½ŠX +½ï·˜Ï'å +lÂò$ÂÍ!+âsí)i§]À1#omçøClÆp’¢åx}ꉩ>+å%\ +bPW„~ÍÏÙj ìC’4ãø ÀW#;ÒK›Ð»G = ô#¿—ÂѤDh|K$e#ÆÇ:(k@+΃—áÄÏã’o(À4žo7µ}®8“ìºâ<Ò,¤„¢bÄêQL>`n/\DWú»Çqá^+ù΍ôÌ©öA˃šf0à<ú'åØ°±,-’É &V³Û"m¥‰$˜xgËp’^`Ar½á¨7@¬9ˆ¬IEÆÿԐŠi՝ÈÍ5üvpÑI¹>>©éÑÖ"!léR0/ѳð¢  \Å㗉 M5ÍÊ[GVœh¡DšÁˆ+¿sïtÃ:oÔLæ8XoþhK3ËZ/6ñs´óþßÓ{F¼lÏå>„ç€Täqÿ±dÉøfê{DçÁÆ÷¶ZíI±vÄ1ØD\¢øh‰üm™…Р´íÿÀ¾º¿â@"S!Jx(ِ´õ•€Ýé‘ý'Ê0MÂT’ûÑ%ܝ·vDÖ7C¨EXÏrE!$åŸûyñûòîvÆþcÆ¿é<¶ÈÇZð'§åߋ™ªzƒ×·¹ûr|½·iM¼P†Âƒ[ëÝíË\Hg»|\ ‘²„MþO/Ô51Ö[ôw×Iæ[P!(]øV×â­ÖòEۆƒHçûŒö’Å;4쯪+>í¯[^¦q×÷4/£4iúkmµ—É9bAtAl ñ—€é˜¢< Ǘè\`“+!ÃØx1^G(Ý11@¡–²F!9w@ÞzK%‘ÊA…íAýòÀ;øeò™&Âv+d~ÖRâ„õ3p®Ãí¥îԚ{1~ˆ¬¾šÐdƒ¯æYÕ´NÂU¤ä½)œEÀþÍ‚´Õ`™N',7úèÌËq*'LGɾ¦Gf'#™tô+b†ò|þCT¥/™O恃%f þù#•D#,kK¸¨ÿùÚÚE3ÐO ^Ú«wü¸w<ŽL•sZ¬—Pü¡yp÷¼#á°Þ¯•âN7à”á¡ Òî%©’5gȬ5‹:®-BÛH`¡õõ%çjaï@¤¶¢Šë]P°+ h°xæŸúª%÷nš:+*Hv¼UrÞ%ÐÞt´@ßU½Éô$ZÞ¤lR÷ŽòpàMõ9Ó\©”‰Õ”î&=H+›¤ëaòd6„•X!òšÌQê `X×Ä Á#ÆÄ#ßDÞÁÉ˞ÜgŠíç^¾ÅÃbÍc9:šüÄklêG°b›f÷Â&g6Õ±ûšô¢V¿J^S9GG}X}=JýO©ÅgìWÎP4 £6¥ªiXÇÿ6ù¦¦³÷rhrÐtv~9LJÀÏ49ۃÁÓð +a^Åa¡ñ{Aæ!r:zUar%Sš¹,€}[) %M|Yüƒ3](K±8“Þä P„>ëL© œw ƒú(ГOø„¦1…‹N}>å˜ ìpšèÉýLçIùLcäK¶n)#iqtÕM¤3…ùUæX`(Êä¿gƘlà_©mg‚mLúŸTèðKŸ‘}iµ¥×Fí‘WRȘóÀ( ¬ FJg=ÑRë&”â;tÿÅfòŸç–a˜ªÝ;=(…Ëdš·4dÏlÔbäÿ*ª´‡+±jhdrØÑË +˜‘©6*ŽhÌø¤ËjMç=‘.±Áh” fYÒ^¸GvóÆwï]åtÑTúäfˆÊЁŠØDòÐ2žxŽhFö¥‚aòÝRÕ Ý H…9k3“É»êÖ(cRíhÅ%,ɋ«Ž‹µ ^°°{P´ôhª8npŠðõ¼PD…¡$˜&Àû¯–df#}¹4]CËLwDS±Š/NœÈx©/B“;-iâ  +é.„&xîc¯aºHÐxã¢&Æ0і%YoȇŽMc€M/ÓIÿ)ô¹&øÀ‹z ÉÉ,),Ðde…4Mh@Ä»<ƒûàÖÿŒ˜Œ`*ºÏŒ–¦¢ýÌòª¢Ï#0Ñ KåšÁ­€©A30Õ±ð4MJ€Ì€ $gJÛ¥/ +šfç›S©l«¬·'·b“à¸4ŠéÂÜZBcS€—f1.©¨h;ðh…fõ&úIöUÙS—x•t)@5×@—^«€:—.~‡‚™K‡w)ÿ/C¹¤^‰\úÍ1Žb\Â&–.q ©ì:×Uƒp)½Èz„rêZuuâŽF©léÊ¤ˆj¶´0LˆeLkI;Tرô8ºNr`áÍ@q°GœÆiAȀ]±K´T“9Ô%%ÈÂ&š͌“zÀR·AC¬”Κ¯E‚°¾%†èIÊUZ‰’˜}Yþô2‡¨¬W­™r®•ÉodK"®L ѱW³*›ÅX‚ž¬N*–üLVª–UÅQĒºƒÉ¿5,]ÿYÿQV1c¥IžÔes@:–üEF'c_J.{셨3à ê¨Ò™Hq1T+] î€V‚YmI%¬dV±ä‘Ý™I^üC)±{"uƐ¿ŠB,ááG´ +ðc^–)÷€U굓6ÛÀÖyÛ¹<î£ä—éªgT­ò$©JÄ9R¥›ÔØ Y +»¾ ¤· FŒ+•»vãlÒª,Lí ¥rnù¡Ë$³â¢¦QIQâyN¥¢ * Þæ'6“xY‰ŒèK…a“QÅ´ TzNþ²Eé\5ð-/„’=÷P¦T”™¸”Q«½¨(¤-‰Ä¹cǞRÐ9AõŒ+ö#Ÿ4#«£tkÔÃlÿÛP9$Jo-Eè½6PFáN¢Hù3”¤PzhŽ à[àÞlH#(ƒÈí?›{Uã7)¤$]ðÊOòS¹‘:(⓾. žíIM\ù!xv©‚º“F:vҍO­LÓ£„dR6'5NŒÊiõ J4ÿ‹“œ%úKڀu”ðTñæMÚzH3S6"ZK»Oºç’°o›Zl®™XdȚ´@U‰r‰Z꧔´+k㙘>h ‚G`ÒYÊ'i€Â3£ºhÝ73‡;êfl!A>¢´,0–„æI VÒ«ú(cö­* ‡hÕÍ}Ô1$5ÚA|öo‡ JÚUòž$°6ÿs’KõŸš¤ó +b’š_$ž£Õ /–1wKRNúÁ叔¤£Ïª™$I>u™ð_ÔV¡C(ºÄuØÌÎÀ€•‚OEŒ´h# +­üñ‹‰Èd‘V¿wpQò2Þ¢•LÜ"¿bŠ¶¨ Wa‹€ê -8$´hÀ¼â,"ãVE¦&eÑðF^úÚ÷gˆE¯p…‹®·[ÆnØ\8 ]ý*qyx•éŠ^®²lýkS…”¢ƒö×ü­‚0D‹L(¹ŠðÐé"ˆسƿªÈú3ª(¥á’I…þÉÈÃä‘õøND©"ø¶h C°,)’‰ )2úÐEœ9#…V}úïØd©†Ré34ÓäoÄüA#‹…Àè8  Hû‹ráWõÜáCŒ¡¸é½D’<¶¹o ó‰¢É‚>*ˆ”`ÓùíÂõ“ !]^£ L÷àVÔ2`²hœ)£efM•Ý&§Ý@mÆ9ß'Pó!¶ê=e_x›D¥¸PïIdÄRy®¬ Ixuѽ„v„ñ¹ 6Á¢— ’°‚AŪR˜˜Hm€Š¸FƘH›@8ç%ºÁCÍ[¸Dt,•Y‰îY£>˜]¯ê¬¦½«*–J‰”Î5)”µ1ƒWÔØ÷´“âOó_˜@¾­#j¦$$¢âÇ@ڑ‘Ÿëf"„ʐõ´Ws‰hÔziU0Kè£)ô(!*D{Iðedӏ’g +A)&Èsh¢óì2qÉÏi"ŠvR¶bó"¤Dði’t„룪wG¨kˆÔ`Aä¸ssDÁyŠóò²B§:+¹CH*™WYtè•õXPÇÊßç¸Àa¡WÉ•WŠq¢B_`¬JÛ|…˜>¹Kgš ÒY=Ö·*‰!N0xÎsʬNuµà;„®TÉÑ5ѝ66¤Àёñ× ˜¨1FC†šNµ;‚¼)”zy¹•²ã!þÐÝE¶A£HR_~u–…7?T׏M2…==Gp´´ÑíBý|[›j·&Ä[yI¬¤?Ä5(Ÿ—ô`qt+oZê¡òkH*£"É>Ғ$z¨Ï! ^ëÞ,6ª;‡È¶B‚Ì :-°¹ÞP?s“—ew ©bí!íXB¹öª@V ]ŽÆ3(¡cîÆÁˆó»e©P ŧY˜™„ô.–J·‡:hŸãdóŽ\ m<µ‘nl;\XAMb³˜A:²^˜@Ø ¤SÅr7À¹À¼“N\t„žã 6lEÒºŠ«7u§eÖ1pBÌ»Š cfPÁjɏVÍ%84‚,ëkG@Ðæ‘ ž 3áäøQ–íýËVA‘5~ƒsUèòôŽ 9H!½ÈÁUÝÎ@*† H¥4Òo(¢©E®ü"Lý=rd +]%¢Àyn?ñ@¯áف …LšÊJ +ä38PWs“4誵 $ B† „;)L 4pÁ~ü|”â´:Ê«¢õí¹¬ÏûÏ#è÷¡¨Áʲbxô5°%Ì[UR H†LP:Ñ*c(øL?뢈 öjL6ò_v:“•“Yž-1]ËC"z¨Õ¶t@x³%2{@@t}lÀ€D:è¼¢ Šci^…iý9¡€DAÑô¾šY¬Ò ݸä Ð8Ò´ÈSGÇ   šp¤òžö Ö²ÙI¯™¨‡»8 `[`*M‘ð“Æ€‚6)5¾GdÈgr žÑÀ†ž{Žs‰žé˓­Y>b"’$¼+PÆŸ«0läéiÿñjÿ¤™C'ÛMõä¸÷äà[ãÕÄ|œ,çO`¦½ + VÑ]m§Š HŸ&*ð:F†ûž-Õ_žKf$.€K¾#я=÷ë‰@©)±:ï§,ršt?ª™X¡p?×"VǶŸš²ÏNFÁí珤¬‹Ha|ÛÑÀ°¨ìHØž]›«OÚt¨’+O€f0KÜýÏ(ìW&û„è͒ϘH @àçúC“}*Ï.PŒXaB{oöúTn’Oo‘ž„Xý8óÈs¹[æNDœ–C¡ýiúF|X¥Cct"õ…ËŸÅ!Oáz.¹Ï¹úT ò(¬CPbÚ¦³°¶†šaÅgèñ°AM ßqz8žiXBÎfÅáeU³/Q~üb¡ ×#>H+bEMüÔŸ ŽÂI…à{xðSÜ>¬4†~Ÿl‹ ߧîø|hσµÆՇ‰‘Ý='v¬?Ü}r¾'IʈՊÑÑÆ^Pþ§J!µìéb¦ÙgµEô12IÅ>ƒ¦¼×s £Á Gáù|†FlpÓ+ç`ª + _䙓FM,óyÛIҊGhC#’È–Gt -ÀèCEÏg:n<#‘l#´D>*ò© +š<>Z"¤ˆãS»FøÀox¢ÁeŸz{~Xæi¥?‰ù«Ä°Ð=Y㧠DåžóÁîˆUˆäAWód˜Ã +_ßsHY¶§—í=|6ôžfäÉ£æøÛ}záÞcšr&wfªÅÜC, b>*v÷°’Á<Á`”,Á(ZIãå÷®#ZiÍÑ4´Ç«2‚‡îüeõdÏÙÍlx¢P—Ï¥è0¹ª©‚‘î÷%Šè9†ëë÷è ÊÏGš¬óG«¿É>¥W¢kœh&/´ :+è? -d斐þ;µ¬»˜¹9rs’dãÁPÑ[<Ø+º§¸Qåeõ©§ ¤³õh=\¨§-x&:ËF¶%ZjCD­üõRó×O†ynQý»ž_O›6=¤[Õ5½Øµa>ÿGE.˜G#¿€9?—–º¥Äˆ®9$˜™ÖÁ¯ËSþƒC·¢Àfzå!åx9Îæ)­¹Ìœ+q«ytöI¯.JÑ<6„V«e¤™Ç'”›É<8B©TÌ3NšS 8ü”8 4N‘ÔϽ†±xÆCáˆʓÄkLY<ژ(²ÜvÞÔÔzéHž:´ Äv˜U"ù&ÔO¸­¯®Í>õCPÈåiIŒþà¡ý;i·OÜÑyhƾ "ãx€ZckÙxìl;V"ºŽoJäþ$r­dàc­ÄÌâ©4|*ë°TñÜW;+¢†¤8é«á´‰Ç“Bè3)cʙkå>ò‰Áá± …A=mÏ ãwä'Ÿ…ÇúSxâ$<}’Ó£çeù/Û0¥ƒ'E¢ÃoET~Ç…Ý~·¬$3ÙÉ0/âŠ. +T^¹bã$o¯ÚwZ"ȉQ+ÝQ§wµjNVáαeÖGîzôNN0qGP:wÜÃîðz|ðNóƹGñ=ïNvãÑMãîÈ“6bUY—jwd”¡)3{©a±;ªj„öVÛ£uG*QW|êþm“MýU[»•8Áä0€ºßæ¯Â„~¡ßªg8 +^ŸgֆˆUÎ(€„|‘HD/UbcQ‡˜è&k,†Ð“¼ÌGãA¬(×'n¯ +JÒ'ڏ¾.Ó–@‘I”ü¹i.˙{’à<#?™ðHòÌ èTÀnÇH„“ rtØ2“q ‘¤Nâz®à3 > KO2mÑ-:KӇ`)Í0~²W£ÏH€¯ˆ^ÚÜÐ¥Æ àÿKiRØ@ "áéH҈š#]šØ"çț>§+ùsdÒkÜGöômzAU„P¶f’ /ƒL:Óý—A¬“%÷Húm|ÒøÊB—šƒ' +ÝÝò½hiÚdÀ Éq²&ŸíRYõóyH Rý>q²mí{‰ßm€íüÖqJ£g ¼ˆVõ##ýy6wbrÿÎæÊzZåNsÇmKEÔªâ ÕÿȯؠV½ƒ. +?Tí¤äzH¸sÏà䪆Æé 8öýCýzØTÓµ€ôm& ¥»ôE¾v–’aU‚X¼;+™›¿Y Í4R­*tR¨3®½¦‡Bd÷ľ%4zÅwW%3™#^«ÝºªžÏ2ùÐÿ°†‘ ÃaÛ¤· “E?ÙÂÓQé¯ü;'@J^I¨aØÏÆ« +ßÐéžàUï]“V§^Iù¢¹ã¤çßHé)¢Ý»ŠÅ[Ê£•—aˆP }¯rœc¨IÿSÿ·Š~k…Ç¹k…ÃõP!¬(kIImXü ë-È™î“†×Ž6rú lTh…Š´óô¾ãªL°¶¾V2¼Ô ¥¬1AÆ·Hâ[s×z†¥)À«®Ò”˜[XƒkUGïN¿ù'ÄÆì7Ž 9Ð8éÌpjžHtƯ¾Ý.\˜š©(A*š.Ú+‚$։8dÙ¬*†’ôûø8ò'®$o³ˆ|聖 +%¾Žñ,‡žzGÅlË_PÏLÒì­*Kq;U¦úý[¤¸ªuô¤ÄÀgˎ€b:·ä~ž”eˆ‹roA„vxR-v=ô´Làa™¡˜‹HeOgȧø]ù«Í»Dõ ¾žâ‘Þ“¼¢æ¿9°ò®ÞYéeóB«$¥- +/ó`Æv< O¯" ¨aD°ÔäšX½´Ó?š&憵\ $×IyG𐰥†*dÐçË~B#³3Zôäò@ل&…ìþ£&i ğ„8þô5ˆî.AÀ}rVPðý“¤0¼°©!n2`!…È 5ðÇá:-Ð1XžŒØ´Ã6bP¸èzæ':$j2ÿ–ú1ðFó`DA*à‘l8Üˉ®ÉÄw¶«*sÑÆOqHøMJÀ‹6àHщæN˜L¹Ô¦…²ì‚LÈ>Z~‰ŠãhFÁ°Ù16_"{@ZE¢•Œ©|JLl³ÇŽí¨¬*«úõh˜Tl$Rwˆ›ÎÐàà!ŸãÊ˨a”¤‡O¤…tjßûY" š‚\KXCDï‰Ã²bçsVeoqK¢ŠrP´&';¼z,k(äm,ÉÛõ¶º3…Uïº3Ëü¯š2‡Ëá0GC͵RÆ^§Ÿ¾«¢Eä'Jž“í U ˜°‚ÆÐ`ÿ|¦5Ðœz~\Ɣàˎ›¸Lp‚B»Çˆ´¹MÎá!>ʜm+2\| ²ÒMç01‘Ǥ¬ßM ÷H¢s›zHdï:2Q ±Eþ~˸˜9@q¬šc—ài^Ø<Äï³SªÎ}퇣Áu2Û«ñ)`« +¯ÝW‹ã–Öh/ø±ñ“Í‚t™¨VC8®oï– ËëÕ|–‚sœôU¡ªbÍXô”QŠE·¢3uÙd°*NßÐÓôxÿ&‚SÔ»Dó¶íŨóßIú!8 z}NwPâ V”ïÄÀ¼Ø;u±’bØDã7­W s¾ì¹Ú Ó€_cÕÆÏws’׎³J#°ŒmŠ²ªˆsfqâ¦ÓM@èÈÒ(P8:DíAY@^¶VÀ½î—@y’ÚÛdÞ k›»øÇhÁ‡…zçüÙÑO«@ⲔåÿùÝ(»`4ˆ‡èF†yPÜ2X%n JœíÁµªDþ”é£Epú}óûj¸\z+eùֶĊãÄ ¤rW¤MIKJ¤#¦ÛĬQš3L$íߜÃæ1ÆããƒÆÇcŒ1fÔÃÆøōˆ¦n‰|…^"eˆD™.*-"E£©!™W‚ éT§Ó¨ŠëÙ9¥·ÛkŸ²ÿn·)343#f>33333N™Ó¥–J”t€T…8BÑ'¨a¢\Qą$D$ˆâ!„"wBè–ô—Ó¨Î EøDBŒàÿyC!Ä8â#„°ÿñÅù`¾ÿØöÿ²;ûãÿéãüºÑŠ¨œ~ +ö±)¶°&LȆPñ91qégNˆgs…·¸"Xg@€í€7 @I P_£X¼ˆ›0¸¸pßHy¯H‰ %…¢‚_Ÿ8¨ôÝ3CÐÀÑh8 …¤áh6L€->0*Ù{ÁLـbådî —•'ÄO6eåuŽôâ² 3—l®áÃÙºSëŽzè"ØÔæ€M¯¾¿&Uš3a¦ù>g2csa=º7Õ™q1¿^.…à1*6çF¶¶‘ˆ[bÛMlf X¥£ðº´h\÷îbžr÷|Ø|œÑLÁŧF&ê¹Â©ÑàŽ—>5*Қaê/!쐛 ››÷ªÉm`w‹­Ìž¬k2_C)o'ÀÓZt ˆ!èá°Î¦÷L‚ÎãË׌tú"ÑOÖknƒ›C™ÚúèèƜ×L—N¶áxœ g\*^“DR.×HEÆlKô²8=m¨ÔØ­ÿ»Â)„kyËöžüÐÌ7kø­IÚ:‘þÌñŒÓݚj’‡)ŸØ:tq!®Þ¢€it âŽøMžªSúïêZsÜÇÇ0¿æ´¡9„wŠ1=º'ð>Ë8Öd +@‹ñ‚Å5S¬i‡‘2C©#…ÐÔFÔ¼†âª…n¬i½¨Ø¢òÞúüjöX«WSޒÂXºh˜ì“ó>²iÎ,É\͂ÛÔnÅ*ð2ºÕÄTTzÍ{¦;¯S«©D‘AÚÇ6,“YÍä$½)Iª!Ž#)!§ùI[›Z«é½jþ€lÕ̳b¹¶` +àR˜¡S3ҁ•(qÉB§LÍlJš%XÀ¢¢SB€åÚø9Ý9 5ý}Ö jJÞj›´ûüÞÖFd_“õß,-‡üNìi&×ë ttõªñËӄG!åÕ§Âåhª¼Ò8YxHVEœ&¹_֔7Íçdºr¾MjÓìT0Í5M¹,^ïu=nx¦9ªń¶šP9¦I¦…çÑÑ.GÄç' +¸NXMû´€"-R°„f¨ u¾ØÃ@%ì«Ì h tT7f`ë¢béüN8Ñ_(-P-bÖ·“!M|²bb,ÏñCš•¨„¢¿^_QÇ_6æ.bEoõ¹¤«zâ5ùÚ±Dº$F“È‹ÌƋæX@ÐcâAÙªùb†:2=^£æ+š½öhÔäɲ·ø‰M: '”Rh/šhòvË[¢âòE>àbÔ#š\.D³XšMÙW™iñ~0g“ —Á oÂÃ{¥ƒ.4SäÎ8Â[€šh´€+r[Poözåk®£UUx VD°½²ˆq4×âoO=ÿ¦Šy¬øÃF8K€ô&73Z˜ËÏÌ8€×Ùrû»ÏÜqradÇø8<£úÌZ±“Ó.0ËätÅêg–Vzw…Ël=ók@pN’'\Œ Ï3ᚩWžÿ«»ñÞ¤mnÉÅù½p9_“ðLm¨Ì¾3ç¡Wٝù… æÁôÒo@æ2©â•Ý¶Þt»×›‰ +HÉÂË5g>Lct%ö€[îI:ÜɈ£Ò§|]¾Rayé°ÌHM™_Uî=, ·c{œiJšÈ}}&%>1f"˜¹s0˜-ùÍôÖe8Rk<)6s"ƒm¯™Qúù +Pcv åj2³X +fA­ãóOV3ïOнažKƒ5M˜Ã&öß,Âh¦5ÐÌ턤íL¶ž´fv—eVÂ`ón¤Ýȝ™¹B àýÁ‹z3“£’ÈÌ\ +Ä6ó:ô=ð{é³4xS™N [ƒ’ف9Pܘi5 ïy©—3‘¾´˜9‰™ýìtfJ`‚Ñ‚ ð +ET$/¨CÊLnLSrûÆ`fŸ¼;ïa¶û˜‰% #r¯v$9¨)0Nðüd:˜ LN™Ô¾éËüŽ‚€'“ó2‹€Ãî2û° Z[øÎÄï\F¬ËŒ5Œëoé@  ½ɖÅæ2ћàîÑô;(ðo™U à>˜¼¤½¬-SËð±Ñ7¹v3¦eŠ«`&£D„ódàV_“`r­NEVfû¹»ˆ ÷¹jT•,Í®|cU¨Ð£02¾0g£"·Û«Hö*²“2ãñM Ü gàI۝O\Ùf‚.`…Y3û2fDÛÊ3&QÄt„°¼þ^œV(ãªîi_f YÇÏLf Xµ˜Ì¾€´KÓÞÐ_ë&°Ácnzoq¤ÕÚ,©–L §ò¬/“ô2µN@#™ƒ>2˱ÑÈâîÇLH&Þ.Ùx’ã”~ý¡|aÇ»B‹é->VG&’•82šx+²/ÓKŒ@#U ™T+y,d6Ü¢³i2µW"þh詔Í™^Vð}ã0Ed¯— Chÿ˜·S?¦¿”Éq$qµâ>¦^_ˆïåcNZ¡ |0ú%f´ӓÅÆ˙۝D0#ÏY“5.³D f³uLû’ŽJPãF:f¬%q8©"›”6xÌMé=ェ£R®Œy?.]— ¾3:|s/# |²ÛÁ‡§â)'‰vlFZ1Q-‰Ÿ³ ºÚýÆ|aQÜTí<÷‡êÆ$eQ| jò@ÓmL®/¦n“ˆ«óZF²Ù˜Açy³‡t-‰qºÕ˜¶ø¥¡¦1÷-L`$$5(›í,]˜DpDæ0 úŒ‰t¼ºgøSܹê-cŠŒÐpä{ @ÜBü…IÆll~s̋ïЮ³¶H„0Hǽ‘ØÌЄ +>÷A“‚âR–Âњ¹ Պ÷µ˜ÉÆ«|“ z21ëùU /Ïà× ?]xM%¦h%7‰9´‰9WŒ1w-Ge„ÂÄæï ®$Ž´·ˆ9±íN8¶ñF¸›"P^©1ÒI C¤a!¨Dôï¨ÉÔ{¤?¬uŽÃë0cñ”_6³êDÎaÆ҈␎ÌSΈXp¦pBh™/=ß.¸‚µû÷·2Ì׃¦c˜åÎw _˜äÞ^g‘œ•)–De͖'Lg x:Þ<;#˜N¿R¦±¶‚”zÞ<0dËa†ÁCл¾\x˜S’LBýîê&îà+´ä41¯s¿æŠÐÐî›OÖ딳³ §†dSƒ™$þpòǚîPùå·ú»<ï„Zh°X‚0å5Ø$Œˆ†@•ü²Ìe÷Ó:v¡í´B0%‰ŠòÑ4d¶Ìrvà—Âæ8¡ +Ìhs@Í3ƒîÈx3ÉZ_ê j©kéFWà•¼¢8.Añ6¼…ÜÝÜþƒÉ^ÑÇ|/‘QÒ0GšØµõ—³×ÑÉ¥¯0™{.5è·xëÎå:²º¸.ƒ¹ܹÖ|—¥kKgHÈn´\vÑ'÷êØÙywÕzØ?S× å’PK-_ +©é«©±aõä²@[;õ C™?‡£!)ð\£Ö™¢o>EÔ>.Ó4ŒJ•ç©šž +Ø]\fÑsäcXDtâiÆ5Ì1\m‘zڊ²g`¬¦õà ŽSJ Â(q”ɳ;]—æ„Š¸›0ÛҀL ù~Kq)Dtã‰h€û–uîýVyÜ&J¤8%¸”ç›jê-û;1/jË\Oç9òßXJäªà3£bQuKâ'¦<œiÁcËc4’êqXbK¡JñkNêè +u(‡wE‘pF–WYіq̵<[ÖvHoƒ}®–ZñÉ_kÓ-1#fˆeAÜR¾á¤íà3lÂhy°%wã Ýg±å5ÞµÅSM¹´ê°e†~°[@°¥Cþœû¸Øx·8m&£¢AÁ‡Êî=ÌÒùùvŠÛ’!КlÖv’.cì@v%`A_ËXzŸ>ÇqÊ҄`Àz)Û×ÇÖi9‹¶g¬–ic\ۓzIqäÍË_0C1À#ggGÔh¹ˆ#¥-«´cۂA¨-[íJ"îZ6úÇßj(úG3ÕXh™6² ËeßA{žœ‡ívœòyNe Ü6©©á¹$6ž²j:2Kˆô1qÁùJ=ÂâÂ+Õg{âÁÐäõY[—%›ºË’) Á"%€'qúÎ EßV +7A«¨TŸb/–ý›ål[Õ"53CÃ%KÄ0`åt⬼Ä_ÄÃ`;Š&££ÖÎ/iÁÅiAe==ÔõbIjòSé¶Â²k)°3_tzbiřñÜH›eå"èºJ +X„XÎ鈌DÕìE‹–B¬$|–ª¡ò½6:Ž KS\rTX +úRلeh‰ ~ª+ËA*µ¬ 9ГÈU)×N–c–ö21Ð6˜-`Ës\ (xb¬\)­ff,©w˜sÑBgìd)^ITRÂJH©éñEÊÝ =6 lw=Õ™[†+”ÄÅ1H4ë—Ýʬ€‡ˆ‰;&t¾Ò„KáfÂ._¹Ú-Ž€ëM§”õ¦r âZ^¤ žéU¹òö˜rNp%}+ót•Inê¨óOh@¶+Ó¯JÎo‚²+{ iÓu¥tjy¨®4’%§+COØèJÌF‰Ä¹h©àâ˜.…ÛžPvˆ5¦•2CÞ[®$i,¸²GäÞ¯dùÐo刐ê­ì²ãn¥ý‘ÿ9¤-•uêiÚÂP~^çŽæ.¨[+¥™Ê0T—1£xœûC-V+WP™‚=sõ…§~ù@²¦§•YnO:@ò€ê$s9Û°¨è”Ë}¼2®ïи5¼Vªr–P +ÿ5+i¿UZæÁÁ:é  ç]!ÀJÀ¥Ò;gDoͬ܆(?//O‰ þ—•' *¾˜P¾÷:9.A•He¥r?(êwSÙ9 ùzD̏V²q+•¥úõضör|$þTÂ|^½—àŸ2]²@ܱñE¨±÷UbiŠN#OýKBUþóèå5—T€åi³Pïr—êÜ]nñÝü—]ÂÚôÄ\å&ܶª÷þ¿œk"=‡Áò.3`[¨êYØuª9¤)ӁÈ0™8 RUZgÌPkÂQ†Šhµ_Ni‡= õ¿’Ïš¡B×Y• qÍòîêxU)¢ˆB‰¢¡ý‚Pbù8¼›’ •¿¡¹†p©ˆã)•»¡2QVõItµÂr¸õ•‹qÞP“Ô‚o‡Ú–A•3CåœíPÛÔ*j ®ä9ÔQߍðY‰‡JCË!r¨z€ÃW‡Š…±ìêþr*oc9¾½_S<ÞTªQ©ÅrPDõ-cP)•Ó"*XëQ/uR9AӀH¢dI%ž5#ýþº¢Î¢IU ƒ`QÑ)¤r½8TBÁ÷*ÿýŸÒÀô›!¢’ò-ËýKÅÁVB0%õ­_l)iÔ +R¾·n–LPF¥_ÁºF½•/³QÏ»¨|­'R}ª**¥uÌ7Q™Gå.ETráÞµљÕe݁ã–PVSrŽà^3\ú¿V’ Šô]ûeý“Gó£Úù䋩ƒÐÉ%HNÕu)rŸ“`À`1Û' Ùp!‡Q«˜._ú)Œ@§lI,d˜Ö2ªWÖ)½øœ.Ú¹ _ æ¹CV/=Mfç#¥©ê%NLÂðØ˞F +žZ¶80It L2Ú6ÿª$KšS5´ƒ‘ÅéUJ[º¡,†/«*G»½7¦pm3ëÖÉð `‚/Æsü©ˆ¾„Uª“[Áð„DÝ'. iDdi ‘bdY%5k®Ÿ +—,u¨ÌÑ ù-ÙSÍú2s¸+ëº%˂+µ-Ùÿ¶~¶¤øÙ:Ÿ§È )è„b¾J#¼,^’¨{Gêòó¨[–Ô!ŽI–œùÂÁŒ…ß;~rċùQè,âgf%£Á»o“1]Ëd€âk°ÍÔ¾J¶¯åYº}[%å–%v÷漏‰ôM ä; +µyqa<· A1´wz #[Ø,ji(“oî’òËywP²_$Y+W00A¢—”ƒ_ÏÕ¸DaS2¬R=óLªq&‚àf)8QKUIÖƒÜóÇR‡’žˆ$ %›îÍBLôqÆC|£UÝP›>ÉÁҞdí RΓ\u$ÿY0™ÏWw’ù¦ô/„•Ç@6ÏI +—8ICh“š@‚ÀDzò÷u–°8( ۘ ´_’Rcšº$£hª;RA>"úEšÃ£õëŸÜé+g ŠI’,|Œ¼ÈÅdQçŽ$Å?þȈL|¤ ¹.ý0AIc²"$e‚Ò# +È´ƒB)}J#r$YYÊ=+ÿÝ=¬Æžë˜NTÿmÂ':X‰äÖ¼|G$'W‡HVV¶ß&CÒvDæ…ä2‹ˆ³~àh›s¢š¤C?;d£’Æ+¹¶qðïœIáR;òà·_Ó I^è2[›:Iþ!ƒuARÜ}òvÏFß"]ãOWfô¨MIrÔ<¸JNˏôP]†í³ÈúH -óŽ‚RK™l¥ò,yR¾Ñ‘fD½(6§=eºöÈÝOÕõÈfÅ÷:¾)hz¤ˆµà/ó—FzCž3±°Lrfxäb¾#5¼ÛÓ9“oGö™bêè—pz˜Ù¡ŽîžOՑÕ&¦#7u|_^Ίà¿8ÒÿùÉ#àªÔ£ì¤¼ßHòôüÚ¹‘£ڌ•·¿×EøzÉCŒ^¤¯¿)õ +æ’öYÙt2¢‹œÊ…”"âö Öì ¤“S7;’#7Œ‘˜dãsܔ‹JF#‰îǔ>ë‰ô+%4´~Ff|ÚÔيDÎÍȂa՘)Nc9þedã]9JlÚÉȂ¥‡ÌoåDtL>ffYs…$ƒ)t70òu°”²Ž¿þ" ÷(Þ)xP«¶+ÒÊ-¡ºÈ¿\Ș‹” „q‘Í!¾½E2˜Ò) ÝÉAæMÛ7ç Ö½:×-ꔅÒ÷HY$îþ oôm³,—«”›UËÅԑÁLKقӮŠ4áɟS‘é(«ÝŸ"ÙS$QüM‘uücúcëwœÇó;«üubhò¡+¡• ¡eÀ'päš"y»é^7 þ!q*'²ÒEu>Ôu9½&B2=•£_3‰=nqÏDª¤ÆTìI҆òɆì2‡„·DöÈvÆε³B"9î"ñ#Ғã)Ã1 hÄ4pÈgM†HCLnD†½Ö0ŠÂ:Žn”iô±‹H Ù +5€·}ƒf%ÛêR‘@Ø^Ûeä×>œˆH}3¸2Šç0€ˆQ !߇˜â³”+6D’ X`ÛIì=Þ¼V‚Ñ¡/ÇK¤ ym„[œ yxᯄÈ\‘‘©«tÇ(e€ä(ÚJ»Ò7õd<x-¼"@Y!@yÔ ›T۔°:é·T®²PQ!x³SF5¿!³›Œ9ñnÈU–×$íŠ=ü=˜œLEAw¢rÕ£jȼWe’8r cÔiÈOYíê,BKI„Ö./ˆ‰üüÒºÄg!ä”tI“Þ6­!³MqØ@¡Ÿ„U’ºÆtüA›%ΰøNR”|J;Œ›íA¦÷@=æô­¿TçAÊòii½géù»ÊÄª× ù•žVæ=À¿ ß–ý –ÀC BÒ 8 æžÎ eÍúãÂY/Óú¸L»¨$‚0jÈÂËI@sx”}a£–@Å=‹„w¢)Ⱦ„ ȍ‚$ðž töÙùgbÉᎠ££åA.ݓSkæ«zVà«ç}çŸÜ È T‰À׍`PۂȆô¬Ôrî½*cz–tyJRÆÀv éY”‡*™‘9‚]¢Ȭý¸Ì#/ +Á +ÈûP±H)™ôÅ·ö ïŒò ¤Dœ+™J ÷ú&ʁj"¥C £Tâd=<íG Cµå¸¡aãŽe +6 ‚ðxê¤q»È ØD­ÜûÞË»eýÑb ¹P Q‰½)ãÃħ¼Õ’_ÝN%De}&ô$þì„ ¡ÃfZ«¶°ÿØ1±> : +-ÞGxÿ™ÍfA3Ùý£.±Köþ¸W -I•ÞUÝ£¦tþÑ&W¾V)”®…!Ž»ö±-''~t³ !ހr'Fw)b X±M›óG6XÔ͹¢-F@ËN£¢¨ü1n†˜¨Ü?bv£,È`ÃlC7#N!öTLW‘¡ZÖK Eߏþkì~Œ¶ý¸²¦E&¼ªý˜rMv·¸~lS Óý£×$Á'Ùhهzя赅â”ã"7PO£ #¤Ì¤¸¤ù±l|Ã9í²t&Ðö‰¡UÎ,ùQÄu¤ªI¨X%¡·ø˜ ¼dr¤*³•‘„?wí<ü((Fú¡x¨dŠέ¼xÑ«{^êž×ç"&)ˆº iQÖG@`9Ü3{^¶£Ûãþ@€t]!›.»xwl£Î:²Žß÷Ü[åD›1Û¥Âs—ñ±.¹¯îquñXèãryQ^XÜô-ðQÄUñ%°©¤î|L>"Z}Õ`P|%¸°Ð»] À2šß(!´ã¹ø¼V£ -€Oª\!!=Æ:¼äàËoèÄ>z\:;¼§{˜za Éé(3_!:þ"Ó§ã«Ïµ +?åí=&ÌÌèpzÖÏ¿üNstF=0H<òzÜ=vfÊçãÑ)=~ÃiÏç©cKhMÕ&Hëlÿ¸WkRž){\(öã²Ð9i=¡ç*íyä +ˆ„¡âÔ{ÄìŽÐWV± Tÿ÷‘$C …i¼³?µµ‚ém—Éo¤äêÑy„›§ÝzÜÖ_:ି¼æ‘yõ1$«†Ø©GFd¸jɅr,#ò.ñôèj|}È2êï+Þ¨çÔ pmÄÆ(?¢×!Š—Øž…f¢z´$Ä6ÝÍqüôá ð)ô°ày(òø·Ý? ­ ‹úBïѼB‡2ä=¸çÖE¬o_ås>éùsM+ˆ±y †þ@Æ,aÕ¡FΣMÑÇù—%ð^6Q¡ôæq#ýAQR¡·êyw5ÀCu汁?ôÇE(Ф=Îî…ß_¶åQJ@µ÷|ÊB[.…>à\Ëh5úÃs¨;ÕMyìýÕ ßÆ1¡wçòªgK»-yü8 (UÈ˶cÑ4ù‡våÁ#(ço´Rb™EËÄ_é›ý¥y¤™lÏã»Î%††öPܾçÚEÝ?g¨.-ÈȱnéHûIrÕ`VÑÅî80ˆavŒ»>ÄA§ ŠZx\7”†\œbIeËF’ã‘ŒòHU¿#_¨á̛ª~ÉØwd’$Ù™?½Ê|G¶ß;FëñÇT[®wt–‰ˆÀF½‰‘yGN¦Þ—cšFxcpïŽK“\»£¢ypÝQ]¥;êešhŻ鮝;¦ C*wTymá^FÇ".Zr”0ܤ˜|öªÚ©vÌ ®kÚ±×*·ªHƒzaúìØ.XG?Ž€@ólÜì˜n ¦l°XSèSÑå?¡À6ˆÓŎkXU<‹¿‘Þj¯‚Â1v¯c±ÊÒ§i¦£}qyî)3mÉêü[L¾è»Û Ä“{#òŒ_N²GµJ,ž¼‘Aµ 8ê8{ ò¡Ž±˜(eòÉ Í»÷¥Š˜’Óƒ<ð=\GèúíÀrLF¾°8øñzvéXwÏD®I€v¬PÞXÔ\<ƒåx€z°©CÚ ÜK,þˆZNH®îߞÊüç˜ðI±"ÿž{D‚}Ž©ïoÆ=Ç}1J¯ZtÄÑ(Ÿ#p<Îq́Ȩ‚²Ã'>Bq‡Œël (AŒ»µE9ènŒÖ迟נÁAÚ¸~#ÊníéH¬<׍ËÉ栗^.êç +Ô6Î÷އ٨ž‰`™73·onº±I^XËæ†!½E7Ùs£ô­¾¤f8 +E”€Sš&O}œÓ°ØóÚÇ;q…ÀÇ–„WŠ Àënc*&jòׂÂ!–Úõûn;O¬mìѺëfiÅ}SßFY9þJ͐Jþe±\jc9îT˜-µÔLÌ¿%Òh#¯(âB›5h‹S ¨V,A°ñÙ/iÅÍ@áël1z™¬ÃðéŒLf6¦Ô¬ÍóÃe£˜óŽÊÆWRF-/)'i14îb䚛®Þ)ÒM6¦kUö…þéÆ`cçW)ƉàüÔ÷P tus@+°q¹êÂôTê*V ^ÒpW 6Êá*¯‘:V}œh«à径PW>®1Quoìƒ*­ š¶Fé¸éÊ|”¨³€ŽŠJÎÅ·Š”N[H½› iÑ'·90]å8?†¾’)ÿ7¸¦\5 + Hœ;…üA!©\ÕH[öXˆ +³<¦=e‡»µ“‰Ï£•F/=TtEF“ nÖWbx¼1"¹Ø_³¿SŽÝÓÇQ'™Ñˆ<ºąŠIì“>_¹ÄæŸ)™hז}ð 6D\ê>öDÛdƒ ÍÙÇÈ¿2[%ܽÑxFÀ< 2„r’´ ?°Jâ¼Fº‘¥Ô”¨kQ¨èçú+bqûŒ¦Þ›%Îëp¾b,⾡ºŽ3ñ%U¤'ÙAa‹»ê +Î3ÑK&Ȗy=Q2«V‡B —{ï\¦œ3úä‹'ɗѽJ`Q$ •Q7ÉxpÊ3ê3Îȵ0B£dUJ”`sCÒæºeÄ%E”ŸŒ†˜Ä¿œ}7£2ˆÆX§iÛW6l§H<ìŒc[² É:+#©2¬1†flÈŽÖÉcF½œ‹:rñ  {×J¿¡¥0‹:ÔW£‘_ô–‘0¨[ž¡‘ñ1êägmtc½ºÆ¬dCDÆ&†Ê(PàBuěFRˆ1¼©`' ²1Å` +`dôòª’«îiü<¤›=šGmœ”‚ ]d ’±Ž3$ê?¬ÌÅ\”={l®v+¸²½Pbê¶Æ@Œû³ë²,ފã´Þf¿ƒ QlÈæ§ÓwŒÉ£Æ¸ë‚ŠTíXJK 3th—½˜ØãW‹7ÃeÂÏÐ0‚“µ XÐQþ¸÷g­1v„6B79'ðo¶PÏ™°cŒ¥ˆ‘÷ò•ò+çþ|™q‰e5"Ð[DzŒ0QÑKâÐdú (þµvàY€c-ÄZª&Íl»w®Ë(³AŠ!Ñ㎧%!®Á"¤-¨r¼˜îŽ;iÀˆk’Ž7"GmáÖ<®,AŒ|T¡Zt8©ÓΎR‘Ú}!ŒªߨmÇy¸´0zw¶Â_‚‘ï°ºF¹Վcx‹ âš·¤D¯óX‚…€|E>­¨>¬€Ì F-ÁdMí.ŸÁˆRñÿ‚±ëžž¶øEÖ¹m”`èX  ±~©þ@ݧµvÐR„oãH¢²ï5öYÜR•Çõ/"–X<ÍÃpH —íFy|hò¸ÁØúŁá5¿ØônübªXÓû¢Ð¬ +¤}‘Ž÷Œ‰ðƪbƒÅ®³"}អ«-Èuä4€æf/ºz ¾-I8vRԮ׋¶ ,®£P":Ê ‚Íð()ÉpD¾éE+jмðøŸ1åßÒÐhrÚtÙë¢Q¡Œ ü•[ïßäiTFU÷ zéC! ^RÊ I./òÊ+ƒý,[· „˜½pŠ:^”Šur±Ú·xQJB&êàÎå)…±»’HçȊ +^”‰ððŸçwQù…$oþF£‘^–jQé!QԦ䱬ʦ}ŸÃ§`®.úÊȈyå­ú˜®`aþæ +zˆ´º„ ÅD±s[ææO`R…[ +äzŒˆ*mÊÐEÀß՟‹Kñ»GAü”ÓÝ%ŒR1Ü þÛ>;>³yfI|Á!3ñz’x« ú?àLM-N\œ¶é`%ҐlT@ˆh 耭KðGȋûã[[¸Ør<ÈVNÖÏ}¹ÃVëX$ø…IÐv“? Nš —“aÍO:‚Ý-R.‚¤1&X&~ã‰Î-:‚~¸G$—åîaã´8o97¹Þ,Âü¹ÐÝòÉ  +`T\€oÍuøk§ç'ÛM`¶þÛ®tüF¥¦"ÆóY”GX¨1(SvœÇœàU +Ûî*µIB•ý:­‰?†çR\Ÿ…> ƒR LÄÖñÁƒÔvÂא½!HøY(ûÝ%ŸrKøsÑx´J0—iŠӝÝ1OaÃò;RJ£GQ»³¹ 1ÐKúÿ…„Ì6iùéu©ÏkÜÆ û¶™ÂS↯}'o*Œ{>ïà]Y'ƒ°T¢) Üu¡{’© ¨tsU$0;]DîõMËú… +Àû¿SœOzo›l|¬¡Ë¬ƒÄ&}/µîæÎTÿ¹ ƒo63‘Cq+HìŸØ‡Ç áƒÙW.nÝÅÞ¶•Òôh‡Gän‹±ÇꞚFÛ‡ëp]‚×"]çš¡u‡§ d¦¨ò˜GÏó …óøKrÚLÝ.ùÕl‹j¸ü n5 +êp¬íg]éˆÛB ªøU]îqŽm‡s蘵w:æ +pw›bb¼«Q®óó?Ò“²ÍO¾ :£ŠÉƒ…rÊÕPÀÿ:6Cp¬àQõ¶[ÙEz•©ixï¶øõå«»±Œ\úI—àÅãÄõž"ñd\ôÆûç‘a…Z¶gõ…(®¤‚ö,Â<^å–6´Ä6Úâè>ŽB*Ì´,HnE£ò­×DÎßy‹$z¢Z7d·¥8Ãý>åŒ2§öËpÀÿûþ· –Ñî$ 4|>pȬŠ(¶ŸœÚ6rBÃqˆ¸ + iÈeõé¡y ©þ*¡_+l%6HèـPó/@’O¢6bP>‹3€ˆ·´:å0 „èš}ö*ö‡•(ÿ¶D¸ʈ;®´ñ8Ý ç„‚‡© ÔÖ¦ýFAÈ+ªøð£K6GX ®”¤öØæfQNÙÀù-ö˜÷Ðø[ùþр1»Ãn$°ÙƀŽ8xjãŸ?![xƒY֎” ëoº´9[zó<2:"ÚÖʀ "îbaN¡DÊD4ÂBäÃ^V;V°úÏj’ÄЎ3»µ™za¹q®(ìùâ¤ó¡½ã+ä¡Aè 3VXHÕ9u–Æ“û'ߥ£;@ô«ÝM›W§p¥BøÞpÄe<ëL»óZíxJ²“·ƒÉ¬„³qÄèâxn"Á2 ÿHä^)ÁÖ¡QôÇÁj”Kÿ:>ÉyŒ[Ó¡ÁŠÄÓЪw —ÔŽ÷¹ žw­Ÿ¦˜!Þ4Öu·J¼ am‚6™s9§@àžó²\š:9áÅgõÏÁ•”;þ¸b3ùöT(¹ ìüٗùmÛÈõÁÍåMÆÀžB~t*ÒЩópã R¸¡0¸qN]c¦‚ZŽè¤!‰ñDüŒÆÉW„]Aï´ìÃãñ†Ü¯ %tŽF.ŒÏWx¢/ąŸ%Îadt•¡ﱤŒªEÜ-ˆ@Ë°5“˜îHû'Jƒk ÉòlgÌ]!“aB @VªââŠg!iuƒnØ¥z/ÔÀªÛ4Zÿ¤Š%¼Œ7±Ë¸ì<ðÇ&5  ±÷rÈ ðÀBØåÝşؒM㢠·ÂüèxãíÐXkÐÖ- +bÉÖHMç{ãÓ.ozVöîJuâ8Þí¡¼ +Ä"Ȕ×b¿öÇñrºU®"d‹Q,ŪC¶á¸ªüáÀR“®eW PÚêk®0¶d‡ó£ûbÙ-@íJ˜Ò_¨Pñ†`­£&ϟ ߗ/†r]ى ++ŸJe8â«^pòŁl„Z¸vª…êÎC +Q[ âs1<,ÒÏñ,!‡ýT䞉=í×؁I†²ºQœàê\Ö¢§}hÁƒ$ÒäœmDSm¶óëùœýðù¯)î*r´: Ú°Cԃ vÏ?%\Y"Ü?+VÏ;WÕࠍ¨Î4¸‘Ïd^±ëHÉ>±ž~èIhç> ô«¯¶ÍJÉ«D%Õ¡]v'¼,+c˜Po8d` j¤»¹'S֍Ÿ‚†OÝìãÏ'Òjð(ÈïàƒD5g,¨E‹,ϼÌn•N觿‚&TÙ[byœä8-üöŒ ‹CG“™ 8Ùý@JûAõkµŒæ5Ť›oá$ˆ©Ð©eZµ^¾l Ù8EnÖÄ4P‘DB©9^ è‘ë6%æQw”sÀ ®Cn$ÎŽý~7P­Jõ 2ã*Vy›©fs$²øvõm±pëb6ŒDI§sü6Yè¾<ÓÃ"-U91sqäü‚fP9' »œû aΑâ¹@K7ò÷)LÉ;ñA¬„ýw§Lº#£ÇG(48bÕûã,y› +žø’È«Ô §tD Ê"ÔAÝ¥•üø¨õ @}S¨¢²…y•Sj3˜CJ $wêR®Ñ¡«_Úø6YÚþ««šÖqËã¼âù­¬×?8B.B2‰·U]c6çL檡€ 'Wºq)8&̽ð–oû‰»oZ€ù˜fÒKµ†‡\ö;!‡{ 0#mPRÿ?Sɨ–û…, ºÆ<ËҒPF&xÛÿ!Ɣs ÿá,O˜ƒ¿2R™¸ê è6ùô`HÀpM,HZ?˜©óœo¥ò~ …%{t4 #L«Iƒ:üè@˯/ÃÆm%ša“0>®ÀÉ÷­»Á²{“Ë8Y©±„BS?ƒ þ¥+•\ßOï6G˜•E»JEEì\óBõ DKYs&d˜,bR½,>ãÁmR5²FÙuÑVt€ÏåD÷´žãÀéBp’/Ô¾I˜0í&µÙë#g„Vf ’›ºÉÎ%N5±?â:½ÉÀ ï&×âZ›¬«9¦øšMæs«qâ(ô ÚÔ´6I ¹ \nŸÕÔJG,!w$k“±|?šÔlOBBGžtÜf; ÁóÒŸ…:òö’<Ø$ƏD*$\/ìC}M²VÌ%½º½,ß¾IØ/Ž†øñ¸4¹¾…zŽ©³X¡pS9>Ù!Ñ +ŽáΖԤÈüÃ-›Î+A8šä‡’=Tšú1E³¼*\`{“Ì~!$u¥A Q òuÔ12â¯5;à«H0ˆØ_ûC|"Š#ïY/4DøÅSR<8çÕp<³®åÈ!c4. &YhÌ=_ÙJƒzP*èd1Ö7䎏ÁO:¨Y•xg%VܲUnqƒ•œ>Ê2D¾‹2ì%™^w'ØmŸËò°ÂeÏ]Rx‡<òF£º'â\joÒUèh¯r×唘 Æå9Dózcuk7.¸òµ/5áˆnôìW›XÍNr‘´´Ïê3(d^3Äé=‘w³GNÖ8R½Ð‹é¥(ú¸ø$õ§8»nÓæîb*ôÏ^ Qþ»Â‹P=P)!Å®Ò×vÓh$Yø-É8­(ÐAÖܶÐ"Ey¡—tc„ÝN0ð©F‚XÈ>ÙÏXˆàÏ R³ds½]úU²l‹ÝmòÌ:Õý|j™ÅyÔÏëÏNZ8Qքÿþ¡zȎ”Ž=ÉtZ"›Úú¾˜’1Ãó«;¾åBîAǪªü^`ɱÙ2Á”6•„©ÜïóôG‚ÈkC Z!0Ñ4èjO²; 6¬ +ö–†N»qYÚ ý1 öÂN…Ê텼ËI¡ÚëT4sÔ*—…$ PþSèHᐮLh*o8l1M0/ý… 4B;ÐoyïäR ÂlÍApYO›•ÃV(—¼vŽÔ=SqØË~%o¾üÀO*+/p¿3Nàű Ù!×J¸¼ãÌáÝeþ¼2œ2å‘`~$ïdÞᑟV«­ªÛðx»÷ãÂèªeV|H$)ö€?ŽÇŠhAá?d93å’E-„ªõjTï]‹«(7¢:ZŠÓáþá…ƒ„âXýP.Aó ø½n9zõ<˜^‘QÍO`DÆÌÕ¤B;õì×›P¡„Óօ™ª ±­,Wß VÕMÀ5‘¢Š\g²ó@~œ{ƒ†3Oý_GA1Çp,øÒK%ï03ÔýH‘•‰cVzþà¨Z6²ßGR„0XüO‰Z˜EL:Ð ñ©Úd"E •šÐ1V™þ#G[HÒ ¼Ô@¾Â$îU!ˆ9ýÐÔw…\B+?I÷_ÜêÒûÌôé@© G¶žcÔS B¯Ô’Л܋]Tw†Ö’.w"WÖj磯1)GUqÈO·>‡sÆþz4:ÀiÙöAÁ¿y9Þslaé¿  Ï=qþ¹ûоz:÷>Ùáà8ÞÃÌCZŸk¾!+ 7Â}áÂw´JîýøANWADt˜ÊµîuP*®£T +~¬š ”ˆâ§‰KáçêÜ£Bâm}ûêVd€áƒüÀum·ˆñ.øàð +øà?üö zõ‘Ïy=鑣Žn30]mL½AÏ À×S½WóºWЊ4oŸÓT+L+D h:­Ø§µ“W9£¬ÒÃøöo–Ëȅ{»€ÜCûÍ®‘iÖK‰ùªW¼}… ^A:R;šYŸÙD«XëÁ¨H :u†TC‹WÄ $¦—éoÿ³x ›± gÉA ìÞ€œM´)Ú©OWª>{éÙΘ”˜Ï™Èw֏G"V¯ &¨^Ïd¥µÔgŽ&¡«ƒ&­…m=!¥f@QÙwœõ\ɎýCtýi¹—°Ìa3ß5~Ôçtog…ot=/l2æW°!\ùZ%‘»<ï~-†+ÐÓÀ‚²¡|Ê^Ñ>Î14om~s é|Ú]OÈËKûxÑG è(5W •&{û wÃÚô!2é^CBmÔ}6óU ö| Wˆ À«YbÃiæâ›;æaá=3,$<á<ðî÷grЫɄW9.©ØBBÒ±öӜ-”kP(ú˜`R#:rç +2qÃ!Ú +‘(O,bl`:ãžÆ„äZ²H§îÜ;ýª¿$4²XP—±€þ_֞ÜÃîM=r^IÒèÕ6 +¶îd=«sä×Úì†÷8idŸR/á>W˨Žã’ÊÝJUìPûŸ-µ¶Öf]..(xkGš¡B„a„êèÐ}~w±\ØʝFÃ|»ëÿL!=¸p…Cl¾ô¤0ݪ¥÷ᦠr¯ɵjWCã&¶ø!¨wqäH7¨Î¬ÀÜË~Ì9׍Â_¢[’’'JÃÍÀb`ä <7k^ãh…8&6zŖ„Øž˜‰,ÛÞ«£CYàïEº¢ª±ŒI5^rNíY<ﻯÛïåàõ\E`m̂|؊gDz. à&ýÓB„ ™]£ÅVçCÑёÏcó\·¼Âm-Ž(ý»&_X’€Pi4ÊjÂB |È5oÔ¯õÿâ‡ÕV+ €=BãÅñ0€è)QÄ̤çtÆÍ ©)¨á¸yÇ¢¥þÞ¢NUá!9%q¨¸·£qÙ¥ž“ ƒj´êo™bh [ÛW`a'2yû;µ­ñ!tû î;inÒpƒÍÔ6’zº÷Èh–±­¬~€>tj…juÿÅJ#1(UµkGªP30/ʭ͎ÁâPP5$T°‚ž“¸¹¡Äñå¼4 㗐äÁÉÜTÓ @Žl>ê2ó¸¦øå¯jn‰³µþDšMRHM«'9‚縚ç^`ˆʯ ǸK T%@,PeŽ’xƒqõ°6L^Bk +{wg9r!Âp!Ó±¿Í(^c—i%㔳$B /MG‘:榢ûgï"ÜNˆÚŸ%c‹„ 2GŒ‘×ù¦Û”;H“çÝöfÊêèxdãв}Žô@D¸giU¸Â5ò÷ÝáüE_#Šù½©,\0wáä3Ÿ9Èu]ԉK}…åó‡©È ³/hcF%L:pšV°:ËÀ‚‹È˜þ!œS²E´9yó@$FÙ] ŠGÊé£]*(cɋڙ:~¢ûŽå”xÀ®ãà8©³É‚GɄƒô®sâTœ–ðˆæ8éälåAQ̈†Äà +Q`eqÀ—Bäùè:PGý?@ü°qŠl`'±Øx7??,k$ +ŸÎ|ÊÉ¥×Ø,vf`Ö"ÿFÅtõliÔ[Ùƒ‡÷ãÄì¹_‹@„Ôni…:<$kiÇNc\ài¤P ¬·ÛÁþÛK$`¬7żÝðXhl.[O˜"s2T2í! Y}¬KIïÞ=CéU.ß!LäôæËÆE`¬ +y½nÁ(½ªë-W-Ž‹Yÿ‰Ÿ¡dI/ˆ/3Ñá¯yš¾Ý|èþâãiÔ8–ö©éÐ"æюÓÊ^[ +,<—ŽËVïnÚöG´/7(4Ýb9])ý¾ ,uËa.“wmªÂ;QeQ4þ÷÷Zx&8ò֍ ä@ÑÝa÷5íj½TäÕÀœ Ò.Tq‚‹¢ ôèÿz¤g"¼™Qe=#%—²¥Âå*Œ()ä­_·¾´ˆtš¶e”øN± Møè;c¡œ7®>ü7ê–dÌ£…êâÇ<쇕üù'.—YÎô}¶LãWaOÍ&ÿ’Úxʹa(`_Íå™æ÷dÿYÙßåªÆ]¸P_ˆ@6K`A8ˆœ³-.÷¤ú«óCIZ‘@5mȼ®&Z¯¡‚×Íáی4ÍzÀÅv2QžäFÞ×Z'î÷•*rNJ×®éì_@‡—Îý†TJ‡.(P9çê”bÎ7É?ÌÐøS7ÀÄL˜òi0Žq—<*Oõ'N³ž8¥É¹÷üg€K³¦Y§jnÆ«2†° +CDfT§Œ ²"Ô6 NåpZ°G}MH?=–ù­?ð71g[Ï9´»ëÛaj-´Â9E€'ã2@Ê{NÀbÀ´êo5×*Á¡³á®x?ëmP¡”n‚¹H! e’Ý XYuKbõ«Ù¦&q .ÝÌ Æ£HIK›Y„>Ú·†«[·ÍÈînŽ<%Ô¸¹ÿ‘¿4A` J—ÙÀlÑQîù„ÄxÄàÙ}D æ3¨÷óë‘ý¡EÂJKªÊc…‡$@F;,šÇ +³HîÖ?ƒçò±!©S㠖^Ômâe!ròäþ¤Òày¡ÀE Åîs$iQ&ϓ#üy01wþ€e'à8îC[ܚ/¬‘åâ4¯J  å»î1!ª<ùçÄÏþÜ,ð*‡òã¼ãLQ»Ì`×.ÐýC²­#§‘^Hñ‹ÿ €õ‰ç¢»®z<¥ÄÿQ¡_ÅT‘%ÒY7M¾ì÷ٖ;ÅAˆÔhñÐ)OKW +<íòÖùÇ>8—/”Ÿ‘á‘TAKU>Íðþ¨8Âé`я£’£&O?րÈõ +$<ëá}T 3ÂǍ;:»¾¦©"ŸŒk ½hÓ‰/Œ„)åËKZž6š$Q4£¹ÒýBò¬q–Ï‹XøTAœÑÔX·Ýe¶g•›à„Ü™lð³ÀÆdv3¸{ÿ‘|ºuà_½^ÿ «7€eÐKÒÔN…Þ³Á ‚ÕÑïò'H°¢D\EIèi´˜âÀO«Ï&.nS°  !AL‡Ø…"ãL°Ž1r±Þ \Gt鋵®–ÊyÖ'a#ù­² hÃô ¸Å¦Dç÷}x•v­dà[r^4/† p®O)6c N9Ï¥% H‚†6Ÿ<œÐ}$E 5¤5ïõ—õÖ¤Œµbs—¤‚6ÿäGð­ÍÛ1ã£]D#¹‡DmKñq‰¹8Áù¬¤ãjrf-¶ =ƒì—§D‘t4MU"‹-f ¾ + ÛÀ™0¿Ø03:ë⨔Bþ ï.̲êH?3gʧŸz#Sj@öôJ˜sIËÜ&À©d„÷§)ngWC?–ÏYB6&0<+‚dAöß~AÌwð™ü TuO+¾ã€ÅÝän¸ÞZ½ß{0›™ qX-‚)ë%Î0fâ ±OLÖ툎fnV&åXü¿²ßVgÿœˆìÔÐ *ep$ qÿ©bc¦¦1i‡%ë¨è3·¡L§ô””鋱^• ÁÖÓjÃX4ªû÷,³UÔʳ;(hÀ°°HH …" AR 9@ƒ@4 r#7ÓÙº„È&å¢ïè32"ž¶µK£­_(€AÀܛ)Ùk§]ÿrõ^k:K&ݒš%fbå>¬VDóNí̓8®*–Óâ)©^f¥™Ò*¥‘àÂaaâÑ@@ñ¨¸ÈÐÀ1a¡T< hdP *–ÆEc„ãBƒBdžŠCC‡ +Š… ‹ˆˆ1h¨˜h0¸p<.,ŠGÅÄCƒ‡ŠGº³ÚÍW¦·/C¸K=£Ý´ž®Öê¸?5:ä{úwU!—h/›]VDgWy§2ÏÍöys¹;çìÝ'©ÍgÚÜmåþEO撩ÇI·±Or›?ý۟ßõÓ6mò,ßÜÛos›M×ëgµ±AÿG¿M^‰x?¯Ýf•ö6NnsÊ÷6ç6Œå¶ÿÊÊÛüÏ« ِÚÔ¯66µyäÿõÿ¤¤¶qþ‰I±±ù­¶Ú0*@ EÄ»«ˆ„"”û¤WÛ¦|¸-2‰¤¬´)E"`‘ GÅDã‚™p,ÇãAÄ –J[d‹»d‹zãå¿i<ÙY†‹uª´tY^ßîÒW¶»_»½ò®Ëªª^¯“õÚk¢:TF«à%de&ql-±2feÒ̬ ٚÕ+3geUÎÊ0”³2f¬ÌbwV†J¯Ë«æ“ÔîH¤DXyt ‘œ·³½ã*!6¥ÅÿÈV¿™©Î“ÇEt\ø²-zuWWXG{§”Œê,kû³V''÷sÉ ÏiÚÞ]Ù Q±±A\ (‹ ‘ωHʓž„‡v‡x›'Mì×Ñæx[ig¹ª*يþU»sÖjWl±£‰êÑÂ/ááïÓb$Ȥnqþ·9–ø6U66vÌÌ2xô¬½ØRÓ@&g¶·›™«Ù;=Ëùû³Ò©LDÄãÝË^oŸ,ÒÔ²§OOÇ_”«ŸV«íûü'5?¨ª}ÿקb½ÜcbÔ¤T˶]—ˆ˜š˜™˜yóÿUëWýݽCÜÓ;TXÆsŠ¸F<î313шˆ”™‰ˆˆ™y¶Ub™k3ژéÜuRQÕzýõæ’ùÛw*·¶µ¢?kÊSýÇ_×{{½GëõzM^ÐÖkëzרëõÚ_¯ë¬×º>§ˆj>¸¤¨”ÛM0ðh0$ á‚(1ö€2Lv0>R@H:‹£Q¤ AH)c 1s6j‡¼g •I³y2u ~€¾Ò€¸ìxm?öY-Öµ-ß7Lsò0>®•ûÊF¦'!‹k?i¾+τaTV£š°Äô"¡Ìˆ™9Nô`LÑ23¬Ó %»Ðã\ƒÄ¦ÎXjšÙh-9œ*›_";Äbƒ¤šÜñCJld6€¯¹€ÈˆÎ&˜x·Î7³ž®IH¦…‹ÃI\S?[㭅”€]FiÍQmÞw³¬³d ¾{,kÅ°æê(®|È?‡–úÕQÛ7 +³t»5¯ŸÊÓ`7i§¹ê²”¦9ýJðøÁ4|›‘„«ÌҀ.Hÿý¹xž‹Ð47áÄCi>Hš |AíXÏÑØòÿGñ¹›ÄŽÏMK¡ü -žè4t(ªÝq¼žáÏ`Gwπ¥yìXf}ғ\!Ãg¼] …r406U7³AbÈf˜¦ÇX¦ØíE@\è}x=Â‰Xð €­8]û- 9vFqzÅ^‘‘<0ŽQ芕³\έx[)|$àÍJa0ÇÁé>2Š.%Š “RA‡ø PèloVh6@*37ò\P÷٘²MVØúm­–"ÄÀ*TUEY•2BQ•H£¹K•«¨¦C•£fðTS‰"ŒL%Ü£Ñ$(Q©týR9DÍLÅýëZ³‚퉇˜ÒhhTìÇù£1FTôÅ-T˜Þ5e"ª ²'1!Ÿâ»vÄS‡]§ÐG© ò…*`cúúrGHµHäúÔDÿCéŒÒÈ%¢Çýh€–3d¹ _('…k@–Ï«Stþ,·þl‘&W(Hì ¢½B yžâKÍc!1#,x¶)ٕµ%˜!Œ–F”Ì]q‚/>x´!–BýøȆ¢VùÐQ«HS)›Àò¼.äŒïV€ ŏ<ŒG‘â4‚Ù-bœD I|E³gCÙ#Ø£©eß…Œ-måv¤Å\Ìpiäánt ýïÌrŸ@.ѧB±/_]¹üC~ +‡#͵-–LmpªØ—À#šYø’]Œ'¨/ÀTŠJp8O’¤GïiˆEç©Ýˆlœ­™DFa#r[ّ´$Ûb¤@7 ºÂßÈ;O©ÕCîX=<‡°œ +4ç6_Åk¼³”¾äæ=ª€Îð°¸NöÅm¬ï8îßLÅ á6Nd£þ #–’ýè¸É´áù,`îu}Y¬„*^¹è[Ejñž%ö‘Ñ™< ÏòV#Ö7ç4W§¯v ¼O™ p}Y„ï4 +D€=Í ×íëO‚LðËÏóÍFƒ1P|§‹ œ®4%;M´èáubâRoÞÂQÂÅ"…!óƲÈËš—Ì}ÇÛ® GÝ/ûpA•¾cÕ-Ì +‚¹É_ŽØõ݊Ë‚¾Úidæ<ß/˜Ùi:ž+ÛB *€7‡„òǀOÀTP¥$®R­dÿyXNÕâ aœnu6ç3/|y2Á?iŽ†¡¼7K^o;âÆeüšÆ¡ G¡ñy‹æR˜å™€Ú¤^†X–J$o ¨®˜aT$#ÏKï’¯}/U1J܆CNrÅö9-ƒµ, +“ U£Ӗ¯Ô™JX"¦Öq+ŒÙ÷Ìÿ’ƒ08É"ٶȺ°Q¨§kÙ3òÐêh‰“ļéèç'ÐIÉþ~Xü8Œ„á‚Á¢Œº‹¹3GÆÒâ“`™×R‘"5øzÍœ0Fââ†-ÄîYljÀØ%OçðÛ½…æ©®{JÉÍrC(Ë­+“Œ´÷ÐÂ¥UàDah¸‹ú`·»üˆeáíæ÷pfI<•8³Ë’)¡ê·ziý-Ú2vÿ þÚq011Ž¶˜èN~To3…Ÿt« ;ó<Ò±¹¾S“…¤šë.dyâ…tõJ†.×z„`šO Ÿ Î8[Ås1f»ÅÈt/]!Vgla8w ~”ÚZ|)l+ܯŠbqI£¢<.úqeSÏ®HKz'äÄzÚoµƒa¿aâáy-^_¿9hi/yfQ.©æ÷Í¥{ЌÉÚçK-³~Ô¶1­T°k™«”TCƋs¶ój ÈN™Ð] +š¯9?^)MB +ï ±«·4¶RuwªJ‘TP¸g[¼ƒŠüK jŠºD~…f¾‰frӔzü¼Š8M’´d ¢áÈC/Ö‰rVG܆«4 + €ùT)¿K€ÏÁ ò?½„«×Z&ZÇ¡iȶ&%œ«ý2PlÏuZÿKY–Ý1·S*bh¬§Ïs‚œ½>Ҁ›Z&(‚2Þ0dmR_yï½MÅ2«wCMjÙpS¸û¥PÆæ]ʶôàS]kˆ–¥¦´ìj\ÀÜöåôKþ³¹º¬GÓà`„bswíN(B¼$Œ uv—wºígÎÒí«5ZCw*t­“ƒNa#¹ƒuÖGµYU˜…±–ŝ½ŒœW)ã˜,l3¸K}:"GrÇ;ø<Â;þw0>Ã*åíðãvqÒÝø,`‡¶ÓÏ0‘­ÝÇø!0ø΢oè6ÓK6c×ä!!bWèà,ô™\Ô½?~ú+t[1®#xXìqÚ@í<`¦ËjGv¶ŽÞô ­£§äÝjVÊ T(ëx,dqÎ`Ýטsÿ‚9\Ýí–üYÝÅ2ˆªº 9Å8ÔEu£hÔ0™*<œNÔg4]h}yyOg+ž"eLKG„’F%ÃNé»Ì1Ï%ÝŒu&Œ¸£ C#FÇ cxˆNcÞ¨ìŒ ðÜ#t9ª S~Æ8_Í2új£N·ê>a²®¸ŠìSæ‘wpŽN±ênîð9ºeÜ*0=#ûàDzz@ÕBGâ¯GK‡ï¢æŽŸÄÖ3*"l£r5kzí¹XâÂéRÑivÌ\tçôþ%ü46{Ô°V®H‘£>ÜKZ@~V̚œ]Úò¥Ò:$Ü¥u_ Ìß& ÔàÎòtGÒ´sQiz+…XRA§²¬Pú™Yëªåß„B£Î¦T>)`:ž¨> ‘òfÕÚ?¬·EJdÍ!M0-:ÔöOáÛ~aK™·ÕåXÂÅÆ –2đO4þ&¤ªJÀÝ6JÉY¹okÀHº1UÔnuti}R0€T¤0«È6 ìw¿j’87(j^÷WfdÍ{ÀȈî-6À[ŽÑS‡2cUœù&†#a{0ˆÇë8Ú½Œà uÖöÿ³xœb¤0…ï=h­r6*EÎÁMŸÑA`°?&;^ƒ¼¯"é†ûÿ œ/ÀvC,‹o’fŠ”ƒ fM }7< P÷—¾×FВ¤ñüž/¸W?.Ž¿L#&ÆàwÅ·ÀÅÉ@·‹öEpq-×Çó™ Àã! ‡cx£fU@´ËÄñÓF¿\"ýnøbgX£~2ù쐮è˜õ„tk« ÿJôa0jÙvÒeÇg„è¨=€4Î*‡Ëtò-êñÊ®Ž¢(…Eú½Îcúå\„`²ÈA *`14’—^¥Ù¢Pk»Ü2i5|C?Ží)ð¸Î­ðCºb9¿°8 Ӛdž7ƒ¯IcàΆÆê#ԁsn?b¸Þø]Èʉþ–­·úq–Ó{ȓZ€áC;–’.fPà£Ú‰1áÃuCY¤Ó{öê1¤ õÄ«žY•Ç̤JC:9ü0幜ªgql”z;uqgã„9걆~:´¼kæ=ˆÕ¤©†,$ÈT¥|Ê!lÀµ~uhªy…1)HœŸ³E• +ñc8 ýd¨oÆð÷P©5r²éa Ä휼+–+BdTéWòCÏm]-\M_þ:>–4ïÉ|]ÇaIa¯[”?LВ×pç÷/ªã>m|`sÓ‘ˆÀ0åTHòà +¾ˆÂeš…10^ÚIk¾Vq"&,aV]žxnÐՊ,¬qÌÆAòŠÐŠ Ô퓏àתxŃò$‘0v«6Œ —›Cµx00ú Cõ_©<iÂyR¹ -`ðt(c·¬`Fϗz˜êóMâ ù­8.m…ÚÃô(µaH|íí9<<ÔÁœ¬õ¸ ‡–AXw¯Ùr¾*”œ!¦œGФÄÖ `R»8™¢N=¦Rq³hC sLô|¸ãs‡u`± ²K¢‹€ÊpúH¤[’¢^kr}lê¨K Ã@p̌/£Ù«ÌP>WÚeg› [ü¹M7¦¸V=Hžoî+oÐÂ7¿âc6B… áBYdؐñð©©KZu€Â¦)ƒT"|¾é øD¡ã½éJc¢ „Ïpa» §®‡º—ö3Ô­OŽ¤•Sì‰xKu’Þnuu҃¿ |l·”°‰y\•¢¥E­†¾”’”®˜!)9|nD@H¥~d€£ˆL.z&FÁ$ñ ôþ®Ùþ‚6ä ì·BG‰ëƒòkRËV<2FÐrf%¬mµµQHGó]RŠƒúþ$Ëù‰Wr…X3¹‹ ´A`ë€òï±s +_LÔâ°ºEêx0SG6I!3f„%Ãxè{9QEͯª4<<¡p„ÅЋ$³lEŽ};@ Å)ːÑO’IÞç5daä†trDÖ"u­!5 ª &j)pPî’˜.m'Úu>Ï')îm©-XF})3Lw¢Ñ‡›ØLZ‘*mt•v¡$W72ZvôWaáå.}g>²rIý\\Ê<ìjψ9^r—/úJ£-¨Î %¥’íB¯cœN·ñ;¡3ÖżÕnN”PNÅb)…æ2â=Îx’°2““T#Ö^a¶¨MhD‘Œì-ö #˜Ù*ÔT +Në]m£9$ÞíØgë~¸÷qÛY†FJƒ\,_\8. èq³Þï'ëÄåþð™ÞÒ0š±u¼é¸Ê6њ“Û Ÿ´ƒ£=Zy%Á|õ.C‚ñl[¶XĘ?ŸÝjW„šx˽՘•5C¿œbØ ;ó ê)ÅÖÁ=–NÀ0¢ÈeΟŒôÆ.i†ÏqjѾÄO{1ûZÞÕêg¨C&и…Áˆp﹑ÂegWõ 6êu¡“·³—VRÈ$É{ÏU¥wdVΛâÜ"F—‘†(2fÞìïo=®tû3‚¶ÍD%am C£7ííl/Ùº*Û¶Ë{œ`aS”Ë_ãÓWºۓ«mýì!5eŠ9IpN]MÆAª…àQ±Ñ˜“ˆ‹üè3,:)îHCoýù&AïFïgPÏýÌQéõoŽ"gj5ï ãþÌô6AŒL—ÿ%1¢h «q’"L쬒µT9í£_"´y ºÌÌ4×®FˆàsX–ÊMOüSjšýWñàsƒ’ƒYnæýÏ?MñØmÞeqX£mË+c†$¡= Ô뛐ùæ1Ø¢dùìXÍþÖʀí9süJ8J£E B‰¼0Ä ¬ bwŠ–zv¡F™ý¨¼‹ y`U‰uL%]HI†"~2b ÄÄl"ñí¾e\ß®è(ºÜ–{›ŸÀQ‰rûýxx¦:¦À†DÐ÷T¸_Á±`%šƒz¿˜qˆÐ­×@~õtÀÅôO%hvnùÞd‹ÏS.•è×9{ rNä•-ʉ.@G†ƒËô!uB¡œ[æõñ>§#f>¿þ·Å»Çñ Nãm§G?ÁL÷ñÙ°V½!ì¢SsÈɹûÕ·¬üeˆö‰nÊfB¶G¶ÈøЄkð´6·Ùà­Ù´“ìQØfã¤ç=’$`ŸXÁR C鋀·ƒœÂßø,v*/3×nO œ­Ì+9AVÁ¡tÇ\n>stream +âê1·|RÛL¦ä è·¼oÖs™Aý¯&Š˜°ÃÊú+‡é„ÎC|î_äËa«üküb@.š ì^5X ÒÌIΛ€Íèá}IbZç,Ž„¨½Yå«Æñ4@žTî²Xf¨ÑÇáõÚ¨ˆ^U0Г­QŒ€væ.b”A@’Ðx«ÏM:ԁ8@¤ÃmÔ1aÐR9ºP9ÍEˆ=Ëa +Hð9’Ï‚Ç÷’¥.tÔµÔ DfÁ) 2Ž”/Î/àù•96¦ ¨¦PªlœfuÃKHTÀsôAHµp8úAPr—qU(˔£C|ÇÞd>"ÿ.# ±}é6 +Ðè_Cl«ôŸþ©¾#—ÿðÐ??àžéàZ-6åcˬù_U\¡ä__uóâŸÉ(2GƒІS ì"ÜÈóߊ°3'À¡Ÿ*™Y¡*töåCÔÿ¶ÄJÌ÷¹p ¹…ŒNéˆÿðIúõM|€ L†ˆÁ÷c¦áNLNt?X" îoMc +Õöë§ÄÚOÅÉñ,MŽa¿ó£Îõc$é}_֐F ôkrI¢ý0+}4¿L–›m\kÁ‡ÕIP-¿ kb:å_…kw¶—ü\JäÏÃ8þõm†ñWbgÜ©øW[`Œ¯ë£°PåâÛÍACkÑ×ô~¸ÞkþÙ;­„Ý×c#çù?¦jÓXçCˆEŸÃù»gømœ6¿‰Žoš_PœKJYT™o¨”7¬ïé*=—I¾>« D~åßÞ ˜üPVxü¾¯~5TeŽŸr}›ŸÎhü–m°Æø¤ÇâK¦ðJñ'ð³~.h+ñá{—HI>Lykô²«ò<¶ÂºÀß' Âñ;à'°¯@`øûé¹r¨¼Ìü~Öñ˜i]?I9›eò¾ô™Øá}jß(…ú —«îP»^av¿æSÖê¾Û.<ºï„¹g’Ík$ɽ_[-q¶cG +î—LG<ÿ¹Ä$íQÈz&´Ÿ>9ŬÒÎ~z–Îìyq|¹ðgØãŽuç2x{Òl|a¿^•¾®€}›¤úz…¬^ (¯?]ƒI´Þ{ÔòìaÝ{ È!ë·òԗ"^XßJàvõ4R—W$«·pѣಪGôºéþ5 F×^7Dõu4 ›úWrIêA‡aöõP‡›¦ávèOrfIýÝ ½!¢V-n­ƒ}&F/¡üwßVÑ©_Fô€M(oèCŠÈçÉEvœÜ}ãsˆô}ãÊÖu’½uö +A?t߀ì`DÛÊÀ£ƒ„\Ô͟f±h45Ïh—iµ*ËY÷"ÆBþ*Ž\̈´Ë>~çĝݙ•9g¬Njž®0›>X@„𲕢ǝ:@‹šDàMaÒÈ_æD»X8– ^ðióVùfCb<íÍÇûëZ7'~u:ފ~žpÚÌQÈÌÆÏç{zÕBÈ +.Õ§ñ–1FÆ×9¦EÌو:µÖsñ5e—‘:aw+û¤§áëyøðAnÍáÃ1ûe—û™+ ¯—`x­öˆÞståho)²÷ԑg”¼üecOÔ·µ>tð•Iâ[úBÌ·<Å +é»Äžå7I¹}­à×8©9¸ u«w@ÿQ2)ƀKD~¼•VA«ÒïÁ:ݤ¿5Çc€ô]ox§–ëqQ*ÂwÐZ¼Ãޥ̣©÷X& ¶ì/͆µG·”è“KI "ßðóÊÃÃîun[÷É£îØE–î}…îÉ`ÃÏ>¿cëãÁ§ZŠÜËÆø»¨p²X +8k§2(ÜGÇ:àÎýÕ¤FÝÛ•7”ä÷\œ§ˆÇµ‡Ša;kß}h¡¥FÀ‘$Õ¡ö ÙÍ´=†¤]@h•iàìE ÷þ-mOÍñ{vf·5ÌDTº»ôÆPv®2\3ɾ]‹¥m X Ž¦Ê®äŽ³Gv™ß™åÁt?Ë<Äêíd§©;^?î3ƙ¯ðîN"Ûõ{ªžɗJâŠ*Nœ¨3º}Â(YµÞP¢Ü·M@Ygp;íh·‚dzó.Ö÷¢`‘1HºÝEkáüîˆÁ:•[ö>¯²vÅ[V‰€ËÄ·ì>/-­ +4„” ¦o=…霳jE­…¥Ê¾&U/5`\ÝI¢wïPJÃS‹ðX:GnmýsF¿ÄÃáiEÕ:¥|Øh³ÿÂÜ_ƒüw¾íǔPkl¾ Iq‚ãuIi灔¯§- ßl àB7•ˆÅµƒ°Tüþ#G«T’]¾”¹.ʼn»½ÿ<¤/ŸHúéoJlI=_?¿|<Ëz°ÚÑ×Ú1‚òɰȤò”§¸Ú`ãäSOb¡ÎЛu¼—³L–³¼8-B§Q|z’Â㓠eÂϋ]ÈaÿÉ Ràˆü¬~1T+B*ݕ–¨s3¬åÚ(ýñ-Ðê/ŽEÖ𝝰—xN¯5²‹ý‡Æa +!ƒ”Ó˜—igÊlXJ¿aÌaIeñ8¡køãäÝ ùtEöŸ–âÑÑ)àW±™¼Oa‚£æIºch8ñ¨‹{kœù˜ë«RÂ'§DÝ%JŽ_/ö Èð‰Ù%â@Z·³¼RæUѼóbVbGiƒÄ7›z¡Ã‡:Ч%¸ÇçvŽÃ©ß!åñã¦|ÙU æ&™TÁ©+‡Ö’.ÉgVLœÿXÃHÖ J™fKD:S=§=·×N/LF%ȓ +7»°'æ`¶žcÊ8ðR.¨IÐí3¥· ÊåwÊ'ègåÁñ\ܕ^¯ô«̹¨Jú“b~-„Æê=Õn"ˆZ•ƒÊŠ-«ó6äœ!¨ÕŒ"NœÜ:6†JÁG‹=ÆrыâPŒÉlrE®âõþ~«”øç°É¶kŒ'Ìι´õ0Ù['ƒÉS%2!âåŠp”#Š"I‰ =Tó ½#_áZT‚«Äòm,]§êйæ’Íz8°}[F;¥Px_ärI¦Q€” +oÇËÖÒ 5—ÅûEû]%¶ ºBG3ùn}’EG`áY_|ž=zd·lÁ¬ü©C±êL& nåã#SLûTHä„3]? »El¢ ä=Rô-ÇY@åiDÃE‚E´ 5°GTR•{k‰äÁ„úŒ,;$†p×x’ÊĀ„éÚ`nÊ]¶{”ËaÓ¦ÕÀ (ñ6SßÍmúERÉøc (͆4×ËpDÂõàDÙ(ö¼c:D€iV애Öh•i¿Ý7~«m5@Ðÿ±Eê&Pȁe³wýñ¹7îE‰3 óèÇRñŒÍÐ9²Üý*ÛìÞËáÏD5$,ÑAs¡£—GÔÙ¹Xô¼‘ëVÍ?Iqj—FQßÌÔëRÊN£xÛç쬝Фµ¢Zp„áZ U–cÎV¾¡ê4͟£@¹Úz“à1ÿgâ—VBWØ?W8k¯¬¼\¸n$ =7°ÄT¤#poÔ`ÝÒ(1Çã´D'öˆGä4iL³LõÅÅìšï,¬ccÆÓ͎ýö" ˜Ð}'ƒe Ô3+C™~%OR_S®L±î°ËlCeu›(&ñ€W'b1/ZÑàí†d1X<’"þñEXcڌôês=¹”¾­moÈ(b½Ã¡D+d€•†ÙŽ}šÔç·浘óyɑwà”YòWžWw(g:冼„R.:AI€Mo¤‰£¨z v„ûó3á)WÖ ÛS>-)ýÎ&²°=ä%*RŒË`é¼S_†Ÿð±¼¯¿ 'ŒÝ*Ò³@cê_€1Ìp9ˉ;65I+Wϑ—Û‚ðFã¦,¤¨WIÖ¢|Ü¥H…<¹1™‹š­ ]êô_S°'Av«‚Û?ÏK< (œ€WNN_¢‹ ì9øQ(<"g7W¢0æ‚?×ÔÐ8cÅZ|l y„Á;z ek•G¬×h('hñ‡°õӏ=á#“Ü5ú_q+Sƒô¤äŸì+j’×HÍBIPƒ·º¥X¬åو·ƒQêFBÃvÏ`qnãQ¢¹“,¦ÐáãFW±t|‹6¦xÎþυ"O‹Küҕ/…¬ˆó[% +&©0 %OD¸ éRp¸M[ÚcbŒÆÇf§ìáú¥3+KfÑ\ì¥•Á±ÍÑ7Íé{ÉÖ¼etYpŸEQUd¯ù !Kk ±¢b-?0÷2E-GWŽv&Rž"þÑ]'gJn]žLUÜEWeP….']Ls_›j@wÞƔN¿Q?[ƒ97|‘+=C‘¬6° û©ƒ½¥•ÙNJ§ÓZ9ÀHlt+â^™ˆVsÉúd¨ìÿ:îºH°T?‚"äúÇ …éiÇ23˜*Ì\‹øLò*IR÷#¡0;%:Æ­étíX`^— }ËÿÀV<¦KDq4Nä;è釾£8¤-pK0#â{‘(ìÀœ±çg—È9¿~þ³2äýÛ ÕCYÀI7†•³¾;Âì¡´è’,ú hÜmV7 ølF½ž26PSÆ1¯ã(`À@†¡?ǘ³ +™:'ªk…8Ñ^©õ¶ÕÒL³á}Oøi÷ÅüU™™q +ÿ»Ÿ]#ŒW%0$äq¯~ÇÖmm ¦7«ë¦Í)6§)Tfie©9p¡®UÎ,Ž†Úá‹=¬ÚC´`: ¯XÆÙÀæ[Rx¾pü24à³é¼ÑӶƮŽû*ýÝNÎ[<bÀèv[”Àzt«¶y^)Kœ¥=©Kª°J]´QóA‘Q;qIÐðaÉÙ~JXöy(iø÷…/VꎐH #dâE_ÖáÑüo™Ãr´ q• 'Q·—™ÓŠ6ùöŽ.1Óý÷Ô7'áÙĬ ýŒf3þõ#Rð-NaFyO^Fí"šIyôÞÓï§Õ”Óoó 5çÔߑ;Czæ&•RââN LÞº-lˆpy÷⤷Îu =A¶<ý@xEúÇ@PûzÃø0<ÌN̏`d}Çwð-åú…émeøUǑì?'ó¡;é ïJšLGÐÍOR‘‹õ゙P P‘É+öHF¡|ÙïJäb‰S³”Ž~dÆæ +&B'&l Š ÇHK!uèrÌ^…+R5úêTœ†^ŸÁ\ˆ’®Èv„k-w†-¨O5ÍÅÅ¢ Õ?ûîªùa âK–%frU³À‘z.@ÚèXXDr—×ÆB& ¤€`û½]Ln#mÎnˏˆP5ò;”T¶Á7m¸ÊDšj̓ÑA Ï¡ŽjëÑ62ý;›`¥½u­ç ‡ 4͌³ENÖGööý(ŠnÄ¢[­ˆnv㊋Àm±y9&¦ÆCY¶t»4{Ë®>NÁ·twÔ8Mӊb±/Žb[ÜÞù6GÄ¢Vf|¤¨«¤Ô½4M·G¦âêÙ­6w G64\S/Y±êl±:zҝ…OŒ`ˆÖÍã©Å·C,’r…­©´lj,S÷BCbþ2J´†wóåçbc”éƬ«â6†ºÍ›EîÝÞv ´+‡¡ P͓/Âý™sû$v9’ŠëLJX= SøO{³8¦dE~BƂqŒe,Þàˆ-W6÷%xŠ3þê~«Öt(»Ó[¡îéöXOõ[Q¥S¯÷€3®1–¶.ߓ a­í;úÕÞ4Ìcª9º¥f{8‚lhM¤æ@‚-ñ—aöÁeK‰té1ß €ÎD,Êɏ`‡Nì×tHîUéõC6Ø®ÕÔA¯¸\²S–# jnΦ.(PÔm2ê#©]rJ€5ÚA&`éI¡~ZÆ°Iû}M1Ç)5kÚº¿a ‹ƒ£OÀ1!3¨à%œQRôÃ]’äW1BŠwìn¶1ûB}Œ—ÊÏиµtwm‡†¤ðyg2wâª|¥¢\ZÓۋ‰kő¸Õg¿§LÖ…•Ú3é žJ "Œw¯ˆÄË©i㻿x«U¶Ó’CA§ÿaL NC™Ä¯V¢x‘éF֙'š_Ø +‰Äx^üè(ÙÆ÷(y}ÔñgÙ 2ÇD +™Výù³Xd‚i2¨pÀO9¤c9åkO„”ƒÖ»Ê_t´™l˜0´c¹OMã­;"n!>éœðu&›s  ð ɉf3ÇœÁÚØ¡ëÉ°\ÿ½Öª8 wr|Ô4ÔÇ +íoŠý–ÕëN± ¦±¨‚ÇŒr>xÉtT|É®¢„ÁÌJ9÷ג;6¿¯”Ÿ|Ó}àü9W¼•wÓí~Hòâà¬î4i†—ÕóõcĊç¶kôBX `iÍh³êŠê ®êá !½¯ªÁjµô©zÖ<⨠+È@Ÿ‰§z1^S=[fèR½«ù:©îÆ4•Â––2šwRŸ²j§þÑ:òûhUùåöhY=á8Ã¥ªû7uhôMâËø½7/6 5Dñófˆb§¼›úǦgì°nR­q174,…ê²Ó¸*ÁAßf‡ m1Xê×æáºø´ ´ªëg³“ U6Åêç¸-«u‚ÁJ0ÄæÀo&š‡Î±Zª)½×E€R‰s\nl +7uh[…ýi£Í8|ƒçFžÏM‘M²þ^¦NDwÙHÎ€áµÀᾚ"@x¤…i€GR„fÂýîëÁވš0ˆŽ¸¡Šü×eȔN‘†|=âæÐ~µ}¦s¥´w¤nü˜J^J9),œ±tñ£à2£å4C òÉÊ2)Â=½SïUKQx³Œ"@Òr±Ä6÷~.a.·Åz%c#û>°Zjáÿ3ueoÖ¢² N>y fЬþ¶XƒF ³g¸ë3ò°Þ:°t…ÊŽ²Ù¾žtD|eÁ+Ó|²Î/‹ Z.rúõäXD7·«á§(‹0;%å™ÚDSBÙ­N§ ¢»¿ Ö[m×DÐ &¹µJ®ælÅԐ¹6CB¹¿ˆSIª]9X’*’û–¬™\0—˜­~ï:!QšØð‘Þ´5;;q‚°NF‰åüµ ‘b“úÈxȐ‚\F¡¼”k¨¿ä,yiöÎ!œ$ÆØ )üˆ‰²œQ5°8Á€D`,܄¤CX5HE´ØIÊrúÅ]øøè“ê‡ßÃìuæ…foxs@e¿hãz¼Ã áé™:7@†LAP$ÄA³œßÅÏ4o +ŸÞSžÌ“OYÐæÊn/¾š¸Â¹B´·N!˜räÑù¡UôzJC!ž6,âù1kú€­b)³ˆ3_GàmMUKŒ·[è¬:í¡Ä0¨¸2 ®LÑUµ*ü¢¨™ímíÔå|$Ÿ·"“έÈ@c9i)£Çò Ys_»Š;ېo†>áé¬à Ûaƒ’Þ‚éÅf•ƒÂZsd\b³Û¿3Ò1lÀFß$à@<35³!•2G`‚ÇÁçrŒmšo6܈Wý+m€¦lLGΟ€çqË L*?¢§ %CÙ +žEc›Ào“Iñä{ä-/A²îòŽUéôØQ_rdÎïãáxWϕrmIÊÚgžDoël‡ôìÀ·'Û·j+`5ɞy”¨&—%HMê"ßYJd¨Mg6¾»:“­«cô(™ñ»zç'Á4ˆšä⛾)ü_EÍmÊG€5ˆ7BTœvÝgZ6¼ÅDåI›#xÜäØË(F$¶6î?Qљ‘)!C!huçÇ4âònn4•‹WE?`¶Ì Gе—?RØ¿ÙVžŒ£Ð㿕R:†ÂÔ2QhõVñ•ý­êGT÷—‘ÓñBMºŒ LNNÊ !Úp(Z›IàXgîSC΄7VéYK¦VTϱl´ 3DR£'ŸŠ_±/QDJ£' ‘‰ &Ð9°].”÷0˜Ó 1Äz‚"m˜ç´í̓^¦eõo„Ü8ïÇã0Ò/•úMÀà0²ƒ{SD‘Àñ¥¤²|54æjû'M‚*Šsd‹ RK©Ž^Èt‚I÷'Œ'?$ ù, +]€ŸèøÞ?· ºŠî1””á˜7ì QYÞf:™‰x)ûjI¹ Ð2ëÂL(ç*:Ä֎±^µ\ae¬/bž8°-¾rRŒ õœÐµŒ¸á·Ô¼_[ö›-Iù‘hÂLÿg|cÂ!åeۙ~™þSZÄ2íy–ôif9ÓF»Ös䉜ߊ$ˆÿ‰;‹¸€ ý\6ÏTöÆnñ0¯ï‰ã¦*O;ìʲæ_E¯Ì3²#6ݤ—‰a a€Ì°;æ‚åkL_BVç#›8HÍL՝,(È£³O4ïßˁ?U…0Ðæçqwr|n´çœ€·ÐÅYPþ¢ð·ÓÀ‡6xàÅdч2ŠÐsò-`Y6 -ÉՍWÛüê©£tK†…G»©* wÍ¿H¦½^ô³aĵν1”%ŠFû½.4P³‰#Yv¼‹dz—1ðÐ=ȶõºãÇ l@°ÕŸ$Øê¦ÉI͜ ±*%_ ²,Q”f“kàÝèTqtݺå‚Ô¢íút$9é€?¼F9–Gâ@‡MÂñ‘»?æj…Seª¼T(/ªµÙhç¶ÉŸ¹CÃz4a= ;<Æ'4¯ ¸.eU‚l|¿^˜~Idʸ §K®®[È(:dQ¤‰*Ž_h¢Y"° +ûí|Í×r¦Kr²-)QtvhôíÁKü’Ê7ŽÍ/Å¡öŽ„&#ñs'CTDZ´€Æ †ø€¯ÄU¨mY: a ¦PÐNÇÙ©áE¼‡cX£ ýs¼"Á‘ˆ¾KÙvšAzÖ=Fä èh>ôNp¶ÆéxyEP䞲¹´ôw«á 0à7À!ÅÀ<é4^ +Y6·¾ß€xYÑ4‘Ä«¹p÷`nÇTsnNZÝ6†•ô¿Ó×]V£-‰0tôw(—+|<’°É>S*C:/ò­ zÔÉ>7Dp´ÖÙà…ᢠ)O76%m*2ÉÙ ¢8=FNZ3å0tøTùˆÓ;äoÎœRé*A°Q*E’ Uǀˆ±Ã§³ÀoMhJ~¡­´ +UäŸÌm-˜Ÿ5ƺÈe>R†[zž±ÄŽ©ZƒK{a.æú5æf¥Ý™Se»^â_N,÷Öp¸º‹\gsjxÆ.b”£aõwNS£UAŠÛjô;5êоwæG3œ´OÛ7p¸à»Ž2€fäHò†Í*Ï‹@•Â%Ýb‡Âú~Þ©rs0¬W€ä•&±Ë¾æOäß2œE襲!̎‚*£™Œ™l"8„ +ÈðWTËåsU»Ô”þ÷"ÖR}M›YTS%Të1Õ]°Ç¯èEõRé¹ÔÜWtwþG>•¨TΗž\Gúû?-¡ÿz¬Üâñc؅0q—ô”*-L°Š«0Áõç½e„P¬ÙÃ.a@«9+$‘$ŸØ€ú“]M¶˜ãÌZÕ®®Š¤p:¢¨d360{yÀŒþ1¢Iñ¥ä2¿ÑY6=­Ýõ°)¨*~¼_ÞÿŠªùѤÕjÉ,5é÷Ké7P‘» ã÷Ò*á¼y¤1ã !ê@ÙÿUYêý§Šë)Íï)}HÒ¦T/¼ê+ ^Ñàƒ^T•JúM>×uS/ïT¹)֟µ÷*ÅQ)Ïõ$€GŸ©š\hvGÌUÕÔâ”÷tFFü·>Ø©æC:£Á¤6Ŗ@ ²ŽNôô}ÙèŒH5øln@ .:óÆ?VÑI%bèä²wG‘ +ÖRÈ+4j^’ª¡³}¾øÞ3O\èD¡y€Ô˜–Óø šãÃ`pÊ;û9í;ï4ܼ”íÏÚ礒0âèT:ùœ‚ÿ{NX­v=ç¼Ç­—6`jéyNx‚yŒçÔ^L56’qêx µsêômó»/¸Ñêéœyp45–—)\ÙjøŸ[ÀëŸsV÷øO9g”CöÆ9[6õ~:åL!œ3èf*є8¶[tsœAS"y°#ÉáȕS׀óCŠ2ޚa‰×è˜óÛg¿{6 QÎ+»ím¢/?œŽ‡.x©dº:­Fë &Œ3>oì19 MŸâµÛr-ÀÂG[–"UŠYqhœ:|†×•tS)'‘À’M”¯ ø ÊՐª§·L§žÉ¼ +òÇ ‡l±Ç Ìu„³€²›¼n*;"ØÜ mÂúP“Ö!§– ×rv¼Ï DÉÂ#cÙL çv%Ùýãä²™Â(=—˜…èÜ ¡©Iv,N@h£Ù›sÆܨ‹ãXã¬nBúÐ?Á=Cìh3¦ó֊øñ»8†™ßaˆú™ƒïډ}ªìcøԚ¯8ñì^‰26œ/@LK녲<қⴣ(z±9¥ᚾ‡";_HÙ¨éËàTà†®zaWÙ3ír"XÔ9¡Á‹}ã¿DN™AŽÞZƒXK}æʬImÚÌF~Ékêckn2Ãî® +#%¥_V«eÿg`g å…Ó¿ƒò%H[‹XÜú6€à>˜ŸS89Q2¡¾D,$¬p’Ìs2¾”7r|L©EŽoC‹‚œO@ny‘Œ^P¢Ã’(Œ9¼ê±1ê3oféò'ùY+7Ó ¤AÇÐxQÌÏ Ú[pžßuàŒ*`ŸWnB¯®÷ÝÉôÃÔfxåéWÿS²-ÊØí8ï}s¾ ›´oZ÷ýŸ…+T@&vSjü!¾ +ðõe*ßôKVÄñM••óÇØACg֔á›u¡D‚üÒ.ÍÉEL»Â¼ŽHîËT‹œÛ¯£ï/oæÇ÷(y“x7_Sßô<°íñæ·Û¨×PàþëÖšÍÅ º¹öƒ ¯kâz7+JæüZ‡œ™¬è˜»=·›üÊ|Gå +R,žÙÍ/ Xìfû^ô¿^7}"û&s5,<+]§¹é¸’‡šMrH ÐRᄀLU ?ÜÜÔíJ05™„ÌMX / +qœŒô:ç\mêš8ßÀˆ,KÓ"7ÿ¾ÿœêÂÒ¶MH7ñ¦Ü…vˆ<Ù¶¸Ù-šqMJ‡›Øà³S¸IÊ]vÚ')ˆN+ nF ·¸É"7LÍâê/¬g_üΔ/0RA]›Øó;ÙlÜv-ý“Çÿx-@ A+ j”G^£$ޘ3¶É¡sûRqaS-)Q”_›~QœÆdŒ º6ÍÅ5IɨŸ•wñ6]‘ŒÍ ¾ÍJ£ÇÛ ³~>ÇæЙfxpM¨3æ´ ½Ú4¥ ÊØ«±´™OôS$mBaJ[±S÷Ħûm⍉·~Ǿe¢ÙÔÐ&¢(]UB€kp,Ȃ6!Åîgs°R¼6r,éÙ\¥(„,ÙÎfÐÃÝÊÙ|ßü-¼ßjP +ÀqÛâÈ&U!ƒß¨( ›”vD§@DVTõQU¿*qUöΆÍn9’ešÙŠf'ŽÎâüŽï +0 [¬3¯LnŽRc7©¶V©€TIX,ly|rÏn‹6J!²2AYR¹·O¿«Ì¤ÊÍ,Ñ*Rvò^FÆÍk("SŸáÕ¨@ªªŠªêCÆDÆR¤¦*'(«™1ßåÝævS5"ž»™Ñ´ù¤"Ê2|fèeê*u•ë¬²ÍÌì̂3“ÚͶíËàáÝÞïnœÏ¶E–äEòpð51¼F“™F×­ï´Ó”Oû“ïÝÎLgŽä…ÅUzÒ.f¦0\?ò~ø®ÃçgR e‰Aç\J¾|ÌàßÞq $»¹‡¼Ÿ…Ú/W³+ýH’·9>Ô6ĸ¨™ À4›a’Ò8äcü 7ËK‡ZNÀȈNHö›ÑßjÕ죞Ø1«ÚúÖnãL„Õ¬oëŽÅp‡ÅE‹¢³Ø*Ö¯ôýñØvNٚ—;Ú|ïµ|ċdÚr‡¼ýiÞޔ¿¶ûœdN™ ™v&eÚI¶PJ%¥m[DH]‰HEä)Ÿ1Ãh;æ1Ö;´h Oó¸j#Í ½"9Ù&A¦*§GÑgÒÕ*eVVG!àE e$ ±d'Ð b‰ ÖèHŸ@¿)‰ˆL™èRH5\ªã´0´šŽ0 Š-âþ°ãå{ˆˆT‹a>ŠÃˆh‚{󱈇öHj€‡ûzÙ¶½¤=lRÀÍþ9îo7˜Í_G8·vþŽ×Ûú«…hfÒüâg2J¬Jé€ËË¸‡ˆX.Ë=ût£Õ¨$ün#°²ˆ@‰FC=PBî,: x4BLLXN Kô,ÊQ@ 2!S@|…Ål³µ5Cº[ºw(b°hì™îèAR}Žò¢KÛPr,˜}å +/ÄCâã \e +ÖÈ£D£scpxXÀ8y •”IóíW*KI!xÊ„„/aÃÓPU=TÀ"@ý' ™a05>Zå-7uƒn2óÖhö–¥ÖAg ͪnCmä ¼ÖÃæ4׸*ƀo ´÷»¥ÛµïÇ ¹*<p¼w©þK$ÅM<€Ì¤ë€öX-%:|£)Ý­a÷‘ªË£hp4œîÂÖû—.¬[ŒePÿ\;[)þ(nQ¸7FÛ%kíªB¾Uӛ.BËßV ”GâÝ_ñ,Ã7^§´|/:ˆJ¼!ˆ$Ǘ”Võ—Šä×88”°ãóÉà(’O#÷Õçý­Ž¢M¶ó#`_>•u¡Ú-€©.5VÅ5@%Ý#`,\q- ÇaÏBD`YÈÇ+ãܦ–uR·ñ÷ Ñ’aƌ¨ g"áô‚P,ÕA¥ ò‹.áW·\P +Ò)–®½ÁutɆMJeÁ—T+b^tÊ/Ju.vÃP%ã IÂ:좈܀SQo…œ ¨d‰›õ 9ÏR… a~ 1uÍ-]5’ºü’Òƒ¯AŒ#ۂíßüô“Ÿ;ÞeG@Hl6;uŠs´^ûó&ß»eI’ èpü\’T”?YSx.©2ûýú Sû¡ø§Ù›æ-™ï.¢e$ã%’DŒVRƒ¹},¼a°áJÆóŠd‚}¹òÁï¡¥1wÀf¸³éb|úÈ@#ûÏ‘A»÷¸ 9°y7¨ŠÝÎí機¾”‚ÎŎ:p€7­c>a)!⁅ý9ÿzCäZÀºúõQðÀ"mu¦GÝ)¥ÉÕëN.:ýZT²”èÊÐ` (âpuÈ?Œ‘.Úâx '^1”ô +ËÂÁŒ‚ÕŠÂÙ;ø~/×u9å’l¦·`±?¶«±¥ðüӉüçoÒƒ€C!ïZà29 ¹/J'>$g¡ýh¡MU0AØçºÇz;o#öjþÒÛi”ÏÏÛÄ%Û·Š‡DȺ²½J‚EÏÑ9i!ðæ]çd<–¤°iÖڈ±@0AӅÒP½7FPL ÌÑÇ)&9?G" x•ÞŽ8”:X=± Ö¼Ê!‚kÃçZQíÅì æ9Äj¸ ž¬ùi ¨‚«aßý¸Á+ƒ²ÈFW¶Aw„ªh4!ÑfN mX_œ] +ò.ÅD8GÈGHì/ð2ê–ÁO:|i®¸^R´Áæ±,^¯)–ÎÝdU1´D‘ÅS‡˜t ìŒáy?ëñDNH£\ãäe‡Œ6BÜë:%míÎc º ±âÐÐÈh¸,x¨u%ê©õià÷ ݊åw/w^r \ù œ”Dƺñx°ý7=€@µ7`bxC•º¶{OŽ†µ²0²»È—Ç,潺¢yÔßD.†'‰£í×ñ"Ý­ØK®À‹qSõ‚'‘øvu€²¢¨ü€-0Ó§ºZÂèASVÝÞVß$+%àÈpݹ¾'’r$ª¶uLD¬üš°ƒ©lÀ±U¯F2âk)àDoïbxèEсìVÀ8.BБàþI(²Ë|LJ‘|™œ¦1O¬©Y´·u Zñ“õ£`4õ•8èiF/ã•s Ã°S­ãê!eٛ}0;>¶´÷y,™™+ć£Ó¾E–pøDkÊlÑ +ààúÆ4ù%zK7!:ù4+m  ¾¹`d¢-(,¤Úù…F@3ö"`!ƂTÁ…8ûn4Çà!Æ%Æð)Ë)Ë"K°-Î3ƒta œZ¾Ä%ZHBŽîLD˕ +?0¶.7æ"cn™° …mpþêK«ˆHçp_ÒK É?qF¤á#¢›ŸL{OUn€ëñ‚'6ù#\¿´xê„J8Æ!%G^~¢œé^! Þ¶ÀË û຿g8h¼N>š|è†87‰°äF¡¬å³¡Í)¨â†è@Xã)½üоPžQ½ÃD»ãúY,k:™R÷¸÷£ì¼*qòþ$ü›ûf¡²øÀ€+ZhtÞð +›`»¼h+6t½äChO ÓZmDÓ+Ì»ÔàÙïÈopûýVlLÛTQ*¤éÒjJ‡xB›µ1¦„¼n:ô›§;,tTºT¦ÊžÔ톄“Ö°õVG5qH:(v…k¸:fA*P–È`N• +§:ó°uqØnÜ…Îi;F+éÕDætxyÌÇ~ˆŽÁ=~A-5mòTy©§g¾Ã"jvÌýAþ‡Ž@õX6ýúɛ›4b¡Š¡8»A2 ðDg”©Öqqz„q0 +úÝÝv¼;¼£Í)ŒÆ’ö™ìGdN¿Ûœ‚o REð$ƒ4Bpȧ÷1˜xÑÙPÿ3^±†©}—î!ã ÌGj2¥¢SÃ&\¨^· +aÃ1 +‚ÑDœ‚Yð³‹?bèNe¤/B÷bl¦²îŸØ@µË€Ž×Ò'\TœõD2X¿qöã¨lSH˜º.Ù!JHXC1J{ƒÑ¼ÖJK%‰B^'ᙿ¢2›ÅE‘œ]ãَÌ$ó„ÿÕËK•d£.ï3Zå2ï_Õ4dg!°®jX:T ëVûáO ª Êat§©ì”ØÄE ÷qдn„6ü©‘vŒ:Š!vHp°F÷pl‘"rù©ll¢ÔxðS%°Ü]{\vY=-^YþXØLðŠ«žþ+ãÙîë…ó©-ŽE”ÿ-hØ]M…¢\OÄ|$LxkÕÁÒ$ü8@‚P½ëð_,ÚïÆqèL­W¶hÒº·à#õ+"ÞÂhêÅ®ÕG5gŽ #Ò-|ìõ—£Š£€°Ü–Æ©%’t#]©ØÅñþ+Eus;Bœ¥‚ÒÈͦKÜîèxƒyËá i.$t'‚¿™2’œõl?”f°­]¼Û\dòÙi‘Hè,^/æQ)=Ê‡¿€oÏ7êÀJ¿æVõ¥ŠXtÍqárù±Ë|$?©°ST +—>ä 9¸Õx‡H¤âÂçÐgpŠÚ§Ó떆TK–à. ÀŽàd"\¦J$ ‡‡U\QÂ@ÈϟýoaѶ½[©Fm ÊØÕâÊì5îÕ@Çhh7‹“}$…F]w({ƃ¥¤zN‘”R9Y` ûAGc)`U_2ʵÊòO ßCzfu5!mÆ? "åÜëL¡?n!b*¢|žjæaMûtÓX­6Ð00¨ŸfòÀ‚Þ],`{àÿÞâTÔ*Lß*!á}x³ö€@¿ÏX¶ k°MsY[¼'!äÖ=xQd‹Û½gB 3ÞoöúH24ô˜Þ@÷Íÿ­ÒåÕ +!äaʍ}aB†I‘ýl–×öpB-‡/ue¬Rľ!º~`b–âZ4­Æ¥(Q"Ln÷J¤Å!NUN­Ñžý·TpÄaæ›}vÛ¡Ijå¢ÏÂu±‘Z1ßè^óµð«§óȔ0m„ݪ¤è’¾M3äk®ÐwhÉÄp&¸Úz™Žu¹Œtø<½¨l|ßY-IÆ$cZä˜Xž:MEúyCê=ð8ã°ôí#E/âYƒqO³ «ëˆÏƚFj_±dlŠ¤_^ðÖ<Ÿ_„Në3îÝÕ>$iv{¸A¿ ü™P=Çé«J4õÏÚjŸÄ£—B‡äyŸþ[§P)Š‰Õ¢58ŠÂ!ˆEÓü +–/`MmîH„ۏk /M‘í£/–{ÈI*̊,br[õFµl"Kù&’s’Íì˜Òà¢]™Þù«Àq¿ðªë…oJ. ö?}&£š¸m@Ï` KS>‹Êšn9êÀ ¶(}Ń©Sîv’Úg‹x’Ò‡† ™BjØ4ْÆI>AŽÞI´?ÞpI䊷P¯h#Ð:P`½Y®.2Ksj±zðËäíÐåý–vPÃÝ l"¢¼¹Ó”m–zï!ŸlÞ…iÀ‚½ýLf¢Nï­‚eÇ`50,tÅìëô7mFÿg¾¸¦Hð†Ýlà‡ù¼Ž†ò´†pxâgàLQàiပ&Ls¡ÀžŠH®¥M˜TøX1 +I~,Ðä@EʐDÛo¹X›Ë³+Š}¬ÏŠ[[yŠ±Aù¥{B°‹^5IÞ[böãK ”CHho bɺö‡£ÈR‡EÓÌ~ó€âõ»,t«a´R\@ëÿ‰p–H€©RÊ)s³e!&6x‡|6jtÁ~Ӡ͖ªm³†Ü ðëÀLç’%Š +¶Ô­éYÁ8}9¨ h^ûshž8ÓÍ»ìDn`˜BiUp£ mËïô*XæOôÐ?`욝ðçhš¢þ‰& û§†„%"ƙxÀz¨ùYk|“ < ÆRö`‚¶2“Ä™fAX~ü'W§Êò²9K¹&K¶¥Üÿ¦¯{˜?÷D6rÆ°ŒnEH‡åɆˆ W½?I ë€õ[WÉ u¤3$†¦¥’Ò¥y©N0à}¼ô‚¬Î>8RìýGo#ØR#)¾<|àè~’!j*ƒúaYTÜ·•Î‹®#ØH3+y$wå;0“YÆWà*…á:Áږ¿¨‚ŠŸW¬ùrùœbçÕO‚¨…qºYȎ‰ñà¨8Ô¶ê'—©P.!bºÚ’%Bƒ âå’þ©¬>˜Hô°ôÇÁۈ3ô53KÐx[ñr#«Þµê*%DuaáÔF¼ÌI”¿n0>ÔóMÒyã`&žŒºo…Á0ß³Ñéjh剺Uþr8Õu d`SM¬HÜï]ÌEI F‚[%iÙNdòŸ5©°ApnÔz,öD~²ÈÊ:ào¨x*¢ª¸6™ÀëËoÅj+¢ Ç –—X}Š¹9¿‘Ô,ÞË*H|yA/dN ­èߋŒ]{&¤Ÿ'¢¹ K@‰‘c½¢®F¡ 8¼¼%ÚDˆn 1ðU¼YÆOP þ¼0bï¢Ó|„†l<Ü:pY+d[4s+–G€ÝçlÔBíùÞ.û@ñŸêä,Q!­£ðè3ɨ£è,¢LõåVÂS‡f¬Ô^Öþʙv®*+ß(FÄrB?%Tº“¾Puæ*‚Õ±*„›Ý¡wé5èòeU³q|ÉO"hãÈõÄõ^ìµ +ʉ{nÚº“^˜«ñ³TuÈBÃðëJFÇà‰uUuçö¶øaLi‘.÷Pä§Õ5ûÓK‚tüÛ?'^ÁÀëÍ^€èL<©V‘3 Š„›¶Â`œ ¶Œ55ŒÚÞ†ã>“ñmXvmuþ§a­ò¦b!g‚»lFá$ƒ£Q°h&VWäû/Cb§Zç7!ù·FÅ_R©üã 'BàÍíDs’u í%¼¶<‰é‹Þq M¡+Ð!ÂۚÑCñz‹—ž™†c j뵶—;jyò + OPeõÚ#¹‚WöÊJ–8Ã=Í`ÆÞՇ‚·Ô.àüàN¬XÓݵO"žï7û ä|R1äºçˆC0,:>‚%à¹^„"çfXsE(×óʌ+”ÐB]Ê'"ÍQyäÓ¬’ „x×p¯dAéÏùHi¶(ÇëÞo,ŠT­j«Ê´éu•ZŒ_†ãZ×4ªÏ×ØaWHɲ²Î’æWª\FMJ!ÄÅ÷€UŒ†CÄFØE«SX¹Žõ~/eR­d±ÀœAoÄË P9_Ï[ÎÈ+-Jp‹Ë$g™wÕwír 0}†qqŒHòů֦HV^{÷^Ÿ”Î8½¤€ÿ7Ãbt±óRƒIÝ×ÅÉ3Rê’"AQÃg žHŸP¡¹Š X£“›¾ÍÆxÃ'¸œÛWE±3°¥«$r‰–2°ô®a¨{ä G¥ÌSé=Zª¬¡ˆè©®}ô}zY5_Š²fQu jµêíM`՜ÎVÖ/¢’Œûݽ€Ü‡²"Þ!$;¥.QÓaºqúæ-r¦XÛEޟ»Öì +y ¨qgÇÜì Ö"ÑWT¥ 6'(ˆŒ×ff–éžä&ôD,H>XnÎQ‘òy5û¤_®jV[TÇyä¸E;°»™z7LL–°ûp9})•—ÒóíÞIåÃ㌭•8‘ö=ñÅ­wëÐj²ÝwBÉÊaʒ{{:(v¼é´àHˆ±o\!;ñhV:ói AV@šD{ÅE!3ù;ÿ-]×mž· Ãe,¤¾¯¾­ˆŒr=«Ï27J=ðåä¢Nd֘ û‡YòÝ8¦`—©ÃHb¤”ôÄE‡t)gr/“Šx +§2sòu#,§˜ ¶ 4?k=Qî5¥k$¿aË`w׌'ÿ%á&7CA-¬‰—”Ï“¤‚†Þ- ¬K¥2Ò²À+Š;¤„W ¸â©'l8¢ »Ý}A¸ÀdÅUá–p3ü¾Z9¬•Ds²dž½‰ß<¤}12b@‚A×B-©Iø,Œ–!0ß¾ +&* Xú×)È2P§Ã¿WbÕ,–Ã!GÍa‹_%ÊíPR-ï˜u|v§êe­’ЗEҏ÷æ{[«—×$”Ol]n²^^XXXGs¨i‰i,!ØVÚèõ²ïÜŕPw¹® >φAgaVvÑh]ãñLœÕÎw †ï>bym¶áK¨G>‰ÍÁzq5@ncâó¾ÊŠ +«k.ÖöÛ±k×v¼„ĺ,iËïhïù”Aùc¢¨÷J’{t&Y ÎˆH„´÷)]' qÆ'¿)³­Þr®œ úDiYî-ú‡yúYâ@6¤¾.5›"}Ž|PR&äMš8Ô ç"Y햘.L”8‚Ž7¯}XÚè®4‰ê<µÎð’TOe]9pD|ßþ@êÎn4&¤Þ¹}ãSkðáãÌå:Ï+lõ倱¼Û:þÈßAaüˆ_Z‰‹à½TÍ d4ñ +Kø"ÅOuDÔÐyƒà#„&’ì=™òóÁÄØ…Ö'Ò]B̪s̕ad¾Mc-ËžŽ‚K]UE->dÊ`´°æµÑqœé éR3ԉS 0;SÄP¨·®‰¹¨)-1ÛLðþØ@°£‡iT îrð²œæŒ +•Ã²¤wñxÄÃñWá]«€TH¿0!ÄÂø:•4ã]#™a×¹½ì·—fû¢UÞ&¼¾`)G* ·Ï¨Ž÷¦ÒÓ M£vX§¡n½ZÕb¾‚ C+M‹n¸±!a“bÙÀXÚ}é@§ù›ikßÒ6QÝ8¹Ë‰.£Eãrx»·.ÃÒv*ÈYÈAWm¨ÑÄ°ýÑÈatg˾-ڙ- `<|BÃAˆâNÂ¨Ò J'M±Vah’W°”±N¡L¯2æOùKz›bh€²°ÉĨX5Û(¾dõ´1bA2|¼Œ"qÆyúVuj0¢ÓDPzºž_Z£¢ í=ÈPÙScø1Ø<ÝÇ!ÝÑô#";ÂæxeƒŸfH>à~"ë&¢Y‡PœzjœMºè!=űУàa¥{tó›±Þ-è[*Lê¸ôšBâ ;ý„“CÿÄ{F¢¦;âÆ2Oìo +ӓ% >ê¾A* Ö;"n“ )áE@XÎÕ÷F:(€g¥unëóþ€jÌp¶~eÊŠy±ëŠ–õ{Ç{OE삘wvCläß³•€%òÑGx¦‹BRœó³"ãá(pˆxn#¶R[×pô±,ÁݵfžËGåöi7ƒ N>;Ë*N5ò$ +z¤,%®  nš—ëvkú +é[ã·äú‹Zïøœ¥À!WB€3³) Õaq+.ÕRÉ^ á·QšX‹Ãûrâð„Ü쀞cŒYh†\k´{(cZ¢)ft…Ï“}KǕâ#ÌLãD5’5XyaþÔWH8u¨Q˜ åÀ í…ŽÑ£[ÝÚÌßÀJÁ¼ ˆs#tÝ[يònqàN‡ØVÆ×k>gG‰cÉ´ù£Š‡†Xϡ˳¨-ñ/9KœE%8æõâGÜÓ’W©Ñèy¤Àþð-¬`¤1Ͳp€~sŒñLFiw¢:à²SW6Â6¦‚·«Çö°)m¨U‹7ˆ3Ã5‡*²gÛ¥pB[bwë(¨;³¯àÿ©guÎEŒxžÔ®b³•>~þ‰«gyãFE4>€° }’õ¥¹AÁŠv` /Ù4zND¥hôŠˆgH>/b à®{œI?hòø´Í¸è°Î”è€Ebçnºoú3#‹•ë@p“MaÄOИ¬Ëã@¢³¥Ýî2¼É»æéÔ첊˜bUá ¢˛±-r0°‚"J ÑIÇâÈeß{Ž×i³™¯8səg7åhy»Òî þÞr :¯ûŒ‹z$Oå(ª »Ä0–@eGy¤˜ˆ@0ÎEßí d—£Æ™(ϲ•NåŒ=?>÷ ±7¼™ž5ü2ÿ)ÏMÔ Ùò%aº cæ8Rî}‰Ï"Eæs 5>ߙYDl8õ„æ“Úo´Í痧ߢlÎ 2m§:dª¥bý¡àŒnúՃLœÒp/ž¿¸þný3àl¸½Ç?Ñ3ÉÁÇós-ӗ»ä®zAóˆ˜r OèÐøspiƪz£D;b<Ä*}pƒüÎN­–äw}’Øæ?0Î;s F.7&Œ¡²@`<ÉËEo,5§|§f¨QÄ^•¥=ÕV°®g§6Ó£Éùy‘eXӧǶµ –ã‡ëp%¬E‘IΔ2‡.;K"ÐéšJÍüÍb¹­ÓÄlk9vrûPc̹ØP*kºÇTÓÑÛ6˜H ͊WìJ£²t×ù„~Ïtó–Ÿс?͙‘Xƒ +·&${óÝÌ,BIUQ gÛЬ<5ôM›v×#ðu¡·#—aàƞ]¿9!2r™Q‚Ÿ3·¢¿ÉÀ«=ŠP)b‘±—»VáJ¡7³Ž}ñy l@ÈoJý|ÌÅíºŒ€xD^«ôy?2}‰OL® B•Ú>d§ñÌ+ªtÄvĞ7‡§ +ˆÃ Ö½M»Ükja‘€^‰‚I”œÕàr^â;:%mZhÏê>-%Ô¥$8(y=ûXcRa!˜)^D&© +S­ sÊoš:X|î(#ªõ³Æ×ϟOðiÆ¡¥Û2nÍ£ ß £è2úSõY»âj F N¦&<ؚ`@Ì7½¿;uR ^ÝØØË*úËîåOø·]øÎFìäoH7Ԍïªd§†4 ‡ K¿‚)6*’@ ž ¨a˜6yu®nDiì] ¼%.ìÀÈsçÏÒô 8Oa'ŠÛ,ËR5>ºŒéF´MXúè[wÍÏ^9XÔ *õJˆR/‰Ò€ÒµæÌ0UôTŒ•6±a§y‹nLT @`\C²``‚ÚJõrS¦z“ˆ’hĨ‘jX̘¬ý1s=î Rj-©àmÀЉʳTš­™­V˜»i~[~ORàX¹ºP*)Wraótڟô(ÿuÔÏÅ#W +Ü8°‡FØgD ÁÒ¹1D| *4‚0Š´p†þ …} V‹çq~—vÙÿu£Å®ºÂq™Gª„îª<ø c¥­0|Â×_…x%À¿hàHoH?s%žž†x¯/¹I Àøwf9Æ«•‰ ï ðø¦1B‡»j; Q¸¡uææš}·xjž¼@ê9E#L¤ƒP“£´ù «¦Cïì ùŽärÖ6ô]ÿqÐÓO§8O3F‡:oñ…’®ôi–ñ˜£_¯èSh¾bD}3軐KPôç\•ìy֑ӝ'aû^¹á +7ÇÁ²K)3h@7ó¬×vÉW·ïÇü¦éNüÖR·*x÷Éß]ªDÉw×FPFÎdê³Zyàaþ¬×ØÍo7cåå?`Çû˜`dÃσŠÝd&ü†XY)æPÇé¦zÅÚö,Ä°‡mäÂfҠʊÎ[5yoóžW0<ÍbÅó4ÙÄE…nq³,B¥Ëiîùâ$7k6ÂÒ ¿c¶ïµÅ¶¶à _µ__æXÿpív­¦€"³YüwKQ)8ò6 nÑänÃä4PÂKÑk:R*婾]vØó`üjx¡ÈuË"Ú§ÁM©þÛÔÐzÈJK-Šuµbl§_¡æq_ÀdÚ-½téìlë­Ò7ã=UƤC\ؘ¨ê^wéçe5ïå¤MšÇB+lÓq˜€$u@æh#’} +x5 ²í‘ö +nF­Q„zî„F—]È]«7`7tb qm€ô*øt{Ž'³_ò<ë.ŒãΏ¿·ÎYÓs¾ŠpÆùaS»$êÍ.ÓîÝfnfòêg¬YWM‰ÙE>èÑA؟¾‘JÂtg“õ”8œæ“ Ý˜”÷!Ԃ_Íjª8ý€EøÌöÜèÝ6Ìwʁ†¾`]WÍ|QlKÃß]}¸Ä +4ۅ-à+9x̊Ðc2qLÃ9•( &Т÷P³ +b‹(þÅ/°ð pò€«%IÖº'õ‹.ÊNMô'+è+3ÎÚ¤ÐUyž-£¯ ùÀ>J¼8å’dý)ÿ7­Žî–y#'¤Õ Ö^A%Üj óä ô¾Çð^VâK½ƒð€võ-+†P þ3m_î_ ŽýGò»I$(")†ÌS‘¼:óŒ‡2ÛÖ.~™€ ä&®KÃR` T±©ºF²n-¤Öu¡b$Ê0#XXmÍE=]1t¢õ¤Grt~Éó0â dҌ(ðê¿£ºÇˆ¹ÿäzìSK×wô˜`ªª¸V±Î&Ü¿±Ñ¡ XŸp;œ ‰Î„ˆ¼§=-¦°ÊB ;™çD%å“ÆD‡©Ûeb&üš^X¡3ÿ¯‰§&Ï\13éß÷s bÀÃ/$¶cŠ\ý5¼¹;}l=pB +ôdèü2–‰ÞÎ\ô]±˜*—z8Èl1ïŠ0 ¢XJ‡ØØßjAuR5rô lØTEHÇèL„üb.E„—Eš~0à‹2!ØKŒØ¤‘Æ <ábX&ái,²YùïG–¥¹<[ƒlÝñ|ÖŠ…’ÐñxH#CÖ›ÎæÀ·:RUþîèEñ g‘á®z(1s’1ÓAB'ûsý<Ǎ‚¤ÛÀ80£öá B~s³º_Ì4$á<زö}=l!Æ­¯súwWƒŽêo? ºW™Ì¸ðmÀ™g›ñ;¹·ÛÌ{s0Hř´][5“;Ïù%Àž\‘\À5'LÀºòf¶Å–`ôòۇŸ{:¿QÇÅ,0 Ê ÷ÔÛ²^uU’®ˆ`“•¹dª.p"µFAÊð 0öÙ'ppq\×|†ðIÓøʄñàLè³ÙCò©Z•$tâiÆ!ÈNù…C` ÃÉ~õ[ 0í̂=Fu@Ñ0tZ4öU,çÀaK4zO 3,…ñ¤~ ?¥( Xæ²vÅÎÀ«Y`ܪI<Àí£ ‰)®øé—["å¸të²y•)°LÀ°EKQq­}y‹À˜I®ô°—š}È&2JyúM:ȩÙ.,(Àý ¨²~gêhi‰´d‘á\l{—ˆ-Úõ¼Ã’p\´Ó¶x7ö0>€²¿ÜTÎüCehíTõšõßIfìߌG'–O˜y*•'‚³õcð—ü)j:ô}G¯Ññê°°£þÌ Îg `Íl—ðÞ³‡9¤+.¾è 5>µ­Œ?ù˚Jøÿ 7Ñ1ý¯Wiښ‚gÓoèaº*:=ÌCüÅu +¶­H´þcš¬Q“ܤ1ü#À£ì‚”?T,Žxu†<<üåÔ«Gý~¢ª‹qmlä#MîõK=CEVœ~ %D?J)¡‡ÎÜaËjSüù.-{à¨~m„öÇ_JKÞàÉ£LÇ©»}•Oþ0ôŸš†¸â\ÌÇ.=l?hj` j¯>1^‹ÙÔ§šá½¾}úµ,ùҗÒϐ¥YJ d¸°„%â¦ä|çïU~>{¥b—êÐiþè™òŸ9òÃ=ôùDP ¡ÓøòŒ‡ Ž2Œj:N‡dޅhÙ(a&káÂñ\K÷mLÅùJ Ê [ŸÀ•{¿_Ø8ﱘÅÑ»G4í¯™-¿·d«³!Oc¶ +!¥h±®éòُ¦6lºÕ¿i¥Ñ²šÑé%Ûµ¹ðú£4Ӊ©Bo‘«uEôšr›ÿ5ª¶•mø +4`Â{HHáAP2Ċ(‹U4Fu ‹°\Ý:§›&Åþ»ë0Η¯Í(¿óÌ4-ԙ0EŸnÙÑr‰S6¤óuS¹Ñž3ä +ñ΄2—MXÑ7ª¥ÓØù6ia‡ 'ß KeÕ-“G<9¾nçn²·ŒPÑM€˜Þuîƒ.'çÀŸA†¥·¬¨Óœsʇ”1ʤvôòôԑRb£_ÿ +dUg+¼›e-!ً͝ã7ã‹P\¦èu€§&/Á˜5TÉSžú8I¸Uï§ï²á ¢H3ŽÖ†¹Š°z›AՀ݅*Uðî!«3\[Š/6–4pÔÅóDŒ¸÷nòƒ‚nû¿þ¨=nrjmëªÀ®Áܔ§A»gÇ;:ËÞ¬õ¥ +X?ZšÏEê~¶éÌ]© +è^‘æø@»Î`9I’ùˆzù8aÏA b¿È5TÐî<+ǂŒÞX}¶gê£êÀñdôÜ4û‚¦ç^³q)KRå`&±¡÷'8iC·¾ÓÞ]¡[üÜÀšƒNªÎi²á£a–sS ¢Ù Ã|ŠÔëM·lÌ»_߈E+d X8Ì.bÑìâùÎ2l(àRs}n6܈€©>Ÿée$6$º¯Þ˜˜U$C8ËêÛ*‰¹×sÓ-m¬ŠÌ| ½xu¯ ÿ€y^ þ«y_î"8­û{ÒÐ +‘\µN*ÒÙ ‹ õ°á}pg\F<Ë~©­ø‘q®ç®rÛI e#~êp£ ØÜCùœtڌ$8ÂùÛc‚Y¬+g*ž|sY(öî\_Ü8ÙB’#)‘dNvÕÇ(|}Ô|!0–465(T˜t‹àó#™€Nú÷Ñý´çîù¦S0á¦ß‹A\4sÿ¬_MœoZ8‘D.rhw%jë_¡;8ž ÉÑa{ª{ÀÑa-£Ù0C²Õ±WȚôÍGÌß°ÂÞñùE8ìÕÏ÷“™ÿ½i1ÌB7ü(Uáww`¯rJ ^³Šwí äKé‹p -ŒL͖,!¸·†Éfì$w<(L—¿õ|n¶i鿏 ÜE}Ÿnü!3·Æœâ ]óœÁÀÉø¤­º_Ôý\,0›eâÓI[ …ôfo”©X[‚̧ÇÙÌ[=9äÈUÉ@äŒM†K +Öa.h®÷ʝÛÅ }à,·±ã¢•å3!à[Ì<Ώ,ä)Æ)Âù‹Ö혓ú ˆIÁ/®•êô|þ¶Eäꡁ³%pO'ÁÚq挟þˆ¥ÀbïÆdÔ€¨5oâL<ø¬%÷&fèæJÈ’¥þÄØ R ú‡“õ­tz ×ú-£Ïœ ®cqÕÂq @“Ôaà‡ãÃæ¸+,ÞÒlLÉÁ†ãGQ1÷½4ªâÊS*Å£wËÇ;‰ÕÏ°¶yE$eZN”ëHvoG,Ë3ûPèËų;@G`l*I·]&%¿zÏóÔhè>*¸w•ú½ø)hWN}*{3?ÐÎ}ÿàûÍñ÷-º[²ÝÓÇ}S´Ò¯_iÐݧ*PkØw ÏÍ6&ØÿQ˜«‰ǖ¾ÍFæg¨¶Vnt` ß©°"×ðbÅPX¶›×—4xR,p&6å_Òz~‡C\*Ljlòý€ÊŽ=ee—çnÄ÷ tF;Í?©™–{'ùIÇ>£ŒWÙ"Cbòö–˜üˆ-ÔÏC(>mtFŒ„>ôËõ9+â;'šœˆ…{–ðsD¤|sbÊVLôÖ°Al"dC£V<ÄBDq½Ã%¾®‘vx“ S†ÞƦjDn]ƒG>‡`øŒé€Wá%ñ¯ßIá.S¿røX°qš´Â¡…põ Í¥©r ~'æ™3³ÐMuíÆw(¹X´eøºV2ØtXÿo~|Ä8Á°¶´^!¡€-~Ø*¹z +6’ö>‡À'ÐcϚC ‰ø +íGf…\à÷6#‡­’‹Y…œP´1” +¥Ajò)ŒòXG”žL,…Ý[Û ¨ä³- °£_´Tw'Ť|„^»õ¡¦ÐR\\¸"ÉçEX×ôžw^3ÂÐ| \¤Lvó ÅÓÕÔvü«>˜Ï‰1߃.ˆ +›S!|Õwð9£”„ÑÀdÔ¢™:8…mG/ç`x“§/ÈfûJÈT ‘3cP²úƒÇAX3xõÝ֔.i¶z¢6Q[PNÄ?S³àƒØÿ]K#H˜äï´Uûá46š/U‹š2·2n ړ³OSà1…ÐÒF)N÷ Øè9Á,<ŽùKLWX}ë‡â«*Ø] N.ex³Üu‚è§Zâ±áKè¸F“ï@L4j•HV•a7´u!°/GbܦI +(‹«4Ľ/\èŸ_ÑáJú^U¡æu<¶ èevâ‹u¶3`köÃÉÁ Ðv©î˜¡ýUtGl·ŒDätD”šƒ\ +`º¦ÞS½÷cO„ëƒÙ(<¶ÿýV÷àû/¥qÉ @‹{ÒNýc¿_]¦&¸Öj¾oÿ»tþ„=Øþ‹$WøÀ¦åOcm<þt31éµ£õûE7ºý1ÄÉÃ}^‚!ܸÐÌ~ÿžõ£]?áëÆRõûÓë2îô cF?æ̖øùñޓgÍ4›Ÿ‡² …Ê`…å×5èŽæËÒ'é;×?~Þ}¶^ ®¹¦ )t-÷‰½X·óÂCì|Û{;ÅE‡Ö'=û(.B¾€ñêc_ö÷?Þ¥ÂÔ7žNLž¾·¾‹0J‰Œ£â&:rùª֕/Qߚg=zzÝz¼n¸Û®ÃŸ|ŒSõ\ä³=rîBhMœ!Ü(v—øªkŽ¾Ÿ1žh—ÅÔ—cnãá૶[Å^êŸ(P‹õê¿ç}cÎ}/ƒÖ³ÏsÞ¬{ÒMš·¹ÇOF#{Fºߗ­>ˆŽm¯2ulם،;íùîôx>Õ³#¥Ñe/ºÆ¦°Gpî|²b3’ìÕv½+Rqz§’})HÛzm²5™õ2Fm;BWÏ(ïUŠTªêe°ÅSÏêù}µP}î ¤Ê¡O¯:½­6=ü®3`\Œ¢Å@ÐYgx6Ô·fçál—)ÐÒÛ§Òd'°\Ò@emÌw$-U༽Äø:\nFrPË¡ƒÞ”Ííæ} hßò*v_Þ%UAÆ26Ö ^ßߜ€œ‹ÏN¯‚Ðð_ÝQa+¡²ãVaÊ3RWi€ëè¥“',µ0„ l<ÝÆ`È*)‘§lÖ£³ •Kų÷‰ƏøD<¦MYiw÷òÄ¿pJã“ÝïL91¹Ù ´g á'mNýÈçv‘•(uï¼ìo4CV²+ñb’MÆcìSÛ£A‚.G¡ø¿©îVÖ¦ËjMk³ÚG0ªS'˜ãúÛ*ù#žv€]¾®1$Pí¶ùn8&úWºr4¸Ù^Æ&àÎɨó(‡¾PEC©ØGԗÐË_H²v@Qne£­¤®¯/ˆ;Ìgá¦JŠ#Dï@m8ÈuBxl›BcØþòŠ9‰oÅB£Ž³ ]>‡y»}qÀ¸ +z‹àÿ5ºr¥ +í~Ð6m]" m"e á +ôM=)aLü×Q]r#PDB­ŽwÖU…ø{W„÷œì< +Ô­"‚dùæŒêV”ËѱIšä+gýyÓaȨ ¹ÚnmÔr•ÄÒèó`õ³TÞ¼_V$[@“åðí@— b™zÚ N3ãE¬’›ãlcbrã (©•ô2þі#ãâZ5('…ÎÃúò·Åì6ä`×¹ÏèsO%„€;#€¦w‰½L û´Í'j–×[ìO?è•3ý’ÊØ*†”@–\°iN¦SÃI›·¤²Q}0÷ð|ö¿‚B²×¨D®£Û`H¨v —rýh%ŠhG•U‹–âý^ƒÛ|kþ›! +*q¥9¡“í¡èàA0‹L4céY@û0^~*³üž6øÌ ›Fí¶è˜à?çÐ~AÉ2 ª$‰*Në/r™¸…¾¤ýn¦,³§(GÎàT—‚SÊz6j&Ö)ê=à‚M¿Rˆô™ô*U:ð¨ÏeÚuôùoKÛ²?\‘ jŸ¨'Œ*¢ñ[sJ.5ŠL”©ò,_J^ón ݤe؜!WtZàî7v+êlaݼ*3¥6y1ö\„˜IÔ+ƒc`Ý{ÄFð  |1¤èv Äx'×úÇXa=b!‚Z½¿Øœ82r’Šæ¦¤1ô‰3Îý¶Ñ:¾+ðø`Y¸yoi…q¨nG‹Ø/ïæw»n†-cW²y*R`v(èø™À¯ºÉL5/“Œ[´$Œ Ï¨Ø{p"s+ –eFu(RÐËÑdL æWˊ@B øR²Œ½Þ~•B‰Ècò¨3+DdhJáÁ™èl¯S8 =åxIî² +ÌzŽØÅì³ô×o܎3DêJÄyvÚQ/§÷ÑÀ–ö‘ +㶘9+]ýTåU´  +@$Í*‰ÐéÊì®RX‚Xä®x.-‹–ÝW†ì²ÃàåÈ(ðÙûWröŒáæEð¨ùa®6M¤) ­«›»=rZxzžêEr÷ä «¥t™åñâÛR}vªï½Os!©Á«Jog4øÜ[%øªý'¨Z£7¥ñµAuHqa‹oÕf#j^‡8w¦%ÀúL¯…Ù°©|ƒ&íŒ~tr¼üÄë£ö̀¿7›äÔaOAÊ#Ò¿6Ÿ*ǯúæñ²øFD±¬v£} ~ñ«&À=m½´ˆªXµ×}žjЙ$•ÆIœš&ÊÛùðŽˆ:×y!!g>¬×P|JNüïG *v"xzÀbâËök?fU,_ _UۃéG‚ٌdœ¨p! ØeēÅ%| ï~kÃè1¢­c‚#á¹LA*+ê'–ÀŒý —¦ É¡'UXc¸æ P]¿ÁXZ9ŠÏӂ‹éâ¤"ôõA°²îA³U{'I®öº†»iiùŽ¯ñb¥•Ü®%ïé,n· fʟ³ ç¤EÕ";#þ!‘Q©d¯D-e:#Ã>œ¢$‘rµh¼ÂæOÉ`Ù|' ý-‡ +3^ÑÁŸe„¬pu¨¯¢±éÖ! ´(*Åç–ÆcL$4)¦%Y<»­»}lj¤ËC2YIĆ ö[)±$Å¢¶8è+^ž»Ä9×ô׺Jº-Vz‚ ø¨ ³ónZxÔt5æ_9ý°a’Y_ü ÖGbÂ+wD_>í¾|˜ôçtÂ4HÅ^ËÀê¤/ýË"Fá´ìíslßyÏÌ¿¿œ¤±±ò⛹¹¾È†>ß¹›ÝÍ÷­‚õ¶p`ó¶V.ÆuùÿáGj8ùÖ+D‚*$_¶wÜK(¸³«áöaT8òö]ðR}ãBg?w¸¥r4r.ߧZÜ©”'Ö`µÛ@˜ôT:CÈø‰Õ¹…Œ8¡XD7pé(Ö@»]è×gmívUb$©Ñ:±k'ô ö‚líïó»o˜|é@¾%ÉGqfÛ1ûX<¯ÃRO?"ÛØúLÄP¨Êy¢— +p»7aŠÒÿeŽA†ºÁÝ¢Á±cƒxÔGO¸7óÄû7 ìhyÃ|G„G‘iŠšáßæðï~éU,‡ù‡”tˆBCcÓA¢Ž¯]}ò] s=û_ú>Ìc̍2óC¦§c7øQUqîb’ä˜ÃÜ㱎Wš¨<»úÀ6c‘£çó…háMê†áðÚ.|Ù&ñ.t<Äb`+m/Ù,hmÆ7ݽ§¦= ×ºÄT,­¬¦e5½ŸfÁ‘6݆~ÀòÞM….U,è?:«'°1ǐrs¬]4À• Õ +#m@a‡2œ§â*7¾¡€ ¢T ‰€D ÀÀÄîÁvfIáH¥øJ-·à½SúxÅVD~±Bð¼ëˆi°—"‚·Š4¨7êwhòEŠ¥ʉ,F•<&9P ‚îwä¦ÁÆt0ã>‚­šjÂò¥u +‘wšÄkw<ÍÓ楧I|8¨i¢ +µ²7îsA{¼„TÓÝè†Ò“æMA R$4±šHàû:<‹i?›Öùµc )*¡ ++ŽqVýš$ùõº*Eqƒõ‰žWa¡øÝ"`/=FÞ̯¬ «—z(}_ÅþRW7“®¯%¸S|FݱÎ^{OrŒë5Ö­S¤Ò«[ ^óæç¨ØVÁéÁ‚ L +ë®~ìxã”aÔdÁ² +‘ZÕóaÅù¤²«ôÊzx¿zœé5»_×Uv¼}ñ&ê7ÖH®‹2YîÚ\“e”U3Á<¨NŽ4Ǫ‡·ªö[!)uIyr­bþZáèù‘L‰–o„ú­è›Q1­¸[cë++r(9·ÕzhêZum™ê¥©^Så¾15¶âCC6›š“P˜6“ëVî¾zô¹qÅäŠp–eÖF#u• (VÖܸ +èöޙû͆­n%F22}Š+â+AäBiP]a}¦ƒµüœïÃTî„ÖE³1ûW)¨­Ÿ’#,÷3-xøª¿æ¾Xì\µS¶S5 º[Iî(¾Í)U°OøZµÿ–~Tc& ÆKËJÎïcâ†Æ=Úƒ`vx$ý¨,ñsô›þ9 ôD~dˆÔßù:9MŸã~Ëö¥¼»…©ƒËe:ýÞ«}"3K£Å-]Š#+Z¤wûM­\kª»œÆž—jEöH“k¯:æqÕ¼՘»¾¨R OºN× ª6ͪŬå³R£ÚÊÄäÌI·¦IÔ͓\!õמ©ù$2$¥>µ>ɢߺáŸ'I¦¤"^NA\Ô&S)ú¤#¤Ÿz¬Ž±£"ˆn¿Q‘ӦΕQê⋊ô6÷R´&ªÓÄ#ƒÒY¾rf¿ÕYìŒ$JF™8T,? ÙþÓtRûýԏ>ÔFAbR¡á‘DQh­ƒ–ðJ¦¶¨`† Ò©E·öA=§Â˜ªËi–½…Ý 5†SJÓ¬»)<«³M«³Ù”$ÄהªJjI‚˜•ÜòŸ#GÉõI]\§&Ófn‹6L#ªÔÀ‚) ÑÂjžf!~þRæ´U÷RFg½v—ò9.—Žiâ·49JÕ^\KøŒä7žDZÖ¥T…˜:×äÜòÒ¤âPÜP*Íú“ªøRG¯ær5å~ônÕC¿¬¤bpÕâ$eÅe$eO)»ˆQ#%§vÉ"M5"ióÕ'©üÚÛtUcªR(§¢¥÷x…T>u‘ž‡× Õǯڏ/úÐÝl:üQCt’B¶_óÛ>*)ÝԘ?ËvŽ ÄÓ«´Q]Îì5•ËÓ(ëpT3•Ñ.bŒQåçî £jHÖøm‚S%Å»»EO+Þ6[:RLÂM8Qûª¨W–±§¨ÄtE E}ìÑž¨²s§”–hl° ür:e_04<­)Ú=XâøªvЕCå‹;ò }Z@Ù5Tegƒž¡®GL;Rh[ö 2˜\ œB+î>7ꄪhúšÈ3B÷–…ŠB¯¯˜â@…ê}gÎDÇ!ePVùtò·ÔoðxÌT6­Jë°Ìø‡l~d#ÓOMäb:âj%ÔG¡Њ(÷?³m‘èÑ¯< +¯4æíOŠŽ!wc‚·?âu?™¤ÛúÉ8º·€®§ÝÜ)gü¬¥ýB\ZɽÔøüXGÝláSpm¬¿gžòÒ±tOï»QßÉ /toÏò1$,ºì+0¶‘hêD PP1Ð'=¦h¯§ŸO0äÞó¼DuˆQý0sFs³”ß4»7)"mæ¤bWêâ~68‹{ð;¥.n"ÜdµIñîì0k¾Qî”S4ßÎÈ0튥¶ÌÚ7ÄqŒå*«uéIŸ1¬˜oÆȯNR|Å«Ÿ:/+PgoFÑ>OgJ¥Õ•N‰:ft–1N¯²Ä+Àì‡ _|}ËΩ€f؜¹ùƒ6súÓãr¶Vœ€øS9ÙÍU«NÎÛå¦é BÜè´Ŧ¿üðñØfòzôDàÈ6=žîM¶2¬wÄ´Öî´Mf,*SýO<è¢Òç9Ñß½Ášö3kœ¢ö¡ó™ýpî‘ãé·R:-Q‘ à´TÇ Þ;ËNÀ:i-ç'%oÙÐà;ëÞxȇ8_9JšaÅT0Îb`¶ã \±?6Âïâ Wv ‰vJø!’š QµÔdܒŸâՏ–.8õ˜ðbs4Û~Hzo~°ƒM-À"0£Ó˜‘Uá£E«¤œÛN?Ùo AÉIªÈÈ®ƒ‡Tª«A:ÆIŠ/()kûV?ñŒƒÓ¨< :|٘ WÓÂ?ßX×^ †gJ ²* ì9Š¯ã´Ž¥TP„ +—¤—ª¹[«t '¡HŠÙ1‡=<zôÊ4¨³„ZÇV+Z%zÖßt¹ûÒŀ1MÑA“ÕWûlÝ2±•ƒ%‚B•,¬06E®ï6”¾ë‡vK)p€s]cÁðàJ^·Öې㪠CԐI¶£vßÚáÿµ!卐òäÉïôˆÕ­u¯î¹7FÔ³*ø­Á ÝIjíébËOqûƧ;ÈvÚVṆ¾®é¯ëêS³ÃëÀÿ2ƒ”*¢h¸rOï'¬Ö¹¦/ª(p¬)NC0MMÈ⁀A5CAQ¯{”fF¤: öLãð»ÅØuÃü‘TéIJ q¡ûš^ȘeB/RSò”Ã@âŠÌÊrüÓIAĬ¸ j0MwC€näãƒÛì´ ô…05ˆŒ:cƒñY8_H¶‚Ú¦ú3›°æ¹TJQ7½Œ¼Ç­ÜI?+IV~RÔ÷’ÀI™;釯z™«s'ˆÛ=BÜm…+6ô £ô›E"Ïu÷GMÔkç=l¿’ü’GZ=·"[óD.PÞ\='^[×I8e‹îÕòç/v‹ö¼Ç ‰²ÍFÔª*9âF“‘Þ ¬Dí™PZFô +ÊQÑ犕çÿq"»žø8°6Ü ¦$ŕë[Vy JbâèºöxV9x$¦uæ/&X›N™þ÷½Þ";°grñÁÅ,Z’¬EÐĚ ÊYxíðÍ°:&éÝ÷$˜«+3œè˜=|qe'þ•:Dvó:™bâ²@j.wdýÁⱁ”ÂƌF>ÌYËÀ'­ÐÉI̹Æx9_Þ=º£y+-%p¹|çãè Ï Ì«5“µ4%ŒŠ…oZî’’Vµq£rPuGÊgÿý`[YßÓ+÷;|îý‚p9YÈ"±wÒƲ—F=I£±…r-a¦VL¿õ;ÐÞÑa›Ûʍ¼ÄD0ÉA&ÀujVÞ"ÐqÉai}nåP 45ÎCèJ埽+=+¥™û1™ÐOb¦òŠFÎËTÈäxL’kÛ_Xhnö°†Š³mǻƂw£Œ±ºŸ é\QNVmc™!Õ&=À#~¢¶âÈ=ûŠÂ?ZN"6› óyÕÍþ,{ÎÄèÝD±hf«î͘}µß3йØ÷˜F£ãÍ5[ÙGú'Sz½íí_Ü%ÎCûr” +ÑÄ1óaåˆbы\(|‹¸ÑIð²‘J‰IW8s! ÄòÍÃ÷ŽÈPµÛ<è‹Ê/g˜B—ç$Œ¹ :MZ}ÞÚá‰[ +Hó¸=üð{6þ$çn¤ÄÀa YNì'§pÖ¥ÃnW³-±Œb =ŒÁåÂÃ8Pý¸Ÿ^æh¡¬É\ºûK@£·¬5e%ÂYM¯}ou;UÝ@ÜýB8ó‡Ûˆåƒófì +:Ï¿‘ýN˜œ©@uª*Ä>dˆ×®êsJQ=½, >¢± ¸Oò^Šª±}…’ÛÂ%…ß‚ûé/Ô^ÌlɔΡ¯‚@‘XÞV<Ä& 4Ùaü +ÐB«¨í¢equ©úè®në†IÁMì¬  Íñ7/¥À¢Zʉ¹¹rþ(€Mý$“‚™fåk Ê ²ˆWUWDæ?ē¾E ‚ ùP=É ’xÎ* 0€þ˜„_h¶é0û:·8ýìÚú óÒ»ápÕʬu™ï撥uç{4ˆ*'çªE‘¤PøÀ(¯Ær"Zó^În.ÈÅ(…EnÌ9.™\š'ïh]‚Rµ>õбÕRZoE„>2㎘œµ£€¥o.X–Qñ<›ùg«PR N©þ­›·À(GËx.>îñ‰d½¨Æ‚3^­¤hσ«Û÷R0½¡€UR‰ +%¢hX B‰?(RÌÐÉdqõ‰NÍ =>j RÒ2´ØB¢šÀéÄlÅtJá%g+—bþ=Ëñ3„œY=Œ@€WÀˆ0«f…Ï–ämåysØ=±1Gß#“¢õçK +˜Ì\¿P; +µ¯H¿L4 ÅËê§JU×f¾Šœ—1O+hÖ$ü$`ÒÀ~1nýøvPKä’(Qü£3 ü'Æ€¦=¬LLsFœ9Vu€Ä$qor¬ˆR…Œªtäe¾œÛ½ÓøL·u¡ž +ïkZ°ðõl¶²±ZUb :ÂÓ æ ú䞤ØTXyÚ` ¬Cüû`ÙM…EëŒJs퇽sŸº`»R Ñ=Î5X÷uFe9ßïÛã¤\DQî‡1 ˜Èôˆ“Óà0ÉÈ£\Ë/ðó¦kâV¤þ#Šc*Ë2•¾r2´N·Gý™?SçVæ”SÀàç×ÔО¶ùûŽ"gR`·®9= =ÉVr`z>„%dîIÿ°µx~hK\Ï¢¶)d—¢Bd pð¦¢?KI›0²ûÄaÜ Öüjd52öú²j¨!ªÜÿ%B䁔¯Ú{‰›\°&óÉS¾ôƒ´\„`zT|¾g$þªà’P8JnAA@,39ÃB³<ƒK,kº:YNÓ[ÿ(²na;usVâ2¤’µgÇ;1҅ rÈ£‹m}|/ MÃ]&l;°§cF/î·o÷[$ZŠ Ä• ­Ò;á ýºl¶$ê¶&-8óɽ|18Á4g…ø; 1Ÿà q”ñîRŽ—x| ­W_;Içc®·ô +CÁ#IV­›މúSqT|fP%°dnIÎܘÚ&6á)€Zc*0™JTSPÛôa“Mµ}Øþ ·û.²M¶ƒ…õkîzñ®—mFå˜Û¨Žn«n¶ëšl×d´š˜!ª,ô¬VuseÃd1®BÕù.¬LCëW!aff8׶±j@ìS»ZoCÚAqöŽ™™~ÚÊoF,‰fN&ëœÈAýòn +¢q’€IThN9±HiJä Ê@ +‘HŽ"Î !ğæ•+`$ô©0Õ-„ÄÍÉÁ)øœhf¼Tº`„úÏ°T “•¨PW°[S0î2 ½ëwÝöÖÝÁl{î„ùÜù$#M²|muSʀå4G¥-­%͌F#í<ŽOò~÷Ž%8H±FòíÇtæýƒ JRA-Ú@®°ü„«\ÍLûéðA¬TŠÐyßqmùiÚ fJyèè¯FGŒ™ÖÈÜÔfŽê¥èŒ¡ ŒÅt8$蜡Êã6\×÷* €)V¯cnœÆ{øIMÆ¿?}ˆùr´!âþúéŒÐÂH˜Aa3ü +Á uÁÃÂîù ¤:C‰zËxRZ†’öP>H>^¨†À†{¸Ô!È –¨Ñø)v")5NÎÁ$‹Wd`yVÛ·½÷ÓbÕ§$yϘMÑ£P¨t<7s Â˜<„Â1]‘wy€* Œl˜„œ¸Œ,—©9Ê`ŒA!¤T  v§épÏ%Â&ɍeµ‡•ðRK[Š,ôA附é@µ‚:l¢QÛðCœ(°Î×|Ž,ÐzãbÃÿ†7PÂù-ÖJÁõøV¢—H‚pp·nÍéÀ*?‚éÑa+o©€sÃ.°ÈEFcpp³1Z”Â8ñf!; ³÷}æá¿iæwè°ª#‡Ù/j>?§lŸu{ÉðvÁiDŽP 0ZÄÉä!uŽà€5`æà Ã°ÀË Ôü9/2>†Y|ÐóMõFìiŸÝ*¨ì9@Iɛè9À’¨kÈà9Ür:søJ䝝Cb/£ÍP‚µÐ9ÄΛs¨¯=½@tÍs´¬9óA#9à²Ú;aH:"`BqH™Äj•uց,2žãޘQˆ¼Æ U”@qæÀÊó;s@9´\|9ìIŠ—ÃF˜5ZºVðÈKÉaÕÅñÌZeä¾Õ¥®Êaêø KœZQ9ñÍYá0*"Æ?n x wÏ ]›iÅÇɹ )#°°Â‰Ïƈðhr EÚ}Þ2&Öq=§FIÅT9 +Z|mÕ8Ó C3)  +Æ9ì8sҏÆpô½]øl` ûØݔ]q˜ã6`ߛv†”ŒZW2湍¾R å84`@8uRà ö‘ٍË.ŽŒ'I,6ŽâÝ!ýªÌP}&Sa-.Đæ¢î5Á›œ0—¯¡x]í•ú´'×ÐJ§ÞjчÅá{bé19ÁŽG†ÑjKhC¨5b†‰ƒó€ø6ÎR¨JbŸÜ› +ØOäeB†Ö¦?º¢ qàë[K£pÈf¼¡;U$m-‚clLÔքEˆFíç<è.Ûè"Ö@µÛÎ|8Ä*Ê%b!±déß0Çnë« +÷ÓᰎnHDÇ¢v€‚2½Z’ÁAx ~rtÉLgá _S¡ûsºˆÎ„•ÒÆo†lØE&¤dá@‹Ê:@¹ +u2îªÂ¡´Šµ³ Ę­Ã&REcUã +g©†¸º/*‹“É¢k’5¤>ObZ|­¡-‰²zÁü™. "¶ÖwÛg­ý¥g6H +3`pUb? ^ +ŽÆ‚à[ëØy@€¶tkMØßsæXéóöÏz}û¤Ff™ãÎ/â“ß Œò®¸;A>)ëu>®&Æ(¯–!ÿ8§2¡3@’Þû•ÏÅuÞ»‚Lá7„ÛÇ-QyYRl¿|Lš+¶⅀»’â 7Pî-f(0¥{Ã^©¯~Cæ†^/É®Ù}P[ñ†ÿm¥LnÐ-˜–E× «j"(Ö •OÉߍzŽýu˜€ô=>AÔCú¥(¶6؉? ®žÝ>ƒ¸±PioÐy¹ y$·!ê‡ÓsÜ\¥ ˜6<°Œ–Òð? üÎÃÛ§à5•ÞkGÍõd6Dt–K'ÎDPʘº%”ñ1#B\'éÜâ)î†ÄÕXr´À³³9ÈeÚì¤Ù (e£a³ ƒ.± +žË{ñ9\X4Œ­‰…á/6ø>aHí£çDö„¯¡$3ºZX:=&ü ¯ôy¸p6'ý.±OŸAMµml‰¡gaÛè‰ÐM'q*ÆøÁ— +x†6¾ ‘“q—ac"¡<šµ†€Ü„5‹D‹"O:š1á2 +c—_§[ãZl„3,ñi`¸ŽÈãaù…¦8¯›áb7ƒ€Oím3Œ©ÇQê-٠Ҋ¯Ø Á5Ã56)=M)¸WÒÎ&¢f†âbA«W?փ–?‹["t3H𪣑{n° ÊÑNGwNÒz‘Q3*ò舟)pEê@¥¨}»–Y +•N¬zÄ ùFé¯RfX¢ËðsYÃR@x·_†,!uC¾ÊšBˆºŽõ2höüäÁÐþu(RâS˜W²‚fÊP€ÆM@Þ;îL*&‡öfÆ؄2<©È%Æ2ÊpÌæ•!´**Ú_ n˜îä``OÁï?H³×D*Ã)òT®~` +o Lôù›>¯ŽŒl´À2Ì9Ðï“a‚r*‘)Ëî¨#K׌YڛŠ‰â:å4ñ*8¤²€«Y2, ‹¹ýéÆE„‘Œ!ƒ©Z÷>‹$ÃÇÙξ9¦¸ð"…˜¤ÞÍc¿:… +FMñÝÂze2þ n8¶žiBq"¶FÈ0ýíâÜOñ8`{VÎCÑ@ՙ¡…–-jW6NùLžtSž®€‚ +*ՐÇU·x¸³™;†Hyæ +S†{…É|€oH‘t ¿¾zTŒ†>µè†„ÏXŽÃ÷ˆcQRÑFì˜ïj 9 ùŽv¸0ó6Š9c©œq„Q#Q;9!‰/°«òÉ´ôG£ò—RNéœÁԇ&j C†8˜â½ $%N\²:ŸýG-ÆM÷I(bÝ:ÀÎ@Cì ¤TÆ §2µ¨gLˆa?NZÍ~l4P:OhõÄ÷Q( M±wî_z ;x õËٝÑÐ7‰+:hí0@¤ú/3†Ä e·õ¨¯àˆh} 7z‡õ„Ò#±ËVx+jzzEü9÷ÔË=ÿóqñ+bax- ç…Ã0'-f+ô5ʯª6ñÉ«=S Ã$¿Ì +h@Ðr~†Èç›x Õ]Žº×Iǽ·ÀGq¢œ‚aÀÆõEÌÑÄÂð·#H€\ä¹B,rTÕ4†m ?`|’a:…uZ¤L¤ò…×@†Èö0Ð$K½-(@œ!óáôgÅYbC.Óto½þ“_›†g}µ;À&¬IበŠö×·f¿Ø^Ó÷ø¾ùŒ-ýߏâĕ Úåñxkî…匀ÃIÁ€ÁÐE …ÒTÛF€@%ÀþÂΡ^Š ÉïÿFÉïI0”w4Q9¤ ôö’tµþpl3» ©s ²(ÓJ%Ò»‚¤ät+œé@¥ÇÞ)òâÀð9ÆZ6AY#ª8ñ8Ú½˜vŒ Y½ÀڌW>›¬Ó² l¥+:ASOfÂýÅ¥-ÀÒ¾fìq¤“bhM ìb¯¸çÀÎQú·7îuãí¾ꠌ®qxaÜ¿,;öhü ñ]`·_ø Xg8®é'€üúU¤t¡+‘´!†Í~¡Ä‘e(RJõ ½D%ΰ “FzØE™3 xþèÖ·~A}½Ô®µzzôÞò•nbAEs_øœöóúõ½À(¯c^ê|!HŒÌãÓEW@Ön ùÂ'³ÿç’Âc?|jÓÝÐ8Ì܌€¾ +|ÞòîÓ÷B!ÊKQÊóùÂ|g´›C´˜è±¼õ‹Q:^‡ &+½à³Õ2/|Jë*ØÄç¼°4Í3’îÔ o”|TS‹tU\` Ö]¸‹¹“DYX&;w!ÌÑÀñ‚&ï£vA«(è°Jv6®f™m +^I…X…Ðxø]øßY˜ –¾è_ غֺð¼LV €3¼ìx` ~™9¹ Ø;Ž¸DÞz1U * ²]À^é‚ÆiD»°F—zœDV5ý+¨pdRì„®cÏÕ©Ÿù0Asd§©»µ.øµ|Pa3Thaí® +†zµ1P¤ Ȟ¡±J.¥ÁôOú¤µIa-é™ašH9¨ËJµ6Ù*Lež".|Ãæ(êäbôîp&÷­€þY?ù+€f6Z‡‘÷.r¡é7'm¢ß¯[ÆY%㚥…oϦ5p¾ø“&f8Ô°nC’!Ê&&݂¼RšÁ…þqì_™…>`¦®D<ý`(ó¶…Ïåf’oÖFœÞÐ[``p*úL¤„LÁl89èv°â¼¾Ômè·ìÁ,¶à`TÀ¶@a’š.7k óB +¢LÚB,”S$m!-††Ìd¡-Œ"£³…oóÍláhQ([ÈÚEڔxwbNfÆ4W_“Lý"7(l!FçŒÐoÀVC6iD’ªáƇµµð:ÂnrG±NY óºšX³J2jõO®Ò-V“Á%PY5Ø5C|h¤ž…ïy´ð¢ñ4ÿ¬[_P[+@èÖUaö:u^Rl³YˆçˆT,¨™ìõ"z¡qåÍÉ9L=Ëàa¢rYï + ¡®côn; ƒRðÛy?Ókq!šd!|~PY2 ×s`M'–œ‚,_…Šÿ-å$¡´,ˆ2j¨‡.¨ØNÒPt8? +ƤÅɂ1¬.É6“ Mqc´Ž/(@,„Zä8`¡z͌¸–ç؊bX žd-—)¼TrãcԔ̀± Êò¨¡X€`(#-ƒŽ¦øçN Wh%µÐP­ “„* d ö ª¥ˆ—­‡îE(Zü¡À¸æ2hwSØ}ÙÈ^[a!XÀñ‘ÑÒ$ oÃP_¡l,:YWà-(2+@²Mñ„‰ŒÂBZ,ä%ˆh'¤/Pk£ÂÀeá/x]÷ø4p)òýÁÁ4B­)‚…`‘E˜ïù; q¸jFáœÖ¥,¬›Í›f­»Â>y% {’,Á_A½óHð^ގ*dë¶@߂yÊ<üb[1;®À‡›ŽR”y2°lçÙÞú¢Á€¶•Î w…"fª¼åÀ֟‰¦v…á™m¯8aWÈÊM @­+0×Ï«€¹sy:ÛñúÈ\¡#U/d XSÚ¦Œ…ÂлZ!‚â’² +]‰\!MµÂÔa +€@ߌ‚G@σb7UOȝ©XÒ@¾ ^Ž0SG²È¼d –º@7+‚[AG¿¦9yKS¢V(e¾ú“уó(oZds³)”²ˆƒï놋äÉ(‰8Z¶ó¤ÂÕQÖ¬@MmÌ +Çhϲ‚"p’/®&eðèuº›ÿ‚Ú,Xß9Î^LË$N +Yáv‡kjò69`0LT˱Â\ïˆÒ MIö…±‚8l"–\æV/–Ü$3¨?zÃèU?ŒâUÈÛù›—í¼dsÕ®‚ŠvÆRÒo¤* 3]TOB°ÙW!rfÙ­ÂêÆA¶µœ +VFWóA"¹¶ +ÐIýøA,q¬V¡deù R¦/˜U8 Hz(҇ÛFX=ˆI»ßsbZU¦!²…¤*„`Þé#<‰€ÿYä™R© +†T¡àù + øG£ +qÙ­ nB Ma>€×ƒ!)„[Ø£…Æ`íã¼™è Ýî³hñReŸð“¦‚%T«Çö\¦B.…¢všê„©´Gõ)t©°K‚Ý 2ƒÂŤ‚ôˆDRamŠ,mê¥(Ra¨DOÛ¼ ¢§Wø)ÌûC‡.õËQao›€l‡Ã–™@qbٝwP¢‚SÉUQ´Qî/!ãÑ,e˜9Th›òÑçLA=Îgoy§:ä¨ß¿ÜÖW¨GÿpeôÒå¼t„ +ƒ/k¤tÌ嘕ģ·Š B݀%¼ù0 ß*Pa¼Uj BîšÂ]Éò¦LøY'%$@±ý¦£¥O!#>ÂGà‹ä¿؆Oa +Jðì)`ˆÇöä=¶ƒ©<$êóARÊðB¡Ñh¾2ãa±Cò‘îkv +ãÖAÚôM Ô)ð»qSÛР^ôfÔjšÈ#¤7súPÁ¦ÀúË+ZS(ÅÔ=O’‹TÿÆ3ĎÒƔÚm: â›:g +Tj'3…[Z@ð„¥V˜>C¦ä•ÔKàOçtrÛjSÉ0*–^•øËB!"ùá^‹;L.K!t€Î˜#]ƒ¬>·ªHà [Qކj+¨)…8¢e(bàôGö¢‚0ZO1¡ÈQ/•¡!¾EI«½ $)l”òò3 +Ia&Պь3Ž웠dûÊH!9†Y‘£‹ÜÔɈF!K¡1!…é»Nš„m…/vx¥úUu: %éè(€µ^¨‡ý¨˜V•£PsEÔÆà(®H$LˆÇBgd—ˆ!\Äfæ. ¬ÂÝÂÉjê"£^FÁÿ|d5z"ŠoúËõ‹ìÙÈ=CiQX³M¯ò 9¶Yº:{›X¦œïωæúÁNJ‚>CvÃ{„ŠB +Ñ邓¢àPB™=¦PjçA-`1üïòøªªu¢“ç7*3÷˜¦QùCÌ[b*¿ »†- +q¡øŠð˜«Cý|tƒ/Ap(D%<ˆS¶ Ô}“R ér(ôå³xv*ÂÑPÐÑ ÂjZƒ¡ ¸.*ú~ª¶ éi5Ï9ÅÊ ÂåÀÝ=¨ÚZwÆ{Pȟ™qPègšù~…" ×çÖcPH(®&>0f¬Ò +fv2̶›¢­rß ~Ly +AF. +tˆ7 6‚½B°á"ÔÆD'ðD˜2¹ý„u–8õÞ^4‹Bé'ô*ŒS6AOÅI_™P ûÕ'|_e·‡ú+zµk2ú„ØË/šðLJ#Ÿ@Ö|Y쌈’ø.÷ ¡¥¾V]„ÊŽÈ{²úÝXž(Ü.«Æx[øssÂ7é»ûa.ô5©¸µ'@i±ža ¿nç& +çÁT~ûiRÄÖ¹wxü6O +œ ÐòP ï8)æ´LHB@'hY5ˆöÐRÀlÌã;™ÂÒõž0uŒ*«Ìlŝ Öÿ6²@$TW‹ÐßCtᙜ@‹ð^’p*… :p؃®lu•ÁøT§~6,„šóàœ[œnõXÁWª5'x‘÷Q§‡!/9K˜|Ô BNبí'„^›qBLÁ â6 †8áúéâ Ì6;8$‚NÙD8º*ƒC 1¡)8Á,Hjõ»ÿ¤Ÿ.FÀ Ž|Óû×ü¤›ª±… k‰[u1ÕÍ™ààíå‚e¦s…D|š„Z¸ ýœÒt"n²€ígˋc›Âß`ÙùŒŒ”/…¾õðªMˆ¸¯ŽÊÛÐ&”‘&ˆ…À¡°PšÙ-„ǁÃdPœ˜"± umZ–°}Žë؄àîJì‚PTŽ›R ±N³ ªVj£©r‡š€]L±¸px\ºnC¢Ò„uö åp Í³Ë‚ƒÿ.4¡€QôŒŸ`3­K< ©¬&‚´=â2Uü +ñƒÅ>òM$KŽB–à#J®„vç™à;6#¾AþR6?hÝ¡<ãOX&ˆÒt]$n•DL2î¯É}&¬{–µ N » ´Ð}¤G2} È„ôÔ%š²0T 2a6ƒÒû|€ÅGÈH3ÇÄCX=e³%^ ½í՘ QEñ$%°—úüÎÑñl›º{P®<¯VãFÔN%ÈtK7w@™H]÷+øê)@€€KÓ ã•×î¤z˽¿…—ƒØ7±s- j ÛÉ +z·s‰_´¦$”U‹2,)'¸;&‚RÅP›„/³¥Œš±;FPÄ$ ä-—=ÂEÀ[à*{¢‰pîv Óh±ç =ŸAXE¤.Â|ãÅ]Ó· ¹|[‹"&˜„…¦†EÇâAH碠ÓC#Aê½á püˆ>= +U¾1¿ÿµÁ/œÀ9õžç*¢6«H Hp»N’H¡`ñH¡6½+Œ1/˜ÃoÎS¹-^a¤Š§"#õ¶E¹Á¥NN‹ + +¹,m¨s©€àR4¥ÌÆ:iv‡½A>Saµ‘ô8hÕç H>åô „þ#Ü/~k*º¤Eže%ÏÚ¾³ób27Wð(ÁuR-²_¢ý\ö9¸œú ãTÛ*ÛzÙ]ðP‚ÒâUº×>€ofD5‰N'w¬Õ-ås¦>mZ‰¬·gkËj…¾@×ÂnÀÌfèâ±ÊòȔÄ[¯:]¯Â(³.O'PÙù:2aÉ +ô¾‚hrçCŒò2ŸDåPòÑ蟦éúم2Í/’a‡Tý9qDagƒy·+»#¦ac!\æƒ%x_gèD6‹"ô?øjØg˜L;±°z]iM|Ñ©îEèqî–h/&-.áEÕ:'¢3kIÈ@f‡¿OòÃ!Bú +Ñ¿Éø¶oٌe8q=둉T!üò+܈÷Fm½SîÁд¯°:Ü iYõnˆP ØÕ.Áà +Õ3˜2‚["ÑcªÛÈn?N“T\™×Ò¼ê”iI;ޔZ¼G©1`˜l@[¦KøD|ÈPš³ëFæNbßk? +ø¸Ä1À$È"&ÃÆørcíø^s:”*xœ­ô¥mæˆ,·ÀaV#˜j,# Í\œ#»È79Ž? &÷ñnQéP¨ç”P߇© 3Úð¢ü@Ƭ]â„܊}À£VfdÜéâ]FNóYÅ#‚ .f™%ҁº1È{¹d‚ãF`ûæ°hîÂXap²ÓíϧH‹£ ΨÒM|“·+R[75Á3™wàØpŠÓñ4(¸»g§(á \Ґ%(ý—©TèT—çdWÑø<Ö¥Ž“AwþÞ«4íÑh*lÌÁ 8Kø ¡´ëSϋª‹SƤ}iÌSŸ>zY0¢µl ™" +PœÎèe—HÖ wÜ+ ‰õÈvåïTe¬Q´kJ¬ßx<Èn¢9wbÈ,Ùb?Èka.Uh3" íwx¦žlÁ¯¨ƒ¶ä2±¢!žŸšê“83 ð‘êÓ²»â*j¹Çúÿ¥p#fåOê85Íèc—¾âG—æ¢u,¸ÕÝzE9Ʋe“n%Ýå2èräã 2pàÖ 9Ž·àÏ,àB ¦Þ²`'2Ñ®TJ*ks<ÅW¦Š/5g ¯B0€‚‘V’¿>ªí#‡í„T^é¬oh@F¨ì àê-Y0pµ‰ôÃ\—]YD(eÖz“Sœ`jУ!à9xÁ ‚ΏôœÜªÅ]ÉLzÀRÙ¨iZÔBH Çy?(F҂¨¤Ïýìp½–܏ÄtS]‹l†×ѸBGw‰¹s¤˜ºRx‘2¤°bã4Šc¿¥d&.> +· ìPœ3 ¾–¥5KHå“ÄDs(jŠÅíçö¬%UO„HG6I¶mRxš¢ø£&ksƒ|‚aÝÇŎd ’’$w.‚èÞÎ*zlu:\Û7 .‡€,ºHUȀqü¨oáÌúF+‘\"ùg©ª¥–‚.b XFùÉfúÞÏØ){Á~u©ý4 +Aî½ÉÏ¿[‰»`6Û4‹Û:;Ww"HmŒá¡ÞCëÁ¨ÍØíMžç¡³jVí»S, +÷êk±›p„J„xjRA€’‘­u"€{±V?p0èe—K-í“‚¡ÃÝEDéSèÑ]<} 3š¿]óƒ4n¶¤c?W]> + ¶IÏ~êêÖB!Fù*;é"œ±uoGA¦q -6q°xº¬ò–@odֈæ™}ž 8´Õæ5¯‰S—P²c­ ÌÕ~R̵Ϩ˜žîIó[‹ydJ– ËH&?Jt˜õ‘ +C GÒ#á +H  +./ÁÔMo¾„¢´bmQNÂuJ0l‹0zI:ž¡ÎÇØDXkË붟˜Ø§õ +qé,Ÿò¤–,[?»gì‰ïe’26©Þð´ÙíÓ¦–Á%ÃÔyC^ +Ï›¡ê¾¶.ø¢ {»€‘GÕXmp¹’‘ ŽèÍÝ$Q†{_TI§ï…ÈÕ^v6l9åèh£,Ï <:PVÜ ˆîâ-Ž-ôÅCܯ™¾¼Õžçº1»?F>RLFÈt†£|RG{'㗏HxšD1oD;»~Œ‡‹ð< +ґË? +)ÿy8 •K,me[C±cqöó—Í5fƒ¦å§¼Å*H¦z³¤ô%_e›…ž¦, (µèÞ¶  DgcÀ-a„]—VˆA2þž ·üÒõ Â5klb¯‰K:šÖå~Š/‘Sт)(%ôk(ƒ‹Ž¢iÙâüŽQ¥ÝÄ74õãN4Ϥ4¶dWç;g›{{4ÃÕ·íY¨XWE&‡ÿáåwqШ$øv? ©v¥È×àö¢½ê„ ^źš;zTY‰ÅLˆè¥‘Sùsm3Oÿóˆzõ«ƒ8¹üŒπõö)Y¬¢¬Þ1¹ÔύDŸô‡¥ì4x²è4ä¤ÐÄ7!W˜$@J¿—T‚6ñxzÅqÅ<;æïB¡ŠÓ"6PNáWTBRîÁ»ÁáãŠ-قƒÂüڐ%¯ÉkYû› ‹1W6ˆ»›¦dø.rЅߖzVÐ8[Ãã*“Öç£-,øp º-°#šq?fÁnçˆû¸€°UˆÙolþ¢–Q@Áåê)•²nfy=߃['b¦WeÀv6&Wql]øí¡›LE,ýÊJíO3œa§ÃÓ:|ՎMt·€Ü@a¹,{ðv1˜m¨Œ›µÀ¨R€D^‹ +^a{D› }Î Y¸ ÊTKM»8äÐùM£HV¨_fS7žæDՃï‡x-nd¶ë½FŽNVÉï€ü!º‡Ù[ý_À+ +ýwU"áD„”“lNDy"T!£EpL[ vP[ÃÚá…â²}Ñ.ë{½Óa*³ßWCåûI-äpí,Ё#uòBª¬SÐ+‡‰ýž÷Wœ-¡[âÑb_Ü}ÇÏåî8aÃé+°€âӓ·žr£n}Êó%M˜Ü&ÉEzSëõ Ì’Á‡‡RàŠ]´„Êš_>¬{„mÄL+C+ø×ÒcÉÍ¢,{¾R͊é,DW˜ŽtžÒv?³ŽZE5K¡Ñ†<\H¾’êp‰¨_ùïÆcEGœŽËÀFÆ¢ŒµÐXïŸüÒ¥µîºŠþ¾Rãh`ñ#,–c¨ZilŒ$ç_Ѐr ÔixpK0jΕLÉðt½ûãÈø’ÿ1Óo6R|柢¼š1^ËXC…ÞÑ;j–´ª1 §æÏ¢§n'è`êEGƒµ5š'%Ó2ÄÒåM?ó%Sp´%9Or:‘”>IôT¦Ï½ø(›‰+“…<Íw˜_Ë)¦Ë÷g¨•O( U¢‹¤ßin APm=?BT³` f=¾ƒ’Åz"F4ð­VU™z…嵟Á°\¿œAö"Ç ,O*“­LŽäŒêH5±Gu­þѓ¯d@ä$akNRcðIòL¼=Ö1n¿ ØèCÌ@ºhíü¯‚ÛҜ95ÒðWwٞ¢ÁßûfB^}(N‡Ä%àOÎÄ +žás:˜á¯XáÇó¹ùr˜tÞôfrácŠv=œ•ÕüI™Àqñ¸{™çñ¨ÆÊ$bÓ &6—Ûچ2K™0ù7I6€€'ƒbJrÈðœßg"2¦±IU@uf ~+3¯Bd¹œn;`/<aè xí°Yâ&tñ˜¬1#¹ž!^SÎ몫ÕEê¯Ä9žØ,4KÞ¦®©̔3#8””ø²u9̬å1߸‚ÖCT¿»þ…·w sôuüUJEÇ¡l +«…bmÀª9£D­ROß7ŠO´¹î U¯ù¥ÈÎüóXÎÕÖìkvrŒÈSfœÖgIhøS§‹ÝÉb½¬5C] rJÌuzñ¥`kò^£YºË°)?ôw-£¤ôfBE9Œ„@·.ª×¬Ã½òß¹ ™€/RçßêЄrh%ē†3žôbUN·¦å¼ì‹d5ÜяÂì$>­T.Õ¥XonDS)N±t^ÀkLrB^°,Ôâmd/ð˜(í{W —Ü‚jµI´Ý9…¢DûƲ&¡°tL¨€ùæñÒà÷j¹…8#ʼn¦šÓÞ®‚ö”H\2èMþCš}Ã,í »wt°oc2rìïB€‡µx9é°kŲU4›E8˜,#V«Œ;ê9\Z¯/‰øõ¢I{ɶ®1ÔÍDÀ/$p¼Ó,È06ÂÄuð\2hŸ +ü%DÛ ’ØŒWë+ ¿ñïÝãt¨5¤m¨+.ðø©»@Œëqf¦’ÁóM.š—ÃHdh-ô/¸‘ìÁêh¤U´7¹âa„Þ6ˆ$ ¿v¡ÆÕØSGÿU×NX°g1» £¤Åªà»Ž¿ŠE†!3ã‚@«rcÖ;v¨ÇŽÃgr N ‰Uó.c"-MJ•ï×:Q¨Ÿ¬ÀÛÏBŠñÁ`)`‡_Ÿ­ÕzbÙ±±\öá=%™È$S=Ì¿¿B+ö2]ÍvÐPç¿s¼:‡Ó¾°ãåÏ}m¥¯Iè,ïº\‘¦)8ú0>u9¢õk—XúpœýRB‚m@â;‹k¢€yJ¼‚!(ƒ}R.¡üqÍP'àÞfC’d#uUã|OO(* ×>-{C–vg Uçf?lÈá[™[ý‡M;ŠÃ@õqitú´2b¾…hÒÝ7"jf€®Ý"[–1 š vN†QŽGcób„E!÷ٟ(ì—Q +"a9œ[h3^[“à¢1¨> f0bæß¡ Xa!OÅγ¡á¤_vF›ïÃÞ¥HªÅ—’ò_¥‚Í!¤IàF>‹)ôç…ëM&ÁAœ^PfåWóNñ»^hÙÊÔ…„þñԇ‚},?ëÃþðë{¸+àüÆ­¦˜@»dü™Ðp¶e˜¼BoZ ÈMdzã>O^’«)ül ‚/‡WƒËïÉ{ÇÓEí-[Q3/ߚb;Ï %Âè ñ ‘Û(àÐU*å¦a¬I˜Ú7ulÒ¯.Å5àë]> -&ÃÜ%HݎErÂA⍚2Uîšé;´8¦Œ±* ëcX"é*•=݅†»¯é†ö$‘aC¦D˜¢ôþáóBIVô5Ÿ»Ò)ÿmIm[Á×WÇ÷µ½jàÃüT@ âï}ë]®+à‘ ƒJ|tlL’—Ðì•Z0T®×æÈt¤ †ÀBÙù åéÝüˆ]´nbìácY ÄDÖ)²š‚ë"ßL*L9V7R4#ì,}Ò#“5㍳;¾{ÅOvG»þÞoÿ…æl’Ë ák92Áº‚iω“\ X`¢ò(»`o¢¤%A5f"¬w2:];—õ²f/——Êöv–¼õÉø$?˜‰8Šv*‘‰O(/ې†h1ÉLÈ ~MIñð'÷ìY- %ào9#¼kÝÑ°½Cî]<ÏâØR÷ŽF +*ðî¦È‡@¡E5ZóÒèð•”`1HêxïJ ¥…Ê`$‘¾ÌSzôòŽt+ +rÉØäÀ6_¥„®žO˜èw…ÙEùFû:+'.H}ÿ#Ã/ ‚;:Šz'.õ—P!@•Ÿ™"+EӒ-c¯é(ñÇňaï` ðŒ©ŒžHò†%I³¾çz×s))£øóóç&þ,¶&¢ß4 `ëæÜôpôNä‰% +À¹v헡¡ÀŒ™qúˆ$xKVŽ–bØ1Ñyø+(JöødÙ^œí#®gu®v7²½s`ë­«K·¢ +»BðWkv&M#_ô4¹ w1:ÌÍ½¨‚Îü¢{µåPŒ€oR¥ì’ÓË׬‘´…9í„ Gþë˜&ótw^+HA\Õ>k¤›Fg –Ï >Q ֙u±ÓÉuYdBé½èÚw-#³ÊÚe¨Ø\æ—$f# ûêÏ¢ðšË97†¥öì4ë„Õ ªÉè€Cd*[H a›8wØ32Hô,÷0c€DjËzªûéÀ'êÒÑÐ(äL˜c>ÀµM‚Ž–²E²ŒÍE†pÃ0[lÈܾSäi2–b®np_‚pF%F/ôµY *3«71;Ø;ñwC-@WøÆÀiܙv)öBC ¢ŽÉ&bÜi71‘lôAÏØ\Üv’J7 •ë›ó´>U´{fÇæhð{rø¼Š—ÄƑ€w&Þĵ5>sõ_R&Ìh`î¿¢ß$(>\·=}au[¶×ièÊjDê‚*6\éëÕ¶ ¾ª¢m’CXÓH-p±×\éª@û. ‡$€¡s‹Àâ8¾o㽕èÖÁáj:Ì"czyãJ߬ÓnïŽxqiúҋàFAHéRw—êC߄CJ˜{Éüñ ¼]¹RšN:«+cÐÍԜ 80ý`ì3£S¶J4ÈœBŠ¤+DÒóŸõïoƒDxõLÂí&=3ÉÃ[ÍH€ Q؎9c/´L:àjs@My{ú´«„Ñ¿B8-à«+ ”Ç£tÀ}%òíÈã¢ña$ۑ¨³&£’’¦_®â(™] ¾)e™ž A xG4èÁû‚R3T›gfEìÌ-Þⵕ¢À!Ÿˆ˜­®Q¸ÉwÁ[‹¾J„û ¯&s¹å- š +<+‡!˜2g3xR—õB¹”ƒ0âêW C‰ZY/ëbw Æyz"Ï`þ9MJJáÊûŒ»–8ôaq­GƒRŸ®ÀRÐSp¨‚aÒ÷n53ŽX4{…©”¶jð)'þ[¨ '÷!ËÝ 6nWå_ ”ÆEjßoƒÃ˜Æô” +u²“´À(Ӎ£T!ó2 ±Ö"bœº“bT´‚ uøœd˜œSR)#L"7[Ö^‹¹ß½D9]õ/ȁ¡‘¿íË)`ðÁSÑI™¸ïž0P“2T!™Ãпöê•u.ãž=_ ~šƒŒØÔß®] `b|ç +K0Ïpê\öÍ!=;P+ò’Pµ%ÏÝ!8‚_0Ö*ü¨@I ¿ UY}ž[쀟[â>Ò]ýJ‰+H²¡V*’ì J¥¦"Ì ä“ŽÍ¬0½¬Äڐ>TøE 0&"ÊÇv ËáèÿpŸoèôZnhNÁëäàñ1”¨…¸¡-H2 +†þ€þ±‹9¥D%¢z¢³á‹ZGà n„²Pg ïp>NˆŸóœéûm`kNý*u†\!`ñ*¹Õ^!ìý¢7!'Á‰p?pq ?Ù`ˆ#ÜÇÛcøÁ~»X'»…„¯@c *bKž6h¸…C+?jðLì تikw~ï”áÒBx^QÀ”Åéèa:Ioô©õê|ñ~'¢WG-•X9#Yô55M§3 øA»%ðÙ¥y¨” —0f9cGæ "¿ChÛ姊ÁL¹À—äÚ\è)r¬õúüq¬iôøˆJ«>”xÕVهðˆêF!Ø{tÙP´Áî‰#Þ^RaHÏú`Œô$#1î΋¨3JC·§ÍTŠB҅ t4Ͷ†n Úv–\˜îþ1vˆJ]8©í:íö×<Æ°ü:•àñŠ n›á1™NŒÆà|³q¿ãŸæ·t]°¦ù”q¤õ’6]7êd‘JFO«'xÎô„è¶u+š`ñ~ÇÌ;þgP‹lÖæ,™@dkɕÜCb©CtW‰hw +¿Hœ4 +?4ž“gJ˸èCKê;šóÚG Ñ_çùs/á8ÒwÄPòWkè¹è7Æґ*Û! '¼@À×)Sÿ;pþÒ©¼À0ÖÒïc¢ÉÃ^‹æåáÑMqÔhÔnߘÚʏn×ÓÀSŸ¬/¤›)@~Ô7½íi¾ür£è Àðköކ­ÀS[á»<@‘ ¾w‡•h«à—ò‹¡ÖïގÕô¢™›È8`·’¯ºdق‘Œ£bý匿š¬BžgßÒ­€—DAYÁÌ +U[ƒÞp‘Yd *ØD–G¥¸8|2F¬' äîüWœ°„ÚrQãßÞäl›ÊžGÕï¹PΎ>(íb8öPš Y§èàÓ¡Ó;㑗ZÑKÚ% .ïFF8Õ.W5ۅ;ªJ"½e>¥HÚì˜Pm€uñg}.Ã) n×vv4}½ÙE5æ‚ cE"tÍ̗l }PÈ!RÜܛä…'Y_`Ü<^wùæÐ:Êíõ0Dö·\§ûñ©xÞè +(ý¥êT§&xmåNªñ¹ÇpÔDs£.rE¦#ÇEÓ,þÛc$ì³FNv_=v8iDØWj©‰ÏO¡<8Ü-†¯ŽXùN1«²R·Æmp£„ëB¸ÿ˜9ʈÙÞåÙ]´Â})ÁÏwâr‹ÏQRs’.`«÷iÊæQ8=°±¸zN'¹ÒCØâਵש;Ä?TAjëG|£Œ´Ä!TJ7´J'6e²˜pv25ûë ¾·!¸RjÙ¤3£åSÞ©–¬6q,Áï¯õ|3ñVÌØÁ%œYZ$ÅTˆ +µö0öŠù +›Ö,nÀ/‚ E˜­ ì>™ÌgŸ'4q Ih¤^Àۄˆt¡Ä¶DÝTê›EÏe&aÂQ²"¾3í”HíúhBÈwŒ¬Ûfÿ>&Y(æè1øè‚ +í’b¬Á]ö§†Çhp;ºðêûÙopƒ3Ý ˜!ÜM{³—ÄÕÖq{ªÞ2-9BÑI¥g#BRS¡²š³tàØIúDwNÏô4=Õ˘Çý}íÕ6 "V\ MÌKšRU‰Í½BhS0ÑáʉV0NÖTÂî÷çZ+ì&/)ŸÌ¤ õÁ-™:9C;¿"mÃC©ðƒ%‡_5†y~ºEɉz°¡·Âem}!} q1 ßóo`ëðÅÇÐwOSlHA‘~øXpÌÃ[/ÓäÔÐîñmÀà •MÂ)þýke»Uiž‰w—¡ {;°¯ÐLH:<óë;šùÚ-ÇE㦄 +Ý%AÊpŽªÔÓ÷”4G’XcTè' +lrƒ3œùz8t-Á·Æ=Z)X;"jš?_`\þ¹™gÔë²!êkPHàñ_öv$¿ÞntÎ +õj\úD泊ÕnEÌÚf­Œb‡lrPÔì Ã_¦£‹b#uɆPVWü°#Úgeä +‹ldPWãò‘Úð’ò—ò’ÐÒæQå o\%RèQÞ7Ü G¹Æµ\ºþŽHö¨‹D¡^žB§ïÈÖ [OšGõ”…JÃ'bÕ$ Fh\Y°vÒýàù®ë’rŽóæªMIj4‘561XË.nⲫ[z®¼DT¸4_½0³eHªL¤ö¤œ2Ó X/ºÀ¹qÚÙÅïH )ó€3›ßiF³†y´ê Á`þíÝtnvK1ùÐUÄ]YEl eþÅâ«ëX¬„o†¡)þ‡þ=ºíƒžsFGì×­wSÈt†Ž8ÞÚAiC÷Ö¤‹A„ìÂêO<'BŽM)«9Tä~[IRyì9íÈ:ŒҔ÷—M¬¡šTÄly¯ ^Ü@²‡_<6ÅIžn³Ywj6 +‚óQ?Ƹ丼mR¡j7+jf¨þ ã{ÿ¹9.ù.‘¯(¢NVO.;ÈŒhMönH='Ÿ;¶ÎZ¤UJ†2 GçŸʄóSe‹JBã +Ƈ\2]Ë›@ˆ­ÉžˆCAWÀ<œ¿Îö‹þœÂR0B¡h/êfñ\ƒÏ‘±ùc³Î"Ž¶¨c,óKkôOÀùãÈq;‹±:±žº®$Í ß èàg­ëýJ‡g#žó·éÆ`8"bٗþ¤Häöe‚»ßUÒäwÅI GZáA…ÏnKrÛó҈g>¤]ž-N҂áé j,~sjÅCɧ¥ o®ã™ç`¸p'¢žÄY"ÌðæͤxÛ¹¬òÂ(Ä&p»„¤=tÒ!ƒ¤)÷Bֹɉy3þ.w—‡·é2 /-vü,”ßøDX|“è˜ø8c¸Ÿå +·Ê5Ö§-ƒ—·9^à˪݂40–=El‘aࣸøxOþâ©AòPÌJGwkOÒ¤¼A£Ü©—¿?™óÔBª4 +ˆý þP<Ñtæò«DJZþو˜²Ð;­^kœ×¾ë`ʜ­h>¦Ê¸¦åa #ݱß_õò²ó¨_¢tèWô/wlᬝÈZ˜;êMúxº7jп +0\X\™”`4¦aç˟i”E“1¹6¢èlÂÕCÉÈÓÁ+!P Ô]p}ùl*³6-¸î®­¨ÝlÁø^øž1¼U@ܖk÷÷¡’}jXïecB1°L'B˜š÷2ù½wïÔÁÞË?AŽJÓɔv_”a‰.þPQ•æs_Ùª$òÒÝ\¸VIÀ‡~¿2?Ò+¼r´ƒ2ÓA&ïyýÓŨý™Výe ¸OÏà÷÷+…Vºí©à›iÝD*ÃäOvFƒ[MÞ7üG.õÏ¢™mo1ó#ˆ#Àl—’F´d!ìsz¬¦ßUvÌÍ? ¢z†ªÒ‡Ï£9„§¢¬/ƉŒ»Ë…Ç+½Î¨²ðý‹û"§g69ƙTs²ö¢ÌEÜIÀ•Cä Ã9´hÑö*p›`²C”ƒˆ.Sُg[m9……`§¢âùùÆEçDñGç¹¼ÎBÿEGÚP{kùÈ„4=ûkEÌ@ڐùÏxJ*dfÌЖcgtõɑ$ú‰0 l™³\”!°J š‡®Qà +ytÌëúÊúFŽI‹:¼Q“H/| ¿"uFžgܨ{HÔ‹75³1›¸Øè—ñÈr{bϵ¡1ðF¿+’èV“õñ Xéj蚯GZšÖù¸:ûþÕŀ|î~]¶lìÈ^T½¶-—kµ¢ök1Yã™6’ˆ¶_­ÅJ:Ÿ[Ü9&jiLA¯XLôþJN¹È¥Í‰ï”Ñ/~a +ó?'–<‘¡îÅ÷c³‡¢ÚíïØ À©Ý *è÷llb†„õ¥÷æºb=`!ÚdgÙõúÏ`CIDŸl+ [X~oŸ¾üBeÁf2²ƒZ6°; ÷‚«0ŒåóðÌæî  î>  +:}WÌÞ#" +/C~y ¸pzçÚdà ¬™Æ¤ìfoۇ)°qܦÈ©hÈ|:*Uå …¿xÕ+–±º¥êxèì‚!P gÓ.wmèÙ+¦å|鉃3:K??à pÑ̯ÚiÇC$Ö <7òS™³q +¢OÁeƒƒݕýÁ߇ãÐÑÁ.ÖÞ¾+²R3jŀMáæ/? 4:üU_X´Ò•Ò1*Ö² …s{‰Û•Q^4…c?È\Í×Ú¥Am…ðÓõ²ìñ!šo}ÊzE—&“ãq”×?q÷Ò¯ßùP†¹ãâ”’$ŒÊ6ù롱Æó8æh ¨‡Ú0¶²Z¤@у{n»M¬ŽÏ^ƒ÷p›)²ìH!ÇD)XÃÉ~rÉ ëc¸±,Õô-AR1ne«_¤RYšØýVß­ææ?>ûP”ܲô†|7E%'óêSx‚ŽŒaÝú +V<®Š!®LsVwa ‹Ø"Mýnä½ ¤•Ãï>ý©ãÛàÓ>0‚ ˆ¸ãÛd˜ãà…§‘búËUM!·\@eT ¶É[1/sŸª6¸Õ·i÷¦ò·W‚õhEÎÒ¯&/!x$­”«9yétcçW§ylӊOñß¾áÛ]Iõš¶£é“wüœ>*Ò©qïó]~åԎžQ +ËOò*8ç5„zÖW ›W–ºä¾K9´ByÐÌúJqð¥ç¡Á½öfP€#S:ªt{ï1 O畍ÒX^¡M"õ7çßp:<§¹_²¯|¾Ë>L–lk§Ë—˹Ïçk qÁébŽR ž›H+$ L/¯¾H‡+Düa­§Å¯dµÓ%l„Å){Ý:í´7ZÑÀ”Ñ9ñ¤i°ûYÃ…›Øn¤5ÊèUÕmýpfÅ¡1`‡K­åfE²Ó‰”ü~¨u ~ÀM£€Lü»`š$IÚ6²,\;ÃØ Òa½+¦ÏÇ°?GTAÓbÞZL։:®„4MÂ8Øy¡H%£‚Ú^ñ¼¦ —\‚Ü x*ËÈT òÌ]VÎÅDÌ +øô†´è¬¨H.[fõ–W'ø ¦)hvq!:wâ#ÀԌÊ,K÷@€û(³fu֌Að­yí;!¥ŠÕ@\j#4G”b# .a»28µÛ +CòDvp<ȦÑ{%þ¨:ðšƒè?±Üà=í¹‰(•yá`¤ø~ÿØ<_„x˜¤,•jÎç&¯ò ^ˆ5û®œ™/Öüðf `Eúî¶ä.vðfíǦ?FX=+˝[Ό^)zRÄC$ §««/ÓzύЃ«Â®q»Íú“¤Óék:-VdìrÅQ˨¶¶ƒ/Û(ìkw»š„„›¿ä«Ü­8x5UW»šŽPˆ´ã»š©¬±Á‰÷´Óô‘]y™IçØwtJáA:œ{p«æ˜?{8ÛoiãTÊW®8ČÕÒ¸„Ú‹rd”B®%°?}øµù×Bª:*Õ¬­ÓµízÍb²²ßޔ°1#„(tWªÑŽ“.ŠÜX^iñ]ԆšÇj½Cx²Ã*F¶Épk€Ë†M_‚AÅp3¾ eñ…YO ß8 ‘q(à§Ñ¹ Q@} I¤¾,}ðÀ´Þ@ë §þöþµH•ªÜÓ 1y#D÷y3Ó°U3lÆ ´$7‡|Á[ÄޜÑÈ생7Ò5Ïî$ ñachI0£Æ¸m*±!£äûº„; Ž;ëŒP‹ÓHºÑòõ ×|u®& ‡€óØ/<ž’*ªpu Î…W`¬Y­#÷õ½a¯ì׎»gkº¹’T5b°X(¡x™ÕB† ‚ì1š·ÄQ68”]‹^HŲ֏uS­ðߐòݔگuùjï+Þµ)ùVKû5k™m°‹ÅÛg¼Ä,²`Ö`VŒŒxʂ’œˆzF /•èύ¿×.K?i앝“ÂÑi0ڃGþK(¯€¯&ˆ|†»˜0±Ú7Ÿ¡XAùÜ Sa8!» —´“4‘D(sãÙK_àìŽæ…ŸCÔ1Nól°`úþc~sIAÒÞ²”ØpŽQ8èÆà°JKgºóŒPʎÆðð3ØÉä)«Â1W…¾i[ŒI{úù€ÇjD.‚òIµ5jâ—W|/T3p¡ƒÖ>ÞÜhyÿgÐeÙ(›µÎAŽ¡þ ÿÝúÒK†”–ãDæ_‘ÖGO„ìWDäÉä#°­}ÿ€*ñ%€— &ü+2¿ ùXâ×OIS þÕÀ™’`T …ìûJ¤@Qf7@{Ûaâ6b·¤0i*Ú +?ÓNt¾;ÌñÝ~×±¸~Ru0©è¤v_‘ûª—–#ò¯ÉPÿŸó69@ÀèѺ‰00v-Œ˜€±xÈ)¼¤ÀÖ¢ù´Ù$Œ tU‘ùpÖYˆ|€ïÆäÒZ$ßÁ ’*uððUÓqJùÈ¥£é6<“ØeÓs ¬ý¤žª_ HK O¢ªè£nj '„*JôIB`Ç7d„@SŠ öÜò{ÔÚ#½ h/€“6á äý²&¡ïUºx5±J´Ävo™-éðw ÆՄ[V0ÞppMÎåö!kLN fq•í¼»¬;ƒL¢WPêq {|½7‰ g’,Øî‰ÉÚ$Ô¼¤ùFòyêÖùؓƒÞQR‡L¢nY$×$¢ìU/"€»’8­çQò¯öºÙd\5)P\Vãæ{Utú¼«&Ã@Ë\õB˧KèAãn«}rçaR¥»kIïOÒ×åøI¸×„D˜J‘R5!m°JƒfjB†®ñ¿RÀM“& ²%À)FÜíQbà̪ ²=b­Ï¨D“(Ðb¨w¶v c1Lº–iµM VÆ/Ž*, J«¯óÆå<Õ!*ߔï›Mèÿ1™»Lè±)UŸ#Òµ‡ï[t±Sÿ¤ÅÙZÄÏ56.!@¿´ +[[#"sµ´]Ðv¯±6Ț·md¡§‹[ìáM^!Bò&Ôeå”GÏ|es$ÿH¯š¯€ëGsÝ¢ÀyV¸»È’”¨€pqåÎVÙf7ږTŠß,´Ú”yÐ`aRvIx²‹Ê]Z ºç¥ÚC¦QŸ4&Š$êM7¬%!wϲ²7p[l"¢T &êH ƒ¤ˆ"ëˆgúŠj…o(TûÞ"jûR;2ƒæÉ(D×nRçVòI—U¢ññû3E[÷©kPÉҘބìtÀw +±f¸ô]kÚ Ý-¸·Å€’ Âà‰5Ր\7¹qìHŸ$¼¶ $Žº• ÄZ[~›‹ªa.Oáì_¹÷S{AkndWMõ¶ßpÁÙ,J2zÔrŽÅ|»Äµ3ãýu«þ' ž·_“+ԋÄK Oi®úúîñÎ ´$Ô#×ØìÃäzÜµVnÓ+ª? ?ò!0‚R…ºPx‡£W!ÌËÌöŸ‘¢ÁâYJ$K÷¤‚ ®Ââ1:È+ac¦XY\+}¹µÚþZÉZ‘¡R.Ï-µi\`豊†šQ•4†£ž„ÿMwn¬ÿµÄ~˜ú™ŸŒ¨&uJp¥Â¯/S ,½,ŸÕ ÎrV]k:m«°–ªÓ%S!¦jªþ¿Ÿ)[ˆ>ÇÅk©²Ö¶`åÒ²ZÄÐ}iÕÒ°ü¢–‰h™™™e[ìˆFº -tÚoËòBß_ C (°`&y¨Ä]+@QspÒp@‰„âñh˜^ö( +œThˆlxˆ€6IÄQb‚(Œ!e ¥«‰þÖrnÜ«ÖVDˆúâÕ°=kÉìt¬E‹¯—2QÊ©© …ï½AT)¾_é>¡[übP0O_t½Ò:MF{`¹Øð‰a/œ\1 ,¥ñ,³4Öq„ …šßè•釢±Õh‰Ž§(3ìH ‡Òƒk¬預ü$¹˜ž2¨ÿ«›|Y_NEÄË` )«¸ò Ë°ä—륹âÛ¡ÆW,žÚE÷Œ»”퀢K³èÊ@ÔXF4QϪ*E[Ä ôfâý"sUB0UèÐù+ÎT0æVtaH3)#VBBe +/«óO; ƒò‘#<¦t‘”¿ºX+4ð(?×q¯ä#«1ú»8ï¾p +t§éä3ÒúžBˆd½ð7l×CÝn:®ƒÒi¶æ ¶jµ2€Քo¾wŽu+µ£ÌíEÊ`#¶ ÝÁŠ +POXØ®«j%6þ5 v²J6BœµIʕ®ZYR’=aÃÄ)y¦»HÿŠú͜áý¨õåýÔ³yG”ÆŒÐù$X´Y!z‰|Ʉè0äw%Û''U9ÀšÀíp†´˜I](ðVc{cM‘Â+€+l~4ObWGO/3ä¼£ãW[,ّVÀ‡Éá˒žÁPƒ°æ#Žõ›¢N=¢+N–3]û8µ&Zª›KÄ6}ÎÎ…ïŠÑ6i9[¤(¢šæÞ»ttxµ2¤a·9/àalãeFË8\³ÖYVd*üÒ 8ŠLÅÒmy\nN!Kì2 ñV'(ªu՝ëß©¶¥3֘áR—䧣.ZScµÙs øérß+.փòxårä]ÙÛÖU3ú¥%–±ÓJÛušóNZœ#Œ´/®õÑÆ1ípÜkѶ®f‘hq]P•ID2µç nÛTqíîÌ9r¥¿Îös̉âÔq!…fµ'5ÂËíz]V¦°V®|²süKœ!Fï¹ ÈõzRé¦̼qPRTbÝ3éÄ?`É ˜,çðzÁUAŠ±(…)lP^_œw²@ߦ’²×qQ¼ó†pßã.V1JX—»àÚ|=köÂUJMþ|\ õ4†#èÌ_qŠLùÖk9³%®©  4ø½>/tÐWºcᝥ–& å}z.:,ê×X7åYÀûÑÀïH€ ÐÑïJ] ùk”—ö4²ûº¬$¹PVìA`Pnˆð@(ÇBcb‘H…<6ÊeGîÒsŽÒíÒõ Ov“Á_х¢íñ-2ª¨§ë±ŒS¾I P]›\—Êõ»Áô©5ÿkÒ͙1iÒ jDwêÒܜ:,“?ä†Ç$(ÙÂÄiDԀ\û›ü¢ÒöBèD[~*ž¤÷)šd6Ò¡;ž$Há"ÔOÉOW%­[$ ¦:ùÆéˆ= Ig’#PȗˆÜ;öö#Ý-KL¡›(;¸}D×**n¸5íÂæȊoxnD·G³ô1H,3“Ê”X‘ïkdkhrFšP­ÆÈ1®NՎ7Ùz¹…\Lù âRˆ\ΗµÊB>\”Ñ ”tĆô~¨2dNÚ»­þgT!sF 6B“B|𯉐uÖîAh hwƒt}-NuAzˏGâáÌ¤Û +ñðÒSmr¹ÛúÑ/í¾©ñ!ÂK!Z71^cÆ" IÀÏs<Ñx: „¶=ºª§ ëÑ ‹¥‡ÓyV&„ôÏCSJ[–‡&,²”²?$ç9a’í†ÇÄÀ$=ÎhýFãSÝY+¡Þœ7À‹ÜÜ)Cՙ„ÆX\8ÇVPSi³Ã]*.·Aövô‚¯nu;q(ĝqÝ8O:œ1czœoŽ9—,þÏú}‹ípÁ;d t;µjšB"ó0ÿ›P\Í-ôÈ +©«,S ‘Ð~¤—Ëý§y’3dˆ£äGч¼úÃÈɗ9É»\¡2\ºŠïIŒ{ÐÇÑ1ð gk¢B S•ð!°X¯ +Sa„³ÝFøBiæZëº ô.#lO|2/œ;°³lŠíÚWÑ»7Ñ!£àæ7&lÆïÆ×G~¥éÛsEƒëTÍõà“>À„ +>•®á°’yœŠ +çsYJÍ$[ã¸È±õö­Ð8ñ÷áD~ь¤xÌ>½¾/ÎQ°gN…¼£ÂnüyF[쌉|Ù¸z¬r1VÚ n1WO¢d­eJ`TÉÿ²†á—–[F´ˆ4PÀ ¹±ù ['£V2³ãþ ðgÏ¥¦š½·ÈÌ™¾²çd¶š]øž£Kå_.Äm°©V$L²6˜[Ñ° ÈZ„¼MZ¾HS:.Š©ö³3 ±y<#aµZ|LÕ`¥ÍçSœú¿Eœh ±ÒÚaŠ4ÈOü¸bjG—)Äçr x$'”¡aÓ²ó§x¤ÅŠZHÞ¤ú]…Þ ´_%²á² Ŧ$ºñþýq åJ»Á31îð¶*â\h뫕 ¨B͹&ÇïU«È9jÅ܈Ih‰;—¾×„„Û^Ç ›œJ6÷gÖõqÀ†_=Œ5ú¸N{¤áFMPºeÖ ÂyìÔÊ$oHN©5q@¯bQy-ᢲ¢\‡'‰"A02•rŽBӆ± ÷ Í?¢š‚p óóÛÀOvMé‘DZïuæ3R揍´%NcÛSˆê»v%¼-bÞ]Š™C–¢8±7—±„gôÝ­.[;.,ùìa(47³Ù˜È•²q7”¦þa§ZÍS܃ө¯¢B"¶D›±fÖ¿ ´`O“Z ÄƒÑf‡]Œ7=Äíwõ’ …za…Y}]åÁhå֋Äîyf´Ü½šbَô#>@\éîdæiäGéîHm‡v ¿e“e#1Å×I/H +áÆ@"ÍX½±ÀÎNUÝ Ã¿|á/²yDf[ـƒ{$^.àæ~^¤Eß®~ VïÕå-›¾N[qX›Žâ<é&îóóÒÓ¤zÄlbÖ¬¬+ƒBžD9JГõ†H.7l'ßpÚ6†+ijAv@ÝNju¡°R-ÞâìR4ꦵÁ=œáDýà©TF„ý±˜Œ3Ÿ)h/ŒÒb^äKŒ€¯ää^âx›(Þv]l«Åô¸v>Ú³pHNYõ‚ÏŸ®NHHEúÒrì4öm#"(`Òµ¥p‰é#5Cø/0Ù'ð •àÐÉlÛZX1½Ö1§6_¦ò¿5i ܃Õ𺝥‚A[„aɋY\™: ¬ó{ ;óGÏ_ٟ¡g»ÎðêJà½Ø©d¼W~TÝ>ŒQ‚Ì®&ÁËÿ3%D÷åàVçJaàn"ä ä5¢+\N\ÁB£aµ/´a®÷>ßÊ ñ‘ôà‚wÃÚuU/’Ä)Ð^aöÀ/tYÁ`0¿´ìÌÏîeaç0æÝxŸ,?á}³ìuµï¶*¨Ù{À©ðK¶£‚ÿ q½ú OaÉ{‘›‚ñ”xn4™ä8>…BĬ(Tsèh(P²\€É/i¿Ÿ) B?ÉÝ9JO.áXÇàLðFÏÐ3uL¨"R*¹K6†€3I8e$¼x´aËHÎMüÀ|açs~´qð˜×^õLw8çÓsááÏfÈ1Å;Šf’ò7f&<¾AP}KCxmàg;E»ˆå ²ÛÂ)½ËRS„ÃĄ×òÿ`ٍ" Ü£âEÀùúHÄe½kbÀÈH/‰ª?ÓAà}€KÒP—§B.9uRüo¶¤‡”ʾ4Ç 9ŠK9O/Ä8ïI"¨|Í¿Qü÷‚ÔÙ ‚×IªÞéV °=W8­IO÷SƒÑ€í7Ô<¬I3³î¹‚³e ß¼•&¶D44fÓïþz¤BPÝOŽ`Յ|\¸1¨‘òTp¢ +„î +¬Å÷5 âv½ ¢¡0¯"ßüÀii%-™†ñ®«€?‘T€k¥ d«½rsý ¢ºð™õ&0¥š=Bb èñ€hºT‚~ ²fà¯KDH†óú/?û¡n™Cìk¿ÀÂ&HìŒ\ õê! œqA¿ìž½`þ­?I\ž Bÿ8 &åèO´´ÿÑÂؐè½;är”/è ÓÌsØ?â7‚öô$¹`rë³!D²¡" è*ƒnÇ)­íj䀹3ŠX`mµ ` p§-$'þü¥×µcÙgÁå" Ü¼ׇ߂Çq½£°~9š¬!Œö!pG²u’â4"ˆq¦FðƁý?/òµâCN½vw>Â5·x™$¹ì ·g™ lR ‰x£µÈ=oYā!"/×òsÐôvFAc`»¯‘µlIÙ-(ü׏ÚE•ÝA ÄvaÖÉ{&üñ¿Œ>ÃìVú™çþ[_…Dåmdº÷´…‘ŠBÅ?Jûã~L·Ä;£XªAg¢O¦9…ž˜â„evA7]ŒU8‰ž- B?TJ†ÂMI o° ˲¢WåQ„‰À"ä9@Û\Ï<ñÈqÈ‚!'‚/G3NÆ?ŽWWƒš¶¡âÎ(Èˉ˯¹þd—!dü)_ÌäCð䈔é:/0úçBž'‘T«æéàJ¬Ð}gŽn`Lۆ>wFá¶4\ÊÎ +R7$õM½övFá(æIvHíN°šåx™¹é°3 +Ó\ð’3ãڔ>Êâ”-¼ê6!ޗ—UÖr'âSVüX:8¾‡¸D— àb ­Q~ÕWw” +_¥£r‘à¢WL2IdØ ËÁ—Pò (ýuŠ|@ù×NÄß ñÊ|ÆþÙ8þ/eDæ·ö¢Ñj|´/¡up…?ေ‡ÛÅñQ._ÓÅZ ÇŒ/%—~ƒàE(ôs¾þ>÷»¥º‘-\*œ¦N.0DÈÈ86µÇ\¬§ajöú°m›=ú°‡ ŨëÍDáT‘%ˆƒ×îG ™0¹ÄÑqÔwe©(ߞ^"z9ٍ֍ä ʋÀx ¨÷²Ü·Àè‘OÙ¦Ä%?2G$JT«—Á >¤ñ£éããÂ웷*i=LQ!„ížbÝW>¤àÃv¼7ÈhþúdÙQnýž!¦!nµ E÷™ŒûGüÓÅ6ÓYíºµvëwi‰œÂUõ/ªn³s½T Órq®9‡q¾-ÓÄ1SH‹Gń nU…„a‰ÓÉnâz,‘¢œmš +ÉéÛW ¢ +yºžgô +h¹]èdnž9!܈ ÎCPY£)N‰ÌC²_ØҒŒ5 +Z-Cœ»y%zž‚xÛ¾8Ý@KA¬ß4/(¨“¸¨ä¾,ˆÕM“±à5Y/¤³É'íáqØTJiž0'œD)gÓ¢²ŠP¬Á[ÿ·Ü€6ªhÞ¹/¦‘Ʊ>hR”¹4øJõgó…Ì{\¦¢/¦’ ™‚E´P  ·Af‹…½|Â6ŽNÎ ^JZÖÜ@ÂZ«ÏÊsه( ¬K%*‹W‡»Ë~©8ÀÅçúðšý·þäθWm8”ÚT/ïÅ›‡èirò´¼A¿q±!¯YgáæEÓ÷p,G*×G@ŽÅÎ挠ø²úÄÏà™  ~—7sß]ð’õûŸØ‘óå`uÆ{ڞ5”éÀv/{¯‘_¬öTúÿ1ó]øšEã"¡q”jh øœYñgݤlq´ÉàøZm‡X‘‚×þÖHz‚àƙEÇ?ƒe)6#-`îBÉDàÐX…Ÿ÷;S¾à§Ük^Ÿy@›Šíøö3SÀÁiC&JfÂÏ5¼‹a($KÈD±Ÿ;ø6sV´!䬗ÉÒÝFTQ^$j¼ÑàJ(Óm¼ngOLå&»páPÜH XÉDø ¢¢Pûõ¤g¦À6L2?U¾§ ó3æqˆ.vpáÃê%¦< ¸Í +bÑ-–lÊÖ«Ía¾Äò1ò1 Œ*°ÈÁàa1ç'¯:g¢ä\Ip’¿¦ñeI=þg¢ 8=¨ŠmP$ƒôÐ×i° ¥âúD5Úg¢ˆ±°…[~Zՙ(j² +F*þ3QPŒÎ¥Z\,ˆÀŸ“ðJ༟ÁÓeA¸ä⭉bõ\1n‹XCZ°P˜5͒'.¬Íxë#ôÀLL'j tx%SÞëõࣁ;›þM”‰äyS͉o¢düNù”ìFµ$ÊiÈ4º´L^>è “Š6ÆIµðM¡É<´——zAR}Y ï²Æû/bßj œë20Ê¥÷ÿ5ßD‘¥(_ÞDÉß‘ÜœóÜ0\ÄÕ[Â7QX —Ìx2˜w·îÄB·êñáƒ(@D:qÒuŒÑûN/AÏv?±l…ÄÆ3¬<è:Ä(•»,Ž`§£ß["ÂË0"0‹0§È/0Ñiãge"±( ψÌ*ûf± ™ÑÔ"¨"c>Å ¸NÑ<Ä(²(ð0ภcLTŒ2fˆ¨ !ãEà»< cT•|«€·G„kj}b+†ëDžÇ¥bŒgƒ¼Ü Ã`ˆjW–¤bà¥óôApq—€ßL`³ÉÈyu7™0lã¾4u^ö”À‡‘[5lé" `ž–Ö¬F·ØlW©çL´ë‡À¥\d…‘Itj4’4*Œ[g +ƒTÚ^¿ÆAHaÀ‹Qû\ç¾Da ½Á¨a&(Œ„·g’Ž"‚' ÅÜ&ë,ZCTÝ`ԇa“ÇE¤yŠpNQøV«1§Žïƒd¾¸¥¿IZ0î +=¦ÜâÁè è‹VÁžë‘ˆFŠOǨÉ,”ýc  ÈˆâaBƒh˜ÑVŒòGthBÝN‘Þïs ו‚Á˜?P&G—À ÆQnyÉ©ØÈä‚qL]ý{|Z0ð™°:ÌÉ% øª[+žœ¾o1ø.ômñ~·XšŽvð}(ÉI¢Wç•H Œ/ÇƉŒ&J¹ÖK˜ËéÔ?;}Qˆ´(Ez¤1Fãj X©Eª Œº º )Å7Z~» Àà呯&:L`8(éïˆ"0Hb²_?þ/ìKà0l ,ŒÛ±ý`,kÀÐ 噧þépÐb50Š/fj AŠ%nœ$Gm¹r„§[Ù_ŒzÕ$mÞ,Ð7™éÀWø‹í‡ýØkýâá°ö/<.äÝ…ô‹\i ˜SF¿~^șš·»‹"î`¨„~r,CBýEŠDlÆüEIdè C~é'z‹_Ja¦¾q»Xho#˜R¿XšQFºF€Hçýs[-½Ý9¾àD”_ÔEk8ðÓ B£+²×™W}‘B }r¢¾/N£Èܯ/ЋÐ^!"ö¦î‹YϋÁ8î ñ;ô¬`7~6åw<ir¦]_ܼ!Ö þg3ÂàcD¤úbœQ?EHlUñ ê @9s Ž†m;Œ¯FC;´’gÁ{Q+,•ËÈú§¨ϐ™I¾ `V*žÑźˆ“Eñzf¤‘û”½Ø>­%|!¥i›à‹cR l@Jaä>Q¢8‹ÈïÅoÆ·}|/ ÜÄl”îE7*ˆø|xÀ–µíÕr/Œ'nT£qA.¸h*l3Q·xÍ +KíùIuÒäã'ëk>ÙG?­${¾Å!Pì,Óý<8 endstream endobj 116 0 obj <>stream +ìEː»üX¯j@„1¸È ·P«Ú–N?oM@ $°e‚ ‚bzñ™¬­@d/"é…RÉ£@ËC4ÌV4ž"äb¯Âó¢`tyF2p¶ ¡³tqtäÐø–æÅô3u;¬e^¸èA˜uTryÑâ.:nÀ!ÝwD±Ê ÜcÌÕ>ڜ”Ä®±,R£N%dˆå'gF˜@HŒñ"UfGZ¼äL'ql‚PFer ! ñâ´5pj=êüºÇ ë‹ àð„*—àžâ‚!~J¾d*ðâk(îº+kÇà…kºg«Päìï$=T>ñµØ¯xlyÈpQ+qvC·ø(Tå]„ÓÂňÅöàâÖDHЫˆŽÖñ`pÂmÀ#–,:ªxo.lkDDËL¹]¦2_·fh‹Øø6%Ká¥âtg1ÃÀ.’¾š”ÓoDn'àµm:·‹jVyjãâ1¨‘àˆaŠûy·q†?Á!dXFbd*BaW“b¨ G_ñ_fèqÑ7ËtÑÛ #',4šÂ¥ ç‡>ƒ> ¯p¦h=ªE0ÜÀ]ä  ŽHu“£ o«ðm¬o ¾2š¯¸”øL]œœCÞ3ŸåıÙ:?¾Ð +]$¤-ЪÓA!-JߙzVôÙW¯Àôm³¼'˅÷¼äá¨0sFoÚïÇr!ÑìØôlý^=Ób aÑì\Ð@ThüÓ8 - +=]Ütȯ ¢¢‹Ü™€XaCt¡Ù¨Xë2Í3_“2æh¬‚.ðkª`tábÐ58&ÒÏzƇ^ \>É-bkð çâîy§MD7°á¨6;5R‚ãF[ÜÍ\Œµˆ ‹|0‰!ŒBÌn æâ:€D,[$àå"wLèÒh…ÀAÁg ç.Ì稩dõc±”‹ÉèÙ篓‹b„Š ^³ ä‚Özâbów#•9%‡Ž‹W`°"Xuhx®JWŸ=h­×\!ƒÙþ«ÑB¨¡Ô=¸øΛ^Éåè9¤Ùaª…k@ÄE½¯g^]Ðþ-nGl?PÞ ëµÞ".jS±-zÈR“(•<–3¬»5h.6~ÔÖt.Ô(~!'Þd^ôÛ¿ECÖ&ÏQÖ5Z`—yö-Ì„ª #ßO·#9˜6| Û*D8/¿7h«™¦gc³·03¸ Ó+û@¹…j%8{¢¶H撔’×f·…¯¹}‹Ýbf¤Pð9©[4ޝڶ…a¾àë1"ŸŸ¶PxÉÜÂhrh[[ü‹Qop:êNÕÂfÏíÆ-æI©6ÓãÓFC x›7[p„n¡Ð–-œ6&èd ÎûC@wbh)åÆïg •¨¶p§âDMÅ"~“dl,áKQ+㤤tëA[ÔÞ`¶xNÈ ­R“e‹ƒPÚ=”-ÎN³Äûf1TC¨“ƒˆ-þMÜÓ°EôÄͬ8V¤i‹µjGx"l‘ x„Š‚-îZ„®%'w€-âñ,°`5¿ðµàËà+bžY×¢š­jAi¸,ÉC>øX1ç˜îO˜IÞ19ÿº³i´•Û òëtúT‚µ8Gže5‚èeÊ58+ƒÞ"<ßï°¡²›£ÅãNëfa+_æ‡*3ÝÙÊE@R š+8©÷Þ²o”£ÅE‘œ“ܪÅئBkm8¤o FÐÌXÁÀ©þ ¿Ìâa+qÀS¾üÒñQc¬Å÷²yA&Ô⩕’ÉDW ÖWˆã©ÓµPðmÕ08-òA y-Á*ÌdÓ:×Ù;š ïÓH,,¬™zÿ0{ª¨Û½šAŠ´°`Ac‘ùfkí³p2OÕUN=¯ò{9 ;5sžJðNâ†jUy¼Hka@W2sçÃ2-²$Ë|ñò‘¢ÅðÄa„ÿ$€Ô¥Óˆ… ¸W€xh14°â¢ìƒî+rÖ‚”ì+ +‡v·éU_Qख़@#úŠøs>gYæ+¼ú”ÿ§äàˆ|Å=G"ÉV¼_áÒþoà¬W ÷üDê4B Q‹‰_L°Ž‚ +—³2¦A¾ƒ^áÆ<óUð%*˜Wð¢]B©‘W45µRq}’‰Vm tÅmp©‹úÊ¡`®Ð!DpW|±ÑÙ©W4 +²f!\<¢É®€þŒ±U¡Ð^LÃeY‡WàˆfY㉐nÇbéþk(©%z½ØeÇ[ÑO„£§'>‡“¶Q®ˆ£—pe\­î6S )®˜ V¬1ë0)@#iÅ£äÙgX!ÙþÅÌ*"H+*F™ÎvúHB…›†ó–*ÌòËöÝW´+º¼ÐH{½ùã ñV@õIñ)ÃnEnt+·ÖC&ʯøKZ12cûъY-ç‡<£‚lE Ó#×Za*[á&+؝Š ‹G›öFÇÛ"à P>#‚N+™§ëèJ+ ôIn´Â¤ÙmU·d0/¡=E sŒé³ÂGã†E›§‰dY²þÿA“Ž'Ί '˜Í +‹5EOæ‰XAF~GÁHâ²Â"ÍaE„Ïà`8¯ª˜ªÚák9;?À0%ŽP¨Ý`ݦ +!²4; 6ö…¾ +¬=”Ø åuëÛ½Š=Î[”¼}®"™bÅçÇYrÞðKá?Îw>'ôœp…I7…ùeJu梊²w­‹¢@„°¢-­Â0¡RGñdq€©ÁŠÔªÿaM°"y‘e֚Û*d®T©ûÂV±¥¶W!êÞ1æ #¯'ÌGí;wPÍU8ĄU”ÆßX ïÀ*À¹•îðˆ×¬«ˆ…¶Uñ…ídÎAg[PÑÆl*ë.*”(*«€EÁPٗ†Pd5”¥„\š©Blôlž*jyöü÷)ꨘ* +Ís\Í ÅïW¡¼úu»cQREûF:a,i°*ކëeåÀwU£&wþÄͪ"ßXËA +¨ª +í³–~uñU…zÉÀօá>EòÅ+-ìøÆËÚíj#qB’ã©:|p*´Ç Yü N £BP bŠSDŸ:Ùêô—Á2䨂HyØPmRgü¼Áç©B@Ž¤X*ôÆz¤ÃÂãþý™RbŒŸÚº@Š¿ŸÎ>…ëyöÞZ$|Ì]Àe¡OQd÷ ³ø²&Í]Š~ +åÑLM»q£ó:Ê+.¾Óð¢jLõâÈ,Q+|ìW¤‚SF¥Â¢"D€±G{CðhfŽ{üfÜû€l&¶Î՗KE}[ +gÖ^¤€ˆ›Z'Êú#]z™Yj¼YW:˲ZÔ¨¨¤ª½Eù8©[‚ÙǤ¢yš®¤ânÒ䒂EvVúŠºÍH¡ b|¦ízuahþ‹Bcˆ£½\6*ž|î˜J$ï{Í[Ä!(A1Ó§À»gkS<ޛ6üØ!Äð–EKè¸“n¨–ÛIýŒ‹ +8ê®ãÈ Q)=⠔°9ÀÐÌ,¢ÂS˜D…£7Ò* àPA…Ü¢ªÞÚ׳5E0Tx³ëSd +ø(øæB„{Sw$cw#¨@i¿vòª THS¤#`ºÜ ¤K "ziÏ¨i­*:üC%Æ (’Ée'©SÁod‘Íj†XY‹o:…nt‡¨òù »£â»pF6ÿ®F<òGìe Oq~[ú‰É³à)Rçq:í¶¥fÛæ2X} Fq<·Jhô|Û6…;E ýoÄ}¹Pz™¢ó4óe¥8ðXãçš ¹{Òœ¥{ÇU½ÈMÔý9•ÂÿxÁœ‚Ù€ÏìDšBÿþÕUáÄøX V8Å?9”TžpŠèz œb[0] ´[õM«Àè#ßêÔ;ä°WÈàåþ¡G\>Š‰½KÁºëžÐGž€}AÈ!\ß ¬¼Ò.–­Kђ㯚fOÅåmåšâc¶ÙCÏ1e²mfÛÂh$MaO®×ÂKMá|PtÓµ&h +]%…<¥SG뙂w÷Š^‚ -Ò×LS¤Øª?Ê`o%A\ â½T¿Q" Ÿô^C`«×a~ö?û ,‹½Nºà²T½“Qd‹ñ ãÂ×ÕüfüQ¾Ï#レ©|Ÿ®;µ'& ÿþ„] +cÑnÓ)Źn% k.j)ö0)–þóm^;)–âµÅ«Ñ,EÚË0ášc-Y +-è€/‰X +/ó.(¢Îa°å ©U³N0C)h”Œ•`†]TrhëôÙÁÅ×E2&$K&ӄ˜Öjö‡l0Š: ¼W78§¿›^û¤X +*ó¯l÷å¥Âã}&ZŒ¾; +¾ÞÅÚIÿ2ðŽq8•%E9d˜¨…,õsÝ,¬ÿju<ŠîQ½ˆGŠ¶fCc®),tfŒýß4)N+€Éo­ÄöL?ÔQŒùˆAF!¤¨I£¨9If³y›ŠÑAp™ùSW>]jL¡ôQ «˜GXÓø5[‚þ‘“kˆ}Ú@‘Fá'sG±ü Þn¢ñÊÉÛ[ãYÍQ‹Vky†ë‘£Àè Š›ÙtuSʼnÙD̸ì|0eË&~Ž• ªDü%ø'àötÖ֛;£P¬¾D3D®{)£0K+· +£¸_ÿ{°…Ã! +ŸŠõé~¦q@p¢ îí>åýÙãûœ$±NpÓûPLŸh¡Ø‚<º(j©)À;Ó)‹âe­!ù@Á¢01ƒ"N™¸5J×ÅéßM aƒ¬( šØ%Ì 4»Ö½ñ†Ð&ð0@E'/0Qìø]ª£u(–4P@¢€YãèR6»¥ˆBg82Ùä4Šƒ˜Aý@ >‹b„p͒ÅAQ̝{ãÞþºŸ$:¦Aál®Ç»x_–!4â’U@ÄLÊõ,(˜n4b + +âì O@3-í— ìÑ­<`žê€ ‚"+ÿ ¸db/éQGñ/šÍ2ŒËÉP(´\8šÚÀ K‚ÓW…,~~¢!#@AðŒs¿ø.6hNW¶Äª8gè°g­LãŸ{sZÇ©*Gî4ó³>áF†ÁŸèÇ?'fû “ÿ +“”_'¿õ™Ÿ0&ù‰vkZݶŸ@—ôƒŸðŠx™èù0tOüÓN“ˆßHÅ>))ܦ+ˆ?YùÅæ*1\mwþ=–¸S”\!AãÓ½ÁI|'Á³‰Œžð—ÊØ2ö=1Ÿ‹/ɋ—xO ¸XV÷Ä}oDïÇòpO¬rN¤ž ¿ÁMÑì”ƽ0CCFÌ`ºžPÎ7ó–jr›ê b®kA##à(°˜ž8[Òdߢ'ÜJÀÁ‰ ~¼Ÿ‰5Ðñ%ªãÑÁÐÆSZʜ8`O@ªy‰á­v‚Ê´úù$ö宀Þ,L‚9,ô…¡Oÿ·Á &ißdîÐõ?á ˆîí0'žy<9Eá+óu¢481=Êw¾HÜ5Ú¤èæ0@›G”;Av<íH>Üb%ôv;ñ€Ž +ÂvB¾rB<ùÑê@ƒÂˆ‘Q;«‚½DVt¢æ°ÛŸ¸,A'P``°m&vOâÌ(†~¸©Ç® fD΢yub·Ð¦¨aN˜?L'ü ʉmM’"p¸?yº.¡}CºúQÑçDPÃ2½ÌŠ)¨×9ñÍnÇ3áN„øŠË_œ¸ôãH\N, Nì +¨˜h¸ hBÔÃpâQ‘5Àn"{zBy5¡0úýGLå„-苵%ŒÜË·) r}݀ź0'¼Ñ ô*ðàxï7ÁPžP’šPÐÞLòVr`Ä^A¡˜|›HDԄ}+9-Ñé%Aî Òë‡~ +'訇BÝnX¯qgéQ‘ܝ’N¤ßŸÖߘۄV ¿‰U÷{Z>£7"™³›8 +ÏÛèì٘M´jäWÙDK0D¦Íïn¢>6kèâ&x„¡Ðà÷ÀM€~¸=ÔY @gn¸~_î—HÈq +þ™™1•Ù.­#ga™K:¨&>͛؂!ÇJ úD ¢n"ÿr†” äÔ ?^Œ‹MLižZ8IÐCk"WpIµxH3œ³_°nHÙ6õT{ƒcÞ-AM„ýnÉâY/ ùL˜êç•R)MüAH?à •4QxKÿòŸ4˜å +ÎÁö1 c¦'œ™\@ò’¤©—É\7K «ÂDª´ÊcžUF§¤è€ˆõ ´2ÿŠðȅ™¸¯2A Ș8)a¨:!ÔÊ!óÅ ¹Ú t€0?çÀÕÿCCjËg¢&p¸ñ„r3ᨌ†·õÀ%ÉÄR9 +š™ Ðe%l’ž˜ a*4æÎú`&ªò&‰,oes ¬* ‹T&¶âÛyÐYÞNf‰@™ð<ý*uÁMӂB›í—<é%¢¦ó¼¡EÒd"Gb^ô”)ÀąàÚ¸„„;?ÕÅç1ñ6æ@â+:péÁëuY÷a¢¯[ú҉ÝVJm&1‰OåTüŒÜZ‡öìLð”Ɉ¯eE¨Õó(8ž+ꀊ¨¬?ŽIL ‚3åaížá%æõփªØÄÞs_ÖXÃÄg/¡ÚGâG&ÔÆqė»"ëµãT©å`ALüzáäU–OÁÂ×2'ÃD0ç;œ`€=Zb³qd¬[&áñK؃_—¨2ÔèK|/RÌo€¡3ª\ù¤Y̜½ÄW!;X ӏ¼ÄåtûÙR°˜ a×Z¢D¡+q|r•©FÛ¡jТ¯±à³ɖ ïåÝ$X`%X§)¢²$‰Fæ?rŒrõ˜·Á5mot3Ê +L H˜>$K`H öãN”èâ1á䱄°B÷ŠUʹDͱ„*MBñTBÆ:Ó[$Ÿ˜K ƒ߸Ä}þ´½IcÄ%¾_a}ÜÖfæÏm8 o‰sW­}f‰ã#n ÏL‰¶A²¶§>Ú–¬ ɖÐÛֆg’¶DØq8×°Éák‰½¿½Ñæå` u‰“™Ò™2å,* ibGÖé 0KP*µDŒ½GÍ–²~“@¿nj¸Ø˲ÄÿŒ¸œ™#HŠ2èÍ$ï#Þåþ WGÜÔJDP*;¥˜LQxÜ DPŽ møəæàNÒµ~Ü4z%bdOD¡ÌZóÒoƒ“D,ºT¢Å܄/ŸcÐøn6ØI…Ÿ³AÅð…ìj_,,ÈgˆŸ¯ÊLŒ'ÜÒ4iû”(ъ!ؾIlç²AœQB ²K¯bïô 'êD€00%Þ¥[Î'JpH‰XJ¨0k*‚6L+ë`¤"èßüÛ°F”øŒÀñ"(ÿ'A%h¡G‰¯kôéäÏÀrÞ¿èçiNÁíèpw÷e *Ø\ÍÙî +%~ú“JÔé; ÔhPâE(Ý&UT Ä:úwjɆµ? /ÃÓÌO²!,¨à$r¨&ÁÃh ôh‹0i™•¡`Ozw¸åU£lœ':2[/‰ÖékËO"y7S,aдu¶4‰’'=œ¾„&D\7«?ә3‰9#‰|¢H¸íH0“8Ē¸¯GسHhì”Ò1jÄó.0Ÿ “HՑB9I|>$mÒåKâ(Kúiz%¼$*o*G¥J4#Îz¹ÏAqJք¼aè>˒€ŽIŒ¸Üœ»*$$©MÃ_¥Z°$Âç·ÈwI_]I$fÓðˆm¼ï”DÇÓ°"FÂVæÛê[ÙVUkÑG>Ÿ ¨G" XE4#r¨° "í[»&Ý<™ TəV„"£ŸW§Ã‚‘À¯& ?Řr?oDÌóÛPò,\³P‘¨Ÿ2$ÄO(¸ ¤ñ(óa´÷]X×e`Äcá],§¤~¹A\#º-÷dpŒÈ–>¯_NS3纬¶4™Ýóä`±Ä{ï"üº¬”Ö4Œ°ûA–aç OBDCC;Ë÷Ɲ,u¡!¼Î‰ó”Š)|4€¤:— Ðt‚k|%h–tšJÀëññE‡8u@#Ð +E‡žÐ—#&åP 3-A¡X4ÉÐ#j6 É€¸¨ÉŒˆð´/çqû‹h”8ÔÅøð‹Ԍ6ø á:Eց8óµx¢ž2weÄFI]„€¬aæ0Eè"‘7A"CõÈ&tR$>¿" +U %}4/G˜ Š)mNuÁ¡uhãnŽ—'gÍõ +.h‘¥âTZ -yÏjHúMþ%8@5öLåzÞ+ºV§™¨ˆB ¦¦+‚â`< q)¢®¶"|½ »ÔnJþå”і´Ô¬ U"ÐCK‚«¢ÖU%dCÀ²ÔŠ"øŒEô"³"2áÆDŽht6-{™ˆ° ÷–—Þ¯?{ڃRÄOKíª‘Â^°b•ðŒ"ˆGQ/-V=΢'²q†"îtYPøÌO„QŒÙŽóWŒÕàñ ˆÈéO™Ø×Ðá½Ò†ºssZ"nÄ DGË¥HoÄBÌDh)Ü3n".T®‰ç6‚ U)ŒUeD«"bx ca`!0ޜš7t´a~AJÙXÐBHè!{{ F´Ô‡›Aˆå‹B©YÜ7ª47BtíˆÀä'G­Dtî¨D”zsˆ?‡”±í•d–¸9ÔB¨žL¹h›F;‚Y@U‰ˆ…˜H„3®E!¡ï!]×i]ŸÎG„3KÛ܏'2£×ÓiCÚ#g]eÿ1e7ÉIõF’3ƒ®°&ÕèÄ­ a ^_À9ráñí<Ø~oÈ¡SþHcß¡ñ8v´¤!¬ÏÌ?Ä:« ãBhð Ñ[½P4¨œ‡ÌçÄ ~¡>y†þÔêÊYe©ÙCBj&‹ˆÇMÉaµÄå4€(à 0ÛôBËÂâµ°\NüuµFºCKXO¯ › }ï¢|ˆýgHš3eháC¨mö̜®'èblá‰8{ˆ›û.ÂLo¨ù)ûPü@Âï,‘À‹ øÐÑKI˜Þ±=ÂëÝ·ÊY*`âÛÀ_e';–øY·Qæ *ÚýM æ0靗±œ!qˆóùÕn›pˆT¤BMԂc‚wlH/ÛJ¾!µÿDp,*!Xé´!ºò;Æ*°ô´“!â|¡ÓïBàÎvBÈ9#±C/ ÂÁ›åÊ¢@¨kˆºY6õoÆ®Žր¸\àCý/¤!G4ÄnS-h!V8*Ò¢ëà ¼Æð"2ˆEÏÐûê1eˆjgW1„]\>ïÊB”ÆIr5ã\Ñ €-Œ€!ʏLJÃBNâƒå…â^GnªBœš€.„c/A°qÙåBL~=ŒW-tCنE¨h! ²¨]G=¨»æÊ,ÄL"«ÀF)QSŒ$+ÇÀ@àÆAPJ’ÑKW¡ï¯ê¿”­­?¥mœ¯ +!øÐmŸƒˆC²%ES![©VeS…HŠ–7þ‡D*Š‡PþƒÐFbÈ(*¡u¥äiϑôÒ‰ŒŸ„Šâ¿45”º,$!º æ@ß²P|»ñ¼ +ÑÆNÉ´O…©ç[¡Æ;:!˜LVæ'†u ô­ˆÖäŸßˆbV¯:žIˆ¶–îò#¾ "!ˆŠ‹ªMƒ„xà8D%@À8‰ÂQf˜Ðû˜±ÂÓïý ³ó|,¨CtB§±$;Öó…BNÃÄJéÍ „0N¢ÔŽ1±ƒ7›ËÃ×»àCՑó:‰Ý^ŽKÅù1ÉûœÚÙXJäî^ˆÊJœ-ãœAH1áŒâ/u/Sq•*ÒkôĀA„¢ æ?P"©¼ÃVAàO Ôßá£ÁHýzÕ üykÿš‚¨Ç $ét.’RÆw¹!´/Ç'< ;ú|?$?,¶Uü~BP„‘º³“w‚¸„#"Ÿóm†èÀÊ£mc¤<îê3†f[0Fc훟¥*–:2Ȗ© .¯˜.b¥c÷› ÆÙlÍÄΆò4ùQÿx=AæwÇÙúº•ph¯*éÎëÐ$YJy/Çæåh«ˆ7D,M¡èðÛI>i$¹x Ôj Zҟ׀0ÔòD`1®ˆ†”6ÕP±³dj ıTž D¤KÎßW‹+á΋ˆÝˆüÆ „éC¾+È¢.Áiò°7Ý£à¶}»Öˆ(X Pív¿+U† +QLq6î ÄÞj•°XÝ#.Á^Þmhcy&~½Z‘"ÅL<ƒè< ø0¨ŠKr†RD°Y"í “2³€1n-. ªq³ªÀODs×òÐzDÀDH“€èæÙyØZ­ò’„{~0Ä´4áM ( 7ÛS֔û†—ˆ\›”éGÙtðg¯œbc¢Ðî¡fŸ–#atP7Ìv@}¾Pc†ëp_Ä>óÌÁÆGÅ6ù%\㟠ŒÂ¨éŠ­ý?$%98{Ò\mêá7nÃÚø+›ãÿ³÷26ÜÙĦÖêV>{aj„¦F¶Ø°N0Œ[ü‡vÓ©û€‡VÖ½ BOðã/TÙÐÝ0›,[)hJƒN堏~G¸G2$²a¸9t¤Å?d‡ÁT4‚Qð@HÆ;ô€mhƒ ö°U<ƒ b¦Ø[¯,:¼Gýa´Ø,‡@–‘v—íÿ™̜9²uÛõyCèzPƉ¿¾âÚùt† óZý*$Ύ(+¥=¸ÆòwšðÆH|LúÁçkÄÿ¥ýÐÃünÚ¹­ÔÈ~HÙÎ7xŒrÏtN-°Ò®ÈÊ]žeÕõC +ë‡FÆ@-&/ƒDÂú”ÏÓ5@?|øbŽ[òJz~p݇e]­?çì·ÂÆi@ˆ4¿]óÃô,IV™‡ÅØ2%XL/–ä Ò ¹—Á8¸ÕZü{û°‚|•.áŽT8ÍFܼˆ‹ ‘úÇ^¿·›Ô†킧x¾žaô>øÝ8± W`k@zº1/pÐ1% ÷CdM¡Ü>tñúZhv l8ßQ6s@ÇÕ>àí=ȌðPx¨û6ÝCfeä"ëÞ–ð(+ߥև‹N[W‡ãƒP:‡kÓ+Ô¿cõÁéTêT²a’øœ\êC¦ÊCÖ÷§äò!±HÇÙ]°%wa·ÒJ`:P¬`ýù©Iê áX¬®`ã"O7&n½#—A¥ø`9aúQœiê¹É¢Ë6NôL>Dn\tFVsfy ùP•{Œ'É»Ė$ˊ|p¿iÉRȇ×~ð4îÆV)ôýt©þ™Å‡+îeU®S|€ŽŒ˜-Á äl‰À*Ày„MÕÀ–CcZã ÛIÂ×ú±H¥þ†žnBd>úÝٚ7‚œÌf$†­Æ1[]wqÒµ×ôí<ŲEm߃×O7Ô~ÁCã*VWyf‡e ¹‚g,ˆöF%4G'˜xÁ­®+÷ÇRDÛaëá?ïÛqâ/†$\Á= ¸Kg´ùÎÕÃåxä°7‹A¤Àê!’DÕœT=$[?&™‘ ª‡Ø,¤P¾m³„¸›ÃGÕFó Wn„Óâ¡êgÓʁÔgUÓBz Ä ÎÓ*+¨Íƒ]뀸@ôà8'íP=Œài 1–½oªíJQ‡v8‘<ù™ÓBÛˆN|ìO ªGø÷8ñÝÜt*a'ç&œÝ»Ž†?ép¤j= -y‡9ß$͇E9Ú¡ã+qàüaÊ +Þ!KDk/Hï“"zwPKHê¾\駌G¡í@ŽÐÏQ{Š¡/Qï&^5âî"¤p‡ +ùÏœ1c‰Q~› +È¢Û¡œ*ª¦Pù̉“à2¯¤1üLòìÐ6hKLe +˜c=h§4OH²›vh +v(?tÑŸáî³MJ© ÆÄú;RyvГeÄúÔGœ.ã0:ÙgC³CªHŒ,r@£ß;633´àÒé Øá{Ë27ÄÚA:œ£m^~ªº$œ}áp‹/Œ9ã?ÊÝvï# ú9¼=¯¯jËô:XØßm9]øA¿‚â£7 ÀáàêüÛ­ƒ=‡ô·dë°jŒ†Á±¢6d;H7ñGS:¬8"J7ÿ‰Ïh†&²¡2C(jߤ¨Õ„o˜^›uð'Óp/ +¯—Êž&Ž«éGgD$§ÕJ”…Ã¾³.*ŽÂkÁbn‡ ¤F¨ýðå!¨­¶ Äb£ÿKˆ\Kÿè0luXÅ^iùÑ·£y ªJˆ  …pAa£É"%³ nž¨á +“‘'WP À ÕÊ2xv›5õmtG«×Xd3àvÛ nqŒVTz¾þ‘‘Þ[Hh9րd#?`»Šß«–®Ú‘;©RïHê~¾îPìßhstõ!ìÿË[ÇPJænj(pÛ2,׉ÕZHT½}N&277 Ì Ö½ä¤nx*4›næ²ÎcíoŒç†dH3Utdqc|”w‹±‹Ûøà0pBÑÁlÛf¶mÛÌÌìÚLîîîZø«qh/ß°w½g3³mÛ̊lÛfffÛ¶™Míš{ó‹ƒM ±Þz[Öôïe"ø¾nЏ*QQßåÞ¨*æ.ØÛ  ù†^•È„ú'ÿªDÕý¡êâ‹L 2" "žEŠDD"Xù +ÆS)ð©§ú4iéèӐIñœ±¼´‹"ZPÑ8*щ"¦H‘´œHՅ܉.OØmôyðFUå(,šJXEä¤Ñh2èœÚ8`Mä ::`¦Ht(tȐçÐ1e¥1ÑJºË™©ttÆo§Æv-|­ÔPmfî”67£ x|F›³ÇaœnÍØÓGãñ;¶×àv‰Ø/}dƒyƒî(4óîwP6ù;"FìÃR†2w0HbVBHa‰å‰ÿè&SìÎ"¤<²¤1tV!e“\X§Zý¦"‰ÍÔ°HÁF ƒ@LŒš @Ü}“}g0Ö³ˆF)jÈkdàVe‰­æ©—ö£ÃA•üxÁÀKOeÈÿ32Á?(ºÈdÿy€jÈ*Ož›¨d|½sà‘h< +Çâ1 £å€0*Œ.8DLT8£KäaÄ(†`Œ2Æd2·Gk²tÌÀևÐ訂u|Rù{yO«´!s“i\¥BÎöUuBå>ºAž„¥cDšòtx6† ºW,8y1ó^¯_’ $‰_„X¨,øtÓø»ˆ.8€`WŠN;ª¿úéç–Óv¨jO2‰MºhgêGÃκ¨½ß­zx¤¯…°¤`ÉUªOk]Kƒz÷ ­àëÂ{à¦!à[áÖíXdÜžþ…4¦2(»ÓÉö@öLXæÓ!ó¤¨>Å,FXšstö›±÷à؃ú‰ÂœC¤¸\šA žKêspG@ÇQÑO"“ +’ý1 †ix>{äk¥ê*Ï](ÆQ\lXÁùÌú“òRSàÿí¹Jm’˜ÍGÁÓºŸmBf¾%*ÊlgZïæ×áÒßF€¨ 8]Õ¼X oÒ-˜ Ð1N<§D–ú x ¹”ùq™‹’ebâ$T¡©æâ¹ Øbàc2[¤³ÈÓ¢’.…ûÞ\Øg½õÁ7ø‹¦À!ɉܿà)Èъœ¢¦_íÙ±yopčŒá­·¦‰&e)ÃDt€f™—.…^ÞÌpÜÐM)J––Db9v”Ñ8*Ã)Fìó`£¥³2Ø7Ó¢V7Jb $ÄJaø5æf¹>mIú"+ØÃêK LLT$›)aº¨yÒ>ØE¾“a‹CYHO7ÐeÄËÚBOZ­ºÿQ‹å,ì¾\±=µ‰kÍÝ ül¬C/žOÚvRÐdj퓺NÅÂâçn±äØïnÖé}!9e‘;°Ì+÷.31fz +d¦ð+y·ú: þ9`é5ðppRIûñܫɬ>HP¾ÆRI/Ž™Ÿr}UL0É]ë>™B%£Ñ%m“ýàš™ô8¾Nuy!O灎±wþ³¥U‘1ga# àu"‚áíÅ›»8:'l$fĤŠ‚Å]¢ ªÔ(÷N;ï3›’P¤KGGûa‹8C*«å eÁu°Ä- ý`/ö؅£Ã‰õ¿±à®¬-žÒ¾«ÔÈél¸°u‡JøI¹s“•O3 ŒáÎÀî5'—"•Ø6†©z+"Ã,xÂ[öS}02f/¾Tß8Ç$L–BƒíCX ÃÀ\G‹Îd}ŽÃEëà¤yÆt ù‹Æw¹^ÌRÉE'V§·:£5µK¡Pö¡ÞL…7°t6ñ˲6Ëó8B×Öý°÷K"¤&#ÝÛAđÛ/0¥Lõ¢Xxœa#`IqyS§£€0 ¢,ÍuáéÓcPoׄ™Öï5X?ʏ'%”á‚Z΄šø ŸkΎDâ©æ+Âj¶ºT—|Ûp¿~T,ßæçÿ1 Ððý? +º U„ G)»awŽQ¨ixöŒïƒUêJ—:Ë*°+(¾°áãoâDz×pTÁ\¹A¾bÁlT÷*¯LW§÷¾V‘ܹûI®hjt®K1(E@¼mü­1 +Ÿ(èm·Ù•`½Ô•à=˜X©©¡n#+,”ËQ«% A–A'%£'3ѽ•Øl¥\V“dÍH¬ß ah^þó8 a ÎÍMABBƒ¼«£‘m_~¨µ€Ã2ÆH”ÏÁ´ËôjS”șŽ˜F—Q¬«$ԙ³/@ TUS,4eâ#¦)ŠNqWä²>,LÄQBú,I±¹¥“‘á²1]ÿÊs³àj†ÏH¾œÖ…ԏçrük."Y“I¥œrÕê :¾ˆvøuø½e3ÀWòDˆë¨ýàˆÔóCfPfޝž8à¢ÄMé²Â¤d³U÷õž$ ÖqDâfn{Ž¨¨okÿ %™ìÞË ÀÊ㲏…š¸jžq¬ærܸgB/'µ1@ÕUlV­,’ó ÀÓpqߧ€MC\ÌÙ–‚YÊmØ_@.…éفPâÚ%TiÁEkÃÀZíd8ißȱd“Ù·Dª:¼²Õkã`Zs¾¿/¤_={'jÑêÇÔ2 Ææ[ÿðÀ)š(Ç:ËLšFÊ«œ·à"7V£¶áœ‡0¾+Uy„÷ßÜÛÚ¼_@ÎôȧÔ!õžô¹P›ÕèKôóËÊišŒE{f¼¤¨)gý@ Ø´°Ïãô‰Vÿ#ú–:öV¿˜‚h]¦s¯GÉ= " +¶/š@}ÍJ +¡[!˜Æn*ۅ ¨™{Ì:¶ÙKU4#zûÚȹëB›Q¥vìq²¼—/Øg²xþ‘;›¬£rZE4–¶Çy„•tø×Izö^‰dQM•zo{ü™¶ŒGÞñbHà>o;¢[™bÃh7Ë}lOlصÐyˆ!^Dj_78»ÛA ÄR8N2ëêÎ +§Ð{³Ê~õï@ºA¨*Öï1*ñÄ{í¡Ÿh ýKä21ûËÆÞzZAyAsE¡¶ ±À&•’bTþLÌOÂø‚.}Ò‚ËWÓIÉC©i¯·é9_´Èe΃OojóùqOе%¡ØÀ ·:ªö¸¬ƒRL˜{N^+b;­ cn]+S‘Š””¬9âÊ'Ì#/G^/C¢>|s­àäã!-û3‚äžôÎÏڲą/(JI=d”®h]A¸¹œÎ£cÈÜWp÷pÜÜ`Èöٟ€ÜM\©Jé9g&“ARª‡nùßàNlñ‘@ +ô€ A'ñ,W n¤2ƒQ>5*öK[wkr1[  ±SÅÅþ[ÞïyºÀsT/º¾Ó’Ï\Þù=!.ãáçä,وNÝx{¨3Ä)Eb5Še'U8ÃÀöu‹ÿ]guí:•K +b ¬ +ªN͋ ã-±ÛQ'ôÃôÚ§1‚»6C=I&ƒtîv-D@‰BëñòÂ$«ÂQFly[$ªéÕrò³<ƒã,¦ûûü2N²`ÏP|€E+"¢DqΣ)xà ?UIí §{Š¥wÁÙ,¤fÀ)‹‹ó›C˟K|“–­ŒÉ5žø)`+{H6\¾¡4ÿÇÅçµLNxös±É’!@°Y ‚e¯ù/c}c\s–ÎOÞc‰N©rd™=VѤö¤¹Ó|•G'Óü{á e}I+Í~¸E“èwT)s\pÉ|‡V÷ûÅà-;qnq_^ZoqnisÑê9ø•¨ªeH™FÉlƒY² V":_TùTVl, ™ú@eYJ´¾ò‹<0^Éà ӺŽFä4E§Ê5F¿RHu±ÊáX‰G“§8ÂU%½ÇNõ̋*exL¥ÌӆÆY£ò+' ôìÍ~Ó,œcÈ)e˜3£¨)y >1åpEÉ7ß(i‚¤”š{úÊߊ¡J^P™¡Äat„ÒlÇSPr*‹±ˆäÿ·’C]¢°•ÔÞCú¶¬sN?vó9Ø)¤¼U€„ j–Ò à{i¼`Dq2H"<® Ԅy‰Ô‰é9âR&ºRí†ì$Òºâ{ ’öÊsúÇe´ÛåùãXÜek‘´.sý8Ájü8o-¦DrëXõ2}œõ8‘| ¶Z;’1þ©’Ãõ–¨{œÄOgm–',Þá¹@,ܱ”¥tíø§pôØQË· ®Ñ­ãïü{ºÎ1Êޒ.s¤Ô¡¿¸Í–ø ÀDö™Sø†—ëLÐ2l +GH¯¬Y™Ëض’ nô|ÚFƒç²Ž–wñWÇ!ãptiØ(Âévµ¡úËG½º0R˜2¥ +ó©V¤ð¤þ‰Ë"‰ð!…É…`’-öP¨`Cî±é£3!%[Á¥xö E«’b†. ÑÂÚn`ô;ü¥+‚¦ë…x!…qž¡¢Há 848R˜\¡Sn¾ ŠË)ƒ°ü#†PPFö7ð(ܕøz °!|¬r‘‡ih\ãDFPÁ¹8@F +†ì! +—˜;D¿û Q u‡ˆzu4éa7B#ñ¶xZqû®ã&Č +†^Ó ÕÔçŽíÞÁU¡î[€„eў¯!SU-A/‚$®%~zÂXB3äW¼ùòt_5^ ò?ϐ'…+øî“éØHdÛ~[>ù vàÀ;d{¼WïI|ÂByB´Ï|ÄNgÄÇQz91¶Ðs^2ß)ß)Jƒ Ô'1x'ŒÌ¯FôR'>Y„Õì°å¬ˆwG•ƒm-«îþJþ æ¢@ +JÖ ‹H429´ô34åä99K(­ÀÁdÉ§ÆIª:Ì®-–ÝFýÀpM†fl› +eY«èÐl‡„oq¬Ö]‘!Ûî*%zÖʍȈ/ýL˜,øZsò²23ÿ8|ï2äFŒ?û,‘§ÏǛJ8 +·ÍW4*MdôOnU@ã„:9›ªàq·°¯Õ$|xææoÕÑlzikÂú}ÎàA¶{“E…yWb;JN–Ã~Wö6» 汍³ÿÏÑÒ¯½ø|£Ÿ±%j¸à!“‡ŽÍ”Oç$”[+'&;b‘Ì •¢Œ,&L>ÉíòŸØg·âç ÞäÍkK² /aÒfgçòùõ@-’9Eº ”âz¬b:FVüE@vP,¸„w*827»I4¡T(jВµá‰±D®GqXgB¸ê-l劲·„ŸPƒò. ]yŠüYÂê>¿Ò%K8^ìÄ>| µ\‰<Ì]ë{L%L*W.(YÞ•ðV…ُÅÉL¯ÑBRM C!á}¯Ñ¶`¹þ [¬µ\ú<“JõªìD‚bvæ?«ºy$r|¨8UmH$ÃÀP蜄iÄÚñWZÍ9ÃFøî¨1ûƒˆ2±E>ç †’—ä)òzp×Ü$a"l+D˜w¼B†¤D^\ éë%¬ç8ÑBâÖjë?£œèrÙ7û\LP¸Átö:¤Ÿ(ÏC,úÚ=([L~H}9Æ´–•Ž— C'Øõ…4 H³Ç$®‹íD««¥¿Wa5Є#Íêv¢)f¨Ù þo;2³ñ†3q]íC¤‹íРқ{ƒGñÂîøóÓ©ªóÔÜãL••™@ ¬DÊGÃ÷À]Öö7'zÄÑÂÞ´ÊtÌ{‘†îª0¶å±©‰,ð¢ÏÁÖ)1±õV$²”¸Hüô¸bŠ”QTÞyI¡3§A òŽZþj5‡Ø2'éú„ùq(/[½ƒØå‹ÙMR#œßÞñWdxÙµø’{oÊì–Ò܋íë/‚®âüÁ„mË×qUƖDçJ +v¶´*ÜX#\ÔTõ5ÂOQ&Ì@+LŠA¾NH°UêPAj²Ó&‰lÎ[n‰BÇÛ({’obtƒƒ¦º|xÙÂþü‡Ê÷9ú® öñZâ]Äîšt!û˜ Ìk÷•uYW”ßá— l7¤ˆ,(Z yÛ±ÌíÕOÁEfãy´_‹œÉu Ɏµ4È>ÖåµTrÄî§s±÷¬Ûå:®#Kðí±ªF˜~9ó²ô†Å0é¨]F!cÓr”Õ ÿJ$Ð5g̤=¶j<¸ ¾Øn[-LiCí¾@¸é IáÞsŠAûҖo'Wº aT H77A$#¼8mfï[%ÿ©!ԘÓ+¡á{HÎvÏ/k±Í4)¶âPEl*FÖ.ÈÕQÂ#ì²k%ÆzŸŒEރ¢„>-)]w ¿‰Œ òAÕÁ1Âèmør˜cŒ°Ûiœ f¿‰C0ÂgBYƒc aoÑnà˜N¹É©¿RmºÓXéÒ×û/Aæ¥`¤<$„ÂXh¼\&J·AFGÍâ`Fê5¶.R´"\<±>˜Toˍ<ô-o¦Ä¨È±Ýׇ&9qzë™»öt\~ª¦Uþž@í.2¯"d#‹d]yŒƒ/a†˜f­×Îu>xw@ O܆laO×Jˆq*TB ƒ)Vj? +s`[6[~•e#:%¬âk)’ŽŠâþ¢±½äTZäï ã¯E×N“,ž!,ý|Wœf!ìEHPÜ’Þ„’`¦[ñ9O¿€Ü(Êö|åÏݽÍñUÖò¨›—­Ýb™ +áN¥©Ï©{ +ϋ*Ji#ó‰âֈ)èߦù^On÷ßp—Ó¬—˵] +9-ð¸F U%ú¤EŠ„ˆ= Ž—©Kš'„psr)×k$¾&n™Dó<éªH>=ßrØSk‚8TÌâzqDl9áƒðµ@#;'wô Œ ë;Ñؘ{"&L—‘ã³¹¹ŒÜÕiÄbËÏlú:¶^–R¼Ì{U‚å(™á±ÖS4÷ÿݼóàEªÏ/ÉU׍#TÑât46A}ꓯÓIx®jô["£„»¶ª"WW†Ñ·±+>@S/úIž·-ˆ6Ö]™î !=0—+TÔ6Ðo |ÏԀ>óù´(z׉ÿÂ!$T °¢A×ÕÇĕG”€é‰Æ¹„-×æssܸÓW€Ý}n@8Œhb›¶£æ_'ä2“ýÃuU[?f•p\‹<¸aÉêò Z†¼¸‹À¾aöaÏ\ƒ†\e¡¬ø¿a\˜ùžRÂL?Ô^$ÍBçTÖz”§±í÷=‚ +5ƒ4Üà?“ŽjætÄ}ÆÊFño.G ÅvÒÍZ„äJH>ȍ»ÎH؉TÚÙÓv mG ÛYM±1£;OlŸ¾à|{°òœ‹4UÜß#²ú’“÷%`Ùk¯er_¡«P+çAÊãBfÁ,\°8L¾…w©\q Bö1e„yJ}Ÿ Ãµ°ÈP˙%(˜­¤ý’A$‹ZÚ° ˜7%F¨È@,k½AWÃâ£NÍã’ür<#üÆ*{ý~°‘NzÈJã‘^RE}n!V2Ù¶°«•ý§<,­BL¸¸Ê„f¤¼æ<ÄP²÷IZÊ +Þ¼€„è_wz05YèÁlõrÆï´ù6½.·°ÂÒÕ.-×ë9¡·pÒ<ÿpŸÝÞ˜!ÆÆ.¼1w .ã®øE9‚L ùGÔ¯ŽxÚ ÷”\Y˜ÿ>|{Ì 'Ú²t¨ŠÛÚr>êLŽ¤å30Ïi‡d¢, + pEúÓp\]·ä w—i8E5—=5µh3çë!USŽ÷<)ÿQ¯$¯ åi±yòŌÉpò<ÄMÓäã8†m˜Ü.•íû-yùÓ³/ )ùšë¿,1z›€6ñâçS.='̙<Ü©àØYAŽãa¡ŽlïÇ,YTiÂz\™€«ð¸e™$;þôs]ÛÎ,Qܛ_«‰Gió#Fâ¼ûÜD£füøóޞž‘‰qV ÿƒq‹cÇÍïbúÃÄ)øBM€â(œ¸!¹­‘÷æ0bFÜ ¹×ë+`±„¸1 |I“ñ|øÝœ6÷Vpëܝ<ÞÐSða8¼E‚è+qéõÅ/ bŠ†“‹¸Ÿ _1¾†ËGñržS^d>Á[gÖðà醱8x2ñ–?ÿdŠ0¸¾—`lÁÍUmZÙm]ó­b`[²¾wAFþ)µ£/¶)d̸ÿnpöü›‹¨þöoEózó7Ãö›#%à%DÁ¬Òohè,2î[ÝñF¾Bö+a}‡Ê+dЛef²š„B PŠˆHpͽÇKÞÓÞQž{ã¬}hpgޏõžqä¥ÞŸÓJ°jÔõTÌ[ItÁ Sވɖ¦-·«zi<,äý‡zÕï4O¼¿’RC§qÃ}w(˜(A÷'Ç?\³²bp‰wÃõ¶¸ü³åÞ{娷tw}Ïq÷H94ÍvG…Ø°+ÐuþFt˜H€—°îmÌ®¹ïûތ˜Õh›žï€¢ì9?ßø? û÷Ú¾°ê»•-EÞÖ«:¯—“I÷*<ÐÝ£{± Ym²«rî·÷ƃ—â5·=™s •¿an„ð´ÜŒdïÎÏ"8Qn¦¹—øYr#Œx>!Ç]Ä-= +Æ7¯&€É[aÈBgªßžoÜ!k…°pª·½íþËÔAréG® Û¬‰µ Âígf¸mûÇ`„ñ¥sŽ=_lڒ¦ …„"¶)œ4 ÜØî÷H¨é¼¶ýqm‚Gkó[(å)KíÄÚR7Ñ8qÐO«-`”cúqÎßËøxn@Jf"ÚÒxŒÚñ?cȬ Pæ³·às§cÓ´pւÜeTì„àì\Oò#šÄV_ó›5|•c.;G>C´ï<°Ë,P^­¨jP;¤4ƒhͱm+<ô¦ká£ôXtB1ö_á’1…nÚN¥Æþ i± ½=”/âʕØ+²ÄÎRã°ãúØ5½¡J€ &íÙ¹ä×àˆß7¹¾Æ’ð”ûRmx³ œ¢»à5ÎQr×øcT¥£aWC2â¤Y¾uÝñ¡ìþރ¹–dLÑgr^¬é ¥–©(i!Åõ6 ´Ò +×ð/ +ûQ1`Þº-–:-ÚÆ¢SõÅ­í•;K|øcmÝ6߶å´cëöæûA¯¸Qî‰ó+7ßŃP³,d=©^}Œ5»‰PÝ­>±þ{rú¨>J§H P¿P9fV‹Å«Í~eEW¿ ùŠã-–-ˆÆn,´Ôþ›0ÚäC¨ó—Õs… Õ›Ÿ‰htÕÝ” tyÔ1“¬Ú–‚Ç ˆawT›šjU!QÖ>úõø[«´f©[Ý™áÅE©ÿiÑC4IÂ¹bzك„¸¼'£v¹ú£®w×^†J•I¨áÆséÖ[±IPçûj§“.íYB+Ÿ¤¶„’ +xº¸A}«ôÙÐiŸUŒs®6SNoÛFÐß\Y†‹Òš +í3ÒØ »ß=äÚøyWO˜»˜9q4”/¬öi£ç:j"žé˜ЖlJâÖJ%ïx×BEÚk½N½}™´š{£‚I,â#Î%Î b.ÓÀèlÔ»zFèM —ˆ6ˆW{ äĉ“O#‘böO#ąjþæj–Ù¹”—V×Fq·H/ÿ?üGeØM¡Ðѓ[°*ӓ °—Õ¯N½KÏɟ üÊpMA\D†Ù‹LeJÚ1S9íÒü#¹O:`KÞÈ[P±µbŒ üÊҖj°‡Y®¾ ‡YÊ"@ö-ö‘£“Ü34‹Å`!Y”EJE<}HǸíÙUÒÀC¦”v!Ýõìâ",R'_˜= JÂÛ 5ØEPTºõL{ՙƒ1ãÊ¥é,b'éÕM¼¥RÆVÍ3ÝLz²_QnV+äHY œ >¥žõYÈݏ’I´Ìÿ꿊NȼsÎ£óÞX÷9e )gtŒK藴%r(kt&èþ²t`nIçªÀ;NœÝŽA´eô‰ÙPÖþžH€YÓZLÒƒv+3˜„ξi•³C<™õôs$T!ÝQ·–x +tJMä^·ŒË§bs.ˆô«Ù.Y¾ƒaN#jMÛ[ýæù×õ´ G éÏ£ËVø”¾6øú™ÃلE\Âö²ÿˆ*Ç2gH)}«¦½r +¢D_¼†½ ÙêRJ´ó°Ž­:ö4÷‘»e IBí²¶Q_Ì-(€¢Ý‰­À©]êoÂã° +—{‡P÷K03“¡)5>ùê§ù-Âf¢ åp?¼«£>˜:n!S!—ÉÂL߀dz ƒˆÚe™Ò‡úŠDšëŠòÜOpE„ËÛX&Ý)™šªž"ÈÿšuÔHén’— Ÿ>a¯)RVzròÞYW'ëvNÝQ.»×8K/B¶-ÖkÇlR¡$òSâ‰úîÐnRÕäúûNbu̗£`®›Ú~Ø æ{] •Xi"*©H Ízx#NºNIy^ø‘§ ØÞ%ö†zJ%¬ ZL<¤QœƒNT’«1<ô¬D-ý ´plj-àà-‡ Ö4E°²¹H¸Zp™ùÂ_@4ö`‘0{|—Ó̗ YN£ Uâ³ 7нBfÞ ÐØÛ^&ޘÍn‚¨©âž¹±ú‰jc‹Bó% PfΰáÁ ê­n»¾K ñÌà„C~3, {ÿÎrÜ{]S㠓æ]-nþXÙÒd5ßÝ.sÜ%GÝ~{¬ùR1ã…ô aÐ.]ÈN«ÉK!}Ák¥"ÁL¢0ÜpKÙb´:ïmj¸”ÅEŠ—ñ­š]Ħ¨q4¬·>¤èPó6߃‰î ^–$™öKaþ…ãlÍß)¶º d穃þœÃßÁpœo¥ï,, Q±¥w#âEA,n +Rïê˜þ€gä|H·€Çõ#­gxZ“ÌIÜÔE‘^ӁËcS(v‘ÿ:{·'ðË[º•óÝ>hþ¶×-é$vŒF2¡Š÷ØWt€#_ô$¦ªb»#nÜà˜V°°‘›O¶G©’#“6ßVðÓê†ÉPLÜ1 ÷`Øé™"Coñ½yßùVvXm`éá"¹SìqŸÒeÉ<_z +µ¸î±ÁCŽ5÷ë(B— +ÎÏÀ8<` óž¯.àP#ߕ¿x«Ù¤žLJìŠÕ–*†ËÆ1ÆmVF -Xq–&~7_þˆ#eNLÌËðnjêç{")Ŷ“Èiq‚þþ¾.þ|»– ¼ƒ/¢È4Ö¾þXxÿ|AnaT>L ªêá>·,£·—ˆ°©ò”ÜSx‡ÈIÔh€eÒ’SMDZëT  +—;ŠmÅ~»¢²L#õØ¥p}1ù{Ê ð>V-xÕÿ@”%‘Å,2teL…ÿ­-úv~ΐ—8¤xÝY?s—Ø þ®Úz6¬¬gӮɾL9€dSU0ì[?¤‡"̽zÄK'€˜¦¬ä…¾$r+q$¶¡R3A‰Ó~±#YkY¶˜OIcEm +í¨þ]]‡~¿ŠH.ã!ãRƒ×—˜SzåŸäÆ5 Eß]|ýsµ¶Ø/{ OÓ 8ɏŒÑ—éɜ.Æê)®ç!Æ>› ’ÖQñTIGüd.`«ºš&ã½#€a,ˆ;¦À0pÚ_ˆè¸uå'IX—P¼:üP…m®™³/¦¶"ïÁ”%\áè««ŽèO}ý8œ!#^Ârõ6À¦}ÖÑ¡aI«œÔ2XÑöD8°š@[W=ß´"Ÿ^’[û ‚×;®1Ýß諾Ð6Ž9§ÎGú‰v{Ÿ;„(ÙR(­ÐÍ~uC qd9¿ ùá¤7Œ…4¤k­§!úòõX”@-™tßö8D‡/$_@ql±ˆ‚÷nÆFÚÒ½g•µXð\‹Ž+éz;ºããÔuX˜on‘ ½ß3V5J›!úÚϼÿ_€,È؋ ” +°ÈÐP»½x8nÒ7®«ÛM@ޓÎʺ<Œ°ŸCcuúÚôSóBi¬ö,Ɣ¾Çe¸¦ãاy]UÙâ"’ RMW"1{;TÍ¡úC²Pkœ1˜Gnoék!#®Š¹«õIGÇFÔ­ŒÚñ·] óxZ=æ†"Õ\çO§¥ãöKß^\cÝz}‰qiæìŒÅLõkì ;?W5ð°ɶI%ª&‡ÄéK³ø;ÉJÀÀ83gB1„¬ü­¶3‚ÞÛÆʦÜË°¦À‡x wìšUœÁKRXåö–±E{Cä <ô•M­60t‘'wD¿|KÝïÆ2Cb¯ìj?›—x¼ËÞ0 ­œˆp®7»¨=Qß ÆÆ´ûn/•*1gJ©9Œ6 +JA%«C:)7á°±6Rõ`žM¤ÞHR±¿¼.€Ô”ÅãÐõ0Jû(ŽGq‹ß»Ž2ë »?Ž¢R .ب\íèÇñtbÖ0þ¸Ã`pUX"Æ;0†n'Q½ÇÅóOUÊÇ«‚ÐLQ7§š@_¶ ¢Œ4öP0dS1˜C)@0x …È'ÊÀ÷j´ŠA úµ„ôðß^öÌtõöáÔê´J@Ábq'öí´‰²Sc®8µZ'ÎL9%+¶Û>õ£“ÏAŸ*áâ ]é–O1,Ô^Œ)CMúÐqO±›ßÃ9(æ `††î,‚§ÚG,mŽE^W·LH蠟î$sÚÒÊQÉÚé—@УQ°Nu2ꦩ䚤ӕ°¡Sìjdòʓ.OVNŒ´¨,D{ޕeãTúN‰SnÏMÖÜ(œ€YÍ +%:úÃþªù²ÉVCzØyä®é}ñcM×ê.oþ yz³4ãF)/šô)Q½Õ½==hZ6½¬Çøüô’Ä~lÒ4“ì f +ŽO³e"·K3íI­Š#,¯§Ldš$™<·<2 W¨äÜ1åËhó0ªQŒ Ÿ¤1©—1Îòd¬#UÌÁ’µÆ¡Ü]¶ÅKÊwŒ¹·K= 5]zeZeϺS +–È…K¢r•‚»¥ôa5–À–¶C-gþ$®-%éúfI*ÏIÚ0¨3çž„ÙÜ*I*}fŸ¿T’ëq¨ôYkë”ÖìÇƑg+Ñ6Jsu'¥wÉ2J,š(y!“Ã> ðr^𤗽¤Ò£‰4I¬,r—Iñæ¦ËÂåÖ:êh¦' ¼7—4;¡Ù,)ìLL•Ä +GÐFI³}cg=Ö$U©L’£a‘´j—8ƒEj ’¨¦QÆ*ìÎ •Ž4JItí9vÎ ó);ogŒ¤&Ó-ҐÔâS$‘UÚãßV"É9)Yq|‡T¨.šÑU²ŽžŸU«)}xÌÈüQ6 ¦ &‰¬ÞþŠñQ vѕʣ®MiÂ#ƵüîHf™ŒÅ£rê^Ð2ÔJIQ÷âeŒ¤i¬¿:› ú‘[ÜJW½Qïp÷ÏÛâBÌÖ܈™ÍÌÚ¨vª =Céކ-Ç[#-Á£FÛb#þBÜ@£ÇÃ5Þ19´sόêE»WM°2bðW/:…EFJÜlÑR¦‰O£îƒUú…ѐ€àon¿.Œ/‚Ö¯ˆ¸wV³dZÁ!ç‰pËcu Ó²êh üá—(à€ÿ÷$ A òU¾G ÁMR;]¾ çiAîO€yr{góÂß¹4åV…60Š•dë1¤ï¡p"káµvç8Âm‘“<ýÝg’˜ŽmD–y…¹¸ÃÌjz2O¶—ÞxP<§&y‹ÊØ^H[*tqh`{#HJXΞƒ^[è²µ·ÚÎ,¤Áå&"ˆ™ÖžÏ¬kKïI$˜i—gç&™{៫´RÕ^è1‰b?ôAtÕ€|Ç$“`WÇ*¼á©öqТÎwï2‘º<´£šäÜq,(_|{iïNvš‰a¥½X–˜­9ôW’gy›ãΔ»©ÀyB0ž!]IDáÁÅitäÃÄ¢AfDI‡ÅÊÏvÙ@"¶Ý‘Ð^G$\؇C$q Ü={9–ü,‘­M잽ᄬ!O>dŠNk,}ŠEÏ’6UH׃hlöö¨è…^p(÷¾1î•õK“ÈÀA" öŽ”Õ‰›vc4,š¹pÕ¤R|îÄø„«Ý1°†»çIüG¿UŸÌÊ·±]]I'd“I»ø\‹âÖҁ*맚j™jYe‡è‡hˆòu‘0ÙQ½²EJ⑽cÃhåÑAøU;´høq…^|͇ÐùُMã»0§·Ó©Ò*¦;ï³p_$)Å^@«x¼ÖÐÙ/ŸíÚ4†¤€ü±S–ŸÃ>¥á8 ¸Hñ®­7lŒvñ°Ù™ü’þ¢,Á²œÈ´ož ÄêÖöðYª¹Úƒå¨íèn…Í¢gª>ËQäυÆÙXŠ‘¡Íê¼x‡F½ ̜(¶åBÆè+¬÷­ËÃüq¬!ÛÞÅSµY¯ñ(;«[³ÕãÜ9Ãü˜ÛÔ “•å”²­5ž†;P=%4 -›ç“ÃÒëE_…­öÂ*Œ-ª:È& â·ü¬z¼~€3M©UF㪫³—ÙL_|p(`aí¡ ";Áå•ê^Ĺ ´÷Ñ×íl›CÑÛI÷ÇõnäëRZy¼rÐ9Gch¨{~*A°õD^wK& ‡ϵïßP¶ýðíÖ[Ua-úBö3 92[AD“ªÉjÔÖ[³ùøûòGz "¼ÞɄ˜8iwD"©‡z7ÎÿÄÛÖ-emÌʧrfªØ« Eoíàƒ«ÿýïpŽ +Ò¿*|7ÿJ×b /.[:¶hM½ýû±³¡¦¸g[¹ËWá= ¤ÿ‹>” ý6âOá `òÒ¸ qæ7'á)”vçÐf-5`É,փê›ú^WÑô9‡öVêëÉÅêîíB¡Û,•uµÊS3æÓõÑ0sH€PõgÍ1 w øª7ÎߨM$»XG+ºcF*ºôڝ>êÉ  +gt8¹YÌÖÐÞ>RXƒØUõbõ¼‡†FÕÛ?bÚr ºäý³&!®Ë•ÌÙÕf,Ôpš&·¡à–…” ¢P¨»|3°ï?*ZM¢¾ +³;6ù±d‚‡åòþ rß©—¾HÑEµÏÎñªÁ:Åó=Š°Œ^Ü?W(†Jè_ÕËViU.æÈÙ¡x nù?€a›àfϾB O/¸T‰'x6òœ½\oQÁúƒqceßC@<º’Ô ZéU Õ)Ðó)²,øe§PãZ|—äùB’AàÓÄ´ŽÊ,Á¦Ü65ORÙ¹²üÑÆ${õĵÒ|ˆ +ýG[aÜÃ9]L³€µšªÎׂ‚zÉN”b ž[ÔSÞûδԴîyÊ«î ¹Ô,¬‡m`à8z:ªñ; \ñ¢ìåYŽÒœ¡“7|H±Áã¨t“M‰s;éåð:2Wb1µ|¼wá1ø ~Àà‰ ÆïÒG2šdOâ¡B^JÆGx… +é.$ú\Ý(Gº«áÒÃÞ²¿!£ÓË6°¤5ä‰ÃuHÂì ¡ +Ýy¤Ô—ÕóÒKãÄvcã²)éHD »K’¿Ŕ:HàÙ¸.LGðIgdäKžô$Ÿ˜ìÿÉ>Ô_hV«ª +!v «"%9Ȉõ™ºž,"žõ†{V^V¼‡ ®Ò´ÑÝÍãé^â9‰ÙËPi•~ƒ*Y°_ ÝY–²º+Rƒ£fbˆü +Ÿ\v­å1yô~–ü! Ì»T¤-.Ó_ž¢A¢.ÄeQi£÷ZìM) ]û à å6nwûօ‹*!:<¶"âOâ֋±U-:Q5Ø*zõåÚå +«:,õœ„œðR2¶y\‰Hr…@Z' ‚” +×ç +¦ÆR‘!KGÍؓùÈ#ë‚wJ »”8õ<Ê%Þl]dð7ÜF%ü6£Òû¥ ãŒéí¼¡ow·èC6 §X¢½|¿Æ®“è”<š Ï ÜÑÈA]’y¿žKo&ì¡9b”a%rš°Št@ÂáekÎæ,<™/(>»›Æ)^~¾¤2¿ ÅÞ>­H ¤¯Z\ë`ï´ d6êù1 ÕöéC\ +RÎ * ?±†Sè&Ôå+•Ž›³ä”d[(Œ8èRåœ4ƒùgøO RXÙl%ìœÅ+Õø ½uƒ’(ƒö0lç쉝 Z>3ieø iñÐYZ¹Û&‰)q¹7$&ç%àÞ¶%=i*z†?´5ººQA÷ŠR¾xyÞ,Ç4Üt¹Hᓠ_rÊ¢êJ?¿t"MJlã)¡­Ž$Qì3ëÈ}>m~øGN pðKóMœß9#§ß Çw!¯.õ ‚-¢ Hx¤<ôXçMç(E9¨¿RV$ªÞaC0•Óã—‚û–¥›_ˆítÞ¨ aG@s«ÒyÑÛL±þHFpóU] fl‘q–þópö•‰‡e!ÜtöO<¬ÃÏ_ÝË£WΪ_.â—è¼Ì×)ÝÅù´Çs^<8rzðÄٔ“Äc›Ówä€vön`‡k9*‡È®…O¡‹£YvÊû1µä¼qbv)j¼xãÈyI±ìrö>R"'å8Ôþ°õ¦\V´ Ñܬ¬ ]gEƒ‹ã$g1_%å%„E1j™½–H¦dD{é,Iõ@$ÊÈ&-ô`s÷2×à¾ï›#ßeÊçÆÔß ñ:¿‘:D÷Çç­ =[öž€í¯¼Ëû¿ìÂd϶â"ÎKþ®_O¨¸:µ/¾1ÜÖC ÎDz—IZäx(4þñ +‘rh3-žl=©ç>>žñMdêÕÜ¢ŽP5¹³ùԌ ?Ã?‘Q+Lþ¼ªiŠühX,Í(v4=alHB¦r®ÀHÑ/ï¡. Í^ï_ šöžé|ÿg[閽gæöš~gb*g¥;o¦÷ik¦ƒW܅¶œý„)_êX’–LãS¥ê‘ÉÁ¨;ÔC¦Í:Ö$8æc~S ™æ¬b_Ì`Xr[1ç}bú• –àã (?LüñBÃäËÕñí 3eŸhVåî„É$&éfòá—æ* ÜùÒ,ö©ï¥œÌª—C5ŝ—ìèD9ýØr%A¼”·»èÌHße%¦ùþ%åÏFê.]n;S¡\& ¹ÑŸQõÇ¥É<&\úoßÒÓZçiIÚ¶|ô»ý*ç³ÌtW†Í’ÿ0”š³geŒãê²è^¾" +r+G, zçS[vÇrv¶½‚ॱ$=[#3RÝeû28F…¤w(ùååôWQŒ Ö¨3]b~å<»¬†ÝTþ’¢`ÊBDÓ5Hã9²t੎‘¡¾í]QÄY©›o«å™:K‹ú[é:o;ÐZiˆÀÍ쳒=´±RÁ…ýθTÖ)¤F%sQ†J~½·_äò)ùSk7Õ)†wS¦xÜH<äì{§Ïõ¥$«EeøXÉ )-UJˆ¾ž”lþj:}ý{rÈÁfÁ¹-,aQºóF¢ÜZ­m½3 +S¡ì³'{ßsð슊ûmã<‰Ao&ÖwëF”vâVÐ9ivšã$½¸Mßäîm“ÞôE^“Œ‚TÆi²èyWx|&yż^è³ïÑäJt,“úmâå1­²ÓÄ “,'³‚ý’:Ö%u…p»7ì-I&ù‰{uÎ~’³/&Ý$™$X’b:%=o’”Ã…[ê#iÃjER;€¤IZ ›}²’£…â¦qä³ü ‹ë?ò;—,,=Ò¿ ° +$wL,‘ºÉ]àÔ`0 wšqöš<¢òÓwAòpSå¦-)rú9¸ à>¦†7"ÍîœþCÊ €n‡Ô¾¦¿öoHU)9ÿ@†«i¶@²ÿRq@öÁ@Fp¢P™ ýŸngøÔ ­Ð$§¾Óÿã_ëXªQ¬Ðý ?®¿dŒµôGüÅý(¼ÚÓ kvÁ öS3ÐÜCUX²©[\drÎY•‹^¹©HÓVò!,lë£oGìÑóÑ=Úø˜ ïZE9FxaÓöŠ^LŠœGý‘“ó¿%‡G–5tG9²ëŽ×ƒ#·#¦<…¹>÷Ók§+vÝvôçhÖ0Íñ÷„Ü&~G"Y‰™‹¢µ`Ž£>{3˵ $(Žx³û¹6•„²áøôéðàȌ{î£Vuar%ÿ½Ñþrç¡^aٍný¼®j¶Ëílk,ìäo©ô$Ùɝ6˜šó423Jãû`¼ñÂlžhÏ#M9X鯜ñµñœ†gÆ8î^M¸Œ6ˆ”*£F.nƒpr©*b¢°n‚Äw-4ß´fžaZvtéUÚ,aÆÐ÷0’©D.Œ_‚ F^u“ŒµÁDûìøÛñ¿g¥Ñ='Þ$¶7~¹ø¯} Ûíò…½HÙ²Çyéì#À·-§Ê…åì 0ã줡/>ʃiŠ?—PL¾všÖÕi6wuð3ËýükÉþ¤ (@¦ƒ‘Ý…B ̜ÁU Éov)XÜ¡úƒ;!ÑÍ,dÉâÞÝrFß;•ÖY=CIä»HžÅs{Å3 2ñ/’¼Àè}p'an´ä²®.jóûûkቘ»ÐîíàéUí}¾ûƒ÷ȵª|A~"«Ë›«à?7$ÁIYƒ'²BÚ×ë¡Ýí³Ï𕼊£Ó.)s”Ñ4 b+Q‹Ý¥Uß➜¦ -ëŠ'ÅNÁoGŽªüºUY¹®•Å“m)!0%´9Iß(èz³A.ÉCIZÝ]Pö ˆ`TMÔ]\@xþ6è/ÍPÙ-£«øÚÕk£#Ti½éuÎLÐݯö×Íë@î(B*3³Û–Õ¹›Ó³®8k­s·ßˆ+°˜’z%ykͮ̓O“s%Ï4©ü-~å‡Þ#%uîdÁÐ;ºˆHVoÄsJÙ݄ „Wg~æŒ+özž•»@[ê&6yñ½€·£qŽ…ì]AXÅ(Ïñ¥IÕíù< ‚xaÅjRãvÒ‡¶x¶ya»qP°5©}ôêaä¯D'²k! ´lR²cŽÞW3N8Mÿ§†Dҗ G‡a¶>’Râ.“œžuܖKÜÑÁmçuGŠ·ÙàþåĤ—óÁàóÈÉÂܽ·\ /]žV²éëÉÎ[°=9ıìá¥ô$–Q” ³ì³AlX2y¸*ôyæ×kx퀭‹Ð ?ÜãþjåO•TŽÕ¢†4XEE= dXùÊ´íå¤W7ߎsd=¾àdÑn.–ƒcnéGoM©k––ΖéÄ\Lš ²ˆå—Á V27ù1WHô¿$up|àN‰¸ØZ¡C<ÓxZ 6À¨æ¯•…Ñ<æWÜy4‚¤¬)ÁK$05SH 3µ© +:½õøÃÚ(~˜~“]rÁ_ØÈ&T™=^Wb+Fgs Y._ŠöW șrŠÚW#:Ø ½ó %§ÀÅ”aÒԜ×ÛwPîÔ~IZ†®19Ù#¨3™Å­¤y˜×5ý~Pmû¥q‚†4¡ÔJÅãœxJŠù“*— x1Å¿*É7²ÜP]ŠÐL‚]uü«Ýe]( 9t«ÂAÏü‹‚wò`ÐÒÅ<§´÷o:¯JùßEà͊¤s +LÒ*:¤"3†gUÀ`¥Â…1¡³Æ8s[µ +ù«­ò~öHíÖ0l¶7ƒCÓ²*åXÖ¿Rõ +ÔĤå FÈYH‡‰ht3² Æ-ði*ŒÝ´ìò™ïù µËcñäa'ŸvNŸoA3ü±5î€ye”e;…0hô=§y¿/³)¶ó¼?ÅÞ¢ iíaVÄÏXðQZ#ì‰WEi:ATFîn¦làW„!é º1Õ%ÁnHÙâ܉;ªÑ.÷>.÷5)ñ.ždùÈÔ(–lXjÌ!•h·´ Ÿ ÌT Ž^|AÑ`hwø-¿ÐÛAPڍxIrDH±Ð.RRšéz5f²+ÌWßk“ý\O¥²uPÔuë7h®&åÑ$:è=ÇÖ׺Õà@›\úÁ˜€DÓ4I±r†ÜŽ"Gn¢PòüA£'ÏnÿÐ{+£Uóî±pØ—]zFɸ­­7©Ò%m•Ø¦¨´rÓ갑\ÚÈÏÈXSÕí‘øWk„“k˜9X˜†­o)"R>ðGzçÄ=Ž8œN‡ŽÄDýŽK‰_*x4»x¡¯ûج ËÊE͵5Íc¨k°ÑìÍVñb/SyF¢^¢M³ó¦hо‚¦Û”}âAís#7•úKˆv¥TèìoÙÈ>W¾Êcøw5ã„| [¿‹§}%’6~Ày~3v +çýšÀ;G ÍZèqٝéӏ_²–Ë.õÄ*É|¿¬H 7¾²«@AàFPcéµ Ù€96¤öÅÚí¡š­b=Å:þ³$ÕI½èõ•¨À 0Ëdw˜~–Vnbë5’”²V÷úªe=֗hd—2Cë®z=Ê÷Ûé*~H¬§üõÎ_]Å!ÑÍÇ.t«Dþ'¨½Jéz¹ì‰ gvìb ƒ €9'•ÃË P”§PT¬øb–‡QУ“eVfqH½÷½<ç:§FñŒQº5š»³2œ>3ƒ±J¯L;'Ázæ]ˆh€âÁŽM Âh͔I\z +t32*ë—`Ê¢ tÝXúltžÐ1Ï^C=áÐc#nMùÉR’«ó5øƦˆ¢°µBiøöÚðð@ MÐJŠYeÙ(}ó!¡è‘OÀrIEdºéR,¬?BÄü.L_.@x¬êî¯ U݇ÓS·ÒÁ¨ +졯àÐPçôîm•wI¬ n5~³ÊEÐQ´¢2¥0~_!FÜt +jy¥¤KÒùžÌNÁ.1W‘ô9z† ]-€Ï3unRÚòü‰„š2ÖƤΓ}OÛÌÌz1!L\PR'_—“ ̒idx#ÖÝTÀi{¿½îí¨#ˆ™Pä+áDñ0ޝ\¨õ{9TàAådøGý/K€L@¼L‘*Á‡D$Ø=ŠZZ ž6²ë3¾öHÏ9lÒ¾e’BÑzŽNý¥ùÝGv[|D·Â;#Z1LzŽdÖ¨k!K¬²°ûP¯Òêµ4c£á^¿ñàÄ>ÐS¾µv+_A‘¢àÂí« ¡g=îÚ¼n^¥ „Ê Á?‹Bɱ¥\Cê"µ‘›Ð©€M英ޒ®ûv–€ ì¶C`¾~@½á3Šo´mzH¢ +ß +KÆ`‹Xð³`L23ù@¹[¢Œ€GÍÕQ[¹³6ìá`õÈ.âiº÷Þ»áö°3õï4“ó¬ƒ_'ßW¹˜+wæVWíԈV ś6ùvÛ5¢;y4~œsö„œ|™EÈi û½ÞS>T1؇8)ú¢{üŒëœt²I¿MÞ¹^¡”+Êÿ¨ܺq6ºÖQ°­:$øðtÛ%:{¸#Ž¢ãðØ8…UԟƒB6=³Õ¨Ønlâþ™AƒRé'#·€¸m‡`Hˆb€ºZ×õ(yÒ³³æ6¤S)6¾µA=˜»˜KiÒ¨¾òdÓ͐¬x1!¨SŽäbsîÆÅEьæä«è”ªrÅ5ŒEUR¨”Ýk¯­‡J…>¦µ˜¹0/j•åÐĶá…ÏW‰†âû=¸x¨3vöàU–ü„èOEDŽÙNN †‰Ä ‚þçUº¾²+²¡´íJ£e¯Ä'BÚ¡k4]‹Q½àtpk&ÅÜIQECXÔ ”¶G˜ Í¢_]¶é`9¢¥P9˜NDZ,OŒãº”×½"ô><[M7žøËáZúÝ ¸®Xz…3›YHù†ZŽ»_÷#V¾¢YØPë^1²¼k#Göâ’¬Æ.t;“­T­u\ð a‚d’3Û'ÑU…LtÚÒq¢£Á ZÔë;²8º֐ÉFmgo;— Êâ©?ÿ£® K]ng2·-?-2ƒûc¬° ¼1T‡Ñń<=ë#r. ›ôåÖÑ +’ÐÁLèóÀüS¥{ØþE=¡D_X9é6±—+9./¼´s{ò.§¡]ìÆâ0Á‘ûFÑ¥5rhºQ$ðî7‡Bر¨ïFø3ê‹¿®=‚4Á©]ôYgVé ÛOUqb!þC$Vñ†ˆ¬iv#M¢SdÌ¿«:˜k (!Ò`³'- 3»±Èų—-‡jRՉ¶ÑˆýVU[ö”fF`ÛCFËKx®ÃN êË7m Y•n"ÁÆà2W +®vÏÈ÷.éB»Øfݞ4þ^¢«êcÞ·‹c†6_‘W<&‡³¯f-(w˜/Ç^ým„° ]Âpf”M«I Q uŒ1fôKcdIæ垴üþAœÖKãI«b˜m¹µ_8P ˕'È/™ÞùK-yÌQü]Ûm2®«–Žß$кç‹F҃øÚÈ œhu™® E•=†“‚ž’öݒ’€v›¨âLHÙ0þ%Z×d3¤Ç;¬Årã§àc\ª®‹ýl¹ñ]¦+ËxXî Òi6”µ³BòåÆYž—MKÌn2¦2\ŠëÛSžŠÊ´6îN(ݚð±8÷7´så&Z5—’t;¨=b{i£yAíÿF?´b˜o'›fFÊ8ôèÜîÁ©Łæj¤ËÇjNŸ¬ —Ø[f0\b)»{„N¾·çÎÂÆ<]OتëØxî:Þ@ãmÚª`撀š¹&pó­zôIg’û‘¢K–lQ°óí]¤Ü€ÜO‡ìÐ#¢n^”íÆÆ!$AæÎÃ+9sÃòÿq»˜ýßÕ̤3ז`²ø&ÐXgnz§…ݪ!÷øѝ¹Jo¾™FÐlñÇem¶bgnê‡5Ï eKéK§3÷FUMHÚã 59sïûÎ<~IŽ3×ѽeW6`cinôÚ ‰ßã±WBlÍçgŒ‹É©[÷Ÿ·Ñüˑ=¥Z/«žþêKß»™Ѳþ¦.Cç7Ï¥3s} XToJ!‘…+›èyl9?€‡¶üÑREßáý¶ÀΙS¼R*…±X& *º‡@òØ¥tœOº©Ô•ש2_܎HR%–™äjԝâ®O2'¼éäƒ2z4Ó “§¯4ÕÝƑü)%hB~Yj:‰¥@Ú݋ 7[t­ªòdO²5ô „$…Ïу“:§‰ +ö}2´Ãù´• ç +Œ¶Úà”Ø«B%úÁñ`šÞ!ø±‰]Tûxâ{„ +ݺI}% UÍ?Oºâb\iÃ|кÐúg?ô#Ú¦ý î0J2Žv¸6Ñ×¼ ±‡9ý©óöN?ÿ“V<–ï 5ËŽkÞ^A:bn7¦~E¿ÊVêÛ!ÿHYëÏÛ\“riyK¸3_?mpºH;üînðÁªÓε/éá$ Ñý7‚¨Óó(r˜yGex븎FöåÞ']úʪÞ0iË/­PMAE´ Õ ·×°'&ȋƒŸ_r˜® þ‘Çîßÿ"ª­0"o;wúaŸ±:f°q¡*ƒžqHߕÿ½•PñvT÷‰Ô3ñ”ÕŠx.ðݯ¬áâZ¨€¶º¾ =ÈhõͲ3Oäõ}'ÿ¦Üó=ƒOMJžôyñöjÂP hÞ÷ Úìx‡Ûr߻ᚃM´ã*Z0[ɑE0HÕ×ý:Å#ÝJl ƒsçîò†(7ìÕÝ>îï­0‹pWU;î é¶çù=ØvÎ!)ÿÙqDAÙ´$NÁß옞N½ìW @²›°ùØœÅûQT Å_¯åi®FökÑF^ÿÑø>¦éÙuJEÎuÁD‡2¿$u–yv°E0KÿÚ ÄS’ti©CwTsqnf·[ÀN¾°Yneæ[昙5Xƒ™ ZâÐ:(@Š†±æxǓø‘ˤØx ûȎÓúû‰9 ¦é¦\ƒ¥¡ãØ#fffóÁŒñ]ÊoïÃUC’Äz¢·”H§Aёd„‹]Œu _ªÃÒ7ªê£!úE$Ǥ|Ž2¾5¥QáÉ®†áôØö¶Ë®‡«^åW™X5X‰ªº`eÝf6¨–°†3|ÃUÝ wՀ5 o¸¢¨U¢ª.,Q $Ê¢DˆºvQ‚bb "4öþ c c}ßP$KªYȁÈsˆÔp‰ttt$ºHˆ„DHttA$ˆ¨$(r¹ˆ¸AüӁÍ`Æz 7;²=ù3È’;²èöm]ÝP lböÝ`sÙl³}öÏ h´ÑhÛèBÛh4Z‹@„……kÂØ8$\aÃFÞ8¦¡é35…~: 2'úêêçûz¿ºíçyŒóDÝì‡?¼ŽëÆÕ!ž¸»óv€wwH·Ï¸péïÄ N'Íŗ®ã]ýwŸ÷¯ôF<¼æ¯xx‡˜÷©ëG§nx89Näø͉–=Ê9j d¨D½f“Ppâ¨D‰Äb©1–L€%: T"(:@pBNÎäa’ƒ„¤”R9& 9*ދ˜¨v)h›§ÆösG_Dn€Œ'V"¯ ЉÔb-€*ú‚ÿ%bÚ0Zöu™&õ¢5µ'‘Ÿ5ëç'qã辝åtâ´@;˜ãV>0%*µ09ÏûF–ï¬æ¶3Jˆx€§Åçmqþ·ðá3íl¦{쨑&†|Êצ©ü3–%†­iðaxëB?¿ ´|â=+ûóSößaÕå×½ª4H®gfÝ”ù¬óÖÃw±(RBSɌ=6^ ´ðULq/žä©éJmb{pàýq!(óà +·_€µÌÙ‡oÒÙV¶©Ìøa‡ñA™±2E;Ì +ã€w¨{ ð•OãuIÿR)îQLç“OJµ.h)¼ †0ß`›i¯#=ãtmŽô·~·ÀÉG¥ú3K}ЛˆŸ°»Æ ôÙ:E3’é̺T9´I\0(©Iø€ñë&Gþ ¢ºj¾³ÙbNÓÛWVÿ/O‹•” :k2yÚ0•ñ$:NcÍSì³îŠR@øðkIÒ;¼ ‹0ªÕèí|“ō–tÜJâH»øN ,X½ó쐦{ éq‹‰§ß :Â*‰ xqªd¦¨„Ô‰*Q¥T*p=nqŽµàcÿoˆbÞÙs2Ú®Âqs¹ЩCïFï—nàÐè5g¨Ÿ“ËP—]\¬¨Úԟ +w™u WÙ#7ÏBÏ׊Xd#Ú«êÍL© ¬mßTh»/*2\Øì1/ × º;¹?Ïp´ø«*VÑiZ÷l… øô.÷mÚùüÏÑ8ŒdôTkp´Yòk‘QSÅ´rn¥ÛÃòî}×:ÅÍc.fU¸ßþ,MHV±EÄÝÿC‰\’ñæGmÈv[lÿU_tÞ^@ +)ÀÞ •Õ€ëãå'—ü>{õ® ¼^†2Ì¿X(GA9Þ'ò_f…%W­¶*Žj+mހF‰xPy´þ-Ÿ›² hÞC;¤šàù0v¶}>f¦¾õ›j97N¿i¥$nZh)D}ïɀðö¦A<^låÒšÓ"GoÃèê/j1Ÿ¥¨è’P_k¸¿4Å|I_øö+ß8™44¶Ïd̀Ñ@S~ÿù×Y\q•Ö÷ï«Qrµ,LpëzI_ȑÅrK¸áÒx2aåÚqñhŸäŒ|Eü 9rúÔ¨b4ƒbãöȤ(\ O»#qAiwˆ­N&þb:•a¿ˆS-4=Ë-Rƒ'BÐÀ¶*…eKbŒë€™ˆG¥7Yi!®´¨ÎÐxqzD£í€¸ÉÄóšT_t„ÁvrHè™"@>?ˆ:®Ãœ‹¼9íî~¶ ä@KÈóÌIÔp6€M†*¹3˟Bxb@|oóû_«£Í¥ËcÿŒàœ9°.îNþH•ø êu+S宂#»™D#™ÌJ„˼P´6rp¢ÙPb!¤¶˜Ép×{Ùx•Qïa™³1¾ÅÌAQFxªË+’Ъ@¢¯øn,ÓmºVh>#l*ÐPnW `Fs‡®ÊA¿ûÍ»}ì¨X•$¤j7ĸ¹p AXàHFòêj½D¡|"‘*¸’֝ +á¹õÕ:+_’w|ì-ØÚmŒƒDÚÒ±ÂF[ÇÎófÊ{°ÊMDY¯²0ÛݏQí8öÌ$çý§úþ¿ß\|G2êÛn›¼0‡RÈZzÎá,;†Z‘p£Á…ò¢Ó¾ûUÓÄ<j»)*ÆCKÆÄgðÔÜݹ((fGe´5˜O¨‰”EÜøB&·[^þ°Uíþˆ¥b‡ ‘Ð…Ñ Ÿ~˜îቅ_y±bԕá܇¨Ì.ÁWšÙx©%V¨ç^Ź6%,ٟð)íG–ÖºÇ +W°vRHŒéÜw¯V1~®€æ`º„ðI‹yL®˜î!Ÿ7™{òÍ J©m#[u®%)¯M~ªr¯N±]yS¯Bᘧù6'w¯L{€ +€Ä±Á0 .M%¢"Öv¡Ár3‡Å/cªfwgž^Q¾›*\ïÉ?¨›¢à#¤Ë.w-ŸµA˜ßÅ£i8*DËÏ‹‚í`cˆ³Ù۝®›9KQö*s@ŽjÛiÑb’òd ÆRŠÖ^kºJò›"+N7ê;¹¡%• %¸’Ž˜¡S&翹â|óÀn¸1Ä:rºøfªózlñ ´ô†‡K‘=sƒà”o7æ.? ‰ÝŒ$_q|„¥!@Ho² ñi•PF±ZéT:Š¬t&lh6]¶´†[;K–oáv1æ`ÿà Ãô?ÔÐmâ1¬¼";ýkh³WÁÊAöáˆ*®û‘ÚHUœ¢ÚKíÀÆs±·x?׬g9#ÅúaÀüјtO®Ç#š$l¯†L}œ±4‰C »¡Z°¢çÇt½\cÍ^\¼ßÔSŠLÞ÷ü<Ñf7¦È;¥9¤Ò3}j/PÒ¼^Ü78¼"ߔÉ÷Xq=ä ÈϔŸU_rôxþ°1‰}ésÉðå¬þu‘šT|°³;Ob[/çœ1‘“ëré™ÂjBK…pwá‘L/º)×ð¤4ÃU]èå֗­òí5º"ÿ½L¤.㨢÷õ ÷A!¤K\ â–hè%"Þá MÚRpÍ8>6ÀËؖ‹„mÂÛ§‹AoúŽZÏȌ€@¶Ó´"Èä…4ÒvÍÊE”F¥¯p£ï>#¯þ ’HƧàóV‘, ºLlàåeœ“çøº‡¥‘úÙ×Ó8„¤Û¢êŠÉ¡£Ÿ˜XEšGµUÆ]ž†Ñkÿ´)`—ç4S †kíráTă7Θ oír‰¢®w¹ñCÙÙi¹%ÃZ^~ { oNV€Òǐ‘ì]nª4ÈôGRÿÿÏ4ð¢FŽ4iQ.«æ›Èµ2—;T^·´\. …Ãðr°è|£µ)ðrðó‡Ë[lc.1fÚ¤ü‡ ݸwÏÁΎdî…E«9¸GðL‡¸!ŒºSZôǍ´ѳw$aê"^.%¼#"AÀŠŒ]ÉËï æ£aüW^.Ë'ïǑ¤† )ë×*Šõ¡yhĨXn€©â–ã\µÐS]VkH¾{ø ŒlLL™± ì¹IxB-æå7ä šzÚºãC¹EÄüX@Ô.~Ðouwø|¿ +'ט‰b„›WþŽÈVeªUÂ[š±S ‚\6÷©Y,·‚GWÔ6õZgNã\òÕéhÝãÀDÛƋd±%_åßHOóÍã*°ˆ lp(Œ€‰½¶Xß_Þyø'a´ [0_ց:l3êÐäËrwØ +Ù¬ŽÄtG]¦ÔƏw¨ICwq´2Æ9ÚUFÿ¥çÚjGöè¾Kø‚›NÇMa+«Ÿ€Qô +>•tôMRἂDqQºˆ0†š¯9(_ù{¶u<ӉӼ#,W"ºj9«îèN_kfP4Z¡Žk1¼`G¢ó¢»ôŽB¢ú:µT×á½\É·÷<ãy ÒWËywŒ_|£Ž¬⍐W9®~:|ec5[.M´›‘ºKb—Ù8<Éêõ-ޏq·-¹HJ8 :Žel:8D±öîDr10Õ#ÅѪBMÁ5`nùr£#Á–ƒ’aP8Џ;ӑvùøV¾oA¤%GQ9ðõÜ$ähîŸáÑËbÍÿ1&G™cIË"kA‹9]xÃ× ÇßD7h£Žö{郣ÇÀ²àJý¡ÝŠPM»mÄ*å¾xªðt›|£ËIwo0äk-FöÉؕûr'o+²jKÍ놏H“ æéx€[ñ+6â’é*^ØQ>~t¶ÁCþM_E +>ÖpXܪС6˜D]³QÜÄ>ÀŽTÿMKOò°áQ5±Prl°!k›[‰®2ü5rnUôþ™^£O8˜N‘¯ó+¼2…“ÐûBkæ@ÑF( P¼•%BÁ¹3vÏþì¯*€Ü}5pë÷¿¤­Æú¥O¥èVá™H¬s|Ô80ÿŒÃñÓ¨¿0ˆ>ây ä7MG%^(uñ#¨4ö(\\k<ËVÁ~[~Ö¸üÍðƒÆ­'L 4ØQ\AV防˜ß€cö³ÎˆÝ— ÈGÑ8£Ð(Dý¢Éœ2׌u©‘²œÁ´ÿŸe™1E¯í–mfÔû2pœÉs¯ï:¦“˜­<ƈÛΌòŒá-=xI¸/D Á‘!¹Wžg¤ò&Äú¡€÷Á@;F=­—c)¼>±êÆ_Ñu c=aŒA0‚_ŒjˁáÏ:Á"˜“#xº5ň.æ'F(v"ù5Ÿ+1&”ÒæˆJ¼{¬EÑäãptäÃdþn‹7Ÿe;Œ‰çé†Ñ°HU檄A(6@qž_°mV˜¼éÀà@?ó¢aÀ€8±ú^ŒŽÁAšÏ6W"îÔ ×º(0É° >à¨/j D¬2#iêQüp/*êH!úõ‚“—z¼¹x ûàæû↉ÞsxÛ!¢#„MvácrhIƒ[YÌj¯Šd†¡ù)ÃÓ +߉ɢKhWÕú4QœÅ˜›XzK‘¨f3Ƴ!véÚ»“ ‡Î›îX]4d£B—x@l“⢹«º>.è€ÁZ!÷¡tµ¡1‹¦PÌۂÍlà™M—' éy޳Őh—SYX®ø + _…-Œ„Íl%ßOáo7íáÂ¥]†)fW€•^Vá©çŠl&‘E\âVXL6ç`cÊÔG²1/,„ˆ‹–h°pÆ/ó!ÕK>°p/«¿¢'Bƒ‚&Ô­¡<7%êfb]¡ˆ,2(c®0Èãà úÇmâŠýwù¼ýÊÑybn4^êŽ$NšáU³Ò\˜Wƒ„ %ÿÜ8Î/ù¾úõ;¦ŠÌI"\dñ¥BQôÖÆÃÇQÑfÙ¹<Ò/t©PÄHéL֒?EEΔÍÌ;³à`¿Âœ¢CÝÁcEQ¼;Hɚ"ÅlP­z£ÌÀ&€Æ}ß÷gß-<{¯“õD.n[zÖ'‘ìÖOÏpüµQ,sÀf%T=ArƊ›(â ¢Xê,êßÔPl€§·!9¼ðTM–;îYº8Q7dsT´Ÿ@õ©Â>ŠU¯ ôåë{â1=¡†óO°Lò™‰ ¸™5àñ†ð ûÑSFç8–ÄâãD‡ìØÑÁ^H(j:ŒÈ㶎¸‰h qxõÎˋ³üá_æ™` ÿh&Z…íû0ºg§@áX&Ðê”y2a¥Ù™•Gè‹ n((d—L´à@ ðôc„š=J>ÁyʵúQrÂX¢EßBmíÑ@áat͐è»*—_íX(‡DDm¸u¼Í³†©ÐƒŒxÖh¨  ¹À:ân>5’(k8ƒÂ8э>œ˜B¹¢! ¶W6ӕ‰Qa–±a—'ëˆ 2<Ç*ãÛ.#}è +„Ìtø-#" ‚ÿò»zFT¼_DŽ)¡&‰¡Œì[V‡8µ=Áqx¶5ĝèÒPGC‘ÞíôÌH*ýIDë$¦pâó&†kòa?@vFíÆ‘‚¸¹aMjY1/Ì5$“…õS¢#‰WŠOOplVxüƒË Èà¯BˆÜø H— i££„}€@|—Ûz‚æ2¹±S„õóïÀ•Sª òBÇYA™ ‚R¶A¤ã%J!ÆRݯ»>¦›±¤ „BVXàÓIY…Çð(  ýd€èÅ8@tœ`æÿàûú‡’Çøþ€-Xä¸?3ºÚïÐÏÕËJœ>„Ý×ùÐdҊÐ3¼|¨Uð=?´4ãÄнǯÕ}]Â,Uê,øÞôౄ’у™ +8Ʋ…èØúkòéo¿<ÔR!ôR—š<´ùñÐo·Ég~ö/ëS z?¹œC2¸T•]×;d˜§º;Ô-­ÈÜ!wŠßõà¡!Q=71ÞŽ#}¼†PPÄ.N!U)[bÆ]vhƒ;x‰ÒÐó@)ýŒ7≱·Â7=x…µ ìÀ¢jü…3ÿ÷_^5¬ +ÔF{¨Hì)¼ô&6‘»5_:¶ýïЈ}¯Òú:ž}Ðp Ñ'!lr’¢¯„0¢È'·ÙÝï–qâ {H!¦È­ ’’‘†m L^ í‰{Ҏѳ&-c(‘†Qô(ÕéWAhf]ãC‚²q&I……9¶]ą`‹Vξ¦w}m»`± ‰ÆV€Ýl}ZïÐTJƒ7—²…ß`åaì+H°Ä’ídŽpfgiJ€(ÍÓ"¾Èj`¦^:})Ùðˆh–DÅô‡<’–HàD(9»õG"±n8÷½ 9qFö ÜçÿUäà««cÏEŒ½s«\ ˆÛ "<µBkkU×É"áßևÐQ„ò½Ì.@D˜“zùP2YڇO-ZÐÀG" ã+Xˆ*oeՀ$‡Îô±RþC1’ÖAp%…ô;Ç^T”¢P¶Æ•D±ç+vщ.Ü«ñpVR¦ôäå£ ?ŽïÔtD•K6? )I¶ÛMÇ퇇 Ó`üÕ¬c“R4ÎŽÕ CÎ(»á|Â«6wu1D”@ð—,êÏÄ·„„ÀÎÎPMú}ÈҚ"VˆøñõB<Ièa†¨L¥ ‚–M.l‘ ‚¡C t6Ür㊖5ŽGeÑ¡i8Õ"¨%€õÛ”t§Tၝÿ4ð,T¬O+"‚¥ªÌkˆÒÉÄx»ßéaJþâüÔd|&Ëúâ{wòŸíö<¼£ÒKx8H&Þ}Wڐ7|è¾ù#TiDçñYu&ỷûúÎÌNP¸†^u?ä‰,ÛFÇYeÏÅÙF˜¦[vÙæ÷…Jsç¿4¹ÅŽðꂻ yÄܪ+ ¡‰æ"2óÇ5ÝP —˜8—4d8‰m¹÷…ëò !{JBðWÚb…/KéhƒÚØb!¥wºù¦£CñEý1ŠSÉMNî´E"ír›põhgöúüà„#H ”Í&2AÃ<ÕØJÂ:p–8ÂÙ;L«Ô`{`ËC¡*÷¸ɱ;=ÁR`ޔòïÎç/¥‰Ý™’å” œ$d¸o  Ý“Ù¼¬—dlÒ5RÒ³¢Þ<†ì´Íycµß(Õœ ¤:(zZҊ“Õêv…ÆkPߍOZcmE2Ê4ÿ¦jڀ4úœ“†r5VuŒHNJºÆ͵üÛ÷œ"_t™Õw!/f,)˜¢FÎ +ø ›2÷BŒE¢¥ªä‚zòîJù¢±qÃDÿ±\ÉNEJ8¸`Wú_Ú +e9°º„Xº¦ýçX—‘yÆ]§£€f„ag{¬ÆeÛÑæUÌQxÍކA¢zÌþ7µ{¤\#ð1惟ý0{7AŸ‰7ðѯÁ°dIËÑΟÊ]”}#è&Ûy²¸ÖájÀ_µûØ1†„só`‹Š…²Ãþ0©$Í9€hqt +s}…¥Œœ€À9ÙêmS%Oιzê‡$å9‰tèC$µ8~3¾¶°ÉFQ±9.ÌÀ‚Ë},ηd|Øü‡6spA›)Ê7®¾,6€Ô‚›a<ï‘ÑPm£œGJ6È6f FP… òI䐄ç.ìÜûÀ‚zVSâãô‡3d¤1cÃȊ!A&áX'ßÄK¯&Ö»o!_Uþõ§|£ð žq…I…q…¾·-ëDí‹Ë~ª5fO³áTä±ßÜ CwåƒDÛä@]ƒßýâë© þµ±>éfX’õvpqDz+åµF¹˜ `z©Ò$Ë?aÌ8w½¯Ë2ëj Ø>ZÑ6ByÞх¶/6Qu“Fº!ÆÞAúÄ]Ge´8®ÚX„\Ù¡$ôî¤Þ°ž€Žúd·>ý—ÐN’-ºëӓóÀ  Í¸H+¦2—6ÏE‡Ð?€\û¬”†7dýíŒt¬:‚hABZ 7RÜ Þ%l™ÉEV5ýá÷IÓy®àSrG£h{c ¢UãHÂ1>=¢`:®&zøx¹ JüAُá¦ÏêúH€¤mJšÚŸèÀ}óìtꀆŒ¹“ø!ß@ƒ“ê–ü¨œÁU}8R${„ž=æaeÏz¯×ãÝê«,ß0ÇàµêåÁ‚£˜ÁIP=Òú v ÇÃ%Snþfƒ ïœ\Ûø’-É óí¼—4@ÍÇôAý¡'*Ém‚´N: +·«aŠ½øŸ @tM–¤øÑF_há%B¥$ofJÃñ #ª£¾Œ´6R,´3ÙçD üð‹ä)æ@È,ê6.da«-4LÂjmŒ9V…Á ¶1´Þ;×GìaBì‘ ÿTž²ÏH@²E’KpMñT"½MßKÛٱƴpï! ÈXý|DYEdßÄ°k ægŽS¢šò0䪠ÔCǤ#¿Šî‚ªq7Ž—†R†· › õ5}Nö¹Ì[¼qjßIÈ!êóá¢ß§f†AD›¤lÀd΂Ò8³µ×K+öÌšæë‰IšM–TÛløt6óëj˜üuD&û‰FaCtëeÐSÀÈË2b)Þ{= á,Á>ðüZ‰-ìB—ò>§9¡¿®6 +ÙÙz…Ì'ÏLMØþ}Ak1»ÔÄ%ÇdíOT]žlçZ=÷ÎVø¼êP`âd»¿R– +ƒj¡Ùaò™>´k ¿WØJ\¼$œ‰t¦GÕK/þªôF¤ãÑûÄ®&ó:äÑÒ$ãé‰ââj}ǿݗoJ ¸Ö7þ +‘ŒM&ŽDTŠp³bÊ­¨-qýÍ."UÖ#4„©^¤¼K‘ +d&±€$®B„ˆžu„Ëk\…}Ã+ĕ[ÁíÛ@eË,`¥€f„e¼‘‰Ì²@¤ÍqfýͲ—U¡@•ÀgàhˆK\Ââi!y-”¸Nâàºã:ŒC½e¸n†¡ß\Êð‡o@–\à2 ‚¦dø´dð“M:_ؔ£kԒsŒt¦Úx^HˆUrc£W«œuxF_ W~Lq0v4&RÅ5ˆZs™em—Á+Nœ%æyöšÃë¬<~…¬nŽ„ë_ t•EY\—i¸PÑ)¡Ëâr]³ž¦.6)Ëô\„÷[>žÃýŒâ§ƒ°“2KŒ6öÍfÄÙãŒÄ)>(ݖbΪ„xQª…~P¢ÅÀq©a)V|ÂÅk¥{×ã½y¨[~Þ*ðä€úÅ%ÓÎ0¯¼ ɽÀ…SòÁÉ} η@# ‡Â6pÒ>>%&‡€ÍË UŽq­|Ä «—ùákŸ5 ·AwfVi±ºD9¡QÀΊ€ÌŠÁYəèEyσí}kç{+^ݟÐxÌ¨Ç /®™^-åÅ0.t^ŽNºƕ¥whø–ÖyCìf öî ã1®xäŸhÍ “‰øé8Œé—hj!ö9™hÆªÑ :ëÁ5º5®¤ÿïa¨9ØÔðdòÜ p?ž™/„8.‡bWMD¾cã“ÁSºXƒFPÐ]qœ½‹|\e™êL&n“R.Š®rð¾Y-&F ‘«$æw"oyqÊ»Ä_èd€íΤnr—%¢¾J$H…NÀ‚fµ*¬éßG¼„ 2ʅÊÂC²7¬;Î8ûq”3 ¦X˜^² øR¥™ŸS?Ÿ ŒJ„#ÇÝ}aõ1v‚ ø¹“lwµ=MˆN‘ÛhH ½fè[¾´,/Ø4—Õf[udTÖij0†¢hÞ+CéY`‹ìfÁ›Ýů-'.ûB+fi½ÅHÁO‡É2Z¡Ë¡íM][ÅÉq)®Ð7Œ)¿zH-öƒ DäŒi|G ºòLó¨N(ïÓ®t¨ö 1ü8˜ÇÏM Áßàe×k @Œ^åӘÿé¿dšÙsø‹EYy­ÌâҊ2âIÜdÜf)ЄAòMê"¥@ö{T.Ý3uÝÀ?3TþW?:Ø­Y,Y$;VRYâ7¦WK1÷±TzÅ°ªÁáé'ƒŒvw’Ձ` ó ®•í˜A”ŒE“•˜[„ƒlº…«ÂÄ€@yªh½‰U £Ø#÷ܯ¹lS˜@‡buP2 ÓúÂ3^Rö"¹¨™ò±°£¯;î°ÞAZOyM̘€“¡¼îá›e ñ+’`á{—ýjéd›AÌ¿°7ÁJClê-õtnú˜+qéƒ*†ùÜ·f$ óQIfî‚z`ŠñÍ}µâ°pkéæí~`9v꩚ÙÕ¦°ÚÁN\€)Da¥>m*ÌÀ2‰ý›ô{Œ…ÈÝ«hþL"9°Š‡DB‡§…/×ÅXƒµ¿­|…©M6ƒÚùmæ.Â#j» +¢Z0·àá +ZI)þ…¾G*‹ -K}DZ1&¨§êÛÁÙúWüGÃ2&Äø«¤‘D`€,6¹é,w‚˪?Oٍè¿Jß²ó·XÖïç;å1œc.Õuæ…g—Ÿ¾ú;Üç¯Úõxkê³Ë-êt€Bや_ ø÷–‘ä×0¿ $—hÅa•8ξ:OPÆ#‹ŠÕA¯yيc·4]ÇÐqù:4Õ¥%_~Ò5`¿îl‰îøò•u‹¯ÔKá̪¨‹³Èr<`­×î^aõ)!Â0é „5ó]æ?Š>ZÕ¦Ý^åi஽ÀOzŽ•Ð²ä=üi£Ï¤óñ:ÿ^o©Ñ^£€ô»&ÊkÖRÿ®kœŠ´Ìÿ*žÝj´·JðxÙÞº—Æ+—BÔul°·xy÷µï¯ÌÞßͱ><>»ˆOéÛ»—¯‰Jõ]òäÅ¥Tœ¤Tî]Î?ñ]Þ%W"« +ëß«e!/a-)XSܕ@nː5LHéhI¿jÚµ{³;$9áD§BÚ0 »*LþèD×ű4³¶®Æ6»¢²¹zý¹t`°ê +*ŠÞÔ*E]Ÿbæ=]µ8›.Ê¡Í ™n—R3ËyçBTê/¢EMpµ–KÙ6%k\9>t€vi<èÁÊÕÓ\- Ƌ(gÉUàYª Ž\½ƒ{+³Ý +SGz«Ž °V&BN\&ïd‹`†oÄBäOÚvWp8Y4p%%ƒ[O½òQȹ~è+E>¯w +¬˜ž€žXɯŒUž:sMÖè\Ûn‰“n¾¦ØÒ)´­5£3žÅƒŠ§_ŒlE¯Õ÷õXk£[ËL!tXk Aç p¶ „›1ü¬[¶¸Ez}ˆBàÇ—ðT«ÖxʰՈtG2b§5G|)ÕÊüصj‹Ši!Úu‡êâ7‰—ôàcKbFC ˆtÍ뾍ر-0}€ïohdfë‘YÐr Qƪ,—Á÷۞*µuõ¥%šaísk•ÖæÜÎ )mŠªþÄmϯTöZPaìvÄ<¸‹äÇY"ハÈE¬CË á”ÈjŒA`Éç.¨]4¡1‹pXÅÊë‰$¦"´Œ?įZ‘‰ù¹g鈰<«=å; ŒÍ·­ +¦ìÑ4R’ûC«…(ÈúÊÇܱÿóp¢Ibïw»˜EU(BÆZ¡ŸC#¹Jáb)°„öC:.^3a‘uβÆPa&·Ò“¨=°é/~1¶-JG„ÿfžH´K£¯ nͳN¿àz¥ÔV ú‰æŒAMÌ%ÄR +kĕ›à)–õr=}‘Ó+õÙ³%Vëƒë0b¥‚›H(º~&å¢K¤¹ KÐ莋žýÐUÚ0ZV0ë7ýÁ²ŽÕðS›n°ŠŒӆ1Rî| 64ÊE‹“N °¼¨¹g´]u¢¿S—<~¼Ê¯,G.7]Ô ãñUm î½W¤¾üGú¬WEáèÕ-¯ì)NÞvÒã³r%R_•‘鸹$í¬³J⻪Æ0þ®ôWSO—.?\‡+ìVpÇ ŒÜEც¤š®"¬·{fœõ“©ªµôAàہú‘2jpd¦Ä»•Nþv"!Ø»qù.öl•:Ú#¶Jܪ¥ +Þ«XæóZ¹[õ•Ö*åõZ­J7Šƒ<"¨¤YÞoۂ顕Ó¤îßRª²×&$È&ø¬<¥jo¥F4íúª[Ç)R½QÔ[vŒ ¤s¢vó](·zÍC5V.q–°õ\ÂøتÛׇª(£á(±ð´‹ÆĊ…í\ÏtFó«ÞøÎh  ±¯¢€åÌP̼*6…T¡,ª« +ƽZ`Êqúà­ú®bäm©¬ˆ‹…¬„Uë´§‚’K8UO…lî,èueU0òcÅLf¤x a¤g²«Ê ¼ðFQ–)pá|ày8Z*"“걧һ–´!;§‚=øNëƒúƒÌ™vÆðÔ-Q&ÿô&så«ú<.ÀµªÌùì¼zg(÷즗R3€Pû”“N¾ŠªÜ²¯'ªÎ­š—m†Ì}QÕé¼í¡J,ÙÛê¤hµÉ†Êi $,c Ð—Ìݽ˜´‹"hIୈ̣z}d2¢T^§¾T³-ý¨;ƒj ÓÃukÏ^»J$uÑ©“<Ϟù»3mý=•AÎÄzª‡ŽÏSíÄtŒ§Òœ}bˆ;àùÅôè@8UôvkÃõJÑݔG|Û¦j¶ÕlêY¼…òq¯)~¢US(Æ4ugNMY„áJaÿÖB3Uëã,àLRò# ‚”’¦/.VLñn@ 1Y¥jïÑԄFQÂ(5܊J¨dñü(ÔæèHÔJÕö¤¯âȳàMɒ$ta³K/I.…Qª*Œ´Ÿ¿“ Vqðn¨!Ÿj”»U!‚ ¢}T%ERɝ§Þ«z¬ž×èH2ºpfl÷SŸAIž‡¥Ž +ӈ_ßà·"qTÅH#Kß( X-|´LÃuéÚIT·#Œ(ð¼výC¡¾¬©€pG€wÝ¡`€[ļœEýO¦¸¢Ê)0Šˆÿ󑬤ǩ‘ÏžˆD0B‘g$Šˆ¢ ŸŒýPi ÝCÅS¦îPýF¯.š¡ô ÷M åÍO¿€uíÔòÀWX¹æ…rñ7él¡DÌ +\QçJ*Îw¤´*Ïk¡ ( ÍQË3bŽêÿ !ÿž*!j":i¢WÖªÅÜ,ÀTò'<º|øuÿU¸ +_CýCÉOÐ#¨P¦  B •¦¢»ÄE 2¨¾m퀲çۑ`‹…®­4 +FõÝOµSÓrãp¬ÎŠ<‡R?³³~ê@‘®ó“¨õvÕ¸™dæ„G÷Ã3[ãP¸6ó¬¿5¶Tñ(· 7‹8€]ÈÇôa >DĪ0D¤r,„³;ºY;‰È#T—ÕÍDÓ}×}PΖmG‹«S1Oyø7¥ÛTÊâcÝMÕ0ù0¥%N̸±ŒÐB$U›Ø‰Î‘Gº´2‚c­øTOEôÚpfÿ)÷±È·c ©½LTÁ÷qYÿÿ™ä°åÀ©üP¥£m” yh] +ÀÁãWIJmB"@EÜö'²®Ùê´wª&%a†úÑ©”[šaôЬ¹0@N*}ŽûXWd©*ÝÌísǤƒØ9pZ X(’Dõ~Ôg=tYå8,¶IćOÖqº[ÜM^.LæÔ&©át ZN÷IŸÍí2½jpí=)B¢{(Z©ù*9™XÞ÷ÀÖ;)´Ñ´bG0OýPQúB‡;ìa=o&Ä9è¥x­]H@m›HåFê™ö(®-Y‰2q\€ÛЯÎ;mG¥Žœ8¶¬T¶^W¬O8ñjÒ©¸#ÚçY#£S€©e‘{Å@¢ÍL@¹|ú·%æJ=Lõ4]€M·qfªÈzól8H¢ŸéFdÉU©,«ä Ê Ô}±uâ ~À[„ƒOæE˜>˜†fDàUS´-$dzFù–9{Ã¾[þf¤ö„#â> »[&ÈÿÉÿG¥la$^"xqVú¼b'ۀ=! !Òf„áø.݊i59$Ûßç÷.€Ž®Õ¢»AÉ@O¨OæÔ3Âs´5CuíYìœ vK]È/¡]QLYhÎÅy}eÀBÞ ¥£*~d(Ôö„ÝÀvKë÷!ç=ä=™ò힐=‰œ¯ \\Áh†®¦žÞ •gB–îÇ5 ì­[ƒF%@›3Ê®þ#“*oM#*ù': ’~ßáÞÕ7òO'œ[æÿ¶X˨f‘¨<¼ªNä™Õ—˜WýÅ[™ ֖Âp fDÈB>HâJXD•ÖeJ¶£"33-T×[…P¨‚oÛQ™¢T)ˆø£sëãk“G¹<ˆœ·ÊÞäÀxkÀ؂†'Ä'Iñ(Å ñÂ1J_NBþÊUe$ç·C©`CS,Iaû-û"èY«>#^{…L-^–TÝp7Æ\øڇ‚óÉËÓ¹ÿ\‡!ùk†¾$RpõñM¸¡_ûëë DS:J$šÆ +¡àËu=‡®D÷ÍíñÂB AŠ¯9š»ÖIa !Ñáű›”}£òçj]´âo®¡« «?ïò Mí‚Û ›%É/¾²Å9…¶­€ÈÿÊ%k|®Ø|«Uhà³ou|K†,´ì%—=ѓ,®Û¿0çՁá@êO2½Žhè`6¬ \ôˆ®²£&—døëjo¸m݂k½‹Á5q{„¸.X›9Ê ®ñ*\å¬\MXŠÃ@¥´‚'©*ÇWYš¤|›û)9²÷í=”ZŁ ªg—M“2˜†R[•–,£-˜Ád~—•@@ ªŠWç·cýš«ûV V’ìm¾hµ¢mYALfu7a¦—zA óD×ó_¡ßÖ´ iƒi@l@H'œö¾ÇpEÆw˜(Qõšas)Ò⻧‘ˆKÊFd”âJË陨À!ñe¡àŠÞY?œ• æa4vXsÂka¶ž%5 ™6k“-®šz- w3k‚Où’£nþ߅Àg<“<¸Çà©Ô+ò.7êµDŒåæ]C<è@›7égÁ€²2‹u[qA½âAók|¶Aàoì/äC&³Úþ–Ðdy<¸ÁfeŸìŽJÑÖw!ënBvÇF—†½1 t>.¶UAÓpDž³h@ÍÄ¥ñãé˜rQo;Byz-4\¿ï ¨“í¢3ÃÏR§+ŽÇ¨W˜¢ä+±Ý¥%Õ,;PR~£u-k£¿ÈÅ­ šÑb$¹$šE ú=qMp¤\©z1Ì L‡™Ùâ* ™äú ±×F³ÂPÓ5Ó-à”Ó`£ñ $N®TœnùäÀ‹Yª4ÒÜ¡\–ÄÎ÷ŸŒb±â.©Êù[™a=©J7|âwTx~m³#óØÝA÷6c!g5 +N˜•Œ+M®ýBùŒ™bᦖ簜•6º€*°´2fû rÆÑÜã䚊ǧ¥¹•ât€º9*Zfw—3-Í2ž˜°ù!Ú¤›Éø2 +÷ ›PÆ_ÒÁQM3ëáò­6Q7¤ó^êY‹n,QkØ]R­(L|£s}†¥ëwž0 æèV_/šÉáDçˆTŒ¡¿ÀÐ.y|ɟyíFÍ\°`û-Å4L°[£ôSt%“íÀ@鏾‰hÙ -ë'bxÄ5]º 4I÷@dÈÑå*–#úQVìø™14½ë1<›ö)v +ˆýx̜„L˜rª¶jÖÆÞd¼ÐySŠÍÁÿJ(9—؆å4ՆpÓù†/å+‹ÿpø +[̒ˆÒgǩëÁaµñ‚•œ W‰"$æˆyê „Á +ÿ$Q·_\$¶U½4 ZtÅn·†š«øL1§s/Eq”ö:™a² ÚŽ±ct&‹bõ†ÆŠ¥™˜ë:‡·|>ãÁT':â`:Ø~Ô¡¼á`W€E,aa;Dè+K‘·÷´!`½Lj‚i6ŒÌ4–Ö*±º¬p×£„»d˜òD¥;Tþr"£ƞ‘ê÷ ŁB`=Œ8žËìڎâx2 ØóÅ—%ÀÔÆ~Œ|Di/ pÃI¿‰)É"@þb`¯ Â_"F±“¾ÊFíeêWóùBçÍÈGçÝ^×å 2ÜÆCo½eéå,Ýܗ¹eŸj_ýóob_Å¥{ë˵ȩMlêЮdùHçȖ‚")²Ü—V¯¦±¥è˜¼OÊWåfºîä¬ì#_Õ_⁰Jƒ—ØÒ:’Xî¢çƒõü²¬¥L:Máó‘/ðd˜k풱÷zŽl\nCh¯›zdÁ,}‡½zÝÂ0­©ké 1mLi@/|¨´?*®b_u-:·SU721¾+.ƒì—‚43Õ¼|dé±.°c^n!FíMy#e^Š‘©T,ãþ¿V /°x]¶BX®‚³• ž6æ±¢°Âðn¤a#¬SSœ¼Ò2àdUýh&nª{±×»Ü”,!'tš¤ ÓrWåäɝp»Ø׈1½lñ‹Ôµ«U?ÀüDЄaÀ“]±³U‚.íꋊЮ¤B©êìšïi!äÏêX^×öö*M¿ã™cZ65f%傸j1¶°í¶“.àOùw®X㺙LžkDØÅUݙçj!6¤å4W‚²‘³í™—‚¢ñ +®zIäµ@ÓQYäbm’Éß}‚@‘ï-,Á_&åT€·¦vW þKžL®p¸dÀtèøAdñÔ * 0"ø]ö;5@å”E-áò·*<´^ÒÅodgÝP*æÿ9}ÔÎú¢üîњ‰2š[EIàÈ-.f±n‡­yXÀ-Xêpˆù³¯Ó¡\€ GÀf}_uŠkí ¡¤¶8Üo±ª"m%Ê$­§̖œ|­STËÐQ‡R(G¨–iÈ DDNÐmÙ=.`Þ£¯%®UŠÛ~ږÁ,U7$‚´ OŽ›¬V9m¥Ð¡Â"äüVÙ[EÑt%š2êŸ ­‡“1«+bÄ¢·ǀN'fŸÍÊÌ»N 7ß2ª’mrþÐbÐϔæ a Qåjˆ9¡}6žqò¯dúÐ)©:+ÅÂû”_„õÚж„›¡ËY6Y½ßW$§zõA6›êÍ„~xÎCkÅd´°ˆªh5óÎTÇ:â!ZÚï+ÊлòC(›DUØYš=Ê"¼b×f„|¥­o‘5~Ë̪ÑJfUçW·ÞsbVu¸ÍÈ#ĬeÑ2-VVc5·†¨¬p¢ ®,lŒ×JVÎÍ:="÷ ÿF²LÕÈY>ŒeV™”pE)È$þOS]Ö33ËB·º±”·–Â.óŠëX¹çUMû¹æQ7ùêšâ”×NŸå!£eÌÂÆB×.í,=5DÕ¥?©±å4±B†n¥×ÿ8®“*'bAyët/K0ßW¤¥±0¬v*_Q7rPXT$¾BšT€°Â)þd ƒ¬5má;Y¼J+¬³°˜lºyô¼,¿r`ÈD¿ªNÂëÊÀÐì«Ðd$;Ë.úŠÇ°æ o`3¹O–_a¢€<€²ޓC–ÅóÈ9ëIô± Xoä¤lb¡L®ô/ùæc˜:”ºªN6Nj„¾WÎmèJiË©ªölÑñ“´°è•=‡#j²,ð®ªé\±èzÓì±uØõ­¤]XŽ/o%vU ¶S«ûÂMÈ²L…ˆÁŸU‰…̤J\Ñ¡Ë+s )µ*6Í*U5Ïæ¥ëÛ#¤”îŠC $jù,¡Liƒ[`X …Ž|°’pè_ÎÊ«–F‘ +~NXyd¦0^¥RPóªúÔq£êK¹‚ÐÌLÙ]¥`Rr1ªÛPþcú•4ºF–ê>©Ù©cEJ›U`©,´"VY ²Ã¬Z;ۗ²wÀŠ÷áU•y`òU1°¥W¡–.Å«>5»Š¬üBWµH#ÙÂU]„¹U‰HUت4AzÚÉ÷±˜šT™Ïwx¹b®Ô¨L¶ø‰g‡€UՊ#Ér•)ÌiBˆâA€ÃÕxWªêWU©Š§PFUŒR£U`*q‹ø~zñÈGåW‚„Ú(y§pbž#ÈTlýæ¨þʞJÂm L¡ÒÏ/•"WOKIbR–Üž-,—:’Êd­!ÑCÃÙÿSш¶n*ePãñ¿3Ö+Š_½Æn¸Ôþë¤Z ÏñSÍR¡aòK6‰÷&›XÜKÉv ¯ÙâíJQeƒ=çɃR2 …f +à!óXy9¢\¢²?V Pü)Èêt8ñ‹u:ãÕBe+ÂrU”Au¡ÏÕ^[ìù'ÅOdYôT€¥œp?3Qs¡ –³±7eîĊ”«Â•²öçÑD>¾–ëÅ¼ì\¨ +Åp”ÇxX ä6ኹ1{ÏçƏç:%ˆ©ö¹‡éB é輈SsíÜyÅPþ*³žbÇÉc¨³ï^O÷2Å •^ñ”RD +ñ¼M°¡ðt-Â@ +#¹ BÉáÎ7€ §E¤Ì=Ô«‘XÍyÉ(„+„"v+„~T.BiGu÷ŠÁ®}í.ú͕œ½ [øí¡† æ‹Õƪ4í>ÊߞÅ#vn¯ôô‡ÛǺÞ¾9+»½þ$¤PŒ3¥c•#Þ·¼ö çËvqm‹è+—ƒÛrúÖÙsI~<5Cðö Óû¥é 3ÎöJ A%Kšh]–m7¬ËÊ\뭝)Qå›-Y‡@ <«yÆö +PCqC#W +¬‘Un!ünà'¢jxj+ð8;ãûÐ|5œßžÕ·¨Z=B0á2pÝw ƒ¢d«ÛY;r§êØ£¾ôQèn¯  q?¤vS³¼ãËRÊI1Ž2hIŽmMïeæùTqja¿ÞqÞ ªÇFÛ .DUsjÔEW¬:bðôÛ K0ÒR´m9ËqŒJ7µY-+Uh|&äŒCœY&YD –ÿð'©nÉÏÕèw‹F’ëHx2­ÃT˜Æp ÞÐë—&k}ƒp6DØÊÓMS@Æì’rS">t×ÄÛîˆqES $s3€ð4a úSÇpšs6­ ·˜¦‡‰±J÷‰àÀ=¡Ñ +ÍK²T£¶È®ag¬ËŽËj¡ÛOß~þý,ÎZ%OÝ) yÇ1Ú4ž€Ý|fÊ3e“!)CŠÒ³BTöåªÞ³hœ¯î"X +=ˆ-‡*ó`i"‰™¼GN S“-ªìyÑz8í§ô¬*ˆü"¤2¢­ÏzªßÑWÖý²~='h$ÀQ&ƒ°&h…OW›Gâ-܂^&ºä“ —¹ÄH5عßýÆ¥© eLáÄQ¦çìûúÐ0žCe0Bèi%ä$Ë@1ÔEF©Å}ƒäʀp|)üåÔÙ\nϏ.•m»WšŽáĆ wCÓ +á<ÇsèÊVZ©¢Ž5ò E¿Fd² —Bj’¿SøȎzwIƒžÍsHtIËà©1¯n’‚_4D䡙$í£F2¾¡&b<>%ä(_‰TÕ‰¶5N‡· z/yÕ[ùəµì |~\Ê\UNX böøœ!ÎûD£ËËE_7©a5òÕÕšYo$JK˜apâÑußAtbÈYïyjÍ%fš‰²4FRb†C²ÈC«V¶˜¿È¾4IGfI¬aPªà® Pª¡94ÆGS’g[r%«d{Жg †-Mþ`.œMmMŒ:³@kÂKÇè0ÚÂoïHk³TI¸Á¶u>½æ˜~"ws hS{2i2¹ÛOU +î·ÂñXeÁº úa%­>‰^""IþÊcº‹æÊpæ€;"ÎLÓ ?ðí H±ނV3ÄwŽŸñž¡³÷&Ùx™™ -øÿæÅ ôŽð†,ƒÇñ€»ZcC"Lµ”õ›ÄÿÓá³ùâѳÁëíT2l!%A<õXªÓ+Á/Èš¿°Ò~ªDa‚©÷ÜS¥‘wÿ‘Ëʟ¹pã)î?’¼ÎÉù,:Ö0‰‹÷ᝁ«B¼!=­,Œ@Ûå“̒²@W +¹c°Üúél$ö²÷/%A#àh™J9M—»J¿gÁ<×JªÒüw|‚Ýy„Ž8m½–§®Ç§ÓäJ—†¯MîhœÆó§ãkdd ”ŠP9‹'ßÒý@hg‡¯T_¶”gLA¦,)ÃoÚØ#ċpz«©P·5&ž´‡§þÇšª57Y;Œž„Ûc_SÛJ;G«è]‡…Æ“ÔÌg D%„nÆ)nöÒclPe$(K çyõw)ˆ†Vª‹WlT'lm¤€ d¸qm’þùPEÄ]mä+9?N@"i»U²){¥?H%µ ùI +Ä2°‹,‰¼7©TЫÙ~ž +g¥ ÞïóŒÚdù‘„ïç°°*í]G|s¨šµ¹i¢ ¦¶¤Ëz²º[Øìz!º¹YrêႱâ֚ 9‰ø÷jî'É/_Ùc‘ôÛ]W'æ00!½¥°È`Ü%ˆµŸ”Ð^ñR çV†Q'6Œt¥óa䥳 +$y7!B?@@¿]™˜yûàwþ˜xc,MŽÎªÌì¦Óþ>2ïåçäqqÝj¯Q­¬µ†Ö>2ïÿïL9–•wVæù0}|ĉHÔ!A$ˆ  ’[<29ãÏÛ¢ÓÉäŽ<Ž>ÞÀ/ý£\Yn(—k×?~çȦòpNâÍ<á ɛ<ömT¹Òhð.þz]ì¡2d֙Ãι̐υÆ0KúND+ª¢¢¢ºª*#3“ù6²“Q•ìèL?"'ÝH G$¤$$¤‚АÑÔkT‘ý6ÂLÆ•ï÷žæÊX4͛ða­+A©þºÝÇ-–ƒòðC†æƒ?S ±ÛÜÎÌ;†ÑûAyú  Í¨$^ÓPP¢8„Â1K.ƒú€ " +p&*DB`PR!ŒÄi¤ŒAH!cœ€©*‚++QŸÄq¦aýjŽ±R*UOù_Z´/Ö +êÇ08©:?ãí¹9V&Æ1?Gcž_^Ó˜&HR%â#,sv#|ƒ–‚‚˜ömè°kî´ßÄ­ó€p¯€Ôd*|ò3vMh'9£ursÜë—Ýð°§u³j˜Fˆ:ëä„îƒJTîû¡´+ËN"X7’[¥ø‘+ ĎýA#ÿ°wÉ/TÒÉ\NÇÝâW(åw7PlˆÊŸÜ@k÷wlÝ!ðr2‡²ÚªrÈCÎó+Zy¼*ˆ£Ç󽺖çÅ'—aíi˜" K²=»äؑëaõìÿlŸ  Òd%HÀJ%6ƒ4¹‰ õ/=`v„Tˆjºiœ¬:íˆ\Íû‹îx7Þ±aOˆÒWe§pʼnP¹–pŒUÀÁðG‹—kgO5'`™ ¡̊̚X{Ú+–¿rÒfXöµl%h‡D©Ãœ úlX/¬‘˜è‰ 1+nš6VÄ^`*ϏùДs›¹)—°_nÝå±IÝÎ …!ÃýNôÅîþ%9ÛÑA±e€GQg‰vsl¨_Â7•–54\ö-¼~¥à&áò ځ›l½§¹XeD{ð^ÂÖEŒðAŒeïåÜ5Ó&LD1ñ:\•60Êc2èSò…ôŠ}Å_¹c‚ŠÏœ+8Òj¿?[Lÿ… 3Xs¼‚ ®Ý&ûn{åOßü¦œóˆ¹ŠBƜ+ð°ELˆÔ«i~êþ%鐫Dá˘& …|<®ðHÍäÀÀrÐP]Á¡±ñ±ÀôDO!™-7¢±t[4Bβ^ª ¸°V€½f!mVX°¨mj%þ{¥2Ç梚 +ÈpSp)z’Ü·)f(º¤»‚%Ã2[ùL_'ÂÑ×_Áa\pԁu:úþ·rÿß=“q |_SíID‹™>Ĩ|z} +¥N<„v*E²si¦x,ø< ²Š6^¡lŸ6F?_œfjÁû«È#ˆ‰óÔÔEÆ4ˆmL‹—¼vCT‰“Ysocb_aí„Ü* ÕûÔ …é­‘¹¼J•ù¯ø†Ï£ÚKèB>k™¼‚ÒZ´ÖUösÛL†ÿž^ ­À lÐ+ˆÊäw!UZ? +ï3Ü&:=Cç ì +4I|¼@f,đʔ3“dã6Q01Šæð:m+üùŸpiö +£7;µdÄ-†I„H5]X@RÀò “Òƒà—ƒ´M¥ø‹rW@ØO ¼+T…ŒUÒÓ^%´m—I€@Îía@êL*´ä¦ +,çe.÷¦4¶m¶Yp›t¢>abø~ËyŠ‚¤ÛÝ+¸«‡òD6Âgõh{p I -Þ}µØB-·MŸFŸ¡Ú+”ÿP  HĹW»"œoŸÃ FñÐyB¥yÉÙ6 ÈÕù^L h¬½–uï«°6†-MÊã™ lùÄÜß\‚BÍ&Ž*V "ù +›vWÛ¤'¾öåqExS á%0^À/Üda§‰03zyô¯ê1Y6¶éW&X{T°¢ÔñÆh2¡ÝV'uTFVâL?¾‚ pÌAÓÜp^Â&—P¾ëT0Ë+ €·~º#¸5ÔI«Ó¶/®©`Áqã(•¶èÀyѸɽÂ쁍Á ¿^—„¸öfÓ /§”¶Â|9Byݒ_ -G¾{…¥g%ŸYçvr”©Q–>ä4BŸšõʚñº¸x3»¼à PC }…I^©@登ÀClÓÿ=² µ¶©aI® )7œìš?ôþÊbÈõhÞk“`ò¶Y„4*™{°â–fQÀñ×zex·6 w&=¿á+ø4Q ‚.+\Cá+<‹ªÕ&ÖÅð˜ð† ¾‚+}ˆÞU›ÐÆíÊsø +nác÷ˆ±š…fÀ…Kâm_砄Ec⸠‚ѪM6k«!ÿ… 2aBÓ&QrHõT¨’¯0ŽãÇ_ØÖUÑàò¼lˆšÐ«!Á©`£!S°X2Y$Æَ2‘qÍÞ+ˆ²qZÚDd¯Ô&™°iÔ&ûÆ?_½  _8 '1õ¹—³xî?Vpê€| Jä.9nÏ+#I½ °¡ï*r,Wÿú +dDm²!r͜çX!l~å)¥*'ä(©Š·'áqìhÇy*û¯Pòy…yY!2ŸÒ=Yðˆ4%ÿ…Ìu-Tlwuß °°¼Y>`âZò+¸È€+¾ÂÒ$Ð"Ô>(¶Aë…í;m2;ÐiS¦½«iúš& ^xu1: 2ÔЩ¬Ü~i›65M šä‘ƒÆ• +„ø +¸*m!H¨(B A«ô¸²´©Ø›!ՔÊÀ‚ˆ›Hïþ¯àèG`=âˆ}舸#~Õ›ÙJtýh“릘@Ü­ŒŒvÄRZ%ÙM»ˆýE›le*×4šÿÿöT".©OAÿI'bPy +W!Ú¤fbÀÆwvPaÃ'Doâ@ù!»Ú[þtJ‚2Pý@ãú߁2»†Ž{¬dO]¡—×ÊCDHÌ4>à#g +´IxÏb2f[û+öTí·] ÇC{2,¶3eþ +\¶ß(õvNþ +h#‘ÏóWðmÃH¥}6Uu!(/ ÚBhõ¿º o¤¥QúÙô‡9â=¦u¥]Ü~Ɂˆ3÷”х¬c¡qɐ¨|hÄ¡=›~ƍõlÞtI9‚Xӆ+vt(ºïÔ½l*ÏuŒ³û,1l] ÜÇâÊwñì߯ _N†I¸Mŝ‚%tϾ6²ã¯ðµ…q‡Ï—‰†-ݶâª`¼’º˽LsGú¶Æ‹Ê±àÑRq4 Ù0r¥ÀbK‡D2Óé{¬Gz-óËFÂê6›(:Á# ²Ìͦ™Ry]x_Ô °t¾„ƒ³ yÇÙw‚°b”­dA£2×+:/ÙJCRêý˦:38 Î&§Jˆ¦°ÁÇñËíäsèSÿ +WÔnÃ.–ô¢ïÑa¹V–¬!0›âGs³itd,.=¦à_Î}ÈX ýWîJô‘å ÝŠî¨ëS¤P?dñ‡þŽ5/|…hãӜ´NぞLðúœ,ˆ¬&eqàdw®€Ö´4›âÁ/«8x€kV¬ü3u·*Ám‚§C%þoy1Q¬(AeÅ <Œ÷¤`š·W¤u _±{$Çáá,Ø8 ?¥}W÷®. gM¬Þ=Ü'ÕºL@¸¾`Á9(’ X+¬ñ8 3‘­ \¢k¦±iõcÎIn°À‹Õ1ÇlZ˜®ÔʑÅ+àS¯°öH%Ä7u)fÓr8qՊJ +¸Îi"±©e¶O2[B 6z—MÖ5WçNM:ø¥àz/áÊô]N腽8YLёæGUØbÙC¹æcûþú eSxÄ=è´ò¢lš»ì΋/Sú +ü+W\|Ýf"[ÁÝV9J'›$c‹dËϧ’µlWiOédSú±ßɦ‰–Ongº{',D›yÎ}öBKô“l¢mxE$ÙT¯ˆ Mƒ4è\„gCÁ0tx°@~p ÙðX© ØùŒ‹/+Ï``a6OÉý/ÆÙ=% >FaòžИ‹$yŽ>èÿêÄӀôúøž…U¿Ãéd±’Md΄#I6Ë3ã{=¬/¥Fˆ(²iæÆ ÙÓuóHŸA€{)­UTp^ªð‹Ä{AȦ¹w^ ›"S¢Y֘\ó/z<ì÷Ò[{ÑôJO…2 .™kï=…Ú±©2Ñ¿N¯c“U0Pùê4Á¡s¿À@蟞fh\„ÚDXá`¾Õ»Š"°ÚånUÄáсÇÇ.,ÊYhäœ>6‰ð$pèȾyž+E©‹ðµjý +u ° Dy(,lsˆ[ÊfO¥Ÿ9§‰¨01@d¸U»‰N’c·p‚‰–üOÀN˜èœ|MåóIqþQëì="T[›U€P«O/ƒgXp%à)†ž 9,ä÷cÓL(À’ë÷Øän>˜HÚ°@/IylŠF ¤µÀc“{¬â‡ NY/iIÍaO­pý‰MÏ#Fד`AL¯¹B—â¯1Ú¯‚5!„ÛßÍ¥‚°NJË\O¿Û56ý¥?ñW'…›2þÓÉ6,p ×nÂðÛÂ2,Ôö"dè£Âïö—$2 µwM‰Mÿت4iZ dX°”´©eXu´sŽØÄ-´¦„"Çÿ‘3bÇSrAî|!5 ©g5[eckc ¶×æ$J\¥j¸­ÖJ*ZˆØôïN%З¦Ú° \Gn¾¥Up°öGʙ!sŒè3nTûeJ˨ñÂÉy~À>DØ$ÀmÀL`Ø#´y0b±€ž>™®ê &Np…T",fêd÷l +šPï{·âƒ|™›®2<êˆä¾:M8JBKÛ › +ƒ/!t ‰¯¿sfr«¥Ò$i*t ²lüÃ&ÿ{ÙVú´Èø0÷‹nX'Mšr… ‘é!{ëmØ´0 ÿÌ0ÞŠæÂ&´ò*lš«½ r RÌÅ"œ`/l |½ø8mCs4\31 Š›æÍ nÍ^ f`‹X;m‚M•ï°c--lmÏEåI°‰j{w\|ŠÙ!CŽ ³Uo*(,ð‚DõÕSÀ¶Gj S»wÑ́ÖعH¡ý?ôXÚÑUr>¡§æ·?ÜœëfÒÑ ¼Ó5´±ÇÀ¦É2–@]N„¾¸!sáP¡?ÈP/¤q/Í'ŠP4™“I›æ#p°)2t­j;’•ØTb¡_PtR«Ùôu\P£‰' Kã€;݀º_J.q0øͯ‰²·›æñH,°™Ú@]™ØnZ]‘wüšp³t:ü»g `·Ô$rÆ´ÆöïÑ8‡ÌÅ¿ +»ÇRúª VŠ¨¼‚iLNˆ +]BX\0? "^‹Á%°b.± J"@î $$¬Ùgš¡ˆ1'ír,½èïFûtAJ%ì†è’z + ö+ú"²¶IW©baRê ·é +ákŠX„d.Î5 ^;µ”Š».à+¿ç>¯É¥8èb!ÕúÀÎ!œôDì” š _,PYŠô¹DEþ8mNCgŠ d<ù´ŽÃh€±0ð>õ” eàA¦±òŒ lé‹G9„ÍU=h2ˆ`—”” +Ò¢Jï\èc‡h!‚Bæ™^SuÅ©ä!´ôšÊXåTšvtP»K|·òiÍâk`œñšòÇrù‹¿?¤Óþ£Ô°@oæn±à<Öÿû7_,ü CkQ©ÜŸ€B[²k¢¬TWcפ†„B»&A‡c\5î5 Rmª©ÇÅoö¼4ƒPTDa€»® —%ñWL‘‹…±¥¹®ŒdÆ)Œ ¥Êýp‚ol2zq]“#þ©3ÊguÆA–P04óšÊýFGø‚üÀ¨óW,/뚄Òq›CЛô2êÓK_ |Ë&S˜0•˜gqÝ.iJ¿˜û2]ªo–¹ú&/Ë@0ì©¡áš±z} ÌYF,4f#Bt0ÇX23‰›±à¦q垈U0ì =ð¯§R@&_Þø_á+´Ž ÛÅPàÿyÉTÀÛñ¸LïNIQª€ ›kBK|ٚƒÅT„Ð,ü_¡üˆ³;x#®ZÐêŒÅ°¦îGÕ1å¹Ä>a°ÉYLqí–" ž†+31AˆhÔ; +(·Á›õq‚ÛÀ]*¾‰7ÑÔ«|$øcaÁb<|„seÊ@¤1°e±Ù‚,¤¬Ê öóWq4‚,jmàÀLµ56~†¸cž‚aÙ4Òêv ±¾®` ݶñïi65eºP÷»Å{Ø^i£Š‡´ã9þÈTfžag#ªà‘1$vÆ Àá¹µ³ÊwÅ2 ½²3‹y¥_)t‘Wuñªiä?ú[kÁ.¦w¥ˆ =lúßõámuK$ÕV 8°áožÔ•º 2“×$ÿäQ<`Š²¡Ú‚˜Vƞ¥ÄU®¤2Æ# ;D^î\eÐsjñ#n°$n+KKúvÂM;uÜqU]̘ͪ±V<‰ª1ºüËÃEö(r’Ù“E(\gX1Gf­"uËã~,†ÊY)ÔÞk'²ÏµL€Y±'‰nXÊÊ0ìò%¡¦„î¶*¢9 pÂSg«:';QŒIGúÔÎ[¥„¦ò¬û7ðÀ«<½BÙÊ3fªæ±vtØ*à¦üÔK"ig=ñka9uwŽùƒŸ°6þêUžÜ7‡IÞIeiiºl‘"9Ø@ÀÒ5ÙØúJV‡Ê;’{y¥#äYՕ¶%;-®ä›;¶’¬+-®‡˜´d0è+µž¬T£SyX qNᓀ$#ʍ·[¡ÙH¥ ŒÊ¾ÔŽ”ðhïÇ$Á8X”¬ؕS›Å±½5RÓ¤þï”ê˜>è\ S]%R[)âÒ¤¤£´ÄÌ-¤ •±8ô} $*~Q¤«ÿ߀S2 $Å¡hŸâõ å¿ +9@”üÔW¶ªØ…|W²d1ˆérÿ°z%…„ðÒe9>ˆ–øæ¡ç’*nÉ?÷Y’œXÙ"¡gØšÚßыTðGèk¨µ::êَ|ÊP«3té¢Q®àê<5a¹Qº×PÐúð&2*yS¥òW·ðÅê"ð +ãJúIµ¤ÑLdËę¨=жy‰¥P<ý4‘¥*ôr–´€AñåtóøPN.âÂPc2],L!/ÐCmÅ.©’xÁ|´t‹áíð8ÈLøãîñ%×"Á`ÈT#uþY!—Dp<„K9M-Ú\ÔHîè¡'Fh{‚ŒÚÏÊW *‡Ql1(ZI¾Æ·Ë=§¬A9ÃNVkª*˜7安Ǽá5eBµÝYd>¬'ÏIí®´bïQUx$îׂ¦LWV>¨íÉÉeæIfú+S 8"J°TIòŠ€2þêÓòyvîTâÞ\³-øÔgY—B…í,JyÓ3a"¢TEA‰‰Yð¢ì=ÁÉNQ¸Dõ¬ô*âÖZå¢Cp_Bå®ì…à:÷(ªÅô±„©:„aÕMÝ( k¶èÐL,ê¥`ùðÝ ~Ø:üÈ\ï™Ã ˜Y?8†²¾A¸ÞßêûJÇáA3U$zÉlÅØ,ð[ļ‰µ ¥xíu²µ·S.…‚}Ê×°cÔ3½I7جYŽ+˜Œà©Ò7’Xú¤)b¸È;ís²ÐLˇü²Î +î!Qd‘®¯* 8ÙvՃ‡táµ ÄeÅ( ŠŸb'®lñ®ù®(hXÈÜhÛmh ¹ø®fnӐ€QºÈñ¢žˆ1y²óS»‰ËÇKºÎ) ¥ôX¶ÓlaÑpN­…>m8‹>uª­Üj¶N^xýô’PéODd‡JƵ‹Î +ªv)ª +Ë"@,t•Þ×Ê5!½fœ“ÀvÅT°E[Žþ[¥³ñQð£Ôå<_Üö। +O=2c}ø”ÂîSIiÔÂn‚Pt]ó8íp(æ š²“«? d +7+²ð‚œé+{.3åSÙVK×íÆØ9k3AP]9/S†eWÛCøÄcVœfozò'âÎ c]ŽSô¯é§ú^aâ¢Îijâå¨÷'ãç‡ìÞßâ Å ÿX¶ņ +Ü0L:i*vï¬lUIAÐÈI~¨\”G®¤¤ƒ£Õ¼þ×ÜÀ¾Å0ÀêYklnÆ8Êz1›ïBðD$ït³D€3­‘VI´&ð+†ªÂ–~dŽp¦’ŒãpËúž!ý©Ðï-iRñd׆d»‚y(2ŽjîôW†Àù—MHw[‹ã+yb…‹3(ÄÉèVËÙ \흈{fᩑieBµý¸oþå9²Ú>Cw!¸ˆÉó­0€à½`®/k†¶ÊÀÃ^ Tð“ÎÝ/js>8±Ghl3kô:V…Xv¬P©Â5ý¡ª7ª\™‰BÎ;Hí)˜7½Õª÷ ¾²35QU$>¬¸µïEm ª%£°0YNvê¦ÐyE!ûqüðµå<Ác±¯göïL;”Ó)ÊTP>ì¨m ԃ±¬nh¤-µD)ÔrJçVŠÇé`ê¤V4½ã¶÷~PS‡¦Í<ØiåÂÅ¥ãSžÈ4Ÿè ¡ÃÖ*ÿYƒÁ"n"•¿hÜ[ hÑ0Aï_]fû胫ã{ž«óæÝpƋ=,Ð á[Ä-L²i\ËÝX¦V#jey5*ì/0^ªŸ¹¼±D`ø¿”hDkýÆ:Bú EÃ<ÄB˜…ÄX‘\(ï +§jˆc*þöšT ™Êw¡#Ý¡L¯eJh໺…QMí æA¦Rµ¦´ÌG͌ȧ H«þF­ƒË׀ÍÐq¨ìʳ1žÉÄþ0£AE!̛ +&znòqæ` ô6%ñÝ7pžJ½'Sq9S)ªð‘÷"ž Îïê~Bð!ýzޗb’(€¡æY5 DSù¼+l*µ8êÃ+!üW{®H' û mŠbC¥2*¨k0}´®pÛS¥#ý;d#®NP{âä\Ó1Dq +2:ØÜÇt1ùŽ„Éb¥«_Ìb--ž0kO¯Ö:`h‘E}#_+bÉ áK+HšÒÓµè+ª‰öþSڀӼ‰‘(òlyZø؎^$o +ü!Azšu`þý#iø!cO:Ð _¢ZÓÄ]mÕv8Ó)`C'Uñ}í ː@B¢v™G¦æÀùw,yžBŸt ]½ŠÿEù\1²é¢{9óPvI5æÉÃõ§ê +¦<—•3tÝJGY•tãÆi¼ž‘Î^¾Ñ |  I „o-É¥:Ÿ`ˆ0Íò5ÒC“‰Ü Ff #Ú  µx—©xÃÃæ,œ~‘~L™äòtT¾*Uwny^ö™XA‰œ7“Ž„ZãH‡³<”;bv«^×,îV1í’ì_ +Oç[¿³Š1íKéuÝùl*¸¨?¨[x¯@wé L‚,ðãXå"U +q„Û¥fškîà`œqÕå¾ÐðiÏôM5“å9Øô¾£ÏñiØÒ.d¯ô®„ê¾ ˆÞéR¡íÂXü W¥Yê{Cü®¥ÚpIýBÕ+„‹î0R¦zfmhÆèü.ó[ÀÕø¶½º›#JyEw™ü2Ž2süx7å.õL¢#g»äQVúCK„ RÎ!¢ʎy¥·û¥ ú:DHså6S™Òß Å€º¼¨›Õäí|Â;RÕ"™ÒÐ-ÃÜ«cÝБ\.yãÆ t¾°ú‚Ç~b×õU‹ò~ì$¥Ùÿ9ónÙi©¡¤æú±y˜÷-@Ѽj¦µ`rš£^°KŠ£=n Ü +ôëüuþ¾y€µ + 6)¨Ô»Â- m)ü' +©#ë6fa™%ö˜ÑÈ6ÐSÝÅcÃ=#²^ÛëžÿæÃdÌfËRɞ¾"·žL·Þª·ÿØ;:)hzîuñ¼Å«Û[ÍA»r¡{L™Î±8Œ³XnÛúꊤÕóC¢ön·ST ëRÜÏ)™±\E’B–‹•_Ô1wŸmM™ßÎæ½ »y…#]c.b½ö¬ŽÞìôH!üØ 7ä6©øW阀‘·Ï§I¶&ªjLSÚâŒvfâ òCòƒTp…xÛ®cQÚÿ4Éƺ÷//2ADKì¢`nÜFÐ`Þf­úéD<™b2½ø¥£:¾ˆ‡søÒ+P[Œ;éˆëh”вpbî袅7¬0&îêrp\ÝIßÁQŒmÒÔ¤Æ$s7xkjLuˆI±AB˜¿Hê·;Ýç&±8€ká„8,§oQ§ŒÕ¢QQÅ.Ÿf½Êe¹“õ4éö²«nˆ$L¨•tF \Ñï0ع죆yxŽ(îãéÞ+xÚBRKµ3Bvñ32Ší*õ¥ø¹Å’q¹íуB´íVZÛµ;u>Ùk7jˆ%âÜåê¦ãM…ýg÷ï2*™ÛJ}W¦†¾÷ÞQ™û æ]ˇu±¥ìîŠ÷ðš±4Ė˜¸ÿøX3€<„³—Ë<€ßRN£e +JÀ ¶\FvŒ\Çí T¡ÊÅÀYª»õPXÌN`µó`}–èxX2Ð×å¾µ:le¸žëöÒ­‹ÈLÕV¥rîê‚æ´ô"HxŸBEß}+ÉÅ7êb"­ÛÄÊç[]MXN”æ?ôoA’…GˁO[ +“„‘s #à2b±¥•+„´´÷­òc {­ßaÁ¥ãÎåe¹é3—®Ç\†‰¹H8†¥/×üÊê×o#¯–+[×âÚ+îª\ +µvz%9&‚<Àd–7rõ×&äÂ΍ŠR—~㪍–¯£·̧*.”L±a—é,1¶”ìáb)Yº[¼O?¹þÝ»Ôó{5upÕ÷’cf›ôþÂÎ7ѳžÈu2—t†\õ ›W‡ùår×O8 ¹Ù–Ú²uNx·hŠe+h}»ÙJ»nU W‘¥,T‰„ð#m›Ã-óVù"!CWu·…,ðJÂZF(‹F ¢¬Å;#u€é¨‘ÅZ-ÚcšÌŪZk#`ªnŸ$[/1Jöi­Ç〬èÈÀ-„T£?(°›¸Ò>£;#AsãæÎÜ Êï_˜Zw,.7‘Öøãö>‰iÏ~›Õ>ZÀG‹l’p©ð½B|©ÒžÈ2‘YäÈN¦‹mF-@ݼ œ!},±-±,x¤¬\¥¹éuÜYő€)é­CÑe„Î,ÛÐ k…„³ªC‡YžŠõeaô±. ë·Ïªv©«Ž±‡–pÈ)k]È0·ƒe¦­ º¢(:{&ôá'KÔ\QUrÒ5Y[Aä’Uâ•CÃë6¯áʬ=E@¸’ù‡ ßõ5%Oµ.×=–ÅYXV–jÑi¥ vÜØ7}ð/îwž±¸ÊçYvBµßZ,o•ë‚ëõ¡ÎN¬Bݯ²\—&šæˆe/°èæ °œ~h =U¯Öb)rY^ÌÈEœ‹Âgvv:¬©Ðì'րÅüíŽm¨˜'þ&™Ún°þN¾¬ÿœ ¾Ëãw&XŸîa+Õ­+hZ`˜õòVݏ…Áàò¿Ò¸ö2ý*÷ ¤‹‰TÕÛ±þÈy_-;¡äšÞª–¸}QV®jåš é•°ÚâÊ=úÀå¶Qs¼2˜b®é[ ¬S-Õáø –à2gpyØÂH5ÏUÃâ¦1ÐåJ‘5ehnÎ!H«†HLÕ#Á@™¡ïʉ=ˤQ›ÊOw‘ÂËEfV Â«Û +ã÷M¡œ]Ö Oìåki™ ¹ Ú[Ót{3 %VŸ¯ +ŸVÚdŸ•¥Ãċa³ +]œA’ŒK‡NnWéÊ/†ì±Ê›”ØX­OUÁÕ#ëäü´´jº!©òS+µPÝëƞ)3°n¨]*¸€_m0÷L(^¦1Ý}QqíR_ސr{ÕÇ'Y”Wù9³"}Wn¹«èåÓ£ÕÀ[ÕuÐL™™;ÊתÅX”ük”Šµ'¥Uë@vU°ŒhٗWÅÑTÒÈðWQ€2PÑöx@fPªË­ endstream endobj 117 0 obj <>stream +`@'•5Íî‡*ªô °Ã„1ûkTÍ)1Åìj,1}Ò¢r4»b¨©B³R¸G»¥’Å/Ô|šÈ•ª_¥ö€æŽ©|oJµb4·0œT8,õ$µÄjÌ:-Õ~䲩ÕVUµ(ÐFµJ‹ÛÀ*ÎUE5öÔu’¸±HØ {7rZ ò»áQ<¨Â†NÏ¥#-#¦4yEªµÝµ óˆ¿Ãt^Ý1¥Ø–º¹Ö*tQYP¦Kê&?Ùõ³…Ÿ“-1G֌À$oP4äMq}ŠgÊßÐîàÉÒ F#SQ?„ ly¼˜º†Ä*§jbœR€ñ¥‰šwãA÷ ´iRb!ÄlêrÌ ¬ÃH“Iušs]\ÔaÖàѸÁՔèÜ-8M±¥¥Jñ]s“N͹,•Ì)%>w{Sé²¹ySȬ۰Ã2:rµ•¤æ¬9žÕR¾n$•²¦gƒ2–’iJ€Ï + BæmᗮRb¯“CCéE|Úª„R½©iRóÿJZT£µIIvÜLªDn3Æ8—”Ó))YÞÒ*)`ֆ‡_Såuox’Z§HÊèÝËQjÐHI•FiŒ?î¢DJ&Ï¢IëG6Éc…QҊè[¸ut ¥têYYÔ¡>LQåC=ysåyƶQZËpÕH|”O”,~tHÝ+_s ›@*È9í©wUâ«s¨MŸSšÀ±j_:œàk#³¥îaº.™¢”†þJM½…¨†šDéÂÕm¦# +½²ˆ‚b>hC”¿òGŸËQ˜ŠØI½.žSº¤Ð¾Ð”®™»1Q¾Û ìæ×B%]ìùuŠÉ¿Î€*ñïÀiè¥å ŒPò»%sôPOBÕñ&þƒ²·m'O”Ls5:ŒX_î5à ß°w²Å7Ç"ގDÔsßAùó¸%âÊÿ3;£þQSSZ—ê¼[<ŠK÷w5Mhƒð +rÓ\u!Üôž +¹0+u£  €Þ sÇzÝÈo»¬tß+ƒC‹å ½ø‚äøÉS܁“ô}RU3ýwœQû䕼Hä~}ê±ØÓ'#Ši•.»õ࢓ £Ýd|„yn€zþçR߉ 8›Â]ãLóE –¥.gú;Ïԙ繎*©Í¸N˜¹O;m³“åmÀÙ7j¯N·C-ÀŽ\i“ý0¯îaç¤ñ\8¦ue?FÛ¡Á£s©0Štšu!>«$Ò,ßyáœ:)ÂÈkwN»¿ÑÉlÄ2tZº|"\ËX®ÝbnË@\&ír8ìt©‰œâ‰˜†&ðøÛDûNFmNòÜvW©rå>îM¦"oÒ¹r7UÉ“¬¤Hö6=ZK“d@îX» LÝ®ÑT»®köÙtpM¬Y«†YžŽ„˜ÂUÔ-w)3ÉØܶÀ/3 ‚` ):ºÓtU¦,]§,M^wë׬U P) ˜ÓîE²w`’è%-¹œ§Û1À˜Üv¤XÒµkGŠEó¸ Öaƒ.·—#éÙ;ؒ«3S ub8/¥g%#œ‘œ‚/“*D£Ì»¤GÒWª  +qÓn_?2e#梃|EzÚ-¾bvLy °6&?~ۘ1å Ðò¶²¾˜ºO»Þ°TLÔÈ +iMÍ%¶üH–.SÄð6Ú!eÉ,¥I¤@J®Ó-ÿ?’-Ô~b©2£Ò¬Û\êÞÀäE&ø>p·Pº@£¿‰®7¦ë ™­ s"X/QRê¼4‡ù×5wñÒqÊß%ÿ”Ø.¹šuÉ`zÓ%% ¤¿§ïB¨ƒÌ]ïWŒ^Æ¥V«ú.ýY˜à·d}Ìmèn)Ƕ¥Ž3ÜYÙÒf­îÖðÎÄá~§ÅX³~{Ÿ?…%åÿ0Š+…ÏŽXpbm3øÐòM:Äƃ©†¾êÚÚ¯$ öýK| b|ÓêSEÄÌ#D‹B€õN]7"È7Š‚ÊmiÒø5'£BZ)¬§W~Â=LϧHÁ†uÆo¿ðK1aóÆÄM%uLbk¿ñҍÜ㶠&‘H†Ž©ú9ƒ!&6[([Ýw!­Û"ê9ŽÒ×±×ÁSSû%>‚dJ[À˜pò-‚©ßB–¼dÖê‚þÀ8ø#Ä@,‰v9óž@‹JŒ…–€G×,déVbfX´»AGïýöˆ6¼4쥈 š‘.Ó8oڒ¥šx#± a{k³ULú˜˜IYŒoê( N;›VûIîõ½ÍĒ4@jçõ[œ²@bp¤.Žeæ„Ã'2¬ò&VHUN Ðj*×OÂE‰!ÈÑ +§Às‹¨žØ•O\º`|b¢<@ù ÊĔ8ƒøJ¸Õǒ;¢WU™ï[ˆ‚Ún««}~ 8)ÖËJ¥X|û·¼viöãɊ…þ«[ŸÞ¹tZR]͇ E·Ók³†©c|‹(Øv]U\NʺƒQhH`T]‚‚¢›u€³D¸3eÝ^ø€1T]\¨¸}Ûꯣ0!¹€Û—zvæ@éˆŠfnr¨tGۘyø÷zªBÎ7;"$Û5r gþÊoåß½aТ$Ò•œ‰9±(¨|7y¹?rº­Ãºs=]Ç؃Kô$ûéna„*×_i©æ,–ÃêÄWRðécH*Se®ÕҠÀDëOb²K[í.ñióÆ)÷‚pÕbìÁͬ+Æjã¡Didb.“þªÂ@}Éø«\O}0Û9Jñ2Ö×N›öc‹ÔH\›J^µåÇûmŽ±¨v¥î¨6œ(HHK$z[úêí%Œ€h_¦î+©T©âŒ³öî)HÇt¯ø¸fPdLa1×I]£v‰ÚÓ²` †Ïc±ÝL ' ێ!>vû +Q]©ÄLO{ \  'Úå“@åûþt… áaAÔDuÛ÷5–ÙÂjðBhA¨N6,ªO¦î2oEðþcBpLæÐlÑßcNò$Ì^jA‚Yh7 ‹Ù&~üÝO\AÆm{þåØkÆ•ÐBÓ52‡Fᱛ#{phuãZàõ`ÚÞFrl24ˆ«‡;¥º `’î_ó2¾·\¦“÷ÝúÇ0(z½äè8F¸'‘!FG…±¸·§‰Æ4Æ+JL!ã‡#ëîSÝ©C©n¹f… j°¼ Ú)ÕÍ<ƒƒ…ä±V9*ýú6òÊihÈø†eãóûíŠ©‘áÚ¿,}¿4ö0§â³×x’æ?¢ ™ఌªËcFþÝ«![ŠE¾ÅÇ̊úˆÅI(7º`$hG.–ÙÅ +ÁÑ)O‘QYY¼O×hÒõïPb§@»1yd –T# ݜ- Ò÷ې±€åU/dU?Fè4ŠÚÄæÚ5¾‡×¯Yõ S »(ù+Çî­.\€¶Øˆ@\àžÓÅ|SFÉS‚Sd'¹ÏKEÂÅHŽBÌ$ŽÂžãX •½á֍…šìW¦l7'¦ø>֓«KòŸ ¹“–;y8þMÁà–ÿ«¸é.eµ˜“ÛǜV˜®D¿·¦‹7²}ænÈPeC•%¥Æ6eõ Š;×Im\½f+™”*¸³Ü6ìëĔ¿Ì”,Ä:>,'™‹Ù‚×kn2“¼Ã²ŸQ¿ˆ1 {"xÚÞ"{“µŒˆ²«qÆ u±ËÎpã؁ØBÞÁÎ?Zwê?áç;šñd˜³ÛMà§à¢3sœFÜÿ/Gi>Yeª&[“iœ˜º%Bg“5¸½TM0š!^•A² ,þ.;Åñ¿Ú­Œ]ä 'Ã6¤l™ú•€Ú­ úè-.݃@܁reVà™‚‘Ìå”^O1úÒ½¼:8m™BÇ`6dÄ@ Ë`‰§i(·h[$kÈ_³i.—H2[þ[8ô¼2ù1 Æõ(‰ *PÚÁVýåYêÎI®à,ª€ûGúhº"¼ÔfÉnUHɝ¥äÿ ÛBB2 +Ú¤â>FÍÍh¬c€×Syqùê»vSðçU¢eàQ¡ûÀVÅq|½ óY÷iy'àe“%‚{*.ï(.Ðj¤EàÔºF™ +1‘2ìå Oàäg…‚@\T2fÁ;K$6žIë븂dd6z`=sþ]ay”0EÓ2f«»DB´è5|Caé +8ªÐ`À^Cªazi«ÈPÿ÷Ô|ÇQ‰<ÓÍKŠK×kj&ˤÅâ3¼øeûÁ›¾Â6àóIBZ3°0yˆì»N·ñZŒLX%ìӍ„׏F ½Nç5 ++Z̐y·µÝÔͯx-”«3d¸ žÄC‚/ؤCä­Rø§WJ5[•˜ÕÚÚÞdisõ<[Š>Ò«œém…Mò2³ʃ¬3y-‡ø9c'‡€3èl õk¾^²Zýø¢áxc:[V#†¢a¼ZX¤E‡Å +–—KfeÎôD˜Dœ• ¤‚™Ù*òMìW9Ÿýt©³A}=V”x 韅nOu†´x®Ý†ëL`^C ¥|Z֗Çص²}+qÉS5;¿×Ù}^¨¯ä…š‰çŒÌÿÓq†$‰ ŠßçJbÿiš#A1³o£c¬oô$•Ä‚ŽüišÅxG$o7ãÅË<ð¸ïØñÚűRn2„Ðõâm~+£¼h›Êºïï–óím3þ~ñ~'¶€h˜;‹¶1Üê+4T½qÀÒÛÇxíU¨"Œ7åÁŒ—È3ˆñ.jŠÞ5U °[ûú¥¥ ÏP2¤j0ÛÙø<¢œJj4”¦œ1J|ÈfÊ2„ñn:…­X0Bóì¿5°‚ñbî ólA5BUh:ù˜ŸzP¼öˆ\¡šîŸrglĤDÃa4æ<ÛÒ’E㶬~˜Ö ¢=q™ðêâx#^¨P`¡žMý$)‰¡=+…‹‹_Á¡³ÁF† ï™SƄ¡‚ (Ègýç€l ò²3Gõ£éáUCíC­ Øìüž âe W±iX£M H¶Á„ÍÏLß_|Ûó³I[:•5Ö^„¹?Œ$üÙÔ¾ZüÙM + µóg»Øß= $×ìäë2á@‘òA'’ÂËFŒ ˆ×äHùáuæSO Ð,“Ç°«Q àëHDµ/LjÁ„@#¢ æ íÞÁQŸ9ÆKn,,ÏFej„üðÇ83ó¥smF¨ؚhcÎÃVü¥ ¼f¤³†³@u!¬e1³|ð–†"€`öÙ"×;rúÑMHÚ²«@,åI„&¢9(Cçrܬîïá=¬ˆµ[ cBÅo8‰ðá5°HXïáG%œÜ…C F¸ËÇA뀁Ft:­„ØZi®„o±€ðË^)ˆ13÷M’0ÒÅ°˜céT,ø“¸™‚;õí¯ø‡Æ#Ȳ%®z’(šb´ho±(ñÖ_ˆ·ÀCôC¼>ÿáJ…fçƒI*ƒu+´8(Dý–»!)¦­Ú¸£3­ÛðëðrRJ›Ñd' wúˆ"ÁóŠAðš±S–AÉtÙò‚>š}¯GÍy'TmÌPÎcDvå' .¯@ƒåŠÈR¼Jփ+)È㰁cÙC£€4¸{ô·% |7†„ÛVwÝh.Šù;¤Ã{ãÏ©ÂoGo¨ÐÄs‰}•M]Ÿ"éœixS"´vcK“˜oœl¶rg +šoqÂc)úEÝfJiê‹öiÒZKqfì]íB;ÔÁ±ž¨13Øã>hßsu:¼f&l¹Ž¡1ÉØNÑ°ŠÅž¥ú¾j¿È?l½‰×íáî9€¥ö‚gãl·Ž¯ßšÒêà^¹©ƒ6ee/§ƒŸ2,GÂøîÒAZÀÍM@;‡¿ÜËZb ·9ô@g5sÐò-wªË¢#ܜ¢2`ê¡/J5 c`SµÔŽ¼« d#v’£ 2÷æÙÀ©!nͦ…ƒh‚vfŠ–J@©7ÏúÖÊÎ0Ïä %œG5ä“ÿŽ)äA‹Ê°v@±.sOL¯ +Ÿ@V.ƒW9¨â˜ÞVzm „.MӆhÊÌ ‡ º’ñíkˆ =vº†Ô‹3è^ ï˜`úŽ—‡ñ¬Áir|2¥¡"jè½À͐ÂL¶ºµ4’Óùdi`È 0:3††êÛ-ø#ù‰ðº2û~{y>ؕD¶3˜„ †*ÛÍsýYB•ªlüÌVÎ :jçë3¼#ù2üÊ„󶐽êW ŠÔÅÌÁœª;]²6†2gjøÉ–ãâ4áœÐJM­Á +¿ºìÅÿ0^ºTÂéÂàwÊBf|0ÄdÊ +áá{%,‚Ôëeâ­@®Âè¤O,a”Øwcx!(«‰=È™7À}J.h¢‡rL«ü+5ÚY\¡Ô}¸ 5Û0”ÎofÞùJÐÎ:c·-ã”t°yà´`Y@VÜWxI #3$ZG¶a¸$8‹3kÌp> ®d0¤ðdªSô·ûY[Á žaÿ%™’¢B:Ĭ¶˜b¸DÁ‚¹¾.o=íØÕó^ýæÎ'Û+ŒFÅáý1T Mó Û‰4³B$"z—0ª£ Z¦cÿCø2«©>³ðÀâ z+ž¼/@‰ôR-mŠ +kªa0c dæá7)œpž¸’ÄR›ðâ*ì^ׇ);š rå¡PÖ +…º’­AAsN +È2ü Å ùñž€ÂÂ2dÇÅu'@ ùð3MfÖ pg焜s?' g‘œß‚x#%£/¸êÂ<ž]‚Œ-[‚‡0]G0mt/*Áá•à©;ÿGiÁ¦ Ä@²õ[Ï/™Ð›š@Ø$Hš6gÖʄ Aä֏P&ZƒŒý”LâÌ9‚%Ûí7‚Å®րAÙ¹þÈ 3êªÄiŸxõùÁ‹Àq™Æú-ñLp“ ‰±õžŒÈ äñœÔ +ûÀzæ§þ>ú¼!"o2 C¬ÒÀÁx…è mØŒ¬Ho𠹎Çdgu?ø AkãA4,xà±¢f¬ÿ ~56ø¾u†o¸Ø»ƒ? m5—;¸ãù‡!z+ßësʬä.ö= ~,8³ŸÁb|–ðϽËäÜ(lسJ=·µ9¥œ~6rtƒš‰BèE0ÆN_åeòàŽrŒ€ÿ±c—è5ù*Å1Öì¯?–©lí¸ÛŸQE+‰vÿF¿½3 <°x{&`7 N fÑ„Nž$ü=OÌÙ`)åü[l°¢z¾ƒm -­!;®ò°©µý4 S, bVŸÁ@?ò–Ðæjþ Š4]Jv’`TŸy3Xt…6¨oUÙ„¹|…¯ O߃x!éü0°¥Lã\zöA–ÒïµÚþhHy›óX_¶ƒßLUÈÿ•Î™ Ô a•Ñ;+º2¾ã@NéÆ÷Ä©ön÷ ¢že9Ðلw"s=KL7éT`ÅáÉ£‚`ëw=mFD o f3 Áp.xʀ„Kôo +VТÀl“ûm›²µY:­AA¡q0Âû„~š=A(û`'pýp:9;ۅ“Écj¼3ƒ"ÀYéó×ѕÜ"¤/M‘yÖ«&~>ãro€´H?Rõ} žÂúg­= -Øi7 Œ4 æA7dšz¸_†M‰¤V¥&z"0£<ú‹¶åYÒáD—#ô¹<˜ÂÛ Ax +Œ‰øêaº(»°, Pi 4Ù àó>gx–8š¼è ÚÁoó}­è¦€\â§ÁóݒHr ¿¥2Å`þï.ŒÎÒ7ÿB²×ÀÁ'øè^,ð-º ÐJþ<Æ,Èó•‘Pd4¤'(0[[€­&&t~Õ¯Qâ<ÂҀcñ!Ñf,8-7wH“‡1ÖómÚ>Pƒª*Ì1¤Wk¨ƒP^i =€`ãnáÏ»e:'PCÄBÑBœ9c·Àü=4²lé"—VøMk½Ü/ÀñÁ;0¡¥wŸ6)ù¢Aޟ Ø¢_Ë(“kß1ø"ÍoÀþ–úh­ œ ˜ýO±2q$þ—ßÐ.€½]å¢ U¢ð>ìMÛ°…÷ð=×÷I`}ÀÑèéÑîË]‘ ÐÆùá*æ?C‹. ,Wœfþ9¹Zøè{–8þéþB:gºûi#ýA^߉ÒU§( üFW€Â6HÏd0ö—¢ç-IJÚ|-ôßóãÕãL)ñŽ&ü OØ œš›¢göQ—‰xw¢W› æ>ñßEML0} ñC3¸ˆÒ@hTä2tˆ(Ý3|®OÂ;”ãòï}RcT 爤K1þG- þ£’ƈ¦½u-QúËp¨Îj}£ %ŽºšŒ°L jx´1ƒÍË;Uâ]¡¥Ý gÞÝßÇÄEd â“!#—#25£ï×ù§/ÒKÑÅðÉ70Ýÿ«(U/kZ½fdfVC§•U%šÝÙùÊê^Reá̯>°•UÕÑ·€ƒÆôQ×t2MÔē™7ü q'zd‹ÛðNô ¢-$W*’£2Ë´ÓÐø÷À-ö-DãDDäú= 2A&ÈÈc›l“­)¦abHè1Dd+—Í8ÄÔkÔ}¥™øǶÑ؄ Nnd^„÷ß6ðm 8A†h¼°ßæïPg@Ó©ÕÌjtÈòŒÈj46feeff3³×Ël`¥Ðàªfö ݸ0Qvi'ÿ z?Þê_ÜPcdfF†t7©Y™ [Zý¾0͍gÚ9劊¨ +’ã•õüw)+ü`¦†É“"vÉi>#­Û`jÐ&­–Ї }H¨UÖ¢úÕ!D¶]ÕÀêÐÂE…5U䴔í{LI%ýaYBa ` ™ŠÆqˆÛd3´9qx’Ç z÷q2b“´›Ñù@9!“•Á͍ù ífÜÆäëGÑÑùþÙÝì£qYg#ËÎìß(œÜÙÝÍ(º{kDvgâ'h½îìì~‚—g—w¿ßŝÝRÑáð@Jô¢ðò2³J3³Lx\÷Ñõ0Âp²R“‘õý°˜Ëk`ø™™‹ˆ‘Û'¦¨d7sP³°@‰ãTÓ²Ø;0. +^08J\~POô<‰!ca-Óðã®í_ êߺÈÝj&, +dVáäȜ¡ÙÎ5÷=™V§ÛÇ'ڄ¸Äo„}µ‚>ÖT{*$’¯ +A# H€—û¦‡Þ×¢{¿»sO- w˜ÊDýMä§zv’ƒI1€S3ßr©‡[S¢‰¸ +©>V‚’%Œde#çZ£ó”˜–¶µGC +Ú¨>%6;–8RC\9n +͸YTN[ èD¤¤BØ(Ù Æ{º{Œ µÏÚûÇl Y2@‚¿FzæÎVOÀ:Sxg‚Ƀ´ UÖQ>I ΀X?N^Ì¡*@vbR:©vGq. +Òª¢–!:VÝo„ðL3Táb灈Вž«þ`Ê>=1uLXx(€Rn:@PŸ CÛHzp€¾&ì·Î €©lp…ºžÄ!3ªûð€ÐMaªqÓuÁ ¾å[¦d“š (õ ‚HÈ8þc1ÎÔ&³¹O=ˆ²–b-âèÛùTÔ¬Žã°ÄT²3 ¨G°­´ÓÏ{-muþp{ˆü?_ÈGáúþ¨¤÷Øf1[G#SÌ?ÅyôA`l +UþèÎPˆœzp¦]úcPF±ãfγxÝR¼¥õ¦DìûãҕÃ<$ÊéÆd,¨h(>ÒOÝW‘:ړd $v:ç‘ÃɁ©y\NʤÇDjŠöG¤cN<æþô¨¯ÄËþ@D@©¼¸Á›ˆöGÔ@À{æq÷a¾`¯ë$åñ=uv6ç˜*KèýlÅò¬î‡êWs7íT4I¿¸Y‚òðŽq C&èÓ_ŠÓEf¬éñ“óÀøcÇB4çÚ؆£iĝpß1¹5üQ¹‡¤2Q‰³·ùÞç“6W«ÜÛL-҃VòdTÒî·ÄþoÁM%2ƒS§Çs]fŒZj܏¥ÕèE¡0!ÑD‹‹F¿@ÿŒ8ÛOÁ•úâ7˜4É~P²W±¢Ú­`?@þUõúQÒ+i$ÛÒú¡wdT®Bá¿Æk-^Œà8?ìŽ¯ñn°˜p¦Õ•þ'úa|<Àöäϋrüéá5!Ž%¾,ƒjU"`ôãäÑ žæ‰~@J*›ë¹j¡[±ã! †0'ýØa„lEÙE˜ˆYùŸÀÞ÷ë­À²"r‹ðüØ©åoáWçGU0^"†"[çG1äK5tÃëAR‹ÚüpI–aõ;–Žd ­ËQÀ _øƒÈŠŽé +éÎqÎ{ãúIý\jŽ ZÞª6ASØü'´e@æE™ÇüÈÛJfrñoŠÝ‰ ãû•kBP°*súMˆ³‡Q Hñí‹ ŠÅWH¸8¦B¸JXâÇâúøÜG +!›úës.?>?2žÄSyì;jW{wtâû9~h3sX—f¬¶K/ar# ßÇl2!þ–Ð$jmï5é…[Qqò>7~?‡‘âZøò ³‡÷±J†Eù±ªl; ¸˜/í‚÷`pDÒ6ÎÞ>¤]¡nø^Ý¡=û§ý£·qÀÉÚ¤“šÚÇÍá¥>„‘(['ÅØ·cRð~àBFª²†?À'5ÂKÑÕàcn&ôdž*á…?€!IáMrÂìƒGù@ÿìÁ§»ƒE‰©mE?Pš@Uñt Ù;0B?°$°è¼” +YeÆ>z`^Oô¦PuDa jBßÑù[‰ÂòÎø?[0#}¸M•õÑ÷Ÿ.)Ž…ëƒ3‡*÷È1áêÌh‘ö*´'â%Vñ>È®uaF"ÏO¡›:ºU”¦Ôǎ7¸©Æž>" EuÝòQFìt.ž—ž>[t¡Ø +¥{Ã1‹ó›¯#]µâUR“ÏË êé—ÐDå–õèh®°R,Ÿêácñt5‘o }”ejš{?Gª ¸AD`óÊGi?h|Ô+_(t>–  +±]vãêv—óAŞéÙè ³¢jB³Æ‘†÷ă JЏ³ÒUó0Œ-ÒçÃß,Š~ý°Cóò%&SŽôˆíù%*h¸.ŸS˜ ßrúÐO~„pÆ´~IØ\†ÙÏO%”õŽÿè7$lõœé +—|taìàM:¿Ð‘ÉÇZ—øÅÜé·ðh-^ª\çVÉÇ„D!‡£D|ôŽMÒîƒú‹õ™|xÌ ÑÅ×ÝÇê>J|ù–¸ën9æòøè<ù‹ÀPÆ­¡iñäŒ_¨•4·øГ²:`yS+­ˆSa²ýuÂô æ̈<È\tw¨([ +CýLа ;ƒ9*ÑD†©Ù¥Üá4-´—¡‰ß°.1û¼zâ@r=ے8ÀLÚ¼Ðsßþhä'ÐÀ¦ê¹|)´QÝ<4ïgBÖÍNãÏ­¯·ìà°Ëñ€Ñ–jÎ},)æš)•ÃÆW]/AæÈZMÅÀ·2Ò‹u0çŸQ·ÎU«á¼•q¾”ß`-HÁŒVƒøª.7”ÓfÂ× ¨”‡åÅSê‹Îš)„敤&Æ)- iÃy°aôb s¤ôGŠ(u"goÜoc吒—‚VÖ&b¿—Æ|$\'RC8f iŸŒ-4y†eΩÁ¤O€"Êq§F”µ1e U tˆ¢\@‹+Tz°£cOZïõÌ1‡M9ÌÖ#4OR1Ó †¤W¶ÔÂàj`É|q]L,àaÙ~«žz$åë'eRþçâ~øÑå"EÒôÕ¯ r™=”Ûï&}øŃü^ØÒu²Ì÷ʱ3ôS[» -Ú4먵 +Ú_èÅ(Ùàٍ“æÇ1îàD”m¯—Ä2óî&@ºÛ4™ëz%]¤S“åxñ±©t +D{Œ@4‹r%°# ! 7\,‹¢ *¨¶Ü«Ú 0¤¤fOÎA]Â%ßG=#;*C»/҅š)†ID²ù½÷‘†˜¾ /öM¨¥·:ÜÄÈ0ž².ǔ)òý¦ü fp Ë'¿ð^N‡mÊXh&×ì¢ÅIÓÜ ©c¼ƒDˆH,$¬HÖó¿:…íTHÊÐÔ§4ʑÈp”Žº+:E_áR’Jšªˆ +7Cj¢ëdžç’Îûm«Tep§$GϽVƒSÐò¹]ÛñV7Lö— ¨ªÈ—§G˜Ûžk @,¸™ ‘ŠƒúÍa¥Íd®Ãº*{û"€#yhî9ß ~/|Ì:¤Õ'~'[Ä "``¼ÄÕûÿÍddÝÏ£Äαÿ+/MÄÉÔw‹ÜßaÄ•Ž‹„¶ûåäGa 0ԁ¤ôÛ|Ž#hST/†N!$‘ö£¤LEÁ8nÚ aäY74º§˜Ö•FGI ü:¯¢ÊmC.F„Õ•MÕåšG…**B«h]FõS™F`vìÖeR!>됳àñf­_¾tlÞLxrÀîÑW•¤}–†*!ÝÉ4T4}Ô±kÄNfóˆxtd_Ž4èqá¾%•³ØnU@ãuQ¦p´‹LÝcÔ÷‰A¶3 &ëøƒtàZNÛÀ<ŠÕ†* ¯ÃTúƝ²jF×BM–y`OÉ·‚Áö£°š¢ª™v3þFQõ•&griæa G&B¡tF9¨-ä¹jwV’ +s›û68çØú;óP»½$d\½³ÐÉ ø‚ä¡%¦nfšR ¦‡ß¬No:ö`XQnÂ!,…q±Æ]ô <4(|^´<#Æ­ÍCOs͈1´̃ý…y‹F<<Q5V¦ÍC‡êz2¢Ê|eώƒ\<ù8•a9º;Œdç+«(ØY(6ð†q¢ôA‘fe”®¥5iÅC¿ QePIGÃx.aUÓiác$B½h•WÏ ê•\‰ÏÕ¶ [È.04 š~’Jôü90@U0éÎC?‹KI²9»IíŒéªÛ"êtd#¢ž_¨“Œã_àŽ”Ü?Ž?W©ÎÙ*|GƽØÓi4«=vçÎVå–™>ÀkŠ p1ݼÌGµºj2ó`>¾Æ³„Et–¨Í;D‘;A¿‚5è<¹4¦f8Sl›§²oÁÏ)RR3‹ÿüw¾æΥȪ~Hÿ¤FCD‚¹,]‹„î=p¿¸\¹ƒ¥²ó÷à̝b£Æ$’Í97 6ŒâŽ±ÔÖÙptš¹ÿPþ*oåD0! Ùp~Šd—glÑKwVK¹†e¨¸€¥}ŒêB]ô‰‡9‹^6~"Ô%¨˜œ£ÒUœHQLgeyT}}zÛ:Ü´¢†ÖÒ| 0³%oà@×z¹0Ý3Y˜öhhÑ5<µ$qˆ‚ +Ÿaëƒ4,€£ÂÌ7ñËBž +™Ká]ÃV¦†¦ jg#"ÁÝáÔ\²J#$Ue6»–bûDd%ZXÉDz}ÖM0ÕuoьaáR¦¯©ªØd3Z½ñoÃ|]ê!£ăÔm­X;Qvꢆ{Ef¤ÛKß(î +B+yFL®dA ¤,?« êÊÆußÆCñi¹:\G:ّÝ:`/!Aá>Q£ÌÖfè3¸^È>•8ÝçÈÀóp» µŠm¤ûáe&Ú”?1âӑM“B £ôœõúÍ8W ½@ÜÉ Œ>¾Ïfúç!ÊÀVþžÈð¬9E>ž„0L¦Âìv†ç‚ß~ªÉ¿hóÏs’V t …Ÿ Í §'‹‚¦/¿Š‹~˜)SºC-=È4Väòϐ³vþ®ö7՝bgA) ´+¨ àZi 0ì¹à“[±zqóo,ËZŠI˜†êUÙì¸"ޏè0Eˆ6i”¤ lÏü&‰SLj¡‰ü€£S‹qîX¹7uÀìkÀ»˜ÕïÊÌ ±Ñô7ócxü¾!ÍÊ:*o ÷8YŠFˆ(ýP[ùøS‚[ñ…¼~u^µpÌæîÐÙi[nŽã5¿%âäl•dZ„Ù¡e +ŸÏÎò•0vˆRð,¡\:î_ójQ]Ñ;B¹†®²Ø}l¢¥!;1‹ô´»S·)ÛÆ ¿-ùªD+ f\â“ºðÅycŠê–0¦÷¡ze0 ;؏(=ã0{ûð›/ ÇâÀ)ÄÝn›Î»bいQ»ŠßW‹­¿6{“›¾1IÄ|}Dƒ×€¢„½ß0õӗç7ÀW ôlq`‚ >&“pé;v«ù‡([»sàŠM`¾`IXP©V(žÉsE¦œIŒñµ—jAFô)¢67WÄëy^T¨/º,¤cy›8Ö›”5j„6Úí$Ž¸ÚK…<€pKxè{ª’éÿ!ÈÜÜiéò6›íD,²AÈôÆ.Ç ÌÕ7p +Çf°M³|°I *dë…õF|íôF¢}’í‘Ô+›zRXÇÕÔFªˆ`[Oá„S cH*˜¢RËÁ„Bïzp`T54ºÖN•ë/I÷ì+‡¼jjc"h_.™Uu3Ùì ?؛Â4£˜ŒêÍÓ`Ik‹Œ1(ý†-\î7ÀÔñÖÓÓ°O _ð*«µÉ( æx¥°r°>Ù:\’ ]ö‘‚8×ÒÎWE­Ai™ƒ«Ýo +›G³Ëc‰ŒÿEŽð…E®¯š´é@2•·RæYqæÕ¹—üÚ+:YéÂêdz.^>®ŠÑÖíe0/{ãõ¼i­VàÀUžüYãÿ¾ÅÈåÿ^toú轄(»öÞâ'·©ÜÇZYþ(e«Ãª¨ªI„³ õwf[ÑÍöõEî´ÃA1i;V±ãÑ 3e 9Ðë?äXn¯š1¨@ôò2C™ã½·g{ f!J¥qÌ2²›ÛpEè³e´2(À5°ÒMzÿ f= +ÄCŽ¡HK ÅIHÿßSqi±GÍ +¬‡¤:]:ºV}­ªç +HÄ5TÔ}] +¤Üt]àˆK*!¸Ñ«(²ôl¿£ß¡(bþчéU’¡£wÅÆ%/Z†åQ–8F…”μQ©Ì!J—›áNº¼Ki9¹“²Kî°-ÉÁ¾é\DJÊóXlž†püuýÌY,¨—BÉ ¢•ë%ÜÎïI_d`–NXd»ÿڂ õºå‹ïŠHTå4‰@@ âÂ®& +ÀÕ|5 æ%sæC¦E\ŒçðIi©«(¬Cà³ñ”×˾)‹;ùr9èšÁš9fyÀÇÈ·DÌ$€4È´Ò2vÇà#æ}Kµ|½E*¢D>™Ý"mISBÁ«å’>Ãf¯êt‘€iNpÔü%RÃ:" ×®t0.œ_ß ]Q݂ϛïÏ""qЈøô±˜UaåÞ©XÛð[Õ`f¶ƒhA£eZ/¤.1þ[EQ¹ÿ)w0ZH¶5 =ùáÖ¤^ê$õHœjoãv·]ü?Ó\<Ã(Ÿó1è/ÀXëBõY睿å&èÀ|ã?’ÙÁ,íµóY2•lnšüú!Şû^ïsïâ^§s +bgւh,UÞ6͏G›|÷Þ•ðN£Ev/0•JZA}$ò¿yåY€qs¸1GK6<#€×j¤‘%Ø©nª…w" ŠdâàZr0JÇj&q›\y¨4/JaôŒÓZZ_×%bð]<ð…Y ðø8ån´äÊ<@"T)È©êb_G'y*\ÈíÕݯT%¢7ùBW#°ó ÙÑ"ӌòÈ#çëa6§Rª‰/P¶4Yà›õê©NeL>ˆ5CÏ­£ã”Qp¼‚&®WÒ~†·O#T(¦HcÎä„Ü œ¹’ ë©?/†Æª®ï8ýuM `*/ÓäÐm UÙt‚¬p ïYgDÓv`²"KÉpŽ[:{Ò¯°q}e™ó µ/V•Q‹¶L¦{Oó"x)eöz„l…O¼?J²·Iyz¦ß_O3.X¶Üd_‰u²Ì«nÒmj¡‘8“xŸ¬IŠ,—>?é7‰ü¨™Es%ƒ)Æ_ëÊBe7°Ðùù¥Æ±Éô‚„ž1"²¥XHbn£ßñ&h>^ô⠒ÿ–‚£­$óR92-©{À7€'’ΪFµšŠÙ'•ñ0gVÈNy)¡‹¼ß™ås1æLꂪTf†P÷:"IX´pƒZ²‡r,êN +§=Ú­ÐèO¿ÿf‰ÒE‘® œ¼¥(¾ÕŽ­uĊ£ß—g.a¨3ôz3Eч«}8ÅÂ_¢~™}Ê縃2® ½‘Z&²«´$ƒâoÛLâ=,½Â™xóž:bð(ÛÖóPº ýX •u[Su@¨æéìÜôF™„3ûìyбË)Zî(BÑÇW7 ³¾t„|ÔH¦º.†}|U[d¨†Q°7±Aç2É®ãg÷u¦!Ùݼ +»¡ÉˆÅss)qþݖZðÛî1ð–"ÝŽ'„ïdOc⼧ß5Ãé¨1¨÷M¦-U}åD†#SkÀñ¯Utރ jbV‰ç1ëjìƐA[!Wñ¨” ûú°«YÉ0Ö< l 8ú=ò×t])N¡î•d91…‡î&RQÄž†ù—µ‚ÛD6$W\²æoê\מtyŽ–›ÚAtu%áТö È©^éé2nb\ñ•ûŠôøBÊAù×õO" +;¸E}çҀÁØЎö¾†%žPè FßfU~~ǁJ…ŒÇ^¦–ÏFóÕNõk +q¤‘ÍE-PbŸ±ø݅~¬¬eëÀ(!Ï힚ÁÃW÷ë¶D4'‹ºŸCƒ‡ï<ø}Ò·ŸØMÉ8ÔìTÓ»¸?â” ž_«¡ñÉøÌ­Æ¢¶ž1ãÈE+y-U…Ì…0K±…ü(Ó"yŸÆ‘ß/¿¸Ôx)`CS.¤ª_Œ÷ðµŠ'”áïŸfèòi†.ã+àV€ ¾ãŒÍ-É¿ Tꡂy8#°ÓԄpNÐãìÓ8gœP€ ù‡ 3da3ì gËÙ1oœRÓMSÍáD +î2pc0@@S&MD`³9cÚpjóX—– Ëêf9z»j §ó]r/ Á`”`‘' êø©ûpF´²döÒGÛ¨Íãc·ãU¤b\ì¼dü˜X,FšärÌ_âXIÚ?³bd…^®Áöí̳Tf˜ä“Á/JZ² ã˜3¢^Û3¾ì~t€„™ÔèCݤý¿èªtä8rTþ׃„•Ð¨ˆØŠ­4Ôà€V¿©Â3šÛÎÈé9V<Ûę$AžþéÛð*0žÝA8Ø+ÞÃ:"П“¸k»«Ø•\uþÿ“8?دýÅÞ)«æZ¶QÿÜáœÀs„ðÍÆl˜# V6fÙ[‚¶«ê/o€hþ ÍÖ äå̵­ ÃtJaK8¸ÑW^à{±yu뾺 (:CN<ÒvTwäŠ_۔ZÞ‚\ŽÍ:V–¥ã@ŸÝõ¯‘_åÆßÜ£ïI5f|t½TÅ`jÂ\^Uò8ðœ7L‰Í ~¼“’o›[ðö7< ª˜xhþ 6‹«dɳ—.WÉj>J‘5±>þ“coÈk6 Í§’IðO'gLX'JŽæ(ú»ºLÆLˆáaÑíqë|øã +¶6ᦉ³±{^4·]¨‹H¬÷zUŠmTÞD¢h3KjÈ}Êψï.!L‰sºbøü"HDe,uUGìèzðOàiJ6"½©'Pvª¶¸ t}æÖT€¿JѹaÑùU»¨³)7Þ횥7ÞwV|b{6Pý~r!uØÊÓ=Ú妲À̜¼»ºöŠe8D`8Õ¿óµl°z•¼b`×(އ¾;ª"a›Æ• +“x¬‡Œï“"{6H@¹gõ u…=B ; ×aXqáD8Í¿SÙÆ*eȉ˻dy‚CMÄwí(`ŸVg‘,ãÃ¥Hÿ 3löÀŸÉî_-6êë{é)‡D`ý‡þ¬ã%°vœʆ,QÇÒÌ'²´±oa» ÜÚËN'¨Ž4%F|‡›€Ñb~‚^Š ⥊öñ˜ä¸±¤Ð ˆÒ «hÁUÂ_ﲗ:A8žTCóOpY9R;ö]PPӕ3 ®Ü–Q5ùHï„14O<û9}LIÆ#ñwÙÜ¿mS5׌n³[23Ø*¢¿Ã]yÆô„š¹+÷R3¯émȸå'GG¦‹QÎMñðMï³â__z8Z©ãºŒ®RQšãö(xx…~ Q"@Á BÛ/©n§[›óŠŽcÔ +Ë<ƒ“rRÁ‚¼Hé«eLá‹gvÖÅå17! §®½NŸ?G‚ ¹‡!DA<)øÁ¦8ˆ›Õ£ŗ §¯úz”@ÙqÊ`AQÍ YŸú ðzöV^z²i$!7Ì,UÂdJqfææ6> +žfzŠÉ / ç„æ(ÂÀ‘³6­×§@„;Å;±a:ڝÆzNµÛؕ¤êHS݈"÷4°²w‚[ÃÆ¢3‚hM|ÿċƜî Z³“´â[°ÇÓ·¨Ðáž6e릃Ñ_#¾Y’õ׊ºÔç6SÕ,ŠLÁ+bcK˜8" +‚æւbçøóH¸Sš5OÉ^ ̾!X +ˆO|û‚E³¢,9Ãðs áÐ v!2Õ¿2 æfhûv¤ùÈcŒ\pʳÛS6©%ƅî“ $|ªžO ÂÕMæmVÜê‚£ŸÃ\tFd¤/úôÒµ¹Úù½H¥òàÎM—NÍSå¨ê:«6w˜‹Ÿƒ¬§ø,ù +ŠáHÓ,ÞÑm=Á-q)äqÙË`T!蠋’#LÄhEþ%q>åEÁ';ýw¨¸.eñّ7%3mîë'k%Vô7å=Ä"·Êisžc:»ÀL*ÅÙÀ,$f Æv2ú0…¾²‚ © 4MNÛ[Í:Æ'a’A TH ° Bt1Õ¸g!¥˜,îöàN Ö @‹þÆgæ­¬ [æøêãVYëݦXû†Un5#*üÅY4Øð‰¼!¹Åh½ïÃC%a e”;š'»ÿrR±„µq:XÐ @£—˜ø™ ð£òª#ޝ`°äœdkD{ß|î2Ž¼µUhÔÑ +G²nä p°®4⦞q‰º“²WXÍ!XtŽL¬öRèvQ®úºÅ{[@t³|y:Ì°B—‚Í¿?s±/µ¿ƒâ3±l”ý?ûøÞ=µ6ï“L;À#àirRØ÷&OQvؒŹÖúƒ?j¡µ:8|AO·C—è`à] +à£ÒÈ[Á ¦–#@ïSU¢ÙÛSÂÍTå÷l.¯…+ߔ´f¹Æ§“4/=n¡“辨TæÂ(b,Ì'÷]J³‚ú1Ӓܷ¨ h́yn CFGå®5smŠpƒ‰€ƒt‚~mƒ jiS,A?…Ôšæïo!/˜E‚þ²ôb²†£¯Ð¢˜ sv$LÐmœ¢‰ +ÇPÀº¶ÐqY‚(ž’I|Ú[sû—vê$u ‰r*b¾ø„ÁßWj”ʏ3šÙ Aœ—Î!ÈT.øþBÛ¶Yö+ á-)ŽO@¾×Ú²aziiGS>¢I°”ã“è;>)5kïuRݳ«çné)\Wh¢½Èo„Å•šÇîÏ4¯øB“ô‰ý`ÂÎ9dd·Ãgæj’ï%lŒ†ä8«÷¬OÆݗÍ& S®>±õÔQ=±Â'F *O>¹¡i 7tTàC››\ÐîgD¡1Âñp•¨“l˹D} ö츨ì™ÜÉÄ\lR— §ÔÄÁ šç²:'{%–¦°-läz4¨±Õ¦ù,ĂðF¾UéãΑiq©LÀ~–ù ¿ñԐì!wˆX2žf\gz„J8‹B!>…W˜ÂZ1e!záPq¡^ªEÙϹ³Üpó-ϜíÒtR7­*rw@#—+Ï43"óÃÔ$1eÒµ…_LO±ÐjŸ"àZ‹ÂâTLŒÏF î† ÷ñç]GaKcˆ §ؘF‰ p0ºóýòlûYR×*å;1ìU†ùƒš_†Wà?¢p¬€BÀ`)(¤s¸¨ô°þ‚‚ÑB\ +b›óª å3\d‹¸CTH‚Å`J;‰Ôã-³‹€{ò$¦ñGÎÀ©.f´åÉQ2IxaŸú@4µw2™¾þûMéá«Ï"¸•ý¹1ƒõ‚²D³S½Ã̳½ÄÊL×çÿ›”:5ìK‡›¶ñgø£ÜÁƊ.ªúQ@t¯šœà¥¿¨Å©ON_nƒ•%å,߁‹ûÓä> +zOÔI'*û{o§t>)œœGƒÏÄ>yïM¬l¢ÛóÞ/a‘)ªÑk]%Á¿¬ñ+H÷ä·8À‚³ˆÈ˜œn»À¤`XÎhî³NܛÁ Wç§D]±l»¾.‚ka™ÕN뛀Êt°Ò™ÇEJÛýOM‘_ÈÊT”Ãõ¸xØXʲoçP( +<:LŒûÏGèxâ”õý›EÌÔ)¸ªqJá¤FëU+51L53ª‡±Vp_Á@­Ñ^zéÚ®jp@€ÿãˆÿוì +LÕÁórÉpfœ¬KpL qîͪѠٷ|‡™Š¬ *žž´ Í£`a½*h;ßòƉ:È[¦òg’†;¥È§§–on÷ÏáûúRÃÕ3FÁêÂMAjZ:o±P4(3lb0m> =G!PÁ­|ê© »€C8òMv©Ú)Î-ÆÙ>Á…)·8Z*¸\o†Ù¼Î7›4àXbõ‹ºÓõÂþ<ˀ8|w§<ẝ&0"» ;ÙEÊ<ØЦ´”§’É’òW©ï1o1K&ˆ 5Kù¢[îÕâ2ü!7’ò’P ¤#ü‘ûX +2EW¤(œ?—{߅ö°<°Ð½1n€(T +g]0÷Îã¹µC|Y¨\”aˆ¢3ÊÆ7¿r\=âx60Øìkü„°²DCNR«5~ú‰TK©Ø+º¡À+ï¸sHÃc@S¼€¦y0¼Š]r¼Ð8hwsܳ3Ê4v†M‘í­lA_´UrÐÞÓþ‹ +WÒ¹M± I†@Y¹$ÊÌ=gíLjü „›²×º8œ9ÏT‰‚w3?\k8EҐZa>°@œ!Œ© 甕¦(Q29óš—'JÒc(xã’ž•„Íb>áؾヌS5 îœñÃß ³W +â$ + KˆF&8Ü5\ä‘íGæ‚2y8æ±Q˜2ÍþIª·3LukyÎ(³î¸÷¶Ÿ*úã·!ªL²‘XÅÁ™)´´áIC@°„ÄJÈÇQ–`¢ÅF že« ³ü9g"æv±¥&g¼ G“bKx,#¢8Vï|„«ì?pZî6@øð°M®0~˜²˜µ° Ë¹ã,P´›ü˕¸"„׫Ú8€Pô³¢« &ô’ö¸æDՆù5ÂIÞɼ½~GMâ¯ì#ærÄْ§—´¿¨UðëÔÀó~›…¡(ÿÒxý$d!Gý˜{Gä?’¢eZÑ~4w=ŽÕÒØ] D#4 +Õpê,¶ˆ@3û`î ÛÅb¹=—«ºøª¹zjŬ¸ù£½25!ïrŒ‹›×O„Ê^Û«`URßՁ¹òŸ¸¤É¨Õ,“Ü´ËÐ/ré8ÅNŒ’§‘°Mú^‚ðË35MâîםAb· 5À#ºYî9-@ÞðéþÆ +çÔ;‚ê4†ã¡NOOsï[½*ñêzÍp7,|„™*W›’ÄÖÇIäüMË:0#¢i^E° +ñ{7ÓUJø(Ü8 àô²E»Ô±?ßâÃ4çàojD·gEŠTҝµóÐ=ê=x¡0èåt§žœJ܁ss"sÍúQ?ív¤ lÚÏU”<˜H‹çërx•!}„~²L€õ²>XÌ4.Âz&‡‰fK¬© Btåµ3¸ovKV~ÓEŽä Ìþ¨Óô€Ï +Mlg4ÐÒ!P.ÐÏ՛‚C!šr)Ӂ=¯@«Èæäv?TºA§ ÀjD¾C¨î’;IJR | &•Â_–Þòœ<¡ÚD´¿o +‰IR¡!kÐK »Â!³rØÐŒË £ŠóæÇAäp>“ n_ i—5Ð~èø+Á«óÎc¡c;Xl3xý" U vº¾Q\ôuóòÿÈz¬XÙ«õ’\šK +mæ½y­~› ¶qõÅòU$‹ÅæÑÄ;ù–M;Eë!Õ šÍágI*?êdÆ·V›XyÀU½¸ŒŠTÚKµX҄3Ýg±bÄQQ¶Æ­‰lÚÙV@®u.(êƒnTÍ/‰ þF¢ ]µ¶9½Mܗ­:x2EH‰“üD*½‡ËÅ~O^À*—‡“Iož1`>ü?}PZÛìæ*HTðÛ¤Í?p&$Ae9eí? ÇÃ? ©i±¿vmRKj×6 Ö:p¦aøxù=ƨGÉJ‹èÓKlBﲩ¢¿·žsÚ(¾Dž 6?EükHˆÖVßµóàå„fIv‡Øøá£P_g}ñ¨r„ÞLÖÇe2Ç\Ø×åÈîDkýÍ(µՀµ‡ ‚À1t×o¼tùËúrSÇíi²†˜Ã ùžeš¦{ï;U´®@H¡ÂÀ—È_ªQîweÎ¡ÜBÚÊñûTæ¢BÆÈk«ëÍ\„Ÿ­0ïhsI×¼”n$SGm/$]™¿œN¢1~x¹,!æü5«±¢®µÍ7@±”AyY:\(Ó +Õt‘õš¼“ôr˜àÕ/¡ªpߔ óR¬Vtx&õžVü%*äÉø•¡˜R3e€S¶ ãÄÏԄŸ_æ{+¡þ:ÂPPŒüy®Ú¥|#ۏÆ'£°qÍ3o“õ›fd‚zý‰žw¥T ^rǗ]t ¨/–OP>4y@òr‹•\°UlZF$Ž…æ3(&"éy¼Pì(09”1qk!bÌÑú?g`’—]é˜pˆ5´(ùôbç -`õ8›ñâ']p»ÍWènš ^ •M3]ºNLˆPÉѱ^p¯äìÒ &=\?ONìX×窲¯³³‹g2G³pX…úÝaÔÛÀp;î«ð¨~%¾jM…E„ ¸°€S^ ìe‘UY$@R¿Òó^òH¦ðöHQ@7¥}F„%òk +9&‚Ö{é&þ‘-®ŠÐjÑá»jÅ»Âý™Ü´`½<*ÐlœjbO’ü$dØ ÕÁ¨ŸàÙ=T‘@—¿‘Gc¶©•œÌ'KÎÁе”£äd.½Ãs(j¿Í(E^\ÇárntNˆÚàƒoJš½7 nº ʔŽ>\ÜÞ,z~²6þ J8ŒVÐB4À¶£.bõv&gô +C z“Å-€1.­ ÔÿÁtŠb… r*¥Ší¹mJ}QÏôÇ7{<.ñkB¢‰ÜtDÙgÌ×x¡n܎ػ=>v oMáªÊ„NPòP±þtµŠOم0»6 €*¦·8N·$U¤@%#‡ôпÀH‘lòð–iÁy€€Â‡ÇLow‹i ¤a [ 2§‚kVí5\ð…Y´âJNØD±…ewâ‡pŸJ¼™iÆñy̎Ç5#êí”Æ2†ÝÁ1¡À9ÆÔÄGrrÃEv­g•æáùææ³=bÎv? µ†£#§/(½›~Ç;vٹ堥sã;D`kê¢ê¥óáR ^B-Ay·˜ˆ &t 67¬îŒÒËeâ˵~³¼è@‰—KÐZ2övO¤ŒPj´Ó²ÀS—š+b±•×UÖ’ ¸”vN¬CŸÃÄ¡ñóXkeœ]ë  ü©'YûC2X­ ±h-x¡ýÁŒ¦ˆ4™²yð¾Öu'yñu‡g"KHÝÿ¯†û'|!ûÁ²jºP ¼öÇ7Sã8g¡°‘+ qOIäaä4Æ=W“ù ¸GŽ£§ˆ3Bx›²Úzùð¨é€F†ˆÎcåðõç‹f ¤‘D¬ðžß¿ |¢>cJºÔåÿ•sGá«À& îñzTU”Þd!J…Ƶâi‹6(˜ÃY±¦±ßÙØÀtk ¨d`¢+ʱ+j’™Ü)¾ìה÷ û«ÃãGŸ#)ªåF×ù>Ó{˜ºÍâ -Æñ=+äL$LËô–íˆyDúŒúÂÌZ¾ñÞé #Œ-eøG5h³Ì®ã,·ÛNÖ°7N˗v§àð[ôt– ìÊs@ìF•yqn3Wü.*¨È|O1ª\ð9ӇÁ¢Ãi1`¦ßzS?3 A MOPöLò~-£"a!ÀÎäDfE»T°’Ò–8)Ãsh—ôPWÁ1(°prydó2“½â&MàN‡~W€ðÌ=7TÀ²µúõS\í²šÁ¥!ç³÷Ê5DÒíDlÔäˆyñ«ìÌ3¢ -[ÝjB±ûR¦èkø€fŸVT€g`=ºAYÖÿN<_aŒõ]úBÿú£ÑdN–ӑBSvï +5·Ÿ´˜}£;x^Óðy)Å4RSÃÏøîKæ[†ß4t…hp>§<‘Y&oºÃÜz?»ÀMÿo2žØ%°ÙÛ*¹lb’4@WôûÑÅ(ë€ùÚ(B®àis|µ‹ܕç”Ö‘ ¤@#ئ ä÷Y¾F_]ùŽ ‡Qi7(Ü<Â\ɍ¾;)3åÛTbk˜1UMÔ5œD»š¤=œY.<¶Lë”ö^w^p‡Ýµ÷K[2ƒÉ@æ=š7´yt\É¡sÆw1#ö(W…4Ž?)چ +É9ì[Dà9Í,ÜB:¥ â>îeƒ:†d¸[1v¹LW' ú¹ ¯Î{®Å1Ö0ýˆæ}ð:]Ž0ðq!ÎÚlµ<ßÑڒ4£ŸBSӐ±c×·-wyOäKLöôm„ämê+3˜É=Òk6rž/Ü îÌ(}ôc%û`gÏ·¤/,öÈ›˜:€Ün;¼SÑÄüèiú P•†1üï"[žß¶=‚'¤ØÂÊG"þG0ª}–mÝn%¼G:灼Ç@s/ÜÚºf¹­Y:æ)šð&—ah…ü€Qç€Î­J®é…ǵ`À@3a-%\jN] góœÃHù«õc”öpÎÖz’^Iòwã”Âì_¦ì ¢’ý†}TÆMå3µIõB +ãm¢›HŸ›.V!²Êùª¨)ÂNxÍIƒåâ£Ùþ5Î/¿¦œ¥ˆnxž—xÅ¢‚»?Á¥a*±€4*-Óå_mÇќ?>Fú-‹ÐpŒ‚î¨…¨$î›ò84õ²::a±û÷&cqôãBÜMÔàŒÑ]O–úQë˜0˜Ûd’ÜQK›¶)Y0Â?ý‰Å)öŒqʏk‡ßœ+ÐУ7˜çx»³ýÖ%Ý R|D]½Äµ¢)évœHßpNB,Fâl„;·'W ÑýtœÝ­ç¤ +) 0¸çCå·ï–UÌöëïiçªJa'-dr6!Õ?ó i±¸Ñr¡uÅ.µ]’¢Íÿ×ÒH® +¸‘õTp.QvQÛ©’‡ÏQ¤x”{u‡÷g½_ý+ž…P_l—º£0èW2˜M™¢0¹º<€kÿ¹ŠªS\†¸x¾FUžB«‡‹ÄGçBgnNÝ£‡ØzôB§ajXÓØÏ미$Ö©hß±Ì)ÌÈV兕^ø@\r‘yÉÓÌfödmúm¤[ê9^²Çì¦w%„9É7SP=:–ˆ›³ÔH⸙sÑZÇ`…  Ã1Yj6¡Y«‡dª +ÆtºÑ¡íþ‘0rJŸ ³Šäl*àþ‹ýQ4a]ºLś=Ms¨:'ðySˆkÅíEhCTÜ;~Œ|ùª¥}=Îc¨L¦è×=¶R ӆ˜‡Bª>^Wû­z8Û xDÒKÛ*¦Ë®E䌡±µCzûӆ¤,ȱ•d³ ·/¼7 pÿWã@™ žX. J®0ârĸL9ú`ƳÂNŠ¤9hTز®…ÀC7tÖüîÄ’c":“L%BL‰>˜|c)ŠonˌGTü(FYP›É4™.„ûŸUÙñÕôÁ­#ÏÆ+i²ÎŒ[¦©ðl4O¿83“'¼Öhw è„"CC!KçÆ!üÝlÑ_¡‡Ü˜F×,>^‹SÒǘzðß7•^Ø2-†zÌñ-&TèYupã0¯ráò\¹’¼ϐÔQÅ÷ /FáFE¯OMŸ&ŠTpú¯¦fjɺÚø%ïéøàÚl§ºP ÅÌæúæÄIo|´vC  tkĆ×{TxƒCì/ö]6"Pçyƒ˜×^aúwsC„-š u‰´=È6i?2=èB¡qµ9J¹Èºf°–šTjk<—ѳx*ޞ/fÈÄyœYÖˆËMÓ ƒ’¬B€@šú×bGKZ™ A*6¬!åF·®´µìúÒ@Úï.ÉVá’h9@F”ô¢>jZy‹¶í¶¥$†=û Êv8K"¢“½LX®ñŒ¯5Úz³ðÉ¢*2Q“}s•î¶8mšÓ…;­¹IŠG»©p]ÂQ +Zß HdGy떇sÀñ’ƒ—0U+‹È÷Ã²¸÷›êv^Aãmē‡ô!( ¥K!oA¦¡··ëv†¯Ýàhx²6±nëk¥ä†}ˆìwYNÕ7\v—p‚ù+n²…Í€‘ó¯N3¬KŠvjÝù‰Nð=ê°öފ‰·xÿ€+Ë8uy/!#úAÄ*÷3a!’Î{ßí~ژç÷ƒÀKþ³ó+Òº_ÌU¢àQ=àÔ W\¶mBӛ³¼Œd¿G^à>ïD@°o4éÚ\…¤·ï%Ù ÃҞÌÖcÃV(‘qÃXü÷#ö,3gbgØÑú"t\¨Œ`,àb^ùäðßøƐa´°É¾Ô½‡„MB¦ÁÑÇò&G «aF%IŠ²¸äP"²åáÇ+p˜ËVjˆMOˆ “þEÔ¹Qm™z^/Ý©Øev‘ó‡uk{žïT’!§!l˜ÇXfUUFØãÄ(nÒMüæ‰a·ÈfQyœ‰4 äámSda%j¢®c‹Sª4“åã ÷€%ÌÊc÷TR4—f‡ÞÒ^ cOŽ0÷¸²XíªGgÕØ#A ¦W¥«œ£n0Zl—Q„Bn:ù06—›( Áb›@$Ò-n¿dTÖ¼¢Q,Ù?átÄ1h NURü¬)CMUCÜ$BÂEZæ ÁIÀ/Úf ²ëîŽSrsMƒ—hª¤gTT=Ÿ¡9„éÜX&=`ÿòÆÎrÒØBb˜[(.#?CNª¸# + Öj9š½J&Ýv2ÜÞçf¯ ž‰0Ê+8+ÙnvÂHL?´dìÐzÀ„/˜@fóNβú½ŠŠCªq=B]0׆ýýø@´]|pGyv9RD|Q8ÖLS…‰nÖl™]¦k$Y½Gl¼þ‰âA²FoNOÈ ka’kmG°ävÖvƵ{Æo ÈúÆêMºu§>ýùSó5Ðqõ¼ Ӛ҂üß¿r ”ƒðFõXÄ/ ‡˜èI\}YîDÏlýª¢™çWÜè‚!\y–Ìòßefm«$žç}Ãnñˆ|Ã*H‡Ûyx$R‡b&e€í¨+ËT§ì0\«³tÕܧO8›æc({êø‘ÈzõW4©N>3?ã­.Î)L–0A¼&ɕ$tqÌ +‚fãiI”é҈4sÀl©·7†:N¬ÐlˆqáÊÒ¥5± Ä]H;œÞŒ±^H%%–x§ýĝ‹sàlw¥.ÄÀÕ Úà9Ùºõó-N€bap}D ö…òHD@€BD✯ ¸‹ò+€)wfVf´%ršf¼óŒ ÊÈáNJÙâ»0¨¨¥YÖ{¤sßj;ê>*Ô¶€tْö´ãEűˆÐúfõ¹¸E`ÅÑb†šR…ÞÌä$:àä¦:¡¿‡‹IY‚]õÙ²ËÊÊï‡DÂQaR$TvŽíeuäRõÊñ¿XẦ~Z¥ÊMŒÔ¸2²ô'¼Áif´6¦%¹q€ &Bc:(½clXXF j›‘×WCé#v&¥ÓÈcˆ¦Eš‘ÂB)æã¢ðë|Ž—]«ó6ٛB›k?6F>Ã,x¤~mä{eÇ-â '‹‹‡–ÔûOÂ4@ ÄpK .èñIØí+³…3 DI$¢yŸ/.l9£d8ıZJ\eÔ5p!6° èX`L÷]bßҌ˜R¦g,‚ž„$èÒyY*'`¹ €0öçðáÝ"‡ùW½P°ÄãÅ_($RPš\†¨HБxχDó¡¿«G¬jŽruiVô—j*Á#)í³O](µô”Œøp-kÕƼF±P˜+о~Ξ§kÁൄ‡o‘Ña;ˆpîbüªœA=õ@´Ìޜ¼nAž½ * +€A+ΐñ4u½(æÜR£ü‹ ‰òDëÊo1+'W×G)¾¿`\pHÅ YôÈÁ¦£ÆdÈV)¾N4, àŸp`@Ñ1ã£Rº;åùLÄB­©dßiºVéc&:S, ^B×– +` «½–™ت°àÙe$UÛr³·hÌ¢ˆë01̏ª²H좤–Èþ„ Ïe)íTRg¢X,C ma0áؒŒ=̹Óݘh-Ÿ´GUÉ"œd €?iݔˬÍîpŽ0Q(­³´‘@ƒNcÛgD¥_‘ÙٔeÕE½/äm°Qü_J0ž_ ÙTæёhl'½SÁؽd%a·pôž e¼lÊ ÁzqH†€Ût,ôc£i`ALÆ`hš§µjdéE§åN]^ÏIùßp&Ճà vžÎ$Gvë8™l|‰u´r†Â9{™àÜDS)AÜ”‚ô¼pFR›ªPˆþ4°ÉJÒïnoÊ$Eß9ǞÞT§½gµ ƒ67gª‡×\`éÔf€# ³ŒdkwU?`÷›°Ö§Ÿ§it¸;bG¶ûРªsVtaâjX‹c B£—Ølb€U5ëLcá)Ç© Ø[“Ü(Q•sH š£/ìÞ4§,Çòvmž¼‚œÑmÈZ™ý„Fïل¦ Û´mà å˜}5kW¸ûÝ¦EŒmS“ HY¤2VGæšèÃ@Ò %›Ýss1üjquyp!”•'›ê ‚=ø|—în#^–ªu˜JÆ¡Œu2À¡Ójþþ‹É*ӓ#Q„ +]k‹9 %‚ñ®v—Nÿ•ñC*3HCíJLÁ2+X狭Úåʑ’µ=­4®ÂO¡+WIKŸó`àâ: ‡9?Ê \Æuý^ö,iM¸"†Ae"&' +-ï|—ü(ҏ->=$]¾—A ò¯8H—%¯¨‰–µøÛæ»Q£BL¼‚ae—û:ˆxEÔàÃ~?)t,NE³+í®¯ÏšÜ­­a#â-ÇHq[Dˇ®‚9)bêznƒLíþÅ¥²ÉåGųæ4Æ8aFeÄÈQïFîýmâÚ¡U-֖KR22¶ Ý n0÷äõãhx”ÕüÞ\l¥NŒ~ʗ +h!Ҫ̣Fp¨Ö¤ñ^>A‹_£à +Ä .&ƒ©)*¬îîÆÜük8ٔ¥¦žGLG}r0lòàLÝcVÓíȝ›à˜K+ioe§K?ZRÊ’à +hâ‘gïA ¾„òP@çòòû€s +*š)KA5«]_zHAž4¹և§xuÌǜênÉ È]Îâ«hL*X{Hèݕ`ÏÌÏõ“šÿ^­ÁUVLATÙ×ÿïi°´f“îu„"ø91Հ*˜ o`quUO@˜PžMƩՆۃgkJîf/Gx¤»F…ưDz¤Ø/|½Ù+"ÞÉ­:$˕ˆCµ[ŒÃœhp/L‹ëb{v„•ƒøðgò>v¦ù¤³·rÂÁû¡"AÎÛkýÿ»ŒtÍøã¹Ì%ÒLç´è¸¾^¯ÄïßZ%š¦}² ƒUµaˆ°…\4bx ¢WL#ù ¸g° ƒM{¢…äZ£¬íw +8‚Œ?8•uQ˜½™¡î0®±JRÛ±†5DYi¬ñIM¥pHñ«_f>_ÕUì_²W~H™y9àÑ,aâHé`´J‰&ÊBY>Àè.rzÑaŠ™;J9Z¬î8zþÐiX(Ǝ4Âi»Ï{ù fyÈ<“ºŒ>õ¡±‰¸Ëä#þê°HHû£XT9è…|ÈÆÓþč¶"Saú¥£ï1C Q…ç "œ×z¥O®ږ5yVP «ñ{öÍP)ü§†X1¬F%)YLŠÍá¯ø{‰à6€-SÙôœ<ê?ž#r1:'‚ +~û1ïpÉx¼m›<Ÿˆ÷8X8ÞÆH«yWŠ +‰¶H.¯•]Szë¥Ë¥üš3òŸd´ÛÀ•èLďj{ï«É±6ººˆ#ˆà +CFÔ èY“Û‘ý-]0c¡Þ´­  ¤M*1­ð4zÃD•¥î?U«¾eŽ_ë,æ&)åY ¦á_‰ +(dI¼OiÁRlô±ág7™C´Äڌ©”¹/©<À©mãýèèٝ$$/H3¾f©¨9RA\bc­°ÍéðÄ>a$ÆÉ)Ò¾÷Æ×"¼…œÎ›ðNYÉÔ ¤æÂLT< >¼«ŽT±±(–`|Їà`á¢>ˇ#`§¢½ÛµKƒ¯öæó–*o:É>²ˆÂÿÍLÚÕAȾhÝ3Ÿ8™ ½bù« +bÎӐ•nËj¦’v³&ÝpšÙå¶ì2Ï)O­ì„,Çʺt&™æ}Ȟ¸p6ü´m÷GDÈC„¢—è [ÑJs$ŠˆzÂÉCzVp2xVvÇ%b>h†eQ4T±÷K2 +3Ϟ qÐó*cq‹»Œãx~?»¾£ë9Ž® ðÓeÇIÊ_Aº|8Ù¢…ò˜Çd,2ô2Y+  åD7!?á½õh¹bþ¿4ÛòåP3¥Ð_ž¡†ŽûÍMÊÿÞY͖:¦^ÐÇòè\˜¯Ú °Ù½€ +êüR…‹CÝ<.}þ†Í $Hg7%´'¸ uûèôÏ7’ì‹sV°4“Ùcüàp ¼üŒÌ£3ð»SQ uœšNw¶#‚T²$ëa>²DÌ19@—“øžýÑ°3¦½ÝQe¹=F¸ŽUÝv€¶È”MíÜ¢B.µÛ¾ 2DûàIƒÀ6q…8âÜÁ’E†2Òe;!~~Ò 3îxx" ˜øT/G#!!"cd*#gi82W|ûagV+ìàMI~Øÿ”¹Œ$ß 7b¼mÇÄv“ˆ&ñÇW2."ÄhO¯¿P*ýÇC°CŠ8ٔôF¦S9ê${} O¹ÄãÅ}ÂA’b>Ädwb,äHD K–'ER’ˆ±cdò1cËØ.c̍cՒ÷Ï)œ1¨ÔÞƒీD"aqý€`™ èèx  a& E“ÄDq…”s€ÄÃâ{l·t„ÝZq‘åÈ4Q`é)¢â_…"âƒz“â’:ˆ¹àYÊzP/—QÒûïtUŒ/Û¢ŒZ .ùKK³4ô .œîð/Ný6™Èl©q¢Ù%„ò¥D.ïd.ÝGà2*…fÂ¥à…ž"\”ÍÌ·wñüoq +ó$¶Lk °¹ ‰\”íÄò± .ÂBjÁȂèÊþç _à +æ· ŒÝEáÈ6Tø›”pœÆK†CÚ2˜x…øF’ùá0˨DÈn÷Œ¢€ÌÄËMm)Önq æòj«-.ºØv7áT[^éÝó©-µ©_›èkݵ¸«DlnmËÑ]LUL?t¿´ÿƒ¡ˆ0qiÁajéÏf-Î [—'Nˆ¶îPo,ÊF “–'YËèVTLÉàÀ‚Èg™Ã ‚ +-ç,ΓԘÅÝ`ª E3² Öàè»Y»‡-eM«ªÅ²y&±§\H‹Óîc$[Vd«z+Íá[(ñØBÝuŠ5µ +rl¹zqæJƒtò®Æf*Æ5¾ª•{‹-OY€Vˆ¹¨Á4ޒw׸xºi{hfÊ°eíCà@1ï}ÛÌpßtŒI–=Òî 7*´ µtVy‚¤–lËÌrˆ‡–;$aþZbîÌüvg––bç°ô…E«º)„w–³.&agYŽŽ/;k~»ä.Eï130W.»† 8vè,37 ÛvÝTù +rգ̳âù“'‰_M¥hX\¡h°°L4|ºño$pw3E<“Eó.Žó3•ð\é3ú€Gµ )a¡Á«ÝƒÍ¦çj¹Eú±Ѓ"\YÓ ӕÑÂÙ,tɱ¿ýߏd<âP(¤4ÿàóá|+%cÁ¶’Ðêz+´aKse*»’¹Ö…¡¯Ça§påâõas+bîr’W ¤†Û:ü@Ëà¦3‚„P|%ý'_¶ûŠÈ[™$W¥˜HfmsiMc +q„öAM”èV`mDú a÷­LŒ)\T+ÇH³Bßý©éÖ +ëÉ1†cfZŒ…Ñ Š[ñIÛ7ËÅ!a ₜíÆԉ'ô +¶•«r(­­L4ÚA@ÀTQdRÀÙU.++s䀯]55Õ«²@VåŪ†ö\XÙ ª°Øis8ýãŒL9°­Y® @_+K.r"Ž+xáE× +ç.F-h5»4¨¼àˆR2%­¬7«DDÝ¥ELZ8ÅÃ`Ì0ûðÅŒWW+ÄڈoLÀ«ž: ®kw°Ç¬A­l«<­§•½êŽYµ1Ǎ˜ÓŠ@µ‘}˜ÁZ1G$â5+¨ 4’5ðZ٘VÆ:¿Hg¼ï5š¥Zz$Q¬ívVÌyôl*TÊ·^ßÔÏ>c›•« +™ÅaüŒËȝ¹ÆŒ Ç(™(†¹AƒVDj忶¡<+œP¯9®qƒ ˆB­57A’ Æ*‘BŠÒQ™®fÅƬ  v—£Y©ÃkCVvúñqó³ø#I>YÜAdVž¶“OϽ˜-ô€àøNrsc¬TÅ/ñ _ı¬@9N/L­¬,}Wù׀*²Jl°<9à©®Ò±žUTKu*Ý{JWë‚f¶b`0Q¬@%‘OLB[„¬ð#6Øó£9õ±Ò^Y d`Uù®– Æ +Pwìb%=©Ra„Ù„ ae±NOè|´·Š•›ÉŠƒ­§c›ä ®¢žL*:ˆ„E¬(F]†¤ÂUÊg´(tê¡1‰*³K%_%̀WJA+}«¸ÌÔ_Ä VÆד2€*›Ñm‘5»nT³õ¹o!eWiê±>Å%xûK¾ŠA›Ùê2úµ œÝþLAõÇižÓº£“7‹éG'«ü mكWi4uæYxU™«³R(…ʺÊÔuKÍtÒUdM]%ÂÖÐbŝ«äÄ_á;ycáۉâ—>иÊ]-*”E¢B¹‚Vِô¾Uø†D§[E“ÓêÆ·YÒ Ï*ñt•À‰g¢VºcGŠÌS×*QPï+g­ dà6ЩV9¤âUó‹ò¢V¹åª~R¢x,§$£ µÅ"=Åp|¡±Šeß[Nw0—G³÷㠇Y%Ü3f ò©éõY“¥à•p­<óðHCX%¢»1gµðü]^g#¢»wØr2Y½*ÓæÔ4Š»*VÂU¶À£ªH[2KGËGõÑÄå_’DÛ*ìmªbð~÷Ê­J)‘lVÜ¿ ÎV…¬ +I鞔ǣßéžk5›ÊbTL?0èUњ,g*"š*™u›×]Mfk•Æ 9ùº2ª"=Þp’êc ˜ +_+Î¤S…%"æò°:ä‰X4¾¬ž¡&à× ävz*ªª×Ri>l4UxÓgÕ Q¦åXlÔâ)ض÷¦à1û§Rˆ@÷)ÍM8…*ò?+•´K&©Âq3°ä)*\© C¨¬]¹MŒÄƒzcŠ*ñ1­€û†D%lŸ¤;ˆ*ÅEI4Í%—:T©úËÀîIV å„̦RÉ܋˜ D?…*¦g›•ÂÝ—hè>€{jkB¥—#ߘ«:«Ö9nTîHx÷ /ô)2•Eá{¹¤Ý¸qŒÊ!¤bq›®ƒ{&Æ`SÑZ­©ÌVäo5Y*öÞ×.´Ãš +0ñÂþÑiyo¨ðm ïHH¬žùԅcm՘Š±\ê†RѶÑtJ„(R]&<‚†©Š"Z*É}CY,Ë`©$§RŒ ¨T`']éçI²D•p(ðU^žWΌä j¨sð‚!E®„bi¥ã»M”Ê7®Ä}R¥¢ÁF+B”‹˜T ¢\ðRU°Š0Uš[J„E®0ؓÐtTJÿ• +ìÞz©Ý¡žòº@X-C+¶ì)Ô +SJ´ì}éiŠRÁxˆ.~Hœ~~TBu<ÈOáì”Q/Gü+¯û­CݬG%0åp¢L7*QìkE½_³Q‘™t'ªQiD'‚Ш„è5•+iFe çt)+))B{¬€ÛCñ ˜ð‘Ïú†(@Ií’RlX`  zßæ7§“%0¢‚èŸå‰T„ ×$¢ò{Ú¡¹{Qy‚ƒe"Òadb.¬ÔÏ_Ýû/xP’ •`w¼‘kÐˆPóSX).ò†¾¡ ºÍ”‘v +ŽÞW{C¥+L–ëâç’$ ðÛÃAB%4݈Ja$ ¬' 4*¤ðr— BÁCà‡}!O‹…W¹cçjɲ…2²eðyPk î:¤Þ¡RF7KLAÕ]•Ó†¸ý”‘È…‚Š3"ûZ£d¼Ÿ¬Ô³Y-ÞeT¤0_ ¨xcLïJ[×R­¬$¿{Ê3cџŠgNõþ”{iñ=½”ÓzŠ¿!ÄòI“8'Ô^ž²ð1ªOIi7ž¢1فæSô^AøYH2e š‚ÜÜS¢bÙt‘ÙâðAâøÙI{ +h ä÷ç+q[†ØS@ï­õ”WÅ‘`wù¯Ìñâ2O‰©6~+OÁš$iʼ 9[J’8ŕ† Ygî$¿¢T¤Sld)³„S “ÐMÏÚ?¢sY•!)WÁ¬ éíðƒ–UñN}™YäœçöR'8Á›6‘í¯X´S¢ì=3Ì;ìJǸNù¦¢Ü_P—úi`0÷é9…­ÛRœ†sÊë˜BݦúÜí!?äNÉP7Ùi$pÑr +ˆ˜iŠ“â €)ñ'A¢#lSÔ>bšÂ‚tç¥ÌÂВ5=dg*Mù?OÉïys¥LqJÄ`Š\/ù•I/Ô!eÏxEpŠ'¦:‚γTKÂS 4åI5D]ÔhâŽRÍ~S°¯)ÿÙügÆ5ÀþºîÏޚ2ӓÂ㚢gH´OìߓzS’¾'q*Ê4˜v™!§  „ø"`«iŠ>³­eJ•?7Å(’lí›)݇I$~:ËÓÔG­KqpJ˜¬¯ 'Ê”s«?º”Á<’Ôªçd Å ‚ÚV?•2áMâ=M6AʀMaE§ŒÓðõšF¼¦¤@¹¦HTŸÀhMÑ+ññnr©ÑLɊϱm.MjJvƒX;F¼IE$¶bÊÈ]™²ÀV/,JÄ·ã›üþeËë¡Ï”{cä±Ê©::SÖþ•^5$Æ&qLýh!#°c¿Ì}š¤Â6™b©2eà˜° ç|9„dÊL'Ý$)™vlJs^«f4(.™ÔíR·JÀˆ\Œ)K$è«´aŠ\KY뗘ÂÏrˆ)„¦+ì`˜rwmRd%btz„)¶Î{„m0å<àÝ"˜Ê<8˜2 ‚i¿Ô®u9ãŒy`PTá ·H›{âçŠ™ØJ`v¸K1Í÷c2ñ…zšãSêR´C)ç‹X?qˆï&í•fØÛÍ-eçí“f ´¥¸:’F–ˆ-¥åSûµdk)WzNPý¨¥4‚™•}GZJ÷¥! Š7ûîBو…¾:ϑ~Bä®h ›o%e‡6 éa¡ +[؜–Âëdn¤¬”•ùý­×”b +b.¥œ\¥‰ŽÓR)Æp´!j¦Ò]ï"Wçö¥`)$2ep|Üðq2Ìê[TJ ¨|g)zø*2Ÿ”ÔLlP ç½Lb£®ûz%uRh¸IˆT@¨ £’û¤IQÍ}ƒT”rÙDÓP– ÏÖP +¿àíä ¥Ô_PÊø,ÙQL +v[Œ€±Cæ5㓢ƒQOŠ>J}6Š4‚ë*xk°º|-šÊb6ÊùÐЌ.Ê𰐮E†â˜ô¤»èQNTó(gò(ÿ]Ä£49€GY$òé%r£T?ŽÚQH¯h"Å´`?“°9IGé 3#à݉n!ÿÊü×>?œ“¥àÌI£ø2ÍéCdÊEÃ2É[“!”ìÓÈëÿ{&J"Eõ܁£Ì;€bÏ¡‚3JŽªm‚ÖEiš×rsίiydk³‰À°¾ù&ÁBú´æ~ Ô<Ú8)*_Þ^•3Ê$ÜH`&G¶ºÕŒ’5©˜Qllã‡<1¿…YŸ7‹61Ê N{»a”¾{8B1`SRS…]E'$Ú(1KŒrÿD¹¡¬Q¨ (¢gÁüOàxb]ûú9^î»Lo9AÛEÁá¡|ònùUù:]”!†‹‘r¹(âWÔòμ“M([œtOû‰¡BÀ›E1ì† +yâbGˆX”©T +_Iü‰bní~ThEõï|]\P_¦i«(4ükïiL1œ•©(z>LNQ‚ý÷ „BL‹¹€0L‹|Œ¢(¡ßÂɁs(Š"è+¤ÉÓP ú‚`Ö#é;à®nö›Î|ᛑÚÔð\™ž¸DáÅËD¡„ÿIÊTÔ¥H³E]‘*åF²ðaÇ, $JCó+â¬îEL•Ão:¸¤Ÿ@5pG‡H ùå>]+jA¡¥WÃw⃲mÎ?aÁé*߉ +ƒãð‹¨~|à‡–vñs?5” +ëL‰°Mi¹3⢠g(ì®ÏÑg‡¢fkÂ,S@Jø:ÅèP LNä´ šCY!%Pîðï™éŠġАKGíª^ 6]êHò =-:) Ñ^56”§ÊãsT+Z(E4–LIC‘`X(ø£'uÚaˤQ$¨Ú¡uŠÇ£ð‚Â|1­Ô ÅØsr‚]ւ"%™2´“EÐ(;·ˆùRÛöÈnÀ¡¢7ÌM—aæó€ +%ì†sàP X¯Tç'MŒ0öÉbzBÉ!¨ Íƒb)(„0¬)´+ÂýùíDA• û^äPF¸z@MÊÑE¦æ…{ŸEó’í *~ J¸„B§å2ëûôBÁñvÙO”I4p)EDJ÷|Pâ2& E @ªB¯ðø„Ú_>ÁB ]+¤|ʸ/v‡áÔ `h£A‘%¸L/ ¡¨U®ž}?›‚8ü\{Aa%þé1,‡ÂFFãJ‹ÿÉÉ@¨’±É:ÁÃ0ð1@tªF 8'K$”•0ý»s$  à0ä'b/ªb kscÀQ€"Ää„ÇIqáu"Aé‹°Ò_'%ŽïÊù@aPM +ÿòî@›àûÄ>žI &z(Kˆ¢íþÒā"ü2‡ îL:)‰AL”—1ºï&B*ûuv†4"À(X ¸z€MhMÚ½$¬ +q½.L. + ©Oj:ÊN²'©™“”FCF qÐ3À0NBÒY(]ü 9@I´Ý “\«%ÖP9Ž…ò¤Ì~Òú:Ñf>‘N®»3¸D_xôò¦Ä„?xÅmîï„x€Sã_p°Çi%<"¿«û»÷LL áX^“9OíŸL¥{Z_]ï©; K÷›~âôå㕟h4?Y؄ãþ`‡°’¢4ğÀ˜mg@]Œ(i öÎ'þ”fë‰ÈL*Üû ìÑÃý¤ñŠj$W©Ÿ°Cǃ¤Ÿp)Ž¢ë0º'ZB?á Ò:?¹ÓP‚&'Af¤ŠïmŽ$fƒW€øÉÑïàº>ý™õæ0ðIÛÉ´YïÑö}"æäÆú' ë}&kþ0R’<¾¦ãúD=+ýô™õɾAê)Õ'ûŖQŸlí¢Ùì*|ré¤O˜ ' wAÜƃ`‘qCÀ¾'wZñª 85}]Õzߓ‘™ìÖÐďæîUž:^ž+°×‚®<8 +ù$Ž0€í2Ì ‘èÇø$ȄTÏ_ü±ŒµƒY†êëI ÍQ àÀHª!8‰QOȈ´Ñ å5·ÖÁ +÷¤‘)°-§æs2xø…¨èIyäYyÂ0qõƒìIØîIÞ`‚² ,¦¶‰æ =¤Ç4C=lrët‡ïû†czÂ¥ÉaeB@OJ„éód†3ªôÑPœÎµŠ'H åÄi¨}è(hž8—[°òÒ¤º· j}zƒ'ѮӴ›—œ™<‘"2?Ørâ—|$ +ËәK¼BXZ»¸‚îïdŠN¦êðäÓ^$R‰Ž–ÂÅWàI¨´û¨Ÿ'ÀiHëžœ‹<òÝÚú;ÑbŠ•Ëm×.óv81:‰@8Â`Põ<`\U` )ïäUÔ­© ,ë°ßÊ9ñ¨5'xÉåî„ã–¬aSz »“ŒÉùƒœk‚ñ-5 >]?w‹;A”åÞMo €<´-F5€ÊÛÉÝÁí„ñåÚN£¸uBãm‘—cZ;ÜËE7l¾d'³Ê2v2)ÐBHXB—°Nõu ;ÉW(_' uU XLxl7îlœ“’´N ݓNP ëÄÁnº˜Çåꄐ͵ <«v0`UOښýÃû·3s¨ÕLx^¹„ØDÏIVœüŸ`8‰1æ|ur]”çÄåöL8읶3IN"[êXÑ©D×Àª¡Åhù­¬A(Ÿ^ݟ`{€5æá-žjF’âzw%;'·ß;F…øê‡hsJçD2SMÎ Ýd"úg1†rbk˜d)Ò3#è*O  Ñ$—UÖ-Q¼wk]:шP0'VõX ”è:o‚¥™vsª»¹M8±±¸tuõ3ÁNNœÍ²â¤U î€Ý,Áhøv1&r’r>Š>˜#¸IÄI©ó±ðî€0ShN^óœ?˪úJyÁÇÉ7Ã{zb>–‰~ZæÎU$8NTN)îW'÷ ‘™¸lž‹“.¬IÒ$sYœÔ‘æ*ND')´Q§Ø`™`‡¤$q2;£üÝD@` N@ºwdN’ÇĽ±ÎéÁf®+Œ¥ø¾h«©ÆàÄ­sq¨ú…G>4nüÈW!–ÉõqÂH?a_òj'b…èY2ú¸“DïÂ([Ô%  üM>› c«PŸ—º~“úCåÊEù&%8‡Á73rœ{“pT‡ìM +2Š"‡y}bWoâð\À=¡ Å›ð6…µ‹µýy°þwPï&ièҀš 4B¼$ì\þƒ¥.‰aùá§óhÊ/µ ' vFƒ.d:†ÌÝXÑê|y™°·×ïvÃmrE/ͼ§Ù^%åš@ø-4M"« õT‚Ñ6y‚& bÞÙ&X%#‰™…~‚à"j¤\ô¡ã½È´& ôJ±éAOåÒ&?„ìф¢ÚÑ&å'ǁ5æ|_bëM†ºYX³É[é]Ï{EèrY6áÍ{1‰L 4Œ&¤Ž¿/ A²±MD:Ò¹&xFˆRJ.²É¯DÎÇ ú§öŠ) rN‰î%m¬‰!¢¬ÉÓ¢R­ 7ü%l‚ÕCU|lbˆÜŠ5Q´£!¸ÙÕÁ´ªè%‚@pôš'¼Ÿ7ÕÄl9ò6—ÓA…pMŽñ-ž™ ·&Ḡ›0®r–EíÝ™À«L’òDPøÌg"F‰½h´¡@Nºö„J2š&;Ë2&8Ҕ˜¸)MX'51Ëe\ôjÂÞ²ÞŒj²ÚX:ušXh9D­0-\‚ã Mˆ³ƒ'½® +ÎhuiÒMǦoe„¥‰'$䁜Ãz2YŸß¤ É! ÉÈ)»»Ö´sg@x49‚ Êq±Ô$«MÔLX—m”\e- cÓ -cq MÜ=` °^mˆpì­ ’&ˆ²m/Jó1]‡…e&QRŽÄF&ùZ‡@»A“}¾ìØĵü«"¢ÎˆÆ` 9: {òðߢ‡ÅÇ©K»Á0ëL`ÛIF‰ÀbòÒÜs™Û'W)Á3!mhiôüŒîÿoìƒ5ö–ÉÂQ"ŠgyØBª! Üþ>âÓCh‰Þ¸3$©™Èð†ƒ ®J3I–¼n¦Y¢y,9xU'B{€g¢4JSÎÅÉ ½™<žLöäÃaòÛUpV5ʪ +t}dÒÑii”éŠ-‡”¦TnÚ@Y•Éømë)_µ'ÛÈä’YÙ¢Lª ÛÅ0(“ΐ^Ã2wìÙ9™xBM&Œ-È®c¢}°%©M© 05ŠcÊ-„d"= k€¶ÙÇ鿸È=™ r;q ©I«lÈĘOÖ7I”ð˜ÈNË²\9š'M cÒ;3Y‰”¤+v‚ÇâƒE‚É`¾ + ïádc’{Úw ©È:bR4&z5ÇÝhÉ(R­¾Jjž +bLJ˜&ûùAÒæ-ÍU;>#ýÃZLd¦p’ÈìÔZeêßæ¼à›ŠEbôGÝh‘€IÚäÂ|Š·î œÌ„Õ*£•æ<o$½_žK¦J§Ãdf²|â0áM´1‡;ú%<í©¢¢§ 2¤×²*»§¡~ÉäaÒ °ê¡›* “¢­»ŸÇ&~Þܚ²+0ÑÅ@söä@fPk—ԥUIÂÄÞD£æ¤‹0Ù£è[héN8Â$Ü~6*3a= £€ðmxL®žƒ =Ã*ïÀ{?@¤{=Òà´$ÐÈ1¸Ø4Õ0á/ñ,õÂB€x@jëî¿$ +Ù'‰ý%KèÒdÉ֍¿$‘²4jú Þèmy`"†:ׅl£È¾Äjx¥qéÇ^.‹ /‰]h‹À™•({‹J‚Tb¾æÜÓ4Ñ^bõOéÎÂàíIJK€ˆZ(ҒЉ4UÊK£2Ò–i¿»¼Fsþé4:.¹u§–¬{¹Ì:Œ—TXjn§{ÄK˜}ð¡GK”Šù §pá%Î2rÝ%qt™f‚Æʄ–‚C¢$ý[’H†–,Ìqø«•¬²À'mÇÞ-)$ê2·Sf÷´KÂoF† Ù%–3Ô3,t¥P~W]©©Ã*µ¨Kr\ŸIr"¦KäÇ"ûß°ŽX ¼ö€=Ì +I—äœI’"#@ä„Ã"€9Y.!L/ù‚”îô¼J¹äÞ$äÓÒǾƐK:G6!z¸ö8õh‰ù _ŒcJ4T¶½QoÞæJêµ}%'FqPt—¼F9ҖHù-!FWn£#2ߑ¦‘0»%Ù+díP€žáÙÐã¶ÄzN;Δ¤%u&ëS²H+è€Í„¶D|8œ-¸õã<Iãƒ1݁"d?Ø z2ø¹@$d…gVù•¦—%i|qt/>¦%a99åŸS6e 3Cû‰.×]¯ÕВà8cáɳ$–J ÅRIž”U9xëd–˜%(üç8- ³Æ+ ~kxj“˳Eo&µJ,ù²Ä3e–%> +T•ƒÙ$…ûî_üÿwÁŠ,á'd š]ÕÉcIÄ»ì-éa:YɃášô:ÓVB<©ˆO”Jå&Án)™}B%6H‘À‚ ˜—.‘sWj# 6M…%F’ol°d ­bÄJlW­µÐ뇏JzXÁÕ`†*¯Ä l‘È™MÉn=nØÝ>ú,Z£ÀDXI)û…ÚŒ`äRR¥Ù5§¡,Ếé•3¡:ÒðY%¯bʬ’ŽM€ó5\`é ­d«o#Ñ¿Ãܹx4˜YI¸™x(å;=ÿ½9±’L ´UÂJx¬–’ÁÁ‡*ÿ„Jý¢õUR.¯½®ky•¹°C×ë*‘"Y"뮑 DÀ£?bCÀ„AUÒ´Ûër¨aY.R%âÝ[íÀ>ÊuÝÝ¢„â`*±'Õ-J +t”J¸e;%•8@w¯£S™EÂQ ŒˆJ^š×P wºAB%FÇr•èN^´MºP‰øfÎ%³Ðú)IÔ穈qOI°%áEÓSÒ`Á‚Ú +—ñ”[1½Ê‚QƒÃé;Âv“ò¾ ùH d¡Q-¤Ì’Ù‡0%ž²,/%·Uhˆà7tI€8 +ÒÒâ,T­6 `¤MŠ›t-t 42žduü#„Y¸ÀppÈßð+JJ܌|ŒI¤DÿžIF„Äî kL0’;0Vz ‘—…JH‰¡“'ßP–´ò°*“lˆàÏd£=‚?æÒA7I”ìÆ8²DIK»‡’µVÝ‘±Ó ŠÓ1ø*DǁˆŒBɼFB ¡S¡ä)}î8“Ú!ñõ$f›Ñ6Dql"( †¸0`”h/:¥œ vð°+«òŒÂݏNÂ×Ï·ÒËò§çŽØA Ál~¨ž$ Ø= OD®J\‰ÂGd‚ÇZK¤Ô8;÷Nro&ÉÍ¿ÂRÓÈÁ +"w’Úɧ/ȓ«$\d3Y&¡²‘”[I +¨*ž^ì$u˛ý°ÔAÒH CÿšdÙ°vzl ÷$ç$â¦$r {\²Ô:b¯ƒ1‰s!æu‡å‚W´rN)Éw±>JÓ:²!1á/1¦uþ5²QÂ.wÞ$të"3?n’V?·3ÂO›äÈøèÛè#q°%„5I‹'ן% +Ñ0 v@L“€¾µÏPÒ$èýÆu$͕u4IM/I PôLòfZÇÒnË$`Cw”(“`ù"ք;O7[2 Ðx ™„ H =g¯Zž¶Ó0É"xْ#‘Ò-Þß'| +þ‘Tª ÿH|’ ” `Únƒ¾PX°o¤v%çPô$Až­UÆ蠅ÂÑXÂG¨£¡Ý¹KgÙ!ï ©dá§Ùv(›íŸYž€)ªà9AP\, O> $÷(¢)«Yz%yØo0™ïœw¤NMEI¿i}Ž„“­ø"‰L/p_ UØ~4*MU*‰å€žŽP¨$‚gÈrìXyќ’ؼv57SJ7€½(%VäP$1é§ï㛱—-6)= Û'yoÙ¼Ø$™’Ç0oF~H’;áD‡Æے ’ „ä&UᨿJÃ.1!àʪåxÝ§W²r^†Ùƾ €}>Eâ&|[vÿ†ux̑d_I‚à*’ä\Þ1öH¡h׍Ã-’Ä% ¦|³’¬N'z_F)’  ‘ŒßÅ«Ã’2±9 œ‘¬3hô†a¾ö€Þ®÷j$“ßõ2HŽŽ‘ø,wº<òŒC1íÍ&$iÌiwR¹Ëãp9Xxp$Êoa#µÍ$tj¼ L9G2¥¬“ö#Ô$…°­ï%/{‚"‹Æl´RñJ;{a$[™-ZÕ{jqЙõ2Áƒß¶ $7’¶ ù2\‡Û dMè»4j$Ž‘!ΌäšjéH4>aO aÔè¬Ã©Hˆùº¤¾Ïʦ`ò# ÁR, ‘)îå$K#"é¼G’AHèg&A)ÖÎ9!¨zsNjäY!šÑt]$›0ª2a#yB\ÎÀè’:÷‹¥x 1v’Ç?£P=‚A²Ið…0€Ç³td*G²<=í~´iY‘ˆø䒴ë’Ï°ªHÊ/^ç 9ˆ$£â70$EÂuö‹)Á>*(’\Šè¢'°>#`95žò„E°‡Ie³îbäé`&>–" +­S$-ž£DžXˆ£,Bx{±PG“èsö>Ï YH\C™&b;ò„dQ“lÑ͂C‚L¿PÔnH´ªZɾşt»°†¤£Üë┞Rá¤Æ0È?·Ö%,61$Æ5;ª× +Պ”ÇpîÅ1ĉ¨*ô‘ð@k¡:MÙÝÃñòGŽHH:QoD¦í‘¼ì1OG.ÉÁ<"õAb7\c[~‰TÉI¨pä2Ϙ»&^6ÀC9¹ÿ ^הA‰ìÒÉ«© 8 g†¶*DD0ϾòA $ëã?XO$’åžÛj&ö66@à€Ä6„€£6Ašó¿ŠVúÈoÁ‘?Dž`F–¸,ÉGî,j%’4jŒ€ä@>BòJ–·€8™±ô%„´‡?OÚCª0¡÷ná#å~€½ló‚£4?wú¤ëä#Ȍ;ñg˜?³ÂÖò×*‘V°fªø‘ +è3²±Xw¡Äœ½ŽÄ Í_»%@ÐÞ#ïÂa6ÑÌäb5¿´y„(¡è¬#p‘…}EÝ#Lc"¥[É%}¤nSíÇ7b„òP³ Ú7,ùš +îù´ó0h?¨xÌGä͒Û*B¦IuǔøˆÁZ9@ùQ ð‘A§>’åÏÄáå±2(PÅïœk°î‘zÍ#b°Š×Û›ÝÔqÌiö‚_.´=bý"-¿˜K{„AÁþ€8Ù#B¸®TJC |„㨆…ç™z„ÌáüÀ[ñÆ(2È¥/9jÁD 3åüc<“™cÉ#UŒßè´QŸ$IõÛl®Ktæë¡xä rŽÎpeÁ7<ÂÌá‘[¹áÚ¨µà¸­*NqHȝýÌðŽ%’Õu]‘l—]ð©#G½bÎ)†,Üh™ŒB4Ñ"ùi–«Ò¿@å™Êsª‘Át†Üé¬x7ב³®³Ç^8ᷕ ×'Êæˆ OÐD<ÍuÈY¢?=ä8„¥Iâ²=¬«T éÈ_jaÚ¬…wú©.6Tï=±¯KÂ@G$„ ð¶ïNÙçˆØڏû!rÄ Ï‘ë‡p!>Lt#v°(Ì:’€h)‘Ü\CI™ï×& ¹$Ù|G9æ%;’#\œ8oQb^ÏKû§Œ#Å_†nAå)Ž8Õ;Áû24õ“”`—"F8œ5…í扱q êz‘×0þ¹q3EºÐÖãE¤)R¼ »Ž÷šx„5;6òDm˜gKgKÍhنš‘ýZØH-AHԈ³·„u>Hōì”;©ªn„íZô/Ü 7‚óñÚ0Aáþ¦nZ™« +õö_ 4ÓÈwÜ0›Ë«)ÒFb×nƒDùWE*­^s©÷¹óò؈²¡Íe{ +|Oâ,^#W°z-7­žHëì’nK‹?¢AøŒ˜Ü #®Æ>Ce ÃqKe›ë¹ÑgâÊ®6î È2ÅS$ã© ¹B¨²:“)xº»ö›.•õkudJ3ÒïOh1R„R `5òY†1ÜÛCtÃσ" êILØ"ÁŒuçU‘©'Ϥ*2ŽQÓn‘öو®ö0ý)¨TFŒhÐɈLõ—ú¨L$,¤‘¶›aT1’Ï𽣑+L /ìÃ%¡FHvë™6qÂaЂo%å~FxôêF²¾¥©rà329'~‘ Ç ¨A`zÂ+²øI LUo=¾ŒædÀÖþ•'\nFöq²(Y|Ü·ˆFFd™ØÌÈ2@ó[dF”ß®ÈðGܛ#˜‘‡ñy ØQ†èÓ<á ÑW LöNÁ9kH»‹T Ùi¾ÄgŒ¬"TMqPK×åt»‰$¨î†l5FÔ¨"?ºHˆO„ +Ïü'<‘èÂ.ň*‘Ffy¿nÄò€1a„A±U3„xT5”‚6F”+$ٗ³‰ŒUA2¤ÁÈN£ÇňÀe=Ö°È™ÝQC¶”éøÝ{ŽãÜ1Bfà/òVë(®Gû(‘Œ +#ªIÇmDxLÅß°ÿyxý¿ñ g0Ü+‚5T/£?C¡¢Þm ü"‘ÿ“'|MFf¿k {‘§Uä^POÁ…^DTMþO1TäEP/_ãù• ^¤œYL‹à  s95*w§æKLw­DßÁ¬õsïØEZ/Il6´'±%ÔEæ.!]$Ôn¤É“ËriBξ焋 ¼‹¤,àÒØç&raN·È¢f2Ȗ·KÏ!²ˆ,"(á%¦çÆ"ì2ldɈ8à÷#Ýã É ¬ ‰Z'Ez‘rnp‡æ NaEž">k.ooE‹¼N»Œ»!€ÙÒUp ‹ìY䴁R墂á- KÞ1âc Ù~z-xSFÞ©"¢ "£ÈnNL·KKRAüNEx¬S¦Ÿ`«EŠ<ä‘Ù„ "wÏ Á°$ªï3|ì؊t",Ò=Ž„"S$C-y©ŒŠˆõyVIó‹è(’< "¹—È$‡W]áó¥d8¼Z†®ˆõX&;§~˜P‡AÅ¡€R*£‚h4pEö¦ù:ø)ìSŸ©ÎQÚÊoÂXT( =âæ+ÖàëUäHã–Mî̛Xi±d?Ã-àˆDaµc4ä‡ +±m—J3z´X:‹h:QºDÞ±è¤hê©)"Úá1KVLqœ^¢dÈ¡×ôˆ«vS¾ 1]Š`Ï0ÂoQ%°¨O5EÊY0pV<Èؼc\ƒœeÉn‚ôc³òˆ¦%¢™„;‘í@®°¢J*ïaË©-˜#Ù ¿på8Tà´&±î’,4BÛ£÷B´ú¹m ~"j¢å;)"b²8>‘™’ åŸá°i B²íG.ýT:‘P':~Pã„ý\siHý¨Rˆ4o"a߂"ò³‘îg§6‘ÓÛðVõå¤?•¬wDkl,^9̼aR—ßÚWx>Íye"¢N +(.ÂÊrۃŸ\ÈDlÒ5”4ŒÆDä7ÈOH1 åòokfÁÆœ}òî3Ô`*%”x{,¨ùƍ Ÿ Ÿ•È}…ºtl[—Lf">œo7$ò(Ò9×Á“2ÞÉ<‰€ÒDÕ´_àœDÔ …àÕšDâä¯eûZ“ˆ¸2%èPrU…ÈLÈÔâ‰ØGÄ¿§„©bà‡á×ï”>âö®ß–Å'ƲÆß MÉNk–9É¢’0µ—éȹžpR`·>îé@ôí„]hæ*¿sð­¨Í:3,îә± ^Cľ¬h_Ȇ6–‘[ +>s‡tq1—ûz8¸ˆ,^."p Ä-†"bÎüÒNDԜª1LD¶Ý¸di`­!jðfÜÀÏUŠÇªÀ†‚®YÌØ«ËV 5•?ãò]#4÷VFÄ\âÉ;±B°Æƒ\€Ç ‡¸TþaÎÓ%ˆ4²|4ЉÈB{N8 .jCð˜öŒÁtï\˜DToD‚ýÎ +œ"6—ØD  +ï§Ê3ÃD„öBRÕƒHŒM‚¤}`ÕIn7¿TEÔ snRÈÚL¤ý¢ÖøÏÐxÄM âù‡¸2#ÚÆ°‡†á×CœþgNÂq r^Π«“>I^×Q�L|[E$^ >„¶Ú1¶·j•d +}ˆ ë?øÐÚ);˜é ׂï»95/fŸˆ«²ƒ+¹ú +Økˆ “ïÁµ‡¸ÅÔ@!D_,[{ÈZå[Ö&ü ö’CTƒË‚¢ÿ"L —zHi¯ VQåÍë…Jè!С €k«‡՛ÌCLh‡_yH¤DZÑò²dä!­u\ÕUÝ4"E¦pïœTAJšá‘·ò#žõ[îæ¡ +(BàÜk)ÙB\DSO×a83ßÄÇr͋ñS¶ñ Î|FW†›cÞ;Dî9DÑx€ºKçü2žšCD©=œ||}½C¶Ç,]*!.ÕÓ?Ü–2Í!Ä!ö”¹Ñ(0üËO°!Ðñün²¢€oˆÝ©NÞM¢5. ’nÈ1ML„>Ö⺢¿nˆcÌñ€„ž$ålCpñåBëûâƒÚøæìfôÀ Òsëobá‚N†Æ¡ÚlÈÞ=@³K¶~cdCD@ÔG¡;hÜ:(W×óÒ ©2CÃBØÅðUÌ\†=̐mî°ò[:`J&0 ûÅy·mƒÚ qݟ5Ïf&×`ðr,š!àÒ¸!t¸B8L©#s4fÈYU‘À˜}ËUúaá{¡ÌA±ÀYÌò`âœ)†<£¸ zcM!B3—°4hƒÇ)hüØþÅB­o+×ò’Ù ¡{q†ìûœ?£]ßqã0ˆ¯œ@´“ ÄüIš7 Ì|û‚꜃éJàþx tXXLõþ˜z)ÏÚõ$Ôøƒü× X@¤¬8ÊJ?ˆ’6øAîÜfYÁá²'Bˆ,=g=î¤[d‹Ç—Z ›póJ\íàP€Põ ·ßëñ«Ø-ˆ›5©„ª%È<5ˆãÈt-ݖæÚÃþøtÆ>µ<ysCC´¿öb5®ÁD»¤%eòNeÕ’úÇÂ-·ñð7ôl{ŠG±2ZX:° +3UÕtæ¥C²ÇԆ´“@kÚuâôòtA܎1 ¾ŒÌ¼A0ëÞx hƒ´!ÖÔ|qþŒ˜8wþ†™ÒŸt»ƌ²ï$?abráq{mŒà¤ŽÈ0<ëc\1È8µ²°ª˜À,àÅ=Ñap)…ÐsEbïí(WbBF©·ËTÜ<×õN‚)ר+ޔñ† O¢øHsM‰:ÝNfNfݤܕEUmقw^GD²páb]±µì“r-q^ÚصÿAÎ'ƒ ã{mr rÞqT\ÉÃ+Z²Ù/oœ'J¾ ¢äKáj^K(jÁ]4ŽÅ|å‚ÜUâpAÊ-q ‚°õìS=|¡|(9‚µ›ƒñ^tʒ©‚d^hîEµ¢œ™Ù¨Ñh^ö…\/Çu§Pp¡ áä_¾äSÚZdº‡@&P éˆI½\Ž|.íºñv>jœh£µ.&z¢ì‡²b~|>.AÒOƒ$Szv?Û¡Ñ­ä+J™‚ø$*¢ïÞ$&*¢:szþ|ùäŸòç“ð{`#*BA€"þ9·í]W“ û‹¦“Ò¢;ŽqTå ²®óW}¨ >l<óWƑH5+QÖ(Ana)EŽJ‰1”²-QP o*‰pÞQ‚ÅÌ#Hž6H2¬¿Ï ²q;‡Ü54"jÕ’j¸]“z¼R¤ÇáQÞ=ÞXŽÉèEk¼“z›™Áø@¼¨vàíÙù–;Ñ@ìüK¿<¼wU 2¼u”ʵñ :/: +ïÈ®ž*02Ýúð‘<å¦]r ±Ýš()’rŒÔ¿@üªÂÆýoyü¥^½³&Öß+ÎHmÀ•¬‹,™EÏ9¨V>ÔbßÛ_’Ø@ô @ò(É<¦¼JÖ@BnËÚ)¦ÊÑÏ|-ƒ¤¬Ö: 4³.S"ȋð)éhŒ‘v&Ñòù]þ{(NU(˜X]¿ö5pZ76½©_d †¼´€Wш+AñSEb=VJîl™¢o_,õ DÈÿ¼ "!"©¥¬ÈL4ÙkoëàÕVúLlߖÆ „Í„ƒ¤ÕïàvòR$býÀ°%+Œˆ³_W›72 Ì:@ËáaŒÞpŒ1 +úrOŠ©–Ç@Q ÉЮyÅ3 RO;Iœ†1'DûiÕ;ÝÂ>§œ±¦q Áql­x=N‹¢ ú ˆmÛÊ .K:yª,~@ œ×Ôg‚ > “Zå»Z$ÒÕD v“¢Õ”~êQÄ +€À°|,ÀPD0Š'+RVJy|Æe66¡¢¡ÿ‰ÍÝ…ª?;RÙ&Øw3’;*°Ë."T‡6*ÍKl¯¹BFƒ&Ô±Ï ¾5¢ªGìt,ríì›ÑՉÙê%T®rÝìhÕ0›úÍ|ÄE†t#s>›ÿª¯{-¿ª‡X7 +¡²×¢—‰*oՙ [+ ÊðG¥J`P„Ôºç²ð"÷éèã9ϝ|¥ƒ¹–çˆ08q–#¯îvãĆgE&K e‡!“´<ƒm†!£Pˆ‘2ÂEDRîŒ:H•6{5™bË8„Œ‰Öê鞪ÎcªªUJʙR>§é‚Œã­Vˆy!«…±ñf«Ãt>תÒt0ð /@&5g+—éðH&öù֓#<;ŽOn°ÐTÉ;Euø«Ëˆ?$œ[î<ñ•²M¤-P\÷B“³lèn库ÙÙäè¾Ñƒ©g!ŸM°GP«á÷"{ÒDm|HŒÝ¶ ùÆFtQrˆð…ïéñÒÇC—˲γ^oN~Vé¤ ;»a"&W‘Š”| +mZ„rFÅ:æAÄÌ´3?#ݫѐU ‘ʉݥ˜K/Ò÷â1ÑK§/¶ïÐ9(‡ø¼ý¼öÃq'–5o¢Ÿwx‡qù[0å ­LžD/ŽÍ 3’"%Ua<ÎtÁ“vUU´Â'ÇTÞå úðÝQNðÒ QÒ# Û.Wú<êÁº³Â½ +¾ë¸Z¥ÕîÈèč –—ãq¾ÀÀ@j«©Ù%~¹'Ÿ»t +E‚ƒHAóM´‚oà ï +ýãÕ%å8¡˜7¼‚Wx.–õÌñ”QáQq–!ÊD(nFсÈî[v 2­ˎ " :”5ž÷¨tÜ­# paL( F’Eiè=€98 +b*6B:JN6ŸÉäY£ `ŒA +cŒ1T+‰ùõ49X´ÝaW#ìæ xƒÓnê¾+HGüJr3m4H)Ã64f£Ìj:>%!xz¼šõ“¢(‹À#œEz¦ÌÍH²“ ÎJ‚h–P¸àN…"æ*$!Ž¹ÎÐÊóùhlØ"²µ?94æÁƒ9Ƚù.Lå5îæÛ‹7]þ§CÒp' fãX¶ßÒñ'P÷ #ê|Yúâá„Ûb`¨tF` äS¤È®œ*z<))æXpgì¤ñ?rќ°dÁù? ¯lþj`ë@0/cᲧ‚ïwªÃ>6¸ÆC(ƒOÂú‘+æz_ eóX³VG*}s¤Î\JµT7ÊNhÉ<ÖÝÈwZ⍄|ÝÐҟX9 +´ìYȇÿªú,¹*]Ö +´²ÔFx ~¿1£ä6è.ºr3¼Ï¥’{ÚÉôûŽÔcK)¢†®ˆ. ׆ʓ}݀dPÍÇòj~ö¤×gȌ Àù õXð°mÑ 87Ö þ¥!Ð9¤’œtÂȱª ¿\„ÕB+j¬À¹cµì+¿1°äìý>öuèzhôŸƒF8>Šè~yՆ9t¨éjÁórt{èkWòý$­•=°ñøWÃ2&;4RªÙ º^T9:ñ)qBê­½EƒˆÙ·s†OòÄf“®Tˆçû8ë›l]ôBç²ØyO¡«0Kó>8/`%õ»*Œêw.oÊV‡©×BA¥leuÒ.;Pñ OR‚·¥ùeDœ˜"Ffôpd´B‘mÒ`ýe˜žîԃ±ùVä%Z‡Ç(KVÀ²k¾ÆʉÌF=×aòÅ2žõÎÝ27v ©IîçlDZÃ=|ÐÀ֐˜xlGsåatð‰¾ü ”ˆÐԇŠÑ¢‚HŒbªÖã‚1´Œwú•]Cå•ÿI6¥„œég‡kú±Ì0ÐÜ­úqbCÌhïç(ñ$y ³ ŽJWÅ)±ócB•A\³q»E¦ÜÚV½À¦t5õˆ>Øu»® ÕÈHÓ`ÀÛ°ôj<ŽÄ֌ŸK4§ã'Æc8£uRÀdŠE»Éf5‚ÅxSö§))û5Ø"uÂøqVƒ‰®Åò10±^¥œ%$^p°H·”{çRcÉÍä):9À›¥y¸—•"P7 x+ö7Wó]¤ê 0¸ûäAbÇRpÁà‡(³yçkrç;HNGÕ)~ÌÐv¿ÇAÆÿp(:Qê8RÎ҅•ÌԂ§¨bwwûI;ÏïBàa%rܸ\m¡·Ÿ..vhñfvbc#a5Tˆ@à1\Ž¢Ç‰G½KΰvÇKA˜ÿ:Õ+ü¹è2>Âʅè^«A2ÃÉÿ(|yB&¤MI|A,âV£R¡})÷ïù 'ƒ0œN>QXÎü(û|'é˜ yÚ5{³|›¶×.ˆ”AˆaÍv™sP©’/÷­#`ÊM҅F£DäcʃgØ^ŊPÈgãâ±¥@Ï}¹Ù{ËÊ"±Õ~U‚ïE«|.&èrO/_ˆiœŒç®òuo1–^“‹âãáä¦ø©ÐÈD´¬C“nÀ¤>[áÏO…‚; +áuIJÝýkÓY-“S_í5ïZ“…šJOX‡•MN¥ËØ®K ±@pã@/éyÒJ‚ès»9âu!hªÍÖlJŽ¯D†!Õi‹c¿¼C·n®Fæ[¦MfM8gJìÚ±¯uŠð|Õ*îæºÞ#õu´ûÜ-ZÆA<¶šŒÚ\Ö +Hڅ‚K¡¤è{ñ*¬àì:|Ã"l8¥- zªç3ƒJœºòƒãO!ð'•YmÝJ#vù)©„7Á`Ù +Œ … +ZebãYq€bÏO:§ÚRsC-‹DÚKdИs}°AFI«È^0È tØõьTa€_^ÿÙl_R''^2‚dÈy,i‘‘­¶Òë߁9ò~ÝLù%SË÷™Nàٛ ¥”3jlÆRÅEG¼Ù·]—ƒ!Ò +†¤›Fڎˆ™y8†ŠíDíe•‚ûƒz÷ Ý*V°`^>…cÇSñÙš XD|;hò0!F«ß?Rl¢-ce·bƒøŸ¼.+6{óNA}^`þÇÇ¡UébÅ!æÝï¹ þbÅ÷õ|/ÿï°íßFçòKT€;ö#*ˆzFE<ÕkzSXºv—§N¥œÚ$I³Ü_{;4cËl±Ä°oÚÆÓz‚1DOn’ÄÜj‰¼Ó4*$‚Ø7’¡4W`t®¡˜ÿp8ah]øh{¿¨ocTÖD5ÔþR%ÿÑ‰ì‰j´Î/ٖ€‰Yœàq + c ÊØ+F(Äï„#ì²ÏR(N´ÆG©Ñ—ºâ6Éþaåk•Ívƒ¾-\Ə‚%äƒ ±gŒùX„0óÓršÙžLà}djk©Yf3Yä‡-*a³Po*E(`É°¾ë;< ¬ÀrvaOüãø•wUc7¦A®C†àïº *1qmÓM¼ùYôØhÖI/y-h€Â!|ü~¨á®6 ¿ð¬iËÚ®õ!¬ÞY8GdË º[Y2†æiaKOxïY %5k'kc6:!SþÃIÒóbõ…p”yiç;4ƒâçQþÆnù ­3Ɍ,»"¯Ô‘§ls˜£`}¶WýÊul@d‹ÇÎâZ/xû„†áÿ±¨:Íd +¹˜;—SF P,|⇋dc¦`¨W›FZEÝ~³cÀl3·_0âßôÓû0£cªö³Jhô•Þ1Ìâ}y:°‚.¦{HRtâC,"Xn5oKëo×/4Df×èu™®ô[pV2%Z˜Åm‘…ïW` |Ù5Z éF t œ=À¸ÿ(e*©ïD”ÉO‹î±EKcàIÒÏàöÿ*½Â67#Ã2S:‚[z æÙ^ e£R™‡ž"¼k2.W‰²öÿL²æpKÌ$G´1@õ©ÅLB´èY"ÖJûY³°lՓÅýÿ͙®Ô6Ž >co­ _\²t¢ ê…™èbPçÝ#= ú¤aÛ^ VÛîVa|:@tU”©'‰Œ]b¹‹0›Êg,%•SçyE¬àÇ­Q´«SVª*qÍcZ¯œãÅD@¡ +%V!:£\&C¢Xø §)T"䂦‹[° LÚé¤ðP† +4À4]¢}õù@!-dÌý‰é&D%´-“pŠ*ÀŽPž¡óiB¬6 Ï(@Ж[a+ß1ÿ1‹ÐHótSÄ:j©JDU‡…ˆj"v’þӜöNð°ÖÌë¥A”^ÞàQãq¹„ÇNÉ‘7ƒ¡ÉMsÁbϔ½1ìîÎ{˜½F™à¤È`8æk/§:Öð‰•w'âVagüzàÊ9:L³O¤ÙoìîhÚÜÊa õŒÚƒ¹ +ôÔ1¢çVBíB$ùLСàq[ЂÚpž-XÁ2 +öþ‹z1Çt¬ðž{Ê 'yP¿‹óñ¾ž—Á_?±‡jñnâk(M@ÎúÞªpß´=èì2L¥r5óÿ®,Ò*m]‚ðùAÂ3`“Ž´3%Q{B÷Œ#9„¸s4xÆ?•&âh`i¼³.SO*í»¬ð+¢üxãCT +`‡w¦Wž*]aƒeIÉR™ ËC䀃ƶ98ùŽüи©íB†"mWšH…Rò|‚@³sòö{=–»Dfzó‰èrÏÅÃQC¡\"Ÿù‡èO´¦Ëùˆf•~èJ9M¬ÝÃxüö}ɒç.Úx`ÝðøP…t£sMñÿÁI·¨(™B*Š‹ÁkßÐ  ¨'D pW…c©|ÓÁŠÔ Gÿ™©˜•òi™Ýu>ÞueNÇEüÁ Ôù½&$±js£!í¥ÄÀ“é£c·±Ê3üܳ0¢X\¬IE…‹¢Wі),ÓÌ8Ó£¶e´uçvýik$Š§†wÕÂG<»p»dzN^ +¤!Ó!°³€rXÈ0^B†PÝDÑÁ¿Ø´ +Z¥/6Ä,/ßÁþàžôë¸ô òt¨_€=›w!53Ê3!Sͺ`ui‚þ›1fE0D‰´FÅ|<@ºazdá\¾¯F¬LX;0ü*V´pE) +“áIª-VRkÕàŽ½ËÃÍ´#Z÷,5·1¨‰ÔՂ,'YùýÉõ5]@(m© ô¼žÉ ˆÌ·£ +øV-Ú˜Ÿ“Éy äsGÁž[¿\1"y}ââI'Ša% ›£žS3³$† R˜÷üf.ÁÑ~ûҗ×Î×MFJ¿Ä³*ŸK;1>³¦äo‘éwÞ$•4ä£#D#ì„Ρ[îü"y«pï(PóýPÛÓóŸ>°.ê”õҾь»È½IˆãËp™5 Ká†h{¹)ÝÏFgöAÔ Ò±öKýwÜ´C™\ecöHáۓŒ]Ö¾~EÀfÇƾÿÉiZ_ +‡¨¿&yÞÈæx:7™‹Uš ¹«¸Âí0€ˆÜB¾¾zK"0¨¾l8 Ÿ,ô-péÕÌø ð_>¸Sªq™!µ 3²ùÍ4,Ûu2` Yä°Û¾·™´iež•ýZ.Ã^¤\ßåêa}ÞP}êRͨoõ!N‘!¦¦·wôW¸­ªèƒ/è>èYŸ0Öó'yçÇ64ï|÷9›Y+ÊÇ_Ç¢ð±Ý@ Ò ½€50ȇuß:2PøÌx4%ªbA[÷¤ÿøÐ@Äm¼pƒ¨’IU°R<˜ç­_+u)g€v’±¯„…C–ü½~Ùo+)Ó§lZˆÑ|0LŠ¨$¯`uÎh¬ +ä·¹…h©ä, ½*IùœŒ±#»f,¤[ÕȀ–áyÈ;sd„B²wž;›¤Œ3ËûÁÐ_K-‹ç÷÷[r%M¾›ªÜ#'ÑQ8óÀ¢øËwY°6Ñ¿˜·hÍ +ï xM8µ÷«˜ÀÂsƒY¾Ÿ–µ¢¢RâBá?±ÞQÔ¾€B̒~qw£ß5\Ì·³6wŽ©[Ióµõzوúg6+Kås¦pX" ¹iÞ +ÉèæC‘ÔqXB$ ®­ +¬Äë½ví߆‚O c—ÝTÈÚ¤f3¦O¢UY×ӐÀÙX(^Áõø&‹WАJØÃãgé÷áͳðWnѦ¥$¡cȪ"•ÒB8ÔgW À^Ë頛„ž/Ö$Àw|bÖ:¼RŸ‡|µwW©vÀ’ÈŒ×擨ò˒°(dŽú½#¸¨ÖùÍéÌæùÜÎmÁ_\«E~ËÆÁ,+Óð +me]4y&ÚìT‚²­®è\C½œå?ÒŲ¼èÃMpTåì`¶ÇV‡`GüÆD`š \,\s{€c¡K¢ûܖÇq`0Ø¿Îº(côè+ ¼:fÉqÑ':MÓJFyí¿C8µojµ3ºæÚuݸÿÓ<•84¿PKULŸölƒš=BaRY²;êp J¦ÓEôÚlØ a¤‡]åÔõqMª4@Ä?+ zæhtCÇ”ð´Fß4W‚ƒŒÝóD–/D-â‰b,!°¶jEÕد̆ª·®ð;?»¹‘´´lVVDýX–&¬Ã÷VlêN†~„¯é”ĨT²+‚¡cФb².+ª–ëÙKÅ·O†ÁªRˆ©Û8@¾ œHÑV‹…€V¢-ߝUt[+Ï_ÛÂÇNKmÔ}h´=Gqäܪ§‘TçÁ—TÖ¡ÆS€Ã‘xåD¤Ò@ F‚‚¶n'þ„æŽG@`e¬“ +=ÛÖP#D“H±l)¥R­Úâ‚õÛ¶16!òÄÜisJ$Ⳛ›$¥¥ø}˒oXÃ9j µÑQÁŒøŒ[°8…Ë8€Œd,€0¾”E8WmIñ²º/ +-ì'˜âÕm³×ÁµÙÁ`ÚàT¯ÐÍìTêëoWAþŠԂ9– ­f¹Le£ÎÐ_¬Y墻·h+=š2 ’:ó ¯€½2ü¼¾¸Öàn¦ŠŒ¸MŒx{á +Я–î©Ú=%ôÄUÖ« †aª/¨¸7V.[QtUaèÑÞ·f¸›ÜøÆ?š—žÁ¶ƒòbF‘9K®tý&žu ö L@ß÷pȸ܏ÁÚ5²rQ$hÔH-º€"|®G©¹ò8†ßº©ˆ¶z[ùèíû@æ˜Êƌ@ô&–”ŠT¸X蛤NUžàc4/¥/P¦­a‚ã-© ÒXA“yXY5«hT*@]M…þI?’üédd@Ò0ýDÃzLËü×QX†Ÿò7Ö%§ÌPÀš +Pú¤ÿ *‹(Ÿ€ð2®Á§Òj¨F˜&‹£Öh ž^ÃI½S¬SvœïÅt}&gu1½ªJÚI&Wb;dwHQ!èuèCH;›tÊ«V +ЉTí#œÓ‹¥ÙiQO™S\\…cÊÉ +B 9ÿ#D,2NW¨ eÝ|“œÑå…7Ù®_º)D肐ʳbÕk›2ËNA,i?Þ³H›­lz”ó…MlŽ=¶e\Óz°Êš¸-U“-z/‘¯ÛJIójš +ºš GGšÍm¡M×ÇrÒN­Ë-Ê°ž©?J‡ÅF‰3½fâ\™aÝ䡂™®io÷ôèÜêh»˜9YüËk©õ+ö‘¬ YVÂt5?äЂIûç^Ô5`šº’  “bvoÊ2h”rz©õžÀÃÆK°íÚ[JB¬‰VÎæÚÏ¢M÷‡V.Õ}ØÜjÔ=û‰¥Ö×v¨i¾%¾'àÀЛϮvzà-{¥K“Θ+È}a©•€Ja'•°¬ä *)Väèª#°D†)iÓ¶4£è”Òñôà±T$7À(9?IçÊØàKãs¥7/Qòo.RNV( ±T€’õ»-çLbã³óIǃ¸›')#t# –¿<£tÉßzÀÒ²ˆ(ÜÂO昕Ä~¨e %eSQ´Œ& ¡Q +çžü¶Iƒ­¨I Çxã.ÌÔz2<%‰Lì›,ÒËÕ@DP$žl¢G·ª$a¤!¡9¤w@;Úæó‰Ã§|ñ·éegwn¢d’m-:LlÉv£1uèù¦‰e"j÷RmÅ#ŸiôÈþ}ºä‘2ùÂðèßrP‰ÊµPØ@vt̉»P@Á2FnH`£.4GL'* G–H¸Vt‡ƒ·gX.ê œržÌùL\j”…@u¨"Qàɜ±å"pÁŒ–5Ÿ¡ˆ™Gqݯ[¨#©à”w`­±Æ1ó\‰ü8uØhZ@8ïᓖ¡;(rÀD K†°î2”ùM#‡³>et#y;!QÀ´6;Y’¿- î²¨¸3$­Ö¯†¾ž°HA_ºx4Ãá⊰ `È¢˜ÇŠšIãZanL¢"?˕…;Ð$D Ú+#Ô ô“ܯ‘Ú»ü-O¾ÑŒéÃXxµˆR$ÑgR$œµŒCJž'ôO‰ù»@ü&ü[ŸÎ;Ry; ++žS #:(Qæ¶Qp7‚^Í£GXˆ84 +FnùÈ ±Ë ˜Ž~6»±¤9`yÿˆlêJiïC¥ºP¥Âᒪ"Z>3ºŽøT ]^†X4$‡3i +u·_B3ä|]%"Žû‹Jm2ÔùXÂQ€ÂX—`ÈNú‰÷Bj~Hâl8ãB%xP=›·ˆ hÀ¼Á˜bdm;B™‚t=iš ùÿ(šQMniÐ=L©~.t +eh2õ°7ÏTjLþĉÕú’„¿Y©Ê+”™‡>4 ‚‘'8E0îY$À C•Qt€OWX$¾þîÅ '»ü¥Í¦’ åpKjÈCT-.ja¦C/ûþ"ü҉H3ØpG@XÓF+mŠ‹6÷Hp`¯ªnÑÅ iPNtG²±¿)ȄŠ¼À=P{= ªRÉ…(2*¸:òíÅ&À“ÆKç%P·×Tí±á””n ‡‰ï€!SíQ² ÛžôKûͱ¦Ÿ4«j‡ÃúOÈÂþG²ÖΒÂ_Ç&M°u™X†Wœä«¸.5;gË 2Ò¦’•n׃ÅG]vEÈ1µãÌ ®FhÀ{çW7–j‰óÑV‡Œldµ©!|v$HS9#×ù7wˆ[܂nŽPÚ·#šŒ¬JJÁ² +í¤¢$#§›!Y– ‡ †¼f»”°Ô`î)ÎF_ÍåC–”¾ ›n"=7°3xÆH@ `–ßE÷2Á½…CGÃQ„šúqa|ã€êï2ªc&Äí%£ÿ¯rziºÃ3ŒLT6Ç0'‘Öj;Wp1oœ_ޔ^ìû3æȔ)„B€¢+Œ˜ª 8*Ä͌¡ur™óvq +÷£ú¾Pº9³`@¢#MdÊâ#Ÿ…Nf6Àºz§ŸÝyµÿ*Î'òƒàÂðêíJè¾gVô±ÃȑÝGUÆ΀ÿgù· Îåº-R¥ô/*¥B—kèšN†yýâ´M>™Ðè?äå.pkFbB>eý²#¤rB`È a7Þ` ÖèÙÖÁšOy)@,0rTƒ%”ñ)‹Ì¢fA¯úUvžd‰GD´ õä(.æ—* Øy8 +lѵè+!®·s—¿©(Õ#Í.ÊËÊ"&ÜÔ8ö<ÐèZ:µ<ޓ:҉…ÿNoþ){­Ö)®ó™ñ 8ë9æ±%Ž—ÔD¡|‘ t„áVŸ[šBx˜|˜?t5>ø3lEÜR·´uQM)ҘØõRaïñ¾¦µÉû²NÏ-Ç +Æ~«ïU¹O ñ’·ñá뙟ôFðÔ|šAæݦ3úsÈMu€‚>|vÛa`y»"ÿ®ÿ7ÖCðmå@6DF,,n##ŽPÈCÚç®Ç¤Z +f>orõ£žì‚ÿÎÂ,>#´þ9f…Α8>äî(ÌàÒ¸èìØYƒku/6µ¢/eG<'…Ð&`’ìoíŽ4€}jI” +×¶ùM$ZǾËߦ™O*×ç}°ßð«·Z͆îÚ\'\„Ï[a„›3 ~Zɞf$1oÃkimÖ'ûHnùSoybÿ= BÁi¾Ù…d +µIwšW/¶ŸçK°X7¬æ_‚ÉG“ÿBòw‹X÷¿½˜'¥t-ÂéÝÅ ]Ï0 Kà0†wßµ à˜¯Jâ‡5’ï5…ü¼ æ{fp꾯 ŠÈt<»Û“:QÐm +Ôl°×ÀŸ;‘gœ ‰wÑÙQU ‰†hCê£LAá4¬# 6Xb¤6ýst;~µ¨šà@µ± 5FÂe‹~^þʼÙPåô<§‚ `Ãà׺¨}î„JEÍûíÂtì¾H¼sHݬ鴓uçÀ=!3¸<Ç ¨1¢a +Â0LÏu“? +ž’ËíÆZvª2Í]W!zÙU5ßSò—„oßH_^ir \üìAL1™Þ&D ßéqZ'+Ï'§¢ÑZh…O£ð@\Cäb“,¾ "¹"c]9¿wC)èsGSABÈ{ÁkŒ„áè 0hè:ÿ¸§ì«s@ º4aX3kí|Ænp9ŒÑ×[Só,ž:b…ßøë~.î"jôJiZÍن¶“A©G՝¼E¹ƒCKü¸9`q@ª›XU +f8?" Õ[ÒbR¤Ý—´@Öl˜+Vòîtá=ً„` +1ß蚂ðT1¢pJ_¸)W5ÐOÛÍÚ͔Î捏9h€TÌßB‚Wó¼'ñ3%2ÆèíwíRF;š)6¥‡só1/L–I½}6ä6(ʤB?ñò.ãœEoQã0vi(:Ã%YDÉßß^}R y²ÙP5Õ×Ué†s5S%È'ÈcùÔX¹µä [oŒ7rV—àö¨„Ûè ˧«›Aëi0zgâAœÜhÊn=PE‰){Vù—PÇDÒg5€­m)¤ÉŠå‚0¤@s¥¤ZšPâ-:Z@ °:kÖLÅ÷7djùÁb*†YÆ藔.µˆ¦ ®‡+^zHå@ú#užXF‹>:ǕEºlÆçûk[‡å‹?†4KC›3íÉ肿Ð7–Ë›çÓbvô.¤È± ÝEη‹yßð)â®oó9^LÀ¤ˆ¾zŽ> Ïï̹_vwÃ֥s9Úh9·ND†s A®›ïâ©#£€ü 7ø¸0†;uÁD¾s Lh3fhl9æ€Ë©ó—üçàÛðu3í®8¹ã^Յ³nºSsÍ´y:V©ÅP|ӘµM—d˜3ù.€Úɋ %„d„Q}¦¬NØ!zð]¨]ÌH]‘&·ˆoR,dp»å[u|T«‡ãôh)Kꂍ×+“LO.rÔd|֑ã=& \hÁóæ=V¸@„™µÏ³/}ÀI¼ñ)½uÆ|ŠHcµBo•n˜EGžÀðÖڈ<¬Ó®ṄY ªMts%Ÿ›.Àß Á +—–GސQ„ÕMá&Þ6”š­­¦àqbfD [ÚÍ'ÑÎ{”£±­hÚ <)qƒ,Ю%±‚Ä»›+Á/ÅÎÔiŒßº9¥}ç8ô‰¶‹Ê·¢ÊO ßkÓÀÙ½›x`{ÃÖ£Þi@ö&z/§4(X²~kޔãBŒƒrªé3B#ÅÛ¶t™,ìñ é8áhßd¹1ƒîÛÆ|¦àäqn™óÖcì bMo½œ-0r›ÕܸS÷ÐúÙ%Ä +õ¸ˡNêÛÕM­HÂcý)]¶;†ÅoÐpÂ]–j߬Šy“ö ª°k–‡ù%²¶:dé‹Ãí>7¹ ­WìÖ=Û|W…4- ËDnÓ֓󎓟èØ)êMԌ­¿¯eñVìÓCì‘g¸A’Ú°KÞj±²ñT¿Šâkî\röuÛ¸Kv>^k6$@6C×ëU£³\÷U›:\ßr§þÎD¦d·4—l­W‰UkígG­µžh1k$|qNþÃ]­.I'£ °šÌÚ¾K¼ª^7#2„éÈÙP}Ptz9CI¦Î§eJ}"ýbPÍA{G§bÔÚ`ËFÔ³·µ&ÔF‹ žÎ㞵R®RQž‡èt¥—ÅÀéÔ¾Í4÷tàKø¶i|hzO„N¦Ž0R 7.Ü¥-õ?cy$ã(²Þ}1)J¡t•7N)B´”îjnêEÄÅ6$¢¥ݧ22É$SBq7’ňU2æ¡ÝQ1ßßUxðÛo÷ìbò†æ]­äz“;ÊAÙܝá.«k°ÐŸ„' —òщoD·oá¶y£èD㣊`x8¬„:mÿ‡Ö“o(Ø(áª]î%Cn­50tx“‡‹›É!$̾°>à¿6ܽä9ds…;¢®àd¤Á3PwÓö>þæA‘ +ñbë%P„$Ó6Š!ñbø•¡mº'ó¿[©áü㣪/sa&W®ö¶A}0DÈÆm Eœ~.`ê¿st§»|Îìp°}W ó¦XiCg˜D•m~Fl®x¾^ï¦A%zH€5Æbšož*`Ë)ŽÕÔS€ øæ§Ãe8`ÅÜ/!9lÕ}ÁØ6ˆGl;QüO6Ì mJû˜oÁ\° ú…ÞÇUíË$âŒm½Pà`´´ Yàü5ÊV¤‘ƘvÆãe†7µ•õïpϐXúy¿Ö=‘-’±µÇÙ1º.Ñ^öÂ^`Kƒ „Íh¾ñCÊ2(T¶¶ |.Ÿ”laùè¿`B$Ïñ°˜ބ=DÓ?Æ‹€4°è‡þvág“‹ïéº]vÈ%֙?\îзóU j©™>à"_Ú,³ÙB?H׎÷â»õüLF&³¶P9B˜Á"Ø-Lô¨¾•UŒg`’ݶÛ?²‚´õh>v¥ˆL¶ã§ÂIˆO¹‘sÁþÄK­C)òÜ(1ÙÁ)Fý›2€•à'è ðG éî H- Šq4¤æ”b$Éu•ˆ)µ&U÷± z³º¨{ðú¥]Ð:¤իSŒÑÀÕÙím†tEf¹ <ĉêe«Ü³ +JąW›O¤ÕA&>¬—ÝŒ’XåS–¢¸SëôW@ЗÚu†ÃM|ØB¡YÅp|=úÔÕž—– L?ú\©+eˍX©³’Ü« {wCÈ dÎyhŒiŠ8$‰4ô2Y€˜sc‰‡M—œ²qó/ìE ;s´ÙҘ´Ø<&ò¾—_í#‰(ŠŒ$æ®P˜ f ú*’ˆ¹ÀZHC p JÈB×X<¤}͹NrÉðÏdb¬f/Œü8»ƒ¬Y‘ˆUµÝ0F±Í'ûÃn&ä=Mð<Þòñ˜´xµrú¢3ûåPÝq¬€ PNße{ôܓ%8šÁ‚{BA’)­S¬…æ{dã eÛfüc|’6vHá3^ÞË ágͼx~I¶etL_|—ñŒõù»—+L(hšú@ ßÉ'„Ú,u½RXÏè~œW „-©³[=fú/LÔdßœ4Do-‘ŸjQ)ȋ¥ƒ×Vý•™ª`&+PˆÅ²¤ i\ãZ4ï˜.Lïí3°ÉìE‰QԖä4ô&ô§»Fàt\x귛-ýfÅ8®TÉ´Êê[Z嵅H˜I(>@@fz—‹”SF +>FÁ6'sù.ƒM³mD Ñëý‘¡¦Ô¡ÎO!-¼ª×nP¦”B^Ž'Þ¼Ëá]’l&¢›©ô¼‘ òÀ“x€ãxl.DC,Jûñt؂½ª ‚Â|ݞQ¯³„®½×»PÜb»lµØ'E Tyï$7ç֜l*ª®5õ§ae…k†´PéγïÕ¶Äå¸|’‡¾Åÿí0ÐìwJ… Œp܆‚ ŒÍ#áÁ¡ÞfãH@þ"øœÎÓØ\Ø9®Çì')¢ñn9܏\³—¢è”&×Á72’¶ó©Ù;.‡XÓA‘Oñ;ĂûB­—@øQÐ5‚Ò.벉Ýÿá§Çôfï'qÛ@¾rڈÔÍeëÅÉ×_à (låŠýš:_0žOÍ[ ñæÌþVóK<ïȝÔðc ˞\äX‘¢SÒº‘+Ľ…¼4Ã'È#Ðl‡×ûsþ… +;ã7ы2ì´_à“˜M¤|ÏÕ_Ûzþá\­VÌ*DÃq«}ú‰شþ–hçyÔ,x0×À›Œx4Î!+Ê=>o¡ ϛM}‹7¼”ùw³ã0í®Í *~¢t]؅¨™m*ϹoÆër¿M«ãæì 0¦Û xŽìo³0•îAYòaø{ˆm×LqLg[°#Q3RáfIÌùϷéº(|זâME@ªýž06Ÿi ´œeÀN$Ï~Ì"ÍF™SD¼ƒ}rÓþ:œÛé@¯©Ñ3a×-Ö0{HO®ÓÕ[Cû) *Z8³¦5V:Úë#Ž×AÖ¯Vü î·z¿Â°êӓ»Mµû6?u7G©eWHŸ¦† Õʬ‰(ÏE؄ɑOªœ<¸ìæM|@hfNHüŠö¾PFº ú±=ùt=fÆDÍpèæ†ñ¤¡‚ç’<&§®Åê››3†c4–Ø §QیOӗdNY%ØJˆÈ&1Ñɑæïðè>ùï<ÇÂ?Á•…„±Á›æ²âŽpèWU®Hñʌ;¯A(P'mo~™É…žñ<Q«¬-Ñ3H‡”.BBIyÊÎ>(¤B¡ÒŠ¿ ²ÈBÍFm2îúÁQÊsƒ÷NÍlƝäHp˽câhõb.ˆû¹Õ ҁEy¶÷ +ý©bÑ z¬©ÛTÒó€·Î4˜Ž­Ä\œìq\)ò®yÆ×MCVcùц([+.M’š¢fþa×WwÿࡈÇ0zITsèI/£ºr¨à”Vt‰šª0—£\Èú¡êÉL¤ö†ŠÕàà1ÃuËÉÎ +YGi':¥Å²uƒ-³•žÍB›À^CuMªØT€ü CŠ?  cûªÐ³Ì™±Éñ@<–aZðã-{šú¦~. +ÍLjDÇV‚65>æÏ9&…(ö0ãf…ª4%ýÓ£îl™1`š6Ý j€øu:àðÇõg ÄO<1Q¶‡Õ¡@}þmÄàÕr6Á=¥l·Àe¡ßr€×b®ó°G䶊V á…ß™ª[}7S¨Ûøžº¢¤D·…Ë9~@]Ý©Ùè¦?Ài6÷;¾¹m óåé øW¤:¯&!òö6 sûhÚnÑv¤+€‘6±ø‰SkËrQ›¨&Ô¥ýö¬v Í‚ÕÒ§¿û¬ìliënÌ>Q¸+§–!’Ž±9¼î—š y,Úá{*kßܘÆumJù°u±i¢5½øÒYׄ&XÇ9£«§à͘ꙪH®jS×®#;©ªûJ[Çþ8¾ƒ¨e7 ^P¿ +Øæ{Úâ‘ÓªfžJà§œåP,œÏ@¥…ßY·Â*Áo,Ló6sŽ¢«äá¬[õ$õ;Ię*›F—YXµP`¿êm†Æ’?» {%r¤­cJ¾ÇaL*¿“ˆª²Gɓ^÷0zæÃBŠ8ðãÊzrªõáÇv^ÇéB©„à‘ë®9Ӄ˜A¯6³4ɪ)₹€‰xéÉ)ñ ¾yéòÑKXoŸ-‘ÛÅ5ØNµV·^Ûê4»WnFÄÛ{ +UÀz¬»r“¨†¼ä†UË1?(¤¢óFÊÁÃÀ—À-É ‹L&ê‰6˜ðN‘äÔ'€ZkÖ/Mk-ÈùeƒÉ«äÊsöé1o\‚¨ào}œÂžÖÛk¹VWê6÷a ×À‰ëfïæšÃ­s¦ÛpI@W÷Æ1å²Ä×zn§7’ƒµ3©’9㙊6*o +SÂ1H>º‹|}"‡ +ËV͖°éï˹©Ñ<­’™Âj×+¹ºéÆ4lOáµC4”Îãn,’y±“¼OHŽb³ âLÿ®/»íg |ò™²á‰#?âÇ `æՑF‡Ì]Xõ³–ÊgX¬+S8k¸1¼$ê”~6bÔÒí€Ö6“üXé»­S2Í?ðkc¿Íâ4n³öÕü† (át‚]0¢W’c"îeI +ÞD„6'ûÃèÓü\¸í!¼2ô´›JC´M_)œŒá ň ²ö–C>I¤Ã ®$àÁtùÑ6Re§ s7÷ÿ#0›‚ø'ÊnöŒ! Ä1î;RkÐüûBpšÈ’år¿¼íàØÛ©u¡VI©üÉ^€É¹»®Ç3ÙÕ[ږz\>Ø֛‚(‚6> Ú¨‡½Å¡%{ó€n‹¥ +Ò)‚» +¬«ÀöŒ¿š*»w¨ÖMpÄ–;ˆ6¥{פf?ÿîNjùÀ2r-&š'þF…LÐ ÀJÄ®¶ê"‡¿Vµô§‡¨Ö÷úÙßf€*˜únª‡7`¥Jé”Bíõd€¶=m0{^ƒîë +‡Ö ¾k²{Ì‘5øQÅW“„fR5ômè8#Z^NÁúzyI- áFÝÀ¨äÅV°iåO£?.ċŠó:]®…íTp Ë c «Â)D‘ˆa¦$d†á80t£rõc✀?áŠòºá³üÀT ?$äÚâ+Â=h¤+,Ç]LšÖ–@qHÝYÞ?5i!Z¨PɚÌ°£‘™ŽXøÓ°Ò`aJÐÍ +Q+€+,ýª0#ûRá U4“ZBõ àL,– ¢KÕ®Rð¡5ø´°ƒŽÇЫAƒœð{0¹XøÇ “/æ +/gDG=¿VO“bü!€³ã”ü¼fgUbÑ+ 4VSŠqa¸Cü˜ƒ»ís¥6ØYL6ª%`Ö$H¯±¼ÏÇà)°j. +pÈŠ8Àõ( G‰£­ü•J˜kü2Ä³V@yÃ$:c&‹~j f6¡C ¡im$‚Š'Š­‡ÓЀ3¬@ÄÒ7Ð>Á VøkYþ§H’¹HÚqDÃ à–„ðSÇ'¢³LßYc™9'ˆÎFðä0°%†^éK¨R(-™ëý‘;ûèò“(²|ñè؇(ÂÀ;šW'ÑL::誅é§÷W]£ª*–0î Œvnð¥`[@.‡ƒ +ADàz“C EZÁz%#afº«~<µ‰é:©Žpƒ1îË°É×`·Æm`€õ|Í|+ꐅÐëû‰wí Y°³®@ j’ˆg ö¯DrW`V烨BB¥)>!ØIËÀHDH¢`)ô‹Aè›>RkdYØ©ãk‚ٍíà(D˜_°¸#ÐÔ§Çw!_MBðô\ %$‰ D·êÄrËkˆUè¾ÂòrB° \•"F£ ð)ºTyáej@PSÀc‚„X\/Ó +[qJp% Qºý‡²7d”EhŠÑj<{O¤CÈr{Ȓé”LÊ>Ž&;0ÒÖIOw¶ºÃ°¦‚Rž¡ÆË`Íyָ钟{Êaù CºÑZ¶)²õ endstream endobj 118 0 obj <>stream +`¯Ê¹ÓÀ€ÞÜÒèEët; Ì̓‰r'ÎSq –þ}“•¬„O å7üñKN÷^È,<ôÎ+ù 3, $Œ…ü’ •LڕÇËëÑ…ÍVêiÊ>ä +÷ù•®˜“î߁úK•ý üKS®<‰;qqw¡9û,®¼d\‡ +f‡Ð^lô#~¬?<€ #ßÞ`óV^¹·æ²´¸ EzilQ4H“Ä´â¶K.Ûyâ9ËJ%ç€ÜC0Ñt×Ásyr¡_òÒ>ì–R£—ò·MñËÅ+AcÒË B­ü[Sg— úp]Ó-ÚpϖÆP¤• +Áî’(Òʟ!ÿnAæú)>Zy"h|ã ¾|Ôå{fZy_oÏU7=+¿ úÖÿ Ññì‚4}]Ít?qáN:0ï¸bI²—”#¥Ò =ç;fåぴGÅâH[LRáD§LTï“w¤{€YÈWOáõpì縖HI¥bå±Á›î%)™A`’ä0Iº×CŸ@öÝÄäx½fÆ w“¡¥0iQåFÎҝÿ ‘0@„Œ "§¼ªB"¼Ì—PlöF«IAb‚¤YæŽI† +*/wœÆ¨è8ÍÃa|Q«RÁ²j³£Cƒh¡bk„-¥º\¡Ò¨/ê!{M ùኰ¾€tõ¹_$Þß@,Ã.ÅVÀ©|ÆýÛ.Ù•ÌoÆÐQjÙ׃Ê&·Üà=T +íC!ŠbA ÷…€Ä+³°€YíuD¨´ˆ3_¯ÏU"‚ 7*1È2èÉ͊&@~ÞN'̅cµ[Úe¤á6Œ KIP< +‰S‰¹Oc݃Œ% ŸHÒ~¾ÐÆC¨üøŽgV\ׁpä!ûNuuCP¯ÑàB l +ÏäÐ!c(`ªjwBͽƢX֕òùüFhšz æø¥^R!•R#b³?’Füý×Ðó+´Æ¬“.Ù÷º™¶8M7¹ð|¬ô…¯–eK¬Ä‰/F ÒHŒ7 ø4Jíe³ÅBTÿHƒ'4úτUlÏ+Oô˜löþ¸^¥¨:|䟺Þ¨-x9M±–)ª†kC“dì}$ÛZë&«Â¯Ûü9m÷×*U)šY0™ÊD]EàèýÑù¡¯ iÏH#ô¬g”BTX¨‘½ÎëB¬èýÑÌÀvjòæ é¼^zíEàÁ¡ ä ’g½.tzþ܂¤µÇ¶2!¡‡i'ª¬±¶ {l“`sâv›ºª IŒ©àFÁ¥<ýöàºâpÂEÍϊ2Š#’V;f7T§ý6x{‰­X„ ~/Îtx|J&´ãËp–—Hv6÷ ú>¾¯È2½ˆUU#ïòæ`KÑÛ Êã‰©¥ç{ÁÈ»£d›îȃþŠCŠ…±¨—°G«',àîMÙpžoæõò!­²Àƒ¼Ý§‰æə6<Ó5’d½D~¤Ö¬£ÊՋøIFº*¡ê…¡—T*²Õ ztðC>jlêE|ìVî‚(ˆLêE~¬ °“6qSqTI ëòB15þس›Å‘ôÂñ|q)G/ٝö@E6›—Å¢L|^Xƒæ2/y1‹7¨ÁÜáu)v&V]È£ôÌîL+¡ W^ÌÞ_‹ØMy‰Éqßµ©q—·çn«šÍË·ÝöC55/™ [,C]0G˜ÅzօºèàN½KÞR´CzO«™—hñ´n0%ó‚LnV¹¼  ¾»vÆ´j– -/ÉcMõH°Åò:'çA&y¹q+/XŠÃ¬)ˆß"”P‡# +<ŽþO{“ƒ„âÅȑ’—§Â>, M¨ÄD^,ºÝi‡¶?2\{j]§žŸéd†ê‚'Qé ú‘ˆ •UvBѪªT†ý÷‹yˆ©%³‰¡²#Çc^QÔ@—ƒJ»g˜ò»ˆ±òtéŒÔðëÜc¨f|K.áÅ!Ü@nÊx&„—ÕЧr)l¦`7ð½wáí›4\\—ÁKž!Ó`/V³WKäR¢¸ÉJ^J á* Â!ÐõžC6Y +2ü^êj¶÷iÐÙúw ³K½7¿K®°rL7]ô§¼‹iÄáD«ÞåXîa¨½½K~ǖˆ¿â˜wIÂʱ Ý­÷…î>‘€MqRíÀwI#„š% . +ðÚ]fë꒜œøúƒÐbÈ{™,%»å’‰/ë.ÅøD1ÐëÀÄú¨»ä•сGÍ­½ÜȶA.‚=θ˄Ðn·D¹‚…€N‡  6Úe}’¨:ƒ]PkcuÔÚÑË­À]’DøváÏPêìòG“WÐ3‚Á ºpy#e—©IvUÆïx~ç=EWãF¾H»¤€n§3A»PÝpõî Fʞ‹Ì¿$DéF’JdŠÄší®±¹%A|„àðn3d—uÇ6µ]»Ð½ôã… ¾ £îmä’ ÑÅ]³5ßà/#p1nøîy-Ø¥dpD¢ñ¿ºdøoùs1‹)L .I½]ÜFè/8^£+[ˆVM6 ¾ÓA²#fÑßBñE´äàñ±Œê’6³|S‘Rª%êpj]pѽ 4ˆ³.y³´š ².1ºÂPÒCi·KpGÀÏt)äõs]DˁÃÌ%\–ÐJ]fcØc`°p]Ũ ô!]Ʃ˨±P—2&ž·‘‡À³2@Ÿ.ߕRÑɼN—ä ¼Úôy8]"5Ž¶|íï((¢énÄiñ4«=LÛ1¨œßÕlù)›‰ÞYÞ¥Ë [\bH8ƒ}aJ¾£$ªH=µfÏQ.<,xŒ.þaÐ%‘+€5ÏñÑù<Èðߒù;'‰ñìR‹Œõ¼”szµ·”¸«ƒ ƒ.ΐŸõmÙ +‰¬#KEÆ@—¨»(Ռ挼àïó1&æ˜ø\fàÅU7×; ÅTÐsaÅHÈ(YŸz™QáÇjn £Ý¹Äp°ôÂ-Ù· Øœ‹‹¼ØåKÎŦoÇ¡VœËñf+À¹Ä}‚Ø¡ó“¿/7—¿JL.¼ÆýIß26—byx!Lßˬ¹PÈbF›±ÉÍyӘ 5$“ìŽf´òÉ,Ñ®v!L].X<$.—ß)Næ¢éÔ+¹”ôÇð¸îìD¾ÃÅ°ñ1DË¥ÀôÉ&Ö\Öf‰y³Eãí G}¼Ì%y#Àx—‡ÔIFŒ°G2ŒÊ%vQ$zò/J۝ɐA. -c"ä.X‹ø—?ó3ú¥ÑBqÊIŒ[¸À¡›Dá9ŠzZ±…+ڙÓ jciIb>.ð8šØ„ઁYä¸ °R¾J£¶–ä"Ž§ÝÌ>TtÔ»!ÉÍé׶ÊN¹ÄW»¦'øÝ €°¼WÄ-8<.bïÁ¯õ>ëé["pÃŒ¡°®zýš¸L‘“' AšÕ1Ð+;h\†ÙÜ{·x/¼q¡^風ûðׁ½.?V¨o¶A‹Ëg¨ (Ë"BiqA®RYxt Œù®u‡] `-€(æ Wù`jÌ2É$S’‘š~áw>bi [ H õ­Á’Q]NóF*š—ÿ’–+(ª”q~M9²NÉeCH,»KÔÎ#23{~ú?¦ŽÐ³Ë¼oŸ˜ +¹)Š¢0†Š._YªÑ"u“$s…C~X¶¹-ò¢ÂB +D{$þÄèHŠ¢Ém +cBEºÔÁ¢ Րú¤ ŸDKKü´ |%þiùĈôŪ™å}ªáɱêf*]Ø{ÏÇEB1uÉ-Wq>U!­á·zÆî¬æÂRXɵŋ|´úKøÏ$Þ=¦V*å Fj˜EÒLЫ†C¡&¤Å8\5A¢˜–UœYÖêuŽüæûJäѾŒÚÔ4WˆŠ{Q(⑬)¥*ÝçŸÖ_£^…œðT?EY ŒL7Ñ>A,M$¥Z‡pèøc6Š +í+òT"Q¢1JJDÙ!Ÿáü(ÕL°qÖRw"ӝî~¹•}"UÀ÷ñš(býĔHd"hü*=£‹ç%AÄ\ÍúH[JJ¨â29¥xúãÒ ¼ÞEc:$è󠆛˜WO¦˜EËÖÛgñz¦üܔn¦¤ªžÆS$]B‚„´Ûz¢¸*¢?d!^´™9C$AUìæ™L8f—÷UC´Ú¦»2¨ŽvFæ5ŊÁŽ&«gNPT·~2Wrp“ü/Sò +&ªKëÁåÙÌt"ÆE7UŽËœF§ï‰9•„&ږî°øj—©1’ª˜~2þK¤Æ4äÌ rGò±Mg kÄËI^áéhȱG WѬ +it²ô$‰º3‹‚º5&"ÅíSTQÖñßõM¹>䄱/q‡›è˜è•â?„¢ÉÍΦ"./!I;T²¡ñ܀õ ˆ  ÃôÂje"$ÔÂå`¼*nâœÒUO_È:³«Dã¨ù"ªS‰˜bQ0^–¶xqEµÞEiè¹ØnýÀ + ‘×=Ö6;¥6bšMJ ¯’H|ž Ñ! %L¡g^q“óV%¦‰"ûw҈FHÄá=‚!‰#Æ¥PêuoD‘®Ä1Ž [¨Ÿè¨VúLY©^ïòÈ©d&JâõÉL£/{¬Ì"Õ¡þ$Ù¼ñ9h/‹Ue¨}k^¾™Q½4›Fª"^huŠW[_z<"JÕ* <ŽVþR±ê\âh²ÝãÅQ9AŠ¿ …‰ñQH¬S:o&݉1‘sŠEVÄRBk2•€ÈŽˆmr¼µ:.‡öYRÓ2cA¬Ï©–ÒÁ¡ùZñÔ *eô™:œÕûLÑË&‰²fª4 Ãc?"Üô™$²zî"¢zfKÅBDP +¿šJ¨„ä%zRìQª&V܋S¡;‹( »Ök”ˆê—Fª#㠚e<¢÷ä¥;sÙÛ1]Ž"×.SDi%˜æ)4r]Š³SMD«è'ù]£M »h¨¥ÒˆSBéLM¾¹eOù›V9ÒQDTLodƒh¤êþP0ÅÓHs +ºà°SµS|,ûZ´Üج³Ê2+¹¤$¯Ö‹Ê¼d$š1‘D6ªLeâUU‰)¢L-J¨è³ò|”±‚—O+ vfÖŸs¤ê|÷Ù@ ÷){• ¦ˆW]NÍó„ƒ!A$$OfTañE÷ªD™U:æšV£Q՝$„§>Œ4Ž’ƒæv ¨Y'dâiišTÌ_ÉTP §X‘‰t[}/„î¤üŒZ~‚ëD„6ÒÕȟÖj÷æ(Ê%ğV醐"T›RM¬Ãó©#ZcÝXȯΔ8[SŒ(PÅ7Z(5qF¡ŠOŒS­šû +*ÓÈ©0„-wuaÑX鐸&/IhûL*2d‰†è½rW¬PlÕrb%¯œN}AeCˆe"W±"–Q+ËL©V z ɒ TÃÉÄ}»® ä¤ú~DžâeU¢(8-9½¼èõ1YìKyŽŽ$t !™œZB{Âò$hŠî§†¦Æò*N±HãOD§¾°BEéRB´ŸöˆÉLf%"4QŠ§çäѱþÚºXtfo_k-X] _Ù\ö BÕ1jÏ2ÑŠï÷—Z$¶ÈC+šn>$¶tè +ǝ Ê$ ÆCóSlônûèg§À#¡=«†V¢Áâ8AeRèÚv«UHoÉ®Õ}@ò¨;I= V£µ/šÀRdø™²h&õ!’M‚HÃX@cWÅNQÛâªR&ÞXl àø)½d °ç$¹¾ILÂò}”¶v²Ð££‹8ÎJ̔‰T뉼“?cÞH‰ÃÛ[–rÄÏÿAÅIJS«ŠèªÂlç¸X҄C.=˜*%£hœT×ôA›ÖûGÜb¸‚‰öM^r©SjèÅÔ¼ªê©ï¨QÉ8êåY ÔvñXdÅHT{Íc?-r©Z‘yœ,&J4bë(Žž/Ž²g… Õü>, /› R¹„ê"¼&‘µÈÏÈ5Æ=E¸ É˧½t +mcM…Ãðõ[TpòØ:jFb¾+¼†lOPãŸ[(\´G \"súp!ñE6Wm&¨C?•!ÆÀ>áíTåY+©c¨¥!µ—?”Ù*µŠ(—#䁋5}böS,ÊíÄÀ.‘+õ ¤)*!9uFTRœìy¸b6ŒùÁÏ©û-"û1üù ZHE‰â'Bj³´eºÌÍËÉ$‚ðŒÚ™‰IÎ$hD1ԎÅÆ®¹1›À€Ðú`Éȼe;Qn/ò˜$fōÚjó†gZâÍ)mî]JÞ [œÐxøžOØÚ´~'dŒÄ¤Qå© ˆ“Tù¼à;‰œ56ZÍ.‚ù•Jé¡ÓZUêÆ +âIT˜²v5u…¼G01)øˤ,»¢21!‡Ù*‚bZÇôrV!ÿF&[WñH°šÖd.UMx‚s¥QŒEJf `®ª«lŽq¢I1‚ÄËÛØ´á2Ѓ sÄæ‹ÞGX£"ò#‹Köø·˜ÞÜ[áñeÜ£¯Í_^œ+S¥¨„4ó!}Kk<¬¸)Z‰Óbô NJGngžjE}ÒlU5‰§ÔّTè%I)XCZ`„E,obaˆ„s+K¿¶‹Ó•N3©Ò ·Ð|¥Ž%LAó‰7ü‘q… e_Ð\b)™[wäˉº,"ütduú_”©ÉQ(oܲȈ,Ä4œ Ñ´µÑ‚µf"Û>"VNã†Z²•˜wPÐÅkßw}Ԃ8€§â‘ªHåÖì’9;©{:R’!Ï­:a”EFû%\náÌ"‚jŒÌEªTr!#h¾¢=L)³“hL'‹€1ÂÆÈ^”}&wH4§Çþ"O͟IìñÔJËì,’¸WeaÐ2:û Ÿœ€Üôëd‡K—ȘØM15Ñaƒð34®¨™Rá(Ú'nˆ™Gýþ‚Ë?)¶ÌÒl!­à(œ”.WQ²¨ã“²Èðv"©þ1j(Šç¯ƒJÈGIy™S©$þ”t%‡4Nr³¶ÅßJ܏ÂΌ©2©PéÕ½¤« ‰¦œ‘‘‘‘%"ìJDÿ)©˜»þ© £‚“ ñ1덒bŠ¥¨Ç¸,§Z^ÖX†=½1ãÒ7f û¡P+KöÈ(⾕¯‘"•E„¤dÎÌF~")X#¦Ñ-ñ‚æ2å*m7ñÕ1µÞçŠQñª‡l3¥rÔq ‘•WÎ)q¦üš ÊH|5:Ÿb檯‚¢ù|׳Õv99IüV ™Q3T™ª8›©ö“U—\¢h2j ’hQ˜ˆEGý+?YÅKF¤ 6Ž55^˜wÒrŒ+HN¥ +–<,ޏ#D©F%øÏVÕ殈t¦)Ÿ¡Œ‰\HöEõeÕÉ]õSG½|Šô×3´"Q5BcYKjZ/’㍆=¯ ó¦JÚ* ¹Zó“LÊ¥q;ŽcBÈZ°€XÀ604Ñlôµ°w ­g¨D‰T¸Uä-Š"(¸æ0•¸$FÌû6ªW*.cªéÞ*]*Rđ,N.iÐ!(T,-©&«¨ŠÇ4—èê©·`îŸ^£Pµbf¡±4‚,ïg„A'U1øÀehä'h×È[Ҙ’“¦´âzIEBÕ4žn\¿vˆ&¢T’ÖíÜ"×P|wðôZ„Lñäâ»7)IÉø­߈“ÍÚÔF5›P¶Ó¨®½f›( +¹vÅ ‹t¡<*DTœ° ‘qÕM4ªD©Úl!4E*‘¯Ÿí«J„T¹–aKHVE”ƒs©©Ñ¸¯%éDXùx±ÇÊdž\ÿ¿S?C’PæM}¥l¨ž0h2R3’_]ÍDeêFOÊ‡Z’1b*Q„¼ø‹üKu!"»ò3tåQ¹V4eÇ,h¨.ëcÂUÁ¢Ï­ÐUÎvˆ(Š²%³‘ËDÌ4¯¨{€Î=Í#Θ;]”LŔ‹¶É¦EFyjf"M¤5•/c&á"(ΒàX]DÕs¥?ªŽõmý´ÄÂé4[ø¢ˆJä:2‰úë7½HNÓ?a +l1¬Mø3§Ðqg‰ ˜14EäýEFÙ¤h áŒl\©5?y‚‹:a +ú=½G8Ãp“E™"3VIþ0¨¦@¹È%dؐ™xN2JÉjBÿÆb)×c1âª0²`²…Œ­Â‘#Jòñ+¹†~z­È£‹×ê)×nVšˆ¥Jî‰åԒIlT~©Sdñ«fZ;B|¶çYT†©¦ GÈ8“ÞSõ S#ZœâÎ";ó%R"2'‹¿·ºIj¡âäPT±yA_b„4O\«àR'¦SS5–ÔL™—åef«è½lJÕƪµzô&¢8¥¦ó­“XƕåL){ˆ6"28ŒÖé2SÅxx2—&þ]#!ª‘ÄŠÓ‚ gnêؓC4-ûɔäšQiÞe0^›Þg´Ûì$’©)j5\ÁuF"5,êF¯W 4l7“Ì –f#³ s£çhK 4î|A;ˆ$bd‘ÜQ¢¦Ê(d1fØiäB«†’ M›W †F(ÕÚ¡F¸Úº í#yJÓ:ý V y­è$^Ös°„Vª7Ë«åžô!Š،C*CÆԓ˜™qø—äµý¬b©: ›;œ›¢."eø.ª(².É'¦u(ºÐvK_˜¢“|Õ©WF±¢¶µY°ªYV©V/oj+jQs7Er!“ŽrŽÕp¤¾ŒG"ôòJ)CŽÂKìa.ò"¥^eãð¬R½Ø3¢†’Ù½™£•ª@ÏwüјÅÏbTSáog#^úWÈLÈ¥œ}ÕðþÁÎ᧪‡5žôqw¦D§p–Tš ¸‘vœô³šh\†ˆ/:¤ÛU¥–ûáS""ÆSßpNS#¥$êU ‡ó MÍU«ÐdM9*A­~Bž˜mbA±;DC¤Žt¾™¥–º¤%ßY£'mC]Q§aš¹keAQÅÚd^ø¥î[ª2 ÁÒj~¦fªhÆ éLŸªIöV_´†ÅD¡-LQGʇ)0v”pˆ±½.Ó +‘ËÑ×Q€'Z´(f-§³=æ,‡¤èҎ°0ÌÄ${/¹ŒzR͔Т$ˆªŠ<Ýì#¦ˆyŠ¡útÈô_jf%cù%–Ë“ ‘CHÅ|¤:51ÕOÅ)]éHºñ +NÊ`©>ÞD3"TÊiáNEUŠJm’2ØqY +¯ªœ“ Ιà)¦iM­5² EÍ'‰éL#¸ÀPh„L©„‘±idó…vdwè5n4J–hDGÓ$BffAáÎHµ^´¸Ø’¡M¥ô]:1”ñ«2æwúÔTŸÉLќV‹R”Á”iHO9Q˜påxö©ïdL–û:Q¥ µK(JB;bª‰Ÿ†/¿ª&Vd ÍUR §Fê…]Ò +r›ÊÿrU¤ +´¬9ÌýSÉEQë9Ud¹Dñ`¡§‚3 ®ÔR¿œ;MDL  ÷vz†Ö”µ.GŸDáq÷–D—¨˜4©Uif+ `A¤1Ï@!wÈf¤áÁNõ15!ATáĨª2àbƒŒ¢… )²d*<¨3Aú„[ø¸gbjˆ¤ªUåPp0¤Èó™šzh±hÌØcÌãÃËHü'+TØ#¾!ԒShhõj«çA3>¦å”˜Žä}á °øÆÆÒ$%³Q£sè†sñ‹0 iͬ(¡*ÅsEìác÷Ž}.µq¤øWñÇ°DS™[EÎt4(得Y@5*änÌfQ½Ô3Ƀ³Øˆœñõ*:Jܦ¢‰%mM8/K¯ðMe>m!ÃÖ"ûD•T‚4µQýsbxB1ÚÈ%=}ß*ñ9͊òõ¤³¢‚¨â"ì†EàG¦RÈîaà:.͊LÑ +µ|ò Î8Tˆ2¡š¢J¬h¢I§)©Ï…G3ِ» +’RMQA«xXâ=óV°>3"±È‹¢DN´(jÈ‘gj #2áñ6քëDËùµ€Ìä4w[÷H‘œ›b%BEKOÃϱ҆(”jÅÄè9$2ž·C‘Ôùqn‚-‘YE»1#Ðbþ‘ß/¡”$zôu™GÔ4†äA%&ŸØ֜Jª %­²£#švX>å™Mµ©š!ÇÚ?‰°TÈf óӔ„;A­ØÜÇˍpô@w+‡ÛÆpYJ¡®*féå%õi춋²Ò,$¦îå’ÌH„Ë||Šá·“œlŠmRË7~yJáP)T\D:ÓKø¬°jqÏO™X( +yòwKÿ5|§Ç¶Q '‚=I)N •èEhŒéhŒ‰§öĹmB7!åVqDÚaÅTYÑFŠ N;9OC’NcH$ÚE†$aùƒ3e ñ=ã`"æ.³¸ÜÒ8)ê•|.[j²2 y­ã Ã̹ "—>½Ú±$"Q:$+‡ÃÅ KekC×LQ£ÆÄE˜+‚!caÌȜÎ(¤M3õ²«šü³¡í§Ü+ì[Ä!ÑßÚÔPt§` ¢§ÃŽ¶Cæ(GÉ ªè “ç¥^ b:S¯j™EdÑ<ØT "ñԟ$ÅšO‘ò2B¤sÊ<elí®côo¦jd¦5Z.Òr´\¼>U + a8v‹'8QòˆNQP…°Œ6֐M˜ÆªÌ¢Ÿ)…¦©ØD­ªèáD¤fc§CÓ´Rž^}©ªa¼ӏ$F´aƒÜÐFj(ñ8½íÆsʉ1*ë#µ˜8ÍHyLS#2Tњ`Û,”ë“ÿrh9ª†cªXɈ(ø•7R˜šš ¥{B¦²œæô(–ÐCå»÷1A¥ºÎ„œµN¹ü :ÅWÕb¦}é1§°ž +RÐþª3a*O˜ð#N¥V´:ÅT®z%ÁMgäw"Däfĉ$³Ôt†ês/¬‹)Šó¡!QF¾èpŒ3¡™ ª™SG5‘Ù<–¨SOÅ ‘‹a§ä Æ$5srõÔÐÃ%M#ªœ«Ìr>‰-®’Çlˆ0ôF•F|eÎaå úÃÇp©ÒJ«#ڐ.ɬVUï8a –%¦#3rXz3Ÿ4{+íÓ©b„Š.í¯Qpâ-NÄ5#!•8+¢&_5¶b™ìè¬K=<ԅ#ñÚ°ÄIE#„,A¥2š(¢:™T3&¾¨&Íý¯¾&¸'53]7Q#7b$Df…&HDë«™ºb44S&*"’gÚÕs…¬~Câ‡Ht¦Æ³MYsË<´q”b[´ú".C‘w8‡I3ŸúTLˆˆ{wýJˆZš/â DB*’ÖÆâ⠉­V³è¨ õ Ue~^ÂbðìY%&îås^dԉáÖ͈Ȯ[‹Á.r^iåk…hŽ"\d’*’“¾0ÍC«š +×1‰ˆ…>Š*|Ró†X(¯‡¼Êº[kH ®“Ìښ¦ˆ.2âûÇ1ZIè፦Ӱý2Aóœ1*¡ýø_Ÿ=2®61ø£ñs™¢âpæ†~q» '3{oÐ'å{qu„¤ù\R©Š_ˆPŠ¸Šê¢˜}þ”ËEŽr(—f¸ +X"ñ‹%©+ž%¿L¹Xž ÐÙ--^ÂÅ0+XB-gáU¸OGU‘mª1Â]IÄôã`¶-'³ú#C#?±ֈ^<ÑJ¨¤XØøÖ4Ï«ÂüŒÌgëçýxš_fÅ´W0^®‡Š·î‡»{V+±¼Â«ö!i“˜¶E3ö1ÚVrÑ]&¢ސ" QZ]Ì%Ý¿-„"ÒèÆ`%N!4½›2Å`°øpÍ]Sy8>¯[‚\ÛLˆÇŒÛ(ª×ÂDõÝ<‘ãœj³Îˆ꿔CÜC"Óú–Ú)÷'‚ôÊy•;K?=Yµâ€@$  @˜ÀP€Ê€HÐeÂD«Ì›†Ë˜ŠÎr©’ˆÅ=¥ •wäÅÚ©²–¨Z°Fw>+I1² êØC£X0ê ­êÅ0K‰ù¬´hÔûXÎ#ħ*©š(Ãã¥Èe¾qI"îó4gUý%î¥Zµ¯!ߛ¸ªµ¡Ï8žÐ ?(±®&! rßÛ®¢…dNž‰ÐU 8Šë/CW$sV…“É”PK>5•ëpènørI"N,z*”XLCf2‡¯¼&N›w]òӂ :£6¡”òMJŒ‹W‰¾B4CœåS2²M£‰‰H¬)æªøŸŠÕ˜:E{ËNd"w4£N…—­uӊ”™%ÎÞÏ7YUY„}Wà”©ák«¿Ï 2DjL!õÜ˹èތãcؾ˜¡L;‹I—Ë1#EgÇÒÉÔSïôP6¯Ô>ی7 ·ýÇBÈDՍÍbU'¡½ŠBÓ«XB'¡É¶‘K˜¨’þEŏ«V1u·5«ŠŸ|ªD ÙHɞ„îŠ>f#QPéÎKH“æo±Æ?*‚’×åRPŒ—Oƒi"%!Ž”+¤‹˜™ …Æ ±P-ØÒOu†™ªMüô™]oP…ƒ„~Ã(ZœÀÏ¥B§°ÉbÝ¥7\EPTÖùÌéJ¤ %ˆdF>§šŽ¥¹ÈCLPñðÚ¾èÄî'¢6áÐdvj«œÎÐiÓü™½½§!›Cs°´é£%ª6}k¤•¢!ò‘ð¯¾iduž™×B« QÍIÁùU¯™¢IßYgd9»yµÔ»B.1r†§QC“™ÝZ¦fbŽB<‹Ì1ÝF҅ˆM-ïŒzê.BáÌ;úã¦ü{„tXúšÅÔ(ÚPLýÝvl2ÜètÈ,úO­>vle‰šPŠ²ñ ~„·ŒçôŽU‚|;4ä÷vP|Á{3< ÑtFZT²–Li1øK¶X4# 6Øä"º‹šÏ(L™ŒL¨š…ŽÉös#‡È„Ö觎G“å #¿T1¡:Å/ŸE…æú(ӐÅê¢øFR¨;7´yQTfíHH‡äJ6äijuš1Lh—¾F‘>œÀ +*ãæé/2; +ª˜È£M÷â)›•¬Þ˜7¦ÓŽ¤÷f­0¡–#ªÂö:½U²¥T þ1 cŠŽJ#a\qrÔ㯆™:eŠâÅ(u·)x’~¦ÏÐTʵ|£Æ!jÝBòš`ȋ$hÖC§ßԍGEßI*^ ‡UC¯ÅçêC 'Š;‚u™#ò`=>J2­ÑXš¨ +?Æ&?©Í'¸M}HãDu7ä墡é¿`C±X•*iŠ\òÆá_Ýï³ÒܹÌ"™‘»<43©fcš!û䧘Ë/À1eÓÄÉ +i•?8¤Î™× ÍèÞtŸ(K…©­¦‰[Cz$dUð7BQ­„1tSV2¦‹†ò®õš‘oX,ëÕó|¢õ¢þ\L&™Ì. ñ8.8›Èüs´Lõ„ñV|’pSÉð1â-8ÄX̦FPÈZH"a5¸»E< ¹"ˆÆÓ¤°Æ¯ú¿ÄHV–X*JjŒb©ÕÌÒ)Õìv QE㥪Oq5ô.qE8GȐ˜.éú¼ )QCE›gDÄ#"'úgSAT¢XMŸÌ;ETb‰jі¤(’šð…‰ rþŠªñ½‘£¦jŠè±qŒ¼~"Š9'%­ïÒ Y†KDEKÅT¢B¤>Œ +NˆåEQ&íŒrD÷L-úSY.âéH¨üxé3U¹>“?éÍ͊(Ô'#R¹»ê‹’y‘M#TӋO ‰R±)5â!×-ùØB–HD:Hô?ê$[͙Š Ù4¡'j“Ùx84FÙ44(x¢W‹¨„êøIÈhZ˜„á¤Ä”WC¦®=hL•÷$îWU^¤sGՌ‰35ÎTŠR¦P䘐¥N‹ZDÒ3F|"ùžõYhLS..:ô¢ˆŒH>´)’‰†VÛԗWӘ㒌ÇáéfiÆó}F.…'¦öMÄb( OG 4šmBQ˜6|8™X‘št„a*f%hÚvB4h"y¸ ™‡u ñŒ|ܵ¨ÂÖxúHU44õUqé(F’xhc’˜˜Óv±¸Ôƒ?ED<>Í,¸ªå©Çk“7º¹©Q‚,‚ZÓOPý©FxN¿å¹4.œ +&¶òšÄ©~¼Õñ#«ä?†22QCÿô,Þ"fĦT•‘—‹3\±™©¶·jK§J*˜RÄðRÔ_olÙü§8cW+È2-L‚ëž)…¥•¢Šrm’ŸÍ¬±K$=Š*TÐið$ê&\¿+øøÆrý=CÉCj°°.õõ2Ãá‚Ýdö­¼…&kÓ/’LÔ¶¦A>ò9öP"^¤&ñÇ.d'¯rÇÍ=ºu¬‚è%kHŒ„¡•’*Ïü©üæ÷#ëNÿZ>IEÆ&I:ÙLèü"–µŸò*ìéÂY¢g“GU0†1VÑ&[)w*LSbÃUtmkÉfåŽ(\ô¨÷Ccé FÈ©k#6£Úçd•£VMBuF c~I”ƒPÌOلø,dF” +V|Jˆ13Éô¹'U%Q*zxK…ÅårÝ3Râ-REˆépêR%®¡G§Ä)BDyW«^z&œ¶z׆¨=:Ä®zϸ¹êdW +0ai*kôS‹¨tõM`…7ä½B‚áĬñúÊUÓꂉVJl#ÞiÆq^Í35£Ž”¤v©äžÁg1fylk'mîó͹lÎ&õZ }fO„ÌYt'_Õý‘xR¹²5NâN†Ñ!ªÜ/‹hY­½Â5D¦è‘p%¸j^öå²)Ý— +qHž;Ež)ë%K¥±K8ÂA¤|´Î¨º ‰àû?1#çm Íún,¤Q°µðڈk©Ç.Ù¡˜è]K½¬zK¼ÇâWôãT?Š«Ó¹Å QZ&êK·«áHÐo¹ƒE#²yHE#ï«1+«S윮Óø٘ *‹gZk¸„)+G#²‘w¤"5ª‘ ’5—þ5“˜ãcj¿¢Œ£ªÖ8d  #’6”°²Pf_!\9d¤º*|Û°ì3”BL­§ÙžðÈlN.žõ¹z×q(Ï5ìÑîv^Ó¬DWt¤ä³Ï8MS÷ñ©d¯·AÁþcõÄüŒ °ìÄÒ%š«êñ0J¶`§È˼3‡Âá¡É¦É¼Ìp†ÉǪɆã0SþMj©Q˜<æo(ð›âg<'Š4YkQ!3ã*±?{ œÆó¹=*s5P.CA“›&ÔŠÃ2Àˆ²¸¡¢ñ×·k7¢C3l'^õ¤š{"¡(ŸWøt†Œ64(Ž9S ¶–QFapÄ£Hª:|Š¡‹'˜sª*ù!œUÍÓòk¤õ«Û…ñÅ;%¢:S!¯3&‚ý '£R¢fú†OIØGOÊ1;¹\QBUg<´©xˆÿG?j½™N•kÓè¡rêHC§Ÿ:vŒMG™˜ýÒ|›‰o‚cŽKçF Vȼn‰jHËaýJ,unjÖò­ÝmXd‘è«Bô¸j ]åÆl\rٌ-v§×=4y…´% ’ódÅ;""4¡‡ËE,“×åe+‚S43%7y2ác +b;% !1Qáç@5r(—?X§jÄW¤ÌUWÇ =Z ýž!ß%¦ð'´Ä*ËEåŽÐiÍr†Zó¹ÔäáÝEB†¤$v»‰­>Â3æÕUé5ä\(Bhþ*ú’Ju¦ +»È„Ifaÿxbí'oî2åR}áÝU£Ç-]Bc½pfÈC!މ_ êNńè§æêbž™jcä\ır+­­Պè×Ð{”O°.»¡Ÿ6(¨†ò±·Œ#j#µ4Š¢5B› +£ñK¦f¨$HëSúä&3c—F¢x.(v‹ÒŠ?¬ÙXAºEd#:©æ1Uªe‚RÖ3Ö«á +V9Ff" æHŸ‡ŒÏ6 ?ðd³|d¡äCo)Ìùß)‘ êBREH…¹>·½©‰.ôzE}ª2‰(³ Ïçf4C2†=ÅŸ¿‡Áiñ7µÈÉë„\º¯ª1œàW:½e3” //¥ê%üGÑ,t‘Š©w:…4C­ËĈ۵„iċ¢G.>{ʇÃ.úyü®Ùv;À,?Š›¸¤Õ[ÈÕàhÈB¦x%K­†ÞðSjEžçv£ˆ@”ËiU'Frné-k’ÿC5cª˜‰{Wñn…Hg-9Ïs¦!]ªA§•°D§‹µT™©gQYcÊAQ{£ŒQa|Ìäe +ܘ³’®rŠ>ª¥°ª•ãzT툔â¾L Ӌ¥³, N-þӅ^åq›ªV•‹H1“Ú¢#ÂáÆÖ'cH$>ɨµB}–EÚåR>¥”éÓX    +¥fì+N¡…"^!ÛȯZ5SŸú&…çiËAU¦1?ã êl4R¯Ê¼-!†’“°Z\p"mMíöLCÆ©Ú;dïʨê$È\ÀMbz2‡7Q!$Lá}£šã#"=ïûh°´;88U’rª²}ZóòÝGÍ絥鳁$jèèdR9%BŸP“5ŽÇˌ¿-·™p¬ªˆ9Ðíèd•'˜BE¬´¢¸:ÑPÂs–¡Gí09Lò–ß0AmpDÃ’cùó$nȪì¨Û~‚¸†Š*¡œ*tNH¼ýc6Ýãä"‰\*,ÖªˆWƯÚÛÊâC‹$=çNIY]¾H¨åN°Ÿ"¡LM…äX÷ˆ ¸U#êŒýÉ<äÇ(.®+¸ùæR¥Éڈ‘š†LW1©Re§ìV›U]"–!{èµSò-øFýºg8Qä Q#‹?æ +»‹‰r×Ö²r8dæBŽïԊiÌ8~ #Äß)Š” šI_]9\D¦OТ(Ðøž¯ÆFMÐ#Dhʖ⪺•6ùÃd E:ݽÓMHä†PøšªÕëj‘8Äx› +™>óÍá¢èÔSu÷Tâ죘%Èrê?¥:I§êúb¡˜™•ßzñR%‰—7ÑUP†NážM((^¥iSn°ÜLÑSu“‰4›Æÿ…x“i› +©–‰„\‰_¾ CîøµéNTq¶Pk±ŒFô*ïâpd±„:•c²ªÅN‰ +PX¤À#ª(TqcÊ@Qݨ±#£‰{²Á(ÕaÆééWCñôR"XUø +5šiXØE„q‘k!r¹D ¨Ùi>þI›Ý$ü\š#€p5Ë,*ý⤨g {\ª¡ªV9ä•ø} û”5|ˆ*Œ8Vóy}¢ "K”ÕFՊBU1jÌåEEšç{GÌ+"¥W¥¡õ_¥dZÓñ"Vñ +/Dbãج&e=ÇN®E®сJF¾™H艐xÃrFPˆŸÅ¥ ‰ “)ÌgÇ­¡c4c QJÃÎ=$SµIG‚\›+wVÁ¬›ÄD3ë—¢(C:­˜ðöŠHò=eIDÈè)ÛÊìE¯jUp€ +9jF>_ufpK– ÿeµMØü}DäYQ”šV‰Bj< Å MÃ$.“Ü/kÉ*?^Q¤[„”‡‰2I//ƒÈ—–ËäÖ[nÕn괜KAªœÐz«…ŒHqbAqÈ(îD‘(TBZÁ¦Ûsõ¼ÖgŠ‰©ró 2=ÊaӘ¼¢R¡à”%C"þ­`«¦%êjAf u…êFDŠ¢Ó¢Š&ºrY¥4D<§åª×T¤ &WÙ/æ3X7ß\FÄSWÌÔ©¦|E¸ÖÅ÷Ž*DS‘t¤$NäÐN)$Z +m©FHAê(--¨&ŽÆŒµëª1žjXI:¥FíÁ +¢¨çQ•)ú门~Ó%‚È.Eí&]Yb%¨JéTu(áƒdÂtÆø&ªg•jA±˜(Ò™·é&âIö$4" +©PÜjó =œ¹ËþÈþ>|§ŒÏÏÜ1Ú´Ë|ÄWl¸ éK“'DE(Ä<‰pVÆ$ØÎ&[œÐ/õjë{Â브Øx•ÊðÔ†‘ˆÒ!ꩱp3ÓKȏúYá±|׉U–ób"É!¿&òDBªŠõI,œŠà˜»>›ñ—Ö殸ˆ2!™ +‘†åºWl$Ô´4㹿ý=JFVdÃá8ȗ¹˜®ðPÎ1nDŽŽ!•A!/ïÓÏT +ïR!´zA‡XÄ·‹PP}¡ê#_Bð IN±pb6ÅMiÛûå—|òOLÄâ%•‡¨2²âÔï%ªvùM¤Þ?ǒH(T$gk~E –5cG˜y3l Ž»)C‡Ïñÿã¨Ãß̈́QC¥«_«„ErôZeÔyñY”ˆmU3#¿«Ûˆ‰(ÁANVD²Yüe´*×X®ÕÅ`I°¤“9ÜÅÿ.Νú%jZûjÜXÔ«Ž ·…Òù§È‘‰Pb©±5:‹‚LǘCE¬(餹¸cŠå[쌏C&HŒª…T‡§&& ò«oö 2]ȧíE™D㳤b +Ž‹¶±ÀHfhF¤ï¡»”š¨3'v$†Jy|!‡µ¯€4h›UXQ2wŠ55í„ +?cÇ>„[\Cä(G‚ä¢[Ph¶«›'µ/HTtÙÚðøšÜc8EN¸\0q»d¨ÝVSU!b¢ ôÑÛ}¸Gê[õ” q$ç¨xxPHB£ +ï#Q‰[¼[ÒNr̯*s M%×·§&fD™(hªÇ_šóå¾%aBÊ5’YEɉABú°dUì¥6‹&i+ÎîY,øRïG]4|,̖Ÿ×<È|É*ÞÇÐ^¸œôG ‰`ÌçëÒò¸µKc–‡dÑ!òÏÖkòÓ©û‹I§d"_ÓRâýË7pžv‚”Žì_èz:t*æsO:'jË´£ÐEKäS#Mú@®š)‹Aª–<Ÿô ¥ê—,ô„ÏÊ¡¬Ncäñ™_ô(§~yµ7ßpH„|….ªU$>‹¼h¦–¾ÐH,Dh/6*’®(*V|Ô@P¡Â²ÆA!ÏQœŒïrc„R!ª~o%q¨Q «¯QÔÂbJxt7뛙¹Œ‹D6]"Š“–+5¹¿Çë±õD~-ÑímP¸XÂ䧂„ E$š³6‘Ä73E–‰I !5Ä·­)Z}õ¢úÔû“ó‰¨ÐÑÔ°a»Cq’mØ=â“G¤ìš4DÚ³¦¿™³s ?»÷×ÐПàÓ-ám +—žcºn™0ëQt³‹N±2ûpDC—GHÙìî®ÝŠ²rI•ƒ% $ÑXǕÔtOM”å‹´|"-c"òÕ¡Ÿ˜Jé«OÐêýc<‘NÃ"E%DÒ¹¡Vq)¢²tÙ¥¦¤hª–«‰œ ÷¶zÈÿª°%Ò¯41#Ϭ"Eµ!ù-z;Ô’PõŠqoM]’Ôü&OÕ¦Z)²ý¢"Ô%Xa}mm§5UáÓ$¿5]µ*¼0¥‡”™Þgó˜P ’ § Ö쯢¿' +,ºÐË$/j¢ ’/5úy¾ +I„ß²Þ¨4Ï(Õ©L$)r+Õ“ @(ƳE +µ&—,$…‚8„ +!c ÀÀ4Á8˜ mÓÒçÄ¥ ¼Û1*).:}S×ÔLãi’Òäwâ2]¯ù±¦§‘ùš.Ó`ÆÍÔ¤1_w;-Ô¬ÆӂRâ:ÐM‹Ÿ§]½Mù¥Ê, þ³®ç‰B”ä³;ه;‘ +ݲ¹5ÖÖUhK³¸ÈÎ??±Ò-ä~«+W×ÿ?;°–D¦l~P¦õ ø™–öÛi•¶ów.<úí*÷LgŠ +pÈ$ÿšˆËv(m@ _šŒ'ùŽïÏ“$xìaí0=’¹Ïvœ½ÞqJˆÉãzJ£yïWa139<Úï¿Ï&iÚ-ràëLíXé]>Ú}“Ù]ÿ,½«v󧮫Zk» V *|.ڍeM—ïqú£bóÜy|úzé»ü‘é¯>—2wŽÎçƒCkxFHŸ¥tü" ß°Õájv™Ë+{(-AÀ€äž–fvaUøÜDi fÀ6ðB83åP¥„ó&ë´c€›£Sü8>…%34Í}Vàq†œHPcÃfW%[5ù ù²·O«K¼h1”vW¼_kØÑúÖ¬ ¬™ô›ƒ˜“ ºÃê0Þ¯x×Öè×ä‚êýA/k?V ™0£ág^´§®¥1!Å#Ø˃0%h3W0húd¬þ §ù¿æ.6žUÌþb Nâü™n†oD”›Ì@õ ¼g9±C3㇁Ž†ºªâ&µs³Äf(£ 5() +R~Êy*ðúQl-VT8-0 Q?÷»»àÆ÷üүϘžŽ†Õj¢}èÌNÓåÒz ˅¶ý:\vQ*p‘‹[6‹roF7dßOÑ™Ì=sºG+óÃæj×2K¤iÙÙ»˜ÊÅÔ*}ª¼oeî†MŽõü¿yRȬXZӞbè»$J½ÿªyßý—Ñ@pZ»¦:& I-8L¾I}žð¬3*–ƒ +ÕnRª²ö}Ó)Ìùý©ú5_§\¾ ß½9¥ŸÁñè*«i1.íá#ÿsžÎv5…m Méb†Ì$PHºÑú(~2ÙAY„ÛScáÕ¬ä#–…{eÿ<§§Gcâ¬hZTÆÊ­;i\,³‚qKÖÁÙê]‘˜8–Ž ©–5¾“]9@05]Y¢ËoÊê~=ÀK°}tÀz»OKRœ4_¸~=‘›NVً.v2:ì—9jFíËÊÕõiy0Q$›¦4Q‡C-÷љU¿‰:ç7mG¸W«Y z"é¢geq àSoáH¨õƯF¾üV¾G]L“7 ˆ†²J„Rõ°¨0¢]» +Ûò€òì˜ô!¤†ªÒ£§â¹îÿ²wrÂs‡k$æ,41e…öX,Ç9åûib6•Rës“Í/±‹³í@¨„à`¶›)îFL›ôOœ¹Ä°«”=ŽxäéŠpF˜äµD—ƒë;ôëÅË4æŽh8¥5-æÜ­]PŠÝ‚uä§{P;ƒÄÂàÐ#”ž"DÕ’¦9·J–Š•¨©ÔG €.CBÐX‚ø å»@+“ +ÂÌôú_ŠÕ 1ßL/HÞip ؓÒ^ˆ`/+æÍH’jhš¡VĬZUC¯T0”R«`ÿFŠÌ™sŸi«Oðâ5®s#‚ >=x¿ Û¶CIÖÎ{x‚%TŠ8Û)Ùàçe*¨ÓÇ®­§D\)¶ÏíVj/,[ä_ o~uüÚ1~)«7Sêëàv ùÊb»”Ù~ P憕íX²]—‘túÖKú2—{eT¡ÇññyxÚÂìN[ýqOT›>$Ú*¯•©~bœ¯jÁß³VÊùÝíԍ£×Øv¢Ëãû& xœgmÎåùf,ÒØhÿî!ۇìíSú¥„™mP0’%ž§èØZÕ°(a«¤ØÛ7z?M)5š¦µ`ôug…ÙžS,Š$ h½AT1³.nƒQkS•0}M'Xª4‰ƒÞ÷¡úœ +7SÑ>}¦b±r§/oÚ櫝TQ …× +Ä!¼û±ÝzÇIV&‚RªðM¹»àa;© —òqQ™Iið[,ÔplÕÍe5áò]â»øÓç)KN|hdé€|qß 9­òç<ƒsž‰ÐȈ´ê01»¢Ú¹ìÆ>eÒíÛFϜ´Á¨žØéÿ­©-Xbf½ÞjGÌM`Zzd!£“$]ok}‚¥¿ìúº>4œ=®ÄñÛÁ|-fšâjÑz¬°t¤1n)ŽßH>â ô–x­üÄ.0qS 0n¢Ó”i€™õ”z s!ìùÖ –· )bÙi ¿7ӛ‹ü{Ã+ÆuÖ,OèbKNŸ¿ÂGo€ª0ü^=ÝzGnx 96ݯ†^³oÏ¢wQÛ.M²N„¤ S1Õr‰Y´x®kDéeBSðÖ]ùŠåò…º|kð1?g6cpRˆùm·) é½e¦%›WàdS$>å¹ œÙ,–ž 9ë]ñ;!àý·Û>&Öã˜T)B—ë…. ùç_íçñy»»X>jU¯=1Kqê<,@ÇØ8c 85ÖTMõB?Éi²0i;"í`²]Ô +I +ɪ Õùn¶.w2ˆòC°{o¶‰Ò%Ü÷˜\ Ohñó}8nÎbuéø4B(Õk«M´ò €ärØk­Zœ7’<óIÆ%µ€\2Ý çÙbeÖ\›`bzówùÅ7]ŒQ¹.¨QâP•ÞUl&[ëºÛnVø—Ô46Ŋ²”kÈ&‰R7$Æ|ƒG¾ ÿOŸÁÁRRÇ0f¸°þÚWUõ:جAS«ñ û%U!~›åÎ!$(&"î:ÁZ`ÖCC¨ÇuVø 2vëèú¿p“Ž *îU¡éu¹AXT)hqÄ!3NF}h²]ß'´;*¼m+LhGþ™v̜€!˜Ì’Cßãß¾•$5FÕ …lŠ)‹Cc§Ž6?Š˜oäsȁv:€f˜¿@[òÙ¢È$÷¯rB&³ûR>[_ò]–vÄ=½)u‹rÚ·liŠ°‘s,˜k;õ +m¦l­T *\ÒW1¤ÙÏ©q^OF´ ¿"Ý%ùøhŸ&£W#Ī†I3ý¹þæòF‚ÊzÇSz÷í™0m'”@²›&^OjpâF n +–)|yb7ôêMÇøK 'È#ÇÊ‘g?¿€¥èÕqqõqZøÃ2íI  ÐŸ¥$jpv ¿ãWTÝ5Ûç¯K½ç­QWÚÍ¡êÑï´!FäÁ®_ +zõb®ÉA곩OîјžQåPÙó pMY·­F¬þ÷ò¦k Þ¸•Ò"»kZì:5=;2w ¦[E»*÷ÝH0(v½Ú»ÿ¨ FV½FÏ2¬%K A~ÄÔB0‰ˆ³ls’¾)‡À—_8œø‘]v{>%“aJîÜDç¿Y‡¨h’XŽý¶ž²¡îì1`û‘¹ ȀFќDcð¬F-N`‡öuÓ["§/3`-uÂxÌOë•ë¹yUBîZ6Ÿ¸)½jrDÌԀI¤”~ +®{Ñ|·/˛Pßsýi‚Þ”@PÒÚz´ewQJÞªQÞJå"DžÞ$ϞÚ^™€_s,Hõï½'$ېmè7Ø6™ÄUb;@³¡f8Âå™ÑYλ ½êâÿ~ˆýŸjpå V—eØsCPïÊ­‚՝>ñ¡¤ŒÔ¾¿´µÇ“é86é$ÑÙ$´“i Ž“ ¥Nô‹ýÐSÕÒ+¥,—ÞóŠâ«2(ùKþ‹²z|¼pw<‘‘î×úsµ‡õµèÅð0$­7¤)鬰{òªTc{ “Tò¼ëâI*p¦eü¼éÀÖw‰G +ŠÂaväl1ñZÀ+®L6XT A7lSŠŠ° ë{zÄø†ýdöAýW±©´œÙýÓ8¢¢£¼ÿH¶_E4Ï>[9¹7ð~³Î÷]‘ÓR6°žýÞÇ\7Šu£ð¥×‹¯©üÜA‰Ú²8Æ"j˒ÃǶªQdzÜôÎél«µcoC‚FŸ‰ûÇbŒ7EPñ-è·'FP$ÅcíÉ~¤y0‹EÞ\h:ôxL^ϕF(Ç©eÅצz]þ!®õN¯XMҋÒ»<}j¡âã(oë”Ó¹7©vk|š‰ i[Ώ¥$ú¾drñ#iæni£¬Z¨‚7ó»aWuÂ)A]Lý£Y*"¸tSGÃQ4í[bº½ÎEëdȉ¨É×UÔÁ:I @àKƒZ­džØ-.÷y×;ވE‘ËÒÅTæÕð,€—IšJQt¢»I|c‹Üô5J†ƒTn"v¢FJ’ôFoڂï…e/7š ÿ&0Z酀OÒ=­5±žÀр«¯™å‹vèªÛÊ ¹ú>ørõk„ýÑXŒ;TÁJP•ü¦w`!@…NÍ1 ÐTnð/ÿH)$…($ª´É{«OkÇ*Ñ{íîÇðêêrÜДsM.r´Vûq¬ÔàFßÁ럌J²6“‡A ٞœÜø÷“/2Gë|ì“X³!Y)gàO„Ð&¬DðŠ£|û­^ðJKՔºlÅMÆ·ô¬eÌ©WÈÞiß›eX`;ûÕ°±À0¡ÜJ×Üb¢Þº§-(;HwÂb>󦚪JeŠ>pq¨z‡Ž.>ú=I¾#^ÔÅ(ß½ŒÓ~o† ÝÌ-&8ù*N;)´“’(øDÛÕª2oê]* +©9+Oâpym<³•&ˆÙ{ÄPÖ¤`ü~Â"®)š–lÿšåãO†HÊ#³µçÊÃOCF`ÓÙvs¥Æ^ú¯F•Ÿ¡d¼•]±ßMéÌÙãL#¬S·Ÿ‚‰l +þ<êªü„®±9T¸Ö\6^ÅÏ Ä‡º¸Ü¶úqŒÇ{`Ç@ ªwŒî†ÌÆCKy2Ü* H²Ò°¼¾±yƒ>åÑî.nIaáošqõu|ÖhöˆŒ’E¸§‘t–4ßÙ {Rk!¦â²+%úGuÍÕq*Þ26°Â1sˆÏ®×[ƒÂ"¼ù<ïüÎÏ£é å ÅI ßsyfD¶Äe opëÎ2Žš+iÚd=¸êa¬Ã¦áÂLj¬»kæ*) …G¾«¸O2­ÄM‹¢ræfgµ_%§d7¡ïÿÆíÔ Ÿ“b«jS[by”|V²SE…ä…ˆiLUB7lêï$,µ•ÉA“³¬YFÝJŠÒ²¦ +)šö)だ“5øU§{Ò.Ägrß¹e Hq-¶5ðot«Êƒ!R<ÛZMÃï ¤„Kg¯!þwft•Ÿ2^j‚ÔüQá¬+õØC÷‚QÉÏÜ%r³#’Ӟ1ˆŒô£aÔ¾ß\T3µæ×2ýœ<²Wéûð0êÌiæù¬áDÐéo–s…TŽÝà Û¬<„Ñ÷5vŸ5qt«–ˆ€¤A yí¡÷DžS³W-kDÀì¢ò¿Ò(Šûì´‹e!‚Pö¡ï:½m$B&‘B\¯®s=m‰öi_Ýօɼ¨É ¿º5 +'~ Âä +m.¼$ &½{e†: \÷Hxg©¯§‰e}á¢Ä–Þƒ=#û®¬yhLÿ±aøW“fï|_žGè˜Ecâõwpu¨ÈØ^¬Ðºwx/i©MSåKZGSSBa¯àW“Ov¤kA¿¼¡¬ùήC%…ÙéåµÉà'«‘Ÿq·#ùþR1—•ŒLqؗÚ8³./A…KZS³šx†Ä +¿æM F`šÂ&}†®ûÖ¾sšÀÔøT?É¥w½öôYƒ‡4E®ÒDFÁ¸§O-[T\ µÖJ¬ +—o§#±(­²8Ç? õæ`2ÖҝU +t],Ø ¬U¿„ô€¼t¨Œ#¬ÞA…ç–<÷D”µ`óày˜säá_‰Üëå£Â9©íõ!“¶¯N«ꝛ¼Ñã›9¼3-‘#.-Hpœt(Ôh²÷*³›“å4Ç ŽÔj´¸-Š2h¨ív¿Â?Àž}R&\¹ÂI¿€Gëý%KÀU”ŒlAÞk‘Ž¾7͖$O8 +è»mó6Àœ=]æa ¡¬žæa@­§Õa2Ë]Ô¥_R¿,±Þo€˜jw..A“VŪÁþjŽÌ"ÛB$™œÖ—€¹š=¤„Ä­_œ’nBŠ)›jÄýL¾ärr¬Ic¨ª®&ý2яHÕ§ai–SCCîíäìÂGÓ«ÉÛiRØè‰ïQÛ&™ç˜Tà˙,À¶®åJô:Ž{ÔBÄÜ'£¢—þ„¨ZmD%¥ÀÊ@9Š±†šxJz‰D•çS‰<ÆxәÏFÙM‹Ÿ· kSýM¤Zl¾úÌb+Û½wk”é>©&*c^žœPaÄ‘`ÙMÌB+ +ì¿s˜à®°Pm9«T.yS…‰˜„Jë](·€3R¯o<š,6*£K­–*½®"#+BÌq[µ)çÙé*2XõåÅËÿ aÝG‘ûlè.Ñ9_y‘=¼ëZ65*„pAçq=w¾à›UýïÉÒո㨠6ÆMZíM‚/~ô˜Þ&¯)èßÍN›?ÝP»nïCû¨Öø+³‘ã®oyi‡‘jÿ’8bv‡Ô+¦`¡ ¬e¬YKÓá{úMT¯ùûr±kA‚|÷ß`Þ¥»I ÀS­–‚#ì¿\dœˆÕº#ã5LlɀAß)¢¦ÖÑ¡°²åm_ýèq 8Ð×óM«æ)[ ËÛÀy‹”ýGpÂ21…—°í="ƒvU6gSèÊXš¼Ù…P 0‹ž%!„f‚oÅßõb 8íÙt¡4+¦€¡Þ¾Øª¶ý° íËì>ºçÅ@7ZòI#uÏ Í1B–[6Ï d_Ѩ2r®J" ›j˜áïÀè w“7ß~‘€Ë²„ ÊD‡›ð2!Óe£Í}Ù¼Tæù[”Ð|_™C¡¨±j.ÆßbjÆ– ñÿniÚPÌPõ¼?ŒœùNW²z’uT„Ìh¾Í¿ ³ƒKú[¹v‡p‰ÿ Ti‘A,kYnæ:(•6¬e.¢ ~LFæ-(Ëà*4NñkQÁøǝ%Ñ5À¿HžÐ`‘Nnk/¿tÕ¤`8‘o°ð“ s é7b¿Te•‰±‚W=´äò¿ýŒèÉD¿Ï;Š#ªŽP‘££d뀗nÛ²_Ñ0êE±aœ!ĝ³À}O{F¹Q1ö{¥¦?©Å‹!²A4ÛXNr™è»Ú|ŸY<…Ó‰ Þg ¢#Ê–u>v០+r#y~)qe7ÈŽÁ«{dÔ _Lff`y£üÚÀÑx[{8ڥᜠƒ5 +‰R8uî¡_8r܂–‡ˆà§õ z½´·J𵐨ÄkˆI·©ç¤„‚¡ ÏDY÷ÆÜ×2ÒDÃVpÇ@Mûס3ë`eæ‚%VL» #Í\îŽö_ ƒì§y~VˆJ-qÏQfŖ€¢#f@ÝFUô)#ùÁC–।$Å{‚.¼Ö¥ÆK,‹V(ÎìŽå“B‰ÉÍɻ́¸µ4w“¬*0è($mP$XžŠò[²«9b]ÓØ$yϱŒ‡°ýJý ŽA§¨å~Àó4Æþ2Ja÷·Á o¿Ý_¹¡Ê€g ¯…#éU™ŒcYA¾3™éfpÛ:IëWÆÍüCšSxÇ¿? z5âT„(3Tƒá5ióÓϵ·®0¤wêšI|Õ7w¼.µ†ù‚xû.ôѐpUØ~Bfúi;”q›KûÜí°ŠŒDŝ?ñíÌ¿ñeV¿Ù«Àsùyõ†{¥ÄN~1ˆGø`Il‘ÐÇVU˜°dŠlm;h˜©¤X \ƐE}|h|p³¨jiº(!­–å.-ü»\¦Á Ø«y9êþø6¹¸ß{ K"n˜+ –Z »¦Ê¤†,˜°ŽT/hü\^‚D¿Ð¶¾`9€æ»|¿f^[oÝMåË5¼«rÒ±\l  hŠ'º"s$‡Þb®µz¬Á¯°Ð¢¶3E©²ÿ¾pÅ'˜œ-Kø.÷—šm|™G•‰°[žüþ462°‘ÏKr#´D€%è“âì\E?ñ=±¿¹]L«2ûO™†‘ýæ²%aov+•(ÛÝ+}×Òs¬›™KÍt¥v6†ˆgƒ¼a—ôFH7 +Tn>-% ÖI2Ð>HÆ© +¸;sÅ+‹¹Ü^IóÌÖ{ƒ+šöÚ̽}¤"µÜ»Þ¼òCƒ`GIàPÎ4§Â¹é–ι½ÅY}„iíª²€µÀZ³I.€ï¬¬`Õ{ Œè€,қ¯d«º«zа$ªKÈ©½pØ¿Ö®Dìèpƒ;õ>°Åˆü¥…Á¸w‹hÆX¢Ù±e’šdƒ%ŠµÜ5¯²þɐ³Å ša´ Ëç.e÷0‚ÑÒíêß&«Sq¬ŽÓ4ÊsvIQÁ8ސ9hXϦ +IqµÈ  Ü!ü¨!#©ö?,^•I¬ä~Œ»=×+’½Ti Æx襚2|ñÖ6¦£)×yRDðøO`è0±®Ð ¥ó,öw`%såÚgÃGC&›jlððuÂz:¾Š£®šM­HJ¼´L†àgÚø›÷–ÖêjCyÚͱÐ2#@걚‡òÃíKjÈJ„›ˆxõÑÔ#\·µÂÕiæ+š½&ç«âÄè\ .×kC´Ðw®þ©Dì5§§ÂWª ;äœ›Ü ‡¤üšJ8 :°Ýc@±¯=†” ^q? +·ê˜vր1 +(W4³ñ¶øZ-—E:Æúuç$ÏWâM}íAgšÒ|•q¨Bã§4bùÐÀ¡¾ E±é4'½äTh95„@g¼­Ë!›î}‘‹TWH^¢@‰'ªµîþ³±¯V½0à~î`|#A¥”×& :ÿ%diYƒµ8ý#øB¹‡Zs S6d€%dHT_Y)klñ¨á>ŠBøÀ*ƒÑ¥)„à°ãI +™rÛ¾%<ÝÑ*"òü˜u§éPîìl™Æ“™ÁÕ«5ªüayé JwNðÒJ'`½¬±Ö›ÆNž+v,.¥¦ØËÄ Ø ¬óñͲ»õp¥`á\$sÁÏ5%D4ŴIOÕ´mǂRp‘Ï÷U¦—ÏáVVb¼ùî!„½«KҜQú5m7F±»Õ [v&Øy’W˜¾À.C +PÔ*ðc¡ÐY5¼?s–$.¸E*S‰'{( ¨àÛD‰\ëq·6¦ÕE•+…aŠì†  ˆr¾@îÅ?"%Î,<@ʆ..ô‚nóã$äi¯øÅЈÒÚ½µCÔÛ>Š†>S»?)¹±>Î^`%šž…NP…<êDi©<¼%Ë40uý‹Ù9sL¿›@Ldœš‹)éS[’6\¯]6bî_>4&åKØÒٷІ™KË&„æ…C9‹,ƒ"íø´Fñá¬Xғ©­Â‹Ð|Ý$8>ôiQ'¬¯€|åñ>{R{9’g›§ê\ò†q(‘b"ü QdÉÊvSM1ˆ,ߒåU|T‹Œò çÍ×6é:›Äß@o¨á%ä.€[ºáû|v¤Iy—X«žn‚·Mê®ØR¤h/ÁeÚú'ä•8ö:[•î‹D²MŒ)¾Já¸Zþ(f&daZ (ɺŠŸTR©øÐÆÑ8HPÀT¹¼JÌʤEf 1"HcP´m vuÉâI—{W}gVH‡:÷…ØOãNáß&2øÊ$Ò鮩‘4ÈÇ-& ˵ZfšÒÐ)çžAÓKƒ#ªm­¿æÀ;èÜí î<G3éøÄÒ·?F½;¡¯“—½Þuò׻˕z°¾{­"Ȗ š»ýJó¦ ë”ø2µý\">dxCFhe…$Η‰Àg< +ëÈQþ=Q¼ùP¥Ðì€$1G­t1ݽÐî‚ãV¼Ê¯˜òPo;9œ¢]¨ +źôe¨åÆ7„¥[ËKªEs®Åøm +šÌ&êK¹»+܃÷­Ô¥ÐãXœ +RÙþ î좇b¯sÇé·Ogýâ³ÚSŒSY»ün:£»Ê_å±EŠQA?h­ú@㑜X]Ù .>ËÒÿ¿Ü¸…ÖZŽgtýÔ$œ‘|ºu<îs ŸS¸TOü®ü±ŸO@¦!” ¸gAÃúê<9ÿ=ðäöÇýI ׸XH‰8Ô–)¶Å¯s§a›~òä]ÿ¹³“‚éÌÝ:H©¹0á„Ð<+_ÃlYõðÐû¥5‡Ü-êå‘XL\@Š¬w·¹ž^ö–²À•ƒWÆ6fwâ.–K6ñՎÏažbŸó¾T¶£Ôï+?âóÒú‡&è +ÃتƒÆ¿Â¡ZŠŒžò}£Ê:p VÞTͺŸ˜äô?ô¼œÑ¥ÀàQ¶ÊÌV Ý)}Ð)îW§îã-+! zÁ¥3Aq…TU†Üœ¦.(Ë% +¿z¯¦ãÇï*]K+‰¤È<òêH0ÄApó¹lp-ÉÜ1mt[þ:ϛTÚ°.oÏbþM&£€ ="(Ôÿ¨MòÞ0²G§˜p=_"@Gæa +ƒS©¹ƒMgÙw­#Õ‡ó‹’ªC1¦ˆ[9XŸ Œíe¯$s6dá—A¸ Í"í5ò)_Ã?5ÊB C•KDŒ@ÂncKpŒ6³!ŠiFzóç  ¬•ð»»aÈi&;+Éð²oùÀÔ!Òí²ùö!¨£Ü̖ ʲ‘®Sów`s= ¹RÓøþ§aí|7æ™ÓºÖN–ïzø5Yk!Yèj°‹CLtûêၣ½OèyèP° +‹q{¯ö¸É¶'%ýxã\1'¦E\Ü&pš/CaŽË°-¤MAE¼¡y¶-G÷Õ«éŽÅ„{›õzƒ|˜yA•?ö™)ЂV^l¥¤;¸÷Jß4ÅÄÆFZ)ÔöØF0CҖ—2OÚÀX̃Ɋl7öè™2RKôû ÆÃ?·i Dۙmە¢…2yäzUÂùyí>´°ˆÄ{ðMÃ¥h_õõÔA èZ=ïZ‘$xdr:Uö÷šŠ£¶C¼a>Ç%æ¸ïÇŽ'*–û, ˜¶wõ(éýã¾,‰*Sê”0fnN D8„À€Õß[هˆ„-&@û4»‘(ÖTÜ9^s߆®u«”/q‘?'Ü¥ÕÊA¼hcÔùB\Ðý9‰y*Œ »F°qly+)‡t­T{Ëä-´M¦d×BBéÐ +Û¢Ë1"ôÕ$é5 ¦ÓH Õ^ÜÓÊ:Ž~bûÖYÕ97ªDwƒ„)h_Y*-Ü‚Ùä䑧NŽ -7ÉrI®Ì ªŒV@ؚˆèG%BÑñr¡ªjÆçú 8‰µî²H´eŒàþÖb߸{Æ>o–·hÑ'Øeøó1QyóQߝž<3Üh¬t.ÁÈô€dLT2C¬*qT”,ÖÉ)oR9-1CSˆž'FèD ˆNÒÁ’€mé¢a¸Ûz'Ä] +ÿ~K\Uö­^C©–»y6R¶G¤4ÝóÈ+– K.M&" ‚îŸõ€ì³(€Ñƒ¨ž¬/roÞgÕ4¸)ˆTô’b¡Pd×ߓ®“§Sì÷K~½=ðp6³ÈÈDŒ€i‚êôãòrfïȏ'vE@+­©±?j0plû¸zÃV×ÊÂÔK™X‡Lï­mX³hqžÕ°ˆs2Á¢&ŽÃ`¦CQ©OÅ*ÝÓå¤r¿ôΓ'ÐgŽ%ý8—Ùdï^Éjò†ÜÒù ¶F}yæy=ý 4ü;t͛0]Ú(W§$€º~.4Û|̈…ü#"ì&¯$Ð4¯EÙ°/{¿ç Dîàêr¿/wþ’ B*)yÔrØ*=.ø{ÉÄ Âi,ô5íöà‰*Ü4pªÌhmØÈvK ‘§öÑ5=¿o”ö¥†Aqt"v;[zü&²iAcl²ŒÚÙªÄÔI¬ +ÐN™œˆ;)“҆Ê%ísµX7ø€aï†ášÇú²ªÁ†à O4:{Ð7œìß ßÅ+ˆ»1¤as–¦CádôoÝEqÒdÏpxl­ªà$½Z„œÏï|Ì.RÜËvǤA{°¸¸ØhÛ¼_Ú)0Á:®Ä |²C(€ÂFh4ÝÍH=ÑæO^‡q¹Þ+0™-j Ñ9Š¶õ^ !žÁ/rª-~2÷Ì(ƒ]eá_€ÛößÐtêÕN‡fè9›’háÉÊgî„çk=i³»_ÉP…šçjh€¼ ý&@:Ђİ [h ‚ ¡ U¨x¬³¾N_pzvû­Ç©æBwRëGk우¦äl°ò‘àùéâêžoÝÖçïÿyNæêB¢¸Z˜ãЦt¾ƒ£{$“‡•.ÉÅ¡+vX¥ˆþ³;½d^Å]Ž•º@'-(¼’Ùœ +'a>Éѱ¿4WÜ¥–«à´—°Ï=>3]y¹„ù§Jì£/Ò Ûâó,ì’B?ÏS"Ôc®ýkZž@dþÒ[£lùæ»BÑñ˜ßñ$3M+¤¹¬®(-¸¬zŒüãݎ¸¾$"¨}KÊB‡"*BV^=*aTÐ?d¹`⪌¹šG蘼 Æp$&n¸Â奂`ÿ ßýžH>^Jà$,wjå1F—àaŽ÷,ôw›O–y‘.r†´E^ckÏÔ¹é.§Åò?ÍáàUâGÜõ›¸ ­ä±¦úWQ qå)‚žäLsaò¤³\Fü©ˆK“qÐb‹|!ÚãI6gC|ðS ÌviŒ^o4Wä€õæ݁«R­hǹòËIlj™œwÑ~8í¶xH‘(ËÊK`â¼<»áØó 5YBÅçRÇÁ=# +/7K§Û3n†9Ǭ×xÆÎév«”ÓàdóëŒ×Åä%þ`Qùêç>¥³¬ +ÿO¥4Q?å(÷‘«ûÌÈh焤d* ]ˆÖB…ÿ™à#r&@~Áç–×AÊìOö9ɺë"|w^ÙMg3‹šÌÄûoº”=[þ1¤“Ï0Nüpü$²êÜy¨®Î/ö[QÌw• ­@Ò!gí!î +áù‹’Ñ>ŠƒH,Z¸Á/6¡´8›nÅQÏðöâGh6U<¢„õžEs¯Ñú3ëè½ëŽðϽO0®vljÞv':ýÿÃ`'Ò§ï ÉÁ:Bi3ìS ˆ\0ƒé~˜ŠeŒ½/z˜ÿ +![²o +¡¸(µ"Pš›¬àœ G€hs,gÔZð•«9=X³÷e¯SÌ÷‡òØz£‰Nð>ƒèãڏ~Ç48v<ȵ† +#±©øv<‹(XõQì{ –P®'ÕO)N}AÀ"f1Ú݉ÿ™š +ìé*ÙÍpÚcyÔ'¤@¼½ÂPÜ( “ô”öȵx¿eÏA+la Íóàá£tãᢚ‘Ÿ¸ne¼f $9{´´ ÚUo6¥±û«|÷á8í„Z’"k »“G$¦ûÈ¡sÏí P什Í<¾ Vi7»'y`ðQëEаN VÅïi¹I) *³Ó–uà"©’˜xÏ`N)Ïbiêó-Z +ÊÛtýEv¢É9r4üa÷q†/üÞx$¨ø$PmzŸ„¤ç¹;ƜWöY'­Û`sê‰mÜå_,iy-´¦#:{£Ãxiã_0À=m˜§Eàïø3x*G¦næAmTU¨O*“ÔÁ!—ЬPáªqKÔ\`Xp .xãøú¦J+JuƒG6J9Ó«û7~`æ=×f¼¬H·£3H•×W<(¡2ó¶Þ ¦~'f‡Ìµøe’M¡Ãýh¿¼+cXþ»ÉÀ×ãºäº<ÝÜ=ú%t‚~·*š*þ™&åYbÝ8Ÿ»¡âN•×HGn`$” mrê™·øL^v¨Æ.™ºgŠ‚Þu]3C…2Üb½@Èl8ª9kDfAŒW¼Ä"8ãâ ÐÊk[á Y‘ gāu’ÕÑӀÞr%F»ÁDà­gQxF“c—–™=†aXeHÑ&-v?Nw¬©ë¯°ê  ÀëHÓÄ~íá zÉhÙÌ7NNŒŠMÂ9䗞~×Xÿm)r´ÉýoÆ¥s¡«tnyØ‘ +eXXq~y‘;µ7 +„àe­ÖÒ3‘¯ÃÁ<ég†ÔÏ%¤Lê¾&ÁK{ß­Mð¨‡r6í¸{4Ç¡.vŽùWD"óR¯·4?¦& IM' ´¦èOM#÷ŽlëC]ëá46MœÚ pƒañÇÿè¾±#ï[]Ô-€-£Äîê±ns™3O6vk¥¸H žÑ’ãÆ©‚eڜ£)ž&iy—îêt»³Kغ,Ô&P(è”)îʝæèb>{ðР¬£Õzƒ-Ôßs +½gˬy ªMvŽÊþ",ã(‡yÇô']F¼ SÎ ÷‚r& +õðHãLŸ.¹L¹šqÆC¸ìã}Z: áöŠžÎnPeî°à‹(dªWÝiÑù×n%ܳF#> кٖ®µÄëþÂvwZ¸pVü*ìW-n£8òИ©\úzMØ"´¡zÎ6%OiŠG2Ì`Vò"¦Z®…å$`SøŠî«'ñ –ØT™ôü%³?‘ø¨–?óQ²âX5ˆùXÚÿïÃ'%–×ùŒºùUûkº]LžUhw’ó79Kˆi‘ŸÅÚésÔ¥³¥1€lÏm µáåK¡lsö`eáv]_\=îÉCïi¤uçqœ˜,Ɛy³±c +s9å‡J<`ð—eáÎüc;¯“鰁¿"”Ùd-ç³FØ&©Ïä° 4Ú|ê®Fç×=ë«DÒ>\ê ¸h¡ XiÖ¯å'éàåšBnÏÙä¦î-¦ÑÆw =(@fB `2Õ‡I"½Ìy\¬`ÑüCÚÔ*òwÛÓVDãV*1ß}mt¨Œ3¢ä–„‘œzˆýüà1‰Ò§ö Â3»ŠíTçž}€M~]6½ÑDrRßÕr÷|ÿÔåôêvÚXhUů9÷úV,›A“©Z4-öd *"ìؐ;³1‰AÆ°‘)m÷Qљ;”–.œ`I.ÃN󝷔l7Dû¥á{Š@'¸s!\àõ9ö­ zf^K™UË©ñË¡  Ÿs–A‡S¡e[öc„ëO0ˆõ~Ò Âe>;´8¢˜ ßâB¼º#4kh&Ò¿†WF×ßVÈn·ì?ƒ¥D X:vŒ,õ[1¿Üåêay›wî'ÓeQÇj%µÃ¹X@7¾Ø:9¢E'”N%I×ð,`ŸS$=6E’Ó&ù¹z J…òÐ>ËL¯cÊњšÌáá"dâ/˜*ùlšÁùû–øðdÑ©T'¥N'Ár%¦9l*ãcêå¿Ÿ÷Û@\e €ÀvÌZCGƒŸ7²$!WŽ²ƒ9@uZ2kÈyø“´oGÍø[¡ n<":ˆ„]DţЁ€^þ‹$v–÷SɋŠÌФ.á|ßhAÓÓóÁ¿ðΒ‹¹Ë²ç€E‘öÎäI¶€äò¼w‹¿½7”Z—i•D†onÂwÔ½-¯–ÏB>±’t%7–Ó ¢ˆÚ u0ÃR’ÁFXËÂÁ‚©ƒèˆL¿ó +àQI‰å<ߧˆÙ 7SmÈlÔMòt!³§ª÷˜ÆÅSòY™ññނ1-Ø´c“GH²ÒdþÁûӕE^®‡€’ O4\O¸|E\øƒï ZÌ„B4š–饌=Cã;cç×ÉbvŒ)É-ÚߜE«Ö +ÃQPjDl#֊¯sBÞH– Í¢»â«šòm ‚»béfˆÆUJÓPÀ +âÙۑmÌÈv˜ænºÞ PoàؤxtœvZ)ô¿J4ãˆ7_µ‡N˜!¦Çóï0t|7•†ø¢4H˯ +I‚\¶é"H… +;D%v&Û +“©}±•´À £×-\봂N¥ïõPìù±kOJ’itè®wÛó#xÒ®C"©“ô,¨2ÜEž•£0€g.nµŸÒÄ`@ ì“ÅS—M4ÒjÌJ¿S#Çc†AÞ¨¯Šö€Á¦Å¨cnOH™Žg÷žúõÆD¨Æ-–…¿Öuø¦c˜S+Õïþ‚¥ŒfÊ+§ÒáÛ-³¶Ó0ú¸^"â4Ñ|à UÛ -Òäµà Ê~wÇAp'°3æ ëÉç”fF€S˜V^,sÝGWêa#u¢ƒY±Cs8ÁN"Lˆ7§Gm—Êg|ƒ¥î†s܃åaÍßâÝù‰‰q˜aŠC^YBs˦×[.|kRü Ċ!¡0Ä\¦>-+uT“Ï5TZÊ´yKÄuÏSvŠF·@Ÿ·Áîs…Óòü؟ñIkç¤Ê Ý KÙË[‹×%¨† +btFêàL× ð-hoœ[燄.PY­-…ÓëhH_8Q©7õH û¸áÁÞˋÊ,/–àړáw>ÿ½ªâÌþ{Ã%֏,>ŠÖû”•Unû4ïKçzžÚÛõ6ŸæØͪ´ ëT@‹”cMÎÝ`,“sxþLpÁs¤=ú_€#šn]ü¦¼d…²‡‹÷I¸l Œ&h?²lK›sºîü ÎòFAƒÑ6¡”Õà*¾ŸLøšÏÁª×w4ªQxZ䦎‡AöA«ˆ©Ð÷†-%ÉʚD§”aQR¸ yrX*‹«8†»)GНë“N!ü0R p ïtIå® ¥¡IoORÉûŠ\d%íϟ’ŠÂj=oPÉǃèWX¦^0͐¼éÆ[9+ äŠMîĺ¢k ¡ ôó´Üh7«úáoF*î:åoÓs¥{½(œ«ŒÞ}>“9 ´4°=÷â^¢%<)C"Ä逹tϲ½@­ìMf„¼ŠÚ¬§½É©à÷‰×ï^#*·ÓÞA¥Qyë%}’H'=£tȨY{©‚P,³wROuŌ¯*g(zAcƒ ÄëžOß î«5þQY¿3qY¥*s-¥¬©,}9óìƒ +SR<©ß´@<à¬X)ß]p–ù5#Áɬ_ÍÝ¡ÆF©4ËA—UfÓâ”u°)A4úÙÒç#·K} ØÌ©ðE)ˆqMžèÉaµTæ«%ó#Æ]ù»|¤ˆH[¢œ%zHÙçVV#FX‹¡8!#òq֖¨ ;`.µ´û†„†‚©hàçùÜJ©müÒÆ!ˆ½AÏAD@ÆXµEBàDåfû´¾kpVt0r×`¼±1ËGÒ1\ ä×Ö!X' +‚É+¥r“"(Þ”¡Ë-’ÌÚÑSh¯Ïڜ„I†ù€Ú›6 Q{aÈ0¿.Lú„HôÛd0c¤$å&ØtôW²G¦˜£F!¢x’ø‚ +pÂ-®¸Ù-SП?¯•­¢0I¦•”7«7]P`äByȝvv?†Ë”ˁ96™¦µ1°ú%ڌ‘©’I>’²Ñ;ücBsğâ$Y#×OµØÙ ¯™íÛM+¥²·1÷Š/-èQ[–%@Ì5Â÷#åÕ>1_¢ ’B‚Ꮤ¢š¹ãSX´:"5+Á;Š4lví¼xį́fµ%mÎGû·> Âlô±–’å”'¡Õ$Œ´'‰õÁõÆÜX¸½R¡{]Y›P9ow@¸{~_»éÖJH‰ì¼`8ð²âBq­~{‹ +<»†Xš‚ËÖl°Ø¾8sæÏÃÒ~‘ÐÜ´ƒ’µ¶ +ß .|fåߔÃÄǵ{!‘M¯2F´1RÒ8È ¢$´8Yc?ëÕIQÕ/ó‘jµ'4úš“>q–ÆÔb¿e]4Ò-lÿ=nyI.'ÉUÁhR G¦›Ì°bQ‰IŒ1zÉ,¤"šƒbTS,”÷Ô>WE6šŽes5ÍÍN§%×ÇÙ¸}…èÑÓÄÈ}Ãiðí+Î e€¢¬ÒXúÁ&;* ]ó¸Ã#>^TãµÔã[ó%ö³·ªE^[{Ê1ªËYªDÏ}¨8j†ñà§ÛºEõ½êÛÇZóÊ×2áT­‰Õ<®‚eX5»uEz$€8‡dGÊ 3ŠéÈÙІwŒ²ïvfOÕ_ˆ¬ñ/´™ïW'%&8JÉȨ­#nùÀx·ä‚iõR ¹2–ê¡ö`½‹ 4‹Í •d,+¶ó`Uÿò +ù3M§ÊEÑdä©* '(;‘ђݐ#z›.¢¤4>¶àºQUO3ŽÅ9&IYuЙ2†]eñÊםM~°](Ž]ŸF–¼ƒô&E¬z«P 7úâÐ@\„鞶y+Ö F|˦Z!6•°ý?ØDÝÐʑDȏÐ|§E4ýeè“l ÿø,:3¨–ÀIE <ÇÞ ®tÛt’|[ u¿ËòÃ'¡µëµúÃù„ €•°/å%~°Ïô ýžÞ.à_m$óÔ­ÅáîüÚHkwÃN¢Éá6V– A°$~a¸‚‘¡ Ó}€@s hê1ÙøP+‡ŠÜcÐSŒâŠ‘l—¨Ñm̤ {[Ï åiǍ$P§ <€KAØ£Q§EÞiy‘¡IЮèä‘ÂJè#˜fΊŠP öo˜Zf^+®Ø1¼pš w5þ&¹ö›>‘ÜšŸÀ4_´(ÀԞ,jø ™7W’­‰Ií“O’”z9{•ÄD{ZàaJ–ñcݏ3¥8—ž¥yT$·jNӛ_ÓU¿Êw6¸åÝ°€2É 'qKïѤ¥ñ°\Àfõy™` ’æ×ÄM µøÀG‰ÄºžJ¼=•¹’ß{鿕öo-ònŠ>ü.Ù*Ф†›emPãZ:éúÈg<`cC~Jh[WƒW/çéʗcJ씂­OÊ?dŒ|oø۔º ž™ rnÁ§LºUi- D=Û={TtdL |jœŒ¾ ß3ÞæMõç³±§iˆ?¥¶eáÐwIVËú}t*S^”ᘐ…ö*]…JCÚIôÝ Z­)±[Å^¬áMÌùݟ!¸¸ žhǘZ}Ô¸¥Ï)ÕÀŠ_ (ËêBŸä½½Fq`8¦: ®ˆ5ã€Ë‘]-lÚËÔŠSüöÛcJörbµE+ÀH%ø.Cn£d”áÁVàoþCO=Ý X.Ñ!ëÈÆk>ˆù@lðjM׫g“3M`éöZÌ}V0±ÙÒq«n…ý4 Lº@”¾)è³÷eï´S –È9âUEâó•¹[ Ž!S£À«ÏԖôW8µÁæI@A[ÛÒ­tt¿™Œ¤Œ/dFiõ‰±)]õ픆NTÙgîT¯‡WrcaèÚ±'lÿÞUªT{Š½ÉŠ8òd²­&ÉÍÚÒàóI™§ÔmºÑXxÛÇÙòÀ »#*áoÒĨ1Åq&K-÷ß¡E¼sò(ßɃ¨IPd†2%̃3õMY„ڳ߬<â§(<Š‚4¸«OYb8葐pòZgä¼<–x#˲ƒþâj÷Le:½YÖ°—QÕd-·àqD´-%E" ÑϪ +/¤f©¥4³¥Šøƒ7)nYDRԎ‹>·Š’ºÉ’±†”­\%õ$?#2†xj@“Z9¸¥m¨p4r »‚¬)ô²áôÄoTëŽÆՕ,ôßK&˜;}˜.‰S©1wÂχôÌÚ"¿êÐЦA÷Vìô›*›¤ÚµÈƒ+Er)“B}fê¬8káD,ã—PÌGíh@n0'¬46* ¡ ,#Úë»ÔJèÓÜpɇází]Þ½$km'N©7ðoso®à‡þd`Ç=Tã’tðº„ð‚4 ¹šãîT÷´X²(W"nkV£—ËHȓiv%m|Ý÷)5ã=—C˜GЩȏ!Û`¸‘L³mwUy.còû)$S5ÆõÀjâ-Z]ŒÝÖ“Ý!öû™Á-¯wØ¡[B-3–R”ðŠôª÷£Ȃ½01Ðí0fóÎLHÔá±ÓèLßÊ¥³³ãE'ƒoò0tøgV.K&:€Ä ÕSñ.–=B¶ÛðÊx¹òÚÂøÅ¸ë„ XRhx1+ XF3ëÌßá÷…!~($ÜfUtC‚!Y>NÈV%2°L£3„€OÔã*rlڈ‘†¹ԃ¡x_PÐyƾQ:§ +N‹ ¥(+Ü&ôa@D>Crl3O³¾lž…ƒW™kÚ´z$ƒ4ü§B›:ýdœPýX·HZåƒK]ÚlÑ"st©ÿe+‹&ßÀ–ŽÐ—ñ¢ÜháIL/É âÖ;ŒdæõÁT¶KÐéT?ðÛB$‡§õÖÅ}]ÆÐÀ5$\ážs¶u-²<²Žj›2ț}fÍbX·ÕÛÌîè(TìµN¾a¢Õ÷B›è”`SX¤Í|ôòe¢9 aDm>Û+Õ"d¤åÊHb0&Õ'Vè}9Ð÷’E\ËÜàØvñ)ÖC¬_"ô'Ë(£XºU~Å2‚1ëʔרôº¨‘™Ôæ´'«)ù”)?yœjþÉk¹d¨ªP]Ÿ£¯l)L{Ž´ +-¤ûŒåc­š ̦â®D;"^~3™è;g$%‹§—L¬T¡B±È£Ly¢;¾iº”n`º +/Nê·ªî,)‚¯Pª%H¶ÞWR­òUÛÚ¾!–jIlÓxšL†R×Xj7þÆsroñ–>HG`ÜGˆîŒ$œ(AJ&€Þ÷î ‹iÃc»¯*®iì)L–:Ö?'‰ÌÆãÏA+=ÞЬÒüL¾_k`îÚ¨æ?„5h%TR¡û¦ðl±_Ú^q­[0c§jϋìZ&PñZ°ýÓ¥‹’¹®LclÜçÑ萮ɞ‰ú"'ëÈߎ^Š;ù¬]uoZðÀŸŸöe©®…–®½p½íZZÀNr+*n•Úœ… §'Hûšû{eÄ0“›ë.)?æÒŽ•C¹y´*wÁ¼ÐqÃÎ:‹tì  äùè+B;x«àù¶÷—ª_“ R2Ø vãT˜RԟÒ™•N«° +’^÷‹SîSÈI¶¾Ø™x&âÈ)uM°"»õ>¸ök\étC,÷)ó‡pf&¹°7CØ¿øW )Ô+Â÷âÓ4ª9+@¤-y’s_'9: ¼×rÑáˆD_欑Å!y%bRξXoçÔ©BÃ¥¿I?ªVb®Ø´ì}xÓÏtÛ8e²õØ~ S‹Ãp°ñäPî˜ÉVS³Nÿ6Ô¨ßeY£œÇÃgž.‘C¯ ÚO_4ø÷ÑKbùړ|vIMöFÏUΕsÔ|‘X\ž3¶ÍâÁ6œµìN‰À¼ÀJ§Í¦`…œ‰0p¬ý4HqœéLÏ7< +J9â‚gà +ýqyÉÿen’›•Ýuf¦ÀŒ42A¿r9åÞ#–9i^üh€a3´§Ûày?KLýÎ~MìñÜ†Ud3=LÿÕÎÜÍQ¯’!G}ó) ¬v¾]¡¡nûN0V±#mLÒĆZ‰’´y0éÙ&ý*?š&^–T°GïÒÅYm-ñdrC¶tí’LªŒ¯ov.øh–W“j[8ˆ0`È× Å{4û#øH2€Á»º]œ•:½ÙêL ª?§Õúð¬ÝtÓ9i£5`…$½ó³yåv“xà󙯀 F¨K'þ\/[å£MVMÚù5Ó/חv¬ï»£P=U²Ÿó”L1Ùæn™ÄÜ3ÿï“eҗJPâ¶AÛR ˆçoþÀìsîVÏ2~雒ú.©8ïùw\´o)îšI‡øæïŽL£¹þ¦/t µ*<"˜ÊmÞF>oùF8 ›ñ ôϱÁ©¶a•uõ0î(IIZÊ5сŠo@¡Sji#DžuäÒ¹êH¤Ê$HK7KPØc|K#äÑ=Ýzï"2QbSmy˜º X?ËZ<Ë¿+ ôz|âÉ³¦~–+0½0U.‘wÑf³– u:Bèòd×ù~Z7ÿ’ \¿T8¹û¥åNśÚÄ÷Pk–—ž’°rѕ6™.e˜a¥ÿ 2Øíi›²åQÑYËë8JöÏäÕ¿uF!Þ5¢½ µäAʓˆú'K軡ëþ\pJ°RC3¾ ¢Qï"¢mêW¥Î”µC´Xe†•G®ÒnݹÉŸ7ÿÆ׎Œ”k¢”ªUá7M©…W=‘œª†“Í¥¿3ÄÌû?=M®<ô…SÀIa‚%)Nè ÍÞQRWŒz;ÆT­)§X±”½©U<¤BÖYô±(9ëUä̙ü½ñ’™AQCyϱû2úÙáÆáâ@Û¾B¯±e¦ jâñô@t¶C‚U1DÍÛ51Lª?¶ùkB(ÛPÉÂ&š4`÷5%d†04:i5ƒ©3ñ[Ÿ&gµ¬¦Ø‘$YŸ}ÝÀhè_KدI n”,kÑ!¨Éë<ŒŽP4 [U]Mµ.ý]-öï£øfºÊŽÃYՈŒ6¤ +\´iV8 Ž‘/ÎE÷9 "*2'wæC‹ÛJós®Ž&^5“Ž¢ÜH1Œ,›Ó¦F’ÖNѧÏÒ®˜Ihû|øì‘S°M°\‰µ£O±Çb @·N;bVß"üq’>"otõÂ&€ÌRk§70\Uÿs'fÊX͖>ÐÞ±â¥]zù¿¤/º»L“±•¨$Ú¿ÿQ”QfPÐJ„„¯÷oŒÌ,ò¨ÍŸ³{„–Ln+çÃr㙕~QiS3RÿÑR' å¥XY¶„V {Ƈ’¡ã‡a–®‹S^’FÂý¢¢ï~ˆ€àïI}Ãí¸4ópuå¹Pµ’[ú¢°~/uŒ û$ouÕ< +‘=Ϥðͱi´øSsu @Ž¿]j-ú5I 4Åòè(G0<‡"IÆ%X-U4) +€¤ó*a·Í49"–]©H«J¯?>r禊'Ó$6àA¡;W—Úø.@ÄÔx™’Uæû­Ýöq¹IS‹Z•ò —ñ™|ÕX¼ÆIá²ËtÍÑ}O–!\wÔ-£ñáǶäØqo nû¶ÎÙû›‡”007-ž‰ƒ’¸ýÔ_ì–¸P;R +Y6Î>-µS‚+KJä +€Èy²´ì‘äINÅK"@ˆ5s /²²¹ÃPp dæ;¶É 4ÑT*–S,ûɀf·wj‚PZ³˜°„ƒ5Î3vd'r±³ÿ;÷µ¡àkG:¹Oú­’_¤ +eíFFe>kÚÚ¦]¨òÐw‡± ¥¢EîÁ¾2bê(’-Që9¥ƒ9Ìv „sû$ª÷ê- ¹ãÛLÈɇbòÜ ê Elë_Ö~%J5?0 ® õ õ +&@Ü¢hÙHÔ@¸\ѲυvD œì­˜.^Îj(@T)Æ}‘¢—¹b.u‘fòËçS²h5BJ®ú¨ ékWˆÌ=‘¹ñ¼‚SøèÖ¡KTãÉËBÓºå$ò3ш햂ñÝŐ¹tþ!ÜЁ¸í3W'j@ÍLƂÚ3Î^Ô}ÛJœ&ÊFXšÁ@pԚÊñ ™?O8ô3t”Æö«Ž-oÖXöÝ+€—Ñ=©D^®¼F.T¤_¡v ††q•dôùh¹$ tTY¶Ú@(ü¦òŒ03•´SZTÀ˜N,ó#ÔäD_w–fý¡ÁG‘–§ÎIʓNrí–B©Oƍ…{ï¦3¨rpöŽ)÷»ÐéƦJ0ÑrŽøæÎ`¢ÙƒpóîÒTiÎS^á ¨=¾›S^¤&!uë§CÕ”Ó /˜)@Ø!Àpm Tâ#÷'ô¯å”vÒ¶í¡ûlÌôûIWjL½åEzk€¿Ù^¨ŒAeà!„ã»f+?röG±] iĀ@ X?§(½h}ŸEßI b¡÷}‹?Ž+¯ jKýHOÎ߉c R¤=ókÁ)¹,™<»bXEA íþæ ºôú¡¡-´íí» J¬õrš8M5¼ùý¤®¤»8”½W.ÏnP‰†ß‹ äf[na_z]•Ÿ11 +‰Zâ¢ðyҜ¢;Ù xX¤³ÂŽ£Áõ'-»VÍƑÆeÔcz±B—Ÿ´œìÏÁ~à[‹Æ(VÓ, +´Ø”Ÿš^–²N +Œ¦‰Žwxòôr¼"h«_»s\ոŠeи‘ýF§[£´†¿™6ÊÀ¬D³»vÀrÁìq^•&8•Fn$4V/7?YzށOgŠm,o×wé{35Ï(ÍV§e}Æ0–kl+X …ê/Ãfì½#Vóï]1ÍàHí4jÉ/ËrèÈuky¦-0å':µ;ž8È + +ßĀùu "Η™M«[H¾nUx+ðjœwŽÐ™Š} ®Œ Çj¦ ª&À1Ä[K ÐÈh%æÙÆÈÏ +ŠŠ KÊ>H©,¼AxÈ¡H–ȹÍ+T„ôI·®0"’‚KlâMN-êÄs4­ÀÛײ@øhï¶HÃJè‚mŧ€„hܨ±ø6*•MLªª¢Ý*úƒç8zG"*p£Ã¡òvàù'I“û ¨ùã9y›,Õë6A “±î ŠÅÇ*æ*ŽšùÚÚ^HÎ3Of³LÔ=·Fbç‹Ë„<†áqú»4&¾€èùÑZ"&Ú¡—>,Y_®1JòØ~Ɉ2žÊ$0ëθ‡ç4Ën¬T,‚Y´6ù Úæ _Âû_qKIY#Âd›X ŽÒr} öÊʟ`ÝTßI´8n³lÙ»a ëIc«Û¤Ó3*ßÁ¾£Ì±¥9õÄZæƒE)Eõp;âæg!Ûá¹ÃBj“èK°¾*ódŽŒƒ¶X#Fƒj{é  +“»ŽDî–Ðh|ËåjŃ<Úû\¬S-Y–bv^íŠ5pËÑõiY>ªª\åEN3]Êèà5¬ZÕ:(—l5}€ö]^zÊȖ?‘Êþƒ0ê5H‚M rh]ÀØ¥6Ò!!äe̋Ãs*»Z©®mÁA5WPŒ_ÔÈôï1£q:„~Q¯=íoó'”ÈrÌ/LîK©lûHֈŒ§0ÞB+¹ a™ßº_4t3ß@ôç*c,N%À›ÌvaŽ”4ñ aÊ¿¯+¶5µ-¦*#~ŒÖSm€‰(i'U[ASÀ~£ù;ñŒ_iµA@¾Õ¥d[žÍ^õ a³k¾¹ÓÈFÿ•)~ˆ|™Éɐ€[ wNVª§’¨=mñÙwqø „¹0`Á~Œ@ø8+·Ê×òS]ʤ +¤¬|4YÀ;Àkp-Ôe]´C•f f·-&«bÕaˆŠÒË3¿‘Û’€zRçS +•Ò#à†®/ˆÙr«Ve#kÂ÷̲^힢ävU—cËÑSàµ.i9}WA¯ €…¨ÏµwDÚ ~’/fã[¢‡¶éÈ6ݎs•¾÷ak5žáfÁGKä¸3Œénà‡¤QÕó,PÀ~ëœY?a³á~U7‰l…On>Ó$²ÍÈTCO.^>›YgM4•ÆHgTš´k…V>ˆ%‰¥Iw¸wcJ>Ò¬(&lAò.0Ÿ0™$}bÊgóùÔÛ:*Ã’j%[¤ê¯#¾–°nL Z<ª•ÞQe'^RX ßûuáðM<☢DËà°1a—Èð^ ‹9Þ熉N˜ûˆ8ȆáPn_©«—&ÑhSÛs­|  mG:âãö#Q‚ƒeDґçÑ4Ï 4–¥’¿J2æ\&XI¢Q~Bûٞ¾OîÏOôòó8È@p.,+„÷pÞ_ãàøN­àªžØ½©¬G,~ï#¸>Á,­üãOX3<æÙO-¬¯@tXçJ»ôHê؆EÖ\Å7á¾ÿa‘½ø*”¶Ì2‘Aå™ô‹´¤­„2—š±×Áwƒ÷Z‚ßK_§.»³'‹§¾Ëã¶ìD“XpL_éHPÞ +­¬\ÂašWsü,ÒÌ2x^N„?ª%٘âpÍÞ³̲ÆHSÚX$A£ã‹.äTÐÖ`ù2³ˆàیöÇ¢9è,ÿ^„Ü‹m½@]åOàwR'¥g ~ ð@¢ÙðlΌôôi¦˜?` ôëՕ+ã^ZZ›çé²±:ÃT$RBGç jÃ?“Öüó?´nÆ/už+K»ŒnbZÀÄQ#B©'q˜]w>û© M¨¨4Z6 û¨o¬³ÎÍ7>ï.DB] ã{Ó«€3¡.Š"zà|¤œOá°!/S‡™¦Æ+DIØÿ ‚j^šÜZT%ú³YµÉgL™‚»É½?TÓaƒ²#ˆ?N¦Ü,i Þ›üÎÞìfi js1-ÄËnI_ÉJÝÑ¿ýãÂ/û’àŒšÓéM˜âÒTKHGì–ÃL"¨þËÙ\ÿl´x ŠÀá>M0ñX—n9‚.¨Ôh¼–¸c6́à."”ß:B²€ÂnÏ1#è.zL›Èðy Z­pI—- ‘)Z9LþI;]5¼ð »m"br„}XùÄá)E†Êâìz ãCJ °Å]ÉaW*3w/3;V¢°SÕßtP %„3ݱ(á¥ÜÀ´NÒýZˆ÷P0@aŠÌ–0¦¢è¤‚E°Š…Ñ~M½TOáýÜà<ž9\_ ºoËBEŠmd]ô]ŸÞ$ÄPFzÕþ!5•”,!˜•Èš~iü’GJ̔h&Á†7U]~€ðF‰ ˜7äåb˂ÝtÈ1 %=ZK¯‘{¾òIª²"•V¡6kALA^Ѐ_G¹i2KiW(0@Á*ÈœÌ 3¾CYEª³ÆÈ‘‹ Q†%6;ÿ&sÂŒt{T•ÏÁ14K^î×d€ñ[ dPýZ²$iCðoZTqO..ܾp²ð¨‡poqP±y8é³-OºMÙx„EâO֔@Pw‘¯Îñ|F™\Y½á'=ì ¦%æÃwÅ°¼"ºˆ÷;ö²5§³ Ä¥{ï(#L¼Ÿ6$nä´DXs,†»>ƒ@Þi×w`ÉfOÖϚEñ˯HY¡¼ýÁ(Í°ØQ ¤a¿¡ït/~ÈPÀ2óŒöÊĽT[£Q Xh7^.H\¤PìCÔ­?±Eb“)Øß­¦w&c»Ðj}dî͛:žp|eâñ õØK¬D5aâ + Íè=LÉ ú¸×/nےið€Ÿm[†¡ó‘œ¡_ø·ú^(ºÃ†{hÜ1÷bíõµLÑt +#͝¹¼`Rl 1½1FˆÄxUuªøR+ˆ±¥Wè»‹éªp’ ÁÞrL'ʳÅ,¬¶^W¶]¥Þ÷%<Ý+¬ÝIÖ폙¦ ‹ibðyŒ̎|Ž`à¡×±Ô’ê†ä¿¯$“ O׎Zå" TþæöXhMX/P+Ê-d½ K!;¾ÞÐÃyWý?ðjÝn¨Ò«–.ý”r(ŽÕÆqý ®qÖ¤wÅDAêŒZ`tŸ W,µBi¡,Jݟ!¶N’=©Ø¸Õ$áP=¶áÒ2Ûq?CºÄ²r4Þ0'ÒJêõCtx¸T#ØÊÅFT™1A¥mSÖ£ÑÖ;?¿~>œúu͕Ó|§âo½±f¥Ñ9Ç…·|ʦšæVÇËÌÂüð~…U‘….-L'={Ð8÷&‹;P¶Í )AØCñ×´s ‘ä-ÕÃQ ú›pn(Î5轃Šb"ò}þRþ²¸Ð6ä6+¶\{èHÙÅ^*׏ᬊÂgà6»’h»éîéË­`zѤcº}¿=ŠÊ"L¦;°Ú…=LÚH¤ÂiàGdà?ˆ-êw½œÝ<áiGÇ­¸7 Äãl’Âô…9á~*ÆÁÅå^±S2L&Ÿx¤±ù«AÉÎù 1· @0A#_®„n"u–±r¿?áÄ¡‰Þ…€4±¶áGÄs™>vã˜Àk +Œ›"Ž¢¢È¸/ٕñSÎvÄ52]{ȔJ]öê!î¹)­ÈƊߎ(¼Bql,Ýäx˜-þÇpœOå‹w7ùɧËX"#[˜Ë” OE*êL¥§¾`Üú*%ðÊhÒ£®EQ“=/á®!Ê+ V(HPǎ¨Ïxn‚M’ò~‰t\w7­ 7èüeŠ9h‰y5›Ã ²§ûy0Šuô°ZyÜÁÛÝbÒB§;püë‰BÐ$?F¯%ÿ +]°̜_<ÑÐՉBÞºh‹s•Šn*Ã©jé&õ~‹ýæþµŒýöQ$ߓýÃÊ¥¿Ô±?xïÀ¸ì"„ !¾:»KßÕGZ &÷ R¿ AåæêAP5:pšet§°ÔÂy´ïãÕù0û¢ŒÌÝ@®ãèØýcÎÐf¢¤xãJEíו²£c£Ø¨åªË“(ÀQó±LÂë½F*¥ÀÎ3  #—µ ±°o/A®¤Á®2‰ÂË:—c™l+êe8ˆ;'çk[“Ùßh^²^»x"1¯®Ù™‚Wl¹…jÑ_¸G³1ßòYÔJòìÅ ->û)Y0Z¿E&¼YÌhü†ò`•Üš¶Ýg>ïþ˜&®,㊴§5ª{(Ä ü; X-WM×y3zñh·ŸÁÆz—²PÛAq ñ“’¥eöO;úH“Q +{!_!ßU³ú†=n 9%«&‚„TÚ³.OI0gdä،DÖ&ì/8ær ä­LHî¼bi-9òÝÁŕ+•ûNÙ[Ứÿˆ~lwYV¿›³ ?Sú]ah+²KÑö´°2u—ªâ-5s^A~QÜímHIM]ËW¾U“«UÎõ„.áyÒ¸!ÔIY*+Íͨ¥»WÏ-Fú±qáËzeÒc®¦J_½<±:ìV+6èÁÇ\°cm¾ +ŽmEß·I Š£Ë=âS4Ÿ (¯äßeL“´ƒ­o$EN &…-ӝâ•aÌôQ ý’cU7ViGj+y€%? CTÔ) ¾+X~0@&–ò›^þ«1Ñ!<3 OØHÃôNyMݲXï饣7g5õÔf«g„$П2ï²xƒ=†?ŽúÔè>]°(gJ#xCځÖÕ½ZO͕œ;Í%"¦h5qƒöÍwVÜ0·“Í@Dx•ƒò}"çUÓ$„/N#H2– 8µ“Oaë76‘µ¦E0~PóýÅM‰vö‰j(½Ø A¾Å½x@êDæLýÍ;ÀÐ)#•Q?Ÿ®„ÇõÚ«¤½Ýn"yâT9e_*n 4!°‘›ïÁ¬·(¯SR¹MáĈ›9îWIçiÞ¤SÈå7ÎgšRDRŠ¬ORˆC„`m†ƒþ!s›¸‰|F¦ÀL"P¨4± üP°{Cî0Ðï0扛¥ +év,r¬úÂ]F‘ífœL(Ù̎ˆ(ÿ>àŒäG=߈FúÙpJSåú¦ %zö·lîllþñ&Ù pmÝ„AìE$b/½%š’HuF©ÎQ’ F¢‚vqkÇPæêJiEªÌˆ+æêjŒ}3õÜêE'hÔ¿fãÞÌé'q}¤yûà’Ñ cm‘Úðû¤eV6ê—9¼˜¦÷Õ4G|=WÍy‘¼j¥É…o?¡ÖM‰Áqfñ;rÏ5’01k“=批Çþ°î°"C_4Ò[¶Q¶6^d¥Ik¯ŒØK¬‚ øöúˆX¬' ™R¾­m4¸õîÿm~¶±½ÕioërNHèyêÙìÄ6í<>kQ;‰ › ,“4q¯‰‰£Û½’kÉSžs¸™§‚ÏfðŠƒVŸá{  4lÍ# +GDÊ+WÀö{KŒæÿwgSírN„™úâ ÔÆ6ŒO͘8ÑùiùA‹æ\ó­Ú¸e–µ›3“’Œ×Æl® Èè'^ÝÝ&j*l$ϔƒÈ=F­úpô 2h3¦5¯Õ ÜªHԌd‘V8rݝŒCêúâ…DÁ]Z®)™ðƒÀ¤ˆ}8ìd1Vu5é +UâQGÔ·: ?P¹ÒÔ²o4|¶ ê]–ô¬ñþ”‹¶K2wˆ4¦žÅƒvµŽæÀjÄ(~$|`nÇ; +€‰8JßA-mí ¨b#ƍu;¡ñ”P*ôFR2Á'¹õ¦Rt)Š‘YE(ZstˆuŠëË´’KP³e7mö#ŠZ‰¸…¹€–ºQGê-fçz³ÊÓâ0TÊ(ôt1¡ŒÑÍ~I& ›\Æb¬\hAf,á_5 ®Í€žM0é¦Ð…Ã|ª¯ÓjüëBx]É s÷¨;Þ£ Ì\ ¯–n\¼èëíªoJ;?+…Á;¦¯pêàÕÕ• ?ÿwÑæw²˜[ÍpÌÖ~bkð}õ–oâ)ꠊaÂd»J˜óù=6¡+x-'c«ÖÓ¶iA-Å2Ù.óE¬ðkÄô^¢íS·oêû­-†‰ÛXgfõÀ!ŸnœàgdM¬ +æ㬧†÷²IâBô!ÊÂsÌ|Äf§Mìϝ&ÇaQzøð2¯±˞nq%°‚joS.üuz*gÏcíù@ñ¦]eFÛN+…³Å¼Û¬b-gˆ™¼¦)|҇3ØU}|ª„"—%bðÂ\‘æIϏXeGBPÄ$ãŞ__¹›yø-½âoPÌkŠt8åËñ(ïœÚ¡^`¿TsÊÅô%ó¼¬ÆC¢S2ò¯ÈtF½\ÔÆõníK‡ôGZBC$9d«µ‰¾¨ 6Ê䨂lê@²Âx]­|Á °$¹ªƒ´˜†¢¸tÔ[‡±š>J…ì ÎåPYCÒ z:Ã1é¨:ë[ɾÕ>âNÇë¬4™6ìú®Á±º²+Æe‹Ñ­JSÄFýp®‹(™Ôwþòy󢶱 ñA‚e(Iñ¹½)ngÄÙØ-r±™¥«Ë&d9¬ÃæãJÜá¡VAhۚ"œê÷e¶ç’M†uFÙS :ñ<˜†F݈—üîR£ìŸç#fÀ%äàË=å2ð“ŽNžÚ³iSÿA Ð<Ò3‹´¨œü®÷Õñ­ñ·èÛ{•Gá(Wè)“íÒ¬„ vzàMMF4zî±Þù‘v¯—ñÅ£UÒ„‚…A•eGRÛÉ«ªE"§7ù>*Š@EýÅÕuYÀí^Ó¼!uÛq/Í>þ~šü…£À<½ ¯ÓWã( šHqXÐ¥Gâ×`±æ.+èá?H‘®•oT`ïœ@Ã-“}Ñ_Þᰆς@‡'ÝÞ$dö“·.=гž„‹%Œ…PH€{ŸA”Ô>“ìjþü‰³R÷ó†i–½—7ëçåqa½i EÌ8KÄð7Ìw%ԁ…¡»B·­'òg ÏL?1éØÌpA†ÎžŽà-YRáÔS +ò—uó›×èÄ +¡0ä–Q,\¥¦QÉó´xÎ1éêîq°rä幕Øn¦—î’ÎÀâ= ª³çã–ù6¯Á”{-­íäÝúñ§ÿòs…i˜ Äse†ÂM#sˆ‘ÛÇø†)~ ò¹û¥\ ‡Œ»TžWÎw¦HÞbø6 û […ŸÑí¬¡7jÂã½ûùOøúÏ[äZLv Ù»“IG±4‹.>Xæ;ƒ¬Å÷—ňmã»öY;Â÷>UËB)ÙýS½þ 9ÈLÛÙ&Æ[O_sÎÿo'D€ +ÄÆGAbÏÐ|QB +$#B1O´m4àå"¼Æs“ŒŸ=φ$eÊ~,_ø,ÊsþôJ‹Ž–}'.19UKT·Èœy/<´zŠ+ÖDuµW"Þ³ÈñRù%`FDÅP.’•ƒ‹a³ž¡ùgp9019‚ åU£ù§þãrO{æ•vvˆÇñŸˆ:e)µØ  rC¡¢BOÞâÿ¼ÍJ V*ÑÁÎåó ZŽ€÷åçŒ^³n/ñ—½Ô”G—5®%Ê`œK²“³XxdcĚÕF§¯ü@0}mf§Ë„œ|[JfZyŠ;›AZ†eßPÿgG®ÈÆd¸Ú\†á±‘̜õö;ðhÉ7‘Zíg×ÁITéޛü%,ôN¯dCr”7fSÐýM6[HÅAFý›@‹YP,LØ]©ˆ?«Á«Xõ'¯þтîóS Np˜m媺)b}Òº&§MkS»€!(ö¾÷- ÜAù’ÿé[W¦òFÍS¨cÑE€¸Jp2m{5Ëëú¦‹KnTv2 ÍzvïÅØëÉuÜ&XèÍa( 2öDâ\Ð÷¸˜¤ro•ž‰ÿȏEøï¦æ6ÛzÔUÿ?7¹VäboÁ&2;-}Ùô¼ Éºoƒõ’±ä ¯jØ¡°}k^qœ¼ªU¢ ä8d2DQdÈÄ]iۯ쨒‰2|žž"ç6ÁR‚Ç¢!åú{iàí*·?-MY#}¼Õ8næ¦0qðGØ°[V\è`Cmûíx„æR÷äÀéÌ¢Å"úcƒ,T|*(=b¶;e#§UÒŒ_ÜNMçQ ëâ—qØ“Ъà±õ•T¸±Á'MyÉ®WÕP£.8šŽSÞ­q)µ€—Ð÷{ðÂԐ`lnã¿9±79—ÿêáÕm¼<–&Ê7’ì°¹QYš®åš6¨ 0ËÙïð"Ô܎N-\rŠ §·¢Hd“.›ÂT Ë]Ô{$âEú`Xº*I Ö£skæ¦ÅþsĬKnÝ4ii©°ôÁÉx\ +“ö½7—£P8÷Ê9',úy9Ʉq“‰ÜVÂÖ;ðr «/Üa`ø9#Lí°Œ2BµsaÓý¦J {Õâ£ê‡/ •2`À­õÆl08ù¸uÁÒEIË̂Y/[“ÒHÿGÁ«4õ¦ùÍK!ÁÐê'–à,·väôÑKIØ.]¹%0†rCà‡ïßÂkø£À‹â³$¬¡’‹ï(€L¬—³¸Zœø/~§¹ï¾fÁõ¯y*”&®¾æúr'…ºñó5Q²Hp†rR€A‹2OËg(¡¥u½†,õqW…z_ü×Þm¢Ïtd‹T-4¦¨Šïýžˆ¿¡Ý݃ã¢Úûñp/n]ˆÁfj}§¢¨ïÖl¥žI–¾è>ú?ôι™¾UéãF¥Ì<@þ}ØD¦œþ…o:[^À’Îdƒìµ7üÎ{¿%²K÷â:IÝY³›„mrÖnëpY]z"Ú¿Á_ÕwEÀvèkD‘±©ñݳì‹ø†Üw57;ƒ½¤´ó-‰ Ö´¯|,F®{ÞÉÓzË'nòlÇïV¼üçx¥ZJŒWã_Xbå¸D_ž”ŠwöËqÄ;ov„f¤æ¯å °ÃûÆÝ!‘èÈã©îDäDY)nwPó]ÃÁr&Vgòvz·o¹§Ò(;Æ»~§#dF„l{üjòwuÓ¶G¦è£]Ã#À’x"2‰+“]#yÎRˆ]éaPj¼A vՉœrÜëò†u¹Îu­ÏÒ_i]Õ¡’FÃsˆˆuónüºOmÜÎT²º°£–ËT÷[÷A¾Ç™p  <}N•ãöˆnk.Ã…nƒ/†‘ÏÁU%½@W{AÉyŸ«oÝØ{&Öd¯1·5òuôKs9Å8%|õ¢?Š£ÿ2§‹cVŽoŸˆËUitÏÕjÔûË.ß¿ï¦`aC»Fñ²\s¿7:=Ñ?ÿ¢3MIÑGศ1Á&–iÜ9§Íq…z×eå/…ku#~Τx“) K€(ÿäHØg̓»î +‚¶]I˜¡å¥;\}»c‡&7#j×$Æ:õÕAôô­´3S€Êm⭀•;ƒ í +„¥ÂU ÿ1‹0Vžr ܯ‚K[ òÀ!¬µfz›È)•çõ("Z€#y¥”éHLöUßW´úª}îN‡¸ùÇí–å¬Ô± ‹OvZÜBž›°ˆ•êˆ¢Á/d#ˆ¼íÌÏ^¼1|R%<ür»V…G­úÒÛ'/vÊÎ6pú펷áu!<³]EòQF+z›šÐ²/®4ú¯ã6sË~J¤jjî"–— [ÿøH(PҔ-o¾HyK¡|èdò¥†g•6VðùŠ'Ûöa[1Ä8}ïeSTåßÛI>;Ï WµæþwŸ;÷‚@µÛ³òg8qSÛ´±ŒRI­ÐkLfˆ*5 …ûÍ;¥œVkWE!šVz§.”¦¦UOåíË>#¢¥û¥z+oö)­¹ŸcчÑ*žo¾v˜œô`€R´œ6…‚"Z­| EcM'§T†’ƒ¨„V”,»¥´à»>Eº°A h—Zƒâý¬È¿ø¬ðU¿Fw·žµ{¥IÓéF<™þˆ„w¼é ½=ÿ@ªÍv¹Ë¢©X°¼/Íæ=àÚÌê4e,2›ò3xôÇÊJÕ2”Beµžõ̶ª[DÃq°â@tg›«¸ö8e(›Þñí0Î +Î|AäLÍþ~ñÿïeß¹ ¦3Ÿ͛†°–u +d¬Mµ\…œ/[„hÉn —OB6Ýx¼U  (z*9å7òÔé}¡ˑµ@1 wfŽe›áþÎ@ Ãä»/ÎpŸ*vì"[@•ÝŠæÜ3æÞ¦ÜgØh}MÅÎ>¡`aíaô–/XF‰ [•RÓ³ˆ¥’îoða&Wª|sˆ>0ˆ½Î¿^PîzØÕð2pXÑí³Ö°¸£®…V¨äpö÷§_óB9)î­Oÿq&Š+{ VR°‰wÈò¼&ß酯éyIóÑ:íòÊ!•)õCkWy¹¥°YŇ2XÒ:¿E ®%vÇÒ9÷›ö°Ùöõ·ÿût÷o£±«"Ûºj—ñÎ9/âà’ÒQhQ%äǯšò€x¥¨ ŽrÕQaˆ¬ Ä«žÓ%«ä"C…VB±+ñª‘A>ïó%q1)Õº|®MÁyÀ#”!jN–ñ]%¥ÓÚur!¢W÷Šî!=⦬.;Jƒ­hvoOÂiç8âH°ßÉ´ó“w1,§‡ìâo;}*df>¸’²Â4«÷ÄO™- ¯B³Yaô³ïœ3VŊ×߃n{þR!²"½têyA[´¥ûª´×ÿeI¦ÕöõÕma=ÉÏX·53†L^èÅþ®Ì_<ÕiUeJ%rH% ÓúÅ«Â7¶çô2W;ÂõO^Tę}á?XÁ¸cÿüŒçù ¼Îz²wl" “$ó¶ê=WÍbƒ÷ë6Ž”’”2É$²Y S5B䡤oˆW°Çm-u*æۇ¢¡•!v2Šë¸BsÌ]ó\qP¨ªUénêzœª!KÓ ëzQؙH•KüÔÜ ¯þ;õ/ K9ŠÃÜ\ɞ\ÑmhƁ9cÜdj‚t¹¦*‚ê@â(ä8 •bFDª¹‚þ†Ã÷º€Hå“`) ÜLª²ÔÜôš‚¤š>Bµ9$Æ@JR™å§[æAëí¤Äqík2ˆ 20.HÀ¸€¸ (`‚# ‚ .¨Àˆ 0 À˜.Ð@(`@ h`4@@˜ (À" À€Ä0 d@°GyåMÔ|ó [jâ;ÓѨŸ£a9m’?SN1»ÒÓT5Ü átúˆ ™%$¬øåõ×CÒ¥ãËéEªÊú)G'&Z7U…«ÌÑåPØ¢dÆ"»C%QŠcÅ@—Ä!ÜÆ5*%V6Ä<¦’UǞxI1iF¨Â Š¢)»¢^s&Ú'ÂfZV5ªLŠb±Gƒ¢b†/©}lÄåÅåx”‰4¤ß¦‘ù,"“KmVѧÄe=*d–Í_yR+ìÑ]áá°¼ó•P¾§G÷<4L>²p^T‰s3Þ ƒHþ†0œ•@Q‘HU8A³Gikº¨£BôÁ/$;šG"%—l.i2 ˆ¥S®U«24p%fó:̊„yymN×£wå^ªL®±ªÆôšÚ[§q!ÓOqÂf +Rõ5#’˜Ó—éëªzÅ/Î-²ŒN=}j*BÞ¢xýrõ$šêh_®(êý>ïñüŸ\å–âs'Jª,I‹§n‰ÓߕëE¬ “t‰õ‰ï®x„§F~Çéª.dÆ1ûz¢ŸŠ ² +K½_]½9O pûªŒúÓW¡á=¡¨O‘è:Wlu‰\#>,bO&+ÊX–}™Çû¸ÃöÀ¬4ˆÔ "ʔG‰gHõê#5‡b3–÷<Â+‘Ï%î M§RÉý®\ò”]1Ç*9*õ)áL:ȱÎٟú#òI‘«ÍÃßHE‰¼HHø •…<µ™ÆÄ8f-$‰@íû9Ä^T§‡)^ÿäA +ªP![ keùÐ;š©PùDD‰ó±l^4A|EQ·â÷3’¡*ZH^a‚Q›Pä™lšSª˜?b!Î?ùœ™x͗Ñ]5®a ¸Gƒ‡ÖR>®Ú&1yŒˆ¢)‰YM÷@1R\ȇäÙ¿”â›0&^RïfJäaᴄL;*TB<£#Š–(G?~ …H_K-Zí J©jtbœ4.YˆhñõMk©WzF›× W¡˜z\níݔøQæÛHI¦)ˆnZÈ óA.¢©â¸Ô=ÂHtL<“8 EØmO}ºm|ª-D›6âD†Ñí¦&:Õ뺈=ÁKTÖÏ&ø2ÇWøÌû´éTèQA–ÂÔÔS–¨ª}ъ +ڇè _ Íi¦Ø¦JW“`v,E#eK»ýtý²×%ïˆêRÅýt¡ÍU狄†eN^’厅¹%?1¢214"~%0¬=ÔHˆ§Ø²ø%sÚÄc©’Fõ„Óƒ¦í(²"ÏmJáªNŒFùÁwÝzI(I‘XFê8<–¢¨ŠgD¤*‘bäRS1a¨\JŒ„&ZÅ®’ö7Ó¥Â1>—$×Ò#X$2¹¦ØùB¹òŠ ‹+RŠÃUòš¦áúJ¶A^‚m0=Ögz%ÂÖÈF“KmÂӐ½N§$6QôPw‰ ný +S&ª%!j²ÈpȘȋÚ"¢ªP"Ì9䊌†NˆäõžZâzeÊñ™¹r2ï¹lBŽé;ùŠ[¡|V»i†NܸÂ$zÄ%FÏ_j!èò֓hCqEd¨8sƒäôSրjà(r‚§QAáIùvíS4¥ø‰'LüaHyðE“ ó¡T…¢qØUÖŽE0‚[E7¡Èÿcˆj3QĶvŠ_¥‡¼@ǸÃ(S‰gä/'¡zÌkV¹Zd*›âŸDKŠÑÒ t¹BØ"×Ô&0̇‹%GLEÐ¥=£*Ƽ&™L&Ž{ëcä£3š·hf§!Ž„ê(.ÅÑL„EõVµå¤êXJR3DªG‰½Á 4C#tMyTPAh ¤àOȉAlLؕ?ò1tŠ‘a‘á­×)rüøä0ATœ°°W1+·Æݱi<ׅÈki$Ì#R›)2Óêè™ä ïš+2–ã]‚èÁ‘+(¼ ‚DM<‰ºï¤È sDØ8™q‹LٜcžIU®X±KÅûÃA*‰ £)ã5U³‰ñæmÐb3S‘öp¥S£Ê爉ȻûQÉ܊¡L£bd|‘ssš R +˹PV­‡\¢áíà’,=Hfæa·–tÆÂ.%ŒŸ I‚èÑ­[ýB›Ã™XE’a†=Û8蘖A\2ôX‘HÜ ӉåQK¸k7§†DK²rDÝo0J%%ûñ|«ö5ʫƅyÞŸ*G¡µ/Tߪ#Nµ*qÂC( !i™FjyGZ&ƒ+}9l£ª¨™½ 2l‘Ú0¸êãD¯ˆ•–£7$J Ÿ‰xJ‰g.‰Éûʂ(”Ž£ÄI„…<îþvqР&¸"[íxdWvÆNâFÄÃ<â@Æ â!֎©)O™ ]ïE•Š,|Ék¡jUžŠU.'ãxJN#eÁ* +ôÈfÆô`Â(l ÎFg_DÍË–SgÄz*æê>r*GØS5£m—S˜†50%¥µ8~ð!ñ1¤„Ôäª8‘"—‡*ÕøXŠÑfτéGÝ) |[3w%.«ÕNJâ/¡Êc3´ÇÖãø¹£õ˜ÀðTÞÖµF…™‹.ú¹;pB¨®š’s^ûb$aÌÉ܋´Om“ÏSmlÌv¶Ü yL>‡C¢VæºR±® +’¹$ÓîA6?=ÆR™ç`sª]Ö–¥ŽV†ªrÙ,X¡ó••ÃíB—ÅÃV˜‰é;ô˜ujŸÅ… cÅ!ÆL–jˆR¬~„RÓñƒ+-%̔ÓW±Â„#q[XÔb+cˆr³¶ÌQG!Î9ðDMnüG˜kXQ®)ÿDò8,™ÕU·Ba aT‹ö“kV%¥’°W‘…\EÑâìß„Ä -h4уBEìF‘ö#CõyÙ©zJ "ÃáÔiRßD¹LŽ0Y¢=ù4á]Å#l)að +,g1;²ˆ‹3D¦´‹X~GU˜‹xÌ#=}z˜Ã*z*ÌP}µFñ©?ëpXÎ½ ,yjV»C,ñszIó(;!EU/u†­¯Å™#2sÄ7S3‹Ÿqf6¸êH&¦æ·8W–À¹¸ +S£ªøeæƒÆ=u +MIÆqÒKS™Pœ¬@ ÃUÅ]¦¬ëB¢ªÙëzŠS‡§ +ik Í#ÒC¨”U ÕR¯K¥äÅàÌÃ.CB}¹h$ñ¡XåhHАXÏÈA7¨ýSNÉ\æúÑ(gê»Ì…3;Œ„LöMT˜›‹cÉç’y â°V!—JO$?Ÿ53Z\Ó)Í©ú.(uÈJÎe!y=L 2ˆã§B,5²5«Ðpt×øçÊÍ«ãŒç Á½ÙÏÑe'ª“~ÅkØú왑è+EÕUå1£ÕTQVIIEG2íWáqáKÈK¸’˜sÆ#ŸñqøeDÕHì³<}Ê¹ÁE—Š"ŠÍÃáu>(éHì]§ó(¦VFÄ$>+ć¤¥(¢S]ÈUC£™¨‘Š:iS#/Ò«ŠÒThá£öÊ&f‘çU'©bC9Æ£(ùÌôP1Jø¡Ç'}E5„6Ñk¾”J©Ðm;ʺ@"–ÐtŠèèL¢sé‘àön†¨FdóFãbú¸C—š3š +S*½CR%,q¨Z™tlL±†r‘·‡¹ՖJO1É” Q+²úñÄq Š)8Ö§¢¢j ûèT•éÂ"Þt:Â:à +Îd:¤/Ä̈́—<3/"wÑ kòéÄ!ž0/«Æ¥PW™Œ|"j¦¤È’©„=´û©H›$hòº„Ôx™>$1=ÜG«‚F_¤b’ðªaK÷|S‹•°E"*M%e) S£Úècé;²Ÿ™<4´WiÚt­p" +_F‚H›rõߘÀ’ؙá\™ðŒïÔ3dÕ>¶:â˜k8":BÕÇO¥ëôðËÌ44z22 ’ ’;¢ô†,.S$4 ñsT¢4U*V^}½S¸«53ñC÷„ø¤ºNð×" ñ‚Œ àú¹Z)"rÿšӄ[Œ“85 ñ|ì¿cæAcnZ„†Q„™ŒÉTF‰EDSNø<ˆàiù5᪜jQGáyUFӉbºy0F}™½ú¡n"u"—´ªƒC›ÎÔÌæ#,ShµR£©ÆÎ='É£NpE˜…yøSBº2 %ÇÅ"CÔ ÍAÜóΪA<‡ˆÆaƊF¦• +V”Vё©)Q4rX»Pg\“ÎZͪ1…ÍÁËìisÚèñEÙS!ŸÏ»­#×ÐØ?ļôcЦñÅT4XN™Hô‰ÿ­ Ë|Zž’Hð'3nHK^RÁÄSQâ#¼§Uõ‹é4µŸÏœ&ȉ栁«6ñ +ê=%™÷ -šº9Ar ˆ&nxV¡´×%ªO:•P¢Ö£‘Ôçç¹):/-D3×&P«B:Ÿ=.ûT¼¶]Ÿà© E¤PrQ‹n! g՞CšüY̤d~gFTñ¿Á2ÂõdY¨¥èP^èDêÂ73»FT#ÿ\÷ÜQJ‡ömHô‘b?(k˜›ðµ³d;ü4ÂRˆ¨9hPT| «(¨h5EŽÊTϝû4qÐâ‘ÖsÐ h[ I£4!mjÂÓJÎWäÚI+”Výšÿ–±„ó¾„kÜY$¨VT§[&ݜÊr´0w +µß|Ø»ÊÍAƒ¢ž*1s§*ݳè»2Ñç +«RM2ºG`HWÆÃØkh\#RKøH8àö‚t5ßöä+(*æó ¼°’¹2 ª’Ƈv©RcÂ&Z¬Në¨p4ÝÖöUVÕ,hX' EFÚ W÷™ˆºðfVWîl¢üKd§8QØ)T2RH±!nÙ$¶ð‘WÿÌ|ª¾>^”xÉTuV#ZUç¬.CXèTZÆÇX,ÎëoïTÕ? ‘ê¨wʟrB"FÆòÏ«ª†Ÿ®‰ ža1ã¬*“™zD=› ÕC5²¨†~¨á‰ ÒjD4ÄPf¸Ñ-pTb" +šëì§$ªl”ˆ¨ÆÏ`‘ARO¤dŽH6¬Ä\Ás£µ•ûTŒƒq²ã_ë ¯$¤;j§Õû"4æUn©Ã%ŒU‰B”z«Öku‘IQZ ²ßfuN$¨BS‡ÌÉ´8 Þ^µ„8ÚpD'sŜ½ª!¤þtC$<è1þ(8èQ´¸o ­{„ê*Z±éJ†"'ÚE‡k™óñ©áø¨Pú8"(®ŠŽ #:ÁâÒ÷: «Z«V\ ³Ç«8á–`0#j¤T÷%ʍ¬SBZi¥W&§Èk&õJÍÎë¡öÔtÇï‰TÐAá˜ÙUu?+¾ø>ˆ¸``1Pjö®¢ j…|´’…$x§` +;TÕZ’Wќª =z’˜Ã´¤7Î;¢Ìa.š‘ +ó‘¹oÛE³QAiÌVí}«‘ü!ˆäyDHè›)¢ +ôz<õoH@äǐ$(ö<\÷Õ ’éq±ç)•ÂŒÒO†³%“ßGê¡ړÐ<ÆPc4ÅÈeÄÔKrÙlJÓ¨ÅJ¸O¡©Í^ ”BÂ-¦ªèGk—¡ŸZð3T·”Îû46ì yÝyþ OÊ!óýð¼%­ÍÄLœË ñÀ%¤ + / +Åìªå‡¨(~×XЀU‹˜Ó‚ŠÊR²–ˆŽYtJÕt×TH™yHŠ ¬mÇ«b))æ^¨ ×Iêé4L!Ä Ïi1‹B”ICâ‹Y}ˆ=ë&.yQ1ÄMѧÄv4ha±Ät¦¨5‘ÀqÑÔC12ÑTž²x1‡w>C9ŠÅ·, bµ Ž; žFû'œ±³ž^¾¹ãID?*S(G\Rs”D| qu6!#=@¢Ç$ Jp4’ù5‘ ¡.Fºa±PÌiኑrNÔJ•5ž˜”42 &|PC¼h^Ÿ÷ƒÁ¼…‰lŠ¢ç|„cºàh@h  +0 +6°€ +P0 L   4Ѐ“ÀX`°` @”Hk„ (ÀŠ*)’Zp Uðt.áxJµ°úU•p²[qŽÐt»!r¶ 1.Ãz øƒIŅbJ¸×„¯JŠ¡c~k!½Ïš¶ª:‹˜ 8èyò@Áˆ»Ñ ›J± [';dŽ™Lcú@³ò…ã9„Iâ}w‰Ë´6סⱲcØK¡«KœïÈöñLÆtZÓ*Æŕj¼¢æàk>TIGîw¦òpѐ]#Sy•"óûDEf¨ ÇPy*<Þ‘ˆÑBÐJ~4Â*¢!*&ïœÂ½_eRÅ[œ)„ÇS‚c± O æ‘y<úòb¦©¥Œ +íÔóQ…Ù]ÈlAͪސcÖ¥0Yêc*=9ft a’÷ a×sΠö,ÇÓsõ\äGÔrb•æ1Ózœ.–REVæ:lzà6#£7ÃIP¢©@‹ªñ>vK]Tوoe† qlä'Ž¢íD*÷oBJ$†F8dqo±fótD +“1£&%HC#iQŒ‹GD¹µ†¦ù¬¸¡IˆTJkW G• ¦.D¶ÿb¿û?´¢³^W°è¸É¦ ‘ ý:…n§ò¥õhpiEä±ÈÁäÑ ‡é¹~-j^' +¾« …ϫՐB×L¹©&h¡')èD²™x°•…Úª&lד*Â7©ÞÝ<¨KܾYƒ"ˆ1h‰ƒÄ›£¦3Œ)Qgèo.ö™p(í„‘1aŒhä‘W‚cˆ¦l™¿¦â—ï²äI“†õ/F~* ù†:E]§3¹UG*±÷,{F5J„Üÿ;­Àr‰ŒÅD‹qï ¹ÿpû©Ž¨*HŠ–i¢Æ´[d]ˆZk”ì4Ãeá1q‘¬PÍÕÈ)"è%B¯Æ•¶ŒCÂÜ)u3*33®X‰$›˜©zÕÞýHgqÇɗ(½&?mŒÎ‰!"!TMŠ*¼ð”܇óa!ÒLÛú¨o…ñÎăjo…é~)q…©rÎN}ÿ»&³W•¦‰RÌ'¨b.ª<1ÆE ®hX¥¿Ò58$eŸ‰º‹F­à'lÝJ4DV1EV¤$ÓõvèÁÈÈÈ(Ì&:"SȇÚÔZ׏¡Jc½ˆB(Fˆ+Ah¶4Q¿ Ò8\ÓڋèĢɺϋFŠ +•¸f”¿;XÖ¡E֋Xâ^2$SlMIBúT•P£¿B\MêýTº[°ÜmOÖÚã5b¡J‘µAªŌWÒÆ-’zÑÞù«9¾^ +¡E&¾¶‚u”+NN¼jÛl$TiLÿœj}\ç¡uáMœcH+n?{͖Y —¶¸¥eh:Ô§ˆê¤<-Éz6Íú^#MóÊçáu€¹[Cº^!‚òWå†oÐs?Ær3Wx݁0;x\óÕtˆÑPSiSBÿÜëÅ&[r´Pjßùx³§ló-÷YC NŠRÜV¥IìqÎàÎæ&3¥ãSHÄÅǦygNYR.º3Ôä$^¿)à ´vÉáäxùˊ•KÇO’§ëàBŽWšµ,!‘;Fö#e‚ŒãmÞ¯‹lõª˜?8õ;¶ús˜òÀë&Œ ¯òÇõš›sü±ÇA{ ¼vn/!u .d°#‚D©i†5¡¢œ +B%æ=~õ]Sé¬×ÊÎiuLÈdÐD{Ø-G5üAó¶~â˜zrNIJ8'5¸#Õٔ+±­ª$üiŒ’{ת8n›¦áÖ2÷’q“©ÆќXáK"¦ÜK1’tî©.H„ô'ÁSNÕ¥w…¤–J§º °Û–F(v ·áín›ìdóXH…‹§v­*ãÙtúns2NšuaªM^?ê-øÃ栔ù©*“%'Mˆí֏We1\OÆ©9T¾+¿Ö"){<"(Ãt­/‘ãA”–çï)ã¤:¸c|JÏ/ÐãPß±o‡Ê zá5 É É&: öùҜ?±°ç;\š5n¶ŒÉµ13¥ðò‰¤ˆ¤& °çØ}•†ÌwrÖӊ.»±.Òz]»Ÿ~À^M®§œÄ¾Çz±3`&_4vˆƒñÑOºLß©1¾Öäy"}ÐöÚň´ õJ ¨b$‰Ü_É™¹:¸ãê[‹ê·J•¦cr$U BJù½Zi)‡’¸•ï9ç÷Ô§÷øþžÑ&Ëj”¾>Ö#ä[·v´Õ „/îà¦e +™%ÂÐe‚õ,a¸:ˆ^:ÆÝ\±ÌÅç—K P¸z ÍöøâEétUHJÅ¿ó3_…Äåk¥ÝS¸Ò4újú R%NBX‘¢FKÏ?•Æ˜š o|çL6_Ï:Nø’ ßƒƒ]ў|o§º Ìz#T„•¾d!7M3Ú]¸›gω¶°$ 9w*Rp²Û¡“Co3£*_Y +Yn ×ím £4T=^ƒ—\,¼Ø©Äp”¶†$ |¥ñ–n(Ç¥F¤Üé7é +¸z~&NEÑ4Þ4&ʯ~E©„ºqJ} ÚZˆäH´| Τ„ŒNûQ ÜI¼Ž7Z[©/qú÷EÛ{ŠŒžÙ]ì<6÷çTŒ0&é(}ú§Ý%îïk-’hWGÂm!ÂëäÈv™ÌkjÕb›[°´!Ç ¦õ0øi“ëíˆÿGñÆ$Y„4JçL ¡íí¤êB +‹Æ¤úŒ©k1½q¼«Â¯ÔÔë‡i²¤t q&ð€*XC[kôuÇF)¿rAC'Mú㥌P֍ZÙ«HL1h°j—„ý_­,uKEƒ‹R²nwŒK8lNŸ 5·%Ñê^ě ÚvnÄñ²Â}³ Û#û(ÃNêAÀ˜¨2þÉlÓ h +Ü¡¦V†()–y›de÷do}‡¥íäқÈæ՚DÁW5$9Y°¥»3zö.aê kŸ}5ýa¡~utæöG5é؇…œ˜!wÀ£â㹧•«ÞäúŠCVžÍ³!éœ5ŒI³P^ªž=óûû+³mZåȜ¿Ð°¯¦4åBéÜù ×äï¶D€‹¾È‚¿øR+‘ìLÑ3²P±fö×lXí›üºa“Wf×É ¹?ddamE­­Åªâ5ñI—|VM8’ðœþ‹ -Zwà¹s ò·’;ÕR~Žýô/ô÷e€f ˜!- Ø 5ûšçgºl„†ZŠŒi/Df»GL.w¢Ÿ•@¦Ñ/„8””fŒŒ–Ï-Iû✠ýå¦ÿñdÝOÉI²£¯¡nªÔœþºý ÇÓ “뜜4VÌb:Ó1¥ý3e­Âÿ ‹¼_,“h‹^-ò‹8̊®÷Ìÿ‚_c>j°NˆÇŒ¿(óª_HZ֊pÂð×Ö¡©qõ©Ô`³—ŸËCù"S ²¼³|5 '– 'Ý#û`ÿµ¬ãV<ÍV_§eI”îþ¨I¹–?Ð!kÃÿz p'!éÖ&›mâ®$U2Lõ²›„+§¬°v‘ØÃSYQøv4 ®zðÀù)f-^÷ºÐÞ) Â6 ^çïñÐtš–¼j:ã¥Äæ@åHŠq¢J¢)1:ŒpIæŸ0„±˜ÌvÒ¶lûË$1Õ}#X©ÂaQ/ 9W–æ†È¶­³¤BÉîÍì8eÿ0óãÌ4Yô¼τ›u7ú¢È"m ÅT€…ÖìV‰ÈiênwŒGÆ(åý$<Õ2ùö¢zf&v~Áh’¿·â$y²±kŽP+ÛBØHE´‘‰.½^T(zÄøq@z‘…vðÆ32ÜiN¡Tn–6GªÔª¯²Ø7-… rä©5…×v¶áJÚÄ­  +⇠ĝÈY§aÓñ ëg8§çw–FþÉÏ@[ÑI·–Æw +€óÊ>M eú’Yô¼X¹mìg¤kÁ3Ý¿`B]F버¹wz<”¦ªø +' OD* +uwª9õ¾Í­hk9›ŠÈvÝ=­zðïsL=(Û&ÚÍf‚«æH÷3Ïò d×BðV³·ìO lɶ1ïÀ^efÕ?ú䩍¤´ O;'( +w±$ªòž&Ւ’Òôö{ÎnÙ#ѽœµ!*ˆ¥ù¦eJ î‹k»õ‰ôì’)…X— ÔGÚ¾’ •Â¼3ìµwF²”ð=ÝJŽ66Aôÿ^PÃÌéè9&QÖ%Åô“ˆ%Yö 3 +y—è×¹šÐ>nj;¨‘"YçI€Í®w•õ@µAøaŠ3ËČ"¼´°G`B½7¥8ž|ˆ"¨C0ß½›SûO,çç£ûAþÝf’>ݶ¶à¾¶È5bc¬3‹š& +f¯IŸ®åbl$9Àa†áÚÆ¢22PþiÞ5œLˆgÛs§ÑàâCg!ø~ñMúJsY +€å !$|«ÎýYSè«pc‰™çƒruú¥NÞYïÆåðü\Ñ­"ÛR‰G-Ð~;•ƒ»×A&øOóóšÚ4+-õ0ÜѬÌޒf˜*@…Fkâð +~ÏHŸ˖¯ñd·™ÉÀŸ&£Ÿl·#‘§ÉÖa:¥Š¯û†˜Ý@áô5Nﺼ4&#ÇÐüš.(s +N=>­ªN˜Ä;™Åő¸‡çYpÉZúßTŽùSV¯É÷{ÃÖ(Ÿn¶6Ù(š-§³‹p;«d÷œÖÏN{‰Ó``Ln‡C]í`Ã$†¸µã%EàYePã¨Þ®!ì?¡[ ‡R¶ÃšØO5÷ šÄQ^˜:P“ÿOZ´ñÜ ªu¾EéœtoKÝJªÑÈ¥~J/±¨½óu=+×·IÞì’ež—S’ÈÐ9>s2™ÑFÚÏßÖéÑGÇÃaTö¯ŒòÃN +ê̶òÛ 5ࢠ+> ;ÿ窜c"ÃÆÌ,Ÿé*]zž’/ ‘žo`Ëo±x»Ypœ;R˜hœñƒì‘$µ7˜ŒrŸ«*¤žQL¹W’¨$ÄSŒ‚ôc3ª•;«ª[ˆÒãCY!ØÄ·è´ÌvVœÔ&•-ÍœœŽ(‰×~çדsuM N.‚!δæUvöÇ:bcbldWñ±¸†–ÂÒÏ«?Î競íR'C;CÊ1ºœ UÔiMhpaCnªæ¨±ïÙ¸H¶#c°ø½ ,5|ø^·áZ§ ‹» PGl‘A-E…ÄŠ+Gv…y%¯Š=½¡…®Õñze?¹®eotæIm¯jläK5¤ ‡×¾9íð”¥%ì_úFçc)/Zãë= ÜT¡°¶HÁf™_4²…˜ÝKXœ•A o¤vñÂmFq‹j“«=t0 =çM¨[bødþ4Àœ fB; ìr¹l>åȜr¸ÆýEò² '‡;-xÅÒ‚–¡lÈ´.üˆX9<€ñÀ’AWM9ãU|œÈÝxgeâåÔs{·#ÍVٗ^¤{"”fÊÙ¢Aêšédìs~T߄ æ\ÁGɌ Š)5cÅÚËÏ텁lîú¶” ÷鸹¦ÃÛÇo%M¢ ¢«Õ‡ºàËoÖö”q¼ê8uõ~(ö(Œ8’Ä+R,7.´žCž# Ö¶1ß%¥è’h"¸#_KCOÉÞq“Ƶ$òc¢LÆ9C9Y¾Èhøÿ´øH»€=­’Y¡§Ú]"¼“œ‘0÷¤¦‹^̼¬§HO”T¬Œþ”ö]HeœcMìK5rB¿›{x€óO\µQ~“·]‡^¢Ð…u²Ž.†=“ѵ½:‰÷:ŽZFíá›O…okA1‚–ÚS؍˜œ3ó>+ ÷/ó"X#Y$âJ$ŠCía„³âÄZ¸¯ ®Þåû)$¸oÀÁÜ Ö½y{^-à#Þº&¨|éçTDҋj²ZãÚYžÖÁWg7•eÂAhýϐ·ôU[´X”ivzQòa&fö¶¥¢éojEËåèm"¨*ø—ï››¯vYk@_,‹‚Ö 4ƒLy훺[°‘êQ®“ÜñþU?$ù|SՀMÃøÛQ)ÇMk¦—6¥Ú˜÷ä¼c ê·ÛȽ¹9¼ë^ï¥Tà~ôqc̬c«êå2堝ØA·5EÉÌÜð_XÝ”Ð^H +êåJå®-H°£?gå„ þV â››x(é€«Àß]”¤xtiÔ"åE¼Î8“çF|Bº€•Í€^&Ðê©øˆ…*+èV"¤¡tO ˜Ò™`γä\2 9ð¹™ò)øs®¾ 9ÁíÊK„m”ìL¹ùTÿzÀ z'%ß^˜8~@±‹—Ôz¨‹c¼gÄûÁeb¸ùQ2ÞÅïª}6»…½*êºÙ]üãœÎ¸½k)JsR”×¥¨añ/)æÇðY$9÷PGÍ6ٛ´Àéº +áEZé'…tµ9[¿Õo„^0Tó¿ÁåH!·uäeDõ¶€%.HX’ÅYZþ>ª4-۝Ñóo@Ÿ˜·¹ê Èa‘ÙÍ" Ã$ሔP8éΤÛCڟ9d«k6ŸÑNziÝpµÂmÅds¤Ì¯­ˆ`–’»àPª»k¢~â>stream +×{ê°¸òê÷h°#BƒzšÛ¢üÆíUfÄÑ"Pä/Ϊ6If·m•¯iC¿^7GÀWóûO®hS0>AþV»óÄ1žæäET5ˆ6Q+ڛ¸QÚ…d!ˆX‰v¢ø¸gŸ7Vq¡Uw£tŒÐÁOÝAÒ eùôR¿Ï’æÀÄÝúÀaf8j%C;ÑÝöw^$N,h°w"„ì“=°‘´´”ˆÜC ?™øB«ø-$ċd' +XÁ $헶ªêÊñíM-tÂδ¿QސÕ;#àp+9´‡Ú”.\qI0JºÜ +öJÑ隔Ðj™{øŠ¬M-f8áKÊ%ŠøÙDŠõëâ¥%;Û +˜´x?”¸Yƒä3?‰Ýô&zÍîÿ8m©Tí]§òËäKú*=&MÂ(šPŽï )N2!×4/û÷†ŸÝé9µéýÔMû³Cž_U–‰ä)Èr!~‰ä¡¢ !̆#w÷Ðx6öÙNìvZ¦iÏ]ätU7¤eMS»·áÁIùÎ?cPð6Ãõc¾ïP˜|¶OSþ¶«—„ÀˆÚ ¼Ìñù>¬ÉÕÒ7C^ÿ!Œæ~p%‰,'sldCVLií{Nì8:û®$˜“¯˜«¸=‰ðbM©2JA—æ&R(«rÂk"ER,òBŸfU½Å¾´[áæºx+#ëÝWÛÓÂâ8>å<Õ)Ãq|–r…™Ò=K"ÕPËι¢Ïš“î-%ñ[¨ª-fI„6µnøo™;b®– Ánù- cBvtð[,3g=–¹ßo +ÍÌoAŒ‹…Š´¬¤ù·H…6ÿ@!·o)”äL˜íЋ¦GRãݳÇo‡|‹x¢ÄÞM74ÜüÕ²Bmÿ·8XÛºË$ߢ?MÖÓSÎL«¨oiÏ+ڜӭoñxìr°W°¿…*3“wP²œF|‹çÀd-SŠÃù–dKZì¹ÒXJcIèî[¶Vî¾ùÞå-¡ß%È·çžÍÔ¥·Ì»ÄG¨·,aEoh+!溵Cä%OZp¦Æ¤äþÕ/#´”­G.sDlíÀ½E¿zb¿§A'šèPoñ¤§2o t Ó[ìha홡VZ(ªÁ^ÒXXE½E¹PšKêÇE:o9[ôøH M9Ë[ÒáÕb§ö+õë½Û¿~N‹»¿ÿ›Ó¢Ì¡‹Ñ—‘@Œ0a²Ûò«lÍp°³\Z`m”þtL›KGgþOþ¸XÎhB6C6ñum~Mø*ø–[N +º€wC—ìØ&¦vq£PCž5y.ÔÎމ¹ªåÓ&z5 R#ÓºŠÁK¤ŽçȚ«°k¡0¥Éw†ÊIt±×îÁC8;ü*‘ž¯8öý’2}ñÉÉÑï}ú X£‹¾·3!)‰'¨d2gŸH4Ô‡&d$äU‘“‘¨8Qêß7š|šª‘u?kÚÈK¯{tÁ½æ2xÎÆ)ÀªµÞú¿Ã„´¡sqqÐüpž š–Hpï 9L™®˜˜dê§N  +ŽSð”ûê¿Ü=-Ün|ÄûNb†t|?/aîízÅ ü.iZ5¥èÀ$¾¢+3W@‹â5Îl5†x¼Ä8ÿb§v´©M«#ßÇACMN8Ø(òg€^©ò²_ ‘´Ü7„#H$JeT×°˜š.Úæ¯+)t¢ 7áè¯>‹4¨Bö5}\¬€ ñËd±*g/͂¥ÓCX¨3sҁê¡ 1tϚè[㦕?a¤½“~g3P5‡«r–¼á»F<'#‹ëÉ85ç—œï>R™y'öQÒo»oÚHôCÏÀb]²£ ež&•qfØJhº\lÌÃdw¦£qü  °E·•¬éa­g ní[êu mr!Û=¾&ό†F{ +™1üò7Éj¾[‰&Ù}U6ùŠ'á×?§OðݟÊËÀ¢"ÚñðvOKÄ=Èe,’1hND|ŽEî˜é)$•Fª¼#j„¢Š\CcN ­‚1p%ÃÞ^¼bil…w•A¥ŽP¹ØÓaz¯-ÿ†û*Ÿ°c­ +%ª¦ÿ¨Yœ³fåoåòIe +»£ÇÒ;¢êÌ입”DfiTˆ¦{0±¾Ã͂Nbå¬õq1üò‰á’Y4žGÀD'× Äa“}Z Eu>ØYRÚµ°×ùuç;¶ÿ¦kŠ\ɝƒ\šŽÃ•:iKBšÖu8H·"ó›¢ÃDÒO—Ê’žSZžàÕòŽ†TLž ûnçVkœRm˜yX +ÎB˜ °H]`U¶2WùàúJ{ <¸ …kë 7ÇÉk¯ &™ÐÎC\jCêܯŠSKÐð<·Ü0Ãúp““*ŽJÌAFùmä©ø”?á¼$,&þÔRÐzÔ\é±¢øšÞÓxYòhÄÃÞÞ£?m+ghPyfŒM¥¼tB¢ÝhÂÔw#gà!æ×útAÚRe;‰ôß¼;vozXÔkǔþB»§a(Üwˆ§Ÿ1KD°,V«Z­¸ \p‰ÖU—ϏuZýÏsÌîn˜8JÀ¿ÝTOÑÈ. kàHGÞÛJ@Zœ¤"Ncíýulú±ÕÈ®îÔ^8份‹ð*- ÒÔæ(MMY–±/úÉûý ]7ôI¸˜(,( +7ª‡ep„w +~á#†.­ +UŸ3rOŒ$*ø†Úuˆ÷Ð •ÒM2 !t?¥‘¿N'€@¦ïßԟD¦ÂUžK¤·7Úç Š“&A¨çT!a°1¥ÝÉÐMñJS_ @ܞ¯¤Æ¥2ÛS†<=$”{Ø Éh̎EijßàÿÈÏ¢‡ +6—â×Ó²ÅâÎ੯Ko%ôqþF™‹Ô +ÓéјüLK8=ǒªãWœ´ÂJhë¦8®ƒì¸!–]+3œƒÙy²}J°‰H›ŒíÓ6æ`÷ˤð Ñ×;d•h^WP&“q¯Â‡²Oµ; ¢ýbØõGj€ ³^Ç·ÆE‘EÖ^ÒuOgDþØOwj PÄ»`.€}þk +Ÿf÷•88¢ý²Nˆ¼óÖ«/ÈSû–/ s\ÓxuüÂd×îa)µ>0¥ûÉƾébÕf¦8mSˆqU[i;m íQZŒÎ{Æcè=ØaX¶)kÒ†? 󀱲A•ÌC™âˆäOÑ[õhOð-ëlfØ +…®< öŸ<Ô~¯4ÔN™½z.٘== f²Ùøê@'¨i%Nlgì!”½ClƒÉñ¨.’SwyŸ”&Çý=YÙq¨I +À€V~-^´/|àç}v0‚O,O¼…ñ"¨Sï'ðà×="ÀGîà­mY±å… 5ýZü-?!Ã.:¬ Xñã‡:rÏ>CéúCšùŸV}fH§=“ù)%…©Iy|×ÇÒO2‡‡ÅÊזŽ¥ßŽ:s}qß +,/Å\ké8ÏxFȾäÕÉhÈ­4ïÄ ûñâɏ>Ì™2L[4x‚)®WJ‹Žõ:Pœ*¦*ËÙ5wlÈqÛ#¡‰ +¦n òˆïGŽäw3(á2hž×JQS yÖ Êøe ú˜Œ‹pŊCØ< žûŸ™ìܟÏÜîLy¢Ç7Ž!Ýj¶š¢ҏØɁµ#.:+ º'øÀ‡^áBè9ÆÈ°ñD ’4IøŸr7çÔYzJ¦bw¨£}¤ÿÐ#ïOâOCÚ¡‘Ð%hD9j.B¾`àšÍŒ‚®“”' 폚Ý(T$5 .=«`ð† 8My`«…ÅaIP »¬€ÂZ©ÖsópâÈ°IRå{q@EÀ·ôâL\’²’ðø(ã›Q9oUG½I´Æ³ÄµZm÷hè€Õz=4€¡GZÓæ̯qª+™blûù¾~ okÉ(Ϗ¬:ý‡¨ èrÒh¿›»Õ°“Œõ¯4íE}¥Äk ÎébK…Χó1öœ1Ž?W÷™IšdsŠ¥QùìÑLí0ÎGèٖ9&”ãð¤D»Ì·=;‹‚QiT%;N:_IÇØ!'?=û^=¼z2¿Q*DZ hªcEáM—ˆ’>œd1™Ý¶sM¼G(OÖ´wl@ÇTäTÒà¢ÐV¡+àùKÛ'𭚜‹>ö³§Œæul†Fvžn“ÚsˆU”Ðm¨+¼]L ¥| œqC5:³˜^brÄÝ÷®˜½TKîNæeàÐ;™ÉãðJùÌƯ¶]3[_A~ær]¯ŸÇSé>aSªP³Î÷tÆe Ÿãé.–/Ьèm7‚…$êøÀf-FµX±ý qš"ˆÃå €içÄ|T?’ÍÌîxé°Ö;B”¨Rœ­7‡Öf&©À§ÿ‡½wĬ‰ÆóȜ3¦Âlõ1’“í‘Bo%™‡»Å/Ò8zªµ§ÍV]Æ®švRF£%%Y|75~×of³àLǑŠÍQÄCÁöóAr}²’·…u(4>ŒŠ¥oå-Fë` ›qÀƒ‚‹¶Q,Òì]̱‡ñÇn~ƒ~²{¶è‚«…Ìé¾û $ó!xe¶ú¿XpiQOeÒþ‰8`çÃ5üix ´¡†,`éeìv’DÜyñ4úo%ê4–$Y›ÄÁ mÃù‹‰›6¨Ö­3†G U®Ý<²7}$ÛO;¹PìI¼‚¹êO¨. ÁY*’Zoc·,dë{{rZ:é¥6YW’rA7‹ãñ¹‹}ÓL#Ý°dÝögOþ`îÓ[E€„Q´+““[ô<¶à¤¡pð!ŒÊäɟÔ-·—MoeõKž©Vßto¢4O>ÞrócÉø6sQΑ$Uç´gÝÞ¢a¯E6J÷v֗ÚÆ"’*á’Â*¤,:Òá²×ª£1§v¾_î>¨ñÆôôÅrr¼D0 ÅªFßòÙy`¢ßÒõŠ(Œ‡¾ÌåÇ`xKÚò¦ß}%9 ØÒE~/V±¤B¼¾4Vœ\ÉÅi´³+)j́¸<ѨЫî~b҈ òÙϵšT¶N€¿«TC ¬)T…â>ÿñ=\˜]v^%°¢jÊƌq|8«ë“Ô ¨˜ +!|÷R´"ÒVaÿˆBP4¯³\þ°ÔÂü-÷G¨§åa·WЇvIÔþú^eœ.'Œâ§#Ezw#m#‡¸a_¬‹H“Àxvùãª1ÖrÿÑ6‡AÇ"¸„Ó NWà³95)4´)(^vÚ۝­ŸsB¶ÚÄQûî³ø¼hÕ¯±Å¹±zyqD¼¦ʕd@(éJ¾_”ÒÄ-(=ö +*|z]5˜’¸+^úB#tÐðâšþVØ䉧›I¥™u#`œh†Ø/q¢ÞôŒ* ¦`: gÅê¯í©*¨‘¤Fa’¸“”ÕDBîlÁð0Jž¥°‡³GÃÀ*á¬dA)” -e.½†Àág@4MÀAZÀf,bQG<†UÙ¨Hò¹Ž4£÷;m¸¹T´PÓÝnù5ðP Yû¢MSE҂˜8ÜtÈBì3*Y‚N¼üÕ/L,ö‰ú©*ô½w—žlæ7 +c]8.ùä?zñ¼c™·é)Ây¯PÙgãGnœ LJè¼Øøð§bÆäŽçïÙ;‚c +¥d:Ñmümfvåõ‚¬§NÌM¹H¿¼;áë2›àÆlôÙ?¹›‡¦t3PB ZtÄkê_t)*\b£@E)‹h_ë%¶Ó“õw'Ë.~"i²'ÁØÍ}õ3 +nDµÓÒ$ÒVðƒ5Gú ™xµ'i®nÌ %îMKvj!ü¾Jsr9†ûôØ°-fÃëÍÎ5ò2ƒeä±&la19¼=ÒpW#4E*䜐ë'æõO€©/ƒ_X²Æ˜!>0pø73}Z Nj€ê G¨àñ8vŸ—–̵IîzÞm§@ÌW €^ÿˆIŒŠŽ,m’"˃:1lAÅȐs˜»6¨¦"ÖxìêÝ°QÄ$·šB&7áÿgr¼Œ=ŧEH¶TÊѾo€º„Ô +SHÂñ öèS%ð;€æz¥Y+¹qjüçüã_Ú6H²'xô]a0!.õÙ¨–í Mçòx=b1´6¢hŠs"=Å ¦›¨@-€æ”fx¹6ÜÁÐW|ïçK‹û…3¥ ÒvT‚$ߤ³xçè¤5ë*~Ɗôøâd„ç–÷R‡}/›%NçޙÇð*¤]Ouïžß¢ù8&·ƒëAZh1¿Eõõ=Åù¬½ ¡lŒÍD;ªL‘PFf‰‡CyÜP_`H† ï-XëÁ¯qu|Ô  +—Ò‡ e.8išü•·±X­—6ÃÄ3ÈߑÚoŒž ²ûA̕Ȣ$íñb6_=àtcNƒÃUR¤4 +ÏÎGgé,6Påà)â¶ïÕUú˜HŠ¿ô:Þ¤ôíØ h&îÆLöy¸»Û¬2”å•?²Uû¥9 HÀÉöÒåz!û­8 ß94K¬Ÿ¥p,ïê@œœž­§™kúw»¢_e²t ]!áEæ'K(­bu«F¦æÁœ4mŽ˜á.P? љ×‰¸«\Ž :¸nGÿHòæå7z›µ ¯Ž6rqÜž‘ßÔô q5/Î÷¶ŠÂgEocÿM°äIsJªÔb"-(Âãìæshù‡gåӞ½cû +WÒNêÎx™(ªüaåË=N¾ºðæ?‡ú<r#IÇ®pR šäM2”œ”Óýf÷¦D¢] –<¤ÔCxFg×.(HüÖbAÆÉ&ž$8K[,(ÊPœ–²>aütY¼3u€Ã['çÃR®~û¸Ö󙣌:Uòé²L|úOZ~‚Ç_fR˜ð?KÁåO¿¸?Xüƒ62ˆ(ÙÒ=:’i·¢—Uù烻(Ê+çîcÛVið„ÑîÕ§¢M»ÁŒÙÃg·x†4³rHF™efÎ+D»‹ó]§(”ûÛX»umÜʔG:1WGzߧÿ®—×ßJÙŒ<¿V¡Ú®à¦å¤å#4Íò¦RëM&臄œ™@ø? Žà6Ÿw`,†Å;Â2n1=vŒÐîKã0Ñî€åcݹ®öEŠ’ïðSŠƒq¼÷f•6ÜèmgxäÛ]®àž?¯DõõèÏ2ø.ðuZJk¾¸Œt7éPM,~G1yÛmGfèy«¬éL~ '!Ò6kÒ¯†‚ìÓ09»æ 4"Rª œýòw4Y A'`ÒÓö†“ýAGmtH-üw]J$ŒÊ‡í`ùÂzU’ÂÄÙvŽàpCKóºWÀPPwÂûó¼&EÀd(Ÿ'ñ¥QøòŸ\h(µ„Úɉ2½‡q.Þ0Ú!ô6Qæ T>᮶Ü;:GépX– +ñŒ>+èAXD¬ºžƒgQ[å÷m÷ʯ=/×íåH Þ¬ ¾å¡5æ]hŸ+L,êô³°ÊÛ(ÐÅýOÞkCf˜­E B>â:~ +Þê]>'è Hž+bo­jGX’¤-ö +¡I…3D…€?èKêé¥YÞpuLÌx¼¾˜Ï²ƒ²Q&0f”tçØ$¾Óð¦‘ya +Ï7õ\ês4ÿÅ·5ý;ÛÕþŽ©TT-“¿‘×ÉÀ´ÙšRRjùÖí£QdâÇg R_¶€méחþ9 84³¼Í!,º ¯“ýÖaÌRdaŸ…ç}yâ-Œúú`n@Œ—0,‹õOÀ>ñ·ÆhÎӋº#– åë󛛟ÅuQûƒú=QE÷¼\€•wÄEìÑóøyJ‡,ãŽGî«WIWµš&0—åB:^îøWó”ín÷¼Ë£B²!ïŽe®qtŒRk±»™û.ã¹(šþïÜ+ ºSOÙö£Mä#;nòãxîN#ŒüÂVá8›ÇÑÑ+ єÙ²Êròe²kåÂړô¥(¯Ê %l™ê¯+`gFê„50‰r^I@mÛ#Œ†wŽ¹*ë ²9ûªe>L¡²œpBwx Î)×[IîvB6•…GÄNKjORô0šâ–.øþ›Ò¤¡‚,>Î@·ÑBú¾ 4Â9 +(5V궹OPBC:¡Ù_/é¶;×+m"‘ÌÝ6ðÝä2ÔåsŸQ¯{’n¨çÖÃÔï—l"ðÄœÁ~²I Î}÷ ¢ÑÛ"h&aiàg#Ï÷ཱིƽª(‘õëÒ/¢sÿ˜Ÿ{|5¾ä¤æ|¿ÒSˆ•(ܑCG’Zp~¦Oã¡?eóËÃÍ=­<©„U~Îjd4?<½Áóΰ³ÃeÌù™Tpאìà$id ù¬ky/8±gÄnŒæ–<´ڐktÏmI´7ҝ†ò?Ágž¥ðxKDf ñ:‰ +`IM•ÊP¥s­@~ɐ‰j?#v$ò¹'È + +"yJ_ÒVdÝt ñ#‹D͍àڟIúÞߪÚѕ—û̎Ãc) 2½ÄEÑ(ƒš9ÎÝ!ùT%âàà¯aÎÛü?p&a¦¯9CŽ±MCë/Îv”[Æ0™`T?c‹*îF¬¿½¾·„ÔÑ"TŸ|^œ$~;&ù-©Ö°ÄÂê^}¬A÷œËÍÜc"`ò•&‚çEä¢aÑÿ²Œ‹™øf¯`iËD\¤ºy‘+ÃS:¢N?|âG¨´¿l,ÛT‚g(šq{µ’FÕ߶,9µÝHÄù„…$1ò'ƒ$\˜NwMb³±¡UÆ5ù* <Œ_kìíÐ]ü¤£‡oÌÝ+̺§È۟G‹Â&îÅ\B2ðS^ªë t׫Óm¸6jç`©½ïP:0ç”çŸ(‹¤c?žÞ²wìE;² ý’vL±?„½Çë†QUivÃØ®“Œïä֥ܭ=°Ã²WBD ”qR„éÖ6¨ËV3T€§&]lo—Sõ>ûÒüA‡4ŽÃԅY PsÓåèfvÉá‚Ë}ʊ3í¾±˜· î!Âûpïm¿qÜ*ЍãÁµbí7%ÓÚÇĨ$é ·ú„¶‰Î‰”£_¨ß‡–œ|hˆR=|pKZžJ¿Œ&5™ŒU(ašãCh»†³š"YŠsxI¦?ÿà䕁v~Ù2{rõ1€,žÎ‚I¬%1›z1°u(ÃÉl–:ZYóó8 +ÐóxM/9]—)2¬:Ëx+`á1}S±†soR$ôй|n„©Gѕ ¹ 0#@Äòîã>AGòŒ™I8 â6ÎÆ0Ǖñ¼uŒ )6ÞÜ ó„WyŸUەúëó©­–pߎwxÏõwúgÜÒS´¡ ^özy]DÀo»öØ"³L°òŽO|ɺ̃z2“@ý+©&L'¦3™k +yšÉ_&éÔ4U—$áH +ʱ-Qº^90‘Iï™$L5\@©ôž?Üýþ?/5Íp‚3K80WœºS%ºžVyCãFfHý®¤Éô/ÞäLD¡ÝjŸÌQQBv,æêFٝ¾$¥ÄߧÏTz<`ëôkÒX»×ÅÔ,1fÕ\êâÕȎ(˜kÛžŽ˜·,xwß¼½Ô’Èåf¡TüE +ç6w6!ÊÃb3í³';)«6¸0ÓÛ5>UžôÌ拫¿¼6èžì\¤Ñg}™Ó6mÐßï)TµÞӋdWŠ·×;x,æªá\ƒ¼#”_V ™„ûµÆðãÄB¬îhò¢áDð;嬭©Lm$mû/nMx]ä<¿«ÊûïßðDT¼m:žšâˎò®x^ýÞTﳍŸ)CýÑOzàÕ3 úåeo ß»°TË$ì@4¤uC!@‹-–z¡îLÔb-ÞI¯dmƒ Ø+àç°ç9=qê.Wtœë›%6ø‘Ü7¦#ƒSßhrƀÕàJÛÑg@e>’Q{]˜`1ÿdLÑ>WôpéTEíß6U[šH0vFhÓëÔÒÐ^9?“¾6.µÐnû¥KLô"-Q.xJ„b»¡¿ê’„>©¢ðGêØò`ÒZƒ´FõÞqò.rç‰KF<鎮»›¸½{E1œ‹cóøý=Å_7=/Éþurî·vðJÒV³¤‚Úƞ‚Mjw«…/ÇùAæ:‘Ž£–EuÇAä™á_« ͵m$5xC4ŒRâ„/4ELٞZ¼-ÚàåªËŸJìPÉpàÿ'rÅ5BÁÎx’RȦ øAŽ’燞¦iç9Ñ30¬C·ù£ïŠe·qsfÌ$Ýz™¤Éb声öa6´“o)sµ#¡ÇÁ &añ®OPò+ŽcŸSZÔaœ&ÏhX¦É÷Büþ˘bK!€}ðñÿ¨„£BŸ¸&¡ÌJFJX€Ôάƒ çMÏFÚ ð&¶aŒ¤°*±DïœGnÊ]Ç(c¸A©PLP~¾rh‰Õ|ǑES™˜;â"Š,gæ°ÞÂÕ!Üh:Fô¼zט›5§š7Vá·iâv=4Aâ€!0DµU×»H®_áΠÄNê.èï@‡*lRœT½_~õöÛþrçz¥a;ài¤EWs¡ot ârõ¸íם1眆H.‘8ÈTfæÛÄ©ôeù[¼wä” Ï6ƒ:êšTƦˆŽQdù֗ÇÉo y¨Dš¥ùr™D¨(Zjf ¸ªô›Eñ8 –ž-Æ-næmPwFMGùµÊØoFíËí5”_÷ȊIJàƒ“±×k‰"Ëâ:ä¸Ã1#Á^Ë,¯Mרÿ<Üj{üքNÎ$ûʔ†«~’d¤ã´%'‘ÏWÀÊà©~<ǁ8Å<„¤q!øKÞ'¥½!"*ÝÙåƒ4—ò#„ÌH¼<…‚ÞUŽyˆ¾1ÐaÂÙµ15Ëd\=4æ`/¹s¢b“Å®€Qºîè`¬«_;9sDM*‚«T¤, +»¦|kV< Ì(I.þȕGÒd$9ÜFaúeY\­Š‘I³Þ&5ÂFã²;_#Öd8!Íî*Ì ÙXFýHžëõÐ ]¼?–ÉÛñ;‰ßëpbB™¨Ø…VÄODÙÖLÎïì‹b‡ÃKxO2h¼Ã%gbR¡ Ó?lŠPŒòrTN ž:L $”œ.¨H§Oì6 Þ„Ç£ûïëÈ5÷HÅÑ +˜Ö’+„ä†5…ˆ¥¸­Þ•œu–ÎÊo]Äê”SьgÚYUQ¿ÅþJp>㛌qʊà1šA^ëª7 g]çŠÄÓ­XOʲLó'DA:Àý¡œ2yÝâv£ÔBÒ6ÞKd¦ãq—9è®io±7TSüÆy¢\[:ÐF”¤ê6Ü1nm:/¯J‡Wb•³×Ê Ä18I°Ü•8²^Þ|ßUÓì˜â)9³è͝²1܌Q®"ÍeÆòOõ¤|m¶v-þ–‰ˆ0P—Ö)‰%£¢pŠÒÓ9…-́¢k놜X®(è8`šnºq»&Qv›÷]ò<Ùe-Áî¥<:¡*À©)ö¼DwIèY87]ðÈ#0Èec¬ØùN彗òtziSj™=Sb×Le!‘Wç¬ò·Osð£m9(`Îf›@Ÿ¨äXl މAß^Z™8 +ãm2ÓUÃé÷5ÎdK’—âêN qu2‡'ÉøÈÊ©›3¤ÉñŠF“¬Ûöfjݖ甕M•¿î%Ÿ§Ou^•?¦ ²“iD“ja`üYˆÁ8}·F‡Ý œÚq@*­,Z:7‚â%‰KÓ¦8ûÅ÷ñ‚ *43ÊaLˆÄýÞ¥'®bóòOÑåU#JÛybhχÎ͕ö†ÁُÌý‹prw‚«. =¦‹ÜoPSƒsð›zKÖMÆ}™rilÚ@$'lA‰]m*Â*…˜1j&WKN°x{3Ý7ù—Ë-HçM¢T³Šµ:™f:…êòµ#£A ҆áüÚŸû×°»x­VBlß»hE K܉Ó%UÞ Ý=½“˜cðx’°cü`Ô+}ÃgBå‰Î“ˆL¥ÎBÎOÀ£°XYÄ •0Ž%þ0µ +YV—,ý%ÂX‰Xq¸e\3Ù”[XJŠ²N,‹lêÂäiŽmˆ ­ `x¹#Eµäéaö5ÝyË 0ù¹ogQá,7fðrb„.£û†¸ôùq:¸<‚ö ˜UنÆ}žeު߮GÅSfcsEù9@…/2þvîweïÌ²Sy~Ä Ð ü¨¶ë2FA?ëü¼y®Á î-I\Á×ۓKKM³föÔ%L“«ô§ÂÒwhÖñF7Àø}[ç«È_&ÖÔfºó…îG†ÉUÁڐ¥åu¡S[¶kƒÛæbr½MàãÎöskå ™ÎßB¢$V"5#‚Ðt C9$ÏøDÐ>-¨=Ó®$±Owã#ÒáÈ´Ø®÷û.m&Šªi™Ù>6ð1̛Iïh$Œ9…Õ}1_»bÕâJ§ ƒ†“sµˆäžºâ×å=¢ZîakeZ‰±ÕR)l-°6¸ÀË÷Íþ^K…߃؅ŒÈw-Nò1$—žŽ¿E.ká>׈‚!ö¶Ê£¥µ ´1‹9ɘÂMö1º”°¨ó9S]-K»í¶«UÇ(HA²ÍS@_—^-B[ØE +‚÷¥hS-“¼Ø4Çu,²qPµÌc,üzI-C‡§.þ-ÿ}Á‡FÁ×G}a9¯öž—³–Ôòƒ„eÎAL‚ÏÔ2„ìf³• +rŠZ°‘.p?Ô2§œŽá¨å~±GF®Š£œ„¤H'ö@jàp[LôèƕrIÄñVš0F¦í¶„LH-·¬ìv Š­—RjšOS*úí©…ûÅWÙ=*³=¥X<}©–Ï´»˜ÚîÞÃYµ N’ šðc­¤¢,Ý ÃOq…7Õ"XJUV$g‡2˜B&rI•FÅÉô‹)Ï<õϛ•Ã «Ù®eù‘Ðw…šiҌË&nÿ'•â÷œN€áTH«‡›¿åÇPH¦dm¬e6ŠrÊÜhŽ—^’öÔI±V­GÝéØqRΔ‹]<ÉS›š[%FÞý´,õ`/¬7ñ²N ^&-„€jpS#hù&Çíá“ãm+l½ÖçϬ¤œ=½êÕvÝX<‹°*²Ð*àiß\¯°p߉CMñÿn ÑÆ0涩ØI)}ƒb Ó&ᣅ]€€ ·Ó{ 5ÍäÎfÿ÷9Á^5{œ²Vä’ö¸c6v¡,Àª´Á‹¼ÌPGÛпü.ªd.Ž@~13 @ðîÂs¤ª}¢[6$Ú`¯ÓnÇÚքfhV’f¸ªÝHÛhSoçÁņT¤H‡:XÉ$'ÉE{qѹ‰¨¦)Û<À]'Åô“ÙÍtq (™Ì 1øˆ|%~„ +%-¢ëŒìçJ5™¸nK«l¾‚ÃÎ΂E˜/ + è÷26MSlȟ-±eÑEs ¢Éù_Ò ‘ÙxcÚ$͸.B³™ ‰ÿ²BÑÒ÷…›b PTIë¼r1÷4PBÞ+ O×­òšt×j(ÇÈ`~їRÿÐ¥OgÆKAh‡Û.ñß +BÚbF€˜^LQRJzŠÉøҔMÐT@üylÎØι¼Žˆd¥ùSmùèõZÔ"H1Ux¥Äc>>v@q¼[l^í™Û'‹Ào<ˆ=…¥U]}ÏhQ²W +:0³Uò¨øg>-ªf¹|¾#¨9À}‹§=ä«))G@æ¤æØåÊfÍóOÀA"ÀýúÌÈvøà‹©k“¢®M£´o% Áâo’γ3¹½‘âN¾‹τ¡À!mÏ@H‹ô¬(.f`•ôÅ£°–½Ç;ÖpÁêRXö0²Mߏ IÔXrc“ד¥C¡@Úªõ€'¥é–Ñ3SUÀs õ>A`¡ƒª~pזkÖfX:{eª™7ò^EW.XÞ+[·¶d/~²|[Âk³ìˆ7˜@m¥HýRµáµˆ¤¸ë¹¹·Lžpϵ?ìÁ•Ðf€›’ö¶Í´³Ö;Æ3ˆââÞº ˆ­`,©³œywYá[z”Rq¤xٞþ7ß0°ÝȌ3V9» û +iÅiÞ{ΐ÷r8nߦdGhA·.2§á#ª,I»…6%tÁ¼¾–ŠòYaC(O¡Ï7ˆžÑQo¸÷ž}ˆ“ŽL‘ËèÄDdz¥[g±ÐH6æwA%²«SE®äJ“è>wÈPþùÂúñBÈé.‚S€Œ%tŸpË_y[^‰åŒÍj¡ü! ,£˜Áî–3žQăÛW8ðlÈYéD®.y‚ÇW¸.ÿPI߸ šY‚‰Žow­‡¢~¾Ä¿¬œÙ8EŠ:‰.¸á%SSÜú¥\™R þ¸³| ìDReÞ(Mû€` +*p¬ˆÒ&×éf‰méwÃCö7û 0úŠOiá]¼3hL–6Sêçeï`Ó8}cáËZæšF땋ʼnÓ$X‡<Å¢ܪ)Ã8EOfyÔO¨RÕÝ¿¸{è`1ÕYöxœg&\Õ`FŠLý÷ +K*D‚åòn5Ý7ˆÈ3M‚<©ûÀ…ŸÅ©6åîèâtžgê¶G– G7jïU@–jŒœ×!/Êd‘àž¯ræ¸Å2õÇ¢Ø7§rJÈí ó۠Ûi‹M;Î#ÑNi*cL';èËwïs.F'øÜ •U‰4ô5øó2‡B%€¼- Qa7 -’è䌦ŒØzPfaHºB‰CÿÏÚ@Ûà yþa;™Ê÷z.³CpÕxô¼Õ~à@’åЙ€ÍãñšbIüÉ!H¼òYÀ78©‚¾ƒQu5JÖ¹l‰ 5Yê4´§«´ÛÉ\Òu¦ûH©eÎ}]*[È2t>ŸvIPQøc +ÒÂmXt|OD‘ŒÀ'@ÀV„œ N´Òd­^.&¾N¬[™·Bh€âAaÕî‘Y6ªªQbÕÇAÅø  +þÜ@‹½£sᣪŽ‚þ¼U“Ú_vÉPIÞ¯ÅNš¤üãZâÝ:MY©€œ‰·C¥}¨¾þáÌ?¶*é#«X@¥eá›`]eßS¿AÌ]òÅ5Áór|üAøßjý ¹¬g9]3ræäöx Eê$­çÝWêr'"Ç"ójéúr8뽸Ù1È_PxZ4Þ¤i$ gi>càXäJÝ"K ½Ò5á±A~ŠCáòÛTÎÄõT oÙu葄¯vk6Ž`Ý ËWˬÎ9qnó›Ð"u5Çõšn½àƒs„cjmVzAw;±`ˆù®8ˆ1LæΈM^>N–êÞwÛ³¿Šò ݸI«ò€ +½c&Ò,xÀŠ¶v!/-'çfEÜZ­SÞUÄÌØ¡ýP-V¼Êu#Ò«u~U_uBÐ «^FM”g1—“SëTlðbüº€«Ãò]BoúY ÌI­*è:Ÿ… :Ic]E´0…ːè +—'ïz«sB³3J—ç,þk±Œ“uĒ f ,-âº><¿ð¼«/1£È‡Y²°@‘Ì"Û3üõ·•Q+v`ƒNŠüØäŒßܪJª?T¼β(ƒìŽýêë'8*üË®š—ŽÜ5p³RÊ8§c¦Ï”LšÙVýKšùd õ׀iS„+2XÛòë1}W²¤ÈÓãXÉEE€dTù=–võSÑñ%^¢£D´-µ€“‹bçRöò:QsEá_"¿v ¼©@YC7¿Äý¦E}À¾ÆÑóÖGàèJŠà0á€p2Gôu(„£Õ•“÷`ã™Ñþ¢þa“ø€1{£P¨%ßCl+¦—\Øæ±ýØfØBs·ñ\àlŽ³÷ôˆ4\¬þ—iÊM¶Ã˜‘ó«&ԝâ¬òR2b*}ôÏr0J{hó¦Ê¨W„êÌLD³?ph‡’m :¦ À…ótdk#ïÖ*d®E:‰pŸ1‰àw8üje&kŒ±!Ï7çP†ÓŠº° ó 0,‰ÇžeM9Œh=,ERê~f¶“渜éÉ-¥Šjn"Äúê 3"q–Ñ,/„§¢_—n#L×®5Ìj*Ãþød‘N€²ýúp#îàq³E ×Ä\ú  ©9ɔÍçmM>`e&BjD'8¬Ûg½ê+*P@@áG"PÔIm«¶ÇŠ¥ãٕ´˜Y7ºŽ®Ã)·~ˆªkx—™ËÂÛfÝóR"Ö¾ï%ÀVpo„*z_ÊqI™_zFErŽ “sQ4ˆnö +êt¤0öä-n¤ +ˆÊ0pÎýEªÅ«ÞÈX@§çjIüú‰ÝÏÿçZÕªnÕÍâ1{54cÅ3Ë3¨Tæuâ2ð©]øã—Ú0ù¤â Ö1²Ýòëoø"ÔÄ,\½Y¡~ÿ> …¨>ì þ¢è!÷ԋ'/Šù¼e¡î%-¹.¼¢ 57ֈÿ½'J­šŽFèÀMùâö܇ÊW¥‹~QòY·àçøXÚ „gË~âãèïï/ <ßoÕ~yù×\*Åz£*wÅ/OC…ŽŽ^Õ!„Þñc1X^ §)•Ý<¡Û?¢¤)QÛÐxøLr‹.J¾y—ˆÿéöãq>šÖ¼5ÁÕ˜^„Úْ¡˜Rw¿gëni‰´þ7â؍—†„Ô-ñ>òG„?þ±ÿ°ÉŽÄ¡ãd´\]ÞµÖÍӍ‰‘°±§œüõ@6_קmlò5ƒÜ‘ɉ'P$–±¨9}B@ׁ 3ðœçNÚсT3`O¯ÉAÉ!ª¶VßVã‘7E ¼¸ÎÐ,‡|@XQþBÆê åށÕe³³Hº¦õ!)óBÃÂæUÔ•Mèð|UĊ4ǺF^çcv. ±©‡bž!ø!™„·Jü}LÜǪq°À.~iªrfÿ(·à#ká!DglbBÔ¡  ÌuýQ¢Nün5ŽTW´Á& ¯£?Wöi7Ì;Ï{>Ô\ ‰¢T3FaˆÑc¥Tæ5‹ Œ&âBÓÉцá߃ƒý~—Ìt{öóÉ4î$Èns:~CçlÚt~l&>£ Èk£ïm eg¡¨­þÎE +QLÔ+üàâ£'(×£ã4à`®ˆôªäùÕl%Á•±UêV°ç9_=>'r–s²±© E¿ƒ›9a‘åwsü<ôš1â c‰ôT<)ʶò•æ&ÃÐ÷ìÌò;ŽùÌøQM'¼«‘’§ƒ¾2o1ÃÄLtÏu`Îëiõ¾‹ÁΒvÐ8YG‹R-³5/b¡,PxAzmIۇë¢Í$ÅA7ËÅây°˜6ïzÖìÌK¤ÝsY6á¬ç†àBèâ +ø‰µÁŠ’ÎÐ7DÑ$¶TÐÄ Ñ}ìIâE•ð"ªI.¡£»HÚaü†+%ä;)&è`V+ÚRìÊ­^)1äj šõ$©wP߰柘òå ûœ«Ù:”µ‹bp’֝62ºqÚ6¦ˆ3»¿y”£ù­‹5s%½“>fuÕ“ڇâApè×Bk+%“r¨3X¦µË+ÃWØ|Ý°hH2캸ü1:b®¨üÖʃYVÓº–í¶˜÷ãZùWöYÀt›ÌB l]'ÇðJû€èŸïap·r_oÇGE$ïDšM—tJ§¡Ã›µ”7¶±[¡ÇFñW[˜ñ~ÈU©wHf‡Bk‡cf»ª +S}T[æ`;7ÕÆh²lVCç.Ýx˜{Ûm«Ái1h–¯î®ƒ-¼£éâ´´°ÎG{zË÷ž>ü²Ò^‡ –ätógØrg™dÀIx^ó¨øÃN蕋VQR‰7 :³ªg¾ +l;˜Œ++xúpÞ^«k!ÏíØM«´ý§Îûþ‚¹šißÔ­+þ»|„ +±Ðñ+‰&Vp9ý™ýÚFÛΎ©3º–~Yš¸ì¨íðý7ÁÕ??mMh)҈7áÞ¡“ž,2Y'˜Zƒÿú”éÄRM!¼s¨=fzë“ò§¸§ÊdFO ‰§˜ñ†UIAûƒˆÒ¤ˆæ,J{cœ”.ÜK†GÃEƒH¯æ7ÖLÁþjòhP?èMZÛÑ ­ål1÷儱Ú|×Á +1¢Iƒj*g.ñ®`qîB›Œ‚„Ô …Ñ–”V}C4ªž…“ºHRÝ?oûor²øz¡X!èþuˆjàK®Š#¡±rL)¢Ž”àóûà`ùýëŸH +?Õ­µ!kp~‚4ÜE§“1¸B—¢@¶T¶y ­?Ë4±®$_Œ@ÕõÃÖeåM;DT–mbð³ŠjVå2ku¨d^©#ŒnhšyYoçûû[~Ç¥«K\G£ gGÃ8QhØjV¹³>r#¥F7…f§”÷ByÞÇ3Þ/äRóÂՆúšØ˜irvqßÖ?1ç!‡ÏpnD ’e¾Që]WKJkGàÔSӟiº¥I/ÛãÓ$ÐQ¾‡22­ú«(T”êú\!›¶O…O`>' ¿›DƒºÎ¡@âIAò3~tHlMp×êCc¨=‡Ç܈ª3x-‘;Ìv››ë-ïU&ØéK“-î³þÿ¤n6é?è|@BR\²m.oØ,«ùu6 жì¨û#ú™_â +DÙ¬Ài ;MÊu¾D£åú˜U´CR(%ό۟æ_Weä|RúŠ•vÚ7 ƒÌå1½·’‰ÇÅý:[ÉÑãA,w‚qéHgäs€)Þ¡5› ՕÐgž5íÊãûŸù¼Æñeݍ ]Ýӕ Ð1á#¨é 9£ Ja–»ï#'H,Æ7Ÿë#ö|,]‹ô«ÐLsðv F— MN8èWä)E®Úì´¥ËFš+íxJMÚg[üôx^&¨bûãª_¿4öë*[l}5Ça;ª™V‘ A¨Åá•–+JZ¹¬›K!U&Xø5š¥~S;hžž.Ýy!,dºT‘*8gd– EŽî8Dó B$íCÊ_[gpQˆ*7ùãÑAJ“=]œ(ö‘³é¤wü„ã»R2Èh¡ú}^‘Θ²=/›ÒŒ—±˜Š&ƒ*]:µC¬y¶š:$zãîÜfž >K^˜¹ Ü7tÃK;bÿ òÁyh ?©âÇ.C²¦-ÌRŸÛX/­ hf³²Rvô~Ø~K´s(»9ŒGÁ+9?úV]€2í×%{÷j +&ŽQ/âTæêDxŒN —RæÉæ¼kfAføw0XÔð-Yš/$y-֎Ԓ`TÄ2ó#,ÑÜ= ç8x°VLwv‹Ò¯f‹==cÒ¸ŽXÅòWík9ùá–ÙŸðÓî”áCØ~°ÙéدѭÿOß+&|ûiª¾F·ÄÕPŸRIºbªmžž³øÀ£g‚ßTã›Ú½Bf}¤Ú>ÆIW‹ÍÔÄŽªs؄¤[[á›E¼`£çÏ—=Rf‡3*³ÂÆ¥ûš¸úí½°7!Òà\SC¤SDÑ1&-Ôæõê­ón\"c[õ`Ô0ì`@ p}åØ÷-3±-¿³ý§ žåµ4ó2V“¾ÓB¦Ø9ÝދJûB‘Â`'%cî)(HöŠ°.N+ÊÆδŒq¥KF m^Dæû{šu¢øäœÆ+29P7˜”hÆ£)ìFSR¶gÎáM/.Mþ0“¹:4?`Òt›x8Ôà—C«h°:WmhégJˆßȒ¸Ç¸4*Dû֍på R͑Ï*BRbäÂ;oªõѸ¹Ñ_†¤z]¾Ì¨1³ñ<öSKb^QÜ +ã¼×wpAT¢ïpdç_ċ©õ1¦¤ÐgʁŸ¨ôPëòûjêüûÄT#å.)©†®»Ä€Ã™6œòù_e*&JÿgC£rçaž­–D¾½ÓOR¿CuH .-Ë^fšFfL­BUÁeÎ7(Ø“$JCâZé\lÇØ|¸‘gh¬Î§K±zf Wó­<Ÿ?ƒ*R˜jÕÉ¥¿!Gá áàVQüJNFåJrV5Qü“xÓ³ õŁ²«<šJ÷õ èÛümôÖ´P°^sÊÉʟê2(ª×§Š±'YCw­, zQó.€=‚iÓà +ŠÝÿºö]චrv4Ñ +ÂøÇuèUõþY{ûî@ËÍGo§ æ¿F7¥ÃÀUÖ@'Ÿ"ñ™ðùgĜԧ •‹²í"j•Š¬\ÅEç¢R‡ ôžU»ž·ógP†mÔ|J@Ž”Ò0 TF‰ïÇZ ªMe“—«¤áÉëDׂ‚¾tk³oþ£t§Æ>E¯ïԔïZ1ûé+šr|,!Ü Â6wº z0¦×wË F@p1î%P´íÑ!×Î$Ö+r†Ò$9ú­ê¤yÁ‰36ij C¢´ï 7C¡Øb¿Ö‚aµ¯`Ç/ÐY+…}r¨’=0LN|Él‚¢Ž c?~²Mc‰,çùÒl"”Þ—H=L0x-7-&¸ F.;XsˆÎhI?‰Ííh  S|én‚¦ä K•.™®§:70’=ué»®…‹·aàÒKfÓûÉÆì(/AWü“½ÈX!Á-Ò¥ëZªE?‚±¼Å"ò§¿%ú* \k]š\‘WÄ4‚aÙSÒ!á +…,Ç| éô“¹éDJÑÀÈræmOª½W¸Á°r,ñ“¸®/€ Œa¿z×ú30€}éӕj#¼Å¥J>]×[˜108»…qA €}ƒˆ™÷‡`ä,×*xþPOóP‡ ÌÇj ¦ÔM†`pðœ 0¬êf/±!¹ò¯!<¾q@»z0l…ߟê&VR˜‰¤E>£€XQÌc [ FûÈ#åÀàR«~Òë×ÐV‡É¢¦úÛµ*…V鋊¥. #CŠ°…3Š ïO "ËÃi1ds“⽃=š‘ ²ßrAÓ3~ Üøz…ñ%Â)z̎ý¨·à1C°Ù±Ûs ‹ÃéÈ1yy9ŽÉéé¸1þAҞ/Kå©77‹«Þ¨ $d¬¾¤ªWˆ1%+h8ÆôQƒâÅ<©—q…‹‡³Wh1@çÄ-X <|½ÅŠºq;Ç{DŠEÂIPÌnpœX-<ñÈ'§¿ˆs˃Ås0i­šˆ»}Ä`Iu4«-˜ŒOF¹—e&Á.ÕWÒD)äœT%›1®´gÛl›XSÜ.ï䕉˜$ÌüíËÅêû¯žçw×øÈ?®¿à÷ˆ•^Âje&žMæôëα#¿rÑÈð«æ¹Ü5÷UòÌTT`ꤴü[ªúCøÏÜ +hù:wp{ÇQ(ô|×°7ƒG-ÙâÓÓEdkÛì]à˱£9Paþ]Š×‚%Ó©Ó®:^wáþI Ê´H+…Ht¢p㩕`ï¨×K ˆsdH/PEAL z•œ30ûç%÷G'n€Ì &”uç.à»ÿnNxIù›ˆîâŸÓ‚»Îçï9¶ øÈ킑C²KzÔðÀ.¶ÅT×5tP=m`a]ÐÕ&àÞ¢º6&Ž@]ò­X/‰é”ŽÀÒUO®S"ºª?SõètPpçÂûÓùò°¢Ñ“cև v iå͙{$h9U ä­‡& $Ž‹̽…qQ´óý>Š«̪qqÊ®+W)„+´ˆXø¤°×.æ!/~ë´qß⟓£·îütðVŒÜb·äkï¡[ïEnÉ}^`[òµüp{ÅmA*#Ž`[£5-qbH'!î7•Kì:t¶¨Í~ä`šT_¶½. Ì0©2pAýÉ=\¡{L2Á +E¾…óèË/Oò%lDž×_ðû×ú€ Ç²Þ#Ù Ò¹"ˆû)Ìo 6}a2¹ì‘Ds_gY·à*†ìÓ¨ÚÜÿé¶ȗ€k(.ãӎ^[péÊϖÛ¹Œ\‡ßÁ-XUäf{j‘nÁ§À%ñ³ã ·€ÈJô¿& Sÿ?.û¨{QÊÃF%h % C<³é§S±Þ´{ñÛ6rŸãªº¶P9Ȟ«ž¶àˆÿ†)j9Fq6IM[pt9héýrmÁ±Í¦«å3“ªh\‡¶Ã)ظôž·ó§Mùâ،Ô'lœV!½fÛÐäÄۄu‹O[€2+‚çmAÚ®”Ÿæj‚¶`%~+3*5j 0É_·¡hU²è {¸Ú·ëlá…4g¤]×f@ÅoùÆõå¢6úm‰7®SIpY'BÁlÙĄGŸÜ¡(°Ù$%'ð ۖËq9qÒÁoâ?¿p\„ö…Æ Œè€h 6ÀáX’ŒÔ`mÔ2UAC[ð„Çð®Ajp݌¶ còQvàv—é@[Ð'ûn5Zk ´ *õw`]ڂ¸"'ïßDÑe˜ ‚Y¡ŽkD텬zê¶àsRêâ øÜx͘ËÍxrq\õø¾_~JŸàÙ,gøŠShkê·-€—cšۂ€ââá=P%å¡qÑ,À¯î:¿Û‚gÃ$´¶ Ï×àòÅ7=и¢ÿÀbgx;[ðpâ4Ñ<`˜-PJpmíΞ4¼t¨Š8[°QŒâ¾hëɨ˜óM[óhÌ æǕˆÉø|–œ:Š<œf Áñ•õ îõÏÌÐ'Q˜ø‚u¶À’(²*£²¶  eB_[À£îÛîTmÁüMª¸\ü;®ny§Ÿá÷ÕqÍ´°ÐR¸®¶ 3­i â¸¼,dQ^ïÊq!(;·(¥ƒíc¡-|È÷×7®˜ (c~PظžŒ>N½ô»³´ 8­6imÁ’,C:W{f*mÁnxÄA[p<ñ.ÜI–S«,´^úß!]¬Ð؞>ÕÚÌÞ{‰ÏÁÔx‡ SŽë˜O} Ñ”]1‹ˆ˜šq%R‹Q•¶ ©£ÕG;/hxÕ0÷.BÚ mGºÔ¸Ö+ÜvF\ó»dmC]§l„. ã'C(*ˆ¶ ýOl²Tì;ڂE?Á¥ëù»ÖYlM‹|\ï'}ôžÕÏ‹_)›DnÁn@½"ø¸D£“Ý—pàÐIó¼ó¥",t;&mÉUb™J9¹ô÷$-Ì\…Kæçƒ`np-ÞF}bµ=³8Nž3D§ÉÅ…¦¦äŠÎbÄ%¬8–Çåp€ôbjQi™’«B¬sy"V¨$¦UIym’6üÁ3‚¿µæ4fáÑÀt¡–7C\¿et‡?êÌÖd‰ˆ —æÆGÎeI%§däòˆ®ê¶5c‰dè]÷…à€4ÊF®º»‘4woÆsÏ]Ö9#œwÙõ%G§a½éuEÊúqOæv~(ê™a†°%º,TÊ+<ÿÆÓàû¬¸áñÛÄaDÒçoƍ\¿ü¥,‚³‘k O˜†Ç‘+ov]!% +}ܒ‘f?÷Ž\,¢[ÿm›Í"ày’(ÿrÀžDÏ;N¸ †½r^;k•/.Hj¦ß pA% Zâ‚"L‘N¶¿%/«ÀLsn8F'’W<h\Ä*‰J^ym´n( yI>‘RG¡°äÅÁÖípoìä$/ tSó É:x¸ÀUu¢ìœÁ¬½-á‚B¬*j[6„ÂÑr·Å‹!’Wӂ’Ü,´à‚³a™‡1Hà ¹d vہàÕ êpKÀ¨|¢ô¦L?‚Ýà¶—G5# ½.à$f€ïg°Š pÁ¬––é×Ñ%/ ü.lNö¶Òà½Jì5†Êœ¼@ uâx;¸ !\¯`þ¤ +.xQØ¡ËÙcÅäÅ9ExÚÞê䚼Zԃ/DIO^—±Ñ¼÷åá‚Õ©£ n¨¥”V¸@þÑàe“òz^í@òp(1ÀÈÍà`QL‚`¸ w˜ƒ½ôÙº´© <7¶~¯ib¸Çs)íLEU•… ô›6CBK0ñ0\`lW‰B¨òj”Æä•vY (4øÀÈÉKׇöØú! +.a§hêQE…à‚`N&_Ìܒž1óÀ Â+X±„iV€¢…ôØT–Ì̑DQéb×ÇðýA”×J„Ò­[à[èœúº©ñ·Ãg¢(/-êŽ&«Ç±ÎnA(vaoaY–Õøáû·€ö.&AsÆ¡½oÁ^Ë Â߂É0*S[^N¸%çãÉÂbµY^[(8kh@1žòšÃZ!ñðóPcË^<—ïA[¡P^!àzÛŽö +–z ²ñR®¨ÅGo /¿6!a”o7iÕºä¿bµ¦å5wÙm8UºY^I%:oFµ(/1£½•õC¡ò’v o({ñ°MyÝé^Ž›ŽHÅ¿Uþ›ñW÷[T{9ý—ÐCp§iJ|Þ +‡+/sj~®ª=₉¸å%â1úçV€Ž¸ÀÖˆ&¢c<\ò˜—"joE°É´ô¸àOœ ž€ã‚)6Œœf‰Ê¸`+¸¥—Þ)¸`ï^ón´ùq܂BÌ„¤Iæõ–ZUdF‰3¯É¡‡ǚyɺx[^F+™yy•}jBŸ4Yɼ$Û!ž¢‘°Y‘™—e˦¯ì,p¡=.ÐtGQ_v?ã‚Ìò–êìê`w¨rx^d^Œ7 jÍa´«¨Ë¼è1 *¤%='ââgJ3`Š .—ü+ð†&.ÀŽC¢“†g‡¶R\ò¡ÅS+Æ%-æŜxÀö¢ÒF‹Á¼ùBg8EE\ÀÐ/rêŠ  ¥­(ž´îç?慲¤Þb^ß¿˜©‚dÄDŒÅ |û3™ 'que5 Yš…ù™¸ÀÝ/V0{Ĉ ȱ_4Y§ƒ­Óê,kÒjqõ¦ÐV¿[\ Iç$=ã$ªžË+Oqp<-ùôŒ¸@^14õMۖ—¤•d¬IÈÑÁTâ5\Àü,©Îí4_Ð:{Z¯k¹»{Ì0cJìw¯øÏëSóÊ3ݘô}AI’~L&Øðƒ°|¢îÊúk8V'69iÝÙ+ŅS÷,ɯxFlJ®­Kû`ÈîHô€~_nԇsâ\à2ǝéÕ×Z2½Øš@&kk±¯æÂÁì ëCKF“¸@40ŒÌïܗ–†ʟä Y/`±u_dš;~ÿÛ)gÎ)‘Å¥{kRžÊs¯t¸>ݍïny;vÄòNܕ¸ì¸ìiìšúÉÛ²JcË, KÁ"ö¬e…¼ˆo’×?ŽÁ>wpš™¬6‹ÚN¤Å­2»ü.ê¥[ÍêiµR7Ð Ïý—Í»fÓä°àscÇAÚ2²ËVÏ/¯A¸18IÍÚÐq<€¤æx&kõÈ`dÛ¸çB‰âWPVêß±Öc“9½F+VüL_U>]*¡ƒq×Ú +Š€‡ ڄ°ÄˆÁ”9Èʬ̋XdP³-x?mí]78èƒhฑ…N8ز’t´ç\Ï®…Ÿ&äß¹BlYn¯ãî.4hÑØͽ ÙÖi›ÝD »¨±ípôÿëJ,礏V°H%'ð´¥®Œ ϝ¦ð0 +â_ù¡UØû¸Æö/¶­¡¯Ò«´'\"EKù–Ùâ8 “onbbL¬Å›º‰«WgqÃB†§ÄyàÁ¼„ìՀ•Á|A…“ñnj«{«d½~«j&xLèM{2Šk×/öÝQÕߗŽ³‘媔‘0Տ-U±‹tlD˜`ÕåÈ%NßÇÉu[ùÿª &ÕøÕm Ï®ºyi^’‰Þ`M-âmîœ4W½ç,ëM5íumuúîSp(§äÌ1Wó +t0wC 35÷‚ —Z-‚±9lFö|Ú´ŽÔÝZ\Ê8î®® I4 Ý`£²aî‹-Ô¿—PK†˜ zMwE¯§ŠàHÞæ_ô{óÕ,à\˜hì›)U=Š´†榩³–ÈNWÝØs-mU¥²Õ‡UgIÝ0:lD_wLØ|fÒþ4TA_µæMÉ7EL„t©Ø,™Þ-_,ð C4ì3MPÍ°o˜WSÉN` +î ÆóV›;YÅw@A4½¨<Èî‘ÛÑq%ë†î\°¨´¢j'h^ùï—£æÎÂsUËÖí¼¥ïÆ»{a“µy\o0xÆ$1!{< RR ÷?`£ˆRä𽔝tÇE;5¹0MÈZ›™?sv“F(±ìL]Ò* wÄìE[n?#Ɋ‹)*;׎âi­#ä¡I4§ 3õŒR I+#\{š_ì9@ZÃÐEôC"Vžvx+—€@;§|MP¢ìóâJñÇA£CòÅUÙXa›æ,<‹Œ(§®ä2æ›Á¯ù6/·ÖÓxm\¥<6ómSJn©:ë>»y`^¾?.ä+ü¯Ð"xAz˜Z-ٖ߬–=ƒçFå-@\ø•œ“ø”¢»ï2< â‚dS$&§#ì*Ö÷Z°£!i˜Ó±]2!p+ž9/ܟ¾Çñvõ+[¿ßªæ-ó —æÉZ`×ê+L÷Ðñ†[?{€7r4Z¥|MDV°@¶tždDâKt ð#&0 n–œÖ x]œˆ®W@~–ò –ëÊ_óVRRš9”ú¡gí횭@m¢ ÿú£ ZÁìÌQ•-›Çw †ãð¿ÈP÷æóŸ«1Ԁl_ ‹ß½È°]÷ŠlüyLZS”É;j{Tì :žƒäÄðEw!͗ŽFꁉZxÅ2 ¼¡zņ ÿ7=ŸÛfp@ãëT̃ÌD QÉ”n¡B3!=õà-¶3èh¼TGÖ€o¼Û‡?  Úû7:Í£ÇëNFhû³Ù·È`ŠŽ‹ÊH÷Ù¾85Æw¤Œë‹^t‡äÛu»3=:ÌKϓ¹‚vÝÞ ßÎõÀÉ'k0Ÿɕá¦ɃРjœÃF¬kêùP§Îi@š#Úå!ùù¼ÿ-À€ŸÍ´D–ħ`§>Η<yÙív7F›³A‡¾vê™Ô‚´Þ¥=DÏ9~Bæ#¤ž&%4FN|篓QEÖÈNèsJæÅóŒ²"8YKR` ̐ñ/Ñ3Ï+¯¶å -ëÛ¯àRf?Ǽ/ŒãTïÅ+FKOƒ“_ f‹D2í¥œ¨]Fƒ°©Þ÷iB÷¸îúÑÓKUiF-n &_6‹Q5“¬ÿæÒ5ñUNèåxôh)@ؽ<`q_Ò½YSpz47|o¸ÃvpÝÀxq›‡ÃbÁæo?˜Ž®`@µù éxŸÿŠ_Ú4®šL­tXÇ·2 &Û¼F3÷Èð”ôÅy*?*ME^iç Ø}·Ûś‹–w ™$Ÿ¾ðª—ä–[ròyki,Kô§a/KVÁŽH®!ûÒ}FÓ,„‰:ÿ‚ê%¥èWhC¼¦€QãàCî˜$^õÚåê›â÷ã +‚y'Æ[$¹'Ë3ŠðÜbê£o'ÔÇv>{…“>+?mÔDÙR¢h„3|÷­ 1ÖåVXtS ÔçJãË_,B—Žن²«Í/W!FnLè*Yòçœ êÞTªJ«Ó HÑÁ°ŸqŒô0*”­Ð!Ƹæ6Äà†ãoìé¾ùGP‰ v?gävfVÃ)ø.:þ©Â—NÎpÌ*sÛ|”¯7¢ýݜ$y\H­«%;ܹˆ|Šá²Í¡ë^îK«rã‰m +à>2T/1§¾.é>æ6AÅìŠè‡•‰2÷ ÝkiÞsœ*Jätº_c9­Èb|~Ì^2³}+_~†À/Åß•I=cƒQj:)Å_*BKg5›¼€=ßÆý + ¬Ù–­kðSwÐ éAë=™~½i-]˜åPþxŽÞÏú…¡æp!7a~Ѷ–`Ý|âø0¤z¾Ó—âoƒ{G¡Ño„?p‚P¶Òß`c={&: ‡í5’o‚rî[2>7+È>ƒéa]q2•¸°a¹h’íë÷§“k!Ò#¡µ––˜bpÙ?ÈúñS§Òå†S+b·|D›)îÀ¥KâèK} +…RoÒßÍÊ<鵄SGÌe-œ‘@‹g:{ðq'Êñّ2•­nR¼Æf˜·iOÖyñs ¨;p†ˆÍKR:¸o.2ªW>Ä]y«›7âǯ*‘ðÚÕðïŗç©çA ¥´é‹jªø˜ú«F‰Yžî“'³øV==Ñþ¤ÑÎx§ç`[ìmLÁæëV$EuHOEôÅ€ä0°ÐgͨÂP ÝJ€üšLdÉøþ)Jᕪ‹¿0£‘ ^ ñ®Y:¦œ‘Þ…(ã…íO±ÈB`ÇküÞÆ+ŒV¼Àc=èá5t×Ôè]¹.¼ÔMÓ¿Æ>hàA…h a…A†h (>Tôz×SE׺Z­5æ],áÓ»þ®·ÜeV­¾håW ¼¾í»@Ý»<ó»NÉ on›zWéó.¡ÝÇ»¸2xÕJõx—„w[¸‡×ÀyW<…Wx½ËÇsèÞE}ù.t;?vxÁŠº  …×è¯F ^mœõF/Pú.ßøÉsð’Œß“øýé>~ŒsÇ0åÐCg=í,3Œ ^ýwMÄ^J7Æ)‡êàuÀkœÀëïÂëucàŤ[xó¯VsMáõ£éc2¼¦±™âAçžñºë†—€Óëèß5kÜ# ¯‰Ñ=s¯4‚—öÀ YʊQ¾/y øP£ÿ»žíwñ +v!^sýwç àÅC`ŠcðªcO¼²Îšã¬2Â?l^RE6ˆ +X€ð•ðšÎ ^ù/ÅÁ pÁˆBx=íðzöãˆ.^6/k®1›µB™9ù±5 xÕûr5šëŸðz¶JÖ)ãºè(’-Gªfrîä^|´.1ÂF\të V¼>ç4\+”Ë\Â]â’¦ Bd˜y˜ë\œÿ]é^.Ìð:\?\ICsåú•pŸHÜ : A$hh€×GÂ르hð˜uÅcg6d×s²¥o²mÄyÐ͚‹+™î– Gèõ–¬*41$L8˜ñ1L x%ýŒî iN ®æL›¸JÞôۓʹPü®—ês·øÆkg½»¸Œ ð"šL5^5äSá +¼¼H§^”Ji.ž³JæçvŒòzŸý·í[l°`)(€à‚'˜PjjM·4Q³N3ëŒ#'´ÔºÀ±Q+Ž‰ËÅp‘JJS%šW>ÓÌ*½¬³Kµ˜šÕ4³ÎyâAO@q%ö Q >ÔÐ Öh'®_¡Öçì3oFvÌ°Òh£míFqñµ*ŠKn|ã‚Zc,M°:óZ[m˜Ü´ FtÀ–Ö8-®˜.°ÄBÃÚxs›±Úz£›g•iAji Eý„/.|ºyuӂŽôð¡†(h‹ëWµ]\”L‹~WuZ-V¼i]Á¸Ú*¦ÔÒ -¾TÒ ZÖÒÊ*Cd‰-`âÅà´ªèâ/Wêé‡=k§u­/7L¶ÈPcÅW\b|Iq1-¾ÔÒ %TÖM«š^x°Ì1£™w/q1-ªHMëw¥€ÔΏÄ3€à@èõ³ŽÐ®â”)É$S"ETúe66+3îNã2¹"ó–A•é¡(§ F½ ñÕá1 ‘ +i•ùFdvMŒóÑZ£$BE:FALU27O%Œ® b˜‰E™gሐ‘¾?NÑí?îp¨²*2²5DÌ´¥'NHù™}rd+Sˆˆ;|ê|¦QE\“‡˜~ï'ÆËD 2HVaje7:ÿé,*Ó'ÈDƒ 2;c„„ãmÂ%£"¢4ËÃ;Fø0òEŠ¶{«¹l„S¡;cI1– ÝB|7–‡¢ ¢"‘´>­Œ¾ Õ¸è +'¥‡¬YĔ¬VBNŒ?—3;á(sM Kxb^Ã8ŠªEÐD#Œß$Œ±)ö™o֍ñ*Í^ý¥E/ˆjNC²‘B¤Iù_1ÎúZD Ä1FŸAüHÊü“c8y›.MBy5:KéH-ìÇK¢–yÇîbMÑD‚8:Å4‹Y‰ü ã¼Ñ/uú/ŠcUeJ˜ÔHˆ 4Cdˆ&-5ªK¤(„PD„8"3/ƒÈ2VŐLŒ‹«ÊÂ]£þŽ ±©N\X¯@1?[ŸDä4É®b¢LN£ÿ«óæd$ÆI‚ŒÇ‰(f:5q3†¥Q¤$cÚ¯8&ÄÈ,Æßý‹e²o"œñ ™ÙzMħ ‘ûá›bÜ̺¤T­-µDu†U=a¤b…,´œX¹aÙ"$Fò¿„§ aЭ)ƒ:Ỹ‡*¦ó +YêSA>C÷iE^ѪÆ?ŒI0^ÊG3‘3ÅzÕÀRcè?©¸…˜‘‡žé˜èŸU‘,â4ÑW‰" +œ“¤û*Ê~ö±ñŠzÃëÁ˜T ùÞר„ؐ•)©Üépt¦›r¬xþôÒõ +ÓSÎU)ŠOù‹¹þoâÃbM½L"!š‰Kv* ¦BøiÌ}S„i&îî.ì0l~}ÂHåŸi©;”îLL¯‘²q]–!õ™™",—›Cò¢ðûpS},Ã$[Ñ´.Nԗ-BEõك˜ìše‚x‰Œcc[k–©!ò+´W(QäJñ¢·uû®*ö!O%ܼ”Û"LK̖“G 1:™cªF\ÞШޒÊ+Tƒq?‚â÷;>lwlxʤ‚&]ÃU¶3y2Å)XN¡¶3UU¦@v,¤¦Pð´jÔ¯½ˆ%+®r™¼4¢I‘éIHET"%âDÆ{NŠœ7ø6ŬüfèðD“àƒ'tA3ž oln#ªX΃$ÅÜ +_‚´ÅäÐCE8V;lb#‘_ESEcæç2Ý&§ˆâB±6Ç19>voÂŒ*=N…<‚F(F%©Æ&ÊèWr¨¾ pÿ‚‚e4œ8§µ†ójL¤‚8fB•D&Z4–QlÁ¶A5餛•ƒ\ ESH˜EXèìiè% to]}E‹ë!ò™‰×‰ò}!„b6™³>Ò7ÈÀTHÓû µ6C S^•«käݦ%tØM—=J\Ùl1‹Ó떠‡hÜS%px‚çY}56û]H«U§r'֜>!³;æBq]µÜî̧NË-²‹'â%×+žˆh 2Õü¥âJÆ%ŠS0X£µ(c;J:!bžm=±åã MJï/Â~*?îjDIœ­Økš5Ÿ9 |LjÁ–ÇPÇq©Ø€¢Œ§hç£ót„jcmÚ¡©ð8 …ÕÌò…HÇȸŒ0+|ìI‰¦¤ãYªª"% \‡cJ +5Ӛ¨Ø\ˆ*¡æ2UGMÕ¸Âçۘ³‰:w“þª²¦ˆ¡f‚<œ›5%5ó¡SLJ«™ì¡f‚eˆ’éˆÄ£l×ÄTmJÒº”Í U(üN¨Ú‡OÑÖ­ÉûL,øO8ø>}zõnIyD»DhEfiñþñé(Ü®\"Stl RQ})Èl¤Ôª‡+ÍàVt†3{¤ 64êÏZ2²v.%;¯… ´ËD!¯rB™Ù6™²óªJH`„Rא‚xU˜~ÓQuÞ Žìm÷)О1ŠŒó +M (Ê 2¹ˆbb£>ÝTÈ’'8>ŸÅåщF°¨ +5kÙAõØÉá/yº[ªÔÖÂ{ÑLÄpä÷jbW£Óp‘Ïóà¶k¸…d#o(PKvE2 n+â­>è¯É.¡OíN ï8b¡LÚVU9ÔøtW+œ6êìð€R!ÊÅ †¼ÊQýô¨m0Pr±P9îͅ‚Ô«Ÿ¦(£ØÛ G}ŠZª38·é)Ði´y=¦8Åm<ì:W|Ææ +5 K2 %"Y¼Uê<O9Tb—@~kJð'©U¨³K©ïvÈËQ¨ŒyX™ààÁ"j¬ªcԗ"VM)ª•§¬xŒŒ±ÀŠE¸ÞVo‹Ó‹P„MRÁRçk!§p—Ô˜h®ò\B¯–þE|°Šø¡"J5øïÃo ÍÈNKwü’b‰ŒtbA1×-&¸«N­Æ·ÄBm|+!"ï‹xˆe¤tIœ†|ÆVĐ*Z5³:¶"êgè5ÃTæ÷‡á«Ele{ɂTØóÿµZ6¡!Ÿº0¥Þ +!$BU1¡Šj",R =âáP!æÔdº‰–ª=¡©;+hKæ1¦øÎs+JB‚)5ƺúÿjæU¹¨ªŠÈ§‡¡ ŐZ”ÇG¡’Ö0l¢ûÔFQQÑ£ˆh%öT÷¥n©+ÊqSOíȄ´æH¤òBÅ"º£†-oâ֔ÆQiIG¬Œ„á +²™äT$£PëºSÈ&d3Á=Uéh¼Î`ýCAÔD…HÍIBúD9¤%c&q„ìŒHQës˜k“Q¡ù]XÁŽ’jQ`°æ‰0«V,{ùfyTM­!tJlâQ›ru#ô!© …¹„ÐTuBZÝê¢]t‘áKö8ÍÈ% +ª›¬‰-H•ŸY…AªÁš‘ ¢Tãl[r,ÕL¹ªÔ¹ÓŽÓ ‰QÍ qË +Ac2Ô)ëO˜ƒ"¦¡ììÀ  ò)„û?óÇõƒ|“¥ UÐi¬ÖÄhÂ$qŠÊ+Øx™ ‡ò#á˜D8S¯0Ç¥þ¦¥ˆ» ÄxM¸v{¨L´PíI‰<¼¨ÙlV"õ¹kBô· +|xóð…8)¡•Z”2N%}ĎB­¥%³'ÄöQ_<™Ý€8ÉOCeÄ(µÊ6FŸðiÂĬV +Ñib’œqÕe¥¾$„“¿=ôÛ®TÕ $§Âí'Sfæ¢'<‚%…‘¨A¤‰¿qO(—Œ%œàÐ+*Ð^RgEñ¬ u3\„]¦jZh!=‚ÐT„Lp"(ýõ©‰p…ÄöŒ?ôqnaNeù‰âµ-L~È{–¼š0¤$–pƓº(hæ…ÄeŒ]$̍ϙ"Q„¢t´ƒè2³È¦&›¬†FÓaŒY%ñ0Ï +C4[ø-¬‘ ­Š‰õ,¯ˆN„Œ‰J¼¡pÆئq]Ó¢Tx|2µÚW©3®nm‰"u‰fóƒŽWwÃn¥TyÜYB2•)Ìmc¢â¢Tî_òłˆÂ¥±ZÜfHÕ0MҒ©<4bŒƒ÷ÐõªŸ^!Žpj|ª‡¤õ9:vÇCdåáÆ9Î*Tõ¾•‹dTAò Ÿ'Œïj´#”ÛaÊ銈3wtX}œ(LNh‚„jó<†1^JR´ê)nMY¡òG±F†àpî£Us\dÞ¦†'Ù$ꠄ’„Á¡ÚŸ"¢è+“(*û>)šË篌‘‘jTo5\¼°_Îð¡®þÒâ'•(L%“X•†½C*„öLd>‰[(sšPT±­ÆC"åœCt9݇Ñâ“KÁ4á +Ÿ S çÕ¡)fÂQ‹ˆ^C©d$R³r:]dŠòa¼‚Ô"þ­QTŧÓ9ŒÉdžˆÊ$a"ÿ‹Ð©ƒ%;Ê¥ÐT#J÷ Ÿ zçwLkâÜà ñ›í ¥ª±ÅnØ¡Rh¼„Œ†>Bb”) +gΝ8»L¹!d‡´YËÄ×>a©ðœøÖ╍«jv…Òöb¢ì>P Õ Å¥a1¸ðœb¤5ñ4>BD¤„É!ËGSñáq)ME×JF¯(ÙٜBÍ 4J-™y*Á +¿#”ó«fGîŸCFYBT«ùjbj!5sY-¡/j¦Äðk-­Æ×hÔ"%s×+bje³Tӕ ž¹d‚Ș›%"ž‰Æ>5c°XŠ,CoµÓVØSSõfMU=5Ù¿²%3ћsb… +éHBɸ&ºÏ4~¹…8§4”D„Yª0Ù#½ß¥#ò½'÷S!UTDŸ°I3«LEÍ=RÅVžÐ‹B qDº)²„êHPÔ5å¹G ±"Ÿ²ûMÌljóÑLù aI}~‡Ç…šP^ùþ¹{8f-iq‹j¨D‚vHgRäøŒö…6Dv ú˜XJR4Ã×Z¡KZz‚D…9KyEö‚ü4¬"Æ;Ÿs!jŒGQ)a²˜É¤!³"š’ˆ™¼0Øë5î'f„¶ªyؐ «e8B†8]&Pò„$Y +‰ ¬¡ÐD¨D{4ÿpBMD 9@%µ¨˜Ì„R‰C‰5’%NEÄ +Åh£r†¿DGa0¨`’ %˜¶äÔâ ‰(±N¡Èï;áÅó!$$P±$"IÑÕU§ñZUECkˆFÜ·F…¨éÅêB\µ*_ªÆEzɳ¸í K9¥ªqTi„È^Íß4LŠÍš +RR8º´‚ü!*EŒ‡"2,! jÐ,&d8å2+/Ïѐ(c^†™µb¡Rg, ›Ö$“‹ Rˆ+¤ŠN†õÒ¬4UhŽ©"F1Ýa¹&ü…šj>Ô,_/7ÐdpXWf}˜ÿ¹6%^Ëíji€Ë„˜ÃÍEHÔ*µ2”9“2…µ{!âÙ&8£qRi§,aŽÐǤPu iqqªM#:!Þ¡iåaˆ‡ˆtWø0O1ÔP}Õ Ø.ù2ÒLfú úدâTg*ªvȺو2øR-Ó¡ú#ÐC6ÜÐ]GEhÂCkP¨9%15yE Ç$‘<¹>‰±p(1hg;e{Á‘‘O挵(b䬺2ė6U¬ù‚S¯¬(gF#åùu’š¨±k«˜ìÈ«$I„jùŬnB¡mjîՊVJÑD †éÚ!Œ9 U‰˜³l;¤jGf "Ø¿ÿáÈ]•‰±QŽ×°fÛاTígM\¡¹²=òÔHóŠÌ¸ÂÐÔLŒr9œË„’ëŒÿ³¢i„múP¨ ¥´’Îu™ßJ¯”yM9g‚iª Âѕ—¤ÎäÁjUXozH§r_dAåȇXtOƒEbêCtC¤H"êÄ CŠÉ¶$Q›JßMÅ̐PÆB5RÎ,Qçda°éW°„Øóž(™ºªhG~žÖØtµYÔP(Ššù¡(AV9FH­Í¦»âUóÍjdh/ a,SõïÎÌ?ëLxcüÒ%´ºÐOá¬%ÔP§ˆë^,Š²ÒHâ+J°Ò&SY½4JG³Oñ·Iö)VÂx>Aš%‘ *ƒWeØ8©ŒˆT2ÕEMÓdRCSDeG B4’2¤îšáù aš»Ä²¤p¸Å©óÐmÁ±”¨#Å@N¬æ*âT±ì°¡¢Ê!™À©ڌ¤Ò÷[XáZõôØe˜«9't\™YŠFhKŒŒº*J†N1%_¨ˆîðëù)ºèD¬¯éPŽ~ž‰T]#œ~dDDò“L„ïšÑx‹šCy<©5!g'/Ä”ªg#š™(”2TÍB1|Ð‚ њºÄC̃d¢Hh3šwˆUã.A¦b)Ná é<Ú}éЈUwft +3Q"D„&J7͌̂j[uFy…&·xâ‰p‘Y¡3ÈHâ$¿ä3û]úUS'¢¿ø†ê<öi•øi7¼sú¹W +ïDu$Õ)—|â¥närR‰Ÿ0ʳOxí‰0û{ÊÒÈe=Éhh¤ç¬8 +-bhd²á8—åÓ=ç\ªœ 4@•;Rb!V;MÝp¼TóðèdÓFÊâNºLp”ÂÔuÆ3´’K,$5È"hBbƐ]Ä2+ÍÏ8k¥ Mt:’ô´©Š;t!U ۖq)[¤ÜõV¶}“VŽÜWÃh|µ™¤¦†#ùÇ "Uâ›$£Ð/JeY•` ÇK³—𧪠’Ő>R»0Í4Õ_p=ÙT]P{z¥Î᪔Y9¼§†¡Z©Ž‹f¡–aa¨Nhî%ºÖ4TiF1zY®“W ‚$óW½•aðTWk·6JÆܤ¡"Ž¼A¨DŽ® —A] ÑÜA%WáÒJÆDC*´@R' º‰Þ +ëë3®™3ŠBê"3á=–0#‚‚~[ö˜îá}Fê)à8ŒÀ.d +ÉÇĞײb¤Ê4º¯D9#„ë QKÙnÈj֚ªFzjìwdqcªµ ½E7Տ ÉۊkâRš¹:aŠ¤$ÞÑjTÜN<¤¡¨š:‰-FÄÊ!a(£HÅx*PQ•熰„ðú)êÌBÕ!¬HÕEi¤¨Içs Ué`OñÎД?HìU¦(kj±Gƒfy+õ" GJWnYLœú[k9¤µ_©öŽ $hZ@„¶0é]!¡¨‘ð•‰WˆÛb#¡|£§C<¬ÈÛ©`PÑ<IÓÑÌ ó§ðÒ&â92 +S›FŒÿ]a´náõ%å¢mۘº¤îꞖçÑYxûSéÆÓ)HŸIRÕͺýŽp¬›gjèú?)Ñ(H&älT‡ZÜÞzí ñO”oM^³¤Pp ƒKl·5Êoðn P.õ¦¥>TûXýZÌiâ}j,i!J¿Cü§0•éZžE^~£jE‘tǼæŸy=C~ %Sšº N¹„A¡Ê/È(Ã؃F¤gUÄ›¸ÜT«Z†ÃƊVN¦QI C£íåjÐÐRM§ØºÆÖÆ°`ƒJ[ K™©)?ˆH£n"iÇA<ϜÂpNbð™D#QZX©ÐÛ>”Þú‡œÇ£$6̱¶™ZTc.©Ø‡¬dÒah"¼úl8’g‡Ú.tfhezb‹ÐŽŠè9Ë!ã7bUiÄPi¥î3®V¤<ŸŠ´U(µ/§2hÃN˜6FAE÷ÙQ©LDœREšñl:9¯*6R#äyjÎ&Nª/”\Ö6ˆ“à}.†Š9iÍØNÅ%pQ1ݤ1ÙƖᇔIà¯ÒéÐf[]“p ³-#*,šââò§¼Å+7Óå!\1ˆ¤„Í cH.ÐNô†‘Ìü!b?jüªdê zÓ-T\¼‡yä!’Ûó—MáÐe$òÏáÑWE¤ÆÙ{9´…Ì„Ñ6 ¸©[¬¯Îw3ӍÆJ‚1QóÙ8;ãdƜª ¨I꾄*dÝ9œ“ˆšPyH¡ké’ù¤—¼™·>æA*šw"‘~ˆH8a!Np¤_kHâ+41‚+!®È#¥ƒ\FÈZPP…Ddmß¼z&· ]èßÔª($ul©¢Ø Ã^*Ԍ+¤Âety|f#®>þ²ƒVÅø$œ³]Â×n>tù´J؅ ²  "ŠIí"IF©÷/ y)ߥ†¡1L³K•-*Gžètšâ°ÚéjÂðšE ”—¼ꟹ„„ÅÙámë#(šùT ê–±0È<æ÷÷p‰+ÛJ µ•ÐG߫Ĩâֈqó}oh‚+„”MÄw73ºO“Š‚91'r‰à&B¡âÜéä‡àª DA:IÍÅ;£†&1íä09ï0´q2£‹8ÆzC15•[*•è©¢hU OE˸®q¸‚ÔÛF/¡W%¸Žœ¾ +Z ö€1j4ÊÅB]s7õjF‘ý—Z¡Ð ªÐ ‹EMNý¸¶IÃ沍!/1M¯ãGJÍ©àñpþ ے«~é;&ȱQ|F–ÂÈ[ùÓ-¦Úb vUÐÙrÎz|ݦÍÌÊ)ëé¤ + +Ïc¬l¢º¸ø¦Åóã IòˆÐª%¶4ŸCuêkq‚Ä،:R—=Ê,†Æ߄›\½‡5 OýU²‰ÑV—šÊ3*u¦›N%&]3(fú ¢Ñ A&:!¨-MŽ‡MXPŸéIN™êPÉßo»‹æȪ„JŠ™©¸½Í}A‚¢æAö=,"Å°.þþäÁ:ˆ²ž¹G&÷q™‰xÿ¹!±ÑFÙd^ˆêâ›4­„Ý1Ê\z ÅK‚¨§SJž2A@€ÆFÅÌÞnbZ7¡Õ:s!a±åY Ã8ƘT¦ì/*BÂö‚˜*­jˆ|*1=NRB\´|¾ËRÚä|‰9W¾—t™Èüô©ògÛ8Â6.9_’!á‡C§ÄV¿ËœÌ3«xq9FE·Q!‡ºÖñGhª!Ç´L0R_¨¤¤$HeM„bj&&Ë¡m•ißE{(žPqMC¤lŽ>>ÉL ž1ªÄb‚‚;UÁj0ËÁfÌl±9R¥RéÓb\*Օ8J 7ÃÍwA!Ôà +vã&‹èF¢Œñ dÎj\¡ Ú•È,bIrUeÈÁ˜øÛRôH'†Ç—y…º%¥Hþ©æ”ËÚ½¡©˜J¢ŠŒT ¶L¥¦2%J] /d~Š"YÈ·Îà~¨T6ße(L´©¶V) ‘‘¡ÖüÌŒ P¾Š+Ä íkNï+Lýj3ªÕµŒä‚蜄7Æ!cKûš$ý¢ÝŠ¡‡ÅM³ êg(U$J,çí)ûS¿J餈ÂÕÅG((^Ò4DԄ à‚؝üT5A(„"ü8ƒCËPL!¦”RƏ+¢¶1Á-GB^þ-l¢/娻û@.V%-'£"¤ÓRñ’­©Ì4 êØË~x)x +ŶeÉùœã‚šŸò#žªåuX´^nÜYIÞ‹ÜÿÍÇ©ÊÕkâyLLÊXÁp·Ö š˜3,lÖáø»`¿)c¦¥ïâLTÔ²‹˜ãmæðõÊÁ€Oín‚²èÈܘ¹Î! +c®«)qüÊ­¶%›& áÚ]òÓ+Ü°Ì¢WÑ(jZd%G6p¤Ä4asæ¯âE”Žû1Y7Žç6ѝ#—rƒ’cY6Q‡±4[åÁ¯÷Èh<Ä+pýšUó Û]G6ðêìZ…¾oœän¤6cM“éö ®¶fÅA¨“À¹S•oûXiwèD€6 5Y¿vfx +H¸bp–†9•e<àí¦–sL‰‘°13]/¢°ÃDä1ňûM¥ê¸Í<¹‡í0Ôʵ¿ÁCä¼Äg”è>^ºE íÊ8Jd½>×idBÒ$¥<¶<òDæu1뚥2gSⱯÚ÷RW’Ì:ÔoôÅ5Ÿ4t<36¤,â&ÇxIKïá¾ÞOכͺìÂÏòAa÷« š¿2˜Ó.…T0Îwg=ºà¿•C“…ËB©üJ${ÐAiY!諕Äpü…iÛXu°GÖs³Óºb,ÁQUFª­ÿD0±Àí²P1RŠ’ã6¬v¶ÜŠÞåÖ@Xðd•ƒR¡ EƒiÛÅ +Gùh0 JŽZ¨GO ‰g€ ]\ô¦wK 9°ñÔä«©ýWEëar¡ +¤Ñ÷¸õ}nD”¨kÕú1Iÿ GÙÀ„ôäcqŽµ,‰M–%j_e“A4 É ÔÙyDwéJÆlO™è.ëùZwn€Â“Aï·¾3xÂ>,-“&XE ©";¤$’ú qZ5! ÀÎ}À 5€0EÌÆo®ûÅC¬[¡2 +DÛ¤ë—ëÜ U-o8“mнi‹êª}°®’½§Ò† 6³I8_¹$‡ xëŽÂÍqÎõvÌXØÝÖõæAFî°Øêô(©¹"R¥µÀ¹{Rý‹qKß$ÞE̠Ȕ/mqûR»V Ä6¥~KvÐK4ˆÝ/! Ïn&D^²H/WÆU2h˓‘änð.è—ÿÏäbÊé¥<ËݳL0h̆â蹑¨—ŒeQâ T.`˜—ˆèÿ~›õ±ïâO¥Ì,Äaqui‹¿sR7óF¤pOÿ|40™Ûá˜}º—VØÝ£+]¼KŒÿœ~”â,óÄ:Œmíº2GfÝ#€M½"¼IõÇyFu…µ@»Ô­ã¤ÁáR‡œ×¼cÎl••Ü­erÝÕ¬p‘áߊx@Cšt(_Ìx×Þ^€G(ŽÞŽmQúÜ'[—$ß1ºN%4A¶Ïvàå@²GL?€cv,®…’)ï:ŸÍÄ!iÐ- ¹½g)¨lþ8‚)TJÑo‚àŒ“‘DâIÓþŸ“û$ÅÍ&ç“ԓL^¦]VÌ©ëzÀdMáL¼LpC‰ðô: ÊVìîz´cB““ªØJʊæ"ˆê¬™KÌ.Uù£ÿos{F|çk +$Ò²â`3‘Pµö9nêÔo³åCo¸BÌ7?†™Òޓê]?˜¤UÎñà€¥qC±hÂOsûŽÔ¾GŒk%[öö¥Ôïçšq=š¥eΕ½rˆ^ìhÊ!€æºfÐ}nËW­˜#J µÉÉyBtùž¦/n·‘–OÍCsfhˆ3ÐõKè®%¡ªù«Á_¿¹ÄOêi¬|"ÓΑE~Ï"˜ÃNW»A¿À…"펑:NNM‡Køn®€#ìQõ¯Š{P£'“©w]ÏAsIP,ø¦‹|Wž@dyÔàF–{ÂoÛK—®o ”D·úÁ¨ÒlK +ªj&ÔYij;'P®2ê E)ût,K‘KN?\h³Lî÷:Xaª«é»Ë?t:–ã7nC"SÉRÒÌû¸4…äÿeD „¹ÜÉFþF%8QeÑ9Æ':`oeî¥[²! ™!!"4á"‹Ç$›pÆÀëâ½o-v…9ÚÀF-Ô9b‘TžayhëÔǦ.”LˆH(uDڞ%¹`BŒÞ8Ž>–®±4³£¢š„-`<Ò=¾Ì…(üöé ÔJ´*¬b2DP’(ÿê —C¨ooµxSáVP©¯ð ÞqèFéc_>ž,=œ•Õ™@x§(4G6ØIä¨ÇĪÑðŠ‰Û¥uu*nÇÈw0d‘å–în6‡jyB¢Í‚áH¤Úëäiš˜fúcå¶t}yíqBÀÂè²×ÛWzÂØz¥‡Ý’~ZjfÎ95q»†_ªs¦~Šu"ÑÔ¥†¬;iÓâ +O½ôt¥¤ûÊY²xPÏö©7UÝæ+6¸<ËÌÃÞíIå8’µ°ï+{~›n…hyè ‘W笘vtU×Q Ö—XɵÂd+óôƒƒº"ˆ^àá],o¾æ½¯aS¢ŠÖZ¿¢€‹ý¦‡+Z©¦7G<ä£8œ¡ùžHqSрøq»¡—,…Œc™î²ŠÔ’kòo%ЍXâ&¦˜tÉ5ƒ2â©W‘^Ñaetë\'‹ö_V¹‰VZ‰ÌÌ :';F^Bòo 9,X‰ ›@(çýê4¬Á<=.¤ÒGýó›×‘¶6:O2lO8..g’CÏà+ÌӚŸ? … R~uþÍs©+Ñè¸{gu tJÞqQCïÍo“pL‡&›e<•‡×ÓƯmóùÒevÆà]«ûÉQBpy  ˜ÐëîßB,¯t¨jÿ?Z;)3Î+3?âŠrh†@Ѻð s­cð°4°„Š˜6„Ð,™,‚FÙJèe‘ ¢(ݏjJOí'¢íÐî0HIÄ”´Ü +]QxÙè ·Ý7A‘Sn”gÍ-'¬n>WŒé÷?yJz†Hke™£Ã¼e‹þ/IøŠéx +ò é÷£œâlV»àý—°{†Lą9`Ð6‚¯´œ=À²ð9§3o{‚k}ú ~?ÂÙŤÙ3œ.Å ]Y˜}>m@ÁPŽdÌ­×Þ㺻«ê¦ç1‡ˆgÕtž¡Íï?g•‘NGYбËð¬9ŽxUïsÔ¥”Ð)ßi”:…DŸ,䜛\¶™IIæ# á?„¿µ!dt¢ë£:¦>MÜùî âǎ¥Š e”)rÉ5áZf÷¡àÌœ塚BJ¹×—±wˆ =s0èJv*In'õN’£ªG6V*™i‘Ïü½ypP|¡@â*i79]à5Š]ޛ¨:Tïãâ[NVïs õˆÃธ˅}ÜWÔ#ÚÐʹéìe¦b8<¬ ÍÈÝҐà ÊR9unÆÒ¤žn¸Õîé:±¨õ· 锶¹€.€x¥j`êîw†ø€„O!°>Duúø‚Q¦ Úc%¯ûฺº¢RÛY»gÈ[—ç/oÊ~å·HÌQ|…Žá™=‘ T¹@ö60-`qúùŽ×mL`~ 7ÆCQ1­Q£F^G=•`ŽI5Z æÖVà“tÃÎzI½¯R”Lªj]v Q\}§°u¢9u‰–f=õR?rM]¨§ 0£Ñ=ÒR=*‚}ÅÈ)‘|•ðŸPgÀ¡9¾ž…çÏLtþñ¡;Ô@C×ɓ¿ñGpéh$åø èÀΈÊZ½–ÔD†94ˆ|ÈÓýT8ÿ‰ÏìT\‘$LŠâøAh“FAJÀÞ#¶‰YyòzgÆlq&+ú'ý'X@¶]¥8Ð Eñ+)FM<ÚùK¦Ü„Iɪ{-VRNÕO·ùLT눏™Ñ¬% „ðLÞ }¼‡PNk–ï!ÿÔ íÓç5`yû¤p èÚú÷qÑ[Œ£ d¿8Y‰âŸqùyU܀—iŠÎkôåÁý-:·põ×°þüIÉdSÔühkN…1[)?àâg+'¦jøЀ©Òž…é0³~£A-Òº¨ì[Öïô1,‘ª@èF > ‚yû¡iàr&U)•¬ŒÅðñÜ⸠HŸÂô …2F˜åx¦YMŒ6¬$ž¢™n$qª‡âðyšRF®£; +ŽC( ,£'©To r?~%Á‘ëëšég ɺ+j†¾¨—Ÿp^ÿJ#>æãÉ*+kk$\ªˆ½?eÜ¯W–Œì4úý ”Uõ_xªÞՆXL4î«w{&%‘ËDö‘gÝՏJúU‘JlQ%£š@¦ïèꐠ߲ÑÔQêe³{ÑIöž,¡äüº0"*Eq2–~{‡öm€•DԜ|5o»æ­¬A÷åwL‘AˆkíXU'œÑQdD[‰7ÛÑ訅®B!{&¯Ø¯uãèhh^Ãö´xý­„2 ‹iå‹V +@†KÿZ6º+ˆ÷âñ ÊF«lÊ4ÌU£ävo »“÷«?Âç-̈́5™¡ †“.Ú PՆdÝ!BÔ…$\¬r4CWƜ½â35CCâ>÷’ÊÒÜ8­Ü=æ¾SJâ¥ÈÍ¥P¯óߝ(ñÀô“Àљ}SÎÀ¿aÅ:]&›|šåI0>ùW™x`ý ‘óá‘ËzuE™õø(’ôFÚ=áH j6Xÿ +í®új :Rë(8sl/\ó½á?'0¸ÅÉï$T2ž Xj“zý®<õ}íÝYÖ6a8G7‘óÀ² —Ä%Vœû z®Ž°¥KmƼ‹ÎÁ`s÷8 °ÏNÆ ÔYmwE€¸&riMê€ÌHnY)é“ݦ‘AŒ1] ˆðo»žTN•ê ¾ÕpÉ¸aG» ‚WrªÌ&ò­+lüÐòZ:f•ø%½Zz|Û°³Q/ÖÁ|Ÿ˜J ¼zè&U±J>uËü°M¹ƒSÉ0 ™Kěá˜>©×SšÀ%ñfPçG¯|§…­;³œ.uûŒjO«[Š·ÕÂÕ4SDÖì¤ÕêmFE¹"}u3{¿F/¤>˜Ò£@›±‡~ØÒŸÎ'ԜPØF·c­ +ŸCãéûÓ@v¹oŒ ÿ?Ê;¡iÎ凓’Çìƒ(÷8¥o´éáݔí+¹åþÅ Rnñ?zùP´éµðØ°WÉ:F8iº‰ Žx)-!ƒý†[Yì©8í™rÑ*/&ž I­yUdKàßØåÁâç>‡Eæc¤ø³fç*½¯¨I«õü©éeJDr&ç,ôE2´HL’×F`nóq<¨-8yÙï)QæÖRʓš•ð–­ªí½(È.Ô÷¢bAp¦*jh¥Nœ‡M¢ /ãÛ&k/@Òá1hÃïô¼Fm–InûÛ¶p7U?èr$H7xÒÌJ¨:œU=3g¡KCw"Ø 璽ŽÅðT ÓRþ6ö !‹¤›Tã‡lA´æϕ¾"ì]É#S2œµ—!¯þ‚”¾%µ)hu#òb¨hâÿ1"£™Ø‘ÄxߔúƒfÁšß£½3¶¦©9P¹Võ 0¬;d/€t6RGèélzcIAø‡Æ2©]ĦÖÑyO«G’άýè{¹Ú RÃëEµà¯—O¤¾uø]?S*èP…·\Á,gq›Y›Ÿ‹JþZhP28 £©.ó2sulq/ìVº¥­4¢’“²ÂÝûğt£æú?#ŸDW#K5&§Ž†××Á¶ tûÃv»ùg©Çjbr™HùÔMrÃêxbÁÀ¦·.¸g¬`´¹)à¢u)V +Áw ÓñTÖؤ«å¼)ìàû“œì"wB¦F”$œ(d‰µ,c7 oñàB+¾ †(h+[;ó†bK¹$¡jî +Ã÷X +_­cµºêŸ`LŽàù¾b”J­¦¡Ð)ëv±%°ÎÒ¼4©QôÕÚ3 +Xt†Á\¦†œßê¼^}M"†êSN[t&Sˆá¥_÷P>äu®!%4!\ãzxvÊ5p’ËT˜¬Á3Ÿ´TX‘lI°´É"ŠÎoM¤lB`12BÑÁ|¯Äx< —_w +Šæ#¦F·Úø/QSֈëõ¦{G%úÁ úè´1ßR?äÜ|X\…‡ÐDVÿÛtäk>)¥{қP ÷´¾-(X½~+þ¹ ,wËg’üÿ¯ˆ‡@rÜfRf­fÒSӗ€v¦*4‘ÌÞÿè˜*JðӏÓOށÖD ˆ€ó–µa:æ^Xù½GNWŠ3UǬ U©r‡ì¦ ºW8$T%k"€ÉUB’<¡š’s„>UüœÎO/LÇ“t¦V•P©Î#gfjjPFðmå™ó ¦l]v*¢ÛÍÈ}v؀òm~ÔÿqªqQžv€ Éz֘²óÚZ Ÿ[ašp{ž¦û;ËxÛ&¯r³@²Gvዹv?).naôˆ%vŒÐµÐªè®YBË0ÿë@_ӇÂjÒñ-mÌ)#ßêõQáYš;,{üIpÞ· +‡«h"„<–g?Tw}¡w݂v£jRhˬä¢A$Ök—¥‘eëáðý´Òq„eÍ ,ü˜z=‚}ÛIÚGìWÞp7ƒԚ²µ=×À: ®‰‹)dL ˆb!cÜU›Ö•Ì:«Œp’Û>3ȆÓ×î?óŽ $ÌYfóhœa¦Ä3²PRƒÂ¬RÕQ?¸,ëFVº€ÌÌÑ8°Œ—ö›« )“üÙP(]C£AŽÌߗ÷¡F3A·Œ ³ÚǑá‹y›ê¾(Õ\Ày1PcGÛФP{jNÊr0Øé*bÈÀ3u®Õúom“[‰oø4SÐ&H´bZŽÉžSiû£*¢n‹´ZgsÉptgf <àÇ0CÒ¥vk5^ù&äXÆG +«îˆ}¨oÿ„/04ožØ5ÄÆՑbИØI ±Bߓr¿ ¢¥Å4$‹ê¥ÔPmš®ö?Nh‘+g¿È?–“ï%õmûI,fG–õ֖0£©ù˜Í̆!çP¿‡² ëŠ6¸Žcѕ]„~VEjlO°Ri|J £ÉéT|ʝ˜»íØ"Pœ®)½#QAÌià̼˜ÄáYaiOšÿòjw†Ø‡¹©å?͙aœS–Í— +;x-¿À³iå]¨·&ÄrfþxÛA’äyæ‚&ÄUMjÞÙ£Údðüû‘Û}ùCQ¾<á² °áƒF~Ï©–C×ÈÉOü +{ Š3ÃxM„p!Û:)Û±(”õᓊù>y©˜Ckœ ÝL%äÕG¾ó†Ä#¬xëˆ×ê8~¯6ïüOå´ô¿ÝÝíe=Z´”†tÓ+˜'<-都É-ƒÁ¸óß}Ü7;R&Øl2È{LgVm¹“ãI—ÑçŸó”o̙ý¶#s]ÿŸGv)ìá.÷ŽåÆs6O~jê9Ø1k˶4–¯dˆßϐ +‹þÒ:ï%Œ‚†Bäù¾åùØ{ÇC‰”ãŌñßS¹™jþ݊“$—¹™Cy¡;öM'Jló˜oÕyMuÑHBÜL’Æ7 ¨hn·#õ²‘Ÿ°üüÀ„뤳ë@Œ •éêJ, ·H¶×¢ +•ƒ¾5êèG#; •ú›7¨ÊÑ;È\§DBdoR­Z o’ñSîvS”62µ¹€•“Œ:MMh¤Ö·¢UÔà'@° Š ®D0€«ä›¨˜‰µYOæ0eäœî"ih1Û"a¤méÆQôh!5ä*†Ôiê$"Tßöš4¸3f#LjÕGòÛUªûÝ}¨þScøSFڊX¬•–çq é÷Ƚ,`æHð„w€É¥)Úe)*S0÷øˆ“¹rtŒT)-ËðQƒ!=j¦m|) æÙ}ð8÷̹=ü +X¯VÜÑ(Í wõNNN§®.F +%ãJñ¨‚kq°™í¤@#ÜD¯Né¸Ê䘘ú‚‰¶‘¨í-ä8–ËÕóœY²<›½ïcýêGŽ_ބ„⎶bÉK«)ȺõÄż¤ä„§ö§ËÈNFíÏø?íŸñ n³œÑ7Ûa„ãX +çÁÔ®”;:ìkKk_áü0~©èTI/[¥°‰!¤A00(ä3g3]Š]¥É pnÄ´5F³iÄæƒòaÈHlŽ/ñDÊv°H~t”>`n<0%äœc +½A²ÍЈ)û ¹Qrº‰ ùAªŠCC?© +¨ö5¼•g\ˆ¯`ü +ÅNiíi=eV_ðRñŒ0 OڅºÔñ1EôZó»É»Ò:Ð7Bñ‚1œÅ¢šV\ãATúñ˜ˆ÷ÔØj2‹#a²Sr3XïýÝZö>ö5"czð´a…;Flð {yv¼S‹P’P¨$ ¶@JCs"ÉÁ+D4µRiîW›p|o[ö¸qð@Y`Ê +›Aâ+ ¾TÊõ#ÙKíEƒÐÞӐª5ãWÑ=’~T}俳„Ã<9Òìâ9X„0Hx‰œYAt29|œ)$²=íX;5-LáÙ5 zÕ¯2P*ªÏ}6wŽ{CÃÐ2qu°Þ½Æs‰; +4é‘Çæ I,P֛ARÊà¸6 #.)¤ K¼ùx)²“Îâ&Çqêhl¥m Ån!_%Õ“¤¢ûç—±ÎHÅkr£>ùyÛ}ô]TjZÊTgŸÜ4*£4Ch(‡‡ÚÓ8¾—xPHÄ&ÉùÇ\ylr'$ÄηLY—IMxùjDAnص]È.ëÒ6 øðµõ–XJ¬–2jÚÇÀ1“)ßb@g£¹té…KèZý¢3hÙ +ß2ÿ•6§Ed,ö\ÊÓþ­gcÿç)Yø Bx·Ü6šø‹ûY¨Žn#.íd2ØÑ7Q9„ØÜÕ´¥°]¡¬ ÊêEâ±øÓüˆ:òxG‹®}hiý ŽØë§Èq¬7:2m¾¡§AFç7@K…™%äKÓp˜À‰lBao’©JYˆ—È%Ñß/Ãm‡ÞO[W Ah%I³,ìù©°š*¤âŒ­.t˜¡’\ÚG˜n<÷Ð~Á¢’nËëgrÈû~x_»|ýhT5]ÃìQÁ+Ã©œ:À‡±œ¼é0ì"‘6³YE™\6ótõwZ!‹ñV¸d€¹—•]¡ "È×¥À¬Cñ5ž ‡ïzþsûè$‡k8‘DØVkZrÅ,Yl€Ö FÏ-ºþGÙ’EV¯ÆÂQFÖáÌȞD+|ZaC/ÅåÐóQ +vÂæù´Ê[n©“«Qਲ úNäÍT~ò.ŠÔחBGêžÄûùTAµÄ\ â®rbòz’c›M Õc12“$û¢yd*@;˜Î{eÎY–$‘iÀú€³D¡ +£äbÔÙ»vñº²\cî€ÛÙÌÞä[)ãÜÙKW<¹¦é¹9+‹œÈÝÎ'Y>ÎJó>íQ²ÈÓ뷪☗¨§Û ÌÜ3ÚJùx¼"à>² 1ÜÓP·¥Þ· ÚÀº³“ªXªmb*Ù}çÞ`˜Ô‘¸§p†uN[ TcRÆÁŒmñ1ï'û:(ã¶4`7±Æ9 ж%dÛÎ×)¼c¶-ÿ‚:Û3=5»±„µ4yy£¾Ý܇fOü_-$“¹s+í-6vØoËĶá!?ARt[È=èA¢@{ûzx[]n­“•¥Sà c2Mnÿqîs[ʽSóOŸc$Ûâ±tGf)œy³Âå´»¶¥¡JÇ#P3Ôv[Ê܄ z @·%ràDŸ4("  +8=šª²adɼV‹é(‹ÔdÙmDªFޚÀúµ¾èž8)í`Ó_Z¨ w¢c¤Ä4ñï8>Ó{lG—Û»¢™úBw¶›(.Öò ñ5Ÿ¤ÉÓéiI7t¯YäºnäëŸà² ­:M’*$”]ݑ„º¤cRŕõê'wNR2 ýùðdî„É]Wʘ“‚uHàî³´|®)sIgŽLajÊZÓ¹P™ªÛD¨®½áÔHfv ÷ÙÏ ÂRÄȅàa*«sÅ"ã1¬ŸÑô‡·]¾÷GsÒãÒhJ˜;à]ŽÔ3×@Â$H«^*C?ïK$ó“·gªÄs(¬Š‹±a¶;Âaã vI+&àW=é#BÛwHûkȈÄ׳vc$Õí;có™z*ZåpÓº•R‡ÓC{à[ÙòW×ë’í7”¸™wÙ¯‚%˜Lqn&ödW²ê Æç³J¶Ç0=ȬŽ°WðÔV#a$;‡Lã1 že{T•­'¦JCñS´¨ºÞKÑþ*ӋÁ¨ÎùÿÐÑMYš”Ä¿© ֛“«Ë¨ÅpG+¾q¶¿‡ìkBÝZÈ¡{¸j;?¤7š3‡úüÊɑñjrY\zSR‰?÷ºëE¸=Ý&,vX÷CR1±ƒ…ÖuF#û?LÕQé-â&Ó8³¿‹Ð˜y3ÚßšÓÖ¼4 ¨Nîn§'›Ü +éD±b]BÑ^}zû‡’8kríàû^ZœÊ¯ërkÒì˜xúIåã„‘XÑ´ïu—·­Êå´7ý:å쇕(-Aîþi7íÈO¬¾Yö= èw÷Ð<áK‹€Aƒ$ÓMA¦º¢Ú44“F·YÑ2&·ìàî­ÈfÚƀèKÓ^°A욁s*iç°c‹áÄvô,ʼI­y°‰œMõbE/lš‰ÊücW’9ýT’t&g^íT²:f6ONÑ2.ÊvÍVàP g¡ûFèx©Ï2œc©r.ͬ3Ç0Ph‰6kà¦aiAJõĘ@ ÑìØhJȀ@ésÙ Z<.§þ¨N]àÙN÷U—Cí˜`.@è‹tø¥v’­‡¸g¿<È®üI*‡$M­oÚjqŸ½ú½5 0»Æú¼]ۛì}ÌlüL^ëäK”Yn¾:§uxÑTX×I)3o.4À!+´¾I<,sìcÊa{-ÖÊÁ¢EÔú»rú°ÊøÌz-J‚¹Ø5¤~Ra'Bº·½Žß0uUõ¬í½wDC¤nr8a*\ ß8¨÷œ¿X–iAÌdlŸÔ.!uå[“ÊÑâGÌS«œ¢_|im^·Ð%@L¹øÓ×h„ü%ªæNóm^ݎRI¦ž¡Ìv»jûBžµ‹€FS}ä AÛ7€C8 ˆ¥Ñd´Í, ®5_°Y3”¾3ç 36¹¥[Ù,^’iÜ]ñ´ñ¯Ï4‚Ž‹v²®î°Ú¸ds¢Íó  ‘”­çI¸?ÓßhJÏÊ~@€Pžt³ütc -<õýè q¬ûE–E"£Ï‚u¨•†Oý*Ê+pÐÔß|x›:êºäãöWܦ҃w²æÐ Ýß­ñŒ±;EqÐ%n@òKÊØuî¾sýášÇœ@¨º~Rf,²½÷ç(X¹òÆGrŠ)²h˜L× !ȱ†‹XßéÄ䑅*aó'£­‹¥âXr‰gµ9òl'/eÆ;»~)‚ÿ'Ï×xí®h=2~E×úå7#ÃU*B`&#¡¸;˜§³ÇП¾8é/^XŒºg+ò0ûK,—žÇ,‡zQ¨mý¤öÖÑC Q?G}Ÿ[y×(ÔÑøeìvìÅ^ôRg³fA*§êe}zŸ`S*)ÖË]Þ óÀ´·ÒáQŠ3w]ÁõÖÓ íËC S£­µµ@=£›kñ ã:õò£JqpȲAeüPÞ®ÉGžBxNàΓ7êրäP;•›0²?Ì!rqÊÄ®OU“‚.GÖÑÐøôêwãül¬©N…ÂùNaPù÷ÿ&_bf9¢ËÄl£m"!S yÿqK*½Þ˜…¶ÒÓr /bM‘7ÛSuª&ɗ¦Ê*78Àö,î +5­V¹óÄÚ!a)x‹xÃ4› h¹ðàS4 iÓ³ -0¿pÈ+Bƒ Á]7…(»Ï×Zxæà§5Zé:¬†V)|’¾±î3€¶) ãœ‡=”šò¸Wäm-FAÖ¿ŸUê4E‘µÿ]¹äê‡KßØêh¿itÒìà$I_µš²d!×ۄ·ÇÞ7‘04zÒâՁ긱5éÈäú¤{©ÛmóåICí‘@ KA” +ˆ_Ý#n~w©…Píí>œÛNÛÄÉ=Ú"Œ¡¾>v ÌØäKØAŠ¡ÛB^ªõÛt¶4ƒßlûtgªï¼ãä!h;¨ˆ÷³ïí ÃÞ Æ³æ|Š2ÎsÕïŸUO]›#†ýýJ+祆L¹CC lå“<Ù࢟Ù[Œ¢Ì§õ™äi (6€j3 + 0FéYþÜZj6ò:¾1€|‰!ªš_’?\¡JEÍ\þ1¸‚ºSÍ/d— >8é´8€HÕåáAï<(ZA>SúC?@"ÀU ^ò}hyB؇~ )°™Çaüau0×]§üÂÀåŪúüµ +ãqO›Ÿ„lƒ% Ž bÇöOÂË\Ëòwœ£CìdýùÑ«vÇÙ²Ï +Ä´ÐA‚J|C§#ôSÝÙKÈÆ ‘î +á_#yô]<éob†)ÌHáÞ襡Å5^&Ó}U8âՔ" `ê/Ú1$b8 .ÖâˆæMìÆݵÌ.ù¶ä=ÎÍ°2…Ž³Ìäàäґrdò+ rUAtR¾—Ž +UᲜTùBç¨Ë©Œá65&Ž1BÀº3(õ¾t–ӀZà7xïÂó!&MúcªØ+Á°î¡»àZíõPŠn›ÈÂo>ҖøÁ5äXF\ Ã@­0Tl¾ÇÅͦ€8—À$d¿“]ˋï"tAéÔ÷Š®þá@íe;ðš-Ï¥ðPwV °¾™šˆª§5â_ÄÅ:…¹„cª»=ñõÖo!ç2&øëÐ!W²ùÝcÔe6*ÅU”xØ#Y0yH“>QšH<53¦•÷øÍlè~AmÔæÓR‚V2Ìm#Ú"”ŹyãÅÞ!3>ÑӕŒ/¶‚mÕìQË|ôÞlJÉz5! md…çw¡hZw²ö3Ój8yÙAÙ×4ùGÚÀ|œ{¥}žoi”'-d„Ѽb:T”•Zv]×8qƒh²WâÞ®­¯)z’íWÝ‚ysøXà`°üÁ®ËF‚h¡eC‹TiÚé¸JŠÉë1F£ú[¦B‰ Ÿ^º(MÖF— »óø*|,ç–®Âù°`6Npp+Çڑë<ånë¦ɱx|¡¨!XE‡[ç¦>\ù¾jë·úBnh++_Á3%!*àd_¹ŒTÅÞD\:xŠ¦;¯uÖHK·M"!«q'¿ƒ,šlÊ9“ç·ŽÔùoDžYÿŒ/dI·§!€¼múy¢„$Á¨]Ç9¡(k#¬? \]*“˜ZþÙ]Æeª ó)O¬ô°éìß¿<ƒ{ýC uêف'³¦À)òFùj8ñA1·J!³¸+œ‘ šM”˜p‡ ÿ,¨©&E²²°É_#$_’<’é#IÂoœ:çK…è²›Š‡yuŽÖ'÷ÄJэ%°(tþd5¶çsÜ[®á$Ÿgm2kÖÏ#~ó_ o~„YµECÜ8þÊÃ[ÈÀЍÌG“TÑÜ*-è»7›S̯ñör*5SøTøfNjá 9Q¬\›t¡OÕZb[,ü§ž»Pro¹íR»È¨ ÐÖ]‹ý’T|ÑAñõz’£ÿ n Á.D«!øµ°+`"&‰éT$»Y9 ,zÛòg©bÞ&Š‰ãqT¼®gvBTUÒ'7èw2ë=_ä€èÞ¨‰·e®t’ÁÉò€òÀÉ 8À¦”eôŽnv©Ò2ŸfkçOý„`ÒæpŽÙÊÏu ,[{R[Š0ÉóFNÊЃ%y$p¨G¸‡½*Ê(zpßxmpf.pˆޑ‰‹bHìÁJ&[7 + +‡\1“ 0"¸œƒÿù©ßEÝõ†àõUصjóØuì$„ Ë`em‚Ò©Ï›³¾´£Úhié±lôRÁ·‘òã½bwCãSGþ»j†Ã”Û¨èµÕÉäõ¥U j0hë%8l§çž`ÜÍ0ÜÇï#¹mµÉ¢«o<ŸÚ‰9 ¼~'A¤‚5TY¹Ìãˆ`ÙR#•°‚:Òªéb¸´Æp#áéA´'= +Ì+ãËëXëí¡¡j¬ÑÇ*£" ¢²–²°¼auÑõ€|íH­•7Ê%/s£ðêJ +ÐÙ_¯`å„ä´õO먽¥íÞÄÈg×øüć…¯Ñ$ÿ;»å¨([|¹8¨/– Ÿ6ÝA.G›a´Oéö|ãh-sL®¥!R<xÈxSföC„Ýb<øéÀ„g‘o!÷`°hˆ|‡Öù~ŽÉ¾ÞINçxäò"W54WQÌüW»¸©c3£ÿ™ÑDÏG›A-Ç1³A~2e±å†&DH_¤ÿË+|Å%=˜ÑCp©zÝiwåÃÄÏóœß ë’L˜eºøŠðoZ› §°î“0üùAŒ€ªR#°‘*Fђ«E)ok2;06§u¸_”Ö^Õ®a*û ¤… +©¾áAY! Zh:®—̜åG÷HiĪÅü^, …ËòJKÝCÎs<ä.ÖS=ê-ÞÈzråz@l +¥Ö¥4Åïæ +ðÁ%}3@Š!þW!) ­àvS~RzÇ·´ù +Áfxë!8&¾'(·¡‘ÔÉäÑjµwjtóïÂí5ٌ=w#ôfܪ¡Ú]ò-BÊsƚ¢ŽÕiÊYñy&V4¥J/%8«§úñiú'k( e,Ã$ÔL :Ï;YÕ*m$e\ ç ”TÙKô‚fþ»ːâ<«ì£Ï ¸õ‘ð&q +h¼¤ªJKŠòÏûUN'1ZJ­&HÒ§—Д£zyl™­JÞ$^R?€Óλ dÞn"¾yš!ï³¼¿]ôóÍè$ÔÉÈҁÍùi{5†y‘2©%UÐíK÷`¸@yº+ºQxkÇÅÕ±‘c\âIž:ð Fʓ+nv'ˆ,ï‚ئ,•¿ãž þx†L=ÆJPÿí%Ä Ìá…íg641#]ªL¨*gϗ~Hø™­‘RzNDI©B ðP*sb°D‡?> +cýØ »:frŒMܱäQ]œ=£’1ë~*LUOÃW¦ù2‘s‚‡P€âÑS›tu KN‡æ8ÿ;ëäÒx…îê.íY‡Ï*L¯³vÁ4wáõì;¯nڃuÀ»*æ){‰«®Vù$ b;Éñžûu‚6 +†ƒ‹`Ç­x Z9ÔQø½/m®ú'äø¢u ð}5I‰Q2Ø(q}†—Ì,¥Œ?tXçjiÄ_”2 .Rg'ÿ©ãúÇN’„سJOcp"ÔŒ‘εŽ¡ÿÜF‹Ë&âQâ€h:D6˜¶Ä/XCäKõR8L@7$ìD”º=|3™UsrŸÇ´¥’9YÁþ]¥"F‘EaãK äây˜ÖJÔ붽Çÿ̬y3Š€Â )¡y;ˆwD¢¿Ib¢øÏæÆKIÜ>€ÊG {#CÔKó v/dÀ®é !ÀÔôxœ°½2^T5*ñòr òaýß ³ÌÃpxÖ'ÑIÛÖ9¬1iÙÂÙ½4¹Ž©,¸ï Êb˜D)= S~tƒm« ?^z)’‡9Lv‘„·ñ7ëqpÉ{Í £V‡{…(ëä¦Æ[GøÂw¨2ÄUòjÌ:‡½¥ÕÁLo>ŽOÀ´ªÞ«•Ô“°ÿÛwÍ⟢±d£µì}‚;qx†ø'¼ hVAþnH§9.$|¼ûkó(ª)2‡ÉtOÇPÅÇu`B'—×Ãàs,X0¡BsÍ FÌ6—c#eÎXíÇ/Èeܙð LÏaˆA“í˜\@~S:Öè÷8úüÖÅÃ7ƒî/p ÈøKóRåÂҁ Ü,'‹åygˆ ïIJQŸ +z÷ÔãŒû™ãQ_ Óf©2süB±­—乞¤ñI|ŠÒý¢L62Ÿæs)}²É#Zv#UÖkGúuÜ~f¦…K–^I§ß‚‰z¢Ö»„“÷«ê Ö&íbSLgIaÀàÁÔ ÆãˆúÕ/à]úã…6§Aè!ý»$œú䢚–Úœw?Y^W +oJBGÛ¼H'²eû/›Ÿ„¬âBYùŒnÿȳt  +)x’Ub³Ø<"¬ÉBjç°éúñiYf[Ï: ÂÊA×ìfÝ þI¹oqóå#"n>e3…åÍZnh>NÇ@ä5(³w\žØ]rè¹à˜ aú p/H†ì–)‰'—ç0Ÿ :0X¢z*·È +j¥ÏW5|9䇔¶ °žºÎ6W>׎±¥<ômr_ýRa™«˜·&Uè秂,Džˆès4Y#ðÂÀË3шª£ý›[ ;¤-2x„¼·šðù@èù±ð?¹×“„1,óÕçx“À“%õ)¦ DŸÆšâÃz¸~)ÀóoºlY”€‹Â"Ø°lèԕØKó6æšÎ?~†ó‹$ÒnQ¡µÙ ‘xIn—€p„­RÅÃc$/—êâ9ÅhréTˆ¬Ç%…H„[Æ©þ: <:ƒ‘ˆ¯]=dŠ‚2UfTeJ`Þ²2ð¨¨:y +C@ y€ñ5à܂㲆Ԛo¿áà·Û9SyÔ5L u÷Ä0oNh"Òê]î灥-Ÿ`¢úÔ&Q>3oìÛ`6Æ%õkÑ$ŸJˆý$$&%ŸñÖmȟ_\/m‡Q ÿŒ¥Ùë{ ¹}lüoW.oÞù_ÎGBîF0¶Æyž¤ :ŸçD…ºÒ<ƒ&¦'<˧jÊð;Kí”ú=‘¶7&´Œ8󲊌Yfêû†¨ÒØe`çM,‰ëú):ôÑÚ\’Qu"ÓûÔdûÙlϨ¾Ä‘èqÍK¨R£pŒ€PNzPh67À«M: +ÌⅼøÿmÑ¿¤áÁ³¼nN´[^#ŒHéØÜçæ°Û•¤ÌÖrÖ,&Ä-`§/D%ÈÄ|s‚wÍV̦ÿ=ÛJ [Ô©øq04xf\7^´&2‘–û{€*:Gú,¿]Ó(YÎ"¡ÁÀVYílñŒÜRSIz©†ç-›Èûÿ-çv…÷³†/wpå$=ëcò(¦[†˜â¥žª»Þ7mçl8·ýËññöØ¢ðÁ©,áOÝ»€jt>y–7¾Áò– "ãë–óҞ|Lv3uvÔg0.‘•.rp‚6š œ¢ª ÝY# ²i£TO˜O‚EOÍ1S0¹íќßT†wÃàdÉ_·R†j»Á€a¥€t–˜‹~DÙ£Ñ)ž £Œu 8O`%@‹yóÓW'q „+hË>·Š„Œzˆf¼¯ê8«èEa3yÞö1Ñ(iu_–À8e“†ÅéaH §`¸&áïtñ*¤¦ …|$%K÷j79@Qé 5ùÃàؔ%tÑZjÕ °ÎäWms¿÷Q_N¨ ¢¨A3 –Áhϵ °ÕWü`èz„}éª Æ»ÖUQ&àT FŽOãðáOòœ6ãb¥ÓmÕn„Qê–eö&ׁɐþ/÷)ȟ¿O)ˍ25Ôӄ›6Š¤ªæ—Û¹aø¢óns—D£Qˀ…`°8¸%ñ\ÚݖfAØÉÝL+v(¶¢0¿*ØT7«ã #*s|ƒE^úï†ü3¶»«%:Y©íãBÏQÀ†þAë•áƒéAˉ0~9šEšNGnPï€b҂±@š!9LCc<ŒùÑ>1p#ƒb0Ql›¯¼!_REü‹÷ Êuw ?›ZZ4UÇLg¡õ4ŽÚÄ.üæ-J2O¦Åû –´€SôV,ƒ ¼öb”Û€CìdO€®!Ò;‰GMf9@ 2¯ÎZÝQã¨òæp'ي™CžÌìâÇýÁÌèGú³X‡™&Eâ×lÐ+dG+Fn-ÒÿɈc—À¦R†ÕÁe›# ÃæÖK€¥/=Ü2Ïü¯´ ]½Š î +ÅÊcþbáݒ¶ +^8Âø>=í75¬ªÝ?g†A¹#VG5¼–ƒhNâ°}ÚÝ[rÉÚA•ÃÓ¡‹<{0Àx¼hÈ:FÀ Áé_£©Ú/,Ý{¬»Û=í„B’ +?rš:Å×u+@`P;ä 5Þ('ҍ‡q Œú%fõðñÐÁ¯O‹'‰ýw•¹ Ý¯d»]ïæ™qŠÄ)âLÀ¨Ê·±”¿: +Ʌ¯R‘OIêj4ú$§ãHe<â!eÜ 8 +”^‡kIøSECËÀdÛp1ÒғD÷àz2Ÿ£ÚØwÆÆþàYaõg\nS‡ŸNª²„Æy1MA¿RSÌ2™“éQ?ÏèÚÇÉ×C4hÜ&@°…êeðgù¦ÄÒø2–)JÙõrn·³`®*è®r$ d]iƒ13à'¤é‹\…” ùKðRÐ%༆J8àUŠ‡_Å1×o,Gø´9á†G’Àê›d|¼Äf¿ 9gÿºÊ%uáXõõ0UzÓ,廹΍ç&—ï XŠ‡'«Êº__ŠmžT(Ȭtý÷¸Q„¬®³Ñ¸¦ƙµÇ›îµDF'1p¢*ù /žÝ…e’c{Ø-|lðß«bÚ MáˆÕ(ûIFs_\Æ)«°||LÒ½AñABN¾LN»¦óùšWáÐÍÅߗc9½›uH 4ÍN”çaVuí|†ý<|´Î¤áà¬9-ùç8ìø›$é*¢À4l¯þ«F·^æí…N p÷´¿ÊÇ/Rû?Ó@O¡ jº"¤¾‘Š¢$q\Rí®ö"ìyčƒÅ½n£ ,±cJŸTösGß3à²&Ê´ï:4£²3G᎐‹»ŸËóz"R˜K© +¤ çҎ͉CZùôøtëSÁÉz1zRÒ_‘éK9Ÿ†m#ø%kÿº¥b±?©^TaZœ—Š‚›•àÉÉñä©z#•\®Ñ0SÁ… €oUaöbáĄ- ˜ÞôθÆ_j—/Œ‡Hn§žcÎ]м›yëª18H;ÙÈßÉ´Óà3ö8VA;îÿ&%ÊrÐ@Ə)["[>jfƒêøNeI +%*ꙮЈ×íÃáA 1u|:¶Ýî€ñü +^É%öàR†ÏÏE±¼°R{1zT¿+‹ž.áSbpwîäžTýu£»>Õ2IpÕ†ûTåê5|K±à“=¨2n,‰¡yúäw­c†G§{ƒklp].c7‰C]„E^ƒTyŽ%ȺdþàäSK÷ §áÔyµqQrÄA]ñ˜žy`#²ýêP¤ ª{ Ý^•ýî“ù^X{¤áô±$ê=`ߔž®"ÞãŠKß°ё—NTja p¿¤SÉ"„Å%!”ÅtµÏ·„™;ï X+³y8GÜC~ìL¹éÇK¤¬n"CØEÌb]®€ˆK ðجºŒjîŽÁ^]¤Jb†å¼l@/Áwþ TÉââÁë‡fÏÍ8-Ñêæ÷Ý]B¯ LÜ Ö=™É÷XXrÏ.\]¡~þÆÜqªòÅÃÖî¯v°* ? +d1NººŸ‡(¡²w‘—dµÂ`‚ôrsS¨Ô :T™¡ßMŠ5h4ªl!9ïÞo´g'w¾ o¥Ýô¾`'Η¹^J Œ…W”Í0pý“T¢Õ¸9“‡±ÿäÜ=¨[Ȩff…6Œ ®ÝIGRÛ%8“áĂ¯æofê<’ÂÙÝWªòSÎÞ6û×Ï¡i:çé©-«¯;¹“4ü1?íQó`©°mðÉA¦;cÜ+å‡|Hçú†Y×j =?A ÇåM1¶&©ˆsœ$€Ò1˜Œ¡ÏÀð&[D\"*FÚë­ÿ§ó3TZàIƒC͓ŸAþÖÁS¾„ÝØ3ðV'¡v×uÒ(Õp¢Ž¾4txÃô lÒøòÑÖlv¬z#qwWÞêFIqvé-ÔICçg A{&7ƒ4îމŒí¾êƒHގM¼‰DI袔ô®ÿk×@ý†5M¯þq·7vÌtj@¾ Òh¼yz[û®4Êz¤:@Ú aÇën¯ºèùGh÷Å\×3/Bƛ¶[m^-ېSöÕë5z9“ùxÉãé,êëzÜ|”ý[—EðM€©mŠ€Õôú_\#€­_öq‡âe"„»z/‚äªñ<Õ O t9xžjѬӢ²y-®ÓvÿUGŠG‘Òì•o @RCôDÁB «GƒK–= >êr=‰çŠÅÚ¤+÷ü>5¢œƒ‹`Í7ÂÉ6X‹µ” ¿¼TM˜7À½5æ,àpŽ¸òx®dåV”•zÄÚùó5nôÖ“ðýÄ'ò —ñgEÒÒBÝ"$'¦a"J6°\©’qÛuÈ­¸@f‡mrߣ)E x}šäbª»¶¬YòUÜ®Œ¹~̓LUŐÒ&üaZ€ùà%‚Šf›%IË¢¢¥XEä¹Á;qS"؎¼CojòTL4ýÜRªäB?2‹j5m®Sý CsqKXÁ¯_šõ‚–ÓEvjm3bgªJQÛsXvýÔÓ¤9ýs†ÄJ!v!ŒÐ`çsFm~ÁUÞKµ°êú½Òé¶Ä²Îú¢±E %™Slãk8Їš~ä Ž²ÃpšÍ8Ø˓ŽÌ£g­äà±+ާ#É§»¶/#¨.è5 Ù£†"ô¶úZƹ«=âdœ7Úq²ÐŹþ€_2–‘'_ΌcÁÞÑ×Ì?¸~Èû3R+KŒwýÐç\—ý•W­%ÓeÅ¡—Þ–2òedIàäÅEüV£acžÍvÞÒ®ú>ßåÂÛ_èʜjbç +v3ûhô5°`†eS”²Úº`ÅŒ‹Va(#X”❃(?n­ŽÜ>KfIÚ¨meãû§úÈG‘ˆ®c_W(¡ï°JÑôQö¦Þß%»ô $£úC™Úá3C鮢ƒ{úy;’êã{.¾!JK¨@y6W”É‚8`íyì.²n…ˆŒµ WÊ:µÑP i7 uîžXZ4O– —ÐZŒ X£ÕA’ß´ÿ礆IZ˜23ô˜Øw…ºk/˪ Òy4½Ë^žñã]BìAnÂt¥¬ÿkG«ˆ3GÍ®u\ö˖îæ S~„c@­¥ÍœÁÌ{Å+‹ ­?KáÁ ‚r°‡ ,e&Ï‰ÚPTTúN´5Ϥ‘Ý:¦Tò)î-¤,SSI|a#‰ætÉ6–)u„O}s9q¹³U5“!Âq²Å¡4R§+H {,2ÛUJyŽ7ÓåoԺ‡4 äqLZkªK)õ¥ž­! –#ʪæÞ­wÌÅtúg\‘}Ç§¹ˆAÝS q„÷DlG-1‹Õ°¸ÏƓf´m A¿)יÙ)ŠˆEᔳ,`['2‰¾ŘKÛ7³Â +‡ ZB´&sf.pqzãRƒ2ET T!HjB` ½õ¸‰3Æ׀¦¹Û@.àT O™‚rÜBO½V +*vÉm z+ô‚Éïþ/yHM\6õ¯rf–zËpé‹&c°7NÄó7kMO`j“Ùà*qdHWÙu³Ô=BùFHW— ´¦P!¬d’ˆneÞHZØsVZ;Û =•ç5ÙoýÖ6¬GÁàÁ6 ¥É8õ}ä«hH$Î~7tÚuÊ6ØFî¹­, xK÷´ H=†q™TNRÝ¡üµ j‘KÒmX՘ä¾>ÙGÀß&qkGèðÕ«T¦»2UI‡ª‚Ü©Å´èlÌ¿LwÜ[›§w0àž²`r`ôÜÐßãR[^íôgßÒFfŠhõ§†z´}j©}Ž æ#úf€µZm¦•v'W'’Õ*C + NÃ$ÝCíJÂús0èŠó!@7ÛÂw,ßÖÞ1Å@êµ}9³~v5òéõ`Í5¿₹ʞ×È»)He^]õMŠLÆS`š°b·+’SQʅ³EH‰Ä“6³ue>O¬;D2»ýçÛÎIÌs’Æބñj;QºB ‡äªgs©Æ| ×Ŏ®1T©ó‚Xé&†¯¡Ì©ö–2¢u?rÄ[Eìw®ü»„ª .3CvO v¥‚?1"óZÿ…éâK£¹ @ŽGÎы͕2â¼s_-®cýº2Ÿ«:—!›Ió„,ÌYÆÖkÓW/-ÒL36 =ñI¸hvÒèÝҏšqø÷ÌÓC¢?绞R‚Ž€Q¤,Ô(û¡šæ€RíGÐVÑî)H´ÖÖy‚÷íË¢B‚oԏgC¾}&ýCFɉ/kQõ/Î4¹óð]="b‘«¿ó©U%¢¿>$ªòÕÜj´(ô´`7s~YU*£ŽJlAB¯‹»oBò ÞÆ»‘WHZw4H;;FDZÓ4H÷Ð^ÌTî©–Ÿ„5…í‡Oà2k܀ýèÅ(ôƒÈÓGtÖK뇴«÷ÊþgI^@¨ëÇÁJæ^khN5­Â[²gd–Â@¦âäµÑª0æ9þXW¥3Ó[‰£õÀÑÁP^e;ȈÍü¤Ðœªr0'ÆÀu¤¬äà@§ùʅZUµ1ŸˆUIßs` É«ËY4Ÿº'©z.»Š!²•×)ttZ.žõQj £¤_ŒœÔÌI±Èø?ÿQÐý¢Y*ˆø¾’â²Æ[3¬%5Zə\] …Õƒ,*híåçÌ ùZ!&ÇDYP&iC©w!\ÎÆrõe)»KM\ª­=©%BéG’¨d§ò““Ôµ{V WAš)íF‡ê˜ê°dóÁθvgE$ø†8%mÝMj[ÄÞ(…’[î@.ÁÂFžØ^´0WÌ·ä˄ÌúÖĄëll»xùuï?GO<¤J’~ECoJtÙ9P ã¤÷& Ïi +iÁ¶w÷a)b ÐC`fÔGPçÇ»âT8{_>Þ!nR1rz^Z\½ÜCke¥á,éЪ1K{S¢û-r ÐÛ_֓æMZ:¯8±Uqè—ÃzÜÅÀ5´Oem `\üøÝÄBܱ…³1îµá&Ȋ¨ýNG(ì⍂^¼ë­þ0K•Àso¥T °¼‰Ì˜æ_ÆÜ[Ó÷ÏÑ.—E¸5R[S¸«&i°½ßñý-…ûþ‡ˆ/áAüȃ¹;¨F"÷´ÝL%-ŒX3—µ|Ք#ùÈEi[]–{«ŸYë'!î <^tcÅt\¸ŒiƒéFjÞý<ëVÔ{ܙ†»qLüAþ3@7Êl ؈¾N)heO:X‰‘¨ðˆLŒ ÒâdvTI§¬M¹B ¥I¬Co¿sLڈ TíËWôþ™,Vpg%}Q“¿”vn“ÆäՁ5åÑr[Ö{ ¦5fú±•Ì:ª©ƒ¢|å}œ(ö B9 +×p†äì~J0¶Èpúœ \+v¡È=áz¯J9O˜ÄwÔÄ'vH|¯:šÀ+pb˜žJÆ¢-=»ñ&ޑÿ D;ôA“#Ⱥ{pà2b#¬1†I=XD5B˜…3)³v5È¿ùb¡ž•¡¦ké¬E4Ê(˜QÇ<ª]gÂM ‹9ÌÙ ´ã¹ÇøŽI„Ì^ÓY…îR±ŠÎU¤‡ÛøfûœeŠÅ©Œ¥¡äDÏú•…^ä.' +‚ þŽœ-¡ Ñʈä%×FïįEÖ9—‡úOtwŒˆ!Ü=8Áÿc u„g¨íǬ*ðç¬!ø“Äb +/±_#Öz[݆é“ÿ&}q1¸ô¹ B/L•ý”èjðØÆNó~©] F™WŸXx¹?„á^¤HÝT@ ê5pE¨Ët`¶Ì¼N$'V[o~…‚WT攠ùvzB†N'RIjZÍãõ8BÊ óþà±P¾Ã«ZÙp,}+=˜íŠož"Àd@ùñchÙ[d˜6³I"QYlêô¤´¨²&C}÷·P?ÚKMú.ÔÝ~¾À¸q"¯€í–î =1ê$RqãØ}h2Es=h͘&¦ÑÎÿu “ЛLù0qJÏ us—ÿ†£ªu©ÙóeŠ‚¶ª‘ e¹Òc‹Pñì5ÙÅh¦}Œú;?µøh¬ 2Æ­˜{mǖú ~ÑØ` +ˆdŸ^†Ü¯{jªu-•&2u=„§Œ•­ÞXžª=âW6ɹ†½g'¨¤";wgðþ'XIùtðƒ<«zãb¡å]™xpçrBXhŒu€f‚i͜¥eèÇr‹òûið•¬>Yš ¡äí•‹s‡I:ÅÝܞ_w¿~÷00kHM¤øbø®™Xô”PŒ¿qt‘5–â˜å5£ÈH£Âp)¢ãKy±Z(àÞڝù±1 Ü>*Ãlhƒ¬Ð-â›|U$—!#(³õmۘ~ÉÏã å²2Yyz+»j=ìîe}w0™¬DŽtp„|²Ä Lq@æÐm%Pÿ5⦅_dÚÄ*Yü&؎ǡt¾„ßb¼Q¨{˜:*Sê+úžæ©+·Ë)þ]r ¹‹õ[²C‚Ó჆«»ÞŸÊ¸6+Ϩt.¢¤›‡ƒ“ŒO‚q¿¶¾¥ÕÒÑÄx‡"«5e˜à£Xñ\£¢J½ÿl1÷®ÔˆT9Ê¡Óè•ý¬)fç¹FiÐȺ@‘AP,ÞéBíø„²Õѕýïr/Ù]yi¥«î;µ“î8\¶¯ÂDbTb¢pã“Ã~ŒékÁèQ‚H÷KÄÜ6//ž©Ý.±€î&Š-Í­Kõ|#œïüûaWÞ1Š'y¾ä×¾n"œ3Ù$ûnCÈÆ÷C¬µf¾ Raòq OD‡Ó€Ÿ€ ²pcð܆ò‘sãý¨æÌèþ38Gѽ„6™ÚQ“¶êc•üWšÚœYp–ÌE'nùË3¼øML¯Çõ‡>Âé&î æXÁž9—ø9còÇü[F’<Ã9KÐ{ú¸¬¬ sQôTiâ§v«³“[!Ìp/£­—Åç…nôíͅï +îéœÛˬó +>;05iðêYƒàöaü#ˆËB:K°†«ÝÁÕºw€ ç5ÀQR˜5û4Îò5ª‚å¼`9/A…šA ËŠ’–R—ÝÔ;‘#†^ðí»¨ÐÂfVm´˜ŠžãZ%³³á‰#2$ãýù&7¶LÍΛi4ÊD€½¦û5#ZEì¹ ¢ŸáâÈî –Õü7HacBmS9šu 6¥ZvÖYfl˜ 9‡í +¬çfÛðKøE(Â_zʸڎºkš' fuà¶-7£ÄB“m¹³á9qpIÊ!û!_Çz6Ó4œ!FWÂQå#‡KÚ@BŸ[láð·îÓ´þÛ¬0©ÕÎøÞr™">ã.5¥)~óä–TŒ„~{ZÀ©kÃÿ›|ñH +õ·±Û"I ×WÓÎlþɄâíºT’â7w²ĞZÒÎPÑSFÿ¥É*\8aãî.1;<]o($é/“Z”Dz3ö&#北‰r¸| ÒG£eãЪo ùU>bžZû&>Ò|„B[o„Ò(’Àšö|C~EcP¿qLÆ·5ÿj$Í¥8Dž5®úHà9bôUš$Kõ2Ó{-á/SõWÿ‰|‰û&¡ª9íóÓeE@FgÂd:þ]Šëåßå.{‡ÕîÈ“(Èzæ†HCÝf í®ÌŒw(I7øq§NrK'ÐꤖIȸ 1ždhf(µÏd¤Ì +.³»±•;á|SûLÿÒ³+Q™p©*MD‚_# Z""±_8ÇdzY[óӃßFòn¾ëF°–Ž0±úX™6Œ*ùB÷¡ñ“„€ç©•!Z²27vU^¬ý"„ð¡Ë.˜°ûêâžÉJlL‘cò”¿*~`C…êwǒùzjB^I²$yòcƒ|uöúʜ1Ûe âbyHáq˜æàaE8]ĂU…;ØôäßdŸðÇx¥ž¬¨f=5fÊ]yˆÑNh^¼Â¹`P7-S4qÕBìU¸$Ü´Í8BwS¾xnŸ×>ËÍ"– +7N>ß{ÿ)Hÿ3ºVýInâÑ-»²R.!`Õ~ØÜIù/}ʓoMõ>µWç0ú&þà-tkìɑ +|ªÎ…Cǯç é¥D>ò€š/V œÉYÁ¾”„òLLšœlê’\/o²JËßäû Óx»Í],(-±F{#NµPÑÉ›s6Y»кe>fC8ÆC„]$ì5¿°ÚæJY¦¼Â³„1¼Ð4dޤˠà©hdÇ0â ½ëbjÐm™TfQü.炩U$ bÊñfvډª˜‘û—D…\Ý Ò×ÍÐèëÅáh=`IûBò$É´¢`~ÜˍY2¬–¶Ý ŽӜ*øK³’θåó&[Ô¸ŽH2Œ_é± l£bœ­O4ãϸò ÊÞ»–ÏRé†f宅Gkœ€>I¹Qå(„RëÖ0Ðl­j fŸth²‰‘%zßä½Çf'‘}PÐH/ÜÍ&/[±|0ÊÀÛ8ŗñ̓LG¯÷,B ïå¤Õ÷±h·cÓ­›\™D›re%®˜ªLÌœI®Ñ2Z݂a/µ)•Îԝ(‰Zý e¬/¦FÏÇ)ø’Ì>ð’J{KWË¢M†IËúUúVg„Õ÷,fáÙⰔz>— +Éâ•(ԍ ~Պ‚w• @öÖxçÎ`qFh£1îÖÆ `ßð³SÃÒٞ„¹‰¬ÜÒ0¹ +ø… Á䴐ó{¡ßwTDæègÁ÷†¡%&Þrޞ"Bx$O7òžÝ/°ªï ·Ùàiqçm˅‘›–Ê*M啉€çÊOW7ýMD­4¾D±Êñˆ…)ñðNB_BÙ_yšŽ´±Ìç(õÞ*4åڞ̛Lá< Þ p)(qª²¯fŽ¥]y8sÂb<#&„d ÙȚw·¥»m!Ò³áÔ_êdàei¢öŸmæÐ¥N£QŸmžß×ÓkãRª}kÃŽ½¹=KŒ8'§êð©öy¼ð5ôàÅ»úóŽý^ÃÖ$zæK>Š!z—FÕ¹ÔVpUQ¼“|/q²?Y˜Ýz(ïyoœÿ'ñ¹Ž ŒSl…åýÜL®žÃîf[lwép¹Ñ3£ü¬ ÐP –œoH +L§½#ò¯Ú¬2%º‹ÏQkô û@1p·ÃH²ÓQýÎT¤"œ6äÿ{%+ë‡縹ü±ƒMñyÆãgC_IùN´O™Ø`4WÚ¸œy{ÝTÅðJ žQ’¦èàtSwúD±–ܝŒÇDNiÚøüýq±øZœÀ^tõšjže‘kܑYQF²ÅÜu–h] _”«y>±åc|ýk¦äSHqY.ۑM˜OO¦ÇKìý[”zö?l[edqƒ+ÀNtI”09âí%y–c»â ̓“EðHzvX D!÷èÅéÅ®GàõÔFùB„?j‡A=C7!;_„ b­Ë<>"òk7ÎÙzïÁ‹r%K03¤±Ãn‚]E…@ÿÖ¿{lT㸺ûˆµcr ‰¶X˜ Þ+·î].ƅ»™7gej2m¼²i º¹„ëY´ƒÇCʳÛ"┌œ%cµbó[‡#¼EÄR(Ñ}›]Kx Tqù9’U5¦$c +¯ŸfJupÒxž„Ôë%Ðà>•œ°T$^w÷0g™çLUHC^q¥¬œ1u—ÜëÀŒ‹ƒ½+Ž3•aû£ Îu¾k…]¿·@W Õ곫ÑÕÆúò±à²šy¨º‹CÑpj*Sܯˆz` j34i“zŬ…ň‰6RtxQÿЫ751*N"Å©yø©r.*$¨$©JjmIßpRbh¼(BþM¹AÅC’ÿ{R&ì€ÞDÉL6þÌéßq®†ÃÎØpü*;ö·ˆûr«Â÷¦ÁØÿjÀSEñ3¦Ìo۔f‚ +œÒѲÉìtWü\h/’`¸ÅÅYÇgCaž„²-¹yAZѬi õ0‡™&•‰Æ½7=È6b*~Š &8,rá҂=8x©*[`ï<-Ž ² QC»äRô±|-ùÇm$`Ãè݂^ °hföK–bÈ$œz2 xWü¨à_:‘Ú¢Š¼Û_Í­ÎÎà;' á”4äõ ån•åQ0wøž«ðƒ¬:õü•2§§lsÆʁÖÛ>…-Ü(ñ²ÜâÎþ„åþÖ*Nۘ(,[z”£Î.0ä¥hõÆ-0¤èÐ*¿ß”5!äD½«§+µlRž*†;1=-NgXÅåªÙd1+^K.ÿàÞáK 4<]…ÃØÈ:¤öåS½ÒÂîQ\„ø£¯ ­-î;ŠhmÉpADDÅ4gEã+Kc”-Җ팖|Ñ9¨y4£?_4tÜð?› Àµs®dQŽQÿk2“Ó¾Ù¥ÚC,—šà}Kü9)RrPB . (Aw:¡<ãe Ý#Ñb[$ѾÒü ¡áå؄ZÕà ¤Ñèb]ì @ÍX0=i±P3 {¬’?l[u +“Î^%9®Ï ïIÁ&ƒ¿Qz)Ü /\V~OÀÀp´;Ýó¼½°Vóæ)֜Ê#ºÀÄdµéŒuþÆâ—!/|ê1/î«Ìèh€m¢®˜[4ŒbvkVyƏôܱèúùiaŠ¸Gª`«°LiŸ’Âã(¬ÉŒAú´±yñyJ ›å…í›[8È’G×k¢ZNÅÉÂ{ú€ø«šì¸Ò£¬ó|¹Ã¤Y¸ ;W ÷)ñ¼×š™Âdè°¦¹Þøð|;‹'^jwD¦]@Æ^䜧7Ê?ƒ,ÒQ©)+ázUãÜ p‹ºäM·/ª¦w…ÎÕ^KxüܚWÚfÌ>stream +"I­%å±Ñ1 =ö¥LהðѪ҇‹E™|Š)zÔ2­1œ Úö³ãV5Gg\ªs ŽtE ‡µsZ¨Óò38QÔŒL,íºs°µ»'#tžÁ€í^OHž*ßxÙ·¼Xan˜ J7§A2ˆ±n•|¬>©<YӋqO!Íûëemh_`¦þÅweت»óP8¨‘P«jËw’#¿"p#óf]w-5S|8¥ÕU¬ Þ²¨¯¤s´A;Üô˜~‹üäð V?K‰NÝ Hÿ%QÇ¥{ñP̦çƒ; 9ŠXOÙ;Ë38‡’·'XKšŠXQ|Á.ŸVáÒ7QԇFm±ÆÙøÀ1ZÚ ‡ —EÝ+Vûࣰ…tãbÂÐ5œQÊ´)¹ºQ»¿X‹B‘D*쥼±>„ñ д;²7S¤·Ô-Áfëg-ò&Ԗ~õÔ"ôC +˜*š÷¾ Œþ,ØÔða¦°ˆó˅óè¡åŒ¹a ä‚>ϘQ%Ð,"Ȧk?ªÈ Nܺ;Àp°¬ÕDžymd˜auT< <$(§t)7ú©  “U*}0ì֕"è$Ë9dÚǛ­0üã›lœPAp•…4»-îú ‘‹—?* ”}‡ìO<÷¼­×üFê}ìÙ7ŒA8ë7j ô4½&zbAð¯9"ÁPK u'1`o‚8_ozŠð»Ž· -» M_¦×F¸¯ÕLnçÅjoê@­÷oáU­[36¸!0ÊykÁl<§BW¨œ¼B]‡2)Ÿã9þÑ!êM4ÓÚ ;Égzùýá⊦@é3¤ä¦#m´7¿OšJ5=þa&˜GIŠò“WcýœO˱eé”.0Æ"HÕ•Öã:ô¦?Ëq‹â\Žñ{ù+.‡UÓG–xªGúl5#FÒË{$Mϊà£x®òҒÄdIòy]*7ê­ EˆÉžŠGiH@èRgaûIñÊ*IeºÛ‹eýÑÕ½¨UÌ¥]!–à7È뎥—š@âÀ¡é>1hcìBE¡Ç?ò Þ:_”åÄ †ó%šôµR +5|ØÖY†¸ bM ¢`1˯¡I¡Í>ò7 °u*ÿfýÌ3½J;¼ä¾„# ü¼¹cC¸(,ªÄ滩VqÒaáÉzµ¡­‘Ôƒô¦ólXŸf?û -rCm&ßWÝÉ,?˜hˆA£ajÁé¦ëÔèiÿ›B«_>MF¥âaVíÄ¿\óJµ^eHÂ?Ó-ó*8“x<–]-F!‘”Dœ±°°†l‰–×öÂ÷…œ%Y’ý õÁq@ÃÓqÚñ@Îrë¼[QËsYô¤›sèFÃ(  +Z¡'˜‘VˆCñÓƒá<ÄmAN›Ç®¸<öäÌÏìçD¬ s8s0–ØíÂu\jÓ,ðß­•\Ù´ãÿŒÍÓßvSòLŸj¶¨–Ï–«U½®jy;$÷­ƒ‰~3#îLÀF÷ôGq5Ê~U ¼<%Õ²RJ"ÉÞÄíóˆDL,CÏÜÕ¡ÎçµRL59Ê×Ë32l“â+y¬jOe}]Îé-=*¬é5êÙ]ùcÄ)ê‘ôž¯e¨†ls?5æ’ýÙ¦ºš/-Ù,´èx)C¤z?(¾[36;éêæúÓçÐ7#î¼%‹k™\'hÉE‘Î~#ju¯¿½Í(ÿü,t«4VvêÃJ–€nH¸$ß,ÜØ;±…Sö‰õtO —a·.7^ø¡ûH*4žÀ~¾ªÕjèXÒ¡çø2>€E—yU˜Ãž ø8‹2ÚX8x`bioúðÿ!€_¦m9LÀx]øóDE O0>U™wYÁ…3¾E‚¹ð¥p¤™ƒ«‰ÀLºsfœ»°œ!žî~÷S®ÈJΊ¤1ª"ís[“–…a­z­ ˆQ‰Œ¯oRsO)y~‚­N{‡Þ¼FÏ7#' ¨i}êïF*eãÍUv|V +;éA­ÚJאX¾\T±y'ììWÈ$­Æéß4KˆÇ¼ºǾXz¤( ÒéÅÞñ =Jâ¹xœåç›þ5 ì7\%<‹ÍÙ —uq%s͒ç{¼ÖŸðW;¡W!0”Å€I¤ ÒÎn*ÖIí)ԓ¤€R("CxRj8z×zAiÄó'¤š‡Öb¦õšxQxçñ˜¡›UM«,¤¬aT#Òl͕ºzDPÕ +TÃR¬©œöª¢¦Mž „…–b|¢MOîDu:3ƒiä[E‰}iºÛÞڜÏLAò®åç~€±ÿÄUù´›aq¬ÌÆ|$.´¾úû}KC—³M|x¿•‹Ï|OO/C5ñª+ˆˆß³d;™àlôµ|Dkºnǐc¹‚ ‡ °¤gÕK× ±aíì÷b($Õ9üÐÉv4{š# +ʒ±EN»=û Zԑ¸úF"…z +ÁÆ1cÕâ>@aòá‹­’‰©Ņ]t€|÷ô—QÌ9¬Ö± GkšL† +œZ6àÊ4ÆÞª'ªkŒ$¯Ö§Ñ5Sš'â \­ ò‚Ð'·\×=W¦Q+VŽ +½‰2!òæNÝë¥Ó{77EéƗ¢å™ãÊ©/~dc$ºmæ0¤æŠ ”É ïgÝ`Î#íÔ÷à`óÉË#eړÍøÓ@6Ø <°Tã@åœŚºÐ¦:U)ö[0¹JˆŠœ™ îC>A,(Ò°x”V0°î¢¾?•j +'H0 Ý×Å$‹e¤”(YZ•X՘:  ?ü½Öî€`<èUFPI+Lµ£ý( 5pÂÌçØz•ÚÛ¶* ¥Õ¤™N8ô ŽTîÏNè⤠æPÔJÙçyÅÿ6ޏ™‡Ž @×dė=aB]ÞÓo ß^­q2H¸¤§¹ú&ˆ!&òDï`º•ª$l¬ÎyLk?¤ N4Ç£s•è$í‚s-%‹ Ghð7£L¦fL§®DøåsŽV‘Cèá2Ë®ÕN +WûrVÇ-AlSô,\L‡o”à‰€AÂ-5Ý 4í£œ;Bêô÷‡½Í ŒÁs –ñÏøã Z¾QR JhœOYÞµÜpxêN=Ö9å.w˜µ†õS +3DwËТƒ’*WaŠw=«ŠŸJ»ä³%^/PíãŤVzµŸWs:@³Wmçg|78;¤Q4ÉØÂAZ šd©“‘†kÝ:6•ýÁ9ʶ3ƒ +UL—´¢Í`T˜‡ÕŠåÕ>²ÙL‰»˜”N©œÃ§1»]´Î²·åŒ$þ¦ ¹'ŒÙ¡^¬'²ž²àô\ð)Áʕ^˒ÄaÔê[YOO ¿3à÷BVos‘y׉ˆ°øõÕ%φ ~c +¡mýœø*–ÎQtHåVã£o:¬–n‚é§Í,‘-HS‰Ê)¬(h1锍ã>C8ætË*N›kÍPõé(x¥_à…‡ULŽ1Cœ8z!)¡Woà•;„´»P=Ó&}ô½cþ³29ûÌ]ÞyþxO#öéö¯¨®å#š šˆ”‹Ô¼G ¹„Ћùì†M²}Ç.î?n×á‡ûDÁC€a0ùÙ±®Eô‚I&Iÿä¸:K@Û*‘/=‡‘[‹ªF趈¤¥ÿÕb-œú·eð$…ZWÁQf/顽j¿ä3XÉ:óQÔR3¬ó4h(hX šdÓ½LöM>©ªÓâ‹6o¾ªëuìÚØ"ªòÿêÍEºÄ C5†È2SùÃOp鼓8¹ 3þMQ™ütŒî»d³†Bü%dÇqē¢N0C¤ƒ)¤®@©,ÁZ¥@Há/&Ÿm½xbæ>dm¡ÏW¥ö”ˆÿyŸ‡—Œ­=ƒÕ@ ‡Ã·j©Û  Bòåþ¡ƒ1ø6]nS5“x0:13±VòÅµàÏorük~ŒŽë>U §Yޒ*‚Â"¡Ê½;«ã»U0IE,†o|¯ùét¤ µò*k—ÛÕ {=p]3%Šq4Ȥy,EyÞÇH¿÷Ο C–ÛÒïa|,gÇ*‹÷j‡Ó» +`¢v0CîU(j$ø\±ÐfêBí´ôhë×+Þ[,òºží¬\K‡= Fñ³ˆò= Y=¿0lðî¨'µœ B”KÄY¨^#ªˆ[4ÓðC÷èÌ CÀ xût£V¾äÏÔu~S1´²å$—%KQ ¦¬¸\™¬¡àX +ç»$ƒæ æi[¶ôӓžf—û4CdÏ…–y_‹¾ùÃw8çùŸGx‡8ds"ƒO#¢pŸmڊÚâî¾ä7“$ò¢°P3<”â–tn~P›“ÕF­“& f|Âtd«PÐGëf°H vïƅÓùDNãd¶H0î‚mcL"ϵ×-›Žð^'Z ¶#) ¬BOÕÑO‘ëëåJ_ò<ŠÞ I!½x~Z}äA–۝֟¼EÒV\&¶€¨ýú~NÛ@Ð:^ŸKIŸ2AVáÏŽÜ“Ò)øl؄8H£/ÊD÷ˆ†®V°e㠊âDùå¡¿ªÃƯªÝæ´¾åvÙ͓4¢,ý +{^‹—ê„!H™iùh~¯“¢ÿÈyõºì‡„×ÈòyO’¥èa=|ŒM&®÷<ý•[持è½ÉeË•¨—•)‡¬1Ł¬¹$NÛ7RÍ­Mõ³ëà!+¶êHäÜ„{öò\ßdÁœŽ…ƒ\GsÍ\­ƒ-%ʸ}ˆ³âµ-RÀ™#ß\kȸº¸JRm£LnB¼‡ñ@wþ»ùF³$\4£ÈÑ9)tˆ¶Iüi°…;CþÚ%S2Y%þyÁGÀ£Ï'ã™G¤…³ðå ”’hb¡¥‡“  <~„~¶\(Qö(¡;? <»t¯X"ù”â·y9ʓõ 9“çÓ‘–©¯V×A:uÃ8’I3+ôúK{l£v³xdwº`@²„~àì(ÉÌRÊØ aº‚½g€URq-n½2ÚïHÛÏ9Ö$qÈÄ_5l¬aÐkÿoGj]]VíÿâÁþ(+»V¼ÙŸ™[ãX¸xû· B!µÒ_̳•.ëoú=;O¦Úö&î҄˜îhã~K† ÿ4ð¿aœ¬#ärI¶º»Úðt;!ºY©?ÁÌð·£`´SUÃ\ÈZŠQc^ Ÿër¶Šxž0Èp*Q_!sªÚ•»ƒ4RR¡}½À®Àü~ڐ› ´ÌsÌu0匲‹™Ea$w2˜’ªîéñpÍåðÏ\ùŽ:CªLÚ¢¯¤K¢c<6g3“ä +¢y¿K¯*i¼‚ êÁíٚET1CÏÁ0{S÷B3s/³õ¯À÷Ga»„¦&·îAßµò¾¦­W>-ÏzHl™"àOnO¥œü U" h#yt $4—`i1æ‘ešã.bg®T£§43W}·<'IT¸‚†ñè5„_ ^:à~:ÿcôßpy˜iØ\EãÙzß_nŒv¾ßcù×&—Ýn¬hùÓåƒ.ç²RǓ5¬ªã¿py€0°ÄåGœR:ùý I-On3;îmO[öj"SáMH哞?o2àݏþ¾5`}Qq_qúñéKؾž‹®:2ñÖŸÛGÇàù¶5k Un„ÙÔ$;y+¢„ù b žÏRЫ%„=?Ñ« >%<´Þ«`­ïA,QÆÒÄ¿ÏDқTstçzÊ@ú+-BÂöHFácFW? + 7CS§²Œƒ¯Ž1¨ê¿»ÿÉw¤é‰&׈v]W/b3BB.ê꧚\ ÷ø}©`\2܌Gׂ€î™ä||_V¬l%€ÃNSÖ² ´vÙõ4ҏiÌ@dX¥6àXþU[[;›ð.@4?_Øûã1Ä#¾4Ò£t–në4Û|X*òg¼íÉ »œ2U›KØÊÒåڂûÝÙ•AäÊ­AÉŠË .LŸÙHOôšq»w8 e¢ÐÅXó(1xÖò²ò?!ä ÏşŽZþ°ê2¤¸¡Súsz¹_wM VTݦÅZ„ m}ñ|ò*,{›o¤E¿…õKÔÄ4™É¹4ˆ”!Cí­~)X\„ø¾5Šó¸“ÔʎÃJ‘@‘WÝ£Eþ¦¬vz-@lrÔòR +UÎ;Â_عBäf—êL|>g¬^Å腦„^À!NÌÙ8÷ÀEö&<*ŽKsd“ŠO=bÞ&G7¸Ñê)Ð;#$¨ï¹¥…—øp)6sßûà`¤s¦íL·l:úè*O%9ãƒì÷ ÖrU…¥Äioo6ž)Ý­BR|¶Ò%ÂB˚²ÿ¤ëÞ ì¼zçk +z%Pœ˜k—ÆŽž…þ7¢ò鈰vñÁ„ Ã?F™ýýs“(JÞ1leR§ÐeRº‘UâŒßµâÀøŸ¶ä^3{”p²ÙI%Ëþs´´7fã6 +nNÉ +&¿;`ËãvÅü:ÇWx*篃ÄÂ"]7;×<>[4R†+ª)áǃ—˜%ª£ø.bþç'¹Êãy/ÿ1N8F1ÔU)’b-Ïa"Òy”GÑBQ Gt#Sî&”SÑa²¶¼µ@¼DëB–š¯ðç½3Ä«»^EKÆounâ³ ¿äò§8wôQ{X3¯rñ1χ À¢{±ëk쭞ù• ™ ë¿ÞãIž¦®ÔO:S%ÓPwOŽÈÂ¼Ì u£0ýqÏ..™Æ×'pC3Þö÷¤«¼ÎÓâL¢ö<8ú6ŽYÌÙ ¢¿ˆèû` “ùxÙV +2Ç’W[ˆ«.csZ+FCVp¸Þ‰Ì¬L¥J‚J”FIK(J‡'£Á¦Pù¶…’4ëþ¹  À\ðrϸ)½$€ÄŒ)Á®Ç›·†’nâxZû•:׸Ê>”I!8TSçÜ8ÇS„iôìd›+⹸œZLô =ŒQ5ʓ(‘úö¿$?͐ÔQýlœõ=Pã0@ÃÈLÏ£?€$¾â£ú°8c>ó¨*Ð$Àü ¹Ï‹p¶{tÀñj}—àÎzçð·ø }àµýÆ7¡ñk@<ŽºoòÁ•ù¦ûaiÙ«X‰â·ò¨¼·Ò¨VÀ֋ˆY¯P ðÔÜÇFÞ®Xƒ8<²­)™¤ÅØwÕ¥% ¸>ˆ™‡×À•Ð1OHî¸UwÌ +j.?²Ÿé°q<ÛC ãÁŒ4 +äÛô_-íík̲ÎAÅ.#Ð}šD㦠y ÂÂ,³ƒìRSkÏÍ ã¦‚ÉúÒä$}ØénAãþ®ºÍa¦÷ڂȟeÑIÆxtu²>`¨voþ[zì’ÆÉI©þ(‰ð÷¼ÓvƒMMR×Uh F±‚Ì@¼Óæjìô>e-£ T^J”åyªµ'µÅ¶àz;¤Õ=íù/t¤Ü¶ÒO*Ã_]·2:TÔ·!àìºë>ƒ>=,×WîÊèÝW»òºNÅlt—öH«­3µã0€ žë¡÷,Þ½pä÷—ŸìÎAšÉɵÍúÿÜƀ¡d1=oÒVžq¦ „ÒuÖóœ*Ð6ùb}’tóùÚ¢1<öUìtIšó„3˜¨’¬‡ýMXI–Т9¶àùE=çڄe)f¹×ÙZ}xßãTÔxÀ`Œ¼¸åhUT{Iîit—ÓùÑzáã‹E¥L‹ïñ(Y";Ü-½Ðª^Œ‘J’·ÎPÃ4²›>^kÁðÁ^ +ŖXGõŽ»\˜Áb;4+!yLJ¢ôW–°ü%³±œw1¶õ°B²XIF*ÿLÑ¥A'ޞQV×=¹%|›¤à¨›0¿©ì"~g&=x͙p5‰yîþg§§®+N €§ÅHÆ¢Yx€@l¶p'‰¸ÿÒëýÞ*ˆâåǛ(/.*€j–¢{D.â (é’6¢Ã>³L$¶UcÊ# ©õQ4¼Urh؎[ÂÜâØÑՁῤ؟lô‘Íí +ëþŽ^s™N©š}—@²šD=cœŒ’×úfr¶‚ðúƒAtÊ0*á'ƒëQ!›I×á7áX¬\µ˜ó 'XmdªÍâ”Y` +”òZtb۶΀¼°f[»†I‘aþv4~{%¾A èGWàøFvâCTˆ;»‹×#†²eÀV†>F>˜ô/æºÕ¿÷¢5†•³r†Z‚’ xAŽÖçñhWª–Ü¢•ëNc8 ø_²Ÿ>‰¡Y‹ŽÄbh’XŒ[ÖÝ×à}ÝêLÍ=y.iéÖëÚ"à÷N×m®&…í–&üÓ‡ñ ^<ü&AS3÷ Š$,=Û«÷+9xêۑ(F &ݳ^”ÅÑÞ&ABœh ;ÅjZ®ïÂQO`Ô£âhé-ô•iGuGٜͼËoX®Þ8¤WÁ|+àˆøòŽôgÑ"Õvõ«Få©Ãp’²¬ ÄwgÿŽr«‡íQIº¥ "ä½Æp\ÚY¾t —>:Éõ5~ª@¯Tõ[¤ÄàöÉáa¶½µ{Lr.="Uš_ ãJö΢ +ópá„âü{¢$Õ%‘«Máj2.Aª/Ë´øä¤–YúɎ’•5¢2¹)‰ #®|ØȜtÂd‘'š(!(4…ÿaâ¬.\Ò9.Œ1 +í¥±ZÚ{ÞáX?s4•‡F’ÇÓ´@±¥æ rá%Z{TOå©MÌÃn|‚ç?ýxß;Ô%óÎËM TVìfWÌYhG_CVàøµv 6¼ZûÝ~Š£š„hÕX{mӕ½ÔêÞ¯@ôp՟m¾Ê¶q/i‹{¤©mÂýiCyf­Yá¨×¬ Šévš 1ÞïÚB¦p2±9@„ÚŸ{·hª*F?pڗœJÍVË}©j=ÿj¨ژLB;ZJÎqò˜¼™4ÄþJ‹NZKƒ*q3:y0O­óŠ·øMZ’웆—žùđ:çl‡5-×Ĩ÷ +® ~`f‚šN˜ î™úŒ²Ðý%…>՞¢Øݢ8 Õ3yUb¾shäFd…½¼ßJ ó+ +28Ï[º¼€m±N¹Ý ‚¿Y'šÆBìÝ¡|Î`mü䞾eÇ°‹' ÷4ZšDc9peμ«5p\•|ëE9Ò_Çݛýó¼äÈë˜òù‹`Ä¥ œV·4±OÿÎbFÒdaa—F©ÏErpéI.ÍD…ÐJå…Þse7–_Äêd=ž5³Ò+yØó7•“ÿxLMìlê­l€N¨*bW\M‹‰djåœÿIêùÒ׆µ3œJŸÜÈaEbÑHÆWˆ9f—*ëðc'CÙñù +ð²QxI«Jõ<±Ðú°ŽilÕÅx¹ºù‚ÀÓIjK쇟Á‘ñtÂÑQ¡QÛ½|õͶÇ'ë +k˜…Å£ +Dv)S‹Ã—­°uÙÃ,Õ)AªÞíVõ®Ç­;÷ð1øn©{?S¥ÛQ~öbêNŒdÉJ’Ÿì±õÍ]žŒÏ/]̚YžÓRjAU°,}Z=¤b/ùå^+áyè#äøV£d›õa*7 µÒ•ª€º9j4§0²Òsäþ%°BãÄÅzè³Þ«£y.ӔaŸÔõèWÃ-/ iŠ›âA O×-ï˜FUvBª²y'zýä„ÅðÚBÑ1ŠòŸ)8ï,oðl\òOp³×³øÈ-ٙÕVñB×°šÍ<#7UÁfúwwÕ:G@¬jaôL×$õp01Ƌ7ZdñA’±¨ù¥Փ sb{3’r79û@êK1>¹r_NBÉւCçéÄi1"«QGÙµa÷ ãŸï¡«2û©Eí¥¹½BÐ+&·šäl}AšdýAKA†F BGš¸z¢¨!Îv~K+‰¯,)Mª!í;Ž¦šF•Y¥x ‘øøÓtúÈ;lgÃqT¨+Ø: U¯¿¡ä€¼3·¾Z•»ÉWˆß?d„s_­Ò£Ž§)o(œÆ­‡™àç2{ãV‹m±6ÑvÒØL‡Š¯ö¦îoðå7̖àÎYcào‡‚ÖF¾óü:¤Ë”áåÄÉHè•-6ŒÂQ„݈ØZĸ•=1ßx’Ø“,Z„â”?ë*#À·a¬¯Õ5ɚîˆj­XøXž³ Ÿ¾xŽI¾‘ÞJÒ4$Kqd–}&X*?JÝU6ÕªæІÿ˜©)–Ø?ž ¥™ãìªÕ #öñ\Ž7) Þ¾˜(ÉÃ:ÙÏMÁÂDq¢-)8"ؼ2³ë*`JÏM7sè ¶YÄ‰L!âúˆï þ ò|Õ¢Çà=%¯A‰j’n½°…þCØÇ®p"Kk@«Ðû5£imó‰PõO’‰—nbÛóÞqɔžìÇS$…êù¤bwÛ`;K–¸þÌޞ¥Mœ6¦ƒ5¥1 ÿ†Ê ½%æPWÚ¬Òр Yh¾™9ÖP˜çO=mÓðLð5‡¾5ÒÏóÚ +Ç¢è ¸ܛ쒪óÜ:¤Á\Olƒt¬_]B¬d [[‘½¹š{9µˆÇA/¡úîjá°$¤/]P€‘ikcWCßìÌ ÖÚ>#/@6—Íü}ªà:Њ¾›èÆÈ%æôTÛxspêñÜÈê¹É[„Äz¥H¯7h^|Ö¥¯–y“8SøCÚa¨“ c²Çä#/a%¯"–ì6¨ 3dé…ÒØ jé• ËÁȉË/” ¹há¤ÿÌ$_[Γ9Œ ±‘BuL( ph0éMXf¬æ!ÕÀðs2˲\1<£¼kÇw‚»Ý&s»'³0D“ÐÌE7ەžtò-Ygqü¾;LâEM¦eiü>ÐXŠV…-øÓmêú…Ì¡s•èIC!R9Íh×Nš]4b³T%úi=>ª ²›åƒ0Ó°;B…áSð)ÕSaÒÊ¥éé"μ€WùýÜ3’ÄDèNb*ó¤F1Û +žò|Süæ?õe6]¶ˆOš ºä‹” ëœÞsY€ž¹]Îf#J0×n7áÂmåºU{ð}’wܦ•kފ j%ܱ¢@%øñ9¼g0¦!^ÞÓí>·]†Ew Æÿ#Û8gsR~†¿ 2ÃÜÝ;B"øZõxxÁÛwœ~ ³%O@RÀÜv!zø”ÇÅ%ì›íÿáZQüûhqUž3¨P5òò¿4™c9ÃKƒâҌ’ö֞J¯ñ^L4hԓ ¥Ï£ØÄÈÍcþèó 2÷æðn,ۀùdâ91„Ôä´+ ­–\<Ôê:V@§@€¸D³¦kÀLI)S’)ÉúàIƒfŒ÷'Q†8wʬñXj4ã8‡$º¶gМ¤}¬5¼ëôØzê<§Ê[!«¤§t:¹jjï«tý•!Q[¶Q‘ +•ðP:3 ʖE<Q„pmH”L<V )Gˆ0Y¨Z¿÷º·Õ21*rGΠFCçû¡ÌE‘$¶”g´òu\¦(*†H"AQ”PÚ¤å| ќ8I1ôaI†xÒ †ð=9¶œ±JŠ‹àiJÅ崚"¨;¼"9d«Æâ§!e#äQ£R7¤üvó±¶RH࣠+5âO¨?jÚ"ېy —|15±’L ¹‘‰H-áiJJ§¯Ôâ:ÝG‹Åfи/0©Y4+¹‰&f:4uS¹H(I’‘ªd1C{M…ýÊ-%sjK”4'*D‰¸ÑZ•ÑÕ<Ì­<̼P`Y¦Ò;|ÌI#]f‘I* +‘ÙÔN®"V/JHIHo±&´3^ ©MUͱE¡CˆBaÌy‘ìTÚr„äÍ)ø‰;ÞWɯ©8C؏tdÇ¿áì$œŠ$%AˌVbBǬ SI¨.â¹ÈÐRò¬û%¤^þ\¾KF~ž8mÔRãУÉÓë  ^…Ø6ˆpþ™pXV'A¶^‹3 BYQ ó‘¶sóäžã§&Å'c +îøµ°ÓŽeᚐ§"󧓏ð54ò™¡÷lqÂ94BB6±áœjýT¿RT†å¯øã3kг ÷ñµ<@|H‘ŒÓ? ‡ˆEC¥ +à¶ÜHŠú©FÆNgiAf„Y(¥šŸ–$n‡q°äSEz** +lœ6Ö}$2Ñjá9¾>N2"éó\…¯©`+„”?HLÍø QV²ÞëØ kØ89X؎ߚ0f£r¢BP:Q$ßcÆÓ*7‡¯“@‰ä%K©EAfäêxÞ&”f‚YCŽYXQô`R(ÕL°È=â/ò\&! Rì9ö3ö +Ÿ¼ˆàÈÉ5— ³|4™Ì(¬˜üQ”h1,%6ÄÝ]M¥ä!gaYŒÈ¤w)‰^§BŽ ´NR¡õƒAÅ^8?HÞ "TnÁ0È¢¿LÜ@½ià‘šê¤}F”@æu öWZ ² %R ´í…¶R#U¯¢±ó ¨:Q|Xd{êY×>¨Å h"š?x*¶S‡$äùÔ®ànÞm¦;H¹y½­3·ÄIHIÄTӓÿ8ŒeødE¬_\vȰےù$Â;4\u‚.ÂõŽ báßڒ`3lQM_‰†¶‰£1pjü†)b߶Évp¢ ŽG2£¡z`Qu #~¨Yõ ‡ËwU•AB£"?b¨±3_҆ˆ G!j¤šp„ _jÖÖ($K.Ù@Cnº9…‘¤h…qªf¼œ!Âÿ†8‹$²lYû„$+Cíe²P0L.ÅéKQLöSÍMäTàøë¾Ê†mb‘ kr^XU< ½ Þ’ç¬à‡óŠ¡‘#&ÆQ5þ8}QH<‹CöH\1ɟZ¬„z†Š\–µ—jŒ«J(Þ=5æŠ ¯(""b6Јœ¢ÓªÕ™Ã›MW- +œšVP•v + sl}²¨0ü¥O8IJ* CŸ[;´:eŽ0Œø$՘‰s²LFØ]˜9Tu +Eð^~.C¤¨’%ÅafĬ±™u)©D‰V™KX2.ÂŽS^‘Ë£Í9jÛ,"ÑF¹è¤x7¡51¡‡køfá)_oÉejêBkIGU÷T{°L}FÂuò„‚ùÚH'8'ú1EM¥9ž*Zy\ÝtÒ݉jwêqŒ”§¦$c Eª:ZGhß O[ªÀŽj¡§ +©WG™ +ùˇpéš}%ñÿuCUû–®LJ2šj¨IIdÆߤ@& ‹óXõ5š/Š-j ֊±ý"tÿûJüiU Z}DŒ¸ ¹Ø‹}hÊ `Œg¨!Æ_&MN«åTSÓ4%Q‡:—ã$Ïȉ²‡œÐ!K¬$UÑJ– 0ÆÁ5|Ç2v|r›vôM†”TDx‰Ä¤^#ÕYÕES#n~"âh2ù!ã Ϩ¢k5yhŠ$f†£" +uþ¼á÷®"ÒPùúUAfhǤ ×Ð9DÅqrSÌ;}ACF4{b"ÆOŠ‡á2'4zFb5¿ý±”{ÄéGdÿ›Ž¢ëUŒª”ÌržëSso¹ÌT¼V¬Ëø'’ß-y‹èýÔÂÈ¥äãD5ÎЀœP€ H"@`8Ô±x < € @2RB#?¤"ÃÏ|Š¢AµR‚å˞™ü!!Eô¹„›|ÖpšE##av÷¬ ‰  )j™¨M„wÓ§IŸ‘DÙjHô»ö5‚«š*–0×H²‰% +™R‘öà M\Š(Œƒª¾ªZ8ü^.«×L*8CSCs#¡—<†êªý¼<¤æ$‹C1ºHŒŠ³…ƒRÜ-~ˆ¨±Û˜TD"8E›ÿP$9Ô)ÑM&S„¦Tb+ʦP¤‰㙇}¹Ò1cF²o‹ÊR¶iFµú.ñiÌhÍL§<ŽekÃRý±yUxm„žÎB‚,RD·„é+‚˜ $“i¥«¬[îÙLÉD„~[›àéb…Ìꬷ$\‘Ø¥DÛĐ֠LYF=bP¤*3ÿ"RbEŒK¤»•ŽqÞm|fEšÊÕÐâtáÑ¥RH1L7ÒÍ1Ä@œVK~5*RïT£©åLÆ©j,´8Ð|Ä 4ëP…áÅ÷¸&S#E©B¨îÏTIý –D¶)6¨hGV Ó55fJÆ:½Ñ^“65Aº!¤°NâmJï?Vâ—°‡&ూïX5"s.óÎXžê,ñ£XsÈâ¯ÉY4A¢™Mvýµ‘JÄÓŠÞÅò̧ÃÕ]Q¹F ܁þ„â<òè\çôóJé"*»«F>#™¡0 Òä#þ\‚&¢·Ö˜þ Š°™ºˆªt\DIìaêLáä4!Z)Ñpô$;cL­qˆQ…X=6Ž\ø¢Ë1@mÜQ›rG\ô £1t>Gh‘£u¨ƒÜ¦êÛè!åó{~D¨&™;Œ M„ÛéÝ#ˆ08S™?´SJxx…XSCºÃÛð¡“œq)U=#MÏI˜iÝqÙג•FH¶–TDóüñF¢Ä©÷5ûÊW‰…>±MŠêž‚EEå62‡=¬&Åù`Š~!ebå#Ž×B±‡¾©ñåWÔOYU*J#,j0Pg”Å|^´a˜þ¢ÛÉ|,Rñ(¬3õ[˜´YVñ~Td (PÊ@"¦ºF˜æ ¢ñ™ۄ2*Ça&Ó0k} ]á#ʶ©í҉Wš7Óï{ÎãV˜Gh4»0Ô*ÔX†Z?®@ël)’c¡šzи­e"2 +C„%ti5§±LƒQJ´!3ã:2áöÂM‰°ªÜTó!,þ¬¥(Ôdªæô AÓä E_# ã”4F*²¦]0‹Ð•X„SdJÙÒ¥XΊ¨ê¹e<úŠŠ.f–1ii%ñÝPP&÷¶PYæYRv¥:,N(*<¿T‘MU…ÈLÔgšF(©‘Ém!ì Mû”¸q+&Œ­qU2<ÏdñðuD B‚!tyäŒýNvפ%ËDØîÄ麄H ‡ è„VDt¬l)⌈½zÉäú/ÛÌ¥jHKÍ_ƒ*Ÿ¾(:›©hÂì ?’G¶6Ê=tÎt¢•Lü©­ðï±IK4œ½Q„ÛŸ­œÒü×ú©sƒeÀ_*7EhÚÔ'Ñlm%“@€¢ÓŦCo¬å¡)íä ‹}'„¼ö˜6tü?Gtk&ä«ʃc‡ö‡ïOöÄ|¾k}½Èås>õžc‹ÒCñ|†Žz£Ñ*E/E”á¬"þ„’‰CÉ]/ +¡!öWD¯Y¨žDX¥ÊÃxV\NŠ22YÆENX™|݊Ø|«8*þb¨8 ¢6' '¾‰Â²ê‹õ¼L០ðf_|RA֏®©¬çCíò8ÕÎúÙ×÷‰Ç>TMLÿÐÒ©¦7h¨ˆ­‡èß9?Ü¿^¶ÎæEÑ3¢èG<$+R%§úâDaòÄa>í{Q†÷$Ÿ|„ô¡¼§f}#?¾^ÿÏ ߊ¡y©¯¬ªŠ/§×íÑCºåù+ž“qˆå¬6>)™ø‚È¿YZ$ •»òš‘©ç¨´T +…¹t6ã @‰Dâ±pj'w€Àn,’2¡àX ÆQ’RÆ0FåœÕë×½I9¨2…â½óâÒlRîuûT(Ôñûßm“rñå”cÂ$ Þ!US\t_ã†Hys”´I¾IŽ˜Be$ÄI‘Ž’j`âÃ…IœÉ}éç×ãÆIév1Ù¨…ö£%æ¶"‘W5šIx™9m|, ¦@J® æç/A£¯ì9‹y7ôfË=9¨mJ0o p:o"vºÿY3Ð\tX¤ä‘ â¤ð-ç¤,/¸NŠÏÆSòû›'…yI¹³[ÖúNÊ;ÊJҏ®Œïi¶“2˜qÁ}!>zJ ·þm¯¼Ô¸Ws觭ž þµæì—5bŒeö!DILO 7áÉÅPrÐ/0Àf±]–“”À@Dàox§}‹æ‰U'}¢hÄxû('´Ò¶ž,…Ý%”SlóÔÉ´8˜u®ò.AÉmr–1ýESocE@Æ=)ÿK.þ²s%Fµ¢æaàÏò* >Ý>†¬Ýºpž +ì¦³Ì SL}봒ÕÃÀ™ JÁx•-›‘|‰þ×#Êò%ZgáÃoMÍ3¹&i…q¼õ³S(Ö"Ÿe(En\CáôuÛLN ·L‘ɯÉVf³l÷ÊHºi¯££¦$>C0…žú(ïmñ›­z¼øA)üEw‘0™ +ƒ£°ã):ÈF²ãê4Ã!E äÞ FÿšÓÉS(÷3лâ<¼àq=áz4/”2ŠKæ±ø&›©_‹¥º)j‡¢òFC[æ8)>¾„’n9ër)”â~¥¹Œ¬fC)ß}r,[ 9”€‰ŽVb@K¹c?F”òA}d9(B*áR[D)æjí”夥 ™ë¼OÊ~¾ Jñ™zg¯A_qGi¤´ˆGTŽsÒY­¸|J*ÖOó^¸ ×Š#‰RDº]¶Ïã²P$J9D½Þ5ÈÉ.ÔfdX +ˆ½‘¦QŠ$ÇikWrH¸ò£ €æôÐ/JùÝÅIžCgQÊRq@•äŽ1]”"Æà#«î6ËRzÛ9ù¥¬À4­cèOòD<b´€šÎr$'£m’fá¨}”£Ü2¥úDw¼ŒÆ!Já¼htð¨_¨A”ÂÜ(H_»_ †(eA)šâ±«¥zï;I=۝<¢”· ¥´ä¬‹(ÅdáJ‡'Õ¾Ž¥ˆ¦UW-Ãÿ]úš(å[…㈅æ}¨œÆHÙ^Š qÇTd’ðÙB ~V5JévjsŠÙÇzã¾Ù‘•òџ5íȬF¢x>*…}õƒqÆâ4*e<#¾„¹=û&ÕbɕÛždþ?Ž¥L˜V‰µTŠ¹Fš†Ý” þôÃà«TŠ4 +Àt­8¦R)§°¥ÝEöøP¤R&Li@ÂHTŠúݖzªF¹E¥$l[Ÿ¶‘f¤†Ja)çîì\n­’dP’½?¥ÄZ¼<Ʋމ~h+©çánJ‰÷Xz¯a1ĔÂșè€žSÊùµþ²4¡”—Ê DŒO)È~š"£VN)ÿùÃ7Z½_¶þ:¥|ØD JMF¡´ódTNÒ¤IJ6勳Vò À¬ë{ƒƒ«€Õ!°iTã}½ÙÍM?Ú2ñ­êRX“)E>-!®~×vñ +˜RòÓ¹J.aJ‘׈›’ï¤PJ™;OÚ<6<é R#uÅ8 ‡ºK‹^$-ÑeàO܎Rú0ø5„*i;ÏíQÊ|Ù1fâ(E¦aG˳B¡v”Û}…EìŽöQÊfI~ò{fSÙí—Ü2 ]ë>뎧¥dp +CJ߈º&‘¤èPôo€YŽ£”y"!»J¬¢Q +:µN÷T÷Ô(E¸•cº´lQ +¡-w)]R}‘ >ï¹ès.WM +¼Ú'×(E^9lfNN¥,f. EK>.@LÙ¥ìøú…óS…>£ü(Hd}fºx)'0m…Èä0 OÔ«o.w…™»0ëâü³ØÎÂc”¯ý‹äT0Já.–ÞKX½EŒR†­'¬²URv>å`xSÝ(e#~tµh>%¥ ,åÑFœ{bgF)9chfÏægE)ÒÝï¢6c@w”'ŠS¡9ªÝrÀº Ø…¨Ø-›tŽ»¶²)òuù#3â¥/#5ŒR¤(«ËbBHÎ{ºQJÚ_*¬ßU$Í¥*o*r+­‚¤dדycIÄ8dèo”brûîµåTo­xåM˜F©|X]E häpÜ(%¾Ž0HFÐ(EzŠ ðG+'*< +R× 8 ‡¤ †=rõU•ÛåIêû›Ä^ãâ&cqGA4x/›mÅ_¸T7ÒI1›[‚w¸t”{csØ] À6ãÎÊß~ΡLè‚ ä7­’6õDZɍ€‡/$'f=†våE´0¶FFºéȉ¾Á–” 6%;š½"b´+m˜®v=\4ôg´^ÛKö‹43hl¹CFQèâQ=qD3¿]n‡GÀ®€<؇†ƒTÂ%µ è˜ÂãIyú® \xþ 5úXž€8\œ1ñÔ·m;oE)R Úÿ39/=D +—P´bÐÜ"Òb\ø©K¸¯K-âRŠ“, ϱ\2µÉ^.J3n5…ºIªá"ÑÌþÝðèKncN”•s1½Cß ?ý¦·µ´ËMÈpÁ XÈgŸæîÄø +Œ¶*ç8nÎc¸(S‘×bù®á’(…ÙF9u2'QŠØœ¡›äZª¥¨Ï¡oIzò«ˆ /ÃÒs֓캄£G”²à +QtdžÇ¸…KrÉm¡·$\àî}£â(zdIžrÁ)Y†ÑšãÑ4èÌùìÓ·ÎÅ)ßøÒ†÷@çóæ@R604Jéòãá e\X`ä¸ nr¥Û& À)R ÙÏ&‚Ô€”[?iÆEÀÚ¯¸=Þ<.R(Æ*ÿŒÔºw€ã\*;;OX¿ÔV —z3㍱&=¡$† dzFD ÔhJ ì¬Dùóƒd†1á¢ýúLšQÚêã¾ ÍQÊÄ(å47!¥Ü8D,ôÀÛQŠX¬cF.k‚y”âÿÖèa¥?Õc3B,q¥„WKé×útf8µG)ý¶Æ‹‡ˆÉ ;¥ÿ"¯þZŠ£ŵ‘I2ã|ÿÁ(Å^«ö)0 ™ÔŠÏf×éñõ¹F +ƒÏþ®ñ£\Ðʶ¤øS¥…£u襈ÌY[£è(n[¦nˉ­U°V:ÇñàŒ‹¤¸›T!炸dUf(JqÑÓ¥ò>LtïE)É)]üÜ©(å \¡þ‰L¥2¯nž¥ šI»½DûE)íAª³b35R„PÑЗCè(EàOPXÀÊ΀ז°#ïÇZ-bõzÇ‘–²AšŽBJü—¶°‚Ux*$¥DPJâ9“)²IR +ރÒ)€·øb'¥d¦ò=DÃ[Bð]Ï÷9’”Òêä jÛĄ¬céáÛÅsEÚ±7¢ID6·%¥”’œÌÒ$2Z¶”ôÏ@üHûZÎ9²ÖN$¦b wƒt¨±`8@q@URÊW p€”£ËI5O4ÙÿQ$ÆäÃӝ¿¤”êØ¢Õû›6LJáÙléøìBO^RŠ8´{\Cæ (])ñ +…ÃÊ(%Qv+‘øx<)‘ +£aØȽíõå-ê»èåË(% .Tz.ǧvkF[˜z*Dæl +º;Xôéäe¿‚/¼`sÌaI²ˆ,:'Ãö‹ý@BÓÍáAÈÞ£zª¬¤r_Þ´8íç£øÓTãcþ(–ïqãsŒ°÷Xc ‘á_ÎZ8M}dDJ¹w!Ɇg´ÒøQ‡H)Ž+èÔõJ6BõUӓl £º”ùóƒyoÒ(´>ééÿ{) ƒ5åpÒAb7ú.¬;Ÿ3R +1i=¶÷jMäáœgLƒxI¡x#S¿ìôúø„Š ¦J®Ü–…ÒÕ³ÜP]öX„ ÛÝUóþIº×O÷Ù~,ßda‹äÇÅÀ!gsZ£çÄVÜù 'Û!š§3 › +ÉÎpQŽ2r”2a†Ûø#£hSìåa'(çdÁO› k<éÕjs73£-¶.ÒÞb^Ù¡ZÍÂóq4qšOLRŽ‰Öö…xá+¡ŽRµaÜ­¾sàÌâMxÕ’ì9&§û™ESo1¹€Œ%YÆYëkÛpル…Tʦj´—, efŸµìcöFHôGlb…âgÄ :]À”É +§åÞ|¬ŸŽ¹²ÆŒA¥oQâvE)H–DJǤœ CD)Ž/I|w>#JI +,ÌQ9(À¶ÕD)òÒ3ºéW|))Øšº¶Q€*Q7œ‡>¢”TéÙwI‡ÄEG”’ê)Uº›ªÁž6QJè +Åë^‚f0;×PF±œw’8â& '0`Qž<"ÉG2Zº!å„ñnþ\]¡ ›jӉRb¥°ÉVµ^w‰RKX3Ò6]ó0¯™Eö–ë K|þ°2³è'¸JôùÅð›YHŠb´Ä|⽘YäÔe!ìªðvk‰RTRŒ´ý.’ÄnDd»Ø[)âËÖCüŠ.%¤¨\híMÏìӕ(å +€0D‰„Ìþ³ÛNK>@xA%<ëÛ{²­XJ‡eÉfl ‚µØ“èf‡Äð¬i¶dLf«(~N&4¶V„{¢c”驈 +5:Œíºº´·ÏxQŠ:Ÿ(åÁyKîÐe®¥ÝÔtew­¶ÕޜC)ê¾(yK§}oƒ±”:Ú>³˜d䛦ÔW…®YÌT’+6ÑmÕˆa:•Ú5œŒ„mù£ì‹‹;X\_x† &9sGE)g¾¡öÃøm`*E)òP"ɀ–TR”ò-,“¶BЌÑWÒÇs&““æŸø z4VU?ÚQ§À +³l/ÉÂÓlédpíƂŽWa-3Ž“*QÒÌ2Ò¤½¾Â’xÇôá>ØõÐJ™Ö­]ƒ#{(µVqא‚“aØ„R™æH…äf쥳M +1a›UÌ=·ov°}‹.œ/Éí:è)7הr™1±ŽÆ™}7XàBʃå}Abi%« a ]ý6 IÕPT8MÁôoë=”òñöôÏÊñ3T(ÅGK ÉÎf‹à¶„RøK|ic÷òXvpÑB)?pHUºÐŸJÙh)¥j'ҏU…‡R0Vޒ†~OÑÿ‡RĜ¢fxþŠP +وRkDMÅ¥ą˜r‹ùúhPJÔñhý2‰ê ”fïñ(ûòƒV$%(eª­0P ½»HP +èG²SW/(%nÞ°©‹«¥]A)YÛðþ”<+¿-—ƒRÒ<¦4×Dm”Ò‚'´ðÙòËЖJ hKë±LÕ‚Ög €RþÖ^γW#JYËÈö ÿÚ²7PŠc½<½“þýU·‘¥T‡Laì#Ò¤PJ`JË3O䖀Ræ7ˆ‡å¥j#8(c4á9ûX(%w’}/-ra”³ÉùYŠý¡Ö¦]ÜOsâPJ&'Bó‰>ËPJ¸ljooˆ‹¥ ¸èc:8ܟÒPJ雥¦Ž¢”kLZºSÇ‹7)Jñö/ŽPˆå¶Œ8ŠR¼‹’Á¢…¡cQÊå¹fñ9 ôE)÷‘VŠ¼ò¬#]¥tŸ}…ÞzN¥h~Ž€µ +ü)ªD)v+§¦ûÏFC Ê°°3ýQHÚP¼¯Ã2DV)E't äÐP0J±§óì,3¥¨ƒý»&Þd”rɸž¶OéZKE) _†Ó±­Ëƒy.J9=’ò­(Ñ*J•áÉ#4W)Jy&íJì¯"NJRÌïiKuì…P”²ÑQÝ28º§Ì(¥HJ¿Q£Õ4ƒ$wZ6Jqǖ™ë© +0†Ó½QŠTFÕÕ(»N‚#3JY#«$N½É3ŒRl½U +­h‘QŠ¨FKûÙ7\Î8Jqß:Ù)r}_Ø?JÉûÈ$íN?áAê(E4žqae+óQJW½[K»ù~œÌ£”‚±¸t«÷£”Ô<»ú|‹<¥Hú0N‘ x^Rä1U¦%?]ñG)ó~”òed&ÉزŽR®Ã¡²„—$+F)f°WµÛ3ª.ÌQ +™L~k‰PÍmŽï]”âñî_䯉QÊ1ðT¼ëMNžW”¢šÆ”(ŸR”Ý@E)C;¯Xԓ (又;ÛLp\úÔbR”²D$Œ¿pñxƒ¥ ×Ò¾š:ˆB'E).Ž¤…'«\äè´(¥BRWbðXY¡7¥ TÑÌõO¯‹R@<3¶ÿ[“SÑ]QŠ©k)ŒVågv*£'ô§w9$}QÊÌ[(ÀÍøt‹g‹R2'‹µdR"҉(%õŒÉÇi}{Æ4QŠIdn¶K³ kD)ûZKi8>3Q­D)nˆÔê ëñÈ3QJ?HJr÷V*J)(Ôݎã]Í‹R¾‹ȧ¤(åîyÁ|Ç~¾‹R¤#ô¼Úã×Ó¥XÑgB†Àr¼Ál܊R$pcð©À)™X‰¢”øÉ£±f™°hi‹Ržtï šYᢄŒRÜþԏ@iË)¹LmÜÒÍOç'Qcå1zkZl=ÝpZ„¶–þü×Äl¤£§e§¯%6G#) ÊÔH6øiuê]†M¦<+ÙÒFZ@/<´ dF)W ?•ì¤3ð®ô (ƒõðÇД›e+ïl¨û™&·1?FqC )% pmnbaL¾SD‘R<'a§”VâóZDa•¯\O'käÀ+æìð¡ N I`ÏS‡.¹É3gRC B·+“#Ø¾ä †©š{‘10Te +‹BJód’lV +”-7Mð˜-ÁdnÛ,<=i¶)%LÇ%Ò9Œ;=•ÀþLÊXp2®¶LÍØÃJØʽ^&)~þ›HÁôÕ;Ä2¾û-Z–nÅçeù¦!w€<Ìa”’6‹£ú²E8f–dÚÄé¦_ªÿ“yód-RSå6X“§gN•ðàp'Ý~Ý=6©L©}ï؍)Þ<5žx‚åŽï9H¡G˜¾0-ת’eû$ù;eëiáÒTü•&Ò Â ²fÒª™É‰¸‘ ×Øþ¹eJ¡˜HŠ‘;¤¾k» ¥Üü†/ʑ7{é¥)”2®„¤eâUe .Ja<ÍN»B)½JE)Ž B)àÜUpÔˆƒR¨9/¥#·E]Yw ”öŠHž¢Ž?ÆҀ¥(b¼s7ÏK8^@)ˆÆRÌøxñ%@)jt%o +»„û(¥L™fê¢,;ä¥HU¶â՞µŽA)Á×î¿GŸ¹»‡ìzA)šÝ³‚¸N½PJóZ;ÿҋ…RìIÔD§° +ÛrƒRÔþµ*¡+sÚʆ€R:!­\ËaJ‰°+áÐxiâMJévCõ×ñ³Åü4(Å3H¨@¼9 (… +çhŸT,± ”Òߧ^ݬ ”ò ¤œ•D1RV©8•9TƒRܒ="_y´T©YPŠ ÷(pcmþ±A)áÎhNNË€R‚R„JŠ2Ökï4(å\( kÛ>8+(Å®»ìF{±‚RŒäxÈp¿, +¥øj—T¡&0ÚS ¥ ²Mùë×.©¸ƒRŠ·1Á©øõT½ ”.ËTáa¥°L>ÜJ=c‘¥¨Ì"üV,?`ŒUP +±Å¼vnxr9@)‰«ëëG:ý(vïb +JiÍI»½¡Èö«ýEP,žSZäKŒ±PJ NU¹RÙåA)ÏOˆ4c6¥ç¼Øö G©^ ”ËàK,ÞIéµ$@)n˜ñFlK4H/P +“PÈ¥<†ƒÁ¯· J)ˆ™™w‡/¹ E¥8J45;”"6ÒpoÜÛ8þ‚R|@¥eÒ)”R†Rç?o%1Î-”ôû‹I Óê„RÚä÷,aJ‰›¥Ájù5}¥XQ ?”º©&…PŠvéœöX×Rª™K(¥ÁÅÌ/T@¸S(%`¡.·ñ¬D±S*”ˆÉÍ ž^i%”RüÝà˜/ì…R|uÖMìݸ¸QP(E4™{5ÝL¹PÊLµÊz‹Q9ÂB)“Mžõ&sdÑJ™RœÅÔB[®ÚPŠX +®·È+iÀ1¥DÏG„ê ×:v>”H8d“ 7†RZ@„¡©ë–tƒJ¼½{êP +—ÊŒZmè­ J¡&ù88)µO¥È o˜[£d¢Z ¥œâb¥7ƒ,ÈÏáJIQ±¹HÃÇ+ñPJPFþj!áûï4”Âðé«5ù—f(%0‘€2ˆRt+f­”(E¼*à4Ãñߞ(%üVE!É܈c¥¸ü—)+ᗖsìΫÿr¨¡˒þ4«ä-“¥øÊ ‚ùL¦aY‡R¦Þ¿YƉ;ˆRÒ&ÂÙ®E¦aŸ¥(/½°.\®3cf—¯a9¥˜¡!(GÐÒ¨¢'^â“EÛÆmQŠóÊy¿è (l”Âít«ø +M¥²QŠÑMæ;Îù \£Áå ÙRTx £”’'y¾Éµ䦞QJƒ¯ˆöCL\‚F)ýò”̒تÔß(ś6’6}ÓÇ Õ(åå™ko4mÑg”⅐>úA?J‘S“@=n@ÖQŠàFÜS¥Âí(¥Î8‚§¶l +¬ >á0Rää=ƐzDoRVG)ö&êÝÖ ‰£¯·e„#v”r=—¬ s­!G)h\p ÿþ Y¾\uаÍÇC‚]NFðz|û‘ûçÝ¢â,±Çh·ÔwÜ´nyðÃb +a©pØÓ¸bà§E+2×/–eCê 0SÉÕ %•Èh„ª oKŽµ(\“›£Z·⥌ɲ´e®‡WÛ˗‘–€ZòO²@í€Ô7Ù9ƒB€ÖBAmå«Ö‚ªL–s$KÒñ*¤¢*” +LB ^{¾ß§*xýäÕÄ(ÁÕø·øµ¤XÀ±×"òD±kÉ1'8r-éR\·–Ó—žÐ(}yµ¨Q8“´Zàõüª…b´… ADIµxŒSK·? Ôr76CŒZàÕ} µÈ“àOKŽ9Bé´dc0o³i™p2-ÀªË¥åù̳TZŒÁ<“–9J̝ "S1%ÓYâ“j£5_P-©sì.¨Ǔ?K^œüè³d{uÏ"½d$ϲ÷bî,í~cq‹—Ls–^¡Fq–Y3Ly³@Á/mø‚²fê¥Y^^_&#-»ò†õþXÄ¢³"Ç,)AJ¢€5ÊS$Á[œ;!¯²˜{¥€[×Úò+–¸üz²< 4e%Yfؓp¤YDå\¤È’R¾ YäfäYNí°¹R½V{©éÇBö¨r¦€3"‰±Ìgä>/Àò,šrÓbIj]V,Òfœ˜ À¿ä?±œXf!YJ,ûógÄÒºH¯ö%¾épâÆÏ4Ø7\o„ª«°.MXÌC„E¯Rà§u,`º–Ë{f®,XL»ü. –+Åæˁå}äÈ´´YÅaÀ’y °èº­0È¢ÉE žbÑ_ɶé¹_ù±„Û,ù•ï{ Sî+ ÏCÄS_9غOi Öˆ’[Lñ˜Ãìr¨ÎJy%k@y—ñ +ÇñFx%/'O¾+Y½Ò]‘|‡¶+P‘]yBheµtµºòšŒ¦+¡f›%º$›Gž+ðY'/š+¸f_ùr£JÁ£C(#òáš\P*´ò< "½y £(Ûî<¾r'¢ÇJ·u•L… ç*VX0Y‚U|¼«Š˜œ´Š–‚‘g‘8ÂQVÉ-玱J@…GX%wÉì«ÒU³tU¼¼;?Ùª|៘X˜ußUEd¢\h©ªÈgäÊTz—DU€ÈæÉSœåHSeöÅ–*P¨ø“*\¦hFUÂô×ããaÁáû%§âñ7•ËQSélõЙJň©€ûy¨‚[KEY´R1àê +¢”Ê8œœTÀü!%•oõÉG*w+‚ ©œb W+FЦß2ý`¢ò€¾}§EËçx0r‘å쨡’;Ç, •,rx’PÉWÅ9¨¬Îºb +*¿ýÊÆsÉÕR:] -©ÀáZú)ýu+ûÜ1æ»äS²ÄáÇ=%ß\õÁ˜yÊâÖØxJ̳²ihi+Ë8eyÖ1Â)Z]ôM1'‘tS:ÉGÎ6¥¯½lJ·Ò|‰¦ÀY(£-”NÕe…ÒÙü‰•B),G=²@£,N(—ç¥$óÙ:¾êç’,ºü¡å-BW—‚,Q·à0A‘9¨Þ: ó͏;ôY(p3ò% ãñ§€~v 3@l A/F`ï$nOth$iמ¦LÏ\¨4?€6~’P©ä}Òż´OºV÷®OÎOú$}áú|¢V2¢|b bŒO&¨Ȓ 8Äô²LN¢'ëAŸ'ˆ“æ‰òøÇ,Oòô<֍Ë#Á“¹0ÌïDŸ½ÐbÌîdÄ’;ŒžÜNfÎHíüRÉÙɂހi€üõ„ù¬Hyˆž+…~Lëd«wYÈKá#©Uó™r:IÒ¥è)ÀAÀïM†cÞ$0•-~œœ@¾úÍфg© “ÕØYÁ³FO{HâE„HǪÒœÀ&ã2•ð7#q5yeý„W¸«&âÏÑQÞ$“C~ÝMž2pݤN§Òk%„Æ~žøׁ¿\Âz`ÙDΒè™LI=(¥Ý,Q¥g‚å Eà†mÌÌ¡:G(S“Üvô.Q“• åiÒV¼4M|ôÒ¤óêá¤IVÁÈ£‰=… ¿À¹ÀwL2V÷g“¥³åg"&ç3=“ìÞËÎD>ãûəüóo&@`Ýéå˧K”Ôé„œÃ^l¦½À¤\–´<Éý+vÊïç|L<‘¥cÒÛ2”)“ÑM%c©˜—‹IÀ ŠÉ‚þ&&vDL[,“«;“&¨€&Fä’0éZ +F&^®I£¨`2×>x…0y1Â&ŒÞ®ï‰“/ñ(÷’sBLê%`"pż„PÕ*–xÉÖïå]Òÿ[Ú%Ýgg]Òúó¤KϪ•s‰pz¥\²)gиd{dÂ%ýË·¤ó(ˆnÉ:ýœmÉþ¾É–4±ÈåZ"*çnª%ygZ"ь¨DK bð̳.Šš%°¢²,yÓxò(YDǒ7€Š%=q÷¢!UÝh¢(l YÔÝJ:Ёyè%}gb%²‰’¾f|…¤³^(é­Úy‘Ä|r|ÿ“tԍJzgõ@¨$­‡Ä>7ç#ù½Ý”Üw“#À8ÉÊ«3wê¿IÌäNJdÂX¤D °êQðS4J`PÄ.JÞE”@º«;”ôƒ¨PÒ®f JÎk’ÀS «­?ÉP–dNÒ_Påÿfî$à³AUó+L’ñˆè|UMNÅ«H®õ’R<ÓÒÝc¦HuN$ÀZ߁¢&êr!¶®A©ôêšâîÃÖ&] dév3|©ҋÿ‰#} ÀÒõ†äõÎtdËC±b°’é~™ yI”L&Øã=ˆ ÏyžˆÜ‰ZzÈös„ý.a†¼<ƒXè/ÈC¨¤ì4I%  àð&I·°I@ÄÎK‘¬wšÇdÚV‰î ’X#0?’• ¥GÒHxœìHD$.:9’§eÎæFbp¾vj$Ë_dFҝ<Š‘x)ž‰/¸µhÜÿŠÍ‰D6c‘S"É7(#ÉøSˆÄºÁ¤ÉÞnžIÇs³!éý\2$­}ò– ‰×‡ç™ +É=;r&$p +%Bò†8Áy€Ã— Üà…?gAÒZÖ}$²Ûè@²Ï‰–I^NÞ H²ú•‰ÜŒÏø@ŸDWd’­a‚gè@6¨°u2:°/vy¨øöSëð@E•‡Z¸˜´Ê$<&§KǝËPél?«(Ý Ž( H>?{©ðAáx¼‰C=);–ë4pªüŒ ؇&Ž Dز+˜M-sS§~Ü'™*…šê6æ*Kºÿš½Øå(Ó÷gìdèõá[ë¡`øä†èã½S‡Í€¾Y%zj¢·¬ëŸ¾MWoo ~ÏuoƝƒ\ÞÕ&˜A@Çfʚà,v–·^Ñ@n&ûNH°ÚOw{f„äñÓ3ŠgòOðÉÈg%œ|‚ˆ4wÇ(âÉ4} :cÄXQ³}Å;nIZZ ôbrº=§Ò)‚x:C?2ì€o $qÇmTC„}[ü«ð 7Çò ؆¸[-ߓ’Ü϶¡¸_kçäí@e¤šÂŠÜG8]!”N”“ —NQýtŽˆù2ò¥É¸íOäçF†²Õ à+Ä>'ü¡/£Bft·ã²Ù=:\dè#¹!ܮƧò)Ê>5dcµžYŠŒ~¢Æ<@•3É­ç#·ŵ`ŒO"ª·oQK$2$pÏ©¾TÑfÒ ˆ™Â0BD}L`f¥ƒÇKøYdž¤Üi%Y$ï×Þ  ÇÊ +ò¼QÏ/@ “%WƒŸ5gæX `û…˜Ñó~ +^ÊmHÌ{µõn·¸¤ÚSÀ,Ùÿ§´_8W +cЈrë&6ˆ¨O¥éïsqÐ4›NwµÞÍÔ´òSÚàa+ëi•ÞÎ%ÓdUi«é`„ ±°·ŸZÕ²gOÂÇ3ˆ¥±Ot—?&/-+¥|‚‰\:فª›·tîá'h·ÇƒÖâS韕Ü$?'µy´nƒ|Aƒm *éùô*îÃÒµ.¢~8 Qo2D[Z%µxØ˵awO¬`£™Žä>'ýš™äšKLv‰k((FÙ&4xÞÓ*tŒXÕ^M‰H%mNµXð¼)™±ÍØ8„öî†k!åÚ¼؞çþb Ї“»æAø'[Ýhø#²Œ{2c«ty**òՊ\8›©>8¤oW66]º§“f‰_ +S0Ä6'eäÚVÖz ´í‰ê¹[-³úêÄôø˵¦ÿqsþÈ©rb)xÞû µ{]zØ烺#þÉ¢IöÕ²›ž õKºŒlƒL“aÖˆüÁç9š&ŽJ†‰¤» +Œ_èXT‘Yçû™ÃÌ+Žbâö$C”ÛÅPv/Éh«ÆÝS]æL2újH7N©±""'gD ¼O +‘i+0ÕÑÎÓ4L9É÷Û¥Mð)ýb8UŸ–ZŠË¢`5g¤X% (}›Íyj2˜à PC“Ûk2Œ•±îÅ´ºÃÉøB-«{,Jªõ“q õ àû¾~± Ó „œ° Êà”æmå~|SLîÔ.¬·­º”é™>îŽñÝ"Ÿ”Áí-vT>¦õè&eèÝ2ìÍ0Õ­ße«áe„HGÔª"+„<\D;ƒú¦Å­™Úù€)å>ÓÏÖ Írœ ª¡ + ˜ü•(V ÃW)ÜO>›Ýí(å»3™€?H¯¬¦&>Ÿ7Tæä.K‹¡‡[L½ÞÄ9 Š3¶­9E&G 足»S; ý܁nqۙu¸Ò,,㢼Zïa§€¥çÀTz¢$גÇ4E¬4“:ÿ·'óØÃßØd+•ª•r?燒B­÷wO’둈܏Ÿ-HY«Pµï ›rÄvv`׋*æ8R@–ŒûbÉ.û¾2­u€dМŸý”eWXyµŠb¢„-§ã1Oh.[æ½"rδ ²¡¸éÈ#Cq­Ù³oÄ„…ÑÔʪèÒ±ù ’)nÙ×Ƕak"B_>,Ö2fuä÷¶2ÁL¢.œ‘š+ó§­)?-Âô9\%¥«ÏªÄϽo0=± [4L‘'fÙ)—8­k.ÿ (œÐS!RÔ?l‡UK§×;Œûq8DúøËVÄû«·&Î.îzt×G”B4¢!±ev´²lUÒe»øJ²O +ƒŽeWA«˜¦@É$µÀ}- b›šõŒó„V=xѲ÷k\‰^L] Üà6 5F™ŽÁÕîÜþŽU hV +êfg-—Êm#ÕI†ùÆGGÿ[Ò"q1.‡‹†4Š jÖõš¤¡Â6ÌêJ+M`ñèEÏõvᢱڵÀ•“)ýªu?vÏ6bPLÚh%U§…'ÑNEÁ.Õ`K‰In!žO¾RNÿp¬îqB‚- IéRJ€ÒFÐÍÀ77ÃûnGU/F¾£…îÍÁv°BdRYÒ?À8scÜù¥VÞ&]ÁÍ å¹a=ۛ†‰W͎ +K‚vן^-QrX8Aŀ– ltxâz‘Ì¡­™ï6B^(€¯iÆ:ÁƒîPœ°3|B¨cu†×ëð}Tx8T~dÍí Wüãì³),‹¨Xõ&g´N{¦þØ3ªè5mÕPÝ%kB ì¢Ì:mN­f„44_ZŸMŸQ4ƒ›/nX‚¿ŠÃ¥,ä]Ö'×+!®©:$!&=¨šÚ‡¨Vb±F—igJ +ÒV….×æ.|àÓÕ`‘K#7Ûy൘D0'\¤V«&w/BB¶AÕ>g³6kÂnðÚp± +©Ÿ,ˆšƒÄüá”gÐ/vM™žì°_Dññ¬33BÍuÉ9 0²iC…Q,é!´wgŠ‰ ›p•m‚} L.h†ahüCĦ^pËN³V‰ay½”rÖÇ ŸµóÅj;4À˜¤ŸªP¢‚¾;¤úË:@N–ƒñDjLe‡|yýç:û{ô†þ@%úñŠýËÂy äÄ.±þ\È.™¶û‘±TÔÜ0z¡¤èêo›ù~ù»è(¢‘Šó1ÓT-ZÀeðpÜB¿ÏiÎH •¾‚ññ§žBêAé:mK€Xv¬3¬–Âvż’˜Ó´‡'ຢÏëé\ ¬‘!ö"ºU&üلð›öW£&xÉÅÒáy4¶ëAô¤ÕRäÊɆ s46¬s¹j™Éõ¬ë⹡¼8 +½å“sàÃGÿ1"<µI⏠Y.ÚÚñþEãïÞM«9“Y›5ËMè©Ú?Ë>×#Í9=þhkUÙ<5‡+ÆÚ`$g+læ-(’¯Ûôݕõ¹Eì ¨¡0bÎ眹 öòõ”#uÍg=–;€ŸÞE·î²£‘Ç:×uOÁM¤ÈOv> FóÂs: Ï ºFéÑ1Ùa†^ä¦x¡l$€5œÁf$iÕ`'iëÿGM1\,/¶+&Ú7o7~§Ð]þ¾æII 5 $Q2֚¾ô܄ ŒQ€Ž²s›-#ñh¨ùörººÊpp>79gj&N%‘ý°`\ k çžðô­$6ZK´9o‹Kìf³¾3M×úùF¥D‡áòg&ýAÿ¦JËyÙ1užÂqm,Â~M2ãHW ~~zæޓÿ°ìžDÛ,P0,7°,µ³@AŠ²ókqòd±ªÝ?À­QD/…4ý®‰Âu¬â${. )½lr'}󸕽šè€êµÏçå1wæGUׯø>¯½9!'±‘Ní"²Öá)(¤™ý,f¤è±(ÙÇj&`ѱ| 9¬+ôȖ¨"Õ>m¨vê¯é JççÌ\nºà‰4eÌt‡‚;õÏ € Öè +±9ŒÄ§îPè[xIAW·¦cá¾PúUœê «ÓAÐg)ÄÜéié8]¡P}pŸ“Ò앐(í¯îY­–•Ä¹ÂD“få2½îÀn}t²Ài¡¿üE—àœ\„Z|à­ZtëV5ºÛ„[­Q¼¥sâ%Dodƒ ”•p"¯ÃÖOJÕ,8R/¦òãݛâS»ã­8º’=\½­„Î£DN¹·LEÈú VC,Õ%d·BÁèuMY×C¹ÔáÙV¾ÂxqRlW÷_a£â€Õ7pù¹º"…_hµw¤lXpÁ ýÀˆg°à †Ã*À×Eã¼mòq›„Þ•'L×ÄÏö¡”ªò”nêŽ `tvVF\o^ýì~¦¼ GRӶןqƒ‘†UZ‡{ÚUÍ4ä͉Y Fò0›Ûv L oÖzȍ‘áTƗF‚@j 覄Eÿm8Íë ×6D,ì%Ô¡ ³P!]í÷#K'@.ˆº\-Nq´û›-ê¬0–Ü¡ñ”(Vâ ÈÚ{>Ø'°ì3µÑ26$"|h„±ò3N¼œÇÅ_¶ÒrÚ"‹åˆŸ öM’s0òOðA¸UôpHYˆ{8ySØèÍ ¸1¬¥êpïäCÌç³jÑ&—™h„Z— ”!AÙÇkyMâ±J:Q#Ú8܋ ~·f’á,6L¿Zþ-þiÞUFÇREZ°Ý€:»1){ƒkY4g<²\Œ´3Œñt'K*›Íð¡ê/?­œíSD]¼u-þZ›ig†WJx×óe-)1â¼.†Ç–,΍ tPÔ!yi"otpÆd 4ÑáÀ’ Š@ú&>ÿ±cÙdLFLR4É-€NðJ† Ë _ ‰°„I µwÿ„ð«õõ2«!ûša7H`2ŗ×Ä]Aú§T¦c‚n³àòUHh<½kæ&ºíDDå}ÿ…\Ïßé +öHg¸I…«¦ t‘<“þô/p[0nž"ög꼊ø˜N̪\Ie÷̓ëMY/ºÀ'ÄÆÕ/Ìé1æ. ¤úI‰«0ޔF²çì“\“ŸêŠýüÒ@fàq.Ê|®»qì ÂÍ ÄìðI³IÑêæ/â-š>9ÉZ¤¡ÌévƒãÀ J½©©S¼*Ñ ÒEê¤a6¦Qžñ~k’®5³_µ-Žî¦Åfo¥T‚¸Ë©þ˜0—y]¤²¨î\pÔ²!6F©™F'ãj(I“Û ajx[U3×q`öÊG(éI«%4þãŸ!e¿Ò¤ábÚìá4@›¶d\8þüú—7=NÃäùhbDï“0·ìÎ÷ü‰FÉE²È5¦3\ÄHÒÌ.>:x{nts¿à¸imH¦ËöÇ%«ÃmÉg–<.DänÒUÜ7Þã"ÚÝ]ëøŸæBy⥸@’ ßì*-åÐMâbŸa5À„p™íq™Ý‘NF'ó,qÑ1DP;cª —S~ÕfsÏoŸ…ËoäÕÔÜ®[@êÚ©÷ äª» îØlèüa³Iubu¸´ó‰ Y³ð.³µi\R˜ù·Û‚!\ZN(êø*˜.SnD°Û‰ ½C»@-/YÙ»cr¸(Á ›Þ~f’p¼?ŐeJA‡Ë“Îhõƒ±—ÓÌ¢Q¸;Ÿ=£îø¢íÓ|Œ.¹n0÷F%¡Ø•­F’ªu£‰® /¤ªL âñŒX293Ï)&b 3h~ %»ÿ×Y‹_Üñð',ù‰©ìœ`Ðg]Å[š¯Û3ñËí<§²òá‡Ià\5iÃÞVðb(!<9xÎRï†_’0sRû‹‡ûyÑA9Ç&w™Oèà1©üoU–ÇÂF‹kEìàvãI{$ˆŽï§$yèíaÀÓsEä,c'*Å{暡‚,£Ed~Þ +RGV¹—¿9{í%D5ÃM{‰¦·g¥Ù[Êî ïf Ïsê³´o@¬}*Že$k³4œ\faÄèsß +)ýr½C iÈA$d<î•òâ7ããñ.¹ÈñiCZ¥èåº%=¦è"ˆäI\œ[=üžS†yiƒ­€sŠûÀ,ㄤb")®¼¶žÐ à ‚4L†ÄüÍ¡“¡A#R~¥€ôC ìƒÖHPi±„Ëǖƒg KSz”&?¦ŒæçûDµs϶†WJ%ççˆJ /²’¥m§dªúµN3ƅ8£ù\e®2xT¨|l`t#Ó$_ vÑRšÔžšÝK5Җ¥`DȾ{àW?œ%ÝÿFõÀZ©RrSdñÙäó .H“0‹B² 'b“$>m%ó÷g‚ÚpKò®óÅ׃"¹ìÊ奭SÈî´eìpYÀFøÌ$Cü&9è7ùÔ)ÍaFƒå%ôɪ€DM´7ÓhV¼*ãÜ Nsnˆçjě#0–8Ÿ8ÔQ%6É2 +ªL4Ð̔Jò=Ö*œl“ö^/ÎSe9üá¸÷YYIRØZ®¹HVãEé_{Îa X]PP?ρ<î}w¢t"Qkùæ’FCñĖ4¹åI†%Ų¶£oNJó抐NKyaE&°´½á¨=-[ÕÇ}@bÖΔ XWGOÂYÓÖãa(0¼¿.:,ËMtËØs”½ŽŠ3§c-„Øi҄I慷À1zUƎ’BÞõÊDü頙QìW>ù `ýp_]Ôþ<”aŽzÌ@›ä^_j]BÜ,azg&§‰b‹°ç"DP£i|£Eßr•ûˆô +L‘É͞ŽS,ÓZéˆÉ•k´„0€¹»~È&¥`»¹ö{:€5ü¥lïglß+Ç͎øIÌ­³D’_*Ý.s™Ñ—PÍ>¥U_7ÒuÒ$à³ÕpÕÜUbp$ã‘M2JF†2CÉ ÿ½›E©`O¸­LKLµ£¿=7µU„è›SCL=6DŽ^+Û9²‰ØÈ@7vÄ9CmN¦”_/dñg<]Ô„ ’G—‚XK¸OL—í3ËÝUÎD„¸NöB/1ãœóY‘ˆ†Åhæ%Ýb®éõ‡’OMYe˖e[¾õ"72¨ñ }ÈÔI}e¨s4‘õQñ*Óé‘0 çlï:Ýä +ÝV8éÀ¾)k„÷äpö¨ð‚Y4ÑՌ>ÛÖ¼$g½Ã0ÞòÍLœçPŠmŸbs!‡ÜÆéÆ[fÐò~15“-ü6ÞDù”ü­ß]J‡BÕÅÿy7>]ÆáX(ÉcTâ)1cÃë§BEpˆiÏ_ä7F€p +®ˆª³MÞ>dcwp÷f¢˜ 9!æV7ú™)¦8ðKuQMˆ?`› ŸÖƀ¨¬­pm_¡y—^Þ>߂"„œ¥ +Éàn¤àB•»Òî`®¼+5þŽ.‚]^µÚ0€&wKà`HÒL@êùOèĵ@ǧŸE`GóèÉöÓØ°s{s‹¢‡×Ó¿•HÐv8”ü5‰õimWRÑJ{* 2úÅ(’|~þyuH:-Xh2Œ¿_1ÈïåsU)6j +qÝÎiv©¥êI‹Ž/û¦à§-@ÂQÌ ¤0†ù¾˜_J øQfÕÙl²áÈn,a…!hê1­Äƃª‚¥é¸æšr³=2™*vVµËtϝ œÃøø®lˆUQ({µ>IH›7$­ô0“±ý‹ï„q&·Wƒ4‹x`€SdW>mpê}*ÝF¦]€ÅˆtÄҊõFv™ Oð)ó±UR÷?äeæÈ4އã¥hððÜôöØ7aæí“ùqtÀBs‰( Ù§ØSgÄw‡”y…å–‚2¶83=™ì…ŽîåÜúª|i|æðÔtrVJà]%dümv<‘"'* ¯%deüçS™ôرÊgfÎXº¨™ ­Jî“rUºÆ]ñ€s +—­ËӖäÀˆIaJÃì½ÁÌ*·Ú…LFXŸ=FÊUjäöYTÒÃÙïþþ±všu»:)§ˆBÌ̋À¦Ç"s‰Ot! ä2–uØ÷MˆŸw~Rp¬Qs=­Ú~²Iµ}Lƒ½3¤æ,ø‹ +}!L.ÀáU×9[?zÜ*6ÿ¶J§Òõæ°Õòó\‡,("pòÖ,\ðãË'GøzTñHLYÐ)ÇÉGm˜d½¦‘ˆ’‘Iÿ¹ö¡¢Ø¦± ×1I“ÒSôŒíÓ£èÌ:¶‚ ÄSþ°ào&ÁÓÚ d¼KáF„ìåùŸn܎ VgE¼c#kÄVf§^Q™µcH¯7c{'g¢÷«u:=°ÛüºzhÙrûéDVníG`YZ¥ƒX‚‹ÍuxÅ° ÔiÀ,ÍÐ؄k‚P ù+ÛÍ?øãNC܉'Æ +5Ru¢ÒyÖÊ/  +AÎ`Á®4÷]m­(Œ“¡@¨/ààAªûðuåB½ï4›ñ©AlTU™Y¹%J梋¸H$ýc¼‹¹úÞ-7/S\g;bAœ!©Ù?¾©åX"ü”V‘ BJYJ=ùCœŽä€Ê O©¯ A |î" ÑÂN'1…—Êõ†—]®ÂºÚYø|”‚›öæ»~t3ƑŒâº_ÏÛjE–™ýÖgdžò¸s¹µÅ±qQ4ýÀþîÂÔ¬ä_æ©%R.oŽBb<Â2(§F ²gÑá/‚YôÔ³Äׯ˜-O zJÍT]¼R¦¿ ø&¥^B?5] ïl7>æóˆZ¿Á®”ñ¸Ò9{ɦrâ ©³€‘~!Ñt‡¨¤ÚÙÎÕ-¦Ÿzè0Ë+F±žGš-]‰„õDkÇÄL7Œ¸f>…AgòÜÑ7—…ÕBËd€ËÂÏ×^=0›<ªI‘,#÷üCœl_Tà(Ü?]Â_ûHœZçl,â C»,œ bÆ<À!ÙVŽZÂåʬWYb틩n¥”AË(´îyP~Šöç¿Po ð:¢«ÛO§¿£,üÇmÏ#Db¬Ø ó‡Ýô>a ã0Mt²ÄeÐ0[¨Ÿ)qI†ÒA+ Zû¨?m°4ôØÑ°/ëá›CdLQIL*Ûí[|ñ§ÜöÃî¼²q­…숮,çü¿šXÞô… Ôý9Á¦Ø"ñ4kdOÿ‚”Ü(j¡ ¦ª—…Çž2M 6 3ߐ´¥oâšé⢝¦Ð&x¦uP +§Ö•_#»Ä ˆ…1:Ïj9b-y%=t¥‚z9¤¹ì@$QäH)leO¨j’vC&U1E4³¶én ­ÕŠÀãKM€ùé…íT‰ß€‰ì†Ã[Nb ÆRQ‚ÍMçüݾa,(n¶cmóoç~ûyRѕ¼T˜ìá9w‚'L°M¼§ ¢tLbŒžÆ趬"M}‰ú~F±3Ceѐ=ŸM|7{8-‰göwàŒ@®Ñ4ênÚÊ7\š“RñI™jEoæi)`A‰{H:Î˸K0§ +âñElõPÈâ¥64‡W>ŽÊœØ'½wâµÂ +¸€dÌMfb¦¹ö®rܞØXͦ.äòÔ$ó "Ñéc\ýXØBüp“ò~˜`K×¥©D$1í•Ú†:æžÃO b›Àé@€¤+£“¹‰0ä 4«>3N1*ÆVÌ6bU  ÷Jþ1ǙʡâÎ0tGxÄZ(ZWÛfdçŸ3cw/;Ü¥…§«~ÔeaÁ$Š”(~ÎÕð®56 YG?Àþ„d–.¬µWt]Ç6PI}¼åBXÇSR£FÕÂಒʷM`"S–Æ4ZSÑILõ +FK_›[³ßëȨ&žª …ֲɲGÒã¼;"ôÛùÉüDkˆhùD ¡ÂsÕ46g'çñ©(Ôr¶eqcæ3“ª,ïèÇaÏôúõ…V8Q£~[Æ(¬n`gPÙæ˜ç=ãM†ŠŒHËVš`(9&$Ûl\ó^ëKŒ$gÙV +˜®¢‹Ên}†RxÙ­ˆB„ëGÿ۟#NÛQÍ*p% òK§—•J¦ÕhCs‰O5TҞ‚ oÕXªKô•´Χ’ý)fxkoÜ$ȗùž»§pIåŠ1p©ì×ËTD–H ϕ}í¡\‚ƒ4¯æX³µ£OA‘'ë›#ݙš|D¬A”ýæDå½ØìÞί8QiPÖ­ +$Í3&è2Âå:£´f-F‚™‚¢¢•H%µ57›Õ垞³^Þܘt)됶´FÇ*A"!k‘¼ÉF%óGæk¬êÅb’¶–Ÿ- +Mœª#Ðc*! 8¥!9¡E›¾Œ1@ÒÕˆVì°0òcN58+TkóþA1#5±¬œè(•,‚€‡˜ü~G6°œ„P²¬®l€3Ó¤ÞïƒlO]êI% ºL·#õߥ¥æ-lvjÖ· æYúú Ai¨p™„Ðlœ"™Bx‡§:š`‰qÕU-Ì%$7w6pJRÙ ”¡“ø½ž;ö¢ ÁݕÕéd¢Tjàg½XÕ¾sÓHÞw­öjå¥U®$7€Ÿ:4¢>æ$ë×CwHNO179)ÆzM°›úu{“ƒTSJ¹u´@Ž| *¿´éºDÏò#֗ýÐ-‡‡zÀ]•-3¬öÊÝÜ;²¢bÆðã—öÚíLÕ¤ƒ 4ÈÎɹç’Soztbd̍ûÓ pØ▱¨uER$èÁ&èÜî˜;þà†/©?€kŸÆØi'fÑu«„ñáʒK—PxžYȅyr7ÛïÓf<ÐåØIpºá¯Br¤¥brJ¥A¼„¾*º-à„žä¬ðAv‰H{Z‡º¢Ø¹NÐn@&€C?1aõPšà`%÷æ ‡U—ð‹Ús¢+NÀ‚b×yS÷ÛOc”$+TAhUúAfAËÏ[UwHÖ;¡ÚO‘èpNwE +Í +ªïÒƁaì¼w4bí†n=‡"´¼é‘P‰ %îmÀ8etÖÞH@š”6tÇ ŒìŒ×¤‹#üœ²3\Ÿä!Áó­ˆTöJßÖ G:+@!0üãŠR¨o¾QlÉFžÒ¶ÔÁ : ,µö Èj¼-î+†é]™<‘ªÿ£õ L!Î4s($kÚ¦–<$«ÖEA¢UԆÉȧr“ø©yòš‹‡xN2Í_Å@nÐ!gÈŅ/r­¿jDÍ<ì¨>êbQ±ÂrˆGˆÈ^Àí&çFšQa ²é) üÅë‘Í‘òZ»Q]64/Ý +ùÆ.ä\*ª„gòx³¯¯”©~þgQ@ø´Ìü¢”8h13؀“b„¡Åìâº_g¨°6Qw=̺z=+•U§–·%n*¦cÞãW¾=œ=±b$¢[˜vÊx+Š•lRÜƝTèä4_¡çS2_Ô*PDoÙ7SG0$Â:TIi„|“Öœ—OþÁ'˜,jÿ´Ï­yN¨DJÊ.&+•ŠFœI•«†Ü½æ°rÀw!5D*ÐOÍ/¤,TøÓÇ8GSoaUÒ¤ÙÆg©î$s~îä¥OâV¸TPvׄî—ÆGU Ï¡ešjU?sÂ¥ŸT±ê7„i+×͋Ví…KÎØ)#Ž®ˆ£È&Ä*°Øc`ÜjÈ)lí8ì;ŒŽ+[ ]2WZÞÝð؉5hŠaÚX»,7ÂÚȑ¨!å/¾æMnÄ'@À»…–öü€¶ÙÕ{ëDœG‘ƒx}€Ð}ŽymÌÞÙ=J{9ߕ²G¦ßF"A“—”°DÀçÝrg‘¨º¢Ô­R ¨žŽ^‹É.Ÿ("0 l´r<ÿ58žÞ\ÁÔ ¾Vó§Þ°ã™N`ø >ðbáTÌC8bãÅþ¨C†|Ø4d_&‚¤©óíµð½ìàŠ²è¡¹sY-ÈÆñyà=Ê!äQ’É M¯ú +#O/š—;EÊxÒ)¬¶`oF35¤AŽt…ÖkÒëÇøR‰ Ûª¯ˆK.H¤Eo~ÏFŽ°³&@ú2NB>â,Å÷B¤Ú½^n.õŸE¼Zµ?Ÿ‚WþLW0ɔö'½Ü,$$`RÃÓÍܨô_œ˜ϊەO @Ëæn¼N„öTº +ßck¡¯R `³EËRYAöþ™<Å6™ Ä 7í Œã‹ËJ¸ç«Å«*i®J¹]¿ÿGiNŸkeGWB7»§0÷LgäÔØ]†¢*äÔKªtTììl8³tŒ=%´È÷ÇøÍW¨š1ïÿx1*4‡E¼ïÎ4¼çü謜êy ºp!•t˜kzv11:`"V_ÚÙ؏;A½ÔozÊ#"¢E܇çÄ,}4ÒO2o”N~Þ°"^…€¶s¤„ÔäÎôµÜm E'8‡k„Õ +ª'²¾Œ†(=¸ º£AàÛM@gg÷šÒMºŠš(C]mˆÒEcà|xýÏ©ÜwûÐ&„FÞx õŸ»iÓ­¦ÐœN ">'¦ÞÀ‘¤eûVð‚r*}Oï@‡jìރ¢SwðRՋ‘t©à•B“F~;¦™F/ðtæ_S£hy^ž¨ÙeD8ƒ÷½è%MÞô ͺeöÀô XÜЙ§SÏ6LC¢-Ãúýˆî¹¯TQ&P‘¡j}"óÆ6N4ñTÁ4…Sï +¨Õ.ž–ô .ݒ’™GóÅO€}8ɉìÅ°a*ô+°„,Û+Œ¯<žD±9COAif&´DÒn·Å>Uñ.…ÜÐpF «¦ÉéªSö°rº¼Hgòß XÚ;ó+U 5ºÏ!û ¼"?xaWÔ}ÿj¹ö……Ɖp¸¬7M១'.ÁcEü·êr@s´vìœ +¤ +ì‚·Ø£Xï‰ÓP÷1Ÿø§Â©·3=c×`Õ»]˜ 5TÝyB>–8(sl0’^¢þ³ü€†¾E®Ná@;5¿Se€öî_U‹)Rqk/|ïë}Õ¦åϋ/j~Ô'ûrEÍc»UÈM÷ñw3EB.Õ4õæZÁšÇA˜#”ÀcÇ>£l¾Ki¦1™;m|FVÝÿ<`PÌPƒ“^S=CVñËÔtVÁQ8<̲µ÷÷¸Ô[Úd«-äbþrE´zì?3¡éÞN‘%øïDzÜ+ÆUƒìŽh­+iªÆæØ®5Ò5íFI¸®vS²tdA¾“Ú[¦ÕiÁg¨ÇGÑ5ð'ÓÙB‚*ðäŠ;ê¢þ€9„,÷!3úì;ÐÝV5im”Ve£¶Œ£?`ô"Wi‰œÝòSŒÔû¦ênȾeüòµÑaª$pƦd4;Oæ 5³£ª4Á4½'£òåèº×wÝ<ðÚ]! sæ^ؐûveÅW=¦èÒ3á¼=6rÅ~¯÷©&ÃåÇv,u3Yf¯F4 +µÇœÎf¼uëL–/` #ÎÓ1|?'3/ÊC!äúÿ=ÿ›cY767M±Œ:¼ ®_r‹Nw?.¥wí~w@·qèEèV¼~¨¿ Ÿó1<8/°£-±‹ 3ÝüQ­Æ MIÁUffrŽV1ŒÿÐ9‹j N*¶pÿVF‘tÅÜJu<ûh—ΟÊÑ£‰Í‚àèœ±›¤¹D¾åëä/£Å††† N×èœL0Šì|ü®ý‚œ$†¬t?ŠÑúŒ‚Zœ:æDˆƒ‘°OSÿ¾N%{¯ÐMXj·æ @«4Ã4ãzS3¬Fœ¬ª£ £;ºüŒ.0¬óª·%††iǵñ'8Ã^5*©xMg‘ˍT10Ĉ¤`\‹(-»êÕªù +‡‘˽]bçh ½HFàÈʀšr¦–-’u¥ð¨-ÛPl/Ün;ðÛ\„^Ⱦ/@©õŒˆ$Ð"Ÿé=(Z!¸‘;PXHö¾hå3ÏÕæϹ‚GC#Ø.×Ù³ÑBü-¶)k4áâ"HÂFu3^0Zļ†ð̆ +fÙpnŸ\Z.A}‘ƒµé»ÿqp3¤Æ0vÔ Iù ÎLB¨÷c÷ +]ñ˜…îˆm÷ø¸õB`LwV¥‡UÖßTђbØ$¢“wK 503õ¶4{O+Í$€›8'ªdѯ-_Z-v‹MÄB0½À9běÚ'î Ò¼Në0™Õ2h7È߇«ë-ÆÞi ¥FwRm.¬¼WYÉÚòÒ¦HÒHpõ‘Ëÿt_màÂÃ6ÏòdХȬÍÊÈxtØm¤7ÌUُŠXÖ*à礽‹ä§ì”O[`¨@Ü»©ñZjsÚÀ:ԌKwfçÚȼ“År"˜|öî©*“zÃuOn}€äLJR~×# ³pL’aojµäávŠö-SgJ¶ ªÊFŒ{<¤uSÃ÷#e¾ÑØ£¥Jî7ù×¼d¿ø˜˜€Axéi¶‰üÌ•¡À-Ñn?­ò ¦*ïÙnï3Íä9M¼ Ҙ™o‰Zl6DY¸5 =.%Éëxx=ÅûÂZø\Ed‘¬/ãqf+~’%TM@¦ãÂíf'ò0ß»Ïæê‘à¿*„.~ÊDpn4ÙF'^Y4¥û|ëd›;øØ òüq ø¹¹biaH‰Ç;´ó1 7†bôz)¨²AŽ¦Ì^nQºaþ(©eEe'ƒÏÁPœ Ól$©hΫݬù‰U4% ™c(n`?‹ ¡T7M‡´!÷IÑÈcÐè؈¥ëˆxk9p’æ)ÑåâÍÆ%ù2¿ ‰¥èº¸zÄqæŠËõt‚pßaB[3Þ²¹®™±e¢+ƒIQ9¯®Å£uڶ‰“Uô3æ+²”P*½M¼pâ? fkÿaغ•ÂN´’È£T˜tÒbËó¦á¯KÜ`«O9u&RXÙ)¥Õ£”¾`¯èߊ`Ɩå °᢯&´Ðm…ÔÄߙO·y?€aW<…d f¹Ô]¥€ÆŸf7TVñß;¼"›3Ò£ý0lÇç9 ¾~µ³©’£˜$„ºØãSÚ[‚0Rîkà‚Á¡nϚjA¶~8Õãhú¢P·R4ŸQÅ(”r[]A·×¡JÙ©§¼Þyà”5~¦!{˜nCû':<åH¹®³Õ+Oµ®/dEþgz|X*úrz;Nÿ ÍR›}üø¸èFÉ­tï‡9aœ·¨†½ªÎ©DPEU5 šJοAt¦nE›3êð•ù¾,ó™å@ÝîËLj~éMÉf/‹‹ð°ö%ùLàTÆ ÊJnßúñ ÅϒÞïÀ©ˆ)±’W%æ!÷³D;"-‡¬lE~ÀÁïŽA1zð©‚Êð〡o3’Ôö7å” ØöôfÈ ¹Úcî;›†¾Oöcæ¦Gö-†Â2ð„£¥/ [ðÆB§Vì/hºŒzê}Wì¦Eä§Xª”,ˆ4ÜZú–ÝS-Y­˜¬b~·1oÑ<çx3ñìLåœprØ4‘ÂÄáp›$p"Ž £à¨iíBOı š×HçîÓ?TdÇé5IIuÃ÷˜ÓԙèZ 0ˆ#Š¼`ÕpŽcöOº„ïO…,ǁËÞsÁ#*á16mšôZájÝϒÏÛÞ ñáàÉØË4ÎǎOcƌÈØË +™’m.´Ï +µo}¬lhï”™µ¡#m<´+•¸ mÞvsÁŒ0~ÏgºÅ¶‡ð’j%àŽ;‘?(ãÒ9ôò†{ üt8o‡‘þôIÝë±Y™¸** 8üuEâ´pÎ`S—¿6ÀÂwÅÖêú`¥AmQ®P2ƒÄkÕ7Ž›­Áœè'Û]wuӘ™/Þh²„ïëkòLÕëԐWà0ûAGr†„°âsŸû•Ï «hÐÆfRÇ[ø7Âkó!tß4 ‹Ñ3¼×ðSz.VoW‡÷OöÞ0´ªmü;bùÞÖ dD¹(™Æõ¿+NOÕ þálØçB? Ç::µÖ뇅£—¾/ðª&]¢v‰AµPŸdù~ϋI"õÓԓ`÷žLɯ]7ÙHN¦ÄÃqÄî'³Ë”m®:®1¨BgI^“7–8{Á¶›D½¢g®ÒZçÖÎX[^³&x+åSʌ‘ÚJpXt‹ÁÀ·BŒ>ý¼øÔ~ÆrcÖ‰ÃÇ­“òôœ× »ä¯m+:p(i`©†S¥‚Nv¯±éÅÙ aô²Œ¨ÆÓNAí…GRᗪS`²³T͈'P%VEŠ{¸BGEät.w߈µōR,ø’Ožºì-üñ²uGI*…60þ—+°ßÚ É‡±ü¸ÕvØèÊàžV®ª!¹<0¼ “Þ† ̼‚֏ÃÝjÎw¦V¡žM’’$F¼ +ˆ#µ&`WOP†ªéjÝSáF˜uú»ó7/XàR|n3§ýDZ¾…Bèlëë‚xÍ5j4˜ªù—äºò§ªT†KƒI°@Þ蚜êe(³‹L¤›ý§¯3A‚€€ÝµšF:¹ÙÁéŽ?%#T`‹brÆôªBdÖ!O®¿ñn:¾Ü?&$€X-A—Ýr‘©At#¦~…â½×B{¨D/”Çå•JèA™Ê$õ4¡’yň¢ü_ÜÔ,çñݔ$‡ÚcÒO] 4Îôv„ +4[õNÎx_H‘…J¯­¡ªÔö]ùIMpÈÉ~Ä;íÌKˆUäºïô8›«8I@`ì·9¦‘W:ÐB@ ¹'öÒ6ä°x[í§s·¬Æޝñ#n³ãõWgÐ,:”·jór£¿þsŠÁ‚­MÊ|áàr܀_K@’ZO¡“ÌÓgÄ} ¹&“–{—ã Q¢4­¿Ìk…Æ Q«4x•h·LšPµê4̖}š‰ð€mñrvAùáši'‡õÿ IjÄTüñN¨n8é ÜH—M!Òï‡_6'È;,®Ý$Ȏ¬Bƒ0Jv\ ÆďJ2E yÄ$aÄ-r­r¯u$GCe¬¨0_òÞQ·“Ý’Š¾Ä÷Ö99aô§kK\º$&RS‚´‚`+Y»]…¸t oL–©1Ž<³F—†5͗üñNU^êgôaz©Èö÷9êm_ô¦²Ê^d/âà©¿ð•çý{¸&Ázöð<ôoèÒÌqåQÏ°¥\ÙMSyYƒÀå׉gþ mqpÍëï@“$!Qr>Uf°kq·së€íP^L° +!Gâ‰ßñU~=yj÷ ¿¼p/r*•`+sÄÏ;¦À'ØÅíC©)éœ^¤³,뒊€n—uÒOÁf>Ó;Æ15.ô—‰ƒgM¬d&1B"àԄ÷#Nñ%,ƒ1”ÛØ †TŃV€$7&±angH[huÎRuÎ1!*gÆ/M¬FçEáBɉÂêxGàØÄ{Ùz+] +&/‘A§Û:e‘HÚÚ3±ÏG1HÔX¢Â‚Zò NЂ@Šztdk ÊÙûÀ0ƞä8‘´ŒoFߝÂèq1?LÁÏö[Ûú¨Rïaz#9‘tÚ»âû¹§BãFa§i.g£çùVÖíœk¬y}–CJ€.tîj=¤Ø3”öÐ¥i¨qV³F—ºm:ö5m]NԘ™âH4Ä÷0A˜/‹}†¤ƒ TtIæi Rˆ·Cž—˜ñ …J„.æ¨mÊ%<¢K^fv÷ퟙ™¨§‡tJÿ™ºd„:P¨Ôc ÑåV§ŸJ «Rq<ºÌ1%l´¶û²ÿš)t!dœKå-´‚_^{:üôeîÍËèÂ鄣&výÛzt±‹¢UW]3Àq]Á½uƃ:†;х'-zó¤4Ãâ9aò½—@Xяéüؕ½Db ÊÍÂx0u.N½Â,ºû5DbÆ]zz' i1U túÅf;MZ§àDYáèáðuœ‚ ò“º9d´ÛpÜ,ƒ[¶ÂPè(^µN»@í¬’ÜúÂYǹ3äS- ƒo¥^.ÝUDµÁ’¡qE|Gt_†cåsÁ²öÍI’j;vï¼ôÎ›ŒQuƒ‡ß +™DI—ëë(DPÙ±cïöÛjbi²¨ÇÙÎzÌÏ_‚gHÒic‚"–``½Ï¥"xTVÖó©w…Œ.kxçè!YP+yÃÃÓ.Ð&ש¬89´âîÏÑwJTj̨™bÓ0¢S4f¼ÓEíâšÑ<-†R!ŒrTLTdR5¸W^;Éòø–â¦*ÿRxOˆ Z% _” uè»ÞÉ~µ¿Ä{Åt3ÌÊy óJÅ%ÇòEÎ ®dAÀçbŸ¶€0“P‹óa"+]_"U¶!³‹ÚH[¶¤Á8Éã›àz$©š>¯y!Gžªæ¿ÀŸØ‹-‚WêîQ8_²»8–FoAý \µŽ $tÕ*ñWߧQœìhķ̽Uøiñ¼Æ·T~‘©†ú$kï¡ÈjS X³£ù@Lµu7l° ƒz‡˜`+b`Ej€X|0(€[JrJJ’˜¹ïÐߌ—)4ˆ9–A²€ðxÈ!qp@A (¨ PP‡.€À^C0•le`@[I—rg6ždC¯‹ÓJJ-©Ö4êóތÙ4ñ,õ•$?¹E!æÈMyŠb+×!þ_7ìoÖX(7fÌɂÌ;šÍ&\bÑÄäå_Yæb ªÄ–ØØÀ8tRZ ù e &¼Á €Ú`034à l0 ƒƒ ¢‚a²6™vŸ4"žÙ­Ê‡˜¥ë¥ÊÒnL™T=IÍ£jQQ]“XeyReV¤•åõ²ìE—TY±>:Þt©[C>’­ë³%?Êö#¦ÉQjd¾ï½\, 9%_j×ÆDK•F,‘ä„”ÜYR>F€œ*î àZ +ÊõÌF!ËX…ŠN½Íº”=!ë®a"â³taFçZöÒj[e²’7å«m6Xdîz‰íȯuÊBŠdøk]QÊnM)6oL#ví±š+ìKÆUlYËAÊ6×}ÝïÚ?t¶ù¢ØHl™¯.Ùڗ©ìÅ%”Í¢›4¹¼®}I0\°žÍ#üWÏLKXIIVEŠsÈdæÿ>GŽ«qÚFÓ25*4ªƒ2bV¤a›ùü=ÿ“}î#•xC”Nð§»ür÷«R‹;lԇ̛ЧåïÏÿLŽÃ”y’,LŽ8ªø-M»“ófŠ33SŽŽ7ùÿžR&/ǙòÏ£4Å÷¨ÝB‰ò!Hò"e²7 çù"%[CI<òý1ÎA%¶4íQø»(yWèìwÄœ£^PúÙÝÎ*gfÓ2)3Û¥t…Gxg%I’7®ÄóŠJ–REÜ Ҕ„agr#„Eâ¥xB¢â¯^ŽãXv|ùBQL–üò39üßA¢l6åVf9¹¼dXbT'%eÝBiI­ɒ é GÔ64’DÅÔ ¬1zy ⯨ùÃñ°ÀÆärÜ‹D»!½k0óˆ8¬FöeÆ"aÄßqýñêâ8N)Wˆ#ǑĊÄ QŽ——ÃQ<ñˆ48ŠãT>›'ê +D´Aù‘8©P=`¢ƒHÔYØ#ñÇ:<4 úòډG†7Šô:.- n¦ã3-L=¤Óù# dœ™ÞøL …´vǐja#”#O&­ïðÚNލÍ.×zX‰%OÔìŽÐ·£°=4äܜ“vA3F“ˆüؐIÓSxÆ\&eˆ’]šÃHñ×!ˆèŽÃ}|ð“/a Ñ(|“ŸJƒ3³¦:¿JVŽ¡‰¨$ەWhãpb8 ÅòPÏr^Ò8<F*24,::4<˜c“™3@Œ1ÆÌÌöXBõ¬):ýÌ +QÉÇ)Ê[è-HÓw½÷H,†ÇÄÔ;Úю„ÌD,› Ò¨™Ù—Æxv‰²UρWŠ^Ï·…”€€§~[Þç…ÅI?&àßOÐ÷¾vÃd@ƒ‰³ÉJ¤âœƒR Äê$1ƒ¾v…S_†µOüa¹Q` -Gÿ׃¤âÒ ¨y1C…‚,\á Sš 5”}¨Mm•8Weæ è 7Éco^÷F£Æ…òW…ì¢ñöÊ#ŠÛ–RÆ;¯@›µlp[~–8ƒ Ç n®Ê7­‚?|zjYrÒü†r¼{`c^ÕR£.†[jë‡Zͤu`Ò"jÑ×2ç¬E׺»tböĕeÍ®F ª:†è™eÆÐUB2ª÷¯ò ]MJâ›.q î¯ÎBӊ¢4Æg ‰Ÿ?û@·…ê¢zÉñø€ Êàé;êG÷Î$$`à4Žï¦UŽJË ˜U‘a‚§n݁OM²,°‘Œ ™WÁl~XÊ(O”e'ÖeóýÛ¤s,ánRË´6-[tB!Ì»ï.qk&‹¾‰!ìÐÏ s“†€¥jî÷… j÷3Ðô_v †¯Í§ÈL:·þÃ[t¡ÞÂ$<‚0…µ€U•¸ÁÂg6I¶«ÃÀh+[ݑÚX]£:£j0õç°äJ9O¸q$þ$¡`ŸAXujw2– hL#z_&] ¥2ß#pígޑñ|ÓQúà +T $Œaú\¨^vq”¢!ò?l§/ù2ˆ´k<әØB`¸f­-wż} +”Ïø]C%‡êÎÁèÈõïo2Œ²Þǐ˜ümšëYèªA© ·,^Ma)šJŠ-Œˆ`skV4eRٜT"ׄá4¾vM̺ÊeŠf¨ÿia³=]éFYï5cZ¢J©*X±!,ôgüœâ,ZÇnÇÕ£TÇý’Q]ê +Ü÷´ø…D/½ÑÄ?æb‰áÙÁGØWdoJåùž³GbB÷ÎY j`%²0ÃûGŒáê÷Â*uÞ;x H¨㛬 +Hƒ9 ¢¤©7;Õ,ŸÙՖ ʇ µ‰5=Uñ?g æ)©BCjH§á$Ö㉲_!"-L²”nª3GÒÙÕúAü3@àbU˜ƒAs«ÀT>@W ôƒéÉ- –”àÿY›‹r?óžãêœü¹AË] ´"ôˆŒØL9ؓìþxÆr‚²©ÓÂùà•¿ÔñK49@Œ¸C½ pÒ›5Ƒî4^ùHòëXå_ Ñësõ>ï@6ˆPEðÎÔïàÞxú“3Õ7$r\OCóÛ9÷±L%äM%øÓX†H|ÈÃâªîs½0ªì ¦ãèÀZº¯=”ÉtJ?Á@Ä×}¦uɜ{e +$Æߛd¢QJHä15=÷c‘ ©Dø)åäªtBö«¾2c£Ž&¡*¢>Æbµ_Gz|øXêåÀÀØ3!dæ>çΩ.3e”“ÅáC„¯ÙÁ.zÕ Ž‹€1üȃ¸Çþ ê&"Ÿáévyã‚¤˜r,o¦ûçG>¼šD29€éNa§Â욙K™0|w®ŒM„UãÁèˆ6FšR‚µtFº {ø\2áuÇzËR`];#cÅòßõ  í=‚Mܑ8è¢zN!x‘e¿d%¹8€~y9æüs¨$Éë,–LTÌ"ôjŠäd +]q)¥æÀ"Ä¿}$º›‚¨­ ÒäÇó ÷Ñ ²A ]%½I¸¯ƒ¦«\³TT¼Åúêe99÷¨¦±ÕþÜüʨDšùµ9fÐà æ!iß ÈrÄÀß/Š/…%0H1*Ò Ì!* ’eÇÆח¶žFo¡šèPSÙÆÎc”ÂÃȍ ‡ÉVß%qÄ­CãÛPJ-ÐÃÎlŠ Rúæµi 6ó@b°ÃÜ–””‰Ë)X×ÂñZ˜ ñ<R˜J‹ÈûGÅ«Aæ|Q!®àd‰h°çˆT"^K$(?¥+”"RÖZØ4R=Dÿ'¶ˆülÉî]b¢F:!øgix(êÿûÔـ"G +U×[½®x*¹jåáÅÒÂÂî½õ!F•Ë5¹ò¶Á!ãXC l–"'ÀO™àƖËՉpˆq¾çñ¤Ð‡ò’Ò>ÏJh ­TT.6Ò p%> +ÞlYÙpŽlë>_.Æ2äÑ ‘&j$°I‚X徃ÒJ‡re!_o˜#% ÚÂ,;2Yî`SqòÑ o²QgK£‘ÃPå–q†# pÜ¢÷ ¤êS„îh~™ªâUB ‡ŸŸ½òڗP€ÔŸ)h‚4Pï*X +ç1;¸áÌB˜þBJœ¬·Þpñ®(ɪdöÈŽ "`†ƒNƁˆöÿEËúÛ}ë7?ej˚o ,°, k…Ŭ™ÞB;¯vÈÅP»#ç(VñØÿžsÇÂþ&÷Žñ íÄúªæ”ŒÍE¹€è´VA+~唔T!%¸ßeŠ‰ÀòpύF9£( a H–sûh˜Ú3L‹¿n_9v´[Mq+cõ9,Çn¹ß3áò ÂÀa¼×Ñ–“š¡¢G]Œ#€d€oF ÷(;ô² X +Š´JMÀŽ¸¶im+šýsü5”)löt€?õÃàõàµùg››­Îí؞!á *HƒVý¶ï%í°}ÄU=¶†ß3ÈÎj{Ó³m;ä5£D9•idCiŬ$¡kIqFˆ6/yá©ËJ:®AðX;‘ÓD–Šu+Åã2¦d;æû¼AÞxςf¥šœA6NÓÚà“ÛærWS¡äTg-÷H Yh62å&ܬVˆä«õ§å¸KƝÁXÈoãÅNµ#Ðr«H +.Æ+ù­û +“ã%¨=-\}Œ¥ÑÞÜ5N¸:áØýQÍXg‘¦¥²W~¡¿m½ÇÐ-⃤dNÌþCÄÒ>VT£ú_@MîÀàù®Y›àŸEÉÝ1 Wû;µ%ŠÙ4Ž®ÃB®X.Ê¥»Â†ƒ"À%?›J0«ù1LG¸Z,Ö­ ú¥Ýh¥Îä¯Ø0 ì•:˜6£Zé÷Eã#BïqËüµ»°A‡È8€ µï¹–KÛ/£1GxÌ+O°£r^:<Æ:¹æ’Ù9€A6—½ec9;3“„´j(q¹Ê@EŒÅX^6-™\¹6u6:Vs c>7]ô‰y„<»[_a¶ý;}©û⢵c4ü8äÓ֛{-4Zí¤ºz .ðçãÈ×.u¦ä˜7¼^>¥"}!i¿–+Åß:z›tYdiM(â)§„ßƲŠèÈ#ÄB÷㾖?ÙÒº~H•JðňXMg/|PbP9ÔzAþ»–SïŸ*4²‰Å=U9Ýܸúr£Xïèµq8ùÞ£ŠÅšæMÐà?ØÚ¨>iܪú±Ó¡ cŒA4â´Œá ÒDõ§™" 3Í2@EÌ=ðX&°¸ÊÅ®Ap>¡ÒÆÓÁ@uieöÇY†L²kCØ€iT9yŽv!),Ù¨ +ÿïËÚ<6JXK&¹þ™,c蒇Ž\ +fÈS´gžNÞ½2gÁH-¼â•Äè& û€Eú.f¡`·åhs8ÉA!‚C#›çw‚uj7XËø±™< ß2óïõ˒¾0nœ=Q“D­Z\‚ôšfBøgVÙÀ´E1¤Û;™_ï°½ÿ[«ÊÖ´&‰ž²o{„ü©åyd?„QèÃJñë?kéÔð[ŠHQ#XpC\í`XÑCt½Ä‚ÙAQ˜PoJ;Œ×Ŭu d (»µŒZÖo´ñ¡÷¡F®XÚÓËãÁŸ|¨u®-ˆwàmé-5.êËB§Xg8ö­Œ¹ xî¾Q¾aû‹:Õa4¿žq‘]ã!dúæVx…c¶zTíV¦ætÈÊ6ïò€î{êßïÌEf\tjáÊ ?%®oìøç(oðȉÀèü‹¥Gä.•ûL‰5ҙ§zbs.68v^n*$’‚øƒPøe¡kcpªV{QßJ߄dJ‡u% Rã`ùÊv¾uóS®[ÏGV©âô ‚ôJsK¤É뢠T›lwÖ±¢«h ±ø&vQ‚°©JÀ}Œ}+‹½;¾~0Œ´Ë‚—,Õ +Y²Y¡&åŠâôhˆ˜;çøsv4Çdù]TG•/ÌrÑõçãâ¢unÒ-RõDš%ÒےîAÐÙñÂxjöc‡¾#n‰iTÆoùÉsèXÁ×®XÞ5EùA gÂç_By$•d†æW^Ö«+·ÜÈ2€"#ÆُÁøK€wArCœ~úq:qîÐ$¬òÉø¤e{(Õ­,Gu^ùˆlA/t{œؗ‘C‰lEa?…Y¸äÝ)jæe)OàǎDÁ^Œvéz„°ä_½ã¤Ö;ò–nÿä؞?ú\æJ¢I"êãaEíh&y#Ìy­Þ¦‡›^W²»³¢éW +ÉYÐcÐnw¿`?"©<ý*pe˯Eq* eÅTäŠÄ {Õ£?7DäIÔ)3; B2t¬‡mPN=¼Úüc…ÏExdò&¼·‘U°15`ù½|»EÉSFЧ|¯ˆ7tö•Û‡íq¨xkL¬2Áñ÷ªðíÍ]ä9c’«ÑñŸ+Û9ñV/Â>ôÝôè‘B¤QØ='—°« ~vë„Úìñz´¯N+Ø©E /ª8IqöI¸É£Ï9{áFÇÁèWa<­ö&éöó屛R….Ú ˜o*{žsXƒÞõ:)mK½ªÓ·¯Ÿ¦FáKa_±i†¢ÀÿoIZ×1爠@H"Cz4‰OÕÚùRÑËi‡ªðP¶…܇™ +4N:0¾ tXIVă¯µ÷ÐÀàa҇£"£[g_èl¢“"_ ýÔʧ󫴟"-´(Èü#ôÚ-#_fц ę°ñÀJ¹˜óQdÄ?=z ŠíIKJƒÙ PpØ`\v#sãLþ²8&l°XwàKœwØxeasàÞ-í‹ã@ÊÉá;ºÃu§ÕéJa/l"“C•çH*>]_Jøûúo|?Fµý^s¼ + +Eì¾fǓ“Nây¯ÀÕ§v{@Ø%_ô®ß½õ$ª³ òP±;ãP7=4ø7q‡L2ª¡N ·Æ·­Øý´ HU?°Žìå#SFóENTZCeÍÙgÉ`*åâ6QÊ»Ô:zˆ‹SqUéŽ>tá +F2\Öâ"¢˜%Ô¸VS2ß-’,™ðDisó˜^ :´ïKoÊá3­•—eMQÂbmù³‚Å.ƒº’l !'ÒÐÄ<‡´˜Í#°þ_—®ïë:Õ%ÈlTäjÕÀƒ£®n¤”-bèGAqx}•ÅãÕ®ÓÿÇd^)µË±'LºÀ«æ+Lk£shïNæwÈcÈÒR?•¸«Ü" ZŒ“–„;1÷>ø1¸fۗc0Ë«ºþ°Ë¸EÐ`!‰ùaL݉’˳ÒfXý"cÊÁŠvÞcçZ[¨n!jàÙr’ÜÏàA`'ù´¾vŽÇ!Æ®ò¬õSÙK/û%æEøNK0¹ !N#·§ôùæǨš•@f14ÿô•6Ƅ‡ +ÏÓdhæ5e’ËêY`öm² +&#elu,B`‰:aeâ›ÆbO£3E´ +Tyezeò!^ß9Íd³Ã+hßÞv§FÏ•bê!šMh¾Zٛ$ÉY@"®`K5jàö‰gð?Ò)"OÀ0­%N×eJ IJbfý3å<ÇèÚf© +XXŽ­Æëhü:YàxߚéJ¥Ô4™œÌ`©¯èž²¬šBlvo®×„ %Q5è}ÐäµM`šYvÊþ4¹ù5gÞךⶐ‰¸LAÂû\q,rfˆdÜhú•Hºþä/9xgéüŠ £”!uEñ B,¦ˆ¬Ê|¼‚n¥¸eÆF„Zû=ç­pì¨\ iªŽ¢ç)œSvKÀÙ ÅgeÕANÍÉü°ìòŠ ~£’-Þ5p¿®¼±ÕÎöŽ‘Å¡¦G.'òP#šˆO!ÛyoøÓ»àgTY¹N÷«4`ùQaèVæYÍv>[šýïçø»ö;î¯ ùû EúæÄvcœ7[AyVܱ¹š ÇáK«eŽ -ö—@hWӁƒEõtEÊý½´^šâ﹂‚j®ŽÄ´±‡´W¿$6©Yœ¹ØèHJø_žzùìK^ùىm¨ #¹`¡«rÿOʅ5pãø>lµ+ÖXf ýëü7ñ ݖ¿Çüٳɠ×û·s;-õܞ¯ëU"?‚K„Ô˜JÇ37Æ~“•,¡DG¡žè¾9·4‚c»M™¾ã0Ù¬FÙÅÿôTgøAcJç;îõŠòÈFÁñSƒ\«C G¡bt;Àg×èÛ>2OcŤÏȻ̊ÚÖxàÆ\vrâ=A×hÈƾkOìæXîÄó­xä²Ë3âDò ™ &ž m½¯íò:(ê’_b Ζx¸éoZ‰Ý)¢3rJ¼U]çxŸÄè0zË.\I¼UAXTÖ`Fâ¢ó£]uÁ8äâv>Ve}ˆa""ª Üþ§Gð’kˆÝ‚ÅȅHe{; ±äšæó ÎwRTû¤¼¸îìSCâ*ýFºjL>ÍYøÙKJÔë¦n÷!ó!´Ïxڞ%v‚ŠÈ÷Á{N&™Cq?g’¾üÁÒ­åµ|C8EÑ\7<%·a¯Ÿ¸TI— æí²âCÚíÄ/°7Ð ²bž®•G{x>ö +¦o2̗ÈǐÍ‹¡hÓq * a™ŽÿB±Ö¸4cuìŒzÃËÈ ÑÅuL”_Š/câ*Ìʟ8M…Ðÿc<…Ø„Qš?á-iŽ)líj;á…C¿ŒÒ…j0z[™ßöbI%ôëIȓ00 ;.‘p‚²Ü7>ÂA!ŠûwÃGšå¸ÛÕÕí,QÖýAa¨@Y <§kÐ}p:ž‡Þ˜=¨ˆ}YåÁ`3pEŽÐü;øf¼D#"w¶TÀyì)Ü›„d'à=Pá,¾Ïk´# ¶Ì`ý8‚·Ôwù#Be0‡v/™sîBF‹‘Z!›tAºû\Rd¾‡\«äÕfA:'7ToåRv"*6üF”vüpMŸR ĨñÀŸ¶•=P­"îÀBM 5æMM7UU(d»yƒrOk˜1Ý£D?òӜ¯ù;ƒO`w̔²$Z(Vˆ†À!w‡Ñãe…€È$Wbæ0—rÚNoPÅfä x®!HœÙOýðÒ¡=ÀZÀæ÷gŽo€™rÔ0Ày4õÿ“CKn=c°Ÿ8æ¿y­~Dë¢(Òᬳ6‹Ó4ŒŒçŸ¾á`‹ZQ+Öû›Q’rç8©ý‰Bàõ‡qäLí€ÖG@‹ówA)D[„ô°}Öd¿V.'£ +=Ôõ4^ä”ó7IcRý ·Â`äô‹,® ‚1W²Ø\ü“] Ò2/åú«&€“¤ãÇÑô²£èp?”ögNŸÚñî‹ø° 2Âð»Jëá<1^Æ"—x—MtzV;º ÝûÊ+ŸÍÿ5+ç%K¿ù"Òëƒæ F¶¾—ËKÊr3 ùgã¯Jœþ&–¾ZV65å™Gß¡ö:ÔЧÎO ý|YÇz/,Šé!Vñæ»ÛÍf²õ--`F¾[ Y9ÊUöøZKn|À¤Lï$½…³—YHq}ÈqýɂˆÄW>/©öq–yøÔ ÁqÈ؅ïªXÒä¾ñ,኱>¯Ôþ^÷£ïyB~½÷i¾xü-‹twïúF[÷Æë "'Í=øî»eÜC2y¨o¯Rf¯Çr|y(¾(ïÚSW y•ÑU‚ší·Â­w÷s va z ŸÁT +^XAxK×g¼3Y¤±a¹ó÷ª÷8}™ŽÝ8o‡S*à2,½ûyT ++@èÝ%z ž€Gæ$k¥Byêù /1‘Ý-Ü·(`thâÔºä”Q›;)`<ÊxܸÎÅ^„|Íqëàx½ +ŠN`bú‚·vˆA[^ ÷\Òæ(‰áJ)^ïH½E¨œ"¶ÀEˆš”H‰›Añ)~i~úv°ñíDa*´ÊÜý—­Ðpð5»l¢âJÆÁbޝqô¹ì\/ÅÅâëÁ¬éߕ¸(ë +‰™á®¯­^ÎÍ +÷Y8>Yz9á½ÈVÎn°f,iÉe÷²¬ü£ddë?lòÚ딳­-«ž ¹°F(NÆ ík&6½©$úÆԁ+aòéŽzp(LpÕð8”’¹lˆöù¸±^ÎÎEïYbø€&uGß n¤À_uÓk¯Æ“àþSóøDاÞ>eNW †ž‡yuÌ?Á_k˜ˆóÆ¡Ä, óÉ+ÀE qÒClÊ{%~¹>lóÇOÝÃøÚ×Ç­mÏ^†7 • †ipg>×e +[h¸yöšØŠ¬oa>àCÃÁ6rhãá}ùãýheLª¶];¥(™kWŠÂ"| h×ó`ÖFÌüЄ¦K%Þ-éIààpMu¸Ù6ÅÑÄ°Ã)ð¼¯Hvp½¬.´¬ÏSÊ þiæ’ø ¢¤—Ëòh0ޙ_yGœWïꢅ\åκ2Q$.ÝG䦍H)æI_R)þ4ÿ"•sø˜:ZÒG™cË>ûþdÁ6Ž-[/ ÄWÏg¸‘~ öôÁà}{bzñ5«o"t›à{dªó—RHPš¯¯·ÜÛlVÀ8Ù-ávwaRäh®·€Lõ–#º[F£¿½µÀÍôENÇwèR©ëú2é³;,ê¢*±€èÁH­ûØħÄÑ®FbiáÉWQ×ï„5ÄÐq©dºÜ¬¡|h—7Mû¾à>ܘ€ˆ9 ڟ±Ø3Ö1;ÝTK%/rVp¥ÑSJZÏçò—cà &øDH)› @e”Ù®¾B«F‘ß,ÄÊv‚í?`>âœôÒ©+Ôt8Dyâ–X‹’›B˜3 ÓEA÷,o Œz¦FZXK÷ËBSq®ù)Fš¯ù4ŒÎ?Yþç¥!mK§8tÕ=¢ Ÿ„V88n–ø\Lÿ S¥-KU¾­ÅNɇ3®ƒ‹ÖV\ŽÐYÃ”ÛEæ¹A8þڀ½º#t«©(œ:րÍ@IãÜE[‚V¡—Ä󆴋‹æ=xHœÚV›óäÄÎà ¿KP*«=ªƒ^vc½¬Nà€Aٚ¶R°µpMüK’uènݪQ˜C±@¸–+׋a€Á˜OÿÔ~å¿stÛÚ¬}ÛFa^¨æbMn§ŽÅ¶Š%§1e æè,ƒèYß«/º—?[-VE³þÕÜ°’êÃ0¦¬Þ·ªãGn”rÁë5ŠP®J·0G‡äa¼N4æ Ž~x@'¦’V¹i åŀÃUù‹Sýå)©¨pü,'Ë[ndNþà÷w8 ÖÏzãÊ© ¡Ü)ÎÊæÕ5ĝ9æ¤ôX%[i¸Lnhkh$F‹ˆ@րÌ!¹ò¿ †3 áQsƒ&̓ÁPTˆ^ÇBÒ`²‘N õìâñÁ°™pO`Žj{¿<)%zeq"SEã©•æîDƒ‘`ŠÅÀfy +(¨Ôz6…"™6+ûó{Ûäˆct„0íæ={ـ}v¸ˆëJyçËd•:Ê¿ùhá+‡4$ë+åYÉý.F¢Å䢍Lüdò 9^ä¾R˜oY-xG«®Þ,zÆ ã0³nSG•Gž`.3ëG»žluº”|!¤Ù‡ §×  Yñx'ižá[Øy@„ó]֛8%:Œ-ɯÀë8¤Ež'ǎ°"N¤Z 6-ò¨V·p&)|Sk5`¾„~Ê«ƒQ…g'ïÑKçËPž«(®Ûf‡jÔá³hCwÉhžÎÔ³ýÑ!òc.–\%¦ß&¸-Hoˆ(ؔŸ;Õ­Žýæ +ÐÀAÜT¬Ñ‡=eõn×Nãfa6éDùBjŸ_+ —JŠƒgúÀ‘èõ(gO¨‡üÞokÑJAÇ1j´K”Õ˜lc…ò‰<ÖªÜÎjTÃRL•*º½} ¡7¤,Â%'`d)ó˜ÒJ½€@àéJ[žî°<࣒Œ +É+¥> VPôãSWÊö8ˆKêÕw6gãæB ±†3‡‚M IoÄúÍg¬ßÒDìÆXÉjøNUC0ð4Ã`©Š‡?W¼ÄäÒÿZàõ`~1(ý ˆÿ /fP}«*ªìƒ:FAÌÚ#õf¼•,¯J¸h߶ò6¹KÑÊUnﲨ”0÷Z#A¿ÉqA/î +¥=ŸB¸°òšÏKö·ã#àÓÉA9,²ÚF†›=®R°«?÷Ñ[Ï@d‰ †["ÙÑÐB õ¾ •û. ¬ +ÇÜz2áĹÐ!z?û¿,+³ByÒ¥"mM<íû,Á#X{[g}Ón1ÀÜ ÆSkpMðD‹pDõ€RÒ£Uluéœ ÝÎù7±’=œÄ6¤K(¾TðùÊEiȁ#š¨Âc<]!/n×OØàt€«ne΃ŒÁ[T^"ywçÜ¢²`7x‚âF<Y¡IX Á4Hˆuüñ‚è¹' ©?q§nÛSV;úÃã‡?,hVð1AMԚ¤±*-!4÷fMt³Oú}LÜ03j*D²"¯) +Äüaiž.•(”° +ÏÖ"ô€Ø$|<-búk{€gBJª“}WŠ¡:/ùÏÃãŠ}g8óŒJf–|æD*ˤ}Q¤,ÅyW¢Æᒁ%&…£%v&I!¸–v N8[|†PNæk¹ßE|èÊÏñ³@H÷hXÆÕ5ÒÁæ*"ëÚ<˺qÌ^{&ۃMŽFZ‹sɝ÷Å¡ÖR•o$ŠQÇ<É÷ÙÁwµá!E`ӟ)<w÷ ¢9ˆŸfI.âQ¤²z¹ª4j租¦Y†š_¡5+–ýø¸ìÇ{Hþ ÊäåZ{tê$«xÊj/!áÞ¬_¦˜ûy$‰èy¸¾óP¤ž¨E‘Ý=ýyÈÏRz§¬¾Ånò†dŲ:Ÿ:k²dW`Û´ÆØ55±¬ mâ$‘’¤Üæ@>Tµô© Š“¦àÑo"f<è)j´×»d˜ý`M¦±OyV÷nàDÎø¬.þ´J9+ç6¨z™® ô4Èýé~„JFcNäV‰<™\Lì¨ Œ]&1Äó Jµ>éãe4âÙrX*vǂѥQ5+ïì¯í簢ʣÆ#b†éŠÖ*ҏ(ÊuÜ£¥ŽýúrTÉà `= Ùçl:M!î_xFÛ#i@Zw8à=»Dl\ÝJTâ×ȲÞF÷Õ ê~&°55¾…Õˆ³´n§{8ŒºBꐔÃI&Ãn¼›4tj¼wGûˆð×îào‰¡&[wù3aóºwó®Ö°Ã:„à&Ñÿv×¥_·›µæ·Ô ÎlWbD„×.+iJ¬v¨'sÚ5’rðõN‡ ^¾ÜzŸêØOŸ¶aWú 22Ø]ɱZ¢rL°¿î_Ûð^G ÓT BÖž”¬ÞÚ|pǺÜŸupÄ°ê{qĺ8Ñô«;ÚW‘Ñ)<¿“œïW¡•M§ìˆÎ¦^Ee؟ÙZþPwn6øÓ©jÙï®SY ”tº¬ÏYiÊÙÌðÎtX§ûf]ɅÍr£rH5[ø\:™ìÛJ×Ø¥ì'Âgöü­#«H—OjjÏ6‹ßíК³§²íD7û‰ð8tp©DtÔgZèjýXˢߠk—Åôad ›’FVóyèÚþœºÑ~ûÙ=)ÈrD»Û΃VLÉ+‡£†”êÙeéÒ·æH€¯4—ï´&ÏR~‹•9àèShviªOëEó–ƒëF³Ü +p^9üR©q¢¸>}*™rcm1"“nŽ‰Ë>9ˆ³ÒÛä®Æ‹/¹h–¸±$wtò\k/rZvRiÝÕ ÄÚNÕ·Þ8iý¼Æ•Vÿ3.]›5Å8u!¼Ù/®(Šboq¹Œå̅T®8£˜™âŠdzXO\Ýo7[âJm'G\éŒqùXS|8\Súµ2“ÄS€¹Ì\uÒfdƒ«rØl‘Ó—vÚk㝸ÁQÏœ¸Õæ/p¨Q.€+™ò8 ¤T¼ÿ …šÛßD#<ӛ+× ðúîþ<‰×õoD'©?‡vw#œ%i ÈŠLÚh,1µv2äž·V+.¸dùê®è—‘‰×bóÔq£rH“Ò¦cvÊ8R‡¹“o% ÿ´m£ß6ÂØp½kÙpfüIU+ B¯[Æ:QH@¯Ø%P9ò@›P™uÇMZÜr±2FÔjyÖއÔ'ˆÁM­Æ¼˜ÎšþÒëz¥T7/ǘü›/6Èã$M¯¶ºçmƒèêí׶[HOólë¡jÛÐ^Üaxmàƒã†îòYYÏ¥\í2×h´‚]ڔSsתôÃh#¯›láFHÆ^h»fuþl½‚¾vϝ Šl\g»dîØt'ð,Ðj˧ ݊ o™­]5\6Ucó»Ýԕ^³‘.ïÐt½˜‚ëäVt÷É&h–83|*Žd´·1¹µ–RnlóRTíbƒ°Ž·'¶7:ãÃ&¶´á6,š©íTGj°%!iL´„%9ªs þSglƒYîžq:ßÛ±'vŽ7ò¡©ŒøɔãJ•¦VSØ^%PL,˂߱©:–RüŠÝÛÕ)òΆB©š öëV“fzúK«3'5MÖÔêó7„^°^y/(Ós‹¾íG&¹ƒ¡Ì5É%Rt¥.tåÏ»©gù7£ƒ3Üj +yÎ]›©"ÿ¸Y-Šä}-ȅ@Œ¬E¿üG–.C•JÙ;‹p~|#à ¨©\’ÖaĦ,ÀÒØ×O»ýì¼;- ÛŠïgØcæYö¬,±[ ã·¿hÝ®Û<_Ç*åñ‚yƒ8¼XÕ&£ÔftØU ~Ò©£CÁö˵' ÒÔQn¦ÄÍ34%rI›·b­WL /Ví_ ¬âL›”›®Û’ÀQì×£gÄ¡,)óøø¨ÑôN{çév‹õú¼hÄ}|Ÿu2ͱR½-³¦òMw±jŒpnüh85®ìAÞo‘#SS2C³q+F=·ùë–äýçˆÃ—Ækmï9O'Ì-ô„{)^)î£Í¡¸- }:¹6“@×&€ÇÌ،㠦§ÇH/¡­e9JX˜ÈÒ¥þ›^xòêr#ظ]¬š%€×¤1zU{?q4_bœ¢œ¼)Òlo/ËÜöD¾ÖSêÈöYºíÁVè› |CåÞÓØ "J®b ©BM|cMÐ×ç%$Î/Eû{YE¼ñ̜¡_ÏÂ%sKzA´]eÒ¯éS«˜m%$Díe±.ZòtòÉB ÞÙ ?gسV@…Ý 4ù(Õ8)‹£µ­Ÿ+LÓ:¦…eM§ZHðŒÖÉ‚b£ÝN§Â¹DhφTZ¶ýÓ&:xú¾h¥ÍXLE†z—lAš2%6S¡ô»° ãJé~,ZqÇmrZòñ®áú+ w1€‡‡wf4u>Àùúã˜ýD›Ö"RÿÙ3è‚Eâç…hÔóÒl=ìÁqñÊ«7wÍ$Ù Í*1»žaŽP£:ßxÑøyÖ«Zâ“Q,NSåpÒ%¢‡†”ÑÊJ>*wínŽ-D={©ØP,§ìF_º|Wø!ýa“• S$-³ô¹’§Sº(¢ƒq„3nè3([8ō٠ñW‡|¦t’ý‰˜Ðkèy‡y ücv#Ä.;Šˆ™¢QÁ˜:³·«^Á¬Æ̧B&ˆzX`-†‘Ù,»ÆÏÎZ‘ˆ#$ÉðØæ ö¥¾1§=hªÈêÌàX]À:©ë ^#ׄ?äV^ll´ ³Û`æZŠçÂ)úø{­eþÕ ÂZj´µÀÙ¬ÁyûTàÌÀý=>Î4"G€â5¯Ã¸Ù® ÄpºmÊþ×ÿþu‹ÚÁMŒmž*¾ò¦”­ni¶;væõv|Q~ŠL§RF‚¹åZÏé7:1I$Ý[Û@zògV×bàzcSxÐHTª©«NÑak#c0*™é—5Û'…¤ç'Ž&‹†÷IqÄù=@Ý?Ø·©K02à^ hÍð÷WuHÙ8¶§¾r¼¹¤+$THÌÐ4 z:CO7jÉ*%f¼¢#að˜QÞ<yñó€~5:rØFÉ+´¤ü%]š>‰·Ji\ç*I*EE«yùjBXˆ¼V¡pGK󐉐?–"ÔPÂ^‘ðß낀šêÛ]Ï »øºö”WTø¡Nª‚4ªƒM¿æyÒ.;TÖsõ¸2ça9§îešs72œS¯8c1tӇµÞ£?èö‹@Á³/½‡ò·cðÜjg#‰ñ#púî+•t(ð«fM!Ÿ藨Œ˜€³É0RQò¬G®÷ e€rØ:¯Q<}ÔLVEQBÚ_bӂ°;Ê}«JÄJÐùEò1ðšÜýó$sÇs=#ø#a­ óSÖìŠÜp/kfD²š™'¦c6è}w9òdåÀ+0€+˜äqúMXC[ÈÚ²#:¢#lŸ+eщ¶øŽä³A…¢xgpà+Š??Q<õÃ9ù˜ÅªÈ>¥í¿Õí }I×Z”3¿8pÓ‘UáÚWlSŽ…JÆOÖꂩ#wd,9y>î —ĵ FN‡wï—ÊCåId\| †ÒáéxP"ƒZp¢…Ðdæó̀ÊÐn»r™eYD‚F¥è•DùÄ}©Rö·q¯Wx®y¾[(µÖA!ûFÇþê>¼¥`1Xl ‘âŠÇ'‘¸æ-ÊÃö¾9£„ã“÷n§I5ò·Ît™%ƒj#¸½5éC~&‡ÇIKÛQP¬R‚µB>GŽü°ªúmïDAô\>Á–ÃnŽuQP«RsšøÞ¤s†0ÑDÁa¶há¹ZQUt} næÊ©0%<ÒPæQ= +…\…t žÀ¬=–Å×zd‹ÛO”L6È°àšÿ‡zoÊGv Úü`rk–Æÿ4:Wxí«Í¾N“¿z•£Z‹¨qrÆ؎:Tè)é<Á’ˆuEJ€-7a¤Á®˜Ì{":c‡S2` yŠOÒrV‡Þg•šµTš¨¦ øɺX MÁEw¹€¨ +¾ë,˜:FÀ¦Q Ä~á +P¾""¦WœHÜÊÒ^·k<΅."šé±‡a©®€Á§ß ‚ö<åĨ§†+©’kÊc" Ü«HË<ø$…ˆ„÷oÅ`œsüµÀƒŠ£í½fÖ§‹†ò–ÎíV:όƒFàƒ¡L"á3Ìq‚‘#¯)°o N'eA/(…3¨Ñ»ŸU;^mm%ý”·¥9ß"åáÁäO‡kìÂô|P3€õã„©úD³Øí0?fÓwÐO}½!d€¬ñ¨±ÏÎÙ³GMO&~¨AkÙ¿Å$ëðƒPS-_k±ÿ{…ÛJÕÈ° =_)Ç1,$Ö½P° +!FcTÃo‡wìï@ý€Ã§µ†ZèÀÍsÎSæ0Hs£„|¢Ö¾•Å&Ÿt¬¦€Ïüēr¸çž¸aà<{(å&  èM¹ÓzÊ‰ÍN,³Ð*H¼ÌGà=É$ʾ<¡ã= <ϥ܄!Š!›øÛyS,LnÉ4k¤Ø‚¨Q§ò†¡àŠµ +xî*éDJNí#?NPZqÏ×'˜±å˜ì{¿¡dIŒ®{þûpTšBábP´$£WbnҞC+¤Çqi0!€: Ž“æóH²L+âxüÝ ‡Òô*ynO÷‚Ì×ú-ßÒ}K·Ý ×ýHä¶ÃµÑœlÏ®ùÕ¥Ðϧt⠙Æ]Ÿý<¾w°.,ˆÇ‰d0˜ÆԞ•:ÓúEDóåyj·+ßÌÿ)ô)=ª*Ït»b °}ió˜yÛl;;0µvã¢VõÛUÄ!®«´¿ ÌE©ço SŠc.8ˆŠÓ(•nl.k/nË£ZÚ->žVՉnfhA·²rœÉ¦¿žŸ‚Á\žÆ“/¦'j¡÷UDÙÆR‚ÓŠuw½ÕÉ+©à'¾Xo¨>á/¼£…(±¡Äž¸:zkÁ ބ‘æ@?ÃKu§””¨2`½÷;ãWojÒR2¾úá:@rP3o€)„\½UƒC¬&¶yé3©äÜ较÷ʅ÷y8"9ρțþFþwƅæÎ!oø£KG$?|öGxvÝྐྵòöò¥÷:bu ÑaRŸ·4¾)ÒÑ6ãörå$ÌÔ t!o2I$Jõé&ämPp["ñ‘»IyåŠKä-‘Y»Liò¦ïoçl yëÒ^z€È› kä ™•H8gy{ÖîÞŠyÃR‰ä­—á’@Rl"‘ì‰ïDz&"JIZJ3W…“’%yÅe$oÓ$6D$ÚCX»RkY»ÿ¸fÕÚÅ2òöØ=_¡µÏËõEÞV|Z'ëEÞLrz‡A‘·¶cžC9£C&0Øs…>%qŠ„zŒy[HŒ¼õƒXäÍ|0ŒŒ¼m{"YJ6ò&wš"läí*<ËH$FÞnŠv2Óüv<<3 P!‡QÙ‰ý¼¨GÞt¼ñÒe·Ã~ÙíÌMò&bˆh§*;ÿ‘·âÄð‚äòz'&ùtUÙ؛ôŽ¼u­üzu7Ÿ@ÿ»½cg$’—œ‡‘7geiQ¦CÕÈۇ-.ᖾD"^RäN`4æ(!AÆs¶›@'5s_@’¨È˜å¾‰äXxˆ*òÖ«ÿöÓ²Îú÷zý½û3'ò¶ '’Ip³wñù‹”ù•ˆ¼ÝY¯Ĩ8[;‰`ù·ñÝ¥ˆ¼U@ۍtŠÈ@ò $’Þ”õ„'¡œÄ)Ù!o—?‘d²ú­CÞ, xaŒH‚¼ÍªDüD"ÃT´í¢=¶Ûùà!ä­ÄTîò8ˆ¼µÒÃ9¾?Æú®¿üþm7† ·[°È{ë ‘ÌÈ?bSÏX[™*?Ë>Þ±oݺøÆ(ò¶àŒ¼!Eތ2,ÿy{ù)^ +hÌ\ºòæ²ÎcߛyYç9ýÊÑ{³óyó >òvÀ#y«…wNò֋OÀ9¬æV P’7؅œ'Ì'ÞþnèêÂ&$Ì6Ä0kkRњN4âG$ÁÄ¢Öď@´œ‘7Ô\/„w™¼vÛ1KÍxH.ó&~DŠ<Ý<SäMÊ`ì@w`”ØÇ)›(«NKUäí+–HÙÊ'þ0êë‰ç;ñ;ªÛfä ߉$:áíőX‘Ћ=¼ëþñãÞç8뵎a¬7}£É/’7k_’7Þw›1ÃJÞîÞ0¥Í"y_Ÿ”¡oÞî~ßrì?j‘|7;ï%o"Ó#2c4&o;¡ŠE2¤É›Xbòv1íËåØ\ò6’!œ”¼ ó2,pÉ"±ÿÓÉ˲ۍQò†ºZ¾ƒéµ‚±¶N—¼-`VF¥ä-íŠD'R©…É[Ö 'r»køGÞÇäM¼‰( ÎäMžSÒzƒ£ëò)Àí®Qò¶ÅV$ ÞT{à䠊äْ7Óà2*y‹aÅ—wñðÒu.ëû·÷|ë¿}qo¶äíFyëCÞ,L~¼-(>Þ +ú›z_'Bömñ½ {¼ Q‘¼¥éñ&4;D1·ÉcǛ7ºñíçšéxÆ"¹lHrÑñ¦æ ˆ¤2æ^HÇÛâ<äŠú¾a‘¤u¼ÝÀ›„EÊKâJšŸû}ë7®Er5i¢ ê$ž›:Þ<ÒJØY¦Y¥Ý·è?¼´÷Ý£8ÞÀí:µâxۓì(‹¤Áãx{6@$~Ž·Jh ²Ž·y¶6w¿Me‘œíx{RwjP¾y¼uýê¡ó8úeúŽ}{hêñ6‹dTÓ(ö¹ßÑëßIV7¯®ãñv¢S¹DSO!*uÛ5VÚvðx  ;ÞîDr1ÅÆÄ+aj­¯Oi¢tYÌÄr€8&Æm7xǦDÂ!aáí;¥´îƒ‹8ފ֣³:ގPÞxKÿ#¨]o>b‹$üoB#¢¹Áƛ¯ÙaÀƛTdwR̼%ñÇÛ4 VŠkI÷\bA¦ZIž²»“‡ã- E&ŒÞÄ@Üx[s]†¾/Ó¶Ñïÿ™hãíc·yúÅfZàN„¬Í¢ñö¢¤dvÝB]·\o'ÀÄo#””›ãän®w+EÖx1–¤”æW4ÞÆ¥‚ù2.LÑ}”˜x{ìý}‘¤£ñ2Fõ"áËNaöàMʹÝæBnw,~ E +ÝØxÛ¦S÷Ð$ÂÄޒ‘àQF"±8#¹2Ýí†àO‡yŽaÛ¯cj¯ádÀF²Œj$AdBZ3֟Ku_¶Æ[UÉ9MA°l¼™'• ¨.º#asN"ˆ L©”QŠ9s1$oC×Hs¤Ü4F#8Üô+ßvU.µ7]Z˜@å“”WÅOãxsÁÍñÆ'¨*êx£Í0ø­¿þ?#áœã™Q±Ž7©±Lw¼É­‘¨7vÿL¶@s@¤ýoÕJ!=Þ .b;Ðçcýˆ =Þ.Äé®×ñ6=ö;‹bíxcÍ73¿H²o²©î«˜áñÖ8¶£>N $Ë7Îñö€Î㛨§P²%0óÿ.OºÎw¼õÈ·;OC9¥ÝDEÛñöÉ&ëW‹:ííÆâÌó;Þ¢ã ß.YŽ7ýœ¨ž…o-•·þø ·PäùÉoY­·õۛãím׿8Þ6åHf™€ü8Ž%ÆPö7?'¬#ñs’ƒCDÇñ&Õú«n¼ù^YEbÎǛ“8kýÕÞ<ë÷nË4¥RGòÈHÎ7ÞÔSØÇSlbeéՑ|{BàáxºSr¼5úû[=ßeÌë\0ݽ†IÇۍ©Ø‘,ÑäCY+$Jí(Ãð„×àΟÿ†1Èñ¦€$þz$JÜî‡U’T (sÚHïñÆÇGÒ*s·Ò}ì¯F>_ cîR~¼±IÚL¤?ÞöùÛUšSô€“ã¼Ï0Æ1ú‘¼^œÔ~Y»d€¼©2Aü oödêëó÷׳F?’3)êŒ ÁüBÞÞùH‚¼!òݾc>’ÝI È[ç;Xì¨ølhîí|ÙLú–áF»»Óëµþú·mìïŸe=ëïëýûîoämãB9T@ÞRX7ËFÇ ŽdPt7v» oZ8’[þÝn7ÞnßïÞæ}ãÉPˆÖÃǛcos¿=Æÿa½ë¯ÿöC=ކàH¦zLT¸0•IފÓÛ-à㍅"Õs$“üØàÛ (‹ÞQI§kÝZño_mc|=ëwßæx#yÐd]j‚7²³ÑÛEîñöÝ­Zo7Èx$|»„þëßÞÙwo¹|Æ뵌#Ñk#µowَ·ÕjˆdTI敘½Ý"y¼±ø/ ˜èñöñ’÷vÿ~–eFoÅÇۋ‰ðòv¼]´rÉ=·çgYèo·ç¬˜פÇÛÉÀ‡áÚ,¢ßøÆ8֛¾ÑäI¶»ž¦ûûö댍d©ønN}ÿöžo5éñv)àÒÚ¸2E.¼íIEWÚ­<Ä5½11ъ¤’Å‹8BðÊ×ۍºÇn¾›_šGä+õ·ñÝüE§»l¥H}úAr¹ï¬Çې{»Z·–{¼Ìo۔ µoûKEZž.oå·-›éx G²$õ +hˬ ³~‰ÈzI#ºñf ä£2<¨?Y@£=~GÁU(öi+…òvcÞI7N&ÄøÂý…P^©Ü§,ˆÆÆì…€4ãÍMp®4ÞJäz÷n¦o«hoûí‘q$5Þ@+¬áo¸??)o¥Ç·¸ñ&ÖjšŽÄo—¤ÿ¤Î0£ày» ŠÀ#ÁñV€n¼iØx»ˆ0 +¥Ò#Y"’ÂJ9à0h¼iðH†t­é‘XÍxóÞBƽÏÎ#9Pãí]VX”ã¶ï^‡ÓÂ#q×&Š¬q÷fîÛÆø¿1Ö{ý·1z$·ûûgYÏúûz«Æ›tÖY«Åå‘øú™éۅð¤ìÆÛÎòÔo7ãxþz$ DY†6Þ´ÔÖogsz÷w~ãmØ¿]…@¹ô_o¾îHîŒt¶áxóå‘\éx{gͤÔq(ú¾IqW‚I97É¥S!¨ù„¦·+ø„NÊZ˜ãÄ@%‘<'eôVþ_-èNÊUÅb½æPqºïònRÐÖ áÙy,î3<< {“Rꖫ%Q¼k¹Ðs7)ëuڂŠT-‚ÍM +9¦çybW>stream +2‘i„*; ¥‡Š3ÅÁ¡f~\-ÑÐǕ#³8wò¤Ù#Jh’(Ó$g„Æ،'IãD†È‰áT49Uã…âCM E%'¤ì܈µ åÝa¾ynbóNwb&íô8џS9c2›ùM…#" +Hª€&l¤X„”…úó’ïvÚÇÂ@]¸¬p‹£ʤ%ÐÃ~v šý–Aâæ̹Q7(Ïî¤>Ró²9”wâò`f²HÚ [<Á8&êJÏ(ȀgÄ={Žú¸P7ÁŠÙ2"öÐ*¡éÀ.-Ɩ QlUœ#V‘ +_•/ikŽ\GJÁk^Ä:"µðhõ/%VˆóJ陽\k¬k“­6ÖjA‹ñmBrwŠX²nÇäš4rafL¶×œ!Ù畨GVÊ&º+‰öB¤¤Ä%q¼6P]¯²ü÷§b½#ÑÁûJíí¯bó *>ßÕ,ËF‡¦½¨”ú¬ cÃ <‰#Ê2J]€+8 Z8DLNP`NLj Ĥ˜Hj U0'— H8ÒêØ]êú–DzM‰áthò¥\rR, +†3@ÏAO^ƒ hx´´àÓu˜ðX5$‰©vŒëô`c f+J0ÿ—t¡Þ „`ԃpStlÍŒ¯ìA0–ÀD̲¥? jhOL[ /)KPczí¥¼ú“¿ìJïrÓ¤ QÁêУcՐsçåžÍö°Qƒ&ý0{aêàN†#øŽ(+40³>¨I530Ã>§îXàj:d`ʀ´Îoº¾5€=.0]¢¢à˜ãÙ˜€âΨüê„Ln†‹ÅCæ„vž±³ÛFaà 숂8 +ÿ¿—ñ”䆞¸þ_©{09¸B!ÎCá\Š«^qmk Ð "ÑÊ#0~µmm`¬çÝظǔ2´GvúrGá0º3Z,}–ÕBë†dOñ]X”ýÁ)!SîžúOOÎÚÝvfDÀ„¤½o™£ }0Œu¥s¹°ÑœL’å5˜­ü•ëeÆô)ïØ/·2”6¡-cLíÏîƒÓ´)€EïØGi \r‚8´Å‚Z0Š™qˆ#³^ÂP)Ö¶$/'Ô¼ÀՓ§)ò,¤VaÈЌœü…`Ûæ/fÿâZ,'ê¨ÉrD0;Å ò§öˆøP@¿h‘ð/wÍÆÞw-q ÿ¹¼I¿Yå,ÍL£¨´æ¥ +öËQ"€üĜœ•Þ^H±ÑŠ°ó’|Ñ-t# +Ñî µhþR<¤¶ôƒÀ_êKŒêûed`ׁHíðß:‘ÕýâöP³H|ã~ñØt©¬Àlû¥“FhµgvP#B´_ºŽa~v!æNmZ¤vxõ(ÊÆi€‘Ï 9¸ìåW Ý[ô Á…>èJØÖÜ#(@¿ìª*Fy~aèïYAõ¢ +ɗ9y±‹Ñ8¿´û¸Vö´GÊ/[$b,„ïBŒÔšÕ‰/ö_è²äoîàc,\äø%Ž{8o=?ÂqY`ò»Ò<»LÅg‡êoÃvŽ€ƒ(¢h"(Æ*2ˆ®\“éCÆëKÆ̶F®¾œƒEí¾ü‰4[V`é4™•ü2µì Ž{྄א=0Ü +èÔåí='b;}™YÜz¶/÷Ä"“K–B¤DûÂ:1³/IÓaÃP(„d_T½šQ“ËÂÑ9r÷¦/­3ñ_]JÚ(<¤›wdS†|ù|!o£ 'ø c©ü¨¢PxÓ"EGÚ1·ùbçÃ0?ėSäã'HдÏÕK¨“Œ|Ùà²Â ó‘«{Tøž¦àëXŜLñ :Hã Ô¡ÛÖK7VÂ*¤¸_¦Å¦[?Ef„²ð ˽LˆS_ÀÏe®Çݸ—ÅRÕ| !#3J¿¼lԟì‰{æ4&óÒŽó°¾½„¥g²ú\Pw/»º/‰¿y¶(Hö«ó&;jî]6÷Fêq¿P䱀º¹‡·—}€àéÆu=ØØ=CÐ^ŽU7eø"°‡9ËüiF0{ÙùõFÔТ<6’id/å»'¿«ˆæÊf¼ˆ½ìî FóêB> Ù-cÍ/›³PԎ ÙÓ$¥Ԅ6ÊKï ,'©ÅHÂk½†4zû»é^62RÎ!Â‚Õ ‘í—!Ky4dɌH —IIDþ¼œ^àÔ«QšÝçÚI†Yç%M¬$1xí™}Üê1±9^ÃyzÃÒÔaô¥ëÚ4š}éÝôn ¯Èؼ šŽEèE7XxwçäÊ2prpìÖÍ¡*ã”È©eÙb¾]ÁNò_ÈÄw!K̀L[oGºfÉnʏè|É*DÐoäâƒc:"Šð|®OùCÖ\¤D²®ä:B-ʍôÛt€ƒšÊøP'ñ§B^èûÇJ½¢ìØxGJL]»×ÐjañGvøªZµK†ÏÁX§6±—CŒØk¬lKjðxkî%Øö÷ÎYŽ_rø y.n£ Î?w¾¯ ¨¿Ž±¯±…éb2_Í+6QH¯F¨Ãp#¡G´MÇ” ¬·X oz-õk±\90Â2ô ÎWÍéè9­Š×8 Þe†ÕÂ'üƒ×¢ƒƒ!"p›»9ÇÚ6cóQ¾!80¸AÒ¥ð-™4à¥Û‰CóäVw¥+œw³+„/¢Y±å$~k’Ä›}ÔԄÁ:¨^O•Xã‘ìuÞAH1'`$¿à-k’3ZP–GÏC3õ n¼ÿ £F‰MCL!_Ôă¹Â|+—Â!—›þŠ¢´ï¡¥“^ŸÒé\Ì灭$ +ÔØ) ÂÀ±J¢Ò4UÀ¾ä„Äð®œQçÕQ«œ4$ ó_ÚÂý'(DÔþ´àE šMåiG˜‚± 7.°˜‰u $ëe¹Ç²¬`x†{ü|9Ôr)€܄Pi¨–K<ßO¥Çq† ߣâMë½pr=J$Cvﱃ;:À±,Üm>&ÝeñŸR¾ÇwRu âE“„ŧ±-†8öS} tá¶û,­‰Ú 3ÝíÑ6£}ÊÁ35éÆâ#øõ( $ÂԚû µÐ 3 MÖᣥÓ)n¹ÃÁφ¶«ø¡Jõ¾ÇoDaÝhÛ1Àf¥¢\þJ-Å0%ÚÀFi Ý*ïÜ[ÒQ,“±ªÜ¾FÊK;¾Û‚…zI:ôt9>nåkl?† ™Œ„šaàÂÌd>?áŒ_c»a&v@Ø5.Ë®#øÆ/ŠÂ¿¡Öàz˜‘„‹[A?úé +ì¡¿q;PcP9JuO=-žØxT¡f«ÿÀaÙLu# X w^p7Ø6 =‘Â6!›1;M¶dnL¡fåÆîÊÍ|A°æÑí¿¿{½ÙÎÔÔDtèK®eƒ}ñBPm“žëDƒÝ‡(wÕ 8 õ*¼rԟƒ¦ë›ÑÏüäz‚“"hä”~Ùª·kÓiêHÃG"dR1µ­BkêG ¦%Ӑßur½õ‹€ÌiÔ?œ¯ñëgýddª ŠýpaY.R&Y®™Exý^øFû!Äü}<_‰óZ¢ÜƀàúÑìêAöéÄ&ˆç ďêß}Ó;ôçc·@áj@ØóÄÏ>#¬k^ïp@ Ô²)b˜æ*p'Ã=!4“ž>}ÑÒ󵚀§>‚÷¾Y€ÐÒIÞAºwM ¶’j¸D° “Š‘^w˜ømËòÚ öÀ¬9¥úÏe„ßçÙY(kcrÄo܎ô߄’戸á +` "Q{QdX2$H^Kû8àÚDý¯«&C…eW$è-ñö+È Xþƒó°(£a±Åæ“í‚\ö"RðÑc…$~Ù§ïêéèÉxm¤.›M"#:«R¯{‚¨JÇèQ2{B‚u¿}—¯Žü¯r9Ä/Ó4…·Ç^ü¤ŸÁÔ +P#ˆ‚ð !x•CåP&üѲO *ß4‚¡G:-ò„-Îã‡t7_4EóöcûçkêøRš~ðö¹îË¥Ã./–˜£19ŸÔfâýÜ(¸\ ÓµI‰í˜xˆÜd¢­_;ý®ºMì\ žÓ^•ÉBç/ìÆ Äµ7è]hÔ¡È<[È¡®7ß9(9ß ®õŒQ)F³SЪÅ1勩)"½C‘œ C>k%4Ç_2)ÁÏȾÝ)7me’?1è8¨6ÃPy¬š“Бðn=Ȋ“É>¸ÍÈÔ3òˆ«ìñễÍõµâ ›ªL,§3rƒýé.ú +Ó*>V0]3K´³q½fÚÇ¥H³7CŒ,Œ°üÝî$N¤¡ö ÒÖ³ + è(%̆e< ü Ð`_Ò5Ls&“—SÑÜN€àç•„®öï*+«)ùd Ós±Ohê +}$vMj +C:ú²TcpÕ%)¨…æ<ҮҞÁ݉áÇ}㖁@±$aÎ; +êŒæÉœháQsE Ç@’™øαåLÚM2âh]¡³ŒÌ²aåIKZ5ª4¨‡°7Ä°Ð~Í%Ðöž:™ŒÑX©\)¥¹ÒÌ–-rÏé‰4º VßF˜íz@s0¹iµMAÉsB2‚>®¹c䔿Šœ šÓ †‡Ð€=Ë~ç´±ýÁb¹Ò'FDÛYÐs¥ç)>Á1ôbVŠåà M˜}Cõ7§ÞFŒ‹)χl7`„<±… +›´¶**Ñ÷»2ÅS¸a3ÄØ +uF»º:DõTh~$MZñ„³aI’ ’°-sàø…›œZàÉÞÑ9VöìC äSÏ®J O”)R½ võ¸Ð±Ò {l·&õ2Ói1Ö =ã_«À>mêN$‹{6Œ( ’Ê&°ÿÁ’Îï µˆ¢F!ÆiæÕE²Ÿ±pã"^T. 0Ø8eÍ_¿Ëm`r¥d,ÁŸºîŧ¥@T‰d¹"åe¿ØØðôb ƒŸ4®à¸ÎJk¦*Ò!#pìÐь0Rtº‹Jd¼™Æ+ IQCŽÙ/H'0_ÑÎÛB­Z'è”5}Ž~¯üxÕz²»žCˆG&< öщ ‚çߘ QÀÐ6;¥@šÓ/€špü¡œãxD?ÆèîÅ)3©Èj½ä4Õ¯Ãê¡eæ/¤•+\Ÿt³‚–±¡¡{þ•C·ù7S]øüyO¶âï-@ °ÝÕÃ[s?€t:V„VÊx)²DG’Z•}Ø|NVÝë€û8㨎üÜÞb‹}Îð&ØDQǘ 9®ˆÏZ""ìõáìïnLs†Š‚¥]­æagÞv£9uîÇ:¦t­/¼ T嚑˜½UáÇŒ…âñðð£lóPs1¯W“hÛ䡤]‡Çͺ9áÞ$=æX7ÓðZ’,®›Z»J„+úړIEãFÝó©ÜÈd-øH €Ïs5`="öº²í [Ä ×¹C‹à•gh´@b`-ôZ®BýÒÿq9âGÏHÎw¯ æ$ÅWîZ`¸åª%¢ó%Ó¥]T-;-é¿Àê vÙÜ(/z!q`–D\g5©Æä ܳ-}òYÇ•1Â÷Y'ºBV‘‡(™“øL%`K!+†99šŒep‘Ât/ÎҊ,íÅy’-D(”QKÔ6Q dŸáJª<ߓ}±ÁÕ"̉òÒRu/lof*iŽÖS ê¬lUšw4¼#vˆñÈ.´À$"Ûö><÷n9øw HAû« ¬±hwæE!~Ô¨DCëSÇb]Á ¸Ä,æ+B£j~¦©ÉØõÄsàǕ·‚¼8X†BͬFéL[ÑnGÅVÔo#!ín(âê Xmú©D7açÕ®j”4uÏW±>{àõá%Gނv)Â̧Æhc…f¢¶Ãgïìzø%1PcË`û;Ë3®0PÄÎÅþlÓ¥_¤²#ã )‡‹pŏÉÁ¼€’6ä³*$ž@6>˜eÕ«T‘ @"0V`uXDo¢GfŸ¸ëñ=ìGŒ"PÇâ£Ë½•ß/òŽeÙ~ðÁž,ˆÍ¾:eM®¯˜ô¢r&÷>fK•ü&Ầ¼/µj ®Jð•^5=·÷<ÕÊ_åÅ¢OMYõ¯d²¾0h¹AÈ!]®/v_Tà“Ã.…¤#,‹òý—%’d·sÁ&<¡Ì‚#!®ß<å†s";’$l« Ö/ÂWT¦…Ä2éÄiÊ«±:ñŒN?œ4A˜uÝpíʼn¼'p¥ÆI œuM I[«¼,èÇY˜6¤î³¤#Ü'Bh§LÀ×õO„D%fÅ&Pˆø‰þ-•ÚÈv€Sq€øu!ø!Ç ¹›2N¸W'_|ê(ª=V wˆCõÀI|›€ËÔ%ÏÑ=濚ùÿ +ς^èøÕ ¤ÎÇÎì6E\ÅÒm©¤ +É!„­â€J°L‡¾svˆw!­íüÁÞqôý[øå€ÎWÕKÌ{yî4{TðoW‰ù)vŠ€P?”€Ø€b6±Wæ²é2£ &¤Ü@֗Åtڂ†4ÛIØk‚ ½WõU0ȐÄÙ5Dδ“¸’×]×Q*<¥þI•–^<¸]ŒkÐÀ4|9–ÀµO¡Qÿd@~}QØfpÅMˆ ǹx%W€ ½”—fŒB»‚\àû÷Ðc±‡7š¯‡ºÐI$aÂz*‚ûÌ¿—÷·%YŸFì9]’>Aop°E>i>n¡e‚H`ÁO8qТ°z2 +?€û‚Úøáêró%ª8åͧ¿ÅÚ;§UؖF°zã--ÄæÛTv¬ˆ§Wöùƒ§‘âÏ¥,:TÏÈ\¦Eþlý%ÈÚ‘Ã~±U|°÷ʝa¢? 0<äÊ +¬‚û½¥C#µÁ] wÜ"sÐ?â&yIë"ãçgþ›®!L™O&ÎéZ¿ZZ¬?¨—ÝÎ@•$âV–3È 0¶Í#ᑃ{Í?ƘrxÑñØŽ¬ 1Kvòúš–2Ìo26ƌ¬rZ3ñdlplž<ï$ „×Dþ–a6EN[¼h8Õåt +¸V²³©_~x[!Ái¤BӀ,ã”Q£!x*1)L$¨gŠ¯~…þ  NžˆPL$ ‹½¸) fú‹ôª:”i†…H—j–à/ô ¹Áôʽ2!üT}ԐkÀk¤$Ÿ’37ôGŠ[Þ¤ i$ÁÎ*©•ëô€}®F´§%ڋÁ Έ|[TyÆWõ‡ÜOÍ&A¢2D_âê ¥eé?raón­7#ÕÿQbTÝUûq Bt6úØê8Q8œ:ædZ;Q¦ù1õ½’ÂÆYÁE{¯j\ƒ©KÏÃ_0þïPKÑJ1¡_Åw5ûc_;ôXØ¿Å>V҃5»ˆlà0²þKAøDb°ÚÑ+Ü΂ÿÂG·ÌnB3)¢"À8ÎÜKŒ a4 Ñþ¶¤·@?É¿5 ÈÒR.õàY /âå@„ UÙï9Šd^Ãà 8¹ zÔ:ðÐå×Ùbþd+ûRč)ÞÀe¶ Š–ï€~ø °ï±}”(€*ãñ1ÖðÜ~!aèÛb”"¬¯Ó’›=¬yh¤e & +`­cîÿх*5£ù;ã¡òFà*ö0ûW¼i*1Y¨ bxó¾ý–Ï…©D€ºŸ­C/rÁ )•©9Eº|°yy,žjk‡·1¦5¥¦DŒ³¬#ŒOù¨`PMêUbË ƒàD¿¾ƒd‘‘$2ù¶jŠØÃÀ£.í©Ï v–3f0ØW8^ÀÛ#¤ú)+àÊEà òQnX˜¡wÊMêM´79Md‹¾g…7$Â=!î¤Q ãÆÉíºÿiAȐí.ήhØãœbæ +WK2"wKV9ìÍR€o »ˆ9[ZÃeU4ƒ\8`ß >¸`‰KÉÿÅ/ !â,[…?šÙÿ‚b[=(Ïh 'ºñQI² “°]›<èÜëõPLâ63#G6 à,‡ˆd†ê±˜%4?ö±f(¨¨ª±¨‡¨düÞ.‹éóILà-Ñ#$wÏÐb¿Ú~¿·²`aë£ÅÇþ¥VÄ^"Ârey5s:"*IœÔ«~z‰‹¥ÿ¦æû(gFÄI(¾RԒÅXà(};dRš¡ÎB—Öf0`©l=Óe}¬v4É¥°‹uÇá6ÛáµÏ+¾7È kZö0!9°?ùÞ×*­=ùœÓ’Sф9ç}Bk6U*Õ9ªÌé¡d +¤ÊlÉbžÛ¡©ïI|}û3 M‘–c  áؖ÷FI5´Æ‰º¹?^G¡âWvóp ‰ÑAÄû1;¢õj\ÌÈNÒ¶ÖÏqîùƒ‚à¼^†"ðàÀ0ØèQ‘?oâ~k萇»ůº1( ÌIœE„¬K£t§ev£˜ïÜyO£ÖļE‰¶XÀ±G ç@=A_Š¯ûLKt6ëJ•±æJÇA5ñPDçô.^‹1º»¬´—w«;LïG[ý[n¤2&NÀêØ1‹^?ð,i¦µ³fàLòDÞ꨸Ԅr|øÑöHußIBÁù}!¡°©»èá+#L‡QZwòT1%©oýñB^F +†PuìbځÀjžuj“Q¸ˆüF»`zښkÅb° ´#)öH°5BŒG G6òšÐ))©4©q{Aß,ÿ+¤s‡!"¨½ s¼t¾G³_£À(í&ÄB<)Ò"^ØÝÎ@Thè ­£€ Ëѧvê®9· +~CYÁÐU†Ú l¹šüH+Ú%ª‘ƒ®¨Ú™ÁÙ!¼€Çª‰ÅHŠ3­ŒôÐÀAsQ՝x9£øÁ×¢7Õb¾ò®'ZÌP®_…¶©gí)ÒILYäš;M‰™‚ÓšB¦ŠŽ¿wK=k4Ïž "F aÈ_EpÑD9Î_þQzo†ïî§ØgõæNvè,ª(¹ÆI&±úݘ);3öˆPêé 9 Ix4ì;c}˜`6€@…ë‡m,+ÐRd7G£è­e\‹g$ “OjÑS²é ËxÀ ÙCòˆÑÓ«ûRÐ-î¯ ¯‹$N@!¿¢úÂú»¹ØQm_kKU.9ÜðEB†â‘ºâ£3ä\b,”UQ(«–ÕJ r’ÝåȌXë[8’0ôXå¹lÝÊ÷ŕí15ÛXuš¨»CæL‘"7Ç,)$û”DÌr¤à‰=ó$$Âûþú’nÊ;ŠV` +Þ£0ïy¿5b¸4ÐÒìO(å¨R)‚¦ 1E1)RÞÊ@ aæQ`ñnveëµÎyÁ›–Ç“$„^^hf°ŒÀ^€ªºO²!Àò÷܅‘yô£bå{æêŽì<º€å/V1|kî«HoTR¢%7¤„3x éîF†¶c£Ö@œÔTÎWˆiç“úKŸ…jÀëægݔy¡ŒÆ.ŒŽl9$8BÞL¿‹b* î¤åoÿ,فþ馚˜w¨’14>Pw$ c{ú«– ‹½S¥Uy”âÀ„ñ¸»#Û$–ý¬`(À@ƒY(H**y×_Ì´mTW· np¢/ÙÅ6s7P .ÝbmÁ02Y:n 7ÿ ª;£Ó‡êÐ(¼ò¸¸þ­³t&Òè·-Æh¿8ÔÆ-Ûs1Z‘¢´€s¸”¡ùAå›\øQ?r⯠¨doáBð(õEåÛϲ¬ðá.WéJ“ÛÅ耥$ŸK¢U˜€ŠÃñ˜@\ˆfSe(~†¨PxДƒL]E·rnJZ:qŒ18Ùٛ|9p¤£4d{gÝçñ‡à. ˆð8Ff +(C–ì‰ú}µÀÒGÙË,1nÔGSÍÑ ˆ·!Ø;°È‚HZ·‹b¥Úâ‚3ö“7©k^a[‡úƒaa„I/ã¤Ê´¦¨kYž)W:/–}ºò²¿@mC=™ju×°åºðt¬à=G3¸|¬à­L?•*‘TÓÓ^ÜŒXÄQE+åY‘å N«Ì®HGŒÎèÒF-Ÿ§J¿Òò¬Lr^/0Æëm+ƒŒ/Ü~(çYÉ*„ÒY¹½4V„yìvÕ-’ðò¬$@„R2$ Æ†4Ï +³”¯¯Rñ{0§XÚÿ¸•ETiežñºYŧí3M­ £??l·?Z‘¾²@NÁ&‡ouüàª÷COB’›î ^⹸u²ÙR‰Q`â6‚nw­2cؔ·BF•^ÍmˆqOQ°g-ñ¬œ(eÍÕî¬ †¼ ›ÖrhÀ%-ɹ§!ÇVo`ñ@q)ìµXJ“vãÁÀUH€Ügos˛0ä^SȊ4þ¹¾†”¤/˜fÖ¦aß<’=iOÛ¤"¨BDîæE6ÜÏr,~‹üúªL{´³#<<£ƒ ™A,/žNu’̸äñct°(|\ã“ÄÍàvã‡TÌÅ 4½+x¨š„E#{kâE/ +`+—ª,9~ìׄmš^Ë4ÿ6c÷›÷ììòNý霐)}£Mi0õùÅԁ„d4ÿÔ÷éÈéX¹Ÿ/ kýu,©ÉJfIçý”Â=õ>5£Ó ·ÜB=’/bínSF°·?ç ;„½R{xH AØ/¤J{ ffè/bÉ 14ÀaËKs"01/–KôMShTU$a;ŒÔtPÑRÈN‡5î">Xg°øwu]ÃÕϤ@[ȀÑÎwas9 U¨¿"'fª»p‚¯$襱ù¯ü3úZEé½kɍ-֜´l*öl¢i>îE÷å6§Tö“ +ÀœJ6ê6ä1éBÀ˜)½ëÁÿhÊgþ´yà¶EbÝەòàNk–¾ú–N;âQ+]FÝ+ƒÜ>…H°a€*8B…ñZ …§¢J”1sÏcÈC»9åŒùïsÎiwdï$’:[ôm1¹·½9xfcØÞÒ&Û®ôēh?¢hڗ[Á²Á.çÛ ú¡lHäÎmi$¿æ$&Cã»ï˜Še²¸ôæ „íÌSžûiœL‘Ûî%‰J5àUªà’k>>§"“TRDUh}NÁ •sþ¶ìQ<"Ru ò]Žm­¹Uøª)q!¥É¿­ƒø²‡.3Œ\ûé[(áæ…UÓ7£ +ÙLM2ê.½ÃI|+c%óÏÄ þåØ\ÿX™µf1/ïåB^f-~fzH6â!X,ôŠ>Ä©í‹(#óñ֘0‹†çl ÎM“©±axœË¥ÈƒŽUɽVÄXûhp˜4YZ牨ۯj_aÉ'ɀT=£Æd¡•»>cƒ%ž)ͽœ¾Ì éƒÁOœ±Át;dQÇÕs¸jùÁD1ŠF…£Ï’ß·lV:VPc!¬Izßlc·v~ 1c¥Að¢Ðbg«øÆ.{O””ÄCXÍ¥Á t€nYð©,°9ˆÚû€Úrņ˜O…rAøû—Ú"-I!0Ë F&ð4[®­”†î_L(ˆµÇ]3Â7žÂ×ó¹uYÔÜä·ÿ+lzbò9 žØñ<“–,8AZ¢KqEp  gÖvô´ô^–¸'¿ÒØ0†Lüs£èÀ¢&°C¦g''& Fx­ 쪜±ÓdiË4 “ ´Ag…ªVP¥Ú¦'wa¢–^ªDˌ´ç• Ê ±`‰Ì° `À+bs¼ Ç#1‰¤P!1+Ó!/Èe-4‚!œ¤Ch@kì¥dg%‡Ë҈s³¬ñ¿{¡Lêm‡ìº=*|»wJ?‡wþ‚ZÀ…å…X(×qǪýé̾ÞÎÛ/ԑ5/î…O`} +‰·8г`Káv֏°!¡Å‹!$¡_øˆ¤ ¹if¤l‰ÓkYp\õ|Wê­é ¾ÁFèxÜPLøÚá¶8!MŽ€ñ1ˊuìٕô67Å*ߍr!1ÇoŠ8êüæ<¿_Ýì®ðLXÓ4³¡¬ipüQ(*½„AHb†æsÈQ¯ü—\!#îæç;páÆÜ·Ò#bµ!½Ø2«šUöXœ/ Î çûfç(Þ¸mÖ<°Ôû¢M³r“¸9ò°¿¸µ~>_Žöà­0& š.Kª'¡®¨Í6ÂqS‡@e¯nR1t†vRôT^ïՀéï¾K²Ÿ)ºÉÃF.ÈpYñw£ ¬@þH:û#ê}zò~õÍqM®ì2JQtŒ¬S½ÙÈ=tV +SâÜòõY'¢³TÐJò õ'#C§Šf¿\fpm«ù”‡î\å@ê…l"ÙlùAªað‚$9¤;³É0˜$ÉXaGÀF×¹]ºÊÚb }‚Ì6]W1‚MiRÉ?Hõ)V4(oä"âpxçGíT"ëyw`på¸\2àL4Àý +h"‰a–`ò™tQ‡´!Öf½R8¥Ëhx\ áw[[ù_¸~ËfÙ¦ò‹zù–FQ'™G‡Ë|÷ Þõ8°é-=„ƒÁgþRoåÐö=ABXAt¨+§æMÝ䭈7;fb i¹â*Zaè½Cθ÷ø 4ý€-ƒñ¢H†oæˆë荋äVïÚýs Œ.…®4,E’ý²N¿‚Lgÿ1Ë7]%¨ ‚ØA°K…*p¢  @೯ +ÐO¸wéO}!´œã‘ºt" .Då`ú:јé„N.yŒ¯zQ@ZE­Ž>#Õw ²9çJz‚Â|ÚÏԃ|½2@´„ľ:"äXýnaŠß1#¼äIFS…JÂó¤CnÁÍi;œ“@¬ftycÒ[ʁ% ÕDwnáFK ,pEšO”( ‡Bъ«†JH.Ÿ£êhø[œŸ6þi¢÷aê×·`º÷ñ¹½`]ÑRßS¶ÀÔ†ªƒ5Šgß=¾å¶«¥=¸ÿ]ÍQ&cVg_>*F×b±ò_œ63ø‡¼ Që@Lyœ5- Q>¨1Ŝ®œç¤;aÿÃǀ¦„!ÅÀ@ +‰sE?U6ꬆdGuñ +Yʃ+™Ì‰Äò¡÷W¬%‰ÏÒwåyQŒ”lãðØ©y ®S6¡‘;Í*ÄR¹›Möː©áÍ¾1–¹²h“\Èê‡cÎ"~¦E‰Ûk>}ªr(Q²ººÓfp8",aùK™‡w¬Ï#vbü@B°!úIXûkl㙴ØPÇ[+)ڕän‘Ê°…x/Høøú¨oÄ:øL›´{ƒ"YFô(,hÄýkŒ-q3PIIQDž+ä›úvcõÅ®•úƒH„EÄߊLÄó˜vÅÑö3R*üºéÄA6Ôz»t¿Sð +[ +J£ø”fè×u®­9§¶tà(P œo ƒßKþ;›™Ò€9üèØ;ø %¸RÁ#9M6ԓ+g&»J,'ð™F"ÍixPÉw +w¡ý‘^µs¯7[M”Á—ÖA®v4lhåÑ+#‹ÎÛ ,#¿ 꺰ǎPP©åŽRÑ(läÝQ´'Ë×¥p« y¨mªHV‹Á4,5B#Â6±¨Z`êBLÅ‚X]N\ZÀv¯…“ÖñÝú²ß ~ËeŸ™ š·zð²<VÓBÐ_ Ïa/UDsÀ y¢µÏy!p°Íôˆ#VAŠ™x ë—ïe±{@ŠÆ‰PßHI‚½ ÎêÊúñK¯HaŽJ©Ô>‹0#Ñj]‘s!bõpU+'ÊòîÏȵÁ­hO<á3²?ï½c¢¨k+B,¡ö÷ÎÈp`ûT¥–¢ ¹œ||fÌ!pÑ”7”16R֌VýN܁¨{O¾M9³QxB“&njuð‡_õÂâ„%ùoÁ“¤oΊFƒ²zE)5•F’êÚfý›Æªñaðâ‚Fú[xUÉJ¢ J¹*úns#ߜUô0il(°+ȑ;¯\.„9–_âÆô#ˆ§–h\ì\»OO”^Sf¤°ü¹d°¾tסÅB³4„"(™â;Æ@©Žà‘¦ªÐ-4jJ£ƒ¤Œòћ²Éh¼X5šX÷êƒÅ‹æ]Æ¬Cdʌ20r¬ Ĝ^¼|þb¢M®bÌmÂH•èákâ4ñQÏJ‚„v£¸æüo{ +Žá‹Ã Q,'RÄ• T„,ødÐ\ÎƳŸÐ¤§wTh ±†Vh_¼ND0åé›Ä ²¼ÁÓЀ`¼ã!¡‹ß`QÅЍf¿ªáÜ@\jT³ã¤ˆ!a«µÈСÑÄû 0ÁƶJúAg"îJýþNï`úûHA×01¬|~è´ íÞÁohû¿A½À/R!ä`„ìhè-± ûð'qXÿ؁üVã;”'gáÿџÙÒ}¡žr<>zÏ/–=vàڟœÄ"Oêxø +*p!ì€3R è;‚ Srٓзà ~ŠöSµÙžÞ¢–•T;Ä2õ;äæ+P;6¤Ê§Z?ÎKäÝab$ 5¶”Q +#Ì <€üãL ÷&ͦ`3êSîÀÉæn¥4©ª!T"F!Ub¾‡ Àel[pû®^RüÂ%ғ z+?§9f!šfÞR{¯Íw&r“·¹%˜·WöwTŸôçà¬5~q./[I8ÎbcAÓbé’?nœ!~ בñ7 ӄé‰ÀÒ)ý}"­¿æðˆì‘äßÑfWÅúó^D¢ø +¤·¡š ª[³¹sÒÉüÚ»ÿø6TJY7ýe’NbÄò€áëxC=ª3›†–{!Gk°³¨ŽncH3{pp,UMdå B|ì8ëâs²qÙ(à÷ŠèÙMKò):ÉÆ+}NeatH tKí(“:hrµˆTU{d!êfc^ˆvhç~ëDD›)Ö¥×1X)< þ&魁¤©í¥W¿eÐÜ&%%̂á(F°v²ß`VÙgQÚ²Î» ¹”â6 +‡³C(â<´¸1ྖëÌ7‡üa2÷YžÌnKf¿u’A]†¬ŸO»hÄ»‡­äÕZC’K€åôe© Y·éhåÐ!à +âkÍñ¢fAøˆ¥2«ú[À,Ìå֛Aû«”f°¼F+BMk'/‚t–S7„M@3‰ME,Ž2Ýæ}GŽ¡ÌýŒ°ïyé2¿ +î‡ìß®! +¨ÈH…GöV]öünÃaÆ%ŠÓí‰S£è‚:»L¬×ծʢò«Šj`äqôBŒ„e1à¾ÌÁ+æ ‡‘¾B¾Í/â* ê´&ñ.ö`m˜´8¸X´°i¥¡„MˆÁdß ì‰ÄAIz?«–œªÉu¤~«y4ˆ÷Ɗ!$ë•cª´Ë6—Šã½Í•'v ³ðïÒ}IÉ›ÒÚT:BÀ>‡­¤ÐÅ +Š/u¢:äði=՚/Jâ¾û€É¹\ãTÆ>“/ÒñŠ•©bSúŒo×Ð4œ,+R>/"æU¼ÈmI¡ˆ]`ŒâNØðõ–a. x¹ã"±Ù<ڍ+ÁëÊõ\ý÷2Vk ±`ìßb}"AnqeŽ½§Oû'WÆÜUY‹ÕæxA(ƒ€f¥#¥³Eä%ÃÀ2ó›!җ% FMÅn¼8¹ ÂË×X¹‡«Œ_¤Ù‡„»ð³‰\̤rR>}! /ÚS-Ív}­xo¶ H^‰°xPµ¨PŽ—Ša¾&uù¯'xD{‡Š¼A +)z1ýy¥@"¹—AUv³ÏVõ¤„“>y®?‡[cBäÏÕI([·˜úÌ¢SMÀíù_Súh=@G œÞŒíKLãÎü¥4Ù22ä6ÎZÊgjµ¦»X·g_@¤ËãÿώLÌÆ4ƒ|oXô.æÜhiSÏ2µx0ïr a”zGMBk¡éF§ü:WÞÊí³Hlz"Ϭ_û'gDˆ_ùÑYªÇÁà¼ÖÿA(%2%«Fö™íÆè^Ð3^ª8š·¥õùがC=j)ÝÂ:¬¥é˜c•É4pjÚÆýø/Ë̆,žÜ»5Ç{HåŸçœ¨*É7 ¨Ž4ë€ú‹mÂé¿ü0€ba,gk»ó¦ýô·1öƾ;Up8¸o+É>àxhä칃3x ?C +FP¢rå«À”ŠÖ—ûÖ§Ÿ}Œ€y{Île,­´$õ»è¯¢S[Óp‚!·%{Y«È·¹„ÿ+ À“¶ \yŸÎB2ØD›ŠÜ€êýHå1è;ŒÀ[¯›…mUq¶€`mTœ7Ö¸GUÔç ühš’Ê/büxÓ'ê‰|¢çQ¢T;W#†„')žZƒýJ£BGµXLÞIÕ¾t;£}Áv QUj}àÊðÒº£…©òâ(lQÐ TDÞ­|³Kž+Üìü§Ýºó½Âçx‹*$O* CÃÖDìo´,Ì k¯L-ˆ +åd "N¿cÔè®B§wzœæ¢¡gæïà­ósu|V·`ÿ÷Zyñ¨ÔyWÖâIN´éëô}C’›ü’ð‘=ðÊý•¤!¤ êpƒHC¤ =»¸=@ë‹xbA¹¹Ýbø„ÖQ×Ôãr_FgÂÇm@1Œ¢²¯$çŽÙpèKFåN xùå»·w]‹û÷Cäÿ§›ÂþÍ°®Ða¯«kŒƒV÷£ºW+—¤êŸÜ­àW-{À²HF)-֏¡ØÕ7PTŒ; u~HHðvºá»ÒMÍm¬ìâòqp‰êG¡¿3.¨LÊë åAh'@§û†£¬4ŒF Jž"r. %’½Çä–tpÖ%ŸüLkeý@Õ[vPÌ=*zâìgM;ÇìYIyÐOEoN!@·3áT;ðâP_%‹Õð2œ—xêèl­ú¿?SJ-ëȁçß³CQÉUüiïþ¸ôZVœytKÈI È*yeÉàólàW¹%ª¡ÊpàÁ¸7‡‹ZHñˆ»ü3¦øH +w4eÿäzZ£Ú“ó!WöÿÙÌ͒ÿi‡ÌDè¥%,ÃÒ¿SÞS£¸ €_yýIˆ{2ÃÁ>ð8°"™¾ðœÿK$ƒüOEÏLLüÏáÐã K¾rK{Õü%Ö1õg¶ |Ã* +Li™¢ 'n4¦ñw#X¾Ón_`Å,úûöh Î1‚eç`×Ù Ö+¹Ä2¡Q°B?xD;SŸ`¤´" œ—.þu¹Ôg„ɇȓÿße`¨ +š†Îì[„… ‰à, ² g¡]²•.x©bx'jԎ×FÙ& éêÌ-¡;ߜÎXò–Š•ç@º…å”ý×èÿ‹ö2±îÅÆ +}rWx¶Ä¦or†ò7xg¼ü-Œàè¬ômü± äUέO‡#;1ÜßÌNæâ$˜ñfÕ±ÿ¡d¡lÁ üìšá÷‡‹5p mÈzÿµÏå ¿•&¦Ážß̪¦¥T™¿Ñýd¹°>®üUuĽ#ºO+üxÆÍí oq-”t‚AyÆuqà XPŸ€NyYáÜ«¸”©ÚàAN=‹‰Vu›ß®T3Xv&€Ó¾u·;@hÏVµ{¤ÿÜ.į“!£û ôqZÒ÷:ÿ¶\¿Mh žCÐWÛ͞8¬Ã¶n2•Nú'^,ïoƒD®<¨ð’ÉâÊê!ÉSÐ/#àÌY#6»>B6É®q­oºµ'D“s싎èÀ¦.ʘ^‹kQDðÚ?Û®¬‰'ûxóñÁŒ9¬ƒQL pqž÷ð´2Sé#Zà2D(ŒJ´©‰×AÔµ#ìíg_ßX&ÄÓý‡OÜÅ6a¹VªYr‚e Ì·¾I³¶§CÎޅϋó!Öl<MúÇÊҁŸ¾¤Ú­Ëº ^ #íÆN¢Kvà4J\€cJ~^wdk™$FäQÃÆL¯–d7ÔÃðD‰ݰÖéÃ5ià £ÕÞÕݖSÂß4’ݐJˆBÅoi_†k|›DŽÝ üXQû¥Ç<` Op±¼Ee±÷?§ô¦„ô®Û tãG÷¤âTq[ÓĹ_'ü +còÒ¨s°74uðž‚Iô§¿øܨÝ 2v2x07!@À-ïC“Ž·¯Ecã/TÏ'¶“yû”ļ!$H¯ç&°…G”ãÏÔIÊm$ ܇Ýúex“4°¤ðîÐhÆÌà躺hÅQÿ¡8%V¬75HAUª+ø:â<¢ç’Ñ#…õzx#AJkéîËÚméS'¡‹äYyêÿãNdÕFûíwËÅp¾ÈôÈ#ÝSŽxÒa²'ˆy…<¹¢Ü4h`l»pª³0OžI¦ÄÅñ™·&åQÂNW•:]©Ï´–¥¨[÷R çwƒñjEeùìZ\Ajª±E¦…C²zzßÀôt~ ^@QÆåçµ3©Ì}a½†s Фwr97ÛêÐÖù ×Óyk’~A­®Î¾Ì‰‹Ë€ym`[äK½`ýØ[*wû'S¢T3 Yö*EÏ(‰4 CÉb5à Ûªë-¹L¤Â–qõ†Ç8µ@z° Iç)”d[EÍV|CSrUBJßdN)QÏlmé)¸ôUEƒŒä£}¡kh!7$£¨ã¸v˜=à¨e­´%NEô_#㎠R¢`~‹Ò£ç*þŒÛ<° fˆéÑ#3¤ˆH*¶8€„Þ½'ª¸€[û‡PšVÀ¤MÏ ×x^¤óÇƟÒ¡Îö|]ÍíÐñÒòqÙ`r`+ÈgÍî’%žSkhf>LNº¡¦‹‘‡׀ +C4dⱆyÒis4†ªÃ,rn'2Í»¯†Ñ*z±ç¶þ~©Þ,Gy0ÝønQŠ¼s¼°ì•OŽi6Žå. `2sûšô<™[³8l°b–&MJïbã=³$ Kà®î‘W§Üs‹Û¼å7wߖ@ZƒR<½Ú4|>t-.ÓÁ=]Ágùètv9«†Û(‘9¦Ã°!÷ORGƒ2ú`½b¬Bç¡E>űÖÄ¢ŠKíh°ó.»k~”ßL7éîn²Õ¯ê ââ/öÃoý¸I<ò/¥.¬ÐGw¬ñ#p¹±,-vG?pr_)¦Æj‡‰±•!™„n%¢Š=UB!„1Èg(«·¬Àºí/Ç!hׄ@„ +))ã‹2•t.+ 1'.ÑQ÷Ⴇ :é²C MI”>˜Ð +µ˜V.œ9ˆ4ôÔÿJ&°_uGZ”Ž£–ËÜ6åÉB=ÊÉTÀ°§7RœùÂæeõÅÓÐ÷Fûðc~dþ-ß&êô^{+Ð8-q‚NPðg&•àxMÜè¤Ty@c-ïÞQ`L¥¢PÇËÜ&šìtgOó«¥ÿ󱼞Y•[^\«à%ýžÄrH3G1™€¹‰2£„FVh¥J¬]*ñ:Æñ’Š”0þ­7Z–ôÏÄ +ÚvÎƌA6Èfû,Óµ\æÀ¥‰öͺªéjŒ³Xðû “L̾'·þ¬3Nœðß­9E¤ÁQþhñ,ÃÛÌ$æ—IZfÁBT—¢“¬¿-–5»~U8yITñÝ*o̊²°ÒFð«ò2žu̧†gaªhçyqù$O=ʸ$¤UéJH_ü˜xàLtÒJ‚&å˜î YTс¿¸ßŠ]íOîÆ¼ëݝ²±drDJAeŒÆhç=™&ý 7ÛÆÅßÂSԬnsU +EfXÌ~‰ö? §ùKŽæÈç¬^Õ°ŸÙtz€U„‰ØyÒ 0!RÁëu€–ÒQéE?²=F•gf‘Ùö8êÇyr 0ªÐüB%‰/‰¡Ó ³ ›(_[qK{OxŠ*àŠ«Ü6ILˆxÍ;éWÙ)#R‡Þm¥±`+ oû‚|Òµž´×é`—Ê`BÏåÁ_"!„C8”+á­~Ã#úÿ$ăos¾8sÚK¹P…4âʙ?b›š–sA›@ÿøGýÐXLÃŽá6ý¾ñj­Î(–0Xgà冼ŒV’u$NT7øDT҅Œ;åþÑØr+¡ÑNè5”’r'Ñp7µ:ÆçÊH‹†lxñÃö¦fbÿXš=Ÿë¾íDq1²F™´0ø^Àõ—" O,Ê`[ÒB±ØãúRoéËnçgynô<Ã' +nèÿó¡¹;…AS + oJfi"bµ¾ƒïìnT +*" ÆÇߚ|!áfÚr$ Ϙ‹±É»žJ%;40â~ˆ1Òçfv€;RêÄÛG8Zµ<€Dï @ÂÏ +Sí3T Ì°ß0‰Ð6º"T *LCßÈ,gb¤ÌåÇÐz2C@ðxñß÷^Øã#!IåÝnp»Éïìn¯¨ÎÒ!ñcÊ**ÁÜØï`2‚@‘ ùÈφðÿÑÆ=) /@â›D½ÝÒ½û ÷Ñg–QX×Ìë FÙü_ˆ±ŠB=%ñI¿úŠËQˆf-$ò4ÕâcG"#rDy!Øó†? À4cÒÀ0@àê¶ÍêR°‰4Š‡áÁ]BH¥ëªˆef|“L´í6AÉ°qŠξxWÌS‡Xo ë +¦B=¨µ=i|äÐ7ï´bh€¼÷!‰§‰ZÐ`‚wž5ýGg]ã@eŠD~?Ñjƒ!NÄ~hʶ鎤Ñ:Ç|}íʑ¤Oñß¼·jìËèn–p®ƒî•¿­°Ž°W +‚ï!³3£FOà2oà#) ¬Î¤Y„°DC(ºÃòÂ鿋7÷\’%C6…1X#©{ЍÓAWô1d=shՒùë£é•Ab9$ô®x:9@n“—8[bƒ–>.û͖Ž`¤';;ãQN=¦p*E"?C³ù¬øܲm_<„*¯|ۊãL5»R­³¦ünö¹,ŃëΈ¦mäû+r¿¾ =·4­IÎҋ%œ‹Ò^t¿ë ™qa|znv‰hÔ©CÞð›ã­ª®OñyóEóNÛËBΚhô¥Dò]‡Žab) @àÀ#DXÕVNõ>MAU@b#£÷¾<ï]F…oÄAÑ{õdb! +ÁÀU +Z>5J-£nvvo‚ˆÌêl „¥š¤ÒÐAÝñqJÇ“£3ÇÃÍ«…u»ÌÅ7ØÝfÅ+“pÁ7ºŒŽ´ÿxÁn›t€Úd)ìµg¼ù c‰§Ÿ^ˆiñtáË«•g¨’g%O@H¨  Áászu4•߇‚ ¨æ§°ªyR".rT~kՏ|šÏþöpíݔ®*yÊ…Ëæ¹Q‚@ýF"ï¨ÿ@Ú⊙>pÔb OC!¾ u5‰8Üúo¡CJy?o¨ø)@ÈWA8p,P"‚R‚K‡{ ‚ÜÚøŽˆÍú‹f§-ƑEÒvl“>ËöÒ ‘Ø|jÈð)A(ö–¢"õ +>CéÀöæÔ\@áqðÁ‡6Ó¾° 섁Ó;ºL£ÙðàR ˆå|Ü^¤qáÀK|‡.ÖÃÚ6&½ô‘²dŠ¼bhÕ¹[׆–BbT6fF}/Í@e +ÒäÈy12=Çõ_ªÂ°$ŒB2d›ñÂÜÌ++ÇÿYÓ³ƒ$¢ÈE–ùÌiÛyäâÓ;ù©‡(‡=;ó#ÕÍvðŠé^qz±M™-ºø >ô¢o&»- Ç |å~pOm¡Ûǟ +w«*Ñ X4YU½§G´ ý_ï0Ý`Ëü^aä¿À)™™‘Ið§<‚ýøˆ¡g¦nïÁdÙ"w0â3ŠZ hÐL{.#,-Þó®åð+q÷“‰Qû>ïù{öˆ@?EóW¦Œž•ž{öSL<~Ù';ko¼Çš• ¡ôj{³æ͈ùNV®žöC„ÈJÑïiB²ÆÀÇF©›9N’ò^ž=› Zí‘IÚ4¬x *ÎRšQô×!¼QÀŒ÷]*Õµ±âà~AUåoyöØBϐ‡{‡øC>„/ˆ}¾ ‰÷¬kàYªoGY¥ºÃIÃ灉Nî0Ͳ÷ËÝ`$¤,s‰ä <ªŽH‰(ŠÁ2S{wµÆyÿËS»Ì-iæ!úY›h_ÏAíéÍ¡2YVÿKÛÔÿªg·ôw¦®ýü¬«"rÍ9à¸þ9»,Pïò9ÿšwÿ°®Ì"vÄ®³¤Ž,UdbFõ‚~š‹QßÀÇþî0ÿMàÓ+—QÞÁ5DëÛ]®8>Š™›‡nø­ ŠŸ–„fwQƒ“={k‘—ý‡xÑfi~¶”}†0©¾Ü‘Oja‰§ÁB〒ëûr˜Ë;äUIC™Xœ_¨\z³KÁ†ò¾%H#۟£gÙ΀;¦SÌÐ5§±s'ØÍ +—g¿ÍetzV +|¦ÿƒê6¹§ûƒ?Ë.‡ªØnßI 0€ ÍQGMÌG:[y‡ê°{¥q™Åãg0‡ž›ßâ:¦/§/a­ÖË»Rb} °Åy,NDgj&jµÒ&¿›¼žâïZ¡”'’öP/Ð#&n>?Ō›XÚ¹L—/—'Ý¿hÛù‘?r-ëÕ´ö¿ëwàÿ/»ÙÇ}rº­.}¢A'œRWQ"2É®ü¯¿áwäˆgו]®~Ók}üØè I?z#ɗB?Y Œ_ÐíŸjpÚ¤§8•{–_KXnýúóÚvÏä"{fU䁖‡)u{ Ù7ƒb[ÂaL5s þ¤ *8,ä„H…^騩<ª?‚¨îh+l\9„pO_ºJ®•z#é ° ¨,±œvt!ò®¼Ý’íÅ'FãzP©Ð—›‘ïÁ›âQ€Sƒ.aË +é`1¼`´@þ­9|(ÑÝPѽ­|EáttiÇÑÒ#ÍØÉÀ¥,B¼ÓnRJ&|ðJ)ìŽPÒä +…D0—ˆ¢q‡ZDÂýbÃÃÌ^CèŒ+.’(çpjyÀXÆjYã‰áW<2§±~èDáºNÇÚEP¤¡TÐLJ­ÉŠ>žƛ-A€Úbџ ºÄ©_¨,nYs +è~¸ÜBRа҄ϋoÑ"¯Bõ²$(¥zï“侘Uˆ”±eQeÎ¥by óe¡fâçþ`D¥¬ÈÆC¤À^z|)$ÒہšÙõŒ¤”³ï_ô-^ºŠÄ¶JD³ò%]ùVrŧ§Î| ·ôMá1Ãð$ÖäsÍä ˜ï¿S+6júKk— a˜ðFØlΑ8Jú ϋ¹[pœ@Ää€×<ý×QL*„=¦ÁÉ`Xø¡EYªA˜#:ƒ,ýܳ/ ?É yÇLa¿0L>&ªš×$ò0Hðu9' Yx¶²õýAÃ|˜0§`û®‘3ñäPYPØ_.Ix™ÿZN–z^FÑ ‘åb­7偹RjÈl ‰áù)Ì6ᎃ‚ehê¦ÍÜ°#¿' ®@=0‹š°Ë²m×Á.ïK{Èy™…2R”«¤IïQâEX³Œ³L^éµÆ½ná¨]¸2̊êz#ÚNžªFðì´ÃöQ7Õ½$”2«H°49zºï4=³Pt]ä2ü·M•¤è²âC—fL•ds,Y’¶Csz/®Q ÙWUI¹g»‡ ¨ôMª|W—Æ•2¥ý°‡÷–êS + +ц?§8Á}sî™Ù›8ž±¨;¸jQ,¸B©ÿS³2;Ö¡ÂTׂ # Hş„×ÂçïhzÕýõÆÛ)V·¤ÁÏmÃôlÆuӜLK:'J€‚Ã0m*t’1¸„[š€x7¾ÂÄdSe¶ˆ\8á„ø'—À¿y^RßG4’ße$8V’".$:–) Ø°â!èDæܒsËnµä€$"#¡¾p™¸™ÔMîO‰ñqìQMœ¦±BÅ" P-›¯QáGÜ-¤]ž …t5=ûóGR½¤UvÙêWâµÝú–Ô «Õ;£¥ +ÆsA6•:Þ_IçOáϺ”Fï_Yüví0L¯­æòûM +‡–Oëltvñ)ò 와(煣Âvìn†V”s¨ÔÞƒPˆ@"!yš>\‘йø@ét(GAÃ0!$˜9=j}òÊö9L™õa`IPÑÈúp:µ1V‰õQ9›ƒ¾†.XŸ-© h^^¯>¡ïÁ VÖ<±\}üGE(ä£ÕÙkChÿA–¸TA°2ö™ý²É^8åýôÌ3»ÛÌgóxËMr¤>ó²`Ɩ‡Œú|Æ|ˆ8]cÁ$êsÐòe€F)¡&l<ÂWˆ&ħ:}}>oƒN/z?Y)Ùiqú]>šÿkӇUÙ{ïIV•·Ðc³÷4ƞ:8ù›cé3šÃ¯ø›dI6“>R& TÐg9'åù÷ç/¯Iú¯&ƒ!4ú$NKÐÌ&q} Z ¦y‹EŸ`¼q” ÑG™BĢϽ³åè‰~‡>»gtو{¨ }v7¤ÐçX:9$U1œÍÌ ÎK”*q§ +p6ڑ‘„¨æóT\»•ç±ã’h‰Gçlæ#òˆ¤÷D!wGÛÁƒ˜Ï‹Ë÷æ‘|-²dXw7Azªå3Åɝà}·öŠ%3ӕ* ÙçtÊõõ°Æý&BGÊgnÖó95ÒvŸ² µU™Lyf–c“ÉЃ}+ƒ²vÔ<óàH¬Ê'–¡È,Lùø&‘üñ ±‡‰òñ;±!óbÀo±ä#Mæ±)Hòáo‰xã…Œ<Ðï+èøÍ»0APø—>"Àˆ¦þBá|… B'Æ'pøÈ ,º «Üð4 +ZÇtàïöV­lÊùñeƊíßÃ÷rëi°zÄM9F8aÈøø@“ù9Jù€ñ ¸Ëà'‡C˜È¨ÌjYÔâS’ªÜS@ù‰û-àÞÆ_¾rHPƒ_–¿"® þ^|ùáîˆ: ª+²T‡Ïoôӯ׮Àás\Yõc÷¶áÃ¹î “¬¨.|Dc. ’~ÀÙ4šÔuϸb,ˆ +[‚ÀŒ—@á“uO§ï9»¶ìÀöì%[? ¯AUÝh°k£|Þe>"A ©z¿ð†î¹ø é®©Ÿ¨°òæŸsi…>ÙiĵÜCh`°2Š”{Ü, £ÙÃdÉ=urYÒQ>Ž{Fç˜g;ÍB}gèùUûÂìEX.×~€(,Z`¾:fÐiG‹èRQ{œ=ʵ{F)n{pöi‡alÙ¿o¶=ïñʺù5¯¶‡€‰ßlYÏ;éhO3+5ìë#‡¾ÿí‰KI@¹ö`Ð8eˆ¬iíñj*D§õ]‹8T$3ö»=ôÁICyØjOÕ¯„á;SV³'[rŽ}yŽx•8Ó~1dg_;B2âٟmtáW6-0ÎjÃCófùMça*`D;Ãbë‚×fײ!߶'h—.º~Â>”FÙà +ÛÜè%غæø' +ªØý}=&"ÐØÓ´Pr‡$cìiå #€C-öØõ.pô„‰)öÒy J¢D=DJìÁaô`ÌéŸ)ò (ÓI²G`®;I±·È²ˆ+¬ ç„ ×†6F› «¯ü{–B͵zΪÃã¹+VÚ&ü€€V[FÕ+Ýf*Âë Ò»W=×|ž¦N›èŒ¼<±´tS‚øí•àìò‡²0 ©•¹­ª î°"®…m^LÌUõDüÓé‰Ê9úzbJÓÆ¢ï¼x@L=3ÒÓá£üKó¡yÂî×Ò웋 Ù聽Ðò¥Bp`Í£±ÚçØÔ +ž½äžDO‹ÇŒ—‘ZÒ!r„FÕÐsWæßÿôõtôœQHM<’>O€Fn]Š(ôdŠä0û̀ƒfhÀ¡Ì3¯è ÓÆPAÏ ø #± èi˜†§fùXÇnr…76 9ì߲̘«Âóç…džÅi€¨ D1\9— éäØy˜ºyv–+aèD8vvŸbyIxÚ )=T^’»êl#=ÒV­™)9O،–Gr£yBn#`Ù9¶òD! Ke‹Dày4R"E;äg‡ ¦Íól0ê<¬É,ÒNö¥ó¼óöî(Ž- ¦ìj «¡9çQÖë›#æ<¹áõ™h ü…Äy,ñIÄì, B¦zìS¨Öj‘¹™1¹i"§ Sˆyl¡ŽªèÐ"”ñ% €› +“òxw +H/+«L^æ±½ÌE:W ˜gÍ`ÁOö™_ž‹ Ó MܟìÕËC#Ö1QÛwÀ~ }Kiµ¨=#³„¢DÐ!º‘{Èòø'¿Ü­ƒA'ë;]¤3˜c »_x¼m,ò`„*ˆ _•©üƒ´Æc»mU-GžJÜfÀ*m•<÷Öø—«Hy| ÂįëFy¤Æ]â./Q¾A4ѦPÿ€käå1òVY·>y4íw{ÙQ·ìÈ¥Ó'ßÃýWDVB^ŽžƒJÿ‹'þ=“<ó…$yîéyP??0¤^ñãÁ5AÞïÓ§T €Ÿ‚‘gٗrç$À@äɗd ú6´©E ‘x0+J’„òˆC|N﬐'.Id$-òÄèÔÓ]OB,ã£nV„ùåÚàÁòÀÕ°:ú¡‡x¢ÍQ~¨Süx$ñ‘ÌRIjÇˋà‰⑳§‘T¼ƒuÇÍÿ:£ +r3žhۋ˜ø(;ž·Ó¦Ã‰ŽÇ*̯ÄxnáŽRç¾£FÍX¦ÖKOé “†ŸÐ7æÙÅ#ƒh›ì¶‹Åƒ©“W£âñ¨‘ñTÍЃהâÉ=‰c£xƃÉÐS.Ú4K¡;ßÃàpŽj‹‡Ç®‰i•ϼÀ毽)è]ñDÍø8ï·!׆[8)ž²É¼Æãõ…Š]Ý(ž2†V„Ÿ˜N¡¨Õy¤BÉèõ›ÒqCÚC³üCëÃõ恧…­ žž€x¨õJý;ïE[”Ì}àÑrÁè7Ãì,L>"ΔR‹VI7<#e*~煰-“39©¤ð,9 KM:ôühx|ˆÌk†ÇA'ødòïC†§Èø÷Uj¨ãLÒ!H ¹¹á)åíã—Æ^g•…®&aNÒ+W<{I%èü œð,ä¢Ô€`«„§N©Ãw3‰ÝÇ(혧e×$#=Û;)Ï+ô-i<³[Êïi·xA^Àã>Zߪàá­ VOb„[uÑj%æ S:^l&Õ#ýb öK9ù³>úxžQéS þ&žÆó @ByçFeaÍTÏøýc‘XðóºMytDæ¹à)©-Ÿˆõ¿“HTöùñXsóC-;7M›ÑÂáÃÊ +q|ÖA ±ƒ‚ûÂÅÀa[! +ðïøàÞáõízwD¦3 »‘˜ý³ÓÜUø½$<"öI°lw`7¿S¶…bËËìrIgKSí;¤åT(‘xxp‹’¾¬;xK…Á?Ñi}'óò1²*ê;èð¢ºSÇã +{§±ÍN»vÍHCÅáÒÔ1à—#x˝ˆ|œ¸(„£ÂÔ(´ñaÒ£OÌKâ;Ü !ƒºòD¯ðµœ­Ÿšñ –¬{§ïð A’!AĽƒ³ 5)Û;FÚÁE‡Ü¹(i‚\^ZàH{½³Ñ%¨hÊfzçVÌȲF»ƒY2ÑUKs‡DEïܪr0zÉñº(º¨?:؝–øQíÓÜT[)½\»Ü|lÌ;±8 $S?œ`>´™0ë·`.{“díNZ»Üã ïĵet@ïš~F†vS’#‰ê«Ýäù©³ðXu§µìjm·;&ÀGiyxJŸ°Ôî Úà©å?$<º#x«´‰¯K%—-”Awè]N<)á†×Y ,@çJGçN&Ûuüihîh/ÎûæôrÜÔî”Ëx úAÓÜYû’¯ÏÇÿ»^áO&Ïs‡f0Úâ†"Pûʤrˆ÷¯ãyæQ¿8Rdî i®P5Î(ûªÖÂMÿìZš€*wŒLW ž&wRüs½[DîÄ_)°Ã]TAô¸tbï oq\Öèw*i‚]Œ;ÊؑQw¸æ+E;¡MêáÜ2:è²U´ªÏé¾Ài؞ÑàRpˆÌK2!ŒkZîw*ÚÁ‰‰„óä€Ãv™H÷ĔM┼Bq,,Ô;lwŽn™“ÎÎm©i=&»wÎg`¢n§F%œåFFZûå£ÛË9ÁíÔ6†ô¶CG¦Ž‚¦÷ˆ œ°+¬†Ñ ߦê»ÎËŽñ"7äþè €u¤²× +…á“ße4Öü©1Yp¨1ºG3Ùrd6ÓÙáWÞ#¨²ÄÀð:]Ý ¼£³¬’¬ÄÔH;UŒf³«ñ8Ðê !ªvØØÄè=šÚaŒ¨e¬]¢uA/j§1PZ#žvhbjE™:èk÷fÛü`vx…_½ÙÀxvBd9'ÆIjøhçüD5† ø}§É££ ˏ%& ôl„Ô‡ÿ¢o³àggÛÓíc'üîØAþ"F >;™G‡~îLώ“!Ól/g +DÔ¡~Õxr‰ +ÂÇè%èÊHþ`äÐë5œÏJ/vœÅë{[ku×PlvTÿ†ÇÎÿ˜k€b¦ˆoà°°2Ô_|¸x}¬hPÇÊ3¼TÊC˜1€¼£Í5¿yk٠Ќʯò)JžFÔo@±#T˜RÄî饞¶Â8DvjdöšÜ;ÈèŽ ;óŸ*˜:}I%ŒC<ÇCk9ññhìô@††ñ¡ðZüººÀb'.«Ó{Õcž2ã§ø`O“†•ÄJ tÀ.±S⮃Ïá¯CrÖಇ‹Ãt ;È4)Ô´(‘v â1eâF&f‡-쨤¢°‘­£˜yØѬ‹AÓ&Ø$°ÃºÀE,IxËWÀŽê1Þðñ>¼  ŽàÁ*âq?±ü¤#ºÆù$œ ŠÇºÿ±®Ã7ç8HD&èëXÉq” ˆ^Ñov[è³Ååë”HQaOxÀסêé”vuÜ"l֐’8§hI‡§…Ü'fP})²‘q«åp¾Zù8P*ý›XœšÙ+þÂxë„ô±gìÏz³gl™:$"EÕ÷Yoάºû`Þ-F¹NãHôKø¸„é"ë|H§Ý£‡u¤!›¥‹Y=v…u`&7ªcµ• ·h\€µÎ MçÒTg¥䚼`t/³Bn‡J‰O™`:³­ÃxÚ:Ÿ¸ž©jèKŸÂÖiÈryï9ÂZ'dF¬#d¡Ö: ÖQ?€Ië¤.<è\øŽdÆYÅ¡Ö¦"æ„cu6¼ÂQÊO%4ŽdWGÊÞ_ÕqŠ=£Î9©-Î9ãô‹—ÔS:ÂËFÍhëdJþkd†'jä1(9¨bÔ­\Jñ÷¼w¨uï4:æ‚$õêÌNBé_ß2~*ï1bäQK‰Bk cZ­ÿ(ù¡¶2[¶:áYpñ“ +dtòò+wˉëàˆ ¡:QÜßþyՙ€رv°ÂŠ­VUÖãß_LgXuŽXCqŸT›U 빶̑ªڑ’ JÕqE¨‰/¥ס ՑüÑ9ZÔ©ÕAU²¥ß ª£ú¯5Ke­PÚˈcuœÝ *ÿh ZâøˆÒ42uŒíê„kX Œ\êD°Œ}å\¥N´Ÿülé<“Ýlü¡£ý¹¶Ä7i(ÇŽŸ@ÿ†RÁqrt¢œœøù@XÔI¬Œ©!‘àÀ'|“ïù¤ópQxct$²œ9ïTO:-ڊäúI5kÁkÎ<ýkÔtÈß ¨¶á-&NÁ‹ºc|ü-4©¨ÆG&Ng:ûOÁ2'ÕÛ֛ҢT.ïo‘Z”NW¸LgPð0z(xé%]“"žââÒévÎd‡Ž;ÇaÏAJï&íiEÌ,Ò! +°õ?‘Žåi¹¿ýA:c²,t~“Ø©ízÀ`à¢É£ÃÈ‘ÉsGuæ(îæN­#ñÉôÜÉiZrC:Wå*B:8"H'ïžóâê›7ΝÂälƒ„G'¢«#C‹#™:›Š ´øËT4„ƒ7YШè´Bºì¤Z”Áàü9ãö +\¬[•£“6G?'Î˖q€à|YK@£ƒÍ ‡TΡ[3£3Úÿ‘Ða‰>§1p^a«8C¡óX¶‰!­ÂCi,ä€=櫲¹LƒÐq +'>§ßdÎåþqäd0öiGX,:NN–åÀ7 ‘üy­OÓµýAPtbZùÅKÊ +šÀÑAé•è°}ÿØ£¹€=5´tè\0V#²ÔÞÈx ¡38Þr Oõ?SÌ8²Ðr +¹D:Ü×Øù¤˜&tâT<ø 2a׈!ü9ý+ :8=ïˆüõ5 7~ŠF#8Çp¡µ=é¡@§è^©¢›ÏÉ>+Ãö Й…¹áP«©)2áØÜsä6mãõçÈ,Ü$iƟS"Æ©ù_æKüO=G#ã½òÑk}Îö Ÿc WcíæÐ`æžãۗ-ÞÏzÏé1î9e1e‰îõïëĞ3ˆµêzØ£õ“Ë."n¡–ž“pû¨6.Aü?Çø+Ï`¹zä¤WKDu³þii*‹ó@¯P@…ÎÑé*Çü ûý휞&ÙÚ3ÊÎq¥‚*Ø9’„‡UòèþØæü$•ÏâeŽŠuuÇXçðŸÌE`³[Üö€ +¤ëñqäžmÜÿŠÁæ¸ä'“9Nw7MDwY0À,:ڜPƧ̱ôÇ‘+Îü™¥*¥ØÈcN=7áGð¸ +§PÉyKûÒ¡“‚´FrNíR¤=Ñ*!œ“|QbGÚ³ÍáŽÅjrÖÄÂ#ö\Ÿ>VŠÖœ¼"zs2¬9‚³ÝvÄZŠ›ëk!GÍ9[ k²*ÄÕ栕*Ò)xƒ6'oÅÚ9œEêØ!Ì$s~ :èHðŒlÎø0ÈÈä”{’DN©W<fžm+b­9øl…„&Öº±æ÷I,zf•›9¦9 ®Ejìês86› R•—µœáBNµ¼!Sgêkjïqbáíí„D\iŽñIsì Í©”ìþe@v‘9 ö訬{BsÉÆAM„Ad-òŸ9]&ӊ”i'ž9¸Û’ĹÓ!­å>¥$Õ Hæ`Î} ⇠aɗà!í;™cßÉr讀rà1¾LvjÌ)0ÊÌ]``U™ŸÆ6:ËËOǁŸaiÁƒÂJ¾‚Ô=& ǺJR8A{ÉÑۍþr@À‚_δÊå җÓÏÔK¬³Tk9ܚEЦH/gô¾ƒ›ê™ö7¶ /'¬p÷érXÂ]Ž~½c|ef—Cd™qjQÄ&‘²‘wcn9”Ã9a»;µåèÂl¨Y9RÖrҮ䍓¢'Ù¸qAç ZL@¶àLœ™¢í(V‘Ä) RrŽhL5 ÀÒ+éòJrR½å† ‡êlÆ3ÇIHšÑÔåð`M<5Ƕ6Ëö¿¸sÒ½NøC™ò•£6a‘c hÆy +iª’CÞ»éͺrý†0æm ŠÓ;ßðHÜÄ0cT`¬è†—3zMÓ5ùž®ròg³^Ò:AMν5“儹'ÚMU9ÔϪ S1H치»Rœ’€Ó.ˆ1Õ¦éæ ÍÎSþÎ&T?>Ê)ÙFŒôgj5åì"rÌ" qcʑ³äp_¤ì³óúQ,嘞œþ²+öìXn±¤ÀlÜSÒbAÊà”nœÍP#¶É‘· §Ì ]ô6ŒˆèóÉypÉ©~ö ŽSÉ)ßñVbˆ9¨ØUcÔ¦ >9úH™ î—Of²jÀC9ó"š=된óˎOÂ@€F™¶2½äÌ»¬òXrÐGùYÉ˨_°Œt"õë$ǀ¤ëk‘®"'XsÇjÁVá8Œª]˜Fr†ùL$gÙLõíe\œœàHx$'®hIߨBo—ûZ's =Y“ñð7>'ñYŽÅ•A(9"Jk‘3Þ_È’ãi ®#$ :=÷ ößOç;/†—¨H9…N`ázÆi:XKI…CË ‰%äܟBNpèºä–uó´0ñ ƒüYûó$ž€)ÈÑ8Œ–äÌãÌSÍb ÈQ—3Ã 3ãj¦É?¦:ю³—qtß +Ñ: ¸ø„ëŠ÷«¥æìN]¥Çç½N1#n˜a¼q°‰Øâ9ÈóÖÕãð"ADZ—D„ÅŽÁ!oÎ5½ãdð“€Î(Áu¤³„¥|3Î{ ‹C:1(àƹ 8šq\úø¶¾Òv˜f.©{ÝSxã¢÷qbëp÷Æ „£­šãem9Ç¡þ¸ÖPÛýá!rœ–CõbžÆð`sNÐ8^Æ, = ͬE1üî8˜h¹éƱo7Nkf$ËtIljQV$²qNl çøƒî 2h×8ô¥"▫X+ï7YŸEV³~vc€{n +œ^œS3ÖBjœ–qJ˜øF]ȓ™Æ=³æØKÉmqô&!í†q,H?£2>ïÜ,Ž? êþó Ï¨[q¾Í®'þMï0U¤èáˆqú"øÎD´+U<%àRœy)ŽÔõ¬Qk'£ÅCqX%ò†c -íف`qâ7bä¥päñƒ{Bº‹xe,’œ>ЋI¢ ÄyðÏ<”%ŽÙ•Ð[ê9˜/!¥€âˆ1œM ûÀoØV’úÁ» ­v-𙒺c”†ˆ³[‚DœÙ ‘:%‰Ìæd‰ƒ¥—À‰°´âř³‚yŠv‚‰œ×Ÿ`ހk qhU¼µ5køá`Y˜ÐG5â|¾OõD#a48 åªÛ"ŽÌ ^á¹y‘"ŽÙoó}l¯¿›Ú˜ l¾D­ ¶ ] Læ‚ßÂyp"?Ñ{Ú¢ÙjIKG” +ßi8?‘"N¤« à¤_3Å©¤ '×öyvû’ÃQ´Î•[½–)P¨s¼”+è.Ý1R8®ÿ5 Ž½/ÀN¬ +Ž?á]ߘÅj€pbn8÷sGBs‚£þM“ ‚€²9N[(R…ËWi8Tol’g݆†£ö3Bwyä GYýÔgiÊî’2÷æÛsÄ,ÚûÛ›. +gO)èfRœp„rò¡S_.ÔÎ1o ‡X>¶p xò‡b r¢Zëå +§t¥¬pȂû<”›ªÂQo RUkð°æcÛÁ™”Æ=gïèrpâŒ)I8Ù]{ƒƒÅè×»#'¨ö Ž/r‰”n*Þô18rN¸G¿ÉãoÞ Àq¯Ii#5 lŽB®šÓbVê–|´ '8œ¨R,kkð8éL NðØ¥X.rڃ€Áñç/ôÿmB½àl=[ޛË]álG ׂCpÄ8'Sµ‚C‰áŲ• +éõAW§×6>6+Á±Ê×9åc#8äæðÌà”jóò7-mò‚sT«\z³P¸¹Ñ·zèUvŠeE‘KïèßwjmK s8íd {$™Àá·=?ÕµŽcH8!—ÿ7ÊÖŽ°?ÜsEv4àD#R-œø"Ãf€ÝÜ ¯HÁHŽmL¼7æX/‹}xWñêoR~¤æo㦎þ欝ã'Æǝu±…†üBÊCr J Á‚$P$ËŽŠ|9ê7Xãð¨ôßXÚ³BP}ÞDïï¦Ö÷¦“¯‘KZàØ¿1uzà}HrJøïglëìTŒüMU;9"`"UÂrÏî7‘­Œ¥É™ÞÝÈHšoô?¥_UîªDКý¦*Ê0¶#ætgæ7+ ô¾i)ùMï$þ{·|ßˆèS1 µ›ÁŸÀMøq ր›,?ð§fŊbúH¾ù+x8(DmºÜ¬oîSwþ®*Ü¢ªÏß"0x³"¹Yä&ý…¨¡ièÆCpótx`Cbk+m²g«ÇÏͳ{£±Å_¯ñ¹‘ma"Xô¸ ðÃÿmðÓ­/4*<7q—عA37<´ýçæ4¯ÐeMßō¹@`Yåvñq= 57Ü4Y°º徔Jy>47·› +l,Ci° ²“²Èrö¤!Ëß8ƒ–ËMÌþyk~lµÜHÙÝtQÜ]a¹ÑÜmQG9¹£må&ò2£êl4+éI#)7#²ûì¯F›ë#™4U{I0y˜á˜R)¹1l“–zbZ°ø¡f 0­ÅÊ 7ªƒ=л鼖\Ím‰ —ØlŠ~>èPá¾^ÎÅ ¡Âµ¨³ +“åÆøH§Ò¾7J07ß¹“EÜìæm`n#§9. 6­›SG 7æîKÈICÙ¡ñÕ @ÄzsS[©ñ0ôHnBÎ, †u!à ÔV,Û÷]³O +$¶Ô$R›H㕮¡ÍfmÅ=®°:B²É¤è/]Ë#üŠ‘vy£@ 3wÁÉ· ÑYad&eÑàÛl#}j/•]䔭ðÖ6V’éÊDxß`ö6yRdLƒª·±ûM+gžY%­rˆ!éÿ ýy ¹˜€k”3¥íCö…M–ÀJµŒÚ#}Z”cµGü[›ýúl­m2âzž³¨ÎóƒêA¢W˜D +–±Øi?šÿPäo›ÿ§JcP·Í«Ö™÷Žm†G˜¶Í`Ÿ.ÛFô1™E™9†WÖµ•Í‚Ôµ‰ÛŸ’µ Z¤TÛðÚ,î–Os› µùH-dçP»¶|›å­,î4ª&ÿ´‘,›.­Q¶¼K¶yï0mØS4&íØÚÌER°÷Z›„^àëbÊ,p]^O“‘¶ñ \i![ה¯"bhÙ÷7@Ej²ÀPÊz^ÏÏƎálÞàµa-<¡fç FBؖàâزÁ¯Ú¼:6|{6p“JV@q‘*_Õ"lmH^4'>µ6)z6$»:õÒÑÚÄÚ9h–]kÌÚD56îs6‚/qƒÌVpR£Å~u%¬-ÈèíñtåKÿ‚ÈÓ-­6ŸÓ!ÿ£4²ÏmþÇÍ&é„2®œU«/T Áäc³ï—ËUcE³$äE¬°ck,QâWìòØ5ÎBC¹MßB|æ3›¾éq½š¿A›u@™ÍMƒ5eÔ&^av&Øíjúàׅð¿ ^ϷπU†ø ›Ü(úČ!‚ ž¦MŒ®z) +¦M×7!TËgÁØ(gª+KGø,d!æáDáåPnNA²Š‰8¹&,ÿD‘d%£˜1M¤Ò†e„6 kãÁ“㨠² ÚÌÑq·³njò7"ÀñšÍ'4Ô:ô?;=›‘É!@ƒñôœNfóe²ÅøŠ³±iôx$3§(À¶áP1@.’U^6Z`î[Ôf#jäòS“«ùÚʲ)6–4›Q®”²¢°ñ9³éG4ýû‡øFƒj³àµ›NcnN*'Æt4ÐyÙ8D¯éX — „tòl²¿`ªEv}teÃé‚UÈnP½LT<÷• Ð9S6¾ò¾É …”ÍaEÙ`åRÃ?Œ@Ù 4'öB9Ùdñ3LŒŸƒ>ú˜lºØàÔ|³dC9Ȗ%Ÿ<ÿRâØy]wI,9›¡d³agá¯iðK®©!fêðލŽ Á¯jÝAÒ0¼5¢"¡íð‚Hz®aóñâL÷h±vÃÆÆÆee£Î7!Á’‚P¸ÇǾ +¨ÚØDZà2:›c¿JÍ(l,²n?ÖáQS€´$ö`c ã_zr 6&ïýV D ã\dl¸ǗS¹÷k|Î.Á&d­KÊDÜ×dàÀ&r÷áíÖv_e&0¸56'cõU ÒE7ôá¢Ø|tôo;ТÀlß5ŽH_,ô˜B {‚NƒÈõ“ +sL÷I˜Skð§§ýÜÐ.¿.»&ðìŠ9Չáטè$ù*CVì¾&F‘û%×fõ5dÕÇÞd¯@lµÂ4DÚ|€·Ök\ér"šìn g«nx ÖØøvìÖ5$ì#ÕC³Oýq"K¯­Áþ« =¼ÞwM29Õàç]cj +¢¨AXšBTÚ5Zá1›ÿaôá†]sïèÀ« €cô—d&#QŒ7DQ×DÁ]kH“1éšSäSD×è)16í]£G° NÕüz®Ñdô¼Ö€UÅ;Äà“…zÎ5æ¶\ýËOM89eeôt<_ÛåÉ„<¡³©âK[“ ¼mÁ5wzÀ5hԍÕ[ãqA2¸Fü»5ÓSTk~Hÿ¬È­Aé f‚ŠÕ&lc¨­áOvÞUi|9ÍÖÖÐx1Ùµ<.‹­!ÛÁb‡.lQ «‰Ü#TósÄvˆqJ†FnÊÙä.Ûü6×ëQ¬aZ#ø²¬DS_‹Hk,Àdç\ Zãgoq)иÔÜÎfä—T?Í2 Vc³&èhh‰ù€Ô:ë3§Æv˜5q‡—Ëšq½V²æbç7 yôõX. fmDÖb3í55)‡£4üÇK3é€é4šcA^»-`³X£’/tkºgVƒ#vkR¸xdŠ41ÇÞH)h{Áø–©ZûeNǤ/A¨¦½ýÁœ½šhX£¯Õhê¨*/+s”^Mܤ–W fEÔ£¶ZMtO“|S#äï ç®ÆmeæjžÌ ÿl¾Œ-Š«“³aÄ£ÁŸj~wA•¼pÛX|o5ñ§ž¦u‡dhx¡Œ[I,dâÙ"õÚjj¹j`^ô>šdYìÐHZÍí\èÀCƒ)›ªLÇ@ó/Q'´°ý +myb÷Ó¯Pз¾äÂTSý¤âª‰HWJ5¦dЪ‰&Ænê6©†®`aÓHMHóšÄ5®'STÃvÀl ŒÕ°™<ç‹ÇBTc:yő#ïÞѨq evfÊ\Ð +ƒ¡€-•íÊ;”šeÅÌ8Ði^:1É/þ“Ž¹/€0NæG1)†jì™üNÝѱÍÓ$Q• š‹ÞûôÒ<ñiˆãju~ØáÔ ¾ùM£=kW4Ök<‘¦&²˜šrÔU3Ã?Ÿ:÷3f}ÙA·RC2ºŽ³J‚x”šcQÓ/Y!HIMüµ¯éȨSÔ$R.á.éF$Q3Xn ©9õ!ª.L ܊œ#7 FšMY”bjóz]ÔPc“:i8Ô@\V‰X ­µk¡N®65^Mðü+úTMÙ9Ô´¾j‰T·^¿»YðT[–¸a]>a¨¹½õ¹~ +5!=’O£ÖjkhLSë°dæN¥¾Ã\†^ù…cÑûÏã,#~‚Nώ•æHâÇʖ_Hiìhã½ûT•«5IS:~ê£üó˓†òéù3(O4lb4ùË#;œ4ôÚîpZsmÒXz:ž¿|v^V_|þ Î »5@ÏxÂõ¿të—{/ðkÛ_%ͬ&ÀÂ? ‹ÇE¥9ì&Jš`ÛK>^˜¤a>#£4‰"§íD<Ƭá? }™¡ù½h2 ^”‰¡io,υ&}©Ñü(LZhª"•b¡‰jhi÷·šð·p}ð òmf>¢uH_‹0Pý_å3afŒÐ kL„ùnLaðþhPh~2X$¸è7…ÐÌh>©JéùÈH> 4á(æ|Ì  +¨€h0@Ð'p±6nT”íß@nƒFK%ÑØÈ0ýhˆ¥b½Ah³Ѥ¾rƒÕ8C®¤ ¡oOFÁsŒ_ÌÃdÄ0#g„’2PÁ„BçL=ê©—†|‘°ƒU‰‡ Ðt +ÈÎ͝´P0¸Íg.$¨èк–Ex ÙNo>T‘ÿ^©ÀW–Ýbs¸P5®Lªh«”À ž—™n¾ÃÀŒÅ݂žj¦ÿ™ÿæ?{7\ ÿ=Û­pu½OXuì3³‚‡/XÂs"HàÁS">Ÿil³¨Ÿá< +üÊ>x΋`Ñ·œägÌA‡ú¡`8ޅ$g²9§vº}PãoÕi¥±fC!¸_ƒ0¾,ed—3È'ÞHKúHx†òX3ŽœL‰Ï¸ïÙj^ø …Y›™B¿™ù[a‘©MâžQ‹zdËZe{Fu_Éçè²¹QòŒØ}Sž‰òGªR±»ìد™ù”à:oÕè0×:ÌW—f՘cœ,Ô|¸£:ZÔ3 ³¨¾ÑnˆvwDºY¨ ‘™ôŒ©n@OŠ¬j#èù þœ+¨iPߙ½§™ ­›º@ƒü¨Î¤ á ;Öí¤yI~³.o»¡ÂÙ錮ֱ™ÎÀÎ(üpcEDìžFé uE¶j'ŒtFã8 d³Ñ™ƒ•{¶¬G&:C¶6ãHCÇTèŒ7“A?6æ*™äŒXö/m-ŒÎ…¿4Ìa’9c¯|œ[ ›a’FIe÷µ ôò·Sá@Ɓõˆ49ÑÍË.(,É3Öû½³žnö9“Àƒ†bF«V1ΐmî3‡r±8㈗gœÅ|·²Ä0î2ú}r›H{UMIlë|Ìá85ΰ-äoƨÎ1•Þ¶™¢9ðÍDøÝy T›y#½FëBêî܁0Ì͝N0 MÓ ô%z¨l«X=Œ¹™(VPӚ±™Ÿ‚_7“í@l†s#mTú$“àæ§j›© mŠ#°5“1[›ñŠmÍ$çó5¡&ïÖW3(:jXA»Ÿ)Vbs‡E{‹ÑÙ֞+AjÆìʎ¯ëæ”`%îÄ ?µqç±6ãfÏË=èýs¤°fÀ r³2ªTC¹i6¤ªGñc2¡ÊvL¥£AO¶ 4‚]'0'x´gAPÁ\Å¢Ž¨Bœh[4aøKýè—g+lè+õ‰© +Ìe–dÆρY¯Åd–p ýq3¸J3&®X&¡lŠ»ˆXÆäfe—lå +ä2Ô/8ö™‘¨×ϯŒwl¾Ð$|ªP(–ÎÔCNªTVÚ <­2¼bŠÞx +ǁPhŒZm–>Gé×)€gfZ€3¤RˆÝʼÅpr² ¯²•a˓@Ô(yÔʄP7.e6Fԓ ›ÂZqä‹1ÎB¼® À`e[h3–T‡¿¯ÁGÄ*3Lišl¹EqzÒ ª2ÉTL/—#cøð U†C󺂔ñ+áôI$t©ªg£oˆg©Q] ¹¯Š¬Mµ»\ºw4e¼Z2uÀ]>¬È”™þ¨eòƒÑ‰E™EˆL‘kHÕL¹þý—ùªBMʜ€ÝüURÕG‡SŠöïdÿ˜È4 ÒäoÀ"R¤ ؼWàv2Zéô`¤v ˜A «²Øwe6<ñdzóÊÀ¯V$T[E2i•Ìs‰)èkÍLAEPæÔDMgÎìÜD#º¹› _’Hòu5Ï ¶-mÚg1½ØdšsœØo»¾-&Sc +áÉØÃ@€Ë­8¦,öU¹JdΊJ,o2Ë#Aã&íc˄»“LzÑa¢&“æ ¬Òæ.œ’p‚Sb«ø N´íã蠒ÁƒÜÞÏ\p¯øSAèm¢Àdt¢cºØLòteæ•,.þܖŒÎ!iÉHãd!eÉXƒ¬-"’™éÈÄëV›@3ɕŒ£,bœ©$+,U›’j‰³*ÓWj-qn;ŘELÖ`&䲐•ÀŒüCŒâUN|ëҖSIqJ’釨.#¬¦ÛÎã1äà4rC2ýÅ !# Å4ñ‘9¡I lB&N&`ÔÌBE-¤Â‘Iû(Š Qø}ŒÝ£€DA’“åf·œšžoF¦e»„!ñƒ\ 'nÆ"¼Ê¼dŧ©È`d„L Å*ìþ±ÿí'u!¿Aӟ÷HÜN A:ÑÆì^ôvˆLdAØ4ù…ÿ”Äz¦› Ÿ†‡Œ˜–Ñ:dðR¡û3y=‹!§nêÞÅê]ŽÖ´÷•>°‘ÆÔöc†jD¬a¥± +¢ d*hå{ö1Â¾Žï~‘™#ÐæÅmÆüƎ™zÎ÷$Úaºl1ŒOF¡tr’Ò4xiÙIìS$}¨±Â ìç½UÀÈ1¨Vc?–Q‚ aÌ»[Á(d)`Ägkсz¹Öi +dŒ?Zߘþ2·–Tö*Y3é2à­´“âY8™%V…ZÆkäÇ\É=ÄÜ +=FLöWà”6ú6&…Z„M̙Ñ;pĉfP}";Õ·ÄÄäMôö„ïóÁ‰ÇÈ ÎlÌSßÚd ŽC”s1C4!?Š™.-ò¶¢ãD2ôûˆm[D]jjFkÃ`‹bõ˜Ýf2Fvå ¹I¯34'ž®(,XôBmSΡïõÌ÷„Ó£’eCC#†X£ï˜Pà(6HÁ'ÁxÇü.w#v8Ý1b»ÔŽÃ±} UèπƒÑt ¬#±8 ð8\ÇôÝ^ôŸÔ‰iÙúBõS“ó‹æ9¸1õã +J«# ¦¯:Æv|išK|2p:& +:æˆÂQ ã(ðÕ „7Zs Èü Å帲dˆi¡E€÷ŠÅ& Û.”nLØ,¼3Èée\¢Ef-šr Œ©O"9¦Ÿzl¥¼_‘Š1Î6˜Œj»Ð0ˉ»H«I„øÆIÃw ]¡™óJßI&[à™¿¯’)àò\;þ«ç;<õW<3÷é °V¿+‰j7é١مôZ®t¯1T&YójÞ³sÅ@ Á%¦cóU÷EəçÎǎ{¯•|Så3å¡uªX˜1x³ŠE+×Q'gúd£Í™;§Ó)Æ Ïë!8ýðÄÃ1jH)Y›Œß)×e š[ù®Æ‹e .u‡´C3c8“1¶´©¨ë_@Œé/=¡È˜Ü³ 2&î1†ó#Ž1 cª?i0ƬóŀR²q‚9²Y= +íÛæ„Ár¢žà,€ ðO4Òitào1ÉÅ ¿˜žúbÈw>hw£¸<cÜ ‡äm–㞼S°¼˜¹Ü(w1áV1†Ç9¡¬%Ù5 Rv1cRFµ0¸UܖgþŠ‹#áô­àbZIíöÓ=lÜb®ù¶ £zNÜ L’-÷¯á‰«\u­Þ>f•Å$B¹Ž¤OÐ ¾ å©bn%cü"¡)Ü܉̎ù·q5)æg0zÒõ¡[i¼9à:ñm(;+á¨9Æ%5ð9”#×î³)X™NBxŠÍ×0"¾Äh +Ì"bpêâ£!XæùҞ˜%y¹’ÄSÖAø<Þaüü‹^JüSáܸиúÎ{é1h˜ðʉäØèâ3ž€9v˜ñ´RE9LuæƽµýḩfÒ]Ã7ä/Ý"lГªÌ¥~‹«ã0âóMæÜǖ‹2Žg˜&­­o¯Ùs‡Ùhښa¬¶V”@Bóçô¥Ü¢b>H¨a¨3 sU|˜g˜™¦oÏÄfUD€„¹„éá²â¨F±‹Ýû„{]e/Ì3 3-èÙ ‚‘e‰ˆJ?Wp O¼å#FFDì/ÃÜÅ«XP¸¸a¤HI'£˜Ã^4Ìó5ú€ "®Ç¿0]x+cFˬL~”I/Lë$çŠ㯀Ðê!»0ù¿SŸl¼Tˆ.LÁ#¦Sð6paÖÞ!uw æN€°¸ +Ýd 8ä=¿ƒñÕH«ò ¼-£¼à8É`̟œx‚1ûÁLq‚Áäp<›/ž0 +­aßÙÒæJ‘íŒQ E &}º„Aš+ÊF8r¾UÂ0’¢-n”0ù  b¹´²£ &ZB +³^”ýÐÑK¥ †¹G& ‰M/­Ø¡’2„éC½)%˜û +˜0JÖc&,„h%µ50‘ž—™¢©&JñÂcE‚b¤uW‚ÀbéÁâ½[Èèÿút+  Êc69•.øYu0• °1˜äÊŒ¦&„#÷Ø“ZPªïéÅƋð%&SƒIŸ—ä¤ÁŒƒwtC5œ»µ'Y€A² +†qf˜CcLX•‚AX0T¤9©Ä`ÔB‹ýQ=dkÂF_]@\0‰{Ô;\hÍ@ÝO҂ nF£z…¸x%Å£Í{ f`N¨>¢¬”Q< + —` åsq}ãÑ-""¥4Ðê +!˜œ npÞ8 ÿÄryZäâËeêR8fvoý•a†4ê-"¤wÞŽãݯù"•¾6÷K¾ñ~+ƒŠô„*1 ’Ò¥‘¹pW‰ÿWî·XA{Ç^¼zñÅqFøŸŠÕ»ö¦Ö§¾Æ3kÃ÷¦XfÐïÛ̳— _¿ýöï;v’Ô7äٙ—ÅMxXä8¡.ô o¢™C‡0ÂF£+ +@`wÞ§  R5ṦZÀ¿‹{øŠÙE´+¼w×+»²²šIمUBYY(΂!oY·|tg4žàïï¶\6ÈuÝâK(eØ ÆÝ%b]Dx‡XAAÆãŽ)÷\Bkq‹F·,rÓÜË …XF4–„–±ØbKæ¢Ïgw®¬îÊØ>KaËÄr±Ûƒ‡nÐÝÒj”9 'X‘2ŠƒÐChÐçóàD‚‚B±Â2dUz  Á*”ÕCs0Ë43‚+ljf†œ ffgj†”gÖF9î¨hÈwrQ~Š’òüùË+Æ5o¹"{£Æ+×)£iç‹î7Ü6šË+ï›+Î\ñÁÆÍf´íæÚ~Ö®È~¸bˆˆ=å'¯û¹¢I?WPœ_ÞI6˜IJ +]‚€neV³Ó÷4ö[>n„1{ì„!³é”J©¤5ÅÑ»Š^Eõ*¦SAÈ Í`æh:2C҉ДΨ‚©7*/Ot4®®Žè®¢¢.¯¢ÊÙ1£Š£Ç݊«+*oçu*½ºî*núⸯâî]…]æÝ, ¡ÜµÈаâ®ì{&·¯¾ÚW‘Iûã«pã\1÷U´R^¿«¨ùUô7@ø=  ¨¤ÜÝ +pÂˆLŠ†¢³1̵%8 „.:HHJFŸ Z’ƒ 1)„Œ1 +Hà¨ÝÓYîó1&.S,ƒäm"ï‚AR2ê Uuà†rTï€X(4EàÅ]»ÆühÈa0ûžÓ„ƒÝ“Ö¸Gúݟ‹Èwäd‹ßwX}À͗ Uù¿åÐû14pjˆ*”6YDLJ*8Ê Úϖ%žimLø[Ôøߝò&YgMƽ*”iîÞ9k-•cª_@ˆ4ÎÇ^üg9é3'‘µãq®eáóÒuÊeí „OÙ-¾ůµT§+ˆµáy¼\sЌMxz®¤„Ú«‹ˆ –0/]2:ã¾Æ õ ŒbßVó žV¡õ¬gænüPõDM‰æ̎ Ò ¶ÙnXSúTw°oN‰-q™D¹ @i;*K ÜN>¼%jÉeåb f zr‘ÕÇ¿Ãs¶Öi/9Β>ÂoÎþ•öáh¿¾¥*ñÐ õØ3y$€˜µ 5*ð0CíÊþ壴¬ƒQ:ȄäâÃP°C/]¨ðᓠn îÉü Â|¨óymEà>xøe¢Â~«QÍ(ý[ B>¶x1®9;Ÿ©Ço3L87¾« ¿Ø&Mi ^À°ˆ~S¢óÂä$ŒÛ:Bêr´¡÷à85Iѱ»æ@€Ò¦3+Ì7í!©2wxéÃՐÍËÔb°Á. J{̀\.ë<€Æܘ`E(wàÒ4 Œl"ÂøŠòžâ’@|†ÞϊŒ<”×—Ä´´gB‡ÇÆփê0d¼™䑐sXn+lûÀv@ÈÖ1ف™\æ(þ +ѬєՖD?ÉYt(¡œñÁZ:ރ3cÞ~páB“1nXa "“¢÷0ø¹|Iá@ÑUÃ bð–T˜Ëê8pR +d,$ QÉ£àoÅîç2Àæ@ènÌ=×Ý YdžaìeŽêqæÅsÈdŠ”o¸p ŽGÍVÄ©c!N$vKÔ°ymn#܀J¸Äº ÛÀ՛ï…ìO€ÄeŽŽ +mè¯ûzjh6 ~§ Ê"¦„$Jl(B©/ؐõ9#ˆÃxªÁ&Üîªcrä40#·Uâ[ð°PfŽPhќ’N‚XyC=•Ç(}š!\¤ycˆ–?‰Ñ ÊpØ ØkÅÀAÀåÙqïKÛeÈü&4“¡‰¡ m 4i¥¥¸|ZE…´°R;N†(Â; ÿ P]Îòc†{‡à0¨ŽP¨@3æãGÕûÏtØ]óOI›§£ ±Ÿ©t^€KØÑ u$•ÚPϨU*y ^ 1º†pè½ Ž +‚vxá:ƒ.2~Š273Ôq2Îvx*D5Ù_@(²C7Vr[¸(ß-4LÐO¨Î`ùG(}Ú{„#-L:' ‹/„Æ}ü“ À ¡^â. ª¨R©†×6óÎÕ@1¦ê‚C°}Œ€µ¨òµÍ]ßMÚ/°iÚk=3¸M ꬵB÷ЕLµE–)¿CA+ëÄ¥!›v¢±³ PÌû¤½éy¡ +ÛɑöDtc@4¢‰…¨y°0¨R`bщ]ú¥Eî\åév'lu¬p™h>„I¢°ªÐ!K,¨Lj @" ÞQ¢ÂÖÀþîî<nÏ OȎ‡!¡À°0ýbùØ â3_mmÅGy…XJß _†ÄÈ=¼°Þ˜ª°~»`”˺´æ,?FþJ¥7¦ ÷d€ ¨EvƒÔ`s…aãÆÇsĄ5VËąÿ5^Ð#¨€4á%•.§èÑú ™ãJà|ô4¥r +‰ê“_~v’‚sæÀãþèúhê$ 2L@x x ’†#”á“úàýÂ˟€€2–‡ì %o!¡ÄˆGhùÉ<§£:fPú¡ €Oqñr/Vi ª¥2°ÐaÁHF JCV\åCôAŸ4ðž«4•V—ëÐïšÍÚ(b~ÐOÚ_J!+0¯x£„À1¶;¡W'ŒˆÕXcÜDC0ª1Ð +h¯%2 ì÷ä‚0¾pŸ©Ž½€`ÜØ_„©)hAÑ,(ÏÁÀ)äç$ð§G ^ê¨AŽ”>¨-šÛ‰ò:š™á¢AéÀƒ{Ð!ÍqÐmTJN"zÀyÎôHú¿ù؁‡: ¾™/‰ÏXۈtù8:h¦JoÄ`0÷Gz”Ú?{XE‚<áAaA¾X&½T'&´><Ÿº‚Ø{yŽ|›p +]&ž@ßLh,ԆuHÖ…Ÿ4G¯[é1îåú}AbÊ%°,½ ¸Ã 0£­ PÅSø!ž @û2X§Üà ú1 á*àÕà€©sˆûk1õ¿D¬ô+²ir!ü‹šôií,ºQĄ&p̌^{ý*ÓD±Å,_ ËŽx}?I(d&ØCòC ¼? +#¦j¯@)Ãàó̂Ø%Çá‘F°%Yà]Ž6Fú ZÑ¿lèÐ[ø…RJ€¶²¹b¤C®»‡²T@?§`Ù +}È ¦`Œ; ¼O?F +œ¡–³ð@uFà#¤ +¬J +8ŽÀžOp¦ëópÝGHÅ:A·€@œ€ÚuÉ`Gé,Ÿ‘±²c“B ÖéIàWe’ ¦ŠA" ûÇ~VjãúðBð8îY±xdS‡»råSÞ±4ಘ ëDPYˆ¦wº”õ<b?K~‘ßì.ñ5Ndþ©³Y_'µxÙ"œ±ãZi? ôú €ºq"ÔîÖkuÞ,î‚ßFÔëZú—@ùGIª¡Ûm¡êðPè¹ ŒÉï…¼®x¥Z³!`œivò#‡N`¥@&m}}cU;"ƒ;3‘ùMýe†‡ÞçËßà‘WwãÔù¬h>¹žŒtãy~Ôþ€@”ívž!\â¼Y‚ZŸ5SäCϑ2°boµõ‘ ãán ,GN „¶`'r_:øÀ ÀèE¥ïÐÞ%}U“’_AæúZî×n š|d^ýÊ­·@qh.Fýš2TcÉ2·%ÅðèÆMX5R@wõwËmV¨?à÷ä0_9É3-3!f“ÐS¢,CIbsâ?[׀É(ÛD–Ž@ڔ12&)©Ä^‰U¢ñŠœÔ¸ rώK4zXAÜ lFŒ(âöªÏÐë7)óQ±‡Ñ$6 ÿICBN¶ +Ü*áJºÂ: ôg˜{ù—7“á¡PH¶0UɔٟÜÉÀh,€†:.ü.B‰Pð„JWºâì-´IþÐk‚o Õ +ÀEkHó2¾ž¨¿‚À‘•˜ó^­.lu)ô®çÎݍ"CœoªlÕéE”ݲ¥x”¥|Û©g¨ \|ƒ|(t*‰ô>l”ÇŒOÿ–}¹êë*Ù@xUÁ”‚PD`3K_åÿ-0=°¿Þ/ÔÂä²¥øԎ…’ÂÐ$‰FäÒ"gšoW¼ßêVm8n•Âýš†;ÏÕÎnáh»Ž +þš$&#)Qa=(Žø#¿a±Ô“ç¡l[Ù.+`doƒû˜^D$É¿œ‡¶‰‡ M¼;¼èòJíX´]‡£êYj¹’AŒžî$7œÅOÒã‡c‡þ*æ—R}è¶z/[öò[ºt•àCƒ@‘ˆ BKFfHÙ}cÑ +"Mä*j‰ÈLèʀ&[ÇR×cÆâ.ðL2á.¦‹Å>AõvxœÂ)šH¨2Z(î’¢ø4ºanÒ +55ôWf Ö {•ÀXƒÌ¹†q¥ë¢û:º›àÛÓpIu®xBÀˆ4¸þÛd´(yaÀ%ØôWܨ0ꏰ„n;4&=o¼Í±„?I>LÁu£²4á6 +ÒdOӍÆiˆ‘¨1yqLa.ÏFݸÐ`.¹Cà—\jrÀ¾R‡šFw€ Áu¬jʧëã:˜%o·‘pŸL´ße +H“ù4;Æ΀iã˜6ð¾’ËìwÇ«3ôî8Jf ÁP¨ä"„¾…¾-X—s„÷x¤¤W3Úy‰{sQÂÝ ÀüþF(Ï´d’¯Î¡ ¤yŒœ'¨øçà¡'Bž‹Ë”ŸŽôÃÛ<`XÒxé"f¦ }<°"óUæÙÃ}p‹’Á9 ¸q¾, I¯ +À—O6¥6{B 8mL¦¼~o>€TÎ'%/€˜X"k/D#ø$ð +v×h’Ü_p ‘&ߕûCp +L‹ìöyðA8È»aäVëƒ2%cˆÞv±™v)j¤9q©¯GáPù +:G›à ¦I)&R¡ÄŠ,6éL‚fÞø‚æ5÷‡ ?§Q+Ñ×?º_ìîò1n:ÐUÅVÏ&¡ø¾ã ¤Ù­ÐLµj#*£h‹„¿JÛm +D‘y<ޘtî“÷®ÔÂk’”x‰Ð`q*)&hŠ5ؓiö0tV&Àå½Ýãý̵ç&“Yµàr!î4~©䂃=”€ +N›þC‘ÇFª‚ÕŒ×TF݇ë¾þ¦<N_‘q©ÑÃË(´È#áéÈó@Z"´RÜõ:w±çºËÐK¶a.¿[ðj¿yHOúֶ훧èq®†ööÿ0æãe.c5œÅ—xûz§ èZóßh/¢Ž,ä é„D ñK/ª¥Y "¨ yáÔša¼bA(¼Áœ¨ •»ç„5‚O*üÿ"Có…mj®cGõsÔýK[þ¿=Š¹ ×óOñn‰R¦8ˆÙ‘ê0züĶ§žiƒ-Ù[HaÚñ§¾ö.<ÜDÀŸNÓ8 í/Ch¨©ApA­¬’ÿw™uGT;êeVtE@@NäÍÝ @p¯;jÚVçT¾ˆ+Ó{ƒXùK׶"âß àN/ޒƒC=ÿ> ˜Á×®p‘¶ã3Xhyk"MéžÆ‡öòÊ¥ÀðÁÛýy¸ ½7Ô~³ Ðvüô²“p34†höó”"Oï$M搣5-è¾yB͞õäb{¨añÄ£ž™¹<ÁÙ·g°Õ-ÊÕ>Q¸K BHã`NW‡AR l‘fj—îžÖíß>ËôÉõ"“D¥±z‚¬ûÖh>…oEÐ=—â÷w+fau°& Ø7Ÿ"s£C Qg.=v@ž@*JîPDL7£ô>$© ¦<ÀÃq,c4 ӒârŒòµäІ¥èïÀ†N +ۙ&¢Á`BøÁø¾tCûÙ*Þ4*i´ T‚”Wrupɉê“5$.ÚðA‰&ëÒÛýò÷_ñʸǜQNiLm¨88–è8"› ,WobX‹¼.a½'RØV÷øV5G‰êÑÅñŒYžù'°dÄv=gv±8(¢‹‹ãR:—éçÀï­"Mà¼JLw|ÜÛp*ŒêBÀ6Ë»Àqk6–Û|âUâÅ3~㠎tS3“:eäÙéàs0$öîG: Öþ?4È4Ò̦ÙcÕUìT|klÙSÀB(òjnàÜòXj,óàRHM"\’ qHn,NèLè4QüÑ"ôcŠ5˜¬Á ®ôiJáþøí›Ây)ïá–>>A#ä¿·™éÁ{À“àޕ·š;mØz¸)yœØAœS'µÄ÷B¬¨á“«¶RD¼Œ¯=»úœ'hª‹k9‹/¹ r„Ô>‹ACK֝¬ÚðCtB×Û AÔ}²½™»1ä,²FFÈgñ9ª ¯Å-•öÞ¦ =:NHÇ÷~Ù0󳁝òtÔ,ôÂhÃL&J­ uâsÃ,Ô'ºâ¾È.‚4ôà®h’XøD $2À²‚a`>ú1+-åTªò›Þ)Å”YRåý…T4¡fT†Y؄´²å=(¸ +õ}]á§Nf7€»BV2à°ÅqܹoÌ ¹vÍ îâ$[…,‹>RŠ é´¨Ìåˆ]#øüÍÔIDuõ«s܎V”áòô…‡/Úaà­Óþ„à_yjp]vUÚdXôZ¬Ö‰4à +ñ±l¾ÖcÞÚ¯Äï Œo>£·Xæ ½í–ÐؾEVú•FbmP§„Ž¦Ø‰cM·Í V;Ê:k$Ï_áåµt" [v/+×äm)Q¯.\k'«ž|\¨’ÎÙÂe=܈v¯ã—ŒÌaÂd!&U +F‹œ*”åh²€ÇO[Õ½‚ 3Ёy1]Ÿ)ÌÅÕ +R8ånµ³}õ:.6bZ.cì9 Áƒ ó´-KHà#§ŽNzÏ($Ô5;BpKˆðõI7ycÆMy3?è÷ ‚Ê_âÄ%€vpõój¸éAÝ¥œ@ÞjÀƒ|?Ly œ–« üò½9nP¬¢ƒÄuuµ¼œ +CƒôÑ"äu‹nV˜º.Ln08¬bt?*Jøãg&ÑT +LQ´b°«ßb”ƒÐ(¨€P>䉹"ÄbjJ°º01©¨ýCVqŽEƒƒ %CåR@8¢| ’`ž<0‘ u¨>EHK¾ ¼\ Jó5ˆÙ[9€¢,!ã6Ǹ·Üª€R4ß-“[/ÜIŠVê"Þ³|qÖ, ³)–#" ¨àÈÙø'a#=È¥O"¡Û¾yØFÂd Š'>x@ÔÿÉ>Âa¾ù¥Ú~âïB÷« V×û¾ÑЉ´ßRþé3 1ü[¾½‘Ë®×ýÍ ù¨œ²åwº«\}Âr{ÆW5ðjy+œ—R†tBá~Ñœg„RåÉyÉ»$î‚úôÇco + òàð4–é{Ê '23<ÜrÁ0Ð'*¿ºÇ>ð| ˆ£óiÛ§ù†•ÉxävZŽ¯7‘Çøž³ŸÁÌ´Ôh¼Ž Ÿàˆ‚OTò¼žtèÂï |x½AÈa&4Ò¬'‘ùý¦Û=1 +ÿŒ¸½LûÐIïcFX8æî4pìÌ.LêõfÞ ¹ž­ÕÍy*RT¶c«ç•qR=—9J=4‚N¨'y%Ìé©üÀ™ NCaè¹k>O¹èyžRì5Ñtž¤Nî’yÝvæ±î­qy†!@Áò¸H‘Kåq¦Y(ï=MžE2IžÕ½ %òÄDïoOAg>8–4j¼Kñ(׋)ˆã’[K<¦Ð!žåY½zD¨tx +\ÖÉåU‡ xlRÞüÃOá­Ðœ±J4x’/r7cBà:X€§ârg•Ùú;a7%/§üêªïÞ0¯à;à‘ÕÎFFEï<ª¢¶š‡­Mr0É̝Gٖ“wÁ9¸ËO}Š—¶«º*;¶Sùe…­Ÿ©ˆ¤R»?­cÀކ -ÙN”@*íJ[Áû;‘ +ԕ‚5µò¢ÇW`ÇôA¿¾®dC÷ØÖYº1g›3™Òéôùðԏ`0ˆ½Ó¡ÝÁäè|<†®ÇèFCÑygXˆÎµ”M†N§¨™á±„m”t29 ÖU~nUhùœÉÁÇV¥çvAÙ¸mГðœSÆÅÎ9ÏüKç 'ÿ1Ãn4gîÃ>æCÞà%ÅÌyEÉFæ䑄„˜Ó¦54ÃÛxpüAڄŠÜÕuÜýŠMªÊôù½!1.ɆT89]>,©„’“ùbUH®³‘ÃAädú-%™½@éF7Åïí™myœ\A†®ÌaÛzqÝcΪ)9×ÍÅÂMaq?óÇI >d…´8Ü4ÊsÓ͋¬ýþl+¯ŸóAåéå1×¼‘ÙÈ#â™ÇÛ!7¸…µ¸Ñ§ +ð'ªÈ#Îû 3Î*Gú¨(­."â†Æ}¢œfò-Å»ž¤ˆ&¿â‘=ی§&³yeìÉF´:_ÅÅBš X ÚmR²1ƒØÈY;e(ÔVâ– ”¡ ¶¥ê 9E(B<5ԑöw6‚ÈÄÓ}$•EG-2è¥ +æënØ}‘™A8Ü£sxp¯[»:Úý8øÊãœOkÛk–Èí°v˜q œoþ^¢æÑî +™$LÜC"¹õÌDª™PÀZÚ¼~÷´À¥æüÙ4ød¯ýá1h20V{× ±?š 8Nq€Ú&Oò{ ñĆc{/˜QÆ $¬_¡$àrÏæáqL` ä_Á¯xǽC¢GfîˊÐÖ;Þ'$áí‡Æ7ùØ ›-‘EQÙî)(^ ÷ÙMޝ»!{¨£Ûߒ|”|£Íù$kž} U|ü[æ{‡„¶¸7bm•nã=‹‡Q¦=|7ä'buH½g²ÿÚä.‹Úê{€ZYËýÖ H°ûԝ#¾0µÛÀs\+íÙãwRiD&QOüó|ö‘àG*·„ÍAdE&q\óg¿o%¨Ñ(~¹À5 A0$ò{úÂëÐ!Ž`¬ôç‘a¨ ð/ѵóËXKˆ½„ô€¤ª›ÿ²ôÍ=eŒHãqóÒÃéb‚g+ç]p”dìdl=§ë%悗е°Hò~pÑ} âÿå¨nY#OùDçÌ/u¯‹áúNhПbõXáCxbW"ç}!·´åvãŠ-!htŽôÀUäS x±$ˆIáDIœ»Ěó„}Ož˜ìx‘ªåsÎԒß3î:ûÆ6 .i ˆ}Ëg&a¨mL ÃK†6¶ðý(×cÌ4{qG,’§&+fop& U˜ðÁÀWbFb ÁÁ–[ƒzx´VY.Ó–fEñ²42›¬™Gí9ÀRn–È•4eÌ5»¸Ç`üˆÓ[Cà¬Ä¨GtX>ˆR†r†7uúoy¯qü$Еº×1ü¦9^+£&$%v‰É‹¸rï½Üç TœX?úˆn_ö%#Q"æ«|õK±„߶¶qfzÉÆ eÜ?¸ s.3dÎ.­-¾²ñò"ÿ QPðgƒî«ùöiª[,¨®Øc¶êÏOV=î5æ’ApB!nÛR8M[ýšB Œß¡‚—À +r¬¼®`²ì¬bv`˃Ý")8lCͼNæÇyFÅJ?d&ÿ+ÏZ6ÌðP,V­Q=µÅã…ô¹ÂW¤:HF[}PÃòjý&D‹Ó*´4³ÓRâkjŠSKè8-Ŋ°>i¿‡ÿ ¯A qE¸Ò² ª™ÀÔ·=tøÃÈnFð'öP% ^–Ø…¶1¶-cŠ÷PàLԁÕYáDé%ք€“ÈdYÚ£=É'ö㦄æ8V³*]~‹!²Jâ,aZ°5ص`¡S"¼º‘íPº´—¥ÜŒ$áPÌ&ûŠÚ‰háB‚‡J”³‰Û «+¤=~ÎîªÛvB‹|nDJ‰yf˜&D½T®b’6‡7ÑK8Ÿ  +ï͊ã&!çV§€x®ª,ÂQê`Ž&ã¾$3Ä|±¾1›l|Û~ +ÁƒÉ­yžâa«gÃɒ׬õ;uJL v«õÛ:×tûlÞWŠaî^ð¹i€tʺ*´(ªÈÈÀ<ïô‹½(11JßÂÚĶ¯ÓØÁ«••b˜œqKqI°4.ž97u#[¢Š¹&~žŽ­Æ¸ú!s«Ìº¬kHJdgEEÌ*"Œ¿ÕYÒôªVÀR#Ê<ªáÞ@pRql¥É­sÓH…¥"dÁ†ø lµ¢öÃæ¼4|VÐ#y¦m‘‚Cù¯9·Oáà¨u³Õ1m¹ ‘,F:¾4Ûºܘ'¼ZÆ ÷äHáµ¢°†í¯! òŒÌ\òæ¨1HÜoö¦Ã0 Οêø“ÏZ:ó7¾V œRd)ƒ‹!b8‚:•ìÿ¢´S4!¸˜52¢Ã\ý•tŋX"s¤” ÒµGõ’DU%,ÃýÒC™w<þ„`Ž@ÅT­Å \Y–GÆD¢û”Sá/#>ÄñÕÆΤ!å÷©VJÆõF̽Ͷ(É]c‰1Ì­/T¨héýÇ +Æ è‘‰…¯)Ä!ÞX¥Ínuª-œ†4Tt=͒KÍY§ÎcBvp.bÓ²PîÓª®ÂçÛ¸W°9õ²Û=0»I•CÙ5eäàiL÷Q£ÿ’}ìÇB +}äÃ$%õÉ'³«$$kî»FEäG3ÜkÔçæáÞ´5ԁí2*C&ûžò“Pˆ )üƒøÀ²û`½¾ÒHn„ Ð"2Ã{¹ü8Z!ÏTG¶XiG9Ð5zÃ4!¶°<{=£+Ñ>ŽòèÞKþzŒ6òçuå&( †IîìB,@iv3~nôÂðìƲè›(T;%ñÅ q㠜ó£Ã¯æÀšÚ-Zì‚ xЉ%lló“q¨PyÌ6;Á»ÛèA\í™%ÞÑP‡&a+Žîþ}¬â”õ¦ƒ:0EVdV³'râì«>,®u·™(Ì׌VÆéy`âºA"‚¤ ¼ræžN/åÅJŽE•öh\jї8âЋõñ€ì8ºÊ•sMîœ#Û{˜¤JÜÐӊZÔ]µ 0ûT¢‰¶…1f·hìÔ%C§ÉmLñÄÃ3˜èÇ>sc†“jH’ŒÍ¢Îð ö³ðÛRråK  æš~”=˜51Go£t‘©Ïω£G±Ø ²8Å~Ó@ßÀه_çøï lzû-ŒÊ>~Š?M(tìß<*@ÐN¡‰P€z˜ò‹*Co™ü{֍g¯ÿŸ:NJ÷Þàç¥ÇG4Œºñ&÷ïjEɵE_î3êÄ÷?¾hhéNŒ»@3GaèÏWðö’9µDŒ–KÍòìC?Ë$« j·¨H½4‘õu 3,ÎíÖ¯á`è‰Öy5@CÂ(€Lpn_ÂdÝLûæ&p­MXŠ™õ6q?'Tt£;\ÐÙødÃM&tæùœGæî?8T¬Y:'06í#š»ËNGU“B§tïÞ.Xâ8nJóA,Õ'C˜ænÞÕêgh e³ðC„äËÂÍ# –Ù`H29ŠÌ¢öõ51€ á‚EZ¨^Ù9»üûPÛº|òõ'³,ûÃp0Q¿!r[Úx:܇À¤) +PSÍÿŒp^#8%^µÒŒ)qی0I)Ɇ"˜´Ð2$%ËÖ¯1O”î¿pB {Ò]A;|XûȕiucÏK<’S'õF” x):N*«ý­66©èÅ°ŒöTŸ$è¦I9nÿRì¡H&%²&9X¥†><°¤ö«È8Õ(Qf¯ÓåH"»Ã8¤F*Oîv«P›x9µDzÅáe) ’1$…g¡­ô›C!Bª·e=˜£i]O éÅÐe‘ðžÜFÚÛ£~ùšoµ—á´F.!Ûc’AjhzùŽQ‡O×y|OH`_L2ĨËÖ»¬Âè2':0’9ÐC¹Nî‹&¦p\^D“=£)tѐSåЕè +$/[”‘´<Ò"¹²*‹$‡Òœ¸‡Ý8£>—A<‡6îèôÀãÜ}hž+*éçö±¢ê{§bóGó‹d­3<ó>)äD 3ÝøJÁš¿ÂDÿÞ[Y¢›hðÕ(=QnâƒVTºû!Ñ9Û!r?;™ZD+GÔ|Î'¢#õL™”d1ê/ˆÈ¶ÖÒBöÏ~CTvyFŸ àõRD+¦,\G '§CcÐ/q9$ha…Cô]—„â†xèg‚`[ØÐîd8w^˜Ï4À­š“9EC6£•ßq̐ò4Œ Ö†/ú?š© C¾íˆ² É·#* Üâ²Vfmú7½P«ðµñ» ž/L|´›Ñ© Z*òrQX!ÍWó¡á†/¶b¤>©e$Éډbg€ý—EÂ/!Do @ˆ ºÌ ø ¼©Ã<èƒô]× .h‰:¨÷dÜ·B1êø†çlƒâM|CƒDDéePç³ôÎ}X$HwεAúJÄU8Kßò@Oâ“E¤E5qŠ#Ìþ ‚µ! ¾Á}}Ÿ¡dАØ\+ÕT×ñÓçt¢—GËø×qöZâòÊhq’Öë5Ö0H-Ó´U$^¬— 7økü9cÊLVÆtNÿL`€ß渡þ¹¸Dü£Ãрâ®ÅAþš9Ĭ’>18{9a”ú™Š_°>¶Ç˜Å«íqyÚq@A‰? b‚nMÓՍ÷” ÅDçh*z^‡}wlÜGuFTƒÌ´Ž8ËQÓ°¤ÏûãÁ)0ds~#Q“ü!ųU:ÃlUÎçvÂRgG\DOæó½{:㍾;£v3ë¤ìøŠ°[ç{VŸ¿Œ÷hg“âî^ #¤ª…{þØÇküœü¡íI¯Aq5K«L{Ê+}È#DHõÊdÏTâG˟;ˆ"ˆÏõÔ~>2€#€ŒÇzžs¸ÎDHH¨ ’Åü˜[ÙÈå:…ÌxU†ð·¼*¯ˆÖ=ŒC.AÐ LÄ-ÉR*Ä,Åd$D嗅\„ø;Œ³m4çAäj +È ËàsxõŠ—Lf•Oì×SÌ/W@=Uy † âh:bn Š³‘r¼í΄˜Ecx:ñ®`¢ýÚèÄ3? +o7®(ô¸hюœÆ=×R¬a@ÁÖ8°ºcDÞº¬©ð"Jô ⎃F×[rªûŽâ…7Š›ÚËó)'ìVh<Þ–w—BB·½BüÉG±”À‰bAAóâ *L@€ì×üŠÅà¤À`>N!B,†éR¦öÕÙ ¶W‹i‰H?8U P‚­ª£c·)+JõK¹ãÁ›ºˆ=)&ôÍ퍍ȫIÈ­K\öø{’?fìöþÀ¥[,”ÐDÍٝ½µÞÄDZ=žíóx–ØäÉ2x,âØp‡‚í$”ÀµˆŒá¼å$¯ÓYxxëù&3 ö’…¨‘WÍS·YFxp|ÎQ +ÔÌ+XøªRÙÏgBÄLh(®vì¿UàTgÅâcÐ Eå¿Ñ?+ßÈi'[ãE>bÙM™ì¯t[†¥fö–̱ñ:0jp±Âx +b#û¤èå<ðD$î~ñ: à˜†ËðBÁ +ߐ´=`6Eǟ&e5R¶­NFmèpLÁ1á±:—²‹y§ÜE-89aùnîéH„#Ê++)i€7G*4À›þÄE¸O†u [Q‡r­57ƒ¡ù”¤ú/j[6f}µÜÞÂCf"oShÒF¢AI®ü¡7{Bív݃Deü„Œþj膁f†ØWLÄgN¡~Zæ®Õ}rªw&¾0Ø›nl=öÃ*q¾–­I@q7œUÀJÈÄã½ÅCÑMi(ôïn‰Œ[7D؂vå?ÐÿÐ2Šü£ÌKĨ† ,0Ì|qá6ô:XNðÊ?ݖޟ(ú¶ò-[BGêWêîh’ÔENà€­ž¦4$msçÈx"‰Ã?›W4®µ¤ýÍÐ4磝¾l‚õ¢Ù£® WV…Fö>ÂjõJÃ]|{â6ŒSù;ÕÛOº„!=ìz@rTŒ:9Pl¸Fýg=ÃTå…0# d³{[Š{IgY­².‘@½† ‹’“,_·ñV̆RøTf?2'9 ö(,ñÄLü¦MoYó‹C³|‰+‰iQ–»"ˆ"v¨n+2¿*„Dn#™ÌÛÎNä-Y¨Ð¥¾aé„ÛâG¿øڈo•GÉ× ™9üc¯>°ÍNë¥eéÅó,òI̝s’¶fPÜ誼àÅ{ĉ´U†™*Æ;`küþeLtúuäpHï—3¯¢§‘Ç…dB<éE!ðj ø~%ÓÜU7ԄÝeÖÉòb#àìð(™çYJÎ “%K7á>ÃuÑél.ƒïã#»ØíM¬¼¦5_Ûß%eìÛ7Ïʬ¹nj +(ðdI´Œ–A¼‹’´}ïʎaTÝLV×­ŠSøW¦-Õ׬')Æ&…vx!Â]àòbe*ªZÚðõÏź5óËÏh]…Jw*[™´ñ_çË9ðxA;ßåuïT‰r¾zÎR³"(€‘АWùãUQ‘T½µ'è ØëW}#¯”j–Eg\©PØjžKõL﶑&í]+—\~ÏJ0¯#0ÀW_ãÎg_•—µõ—ÐpѲ-_—Òh°áþÑÝÐ?iw~É£À\qQJ“²¸¬`^ŽÊÝ6=óØO79g³(¼¾™ÆópD.q­#ª¨ÜR‡ªèþ›ØõÇXŸ C›ÿ¦ýµ[2ž£EQä¡&ÂôŸD½a¿†qèc!#š¬ÃœÑNHñÜSœÆK?¯T—’ª<ö`îÌ.%ŸqW×Վö•ý]{„#ó‹P6¯†@ÔQšö-ùæd”¹Ò£"< 9;kl-n,„GƒTwƒ ÉsPƒscx‚¤/fxB,}Çñ\keôӘ( Y¥<áAœv:á¯BòÃúŒ”råR(¾ós¨ÑTì9’#Õãžj³lÑãvI6xt]š›0"Ã)>ßϵ-Uv´À0õi1µ°¸ÑÎ6`‡ 5ÔaÒª’CAúqD]•'lż$ú™äZeͪ+éÃޞG ˆ/ö›ÝÌ(!>Ÿ×Ë€Án[Ê›ÌýŒ6²ã:wÓC ÔY0óbý$/Æ_ў]é`£p#:ÃøÄj\%ñˆx\`Òc+˜¦3ï­åŠèJ’o. Š‰”c˜5óÆÛ[OÁX *Ç¥P ©%ÈЁªž.LñòÁgs!ôIv¼.º“ÅY~Ō8óBËøEOÍN +e,êÜÓx|2ֈŽÑ، 2F–g®UŒœFˆiæ¼ éh*†Ñí¸0Ú÷t›Œ =WÆ®-€eõ‹ýÃÝ,ùâhoz`°YÔUÚÊ7É.^ŽyÌDƒª€ `‹Q×sN)f=²èúÿzbñžö{î…¦@‘…Y=½TX±Œ…‘­"ŸÒ©/U4¸¶À +‡JEfUÒ +1ê±S¼;~ÀGêPTã§DÛC¯=•bÅØûU¤8õpY£(ŒëšîƒªNäm"íâDNš…M¼tFlšØð„§+ͪ«ÀDñQql‰? “©DäÁ™D»;ðæVF'±HTP‰á>?õˆÉ™ÒT÷Ä·zªßzùpx ^›L¶CLWºÀxúë©NMò ÑÖK­‹öÐ#ÄÐI͞Æ̊hǺE íˆÂ˜@&ÓùÄgž `þ+ÍB‘|‹Þù!å&dYB®>ä;D|È[ZÚàylô°½’8ó™æó!×Òù B´-9d +È'AZ]9C48ônj½á€‰å† /€;ËIi’‚ mM_Q1’9Ö +’¬¡ß訡Fc Ýí ¡å6[Wgý”Í`̐@êV†k©ÜªP{£2˜¬ó‚ït¬ »Ù âÂéÔÕ +‰×^æÓB¾¨]ž¶&e¡ˆ,/ƒ…깸Â<Ëp±pVHŸ”ì§ÚEV…`â¼^*Ô]D!b’ié\¶€>/™Â ®™‚©Yªo¯j +û|ØÌâ–Ý%¶nË*žåj„„ Þt…#¤€u+ åþÃÂ_÷‡+¾ŠC6&F„l8¶%0„Ú!x®«8:^‘òŒaêá1ï©Ï ô:*å*9@Ø@»6Y?8CѬTšzáP®LÕG‰¢Ë¥4SH ¡HÕ Ÿ=hPûkU ò^&äFAS/Ø¿Áf‘ Ž£ ^ív´; OòÖ ÒP +&HÚG#RՏO!–l,a2Cë‘`Çûä­Â1ÁZwÆ!‚ý:"PúÃÌÈ-Œ˜Ñr'#«äù·³˜6,cªl­`•ùj®†{PÖLm H/Í[X2À¦ËÀ‹’bt*2H`^8à/¯µó$÷d _÷=  mJ´“z]¡1ƒ[â`V/ŸpéÝ4s. ­²”ò|´KtŸ-4Êf€o‹“?a›m ŸþÇ´=¡®0LèùØãαØóë¹ÚX®Ü#,ѐ:¯†é“Mˆ³áZó‡)âØ^‚‹ºŠa+”ÍS?dÏ Ú±£=’*ÖçBŠBÒÊn ª¥p=Žª¯è¢É—ü#ìZD+km³YJ:@¡0‹zΰSˆQè ŸÑÚÇQ¨ÒC4U'ø¢³¦H؍B‡“®Š‹Æ4Œ¬ãˆv§|€9åñú̈́qךS +|,CQhÇCå×°…m¬c·P…°bo•ïk·ÀA½ý31,.Çû5†Cƨ˜•ŸN •Ê·¯Ìyožž•ìñ ~h>[Øà'îЍµµfÀz ×! K\vü2þ}u¬Ó×>|wý*٘ØÕî)É÷qŽ¥ú°Í}ƒQï#¾ az¤[ŒÂ¥kÅ#žn@åû´oâ,ö}<µ5½i\?dó”P¡)›4MòÈOŠÉ3۸ت1ªÒÐçG‚§_]†·ŸF»ê9ªlÎ`WÂÛ½71ÛG§ÀƒQÇRàˆŒ!-zñS]gãVp’ˆû}ð +“l”ÙÔ=¹l…õÔ©Üc!,4éÀt´Á±E͘žxý1…Hæv³.KÆTi² kæ",ú蒈'òá%Üúµð!?&²·O ãv1£®£)\‚Éî戴i¥î!‡nø<ä±QGÍ͟ìqÕd óO8?ᮡ6p”'˾ÍÙ#«jFë«Ð +R‚˜SNòøèaš‘‡9ô3ÞÝ9Ö§_1náÖØ=õy¶€àü¡²"-¿HVR1%|a“J|4¾ùßØ0-BåzƒùqWª¾>«ÒÔWÕé'ž Ûbý­ø-±0 +z¨y„|öjmÆûď,(é’ßå¯Sœ©Ë%siuÿsÅfLJé>k\TóbIO5ÈËü +p ÑÏñ|I²‰Ûí‰}Öқ šTôò°““´ì硉Ìä„_x†£N¿tïÒyÅ$VX &+À³Ø3¥jX¹³A°Š>é ¹µ,ºÂOU€9Êh+è嗾¡ƒ*R>Ôìb×RYd¨áþ›•±<<®OÀêÊ +U†‡I¤±}7éÉ^7•ìñ?:‚{Î +蒓"$}pîA[³ßÏþRw&mÊ¢Ô+ø՘<ée^cgç Èös@Q-†eÌÄúáÚØ}ÇȒ ÅNË:“,Ey0ÙÝהß>B C W È –1ßq##˜¸7š†ßHŽ­úÊHl€¿à‘„’rŠn¡6 ÓÞœHÊ„;í×;°?n¯½‰a ¾ÁãÔ.M$Tñâr,™¢COØaÄfOÄ(‹ðzòšŸ'ºÆ'Ý%>oBêžIb&ÊÅ ÊÄãlÜHgn+áš\$²KÙüR{õ ’õ`—›¿-‚"¯cαH”˜ë»4tþð×Îñ¼b—š¡µÿ%`(ꘒ<%Ðb/É̔^&¼šÔ†Wô ¸ê_/|‚÷r¤V͞ÂÐ;[XngìbK›ë‹@Ͻ8Yþ]Á +ÅUÅe¬Um˜u& *vNÆjaâÔñ[Φè1ƒdüZäÏÉEÒR T§Ài89b6¹F/êÅÑag1ãm¥Ô0Ç~%`z]p5jÑH*ºˆgò[ÐÍIÿÇN“æ!•#ûÕUi¤ó¢ ºg5œþ%ßK„5É¬wæÃÛ¢ö4`ª`FúYò¨5Ò¸NA Z‡2H‚;,HmäEÀ”Å‚éR¼Ñ"¢¹F•$jxzBZýúUöÖçle›SãmIHNVL12<ÚD Z‘/·,\;še1€&ƒ F‡›{#ä ?mó™ …M¯¦ª ]´ÙÎãcÏrN½$&ȤS«ìBßWÍç†{µ˜´~ì¢Èp ×”L¤VÃÀ©t$IŽãϤÀ"ݗ‘$|}Eæö”ßì óïDÈæm6Òy+‡ƒžxsgÞ³R¾ŠŒ6NaâAs_ +û‰)•§vy½Ä Þ}f4—HÚÉòøW4F~æMŽJì2SŽÉ…ïsÛçå ÃD\)k¨émî*R‹’€_{ º&›3cu sVebb\‹†½|¨(¤¬Ï•P„ÉÀ€˜7òP 1Ѿš~ö»  °î¢è?byü™¬³[¼µpòÿ$Á¨»{2yñàŸnU™D j?`¢ jE^© h'‚pJôØ]™ðSŠC(®x—ð°eL›QT„Ù¡7ÑÎ%N¬|­À¯¼¤8¦a =ã:¹—×ö¡‰Xo«ï„ÿÿNx—@ö„êRQbb`V3ƒ2Q¸3ºã2]‚CèƒXFöùG¿ÒÔ ÷QŠ‰–èyÅ2X¬¡PúŒCý+ 5¨ÇÖaX +ùmM»ßV§d½+5iÍ­a\'‚ý™¿£‡ +)” Á@ø’ Ûø´6 §!¤)˜qoƜF¿…P÷‹„ï~“A]1gv±[6L +1}Xz~ÿD½,éi‚Çf 2B2§p¬K ™Ë½sùð,*éғû§ÄƓh”ÆïèZÌç_Tàû²àêŲ8þ$’í¬ÐˆíÌ´d48Ár®RN÷.6õ)Hï)æ àJá R I3tŹô­´îgɑ£¶D0%¨èÌÚ©¡ƒÜ@y辈³Ȧyc&¿™œ uŃÃå2cFÌfPœ@' +~º ö|üo•²^WÈMKP@Õ;Т÷2 „9ð&'\\9ö± 0UÃ$È]SÖzßFô”2yE™_fԗ«„±þ<ø¤ãOC A(ŠY®‘€ÀÖ# ¼a[µ§Ì„;Ȋv'¨ }g‚V®v_WÝ`AŽÂƒª9䮍@ù$¤jÒsÌ ê·—û@vœ‹dá·”A&‹è ¬=PȋõºQtV–Ÿ[ýA4SüÁeÝ1;eSŠk0§€Ð֍¦AÓpŠ€Þ˜²‡ïÐ_Û1äÚãËû@ § ^òbľޖ| gi÷´0 ‘Dg*% pú=ÖýqbÔÑèVýiN8"´ځ‚`ð¡Ã3÷Ħ–)W‡ ‡ã8žRԘu‰9PòÙ¡?ŠÈÝÆrª+ +8ò@*1ùN¬‘p ùùóÕԚ!›ÌsŸîL>F‰¹±j߯·  Ä͖kUP + (a +`Íîœd=YDD›³ +¹"ÊYÚ ¼|a D®L»Ò&@ +¡°¨Ii«‰„Ô•PY©#Ì@ƒ%±ªZÅ7ñNM‹@c] ï§P¤:RžÁºÐ.¬—qJ3}ŠR WÁzh›,t1гŁ ˆô!jIj1”a Àîۀr¥âedÆ@<œ….íá A%áy×zh4-Á  ËáÁ4O“ãØÀԇ\]ãä}o¹|Æ= Š«¡Dc[ =ü#ƒœÏwùü=¬¤,òf€ÌϏÔ Ÿã‹ÜŸ–ÿŸ@f0=Û§(Ý@‘}f^k­­1Ž[48Õ¬ejkšÁ™Ù`%g K`PzÊɾ¸êg©N(!tŽÐ@¡ZI,û°Y(a#{_Rï7”cÖ·;™eðj'#þ‚ãO;ùI*nlÿOSQ.Q¤~2 $›ö¢ô,FYàê¨'Ë1£¼ÜȤ³MSÒÓXšU<¨(Ń£L#_D‰@ÁÚÄ°™BD {|ÅlIê£þQ~‘ÿá7͘ÅÛ1KGF@ 7äÐis? ïMÈ<€ºîdXáÉÐúc£³‚< ê_¹t@ëzxPÂúóþQA±¶øî€dßTd㮄QãŸÓ]Œ‰IIE™Žœ,gč0bŠöЪ)VÙx" ÐÈßùYú»ÀZ”L7 ì ¨¬’O:ŠÈ+(* ™˜*ÀyÔm]å0ÌfA"¼,4¶wÂô.úy?É ÄóD3Gð‘üyELâLO•€Âý©v€ìDBåÚ ¾úÈ:+vÿÄÒԌÕ˺b¦\<†* {ē’ÞC´tJn4ϟ;°[èVðÔ €ÙU<ƒrñZåg. LÖ?Ä!“ÕZ♡â6&¤Ì’&€m´u 8h0Nd‡‘rrÓЕ<,í¢Ú¸äÿ’ق?8@Í1a'YM¡úȨ´îŠ€î(¾ ŒÔÊ¥Rè#FœÍ{½Ê'ö¦ +àg„€€Š…å…do«‚€8ÖÕA¬s¼ÍLË(è²ÞÈ¢¨ :ïäw*‹­62 +ŸI}hÍÍç‹ðm'‚Ñ£ h@ýuSAô8C\Ç_¤³ÑÊϧ ¤£F¤Ûh¢QÈrèA(Ã}â}¤@}RŠÎXžÂŽQ(@‰Óq´…NØ CÒ|¼¤¸ÆÛGÄÖu[ÑefžßN”½}ÿ„]q¼12ïTì“Ðþ´ÍEÕç?©.ÅîªbˆZ³1Ù(ÞB1¼mã t•{)WñÚl#M7|« ÜŒˆX®lf`?yP÷€¤[=ûˆ D\ã*6^äzàUìT·oN¹‚T1'{Œèü$ +Г5vÿÊ±Øu.6$K4þŸ]¾<_ÛJOöÌeöÄWÃQ+ú?{X%'‹€?–@¡dÁîCÏ-’œ/Qٞo’Yn]*â›hÿä³d’wN€B¬mÆÓ?òý Ûþ˜«;0…~ØpUÐ8„Ť]mT(Ð"´ÿ`~±J+JÌ@«?†téÔ©ýÔÒÿÃaöØÌא‚øÏöM!þó8:>MÔk(½ŽŒávK–"Ü?jÛû3¾Bô‡@î™Ï,eûG ˬ“?íŸÔÞQÊO 'Ó7£~D͏4ýC-¡ï<ÁÔ}8å^ôâ„أܫÕ8R­èŸ;í`YUæñðH­¦ùY`ÿñ™4ÿ¤HñMUù2ԋEMíjù‡Wv*DRþ¡Oy,zCŖü£ÎvÈ?çPïàlŠ®Ž–Ôüìъ™ŒLÐ<¼‰–Ãõ?Ká«ï²aþ1ڏzȺýÅ+Ê ¿î…[ ÞY‘ ! Lm¼±?çò¹D”ð‡®"¿7råYÊU4釩ðÇ6ÇO¬`+žÏ8~Ì×åóM¥@õîãÄ·?W±NâÊ} B‘‰f¶Q–鐿k¦§™û“¸{Àúö!3,J…·Ï< ѬæYuöÁˆìc”cÌlý$ ·OK^Ä|&çeÆgL’ÖÒôðRöÁM“›üf©[Ž˜TYû$pÑQ¤TÄñžØ‡½+[$½O1fŒtK‰˜Pُ»>Y1‰Dg§¹'}¶Ïú²þ\G rÒÖg&¦ +ú¤ØÍzˆ÷aNÃ>V!™µï‡õéÂQ¶ƒ¤˜±#qõyŒ÷ôÒáõ‘-‚ãÔà§ë³(+¬ÉÒZÉõ÷³õ(à‹FbԋºE °E1«Ày©Ä‚dʞdO˜KH³‡„õ`2ÑDt\kY ÈKl^ŠŽùQ{¸¤+ؒgpf&oˆˆˆ’ÒȕúdÛ"›m?}¶¢\±ÙFWʕtÅuÙQ±+åŠód6›Ì˜mLqâœ=WÌ5*uW<—ρáŠ)\èD5DP%Z1e'²-ÑEQ'ª‚BT«ÖÓ¢9)­Yìr)?oxü‰+l -“ºcòPËúÝ]ÂÙ] ÝìïšÏ¶Ñè¼N]…êŠy©ª€ x¿³ÿo½|¹XɅÂÕÙÔ`—öÇ"‘­âå÷­—ßþÿ H¿àƒ]îךíòK…H.âbW_ì‚2v½Øɵµ x‚ΩK^$´£…(fo »² rQ}¦®|FL—x¡/_3¬¢å8S)!`—wB ^äiðh¸ýâ£z«8wy;泀ÎÎ*7gIu–ggu”‰3& ­Á +­âKŎfƒ*q.;£“)®sÉ¿r˜¸ËœW9z¦]\¡?ð8C“-L v,áÜÜä̈́A‚²D$lh`Šؙ5à‘ùÀiƒd–(D®A¦‚ Q   ‚3+9d“h•cóˆA©~fÒðL ™™Éyš‰««v€H¤‰:ӄ8 ¢Ìß, ­²³² +hü¬0«Ï¹«¢«º+»ðQW¦ñ:ûŠ¬#³¼ªKë•4°;ñŽc*Ä&Ì­Pˆ‚(0P 1Ÿá¨ÔÜU ҐHŠF‚‚Z¨ö*: +n,2LBPHB!ËÓ$É1†ƒAÆeÙ¾²{ÀWç•lDu出 WzH¸p›³öFáPE8m9š‘¨6‚¬´U•yгg¹Êž„³TVé²JU|ˆÏd x¶¥æDä3ÉFó9G‘½þ*3ÀSÜ^T¼˜’Õ +5i)#x4)eåMîÖ 1¦’7É?a…£´lf£ ‚'óÌÓ(ÊVdƒ­QâÚä e~#ÍD½JΝV#9A0 Pª/'˜‚Ÿ$2ýÌhtÙZAÔ%t +Ŭ®n²¶’Ž"ÎÃÝ›d†*AM¾þQåÜp¿hŒc^h}*~՛ÉIFs3L‘Êp3£wœ8Éæ{Än¬7qÕ£!ø ÷‰«}Ò íÈùÒRÿx''«&•cȕn3ó¥Œ2ÝÇߔÏ5ӉÂ㨅¹Ÿ1 sºÂ‘ËûOG’âgÞNO<¾(±­’wô³ƙKÖ µ×؄3‰ª_ñÄ°A€@ê÷¢“=‡×bõM*¿A|÷J¦…ÓSXchÀJ[©yýg#Dþ` ›Ç …²ï1|°->ʘŒ”§¼Èo^Þð$h7ØDü΅Þ`ë›k¬Fâ…ìºíWxzY‰à6†„.ÆÝû¯ ÿûƒ7õÃÕü×;_™‰PxúºYb∨È˼­ÕbŽô_tMTBGÌñ&Nƒ7DD ƒ(õƒ6ä,û¼4pbٓ4<›†Õ6z õð ñÐ̦gMdô e³A”cÀ›¡‚ˆ„þ«+˜'÷7 ŸææsQHoˆ{\™§Ò¾d +f=Yî£j™…†_Ã1bXÔʖ€­®›äÍ·êÒ7°ó„Ý1fPe³£bÉFT4¯m +7LÃÇËÓò+ £åB‘áÉyvˆÖOMü‚ýžšð‚ã(žÂ©‰Úw !±h‡Ãܹ¶{|.¥¹´YgVӀÄC‰×>stream +aØÌDE×xhk–À ] dÔ8° Èxåf®Yì…//ôјôÊ?LhªØÉÝ|ψ!̙‹²=DÁ•_\¢×*ÚEÝêY¹ ·:¥Â7ØV/ep…p—g+ªú=glq굒«Dkuµ©‚‰ñwNÀnÔª,ÆM¤iùo{l½X¹mï!Zjº]RBš.ª ,M¹¬pÙm.N{%ºå¡¶K²¥ê}ÍZj Ñ®½2Z”Ô­ÇI³\\ÖŒ,ëjNKÆZ՝7õñʇE­!¹ÒÀnj%ïªbE$²­òÉlR%ŁJEGF¿–锐·ÊK'ÀN+E§”*›ÒV´ôª”7Ðöªú Y‹zGžŸÞ0@Ö+0lPl’ñ: Òø­º/J‹,Ě,‚˜ÿ0øÔ[u¾—$X/œ +yÇH + ϯiJ]û~«Ðñì[UU[ua’µ*×7T«ÖSoDˆB¥ïï`’‹œ1ˆL­*1­^/h• Uϯž%1xS«z·™¢VÕT+·—4‡A–WN|ÄÏ*°KKYaó£kB Gsi·}›Yºt7 4 í «D„æžöçu>Í},éwB:”Ðw!Í9??Ò øÏc&m•7X 5/7=œñîÖ'¸5Fp -¹TpЅª¼ ´¬èÒhès3fb£Ký ïyï Œ^å{Ì<õý1ƒ_ºòà€É‰õúŽnµE½âÌQ.½î_ƒ"™ QuK%ƒí)êª'ûºa§ØxvŽ.h«ìÁÿ‰û` ¦¦ÅcuTFråYB7Áõµ¨44gŸ +dÀQ&x` ’ÒV«IÈÒ哒>ÿ€#B}´ƒ©ÑnÐGÏð¡q2¿.Ÿbë"ù¦¾(°}ûЄ•š`iˆ†×oÞú™D p­l°a^°ïáñýã(÷:åy;ÀÈGçdÕÔ¶º%o&A›àEdÿÜél|2ÜÁÑĂ´t°W1½„î ¬5<ɳ¦J,Ò¬DÂX8ì>¶úÁLìi֔%âc3§Ÿì¥ÎlïúTšÙƒ½‹ ™}}¨˜1«F×ãEJ{·¦lYtˆÜãiWˆtxMU² §/‹S¨Ã ÀIº,)1ìđ5?[áQ.€H¥F83Mx]³)"^ÚF|uÌ|“À æ/% ÐáUoO—iÝý»V;]Îü¸ˆÆ,)³.‘z²eâÆÉ!GøÞ aô`-£et–/>0pâgáÂÂ=Xì6'Šxß_££HuÝD_.ê?¨Ž Å¡îF ^ߕ„†üÈ:œ+ڎZNL…iCæXù@Ó­#÷HLJJÛÊ Ó:Ia,ò÷YÃÙñ¥÷¨³»æUq¹rN* è˜.jÉ0™‘¯˜_’Àû›fÉölC^‹@U’i†ÿtXpj†U.YIžã)Œw؁Uw‡Q Á·m)}É&-U…ÜÂcþ¾ Ín[¯)àýWƒMº¦ŽFc’^ú{I>à¿Šª¤}ÁuTžáû¤bÍøe§ûðši¦"k¤8-sú¤‚Ø—"˜Qoi]èƒ+ÙxìƑ™#&nꊯD—Éi:P7"æ“«à¤#°ã%¬•ÖÁ+­úî*\†¸Ï×éd Ú.³¤m:$Øt"¸+» +å G +ƒê¢Ï@MSg‡”ŠxP¯Ç©£q‰$ºqŠ·lá÷6C7!>n@•h8w÷åZ§¹º.B÷½dçó¹²C€(P',¹èÿ_«ƒ.½ƒÞÛõ>©4Gøu™/£[‘éýqÜ«?iµ†ÌY³Áĵ‘@ªe÷í©oOvÑ`ßOq¿Ã.ÇݺÍ0èëò–åP(‹¶ÿãx˜þ žX +Âß¡®qìv¬ÜÞ¹1I’/ã²Jkpf‘¸?×]ábì1T‘šOÝ¥w—¹À`’Y¡ó`›‚þƝ˜ÿa/v‚Úu–§A.ˆµhWmSi,ÁƒM+üЬ'Eï[¸‚Ö:·^mìãßÔr^[Û|ÚþÑ荥¢–LvUÅ}¡ +ž Ÿ?ÃvÖuíÄ)¯‚µ›>õê2!l“•ì²Ï•Tn*‹5Qû3ÙK‘‘B¤<’GyƉ‡3*…4XX1róQ ¤¥¡™Mئ,¡>U5DÊ~Gèè§ÌÀ<ù‚gÅuª‡´G`%ž¬áRÙApï]«?­NÜF ð8‚ƒ>”ÒMâƒwT »Ò¥ªƒ†:­C 3!²Yoí'15 ë$¼­H»Ðìd%TïÔ‡½,õ3s%—•¡ª%©.š_U‡j‚u®êÚL‹d˜÷ÅSÇY*%®b(©û@ë6EŽ:7¥LÔ†l¼ pÇè¡@™+ì@Gw áu$$CÇâ¬)•´éSF¨™4màÂd@^‚Q•½}À¾™©ðJ#øæõ”eÐՈ?°'Ï/iŽ9üÈ2ÉgqC`Pó>šÁ+íX¸œÌµ (òðœŒ\IËRŒ¸DSdÉ '|,:Ì`.“¶ATð"„€\jÀ +uˆõPoW € +óXnø«1ìþ£5g$–•\'ûJ!†N×”C¡^´åH3{XµOÒ @/q“'lá{÷½þ䭇‚îqHÞ¨‚XØ÷ýý ‹ ˜þ ®ÕZhÀYȳum„¾cÊÊKg÷™°ËóKë ’†‰“ Åß¼CÝ©íø3\ÃöM„öïÐœ‚,Œ¾Ö½oeµ ùãÞid —¨Tú)s”àWý©ù/=ž.é3c¦qÉWD^D G¿JÖh³ô +6Ië>KÅgË8è£j–Nmæ)n²…MдƜˈ8”÷Öþ®“ù$¥ztmÄÃ`J]èÂّÁÅÉ:*¤£ØêäV0[(ϸ7!”’1}bPØ«¤J"¶µZE .¾i0«KJZ‹#ˈÔR‹´4…’Ìh“Ë¥'[’(üûǧµ¬N>,÷ñn¤…z3`‚ª09ÌäMî“ù¤é;¤—´z]™ßF y¼î¢ÇT×ՕPߢaQÑ{‚’Ù…H´†’8-ÛY¡³CoEžde£Ç†.t Ò@•lö³(ŠIü|¶Û­‰6è裃§~¢Ã’µ™µ] CБp†ÁÏß©0°ø½5¼øá¦4ßRÙë§>¸ÇÀûҋÿ9셚îRY ŽEèŸs¥‡í؋/žè|½À΁Õú̽È:ëLM½9Ùƒï ¥éý@8ӍÈˎ»”¾/c$ùNüŠ/?[Ó=5»`ø–àËGÛ£¢ôÒí¹ÉÆU22{ʲÐjÄË­'AáJG° FM%-žLp%µã|§û<2Ü8b2:5)ÆƤ5Bµ3`ÊEhTi¶Ô DZ1E"Œìîi=¡‚¿Uèj’$'‘À¤kj×+Ò ²ÓòlúÁ™j&\0µ~–žFX­sßۇŽúpép·Âp(¾4üкUd+ßBrInÊoÎâUÃÇ5—j+•|£½âhÿšZÞò7¹â2µ¨ϕçÙ5¯¬Ux³Âűe:aACòÆ^ +'Xâ@c?¨PHǸŠò4Ô\*Q~FÓÚj¬0øçåIFE¤Ð¯Qò¬‹$sµÂ!Ÿ®ÿHÙ®+ª‘׸^yçÄv#4-ç×\IU¯´‰Á঴?mÄdŽýüïXò=>)Óö£ÔZ×çý˜^Ùs$ì|›Ò¿èÏJ0•úæ ‡Ó`Ò&fÜ©ÊqšF™b+SŸÜòiÕéϤð âäåÍ`RÀªR`„ŒAn@ƒ­öä܅ÜýœmùÆS ßD~±NþoLyúîÃî JýWìO¤@Öh˜VmÆï‰t Øý<­–‰˜»¯ÜB^Ä\F]„‘f×ïÇÜ/5FƦÛKø‚–*—RãΑϯ>K3KP¡h#QÚyXœˆQ¯§]XÚ,Á"äHM8UBh”Øã® •«ä'M7-Aô”8d’Æy9Àz"Ê|èz$¯PGú»*¶ÚjþðC¨£\¾ Y5ä°§ò5# S½F7}wi 0!ê«Š&ï°H¡˜(ê>[”<:ò¦!ÄÏÂÃß>u Ù A(Æ—Šo$_O®ÚqJXj}ŽGh“Pn“ü²‘pWF‚Ž“¾ •j@ÁM<ƒÁ Äu†Ëgo§»Ì¢Ô!(Úv¦*Н*ž«îYO9â; +h|w~y&Òmp™¥½²Æ¤z‰m`@¥Èxõ®ß}zÐÓ4Õ=8{ˆÂTåã‰Ì6@e4pÕ:RW9îÛ®ìò«àé-É™Ä}Á9,WšóêB­µÓwki’¸JUºâ]9ï3 +O¦zfÞû矣˜È’7_ÝÎQ€-‡Å,8Y«¸ϺäÅÄ;$.¤IVLŒx½)Àí(iñW8LV3ôs9Ü_ð]›çh2…jèYÐÏôf‘€¦ÆÈK¿øðŠHì£ÝK!k¶Y¬þõ ¯ZXÙ6h XC-:8îÚss…Hvø8óAΚ¨œ8Þê¯îä +J„dŒä´+|•œ(ïóì¢2 )ázpޗ{2€Ý¨Ÿƒ&ªµÂd W‰n/fÐt˜ºDR¸ÌÁ¬ÁIqªbVDcñnc{!ÒÍvî{ñÃkRºh玠Ñî;¤7:´+þºå0A¹¢@½–µ]ðîELrÇû‘_¯Š2ËJÄ«Ë:ÞzÇ-ýíj”Ó='m…4W}6É~ÀÇG¤/sÞ"Î|͂)ʼÐÐ`M,CŸô‡BNïSÍÒ@% 蕵¦ß^ã«ªj°HË.)³²(äM `®m·g« ûRØöót;ÿÀNûë. â «ª½b•/%9À™?S2¤ÿG0+ž$˜¸ŒBJD8ÄÛ1ü7PçÖÎoÓ;°÷8 püsªW®*:Ž­XÍ<۝°–vunRÜÑ17¤ 50ˆ½WßaVb9lÜÙÍÍˣƬ¦×Rgf¤ƒ€uŒ °3úLß²æ<Š/ ]2:äÕNt̹L·M9‚±B½.‹úD×lBÐ*È ˜ŽC«aµ°CâÒ%]îj8ùûoÍãíU÷.à .Co—u(dLy{d?y…áï46¡px”ôÆt9Ýðé#B +ÙÍ­ô²)‚È=`º#¸Ö?Š +zÃ\-u,ç˜~ 6=§ <|‡@¹À}„(P‰Åg‰Rš(ˆÊ{bTªüJ–ã²o}€]e©QÝäÿ¾lû¼ºØҊÛ8%'ˆs:ÖSƒí‰ü<×$ä3²6B/ݑ!┼ +üþèVäÈ´CÔO…ŽœØۏ 8rY÷ªv#‡>ð8ÐÝ5r¯ÊkÂ$÷+‘BüÚݖÃÃ*SMl—œš)çä›SrȐ¸@Žûd/õ^J“dÌà87rIX‘ß¡èÃmŽ£Nmƒˆ‹Z'ŒÕ‚Ž£Kœèâ/Ô¿Ùå¸ã<%’ôó~OMr\¥œ)ˆ°™ãÊúËþKˆzmœJ\âˆÎ7[‰ûF+RøÂí•Ä%Á0LÀ”¸/e(à{–¸¢R$²¬Éú~æþÁáÕø#qÛü…aиš É ‘ +A'÷€)Arë‘U…HÈbr.Ž@ô1¹Gé.V%Gã廄G™’¼äŠGôݗ\å<9­ä¬AGˆöc Il끳÷[⺩½µ“Yú€_ (7\<Çô#ŒÇ‹;™@Ù¯_ËÚéTzw΋Ձ~øçLŒÚ$ãEÖ*']G¸†=¹·7€gaª%¤ûùMCŒw%œ‹qÊÁœÕ,SPœ5%øÜ]ᛡxT1pŠâ0;-Êy÷Qüïúý»…ŠßG¡_@FÌ/£xÁm¹7@ÅOñr\^ãÉ&µO¼[?‡ÇøUû}â03ståÄÏø$LO@ü‰Ç!ËC†…žxãÏњOܐÜ"N¼—Û$±ÐÍ0n ™ÃÂx‡úæ`Ž³Ã™ä[€@Ý5Ç `(‚¾PJŽ­x$Ìñ·xÚ¶É_ãáÔÜ1Rõ]Œ©ŠŽ—&÷KϽϟ³ÌIïïm/=Óñžï,ò¬)èÜñúØ%Æ/L¤Dq<’AKC˜šã(»ÏD˜ RdzëØå9^ž‚&J|Sïxº±i‘y÷êYÔø¿Ë_åFš÷¬ø!n;…¨Á³s‹Á‹YUy¬H\¿PGR^P)p–eBæÐIïZkô㾟)ŽpßÉÍ ¶ÀXÇ`ÕsšöH~ +ÁUšÊ#ú®åsf›yø7RÎú-æß壼áT¼æ£;hpTÿ¦y¹ð®‘x,‰g/ +N–/ðõ:?é&µF&Ïs=Þ´'¼s€’ø0š›cj'ø“3¤0Z†jF€À jVL@siIRöÇ`_o\ä÷"Œ +V%(²-åpÂþÎL¢È12²%¡µu®H¦rÊü™(òšUQêSžÑÁ5š­ý§­ò™jZ)¼º“?Öڌ³ÌL‘“¬ê‘—´ Q»@ùÁq†È–Ó4† ‰iõ¼¢_IÆþø‰8MP)‚JŠÚ*~?h,Å£ø–Q„vu¼ÌW¯G„šŽŸ}~dý™¤O"ëyËG÷ÏÜL;Z»™v…TÒF‰;xô Xƒ\Ì÷–…¡jàP¦ÆãO KaÁ@ðM҈°¡IUèŒÏ*™`ši³ê¤¤¿ó«Èâ¾2Ê1"sÌ"ŠÂ¢Ì‚%™Í+‘Ù …3¢î!#eb9³g–S™QWô™ +,»ðÐЕH¹=pSFD”@€` Œ@cC”†·0 +i å ÁâB˜ž J” aµe™ £"*j½^D¤R‰èšY–ॄ÷LÊ2YŠ²{Ž#!‰Ûýé¢~Nي´ ûíå†ÅeZ¯jÅ+4C²šxM£&mâ£Î~NcFJ¦1‰LÇ"i ññKëq’ÞC[Ä..ç¡#¦–µv³tÚ͎Éífç`]SQ{)Õyû»Þ+y(Ðb"aM¤c¬4Õ3£ài(éU¢•¢ï´~§U֏Œõ†Ô¥>ì©ÜºŒÖj͐ŒµFäøG]!2Sw$ˆ(ø®ü¬UÝ{ +ÂY¬ÊÖy§Ruu­ì¸dÊz°¶ÊÁ ÕTÏ-={´£ÎìkW‹+‘ê>·H!ݘ,åTfŸi)>ӗâAš†ïJw¡jM¦¸2Õ=ÜuÎÊ¢?¥ ï‘c~èSí9äBª¯éòdÂwåÜį)äq]£¼ª‚zZÈ9=T“Y5É:-$åÐü(=eÐü(-$"cæª÷£¤bÔúkQüɽ·ÏC!M½”!©¹ìþB÷$”˜¾ÂvëYN_“¶÷’™z¤§þBF[±È±ô2Rϒ‘ʜԗI%Æg(a*7S5ƒþÄ4žj’AtMôù›óŒ6qžÅÔDR]Š#õeZRLãFùÁ7Ú"/ÑJÍ*Ϩ”gT%$üë2uÍÄëjI|W¯¼£-§Ìù +I}DØbÌÆs­®¿u'¶¢Ãš-îN—ˆÛ>éP©"ÿ¤ì¤Rnµò9ÖL‚lDÇ+VæAÝæ²u4oßQŒæ;g)!ÖfZŸ:F­ÊÈ]$C}éÄѧ!½›šmnÈëë7‘7*êr†«¢éCÈUT\ž(¥yŒR°R:!1®L¹ž”§§ãÍû ' qe*£ÉKõ4ÉR$²ßð­R½Îô³‰fÔZðAßÅÇ¥R®‡^í‰ç£ª¸°Ï‘Qôk|_bŒòóëL¾;#âe­pÐÌ^rÍE3rV‰c\qmá9MÅ@dÓPC5?K´us‘咢Ѷ;{Ê͌NzDNcÑ,>Ä!Q.íi9ÖhúӒ$ª¶Î†^ÑÈ&?HÖô(A¤Ô‡RÁ»¾oWQ½â'XUb\ã\—7ŠHMN—`Œ/#&¥òWA/Z’tcÊDªÓg¢$„*ÖFè1.)1-˜C!´Ôê1R³™“H +Õ'ºuãgQ¬Ÿ–š-$Óµ$CqÞ£ô¼Ï²…ÌY·9.ñg¢Ì)FD– +[æ›ñ2)!‹Ì($5«\h5#9k&tÚLu5Y­(jò‘&4ÛLEš‘£‰n‚æ‹Žf–pU¹5·p­˜³>ï7wÝ<:?;ùÌjF›…‰u*cºÈȝ砗"FV,]ªCǚ´ÂŒBªUSBU˨’•8K[ˆšR¡¡rª–ËÀ#‹oË1VD‘Äí¬˜$$ˆJaÈ-—PE­<'RE±¨ªNU™ÕƒÝ:ý$ÚîŽÅy4§®œ[J™hhfZŸàñx<áBÙÊ& +bW­\‹Åm¸‡j>˜ÿµù^’ºÿwãÆtñáDнÑ71Ææ4²)ƙ›ûL‘ç¤LÌktn‹‘±‘=ç‹6GØø§ðDµ*"™q‘ 22ã³"bZUÔçFÄn,òšE´ pœ‚tŽ ²•·+š˜®‹:’‡ò¾&ïGÄT"ä”/äÜvqÈ;ß?*kÖ%ùŽ·ž’›=H!ٚ^\±Ç•Ø#M©çP=$¹¾w±ø!#]Á:‘F7$ê4¾4‰éù1Á×äáZÐH²œF·<Š6'ÿ–³h´Ò¨„Sžtˆ„;99;¦É䖯hÔ +ÒªDÈ!Ísòê`o(óà,H髍C0@$3¡33ó¡03³‘^èDåº@€``ÞÇ>œÐ;½SԙhÍ!âI‰ÍÆTŠÑ{~a®ÃϯˆÚ¤{m´Í*ä˜×¼V±˜N;RÅ— +é<ә2êYÍ7œÌ‡ãj3¯æÜ<äî]h/×ÃWcn&:é8»bîÿIbCBAªiDY2“*6ô–-­-]f1-=ºêÆ%‰Õ³é‹X„ÄÝ):uÂ':ÃúçKè!ú˜"¶‹ÌAy‰¸´ÌcºZKÄ2oç¹wڔVùüMúÍÔ蘚,Æþ )(¦qúšC¤1;v"¾GoJˆÆ÷H¦rùÑàEJŸÖɧUšŒ"kU!•E›W Y OGS“ª(M֐W£ÝҁgíШ11¢Vƒ¨S4™q)Óª¨qÌ"J‚>QTÚ˘*É<ڊiÌR©¥´J¹˜H£¤ ꃤáG,ö ©ØTÆAC!S’G¿Suà ‰¶s:œ¸ÄÙ«œ+[ZëbyZo|¡Ï6ȊFÕV4ÏhR+ùìDqZ +}ÎQÅ_"=µ”TbŠ™nB’õ%! ÓZ 6‚´ÙÑè´Ó8aiŽhäQ"ʌU„ühËhü£•_•‹…h“MۅKÒI7]Çb±§+M7·.Ï%zQ»9*ú¢pY6z¾\2:)”rN㨐-—NèËeâ"‚Zn†e£^KÊ«×jËkÈÊÖ0jbI=%œ†ps=#’ER…r~Ñ +åŒ +‡r²wpÊ陥•†”!gȉR¹hÂÚ°1Ä~:ãÖl½I³IEõ¦=Ä1¹ˆd1=•+çéÌróVז[ÇÐ_«Ÿ˜Kפy‹ÒÇ[¦ÞÅ.< ndÔªµˆ2RòßER +VdH©šŒXô,„(ßVDyµ(o¹(S¾gè"KQª"/-Ê`8"‚2–ùÅ`lFá¢J i~B“$ó9I«MR8ÚM뗚4iJg¥ƒ„$ +1-dæ;ÿˆÉ²rr?tö-…¢&NŠÆŸ%â e.ûÖ<èÛFÄ ™VTEuèAA«Ë¬óã_ìÐJ&Å÷bŠ&ߪ‰g¬Ê>ʏqC4£DGQˆ‡ƒÈ¡Lkáw条ÎI"Šˆ1i3÷°GÓTÜõ4¢RC7†>ó¢ljêµ ¹c]BDâÍôù ‚ô:v3Æêqë»n zõb-gkEº0×*7.7.Ç V±v–JŸ ÏäÜ#¥¦j8ç„BaIºl”V:ú(NfvVڙÎVRjúWû(Ý×¢LÄ5Ú#ª}´zMØMXz´Z•5¯”¢³m {VMV•—*]ô2Œh]ȓ—Ón;œš_ZLuÝ{5Rûý¡ÓâqõÃØcÊô÷4KÍ1õEÐÇpýñië.“(‹VQ™5§“PçD¢²ØTzíDŠÅe›ðóÏ­ëȚ.E¡‰Ù+|ç¢J,‹™GZ…Ä&­éÔçßÊtŸÎ[osûÍCä+ª +GÄ~*¬ØÈÛÎéEF)×x¶¨¨ó‘ñªŽ+ÕèŒsޛ­Š±i=Ù"&ñzÜLáFÖ1'j›ÊDH¾´huY­Êœê읙ÒDUz›*Ÿ•Ìˆ­5ÂâiíŸÈJîÕø³L„æ)1Ýsnȍš6|9RIěV·šY÷‘W1 uJ$¯]¯P²JÉ`ÂC2ԑÐ!gBž[¼KŃÔ+ðRt¹\­ª)¸ø:HcXùÿˆŠ8t "r¹\.ì}YU&B{™wºêL"‘ð6ž˜é‰¸p6!m<ªÔ׺ˆ…t£rïëÞëOEI©ã•ŒH$ì‡ҏ\Dzý%!Ñ[%«6o2Iªþ„%…æx“·BÍJCT)ÙfÊ ºbŠl{To䫱DÌl䊑•\ +“+HQãxPÆ"âDQQf#uJ^Ýá£k´ÙD8ëûÉJ‰‰Õ«V¹;S{'1×[‹"‰gj*}(¯M;²J ;”ð¨¦R¹¡¢–à +¯÷f2•ŽL·7h?œþÉ"L¥˜ŠóƒÕ¿0c(4'"sI™3Y¢>I£Ø©8Å*҅CŽ~e]JŽ)Ã8©B„ ÎeI)õ³c¬#;M›Da£$¿Ê*³n3¶.tBÄ`”_é¬ ‹d”s,)k?>ڏ߆±zd'iÑdÒzSî«x¦ig»Á’/’¢%MeÂ$MÙ|³ÒAGGŽ2‰"þ˜AUµªÕ¶úµ`?Qº§£‚²ehϱ²#oÐՊN+h%‘Vp:¢VÜÕ഍™7!~ÆóF+™¼Q;è…Î]Q—j¼j2H’áF“}›b˜ª©š¢”§Š2UÄjÐGh$kñ©¢|ņ¨Öf±˜Í­Š ©_Š¬4"bd‰½Ӊ˜äT­Æ÷Xܙ2…P…6B¦ ï +ʌ®š¤Év9¥~ˆdÊjq9ÍÍPxÒ­+ᶥֽˆZ)“}d³"C‘‘ÍçÝØŒ;r¹>YAäœSŸÈiúøZÿ!+Z2¥à…Q! +¢°«éIA~_ÇzT×Ⱦ¤TÛWÇ|™ù¸Zc´šÙ¥:ûjd<9 +ù¡’ž•W|‰h­‡2í‡"Ãq "­çpý¬5kƒV {ùm%‰Ã ’/"ÛÎP?ýG ¶¢Ñ[âNGÃSzÖ!Ù!V‘;[½°§Mè4²d¢¨É-’T¶øš !)fnwq¾NâECó–ÆðE¬XL°Š8ÑÑYÄ9O&«HÜ-'"‰hÆP†q®ª\täJk­³ëIÇ£–Úñ.-yçJ#¶¬,º88$½98rZE9x¾c%ˆ4 +±H ƒB"¶Uµ51dó‡îªz.sü™!‹xô¡‰ǟ°stà(Ÿ…i·*ވC„*R©øǧeڍ‹’L•A‰ +—”Yêº$9 1L¸Þre 梚!ŋ¶š£ä^¬Íd”2î!¬ +v·ôeÜ—Hm118ô¸Kÿ‘ôØ´"<ŽBÓLL•HìÁQ&H¤1k†53oqÆgՌý„.vdŸ'ž8žXü‰T”’ýÈ҆-;¶®)ú(×ÖrBµ}+×áæáD(j8nD¸—³;ªÊ¸Ë:m°óÖNŦ1ŒMã–”¸‚¤œCçн"µ§âbE +»¤‘8ž°a¨„5Gj³°Ð Báð¼jý»d"> †B1hdzB­ @€ZŸÌ3òFèàÂæ?bxP… D©ÊÂÄI„p¡ ÆÒúP\û^4F~ eµ¾éŽ­Ot=< ÞúÈ‚më܁px@Æ8úG¶‡†{g;ÇSë+wàÈËýÒ (þáhý¤õµƒ‡ âÁSÖ×ðáA‰ö’õUöm²?ÇúX—¬ï‰ÿý‚™õÙèd´¾ÿºgµbí(ĨÌúôÙ{´ƒˆìÀÛí×ÁäØ:8Yµb—õõËêÀgw›0ê ?5Ìr‰tàüˆBV€ÐÈúØÄsà}IY_«oڗD·¬ÚÌÌ5¥]Ðc*NÖ'¶ä×(ä …å8.ëΗ‰ƒäépˆDáÀsZp°óœBždtå7€öð ÄÑyƒ±›àï¯mu÷dn°Ò½Üà؄tnƒðpØÆsÚàœõ9x60¦˜ÜµÒ'®lbÈë`ƒ5G¯Áōk•õ•DkàŒód}ÉþߨÙNÖg±WÕ UU Ú¦Ã7Ô@—õªÓàÿ‰ip“/`yù¤Ÿ›Gƒb­háˆþ¬´>¯>ã#Jžû[d g,Ø pM¡è;Ç æ Z¦Æ œÖŒAÖË@ õéhà³¾Ò« OQ7[(×Ädâ<2@Kë£åÈ@²|øPȏ™á¥cp÷c01©1(¶0ùˆ,jh}2Äzb:bàþña0ü5 ¾ ƒ–y„ArÖg[ƒAF¶|k 7ë Ì €Áâ¿_pÚw_4µ/Hä Œ³>¡m/¾Ÿvbí 4zkÖ'1òˆI§¿  í±YŸ,­ €Õ¬ÌIàßÍS¯ä‚‡â‚Ô¬ÏJà‚ê9´‘v 0oÁڝÍR(´óg}Ãw ¤õµñXï²>¯Ô Q ²à¼Ëʆƒ· ÆëÍÑéµ>‹\w,oÁ´¾.a­ï}BF[“òZo;á-X¶×úÜ7P|ÞÐuïqŠœƒ`Ýúä/®ï¿õ¨¹ËúŽ½Ýõ䭏ªê-ÍÚ<¼õ@“±¼S[ߏ·`ÔºÓúF†ZY¼3òH¼ÔûðDÑú‰¼•ý§Aº©ßï°2š-@¿®‰m}MT <‘ùÍÞ¥a[_UhÕ[ߜ³€´`@÷' D V­Ï[±ÀQ0,0:,¸=}“¯ ½9]A‚®Àü_+øµ9+XÒú+æÅÌ«@Ù¶« Jë›*« Ài ZŸZ¬Ùþ´Œ;ÔØúTOLìڝ¯³d·¾¯‰EA,„*××¢*PÝúfdô”¤p}ïT¯¼Š *¨Íw./;vrë“qq}ÿ¥ +Þ¹þ>o}܄QaÄÖW‹TÁê_ï¯TAT˱ñ 9¢‘SÉNcs?“自 :ßú@çPX[_™LpŒMU°ø1øƒµ¾·uë属* Yï3ä‚o}›àª  †×W—(¶õñ1¾Ÿª€›^çqŸ*Èës¢*H»×ú³õ¤*ðšã­©5 pûPH´T€¼|õ $M„ +aAtë›î)ðOô,+Îó(0Î`»lúÖçD><!q}«ÆÄ,¤ …îtÝú–xåú8YZlx +’óÓ>ΑØÁÈ(æõÕ$C/'ˆ¦Jřp„rP÷^Ÿ¶qÃ—å)@ÜÔ×wCà××®§ÀÕϨ3;Iå‡È€}»Žg;Ÿ‚SŸ‚‚— öI´·Ÿ‚´ ¨ ýS°Û~ +2¸} + ö1ûš—°ïµƒ‡}›\ÑŠGÂ>ýsûf| +ö3>w•uh’>ô.âŽú)ÐëY^¾j*9H ó§ :8ÕɦÔìâ½»ŸÁ¾C†² "ç<–£´o ×w,2‚¾x¥9É>5*#ˆÍˁ›~ã-ÇQì=Eðîy"}•r^_©øÓ!ìAÒ^¤àæ!âõ‰áY !¬×ç€$®ÊÑ’_ŸfQôƒÁ¿ƒêù~BÐÇ#ƒ@ ìc”‚à9,ìDA€ö B=½a_þ`炖BWÿj†üÐÂ>jþ€l:ªøçð\&á¨z>ûÀÈkÚo°¯9”ú™fÉTðÞ…4{}Uˆ IåWdÀ¾1ë€KgÄË:Nß!ð@ù›EÜ[@Áá×7¶rÀ ížuà_êG˜°£Ð&𝾾ZPÙe†¯èæ€p¸ %ÄlŠuâ´W8 êק8€öøҀïÆ@[ªŠ¹ëÛmàí'AU$S0Ï]ÉîYQàªØ'¶¨8,nƒ„Â>`Š…  Òôˆua¯žî–ßóý Œå=¸y‘å“ÌÀŽÃ˜gÖ2ì;¨¥€P–c’—þˆix‰Á‘P`ˆP`JìãÞØó™t [bûæÝғÔ̊²L`Ò组 ü½8m†¾x™8ñêIàá¨$ 6ì;1Ø7yšA|=QlãFàÎFà8®”ž2E)2tA`é8ÚÓ! >1oB…+XhAù„01 páØ_ýŽü€ÔK„ØçPNEaŒ=€ëzÀ×y< Eìkû𥑵–[ÖÆ5:`±jX쏐<ˆ’bŸƒB%t°±p ØWLØm@¨EûŽ- _¬5\\BþêßWØa¶5€•ØLJp”H®Š‡}®"aß’‹is‰¯‘Ä»ÀöÝQ ™3- @_¡‹Á>²hž–0‚ ˜3€MË{*ì;ŠÃ>΀7±ï²öµ@!þfúµ ³„yÇT'XEöíÝøC l,Aœ7”}>;ú„<9P<ìÃÀpCš3@ÿаtï ¤ý³¡r bß·À„dã ÈzGJ®C,‘Agñ¹g‰Þ Ÿ6vÆú{3 Àk3À¸j¬;4.Ä8ý‘bßL‘FtÊ@(’3ŽØ7^ͼ€Ãn8lä%ö57T¼l{Ëï#oÎ'Ò aŸÂOä£é:Un£FåBvÊX*êXyc@ìp ¶X¸6ÈåpÒcÕNeDÔê¼àE¡ºÚp× ßÊ5O Œ€ÕDB‘ 0`Àl•(¤“{ݽ™'\° ¹ ˜ÿ–=:D¿åYN½D€ “ð ¹pn +X¿»ûUœ`à—üB÷bî2 (·ª Fç‡äKÕø 2eW€!ª‰¡¬€”…ÂQwŸŽÔAÝD™6@¦"‘͸Zl\ +ÎNó@Écos§QæIÇkÅŒR€û™r£‹DS å*ñ·zK):9¡Æ¢\mš€l«´u‹8?¼L¦glw( Ʌê¹ë%À È"‹ïó|ŒU €ÛÂÓãLÞ* +¾¥?$€«˜› lçRjH®?[)`ñŸ#­È¾‘m\€¢å—•–í/Œ¤(ù›xun0ìmd!`ÑEÞ³†&´ÅøC‹%ŸG'#þ"ÓöÔ¯Þàö6™¸ª¤‡¡Àm‰Ö¢ùªÔ¿ë趐äcMŠì¥ÜÅ<âÚÄB¡ó҇'ŸìÃ\C™RèC Y8ù˜Yl*ù‰Åfý*±ùm³ðÎÀ… ‹5}`ʼn*˜Ñ½[³ÔóF¦­BÒ ¢™è^)3ú¶„  PÐF®nS¡(>RR·´k¨Žúx„–ŒôÃS)ÁÔª €…Osî|F‚ °ØHÑãÉ…äÖžVûuÉqªÈðE0´P%¸?i¤ö;Fª©C Å¼à¤â'À{¤gûxK úÁ”–ªÔ #6Ù딫Y|j?@6¨üàh$Àùp6C#a-„="hÚ8ÿìVúŒ‚EàkK êýÖaOûà­ç%Ñ=ÚðIL¶àt +’äˆE[MÎBÝ·¸ŠnË- ɾ8 Í ICTªá@Pß(†ÿòð¶žÃMÙE%÷Z8=$Û°4 ×Qo¿ƒ™o ´Tè[ð3ÐÀݟx2Èõ‘Mª™Îßç  ‹¡p_Ø{Ðf¬»õ"“"@‘ýä;p!½RêȲuûbˆ@øušb«ec Àÿð_6­vƒT ÜÔ°Ð7S•,cï³0·¾{@€é,¥ÙáëÑc$Ãxe±RôÀL<æNã ÈE¾Þ€¾ 2°” =Œ‘¶Áyˆp¤iH +53X䦍&"—Ðxs"ÛíâÂÜ9Ÿ›V¤ìIà?²\Òç­3B•ø÷Uq2Éñ pÐSdv-üR6{Ô¡¬ñ/ψ·ƒ‹è|ò§Ó €3q&èá~mÊÿ_“øÅýêŠÒð˜”ÿ·ê€R¥v4ãÿÅÄøqw}Ö£ÿÀ\ ÚÉ᳞À*L"Il$lÍ"dþó¿bAü߅ÖO*Svÿóêôc!Ó]ƒìÿK,c´Â…JbŒ!N6ÂX¸Î/IÞ" øÃl·ÃÞuüß + ÿéR· +õH áíP/Á`܉.hÙìKt#…îçPÚsì©»îÇ}h|~Š®Þˆì_°Î‘©†:ÏØM§ì-6Iє@dÿ–ØŠ0ÆŗJ  ٟO ˜ù<®×MyÙßFæTìBö9…òâ×#ûÏe£Ô”N.Eüöä_dÖçÚNc‚œÍh²Ë÷¡ ¸éáÏÔì8/Èþ~M(¼‰xvXr*@7Eñ–ʙ¾ªK d@döK“ÖÀ³®%ù)¿‡&"ÓzÞ²ÿO™k”SmLf!ˆäÐ]àYväř,Döÿ’Ð¥Y慼uG\Ôÿ¤Ï_NðáB³jé|ìo²sˆ¢¦ +ÄÌ0Övó؟·Qó3üîý;òëÑ­²c쯅U(ðT>;œábÿO¥ ³âÍ|5ýùœ&aÃ̔¨!(œÉúÅþPޗ5ýd‹N6¨K2‰›Ø¿ã™tž×FçÄþ÷Á…êa3b¹WÁ=¾P™R’ ÇÊ8s7ÕBì/c[é¸>7ô÷ÌðýÃwiJá7¼9…¡”=^Iì¹ã¦¿#<û“ÞþLžD]@Œ¿…פŠhµ"'ÿùGÓÒ ¡#œrTÅþ«ËC´ž@AoZj…Ë£i“Hd3¤fÕ+4#7GñÅþU jpV·*þÀ}Çœcÿg?¬éS=֔àϞ<id®IÒv¼rqdÿùþþûRdÿv„tà¬ËyNRØPF¼|㘠†8êÿ!§è :D dg¤2ÏVŠ#ûç*ø‚«uRÃqÀ#û÷Fö}¨ÙLiÛØÈþÙGZEöoÊbW m?Е8]ܶþy†ìk!2“)§6MÛ^7u|«Õ=g£ËzfZý½v°tRMIý¿]€£þi~܉úG,©±‡úûÌ@Ò8Ô?ÈC²œ¤ñõ3ûâŸÈ ˆô_Œ#‚ýí äÖ¡Ær¢þՁR£þWæº?só¶Âïg<õ7L­´*ú@ðú#ˆX{§K/v)=[FýmÅ¿<—öSï1ê5y%ø¨ÿ+dv?ê}€~à92êŸ1f‡5Ï-¢a%ö֒,ú Dñ-s2Aý\–lÃè '6€úç¦_›óƒ /¨?yP—<“R:{ê ҄†6¨?¿ô¤+ )Aý) 9Òæ{Õxü.áê_b2¾þT:L$’gþ½rèµb­eQŠP¹!ÖÅ ­DQPÿëÊB,Aý¹P_'ÉyÞ›jWâ„ú_buu„Bý£îc"õw&ÍWÂ89ÅÄNäpXQÿ»;IÓÆlQÿdéñn[u@8쀼’ ª{cD€DýïÕ0jÞËúa#(€!½5yQÿ§4S•1L `õÿ¹ÆŸ)@ŽQ}ªäþ³Œ»õÇ°•MPKÓiú,"þºe;ŸWjˆ{Òßq Žú£‘!궐€’ ¥eˆ>M5hø²‡|gÜé0Ð?ÌrJ¶ð¹-d8ÃÉ%×yÝÆÙŸÕ”Õ΁!ñ9êO±^™£ÍðsY¿A_¢þh/pÄ +âð?…R`ò£Ñ¢þÐEuY˜¡šÏ•MÐ<@cJÙQ +IXډúÿGmC)²WÔ?½ÌXÉ®ñöý&3„fÒ +^ï¶ë_WIŠ±¹ùÛ«:ca²©?:9Ab¾pÈsØ&õ'õI cäƒß’·´Þn«;ÕËÿ’^,¥þ½Híü6$å¥þ1ŠEx +@‘e‰—ú£0K#ÕÞ«jėú«”Ãåœ*ò|\êÿ@rs&*™Ê‹ëÔ?þ’èa³SÿêDF­V£kk¶è0õw’¿o—+[ 5&A.¨âíZJ¦þêHÉô “2I7õçvRdú‚ Ö§ BÁ ïÐîX«¿}_h"![ÿJö)ýÿ.õÖ(×G+÷ýWÃþÀ‹'ˆŽ ?!ÐÀ%>^ +¢ß+3Iùk<U§ÝÃúæ!CTÓÜYáÌü/éu¡BoA]®ß»üí±ØÅæx +*¼ë-ÌÚö\£Ê%ݹ;}HØRϤýEÈ?²Ê’¼\+ƒñ”èÿÿ?€:Àlg¶Àøsú 1õô™üpñæò.P7œ•a­óöð÷;üÇÅí$P/ô“þ!¿L,ðB þ·s»ˆê8Ø!‚ú©EdOaú?nkêó ±¾Ð¤Z1éÏ¥Öïè6¿±óò(Yb÷Çäx\Šþ&mZè_wK—™øýPÔè·ÄD ýsŸïT̆Ué£ ‚ƒ9 ¤Ó1¤ük¦ª¹e©Ûäoñ!ŒM?$“ä'ÃT”—£Þõ‰üóf$³"ѐ?ss+–DìðÿJ?ìøõ«†F¹ðÌömüG|³å“-¿·Œºîå6¶øNÒ ‘ñþ'Å¿£±2šÄŸgœÓ?r‹p þ…>1 ;j©Gp+Ý ?³ñßµ¼ƒ¥7ÏS`KøŒŽ"0èDþðÃ(Ù1Fü›†ñï¾h|ß.Ì®ÀoH‚¼ |éÒÖûÐ €?åõ2ÿWÐÓ.B%yøûEœl‘Æ€Ì2~ß獶87tXú·€›ïó@°`óµkسê䎡;-ðHpº÷Én§#·åŽ3ú¹nže|ɅŠÊˆz?ïi! [Þw½u*Ð]@@ ï6ì ˜x™ÏçqÑT‡Ë +ì>! võšüé¾Ge7÷(V Õ´-vîg§éÀùó5óRî‹Ô j 6mŒûêBœ]Ëóá„ûaÞ¾w_.Üc÷öÓdìª +Úrû+1@t(ê½jûÆØHÐvöDaÍÂö=ÝbÄ¡9»!*.ACˆÎ{c=í“ÿÞ#’Óþù‰PѾ7Ò iÓ©óú!žý°Ú^0`u¿õ™}mçû|‰^©ì_uZª™ý¯'€-µ´@ûçds¼î»L<ì»ds ÌAËô°T­ƒ\Bë…Mü/½Q¬_&|zØ¿‹Ê7Ùú‡ýå2<èì?'UÔxù{¯G ±/R0öL‹!¹ªZ¦Ï@ìÛÓµ³8‡û9rt ™Ój0 /Ô¶|gê0SÞIŒØÇAE¸ì¢,} MSD{™$±oH«ú¾-\÷K<[œ\ŒØÏn W ö)P!c kDZíR] öù¬>à®e¾ø°ïs¥'ěMØ\Ì_N‹pÃäaߔI4õÂÇÅ/L©ö{Ï3'…eësØ?4ðÉè°o2¥o=Düó<9ì»ÜxVÜh6ãÎSöCFڈçýÆê‰hÿ\–vûFiBžE[PGÐæÊc„‰õa_‡£'P­u@ž³Z¦a4Mɚ«äc°?:ÆXZ¦—ºÁ~ýûBܬ‘‡î½Ó‡ È-j€ìÑëWÙbÛýP\Ιã%»ÉGzýK¿{œã‹Ýèb‡cú1b…„ßÆ©×?¼/œM܇µ vý„äJ÷Žº>•ØK ʁÐ-L'§®oêy)ùXÀuý¯Ç”ÛuÉh¿D6ëS)jˆëú£ÊNe]ˆþ3ï+•Å£C`ÙõC㠍°äúÊ%;Q…AYö¶>ƒ.¡ ”î{Ž‘£´þ þk­Z5 +ñ£"ïnq&QXõ R÷ )ß +ÔGç# +]–Oßâë]ÚQÖѝ>"ç|Ñïô…ÍÀ4PžÃ% y§Ï¡AðôÙµ±9¡,œ¢îô#VåŸ3Añô ùƵâ‘WåC—%dr(&ž¾´­{O‰ÅӏÅ4ÿVÄÓw´a~Ô{ˆhFꍊñPaÜ£# |@T¨8ôtZS¦§ST•Ä9H{úݏ‚iÐƞþ;€¦=I ³§O*ÜíU¶÷Äqäuìé#¯iðVöôÇÙ UbäÓß"¡4Ńå.Ìæô茶3Iehgœü¹Ÿ) -gjú“Ï: D¸š>8” |Å +v)£¦!Gm±hè—júŸ&(E'ñcPòOÏZÃsTÓWyóq•¦~ƒeKÔÑÚ&oiIÓoVE£ËwL›S,øϬ©é_ùÔ³–ib  V—ljú…TøéV4å*' f*VÓO7Å>%ÍãÚÉNdAMß g]ÁÅ “šþÀÜ¹FÝ¿¦¯Oœ2´`"Бo×ô©›q4dH#¾±Už:÷¨¬F¬ÎG¶Õ–ˆoXøܟS¡>¿Ða®cF›¾ •‘dݸ-7}¶k¬+^¯1GRʗ4núuaà¦()¸Y:¯uFgkïBósMkÓM=BâK`›>dŒµ!ì3ƽV›~0½2!UÝôéX0M4núE£öYË'ÿÃÍ#7}ïb>"tìítºö:ä?‰—yÞôÍy€QVoËîbéMŸ®>¦òTS½…ù¦Oý;-ZwòµxEuì–œï´`å¦o)õ©Ô_ÄxÓ¯KºjPé_(ßôG˜XhW¹éMŸÃÏ?NúVÓÃ7}ïœþù¡OåFZÜô-KËEÊË.Ó§\%~Ì}@C`Õö7€ç:S‹¾dÍsßlZ›Y"c5FpéS6n€ù…Å)}uücšU TŠ’þóîô®Ý¤Ï±wÅ86[æˆûÁÑÏa`>&µ-6ŒþïnL7'>øy¢ÏÅ¥¸‚‰nî'¤›úà_‘œ +}½Þ8AD¡?šØfÈص ŸÖb·Ñ…;y +èë_YŽùùúexˆ×SÄ}U—Nýñ6X#üžç ŸÛæú¿}ç£à°ú€WT¿ÎwÕËþø”Ã1£sþìs)SˆçПçÏrݏ½Ô.†_½’7_ûµyP9´°ºšÍ'µ½¦½+Tó牢 ~Öõ¬Ðü?¿N‰I¤–‡?™äÙÀ‘KÈT„óÅõ¢Uú¶]_#ÒæOWù(ÌOKô$±FF æËÿú.Qóa'Ÿk©Åï +XqÓ¸«å¯+¶k_‡lzr'nžUî°ùß¼>Ãn¬üò]/€¼Mߗ§üŸîY­'n §Am”ÛzùWف/ª|O¾R€a3‹&Ÿ2§ËÑe¤¹’ÏZ¯ÝTòÉ\´$  +I`H>)aK»ø§a#Ÿë1)O·™EòoÀyB/Ëy«Žä·“q¨`7ُ VÌ߈Nã*üôøè‹Ô&Ú:IJŽ¿@O÷JpP ñ+ŽŸj°"Í!6_ى±!b 4~BÌ|–‘® ˆpŒoÙ/ü¥Zõ0S¨•‘K/¾APf"-þI ‹ÿ ƒ¾­%Wñ#×Ëk(‹(¾è-[  ØU2ñûu@—eLßè ñ!Ó>~¸&ѓh6Ä?1ÚyU(`«}ø=-Ô̾úç×هi%køøý›–v0C&†ÿ84”ƒEU“…ßï`…ŸNöýӂ1C‘„?Z…,MöázÄ Ya}ºÁOùEсÇÙ ¾Ëº/W½Ã§J™à7H&”|J«…—-?ÍeÂb>åc‰MNà/¯A—x"­¨€Ï J÷»kàÙƒ?|Õ5Çî/Ðý=ÖÕ¢ º;/÷ûïøÐë©ý2@²õ>’j›ß Î^T6ͼqk¶Þœ€íûG: ¦éû¸h¥ï=Y³'úæIôÆJ¾çlÔ\=ľ_ëRð¬þ½Êpï=Ü·:·÷ú®#Lpèz³)‚†‰˜ +Åô^`Ãwš,¥NsVvޏÄ~”÷n÷°Rïð¶DªÅ{nA•y­ñOùï-]§ÿÓÕYÞ½)6§(¡“,îÞß"»RÐh÷Þ¡¸p#S |_÷Ê%M(Ɋ£äº^p0“àcè_Ùtÿ³qÛeºT˜Íº÷¾êDèÙBûÎú©œ{žíž—9_^ìÌaî3–!`šâ¾ž'÷~ÝÃuû9Fí¬´;m÷Fl Ñ{£–" ÷Âg±JÜë89I~xôôígÁLʄåñö¢<—úOR§ÛPËë,Ðd,vƒÛ›ªÂ»zÛ‰˜G\ýáf£kû÷Òö¥ÔÚ¾tƒ ++·àJiT½?k{ã{Ë1Ÿ ¬í­âùk®AŞüÚ~ÑsÁ¤ ̌>äŸ~ŽØö, ADÔÛl{²­ù™ïì‰<ü6»Ÿ"ë6@¹ß%ØöÊu3á½ëêƒmïa8 „‚Wlû†¤J Uåûµý}*JULmlûÓSm˜å!¼˜8 ïk÷7A)Eƒ6\-þ†ïTŒ°íMmDC[ãÍ*œØ¾¶”-}<Ê;š1qJ[0G¶=C‚tEЄ縶¿ƒ ŒÐ„aÛë­µ¢“u lHSl³VÔÏávFÆ-Ì¢Û>] Æj%ó¸Àg‹mקŠ·«=×êÇlû*ž¾º–±à<áx{Åɶ·ðtaˆò½8™9¨óÐԝm³¦vûg&Ùöx±ñ¯'B4Z8w€ôÞmÿSëÀ™çÂ7µ¡ÉüÝ®OYÛ^çÝ`&ø)‡2´í!!÷/¹|KÆdÛg8ã³_ŸmρÑ&õ©wJ(l{òô=“1ÝWáÊzQ7ö-Ÿ# )8cۃMAJ7avkƜ9Ķ/0n¤Áøúµ½—ô[’hôQØö 25GfæGnl{qWd¤–mCð¤;lûNä@j2æ;¶½Ih#Ñè֒ÝÍBĶ窷;ÆCšù¶}Í÷¤C²èRS\zQœ®í9xÌóy{l»Ïr¦!-óAµ2yÉ·'è4š\¦³ØÞç$H¦—i>¯=Ì+* †.z µ_ €{m\X»¨Úë˜}™ Ðj¯c:˺ùìü~aÚF¦8ü<ÚSÚièÝohOಲ}öúZã?†å4ý£5·/tc lÍþ÷òV[ƊEÿVÌÞXßۗÏß³ìõ –°eJ© ìÓÿ)NÒC}nHöð܂–é”Ì“i•„ΔWH“¥Jâ÷ðsG§Üâ­Ô1 hR[샡ûÀ×é'‰½³F—à瀱aŸí¨* {}šãÎN›_âu]+E؛÷¶&!ìO]`^dœ†éüA#þõⴔÐÞJ‰4°§Æ”éBÔÀžo=,$‹søVE*;Ì}ʀ° +ÞÀ~ÜzKáÙpŠu˜ý¥;[ÔG‡Ø¿S}9}?ïð§æžå> D°'§?¢¶Á+R0ÿ*7,„`¯Qf‰U‰!êò`ààê=2C”$}‰œË€ë˜ÖLà8ö§OÂ¥´$f;”Šƒ‚ìãfìR‚´êƛ®Ú€½ =®gHȀ=_¯P RΒ™ùB +}þõë(°×–-ìæñÿömÉ"°rˆmýâìî)÷ŒL›:šÖ¢!&TE‘•û±Ã0ï5Øp¯„º©€zcŠâvôjtûS;¤.÷â¼ðgófšƒHË({ö”–òF­‚k4ìÏ.”é¾âø\awBd#Q)@&3‚=êNôßx±Èª‹1{wý›®ŒM-j%0•sö»‹n +¶öô¿ _K ìcxl1>TÉÇYØ>셊½âÓ¯Ø4£ ìÉ6ÉÐ!­6Ѫ;&Ӊ!DC&' p.Äà{Â[ý—û'\¦'@‡Á¾‘|v–èÁö u<&°.q™ºT¤ï2·2z|ìU;éÿRö-ð æëÅýP®ö_ñ˶‘þШ7ûNˆk§Ô½|ÝÜHÒH‰™×ÀÞ9m;v°q`¿ñgŽYÝWbûê¢dÒÀWáZ¿d@0ûæ´+C‰ò`/ZDåEBUH‚F†Æô÷´mužg©¯—íñh´×ûû3n(uzEdòzëÆàx=eª~†Š´‡ô>÷tE*^o)x? /¡Ü¬ÿKx²ëÓËv½“X=wœ +¹®¯<ãî\¬°LçÞl³ÖÐøápW<Ösïu=!]«ù„cëú`„€aùž‚1½á[¾xÖõý·+˜ë‚¬ÇɺþUÛO$‰äÁ£ýõ?ėxÇÖLJ6ÞòQÏÕ0©¢”šh6 •“ëú9øCØ 1{õÍ՝á\#M –çýžðCÖ ÓÏ´ §ÞK°ë€ˆóeHèà¶tõ?ãÇé ß €+)ˆ·]þ¡ý ì—Ê NBf½ï›ª‹ˆUkߊÆE¶O“N‘ɹ„Àd95ò^øÌ «»>J¬ +ðÿg•ê°ëcFpª½©"@¿ÆÃ{…Õf×ÛìSÏ £@ZØO@ñ Hdßý¥|“öëå5xA H֛„\·ëOœ&Œ»Þî93N܍@ë3ЖÝõï-ü§íVŽM«w}£žFÃj3&‘w½MÊÙ]Ÿa®,½sק“ž¢XÂv=·ïC¤FAbÌTŠÄ`eãŽ|ê¼+Ѳ]÷>Î*ŸÆyt¢±Õ­eËPsŸ¿øv»~›ÈéÊ/{sÒÒä¸ox:è*äü¯ÂÛõÄ%ô‘j,™Q˜Ì\ÿÙÞ®C¹q×G½“ˆÃw×kýw£KÛ»žƒÃú:ïz9^v‹ð:žÐùœŒv½ëãÙ³—ÁÎðÀŸª•Þį̈kŠw=îF…Qn2ðD¨‰Lê_kÆü*hêŠÚAi5¢ 6Þúê҄Ø܇ u sïz­nƒƒ™cæˆd¹Ê÷®¹A’©—x|ח7´GJ;k±/ÓýÉkç7£Ýßõ7K4ˆu³Ž¤ÐL¨ªæéž|ë ´Ä]õêúX#ÅȨ0Ưv$s½ Ty¡ßj°2=.WæzKþeÄ /Æf®Ÿ‚wà™:.•K +Ê +ƚ&€U¡O:>W°dQpµ›n¾ô7(Œ?+/‡l½[ï{ޤ֛Íé )û´þ. J¸ñÔ \ÚȤð;¥â4N ä° +yåKŠŽë9ÊP­JM6*~Ö,Ϗ² v*†Ïm(ŸmZTXCë÷!ž hýv€Œ +÷wÅæ¡õÆ{õ{1už] +qHGÍË*Zï +f¡VLÀ‹m½$ZO ûmâAë£@¥2m8ŸÙ;ÈÈn=Ê&"È”Zõ d½¥3ϳ€Ãzÿ¶¡ø*ý ô¨_ýH€«ZúRWï)¤YH,­ùe}6¸4®‡xM^fHT2 »Ñ_x¬ºzÇÞï¼ÌxübWo|”ËcdWÏĤXcécW?«(°VìƧ]}×ä?’žü˜ ¯«oåÀèÞïWŠŸ˜jÊÉpÑ#(oµ‰ºLU_£ä藦"®lÄ@]=ÃJD € ê9BÄbõ¦«¿¹÷‘ìh­dÛ|eÖiÓ´}»øÛòO˜ÌՃR·çç"’*Í|ÙIáß."¦òå”T?ÿ.óÈ+«^ÖòùíªÄ¤#ª~åÚ[a{Rn(֑ê¯&¬¯÷Sc»šÙ¾l«Mý]jèG6ž1Õy°¥Þ/gG·Ñ¤ž0) @ù ;ê3½øî7$D‘DŠú$Øvˆ;\K õ…½>V¥Å‰Y} ¾ŸHËü«èÓ§ãrÄÇÓ£jà9<½_/¶áðË3ësÛ6§¿ wC£ñ¡Ýô¥‚gÊFM„Ö•%‹ezZó¿ùCíà‘ö9—ž\lVw™8°ôé年œðJÏù?¡Ð*+¨ð$="*¥w‚mFJù„c”~Ÿ&Tó67±IŸM"í®9Îì’ôÃR‚©áÍ,‘^9)¨9ƒIŒ¤ÏצÉ)³ÎBwô$+t'ã Rôæ6¦è5AQy5Ê)šDôø *zr1-Ñ»òo<1¬»½y Ñè¶ùB`'À +üz¶âs‘a?žCŸÅÏrÍ#ç ½j Qè=:1°Í)ôC÷0R¡çÀc÷pÁŒ%¤m5)Ì£³¶˜t°æ>Ðo¹<„h€·Çå11(@O|áîáó†DrWW^¤Åž?îšÇ¢¦Í󼄣R8Ô Úñ¼iâ{D™ßM?oÝÀVq¢S­jç÷3 Nìæ3ӝÑyÖô ŒÑ‰æ|ý#|9ϚgIÐà@^ç(â¼ÀYÌøÄÚ¸ó¿'O®,ÿÌ=µ--'ÿ¡/‚±µJšüÇÈ'G +Bõâ“W© 40ð%»†¹’'“@8É{LœÂ/’÷(ƒ×¹yxäÁúÑ|å©iò;jb¹H¢èÒ{<<wØØãM!òôˆ·%äáyF£W_“ +J%”Vjˆȯp˜z±‘ÌÀ '”÷—^©cC×[ŠSï=>‡ÍÚ÷ø|oiÏR÷rQsóøëµsÿ&¼ºã?·]–ÂF„ÓQyèJµ.íŽ/g<¡;Ï:lÈÈã ,§×t•€³ñÊè²j·Mþ3 ÇÛ!áx0åz…kn|6†ž6>K¡RÄ»,®Qãÿ¥B׋–_ Œ„rED|ÿÉҞÇB¯ZŸc|¸&( +㠁!|q…u’òÅÒ@Ó^Ä AqJè\|)ÎÚ{6ñql«o á6ÞhÑgX|Œ.ÄÌ2ûé+þJV3\Wt¾‡§ø)‚ee™#ŠQ|”]Р_®ôě#ď¡ÞŠÑÄwTˆÈY‰OfZ+hõ5•0?£‡ˆžtïH#Þ*êýë~_>iïdo®šnEq+KëIÛÿÃ^áÊÐUÅށÊÈ¢xçîðAZúH2.àZ9Ìlƒùù‚„ƒ5à">M6fà]K² +|yqJô¤ém£Bà) #4‹0O xb<‘æŽrôeÚ)© Ö.„+ݦ¶|P€“‘'Vˆô¿WªÑ9;2gúwãò +Ę/Æ.$Оmµ7ÑÞH4ñwÓt.îˆr4–ý>3°¸žvx$ ßkÝ +1›ÀÈïcãê–40»a¿ïA*ƒûÊÖìÚ¾cÁΰÚwÁèÀ6!bœÑ¿¶{I˜è{ÙXbç¦2‡k¬†³´.‚ªï3~YüÕ˜¥\Ó+"pA¾o”‡(hö[ÜÄhLˆ˜ë݀zâ|Vٙ$F¶÷íØÇöt¬µwÚò:5bï½Lݧ¿f½+ï/h£ÞÍ+ÕÒ¡é®Ù–3öãçî·]*5ª>r¨(樛wfI‡¼¼»Ò7’}¾“»™¼Ðýýܦñªäïï >Å{z9 ï«ÏsµCgô»À» 2zàVëze¾»Î8’±Ñðqåäi ð-þæÜ=7œx—lâínU3º«¼Ú]ÚpTäÎ[CšÝýó…6©*KìþÌ{vänZ|îQ5Œ¿ó‚,la3 mԉ&ÕuŸaiΐ…Ѩ.xeáÊI¼´ä8¼äùíºŸ.ÂàpM ÆÍ-¯{À hè{ݥіbµG'‘èà×)¢̸×}Ïç‚ÑœçÑÚSj‡ £n5ê +åD†Mw%iÉ9Ç0ÐöǹZè^÷³`¶ò–~ña(¯!—‹×Š +À‘3š:xݯËì5³¼"†K{^Î]ŒCAY÷t™^wèÛf.v¹>¼î¾‰sœçÙÇUÌ/'ÚöO(ÐUÝT­±?BCÝϜ¸Z$wØ̔–3Ɉ&¿)¦;Awнʘî=FÌSã~¦;Ã0*:¤kí;˜îÙî#V쥻üòY¼ KÕ~œS5R¿v«‡I»˜Ç¥;rá´ÕÂÆdµ.XSɶÙDt£^ŠÄHKw ß$õI©t¥p/Ð&¥ûÔ ÝÝä>JD¨t÷4we|Yº››4\—î;’³Í@$âÞ­¹?Ð\€*€´ÏEÙÜ5x’§ÚÂ×í¥;üÇ=сâéîZØ!‰ÊtwçƸħ,'=c•]Ò>ç¦;Òò<ü‰‡éŽŸ¿Œ û³˜îiŒ;.qzîâûÈ]0݉V†>šþËëK÷­Î‚o|ö ÊKwÄd&Ü\9áÞî3BP~8£9‚êTºË¢­MÔÒ=‡ÙÌ*Ç¡ûÒ:ÌG‡LK÷Ã$ò€Jwÿ‘²nNÀˊðzlZº£Zꇔ¤Ò% ,^³&Òº”î^ãô@Ø*{Ò=b!4û®B¥:¥ûÜë={ ,ºs‰Ò©]U~ô@¦!^ôƝ²4vSºK70G ËÇ4¾vSºWSßÐ4¤RºëȲŠPå~U™ ³Øϔ€Ê6Æû(Ý ô—z t—zI­sP``Jw•«d[D æù]·q³ÄJ÷5ÕY;!§–îgÆÿTº“=´Ï0Ý#’A º{hà;¡%Kùtm)ø’ó)ú.OëÑ E㨞”Ì ¿†ÒTý ”¥ép•y/¦¾$º+bj=ÍÌ´Dö4¿/Sâª÷‹—è‹Eð}Ô´¡pbD§ ǘšücªI€¹©¤¨j)£èø&rzZ’÷D¯›ÕàAö€h…šF +Z ¨lšÜ©ZÍJ«a$ERY˜æ’pN¤ÕÌØOyK1|ºÇkÐOÿ–/·k¢Û‘9 J±ÊOîþ]çªF+ª¹á¹ÙF8nå%ÚU{1ÇáÐêþlÍԔX˜ù'LÕÇWîQç8·‡û]}ÙÛFÔbèœX1Ì…Y¤ì‚&f˜x5bw835Zaáp S3-8þ^Úvü³¡ê<ÀЇIo‰ 3셫 ÜKÔ¶R`V4gQh|¨ì%BM JjN‡ RóŒj~;p±qS†é%z{õܖì5c)Ÿèiá—-‡š‘Qû}‰³¸PIÍF‚˦€52¥Ï‰:.5Æ_ŠJž³Ú­Z„J£¡…ä „a«¬õ1ÁÁœÔ`Ñ*Lfk98&ð]°Å¾&©Pk„a㼏#RËäâhA ˜p(üSGö×€»0Û¦ž !j<óèrKU¾þó¦I"µv’G+§ä·™üi.´'GŒèŸ†‹¸(e¸ oF]\Œun㑴»Ñ«ë9%W"ÐÑ\ت¦ìOC 8?öWOöŸ&–{Gög%dڑ= Ž¤3+ÚièY‡o]‰BtnÀ]D Fë*¢~]}¹¢å.v¡š¾3vŸrñÎ[n·‹¡Isðì‚þþBQ#Øñ½Ý6Õ47ÆÇùm Ÿ6MªÜæã7œÆ g@Üc"^+)jØà‰ jÆZh*QƒÃ!äÓB¨÷ö’Ó@KpŸZ.™3ÜÉiZ>G›4ÎÉA‰ƒ¸ö4$äŠT[¡e…ê5—¾Ý,äT¨8#’Ž¦z*öF;‰Î¥¥9I®WNÊ'->M¡  Ÿæº}_œÓ3½Ôñ3>4z¡R„íiTòKT¼{ûbÄN0(‚D+Ÿ2àÍ©sqnÍ*Zú4Ü{®f–N¡uO³ –k»io}šÑÄw íé8{šü¡LÒèÅû§DÐëN|œÑq½ß#V¯ÛÓÜm?{!~äd‡œfɚ>%ʈ4"˜­Î‚.ˆÉi¸à¢j”Ó4y˜= 挃€úž&õô£m :‹{žÏ˜îûËuÌd½%Êb î`è§íÏXjÕ#þÔ¤rçfäw=O‚øԜ h%ojîa¤ö-$ûÈUd¢b ¸œ‡ÛY²j¥ˆ\ǃ¸L£¨ˆ,òMô(¤å[BjÊV’刅O!5†1Y“Osžæ¬¹¬01r25ž¤£«úLÍ­lä5©/ãQz€S¦FíŒè{p&ç;&"÷D¡ÝÁ-~và8þ55ƒô4v1ûv½›6ӜE”›^BÑ0M—d"'ëłýΓ‰az ´E›š…‘&"䝝ՓܮLt¡€t®áiçtø½§RÚ?Ä["!7MD@ +w©5gjÌ)I¾8S þ‘þM¡C™0þšš‚¨M¥Ù–Meežvvƒæ45<‰<åk0Žr›šð?µ¬Ã®L›ó2‘•a1½Z(Û§L’šqÅí똹œ’Á(ÊùàÒ4ÉD!úncSs©f¯e$¹è`*jŸ6)[á‘&ò¾”ÞV¶¢A§òŸ`@`ßta­ûR²IÙeX¾šŽvJšˆ0­KS~d"Ó ¤ƒø)ÇE& +ö™T¶x¿DÂ҉øµèù%²±™ö ¼ˆy*éÍÔ¨ûÝiò†ÄÐD÷ KñÖÄÀC˜c¢ÜûùTRÍ1¹ÀŠüçjÿùo¨©¹WþɲÁHÉTfӖF¨a Ïû Œí@ScOWlY­ª…™('íŽ 5ÉnI@ùÀJS$5™Ð£®÷à:‰œD|•úÅ)"Ž‰rœ"M2/<TÝb0 X¤¨Ót“ ŽãÒLl Â&"²KhæVÃ1ÃÅð؉nÖIš\¬òº77ç?T Rb²þU®©ðg׌ò"ù¨+i)—¢¿ù’ÙM‘‘sð™Q¼bcV&ޙ©¤¢Ù"ølšáÎÙ­¢ÃaøSWœÍ°~Ê­(]@%_Úô`›T–ý±º6cË(˜m è €n{åÝs¤6]‰çAÅÈÙìSÜÜÀ¾¿E¹žŸx:7Ò&Ù'6Ý\œ¹AÚE.xµ]ƒ܍†¬‚7±æ(h_äƒk Ro€ƒ3ȳ´  îRR)•_àM"Ü$¦a„82%"¸a +¿)§]¿!# ”ßphoÏ'"BC•í”ô4oVs“Ѫö&+šà <Æ(1Ê9¦Íö mÞ÷ôâü´Zøeµ®s‡ÉÒ.ö¨®•7ÀÛJ†SÎXaKÃòVèuªá4 +3 ÌN}ãÉ"Õ&Ÿ:WqFc*¢'QçfÆásÎPeáüË'GSJ)P#—‘h¶ÝÖª‘Ó?žÂË7¢ÀwhïûÉý™8dUq²çeJ/B=X¹3Ù8†–ˆñhŠR"Î +»Ú(AE·º>Ë>˜'á½Îìf¾F颣›E|Á­åX}›Sd„e$L½Ó&çd¬¹nçΑäF¿oÀÚ “£ðà}¿æ`‰ù2¢Õ5:—⧌t,Ï»&Kçõ8>@-!é`[¨Ã‹Çh²Ô±PCô;º;*Tòìê0%Ïc³NI°$1GۘNd”’ÅŠ‘îÿðáE±s“Ñ-„öº¾ŠÎÙÉ¡ôƒ¦ŸÂ›bœãŒ²óQªQrõ¶Óãâb~Ĕ +³ž“;.KEù"þè@>½eô´öÇÆj„H[ÌämŸÚ¢%Áüo£M®ÿ`@Í@Ä]‰ÇUq°¿}‡jdj>ô¿#ûŸ.XÚ ¥Un”Á³Ë@G”Ôx°½áç~†í™ Q€&fh‹+Ãß ª†„‡E8eÉ"ÂËBd ¥°ç7[žCxŽÅo‹ƒT$ž¦QAx’ÁšEÅ!<–âû=ç¦õ„ÇÄø°Ç +«/HHñ©R% PÇ„§ÜjK×TÊo†Ç<&]´åµáäàǜƒ?ž¾í|³—ˆÄ4GŒä‡Ú~q̢ˇÎgê«4í`­œE<Äl9ýË9ŠxÊæie±šPñˆ¹¡Ž…wÆ:ÜD e½{„…/Ü9eÒÇ"°Ä–ûÃÃËûÞuÊ݀Æ;¡’=µNKhž=ÞÙ7›×]®@Šlà!¯±ô'Âø½t—•G> 䝴°îö\’wæGðː¡›8÷¼u–`‘µ/¤éëI  H1«žxõ×pæΟ·SÁ{„cH\o@J«¼ê…ñiRÝÄÁ¿ÒÌö[ÿ åþx·Þ1Mꚝ'¤ï$ñê,MDé}‡¼qŸ!IÑ}Ƕ¶¬¶|¹Èúx„ÇFÓ囇üÙ'x”0rýèîÔAU>ú6u÷ÂÞß¹™Düނ×ßiŽ CýU_42ü7âØümvÜE+²Ñ·…ü“ü±Æ¾³%0‰Yä³šÒ:ó ùœž¥=[0 é×?*(HY$5¼ßAÏHȎIþ&$>!ò7»’Ü-ñWoöw<^Y88‹6ҀTŠ¢/RS—âƒ"4þ 2nyNR]ïÀ,91.²T[#–½#Ø=!àã3”J5CòÕÌ©ï Þ“¨~¢úÜΣ‰…û}’ÏŠÞêdŽRP}ã,ghî|ŽjI¹ˆMÜF"ʽÝñÀgqQ2h +®ëî¥ ›ªRbдöF¾Xu˜Ó€Yß){;â„”ޱHÅ¡ÇüGÍ©‚Ëw®}êÈ]Ø+L¾ãb½ ³)5´¢ÝµFFÕ¡"l!VÃ؁EkÂr‘^;È@ß €ÉJšPïú;%â¯ï‰ààhט’Ô «ÕmtCíw\‹sŽŒýÎ4mÑyJÏvû4áõt4Yþ`艨ܤ,'ڙdr»=߉-(áàçYéMý{0xÛ,de¨#rÞÛD‘7Z=ßál†”>ea9XĔHÝ×Û÷CŸ˜•@¾ãËÚ]¾ƒTqÈ ê[a«)ŽÇ‚ÕÆô-)@ © ’ø{ª<•lž^£Ê3t~zúè +®Ÿ:ªKë§Òg4cɃÍǸ!#“u€t”{ˆ`ѹ ɜ({8­ÿŠER m$ÿ·‡v<¥sXÒOE±îxZž¯Bꦪ*eo‹<žQ-zתڳRÅûÁhlÔÉ!F‘ç.‹UR\/VœÏÆ´çZm›òN@ "±!]øM_`žq†OØ€`ž`Ì"½Oh%ðo 4_rT=fàR=ÿ”Ñu RéØi nÌàU“C3:¤ +Xn§y< Ò-7¿ŠJ}„CHvøBc/ö¦ÉLÀã&Èn(†ñUÏñ.gq=¤Bûø “«‡ô€\J5‹e•ê^Ýþ©R}°ëåÁ®Ü;Iê3rÜЙ‡Ö1¯,©šÀûé.Æ"Aß\z|¢Õ{ZÂævˆ UU.Ëç)Ÿ Ò+Ëވ½=U΃oÙÿ2j7örž6§O󫍁´"E¤GFŽD…KFE¤@"°™òylî +ŠrC^"R«ÞqŽ,,ô`S¬ÖI£ÇFWpR$7ÿp¾Òþ¸im'ozdÖ¼†B¶5€õÐݙ(koóô¯@ Յ$N–6a4ze 8²#­nÑkDJ¥‰>Õò½A/\y8®ñ–oæ{¶ö¨‚ß(DRDûŠŽ… /(>¾Ç.èñŽG¼iÑ&Ðâö˧8%¼½ùØi§ø6èSùW»Aé£Öóí}Œآ,¹Ú~­ì“ë ;ôKŠÒPŽo™%ò0Àû™ä–Þ°ÝÚɄÊ1űR¥ß§‘W“®Äb+ÓOàÃòM¹uNÊq’€» TÁŸ¨ný.*ŒnŠúcX݄Ξ4C’_üܘ=é f.-+%Yç]úpr” +¤øü¤4¥à²1PÒוò‘.)6) •þP&¢Úº»AœÙ$¬9Þ´G T¡45æ«”UI~©®’/2–9 J&öVx¼ 9uú^1ˆÀ ï b“’d®ô´(ߕ S¼¬ D7ùX +“ µÄbZ?ôHZQޙ+üOrŒ¥4âÁ\€ßX“aéø®Xzõv +ÆÒöÎCŠ®XŠ7ñXúûÓKs¸SK@œdEV|VÞ!dŒË‹=1©!ïv!&FH<“¼ˆád>Í»x™Zœv恃BjܶÈZz;„†‰-qßà°à +Tœ_«’à¡[ÚWMy·ôÎGéYAhE 0ä‰!{-&dˆ+ëe†¨åeÒX4ü#C] áO„JÒgl¾³UGåÁ–{ãK4×sÈyÜq>_ ±5ãù—¸-5ƌÒªÔiª’6;‹ä Dõ·* +ý!•0;Lï¨FRž±x0;é”Ç™¦õÁa˜<€B!& iä”Јº'±Ï˜˜êE W1ÝPåՍ•Hdó+“›“Ó3 +ê~ûŒÉY›Ö+8& ”Éiƒ&† +q"ðð2æÀ +ƒ¢á/ã3Š(1Azj¥ç}w·§HØðƒ$\&ÛqµÉ ¥p™êORxEâÂSH£8¯d˜—ˆ¢*27ê×hËó)7‚ꎎIäF°ù4àЀ¾– +›´€±Â…ýšèÎE’¬2÷X ô5ß`´òÚèŽÂ·=E×úôûš>ŽÃ:®¼ ¥²J¡Öêãâéš6ÕrM&p•­Ô5).o øË"6Ù[£§EɊ¬‰{‰ ԖØèqK/"ñ!é¼b£jÍÈÁÕ?±~ @ùR¹±Q×/y`5ä/[Ó;Šý(åk¨±¦Ã僶,SüÊ/ûvbó!ÉKK«)fÀ9$v¾ø؏ÀÒjâن-¨š½D“†/–ÉÝš¢XSS£2¡cØ:퐼|4ò1`žò•çhôšMK¬bxwq42ú„¥£ã’&V“K)Òõ†±!>/i{4wáƒ];G' +¬&JFi‚j$!Ùìñ½O¾Ï5"ÊRg5—µ§Ù"Ö-+N#Z80ƒŒO8€Ë/z=ð ŽÎkRÿ'@ì~5#BN£“z#t›Ð>ˆ¦Q4݇TbÂiô}k:u³2ã!¢ÃkB/µfz~…Þš€^ Ç ýVÜK|ä]“R2wO"ÒE!ešXVB®FDÁkяyÞ?²‹^´«m”?a™CFL]Øä"Ô*¦à/ç¶Q‚öïӏ#7jÂ_Ӆ7¡¹lñTV$J¼Šç¯© £z\m£ð°šà4í&¿é¯É¯ÐZh:²xÁmhžÛh7‘ޏxÙFì?´¼ÎMOE¤°7´@9°Ì¶Q…F–eOø‡é#úX¾(,•‘–«˜VÚ´øڑjº…ÌNØ·ª–d$}ٍˆÛ>É~ݨ*µûÒÚG׍ \2 å5Å&¯»Ëë(Ÿ´nG£Ég75ÄfŠ7)=ùðz“õ§U^qú¦#­ÑøèZW$†±ä‰<8¡xÔXb8ퟖkL¬yØCTqBûIr ý~\êš $bÈ%ôûNe¸Þ¦H©¦H­Æ頑°C¤˜±ÐD²+Ë9m +ààí9¹•È£:}ŒøgƑÀ"GŒŽÛi"¦‚ª‰PkÊubN$b ý=Ýg$Õ>±,’RªôI`#ā‰¤Y¡úºñ@u—r²>ˆLt«d¡<‘$g$v©š a$’6úï­TœH:Ë3Šƒ¯êtïÔ1_bDؤ•8‘ÿ‚yêT'&AØocê”>W#² $‰ËâÑað 0‹$®J°ÔÜØ©t‘ þôêÉ+$iLÀI‚a؏^ëršX²ÊHuQ¢-VUÏÔÿê½H¦® L‚à-‚)iˆk™ž‘hmÀ”‡ëC‘F88fpJRÇún)b§gAvk3/³MIyüW€“¥*;5Xñ(WŠKÁ;QWZΫƆ–Ø Ie v4ê&Š©”Ø þ+ÎçÆIž’p(b:R³e +%q§¤Fdx@À7óy4Z8…Ío8X’àם˜:‘/–ô\ŸîÈKäVDi:8ýw8™ËÇù»“8:XîZ‘—ÿHRk¦ÙLMþ!çÇ,Éu +Ên‹¡ f4Ÿ¤r• wmB³$þÑ âEÐY’.µ4Af—D.ˆ®ü°>Í<*^L®Ô®FOˆC𵓝Q6:M—ôÜ3ìãå2]ÒånN[ìÝ"éG—Ô0‘îº$Ýu$ƒH׀R¬ E¼Ö%ݗéS$ÁIŽ­ÃEÐ¥$}²¡û–ɈI²ÑÂf‚_Y’P€f—´®‰ï4’S7pôûˆ“Ô92câ,•„ ™Žb³}“Úh; šñ$o˜óI(…Ms$xW?…þpfâIÐ_¤ÓQøÌ +%9öˑ¬Q(-…»²ñF³ìJñnA;°3¶ˆ)”âöVX1OŠñ4­¹,ŽŽ øy.æ:Oh£*BûÊë< a€¹û +µóDSù$_ +d}Õd61X@Q¢=#oÒ5â-óD¿ÈžO"`E©ôä²$¸5Oÿƒ«¬Ìۈ.JBÅ2hi¹n&L%ÎôkžæŽøs_= ü@–§ëÆÖü¢”ì¹R¢ü„.¥4Ø·² ‡(bPOŒËì‚A E‰J8oô]S b:‚¡ÈÞS±d#h¥ÚÍã+éh +^G¯ß¢JXºCÂÌÓX‚9)²°O˜ÅªÚgÉÕ8»¬ðÓf+(ÔOgÐTuÈ¥p)[ì¨}h‡©ÌäÕxöîU¸dó˜}Ê{É{ΫÆ/á@é$¸ã&qZ™˜5¿” mËWä¯J¿¸„*`ñÉ +c•_Z YyXÖl0¾“&ŸpÄ/Ñ»‡õøƒ_ú^Œ€bš£Â◠aÌmÍAéc%؉GÎÂ/]r€,r“xÌýŽŽºHŒ‰(”}"Éf”ÜÝ‚‡¸Ÿ~–JlR,;Ƽ¨Ùh ½¼Ò=g‡ÞçÆφû&³iI…Õí.Ò¿1q ¦Î)-˜¥wí éÙW˜¸Ðh]c5&ûJ +K…q¼¦¿Œˆ,Àdmu?ö;D˜.4 +î“õ>ĔµûTÜû[e³{ùsÁd‰í +õY‘‹‰( Q{.a,ÈL¦O˜P!$Lð?~÷GBkÚ©.Xßó‘(ôÑyà/ýÇJ–±¨Ú(4×&* ­µ,ȩ¢¤GÜ`òY¢óH¦1ί±u¥r"¥\BåQÐô!c•µÁäWÚCÕ*ër™(ð˨®”õ„h}“ƒº(œÁ4»¶r@*ÛLोx À.HY,L0lÞxuÂgÝÅfal|qý¥Y“3ì,Lª_vÀIf)ʳôBÈgV(b®æ!Ä:¬d ö èe𒮀×Q¶ û³YýAˆ9 +*qiGAR•7g^1PÖ{à4öO0fûO†˜:Ç –…éÊ©¬ð·0Él¤€x¶é|Œ S—ï ÌÞ³Z ¿Â$„äæL»|‡µi ÔE«(}`…iª·y!Ì(=NK ”I2 ˜âÜóà»ØL¦?w·À´&/¶[ÙK%,âa’è‹wbÝ@ Æ]ë²8:É1-{É b„ҙĀé[®’ÉÁS”í|ýÆäÓÒ$âF˜Wå‚ÙŠ~…Fñt¦꧂ÜÖ½t ¡>L†0û/wKŒpl§ª‚êDåîTAµ>Ô°£1†.…Âعl‘Lé—XHbërÁ$t¬fi)øËƒ•€C[L»SŠßn'Z‚škºÙ![‚*ŠÏòNR˜îÉA”’‘ÓbÁ8VP.hfý.Ï÷VPä-ªˆ“OÖbR˜££w·Èo1UdW1sahÕ ~Ÿ„Ýb*Ìÿ£†²Ø˜~ ¢NãªÄ¹?…¨°1­Ï<ö³GâÎĞ<‹*.JéÁ[P-ÂPKÌ®uÆC *°à€˜„`ƒÁ2DìÿÀÌ~dÕkƯDòÁ°Þ`X“Oÿ ìeéAo-heKú ƒ«P«Ãñ2Ÿ) +bê0AüF€¶îÃÔü² CA-G× ^7ƒ‚â€Â ´>‡i¢ 0탐ýÉï:M¬PœY‹ ëÜ%ƒ=&ŽµôOÀ÷˜þfÀ )I ÊÛ°‘ü¯fÁŽ‰py°zö_Æí^÷Êd×e¾¾¾#ô(w¡è˜Î/Jëi2&aù´dâa +΄ê\k8¤m‘S„\3“|îÖ7“̈́*ed=džºæ&i3åw•C]&åSÍiòå‘B U ùu5­v°†’zؔô’U§•¡CàßOO·°hSiâNÊ҇šŸô帩ã 8Änêü3êMB3 0øË鄬æ!&Š÷Á;?À,M)š‰»¶7]%Ÿâ›L#Æã݌(¬¨žµ¢2³¿{^‘3²kk‚c(/êŅMD†m$G+[; —0Ϙý0=E,¨ˆ}§g0Džª¼F}$ k—y2»qš +G9Ð8!«ž µÂ>Ð9w±§¥{±tУ3FŽŠ6,²½N¹àŠ]î@ø·i@Çsþ{ŒH©—Gi”Ð|R‡üöT—~9#Rõ;äVç;æõ 9j¯ébØïQ+ŸÜB«Ýb¾GI}!Ó4 +‡8 ôI‘ÙÉIπ¬¿ÕcK O*Ì>éFÀT?Ƀ÷Q¦oMDñÜ£0Ž‹Ð*wz»£CµE‚èä“ãgÈ^÷dɧ1ᓂ‚6LòIiy*þüú&ŸÐˆÀ¿üŒå–š¥yuŠËÔl)åÓXÄðym¯$+Ÿ8³³ 8Ì`ó¨$1çäW/5,ùŸp‘O«Ì3ÿљqP»£~·Ð2À_éÒMº£‚1̹ì§ù÷4Ò÷긬g0Ȏø2wfÔd•>ùÙdD·Oêȉ®ñSL÷ú¨ +Kßi$‹ÔaT ÛSRuå‰Cªd‹ +6P\‚_ + ¢"¹‘š~ýŠIEΛ؇Üã +ÊQ÷±ÖÔðºÑ„tT¥–Ôÿ’Ù§â_¤…ÿ‹H£DX>Oþ= {Qj£J!­l %°/V?ÅCð\½¨…‰0ªDü‰Š¨À¨@áålïÿHbTo)•(‰eTc]UÕ ʨÂ̏:@H Uâ[„ÖC•™É`® ۞Ãʨ6qÖ¼8Õõï­·Æ4"·è5T*U ÂP€­‡?F´ß²º¬âc¥IFµ7Efl ¾ŒêˆgM$aLbæאQñý•l-ãï7dDÛÈ èoG²Z!¯$—}‡ +$†¡ÈŸ’þÈ×SA¡Œö !x®HB˜5Xo 6ü ß­dT‡ڍDà)Qò.„D1?, Zsyð1Ü}¢-Ë1‹Q™û§’É›I,ŠQ qAለQ­1 +ԍ;ÕÓSÓ­m0*<å26°¢¬uh‹Fuš³(JhRÕ{+ÀŸKö¬`°\˜¯Up¶ÔŽÏE•y§°PW3{QÜÆc¦’HY“ÿ¢²IŽ¨ØgðºпK–ûEõ• kÎd ©úÕæé§Ñó¿@$Êþt|Ñ(Uw*S×åó¶24kP±4]Š0ãà=w1¥äÎ/ª·´æç••A‰%™ßZŒªÂß{¾¨üíLš§¨¯$;ÂQAèK*]Èþ³HmBeà $65ä¤êçE…’\C~s]Ïa㵨¨éÇ#·¬xŠ`Q Cô8æ­¨nì,q’äw§¸¢b'Š’+Tø¦+ª÷@ZTãŽqyQõ£b¡7é4ñe=Ìý“Ÿi«B• •\ÞÈð! FHŒËÝvŒêØÓ²iŒ +½™õ$P"›‹ŸæÎH•úòH7FÅö·Šz¢íॖǃ0!3›%^Ìõ¾bT·C¡Ý +ùŒQ©J,831ª%kS"¥Ñ±,F2áìØ?8c—£ú_1`£õº54­3) ë†ÊücT Ò¥ÄU°UÒtßš-¨HÅ´¦ãˆc‘Óçs—¢‹7´ZdTI)Œî^Êhäߢ•l+©’¼%dF…¡ÈâVÉ=£—›R\³†ì7£"wóŸK­§ôͨœHƒfbŸ–ɨ賋4t×Ë4*ØUæcvðêeŒê^§ò<<¬êbT÷Ö¾.UÄ~v®j­2*ÀÈÄÍ`î2*hhû‚®';r*Óí2*QÎYjH¯NÁ›ŠUu*ªɨÜÊÀáVÔƨ†ŸÂ;§M⅖•/–30*NZŖ±dŒªwäÐÖ?”ŽÓÕðnDŽ°a=ԍÒx>8%mǨöBU •¤tÍÒÚê¤UñŒIûÿ =/·1ª/mµŒà—ÖF…„e†éÏ¥ +Üj·æH!ÝB_~_TÄb¹u ‹ºXy®­½…ßÃæëa”j5XPɵ c穒Ž¢¾'àIýKÆEUÒRÂÊ´q¸¨¶¨ýbhKQ颽­–˜êþ€µEB,F–,—œ9„.*’,üÐوwQq/ttÙùà.ÒELÓ½iÐ0lï$]T=j—÷·×]TÜ¡O~/@.ªóˆUfqü¦¸´¥/»¨ªèP²v•éÒõ«aó$ÎrQõ¸Xî¥ô—‹ŠvÕµ¨Ø0-˜GWR®ÂŒ,*ã8…Ÿrޟ€¡ªØ‰»èo²¨ +fi¼.b`Å ++UµÂFf°¨œ²D%ڂ!-ª¦±ø¢–•qçUPEµâYC³•Å›æG4{âíST2Æ51÷ÍrþUYº ³“¢r(ª"#\„ê ÔRTêqu˜Ò¬LBnŠê6ºÍ—½õ’(p¦¨<˜Y?ƒc8Š*:§:ç)¢Lrýj‹ÇÎ?o%ïþ/â)8*ÍZݸ{–,ª¶¨[E5b)ƒÆ™UT¤{‡´Š*­Ò¬8`HRQ9l3Ø¢´„üä% ŠÊdL¨a¦zê¼³žy4½€TTvMA£”1pÐõSQÕNȔYé §ž¢ÚÑ0ð«F£ >cª!ä)Â{oE%Ê,€¡`ÉO5;¥mFù¶¢B4¾ª)%•2$E•øoY݄¢‚´!ÀåíDU’c(„qî˜ Uõ(¾õz§ôMTÚ×îYÓBÔD•¼Ä:'ŠRÎ6QcM0ˆÓl-‰ +Q¨ò$mdQ$ªçåÅÊ®C ”ì$*0ãœ.O¢j] E¡½1Ë¥$*ù1æ yq#”4¸ ܨRa¥DÛÎi՚NÕåNZ4Ã+– û©vDu²P_mf(7¢bdL€Ótw•]´3Ú% ˜açDTdù€‘Õ¯,|•4䎒âéxç;Ix•ßÔÿ®[Û Õ ;ü +䆆¨¬»–K®­ô!ª©ôD6ñE…¨Æ:¢õÍ}06 L–0Dõر¼ˆJœ}یSŸ„°Ý/ŸDT®îÐHDe­†0C="ª9€: Üi:([šQ‰'Ð%Ip‰¾£É wÞnՀÈO–:~t»Ø"ªY©° ²Áß±äQù´ gä ñÛq§º¸eŠˆ +¢Rf‚Lñ1ƒ +IÕ/û¤8AvJ·¤ŽbUq98¸1Û’b—dh[ëeåÕ÷ÂgDú Ç¢šÆÁNXB!ªN;d}±\“@9Y±E!`½ªNxìQïÚþ&öJTDõyØd±î‡T‚"¢JªýðJ +"¢*)+¹•JIF"Pièވ¨Ú²•ðµ ð¨–; +]_6Ó-Ð^¯·íÚބ,`(T’†”Á3\q …QYâÀòQVDÅÀ’%&}]éߊ¨âV(VˆªK†UàPƳ*¢Šÿ9x9DTsA)£mÄv¬EQ9·¢ƒ"*ÀÒä°«šéoDû"*Y¢”ˆV"ª:Ås卥ç1U-¸Ùy‹‰ˆ +ã‚Ó²³B|&Õ[˜Wò苨΂ˆž».½¦f7Q]™’‘2$yÆ'Dut^‹$DÅÿ‡D +j À Q)”!´CT2ôi_U +š.Å:•Ò8š3j¸„DTð)ºUBÌtâAD¥tvˆu90zùMŒæoA_"ª>gË°UÐÎ)0RGTo9ⳋàoâe˗Aú+ øw/íGTiÁÐë Å¡#ªéôŒÖºÔAJ#*Øniõ)´V;¢*EfKÑË-#ª2ëÈÜ(Qمð?ndÒ!f5Õ™¯ÜƈÊ:Šsr +ÒFT 8j:Âv"<1 §³*;@UÚ`Ð_OºvD/:¢2-±pÎ[gZ3î.`  kW‹R,a*\M!y~#ªÓŒþKLBÿ ATA¢{ÚÑY2‘¨HÈ°†¦8їûñí§øòÕ8P ^*”¨‚äî᧠JTÖôÉâtÌâ/QE4¹5{¬u0\“T3T³Îe›Ý‚à„ü7ƒÊšfk·O‰Jm [¬©Â+Qñsº†Å±Då”è¼W¢JònS¢Â û´f‘%*N+4q¬¢Du³!8Р0ÏàPYI1m2ý› ULU·~rP%¹˜žü$Aw™eB']ÔÏ šS¶º@ïTE7-ö)x“ÞA&ò5GT1hó…d ÿ1`1¢\}Ø3МP‘ÁÝAö9P¢'T…ù$U¾(TÏÚƍ‘Rbâ[›Pù•â{[!ûtÊRwBõ\ ÅßÍzßã= ‰ž\Z$?e¾ë3옯PiwËÛK^„háó +•ë(9PLW“§À™ê¢,½BÿÜáÅOq7A Õéùt«/.нÐj2|ߐ×òl¯$ÁƒÆ6i)ÓÁÈ1ñR)©œè&Íج¹ +,F—$)9{UöSN,›ƒW +Š×s¼;´zàë­n¼Âõ°PiÍ£PfÆϱP9jÁ±iµB…m¶¶u×ihQ?¹…C¡ÒÃëµ>÷_•¦P=0å,Ú7Ês©r +•㲍¯BEÕ€nn!·åÿR­*žÃì‰äA¡Ò•®Â Ù,ªØ~‡ÛH¡PE¡þN¨|D¤¿Å™¨¤Su'-šø>'k˜Põ@³+2¼§“).ÝøêB}d®úfS¨º·o[ª2d˜e`BåOâ0TmœP ót¨ßåfœPÑ”é…Kô„ +ú®Ð1¡úê¯TÙ!WõîxBÅg@ÀÍW/¡²=ùÊà{„ª2úMF‰wvLɃ ‹ß“²Wuâ$ŽP]P_ºÖª…Õ¿úͬ‹ø +rá¡o§ª7€¿ÿ‚U*>Ç.‘(Õ뺾xto鬼Ãú%¹ `O…QÜ$+Rr¹É( ûôî±Âþ Ü„·…’2ÞñŠ“„ôŽe¡¦”ÎŒ-ªJ¨HÓóŠ"1ñ‘P¿âô=§(ò,0˜ åÌ|fó™)c.ùÌ!‚)óÃ\‚â†Í5kÏ gdancÜá0>LªPWÅĤ +vâ(ŠŠbÝÜÍ´bæ-ºLµh¤–±\h&1Žçx.J&ÒIf ~šî#Å̆tݞ…4·ÐH;Û\Ûÿ#*ù ùsxx|ÇIÅüМãïáDºÌæ;9‰> CF+D™ÍKLÇE âa¯ «âDďæ1ib›ˆ$ŠŠf^áùKiâÙûÞRö: šsgáæž dB!*P¢Æ£¤‡§¡ÐÅSÅW¬[4<ÍÁŒ‰ga("Έ.Á¾ Ü®Ñý f÷É>æ6£»9]ðfw?N7.úÆ\$ô Aþ¢A‹ª½LËH%„‡2X!ü"ì#Ds~ ·AªƒaËða ‘øe†0£ß1ëêðÞAÿ³x⿜éexû=Gäp©çãöå¤%ˆ?g¨³‰§øsºõðdë‡a\$á‡áCgý0tôâxµ’Ÿ*ÈQ!r†²¾ðÂÆá؎ßB¡Ù!Æ!8Ž‹i°%&w4h¿ÁnAX=ø´üÀ™ m|ñpøÛ$IÁŒhlK…yÈØ!úðBFKd®\ã‚ëƒ!]ö—y˜áá—9NçYa߉?§¸ú–‘ÏÚv?¤„üEߨ£÷ÈÃd…*]Óq!“¿¨QJ\•³ÓJu§úŠŠü¡ "ŸPŽü¡yP/J¢ … a¤Aè Š~”Jñ²ŸaYVz+i³†H›IIaÖ>BR<óO–™³÷Ì®a|ÚÄØYð«VÎÐʅ Bå^Ï + r²š`ó¦v²r³,$_;j§ÒÆ29£ykÆ'ä|å!ô!B;ô#å|ÐÁré"‰Ê×Säõ´EX¹¤q†Ê Ñ+˜”¢!¢!¿jՆ`yþ &LñVÙÖ¿ñABcšu¿°_S~v£©R}‡~(U½†xRÌFlã ´ý!<ÿ–v¬–eXüš3„.H(‰*h#®óUúQnF|Ÿ¡?=ôğÓm§~ õ†ÇÐUCPý0ŠÖ¦øÁßÔæÅVüŸ¶Ï“brÄô;ú–Ngá‡ø¬B ÔÀð¯6Ê𯖞`ˆpªSˏèzš§o¡î‡S&Ìø5ÂèÅæÇÅ8¤YþAZr£„çȸÑÈ'DðÃHZ:óo r{ÅþåùæaîQî0~…ò}DîÂ1£ŸXϦŠäMâI›L!Sid£L›62QöözfDÝ󄪒‰UU/4ßõèœAzJQf&ÆêÌ6Ÿ™7Wà/ãHÖ¢ÑM„A®Ö5×,‡ *„¦~ô/¸ótÈ<Òb–i˜¨ôõuöï}C™zZïÏ)§¤cô§ŽŒ!ëw‚øsÞ_c“fú”@±ü'Âqæ%c.f`dÍïÑãÉ0‰ñèo QÒIÕÿcyþ-éø<3 ú[g(—‹üÉ"IQlŸOtßyÖÁ0ž@²øWØ_Âþ¡4ù óRAòˆ † 5>Héþ¡\‹ü?!‡$›ÍcܨɿI]á2†¿Â¯ÖXVJ†•ù·´¼1‘*° %Éßå?eÿ…÷ý1yöœÿ¡C |ªTCð©†àQ„J›J5Æ/ÎÞáá‡áøV0%˜~NP¢øÈOŠ# Ë2<œûT»ÝÌ(>s™I¾‹ˆ" +õf$Ná#Ûv £mšÂ·zӄoD©{ã‰ïíÄ &Ñý˜¦°ØäÎìâ¤3ݪyžù<ÄðÅÒ´°f¯x}a­÷„âK-™¹8Lf±dFò + &V„—“1d¨*…>{AD-Ü +ºçpÐß7!ìÔ(”x# EGù¸/ÄxR"sš•±i\Q÷œbIr&ÛGœ*ÎfÑdþÇI‘,W¶üCH~ddù»TX2µp1Y†ŠÞ"Á¬/—øã× ãïòbÈ8•†-g¨ãò½Ñ›"c]BþÈÝèò#‚”}ê–È )¤•­¡N¸œòÃ.×wZ†©R +±(q}*wÐ $]6$”8¦Á <ªDµm¶×·Õhl.ßi4²Ú7éëSÞ£@,ªþ×W`ö…?,,â8Á¼®ò•¢ûx¿BEèêð°xî°° û$ByX¤¡8µí°ð™‡Å {XŒ Á¾ÃY؇Ïa_’XûMbþàXCìûý·äaá1`ö¡O7ÓÛ‹~¥Ùp…3¿"IÈûzË-Gú%Û¬Ã>ۄ}W‚}{ԈgMÈÖaÑ ‚}9KüQ\ð|46lj`Ÿk„}H[:,Ú//§qXˆm“Ê#‹÷ĆE^¦Æn˜i’ƒ¡Ðkçä”\‰`_•_LšpXLôÏÓr6,h§a±—b2k•tû$û +2#Îpʍa94}t% ‹žõjŒ8°/_‚bX܉P‹’K_‘ÿÂâg¸ì£maFN„‡}U®™p3Ä>ÎOPW:ðùò ‹Ÿ)&¦ÕÔÅÃ>ˆ…E‰Jtñˆ…E·?±ŸÃ¾gao9Œ`ÜÇ û:Årañ~Ó¢b.,0&Lµ`zañC'uhû0.,ž‚}_ ‰¡Ä ‹[Ø'ùÄ>>öm•ØgDž‰ü±Ü ‹¤Ä>?ý­ø*M±o‡aáqªªU$cŸ¨iU‹z?¿°àÊ$ÆÔ&)®m‰ØGoNÞ°_âù……Ó2,øa±Z:fA£_a–†…f×°€gÃ⣭)ËahÞÏcÿqX$–Ãb‡Ã"mrX$á°`|ûNI½"Rª}É îË 2¨ ‹—#LÆ>[“T”†uƒÃ¢)ö¥ÐÒvÃBØç6,°ï9[7\Ãb¯g",ì›Á9û&z°o}Â>4€ª¾‡}‘/ì[e_Þ]‰1•¾¡°O/ÂX„ÃbÑ6ìK±²‹})û€½%rX`­Ãâ&ŔY ±/æWàR¨ÃB+2‡Ååó™Ñ!Ä> ÆnX¸lX`­añ$Ö xmXœŠ}¥8 Àá ‹ö¢j °.¼ož"ÀaqW n-AqX¤é”Â6)\û¦&+æTä7VqXs½aÑûZ֑ 8±O»”rz¼ÏÚÓísá”ÆxZÐö‹ùn¹a‘¼ßwçNÁT6\—þ,R‹,ÿ`zÿëof€¼¹aÑ +Øé¡Ç‘¹oXE‹lÃI³•‡¨šJSªëo”7,,Rß-C¹ŠRÍïÌØ_ +sÃB¥Õ‰tmnXtêJ9Â\Ïfäy3+"·*9›ÜÝ4-"-8,0ù…nŸ–L—Íӓw‰Ä]™å¦8 @qX¤¨œ–G8x hn ˜i°<Ü¡iC╏°I¬ :,²Îëÿ-P¤ò¦:,îbŠ°è!¦ÐõUì·8,Xêq‹ØþÌÐaˆ «cXÐ"$=¼êù˜…R¡NM«^î*ç‘ñf»«eÁÊ¢(¢Ü˜žEX¢µÃb®Ãâ= „"nv¦9±ˆ²°T3Gp:oÝځê°—ñÎ¸™‘ÉB«ä£F*J j( ÅÝfÜÊ؏BÉâþøc?ª]ñì|fÇñÔ#…¦p¥­ ÊFX™ïZœ xâS‡E››ÛXuª=“‹[ ƒH¸½X‚Á&‰èR²Wó•Õ`vX¼²³ˆ²Xˆ×b¢÷=Úß‹{1OâZÀ~:œwX”²AI{ˆXïèáöot´\ÏÐkxãA»’é®8“F¦fk‡…Ìœ +˞; ž¬’k;‹ ¼ +S@ΈïÍ¥ènâåGŠ¡Ÿ¾ëëè]Ê{XÜãjË4–Gr/ì+̃é[~ù¤èXÒïj bÊq<–†Ö$BÛ;ñ7˜Âv0j¯°†ÃWìtØ­z$–Ÿö‚l4,0Ñ+t¾XP#ÚOÍïW(sÉöüâòiHÓB£5ž¿*ÃZ±Ø¥z2÷’ðW ÈNƒل­83]b¡IÈ5“™»ˆÇ†X`=Ü°Añ C,4óÙï-!ßC,@ÄC+¬à«¯èC,FÒš]’QÖ +KBX +OȁÔb/^bÁ™‡”’A,ðK”)›N}VcB–Õ„*&u\³t1ĂÓ=@›?–²»E앑’e±xÖBEjŽZNA,Òp;#F’ÉÄ¢ +ËÁ´âaº—îE±Ð+‡¢B0$€/yúp¸å™ó`tûÁ·{B Bé2tÞ'KÚôm(|kI>< +¤ÿ³Uì‘ó'Ö'(øÇf±¨óf¤ø‹Äâ›Á2ä0æ¬ &±8¬ëŠØ#™V@"ÇÒ¥=Äb:Éí& c7zÐ)%¬Ð p ú=wTˆÅñzÛ])#”°‚ý:C_Vk…¡¤Îl‘%¬°a]<ƒÓ’Ý +Pî:âþ‚ÊV`‚z"MDϬ  mˆEΘzÇú‡ò„ò(Y*cy“«„ŠOÌ.Æx~Ô0÷ÓMÄ>ׇÁ „­EWXÌO±GyéoZ_o\O!žr.åÖ@±P­öEadàÄL8±03>Z¨*a…ù=¤ÿ«ˆÅƒ°¤¡™œ³ò±pΛ9Qˆ(äv“Š½‹PJR‡\%õD,Ê~ô‰ÖÃ65‰X„ÁÀvWè£çtˆX¸¼NJ­Úé"‹ÍtNo¼ðy÷d +,;ы‰Û °F¹\cT"uÐf, û §<$¬_ß1bD_[´'¬à9q½ò¾Å +èÖlCp¢yLÄ"x|nO^“yœßNX¡œŠø^ƙÚ×FÄBysÄMÊe%p$¬ 4-Žº8Ğ+x!±Ö7Ü>Yñº:„’NÄbi–há–õ¤P"‡°Bu=ÉD,þ!Ä¢AXNBXVS~lØU­VhºÎ‹’ë΂ú|ü†+ä^*Tæq ìËqF,x÷oŠkÄ¢Ùt±¨Á”7bAU'e8—£ ”¨ ‡6 `Q+¤6édqp€¼‰¸µOd’Þ*‘õºê+ Y2ûx“6bÁVR}àR‘èjªE#žÿ‹XÞü*“›šxVõ`«xT¾ FM\Ž4–•¬p}¦ÈÛM@r™°T‰ç +Eýoó‘X¼Š 3Þ‹8iW¿úŌ[քˆ1w˜°ÆÛdz¡Ÿ°BøcE(Õ:Ÿ +´­ùD”ÈU ¹m)â„èj†ê) +Ÿ°]*it¾ÉŽ +l?±b1E,·Ú©:ý~ +âSßj¬[ºy"³Éý_9.  =bN FÊ$™X|aA;¡s§á‹4&8EՈ4=Oߙa…1Ÿ˜ˆtY‚ÎÂtxĂ<ÙïsÛ9<±uÿ2¬PQ¬HŒaXÁ"¶7 ÑÔô˜õ‹Ñà.uÓrú†ø¢Ø!KgEæ®±ÏqœÆ¢È >8³ +R¼ +ËXƒ—BâU(;^Ù,ÉëzºçøxÚè„qøϏ{OGÓu؂m‰Å4Â\…ÁóšôHs¸²h/Ö ˜Å©, їÁá÷*_Â\…~@Äà‚æ*PG¡-ÞM1"BÍ\ ܟ;ÔëEúòd2W¡94Ƨ‹äpARÕq˜¹ +•Tb"x:®ÍU¸edñèiÈ ”£gÄâH»X q ìG¹X¼f +ö &ț«Íd¤Å¥NaŒX @«C0óÑ 3V Ü6q ïëˆÅC™uî5h•f·Y“ Ù ±p|Õ%Η““!W¡ÛWTâ„óQ•aÊýŒ +…b—\…ã þÝêá ¾ù‚s±ˆóKfßr¶ ×ä*\êÈjO2+NՋRӐÄBnXu”æ*ˆAÿ›&i”‘qº2:Œ¡DÏ\…üž4va[ËUú,֐XðÿH K¤xïp¹ +îÿНtz¹ +·ŒrbĹgå*ÐFËíS¹ +èKô›ZÄb¦7Í"ʖx#÷d‹e·«êmöËh“}ÛcÄ¢Zª¥‰èa4ySôöts¶¢w€xOÔá×#÷Ìy©½†UݦDэ¨þà±è‡‘èäˆE§¹ðG,HR¬7lˆU@ˆË\;ï ]– ̺‹n…[–b®©ª@sè~ëN:3ÅØÔQ$䚫Esá æ*MЗ‰²Åb›Å@ K‰Ãº|  €Þ™×?ž* KM5) .[¸¦¹ +@mž#ȦCs_L霹 +Eˆ´úÔñ'ÍU *µ3yû¶—¾g‰˜‹qìeÛ´ÓëIÜå*äàO)9"%Ÿfìf0ƈ…¸È'ÆbÆÞÉF,¸°ÅO1F,ÐÙ…/WáÖ'Ë$t?Ø@IçavS«Š*ŒX0…š?ֈí yVO­N¦¸F,âó˜(ýhW@ + §~B—cB,Å.} ‹ï`ñ‡ˆ…Ô}-7@ÖÊî#Þ “­¶\eÕ͕=¯Gš±?Ămñ,5ìâFbñUß`xa¹ +ówUTø…杰±P¶7±p¥á$°Ï +êT¾_å*„ϸ!=Ãø©Ä +õ‚X,ðЂ]ƒX ýWh<ܹD¸Lø-來ï|‹Ã¸ ±-SÂɕbñÌ~öì™Ñ¢L<å*TýÒFvÒWЕ«þp$MýƒJ„‹F ñÀHÞå*ðbԈÉnì¼x\Ÿ··CG„Çð³ä°y†ïµˆ9UŠRLÇ)˜|"í}õ¼A,>B&œ7yÑU‰‹½ÃÀßÖ»¼^¢‹{ãr‡ž% +h<©‚³8¦ÓÀª¥)Äâ^Šî8ÓPþ!H`ى6Ñ̅‹õ_xòbeÔOð„1Ðb‘œ®0˜ ±ׁ1妖XR¡Q¢ºP¡»É’ž×62),TîbˆÅ@Z–j‹2gäD0*äýë,-ì×±ðšî>í‰ ´KIÌ-0nœ½[À¾›þ;­•ˆ…òVccòùC…°,Ò>MD»Ãˆˆ… +¢èKb + i"*NκÙP¦L+‰Œ±¸3!1÷Z:ҝ”D,JÙG¨‘‰X8PÁË"¦§0K¸öó,揔Bêž‘¡qR^T³¨S¨¥\¼ÿ±Ð–(èäçY=K:s +7[¸b #ڋˆÆS­©¨IH>ê$ĝqˆ­ÇN’ÊÒÖ·³O¹Ò‹ë'`‹ÜÜ&Vv¸¬H™vc©¼ë´±ï,·E,hÅûA—º¤‚\è©·ÉSE,b¢8™¹½Ô÷þ{6#)17ºYÄb CS.Mð±–:Mvl4‹E,lmy±H€8RS ©R&bAžldž¢nët½Ì3áF7Mž hr¡­wHÔÊ5ß· YKÄâ(EÐQdcgÝ y£±cxâëï“XS–ÙN¸tg—L)³)LÍ"‘ÉŸÈÖcf´·uBNÌK_*²¨­×¾F’óñ&uBc¶ÀÓ[ê„}TažÓ&u‚ûØ4|S +@͍±`t"|©:÷ó†õU_gŽ‚öPı‹MÝ<£í'X@+>=¬™¦¾ÌˆEݔ´Êœ‰‚˜š–kƒ´\b7ÉE>Ÿ:f`Áø#¨»g0™:!çÂ/¨³xU‹Å›”¸ÒZZÜÒWÄn³ï+F¢ãcjßÔ íª=®ªÉ)áá±pM3/%ÆÔ 9 Bw¸|ª»‹m,\‘¬]f©áՇ‘èF,ÕS¸Ž{è3#!ePx“2:Ì? ŒXL>èà‹³Š;f\"Ñ¥™ƒ%þŸÔ VWa×'Z‰~VŒXèݧ¼®É1bÁb‹@x“ÕØþ•‹s#ê–¬"uÂå7¹I2±¸j™Ðúò}FÛýÝV=åG–E,¸ðߊ"{‘цÕ}±O®"A×:¡@¬¬?'èî´ÿ‘™ÄJܜÐg"…˜p˜vS§Ä×V×Hi±€H0¡eKۄ7'´rf@ ¾QRdF,^òHIK‚7^Î"L ” ƒW£›„ +ÔËE)"b):υ‹XÜþó¼ŠFL ›Å¶â9¹Þ"÷z¾—·UdÖi€/b‘vY‚ˆ…Ķ˜hã}Û´@ÄÂå~?ÕlE,·Œ×Ë"¥žß6( ±ÞrBvA¬ÿHƒû!Ðe¾9 + KŠÈáJ %1Z""¸1¥SCÔ[¦Y["lׄèÆË0‰XÀCßÅib“kê€ødªI®²:à„Âÿ sL±ª©ˆùqô·8œß…Ÿ"Æî#1n'܆/G*=Ÿi«?>†œ0á‰ö±ÀÑcÁJ<’ÂuÝ÷9éD,܆Iš%¼Ÿ«©>•Ù~  +žUȳó9²‹X|”šÌ1œŽY†MˆŸç™˜SB†xQ ççšÀƒ˜¾ˆ£(¼ßÊôfN×îæåE,?JJ¨æÉuÊ"#¸éÈ5Úûÿ“Iq풖-me8ܱ°ø0Â<®(•kB_‰þWz»\&ô?PÆBv_€ˆEÞp(Þ:M‰±øå™Ý‹’fIfò֕Ð:¨ÉB4ÐN´h°ÐÍø¦ð¥#k+„â‡QÔ«­85NxR@ ÔF’}EHRò°Î$”wÄ$æFKm#¶åÒ7'ׄ¥q“2 žöM#K2Ä¢c€ÝÎEvrE‰à1ˆ…p—å¹k§é‹bñ€5¡Á\ +qŒÚ߀X`ÝáÄj¿©f²ä9å±à—;´»Eù«Õ,s)áÔ PÿÀ­¯ÓßS#‘  …V-… G}7Ûãƒï!ª¬ÓØðˆ$಍…÷.¨ »þÓ A,$ƒFü½9tjÂb› eqþ§&ü¯\ºS,ÏIðÌ*€wö@,îÎ%tÁÉ£n¤¼špç=΁XŒÁس5ñåœÒé© ¹\Ï#ÚO ¥<`9õ]õԐjÂI ¿n€X$RV8Õ …¯_å© ‘¥‰ýYÄ*?,°Ä;A»>,ü¥¸>5èI´Ý‚ÑSYÎKONèÑ$A Î4á_o._/I`Æ´Ò8xi·LNM€w±–¥¥ïðy©y9yX""PàiûC†‡ )6ç3"¬ñ8s#ùbªÇ­×5¬>,àµhÆG‡\QM( {Qý81s9TîÕYk§ ¡FTNۏ JÕºÅÒo©ՄèÖ÷ó®l^ô"'Õ:8/MYäºd£¤zXÜ|càÒw¹ô°`2@L ÷Z[-˜jBë}Ò2ˆ05ô]-ºMçþNÎmÉ Î&dý¹6eµ4¥’Մ)Eÿû;PK>,"`ރQ–¶‡Å¶0;Å{XÈ[N2z´G†ÆÓ×{XàUNU;|M‹h˜c—¨òâÃb…ï9Aîùn8ÓÈù°( p&îjjIáôè«æK¸pÁ¬–t?֗&ì¿QÐW +nnêOf-Áÿ¸Î¶¶i³š@0éQf²öX|ÇzBÚµx‰?,â4qUË(ò :¨Óg IÁ0œçÃB¿œPƒeœMú›Æf-GÊ]ã>,‚®ß„ùÃ⧦²)ëÝ´t9¶žÕÕÓ à†‰ \Rtß$æÀ|áocZï)´É ¡Ùšóbfp†``c=¯ssÙ"۲ؼ1m¹;ø¦Û‡…GÛùxj<ä³X°`¤¯ø°˜ +ì!E݇ŏN½Òö|ì®/% ?,jr×QÎ^Lë`kFjÙ¡R%ƒ@,¥`Œ7_z®«ÿ! š‚$ÞWþ ÓI±POÆhØùÚ¹?a|˜y’âˆEÕ¸I@Ϭ±Ðƒ¸ÊÌm +Äü³\ é_Œ'}  ã18ÔP‚ƒäÝU%DKñ¾*\>©ÚUûzÅ/d@,¸Eؑ#žÉ{"Þ{/³ä(•€øèmbñIselA€ ˆ…ä#œš¥¤0ß±Ì%XÀÝñ§õfbAa>ã‹ëj宂¯Hy±`¯ à¹Fm+%—~è½ûVì‚û! ÄbÉuï“Ä}5ÔÍ×I(åžE½>‹Ó°C©¯; 0pba£©0 ˦À¡±Hy™é¹á1 qâGÊô4ôôe¾$4ÂPóŽWP–°0à†sD,˜á‡=³ðMùQ¢‘¦‹+ôe!k"ÿȔ0Äb_üª%…XøDɚ3§ß„VˆE¼‹Ó×õïВ‹¢Æc‰ÉÔµÚ6tÜöa)®•Ý¢ª@õ¨ðbQqg©iÓ~€ÑKç“ y·B_“-p±ÈXÕPøx“0” ÿ/MÞ«®:þl,S&B,H ñ…Ø£báå1€'l#ëÂ~E‚%A«!<#d·€`؇XûniãÑI’ !Ô$0ø\$׏g p‰!pX"N£ŽX€ÿl4®ÃƒAÑñ³ƒX@>ƒýáÆ%ˆÅŒÎ4nF‡ ^¹vŠÃ$¡=B4tǝ5²€p€X¸–: ‚Äþí É¼œùßi¼ÒK~±ð{é°®‚XÀè1¿¸3 «/-’äLÁÞÐI'¼@,$dàKºK×ã¤øÛ©²²“gÏG菛Ñp‰#lçlã²ßŽûÂǤ–ØÛxºz@,Ð&À>Ô*pØUÛôK+9HwLzvª¯‘@_i}ýÁÆ" ± ÿäµoé‰j”² ¼¢{gÃ@=ÒE®¥ބ½sògSÂö¡^!4BgÔá,zþìN†™3›ijr4ãül°&Äâ²@#,¤•­Î¢£­Ÿs] ±ØÄ©ŠŸad)Q~ìIÄ"yŸ¼“CˆE>öP# ×Ȳ٣bRŠ`?k9€×¸¡ÌX¼éÚ£N„Ÿ4!.(”øÔmË`bᯬþ¹$SñÌðQ×pÿt ‹: ¿Q±2™”n#ØF*åóºòBUŒPAçΕvKTŒ-ûÒÑäߤÒÔy^‚Š‚½Yý{M\Èú $ùŠS͆drb᛫™Œaüa±ÈYªÊ*#¤bѳÛ^Ë$¢'Ǟ°y´b Ÿ‚¡l +>ÁÉ….˼1ba8â»Ö놟ù·b„ê9–tæ0Œãæ0ˆ£ ‡ ï†!3uå~LOWŒÀ®rtbnÆ ܂nï/÷iÿtb„V=Xµç€Ê¢zÕÔYò‹ÃØ­m~ñãçÚ ÅuôR Ü£#ˆ€®ñŠ³ -¿Z[QŒEªpä"Å¢œÉÝ+­éÃBH˜î¢õLj>,šÖ7âmûA1ÂR4†_™l›‚‹íà Ò#[¶üÁ¤x„¼¦Á }•J¾itrñõ%•äÊ>?ù=CCÄt¡A‰§Û;l‡"Sª%£á¶íq#Ì®=ðQë fXHôÉB`YÆBðI¤Ö ¥ò=«ÿo†bÊ°Á)§ +#y ’;іþU1BtŠÁýŒ qÄ ´í4>ÃTi£É&܍©Ð÷†…‹»4!I-T<àoXªMSûk°a +r’nXPgCñÓÍß°p:DኘQk4çß°ˆ Áú¸ä åÅÊ0>ÌYÑRÆüM†Ã‚1o-šÆa$2²&LÍ×1“-ìE‘@E^¼5ú¾7ÃY ã%¿Ðš=´Ó$T»¹ï~‰ÉaP&ê)uXì6ˆP NŠ äükwy&šn;;,b_äPƒ%‰6i­wX”}Ó{¼Ç~ž»ëôöœîƒwXxìȟ£Þz¬;, qߺD{ÿ ªÏ”yÔKKD"—Édíâ:¼‰em)š¹¹-v"4ÉQb; ºyXd€ÔbgC4‹ŽÁ>³l*yo—è9_¹4ÀFÖÃÜ.’Ì+r|?éaq¼'}\S¢6Úé''ÕÃ,Y/¿N½i1÷¾„K@ ~ó)‚)û%VòA"œð„•+¹® 4Š #Qa~ŒÐäÚý˜5ß <,|YòÕý%I~:Þ¾$‚‘-®ÒT¯¥M ²8\žMÀÎ +U¹æGW²>,l}•ƒƒ¼ñ™Oäž?"|Ã-$Çÿˆp¦øô±jûĵ3ý#BlÑý²ñè•zDMŒþ#ü}|X ]@,œ'yø×Yb龎†«$«¾8ð@‰;²óè9ºÛ‰à¶%Ò]+ÐVž‰ƒX˜¦ÎtœÌbýø¬Uzˆô‡ 6ч;&Äâ¦k’4ÌnžA"L±0ÜÁ?,&%Ûâ™QGúÃBD³ˆ¶{ó‡…Þz%8Î) p‰Àµ <•Gäö‡l$˜«´U‚D(Lیõ‹w›[ì´=~ºÁl€°àÿqg´ckŒ®û…<ƆZ3<0Ý=,\rzyl¶ãÐõcIxþÉÃâiàÜwYG†÷ ¢HF‹8ÂHÙ!kö=ºûyáyr¢¨Dâ Áà÷å;ËñöxX Ò\å#‹Ý—>XÉÉËð° ï‹­å½£D“ͽ¿ÆåÏñ•ÿŸíG„®`Á¼4(GÄnJÝö?"¼ßEИ•Z£ÐY˜;,W+~öG„T~6€Ywf?"¤ˆ®„ÚŸü$x!„ºMî k1P˜¢¡¿­Ê‹£‡¦ô`2µmï°¨AÈîÁZ²vX|1,ËøK­!A^^kÿa«à@ƒVÿ᭚ðKÐ&¸\7ÓxÖ <,ð§]l˜2wX@ÁE‡vXî>ð™G4ç”Ýï°Ða«\Öäù@õ‹H«m#èN-mÃôƒ «1¯ŸÓ„Q(¥¬¾0 ¤×éÑ‹,,UyÇI—zž™âoËZ(AJl…¾C„Š¸¦„ÏCáà¤á"õaqÆL–F"ØXNHL%h‹òÝA,ôm +#GjkÄÝJ£rž ©ý-["°Ý6"¨“¤õUᙃX¼¾U#µG&@,òõDƒEªíÔZ8SO')÷,Q¬±ß²‡õ°€4’óêÎé„R!‚!1ZÉ_ò ˝}ؘÿ‚…=,`u|o¹`üéaA Ë͟_• +ë¤À(#—.^Z‹ý ]â%ŒpèGªT˜ëañO@u××ú™· +褪Ë@œen¢wL^@Vˆ`1°ÌÏSؓIV‡…ƒÆ xeÛ¤¬^¦ú<´Êl"Ô_¶p’é" Ã¢Óü:g0#ftX`#pä—ø UçV“7òÌ+D( +‚I!ã;Z\!B[×7[ê@wã~Š‹â§wÃ2ú+Dà$± zEŽ ‘Ãb6`‹3³RF…Ô&Z*‡òµä°pÏ„OY¹ÞF™ÆDgâb ƒW ‘ùveLÿ¿+¬9QкZ{Ч0‡ë_.T»ß¢9,Ä +ål\ZAí,á¾ôˆPÀÿu;-2Ã"ð¯¡Húk}ì¤jJ†sµ ÇB²]©?h“lqXL ?Q òã°hYºj‡÷ð{Žš ²:„ +;#]S#'Äb‚Jõšöœ£:ÜêC »OÎ9,î+ô½©0åsXdµnU‡ýóIÏú/«Cˆ\:‘øB‚µº°^àdÔá\tÃB¬v³g“BÔ'.-™·aa´¡Âx¥uC%.‘L+µ†Å¨Ø7! +‘¿:lo׆lTG…m¯8Åa"1}êD'£Iú±/>)M î+Ö"ç7,^tŠô‰ÞÖáΟMv£Ò¡ü°/m&]œ·.çC PÕ}T' +¾CQ®¤ñ!ùÕj™.耫h¼ì¸‡|ÄÅ­†@Yâ&8ÇC½`.# Áa¡øPZ:lL¥±Ó4¯üŠ«!è~ ó  Ó@15vÓ,Ï'³l§4A5„¦[Þ<ÃæhUôք5­²-y¬!dVw½µ/Ï&‘ ksŠäÿùí7œF¾Â]å9.dGi5„^¸@‹„ùWCàŠxt}ØpÆyUÖ}_5©¸åIÞaa@ ȈJ­]ùzþHs¿†àZVY" +fÛR¯‚‡Â/¶l‡…Źø—µÑañ‚Õ¸lcþã¿>|Ãòþ ¬iÂVeàîàý}ÂßuÒ\u]™w3o÷ÜÃYáÊ¥ ‹Ç¬YNÐ9ĪÂÔÃ/ xŒÚ"®D¬Dð†…ŸGcPòeEï7,<w¯Lì†ÅsŒÔïåúžÙ8§å’ð†ÅOPø‡À]rpîyGºGDáä -©·`BK„RcþËÐ.—Ó ‹ì¼¼–²ÂíB²Þ~©Ò98,T™F½ V‰—8,JÚÚ 1n×)G㰍;­QlȾ~¼_RÁ-¦£óB‹·ìþ%lšÈ ÙÔ)YŠ9,dpçu R{-XõáI†hºŒsXøö‰x"6ñ6Àp¤h–‹…áڃÞMÏ 2XÐӛ©ËgD4Yèíç?ýuBåœâiG@àZIÕc /Ft½h±Xcɪ"Pj‡ÅÜý‡ÁyXИo. mµov‡…©Îض/?LJÍK¸çãÑ'Vx?ã¡sÈ1•î°øõ·lÆJô ôvÀ­8‹ëÝÉDÆãU4ÛaᦠU>™6;ÇÚ~0'ŽwãrX›¼´²»gj‹A©S플¼ùÁFà# ~ü+R‘ü`)û¯ÕôÉØ{ oš­Rˆ*9’ÃBæICÔ$5‡E?r=‡B™ñ° z´©ÌÝƬ!áä°H3eAB=‡Œ-û²"¨r—ù·ÂyÎèÒ@ç°p}ãÐõõ5įÓsÃJ5,Ø3‡†ù9ÅugXgÑ Vfñ͒}Տá‡_1,6A•®åcŠH†Å*ñÃ"fN &_`X`¡ôsóÍÓ èçY ^XE#¯vóÇjî“Ø;$ûÂB…Š¤Ø†Å÷Öc¤fvI}.Ãâ, +ûšyÙ–Xi˜hO„R«ï‡a±†ý1ªÜRuºã7iþ½ýnŸÃ°°%Ûß9/ „6æY±ÀAge Üx?/jv֜MHê±è+Vb1]Xü]”ÌãÁÙȒç-ƌîŠ†ìt ‹˜B|×qÁ’băҙøäÓæʓTË Täg¾Œ.,ÌÙËY0ÒWáÂBùÙ¡–܍W tMjºDGð +Á·qaº ‹Ð“G3t8ñCØkèç1H=°˜Ía£žC腡5)ŠH„4Q¶îÁB˜ÇÂ@l¯Tµ¨,,bÈ/O$Ú; Î)*@[Qw……6ëbÆàÈhcW¢ +‹ ,Q;¿Œ¬áVõšŒÀòï´èµƒ ÊýÙùä9²<ݽiaQ„žÿE-,Ö¥ìàeªa¬•P_ÌÕ=®|îO0"Á´ûÀnaáâ ˶®¾ אØ÷d¬)]òê .ìJÁŸ¤-,ß(k7 fêÀV´Vè‚)ÏåYX 0’%P™Z°…Eý»_ J³öÿ}hÝ6µ®C¤Áî"¤F!Ñ­€ƒµ°0†âB–oÚd(ZMínµ-,Œð›’ß<² +ø†¤-,d”`¡þ‚œƒ~± 2@<ÎAtÕcCdà?u¹ksPmº……Ð'¹ßÆa=ÄI%I^àû»fYsÀ^![yÉÏÔæ±jŪ†Å} Œ±ã/áƒä(¨hæ)NÞ¬inXè›Ä Ë ÂÔÞߥ‡Ínõ›pXL×iƒ1í Ž9Ž9³Ié±Óßó¢¹I â@(qXìº “[Û „fìâZ_”.&LñŨ…!ʁŸÌ “Ûó‹”Ë +l8@ҍÈêk¹Õ^6,@– ;wìRAõAlS ‡ÏÏ?|%HcƒlŒ÷u´°–ˆØ Ý ÈgYb*ä…° ýy§ ç"º )älLÕ°ˆ•ô›(ŒÏD ‹·’Xyw +ã獙u×@ÂÅäò¯òüx”q×`r¾Ù¥ß.u;QUÊ >ÌüQ<ƒv©¿ 7,Z~RàÇ'¹¾aÁ“„^þxÃI®ntÃÑ-‚›Š–ëÈÜß;Ù¹€Èˆ®Ñ[@ÜÇft‹{½aaÂï直¸7€¬HݟÇìóWs!k”y° R–R:ƒC‚ ^n݉æoØψ¼ù4.•åq'ÍCkXÌuÒ;™Æ^yâSþl]!ےÆd—F¤]½†WßvéqŸ»ü²y×}#,~3tƒ4X”Áâ^‹Þý_ñ"^ý +X—Ò¾‚`äe1_qu¯ˋ¨^ļâ'–Pv®°kya±+^„‚ñºÂ«ul]1Ýu…y|Òcã-±Ä«“+pÂk¦¸"xà +ãðV¬¯z[±'ËlÅ©è®'ՊÇú%ð;ñb•³B»¼Û¯fŚ–ïR%^²‚íb…@‡‘‚çùU¼^1¯G]…L€—F´Ò€×N*W¸©‚m¬â‘è¶éUA &¶mK ³*lVU¡ U‘Š©b—GŸh·%èM×P…ž¼}*s÷Ë£S¾]·¦Âô1!WRa,ܞTL©À{T …F……܆®¨óÛv«Øq ¤ø.œ¡bx „ +4:P1¡‚GHŠ>±®K«OÁB2¤3 ¼¤5Qú,;œ"ƒNÁ´ë’yœ"7+;ÓmUý!í»hBn ҦОMœjŠäÐfÝe1SÄï1¾cŠ½++Lq”/v.Å4µö ±ÞµYa)¨é]–BJùUŠÛg—:¥¯»~S +ùÑôŽÐ»jNòQ¦";)H™ ÁmÝmJ +k‰· H +|ÝÅ]¤Ø&¸M-R`^‘®»¬Ràh ˜áÍ5qêÊM …܆!¬S×éXN/þ덂±Éë܈*˜Qla¼äIt¯¯«k/Ä-¹Íê¢z²È‹" …IxÙOñ³Dq$^­hã%„(\ì¡XÈ¡$^ì4≗CAã +…Ø EŒ"ÛyPÅ«šAŽ—¼‚‚Sñ²GPT5PL¢‚94¤ö6þŸ°¤xû‚ö/à±1ñ’åg›âõÍêÂkL =P¼¾ëxñ=iò6Æø‰¸/ˆV%^K~¢/r&¼@Ü Ä+ÜÄëÆOÔÎ%^ß 2±/vâu*á¥ô~,¼Îâ!¢xÁ0Ùæâj—¬M^ñ)f~¢˜«ûÆܶŸÆ_`kgr†±ÄOp´¤>yÁ#¶þ'±+ÃÄø»rbPüäÍ>¡Š3ô‰Y&Æ昦îŠÕŸ .p{ß Ïxï‰óº‹ÁÊ{bâ¼äÝ“»‡ÉŒË‚3æ¬4¶òžpJÅÆê +@—ùnŒGǾoŽ!Ä:V3ß± + Ç’Á½'ðñÂÕÝ€L-dAMÕpIäe„?d¼ EænÙÜéÃÝ[HÖ—dêRÉ¾î ·vÄwǦÈê! Ï#‚(Õ%3YÛ=Ñ+½Éèº'tx2·§”y÷„PôžxÊì\ÔH”()‹‘4ï‰ß—DýE5KÊ0žÊ03àSÖTãÈqSvUðÞ¹¯¦lOû¦l%e8%Ê®J¹>×.ï‰2$ÊHOže•ßîdÄõà{bIq“=+ªf å÷„Ê6' ¬>-A¸Éþ䒣 |B2­³K¨E K\™—èó-a/&«µ%ȱ–À5™0Z‚%Í›L"²DúŠïÒæl²"d ´6qXbÛÉ̯®“]]‰Ü±•`•Õ* LK•€u²GR‰R ‘J¬ðS¢±)1b“–²C¹ +n8Ÿ€Zƒ¤„_l”˜H”°1¡„2@‰[“鯩íd|æžD2‚œMJÜðãJ‚ìKfÝg®¹Ýy%í`Æå$Ü?™â&Ѭ¦I!ÊrS&&RFLb£)ónI@PW ¯¦$0÷$±•e•$VF KHbe„Ur$ ¤‘°„F݉i+Þ&ûFeùD$ÖF•©;$ +©Œ–!!Ü*³ËVöºVÜ[_Ù¦Ú+c¸bV¶©èáVe†Iz\•‘ëƒVF»#öÊÚn,VHð˜RÏ2žeHUÈUH4f ¨±ì¥H½²çÄye…ÄéÐn±ìÿeÐ4˜ÄSH4ËB¬.H`Uj*‚H\œeÛð‰­ Üú³ & Á\ŽÄ-C½€¯1 ‘Ë„¬~Ä­ØGèÇG,ÉĵG„eØ´–³¬²GT%ã +ô•µL ¸7i–Õï`Û¼ÖøŽoŽØ{«ïȑ#h‘\9¢žJ,×ËbʕAŸM1–÷ʘr˜çlðÊ¿X†I, UŠeR9‚åˆÕÆ#XL"ᘅ8 –GD{±,Ny‹‹ƒ#T­¬ôʯÚGˆå+£Že?BËvÂëJ*1Þ«„c¶ ¡..+¿qÙøpDÙÞXZ@\†±pÙTp™Gáu-[_ ¸ õp8âŸ.‹‘ܪº #Ž¸ž=¿.{“]ÖÀѝqHaሌ8¢]Q<.›ØeK-qă8Bοk^½ìŸüeì1˜]Ýa&ٍ ^Ìl¶ˆ ³G6"­§”Y“Jf¦+ ;33hijpF 8ь~!•ÓL¹Œ{5“%#(ØLLjXrÏL˜.Íq[I9ÉÍ ^„¬½Ùáñ9úޛŋÀlF®@!gîß"+’ë 0.µ'@ØçlÕ,Â%Wr9±!ììfW„KwÖdEÌᙑ*‚yvÊÆTϦOzÏHNÊÛ("GŸyB9~¶ÛQ©?ãr"´šJ1ИšËmFé~>hö;DŠB»E"\CK‰D šÑŽHD{eD´7ÑlŠˆDŒ­½±ÍÖaΟ$¡ˆ€ÑhŽ?8ŽvžÑôhªzˆlvÂChìÀC$#M»*i‡sˆ>Oš-œÒo–V› ±¸¥iÕÊL ÁÓ4hˆüdÚ¼ áƒsÕJ67-† /§Y¾Á¶æB”Ós­…¸§ˆµiÀXE¨m´B8µb§FMJ +Fj(D –šÿ ‘ª©=mBxŸZÝbÕT’¸‹§Ú¿Æª©4BÔa5ö¾×N]«¥E±zËĪzuµ®0ì  ~5;Â\×aMÒ r8Ìáր{~¿u1HCÖ`At»©¢ ”Ïš,ȇZ[KAÅÖ,'H·æO‚àׄE ̵-¢ª®Ñ<Àà@<{×Jg ˆóš5Ձҽ4au¨„Í!*¶>‚'ØTJ "¶¢œËt̖KœÇ u¿“ØÒ¬›c"&æt?¸—È\ÝýØ +Ÿn³\&ēŠ±Gٔþ‡t-Ûô´C³‘„m6$þ`g£ö?Ûlmsi{°Ñ´UœÔ†Ã[mü‡$jm;þC~I¯í_ۈ}¶-=¶íᶹ©Ûæ0o{å?äømz¾à¶â?änoéâv× ä6sR”ÿøÅMs‹Û·3{Ürç?$ã?ŒÑq#ƒÉí¨üÑÎÊèؗs¹¢Ü0qvÊ-Êm17fþ:7E'ºí]ÓmÒÈYÝîðuCžÿ¦Ý ž³Ü-̽ÛáƎ፷DþCoySñÒÿ¼½ê- °·•{.|£°å[Sß&ù©ûfƈùÍÙï›P|ñ/ߎð"óo÷$ë(KYî¾?d¶þà¹ùý¿I(˼û›Øý@»ì‡Ö” LA?p{ù!âøÁýß<…Šçû€Ÿû°àÊj–àœØ¬€ÛYúœ¡>¼pô®Ï‡¢æýE^‡´òa0•KÿrP‘:Վý‹ë·Im âwÈ„ø Ûê7‘b†Ô“–võø-|)ÊMUê·ú¨_PÔú­ì7®àñáSY¿½ÞfÜ*ù¿ãƒ*P¿UÄ×¾Í=>L$¶˜Êö>>ä*ð-œ®&ßE¾ñYÇèX ß 1¾½!Â<¾í‘úƜîÛµ©oÈÑ}ûº÷m"Ý7]$ò!n! ó[#ò¡×QË\C>”MfµÕ×)µ>4}ðAƒ¿qùÍ×ï!eÂ|³¨šv£ÖšÄy“8’÷pûï7H÷è~»ãýFçzq…÷P÷ü&îžRù ¦¤¥Jµ±ïÁcý¶ô·úoè2ÀíU@·'ö‚C0NÁ0\¿Ùý N[ ƒ[%7!\À^ÂE3…Ã0îǕូ‡¨Nîp£çÎá™÷ÀàWð‰«ç,ÛLœ'Ñ| g½‡›.µ÷pÖ G‡78¾1Ü{€}Ɔ[{Ãq;¤Ž;ð=D òÞà fì=lFAŒ¹ró€pŒŸY\¥}@îÕ{HGPöœñ)p"pï!]§¶el­þ 9¯­È téü5nÀ÷н‘/¬ã9Éa_¡Ä0ùÈ);ùЇ©güÂë¡’KÞ=Ðzw¡’,‚5$(š{æ"݊KNŸ’aðð?ÈßW†Ù$Çí°g%wvèz Ñägri‘ÉQ¹·³ëÁy]g¹)¬œz&WT +ãB·Ž»x=ô_ÉIF“+99͒Ÿ¡‡®êa2—P˜.)VÎ_‚W8g$Xºœpz=ÝúGôfOHsÿe̍!=D¸Ê ²ÌuXbVḱïу VG]IÈ\Ãanoô2§Ý@ZfŽJ–“hŽcy 2灉Õ\²æaäðd~2…ýëÍÉY2ƹʃã9Wžú•7Ø9šçW.<ßx˜ê9ÁÅ +X<ÛþœÛáè^ +ýA'YðC÷)xp ÑõCE§x@Êè†û͎Nuï‰tç#jå y„(‡‘¼œsL#ï¿­ã Mg’;q:îïÇ~; Ñ·CïÞ£Èé°¶ƒ§Óeí⠏í`°fBd‡¦dxª¨q: ê MnœZ©e@®¼qºÂ§:,x•:,§“Çmqv¬`…:8…¡·^›¨ƒ¹É™ÐҘçéðËEz‡KOW)è0oO'‚ŸfŸû–çà!¡.žÎ·Aëp»uBLš/êˆÚu­!9,À¥—é-‡©¤ÓUkQS;ÔA(&‡}Šä‘CćK;O uø Í“wl eŒÃDnµ8£8Äêæ?ê ?²ù]8”¥£†ŽX8F8¬•'̛ù¨#é Ê7€ƒq¼1ŒþnK:›ßÊ5ºK/bC‘nÈòëÒ> ¼!¬ð†•Ü ºjØ à„ ¸ýtƒÐs•Ž£ÎcÜP;¸áa)¯émxu9nÃ{…¶A‚±¾6ø­6¸¿Ô5ЁêbÑeMÕÙ|Ðl˜6ˆ±‘løÉê2MÆêˆVׄ>Q€ ‚Ê«¡™î÷rô¨¬Ð™k(Ô­A@ÜÞT§æ´†²ÊÂTçFôÖ`#\^t5˜Æj¸ UäSÃ7ÕIK ékÔ0A¨Á´§09 çUç4 W ¦Ap«ó{¥Ì^‡vÒ i û= ú+6kx>e{NBÃíV—"h€í'ݨOÿ3¤Ùg]uÜö ¢W&ÏÝêìvv)˜t†Ë“3ŒØê88ƒ7í.¾f0L3lvf˜›Õє„*õ3`b$˜!Û¬ÏËP¿Öa¸ â¿u:PŠ®£›¯e2h@۔ÁI`>Oìëà ‹+v¢ÈôØQ9Nv0?…Ù]/2øçìªC†]hç 2`ÜžC§ÒÎÏcÈS»Eƒ7×®ˆcØ,ÛÙÏmwÞ$Ž·ó^§wŽ—3Å$ŠAHx181;‹áصCªæ®;¡¢Üî¨-œîfüUQ1Ä¢ôÎ*ĐÛÞÝÍÉw(€ö5‡è[½]¯AÕbû”ÿÏi”ïEaèÙà‰’0$Gxƒ…—n0l@uÁp¶ÃFþ_PðF¼™ÀP×ã0h#žuL Üæ•35âuð/ŒŽxöý*(ÞõÌù`Š ŠWz_ œØ~@¾óŒgú4'#)^Q_ÀŠ +¶ú‚ÖŽIVþ·`¡}¶·ÐO³v XýÅ!xr ߶Q„&y‚Ë…¢…Û­…ÁP\F§F=-ôª´0Íh!:hAËõ,ÇYHêÀ/*N ‚& Ø%²ÐÚ± OÇÂZ´ÏŠ±pB±ÀKû"®YXà6Xx3f’[ܯ$IÌV¯Pçñ`ä +W®u…²¹‚-q…_v+8öË!µB}ÚçZ¡ÅZÓÓ¾¸¬€—:Ç +*·à–^XAÆWÁ´G‰Ì íM¢èÁ*]WNj§ +“ôA†ùAŨšöNÃc*4 T°Ò>T(ŸE½N*¼:PÁ¢}ªO¡ùìSO!_§ž}ý"t +Tçø½) Ëp,jEM¡å˜ â‰¦ åRÈ–„°”=)4/P8)Ì8´­¤à"IÁ(‘;´¯V²îÙWÕòœ}, +¸µlÆqQ`§(,dö•‹³/êCû@£È÷>ˆBžQEp(üò'0™P¬ƒBŠ‚‚£ + PHΟpƒŸËù¡÷…ê 92O¸ Oh՝ @e'¨IûLT'Ä]ϋР?i_sêq‚%ÑOû̾ It8ü°V~±SLíûë´o²Aœ#iälmB£6AñP^r„ÁâÖ&˜ Ó¾UÒ>¹_JѾPmŒ$Ô¸@iÒ¾ YÑ>ÀlÐ>r)þˆ¾Í+$*ĬQ:C„©b}ö]û-¸tÚxZàÊT }äŸ}‹hÜBIÏ&Dæ +*6UšMÕk‘ú³¼³/GhD; +š}<šò`ÁúŽ² }}Pjö¡3û¦]öõSÎgÖL³ ‡©”}C›"~²Om¦&o”6åĔàÃTu‘Gç´ e~ñcW„–}ä4)û°¢ «hB·š°l2³OBØË>%ÙRö Nö́샡 @±1´c:G‰&d/4áW/öOÆvØì7b39R Mp63øÄí-Ã> M ö]J5h‘œ7 û\¡ –Mˆ"h”Èrt·†}»†&äg퇫:öŸö øÈ`²ˆX û€ö¢ ÊÑ«º…¿ª˜ M ‚p ++tW«M(öù +û†"Ê©N²ªÑ„Â,À4!MÈaŸ$M: „}Ù39šÐ!H!êg‚=ìóm&¤Y3<˄­G&|[d,¯/õ b‚öÁ?þ<ê%ŒÙ%ø1.a][B*Z‚ãY±O䯄ì@Ò×ð•3®•àX%¸ Q ïbM 3±” ‹}*D ¼ˆXÝ!àÜ+ Áôeü“ÑÆ>ÍW«‰ Pb9Ùl“p÷= $“@·%)%aõ$ SIpx#aLl$Ø®‘°ûÂ"!· ö^ŸÝ<µÃaF`_a„M #´I€Jµõµ´túÁ"‰uS§NQ„ÕóDH·>ÏD@R‰€ÏF„Û."Äl}æªõ]z[ŸÉaÓ<üêòÖçá°1këhó q¯BH iëkQ±Là@B˜BðÕ×ú2Gë;,™~æáõè©¥îÐ& ðÏ9Ù `­OŒAS-÷(!„ák>’b t [(p´>å€PšõÑ1.@€Ðüoø—¼?8Æü¨ûfe}ZÜ¿ÇròJæËÂs¼:²>ޑg}d샥Š%±ž?bwÌ«Æ[öýIܚ5ö öÑØ9­+jz}P6献õõK +¼ì·O<¨¡l}¹j}k(Tù@^±RËàƍ‹Æ/´>l¯™õÁ:Œøfãƒ@­Ï…ø 7÷À§ö`ˆN" {@ëƒ]!T­{¨ÅÇÏœ½=Š²çÍ½­OV„ˆ<¸d<˜²jÐj­7Æü•µl2ÀZß,‰ñ€líPˆ™ñ ™‚@Lë÷ñ ÏÚgYë;r$[ßÊñ`àŽxŠ_E2×HåÖ‡qz.aëã…w¿”à.ڜCiÚ"0tT„Î1îQ AØ•Êے’¶X„Û»ÖPîPúÏPöë?Qیæšþ‡ýSîPúCé¥ö?TýQ»ÿC«zB„dfff&˰鵊t·‹Üì"Ÿ|ΠÀ8_J'4#ÍˁÊÆ”HadÏä¢atýÐ*ڎ eQt;¬^4„Pˆé¬ˆì§¼~p5UàbÃÇääauÜWfL. MٟȒ[ ®!¬ò*BwVPè©WdåÊ !(±ñcE¦¼‹Î®-˜ô;¸jy@ˆŸ4¥LîÕ!Ö³„á¥c‰×äi½(—„vy¦ßÒ9ù™Ûs×ù¨~­ýA¼~®°t4T 6>ND<} HàrÀ59VD˜‚hY+XùY¢ ÅGÈËò³$Ssnw†UŸ§8õm>¦V8lferÇí›!]e¦ì];'ïÂI[®GjlR.ÍçäC'_B}Un©…å¢}‹"õ¹-¯"®$vĵ̺vMë:P]žh¯Á •ëÊMû^ê¿¸©J©vÉ-£“¢&×1j•{î3x¢]xš\›œ‘6ñaê°:fQbÐßäýMÀœ»‰ ™•Á-·¬]SÏù¤ÿ…˜#T/Ëk Kú‹¨ ›ä–¶ì_l̞÷‹úÜqQ «HíY‘zCê?¿Ü@zOà˜¾Ð [˜.Úë|Ò>Æ{ng»éÎûIy\p©»€Fؘ1ªö[nsŠÐ>tö±^³‡ñž¾n¹·vÍ«hkâ•Ük¿d¯rҖȖ¾ÊÌù«Ì˜>‹Mé—Є¶&hCØÚQk“cî8ÃéÏSœþ³žSwñ˜ÛØêï ©R=aӟý”:Mn©]í˜:í×ä]lK~ÃʸgP÷ ŒÌðáTó˜Ÿ'Û¯éËà‚ô +„È1:@#`F+ˆÑ6ƒJH§%„ é É-",ipõ<͆CZ×ÏÆÓH„B áà)A |\PãótR3ÒarÈÝäÅr3^iÀälîÁ_µ«ûAÿ[³o©5ý.£­J ¹mõ–ûì·äk@å.û-u˜©»|J>·ìA°úJè`’ˆ?*ÀAÍè’[š]QÖ-.œÐ ÄqÂvÌÎ쌾lh¯ d­cn0MÐÃÇ«L2;#¶7dj_pÆ(²"(’ØQ»¡æ¸s°AòÄem §“ZT±¸Ô‰ÅåvRK®èiƒjÈÊaEt•Á)·5 ²WõŒö5 ¨ T:|ØèšØ - ¨x113FÙzÒ¿•‹JÀŽ{ˆ•Q[kî5·¨ Ju¹w€ñpºÀ¦F6BP/µå¼1Z7ØlµK¤aý0q`YE¬”ÙVS'ÁZjilн¬ry¾éoóA÷8ϽµKê&fDXZÏÉßzÒ_ÆæÜYfÍ­ ¬©«nÒ¿¥kò·“¿!:ý;Q¿ÎS—ýQÀ`sKë9õÛñIgtrñQC¡”§\ã)Ãê/*5c{ò0¶¤¶ƒjˆ)D«È ¦cî,³—¹5ùšÜrÿŸ¿K×ìOdËmÍ Ê—ˆ!±#^GëK­©}¡5uœ“Ÿñ ¿Î'"áBê"Zɽ«HûuÌÒܞý +çÜU8(ÓE{Ã#n¯7õI`F(‰µÙõ°Ð ’¼†–X;¦V×£ú°´/‰]9°„œD¼ŠžrA¦Ž&·!\<–2¬vyõ’:îçüu>¨Tk·ä–x){YE +Lp(™Ä”ûIÍ(;b6…b+Š¼ˆ°%3£–&§ìY¹æßÊ5™r;ƒ[j‰D&ßRëqjÑý0¹‚BO5¡1Š8tîº ÓWízŠK2ºÂ|F} ُ¶‚LOJfø˜[h¡Ð"ˆ(0’j?\½d¯êù“Ñ^»à€¢‰?6 "‚™F„ +ºž¨]qHáÝ`bý€®1;¢lÌwÜGf=Ö *NñË \?L2¸¥öæƒö²rër3jmrË^(„N©Ð†ô›ÆF0¢«Œ({2;ni¾&_ƒcî%1£­•PöæäE¨„°`¹ĎñYº@#ôärCjIh6€„€Í@ª“= OH!ûÑZ¨ Âæ3<¢*Ôìh!ãáä² endstream endobj 123 0 obj <>stream +¶R…mŒœCNŬföw¾‘†išˆ÷ÿ9×ˉÑ4Á—û$Ç @Œ¢ù+ÀGAÓð\T ü}#êC¶}_ÚžG¸\“ ‘Äwã?ÇÑ|AY&Ç)D +\á[Ÿ»žs’ßØØpëDS$±!ÂÄ#zù³;*[h¯ýýjš ßÿ¥‰¼þ»¡ç²ˆ@Ñr⩍° ‰tLšP%?”Ì¿§ IšX‹û0+uJš ò+‘?–ÁO['¼v¢Ó>EjÝ?BLÚæм¯ƒ”ÖÕG€2&Q±ž/~|pZBöK} jÖÃóA«ŽœxK€P¢†àÀˆõŽg=íž\"œÒÙ ®Ì҈p•N›sX_*Ôùß¡rê­d°ÂéÄus=¦}ÙÒà-ځ"m$bË°šW„â{o&æÍ4ä‚Ó¸ÚANø• +rº,)‡¸‹2h¢žªdúvƒ#ÇOMJ.TDIèô@Ž”¡CbõÝà‰  ^Á[ŸÕûâ#NrFCӀäô¤Ï¡“z¨”Sçu" +òôäӑ îPq'³icí—É!îÿm”b'ŽlF¥aÇ,Õ¹¬i?ÁfR¿ž‰è¢j™ÆÒn~‘nIªery£ =™çF™`.YÅË领ÐAÕ©CšÁ¥ŠK5 N  +ª“5½šE_ayÎ6.œg Ï£†X—5ˆpë‰%3Yè{W:ý®9èyX¬V56NÒ‘Û"Î +àÔ÷ìJc±T܊QCb.s¿æ_À8¦ç_¤ª<óºIæä†àãwZLN:XËZ»DÿKÍh7¬ÂÀÓAhi„ eÈRÛtÙ­®¬e”@?\1!ëÃȘ»b#èÒǷδ+`+3䤊ÛöLxΧ@rÒ;#®Ç7ÿ*aæœÔ?ÁÓ4W5u©¢‘Pœ‰?ò†X'á%U9!TŒj¡gÓÀgúÞ9bœ ó{²ŠtkhP¦Á‡ÃQaù戞˜-¼JG:Ö,Ús“z")é¡Pñ¼µÎ4u¼z=u¹!¦J²›H;+‰Pœ‰¼íC0µ*?7YŽ´óK/£¶hôZ=ç\áÄ6sñÛ<æ8Ñ9ԏ a yo¬¬Ho8½c878Ihj×2 ë`¿±ªcô¶%ÀOŸ`Ÿ~¥fb_PÁ¶J¶¬r¾öŒö· Á *IŒe>Š`$Ž©0xH"¹u‹&»óGÙ{f¥C”&WÔäV3±·!¦ˆ5œÀ qÿþ{1ÖLüÌö[ßÖ컕-CØi&<Ž †šîbêéK3QSƒÊƒ˜¡‰´Uêj´!Þ¿n2,^˼L¶$/' –H~46ËFîº xðÂ×q%™àtF…ûQ“†ÊÁíU"ÁõêvÒ™€ƒLûíçm¦ÐÉÔ]¦ð“œKêV…Ž¥ˆ _Z|x 4T|]0è!Ãq/7Q¥›Oxmˆ{N‰Ò‘܏-Ý[„‘½»Bø˜ÈÛ_¼@t‘KhðŸcÈ/*âu"¾†ÉmW££# °ÆòL†J·­á“„P°ã¨@&ò5¥¾” ÁAa² ñ́LÎ:Ñâ~UÁÆ®;O”÷ǧ'åúl± ñù! 7„vT»ˆyÀ  ·ó‘ ‹ZçªJÀ8h¡’é—CoôáÚbKŠ‰ÝÙÜ|^Æ¡d ñ˜àÜh)áKH9ê- *æ<rmU *ÑàŽÝ®4<… T§ÖçÆD¦ÿ4ñÈIg¤¤hx•çŽüheŽ§ê¬˜h  ÷ ߦ_ÑW}{v¶8I‡U²6RüÎTÒUJ½¤x )¼*Jg¨#¸÷Š°vCÇM[‘Ä'Ì ÿ0=:Qº^ò™uvŒüPíbjUþS¼²€Œ·ž²·Ô*æÛøf[UæØ}òNÓX_…d±»˜ü4FŸ×\óTðŒäåÊضŸøóãW'ùê~îøJñ +¥ÊºÔYÌ]\]1ï"Oïij6Œaþhñ|õóò†§K¿j¶v:Š¹¹ËÙÙ¿ýuþR;#‰! +›1 u?b"tWĸ¾÷3Ó¦):õãK˜Ðæ󓪸ÃÜu_wÔ†mÒ7Ì-»5Ll™PÙØKa¯]ŠÄ¿oµ„¹XìŒ0 ¹â'ú_ÚÎ't0ò¨Mm02 +» V{AlOùüRG|cÄM ÆÆìㇴ¾ÂG½OJ£!m%®EФRÀ<À¤¶#$WÒ:ñ ê’s¿ 6çTæ%*§pçÅ«¸:Wëû¾I¢Q‹Ï CÅ`î(FD4à¥|¹/::¾âËiÂñƒŠk¹œ”?jÝ‹Æ~R·Wð—k¥È•pÌÏö¥ž‘½àË8ýÄëxw ®^zˆžL/¿÷K%2z!n´îHív{AY’÷°<ËÌ¡I%”¸ÏÅV¢wWϧå´gÕo­‰·˜˜ö$÷¯KªŒÓâ¢EËêjFDêŠÌÓ3c¯V +Ú4î]Î)+ŸË]FT´bd‚ÿn®°èB2³à“"ârÑ~¥ßJ¦¾­\¦ëQ’ÌF.jŒÛr@Ž$øפ}çi”™þ­™ªo‰â‚F{KA~æ-¾’ìÝr\Ë@ž¢ÑûP™½-ä›0è£^ªN@j[¿ó<Î֖õbù×ÇöHˍ§NàU„†šŸç£·Pï“%ÃV8nÅ0P>4 +Ÿ*Iè²cy ´ü’ùÖEíZ-@rØu¢`e.•"h«_0˜&;%kùLp%‰f&ù&\L㏍]ð0°+gV‘á´YE@®UcÙ±iô“KË;`¢À‡}2>+‘lUYT/ó:ò‘¨òƒ(¤í7蕁_!`‘݁Ê}€t¤`ØÓæQØ5X-¶xÒ´ª =ñ&i?j + d0žâ§W‘tÜã;éŒY +rPb­ÂouVŒÞcz<æBµé«‚4‰àVåÍK›8G™rUePvËTeʜ:öTÑÌ<o©ò«ël^GZ\Øן±†|¼+ÕˆŸ…8e£"þ]xT¦U4%`þ+Qá̔Ý!¿xiÑLѕÁ'7ãûÀ”ª)=Šbøq £®hSÆuJt>ª©›9ùÓɪYߔ×!‰¸J<2@<×ÙPæÞ3näÒV 1.¢Ö—¾aÊ9ynâ«Ù$Bœy·À]ʽ ªqK¡w·ÓQ]–òæ{j†W +[lÏpªTR6\¨ûÃ:/OÕźsãúÈA\ƒÚîk¦&D6 ›%ª¡q…ŠI¼X’—T.2Ú\RÐdmØu6·Íß;G_5œ:[>˜ÃŒ 8©ñµ¢¨¬§ãM ŒQ¤î(ù†sdáXÓ`#ª.ÝâÔêI¤c~øÚN I²ß"=RtŠ +*?óP¿ð‰—,-q6mß´Hý3ÇO¦ëRyÜÅؗYy¡ \JmÎïÁAâoe¦¿ÜaEÂ֏Í“Rñˆ$Œlòœ#u)J’”Q,JñUqFuw<àÙu’¹õ28–7$¤tñȁwºhrœm=\Ñf‰h˜zo¿F‹«j3¿»g +|¨"z“Ô÷ç5»&ÛUÃ`­â+l†ŠpòÒù½8ÐÏ"W…ˆ¯ÇU x2ø±L¯²ã„R΅5½Öà80âÁ_y#¨=ŸáÉøD‘š\ú§'ĕ!ß.u´ª­{µ@Z\Rǽð`V­/· ×’ŒÉÀjÏ·Eƒù õÉÍÄqG™ÄÈð $kÕătÝëÖ2Èà?< <XóV·Zé †íX3{E¥ +¬†’Dµ–c„õÓ5d›A5ܑ} ÓÁ»·bûtt؝Y T +Ýw5£õÃõÅ»ÜÄÊ…uϩ獟ÃGÞ­tõg’Q§ç’ICËCÈÍi‹žÞ­…„;lºÊ¹æÃxq×TgÇÝ‘ÐãÈ«Nó¼ÉîŸXûûÝññKB ˆÚ¥íõWÝWeÚO ‰Ÿ¸«Íýß f–)Ý!N.Â' +ÚÀ¼îࠒ‰¨2PËÀw/Äòdáƒ+Pé1GÄ¢˜°±–Û? ¨ ÈêU÷â`w7)B)9Zò®sè†ïÑ>\$M µv,E°#øB€¨€Y#Ôß“Z,hªÅ"0V™;…Éû§©ô(!ÀCÀ‚°:]›^¶T4N/¾"OJ„¤IÈsÈûÂ-áÉJÅa¤”h¿¦N•L«"fߊb…²½¢nJÒÐdf$’EÔj À#Ô}åè̘3é3B F*†qXQ*ƒfžQ™t–×ß0K§ôkÛˆ‰ k×,^ꁫ8ª2t#ÝÖ5[sƒ¬†®¥L¼r¸@ô$üýnL¦ƒdú©k†ÖAº3618˘3k÷–*Käaҏ˜ç ’PØ< +{€s(çþŽóL“É=jwÿ +£ŽIÔÕ8TË<Ή=¾/t´ #¯Õrœèd«<±VjŠI%~ZMvKO¦Ï©Xþh—ÊÑBÄÑ)Œq:,’âj%ˆÁŠ¿ÌÒìfáùp&æ|Â@8 eµøY6QYú§“* ì›x5eҐî+éN$¨ 6Ùê[j~#¯‰l Ñ°1§§uÁRq"ÓÁ c6Ö&n +sžûiн‚ï’.zf[Èmù¨Mý¼/› 5ôÎśεÍ÷#¦Oñ9å‚gôŠyÕ\±egǔv\¿a ÄZd`ª¹Ü­Ù8· +¦Žà„óAœ·U¤R˜ÓéÀ rT *%<ÎòÖbÀÓ†M–9 £·Ä6‘p8± F-ÐB¢îã_7÷}LÃðë™rĞ ‡Bd(𢉄è¨FÖe[c¿ äxØ»w×ôg4Á)m(nI¬‹–qÕ°²ñàLvŒâ„µ`ð ®C‚âá‚"ñ&MtnT#7„zÒcp•Œ‡p€´ {PÚË¡f67>]“0g,CLÞ¿]ëQ$†;°J³~*Õp=:ÿš“| Ìð5ö3þ6BøÆÕ``/Œˆâî;úU/¼ÁÈÁÜK%8ºjž=[*㡌qÝÈQQ¯%v¶gÅSèQê¥?Aîè÷¦C’ZÞÆÇP‹?vöëíŽó«ñáA,šßWU‹ç`gê +¶rÓýãZzÌK|FŸÚ((eF ,Ս૓/M™‚fÍmFÎtRJÃ9ž[¼Ú)óOߟúag±ž)‘ªX÷ËðObZß,‹3¯g²(°Ã'2-MâÐð_¹ ⬥[jv{,¢ƒ³;‡á‡ +lCpHȑBFŽzKÞ"Ç +V„Ò†Þ&…`Ä_šÌO»/„ +$*°Ôa)…À㄃iÓÎô4Ëu8ç,Uäarjò¦™å'ïš‰»Í^ÞeÕ =œ Aý‹H`ÈC̅%1†Z-¨ú ˆ‚ z¼kº¯/‚²÷¥‘ß oÀÊ'*bÐY¬ރ"Ãeääԏ …ñƒ/aه•Aöÿ—F³šðyû…eޚ|ȉÛÕkæÐ33È×tT¼îE{‰ˆãzÝxZyÏ+^âå°Ä$¥í»(”1»X’ÜÊ# }s÷·HÒÄi' ÉWA’êЬbÌUâ•1à;%ÍI´‚¾\qàòR”–JýJ™ð{H)ÔâtƒÒxI)ÆPâZQé%ç›í„Ot ¢˜Ðe† }l:²’4?Ât¡)$Dƒ'¢Ð’û¢YWb$kÍB…ü¦ ’V&KK‰ï¥ÄCŸƒ!1$Hàœ‰ëœÍxwûÇD«D\ì—M ¥‡ ð3¼AÅ3!½šF¼º%*Ò£èéxDIb¹Ònùd„" õ—>_£ß¢Ð­‡*·“ó-ß?›}mòpŠæÙ¥SÓÛ YÊðÙ?ÈujÀrdö¼" EB¨`5„^à ;% Vœ 6ŸPÍ«N5ˆÒ-¸´mÕþyö–«0¸&8DƒßþûBB²ÃIÑ:'N¦ :³boP/ c±ãń«‰^Ýõ÷™øÒb¨§ò2”4á ÑÐ@ê,?Ìl±ƒ9QëSŸà¿K%¾°OÓ(ô]ý°U‚,=éÖ«GÔùdþv”ïÖ¹«aÊU.NA-)$U!Žk€óÊgáí'yÊc;Ð6w@Fxê—p®mÁ¡!¿æ}}ÕŸô²µNÅê\Ýž½\IæȀŸ+‚Ýd™¢-˜òÑsRT:M%Å·w<À2ItoF¨ ™ØªßÒ¡ iÀ¥ŒpFzš]†j3žÇ¨Ealî< ”Î\ÈÖ¹ͬ—–ǏQ`mÛòôÑÃoԊ"‡ êŠÒ&#¢ +:<­ …« òá·þi€óYÊa€‘(ԅ ¨ÒU`¼PvÉ­B^Ê4Fì)è]!y'!0.ïx¤ÝɓwCq‘ˆ¤…£Èu˜´äó æ‘ðeL³w$² 80ýFCRSDXðXm2ÉÂ-±iDÈXyÀ݂„–ܤQÀa ‰r‰?Œî€Ý‘%‘C­CsÊ’à‚‹Hõæ~uå¬É\°A‚óK!Z{D½ÂÇ3U¬cþe­5¨4VºÆÙòu’oKÊ`ö•k䪅PØÀÝÓÜ ‚ˆŽ–¯óTtH?æwèÿ•†ö`–Dُ²î%žNêŠ óaä"F7æÞHš±$\{Ê1úåÛY’ˆ©Ì˜&5õ? ww¨=æÿ ®{E@­"àMRë¾Fó‚þ ðÿÄîÅ^<½Hl樣¦8÷ÿDÄ}ƒ=yòÿ„p—kŒô/Á;ìOÅP{ ÓG<ê:Ԃ±¢&|6ÐÍr½û7 ßdì̜‚V´Í¸‰UÚL?HeÕü™»« §šEÿÁ÷{À1Ö¡fÕu6Xx<ˆÙÄLåä’AOÁ>­ÑÕ(ÌôVl%:a6átt&˜0çNs +à½B¯ÓeõPféЦd6N~´#Ó1ËGèJʘ¹ÝOJhñØТžˆÒ'äV–_Þ¤õ²õœìߟwüXùñ“âe +)QÏ4Àªrs¶uËÌ«59[&  ÒÆìÇtbÕ²À®]-«ÉǪ9ϋ\é됟1þ«¥[è8OzŜÝÌú2ó]ìÁÊX&h㏓˜TƒéÅQ¨ ^ƒÚ@°LY§³ìz¥lŽBÅWþôj~j¥ž Öôiì0ÕKfUÁú\B)1W¬ŒàK&Xp5v$Øé¸+ÌÁz!¥âumÁH³n‰[ð4u¹9y†f…XWûŀñ½Ó~f×KEž9`K­°»Ñˆ¢(jF0­¶ŽÎÉlžl©ÿºDcþ‹bŽsUùŽ‡Œ Vª-©Âö´d=DéÓb¯ö÷—¿ÚݞzU1Ó_÷4«oEu³©8ׅ9ÇIÍù…\Œ²²1'øD”+Š%¿Zïë¹ }@¾>í'€1”÷µ5ä-9€À¶—I—ÿÒa3Ô½õåXhÿ¨¯€ÄBV*R/ñ*˜»Ry eT6ڞ„}g¾ÐOGÝ÷ÊO"RÃmx/ȉgu/VôëƽʕKÛ«ÝÔL{¥t‘×69 ²VFáê|‰ÿ¢—£ï‚w´z€/r.çe†æ«æ5ë_Ö¬’´G’—à,×ù̝ãõÑnÌ ;–ñ +L>%™\*^í)]J¡5œð2NC¼¼’ÿ¨ÿ³l‡“hšß•³ìºË|×լԛջ.’±ãéø_='½Ú]™¢ª*îMêÎ=ÝåÉSڒÜESì…i’X™ƒ+H[_µåM)ºåhãs¼-¿Ôâçi>ìŠÏO¯k F¾Àu‰Ù Q|e˜¢\®Ø·Wvªv§ºŒówä9 U© [w]*Ôµq3ÎÚéRϲ\fÀyZŒò\é¢ìU–>“®Àa!ð»]½â-ì#LiÂç2P½ÄÖà¨ð\¼Ìt.Š>]ƹJŸois¹ÈÒlš‹ð’‹É\õ'æêùÉpïryxX®ã¥ì«\@7¥›†rÝÁˆî{“ëråúI.Y«K½qÈE±Z‹v%L èqÙKÑ8®ü¥Ï¬qxY@!Cx@t'¥°}Oß!&Ãõ%9³n +W¤M Ìx ºhpq8vv‚Ëç×E!ט:ùx­ +¨Z•Ôvk]GÜâ ¸ØÑq©o)šøÖ5œÀ<-Ø[îLoô'oI™ÀÅÜúµÛ$·üæÙ@Ï.à֞Rok:H_S½´­Kÿ\d'<ŽÑ ·¶î$–ÚÒZéIw +m] yoŒ•¦ûT+c»vLÏ°å&ñy¹›weˆúZDaڕ×*¿³ü±Å5 ½®5éëç:àZA- +§:»ÚZÜ8÷Zõf¸´|f¯f.²–‘‡µÜ®äëj‰E=«5ð[O*¿H8«j…Ë,I¸e`›èµ>T«› +®æ?Á¦("'žª.´šÓ,êˆFDw;`p‘ËTòˆ=Û©aó ¾”pù—´¬´ÒÂ^çxBšÑš-ƒaEëËnpD+ڏŒ7´¸±ªþä"§œB­-d¢; Ufz?kœcµˆÛw ¨eñYÍòe¯ ô¡´W­ ì •=ë¶.ñ–zÓåÐò³ÃÚl«Xœ,¼ug¢`gá?$:«.žÂ?“à!gEãH3 Î::‡Åa&1Ë@<ßÍ«ýI³˜µ¯—e›fÞèÌ\–sˆ6æHµ¼r}‚RÖûCYl+é\NúŒÊd©Ró”¬+‚)’…0# &°‚:è¡jûȪ'²Âzœ™/˜uð–Ȳ|Yšqœ;*—>Ö}¿çä±þs&†å&å^j[XÖú&–¸X7uŠéÖP¥Èby€†b–ŠL.Š•9ò‚gHŸ‰Õù¨ºc” +‘H,ñë +’en7¬¿O\Ä +ÿùä=ˆUb梇5ZÅæ9¬W߀†¥ha¸Ã*Vu:½V¿$*)µG +Ëý¾ú¥Ä ´ÎYBIXzN„UT¢ ßK¬Cí6vÆøó +XÁ'QXº+YûWºŸã0u‹lœ$Êׯ3¢ÿßÞ ‰×DÞß|ÓÀ¡+£WdDíÊ¡U`Å/ssWIG$%P╋|zIð +b|Š»@ٓì¸Ãs 3”®"=Ι{ãÛjºVYJ£è\M2‡¹ÊQ®öO,q|C$b/™@\ÉdÖܚ(Í7ŠvÕù · ̀àÄl”­Ârj(½ˆŒ¦nH­}²ÈÈÅòÃs©6cE©´ñùPÓ¸â+}†ÒAȕˆM_EVMà+¢R,ª!Iü¹È‚`ÎIG}Þ^<Ô;µçÞKií¼±?²' Y'®õ+ ¡)yBc­0±µÿߙ‹Êg ÛÑü>ÍÝ[(%uÂÐv#$´<"®·=û1ÿ.‰TŝÍÚÙ׺œtçüB<úd ÓY¤•z¦Ä®ñú|rù鋐ˆô/­<¥yègø][Ø3„ÅÀ̐Xålá>ö(?'¤öÑP@FGŒQ7á"º"HúIª[Ó_¼àÚJSÃÉÎË#tkøe’¾KárY!IÕ]ǀDx¹Ѧó1²$€ ߘ†ŽÑ‹ +`*ò*>†jCZåMp܈ÂÝ)à’ブÂ0š­yaî͉ÐS/úÐlë°'îd"˜‚F*zhn“–ß c |¨à’b<ˆA~Ð}'¥ßþ15û«Ñ“ÿ,“Ø +q4e;vhH½¦MDé…FíOcĩҔb/"PrTH +UüÕ®»2¶DPÓýŒÅo£Ÿ¦bÂ(Ò53ju_M?öBpªæhW,{3¬ŠA’z^k̯NX•‹£ƒ]D”Ð×Hݶ*·rt©ðDL‹$ì—°S܏ÿÊ!ØÆ)¡‚}QeÍÙ¾}™ºESwÆef1/»¹2ET^Tk ~+ÆÏ)È&ÌÀ,mÑe2æ‚ĸzY—¨µCø7Ó–Iœ«Ëa0 ªð*‹nS; þ:Ú=ÓH:Q£ßy¿à÷ôþ±3@KOëçg‘BBVˆ<Ä] iš€íšM0[¬sÓ÷Y®+Žßø`ãÞïµèÓ/Yf"Cf9Ñ×y¸o´Rþ·LU#žo}ÉõVàj퀋õ·åTje q…5B±ÆŸ:.ÍGmô…±²¢4 "5þ±†{ÈL¦ž×ÒwprLhÎÂÄö *0|>ŽÊh@ñÌÉ gŒÂtэH&›Àt|ÄJYx0{Ó0ßÜåèY6I4¥0çlV²6¶©ÌžOd³$**ÖæäþSéŸmÔ=¨(pTVhñá‘¨€·u?ÒfÂ⣠7wÍ÷'ÈPœQY]ÑÉ.Ä£Å#KÿÂé,ÓØ´œý5E™0A·á1þ©-ú±¢½š«ØÝ>҉B|,Ö߅PcRw»EäÖ¢”¹.mntΐSôpé&ÆÊ;‘ÙSZã@_Êzr`|u®ñ²/òá!+o@orFýΚ$¥_… Þ¨—e%ƒúéiç°äÈ ºÂ§ZQa©ZiÖA`óšÓQ8å+݌Ahh¬ËålÓ·j@:²Z"O€ñoðj½Œ°>kîaÛàí\£Eij ‚ Ä "™­zQ»bÖÌ4 BHR[浧£Ý„©w ®çœ¤ï•#®NAÇô\±´*ÂÐK]Œ¬@½õ@`Cм7”„ùÓøø©¸ßÁí³¶JJ±Zu£9¹N2¨¾÷ɍÐYÍ[”ö[Íf9 ³ìWO÷ `;íĆÅjÛò¢Ôí8K²‹çÍTŒV4vÿZÖDÂå**âÆ ¼æ»U6ĤÍ …ŸmhæRAkm 6:kbك˧Hë"A#íëÿ—tJñš8:ð +°’ì ‡¤‘}=êCç¹á³|æs[€ËIÖ²òŸëÔK÷4 ÌA¤µ@Æ;Có!ŸMÏW°²b}HŠ§˜HjcBW&•õ è½À‰¯]v0oîÃ+”Xÿ@«c”80[Êþcõ°?Ÿã½­”àÓª +Gå;[è/æ#bzª';ATo8)&|‹‹ &$Gî°áÑÑe3N xTExwT½E*aÓÞÙëjg>'ôïaé?aˆÞÐɏ©>†»úbÀwÈÉÄþ ›&Ö^ût8ˆ—I­´ôÖ3ÃðÈ(1•†sâ샭3:0¼4™Š Z ÍóˆÄ7ˆ â?z|¿Æöx§IQ ¬Å á¦"+.T®šp››ãPè^@¿~*ph¿}?ëOiñ&T¤R=–ÐE^æÛr´A’Òìp–xÌåßx©GñoZXX¾]&P¨7Á 4÷éæŸw9ª]eŽzÞåtH6üC“¢«Ï!­Â9ø‹pq UÈaM¢q`üÔÒi°m¸õˆ@6P¿gà“ežÕ(stÄ튪 (ä6az¬0zu‡ºÚ:ž-A³ëfwo Ùþ-­½ŠT¡@5´P`¶EZ%²dŒ¿Â=ºO–#qÑ—~Cmìd‚°FPºœ—Ñï¡Ejhlà4ÚV¸Ì^>x»2êFŽÀËÌÂKº¿´ E.ÞmG~ˆ2cj¨i Oâ))Å6ÓÆILZ=\£‚Ëž °¼/»QkÄy*ÅM€öØT^&á °Œf¿;ÝÐÚ»ËS(‘›¤}°FZ”߸«€ÁÓÍ ™³Ü’hz5,Œ˜à‡ÆÃå1Ž@ôòèbñàüwºàHõ}~&ƒ’õ$”³| ‰éæ +Þb$µtc“k…CBåaAŽ‹gIÌØí4 ðT0¨˜XÔi>$5Ç øS!püÅLóŽ¶Ëøˑúm«³h³S>v³ù ú*35ºd +9U¨`€¾˜j¶SjÄâc×ñåZ•ý%Ýs›³]†±ox"Û~ƒ 7Û­§ëÕ7Òǯ.páãœ(¨Ùn¨e +¶ÍòHŽƒÉžàãî£ËnàçJÚÂE¾åpÌÖÂé@Ø 2/Çَi\ƒ_2ƒK-"»ee‘%9‚m œ±O4« á%ö`Š Eø¢¢zY +âD#)²FCJɑ riÄBQD•K»t<ÝóZ=óÔ^ ‘Á´C*) N£#Hh|mˆ\Ô#rÄ=9:Ø£› Ž Øvâ@Õ7Q·íè²é!Á5'QJ¼ÎB*$±~oŒ2ɁâW Ã!„"j‡fo±!Ü'§¯Õ”|«pF ¡›ýED|Ÿß@CÑVìm*F“¾ùŽzñ•€Cu +¸áx/Œ˜ôl`Ûç)& ¼þêS8ÀØYÃ‡–g̈Vªm@B& Qѧ@‚hˆ²LBH®ÝbÐ!o8§f¢gCêƒ\¢n©í;sq}Óåy8Æ =În(ÂHôVm[懂¹s ÷Hâãþ©õöÎôòÐ À?¢ª]8„ˆÈ5 +Šþè{ú ð͘Þ Ý?$.¥0Ċ­0ԍý1èô• º-„Ù“6¹Û!¸Ñ~áÇìq0†Ã<hã¡Í5wþcœÎìÏê +$Xq<¿Ú©¹¯nOyç©Ï¾p3j{ØÃþ ÙB„Ô¨î w\í8 +û¡ýzԏEz£¹z„ƒQøÎ!Îñe·ØŒ2-jñU*eßv@ñ`;YÔv‡}dc8¤pN€nëã}ßÅ<¢bù:$4rTPpàÜyºIÃôu.éC×ߝ¬ÓLù¨ÿäÃê.™ÄCîwµð…é¥Ä³*\ÂJ #ñÁہóå cRŽ¬áÍHhPȘƒì›S¨³£^VCÇë1öp«“Äy_Þ–'Äæ‹å¬ÇÙ ú6Uõ# S†‡U1=ãQ†1x¸ð…o¢Kw pé<}l‹óØÒÍcÞA )ñ\¨S¡£òÆP<äRÈ "'f‡›÷áéÆcXv„żc…„í:ÒFоŽò¸ë]¥<ޑ}欎¥8£§Cw̎w<9°•¤ø|SK:¶±ÆÁ׌#9(QhT°;HZ¯†+úÁv©µXÕjhIšC£0Çⱇ:‹GNGR‚%Ãbüڋ¼Ò+ÆÜ+óƒ¸â9(⬓ˆ•õ÷ áCAWk) ÌQA¢s9†X#arNaÝ ËÂurz–ç*‡Ì¡*Pº[øÏ§Þ CqÈL5òÁb$€£Bäé\oã6À‡sÁ­;N†BßÐjÿpO£»°2Å,©BðÐYBõV$š_ #Ì£é0@ AÃfLù)^â6¡M[£üÈ$ã±2ŒÇßÎ8cÕL‘B¸rFÃDx”L”4–íf¬Äãd€f]5zÈȐŬ™q< !#^ÆNO‰;ŠB~ÀNdä½w†:þÆï$­·v_ +}OØÿŒ‡ ƒ0²$ԅ«\Š“§ýX›ëä µM€ÃÖÎCd”Ý8`é@%8—ÒEïHlyϨ†í-nGþÁ±0×rA#ˆW>F ŸUøk‚uEXe«®\ ~jšdC¬l ÎUœëûAFÉ ,¿ÇŒ(† ù ¿‹MtGE7õ0¨AvŸÃ{ľƒ¼‡FQ‘Ä0|NGe/!¹…o#¿x×SfvLwEZ~J`ÔG"^äÈ +[Èúè_Ì^…Ô÷Ú‘s‹~!›²×E~á—}Q^äHìsÄ¥¯Ãîñð!¡ESË- Nŋ0]‚¬`XT=vŠ_å^Ö4ÌΜkgÖ9tÁVjˆøÏd±5'¦˜”¥C™å!ÞÄKi®¹Tt`„;!ûµÃ œRû–¼Š­³™B^¥ëkâÿÓóFý?a°¸/©RQ¾xCƒkM4"ñâI„n£p…Y46$` påZüþÇB6k¡·ÁâYÅw¤Z¸þÚ j’AÓB5]%-®é7°ð—?K– q`ožëÓÇF¤5€>ßðÓ,¸ ³¸j—eá1¦z)‹z;Àš’$ KnÈbäYð¯îǹµò¯FÅÎí> è¸`A׫ƒŽjÏ‹rÈ:– +LŠ­%z_¼ÐDæ$5Ä´…ªžŒ œïF{ŒC#•ûOCŸ>œcÑLºêjÐ`Ãnj‰“¨Ë’7d9?©Ûü_Eu¬ÄŠŒ(Žê\4áYú§$wÕ󜇣í2+8ãE52«{§£ð£ƒ¶õ֝-¯·¹ì^²÷m!²ˆŒ5J.Ë´Jð¬ x´ëa¥X‹…ÉÀY?zKÍëíܵ; þ¶­.Õr‡þ>íV<•Vá#Э0@;<¿qË#L9=à‰|bVÉÏÉÚ,P¼â¶,¦Ñ[ó¹(ftq¶kisŽ:¢da¶:ãÉKÅ»k;I@‹EâÁÉ5 Ê4'b;‘?ÜÕѕOå.!ËT’W랆à±­cá×t‰wˆÅ³t¾s¿‘èû¨} +š;¤a/…TwN#Oô2AÝќ«zÄ`÷x.¿à_¾$¯4;9TîÅàêÚÃ>b`ì’o %–…nVÐR%qbÎä?-t=| |žK„°‘ˆ»Íš†ˆŒKÔJ¬Hpñc°aÉÍø¢¥­¢#}hõ¼„U«0|‰W>àߚåtøe »&!‡:<Ëún}d—·L–ñ1x1¦Ží‹9 ú®+1šØVM zẇ¦Ë}ì«jî™r›õ9ž€ç!í.+ le$ʘÑçUՃü›™MÅ Ì]ùԨÊKÄEiїÅږ;vƛеɔ±Û¢ïÕ(<TÒ['ªLŸ4Òà \*YQ´’UJYöxšwÔr˜Ø€)×f¤¢š¦™›=¬8Á8+â1‰PŽ ÝA›OM)LA؈}CUÎ{5³!=?þ+…Ÿ×;;€„èPrF*š#6xb?“€Ñþæ|žËú|œ@ +‚mÆj ˜1hGÍÇ-®r‹Wª†Ó6âs»>ï½,êàÁÑyB +?J¬} "*M•ˆÑ ÉÐdqå€ýÑá£;±XîeþfWŽ ,[ä ü¯)P‹ó»’ÅÄ E¨]{‡(´!¹Æ$Úw`ƒ™óײˆ·¦Û[wlÍê…Îj7,ÇÿMÖö%ÃöRf¯ÊúW^ú—ôÄ,uÝþ€ÁŠ©ÿ!U†ÓÐJ½=@áÿ›#5SÂûÝïKëío òÒgI¾:\œV²üi¼²ŒAQ6;RL(͗þ e 8S?„Þîs ¢ã­Î^Ñ +×Ú¯¶ø€+tR;wö"À݅‚|‚¤%\Œ¶' ‘õ3ƒC^*ºáØ:J*ÀU$0;…Ç4Gù֋|Æ¥…—;ßé€ìÍÁW:¼v¹‘öLžF聘E¦a,‰£6€¬–`0£eår ÖÄy¼°ìƺ¥qöðøA-SX†fÃ(^©éø?±ÃH¾{l…¥É:ƒ²ie^ªôB¢¡ýpW»½O0}×QíŽ7i¨ÇW4¹³ÒovêHg©é§ɀA ¯ûD:#˜ÁWï±+°þ;¼Iøs¤ÆœÖ¸•ÃØ'‚škþ¨¨€4 ær·¸ˆ²;8gë?/¨ƒä£– k38ÀcÔ>S&;êè)/à-*Š8çyÕV|GŠ{å•õI mAå(ðïHá]‘ƒÇàI!ÖocðÐ?ÿËcj'×DˆÌ^á€g§Ù•ÈüñT1 =SÜåns€æ ŠæŽ7GüðÃs ·gž~`ûO¸D&0ï?”Ø:'^…ôr‘˜²„¹EPY´”B²†‘«y‹EdëYL~¥í§é ûLhûFæÐÀÏÏ<ƒ4,xó†ÃX'¤@ +ñìÄðŸþ ý[ªR^)ÊùK»äÊKY~AÍvF~w¸§eƒªØÑB¢a>Q«µspÉP&¿ø– R„µArЛVŠÐö]ƒxø m-QT)<§Ú³.À"³l¢ +DPùn‚Ó¾ð&'_ÛH¦!Õb® ÚìIÂG—Šì–Jó?qEš-µÑͲ:‚¹³.»v,u-YIˆñ™AèÇQsåÀ¿…®$ N‹zy….ÆM ہ;ÛZq gqBøÅAr#OÊîÅó"ó†èíqØ¥Y,kHÞKÕ,- ÀÄ®!óŽ=QÈ"P#80 IÅ^6y»„ÐWk¶Ì„×3Cl‡KºñN4‘Æߍ˜Á³ÛpÀ3®ËëΠȠ øppPõbõMâÃh/wŠ”ü†¯œQ²?]™óO^ôØO0 Î- ¶ªIéÐL—´¼[›×DÏ?ŽÕõ+üW'ñ-q‡fói¿~äƒêpAöcFÜ¶î¨ ´«C󠩨e•zÃ]_?ù#Ñ+ô”ÔÌÚæaѕ@¤¹xÊÕ +PPÜÀߢ¼£6H‡@)àe™ÕU½Å™é¯L'’ÖBÓAwßU†qú?³ü¾'̦z’›ˆÔÑ~xÆ8M‡ÉP^㊠Ñ'ßHE¸@ÀÌÏ"UÐ 0SÀðo@µûW%@ß­÷+#wå¨ ù ™¢9RVI8Âýâ@Hväžz¥tÂÛÂ>1ž ¾…Úbø?¹ÁIk¡Qu›ŽÁv\Jï 9›p¬/¯t@ÞfMÉÝå2Ðc©ë›ØÎzÂj^ñD6ÀŠÜô K9Jž——‹üÑQ,{¢èTրXàn„#<±ÒKl3+ ÷]Ð&Š¹®gø»Ú¤2¡t£Î$^pˆ| r€ ÙV ~ +©WM3ߝ N¬Vˆ-E¹D#ñÆ»YɌS¯/¯‡…"qvÔ(í)ä¨è\† +‘v‚ÒbRcbÞà¯$¦v8 xýÖ_A z`ä °míî+’„¥°Hÿ­·ºº·³ $ßaì2:ßÔíÑï^<ZZ0×¾±‹IÈc‡lä7/yZ U8˜ù°Œ ÏLnj¹õsž«1ªß©m«íÛjûh­VWª‚ÍÖeLÑ q4DÜ}(vŠj«ÁhÝNŒ5VYefÔzضÅv©Uq]2 +¶/öoXì´XDÐYÝ] îîÂõ|>4ñ…Œ°¶2*Gì|‹ïÁ–Œ\š‹o¶[^\%5.Ÿ1î9ª,¤Ë W&$…P,¥‚gÂP‰R€ésîbµ¨"ù!½3=À8’wôu¯–„-^–^gýÈ쿽žñM¯ÛŠÉ°…ó…;™~ˆƒwãN¯.ˆGt ¥â„HCᑉò‚Ô$œÌ|E‡<’º©š¤$1í!™’^Á䓃æŒBÌÁLLüˆˆJ(6”¸ººÍÍt<¢#ùò·ÇDRj­ÕkÛ·~Ó4®jÊLeàãv­ú(² @ó–«ÐDF3› -,!6Êú11–’XOª••8̈́ +sð1|ấ™ƒ2ÃêÍìeª*34¯ÏèŒÑ!$Y<7k ò–;ŸqÈferMÎÔ£ìóú–°>ìÏ÷ôòú…© ôa i6e8ìµY¯YK»ÙÇå¨HKÖsóqõŽê)wDå°8Ζűž³V„‚*3sÊY.‹{ï¨à[JÊG‘ìû %¿!”½r‡ò +î’@~I‡Cœñî¶pÐ*ç‚8’å ›Ù"aòâÓÈqf¦ŠN¶ ²11Cˆ<¢\ù©>èö-8_Á¶ß÷òV WiJþ2ã]•i0Ûióx„ǍÍfÛ¶möí„æá²ËhÜõºab÷¬ðÛý/ÿdÆ|+“ÓeÈEdfhÄ̔Yÿt+åÜdJªQeÕ+XÍ­U>DB‹j¢*Ë\¢þzIÝ6‚Ø<‡MØ(±²¬‚ÐÌΰÊȟ÷3s0µ>§*¨üncPಘ8 +†ƒª&¦æ€6, +b2:V\tDŸ å4éBˆÌ”DãÝmuG’fbԆ?b±¤ŒGÿuP(Lj[cæ µéY~æuLf +¢3ëŽdÞwôCáyÇé<8 ¡…¬P2ñ=-blÁo9£Â +8ôÙuçòÍå=ò<Ü*‰Bý'c„ŒŠ,\3FãàEÆp†ï¸ÚIÅÍÅò»üd}63f¶ó¡ˆáL)ãQø qFÙ äÆ óž=‘–»ƒ»6‹Îé„NYÓ¡®ƒÔî壷¼›(lfG‚)2bp4›~”ì%®…³OˆDæ·Ež:l +™“::MÖ j±…XLÑãç}ª‰éÜZĘºŠL¬à¦A!R=ÛՂ‡ V¶»Šd9‚tYÕ<"S­Eׅv,Ý記ÿ¸nÀŠ°»ª;JF1wÁ„sƺOj)F©À Èñxœµ(?°3 †ù’ÞŽQ÷i‹>Ê ƒà‹H¹Ä,s§‚Ò3.…Ð[9i ,õ<%<qêHI…ìíû —(M—nùV`÷î»ãŽe•¿Ž‚›vOdq5ÏB€(Ñᘣ$?¹ºÄ"êèÑÜ N@r&Î5Û}6𝼬(@(Õd]ï KyžÆB-ÒÉ×ÛΧ¨ß@;ûuf3ra×ÌÇ{èpÆ_kfæx +Ü+g-Ș•„y -¹3©l¢*[Ê eæâ,-°„F?qÚ¬9· "Ïþ­VŸ`ώVfUU†Cÿ;Îß`ÑuM˜¢ê„¥-–Ý£ Û'e*E,÷¸5sžö­`sœfAØ?øYýqžú3_Éü'Oɗž£4§AJU,´2Ðy\Mû€Kçd”¾DfªÖàõ‰B:®Ì¡¥›¯ûûÊ&¾†åö`³8È1 ™4”ÿS€Ü»âê‘ûãËÆ^ŸÂh¶txxÀm®$²2QC3Y† ²gkx„sÿP"Þ·õaTZUWÐtñk;ôY@×B‚ ÿâ2}‡/ ðDj‘›(,`Âòoڎ¿¨ñ‹[hþKÀìùu¦øÌÌ >ÖéΧâžR¡ä½ ͚¢®ÆÁR[œæu†Æ>¼l|9hAÀ Ó¢w0µØ§UtöC.É'3\fY0?†0U…4ƒ4÷²ä‘FlšÆa8Uåc’h$’¤rPf|ñÐØa QR‹B³«»LǖTjPÚ~ŒP¦'&šÛQ}䲈ù´€ª$HoÉHyö™û'Xç`BÈÙ>Q/sZ«£ëB•ÿÒ}Ðø؉Wá.¤•µÔ¡Ž +™!§ÕÔQ”Ș[Ev`žpr±H䞆GoÌä­áD ÄÝyÝq'~ñZ— •¨…fz ¹Q`„)àùþh±Vbr2eÇ»mbr­¶è¯{ 0½³[£}±¿a¬fPX£QTžØþ·ÊÃ818¶¬s3d܋05Rizñ§¼&EH@ !¦v(ςÎ(Ä]p6µÇàxį{øp'pKÝ𪑀QñÀ¼ÃŽû•—‘é"ÇÀ(k ¶\>ñ¡jSîýî{҇?šºª'ì€1 >êì“þ?b~ªÐUfìΒD(ŽÖë@RãæªQ¥”hØ¥hg!®ÎØF¢G'!©rˆ+ÀMs;êUú¥#jCfëN9©-2·HO1ŽŒSnÓnêq¬‚²³¾–è=ý"³þY2‡b'Ëk° œáRi©œð!n˜Xýl"z‰üˊPC w1¤Qù'[œÌ΀ÖȱÆÂ]H«fÓ"B~Â\/6ÍT Ñ㻹œ?5¨5GÁ™Ìƒ$.7õJÿÇ@êkoÊց'ÌþB²ƒP^œ¢–w þŸÀ%Ðr³f¦–óXØùNP ¥M ϱX/#!௰-)Å(Cu?3wc‘·Ø´Ë9„Jtòr‘:$+BøÐ8j©ÐcFʳΟÐn.\×»ïC®Àn„½ó%¤ËL2éÈHh|BG+dQ>Ne‚Ja/iøˆh¦UÆ®H’u±Èa4|¢€G§ˆ¼bXzRKR§1’4’{œEí +œ¶®t†3qKmÛ¿Ûäà<«UóʨRȦ–µ+ZI—Åz\£Ï=2% +l¼âx¹• ÁˆAÞ8êñ²1 ZPOb#€A_À>‡.|j“e8xMNe&I”$ìŒÀf(u¬ï,$û­ŠjÊ1ËýÀŒ7’ÍÀ2ᇫÿ+íý t9|ºUÑÊT–ÀÍTa/N)A¾¾åZúo‚GŠ)h鋍NìàlКµ4í»9—q«! ©®˜ø¡3©&¡k$Š¦ 9™ þOíFsöb>Ñ L†Í—»çûû¬ +ć`?“\k• ŠÌÃKª(ÚÅÙ!¥ ò±RÿðA?­ìø—ªY_ËxÀMö_{ ±BâŒÁld|<ˆOz<ÓCg`€ø¢VÌ‘˜ Ùï-aÎÈÕ/0ŽýüGT´®—c€øwG¢(ÇßfE >|ÀxrY3E%˜¿1°Ç {M¨‘¨H\Ö©‡D~UX3¨SSf?ÂÙñ!ïðr, ²;J8Ÿ/!ï­ÂíÅ·ñ!·_x½#o}kÇ¡!|ºç¡0·.`7ԖvP#™¹á•¨_<¹›a˜Ïô8P217D*ÊlšyòÊ×é®Ù¡_M!ŠÛƒ&'i_{¥ÈzÑÀ˜(¯žwm6$ÙȱŒMݑ{¹~#Àb©u«UÓ×—zµy„k><ð–”mÐí£` ƒhÙMãNh%¼jö£©ãpEq¿ #Ë;öáÑW䙨$îpbTÅc¡Š¶T¨¹gh¯€Àÿ3«h7Ãëø´h + 5üw–yL±~ŤX éÉQIiV äß˟‘Ç›ô˙ØŸ-ŒÄ9Ç`äD½žw„6Ž®ß5®}ï´­I6Ö#ª’šÔl¨ŠW§²¨ç¦ÝƯÐ7hôbW‹ûý25]¸Òÿ©%m¶r1à¸9'š>X`Â0“g´¤mK¶«¢&£âp#Ì«‰–öœÈ‘œàˆŠ(Pã²ä2nN«~;nÛ.ýjZò%kb4Ââd¥‹ÔpA–¥@Í3ÒnÞw´Èù ñ`“w^„. Å$–²¼±0 +À›ÒrRÚ'ïõržšqÍëâ„"”™­à¾¢F AÀê0Ž'9aÞð¢ALÖö9 \‡þE؅;4ÆA4MM“°%ªpLࡖ=«®µwt¡ÂÌH‚*I¼æ¹2W­,ý†ÑIXx“NÀÆÓFµCN;‹n‹Ûä…~cA^Wt[={¡¸ÉîùÇÉ=†-ÚÿÆ¿²g½¥„ÅŽ$hz¾)a±)_…4ÂބMš’?l™ÿ:ŽÌk²ë»í +$*(/{ç8̂¬FóÉ'þ[K+õÃ6B¿\⫊Åèƒƛ`΁‰°Ú´lœ¼]ûwÒßËe3×Pù +i» ,¾™gÆá–mõq~£ù%‘Çó4¨¼2,~^žÌB‡)3 ž˜ú=»øƒ‚šõÝKÅ;ø/p†$ÃwóÆß7̔YlóðÁÒø9Ò}`¼à¶ÔÆOQÑ®.UÏ.Ñx y2Ø©·¥ +“_°Ñ uŒ¯Ÿ(B5C«%†£AITÉü/ž®;ûE×uÈÀ€cƒ üˆ±~§Õ"½ƒŒ2&0W=öíàXI#©1 Åò}n66zN û)ÞMU<‘”¦YK·‚bd•ŠéµH+ j?>bƒk»X$Sv½­B‰ø”Œˆ»_{ÞڍCäRš_œ€W‚” /0#:‰ÊOƒž¢€€j®ø–˜RÓ¿‹G›oï Äê›9gƒ"ãxIeáL|‘C¤S™”qù$Zq ô3%,¹zy“­€ ýà±ô\ª¤ñþÄɱ¸±)~РBœßD×,9­1ÑVO½hTñÜJö-g&Æû ¬¤oXMº‘*kÜZ<¤È앸ƒÎK9 á&*†„Ä„¾}^¾±SÀ©âD̵ ¯¹a:PxdžJ:F´@7)B½dëЊ`Wóê·%·xé¶$ÂhZ;ÕE™}¸I xՑh¥ÄTP“â§kêHasµ‘Ô¡+½«DÖb‰pÐfö#Xí#3‹À á5¯@â‡0ˆIÇJãÌR)f<çظÄÛ!‰®^¤&’0 z pñaž5 ºÍ2\# ’iHp—<÷é`ÜÍD®RbNÎ I^BÙ¸ˆdqj¾îµƒˆç)]Œ}ñ´ŽdEUÁň¾v1m›óq²á 9T–xŠ߶u[&J°ÅËý&1ü¯AnÖ𗘿ä¨æ( $¡²:#2‡cÆé!ÍÙ$œŸ`QSX6"gҋžümÔªâUOXÖç.A• ±mGØ÷£ ©áš¡¡ðl€?DBnÈYÝàdùxë¾À´¡´R + úƒŒ/–{C– ò¡†‘tþÖ ›è—Å´˜Ç +·1Zµ¥’‘¼Y6|$>ç¹idÒ¼”‰yn¸Š{¡Ö‰ÊŽ-bJ;šž”Z­¯Åô 4MؽŒ› eƒµ²xŸ[Pu‘²öGÈn5Ú«"¬cËaž8µÞ²=_Ñ×¥™Ç=ði}$0‹|ì˜'BDz½&ñwʅ–š'€r$ïP ‘9œàü+}‹ÅFëÜ=ÐóÞQC (ÌÁ¼¿ gÜ|ž;›éY‰ˆ¨Þå1œ(œb£ +¤R›Ù\šxՕE“LyqaÉWrxŸY##„|»h÷s¿jPƒ—­{ nDÙ°Õç[p;û?ãm5óz¨ kq*eå;&”ü U©|ÃqŠ‘8_ ߇îDúÆr`Bþ»øòÔ×ÆÿÂ@G[ú…v´)$*¿´Ë­s ©É†º0¤%@,TØÀK?Æ¿< ØH"ö)EŽ›4‰ÖÄ ”XËvç3­Í’*LZ¨¶bç \”œÝ{"̐ +}?H› @"%,¶GâSy¡œX;v»d§ÍÑÝQÂdad!™`ևk• ¼Ô{Ïø`á>ÃOGDߪ¿CɡΛÞM^ki³à֑„?Ð |^Af’—-ØLWÈOie ÇÃaÉ4tÜH¨é!uTŒDã»ãT$õ΄¯RÞ\ìb­V¼€¬½MŒÍ}fq¾Ò’+Œð|jÞßBÑ['*¢ÂÑGWù´±&«ÐËڭΠÇ>bª;û? ×<°€½ñ‘Õ` ٘ƒ¡=™ÐDJ£DÉL'×'±E`ƒÍ=ÿÊ,ñïÇè«v0x€ØŒ¼JTìŜ E…½r2çâþF¿rþa œ|6{y]è&¥ÌåùÛöÇ#þø¸ÃÙ`ÊÁ½3ñ¿5 þ”¾¨3¬–NcAp ¡Ï<×CBõX¢è{ »d|^sB²P0Šð-«©¸ýi`O…¼©˜ ˆ•XX +z'@†7ô†˜DB.e&†µ´‚ýÄC¼­½SL_åÔˆ(ÜvÜ(ŎòÌ$d}ókÖožâãP=¥}út4Þ püøD$¯KUç„zŒùš¤/¿’Õ?1>‡N©4nåDMO5΁[±C(ãàä(¿xt™)\‹G èÔâ±úÊ‹.ˆ–=ÿ=D5ùÒ|d©â­æ嵴Чýh7‹%´öP$éв{2%Ú% « ËƐéú c,˜´°‰p¦¥ˆƒRôÆ#j„c~rMg â¿îiÛá¬}¯toÁ,Ñ8,—ïea¦.3…ÎÛ܂5#øxSìtc3A÷Ô¹zM–¥«ç†|Cü1éÕôƙ+™•‹9‰\ +ø¼»)Òó“u÷+LÄl°ëš'µñkn Õesë½PÅ£9ݯ +"Â#ëŒ_׌èy2º1þ ’Öbz^\šÕú×1²Ü÷xë¯C/kÉ$ÆnE¸Ä÷a;aðÈ+ÃPژ`ˆn(ŸwPª3¤°Ìß_´žÔs¯Âú†¿/Ù3`WƒZ:\ê::#֛䄁g6ìÑ/{DNG5m'ï&5V±¡;iUaÎЧ[¶„È[TÍDþ {)Á||[b¹v -Ô¡…ÌY ‹(ap¿j +Jë¸|±¼ïå»m`ŠNBÿWêKÌÑÜàÃ'&C§);úfÿÑÅs/ˆ ÷W®&ãbÇpþ¯È18I=Üëá@8Gñ>(èئ)°#aì¦ +.hè-:'|“W%]œ×S,k9fîEb -àÙv]7lÓ‘ñd¤‘¨¦ï똌úèF`È×Ä  {Çèô÷BÖ5†µêE89¯èp\îᚍÔ9,×ðuëm œzƒ; G)t·¨€ŒùðV’òÐç;^èctRKR£T]F«zÆ]µ6Q+"Ŏ¬¸ßžè² +‰ã ‹ @ûê*W¸óëœÃE,~zõŒÇÉh5y:Š`*+W ‰Ö}¸þ¹¼ÈfCÄê½.¼C#’R± 6†Sÿiî'½ã¨ÿéð £Vl ø×#=|‰Œ™ÿ{7#¶»fžG‚Õ¥èXŸ^MégĀ &`ÇÏs]â¦Ys,)¦ºúAò«’›U®(g”˜v LjÀÀµ*\GúÇ1‡·r%} ¾üˆ›NœQ3†Âÿ[—f-™¾Ùj9V£0ù”}Ñ·¥^Æ­÷S‰w!$ÛP-I§RzuÓ^†mÉu+±J²˜÷Û°.™öðõ´åœ3¿Íö„¶Ð."Ié£Ñša-$1Y$$Ü(HF]±mÖ4FÒ¬f5=VpZ„Ä0ã>šêՠ̬$¥ÕGµ$bÓÂ-øÙɓI.ÏõYþ[ÓGØ0Vü=E6ÁÐa~…æD›®~ÿƒôÊ.U ˆñõoŽ~†ÈmÜà΀ˆªpµ.Õpw¦ó’¯Ÿ¾¿€¢-Ž_ùêXó rkâ¥+‡^ZÖÊ£M˜‘s PŒñ§ŸT@†éq[q’}Zeþ‚œzBaÍ0¦"ãÔB×Ô£ç;Ø E]„`Vú&9Ù/fÑñ‚‘~=¯s‰Ãv8qFƒò®êÒ?í£9JBôóÉÞ¬4Ge¸¢ÉÖäZµ1LÁîMà’@p¨ ™Áp2ÝeRrc®­eQ•ÂŠ2N~¢Íííˆûu!ðu=îG^cPD€K›@èÓlâØlÊHµaŠLˆ‘'TìS´ITÜ\GñàåÈvUF!YiÐ}²wqSò3Kmx4ö§5ν¸ +ÿLð ¯)—€•¾Jéàbá,U#EŽÏò‡ÃÈ ð ‹['rƒòÝ$`D63¿×éHç9fð—é³ßôÔ9»œ†ÝÑNZ{*2ÿíŸ ØÂ搑mfì<Ø u‘dNÓ³4:±p¦m»:¯ZÇ[y'ëÊr´¸ÁÊÎ)²€îDžÇ|ˆ@؈ó‡êq‹~Fc”ê¸èrQ<ƒ,Üi‘>°hO˜{ª7 ¨1üöEôð&l¨ñϦGè¤Ðüº¡È´Û-èðK–£hÎÆ͖CP‰O[ý¢Y`×<›Ç¥ÙpGñý·Ž;B†ÑØçlŒ·Ÿj»ü Á[{Ö¥Ú2GZÃ']L­i-X3“«m‚¹«‰¼)„SX†Z„5Oe»–È;¢PñOóu‰æ¼~6bffdы/}C¿‹lÈ©vÌ®`A¯Ù½ox.¢ê}Æò :ôº½@ør|²>j>Šõ´78]à›ÛsbägårQ +Õk_ԓFï1³Á.ど ©SӉSȯkiNâGWæ¤(ññ˨Z÷û6z•zßµ¶g.MsF%o¬6¬öUm—ÐåÁȤó +.öî±.ì+–Õ,#—M¿uuDëÏ3Ÿšà¾ye®³8ÔÀýfLWÓ£˜¨Dá]JàTÆÂü#¿¼Š V¬k~QˆÇDòjzÍôpMYËÛz4UÈ° +4ƛ~5AŽ@HB­Ï‚<ã&ÂÅ6š$‰\  +ØJHÄ +à‹?vQ3—¡pN§1su¼ +s^Œ*e78åWr–ª’4`!AàÓ}¬-$s¸ÉZxzJYãh©\¿ã‰Íx©Õ´‰îGˆý-7ÅÆщûWŠïGŽ‹D¤SeK}08¹T§ÞÚؙ¡g\hˆN‰òÊÁÛ^_]3 ³@˜ÉJ¸óOzcT4T?Ç´åßÕàs%°nW48÷&´fQŒÈáÉ+O=³JJøæéøäÚéÜ¿íõ9B¼yŸΝõú-!¢*Q@~ñZÁ1Έ´¥+…â@¾KHÉdi†‚µóI3‡pªšÇ:¨ßÃ×  +,ï:5’ÝbPØ=îÛ6¬¿1(dÐ ú=ÉÀå¥xˆ®EŠ4•0^\$ÇL*¢ëÿ@ÄÅe +ûýÇ ìµnlÍÖñQÖ §Ԉ<â"ù*”»Ü«Q0‹´s÷±ÖtŽA,ÐÓÒ5:Ež‰’ —ðjÙgêÕwQ\³ŽRA6RÑî ¦„ÅÍi²Á{ŒçWV'„ÛÑ{±™p¿!årU¥gÖÁ¬s3Eê$Úx{o›³ +™e,tÉFl²$ž¦NÞ+Є!¿ÚⶮeÃÍ)Þåå­è>XÜ°þî5‚ª‚$œ‹ïºÝÿ¹ÑÐ̶²¸A,J3³yd‘Ük,±TÁ»B"a„ÉhãSw6á$‚[YÂÉ \¾9“$â#ëOsí$AQG ºûq[$>@,6‹c +§'BðÀzIzL‰Œ7U(LNÀëâ_’èm.SZžßèlÙ¿cBÕOÓÿìGâŠí}c'ÄjÙ¹àaCË·p|¶Ù6ˆlèBÌøÎD9ÿÎT9´wó`›`ƒ‹AS0éýe)aRo6 +6°Œ"ÃO7‰%®Ú TçlƋ‰îÏdGéH–0 ©aÐòO˜S‹0Tü$±D\Æ<…í ý9,Fnë‘2Kˆ7üj#DŸ™óµà”ÏԒÄPõOó {Ì51r$YYb“{¾á-ћÈb«u„H(o™“?ˆÒbiòB´™¾ÞÔ5·Ì¥ºÖJ‹hcð€‡&F`Nh + ^.ÌñÝ!K¬€Ÿ˜!Çú“"arÚ¤dU 1ô‰D ©ˆ%Uz‹ óû³ hô.aÝåNjKʄJ‰2ßVƒff",±ÂK…1˜ÎÎPs×S¶¥ò¤jç]ÀÒya'd¢ +VvÈ`ec‰}Vۛw_œyÖÕÝ÷Iˆ‡:6‰ùJwZD¦ù4+;RtG*-[,¨tKk¤ÔÚHÙæ‹KøŸ¬‘hà2 ®Üø‚4|ªRêC{„ôM…”¢ É örÑK^vŠ„¶ƒt[sBìÕQYË(xà,å¬È õ¸U¥…µí+nš‹w8W>T".ˆß›o—“iç4äÓ '$±4dց1ˆ:àXxÑ«TeÞT#§©d<*Ó¨#e† t/Úl–Ԑù˜•ÎWÏGäyë!`¹¯Z°>3×Ò#WD½¹]í— ô“'­P!Œ®?¦Ð0úQÁCÔ$Gp½šY›ôIeÝL´‘$´üºÀvÌI`XEΌc²%fxóŠt·¨^IÿñJd`üúša«z,Ä(ö‚Äy7ì„ÖÒ»U ª’º!3qÀ ßX¹žÁ:÷U~|¥7½‚×gF%¤]Aci*¼CzV +š†ÅVÅ÷$ý‡€¼ 筆 ‚UuhÌòºF¨WSÀÄìNûÕ³p%I$Å' “‡+ ür?M0>ð­Z˜pÏUׂ è—.öõob'¢Ånó:Â] Ca—w|¥j±CD™–«·ñ8­Ê4ƒ#¼“u~쩪áxž‹lh²-üŸéñ:ԏ ÕËóÒÿa.d?ŠÖg^¢ìà-ð®p\܂‰ 0¶AÉӀ„u̅—ódH»èM¥då‹ÄSÛl€x7ôŒµí*Œ0cO‘Ä/„÷#¾\çeüŸ …‰¿‹Ú÷Ìö¬l¡_´dÞîsÑ°:tÐâçMìÀ²þû2{àï‰rÜ¡Xx‘ãµ<¸Ðb]@"`*‡ "ðkp”„…Œ|{ÈMW‘ŠÑš­¢›—|æÏ FL?'y¶ˆ¬WÊe(Á#«f¨Žìx¹8㸳ZØ"Õ €Û¨d¦ÊÅ&"`áQTòÂyâarwÈ@·Èólœ£YCòx°ÆwµCÓ)X`:¯l½ý’Àú+¢k˜Ž7=Œ-îø„¡k +oì]±{ÆJÀ8š­ë‹U¬ + «m°Üâ%(Ägö!Š&þÕ°æêÑO`~.Àuâ°×Ù±|Iþ_ÑÑù:ˆ²ÖÝW@æ‚<ËÈK£—]œÁ#Tðn–ŒÒ«•”\AŒÌ*ªʂÊÞ&œ»í_t6Éè(˙˜Ÿ mdØÁ—&gÿ…ÎÆkò<-#ÀϞÁ/h÷ãf·4H €›³H7f7þW›žÆ«Õ +gx$ÜÕ~øŒÏ?…]òb,ƒ[P" €…!!D%µ±€-š‰õÀÄIÁ0ˆ²`˓ øšB±H/É58€›lòìÇå›é:¦r¤øý§zèCMJ˜³gB@B¶ná™h©+õ«÷œ\šp,%(J[öÓ 1DlLm¬…ÖYƒ¨!É9ko;k YdgÁË9Æñáè)\æ¼*È©Ê&—Tʬ@Âøùk†%< °[)ŠAÕX)¡á©Ü½5piÍÚï^|¨p +VîðֈB9ãpKªý(´vÏ*O‰³qY¸¬H»LTZLã:ç` +D„Ýf:>œöµ™ +µ»+}ZÙН^Õßfw$àö‡ŸJßaºÀ‰Éþô=Ñ3a¹ár¼ øE²2A©u6½ IbÏ$+΀>åè òøà£ìæŸÁÖò|¶Ç¨®MbºH“Ë+Ú×FÿØ\aÑ=çîØþ  (RΙSŸäS7e”GG:Ë +u³HMoÃÅÙ¡é¸w0‚Àag˜ít{8Wê9àÛ& ‚éh™DyÒ÷öœ$¦K_وlX¹ÇváZçmæVìðâËÜÅÂDÎvrŸö;ak  ++ukBÅ«Ñ­“¼A6Me]þë)“³5©­±ñìÝ/2_Ëåïñ+¾­ÞÚ´ÒÍÆâ¶] $EWA”cw©­¬Áø§†TS8Ó/ÇåƎÈ<ìTÐΝз¡ÔÐl?ォ¹¦Ç³©Œí¡è>˜Ä58q^úÎàEÆÍ.ª/Pk¥m.Ó(„冔S&Ç°Ì%ƒ´Qop&zlâ¡©DÔñ(TÌ%wŠQHýÑ!&¹½ÅÁ/ŠY¢C”îö+ŠiK/ú8ôámå+Ç¥œ›²æäöŒ¿™‹EU"YÃÜ3”\x$³ñd±öÙE/ƒêÈÝ5b8Ó3ë= íe• {¨JDÃÙº”¾œX¥ŒÎ[À´úE0ÛŠ³UE£ÅÍê2¤4=Ácž)4f`M°‚$Ôkzï±æ;(ÕIèOã-„=¿<΃Pf½y‹|ds­!åî Ñ{cEÁF!úØS²Ç, +­y·²'!ã-‰Ñ†hêˆ'_:Æúi ŠR ÔcLSÛA$¹êP<Õ½`ZpÈõ] +›ãY‡’7O}¼ý“ l¦T½Ká ±î‡ $/ã<ʙK%”Ðäxît¾½æˆ”ËH·µ3òA×b $nqS’t…vƒàÄkÁFÀ°gˆ kY£¡±&Â::$Q¨’Ë-.'ÛþÈ­E¥bpÃNê“ê½ÚļC䌍L^ì'Túcu¢—‰ò;– ÎxÃâÆ.12\ÿKm82üï²ú™±°X:píö’Ô¦ ÌÓAû*J‚þ÷öŒ?ÄõñÛ$£ËíÇr²{ÚZÉ'š[£â‚.4ðö "þ¡ –[ÌHþñl‹u¼)À¦.»ýË· °:I’Ecÿ¦m ]ïʓ$ʚÔ{…ž¶n½pbõ ó¾Œ,B‡ò¡Çc ÙÞ´«3Ño ÑK9V¶kˆe­¶+н0ûE† +U)>ÐzÀ& +›^¡Í;ã¿9mVzHQ¦œi’¤ V~vG‚W5%ö|{g °sí˜ä0Újë0ãڙªHþìŽ^̧sìÃ)žÂ²>þlwÃ``— P3ðàË}a…ƒä྽ Ú6_a?ÿG ¾ÀÁŽ…/qå˜éÍÐ棝P' ¸>ïYîKÕù™aˆ+š`B+µÜGMAÂáÒË÷~Aµ8ýH™{Q¹V?ÖØ7LÀú +ÏrzYÞéÏùsøúئ0ˆwKe†Rþ¸8AMPªy`¹2ÙòˆÀšÄT–5DÙ¯dõl‚—1¦Ç#&•­éÞd…¯P‰lV¶@ŒÁæ2k'`5GHx€Å@moÌþtˆ¢Nûˆî»×¡Müæx"XuD%†3SFÊ0˜¦æˆ€¿*Ön{)þKchˆÿíþ† ÅþØxV± ÞÂ$b®3څ2«Á©Mad²cf¬ß3²°.É|‚8ñÁ‡3éWæm€-ÏÐ7;7ÿøz‚hB7Àè`)´ÝHâÎ÷6Ä2ÚïOÁ-ŒH?qÉ–P¤¬ò÷2ö®L‘]ؚ…'A]­[U`mGf /­O>A]Éþoý½añßâjHÜ °ŒHÇq“ñÉ(Ŕ ˜ þï.‹ðï×ò ЌP(üò˜®R·Al`ñ__‡€§Kڎúc‘à ¤íöÇ6Äq­ˆÆl[_Ðä”êVu•uGÔ’>šˆyz$ïS®`ãj~OsöÛ'õ‘|LL˜.¤‚cXmGæfzåõc™fŸœõ"ÏKŵ¹Ïçåï3lÑC,È0h¤K?Š"qƒÁ¸ÖUfÂû„îñ‚²•À6¯ ¿‡V„€€AU³:JÁ4Ÿx÷xËtå„éƒd ¡ÿñ 0 Ø»nT§ÉՓؘ$¸(ÎËkô-VEÒñ…P²ç%êcðh.–]G¥¤Gì{tÆÙCr;¢+P‘­:‰,¡XTÎÅvX„íŠK1wÝ Q7ístR›„‡'€¦…Ì /9šŸâ}Þû›¯t3:‚ÅQPiÚnó+â’_1Âç3Æ8ÆV G„ðüuÂÂ([å70°P$â–Ò&r +x§Øم8T ´\–Ò¬†¢÷ˆx@Ýåµà´j*ú÷ŸÒµ¥}$–ë¿d‚ýañhæn@6ºpÍö¨µãvÊj’ï$ñiÑgì‹ +ØG¤ ½³~uK)S’ýØ*Ì,Óqˊ¬ê2°,‚ˆ“¨ð—šÎº,*/t¶@“Q#戠=ID„LAÿSá/ˆLsŸ%Œ"*X%ŠŒ8ÍÄ\Ó£aIM³ê·¯ÔÛ?®8˜p’Øá¢?é“,‚YZMÜ$Á /k+îTîLRx—ÞÑ)¼’¬.çʪEe‘›s¢u—pw"ʞšÌ,S¨å{"dƒLYß‚îVm 3OßàG1b"–}ÇøV…Õ"-ÜFÅ¿âníZQ1'tR˜‚´¡¦k’#™“‚b¥a¤Àɍƫ]gŸÙx",§¯Ë9·ëFQÂò»E”Q£ò{°yK+Ÿ¦A~ãüïü«z9&,AÅÝÔ+™Ç'­hö¥p»Îkçßâ7dÝP ø¶æúìuäÿ¢ë2=áíQŒ!&ÿa=wyÁ#B (¸ó•zþRBÇSÛÀ’gÎ=ÌÐ{㭄t#Ÿvrn•ÿÀ†ŒôuÉXZ@¨i‚Ý…Ø­¸¬\e=/É‘±Ø¥‘vhÄw¥ßµ^X¼[¯²¦?)µl.MŸO—>f°è.ŒU5>}cO@ê(‡ìïjŠ Oj¢~íÎ7aÐPßl¿}.Öp„SÊ4z˜8/T§ºÈËË_º¸öqß<ÒÒlTáê_r¦÷ÖÈ9nT¢Šÿ´ŠP[f‘ÃLb‰®šYìˆdԏ%M°»a£j@hŒ„iÔÁ3¹{ÂP?µEªoSØçB ƒñ$¥LVÿ¬„`ñ‚¡£f#üóÎ&.AӀ$óa¥:VQ4Å&¾g¡S«½wÇJ¤½•m ë`À†{Æ>jõkò¡ ÓÏ}ðHà +3¬ù3ÉرùêÚÔ5æð°c…'¡Úo”µYµíœø4KHKs_,—n´lGÉ`¼%6S,5ٛÙ5ý·Ñ Š"c\Ýý„öt±LõD& +2Ç0}#±1°ÅTÛ"ûœ-7ŸÀÈbæ#]_¢˜Ç€b€¼\êf¾”éˆCƒ×Iô¸3ôâäU`<2¬xƒ¹äZ pIü©"¿[³Lö‘!_OÕ›{…d':Eq…¸B[<@Ç×/¨3FÈòcößçûk‡£²'Á;L¡àá@¤«?‰Ž‚Ÿ\þ?4,®¢/€è ëšv‡„.{]oì ÷`ö˜Tߍ@œ‡Hsðÿëby{l”[¬ëý«ÍR…Ï`;û´Ͼ˞Ru[ʈjz+ ÅHSXtÊ1<Äl•GTzD‘þÌà)kUîCwUóàkQ㔈]­û>$à:±­µì²Rúе‘¬æ-¯¨fod\‡‘IM7ˆF‘‘iûášBÀŒ6´Å—Æð&Ã&œZX:2-–(D ¤<„9T2¨ùƒ}Wtîâ÷¿ú}àÆ0´Z»¥"™NX#9ˆ³ÉÙT6¼ëï5MÏ:ÐMöo# +Œ4ø±‰…ÎR 6¸ÿxîA»¹l°Pá/¬]eòWÂåʶ:Ô´·› ”ûO`¶•ŒMKJþÇÎ(p¨®P´‚}¢“b’<„u¡+D;É&|e¶D>ä‚¡CŠ>è/±2Cl'×Ç)KŒ,å#ÑîP8åMrO™[Ò9[ÓÝRîOf5)å›ÈF’“ÊÜj–¨ñçbb³µŽ” ’1J1}ô°—ꥃÑ3¸üß<–êr:àÏ#dJø|@Irñ˜Ûü+öB¨=Q¿jŠFâÂçÉÈÔÅÊD6˜ñˆÔ"z­×Ð’Sè!àà ˜„â53†ÙïU²6š2´“(Íc8, ~°uðÁZña xsp*Ý®£,°2×\Dý£{#q®§­ú_wì×<ôþÃ8ýf¿¨Z¨ÏcxD]ãw•½é×ß嗌%pJq5ñ¨ÜcøF]<´v {jŸÓîJÑY-é\2̓ˆ"'Â± 0tՁʂP´WH ÌßúWlW:{“™)Ù8E>`ŸÐæ =äáùYÿÁ2¶üâñX£…H}¹å>†'»ÉQ&-—›VWAE7ÇýXPlØÀ`¤&„N¤×o<žüÎÀÐã^9(ÓDRÃr¾J `'¸–c0UD´›ñðNõÇs?|a@o<´‰‡r/x<¾òfZVcêk†.q°¢j¿˜¿¯õŸlí‹Há_æ t½ï¿5¡Š*ô‰Ìé7¸#„™ë ?LŽÑós¥)bXœÃ®ü" %s}¿ _o„`€–‡ØÁcußLH(üîŸ3?±©, ]D”Ê3®ê¸õÅ/c h ÓG,~÷Ã}sXîëàœ2Q'ïyV€eîô(b– b{x„dü¸í¿ØOƒ$C"ɲ¢àr°Z«Œf§Kȶ!»²Möܯ{ç»5 ìK¤.ô~MIÇÓ꽧ðâLb°žp¹ ·2éú]™ +%›§‚ƒ¹¸T‡B+KÆ.Œ`ïQw€ˆ‡êùÜ +ûx$5 ¥¯>õI/¤²M{SŠ+ätvf$Ïþ…™²…‹Ð»€(.~ŸûTÅ +4ì¡>ãåo•t•Ày½mLs˜£cG²9X™|ÌÈCâ`*ö9˧V Z¬G cLùÇØ­v4ù4ÌíÉµ³1‡g/ÆÕú6»ÐA ªyx˯ÉĈá#70¢Ê³SSb—:ÒFm<`€O‡âäÃ3;$žÀôø%æÖÄÆO8r=ÌãÏ å!_Øîì› + +Æ#! í%îJh=EÁLF¦§Ã-P9,Ý­àô¡>…sQIè×xÆ«—ŒR>@#C1ji˜ƒ æ)3I¾+`0´äqäÏ4]a~§×õéçºüÁþ†&(<ÐûِÖQ»ÂÎHáz|ިݿ£Ü&rEü#JÆ3Ž +èqÒ÷ÞfÔæÚëa:ñJ¿(¢:N'möv°Â…ñÎà›¤Ø²û\Û»¬¥c(á¿4½,‘nGaù½ÑHRO ôCš Ë¿…'P'q;ÍÃÂÀ LwíU eÛϺÀ”-äá˜hR|蚘uÿ<¼‰µtÓº£÷´§»,†¥Ïš@rÁAÑ÷š +ŸÙ»)w€Ýҏº77ÿ|£{õþÜ;î£=«yqÆ8{:ˆwâ +hé?Æ@ÞW§#»MÚL¸ç¥ä†77`#þ A¤v£'5yºˆ­<àwHgFÄ÷ônŸ¥†Ÿ +ìX^¹\ŽÇ0ąSãÔxrXфå¢ÆÒ­¼÷f¨‰I‚‚¨ÑxxhYª6Þ3ÁÑè—& vÚ mK΄æ`"¾ÄÝwæVÄb8é¡RßT¹•öÅÀ€ ( Ùká}yÄ(Ú +¢­ñ؆8mš¢Kz3ž±}`œƒ* âR…4Qw„Q¦…ãÔ-i1Lזê[Üé¿X :âGÒñ¬ÀŠùMs‹9º?üb>žñ(ÅÜdXjÝ5&©&KQÉb=€l8—’ÞXpç=ù´z…DÌ*R{S +Wàý±-ԧȁl¡@9ááüÝÐ$úU¹Îz,XCš«ÇAÝÐÆ¡yÙEc°Iñø®dŒøU-‚#Ç4yáÅ|&È¥‚îù3õ‰ñ!8F†‘–ù¬óä2Mƒˆ­¢«E1¡î1Kè3¿Cë÷³òÄ]ÐV`»èaôñz6XûÒ±eÒK7’ó­v¦ó0ê*ûgw¨¢:RÈ&ÿÞ+ðō)äqmʸ<ë"Pýli!ävZ‰vkD¥(‚_Áÿ\—|Îidªæ^5 ëÞ¶å(õ „¥´~Ñ(á°¢ø;:{\ˋ‘«^æ+oØ¢ b¢ê‰³Vᅈ税`E˜>È."ßêäÉ7•µ¼€>8µm§ðù”¶ ¦Ï·ÐY¦â Êk-of|ŒFh¤O‰/af;@“y‡9ç‹ÌœÓÛ_ø™ÿ î]pÆ50öî]õÓM†µ‹ûT_òwVÂçxôHÉàÝX"ïIS³4¦ + +òð0ë‘ØÁ|‘„¨Tä½.IÌ*ÿVô2Ú +AÚxEg ž¼kt.pÖFWú±iŒûµ>›ª$ØZ£ê€¢6ý¼›#©R„Kù–qŠNG"@ð­!iÛÜQÊB2­Žkj¸.bñßJï‰WøÚöpÚµƒ4ߌi)%,„áˆ-uü¯š‰V"÷}Gpr©BËA 25%¹¢XWz#ìPÁ ·k‚}O”· dϝÍpà‡d²tp0§hE¶œ†@”™†Á g³ðãqM'¶­hy!ØL6ÃNûa†L¼šÝ,·Ê,‡ORúۂZ4á4:ÛX°ûß<VQc_e¡sEs¢UŠ8&X˜éâvpZ¨f6ÁŒì—‹AA8”²¢ã,wÔ¼"8wÄTÆPœÃsÀA–º>/¦·Â-ۋ[ҎèH‡’ÅŽ £?ãÜV ‰ëñªbPô¤ÇË:&p/FùT¨óGú¡’3û¦®õ19} ^{‡Øxå5³‹)=îî!tÉ/dnB,ð.7¢pœä½óãŸþÄq©c‘›Û÷O㉚qiÒÌÚÍ" +zrQŠ©Ÿñ¬ÈçúY²‹VlCë~ Ž=( MÓõïø±nyŠmÒ›x +œ_xÿÇ)ÙOäÑüBÈd;©MÅQäzV†P*1ào=ÍhŸ ŸHáYpd •û- ÿ}²~˜]²°ÅN›ì}aQS9¿àà¾Ø©@<§—±ªzYU^^Vį„mã.d$Ij˜º=üÿM–·Lš„•S;cfXóFÃ<ß#ÅɵMsݒ¼½ÌD™5OLÜàܱU–u•2- IfD6$‰šZô²l¬Ô֑coNÀ5k^®¼òã‹`%Œ"³\È 5Kϝ8zÂei¬Û"v „­»ËÏ¥¼†þÀØ"Û`;ÄS·1Fˆ¡Ö—f¥iHO‘P˜eZë¼L$W:ñ~½¹'ž».þÓ«3‡Ù‹&¨;Wû€€9å|õFž´™C†ÒšÝÛ2÷S‡‰[µš­1¹&’©ÂåŽn+,ÆUnžJ’¹ +íSûYP£%DÔü‡…,ŽZPK‰f~Èúʃ +ßÉř`»ËÄ>bó4†»:M/s2…8\4BþÕó2kōþ‰¬ q’P@'HFÌRÑ ]ß-¢pDLŠ?¨°ërï>Óó£D“h–v+¶ËéVsÄ×4À{Í3 ñò=Ëu(ÏPN°aŒ<6h÷‰ã©–[aþ’Ê3q÷>ñ‚å +™è´„û_€ƒSaáëDÈ̲qD®0\A2PB§u—yyÜuŠ€A¿ý–Cl…á†T0èŸ#kjÜ +›M‡<ì² ×c*+è÷Û ^cµhÎW2.½Âm0:oLšàlíúdxЇbå…lSÐ1tÄ´v嘞IËì¿«&…¤ÛþÕ`xFaª3u…Þ,"¿)ç ¡b“‰å¨½ÿùO$ˆµbØhFý[âI%±[ϒˆ†¨$I +¹O›ªÜh†]ÛDU3ßb”±Á“€ $OÕ. gcxâQf'Ÿx#×ÓXÁÕ2©‚3áf|ª½á_Ãg ]1f4p´yFå#º~ÑÓł:þ}aE.?iHó(8Uƒûºc««é8Äf?Ì åd1³‡®¢ØÒkÑþRÚE®Tçýú…„»ŒÖªîÐb³èFXùx¾¤s𐤕’^XÓ•àg^ˆƒ[˜i‘È«eT‘„:•©›¢ªAgHoÜ XMh}àô ú(H;O$(F ;FD⠄ 3ëÈåĐR(£S7¦£ë&yþö¥]§›yöYF¾=¡ø2§ëË%~Öj˜8<ôy+è-2#n¡[†dÈÃ3Î)-¦\!ÍSušöŸ€!©á¸)¨J -]f¶q3³Ì7ub:Œâý‡@¡¾9±ù_Ô÷zM@b’ÔcN¼Ï-’Xf¶¤©åŽ¬<´·<‘Þ^«¿¢üWîæ(æ‚âBÚ­Ÿó9vé•T^ƒúæ R_M÷~˜”—W•‡YÞyEÑC0,ê¨Câü½MFl®_µ‡ sŸæ0&iÜÀÔ,¶ÔiþgÕf:ÆaN¨$•$öÒé"Á û³H! b’=)š.f(]SáÿñR¯‚Tˆ´ÆYÛäáWÙXIø·-5‚ü«`~ BÆÈE¡„ù§vº:ðÊ6zH¦0i|#Q6^7K̂:ŠÃnÈ4mð@[ëäþ¶•È­@”E’¨DÖ}½îøµbWdwØ%Z-4ŠxöüŠ-¢¿n“RÏUœˆaC1¡! +uË8ÌÉ?=ÊX’ñ~ãµWJH’] ѝcæ‹<Ð'Þ¦9®Á·k˜´&q +‚¤)ÆÀ¼ðbÍu©v38ÙÜkÄ ù†æF-ØVþéP«SH +) +yã +êIÎÙ­/„½WA÷δ÷ +–“Âd’%•u´=1XÛ;Éu"  µ¼±9 ¼^5¼€u¨æ_S+òÅ©OV%×Ò'äH°®Î ڐ +QRp8Nf8d‘. ¹6 iאª) “¦ ÖÉTù¢~MŽhóïŽL„ÜԈ+úêd :~fÜAè5h•ˆÌ !ņ€¬A[gÏ{QävØ÷—;¡$ ÍãÔB¿0‹$1‰àÛq¸$§ Ï.@°±#ææc<ÿ§¥¬S»Í³¾V­ÎEÃtÀj9ß=_íhiB@˜W(ÈÍDŠoxº¾Hè¬ñɃ]@¦` ñ¹`þҿՙV <[Ä4òà‹´âÀ€Üä¨7 *¥aK‹og¹5, ÷MUBËîLb¬2_£L’»òá¦P"‚Ž‰@'2\ +ý§œð*©YzA’rx¤`eG»í¹ÓòA¾yK»JD9±[26Ñ÷,ocőKä&M±ZOïiãÚÔób¶c©Múàìaì+Ä ò1쯄úíõ¨h„5¬XyIÀûVZ‹¶o2c‰“ƒ’d†¹¸yAw®1 +J+„i÷n…@ÍKdÙȜýÖqÞ^ í›5£«§³ç­ÿú†üó¼% ÆdÂç`v®J]«gG£™– +o1š6 Ñ =·Ý´¤;ðÅ¹](ObBE¬GpÅæÚp/©P +ÞID6›{o™ßݳ»XW +ßö5-ÎlñÎ †{m£d+¥þ¢q¹hBǚ+Ô%©|'öävle‚£.‰ÒÝ”N‡™…ŽÖË‚ÓÖc‚–qCg.fz1ë“ì¨Åžz‚+N%OÐßìfpÒ´o¥räúïD¢Bc\·d˜œŽˆé=EÃ`AªvíjÜØȟèaL/[œ°³Js-%¥=cÀ'ÝúÅO/*ÈøR ;±§^¼%fiѳ½›’¡:´”Ù¸g›-ãF‡i ³±±µüUg5Z("™h`[‡ètÆËd°ÒB~E 脍ÀÅømÅLhº¡†Ãï2( MžÞv}‚‰85)ƒk2kÖû9šX¶õ®oBŽõ§õ‡ewâ\érÜþ'@fV@ë&âô.»sFr†ÐÉ;„[sýŒÅ\¤³3Ë®H blx¦¾@Äkýª«ib^‡d>ž‡Có4#á$ôÍL@ñçE¼È ÿ ü3+¡ÀM-ÂÊû÷¬T—º&ö‘*¾¡„t£ÇhÖn›ˆÄŒ™y,m<[ï°%­05§P +:±^8 Ò0dE ”Ïúë3ò>¢Qt ´ƒfR)ú‚¶AráÍ¢Å"½-<Ö²XKó®|Õ¢+tc'ñR@ÞR‰£l‡–Ô-•ÄAfÖ)Û´ÖԋTTÌBˆ‹t2{kvŸ„Ò.N}$Ü°ýç”à9h8â$BM_…ïl +œâÊ[UÌã ÒÕ§‘ÆÊèÙ(ÇOFUÙ¿Ý=Ê7µ¾­fØf±rqE(7íJjØè^W&¹ôcË£âºZ(Jr ˆ{ª L=4HX§'+$‘Ée€QŒÙÛJGßëµO„qVG²F4Ÿó¹ ?ø…âù0è+ +‡x%ópè$ez÷/RË`×GMÅÏãj™Cv=Ôp*“Pôa}¤A_§qŒ~Î.U¹OÔñؖ#/–4Ò¼ö3Ę>Oé𛰅o’óGÁ¢¢QF>½!ê:5•ƒ ïÂàVÏ0¶Þ‹N ……ònQþùsѼ¢B“œ{°ªÊșÆ¡¤’XK–âfÎ +°¿ßŠKià”Ôr/$ p‡X Þ}¼]9ãO7©#žå‡7ï™bÚ^¹>ÃÆÚ7ž"OFË2´ñ6ÒoÜØHl#֝r©ãmÙ©7*Z¥u€!v×-ýã•Ā®b愎H¼W÷#™˜õZnÂ@Ѭ zîF€Âð‰e€Ê ÄWÞ{¥}ïàýÎ¥úÝy¬ ¶¯„ô3‘?xKã°eõºu*AÀNÏuòŲ´XÓ¢Uv+ÐLÊކ{þ)>>²Ò¡ßK¡û/_<`…ë”ë”®–«ºû Ü¥†‡xA,ß QzÉkV«€­£Ïg ý‚ÙJp̯?knX¹T‚n¡â‹kўC(Ðzš™ð&ãԃ{jÃÂÆspòµD±LОÌÇÈwI(…‰˜Äk¢˜8½…IÁ©eLºa7‡ˆÚ¾O©H¤ˆ¯'àd³œ=*‚Äò3dŽ½£Vœ`¡æ¾ø‚)묶„¬DËw7ìoú]Kq±)(欓ƒ_Ödá ‚à}Õø¸×'ݛ–¬xÁ)XFr}{}Ñ$_c›-‘ŠðAWzÄïÓBïÐö¿k½3p9žÈ@ÏÀ«N +““c×Wð[sðÉ½I¤pèÍráKÒzåExìžAm豈k$Å´¹æ7TҘÉ|97œ”!‰*’ݘ-€„R½]ä¹àg V!$24JŠF`},ÍKÄÙ¥1Q‚¢y}…Ä{9i†ÍÊä|kF˜á@2êèëYÔFGÚ>Tª¾gH“¸æeÞ£€‹‹<³o˜v¢—¾¡,÷֔i‚5i¤>n1s1EµKyÿì>6œ€“Þ–:£?¤\IpžD3‹sn[YEõî‚èß{¤Ë"T&4t‡¨GŒ*Þ<P4aPÇUä#x·Ÿd\_×áá?þ½Sˀ=(ÞEW;¨¤öèkææÓÈFù¹9MB ö)Þ§ €„@©0;ÄEiQø:EÊMÿ*B0‚tžî8Æ‚WE-ݹ™ÒÝ-Ž_HûÅT‹ $ùÈksš`Ø@&B®ïý°·]b°nÆÝ£ÛÄ ˜šé`ù)K÷Æͳ†¥Íµ/Ö ʦÑ( þN .@Ái Ìnj‘ùW.šdñÏtßE¦•ÉÒX}OjPH!ƒíöÁöê">¡ƒ Šœ ¸‹ãzõG9ҁǐ3Ó~ŠF_ïÕSA¸‰S†A˜ü?xO©©#éŠà$?C{pYZ</Qö1Z÷íÏêϹ‘ý¬×gó<ƒZ<ØVy˜¨cÏN?¸Q§'ç% XrJ—Ë7ÖQò¥1ëÅwÆ©8XµVMrô€=«" +ùfly AB((¦d÷`íw½æŠq‰FLhÇnávy3XÕ¤€/è³ë8sû‰;hÿClº†p©Kù£þã(‹[ƒ0­ ñeò'9“Uá­Î÷›.$ªûÍmn°“Í‚Ì°ñ3´FbDÐ@ÝOoÎw·}% ­Ž^$†…N;Ï/!n*?`!•Ù[uÏ{¹8çƨïÕöPéèãü^R/1ÿq¥wáýC£€Äú¹z“%OÞ_›gv ¦eÜx ±†ö ^šncÌfÙ}çâ èØÄJGp'!Já,-^•î;è“#A߀7—YCah·6Ã) |Få8»Ýsf+„=¾dÒ[ÙΫ…D*IpËÌFSPr'²VãK‹å4N3´©D6ÙjQÑP\¥&wÍpu”TAӐÀLmÜHښ6*šâéL[T¨a,‚tÜˋ3íP%á -Ø{äB3¯f5HF~ïãGSœ¼&üZHHúdƜRr®`YÛ«¢~ )ë ¨9â ËÅåä„<¹Iah™T_Ïÿ6УñJ•ö‰hø· ”3:Ç2,‡ҖHV$ý3´†4è_„å|øƒÁN©HÃ]ôQg½óé7cq˜Ü +!,އøg¶µ¯2÷øjm™¸¥gbá*  +gk,Èï1#É4(斩«PjéªËĸ…`†¯ãNƗm“›xF¶ox΋È$`·h+C ºZku`qo„eÎàœùyd~…ñ*ž †TœF, ÁjwGÂ|°“@º—hˆdQ<Ô{b+}ʇ‰ªh+× ¢ªÈU§uD2òððt–\¿1ÇQ\¹¥'µ-f=S ûšºezi2ÝxN»ó%žªfá :šxÞöǂø€ÑøN¬ñ¶4|’åˆ^ì»{ZwŽý=éòÔw¾úÌm']X֝à Ãï-}Â6·ö5dÈÊÔ¢ÓiòO nrUUÃlÐé+½îØÌs–å“ëWù]7…ÉçMƜ$¸Š†Ü͙õ„±•CátËÉvóD/ämʙ`¨Mrú€©õkmŒ¡âtœe +]3>Ñ…6K"å‘=Áe|³¹·k»TE2‹Y¢›ÕÃÜrӊ"愛ºy'ŒÈp›}x6eAξU×´`9¥l-ˆö 6žàbÓü~Ï8Ô1¿×VÐŽt皗ÝBZ ¶«ÖšÖ1ÖÔ=†aUÐLDфà¯c؇¥fԝ°¨DÔaCUCµ°—_քƒšØâÜMm“mú²”(ñ3ÅÙ kâÈáω(3âu½h&—“=f–™WyÁæo:ÞÊJb»Ìª³Â,XfeN+qÉÛ<-P¦Yԗþ63ÝãM¦ûÜ.æ“̹ ‡;w|ÆØÑo›áàܾ§˜Õ€h0·ÄL}惘W•µ0‡I†_!ñì˜1L¥´ç˜ +e‡êz„1—MæÀ ÁÐ e +»þa`ÖÐñT®²¦Žl)Z ¹o®P_úÄeöÔïÛK&õøïUß6PòÒ÷®±BÇáeuX æw—YRÂÜë8kôœÈkéÙGÂ+ÁÏþ±Ò–Ðü« [®pŒ&-‘Z“ŦEŠ(c46û††–U+b~g©­(éo—ÜîÆp"É¢*úøÓÕ&ÎÉæç•ñ÷=ìcD ¬P¶Y6Àa!m1薗Ý""ó·/22>ÛÑ6C³éËjV×َßȓ®]¶ûôea¹÷¸æ°¹>z„¸`DÌá&™ßö÷v‚D”†(^hYjéüÐЂ1Ö…çùLíO ѳLÙ:gè÷"§$* pѲŒº(J]üå 6ýë 'u!NîõËP¿JÐĤԅ§cãÑ|^rêÞ'°8 ÍC2$T‰ +‰ª$æý‚D„á?ò¨zÆÉîòÝÌS=IY:ÿEÞ{䟁Wgö…85^«\»¨t¾ ƒ²ˆ<ˆDB1ž<7 +¦LT€|À|ˆFÈ¢0AÀ@Å)d3@DRt;2ÔB"Y «ÜxhU d3± Ÿx0J¶vй:àñîÀjôӆà¶Â–|Gf»}õ¬2hbT—?” z"Å xp +„äüï¨÷3OÿgÐ_T[Înyã¦uÏß¡¨´Ëìö~¦n4L,§X¼.·<"çùŽ‹z§D!ܙ>o<‹êÊTWg{ÇóýJG)œ½c¥Ü(ñ™ÌÒë…ŠÈV^—Õ;jVÕ.‰üôŽú’ÐÁ™—wА‡nž’w´)ÊUu¼#ÃemHM“Q/‹wÌÊ ØÁÐé@Æóh:\×½fz¶»Ã©*í4½h´äâ6‘»ã•ÚÍ¢3owÌ1Fö†Å>«c%¬ÿù@M²Dï&k ýBÑå‚é0˜ëŽßœ>,ãƒhl«µ™T¹Hà¾J]GÒçFcy(øß >ðo™øïÉ‘ߟRœ¾¿‘ŠßÛÛùþáúþf¢},Áqµåf†X9‡]‡‹ƒ;\ïý9 zlsÆM’ì§WÈÓ£xõ (#íòñµïâõžÒ9UûÞ¥µ»«eA¯ÚCiň1ö‡ïS=~Z͍ÞíÚёۋqgÜ5ŽÙ¯‰\ˆÍ¢éeGÿ¥Ñp˜¡šv¸¼3¢’嬶§K>>,‹”Â&_svŒ6 ²]Äì`2»‹wY>P(¾ì` +Ó]èjÙA@`Q×Á+ µ†!}ÃödLttlèïmÊô×N†ì0}È¿Ž›˜“Kx"Ø](¿‰Û®Ø€Ù”hè¸þˊ5·Lx nì¸*Žÿqõ6NLsðpíÑÀâ…;” ^œXlŽjû¿3z"ŽÁæf®v/îŠèÀ‹ª-Âzâ?rvtb_¹¯äÜí&ú¡€ ³Ü"øÌa2Ð½Vb }âJÉÆr¦ÒWÃöuúaa! "]AÛrȦ\ý”¦×Î ;dôç:Pé¼ËuÔ"^ˆ—qD½ˆ0$3åãG¾•«á:JÈžŸ:¼š¢º^Ë%ËÎoQùxý‡ý^L·u( + Qß)©Fû¦ïŒÇH.i8R㼿 ؇ƒFk.±:ցHHe"Ï\ãàùàтDPWæïPPåUòebà‘¯ß üÆ9xéŒ2}€¤^4Q°LQòP#’­æ_u tÖ½·™Vë8Qtô÷‚Æ£™³ÀÙûü’¯=lŸÎdPú‘ª£ßLáý¡<È|"žéô·[dä:ñOhì®qÊG#=ƒØ ¹tðh $þê8tÈf‰lº©/˜iLÈ`«×¡Éa–Ÿ!í÷Œíwá !˜ùŸ°¦Cw²A½©¬D—Q‚üx©PA¡Ô‹ø?g|›-M¥Òe¬N‡–me‡w_¨p‚FwöœŽ¥þ˜“ §ƒáÊJxSñ¨l¢<'Oô­4ì°ÈÈÇfW7…ˆþVìé–É.bSQ¢§ST‚ì#qEvˆäTÜ«th8§Rœ:+ƒ˜s„0$€4ÏG/·]'ÝM}àÁýÐۓýêóâ.#ØÛ' Œ¨‰Ãt&£Ìã#(¯õPŽè%m >D2(¤ŽÖ´˜O|¢#žÕ¬þ8à±,±‚»C‡_$rC‡_ýZNy¡c6%›èÉ +èe?éFÓCtú\n–jƒò•Ò|äûŠ~²ƒ ¸‚Ÿ?0ÐÄ?]RV~»#J5þçÂÜ98N¦¡áCøü's'³qØØHSì×ç˜7 ’ù?\´AMb|ŽFk@c4Ï÷±üN攠=G$[z\q.”ð2èÜwŽŸþŠì+þ+â´*ŽÎâ…àÈE ¹Á-‡FñÂvþ v•,æí™< †íuV.M‘ñcȗ$ÂÝ8ðGçô”Cz ÍàÅÁ‹#i>2op:6,˜ŠL%ÚºáæÂÙ&ąÌÚ¼ø)J*‹'e‡8ŽÃ¬åŸ!v:^½8š|@î |±sZ÷-Ú[œ¯²¨¤0§<\LµÃ,ˆ#z¯¬mA‹#êýá&ä+Ž1Ÿ¥h*”[qà_'Â÷wª…½Š#ځRÛAóJB z`ƒÓÓsMb¥Õ6ÎÄá¾ÏüG¢¬ñŸ#Lü;ވcWÚòv <˜.â ÷H·}ê¼_†cÓÀ°jwƒ,Þáÿá(Aëg•ùR†7ÿ…Ù?;ïáÈõodToQâÆSªßÅ]…C¨c=âK)£W¦qˆqLŒè~ ÇÈcA¦Ò2 ”#YÑ2…g8À(8ò¬‹1ÒJ—Z†ƒ_mÐ)²Ê:€„ãCÀòQw¡;”yJ°¾×Õú×(@h$ÿƒØå1Մãb½y Ç#ñ#UäíTa`Yˆ"E(á¶öÞ ÌúÚhփ. +ð´BÁp㑚ƒc¬ßžj^_p„LªøšÒ‚£ýÓuƒ‚[6ÿO‰Gp8òaÙ ½°Ôºqö“õ7ôã>8BÍGہƒT`ðypЅúSþ¯ #S8-†$ŠXÁ¨00­€BâèU/¡€+oŒᴜ oÈ|2ôàK¿]í© dčPåä/ÞØöEÀÑ A[xŽÀðHÀQ·À Ú0üߨ "•CϤIîߘðžÿ!‰Ò–Po;E¬¿¡vŽmoøÉT `ŽªüŠ5ZûÅÉñay~ÃóUï#lR]$tƒÆ¢ŒØºåöÆô3X6;tfIõtóF¶@»ñ͑±æãô ¤UŽ¾rÈíŽõ®eƒóVyÉ7誆 +6÷øÆ>ó}å`»/¾'ÝÐo†º4|£&Îc áC¢ ¡­ÛàÔ$½tÏž#XMŠÈ À¶×*¨ñBqPì÷ã¹JáòFúȃ•<+: +«Ôޅž&>éxö†¸tãÉî~Êf9³!–¢yÍK +ãLFF_v¥Øçô³Ê‘LOì‰ 4` ÛÝýl=¥ºNºÒۇùÆ,MGoÔ"7ÔþO_G6†ÞH ¼(HçøîÌso VXÌÓ}&Ê?dލó„UŒ1¼ÍÝøëUÄ£ˆ #tº¢1Añ÷Šè€ÆÀñCgªçjݺuƒªÂ!¾Ò˜«¶Ò=w£ ¨3îÆx±0ÈX438÷єnkÚ ¶Ø\ÇwðìÚ12ÿÛè Îô× [u%1„/e·sãؔ¡™®n¬há2ŽÅXKi@çm Q/I0k£TOmÓøtƒóBKvÓ ¨ v–nÌ¥|ÍÁ ?麬܈֨n쾞‚ìoW9˜¬#žÖTòRsƒ}Mț%=±©¸¯6ÆhO­] +‡E|³è¾¹ r6 Å*¸Aÿ…,7€~ìoÃ5ӏŽõÛØ#O„6k;I%þðÚFÑ">í6ŽAP¬Û ®…8¶ïÂîƒå6ˆ]Ž®‡ð‹,?(Ú%Ñm£?€­éx½X A+ŠèÑ6æ·Û±}]Ábšm ]'ëà= +’K¶á“’ÚP,“ ‹m´î%˜Óé>mh׃+5ü¦³&Å´V),GÏA”=|ÞÚ0Z¢µ÷$²R1œµY»#£½ˆÔÄQƒÑFÀgAÇu­vƁa…S¢ä© 5ÔrÄíAGXˆ Fmèk¦½,xVƒ®4ÔãáO;ӂ$:Ö²z¤s€ˆáë>Ú°ð*¦ß[]Vl60õߓ JT`í 2ÓbϺ®ÍtMƒ²°:‘6ä5ÒÀx`FC@ I@³VÕ²1ZÃL€ã±,œ-Ð;HôW/ÖxgÓ%Jݏ²Ñ8õD²7– O/²ß½ÜFl¶:~HQ·JÂü´˜wJºÈ ÞÍÎï“\7 +yÈÆWûêNl,è´àÖŸ  +ªà¾l$o–„?è:ºl„’ƒhÎE Ä%ƒã †HM°{Ün:Ìä́Ó(Éåë|Ö¤‡רÆ1Cƽ î‰x鱡N®£[ rƾcƒìLÎ/¡/-62«­ah™ìŸ N„΋VT Öbc;ßyÅÈ$c˜b©Õ‰œfXÿdë›ب,rÈ-Wƙ~n6²ö:ܺ %i†*ø1øÂR;W4!•×Ú&ƒ>€°t áÍ~6CìnÂb·‚Yÿ¥ÿꓤa©Ï‚ i8› L›VOþö€òS̋T[À؀ø” |l)[}£JK:_¿W\˜ •®øã\0ÖýØ÷È‘͇°^7Ò( ª¦(}˜’>7R™ €ˆ8Æk<Ñjàj,íð­âÈÙ\Óß5º·{9ónÈSV®ÑhØ3—©s4Ÿâ®ê+?Uˆê (÷\ƒ'lhl®aâwR­±€zÁ „hcá5 š`P„ ¯|EJ:’?¸Çz}3‡Ú¿òOý֐ˆ"›b_D©íì˜ECÀ¼ÜL?·5Dòb†DkkÄå¿© –'äRÝ° ’e¾Ç-sλØÂ÷Z£4cˆJÏW£ë¡¨µÜ“>³FiͶ,ÇFo²t5Rଠ+;˃°¨ô,3HÎe?Yˆî¡a8‡50?Š–N]VâÑXGWŒ©éÙcËKè™øÐÐü–3ªFG襱{ûËcËÁj%©ûe±T!Ú¢a$Ï0)p@·ûLþa™UƒÏ·¥M„+þŸhyðïr#LÕ »§)o#Ô åY¨?Ò¡<ªasEséëÒ©ÚÓÜ©‘è0=p’2uXÐP»p÷¼©Ásýí\2/óg¦Fg,‡’%IŠ©Ñu/|4&±ª£Üc»;-5”ï:¾èƒ§ÛJ$’qµ²Þˆ]ROó&EØek¶C€KÖ¿Gâïr]}îÇáȤÁãÒ8íYr÷‚zð¢!ÌüEÝ딝ƺþH„Y\ÚÉ$iŸËèùnâÑØKì§Ñ”û4n™K¶ó‰êžFyù4 šeˆ¢A &{¨¸)qŽŸ—ZdGdø<[ù®ôœ^€[¯ûU#˜ûœRø¾ƒƒ’ßôÇ0Dʌ¿<Ρklƒi$ê3Â1¹÷vݱß4P~;¢”R…àŠ;àÈÖ®¦ð?¯h,OšÄêE—.Ic´xš˜M7)C`ÄÉ֝썱7CÀ؍Á°Ò€7w\mxpàƒ”ØrØÝ1 Ž"»˜ÆƕÁLihm,” hب³þ¥ñé µº—†‚mTé(B¹»4À÷®áÝȹ4ÒË *ârEügCñ:‹£á5E\<ÒG™QþhÌ{X˜&^“ïÑX6¤µ0\Ðh‰8“vùKÖKOY3c5â‚÷f®Þ‚é>ŒÔö4Ó²HC½†ZÉ`á>Ÿbe¸ãõüƒ4æx,ªh$ñ4´>$QâÑFÓÒÈ ÈϣѩGÿ?¤¦‹R®½£á~ô:~¿h(š…r^tGƒcñÉOöŠlDëÍ5ƒ 4’ÞhD¸ï¹"y¨6î  +À ‘k4²†àñ„I`vÑc´1ˆHO ȱ‡@>C#ËHažBÌ-:Tx{×Òñm—hìjpç¯ b_J¢Qû2ùòˆŠ<#7SÏ*#lvhÌÖVÇ=48E¡ÃÀèeÄ €U0­ö²Ð^0bL~¢„uŒ(õ‡âÌàÙ{‘Ó̹2ë<–NêZA Å_ùÓ-4 ƒELp>nM¡!ÍèÐå´ÝšŸÐ8›Ý‹L9p+Š™E•AcL>šá˜Y_РúØM’ÇoVÐø’¸í÷Á‘$¤KÂÈ´Æ„‘¾ªÀÔ¾x2~íÞ=MŒ_‡D“V «(½g¸"P…’ôÏ@l¶ŒåϨˆDùâ~ˆq(Jûö¥g€ÒºŒ bè(Y%“ ›C-,žÑ§Ø µ:IW\ޏªE/˜álÏ8ŠÈÙ3< :Á¨|=#¦’Áã7RôÙ¯‹‹ž¡se¡”“¾a›mBFå‹N±ÛƒÒ*ž¡É!X#“Wª]GÚçŒb¹éÈŒH9ßp…ÄK–BÎØt”‘BH?ΐŒ0ãžSË#­§Îðg;DŽÐQ“üfèEA:g¨ôÓÞ º¦ÁËÐGþÀºœh?|˾aoŸi3d +¬YqˆNœ±&˳=<™ÆÊ{3†j Ùj}:w3äÛLÑu(¦"Ñ)èq†¤ã[ïÝi3¸)GVíùѳ̤ëŠËfpzάm»›H‡®AmÚ°z¯Y… +¥Y¿fø¸æ6®:3ä:%Ójêw<°±3·Ñ;bó¬Œ`ÙçÏÉ&õiŽ‡çdFÞHu0̎ýÉý™±mJ}Ãf˜öžðÖæ©»ÑîÌà};γ˜Á¸È°^Õâ1pC/¬‹™…Lä_5Äû2s•¡JÛosµÌØ÷»îe¤n3^£ÝqTS´2£ÇÊè/Í õêD7†#û*mM?rz|ÌõþÄ;ftfŒœ_½Ê„oÌ(o¾M'1c[Æؙ‘Å(˜ðhhìbêaVÌ |Ýlô¹‚rÁÞe(àåØy Šô£]˜á_»0¼Hï”ñ¸2ƒãø§·;ƒß¾ŒûK”õ´¯L*¡Õ2:é•C +®-Cä߀z™Û‡BÑ.cï'˜u™avþŠ=T•Ks×j Ù½4é2 âIýóÃÖp°Æ:9þög2“²æºe|”#ƒäóì^¯{TÀâÖ <Þ .N€C@ƒ6¸ASN+ׂb#°¶4æÏ2¨ {¨Y¹9»áÝ Û`· +§ÏCq¹ä6a²ei–Í1šŸ³$Š D‡­]ûȕ¡ÛàÁ&§`E¤ Õ#ŒåãçØ1ạv« ¿´¥XÁÜÞøRAa +ÀœÒ­¥¼; ;¸¥Èß±ppÁPí¹°ßOõ)Ãe\Kø¸á)<ï-í*0+ùm‹‚0†`%cytÈ éæç-0 s—JFB¯àEi¶ïӌŽë»÷† ˆ‘Î-‰ÑÚ +{íV(ƒé¤Ê~ØXa Êp¿@’êØ=2¶úá?Æ~v þÉhŒµVX?áÖ#ÆP߶P}vŽ$‘òPß_døÎÉ@O^R‡’ÈŽ“¡° 4¶o2v!Ü +BËLòCEäOý„ŠIŸ|^¸ kðý*ç>ݑEs.T^†ÉhûIStðÊÙ.ݪ¸5T̒Áô¼XÝDIu½#f3î½o3¬."x,ùw (*^qA2$ƒ|åÿÆ ‹©I2öxÒLG r¾È6C¿Îtm‘!µ–gç…zGœv +Š„7¢Có&Έ+Îì!©±\‹~»!CŒÁÞ0Ә`¡:åc<8ËJŒC}7Íôï1~æ…aô0xzI-‚p¦Pô¾:%Ù%JÀPöõ†_vó \Híßl_j ¨Â€%Šé Aƒ› e7ÆÏf¤t-ÚÝfv¸2ª ™ñ.a( ­S ÇÉ. wä»ÙÆÂgcDñ0ÂébÅ”C#›ó1¸ÜÁèÊâàL> +<2âm’™à–DÓH"Íûé˜ÆûR€ŠUb¤Au{#zôŸNצŽh•2Í1¬\9¹Žú€¢'Ji §æi€ÅUKî;C=Aô}"‚chÆ ,ˆ¿1T >Í%̲¬úã"C{¡[òë·f՘nYØoŽèûGŽa¿@1G=HfW ‹¢µŸÜSC²^ RЛmŒR1›1¢È4ÂЍ^¹Ÿ £\˜%;C |cü.]¡1Fe?dCF/¬JŒÁµ,‡1ð&€c´Ì,úÇw0†c>0†ŽgþÅÐ=‰Q²@_ŒN‰F +Öx¹¨­b0êíÊÐÄßÅhÏâ¾ÁvU1xöê_®¤§¹£ÃûSHyòïä6 +ârE4Š0g]¤¿ìÈ°(S¡´3Çã>Œä}+ƄdÅ`y’»ÒUãs@骄åÑʙ¸¥î,”¾¶=n0³3‹y|ðPó[ŸHƒ¸W91¨q¬\s¶ ¼¯@¢¤ùì/q%¶Wƒzgg €úAÃ5üµ¬~ß±Œ×Á +xiÎ!wI§ò*`ãÌÿq²W† •œŽï¦½ø߂¹Æ؆†?d¬·$#1hÌ@Î}áNßæãâ}Z?ĈÞ”ÅD§ÿ\è_ ©0áZ¦qÕ]Èf»¥\s£mi¬»Ü')è‰ücׅ-6ËÊT1æÆPªÂãC Tú6/‘Š†àv2—Û*q­¯Û+á´<“¢Ãzšžët1,©Ñ‡Ã€Ø‡!ÎTÊb0¤ª,&Ãóh_SP<M4ê'cA†DŠPëȔeÕ*¥(*^@؆<‡GFŽwÚ¾å0º¼fԑÀ +ê됌 mj#÷–¤Ù0XìXN+ i‹‡j9Ì5©Vo—#7 ˆo£r¬¦tr5ºJ°q¯¸} R!pò$Ô@.ù ce?‡5þÉ`à;óȃÁ€°{`´ÐŠ­š• g +Æï„òaóba|0× Š)ü +CX±M|NaÔR]OüëÏ!;K)Œ: Æ9F[9(ƒøFßZ¤[ºàPÕ©­Š–@[#^Ôûœž +¾»“7vØíÛ/a¨·+aœã’Ë×ÅIËþ«%ã Mó¥/ă1lÅëù2„±Öþ^s7Ñ@í~añW1•ÉØÃÖ±*A@emXÁÒÈÁRc±††©ã` ¥Nžü‚¶\%«lƒ!ki¿×`TÿæúÊ«DômÉOU} Æ‚ktŽ´jàìö+íš~áœóÿh‚¢ž†Œù²Õ0 õ×~zRK_cž.™jôÉÆKÍ#º(¯·„¸£ô™7Kð†)÷…^«ãi~-èñò´g ÁïvšÁu÷¢ŠCì•l‘…JXÁÀI1íòS¾ ±:e½Çä)9ƚ™ë6xo„ç9ÉÊìžö_È @‹‡<|`Lñ”ïù§7`è.nVd9Ë2eÀ°fÙë}ÂvXX´pFc£òÙB =¹­]ã5ÀhϘ\Ùµ`\Ð`ƒ!p3—£&£á…=ã‚_DrŽ¡‹wh‹uŒ%iîaôíÐþ_ %ô5 \É ŒTpî_°±p¡}þÅí–M•Þº;þ…ýc £’$øW@‰Â_RìÌDÚxS/~ed©-2ü¦_,Œgô‹é0;âI„ bôÜüBÏWÕ-þ¶a[öù¢Åò72szJÈj#”‰²^Ä÷Sþ2΁Lk_ÀÊϾ N4j¼Fl d|ÍUž>Ÿnë‹ñ(ǃ»­¾¦,XuS_DPÅÁÙa±ºöô…vªH¯EM°€—wëSˆáQù‚5ðҟ˜OÉ]¡kH± +±‡Š1%¾ðjcÚ(qμ6’¢Õ™Cì…Oágõ{±8ñÙ­õEÒÿuºp¬%AÌHRK?dsz±0³‹<;¸·Åܯm‹ ¡íEÀ§•¸µ5™·¥½èÅâ’/M ÷Õ&éÎ^x¢Œ€Rµ[Ù ½±…íÙE- ¹ý‹Ñlp?s p³T¥ßáÀ­S/´9‡¦øÕÓ PP{Ӌ±€cÝ +êb<´™aŒáJ9þtہz¡2W«†uÏ ãÿRù0º5¹yAHœšÀ¡ò އ6æ…sÍðBÒòB›¼*Ԗ7GNÊ ÚõûððQ^¸ ´°MKßB<ä…zÚÐ~-MÐÕbºÀöäÝXk%0ìåˆòTNQ÷'‰º RF7»›dQ +)ÖÄ¥"‰ÝׂjŠeurψH¿%ø߅‘ña»âÐ$nAäI¯]h1µ÷ Œ¡ì “  í‚϶Ĥ ­wÁÜì`YrADúW†taꉚ]…v»øM¹&$­YÌÕËýy¶.x8|vº„:VÚ´.@`鿖ônv‘rònjÏŠè"8qL¤¡&tKS8è“]l5™½-àýa<.ÊQ טH¤tÝ葘·íÁ•ê"ˆÂJØZ³Ø ”º€6˜ª*Bˆ .ÄðEU¤Íôn‹òõ׎+Ddºðí™çêyµˆs.x7éb_wk³»«H¦Á’åEJ]p¤ ¸ÄEh¶zÑ;\}õ¬'‹“}æÈYû¯ÀÑÈÅþÉ\̦˜àþ*òç1 æ?.È¥Ò«ùW±Åätø\.V®Ž¡µœÙ: p~#]”€ô~iè2Dlœ Þðõ-öÜõüßï•i8xü-Zg›ÌXøÐ%^‹šeå…4Ø#)_mŸDhÙp¢©Ä»Æ­ªI.åϓ0Ñ3˜ž‹*³:=ae„%ÁÀ¤ü7¿uH1 °ëy´K.ب¾Kn±¿pÀfŠ\p‹ «Å¢ÁàŠpñ†$™ä +]7ÈE¿aÑö‡Ñ—“ÄQçV˜õZTõ¸ÀMN҉tÑsÔäŠÝq/ çå+nÍq j²Vxã"ÈpÒ÷¾† "ɗ*Q4°+;SDàB¸—\ÙAŠ:âB„'˜nMIö·Ð-Ö.˜ÒOÊ¥lÃÅDá\EîÔQ,Þ •eõqS#\Ԍ-²{•³”Ó&Çî-&ŒÏ-Ö82»o<7¸Ú H™ÿddAÓjAJD·C‹«|~俋ŠEf“M,„@´¿ýµxf"ÿ-Z7ۅ +·HÑ_ÉqŒÄmû[ ºêÇ%n’žMX3é%âS·XÔ°ø{%ÖÉÜ¿zPë-î43Ø\„8oÁ ¤V9‹R ÄÂ<Èßì³"Ñ ú m e™ ‡Õa[Ķ„ì­ñbØ×uòå¼Pl& å´Å8IøRú–¦-¨s¸Å¶ÔUí†àMG ªÌ…“)Tµç]Íbnu…uÿ›¿q€ŠÔ‚‡u~•¹¶!SU»«³-°8Ul ÝƐjê©-ˆwià»ôÓQŸ5Í®o+m!ªµx2l6S¯£y´yMb ¢Gí3,†aj4“Æè‰0$f¶¨E:I?ð»lAfâåE×"Œ 3µ<‘-"Í „'Ž˜Tc jU햊|±EX¨¯Ž[ ¢¼xB¸Àf½Z9²[-Fרëk¡Í4‘¨¶ æ»þ[‹ᎉ^ÇRǂô­‚h5-RÞ®ã±Ñjlƒl kèüEªèÐÁzƒŽ÷Ò9-¸9ò°ԏgWӂü„ª»_В+8„—…ˆXl‰ô®ÀW—Åÿ€¬Á"ubs,ÿû&eœ—ŸVÔ Ä?‡°9ó×®ä +٘HpL p-V•wÊôìoiA¬÷c"‰§´@`F—[†‡ÅϾ ˆï8»ð5ô§ŒÈœZ ûöpG ¯¿l{¤AÙ4Z؏ïäÀ,T$îþØÆ,–â¿dHHQŸC´èG©‘>ž´° Ÿöz+heÐÝgÑ;SêAûÙÀb¶Ú>חvÐ +šÜîaôšÝ=?ÝeQèAÀèçPûzí, !P}Hð÷›µœ¨RtâfªÓÂ8=.†âq']½éPçƧøfQíÄUjRè)%âE¬¶¹,W§’‚¡PĹ,–ÌuI³Oó™E:€€%ukft]¦+‹ŸyuDì=`’Y°Ò+LK,èÿåÞáVDTƊÝèGtúÀüÌÈá)®á›NÏçŒ~ÇBâ}¿˜Cø\?Ë<Ýs,*¸þQ‹!«ÅvE…“яt»RNÎÀZÉSÄ+ÄgyŒ…Žc1n묳¤±+{ÿíêbr#;£Åeg4BÔ­ð𠭒=^9¦Y/Ä$ƒ‘ÿ‹¥v‰»+:÷뱯Lµ"*í©O\×ú ÍÊ9g ‹X:¼µN1Ç°Ø6å ›Õp–¹2g xqižîƒÄòB›ŠÕ"®ô¥÷:«ÀF',èäbœBë\gf‹ÂøBA±DŒ—­B1€@B«¶ ÒO˜ÛЌŽÆ›{Æ=—·@Ô#Û,åÌJ[à4H/ÅÖ `±2¯°k j*4ñf*¬uúÉ,^A^u­~@d±†<µê$KŽ#n&H^ÁÛ©wp?υ?ê6̇à +Âßjo¥"ý¾a*Z*²[¹ºí[gU¶EoëŠÑ†;Ì @Ö]X]©+¤é {`è +[†ˆI‡ù\a:krá§õ;WÈ+H´VÌP¡±B†5±OW¸cªˆÖáYQäÁÁ }ù‘l"WÐRq‡A4(ìžÉÑÎìA C‰(¬0Ö{ÑHöV[‘—X]ZEõ¡Æ븈ÖBŠ  ŠÕ¢B!h_ê“$NÖDoô‰/½`7$Póÿ®0<½5³—1û[q0…ŽSØ2Ú·bû{Š±Dž)žŠÈ`ËÐÛVÈÝ|q¬­hÛ)«í@Ú +ÆóɊj½ƒNÍ rÀÙ +àUªìs˜M¯lEJDu×ÏíZ18¡îîÖ +y‚t:]­Ðb”ºûxœÕ[©Ê£—=¢ù´Bû„C‡iZa!/]âÑ +Ðp9½2Ôߚ ¬¸ngc›5^´’5C+æg€Ùéß® J}Šñ¹ á±=ElíRE­¬,Y³BÿÔ‰dcɉ•°®úŠÑĬs’ÞUԕ%Í3&ûbô>‡øcµWÅöLùWQvœäCu«~_*j€*fÞ+™‹liv+ÑVhßGyl&fmŠ~PèQå¥ÂRçQÌo“Á, +ªÓñ&ÌE÷k¶ + Æ}9Ü{¾Š–M*‹îųÑÌl\ɦ«Ø|›b[ Žhø"‡U”X 3Ínòƨ.o®Še*¤ÊWa®ªUpȐDú¤^Uè…-df( +¹ëîøȉ~øÿL‘«CÍÛ@LVT»{G±ÈcƺõU¬¢]/XE^4p°Ši¹>5ùßt¡_$Þµb?^¡¯‡tÞWÒ²“ |Q…ÕH×oöPq›£_?!B…ñû€hMþT´Ên V*|æßiýLÎxÔmªè•’e“*JS?ôå^ÜCºî÷ì9'àµ.ÞTTè S*¾C¹Pá"5Z7Wse šÂ!k˜kI +1À%û  +“²Äûü'˜)ÁœŽ‚ ©˜ã—aíC÷¥0<|ELEä!BPQ„ÐÔ§‚ø Ÿ¢˜"Þ`2QË"NQj©!<{C\D(rf‰Ø ºzÉ)N‚c’É£‚ÿßdð)ÌFP!mP*2 å{ +¢ßÉÛTpD‘z‚0${ +Ì°(ì×Çm¡ +ö£78þÖBÓ:š7©³(˜ˆÔšÂEô–äÏžÂïdÄþ~âã¡"éûè jwBK¸ñç–%*»Tte-{uõ3st_¼ô£”Ù àwùÔì“ +q5© 8˒ +Rn-A©ÐqÛ´¤ -œ÷Tð<.‡¸ŒÈ÷ œAÅ6~ûxØÒ2t>W»b gPƒDö2Œ¨Ì©13@÷ù>TÐJ~»ÊA@Û ƒðø_览Öà3_X7È&`ǧ¨Ô‰kPÁž®Ù_Å="QðÄO€ +Ú<ˆi¡&»S¤_1á»ì’gŽqô•ÂLÒNŒÂe[Ü¢9ðhìušRí)± p¿[þh鏞£‰ tnN!xÀ͈Îäˆ;’e‚|œ‚¾ËÚÈg*|´á¾Å(ÝÑikoŠì͸/;5&I"÷)˜ìm +À:(ˆ©]›¢°Ë`ų)8¼Á~LùŒ þŠ—H ÉŠç÷.ÏòdQ*f«þ·>*ÝØM)ñ禨Ðج£æRÈsºzŠCh7'× Q‡øk°upb +$ ¶í:S4—ÊJP[ +SÜ3bÅÃi†à­3Q„•î tXŠ2îÆÏÌ嫑XþÎfßrFú¬—ý#jG›­<ìdg)ø[e\c)œ°Ð4Ñîñ+EiQ/‹r„ZëÛëP(hã…þ‘ó'Ù¿€¡°é‰dn¶§RèF!5́¬…]6UðS +á5Fx{•`` ¸®q)Å]€]å3ª¢¤às—„µ”µO.‘:;)Fñûš?b/¬£~+¿I±}BÅ -æ· +ý1%#88éépj5ŠÝª‡2ŠcØiàOf×,6ÊøðŸë±Y#K´ú|•…³@æ…t@+ÓÚO¬÷D÷ÂãËÓGGDÁýZá4ýȑEv·$ö‘] Aƒú ¢XOÜqñ#m%ͧ„Ì©ÏOdçõ ݋ïÿkƗÎȉÆrQ0ÂÆV1’[\´¶6Âòµ(¡ #¢áLJYŽ8¸Á¥ý¡Àdb!{)Šc<Ÿðô,þ¬j‘5OµjB;Œ™ŸF.é:.Š¿ÛW¶qÿõ³%Ü‚Nh%Ý Šro€Ø‹(Ì'©¸“$·É¼tó9ý=Dñ̽ðU¯‘ƒ²Ý^pAÓ8Gt&øq¨^«CËÎ*Ÿ šíñíAӛJ/û{õ¼€™ Âõïjš4PŠñˆ\ôÚòÊ€¶Çè×*]ÓAýBÁê9{†ÖA!zYêA1O”>„ÉIÉ +µ¿™¾#EcŠ™ßXU*áß+ˆ™‰ƒ +ÌIÿûâîÓ0k +'‰Þ×­¤ù°¸D8|éª)½ã¶˜Â‹e†¢OB;=¦OèÊá.©ö³¨¦EöjƒDrÍ-†»ÀDž‡0Òi›ƒ×ìH@à ³–ÉŠT Š”T |Ð3¬s>›*®,ñô¦Á8 ëÐqþË#ÍÐd…Îšfd3I½C£Õn d‡ZY% ˆ§ByG ;oÕø ŸCãÃꇾcôëVçCWöF¤‘7ª½í}ŽÝb›Iú™„©±7mÿú:¶jÃ'Î3‘&¸ímˆ?±­/²ñ ì „Ã¼Ÿ ÊF6O:›s¡» ¶žøíFŒ¢N+R{×Ohl“J‚„AS¸á(i¢‘á{ÊÆ LOæBH[Ü!Î)e¸Ç¥Bõ‰ÇY”ÕèV¢ª4Þçª „ï :*ãò‰ö(XA I=±AÈOPCCKœÂ^_Æã̤3;+zÓâÜ+˜Ç¶ÛE +9PhÑü‚¾E {K힠ù„–R{NÐ^*,4vÏæ‰>NhÄ;w4iw{‚ÄÙy”•9&`êl—@Տ:Ñë õÖ +Áh›L¨Y=¡›iX"œSOÀ:Òg<"jÂCª‡ŽïîÔ t¾y£Ó³œüþÛZþY€Ë7y.Oˆí¹|øÊì–åî‚çÌX‡£EÖÚ)òÄJßúeʍ'†uaàÁ„íi,Þxœž‰)½A! m ©>«jÇA9!ØH2üV~o„œ—™ŽjŸÆâei'ˆ·}"†M†Nla^tØ ÝÍúSTH׉…ªºp"’dX'8=´Ã9¢ðU'P«´P왈£N Ü:¡JobQFʉ%,=å„@L³[ž„p`8a§>+{üoW„9°ŠW¥ð»6G¤˜ò¦/« ¼dyCM}3_N°¿gŽÒ¥.XNÌݲ™Í’½²1rⴔ‘*,÷?– +9¡í’©M;ü8Q˜Ò†!¦M™î8q.~§Ïäd¶åeœxM2Ú44g0нT5$Ý À6aíÕëõŽ­9¹âDBÂ!Z0 X¢M‡¥~¾ÈÂE]ÔSé6XUFtô p"ómy6)ö,†óßIJçÓÎúÍ.C®Âáéó>ã'¦wò½‰‹Ã®7.ùóìqâ1oBŸU}Œšôn_ÞM¤“ KŒÄÆǟ'ÏÜÿŠlêÌ*çi/%Ý51ôÊ%‰ÿÉAwx32hî‹P êpŸX“_9ÚDyjë’ÅQ»gþW3“B™Ð1\VÀƒ ³²›àÖéÝËl2,¶Ýñëú×c»zðÝÜô¨U™!ø*n‰^»&lÁ žå>WAŽÙôðP +,÷²ÏBÚOæ¤PoM´ù%öw& „€aÕ1QD$ðFJÃ`³Jxž ¾š(DO:#k5a'5ºÆfºj¢'UèöZª‰ªöIáà™äP ¥R-K$˜ñē@ [^¯É`œÏ$¤ø†j…_HP röšS¢fšØLC1å±/Ml¿±_¥‰R‡® +4Ñ7UåN÷B¤ î¨8÷ŠìM웧Cڍ}e¥M¬Zí‹Gi˜ ڋ&X©Ô}'š`å2AQÙ¡ •ç k-‹Š%F šX%»2‡h^5 º@¡Ti›-Âÿ¡B]ôZpF86E˜m™ø&øê;Þcâ_©ÄÚàä¡Êýi"O¶g‚{–fCKÒè/ç™x»c櫉ąØ ²,¾Ô™¢Xšé¯tÌ‚ˆãsÈÅQtTŒÁ1Þi„™ˆeæ8íÖÆ_&˜bmLE¬\›°™ƒ¥lÑD¸6&ê˶òÆWŽàÙl+–¯«Lؼ\ÈMñé…`˜ÊNšp¡´8PáÉ<-Û(…++öž^4W¸ƒ36#P=A‘Vþ—‰æxž¦ûÒ³ þ#^ 5ú¨Â—ôŒ 6]£¿bF˜0úøba»ŽåGVX»Ù¿z_ƒ³¥»aZs‡ AíÕê»ä%”3¨7LT©‰›y{¼5ǃù]/L°ÿгÆñϺˆ'Ù¼¿´‡o™³M˜® q%®m"LŒîØn.?˜‰E¤ÁDËÀK~ã4ºÿmâÉu3¾øþ|ë]¡òRa÷KŒ>òKìE¥àÁ’XÅ&VR9Jï%ü^96d#„øN¯½Z°Y¯Ô-¶‡Hø ƒYdBz FžË=Gó’bbìr>2ºëˆäÚhÑh¨NÒm¼jîãá%|Ÿi\ñxˆïÁRâìetÝ%P“£kš´ŒŽ2»·KdÙ%hïA¯BýJ–Gí¢"B¹¶»ž¸`-n?mvËûÝÐËmcK[\b)í%³‹ÓÎ>.Q,4±>p—èß@uj|å ú-¡¼íÇã°¥¨}o‰WáX¦ Oà7^Ä<.å–`•“ùV fjKTËä(RKÔg) Õ¶¿Ïš§%FÔ*-¡a‰,j…FK°P"MÔ +äŽ<&×:K@2ôCYښÌãv5x®ÛLê=ÙSÄsY"'HJ¬q6Ñd7€Ó±¢id ºæõí"ø¡oû¸à¦ ÿJ ¨4C-tÌ¢ÈyûJ@ÚPÕ Aò‰—vV ’_U@Wúä +Á"T\‰l|>ÖEØcÀco%Ðâl+Q @•”â%˜ºY×"År­Ä>­¥=’€{=‚J%!°zyVbµ¶JÌN‰×¼ð[S(%šw}¾ ÐôŸÀx¬Dz~ÞPçP•n¯(s£¤Ï\+ ÁaCŸJèÓ*–£à+Æ$³Rbä™CFǤXÄU—"ùQ 3jc(Ð)ÁܼghÞdpý§£e aÐéÙ°ë)fó°%‚Qž[ÏsιF(€ðÄÉ! ÷°A•2…X„›:»Èu2Q%%H‡úÂ|‡ æñH ·2ˆ¡†AVd”X F®ß˜´¥Ni†zóøE ŒPQB{’%耱égvKÜE”èó—ªÚ,¢Œ´žoOn(¡·TšqgL9ÏçúUå{ƒÆЕI ¿‹sÛ!:˜P‚KÃÈq2 4%rB Êì“h›aò‘H Àµù$º©ˆŸ·3ýƒÞ“п¨ÓÚՓØГ%€Aîy©¤× ÍZ<‰¤·hr‹@_/V!úw4;âÌa6yt\E¡Ö:‰„½"jŠ°ÓIÖv.ÓØ£¤h ÁsG G%¢ˆ¢¡ÂFé€u¿ÁÃ6L“¨!¾±œ*xƒ ç… sñ­„Ÿ;ñË$ôüŠöEzùM i0º©$ ªÅŸ;î%}%>&QM’ô ñ*HÙ …CöFàš8˜.OHH1¦ÏsOë9öÎïߞûo;~KHðTL·-é#$VªL7lo¨1âÀ„æ ¤¨øR¹GÀðq¶Â~”…ÿ$rLñת +´ “;Ac^àªýµ2¾‚„Nôyü"†Í ù£XiDf(r B$6ŽÈdòV ‰§Äë=2$ö½É¹cP{F|MšýEÄ;Pç6žçhMª”cð•fï#J× vžÛˆ*Úç+g™+ÚøžX>DM—‘©ìtú +ܐwœˆQ(+t¶[qúK‰Ûué ùŒ9ùló¼ƒÒÐ-P!«ƒ |qéQõe‚Åjø˞öµÑ­ƒc¹¨äA1s y=¬µ/ƒ2^?Çäʨ\f({-”ÖV±l¨YeÁ̶{ïÏ(Ð J—"åï#ÏÐú”c ìbKm°¶¡œuþ%Y£CEqŸý®Ê'‚…Q÷‰ ֊ [SÙû“¬k”Nsï@×÷Úä dÉ1Pà 0do–"Óˆ*¦£› ԋw‹"’ÕT63Õ98{Ðæ̨¤Ô+w «3M\+ LúTŸ¥†Í™Öcý!|˜xœ&ÃI‡5¼$þtŠ–jrãš#w¶"-ê+d$;,ß¹'5Ýô^bKÃÑE ¾~+ï6¿Æt¾Þßl ¨9ÂÛԔÓTô/N䭚?¼ ¼Ÿž(®‰f°Ü…†sjGã©ý ‚5Y­&}(ÚX—t*™„jæ +"^`/tÑðQ0Ñ쬥‹´$´î@:ît‘ ÛfÕ w#Åãäãmæ·ö¯•;_„o¯p û¬:WY끭d +Uo±1¼ úBÈK/r,¢ŸWB°îô|ǚ þ@ïd Åè7³Vü‡Ÿa«›„]ø·BÆ ÈôûÜ5wù¬pRIZ‰-º3ñw˜.|;ïV‡‘¯¾ÊU QîÙÏجá‘ýGë £æ͌EgR6°jbgôÿ¾Ôº ¥èÙ]ŽXê2¹–zª¤L)¥ß¼õzׅ0Ú%ò ;’¢/£ ÿ› a¢ 0W +1s-³Û’›Ÿ0a·íMºâÑY0aÁzÈë¦Ü@})DæÁ´ÿ+d`š„ nØ`X†§õ…8‰8xnԀ÷oÍ=½ hp·ËCj5b΄Б¢ÛÎ Ç + S‹è¦dáR^ō¿ýb~w~rê U1BuWa ¬·ò%,x«ò²Gì×ðòø©¾P×\µV>Չ‘ˆì-uJfš”¨¢õ© +r:óéœÃ&J?È$„0څÅWBпϳYÞUü ú¸ÃW‹§7 •°¦g"Á½%Ç ÒÕ e`Ð•ò®¹ŸzOQA=È{ÑÞ{…öø}£|ŽEt‡l´ù –´U«*–r؜B=J½’T€æígøúéÍyu¹bßVMnY@"'âg†hn‘HƒÑA‚s‡0Ô°Îù¦ÆÜyÑ£ÎóvhTfí;i¨ @ó撌‰û +§€U|ëË6© –¶åÜ&0¤so :|D,y*N¡4K½ÔÁL‡wÏX"¡‘¶Î‡nÂ®ðˆèP¿Ê\öBFT%Z•5H¿a#~õœ§!&õ ÍK PO=Ž¤°–8;ô@Ç¿ú¿,ˆ]}:.™ÕñN݁´<ÐLª:CØÝþ¿‹¸å`,%åØCì†tH<¬§$êM1ã+±}ìÁ•O›“¾=©_Òƒ_féÌ<µC… d;(£*ÐSÅúäƒ5Ål÷É—Ö"4!úEH¶³ÚZºùŽ†4þÕø >ªkéç8 XÀ0K±ñ‰dÝ%{måÌÿ¾–_SKݧ˜.K.š^7E½•‰Ç]Ú&å¨N×rÊ¡­šÒ,PêIy)}0W`‡Èñ{eíÉl¥ ÕÊÁb8p'ˆÞ2ûH}â^,d”(ª¹ “ì¾áeà ËL= Е O–†Ÿ¿q‹Ï(Æå#CÍ ¹©œŠ¹aKHÍ®wòå Œì·æ!3àíxÉ$[±ß)s„9Á Æ—Ó»¬×7¼h—ê˄7ä î!>†‡È™±'WÞü‹8–µNI1DèbD¿ JáÆÐ5Ö1§rêµ#“Ž1Îþñ¸Ä©¡F$ý¤³Õ•?V­PW|)‡œá=K½ª*#°Ü‰B<0N†Æ@¬@B³YÆ%á$A“jH­k›)¨:J 69óق€D⃵˜?*ŒB4â6N"Ï"\dä +·’¦ˆŸ3âÿ¹Ii€š¸‘‹ZèkÁ«ŠÏË¿±8à1\hóϗ¼-I]GŸÓAq»«2I‘¿M0œ}Ÿ|\æÈח¤¦f<5Q›¨ý¢êTV¯ÛÌuª|*I •2\æ›ƯH¡Œú³ ŠÐÜlåH6 B„ÐP¤,̾ÁbCJ„ØÔ ZÔµå^ƒ±_D9Çè3¥bÈ £HÜ„\&n™tGÆ4žÙÄe<›ýêþiƒ!fïEdzÓ@D,)™!c3%#3£i K¨„·Sp¢€HŠ…ò1 æz&" +–Xh„” tHK¤Q’ƒ` B +Cœeöຠ+¹v,­õ”ÑщQ¢¼‘~—Õ{â??ÜkNYgèJ(ÜʍÁ<ñ܍=¯*ÈÈ&Õnx¤8†éeni€ÛH˜6@ÁvâŸâP7õøoR"KX|¼“kYéÝîö•Œñ-é‰x¨Ê€ +ÛÆcÞ—sÅP,EùỞے»µ|ÓbNƒõϬЁ­P/Ivï“É‚:œ៌‰-þëmúõZ”“/Á(ïAþH ]¨ÂZb’Ác Zú &0ìU>pòø5W?qÉâ¹Q¯®{~ëT€Ž·Ðö[utÉ=þ7¦úÿï”ýLVÔ%}¯õƒr¥ ˄ì¿éÌ£È˕ú3ü£À +tó?ô¾CÈ åM—)˜¥´¬¹qd5 NºÃ0´ðꉩúe`»";&Q„¥gg\›@6n֚´äTðíóÇèºÓ$¡®Ð)ÛvÝ|§~¶6»%/«º xvÜ€õÔ¥^,2§Y¢êαŽ|—æ-8¥±'¬³Vûó®dœ›%USIFˆ†`ëàõ0¸‚˜˜0uâù}¤zW¢ÃÓ-|t‡ AÎKž3÷U é¡·‡Ì û7’»—§ÁÂxðî»ôÈáÊÂÙo5ÒcHE2š˜¢¿yYZdfØÙÜ c‰‰»ÒW(†J0Ûæö~gL„G©j÷n>& +öJ^ ÜF qÈa Ct íÛo yØàs–ˆ +€Û ˜=Cëig1iH6†£ Åh"õ†ÍY{.Êý5 Ê21ßÁùaœŠ¹ùދ‚›?9¹‡!É¡fÄ@,Úã,)ÉÖfåÐÇÍ9"½ÆðùåL›Á£/d)¶ËyY®âi¨ÊÊGCÈyÜgˆ<1‚§ ޘýyKñÖޒ›‹‡qP4}Vm'Ž ^âeÑ-¿k#f0F ´°e›L nV2«xÃ{k 2¦[ ä$ã­üÕÖ Ài˜H%©-mô÷ÝÒêÐØiprb,ÊPð¹…8S++šm¡ÄÔ4w¸÷¿§`½6 æ¢8!íÄ´s„B$ð ¬3ç@¡èÒVÈZ@œ—@0ØÚB]žH'À!ՓKÁ60:¯Bkƒ"èL8ãçܔ#…Yýõz'öӈæü^(çÿ6"<”BÎ\XgvÚ$¿j_RÿîÞS/Š”¢ˆG42Aª î*¾•–’<#uœÙ4úã® Bq,d®6ðÐ*œwbõ§~—Ô½ó U㻬2¶®Vc´Â¹¡*G›žÀ•ÎòšUàeНgÐ"L¯÷=’$Î'à-§›"#/Vɼ0æö2$ŸIç$zPôš¸9‡[Äݘpx¼‘—F¸ì VRÐj^ÍÔuóìè? l`±S8őiž¡%oü=Ø ý…ŠJnñÎÞXÈCBZ®coè9 ™F ØgbðòZš›6q¦TƒÜ¿L‘a5 Gä£Fð¼±ÿ9NCD/±r‚¯ýÅ(ú«Ž'Ÿ@}@ª—@Á‡žË` ,‰+”eäH¿Énè·³‚£;— ³4´5•·§Akw.?Éλ‹+Éþˆôj» tµXÅ;@1ÕY™¬—áP‘ΕÉՍ»<-‡y=@¿´ð|uVª{’@†YîÔóg ÷ôj® õÉ.ÀŽ¨ÿyKbóI{sÝ4[Ä1 –{)ÑçéuZý¢,èћûô&ÓêÅu´ͳ}Ϥx[ax;3~ €“—ø.X̐ܐF†Úµ9³v…ÜXŠæz‹ô¸ø”p>üwÎèåáWì¨qOƒ:“m§r3¥œA[‚8,µãû§˜dÓëùLð +‚ŸÀ•UÌeD¡aö^|F3˜rCsx¬ëöAÅFöwæD).%î2¸@X W7üŒiA€ˆ´B Ô—äk½PO(MrÁŒ ¨™aU $lå© #-0 l£1½æ­°åÞþÇ I¾ƒP„à#H"7¡·¢k3vQ‚&Ì÷Þ췓zü¹D»üqÒø‘q{4ºm_f* Ø +‚·˜vŽê›Ó€§²Ž”5 „«p/lÓ„Л˜ʈ÷Y•ß1·t£¥ÁEd+}g,2 ]‰n[D/jŽFd éÈü¥'gJz¶}@ÍB_ö[…¦ŽóžÛ®ú‰î*¬µeø€ûï Ÿ¨^ B‘XW*ðDEÒañ jÄ (¸ ÈÂú5ÓV‘T¬©q†(i; ÁÑ\ó·'»®¹žA2UD™4$.QP²ûÀÆ,ªeÁ ‹5¦Ê!‚\ ßñÛcZ˜ËËYØÎPR w$DÈ<¿©-S’íƒà®¬Óad$çà¥¨gA@'S8ç_Ý`h³ã3h‚Î:ÉjÃ…<º‚÷ˆ«´©âøo_?™»`÷<¶|aÀèÃPî?{b5/2¤÷ƒvMbb¯Œi"éaDø²ƒ~Š9€~È%Ñ!†¡™JÁ/"Ÿné*Õ +†ª7†.)a—Ñ`p%y“2KՅ!¯5ó¥ ƒ0r0Ž0u&S>š O‘/saàIm~=ÖoÅý±'KðñëæŽWIçInaˆ/Os[Ä'g8°¼iÛçü…C{˜ÇJ¦‰,º/aˆõÌ‚RnØJÓ@çÚ§IØd r¸&¨uÃýq¶VQŒÙ`l endstream endobj 124 0 obj <>stream +™DÄûŠAøçPŸ?YCÔçfæ·Q ÀÚæ*¶Àb¨;‘ˆ‚øwò MŸ…e'Z2pkcç¸;¤ú X@„å‚U>#¿yþAºI :e7ÄFb){0@çJ»ÏˆBÿ_,F«–‘ÿ‘¨Óú€…_W×$cŸþûuNí>Ö:ò™Ù«u Ùœ\[õÇëÒå ?Ÿ'O5{ׄŒæO™†g:Ÿ²mTøQèS ŸÂ÷ìûÂQgœ}6ùdƒä# ½v¡ 8?¯›ž«),åç yÙ ?g¥'-ñ©ñ#ìâgå鿄ž%T/à‡«™‹ïÃñôîiH¼„ï5u<!vif²•K|Ô© ø8ØVˆ„<¡Kìt¦œ®ø: hI7šÎ(]'—ü£Ò`¿±£rƒ­ƒŸØÏaçØ Ó+ÄwpgÑA§—ï-èüP†ÅŒì„ÇÈæGUHááöõòÔQ?ˆX+èö’0¥C“#~„t ”ò‚òAÚÞÒùˆ +™síi8t l<᷍žq7€Ã~@%VŒi-*azøt&Ë9àЏÆU(”Ãy´Utx•´ÄªcrLףֈ£eYғ0sPp¤s’‡Û·"Åé¹BõР—ÃáMŠ>Çþ¿¢êGÕrŒ"I=Ž†vôí^6Ô“#W$ž@ËPšÕ(ŽI¢Ø^±bÐê­ä.‡pué 6¤tÀôãZ8Bò(ؤº8DAãܒj’Y¡©¶ðÍ)ëÓ*U\ý«FqÞHtÌÏ¿a⼋‰†5%ôpž±¥ñ ‰2À°í¼Ã›zÃâKŽ7ôoHÀo¸ 4d7 ÓÍl@fÈôdÁ¤2ì‚eÖaŽF)=Š¹¬ ³]ûæî{d…ëvphUÔ¬#1'˜Œ™ÁnèAÃWp–!Mnь6éJÖ:òðt3ƒ–ëÏÛå™!:*!™@“£"ћk+?;ˆ"֜ƒ›¸ñ˜y¡F¹Í2‚aᅻªãÝ6Ñ•s*êæ1üqõXÖO %8aBî(;XÞÍF‚´×‡ !ñRsiojÇ6…Ü°ã¢`ã•Sc€cêõT7O7Þ¦ê¿SZ¸z@è@Gí½æÙ` Ôð?p£“Fí-nc-O¨Dò·gÆëšôµŒñý»#*ólªwÀê:¦Mýá3´ásc–h“xhÞÃ2Ú +–AÛ¬‡£wÎÌ)‹¦%±BoÍÔ³  zâØ ZõáíY“âGlÀ!´úiØtEñ&lhþçgÉè~5D:-ñeã"9úÄ™VpiÙâÎsKÀ$¢qš"Ãng¡=é;æD5ß'3 åDæâ…C»®„×aã‰BŽ¸`j(<Éó)Œ·ðس¥lºÎ.ôf ß7šBê"kÜ4¾†Vc F´NdsGìTÓxefEŒ%¢´¶G¿»!Ï*ÍdŒSP¤#Æ÷.€Ô˜Ïš&Ñ5˜ÇwèI*JŸÆ匀yšæ[Fãà™_ÒiÈ+Àg¾®¦Í–‘IœyY²¬Ö'å£Ù¢¨ çè +?Â. ‹Æ Ž¦,'§LÓz™c ©Òü«LÂé@iø²ž½PÉ{v™¾Knþ¼ÚÀ~M+]ÑmfuzaÿÆÑøØÿ8w¤?.ŽÑëþ‚Íë=IGÍêA @Y¢aôäÅ !s‡&Qr2xt:pQgÅÇ÷YÜÌ\¦K‚×J«ށ·°ûgÒ ›‚)† +È@˜^ãÇ`Øt"q}#RËárOf˜_PpßnÌ.Ó¡=³ÔbÅD¹|}¶ç@P‰˜D_d ÒxÐóèÊy»§"–Žö°*ä+Î0+>èÞl ¬L]ÅÛè@]¼Æ04´%߇ƒu31"Óž¯§@ Œj fñ“;dú1TÈ}UQŠ¥a8Øù¥b±t$ºOS¼wŽ€ä1 CߑœÃA¢Þ 0ð!3]jQR9Ú¶o8àiüßQèÙú/Ÿ£Ø…lîÍÁ, ÕÁP”=Lfå¥hq[ýb~ªþŒ6ÞtÕ*0©hªF`0¦ ]ÒB½\ œ_˜UÔ¾@õ -Váƒ&7ÉÂÅ©³_8>¢¢’~e‚¤^Äe5G]†_& \Ý྇ƾ<ê?D‚}AèU¡´ Kò2„Nä Wv¨è¬ +ô|B¾öQµ»u[¹o•Ï3võü„ù Åö–’ä˜gbhg´”ƒ,”‚Ó§«CÀѯDÅc¦–«=_\;#ÜO‹Å29J¤Üh¦’ê£È€*|.öF‚Š?È[Ë$Ð厙Hù½ƒ û'cõ0Çßþ×_C²ÿ_ˆøÏäV§ÉÑvUYÆ¡“êA©Ä`\(ZÒwWAˆvæâ Ê{’Ng¬B¹µÖŽúj »`K9Æ¢–tã´\K(sÿ 3uÃ)ÛÉB®%QN N1GGR`…Ó1P¿ÁZ“Rõ®ï—piÁF!ěï‰PM23Çpwθ\ygƒr¬Þ”'€G­ŽøjAX]Vۛ&ð¿L’ãõc \ Ø=~££â€4ˆJã+!$$ºÈ¦b©œéndl ƒkì’üÈÍÆANÌÛ)ÍמÍ×Ø ƒ ÈE7Rç…ê +øZ㌢ǠÕÒµÉ$ôøñeTç#+¯ái4¾nÔlÝsÛ¢k:iŠ¥û*–ÈhÞ=o‡ØE- +ÍÌæz›÷ËöNز~^× ¼E{ø -ǽÍFåzÍ©„ƒ#9ûÙ³#mÞ”tÏ^¤MâВÿ7|X°K¤½¬ ’ ø`HÝü¨a1(ü'æwITñ%ž‡ˆô]k×HÑ¿Ñg9Ze–âáh!¬§ÕËc^ËZÃÞoØ,`|Äí7ÑÕä-1äq"|no»ªâÌì]Ւó)eæž“,a)Awºb›î‚¸Y¥Ëu}¸$Z +±a€o±òß €¿€éxÐLp&‚ ì`E=%Á˜êv-CW{y#%· ôGò¨ŽàêAXÜ'ºšFÐÄ^ÂO`¿‡”q´¹¨ÒMûš‘Xá»ÂЁ×c­œáÉ,lBy&Àƒ, „ï­½5­ +AÈHe‹ qˆæø€1S1É ’Í„4FÿL y:-ÃéU†3BÁ9<•†;yƒw›·QéÆ× Á:Ç¥wæÃO÷Žñ+‹'Œ/†ä7¿ô# L*Ґ@—í¿§•Á¤yŽŒõÅ!1w ߢrdd¦Â”M+äQ&•ŸÆ’"Éáâè s† +t_ry^¤(i7¨Jcc,WŠHºBÔðhY´#ˆ4ï8&òãõtbˆfW"ÖtºÁ´„¿ž§ýZ=…èk·¬bSš5¡‹’Ë$hT„Àc'gØÃÎòÕ2囑‰¤A†ŽXŒi9g3.ÜŽ*…¼t€SSpžœøY†Èeè.!*ªPˆ/ Ì;o1³º¥J9 +˜™4•¹ã°N‹Ã öVaRfŸe˜ê„sº,ÄýV¿³Í;ÞõmÖÿ”ˆü°U¦&Ùߦ!õ0{d©qÀï½/^›F8 ?‡Ë“µ`§ˆ!A’v¬²S¢„»‡Fün!8¢Ú?øÝÓuܧYøb¬<8Y'ÚhÒÁ©÷ÚÈ«Ö·;ז?ÍŒQç,6Ÿ¢vÓåöøeBñõ2z°QÜeà€^l4yËì¦(N:^5úÂ%b çÄEÖy""rÄ%geÁDÇc~’P¤˜Ba›¿òÜ«¯;KI؜eDЛÇPè“(ÉTç›H Õ܉½IÕÂÕ8ÓqBo÷¹ +PâßC\óUVC3QEëåéæ‡À +fœ ¯¶&Ìç5¦´è§[¬WOuVåö—òH¢q©ëHÈÃqAkƒ‡li3[ –ÔHqî²YドªÆØÇGth3×ìÇ#a°€þqÏ])毝p9YÜp²Þ}ºç×'m?6‘­¿Á‰˜¸½³û)$Ô î0g/iØÍ5Yÿ ë]ȦÔëK¼óðœ_·Ùgö¦R/„±2P+·r›|¨r?ëÍ09`Sâ¶àò? fÆùPÅ +d+c։ÕáäÇÐFýHÖãËÌ'UŽjËE¬B· M‡›ƒËDO¯ßýŠAñˆ /TÌÁþ¿0Óß%ÂÊ;ŸÃ_@¹Ï>áð°@ .Ìåˆ$3§ÍpÕ+QDœ 3¬jÙæ[ßÿñ³¼jðV;åó Ò¨!Š›Ì>. ŸïŠ@’ÊÈ @ô–l9¶þ}«’áÐ#a©’™CØ`Ø£´ãG>z•;kó!WøzÆïÁ¶V³¦ SÔÓ Åõ- ¼Z3Rœ€: ¥U3¶1Hq_;—T˜'£tðSwIa;àüí”¦#ÃÉ`C,>’vj`'z¦%\–JôUƒp|Ç ƒ”l_V,Øí§cWééå«^xy‡ú*Bt§Èòx<@‹‡ãû(9au›ïLý1Tý´ÜŒˆú Y÷°Ø4fYëÌYyLïG4*ù˜æŠÐ(‚½ Þµ»‘$+ÛÓ~ÅXyÀŒ¾\Ô¨Ìx4çí[©Ú¶ øh‰RªçR*碿MÅÁ;ÆFLJ&Ä_ g « „èô‘Eâ)üÏ*UÐu€ô=™øJBNÀ™´œ§›å@êä\ðYô\ ¡ƒú·¢ŽwÏ9±Þu9Õ°º4õP‘ão.~§Í +clèwZ'µ’YVMý3\Ya2tÉa‚³šÉüÅU!•ðOfë4åcќ¬~٘¾dýwHê3ñÎÚßÊ×Îbó-¾Y×-ª]_Guè¡íõûuM Á*4a×XÆ®R°Üó¯´QbÔÕ¶O©Éb³’Ç\2.uáæõ4ðê¼ÜqPŒ5#ì3Ág’ESŸAȀ/Rê¤Ù¬1t‘œ_døõgQMÒg­tòíßO0o"—ï‹Ã¶\ï>×ìàí¢ˆŒ’×b%PzF¤ŠpæqÐ)èÀjK•EUg^R‰©7ƒø¯¨ ›Dþj' –Ó ÚKò%9ôY7‹ @cßñ›%@c€z)nˌÞÝ—Š¾ǚ©½u#7µ°|XªÁ<­Æ»ÀÜG­3´> òê5µ£yþ§ì DÌ<ƒ˜Z—%rÀ9{û柬k‚.Rµ7*˜6Œ1Øï/’N…£(R\Am€=ٛǬInUÄ{GDÃÀiaÀѦaÌ_ u`/Yª:wqŸòx}w E˜€JÆpYõØk1p–ÃοÏ0뀖5á^f&MЀ¦ïmöÇxÀÖ­7Zàҟ j ^…Xç È—ŽÀ  o9?e²Ë—ßý8‚ñïYé„t íÐµî ‹‹Gb…F•PûÉìØÙëFà¿%yJ|;ùbÍþS¼ó‹6T°¾‰Ïp¦kêDþ‹+|%k3ÚòûLΟi™`º c3ªoiø3i=Ȭ@i€ÚwQ$^WÞԙñ´Nä­Ì‰¤@Þý߅h°²7á²Ì™2RàÞû¬žPk6›®Öüî£Âåh@`?ªàóT“ØP㩝¶Œ×æv)@ᑉ4|î*m89ýšÀÏ©hu‚Ê(AÙ©f/Fz_'X îçœVý‹]༬ `»}å'¶UD3x»dRßô`Ë{‹©l?S2O*Šû +VhÙgw ƒ@ob<[{üé +ñ(¹m`¸=_ñÐ8Á¢Á °×Ou€™' Û|‰ƒÕ6ÃWR{ø}[d‘LºÅoø¬­Ê¹‘*ç·™zâoÛ¡aY¥1à€À¬žSì>cÙ¬1:—9hT‰‚ðSüb„¿]p¶kBQϲkM}úHKÒÊ\595-h ¾Ö04î +ßOâš´:L q ¨’Pü¶‹ š¨r”)H¼H Ƴ¼Ê Ý#Užþõœ­çsbXû©êñâµ?ص•MUQQJÞ%E,yñ5‚6âêhXnb7üôûIÔS>*!wBZ +«ØTa ä¶w˯®E‚ïÃÞÒ»[ÇÛ)”EV4ÓX5ºêºü®W÷ÓtÍÅ.‘€ßØS|찑#Ùîĉ%ŒNƒv‹­f³Ïj5±ÕP΀«9} ®» +ÁCTãg–ÜŸZ؍/L75 Ÿ_C“®·@ûÑ 52Õc*j²GZùÄ)8½N9ONßCm™.2T5m̘PþÓÌq¼§µÒڋ¶«[7ˆä'§yñL#¿iÙX i9û÷ç§>Ì'MjšJÚi£FèXj×°h­3Ö^¾Ñ|T0;£åæE»×frM…ÓOq™h×éH8ø¤¹Ú4©lhÁÝYùL+än›R¯œÞÚ²h§w53g귘:ŽÞ÷3U˜ƒßgªÏ:·X‚ îqgå£4s×3+v æ#X ™Ù4Ò>.›Ûθ›=xé¬éÅ~ٜ·tÎZû…KE+ˆs?ÎQ|À§ýf¶ÌI7|&»ŒµNÑ̟zvÁã×#óÌè!³{PæÀÃÄÍ̈'gq|™‘Y3=™ÉÅÆìÇÌL¹2.fµª>Ì>ˆ+Ò¼ÄÁ 6ƉŠ™•&+íeŠÂ™3zÝe*Ìĝ˴’‰[vU~¨]DágÒµžêTm +èVSYmY63±A½O.HÙ§,F (ewŠBÁº¶ˆñ‚3$0e e›÷!ã²ic»Íãc)“2ě S£…ÉÄçIzÉ\±âY³ÃÀf˜d^‰EÙÉjM¢(ÿÈÚfJ£FVW~H‰[ÍÕ3O¯çŠ +ý…€)è}ŒUŽ@÷XH‹òUøQŽÞ±ªð«¨ŽÁ>ÅF1å-?:íð˜cñR¾÷nà5Ži|½å»!Îܶ1}vï±]chz”ÆâIˆ¡¨‡ÍýŒ1›F xŒQHÆ ŠÕ¨5q3f Õ5ª=&õ+Š©O é ‹cÏìræ&F‡ùK <³$6ï$ž#F¥ +ÿi@®|Ë—!{pAƒh=?lÕî–É£ê”ÖØs±a\Êg,v€Àà•³[”Æfj-êØ,Òq,R˜ 7”ŠF%û¥Ç~]cÈܐïà”ªÑ7Gk£Š(®õ8›\†à¡3XÉC*BU. ÚæSd¥P‡ät ,võUL!.¸Üwôö¢ª°jµ´€m&BGÚö ގJ£2mã®m ¤’½¨-T×'Ï)¤[8?ݛoÛ¾Ô]ƒ˜C—ààà|ŠëË\V’`Ùn•ÉÓWû¸Àî¾ãrZQø*­p*ùdÒ³¤âÒ_ =ɻבU²´ 3JÝeño˜OH¶§±vöÚ&0ÿzM,¢¿¢Y™€K²+éQrb~ãäÕJÕÇK«ìjñ:¿*bx}–ê¡7É3v¸ƒ×ùÊa³ ÐïÚí¹œÁsuÏ°×]`Ý»¶”ÜîBvQž7w…)'Py»d‹ZRjW8ÝI؉:!.ºa{*.Á'mYbÈR‡RV‹_‚ëÃÍ_QÝb"<=béi[AႧ¡*tÆ\÷eÚ`ü‹»h ²Ý”BRՀ®G Ø ›qVE¼)“Û?D»a’3¦‚apÐ1¾cz=!’ü‡ÐéìÊù·[Ãgæ´üŠÕ[Ò³ï@9.Á] áŠÐUÅrØW¾QrPlé3!Ä D´5߸YKû Uõ–à´2%ün?¨ZPxݳÁ–€kP†÷篚Äã?d>ízÍD “tÙS¢)ñ½muƵœÛFýw`8ŠŠž[‹4.êN‹îB33Kà¢×*DpײX¬då½:k…3qz Š]V{Νf½“œ¤ó~ =¡‚fl,¸ºá^ ¢4¸à¢s‘¸Ēæôžhñ—ópòH}>@Õ¥€3/²>ÿn±ÅΣ‡ÃkpnÞ+×yl««rŒmõÂ6eœ ßåîːêT~°Ù<¸E!BJîÆFTCõÏ`¢­ *4{bþ‡¶¢Z՞©¢ÿ3»ZëÔ>vnØ@XHþAn„Ûh¬«ç$1º¯£p†*ê^-äA%ˆV¹áp¾¥EN¤‡•+À)Bó6 +G"{ÿ‘oÿâ•õ‡˜¶ì”zíˆè 8Yu¢,-š6»eóø }Óâÿ€îà]¼Gµ@Â?¤üž§j3á=ZB_a"™Uçv•)ÿ¯¡–,éýŒÚ¯ÿނ¥tŒœÃÇSG;Jൟ&·°£”§È›KÈ(p9ÏPïÇåûG•Ø¾]4%çÎ#k¶ iª>ѺìÉç ˜Q#dwSðß\׆ Ë8úx¸T0Ñû¡¼1F1‚ʺüÍCþáâÁ>3OõðÞõáÔm‚µiÌò1îÅ[kÂÚÈ[Â}ÿX¸éB…Œ…”OÛvåÉ£RL=ð/Âó8e©8Z=íäÈH=CFa1 Ng\;õŽƒ®e‚¢´C†Uâw ˆ^W¢å×Åk`3ઉêÜ{ |pœ¥œ@.qU—ì¥ì­^aáBöÛtÉ’‚s÷ u›QäÙb< ?VÓ[ò(© +ùCx·¢"—JR± d¥àÄut„s IP¢|MpÂ7¡÷1V¬«´\úё08—¢Ý?D½Û‚1ЏF2[çMâѝùc«Í©>\$k³&OÛê¿Wõ¥¤Tþjþoّ@€ bx’•,î¡ èHD¤ˆ³]i™·„¡#+îìWx:M8ð5ˆ!ÊYñ¥ž!iê/%öCiÈ/çh$`¤Gèý^y4.ø×´‚&c`[qÃûÇ}KÍOVÑ^3Û;¬þƒí˜‹4æ܄‰7®paK”;Ç=´|‡ÅÔLrÚ#TE—‚ƒ™l‰¥u w‚aŽÜÈs£]gÚÉ¡ì®1›{kõ†:ÿ]Ÿû%Î^ÍäÍ +’×7ŒüGdÊ˧‹Å~ ì°Ü‡\:”5ݟ焁 ïL±{Øà3 gâùfÖ¡Êî3 ¾{þÐàÏR?N“Ù•’Á âQ™•0ÆDŸ,y]ìôÆÒÔô;,6!ÉêUûmd~ !ALI,èø´Ë´lß"Æe7`UXE ~Ù¸;`1‡‘ +OšÐÂ?ç‚ ?‡W¼%€z½†À@öî³BÕ¶÷~1RÉ ã•‚åa.>çÆG_AïDá ²ÈÐíN”ÛoLòDBP#¸Áñì1J8Ž€10'i‚ò¸GEQÊË7dïån@gnÚ Þ­w=ÿ½¶|ÒM% ™x;c1Å÷ç”@D/zʋÍ÷CÖõ™;~tA< ®Ðә ÿýl¢âasáXmADñ؃Ü8\*Üâñ/µžlÿÑâїÌ÷äýlÎé6ä‘ã Ôí/É7m˺(²|þüRª,%qc‘Žñ¼cƒK¼q~=K>“„ŠóY][#ð9;¸®0¢—0 å4µºî¿;y­Ûb+f:õ¿ÓD/bƒmM„„§«#@B± ©“«k{Tn9eå?:W ]ày%„ hÏÉ´àè @nú‡»8~­b•†ÑmI{{ãrÙþXJ%´±y‚;3âô>Ԑ­CZÁlΤs„-“Â5÷VâbzùŠ¼´>8áÓ­ù|#)ö?ԆöÖO‹ìˆA†zû$¸$®{äµÄޙ3dŸz4יìuµ4ß'V„&ñlýµõOÁí¢9ʛ\À·aTÀW#Xy + ,9Ë°Z}-ã2%$©/ýW&o¯ã(\键5F4¢Âÿt!…žé\Øö¥\ïŸÎ%3 Ž:0͍"íuý?”Äl !ö¦f?¢m| 0­éÔ¶„Ŧ:#ÔË ‚ Ç&òÒ¿~’€m˜ª4«nˆF. #@€ ÍÀëìå+À-ß)ãÌKV•¸+RƒŽ\í">ùi54,@Xé¨2Öè…Ïp*4@iVV…ÞìFÿâÅ]õ `µæe¼¢ñqšëïnÌHÿÓµPv½‹Ò\Óe`ᎯïEÆÞP +ä/ž¢¦œ¨txóEúäÃZaäÕû&ädòvêLDà ‰i'„mü­xÿÊ1è¦Y©•§[ŽòIŠ”¥Ã» +Æ5¯¼!K†¬y>¦†Rƒ—Tº¾¬v1Âå©" ~@S$Á^[ùu®óÈw'˜.œrGµÈZ –f!ª@™ÏþJ7+H 26':è!]x­¦TàÂ*Ë}ÐП@ñˆÑM¢úc€¿a^Ë3)UaÝ( ’”'MȄ +}Ï)©Y 0æXq Ù9Âeþ»ÅŽ!;óÈÆéÑUs¤näù±QAtŒVÈd,“ù_ЋP(Ù%JÌP03¿ôÿ“s©¥ðU4³ÏvԦö|Ííä úÈ2ȑ=sçýßéV!rZØåŒÆlektóh«>³­ A^C3Š–~éïO–̝Nu[ÍâœÉ¬Ið¿;p¤¸¤Ì݃´ÏnÔG»•ªØƒ?H°ë˜|Ãÿr‡¹Ø _Ô ª~VLo{ZMð!;šT$>ýe'IÉy‘O¹³ó$!3a–´ÖfÒnº&I‚(á‚ÿsÛöîßMú—’n$ÊІï‡%N÷ñäœÏ–߸q É ‹R%´$eíc ‰ûþeߊ5&eIU2s0¦ÝÐØá[Äó ×3sŠ-KÿL~|¯—T˜cÌ!£oa†F KŠuXËÖ.%%²ò¯Úc\5@d½ëÃÓ3Xçù ¦q9x:?ÔÒŜciؘ „/§Ý‘i_´—*É]…HœS }ùS$¥BÈ3£6Y„­Q%ƒÂäp"wÙ°‡Bµºœ®ÆïÝò†Éø ¡É_•»§Áº»â%üZߙ&óLRº„Ãñ`,È«V\1;VBÛ±Wtz Vm$,f£èõÐŠ’µSd“ÁŸ/B¿ÔÀЉ°13qç@×"±£;DïäAu°!Ì»ƒÊBYý:&KIs´œDZ=‘£«®Ì5ˆ¾ÛÞMƒ!yŒ:Î   þÄ2ˆ ò¤•=RõìH«aðªøÐªé ØIº Ýl‹'XútÝa¦µÞz²Ix ;l#Œ8ÙEE¶$[^”O(Ke³&Ážšø.ñ´ÝAí»&Z™>!Pˆ†›B]؜뫇ivàd‚0Âóý`¹±‹¥8fk†@x¿TP ŸFÓè°#µ4³y#(ÄèX¢Â`Aà£Wˆä ö† B÷ãã§hJX®Æ<]²RŠh)v’qs…áÂ):íg ÀNúj3 ¢Ý" ÖëE<¬* ÌHLN@·q¶½2*2V~€k?dˆ‚|U/ÑW†*ˆ.¿þ…h%\ÄE²·3 0:íKTaõ´ð¯ÿbþöí¿s{þ+ôò"K~ÿО[Cjý}5Ì¿n®oÉâŸwÂeDžy´-'ڟù‘MêôrÕ%ÂØýú£…ô§-!x ¨¸‘ö²ü1†èæ輩 ÷qÊ÷+‘¸‰ŠöS uô ?¯ïÞ21y"±ž»ç‡Eß]aó‹QÕò£©OI~ËÎ)**Yïø‘§¾ÿ +PŒ$QVñƒPÄðóJàTä3øÅÊ;z“nü}ŠÈœÒÊÞ§ýؗŠ0,N‰×ýìí¾mõ5äÞހ¹¯bŽòˁÜísöõŠ}í«¦iöM ß¿ý¿ïؗÿ¡Ÿg´xé{Î,âRÎÕyVpô]É̖ŠY(ô­[ncôðùÂdÝ3ùß´%[ç3ßF’›/Þ#Ì·IôéÇt +÷Ìn/,‚#yãeå“kø¤tò… Ž£i–âU‰±‹Ê¢æÍ +:øº ˆZ)¬¿×Wß÷.0Ãåñîñà(O±îÁ…š×Ü#žI1­SóÜ_rïNÌ·%W¾m6èÔe$ kì±`h؋9|8nÏ +¾¡F(|!þ¼:ñM³Åîz—U{Y΀¶ž[î]ÕN€§–õÜØ;§B¹+*¯Þ]ÃlW=uê5†kˆ¤1P²„XÄÏ©ÿQ]ÁL0j¸Àõú‘Ö'êUºÓ+MÌkIïÖ½Ó^2᧧3½¶W«VZhjz–-LÏò>¡´mšß‰bh ¥·-֚›ôè‡öèIÛ³þIó²Y¸TÖKÊj æÉ +Ôì”ôæEF“ +Ö žÂšg}Phæ%¤˜²7]"AXʛ"a= ö—õ<“èÁçõäý\œ‚9yC”øl¨ZÈ#.ýäd‡VƒDá®wP~·Ä–D|”¬òÉïBñº. ëâTCŒðf™cÅËôáÌyâÅ\'äÍYñírwš€Ò˸\1ð*“Ɂ¡µ$!Äq ö»«…%û¾Žldú¸Ç +Z3“ÜŽº÷ü{ðÙ_Û ¤ÀBœ,–Þó í»;ï6á¦R´»ÕéL\º²ëN8«+¸˜Ô'N÷méÉ:Ø&`Œ¼A¢ûW_¿Ý.¾hQ%|Û!^„‰P–íz©î½„D^»`.2zøÿöSYàνڙ>ƒó£›¶­æ0úQfªÊSæ©.‚ø 9Ùë—X6‡É™[*ÍÉ|>áŸÐ$ò p´ü±[›2¼Å‹&÷•¨ªR^„G•Q·”eU.S/„“¯2J?/j³É4®{AÖb¥¼ÉS֗rbóñ!)MD‘QöéEû:Èvj좓9DùfïHr‘É94ȯÝïå°RY³ƒ‰ñ–×…»[™# 5/³ Žxʗ1Ƚö$d&\qb­èæ/ö)"§ ô¤ŒÀ=L2®nž‚Ðö%7|…Á‡„ä@Ÿ Á5¦K¬öš]ÙÄbÉËMIõ L êà–1p‚ní`Í9“z„=T}~<'îd7ñ-ãzêK–Rêf½ºW-€Í.²FüCªhkӑ¦µµbú˜ˆz™Õ=_̼Ì.ôJÉUÍ>˜F€<êõ«h|\¶Í°,ÈZ ÅXò) +Ð9½٘eà`Φ£ÁN3Ãc(מŠˆ–me)åÄŽ³«¾^»,êW ºPk‘áÜâuHϝˆ¢Zb_º£¢ +Œ¹¹xˆ³vUÏ nÐ~Ó–H»² +ë-VZ*F™Ëz€,ôôF€>ºãO,–З¯ÕE€àÖ6/ΆT'·Öä©Q;_•¦Ö‰ ïϑù\þéÍXBÛoÿvdà·Æˆ.*ðWkmðÀüQ»&”_ð˜½Q™¼5ž!Á+–¿¤"§}ÏpK+aÊC¸‘«ÂB€ÕTŽ6ˆJ<Œ3ˆ— À®±3õ´Ð +£ÔÊ2[ø:ù?2¨z·Ë:f¢þ§i8ØuÉ%½ÛU±³d¡OzŸ±‘q4óIªÄ—ÛQK>;²äSuI­Ý ÎÞpŒ€‹ñ/1¨k¤ÿb(<ç¶K’¾6J¯&ä·À×aL¢° ©ß!ßP—ð&»p±'8b)p慉;þá€ÓÈ N6Vœî»išÉb4œ±ùӆö*2‰®èTR%üàØrOޗTAlç” +ë1)x9‚‹d12‚;‘Îô?˜vF±+<ÂñÌ_pLhet„ÓÃæ/òk‹œÍÒ 3uûa)BVFi·ß;ç" -ºó ڝÁ™àø¿©£ÌßtWó$/ÀÁ±»znF°ö7^Å=à‡ÏÀqþÒÊô"PJ½­-qT6—”¤=ƒ€_l^(óåßqkˆÏÝÁIÞ”‡ë˜8_‰.^4 lËÄۇ0Îcþµ«û»J#kê4þ‹0ƒ¿@fL/¸ºhÿ¶1í óV´Ö¢ +Å’ühÂe³çT‘ƒ]l~ŒþÀi¦^&PÌ^‘m žì´Øú¢5FÀë +woIܾrzN†Ò´Ý΄†Žh ‚Öf%ÆE‹ü“¿?\{ú9OՄUq¡ŸóÓ¡z)úŠ­uüÝ`Á'’úNÏ7mHzÞùÍ&1)ºÕ\a©+ÀYØéºd&*”ζÑôÿ ð/tË& (¯K”}I¹¾ËÃLHotÀkÉå!C“Ï6 5Ú!™©Q¢”O +çÐHÙÍ`#ˆõï-3ˆî2öl0|¯@â#iòïh\ðü:?œpMÆP‡É °eƬdd=ӕ3UÙ¹òOˆ£PÁóÔô·}gøësØè +(Ÿüƒ²d—Ê®¹ŽÀŒM´?}q5„ó…ÅøJæãqsr©P3ÄQ‘5­m6MY?1Ä®.ՀÓ:7w´-雺 +•.p<UjŒòšç¯…&ç݉.M/(Þ9=ÊóÅ\ûº²Øu.#p^œ™X%xá1a®;\2ë@Hÿž.wë +ÆыšÂaG¡FØÔæË)?tä(§Ëùåâ!iˆïGpöߟ*9¦8¿ÐÇÄÔþ;pÀ³D}+IUþ&þìæ¹™ü† `¿!ÐÈQ™O¬]M˜wF¾Þ‹¡0)ú®ö±#|ê¦ 2HËTÛ&^\êu1½Åbø:kUÇyî2¨1܏bBwل§ª^W?ݙØtÑkeú=g¯•QÈÂ40“…ôM|ê,?\OB]AÓQš“ܚYgäßmSö.žÛ ƒ/ºR¢}ø¸‘`ƒâ +¸¬rÉÞ¦¥ÈulAü[Ë$#ÙüõóšF5Ñ"öÏu6®=¤NTqÖd—$Ž`õ DÚEV•Òp•Œ1tBX毣Yì·ÂaÜA6ÞG̗PMÞ ÷3V²x³±Y­ÛÍ8aü€MÈ3Q ,£„^†Ä ùåaBÞ[AtT¡a óØ ù#âSVÖÌJ6s"ëtÖÄ߶# ÌjðyȊ2:呝ÞæoŽZ>Äôë÷b7sy¡%G«µT>žƒ,ÀÐ^ ͲG7ñ„~G€êÂðAñ11—Mm]£ûä =V]0̨$bZߐ:qºëY‹@7¶æ͵î|n¥] ³7š_`D÷|Ê 3H¦UF%–§ÇXêâÐÓ2õ\ôô2A8!`Ì7·C%yžG€/R¤È†Â=ªÑ©oäàêû§ÇäÙ7JuêÑ3b\8â­A÷ Xÿ@€ÀhlÍÌkÖ «Qï°&ŽiK¸þOàÉ  An¬C‡œrÑÄá§l¦&!à‚üiíâ;6¿Ä¤Ùeç°<× { þaƒ^<åXԂö¿Ÿ2a²M‡ +¾§íP§OCDS2Xƒ/zl¥ù©Üj‘2 ‰A€djWà&Œóðä¶kèÇã[o5¡{‡y¢-ç½s=|þ[ðÎH…Ã-Þ÷š#j“Œ² +›r5-FòwÑü%éø7¥è6rݜ<£ |sRyÛuŠxæ¢rތ¢Qºâ{ï7˜`½'óxKÓўÂh4ÞIÐùr»Ã4–ïÃqÁ¥Å¢‘@–@®ׁ$iM˜Âž¬Nƒr/r5Â$ýÚÎùQ#rü%‰%Ùʼn’VäÔâó82 õˆXÇ r26* ­ +LAM)ÝS0)ô9¦ +*°ÄºÊú…#¨-"{Ó* ’ÛÎ|ƒîV²ôê2Æéâék¡Ú¬öÎzŽâøv=|º!*ür¹ZNs"Zž&D83Òù’CÕBîûôæ?QgÎcl•\„@ùèè5’ò Æ¢MÀâ‡õ{N9ã0ýÂCm¤}í{€p@ôòäÀÁiÑ>iä˜åŒ®HÜ#Î&ÍÚðV¹d+2Tj²¡B~N1Š GòmQ/HË£¾çT»MšBŠY„¶¦ WÔÝ# +\`!ÙŽ1|KP1|öM"VÎ6BÒÛõÁõj)¥] M±!Ï +ʺðÄÐ0ùWŒPî»0/GEžûZœxÕaa ûçh‘@õ‚??Lùv^.ÎçšÈÕD´[´$sѹlãBÀàÉ,zâÏßsÉýÊJÊÅùÒ§Uÿs\áåŸú¿RÈ°7ì8æ©=?ǐ՚aUSiò¢Q|C6Ô0ãN_vˬÖP ¿.xœ¢d¢#Ò*ëä ØAYÖ ¨Ö1‹j8m¤ïH<Ìמ‰ -ò áph›wdï–è܍ ‰|Ò³ÈIgÈr!é»ä„‰ƒ¸E >†J¿æ€GӅ‰"LŠ±”Wºirà‘id.„µ‡$ +†|ºäžÓB5lª‰„–‰à¾ƒÿSKV¾0·1pEë…Ü}§Gµ–æ…ü¯x!ÒÐeóS3ÓïB`åŒ éqº]ùN€ƒ"® Iö%¬GX¾¾bÙI›8®BИUÐîbÁg¥¶‡pÆ6 C&$!Éæ "šj!Ÿã¨)ÂjþΏŒo¯È>‘h:\ÙêËõälç"“ªÉlú³XÈ-?¡=“O!/Vo?Rñ^!ü5©vÇö~“6©7ÖkÂY!C‡ììmZ‡DûÚE@+P¬Œ¤“„¯ŽÏz•¯BFÇù¾Ð~QìÙ ÃԄd( EÈ£i†žôKU!í¨Zg‰\† +±[CpYHïSNÝ(äÏ“ƒv +¹Õ+õþä)GÍR;ÚbTÒG!99Ï΃–q݇ Q. +qð®‘ôPÈCA&¢…D…6!®8·³_FBQ Fìçq7ø«ˆ·%!.Ï9ÐÎVëÿ$´LÈ­K^°¡k¦™bÅ_«»ÏrñÊi}ùÔ§^ Y¬ A÷ "#"…!ðôEÑõ·d¤1È-až(áñE½€Ñ:¸ȃCÇHM²úY²%¶é½ß/åŸ,ó „ã‚Ç!»Ê¬òŸ×CRF›Nð@û¼‡;K¥™U«³{lƒ±>F+ãèFÊÁ\T!yy(#„äýCÒO-– "2ƒÕG§¬í2X85_þ“ ƒNj+úpëˆÇ›pˆLCS*àπŸÛà~F^¾I`A²î] xIl'e !À¶X€ „QØio8&[Ü cÁ„X3|QçÉÀBƒP…F›t> X2jL‚I ìJÇA¤ë<üá2/?ʕ„HmèÉ!ѤÇ#rÂ9ē™FðI¥¹?ˆ ŠsŠw°BDDíTƒª°²äiþ>¡™‰ƒhÕWåB¢¬ †à!#Êä¤l_£KŒ {£J¶Ý®õÕ¶ù„’BR^YÃ6ç¾`Ï$eYä¾)÷uzÓAn¤ž¾ñµÔä®m£m}™ä­áÛ]18Y!Ÿt®t)ÃQ™}÷ŒØ¤Ar.l”™ªìÇQÙ( ©X?¸’}10½%³‰É¤+à·,X±UÛ_dz ™2àÛ ŸWjƒ¨“Ÿ¦b7%Ù±AVތ“æí¹_Ç[­A¨ôº„²ù'w¹ü‘ªGd­­ÝÝÍ Ã4ýr8<1¥!ÝVÅZ ’ò`SÉFI…ŽúÜóÄzZhœÕ“S×x[„ïx‘•º0È3 œ/Ÿl`ëñÁ¨9IA¤jÍ·dz؜Ò^¾Æá÷Åc!ëØÞ©=tµý”@À}̨솜6Çl]r–‚P¦b„5Zíˤi¡ h*©¥@XK¾„™¹…صˆNVK¦ÇʵFŠæ¼0+k‹d@Nl +rM›)Ê2CÝį¿à¤•^é(°“DU +A5ЮôfqÏc‚˜½Î +„Þìbc|O›Œp /°·UC÷áSí2R O×(&ª-PM Xˆ˜ïYYÐ×€ß3Æft%H©Ç°_ɔäÜÀ1*1˜ +³, ¢’+áH-Í+ÈsréȲ@ý„e µQʾ#4–[)«šÜQ`FóàuB8–ñ™jiJ /Ÿo(¸©AÆ $!z±@UÆÛH¨BvEŽƒàUÜñ8²¥oÙDu Þ2Öú?ÒÑfÎTáz‹ùƒ'Ýfl¡Éq‚éߐHؼŒñQ‘®ì€ÛAÈØi¡Ÿ`2- ¤Ï TÙl£u ä^ùø?“(©¹Q •pý"ùùÃvi]A¨>/“Oð.~Ã7‰"‚:‡ó ë–äj ¿Jм‰ ÈhQÝîƒŠî‹ ¿c»¡(4pßÒa0Rprú’äk=Ûpî‰ ˟ˆÕ:žÍþ ’ÊY{­×XO/œÓs&‰«@Ö$ôB±dà8Ö L¿>íc½â(®nÒ©ˆF(".Èôˆ9jËß5­;ì‹•é,7¼Ü€«ÂHoâÿãþòR6þ +vñŸa,(;=­ÇïO=þGÜÕ¦öÈC iL¼LÀ£E€´ìÌÞ" ѐ@þ7FMh<Ìáÿaðyúÿƒ† UúO¤ÿ‡@aùþðˆÏ½ûþÇG'`E“p¹ùW#Bnº`$:ßnõx×{¿v2þãûÑAôÌ;”ü#,e}e{k¹?~Ý6@ÙÛëëMG@ZËô7´ëK&qìƒgÈ÷TÈÊhþÁ^JTB~d´6òŽˆ€q 22´ó£t’:?´ÙëáϬjãÎUTÐëZò%C_ûÉEit±cH:ûƒÉ´øãGÀêãp$ze”Ý* âorwx0£d~þÀaÐù㶼sX–-Œbàޏýß?l#@û\ìÌoÈ^G£>PÞ'€ø`?þ¸Id†²é˜áÿð.ÂáOÿ„3 -K¬V÷ȹ(±ÐGbºÌœKºG<çÊyQnx_JOHd3õœx·×š¶»÷ãý\m²¢Yò±€[¼ÌÅwÒðøì1÷ãí&Ï|äÓdí†Qîå£e‘èUé)û!ý°vc?6%Üæċ™ë6GöÆ_?X0vý R¨=¤ÏU?d¿€8Ÿ”f•€ð©­ ª–¼ÕQ?†ς‰öôcö6µá‡feöÁ焋½?–]'‹=¥ ]ô£rÀµù‡Iëý¸¼ÈÈL°ý(ö¡%Òìy~~=I¯5ó{”ê!ÏBÎöpSØcZ@Øÿ•l3ˆSk…I›$tŸ ú¯$êӇØߣKñkòãð¦ÚQcÒtüȌˆ'‘ÈÔ2~$NûööìR_ÖðR\ñceJîe‰NüÈsþÂX7SÄ`r«é²ƒ‡).€=OE^¥lø‘dÚªUåÂÍ0ÛÊCN͋êˆyŒ“q×å !ÐÔÉ|E7{xˆšå-ïåb›÷ñ×É$›è×è~3ñôQ%ºvf\kà\HW³Ò‹_¬(7ÏýöD&½~ˆÇ`>a?} xí·-BߕV{}À2 ˆâõÏÒ ä“6p±tîQ°ÏãÀ“`l0³—Øúx*¥>®“ ôÁ³Ø̀P7!˜(ºurkI<`yäû>.ÿpÕù`ßú°Ûq[ëƒ}ó‰?BÏ+=¦/Õ¯ V…iêÈÅD}¦l_x3ۃÎTæzTä÷Dz˜ÖH§í€ìÑc€ÍùM pi€A^ª­cÍÇê±%ùl£Lƒ!j¾€òû[„Wæƒ_+®î‚Ç||Ù¤¾æT +óѽæ´=a…/Z>„ÂŽP2 º¯Üå£×™èQåLdËǼú¦Æ¡ÿ¢LZгn©ªR´Ã7¨ÞU+>¼…üÆhå>¦Ú8K¬ij¦Çøº¿C\ÝÍÞ…T‰ãl{Lbóàpò(¡pe ߐoV|(¾Sú |ÀËì…åÄZã‹Ô0‡nðåԖ¨¥ØC|dd +pÍ”™ªz0Ý~hgU^xÿ@ãÇ£ +9R|\ÇUÑÐƀqMb$ðÌõ G†hªGr$4>£¤”±hŠèù=D´‰ í=¦ ڄ[‘{¬wÞɂNÅøÕ/Ë{”ÇFú–ÏC °ê&Äí—S½Bââu¦ÞÛé/l£N#Òþ–øJuÝã Û ŒºV<$ T³ôÀ¹'ûÙð„6_€»·”{—{t}Êâk¡h9ï&÷àr°9 N\wÜCÝ'–£”7tDèúàF°‡& ÿm)®íAó7SƒäÙ˜Žfë÷7eb´ +½}Œ-ʨcv +îÀÿ#J{\HðR[—ÌcÚ#ñ,/êòÛ’jñ°x=Ð=¬B”€¼ª—=N÷(Å[ v®ì1˜²B2?â­zl¼òHé°#gY<²ÇVáv‡DM@«1O‚<6Z;™Mâ°Ç²BBï[ùÙÁ[Ö:`ʬǜqɌÐcðŁߜ‚4-¼(ò9®ª'푛"Eࡂ ²>å!cÙÿdõд‹/¥,C\ÐïÁÛ¦@²C¬ç‘ƒ†£f ?Óè0²<uv•©KÏõ˜Ñ‘:;Œïáé;þïÔ@†´eú_ÙѼM”žõ›Añð¬ƒÔ‘pYº¸3ð`d<é1&쑋Œ ®†õ°ß« ` +)¯ †\ZÇcUhhªÇk°‰êq8@kAS7õxÐ>È -íM¨® +Ú +ï ‘ºùì'ð)øÖ¤ —òš®šE‡j)¯«³Fd>ߺ0w%à†§ÜɺäÈþV¢MÐcNÔÃÙy®¾”]— +sÝÑ c£Ñ\ôˆtUÒ íy:è=ÑcÝI’Yo„©Ûô°èÁ,u¿œÇ°¦JžNcW–ýސð¶K{R|€8©X½ Ã{ƒ +·>%ô:R²Ï|PÕÐáa±˜Á™%F¢ªexµŸ6x—~ä!²íªøœ±ð€ÚÙ!a.ÌUzÿÇep ëãÁ’¯„J"aã-–4_þ˼? ŽFŸåæxo»ПVnÆígÁÇ4LÝ7“©#ýž•ñC%(CÛa<^(Ñ^p”_<:´/^aìwLóA»S‘^ôU<>T-[ˆ SQ˜îJšàl25ïȜ¹ÒÀ"ØʹAÅ|Ê +½N +z&Re‰4Ë@qDÂA›Ó@Ö׺\r¡Øc`¨<ЭÁ€ŠaC £I`"þ@t¢Ÿ&ðaài0ß2EC_E4.°!Þ +¡ˆ=ðXˆ|ˆ=@|aßÐ}¶û¾9muÎp0‡Ú¡¤¨Pí Ð@”èžñ02Ѕ^ØÀ©ÃéDlÀ?Ð60|˜á1lˆ@Ü ÅgÔ900ŀâ‹E‡|‘E…":ÄÊÉÚUÖµÃ8ˆLÂ2,@£Ò“—-¶ìЀ ­ªä}yì»h݈é¸Üiû]`: ”JԀD °@TêðÚ¾ïÛ¿¯|¨jµZ]µ†ª–Ã.]@ a:̨Æ€v «¡Ã§"Ð ˆoÏp©¶ý(;Êå2ËR.€!`ÄD (†‰$P¸ÀĐ P2£ò t õæà•8…=ièR‚ß\ܬ¨ ¿ÏJ‚ZÍkÂ3BÖ “”Ì¿µ*ò¯¤ iyœÉG¨M„ê44™’˜»„|"%Êâ¸\Š ¿¢ãΦ,iÛ¤-rT¢ Ãn$ðV. Š‡ûäÃèH6ù7ž¾:Á`äTš’ +¢¡v IFsÙ«æbH(‰“£( '!ž¨?ÖämhETH¤b—¢àTŠÑLªê¢™“\-A§˜rŋ肄CLË"Å©wUu‡=/K½¡èÉ~¯“[J~(2›XàŒÐðS{ÇñtHSj‚¤5wdTÙ¥TÁ²œÑ_ʯ~º©y…bæË8žsTaÍôë^¦€Xi"®ÒˆÅmP—ˆÔƒC·ˆŒ¦ ‘¼¢ J­Wø +KÑp<œmÁH?´Ú-UCq´sFÕÁ¢dAO2³¿ÖÔœLÌPDá2ËIL+êŒi± UR£,ؤüËB)uÙ¡D<>搝F\ *´:)›Ìðô†¬ýòâõ¨Ï# :Š)ÁIːkȵôÍ[ØÇé"^-5 ""G1±M?%ƏpõÁ'$èÁ2‹|?Œ˜SUž¬ÓFÖ S]0o‘0Ø·ñº¢ *ª,ÿÂH<(¦›1J%ÓH•‰TA³uëKZ%ä”B,òQ<>]Ðz¾CMM Ýc·††ã·©8\ ¡–£6³Giè K‚݉ÆC ¸9fVóàÌÌTûGÀ:•P 6.óoÌF¿ýFâØ\›4Õí=åDE૸`‡Ç¡`C4ª¨LJÖCº»"Tæ)lf]®=µò§WòšÉ{ó{BÁ +Ac7š»Ã®ÌÓЫ¹FByÓç[µ,ÄÆE”]¦H:å$T.y‹~ª˜úfùÁÑP™f:O‹¹.F 7±]Õo*#EÞFZ#¼íD·ž$ã*ƒ +žå󫝠äEæ)QB;–Žl}‚¿*T9|c ­×⍝&:M㚥F H][dÌv¶ (ïLA¬\ýATՊv/_ ^°‘”uHPQI…R$«Ò(~lÔÖ¿š’DT>=cJ¾Éeª#Ÿ“”æÔª*d3\µ¨Âü›rd+r§l}R¢P³>%#2FV=D:$!Õ =4³éÜuÉÑÒ!åaœ+ÁäýÖ£ÁégNþDpJ›^ŒÜEúªlJ î"„)“Ex¥2뉭2isÊ5½0H²֚1:â¸6M¼"(ÉI+ˆ\?6„ì¥\ᙚ!aEmö”N‰Û‰>‘pÅËt*FxDS(ÌW՜«¯P¥™Í+WÙÉßÆã¿Ä– +ó„”^!¢3M„И!lǻܐ +ZÊ هe:ë1E,qgþƨÊd„¡I¡"‘ª‰÷¨*j-ʌ"±„)!«Ç(‚*ÇXÔŸcLÌ3æõYWsâò +œYmfÇ¾ +•XRªê‚†©( Ñ\÷Ⱦ˥#ÔVñ^‹`‰Š+Ò´i©VMYÖƒæ5$v5&uhf{;ª3ųâüœVÑd"Õ°\Sċƒ rT½27+ª5äÙw€„K*îÍÈH¼a;¢†r€DŠ¬åuÈiˆLþäÐ'/vbŽ™‘•Kì’ƨ̹]qv§%¬`фò£.ÍiûùˆÃ2 +±â"ädXáê)Îñû¿h$4E±ÊmÉꖃÆ.Üc4•Â‘b:Có“Ðð^)".}K´Åo*i6y‘‰´ìø™^9݉¢Le‹\¨ŽkVÞæá E=Qâê !ò÷m†®Vu+b1È_E?­'ӌÂ[LÉ/#A³Ï­³Ëlà 4YZBp€Öü¯ŠÔ´d‰ +ÈÅÎÀ5´£}¨ä¹E1TD@3<ˆ£ÑJ一lLZ"$24>4‹bÄ CŒ1!e S0eäEˆþ¼/â`|3üj pd êËX¡TÛ +çê’Åî ‡kQ*U4Õ Óm& ŽÀ°ÍÑˠ̀.¹âkmK’€uZj¦aWO— +†;fÕ¡e°KÜÛÞ»Kr:ÙK 9‹½sGD×Kò*?͆æq§ñ’õAΣÀKÈ­ö^Y‘†t”—£¥ -=ªfS„—y¦É ñ’!NEŸ[ã·Ðn+{I|PÒÎýœ[9"3þ’™/áLm äÐRã%.¦ÆtD/¹Œ&üL*¥è%ûAÜ¡ +"Ò¬—S×rD=WXÙ¬—\Rc@,ښÂÀ {‰H zôkP¼$?כ‚Ë4Æìü`x '9>~½×ê%¦éѧIËczñ¤áG¿ŸÝXìjQZ…‚ä‘Á›%ÔbÐ"!^‚WWDìȀ%/!wY…¼ä¼U„›…I^ònü% +E LŽvÈz°8L«áL»óf&Q‰§]²G´&ý)mªR0È&;OuãcÈr:€jë+‹JjƒL¯/F´é3ãù`¼)×Kº ËãÏ;|ÔÉøÀ¥©Oڗ¹ÐÜݽßw6/"‹Š–²öhCR †¥DR ²˜DÆfG‡œ§d’x:fƒ›ãÉ„†g›2«¾­˜Öe’«a¨¹!‰YQյȥðð7ù@æ3"ÇÎX¶’UXgÓ-½à“é€ß—¿½˜sŸlÉòߏ¨ +ÂaùÒè—ëw£=Q„UãB× HVi)½ ’³°¡PäyZ¼˜ +4€ï6‚F-²˜·i%oBºnËÈavÇ«6ó‡ÜÂ%bÓÅ’eF#Ÿf/4æÍ¿¡áp¡,ZÂÂLó“ÛÞ©f1|žÝ\ìèÔº›·ÿáÀÇ¡4Ü*g¹‹¹Fp`µïhÍÂÕ_½Y¢ELïQúâiãSÄ Sw¬ô¾kzM‰·‚”¯,߆æŠùÔçq›NœN¢ÆX­d>N¼EÃRRl¬W#ÅôÆF% G›4ˆb!ƃà·Ñe™Lórì2¶Õè[ÓÔüKD—±Gc!o‰ü¡CÔ¹ zWk¾ŠK>1N“ 2]Õ:sgŒ~{jzJ^³í1%h?Ê3ណäqšk‡ûmÍZÏRq陰"]âårúVÇÙ°¶qÈB Fs;uÖâÿ‹0ã\‹*aŽe!Ïeš¹b˜b>3—ˆƒ„õˆ«Û ´9‚âãZÐ +ƒýƒ XiFœÑ-¬õ’ ¡jÿO×Kœ‘Ùüä3{¹.®ñ©—H(¶º°ÿZ|‘o£aB‘R RŠi%ºäۍÝä.¶†kÉûŸÎĜWȋž¿4jÕ½ØnõŽŠŽ]1¦FF\´}žbÍàF¡Á:µ±ÍƝµLû +³KFv|l֓'VyÊV“bB´Õ¨”ØkòDÃ8Ûö$ò1*³ßsF¢RËGrâÜ8¨±™:ÖÊX˜73ãW¨ò¶ %€ D×ÉF:YþŠ>¾d7h·w—ÅÆã BBÉÑXWrÔ0‰Õ¾IL¾LI¡5¡¤€þë—ÌûOO}Ÿ“ÀÂ×ÒìË1{ƒŽh2ê|zè&­ðђi:cCaCÂ<ŸEñ_R8±¡¬9Yel[»,W&ŽÖ2A’6ìfa4gLÖñÉðâ€¢úK¦9BVX@‹¥ S±­ FxDŒÊš’ýߤà.6½ns+PWbÀ­ –c j‡´d¹ž­žÐJXÙø\ÑhìËLY›ƒð­{ÌȸÉÊnÜS Hoî`¾ ›:{ÔV4(°h¿‚Q’Œò¾¸›þžÆ|ã rÍ/+?!«­6‹x)g¦Ï,¿¥xVlqѤ&›iSÄýX~ %›ò÷àÚÂq“Hüpý†@Õ¸3eèë^‚¢¸j]ÊA=—^ÆX^4wÿ«Úâ 1øX"XK ÖB ÈJÊaþ5A*—]5:;°Xªâ4Î_tã÷Û#„Íw•‹3̂"GÒSIS%(_˜EBï@£1bDD3Ý ûX÷è¡ì*Mš%‹ÉF§8#|\Ò„æ 2üÝA +³~¯."„|?vM!° yºaiû±w+SÍÔm\½Áª’40èð]™ä~yփÑ7$¨G$þ`rZZ-ʹ¥Í?¹?aa ã¹ãÌK¨_ÆöšñíkY’)»Ý‚zP½˜7¡nŽ¡‚îD,|.DŸ–†ö‰Ÿ¨ÆÒ5QRaîÏSô숒¾fËolÃGp‘_J…JAð™qYcžó  +åwj¬Ç@Þi% ž¾4Œˆ¯V2,‡4“Ÿ·3~’š ¹(¦ +…˜¢~ó‹û ï©Z½ÿ"ÄSè„þqW‰Ó*)Ô÷1ßÄ­ü”K÷³²—9Q†¨)+Áà´qÿqã<›~Túä“@[E)Am^_ߟ¿)“Æ8„vsè±>ÅåÔ¾(5– q¼ÈvíD~z<†ì¤Z„F[0a9Ã$Ä®É +UdÙ¤UsuŽÈ©Þ»(%@F/±­æOç‘;®…2;Öbüc3Ýà<’Д‰¨`$—â¤ÃJbWÅq¤!O0#™&:¹5îl-^™MsÔkâKrÛ!Ú>V +½Aȏ×iHHSŒ?E„ëbÙò£•¶Q)ù‘úz¯šâãK`ÿåc›~ÅЮe’ ƒŠívd`gº òtÕÃvbnqªÜÌášlŠI¸eøü–2C†©[Ù´4ØDËaŒ èõ 1ÕЭøݘY1g5‰>ê¸æBEý¶“Ôß| ÿ‰JBi‘ß7ƒKE„åŠZQëWš¹ÿN×´©9LOuVÿ".Û»> ÙJŸÛZ¹©e"o¸¥©˜*Ïv ÷‚cW&kj‘Q$¾æù@ÈÌ×D‰GŠŸŽÁ´v@–‹\«½°éf·D¢p +’‘JzÄ#§€ÀŒ`±R‘ŒŸ:ÓQv'-H))òàðŽÝ9=Ä«¿n‹ü…”sDôé…6k¼+¦Of4z(ñ™Œl°2,Øfª)ÈU|K¥ ߃pUic4êÅ̜]°Ê@“Ô‰°Fö­b„*r;ÿ¤w9±mdc¶ñŒkŽ‰N7*Ú¯±–ÛÑÌs!UèéMÜ3z7 ^|Ô%*Íøu‰ª&‚b4IѸ™ùì¥:éxӣАX¾5Ö$ïtÍu·bÏk† ‡èÅâÇéiÞË—ô̝™Xôb¨5’Ì›<,KC‘zÛF¬ß JŽ—Àß°±w—¹*»#ƒ½ði$xBôSMBÜ"Ä Tñë!aT`jµf´„ÒÝr ¸ÞoQÙ=Lø„f†ÊP¬ÀZa‡ËÅE/‡¦Ò¥ >L?4°ß„­!ï‹@Hë–MiȔå~Š¬õUÄðêÇ Ù¦i¼Smŋi°Ã¬öê2ä¼êòÄâ„^v7cx¬(oڀnè>¼Iuée[CtÏ"SK Pµ.ëƒí¶ŠÐÄl~$o#RDËJ¨å±NNóä%P°µ‚J±Áaÿ8÷‰ÎËJº‘siDÚR+9’`U³£ ŒNþóí0>ÕÅýa¹˜€i)2mqR^Ic”s¯ óòDǨªrˆbÍaªJ—ˆdòç6–ÇÕ6ò”þêʨ>€ïæ?Hpĺ>΍à¬Ys'&v¯q6´AmäJñŸ°þŽ·P-ËcȄðü0¾'k}ƒ<ϲrÈ¥‰yä8ÇÎ+Ø +%5Ìë ¢£¤‡£tä%ÅÕß "P^Ș­ˆy,¸¬ƒèÞ9½)~#Ë[ˆCB‰]ð‡éý®ñŽö¶¿‘VæGT#S$Ðú +ÛS³·Äœ7r=óùíõ¶ûžoἶ}‡ñö˜íPd†)Ò½i~/Q¤ç=ÄáX —ÑàHƒüêUì9ØÍñ‰Éf´fQŒIý‡¦àúM57í ÐÊm9˜T?j$ã}›‹-Aeeµ½1ŒQRUÜ4ËÖpÜ딜±r è™=Lª¾¢ã(aÙoÚOÝï­=ØêÑL¤¬ª®x‹¸©©öCDʸ8xðÃϱdkubd”#Hd¹I*p9÷òŸ¡Öü0C3.› œFH¢Q b§Áˆ¸»s²Þ^VŽØiõ·î½¦\`Êxj¸OIsVgž)„‘݇.R1— $º1¾4²xéxÌO„lmû*!çŽ'níL`žV"‘îç.kt))á‹åQq/¶ 4sˆÖ@=ŸøÙ«öÿ+dwTM圑¨PCß u§¹ñmӝ9yº•¤Ë˜-‰ +¾#ÊávÅ´µ ݋–%´‡±:Q© lŽdFÿåгä§Ù‰àÐ*­^Ɋ•jLPu³âFq¬È¤Ú“<œ¨!ÄÔxKúي`J²8Ñ݃?÷c”‹Ñª¾±RÈ`]•·B24¢¹Unwp1ŠÁÓ@ê^5‰Éð%<9˨‰ûŽÿł¡BÚRÅÓããøCn&ˆ +}R6HŽÆÅȲ©Ðì•³ì”{¬Î„ÔN¨S(Ú*šñÆ粞c,e”Æ[ÜëõŸTkfîÇrT!‹Ê#“¸æÎN4ã´»JI¯&v›¢¶¸! ¦KŠäǖâ¼0¦tº‘…ÿùÔ@«ÐniˆBIÑ'Œ [ö=*¾¢8€øñBbö‚nûxâK“SF¢¿æÙC9M­©ƒü^,Úí,{Ðäîh¯ç2H ÀEÖ¼iôAÆbI…(¡èZb{¦ž¦EžfÈB=ÅÐNAÜXÓ=§± +»Cô0W¬ke A° ÊìšR6Zª?Ӊ•ÖL‹‚ƒH+&k]€R™‰KI&K'h(OÇ4º­·ÇI1]T…Q®(An0ï¨öp’oêÅ|\’g*biJ»ßËC08_¤©wH?·¥º±À³)ˆÂAJÏ@ãô¶‰Q6°GH»Ý~öŒÖO}ò +…2†Ñe'~ð¸ë™jÜ ‘P+!ü¼g_á-¯Å¼á5"b!|HðøFõç¢çƒÿª'®É'‚¬¼vRkŒË2L¸¦-UË„Ô ›U¢)ƒ}“¥õXë)þ;Êp¯µñ¬¦‘Šõ9aòmJ×l‰GR”k/NeºÊ²£®Æ†P|˜‡–ƒ•Ò3<àû)©¥“z2-Yi”¬>"‰`‹h‹e弢I½º¨\¿>ÈãW¾I<1,¡(øÿÛwÑ3küPà6Rç•DE鬪˔óXuǶ™åGÌ<àV ­ÂÖtæã€Ý4P&Âb!qJÎý5(…þ€ͼ¬ZÐ~aSèçí€ ~r„RÅ6©c@p÷£¨ºSÆÿƒZ5.òË8…à°K +ùJ^ËÒ¡¸mi{vùX›0h#·xKyyõˆˆ´sâi‰U&ìE Í#î”|e¬¡´Èr’c_Û oBEçŒÿmßë838# Ÿ2—ñ„G›-T26±w%¡²P¸™Ê:¾œ@>Uît60 +ÕÎB:ì…Æ€ùˆà µùk€¼5 Cëaéì#–z›ÈÐûvµ€‹Ë i~½è,D0MMU]ÝM£KÔ¿Pe#œqð¼.šõØlhçà×æ5ϦO@œv?Ûv6oEi9}‘å²ÌH!€’:Ý·ÐjpPŽMS MH +vÍ{…ÚÁÆ»õ*]JÞP÷ä޵۠ۂl6=#_Ÿ{ /1"ob¢5 Â-Á•ƒ]Œ¢€RƒüAuÿua +Á–‰ÙdežV¡s 1”¯S.K^9N¼ÀR(Iáî 'YD¶õÿˆÊÐîæqü@$Gʝû ÚRÝÔeyÏãÕH,°˜Ö ¹8›É Š}jwR¾Ôå°¬êlGnîty¹OÌ©DÊ0 þΌAbñÐÍðC‘Êçf¥UHm¯ÙÐ/B¬‡DL\¨Õª×ÅU¸At±©"ŸÊQ"9°_ÿæôƒJÊ.$$y7=L®=±k¯YP8Ác¼ÆÆ*lÅ8Ç¢j +¸&6œsäð_'òÔâ;Z…ˆ45LJF}ÐrE¦ÙO„ÜÅÀur[_!Í(Bä" y` §‰Í9‚œŒ™]"O_ W ê:xÀŕ,eÏk"Û*s\h,#•dL…k(¨Žß’ß ÛVaÊå?"­ù5¬Ífòä…â"Õ YÆÆ(oR«Š +O-3b«[k&_»–>£½¡qoZ#ŽþQî}akV©Dóæ`ßr¸õ6ñBSÀ½€Imíbš¸žt§AÅÓQô¾tÖm\˜¤tzž»i‹ž"æRPx»÷å’Gn´ƒ4Ár& +&_ÃPVêB^EْJìΤ±DhC'BñU×ìÈ°ŽÆ¸ï —§²_)µR×Âb®¼˜æí=¥V’WùÝ ƒºzúAàLVäåÌê &iÀÓgaȲ¯Ÿu#<°¸#ÆÏ*l²<P<Ï ÀŠ–eTӃ²ŒÛ¡ËxGG5ß)­wÄ0'K‘Yæ8ŠHK–Œe‚©øÉe 9:ùj"?´ ×ñÁŽ’Ž•“†ÔÊQb–Ð~HÛÚÉ¡>dh*ybavi˜±øX0ðLó×ÀñGxÜAX]Fe֒©d`ÎçÜ`à7áþX¤=p£`b}´H Ú‰a6|dlÿÓÅOTjè-c®Nß‹¡êð¥ø0[†r³æq~=Ú5*‡[€‘‚r/Ò£VŽIJDÃwH §¿?”9¾£bàܔJ%n)É~\l‹fõÕ¾A´aŽ„Y+A©*n#7†Šz"JNÍJt±räM±ny=5kÛ,‰CRQÕôÂ=kˆ@¸}àmúö‰¼Å!IÓþƒvá© “3D´ÄqºÌnàA%ÜÚ¨T`Š +4—xÎkp³¦­–¹QÎHqäã2?‹º[Ã|xÂ#í^@‰ÝHF¬Œ8+Q™ÚAø—ÜŒJÞT¶ÏL§ÒP«Ìô¬yC Ìí¸ª‚Ñ,èåæ?va܂šh>âȁWT³œ%*™shr\eÌÅQ€È „r§¥…(>4Ž±‚丐=rÃÄÿ¹X-ú¹¬Æ2̎š"5RS,ëX¨‘œÔË\9úi’âf~ +ÁÌd)£Q®§¡JÖDópv±OiW»,Df­¥p­°DøOSÀ0G*ùöYÃl{‡'„Ž-ÓñÖ·FN7ƒ•·$‰ïŸ. ¾P¤HYžž80 íI%ˆn¤ ã!ù~dÈfS?哓mE÷ƒæIÅY&Ò('Q!ά, +¤%|tö…Å …¢r_M¯’䎾Ê\¯0E£,Š‡e0ìG‘HÐ:"ɌÖ>+¤±|ðec]Td·‡ù?>Úѝ#ßßÀ!Äzø¼)*åö²X^­].ú8øˆf·ù4•P¥ÎÄl˜vº³Yûˆ~–ù®S‹†n¯BYї£H[MôL4Cz‰UµŸ5J<¥ +Cv6aLëükqm÷>W¼“a£h÷|EšÖ­øĝ-YïÍ ŒCÛU‰c+X;¬ŽÈ닠¦†2&Ÿ-æX•ì#ځ¢þGù‡PM_>· Ë-9èŽe™óÀ ¡ „Ž²c®|ï¤2"`d U½YlŠfp Tª¯»ˆ¶ÚÎÕù {víoå}ÕÖ:Ö¾|êèÓy‘MGÌñÄv⨴ôt/D.Zµ9&´(ÔÓéÍÀl $Qz¯ŽŽ¶Ï—ÿ¹’ê‹þ,¦•× …ílú*•ïW* DRá¤Ùµ‹RÙg¤LZyèô¥*[:’±þ¹ü>.bZ-ÈAóöøŽE%9†Ä?[B&ˆ÷áîbüî¹ì¹ 3>ÃMiz KÒÅ)‡¹žO33CÚ¸Þ&‚R5är„1Ò/i Á=±ßÈXçs+ +Ũ1 ”¶¼Պ€R!T›i?ò؏¤6•T+FRݖ£‰ ƒQò’(ÇVúÆrk3)õ×í@ð£G¼L]7EÆw#7ùíÀ´{Ÿ‘Sû«:ž^ª±Ø¢F¦Œ8Ž…­§LΚ ±“cåvÓƌlí¤@–GF‚±„‚†JC½ûFdc›8b‹~vHŒk©áÅm€' R3½áhûø• Ë~ü#šVر¾Ä½fÍûþUŸ0–W¸(W¸èpGöZ—¿¦rx;×Öfh0"Ói=Rz£äñmº ³/œªFD³gZׇtÓ0ÛtàGVÙPEQoØ)5Ù»úýߖRÄM笰cÃ5¦‘%á%U ž K^µ ™¬‹[.ˆ"³¿gEٖ?@ -…«#ú_‰]D­¥Q Aù¦ÖcDú|1’— ñüVLTëû7 iÝ! IXýF©£ +UÈ )}ÍÑÃßL\&ªN]޹〠b¿µÖZ'Ç¿’lt0=8~m¦“O¾á…£ MŽ×õÇqÒ-tè,Õ¥.oÐKn´-K£9M+M+° ±ÃS‚ ߝ¨8X3Ùc~ìF]q·«ó½ÈjïéCãn3´¨áH¤ùå\¢gSÅ8– nV7¤ç¡ÁªÞÙîkܲ?P<~-Ͻa–CïÉh·ülí‘4å.Cp½‹·ÂF“ „[–ΌÛõ«¹G¨6å»ÂPœž¡ ém\)2KY•%ÃAE);ƒAׇñRÆ@Ÿ¯&«K» +ËÉÙ2æ”ÓÐ_m³ +é2C,Q≘ē)J‰ª ô$=ím4ZlZòÞÒä× +dòÊ¢§ÿà˜ e~”ØÖèåi{ú|’¸ŸkTŒ4¥Èê0ì܎ƒ,A¥ Ç0mØæ=I\(ó!ªy2¥ø>úý:·Ô‹ô]€óÌpCcܘ{®gmÜYÓðú÷÷b#¼ÚCŒÒçɛéËÀ¦-[ Qñ¨&9èkÆP3ŠÁ4ÞC©ï AW±a¡­7´‘jAÂƒrùvÄiÖÀô'vbXðfà dVbà2 /¬†LAzÐlpf(Š´¿ÜŒBiŽâº2´Þ_åð¼cÒÉ a*ø”%éf/€;;o5\º#à ¸Ä÷ý£Æ ȐË"¿”:ºÜÝ5Þ 'Crya«(¯ß0‹¸{•Ulˆ|êðŽÚ<"ÜÕ÷9€,3Û/¤£€ÏJ€ù +ú +ü?!Š* ƒÊf8P¨ҍ@ßu·÷BVÊ@_VÄoA·W§šµv!¬€ÿŽúµ.„¥ ¶ ۉ`VP°… Þn8lÄB¥ü‰# ±ËABã +DÎ]ÃP\Œµ1Œê ©?Z¡Åd–*FYáù3Ù³7ïfá  —¸/5jXgÈæ“!Î!…þ©°Ão:Chß°Pü½YÁÂÚ@›¬•ºnÏàìW ^YÒÛi÷kß+x ? _ƒ¸+xY°®[#Où=…ki•$ +MÅÙT!ˆƒ@Q Dáa†zª\4*ˆ ïF·zS˜ËÄŠþm¸v.…&ԗÙbˤ°÷_"_ß)Š2C=â¹ 2†…H +…(¹³ö}כ/Þàµ&Ü"s¼˜Ðf¡ì-‚cü‡x¨8%Øá ¤ÿ¯b)‚íò7§ÎªbVPCå—`Jaô*ˆ]ByÝöî@Å@œ%Œß.l2GW“³„j[z +´¿ $ì3;Ñ,gŠƒ\Âp˜}M‚üí–Tdñÿ€ À—ór g: ÅG`XLJ¹ë¤<‹§CÈ­B²A¿Áe|¶jxÐùFýNW 1Ø fpªl½?%Fp–I,jD¸#Â<•B„o­ÿÈ·á}Yì=rànöNa]:¾“!Tò©“u&y»1GGîÍ ‰l¨rØó-ރ6·±½*qM® ‚•×xˆû +èk „Š‰ b< ̪uZb·ÁܱÙWú*ð?àîæhՕ©ð˜u±¨[]VÍ9ç. á<úÀrÀãªáž÷ÆNìX÷Èîó֖rwÈx°VzüËèOxÀn*œ‹ —]öØwí[ŠËQˆà•{»ƒïŠlg;HlÞû²ƒïˆÝ<ÂAƒKe»®²Œ\zF«|¥èãsÉIî]\*6K4ðÖ ZJvî̟–¢¸XTÖÜ mÂÝð%$ÛÚÚ û½YåƒG¸3¬­ÁW6pwÍ?†¬ëåôSj`?-¸Œì¤(bÝeŽóÚ)pøähià׳jh§í½Gƒø zâ¹µ$µäbÓégð_°í† |ve´e!ûx—,r™0C[‘’h +.Q·¼ƒ&‡ö‡AmÐ9¬¤ƒFùÍ,Xà/\õùù # ð˜,X™%Qà\°“… +p«ûbõ á.Q½»)¸š¡®mÝ7Æ0èS˜?Œ€Ñ}§eÁ!» Líªxi„G £¢® òt±IäÍÝ +V¡h¼pHìqĐs¢‚7Vë‘7Ÿéî­;(]€•€œö_…¨òʐÕzŽoo›TöP6«·+‡©ÁW¾Æê2,ž{$˜±¼Ië–à™#¯Ñs@8¯ b> öÇdtºUhã Î40J%$hZþŽ +Ù¡ø²ÿ+@"‹$ˆÉ¶GÙ£Ù&6‚#b2~|Õ°³[Ɋ6cxoÅ’¶Î(ë}PÒ§ÆD¦s…42¨iz³¸Œ~U×÷â7 ×ÁÉÚí©äËñPö¡ÒS ]Îå]°î›hÀ ævbüɁ¸40RAW^7}Œj°SfR@Ôû/Êög½¬¸]CCªìÒ¶i`m¤¾& óån°wÁ0cÎsNÏkĜb`Wdý0Ðz"+骂 +<'rèN/ vûµÇþˆò| Ä,R³@óÉ-зŽ ÉÔ4‚ûºéD¡ˆ¬.8_}jî´cr(P7ñÖO ×ÞÇ3hûáêfË6 rµ dš ~{&àLÑÜi • ¬-äž”ù¸ŠqŠLJSTÿm܌voÜ]?òÜ`Þ> ¥ïôÀ‘ÿòº©"jwŸfæRý—"HnA$Ç5àÉÓö=žßp¦~w€°Ÿ¶¥S‰ºÞØÈðþxM­ÀJÎ^Ì˟݉M„q{ +GQræp®ŠíhÂl +—ÛõKúeF‚Ùð/œW$ðƒç¯B¹¢\cÆl5ãxtžcàSL,@ý¤…ߐóð®ˆGï8›ôBbE{Š +Õ u€|~fµ*·Äò dúÒ~¯G?NK›=fJ¸€/ÉÕÇ ]„ã䜾âe¾àVe»ÐG#€£¶i¾„ùkœÄ™Ê?$qféÆõÐN" ¡¥îz¢à 8“‚ +‘·ÈÞ¡kÞçñþRûW¼iºlwÐ1ۂçʞ?–&ža|„´¿âüqЫv¦Ôùç5`úWþÁ!7Ö30sðø¯ÜèUDË>6»°t'ý}ž{…eÔü]ašèÁÐ*úº&³@s¨²u¹|óûÌÃò'€.\ZÜ»Ì.~:ý“+¿a0ú?´òqîî‰æX`2×\Ñ#ž9ƒføkWª>°yÁʐ>ü‡L„Âß?4¸Œ gÏßßÐõ8ñ|Öd8e®õx±¸fŸÕF­_Ð* àHyö×CÀøvê×þ¦ 8ý½ }÷SSúG#)ʺA ³{9DÉèOÓjõUó‡|ÎYýÅGÂϑó-­ß£ð@³ä}ûoI?Íu·}CaÇCS‰oÍnü ŒgdžüXíK,™ +ÿ­–7ë-#ƒ?»úx`÷ð‰ˆý€ b±P´á€,ŸÎj¸ìP ‰•Ae¦•0a0MBÈ&-`°š0Ï]˜S!ÁýK?)ħ±·¢2ãìÞ2~÷Ój¹E_U!{¨u\œTRØmÃ0²£ŒðíÞh[.D[kt®{2.á9Àw¦ :ÆËpnÒd·éè/ :%mØIÝ ÓÏÄÇ˺†ü„‚ü-ªÒð섘 BÁµ ŠåÄÛ 4&µá:ô0kÿ[­ú˜0°Mâk“t)Ɣ¨o¯ c☬£s‡OH*Ãm (!ªÇöÌÔJÐ- × ‰§¯³i®žèÌ{¹+êA:ÏH;2B!|GT†ýÿ›Ì…g–½P|àIi˜6pk€ë›kAõœz7VÔÔc˜Pcz-xÈîà›œÀùžüŸm•„‚cÄÅS#×·çÁ>)üÿÖW¤Ðãâ6xÒòLBœÆ!8ef¯ÎÂ`Ù […Ø®ªÕ§˜yda"·‰ÞÀ9‘™`’±KåJ–Ğ¢»izó¾xëƒÀ.Ð8pK*Š½„  íK‚ 7j(©3vɐ‰h9°»¦ên•ÍAíÄ RTc_¹rÃÕÞÛå¸Ç»8©±B˜7^#£-ì¤6 ¢„¦sNŪ“~Ø»U¦\šËӖ“(âÏQяžóË2¡õ8•` QÅdÄà€C¦”Qû³apîÌS9F¤u~NØ4Û´i\8Γu]¿5$–‘æø_UH iG3#T5r]+¤ä i‘¸a@ÕÃé%·Ýp(èíÓïÎ`߬+Ê$À—Š4ý°áÿ;ùŠœÒnú€­‹~däÆB©1úy- ;b-GÄî0ÎKáWÊÃo”ˆÔàc à+oɸÄj}&ÙÔ¤4ç©)+\ÈøW† ?1D À6ƀH$(´X´V“g+»C†X‚RL!ƒCzÖ ˜¸P]´R¼¿ì±6²°ÐÈ+0ù±ÒÀ °‘º‚X؁®‚]£LÌ:Åí ’Ń@Ýb8ŽâEÂ\´ûhÀ¥‹Œñ;çð&jÿbMóž^É@ö-m‡†åŠû|Ë`ç¿Äo¸i±ÆûÓðö>‘Žjü²Ž!“RÅqç¢gmșHéNÖOCáš`™å…aDî,ª—IÜ_äù‚6ÝÃ<»—á*`!|¾&¥ÊHÄ3Ô$P[‘{À€/ʋ»Ë8ÿOÀàó‡èdû€åOֈ·&$ÏPfT’ëň2èÿêÐôO?’)a9fÔ3Tߔ&~|ú‡â“ ÆôËLìƒeJÎߋ¦¾°aKRMC„ „áJô“E GR‚¹Khš‹ûPs€T(Á ÔÑ:“€'á^xÂxý‰x… +×xÞ§ÕT©8«l[ÛGÿ¹ +xæSGP¨c>*ÂÖàÈò¹ªS ÷k^Sa †Í¾øSÅAù·‘•µôú­…\H€ñOó­Ûƒî#»V€ðõ‰¦‚@+`÷0aüwv“2­×ŠΨÔHˆÕÎQªk‡~X¡þ—Ë‚ sæZ‚¥Áb¦:¾b&´ä ®ÿê…ÛŠ7†°êùD4ƒëTßtô.OjãB¼Ø…c%Ò]&DÔÔgÊGÉgԁ Y;Eñ¿Æ…Híåð ‹SxÈފÚ4æìš+c9x"™¬*c¸é™0XÊ=X@¸2çöRÛÆÿ›ì\/ä¶D}Âë!—íûàA•z°¬ì–ñ@ÿÛL±.8÷UvëIJ88W°`OÃ$ ÃÿL‹xÍëûoQ@™ЬÕüÇBï :•G´÷ëáև0”µÆÏþ¸ßHIçë8Yï4Ñ×vêƒl„7 ®Ð©Nà ¾z¸ú8‘vqá-7‹SûiiS¦…b•ùVg¢™—yHßvÏý˜)`¼®Ã®6cIyi­ÌV¢Ÿ„#2µ(:]Sl1˜(eè:~çè;N´e<*H¶hàæV†kc ýÌG_-„vPËÿz«éµMi—ÈAA.ˆ"¯¼.†vGð}FYú±îðJ†¹>Ì< Kñ¦c[` ¯ ß0¥üëßÙxߤ}ÙԂ׋£X"SgREÿ‡ì>°tƒ¨jæ+ d›óŒNh÷b-˜'o)“Yïs=u4¥?A_)gù^±R(H?‡[t“ãÆ ‚A† 0óTÎEZ9‰0š€&øå‡Tï1]F°QùM¾Ð §©ÇÙ²$˜FüÊÌ(Á"²FèÀ3¦"ʖ«´/w þ’J£øŒk‘ȳ]î¨'“prÂù }L!(p24A|üêÿB7¬eÍ·ˆX€ÛyÌÄmëcÈ'·&üTÉ[e8”âÛ¯&NŽX £ÚšQ4´GpJ{ ä4©–À$ÄÁDәŸü£û'u´ŠèòGm®Ãæ4š€¬‚ेæÎ ýOTȬ «êLÄ@ÓÔ¢XS¾r¿VœiRƁÁX²ÑHx±Ö†ªs9ç÷á ÀƹGPúEºéÎVc +6ù†“à仹W}7a”d5x÷ƒÁ«Ý"®U;ٟ‚ãq`„ŸB}B§a°‚-´æQ³–Lsˆ7z÷ ù¦|ðG¾÷¶>!³«D‰dwåö¿Žné,q#UVÊt ÕnåµåLPö·UX¹ˆÐ8Ávc¿za”éòŽ‹€^.¤¼ãNëtµ®°ÞMg*Œû°_·U±maÎ=Ë: +º®7ØíxJƅv‘â²åƒ"0ÃÌڄ”kƒ éåPvtg«N~.#N0œ†ÍvíˆàTø+l[d§ŸæSÝÿŽcU¢ÍS\+ŒùÑàÃúq«Ë0õ ƒv܊0Á +¢Õìªl/XL!¹薿{ˆÎœØ$·‚ íf•ÚمGS§ÕØø–vM¶;ã*t´ qdë*ÂMxà­5³³Ÿ ¤}ãÞU j Cщ$x\.DWvc­ávð£T¹íî<ÙÍ=§Ú¸OKˆ}Xð"šØE÷]Ü ø+Ãm=ؽj»tŸËöêV×EPëÀAáÓEŽHØGÔ;jÖuuD,{Îu!Ÿdsür·îQ˜ µu=y­ þ£´Žc¸÷Ÿu¹s݊¬Xw«xbW˜pŸkò¹ªKD7˜îŽ1™¨.¤ ÖSǐK y…{JL”tÎ™‡ºë6¨k/ÙmÛkKÔþÑ]5»÷t¢[ÙÊç„Yü6BÆ'Ñcºø¹˜]4t]ژ|ěBy '¤ãêV´éTºf”g¥êû¹{: ™Ñ…±T 8dºž%§¤ö7®..” m¯Ç'tèÉÉB"‡®¨q-0Ì=èƪÙ3<‚ º|§:«ëd­c¸€dŒ½÷>*$Ã¥-Kd5jˆ’)Ü¥"\@›å¬¼è¸§ +[ÏU6n¤"Qoö’¸Y£V9ú@Q÷H£ËœuۘÛ~e°¤ä(Ð@H˜S8˜K>e.pûQª—³B[ñöÆÇhæN~8âªÜp€ÞÕYkê)ÄËÕåÖ‰âþt CbÞ<ð6‹)T\ߨ$GÙÄð«[PÄ8–ëxË?ãÔ"/ò>®z/ä°`z÷[°ÇÙqùÉñ¨¦ DT²ÛrESï*ݸÍͤ‘å¼³0Í#¹.¯SNÍîòȍ{6›´Fδ¹¹ùphgÄÿ¼90}žrÓ+‰’* æ˜A$³ýã@¸çB¬>Î MøÔ·PŠ=Ÿ°¸½MtÃñ8?ûíKÉ´×°üÊh¼è ™m¼ýÁBÙÆ A‹ò׬cK·vFˆ¶ðVÂK×x/½µðmā_Ÿ’DŠ6ïÙøo„&8ÄU\Ž4 sªS\{\Q\µ9&?q3µiºwç*ڗ¸£Ù}¡M¸%±ˆ iŒµÓQ7΍‹%‘(Ú÷‡,fähN)D§]®;1Z÷}Œú w)|1܅äåÅ»|RcT²Ô­'x ›ÎãÛ~ mm‡qåÇvZµŽº¦cõäµeùËne”l8Â×n-qåeþô¾ˆ[RÜæ®%ɨ–7¢¤•úǸd›Á4I˜Èe*”s ba6˜Bú Tê=„T'¼Sip½1ä•ØÏìºÏ ™ßŠ9~„¶;9¬­òͪ?û:¾¡˜Yĵ ßd±í™z¢ûÞ8O½xHD¡î­Iakï +j4Ì -Þ*ºFé-©±?r › +AÔ¦­ÝÔՀEÑÛpؽŠ¨ëó¦à§µSkZÛWNcziÞD’‡7kìè–Ê|3¼ý,n½“býwÛ&`yDÎá•ß͒÷uÛïÂ4wœ­nûpË%Ô͎)܊3 µµÁ³ ï ÙÜXÄ‡ŒÿBû e‚E†ÉmQ5»8D€‘[  ø(àçQˆ&nó#ŒÛÂWeŽ ý%Åkáæu>á4pĐ«Œ¼ô·wݾ­(|§Ým±l°y›ú­ j’Ä 6cÄñÝ&ÞȱÃ8Bã©Ûð~jÁ"N¹íj¢ÄÇm%¬Du(lÿïÙc`ùû³YLük«j-âL]››F™”ŸÀfC`8ÔoXA†u"Ã'‡­ì³6¯> >’vYÂÁAœ=¨ê½Ù„CˆK<÷˜}¶ˆ·Èg”ÄB©Ùj¡nFÂ U +¶&A‡8*8»hn6­ÙHŒ3[ÿ ²1ħµM°ê6WÖnK<®?¶Ð—}í[(@„/RÖ$ø¶•€qnœð°=ÝY üTž}ó ¶®QóÞˆéÖéLÿðKÝk_dÆÖ÷´hHFMGlùõy (ˆ‘­Ë¯·œï¦ñ$spiû¿\E­õb¡\p€”è£] ï7>6³4|^×µ^ëÅ[ã¤$QD5¤«„øLƒlyÿˆ(Ç¿µ.!œ£ùl£ûdjÂØÍó´ôËFCñÍm͛²}îƒÔh³ÖM$ëďU ì«ZҊhbN œþOaQE­ö׆væ>êXß÷ìheŒ¾Íe²•™7F lb©=7õ[-ò©Õ®Ñ~V«õúµÕ_µªã +']Õ +¬©Úæ‘‚…F[!k 8˕jmτJìSË1$¦;5¾ïݟ†XcÏB4ЛZ+Lõh‚'À¶31=âœ33°v>DYc°®¨üdçqÇ Åq“Ø4Ç5ʹB4›æ:K,jQ„àZ€Ö=0Ò²yXø>šU4ò¬8#J´ý¢¨Ó¶Ö–(?¥…úÜMt󹈍«HCq#œ®mZ)ŒàËñ0¥u +¡ÕAK|-ÖÿM—<‚)ŸôE¹iç<@/ðŒklhøØ]úÑ0¬LåvF£á›OËu56sº©[Õa•jT»(¡µ®WÑ‘ºÜ¡ŠÒ Û]êÄSxÒ¸˜+>«†t[fö˜%^‚íH³u.EZ3QÖ\ge¶àe-ã´â:ÝèÑÀsh”ÄL6èV2›‚ÜŽ¦•ÈÊr4þdßhLåƒÂ€Y°j"G¢Êò—pv¤õCd$&’Ü€½C46å_QÈs Ú[ å†6nÈìw‰>ã|Áy"Pø ë‰(‚¡…M­ Û—Ó¶M—gíÉ»@ Ñ5ðìÁùTeqß•ÔÚεZ!lt'v¾û,yÀõYigw§ó©ã³UÂcÎRïߚö,»ñDüˆë™ü€æ(ҘKćҳ¦ÎPÆG½ `%ks"ïHs†vŎ,z’Ngu^˜ŒÎTÐTO¥‚ +Á¼ MßÄ4Qׯhß-Ž¢°“hÓ=ΦùïWúu¾Ø]|6¯d·LÎb&­:ˆÜÒoA3L2ÖÀ.žnj;«¸ à |®ÍxbD¾_…¬×/7Xp¬‹De +&Ày"9¬ÏS—ُ‹M’ëQGœCˆ+ºÁ®ûxž˜ ÄÂÉ®f؉p§f àÓ,h•õÅp©:“0…ž¾KB²QP¼) +?~÷ªab†>Áða´H9•YsBޓٹ1ÈU± i’ Õ²BGï‹ÙÑXÛ_‘Ö4'JKw Íæxó— ¶²ŒËu” +a—ÆhŽ6ï2 þ3îáùlïïO±½«DV™þƒ³ø5ec;#t(;'âá=ô¨œÄK +4 PÊý&«2°•´ D bÑ-DD̉|͖kªÒ{ÿEqQKÙL©z¤Kð(AµY'Ë*çõK}$ã1 %nï  ~²²‹Rˆ£Î3Y¨Sñ‹É­ I‰'?Bð%Cnvn)†Ðº ¦“"zÙòÀ Ԝ•ìVõJ¤^Ðû‘Ý+í dp6F #Û";ÑD Œ—ÝÈØ Œ ^ßfÓÇ]dð4´_‘Ù¢iÐ$±÷D6‹òp;ýˆ øþÛBÔ=d \ùµ!3Oº*€Ë ™]6¹SI)«:FZåÄ !Ddؙ(BËdEQÄÈÔã( ãÏÙ/êOˆ`AP/òéÑÓúÜÃèS“3Åø[Vaþ¯ÂƸÐL§Èpüe–œùç:Äí3Þ߈¦+ð֝%X@û¶S¨™cÂè*öVFU}0n¶úv ³ÍU„¡7û/‰ÿ—åÃ60*›ÈeHƒ¬Œ!ý°2ÿ:S,~ªÃŠ&'ؾæDä]ÙÒA¡›§ÛNÅÊÊCAYDyÓèø«A™ÆÌeÐ" ۝ÉĒ«-¡\ü(gUU"ŠÜÀB£ìF …0Fz$ כu×þŒéÖ\!èÓùƒœdŸÑÅ?à÷¯wÏÐ4^Q“äRp‡“ÁìSéežD™cTàïøD5‘²‘p榙!)@ÛA'‘L¤kB'Úl X²¤ßÐ)]§[ùjâW‹öM-j"zÖ~b"4žô遛/GG•„ñÖU4Vö±ÜL£™xFBˆJË>vM¯õÀù3Ô¬ÃÇxÃ@¡Aê*Y. ¾oÖwQx±‰³üîÿÞ\ScãžA)ûÓ"íOîžu”ύᖞ‘L¹pN cã’Ïî"†²wwÄzŒÿ+(¡&{¯÷-k èDèõ8Ž% w߉õ8øÁD‰ŠÏÚiýrTh¶*Q"$dÜ(ls!.l$JhËOeøŸÐ”“Å€²ÔèH Á/zHÂ>åF$i1iŽj› 4ÈЙ$!KÊrÙwÓ³Ê$ZÚ ·äIÖa¹œf'Z¹JšQ%Ôm‡­Y}’Ö>"üaC’Ÿœãa©Kl¢ÈvN'HP×Yö³†¡e––›_!Qÿˆ™¹Z›bâ¦q æñ9šPè]­ÌâŠËÝÏב Hï;BYø?N‘d۔Yæ¾ aó»U$$ᇠʓË}lþ¸`‘Ž]F3Ôd4‚W¦êÆ–„ôNײîtVJDy´6e¢Ù·qgŒ ó–í+O8³ e7Éj°Öæ5b% ¡”Ôé¤ðqïV» ,H¢aÈp÷©k#ÀtÈ3„œ.ôbãp¨o¶î<¤oVì‘BRÛÉ6ë1ª¡yZX ;oO$„"C:ÞÇ)øþ:VK!¼Ä3uÎ\ב«lQ"¬‚4¨[5ž;÷쓼]ÉpçËM62AtEwª^žœ&Ø»2ì‰45mäLÙÛ%e°‰Iø­µæÒº) ê­x¤k`Nžš¼æö·í`&/ü‡±LÃã›SôëJÚV~§8Ä¢ ñZcL,yš<×)°¨$ˆa>© ¥A¶0z— |¬Ë÷ ‰±1½ç&?â`Á0½2‰ÎòkþMib¯e-áѦcV"yBÝAöŒp +Š!J)”¥LÅ|½’£ ;R`|ò£äÎØłjÑöòµÈr@X¤Þenæp£,J5KáO $5¿‰t8r—[:w‚QYü|Ø7ùҁ—Îi’¢5o?ðÎLÌLt«ŒÂ"‹¸ö"rh1–Ž>ýºÈ]HîÓH»ŠN`\…à¿ëƒ¾EŸŒƒ@‚–QÏr#-ÄÁÏcÀQå +®])¸Œé(š’A.=êîW²zI-ªg&ŠP1Êç’þYÇ}˜MtïÀ2,hýñ^Ø,±Äe•Zvˆó¤ æP‚” \&‰Š­:V½ tdÂތAº*Œ10%D¼gt›iÅRsX÷éÂFQ””´]`µ,˜xà^AcSú_Kƒ ó•vP*õRh'îD@û¬ÍªãŽœ=ª³rZØåýªã­&sFÈYXq}š÷ÜB]_vsæ+"²îT!;CŒ|ª4œ;¨1M%ÊÀE +½'U T‚<{\¦7óˆºîÑDÈäµZ«›ðj<«KHzX†rªo›œÓRÙF&—pÖ¯ +$;e.µ‰b†Tžbš…Ö¾ž@El•j.àX¦–%\¬ù’}¡ĺǁ1¹]Ð䌜æI–øŸ×ÔåéÀïþ˞FM3U÷¾ÄûK¬søÃCS A2a±¥R¯‚i.(ƒV›ÛLV0æ'†ÿhLÿæ³Läÿ°”*Ā62^ ƒÓ5Š´ð8[µUô À5eØÁ‘w¥Y‚ Pl%Õiô¨œ6Ñ+ઉ‡À[½6+5Gè~¤tãÓÂad`"+£ß>ƒ¯WüŸ1>ΒZuÌö9U³pÃ'ùÿ€É'¿<›-aX_Z+ýkÝ2—˽ù®1k2S¡²!AxÕ ®‡Ø×GÖ2÷U$€Ô&•ěÇ§Î¥ò®§EÞú/\Ó{‚ÄN×@O*¨ØâÎxôƒ‰‡ó‰”*þyʝXfá1Åh›ÉwäJ¾ý¿ç&-£zq±ã$¹æ)™³áÔ¼¨Š÷W/Å ÉUI·3ëûå_y÷œU? GG…¢‹Ýô»sÐW‹ +ðóö Z•/øÉÂþ·ˆcóSÆx0”w—f±ô1U¦‚ðì°Á®WœãXYåBDÂ?¡}_þÂ?x8T¦6õ~¦"ÊÇ9©-Übвð`ÞA÷b*ŠaÑÓEˆ]ƒ³§}aR¶¢Æ`щC|1½ ÖÈVb´˜[¯k=M + I +£aÓ¸³«Ä{eOd·ÞzνLbZ?g#þáÕ'áو‚P +¼–9p)!IЛWDuŒSР¡—¦@i Úž4Ž2„ǁ)¾±Î¬Êo*qú"1Tˆ»Föú%è CaOjkÀÁD‰/ß½v Ï$êIœq!QqÄPÏEóÒ,X½h….†l¡€ÆÈEñ“ø(q`óÅÂd­„SUŸ+†réÁ?°>¿5KA“Œ,ËÀµ´¯žIú¶™¡\cDVÁû_ÑÇId3ýN}'l: lœÚÒ«ÇËàBu?T¦a„.zé€] GÐ*Þ=üK2$Ù2‚÷ÿ ÓåéeðEÍ;@ 4©f€ñǽeI˜EOMdú$»3¥ÙBy9 ÐB¯±±1Ecç|K_†×ï%A®ëÛâ!ºtè aFÒBÝý¡Ÿ î~yìÑw(Ø.a?0^¢¶TãX:’ …ÀyU‚ßï)ŒŸAçÙTÙã$xèÉ Ðýg¢˜#Ü4dÊ>˜J3ëm|Ð]oãs» *°WšÞil2äÕÃ9'B‰³Àñ_Xä€Íëàÿ;pÕDß!É@¥ðÙj@F7pÍ;äˆà#˜Å¦¹YAð,ŠÑüso]7ØÁâŠ)oÇ,5s"ª-õ8Ã_Ãß0_q¨Ká3Z÷Bt-ÕÇ1Å`— ˎ”°Þé ù Tú8@á^Iú&rbLϞ!‡uñáÁ×¾œÑªæßW‹L6ê!LNÔìÀ9[¤ˆÆ‹ÊâÖ¢sÄè}»ïqFk°+µRZZñÙ=ç ”Pˆýæ x r`›ÉއŽØ”£â"8º‚/ÌqŠZúÃg<šåže‹ÀôX¯"17N·J;‡HžJՍó˜ôŽª¤g‚Mp33̓ v‰6Ø(ê:â؟w³#ƒO2?RhT Ô¢‚AxêPn6:?›ç-èpé çÄ`úöqà,¿L™@ TêêPÁ4§§ÆJq6ØȈó²Ž0œÂµ;tC+j뇔á°è•”#ÅWúDä*Tïæt:.’žr”€>²«ÆÊ‘Rv¥Æy%¤)´ý2G]¾~Hvðç¼ns›`õ¥Q…E>0§vB$1#TžŸöÍàáÅkNþ €ìâø{{|ñMj¯A} +Ž˜>c2€‰CԞ p„âv)Š#dàÑԈZ̓ûVp/Chï!ÓR`•õìf,ü|‡œ4Ö ªړ¢wÁ§fûìhÏ-,#nê†k¬sb—%¨'@dÛú®‚±©3þ5 N¥q°QR¤`T ¾DŒ(×Ñ0=|40ëϚ‘ê…€ٍ¸`…¢q‡(«&ktrJ³$3x&ïI-@f~¨UjÜ z‘œ¶4ǧ?5s©‰É=òbÖD•Š œÑ`-τÍÁÁDaå2kF;íÞ.B+„SQ)³å,ì¨- ŠÂ2î@"½ÖÑ $jEJ*£Ñ[.eÆlÓþ~jÏg:¯ìÀj=º@bÐÿ¾Î8£YžüÆX稇&;°¿ƒ’(‘È„9²Cޙòž}ä¥zƃÿ#2¦‰õaì kúK^p'ޔD+·Õ—È'4Ý;ôHìÇj +¼ ;€¶0²ÚþÑY„OˆÀøž‚ØA'l=í†[ ÂE·*7vX¡  ¶±G3¼ªUã OÿÈ + S?!Ôl8Þ,8ÌØA§ˆ›«^ì¸xq›QQÏï=i„eHÁ_ì >ы×þ“b(zñÞ`mn;(J1îšçbZ(ce2ñ`‡_ù;¾€Y¶ÚÁÙó˜?̱`Ÿ6b ‹º®¼pKåÿÅØ1°‚±CÁb[Æb¿Øá{4w¥Á#„½Ü|ø ]SìúÕ~‹—$?"øRÇd®O§R Ì0ŒLiSöÄÉ¢ T9À>¢NEȅ¶qnbӆŽ’HE£Ìá'8œJ¶I萿kîÿ&ƒ˜Ü‹4ü ãß°ÞÁõ.Õ$ô€ç ‡:سü·tì@`42™6ÀÐÇ\w͇ú†Ñxoy…` M'Ï¯Mg àEzjDÎiΛNÌY§ß“ØSò8{F÷ò ·Ñš!, (HìÖ99Ð]ØÇ=šÉÉG7Ž‡³VrPÓ•½°‰#pÈDMèqã*’Šh›`ΌôÌä:¯>Ž=G¹ ;ҲԓY¤½ÂOáÙ7öÿÙfè8A^íë8+ن4x €ã@·W?íB¯´M8„ÓbBÇX á6X3Í°DqF²Nä)‰³¬þo‚R«Xü Ûzß1ܱÐõ8&‚& +å’JM/¯‹¹oÒ{,QùÖíýkN §?#'`WÆ3´$38 «b\gÍ0SMÛ  áiO¿©àë¦Yá¨K(?z+}³5¡DÍñà ¿œƒpÜA?EoŽ³núN͐7Ži‡f(¦±õx‘K ™¦ñmXgk›7¬žH"‘æEj°œ2”æ:!—V7ïi1CàÔO¸{ޛDÖù6=ɎÖГö"@ï[:— päº$Êö!VvET¡ç¢îˆõÕ©Pî×Áì¦Ævi¸–0Ó-Q{<´†LVšªþ[°=ù·†´ÊÄúE<ŸpHkQÓi‘À <‹rÊ·Ò714¿¦¼¥Õé@{­ÔŒ• „ÕèDðĈ 'ñ +‰ —[ÎæJ}\pïš Ý ³zia$s3<σ=€S²5ƒ>Ӛk~‚4ÄÄæ­¯øÆ.Ãp–°©  E’¡Eq3šaF×X¸F®’kìÝc8ÍÂ5ÞG0è˯À+”Ô JÕ[¢—ô ÒÇãt8ZѳÒÆ;ýeaÍoE_Œkö®Ô þԊüòëJ®à,ÞÁ‹P}ÈB¼47*š/Û 0”“/Å\âKcëG¼Œ<`ÞKÆ»@Ñ ÷…œ½¬öR¡È 0{©p³Ø.iÀ+J s0à%Î÷b|ÈKÕe¼ŒS 3mˆÑô>}GßÎ)Å¢ˆîH#ôéâ]i]92.AJ1MÍD„–4 g°¤l–7 ÙÖÁښí¤´‘¨Î_ٌؽ[$Bïr™'ƒq䔓»Â¹+`Â露ËÊJdÈu°š%".Ù)žâÊƂ¤àJLjtîA³‹†n‘h A[évÍùC3ƒ+OæYZR&i¥²ÄÞì$~CòUåID¤‘‘»¢N†PV€q\0VRñæVjkVt•æ‡ª–?½Fà©Ápès–±šB 1aN ­ç”êD2“Ó5pÉ*ê@¬¨r,W”iù;Χ9æCª¼«mQô§rPåõs Ca©§/õOÌÃr×¾r*á£hJSéNoL„Š,•/³*®0 # +¥"¹ƒMµB>&Øàiè%åêԊ! NRÁËo ±;ÎÞÇ¿5·‰&¡¥©ð’¢ …diªkŠ´í6=^^rK¢D`ÌÅí’Ðé 1ªYf[ 8[M°q_2EÜ´œ¨ÅWè«4$­ +¢'°Û(8Œý#û`ÈIF À,…ˆó kŠQ¹ó‡nÓ-ݓcó'ÁÝn˜5"Ç2Úàá`ŸF÷.üKjò‹°/Š÷˜Qt D‘ZLÒ§,Ð|ö˺†‡¡»Ì §¶ÿ\Ñ®7!š=Üx2ƒBÑe!V凊½èy£ yB¬ÚµÏÍ<©°ûLÃ§Ã§_ەâ*_@ÈE„T€%Dcs>ãˆÎ*Xš8¶AÙT³ˆ¸³ï +Ý¥²cËéá÷lžæ0;OÉ骈#@ ¿OÓù«"°þT<è©DÊÀ²‚I⋕J§DHª–õ ¥¡ôÚ¾=Bá6w‡A©WÉÔ0å~åy²¾N„dÌ ²XDIFZK¹0è -Ÿ?v*îÌ"Ž$ dTyɦìG‘‰'"­G,‰¾Lþë]Ÿµ*5dÏ¢ó¸àexT^¦#ؘiœã8}b@ˆÖ¬4ðƚJ&ªÒÆìS´…Ê;C­kö·D;e*0ğܛÈ@‰|Øø³ +¤Ksq˜"¢Fˆ0¹â- NKýR*¥³4Ž á¿ [û/^¥A›/ÝJ=ÂYC¦Ì¡)›­TÙß0ÁÙÞ½\žH(ýü«¾nìº3ößs®›¹~€ïÕ%“fgäžIþu¯%š®¼ +\C°·Ù¶-—Oº´&¶˜ÂdIŸ_%P~R SÆþ*lFû€4+åObe)\› Á>],ž•†÷¦ÂIÌÂb†cI×KìÉ\LY;©¸J:ôV†Rùî8›‹a5eÑì2fò\ê¨L ˜u‘@áë +þà A]J9 ( Òà;ª¡Bݧ¾"àÁ?O¬–žÊ¢‰^ÝüŠ&ÎŒ^S´q­ÿeœú¨LáÔÕÞ+:ÍNuc?TÛS7Ֆÿe„¦‚ˆ!¼ašÄ„ԆjV©- Ó¾=Xõ‡¸0&þ3.\ƒ t©T³-ÂÙWŠà˜aK, +O뀘” ÌýlE‡¹Ù¥ÆétՀÏë”ÉC«LŠ×d­œñ¹,±œØ`‹žðŒTµ…+žœ Å*(kÐpØ µƒ†Är–ÿ¶£êD?ÑÆ©Xüe " +7V AD«3lìÀ£ìH‰p׉i'†S5¾×¤o5îa˒y% KǍA`KN@ –×jÖ#6x“ïQ!HتoÅq1ªˆÿe` €À)Z¯‹¿Š4‡<†L)ɔ$Yjä®ÆK <E^-r9UˆßÐYS$TC¤hÊ鍨™íD&XýÚW1Áj–xÖA^¹*éŸx𭰌£šÖ§¶†Ï‰‡„‹’TRQcTZRRsç\œIkq_s +אØ#ÞC¯ˆô á’5$™Վ"‹ð +א¬²Ô¸Ü£ʖ[w8w욱w«>ÉÜèÌ¢ìÖ;u¹Æ©5µa¼:Œ×ÔµøµäW‡û×3á}*ª%båºÌÌØDŒ"Ëdm:æ„SRÍÊ©;(ÂÍ1Š¼Ê‘)©UÄBë,ŽP˦ŸÞ‹Ær°fÔÕn’¿Ër’ËšilªŠ£†Ì¹u©—êŸJÄÓzч¼±*XS±7»L¢%Ö]Q+ϨKi _‘2Uœý@üEùWõš«,ώ¢RÈIÂjè%՚¯µ±Ëªêô·ú[ªÌD÷ž4b«(ÒQYÊ«·Pʯ;êK>ó¥î&«Ü‰9[Eô j¬Æ»ÞDH--è«V¸JªØcYõœžSB>ÎTY2-`M0Ö;N:(æ~Üðë³KD©sÚgœ”r6ET,‰²PlöF´M!TA%œZk†VkD;­ëÁhlSkKÕvZ¥‹:¥Q<—ÄHФÑ9E Ëu&Ì} ËÊIBè¶B›Ö± +ÕÎMC¯]wuJMÏÂãR.:ÝÙ…̯ðuKò•èÊÜՓ_‹]žµŠúè+»^¯Ï¬f„ÕúH˜­hCzUM—hìoÑUk<â?Ä+ò¡­óÑÈöõ-½7=F£¾Ýpù.'7Ôq@ŸËÒé‰8_m¶S* bQ]¡œ.-%Æ2¢‘*+§Ðìj.1¦rA“…Ò¢™ÞϦÅӄ?x„²p¦Sç,ê6Ëä—O$³Š)q×ô7¼§Ãe8Á¢˜ƒ«ÂD±^V'r™Žòl]0JZ©E«¢…¢’„p•;¡b1d¿Qd&¶'âa”Ý©½6Ý&¡xi" +²±ÑõžÅ\¯’DtZòa¨,Ä"V:«ºX™7ùÊ"Gæ‰4RO.ÔÙC¬—Q<ÄPˆb Þã)~JH¯X!̐ ·NXj‹S‘sòÖ­ÙKäz}ñ†^&bx‘Ãk ¢1±û~šqM­ê§¶ éJ6B¨5³¹‚шº/K=‹62žïQÔÁJC—b%R^¡DòL„æç2·.mM$‚¢¸j”È&F¯{§ Mäۄ¤‚‡ƒ‚&yÕÍ«"¦x#xVõWákjZ‘š–ŠzÁ-Ì)’μÜ*ÞYHLZ™É‚‡ bâÐ ±ØM¨E}ŽtÿP¢&"L45.f¦KéBäÝ ‘¨cD¸ÙO[´$V ÓTYd;ì:I·IšŠ 9á²MñhM1fè ËGúõ=Óù4Ɉ=sŠ-¸ˆÔÇ”ïMšo–ßj•G!,&PìÕ‡R<*Õh”U"/CR*ÙÕ];‘P=_t.5‰ Q‘ sÜMÅZñƒøŽ|ú:ä†ð%´Æ&ÈŠÖ1]¸X¯!AB¼”§z¿"Ë&†—FLъKÉ?S¤¤î&+H¤VOe¥é‘ìé­ÄowöÕ^÷ëª2 _ó©u O*óM£ûŒ×¶BÜ.*YNƒBb]™ÓhÑYþ†™›%Ûa*‘ù¸ŠmjdÊiIҐe±¨*-÷RÔUaº.ž¢ S!yüÌ#UÆBhbdfM³b rE_9Eºð­ˆ˜–xÙZÞâÿ+\ô”\BeˆÂÂ+²K6Ž°ú”¡â°…AQ2Rx⚳ >KJ\-±È')M¨iB…žðEâ°:åȨ–}ä]¤ϼU"’Mô iž¹H1‰n:’L¹Dn«šöüŠ‹æ/t +¯ËtËb&´Ôfò#Oă1aƐçhÚqÃoÈÇÔ9h5GT ‰ð2s*ñà¤U+u|ѝ§FóVV¸(hæß +܃iFñ-ܧŠŠ2Qø¯ ‰×-ÊH~3cÊ`àÎ+øwu¼LlíR÷· bÅÊäw#  &ÚÁì¢LEi“Æ ­ÄÐOQ礍C^òÏ+ÜϐYcDeƒ¹·LxfÉX™ )XòbQŠA+ +Å¿ëGUÁWXb þƒ7#ÁAeZlAI&L܏EÖSŸ]\QŠ˜ÙôˆT"PÑ˃5±ù«þ*‰‹EbÆ"6 *âé?ƒh5:¸‹réEÁ!Œ=(ìRd:ÈàcX1ŸÐ`ƒHΪ$ÒDÑúN‹l¤ê‹ìrÅJê2nÄü›Æ‚³)Å\!„tPУ,ŠXß%LÈÖG!D¡Ï]†iz$œ°¬ŸB +‰ì0!‹üPNU ?¢¤ËÊ©-Öò¤÷¤™Y•$ª9GÊò‘EÿìÆbMPǖBƒ8'јÔݬi9íÌc*Ô‹ÈBM¹,†!Uî,FüތæåLó'gÈùˆØœ²ù͊X^Q-ÈSA%­Ú«Ak¿N†ª«Û/ñ)¨XO8sò2MKÂË^J~ÂU"#¡ªF‘ÐÈ?Š‰ªóUâôgEï鑓Ùkô¿X'.s¤mÂEÖh1¬ªØ÷4·ŠS +Ú¥§rAR5ëç«êEM¶ŸÒº¥É”_fI¯¦ìÊöN†Ý8ôY!"5/nΪÓiS2µR © `]FX¢´¤ìSé´ø'e"ááø)%62̲45øžS© cg-º ÇAÞÈ´8 'ÊHˆ“MSƒ’ŠëäÄv D’$d]flôBÓ·P +D¸8¢ ý·'ÑÔIRV¢—!oÖ+û©ñˆŠž(C¶QNU 3„‚wˆB¾LôÏ:{YUÅÜEBãªÐp¡†T•9B¯™–c¢ðÃVy“,“"|'"ã2Ëù:É[AÔ}TžÆYÔnLËKy.ˆbr-ÖU$6K¾ŒHhÂÌËcæT†™öO§9$uFRCò©ÒqT±*Š$ I¢?^DÄ© ƒ;‰¤¢Ì'撫²³6å~i+ú. Z…ªaE?©ù«. ,J¸ú‰¼¿zQƒ8Å +–.-–Ãd×c¹ÆŒtŒEÅ ±bˆ12Ÿs¦UôΉ‘ åyvØ¢èã1IHˆjÿv-ŒJͅ¨(!j ‡eEkõÓ  +ɝB…*¸ßò¡T]ÞCÒ¸Ý(…}´HÖÂïP9½˜dIÄ@ó¨#èÄ¡ˆˆ@u(U5«ÇOž¯´Aù¶ÅÊi„-¼Êo¥ä¡–Õ½D4¦¦q²O³}Âñ¾á½°ÝºØˆ¥4f¨¿r ušU¿•ÔTÜò…ü ªRgˆÛtêI]R‹ՋA4Ũ¼G "¥ª'ù<*¬¨ÊQm#êR.Qã£y_â5T¥ÏÃ҉¦¶:zõkO +ڈ‡4ýµê7»ÝZ£jª†î£è™:¥=æÄa銉03§Wz”JȬÒ ¤DâTÑáFÊø"ÁÅí’¡²þiÕ2)EOLæŒs‰Ž©¢OLäã¹k†j{‰“£ӔÏM/mÕ¬‡I¥ò§Ú½–•¸¥KƒŠvïb•H ωª<ÒØëê©pZ½¤‚­Žd§™í¾˜=VD1k”¬–~›p¢²Fˆ´E‘,H¤‚´ÉêD2vøÐ|’Õ4©— IхU‰Q¸ÇÁŸà»³ÐHb¸ Üo@†âq¤ˆD.YX2]ÎÉ[—ˆsßTHÑhFs³:sö«CB!¥“ÌTTÝeJ¦Ä°-ȑ0mº]"E¶Øô¢k”Q͈«CR—–HúŠLM^²*ŠË8ÄUB³’ amhSIBh0ÄWµ³OŸmz1"—âAìó#bŽ¤ÃÒ¤óY(¢%AÓ3[FDgGA$-ß^ÍÖå ª¹YL%+L‘¤•ÅR¿]úmYÊƈ”ÏYۚãò¨ï 49ˆı©:‹ EДLEBŽÒtTSP—(jÓOÝ1"Ó~ëÕôÄ-RlâªzÞxg6lXF&ƒ ú™<“ÛPÞhV÷ +bQ{¸ˆ˜03°ÄÑ':$b,¶‘1¢ŠH.†Ö +rÚëÍÁ•Ù…ë$U$çIŽà8.ݔ_â‹Pe¦u­3ŸÅŒ£^…ŒC5t¯vý´¡Õ„3ž¢æt¯AœÏ4t‚,œžS˜M,ßI‰ tòøCîyšÉOUr*’KъXò‘aŒgH—#Ë« ªæFf°êô\ +¹ÈŸ`PLº¦.å Wá2"óOõë2ô_dDÂËT"6-~’QÕaFxD!þ”=‰!ÞîQ"Z1Cъð`<¶FGÐõ8BMyL#ñYK¨¥$+‡„ª\V‡ËPïÚVá2˜Ú†AÀÎ%#a¯©ºÌ£fHF$° +“Sê•’|44—¹xtþ! © +ƒbBRƒÔ°ëIȉ<¯îuØ¡èQRÅٌ-2ä)LÛÆT¾Ì™j¼¨Ì¢ ú*éªøx¼‡fÆA¿Ôf~…F/@ !dBC$ʒ<’…C¥$£¾TÎ^odfUR¥ ý\ aÉ5Ç'ã'”Šzõê!aDF҄Qÿp­¡”9'*äKµ.>Á}¢™0[ÞI{tªæ£„e Yâ=B‘ÆÃFêFI^Ó%fó ֘æÄ µ××è,5Øǃ£o–úb†Z•@rv¬áb3¶tDQKqCb^¢8Ö¾kb!R™ú–’uň"éî¨knxQydUܞµœò9Æ<‰:§T¤bČL‹.QK¤…CŠF³ÐÄôql|F,œ’a©½nŠÆ¦™ÝIaœ©‹H‡µa†u_ £˜”ÄP|d¿HX’Ȥ͌çĜÚ0Š8w 9bjXԗ/§–ddÌz„–ƒ¯„FJ:ýïøÄ>W»0å*«AÐf„å†}’Î7Ñ¡œ^?1EUR€(HÝpV$1¡Æµ#R—‘åjð:c™Vd¤©¨“ºgûB¯>NHáGMûªñ„ +Q¡]DȼccE39UXBZQ”ÖMk³5*@ ò×C&ã"´y ̓ð<'( F‘#¢ )™T5”ò—£"³D]™ Ž) +ʌ£L0è呝U”{jDQQç,È}!t…|¨4xºÒœÎà‰!R€ ‚j#*F7[ÔÝLÌ6â!c›HJ’:¥*&*$ê:Sô(<„Š×pªU8mäÊÓ+DOݛ e3—žÌ ¢ÐI 0ð»8½ezɘä€MÑ(Ù!4NQu&þ>¡ª2½IkX§Ú‰RZ‚°¢¨ædŽô–Wî”sÏ{ò˜×Ϙ‹<…|î6eSS¸ke6×ß©!)°©q]¦ˆ«'ÂizÉkÆ°ÊäéB¹xËtj¥ºbW%-K‚R>$ÍŽ]?1RÉPÌ¿®F³z)é6…ï YÈtÊÅjìOт[øžÔZ›üÎ +ªµ6²hk¦Ëª¶ +¯­Õ{x­ó!]°WmPÕÚ\WA´‰ÈÂñ çR„¼8R%p ږÓtf]‚] LGÈ*„…Ž©µHɧ“[/ú,˜}M«D +mòešà·*¹ù‚A2æ\mhôoŠrmi4:))>ÊâÜRdQ[¥¢2HaÜs&ÓÆò–Þ‰© +⚶·4ĤŸj6žàn¥øŒ +·â­ÿty'œSz›ëT…SƒFêµ±¯T8‘ÝÔåª$ªn'2¯!xç³¼n pðTj d{ÄR +°~ÃAG  `hÀ`8 8@Ѐ@(@(I›ºaˆÕGшxUhíŒòÕ¬û›áìzõu\æ§jϖõV|ùÔëázmP$|]I†ÔÊEØցz?™"lf+éÃص5äÎ*$„m˯Ùx=QEb¨ï²>⒒L¹ÄH5ܜIÍ-…r;¹ÿÃïƒxµ¹ó +RbB¼ȶ<¥°¤™ÓÓ¡’¿ (¶ÓùF”Q*ý ·&lâUíȥ㠚^!5n$k¯¦ó@·ª¢Ì*†áý‡1JC$†´áÅ·¹J}&Äø"!&ˆDs¦&8dCóèbê7G]"èŒ*UªSDåÖ ¶6aaÈ÷z&òj‚0¤h§ÆÂWÜ;vÌ5\ŠF^6â!¦‚¤¶WóÊb!Š:•qHuR•“GðßîQ錇S¤TÙHŠÿûWôä,¨Aík!®X#>ž8b®*ø¤‚h„Œ†Dìc“ш}enŠnÉˎzÄ%L7å9ÍŽš ¨$Û©F5q ®[ÍD +²CæÀzEŠ{àU²tåºKDgäMEâò‰·Rz˜Cm8Jõ?¾—å¶8ÂÑr‹P1‰àÏë őª˜hUÆM¹*>žPԆHbó¹D5`âEºé,^W"LÆÊáC!ËFffŠ’ÈÃ;h>Æ<¡‘x-ÈÔ>UM´«*[/‹æ)RH˜(ŒT?£ –òÂòè 6V¡«tq˜ ÃÇt¾{}¥&q?ªª©–Šæ3ý-ugæá¾æ%¡ÊFéTà„ǐ[áöØy‚áb‘ÚÝfR6åTœÃëB„Es¢¹³ +2CTBE´jbÄôb}„ +×$µŠ¶Š„šS_.©(ª€è†L©|e^þÐ䓉 hN,¢±.юždª'q|{MêÃ÷E“¨çdÁW9(e™Ày¸‚öÀ@¿*ÅCQ¢ˆCÿJ‹(êãƒ,b âËüÐ,!sÃo:ŠÉfSˆš?![ëˆã áF£Çtœ +,g_Ðlæ©IèЋìŠÔ£ÅϪ¡«&1D´@æ"ËpR;qôY+ãuR2 4ðhL°hê"ŠYhFJYQÍ )Ìz9=¸[V Þ+ˆÏQÇ°È9B1ߤ $$ARfI߅öUÑ:³V•¨V‘°ª¨MĨSÄÝ#£ºò ®N³Äg§yãøÈGµ êTÕÉ<è¤Â‰SLɏ@iDÐÓ;èKëÙÙEö‰C½Š  5‰^Žc4­¦“¤>;OªwÅÝ)Ék$ö¼M=d‡ŠJU¢1«áL7ÇÏ$©"JBÆ­_\%Ÿ»ØÅP尊f:ԹͰ‘­J(NaÂÆO2Š(JM¦’L·³ãÔ‹H´3Ø»C›Þ!làDc¨lœÚîf8XýSQBò˜ ¹hµzfS B6Ä`­Aÿ§Ahê!¨wM+Šó7ÒÅsÞP,IK©<’ŠBŠŒÓo­Š®a‰!QD¢'Hˆ0Iø/£Ž!cµ¼’"™‰Ì$BjABþìOÛW܋¢KŒ/#ˆ [hNá%õT^£ ^:éËZLl&j¤-¯QG5Gá‰ôáˆH.5yEùò€è“?âØ³j™DÁÒ?ÜÐXú¢ðÔï¹_òTI)„ˆÁ.Tb +LŽÎ L¦rMÅQ4EAV Œc¢¦ùÏQTÓ¸ÿ4+nöp¸˜B¬¦¤kËÊ8J ygˆa†Ô?ž ÞãGjÅ}BQ§ŽÎQš¦êÅ[kTTF¶¤—­ 1Abg¥‡ 1<¾ÃAA*% E1Ê»‘šÙSù0[c}Dl¢žŒ=¬M>â µœõ +µ-!výKÉÄ ™ Z(ªÑL LÕ}=ŽbÔçÑVMK•DzÈs¡°p²¨$²jöU Ỳ³T ˆD"á`8HšãHþÄ@0 ‘FŠ(µh€A¶…¹È„šƒ4{îÊ(`²¯F¢G1}BO%#žó8Vm€*>2q¼Üu8ÛÊ*h©­Ã9–6AZg«P˜z§KC)„ rþµñ6žŽQ³(—ô>áù‰5GµWGêcßfTú'"$‡/êoC¸IRSs…èT”ŽNðUFðñßAZî¨|ëú×'#làÉþA%ILv +vMýŽ:B“Îqç+0ê ¡X0" ´¯)3ÜûûBsŸÓ±@>á'Qjã‰fá"JÄäNE’Lr?¯ÿxïƒâ¸ …“i`àÂQä"ο|_ZMhۉÌèysbå8¬\f‘õ¦T$˜ZITXçYº U=öƒ‘ÛÄ´Xÿ€×jÛ(VO“zE¯§„§‰;‡ß„㹏œo]6Ûq­želJ¸k $ìæB{btµ˜$2ÁMƒw÷™üÝ]û—¿¡ÃçsŠNqOÖM•5¨*ÌVâªLq W‰ šëj» ð‰–Ài喇Sê<Æ­ÉBK£él¶~¸s1 ­£,)¡‹×¢ãˆuìàƒüQ +Ñf®›¬ ¥Œ‰6Ö1±–šÜa‡hƒŸH½wl|Ã&h²n¤¤@ï£IЛÍP1ž´òõã>q€¼cœÝ½ktœVSì¹úµn‡•SP¯ ã¶A3*‘@/ãÁ§™nLEâJÅÀxŽB¦ ùŠ‰¹ªÇp¹ÃÏäÜ5 tÅ ³‡Þbù£+wi2bÌz¯£évEÒC·$“,'Y@ªò ۄ˜ptDìÑÞév>Ӗ5jâª:ë¦eqfÜ곊ÓÐáîJÈáÒ¢`¦ÅÂüƒÙ2܍íd“%ï€bÚî· ¶Û©²Üµ^¯©Ñ ¤’G?Ãd”.ܟDÐ?òÃTß³õ¦”ÜX1·Ït‰H»+5›ðúôG@”XM¯n[+¡ë¬ã§ŸøUò§í!~­½W˜q`ÖIMi '4mqU³[å›l/f”¡q·ûésªžªž¨'‚ÂY@÷Æ+tžSŠ†¦ªäç½z)ñP–[v»À9w;9͚OŸB7¸âr%ó6Ì0¾ë ™g ÿ$ݒVîKמ¦4¼ji™¨úåöµZzU!a0´»U±‰M¤tŸW ÁŸÌ”òB¤Ö“1gÒ®{ƒ©–?–D½ìü†ËÊ¥|áUÐ8Wø‰Ÿ-;,ÉdlCäÙ$s!‹asÜþ`#µýT‘‰Ô^o&ÍöX9©½¨”§{uvª9‚”_Øq7кۨŸœ!”!IfCU‹Ýk'è˛6— ª†‡FDn¼Ù"Êbl§–¼1R|¼ƒâ#…†»¬0h,¾¹f­hå]ö³¨ST(¦a ñ–·}€n8ˑZ«I®Ç,À¤uë–q‡°©¥ç%ÛÚ?âÃ0’«nÃIè,åŠ ôÊå•\Ո†óóTÒ¦|=v&©Ú¼¬ÂTÔ;]džÕõcuY(èiQûAš{ýž¼_©Õ>gˆƒœ¹ñÛÐ5~¿Ì´\Éf[u}à¨Vùo Ágñ£«žo€‚¤0ئVÆ>‘HËú?‡qšÁ1ʳ‰0ƒð\{{ÿ’’4ð ÛzÔOÓt"…Ž¨¾JŠ×¾_³!y+$)SÆÑBèÓl&fA[!¸ŒbÉ=EÝʧZOÑSöŒ\Âög”¨MØ%d@ud­G]¯¥¯»äé-4»‡e¸VìS¿‹“–¡uüI~ð‹=Ò —íaäû™gFM¬Z&úø²!G‘Á~|¤ÿà=Ö¡”˜Xö‡|tEGÅ œð'¡-WõW6®ÿ»Ã5·º¬.ýú`M‡ Àœ[¬ Aȋjc¦nÒ?ÓIP¹ôþoMœôò*r³Z¥!œR=ndtzÝ‘a/s1ÝKᅀiEƒ´]Ñ ÓëëÆNæï³î¡nQ •¦Ö>pF{r!–9NËì +呫3±òæ(–ƒƒßh6a : +È´qðj~©ñ]Oº¦Àƒèæ h—Ã[>N O–Ó¢˜Ë€Y=Š¢Ò(‡§M&á‡ÃÉÒKIí°ý¸Å§„Ǹ¶A2»:O£c‚Gy‘–_m¯ Á +VäKìˈV”ÔÎâºmçs [„Do-rù—°`&Àåµ \c+/‡3J^Åô–{’PäªV5£’%U ˜u6kþtvd›³3þ¨ Yn?Rjnûp.ð› +zvíúlò \Ú/½ƒ‚à} Ï¶’‡T4‰GTH©­cìTDÎecßç‡hLD°êžÝY ¼è˜rë^4{n;_« ýOïþϝÄyZÁQì6fT´®™‰¥"ò˜g¥›×ŠóúS2|‰ ø ÁпÀÎkr‚Î+ M,ôé(õrõݓÇù¹’®”H¦L~K=¶S‘폕¡iNJ@󻁱®T¥ÔPXžzçà7%Nªz϶^cÝBªdK0FÖ%¯çzµÔ6kñ;e^¶ÆdC–£](>ÂvJHF(3]ļ2…›ä ±…$³Î}A$„ߥ\ ¶Ey@Û§Ý;°æ +Ç?à'œ]]^õ†¿6Þ؁–«Oœí@0§»\öÅűõ®z€£nݼ•ôq„uæñtI¿sê2AB¶ýYozÌåæÑMÛîW€Æù¥â9OŸ ,ýTqô ¯Š þh‚…™Ôg'B02„(£T oΉ1cÂjTäžæøÁ ….IÑèX¶mS‘ò7é´ZӁ>eC.v@”JÃ:úšÕöþ£tM¶p’ºÂ`̪“'¶ž.¡F¸8^JUašŒ]@tÒ/™å؈ªµ"lÜ­³¢Õ>ˆ¾ÎÄ\1ðŒ #¾Ÿ¿*ƒëš›‘ÝDÊ(ñsŒ–{ù>kâÌð~Iu.~<"=+"«³%ü“y›òý½Jze¦Ü°P£æãVßÁÕcÁ£€° (ø¬¥ÑÕ“³~kHs`•€WP qä÷õ;§9—>p8‰$^Ç`J›¬)ƒ ŠœúY—8€|°ž(Rz]2Poà?¾—Ñ1ÿò}£¨hôÉ­)Õ®– ;þsyb3ÞWRû7‘&ԛ#>Æ õ>þõËÓ8ÿ) + Ì(s|Ž¼ ílãÀjå‘P-˜ÒjviXùØ÷v}æ—öB’³Kˆ Ѹ¹foõÀ°::RÙ¸c$ë¿¿:gg6þsu\ÝÇMO›»Þ9³éu™Íe]4²Ô)áÖOéBV%èdî\c e®dcƒ œ"‹ÌÉ×׀Y<òp Îúf}û±(‡A ˆg +wÖh(Ý [bQ´îµs¶xûf†+‡0 ùʃpîö޽ء*un[U¯×µ{싋”“ç‘Ý!€)—‰þV×Oœ]ÑÍøØ!1éùo2å‡òi"sÍLdÉÑ7 5«ÙC9ÆÀ'°ÅßטÍ6cà×>cïn•clb6 ¡Â\aªn7ê…v'zå\{@ÐMºìÐAì6G1„ÍEmV€MǀtS +qS®AXFÇð¡›!Ÿëê²Áæހ˜ì]×íÞtŒýä,À˜¢WÑ6üy‰•ñóM Ä|<8® +Sµ\ȳQxX˜†¡×$Ÿ³¶"©H_ќæ‚É·M˂)¤¯cŠK+^òRi¯|&Ëj òܕ 0`Ósy鍑-åçµÓ®1C›²á0žõ¹Öu¡ƒ×Ø8†KK¼]’V†é!|  QÕb¼±.NJ´í¦c`$‹Üðf?ĶÊ1n%Gj& g/“ 'Á3àÀïG–CJ~Ö¾LA«9JTj~j!<¼^æ*Šøõ7Öùˆ‰ŠC‹uïÀ¤ÿP­Èzý>Ô^ݾäßÉ hÎLR3…Yw°}_;š\œÍuVw²Êf:u—¿ih`VóÀѦ#‚wp"EZíæÁÏǂž¨^×æäŽñÓ4¬zu tÀnë-¶61ÁÐ΁4¹AWðȬ©’< dÙÏÒÌxFýQŠQ?o?J¯ ;ôhesW×ÓÚv«°Q=@øa­ ‚S¡¥¨‚¨h"`R§Räß_Û|3yÈ5_â@x ¾,HO¹es[_ÀGä2À–Õ±Tv„F¥&¾êŸs1wgo/¹…5`åWâNÅ¡+×Ý¿dåò̔´!¸e¤x`M#H‘C†dqxG{X¬±q’ºŒtk£ƒRѧõnbH­ìö¼Ø'¤ÐÂq=üëÔù#Î £Ïž^88CXõ¶‘ +ÕòO´7‘£^[IS3¶ä1Øí}˜UÄ?(ÌEMA%“re¯Â[AF…Og«v‚wöR½³I5Cµö¿iý¡„~AîÐÄLç aš#è2u §•gHyCmÎ;ÌZ­7`ºC1|[s8]2KŸR2‘`F…Ñßꯐì'ƒ12ªK{–`:,°@fK꿶âô+ëQÊIïBwû¡¬ +ð±DìÀ ©ö3jž …;"¤üßk:*ŸíL\Fã’ézrùȋ÷?[*›¨žÐ(ºèáy©[Úë‰ÎâÁïB÷œLÂIõ·òê\kéC°2 ; èð[l2»’-#ùXgb}Wè?£ï‘2úV¢Û'oƒQRú/ @œiÕ(îœXj„>ïÔä눌}ѤÁÛ ÌV†ø5“᱓Z”'råI^¹ù¦ÍÇoþPÄÝ1ú/ÚÒwY¿ïåæ¢Æ.lŒƒs‚/úüv;‚‚“lK5ð‘3]¦.æÆÐ h©ƒ>cómSN §y}»s&â"g³õeFbç¶aDº¥Û˜‘0Rì6¤t'ùÿ0'Èb{¢¸le³ñ“ySe—ÌíLôïD”Ä_¬ž±ÂNòw)ï:é¾óÆV€p9ePšøò¼þ L»ÕĦö§<ϯÂ.uIuu?uÔ¸ýxmK¼/žMúƒ¾#Ò~¦gÀnXi½qiUî¨Ë)<ÛqŒ„¢rIÄ˗âÛqµt.¸ª1¤PÕFs*ãÀš<¿dš„bîNäL~¡°íeFÊe¬-7¹Zý ^ŸüÔÕkà]TáþËqõž&T`†1W]ëb›)÷Ìo܉¦dåP$FC°2´1µÑy)ùòM^æ<=UÅ¡×ϝ'…À®Š±Ÿ3KëhÂîÕH4ÆyÙɌ_µ˜Mî:Ï㔕Ó3O‚W´ÞJ8»Ï®iÒ]w¹±/c¦,¡ܳž›NgíÁ«Þ†áÔ¦Ñs¿þx¸ÞÍzø¤ÉáT4BÝj´Ðû¹Â®*ˆuðÚÐ4D\óÃ#]¹L›Ô=\ûE‡”e‡–áXd3ÞKéóJQO“÷FfÛQ4¶ „‡…'&n"SCI™û' ÎJ[5B¶ §›mÀ†Æ8ÍÕ·Ý%ÐúqTüMïÂvf…’ý—,< +¸²ÉSsnÔÕò´q)€'jÀ|˜£T¹ì4|õŽÀ*8 bmöºv—ùŒ¾ÇÙPx+R!YÖJ\±É™÷ž»ó•8¬a×¼¹ jÅ·>k³%ÃŋåRèY!Iüú»—ͱGžâ¥J·4Ê*Î{VéA?çVèmm3éØ8ƒÞ«4][•YOà†¯ dæºà›Ei·F)²æMºt`ÿ\†/ÄþW¸vy Qªq(¯WU”±0k›®)É5v¾Q³Aêèi'.ûöý4g7i5zÆ?¿¨7“·E)ö“]Eü6Ắ΃ ê*š„ì–b}Ei\ÌL´.¶`\ðë o«bÏ'Cu–6>ÐF7b5·9 fýl@ú ¨Dʛ1Q«kÌFٍ fòºzß³sœoˆ^­ˆë÷/Š¯œŽ¯=‰rX^ªÐŒm +àxå5˳n„èÏAFî’ä0fÃp}²¾ Oà&0YK™s™‘ +-ƒAÞé÷»zãU]EÌƒÑ ý ŠÂpÌÙ©âã£¸‡ã¢æ[‡.ôÊæic5C"a•oyâ1^Ÿš–nš¶žÔ´³qb9x´±)Öe¹ûÑ¢HÔÍ¢3÷Ðã3…öçP?g¤Uu*lÁ»ÁHíÙW ayúÑS?hÒH vþù«3q©Ð/~‡eZíAŒ–#È­fó)„`+š8ѽˆ½ØšqMé(dm(“5ðü`[aª³—Ÿ8žß1a|Y +›d ø}òQäUUxµèÎ-º)ŠÖ'wo%¥,û22Ýkϱüà¤kžÒ¸½bJ"½½›’ô«päq +³ø1—òû¬ŸÊqZG¡§§‘iږ–Aø¢_“Œî5¬{CÌÐ𶎀§µ;i3xC¸[  ¿…õ9T%Ì|ÐìO¬(ÄJù€N›¦ùb+vYÀ\êCãu8q#¢ÿxÉÝ«ä¾P¹ +­@뵺måt0-VT¦/ £<²|ÁópU$¼!…2ûëV³6ºãvû ®Ò×xêSήÓÍäRÀ§sò’#±QãNz·ŒÏYP (mÿ†ò£”O¦›JY‘/šS d AùÓRæ‰ÔÓ³èt„nov¤“¡W}|þÓ¯@x~¤÷ŒúuÈ7T“å0åDgcW¸Ž›*5¡ƒ­f»¥±’¾ôœ8Õ¯c«È²³Y’äe!V}GÖβ½ÀéÌkuEvÏEiÓ ¯v—¢]S8Fkq—n¢Tqzçîæm+{6Àÿj$rU¯š¨þ>8aд3"`’,EpÖ±äö=„>ù×R…ËŸ7A§!z[N1Hßì#j¤)ÁcûQf…–:ñ‰SÞúѸ›S§d!ļcË,.«»epÕ(Ž"¾¶·æ›ÅÐïSm"ãÍþ?ë5:%ÆŠä[49´dã$¿tW£—¾ôÈe<•h¥›‰òt¤DÇQ#ÅëÄ1Eb AW¶›Å|ĝ,ôdeÁzӃ]¬tÛ Ï(èÂp<„¢RUJŠì¬î†d ÕgB–:.C†ÉLÕ\å×0YntJE£¼–»ŽéVvî%`kr(‹mÙt ô+Õ^Ü1ܪó“]|Z2lX¡ö£ºÓÓ½£xi‰u‚¸{ +ý¾hãoB­3¸ê5)³tTcÌCNÑ5v¬µ­µ;Ãõ».5ñ0‘ÊTvfÆVâ.1Ù²º€ÛÍcÊijz7~rA¤`MJéñ;z}̊y¬RÆÏSÝÇÁ¥bƒoì]‚“ïùˆ¾X{RV•‘ƒEM™†Ñåùý;í<*ÙýÜl±2ɳ€úMû’ZCòJËÐFe;,ñÒc«²„ƒÆÈ¢…qÝØûÁÇ'B4fƒD¶`È£‰JZ\íSQn8FKi˜`ÛeïžÁz +¢o"¡ÚLק€®q4ùœ™D€½®D1» +y¼Gÿ “ÐÜmuXÄZžÖôÐ9B•â9°µÛNð‚#°n‰~…T~-Pv¤@§Aœ]#l¶¾—‚{N¥2´™K‡lŒXl„_ò¾mï2€AJ6a˜Å]]ðnÏ=6ô’ºlY¥æ2†õÒñw\9+¯ ÉHÝËOkê¼°uÁ´¦ƒÔêBiÀuÕ{íEÕåÃL»9S_O< s°Ðr“[]ZIw¨w-»k7¢³‹HÁ­öª‹ª&\PµÛcQ]T՞>¥³¼m“Q®LØùí´L$( ÒJ†2»ù!ݍ‚w}§^ÕÅŊ£ëWé¡.ŠkÀÖµ]˜ÔåèKúyzäíԅ`œŠƒ‹Yz.Lt¶ºØÕ-ãÒÜ=êL#šºï¤Á +~uq‰CñG]¦½Á*t3¤¾ºœ¨p³àؼ®œ ¡™Úè5…ôc/÷êRxëêýî¨`À¨Tßzÿ¾º¬¿9+aÔq¯*m¡-| +uÑ›i†) L]­v9Àãîà³@xu©~ÓyÖæÌ°ÜñŸ,ÓÍÀÕå¢ðrs`łºT T*¤.ÿþñòT¿¡.S¡åƒߔA-´'î$ç‚ÉÃað.¬€äI­ÒÉ­pu$'ɺº|Œ- ‘^³î«ËfŠî’ä@¾wT—½˜½5ëpó\»|äH®¨îëBÖ@ЯZ6ôøÇ|“xG‚Æåéá6öΫådQï³éý+«ÒØ ¨Ì©N"†ª»°ZÕÍto¾YѨ‹o‘Šþì…CZN–6eqMk´F§C+"%`†jøœV5?:Põ}é–.ŒZÖDó –ÿ…]RN6Ï8<Ÿ¡ª²j†n¤LoJ"rc€ø(IšËö sE«Šõî?À‰:™ "ßvIY~šM,5¶¥ò(±¼azãÎò¦”eoåüyÐÆãjm+–ëˆ%ü+jP½ˆrr$S€ÑZV»›°“¾0€óÑÕ®)³`"÷lÝmÚÅÂIhs³Êž:q93³CþÿHÂ"›¢ªs¨ÞªzÔÓWW¦%¦Ä³W¤•÷C‘>̵ù났í0…_Ç;7¦]™!¦f€»¿ÐǛ÷{ÞpôÒ60kX’$ lW+}s‚miµÅ÷Ðõõœäv´çPÓ*ÞÿŸK»M6vl–pܺPÊÝKëtÜ4ˆ‘©j fãkْÑSá*<6¡P|œð&~ÂQ©qysã|Mñ+ÜfüAə*áñö%ÔÃ˂U—¬.=GsÀ‘¤í3Ͷ %‹ðî;`À…4/[²Íæ&®“¹ôÉ jۨ؀ñm†tsÌåÂã Ä;l<ÙÎ5—câÚ§à¬/nÕßcN¨ô|™"@€ð «çÜe'aw­vÏ4iÛlz‡š#26À—xË{ýÒ3%6%^ü˜ÉÒ^ãþ™ƒþUî÷ÇËmY%Ì)Kö®Qæ>µ# 3—{Ê_æ¬À¼séµwh"[÷¶òéáßЗN®S˜¦þÅJ¾˜»m™úœð‚â&žYW J¡d˜=ú_æ'4á ÙƐ2_ïSCAdž‘oà¿0]ÑRdP™&ϱ‡€¹®•°S{«—E‹.?_àËûGÝ°LÜßóŠÒ£)äášúÍ©°c†ö¬äp“ë”ñ…>²Áà 7wçX“×78ŸEÞÝ*1là¥Ë¢'< ^¦õ»ÄýŠK÷œKê-Å(úI´%f£‹+K{krӑËU¬û¯§„˜þY–eô²\&bW§†O9¨§¦Wù/ŠÃ…IÜ4, z÷ôšhluí §Á +÷Šâw£Ó¡ðM4¨÷«2Th7AX3šl–g¤Fˆj³…f%z&Þ/\•ŒžÐ9'Ž~Ë}ª”FG)§îò1áì÷I­ÚZÇ.MËæžSÇ3kü¥%æ¼ì±G¯p¨»6’²óf-c°~ìÍÎ]L®á֌'µ6~Zïõùž!Ûf`¦}--ðˆK¬wF l? »òÄg­0³yÐkÇ@°wªTÜ<›@•vÇî¢Þ0…Ù/WÞ#]—vâ†ìºÍ htɵv'%ã& šÑÞ”î#™¬×lpôŒPj×ÃOˆ ë‰ììdYqÊͲ?1{Nc̳»C‰C¾Ž¹Ñ¼ÔÇÆl!»]4ù"Q'ov8³º¶ÂM=á4¯aø7GÖ]5…š{\ÜsÍêŒùˤýºòÃÂA7ҜÎLà&ãLJ—y ‚NH«g©¯h”¹ŠE ädD6As *“÷恓Œà®•Ä{6y†Ý ghõ=võÀváÆP;ÆÓ ~·N(©Ø֓S=.vñE¥ä¹Ey·kjš2«ËW°±xD».gÞ·ù‰žä•Mg4Mm~æc͎ð»a¿«íJüæ€_Ŷ©u2UAY6ÁP yË:‚þ¿sçèóÊÌxay”I”K^e轧Î(·ÅŽÍ=ÒaËb9Ǜ̹›ÄÔ¸,º¯FOÄM#MÒ£¿wOä8^¯mÉUv0[%ªëõU­‡;'UÖň‰× +œÃ¸“$÷@X•9x̍»ïÓ4=it°ŒX‰änÓô=—çO³"¶­åÑ +©žôY‡ý)ˆõŠÉ¯Øi0én½dÔµM°³šl%ׂ¹×h ú®ºÂow¨'ôt@}d6‘Õ~†òW×Ç˟þs=g)¨øÝ¢…T2ÌÅlahÉÁ͟8P!n/t¼Y¢Ù€§ēu |;¨(G7`ãšæg :e³RRMú҃”ç¯÷VĘ'‘]=:¾ãοÙË2Ž[,‹÷¥›ZNÑŒ¸g‹îÃcá‰zO͔w¬Xj¥…,ø‚Æ:(‚nšK=ª=}¯œ´e\dlá¨Æ±2“y'»o Ÿ¦•–šÀTÑ×W™•Æ€ h,ÞaAž}×£o¾Ì¥ÀƒŸaɂ9Û4LЏÁ:õ곏§)»hÚwD}ß +–JÀZµ"““úI $ÝØ©áuä—܃Äõö=mÓ £–@_^ì×(Y;’‚ó[™Øàó*– gˆ+È}°uï‡éŽYÆiâÕ¥¢=)°Ùöà‹«è +Xñ"hiDcü“[z| ›½ô¦¶‘®Ö,KKOþ‹ÿÀà 0K™ªÄ"Á¸'Wªijîò¶º'a£Ô ‡´awî5ǂ‘j +{kMŠ‡v9ÅÉðÛ:Y¤–uÃ1­Ó¯÷Y¾>ÀP.¼µRb‰ö) yÆÆ(°VmVx‘ªŠ¨>âþ –ôÃ%SáÀއö¥¾ÍàW…‡#Ü&yÌñ²Ø}J[öÞ +Rl^BK|žilz+Ȝf›aº»}AÀÈn¯Â-% ·Ü±é[)@0¤¯-²<Å ªM5:«ž@@R uod¬L^jS? þiIAá¼Ô$œ.:‚Þ ›úÔ¹îïÀlŒ·ÉÜ¥¨ +.O|)›¼Uߝ3žŒºýí +º7XÚÊD™ÏC蒉ûx%§AA‹kϔr^vº'5€†WÂé¯Óu¨KVÛsb;ÜMÇF†Ç»6/a„3 °I&4é&;äe‘O’Ô‹Ü„ðš)gy7 ‘çùKŠÛ„§‰ß´KöšR4­AE:À6·qº±Ú­)RÉ ÑE?KÀçdæå`Õ܈H¸Ð Ø&]‹¬é·¥Âe ›­¿;ŒL‰ÜYzb±m̏|‚‰…6—ôCëœÕ†4’‚¡{ÓO”™p!Œëmm[Á‘Lªaq å`¡¥ž³]v|¿ÃnØëÒ ‚Ù×ÆZpW¹…WÉߛ9‡Ñ÷&sGЎÐhÅ ›ˆîU“íajD'x¼¤ÙÉ¥£á'ì産Õ߇E“Å°ý]œŠ +ڒ;Fh5Ìo¶<:‏;C§Ñ#ød”«ëÐÑ^ÒÌì»Df¥z¹KDe¡>õe‘ì0`ß:Ýéu{Ð[ª2ێݧÌP™{ªY:G’¶À¡`²ˆ;ôĤÁ~)Êz+9çN¼ãJŠÉ¶v B¥uàÌ¢"õ›0‹üÝpRR±qÊ:¿4E%F5«¹Ðþï²7”ˆÛÍsëBÍÆ¡eÉùFL’bä󺾐°÷Q¡œÍÔÄxn®Eç£ÿ¢ ¢¥X–_mÕ",Gl{Ò.»V×õ@)î.˜[ƅ‡[â0JûÃqÏ@¨›&ÕÝUªY~0Š¢‹%᱓K¿SC鞳)»Çߝqx7ˆª1„Ô¯ÑÏÛ>^¥hlΆHÑ5³Ïð)|Ô¥hÛnI9Ïc”Îx§Ÿ¥1ÓØønþŒ¯T؃<&A„_?EÆù}9—(¼°#Dì5ݨmáû<_BXéOŠkXŸÄÞ;ØÄ‘¡sdײ¿©¥n@ÍmAöz2ðÞš¯Wd¡÷Ð1r:ÞK”JÝ<æŠô°h`“lô3w¿®KP0bk‚‰Sêm&™P.âoDî5Åw !ðb{sŠuMŠ[9&¤ÝsØöíµCõYË!a VD5BQ_£-»\w-Û¤‰[vÌ5¤Íç ÖåÜp¦¸I¡œEOÚ§üúCl +5ýIRÄ¡ Þä6¹(ßÔJ3‹ÉçX@éä+8”æ@½ŒÄ˜Æ¶ðDþa¶žë¬ZãtV5º†þ%êÿ•w!:ÊP¥–6žàrè=6H…ÅļpÏGq +þ•c0NˆRSîH·Vñš³§K6b<¶ÛwtkR\ú.´q»€EÃUÀ‰pÈú»ã­xŽãTLÒWÀDäÕv?ìRõÀ°qà+êSÜ»ì-všeé =Âß©1g™[ã&}œ˜vþ¤q1iYÆ·KG»7Eé[ºN£2%÷¨ ¾¾ö¹Éç­©TÿÔö”·d̐Άºw4Y·=ªßÓ5¬ÂÇËó Q}꘷úÎbë|›X(Ý¿¹d­ò¡¡œ†£Óe²ž¤‡¸O®ý\’Q[÷SNÛè„Ü9S½”¢Á@lkÇÌÐ6gº/Ãö5GÁ£âçàúP ÿµÂ~o²†Ø×9ra(¥çÄŒi†\gJgܲˆ ‹ýO¬!´ €œÆâ{ E'XzÒ*/–ŒäHöÙNc^£m1€å®†zz;Mc9^y‡¯ÀòkÑ&LÞ£&‰3Çu‘6Ü'ÿázˆ/iË«åÿ>hþ¶†Ã`3ÅÜËyÙóN&QØx†"lóa&n#eó\êvIº˜ÃŽYú;†‹e¸¢ð–-2Çd9Eó¦q xœIã§Ü”Î…´Vµ›õ6š²Ã±ÆŸ5ý³„ÍpØbd:1{ïDm k™“lŸÛ<@ªãJ.ùÞéÕdó15ž‹L‡“Ô6âXöDú1¸MŒéú]@E5þɾ;ŠÆ"Ãw“cf$Ö\h€¾™Fz‘ÏØÄð†{}YUUp€\í”ÏJœx¯/Ù# §–n˜aN(ÕRiþýj÷ÔIff,%8߈õjœU‹&yEîkÙHªYYlO½hºñ[&m•Ï µØ»\¡ p1Ê@ÍÔâg²$e¢–$óW¬ @õÎLsô‡xø&QCÑڙonƒa+æNî&ÍG+<.tT2ý´È˜–¬ ‚…5Ïuœ¶AÊJáÛVêçJ^=l„ÅG?:S¦” 5'ÖÈeIh•q1Kr$GLÕo‡ÔåÙJjñ °¢ý\ÓÚožâö™°l‘3Ó6 1|ëÉonœ@þ¬ªÊ¶«÷ ö½ªJ¯gnÚÕhÆPl3qýž¿uúûÉKù©uª+¶°^Ïid:ǜ ©%£ƒˆà؇Үu¤¶Qj˜~—pär<£Íx<£ØÄê#-zñ× ;ï®Ú&%U'§Ö‰¦¶¢~Þ5©™#2VYL[â1SP©8辖îª#•ªø¼Ö•áiÐTQ([V5ºÎI{0G¥ š±Õ]ƒÂZ YÂ;ã×ӈ¬6d0_ñžú–œdƘÎ÷ê,mõKfpZàxLI¤îâC±&!⯎éIQWN&5pðP+;IãöV©N +ñäœë·$«XW%×´bÝê'–Y}ÿ‘`•q1LŒ³™\@_¥àF]+IÕ¢¢Ó"2yþøɳÛFÅ0ªä·o0‹±Áw ÞTÃ6³ƒy–¥Æ²ü¹©Ðíã\·‰d ëDîmR°nKvlQŠ'Õ~ý¨ûQ qsúQ 2ð†8t©ÿ^Ë¥¢×1ÇQógp7ÚfOãîÓH¸Ž|ñ\þÜoçLrÎÉSŽ´„õ‡MÉ/Ê{T潋£ÓïÍÇçŠ0ùK™2¡o.©–ÞÌFHnµ×:Y2 ªH‰Ü>Í1 ö¶˜35£BÁy#¤8æƒA  5¹˜:!JfÆo;x҂|¹_åpØ@«»Ô5×v˜³ò~¢¿Ý¶¢q‰ÀJ"·Å{eruÃô51÷T ï€BÉ@ÿ†Èà”Á¨3×óã¦30æYj¢Zj-“”Ÿ²Ü|Ãç¹3=óÒÖNZ[PÐ#0¹ü—µ ã±íCö6…‡«Ý6@JæBÖ«ÊhpÌ4TTŒ2ç¼H0¬8$óª?š4ò§*`gœ¦´qÒwGÌ0€Jç>WªW®äS&{ˆ8JcDQ¸žUºŽgèÉYÆ݃쁍ƒ…rdJª’È”¹ˆÈÕ×ú(£mõ”2ªMi²†˜Á–S÷$vͲRàªòr'L‡ÙðsJã'Û{KdÒڔð›û˜7¾Z“`©lשî”äô‡£­¥d" ckÔÉÉ&¯î´Jfpnÿp½¡1ùÊëV¡AŠ±Ñ-¹ ‰;í|Ñþæ ŸýªpB£Ž•ÿª¸1jõõ”bk~ô©•2®y~Ž w£Ó‚Îù¿rÏðTÝéŽéd YïE@ÄYuT·©V‰É͎˜‰R`o)Énª§¾!\üÛÆlXŠ + +—ÞOWlz #¬ˆ¾Ã¯ª¿²))þñY+c(|c4ñ4W=S¨žláÆkê‰#8N>‰ðÿ$ç]Œ¬-øñP¨ã‡j´$®‘pDÃ4* [%ÂèAWÞ¯† xúЧ êƒíäµŸ7ŠMŒ¡#"OË&È +#ʵŒþ#^­Í)ƒ]¡JIãüb9ùLD/£ÔY†þ* ‹Ö ®|vÈ1Ó@:Z؛®×ŽºJÜ1!HŒ¸};: ÍHhÑ;íA™ûQÒÐú<ÎOÝ»´,,±šÔÈ}±¥l,žC"'³„ŠªM»öõô™éù…Y€®AšäçJƑQ»<àèOᚠá¯gUö*ÍC9«2çɉ¡?‰ÇËiݔú¹œlìZ”ÍTyiùͧ¤1óÄaÉ:UGV_iÝ©$DV£*4#Ü뽏þíê¨<…Õõ5É„ÚÂN ”N!Û<îGU^ /l÷x0ùWZê”T/òQ0ŸøúúðÖú‘Eö¸m·K…›ºÅט¸ÝªeæèjjGtQT¶„‘t^*ÉëàC=AòuqҎá%ˆåäŸòW·­S×&®_*gJäH¦ê@¡7ªz*hÔzñ vÝ?Ç÷áÄ2¦˜Ú¬XZ’"¬Òy™NeµT+ã_ÓÚìÑF`­¾ü€Ðñ×BnE¸ wPàñ¿ãÓªé±A’®nÅ3D Ô¢2‡h{Ðs=%ŽÉ“̆Eˈ2²KJL êšâ¹–#é æ¬Ví¼†$,ÞA:ë'Ïpy,§p¼©ZE¶éÂp÷¯u[$è¯;K[*ð »K¦O‹ôsš`65 ¤:<¤2~ºVñÓæë :³ñe€b©¡èø_P2QàS‚ƒ©bžqÄ­§»øбöæOœ7ÆÈí‡J$,”\m]µæ“˹‘b󬥮¤N¬[¹ªF¦T“dÍ),,“>¨ÝÕãµØª‚X×Ôð\\g™3ÉÜL0TCžÙd³ ›GŽÝZ¼aƇº‹? ýMlÐ 9)Åùq³ÙlZ¨„ +éäî¥òÛ tT³Þ- w²\ÎA”¨vßMHH»‰ªù“†þ³‚u‰žiƒòÞl†m~uhNð2܎&Ñ:°p‰ 6Š$˜ê:;aãj‡Ý€‚ß”½¹•KÉñt)‘·Í:°`Í N¢‰?ˆ:?µ¬Ûïcƶ&»bØ£ÝÖρ½Ó»6ÇÌa.2vº±„óï©Ä(Žæl™nš^©àräŒ‡ Wåó˜ìØe*©Ðc†…f¨a"b®l€Ôj8Çcñ£jþ¤z½É3«q3EëÁ³ ×ù!}G·-¦ý„œ'ì"*y¤`ܢß¾00Búñ3^½é3ž|UbaŠ '¨½Ï@ù\‹ŸA­v+:û%÷[0Ýd~qpŽ\ƒºc[Úá›ì[Ëpjøƒ| ès(gþ Ñz¨ +Ó~„NâÔîÛÃõ¨‰åŸ¡ LöT7#‰HìC}PÀÀÖñ/\Ù JD„î¦ œâaŠ–kà3U‹FU©_¹éÓЍc(:¯ÂpRJ·’c|!­Úo·b†x¿:ô-R(:g0Bø°òG•°ç  V²$æØ΄7ÅۏÌݨн 9  +.s»f<íÿP%ôB^ÔBüšly}…P +ò}ÚÀž ™ýšDLºúcc†ØŒYÎTÃU@´ -RÀ×( +яwÓK»‰àÅ~§[KE ò-4·3c͟Ør†nÖ"rßic1&þݪ¼*côò&Ps´1s>ŠÊº#BhôN‚­ü¤ ·§õ|C2WŒ¡@#‡v±N6T?ÿhˆ&­IS®¦ Þë{@a ¡~çQ&"RLÒF‘ƒà{Vb¨4ÒgLyÅJcÎtd|{µ&ÔGʼJ4&›íóõ™†Kæ]if/RôúñÞ&£á‘ÖÓ)f÷تôΠ^44¥Vpð {t¶t½Åø˜g1ÁK‹~4$4 ©Y†Àã˜\Kñ-o,„¡Á™h ·Nֈš  7“õŽpMã•ÕâÕ-PÛøg +4 -ZÊrŠ0yÁEG‚Ð@R1 vZR/ðò¾\0[¦ ˆ”iEWÆ,Ì*mÜ T`šeG­z txƒA*²Uôß]t^áL¥†«œ´äþIÒPNì²K¥|ێißg÷7´j4©;#šŒŠ1¢*_x3‡/ª;ÑH·9‹¨3¶ˆ“Óo aõšâ>#¢û­7Áê…ARDsÀ^PšžR¿`pÈbœq+ñøÎâ‹ÐVã†ûá¹ûAçrŸÖÅڏòވÞ r¶¤ÃÐk ›ô$ø©…]&À`¹÷SÆ2l +åK# {4ä,–ÜüòÔø1Qþ*¢k endstream endobj 125 0 obj <>stream +E~+v¢êG”'±xÝQ¯Ž†&5NDåޓN…JAŠf´Qz§b8„8x-8n¬'—LõšFâNIC€Y»ã¡Î„˜ K¿ñÀDÃk â1˜úëײEœ ¶ÑYéy¥_Eàâ).ã°?}Ûeêß_f Õ"—`«ðAìñبØ)ò¶*Aá¿è„ÚÙFÀXˆÉ¬4 Øã;¿¦ ¡8ê÷wBY10†B{§ÿk(CñŽ¸¤Dµ÷J‘“‚°\ ¼r¥EJڀ)qì~DcPo㭈¼À/hį£Ð¼È#0ˆÑD +"÷¬º‚3²Ô®g­mĚ:ÓÞ;%‘5G(ãÑÆàD–vT“PÈÈ\(hØ°"¡Š 6»]®Î TU‹Aƒ¡>Iå~Ö Ñ×Á¸ÞÞãÊ|ƒÆ-ÁˇFnß0 mDÜÕÕ~RCxD.Lj6IþS¢nm£1ª¿š£§`cßpYÀ£¸Ac¯áÆхHŽ›p¼eú + -› +Hڈ<߃6ääk†Û46•$wø2hœÎ#aöÑ\Û ‘ðÀ"}gjÄ ÷Ga¬6‘¶ALXú6 Öy\]f›*m$•· È"q-WZL!À{¨ó°w³0~‡ŒQå|¬Ÿ^ --@,ŽÐ¥Þ™JÑ ³­/yÁqg² +Aˆ‹È-.Tiå•oúáóÈ}¿c´”b—}0±ªnSo'mÜæº>[tŠ,5Ÿ‹ Ñe¬ÐèÕEÃíBÃøԣƒ۴¼0B®åÂýd§é±ÂÉâª5 ø×jŒ®·Íý+ÒÍ4zvxë# ÄÐg¢êlӕ04 w…t$~Æõœ¢æl,>†È74ÜÁ`â7ÄÓF >†³ÝGKl™ +¯$ Óè¯0M¯²˜!€Ö=…Å#ÀxÚ‰җ±:DtY’D¯¡¡¡e;…È´:|Ú0Y¥9 +´ãaÐì´ý¾WÑÑÐ (è_°Y‚‹À«àsÈȪ¡1@u½_눆¿ÄÎG­XÙÐ@âkÐDòèiCCNæ38^VVeu•(ÑwûÞ±@î¾wm ōi•Z‰UÖB4ÒGÔ¢h©dïâ‘÷äP£š¸k.=.V·Rìín,š<À‰5Q ôYŠd|®ŸŽ¢ßZ¦ŠÚø½ñ nf^ë¦FmÌW2Y`Šœ&­'ç9­GüΆì4 ¥¯½(@AI¾„³¼wÅÌx6`«¤p}„ †ëYÞCÌ#êê¹ð€fyÚCxü±O~ÎÀ"c*ÍùTxM‘ ÚÉåhµw­TPŸ Š¼8Ê0.tÁ§wjɵ…>šùå;jö¯SÝß…Ü WØÇïYi€‰f•ýŽ¿ûÆ>2–ÿø}äšl&¨ša†apüî H§Z¶ÿ¢-)Æäá­åˆì>;jC!e‹=6*- ï ´ÄÓãd©ï ô1:wB'×È´Ù=)ÓMº ó;îƒG„€z}XDq~W=FlÎoD–) ó9,ÿ¡ä3í1[…P³½vPÀŠG¤°ÖÛ ô» +–"»7!|dmðXt&zhD½WtuÎCc#ÞȗµññÑØ\FH4B.ÖrC*ý‰]¡¡°$Q4 žÌ„~¦'KÑØ㆒± +­!•-Ò­‰ç—ž÷®SÀ ¼¼…ê$…_X’„—#¡ú˜Xƕ¬_×j:J!Öµ5í¬ËD£ûj¦Ös|¢¡-)–n=‰ ‡KD·¸hèUq—Ⲇ+ÒÒµ±üé(GFÞ²׆Ù‹p¹t–tYb -! yX¼R«,>ѵ9Q¢Q¾ÏK÷A)ÑðnË)YœN$Fgr¸à¾’7omØB#P’‘=¢èÐ8r¸H$&Ñàx¿›¬èNìˆRøР•ÆKÈu‰.zÜ9­Ž¬˜PæôØ­‚œy DCEµÕÀ´µññÚ"ƒ,í,DC胬wŽYµ²¨rk£¦žÎ8¤xƒ1wci䝈ïq×3K• e"r˜žDcèKo;¢J”lm Si3j1’ekc^ KO’‹O[:Í»!RPW“;ác‚µœjì«CºÅ(ØNâíùæÞ¬r¿m’¢®^t‹oÈ”Ë 77äF +ÇKq,†bÈ.Ѹ¿;U ;X‰(žh K•XUžu,k#G»J¢À”i*ãÕÅYŜq“GÞ¨Šhäý)"!‡wÎÚ¨Q˜c=oDã$±aºsa†F4hP¹<¶¤i.Æã0¢Òe .q0 ÉK 1Ü7¢q#4;-P°Úpõi;³R€§e]„ˆÆ¸0ò´$U?­hµa težbÍát‹âñ£—ÎÇ$ö)@Ïcb_MZ6öF4ìâ¬ä<©"â6s“CJOª6F écힺîCõè`ÓfAfçÙl|5ÁíªìG<þ¥à+ˍ!#†10”.D&ŒrdÀ{šèˆñ5µdni´ñqÇ^¯?o?ŠÜ ›RY”íÚ» @¢Ê(®e£uþDÌ´Ü¡q¼¢™ G÷"ªú²ßؘ½;âää44|Œ•VeÙƀJmޑÚø;r~oh ª&+ŒÔÆè\oÕ;i”Úà³jF3×FP8¾BŠm|Õ/Xî +C/Šü$cLj´Ê𢰆|  ƒ›À|¸CMRÈþ”ìÐ*ºÙËÔ -@§p)\jF‰Y¢iPi¦ÔÄfS´úSäÛ ]w=÷Ÿ¡áHœ%ð5·˜¡±&oÕ¼[\2ôîcôÍs4ªÛ€Ëø g¸ðc),íò%)Vh8DW~ÃÓ¨7!a˜þPÍóBcëdÖÓP+µ1ò‰ÆÐUÆmh¸…Œ̽mëЈþ É͊U ^².fJn킪ù¿Éú™m&y cIâSRʼnïý&Ú1¹ +Þ&coãC¾G#ž¬²Ž…FÑå|¡±˜Sš”H‰ Cv”¶ìÌEÍ7!–š~ÚÐð˜‚*„@dz¡‘PÞ8]‰pû‚Ðäúò`/Ú"õ:•â$3²€!f +ô…j(hmøšï¸*‡j³Å ?gˆh'€]ýä4 À|@ͪ€[ 1~߃‘&ãs7Og¢3üïlÝݼ–º%cuæ¯Ûáï1ÉPêáΛ…÷ï„¿\ôm‹²FyGðÇd?tk4ÃÁy“Éqâà}QÎÚ_žâbü¹Ü(-™„;ðÞ•–„ÒZšÀ±D2™d¿/&ΐhÖw­ÄmWù"рC€!¶ŠþH+¨v¢4q£nËê|Ð/Qm‚h(j†~Y÷HËvŸA’%äðŒšì»À¹oýB, 3#ôe²»,:Îûݧ]`'þj&Ög~(¥ºy[rN7¢}3¥¶9^2“ +\€tÞº²ÕfBŌ¡l±DÁLú7×5ð(Åó@frŽÿ™ékäp3©‰OÇ.Ìõ ;[ %nџ¢f4¢,ómá%ËN—ÑCÑGl&–ð,ûø„(+Ú@k&7§»wíüEQ3ÁF»ãTølšIx¬˜¨Ñ”-h-B¶ÑØyXÁ.‹ÚáÓa­hÀC|¸ˆŠ«ö9Rñ•^FWB…_&ê…¦}o¥L”¥e‚!-C½eb‘Šç{^ßõ—IFè”lŽè¸ñ£¡ãÛbc “ßÈ ÊÄ4´ 8¯—û^ÓP'èBteeB³C÷ í2Ã>Ø{reØE½5ܯ¤â…¦gbóX&N{¥ä2 ” (ò Ғ;ˆhymìµs$Ùï‰Ò²ÿ¼6„‹F­ÖHŠ†×¾†ÿ†ž{°‰ò¢Á˔{œÝÅR4¨ŸgaJQ4ÒTm}W]– g(;èP;iÚl–⁢±îÞñÚôb¸ŠÐ6PG© Üñc:žQàùt»KÍoD·â jÖÆ:4ngämS>At*ø+9zg[Glœ”bƒ—ª·¬ ÚÇT@ +xŸ; C¢a{¼ä¡Óš.‰Æ¤=¦7^¸™§»á ‚0[á—¦ZæW+2³(kiôÍt™£‚Ç$[U§À¯“Æãõ4¦w- n|+ó vËn4ˆ€aãä>8ê8ËçJ4Bòª\[À>¨’e‰Ä‹Þ Y°nÉ$D²)®d‡î‹Á0«µ±í3OõŸ áq>úbÑQÛË£$6òô£ÐD#ìiåW õ–A'erxŸ ÿv4kî§*Б8¬z ž ·áœC‹ƒÄ%ö+ä`¢ñ ©´¦ßçù‰F¸8{‰'’!i¢Q³üÒ:*Æ6Ñ |)ËÍ- +,ÑP³¶ë®M¢Q³Þ%I£`-¾ú»í_¬úݚإ¦ñ„P£"~I4(3hJ¹I…$6‘$®¥Ýˆ}}U®Å‰CþJ¿”Hò¥éJ]ï¿0ú?%P…òRDqaÓj|Àq_ÍLg kDã‚š­¯R…ÑH.j†ÎɉÜD5,Ëh’ˆ†3z¶¤ •«¢ s%lÝó™D#¬Þ¡äK¢±w¦(¢JÀ¼Ø{†6™T–g¡¼†‹²-TÙ(‘°Q ¤‹fžÕ(]ÿãö_Çq²©µÞ†e#µ¹“éÔÔshBÜ,ãC¯3®‚Àò*üóvÍø¶“œ&Ë Zõ/[€©2Åp4QÏ)‰PYHS1Ó4T¦½Å-rÕA9Y‘¦éjã¹êm7÷óNG¢Ã6@A«Zƒ÷%ßùVÏð]Ûm Èߘ÷^¶^õ÷H¥mÈöpOJ€®ùeõ劆¸ðœòGø‡ª°á,{ٌQÔQÑàÐ5ˆ¨ƒy½ê“j…ÞxÈÿªó§%ñŽ³‹õ[èèd½ê…¥OJ)„/¾×ޑpt~Á;CïÉ á]2û#ˆuE¬Dmµ6Œ¥÷C¶ˆH~þ>±p®êcu=‰T~Û4>I¶Š†ˆöx„OªÔ¤¢K7ƒG¼Z1yÍ¢ÁˆÎû¸,pmè7Mém-ó@¢ ²„šeuHïĦ†DË©Ã>Z_.Ï6PÔQƸë~—¼[oØO1|V$ó”àŠr]4À9Ä`9ckJY›kƒ?%:”$%Ç)W ™/®yÙIYs€ÛåFgEÞ ÜNVŠË鲕vSõ,Ü|K&¸ûC¸Z= 3W0zêÁE£ëÔFÚ;F6YrѸ&ÀimDw‚]~h׉ëECq¹»ÇÀfG1ó*ÞKÞçn›â†“3ÞôýtAô0œnόޅ¹€ZÄê¢1&hJ£E쭅FTÿþd’ÌÍ¥±ÉÏÖÆ´7Q3h¸Ãèlm Q4¢¾‰î‡kƒÙ€‚‰%ÔXP'$P¢ðE—Gd$~¡ºõ¤w…bÃZ&êd?Åù+²_žq4E0Z,Srɵ‘¯ +€˜'Z:"׆À¿XqWÀ­ ÊEêî±¢Š†H-Eï÷ñÍ59C&Ñç’ÃK4À:~&Ìû÷Z"°EÒµñÞ…r>2%`n¼eú¤-ˆLѐ©ÿT,’bzΉË&ŒµDãf‡ò@çDäJ¸DFIY4O®EÁóLٞe!¬ýò"“æd)kF!ײäÙu­”Dõ¡“kÃök"‹“(‰úùâÚÀì06%ݒh\©çwª%ä,¸*³èîÁ‰F¦Y}_¸ +äbÒüÀ1q;„‚ŠùŠ,ÏVRì:n<£ð˜c h8WÒ"ÿÆ2qÓρSZ +sƒQ4ˆuXü­=ï)ìÑÔ\Ám‚ã„ù( »ÎöÍîïXÑXºä£>íÌàâ`î,PznSöíEEùÚPsÃÒJh E´ïyQ¥šØn¦X4ŽG'y+ÐIË¥Ku¹=Á¸QFëE¶D±7²üR ̶f•d'j0ÙLbÛ¸S–À€±mH¤f6ó¹¶Ó¢AÁªEc™æÀ7sX4ÞgV)’QÅnÛ¨… —ªd]žoÑH¬èÇ0',+èn<®”´müX4(»¹xãފ†®&ÉϚ”)x˜XÑ03Z•iKU'¯mÄiV¥ +”þ9,K&Z²m´†o:ÀtÅ.ÛÆÅÁÏk“2N ÖWܶÑt]E(êōݽ٩עÑ=éwL^4t†wŸ€7Àh`‘ìyÄuû£án-§"Ê +F#ò×i ¹ 4}™í0¬ž“d-FC¼ûšxÛàmŠGnŠ~.1žGY[Î>Ú¥¸SœÝ܍նñ|‚¸FCx4Vá¦éZ½mìšh 0ôdãUÌ1#?£Yq Î3׉&n£5Ó³™l8£±å¦”"þœŒ†Õ‡–+ ‡MŸ/ —Ñ`ÎañXyPFï^#¦¤“Ѹ»ûAFcáû«}~2qšpËhTnÒJk4h +']Oˆq~4´ö;ÊT±ŒF#Z'Þh§…i4jÉu“3g`Ô¶ÁEq¤‚ú +Zg ¶±k4ê; ½žÁh4#ȍý^áUïï(£mã!ÚÓH3Óh¨‚*à‰ȪÑá`)¨ÑøyÛOãŒçðüæp}C ;}”¤ÚÎX“F£¾ÀsÅx¤ e|ntˆElÎhØîv—ÍüsbFã‰Á >¢A £¡“Ä­zF£d#;C/t8£A–aZ†Õ­¶+Ù RWÆ^§lFCbÀ¶y$ÑÈhÜ=¤ƒàØÎhlÎ.s–¬¡†cFç {š|ÆMf4¨’ÁމT׶±k¬DÜ6Ք$ÂÙ[OµÑØ|a&uʒFӓ¸Á![l46’MF.`Po4 Í(Uñ]NÕÚh4šä4“¢ù 7¶°æ4L.¿êìƒm4OîÌTê:ã7ޟ#ɉ^“{£¡)DkÆn4z+w,j®ý°Ñ Ð3mh…iۀ“c@é;l²™Fã@š ×ë=¢R†žŸf·‚ï‹Þh”4Ô6bàFCóÎé&ÂCFŽ$K2š3ðÜmF„¯AU†ßm߁ ¢›–LƅFcˆ‹m|o¾ÛFÃW# ŸWôÔk4~r“æDœÇ÷£ÈhŒ‡ûy$oYÑ`(!0 ê ´†¢Å0£Ñ÷Í L"ŽŒFBm8äxHÊ0ÑØ:–ì  >¿ÿy"c1e§ɕI‡'` £]oêì§a4”+ÍF¼„$9 ÌÚâއÑP˜Ì€!<æ:° ·³goZ²ƒÆŒFòéh9¥¢Sº +:ÎhÐïŸéù„ÛàÒ K3?܆|…ÿF#Rw‹’5(|ißµh SI/L8¡¤ÖE#ÜÕ@Àpèç ×Âm4Â@?8°\4Ž&ы–“—:Ս‹ç÷Ìc¾½mh™£Tk·éaŸ“þ¶A\ Z„ô_4 â¸A>´Y³N© DBÏC[÷‹†úlé—}@qß-v•c4’3Zµ Ó<öAž‘$»¨.P³:cÑP„v'Ý`@FØB2h$Ÿgp߇´õvañ¿?Ó¡W> Ü6yÐlÎøµè¸ª¤ÌÓÙÉÈÑ`?4õl,Ò9ddƒi·¾´sŸ`}㕮Žr‹²™;ºiD¸íš‡R5KƍϘh×ââ 4e:8F(ʧÂòêŽ†Ë€0Š°giðÃl–´z’FÅu”Z´³xmÈ®9 Õ/y.¹ÈàfstÅg  Gô×ô±£¡‹]–>±~ n<÷QÒ<&º£H”à,[éÚD„Ï;º;CÚÑ8¦ßfêiܨ¦¢_V¥.|;Ë@F‰$*ràœ¡pÃÁE¨›cKviQ±tcêéï÷qvƐmZpp¾Vª6 â;âXÚ_0n˜„†…DŽ|S¿•Ik€†áâò,ª8½xÍHi6$ÞÓ'?á:”†›tu×0†²Œh0ÂhÑб%h?ƒØäÄџ»Í´,%u¿S…y"[ªUipö«Ý;"Ú l Õ8¹!Þg Nô¯>Ò(ò6ý’_ÓX¤!• Ý7¯Û˜Ü`ô& +§†÷äF¶:d0xRKÒ p߅')WgÅßʍÃ±=7gf…Ĭr#³Û¬$³ f®c$ u#®1ßmה¤Qd’. (©Ü˜L£—X ºU—¤±–\¶ú¼Iã¡H;ŠEIã5U´1šA}ilÄ ^HêS8Xn@Æl!:@<"i,SyR’Í$ÿ¹y®"@Ò`:ääu#i´º¯°`Q ½% >.kòÛUÒ ÿp`k–4¶Ê²ºZuè…K6?…X“XI¢,,(^—°ìA© ”4’é¨vƒË €>þ”ý•4ˆ#’/½Ü`· %mŽim¹hIÃs¼³±Ë ¼& gƒóÂJÍøc°ŒÀÝ-iìÓðBPfLð©™4¨­?$ÙÀ5õñ"cnèÔ_‚ªìÆ Ì µÓ­ Èïx*D+Ñ]Ÿ©ƒ˜˜Ôؽždµ “an J`ÐWþ”sæäýIcàN¦6—TJiž4Ò].‡Ò°I#‘aòÇü6il^}œ¥‡ÍdiÒÀ¹hZ‚C.’Á¹8“F¸Žy€dñÞ¤q‰0ƒb'0iH·pb¸'Ý.7fºÅĹ%'“F¬Paç¹'Hèj1˜4*}“/Iú4i\B EJ_nðZľW¯5iLúW='o_nÄìcÅ£ØÉ:il?¡^¦*Ëðž4Hñb qçÍÛIêbÖiï“0uÐ¥(¢[rÒøîÐ(ÔЧ6s£ûƒNrJšUÆT)Ù£Ï,\/Éܐh'„öLÏ>0Ö§4ôY[+&¥A!¾./k-·™Uõݬôeâs’Mæ›æºÓ2¤ ¹ÑD-É<Øp"Qsc‹qÉ\ê‘äƒITÇ*ã0¡Òˆ7Mよ;UÊÍq¯AF•FsùtŠŒ@ Òàhì ÔiqCTÖÝFRbG¥A“Œ”£@«WÍ fPCÑdøî(yU´Ìùk¿N«H¡Ò ¹£¦£Ø¢”Æ‹Ì”zÊF¦¹nÊ5†=vzÒÀu 0ÍvìO;ñޅs" l^©WÒpÅÞ±¡¼`N«]Vhr¹ +è¬5œœ4Pj¬D²NÿÓØ4qÒ ƒî¹e”FîØTž="™…Ò8¸PˆéNCi¨\5ÄY”†¯p¡øeÔ£4ZœQæ©ö²§( $•Ž/î.JƒãD'Š/7ü#jƒõ†!”ÆéA‘ñGÿ(.7úÙÃñödèp&äIiØB˅ӄP) ;)]Š k07þ¼Jú>º%¥AëóaÒȦEá ‘½[†Žœ–=³wÜÜr«`¤"I}TÌÈQÅ&L,q™¼á|°a‰Ôj¾í‡î:¬$y˟³ŒÊ°§D© ÇÕЉ։¢áÌÀåÅR3c‘§7£Tú/ªG>ÇtmÚ^”87`K‚zãք‹”¥¹À¦jÎEé  É3û꜑ÉA¤Ú½wJEL|Mot›ŽÑv±ÇÖÔÕUô”…<ñb0zɝEÜ&ñ2Cêk]£)±3·šL >ûÃÜ+և7ÆøˆÆű*èg“þ¢¦„ÀÃGŠ{³ó–—5°PŸªÃ96ѵ«Î¦—8ír 3£-{¦’«¼ím¾®çÃÕ3Õƒ-å̙ûÀù ƒ †yl™õ°,»Q¢°\áwšlì‡H.Ñ15®•ÙìæxÔÔ4ÈÒBÅËֶўþeXV©ê›› íï`yK£fá'®ÞB9¤™ç€%™/ï#‡he3™ƒVÌ2õÈѐîwÒùÁ9D"À”à;ÊG$Ç^Áä«&yc¿EQ´ÏùCÇM$ǙwûË=Â$9Îz$ÈÆ Ôc7’pÜRӃ^’Éμjöæ$€žÆ-ã•F”P-œÍ³™hÌ$9N-•½HÂ¥2¸”cL¼JO¯ž½çTr¨aÇ(¯r½äH¢UiXôëK-JŽ¤•E¸jS™°Ny9.5||¨ZªcrˆZÇYg’ŒŽvgrŒ2e ³úe¡ò’É1Ö}¸ˆ 1Û­ØÁä о‘NwAk#oQÄþÈH³~T9*52³Aá40èÙ"Հ°üððÉS”&AîZ'ZC?M…lƒü1…$9F4¸Õº âòbS‡h<œj:RùÛˆ“!DÃ4Î¾Ç *Ä~Š$ C +Œ˜}öÂL§8Iâ To£ G,‘5‚“¤h¾ŠQÄ7L)MÝgë¡e&RPÐ{ IŽ‹»ƒ_¬:ó¯1’cÌrE½„á`$š—ÙÒxXæFâòî%ATŸuIÀ%m˜”qÔ½3Xà\ïbRë}Ð1lîHa +‡béVÅgØ +(Š)›»D“j¡4q£0 ¥¬$¢ÞT¦_$Ø7ŸÒŒã}F]­ƒS&—ÛH4À]S±¥2 `8r˜û*åN¿‚±ÔÊ>˜/ŠcebőpB§/bSð | +£é¨¨Û/ø‰ÛîUÚ2»W‚À©Š}Ԓ¾%b,ÊÉ¡>&2³!OOU.ÖAn†ö¤ÚN2£Î´Ötý „Æá7T‘w]ž MÅU¶r€ä¸Ø‹“{>àV=r`‹98ëR™#Ç!QtÓ%Ô!³4aú9à=™)B™).x0Í´iäÀœ¼¤ÀÆ +ZXÎÒÚL¬ºjè«Øþïh™EbBDˆƒ"Ç]ÙêËߐ9‘]PähC"yTœÈùS-ã¥_©È‘çpBO—æ?ä"‡ˆ`–ªD˜Ð(r°jDÈýñ±4f‹.ŒÅ°*rÌ=kZÞ¯AÙJȣӝ²#^¾ 8òDãÁ´l#kà_îT,Ê.rdH¼~§~‘ã’%ÔO«Í¾L‘Có>a,g¡iÊ´ò e„0ãðEŽ>“¾Èa.5‡TJ­ÈÑ9 ÿNAX>)rTÇ/ü ¸‰oZE‰¥s;#É8:ÒFre¨)¼ËÅ9Šå(o_w gEíìK^‚mFk6ce:VäXhàe…ðSW¨Š Nì5uߦIõóÒ±>+Pû{e,Ýp7ã0ä¦Ó‘ê æ0C¯{º²’?y°7¦Óˆ D¡KÐK"Ç9îpˆvú*_6‘£øZ"ƒ?—#Ü‚ȱ?ä':È?ÈÂÝtöPܕ £ ‘.‰r֙T!e‘= ÑŠýWµMEe߈q(…drÞÕâÍ.&E‘ËNõAҜÄËIœ-%‹€82‡Ý|*ýJ5†7²®t‘ÍÆÔp' Œ;Á`u9B¦É È\‹ð+gnØØlUt¿¸LÀa~óç¡~%ú¡qx[œUõ’«9¾fl¤¯²EŽ<]Ÿ‡]¬•4‹|$~M€E_äYªàض¹&4µ]° +5‹A$˜»(l”¯‰>±îŒÒË?ü`™d¡žw¢ôàcr—ràz~F/PÈ\\Ì›µ”œ™w²¢÷ÒäHéïpÇ sÖ×¥ÇcQYrÒ ü?™ÉÚ¼Èa˜­dŠÀtäK1¹L-зHÝØÿ7C EÜ+Pûü%MR~Ȍ¬Åðú¤Ïœ¯¹>#é¤ç²WP÷,ýôI_iŃKž'}þß6¤½ ÞÜån£’£´@ ÷¸Ò‹™eÆ.'=òdc5Ó§¡[2J¯ Ï½X° ô Ä"e”žµ_cDƒ,Äc@éÓ4O‚šŒ16ïõX…û5å糖àŽèÕÀBó¨ÌÓðý"@rèï9TÍ>£ÊÒø@°tËÚ)1ÄwAkŸYqø…ÉiNÆä6 krÔ²ýF)•Úä8-§]aóxMŽwù gò%‘™ËÑä0Œ|_/©3·¬Éý ’µ<"A&‡—\⩧8#rEW‚f¸39ÎA"É°1drhpYôþÍ4‹B>LUÚÛª hçG^29&؟PG>¦Žªzéùæn˜F9_Trþ7Y7ÂÛY¹Tmóº&Gf l&šW¯çª&‡ôt§1÷u”ˆ&Ç»:Èø†šˆt¢u'G^ñEÂÂKÞ)>†Ì8x’¬“Ó&ð²89„Y@`n󊳽˜ˆ=WhtLŽôZ~¸Õœ÷A29œÛC¼I^BÌäø¥Ó@BarÜEªúwk#a.ÅÓÝfr¤µ~Bʱ"†qª7E½•ˆ…œLxÒ¨í^èÂÙù×vrĬФ)Š/¸´NQO…ÉÓ.£²ôµ“#œÝ = #ÏmÊÄÒI#qxmW´•ÐØ­8ºG$zÓÊ79–m? I è™ð0CílZì&“C]ëÈÛÙä`œ4¸È¨e¶è£ÉaÊóÕêöDCD¬ôÅHN©!m£4> €Rzƒ©bƲ©Áï™K<…FÔ¨ÁÇû’C6%G®û´"C+ɐ$¥Uej¨æ‘äPvQÄIŽÍ©³½Æ‘þ6To`^‰C-„ó9@q(÷æxâ°ê’c:!½ö ×ü%Ç[½p,'PîKŽÕ݀“X©„¡g `ޖÜBGjäëבÆP%Z; •IͶ'9 +[CrH¦ ¯X>þd’㘛–ÄÖH +‹*TZlŒç +#èƒKv€,š¦ ”UÆ~Bî5¼7óëhl9–éW–’pȐü‘÷÷“´Râ:rá[uµ* žNr´q½6JµÄÁUUZÁØûîŸXCOêÂØfPãM:xÄéûsRc¢Ê2ʆ `õÉÊ:˜ûïz'™vÞhµ« Jì°ÈÖ8b+FTÖ› <8TPÄá¼F +O¬ ²*Gr¨·q“¹¦I½©!/:Ä{Í2$‡Ë‚¢…ÄJ f¨™`¯fìËɐrª¥ª?Q5õHÔ*Ïñ+GIIÃ3AU°Iïî$ “¼«]$GHR„è§ÉQGÉ`ü+=@r¬•­ÿç+Dqw$Ç-*zÄ@rŒ0£]šÉÌ +ãC>°í ¢„È>’c¥ Ù.mR"_M* ”¹‡äP÷ ]7׶L€ƒ]ø" ù“=™_’’•h‚?o’½É°óÇ­.HrÈO&J’Ãë椩x%t¾4ƒÑÊ3ƒŠñ`”¼_r¨åfp¬9ùD9«äPõBI2yŠ8—)9 ÏRty…¼ðѪ.XÉá >¥lã*ÁUr8CQœø4oô8'%Ǹ+¢ʁ€bôú>„¨Ô¯Í Ú£Ôû¸éæ£Q•…Ò•†Ü$¨#®sÐ#Ž-7IPâZ–§·ERÁʑ‚[¾S*Š:ÙÞkm.³8H{M§ú0@Ðç IÀ44|œþ&àÆÞ{°‰ÂЋrÄm&óìKí(ÇÿÝl*úwCé1}Îûß¡(Ç,;f$ŠC™<Em†”‡ƒfNe sKh,9VÞ¤1Ÿ&X맺Ž.@ˆjŒ1ä`üôi²IŸ¤fÀ°Ö@^é°ëv¼Ûò1J_7ÃQî~Ë´AÚ³¦”A$ Z½ÄTìâª&ŽQeûúÌnísâj©& +sÁטm‰í#º‰€‡‚NéZf\Zô_$°RʇÔÓ5à.¤?Ԉü?Á9NÊM5t2<ê`‘–VP~Zƒ'Ã+dšŒöR2ršä'í ¬W}'â‹Â49)ÅëÎÒ$4(²ö°BN +yOLSs‹&ÐÜ5H5çôÐd$=ý¥”Oª[bÛk£Oï-0¨hÒ¸m@¡ b$´.ilbDÃhB$1³u!‰:VȔðΤñÍo“ @°æ3 æŒöð•§Ùîg¢î ùI€,„dx¬g²Ú¬J֓P”ðó<¦:gã±¾—’ƒÏ„q\gãÞ$ڛI9ʵ¬žfs¹@›z®iV>ÜG¹ˆœÚPrïÈEq&¡‡^¶¢Ÿ‚&5C±‰Ô +BL9Ã"ÛÔÈ .ãšd +ÁVŽí"ðZAaä÷ö¼ô˜g}ƒOŽ)íö£ôŠ÷ü±ÕÐÄv’¦0è VTãJ8Ì(ߑ°d>“_­ë7ûŒbõ<4•%úFüó]6[o'GëÓ1°A‘ÿir¬ÝÃ-ä'krdÿ ¸<À5ÝMñ½ƒnv˜Áä8= ’ƒàÊIÂýŒ=$G¸ŸúÕ„#9”¡\û•…é· ò­Å0\?èH$&&»CCwYdH®T¼]SœÀ Ô=D‚ÉnD‡;rû¹a’ÃKU¢.Gl+‰w,™E….d2TõŒ½Gg€–½ ¥’ã?ãeiâÇ·‰JΙʲä¥Sr¼¢,‚>[p6¾*9¸;£Þ’,m|æì顒Ãvñ>¾ä$JŽÝ¢ò£À#Jjº È*6ipä©;‡ñ™Áâ0Í ‰2[uÐt¹Qn_R>SrüçØLJÑ ñªäš{‘¨?Ùzé_ÉÁ㥃#»Àpl`·Gþa4f•±šKÇ%yÀ¿@«ˆ,›Ê] +L핍¤ìÉVS\ ä@] sFÞ9õ‰äN6 +´q|Ó {/`†4̹ùqW±a–ÑpÄý†èªÀücIŽû5µ±C“ U0’CåQUÉÁ¬„{Q$‡ºNÐ%½LÉ!1ÀCjÖ#N„(”Ér’#!^»ö}Ró&âENà™=ªJRrâ&ÍÄ!.=J¤g½Èò$GÁ¹Å2ü† Ú7LÊ7<ÛOê}P~âÍ$ö8y¸Ø-mIJ™uË!Fc‘ÜWQà" Írvâä…ÐæpQ¡’,…iF[#Ž.҉kzÔ6ԁ³ºýJ¤´ù|Ô-’˜ðNK§reuì¦-e u”Õ'œýªM,’DLò{à´ûOŽÇ'ä¾fiPÝåmš0Ö,¤(Æ_þõ.º[ÉPF§a°ÂuùF6²e¬Ò—ZŒ`®yèˆD¶yés`Ûs’ã÷’ d¦¾ZŠÜY§³`"œë콎 ‘§$4P_+^­½SÕS‡F¥G뗡t ‹âüŹG4ø1ÝÑ-ª3‰5LdMÛH¤ìûDšÎÉ#‡>Î Y~"–¸Ä‘Cr¦¼›h2ŽªX¹®€d4täÈنîޟä£Lö}³ÒãñàñïMRQé'µ’ãŒç¦\Ú÷Bø<Îâò %VÛÇÔd·ƒívd'z”÷ïz7™>êí{7ߨ©K;Â$9(D$t®da½ç¾×ñQ² +sßQEÕ ¢qÏ áu;U`ȌGQ§0ð'9"¯ú2‚Cmî»ÛRVA +õ îñ4É1BiòÔú…@NrpJ ìI.Xmt¼}Ä»7Ùíg±ìh‡ÖØ#˜VC¼í,èÐIƒ%ÉAï^Ý—U캈l$ã–†@×„!92J£Ç¯NÈÐñª‡dÒ¾;8 °ï­`[ߛäC…E†!9";­µŒPžÈÓê;`­(jõÝàçq=§D3Úæ<6©Lfáוí=XäØ×&âÈAÉÄÀBÂü`*ØQ#b’T@þmHÄ1%¸~ ±?qpDccyìѱ( Ê@ërôÃ ;´ƒÜ~‹ûßÈэürÂ" Gß6L0óï4{b„d†Á 'ÏH0Hÿ,É<>¢÷&¦ ãK’‡9ÌN7épôQÉÁÅx³ÓmŒSÀñÑÂÄ0›J.q\ß_évä/qAMï?;.÷iúö@ÖN«¿´‡™í5Æ°î }L)SwLÉaÂ÷DY,9°x´ZŸýSÉ3YIÁO½@øx­äXt¦hž”a¤’:k̃ý¥ârÎfr7ëv ›à“c:"lMÜF0IR ((Að!ý± €áy]¬ÉQ +ï¤0ìîS&Ç^‚Ÿª-[NŽ-üيÀ€*8/4¼MÎPF`ž9û•B3¦‰Ñ]p<0jÊ69Šž³1Aäá»É¡ÈÁ¤ÕïÙÊp1Ðäø+#ш$§„Þä8 Þ`‚È…)$nr€8: ¯‚¼¼i¿ JU«²ë`~´Ìâ^ˆuh™é¦ ”ÇjÂD<0Í´› ~Å^šAÂbÖC¼&Ç× +ÿ´gIFÚäØ(-+p&_ žðÀ}‹ñ†Û8·Øuˆ¾ÝC¥3h +ɃÁä ã +@¢¾ +'“ƒTVZ;I`19ÏoÊ,ÄÁäp¹âÜ$lâ?©Lçt"”[iê[9VJ~»|oðØÀ4n’ ‘÷åß*ñ,‡dA©äŒÃIŽY|‘’¬Ø+Ħ#F–{_[¥¾üƙå˜63ÏÊ\g9\ñ´Š ©¼v–Ã_g½U´I‹YŽýµÔåÞ~YËÑÁ µ˜›[65=¾ÐL+ xO`ˁ ë½ùµù͏l–ã­<‰Äef;mh¢±›SA‰0ÈVS½BÑåJd +0!1O7m+GæáϤœ•C ˜lö4 êX90/‰nåxh$SY´F+‡ûlOÅÞ³ÏÊan÷g g :nå H[=ѱrƒ§øʔ¬"ø評#wª)ƒ– ±r@Yuæc+‡Â¾Ô+Ç`,ºz€„.-¬íëëÞþÁŒH`+ÃH’.Sí&¼ &lGè§WrÌZÓ þ¢•Éy;8NCd–Þ‚ia­ôb­í&²ã•Ü8 +Õ§×øÊá,*wåëÎsåè:{RW×AÕDñٕcPYDå#¼rІ uKêÀvɕCםuµ+Çé2qåà<Á +«]›‡Ô•+G\lBmPZ9‚ÌEÒ&q+‡ÚаHí:ôdåDš*äúܘ›†•£µ8+M—Zµ•±COôÞÊ!!‘ŠíLáÊÉhV¯›ô”ÈÊA6AÚíQD°kåpc÷¤$Lƒ<+ÇÏ?‹úJßé/ÄÊáPwAòÇ!%±rPÁï +«¶h Z9$Âã‹Tç Slå@VB†…ሜ•=zH¯ô’ãꥣÊݱrЅx+#6 +GCD.¡ÉePfS+‡`ü·ÙÉür©¶rœ2ÂW+‡°dåýüXýQÓÃÊQ«aÕŸ›gWŽ‚ à„ºb†ëʱªAÁÃ˃WqM7Ë£¼‰$*Â+í¤=_£×ðÊœýœ|u9_,ǚÐB•,Gê®)û—ËܓÆõYBD=ñj([²•åÀ;Rðä tZŽÞŒ]W—FL@-‡eCKZŒj˜5Ñ åx—¨€¤Zìf€NxßÛ¤k9Æ¥L©–ÿ_¶e0òï¢åXò¦Ì)‚î¥å(1båž|–µÙ°‘Xõ±i^¤«µã„ÑåIȀC\Ž.½wEËÁqMÄP»ÄX­™Û9ž.Ç]«â/=Gu9 c!7ÅPÃ\Žì£¤û–Qp9Ðb:*Ê85Ñ\Ž(y—#ée+89ÙrðÎÚ;»ñ‡‹†n9höià)r˜oËñãrˆ‰“Ё%æ–C…âšP`Aõ–ƒÝЊ‚)kl9šôoq»á“šcá‘h +rÍ9‰x]–©È¡ýH%g!´Šª(‘ñ5G²gWDŠwúúò87ÌBv•e2:]²µÈysYW ¦!Œ¾mOËﮣî«9X’D!ï·ù'8· +¹#:.àÁJWó ų‚畳Š·bøGDŽã(–>ÔGžGÜ'DQ `Õi²š8;]RJ{ÓGG§ð0'-D…Xe˂ðÄA砞`½WªPŸÎARÅZŸ›U‘NYt:£W5uþR5t4·y1µOçÈó+Øyk+Åèl>ÖÕ> +P‰Iç@ÂÄA÷²)¶Ð9@´?'˜„>ƒ¡Ëñ2²Ð9¹£(ۅ$Ð9ίM ÛKðQ@Ö98V=N 5VåÃ:G1m1w§¸I­ªsf ·£uŽùÞL—y©s@ ÎDÿKC¶\çØÕÏ0mÃ6!­|אÀ†SãÒl&|ìPÖ9ô¨àØõhjzCîŽ@S pZ¨s.åvçë_©sDç=îGVcº•€)[o=êTyÛU')&)¾:ïS( …Vèa¬sÔ¨b·Î¡Ëÿ”³ÏDdÕ9ȁÇ4{~š_m¥_Pç TÐ ¶Îqè–b‹³ölaÅå:‡gÙ]ðî:ÍwuŽ¶j9¶.>j\–Hí¡&P¹ŒÕ¥c›’r„$Çʼnz>gšÎ7aDqo +ÈèÆyžÃþµÎQy’ç­ÿEc/ú3ÿóptŽo·›À.9Qõ3˜Å s¨;Jj>ÄÝ ƒŽ†R:Gy ‚AÿÑ9˜N¸úáÒtP骕j;?¥KvrçFç0 ª%´Té诖Dnd¢vÑ9:ïõ :nŠcŒä:ƒ$BQLýá,èjИ–ásÇ¢7”T›sÜóöDïLÚœ‚ï9og¢•x²æWÙ%•Î3CÏ:UíéÔùLâŒ'ƒÏ*†C³ýs±CoÂWŸçwýwþLætÅ9G×Ё/W¡bsÈvƒò'‡„sÀhäœvκË0çp·‡±dZL çD]ÏÎ'oޜ#»£W|öçç½éŒÖ!™9Çk£xzüì£z¢›sì(Îyp„PœsÀAç¬GXÌ9r‚Нs,¯‡Z•ç€È<ÎAúÌv1«Ùp0fy¬`R@‘¤@*„Iä´³©KVLÞFj÷Zê,Ç/€x>q˜§íãXYÿ…vj­?§yAp*ƲWÁ +˜Dìv8Y@ºbW­$póImšê™ž!”jSQJžÊ¥ÍCÓ(ÖÈøûo/ßéªîlç„T2q‘³asjB©ÒØ®%e(ÒóO°>S MØ®…Ze8ÊÛ'ÌòÆE¦(KÝd_‹¶L«qJ†þk=ÌÇHá$kd#3Âóy¶œÈ3—h¹Sו.¨…rK8u¥žøw¤–¢±8À†ó uÔƶÓ_ÝÑêöšƒ®kB={‹QøÉ?ÐaKý¢d°íß¹¯Ô-†—Ù¤°Ó"´„[«Þ¯ B‚¡|eƒó‰øóãMzÜ3I,'´qù|†æ¡SµÚús¬=ùåRôœÐT„_O$Ì~ÑÌÒé·ëK<óèåÖ Rk{ÈY)»sþTºs’빆¾D©žçË02nê˜qs?IK¦ èxks2ó=f¹ƒG’;sGº ‹OÜå[¿V¸hÐ=ô%ðÌÛqŒ‡˜aœÜ)0VRÙSƕd´eusÑQI5.Á;*ԛ˜4ù5lnÈ4Á ‹ÎÎ[â×)‘¢Ü”b +¼ÇJ~R ±×[¦õâҍhYÅü ?ñÃaåÍ„*}¸OA€lšhzmÅQÔPYó©‰)Sâïix¥DÔÉhÓ< ¯äÊà©(¿†'i2eæ¡¿9wOÂ.5D&E׃ëd”ï +_r$(»‹Æð¶“A¡}Dƒ‡†r¼Ìc‚Pt®õ¹&l“)¥gq±´úÐ؞´†¤Ì¿ö +Tßxf‚D{òð·;26š;A€¦½|P&¶n·ÛTo‰›Ìjè¾{r5J/©¾`ªÛ²_UZS>£·ñ}ýAê6šuXsmåÞÏå•lï"‚¹Ê7֎³²Ì +Áp`a×Ç + X¸TXwœêº%>­É+‚Ï— À¾[¿Ð]k¯yB*–,r‚%ßzóÇ„ojÐÛÜ.¡þӓo߈،ãxƒÝ¨èõþ—‘BÏ{žîK*1Xe4ï(Mt©É0MËs;oÖ©D`ß¼1ºÍC^iœ|Ž.((HlΚ߾ƐØ8¿IvVúˆK1$M€J0™GBùËÊ™ÉgLKahCsOËTßó†|/„ÀKgÉTSÂÌx Ÿ0¶Ð©83;OK*B"¼ Æ~Y¤yýwӀ¼Ü0 j„iöˍ¢‹‹Ù*²Ué¡2.ç4HÉláE1¥¹«H`J 3{ÆԖÌ]û ÐaÔDõþLì£4}“‡¾ yøLNò[ƒ ‰fÔq:ü†Ø†¢Ö>byxÌãœLä ÑâÃ:ü]¼1Hà`]«Gs¡@†=ß핽W{Ä4t†Qâ2òÈñŸJÔF¾Ë†I*SÈ= Z©* Ø#w+¢BL¢‚Û,E»/ëE© ê‘Gzâ<É +¹Ÿ‚…Ÿjý¸(hѬ`"·xxÞFÌü¬ï>'c7—«ÈI˜ÁµX«é3åÚ-Gnzˆ•šs´J¶¤‘Îæ`?rv1‰™ð—%ڔ`½É§U)%ÕÿÈN¸€/ ¹¼.,WÍMBdJ”D>À·_ðÂ9¿´Ãp¯nŽ»Fê^¶òcó§–ÎQ/CT(a-bՂ³Ü›ÈžgƒwáV×çƸätQ›Dî/gbŒD%=¬™ïBxQ}ñÒ¹°S•C‡3„.cd‰…YßO¥”·S +ÅÝ# +è5ÛFûY‡´ê(ñØÙk>¾ãJýÅîé2$×A3ҭ˸A½`•Î] Œ>¨ƒ ¤ÜKˆ`ÛÃ706È#%y©q‹i°°›0Ô"¹ÞD” {CµDki4ßvOì²$U.åZ '¥¨´vˆ +s-I֛jÿÐmðUűîêÇ¢%è¼AèJc]~1e»Ó·eH¨“šö#pDK‰4 +%½”ôò­qþøL”þSº•Šñ¤³«i ‚O?ÈÝÒ>!m¬üä†"³h±z5~´J‹–9<ëRÒÓø‘P}>‚(Ö#†1¸ …Þ]å¬É¸h’´\ 9”Ó×ÄçH¥&­yFÈ#[tUÿúG%"•«!Ûó¬}-È)ÕéÐÁÔV=9eÊÍpnÏí4®5WAâŒÞ6êÐ3 Ë(îrÖm'ΚÙþIÓK&Õ@=òK•$’¥’¥ %ˆ˜ÙG<¯PÄYtPÙZT|¨–þTøw’‘ßBR1¦»t‡ºÞùýéònmŠø,îp‘<ô§´ÀÕ õ`¸Ž ØÙ²­”9-ûÓ>L… !‰=1æg4‘£àT©Rh—ª™„e&kË|û†]ëi³kø¢ªt•)%“Œ“R;_s}¡B7…#æfM­M¡x&ÂøÈù‚æ†2¸—ª­¶ªÖ@…‹Ðîjƒ7Ê §îͨz˜†²Ž*)!Eºkhi0a,©gÈð™üܨ½·!¡V̝Ž#…·ñý°}³Bd’Gþ³Cǜ¨õFJˆZÁ¦™lM*‚}áy2ó4hŽów åޔÏ 2ǽ5qÈ!Rœtµh"ÉÚ÷z«¼Á?&ùDk­`ìŠÞÈcBtˆê`Œ zu˜E±´IäËàK`©&ÏÒñÂz)”“ Ö ð¿‰ú©lðÒ"RSؗ¤’SH…DiAP!ˆžÝ¹¡GÝéÚP6ƒ¿èL˜Íƕ¨ÝhœQ®#ø©ÜQËœ6‰a½0 ,¢!ðº¸É,õÑ]§¾ˆƒ¦RÄçØÍOÁÉZ2¹4h@éå&ãL²$g›ºe³4qR{”æz°ÀŒÎ!i¤ºÊ\/>×OBÙ(Zj²é΄֐´[}XsÛ¾F¸oqøÓFjS'¡…M/[¤kpò÷9ü]Öqh³­Tõ*(v@‡è¢ϟá¿6з‰;Ã2îV½b¿ÿŽ³Ë8þ †M øÛzÁ¢ê;aÚËowXtUäÐïµÑÇ<‹_`½²…Œ("Ø'lëˆbÓ:¹aè+(SžbU¹Còë¤W™ÚCýXTaó`urS®Ûÿ$f"Œ¢R‰ûÖU¢9nªüž åbòF‹Á‡ä…UO¡0—öÒe +ÆǎÜÎ9Äg5^ûŠ¸a`ê)ûtIYá ›7­ÅŠw.ÊÄg¯÷zØ8 ßKú¤îƒc=š5Å)!eÉÎp£ÕcÃb|XÁÄ[JŸ¹Ï ZÄß½?Í'ýÝö¯_ñ ¾Ô®D§Â„„6EAï¥@ÚÃ㟸DˆËƒXúòrÉÅc”K†ŠñU9ã +R|ìZGBO6Õj=OE(¡“¬Z2â„Çž »#¨½VS®3KË>;á;´ì/e’ËAQ¯Ü%DlcÀT D´ô!ƒÁ‡EÑ{š¡ORЏÿZªBµ>É@‡áÑ5ÕÍ‹žÄiB¸´;á¹ÏÀ-‹Œe™2aÂéÄdUÀíëjIà"É&iMõh â«àè#SǨAðYhkæF)z5I×÷KâÝ¢¡ã”E&£ÄíkÉ »uÒðOZÉcIñÐÚ +?iÍP+Â6:ړ¡‚GÒ ¨L5'㶖¥ (PÊêȂßY±ªs¸Ñ9\»žµ%TvN@ï´­còG!@àÕ@L 4@#æƒ4…Ï4l›˜N¼Q¤€hìC›ÿI‘+è=`v·ýpï;wŽ&ìjæ¦Rá9yñecôÁ Ý¯Sµ¨7R§ÛãÄz"^iÖçKó'‰ÿT™ÀַŽFTÈБlD_ 0ßG +6¿$¿ÓFºJèHדò6<; +;èz¹µ´°Fqg:SåqÉ¢¨Ÿ^Æ\‰¬u" õ²ûïUÁ˜µqEš·7ÊHà5y–åeˆ$iÈrTvFdÍ&>@µFjÿâĵ‰]W’Ý#J«Xq2ضFœipÓqo:ƒ ,bqÆ×ց ®‹¤Ñ%^cÕ Rs”,!µª—*Gáønêø=®™,wû““AfLtsØÁ& ’î¾LC?Ûo´jÕàãêAzÜ(o[é÷O¶=°9¥V%\ª›×²«¦°\@ºÛ @í]i +õ5€˜&+6¿¯_ì±b/ùäà´&#$ƒq‹2è)(­GÅg¤3yÿûñÌÀ´¸¿û.K7éÜ ¶} “ÒTÜá ¢¿¯k–Š\z¼@&¶=ˆB¹”©Dù©åáþNþÂ> "Kêð¡èn›¥Shd;²Õ &° Àµ;0?ΗBqìlΉùÒ?)ó3Rù0. jܜ¨#)±y֕›Ú*j•º‡Ú+¸~C0†–9ÐD,,΁%+4G4v d¦+˜,I.˜Aûwr>çÀw8`£ j,ܸ} ©…n®„ŒI!vœhÐQètáf‘¥pxv¡g•¶ØY”ým­º$£‹sŠ¡µ‚g[ì Bï%fîÐ¥•òñ6°ÖüâTOÞS?öxÎžà@åPÝ(›Ä‹´e@!£ªJ1° 2Þµá»ff3÷pX¿²×g¨BH›Ä霽+˜¼‡Ñ©¤´CþWÜ¢”CC£c¡¨g¬†ŸÐ^ã¥L7$±í-o’(R՘¤B‰øDçlFq)IL™†DBžˆ%ˆü§³—ÏŒDP@^.% ïéÍ‹»ÌB½ªY<åä'²øȯ°Ü„ni[ðe+Н*<¸Æ‰[q]LA™2NtclÙ\µ„u]°‚ic­6È\S¨ÖË+64¶° Ë+D ÷k.t†euoõ±‡ÌIʚ%3Y„NZVOUôî¢>äّڇ«¾68¡¡™›wj4^χvÚ3x;䶨¶x{Üø§N=’¸Š®”š3‹>¹ö+‘ àÖüÀèyÜÈq!Êr;èx%;®Q‡,`g””=Òpåxh1‘ì'Uª]Ã9ñ"®ä–$q 11MÔ×؈èÀýg-~ÊI§f2éyÏSæ·ÚçÂI_{¸%‚ ü:‹kx5€æö& + -œ_¦"I¡û,!Ö'é6réUH†‰„¬©,ƒÓDŸCŒäÒ’0fC³©IMƆ¹„æ—ìÖ°j®±nˌ?çé¼m)pYBƒiŠM.“‡ÄáO,$Õ*ñÅÛ<6a´ÒÈL¸‘ø)á‘^¥ +E-ýí2Ÿ45‘ D¡ë¬êÔÂ-ó aBB™KÉ"C¾¾è“ÌU)3ôƒ9ò™³ý;-ëšä&ÕÌlæÁUÇÉÒÓÑWÏOMãJ7q’)ÝXɬ×Ö –Õ…«‡ZÜíBÛwH¼›ÔÔÇW’Hã„'3¼M¬ýIÓu¯4Ú]o”fž"ý;‰9Y)Y¦Åmô +D¥ô(NE~Iiv7ÜÅÉS€Q°¦àþ¤eòŒmçwÅÊQ%ººva ;¯&á'$ˆÔjÂDÕ±¤è~,$†˜5å<7Fj¥»Ñ|«&$­ˆêË% +-Å_lð^: ŠŠNS±}Gèš3Þr饚ž~ÁÀ)n’Öi Úocµo£‹ùp3-9–&Ñ%æéQ ÊT2³ð:ŒbU"j`¸A9ÈON+õ”#Û(³y¢÷º +á7>ò3GÕE‘%9)ú¿Ð„‚ñ\B— Ò!ˆS™ÝŸ(~è“:+§4ð¶ 9>Ka +R]äÐ2éK}OZ}A(¦J¤n£~ú‘QüUKžäfÏ Î•Û«Ña˜|¢æ¡q‚2ÔrpvÏN'$öh&ã20Þ©}ÎKÞ#~"M>º}/ÁÕ_ƒéõõ?ØÝØ_`™H bYìQÜ¢÷ã%¡'¾^Bo2a ª:J`Ó3åoÊÊ3”™II„^­Åp‰†~&K!Oa 9z– q€ ª ²‡&.û ¤ó¬‘h°´<#~© ¥÷©£ Š)ã( úéQÝâBê1ÊÛ 1¤¸U'²‘©ìLRöþØ †ó쪩f¢8HÉ'LQ¸¦fŠ&¬}õˆ{ +ÍøŸ²E.”šwæD$OҘܝ®RQ¢KJ‘ÿ\ô€8¦™Øbÿ‰p =(Ӏ€s4@+UÝæ ó¸hÈBZçŠÍ#»"!—ùˆ‡î0ã¢NYÆ7ÇaüS+ânȤK,›Ëáw‡Ý‘%V\çÐL­²!©zž±Òâ¤6𧰴ˆ¸êÅb¢¤tn-TbþSéf<«ÄFýk†l–*bQzW4^ÆÆ"Á×&ͦdu\6•@³8}Q‰^®ylk.áÔ©H)˜ ¨”ú=Šá¾ÍڄS©ZŠŠzÌCµYI4ÙpçÁw?óª(©@Z™Z°¶P+/`„§[ˆ³Nrê¥C¦Áp¤ Á uu4jÙôþó`2¢„ߥ$´™ú²}æEÏ×SoÊ$C‘D Ên…Ñ*¤.N˜„¹°PUü¦¡Ý“m”è !Ž#qEdCöÊ"å¨E¢;R%—9Œ%ºeÚ3„Á)ÎМ‘•PréÎLˌ°¢ÕL=cÕIm—iT   j°¯V5ÿÔ‰ù5«%4˜Nê؄s¸Å¥²ô2£„LÁ’Ø ¦Tt5ë̘,2’ûxJµi(ºï; 숰€¡0)HO º‡Þ¦ `JZ|F‰Ü҅H¤é8„¦L$?7±YY?áä§ÈQlvúÀDšW˜¢ÆWg]$"–=L´â3JŠcs{¨>Ezc‰•ìÇ8MÑÔ¡D^ÌFßQe͌þhiôÇþ X +4_3%òÓªÜèÌǾL•MÃmÂцÖ%‰à¯Í%왜²„Ø}oŒ—/³Tۚx½æ û¨'-(ŠF(‚þbžüìRòÉw¢ìÞf))Þóú)’J,ÂCå#´w|FdHEí5mæR”ügeî֘\”Ȧ¢eL%÷ J/§žÔ/!ò)- A1eÿoý=Ⱦ™Óc·GS²Nâ68|ùlȉzGJ^»l@@10@ϒp͛”)]©>ȏ²£ªžÛlr<„ZsŠïÎd 8î¾*•Ð öwêQ†$skƒ ÐÁÁU‰È‚>šŒE¤ÔxCZãtj…0f‰‹ñ׆1Ôy¤dM2uÌÀªðP`…«qZqäÓO£ÄGf2iM*¸ÌáϏo]F¢XsnÞo¤¯yñ4 +ÉH-³¿ù—'Ê4Ëd™l ª¢FKæ3¡Æ²9¤Ù(Tͯ1ÔEV^ô0º-v‰¨–ß!Ê\¿p›Š0rYB†¾ ¶ÑO£sr„œû€{^ÂÑBTŠ5$[h¨²(YŒe‚î04B"²]t‡fÅÿ%“©¾Æ-é0æñÃaÚùÚIÔÜhÚ‡áJH֚™„leŸœúÑØ>W)¨[ªâvþLmìI™t™G5ЁTÕ!ÚÈ%\Ÿd_F)[«‰-UÒÅH´™‘©½^Ð}}ЄNUKª ñÜR‡û?/¡Îˆ8{ÔÆ+âi‰/Ad”ÍÂë¢É[%ËӘCD›Ä4—93á7ސ ­·©8, Õ͐Ã$*™j +!-§‡r":Tâ›H!B¦¢ ÎdTBASm2]-JB>3¥;¢|sΐ ± Ó2šaYXeÚÊÝe-’¹‡yºB^&7V¡'V5 +Ù„ZÄBB#aÈÑ>Vgýu­áº'šzÄtE$DAéäÞÜҚg¨ó +Y8 I݅ð)pÐq²ÃAè« &ċp+•¯Üâ…øìÅ"(\(v¤0‚AxßètR=¶æ3áúeHŽ¨³ˆ*Ú + +âã±cÎðu{ÒE ™b %N- ^óõc _ï?³ži<¶n%+qá«_pH§c)(tљ">½WhEÙHq+ª04ÍcMhUIðþi&Ò3ˆ)íTõò$·Ø8eKJwœ>ij ¢ûyêR©pbv@?JˆÄÂ4% §5®vÓó4ÈsÕDbŠ!´â¥F6*U/SçT¼C·’|‚ ‘¥FEË,^m›QԌ\VÍ"|Jð…¬6«†å5ªˆhUzèZñ'¡ý4±ý(ªÉ—¼¼y$fUÑ%îÛæDØŒ ±‰åŸÅ'ÄõÑCõVWO.†™§DºÙFῘ-ä‘"é'|°(ïA4ÁPj)ÛN—VÈUÔ;Ÿ³‚ÆÒ`2ú0vH‹þ +¥ªÃ¼®©¥A¢Š™¥K>šû Kӈ}ª`éUÈÚè`#ӆá}ÛÉ¢O«<"ÝdŸêú¢ÔTµÁ)|ø^2ҝŠäª~Q‘(bÉG¬ºL„Æº÷O…ñº¦E_Pl*ŠŒn!(ªzÕ°­Ù¥F£Æ­(læ‡42Æϕf‡Ð­Yæ‰L˜‘"ûRa¸0Z*•‰@%ît.›Y•¤.)ÚŠ—(­ØG¼¦½Q2ð)O‡^óÀ†M5}à•¬¼¾6ü§ñ VéL îÅ}æË܍k qJ½GEx³í; "¨R-\¦Ë8¡HwÉÜôǂYzåØj!™Asv*rÊkŠè–듉w¡Í)œ—䏲Å0ï y¨ ÍH;^ٖI.V ƒM³Z…<©yrŠòI”Ê ªq†(Ä{í߬ù£ašH•Âgê)/|¦TDL„ÈÄUôDæU’áš"Iò(þ´H…‘!#¦MHShB +9ã!2ÁX‚ñ8>1ÁҀƝahéñ|>œádÌä6Uƒ"9rfJ–ö´ãqÇr@  6˜nj\353SŽÀ€šq„ªñ|z‚”¦$0`+•JôÒL‰V¥™•¨40JuÛjÕ¥‚ºQ0 â˜N5Ñ €L6™L&Ӏ‰L¥Óés¢ Ns’QxÀ§Ãü4 Pp•-"Ž‚©¨$rQÑ©h@€ EÄÀ"Šˆˆˆˆ"* (¢P#A(D\£áŠˆˆˆHHDEà`(ÌÌH™Ù7€ãæ ü1t3‚XãGâ„Èq,’„ÈQ ‰H”‚ ‘"Œ\A„d2”„ÚJIT`¢0T¡(:µ …!…¥V–;?³Vp +@€ÄEæ30A„âp½B+6Á¡ÜP‹Ï;"þÞ1>ÑÏÚiáCz¡wÕðƒ(gèœL=ƒ j¾+ˆ´ÁG¼Ñ䟕'|¾ÈÌ­*N¾8ÏÌúĄåƒyÑjF/ ›„ÍŒ]oQ{ÌÚdaÈ3Š +™Ì ´P_̌šÑZt@-¦¡Ó `Ñã䒉€£‚Pó€@„ZSƕ‚PAGf +Z L!¡ë•š„3ˆ<&’ 2àé +ÖP B†áñ ´Â"»á€ÁœÁ3(RË BŠ¡î`€gs@ëqã¨Ú2ÐÐ q 8PûÆC9ŒR¾¦…m³B„ =Ò Bb/„_ö Ø´-´m‡ 3‘4VC_Š£~ZMr@b# + *ç€ÁM % °&úLxY¾î§¥nˁr@€ ·Ã8ˆËt(à@˜ 6ƒÆåX%0€ª6<½@iª˜p°©¯ Å, î¦ï±mÕçQ XxŸ ºLE`@ï ”_ì0·UK¥3Qñ8ögá‹«èՙ ·Ë•Ð…psøCÈ‹P|(šÕPt H:Åäð£ÑbCŒRm+HÂD2dœJ¦O<òˆ“Íã¢q‹5¥½$[p1ÓCeL¢höS©™èêZ»çô?„t&¢GVtãÇöjd6aÖ.QP+*¨V!¾ø<ôhALòpšÑT(šÊûJ* +ÁÅH²JLñ0aKjÖÑÄ1SÇPôÃéth:Ðô +wªþš)á„c½Y²T`MMŸÁÐÊvÐF(ˆôQ_©iñL8Մ¿ÓUIìVe:3¢<âbk–4Ø´v–u¨.%QFljð”çzGäì€mSé+òJYÉx1t©:V•]ìzˆ;M¸…bdQc¨UR åGÄÚ ’™Õm÷/Æ¢õ +/¿¦Ì‰E9‹ÀeŸdђ£N^Œ0=TµÊnÞiÍßGÌnÉZéHPÈ3H$ûBéBÝf›ºV}Å•§G™ÄsiAíOÃ*S©,þä‹W4šÛ´9?F:MT\TB†ÑªÏ°|£§Je´…¨äëd5¬ £PP‘8(ÇdB‰\Ғ~âd(‰äY§Q©ߍøî¹SËÑØg<­aEC_ZÆ*‘ì\7øÚâ4µAˆö`l¬ñ¤>–Àf/Á€gÍ®­kQ!?ÐBM%4‡‡j6èì[TE¿¯Ävr]fº6…PäUÍ´ 2Žî5˜¦rAEŽÊö½§-‘AYd\Wº˜q@ ZT<£•—•DÜ[»t1kòIôo9$˜çdIL¦QÊUQ„ÊXÄ°ôíªàˆ¢)¸ŸªMu؄39³ñT½Ž°3 !Ž5¬%ªºÙºœˆ~^'à §Ê5#dßqudµ²ì2E– &Úç  3R“"?uàöƛ4Žø§ꋐɚ†•ÈÔç,êWq'òL¡0"´Œˆšhe…出=~˜B2p½„³ ÉÒúpàMŽ‚¯ˆìN%1ÕrY‹#€9‚ £štçù(Ž]ƒÇ·¾(À: +SŽ]%S“"0t$ÎzH˜éâފB&ŽH¯Én$ÄBMíiÊ¢Ûú ë±õJàË°7Œ\­Œ¨C:[Z“Ù†  ®2v öK¦Ò5òÈNm—ï„o0¡¸ukQ‘/‚¿±žü€%ÄѺ*+Û†Ÿs‡ð}ù’B}¾Êy¢Fïq¥›åÆöQRÐ ßñÛì d:9hÐw”\j°¸¹EP¸*ùWµ­ªæu7ùX[‘(`Ôy8~e¡,µñFÃÞÍR“n®X¼òJ €Z„´ÈlÚ9lö +¢ÚpÖOÇ÷›[´²¼p±-EÀÎeêrøä ÕÊÈC“IèÅá±Uáu©„fÜpŒ´¾ã¾-ŠÙŽLU„@MM‘M‚!’Ð&˜wösJÜÆ&Àw« +wÐ9ƼŽÿ‘™ÁOsF߂ŽÓõ0%U•‚º9ºjǧ­I½Ú–TzMPätþ¢‰³0XË­2^þwvíU€ñëW$'3Gºr…ê5š¬¼)9PÍՊSAú:ä·iöŒE§hÌ©“L8ï0rC°Mdô²„*u¢¬§­U7sï@;{–´ÃÔ:ŠÍ Aµ”IgC×È ï8ƒap;9úÑ¢(Ì|‡]î^0@›Ÿai„J +®àmZqŸØC•Ä'I ÆÎll€ŒÀ²Âﬖô¶hä ¼%œ­Úœ½ líTú W`ÌZˆm ˆÏtg ¨ç8K“£‘Cû½Œ<)†-ˆ¸ÄŽ©hWŸÛ>vKÎ׎óp!‘Þ)¿ßnT@T÷þýÈÝ4©æABÑ»`—ªw­Åüö0è^]χ³gcåÎø$w…›HÙEMM~!9ç\~á]„“ºÊñIjXTó—N3Õ-qLÆþnƒì3´®;öÆßIv•m"¹ÿzðƽí¿kSÂrç´U­›:Ñþ®zHSÄÐb‘pö”z™üÄ4 Ö­],¹ÏœòáŒXn`ú+Úzd!ãXy§&ºj͏ì(a´PFG4 +ʵ2F†Ÿ­äs4L?»®kpY͹’KëZ/Î%Քɧ>^ú ò¯·Dì”$bs]X|1²×µí”aHE*v"¬Uc%[¢V¼`c)QP$&wá¨h+ƒÿ$ +­®qݵ_ó!!rı¥´+aì Zð¡®Á¿`U!Y׊!o<èó”S}Þîª$H§Cõ Öµó“Pt*ôî» `Oy]ƒH…m©å ‡FT9”¨oiÐƔÆ*ªjÚëæDcÑÓä‡Îä‡dt‚ž¦ƒLñ[r-jÜϞ%P•Úu­N&.á8é´ÜîPñ0B¨kš´’¤U‘´o=V׆€êu-º>÷E,îtV‡`Īe’Bž} MZj~o4êsÃò¬›"f¾€$ðõ‹>âq)uåÚµf'ДöB»ÖEàr#tP‚Zv#V0ÆȚ¾tü—ƒ.¬‹[é+žf9å‚D“{‘ÌÊOu7ÍÓ>ôù„'0§?_ÕÝäEÌÉ4 +±Üð²¦@â•sR ¬ý:K5âÊ7˜ŽuS”‚z¯X¤«JŽ¤­‰ØDj2ùØC pHléêø¶ÎQ$ªžÓ©‘ÈÉwhŸÂN©6ê{„sÄQtªS8õ1/9^È#¶S¤D t&P÷õ+‘4†.¿–ØÀ2됟¼D­$‰¦WOaCk1ñT88™Øbÿ×q3ÉQ¼ N8ôLÌYÐÅڋ&êzû– ï(fÒ¡’“Ñõuæ6+uþâDåPfB +LlɈ˜ªN +ÔîÄ.£x{ÂO˜6RÐ¥ _) ä\ý}”^0q Á?âG2 €bÑÔűPs)ÿ.CQÅf6v‹â¶¼.'¾Æ¤@¾Ë KSGpŒRb· o +ö#¬RԄ¼™ÄƒªéKñ‰Wb2 S¼×éĚ)®Ã‡nŠ!‹ø£Ý×,Qg–ê̚Ü'¶=!ªÔIßô«?є»h¢ëžÐ'DßøvP²ŒœïóÍðâo¶Ñ + .1 ¯ŠŠºQ&²p;$¡Æœ8_EºKdtÞ4¬¨säfa»uÂ$lÅàç’¹â0œJþž÷¯¸¬µØ®`ÑTvÈ{÷ýFÇ®¬Qc}:Z”Ëìñéãô–Åþ¨Ê“q̯Ñ03QÂȩϚÀ´Zì@¼Çmjز­7@Ró={ X†Å¼œÌ!Ók“ô ÀuÿRz&€%f¿¯Òù¤˜ïDõÕÑÒ?l†\#S)éìñúÎTcàðæýN¯VÜ3ý%ë>‚›óùnŽÃZ×Ý +‹2Ó?C‚û¦éQsIøŒ. µ¨bv¹ù†Ê± X†»þ„¢myœD§Äñô²üžÃ>=]@ïzŽíéaº~ÛÓA€….ÒªDW(ºø˜ÊŸ¦SÁ?§"ÿL’ÇȋBÿEÁ4"ãzó®OÐbÌæ(Håû¢ß ÑJ/¾¥hÍÒëŠH^þPK\‡á^cWÒôFwÀ…«½‚—‰Ú€Æ ME­ÌŽ„Úå9XŸS(‚ï½%ä­½ ÓSÜö*¶À÷ƒÊžT– / Ä1†Â‡ÿÝ·5z²¤%œçŠYåÀ‚‚Û¢¹•V©P¤’O`?­” +4S(–D–KŠÝ;å)\ªhøÄ`|„nrÅç W‚ƒªØ1­óçóªŠôí&–n«¢D»Kˆñ#æªÐÒ°Üq<$™Öî¢ÝÊU»Þ´%x?!-†„šX"„f ^VԌVS|Ëғ¿Ô'Õ +¥ž8¹Bq|hßJ:°u—Pv+aýn‹Å+0Ekjí­xÆO ò—(ïúŠ-cþý¾u`Ðö¿BGRQêYö4då=ôU ŒL”¿y}mځ!qBè  +…ß^)d¸ ­lÑI}ƒ‹áyù]öEé¥Ï+}…c±vHA9ઠ+•Yhm¹`ÅH¶’æ0˜É=nñ7cñ¨í̂çì&‘!#¤xèãuh!¸† +& ÇÖ%÷ äž +em–ð9pV¯*0c큏5Gþ;ô T‡ñƲÊÇK³QˆÓù׎™w¤³ƒÛȚaôŽÜ÷wò\ÿô. ¹qg_!.@YÒI$«µÒf–ÄR’ƒòÚ$qk’Û¿FŠ½!FiݳРJFàîìE§’#b0TžÉLQ +_æ[yM +øŒ¢¸ôãžÄeÀ7;»UÚµelj-²Å‡€š¯§ÁU>¥l Cªð–æÖEåxá°q›¼Ph„6 º`^¸òJJòÍ^§€E°?L,•ÐsˆH ú8Bz@A#r㛉´þÿóAÄú{ƒx“v† :ݛh…ÀÀ•/ž)Ä^ü4AôrÎ4QäÐØèh\@‹ŸªˆàU‰ÀT] EAjj¹ÉV‚ i;éÍ$5ý»Y ºÙ1ÔÜÄTюags+Y¡'1¦£-$ÌÔ~G£JpYȸW`è˜HóÔ±ðÄÔSµ/·M:ݶ¢§ FeŠg•ÁÄ~Ì0Búf õ'/O/ôû ³ÚŸN»ûƒ ïnigpãµ´^ß(ûB®ÐKç½aŒA‡Z8´ßõ´Ô×L«›øTæ»áÀÚĨ›Ž6Œ…eú›¾úô+Ú_ú7#¤0æ¡ |»¼7×& ¥ø6*WÚcè혅l:<´Ÿò¾ÐR­ý]£®ëA5J†©P¨F[‚«)~¾’æù?™OèÐQîiv=ÄÖ9Bj5H·¢XÊ p`±br-È*gMV€JZ8/æÔâÁ_kêzßq‘šÒ±®æC Ç1ǚ¦ÊqÀ€0?Á¹†êúþPáÕ`Hí2)”¤Ž§¯ù ݺNߒ±šJùöú£Ž¾Àr`ñRvPÐ ê°RRõ±þj4“­Ü5£Â¹úó%#v¹§Ö¨&¦Dfe tҍÖD*ÞP_$½ÚÄûÈ«>NZ.vs‘5¬¨P!“©<‚n© 6†+Wš³vkšˆ +×ïÝt ÝÚʜÛvÆq™‡í“Ž[öeÝiΉøØzˆä°[þ´>†uZÊ!òÕYïèŒ@UazYŸˆ8ºƒgÂBò-ŽãRÄv“ä!ò¯éJêéðtÊ!©²cgí°3v"ºa‚ŒI²²jE_ýÈj×*aš—¸ ,JÚ;=¾Ñ²Œ+£¬Þµ¹~ÍÉÀÇwe êžã„:dy…µ7PDzS ~›{¼ˆ‰LçÙÕ$ÓŐÉ챏!A%A2®¨q–Íœ[rÖJâÚ½—*6@­…ˆk-’aª×gO ­ôÛ~û[,L<­oقZA7ôþœ´ ¥ { î ä(4n Ajð[èJL$ŽÒ(©GNBÀÍèЅ••äà¿.Û<Äü­XHµ³Gyu„:Ôõ¯TԑtûÀN&0 y&…µ`˜x*`Gz"aþê —?é‘QÂtáÂ1ʝ;ã)¨0Láý~m®†¿„^LÕË\êíÖâd›FÜäþ×|Ä@;f‡_‰Å0¤-)Ê SjJ*kÔ¾NðÖ¬ü{ô"Þë¹APöó ¹-Ôq&£×ÉtÄ`gr²á we¬w¹—¨GN± (UëÙLð³¾&_sœ>rðB½$áį•£:N- °ÊN¾6|]U8þ«qb-µÃ€ä~ÌX4÷]„“«K¸h¼zu¹’ymÔá(á%6ez)^Â^©ÃEÎN¸ì¥èq¨DD²"O<\AËG¦V½£X¢ò )l—ɏ(µLHdF@YÉU46&FWb:Â)^ªŠb—Ȕē¶?ñˆ ØLZ¬/©Ú²Ù¨Ÿ*lrÀ#‹+‚2‡XÜ +L1½ÔøƒŒ(¯ òŌœ0‚\t†"CµØø¤·7ŠÔq½…z@P‘£§c*3"9üeÀ“}b¢ØPk2l¨Ù"Ð- Úf>›}iÑñ“µ<´þ["$KZ8xúޔ7Poºqyåä<oë!&…²Ípô< /a‹Ä²~Ƴ ÔôÊ« I1ŸýÌ&&Î!µYő¢3˜2áú§Ž~Wé–2ìó/ú戴¬ç¤‡¥byîHôʃbÿba:ÉÊ¿’”›ó•Úé—Ö? ²Ò#?#B5ʛq™f„<än3BmâÜ"–x†0º'X^ßrn’P  J}՝‚EB8NŠHßíáià +Kˆ©&°Ö8ý“¡ù{ƒ»jb3™‡º™e0šÌO˜Íq"ù_í© = +ïºy Ì +C¼IW1ƒûqÄ7£É-L  +³V\žà …`P-ßæ_Ø '@é ¸•Xl†ƒi8Üþ¤çÁ6®Ü !QˆÌR‰Áæ6 ïDuw<Á)DUÖm‡$Ï(0Óxœn;Àúњœ¡ÈDó~¥aȶn¸NÅÓ4œ—´<c«˜K ÕÒѵ5Œ5!,²9] zÅ·ÂO6< h@7tjCÝ;œQx ßç ²BլҞÙÀßöÖ~MiO„ó8(2ÜeYÂâýIªÎ!ÌùËþætXpùZjù­Ãîöäf‡ÓY†‡9ÊÜõ-®òPšJåwGX!ºÁŸrÒ\[üFÌ÷†Þà1®³u]›³µœF¼¼ù€(˜ôË)cCfM*ù†£¹ÕÏ}Àâƒ×6¯j@±ÇvªxoÙÓGè|t#™|¢ì3Ø)՛ž"ƒ1œfNáù{sÓ²9„LòYkn+\Æ2õLZ¾J–•.8¸•7BaG8åš1É^£Ö´?ÁV #L NšœH˜Ö±–V’¥  V,˜Ý´Ã9ÄG–U[âp} .*¤!DÉ«‡6æ$[è8ü?†R”2¼“.Õ·Þ!4‚öCtØ3‘$Œé~0I`ö×Äoä­xüCύÔOnp%žÏX¸+øÄãHX™u½~ùñTUUZ`ö¼wAÍ;w”3õðFÙ_¦\-¬M/ËQ H):^ÕKµ’¥„CQ ý­ØôõI€¡”YA¼ö@%yÕ̵±Å §†K,âH ‰Ev ÑùFH)²ÌÜ›ˆáXv ž¢’¿çpé¨ø¿ÇæÏjÔ¬³™eäÜ6A ƒkR±±¶³¸®ßýc¤ßâêUÁÖDG"ä9šÓ}}Ö>†²Ço +ŒüÞ¨Œ´+ ˜¬¦54д=tªê€h zxš™´O9¬4GØðonޙÉ«¤¨æâp– Áª@U¾’Ø‘ÆFKâÚVž÷¾šlH]“ÙÑ¡Þ£bhUD=•|¨å@5w˳uâï+üû"†ÀÁ ÷ U…YŸB⋠ҏU8j݁¡×p¦×¡8nuÖÉÿµÅçcoòDq|Тʡ‰5ëâîÀ1µÀЉb ñcp#8AŠkQ#?\ogÒ[Å;G꨺¤NØ LáL¨Þ€j-% ÿiç_ª0¸HQê1óPËÑ/QþŸª™ÝКˆ¶^hZb¯uµ2L£.æÁ²»ÿfîäHÑU4úy +¢]÷õK™ >Ž¯×œLÊ¿ù|V}Ã.!ØÞVæœÅorj bàO¥ð½ºQŽðŒ0q#q<Ç c„á{~ †mÊô‡\1*IœJ¼ðÇĤ`7:0“Í"%’‘Œ·oÛÞÕ¸|ZRYD¶Ö\1šâpƒôXƒs Ð-X•iu@‘ +3@ãp6(~‰ù?i÷°iqØQýyŒx´tL÷wÎ„PÍaI[–S&ú3S7íRvƒ’p“O¤zÎoś`c1àþØ9Þ"Ô¦R|$w¡¨ôLÂþпÎǼ“Äy?Yðê³j“ˆw¯¥(Pã4`‘ƒ£ÊêÁšo=HMâ©ê»;Š¨× +’›?$g1’Ƥ~°,&ᅣxÝ ÇG$0!Ǖ&y#,d’ éP-mtmêäÞÇ/NmÊÖ½A}¹=uÚf®ÄS}–AHìaÊd ¶Ç]¹"#¾`§îp`_å J¢xVUÓ +‡Î!œÝvMÎܜ‰%ù”RuR~Çñþ¼ß Õ°°¤(˜?C5 /À©·ËàߌB/փ^5Y@e©Ò‡lc¡œ`L¿[ªâ¸JAÅO©Ù§tœ«˜Ù¡o†•  lÅ]½nf pL°Ê„ÛH™F”¡ÊR |Lô”ä¼L9ï{’oȀ4ªþ„‹Ì—gޛ(Óìh˜ëÈ¥ÒWÔIÌH/&™®±•õKÑB8„\ÒLtuðÑq?°Q°²a°PµŠméÄ]»9¡‹í½R3»ÏiJøZ ÐÝl.R6Ð û'ÛA~‰]:Šj›®*î¤1M1>¹„=K„7œþ½s<3÷b2:!Ê1îC¬DWb£­gPàßþ‰ƒ ¸€8¸Ü„#vf:Ç[»\¶Mòš×d HP€‘š¾™h´b!•æ: ÕЃ¦QØ+«®jQÃØGIkFËâ uÄ­ø—¤‡ÈI4JLä–Å)èø³¼<‹½·!á§Ðæ**óԛ)‰ÎÛ±ÐÏdøÕ͛–x§2.躓ÖÂH+Ç!(€§º~ t±B"Ÿâ; +T Œ3sãúE™štÖS™‚©Ðo¿E‡!“ZŠTÉòR L…î°cõj‰6Eõî‡Vi½íŠd/-@t¿CV góFà–/:y«ʹõ›§J“ã¡u{wý s¨òß)‘S3Bàxǯg@TGÁÙ\7Øì>8 n$)iÐ;¨„î:Hç—&ÕR—&•8ž¶_¢7êÙP¿›<.ÂÒý SB?üBY@¸ +pÀEa mù„h¥e³d@Ckâxkct6Iajƚǻ·hã(bö#ýbå¢eÜK‰@R”-XÆjˆ% ð_ó— ?ÝÙ{/T6ßÔgÒ…WÒD0-¯u¤©ö¶‚"Öªw~c(Ìϼh¡¡ñ0íù{&^ÿIшª¬ÐìCäÍÂС ú1Ë4Hˆä‰Oàô‘Š ÆaäøãYXø“ŸAilÌûœ›²j}k­aÐÚàÑÅjù¦iÐÔ$Àc°øò^†1¨mì&Eù~âþZð#ó¸—/¬MËŬ½t¹Y¢8®°Ymÿ’HDߝÔ:R¬\$‘Áðƒ’ühCl)^Ä¥$ŸB±›V¾Dã¯+L$òüCԛDeEœÄŸQ ˜*5É`lÝdc€DkI“HSe&ϒºF¤&g;§/¤oúd¶Ã‚«W­µÑž>ɑ›/ÒóWE¢æìH^ÝWñQÉEÕÔVÙ­ðösA›¾Ci¸µ|i’L…ºU™.ς”‚´z5/AÀ­$tgbRìÞ¾%ؙ—|E%Ą?.#ŒãTº’Úî"LÜZënjšMK+|Èf04]¥6ñC{â$åLV"Ð\gp¹$ø\Ù °IQŠc„ï”RäšHI !½j¡4+tù~ƞ‹lǬv"ã"3'–†(_ê¹d@; #Ë!Ì_yœgP¾…8ñuJ'¶¼aç—5X }q…Beö34ÈÇ$mÎ.Jvaԓ¯§ Åì|žbN{µANidÓ\}åy=™>‚S(vÇ&ÁÑÔ“é“ [#Œq3^ÿÝ­ ê ª<4¿ „ôŒ°ýM®œyt²‹&+`jÊ`tŒ`3·äÒŸ0†ãçD¯q9Ÿ½¿(’U¸Ø¬CBÑhRË×.ÉËb©Â<^UüªVLw1(¸„£ ÎJ,Vˆ¸w’ü•ø@*O ¤-uî›Ñ­ADšÙ¡¤"Đ´…Ǻ€ë/ù^­?™äÞ”@qñ–7½Õ ¾{9®=LâgxB³¤uö8Ìusí÷ëðA¾T%ú0+O†£¢)㭑°õBxÌÛ©þÝG}Áý»hƒäd%ÿ]øŸqÿàK„RYö?ÞûlD BŒ3ýˆæEQKQH?ê¡Ê»r¸ß_ö:cFŸ¯Ú9¬êcՈPó8>¼RÞéÁQ–0¢¾ðm¢‰F¸ݖl¸Sël‰YÅÝækE*¸#Ü@ˆš&#¹ÕÈSwš¤¢tò`¢~( ìa²gû'”n’ä¨ÎþÁŒ»~âÏ£6ÓÙ Ì3}R©%%óFb¨J‘j¸PçÅ2… )”BLÀè=×¢1 ̆)8vÀ +‰ˆ 5ŸñŸÂN֞ñåÁ= edß1Rõ¯‡üw¨ˆõÄ7Î)K¹„øÏ+7¸wè@~A:×X»ðŸðß{Q-°úЪa‰A. õEÞ"3òíÓ/Ù×8îC£=’›œ4/S• M¢¯±eèHj™J.¼B´>6G4Î'¦HaÀĐªO¸ÎD“~¥¦9,ö-çn3!\?Õ‚‘J8T”ó·ŸÐ¢£í°š÷ðÀ"Ãw¾“/ÊØ<þ·Pµ"ݵÁ]%¶¥ø¶ç¯ÿŒ:s\))"²h+kYä¤!ÈÒªBvÞqbªÔ¾„dÎ˜Pž{ÿ€áŠÐ?µÀmáUí¦îâú`ÝÌeË~®Õʬž'i› ÀÀD|eõ<äâï2R"ØOZo}íoÅŸ µ— •Eº­¦«Õã}© '˜œ5s"–Jd«/”ÖB'1ýD•y˔½†«ù[\‰+‚Ï +²ZÁ¨rp;ͯ‘³ì]|‹¥>ªÆmI”d<°Â”#`>žIUbf5pÍâ‹sA|)qYÂëç+UgK›f$‘œLLðnŽ`4W ‘c­Š Á2€e/!Z(4­Ž¦¨Ž¿¶8aå„Gˆås~-‹ 7g z÷ „ÚWª·Ìâ6“ †+ šOXtÈ Äp œß1g¢â.©$ÓµJ–ç"d"Ùczkg2»BúY ×&dH4…“_0Ùj.£ÜmçA«¬ŸÈ‰ +iÂɉI¹w,àS!}îçj˜º‰”NÀ…Ã.'#Ø*D´NÈ®Î.*\y8ECƒ1)ŘcÜFKØk½Ai*ªÅ|Ìúa^ì|ôËd âx.mê ð"\IbéÆ|ÙrÆ¼ÆˆÚ _–ؽº%Ò´HkCÅsÔÕі5¦ ,!õ6í7~¡ÔªÞ¼ÅËGÂXë|§ÛáÈÅÍäÞì*s7ÌË°W22ÂXõî¼%„C£IAàýé#wh9¹ÝÈ`\z¬@äÚna}"@MïÙ8¡e§}~XH “¦RøBI„/ö2ՙ\*ŠŠè×¾~wSØ1h ¼¨ø.YnÉßydÈ¡e¦Ò=ñ‚ȹ”Ðõm݈WE:¯™‹Â7ÌÒHŽ˜:o_¨OTþ`a!g™U?f0‡uÜ*ž²--‘jE„^É7+ ¤&9éN•PŠN˜ð¨ŒÉû6Õ¶…ïTTqwmÓHJ’ †¹LÄH€67§äÔáM°!\t3¯ò&$Ãü¼‡þ-}Ïy9›|*C*£~ß¹t1@-’Ç„ +Þcð5õÀ¢æÓ=¹ž%º ŸÌh*.w‚špV;æñOiôÕAPæ™/ՄˆÇ?ÊÛ¹#¬k1ö'NeÏá[Ä¡  Ïv/tƁ°´¼Eԟ#¼§C€AAfgT®xž\Ò±$š›’XP¢*›OµEt`h×&†ÔÐèrãôèìØQdñÖXg‡È‘ѝh¹'-©fG'®¡²ŒƒÏ°eK®EàD$u^È6ZàÚ߃ü?âSË{=.(4ì¦ Ë½2LÑÎ8|©IŸ‘LWBõkYn{@NÎd©âA1áj˜LJT1!õß ²®Å»2x 6j™È26â¾ùäúŠïo=‹€f³À6_ŒK˜Ï^P뙀O{¡§žÊ_–_KOùoÀƒI_Œ0Í)EèÂhþµ8ž£ +#ìN–ÁüÛ1fâïñ²´’b,·\¹æ&’ÉûÃÏ䙥òOòÐWÀ•@ŽJk‚`x bæ>Ýßüª8t„ ?ûÜõ F•yŒm 5‹™D¬ ¡\ ÿ>²ûm›ƒë¬!Å¢ÜGWh7>&KäÁA Z•[êd™‹õIHivÖ*ւñâ CÎXšSŸIík¨¦žóÛr†è†YŒÏ[a3Ô²ŦlÑîùòҕÄb–%r‘ÿt-À°»FüV »Éí$ó‚‘$cÐ3Ž5£3¦?²Åá!šCj‰½=.c¶ ŸñC¢V†Á„¸¨’*/8ø)í}qÞ´¯¯Àòmœ¿­p¼¾Ãχô19bêñ»|ì{" bÓî9ü-¾zêÆ~TzK½€Æ ¤)j÷ð}cH@Ÿ’:*ǦÁ<ˆ*¸îùc "'‰@G~lFƎ>qWàxG…ÑčÝVD-~\¡„M€#Å„O¦D¸s’qSw.ïQύ˜^©à/¢ ¡rϝ›³kàÈésWcI0"8˜caõ¥³ïæ>iq‚Ïòɚ²!ç.F ;k}KSn‚7ÖÑLáJE”†¡›Ê䝻ÕÞ*C_¨èÓâ¹½ùƒ/{(¿ºs”âªÅè¿Fž›Ê(¿4”-61Ã⡁M½:¥šäÞ§VUNŠ£€d<^V™$hEÍ¢:îHîwRP°B ‹ÓŒ–ß‚ɆK sØZ¥ñþlþͺ9˞¨OÉpBL,ƒMU…"Ñ»+1leÖJ†Ê;ՃŠ>=ùrƒµèéÝti°ÚÚ<¹ÅÖ#'tŽu§Äo»ˆã§•šPpÐg:§†â ÐYøEÞ¡äèAp2g!IgE«Ô۞wF–Òj5—2„KxÇrVM%²¾R8á‡jÇ!@¨ºøž åjʶ{†»÷X¿s·R>XV™(”7ÑTt«Ó0-Ë¥µo•yô[Šk„y÷º>ßéš Lvãƒü+á’ËtMKÅxèþ"ÚB© +s7 äó‰òëºl…"Ùs®m6Û㶥')wkÈô¾Í-Š±sÜÚ¹8[=VYπœ°+½ÛÝi3sEN‰ïc‹'8šª–ó?Œ–PqÐQrbÒ²i32®57wtÉ…­h”ŸnrT½œZqN>K õßøŒ£%PÅ pEf)ǧ¼>=-¬±ªGW,9G5x! ¤Ç,~ Œ¢™Îún\ÒL:<ëŒ®Ï +Ö¬Œà†úï@û8™¾hÿmu°%-%QdZÓÏÌý¯?KHj¹i¼À¢uLK4ÔZpx“‡ƒ™%ž­“U|Ùk‡j€ÛÓòáUOË*ÈPU@ýqÅ*µÁÖ6,¶uÒöMXóݾЯÊi×Pš5á1XáÀå[²oÂÂ¥ü÷È°ŒØ^^Ñõ–H3$þhM,:$ØÎ ëa¡’Ç÷RĈu/;G·à/qâL.ŒE/À,4ÃÐ1¡Ï@’U’A%ÓXEýÀìa8Vs¦|ú˜ù%?V¾?¿È„ÏHê 2zSïס©GçÚvÚ§ˆÑŒª 7T`À FÒº#CB@/E Ñ´&јƒ¦å+ÁƸ|V¡ˆPƯE'­—’þÙÀB,ñ¶Ú¯%}@hÞ©6±öTƵ‰9µ‡f‚LfÂW3]xrÆ †îïr]æGùS¸åšF F܆(ÎE‰;£ãG°éA‘‚ú‚P¤¿—.¾ÙÕ±‘•HíA¾Å";(H”xFInÑÜö måaà|W€—m8.°ä|Éþî 5œfÒéW›ï\~õr¹Ý-@Û4“‚„¡JçUû"žÐtI.¼ß –óCí^¶ëœYÏÊ_ ?¤£á’ÁÒ¯¦c™í€‘)íÁ +â¶úúÓ »E[Œ3DH%ŽÆCnüuKŸûƶ´xÒÍ*êÄô—ºhÁÖ҉M€°h…®óüëzªBx- Œ¯Lì¶âp+DÓfòî±µ’eœ<‰.–bq°{„º(„º`ϥάB×v„öUR¬ªÉ¦Ã}‚#54.Ó;+œÒLí’_NT2«Óg'U´^ÄVxS1Áœ€R8MU'ö%*=Âþ¬Šf’M@#SŒ§ˆ~)e¬ä„ÎߗÿÊ\|âisälaýŒ¶G`¤èì]ÍZ\'Šf4̪V|þ‚èµ4P­¡-I#´å~ˆº…u ž%ÕãÝTyEYë¼û–¢ä\˜q1¨¼°£°¸­Ø3,Žáx_èW{u–oÛF׎Ïô¦¥ç_YI†N•±NM1|s_‚þb²Øi@'b]Ô0üm€ÕwáX¤C¦C7!ƒ{Ý@ën+„0`Âc —Yß+Ø\°ûØú)gw¤”’ã…Õ—îsÕqëÝ/Ø1+3øÐBo‚(á~Ï¿ñhƒhªÒ¾X¹»ÆP.€Ñ“X%‹-µáߕ—M„¡?îº î”©Or ¨IÍ'÷‹ÅŒ®Ù +‡ kQ•^w¿€¸wøÏë¯\vLÊ _R6ÿMZhË;þ†×$® +ÌF9´“Jö„9@r{±¨k~U!\ —ÉÉêÇÅÞM‹ß@áÒoöl¦&$£)“ŽƒVˆ,¥€Xƒ5³j_]ŒMc–(vG3ÐjÍ=Ø2‡U#½SANa'=u„UkΆ/1­ŠâP¯:É÷€g%®\I[Åè€K•‹D’1«nCóa l-ÏX|bÁya0- +Ë "òÿ9ùs²‡ñúiÄ´sÇö ¥ú>pËä)@i”ýÇê¦t9ìá#lb»&™–žÙWå!xÙ®ŠŒ¦°ßwâÃ+ûÑ6_’CðTºyI}üá8ŽÉ®Ç‰¨ï‚¦zTÙG³rbÇ3ós+é°&>‡:r%v*'‘~ëÚ/¥†ß©n¸nFa’Ö¡4ÚLôÏҗMöÍÔ.çâZhER)l“ƒø]yxpeD’`“…COëáû]„èׂÛÑ §}ý¬Ç6º «£Rwz ߓC¢¾>%!¬,Ržn§ñêŒúþ¥©•jù:x]؇¿$Ÿºdy~qÔr*‰«»Í§W¥óñ˜s/BA/§OÒ^i(oKº¢ü6åpÚ¿´…ç½è3κ”'»KÅZ 3üŒP£U/ØEøm¼#'gW;ò(ŠwuÁ&vA®ÏzpTu(æ{4èe}é°LoWÖÄùÈCh)zj_öß­=Þ%‘QÒbèI¸¹ó¯ 1s Åá(<’…d +Á¾ žã.®M1tŸ<5ÕôBn÷F MB/ -¯¡íA“+ ÈÅþÆ1$òºVËn²Gàí9§"|Î÷kv…¾Æ@¢* št–¼‘[Tä¯TÛ ìQÁ?b(º@Çy꭛Ç6§„Ä Û”Ÿx]½üûôB²ÀÛ½c ´¶#ô)£X†b΢ÜâT[äA4æ¥&؛¤Õg}Ã'}»ýåY°E{w؅CšÙ”ÏÄ՞ >€æ,£€D/km ¹&øžY:÷­‰]IÎÂÆltsÛßrk D®¡4q€©0\MYÍ|B&“ÆåÐӜ ŒOaò/ßâɦ-C "2CŜ±x/Ggâ- +‹W*sgمPj#&ÌñjÎîÔ³ªË@¼TU£í¯8²"zó.ä#=RZ\ÕXhO!í“ؐN’·¾ ³¾òÄìÕ]¥nûÖFâ‚UçÑ}ÿEßþ +eþýÐ=þNh[¡lÁuڍoòP>⩜’òõBSˆ WSÂÍ ‹†x÷B^Ù!f=õ <)괜øÕBYáDÎX8¦ZéøSd¶Ã¶ÙôÔå0å +›>Ècæ©1Õ œêEùwî4ÉU´d0üó’ëч6Qjñ>ðÖ<ÄýŽÿaµÄþ¨žÜDöârÕ]0À ·2à:é ï‚`ßÅ$2-™Ë¾Ø¤³âZ3£ŠG#ØÆM,Úô(¿Z»“K˜ähÝÌ5ßçrå :Ë°I±ÂùEoªšÑTÊ/Š°ÞQŸjØ÷ÃU–L/D!ùP<u€BìpâW¥N—Æ£ˆè2¾Êö/«;«˜\%vù⠈QŠ .ïŽóþXn0XFݳ8ëö¦ Ãz z{ ’×sFØy)t"Ïà…Á(;òM)GqÍa”5b!nS×+Óè ¿ «t0¶qŽÖq™çÁH%w†ô–«ÃtoëØÐ2¶–èRüGIKXö1+«ÁøŸ¢$/ØPÍ9/ZÀÀqR{d¢”ðȟè vµ‚>9%)Ñ4R)ÙçåŠ +â <ñ­kÑUÞC¦Ä•qe8Ø8Ÿ¶U‰ÄYeV/‡.K©ŸV¯òbÙLà4k4kç¸Q®”EO –,lŽ´ˆ .^§Ihúõª oÙèʜî"!îüç˜3 + 9†Üèš DȕOÙÚúóHI4áÛåHMN†7Žžª£[’¸¡fÌ`KmÕälßxîà­û<ªö·ÙœWP94}®½ ßšÓJ’rmŽ$ ÇÕ?ãAH5[SØjçw†L*?Ì8ÍnK™ÀI&Ëå›-âªM”…ɽZ¥FšD)ľ÷ +ZM­ß¸ÖÇ%7„h ›å-,@ŠÖD阃Rñº0¯ÍÓÞ¤D Š ’ãÄ +ˆQB^v«ÜÝì^Ú[×¢3R ØÀ! ¾Dd.›q—¸µÀÌ»z&Hm!6“Cùt†Hõ=Ù1ˆ3êw8U’Û\ÁSJÑ¥±³»"¨üð9ÆÉù¢Tc‡ÝîÝ©4µòEž?x u—ªÃ ¨D¹Cýª +ñÛÅ®e¬î?1äð+õÈ/vZ‘LÌüM a½5•0d3 ¦eWp »íƒÌ¹Â)ݤQÀËxö(Kuö·A…þ/¿ü…F«R½3¯ç'OƲ„Qv»¦ôå¢'¾øÓð׏ Ÿö\‰­€®:E uÚ©½FæAM,!YʳÒ.y²lãÿ÷ɀÒú–ªk"ïÛ³¨çJe¯Ò/ê?c[ÎÔ*[›ûWÎÀòæ±Ôz]ØÆû Îhá¦çè›ÄР_B· z`ãÜl7Ôó¦vÁãÜ8Tö1tíµ˜)´C¡ÿ¡+àõØN4q ‹ì;¡D/÷<¿Ã1+»ö§€U͝EœBÍyP'üàrÀ¢¥2+w¼n~tæW\"­ ó ¢'¼^ÂA)2GåðÀG#ÆGͳ¤÷œÖá%äø¹¿íQ‚&:a¡WŸœ‹ezìUA8ð’„.ïÆÅÒâÍ3¥G8•Öò02ú²éqŽ‰%–qå2Kt Ðmê,ûɹé†Ì¢QöÀ¿vâÿ¸™8ÜkÔÛ=%œ-¤@VÁS–»ûâô`i±—]’ÊàD,>ü_SͅvDùÀà—ÈZô™ó<®èsëÛOh˜ñyè~OªçåÖ%r +ààþò¹“Úg$Ã7€ 12y +:j‚³…ì²2É2(ZF›7ŸpÓÂþT*óÂM™,Ðo¹úæô»: 9žYðmK¢49°|m'þ½ãýäx¢ŸZDþÔí×Þ46vÝZʜn_C⦒nI†É^ýÀg<ëú€:wÅI+„h1q£Ï`Zk •&‹Gƍõ*q„Æú™<°w z(Mƒh[q:“0e뵆‰q±eáõOó¢9q™šèÍ4åQ×T4˜.‹=Gêd̃q£Å‡É<÷¨½—ö™1x\,œâW’\¼Ùô§òÍ7»ÇËMh—ÆkÍ6Ú0šV¨©Vµ Æýp¯›·Y؁z£uy`£S»ùM€ê.EΦõô™âÖïõÌL=\eöü·fò*›7èøÇö›€L%`j¢'L}DÃ{TK©¸™›„§ ×ù‹eàc'·>v¿ùƒ"2ø¿®£a<À’–!ۅz‹\aÎW³ÓW\-)c¿çJ«FßH ø‹…_ÝàÕ7¬…ê»´Ýï*@‚ö£¿×©ì®¡¬ Fíc¡Ñbí_…s®Ÿfy¡FõŸ×Å7 rZØÔn’Ûw"¯¢\‡ötåz—Zћ٨åà(x±qÿ +߉»ì¯é¸PèdÏD|,ŽäÝҙâ iQ·n¹/ÊY­PXç–].Jq.(½Èy :§¢:\«_Û'*—:û Ȥy¶7iÚ1aéœ8eEçâ+²z¦™ÉÖãÌò’aºèœg- Ù?Læ®Ì[RFõ‹ª•¨m]¥ê«MóD‚.Éôe‚=á9ç­®‹C¥ýlþɄÈ,ÀkÂH=­ˆê‰Í‰aHè)Þ_Pg‚É%â"t§ÊÍ.€œ²âª.ÍïÀX¶§cuÍÈäc»ÉTjPÓÅK1pW`­x¡ý] #À¶CÉ\Àƒ¬XÔqsˆÔ'lœ´Õ,òBg„ŠÑ»d–Ò‰\!Mö`èfÕ©¥µèÜsƒ„í”u°óà>cªÍ´žÏ›.‰WÚõŠQFÑôӪҁñ(8ßãó†»]ÒºSЁ„üÂ>M¦h«¡¬lo¸’dŠ¾ ô>»yÁb¼§ÏìæÓ¶¨ f¯øÍ+º-ëZÒdÛ×(5¯,…áñ6JY§õ÷™©×nQýkqÏþmù<Žúæ\æ12']šq¡\Ýõ•h¿9Ig5Ùv/‰4 íö|"Ì$?ËÔà\XwbYfRšaYö˜ˆõ—Zƒ³'¡IÕ­WD`K8wìÈ“Þ¸Øh³L+kXúfÍEl®z>b¢(Ì/ÐMŒ ÅɈ¹¼]ŸgÖ`ž”kÚnŠº¡#lâýüåĂk +_*¢é Ð^á°¢t„¤î²ž‚ø{&ÇA[Û,©!©óF>&A]¡±wcÀJúsȓK+t±hˆµ“N.¬“•µ})g +òÞ:¼âXq>F1I(íE®3ۅ Ñ¸x‘;3Y±î#\Òù…¿;o}Ë +c'7Xá3+77‡r;÷¢H\²ŸNU>Ý=*Œ˜º§À ¹Óô16Œ#2jWg˜fÛ 3O¦TqÝ£»#Ø¢8V©‚k”A Ê{UéqÉ5ðìÝçmƒÓ:¥rŸ¤¢ÁyŒì—ÚOe²d=P>$Yp%ÿq²WJ6¢€unü€+ž5a ­›èB5ÛŒôÚé b„;q‘/ËÔMZEÁqQ‚—Þ„Ç…vŠ1iB]6ežŸÌ‘‹PÅRkî­Ì¬ö§Î7—ƒ‰Hxòf^c>©Sñä•7‚‘çÝڐß4\/#!4˜U¥þªÄß}÷·X¢€äW? ¼íoyeNøúN$,¸>»NLò${rnD¶å²G¯æ³# G€xçMM–ô\çYr™ïç1p—b +¤ )5nÉ6Œ}C¼Âè¶:¦kQӉqëíàóè R„ý—g‡ãgðD ùN²VÓ Ï9A¢»žÆ˩ӃäA¥À_”~Ò÷F´”쀯‹¨ýi…¼‘„¼H×gN:§úý²E>·çë7ǍïîuíŒMÝYú ©fe·K4¤Ÿ{Ðo¾zš ªRpÇ[ì› +”“'w֋P}cfŸµ;ï%‡ŠZÂÇ c¹=Î2ŽÅ€{NºkQLÑ6¨©yô6˜½Búfž`‘q‚\¹äáÚ +n¹Å~¦Ç €)“ç·«ßÔ79ƒZf¶æS/™Ç~ý©gZºB Èlt%C¹~Qæ ®Ö¬˜´sÕB+,™†C–d%5Æ.꞊`Ôã¨1rc– 0RP™ŽÀ„ºúߥIœPúœÓݱþÐqã°êiŏà’jԃx¾«À4Þ3äzwÇÿ–Õÿ‹ªl˜žPo^ &²9\í”>‹Ý‚ÙL§gáù#ç&@mMú¼Ù@…×õŒ(\9'´÷¯ˆâŒ´”ù­ +•“qÝúñïGÇ "í+pX -aÜÓ¦*b’JìïjƕÇlôB—{g4ÅõAOŒˆ'zùõ fnâs£ðá˜H4±.º%>c×Ió‘ñ›WPHÛ@§ý³¤ƒͤ<ÌÈœ/ƒË‰'SöÏ<ìŽÇ~{25üêtÀq(M#±‚Î9ÎëNuÿ›:ÒÏ¡ýŠ/Ü.„eցÿ>ÑÜÚßë+²¹»iܑ¯’ †ÝܯWæã;•bõ7©t`m*Ç<ÔdÝNÉâÞ²îñË ²û>>(JƒF¸Ïײt?.h±,3j/ÔHB9ëÁBe+}7V¡ +ïäR™ÖìyÏé6ÅÕqý\ÇA:¬lb‡!]“ßiWÁoK*C™ë<€àÿ)îˆ֐È|FKM¹8UÓmúfYú‹5>„Œ6ðš’îðÎtÎ þɛ¿˜Eæ.#ÇX§Š#»yu",‡7úk£—q¦vì9Á‚‚µ5ôö'‰ÊXàû{°Ìå¥ÎՀî H‰yå ð\K¬ÏØî +@ÃOu˜k +”¶k¥z0Î哸F£`~KÅZ™í_ŠÎ gt»¶ò·t‘Æ_ɪ,䮾¥©¼¹£ Íóë· ràDÓP™9Ëþ-X4¡ ¿¼ ™çŽàráNüº‹3.Ô[¤(M*Ãe’ôhrN¹Ld† Î9Yö—/µz”Ìe¸$7^•±ÚI–týðÚµÍêRK)ÌøÏ0le”ÖØ#“KAE&·ÔK¨2€KèZ‘©ð§[Q\àÛԊÞQ.y!¸ŒgÖ-‘ +J—xx¤6IÑ +.:pŸÌs6‚ôéEL’ýø7„û–ÅlÊE/:VL¥ûf]®s>…o‰“áD( l|Ë©õ«¤)¦µW¡0N8¶J˜G\H#Š›*Rp¹šX‡ôž×¦<›Î“÷np‰cL9˜³ò1§)îÀrÜs̱U ZØõ¸ôÆ3z„”.ƒ áþBòs´Zà’ï÷2wZRd3¬s:gǸšb̈¡…êdf§×’Ky9(ö¿é¼ՑԦ5IfB8#‘£–)°8à,»áe`ƒá=* q¦‚§À 3Y™‡wúÙSSEûíƼ!CõBƒ<ÀÐQXc7Cº• gü •›´P‹1àÄUÉD7e_Ì ë…0¼…ÀÇډc¨Â–ë+íÂ0]˜df5ñÇ¿;V»'B«¤ñŽõ@ 6´Á™ó…ûÓ©GŸ Çѹ«7jZ®ÒJ6|©ùÔOUºã”Œ´ýðpcVð»Ä™‹äšç6ó¶ý&—˜ríð§wÙ€‹RẨ ”¤àR1Jîí3_£¾|*5ÐK‰ì,X×áCsÄ ¬‰öF•zò»ÿÅËÜ"Å ¯ÏZþ)Q·„â9Nyè)z©/b+2ÓCÝPŒ[O`½­D²y4"‡í1Î 6—”t”VÚ—£æj©8|½6rgPDfòXÿÕ"IK’Šr[êh… )AV «®8ÃTn1Óæ‰þM×TâR20v:ÃB”<¤Ã$Îû+v;°Gé°¡XÝ¢Ãýá&à—-¿Úm²r"LšëÃ43bÌùDr«]ãˆÍùLèêsF]ãj?Ë7•|$,‹ŸV­xH! ˆJš"I¡3•@Öñ}Z—Ó¦ëϯ.ƒåR "¦ŸaZ­•ˆ¡ÂÐ z%)Ôf¿_•ÐÉ~3b‚t—Ë@Žh’åÂÎè Ü¿»š[=õK¶DZ«NÂJLìïò<]2U7 ‡Y·Ë‹½õ²—“ˆˆDdXŒÖµÌÈ(4‹ÒºMÔêiG‚é7âÉ×+鉄#Þ…OϧÀcn$ûa…¯zcÈÎÜÞ&~gj,yç,V¨oµê 0W•P™Gç + ´t)¬ÿh9”匰¢üÉ=òí¼$R‚úÅ/,wٖPÈC¯eJE(ô€Æ}}rç¤3©q‹«î ×ú¡Àm¹†Œ}Äm&"ióîm!#^ØO,¬àH¯£l^^2 ‰®¾}€ßwÈïÆßò\yMnˆêÂNŒ­aqŸ\h N?ÀÏVŽÓå@ê¬OmúT¶2 ¯6FúK~-Èo#»ëΊPm"Õbø<ûÞqV‡µÀŠBZß ?õñËC\iræ´½ê,ä(䝊²]f¼Ã‘Ë8½;Ešnƒ*©òì³9–@\>ƒñ”%c4뎴Õh&®ßXŠFӁP[˨™94"¦F†ü•{ýåa°JÝ(Ð ¼q"–·2½ßOçÏU ¿1rʝ×Eòê¤p(z;¼¯Extå†X eWZ”Öo¯lîÓo*t£iɬÔÅSóUó¿.KSޗx?76aÕÓy®DlÜ_û±pʼnW„Gµèr&xAÃq[•w-ï/ýûã”×ßµÂLå„ш|¶$ç«%ð\Ž¸ÿïÌ–÷¾fIp°ÕÁ+ždÚm)(gõýI§€FZÙ©ÃOE68£„0¯ë»m±)σãoñ†V¡&–zY˜bòC´¥î Ë󙌾%®í?’oœé‡…2c…V´€72!ò˜— y6¶›´9€BÀ±©43·€N<›½‚¦=<¶ò¬£ À¬v¶¿’p¼ ¼!cŠ^Ge•aa鲓‚ºYQ¨œ9v]¨¸ø½^>r…ƒ}@¡4«di sy0>ê{>i.(ZAÀÒm¤ŠBIa.i<7Ém³¡oÖrôBڅVñ­Í-‡ñŸfÑò…bh=· œxyÂh#¥œÇ00*PËñïu}™2E4q…„ûÿ?L¨¤æ‚¦\PúÇG#aùl0Q5ý'€Ú O Ä|ˆNÏ̆§=Üp“ÒTÉÐ-Á66o‰üðâp<'Î)"ꩇsåPKÒ>EGZ X$ÒF ¦ÕX&ú²4›eÚøÀ-&N²¹Äu–¥TI= +3”9v‰ž|aá°º…K È^ ¥E6U%ñkXb 9á{Oœæ£éÇU³˜âº­éÄwí+"€¤N·òœîU³›ÄÎ Î<”Í€ÏE*³»S‰Im<ՋìÝ·¥º …&±qÃwXÛJ-{€a’¿#8ê> V’aÈòßhl𓌻ùД ˆæ,ªWúÐ]X~Ž?ñyIçIŸ,djPuR-å$a‰ë L\ûÅ«g{L.‚ ~æi*˪2t $g4'GÆé}( ón÷—Šµ¿bäZAgdžJ¹0`F’±PÆG³ž‡@ç4ï•`ÝwK^³'ÈÍ1zü‡úüK5»±LF» cîÇnO +ÓI¯;nD¤Ë„É~†G,MÖ~‘ 7w-¨3ÎÓî< “šd–³˜JLOñH'À'ÀJe”MeÉ[¢ñ°—¤™««*¥Ù´ ³I6@؏@sªƒ/͞„ÜíÙæ×Oös]Ô@¡~D<¢È¬~Åݏš)÷{5È{´S‡Ìº ÐÖ¦®’OИTNÉz í¨Ã:¶!ù! ÿ°]ŠJŒj€œ®¤š¿Ol·H#°óÏ°:í¤pâ–D׫*Ò;>yèHVŸCÔ Ptɞbß*ðU¸°ø³©1ª—²?‹B\bì–é8Ö,’ÙmGh ¼çØèÙ>—d@!úf‹a Cû¸ôc±>ÆOæOmÉÓL¬ìššŽ?L!Dj®­­5£ÖÍÌÔ ,§öƒéG‹_uíÙ6Ҝj‡™â½“¹ÇLºøû(kC›?,67fÒ8÷,p¶X°ëG¨y¯X¢¯¡"þ»ØْÊ›€^±¬[]óOö5 ×~'I”€¤_Gõ•Ò?›·ŒT-çðDÁX«O;Û_¹ƒt‡Þ§ æ‘ò'Ž¼GKI‰sŽºªrØäƒ-[KŠBS$¥Õ!΍~Ô%n_äty%S{.%ë­Y=Û·©‡'-LL¸B"¶m¥?`,4O¦êWLY\îGá±XœYxLtÚÐ )–\,à’è&&ù`L̘³)ô#4EùɎ—€w{  rö•fQ…Þ ¦r¦Ðš¨ò*ì!iLeÞ sëƒ f/qŠb¬ÇPzMÍì‹Ë›á½²ÂëRŒÓ)ù¢Ñ§ô>Çö}9Dîâ®6—´‘øóÎJh£ä2º!²7“ÌRrÿzq̚%ÌøÊ^\í‡Õ¢ñ~ ê‘Áß´(bc•BW¼‹’Ó ]:¶ü¹nÍô’Ã؋µi‹­ò}ÈCf}0D^,žÓ=›“ϴχ…3ˆ—óOP¹=œ:ðτ+®Ð(K<ŽVªPb§œ#¥º!SeѶNóç½Ò»ÿDm3íÅdÆäÙÆ¥¨¯9Ü鄼ž!D:Š®Dv‘šJßÿ2v¢2ÔH9P¤Â“%‘ŠÐÕnËÉrU €Úo|Òb QÈi󗾸9$}]âçU=@{„áÊþÊþàéSÆ`ö°º /æÅð›0OŒÀ'mÚµ`f±~N,ëñ‚x©ðò’õcÔøKR„½åN9䪡ë%ù Hiâ+7æ½Yå]UW{4ñèÌÐÿühôfþm› ½µ?˜Mˆî¯31K†é4§ƒ©Û Þ¼Â-^t..­s€’$òãfWÒ¾ßEiÙ­aÑ>|%mäìIXmÛò婏ß4tãÍl„’‡ì©lúAچ°8²xðEìÝìŸÝƒÅýBÒ,·†×}fƒ[ˆŒÔsd §äéLçG›éË>yÔ_ñR<½Šì2O \uvbüäS;Œ ᮍYá©}Rø¿Þq&†¬÷,ò5ˆõö¤ÌñÞ#Ò6;rj¹ðt¬oz§;„^Pè ­ÀX­yÏS•€.·©>º¢´±R"†X3 ²©‘7NIÐÉú‚FÌk³j lŽ÷˜ãŠc¶ò^zT¿uºt‘IÐsê”6PAˆðÅ¢Vpæ%‹6n­JVÛ²h>î(Pßj¼Z¦Á%X”uÄ$½Kӗj 0¶î6ƕO±]B҃-dª¥l“~`æÌμÃw–dÊÍÚã‡8 G¹¹Î „qã#×¢6Û©ƒ ¸µ~xC"ËìczÈß>ك6GÄRÖ )žü·r­`D袜q #ó5'ÔöËÔwXKH+>2n>„MæPPÐ>¿!q‘ Eû›á±IÏ6W‹ŸÛÜçƺ\zÿ\a¹mCôï­úo ßólwHGeE]8¨ ç½IŠê„å¡ž¢lñ™Í_ᛥ +«öHx̤D¸ÛÎÎàlæ’,` ™¸ÒùõhZˆÜú¥µ~Ìs‰34ŒŽvÂ|æFÁ›daëŒidóþ$2œw€é¡’æ¾#8´'=á‰ssÂÐxc:êÚOºû«8É£-OXº+”GȲµhXòâVt@ä —”Ú'NKMŸÜŠù5Õ¤ Êò/UëCš¹Ø#Òz«ÒˆQIGî-ôÐØ¡¼É:ûHVÜ +E¸lK=ðx7¸h +1ÕÒèû”Ý1úU¾À1Þ´ØøJ~ÄaaXæ'BÉP¼š‹Æ6xd wº •ùÀ'Yñö ªˆÇG cÀhò² +m¸ÐTÓÃ! RüJŠ¸{è ¦uÔÓwIškA$E+†Àêú1QË!75œI¤!^Ó¶¾pEµhî6͔0M\akȑù“ÿ'¿#[wK _㣆€¼½K‡jFÈLßH}è[Þ+Ó÷Q€n9(7´ê„7™{ÀÝ[8/b‹†s¿lk]嚣# X½°">![o•-Sµÿˆèñæ 9ÉMtÞl“ïÃK;ëà¨áç%îîW‹±)xôÑvÛÞß]x"†k[ïÏÚ®]™ՑاÇlÔ:øµóòêM©a´ L×ìEbs \dºëMVj(M6¡y®:F: \ÀøÊW‘©NʬÊÎÍmÈj­vhƒã 5üž¹q§µ%ᏽÑ~—M¡&!¹ÿ?æu®‡3RÝö%þºöÖÌê‰\*ÏX#ª™ Ž¸Ñ¦i%rÜڍ#Òú:§ÍM´kЎ"ÕÐ2&ÆBŸÕ`—ÿ¯ŸV֗´é'™»'ÙJ^҃ Tp€N¢[ã‹úÛ©‡ðýçÏÞcñ–šwIÎ1û<Õ¶¿mý•;vWo‚[í¿•T[‰¨3¾gº¶Û +M&2MaŸpØ30«›Œž’°:@h†4ºÏ–oØk®UÕ;‹µxÏöuöI“Ž“]\uhˆ b¶I02+/–[¤ ÏM"Ùì2.®…*’šÂ–"²Íž «8´)oèrO’Ò鍊‡z¾‘8ÞûõT8ër.©uA ?½üÓ „¡ h>‰ÀòP`Ã؀Pq¾¦È•LCSòғdÚ*"}æéÔÓs“î{|åëÿËÌ+5šŠtŠ__TlN»©dR4¦Ýã>c¿ÅÛ™çc¾Þµ…§¤bÏxÙgÅÍVÔ{–S¾´:j,ÃIò°ìéëDlqNrz2#üÎïe8‘P+È$ R +l»C0ù\–´ºÉÊ0¢)¯æදœ#<ÆD@¢hûú b–|Əõ(xùTñLÏRŽßŠiiåJªÖRÂ@¦OŒ 8ÙÛûaÆÀ=•^[ ¹‘Æ£}0¼Ø#Éôv)™’@¸`ƒ~¥Aƒ& §oþò31©eS³%`A\ðL`YeëþÛRêjƄ± „Û ºgœó¨ߍÆ(ïQ òQo’£%LÂX! ̚v¶Ë¢¬ã¶´†D‰ffn"èŔ¡#ôU½~|º–+8w¢-—?p̵içF;à)=Á¯\ñ‚ãø°Ž,p¶¯Ñ1%áíŠyŠXOßoÿÒÒønµÝWÏmñs sÏ&”P²±T£YË5{¹ ' ÔÈᘞÿŸû,=”k…ÁG²Ñ~1@›Xž’óÅT>ìg'±‘,´Œ?é€ËZŠÂEéœ< oáºè+[T +~`D»«|#)mäUvzCKe9ó꼏Ro÷¡q &§@4ã Òd\V†÷W˜‰-Þ'è)x%¾|Íe—‘Çb|NjfW«íW ½ÉB}äßDzuÄ·)óBꃎm*&Ôm}CGŽIê‘}~±Ý9½Ê»:yæTN¢/9”YÖI€t hû>슱L+Œ{ñâåo[û呰°¿0!b}é­ý?¿B2Áš-ÕM€Dzd•¿¿²ì!Axø”^}= ÇJ:>ÑiÁ_ $ÖÀR?,YšR>Ó½ÊtŠ€ÃÆsadYPvð¾„ÿ~š¤3£j0•KÊ0îƒá–|ÞWs]hcJ…¹ú;«Λ¢ßLA'Ætz¤ŠX'Ä ßjEg‘ÑÓ»6Æ/Ò°’KhX­p/gP |ÆÎp7@J²û¦„¥êǶ};lú¨{{Ϧ&™4ÈÜ0»–ÔøX‡D‘>áåGyâõ–²Z™Y9xÛDžC}pPƒÁL‡±œ£þêúì +ãµ¥í&°-dSG³´>7Éݚ¯]Ôì[ÊÚrÌùÝ]@a<¤Ž=ÄN?Ù)JzWÛ$epæÜ(œO”ÂðrÅGÍ^®Ð~ùõ¡DL.²³(¾“XF+G|÷& ?=DÍiw“ «¸]IÒ,já”Îmrه“€üIUÚyp¬&)z^}2?vܢ՘· ÉxBSz'šÉa(û,¹P6êÏR}‘ÒºgT~ñòD$«ÁôÎÍzÿ“{Ç$’6®«õš$ÞQ‘°H¸ÛŽ|w÷½$k^±XÉåX4í.ý3À_öKú=ûL3!íY¿ *>¶þYÞæ«YÍl+g—A¥öõÇ5µ$©iºA +ÁQ¹ü¢:ðÛusðí«#›G”h½ ÐRÖJ;ecX¨ ­ç˜&Վ/H’¬ŒEnՋn%ä–ÁŽµ R؅ŒÛä_•dZڝá~ð.㨽Ÿl¥³Ts‘cŒ ã¸ýäӋƒ˜QÁyy_ò•ÆÐÕ1}Pä £Ã¶ç3¡ÄzЙ«¼t«v*ym‰ý°n\[ŸdÑ>T“™·+©” aØ%‰­%Ë “óXœºÿ¬…ex¸Ï*adèG`¢¡tº¾Ûc¼RÍ.~¤Sã¬Í"g +”ÔiÔÃ(@TºqSÒÖL¢Zl÷QêÅ‹:X/Þ_¸Êm=ÚŒøé6O»#‚KÉȓÖq‚ôŽŒˆ²OHÈR֟^%übèäHÐÇO–ä<™WÉ E»7UÊ™çVAÁì÷Bg 4Xn)=«ûå%%Él'h'íH|)#…Ѐ{·zSJÀçÏkü ZþՀñ̸ÜÀ>á+¥Y_®R”µøí:áÆ<1ý#›.̈ä ²ÐÆÝ+’[>Eà|%!OÉX¾ÎVôš{¢enò#ôÄhãàPΫL…̏¨€ K#mÅd‡*˜ÕnV1:Œ =¿WŒ6ðUµ¹×Ý0• +ðÍz£‘ájDR”¨ì[­Þ€ã qT ¬mÛIZÞv'¸…«’q=ÞçeÅT„SOÑ}ü¢©óó°áÞcÿ²[Ã'Çsîä= Ìëcéx?“m¤¥l1% EìÄ}MgiËòUsdÀeÛ +)×㠃{ñÙù ­T‹§’‘"y÷ ˆ$]IsaûðÔ¹#ADãþk +ET¬^Î['¯2º/j^a»©æÖ3{´ÐÈ%P»âê©=¦¸2£E¶=–Ec©J/Y'èÔÓ,ÎGòhT1’ÞóHïèŸþpX:{þjÕ5ê0NÃÅ劇¤µ½£–/®jxtp= +Ê +¿2~ï³ûcÞz´)¨Š¨IætdÏØY±‘¾Š u§÷DŸú<À_ñ`YJ]QÓõ){ƏÕE S’gýh6’;†´ÿ¢Â +fz'rʲãïªÒ ò¬•åGéŸ.ï­)¦öG +>ÎÝLc½k.PÑ)›:ëáCÝ©á1 +[/*‡}²±’„:'Úwjn p× ™